diff --git a/osdrv/Makefile b/osdrv/Makefile index 6ff782744d..55061e24c8 100644 --- a/osdrv/Makefile +++ b/osdrv/Makefile @@ -122,7 +122,7 @@ fast_image: rtos_cmdqu @$(call MAKE_KO, ${INTERDRV_PATH}/${@}) jpeg: - @$(call COPY_KO, ${INTERDRV_PATH}/${@}/${CHIP_CODE}_${ARCH}) + @$(call MAKE_KO, ${INTERDRV_PATH}/${@}) pwm: @$(call MAKE_KO, ${INTERDRV_PATH}/${@}) @@ -182,7 +182,7 @@ ive: @$(call MAKE_KO, ${INTERDRV_PATH}/${@}) cvi_vc_drv: - @$(call COPY_KO, ${INTERDRV_PATH}/${@}/${CHIP_CODE}_${ARCH}) + @$(call MAKE_KO, ${INTERDRV_PATH}/${@}) rtos_cmdqu: @$(call MAKE_KO, ${INTERDRV_PATH}/${@}) diff --git a/osdrv/interdrv/v2/cvi_vc_drv/Makefile b/osdrv/interdrv/v2/cvi_vc_drv/Makefile index 82fa2ef848..b2a4826b76 100644 --- a/osdrv/interdrv/v2/cvi_vc_drv/Makefile +++ b/osdrv/interdrv/v2/cvi_vc_drv/Makefile @@ -1,4 +1,245 @@ +include $(PWD)/../Makefile.interdrv.param + +COMMON_PATH = common +VCODEC_DRIVER_PATH = vcodec +JPEG_DRIVER_PATH = jpeg +VCODEC_MODULE_PATH = module + +ifneq ($(KERNELRELEASE),) +# kbuild part of makefile + +VCODEC_DRIVER_HEADER := -I$(PWD)/ \ + -I$(PWD)/include/ \ + -I$(PWD)/$(COMMON_PATH)/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/sample/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/sample/helper/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/sample/helper/misc/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/vpuapi/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/vdi/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/cvi/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/include/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/jdi/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/jdi/linux/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/jpuapi/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/src/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/cvi_jpg_interface/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/cvi_jpg_interface/inc/ \ + -I$(PWD)/$(VCODEC_MODULE_PATH)/include/ + +cvi_vc_driver-objs := $(COMMON_PATH)/rcKernel/cvi_rc_kernel.o \ + $(COMMON_PATH)/rcKernel/cvi_float_point/cvi_float_point.o \ + $(COMMON_PATH)/rcKernel/cvi_float_point/cvi_soft_float.o \ + $(VCODEC_DRIVER_PATH)/sample/main_enc_cvitest.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/main_helper.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/vpuhelper.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/bitstreamfeeder.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/bitstreamreader.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/bsfeeder_fixedsize_impl.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/bsfeeder_es_in_impl.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/comparator/comparator.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/display/simplerenderer.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/cfgParser.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/cnm_video_helper.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/datastructure.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/platform.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/debug.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/pbu.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/yuv/yuvfeeder.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/yuv/yuvAddrfeeder.o \ + $(VCODEC_DRIVER_PATH)/vdi/linux/vdi.o \ + $(VCODEC_DRIVER_PATH)/vdi/linux/vdi_osal.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/product.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/vpuapifunc.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/vpuapi.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/coda9/coda9.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/wave/common/common.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/wave/wave4/wave4.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_enc_rc.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_vcodec_lib.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_enc_internal.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_dec_internal.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_vdec_api.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_h265_dec.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_h264_dec.o \ + $(JPEG_DRIVER_PATH)/jdi/linux/jdi.o \ + $(JPEG_DRIVER_PATH)/jpuapi/jpuapi.o \ + $(JPEG_DRIVER_PATH)/jpuapi/jpuapifunc.o \ + $(JPEG_DRIVER_PATH)/src/jpuhelper.o \ + $(JPEG_DRIVER_PATH)/src/jpulog.o \ + $(JPEG_DRIVER_PATH)/src/mixer.o \ + $(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/cvi_jpg_interface.o \ + $(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/cvi_jpg_dec_internal.o \ + $(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/cvi_jpg_enc_internal.o \ + $(JPEG_DRIVER_PATH)/cvi_jpg_interface/test/cvi_jpg_codec.o \ + $(VCODEC_MODULE_PATH)/src/enc_ctx.o \ + $(VCODEC_MODULE_PATH)/src/cvi_venc.o \ + $(VCODEC_MODULE_PATH)/src/cvi_vdec.o \ + cvi_vc_drv.o \ + cvi_vc_drv_proc.o + +obj-m = soph_vc_driver.o +soph_vc_driver-y = $(cvi_vc_driver-objs) + +ccflags-y += -I$(PWD)/../include/common/uapi/ -I$(PWD)/../include/chip/$(CHIP_CODE)/uapi/ +ccflags-y += -I$(PWD)/../include/common/kapi/ +ccflags-y += -I$(PWD)/../base/ +ccflags-y += -I$(PWD)/../base/chip/$(CHIP_CODE) +ccflags-y += -I$(PWD)/../sys/common/ -I$(PWD)/../sys/common/uapi +ccflags-y += -I$(srctree)/drivers/tee +ccflags-y += -I$(srctree)/drivers/staging/android +ccflags-y += -I$(PWD)/../base/$(CHIP_CODE) +ccflags-y += -I$(LDDINCDIR) -Wno-date-time -Wno-error=date-time +ccflags-y += $(VCODEC_DRIVER_HEADER) +ccflags-y += -I$(PWD)/../include/ +ccflags-y += -DUSE_KERNEL_MODE -DCVI_H26X_USE_ION_MEM -DCVI_JPG_USE_ION_MEM -DBITSTREAM_ION_CACHED_MEM -DMJPEG_INTERFACE_API -DCVI_H26X_ES_BUFFER_QUEUE_ENABLE -DCVI_H26X_USE_ION_FW_BUFFER -DENV_SET_ADDR_REMAP +#ccflags-y += -DVC_DRIVER_TEST +ccflags-y += -DENABLE_DEC +ifeq ($(CVIARCH_L),cv183x) +ccflags-y += -DARCH_CV183X +else +ccflags-y += -DARCH_CV182X +endif + +ccflags-y += -Werror + +ccflags-y += -DVC_DEBUG_BASIC_LEVEL + +KBUILD_EXTRA_SYMBOLS = $(PWD)/../sys/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(PWD)/../base/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(PWD)/../vcodec/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(PWD)/../jpeg/Module.symvers + +else +# normal makefile + +ifeq ($(SDK_VER), 64bit) +ROIRC_STATIC_LIB=./$(VCODEC_DRIVER_PATH)/vpuapi/coda9/980_roi_rc_lib/libroirc_aarch64.a +else +ROIRC_STATIC_LIB=./$(VCODEC_DRIVER_PATH)/vpuapi/coda9/980_roi_rc_lib/libroirc_arm.a +endif + +VCODEC_DRIVER_HEADER := -I$(PWD)/ \ + -I$(PWD)/include/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/sample/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/sample/helper/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/sample/helper/misc/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/vpuapi/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/vdi/ \ + -I$(PWD)/$(VCODEC_DRIVER_PATH)/cvi/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/include/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/jdi/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/jdi/linux/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/jpuapi/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/src/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/cvi_jpg_interface/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/ \ + -I$(PWD)/$(JPEG_DRIVER_PATH)/cvi_jpg_interface/inc/ \ + -I$(PWD)/$(VCODEC_MODULE_PATH)/include/ \ + -I$(srctree)/drivers/staging/android/ \ + +cvi_vc_driver-objs := $(VCODEC_DRIVER_PATH)/sample/main_enc_cvitest.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/main_helper.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/vpuhelper.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/bitstreamfeeder.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/bitstreamreader.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/bsfeeder_fixedsize_impl.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/bsfeeder_es_in_impl.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/comparator/comparator.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/display/simplerenderer.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/cfgParser.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/cnm_video_helper.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/datastructure.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/platform.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/debug.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/misc/pbu.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/yuv/yuvfeeder.o \ + $(VCODEC_DRIVER_PATH)/sample/helper/yuv/yuvAddrfeeder.o \ + $(VCODEC_DRIVER_PATH)/vdi/linux/vdi.o \ + $(VCODEC_DRIVER_PATH)/vdi/linux/vdi_osal.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/product.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/vpuapifunc.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/vpuapi.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/coda9/coda9.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/wave/common/common.o \ + $(VCODEC_DRIVER_PATH)/vpuapi/wave/wave4/wave4.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_enc_rc.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_vcodec_lib.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_enc_internal.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_dec_internal.o \ + $(VCODEC_DRIVER_PATH)/cvi/cvi_vdec_api.o \ + $(JPEG_DRIVER_PATH)/jdi/linux/jdi.o \ + $(JPEG_DRIVER_PATH)/jdi/mm.o \ + $(JPEG_DRIVER_PATH)/jpuapi/jpuapi.o \ + $(JPEG_DRIVER_PATH)/jpuapi/jpuapifunc.o \ + $(JPEG_DRIVER_PATH)/src/jpuhelper.o \ + $(JPEG_DRIVER_PATH)/src/mixer.o \ + $(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/cvi_jpg_interface.o \ + $(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/cvi_jpg_dec_internal.o \ + $(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/cvi_jpg_enc_internal.o \ + $(VCODEC_MODULE_PATH)/src/enc_ctx.o \ + $(VCODEC_MODULE_PATH)/src/cvi_venc.o \ + $(VCODEC_MODULE_PATH)/src/cvi_vdec.o \ + vcodec_drv.o + +#cvi_vc_drv-objs += $(ROIRC_STATIC_LIB) + +VCODEC_DRIVER_DEFINES = -DUSE_KERNEL_MODE -DCVI_H26X_USE_ION_MEM -DBITSTREAM_ION_CACHED_MEM -DCVI_JPG_USE_ION_MEM -DBITSTREAM_ION_CACHED_MEM -DMJPEG_INTERFACE_API -DCVI_H26X_ES_BUFFER_QUEUE_ENABLE + +ifeq ($(CHIP_ARCH),CV183X) +VCODEC_DRIVER_DEFINES += -DARCH_CV183X +else +VCODEC_DRIVER_DEFINES += -DARCH_CV182X +endif + +ccflags-y += $(PWD) -I$(LDDINCDIR) $(VCODEC_DRIVER_HEADER) $(VCODEC_DRIVER_DEFINES) -Wno-date-time + +PWD := $(shell pwd) +obj-m = cvi_vc_drv.o +cvi_vc_drv-y = $(cvi_vc_drv-objs) + +KBUILD_EXTRA_SYMBOLS = $(PWD)/Module.symvers + all: + $(MAKE) ARCH=${ARCH} -C $(KERNEL_DIR) M=$(PWD) modules clean: + rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c + rm -rf .tmp_versions Module.symvers + rm -rf modules.order + rm -rf module/src/.*.o.cmd + rm -rf common/rcKernel/cvi_float_point/.*.o.cmd + rm -rf common/rcKernel/.*.o.cmd + rm -rf $(VCODEC_DRIVER_PATH)/sample/*.o $(VCODEC_DRIVER_PATH)/sample/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/sample/helper/*.o $(VCODEC_DRIVER_PATH)/sample/helper/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/*.o $(VCODEC_DRIVER_PATH)/sample/helper/bitstream/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/sample/helper/comparator/*.o $(VCODEC_DRIVER_PATH)/sample/helper/comparator/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/sample/helper/display/*.o $(VCODEC_DRIVER_PATH)/sample/helper/display/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/sample/helper/misc/*.o $(VCODEC_DRIVER_PATH)/sample/helper/misc/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/sample/helper/yuv/*.o $(VCODEC_DRIVER_PATH)/sample/helper/yuv/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/vdi/linux/*.o $(VCODEC_DRIVER_PATH)/vdi/linux/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/vpuapi/*.o $(VCODEC_DRIVER_PATH)/vpuapi/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/vpuapi/coda9/*.o $(VCODEC_DRIVER_PATH)/vpuapi/coda9/.*.cmd $(VCODEC_DRIVER_PATH)/vpuapi/coda9/.*.o.d + rm -rf $(VCODEC_DRIVER_PATH)/vpuapi/wave/common/*.o $(VCODEC_DRIVER_PATH)/vpuapi/wave/common/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/vpuapi/wave/wave4/*.o $(VCODEC_DRIVER_PATH)/vpuapi/wave/wave4/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/cvi/*.o $(VCODEC_DRIVER_PATH)/cvi/.*.cmd + rm -rf $(VCODEC_DRIVER_PATH)/*.o $(VCODEC_DRIVER_PATH)/.*.cmd + rm -rf $(JPEG_DRIVER_PATH)/jdi/*.o $(JPEG_DRIVER_PATH)/jdi/.*.cmd + rm -rf $(JPEG_DRIVER_PATH)/jdi/linux/*.o $(JPEG_DRIVER_PATH)/jdi/linux/.*.cmd + rm -rf $(JPEG_DRIVER_PATH)/jpuapi/*.o $(JPEG_DRIVER_PATH)/jpuapi/.*.cmd + rm -rf $(JPEG_DRIVER_PATH)/src/*.o $(JPEG_DRIVER_PATH)/src/.*.cmd + rm -rf $(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/*.o $(JPEG_DRIVER_PATH)/cvi_jpg_interface/src/.*.cmd + rm -rf $(JPEG_DRIVER_PATH)/cvi_jpg_interface/test/.*.o.cmd + +depend .depend dep: + $(CC) $(CFLAGS) -M *.c > .depend + +ifeq (.depend,$(wildcard .depend)) +include .depend +endif +endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/common/cvi_vcom.h b/osdrv/interdrv/v2/cvi_vc_drv/common/cvi_vcom.h new file mode 100644 index 0000000000..5704e0d3a5 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/common/cvi_vcom.h @@ -0,0 +1,111 @@ +#ifndef _CVI_VCOM_H_ +#define _CVI_VCOM_H_ + +#include + +#define CVI_DBG_MSG_ENABLE + +#define CVI_VCOM_MASK_ERR 0x1 +#define CVI_VCOM_MASK_WARN 0x2 +#define CVI_VCOM_MASK_INFO 0x4 +#define CVI_VCOM_MASK_FLOW 0x8 +#define CVI_VCOM_MASK_DBG 0x10 +#define CVI_VCOM_MASK_IF 0x20 +#define CVI_VCOM_MASK_LOCK 0x40 +#define CVI_VCOM_MASK_RC 0x80 +#define CVI_VCOM_MASK_CVRC 0x100 +#define CVI_VCOM_MASK_FLOAT 0x200 +#define CVI_VCOM_MASK_MEM 0x400 +#define CVI_VCOM_MASK_TRACE 0x1000 +#define CVI_VCOM_MASK_CURR (0x3) + +#define PRINTF pr_info + +#ifdef CVI_DBG_MSG_ENABLE +extern int vcom_mask; +#define CVI_VCOM_PRNT(msg, ...) \ + PRINTF(msg, ##__VA_ARGS__) + +#define CVI_VCOM_ERR(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_ERR) \ + PRINTF("[ERR] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_WARN(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_WARN) \ + PRINTF("[WARN] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_INFO(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_INFO) \ + PRINTF("[INFO] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_FLOW(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_FLOW) \ + PRINTF("[FLOW] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_DBG(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_DBG) \ + PRINTF("[DBG] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_MEM(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_MEM) \ + PRINTF("[MEM] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_IF(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_IF) \ + PRINTF("[IF] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_LOCK(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_LOCK) \ + PRINTF("[LOCK] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_RC(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_RC) \ + PRINTF("[RC] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_CVRC(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_CVRC) \ + PRINTF("[CVRC] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_VCOM_FLOAT(msg, ...) +#define CVI_VCOM_TRACE(msg, ...) \ + do { \ + if (vcom_mask & CVI_VCOM_MASK_TRACE) \ + PRINTF("[TRACE] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#else +#define CVI_VCOM_ERR(msg, ...) +#define CVI_VCOM_WARN(msg, ...) +#define CVI_VCOM_INFO(msg, ...) +#define CVI_VCOM_FLOW(msg, ...) +#define CVI_VCOM_DBG(msg, ...) +#define CVI_VCOM_MEM(msg, ...) +#define CVI_VCOM_IF(msg, ...) +#define CVI_VCOM_LOCK(msg, ...) +#define CVI_VCOM_RC(msg, ...) +#define CVI_VCOM_CVRC(msg, ...) +#define CVI_VCOM_FLOAT(msg, ...) +#define CVI_VCOM_TRACE(msg, ...) +#endif + +#endif //#ifndef _CVI_VCOM_H_ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_float_point.c b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_float_point.c new file mode 100644 index 0000000000..e7ae7383e1 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_float_point.c @@ -0,0 +1,208 @@ +#include "cvi_float_point.h" + +float32 FRAC_INT_TO_CVI_FLOAT(int32_t a, int frac_bit) +{ +#if SOFT_FLOAT + struct roundingData roundData; + float32 out; + + if (a <= 0) + return 0; + roundData.mode = float_round_nearest_even; + out = cvi_frac_int_to_float32(&roundData, a, frac_bit); + + return out; +#else + return ((float32)a / (float32)(1 << frac_bit)); +#endif +} + +int32_t CVI_FLOAT_TO_FRAC_INT(float32 a, int frac_bit) +{ +#if SOFT_FLOAT + struct roundingData roundData; + + roundData.mode = float_round_nearest_even; + return cvi_float32_to_frac_int(&roundData, a, frac_bit); +#else + return (int32_t)(a*((int32_t)1 << frac_bit)); +#endif +} + +float32 INT_TO_CVI_FLOAT(int32_t a) +{ +#if SOFT_FLOAT + struct roundingData roundData; + roundData.mode = float_round_nearest_even; + return cvi_int32_to_float32(&roundData, a); +#else + return (float32)a; +#endif +} + +int32_t CVI_FLOAT_TO_INT(float32 a) +{ +#if SOFT_FLOAT + struct roundingData roundData; + roundData.mode = float_round_nearest_even; + return cvi_float32_to_int32(&roundData, a); +#else + return (int32_t)(a + 0.5); +#endif +} + +float32 CVI_FLOAT_ADD(float32 a, float32 b) +{ + float32 c; +#if SOFT_FLOAT + struct roundingData roundData; + + roundData.mode = float_round_nearest_even; + c = cvi_float32_add(&roundData, a, b); +#else + c = a + b; +#endif + + return c; +} + +float32 CVI_FLOAT_SUB(float32 a, float32 b) +{ + float32 c; +#if SOFT_FLOAT + struct roundingData roundData; + + roundData.mode = float_round_nearest_even; + c = cvi_float32_sub(&roundData, a, b); +#else + c = a - b; +#endif + + return c; +} + +float32 CVI_FLOAT_MUL(float32 a, float32 b) +{ + float32 c; +#if SOFT_FLOAT + struct roundingData roundData; + roundData.mode = float_round_nearest_even; + c = cvi_float32_mul(&roundData, a, b); +#else + c = a * b; +#endif + + return c; +} + +float32 CVI_FLOAT_EXP(float32 a) +{ + float32 c; + +#if SOFT_FLOAT + c = cvi_float32_exp(a); +#else + c = expf(a); +#endif + + return c; +} + +float32 CVI_FLOAT_LOG(float32 a) +{ + float32 c; + +#if SOFT_FLOAT + c = cvi_float32_log(a); +#else + c = logf(a); +#endif + + return c; +} + +float32 CVI_FLOAT_POW(float32 a, float32 b) +{ + float32 c; + +#if SOFT_FLOAT + c = cvi_float32_pow(a, b); +#else + c = powf(a, b); +#endif + + return c; +} + +float32 CVI_FLOAT_DIV(float32 a, float32 b) +{ + float32 c; +#if SOFT_FLOAT + struct roundingData roundData; + + roundData.mode = float_round_nearest_even; + c = cvi_float32_div(&roundData, a, b); +#else + c = a / b; +#endif + + return c; +} + +uint32_t CVI_FLOAT_EQ(float32 a, float32 b) +{ +#if SOFT_FLOAT + return cvi_float32_eq(a, b); +#else + return a == b; +#endif +} + +uint32_t CVI_FLOAT_LE(float32 a, float32 b) +{ +#if SOFT_FLOAT + return cvi_float32_le(a, b); +#else + return a <= b; +#endif +} + +uint32_t CVI_FLOAT_LT(float32 a, float32 b) +{ +#if SOFT_FLOAT + return cvi_float32_lt(a, b); +#else + return a < b; +#endif +} + +uint32_t CVI_FLOAT_GT(float32 a, float32 b) +{ +#if SOFT_FLOAT + return cvi_float32_le(b, a); +#else + return a > b; +#endif +} + +uint32_t CVI_FLOAT_GE(float32 a, float32 b) +{ +#if SOFT_FLOAT + return cvi_float32_lt(b, a); +#else + return a >= b; +#endif +} + +float32 CVI_FLOAT_MIN(float32 a, float32 b) +{ + return (CVI_FLOAT_LT(a, b)) ? a : b; +} +float32 CVI_FLOAT_MAX(float32 a, float32 b) +{ + return (CVI_FLOAT_GT(a, b)) ? a : b; +} +float32 CVI_FLOAT_CLIP(float32 low, float32 high, float32 a) +{ + return CVI_FLOAT_MIN((CVI_FLOAT_MAX(low, a)), high); +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_float_point.h b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_float_point.h new file mode 100644 index 0000000000..54ede357f5 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_float_point.h @@ -0,0 +1,40 @@ + +#ifndef __CVI_FLOAT_POINT__ +#define __CVI_FLOAT_POINT__ + +#include + +#define SOFT_FLOAT 1 + +#if SOFT_FLOAT +#include "cvi_soft_float.h" +typedef sw_float float32; +#else +#include +typedef float float32; +#endif + +float32 FRAC_INT_TO_CVI_FLOAT(int32_t a, int frac_bit); +int32_t CVI_FLOAT_TO_FRAC_INT(float32 a, int frac_bit); + +float32 INT_TO_CVI_FLOAT(int32_t a); +int32_t CVI_FLOAT_TO_INT(float32 a); + +float32 CVI_FLOAT_ADD(float32 a, float32 b); +float32 CVI_FLOAT_SUB(float32 a, float32 b); +float32 CVI_FLOAT_MUL(float32 a, float32 b); +float32 CVI_FLOAT_EXP(float32 a); +float32 CVI_FLOAT_LOG(float32 a); +float32 CVI_FLOAT_POW(float32 a, float32 b); +float32 CVI_FLOAT_DIV(float32 a, float32 b); + +uint32_t CVI_FLOAT_EQ(float32 a, float32 b); +uint32_t CVI_FLOAT_LT(float32 a, float32 b); +uint32_t CVI_FLOAT_LE(float32 a, float32 b); +uint32_t CVI_FLOAT_GT(float32 a, float32 b); +uint32_t CVI_FLOAT_GE(float32 a, float32 b); + +float32 CVI_FLOAT_MIN(float32 a, float32 b); +float32 CVI_FLOAT_MAX(float32 a, float32 b); +float32 CVI_FLOAT_CLIP(float32 low, float32 high, float32 a); +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_soft_float.c b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_soft_float.c new file mode 100644 index 0000000000..620362d018 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_soft_float.c @@ -0,0 +1,1564 @@ +#include "cvi_soft_float.h" + +typedef unsigned int flag; + +typedef unsigned short bits16; +typedef unsigned int bits32; +typedef unsigned long long int bits64; + +typedef int sbits32; +typedef signed long long int sbits64; + +unsigned int float_exception_flags; +int8_t float_detect_tininess = float_tininess_after_rounding; + +#define is_Negative_NaN 0xFFFFFFFF +#define isNaN 0x7fffffff +#define isINF 0x7f800000 +#define is_Negative_INF 0xff800000 +#define FLOAT32_ONE 0x3f800000 +#define FLOAT32_Negative_ONE 0xbf800000 +/* LOG */ +#define LOGF_TABLE_BITS 4 +#define LOGF_POLY_ORDER 4 +#define LOGF_N (1 << LOGF_TABLE_BITS) +#define OFF 0x3f330000 + +const sw_float logf_incv_table[] = { + 0x3fb30f64, + 0x3fab8f6a, + 0x3fa4a9d0, + 0x3f9e4cae, + 0x3f9868c8, + 0x3f92f114, + 0x3f8dda52, + 0x3f891ac8, + 0x3f84a9fa, + 0x3f800000, + 0x3f730468, + 0x3f652599, + 0x3f5901b3, + 0x3f4e168b, + 0x3f443730, + 0x3f3b3ee8, +}; + +const sw_float logf_logc_table[] = { + 0xbeabdfbc, + 0xbe95f785, + 0xbe80f574, + 0xbe598ec5, + 0xbe32ba78, + 0xbe0d515e, + 0xbdd273b6, + 0xbd8cb9e3, + 0xbd1297a2, + 0x0, + 0x3d552d53, + 0x3de2f29d, + 0x3e29372c, + 0x3e5e1430, + 0x3e882c5e, + 0x3ea02183, +}; + +const sw_float logf_poly_table[] = { + 0xbe80751a, + 0x3eaabad8, + 0xbefffff8, +}; + +const sw_float logf_ln2 = 0x3f317218; +/* LOG */ + +/* POW */ +#define POWF_LOG2_TABLE_BITS 4 +#define POWF_LOG2_POLY_ORDER 5 +#define POWF_SCALE_BITS 0 +#define POWF_SCALE (1 << POWF_SCALE_BITS) +#define POW_N (1 << POWF_LOG2_TABLE_BITS) + +uint32_t powf_log2_data_invc[] = { + 0x3fb30f64, + 0x3fab8f6a, + 0x3fa4a9d0, + 0x3f9e4cae, + 0x3f9868c8, + 0x3f92f114, + 0x3f8dda52, + 0x3f891ac8, + 0x3f84a9fa, + 0x3f800000, + 0x3f730468, + 0x3f652599, + 0x3f5901b3, + 0x3f4e168b, + 0x3f443730, + 0x3f3b3ee8, +}; +uint32_t powf_log2_data_logc[] = { + 0xbef7f633, + 0xbed85b42, + 0xbeba0c58, + 0xbe9cef49, + 0xbe80ece0, + 0xbe4be0e9, + 0xbe17cf1d, + 0xbdcb065e, + 0xbd537cee, + 0x0, + 0x3d99c655, + 0x3e23b54b, + 0x3e74205a, + 0x3ea03230, + 0x3ec474e1, + 0x3ee70522, +}; + +uint32_t powf_log2_data_poly[] = { + 0x3e93b0b6, + 0xbeb8cb4d, + 0x3ef63853, + 0xbf38aa3a, + 0x3fb8aa3b, +}; +/* POW */ + +/* EXP */ +#define EXP2F_TABLE_BITS 5 +#define EXPF_N (1 << EXP2F_TABLE_BITS) +#define SIGN_BIAS (1 << (EXP2F_TABLE_BITS + 11)) +#define InvLn2N_f32 (0x4238aa3b) +sw_float expf_tab[] = { + 0x3f800000, + 0x3f7ecd87, + 0x3f7daac3, + 0x3f7c980f, + 0x3f7b95c2, + 0x3f7aa43a, + 0x3f79c3d3, + 0x3f78f4f0, + 0x3f7837f0, + 0x3f778d3a, + 0x3f76f532, + 0x3f767043, + 0x3f75fed7, + 0x3f75a15b, + 0x3f75583f, + 0x3f7523f6, + 0x3f7504f3, + 0x3f74fbaf, + 0x3f7508a4, + 0x3f752c4d, + 0x3f75672a, + 0x3f75b9be, + 0x3f76248c, + 0x3f76a81e, + 0x3f7744fd, + 0x3f77fbb8, + 0x3f78ccdf, + 0x3f79b907, + 0x3f7ac0c7, + 0x3f7be4ba, + 0x3f7d257d, + 0x3f7e83b3, +}; + +sw_float expf_poly_scaled[] = { + 0x35e357c2, + 0x3975fe73, + 0x3cb17218, +}; + +sw_float expf_poly[] = { + 0x3d6357c2, + 0x3e75fe73, + 0x3f317218, +}; +/* EXP */ + +void float_raise(int8_t flags) +{ + float_exception_flags |= flags; +} + +#if 0 + static inline float +sw_floatTofloat(sw_float f) +{ + union { + sw_float f; + float i; + } u = {f}; + return u.i; +} + + static inline sw_float +floatTosw_float(float f) +{ + union { + float f; + sw_float i; + } u = {f}; + return u.i; +} +#endif + +/* + * Returns 0 if not int, 1 if odd int, 2 if even int. The argument is + * the bit representation of a non-zero finite floating-point value. + */ +static inline int checkint(uint32_t iy) +{ + int e = iy >> 23 & 0xff; + if (e < 0x7f) + return 0; + if (e > 0x7f + 23) + return 2; + if (iy & ((1 << (0x7f + 23 - e)) - 1)) + return 0; + if (iy & (1 << (0x7f + 23 - e))) + return 1; + return 2; +} + +static inline int zeroinfnan(uint32_t ix) +{ + return 2 * ix - 1 >= 2u * 0x7f800000 - 1; +} + +static inline flag extractFloat32Sign(sw_float a) +{ + return a >> 31; +} + +/* + * ------------------------------------------------------------------------------- + * Packs the sign `zSign', exponent `zExp', and significand `zSig' into a + * single-precision floating-point value, returning the result. After being + * shifted into the proper positions, the three fields are simply added + * together to form the result. This means that any integer portion of `zSig' + * will be added into the exponent. Since a properly normalized significand + * will have an integer portion equal to 1, the `zExp' input should be 1 less + * than the desired result exponent whenever `zSig' is a complete, normalized + * significand. + * ------------------------------------------------------------------------------- + */ +static inline sw_float packFloat32(flag zSign, int16_t zExp, bits32 zSig) +{ + return (((bits32)zSign) << 31) + (((bits32)zExp) << 23) + zSig; +} + + +/* + * ------------------------------------------------------------------------------- + * Shifts `a' right by the number of bits given in `count'. If any nonzero + * bits are shifted off, they are ``jammed'' into the least significant bit of + * the result by setting the least significant bit to 1. The value of `count' + * can be arbitrarily large; in particular, if `count' is greater than 32, the + * result will be either 0 or 1, depending on whether `a' is zero or nonzero. + * The result is stored in the location pointed to by `zPtr'. + * ------------------------------------------------------------------------------- + */ +static inline void shift32RightJamming(bits32 a, int16_t count, bits32 *zPtr) +{ + bits32 z; + if (count == 0) { + z = a; + } else if (count < 32) { + z = (a >> count) | ((a << ((-count) & 31)) != 0); + } else { + z = (a != 0); + } + *zPtr = z; +} + +/* + * ------------------------------------------------------------------------------- + * Returns the number of leading 0 bits before the most-significant 1 bit + * of `a'. If `a' is zero, 32 is returned. + * ------------------------------------------------------------------------------- + */ +static int8_t countLeadingZeros32(bits32 a) +{ + static const int8_t countLeadingZerosHigh[] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + int8_t shiftCount; + + shiftCount = 0; + if (a < 0x10000) { + shiftCount += 16; + a <<= 16; + } + + if (a < 0x1000000) { + shiftCount += 8; + a <<= 8; + } + shiftCount += countLeadingZerosHigh[a >> 24]; + return shiftCount; +} + +/* + * ------------------------------------------------------------------------------- + * Normalizes the subnormal single-precision floating-point value represented + * by the denormalized significand `aSig'. The normalized exponent and + * significand are stored at the locations pointed to by `zExpPtr' and + * `zSigPtr', respectively. + * ------------------------------------------------------------------------------- + */ +static void normalizeFloat32Subnormal(bits32 aSig, int16_t *zExpPtr, bits32 *zSigPtr) +{ + int8_t shiftCount; + + shiftCount = countLeadingZeros32(aSig) - 8; + *zSigPtr = aSig << shiftCount; + *zExpPtr = 1 - shiftCount; +} + +/* + * ------------------------------------------------------------------------------- + * Takes an abstract floating-point value having sign `zSign', exponent `zExp', + * and significand `zSig', and returns the proper single-precision floating- + * point value corresponding to the abstract input. Ordinarily, the abstract + * value is simply rounded and packed into the single-precision format, with + * the inexact exception raised if the abstract input cannot be represented + * exactly. If the abstract value is too large, however, the overflow and + * inexact exceptions are raised and an infinity or maximal finite value is + * returned. If the abstract value is too small, the input value is rounded to + * a subnormal number, and the underflow and inexact exceptions are raised if + * the abstract input cannot be represented exactly as a subnormal single- + * precision floating-point number. + * The input significand `zSig' has its binary point between bits 30 + * and 29, which is 7 bits to the left of the usual location. This shifted + * significand must be normalized or smaller. If `zSig' is not normalized, + * `zExp' must be 0; in that case, the result returned is a subnormal number, + * and it must not require rounding. In the usual case that `zSig' is + * normalized, `zExp' must be 1 less than the ``true'' floating-point exponent. + * The handling of underflow and overflow follows the IEC/IEEE Standard for + * Binary Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +static sw_float roundAndPackFloat32(struct roundingData *roundData, flag zSign, int16_t zExp, bits32 zSig) +{ + int8_t roundingMode; + flag roundNearestEven; + int8_t roundIncrement, roundBits; + flag isTiny; + + roundingMode = roundData->mode; + roundNearestEven = (roundingMode == float_round_nearest_even); + roundIncrement = 0x40; + if (!roundNearestEven) { + if (roundingMode == float_round_to_zero) { + roundIncrement = 0; + } else { + roundIncrement = 0x7F; + if (zSign) { + if (roundingMode == float_round_up) + roundIncrement = 0; + } else { + if (roundingMode == float_round_down) + roundIncrement = 0; + } + } + } + roundBits = zSig & 0x7F; + if ((bits16)zExp >= 0xFD) { + if ((zExp > 0xFD) || ((zExp == 0xFD) && ((sbits32)(zSig + roundIncrement) < 0))) { + float_raise(float_flag_overflow | float_flag_inexact); + roundData->exception |= float_flag_overflow | float_flag_inexact; + return packFloat32(zSign, 0xFF, 0) - (roundIncrement == 0); + } + + if (zExp < 0) { + isTiny = + (float_detect_tininess == float_tininess_before_rounding) || + (zExp < -1) || (zSig + roundIncrement < 0x80000000); + shift32RightJamming(zSig, -zExp, &zSig); + zExp = 0; + roundBits = zSig & 0x7F; + + if (isTiny && roundBits) { + roundData->exception |= float_flag_underflow; + float_raise(float_flag_underflow); + } + } + } + + if (roundBits) { + float_raise(float_flag_inexact); + } + zSig = (zSig + roundIncrement) >> 7; + zSig &= ~(((roundBits ^ 0x40) == 0) & roundNearestEven); + if (zSig == 0) + zExp = 0; + return packFloat32(zSign, zExp, zSig); +} + +/* + * ------------------------------------------------------------------------------- + * Takes a 64-bit fixed-point value `absZ' with binary point between bits 6 + * and 7, and returns the properly rounded 32-bit integer corresponding to the + * input. If `zSign' is nonzero, the input is negated before being converted + * to an integer. Bit 63 of `absZ' must be zero. Ordinarily, the fixed-point + * input is simply rounded to an integer, with the inexact exception raised if + * the input cannot be represented exactly as an integer. If the fixed-point + * input is too large, however, the invalid exception is raised and the largest + * positive or negative integer is returned. + * ------------------------------------------------------------------------------- + */ +static int32_t roundAndPackInt32(struct roundingData *roundData, flag zSign, bits64 absZ) +{ + int8_t roundingMode; + flag roundNearestEven; + int8_t roundIncrement, roundBits; + int32_t z; + + roundingMode = roundData->mode; + roundNearestEven = (roundingMode == float_round_nearest_even); + roundIncrement = 0x40; + if (!roundNearestEven) { + if (roundingMode == float_round_to_zero) { + roundIncrement = 0; + } else { + roundIncrement = 0x7F; + if (zSign) { + if (roundingMode == float_round_up) + roundIncrement = 0; + } else { + if (roundingMode == float_round_down) + roundIncrement = 0; + } + } + } + roundBits = absZ & 0x7F; + absZ = (absZ + roundIncrement) >> 7; + absZ &= ~(((roundBits ^ 0x40) == 0) & roundNearestEven); + z = absZ; + if (zSign) + z = -z; + if ((absZ >> 32) || (z && ((z < 0) ^ zSign))) { + roundData->exception |= float_flag_invalid; + float_raise(float_flag_invalid); + return zSign ? 0x80000000 : 0x7FFFFFFF; + } + if (roundBits) { + float_raise(float_flag_inexact); + roundData->exception |= float_flag_inexact; + } + return z; +} + +/* + * ------------------------------------------------------------------------------- + * Returns the fraction bits of the single-precision floating-point value `a'. + * ------------------------------------------------------------------------------- + */ +static inline bits32 extractFloat32Frac(sw_float a) +{ + return a & 0x007FFFFF; +} + +/* + * ------------------------------------------------------------------------------- + * Returns the exponent bits of the single-precision floating-point value `a'. + * ------------------------------------------------------------------------------- + */ +static inline int16_t extractFloat32Exp(sw_float a) +{ + return (a >> 23) & 0xFF; +} + +flag float32_is_signaling_nan(sw_float a) +{ + return (((a >> 22) & 0x1FF) == 0x1FE) && (a & 0x003FFFFF); +} + +/* + * ------------------------------------------------------------------------------- + * Returns 1 if the single-precision floating-point value `a' is a NaN; + * otherwise returns 0. + * ------------------------------------------------------------------------------- + */ + +flag float32_is_nan(sw_float a) +{ + return (0xFF000000 < (bits32)(a << 1)); +} + +void shift64RightJamming(bits64 a, int16_t count, bits64 *zPtr) +{ + bits64 z; + + if (count == 0) { + z = a; + } else if (count < 64) { + z = (a >> count) | ((a << ((-count) & 63)) != 0); + } else { + z = (a != 0); + } + *zPtr = z; +} + +/* + * ------------------------------------------------------------------------------- + * Takes an abstract floating-point value having sign `zSign', exponent `zExp', + * and significand `zSig', and returns the proper single-precision floating- + * point value corresponding to the abstract input. This routine is just like + * `roundAndPackFloat32' except that `zSig' does not have to be normalized in + * any way. In all cases, `zExp' must be 1 less than the ``true'' floating- + * point exponent. + * ------------------------------------------------------------------------------- + */ +static sw_float normalizeRoundAndPackFloat32(struct roundingData *roundData, flag zSign, int16_t zExp, bits32 zSig) +{ + int8_t shiftCount; + + shiftCount = countLeadingZeros32(zSig) - 1; + return roundAndPackFloat32(roundData, zSign, zExp - shiftCount, zSig << shiftCount); +} + +/* + * ------------------------------------------------------------------------------- + * Takes two single-precision floating-point values `a' and `b', one of which + * is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a + * signaling NaN, the invalid exception is raised. + * ------------------------------------------------------------------------------- + */ +static sw_float propagateFloat32NaN(sw_float a, sw_float b) +{ + flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN; + + aIsNaN = float32_is_nan(a); + aIsSignalingNaN = float32_is_signaling_nan(a); + bIsNaN = float32_is_nan(b); + bIsSignalingNaN = float32_is_signaling_nan(b); + a |= 0x00400000; + b |= 0x00400000; + if (aIsSignalingNaN | bIsSignalingNaN) + float_raise(float_flag_invalid); + if (aIsNaN) { + return (aIsSignalingNaN & bIsNaN) ? b : a; + } else { + return b; + } +} + +static sw_float addFloat32Sigs(struct roundingData *roundData, sw_float a, sw_float b, flag zSign) +{ + int16_t aExp, bExp, zExp; + bits32 aSig, bSig, zSig; + int16_t expDiff; + + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a); + bSig = extractFloat32Frac(b); + bExp = extractFloat32Exp(b); + expDiff = aExp - bExp; + aSig <<= 6; + bSig <<= 6; + if (expDiff > 0) { + if (aExp == 0xFF) { + if (aSig) + return propagateFloat32NaN(a, b); + return a; + } + if (bExp == 0) { + --expDiff; + } else { + bSig |= 0x20000000; + } + shift32RightJamming(bSig, expDiff, &bSig); + zExp = aExp; + } else if (expDiff < 0) { + if (bExp == 0xFF) { + if (bSig) + return propagateFloat32NaN(a, b); + return packFloat32(zSign, 0xFF, 0); + } + if (aExp == 0) { + ++expDiff; + } else { + aSig |= 0x20000000; + } + shift32RightJamming(aSig, -expDiff, &aSig); + zExp = bExp; + } else { + if (aExp == 0xFF) { + if (aSig | bSig) + return propagateFloat32NaN(a, b); + return a; + } + if (aExp == 0) + return packFloat32(zSign, 0, (aSig + bSig) >> 6); + zSig = 0x40000000 + aSig + bSig; + zExp = aExp; + goto roundAndPack; + } + aSig |= 0x20000000; + zSig = (aSig + bSig) << 1; + --zExp; + if ((sbits32)zSig < 0) { + zSig = aSig + bSig; + ++zExp; + } +roundAndPack: + return roundAndPackFloat32(roundData, zSign, zExp, zSig); +} + +/* + * ------------------------------------------------------------------------------- + * Returns the result of subtracting the absolute values of the single- + * precision floating-point values `a' and `b'. If `zSign' is true, the + * difference is negated before being returned. `zSign' is ignored if the + * result is a NaN. The subtraction is performed according to the IEC/IEEE + * Standard for Binary Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +static sw_float subFloat32Sigs(struct roundingData *roundData, sw_float a, sw_float b, flag zSign) +{ + int16_t aExp, bExp, zExp; + bits32 aSig, bSig, zSig; + int16_t expDiff; + + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a); + bSig = extractFloat32Frac(b); + bExp = extractFloat32Exp(b); + expDiff = aExp - bExp; + aSig <<= 7; + bSig <<= 7; + if (expDiff > 0) + goto aExpBigger; + if (expDiff < 0) + goto bExpBigger; + if (aExp == 0xFF) { + if (aSig | bSig) + return propagateFloat32NaN(a, b); + float_raise(float_flag_invalid); + roundData->exception |= float_flag_invalid; + return is_Negative_NaN; + } + if (aExp == 0) { + aExp = 1; + bExp = 1; + } + if (bSig < aSig) + goto aBigger; + if (aSig < bSig) + goto bBigger; + return packFloat32(roundData->mode == float_round_down, 0, 0); +bExpBigger: + if (bExp == 0xFF) { + if (bSig) + return propagateFloat32NaN(a, b); + return packFloat32(zSign ^ 1, 0xFF, 0); + } + if (aExp == 0) { + ++expDiff; + } else { + aSig |= 0x40000000; + } + shift32RightJamming(aSig, -expDiff, &aSig); + bSig |= 0x40000000; +bBigger: + zSig = bSig - aSig; + zExp = bExp; + zSign ^= 1; + goto normalizeRoundAndPack; +aExpBigger: + if (aExp == 0xFF) { + if (aSig) + return propagateFloat32NaN(a, b); + return a; + } + if (bExp == 0) { + --expDiff; + } else { + bSig |= 0x40000000; + } + shift32RightJamming(bSig, expDiff, &bSig); + aSig |= 0x40000000; +aBigger: + zSig = aSig - bSig; + zExp = aExp; +normalizeRoundAndPack: + --zExp; + return normalizeRoundAndPackFloat32(roundData, zSign, zExp, zSig); +} + +sw_float cvi_float32_add(struct roundingData *roundData, sw_float a, sw_float b) +{ + flag aSign, bSign; + + aSign = extractFloat32Sign(a); + bSign = extractFloat32Sign(b); + if (aSign == bSign) { + return addFloat32Sigs(roundData, a, b, aSign); + } else { + return subFloat32Sigs(roundData, a, b, aSign); + } +} + +/* + * ------------------------------------------------------------------------------- + * Returns the result of subtracting the single-precision floating-point values + * `a' and `b'. The operation is performed according to the IEC/IEEE Standard + * for Binary Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +sw_float cvi_float32_sub(struct roundingData *roundData, sw_float a, sw_float b) +{ + flag aSign, bSign; + + aSign = extractFloat32Sign(a); + bSign = extractFloat32Sign(b); + if (aSign == bSign) { + return subFloat32Sigs(roundData, a, b, aSign); + } else { + return addFloat32Sigs(roundData, a, b, aSign); + } +} + +/* + * ------------------------------------------------------------------------------- + * Returns the result of multiplying the single-precision floating-point values + * `a' and `b'. The operation is performed according to the IEC/IEEE Standard + * for Binary Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +sw_float cvi_float32_mul(struct roundingData *roundData, sw_float a, sw_float b) +{ + flag aSign, bSign, zSign; + int16_t aExp, bExp, zExp; + bits32 aSig, bSig; + bits64 zSig64; + bits32 zSig; + + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a); + aSign = extractFloat32Sign(a); + bSig = extractFloat32Frac(b); + bExp = extractFloat32Exp(b); + bSign = extractFloat32Sign(b); + zSign = aSign ^ bSign; + if (aExp == 0xFF) { + if (aSig || ((bExp == 0xFF) && bSig)) { + return propagateFloat32NaN(a, b); + } + if ((bExp | bSig) == 0) { + roundData->exception |= float_flag_invalid; + float_raise(float_flag_invalid); + return is_Negative_NaN; + } + return packFloat32(zSign, 0xFF, 0); + } + if (bExp == 0xFF) { + if (bSig) + return propagateFloat32NaN(a, b); + if ((aExp | aSig) == 0) { + roundData->exception |= float_flag_invalid; + float_raise(float_flag_invalid); + return is_Negative_NaN; + } + return packFloat32(zSign, 0xFF, 0); + } + if (aExp == 0) { + if (aSig == 0) + return packFloat32(zSign, 0, 0); + normalizeFloat32Subnormal(aSig, &aExp, &aSig); + } + if (bExp == 0) { + if (bSig == 0) + return packFloat32(zSign, 0, 0); + normalizeFloat32Subnormal(bSig, &bExp, &bSig); + } + zExp = aExp + bExp - 0x7F; + aSig = (aSig | 0x00800000) << 7; + bSig = (bSig | 0x00800000) << 8; + shift64RightJamming(((bits64)aSig) * bSig, 32, &zSig64); + zSig = zSig64; + if (0 <= (sbits32)(zSig << 1)) { + zSig <<= 1; + --zExp; + } + return roundAndPackFloat32(roundData, zSign, zExp, zSig); +} + +static uint32_t do_div(bits64 *n, bits32 base) +{ + uint64_t rem = *n; + uint64_t b = base; + uint64_t res, d = 1; + uint32_t high = rem >> 32; + + /* Reduce the thing a bit first */ + res = 0; + if (high >= base) { + high /= base; + res = (uint64_t)high << 32; + rem -= (uint64_t)(high * base) << 32; + } + + while ((int64_t)b > 0 && b < rem) { + b = b + b; + d = d + d; + } + + do { + if (rem >= b) { + rem -= b; + res += d; + } + b >>= 1; + d >>= 1; + } while (d); + + *n = res; + return rem; +} + +/* + * ------------------------------------------------------------------------------- + * Returns the result of dividing the single-precision floating-point value `a' + * by the corresponding value `b'. The operation is performed according to the + * IEC/IEEE Standard for Binary Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +sw_float cvi_float32_div(struct roundingData *roundData, sw_float a, sw_float b) +{ + flag aSign, bSign, zSign; + int16_t aExp, bExp, zExp; + bits32 aSig, bSig, zSig; + + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a); + aSign = extractFloat32Sign(a); + bSig = extractFloat32Frac(b); + bExp = extractFloat32Exp(b); + bSign = extractFloat32Sign(b); + zSign = aSign ^ bSign; + if (aExp == 0xFF) { + if (aSig) + return propagateFloat32NaN(a, b); + if (bExp == 0xFF) { + if (bSig) + return propagateFloat32NaN(a, b); + roundData->exception |= float_flag_invalid; + float_raise(float_flag_invalid); + return is_Negative_NaN; + } + return packFloat32(zSign, 0xFF, 0); + } + if (bExp == 0xFF) { + if (bSig) + return propagateFloat32NaN(a, b); + return packFloat32(zSign, 0, 0); + } + if (bExp == 0) { + if (bSig == 0) { + if ((aExp | aSig) == 0) { + roundData->exception |= float_flag_invalid; + float_raise(float_flag_invalid); + return is_Negative_NaN; + } + roundData->exception |= float_flag_divbyzero; + float_raise(float_flag_divbyzero); + return packFloat32(zSign, 0xFF, 0); + } + normalizeFloat32Subnormal(bSig, &bExp, &bSig); + } + if (aExp == 0) { + if (aSig == 0) + return packFloat32(zSign, 0, 0); + normalizeFloat32Subnormal(aSig, &aExp, &aSig); + } + zExp = aExp - bExp + 0x7D; + aSig = (aSig | 0x00800000) << 7; + bSig = (bSig | 0x00800000) << 8; + if (bSig <= (aSig + aSig)) { + aSig >>= 1; + ++zExp; + } + { + bits64 tmp = ((bits64)aSig) << 32; + do_div(&tmp, bSig); + zSig = tmp; + } + if ((zSig & 0x3F) == 0) { + zSig |= (((bits64)bSig) * zSig != ((bits64)aSig) << 32); + } + return roundAndPackFloat32(roundData, zSign, zExp, zSig); +} + +sw_float cvi_float32_abs(sw_float x) +{ + sw_float x_abs = 0x7fffffff & (x); + return x_abs; +} + +/* + * ------------------------------------------------------------------------------- + * Returns 1 if the single-precision floating-point value `a' is equal to the + * corresponding value `b', and 0 otherwise. The comparison is performed + * according to the IEC/IEEE Standard for Binary Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +uint32_t cvi_float32_eq(sw_float a, sw_float b) +{ + + if (((extractFloat32Exp(a) == 0xFF) && extractFloat32Frac(a)) || + ((extractFloat32Exp(b) == 0xFF) && extractFloat32Frac(b))) { + if (float32_is_signaling_nan(a) || float32_is_signaling_nan(b)) { + float_raise(float_flag_invalid); + } + return 0; + } + return (a == b) || ((bits32)((a | b) << 1) == 0); +} + +/* + * ------------------------------------------------------------------------------- + * Returns 1 if the single-precision floating-point value `a' is less than or + * equal to the corresponding value `b', and 0 otherwise. The comparison is + * performed according to the IEC/IEEE Standard for Binary Floating-point + * Arithmetic. + * ------------------------------------------------------------------------------- + */ +uint32_t cvi_float32_le(sw_float a, sw_float b) +{ + flag aSign, bSign; + + if (((extractFloat32Exp(a) == 0xFF) && extractFloat32Frac(a)) || + ((extractFloat32Exp(b) == 0xFF) && extractFloat32Frac(b))) { + float_raise(float_flag_invalid); + return 0; + } + aSign = extractFloat32Sign(a); + bSign = extractFloat32Sign(b); + if (aSign != bSign) + return aSign || ((bits32)((a | b) << 1) == 0); + return (a == b) || (aSign ^ (a < b)); +} + +/* + * ------------------------------------------------------------------------------- + * Returns 1 if the single-precision floating-point value `a' is less than + * the corresponding value `b', and 0 otherwise. The comparison is performed + * according to the IEC/IEEE Standard for Binary Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +uint32_t cvi_float32_lt(sw_float a, sw_float b) +{ + flag aSign, bSign; + + if (((extractFloat32Exp(a) == 0xFF) && extractFloat32Frac(a)) || + ((extractFloat32Exp(b) == 0xFF) && extractFloat32Frac(b))) { + float_raise(float_flag_invalid); + return 0; + } + aSign = extractFloat32Sign(a); + bSign = extractFloat32Sign(b); + if (aSign != bSign) + return aSign && ((bits32)((a | b) << 1) != 0); + return (a != b) && (aSign ^ (a < b)); +} + +/* + * ------------------------------------------------------------------------------- + * Returns the result of converting the single-precision floating-point value + * `a' to the 32-bit two's complement integer format. The conversion is + * performed according to the IEC/IEEE Standard for Binary Floating-point + * Arithmetic---which means in particular that the conversion is rounded + * according to the current rounding mode. If `a' is a NaN, the largest + * positive integer is returned. Otherwise, if the conversion overflows, the + * largest integer with the same sign as `a' is returned. + * ------------------------------------------------------------------------------- + */ +int32_t cvi_float32_to_int32(struct roundingData *roundData, sw_float a) +{ + flag aSign; + int16_t aExp, shiftCount; + bits32 aSig; + bits64 zSig; + + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a); + aSign = extractFloat32Sign(a); + if ((aExp == 0x7FF) && aSig) + aSign = 0; + if (aExp) + aSig |= 0x00800000; + shiftCount = 0xAF - aExp; + zSig = aSig; + zSig <<= 32; + if (shiftCount > 0) + shift64RightJamming(zSig, shiftCount, &zSig); + return roundAndPackInt32(roundData, aSign, zSig); +} + +int32_t cvi_float32_to_frac_int(struct roundingData *roundData, sw_float a, int frac_bit) +{ + flag aSign; + int16_t aExp, shiftCount; + bits32 aSig; + bits64 zSig; + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a) + frac_bit; + aSign = extractFloat32Sign(a); + if ((aExp == 0x7FF) && aSig) + aSign = 0; + if (aExp) + aSig |= 0x00800000; + shiftCount = 0xAF - aExp; + zSig = aSig; + zSig <<= 32; + if (shiftCount > 0) + shift64RightJamming(zSig, shiftCount, &zSig); + return roundAndPackInt32(roundData, aSign, zSig); +} +/* + * ------------------------------------------------------------------------------- + * Returns the result of converting the single-precision floating-point value + * `a' to the 32-bit two's complement integer format. The conversion is + * performed according to the IEC/IEEE Standard for Binary Floating-point + * Arithmetic, except that the conversion is always rounded toward zero. If + * `a' is a NaN, the largest positive integer is returned. Otherwise, if the + * conversion overflows, the largest integer with the same sign as `a' is + * returned. + * ------------------------------------------------------------------------------- + */ +int32_t cvi_float32_to_int32_round_to_zero(sw_float a) +{ + flag aSign; + int16_t aExp, shiftCount; + bits32 aSig; + int32_t z; + + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a); + aSign = extractFloat32Sign(a); + shiftCount = aExp - 0x9E; + if (shiftCount >= 0) { + if (a == 0xCF000000) + return 0x80000000; + float_raise(float_flag_invalid); + if (!aSign || ((aExp == 0xFF) && aSig)) + return 0x7FFFFFFF; + return 0x80000000; + } else if (aExp <= 0x7E) { + if (aExp | aSig) + float_raise(float_flag_inexact); + return 0; + } + aSig = (aSig | 0x00800000) << 8; + z = aSig >> (-shiftCount); + if ((bits32)(aSig << (shiftCount & 31))) { + float_raise(float_flag_inexact); + } + return aSign ? -z : z; +} + +/* + * ------------------------------------------------------------------------------- + * Rounds the single-precision floating-point value `a' to an integer, and + * returns the result as a single-precision floating-point value. The + * operation is performed according to the IEC/IEEE Standard for Binary + * Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +sw_float cvi_float32_round_to_int(struct roundingData *roundData, sw_float a) +{ + flag aSign; + int16_t aExp; + bits32 lastBitMask, roundBitsMask; + int8_t roundingMode; + sw_float z; + + aExp = extractFloat32Exp(a); + if (aExp >= 0x96) { + if ((aExp == 0xFF) && extractFloat32Frac(a)) { + return propagateFloat32NaN(a, a); + } + return a; + } + roundingMode = roundData->mode; + if (aExp <= 0x7E) { + if ((bits32)(a << 1) == 0) + return a; + roundData->exception |= float_flag_inexact; + float_raise(float_flag_inexact); + aSign = extractFloat32Sign(a); + switch (roundingMode) { + case float_round_nearest_even: + if ((aExp == 0x7E) && extractFloat32Frac(a)) { + return packFloat32(aSign, 0x7F, 0); + } + break; + case float_round_down: + return aSign ? 0xBF800000 : 0; + case float_round_up: + return aSign ? 0x80000000 : 0x3F800000; + } + return packFloat32(aSign, 0, 0); + } + lastBitMask = 1; + lastBitMask <<= 0x96 - aExp; + roundBitsMask = lastBitMask - 1; + z = a; + if (roundingMode == float_round_nearest_even) { + z += lastBitMask >> 1; + if ((z & roundBitsMask) == 0) + z &= ~lastBitMask; + } else if (roundingMode != float_round_to_zero) { + if (extractFloat32Sign(z) ^ (roundingMode == float_round_up)) { + z += roundBitsMask; + } + } + z &= ~roundBitsMask; + if (z != a) { + roundData->exception |= float_flag_inexact; + float_raise(float_flag_inexact); + } + return z; +} + +void cvi_float32_extract_int_and_float(sw_float a, sw_float *int_a, sw_float *float_a) +{ + struct roundingData roundData; + roundData.mode = float_round_to_zero; + *int_a = cvi_float32_round_to_int(&roundData, a); + *float_a = cvi_float32_sub(&roundData, a, *int_a); +} + +/* + * ------------------------------------------------------------------------------- + * Returns the result of converting the 32-bit two's complement integer `a' to + * the single-precision floating-point format. The conversion is performed + * according to the IEC/IEEE Standard for Binary Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +sw_float cvi_int32_to_float32(struct roundingData *roundData, int32_t a) +{ + flag zSign; + + if (a == 0) + return 0; + if (a == (int32_t) 0x80000000) + return packFloat32(1, 0x9E, 0); + zSign = (a < 0); + return normalizeRoundAndPackFloat32(roundData, zSign, 0x9C, zSign ? -a : a); +} + +sw_float cvi_frac_int_to_float32(struct roundingData *roundData, int32_t a, int32_t frac_bit) +{ + flag zSign; + if (a == 0) + return 0; + if (a == (int32_t) 0x80000000) + return packFloat32(1, 0x9E, 0); + zSign = (a < 0); + return normalizeRoundAndPackFloat32(roundData, zSign, 0x9C - frac_bit, zSign ? -a : a); +} +/* + * ------------------------------------------------------------------------------- + * Returns an approximation to the square root of the 32-bit significand given + * by `a'. Considered as an integer, `a' must be at least 2^31. If bit 0 of + * `aExp' (the least significant bit) is 1, the integer returned approximates + * 2^31*sqrt(`a'/2^31), where `a' is considered an integer. If bit 0 of `aExp' + * is 0, the integer returned approximates 2^31*sqrt(`a'/2^30). In either + * case, the approximation returned lies strictly within +/-2 of the exact + * value. + * ------------------------------------------------------------------------------- + */ +static bits32 estimateSqrt32(int16_t aExp, bits32 a) +{ + static const bits16 sqrtOddAdjustments[] = { + 0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0, + 0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67}; + static const bits16 sqrtEvenAdjustments[] = { + 0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E, + 0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002}; + int8_t index; + bits32 z; + bits64 A; + + index = (a >> 27) & 15; + if (aExp & 1) { + z = 0x4000 + (a >> 17) - sqrtOddAdjustments[index]; + z = ((a / z) << 14) + (z << 15); + a >>= 1; + } else { + z = 0x8000 + (a >> 17) - sqrtEvenAdjustments[index]; + z = a / z + z; + z = (z >= 0x20000) ? 0xFFFF8000 : (z << 15); + if (z <= a) + return (bits32)(((sbits32)a) >> 1); + } + A = ((bits64)a) << 31; + do_div(&A, z); + return ((bits32)A) + (z >> 1); +} + +/* + * ------------------------------------------------------------------------------- + * Returns the square root of the single-precision floating-point value `a'. + * The operation is performed according to the IEC/IEEE Standard for Binary + * Floating-point Arithmetic. + * ------------------------------------------------------------------------------- + */ +sw_float cvi_float32_sqrt(struct roundingData *roundData, sw_float a) +{ + flag aSign; + int16_t aExp, zExp; + bits32 aSig, zSig; + bits64 rem, term; + + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a); + aSign = extractFloat32Sign(a); + if (aExp == 0xFF) { + if (aSig) + return propagateFloat32NaN(a, 0); + if (!aSign) + return a; + roundData->exception |= float_flag_invalid; + float_raise(float_flag_invalid); + return is_Negative_NaN; + } + if (aSign) { + if ((aExp | aSig) == 0) + return a; + roundData->exception |= float_flag_invalid; + float_raise(float_flag_invalid); + return is_Negative_NaN; + } + if (aExp == 0) { + if (aSig == 0) + return 0; + normalizeFloat32Subnormal(aSig, &aExp, &aSig); + } + zExp = ((aExp - 0x7F) >> 1) + 0x7E; + aSig = (aSig | 0x00800000) << 8; + zSig = estimateSqrt32(aExp, aSig) + 2; + if ((zSig & 0x7F) <= 5) { + if (zSig < 2) { + zSig = 0xFFFFFFFF; + } else { + aSig >>= aExp & 1; + term = ((bits64)zSig) * zSig; + rem = (((bits64)aSig) << 32) - term; + while ((sbits64)rem < 0) { + --zSig; + rem += (((bits64)zSig) << 1) | 1; + } + zSig |= (rem != 0); + } + } + shift32RightJamming(zSig, 1, &zSig); + return roundAndPackFloat32(roundData, 0, zExp, zSig); +} + +sw_float cvi_float32_frexp(sw_float a, int *pw2) +{ + uint32_t f = (uint32_t)a; + int i = (((uint32_t)a) >> 23) & 0x000000ff; + + i -= 0x7e; + *pw2 = i; + f &= 0x807fffff; /* strip all exponent bits */ + f |= 0x3f000000; /* mantissa between 0.5 and 1 */ + return ((sw_float)f); +} + +static inline uint32_t top12(sw_float x) +{ + return ((uint32_t)x) >> 20; +} + +sw_float cvi_float32_exp(sw_float x_32) +{ + struct roundingData roundData; + uint32_t abstop; + const uint32_t top12_88 = 0x42b; + sw_float z, shift32, kd, r, r2, s, y; + uint32_t ki, t; + + abstop = top12(x_32) & 0x7ff; + + roundData.mode = float_round_nearest_even; + if (abstop >= top12_88) { + const sw_float max_input = 0x42b17217; + const sw_float min_input = 0xc2cff1b4; + + /* |x| >= 88 or x is nan. */ + if (x_32 == is_Negative_INF) + return 0; + if (abstop >= top12(isINF)) + return cvi_float32_add(&roundData, x_32, x_32); + + //if (x > 0x1.62e42ep6f) /* x > log(0x1p128) ~= 88.72 */ + if (!cvi_float32_lt(x_32, max_input)) { + float_raise(float_flag_overflow); + return isINF; + } + //if (x < -0x1.9fe368p6f) /* x < log(0x1p-150) ~= -103.97 */ + if (cvi_float32_lt(x_32, min_input)) { + float_raise(float_flag_underflow); + return is_Negative_INF; + } + } + + /* x*N/Ln2 = k + r with r in [-1/2, 1/2] and int k. */ + z = cvi_float32_mul(&roundData, InvLn2N_f32, x_32); + + /* Round and convert z to int, the result is in [-150*N, 128*N] and + * ideally nearest int is used, otherwise the magnitude of r can be + * bigger which gives larger approximation error. + */ + + shift32 = 0x4b400000; // floatTofloat32(0x1.8p+23); + kd = cvi_float32_add(&roundData, shift32, z); + ki = kd; + kd = cvi_float32_sub(&roundData, kd, shift32); + r = cvi_float32_sub(&roundData, z, kd); + + + r2 = cvi_float32_mul(&roundData, r, r); + /* exp(x) = 2^(k/N) * 2^(r/N) ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) */ + t = expf_tab[ki % EXPF_N]; + t += ki << (23 - EXP2F_TABLE_BITS); + s = t; + z = cvi_float32_mul(&roundData, expf_poly_scaled[0], r); + z = cvi_float32_add(&roundData, z, expf_poly_scaled[1]); + y = cvi_float32_mul(&roundData, expf_poly_scaled[2], r); + y = cvi_float32_add(&roundData, y, FLOAT32_ONE); + y = cvi_float32_add(&roundData, y, cvi_float32_mul(&roundData, z, r2)); + y = cvi_float32_mul(&roundData, y, s); + return y; +} + +sw_float cvi_float32_exp2(sw_float xd, uint32_t sign_bias) +{ + struct roundingData roundData; + sw_float shift32 = 0x48c00000; //(0x1.8p+23 / N); + sw_float kd, r, s, z, r2, y; + uint32_t ki; + uint32_t t, ski; + + roundData.mode = float_round_nearest_even; + kd = cvi_float32_add(&roundData, shift32, xd); + ki = kd; + kd = cvi_float32_sub(&roundData, kd, shift32); + r = cvi_float32_sub(&roundData, xd, kd); + + /* exp2(x) = 2^(k/N) * 2^r ~= s * (C0*r^3 + C1*r^2 + C2*r + 1) */ + t = expf_tab[ki % EXPF_N]; + ski = ki + sign_bias; + t += ski << (23 - EXP2F_TABLE_BITS); + s = t; + z = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, expf_poly[0], r), expf_poly[1]); + r2 = cvi_float32_mul(&roundData, r, r); + y = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, expf_poly[2], r), FLOAT32_ONE); + y = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, z, r2), y); + y = cvi_float32_mul(&roundData, y, s); + return y; +} + +sw_float cvi_float32_log2(uint32_t ix) +{ + struct roundingData roundData; + /* double_t for better performance on targets with FLT_EVAL_METHOD==2. */ + // double_t z, r, r2, r4, p, q, y, y0, invc, logc; + uint32_t iz, top, tmp; + int k, i; + sw_float invc, logc, z, r, y0, *A, r2, y, p, r4, q; + + roundData.mode = float_round_nearest_even; + + /* x = 2^k z; where z is in range [OFF,2*OFF] and exact. + * The range is split into N subintervals. + * The ith subinterval contains z and c is near its center. + */ + tmp = ix - OFF; + i = (tmp >> (23 - POWF_LOG2_TABLE_BITS)) % POW_N; + top = tmp & 0xff800000; + iz = ix - top; + k = (int32_t)top >> (23 - POWF_SCALE_BITS); /* arithmetic shift */ + invc = powf_log2_data_invc[i]; + logc = powf_log2_data_logc[i]; + z = iz; + + /* log2(x) = log1p(z/c-1)/ln2 + log2(c) + k */ + r = cvi_float32_sub(&roundData, cvi_float32_mul(&roundData, invc, z), FLOAT32_ONE); + y0 = cvi_float32_add(&roundData, logc, cvi_int32_to_float32(&roundData, k)); + + // y0 = logc + (double_t) k; + + /* Pipelined polynomial evaluation to approximate log1p(r)/ln2. */ + A = powf_log2_data_poly; + r2 = cvi_float32_mul(&roundData, r, r); + y = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, A[0], r), A[1]); + p = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, A[2], r), A[3]); + r4 = cvi_float32_mul(&roundData, r2, r2); + q = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, A[4], r), y0); + q = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, p, r2), q); + y = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, y, r4), q); + + return y; +} + +sw_float cvi_float32_pow(sw_float x_32, sw_float y_32) +{ + uint32_t sign_bias = 0; + uint32_t ix, iy; + struct roundingData roundData; + sw_float logx, ylogx; + + roundData.mode = float_round_nearest_even; + + ix = x_32; + iy = y_32; + + if ((ix - 0x00800000 >= 0x7f800000 - 0x00800000 || zeroinfnan(iy))) { + /* Either (x < 0x1p-126 or inf or nan) or (y is 0 or inf or nan). */ + if (zeroinfnan(iy)) { + if (2 * iy == 0) //y = 0 + return FLOAT32_ONE; + if (ix == 0x3f800000) //x = 1 + return FLOAT32_ONE; + if (2 * ix > 2u * 0x7f800000 || 2 * iy > 2u * 0x7f800000) + return cvi_float32_add(&roundData, x_32, y_32); + if (2 * ix == 2 * 0x3f800000) // +-1 + return FLOAT32_ONE; + if ((2 * ix < 2 * 0x3f800000) == !(iy & 0x80000000)) + return 0; /* |x|<1 && y==inf or |x|>1 && y==-inf. */ + return cvi_float32_mul(&roundData, y_32, y_32); + } + if (zeroinfnan(ix)) { + sw_float x2 = cvi_float32_mul(&roundData, x_32, x_32); + if (ix & 0x80000000 && checkint(iy) == 1) { + cvi_float32_mul(&roundData, x2, FLOAT32_Negative_ONE); + sign_bias = 1; + } + /* Without the barrier some versions of clang hoist the 1/x2 and + * thus division by zero exception can be signaled spuriously. + */ + return iy & 0x80000000 ? cvi_float32_div(&roundData, FLOAT32_ONE, x2) : x2; + } + /* x and y are non-zero finite. */ + if (ix & 0x80000000) { + /* Finite x < 0. */ + int yint = checkint(iy); + if (yint == 0) { + float_raise(float_flag_invalid); + return isNaN; // return __math_invalidf (x); + } + if (yint == 1) + sign_bias = SIGN_BIAS; + ix &= 0x7fffffff; + } + if (ix < 0x00800000) { + /* Normalize subnormal x so exponent becomes negative. */ + ix = cvi_float32_mul(&roundData, x_32, 0x4b000000 /*floatTofloat32(0x1p23f)*/); + // ix = asuint (x * 0x1p23f); + ix &= 0x7fffffff; + ix -= 23 << 23; + } + } + + logx = cvi_float32_log2(ix); + ylogx = cvi_float32_mul(&roundData, y_32, logx); + if (!cvi_float32_lt(cvi_float32_abs(ylogx), 0x42fc0000 /* 126 */)) { + if (extractFloat32Sign(ylogx)) + return is_Negative_INF; + else + return isINF; +#if 0 + /* |y*log(x)| >= 126. */ + if (ylogx > 0x1.fffffffd1d571p+6 * POWF_SCALE) + /* |x^y| > 0x1.ffffffp127. */ + return __math_oflowf(sign_bias); + if (WANT_ROUNDING && WANT_ERRNO && ylogx > 0x1.fffffffa3aae2p+6 * POWF_SCALE) + /* |x^y| > 0x1.fffffep127, check if we round away from 0. */ + if ((!sign_bias && eval_as_float(1.0f + opt_barrier_float(0x1p-25f)) != 1.0f) || + (sign_bias && eval_as_float(-1.0f - opt_barrier_float(0x1p-25f)) != -1.0f)) + return __math_oflowf(sign_bias); + if (ylogx <= -150.0 * POWF_SCALE) + return __math_uflowf(sign_bias); +#if WANT_ERRNO_UFLOW + if (ylogx < -149.0 * POWF_SCALE) + return __math_may_uflowf(sign_bias); +#endif +#endif + } + return cvi_float32_exp2(ylogx, sign_bias); +} + +sw_float cvi_float32_log(sw_float x_32) +{ + struct roundingData roundData; + + /* double_t for better performance on targets with FLT_EVAL_METHOD==2. */ + uint32_t ix, iz, tmp; + int k, i; + sw_float z, r, r2, y0, y; + + roundData.mode = float_round_nearest_even; + ix = x_32; + if (ix - 0x00800000 >= 0x7f800000 - 0x00800000) { + /* x < 0x1p-126 or inf or nan. */ + if (ix * 2 == 0) { + float_raise(float_flag_divbyzero); + return isNaN; + } + if (ix == 0x7f800000) /* log(inf) == inf. */ + return isINF; + if ((ix & 0x80000000) || ix * 2 >= 0xff000000) { + float_raise(float_flag_invalid); + return isNaN; + } + /* x is subnormal, normalize it. */ + ix = cvi_float32_mul(&roundData, x_32, 0x4b000000); //ix = asuint(x * 0x1p23f); + ix -= 23 << 23; + } + + /* x = 2^k z; where z is in range [OFF,2*OFF] and exact. + * The range is split into N subintervals. + * The ith subinterval contains z and c is near its center. + */ + tmp = ix - OFF; + i = (tmp >> (23 - LOGF_TABLE_BITS)) % LOGF_N; + k = (int32_t)tmp >> 23; /* arithmetic shift */ + iz = ix - (tmp & 0x1ff << 23); + z = iz; + + r = cvi_float32_mul(&roundData, z, logf_incv_table[i]); + r = cvi_float32_sub(&roundData, r, FLOAT32_ONE); + r2 = cvi_float32_mul(&roundData, r, r); + y0 = cvi_float32_mul(&roundData, cvi_int32_to_float32(&roundData, k), logf_ln2); + y0 = cvi_float32_add(&roundData, logf_logc_table[i], y0); + + y = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, r, logf_poly_table[1]), logf_poly_table[2]); + y = cvi_float32_add(&roundData, cvi_float32_mul(&roundData, r2, logf_poly_table[0]), y); + y = cvi_float32_mul(&roundData, y, r2); + y = cvi_float32_add(&roundData, y, y0); + y = cvi_float32_add(&roundData, y, r); + return y; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_soft_float.h b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_soft_float.h new file mode 100644 index 0000000000..c26f22f961 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_float_point/cvi_soft_float.h @@ -0,0 +1,62 @@ + +#ifndef __CVI_SOFTFLOAT__ +#define __CVI_SOFTFLOAT__ + +#include + +// exactly the same with IEEE 754 single-floating point binary representation +typedef unsigned int sw_float; + +/* + * ------------------------------------------------------------------------------- + * Software IEC/IEEE floating-point rounding mode. + * ------------------------------------------------------------------------------- + */ +//extern int8 float_rounding_mode; +enum { + float_round_nearest_even = 0, + float_round_to_zero = 1, + float_round_down = 2, + float_round_up = 3 +}; + +enum { + float_flag_invalid = 1, + float_flag_divbyzero = 2, + float_flag_overflow = 4, + float_flag_underflow = 8, + float_flag_inexact = 16 +}; + +enum { + float_tininess_after_rounding = 0, + float_tininess_before_rounding = 1 +}; + +struct roundingData { + char mode; + char precision; + signed char exception; +}; + +sw_float cvi_float32_add(struct roundingData *roundData, sw_float a, sw_float b); +sw_float cvi_float32_sub(struct roundingData *roundData, sw_float a, sw_float b); +sw_float cvi_float32_mul(struct roundingData *roundData, sw_float a, sw_float b); +sw_float cvi_float32_div(struct roundingData *roundData, sw_float a, sw_float b); + +uint32_t cvi_float32_eq(sw_float a, sw_float b); +uint32_t cvi_float32_le(sw_float a, sw_float b); +uint32_t cvi_float32_lt(sw_float a, sw_float b); + +int32_t cvi_float32_to_int32(struct roundingData *roundData, sw_float a); +int32_t cvi_float32_to_frac_int(struct roundingData *roundData, sw_float a, int frac_bit); +int32_t cvi_float32_to_int32_round_to_zero(sw_float a); +sw_float cvi_float32_round_to_int(struct roundingData *roundData, sw_float a); +sw_float cvi_int32_to_float32(struct roundingData *roundData, int32_t a); +sw_float cvi_frac_int_to_float32(struct roundingData *roundData, int32_t a, int32_t frac_bit); +sw_float cvi_float32_abs(sw_float x); +sw_float cvi_float32_sqrt(struct roundingData *roundData, sw_float a); +sw_float cvi_float32_exp(sw_float x); +sw_float cvi_float32_log(sw_float x_32); +sw_float cvi_float32_pow(sw_float x_32, sw_float y_32); +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_rc_kernel.c b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_rc_kernel.c new file mode 100644 index 0000000000..c9038314a0 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_rc_kernel.c @@ -0,0 +1,767 @@ +#include +#include "cvi_rc_kernel.h" +#include "../cvi_vcom.h" + +const int g_rcGopRemainBitWeight = 20; +const int g_rcLastPicQpClip = 3; +const int g_rcLevelPicQpClip = 3; +const int g_rcPicQpNormalClip = 10; + +const RC_Float g_rcAlphaMinValue = FLOAT_VAL_p05; +const RC_Float g_rcAlphaMaxValue = FLOAT_VAL_1000; +const RC_Float g_rcBetaMinValue = FLOAT_VAL_minus_3; +const RC_Float g_rcBetaMaxValue = FLOAT_VAL_minus_1; +//const RC_Float g_rcBetaMaxValue = FLOAT_VAL_3p2003; ///////////////// +const RC_Float g_rcMinPPicBpp = FLOAT_VAL_p00024; +const RC_Float g_rcALPHA_I = FLOAT_VAL_6p7542; +const RC_Float g_rcBETA_I = FLOAT_VAL_1p786; +const RC_Float g_rcALPHA_P = FLOAT_VAL_3p2003; +const RC_Float g_rcBETA_P = FLOAT_VAL_minus_1p367; +const RC_Float g_rcTcBETA = FLOAT_VAL_1p2517; +const RC_Float g_picAvgTc = FLOAT_VAL_12; + +const RC_Float g_lambdaQpScale = FLOAT_VAL_4p2005; +const RC_Float g_lambdaQpBias = FLOAT_VAL_13p7122; + +int vcom_mask = CVI_VCOM_MASK_CURR; + +module_param(vcom_mask, int, 0644); + +// ---------------------------------------------------------------- + +static int LambdaToQp(RC_Float lambda) +{ + CVI_VCOM_FLOAT("g_lambdaQpScale = %f, lambda = %f, g_lambdaQpBias = %f\n", + getFloat(g_lambdaQpScale), getFloat(lambda), getFloat(g_lambdaQpBias)); + return CVI_FLOAT_TO_INT(CVI_FLOAT_ADD(CVI_FLOAT_MUL(g_lambdaQpScale, CVI_FLOAT_LOG(lambda)), g_lambdaQpBias)); +} + +static RC_Float QpToLambda(RC_Float qp) +{ + return CVI_FLOAT_EXP(CVI_FLOAT_DIV(CVI_FLOAT_SUB(qp, g_lambdaQpBias), g_lambdaQpScale)); +} + +static RC_Float intraLambdaToBpp(RC_Float lambda, RC_Float alpha, RC_Float beta, RC_Float tc) +{ + RC_Float bpp_div_tc = + CVI_FLOAT_POW( + CVI_FLOAT_DIV( + CVI_FLOAT_MUL(FLOAT_VAL_256, lambda), + alpha), + CVI_FLOAT_DIV(FLOAT_VAL_minus_1, beta)); + RC_Float bpp = CVI_FLOAT_MUL(tc, bpp_div_tc); + + return bpp; +} + +static RC_Float lambdaToBpp(RC_Float lambda, RC_Float alpha, RC_Float beta) +{ + return CVI_FLOAT_POW(CVI_FLOAT_DIV(lambda, alpha), CVI_FLOAT_DIV(FLOAT_VAL_1, beta)); +} + +// ---------------------------------------------------------------- + +void rcModelUpdateParam_Init(stRcKernelInfo *info, RC_Float targetBpp) +{ + CVI_VCOM_FLOAT("targetBpp = %f\n", getFloat(targetBpp)); + + if (targetBpp < FLOAT_VAL_p03) { + cviRcKernel_setRCModelUpdateStep(info, FLOAT_VAL_p01, FLOAT_VAL_p005); + } else if (targetBpp < FLOAT_VAL_p08) { + cviRcKernel_setRCModelUpdateStep(info, FLOAT_VAL_p05, FLOAT_VAL_p025); + } else if (targetBpp < FLOAT_VAL_p2) { + CVI_VCOM_FLOAT("targetBpp = %f\n", getFloat(targetBpp)); + cviRcKernel_setRCModelUpdateStep(info, FLOAT_VAL_p1, FLOAT_VAL_p05); + // cviRcKernel_setRCModelUpdateStep(info, FLOAT_VAL_p2, FLOAT_VAL_p1); + } else if (targetBpp < FLOAT_VAL_p5) { + cviRcKernel_setRCModelUpdateStep(info, FLOAT_VAL_p2, FLOAT_VAL_p1); + } else { + cviRcKernel_setRCModelUpdateStep(info, FLOAT_VAL_p4, FLOAT_VAL_p2); + } +} + +// ---------------------------------------------------------------- + +void updateAlphaBetaIntra(RC_Float *alpha, RC_Float *beta, RC_Float tc, int targetBits, int encodedBits) +{ + RC_Float lnbpp = CVI_FLOAT_LOG(tc); + RC_Float diffLambda = CVI_FLOAT_MUL( + *beta, + CVI_FLOAT_SUB( + CVI_FLOAT_LOG(INT_TO_CVI_FLOAT(encodedBits)), + CVI_FLOAT_LOG(INT_TO_CVI_FLOAT(targetBits))) + ); + + diffLambda = CVI_FLOAT_CLIP( + FLOAT_VAL_minus_p125, + FLOAT_VAL_p125, + CVI_FLOAT_MUL(FLOAT_VAL_p25, diffLambda)); + *alpha = CVI_FLOAT_MUL(*alpha, CVI_FLOAT_EXP(diffLambda)); + *beta = CVI_FLOAT_ADD(*beta, CVI_FLOAT_DIV(diffLambda, lnbpp)); +} + +void rcGopBitAlloc(stRcKernelInfo *info, int picIdx) +{ + int picIdxInIPeriod = picIdx % info->intraPeriod; + int smoothWinSize = MAX(info->statFrameNum - picIdxInIPeriod + 1, info->framerate); + int picTargetBit = MAX(info->minPicBit, info->predictPicAvgBit + (info->bitError / smoothWinSize)); + int gopSize; + + // bitError reset + if (info->bitError >= 3 * info->targetBitrate / 2) { + CVI_VCOM_CVRC("reset bitError errBit:%d, targetBit:%d\n" + , info->bitError, info->targetBitrate); + info->bitError = 0; + info->bitreset_cnt++; + picTargetBit = MAX(info->minPicBit, info->predictPicAvgBit); + } else { + info->bitreset_cnt = 0; + } + + // smooth consecutive rc-gop allocated bit + if (info->isLastPicI == 0) { + picTargetBit = (info->gopPicAvgBit * 25 + picTargetBit * 75) / 100; + } + + info->gopPicAvgBit = picTargetBit; + gopSize = ((picIdx / info->rcGopSize) + ((picIdx % info->rcGopSize) != 0)) * + info->rcGopSize + 1 - picIdx; + info->gopPicLeft = gopSize; + info->gopBitLeft = picTargetBit * gopSize; + + info->bitrateChange = 0; +} + +void rcGopBitReAlloc(stRcKernelInfo *info, int picIdx) +{ + int picIdxInIPeriod = picIdx % info->intraPeriod; + int smoothWinSize = MAX(info->statFrameNum - picIdxInIPeriod + 1, info->framerate); + int picTargetBit = MAX(info->minPicBit, info->predictPicAvgBit + (info->bitError / smoothWinSize)); + + // smooth consecutive rc-gop allocated bit + if (info->isLastPicI == 0) { + picTargetBit = (info->gopPicAvgBit * 25 + picTargetBit * 75) / 100; + } + + info->gopPicAvgBit = picTargetBit; + info->gopBitLeft = picTargetBit * info->gopPicLeft; + info->bitrateChange = 0; +} + +int getAvgPFrameQp(stRcKernelInfo *info) +{ + if (info->pPicCnt > 0) { + return (((CVI_FLOAT_TO_INT(info->pPicQpAccum) + (info->pPicCnt>>1)) / info->pPicCnt)) + + info->ipQpDelta; + } else { + return info->lastLevelQp[0]; + } +} + +int estPicBitByModel(stRcKernelInfo *info, RC_Float lambda, int isIPic) +{ + RC_Float alpha = info->rqModel[isIPic == 0].alpha; + RC_Float beta = info->rqModel[isIPic == 0].beta; + RC_Float bpp; + int bpp_frac; + + if (isIPic) { + bpp = intraLambdaToBpp(lambda, alpha, beta, info->picTextCplx); + } else { + bpp = lambdaToBpp(lambda, alpha, beta); + } + bpp = CVI_FLOAT_MIN(bpp, FLOAT_VAL_12); + bpp_frac = CVI_FLOAT_TO_FRAC_INT(bpp, FIX_POINT_FRAC_BIT); + + return ((long long int)bpp_frac * info->numOfPixel)>>FIX_POINT_FRAC_BIT; +} + +int rcIPicBitAlloc(stRcKernelInfo *info, int qp) +{ + RC_Float lambda = QpToLambda(INT_TO_CVI_FLOAT(qp)); + int intraOrgBits = estPicBitByModel(info, lambda, 1); + int intraBits = CLIP(info->minIPicBit, info->maxIPicBit, intraOrgBits); + + if (info->lastIPicBit > 0) { + int upperBitLimit = info->lastIPicBit + info->neiIBitMargin; + int lowerBitLimit = info->lastIPicBit - info->neiIBitMargin; + if (intraBits > upperBitLimit) { + intraBits = (2 * intraBits + 8 * upperBitLimit) / 10; + } else if (intraBits < lowerBitLimit) { + intraBits = (2 * intraBits + 8 * lowerBitLimit) / 10; + } + } + return intraBits; +} + +int estPicTargetBits(stRcKernelInfo *info) +{ + int gopRemainAvgBit = MAX(MAX(0, info->gopBitLeft) / MAX(1, info->gopPicLeft), info->predictPicAvgBit); + int targetBits = (g_rcGopRemainBitWeight * gopRemainAvgBit + + ((100 - g_rcGopRemainBitWeight) * info->gopPicAvgBit)) / 100; + return targetBits; +} + +RC_Float calculateLambdaIntra(RC_Float alpha, RC_Float beta, RC_Float picTextCplx, RC_Float bitsPerPixel) +{ + return CVI_FLOAT_MUL( + FRAC_INT_TO_CVI_FLOAT( + (CVI_FLOAT_TO_FRAC_INT(alpha, FIX_POINT_FRAC_BIT) >> 8), FIX_POINT_FRAC_BIT), + CVI_FLOAT_POW(CVI_FLOAT_DIV(picTextCplx, bitsPerPixel), beta)); +} + +RC_Float estPicLambda(stRcKernelInfo *info, int targetBits, int isIPic, int picIdx) +{ + int picLv = isIPic == 0; + RC_Float alpha = info->rqModel[picLv].alpha; + RC_Float beta = info->rqModel[picLv].beta; + RC_Float estLambda; + RC_Float lastLevelLambda; + RC_Float lastPicLambda; + RC_Float maxLambda, minLambda; + int isFirstPPic; + int levelClip; + unsigned long long targetBits64 = ((unsigned long long) targetBits << FIX_POINT_FRAC_BIT); + int bpp32; + RC_Float bpp; + + do_div(targetBits64, info->numOfPixel); + bpp32 = (int) targetBits64; + bpp = FRAC_INT_TO_CVI_FLOAT(bpp32, FIX_POINT_FRAC_BIT); + + if (isIPic) { + estLambda = calculateLambdaIntra(alpha, beta, info->picTextCplx, bpp); + } else { + estLambda = CVI_FLOAT_MUL(alpha, CVI_FLOAT_POW(bpp, beta)); + } + + CVI_VCOM_TRACE("targetBits = %d\n", targetBits); + + CVI_VCOM_CVRC("id = %d, picLv = %d, alpha = %d, beta = %d, bpp = %d, estLambda = %d\n", + picIdx, picLv, CVI_FLOAT_TO_INT(CVI_FLOAT_MUL((alpha), INT_TO_CVI_FLOAT(1000))), + CVI_FLOAT_TO_INT(CVI_FLOAT_MUL((beta), INT_TO_CVI_FLOAT(1000))), + CVI_FLOAT_TO_INT(CVI_FLOAT_MUL((bpp), INT_TO_CVI_FLOAT(1000))), + CVI_FLOAT_TO_INT(CVI_FLOAT_MUL((estLambda), INT_TO_CVI_FLOAT(1000)))); + lastLevelLambda = info->lastLevelLambda[picLv]; + lastPicLambda = info->lastPicLambda; + CVI_VCOM_FLOAT("lastLevelLambda = %f, lastPicLambda = %f\n", + getFloat(lastLevelLambda), getFloat(lastPicLambda)); + + isFirstPPic = (info->isCurPicI == 0) && (info->isLastPicI == 1) && (picIdx > info->intraPeriod); + levelClip = (info->isCurPicI == 1) ? (picIdx > info->intraPeriod) : (info->isLastPicI == 0); + + if (CVI_FLOAT_GT(lastLevelLambda, FLOAT_VAL_0) && levelClip == 1) { + RC_Float low, high; + + lastLevelLambda = CVI_FLOAT_CLIP(FLOAT_VAL_p1, FLOAT_VAL_10000, lastLevelLambda); + low = CVI_FLOAT_MUL(lastLevelLambda, info->lastLevelLambdaScaleLow); + high = CVI_FLOAT_MUL(lastLevelLambda, info->lastLevelLambdaScaleHigh); + estLambda = CVI_FLOAT_CLIP(low, high, estLambda); + CVI_VCOM_FLOAT("lastLevelLambda = %f, estLambda = %f, low = %f, high = %f\n", + getFloat(lastLevelLambda), getFloat(estLambda), getFloat(low), getFloat(high)); + } + + if (CVI_FLOAT_GT(lastPicLambda, FLOAT_VAL_0) && isFirstPPic == 1) { + RC_Float low, high; + + low = CVI_FLOAT_MUL(lastPicLambda, info->lastPicLambdaScaleLow); + high = CVI_FLOAT_MUL(lastPicLambda, info->lastNormalLambdaScaleHigh); + + estLambda = CVI_FLOAT_CLIP(low, high, estLambda); + CVI_VCOM_FLOAT("lastPicLambda = %f, estLambda = %f, low = %f, high = %f\n", + getFloat(lastPicLambda), getFloat(estLambda), getFloat(low), getFloat(high)); + } else if (CVI_FLOAT_GT(lastPicLambda, FLOAT_VAL_0) && isIPic == 0) { + RC_Float low, high; + + lastPicLambda = CVI_FLOAT_CLIP(FLOAT_VAL_p1, FLOAT_VAL_2000, lastPicLambda); + low = CVI_FLOAT_MUL(lastPicLambda, info->lastPicLambdaScaleLow); + high = CVI_FLOAT_MUL(lastPicLambda, info->lastPicLambdaScaleHigh); + estLambda = CVI_FLOAT_CLIP(low, high, estLambda); + CVI_VCOM_FLOAT("lastPicLambda = %f, estLambda = %f, low = %f, high = %f\n", + getFloat(lastPicLambda), getFloat(estLambda), getFloat(low), getFloat(high)); + } else if (CVI_FLOAT_GT(lastPicLambda, FLOAT_VAL_0)) { + RC_Float low, high; + + lastPicLambda = CVI_FLOAT_CLIP(FLOAT_VAL_p1, FLOAT_VAL_2000, lastPicLambda); + low = CVI_FLOAT_MUL(lastPicLambda, info->lastNormalLambdaScaleLow); + high = CVI_FLOAT_MUL(lastPicLambda, info->lastNormalLambdaScaleHigh); + estLambda = CVI_FLOAT_CLIP(low, high, estLambda); + CVI_VCOM_FLOAT("lastPicLambda = %f, estLambda = %f, low = %f, high = %f\n", + getFloat(lastPicLambda), getFloat(estLambda), getFloat(low), getFloat(high)); + } + + maxLambda = (info->isCurPicI) ? info->maxILambda : info->maxLambda; + minLambda = (info->isCurPicI) ? info->minILambda : info->minLambda; + estLambda = CVI_FLOAT_CLIP(minLambda, maxLambda, estLambda); + CVI_VCOM_FLOAT("estLambda = %f, minLambda = %f, maxLambda = %f\n", + getFloat(estLambda), getFloat(minLambda), getFloat(maxLambda)); + + return estLambda; +} + +int estPicQP(stRcKernelInfo *info, RC_Float lambda, int isIPic, int picIdx) +{ + int qp = LambdaToQp(lambda); + int picLv = isIPic == 0; + int lastLevelQP = info->lastLevelQp[picLv]; + int lastPicQP = info->lastPicQp; + int isFirstPPic = (info->isCurPicI == 0) && (info->isLastPicI == 1) && (picIdx > info->intraPeriod); + int levelClip = (info->isCurPicI == 1) ? (picIdx > info->intraPeriod) : (info->isLastPicI == 0); + int maxQp, minQp; + + CVI_VCOM_FLOAT("qp = %d, lambda = %f\n", qp, getFloat(lambda)); + CVI_VCOM_FLOAT("g_lambdaQpScale = %f, g_lambdaQpBias = %f\n", + getFloat(g_lambdaQpScale), getFloat(g_lambdaQpBias)); + CVI_VCOM_TRACE("maxIQp = %d, minIQp = %d, maxQp = %d, minQp = %d\n", + info->maxIQp, info->minIQp, info->maxQp, info->minQp); + + if (lastLevelQP > 0 && levelClip == 1) { + qp = CLIP(lastLevelQP - info->levelPicQpClip, lastLevelQP + info->levelPicQpClip, qp); + } + if (lastPicQP > 0 && isFirstPPic == 1) { + qp = CLIP(lastPicQP - info->lastPicQpClip, lastPicQP + g_rcPicQpNormalClip, qp); + } else if (lastPicQP > 0 && isIPic == 0) { + qp = CLIP(lastPicQP - info->lastPicQpClip, lastPicQP + info->lastPicQpClip, qp); + } else if (lastPicQP > 0) { + qp = CLIP(lastPicQP - info->picQpNormalClip, lastPicQP + info->picQpNormalClip, qp); + } + maxQp = (info->isCurPicI) ? info->maxIQp : info->maxQp; + minQp = (info->isCurPicI) ? info->minIQp : info->minQp; + + return CLIP(minQp, maxQp, qp); +} + +// --------------------- CVI RC kernel Set property --------------------- + +void cviRcKernel_setTextCplx(stRcKernelInfo *info, RC_Float madi) +{ + if (CVI_FLOAT_GT(madi, FLOAT_VAL_0)) { + info->picTextCplx = CVI_FLOAT_POW(madi, g_rcTcBETA); + } +} + +void cviRcKernel_setMinMaxQp(stRcKernelInfo *info, int minQp, int maxQp, int isIntra) +{ + if (isIntra == 1) { + info->maxIQp = maxQp; + info->minIQp = minQp; + info->maxILambda = QpToLambda(INT_TO_CVI_FLOAT(info->maxIQp)); + info->minILambda = QpToLambda(INT_TO_CVI_FLOAT(info->minIQp)); + CVI_VCOM_FLOAT("minQp = %d, maxQp = %d, maxILambda = %f, minILambda = %f\n", + minQp, maxQp, getFloat(info->maxILambda), getFloat(info->minILambda)); + } else { + info->maxQp = maxQp; + info->minQp = minQp; + info->maxLambda = QpToLambda(INT_TO_CVI_FLOAT(info->maxQp)); + info->minLambda = QpToLambda(INT_TO_CVI_FLOAT(info->minQp)); + } +} + +void cviRcKernel_setBitrateAndFrameRate(stRcKernelInfo *info, int targetBitrate, RC_Float frameRate) +{ + int maxIPicBitByIPRatio, maxIPicBitByMinPBudget; + RC_Float fPicAvgBit, targetBpp; + + CVI_VCOM_FLOAT("targetBitrate = %d, frameRate = %f\n", + targetBitrate, getFloat(frameRate)); + + if (targetBitrate > 0) { + info->targetBitrate = targetBitrate; + } + if (CVI_FLOAT_GT(frameRate, FLOAT_VAL_0)) { + info->framerate = CVI_FLOAT_TO_INT(frameRate); + info->statFrameNum = MAX(info->statTime * info->framerate, info->framerate); + } + // picture bit allocation param init + fPicAvgBit = CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(info->targetBitrate), frameRate); + info->picAvgBit = CVI_FLOAT_TO_INT(fPicAvgBit); + info->neiIBitMargin = info->targetBitrate / 10; + maxIPicBitByIPRatio = CVI_FLOAT_TO_INT( + CVI_FLOAT_MUL( + CVI_FLOAT_DIV( + INT_TO_CVI_FLOAT(info->maxIprop * info->intraPeriod), + INT_TO_CVI_FLOAT(info->maxIprop + info->intraPeriod - 1)), + fPicAvgBit)); + maxIPicBitByMinPBudget = + CVI_FLOAT_TO_INT(CVI_FLOAT_MUL(INT_TO_CVI_FLOAT(info->intraPeriod), fPicAvgBit)) - + (info->minPicBit * (info->intraPeriod - 1)); + info->minIPicBit = CVI_FLOAT_TO_INT( + CVI_FLOAT_MUL( + CVI_FLOAT_DIV( + INT_TO_CVI_FLOAT(info->minIprop * info->intraPeriod), + INT_TO_CVI_FLOAT(info->minIprop + info->intraPeriod - 1)), fPicAvgBit)); + info->maxIPicBit = MIN(maxIPicBitByIPRatio, maxIPicBitByMinPBudget); + + if (info->lastIPicBit > 0) { + info->predictPicAvgBit = MAX( + CVI_FLOAT_TO_INT( + CVI_FLOAT_DIV( + INT_TO_CVI_FLOAT( + MAX(0, info->targetBitrate * info->statTime - info->lastIPicBit)) + , info->statFrameNum - 1)), info->minPicBit); + } else { + info->predictPicAvgBit = info->picAvgBit; + } + info->avgGopLambda = FLOAT_VAL_minus_1; + info->bitrateChange = 1; + + CVI_VCOM_CVRC("targetBitrate = %d, framerate = %d, statFrameNum = %d\n", + info->targetBitrate, info->framerate, info->statFrameNum); + CVI_VCOM_CVRC("picAvgBit= %d, neiIBitMargin= %d, minIPicBit = %d, maxIPicBit = %d, avgp = %d\n", + info->picAvgBit, info->neiIBitMargin, info->minIPicBit, info->maxIPicBit, + info->predictPicAvgBit); + + // RC model param reset when scene change (only for P frame) + // cviRcKernel_setRCModelParam(info, g_rcALPHA_I, g_rcBETA_I, 0); + cviRcKernel_setRCModelParam(info, g_rcALPHA_P, g_rcBETA_P, 1); + + if (info->rcMdlUpdatType == 0) { + targetBpp = CVI_FLOAT_DIV( + INT_TO_CVI_FLOAT(info->targetBitrate), + CVI_FLOAT_MUL(frameRate, INT_TO_CVI_FLOAT(info->numOfPixel))); + rcModelUpdateParam_Init(info, targetBpp); + } + info->bitError = 0; +} + +void cviRcKernel_setLevelPicQpClip(stRcKernelInfo *info, int levelPicQpClip) +{ + info->levelPicQpClip = levelPicQpClip; + CVI_VCOM_TRACE("levelPicQpClip = %d\n", info->levelPicQpClip); + + info->lastLevelLambdaScaleLow = + CVI_FLOAT_POW(FLOAT_VAL_2, CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(-levelPicQpClip), FLOAT_VAL_3)); + info->lastLevelLambdaScaleHigh = + CVI_FLOAT_POW(FLOAT_VAL_2, CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(levelPicQpClip), FLOAT_VAL_3)); +} + +void cviRcKernel_setLastPicQpClip(stRcKernelInfo *info, int lastPicQpClip) +{ + info->lastPicQpClip = lastPicQpClip; + CVI_VCOM_TRACE("lastPicQpClip = %d\n", info->lastPicQpClip); + + info->lastPicLambdaScaleLow = + CVI_FLOAT_POW(FLOAT_VAL_2, CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(-lastPicQpClip), FLOAT_VAL_3)); + info->lastPicLambdaScaleHigh = + CVI_FLOAT_POW(FLOAT_VAL_2, CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(lastPicQpClip), FLOAT_VAL_3)); +} + +void cviRcKernel_setpPicQpNormalClip(stRcKernelInfo *info, int picQpNormalClip) +{ + info->picQpNormalClip = picQpNormalClip; + CVI_VCOM_TRACE("picQpNormalClip = %d\n", info->picQpNormalClip); + + info->lastNormalLambdaScaleLow = + CVI_FLOAT_POW(FLOAT_VAL_2, CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(-picQpNormalClip), FLOAT_VAL_3)); + info->lastNormalLambdaScaleHigh = + CVI_FLOAT_POW(FLOAT_VAL_2, CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(picQpNormalClip), FLOAT_VAL_3)); +} + +void cviRcKernel_setRCModelParam(stRcKernelInfo *info, RC_Float alpha, RC_Float beta, int model_idx) +{ + stRLModel *rqModel = info->rqModel; + int mdl_i = CLIP(0, MAX_T_LAYER, model_idx); + rqModel[mdl_i].alpha = alpha; + rqModel[mdl_i].beta = beta; +} + +void cviRcKernel_setRCModelUpdateStep(stRcKernelInfo *info, RC_Float alphaStep, RC_Float betaStep) +{ + info->alphaStep = alphaStep; + info->betaStep = betaStep; +} +// --------------------- CVI RC kernel main flow control --------------------- + +void cviRcKernel_init(stRcKernelInfo *info, stRcKernelCfg *cfg) +{ + int rcIterNum, baseRcGopSize, size; + + info->intraPeriod = cfg->intraPeriod; + info->numOfPixel = cfg->numOfPixel; + info->ipQpDelta = cfg->ipQpDelta; + info->firstFrmstartQp = cfg->firstFrmstartQp; + info->rcMdlUpdatType = cfg->rcMdlUpdatType; + info->statTime = cfg->statTime; + info->maxIprop = cfg->maxIprop; + info->minIprop = cfg->minIprop; + info->minPicBit = CVI_FLOAT_TO_INT(CVI_FLOAT_MUL(INT_TO_CVI_FLOAT(info->numOfPixel), g_rcMinPPicBpp)); + + cviRcKernel_setMinMaxQp(info, cfg->minIQp, cfg->maxIQp, 1); + cviRcKernel_setMinMaxQp(info, cfg->minQp, cfg->maxQp, 0); + // should be called after above params. are assigned + cviRcKernel_setBitrateAndFrameRate(info, cfg->targetBitrate, cfg->framerate); + cviRcKernel_setTextCplx(info, g_picAvgTc); + + // find a proper smooth bitrate-constraint unit size + rcIterNum = 6; + baseRcGopSize = MAX(MIN(info->intraPeriod, info->statFrameNum) / rcIterNum, 1); + info->rcGopSize = 1; + for (size = baseRcGopSize; size <= info->intraPeriod; size++) { + if (info->intraPeriod % size == 0) { + info->rcGopSize = size; + break; + } + } + + // pre-calculate common floating point constant + cviRcKernel_setLastPicQpClip(info, g_rcLastPicQpClip); + cviRcKernel_setLevelPicQpClip(info, g_rcLevelPicQpClip); + cviRcKernel_setpPicQpNormalClip(info, g_rcPicQpNormalClip); + + // RC model param init + cviRcKernel_setRCModelParam(info, g_rcALPHA_I, g_rcBETA_I, 0); + cviRcKernel_setRCModelParam(info, g_rcALPHA_P, g_rcBETA_P, 1); + + // variable reset + info->bitError = 0; + info->lastIPicBit = -1; + info->isCurPicI = 1; + info->isLastPicI = 0; + info->pPicQpAccum = FLOAT_VAL_0; + info->pPicCnt = 0; + info->isFirstPic = 1; + info->lastLevelLambda[0] = info->lastLevelLambda[1] = FLOAT_VAL_minus_1; + info->lastPicLambda = FLOAT_VAL_minus_1; + info->lastLevelQp[0] = info->lastLevelQp[1] = -1; + info->lastPicQp = -1; + info->avgGopLambda = FLOAT_VAL_minus_1; + info->predictPicAvgBit = 0; + info->bitrateChange = 0; + info->bitreset_cnt = 0; +} + +void cviRcKernel_estimatePic(stRcKernelInfo *info, stRcKernelPicOut *out, int isIPic, int picIdx) +{ + int qp = info->firstFrmstartQp; + int avgGopQp = qp; // for I frame, Refer to the qp average of the previous P frames + int picTargetBit; + RC_Float lambda; + int targetBitByModel; + + CVI_VCOM_TRACE("isIPic = %d, intraPeriod = %d, isLastPicI = %d, rcGopSize = %d\n", + isIPic, info->intraPeriod, info->isLastPicI, info->rcGopSize); + info->isCurPicI = isIPic; + if ((isIPic && info->intraPeriod != 1) || info->isFirstPic == 1) { + if (info->isFirstPic == 0) { + avgGopQp = getAvgPFrameQp(info); + } + picTargetBit = rcIPicBitAlloc(info, avgGopQp); + } else { + if ((info->isLastPicI == 1) || + (picIdx % info->rcGopSize == 1) || + (info->rcGopSize == 1)) { + rcGopBitAlloc(info, picIdx); + } + + // realloc gopBitLeft when targetbit change + if (info->bitrateChange == 1) { + rcGopBitReAlloc(info, picIdx); + } + picTargetBit = estPicTargetBits(info); + } + + lambda = estPicLambda(info, picTargetBit, isIPic, picIdx); + if (info->isFirstPic != 1 || info->intraPeriod == 1) { + qp = estPicQP(info, lambda, isIPic, picIdx); + } + + if (isIPic && avgGopQp > 0) { + qp = (avgGopQp + qp + 1) / 2; + } + + if (info->bitreset_cnt) { + int maxQp = (info->isCurPicI) ? info->maxIQp : info->maxQp; + int minQp = (info->isCurPicI) ? info->minIQp : info->minQp; + + qp -= info->bitreset_cnt; + qp = CLIP(minQp, maxQp, qp); + } + + if (isIPic == 0 && CVI_FLOAT_GT(info->avgGopLambda, FLOAT_VAL_0)) { + lambda = CVI_FLOAT_DIV(CVI_FLOAT_ADD(info->avgGopLambda, lambda), FLOAT_VAL_2); + } + + if ((info->isLastPicI == 1) && (info->rcGopSize > 1)) { + info->avgGopLambda = lambda; + } + + if (vcom_mask & CVI_VCOM_MASK_DBG) { + CVI_VCOM_FLOAT("picTargetBit = %d, lambda = %f, qp = %d\n", + picTargetBit, getFloat(lambda), qp); + } + + // re-allocate picture target bitrate + targetBitByModel = estPicBitByModel(info, lambda, isIPic); + info->picTargetBit = (picTargetBit + targetBitByModel) / 2; + + // clip I frame size + if (isIPic) { + info->picTargetBit = CLIP(info->minIPicBit, info->maxIPicBit, picTargetBit); + } + + // output parameters + out->targetBit = info->picTargetBit; + out->qp = qp; + out->lambda = lambda; + + CVI_VCOM_CVRC("frameIdx = %d, qp = %d, targetBit = %d, lambda = %d\n" + , picIdx, out->qp, out->targetBit + , CVI_FLOAT_TO_INT(CVI_FLOAT_MUL((out->lambda), INT_TO_CVI_FLOAT(1000)))); +} + +void cviRcKernel_updatePic(stRcKernelInfo *info, stRcKernelPicIn *stats, int isIPic) +{ + int picLv; + int skipUpdateCoeff = 0; + RC_Float alpha, beta; + RC_Float tmp; + + if (CVI_FLOAT_LE(stats->encodedLambda, FLOAT_VAL_0)) { + info->lastPicLambda = QpToLambda(stats->encodedQp); + } else { + info->lastPicLambda = stats->encodedLambda; + } + info->lastPicQp = CVI_FLOAT_TO_INT(stats->encodedQp); + + if (vcom_mask & CVI_VCOM_MASK_DBG) { + CVI_VCOM_FLOAT("isIPic = %d, encodedQp = %f, encodeLambda = %f\n", + isIPic, getFloat(stats->encodedQp), getFloat(info->lastPicLambda)); + } + + CVI_VCOM_CVRC("isIPic = %d, encodedQp = %d, encodebit = %d, encodePicLambda = %d, madi = %d\n" + , isIPic, CVI_FLOAT_TO_INT(CVI_FLOAT_MUL((stats->encodedQp), INT_TO_CVI_FLOAT(1000))) + , stats->encodedBit + , CVI_FLOAT_TO_INT(CVI_FLOAT_MUL((info->lastPicLambda), INT_TO_CVI_FLOAT(1000))) + , CVI_FLOAT_TO_INT(CVI_FLOAT_MUL((stats->madi), INT_TO_CVI_FLOAT(1000)))); + + // update bitrate status + // 1. skip the first frame + // 2. independent stat for I/P frame bitrate in Gop + // 3. after encode I frame, recalculate the PicAvgBit for remain P frame of the current GOP + // cahce labmda for first P frame in current GOP + picLv = isIPic == 0; + if (isIPic == 1) { + info->avgGopLambda = FLOAT_VAL_minus_1; + info->predictPicAvgBit = CVI_FLOAT_TO_INT( + CVI_FLOAT_DIV( + INT_TO_CVI_FLOAT(info->targetBitrate * info->statTime - stats->encodedBit), + INT_TO_CVI_FLOAT(info->statFrameNum - 1))); + } else if (isIPic == 0) { + info->bitError = CLIP(-MAX_BIT_ERROR, + MAX_BIT_ERROR, info->bitError + info->predictPicAvgBit - stats->encodedBit); + } + + info->gopBitLeft -= stats->encodedBit; + info->gopPicLeft -= 1; + + CVI_VCOM_FLOAT("isIPic = %d, rcMdlUpdatType = %d, skipRatio = %f\n", + isIPic, info->rcMdlUpdatType, getFloat(stats->skipRatio)); + + if (isIPic == 0 && stats->skipRatio == FLOAT_VAL_minus_1) { + goto MDL_PARAM_UPDATE_END; + } + + // when encode bit is much smaller than target bit, don't update alpha and beta + if (isIPic == 0 && info->picTargetBit >= 5*stats->encodedBit) { + skipUpdateCoeff = 1; + } + + // update model parameters + alpha = info->rqModel[picLv].alpha; + beta = info->rqModel[picLv].beta; + + if (isIPic == 1) { + updateAlphaBetaIntra(&alpha, &beta, info->picTextCplx, info->picTargetBit, stats->encodedBit); + } else if (info->rcMdlUpdatType == 0 && skipUpdateCoeff == 0) { + RC_Float calLambda; + RC_Float inputLambda; + RC_Float logLambdaDiff, alpha_incr, lnbpp, beta_incr; + RC_Float picActualBpp; + unsigned long long targetBits64; + int bpp32; + + targetBits64 = ((unsigned long long)stats->encodedBit << FIX_POINT_FRAC_BIT); + do_div(targetBits64, info->numOfPixel); + bpp32 = (int) targetBits64; + picActualBpp = FRAC_INT_TO_CVI_FLOAT(bpp32, FIX_POINT_FRAC_BIT); + // LMS algorithm + calLambda = CVI_FLOAT_MUL(alpha, CVI_FLOAT_POW(picActualBpp, beta)); + + tmp = calLambda; + + inputLambda = info->lastPicLambda; + + calLambda = CVI_FLOAT_CLIP( + CVI_FLOAT_DIV(inputLambda, FLOAT_VAL_10), + CVI_FLOAT_MUL(inputLambda, FLOAT_VAL_10), + calLambda); + + if (tmp != calLambda) { + CVI_VCOM_FLOAT("clip calLambda = %f\n", getFloat(calLambda)); + } + + logLambdaDiff = CVI_FLOAT_SUB(CVI_FLOAT_LOG(inputLambda), CVI_FLOAT_LOG(calLambda)); + alpha_incr = CVI_FLOAT_MUL(CVI_FLOAT_MUL(info->alphaStep, logLambdaDiff), alpha); + alpha = CVI_FLOAT_ADD(alpha, alpha_incr); + lnbpp = CVI_FLOAT_LOG(picActualBpp); + lnbpp = CVI_FLOAT_CLIP(FLOAT_VAL_minus_5, FLOAT_VAL_minus_p01, lnbpp); + beta_incr = CVI_FLOAT_MUL(CVI_FLOAT_MUL(info->betaStep, logLambdaDiff), lnbpp); + beta = CVI_FLOAT_ADD(beta, beta_incr); + + CVI_VCOM_FLOAT("picLv = %d, logLambdaDiff = %f, alpha_incr = %f, beta_incr = %f\n", + picLv, getFloat(logLambdaDiff), getFloat(alpha_incr), getFloat(beta_incr)); + + tmp = alpha; + alpha = CVI_FLOAT_CLIP(g_rcAlphaMinValue, g_rcAlphaMaxValue, alpha); + if (tmp != alpha) { + CVI_VCOM_FLOAT("clip alpha = %f\n", getFloat(alpha)); + } + + tmp = beta; + beta = CVI_FLOAT_CLIP(g_rcBetaMinValue, g_rcBetaMaxValue, beta); + if (tmp != beta) { + CVI_VCOM_FLOAT("clip beta = %f\n", getFloat(beta)); + } + } else { // RD function analytics +#ifdef UNUSED_CODE + RC_Float picActualBpp = + FRAC_INT_TO_CVI_FLOAT(((long long int)stats->encodedBit<numOfPixel, FIX_POINT_FRAC_BIT); + RC_Float updatedK = CVI_FLOAT_DIV(CVI_FLOAT_MUL(picActualBpp, info->lastPicLambda), stats->mse); + RC_Float updatedC = CVI_FLOAT_DIV(stats->mse, CVI_FLOAT_POW(picActualBpp, -updatedK)); + RC_Float updateScale = CVI_FLOAT_CLIP(FLOAT_VAL_p1, + FLOAT_VAL_p9, + CVI_FLOAT_SUB(FLOAT_VAL_1, stats->skipRatio)); + RC_Float newAlpha = CVI_FLOAT_MUL(updatedC, updatedK); + RC_Float newBeta = CVI_FLOAT_SUB(FLOAT_VAL_0, CVI_FLOAT_ADD(updatedK, FLOAT_VAL_1)); + RC_Float oneMinusUpdateScale = CVI_FLOAT_SUB(FLOAT_VAL_1, updateScale); + RC_Float updateAlpha = CVI_FLOAT_ADD(CVI_FLOAT_MUL(updateScale, newAlpha), + CVI_FLOAT_MUL(oneMinusUpdateScale, alpha)); + RC_Float updateBeta = CVI_FLOAT_ADD(CVI_FLOAT_MUL(updateScale, newBeta), + CVI_FLOAT_MUL(oneMinusUpdateScale, beta)); +#endif + alpha = CVI_FLOAT_CLIP(g_rcAlphaMinValue, g_rcAlphaMaxValue, alpha); + beta = CVI_FLOAT_CLIP(g_rcBetaMinValue, g_rcBetaMaxValue, beta); + } + + info->rqModel[picLv].alpha = alpha; + info->rqModel[picLv].beta = beta; + info->lastLevelLambda[picLv] = info->lastPicLambda; + info->lastLevelQp[picLv] = info->lastPicQp; + if (isIPic == 0) { + info->pPicQpAccum = CVI_FLOAT_ADD(info->pPicQpAccum, stats->encodedQp); + info->pPicCnt += 1; + } + +MDL_PARAM_UPDATE_END: + if (isIPic == 1) { + info->lastIPicBit = stats->encodedBit; + info->pPicQpAccum = 0; + info->pPicCnt = 0; + } + + info->isLastPicI = info->isCurPicI; + info->isFirstPic = 0; + // texture complexity for I frame model + cviRcKernel_setTextCplx(info, stats->madi); +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_rc_kernel.h b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_rc_kernel.h new file mode 100644 index 0000000000..23d41726bf --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/common/rcKernel/cvi_rc_kernel.h @@ -0,0 +1,235 @@ +#ifndef __CVI_RC_KERNEL_H__ +#define __CVI_RC_KERNEL_H__ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "cvi_float_point/cvi_float_point.h" + +#ifdef MAX +#undef MAX +#endif +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) + +#ifdef MIN +#undef MIN +#endif +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +#ifdef CLIP +#undef CLIP +#endif +#define CLIP(min, max, v) (MIN((MAX(min, v)), max)) + +#define MAX_T_LAYER 2 +#define MAX_BIT_ERROR (1<<28) + +// floating point format abstraction +typedef float32 RC_Float; + +// float point constant abstraction +#if SOFT_FLOAT +// generated by script +#define FLOAT_VAL_minus_1p367 (0xbfaef9db) +#define FLOAT_VAL_256 (0x43800000) +#define FLOAT_VAL_p005 (0x3ba3d70a) +#define FLOAT_VAL_1p2517 (0x3fa037b5) +#define FLOAT_VAL_13p7122 (0x415b652c) +#define FLOAT_VAL_p025 (0x3ccccccd) +#define FLOAT_VAL_p125 (0x3e000000) +#define FLOAT_VAL_0 (0x0) +#define FLOAT_VAL_p25 (0x3e800000) +#define FLOAT_VAL_2 (0x40000000) +#define FLOAT_VAL_3 (0x40400000) +#define FLOAT_VAL_p08 (0x3da3d70a) +#define FLOAT_VAL_minus_3 (0xc0400000) +#define FLOAT_VAL_1p786 (0x3fe49ba6) +#define FLOAT_VAL_minus_1 (0xbf800000) +#define FLOAT_VAL_p05 (0x3d4ccccd) +#define FLOAT_VAL_minus_p125 (0xbe000000) +#define FLOAT_VAL_p03 (0x3cf5c28f) +#define FLOAT_VAL_minus_5 (0xc0a00000) +#define FLOAT_VAL_p01 (0x3c23d70a) +#define FLOAT_VAL_1000 (0x447a0000) +#define FLOAT_VAL_p9 (0x3f666666) +#define FLOAT_VAL_6p7542 (0x40d82268) +#define FLOAT_VAL_1 (0x3f800000) +#define FLOAT_VAL_minus_p01 (0xbc23d70a) +#define FLOAT_VAL_p4 (0x3ecccccd) +#define FLOAT_VAL_p1 (0x3dcccccd) +#define FLOAT_VAL_4p2005 (0x40866a7f) +#define FLOAT_VAL_3p2003 (0x404cd1b7) +#define FLOAT_VAL_p2 (0x3e4ccccd) +#define FLOAT_VAL_12 (0x41400000) +#define FLOAT_VAL_p5 (0x3f000000) +#define FLOAT_VAL_10 (0x41200000) +#define FLOAT_VAL_minus_p8 (0xbf4ccccd) +#define FLOAT_VAL_10000 (0x461c4000) +#define FLOAT_VAL_p00024 (0x397ba882) +#define FLOAT_VAL_2000 (0x44fa0000) +#else +#define FLOAT_VAL_minus_5 (-5.0) +#define FLOAT_VAL_minus_3 (-3.0) +#define FLOAT_VAL_minus_1 (-1.0) +#define FLOAT_VAL_minus_p8 (-0.8) +#define FLOAT_VAL_minus_p125 (-0.125) +#define FLOAT_VAL_minus_p01 (-0.01) +#define FLOAT_VAL_0 (0.) +#define FLOAT_VAL_p005 (0.005) +#define FLOAT_VAL_p01 (0.01) +#define FLOAT_VAL_p025 (0.025) +#define FLOAT_VAL_p03 (0.03) +#define FLOAT_VAL_p05 (0.05) +#define FLOAT_VAL_p08 (0.08) +#define FLOAT_VAL_p1 (0.1) +#define FLOAT_VAL_p125 (0.125) +#define FLOAT_VAL_p2 (0.2) +#define FLOAT_VAL_p25 (0.25) +#define FLOAT_VAL_p4 (0.4) +#define FLOAT_VAL_p5 (0.5) +#define FLOAT_VAL_p9 (0.9) +#define FLOAT_VAL_1 (1.0) +#define FLOAT_VAL_2 (2.0) +#define FLOAT_VAL_3 (3.0) +#define FLOAT_VAL_10 (10.0) +#define FLOAT_VAL_12 (12.0) +#define FLOAT_VAL_256 (256.0) +#define FLOAT_VAL_2000 (2000.0) +#define FLOAT_VAL_1000 (1000.0) +#define FLOAT_VAL_10000 (10000.0) + +#define FLOAT_VAL_minus_1p367 (-1.367) +#define FLOAT_VAL_p00024 (0.00024) +#define FLOAT_VAL_1p2517 (1.2517) +#define FLOAT_VAL_1p786 (1.786) +#define FLOAT_VAL_3p2003 (3.2003) +#define FLOAT_VAL_4p2005 (4.2005) +#define FLOAT_VAL_6p7542 (6.7542) +#define FLOAT_VAL_13p7122 (13.7122) +#endif + +#define FIX_POINT_FRAC_BIT (24) + +typedef struct _stRcKernelCfg_ { + int targetBitrate; + int codec; + RC_Float framerate; + int intraPeriod; + int statTime; + int ipQpDelta; + int numOfPixel; + int maxIprop; + int minIprop; + int maxQp; + int minQp; + int maxIQp; + int minIQp; + int firstFrmstartQp; + int rcMdlUpdatType; +} stRcKernelCfg; + +typedef struct _stRcKernelPicOut_ { + int targetBit; + int qp; + RC_Float lambda; +} stRcKernelPicOut; + +typedef struct _stRcKernelPicIn_ { + int encodedBit; + RC_Float encodedQp; + RC_Float encodedLambda; + RC_Float madi; + RC_Float mse; + RC_Float skipRatio; +} stRcKernelPicIn; + +typedef struct _stRLModel_ { + RC_Float alpha; + RC_Float beta; +} stRLModel; + +typedef struct _stRcKernelInfo_ { + int targetBitrate; + int codec; + int framerate; + int intraPeriod; + int statTime; + int picAvgBit; + int numOfPixel; + int rcGopSize; + int statFrameNum; + int maxIPicBit; + int maxPicBit; + int minPicBit; + int minIPicBit; + int ipQpDelta; + int maxIprop; + int minIprop; + int rcMdlUpdatType; + int levelPicQpClip; + int lastPicQpClip; + int picQpNormalClip; + stRLModel rqModel[MAX_T_LAYER]; + // 0: I frame, 1: temporal base layer + // 2: temporal sencond layer, 2: temporal third layer + RC_Float alphaStep; + RC_Float betaStep; + RC_Float picTextCplx; + RC_Float lastLevelLambda[MAX_T_LAYER]; + RC_Float lastPicLambda; + RC_Float maxLambda; + RC_Float minLambda; + RC_Float maxILambda; + RC_Float minILambda; + RC_Float lastLevelLambdaScaleLow; + RC_Float lastLevelLambdaScaleHigh; + RC_Float lastPicLambdaScaleLow; + RC_Float lastPicLambdaScaleHigh; + RC_Float lastNormalLambdaScaleLow; + RC_Float lastNormalLambdaScaleHigh; + int lastLevelQp[MAX_T_LAYER]; + int lastPicQp; + int neiIBitMargin; + int gopPicAvgBit; + int gopBitLeft; + int gopPicLeft; + int picTargetBit; + int bitError; + int bitreset_cnt; + int lastIPicBit; + int maxQp; + int minQp; + int maxIQp; + int minIQp; + int firstFrmstartQp; + int isFirstPic; + int isCurPicI; + int isLastPicI; + RC_Float pPicQpAccum; + int pPicCnt; + RC_Float avgGopLambda; + int predictPicAvgBit; + int bitrateChange; +} stRcKernelInfo; + +void cviRcKernel_init(stRcKernelInfo *info, stRcKernelCfg *cfg); +void cviRcKernel_estimatePic(stRcKernelInfo *info, stRcKernelPicOut *out, int isIPic, int picIdx); +void cviRcKernel_updatePic(stRcKernelInfo *info, stRcKernelPicIn *stats, int isIPic); +void cviRcKernel_setTextCplx(stRcKernelInfo *info, RC_Float madi); +void cviRcKernel_setBitrateAndFrameRate(stRcKernelInfo *info, int targetBitrate, RC_Float frameRate); +void cviRcKernel_setMinMaxQp(stRcKernelInfo *info, int minQp, int maxQp, int isIntra); +void cviRcKernel_setLastPicQpClip(stRcKernelInfo *info, int lastPicQpClip); +void cviRcKernel_setLevelPicQpClip(stRcKernelInfo *info, int levelPicQpClip); +void cviRcKernel_setpPicQpNormalClip(stRcKernelInfo *info, int picQpNormalClip); +void cviRcKernel_setRCModelParam(stRcKernelInfo *info, RC_Float alpha, RC_Float beta, int model_idx); +void cviRcKernel_setRCModelUpdateStep(stRcKernelInfo *info, RC_Float alphaStep, RC_Float betaStep); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + + + diff --git a/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv.c b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv.c new file mode 100644 index 0000000000..46bf0c37ec --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv.c @@ -0,0 +1,1824 @@ +#include +#include +#include +#include + +#include "cvi_vc_drv.h" +#include "cvi_vc_drv_proc.h" +#include "vcodec_cb.h" +#include "vdi_osal.h" + +extern int VPU_IsBusy(unsigned int coreIdx); + +static const struct of_device_id cvi_vc_drv_match_table[] = { + { .compatible = "cvitek,cvi_vc_drv" }, + {}, +}; +MODULE_DEVICE_TABLE(of, cvi_vc_drv_match_table); + +extern wait_queue_head_t tWaitQueue[]; + +uint32_t MaxVencChnNum = VENC_MAX_CHN_NUM; +module_param(MaxVencChnNum, uint, 0644); +#ifdef ENABLE_DEC +uint32_t MaxVdecChnNum = VDEC_MAX_CHN_NUM; +module_param(MaxVdecChnNum, uint, 0644); +#endif +bool cviRcEn = 1; +module_param(cviRcEn, bool, 0644); + +static struct semaphore vencSemArry[VENC_MAX_CHN_NUM]; +#ifdef ENABLE_DEC +static struct semaphore vdecSemArry[VDEC_MAX_CHN_NUM]; +#endif +struct cvi_vc_drv_device *pCviVcDrvDevice; + +struct clk_ctrl_info { + int core_idx; + int enable; +}; +#ifdef VC_DRIVER_TEST +extern int h265_dec_test(u_long arg); +extern int h264_dec_test(u_long arg); +extern int cvi_venc_test(u_long arg); +extern int cvi_jpeg_test(u_long arg); +#endif +static int cvi_vc_drv_open(struct inode *inode, struct file *filp); +static long cvi_vc_drv_venc_ioctl(struct file *filp, u_int cmd, u_long arg); +#ifdef ENABLE_DEC +static long cvi_vc_drv_vdec_ioctl(struct file *filp, u_int cmd, u_long arg); +#endif +static int cvi_vc_drv_release(struct inode *inode, struct file *filp); +static unsigned int cvi_vc_drv_poll(struct file *filp, + struct poll_table_struct *wait); + +extern unsigned long vpu_get_interrupt_reason(int coreIdx); +extern unsigned long jpu_get_interrupt_flag(int chnIdx); + +const struct file_operations cvi_vc_drv_venc_fops = { + .owner = THIS_MODULE, + .open = cvi_vc_drv_open, + .unlocked_ioctl = cvi_vc_drv_venc_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = cvi_vc_drv_venc_ioctl, +#endif + .release = cvi_vc_drv_release, + .poll = cvi_vc_drv_poll, +}; +#ifdef ENABLE_DEC +const struct file_operations cvi_vc_drv_vdec_fops = { + .owner = THIS_MODULE, + .open = cvi_vc_drv_open, + .unlocked_ioctl = cvi_vc_drv_vdec_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = cvi_vc_drv_vdec_ioctl, +#endif + .release = cvi_vc_drv_release, +}; +#endif +static int cvi_vc_drv_open(struct inode *inode, struct file *filp) +{ + unsigned int minor = iminor(inode); + + pr_info("open channel no. %u\n", minor); + + return 0; +} + +static long cvi_vc_drv_venc_ioctl(struct file *filp, u_int cmd, u_long arg) +{ + unsigned int minor = iminor(file_inode(filp)); + CVI_S32 s32Ret = CVI_FAILURE; + + if (down_interruptible(&vencSemArry[minor])) { + return s32Ret; + } + + switch (cmd) { + case CVI_VC_VENC_CREATE_CHN: { + VENC_CHN_ATTR_S stChnAttr; + + if (copy_from_user(&stChnAttr, (VENC_CHN_ATTR_S *)arg, + sizeof(VENC_CHN_ATTR_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_CreateChn(minor, &stChnAttr); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_CreateChn with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_DESTROY_CHN: { + s32Ret = CVI_VENC_DestroyChn(minor); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_DestroyChn with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_RESET_CHN: { + s32Ret = CVI_VENC_ResetChn(minor); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_ResetChn with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_START_RECV_FRAME: { + VENC_RECV_PIC_PARAM_S stRecvParam; + + if (copy_from_user(&stRecvParam, (VENC_RECV_PIC_PARAM_S *)arg, + sizeof(VENC_RECV_PIC_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_StartRecvFrame(minor, &stRecvParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_StartRecvFrame with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_STOP_RECV_FRAME: { + s32Ret = CVI_VENC_StopRecvFrame(minor); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_StopRecvFrame with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_QUERY_STATUS: { + VENC_CHN_STATUS_S stStatus; + + if (copy_from_user(&stStatus, (VENC_CHN_STATUS_S *)arg, + sizeof(VENC_CHN_STATUS_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_QueryStatus(minor, &stStatus); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_QueryStatus with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_CHN_STATUS_S *)arg, &stStatus, + sizeof(VENC_CHN_STATUS_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_CHN_ATTR: { + VENC_CHN_ATTR_S stChnAttr; + + if (copy_from_user(&stChnAttr, (VENC_CHN_ATTR_S *)arg, + sizeof(VENC_CHN_ATTR_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetChnAttr(minor, &stChnAttr); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetChnAttr with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_CHN_ATTR: { + VENC_CHN_ATTR_S stChnAttr; + + s32Ret = CVI_VENC_GetChnAttr(minor, &stChnAttr); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetChnAttr with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_CHN_ATTR_S *)arg, &stChnAttr, + sizeof(VENC_CHN_ATTR_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_GET_STREAM: { + VENC_STREAM_EX_S stStreamEx; +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + VENC_STREAM_S stStream; + VENC_PACK_S *pUserPack; // keep user space pointer on packs +#endif + + if (copy_from_user(&stStreamEx, (VENC_STREAM_EX_S *)arg, + sizeof(VENC_STREAM_EX_S)) != 0) { + break; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (copy_from_user(&stStream, stStreamEx.pstStream, + sizeof(VENC_STREAM_S)) != 0) { + break; + } + + // stStream.pstPack will be replaced by kernel space packs + // in CVI_VENC_GetStream + pUserPack = stStream.pstPack; + stStream.pstPack = NULL; + s32Ret = CVI_VENC_GetStream(minor, &stStream, + stStreamEx.s32MilliSec); +#else + s32Ret = CVI_VENC_GetStream(minor, stStreamEx.pstStream, + stStreamEx.s32MilliSec); +#endif + + if (s32Ret != CVI_SUCCESS) { +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (stStream.pstPack) { + vfree(stStream.pstPack); + stStream.pstPack = NULL; + } +#endif + break; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + // copy kernel space packs to user space + if (stStream.pstPack) { + if (copy_to_user(pUserPack, stStream.pstPack, + sizeof(VENC_PACK_S) * + stStream.u32PackCount) != 0) { + + if (stStream.pstPack) { + vfree(stStream.pstPack); + stStream.pstPack = NULL; + } + + s32Ret = CVI_FAILURE; + break; + } + + if (stStream.pstPack) { + vfree(stStream.pstPack); + stStream.pstPack = NULL; + } + } + + // restore user space pointer + stStream.pstPack = pUserPack; + if (copy_to_user(stStreamEx.pstStream, &stStream, + sizeof(VENC_STREAM_S)) != 0) { + s32Ret = CVI_FAILURE; + break; + } +#endif + + if (copy_to_user((VENC_STREAM_EX_S *)arg, &stStreamEx, + sizeof(VENC_STREAM_EX_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_RELEASE_STREAM: { + VENC_STREAM_S stStream; + + if (copy_from_user(&stStream, (VENC_STREAM_S *)arg, + sizeof(VENC_STREAM_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_ReleaseStream(minor, &stStream); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_ReleaseStream with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_INSERT_USERDATA: { + VENC_USER_DATA_S stUserData; +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + __u8 *pUserData = NULL; +#endif + + if (copy_from_user(&stUserData, (VENC_USER_DATA_S *)arg, + sizeof(VENC_USER_DATA_S)) != 0) { + break; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + pUserData = vmalloc(stUserData.u32Len); + if (pUserData == NULL) { + s32Ret = CVI_ERR_VENC_NOMEM; + break; + } + + if (copy_from_user(pUserData, stUserData.pu8Data, + stUserData.u32Len) != 0) { + vfree(pUserData); + break; + } + + stUserData.pu8Data = pUserData; +#endif + + s32Ret = CVI_VENC_InsertUserData(minor, stUserData.pu8Data, + stUserData.u32Len); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_InsertUserData with %d\n", s32Ret); + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (pUserData) + vfree(pUserData); +#endif + } break; + case CVI_VC_VENC_SEND_FRAME: { + VIDEO_FRAME_INFO_EX_S stFrameEx; +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + VIDEO_FRAME_INFO_S stFrame; +#endif + + if (copy_from_user(&stFrameEx, (VIDEO_FRAME_INFO_EX_S *)arg, + sizeof(VIDEO_FRAME_INFO_EX_S)) != 0) { + break; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (copy_from_user(&stFrame, stFrameEx.pstFrame, + sizeof(VIDEO_FRAME_INFO_S)) != 0) { + break; + } + stFrameEx.pstFrame = &stFrame; +#endif + + s32Ret = CVI_VENC_SendFrame(minor, stFrameEx.pstFrame, + stFrameEx.s32MilliSec); + } break; + case CVI_VC_VENC_SEND_FRAMEEX: { + USER_FRAME_INFO_EX_S stUserFrameEx; +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + USER_FRAME_INFO_S stUserFrameInfo; + CVI_S32 w, h; + __u8 *pu8QpMap = NULL; +#endif + + if (copy_from_user(&stUserFrameEx, (USER_FRAME_INFO_EX_S *)arg, + sizeof(USER_FRAME_INFO_EX_S)) != 0) { + break; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (copy_from_user(&stUserFrameInfo, stUserFrameEx.pstUserFrame, + sizeof(USER_FRAME_INFO_S)) != 0) { + break; + } + stUserFrameEx.pstUserFrame = &stUserFrameInfo; + + w = (((stUserFrameInfo.stUserFrame.stVFrame.u32Width + 63) & ~63) >> 6); + h = (((stUserFrameInfo.stUserFrame.stVFrame.u32Height + 63) & ~63) >> 6); + pu8QpMap = vmalloc(w * h); + if (pu8QpMap == NULL) { + s32Ret = CVI_ERR_VENC_NOMEM; + break; + } + + if (copy_from_user(pu8QpMap, (__u8 *)stUserFrameInfo.stUserRcInfo.u64QpMapPhyAddr, + w * h) != 0) { + vfree(pu8QpMap); + break; + } + stUserFrameInfo.stUserRcInfo.u64QpMapPhyAddr = (__u64)pu8QpMap; +#endif + + s32Ret = CVI_VENC_SendFrameEx(minor, stUserFrameEx.pstUserFrame, + stUserFrameEx.s32MilliSec); + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (pu8QpMap) + vfree(pu8QpMap); +#endif + } break; + case CVI_VC_VENC_REQUEST_IDR: { + CVI_BOOL bInstant; + + if (copy_from_user(&bInstant, (CVI_BOOL *)arg, + sizeof(CVI_BOOL)) != 0) { + break; + } + + s32Ret = CVI_VENC_RequestIDR(minor, bInstant); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_RequestIDR with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_SET_ROI_ATTR: { + VENC_ROI_ATTR_S stRoiAttr; + + if (copy_from_user(&stRoiAttr, (VENC_ROI_ATTR_S *)arg, + sizeof(VENC_ROI_ATTR_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetRoiAttr(minor, &stRoiAttr); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetRoiAttr with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_ROI_ATTR: { + VENC_ROI_ATTR_S stRoiAttr; + + if (copy_from_user(&stRoiAttr, (VENC_ROI_ATTR_S *)arg, + sizeof(VENC_ROI_ATTR_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_GetRoiAttr(minor, stRoiAttr.u32Index, + &stRoiAttr); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetRoiAttr with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_ROI_ATTR_S *)arg, &stRoiAttr, + sizeof(VENC_ROI_ATTR_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H264_TRANS: { + VENC_H264_TRANS_S stH264Trans; + + if (copy_from_user(&stH264Trans, (VENC_H264_TRANS_S *)arg, + sizeof(VENC_H264_TRANS_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH264Trans(minor, &stH264Trans); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetH264Trans with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_H264_TRANS: { + VENC_H264_TRANS_S stH264Trans; + + s32Ret = CVI_VENC_GetH264Trans(minor, &stH264Trans); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH264Trans with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H264_TRANS_S *)arg, &stH264Trans, + sizeof(VENC_H264_TRANS_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H264_ENTROPY: { + VENC_H264_ENTROPY_S stH264EntropyEnc; + + if (copy_from_user(&stH264EntropyEnc, + (VENC_H264_ENTROPY_S *)arg, + sizeof(VENC_H264_ENTROPY_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH264Entropy(minor, &stH264EntropyEnc); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetH264Entropy with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_H264_ENTROPY: { + VENC_H264_ENTROPY_S stH264EntropyEnc; + + s32Ret = CVI_VENC_GetH264Entropy(minor, &stH264EntropyEnc); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH264Entropy with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H264_ENTROPY_S *)arg, &stH264EntropyEnc, + sizeof(VENC_H264_ENTROPY_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H264_VUI: { + VENC_H264_VUI_S stH264Vui; + + if (copy_from_user(&stH264Vui, (VENC_H264_VUI_S *)arg, + sizeof(VENC_H264_VUI_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH264Vui(minor, &stH264Vui); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetH264Vui with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_H264_VUI: { + VENC_H264_VUI_S stH264Vui; + + s32Ret = CVI_VENC_GetH264Vui(minor, &stH264Vui); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH264Vui with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H264_VUI_S *)arg, &stH264Vui, + sizeof(VENC_H264_VUI_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H265_VUI: { + VENC_H265_VUI_S stH265Vui; + + if (copy_from_user(&stH265Vui, (VENC_H265_VUI_S *)arg, + sizeof(VENC_H265_VUI_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH265Vui(minor, &stH265Vui); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetH265Vui with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_H265_VUI: { + VENC_H265_VUI_S stH265Vui; + + s32Ret = CVI_VENC_GetH265Vui(minor, &stH265Vui); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH265Vui with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H265_VUI_S *)arg, &stH265Vui, + sizeof(VENC_H265_VUI_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_JPEG_PARAM: { + VENC_JPEG_PARAM_S stJpegParam; + + if (copy_from_user(&stJpegParam, (VENC_JPEG_PARAM_S *)arg, + sizeof(VENC_JPEG_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetJpegParam(minor, &stJpegParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetJpegParam with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_JPEG_PARAM: { + VENC_JPEG_PARAM_S stJpegParam; + + s32Ret = CVI_VENC_GetJpegParam(minor, &stJpegParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetJpegParam with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_JPEG_PARAM_S *)arg, &stJpegParam, + sizeof(VENC_JPEG_PARAM_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_GET_RC_PARAM: { + VENC_RC_PARAM_S stRcParam; + + s32Ret = CVI_VENC_GetRcParam(minor, &stRcParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetRcParam with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_RC_PARAM_S *)arg, &stRcParam, + sizeof(VENC_RC_PARAM_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_RC_PARAM: { + VENC_RC_PARAM_S stRcParam; + + if (copy_from_user(&stRcParam, (VENC_RC_PARAM_S *)arg, + sizeof(VENC_RC_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetRcParam(minor, &stRcParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetRcParam with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_SET_REF_PARAM: { + VENC_REF_PARAM_S stRefParam; + + if (copy_from_user(&stRefParam, (VENC_REF_PARAM_S *)arg, + sizeof(VENC_REF_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetRefParam(minor, &stRefParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetRefParam with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_REF_PARAM: { + VENC_REF_PARAM_S stRefParam; + + s32Ret = CVI_VENC_GetRefParam(minor, &stRefParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetRefParam with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_REF_PARAM_S *)arg, &stRefParam, + sizeof(VENC_REF_PARAM_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H265_TRANS: { + VENC_H265_TRANS_S stH265Trans; + + if (copy_from_user(&stH265Trans, (VENC_H265_TRANS_S *)arg, + sizeof(VENC_H265_TRANS_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH265Trans(minor, &stH265Trans); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetH265Trans with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_H265_TRANS: { + VENC_H265_TRANS_S stH265Trans; + + s32Ret = CVI_VENC_GetH265Trans(minor, &stH265Trans); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH265Trans with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H265_TRANS_S *)arg, &stH265Trans, + sizeof(VENC_H265_TRANS_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_FRAMELOST_STRATEGY: { + VENC_FRAMELOST_S stFrmLostParam; + + if (copy_from_user(&stFrmLostParam, (VENC_FRAMELOST_S *)arg, + sizeof(VENC_FRAMELOST_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetFrameLostStrategy(minor, &stFrmLostParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetFrameLostStrategy with %d\n", + s32Ret); + } + } break; + case CVI_VC_VENC_GET_FRAMELOST_STRATEGY: { + VENC_FRAMELOST_S stFrmLostParam; + + s32Ret = CVI_VENC_GetFrameLostStrategy(minor, &stFrmLostParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetFrameLostStrategy with %d\n", + s32Ret); + break; + } + + if (copy_to_user((VENC_FRAMELOST_S *)arg, &stFrmLostParam, + sizeof(VENC_FRAMELOST_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_SUPERFRAME_STRATEGY: { + VENC_SUPERFRAME_CFG_S stSuperFrmParam; + + if (copy_from_user(&stSuperFrmParam, + (VENC_SUPERFRAME_CFG_S *)arg, + sizeof(VENC_SUPERFRAME_CFG_S)) != 0) { + break; + } + + s32Ret = + CVI_VENC_SetSuperFrameStrategy(minor, &stSuperFrmParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetSuperFrameStrategy with %d\n", + s32Ret); + } + } break; + case CVI_VC_VENC_GET_SUPERFRAME_STRATEGY: { + VENC_SUPERFRAME_CFG_S stSuperFrmParam; + + s32Ret = + CVI_VENC_GetSuperFrameStrategy(minor, &stSuperFrmParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetSuperFrameStrategy with %d\n", + s32Ret); + break; + } + + if (copy_to_user((VENC_SUPERFRAME_CFG_S *)arg, &stSuperFrmParam, + sizeof(VENC_SUPERFRAME_CFG_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_CHN_PARAM: { + VENC_CHN_PARAM_S stChnParam; + + if (copy_from_user(&stChnParam, (VENC_CHN_PARAM_S *)arg, + sizeof(VENC_CHN_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetChnParam(minor, &stChnParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetChnParam with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_CHN_PARAM: { + VENC_CHN_PARAM_S stChnParam; + + s32Ret = CVI_VENC_GetChnParam(minor, &stChnParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetChnParam with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_CHN_PARAM_S *)arg, &stChnParam, + sizeof(VENC_CHN_PARAM_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_MOD_PARAM: { + VENC_PARAM_MOD_S stModParam; + + if (copy_from_user(&stModParam, (VENC_PARAM_MOD_S *)arg, + sizeof(VENC_PARAM_MOD_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetModParam(&stModParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetModParam with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_MOD_PARAM: { + VENC_PARAM_MOD_S stModParam; + + if (copy_from_user(&stModParam, (VENC_PARAM_MOD_S *)arg, + sizeof(VENC_PARAM_MOD_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_GetModParam(&stModParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetModParam with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_PARAM_MOD_S *)arg, &stModParam, + sizeof(VENC_PARAM_MOD_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_ATTACH_VBPOOL: { + VENC_CHN_POOL_S stPool; + + if (copy_from_user(&stPool, (VENC_CHN_POOL_S *)arg, + sizeof(VENC_CHN_POOL_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_AttachVbPool(minor, &stPool); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_AttachVbPool with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_DETACH_VBPOOL: { + s32Ret = CVI_VENC_DetachVbPool(minor); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_DetachVbPool with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_SET_CUPREDICTION: { + VENC_CU_PREDICTION_S stCuPrediction; + + if (copy_from_user(&stCuPrediction, (VENC_CU_PREDICTION_S *)arg, + sizeof(VENC_CU_PREDICTION_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetCuPrediction(minor, &stCuPrediction); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetCuPrediction with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_CUPREDICTION: { + VENC_CU_PREDICTION_S stCuPrediction; + + s32Ret = CVI_VENC_GetCuPrediction(minor, &stCuPrediction); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetCuPrediction with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_CU_PREDICTION_S *)arg, &stCuPrediction, + sizeof(VENC_CU_PREDICTION_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_CALC_FRAME_PARAM: { + VENC_FRAME_PARAM_S stFrameParam; + + if (copy_from_user(&stFrameParam, (VENC_FRAME_PARAM_S *)arg, + sizeof(VENC_FRAME_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_CalcFrameParam(minor, &stFrameParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_CalcFrameParam with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_SET_FRAME_PARAM: { + VENC_FRAME_PARAM_S stFrameParam; + + if (copy_from_user(&stFrameParam, (VENC_FRAME_PARAM_S *)arg, + sizeof(VENC_FRAME_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetFrameParam(minor, &stFrameParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetFrameParam with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_FRAME_PARAM: { + VENC_FRAME_PARAM_S stFrameParam; + + s32Ret = CVI_VENC_GetFrameParam(minor, &stFrameParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetFrameParam with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_FRAME_PARAM_S *)arg, &stFrameParam, + sizeof(VENC_FRAME_PARAM_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H264_SLICE_SPLIT: { + VENC_H264_SLICE_SPLIT_S stH264Split; + + if (copy_from_user(&stH264Split, (VENC_H264_SLICE_SPLIT_S *)arg, + sizeof(VENC_H264_SLICE_SPLIT_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH264SliceSplit(minor, &stH264Split); + } break; + case CVI_VC_VENC_GET_H264_SLICE_SPLIT: { + VENC_H264_SLICE_SPLIT_S stH264Split; + + s32Ret = CVI_VENC_GetH264SliceSplit(minor, &stH264Split); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH264SliceSplit with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H264_SLICE_SPLIT_S *)arg, &stH264Split, + sizeof(VENC_H264_SLICE_SPLIT_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H265_SLICE_SPLIT: { + VENC_H265_SLICE_SPLIT_S stH265Split; + + if (copy_from_user(&stH265Split, (VENC_H265_SLICE_SPLIT_S *)arg, + sizeof(VENC_H265_SLICE_SPLIT_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH265SliceSplit(minor, &stH265Split); + } break; + case CVI_VC_VENC_GET_H265_SLICE_SPLIT: { + VENC_H265_SLICE_SPLIT_S stH265Split; + + s32Ret = CVI_VENC_GetH265SliceSplit(minor, &stH265Split); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH265SliceSplit with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H265_SLICE_SPLIT_S *)arg, &stH265Split, + sizeof(VENC_H265_SLICE_SPLIT_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H264_Dblk: { + VENC_H264_DBLK_S stH264dblk; + + if (copy_from_user(&stH264dblk, (VENC_H264_DBLK_S *)arg, + sizeof(VENC_H264_DBLK_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH264Dblk(minor, &stH264dblk); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetH264Dblk with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_H264_Dblk: { + VENC_H264_DBLK_S stH264dblk; + + s32Ret = CVI_VENC_GetH264Dblk(minor, &stH264dblk); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH264Dblk with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H264_DBLK_S *)arg, &stH264dblk, + sizeof(VENC_H264_DBLK_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H265_Dblk: { + VENC_H265_DBLK_S stH265dblk; + + if (copy_from_user(&stH265dblk, (VENC_H265_DBLK_S *)arg, + sizeof(VENC_H265_DBLK_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH265Dblk(minor, &stH265dblk); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetH265Dblk with %d\n", s32Ret); + } + } break; + case CVI_VC_VENC_GET_H265_Dblk: { + VENC_H265_DBLK_S stH265dblk; + + s32Ret = CVI_VENC_GetH265Dblk(minor, &stH265dblk); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH265Dblk with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H265_DBLK_S *)arg, &stH265dblk, + sizeof(VENC_H265_DBLK_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_SET_H264_INTRA_PRED: { + VENC_H264_INTRA_PRED_S stH264IntraPred; + + if (copy_from_user(&stH264IntraPred, (VENC_H264_INTRA_PRED_S *)arg, + sizeof(VENC_H264_INTRA_PRED_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetH264IntraPred(minor, &stH264IntraPred); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SetH264IntraPred with %d\n", s32Ret); + break; + } + } break; + case CVI_VC_VENC_GET_H264_INTRA_PRED: { + VENC_H264_INTRA_PRED_S stH264IntraPred; + + s32Ret = CVI_VENC_GetH264IntraPred(minor, &stH264IntraPred); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GetH264IntraPred with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_H264_INTRA_PRED_S *)arg, &stH264IntraPred, + sizeof(VENC_H264_INTRA_PRED_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VENC_ENABLE_SVC: { + CVI_BOOL enable_svc = CVI_FALSE; + + if (copy_from_user(&enable_svc, (CVI_BOOL *)arg, + sizeof(CVI_BOOL)) != 0) { + break; + } + s32Ret = CVI_VENC_EnableSVC(minor, enable_svc); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_EnableSVC with %d\n", s32Ret); + break; + } + } break; + case CVI_VC_VENC_SET_SVC_PARAM: { + VENC_SVC_PARAM_S stSvcParam; + + if (copy_from_user(&stSvcParam, (VENC_SVC_PARAM_S *)arg, + sizeof(VENC_SVC_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VENC_SetSvcParam(minor, &stSvcParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_SET_SvcParam with %d\n", s32Ret); + break; + } + } break; + case CVI_VC_VENC_GET_SVC_PARAM: { + VENC_SVC_PARAM_S stSvcParam; + + s32Ret = CVI_VENC_GetSvcParam(minor, &stSvcParam); + + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VENC_GET_SvcParam with %d\n", s32Ret); + break; + } + + if (copy_to_user((VENC_SVC_PARAM_S *)arg, &stSvcParam, + sizeof(VENC_SVC_PARAM_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; +#ifdef VC_DRIVER_TEST + case CVI_VC_ENCODE_MAIN_TEST: { + s32Ret = cvi_venc_test(arg); + } break; + case CVI_VC_ENC_DEC_JPEG_TEST: { + s32Ret = cvi_jpeg_test(arg); + } break; +#endif + default: { + pr_err("venc un-handle cmd id: %x\n", cmd); + } break; + } + + up(&vencSemArry[minor]); + return s32Ret; +} +#ifdef ENABLE_DEC +static long cvi_vc_drv_vdec_ioctl(struct file *filp, u_int cmd, u_long arg) +{ + unsigned int minor = iminor(file_inode(filp)); + CVI_S32 s32Ret = CVI_FAILURE; + + if(MaxVdecChnNum < 0) + return s32Ret; + if (down_interruptible(&vdecSemArry[minor])) { + return s32Ret; + } + + switch (cmd) { + case CVI_VC_VDEC_CREATE_CHN: { + VDEC_CHN_ATTR_S stChnAttr; + + if (copy_from_user(&stChnAttr, (VDEC_CHN_ATTR_S *)arg, + sizeof(VDEC_CHN_ATTR_S)) != 0) { + break; + } + + s32Ret = CVI_VDEC_CreateChn(minor, &stChnAttr); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_CreateChn with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_DESTROY_CHN: { + s32Ret = CVI_VDEC_DestroyChn(minor); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_DestroyChn with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_GET_CHN_ATTR: { + VDEC_CHN_ATTR_S stChnAttr; + + s32Ret = CVI_VDEC_GetChnAttr(minor, &stChnAttr); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_GetChnAttr with %d\n", s32Ret); + break; + } + + if (copy_to_user((VDEC_CHN_ATTR_S *)arg, &stChnAttr, + sizeof(VDEC_CHN_ATTR_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VDEC_SET_CHN_ATTR: { + VDEC_CHN_ATTR_S stChnAttr; + + if (copy_from_user(&stChnAttr, (VDEC_CHN_ATTR_S *)arg, + sizeof(VDEC_CHN_ATTR_S)) != 0) { + break; + } + + s32Ret = CVI_VDEC_SetChnAttr(minor, &stChnAttr); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_SetChnAttr with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_START_RECV_STREAM: { + s32Ret = CVI_VDEC_StartRecvStream(minor); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_StartRecvStream with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_STOP_RECV_STREAM: { + s32Ret = CVI_VDEC_StopRecvStream(minor); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_StopRecvStream with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_QUERY_STATUS: { + VDEC_CHN_STATUS_S stStatus; + + if (copy_from_user(&stStatus, (VDEC_CHN_STATUS_S *)arg, + sizeof(VDEC_CHN_STATUS_S)) != 0) { + break; + } + + s32Ret = CVI_VDEC_QueryStatus(minor, &stStatus); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_QueryStatus with %d\n", s32Ret); + break; + } + + if (copy_to_user((VDEC_CHN_STATUS_S *)arg, &stStatus, + sizeof(VDEC_CHN_STATUS_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VDEC_RESET_CHN: { + s32Ret = CVI_VDEC_ResetChn(minor); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_ResetChn with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_SET_CHN_PARAM: { + VDEC_CHN_PARAM_S stChnParam; + + if (copy_from_user(&stChnParam, (VDEC_CHN_PARAM_S *)arg, + sizeof(VDEC_CHN_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VDEC_SetChnParam(minor, &stChnParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_SetChnParam with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_GET_CHN_PARAM: { + VDEC_CHN_PARAM_S stChnParam; + + s32Ret = CVI_VDEC_GetChnParam(minor, &stChnParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_GetChnParam with %d\n", s32Ret); + break; + } + + if (copy_to_user((VDEC_CHN_PARAM_S *)arg, &stChnParam, + sizeof(VDEC_CHN_PARAM_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VDEC_SEND_STREAM: { + VDEC_STREAM_EX_S stStreamEx; +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + VDEC_STREAM_S stStream; + __u8 *pStreamData = NULL; +#endif + + if (copy_from_user(&stStreamEx, (VDEC_STREAM_EX_S *)arg, + sizeof(VDEC_STREAM_EX_S)) != 0) { + break; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (copy_from_user(&stStream, stStreamEx.pstStream, + sizeof(VDEC_STREAM_S)) != 0) { + break; + } + stStreamEx.pstStream = &stStream; + + if (stStream.u32Len) { + pStreamData = osal_ion_alloc(stStream.u32Len); + if (pStreamData == NULL) { + s32Ret = CVI_ERR_VENC_NOMEM; + break; + } + + if (copy_from_user(pStreamData, stStream.pu8Addr, + stStream.u32Len) != 0) { + osal_ion_free(pStreamData); + break; + } + } + stStream.pu8Addr = pStreamData; +#endif + + s32Ret = CVI_VDEC_SendStream(minor, stStreamEx.pstStream, + stStreamEx.s32MilliSec); +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (pStreamData) + osal_ion_free(pStreamData); +#endif + } break; + case CVI_VC_VDEC_GET_FRAME: { + VIDEO_FRAME_INFO_EX_S stFrameInfoEx; +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + VIDEO_FRAME_INFO_S stFrameInfo; + VIDEO_FRAME_INFO_S *pUserFrameInfo; // keep user space pointer on frame info +#endif + + if (copy_from_user(&stFrameInfoEx, (VIDEO_FRAME_INFO_EX_S *)arg, + sizeof(VIDEO_FRAME_INFO_EX_S)) != 0) { + break; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (copy_from_user(&stFrameInfo, stFrameInfoEx.pstFrame, + sizeof(VIDEO_FRAME_INFO_S)) != 0) { + break; + } + pUserFrameInfo = stFrameInfoEx.pstFrame; + stFrameInfoEx.pstFrame = &stFrameInfo; // replace user space pointer +#endif + + s32Ret = CVI_VDEC_GetFrame(minor, stFrameInfoEx.pstFrame, + stFrameInfoEx.s32MilliSec); + if (s32Ret != CVI_SUCCESS) { + break; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + if (copy_to_user(pUserFrameInfo, stFrameInfoEx.pstFrame, + sizeof(VIDEO_FRAME_INFO_S)) != 0) { + break; + } + stFrameInfoEx.pstFrame = pUserFrameInfo; // restore user space pointer +#endif + + if (copy_to_user((VIDEO_FRAME_INFO_EX_S *)arg, &stFrameInfoEx, + sizeof(VIDEO_FRAME_INFO_EX_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; + case CVI_VC_VDEC_RELEASE_FRAME: { + VIDEO_FRAME_INFO_S stFrameInfo; + + if (copy_from_user(&stFrameInfo, (VIDEO_FRAME_INFO_S *)arg, + sizeof(VIDEO_FRAME_INFO_S)) != 0) { + break; + } + + s32Ret = CVI_VDEC_ReleaseFrame(minor, &stFrameInfo); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_ReleaseFrame with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_ATTACH_VBPOOL: { + VDEC_CHN_POOL_S stPool; + + if (copy_from_user(&stPool, (VDEC_CHN_POOL_S *)arg, + sizeof(VDEC_CHN_POOL_S)) != 0) { + break; + } + + s32Ret = CVI_VDEC_AttachVbPool(minor, &stPool); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_AttachVbPool with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_DETACH_VBPOOL: { + s32Ret = CVI_VDEC_DetachVbPool(minor); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_DetachVbPool with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_SET_MOD_PARAM: { + VDEC_MOD_PARAM_S stModParam; + + if (copy_from_user(&stModParam, (VDEC_MOD_PARAM_S *)arg, + sizeof(VDEC_MOD_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VDEC_SetModParam(&stModParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_SetModParam with %d\n", s32Ret); + } + } break; + case CVI_VC_VDEC_GET_MOD_PARAM: { + VDEC_MOD_PARAM_S stModParam; + + if (copy_from_user(&stModParam, (VDEC_MOD_PARAM_S *)arg, + sizeof(VDEC_MOD_PARAM_S)) != 0) { + break; + } + + s32Ret = CVI_VDEC_GetModParam(&stModParam); + if (s32Ret != CVI_SUCCESS) { + pr_err("CVI_VDEC_GetModParam with %d\n", s32Ret); + break; + } + + if (copy_to_user((VDEC_MOD_PARAM_S *)arg, &stModParam, + sizeof(VDEC_MOD_PARAM_S)) != 0) { + s32Ret = CVI_FAILURE; + } + } break; +#ifdef VC_DRIVER_TEST + case CVI_VC_DECODE_H265_TEST: { + h265_dec_test(arg); + } break; + case CVI_VC_DECODE_H264_TEST: { + h264_dec_test(arg); + } break; +#endif + default: { + pr_err("vdec un-handle cmd id: %x\n", cmd); + } break; + } + + up(&vdecSemArry[minor]); + return s32Ret; +} +#endif +extern CVI_S32 cviGetLeftStreamFrames(CVI_S32 VeChn); +static unsigned int cvi_vc_drv_poll(struct file *filp, + struct poll_table_struct *wait) +{ + unsigned int mask = 0; + unsigned int minor = iminor(file_inode(filp)); + + VENC_CHN_ATTR_S stChnAttr = { 0 }; + + poll_wait(filp, &tWaitQueue[minor], wait); + + CVI_VENC_GetChnAttr(minor, &stChnAttr); + + if ((stChnAttr.stVencAttr.enType == PT_JPEG || + stChnAttr.stVencAttr.enType == PT_MJPEG) + && (cviGetLeftStreamFrames(minor) > 0)) { + mask |= POLLIN | POLLRDNORM; + } + if (((stChnAttr.stVencAttr.enType == PT_H265 || + stChnAttr.stVencAttr.enType == PT_H264)) + && (cviGetLeftStreamFrames(minor) > 0)) { + mask |= POLLIN | POLLRDNORM; + } + + return mask; +} + +static int cvi_vc_drv_release(struct inode *inode, struct file *filp) +{ + unsigned int minor = iminor(inode); + + pr_info("close channel no. %u\n", minor); + return 0; +} + +static int cvi_vc_drv_register_cdev(struct cvi_vc_drv_device *vdev) +{ + int err = 0; + int i = 0; + + vdev->cvi_vc_class = class_create(THIS_MODULE, CVI_VC_DRV_CLASS_NAME); + if (IS_ERR(vdev->cvi_vc_class)) { + pr_err("create class failed\n"); + return PTR_ERR(vdev->cvi_vc_class); + } + + if(MaxVencChnNum > 0) { + /* get the major number of the character device */ + if ((alloc_chrdev_region(&vdev->venc_cdev_id, 0, MaxVencChnNum, + CVI_VC_DRV_ENCODER_DEV_NAME)) < 0) { + err = -EBUSY; + pr_err("could not allocate major number\n"); + return err; + } + vdev->s_venc_major = MAJOR(vdev->venc_cdev_id); + vdev->p_venc_cdev = vzalloc(sizeof(struct cdev) * MaxVencChnNum); + + for (i = 0; i < MaxVencChnNum; i++) { + char devName[256]; + dev_t subDevice; + + subDevice = MKDEV(vdev->s_venc_major, i); + + /* initialize the device structure and register the device with the kernel */ + cdev_init(&vdev->p_venc_cdev[i], &cvi_vc_drv_venc_fops); + vdev->p_venc_cdev[i].owner = THIS_MODULE; + + if ((cdev_add(&vdev->p_venc_cdev[i], subDevice, 1)) < 0) { + err = -EBUSY; + pr_err("could not allocate chrdev\n"); + return err; + } + + sprintf(devName, "%s%d", CVI_VC_DRV_ENCODER_DEV_NAME, i); + device_create(vdev->cvi_vc_class, NULL, subDevice, NULL, "%s", + devName); + sema_init(&vencSemArry[i], 1); + } + } else { + printk("Venc Chn is zero\n"); + } +#ifdef ENABLE_DEC + if(MaxVdecChnNum > 0) { + /* get the major number of the character device */ + if ((alloc_chrdev_region(&vdev->vdec_cdev_id, 0, MaxVdecChnNum, + CVI_VC_DRV_DECODER_DEV_NAME)) < 0) { + err = -EBUSY; + pr_err("could not allocate major number\n"); + return err; + } + vdev->s_vdec_major = MAJOR(vdev->vdec_cdev_id); + vdev->p_vdec_cdev = vzalloc(sizeof(struct cdev) * MaxVdecChnNum); + + for (i = 0; i < MaxVdecChnNum; i++) { + char devName[256]; + dev_t subDevice; + + subDevice = MKDEV(vdev->s_vdec_major, i); + + /* initialize the device structure and register the device with the kernel */ + cdev_init(&vdev->p_vdec_cdev[i], &cvi_vc_drv_vdec_fops); + vdev->p_vdec_cdev[i].owner = THIS_MODULE; + + if ((cdev_add(&vdev->p_vdec_cdev[i], subDevice, 1)) < 0) { + err = -EBUSY; + pr_err("could not allocate chrdev\n"); + return err; + } + + sprintf(devName, "%s%d", CVI_VC_DRV_DECODER_DEV_NAME, i); + device_create(vdev->cvi_vc_class, NULL, subDevice, NULL, "%s", + devName); + sema_init(&vdecSemArry[i], 1); + } + } else { + printk("Vdec Chn is zero\n"); + } +#endif + return err; +} + +static int cvi_vc_drv_get_reg_resource(struct cvi_vc_drv_device *vdev, + struct platform_device *pdev) +{ + struct resource *res = NULL; + cvi_vc_drv_buffer_t *pReg; + + // vc_ctrl + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vc_ctrl"); + if (res) { + pReg = &vdev->ctrl_register; + pReg->phys_addr = res->start; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + pReg->virt_addr = + (__u8 *)ioremap(res->start, res->end - res->start); +#else + pReg->virt_addr = (__u8 *)ioremap_nocache( + res->start, res->end - res->start); +#endif + pReg->size = res->end - res->start; + } else { + pr_err("can not get vc_ctrl reg!\n"); + return -ENXIO; + } + + // vc_sbm + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vc_sbm"); + if (res) { + pReg = &vdev->sbm_register; + pReg->phys_addr = res->start; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + pReg->virt_addr = + (__u8 *)ioremap(res->start, res->end - res->start); +#else + pReg->virt_addr = (__u8 *)ioremap_nocache( + res->start, res->end - res->start); +#endif + pReg->size = res->end - res->start; + } else { + pr_err("can not get vc_sbm reg!\n"); + return -ENXIO; + } + + // vc_addr_remap + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, + "vc_addr_remap"); + if (res) { + pReg = &vdev->remap_register; + pReg->phys_addr = res->start; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + pReg->virt_addr = + (__u8 *)ioremap(res->start, res->end - res->start); +#else + pReg->virt_addr = (__u8 *)ioremap_nocache( + res->start, res->end - res->start); +#endif + pReg->size = res->end - res->start; + } else { + pr_err("can not get vc_addr_remap reg!\n"); + return -ENXIO; + } + return 0; +} + +int vcodec_drv_cb(void *dev, enum ENUM_MODULES_ID caller, u32 cmd, void *arg) +{ + int ret = CVI_FAILURE; + + switch (cmd) { + case VCODEC_CB_SEND_FRM: + { + struct venc_send_frm_info *pstFrmInfo = (struct venc_send_frm_info *)arg; + + ret = cvi_VENC_CB_SendFrame(pstFrmInfo->vpss_grp, + pstFrmInfo->vpss_chn, pstFrmInfo->vpss_chn1, + &pstFrmInfo->stInFrmBuf, + &pstFrmInfo->stInFrmBuf1, + pstFrmInfo->isOnline, + pstFrmInfo->sb_nb, + 20000); + break; + } + + case VCODEC_CB_SKIP_FRM: + { + struct venc_send_frm_info *pstFrmInfo = (struct venc_send_frm_info *)arg; + + ret = cvi_VENC_CB_SkipFrame(pstFrmInfo->vpss_grp, pstFrmInfo->vpss_chn, + pstFrmInfo->stInFrmBuf.size.u32Height, 100); + break; + } + + case VCODEC_CB_SNAP_JPG_FRM: + { + struct venc_snap_frm_info *pstSkipInfo = (struct venc_snap_frm_info *)arg; + + ret = cvi_VENC_CB_SnapJpgFrame(pstSkipInfo->vpss_grp, + pstSkipInfo->vpss_chn, + pstSkipInfo->skip_frm_cnt); + break; + } + + case VCODEC_CB_OVERFLOW_CHECK: + { + struct cvi_vc_info *vc_info = (struct cvi_vc_info *)arg; + + unsigned int reg_00 = cvi_vc_drv_read_vc_reg(REG_SBM, 0x00); + unsigned int reg_08 = cvi_vc_drv_read_vc_reg(REG_SBM, 0x08); + unsigned int reg_88 = cvi_vc_drv_read_vc_reg(REG_SBM, 0x88); + unsigned int reg_90 = cvi_vc_drv_read_vc_reg(REG_SBM, 0x90); + unsigned int reg_94 = cvi_vc_drv_read_vc_reg(REG_SBM, 0x94); + + vc_info->enable = true; + vc_info->reg_00 = reg_00; + vc_info->reg_08 = reg_08; + vc_info->reg_88 = reg_88; + vc_info->reg_90 = reg_90; + vc_info->reg_94 = reg_94; + + pr_info("vc check reg_00=0x%x, reg_08=0x%x, reg_88=0x%x, reg_90=0x%x, reg_94=0x%x\n", + reg_00, reg_08, reg_88, reg_90, reg_94); + + ret = CVI_SUCCESS; + break; + } + + case VCODEC_CB_SWITCH_CHN: + { + struct venc_switch_chn *switch_chn = (struct venc_switch_chn *)arg; + + ret = cvi_VENC_CB_SwitchChn(switch_chn->vpss_grp, switch_chn->vpss_chn); + + break; + } + + default: + break; + } + + return ret; +} + +static int vcodec_drv_register_cb(struct cvi_vc_drv_device *dev) +{ + struct base_m_cb_info reg_cb; + + reg_cb.module_id = E_MODULE_VCODEC; + reg_cb.dev = (void *)dev; + reg_cb.cb = vcodec_drv_cb; + + return base_reg_module_cb(®_cb); +} + +static int cvi_vc_drv_probe(struct platform_device *pdev) +{ + int err = 0; + const struct of_device_id *match; + struct device *dev = &pdev->dev; + struct cvi_vc_drv_device *vdev; + + vdev = devm_kzalloc(&pdev->dev, sizeof(*vdev), GFP_KERNEL); + if (!vdev) { + return -ENOMEM; + } + + memset(vdev, 0, sizeof(*vdev)); + + vdev->dev = dev; + + match = of_match_device(cvi_vc_drv_match_table, &pdev->dev); + if (!match) { + pr_err("of_match_device fail\n"); + return -EINVAL; + } + + vdev->pdata = match->data; + + err = cvi_vc_drv_get_reg_resource(vdev, pdev); + if (err) { + pr_err("cvi_vc_drv_get_reg_resourc fail!!\n"); + goto ERROR_PROBE_DEVICE; + } + + err = cvi_vc_drv_register_cdev(vdev); + if (err < 0) { + pr_err("cvi_vc_drv_register_cdev fail\n"); + goto ERROR_PROBE_DEVICE; + } + + platform_set_drvdata(pdev, vdev); + + pCviVcDrvDevice = vdev; + + venc_proc_init(dev); + h265e_proc_init(dev); + h264e_proc_init(dev); + codecinst_proc_init(dev); + jpege_proc_init(dev); + rc_proc_init(dev); +#ifdef ENABLE_DEC + if(MaxVdecChnNum > 0) + vdec_proc_init(dev); +#endif + /* vcodec register cb */ + err = vcodec_drv_register_cb(vdev); + if (err < 0) { + pr_err("Failed to register vcodec cb, err %d\n", err); + goto ERROR_PROBE_DEVICE; + } + + return 0; + +ERROR_PROBE_DEVICE: + + if (vdev->s_venc_major) + unregister_chrdev_region(vdev->s_venc_major, MaxVencChnNum); +#ifdef ENABLE_DEC + if (vdev->s_vdec_major) + unregister_chrdev_region(vdev->s_vdec_major, MaxVdecChnNum); +#endif + //platform_set_drvdata(pdev, &vcodec_dev); + + return err; +} + +static int cvi_vc_drv_remove(struct platform_device *pdev) +{ + struct cvi_vc_drv_device *vdev = platform_get_drvdata(pdev); + + if (vdev->s_venc_major > 0) { + int i = 0; + + for (i = 0; i < MaxVencChnNum; i++) { + dev_t subDevice; + + subDevice = MKDEV(vdev->s_venc_major, i); + cdev_del(&vdev->p_venc_cdev[i]); + device_destroy(vdev->cvi_vc_class, subDevice); + } + vfree(vdev->p_venc_cdev); + unregister_chrdev_region(vdev->s_venc_major, MaxVencChnNum); + vdev->s_venc_major = 0; + } +#ifdef ENABLE_DEC + if (vdev->s_vdec_major > 0) { + int i = 0; + + for (i = 0; i < MaxVdecChnNum; i++) { + dev_t subDevice; + + subDevice = MKDEV(vdev->s_vdec_major, i); + cdev_del(&vdev->p_vdec_cdev[i]); + device_destroy(vdev->cvi_vc_class, subDevice); + } + vfree(vdev->p_vdec_cdev); + unregister_chrdev_region(vdev->s_vdec_major, MaxVdecChnNum); + vdev->s_vdec_major = 0; + } +#endif + class_destroy(vdev->cvi_vc_class); + return 0; +} + +unsigned int cvi_vc_drv_read_vc_reg(REG_TYPE eRegType, unsigned long addr) +{ + unsigned long *reg_addr = NULL; + + if (!pCviVcDrvDevice) + return 0; + + // TODO: enable CCF? + + switch (eRegType) { + case REG_CTRL: + reg_addr = (unsigned long *)(addr + + (unsigned long)pCviVcDrvDevice + ->ctrl_register.virt_addr); + break; + case REG_SBM: + reg_addr = (unsigned long *)(addr + + (unsigned long)pCviVcDrvDevice + ->sbm_register.virt_addr); + break; + case REG_REMAP: + reg_addr = + (unsigned long *)(addr + + (unsigned long)pCviVcDrvDevice + ->remap_register.virt_addr); + break; + default: + break; + } + + if (!reg_addr) + return 0; + + pr_debug("read, %p, 0x%X\n", reg_addr, readl(reg_addr)); + + return readl(reg_addr); +} + +void cvi_vc_drv_write_vc_reg(REG_TYPE eRegType, unsigned long addr, + unsigned int data) +{ + unsigned long *reg_addr = NULL; + + if (!pCviVcDrvDevice) + return; + + // TODO: enable CCF? + + switch (eRegType) { + case REG_CTRL: + reg_addr = (unsigned long *)(addr + + (unsigned long)pCviVcDrvDevice + ->ctrl_register.virt_addr); + break; + case REG_SBM: + reg_addr = (unsigned long *)(addr + + (unsigned long)pCviVcDrvDevice + ->sbm_register.virt_addr); + break; + case REG_REMAP: + reg_addr = + (unsigned long *)(addr + + (unsigned long)pCviVcDrvDevice + ->remap_register.virt_addr); + break; + default: + break; + } + + if (!reg_addr) + return; + + pr_debug("write, %p = 0x%X\n", reg_addr, data); + + writel(data, reg_addr); +} + +static struct platform_driver cvi_vc_drv_platform_driver = { + .driver = { + .name = CVI_VC_DRV_PLATFORM_DEVICE_NAME, + .owner = THIS_MODULE, + .of_match_table = cvi_vc_drv_match_table, + }, + .probe = cvi_vc_drv_probe, + .remove = cvi_vc_drv_remove, +}; + +static int __init cvi_vc_drv_init(void) +{ + int res = 0; + + res = platform_driver_register(&cvi_vc_drv_platform_driver); + + pr_info("cvi_vc_drv_init result = 0x%x\n", res); + + return res; +} + +static void __exit cvi_vc_drv_exit(void) +{ + venc_proc_deinit(); + h265e_proc_deinit(); + h264e_proc_deinit(); + codecinst_proc_deinit(); + jpege_proc_deinit(); + rc_proc_deinit(); +#ifdef ENABLE_DEC + if(MaxVdecChnNum > 0) + vdec_proc_deinit(); +#endif + platform_driver_unregister(&cvi_vc_drv_platform_driver); +} + +MODULE_AUTHOR("CVITEKVCODEC Inc."); +MODULE_DESCRIPTION("CVITEK VC linux driver"); +MODULE_LICENSE("GPL"); + +module_init(cvi_vc_drv_init); +module_exit(cvi_vc_drv_exit); diff --git a/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv.h b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv.h new file mode 100644 index 0000000000..9f1c8a1443 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv.h @@ -0,0 +1,102 @@ +#ifndef __CVI_VC_DRV_H__ +#define __CVI_VC_DRV_H__ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include "cvi_venc.h" +#include "cvi_vdec.h" + +#define CVI_VC_DRV_PLATFORM_DEVICE_NAME "cvi_vc_drv" +#define CVI_VC_DRV_CLASS_NAME "cvi_vc_drv" + +typedef struct cvi_vc_drv_buffer_t { + __u32 size; + __u64 phys_addr; + __u64 base; /* kernel logical address in use kernel */ + __u8 *virt_addr; /* virtual user space address */ +#ifdef __arm__ + __u32 padding; /* padding for keeping same size of this structure */ +#endif +} cvi_vc_drv_buffer_t; + +struct cvi_vc_drv_ops { + // void (*clk_get)(struct cvi_vc_drv_device *vdev); +}; + +struct cvi_vc_drv_pltfm_data { + unsigned int quirks; + unsigned int version; +}; + +struct cvi_vc_drv_device { + struct device *dev; + + struct class *cvi_vc_class; + + dev_t venc_cdev_id; + struct cdev *p_venc_cdev; + int s_venc_major; + + dev_t vdec_cdev_id; + struct cdev *p_vdec_cdev; + int s_vdec_major; + + cvi_vc_drv_buffer_t ctrl_register; + cvi_vc_drv_buffer_t remap_register; + cvi_vc_drv_buffer_t sbm_register; + + const struct cvi_vc_drv_ops *pdata; +}; + +typedef struct _VENC_STREAM_EX_S { + VENC_STREAM_S *pstStream; + CVI_S32 s32MilliSec; +} VENC_STREAM_EX_S; + +typedef struct _VENC_USER_DATA_S { + CVI_U8 *pu8Data; + CVI_U32 u32Len; +} VENC_USER_DATA_S; + +typedef struct _VIDEO_FRAME_INFO_EX_S { + VIDEO_FRAME_INFO_S *pstFrame; + CVI_S32 s32MilliSec; +} VIDEO_FRAME_INFO_EX_S; + +typedef struct _USER_FRAME_INFO_EX_S { + USER_FRAME_INFO_S *pstUserFrame; + CVI_S32 s32MilliSec; +} USER_FRAME_INFO_EX_S; + +typedef struct _VDEC_STREAM_EX_S { + VDEC_STREAM_S *pstStream; + CVI_S32 s32MilliSec; +} VDEC_STREAM_EX_S; + +typedef enum { + REG_CTRL = 0, + REG_SBM, + REG_REMAP, +} REG_TYPE; + +unsigned int cvi_vc_drv_read_vc_reg(REG_TYPE eRegType, unsigned long addr); +void cvi_vc_drv_write_vc_reg(REG_TYPE eRegType, unsigned long addr, + unsigned int data); + +#define CtrlWriteReg(CORE, ADDR, DATA) \ + cvi_vc_drv_write_vc_reg(REG_CTRL, ADDR, DATA) +#define CtrlReadReg(CORE, ADDR) \ + cvi_vc_drv_read_vc_reg(REG_CTRL, ADDR) +#define RemapWriteReg(CORE, ADDR, DATA) \ + cvi_vc_drv_write_vc_reg(REG_REMAP, ADDR, DATA) +#define RemapReadReg(CORE, ADDR) \ + cvi_vc_drv_read_vc_reg(REG_REMAP, ADDR) + +#endif /* __CVI_VC_DRV_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv_proc.c b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv_proc.c new file mode 100644 index 0000000000..65a0122594 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv_proc.c @@ -0,0 +1,2119 @@ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "cvi_venc.h" +#include "cvi_vdec.h" +#include "venc.h" +#include "vdec.h" + +#include "vpuconfig.h" +#include "cvi_vc_drv_proc.h" + +extern venc_context *handle; +extern uint32_t MaxVencChnNum; +#ifdef ENABLE_DEC +extern vdec_context *vdec_handle; +extern uint32_t MaxVdecChnNum; +#endif + +proc_debug_config_t tVencDebugConfig = { .u32DbgMask = 0x1, .u32EndFrmIdx = UINT_MAX }; +proc_debug_config_t tVdecDebugConfig = { .u32DbgMask = 0x1, .u32EndFrmIdx = UINT_MAX }; + +static void getCodecTypeStr(PAYLOAD_TYPE_E enType, char *pcCodecType) +{ + switch (enType) { + case PT_JPEG: + strcpy(pcCodecType, "JPEG"); + break; + case PT_MJPEG: + strcpy(pcCodecType, "MJPEG"); + break; + case PT_H264: + strcpy(pcCodecType, "H264"); + break; + case PT_H265: + strcpy(pcCodecType, "H265"); + break; + default: + strcpy(pcCodecType, "N/A"); + break; + } +} + +static void getRcModeStr(VENC_RC_MODE_E enRcMode, char *pRcMode) +{ + switch (enRcMode) { + case VENC_RC_MODE_H264CBR: + case VENC_RC_MODE_H265CBR: + case VENC_RC_MODE_MJPEGCBR: + strcpy(pRcMode, "CBR"); + break; + case VENC_RC_MODE_H264VBR: + case VENC_RC_MODE_H265VBR: + case VENC_RC_MODE_MJPEGVBR: + strcpy(pRcMode, "VBR"); + break; + case VENC_RC_MODE_H264AVBR: + case VENC_RC_MODE_H265AVBR: + strcpy(pRcMode, "AVBR"); + break; + case VENC_RC_MODE_H264QVBR: + case VENC_RC_MODE_H265QVBR: + strcpy(pRcMode, "QVBR"); + break; + case VENC_RC_MODE_H264FIXQP: + case VENC_RC_MODE_H265FIXQP: + case VENC_RC_MODE_MJPEGFIXQP: + strcpy(pRcMode, "FIXQP"); + break; + case VENC_RC_MODE_H264QPMAP: + case VENC_RC_MODE_H265QPMAP: + strcpy(pRcMode, "QPMAP"); + break; + default: + strcpy(pRcMode, "N/A"); + break; + } +} + +static void getGopModeStr(VENC_GOP_MODE_E enGopMode, char *pcGopMode) +{ + switch (enGopMode) { + case VENC_GOPMODE_NORMALP: + strcpy(pcGopMode, "NORMALP"); + break; + case VENC_GOPMODE_DUALP: + strcpy(pcGopMode, "DUALP"); + break; + case VENC_GOPMODE_SMARTP: + strcpy(pcGopMode, "SMARTP"); + break; + case VENC_GOPMODE_ADVSMARTP: + strcpy(pcGopMode, "ADVSMARTP"); + break; + case VENC_GOPMODE_BIPREDB: + strcpy(pcGopMode, "BIPREDB"); + break; + case VENC_GOPMODE_LOWDELAYB: + strcpy(pcGopMode, "LOWDELAYB"); + break; + case VENC_GOPMODE_BUTT: + strcpy(pcGopMode, "BUTT"); + break; + default: + strcpy(pcGopMode, "N/A"); + break; + } +} + +static void getPixelFormatStr(PIXEL_FORMAT_E enPixelFormat, char *pcPixelFormat) +{ + switch (enPixelFormat) { + case PIXEL_FORMAT_YUV_PLANAR_422: + strcpy(pcPixelFormat, "YUV422"); + break; + case PIXEL_FORMAT_YUV_PLANAR_420: + strcpy(pcPixelFormat, "YUV420"); + break; + case PIXEL_FORMAT_YUV_PLANAR_444: + strcpy(pcPixelFormat, "YUV444"); + break; + case PIXEL_FORMAT_NV12: + strcpy(pcPixelFormat, "NV12"); + break; + case PIXEL_FORMAT_NV21: + strcpy(pcPixelFormat, "NV21"); + break; + default: + strcpy(pcPixelFormat, "N/A"); + break; + } +} + +static void getFrameRate(VENC_CHN_ATTR_S *pstChnAttr, CVI_U32 *pu32SrcFrameRate, + CVI_FR32 *pfr32DstFrameRate) +{ + switch (pstChnAttr->stRcAttr.enRcMode) { + case VENC_RC_MODE_H264CBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH264Cbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH264Cbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_H265CBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH265Cbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH265Cbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_MJPEGCBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stMjpegCbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stMjpegCbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_H264VBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH264Vbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH264Vbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_H265VBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH265Vbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH265Vbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_MJPEGVBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stMjpegVbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stMjpegVbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_H264FIXQP: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH264FixQp.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH264FixQp.fr32DstFrameRate; + break; + case VENC_RC_MODE_H265FIXQP: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH265FixQp.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH265FixQp.fr32DstFrameRate; + break; + case VENC_RC_MODE_MJPEGFIXQP: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stMjpegFixQp.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stMjpegFixQp.fr32DstFrameRate; + break; + case VENC_RC_MODE_H264AVBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH264AVbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH264AVbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_H265AVBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH265AVbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH265AVbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_H264QVBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH264QVbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH264QVbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_H265QVBR: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH265QVbr.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH265QVbr.fr32DstFrameRate; + break; + case VENC_RC_MODE_H264QPMAP: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH264QpMap.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH264QpMap.fr32DstFrameRate; + break; + case VENC_RC_MODE_H265QPMAP: + *pu32SrcFrameRate = + pstChnAttr->stRcAttr.stH265QpMap.u32SrcFrameRate; + *pfr32DstFrameRate = + pstChnAttr->stRcAttr.stH265QpMap.fr32DstFrameRate; + break; + default: + break; + } +} + +static int venc_proc_show(struct seq_file *m, void *v) +{ + seq_printf(m, "Module: [VENC] System Build Time [%s]\n", UTS_VERSION); + + if (handle != NULL) { + int idx = 0; + CVI_VENC_PARAM_MOD_S *pVencModParam = &handle->ModParam; + + seq_puts( + m, + "-----MODULE PARAM---------------------------------------------\n"); + seq_printf( + m, + "VencBufferCache: %u\t FrameBufRecycle: %d\t VencMaxChnNum: %u\n", + pVencModParam->stVencModParam.u32VencBufferCache, + pVencModParam->stVencModParam.u32FrameBufRecycle, + MaxVencChnNum); +#ifdef CONFIG_ARCH_CV182X + seq_printf( + m, "H264/H265 share singleESBuf %d\n", + pVencModParam->stH264eModParam.bSingleEsBuf && + pVencModParam->stH265eModParam.bSingleEsBuf && + pVencModParam->stH264eModParam + .u32SingleEsBufSize == + pVencModParam->stH265eModParam + .u32SingleEsBufSize); +#endif + + for (idx = 0; idx < MaxVencChnNum; idx++) { + if (handle && handle->chn_handle[idx] != NULL) { + char cCodecType[6] = { '\0' }; + char cRcMode[6] = { '\0' }; + char cGopMode[10] = { '\0' }; + char cPixelFormat[8] = { '\0' }; + CVI_U32 u32SrcFrameRate = 0; + CVI_FR32 fr32DstFrameRate = 0; + int roiIdx = 0; + + VENC_CHN_ATTR_S *pstChnAttr = + handle->chn_handle[idx]->pChnAttr; + VENC_CHN_PARAM_S *pstChnParam = + &handle->chn_handle[idx] + ->pChnVars->stChnParam; + VENC_CHN_STATUS_S *pchnStatus = + &handle->chn_handle[idx] + ->pChnVars->chnStatus; + VENC_STREAM_S *pstStream = + &handle->chn_handle[idx] + ->pChnVars->stStream; + VCODEC_PERF_FPS_S *pstFPS = + &handle->chn_handle[idx] + ->pChnVars->stFPS; + VIDEO_FRAME_S *pstVFrame = + &handle->chn_handle[idx] + ->pChnVars->stFrameInfo + .stVFrame; + + getCodecTypeStr(pstChnAttr->stVencAttr.enType, + cCodecType); + getRcModeStr(pstChnAttr->stRcAttr.enRcMode, + cRcMode); + getGopModeStr(pstChnAttr->stGopAttr.enGopMode, + cGopMode); + getPixelFormatStr(pstVFrame->enPixelFormat, + cPixelFormat); + getFrameRate(pstChnAttr, &u32SrcFrameRate, + &fr32DstFrameRate); + + seq_puts( + m, + "-----VENC CHN ATTR 1---------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t Width: %u\t Height: %u\t Type: %s\t RcMode: %s", + idx, pstChnAttr->stVencAttr.u32PicWidth, + pstChnAttr->stVencAttr.u32PicHeight, + cCodecType, cRcMode); + seq_printf( + m, + "\t EsBufQueueEn: %d\t bIsoSendFrmEn: %d", + pstChnAttr->stVencAttr.bEsBufQueueEn, + pstChnAttr->stVencAttr.bIsoSendFrmEn); + seq_printf( + m, + "\t ByFrame: %s\t Sequence: %u\t LeftBytes: %u\t LeftFrm: %u", + pstChnAttr->stVencAttr.bByFrame ? "Y" : + "N", + pstStream->u32Seq, + pchnStatus->u32LeftStreamBytes, + pchnStatus->u32LeftStreamFrames); + seq_printf( + m, + "\t CurPacks: %u\t GopMode: %s\t Prio: %d\n", + pchnStatus->u32CurPacks, cGopMode, + pstChnParam->u32Priority); + + seq_puts( + m, + "-----VENC CHN ATTR 2-----------------------------------------------\n"); + seq_printf( + m, + "VeStr: Y\t SrcFr: %u\t TarFr: %u\t Timeref: %u\t PixFmt: %s", + u32SrcFrameRate, fr32DstFrameRate, + pstVFrame->u32TimeRef, cPixelFormat); + seq_printf( + m, + "\t PicAddr: 0x%llx\t WakeUpFrmCnt: %u\n", + pstVFrame->u64PhyAddr[0], + pstChnParam->u32PollWakeUpFrmCnt); + +// TODO: following info should be amended later +#if 0 + seq_puts(m, "-----VENC JPEGE ATTR ----------------------------------------------\n"); + seq_printf(m, "ID: %d\t RcvMode: %d\t MpfCnt: %d\t Mpf0Width: %d\t Mpf0Height: %d", + idx, 0, 0, 0, 0); + seq_printf(m, "\t Mpf1Width: %d\t Mpf1Height: %d\n", 0, 0); + + seq_puts(m, "-----VENC CHN RECEIVE STAT-----------------------------------------\n"); + seq_printf(m, "ID: %d\t Start: %d\t StartEx: %d\t RecvLeft: %d\t EncLeft: %d", + idx, 0, 0, 0, 0); + seq_puts(m, "\t JpegEncodeMode: NA\n"); + + seq_puts(m, "-----VENC VPSS QUERY----------------------------------------------\n"); + seq_printf(m, "ID: %d\t Query: %d\t QueryOk: %d\t QueryFR: %d\t Invld: %d", + idx, 0, 0, 0, 0); + seq_printf(m, "\t Full: %d\t VbFail: %d\t QueryFail: %d\t InfoErr: %d\t Stop: %d\n", + 0, 0, 0, 0, 0); + + seq_puts(m, "-----VENC SEND1---------------------------------------------------\n"); + seq_printf(m, "ID: %d\t VpssSnd: %d\t VInfErr: %d\t OthrSnd: %d\t OInfErr: %d\t Send: %d", + idx, 0, 0, 0, 0, 0); + seq_printf(m, "\t Stop: %d\t Full: %d\t CropErr: %d\t DrectSnd: %d\t SizeErr: %d\n", + 0, 0, 0, 0, 0); + + seq_puts(m, "-----VENC SEND2--------------------------------------------------\n"); + seq_printf(m, "ID: %d\t SendVgs: %d\t StartOk: %d\t StartFail: %d\t IntOk: %d", + idx, 0, 0, 0, 0); + seq_printf(m, "\t IntFail: %d\t SrcAdd: %d\t SrcSub: %d\t DestAdd: %d\t DestSub: %d\n", + 0, 0, 0, 0, 0); + + seq_puts(m, "-----VENC PIC QUEUE STATE-----------------------------------------\n"); + seq_printf(m, "ID: %d\t Free: %d\t Busy: %d\t Vgs: %d\t BFrame: %d\n", + idx, 0, 0, 0, 0); + + seq_puts(m, "-----VENC DCF/MPF QUEUE STATE-----------------------------------------\n"); + seq_printf(m, "ID: %d\t ThumbFree: %d\t ThumbBusy: %d", + idx, 0, 0); + seq_printf(m, "\t Mpf0Free: %d\t Mpf0Busy: %d\t Mpf1Free: %d\t Mpf1Busy: %d\n", + 0, 0, 0, 0); + + seq_puts(m, "-----VENC CHNL INFO------------------------------------------------\n"); + seq_printf(m, "ID: %d\t Inq: %d\t InqOk: %d\t Start: %d\t StartOk: %d\t Config: %d", + idx, 0, 0, 0, 0, 0); + seq_printf(m, "\t VencInt: %d\t ChaResLost: %d\t OverLoad: %d\t RingSkip: %d\t RcSkip: %d\n", + 0, 0, 0, 0, 0); +#endif + + seq_puts( + m, + "-----VENC CROP INFO------------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t CropEn: %s\t StartX: %d\t StartY: %d\t Width: %u\t Height: %u\n", + idx, + pstChnParam->stCropCfg.bEnable ? "Y" : + "N", + pstChnParam->stCropCfg.stRect.s32X, + pstChnParam->stCropCfg.stRect.s32Y, + pstChnParam->stCropCfg.stRect.u32Width, + pstChnParam->stCropCfg.stRect.u32Height); + + seq_puts( + m, + "-----ROI INFO-----------------------------------------------------\n"); + for (roiIdx = 0; roiIdx < 8; roiIdx++) { + if (handle->chn_handle[idx] + ->pChnVars + ->stRoiAttr[roiIdx] + .bEnable) { + seq_printf( + m, + "ID: %d\t Index: %u\t bRoiEn: %s\t bAbsQp: %s\t Qp: %d", + idx, + handle->chn_handle[idx] + ->pChnVars + ->stRoiAttr[roiIdx] + .u32Index, + handle->chn_handle[idx] + ->pChnVars + ->stRoiAttr + [roiIdx] + .bEnable ? + "Y" : + "N", + handle->chn_handle[idx] + ->pChnVars + ->stRoiAttr + [roiIdx] + .bAbsQp ? + "Y" : + "N", + handle->chn_handle[idx] + ->pChnVars + ->stRoiAttr[roiIdx] + .s32Qp); + seq_printf( + m, + "\t Width: %u\t Height: %u\t StartX: %d\t StartY: %d\n", + handle->chn_handle[idx] + ->pChnVars + ->stRoiAttr[roiIdx] + .stRect.u32Width, + handle->chn_handle[idx] + ->pChnVars + ->stRoiAttr[roiIdx] + .stRect + .u32Height, + handle->chn_handle[idx] + ->pChnVars + ->stRoiAttr[roiIdx] + .stRect.s32X, + handle->chn_handle[idx] + ->pChnVars + ->stRoiAttr[roiIdx] + .stRect.s32Y); + } + } + +#if 0 + seq_puts(m, "-----VENC STREAM STATE---------------------------------------------\n"); + seq_printf(m, "ID: %d\t FreeCnt: %d\t BusyCnt: %d\t UserCnt: %d\t UserGet: %d", + idx, 0, 0, 0, 0); + seq_printf(m, "\t UserRls: %d\t GetTimes: %d\t Interval: %d\t FrameRate: %d\n", + 0, 0, 0, 0); +#endif + if (pstChnAttr->stVencAttr.enType == PT_H264 || + pstChnAttr->stVencAttr.enType == PT_H265) { + seq_puts( + m, + "-----VENC SVC STATE------------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t svcEnable: %s\t fg_protect_en: %s\t fg_dealt_qp: %d", idx, + handle->chn_handle[idx]->bSvcEnable ? "Y" : "N", + handle->chn_handle[idx]->svcParam.fg_protect_en ? "Y" : "N", + handle->chn_handle[idx]->svcParam.fg_dealt_qp); + seq_printf( + m, + "\t scene_detect_en: %s\t scene_low_th: %d\t scene_hight_th: %d\t smart_ai_en: %s\n", + handle->chn_handle[idx]->svcParam.complex_scene_detect_en ? + "Y" : "N", + handle->chn_handle[idx]->svcParam.complex_scene_low_th, + handle->chn_handle[idx]->svcParam.complex_scene_hight_th, + handle->chn_handle[idx]->svcParam.smart_ai_en ? "Y" : "N"); + seq_printf( + m, + "\t middle_min_percent: %d\t complex_min_percent: %d\n", + handle->chn_handle[idx]->svcParam.middle_min_percent, + handle->chn_handle[idx]->svcParam.complex_min_percent); + } + + seq_puts( + m, + "-----VENC PTS STATE------------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t RcvFirstFrmPts: %llu\t RcvFrmPts: %llu\n", + idx, 0LL, pstVFrame->u64PTS); + + seq_puts( + m, + "-----VENC CHN PERFORMANCE------------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t No.SendFramePerSec: %u\t No.EncFramePerSec: %u\t HwEncTime: %llu us\n\n", + idx, pstFPS->u32InFPS, + pstFPS->u32OutFPS, pstFPS->u64HwTime); + } + } + } + + seq_puts( + m, + "\n----- CVITEK Debug Level STATE ----------------------------------------\n"); + seq_printf( + m, + "VencDebugMask: 0x%X\t VencStartFrmIdx: %u\t VencEndFrmIdx: %u\t VencDumpPath: %s\t ", + tVencDebugConfig.u32DbgMask, tVencDebugConfig.u32StartFrmIdx, + tVencDebugConfig.u32EndFrmIdx, tVencDebugConfig.cDumpPath); + seq_printf(m, "VencNoDataTimeout: %u\n", + tVencDebugConfig.u32NoDataTimeout); + + return 0; +} + +static int venc_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, venc_proc_show, PDE_DATA(inode)); +} + +static ssize_t +vcodec_proc_write_helper(const char __user *user_buf, size_t count, + proc_debug_config_t *ptDebugConfig, + char *pcProcInputdata, char *pcDbgPrefix, + char *pcDbgStartFrmPrefix, char *pcDbgEndFrmPrefix, + char *pcDbgDirPrefix, char *pcNoDataTimeoutPrefix) +{ + uint8_t u8DgbPrefixLen; + uint8_t u8DgbStartFrmPrefixLen; + uint8_t u8DgbEndFrmPrefixLen; + uint8_t u8DgbDirPrefixLen; + uint8_t u8NoDataTimeoutPrefixLen; + + if (!user_buf) { + pr_err("no user buf input\n"); + return -EFAULT; + } + + u8DgbPrefixLen = strlen(pcDbgPrefix); + u8DgbStartFrmPrefixLen = strlen(pcDbgStartFrmPrefix); + u8DgbEndFrmPrefixLen = strlen(pcDbgEndFrmPrefix); + u8DgbDirPrefixLen = strlen(pcDbgDirPrefix); + if (pcNoDataTimeoutPrefix) + u8NoDataTimeoutPrefixLen = strlen(pcNoDataTimeoutPrefix); + + if (copy_from_user(pcProcInputdata, user_buf, count)) { + pr_err("copy_from_user fail\n"); + return -EFAULT; + } + + if (strncmp(pcProcInputdata, pcDbgPrefix, u8DgbPrefixLen) == 0) { + if (kstrtouint(pcProcInputdata + u8DgbPrefixLen, 16, + &ptDebugConfig->u32DbgMask) != 0) { + pr_err("fail to set debug level: 0x%s\n", + pcProcInputdata + u8DgbPrefixLen); + return -EFAULT; + } + } else if (strncmp(pcProcInputdata, pcDbgStartFrmPrefix, + u8DgbStartFrmPrefixLen) == 0) { + if (kstrtouint(pcProcInputdata + u8DgbStartFrmPrefixLen, 10, + &ptDebugConfig->u32StartFrmIdx) != 0) { + pr_err("fail to set start frame index: 0x%s\n", + pcProcInputdata + u8DgbStartFrmPrefixLen); + return -EFAULT; + } + } else if (strncmp(pcProcInputdata, pcDbgEndFrmPrefix, + u8DgbEndFrmPrefixLen) == 0) { + if (kstrtouint(pcProcInputdata + u8DgbEndFrmPrefixLen, 10, + &ptDebugConfig->u32EndFrmIdx) != 0) { + pr_err("fail to set end frame index: 0x%s\n", + pcProcInputdata + u8DgbEndFrmPrefixLen); + return -EFAULT; + } + } else if (strncmp(pcProcInputdata, pcDbgDirPrefix, + u8DgbDirPrefixLen) == 0) { + if (strcpy(ptDebugConfig->cDumpPath, + pcProcInputdata + u8DgbDirPrefixLen) == NULL) { + pr_err("fail to set debug folder: 0x%s\n", + pcProcInputdata + u8DgbDirPrefixLen); + return -EFAULT; + } + } else if (pcNoDataTimeoutPrefix && + strncmp(pcProcInputdata, pcNoDataTimeoutPrefix, + u8NoDataTimeoutPrefixLen) == 0) { + if (kstrtouint(pcProcInputdata + u8NoDataTimeoutPrefixLen, 10, + &ptDebugConfig->u32NoDataTimeout) != 0) { + pr_err("fail to set no data threshold: 0x%s\n", + pcProcInputdata + u8NoDataTimeoutPrefixLen); + return -EFAULT; + } + } else { + pr_err("can't handle user input %s\n", pcProcInputdata); + return -EFAULT; + } + + return count; +} + +static ssize_t venc_proc_write(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + /* debug_level list, please refer to: cvi_comm_venc.h + * CVI_VENC_MASK_ERR 0x1 + * CVI_VENC_MASK_WARN 0x2 + * CVI_VENC_MASK_INFO 0x4 + * CVI_VENC_MASK_FLOW 0x8 + * CVI_VENC_MASK_DBG 0x10 + * CVI_VENC_MASK_BS 0x100 + * CVI_VENC_MASK_SRC 0x200 + * CVI_VENC_MASK_API 0x400 + * CVI_VENC_MASK_SYNC 0x800 + * CVI_VENC_MASK_PERF 0x1000 + * CVI_VENC_MASK_CFG 0x2000 + * CVI_VENC_MASK_FRC 0x4000 + * CVI_VENC_MASK_BIND 0x8000 + * CVI_VENC_MASK_TRACE 0x10000 + * CVI_VENC_MASK_DUMP_YUV 0x100000 + * CVI_VENC_MASK_DUMP_BS 0x200000 + */ + char cProcInputdata[MAX_PROC_STR_SIZE] = { '\0' }; + char cVencDbgPrefix[] = "venc=0x"; // venc=debug_levle + char cVencDbgStartFrmPrefix[] = "venc_sfn="; // venc_sfn=frame_idx_begin + char cVencDbgEndFrmPrefix[] = "venc_efn="; // venc_efn=frame_idx_end + char cVencDbgDirPrefix[] = + "venc_dir="; // venc_dir=your_preference_directory + char cVencDbgNoDataTimeoutPrefix[] = + "venc_no_inputdata_timeout="; // venc_no_inputdata_timeout=timeout + proc_debug_config_t *pVencDebugConfig = + (proc_debug_config_t *)&tVencDebugConfig; + + return vcodec_proc_write_helper(user_buf, count, pVencDebugConfig, + cProcInputdata, cVencDbgPrefix, + cVencDbgStartFrmPrefix, + cVencDbgEndFrmPrefix, cVencDbgDirPrefix, + cVencDbgNoDataTimeoutPrefix); +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +static const struct proc_ops venc_proc_fops = { + .proc_open = venc_proc_open, + .proc_read = seq_read, + .proc_write = venc_proc_write, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static const struct file_operations venc_proc_fops = { + .owner = THIS_MODULE, + .open = venc_proc_open, + .read = seq_read, + .write = venc_proc_write, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +int venc_proc_init(struct device *dev) +{ + if (proc_create_data(VENC_PROC_NAME, VIDEO_PROC_PERMS, + VIDEO_PROC_PARENT, &venc_proc_fops, dev) == NULL) { + dev_err(dev, "ERROR! /proc/%s create fail\n", VENC_PROC_NAME); + remove_proc_entry(VENC_PROC_NAME, NULL); + return -1; + } + return 0; +} + +int venc_proc_deinit(void) +{ + remove_proc_entry(VENC_PROC_NAME, NULL); + return 0; +} + +static int h265e_proc_show(struct seq_file *m, void *v) +{ + int idx = 0; + CVI_VENC_PARAM_MOD_S *pVencModParam; + + seq_printf(m, "Module: [H265E] System Build Time [%s]\n", UTS_VERSION); + + if (handle == NULL) + return 0; + + pVencModParam = &handle->ModParam; + + seq_puts( + m, + "-----MODULE PARAM-------------------------------------------------\n"); + seq_printf(m, "OnePack: %u\t H265eVBSource: %d\t PowerSaveEn: %u", + pVencModParam->stH265eModParam.u32OneStreamBuffer, + pVencModParam->stH265eModParam.enH265eVBSource, + pVencModParam->stH265eModParam.u32H265ePowerSaveEn); + seq_printf( + m, + "\t MiniBufMode: %u\t bQpHstgrmEn: %u\t UserDataMaxLen: %u\n", + pVencModParam->stH265eModParam.u32H265eMiniBufMode, + pVencModParam->stH265eModParam.bQpHstgrmEn, + pVencModParam->stH265eModParam.u32UserDataMaxLen); + seq_printf(m, + "SingleEsBuf: %u\t SingleEsBufSize: %u\t RefreshType: %u\n", + pVencModParam->stH265eModParam.bSingleEsBuf, + pVencModParam->stH265eModParam.u32SingleEsBufSize, + pVencModParam->stH265eModParam.enRefreshType); + + for (idx = 0; idx < MaxVencChnNum; idx++) { + if (handle->chn_handle[idx] != NULL && + handle->chn_handle[idx]->pChnAttr->stVencAttr.enType == + PT_H265) { + char cGopMode[10] = { '\0' }; + VENC_CHN_ATTR_S *pstChnAttr = + handle->chn_handle[idx]->pChnAttr; + VENC_CHN_PARAM_S *pstChnParam = + &handle->chn_handle[idx]->pChnVars->stChnParam; + VENC_REF_PARAM_S *pstRefParam = + &handle->chn_handle[idx]->refParam; + + getGopModeStr(pstChnAttr->stGopAttr.enGopMode, + cGopMode); + + seq_puts( + m, + "-----CHN ATTR-----------------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t MaxWidth: %u\t MaxHeight: %u\t Width: %u\t Height: %u", + idx, pstChnAttr->stVencAttr.u32MaxPicWidth, + pstChnAttr->stVencAttr.u32MaxPicHeight, + pstChnAttr->stVencAttr.u32PicWidth, + pstChnAttr->stVencAttr.u32PicHeight); + seq_printf( + m, + "\t C2GEn: %d\t BufSize: %u\t ByFrame: %d\t GopMode: %s\t MaxStrCnt: %u\n", + pstChnParam->bColor2Grey, + pstChnAttr->stVencAttr.u32BufSize, + pstChnAttr->stVencAttr.bByFrame, cGopMode, + pstChnParam->u32MaxStrmCnt); + + seq_puts( + m, + "-----RefParam INFO---------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t EnPred: %s\t Base: %u\t Enhance: %u\t RcnRefShareBuf: %u\n", + idx, pstRefParam->bEnablePred ? "Y" : "N", + pstRefParam->u32Base, pstRefParam->u32Enhance, + pstChnAttr->stVencAttr.stAttrH265e + .bRcnRefShareBuf); + + seq_puts( + m, + "-----Syntax INFO---------------------------------------------\n"); + seq_printf(m, "ID: %d\t Profile: Main\n", idx); + } + } + return 0; +} + +static int h265e_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, h265e_proc_show, PDE_DATA(inode)); +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +static const struct proc_ops h265e_proc_fops = { + .proc_open = h265e_proc_open, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static const struct file_operations h265e_proc_fops = { + .owner = THIS_MODULE, + .open = h265e_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +static int codecinst_proc_show(struct seq_file *m, void *v) +{ + int idx = 0; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + + seq_printf(m, "Module: [CodecInst] System Build Time [%s]\n", UTS_VERSION); + + if (handle == NULL) + return 0; + + for (idx = 0; idx < MaxVencChnNum; idx++) { + pChnHandle = handle->chn_handle[idx]; + if (pChnHandle != NULL) { + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (pEncCtx->base.ioctl && (enType == PT_H264 || enType == PT_H265)) { + pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_GET_CHN_INFO, (CVI_VOID *)m); + } else if (pEncCtx->base.ioctl && + (enType == PT_JPEG || enType == PT_MJPEG)) { + pEncCtx->base.ioctl(pEncCtx, CVI_JPEG_OP_SHOW_CHN_INFO, (CVI_VOID *)m); + } + } + } + return 0; +} + + +static int codecinst_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, codecinst_proc_show, PDE_DATA(inode)); +} + + + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) +static const struct proc_ops codecinst_proc_fops = { + .proc_open = codecinst_proc_open, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static const struct file_operations codecinst_proc_fops = { + .owner = THIS_MODULE, + .open = codecinst_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + + +int codecinst_proc_init(struct device *dev) +{ + if (proc_create_data(CODEC_PROC_NAME, VIDEO_PROC_PERMS, + VIDEO_PROC_PARENT, &codecinst_proc_fops, + dev) == NULL) { + dev_err(dev, "ERROR! /proc/%s create fail\n", H265E_PROC_NAME); + remove_proc_entry(CODEC_PROC_NAME, NULL); + return -1; + } + return 0; +} + +int codecinst_proc_deinit(void) +{ + remove_proc_entry(CODEC_PROC_NAME, NULL); + return 0; +} + + + +int h265e_proc_init(struct device *dev) +{ + if (proc_create_data(H265E_PROC_NAME, VIDEO_PROC_PERMS, + VIDEO_PROC_PARENT, &h265e_proc_fops, + dev) == NULL) { + dev_err(dev, "ERROR! /proc/%s create fail\n", H265E_PROC_NAME); + remove_proc_entry(H265E_PROC_NAME, NULL); + return -1; + } + return 0; +} + +int h265e_proc_deinit(void) +{ + remove_proc_entry(H265E_PROC_NAME, NULL); + return 0; +} + +static int h264e_proc_show(struct seq_file *m, void *v) +{ + static const char *const prifle[] = { "Base", "Main", "High", "Svc-t", + "Err" }; + int idx = 0; + + CVI_VENC_PARAM_MOD_S *pVencModParam; + CVI_U32 u32Profile; + + seq_printf(m, "Module: [H264E] System Build Time [%s]\n", UTS_VERSION); + + if (handle == NULL) + return 0; + + pVencModParam = &handle->ModParam; + + seq_puts( + m, + "-----MODULE PARAM-------------------------------------------------\n"); + seq_printf(m, "OnePack: %u\t H264eVBSource: %d\t PowerSaveEn: %u", + pVencModParam->stH264eModParam.u32OneStreamBuffer, + pVencModParam->stH264eModParam.enH264eVBSource, + pVencModParam->stH264eModParam.u32H264ePowerSaveEn); + seq_printf(m, + "\t MiniBufMode: %u\t QpHstgrmEn: %u\t UserDataMaxLen: %u\n", + pVencModParam->stH264eModParam.u32H264eMiniBufMode, + pVencModParam->stH264eModParam.bQpHstgrmEn, + pVencModParam->stH264eModParam.u32UserDataMaxLen); + seq_printf(m, "SingleEsBuf: %u\t SingleEsBufSize: %u\n", + pVencModParam->stH264eModParam.bSingleEsBuf, + pVencModParam->stH264eModParam.u32SingleEsBufSize); + + for (idx = 0; idx < MaxVencChnNum; idx++) { + if (handle->chn_handle[idx] != NULL && + handle->chn_handle[idx]->pChnAttr->stVencAttr.enType == + PT_H264) { + char cGopMode[10] = { '\0' }; + VENC_CHN_ATTR_S *pstChnAttr = + handle->chn_handle[idx]->pChnAttr; + VENC_CHN_PARAM_S *pstChnParam = + &handle->chn_handle[idx]->pChnVars->stChnParam; + VENC_REF_PARAM_S *pstRefParam = + &handle->chn_handle[idx]->refParam; + + getGopModeStr(pstChnAttr->stGopAttr.enGopMode, + cGopMode); + + seq_puts( + m, + "-----CHN ATTR-----------------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t MaxWidth: %u\t MaxHeight: %u\t Width: %u\t Height: %u", + idx, pstChnAttr->stVencAttr.u32MaxPicWidth, + pstChnAttr->stVencAttr.u32MaxPicHeight, + pstChnAttr->stVencAttr.u32PicWidth, + pstChnAttr->stVencAttr.u32PicHeight); + seq_printf( + m, + "\t C2GEn: %d\t BufSize: %u\t ByFrame: %d\t GopMode: %s\t MaxStrCnt: %u\n", + pstChnParam->bColor2Grey, + pstChnAttr->stVencAttr.u32BufSize, + pstChnAttr->stVencAttr.bByFrame, cGopMode, + pstChnParam->u32MaxStrmCnt); + + seq_puts( + m, + "-----RefParam INFO---------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t EnPred: %s\t Base: %u\t Enhance: %u\t RcnRefShareBuf: %u\n", + idx, pstRefParam->bEnablePred ? "Y" : "N", + pstRefParam->u32Base, pstRefParam->u32Enhance, + pstChnAttr->stVencAttr.stAttrH264e + .bRcnRefShareBuf); + + seq_puts( + m, + "-----Syntax INFO---------------------------------------------\n"); + u32Profile = pstChnAttr->stVencAttr.u32Profile; + if (u32Profile >= 4) + u32Profile = 4; + + seq_printf(m, "ID: %d\t Profile: %s\n", idx, + prifle[u32Profile]); + } + } + return 0; +} + +static int h264e_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, h264e_proc_show, PDE_DATA(inode)); +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +static const struct proc_ops h264e_proc_fops = { + .proc_open = h264e_proc_open, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static const struct file_operations h264e_proc_fops = { + .owner = THIS_MODULE, + .open = h264e_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +int h264e_proc_init(struct device *dev) +{ + if (proc_create_data(H264E_PROC_NAME, VIDEO_PROC_PERMS, + VIDEO_PROC_PARENT, &h264e_proc_fops, + dev) == NULL) { + dev_err(dev, "ERROR! /proc/%s create fail\n", H264E_PROC_NAME); + remove_proc_entry(H264E_PROC_NAME, NULL); + return -1; + } + return 0; +} + +int h264e_proc_deinit(void) +{ + remove_proc_entry(H264E_PROC_NAME, NULL); + return 0; +} + +static int jpege_proc_show(struct seq_file *m, void *v) +{ + int idx = 0; + CVI_VENC_PARAM_MOD_S *pVencModParam; + + seq_printf(m, "Module: [JPEGE] System Build Time [%s]\n", UTS_VERSION); + + if (handle == NULL) + return 0; + + pVencModParam = &handle->ModParam; + + seq_puts( + m, + "-----MODULE PARAM-------------------------------------------------\n"); + seq_printf(m, "OnePack: %u\t JpegeMiniBufMode: %d", + pVencModParam->stJpegeModParam.u32OneStreamBuffer, + pVencModParam->stJpegeModParam.u32JpegeMiniBufMode); + seq_printf(m, "\t JpegClearStreamBuf: %u\t JpegeDeringMode: %u\n", + pVencModParam->stJpegeModParam.u32JpegClearStreamBuf, 0); + seq_printf(m, + "SingleEsBuf: %u\t SingleEsBufSize: %u\t JpegeFormat: %u\n", + pVencModParam->stJpegeModParam.bSingleEsBuf, + pVencModParam->stJpegeModParam.u32SingleEsBufSize, + pVencModParam->stJpegeModParam.enJpegeFormat); + seq_printf( + m, + "JpegMarkerOrder: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", + pVencModParam->stJpegeModParam.JpegMarkerOrder[0], + pVencModParam->stJpegeModParam.JpegMarkerOrder[1], + pVencModParam->stJpegeModParam.JpegMarkerOrder[2], + pVencModParam->stJpegeModParam.JpegMarkerOrder[3], + pVencModParam->stJpegeModParam.JpegMarkerOrder[4], + pVencModParam->stJpegeModParam.JpegMarkerOrder[5], + pVencModParam->stJpegeModParam.JpegMarkerOrder[6], + pVencModParam->stJpegeModParam.JpegMarkerOrder[7], + pVencModParam->stJpegeModParam.JpegMarkerOrder[8], + pVencModParam->stJpegeModParam.JpegMarkerOrder[9], + pVencModParam->stJpegeModParam.JpegMarkerOrder[10], + pVencModParam->stJpegeModParam.JpegMarkerOrder[11], + pVencModParam->stJpegeModParam.JpegMarkerOrder[12], + pVencModParam->stJpegeModParam.JpegMarkerOrder[13], + pVencModParam->stJpegeModParam.JpegMarkerOrder[14], + pVencModParam->stJpegeModParam.JpegMarkerOrder[15]); + + for (idx = 0; idx < MaxVencChnNum; idx++) { + if (handle->chn_handle[idx] != NULL && + (handle->chn_handle[idx]->pChnAttr->stVencAttr.enType == + PT_JPEG || + handle->chn_handle[idx]->pChnAttr->stVencAttr.enType == + PT_MJPEG)) { + char cGopMode[10] = { '\0' }; + char cPicType[8] = { '\0' }; + CVI_U32 u32Qfactor = 0; + + VENC_CHN_ATTR_S *pstChnAttr = + handle->chn_handle[idx]->pChnAttr; + VENC_CHN_PARAM_S *pstChnParam = + &handle->chn_handle[idx]->pChnVars->stChnParam; + VIDEO_FRAME_S *pstVFrame = + &handle->chn_handle[idx] + ->pChnVars->stFrameInfo.stVFrame; + + getGopModeStr(pstChnAttr->stGopAttr.enGopMode, + cGopMode); + getPixelFormatStr(pstVFrame->enPixelFormat, cPicType); + + if (pstChnAttr->stVencAttr.enType == PT_JPEG) { + u32Qfactor = handle->chn_handle[idx] + ->pChnVars->stJpegParam + .u32Qfactor; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_MJPEGFIXQP) { + u32Qfactor = pstChnAttr->stRcAttr.stMjpegFixQp + .u32Qfactor; + } + + seq_puts( + m, + "-----CHN ATTR-----------------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t bMjpeg: %s\t PicType: %s\t MaxWidth: %u\t MaxHeight: %u", + idx, + pstChnAttr->stVencAttr.enType == PT_MJPEG ? + "Y" : + "N", + cPicType, pstChnAttr->stVencAttr.u32MaxPicWidth, + pstChnAttr->stVencAttr.u32MaxPicHeight); + seq_printf( + m, + "\t Width: %u\t Height: %u\t BufSize: %u\t ByFrm: %d", + pstChnAttr->stVencAttr.u32PicWidth, + pstChnAttr->stVencAttr.u32PicHeight, + pstChnAttr->stVencAttr.u32BufSize, + pstChnAttr->stVencAttr.bByFrame); + seq_printf( + m, + "\t MCU: %d\t Qfactor: %u\t C2GEn: %d\t DcfEn: %d\n", + 1, u32Qfactor, pstChnParam->bColor2Grey, 0); + } + } + return 0; +} + +static int jpege_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, jpege_proc_show, PDE_DATA(inode)); +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +static const struct proc_ops jpege_proc_fops = { + .proc_open = jpege_proc_open, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static const struct file_operations jpege_proc_fops = { + .owner = THIS_MODULE, + .open = jpege_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +int jpege_proc_init(struct device *dev) +{ + if (proc_create_data(JPEGE_PROC_NAME, VIDEO_PROC_PERMS, + VIDEO_PROC_PARENT, &jpege_proc_fops, + dev) == NULL) { + dev_err(dev, "ERROR! /proc/%s create fail\n", JPEGE_PROC_NAME); + remove_proc_entry(JPEGE_PROC_NAME, NULL); + return -1; + } + return 0; +} + +int jpege_proc_deinit(void) +{ + remove_proc_entry(JPEGE_PROC_NAME, NULL); + return 0; +} + +static int rc_proc_show(struct seq_file *m, void *v) +{ + int idx = 0; + + seq_printf(m, "Module: [RC] System Build Time [%s]\n", UTS_VERSION); + + if (handle == NULL) + return 0; + + for (idx = 0; idx < MaxVencChnNum; idx++) { + if (handle->chn_handle[idx] != NULL) { + char cCodecType[16] = { '\0' }; + char cRcMode[8] = { '\0' }; + char cQpMapMode[8] = { '\0' }; + char cGopMode[10] = { '\0' }; + CVI_U32 u32Gop = 0; + CVI_U32 u32StatTime = 0; + CVI_U32 u32SrcFrameRate = 0; + CVI_FR32 fr32DstFrameRate = 0; + CVI_U32 u32BitRate = 0; + CVI_U32 u32IQp = 0; + CVI_U32 u32PQp = 0; + CVI_U32 u32BQp = 0; + CVI_U32 u32Qfactor = 0; + CVI_U32 u32MinIprop = 0; + CVI_U32 u32MaxIprop = 0; + CVI_U32 u32MaxQp = 0; + CVI_U32 u32MinQp = 0; + CVI_U32 u32MaxIQp = 0; + CVI_U32 u32MinIQp = 0; + CVI_BOOL bQpMapEn = CVI_FALSE; + CVI_BOOL bVariFpsEn = CVI_FALSE; + CVI_S32 s32IPQpDelta = 0; + CVI_U32 u32SPInterval = 0; + CVI_S32 s32SPQpDelta = 0; + CVI_U32 u32BgInterval = 0; + CVI_S32 s32BgQpDelta = 0; + CVI_S32 s32ViQpDelta = 0; + CVI_U32 u32BFrmNum = 0; + CVI_S32 s32BQpDelta = 0; + CVI_S32 s32MaxReEncodeTimes = 0; + CVI_S32 s32ChangePos = 0; + CVI_U32 u32MaxQfactor = 0; + CVI_U32 u32MinQfactor = 0; + VENC_RC_QPMAP_MODE_E enQpMapMode = + VENC_RC_QPMAP_MODE_BUTT + 1; + CVI_S32 s32MinStillPercent = 0; + CVI_U32 u32MaxStillQP = 0; + CVI_U32 u32MinStillPSNR = 0; + CVI_U32 u32MinQpDelta = 0; + CVI_U32 u32MotionSensitivity = 0; + CVI_S32 s32AvbrFrmLostOpen = 0; + CVI_S32 s32AvbrFrmGap = 0; + PAYLOAD_TYPE_E enType; + + venc_enc_ctx *pEncCtx = &handle->chn_handle[idx]->encCtx; + VENC_CHN_ATTR_S *pstChnAttr = + handle->chn_handle[idx]->pChnAttr; + VENC_RC_PARAM_S *pRcParam = + &handle->chn_handle[idx]->rcParam; + VENC_SUPERFRAME_CFG_S *pstSuperFrmParam = + &handle->chn_handle[idx] + ->pChnVars->stSuperFrmParam; + + enType = pstChnAttr->stVencAttr.enType; + getCodecTypeStr(pstChnAttr->stVencAttr.enType, + cCodecType); + getGopModeStr(pstChnAttr->stGopAttr.enGopMode, + cGopMode); + getFrameRate(pstChnAttr, &u32SrcFrameRate, + &fr32DstFrameRate); + + switch (pstChnAttr->stGopAttr.enGopMode) { + case VENC_GOPMODE_NORMALP: + s32IPQpDelta = pstChnAttr->stGopAttr.stNormalP + .s32IPQpDelta; + break; + case VENC_GOPMODE_DUALP: + u32SPInterval = pstChnAttr->stGopAttr.stDualP + .u32SPInterval; + s32SPQpDelta = pstChnAttr->stGopAttr.stDualP + .s32SPQpDelta; + s32IPQpDelta = pstChnAttr->stGopAttr.stDualP + .s32IPQpDelta; + break; + case VENC_GOPMODE_SMARTP: + u32BgInterval = pstChnAttr->stGopAttr.stSmartP + .u32BgInterval; + s32BgQpDelta = pstChnAttr->stGopAttr.stSmartP + .s32BgQpDelta; + s32ViQpDelta = pstChnAttr->stGopAttr.stSmartP + .s32ViQpDelta; + break; + case VENC_GOPMODE_ADVSMARTP: + u32BgInterval = + pstChnAttr->stGopAttr.stAdvSmartP + .u32BgInterval; + s32BgQpDelta = pstChnAttr->stGopAttr.stAdvSmartP + .s32BgQpDelta; + s32ViQpDelta = pstChnAttr->stGopAttr.stAdvSmartP + .s32ViQpDelta; + break; + case VENC_GOPMODE_BIPREDB: + u32BFrmNum = pstChnAttr->stGopAttr.stBipredB + .u32BFrmNum; + s32BQpDelta = pstChnAttr->stGopAttr.stBipredB + .s32BQpDelta; + s32IPQpDelta = pstChnAttr->stGopAttr.stBipredB + .s32IPQpDelta; + break; + default: + break; + } + + if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264CBR) { + strcpy(cRcMode, "CBR"); + u32Gop = pstChnAttr->stRcAttr.stH264Cbr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH264Cbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH264Cbr + .u32BitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stH264Cbr + .bVariFpsEn; + + u32MinIprop = + pRcParam->stParamH264Cbr.u32MinIprop; + u32MaxIprop = + pRcParam->stParamH264Cbr.u32MaxIprop; + u32MaxQp = pRcParam->stParamH264Cbr.u32MaxQp; + u32MinQp = pRcParam->stParamH264Cbr.u32MinQp; + u32MaxIQp = pRcParam->stParamH264Cbr.u32MaxIQp; + u32MinIQp = pRcParam->stParamH264Cbr.u32MinIQp; + s32MaxReEncodeTimes = + pRcParam->stParamH264Cbr + .s32MaxReEncodeTimes; + bQpMapEn = pRcParam->stParamH264Cbr.bQpMapEn; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265CBR) { + strcpy(cRcMode, "CBR"); + u32Gop = pstChnAttr->stRcAttr.stH265Cbr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH265Cbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH265Cbr + .u32BitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stH265Cbr + .bVariFpsEn; + + u32MinIprop = + pRcParam->stParamH265Cbr.u32MinIprop; + u32MaxIprop = + pRcParam->stParamH265Cbr.u32MaxIprop; + u32MaxQp = pRcParam->stParamH265Cbr.u32MaxQp; + u32MinQp = pRcParam->stParamH265Cbr.u32MinQp; + u32MaxIQp = pRcParam->stParamH265Cbr.u32MaxIQp; + u32MinIQp = pRcParam->stParamH265Cbr.u32MinIQp; + s32MaxReEncodeTimes = + pRcParam->stParamH265Cbr + .s32MaxReEncodeTimes; + bQpMapEn = pRcParam->stParamH265Cbr.bQpMapEn; + enQpMapMode = + pRcParam->stParamH265Cbr.enQpMapMode; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_MJPEGCBR) { + strcpy(cRcMode, "CBR"); + u32StatTime = pstChnAttr->stRcAttr.stMjpegCbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stMjpegCbr + .u32BitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stMjpegCbr + .bVariFpsEn; + + u32MaxQfactor = + pRcParam->stParamMjpegCbr.u32MaxQfactor; + u32MinQfactor = + pRcParam->stParamMjpegCbr.u32MinQfactor; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264VBR) { + strcpy(cRcMode, "VBR"); + u32Gop = pstChnAttr->stRcAttr.stH264Vbr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH264Vbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH264Vbr + .u32MaxBitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stH264Vbr + .bVariFpsEn; + + s32ChangePos = + pRcParam->stParamH264Vbr.s32ChangePos; + u32MinIprop = + pRcParam->stParamH264Vbr.u32MinIprop; + u32MaxIprop = + pRcParam->stParamH264Vbr.u32MaxIprop; + u32MaxQp = pRcParam->stParamH264Vbr.u32MaxQp; + u32MinQp = pRcParam->stParamH264Vbr.u32MinQp; + u32MaxIQp = pRcParam->stParamH264Vbr.u32MaxIQp; + u32MinIQp = pRcParam->stParamH264Vbr.u32MinIQp; + bQpMapEn = pRcParam->stParamH264Vbr.bQpMapEn; + s32MaxReEncodeTimes = + pRcParam->stParamH264Vbr + .s32MaxReEncodeTimes; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265VBR) { + strcpy(cRcMode, "VBR"); + u32Gop = pstChnAttr->stRcAttr.stH265Vbr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH265Vbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH265Vbr + .u32MaxBitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stH265Vbr + .bVariFpsEn; + + s32ChangePos = + pRcParam->stParamH265Vbr.s32ChangePos; + u32MinIprop = + pRcParam->stParamH265Vbr.u32MinIprop; + u32MaxIprop = + pRcParam->stParamH265Vbr.u32MaxIprop; + u32MaxQp = pRcParam->stParamH265Vbr.u32MaxQp; + u32MinQp = pRcParam->stParamH265Vbr.u32MinQp; + u32MaxIQp = pRcParam->stParamH265Vbr.u32MaxIQp; + u32MinIQp = pRcParam->stParamH265Vbr.u32MinIQp; + bQpMapEn = pRcParam->stParamH265Vbr.bQpMapEn; + s32MaxReEncodeTimes = + pRcParam->stParamH265Vbr + .s32MaxReEncodeTimes; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_MJPEGVBR) { + strcpy(cRcMode, "VBR"); + u32StatTime = pstChnAttr->stRcAttr.stMjpegVbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stMjpegVbr + .u32MaxBitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stMjpegVbr + .bVariFpsEn; + + s32ChangePos = + pRcParam->stParamMjpegVbr.s32ChangePos; + u32MaxQfactor = + pRcParam->stParamMjpegVbr.u32MaxQfactor; + u32MinQfactor = + pRcParam->stParamMjpegVbr.u32MinQfactor; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264FIXQP) { + strcpy(cRcMode, "FIXQP"); + u32Gop = + pstChnAttr->stRcAttr.stH264FixQp.u32Gop; + u32IQp = + pstChnAttr->stRcAttr.stH264FixQp.u32IQp; + u32PQp = + pstChnAttr->stRcAttr.stH264FixQp.u32PQp; + u32BQp = + pstChnAttr->stRcAttr.stH264FixQp.u32BQp; + bVariFpsEn = pstChnAttr->stRcAttr.stH264FixQp + .bVariFpsEn; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265FIXQP) { + strcpy(cRcMode, "FIXQP"); + u32Gop = + pstChnAttr->stRcAttr.stH265FixQp.u32Gop; + u32IQp = + pstChnAttr->stRcAttr.stH265FixQp.u32IQp; + u32PQp = + pstChnAttr->stRcAttr.stH265FixQp.u32PQp; + u32BQp = + pstChnAttr->stRcAttr.stH265FixQp.u32BQp; + bVariFpsEn = pstChnAttr->stRcAttr.stH265FixQp + .bVariFpsEn; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_MJPEGFIXQP) { + strcpy(cRcMode, "FIXQP"); + u32Qfactor = pstChnAttr->stRcAttr.stMjpegFixQp + .u32Qfactor; + bVariFpsEn = pstChnAttr->stRcAttr.stMjpegFixQp + .bVariFpsEn; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264AVBR) { + strcpy(cRcMode, "AVBR"); + u32Gop = pstChnAttr->stRcAttr.stH264AVbr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH264AVbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH264AVbr + .u32MaxBitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stH264AVbr + .bVariFpsEn; + + s32ChangePos = + pRcParam->stParamH264AVbr.s32ChangePos; + u32MinIprop = + pRcParam->stParamH264AVbr.u32MinIprop; + u32MaxIprop = + pRcParam->stParamH264AVbr.u32MaxIprop; + s32MinStillPercent = + pRcParam->stParamH264AVbr + .s32MinStillPercent; + u32MaxStillQP = + pRcParam->stParamH264AVbr.u32MaxStillQP; + u32MinStillPSNR = pRcParam->stParamH264AVbr + .u32MinStillPSNR; + u32MaxQp = pRcParam->stParamH264AVbr.u32MaxQp; + u32MinQp = pRcParam->stParamH264AVbr.u32MinQp; + u32MaxIQp = pRcParam->stParamH264AVbr.u32MaxIQp; + u32MinIQp = pRcParam->stParamH264AVbr.u32MinIQp; + u32MinQpDelta = + pRcParam->stParamH264AVbr.u32MinQpDelta; + u32MotionSensitivity = + pRcParam->stParamH264AVbr + .u32MotionSensitivity; + s32AvbrFrmLostOpen = + pRcParam->stParamH264AVbr + .s32AvbrFrmLostOpen; + s32AvbrFrmGap = + pRcParam->stParamH264AVbr.s32AvbrFrmGap; + u32MinStillPSNR = pRcParam->stParamH264AVbr + .s32AvbrPureStillThr; + bQpMapEn = pRcParam->stParamH264AVbr.bQpMapEn; + s32MaxReEncodeTimes = + pRcParam->stParamH264AVbr + .s32MaxReEncodeTimes; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265AVBR) { + strcpy(cRcMode, "AVBR"); + u32Gop = pstChnAttr->stRcAttr.stH265AVbr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH265AVbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH265AVbr + .u32MaxBitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stH265AVbr + .bVariFpsEn; + + s32ChangePos = + pRcParam->stParamH265AVbr.s32ChangePos; + u32MinIprop = + pRcParam->stParamH265AVbr.u32MinIprop; + u32MaxIprop = + pRcParam->stParamH265AVbr.u32MaxIprop; + s32MinStillPercent = + pRcParam->stParamH265AVbr + .s32MinStillPercent; + u32MaxStillQP = + pRcParam->stParamH265AVbr.u32MaxStillQP; + u32MinStillPSNR = pRcParam->stParamH265AVbr + .u32MinStillPSNR; + u32MaxQp = pRcParam->stParamH265AVbr.u32MaxQp; + u32MinQp = pRcParam->stParamH265AVbr.u32MinQp; + u32MaxIQp = pRcParam->stParamH265AVbr.u32MaxIQp; + u32MinIQp = pRcParam->stParamH265AVbr.u32MinIQp; + u32MinQpDelta = + pRcParam->stParamH265AVbr.u32MinQpDelta; + u32MotionSensitivity = + pRcParam->stParamH265AVbr + .u32MotionSensitivity; + s32AvbrFrmLostOpen = + pRcParam->stParamH265AVbr + .s32AvbrFrmLostOpen; + s32AvbrFrmGap = + pRcParam->stParamH265AVbr.s32AvbrFrmGap; + u32MinStillPSNR = pRcParam->stParamH265AVbr + .s32AvbrPureStillThr; + bQpMapEn = pRcParam->stParamH265AVbr.bQpMapEn; + s32MaxReEncodeTimes = + pRcParam->stParamH265AVbr + .s32MaxReEncodeTimes; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264QVBR) { + strcpy(cRcMode, "QVBR"); + u32Gop = pstChnAttr->stRcAttr.stH264QVbr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH264QVbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH264QVbr + .u32TargetBitRate; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265QVBR) { + strcpy(cRcMode, "QVBR"); + u32Gop = pstChnAttr->stRcAttr.stH265QVbr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH265QVbr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH265QVbr + .u32TargetBitRate; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264QPMAP) { + strcpy(cRcMode, "QPMAP"); + u32Gop = + pstChnAttr->stRcAttr.stH264QpMap.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH264QpMap + .u32StatTime; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265QPMAP) { + strcpy(cRcMode, "QPMAP"); + u32Gop = + pstChnAttr->stRcAttr.stH265QpMap.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH265QpMap + .u32StatTime; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264UBR) { + strcpy(cRcMode, "UBR"); + u32Gop = pstChnAttr->stRcAttr.stH264Ubr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH264Ubr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH264Ubr + .u32BitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stH264Ubr + .bVariFpsEn; + + u32MinIprop = + pRcParam->stParamH264Ubr.u32MinIprop; + u32MaxIprop = + pRcParam->stParamH264Ubr.u32MaxIprop; + u32MaxQp = pRcParam->stParamH264Ubr.u32MaxQp; + u32MinQp = pRcParam->stParamH264Ubr.u32MinQp; + u32MaxIQp = pRcParam->stParamH264Ubr.u32MaxIQp; + u32MinIQp = pRcParam->stParamH264Ubr.u32MinIQp; + s32MaxReEncodeTimes = + pRcParam->stParamH264Ubr + .s32MaxReEncodeTimes; + bQpMapEn = pRcParam->stParamH264Ubr.bQpMapEn; + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265UBR) { + strcpy(cRcMode, "UBR"); + u32Gop = pstChnAttr->stRcAttr.stH265Ubr.u32Gop; + u32StatTime = pstChnAttr->stRcAttr.stH265Ubr + .u32StatTime; + u32BitRate = pstChnAttr->stRcAttr.stH265Ubr + .u32BitRate; + bVariFpsEn = pstChnAttr->stRcAttr.stH265Ubr + .bVariFpsEn; + + u32MinIprop = + pRcParam->stParamH265Ubr.u32MinIprop; + u32MaxIprop = + pRcParam->stParamH265Ubr.u32MaxIprop; + u32MaxQp = pRcParam->stParamH265Ubr.u32MaxQp; + u32MinQp = pRcParam->stParamH265Ubr.u32MinQp; + u32MaxIQp = pRcParam->stParamH265Ubr.u32MaxIQp; + u32MinIQp = pRcParam->stParamH265Ubr.u32MinIQp; + s32MaxReEncodeTimes = + pRcParam->stParamH265Ubr + .s32MaxReEncodeTimes; + bQpMapEn = pRcParam->stParamH265Ubr.bQpMapEn; + enQpMapMode = + pRcParam->stParamH265Ubr.enQpMapMode; + } else { + strcpy(cRcMode, "N/A"); + } + + switch (enQpMapMode) { + case VENC_RC_QPMAP_MODE_MEANQP: + strcpy(cQpMapMode, "MEANQP"); + break; + case VENC_RC_QPMAP_MODE_MINQP: + strcpy(cQpMapMode, "MINQP"); + break; + case VENC_RC_QPMAP_MODE_MAXQP: + strcpy(cQpMapMode, "MAXQP"); + break; + case VENC_RC_QPMAP_MODE_BUTT: + strcpy(cQpMapMode, "BUTT"); + break; + default: + strcpy(cQpMapMode, "N/A"); + break; + } + + seq_puts( + m, + "------BASE PARAMS 1------------------------------------------------------\n"); + seq_printf( + m, + "ChnId: %d\t Gop: %u\t StatTm: %u\t ViFr: %u\t TrgFr: %u\t ProType: %s", + idx, u32Gop, u32StatTime, u32SrcFrameRate, + fr32DstFrameRate, cCodecType); + seq_printf( + m, + "\t RcMode: %s\t Br(kbps): %u\t FluLev: %d\t IQp: %u\t PQp: %u\t BQp: %u\n", + cRcMode, u32BitRate, 0, u32IQp, u32PQp, u32BQp); + + seq_puts( + m, + "------BASE PARAMS 2------------------------------------------------------\n"); + seq_printf( + m, + "ChnId: %d\t MinQp: %u\t MaxQp: %u\t MinIQp: %u\t MaxIQp: %u", + idx, u32MinQp, u32MaxQp, u32MinIQp, u32MaxIQp); + seq_printf( + m, + "\t EnableIdr: %d\t bQpMapEn: %d\t QpMapMode: %s\n", + 0, bQpMapEn, cQpMapMode); + seq_printf(m, "u32RowQpDelta: %d\t", + pRcParam->u32RowQpDelta); + seq_printf( + m, + "InitialDelay: %d\t VariFpsEn: %d\t ThrdLv: %d\t BgEnhanceEn: %d\t BgDeltaQp: %d\n", + pRcParam->s32InitialDelay, bVariFpsEn, + pRcParam->u32ThrdLv, pRcParam->bBgEnhanceEn, + pRcParam->s32BgDeltaQp); + + seq_puts( + m, + "-----GOP MODE ATTR-------------------------------------------------------\n"); + seq_printf( + m, + "ChnId: %d\t GopMode: %s\t IpQpDelta: %d\t SPInterval: %u\t SPQpDelta: %d", + idx, cGopMode, s32IPQpDelta, u32SPInterval, + s32SPQpDelta); + seq_printf( + m, + "\t BFrmNum: %u\t BQpDelta: %d\t BgInterval: %u\t ViQpDelta: %d\n", + u32BFrmNum, s32BQpDelta, u32BgInterval, + s32ViQpDelta); + + if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264CBR || + pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265CBR) { + seq_puts( + m, + "-----SUPER FRAME PARAM -------------------------------------------\n"); + seq_printf( + m, + "ChnId: %d\t FrmMode: %d\t IFrmBitsThr: %d\t PFrmBitsThr: %d\n", + idx, pstSuperFrmParam->enSuperFrmMode, + pstSuperFrmParam->u32SuperIFrmBitsThr, + pstSuperFrmParam->u32SuperPFrmBitsThr); + + seq_puts( + m, + "-----RUN CBR PARAM -------------------------------------------\n"); + seq_printf( + m, + "ChnId: %d\t MinIprop: %u\t MaxIprop: %u\t MaxQp: %u\t MinQp: %u", + idx, u32MinIprop, u32MaxIprop, u32MaxQp, + u32MinQp); + seq_printf( + m, + "\t MaxIQp: %u\t MinIQp: %u\t MaxReEncTimes: %d\n", + u32MaxIQp, u32MinIQp, + s32MaxReEncodeTimes); + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264VBR || + pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265VBR) { + seq_puts( + m, + "-----RUN VBR PARAM -------------------------------------------\n"); + seq_printf( + m, + "ChnId: %d\t ChgPs: %d\t MinIprop: %u\t MaxIprop: %u\t MaxQp: %u", + idx, s32ChangePos, u32MinIprop, + u32MaxIprop, u32MaxQp); + seq_printf( + m, + "\t MinQp: %u\t MaxIQp: %u\t MinIQp: %u\t MaxReEncTimes: %d\n", + u32MinQp, u32MaxIQp, u32MinIQp, + s32MaxReEncodeTimes); + } else if (pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264AVBR || + pstChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265AVBR) { + seq_puts( + m, + "-----RUN AVBR PARAM -------------------------------------------\n"); + seq_printf( + m, + "ChnId: %d\t ChgPs: %d\t MinIprop: %u\t MaxIprop: %u\t MaxQp: %u", + idx, s32ChangePos, u32MinIprop, + u32MaxIprop, u32MaxQp); + seq_printf( + m, + "\t MinQp: %u\t MaxIQp: %u\t MinIQp: %u\t MaxReEncTimes: %d\n", + u32MinQp, u32MaxIQp, u32MinIQp, + s32MaxReEncodeTimes); + seq_printf( + m, + "MinStillPercent: %d\t MaxStillQP: %u\t MinStillPSNR: %u\t MinQpDelta: %u\n", + s32MinStillPercent, u32MaxStillQP, + u32MinStillPSNR, u32MinQpDelta); + seq_printf( + m, + "MotionSensitivity: %u\t AvbrFrmLostOpen: %d\t AvbrFrmGap: %d\t bQpMapEn: %d\n", + u32MotionSensitivity, + s32AvbrFrmLostOpen, s32AvbrFrmGap, + bQpMapEn); + if (pEncCtx->base.ioctl && (enType == PT_H264 || enType == PT_H265)) + pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_GET_RC_REAL_INFO, (CVI_VOID *)m); + } + } + } + return 0; +} + +static int rc_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, rc_proc_show, PDE_DATA(inode)); +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +static const struct proc_ops rc_proc_fops = { + .proc_open = rc_proc_open, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static const struct file_operations rc_proc_fops = { + .owner = THIS_MODULE, + .open = rc_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +int rc_proc_init(struct device *dev) +{ + if (proc_create_data(RC_PROC_NAME, VIDEO_PROC_PERMS, VIDEO_PROC_PARENT, + &rc_proc_fops, dev) == NULL) { + dev_err(dev, "ERROR! /proc/%s create fail\n", RC_PROC_NAME); + remove_proc_entry(RC_PROC_NAME, NULL); + return -1; + } + return 0; +} + +int rc_proc_deinit(void) +{ + remove_proc_entry(RC_PROC_NAME, NULL); + return 0; +} +#ifdef ENABLE_DEC +static int vdec_proc_show(struct seq_file *m, void *v) +{ + seq_printf(m, "Module: [VDEC] System Build Time [%s]\n", UTS_VERSION); + if (vdec_handle != NULL && MaxVdecChnNum > 0) { + int idx; + VDEC_MOD_PARAM_S *pVdecModParam = &vdec_handle->g_stModParam; + + seq_printf( + m, + "VdecMaxChnNum: %u\t MiniBufMode: %u\t enVdecVBSource: %d\t ParallelMode: %u\n", + MaxVdecChnNum, pVdecModParam->u32MiniBufMode, + pVdecModParam->enVdecVBSource, + pVdecModParam->u32ParallelMode); + + seq_printf( + m, + "MaxPicWidth: %u\t MaxPicHeight: %u\t MaxSliceNum: %u", + pVdecModParam->stVideoModParam.u32MaxPicWidth, + pVdecModParam->stVideoModParam.u32MaxPicHeight, + pVdecModParam->stVideoModParam.u32MaxSliceNum); + seq_printf( + m, + "\t VdhMsgNum: %u\t VdhBinSize: %u\t VdhExtMemLevel: %u", + pVdecModParam->stVideoModParam.u32VdhMsgNum, + pVdecModParam->stVideoModParam.u32VdhBinSize, + pVdecModParam->stVideoModParam.u32VdhExtMemLevel); + seq_printf(m, "\t MaxJpegeWidth: %u\t MaxJpegeHeight: %u", + pVdecModParam->stPictureModParam.u32MaxPicWidth, + pVdecModParam->stPictureModParam.u32MaxPicHeight); + seq_printf( + m, + "\t SupportProgressive: %d\t DynamicAllocate: %d\t CapStrategy: %d\n", + pVdecModParam->stPictureModParam.bSupportProgressive, + pVdecModParam->stPictureModParam.bDynamicAllocate, + pVdecModParam->stPictureModParam.enCapStrategy); + + for (idx = 0; idx < MaxVdecChnNum; idx++) { + if (vdec_handle && + vdec_handle->chn_handle[idx] != NULL) { + char cCodecType[16] = { '\0' }; + char cDecMode[8] = { '\0' }; + char cOutputOrder[8] = { '\0' }; + char cCompressMode[8] = { '\0' }; + char cPixelFormat[8] = { '\0' }; + + vdec_chn_context *pChnHandle = + vdec_handle->chn_handle[idx]; + + VDEC_CHN_ATTR_S *pstChnAttr = + &pChnHandle->ChnAttr; + VDEC_CHN_PARAM_S *pstChnParam = + &pChnHandle->ChnParam; + + VIDEO_FRAME_S *pstFrame = + &pChnHandle->stVideoFrameInfo.stVFrame; + + getCodecTypeStr(pstChnAttr->enType, cCodecType); + getPixelFormatStr(pstFrame->enPixelFormat, + cPixelFormat); + + switch (pstChnParam->stVdecVideoParam.enDecMode) { + case VIDEO_DEC_MODE_IP: + strcpy(cDecMode, "IP"); + break; + case VIDEO_DEC_MODE_I: + strcpy(cDecMode, "I"); + break; + case VIDEO_DEC_MODE_BUTT: + strcpy(cDecMode, "BUTT"); + break; + case VIDEO_DEC_MODE_IPB: + default: + strcpy(cDecMode, "IPB"); + break; + } + + switch (pstChnParam->stVdecVideoParam + .enOutputOrder) { + case VIDEO_OUTPUT_ORDER_DEC: + strcpy(cOutputOrder, "DEC"); + break; + case VIDEO_OUTPUT_ORDER_BUTT: + strcpy(cOutputOrder, "BUTT"); + break; + case VIDEO_OUTPUT_ORDER_DISP: + default: + strcpy(cOutputOrder, "DISP"); + break; + } + + switch (pstChnParam->stVdecVideoParam + .enCompressMode) { + case COMPRESS_MODE_TILE: + strcpy(cCompressMode, "TILE"); + break; + case COMPRESS_MODE_LINE: + strcpy(cCompressMode, "LINE"); + break; + case COMPRESS_MODE_FRAME: + strcpy(cCompressMode, "FRAME"); + break; + case COMPRESS_MODE_BUTT: + strcpy(cCompressMode, "BUTT"); + break; + case COMPRESS_MODE_NONE: + default: + strcpy(cCompressMode, "NONE"); + break; + } + + seq_puts( + m, + "----- CHN COMM ATTR & PARAMS --------------------------------------\n"); + seq_printf( + m, + "ID: %d\t TYPE: %s\t MaxW: %u\t MaxH: %u\t Width: %u\t Height: %u", + idx, cCodecType, MAX_DEC_PIC_WIDTH, + MAX_DEC_PIC_HEIGHT, pstFrame->u32Width, + pstFrame->u32Height); + seq_printf( + m, + "\t Stride: %u\t PixelFormat: %s\t PTS: %llu\t PA: 0x%llx\n", + pstFrame->u32Stride[0], cPixelFormat, + pstFrame->u64PTS, + pstFrame->u64PhyAddr[0]); + + getPixelFormatStr(pstChnParam->enPixelFormat, + cPixelFormat); + seq_printf( + m, + "StrInputMode: %s\t StrBufSize: %u\t FrmBufSize: %u\t ParamPixelFormat %s", + "FRAME/NOBLOCK", + pstChnAttr->u32StreamBufSize, + pstChnAttr->u32FrameBufSize, + cPixelFormat); + seq_printf( + m, + "\t FrmBufCnt: %u\t TmvBufSize: %u\n", + pstChnAttr->u32FrameBufCnt, + pstChnAttr->stVdecVideoAttr + .u32TmvBufSize); + + seq_printf( + m, + "ID: %d\t DispNum: %d\t DispMode: %s\t SetUserPic: %s\t EnUserPic: %s", + idx, 2, "PLAYBACK", "N", "N"); + seq_printf( + m, + "\t Rotation: %u\t PicPoolId: %d\t TmvPoolId: %d\t STATE: %s\n", + 0, -1, -1, "START"); + + seq_puts( + m, + "----- CHN VIDEO ATTR & PARAMS -------------------------------------\n"); + seq_printf( + m, + "ID: %d\t VfmwID: %d\t RefNum: %u\t TemporalMvp: %s\t ErrThr: %d", + idx, + pstChnAttr->enType == PT_H265 ? 0 : 1, + pstChnAttr->stVdecVideoAttr + .u32RefFrameNum, + pstChnAttr->stVdecVideoAttr + .bTemporalMvpEnable ? + "Y" : + "N", + pstChnParam->stVdecVideoParam + .s32ErrThreshold); + seq_printf( + m, + "\t DecMode: %s\t OutPutOrder: %s\t Compress: %s\t VideoFormat: %d", + cDecMode, cOutputOrder, cCompressMode, + pstChnParam->stVdecVideoParam + .enVideoFormat); + seq_printf( + m, + "\t MaxVPS: %u\t MaxSPS: %u\t MaxPPS: %u\t MaxSlice: %u\n", + 0, 0, 0, + pVdecModParam->stVideoModParam + .u32MaxSliceNum); + + seq_puts( + m, + "----- CHN PICTURE ATTR & PARAMS---------------------------------\n"); + seq_printf(m, "ID: %d\t Alpha: %u\n", idx, + pstChnParam->stVdecPictureParam + .u32Alpha); + +// TODO: following info should be amended later +#if 0 + seq_puts(m, "----- CHN STATE -------------------------------------------------\n"); + seq_printf(m, "ID: %d\t PrtclErr: %u\t StrmUnSP: %u\t StrmError: %u\t RefNumErr: %u", + idx, 0, 0, 0, 0); + seq_printf(m, "\t PicSizeErr: %u\t Fmterror: %u\t PicBufSizeErr: %u", + 0, 0, 0); + seq_printf(m, "\t StrSizeOver: %u\t Notify: %u\t UniqueId: %u\t State: %u\n", + 0, 0, 0, 0); + seq_printf(m, "ID: %d\t fps: %d\t TimerCnt: %u\t BufFLen: %u\t DataLen: %u", + idx, 30, 0, 0, 0); + seq_printf(m, "\t RdRegionLen: %u\t SCDLeftLen: %u\t WrRegionLen: %u\t ptsBufF: %u", + 0, 0, 0, 0); + seq_printf(m, "\t ptsBufU: %u\t StreamEnd: %u\t FrameEnd: %u\n", + 0, 0, 0); + + seq_puts(m, "----- Detail Stream STATE -----------------------------------------\n"); + seq_printf(m, "ID: %d\t MpiSndNum: %u\t MpiSndLen: %u\t VdecNum: %u\t VdecLen: %u", + idx, 0, 0, 0, 0); + seq_printf(m, "\t FmGetNum: %u\t FmGetLen: %u\t FmRlsNum: %u\t FmRlsLen: %u\n", + 0, 0, 0, 0); + + seq_printf(m, "ID: %d\t FmLstGet: %d\t FmRlsFail: %d\n", idx, 0, 0); + + seq_puts(m, "----- Detail FrameStore STATE ---------------------------------\n"); + seq_puts(m, "NOT SUPPORTED\n"); + + seq_puts(m, "----- Detail UserData STATE ----------------------------------------\n"); + seq_printf(m, "ID: %d\t Enable: %d\t MaxUserDataLen: %u\n", + idx, 1, 1024); + seq_printf(m, "ID: %d\t MpiGet: %d\t MpiGetLen: %u\t MpiRls: %d\t MpiRlsLen: %d", + idx, 0, 0, 0, 0); + seq_printf(m, "\t Discard: %d\t DiscardLen: %d\t GetFromFm: %d", 0, 0, 0); + seq_printf(m, "\t GetFromFmLen: %d\t UsrFLen: %d\t UsrLen: %d\n", 0, 0, 0); +#endif + + seq_puts( + m, + "-----VDEC CHN PERFORMANCE------------------------------------------------\n"); + seq_printf( + m, + "ID: %d\t No.SendStreamPerSec: %u\t No.DecFramePerSec: %u\t HwDecTime: %llu us\n\n", + idx, pChnHandle->stFPS.u32InFPS, + pChnHandle->stFPS.u32OutFPS, + pChnHandle->stFPS.u64HwTime); + } + } + } + + seq_puts( + m, + "\n----- CVITEK Debug Level STATE ----------------------------------------\n"); + seq_printf( + m, + "VdecDebugMask: 0x%X\t VdecStartFrmIdx: %u\t VdecEndFrmIdx: %u\t VdecDumpPath: %s\n", + tVdecDebugConfig.u32DbgMask, tVdecDebugConfig.u32StartFrmIdx, + tVdecDebugConfig.u32EndFrmIdx, tVdecDebugConfig.cDumpPath); + return 0; +} + +static int vdec_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, vdec_proc_show, PDE_DATA(inode)); +} + +static ssize_t vdec_proc_write(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + /* debug_level list, please refer to: cvi_comm_vdec.h + * CVI_VDEC_MASK_ERR 0x1 + * CVI_VDEC_MASK_WARN 0x2 + * CVI_VDEC_MASK_INFO 0x4 + * CVI_VDEC_MASK_FLOW 0x8 + * CVI_VDEC_MASK_DBG 0x10 + * CVI_VDEC_MASK_BS 0x100 + * CVI_VDEC_MASK_SRC 0x200 + * CVI_VDEC_MASK_API 0x400 + * CVI_VDEC_MASK_DISP 0x800 + * CVI_VDEC_MASK_PERF 0x1000 + * CVI_VDEC_MASK_CFG 0x2000 + * CVI_VDEC_MASK_TRACE 0x4000 + * CVI_VDEC_MASK_DUMP_YUV 0x10000 + * CVI_VDEC_MASK_DUMP_BS 0x20000 + */ + char cProcInputdata[MAX_PROC_STR_SIZE] = { '\0' }; + char cVdecDbgPrefix[] = "vdec=0x"; // vdec=debug_levle + char cVdecDbgStartFrmPrefix[] = "vdec_sfn="; // vdec_sfn=frame_idx_begin + char cVdecDbgEndFrmPrefix[] = "vdec_efn="; // vdec_efn=frame_idx_end + char cVdecDbgDirPrefix[] = + "vdec_dir="; // vdec_dir=your_preference_directory + proc_debug_config_t *pVdecDebugConfig = + (proc_debug_config_t *)&tVdecDebugConfig; + + return vcodec_proc_write_helper(user_buf, count, pVdecDebugConfig, + cProcInputdata, cVdecDbgPrefix, + cVdecDbgStartFrmPrefix, + cVdecDbgEndFrmPrefix, cVdecDbgDirPrefix, + NULL); +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +static const struct proc_ops vdec_proc_fops = { + .proc_open = vdec_proc_open, + .proc_read = seq_read, + .proc_write = vdec_proc_write, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static const struct file_operations vdec_proc_fops = { + .owner = THIS_MODULE, + .open = vdec_proc_open, + .read = seq_read, + .write = vdec_proc_write, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +int vdec_proc_init(struct device *dev) +{ + if (proc_create_data(VDEC_PROC_NAME, VIDEO_PROC_PERMS, + VIDEO_PROC_PARENT, &vdec_proc_fops, dev) == NULL) { + dev_err(dev, "ERROR! /proc/%s create fail\n", VDEC_PROC_NAME); + remove_proc_entry(VDEC_PROC_NAME, NULL); + return -1; + } + return 0; +} + +int vdec_proc_deinit(void) +{ + remove_proc_entry(VDEC_PROC_NAME, NULL); + return 0; +} +#endif \ No newline at end of file diff --git a/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv_proc.h b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv_proc.h new file mode 100644 index 0000000000..ec78d9bfac --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_drv_proc.h @@ -0,0 +1,42 @@ +#ifndef __CVI_VC_DRV_PROC_H__ +#define __CVI_VC_DRV_PROC_H__ + +#include + +#define VENC_PROC_NAME "cvitek/venc" +#define H265E_PROC_NAME "cvitek/h265e" +#define H264E_PROC_NAME "cvitek/h264e" +#define JPEGE_PROC_NAME "cvitek/jpege" +#define CODEC_PROC_NAME "cvitek/codec" +#define RC_PROC_NAME "cvitek/rc" +#define VDEC_PROC_NAME "cvitek/vdec" +#define VIDEO_PROC_PERMS (0644) +#define VIDEO_PROC_PARENT (NULL) +#define MAX_PROC_STR_SIZE (255) +#define MAX_DIR_STR_SIZE (255) + +typedef struct _proc_debug_config_t { + uint32_t u32DbgMask; + uint32_t u32StartFrmIdx; + uint32_t u32EndFrmIdx; + char cDumpPath[MAX_DIR_STR_SIZE]; + uint32_t u32NoDataTimeout; +} proc_debug_config_t; + +int venc_proc_init(struct device *dev); +int venc_proc_deinit(void); +int h265e_proc_init(struct device *dev); +int codecinst_proc_init(struct device *dev); +int codecinst_proc_deinit(void); + +int h265e_proc_deinit(void); +int h264e_proc_init(struct device *dev); +int h264e_proc_deinit(void); +int jpege_proc_init(struct device *dev); +int jpege_proc_deinit(void); +int rc_proc_init(struct device *dev); +int rc_proc_deinit(void); +int vdec_proc_init(struct device *dev); +int vdec_proc_deinit(void); + +#endif /* __CVI_VC_DRV_PROC_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_getopt.c b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_getopt.c new file mode 100644 index 0000000000..28c6dddca8 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_getopt.c @@ -0,0 +1,702 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "cvi_vc_getopt.h" + +struct _getopt_data { + int optind; + int opterr; + int optopt; + char *optarg; + int __initialized; + + char *__nextchar; + + enum { + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + } __ordering; + + int __posixly_correct; + + int __first_nonopt; + int __last_nonopt; + + +}; + + +#define SWAP_FLAGS(ch1, ch2) + + +#define _GETOPT_DATA_INITIALIZER { 1, 1 } + +int optind = 1; + +int opterr = 1; +int optopt = 1; +char *optarg; + +static struct _getopt_data getopt_data; + +static void exchange(char **argv, struct _getopt_data *d) +{ + int bottom = d->__first_nonopt; + int middle = d->__last_nonopt; + int top = d->optind; + char *tem; + + while (top > middle && middle > bottom) { + if (top - middle > middle - bottom) { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS(bottom + i, top - (middle - bottom) + i); + } + + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } else { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS(bottom + i, middle + i); + } + + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + d->__first_nonopt += (d->optind - d->__last_nonopt); + d->__last_nonopt = d->optind; +} + + +static const char * +_getopt_initialize(int argc, char *const *argv, const char *optstring, + struct _getopt_data *d) +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + d->__first_nonopt = d->__last_nonopt = d->optind; + + d->__nextchar = NULL; + + d->__posixly_correct = 0;//!!getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') { + d->__ordering = RETURN_IN_ORDER; + ++optstring; + } else if (optstring[0] == '+') { + d->__ordering = REQUIRE_ORDER; + ++optstring; + } else if (d->__posixly_correct) + d->__ordering = REQUIRE_ORDER; + else + d->__ordering = PERMUTE; + + return optstring; +} + + +int _getopt_internal_r(int argc, char *const *argv, const char *optstring, + const struct option *longopts, int *longind, + int long_only, struct _getopt_data *d) +{ + int print_errors = d->opterr; + + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + d->optarg = NULL; + + if (d->optind == 0 || !d->__initialized) { + if (d->optind == 0) + d->optind = 1; /* Don't scan ARGV[0], the program name. */ + + optstring = _getopt_initialize(argc, argv, optstring, d); + d->__initialized = 1; + } + + + +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') + + if (d->__nextchar == NULL || *d->__nextchar == '\0') { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (d->__last_nonopt > d->optind) + d->__last_nonopt = d->optind; + + if (d->__first_nonopt > d->optind) + d->__first_nonopt = d->optind; + + if (d->__ordering == PERMUTE) { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange((char **) argv, d); + else if (d->__last_nonopt != d->optind) + d->__first_nonopt = d->optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (d->optind < argc && NONOPTION_P) + d->optind++; + + d->__last_nonopt = d->optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (d->optind != argc && !strcmp(argv[d->optind], "--")) { + d->optind++; + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange((char **) argv, d); + else if (d->__first_nonopt == d->__last_nonopt) + d->__first_nonopt = d->optind; + + d->__last_nonopt = argc; + + d->optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (d->optind == argc) { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (d->__first_nonopt != d->__last_nonopt) + d->optind = d->__first_nonopt; + + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) { + if (d->__ordering == REQUIRE_ORDER) + return -1; + + d->optarg = argv[d->optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + d->__nextchar = (argv[d->optind] + 1 + + (longopts != NULL && argv[d->optind][1] == '-')); + } + + if (longopts != NULL + && (argv[d->optind][1] == '-' + || (long_only && (argv[d->optind][2] + || !strchr(optstring, argv[d->optind][1]))))) { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) { + //do nothing + } + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp(p->name, d->__nextchar, nameend - d->__nextchar)) { + if ((unsigned int)(nameend - d->__nextchar) + == (unsigned int) strlen(p->name)) { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } else if (pfound == NULL) { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) { + d->__nextchar += strlen(d->__nextchar); + d->optind++; + d->optopt = 0; + return '?'; + } + + if (pfound != NULL) { + option_index = indfound; + d->optind++; + + if (*nameend) { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else { + d->__nextchar += strlen(d->__nextchar); + + d->optopt = pfound->val; + return '?'; + } + } else if (pfound->has_arg == 1) { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else { + d->__nextchar += strlen(d->__nextchar); + d->optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + + d->__nextchar += strlen(d->__nextchar); + + if (longind != NULL) + *longind = option_index; + + if (pfound->flag) { + *(pfound->flag) = pfound->val; + return 0; + } + + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[d->optind][1] == '-' + || strchr(optstring, *d->__nextchar) == NULL) { + d->__nextchar = (char *) ""; + d->optind++; + d->optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *d->__nextchar++; + char *temp = strchr(optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*d->__nextchar == '\0') + ++d->optind; + + if (temp == NULL || c == ':') { + + d->optopt = c; + return '?'; + } + + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } else if (d->optind != argc) { + d->optarg = argv[d->optind++]; + } else if (d->optind == argc) { + d->optopt = c; + + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + + return c; + } + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; + nameend++) { + //do nothing + } + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp(p->name, d->__nextchar, nameend - d->__nextchar)) { + if ((unsigned int)(nameend - d->__nextchar) == strlen(p->name)) { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } else if (pfound == NULL) { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) { + d->__nextchar += strlen(d->__nextchar); + d->optind++; + return '?'; + } + + if (pfound != NULL) { + option_index = indfound; + + if (*nameend) { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else { + d->__nextchar += strlen(d->__nextchar); + return '?'; + } + } else if (pfound->has_arg == 1) { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else { + d->__nextchar += strlen(d->__nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + + d->__nextchar += strlen(d->__nextchar); + + if (longind != NULL) + *longind = option_index; + + if (pfound->flag) { + *(pfound->flag) = pfound->val; + return 0; + } + + return pfound->val; + } + + d->__nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + + if (temp[1] == ':') { + if (temp[2] == ':') { + /* This is an option that accepts an argument optionally. */ + if (*d->__nextchar != '\0') { + d->optarg = d->__nextchar; + d->optind++; + } else + d->optarg = NULL; + + d->__nextchar = NULL; + } else { + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } else if (d->optind == argc) { + + d->optopt = c; + + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + d->optarg = argv[d->optind++]; + + d->__nextchar = NULL; + } + } + + return c; + } +} + + + + +//static struct _getopt_data getopt_data; + +int _getopt_internal(int argc, char **argv, const char *optstring, + const struct option *longopts, int *longind, int long_only) +{ + int result; + + getopt_data.optind = optind; + getopt_data.opterr = opterr; + + result = _getopt_internal_r(argc, argv, optstring, longopts, + longind, long_only, &getopt_data); + + optind = getopt_data.optind; + optarg = getopt_data.optarg; + optopt = getopt_data.optopt; + + return result; +} + + +int +getopt_long(int argc, char **argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal(argc, argv, options, long_options, opt_index, 0); +} + +void getopt_init(void) +{ + optind = 1; + opterr = 1; + optopt = 1; + memset(&getopt_data, 0, sizeof(getopt_data)); +} + + +char *cvi_strchr(char *s, char c) +{ + while (*s != '\0' && *s != c) { + ++s; + } + + return *s == c ? s : NULL; +} + + +char *cvi_strpbrk(const char *cs, const char *ct) +{ + const char *sc1, *sc2; + + for (sc1 = cs; *sc1 != '\0'; ++sc1) { + for (sc2 = ct; *sc2 != '\0'; ++sc2) { + if (*sc1 == *sc2) + return (char *) sc1; + } + } + + return NULL; +} + + +int cvi_strspn(const char *s, const char *accept) +{ + const char *p; + const char *a; + int count = 0; + + for (p = s; *p != '\0'; ++p) { + for (a = accept; *a != '\0'; ++a) { + if (*p == *a) { + break; + } + } + + if (*a == '\0') { + return count; + } + + ++count; + } + + return count; +} + + +char *cvi_strtok_r(char *s, const char *delim, char **save_ptr) +{ + char *token; + + if (s == NULL) + s = *save_ptr; + + /* Scan leading delimiters. */ + s += cvi_strspn(s, delim); + + if (*s == '\0') + return NULL; + + /* Find the end of the token. */ + token = s; + s = cvi_strpbrk(token, delim); + + if (s == NULL) + /* This token finishes the string. */ + *save_ptr = cvi_strchr(token, '\0'); + else { + /* Terminate the token and make *SAVE_PTR point past it. */ + *s = '\0'; + *save_ptr = s + 1; + } + + return token; +} + + +char *cvi_strtok(char *str, const char *delim) +{ + static char *rembmberLastString; + const char *indexDelim = delim; + int flag = 1, index = 0; + char *temp = NULL; + + if (str == NULL) { + str = rembmberLastString; + } + + for (; *str; str++) { + delim = indexDelim; + + for (; *delim; delim++) { + if (*str == *delim) { + *str = 0; + index = 1; + break; + } + } + + if (*str != 0 && flag == 1) { + temp = str; + flag = 0; + } + + if (*str != 0 && flag == 0 && index == 1) { + rembmberLastString = str; + return temp; + } + } + + rembmberLastString = str; + return temp; +} + +int cvi_isdigit(int c) +{ + return '0' <= c && c <= '9'; +} + + +#define CVI_INT_MAX 2147483647 +#define CVI_INT_MIN -2147483678 + +long long strtoi(const char *str, int minus) +{ + long long num = 0; + int flag = minus ? -1 : 1; + + while (*str != '\0') { + if (*str >= '0' && *str <= '9') { + num = num * 10 + flag * (*str - '0'); + ++str; + } else { + break; + } + } + + return num; +} + + +int atoi(const char *str) +{ + int num = 0; + int minus = false; + + if (str != NULL && *str != '\0') { + while (*str == ' ') { + ++str; + continue; + } + + if (*str == '+') { + ++str; + } else if (*str == '-') { + ++str; + minus = true; + } + + if (*str != '\0') { + num = strtoi(str, minus); + } + } + + return num; +} + diff --git a/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_getopt.h b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_getopt.h new file mode 100644 index 0000000000..bc278e6320 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/cvi_vc_getopt.h @@ -0,0 +1,26 @@ +#ifndef __CVI_VC_GET_OPTION_H__ +#define __CVI_VC_GET_OPTION_H__ + +#include "vdi_osal.h" +struct option { + const char *name; + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +extern char *optarg; + +int getopt_long(int argc, char **argv, const char *options, + const struct option *long_options, int *opt_index); + +char *cvi_strtok_r(char *s, const char *delim, char **save_ptr); +char *cvi_strtok(char *str, const char *delim); +void getopt_init(void); +int atoi(const char *str); +int cvi_isdigit(int c); +//double atof(const char* str); + +#endif /* __CVI_VC_GET_OPTION_H__ */ \ No newline at end of file diff --git a/osdrv/interdrv/v2/cvi_vc_drv/include/cvi_vdec.h b/osdrv/interdrv/v2/cvi_vc_drv/include/cvi_vdec.h new file mode 100644 index 0000000000..decf376139 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/include/cvi_vdec.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved. + * + * File Name: include/cvi_vdec.h + * Description: + * Common video decode definitions. + */ + +#ifndef __CVI_VDEC_H__ +#define __CVI_VDEC_H__ + +#include +#include +#include +#include +//#include "cvi_comm_vb.h" +#include +#include + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +CVI_S32 CVI_VDEC_CreateChn(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr); +CVI_S32 CVI_VDEC_DestroyChn(VDEC_CHN VdChn); + +CVI_S32 CVI_VDEC_GetChnAttr(VDEC_CHN VdChn, VDEC_CHN_ATTR_S *pstAttr); +CVI_S32 CVI_VDEC_SetChnAttr(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr); + +CVI_S32 CVI_VDEC_StartRecvStream(VDEC_CHN VdChn); +CVI_S32 CVI_VDEC_StopRecvStream(VDEC_CHN VdChn); + +CVI_S32 CVI_VDEC_QueryStatus(VDEC_CHN VdChn, VDEC_CHN_STATUS_S *pstStatus); + +CVI_S32 CVI_VDEC_GetFd(VDEC_CHN VdChn); +CVI_S32 CVI_VDEC_CloseFd(VDEC_CHN VdChn); + +CVI_S32 CVI_VDEC_ResetChn(VDEC_CHN VdChn); + +CVI_S32 CVI_VDEC_SetChnParam(VDEC_CHN VdChn, const VDEC_CHN_PARAM_S *pstParam); +CVI_S32 CVI_VDEC_GetChnParam(VDEC_CHN VdChn, VDEC_CHN_PARAM_S *pstParam); + +CVI_S32 CVI_VDEC_SetProtocolParam(VDEC_CHN VdChn, + const VDEC_PRTCL_PARAM_S *pstParam); +CVI_S32 CVI_VDEC_GetProtocolParam(VDEC_CHN VdChn, VDEC_PRTCL_PARAM_S *pstParam); + +/* s32MilliSec: -1 is block,0 is no block,other positive number is timeout */ +CVI_S32 CVI_VDEC_SendStream(VDEC_CHN VdChn, const VDEC_STREAM_S *pstStream, + CVI_S32 s32MilliSec); + +CVI_S32 CVI_VDEC_GetFrame(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstFrameInfo, + CVI_S32 s32MilliSec); +CVI_S32 CVI_VDEC_ReleaseFrame(VDEC_CHN VdChn, + const VIDEO_FRAME_INFO_S *pstFrameInfo); + +CVI_S32 CVI_VDEC_GetUserData(VDEC_CHN VdChn, VDEC_USERDATA_S *pstUserData, + CVI_S32 s32MilliSec); +CVI_S32 CVI_VDEC_ReleaseUserData(VDEC_CHN VdChn, + const VDEC_USERDATA_S *pstUserData); + +CVI_S32 CVI_VDEC_SetUserPic(VDEC_CHN VdChn, + const VIDEO_FRAME_INFO_S *pstUsrPic); +CVI_S32 CVI_VDEC_EnableUserPic(VDEC_CHN VdChn, CVI_BOOL bInstant); +CVI_S32 CVI_VDEC_DisableUserPic(VDEC_CHN VdChn); + +CVI_S32 CVI_VDEC_SetDisplayMode(VDEC_CHN VdChn, + VIDEO_DISPLAY_MODE_E enDisplayMode); +CVI_S32 CVI_VDEC_GetDisplayMode(VDEC_CHN VdChn, + VIDEO_DISPLAY_MODE_E *penDisplayMode); + +CVI_S32 CVI_VDEC_SetRotation(VDEC_CHN VdChn, ROTATION_E enRotation); +CVI_S32 CVI_VDEC_GetRotation(VDEC_CHN VdChn, ROTATION_E *penRotation); + +CVI_S32 CVI_VDEC_AttachVbPool(VDEC_CHN VdChn, const VDEC_CHN_POOL_S *pstPool); +CVI_S32 CVI_VDEC_DetachVbPool(VDEC_CHN VdChn); + +CVI_S32 CVI_VDEC_SetUserDataAttr(VDEC_CHN VdChn, + const VDEC_USER_DATA_ATTR_S *pstUserDataAttr); +CVI_S32 CVI_VDEC_GetUserDataAttr(VDEC_CHN VdChn, + VDEC_USER_DATA_ATTR_S *pstUserDataAttr); + +CVI_S32 CVI_VDEC_SetModParam(const VDEC_MOD_PARAM_S *pstModParam); +CVI_S32 CVI_VDEC_GetModParam(VDEC_MOD_PARAM_S *pstModParam); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __CVI_VDEC_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/include/cvi_venc.h b/osdrv/interdrv/v2/cvi_vc_drv/include/cvi_venc.h new file mode 100644 index 0000000000..70f03a69d2 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/include/cvi_venc.h @@ -0,0 +1,501 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved. + * + * File Name: include/cvi_venc.h + * Description: + * Common video encode definitions. + */ + +#ifndef __CVI_VENC_H__ +#define __CVI_VENC_H__ + +#include +#include +//#include "cvi_comm_vb.h" +#include +#include +#include + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +CVI_S32 CVI_VENC_CreateChn(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstAttr); +CVI_S32 CVI_VENC_DestroyChn(VENC_CHN VeChn); +CVI_S32 CVI_VENC_ResetChn(VENC_CHN VeChn); + +CVI_S32 CVI_VENC_StartRecvFrame(VENC_CHN VeChn, + const VENC_RECV_PIC_PARAM_S *pstRecvParam); +CVI_S32 CVI_VENC_StopRecvFrame(VENC_CHN VeChn); + +CVI_S32 CVI_VENC_QueryStatus(VENC_CHN VeChn, VENC_CHN_STATUS_S *pstStatus); + +CVI_S32 CVI_VENC_SetChnAttr(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstChnAttr); +CVI_S32 CVI_VENC_GetChnAttr(VENC_CHN VeChn, VENC_CHN_ATTR_S *pstChnAttr); + +CVI_S32 CVI_VENC_GetStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, + CVI_S32 S32MilliSec); +CVI_S32 CVI_VENC_ReleaseStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream); + +CVI_S32 CVI_VENC_InsertUserData(VENC_CHN VeChn, CVI_U8 *pu8Data, + CVI_U32 u32Len); + +CVI_S32 CVI_VENC_SendFrame(VENC_CHN VeChn, const VIDEO_FRAME_INFO_S *pstFrame, + CVI_S32 s32MilliSec); +CVI_S32 CVI_VENC_SendFrameEx(VENC_CHN VeChn, const USER_FRAME_INFO_S *pstFrame, + CVI_S32 s32MilliSec); + +CVI_S32 CVI_VENC_RequestIDR(VENC_CHN VeChn, CVI_BOOL bInstant); +CVI_S32 CVI_VENC_EnableSVC(VENC_CHN VeChn, CVI_BOOL bEnable); + +CVI_S32 CVI_VENC_GetFd(VENC_CHN VeChn); +CVI_S32 CVI_VENC_CloseFd(VENC_CHN VeChn); + +CVI_S32 CVI_VENC_SetRoiAttr(VENC_CHN VeChn, const VENC_ROI_ATTR_S *pstRoiAttr); +CVI_S32 CVI_VENC_GetRoiAttr(VENC_CHN VeChn, CVI_U32 u32Index, + VENC_ROI_ATTR_S *pstRoiAttr); + +CVI_S32 CVI_VENC_GetRoiAttrEx(VENC_CHN VeChn, CVI_U32 u32Index, + VENC_ROI_ATTR_EX_S *pstRoiAttrEx); +CVI_S32 CVI_VENC_SetRoiAttrEx(VENC_CHN VeChn, + const VENC_ROI_ATTR_EX_S *pstRoiAttrEx); + +CVI_S32 +CVI_VENC_SetRoiBgFrameRate(VENC_CHN VeChn, + const VENC_ROIBG_FRAME_RATE_S *pstRoiBgFrmRate); +CVI_S32 CVI_VENC_GetRoiBgFrameRate(VENC_CHN VeChn, + VENC_ROIBG_FRAME_RATE_S *pstRoiBgFrmRate); + +CVI_S32 +CVI_VENC_SetH264SliceSplit(VENC_CHN VeChn, + const VENC_H264_SLICE_SPLIT_S *pstSliceSplit); +CVI_S32 CVI_VENC_GetH264SliceSplit(VENC_CHN VeChn, + VENC_H264_SLICE_SPLIT_S *pstSliceSplit); + +CVI_S32 +CVI_VENC_SetH264IntraPred(VENC_CHN VeChn, + const VENC_H264_INTRA_PRED_S *pstH264IntraPred); +CVI_S32 CVI_VENC_GetH264IntraPred(VENC_CHN VeChn, + VENC_H264_INTRA_PRED_S *pstH264IntraPred); + +CVI_S32 CVI_VENC_SetH264Trans(VENC_CHN VeChn, + const VENC_H264_TRANS_S *pstH264Trans); +CVI_S32 CVI_VENC_GetH264Trans(VENC_CHN VeChn, VENC_H264_TRANS_S *pstH264Trans); + +CVI_S32 CVI_VENC_SetH264Entropy(VENC_CHN VeChn, + const VENC_H264_ENTROPY_S *pstH264EntropyEnc); +CVI_S32 CVI_VENC_GetH264Entropy(VENC_CHN VeChn, + VENC_H264_ENTROPY_S *pstH264EntropyEnc); + +CVI_S32 CVI_VENC_SetH264Dblk(VENC_CHN VeChn, + const VENC_H264_DBLK_S *pstH264Dblk); +CVI_S32 CVI_VENC_GetH264Dblk(VENC_CHN VeChn, VENC_H264_DBLK_S *pstH264Dblk); + +CVI_S32 CVI_VENC_SetH264Vui(VENC_CHN VeChn, const VENC_H264_VUI_S *pstH264Vui); +CVI_S32 CVI_VENC_GetH264Vui(VENC_CHN VeChn, VENC_H264_VUI_S *pstH264Vui); + +CVI_S32 CVI_VENC_SetH265Vui(VENC_CHN VeChn, const VENC_H265_VUI_S *pstH265Vui); +CVI_S32 CVI_VENC_GetH265Vui(VENC_CHN VeChn, VENC_H265_VUI_S *pstH265Vui); + +CVI_S32 CVI_VENC_SetJpegParam(VENC_CHN VeChn, + const VENC_JPEG_PARAM_S *pstJpegParam); +CVI_S32 CVI_VENC_GetJpegParam(VENC_CHN VeChn, VENC_JPEG_PARAM_S *pstJpegParam); + +CVI_S32 CVI_VENC_SetMjpegParam(VENC_CHN VeChn, + const VENC_MJPEG_PARAM_S *pstMjpegParam); +CVI_S32 CVI_VENC_GetMjpegParam(VENC_CHN VeChn, + VENC_MJPEG_PARAM_S *pstMjpegParam); + +CVI_S32 CVI_VENC_GetRcParam(VENC_CHN VeChn, VENC_RC_PARAM_S *pstRcParam); +CVI_S32 CVI_VENC_SetRcParam(VENC_CHN VeChn, const VENC_RC_PARAM_S *pstRcParam); + +CVI_S32 CVI_VENC_SetRefParam(VENC_CHN VeChn, + const VENC_REF_PARAM_S *pstRefParam); +CVI_S32 CVI_VENC_GetRefParam(VENC_CHN VeChn, VENC_REF_PARAM_S *pstRefParam); + +CVI_S32 +CVI_VENC_SetJpegEncodeMode(VENC_CHN VeChn, + const VENC_JPEG_ENCODE_MODE_E enJpegEncodeMode); +CVI_S32 CVI_VENC_GetJpegEncodeMode(VENC_CHN VeChn, + VENC_JPEG_ENCODE_MODE_E *penJpegEncodeMode); + +CVI_S32 CVI_VENC_EnableIDR(VENC_CHN VeChn, CVI_BOOL bEnableIDR); + +CVI_S32 CVI_VENC_GetStreamBufInfo(VENC_CHN VeChn, + VENC_STREAM_BUF_INFO_S *pstStreamBufInfo); + +CVI_S32 +CVI_VENC_SetH265SliceSplit(VENC_CHN VeChn, + const VENC_H265_SLICE_SPLIT_S *pstSliceSplit); +CVI_S32 CVI_VENC_GetH265SliceSplit(VENC_CHN VeChn, + VENC_H265_SLICE_SPLIT_S *pstSliceSplit); + +CVI_S32 CVI_VENC_SetH265PredUnit(VENC_CHN VeChn, + const VENC_H265_PU_S *pstPredUnit); +CVI_S32 CVI_VENC_GetH265PredUnit(VENC_CHN VeChn, VENC_H265_PU_S *pstPredUnit); + +CVI_S32 CVI_VENC_SetH265Trans(VENC_CHN VeChn, + const VENC_H265_TRANS_S *pstH265Trans); +CVI_S32 CVI_VENC_GetH265Trans(VENC_CHN VeChn, VENC_H265_TRANS_S *pstH265Trans); + +CVI_S32 CVI_VENC_SetH265Entropy(VENC_CHN VeChn, + const VENC_H265_ENTROPY_S *pstH265Entropy); +CVI_S32 CVI_VENC_GetH265Entropy(VENC_CHN VeChn, + VENC_H265_ENTROPY_S *pstH265Entropy); + +CVI_S32 CVI_VENC_SetH265Dblk(VENC_CHN VeChn, + const VENC_H265_DBLK_S *pstH265Dblk); +CVI_S32 CVI_VENC_GetH265Dblk(VENC_CHN VeChn, VENC_H265_DBLK_S *pstH265Dblk); + +CVI_S32 CVI_VENC_SetH265Sao(VENC_CHN VeChn, const VENC_H265_SAO_S *pstH265Sao); +CVI_S32 CVI_VENC_GetH265Sao(VENC_CHN VeChn, VENC_H265_SAO_S *pstH265Sao); + +CVI_S32 CVI_VENC_SetFrameLostStrategy(VENC_CHN VeChn, + const VENC_FRAMELOST_S *pstFrmLostParam); +CVI_S32 CVI_VENC_GetFrameLostStrategy(VENC_CHN VeChn, + VENC_FRAMELOST_S *pstFrmLostParam); + +CVI_S32 +CVI_VENC_SetSuperFrameStrategy(VENC_CHN VeChn, + const VENC_SUPERFRAME_CFG_S *pstSuperFrmParam); +CVI_S32 CVI_VENC_GetSuperFrameStrategy(VENC_CHN VeChn, + VENC_SUPERFRAME_CFG_S *pstSuperFrmParam); + +CVI_S32 CVI_VENC_SetIntraRefresh(VENC_CHN VeChn, + const VENC_INTRA_REFRESH_S *pstIntraRefresh); +CVI_S32 CVI_VENC_GetIntraRefresh(VENC_CHN VeChn, + VENC_INTRA_REFRESH_S *pstIntraRefresh); + +CVI_S32 CVI_VENC_GetSSERegion(VENC_CHN VeChn, CVI_U32 u32Index, + VENC_SSE_CFG_S *pstSSECfg); +CVI_S32 CVI_VENC_SetSSERegion(VENC_CHN VeChn, const VENC_SSE_CFG_S *pstSSECfg); + +CVI_S32 CVI_VENC_SetChnParam(VENC_CHN VeChn, + const VENC_CHN_PARAM_S *pstChnParam); +CVI_S32 CVI_VENC_GetChnParam(VENC_CHN VeChn, VENC_CHN_PARAM_S *pstChnParam); + +CVI_S32 CVI_VENC_SetModParam(const VENC_PARAM_MOD_S *pstModParam); +CVI_S32 CVI_VENC_GetModParam(VENC_PARAM_MOD_S *pstModParam); + +CVI_S32 +CVI_VENC_GetForegroundProtect(VENC_CHN VeChn, + VENC_FOREGROUND_PROTECT_S *pstForegroundProtect); +CVI_S32 CVI_VENC_SetForegroundProtect( + VENC_CHN VeChn, const VENC_FOREGROUND_PROTECT_S *pstForegroundProtect); + +CVI_S32 CVI_VENC_SetSceneMode(VENC_CHN VeChn, + const VENC_SCENE_MODE_E enSceneMode); +CVI_S32 CVI_VENC_GetSceneMode(VENC_CHN VeChn, VENC_SCENE_MODE_E *penSceneMode); + +CVI_S32 CVI_VENC_AttachVbPool(VENC_CHN VeChn, const VENC_CHN_POOL_S *pstPool); +CVI_S32 CVI_VENC_DetachVbPool(VENC_CHN VeChn); + +CVI_S32 CVI_VENC_SetCuPrediction(VENC_CHN VeChn, + const VENC_CU_PREDICTION_S *pstCuPrediction); +CVI_S32 CVI_VENC_GetCuPrediction(VENC_CHN VeChn, + VENC_CU_PREDICTION_S *pstCuPrediction); + +CVI_S32 CVI_VENC_GetCuPrediction(VENC_CHN VeChn, + VENC_CU_PREDICTION_S *pstCuPrediction); + +CVI_S32 CVI_VENC_SetSkipBias(VENC_CHN VeChn, + const VENC_SKIP_BIAS_S *pstSkipBias); +CVI_S32 CVI_VENC_GetSkipBias(VENC_CHN VeChn, VENC_SKIP_BIAS_S *pstSkipBias); + +CVI_S32 +CVI_VENC_SetDeBreathEffect(VENC_CHN VeChn, + const VENC_DEBREATHEFFECT_S *pstDeBreathEffect); +CVI_S32 CVI_VENC_GetDeBreathEffect(VENC_CHN VeChn, + VENC_DEBREATHEFFECT_S *pstDeBreathEffect); + +CVI_S32 +CVI_VENC_SetHierarchicalQp(VENC_CHN VeChn, + const VENC_HIERARCHICAL_QP_S *pstHierarchicalQp); +CVI_S32 CVI_VENC_GetHierarchicalQp(VENC_CHN VeChn, + VENC_HIERARCHICAL_QP_S *pstHierarchicalQp); + +CVI_S32 CVI_VENC_SetRcAdvParam(VENC_CHN VeChn, + const VENC_RC_ADVPARAM_S *pstRcAdvParam); +CVI_S32 CVI_VENC_GetRcAdvParam(VENC_CHN VeChn, + VENC_RC_ADVPARAM_S *pstRcAdvParam); + +CVI_S32 CVI_VENC_CalcFrameParam(VENC_CHN VeChn, + VENC_FRAME_PARAM_S *pstFrameParam); +CVI_S32 CVI_VENC_SetFrameParam(VENC_CHN VeChn, + const VENC_FRAME_PARAM_S *pstFrameParam); +CVI_S32 CVI_VENC_GetFrameParam(VENC_CHN VeChn, + VENC_FRAME_PARAM_S *pstFrameParam); + +CVI_S32 cvi_VENC_CB_SendFrame(CVI_S32 VpssGrp, CVI_S32 VpssChn, CVI_S32 VpssChn1, + const struct cvi_buffer *pstInFrmBuf, + const struct cvi_buffer *pstInFrmBuf1, CVI_BOOL isOnline, + CVI_U32 sb_nb, CVI_S32 s32MilliSec); +CVI_S32 cvi_VENC_CB_SkipFrame(CVI_S32 VpssGrp, CVI_S32 VpssChn, CVI_U32 srcImgHeight, CVI_S32 s32MilliSec); +CVI_S32 cvi_VENC_CB_SnapJpgFrame(CVI_S32 VpssGrp, CVI_S32 VpssChn, CVI_U32 FrmCnt); +CVI_S32 cvi_VENC_CB_SwitchChn(CVI_S32 VpssGrp, CVI_S32 VpssChn); + +CVI_S32 CVI_VENC_SetSvcParam(VENC_CHN VeChn, VENC_SVC_PARAM_S *pstSvcParam); +CVI_S32 CVI_VENC_GetSvcParam(VENC_CHN VeChn, VENC_SVC_PARAM_S *pstSvcParam); + +#define CVI_H264_PROFILE_DEFAULT H264E_PROFILE_HIGH +#define CVI_H264_PROFILE_MIN 0 +#define CVI_H264_PROFILE_MAX (H264E_PROFILE_BUTT - 1) + +#define CVI_H264_ENTROPY_DEFAULT 1 +#define CVI_H264_ENTROPY_MIN 0 +#define CVI_H264_ENTROPY_MAX 1 + +#define CVI_INITIAL_DELAY_DEFAULT 1000 +#define CVI_INITIAL_DELAY_MIN 10 +#define CVI_INITIAL_DELAY_MAX 3000 + +#define CVI_VARI_FPS_EN_DEFAULT 0 +#define CVI_VARI_FPS_EN_MIN 0 +#define CVI_VARI_FPS_EN_MAX 1 + +#define CVI_H26X_GOP_DEFAULT 60 +#define CVI_H26X_GOP_MIN 1 +#define CVI_H26X_GOP_MAX 3600 + +#define CVI_H26X_GOP_MODE_DEFAULT VENC_GOPMODE_NORMALP +#define CVI_H26X_GOP_MODE_MIN VENC_GOPMODE_NORMALP +#define CVI_H26X_GOP_MODE_MAX (VENC_GOPMODE_BUTT - 1) + +#define CVI_H26X_NORMALP_IP_QP_DELTA_DEFAULT 2 +#define CVI_H26X_NORMALP_IP_QP_DELTA_MIN -10 +#define CVI_H26X_NORMALP_IP_QP_DELTA_MAX 30 + +#define CVI_H26X_SMARTP_BG_INTERVAL_DEFAULT (CVI_H26X_GOP_DEFAULT * 2) +#define CVI_H26X_SMARTP_BG_INTERVAL_MIN CVI_H26X_GOP_MIN +#define CVI_H26X_SMARTP_BG_INTERVAL_MAX 65536 + +#define CVI_H26X_SMARTP_BG_QP_DELTA_DEFAULT 2 +#define CVI_H26X_SMARTP_BG_QP_DELTA_MIN -10 +#define CVI_H26X_SMARTP_BG_QP_DELTA_MAX 30 + +#define CVI_H26X_SMARTP_VI_QP_DELTA_DEFAULT 0 +#define CVI_H26X_SMARTP_VI_QP_DELTA_MIN -10 +#define CVI_H26X_SMARTP_VI_QP_DELTA_MAX 30 + +#define CVI_H26X_MAXIQP_DEFAULT 51 +#define CVI_H26X_MAXIQP_MIN 1 +#define CVI_H26X_MAXIQP_MAX 51 + +#define CVI_H26X_MINIQP_DEFAULT 1 +#define CVI_H26X_MINIQP_MIN 1 +#define CVI_H26X_MINIQP_MAX 51 + +#define CVI_H26X_MAXQP_DEFAULT 51 +#define CVI_H26X_MAXQP_MIN 0 +#define CVI_H26X_MAXQP_MAX 51 + +#define CVI_H26X_MINQP_DEFAULT 1 +#define CVI_H26X_MINQP_MIN 0 +#define CVI_H26X_MINQP_MAX 51 + +#define CVI_H26X_MAX_I_PROP_DEFAULT 100 +#define CVI_H26X_MAX_I_PROP_MIN 1 +#define CVI_H26X_MAX_I_PROP_MAX 100 + +#define CVI_H26X_MIN_I_PROP_DEFAULT 1 +#define CVI_H26X_MIN_I_PROP_MIN 1 +#define CVI_H26X_MIN_I_PROP_MAX 100 + +#define CVI_H26X_MAXBITRATE_DEFAULT 5000 +#define CVI_H26X_MAXBITRATE_MIN 100 +#define CVI_H26X_MAXBITRATE_MAX 300000 + +#define CVI_H26X_CHANGE_POS_DEFAULT 90 +#define CVI_H26X_CHANGE_POS_MIN 50 +#define CVI_H26X_CHANGE_POS_MAX 100 + +#define CVI_H26X_MIN_STILL_PERCENT_DEFAULT 10 +#define CVI_H26X_MIN_STILL_PERCENT_MIN 1 +#define CVI_H26X_MIN_STILL_PERCENT_MAX 100 + +#define CVI_H26X_MAX_STILL_QP_DEFAULT 1 +#define CVI_H26X_MAX_STILL_QP_MIN 0 +#define CVI_H26X_MAX_STILL_QP_MAX 51 + +#define CVI_H26X_MOTION_SENSITIVITY_DEFAULT 100 +#define CVI_H26X_MOTION_SENSITIVITY_MIN 1 +#define CVI_H26X_MOTION_SENSITIVITY_MAX 1024 + +#define CVI_H26X_AVBR_FRM_LOST_OPEN_DEFAULT 1 +#define CVI_H26X_AVBR_FRM_LOST_OPEN_MIN 0 +#define CVI_H26X_AVBR_FRM_LOST_OPEN_MAX 1 + +#define CVI_H26X_AVBR_FRM_GAP_DEFAULT 1 +#define CVI_H26X_AVBR_FRM_GAP_MIN 0 +#define CVI_H26X_AVBR_FRM_GAP_MAX 100 + +#define CVI_H26X_AVBR_PURE_STILL_THR_DEFAULT 4 +#define CVI_H26X_AVBR_PURE_STILL_THR_MIN 0 +#define CVI_H26X_AVBR_PURE_STILL_THR_MAX 500 + +#define CVI_H26X_INTRACOST_DEFAULT 0 +#define CVI_H26X_INTRACOST_MIN 0 +#define CVI_H26X_INTRACOST_MAX 16383 + +#define CVI_H26X_THRDLV_DEFAULT 2 +#define CVI_H26X_THRDLV_MIN 0 +#define CVI_H26X_THRDLV_MAX 4 + +#define CVI_H26X_BG_ENHANCE_EN_DEFAULT 0 +#define CVI_H26X_BG_ENHANCE_EN_MIN 0 +#define CVI_H26X_BG_ENHANCE_EN_MAX 1 + +#define CVI_H26X_BG_DELTA_QP_DEFAULT 0 +#define CVI_H26X_BG_DELTA_QP_MIN -8 +#define CVI_H26X_BG_DELTA_QP_MAX 8 + +#define CVI_H26X_ROW_QP_DELTA_DEFAULT 1 +#define CVI_H26X_ROW_QP_DELTA_MIN 0 +#define CVI_H26X_ROW_QP_DELTA_MAX 10 + +#define CVI_H26X_SUPER_FRM_MODE_DEFAULT 0 +#define CVI_H26X_SUPER_FRM_MODE_MIN 0 +#define CVI_H26X_SUPER_FRM_MODE_MAX 3 + +#define CVI_H26X_SUPER_I_BITS_THR_DEFAULT (4 * 8 * 1024 * 1024) +#define CVI_H26X_SUPER_I_BITS_THR_MIN 1000 +#define CVI_H26X_SUPER_I_BITS_THR_MAX (10 * 8 * 1024 * 1024) + +#define CVI_H26X_SUPER_P_BITS_THR_DEFAULT (4 * 8 * 1024 * 1024) +#define CVI_H26X_SUPER_P_BITS_THR_MIN 1000 +#define CVI_H26X_SUPER_P_BITS_THR_MAX (10 * 8 * 1024 * 1024) + +#define CVI_H26X_MAX_RE_ENCODE_DEFAULT 0 +#define CVI_H26X_MAX_RE_ENCODE_MIN 0 +#define CVI_H26X_MAX_RE_ENCODE_MAX 4 + +#define CVI_H26X_ASPECT_RATIO_INFO_PRESENT_FLAG_DEFAULT 0 +#define CVI_H26X_ASPECT_RATIO_INFO_PRESENT_FLAG_MIN 0 +#define CVI_H26X_ASPECT_RATIO_INFO_PRESENT_FLAG_MAX 1 + +#define CVI_H26X_ASPECT_RATIO_IDC_DEFAULT 1 +#define CVI_H26X_ASPECT_RATIO_IDC_MIN 0 +#define CVI_H26X_ASPECT_RATIO_IDC_MAX 255 + +#define CVI_H26X_OVERSCAN_INFO_PRESENT_FLAG_DEFAULT 0 +#define CVI_H26X_OVERSCAN_INFO_PRESENT_FLAG_MIN 0 +#define CVI_H26X_OVERSCAN_INFO_PRESENT_FLAG_MAX 1 + +#define CVI_H26X_OVERSCAN_APPROPRIATE_FLAG_DEFAULT 0 +#define CVI_H26X_OVERSCAN_APPROPRIATE_FLAG_MIN 0 +#define CVI_H26X_OVERSCAN_APPROPRIATE_FLAG_MAX 1 + +#define CVI_H26X_SAR_WIDTH_DEFAULT 1 +#define CVI_H26X_SAR_WIDTH_MIN 1 +#define CVI_H26X_SAR_WIDTH_MAX 65535 + +#define CVI_H26X_SAR_HEIGHT_DEFAULT 1 +#define CVI_H26X_SAR_HEIGHT_MIN 1 +#define CVI_H26X_SAR_HEIGHT_MAX 65535 + +#define CVI_H26X_TIMING_INFO_PRESENT_FLAG_DEFAULT 0 +#define CVI_H26X_TIMING_INFO_PRESENT_FLAG_MIN 0 +#define CVI_H26X_TIMING_INFO_PRESENT_FLAG_MAX 1 + +#define CVI_H264_FIXED_FRAME_RATE_FLAG_DEFAULT 0 +#define CVI_H264_FIXED_FRAME_RATE_FLAG_MIN 0 +#define CVI_H264_FIXED_FRAME_RATE_FLAG_MAX 1 + +#define CVI_H26X_NUM_UNITS_IN_TICK_DEFAULT 1 +#define CVI_H26X_NUM_UNITS_IN_TICK_MIN 1 +#define CVI_H26X_NUM_UNITS_IN_TICK_MAX (UINT_MAX) + +#define CVI_H26X_TIME_SCALE_DEFAULT 60 +#define CVI_H26X_TIME_SCALE_MIN 1 +#define CVI_H26X_TIME_SCALE_MAX (UINT_MAX) + +#define CVI_H265_NUM_TICKS_POC_DIFF_ONE_MINUS1_DEFAULT 1 +#define CVI_H265_NUM_TICKS_POC_DIFF_ONE_MINUS1_MIN 0 +#define CVI_H265_NUM_TICKS_POC_DIFF_ONE_MINUS1_MAX (UINT_MAX - 1) + +#define CVI_H26X_VIDEO_SIGNAL_TYPE_PRESENT_FLAG_DEFAULT 0 +#define CVI_H26X_VIDEO_SIGNAL_TYPE_PRESENT_FLAG_MIN 0 +#define CVI_H26X_VIDEO_SIGNAL_TYPE_PRESENT_FLAG_MAX 1 + +#define CVI_H26X_VIDEO_FORMAT_DEFAULT 5 +#define CVI_H26X_VIDEO_FORMAT_MIN 0 +#define CVI_H264_VIDEO_FORMAT_MAX 7 +#define CVI_H265_VIDEO_FORMAT_MAX 5 + +#define CVI_H26X_VIDEO_FULL_RANGE_FLAG_DEFAULT 0 +#define CVI_H26X_VIDEO_FULL_RANGE_FLAG_MIN 0 +#define CVI_H26X_VIDEO_FULL_RANGE_FLAG_MAX 1 + +#define CVI_H26X_COLOUR_DESCRIPTION_PRESENT_FLAG_DEFAULT 0 +#define CVI_H26X_COLOUR_DESCRIPTION_PRESENT_FLAG_MIN 0 +#define CVI_H26X_COLOUR_DESCRIPTION_PRESENT_FLAG_MAX 1 + +#define CVI_H26X_COLOUR_PRIMARIES_DEFAULT 2 +#define CVI_H26X_COLOUR_PRIMARIES_MIN 0 +#define CVI_H26X_COLOUR_PRIMARIES_MAX 255 + +#define CVI_H26X_TRANSFER_CHARACTERISTICS_DEFAULT 2 +#define CVI_H26X_TRANSFER_CHARACTERISTICS_MIN 0 +#define CVI_H26X_TRANSFER_CHARACTERISTICS_MAX 255 + +#define CVI_H26X_MATRIX_COEFFICIENTS_DEFAULT 2 +#define CVI_H26X_MATRIX_COEFFICIENTS_MIN 0 +#define CVI_H26X_MATRIX_COEFFICIENTS_MAX 255 + +#define CVI_H26X_BITSTREAM_RESTRICTION_FLAG_DEFAULT 0 +#define CVI_H26X_BITSTREAM_RESTRICTION_FLAG_MIN 0 +#define CVI_H26X_BITSTREAM_RESTRICTION_FLAG_MAX 1 + +#define CVI_H26X_TEST_UBR_EN_DEFAULT 0 +#define CVI_H26X_TEST_UBR_EN_MIN 0 +#define CVI_H26X_TEST_UBR_EN_MAX 1 + +#define CVI_H26X_FRAME_QP_DEFAULT 38 +#define CVI_H26X_FRAME_QP_MIN 0 +#define CVI_H26X_FRAME_QP_MAX 51 + +#define CVI_H26X_FRAME_BITS_DEFAULT (200 * 1000) +#define CVI_H26X_FRAME_BITS_MIN 1000 +#define CVI_H26X_FRAME_BITS_MAX 10000000 + +#define CVI_H26X_ES_BUFFER_QUEUE_DEFAULT 1 +#define CVI_H26X_ES_BUFFER_QUEUE_MIN 0 +#define CVI_H26X_ES_BUFFER_QUEUE_MAX 1 + +#define CVI_H26X_ISO_SEND_FRAME_DEFAUL 1 +#define CVI_H26X_ISO_SEND_FRAME_MIN 0 +#define CVI_H26X_ISO_SEND_FRAME_MAX 1 + +#define CVI_H26X_SENSOR_EN_DEFAULT 0 +#define CVI_H26X_SENSOR_EN_MIN 0 +#define CVI_H26X_SENSOR_EN_MAX 1 + +#define CVI_SENCE_SIMPLE_TH 256 +#define CVI_SENCE_CPLX_TH 318 + +#define CVI_SENCE_MIDDLE_MIN_PERCENT 50 +#define CVI_SENCE_CPLX_MIN_PERCENT 80 + +#define DEF_STAT_TIME -1 +#define DEF_GOP 30 +#define DEF_IQP 32 +#define DEF_PQP 32 + +#define DEF_VARI_FPS_EN 0 +#define DEF_264_GOP 60 +#define DEF_264_MAXIQP 51 +#define DEF_264_MINIQP 1 +#define DEF_264_MAXQP 51 +#define DEF_264_MINQP 1 +#define DEF_264_MAXBITRATE 5000 +#define DEF_26X_CHANGE_POS 90 + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __CVI_VENC_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/config.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/config.h new file mode 100644 index 0000000000..ec596959a2 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/config.h @@ -0,0 +1,63 @@ + + +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || \ + defined(WIN32) || defined(__MINGW32__) +#define PLATFORM_WIN32 +#elif defined(linux) || defined(__linux) || defined(ANDROID) +#if defined(USE_KERNEL_MODE) +#define PLATFORM_LINUX_KERNEL +#else +#define PLATFORM_LINUX +#endif +#else +#define PLATFORM_NON_OS +#endif + +#if defined(_MSC_VER) +#include +#include +#define inline _inline +#define JPU_DELAY_MS(X) Sleep(X) +#define JPU_DELAY_US(X) Sleep(X) + // should change to delay function which can be delay a + // microsecond unut. +#define kbhit _kbhit +#define getch _getch +#elif defined(__GNUC__) +#ifdef _KERNEL_ +#define JPU_DELAY_MS(X) udelay(X * 1000) +#define JPU_DELAY_US(X) udelay(X) +#else +#define JPU_DELAY_MS(X) usleep(X * 1000) +#define JPU_DELAY_US(X) usleep(X) +#endif +#elif defined(__ARMCC__) +#else +#error "Unknown compiler." +#endif + +#define PROJECT_ROOT "..\\..\\..\\" + +#if defined(JPU_FPGA_PLATFORM) +#if defined(ANDROID) || defined(linux) +#else +#define SUPPORT_CONF_TEST +#endif +#endif + +#define API_VERSION 165 + +//#define MJPEG_ERROR_CONCEAL + +#ifdef __cplusplus +} +#endif + +#endif /* __CONFIG_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/inc/cvi_jpg_interface.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/inc/cvi_jpg_interface.h new file mode 100644 index 0000000000..f524a6f3d5 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/inc/cvi_jpg_interface.h @@ -0,0 +1,202 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved. + * + * File Name: cvi_jpg_interface.h + * Description: + * Jpeg Codec interface + */ +#ifndef CVI_JPG_INTERFACE_H +#define CVI_JPG_INTERFACE_H +#include +#ifdef __cplusplus +extern "C" { +#endif + +#define CVI_JPG_MARKER_ORDER_CNT 16 +#define CVI_JPG_MARKER_ORDER_BUF_SIZE (sizeof(int) * CVI_JPG_MARKER_ORDER_CNT) + +/* enum define */ +typedef enum { + CVIJPGCOD_UNKNOWN = 0, + CVIJPGCOD_DEC = 1, + CVIJPGCOD_ENC = 2 +} CVIJpgCodType; + +typedef enum { + CVI_FORMAT_420 = 0, + CVI_FORMAT_422 = 1, + CVI_FORMAT_224 = 2, + CVI_FORMAT_444 = 3, + CVI_FORMAT_400 = 4 +} CVIFrameFormat; + +typedef enum { + CVI_CBCR_SEPARATED = 0, + CVI_CBCR_INTERLEAVE, + CVI_CRCB_INTERLEAVE +} CVICbCrInterLeave; + +typedef enum { + CVI_PACKED_FORMAT_NONE, + CVI_PACKED_FORMAT_422_YUYV, + CVI_PACKED_FORMAT_422_UYVY, + CVI_PACKED_FORMAT_422_YVYU, + CVI_PACKED_FORMAT_422_VYUY, + CVI_PACKED_FORMAT_444, + CVI_PACKED_FORMAT_444_RGB +} CVIPackedFormat; + +typedef enum { + JPEG_MEM_MODULE = 2, + JPEG_MEM_EXTERNAL = 3, +} JPEG_MEM_TYPE; + +#define CVI_JPEG_OP_BASE 0x10000 +#define CVI_JPEG_OP_MASK 0xFF0000 +#define CVI_JPEG_OP_SHIFT 16 + +typedef enum _CVI_JPEG_OP_ { + CVI_JPEG_OP_NONE = 0, + CVI_JPEG_OP_SET_QUALITY = (1 << CVI_JPEG_OP_SHIFT), + CVI_JPEG_OP_SET_CHN_ATTR = (2 << CVI_JPEG_OP_SHIFT), + CVI_JPEG_OP_SET_MCUPerECS = (3 << CVI_JPEG_OP_SHIFT), + CVI_JPEG_OP_RESET_CHN = (4 << CVI_JPEG_OP_SHIFT), + CVI_JPEG_OP_SET_USER_DATA = (5 << CVI_JPEG_OP_SHIFT), + CVI_JPEG_OP_SHOW_CHN_INFO = (6 << CVI_JPEG_OP_SHIFT), + CVI_JPEG_OP_START = (7 << CVI_JPEG_OP_SHIFT), + CVI_JPEG_OP_SET_SBM_ENABLE = (8 << CVI_JPEG_OP_SHIFT), + CVI_JPEG_OP_WAIT_FRAME_DONE = (9 << CVI_JPEG_OP_SHIFT), + CVI_JPEG_OP_MAX = (10 << CVI_JPEG_OP_SHIFT), +} CVI_JPEG_OP; + +/* struct define */ + +/* Frame Buffer */ + +typedef struct { + unsigned int size; + __u64 phys_addr; + __u64 base; + __u8 *virt_addr; +} CVIBUF; + +typedef struct { + CVIFrameFormat format; + CVIPackedFormat packedFormat; + CVICbCrInterLeave chromaInterleave; + CVIBUF vbY; + CVIBUF vbCb; + CVIBUF vbCr; + int width; + int height; + int strideY; + int strideC; +} CVIFRAMEBUF; + +/* encode config param */ +typedef struct { + int picWidth; + int picHeight; + int rotAngle; + int mirDir; + CVIFrameFormat sourceFormat; + int outNum; + CVICbCrInterLeave chromaInterleave; + int bEnStuffByte; + int encHeaderMode; + int RandRotMode; + CVIPackedFormat packedFormat; + int quality; + int bitrate; + int framerate; + int src_type; + int bitstreamBufSize; + int singleEsBuffer; + int jpgMarkerOrder[CVI_JPG_MARKER_ORDER_CNT]; +} CVIEncConfigParam; + +/* decode config param */ +typedef struct { + /* ROI param */ + int roiEnable; + int roiWidth; + int roiHeight; + int roiOffsetX; + int roiOffsetY; + /* Frame Partial Mode (DON'T SUPPORT)*/ + int usePartialMode; + /* Rotation Angle (0, 90, 180, 270) */ + int rotAngle; + /* mirror direction (0-no mirror, 1-vertical, 2-horizontal, 3-both) */ + int mirDir; + /* Scale Mode */ + int iHorScaleMode; + int iVerScaleMode; + /* stream data length */ + int iDataLen; + int dst_type; + CVIFRAMEBUF dec_buf; +} CVIDecConfigParam; + +/* jpu config param */ +typedef struct { + CVIJpgCodType type; + union { + CVIEncConfigParam enc; + CVIDecConfigParam dec; + } u; + int s32ChnNum; +} CVIJpgConfig; + +typedef struct _cviJpegChnAttr_ { + unsigned int + u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc channel */ + unsigned int + fr32DstFrameRate; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc channel */ + unsigned int u32BitRate; /* RW; Range:[2, 409600]; average bitrate */ + unsigned int picWidth; ///< width of a picture to be encoded + unsigned int picHeight; ///< height of a picture to be encoded +} cviJpegChnAttr; + +typedef struct _cviJpegUserData_ { + unsigned char *userData; + unsigned int len; +} cviJpegUserData; + +/* JPU CODEC HANDLE */ +typedef void *CVIJpgHandle; + +void cviJpgGetVersion(void); + +/* initial jpu core */ +int CVIJpgInit(void); +/* uninitial jpu core */ +void CVIJpgUninit(void); +/* alloc a jpu handle for dcoder or encoder */ +CVIJpgHandle CVIJpgOpen(CVIJpgConfig config); +/* jpu decode and encode capacity */ +int CVIJpgGetCaps(CVIJpgHandle jpgHandle); +/* close and free alloced jpu handle */ +int CVIJpgClose(CVIJpgHandle jpgHandle); +/* reset jpu core */ +int CVIJpgReset(CVIJpgHandle jpgHandle); +/* flush data */ +int CVIJpgFlush(CVIJpgHandle jpgHandle); +/* send jpu data to decode or encode */ +int CVIJpgSendFrameData(CVIJpgHandle jpgHandle, void *data, int length, + int s32TimeOut); +/* after decoded or encoded, get data from jpu */ +int CVIJpgGetFrameData(CVIJpgHandle jpgHandle, void *data, int length, + unsigned long int *pu64HwTime); +/* get jpu encoder input data buffer */ +int CVIJpgGetInputDataBuf(CVIJpgHandle jpgHandle, void *data, int length); +/* release stream buffer */ +int CVIJpgReleaseFrameData(CVIJpgHandle jpgHandle); +int cviJpegIoctl(void *handle, int op, void *arg); + +#ifdef __cplusplus +} +#endif + +#endif /* CVI_JPG_INTERFACE_H +*/ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/inc/cvi_jpg_internal.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/inc/cvi_jpg_internal.h new file mode 100644 index 0000000000..8862669a92 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/inc/cvi_jpg_internal.h @@ -0,0 +1,34 @@ +#ifndef CVI_JPG_INTERNAL_H +#define CVI_JPG_INTERNAL_H + +/* default jpu device struct */ +#define WIDTH_BUFFER_SIZE 4096 +#define HEIGHT_BUFFER_SIZE 2220 + +#define MEM_MALLOC(SIZE) vmalloc(SIZE) +#define MEM_CALLOC(NUMBER, SIZE) vzalloc(SIZE * NUMBER) +#define MEM_KMALLOC(SIZE) kmalloc(SIZE, GFP_KERNEL) +#define MEM_FREE(PTR) vfree(PTR) +#define MEM_KFREE(PTR) kfree(PTR) + +/* DEC */ +int cviJpgDecOpen(CVIJpgHandle *pHandle, CVIDecConfigParam *pConfig); +int cviJpgDecClose(CVIJpgHandle handle); +int cviJpgDecSendFrameData(CVIJpgHandle jpgHandle, void *data, int length); +int cviJpgDecGetFrameData(CVIJpgHandle jpgHandle, void *data); +int cviJpgDecFlush(CVIJpgHandle jpgHandle); + +/* ENC */ +int cviJpgEncOpen(CVIJpgHandle *pHandle, CVIEncConfigParam *pConfig); +int cviJpgEncClose(CVIJpgHandle handle); +int cviJpgEncSendFrameData(CVIJpgHandle jpgHandle, void *data, int srcType); +int cviJpgEncGetFrameData(CVIJpgHandle jpgHandle, void *data); +int cviJpgEncFlush(CVIJpgHandle jpgHandle); +int cviJpgEncGetInputDataBuf(CVIJpgHandle jpgHandle, void *data); +int cviJpgEncResetQualityTable(CVIJpgHandle jpgHandle); +int cviJpgEncEncodeUserData(CVIJpgHandle jpgHandle, void *data); +int cviJpgEncStart(CVIJpgHandle jpgHandle, void *data); + +extern void jpu_set_channel_num(int chnIdx); + +#endif /* CVI_JPG_INTERNAL_H */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/src/cvi_jpg_dec_internal.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/src/cvi_jpg_dec_internal.c new file mode 100644 index 0000000000..a3240bc536 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/src/cvi_jpg_dec_internal.c @@ -0,0 +1,831 @@ +#include "jputypes.h" +#include "jpuapi.h" +#include "regdefine.h" +#include "jpulog.h" +#include "mixer.h" +#include "jpulog.h" +#include "jpuhelper.h" +#include "jpurun.h" +#include "jpuapifunc.h" +#include "cvi_jpg_interface.h" +#include "cvi_jpg_internal.h" + +int cviJpgDecOpen(CVIJpgHandle *pHandle, CVIDecConfigParam *pConfig) +{ + JpgRet ret = JPG_RET_SUCCESS; + CVIJpgHandle handle; + JpgInst *pJpgInst = 0; + JpgDecInfo *pDecInfo = 0; + JpgDecOpenParam decOP = { 0 }; + jpu_buffer_t vbStream = { 0 }; + int usePartialMode = 0; + int partialBufNum = 1; + int iHorScaleMode = 0; + int iVerScaleMode = 0; + int rotAngle = 0; + int mirDir = 0; + int rotEnable = 0; +#ifdef CVI_JPG_USE_ION_MEM +#ifdef BITSTREAM_ION_CACHED_MEM + int bBsStreamCached = 1; +#else + int bBsStreamCached = 0; +#endif +#endif + + CVI_JPG_DBG_IF("pHandle = %p\n", pHandle); + + /* Check Param */ + if (pConfig->usePartialMode && pConfig->roiEnable) { + JLOG(ERR, + "Invalid operation mode : partial and ROI mode can not be worked\n"); + ret = JPG_RET_INVALID_PARAM; + goto ERR_DEC_INIT; + } + + if (pConfig->dec_buf.packedFormat && pConfig->roiEnable) { + JLOG(ERR, + "Invalid operation mode : packed mode and ROI mode can not be worked\n"); + ret = JPG_RET_INVALID_PARAM; + goto ERR_DEC_INIT; + } + + if ((pConfig->iHorScaleMode || pConfig->iVerScaleMode) && + pConfig->roiEnable) { + JLOG(ERR, + "Invalid operation mode : Scaler mode and ROI mode can not be worked\n"); + ret = JPG_RET_INVALID_PARAM; + goto ERR_DEC_INIT; + } + + if ((pConfig->rotAngle != 0) && pConfig->roiEnable) { + JLOG(ERR, + "Invalid operation mode : Rotator mode and ROI mode can not be worked\n"); + ret = JPG_RET_INVALID_PARAM; + goto ERR_DEC_INIT; + } + + if (pConfig->dec_buf.packedFormat < 0 || + pConfig->dec_buf.packedFormat > 6) { + JLOG(ERR, + "Invalid operation mode : packedFormat must between 0~5\n"); + ret = JPG_RET_INVALID_PARAM; + goto ERR_DEC_INIT; + } + + /* set bit endian order */ + decOP.streamEndian = JPU_STREAM_ENDIAN; + decOP.frameEndian = JPU_FRAME_ENDIAN; + + /* YUV fmt */ + /* [0](PLANAR), [1](YUYV), [2](UYVY), [3](YVYU), [4](VYUY), [5](YUV_444 + * PACKED), [6](RGB_444 PACKED) + */ + if (PACKED_FORMAT_444_RGB == + (PackedOutputFormat)pConfig->dec_buf.packedFormat) { + decOP.packedFormat = PACKED_FORMAT_444; + } else { + decOP.packedFormat = + (PackedOutputFormat)pConfig->dec_buf.packedFormat; + } + /* UV Interleave Mode */ + if (decOP.packedFormat) + decOP.chromaInterleave = (CbCrInterLeave)CBCR_SEPARATED; + else + decOP.chromaInterleave = + (CbCrInterLeave)pConfig->dec_buf.chromaInterleave; + + /* ROI param */ + decOP.roiEnable = pConfig->roiEnable; + decOP.roiOffsetX = pConfig->roiOffsetX; + decOP.roiOffsetY = pConfig->roiOffsetY; + decOP.roiWidth = pConfig->roiWidth; + decOP.roiHeight = pConfig->roiHeight; + + /* Frame Partial Mode (DON'T SUPPORT)*/ + // usePartialMode = pConfig->usePartialMode; + usePartialMode = 0; + partialBufNum = 1; + + /* Rotation Angle (0, 90, 180, 270) */ + rotAngle = pConfig->rotAngle; + + /* mirror direction (0-no mirror, 1-vertical, 2-horizontal, 3-both) */ + mirDir = pConfig->mirDir; + + if (0 != rotAngle || 0 != mirDir) + rotEnable = 1; + else + rotEnable = 0; + + /* Scale Mode */ + iHorScaleMode = pConfig->iHorScaleMode; + iVerScaleMode = pConfig->iVerScaleMode; + + /* allocate bitstream buffer */ + // JLOG(INFO, "jdi_allocate_dma_memory\n"); + + CVI_JPG_DBG_FLOW("iDataLen = 0x%X\n", pConfig->iDataLen); + if (pConfig->iDataLen > STREAM_BUF_SIZE) { + JLOG(ERR, + "The length 0f the input stream is greater than the length of the JPU input buffer!, vbStream addr = 0x%lX\n", + vbStream.phys_addr); + goto ERR_DEC_INIT; + } else { + vbStream.size = (pConfig->iDataLen & 0xffffc000) + + 0x4000; // STREAM_BUF_SIZE; + } + + CVI_JPG_DBG_FLOW("vbStream.size = 0x%x\n", vbStream.size); + + if (JDI_ALLOCATE_MEMORY(&vbStream, 0, bBsStreamCached) < 0) { + JLOG(ERR, "fail to allocate bitstream buffer\n"); + ret = JPG_RET_FAILURE; + goto ERR_DEC_INIT; + } + + decOP.bitstreamBuffer = vbStream.phys_addr; + decOP.bitstreamBufferSize = vbStream.size; + // set virtual address mapped of physical address + decOP.pBitStream = (BYTE *)vbStream.virt_addr; + + decOP.dst_type = pConfig->dst_type; + + if (decOP.dst_type == JPEG_MEM_EXTERNAL) { + decOP.dst_info.bufY = pConfig->dec_buf.vbY.phys_addr; + decOP.dst_info.bufCb = pConfig->dec_buf.vbCb.phys_addr; + decOP.dst_info.bufCr = pConfig->dec_buf.vbCr.phys_addr; + } + + // Open an instance and get initial information for decoding. + // JLOG(INFO, "JPU_DecOpen\n"); + + CVI_JPG_DBG_FLOW("JPU_DecOpen\n"); + + ret = JPU_DecOpen((JpgDecHandle *)pHandle, &decOP); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, "JPU_DecOpen failed Error code is 0x%x\n", ret); + goto ERR_DEC_INIT; + } + + handle = *pHandle; + pJpgInst = *pHandle; + pJpgInst->type = 1; + pDecInfo = &pJpgInst->JpgInfo.decInfo; + + CVI_JPG_DBG_FLOW("initial param for decoder\n"); + + /* initial param for decoder */ + ret = JPU_DecGiveCommand(handle, SET_JPG_USE_PARTIAL_MODE, + &(usePartialMode)); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_DecGiveCommand[SET_JPG_USE_PARTIAL_MODE] failed Error code is 0x%x\n", + ret); + goto ERR_DEC_INIT; + } + ret = JPU_DecGiveCommand(handle, SET_JPG_PARTIAL_FRAME_NUM, + &(partialBufNum)); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_DecGiveCommand[SET_JPG_PARTIAL_FRAME_NUM] failed Error code is 0x%x\n", + ret); + goto ERR_DEC_INIT; + } + + if (rotEnable) { + JPU_DecGiveCommand(handle, SET_JPG_ROTATION_ANGLE, &(rotAngle)); + JPU_DecGiveCommand(handle, SET_JPG_MIRROR_DIRECTION, &(mirDir)); + // JPU_DecGiveCommand(handle, SET_JPG_ROTATOR_OUTPUT, + // &(pDecInfo->frameBuf[0])); + JPU_DecGiveCommand(handle, ENABLE_JPG_ROTATION, 0); + JPU_DecGiveCommand(handle, ENABLE_JPG_MIRRORING, 0); + } + + ret = JPU_DecGiveCommand(handle, SET_JPG_SCALE_HOR, &(iHorScaleMode)); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_DecGiveCommand[SET_JPG_SCALE_HOR] failed Error code is 0x%x\n", + ret); + goto ERR_DEC_INIT; + } + ret = JPU_DecGiveCommand(handle, SET_JPG_SCALE_VER, &(iVerScaleMode)); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_DecGiveCommand[SET_JPG_SCALE_VER] failed Error code is 0x%x\n", + ret); + goto ERR_DEC_INIT; + } + + return JPG_RET_SUCCESS; + +ERR_DEC_INIT: +#ifdef VC_DRIVER_TEST + if (0 != pDecInfo->pFrame[0]) { + FreeFrameBuffer(pJpgInst->instIndex); + pDecInfo->pFrame[0] = 0; + } +#endif + if (vbStream.phys_addr) { + JDI_FREE_MEMORY(&vbStream); + } + return ret; +} + +int cviJpgDecClose(CVIJpgHandle handle) +{ + JpgRet ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo = &pJpgInst->JpgInfo.decInfo; + jpu_buffer_t vbStream = { 0 }; + + /* check handle valid */ + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) { + pr_err("cviJpgDecClose CheckJpgInstValidity failed Error code is 0x%x\n", + ret); + return ret; + } + /* stop decode operator */ + JPU_DecIssueStop(handle); +#ifdef VC_DRIVER_TEST + if (pDecInfo->dst_type != JPEG_MEM_EXTERNAL) { + /* free frame buffer */ + FreeFrameBuffer(pJpgInst->instIndex); + pDecInfo->pFrame[0] = 0; + pDecInfo->frameBuf[0].bufY = 0; + pDecInfo->frameBuf[0].bufCb = 0; + } +#endif + /* free bitstream buffer */ + vbStream.size = pDecInfo->streamBufSize; + vbStream.phys_addr = pDecInfo->streamBufStartAddr; + JDI_FREE_MEMORY(&vbStream); + memset(&vbStream, 0, sizeof(vbStream)); + + /* close handle */ + JPU_DecClose(pJpgInst); + return JPG_RET_SUCCESS; +} + +int cviJpgDecSendFrameData(CVIJpgHandle handle, void *data, int length) +{ + JpgRet ret = JPG_RET_SUCCESS; + JpgDecParam decParam = { 0 }; + Uint32 needFrameBufCount = 1; + Uint32 regFrameBufCount = 0; + Uint32 framebufWidth = 0; + Uint32 framebufHeight = 0; + Uint32 framebufStride = 0; + Uint32 framebufFormat = FORMAT_420; + int int_reason = 0; + int streameos = 0; + BufInfo bufInfo = { 0 }; + JpgDecInitialInfo initialInfo = { 0 }; + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo = &pJpgInst->JpgInfo.decInfo; + int partialHeight = 0; + int partMaxIdx = 0; + + /* check handle valid */ + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) { + JLOG(INFO, "CheckJpgInstValidity fail, return %d\n", ret); + return ret; + } + + // cviJpgDecFlush( handle ); + + /* send jpeg data to jpu */ + // JLOG(INFO, "cviJpgSendDecFrameData\n"); + bufInfo.buf = data; + bufInfo.size = length; + bufInfo.point = 0; + ret = WriteJpgBsBufHelper(handle, &bufInfo, + pDecInfo->streamBufStartAddr, + pDecInfo->streamBufEndAddr, 0, 0, &streameos, + pDecInfo->streamEndian); + if (ret != JPG_RET_SUCCESS) { + pr_err("WriteBsBufHelper failed Error code is 0x%x\n", ret); + goto SEND_DEC_DATA_ERR; + } + + if (1 != pDecInfo->initialInfoObtained) { + ret = JPU_DecGetInitialInfo(handle, &initialInfo); + if (ret != JPG_RET_SUCCESS) { + pr_err("JPU_DecGetInitialInfo failed Error code is 0x%x\n", + ret); + return ret; + } + } + if (pDecInfo->usePartial) { + // disable Rotator, Scaler + pDecInfo->rotationEnable = 0; + pDecInfo->mirrorEnable = 0; + pDecInfo->iHorScaleMode = 0; + pDecInfo->iVerScaleMode = 0; + partialHeight = (initialInfo.sourceFormat == FORMAT_420 || + initialInfo.sourceFormat == FORMAT_224) ? + 16 : + 8; + + partMaxIdx = + ((initialInfo.picHeight + 15) & ~15) / partialHeight; + if (partMaxIdx < pDecInfo->bufNum) + pDecInfo->bufNum = partMaxIdx; + } + + framebufWidth = ((initialInfo.picWidth + 63) >> 6) << 6; // 64 byte + // align for + // vpp of + // yuv2bgr + + if (initialInfo.sourceFormat == FORMAT_420 || + initialInfo.sourceFormat == FORMAT_224) + framebufHeight = ((initialInfo.picHeight + 15) >> 4) << 4; + else + framebufHeight = ((initialInfo.picHeight + 7) >> 3) << 3; + + if (pDecInfo->roiEnable) { + framebufWidth = initialInfo.roiFrameWidth; + framebufHeight = initialInfo.roiFrameHeight; + } + + // scaler constraint when conformance test is disable + if (framebufWidth < 128 || framebufHeight < 128) { + if (pDecInfo->iHorScaleMode || pDecInfo->iVerScaleMode) + JLOG(WARN, + "Invalid operation mode : Not supported resolution with Scaler, width=%d, height=%d\n", + framebufWidth, framebufHeight); + + pDecInfo->iHorScaleMode = 0; + pDecInfo->iVerScaleMode = 0; + } + + // JLOG(INFO, "* Dec InitialInfo =>\n instance #%d,\n + // minframeBuffercount: %u\n", instIdx, + // initialInfo.minFrameBufferCount); + JLOG(INFO, + "picWidth: %u\n picHeight: %u\n roiWidth: %u\n rouHeight: %u\n", + initialInfo.picWidth, initialInfo.picHeight, + initialInfo.roiFrameWidth, initialInfo.roiFrameHeight); + + if (pDecInfo->usePartial) { + JLOG(INFO, "Partial Mode Enable\n"); + JLOG(INFO, "Num of Buffer for Partial : %d\n", + pDecInfo->bufNum); + JLOG(INFO, "Num of Line for Partial : %d\n", partialHeight); + } + + framebufFormat = initialInfo.sourceFormat; + + framebufWidth >>= pDecInfo->iHorScaleMode; + framebufHeight >>= pDecInfo->iVerScaleMode; + if (pDecInfo->iHorScaleMode || pDecInfo->iVerScaleMode) { + framebufHeight = ((framebufHeight + 1) >> 1) << 1; + framebufWidth = ((framebufWidth + 1) >> 1) << 1; + } + + if (pDecInfo->rotationAngle == 90 || pDecInfo->rotationAngle == 270) { + framebufHeight = ((framebufHeight + 63) >> 6) << 6; // 64 byte + // align for + // vpp of + // yuv2bgr + framebufStride = framebufHeight; + framebufHeight = framebufWidth; + framebufFormat = + (framebufFormat == FORMAT_422) ? FORMAT_224 : + (framebufFormat == FORMAT_224) ? FORMAT_422 : + framebufFormat; + } else { + framebufStride = framebufWidth; + } + + if (pDecInfo->iHorScaleMode || pDecInfo->iVerScaleMode) { + framebufStride = ((framebufStride + 15) >> 4) << 4; + } + + if (pDecInfo->packedFormat >= PACKED_FORMAT_422_YUYV && + pDecInfo->packedFormat <= PACKED_FORMAT_422_VYUY) { + framebufStride = framebufStride * 2; + framebufFormat = FORMAT_422; + if (pDecInfo->rotationAngle == 90 || + pDecInfo->rotationAngle == 270) + framebufFormat = FORMAT_224; + } else if (pDecInfo->packedFormat == PACKED_FORMAT_444) { + framebufStride = framebufStride * 3; + framebufFormat = FORMAT_444; + } + + // printf( "framebuffer stride: %d, width: %d, height = %d,framebuffer + // format: %d , packed format = %d\n", framebufStride, framebufWidth, + // framebufHeight, framebufFormat, pDecInfo->packedFormat); + + // Allocate frame buffer + + regFrameBufCount = initialInfo.minFrameBufferCount; + + if (pDecInfo->usePartial) { + if (pDecInfo->bufNum > 4) + pDecInfo->bufNum = 4; + + regFrameBufCount *= pDecInfo->bufNum; + ret = JPU_DecGiveCommand(handle, SET_JPG_PARTIAL_LINE_NUM, + &(partialHeight)); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_DecGiveCommand[SET_JPG_PARTIAL_LINE_NUM] failed Error code is 0x%x\n", + ret); + return ret; + } + } + + needFrameBufCount = regFrameBufCount; +#ifdef VC_DRIVER_TEST + if (pDecInfo->dst_type != JPEG_MEM_EXTERNAL) { + Uint32 i = 0; + + CVI_JPG_DBG_FLOW("AllocateFrameBuffer\n"); + if (!AllocateFrameBuffer(pJpgInst->instIndex, framebufFormat, + framebufStride, framebufHeight, + needFrameBufCount, 0)) { + JLOG(INFO, "alloc encode instance frame buffer fail\n"); + // goto ERR_DEC_INIT; + return -1; + } + + for (i = 0; i < needFrameBufCount; ++i) { + pDecInfo->pFrame[i] = + GetFrameBuffer(pJpgInst->instIndex, i); + pDecInfo->frameBuf[i].bufY = + pDecInfo->pFrame[i]->vbY.phys_addr; + pDecInfo->frameBuf[i].bufCb = + pDecInfo->pFrame[i]->vbCb.phys_addr; + if (pDecInfo->chromaInterleave == CBCR_SEPARATED) + pDecInfo->frameBuf[i].bufCr = + pDecInfo->pFrame[i]->vbCr.phys_addr; + } + + if (pDecInfo->rotationEnable == 1 && + pDecInfo->mirrorEnable == 1) { + JPU_DecGiveCommand( + handle, SET_JPG_ROTATOR_OUTPUT, + &(pDecInfo->frameBuf[0])); // bug for rotator + JPU_DecGiveCommand(handle, SET_JPG_ROTATOR_STRIDE, + &framebufStride); + } + + // Register frame buffers requested by the decoder. + ret = JPU_DecRegisterFrameBuffer(handle, pDecInfo->frameBuf, + regFrameBufCount, + framebufStride); + if (ret != JPG_RET_SUCCESS) { + pr_err("JPU_DecRegisterFrameBuffer failed Error code is 0x%x\n", + ret); + goto SEND_DEC_DATA_ERR; + } + } else +#endif + { + pDecInfo->dst_info.stride = framebufStride; + pDecInfo->stride = framebufStride; + } + + // Start decoding a frame. +#ifdef CVIDEBUG_V + JLOG(INFO, "JPU_DecStartOneFrame\n"); +#endif /* CVIDEBUG_V */ + // JPU_SWReset(); + ret = JPU_DecStartOneFrame(handle, &decParam); + jpu_set_channel_num(pJpgInst->s32ChnNum); + if (ret != JPG_RET_SUCCESS && ret != JPG_RET_EOS) { + if (ret == JPG_RET_BIT_EMPTY) { + ret = WriteJpgBsBufHelper( + handle, &bufInfo, pDecInfo->streamBufStartAddr, + pDecInfo->streamBufEndAddr, STREAM_FILL_SIZE, 0, + &streameos, pDecInfo->streamEndian); + if (ret != JPG_RET_SUCCESS) { + pr_err("WriteBsBufHelper failed Error code is 0x%x\n", + ret); + goto SEND_DEC_DATA_ERR; + } + } else { + pr_err("JPU_DecStartOneFrame failed Error code is 0x%x\n", + ret); + goto SEND_DEC_DATA_ERR; + } + } + + if (ret == JPG_RET_EOS) { + JLOG(INFO, "Receive jpeg end.\n"); + goto JPU_END_OF_STREAM; + } + + while (1) { + int_reason = JPU_WaitInterrupt(JPU_INTERRUPT_TIMEOUT_MS); + if (-1 == int_reason) { + ret = JPU_HWReset(); + if (ret < 0) { + pr_err("Error : jpu reset failed\n"); + return JPG_RET_HWRESET_FAILURE; + } +#ifdef CVIDEBUG_V + else { + pr_err("info : jpu dec interruption timeout happened and is reset automatically\n"); + } +#endif + SetJpgPendingInst(pJpgInst); + return JPG_RET_HWRESET_SUCCESS; + } + + // Must catch PIC_DONE interrupt before catching EMPTY interrupt + if (int_reason & (1 << INT_JPU_DONE) || + int_reason & (1 << INT_JPU_ERROR)) { + // Do no clear INT_JPU_DONE and INT_JPU_ERROR interrupt. + // these will be cleared in JPU_DecGetOutputInfo. + break; + } + + if (int_reason & (1 << INT_JPU_BIT_BUF_EMPTY)) { +#ifdef CVIDEBUG_V + JLOG(ERR, "JPU dec need more data\n"); +#endif + ret = WriteJpgBsBufHelper( + handle, &bufInfo, pDecInfo->streamBufStartAddr, + pDecInfo->streamBufEndAddr, STREAM_FILL_SIZE, 0, + &streameos, pDecInfo->streamEndian); + if (ret != JPG_RET_SUCCESS) { + pr_err("WriteBsBufHelper failed Error code is 0x%x\n", + ret); + goto SEND_DEC_DATA_ERR; + } + + JPU_ClrStatus((1 << INT_JPU_BIT_BUF_EMPTY)); + JpuWriteReg(MJPEG_INTR_MASK_REG, 0x0); + } + + if (int_reason & (1 << INT_JPU_BIT_BUF_STOP)) { + ret = JPU_DecCompleteStop(handle); + if (ret != JPG_RET_SUCCESS) { + pr_err("JPU_DecCompleteStop failed Error code is 0x%x\n", + ret); + goto SEND_DEC_DATA_ERR; + } + + JPU_ClrStatus((1 << INT_JPU_BIT_BUF_STOP)); + break; + } + + if (int_reason & (1 << INT_JPU_PARIAL_OVERFLOW)) + JPU_ClrStatus((1 << INT_JPU_PARIAL_OVERFLOW)); + } + +JPU_END_OF_STREAM: +SEND_DEC_DATA_ERR: + pJpgInst->u64EndTime = jpgGetCurrentTime(); + return JPG_RET_SUCCESS; +} + +int cviJpgDecGetFrameData(CVIJpgHandle jpgHandle, void *data) +{ + JpgRet ret = JPG_RET_SUCCESS; + JpgDecOutputInfo outputInfo = { 0 }; + // JpgDecParam decParam = {0}; + // int rotEnable = 0; + // int usePartialMode = 0; + // int streameos = 0; + // BufInfo bufInfo = {0}; + // int tmp_framesize = 0; + + JpgInst *pJpgInst = (JpgDecHandle)jpgHandle; + JpgDecInfo *pDecInfo = &pJpgInst->JpgInfo.decInfo; + CVIFRAMEBUF *cviFrameBuf = NULL; + + // JLOG(INFO, "Enter cviJpgDecGetFrameData\n"); + /* check handle valid */ + ret = CheckJpgInstValidity((JpgDecHandle)jpgHandle); + if (ret != JPG_RET_SUCCESS) + return ret; + + ret = JPU_DecGetOutputInfo((JpgDecHandle)jpgHandle, &outputInfo); + + if (ret != JPG_RET_SUCCESS) { + pr_err("JPU_DecGetOutputInfo failed Error code is 0x%x\n", + ret); + goto GET_DEC_DATA_ERR; + } + + if (outputInfo.decodingSuccess == 0) + pr_err("JPU_DecGetOutputInfo decode fail\n"); + +#ifdef CVIDEBUG_V + JLOG(TRACE, + "#%d || consumedByte %d || frameStart=0x%x || ecsStart=0x%x || rdPtr=0x%x || wrPtr=0x%x || pos=%d\n", + outputInfo.indexFrameDisplay, outputInfo.consumedByte, + outputInfo.bytePosFrameStart, + outputInfo.bytePosFrameStart + outputInfo.ecsPtr, + JpuReadReg(MJPEG_BBC_RD_PTR_REG), JpuReadReg(MJPEG_BBC_WR_PTR_REG), + JpuReadReg(MJPEG_BBC_CUR_POS_REG)); +#endif + + // store image + cviFrameBuf = (CVIFRAMEBUF *)data; + cviFrameBuf->format = (CVIFrameFormat)pDecInfo->format; + cviFrameBuf->packedFormat = (CVIPackedFormat)pDecInfo->packedFormat; + cviFrameBuf->chromaInterleave = + (CVICbCrInterLeave)pDecInfo->chromaInterleave; + if (pDecInfo->dst_type == JPEG_MEM_EXTERNAL) { + cviFrameBuf->vbY.phys_addr = pDecInfo->dst_info.bufY; + cviFrameBuf->strideY = pDecInfo->dst_info.stride; + cviFrameBuf->width = pDecInfo->picWidth; + cviFrameBuf->height = pDecInfo->picHeight; + + switch (cviFrameBuf->format) { + case CVI_FORMAT_400: + cviFrameBuf->vbCb.phys_addr = 0; + cviFrameBuf->vbCr.phys_addr = 0; + cviFrameBuf->strideC = 0; + break; + case CVI_FORMAT_422: + cviFrameBuf->vbCb.phys_addr = pDecInfo->dst_info.bufCb; + cviFrameBuf->vbCr.phys_addr = pDecInfo->dst_info.bufCr; + cviFrameBuf->strideC = pDecInfo->dst_info.stride >> 1; + break; + case CVI_FORMAT_444: + cviFrameBuf->vbCb.phys_addr = pDecInfo->dst_info.bufCb; + cviFrameBuf->vbCr.phys_addr = pDecInfo->dst_info.bufCr; + cviFrameBuf->strideC = pDecInfo->dst_info.stride; + break; + case CVI_FORMAT_420: + default: + if (pDecInfo->chromaInterleave) { + cviFrameBuf->vbCb.phys_addr = + pDecInfo->dst_info.bufCb; + cviFrameBuf->vbCr.phys_addr = 0; + cviFrameBuf->strideC = + pDecInfo->dst_info.stride; + } else { + cviFrameBuf->vbCb.phys_addr = + pDecInfo->dst_info.bufCb; + cviFrameBuf->vbCr.phys_addr = + pDecInfo->dst_info.bufCr; + cviFrameBuf->strideC = + pDecInfo->dst_info.stride >> 1; + } + break; + } + } +#ifdef VC_DRIVER_TEST + else { + memcpy(&(cviFrameBuf->vbY), &(pDecInfo->pFrame[0]->vbY), + sizeof(jpu_buffer_t)); + memcpy(&(cviFrameBuf->vbCb), &(pDecInfo->pFrame[0]->vbCb), + sizeof(jpu_buffer_t)); + memcpy(&(cviFrameBuf->vbCr), &(pDecInfo->pFrame[0]->vbCr), + sizeof(jpu_buffer_t)); + + if (pDecInfo->rotationAngle == 90 || + pDecInfo->rotationAngle == 270) { + cviFrameBuf->width = + outputInfo.decPicHeight; // pDecInfo->picHeight; + cviFrameBuf->height = + outputInfo.decPicWidth; // pDecInfo->picWidth; + } else { + cviFrameBuf->width = pDecInfo->picWidth; + cviFrameBuf->height = pDecInfo->picHeight; + if (pDecInfo->iHorScaleMode || + pDecInfo->iVerScaleMode) { + cviFrameBuf->width = outputInfo.decPicWidth; + cviFrameBuf->height = outputInfo.decPicHeight; + } + } + cviFrameBuf->strideY = pDecInfo->pFrame[0]->strideY; + cviFrameBuf->strideC = pDecInfo->pFrame[0]->strideC; + if (pDecInfo->chromaInterleave) + cviFrameBuf->strideC *= 2; + } +#endif +//#define __FOR_TEST__ 1 +//#define _USE_PHYSIC_ADDRESS_ 1 +#ifdef __FOR_TEST__ + FILE *fpYuv = fopen("dst2.yuv", "wb"); + int i, j, k, iDecPicHeight = 0; + + Uint8 *buff = malloc(WIDTH_BUFFER_SIZE); + +#ifdef _OUT_I420 + iDecPicHeight = outputInfo.decPicHeight >> 1; +#else // dump I422 + iDecPicHeight = outputInfo.decPicHeight; +#endif +#ifdef _USE_PHYSIC_ADDRESS_ + PhysicalAddress addrY = pDecInfo->frameBuf[0].bufY; + PhysicalAddress addrCb = pDecInfo->frameBuf[0].bufCb; + PhysicalAddress addrCr = pDecInfo->frameBuf[0].bufCr; + for (i = 0; i < outputInfo.decPicHeight; i++) { + JpuReadMem((addrY + i * cviFrameBuf->strideY), (Uint8 *)(buff), + outputInfo.decPicWidth, pDecInfo->frameEndian); + fwrite(buff, sizeof(Uint8), outputInfo.decPicWidth, fpYuv); + } + + for (i = 0; i < iDecPicHeight; i++) { + JpuReadMem((addrCb + i * cviFrameBuf->strideC), (Uint8 *)(buff), + outputInfo.decPicWidth >> 1, pDecInfo->frameEndian); + fwrite(buff, sizeof(Uint8), outputInfo.decPicWidth >> 1, fpYuv); + } + + for (i = 0; i < iDecPicHeight; i++) { + JpuReadMem((addrCr + i * cviFrameBuf->strideC), (Uint8 *)(buff), + outputInfo.decPicWidth >> 1, pDecInfo->frameEndian); + fwrite(buff, sizeof(Uint8), outputInfo.decPicWidth >> 1, fpYuv); + } +#else /* !_USE_PHYSIC_ADDRESS_ */ + Uint8 *addrY_v = (Uint8 *)(pDecInfo->pFrame[0]->vbY.virt_addr); + Uint8 *addrCb_v = (Uint8 *)(pDecInfo->pFrame[0]->vbCb.virt_addr); + Uint8 *addrCr_v = (Uint8 *)(pDecInfo->pFrame[0]->vbCr.virt_addr); + + Uint8 *address = addrY_v; + for (i = 0; i < outputInfo.decPicHeight; i++) { + memcpy((Uint8 *)(buff), (const void *)address, + outputInfo.decPicWidth); + fwrite(buff, sizeof(Uint8), outputInfo.decPicWidth, fpYuv); + address = address + cviFrameBuf->strideY; + } + + address = addrCb_v; + if (CBCR_SEPARATED != pDecInfo->chromaInterleave) { + for (i = 0; i < iDecPicHeight; i++) { + memcpy((Uint8 *)(buff), (Uint8 *)address, + outputInfo.decPicWidth); + fwrite(buff, sizeof(Uint8), outputInfo.decPicWidth, + fpYuv); + address = address + cviFrameBuf->strideC * 2; + } + } else { + for (i = 0; i < iDecPicHeight; i++) { + memcpy((Uint8 *)(buff), (Uint8 *)address, + outputInfo.decPicWidth >> 1); + fwrite(buff, sizeof(Uint8), outputInfo.decPicWidth >> 1, + fpYuv); + address = address + cviFrameBuf->strideC; + } + address = addrCr_v; + for (i = 0; i < iDecPicHeight; i++) { + memcpy((Uint8 *)(buff), (Uint8 *)address, + outputInfo.decPicWidth >> 1); + fwrite(buff, sizeof(Uint8), outputInfo.decPicWidth >> 1, + fpYuv); + address = address + cviFrameBuf->strideC; + } + } +#endif /* _USE_PHYSIC_ADDRESS_ */ + + fclose(fpYuv); + free(buff); +#endif /* __FOR_TEST__ */ + + jpu_set_channel_num(-1); + + JpgLeaveLock(); + // JLOG(INFO, "Level cviJpgDecGetFrameData\n"); + return JPG_RET_SUCCESS; + +GET_DEC_DATA_ERR: + JpgLeaveLock(); + return ret; +} + +int cviJpgDecFlush(CVIJpgHandle jpgHandle) +{ + JpgRet ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst = (JpgDecHandle)jpgHandle; + JpgDecInfo *pDecInfo = &pJpgInst->JpgInfo.decInfo; + + // JLOG(INFO, "Enter cviJpgDecFlush\n"); + + ret = CheckJpgInstValidity((JpgDecHandle)jpgHandle); + if (ret != JPG_RET_SUCCESS) { + JLOG(INFO, "Leave cviJpgDecFlush\n"); + return ret; + } + + pDecInfo->streamWrPtr = pDecInfo->streamBufStartAddr; + pDecInfo->streamRdPtr = pDecInfo->streamBufStartAddr; + if (GetJpgPendingInst() == pJpgInst) { + JpuWriteReg(MJPEG_BBC_RD_PTR_REG, pDecInfo->streamRdPtr); + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, pDecInfo->streamWrPtr); + JpuWriteReg(MJPEG_BBC_STRM_CTRL_REG, 0); + } + pDecInfo->frameOffset = 0; + pDecInfo->consumeByte = 0; + pDecInfo->nextOffset = 0; + pDecInfo->currOffset = 0; + pDecInfo->ecsPtr = 0; + pDecInfo->streamEndflag = 0; + // pDecInfo->headerSize = 0; + + JPU_SWReset(); + // JLOG(INFO, "Leave cviJpgDecFlush\n"); + + return JPG_RET_SUCCESS; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/src/cvi_jpg_enc_internal.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/src/cvi_jpg_enc_internal.c new file mode 100644 index 0000000000..402c4f3cfa --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/src/cvi_jpg_enc_internal.c @@ -0,0 +1,1586 @@ +#include +#include +#include +#include +#include +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) +#include +#endif +#include +#include +#include "jputypes.h" +#include "jpuapi.h" +#include "regdefine.h" +#include "jpulog.h" +#include "mixer.h" +#include "jpulog.h" +#include "jpuhelper.h" +#include "jpurun.h" +#include "jpuapifunc.h" +#include "cvi_jpg_interface.h" +#include "cvi_jpg_internal.h" +#include "cvi_vcom.h" + +#define CVI_RC_MIN_I_PROP 1 +#define CVI_RC_MDL_UPDATE_TYPE 0 +#define Q_CLIP_RANGE 12 +#define CVI_RC_DEF_ALPHA 18 +#define CVI_RC_DEF_BETA 2 +#define STD_JPEG 14 + +static int JpgEncParamSet_size; +uint32_t maxIQp = 1; +module_param(maxIQp, uint, 0644); +uint32_t minIQp = 100; +module_param(minIQp, uint, 0644); +extern void jpu_set_channel_num(int chnIdx); + +static void cviJpeRc_RcKernelInit(stRcInfo *pRcInfo, stRcCfg *pRcCfg); +static int cviJpeRc_RcKernelEstimatePic(stRcInfo *pRcInfo); +static void cviJpeRc_RcKernelUpdatePic(stRcInfo *pRcInfo, int encByte); +static int cvi_jpeg_quality_scaling(int quality); +static int cviJpgGetEnv(char *envVar); +static int cviJpegEncWaitInterrupt(CVIJpgHandle jpgHandle, JpgRet *pRet); +static int cviJpgEncGetOneFrameData(CVIJpgHandle jpgHandle, void *data); + +void add_stats(stSlideWinStats *ptSWStats, int stats) +{ + int curr_ptr = ptSWStats->ptrIdx; + ptSWStats->total -= ptSWStats->stats[curr_ptr]; + ptSWStats->total += stats; + ptSWStats->stats[curr_ptr] = stats; + ptSWStats->ptrIdx = (ptSWStats->ptrIdx + 1) % ptSWStats->winSize; +} + +int get_stats(stSlideWinStats *ptSWStats) +{ + return ptSWStats->total; +} + +// ---------------------------------------------- +typedef enum { + E_BITRATE = 0, + E_FRAMERATE = 1, +} eRcParam; + +// ---------------------------------------------- +// main API +void cviJpeRc_Open(stRcInfo *pRcInfo, stRcCfg *pRcCfg) +{ + CVI_JPG_DBG_RC("targetBitrate %dk byte\n", pRcCfg->targetBitrate); + CVI_JPG_DBG_RC("picAvgBit %d byte\n", pRcInfo->picAvgBit); + CVI_JPG_DBG_RC("picPelNum %d\n", pRcInfo->picPelNum); + CVI_JPG_DBG_RC("fps %d\n", pRcInfo->fps); + CVI_JPG_DBG_RC("minQ %d\n", pRcInfo->minQ); + CVI_JPG_DBG_RC("maxQ %d\n", pRcInfo->maxQ); + CVI_JPG_DBG_RC("qClipRange %d\n", pRcInfo->qClipRange); + + if (jpeg_mask & CVI_MASK_RC) { + stSlideWinStats *ptBitRateStats = &pRcInfo->stBitRateStats; + int frameRateDiv, frameRateRes; + + frameRateDiv = (pRcCfg->fps >> 16) + 1; + frameRateRes = pRcCfg->fps & 0xFFFF; + + ptBitRateStats->winSize = frameRateRes / frameRateDiv; + ptBitRateStats->total = 0; + ptBitRateStats->ptrIdx = 0; + memset(ptBitRateStats->stats, 0, + pRcCfg->fps * sizeof(ptBitRateStats->stats[0])); + CVI_JPG_DBG_RC("maxBitrateLimit %dk byte\n", + pRcCfg->maxBitrateLimit); + } + + pRcInfo->cviRcEn = pRcCfg->cviRcEn; + CVI_JPG_DBG_RC("cviRcEn = %d\n", pRcInfo->cviRcEn); + if (pRcInfo->cviRcEn) { + cviJpeRc_RcKernelInit(pRcInfo, pRcCfg); + } +} + +static void cviJpeRc_RcKernelInit(stRcInfo *pRcInfo, stRcCfg *pRcCfg) +{ + stRcKernelInfo *pRcKerInfo = &pRcInfo->rcKerInfo; + stRcKernelCfg rcKerCfg, *pRcKerCfg = &rcKerCfg; + int frameRateDiv, frameRateRes; + + pRcInfo->maxQs = cviJpgGetEnv("maxIQp"); + pRcInfo->maxQs = (pRcInfo->maxQs >= 0) ? cvi_jpeg_quality_scaling(pRcInfo->maxQs) : 1; + pRcInfo->minQs = cviJpgGetEnv("minIQp"); + pRcInfo->minQs = (pRcInfo->minQs >= 0) ? cvi_jpeg_quality_scaling(pRcInfo->minQs) : 100; + + pRcKerCfg->targetBitrate = pRcCfg->targetBitrate * 1000; + pRcKerCfg->codec = STD_JPEG; + + frameRateDiv = (pRcCfg->fps >> 16) + 1; + frameRateRes = pRcCfg->fps & 0xFFFF; + + pRcKerCfg->framerate = + CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(frameRateRes), INT_TO_CVI_FLOAT(frameRateDiv)); + pRcKerCfg->intraPeriod = 1; + pRcKerCfg->statTime = 2; + pRcKerCfg->ipQpDelta = 0; + pRcKerCfg->numOfPixel = pRcCfg->width * pRcCfg->height; + pRcKerCfg->maxIprop = 100; + pRcKerCfg->minIprop = CVI_RC_MIN_I_PROP; + pRcKerCfg->maxIQp = 51; + pRcKerCfg->minIQp = 1; + pRcKerCfg->maxQp = pRcKerCfg->maxIQp; + pRcKerCfg->minQp = pRcKerCfg->minIQp; + pRcKerCfg->firstFrmstartQp = 1; + pRcKerCfg->rcMdlUpdatType = CVI_RC_MDL_UPDATE_TYPE; + + CVI_JPG_DBG_CVRC("targetBitrate = %d, codec = %d, framerate = %d, intraPeriod = %d\n", + pRcKerCfg->targetBitrate, pRcKerCfg->codec, pRcKerCfg->framerate, pRcKerCfg->intraPeriod); + CVI_JPG_DBG_CVRC("statTime = %d, ipQpDelta = %d, numOfPixel = %d, maxIprop = %d, minIprop = %d\n", + pRcKerCfg->statTime, + pRcKerCfg->ipQpDelta, + pRcKerCfg->numOfPixel, + pRcKerCfg->maxIprop, + pRcKerCfg->minIprop); + CVI_JPG_DBG_CVRC("maxQp = %d, minQp = %d, maxIQp = %d, minIQp = %d\n", + pRcKerCfg->maxQp, + pRcKerCfg->minQp, + pRcKerCfg->maxIQp, + pRcKerCfg->minIQp); + CVI_JPG_DBG_CVRC("firstFrmstartQp = %d, rcMdlUpdatType = %d\n", + pRcKerCfg->firstFrmstartQp, + pRcKerCfg->rcMdlUpdatType); + CVI_JPG_DBG_CVRC("minQs = %d, maxQs = %d\n", + pRcInfo->minQs, + pRcInfo->maxQs); + cviRcKernel_init(pRcKerInfo, pRcKerCfg); + + cviRcKernel_setLastPicQpClip(pRcKerInfo, Q_CLIP_RANGE); + cviRcKernel_setLevelPicQpClip(pRcKerInfo, Q_CLIP_RANGE); + cviRcKernel_setpPicQpNormalClip(pRcKerInfo, Q_CLIP_RANGE); + cviRcKernel_setRCModelParam(pRcKerInfo, + INT_TO_CVI_FLOAT(CVI_RC_DEF_ALPHA), + INT_TO_CVI_FLOAT(CVI_RC_DEF_BETA), + 0); + + CVI_PRNT(" fn, targetBit, qp, encodedBit\n"); + CVI_PRNT("-------------------------------\n"); +} + +int cviJpeRc_EstimatePicQs(stRcInfo *pRcInfo) +{ + return cviJpeRc_RcKernelEstimatePic(pRcInfo); +} + +static int cviJpeRc_RcKernelEstimatePic(stRcInfo *pRcInfo) +{ + stRcKernelInfo *pRcKerInfo = &pRcInfo->rcKerInfo; + stRcKernelPicOut *pRcPicOut = &pRcInfo->rcPicOut; + int qs; + + cviRcKernel_estimatePic(pRcKerInfo, pRcPicOut, 1, pRcInfo->picIdx); + + CVI_JPG_DBG_FLOAT("qp = %d, lambda = %f, targetBit = %d\n", + pRcPicOut->qp, getFloat(pRcPicOut->lambda), pRcPicOut->targetBit); + + qs = CVI_FLOAT_TO_INT(pRcPicOut->lambda); + CVI_JPG_DBG_CVRC("qs = %d, minQs = %d, maxQs = %d\n", qs, pRcInfo->minQs, pRcInfo->maxQs); + + if (qs < pRcInfo->minQs) { + qs = pRcInfo->minQs; + pRcPicOut->lambda = INT_TO_CVI_FLOAT(qs); + CVI_JPG_DBG_CVRC("qs = %d, to min\n", qs); + } else if (qs > pRcInfo->maxQs) { + qs = pRcInfo->maxQs; + pRcPicOut->lambda = INT_TO_CVI_FLOAT(qs); + CVI_JPG_DBG_CVRC("qs = %d, to max\n", qs); + } + + return qs; +} + +void cviJpeRc_UpdatePic(stRcInfo *pRcInfo, int encByte) +{ + CVI_JPG_DBG_RC("(%d)qs %d target %dk, actual %dk\n", pRcInfo->picIdx, + pRcInfo->lastPicQ, pRcInfo->picTargetBit / 1000, + encByte / 1000); + + if (jpeg_mask & CVI_MASK_RC) { + add_stats(&pRcInfo->stBitRateStats, encByte); + + if (pRcInfo->picIdx >= (unsigned int)pRcInfo->fps) { + int currKByteRate = + get_stats(&pRcInfo->stBitRateStats) / 1000; + + if (currKByteRate > pRcInfo->maxBitrateLimit) { + CVI_JPG_DBG_RC( + "[WARNING] BITRATE OVERFLOW %dkbyte (%dk)\n", + currKByteRate, + pRcInfo->maxBitrateLimit); + } else { + CVI_JPG_DBG_RC("SLIDE_WIN %dkbyte\n", + currKByteRate); + } + } + } + + pRcInfo->bitErr = CLIP( + INT_MIN, INT_MAX, + ((long long)pRcInfo->bitErr + (pRcInfo->picAvgBit - encByte))); + pRcInfo->picIdx++; + + if (pRcInfo->cviRcEn) + cviJpeRc_RcKernelUpdatePic(pRcInfo, encByte); +} + +static void cviJpeRc_RcKernelUpdatePic(stRcInfo *pRcInfo, int encByte) +{ + stRcKernelInfo *pRcKerInfo = &pRcInfo->rcKerInfo; + stRcKernelPicOut *pRcPicOut = &pRcInfo->rcPicOut; + stRcKernelPicIn rcPicIn, *pRcPicIn = &rcPicIn; + + pRcPicIn->encodedQp = INT_TO_CVI_FLOAT(-1); + pRcPicIn->encodedLambda = pRcPicOut->lambda; + pRcPicIn->madi = INT_TO_CVI_FLOAT(-1); + pRcPicIn->encodedBit = encByte << 3; + pRcPicIn->mse = INT_TO_CVI_FLOAT(-1); + pRcPicIn->skipRatio = INT_TO_CVI_FLOAT(-1); + + cviRcKernel_updatePic(pRcKerInfo, pRcPicIn, 1); + + if (jpeg_mask & CVI_MASK_CVRC) { + CVI_PRNT("%4d, %9d, %2d, %11d\n", + pRcInfo->picIdx, pRcPicOut->targetBit, pRcPicOut->qp, pRcPicIn->encodedBit); + } +} + +#define DCTSIZE2 64 + +static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { + 16, 11, 12, 14, 12, 10, 16, 14, 13, 14, 18, 17, 16, + 19, 24, 40, 26, 24, 22, 22, 24, 49, 35, 37, 29, 40, + 58, 51, 61, 60, 57, 51, 56, 55, 64, 72, 92, 78, 64, + 68, 87, 69, 55, 56, 80, 109, 81, 87, 95, 98, 103, 104, + 103, 62, 77, 113, 121, 112, 100, 120, 92, 101, 103, 99, +}; + +static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { + 17, 18, 18, 24, 21, 24, 47, 26, 26, 47, 99, 66, 56, 66, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, +}; + +void cvi_jpeg_add_quant_table(unsigned char *q_table, + const unsigned int base_table[DCTSIZE2], + int scale_factor, unsigned int force_baseline) +{ + int i = 0; + + for (i = 0; i < DCTSIZE2; i++) { + unsigned int temp = + ((long)base_table[i] * scale_factor + 50L) / 100L; + /* limit the values to the valid range */ + if (temp <= 0L) + temp = 1L; + if (temp > 32767L) + temp = 32767L; /* max quantizer needed for 12 bits */ + if (force_baseline && temp > 255L) + temp = 255L; /* limit to baseline range if requested */ + q_table[i] = (unsigned char)temp; + } +} + +static int cvi_jpeg_quality_scaling(int quality) +/* Convert a user-specified quality rating to a percentage scaling factor + * for an underlying quantization table, using our recommended scaling curve. + * The input 'quality' factor should be 0 (terrible) to 100 (very good). + */ +{ + /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ + if (quality <= 0) + quality = 1; + if (quality > 100) + quality = 100; + + /* The basic table is used as-is (scaling 100) for a quality of 50. + * Qualities 50..100 are converted to scaling percentage 200 - 2*Q; + * note that at Q=100 the scaling is 0, which will cause cvi_jpeg_add_quant_table + * to make all the table entries 1 (hence, minimum quantization loss). + * Qualities 1..50 are converted to scaling percentage 5000/Q. + */ + if (quality < 50) + quality = 5000 / quality; + else + quality = 200 - quality * 2; + + return quality; +} + +void cvi_jpgGetQMatrix(int scale_factor, unsigned char *qMatTab0, + unsigned char *qMatTab1) +{ + unsigned int force_baseline = 1; + cvi_jpeg_add_quant_table(qMatTab0, std_luminance_quant_tbl, + scale_factor, force_baseline); + cvi_jpeg_add_quant_table(qMatTab1, std_chrominance_quant_tbl, + scale_factor, force_baseline); +} + +int LoadYuvImageBurstFormat2(Uint8 *src, unsigned long addrY, + unsigned long addrCb, unsigned long addrCr, + int picWidth, int picHeight, int stride, + int interLeave, int format, int endian, int packed) +{ + int y, nY = 0, nCb = 0, nCr = 0; + unsigned long addr; + int size; + int lumaSize = 0, chromaSize = 0, chromaStride = 0, chromaWidth = 0; + CVIFRAMEBUF *srcFrameBuffer = (CVIFRAMEBUF *)src; + if (NULL == srcFrameBuffer) { + JLOG(ERR, "Invalid input param.\n"); + return 0; + } + + switch (format) { + case FORMAT_420: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 2; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + case FORMAT_224: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 1; + chromaStride = stride; + chromaWidth = picWidth; + break; + case FORMAT_422: + nY = picHeight; + nCb = nCr = picHeight; + chromaSize = (picWidth * picHeight) >> 1; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + case FORMAT_444: + nY = picHeight; + nCb = nCr = picHeight; + chromaSize = picWidth * picHeight; + chromaStride = stride; + chromaWidth = picWidth; + break; + case FORMAT_400: + nY = picHeight; + nCb = nCr = 0; + chromaSize = (picWidth * picHeight) >> 2; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + } + + addr = addrY; + + if (packed) { + if (packed == PACKED_FORMAT_444) + picWidth *= 3; + else + picWidth *= 2; + + chromaSize = 0; + } + + lumaSize = picWidth * nY; + + size = lumaSize + chromaSize * 2; + + // for fast write + if (picWidth == stride) { + JpuWriteMem(addr, (Uint8 *)(srcFrameBuffer->vbY.virt_addr), + lumaSize, endian); + + if (format == FORMAT_400) + return size; + + if (packed) + return size; + + if (interLeave) { + Uint8 t0, t1, t2, t3, t4, t5, t6, t7; + int i, height, width; + int stride; + Uint8 *pTemp; + Uint8 *dstAddrCb; + Uint8 *dstAddrCr; + + addr = addrCb; + stride = chromaStride * 2; + + height = nCb; + width = chromaWidth * 2; + + dstAddrCb = (Uint8 *)(srcFrameBuffer->vbCb.virt_addr); + dstAddrCr = (Uint8 *)(srcFrameBuffer->vbCr.virt_addr); + + pTemp = MEM_MALLOC(width + 16); + if (!pTemp) { + return 0; + } + + for (y = 0; y < height; ++y) { + for (i = 0; i < width; i += 8) { + t0 = *dstAddrCb++; + t2 = *dstAddrCb++; + t4 = *dstAddrCb++; + t6 = *dstAddrCb++; + t1 = *dstAddrCr++; + t3 = *dstAddrCr++; + t5 = *dstAddrCr++; + t7 = *dstAddrCr++; + + if (interLeave == CBCR_INTERLEAVE) { + pTemp[i] = t0; + pTemp[i + 1] = t1; + pTemp[i + 2] = t2; + pTemp[i + 3] = t3; + pTemp[i + 4] = t4; + pTemp[i + 5] = t5; + pTemp[i + 6] = t6; + pTemp[i + 7] = t7; + } else { + pTemp[i] = t1; + pTemp[i + 1] = t0; + pTemp[i + 2] = t3; + pTemp[i + 3] = t2; + pTemp[i + 4] = t5; + pTemp[i + 5] = t4; + pTemp[i + 6] = t7; + pTemp[i + 7] = t6; + } + } + JpuWriteMem(addr + stride * y, + (unsigned char *)pTemp, width, + endian); + } + MEM_FREE(pTemp); + } else { + if (chromaStride == chromaWidth) { + addr = addrCb; + JpuWriteMem( + addr, + (Uint8 *)(unsigned long)(srcFrameBuffer + ->vbCb + .virt_addr), + chromaSize, endian); + + addr = addrCr; + JpuWriteMem( + addr, + (Uint8 *)(unsigned long)(srcFrameBuffer + ->vbCr + .virt_addr), + chromaSize, endian); + } else { + addr = addrCb; + for (y = 0; y < nCb; ++y) { + JpuWriteMem( + addr + chromaStride * y, + (Uint8 *)(srcFrameBuffer->vbCb + .virt_addr + + y * chromaWidth), + chromaWidth, endian); + } + + addr = addrCr; + for (y = 0; y < nCr; ++y) { + JpuWriteMem( + addr + chromaStride * y, + (Uint8 *)(srcFrameBuffer->vbCr + .virt_addr + + y * chromaWidth), + chromaWidth, endian); + } + } + } + } else { + for (y = 0; y < nY; ++y) { + JpuWriteMem(addr + stride * y, + (Uint8 *)(srcFrameBuffer->vbY.virt_addr + + y * picWidth), + picWidth, endian); + } + + if (format == FORMAT_400) + return size; + + if (packed) + return size; + + if (interLeave) { + Uint8 t0, t1, t2, t3, t4, t5, t6, t7; + int i, width, height, stride; + Uint8 *pTemp; + Uint8 *dstAddrCb; + Uint8 *dstAddrCr; + + addr = addrCb; + stride = chromaStride * 2; + height = nCb; + width = chromaWidth * 2; + + dstAddrCb = (Uint8 *)(srcFrameBuffer->vbCb.virt_addr); + dstAddrCr = (Uint8 *)(srcFrameBuffer->vbCr.virt_addr); + + pTemp = MEM_MALLOC(width + 16); + if (!pTemp) { + return 0; + } + + // it may be not occur that pic_width in not 8byte + // alined. + for (y = 0; y < height; ++y) { + for (i = 0; i < width; i += 8) { + t0 = *dstAddrCb++; + t2 = *dstAddrCb++; + t4 = *dstAddrCb++; + t6 = *dstAddrCb++; + t1 = *dstAddrCr++; + t3 = *dstAddrCr++; + t5 = *dstAddrCr++; + t7 = *dstAddrCr++; + + if (interLeave == CBCR_INTERLEAVE) { + pTemp[i] = t0; + pTemp[i + 1] = t1; + pTemp[i + 2] = t2; + pTemp[i + 3] = t3; + pTemp[i + 4] = t4; + pTemp[i + 5] = t5; + pTemp[i + 6] = t6; + pTemp[i + 7] = t7; + } else { + pTemp[i] = t1; + pTemp[i + 1] = t0; + pTemp[i + 2] = t3; + pTemp[i + 3] = t2; + pTemp[i + 4] = t5; + pTemp[i + 5] = t3; + pTemp[i + 6] = t7; + pTemp[i + 7] = t6; + } + } + JpuWriteMem(addr + stride * y, + (unsigned char *)pTemp, width, + endian); + } + MEM_FREE(pTemp); + } else { + addr = addrCb; + for (y = 0; y < nCb; ++y) { + JpuWriteMem(addr + chromaStride * y, + (Uint8 *)(srcFrameBuffer->vbCb + .virt_addr + + y * chromaWidth), + chromaWidth, endian); + } + + addr = addrCr; + for (y = 0; y < nCr; ++y) { + JpuWriteMem(addr + chromaStride * y, + (Uint8 *)(srcFrameBuffer->vbCr + .virt_addr + + y * chromaWidth), + chromaWidth, endian); + } + } + } + + return size; +} + +int cviJpgEncOpen(CVIJpgHandle *pHandle, CVIEncConfigParam *pConfig) +{ + EncConfigParam *pEncConfig; + CVIJpgHandle handle; + JpgRet ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst = 0; + JpgEncInfo *pEncInfo = 0; + JpgEncOpenParam *pEncOP = 0; + jpu_buffer_t vbStream = { 0 }; + JpgEncInitialInfo initialInfo = { 0 }; + int usePartialMode = 0; + int partialBufNum = 1; + int partialHeight = HEIGHT_BUFFER_SIZE; +#ifdef CVI_JPG_USE_ION_MEM +#ifdef BITSTREAM_ION_CACHED_MEM + int bBsStreamCached = 1; +#else + int bBsStreamCached = 0; +#endif +#endif + Uint32 framebufWidth = 0; + Uint32 framebufHeight = 0; + Uint32 framebufStride = 0; + int srcFrameFormat = 0; + Uint32 framebufFormat = FORMAT_420; + + CVI_JPG_DBG_IF("pHandle = %p\n", pHandle); + + pEncConfig = MEM_MALLOC(sizeof(EncConfigParam)); + pEncOP = MEM_CALLOC(1, sizeof(JpgEncOpenParam)); + if (pEncConfig == NULL || pEncOP == NULL) { + JLOG(ERR, "no memory for pEncConfig(%p) or pEncOP(%p)\n", pEncConfig, pEncOP); + return JPG_RET_FAILURE; + } + memset(pEncConfig, 0x0, sizeof(EncConfigParam)); + + pEncConfig->picWidth = pConfig->picWidth; + pEncConfig->picHeight = pConfig->picHeight; + pEncConfig->sourceFormat = (FrameFormat)pConfig->sourceFormat; + pEncConfig->packedFormat = (PackedOutputFormat)pConfig->packedFormat; + pEncConfig->chromaInterleave = (CbCrInterLeave)pConfig->chromaInterleave; + + if (jdi_set_enc_task(pConfig->singleEsBuffer, &pConfig->bitstreamBufSize) != + 0) { + MEM_FREE(pEncConfig); + MEM_FREE(pEncOP); + return JPG_RET_INVALID_PARAM; + } + + ret = getJpgEncOpenParamDefault(pEncOP, pEncConfig); + if (ret == 0) { + MEM_FREE(pEncConfig); + MEM_FREE(pEncOP); + return JPG_RET_INVALID_PARAM; + } + + if (PACKED_FORMAT_444_RGB == (PackedOutputFormat)pEncOP->packedFormat) { + pEncOP->rgbPacked = 1; + pEncOP->packedFormat = PACKED_FORMAT_444; + } + pEncOP->bitrate = pConfig->bitrate; + pEncOP->framerate = pConfig->framerate; + pEncOP->quality = pConfig->quality; + + /* set bit endian order */ + pEncOP->streamEndian = JPU_STREAM_ENDIAN; + pEncOP->frameEndian = JPU_FRAME_ENDIAN; + pEncOP->chromaInterleave = (CbCrInterLeave)pConfig->chromaInterleave; + + /* allocate bitstream buffer */ + // JLOG(INFO, "jdi_allocate_dma_memory\n"); + + if (pConfig->src_type == JPEG_MEM_EXTERNAL) { + if (pConfig->bitstreamBufSize > 0) + vbStream.size = pConfig->bitstreamBufSize; + else + vbStream.size = LARGE_STREAM_BUF_SIZE; + } else { + vbStream.size = STREAM_BUF_SIZE; + } + + CVI_JPG_DBG_MEM("vbStream.size = 0x%x, task num %d\n", vbStream.size, + jdi_get_task_num()); + + if (jdi_use_single_es_buffer() && jdi_get_enc_task_num() > 1) { + if (jdi_get_allocated_memory(&vbStream, 1) < 0) { + JLOG(ERR, "fail to allocate bitstream buffer\n"); + ret = JPG_RET_FAILURE; + goto ERR_ENC_INIT; + } + } else { + if (JDI_ALLOCATE_MEMORY(&vbStream, 1, bBsStreamCached) < 0) { + JLOG(ERR, "fail to allocate bitstream buffer\n"); + ret = JPG_RET_FAILURE; + goto ERR_ENC_INIT; + } + } + + pEncOP->bitstreamBuffer = vbStream.phys_addr; + pEncOP->bitstreamBufferSize = vbStream.size; + + /* Open an instance and get initial information for encoding */ + // JLOG(INFO, "JPU_EncOpen\n"); + ret = JPU_EncOpen((JpgEncHandle *)pHandle, pEncOP); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, "JPU_EncOpen failed Error code is 0x%x\n", ret); + goto ERR_ENC_INIT; + } + + handle = *pHandle; + pJpgInst = *pHandle; + pJpgInst->type = 2; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + // set virtual address mapped of physical address + pEncInfo->pBitStream = (BYTE *)vbStream.virt_addr; + + /* JPEG marker order */ + memcpy(pEncInfo->jpgMarkerOrder, pConfig->jpgMarkerOrder, + JPG_MARKER_ORDER_BUF_SIZE); + + if ((pConfig->rotAngle != 0) || (pConfig->mirDir != 0)) { + JPU_EncGiveCommand(handle, ENABLE_JPG_ROTATION, 0); + JPU_EncGiveCommand(handle, ENABLE_JPG_MIRRORING, 0); + JPU_EncGiveCommand(handle, SET_JPG_ROTATION_ANGLE, + &pConfig->rotAngle); + JPU_EncGiveCommand(handle, SET_JPG_MIRROR_DIRECTION, + &pConfig->mirDir); + } + JPU_EncGiveCommand(handle, SET_JPG_USE_PARTIAL_MODE, &usePartialMode); + JPU_EncGiveCommand(handle, SET_JPG_PARTIAL_FRAME_NUM, &partialBufNum); + JPU_EncGiveCommand(handle, SET_JPG_PARTIAL_LINE_NUM, &partialHeight); + JPU_EncGiveCommand(handle, SET_JPG_USE_STUFFING_BYTE_FF, + &pConfig->bEnStuffByte); + + /* get encode instance info */ + ret = JPU_EncGetInitialInfo(handle, &initialInfo); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, "JPU_EncGetInitialInfo failed Error code is 0x%x\n", + ret); + goto ERR_ENC_INIT; + } + + srcFrameFormat = pEncOP->sourceFormat; + + if (pConfig->rotAngle == 90 || pConfig->rotAngle == 270) + framebufFormat = + (srcFrameFormat == FORMAT_422) ? FORMAT_224 : + (srcFrameFormat == FORMAT_224) ? FORMAT_422 : + srcFrameFormat; + else + framebufFormat = srcFrameFormat; + + if (framebufFormat == FORMAT_420 || framebufFormat == FORMAT_422) + framebufWidth = (((pEncOP->picWidth + 15) >> 4) << 4); + else + framebufWidth = (((pEncOP->picWidth + 7) >> 3) << 3); + + if (framebufFormat == FORMAT_420 || framebufFormat == FORMAT_224) + framebufHeight = (((pEncOP->picHeight + 15) >> 4) << 4); + else + framebufHeight = (((pEncOP->picHeight + 7) >> 3) << 3); + + framebufStride = framebufWidth; + + if (pEncOP->packedFormat >= PACKED_FORMAT_422_YUYV && + pEncOP->packedFormat <= PACKED_FORMAT_422_VYUY) { + framebufStride = framebufStride * 2; + framebufFormat = FORMAT_422; + if (pConfig->rotAngle == 90 || pConfig->rotAngle == 270) + framebufFormat = FORMAT_224; + } else if (pEncOP->packedFormat == PACKED_FORMAT_444) { + framebufStride = framebufStride * 3; + framebufFormat = FORMAT_444; + } + +#ifdef CVIDEBUG_V + JLOG(INFO, "framebuffer stride: %d, width: %d, height = %d\n", + framebufStride, framebufWidth, framebufHeight); + + /* Initialize frame buffers for encoding and source frame */ + JLOG(INFO, "AllocateFrameBuffer\n"); +#endif + + pEncInfo->framebufStride = framebufStride; +#ifdef VC_DRIVER_TEST + if (pConfig->src_type != JPEG_MEM_EXTERNAL) { + Uint32 i = 0; + Uint32 needFrameBufCount = 1; + + if (!AllocateFrameBuffer(pJpgInst->instIndex, srcFrameFormat, + framebufStride, framebufHeight, + needFrameBufCount, + pEncOP->packedFormat)) { + JLOG(INFO, "alloc encode instance frame buffer fail\n"); + ret = JPG_RET_FAILURE; + goto ERR_ENC_INIT; + } + + for (i = 0; i < needFrameBufCount; ++i) { + pEncInfo->pFrame[i] = + GetFrameBuffer(pJpgInst->instIndex, i); + pEncInfo->frameBuf[i].stride = + pEncInfo->pFrame[i]->strideY; + pEncInfo->frameBuf[i].bufY = + pEncInfo->pFrame[i]->vbY.phys_addr; + pEncInfo->frameBuf[i].bufCb = + pEncInfo->pFrame[i]->vbCb.phys_addr; + pEncInfo->frameBuf[i].bufCr = + pEncInfo->pFrame[i]->vbCr.phys_addr; + } + pEncInfo->framebufStride = framebufStride; + } +#endif + pEncInfo->encHeaderMode = pConfig->encHeaderMode; + + if (pEncInfo->openParam.bitrate != 0) { + stRcInfo *pRcInfo = &pEncInfo->openParam.RcInfo; + stRcCfg *pRcCfg = &pEncInfo->openParam.RcCfg; + + pRcCfg->fps = pEncInfo->openParam.framerate; + pRcCfg->height = pEncInfo->openParam.picHeight; + pRcCfg->width = pEncInfo->openParam.picWidth; + pRcCfg->targetBitrate = pEncInfo->openParam.bitrate; + pRcCfg->minQ = 1; + pRcCfg->maxQ = 1200; + //pRcCfg->qClipRange = 2; + pRcCfg->qClipRange = Q_CLIP_RANGE; + pRcCfg->maxBitrateLimit = 20000; // 24M + + pRcCfg->cviRcEn = 1; + + CVI_JPG_DBG_INFO("cviRcEn = %d\n", pRcCfg->cviRcEn); + cviJpeRc_Open(pRcInfo, pRcCfg); + } + + if (pEncConfig != NULL) { + MEM_FREE(pEncConfig); + } + if (pEncOP != NULL) { + MEM_FREE(pEncOP); + } + + /* initial param for decoder */ + return JPG_RET_SUCCESS; + +ERR_ENC_INIT: + if (pEncConfig != NULL) { + MEM_FREE(pEncConfig); + } + if (pEncOP != NULL) { + MEM_FREE(pEncOP); + } +#ifdef VC_DRIVER_TEST + if (pEncInfo && (pEncInfo->pFrame)) { + FreeFrameBuffer(pJpgInst->instIndex); + pEncInfo->pFrame[0] = 0; + } +#endif + if (!(jdi_get_enc_task_num() > 1 && jdi_use_single_es_buffer())) { + JDI_FREE_MEMORY(&vbStream); + } + return ret; +} + +static int cviJpgGetEnv(char *envVar) +{ + extern uint32_t cviRcEn; + + if (strcmp(envVar, "maxIQp") == 0) + return maxIQp; + if (strcmp(envVar, "minIQp") == 0) + return minIQp; + if (strcmp(envVar, "cviRcEn") == 0) + return cviRcEn; + + return -1; +} + +int cviJpgEncClose(CVIJpgHandle handle) +{ + JpgRet ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst = handle; + JpgEncInfo *pEncInfo = &pJpgInst->JpgInfo.encInfo; + jpu_buffer_t vbStream = { 0 }; + + /* check handle valid */ + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + /* stop encode operator */ + JPU_EncIssueStop(handle); +#ifdef VC_DRIVER_TEST + /* free frame buffer */ + if (pEncInfo->pFrame[0]) + FreeFrameBuffer(pJpgInst->instIndex); +#endif + pEncInfo->pFrame[0] = 0; + pEncInfo->frameBuf[0].bufY = 0; + pEncInfo->frameBuf[0].bufCb = 0; + pEncInfo->frameBuf[0].bufCr = 0; + pEncInfo->frameBuf[0].stride = 0; + + /* free bitstream buffer */ + vbStream.size = pEncInfo->streamBufSize; + vbStream.phys_addr = pEncInfo->streamBufStartAddr; + + if (!(jdi_get_enc_task_num() > 1 && jdi_use_single_es_buffer())) { + JDI_FREE_MEMORY(&vbStream); + } + memset(&vbStream, 0, sizeof(vbStream)); + pEncInfo->streamBufStartAddr = 0; + + if (pEncInfo->tPthreadId) { + complete(&pEncInfo->semSendEncCmd); + kthread_stop(pEncInfo->tPthreadId); + pEncInfo->tPthreadId = NULL; + } + + jdi_delete_enc_task(); + /* close handle */ + JPU_EncClose(pJpgInst); + return JPG_RET_SUCCESS; +} + +static int cviJpgEncBufFullSaveStream(JpgEncInfo *pEncInfo) +{ + BYTE *p = MEM_MALLOC(pEncInfo->preStreamLen + pEncInfo->streamBufSize); + + if (p == NULL) { + JLOG(ERR, "null pointer\n"); + return JPG_RET_FAILURE; + } + +#if (defined CVI_JPG_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + jdi_invalidate_ion_cache(pEncInfo->streamBufStartAddr, + pEncInfo->pBitStream, pEncInfo->streamBufSize); +#endif + if (pEncInfo->pPreStream) { + memcpy(p, pEncInfo->pPreStream, pEncInfo->preStreamLen); + memcpy(p + pEncInfo->preStreamLen, pEncInfo->pBitStream, + pEncInfo->streamBufSize); + MEM_FREE(pEncInfo->pPreStream); + pEncInfo->pPreStream = NULL; + } else { + memcpy(p, pEncInfo->pBitStream, pEncInfo->streamBufSize); + } + + pEncInfo->pPreStream = p; + pEncInfo->preStreamLen += pEncInfo->streamBufSize; + return JPG_RET_SUCCESS; +} + +int cviJpgEncSendFrameData(CVIJpgHandle handle, void *data, int srcType) +{ + JpgRet ret = JPG_RET_SUCCESS; + JpgEncParamSet encHeaderParam = { 0 }; + JpgEncParam encParam = { 0 }; + FrameBuffer externalBuf; +#ifdef VC_DRIVER_TEST + int srcFrameIdx = 0; +#endif + JpgInst *pJpgInst = NULL; + JpgEncInfo *pEncInfo = NULL; + stRcInfo *pRcInfo = NULL; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) { + JLOG(INFO, "CheckJpgInstValidity fail, return %d\n", ret); + return ret; + } + pJpgInst = handle; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + pRcInfo = &pEncInfo->openParam.RcInfo; +#ifdef VC_DRIVER_TEST + /* write data to frame buffer */ + if (0 == srcType) { + + encParam.sourceFrame = &pEncInfo->frameBuf[srcFrameIdx]; + } else if (1 == srcType) { + LoadYuvImageBurstFormat2( + (BYTE *)data, pEncInfo->frameBuf[srcFrameIdx].bufY, + pEncInfo->frameBuf[srcFrameIdx].bufCb, + pEncInfo->frameBuf[srcFrameIdx].bufCr, + pEncInfo->picWidth, pEncInfo->picHeight, + pEncInfo->framebufStride, pEncInfo->chromaInterleave, + pEncInfo->sourceFormat, pEncInfo->frameEndian, + pEncInfo->packedFormat); + + encParam.sourceFrame = &pEncInfo->frameBuf[srcFrameIdx]; + } else if (JPEG_MEM_MODULE == srcType) { +#ifdef CVIDEBUG_V + JLOG(INFO, + "Must call cviJpgEncGetInputDataBuf before call this interface.\n"); +#endif /* CVIDEBUG_V */ + + encParam.sourceFrame = &pEncInfo->frameBuf[srcFrameIdx]; + } else +#endif + if (srcType == JPEG_MEM_EXTERNAL) { + CVIFRAMEBUF *pSrcInfo = (CVIFRAMEBUF *)data; + CVI_JPG_DBG_TRACE("srcType = %d\n", srcType); + + externalBuf.bufY = pSrcInfo->vbY.phys_addr; + externalBuf.bufCb = pSrcInfo->vbCb.phys_addr; + externalBuf.bufCr = pSrcInfo->vbCr.phys_addr; + externalBuf.stride = pSrcInfo->strideY; + encParam.sourceFrame = &externalBuf; + pEncInfo->sourceFormat = (FrameFormat)pSrcInfo->format; + pEncInfo->packedFormat = + (PackedOutputFormat)pSrcInfo->packedFormat; + pEncInfo->chromaInterleave = + (CbCrInterLeave)pSrcInfo->chromaInterleave; + + // Picture size alignment + if (pEncInfo->sourceFormat == FORMAT_420 || + pEncInfo->sourceFormat == FORMAT_422) + pEncInfo->alignedWidth = + ((pEncInfo->picWidth + 15) >> 4) << 4; + else + pEncInfo->alignedWidth = ((pEncInfo->picWidth + 7) >> 3) + << 3; + + if (pEncInfo->sourceFormat == FORMAT_420 || + pEncInfo->sourceFormat == FORMAT_224) + pEncInfo->alignedHeight = + ((pEncInfo->picHeight + 15) >> 4) << 4; + else + pEncInfo->alignedHeight = + ((pEncInfo->picHeight + 7) >> 3) << 3; + + if (pEncInfo->sourceFormat == FORMAT_400) { + pEncInfo->compInfo[1] = 0; + pEncInfo->compInfo[2] = 0; + } else { + pEncInfo->compInfo[1] = 5; + pEncInfo->compInfo[2] = 5; + } + + if (pEncInfo->sourceFormat == FORMAT_400) + pEncInfo->compNum = 1; + else + pEncInfo->compNum = 3; + + if (pEncInfo->sourceFormat == FORMAT_420) { + pEncInfo->mcuBlockNum = 6; + pEncInfo->compInfo[0] = 10; + pEncInfo->busReqNum = 2; + } else if (pEncInfo->sourceFormat == FORMAT_422) { + pEncInfo->mcuBlockNum = 4; + pEncInfo->busReqNum = 3; + pEncInfo->compInfo[0] = 9; + } else if (pEncInfo->sourceFormat == FORMAT_224) { + pEncInfo->mcuBlockNum = 4; + pEncInfo->busReqNum = 3; + pEncInfo->compInfo[0] = 6; + } else if (pEncInfo->sourceFormat == FORMAT_444) { + pEncInfo->mcuBlockNum = 3; + pEncInfo->compInfo[0] = 5; + pEncInfo->busReqNum = 4; + } else if (pEncInfo->sourceFormat == FORMAT_400) { + pEncInfo->mcuBlockNum = 1; + pEncInfo->busReqNum = 4; + pEncInfo->compInfo[0] = 5; + } + + } else { +#ifdef CVIDEBUG_V + JLOG(INFO, "Invalid source buffer format.\n"); +#endif /* CVIDEBUG_V */ + ret = JPG_RET_INVALID_PARAM; + goto ERR_ENC_FEAME; + } + // Write picture header + if (ENC_HEADER_MODE_NORMAL == pEncInfo->encHeaderMode) { + encHeaderParam.size = STREAM_BUF_SIZE; + encHeaderParam.headerMode = + ENC_HEADER_MODE_NORMAL; // Encoder header disable/enable + // control. Annex:A 1.2.3 item 13 + encHeaderParam.quantMode = JPG_TBL_NORMAL; // JPG_TBL_MERGE // + // Merge quantization + // table. + // Annex:A 1.2.3 item + // 7 + encHeaderParam.huffMode = JPG_TBL_NORMAL; // JPG_TBL_MERGE + // //Merge huffman + // table. + // Annex:A 1.2.3 item + // 6 + encHeaderParam.disableAPPMarker = 0; // Remove APPn. Annex:A + // item 11 + + if (encHeaderParam.headerMode == ENC_HEADER_MODE_NORMAL) { + // make picture header + JPU_EncGiveCommand( + handle, ENC_JPG_GET_HEADER, + &encHeaderParam); // return exact header size + // int endHeaderparam.siz; + JpgEncParamSet_size = encHeaderParam.size; + } + } + + if ((pEncInfo->openParam.bitrate != pRcInfo->targetBitrate) || + (pEncInfo->openParam.framerate != pRcInfo->fps)) { + stRcCfg *pRcCfg = &pEncInfo->openParam.RcCfg; + + pRcCfg->targetBitrate = pEncInfo->openParam.bitrate; + pRcCfg->fps = pEncInfo->openParam.framerate; + + } + +#ifdef CVIDEBUG_V + JLOG(INFO, "JPU_EncStartOneFrame\n"); +#endif /* CVIDEBUG_V */ + if (pEncInfo->openParam.bitrate != 0 || + pEncInfo->openParam.quality != 0) { + if (pEncInfo->openParam.quality == 0) { + cvi_jpgGetQMatrix( + cviJpeRc_EstimatePicQs( + &pEncInfo->openParam.RcInfo), + pEncInfo->openParam.qMatTab[DC_TABLE_INDEX0], + pEncInfo->openParam.qMatTab[AC_TABLE_INDEX0]); + } else { + cvi_jpgGetQMatrix( + cvi_jpeg_quality_scaling( + pEncInfo->openParam.quality), + pEncInfo->openParam.qMatTab[DC_TABLE_INDEX0], + pEncInfo->openParam.qMatTab[AC_TABLE_INDEX0]); + } + memcpy(pEncInfo->openParam.qMatTab[DC_TABLE_INDEX1], + pEncInfo->openParam.qMatTab[DC_TABLE_INDEX0], 64); + memcpy(pEncInfo->openParam.qMatTab[AC_TABLE_INDEX1], + pEncInfo->openParam.qMatTab[AC_TABLE_INDEX0], 64); + } + + jpu_set_channel_num(pJpgInst->s32ChnNum); + ret = JPU_EncStartOneFrame(handle, &encParam); + + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, "JPU_EncStartOneFrame failed Error code is 0x%x\n", + ret); + goto ERR_ENC_FEAME; + } + + if (pEncInfo->bIsoSendFrmEn && pEncInfo->tPthreadId) { + complete(&pEncInfo->semSendEncCmd); + } + return JPG_RET_SUCCESS; + +ERR_ENC_FEAME: + return ret; +} +extern wait_queue_head_t tWaitQueue[]; + +static int cviJpegEncWaitInterrupt(CVIJpgHandle jpgHandle, JpgRet *pRet) +{ + JpgInst *pJpgInst = jpgHandle; + JpgEncInfo *pEncInfo = &pJpgInst->JpgInfo.encInfo; + JpgRet ret = JPG_RET_SUCCESS; + int int_reason = 0; + + while (1) { + int_reason = JPU_WaitInterrupt(JPU_INTERRUPT_TIMEOUT_MS); + if (-1 == int_reason) { + ret = JPU_HWReset(); + if (ret < 0) { + JLOG(ERR, "Error : jpu reset failed\n"); + return JPG_RET_HWRESET_FAILURE; + } +#ifdef CVIDEBUG_V + else { + JLOG(ERR, "info : jpu enc interruption timeout happened and is reset automatically\n"); + } +#endif + SetJpgPendingInst(pJpgInst); + + return JPG_RET_HWRESET_SUCCESS; + } + + // Must catch PIC_DONE interrupt before catching EMPTY interrupt + if (int_reason & (1 << INT_JPU_DONE)) { + // Do no clear INT_JPU_DONE these will be cleared in + // JPU_EncGetOutputInfo. + *pRet = ret; + wake_up(&tWaitQueue[pJpgInst->s32ChnNum]); + return JPG_RET_BREAK; + } + + if (int_reason & (1 << INT_JPU_BIT_BUF_FULL)) { + JLOG(INFO, "[%d] bitstream buffer full\n", pJpgInst->instIndex); + ret = cviJpgEncBufFullSaveStream(pEncInfo); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, "cviJpgEncBufFullSaveStream failed 0x%x\n", ret); + *pRet = ret; + return JPG_RET_GOTO; + } + + JPU_EncUpdateBitstreamBuffer(jpgHandle, pEncInfo->streamBufSize); + JPU_ClrStatus((1 << INT_JPU_BIT_BUF_FULL)); + JpuWriteReg(MJPEG_INTR_MASK_REG, 0x0); + } + + // expect this interrupt after stop is enabled. + if (int_reason & (1 << INT_JPU_BIT_BUF_STOP)) { + ret = JPU_EncCompleteStop(jpgHandle); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_EncCompleteStop failed Error code is 0x%x\n", + ret); + cviJpgEncFlush((CVIJpgHandle)jpgHandle); + } + + JPU_ClrStatus((1 << INT_JPU_BIT_BUF_STOP)); + *pRet = ret; + return JPG_RET_BREAK; + } + + if (int_reason & (1 << INT_JPU_PARIAL_OVERFLOW)) { + JLOG(ERR, "ENC::ERROR frame buffer parial_overflow?\n"); + JPU_ClrStatus((1 << INT_JPU_PARIAL_OVERFLOW)); + } + } + + *pRet = ret; + + return JPG_RET_BREAK; +} + +static int cviJpegEncGetFinalStream(JpgEncInfo *pEncInfo, BYTE **virt_addr, + unsigned int *size) +{ + pEncInfo->pFinalStream = MEM_KMALLOC(pEncInfo->preStreamLen + *size); + + if (pEncInfo->pFinalStream == NULL) { + JLOG(ERR, "null pointer\n"); + return JPG_RET_FAILURE; + } + + memcpy(pEncInfo->pFinalStream, pEncInfo->pPreStream, + pEncInfo->preStreamLen); + memcpy(pEncInfo->pFinalStream + pEncInfo->preStreamLen, *virt_addr, + *size); + + *virt_addr = pEncInfo->pFinalStream; + + MEM_FREE(pEncInfo->pPreStream); + pEncInfo->pPreStream = NULL; + + *size += pEncInfo->preStreamLen; + pEncInfo->preStreamLen = 0; + return JPG_RET_SUCCESS; +} + +int cviJpgEncGetFrameData(CVIJpgHandle jpgHandle, void *data) +{ + JpgRet ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst = jpgHandle; + JpgEncInfo *pEncInfo = &pJpgInst->JpgInfo.encInfo; + + if (pEncInfo->bIsoSendFrmEn) { + wait_for_completion(&pEncInfo->semGetStreamCmd); + memcpy(data, &pEncInfo->tEncBitstreamData, sizeof(jpu_buffer_t)); + return ret; + } + + ret = cviJpgEncGetOneFrameData(jpgHandle, data); + + return ret; +} + +static int cviJpgEncGetOneFrameData(CVIJpgHandle jpgHandle, void *data) +{ + JpgRet ret = JPG_RET_SUCCESS; + int iRet = 0; + JpgEncOutputInfo outputInfo = { 0 }; +#ifdef CVIDEBUG_V + JLOG(INFO, "Enter cviJpgEncGetFrameData\n"); +#endif /* CVIDEBUG_V */ + jpu_buffer_t *vbStream = NULL; + JpgInst *pJpgInst = jpgHandle; + JpgEncInfo *pEncInfo = &pJpgInst->JpgInfo.encInfo; + + iRet = cviJpegEncWaitInterrupt(jpgHandle, &ret); + pJpgInst->u64EndTime = jpgGetCurrentTime(); + if (iRet == JPG_RET_GOTO) { + CVI_JPG_DBG_ERR("cviJpegEncWaitInterrupt, iRet = %d\n", iRet); + goto GET_ENC_DATA_ERR; + } else if (iRet == JPG_RET_BREAK) { + } else { + CVI_JPG_DBG_ERR("cviJpegEncWaitInterrupt, iRet = %d\n", iRet); + return iRet; + } + + /* check handle valid */ + ret = JPU_EncGetOutputInfo(jpgHandle, &outputInfo); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, "JPU_EncGetOutputInfo failed Error code is 0x%x\n", + ret); + goto GET_ENC_DATA_ERR; + } + + // store jpeg image +#ifdef __FOR_TEST__ + FILE *fpJpg = fopen("enc.jpg", "wb"); + BYTE *pBuffer = (BYTE *)(outputInfo.bitstreamBuf_virt); + fwrite(pBuffer, sizeof(BYTE), outputInfo.bitstreamSize, fpJpg); + fclose(fpJpg); +#endif /* __FOR_TEST__ */ + + if (NULL == data) { + ret = JPG_RET_INVALID_PARAM; + goto GET_ENC_DATA_ERR; + } + + vbStream = (jpu_buffer_t *)data; + vbStream->phys_addr = outputInfo.bitstreamBuffer; + vbStream->virt_addr = (void *)outputInfo.bitstreamBuf_virt; + vbStream->size = outputInfo.bitstreamSize; + +#if (defined CVI_JPG_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + jdi_invalidate_ion_cache(vbStream->phys_addr, vbStream->virt_addr, + vbStream->size); +#endif + if (pEncInfo->rgbPacked) { + unsigned char *pStream = (unsigned char *)(vbStream->virt_addr); + if ((0x01 == pStream[0x256]) && (0x02 == pStream[0x259]) && + (0x03 == pStream[0x25C]) && (0x01 == pStream[0x264]) && + (0x02 == pStream[0x266]) && (0x03 == pStream[0x268])) { + pStream[0x256] = 0x52; + pStream[0x259] = 0x47; + pStream[0x25C] = 0x42; + pStream[0x264] = 0x52; + pStream[0x266] = 0x47; + pStream[0x268] = 0x42; + } + } + if (pEncInfo->openParam.bitrate != 0) + cviJpeRc_UpdatePic(&pEncInfo->openParam.RcInfo, vbStream->size); + + if (pEncInfo->preStreamLen) { + ret = cviJpegEncGetFinalStream(pEncInfo, &vbStream->virt_addr, + &vbStream->size); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, "cviJpegEncGetFinalStream failed 0x%x\n", + ret); + goto GET_ENC_DATA_ERR; + } + vbStream->phys_addr = virt_to_phys(vbStream->virt_addr); + jdi_flush_ion_cache(vbStream->phys_addr, vbStream->virt_addr, vbStream->size); + } + jpu_set_channel_num(-1); + +#ifdef CVIDEBUG_V + JLOG(INFO, "Level cviJpgEncGetOneFrameData\n"); +#endif /* CVIDEBUG_V */ + + // if NOT sharing es buffer, we can unlock to speed-up enc process + if (!jdi_use_single_es_buffer()) { + JpgLeaveLock(); + } + return JPG_RET_SUCCESS; + +GET_ENC_DATA_ERR: + // if NOT sharing es buffer, we can unlock to speed-up enc process + if (!jdi_use_single_es_buffer()) { + JpgLeaveLock(); + } + return ret; +} + +int cviJpgEncFlush(CVIJpgHandle jpgHandle) +{ + // These seem to be out of sync because of the thread ,and they are + // temporarily commented out + + JpgRet ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst = (JpgEncHandle)jpgHandle; + JpgEncInfo *pEncInfo = &pJpgInst->JpgInfo.encInfo; + + // JLOG(INFO, "Enter cviJpgEncFlush\n"); + // check handle valid + ret = CheckJpgInstValidity((JpgEncHandle)jpgHandle); + if (ret != JPG_RET_SUCCESS) { + JLOG(INFO, "Leave cviJpgEncFlush\n"); + return ret; + } + + pEncInfo->streamWrPtr = pEncInfo->streamBufStartAddr; + pEncInfo->streamRdPtr = pEncInfo->streamBufStartAddr; + JpuWriteReg(MJPEG_BBC_RD_PTR_REG, pEncInfo->streamRdPtr); + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, pEncInfo->streamWrPtr); + JpuWriteReg(MJPEG_BBC_STRM_CTRL_REG, 0); + + JPU_SWReset(); + // JLOG(INFO, "Leave cviJpgEncFlush\n"); + + return JPG_RET_SUCCESS; +} + +int cviJpgEncGetInputDataBuf(CVIJpgHandle jpgHandle, void *data) +{ + JpgRet ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst = NULL; + JpgEncInfo *pEncInfo = NULL; + CVIFRAMEBUF *cviFrameBuf = NULL; + +#ifdef CVIDEBUG_V + JLOG(INFO, "Enter cviJpgEncGetInputDataBuf\n"); +#endif /* CVIDEBUG_V */ + + /* check handle valid */ + ret = CheckJpgInstValidity((JpgEncHandle)jpgHandle); + if (ret != JPG_RET_SUCCESS) { + JLOG(INFO, "Invalid handle at cviJpgEncGetInputDataBuf.\n"); + return ret; + } + pJpgInst = (JpgEncHandle)jpgHandle; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + if (NULL == pEncInfo->pFrame) + return JPG_RET_WRONG_CALL_SEQUENCE; + if (NULL == data) + return JPG_RET_INVALID_PARAM; + + // store image +#ifdef CVIDEBUG_V + assert(sizeof(jpu_buffer_t) == sizeof(CVIBUF)); +#endif /* CVIDEBUG_V */ + cviFrameBuf = (CVIFRAMEBUF *)data; + cviFrameBuf->format = (CVIFrameFormat)pEncInfo->sourceFormat; + memcpy(&(cviFrameBuf->vbY), &(pEncInfo->pFrame[0]->vbY), + sizeof(jpu_buffer_t)); + memcpy(&(cviFrameBuf->vbCb), &(pEncInfo->pFrame[0]->vbCb), + sizeof(jpu_buffer_t)); + memcpy(&(cviFrameBuf->vbCr), &(pEncInfo->pFrame[0]->vbCr), + sizeof(jpu_buffer_t)); + cviFrameBuf->strideY = pEncInfo->pFrame[0]->strideY; + cviFrameBuf->strideC = pEncInfo->pFrame[0]->strideC; + if (pEncInfo->chromaInterleave) + cviFrameBuf->strideC *= 2; + +#ifdef CVIDEBUG_V + JLOG(INFO, "Level cviJpgEncGetInputDataBuf\n"); +#endif /* CVIDEBUG_V */ + + return JPG_RET_SUCCESS; +} + +int cviJpgEncResetQualityTable(CVIJpgHandle jpgHandle) +{ + JpgInst *pJpgInst = jpgHandle; + JpgEncInfo *pEncInfo = &pJpgInst->JpgInfo.encInfo; + JpgEncOpenParam *pEncOP; + EncConfigParam *pEncConfig; + + pEncOP = MEM_MALLOC(sizeof(JpgEncOpenParam)); + pEncConfig = MEM_MALLOC(sizeof(EncConfigParam)); + if (pEncOP == NULL) { + JLOG(ERR, "no memory for pEncOP\n"); + return JPG_RET_FAILURE; + } + if (pEncConfig == NULL) { + JLOG(ERR, "no memory for pEncConfig\n"); + return JPG_RET_FAILURE; + } + memset(pEncOP, 0x0, sizeof(JpgEncOpenParam)); + memset(pEncConfig, 0x0, sizeof(EncConfigParam)); + + if (getJpgEncOpenParamDefault(pEncOP, pEncConfig) == 0) { + MEM_FREE(pEncOP); + MEM_FREE(pEncConfig); + return JPG_RET_INVALID_PARAM; + } + + memcpy(pEncInfo->openParam.huffVal, pEncOP->huffVal, 4 * 162); + memcpy(pEncInfo->openParam.huffBits, pEncOP->huffBits, 4 * 256); + memcpy(pEncInfo->openParam.qMatTab, pEncOP->qMatTab, 4 * 64); + + if (pEncOP != NULL) { + MEM_FREE(pEncOP); + } + if (pEncConfig != NULL) { + MEM_FREE(pEncConfig); + } + return JPG_RET_SUCCESS; +} + +int cviJpgEncEncodeUserData(CVIJpgHandle jpgHandle, void *data) +{ + unsigned int i; + JpgRet ret; + JpgInst *pJpgInst = (JpgInst *)jpgHandle; + JpgEncInfo *pEncInfo; + cviJpegUserData *pSrc = (cviJpegUserData *)data; + BYTE *pDst; + + /* check handle valid */ + ret = CheckJpgInstValidity(pJpgInst); + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("Invalid handle at cviJpgEncEncodeUserData\n"); + return ret; + } + + if (pSrc == NULL || pSrc->userData == NULL || pSrc->len == 0) { + CVI_JPG_DBG_ERR("no user data\n"); + return JPG_RET_INVALID_PARAM; + } + + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + // check user data buffer size + if (pEncInfo->userDataLen + USER_DATA_MARKER_CODE_SIZE + + USER_DATA_LENGTH_CODE_SIZE + pSrc->len > + USER_DATA_BUF_SIZE) { + CVI_JPG_DBG_ERR("not enough user data buf left\n"); + return JPG_RET_INVALID_PARAM; + } + + pDst = pEncInfo->userData + pEncInfo->userDataLen; + *(pDst++) = (USER_DATA_MARKER >> 8) & 0xFF; + *(pDst++) = USER_DATA_MARKER & 0xFF; + *(pDst++) = ((USER_DATA_LENGTH_CODE_SIZE + pSrc->len) >> 8) & 0xFF; + *(pDst++) = (USER_DATA_LENGTH_CODE_SIZE + pSrc->len) & 0xFF; + for (i = 0; i < pSrc->len; i++) + *(pDst++) = pSrc->userData[i]; + + pEncInfo->userDataLen += (USER_DATA_MARKER_CODE_SIZE + + USER_DATA_LENGTH_CODE_SIZE + pSrc->len); + return JPG_RET_SUCCESS; +} + +static int pfnJpgWaitEncodeDone(void *param) +{ + int ret; + JpgInst *pJpgInst = (JpgInst *)param; + JpgEncInfo *pEncInfo = &pJpgInst->JpgInfo.encInfo; + + while (!kthread_should_stop()) { + // wait for enc cmd trigger + wait_for_completion(&pEncInfo->semSendEncCmd); + if (kthread_should_stop() || pEncInfo->streamBufStartAddr == 0) { + break; + } + ret = cviJpgEncGetOneFrameData(param, &pEncInfo->tEncBitstreamData); + if (ret == JPG_RET_SUCCESS) { + complete(&pEncInfo->semGetStreamCmd); + } else { + CVI_JPG_DBG_ERR("cviJpgEncGetOneFrameData, ret = %d\n", ret); + return 0; + } + } + return 0; +} + +int cviJpgEncStart(CVIJpgHandle jpgHandle, void *data) +{ + JpgRet ret; + JpgInst *pJpgInst = (JpgInst *)jpgHandle; + JpgEncInfo *pEncInfo; + + /* check handle valid */ + ret = CheckJpgInstValidity(pJpgInst); + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("Invalid handle at cviJpgEncStart\n"); + return ret; + } + + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + if (jdi_use_single_es_buffer()) { + pEncInfo->bIsoSendFrmEn = false; + } else { + pEncInfo->bIsoSendFrmEn = false;//*((bool *)data); + } + + if (pEncInfo->bIsoSendFrmEn && !pEncInfo->tPthreadId) { + init_completion(&pEncInfo->semSendEncCmd); + init_completion(&pEncInfo->semGetStreamCmd); + pEncInfo->tPthreadId = kthread_run(pfnJpgWaitEncodeDone, + (void *)jpgHandle, + "chn%dVencJpgWaitEncodeDone", pJpgInst->s32ChnNum); + if (IS_ERR(pEncInfo->tPthreadId)) { + CVI_JPG_DBG_ERR("pfnJpgWaitEncodeDone task error!\n"); + return JPG_RET_FAILURE; + } + } + + return JPG_RET_SUCCESS; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/src/cvi_jpg_interface.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/src/cvi_jpg_interface.c new file mode 100644 index 0000000000..ba0934db83 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/src/cvi_jpg_interface.c @@ -0,0 +1,719 @@ +#include +#include "jputypes.h" +#include "jpuapi.h" +#include "regdefine.h" +#include "jpulog.h" +#include "mixer.h" +#include "jpulog.h" +#include "jpuhelper.h" +#include "jpuapifunc.h" + +#include "cvi_jpg_interface.h" +#include "cvi_jpg_internal.h" +#include "version.h" + +#ifdef CLI_DEBUG_SUPPORT +#include "tcli.h" +#endif + +#ifndef UNREFERENCED_PARAM +#define UNREFERENCED_PARAM(x) ((void)(x)) +#endif + +#define RET_JPG_TIMEOUT (-2) + +void cviJpgGetVersion(void) +{ + CVI_JPG_DBG_INFO("JPEG_VERSION = %s\n", JPEG_VERSION); +} + +/* initial jpu core */ +int CVIJpgInit(void) +{ + JpgRet ret = JPG_RET_SUCCESS; + + CVI_JPG_DBG_IF("\n"); + + cviJpgGetVersion(); + JpgEnterLock(); + ret = JPU_Init(); + if (ret != JPG_RET_SUCCESS && ret != JPG_RET_CALLED_BEFORE) { + JLOG(ERR, "JPU_Init failed Error code is 0x%x\n", ret); + JpgLeaveLock(); + return ret; + } + JpgLeaveLock(); + return JPG_RET_SUCCESS; +} + +/* uninitial jpu core */ +void CVIJpgUninit(void) +{ + // JLOG(INFO, "CVIJpgUninit ...\n"); + JpgEnterLock(); + JPU_DeInit(); + JpgLeaveLock(); +} + +/* alloc a jpu handle for dcoder or encoder */ +CVIJpgHandle CVIJpgOpen(CVIJpgConfig config) +{ + JpgRet ret = JPG_RET_INVALID_PARAM; + CVIJpgHandle handle = NULL; + JpgInst *pJpgInst = NULL; + + JpgEnterLock(); + CVI_JPG_DBG_IF("\n"); + /* check param */ + // if (CVIJPGCOD_DEC == config.type) + // ret = CheckJpgDecOpenParam( pop ); + // else if (CVIJPGCOD_ENC == config.type) + // ret = CheckJpgDecOpenParam( pop ); + // else { + // ret = JPG_RET_INVALID_PARAM; + // goto OPEN_ERROR; + // } + + /* get new instance handle */ + if (CVIJPGCOD_DEC == config.type) { + // printf("Open decoder devices!\n"); + ret = cviJpgDecOpen(&handle, &config.u.dec); + if (JPG_RET_SUCCESS != ret) { + CVI_JPG_DBG_ERR("Open Decode Device fail, ret %d\n", + ret); + } + } else if (CVIJPGCOD_ENC == config.type) { + // printf("Open encoder devices!\n"); + ret = cviJpgEncOpen(&handle, &config.u.enc); + if (JPG_RET_SUCCESS != ret) { + CVI_JPG_DBG_ERR("Open Encode Device fail, ret %d\n", + ret); + } + } + + pJpgInst = (JpgInst *)handle; + pJpgInst->s32ChnNum = config.s32ChnNum; + + CVI_JPG_DBG_IF("handle = %p\n", handle); + JpgLeaveLock(); + return handle; +} + +/* close and free alloced jpu handle */ +int CVIJpgClose(CVIJpgHandle jpgHandle) +{ + int ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst = jpgHandle; + JpgEnterLock(); + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + /* close instance handle */ + if (NULL == jpgHandle) { + JpgLeaveLock(); + CVI_JPG_DBG_ERR("jpgHandle = NULL\n"); + return -1; + } + + if (CVIJPGCOD_DEC == pJpgInst->type) { + ret = cviJpgDecClose(jpgHandle); + } else if (CVIJPGCOD_ENC == pJpgInst->type) { + ret = cviJpgEncClose(jpgHandle); + } + + JpgLeaveLock(); + return ret; +} + +/* */ +int CVIJpgGetCaps(CVIJpgHandle jpgHandle) +{ + UNREFERENCED_PARAM(jpgHandle); + return JPG_RET_SUCCESS; +} + +/* reset jpu core */ +int CVIJpgReset(CVIJpgHandle jpgHandle) +{ + UNREFERENCED_PARAM(jpgHandle); + return JPG_RET_SUCCESS; +} + +/* flush data */ +int CVIJpgFlush(CVIJpgHandle jpgHandle) +{ + JpgInst *pJpgInst = jpgHandle; + int ret = JPG_RET_SUCCESS; + if (NULL == jpgHandle) + return -1; + JpgEnterLock(); + + if (CVIJPGCOD_DEC == pJpgInst->type) { + ret = cviJpgDecFlush(jpgHandle); + } else if (CVIJPGCOD_ENC == pJpgInst->type) { + ret = cviJpgEncFlush(jpgHandle); + } + JpgLeaveLock(); + return ret; +} + +/* send jpu data to decode or encode */ +int CVIJpgSendFrameData(CVIJpgHandle jpgHandle, void *data, int length, + int s32TimeOut) +{ + JpgInst *pJpgInst = jpgHandle; + int ret = JPG_RET_SUCCESS; + int count = 0; + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + if (NULL == jpgHandle) { + CVI_JPG_DBG_ERR("jpgHandle = NULL\n"); + return -1; + } + + if (s32TimeOut <= -1) { + //block mode + JpgEnterLock(); + } else if (s32TimeOut == 0) { + //try once mode + ret = JpgEnterTryLock(); + if (ret != JPG_RET_SUCCESS) { + //timeout + CVI_JPG_DBG_IF("try lock failure\n"); + return RET_JPG_TIMEOUT; + + } else { + //lock success + CVI_JPG_DBG_IF("try lock success\n"); + } + } else { + //time lock + ret = JpgEnterTimeLock(s32TimeOut); + if (ret != JPG_RET_SUCCESS) { + //timeout + CVI_JPG_DBG_IF("JPEG time lock timeout\n"); + return RET_JPG_TIMEOUT; + + } else { + //lock success + CVI_JPG_DBG_IF("time lock success\n"); + } + } + + if (CVIJPGCOD_DEC == pJpgInst->type) { + ret = cviJpgDecFlush(jpgHandle); + } else if (CVIJPGCOD_ENC == pJpgInst->type) { + ret = cviJpgEncFlush(jpgHandle); + } + + do { + if (CVIJPGCOD_DEC == pJpgInst->type) { + ret = cviJpgDecSendFrameData(jpgHandle, data, length); + } else if (CVIJPGCOD_ENC == pJpgInst->type) { + ret = cviJpgEncSendFrameData(jpgHandle, data, length); + } + } while ((ret == JPG_RET_HWRESET_SUCCESS) && (count++ < 3)); + + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("SendFrameData fail, ret %d\n", ret); + JpgLeaveLock(); + } + + return ret; +} + +/* after decoded or encoded, get data from jpu */ +int CVIJpgGetFrameData(CVIJpgHandle jpgHandle, void *data, int length, + unsigned long int *pu64HwTime) +{ + JpgInst *pJpgInst = jpgHandle; + int ret = JPG_RET_SUCCESS; + + UNREFERENCED_PARAM(length); + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + if (NULL == jpgHandle) { + CVI_JPG_DBG_ERR("jpgHandle = NULL\n"); + JpgLeaveLock(); + return -1; + } + + if (CVIJPGCOD_DEC == pJpgInst->type) { + ret = cviJpgDecGetFrameData(jpgHandle, data); + } else if (CVIJPGCOD_ENC == pJpgInst->type) { + ret = cviJpgEncGetFrameData(jpgHandle, data); + } + if (pu64HwTime) { + *pu64HwTime = pJpgInst->u64EndTime - pJpgInst->u64StartTime; + + CVI_JPG_DBG_PERF("*pu64HwTime = %lu, u64StartTime = %llu, u64EndTime = %llu\n", + *pu64HwTime, pJpgInst->u64StartTime, pJpgInst->u64EndTime); + } + + return ret; +} + +/* release stream buffer */ +int CVIJpgReleaseFrameData(CVIJpgHandle jpgHandle) +{ + int ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst = jpgHandle; + JpgEncInfo *pEncInfo; + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + if (NULL == jpgHandle) { + CVI_JPG_DBG_ERR("jpgHandle = NULL\n"); + JpgLeaveLock(); + return -1; + } + + pEncInfo = &pJpgInst->JpgInfo.encInfo; + if (pEncInfo->pFinalStream) { + MEM_KFREE(pEncInfo->pFinalStream); + pEncInfo->pFinalStream = NULL; + } + + // if sharing es buffer, to unlock when releasing frame + if (jdi_use_single_es_buffer()) + JpgLeaveLock(); + return ret; +} + +/* get jpu encoder input data buffer */ +int CVIJpgGetInputDataBuf(CVIJpgHandle jpgHandle, void *data, int length) +{ + JpgInst *pJpgInst = jpgHandle; + int ret = JPG_RET_SUCCESS; + + UNREFERENCED_PARAM(length); + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + if (NULL == jpgHandle) { + CVI_JPG_DBG_ERR("jpgHandle = NULL\n"); + return -1; + } + + if (CVIJPGCOD_DEC == pJpgInst->type) { + CVI_JPG_DBG_ERR("DO NOT SUPPORT DECODER!!\n"); + } else if (CVIJPGCOD_ENC == pJpgInst->type) { + ret = cviJpgEncGetInputDataBuf(jpgHandle, data); + } + + return ret; +} + +int CVIVidJpuReset(void) +{ + JPU_HWReset(); + + return JPG_RET_SUCCESS; +} + +int cviJpegSetQuality(CVIJpgHandle jpgHandle, void *data) +{ + int ret = 0; + int *quality = data; + JpgInst *pJpgInst; + JpgEncInfo *pEncInfo; + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + ret = CheckJpgInstValidity(jpgHandle); + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("CheckJpgInstValidity, %d\n", ret); + return ret; + } + + pJpgInst = jpgHandle; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + // update correct quality to driver + pEncInfo->openParam.quality = *quality; + CVI_JPG_DBG_RC("quality = %d\n", pEncInfo->openParam.quality); + + return ret; +} + +static int cviJpegSetChnAttr(CVIJpgHandle jpgHandle, void *arg) +{ + JpgInst *pJpgInst; + JpgEncInfo *pEncInfo; + cviJpegChnAttr *pChnAttr = (cviJpegChnAttr *)arg; + int ret = 0; + unsigned int u32Sec = 0; + unsigned int u32Frm = 0; + + pJpgInst = jpgHandle; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + pEncInfo->openParam.bitrate = pChnAttr->u32BitRate; + + u32Sec = pChnAttr->fr32DstFrameRate >> 16; + u32Frm = pChnAttr->fr32DstFrameRate & 0xFFFF; + + if (u32Sec == 0) { + pEncInfo->openParam.framerate = u32Frm; + } else { + pEncInfo->openParam.framerate = u32Frm / u32Sec; + } + + pEncInfo->picWidth = pChnAttr->picWidth; + pEncInfo->picHeight = pChnAttr->picHeight; + + return ret; +} + +static int cviJpegSetMCUPerECS(CVIJpgHandle jpgHandle, void *data) +{ + int ret = 0; + int *MCUPerECS = data; + JpgInst *pJpgInst; + JpgEncInfo *pEncInfo; + + pJpgInst = jpgHandle; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + pEncInfo->openParam.restartInterval = *MCUPerECS; + pEncInfo->rstIntval = pEncInfo->openParam.restartInterval; + CVI_JPG_DBG_RC("MCUPerECS = %d\n", pEncInfo->openParam.restartInterval); + + return ret; +} + +int cviJpegResetChn(CVIJpgHandle jpgHandle, void *data) +{ + int ret = 0; + JpgInst *pJpgInst; + JpgEncInfo *pEncInfo; + + UNREFERENCED_PARAM(data); + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + ret = CheckJpgInstValidity(jpgHandle); + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("CheckJpgInstValidity, %d\n", ret); + return ret; + } + + pJpgInst = jpgHandle; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + // reset frameIdx since JpgEncEncodeHeader() use frameIdx as header + pEncInfo->frameIdx = 0; + + // reset quality-related table + if (CVIJPGCOD_DEC == pJpgInst->type) { + // do nothing now + } else if (CVIJPGCOD_ENC == pJpgInst->type) { + ret = cviJpgEncResetQualityTable(jpgHandle); + } + + // reset pixel_format setting for alignedWidth/alignedHeight calculation + pEncInfo->sourceFormat = FORMAT_420; + + return ret; +} + +int cviJpegSetUserData(CVIJpgHandle jpgHandle, void *data) +{ + int ret = 0; + JpgInst *pJpgInst; + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + ret = CheckJpgInstValidity(jpgHandle); + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("CheckJpgInstValidity, %d\n", ret); + return ret; + } + + pJpgInst = jpgHandle; + + if (CVIJPGCOD_DEC == pJpgInst->type) { + ret = JPG_RET_WRONG_CALL_SEQUENCE; + CVI_JPG_DBG_ERR("decoder does not support set user data\n"); + } else if (CVIJPGCOD_ENC == pJpgInst->type) { + ret = cviJpgEncEncodeUserData(jpgHandle, data); + if (ret != JPG_RET_SUCCESS) + CVI_JPG_DBG_ERR("cviJpegSetUserData %d\n", ret); + } + + return ret; +} + +int cviJpegStart(CVIJpgHandle jpgHandle, void *data) +{ + int ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst; + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + ret = CheckJpgInstValidity(jpgHandle); + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("CheckJpgInstValidity, %d\n", ret); + return ret; + } + + pJpgInst = jpgHandle; + + if (pJpgInst->type == CVIJPGCOD_DEC) { + // do nothing now + } else if (pJpgInst->type == CVIJPGCOD_ENC) { + ret = cviJpgEncStart(jpgHandle, data); + } + return ret; +} + +int cviJpegSetSbmEnable(CVIJpgHandle jpgHandle, void *data) +{ + int ret = JPG_RET_SUCCESS; + JpgInst *pJpgInst; + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + + ret = CheckJpgInstValidity(jpgHandle); + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("CheckJpgInstValidity, %d\n", ret); + return ret; + } + + pJpgInst = jpgHandle; + + if (pJpgInst->type == CVIJPGCOD_DEC) { + ret = JPG_RET_FAILURE; + } else if (pJpgInst->type == CVIJPGCOD_ENC) { + JpgEncInfo *pEncInfo = &pJpgInst->JpgInfo.encInfo; + + pEncInfo->bSbmEn = *(bool *)data; + } + return ret; +} + +int cviJpegWaitEncodeDone(CVIJpgHandle jpgHandle, void *data) +{ + int ret = JPG_RET_SUCCESS; + + return ret; +} + + + + + +#ifdef CLI_DEBUG_SUPPORT +extern void cli_show_jdi_info(void); + +int cviJpegShowChnInfo(CVIJpgHandle jpgHandle, void *data) +{ + int ret = 0; + JpgInst *pJpgInst; + + CVI_JPG_DBG_IF("handle = %p\n", jpgHandle); + UNREFERENCED_PARAM(data); + + ret = CheckJpgInstValidity(jpgHandle); + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("CheckJpgInstValidity, %d\n", ret); + return ret; + } + + pJpgInst = jpgHandle; + + tcli_print("JpgInst_info:\n"); + tcli_print(" instIndex:%d\n", pJpgInst->instIndex); + tcli_print(" inUse:%d\n", pJpgInst->inUse); + tcli_print(" loggingEnable:%d\n", pJpgInst->loggingEnable); + tcli_print(" u64StartTime:%llu\n", pJpgInst->u64StartTime); + tcli_print(" u64EndTime:%llu\n", pJpgInst->u64EndTime); + tcli_print(" inUse:%d\n", pJpgInst->inUse); + tcli_print(" type:%d\n", pJpgInst->type); + + if (pJpgInst->type == CVIJPGCOD_DEC) { + } else if (pJpgInst->type == CVIJPGCOD_ENC) { + JpgEncInfo *pEncInfo = &pJpgInst->JpgInfo.encInfo; + + tcli_print("Jpg Encinfo:\n"); + tcli_print(" openParam.bitstreamBufferSize:%d\n", + pEncInfo->openParam.bitstreamBufferSize); + tcli_print(" openParam.picWidth:%d\n", + pEncInfo->openParam.picWidth); + tcli_print(" openParam.picHeight:%d\n", + pEncInfo->openParam.picHeight); + tcli_print(" openParam.sourceFormat:%d\n", + pEncInfo->openParam.sourceFormat); + tcli_print(" openParam.restartInterval:%d\n", + pEncInfo->openParam.restartInterval); + tcli_print(" openParam.streamEndian:%d\n", + pEncInfo->openParam.streamEndian); + tcli_print(" openParam.frameEndian:%d\n", + pEncInfo->openParam.frameEndian); + tcli_print(" openParam.chromaInterleave:%d\n", + pEncInfo->openParam.chromaInterleave); + tcli_print(" openParam.packedFormat:%d\n", + pEncInfo->openParam.packedFormat); + tcli_print(" openParam.rgbPacked:%d\n", + pEncInfo->openParam.rgbPacked); + tcli_print(" openParam.quality:%d\n", + pEncInfo->openParam.quality); + tcli_print(" openParam.bitrate:%d\n", + pEncInfo->openParam.bitrate); + tcli_print(" openParam.framerate:%d\n", + pEncInfo->openParam.framerate); + stRcInfo *pRcInfo = &pEncInfo->openParam.RcInfo; + + tcli_print(" RcInfo.targetBitrate:%d\n", + pRcInfo->targetBitrate); + tcli_print(" RcInfo.fps:%d\n", pRcInfo->fps); + tcli_print(" RcInfo.picPelNum:%d\n", pRcInfo->picPelNum); + tcli_print(" RcInfo.picAvgBit:%d\n", pRcInfo->picAvgBit); + tcli_print(" RcInfo.picTargetBit:%d\n", + pRcInfo->picTargetBit); + tcli_print(" RcInfo.bitErr:%d\n", pRcInfo->bitErr); + tcli_print(" RcInfo.errCompSize:%d\n", pRcInfo->errCompSize); + tcli_print(" RcInfo.minQ:%d\n", pRcInfo->minQ); + tcli_print(" RcInfo.maxQ:%d\n", pRcInfo->maxQ); + tcli_print(" RcInfo.qClipRange:%d\n", pRcInfo->qClipRange); + tcli_print(" RcInfo.lastPicQ:%d\n", pRcInfo->lastPicQ); + tcli_print(" RcInfo.picIdx:%d\n", pRcInfo->picIdx); + tcli_print(" RcInfo.alpha:%f\n", pRcInfo->alpha); + tcli_print(" RcInfo.beta:%f\n", pRcInfo->beta); + tcli_print(" RcInfo.alphaStep:%f\n", pRcInfo->alphaStep); + tcli_print(" RcInfo.betaStep:%f\n", pRcInfo->betaStep); + tcli_print(" RcInfo.maxBitrateLimit:%d KB\n", + pRcInfo->maxBitrateLimit); + + JpgEncInitialInfo *pInitialInfo = &pEncInfo->initialInfo; + + tcli_print(" initialInfo.minFrameBufferCount:%d\n", + pInitialInfo->minFrameBufferCount); + tcli_print(" initialInfo.colorComponents:%d\n", + pInitialInfo->colorComponents); + + tcli_print(" streamBufSize:%d\n", pEncInfo->streamBufSize); + tcli_print(" pBitStream:%p\n", pEncInfo->pBitStream); + + tcli_print(" streamBufSize:%d\n", pEncInfo->streamBufSize); + tcli_print(" numFrameBuffers:%d\n", pEncInfo->numFrameBuffers); + tcli_print(" stride:%d\n", pEncInfo->stride); + tcli_print(" rotationEnable:%d\n", pEncInfo->rotationEnable); + tcli_print(" mirrorEnable:%d\n", pEncInfo->mirrorEnable); + tcli_print(" mirrorDirection:%d\n", pEncInfo->mirrorDirection); + tcli_print(" rotationAngle:%d\n", pEncInfo->rotationAngle); + tcli_print(" initialInfoObtained:%d\n", + pEncInfo->initialInfoObtained); + + tcli_print(" picWidth:%d\n", pEncInfo->picWidth); + tcli_print(" picHeight:%d\n", pEncInfo->picHeight); + tcli_print(" alignedWidth:%d\n", pEncInfo->alignedWidth); + tcli_print(" alignedHeight:%d\n", pEncInfo->alignedHeight); + tcli_print(" seqInited:%d\n", pEncInfo->seqInited); + tcli_print(" frameIdx:%d\n", pEncInfo->frameIdx); + tcli_print(" sourceFormat:%d\n", pEncInfo->sourceFormat); + tcli_print(" streamEndian:%d\n", pEncInfo->streamEndian); + tcli_print(" frameEndian:%d\n", pEncInfo->frameEndian); + tcli_print(" chromaInterleave:%d\n", + pEncInfo->chromaInterleave); + tcli_print(" rstIntval:%d\n", pEncInfo->rstIntval); + + tcli_print(" busReqNum:%d\n", pEncInfo->busReqNum); + tcli_print(" mcuBlockNum:%d\n", pEncInfo->mcuBlockNum); + tcli_print(" compNum:%d\n", pEncInfo->compNum); + tcli_print(" compInfo:%d %d %d\n", pEncInfo->compInfo[0], + pEncInfo->compInfo[1], pEncInfo->compInfo[2]); + tcli_print(" disableAPPMarker:%d\n", + pEncInfo->disableAPPMarker); + + tcli_print(" quantMode:%d\n", pEncInfo->quantMode); + tcli_print(" stuffByteEnable:%d\n", pEncInfo->stuffByteEnable); + tcli_print(" usePartial:%d\n", pEncInfo->usePartial); + tcli_print(" partiallineNum:%d\n", pEncInfo->partiallineNum); + + tcli_print(" partialBufNum:%d\n", pEncInfo->partialBufNum); + tcli_print(" packedFormat:%d\n", pEncInfo->packedFormat); + tcli_print(" userDataLen:%d\n", pEncInfo->userDataLen); + tcli_print(" preStreamLen:%d\n", pEncInfo->preStreamLen); +#ifdef MJPEG_INTERFACE_API + tcli_print(" framebufStride:%d\n", pEncInfo->framebufStride); + tcli_print(" encHeaderMode:%d\n", pEncInfo->encHeaderMode); + tcli_print(" rgbPacked:%d\n", pEncInfo->rgbPacked); +#endif /* MJPEG_INTERFACE_API */ + + JpgEncParamSet *paraSet = pEncInfo->paraSet; + + if (paraSet) { + tcli_print(" paraSet.disableAPPMarker:%d\n", + paraSet->disableAPPMarker); + tcli_print(" paraSet.size:%d\n", paraSet->size); + tcli_print(" paraSet.headerMode:%d\n", + paraSet->headerMode); + tcli_print(" paraSet.quantMode:%d\n", + paraSet->quantMode); + tcli_print(" paraSet.huffMode:%d\n", + paraSet->huffMode); + tcli_print(" paraSet.rgbPackd:%d\n", + paraSet->rgbPackd); + } + } + + cli_show_jdi_info(); + + return ret; +} + +#else +int cviJpegShowChnInfo(CVIJpgHandle jpgHandle, void *data) +{ + UNREFERENCED_PARAM(jpgHandle); + UNREFERENCED_PARAM(data); + + return 0; +} + +#endif + +typedef struct _CVI_JPEG_IOCTL_OP_ { + int opNum; + int (*ioctlFunc)(CVIJpgHandle jpgHandle, void *arg); +} CVI_JPEG_IOCTL_OP; + +CVI_JPEG_IOCTL_OP cviJpegIoctlOp[] = { + { CVI_JPEG_OP_NONE, NULL }, + { CVI_JPEG_OP_SET_QUALITY, cviJpegSetQuality }, + { CVI_JPEG_OP_SET_CHN_ATTR, cviJpegSetChnAttr }, + { CVI_JPEG_OP_SET_MCUPerECS, cviJpegSetMCUPerECS }, + { CVI_JPEG_OP_RESET_CHN, cviJpegResetChn }, + { CVI_JPEG_OP_SET_USER_DATA, cviJpegSetUserData }, + { CVI_JPEG_OP_SHOW_CHN_INFO, cviJpegShowChnInfo }, + { CVI_JPEG_OP_START, cviJpegStart }, + { CVI_JPEG_OP_SET_SBM_ENABLE, cviJpegSetSbmEnable }, + { CVI_JPEG_OP_WAIT_FRAME_DONE, cviJpegWaitEncodeDone }, +}; + +int cviJpegIoctl(void *handle, int op, void *arg) +{ + CVIJpgHandle jpgHandle = (CVIJpgHandle)handle; + int ret = 0; + int currOp; + + CVI_JPG_DBG_IF("\n"); + + if (op <= 0 || op >= CVI_JPEG_OP_MAX) { + CVI_JPG_DBG_ERR("op = %d\n", op); + return -1; + } + + currOp = (cviJpegIoctlOp[op].opNum & CVI_JPEG_OP_MASK) >> + CVI_JPEG_OP_SHIFT; + if (op != currOp) { + CVI_JPG_DBG_ERR("op = %d\n", op); + return -1; + } + + ret = cviJpegIoctlOp[op].ioctlFunc(jpgHandle, arg); + + return ret; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/test/cvi_jpg_codec.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/test/cvi_jpg_codec.c new file mode 100644 index 0000000000..df7143833f --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/cvi_jpg_interface/test/cvi_jpg_codec.c @@ -0,0 +1,1005 @@ +/** + * @file cvi_jpg_codec.c + * @author jinf + * @brief This module contains the test demo definition for jpeg codec + * component. + */ +#ifdef VC_DRIVER_TEST +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "cvi_jpg_interface.h" +#include "version.h" +#include "cvi_vc_getopt.h" + + +/* macro define */ +#define OUTPUT_FOR_SCALER 0 + +// system param +#define PARAM_HELP "-help" +#define PARAM_QUIET "-q" +#define PARAM_NUMBER "-n" +// dcoder and encoder +#define PARAM_MODE_TYPE "-t" +#define PARAM_INPUT_FILE_NAME "-i" +#define PARAM_OUTPUT_FILE_NAME "-o" +#define PARAM_PACKEDFORMAT "-pf" +#define PARAM_CHROMAINTERLEAVE "-ci" +#define PARAM_USEPARTIALMODE "-pm" +#define PARAM_PARTIALBUFNUM "-pn" +#define PARAM_ROTANGLE "-ra" +#define PARAM_MIRDIR "-md" +#define PARAM_ROIENABLE "-roi" +#define PARAM_ROIOFFSETX "-rx" +#define PARAM_ROIOFFSETY "-ry" +#define PARAM_ROIWIDTH "-rw" +#define PARAM_ROIHEIGHT "-rh" +#define PARAM_WIDTH "-w" +#define PARAM_HEIGHT "-h" +#define PARAM_CHROMAFORMAT "-cf" +#define PARAM_VDOWNSAMPLING "-vd" +#define PARAM_HDOWNSAMPLING "-hd" + +// =========================================== +// ENTYPE = 1 : read file to alloc BUFFER +// ENTYPE = 2 : read file to alloc CVIFRAMEBUF struct +// ENTYPE = 3 : read file to JPU internal CVIFRAMEBUF +// =========================================== +#define ENC_TYPE 3 + +/* function define */ +static void welcome(void); +static void usage(void); +static int read_jpeg_file(char *name, unsigned char **pSrcBuf); +static int write_yuv_file(char *name, unsigned char *pDstBuf, int suffix); + +#if ENC_TYPE == 1 +static int read_yuv_file(char *inFileName, unsigned char **pSrcBuf, + CVIFrameFormat fmt); +#elif ENC_TYPE == 2 +static int read_yuv_file2(char *inFileName, unsigned char *pSrcBuf, + CVIFrameFormat fmt); +#elif ENC_TYPE == 3 +static int read_yuv_file3(CVIJpgHandle jpgHandle, char *inFileName, + CVIEncConfigParam encConfig); +#endif +static int write_jpg_file(char *name, unsigned char *pDstBuf, int suffix); + +/* Local Statis Variable */ +static int bQuiet; +static int iChromaFormat; +static int iPackedFormat; +static int iChromaInterLeave; +static int iUsePartialMode; +static int iUsePartialNum = 4; +static int iRotAngle; +static int iMirDir; +static int iROIEnable; +static int iROIOffsetX; +static int iROIOffsetY; +static int iROIWidth; +static int iROIHeight; +static int iVDownSampling; +static int iHDownSampling; + +/* cvi_jpg_test -t 0/1 -n num -i input_file -o output_file */ +int jpeg_main(int argc, char **argv) +{ + int ret = 0; + int i; + + /* param define */ + int type = 0; + int width = 0; + int height = 0; + int counter = 1; + char *inFileName = vmalloc(256); + char *outFileName = vmalloc(256); + CVIJpgHandle jpgHandle = { 0 }; + //CVIDecConfigParam decConfig; + CVIEncConfigParam encConfig; + CVIJpgConfig config; + /* read source file data */ + unsigned char *srcBuf = NULL; + CVIFRAMEBUF frame_buffer; + int readLen = 0; + // char writeName[256]={0}; + + /* initial local temp var */ + i = 0; + bQuiet = 0; + iChromaFormat = 0; + iPackedFormat = 0; + iChromaInterLeave = 0; + iUsePartialMode = 0; + iUsePartialNum = 4; + iRotAngle = 0; + iMirDir = 0; + iROIEnable = 0; + iROIOffsetX = 0; + iROIOffsetY = 0; + iROIWidth = 0; + iROIHeight = 0; + iVDownSampling = 0; + iHDownSampling = 0; + + + //memset(&decConfig, 0, sizeof(CVIDecConfigParam)); + memset(&encConfig, 0, sizeof(CVIEncConfigParam)); + memset(&config, 0, sizeof(CVIJpgConfig)); + + if (argc < 2) { + welcome(); + usage(); + vfree(inFileName); + vfree(outFileName); + return 1; + } + + /* parse the arguments */ + for (i = 1; i < argc; i++) { + if (0 == strcmp((const char *)argv[i], PARAM_QUIET)) { + bQuiet = 1; + } else if (0 == + strcmp((const char *)argv[i], PARAM_PACKEDFORMAT)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iPackedFormat = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], + PARAM_CHROMAINTERLEAVE)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iChromaInterLeave = (int)atoi( + (const char *)argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], + PARAM_USEPARTIALMODE)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iUsePartialMode = (int)atoi( + (const char *)argv[i + 1]); + i++; + } else if (0 == + strcmp((const char *)argv[i], PARAM_PARTIALBUFNUM)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iUsePartialNum = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], PARAM_ROTANGLE)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iRotAngle = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], PARAM_MIRDIR)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iMirDir = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == + strcmp((const char *)argv[i], PARAM_ROIENABLE)) { + iROIEnable = 1; + } else if (0 == + strcmp((const char *)argv[i], PARAM_ROIOFFSETX)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iROIOffsetX = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == + strcmp((const char *)argv[i], PARAM_ROIOFFSETY)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iROIOffsetY = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], PARAM_ROIWIDTH)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iROIWidth = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == + strcmp((const char *)argv[i], PARAM_ROIHEIGHT)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iROIHeight = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == + strcmp((const char *)argv[i], PARAM_CHROMAFORMAT)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iChromaFormat = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == + strcmp((const char *)argv[i], PARAM_VDOWNSAMPLING)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iVDownSampling = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == + strcmp((const char *)argv[i], PARAM_HDOWNSAMPLING)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + iHDownSampling = (int)atoi((const char *)argv[i + 1]); + i++; + } + + else if (0 == strcmp((const char *)argv[i], PARAM_MODE_TYPE)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + type = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], PARAM_WIDTH)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + width = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], PARAM_HEIGHT)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + height = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], PARAM_NUMBER)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing !\n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + counter = (int)atoi((const char *)argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], + PARAM_INPUT_FILE_NAME)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing \n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + strcpy(inFileName, argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], + PARAM_OUTPUT_FILE_NAME)) { + if (i + 1 >= argc) { + pr_err("ERROR: missing \n"); + vfree(inFileName); + vfree(outFileName); + return 1; + } + strcpy(outFileName, argv[i + 1]); + i++; + } else if (0 == strcmp((const char *)argv[i], PARAM_HELP)) { + usage(); + vfree(inFileName); + vfree(outFileName); + return 0; + } else if (0 == strcmp((const char *)argv[i], "-v")) { + if (argc == 2) { + pr_err("%s:\n\t%s\n", argv[0], JPEG_VERSION); + vfree(inFileName); + vfree(outFileName); + return 0; + } + } else { + pr_err("ERROR: unrecognized parameters %s\n", + (const char *)argv[i]); + welcome(); + usage(); + vfree(inFileName); + vfree(outFileName); + return 1; + } + } + + welcome(); + + /* initial JPU core */ + ret = CVIJpgInit(); + if (0 != ret) { + pr_err("\nFailed to CVIJpgInit!!!\n"); + vfree(inFileName); + vfree(outFileName); + return ret; + } + + memset(&frame_buffer, 0, sizeof(CVIFRAMEBUF)); + + pr_info("type = %d\n", type); + + if (CVIJPGCOD_DEC == (CVIJpgCodType)type) { + readLen = read_jpeg_file(inFileName, &srcBuf); + if (0 == readLen) + goto FIND_ERROR; + } + + /* setting decode or encode param */ + config.type = (CVIJpgCodType)type; + if (CVIJPGCOD_ENC == (CVIJpgCodType)type) { + config.u.enc.picWidth = (int)width; + config.u.enc.picHeight = (int)height; + // [0](4:2:0) [1](4:2:2) [2](2:2:4 4:2:2 rotated) [3](4:4:4) + // [4](4:0:0) + config.u.enc.sourceFormat = iChromaFormat; + // [0](CBCR_SEPARATED) [1](CBCR_INTERLEAVE) [2](CRCB_INTERLEAVE) + config.u.enc.chromaInterleave = iChromaInterLeave; + config.u.enc.rotAngle = iRotAngle; + // [0](no mirror) [1](vertical) [2](horizontal) [3](both) + config.u.enc.mirDir = iMirDir; + // [0](PLANAR), [1](YUYV), [2](UYVY), [3](YVYU), [4](VYUY), + // [5](YUV_444 PACKED), [6](RGB_444 PACKED) + config.u.enc.packedFormat = iPackedFormat; +#if ENC_TYPE == 1 + config.u.enc.src_type = 0; +#elif ENC_TYPE == 2 + config.u.enc.src_type = 1; +#elif ENC_TYPE == 3 + config.u.enc.src_type = 2; +#endif /* ENC_TYPE */ + memset(config.u.enc.jpgMarkerOrder, 0, + sizeof(config.u.enc.jpgMarkerOrder)); + config.u.enc.jpgMarkerOrder[0] = 1; // JPEGE_MARKER_SOI; + config.u.enc.jpgMarkerOrder[1] = + 10; // JPEGE_MARKER_FRAME_INDEX; + config.u.enc.jpgMarkerOrder[2] = 12; // JPEGE_MARKER_USER_DATA; + config.u.enc.jpgMarkerOrder[3] = 7; // JPEGE_MARKER_DRI_OPT; + config.u.enc.jpgMarkerOrder[4] = 2; // JPEGE_MARKER_DQT; + config.u.enc.jpgMarkerOrder[5] = 4; // JPEGE_MARKER_DHT; + config.u.enc.jpgMarkerOrder[6] = 8; // JPEGE_MARKER_SOF0; + config.u.enc.jpgMarkerOrder[7] = 0; + } else if (CVIJPGCOD_DEC == (CVIJpgCodType)type) { + // 2'b00: Normal + // 2'b10: CbCr interleave (e.g. NV12 in 4:2:0 or NV16 in 4:2:2) + // 2'b11: CrCb interleave (e.g. NV21 in 4:2:0) + memset(&(config.u.dec), 0, sizeof(CVIDecConfigParam)); + // [0](PLANAR), [1](YUYV), [2](UYVY), [3](YVYU), [4](VYUY), + // [5](YUV_444 PACKED), [6](RGB_444 PACKED) + config.u.dec.dec_buf.packedFormat = iPackedFormat; + // [0](CBCR_SEPARATED) [1](CBCR_INTERLEAVE) [2](CRCB_INTERLEAVE) + config.u.dec.dec_buf.chromaInterleave = iChromaInterLeave; + // ROI param + config.u.dec.roiEnable = iROIEnable; + config.u.dec.roiWidth = iROIWidth; + config.u.dec.roiHeight = iROIHeight; + config.u.dec.roiOffsetX = iROIOffsetX; + config.u.dec.roiOffsetY = iROIOffsetY; + // Frame Partial Mode (DON'T SUPPORT) + config.u.dec.usePartialMode = 0; + // Rotation Angle (0, 90, 180, 270) + config.u.dec.rotAngle = iRotAngle; + // mirror direction (0-no mirror, 1-vertical, 2-horizontal, + // 3-both) + + config.u.dec.mirDir = iMirDir; + config.u.dec.iHorScaleMode = iHDownSampling; + config.u.dec.iVerScaleMode = iVDownSampling; + config.u.dec.iDataLen = readLen; + pr_info("iDataLen = %d\n", config.u.dec.iDataLen); + } else { + pr_err("ERROR: unrecognized mode type parameters\n"); + usage(); + vfree(inFileName); + vfree(outFileName); + return 1; + } + + /* Open JPU Devices */ + jpgHandle = CVIJpgOpen(config); + if (NULL == jpgHandle) { + pr_err("\nFailed to CVIJpgOpen\n"); + goto FIND_ERROR; + } + + if (CVIJPGCOD_ENC == (CVIJpgCodType)type) { +#if ENC_TYPE == 1 + readLen = read_yuv_file(inFileName, &srcBuf, 0); +#elif ENC_TYPE == 2 + frame_buffer.width = width; + frame_buffer.height = height; + frame_buffer.Format = iChromaFormat; + frame_buffer.strideY = width; + frame_buffer.strideC = width; + int alloclen = width * height; + if (0 != iPackedFormat) { + if ((5 == iPackedFormat) || (6 == iPackedFormat)) + alloclen *= 3; + else + alloclen *= 2; + } + frame_buffer.vbY.virt_addr = (unsigned long)vmalloc(alloclen); + frame_buffer.vbCb.virt_addr = (unsigned long)vmalloc(alloclen); + frame_buffer.vbCr.virt_addr = (unsigned long)vmalloc(alloclen); + srcBuf = (unsigned char *)&frame_buffer; + readLen = read_yuv_file2(inFileName, + (unsigned char *)&frame_buffer, 0); +#elif ENC_TYPE == 3 + memcpy(&encConfig, &(config.u.enc), sizeof(CVIEncConfigParam)); + readLen = read_yuv_file3(jpgHandle, inFileName, encConfig); + pr_info("readLen = %d\n", readLen); +#else + fprintf(stderr, "DO NOT SUPPORT ENC_TYPE"); + exit(1); +#endif + if (0 == readLen) + goto FIND_ERROR; +#if ENC_TYPE == 1 + readLen = 0; +#elif ENC_TYPE == 2 + readLen = 1; +#elif ENC_TYPE == 3 + readLen = 2; +#endif /* ENC_TYPE */ + } + + /* alloc dst buffer and */ + for (i = 0; i < counter; i++) { + if (!bQuiet) + pr_info("=========== COUNT %d ==============\n", i); + + /* flush buffer remain data */ + CVIJpgFlush(jpgHandle); + /* send jpeg data for decode or encode operator */ + ret = CVIJpgSendFrameData(jpgHandle, (void *)srcBuf, readLen, + -1); + if (0 != ret) { + pr_err("\nFailed to CVIJpgSendFrameData, ret = %d\n", + ret); + goto FIND_ERROR; + } + + /* after decode or encode, we get data from jpu */ + if (CVIJPGCOD_DEC == config.type) { + CVIFRAMEBUF cviFrameBuf; + memset(&cviFrameBuf, 0, sizeof(CVIFRAMEBUF)); + ret = CVIJpgGetFrameData(jpgHandle, + (unsigned char *)&cviFrameBuf, + sizeof(CVIFRAMEBUF), NULL); + if (0 != ret) { + pr_err("\nFailed to CVIJpgGetFrameData, ret = %d\n", + ret); + } + + // printk("dec width = %d, height = %d\n", + // cviFrameBuf.width, cviFrameBuf.height); + + write_yuv_file(outFileName, + (unsigned char *)&cviFrameBuf, i); + } else { + CVIBUF cviBuf; + memset(&cviBuf, 0, sizeof(CVIBUF)); + ret = CVIJpgGetFrameData(jpgHandle, + (unsigned char *)&cviBuf, + sizeof(CVIBUF), NULL); + write_jpg_file(outFileName, (unsigned char *)&cviBuf, + i); + } + } + +FIND_ERROR: + if (NULL != jpgHandle) { + CVIJpgClose(jpgHandle); + jpgHandle = NULL; + } + + CVIJpgUninit(); +#ifdef ENC_TYPE2 + if (0 != frame_buffer.vbY.virt_addr) + vfree((unsigned char *)(frame_buffer.vbY.virt_addr)); + if (0 != frame_buffer.vbCb.virt_addr) + vfree((unsigned char *)(frame_buffer.vbCb.virt_addr)); + if (0 != frame_buffer.vbCr.virt_addr) + vfree((unsigned char *)(frame_buffer.vbCr.virt_addr)); +#else + if (NULL != srcBuf) { + vfree(srcBuf); + srcBuf = NULL; + } +#endif + vfree(inFileName); + vfree(outFileName); + return 0; +} + +static void welcome(void) +{ + if (bQuiet) { + return; + } + pr_info("// CVITEK JPEG test\n"); +} + +/* input and output param description */ +static void usage(void) +{ + pr_info("usage:ask owner\n"); + pr_info("\n"); +} + +static int read_jpeg_file(char *inFileName, unsigned char **pSrcBuf) +{ + int srcLen = 0; + int readLen = 0; + if (0 != strcmp(inFileName, "")) { + osal_file_t fpSrc = osal_fopen(inFileName, "rb"); + if (NULL == fpSrc) { + pr_err("Cann't open input file %s\n", inFileName); + goto FIND_ERROR; + } + /* get file size */ + osal_fseek(fpSrc, 0, SEEK_END); + srcLen = osal_ftell(fpSrc); + osal_fseek(fpSrc, 0, SEEK_SET); + *pSrcBuf = vmalloc(srcLen + 16); + readLen = osal_fread(*pSrcBuf, sizeof(unsigned char), srcLen, fpSrc); + if (srcLen != readLen) { + pr_info("Some Wrong happend at read jpeg file??, readLen = %d, request = %d\n", + readLen, srcLen); + } + pr_info("readLen = 0x%X\n", readLen); + osal_fclose(fpSrc); + } + +FIND_ERROR: + return readLen; +} + +static int write_yuv_file(char *name, unsigned char *pDstBuf, int suffix) +{ + int i; + int writeLen = 0; + int writeTotalLen = 0; + char writeName[256]; + osal_file_t fpYuv; + int iChromaHeight; + int iChromaWidth; + + CVIFRAMEBUF *cviFrameBuf = (CVIFRAMEBUF *)pDstBuf; + unsigned char *addrY_v = (unsigned char *)(cviFrameBuf->vbY.virt_addr); + unsigned char *addrCb_v = + (unsigned char *)(cviFrameBuf->vbCb.virt_addr); + unsigned char *addrCr_v = + (unsigned char *)(cviFrameBuf->vbCr.virt_addr); + + unsigned char *address = addrY_v; + int datLen = cviFrameBuf->width; + + sprintf(writeName, "%s%d.yuv", name, suffix); + fpYuv = osal_fopen(writeName, "wb"); + if (fpYuv == 0) { + pr_err("Cann't create a file to write data\n"); + return 0; + } + + if (0 != iPackedFormat) { + if ((5 == iPackedFormat) || (6 == iPackedFormat)) + datLen *= 3; + else + datLen *= 2; + } + +#if OUTPUT_FOR_SCALER + pr_err("strideY = %d\n", cviFrameBuf->strideY); + writeLen = osal_fwrite((unsigned char *)address, sizeof(unsigned char), + cviFrameBuf->height * cviFrameBuf->strideY, fpYuv); +#else + for (i = 0; i < cviFrameBuf->height; i++) { + writeLen = osal_fwrite((unsigned char *)address, + sizeof(unsigned char), datLen, fpYuv); + writeTotalLen += writeLen; + address = address + cviFrameBuf->strideY; + } +#endif + + if (0 != iPackedFormat) { + pr_err("iPackedFormat = %d\n", iPackedFormat); + goto ERROR_WRITE_YUV; + } + + iChromaHeight = cviFrameBuf->height; + iChromaWidth = cviFrameBuf->width; + switch (cviFrameBuf->format) { + case CVI_FORMAT_422: + iChromaHeight = cviFrameBuf->height; + iChromaWidth = cviFrameBuf->width >> 1; + break; + case CVI_FORMAT_224: + iChromaHeight = cviFrameBuf->height >> 1; + iChromaWidth = cviFrameBuf->width; + break; + case CVI_FORMAT_444: + iChromaHeight = cviFrameBuf->height; + iChromaWidth = cviFrameBuf->width; + break; + case CVI_FORMAT_400: + iChromaHeight = 0; + iChromaWidth = 0; + break; + case CVI_FORMAT_420: + default: + iChromaHeight = cviFrameBuf->height >> 1; + iChromaWidth = cviFrameBuf->width >> 1; + break; + } + +#if OUTPUT_FOR_SCALER + address = addrCb_v; + + pr_info("iChromaInterLeave = %d, iChromaHeight = %d, strideC = %d\n", + iChromaInterLeave, iChromaHeight, cviFrameBuf->strideC); + + writeLen = osal_fwrite((unsigned char *)address, sizeof(unsigned char), + iChromaHeight * cviFrameBuf->strideC, fpYuv); + + address = addrCr_v; + + writeLen = osal_fwrite((unsigned char *)address, sizeof(unsigned char), + iChromaHeight * cviFrameBuf->strideC, fpYuv); +#else + address = addrCb_v; + if (0 == iChromaInterLeave) { + for (i = 0; i < iChromaHeight; i++) { + writeLen = osal_fwrite((unsigned char *)address, + sizeof(unsigned char), iChromaWidth, + fpYuv); + writeTotalLen += writeLen; + address = address + cviFrameBuf->strideC; + } + + address = addrCr_v; + for (i = 0; i < iChromaHeight; i++) { + writeLen = osal_fwrite((unsigned char *)address, + sizeof(unsigned char), iChromaWidth, + fpYuv); + writeTotalLen += writeLen; + address = address + cviFrameBuf->strideC; + } + } else { + for (i = 0; i < iChromaHeight; i++) { + writeLen = osal_fwrite((unsigned char *)address, + sizeof(unsigned char), + cviFrameBuf->width, fpYuv); + writeTotalLen += writeLen; + address = address + cviFrameBuf->strideC; + } + } +#endif + +ERROR_WRITE_YUV: + if (0 != fpYuv) { + osal_fclose(fpYuv); + fpYuv = NULL; + } + return writeTotalLen; +} + +#if ENC_TYPE == 1 + +static int read_yuv_file(char *inFileName, unsigned char **pSrcBuf, + CVIFrameFormat fmt) +{ + int srcLen = 0; + int readLen = 0; + + if (0 != strcmp(inFileName, "")) { + FILE *fpSrc = osal_fopen(inFileName, "rb"); + if (NULL == fpSrc) { + pr_err("Cann't open input file %s\n", inFileName); + goto FIND_ERROR; + } + /* get file size */ + osal_fseek(fpSrc, 0, SEEK_END); + srcLen = osal_ftell(fpSrc); + osal_fseek(fpSrc, 0, SEEK_SET); + *pSrcBuf = vmalloc(srcLen + 16); + readLen = osal_fread(*pSrcBuf, sizeof(unsigned char), srcLen, fpSrc); + if (srcLen != readLen) { + pr_err("Some Wrong happend at read yuv file??, readLen = %d, request = %d\n", + readLen, srcLen); + } + osal_fclose(fpSrc); + } +FIND_ERROR: + return readLen; +} + +#elif ENC_TYPE == 2 + +static int read_yuv_file2(char *inFileName, unsigned char *pSrcBuf, + CVIFrameFormat fmt) +{ + osal_file_t fpSrc = NULL; + int readLen = 0; + int dataLen = 0; + CVIFRAMEBUF *buffer = (CVIFRAMEBUF *)pSrcBuf; + if (NULL == buffer) { + pr_err("alloc enc memory fail\n"); + goto FIND_ERROR; + } + + if (0 != strcmp(inFileName, "")) { + fpSrc = osal_fopen(inFileName, "rb"); + if (NULL == fpSrc) { + pr_err("Cann't open input file %s\n", inFileName); + goto FIND_ERROR; + } + int datLen = buffer->width; + if (0 != iPackedFormat) { + if ((5 == iPackedFormat) || (6 == iPackedFormat)) + datLen *= 3; + else + datLen *= 2; + } + readLen = osal_fread((unsigned char *)(buffer->vbY.virt_addr), + sizeof(unsigned char), datLen * buffer->height, + fpSrc); + if (0 != iPackedFormat) + goto FIND_ERROR; + + // [0](4:2:0) [1](4:2:2) [2](2:2:4 4:2:2 rotated) [3](4:4:4) + // [4](4:0:0) + dataLen = buffer->width * buffer->height; + if (CVI_FORMAT_422 == buffer->Format || + CVI_FORMAT_224 == buffer->Format) { + dataLen = dataLen >> 1; + } else if (CVI_FORMAT_400 == buffer->Format) { + dataLen = 0; + } else if (CVI_FORMAT_420 == buffer->Format) { + dataLen = dataLen >> 2; + } + + readLen += osal_fread((unsigned char *)(buffer->vbCb.virt_addr), + sizeof(unsigned char), dataLen, fpSrc); + readLen += osal_fread((unsigned char *)(buffer->vbCr.virt_addr), + sizeof(unsigned char), dataLen, fpSrc); + } +FIND_ERROR: + if (NULL != fpSrc) + osal_fclose(fpSrc); + return readLen; +} + +#elif ENC_TYPE == 3 + +static int read_yuv_file3(CVIJpgHandle jpgHandle, char *inFileName, + CVIEncConfigParam encConfig) +{ + int ret = 0; + CVIFRAMEBUF DataBuf; + unsigned char *pWriteData = 0; + int iReadData = 0; + unsigned char *pReadData; + int i = 0; + osal_file_t fpSrc; + int nY = encConfig.picHeight; + int nCb = 0; + int nCr = 0; + int chromaWidth = 0; + int picWidth = encConfig.picWidth; + + memset(&DataBuf, 0, sizeof(CVIFRAMEBUF)); + ret = CVIJpgGetInputDataBuf(jpgHandle, &DataBuf, sizeof(CVIFRAMEBUF)); + if (0 != ret) { + pr_err("\nFailed to CVIJpgGetInputDataBuf, ret = %d\n", ret); + return 0; + } + + switch (encConfig.sourceFormat) { + case 0: + nCb = nCr = encConfig.picHeight >> 1; + chromaWidth = encConfig.picWidth >> 1; + break; + case 1: + nCb = nCr = encConfig.picHeight; + chromaWidth = encConfig.picWidth >> 1; + break; + case 2: + nCb = nCr = encConfig.picHeight >> 1; + chromaWidth = encConfig.picWidth; + break; + case 3: + nCb = nCr = encConfig.picHeight; + chromaWidth = encConfig.picWidth; + break; + case 4: + nCb = nCr = 0; + chromaWidth = encConfig.picWidth >> 1; + break; + } + + if (encConfig.packedFormat) { + if ((5 == encConfig.packedFormat) || + (6 == encConfig.packedFormat)) + picWidth *= 3; + else + picWidth *= 2; + } + + fpSrc = osal_fopen(inFileName, "rb"); + if (NULL == fpSrc) { + pr_err("Cann't open input file %s\n", inFileName); + return 0; + } + + pReadData = + vmalloc(encConfig.picWidth * sizeof(unsigned char) * 3 + 16); + + + /* read Y */ + for (i = 0; i < nY; i++) { + pWriteData = (unsigned char *)(DataBuf.vbY.virt_addr) + + DataBuf.strideY * i; + iReadData += osal_fread(pReadData, sizeof(unsigned char), picWidth, + fpSrc); + memcpy(pWriteData, pReadData, picWidth); + } + + if ((4 == encConfig.sourceFormat) || encConfig.packedFormat) { + vfree(pReadData); + return iReadData; + } + + if (encConfig.chromaInterleave) { + /* read Cb */ + for (i = 0; i < nCb; i++) { + pWriteData = (unsigned char *)(DataBuf.vbCb.virt_addr) + + DataBuf.strideC * i; + iReadData += osal_fread(pReadData, sizeof(unsigned char), + chromaWidth * 2, fpSrc); + memcpy(pWriteData, pReadData, chromaWidth * 2); + } + } else { + /* read Cb */ + for (i = 0; i < nCb; i++) { + pWriteData = (unsigned char *)(DataBuf.vbCb.virt_addr) + + DataBuf.strideC * i; + iReadData += osal_fread(pReadData, sizeof(unsigned char), + chromaWidth, fpSrc); + memcpy(pWriteData, pReadData, chromaWidth); + } + + /* read Cr */ + for (i = 0; i < nCb; i++) { + pWriteData = (unsigned char *)(DataBuf.vbCr.virt_addr) + + DataBuf.strideC * i; + iReadData += osal_fread(pReadData, sizeof(unsigned char), + chromaWidth, fpSrc); + memcpy(pWriteData, pReadData, chromaWidth); + } + } + + vfree(pReadData); + osal_fclose(fpSrc); + + return iReadData; +} + +#endif + +static int write_jpg_file(char *name, unsigned char *pDstBuf, int suffix) +{ + // int i; + int writeLen = 0; + char writeName[256]; + CVIBUF *cviBuf = (CVIBUF *)pDstBuf; + unsigned char *address = (unsigned char *)(cviBuf->virt_addr); + unsigned int length = (int)(cviBuf->size); + osal_file_t fpJpg; + + sprintf(writeName, "%s%d.jpg", name, suffix); + fpJpg = osal_fopen(writeName, "wb"); + if (0 == fpJpg) { + pr_err("Cann't create a file %s to write data\n", writeName); + return 0; + } + + writeLen = osal_fwrite((unsigned char *)address, sizeof(unsigned char), + length, fpJpg); + osal_fclose(fpJpg); + fpJpg = NULL; + + return writeLen; +} + + +int cvi_jpeg_test(u_long arg) +{ +#define MAX_ARG_CNT 30 + char buf[512]; + char *pArgv[MAX_ARG_CNT] = {0}; + char *save_ptr; + unsigned int u32Argc = 0; + char *pBuf; + unsigned int __user *argp = (unsigned int __user *)arg; + + memset(buf, 0, 512); + + if (argp != NULL) { + if (copy_from_user(buf, (char *)argp, 512)) + return -1; + } + + pBuf = buf; + + while (NULL != (pArgv[u32Argc] = cvi_strtok_r(pBuf, " ", &save_ptr))) { + u32Argc++; + + if (u32Argc >= MAX_ARG_CNT) { + break; + } + + pBuf = NULL; + } + + return jpeg_main(u32Argc, pArgv); +} +#endif \ No newline at end of file diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/jpuhelper.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/jpuhelper.h new file mode 100644 index 0000000000..c42753daa3 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/jpuhelper.h @@ -0,0 +1,159 @@ +#ifndef _JPU_HELPER_H_ +#define _JPU_HELPER_H_ + +#include "jpurun.h" +#include "../jpuapi/jpuapi.h" + +typedef struct { + char SrcFileName[256]; + int NumFrame; + int PicX; + int PicY; + int FrameRate; + + // MPEG4 ONLY + int VerId; + int DataPartEn; + int RevVlcEn; + int ShortVideoHeader; + int AnnexI; + int AnnexJ; + int AnnexK; + int AnnexT; + int IntraDcVlcThr; + int VopQuant; + + // H.264 ONLY + int ConstIntraPredFlag; + int DisableDeblk; + int DeblkOffsetA; + int DeblkOffsetB; + int ChromaQpOffset; + int PicQpY; + + // MJPEG ONLY + char HuffTabName[256]; + char QMatTabName[256]; + int VersionID; + int FrmFormat; + int SrcFormat; + int RstIntval; + int ThumbEnable; + int ThumbSizeX; + int ThumbSizeY; + + // COMMON + int GopPicNum; + int SliceMode; + int SliceSizeMode; + int SliceSizeNum; + + int IntraRefreshNum; + + int ConstantIntraQPEnable; + int RCIntraQP; + int MaxQpSetEnable; + int MaxQp; + int GammaSetEnable; + int Gamma; + int HecEnable; + + // RC + int RcEnable; + int RcBitRate; + int RcInitDelay; + int RcBufSize; + + // NEW RC Scheme + int RcIntervalMode; + int RcMBInterval; + int IntraCostWeight; + int SearchRange; + int MeUseZeroPmv; + int MeBlkModeEnable; + +} ENC_CFG; + +typedef struct { + FrameFormat sourceFormat; + int restartInterval; + BYTE huffVal[4][162]; + BYTE huffBits[4][256]; + BYTE qMatTab[4][64]; +} EncMjpgParam; + +#if defined(__cplusplus) +extern "C" { +#endif + +int jpgGetHuffTable(char *huffFileName, EncMjpgParam *param); +int jpgGetQMatrix(char *qMatFileName, EncMjpgParam *param); + +int getJpgEncOpenParamDefault(JpgEncOpenParam *pEncOP, + EncConfigParam *pEncConfig); + +JpgRet WriteJpgBsBufHelper(JpgDecHandle handle, BufInfo *pBufInfo, + PhysicalAddress paBsBufStart, + PhysicalAddress paBsBufEnd, int defaultsize, + int checkeos, int *pstreameos, int endian); + +#ifdef REDUNDENT_CODE +JpgRet ReadJpgBsBufHelper(JpgEncHandle handle, FILE *bsFp, + PhysicalAddress paBsBufStart, + PhysicalAddress paBsBufEnd, int encHeaderSize, + int endian); +#endif + +#ifdef REDUNDENT_CODE +int LoadYuvPartialImageHelperFormat( + FILE *yuvFp, Uint8 *pYuv, PhysicalAddress addrY, PhysicalAddress addrCb, + PhysicalAddress addrCr, int picWidth, int picHeight, + int picHeightPartial, int stride, int interleave, int format, + int endian, int partPosIdx, int frameIdx, int packed); + +int SaveYuvImageHelperFormat(FILE *yuvFp, Uint8 *pYuv, PhysicalAddress addrY, + PhysicalAddress addrCb, PhysicalAddress addrCr, + int picWidth, int picHeight, int stride, + int interLeave, int format, int endian, int packed, + int *pFrameSize); + +int SaveYuvPartialImageHelperFormat( + FILE *yuvFp, Uint8 *pYuv, PhysicalAddress addrY, PhysicalAddress addrCb, + PhysicalAddress addrCr, int picWidth, int picHeight, + int picHeightPartial, int stride, int interLeave, int format, + int endian, int partPosIdx, int frameIdx, int packed); +#endif + +unsigned int GetFrameBufSize(int framebufFormat, int picWidth, int picHeight); +#ifdef REDUNDENT_CODE +void GetMcuUnitSize(int format, int *mcuWidth, int *mcuHeight); +#endif + +typedef enum { + YUV444, + YUV422, + YUV420, + NV12, + NV21, + YUV400, + YUYV, + YVYU, + UYVY, + VYUY, + YYY, + RGB_PLANAR, + RGB32, + RGB24, + RGB16 +} yuv2rgb_color_format; +void jpu_yuv2rgb(int width, int height, yuv2rgb_color_format format, + unsigned char *src, unsigned char *rgba, int chroma_reverse); +yuv2rgb_color_format +convert_jpuapi_format_to_yuv2rgb_color_format(int planar_format, + int pack_format, int interleave); +Uint64 jpgGetCurrentTime(void); +#if defined(__cplusplus) +} +#endif + +#endif //#ifndef _JPU_HELPER_H_ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/jpulog.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/jpulog.h new file mode 100644 index 0000000000..2dcfd2a1e1 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/jpulog.h @@ -0,0 +1,79 @@ + +#ifndef _LOG_H_ +#define _LOG_H_ + + +enum { NONE = 0, ERR, WARN, INFO, TRACE, MAX_LOG_LEVEL }; +enum { + LOG_HAS_DAY_NAME = 1, /**< Include day name [default: no] */ + LOG_HAS_YEAR = 2, /**< Include year digit [no] */ + LOG_HAS_MONTH = 4, /**< Include month [no] */ + LOG_HAS_DAY_OF_MON = 8, /**< Include day of month [no] */ + LOG_HAS_TIME = 16, /**< Include time [yes] */ + LOG_HAS_MICRO_SEC = 32, /**< Include microseconds [yes] */ + LOG_HAS_FILE = 64, /**< Include sender in the log [yes] */ + LOG_HAS_NEWLINE = 128, /**< Terminate each call with newline [yes] */ + LOG_HAS_CR = 256, /**< Include carriage return [no] */ + LOG_HAS_SPACE = 512, /**< Include two spaces before log [yes] */ + LOG_HAS_COLOR = 1024, /**< Colorize logs [yes on win32] */ + LOG_HAS_LEVEL_TEXT = 2048 /**< Include level text string [no] */ +}; +enum { + TERM_COLOR_R = 2, /**< Red */ + TERM_COLOR_G = 4, /**< Green */ + TERM_COLOR_B = 1, /**< Blue. */ + TERM_COLOR_BRIGHT = 8 /**< Bright mask. */ +}; + +#define MAX_PRINT_LENGTH 512 + +#ifdef ANDROID +#include +#undef LOG_NDEBUG +#define LOG_NDEBUG 0 +#undef LOG_TAG +#define LOG_TAG "JPUAPI" +#endif + +#define JLOG jdi_LogMsg + +#ifdef REDUNDENT_CODE +#define LOG_ENABLE_FILE jdi_SetLogDecor(jdi_GetLogDecor() | LOG_HAS_FILE) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifdef REDUNDENT_CODE +int jdi_InitLog(void); +void jdi_DeInitLog(void); +#endif + +void jdi_SetMaxLogLevel(int level); +int jdi_GetMaxLogLevel(void); + +#ifdef REDUNDENT_CODE +void jdi_SetLogColor(int level, int color); +int jdi_GetLogColor(int level); + +void jdi_SetLogDecor(int decor); +int jdi_GetLogDecor(void); +#endif + +void jdi_LogMsg(int level, const char *format, ...); + +#ifdef REDUNDENT_CODE +#if defined(linux) || defined(__linux) || defined(ANDROID) +int kbhit(void); +int getch(void); +void init_keyboard(void); +void close_keyboard(void); +#endif +#endif + +#if defined(__cplusplus) +} +#endif + +#endif //#ifndef _LOG_H_ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/jpurun.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/jpurun.h new file mode 100644 index 0000000000..c509c75449 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/jpurun.h @@ -0,0 +1,109 @@ +#ifndef _JPU_RUN_H_ +#define _JPU_RUN_H_ + +#define MAX_FILE_PATH 256 + +typedef struct { + unsigned char *buf; + int size; + int point; + int count; + int fillendbs; +} BufInfo; + +typedef struct { + char yuvFileName[MAX_FILE_PATH]; + char bitstreamFileName[MAX_FILE_PATH]; + char huffFileName[MAX_FILE_PATH]; + char qMatFileName[MAX_FILE_PATH]; + char qpFileName[MAX_FILE_PATH]; + char cfgFileName[MAX_FILE_PATH]; + int picWidth; + int picHeight; + int rotAngle; + int mirDir; + int useRot; + FrameFormat sourceFormat; + int outNum; + int instNum; + + int StreamEndian; + int FrameEndian; + CbCrInterLeave chromaInterleave; + int bEnStuffByte; + + // altek requirement + int encHeaderMode; + + char strStmDir[MAX_FILE_PATH]; + char strCfgDir[MAX_FILE_PATH]; + int usePartialMode; + int partialBufNum; + int partialHeight; + PackedOutputFormat packedFormat; + int RandRotMode; + + char refBitstreamFileName[MAX_FILE_PATH]; +} EncConfigParam; + +typedef struct { + char yuvFileName[MAX_FILE_PATH]; + char bitstreamFileName[MAX_FILE_PATH]; + int rotAngle; + int mirDir; + int useRot; + int outNum; + int checkeos; + int instNum; + int StreamEndian; + int FrameEndian; + int chromaInterleave; + int iHorScaleMode; + int iVerScaleMode; + + // ROI + int roiEnable; + int roiWidth; + int roiHeight; + int roiOffsetX; + int roiOffsetY; + int roiWidthInMcu; + int roiHeightInMcu; + int roiOffsetXInMcu; + int roiOffsetYInMcu; + + // packed + int packedFormat; + + int usePartialMode; + int partialBufNum; + + int partialHeight; + int filePlay; + + char refYuvFileName[MAX_FILE_PATH]; +} DecConfigParam; + +enum { STD_JPG_ENC }; + +typedef struct { + int codecMode; + int numMulti; + int saveYuv; + int multiMode[MAX_NUM_INSTANCE]; + char multiFileName[MAX_NUM_INSTANCE][MAX_FILE_PATH]; + char multiYuvFileName[MAX_NUM_INSTANCE][MAX_FILE_PATH]; + EncConfigParam encConfig[MAX_NUM_INSTANCE]; + DecConfigParam decConfig[MAX_NUM_INSTANCE]; +} MultiConfigParam; + +#if defined(__cplusplus) +extern "C" { +#endif +int DecodeTest(DecConfigParam *param); +int EncodeTest(EncConfigParam *param); +int MultiInstanceTest(MultiConfigParam *param); +#if defined(__cplusplus) +} +#endif +#endif /* _JPU_RUN_H_ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/mixer.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/mixer.h new file mode 100644 index 0000000000..615f1c9c8a --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/mixer.h @@ -0,0 +1,47 @@ + +#ifndef _MIXER_H_ +#define _MIXER_H_ + +#include "jpuconfig.h" + +typedef struct { + int Format; + int Index; + jpu_buffer_t vbY; + jpu_buffer_t vbCb; + jpu_buffer_t vbCr; + int strideY; + int strideC; +} FRAME_BUF; + +#define MAX_DISPLAY_WIDTH 1920 +#define MAX_DISPLAY_HEIGHT 1088 + +#if defined(__cplusplus) +extern "C" { +#endif + +int AllocateFrameBuffer(int instIdx, int format, int width, int height, + int frameBufNum, int pack); +void FreeFrameBuffer(int instIdx); +FRAME_BUF *GetFrameBuffer(int instIdx, int index); +int GetFrameBufBase(int instIdx); +int GetFrameBufAllocSize(int instIdx); +void ClearFrameBuffer(int instIdx, int index); +FRAME_BUF *FindFrameBuffer(int instIdx, PhysicalAddress addrY); +#ifdef JPU_FPGA_PLATFORM +int SetMixerDecOutLayer(int instIdx, int index, int picX, int picY); +int SetMixerDecOutFrame(FRAME_BUF *pFrame, int width, int height); +void WaitMixerInt(void); +#endif +int sw_mixer_open(int instIdx, int width, int height); +int sw_mixer_draw(int instIdx, int x, int y, int width, int height, + int planar_format, int pack_format, int inteleave, + unsigned char *pbImage); +void sw_mixer_close(int instIdx); + +#if defined(__cplusplus) +} +#endif + +#endif //#ifndef _MIXER_H_ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/msvc/inttypes.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/msvc/inttypes.h new file mode 100644 index 0000000000..f6b3138e45 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/msvc/inttypes.h @@ -0,0 +1,305 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote \ + // 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +#define SCNdPTR "I64d" +#define SCNiPTR "I64i" +#else // _WIN64 ][ +#define SCNdPTR "ld" +#define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +#define SCNoPTR "I64o" +#define SCNuPTR "I64u" +#define SCNxPTR "I64x" +#define SCNXPTR "I64X" +#else // _WIN64 ][ +#define SCNoPTR "lo" +#define SCNuPTR "lu" +#define SCNxPTR "lx" +#define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] + imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/msvc/stdint.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/msvc/stdint.h new file mode 100644 index 0000000000..2f34322270 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/include/msvc/stdint.h @@ -0,0 +1,260 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we should wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +#define _W64 __w64 +#else +#define _W64 +#endif +#endif + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#else +typedef signed __int8 int8_t; +typedef signed __int16 int16_t; +typedef signed __int32 int32_t; +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + +// 7.18.1.2 Minimum-width integer types +#ifndef __int_least8_t_defined +#define __int_least8_t_defined +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +#endif + +#ifndef __uint_least8_t_defined +#define __uint_least8_t_defined +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; +#endif + +// 7.18.1.3 Fastest minimum-width integer types +#ifndef __int_fast8_t_defined +#define __int_fast8_t_defined +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +#endif + +#ifndef __uint_fast8_t_defined +#define __uint_fast8_t_defined +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; +#endif + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ +typedef signed __int64 intptr_t; +typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ +typedef _W64 signed int intptr_t; +typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote \ + // 220 at page 257 and \ + // footnote 221 at \ + // page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +#define INTPTR_MIN INT64_MIN +#define INTPTR_MAX INT64_MAX +#define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +#define INTPTR_MIN INT32_MIN +#define INTPTR_MAX INT32_MAX +#define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +#define PTRDIFF_MIN _I64_MIN +#define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +#define PTRDIFF_MIN _I32_MIN +#define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +#ifdef _WIN64 // [ +#define SIZE_MAX _UI64_MAX +#else // _WIN64 ][ +#define SIZE_MAX _UI32_MAX +#endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +#define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +#define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || \ + defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_STDINT_H_ ] diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/jdi.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/jdi.h new file mode 100644 index 0000000000..7cf2f23da8 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/jdi.h @@ -0,0 +1,281 @@ + +#ifndef _JDI_HPI_H_ +#define _JDI_HPI_H_ + +#include +#include +#include +#include +#include "ion/ion.h" +#include "ion/cvitek/cvitek_ion_alloc.h" +#include "sys.h" +#include "../jpuapi/jpuconfig.h" +#include "../jpuapi/regdefine.h" +#include "mm.h" + +#define CVI_DBG_MSG_ENABLE + +#define CVI_MASK_ERR 0x1 +#define CVI_MASK_WARN 0x2 +#define CVI_MASK_INFO 0x4 +#define CVI_MASK_FLOW 0x8 +#define CVI_MASK_DBG 0x10 +#define CVI_MASK_IF 0x20 +#define CVI_MASK_LOCK 0x40 +#define CVI_MASK_RC 0x80 +#define CVI_MASK_CVRC 0x100 +#define CVI_MASK_FLOAT 0x200 +#define CVI_MASK_MEM 0x400 +#define CVI_MASK_PERF 0x1000 +#define CVI_MASK_TRACE 0x10000 +#define CVI_MASK_CURR (0x3) + +#ifdef CVI_DBG_MSG_ENABLE +extern uint jpeg_mask; + +#define CVI_PRNT(msg, ...) pr_info(msg, ##__VA_ARGS__) +#define CVI_JPG_DBG_ERR(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_ERR) \ + pr_err("[ERR] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_WARN(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_WARN) \ + pr_warn("[WARN] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_INFO(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_INFO) \ + pr_info("[INFO] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_FLOW(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_FLOW) \ + pr_info("[FLOW] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_DBG(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_DBG) \ + pr_info("[DBG] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_IF(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_IF) \ + pr_info("[IF] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_LOCK(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_LOCK) \ + pr_info("[LOCK] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_RC(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_RC) \ + pr_info("[RC] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_CVRC(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_CVRC) \ + pr_info("[CVRC] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_FLOAT(msg, ...) +#define CVI_JPG_DBG_MEM(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_MEM) \ + pr_info("[MEM] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_PERF(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_PERF) \ + pr_info("[PERF] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_JPG_DBG_TRACE(msg, ...) \ + do { \ + if (jpeg_mask & CVI_MASK_TRACE) \ + pr_info("[TRACE] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#else +#define CVI_JPG_DBG_ERR(msg, ...) +#define CVI_JPG_DBG_WARN(msg, ...) +#define CVI_JPG_DBG_INFO(msg, ...) +#define CVI_JPG_DBG_FLOW(msg, ...) +#define CVI_JPG_DBG_DBG(msg, ...) +#define CVI_JPG_DBG_IF(msg, ...) +#define CVI_JPG_DBG_LOCK(msg, ...) +#define CVI_JPG_DBG_RC(msg, ...) +#define CVI_JPG_DBG_CVRC(msg, ...) +#define CVI_JPG_DBG_FLOAT(msg, ...) +#define CVI_JPG_DBG_MEM(msg, ...) +#define CVI_JPG_DBG_PERF(msg, ...) +#define CVI_JPG_DBG_TRACE(msg, ...) +#endif + +#define MAX_BS_SIZE (16384 * 1024) +#define MAX_JPU_BUFFER_POOL 32 + +#ifdef CVI_JPG_USE_ION_MEM +#define MAX_JPU_ION_BUFFER_NAME (32) +#define JDI_ALLOCATE_MEMORY(VB_STREAM, IS_JPE, IS_CACHED) \ + jdi_allocate_ion_memory((VB_STREAM), (IS_JPE), (IS_CACHED)) +#define JDI_FREE_MEMORY(VB_STREAM) jdi_free_ion_memory((VB_STREAM)) +#else +#define JDI_ALLOCATE_MEMORY(VB_STREAM, IS_JPE, IS_CACHED) \ + jdi_allocate_dma_memory((VB_STREAM), (IS_JPE)) +#define JDI_FREE_MEMORY(VB_STREAM) jdi_free_dma_memory((VB_STREAM)) +#endif + +#define JpuWriteReg(ADDR, DATA) \ + jdi_write_register(ADDR, DATA) // system register write +#define JpuReadReg(ADDR) jdi_read_register(ADDR) // system register write +#define JpuWriteMem(ADDR, DATA, LEN, ENDIAN) \ + jdi_write_memory(ADDR, DATA, LEN, ENDIAN) // system memory write +#define JpuReadMem(ADDR, DATA, LEN, ENDIAN) \ + jdi_read_memory(ADDR, DATA, LEN, ENDIAN) // system memory write + +typedef struct jpu_buffer_t { + __u32 size; + __u64 phys_addr; + __u64 base; + __u8 *virt_addr; /* virtual user space address */ +#ifdef __arm__ + __u32 padding; /* padding for keeping same size of this structure */ +#endif +} jpu_buffer_t; + +typedef struct jpu_instance_pool_t { + unsigned char jpgInstPool[MAX_NUM_INSTANCE][MAX_INST_HANDLE_SIZE]; +#if defined(LIBCVIJPULITE) + long jpu_mutex; +#else + struct mutex jpu_mutex; +#endif + int jpu_instance_num; + int instance_pool_inited; + void *pendingInst; +#ifdef REDUNDENT_CODE + jpeg_mm_t vmem; +#endif +} jpu_instance_pool_t; + +#ifdef SUPPORT_128BIT_BUS + +typedef enum { + JDI_128BIT_LITTLE_64BIT_LITTLE_ENDIAN = + ((0 << 2) + (0 << 1) + (0 << 0)), // 128 bit little, 64 bit + // little + JDI_128BIT_BIG_64BIT_LITTLE_ENDIAN = + ((1 << 2) + (0 << 1) + (0 << 0)), // 128 bit big , 64 bit + // little + JDI_128BIT_LITTLE_64BIT_BIG_ENDIAN = + ((0 << 2) + (0 << 1) + (1 << 0)), // 128 bit little, 64 bit big + JDI_128BIT_BIG_64BIT_BIG_ENDIAN = + ((1 << 2) + (0 << 1) + (1 << 0)), // 128 bit big, 64 bit big + JDI_128BIT_LITTLE_32BIT_LITTLE_ENDIAN = + ((0 << 2) + (1 << 1) + (0 << 0)), // 128 bit little, 32 bit + // little + JDI_128BIT_BIG_32BIT_LITTLE_ENDIAN = + ((1 << 2) + (1 << 1) + (0 << 0)), // 128 bit big , 32 bit + // little + JDI_128BIT_LITTLE_32BIT_BIG_ENDIAN = + ((0 << 2) + (1 << 1) + (1 << 0)), // 128 bit little, 32 bit big + JDI_128BIT_BIG_32BIT_BIG_ENDIAN = + ((1 << 2) + (1 << 1) + (1 << 0)), // 128 bit big, 32 bit big +} EndianMode; +#define JDI_LITTLE_ENDIAN JDI_128BIT_LITTLE_64BIT_LITTLE_ENDIAN +#define JDI_BIG_ENDIAN JDI_128BIT_BIG_64BIT_BIG_ENDIAN +#define JDI_128BIT_ENDIAN_MASK (1 << 2) +#define JDI_64BIT_ENDIAN_MASK (1 << 1) +#define JDI_ENDIAN_MASK (1 << 0) + +#define JDI_32BIT_LITTLE_ENDIAN JDI_128BIT_LITTLE_32BIT_LITTLE_ENDIAN +#define JDI_32BIT_BIG_ENDIAN JDI_128BIT_LITTLE_32BIT_BIG_ENDIAN + +#else + +typedef enum { + JDI_LITTLE_ENDIAN = 0, + JDI_BIG_ENDIAN, + JDI_32BIT_LITTLE_ENDIAN, + JDI_32BIT_BIG_ENDIAN, +} EndianMode; +#endif + +typedef enum { JDI_LOG_CMD_PICRUN = 0, JDI_LOG_CMD_MAX } jdi_log_cmd; + +#if defined(__cplusplus) +extern "C" { +#endif +int jdi_probe(void); +int jdi_init(void); +int jdi_release(void); // this function may be called only at system off. +int jdi_get_task_num(void); +int jdi_use_single_es_buffer(void); +int jdi_set_enc_task(int bSingleEsBuf, int *singleEsBufSize); +int jdi_get_enc_task_num(void); +int jdi_delete_enc_task(void); +jpu_instance_pool_t *jdi_get_instance_pool(void); +int jdi_get_allocated_memory(jpu_buffer_t *vb, int is_jpe); +#ifndef CVI_JPG_USE_ION_MEM +int jdi_allocate_dma_memory(jpu_buffer_t *vb, int is_jpe); +void jdi_free_dma_memory(jpu_buffer_t *vb); +#else +int jdi_allocate_ion_memory(jpu_buffer_t *vb, int is_jpe, int is_cached); +int jdi_free_ion_memory(jpu_buffer_t *vb); +int jdi_invalidate_ion_cache(uint64_t u64PhyAddr, void *pVirAddr, + uint32_t u32Len); +int jdi_flush_ion_cache(uint64_t u64PhyAddr, void *pVirAddr, uint32_t u32Len); +#endif + +int jdi_wait_interrupt(int timeout); +int jdi_hw_reset(void); + +int jdi_set_clock_gate(int enable); +int jdi_get_clock_gate(void); + +int jdi_open_instance(unsigned long instIdx); +int jdi_close_instance(unsigned long instIdx); +int jdi_get_instance_num(void); + +void jdi_write_register(unsigned int addr, unsigned int data); +unsigned int jdi_read_register(unsigned int addr); + +int jdi_write_memory(unsigned long addr, unsigned char *data, int len, + int endian); +int jdi_read_memory(unsigned long addr, unsigned char *data, int len, + int endian); + +#if defined(LIBCVIJPULITE) +int jdi_lock(int sleep_us); +#else +int jdi_lock(void); +#endif +void jdi_unlock(void); + +void jdi_log(int cmd, int step); + +#ifdef JPU_FPGA_PLATFORM +#define HPI_SET_TIMING_MAX 1000 +int jdi_set_timing_opt(void); +int jdi_set_clock_freg(int Device, int OutFreqMHz, int InFreqMHz); +#endif + +PhysicalAddress jdi_get_memory_addr_high(PhysicalAddress addr); + +#if defined(__cplusplus) +} +#endif + +#endif //#ifndef _JDI_HPI_H_ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/linux/driver/jmm.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/linux/driver/jmm.h new file mode 100644 index 0000000000..4bfe69d8cf --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/linux/driver/jmm.h @@ -0,0 +1,663 @@ +#ifndef __JPU_JPU_MM_H__ +#define __JPU_JPU_MM_H__ + +//#define CVI_DBG_MSG_ENABLE + +#define CVI_MASK_INFO 0x1 +#define CVI_MASK_FLOW 0x2 +#define CVI_MASK_MEM 0x10 +#define CVI_MASK_TRACE 0x20 + +static int jpu_klevel = 0x3; + +#ifdef CVI_DBG_MSG_ENABLE +#define CVI_DBG_INFO(msg, ...) \ + do { \ + if (jpu_klevel & CVI_MASK_INFO) \ + pr_info("[INFO] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_DBG_FLOW(msg, ...) \ + do { \ + if (jpu_klevel & CVI_MASK_FLOW) \ + pr_info("[FLOW] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_DBG_MEM(msg, ...) \ + do { \ + if (jpu_klevel & CVI_MASK_MEM) \ + pr_info("[MEM] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_DBG_TRACE(msg, ...) \ + do { \ + if (jpu_klevel & CVI_MASK_TRACE) \ + pr_info("[TRACE] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#else +#define CVI_DBG_INFO(msg, ...) \ + do { \ + if (jpu_klevel & CVI_MASK_INFO) \ + pr_info("[INFO] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define CVI_DBG_FLOW(msg, ...) +#define CVI_DBG_MEM(msg, ...) +#define CVI_DBG_TRACE(msg, ...) +#endif + +typedef unsigned long long jmem_key_t; + +#define JMEM_PAGE_SIZE (16 * 1024) +#define MAKE_KEY(_a, _b) (((jmem_key_t)_a) << 32 | _b) +#define KEY_TO_VALUE(_key) (_key >> 32) + +typedef struct page_struct { + int pageno; + unsigned long addr; + int used; + int alloc_pages; + int first_pageno; +} page_t; + +typedef struct avl_node_struct { + jmem_key_t key; + int height; + page_t *page; + struct avl_node_struct *left; + struct avl_node_struct *right; +} avl_node_t; + +typedef struct _jpu_mm_struct { + avl_node_t *free_tree; + avl_node_t *alloc_tree; + page_t *page_list; + int num_pages; + unsigned long base_addr; + unsigned long mem_size; + int free_page_count; + int alloc_page_count; +} jpu_mm_t; + +#define VMEM_P_ALLOC(_x) vmalloc(_x) +#define VMEM_P_FREE(_x) vfree(_x) + +#define VMEM_ASSERT(_exp) \ + do { \ + if (!(_exp)) \ + pr_info("VMEM_ASSERT at %s:%d\n", __FILE__, __LINE__); \ + } while (0) +#define VMEM_HEIGHT(_tree) (_tree == NULL ? -1 : _tree->height) + +#define MAX(_a, _b) (_a >= _b ? _a : _b) +#if 0 +typedef enum { LEFT, RIGHT } rotation_dir_t; + +typedef struct avl_node_data_struct { + int key; + page_t *page; +} avl_node_data_t; + +static avl_node_t *make_avl_node(jmem_key_t key, page_t *page) +{ + avl_node_t *node = (avl_node_t *)VMEM_P_ALLOC(sizeof(avl_node_t)); + + node->key = key; + node->page = page; + node->height = 0; + node->left = NULL; + node->right = NULL; + + return node; +} + +static int get_balance_factor(avl_node_t *tree) +{ + int factor = 0; + + if (tree) { + factor = VMEM_HEIGHT(tree->right) - VMEM_HEIGHT(tree->left); + } + + return factor; +} + +/* + * Left Rotation + * + * A B + * \ / \ + * B => A C + * / \ \ + * D C D + * + */ +static avl_node_t *rotation_left(avl_node_t *tree) +{ + avl_node_t *rchild; + avl_node_t *lchild; + + if (tree == NULL) + return NULL; + + rchild = tree->right; + if (rchild == NULL) { + return tree; + } + + lchild = rchild->left; + rchild->left = tree; + tree->right = lchild; + + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + 1; + rchild->height = + MAX(VMEM_HEIGHT(rchild->left), VMEM_HEIGHT(rchild->right)) + 1; + + return rchild; +} + +/* + * Reft Rotation + * + * A B + * \ / \ + * B => D A + * / \ / + * D C C + * + */ +static avl_node_t *rotation_right(avl_node_t *tree) +{ + avl_node_t *rchild; + avl_node_t *lchild; + + if (tree == NULL) + return NULL; + + lchild = tree->left; + if (lchild == NULL) + return NULL; + + rchild = lchild->right; + lchild->right = tree; + tree->left = rchild; + + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + 1; + lchild->height = + MAX(VMEM_HEIGHT(lchild->left), VMEM_HEIGHT(lchild->right)) + 1; + + return lchild; +} + +static avl_node_t *do_balance(avl_node_t *tree) +{ + int bfactor = 0, child_bfactor; /* balancing factor */ + + bfactor = get_balance_factor(tree); + + if (bfactor >= 2) { + child_bfactor = get_balance_factor(tree->right); + if (child_bfactor == 1 || child_bfactor == 0) { + tree = rotation_left(tree); + } else if (child_bfactor == -1) { + tree->right = rotation_right(tree->right); + tree = rotation_left(tree); + } else { + pr_info("invalid balancing factor: %d\n", + child_bfactor); + VMEM_ASSERT(0); + return NULL; + } + } else if (bfactor <= -2) { + child_bfactor = get_balance_factor(tree->left); + if (child_bfactor == -1 || child_bfactor == 0) { + tree = rotation_right(tree); + } else if (child_bfactor == 1) { + tree->left = rotation_left(tree->left); + tree = rotation_right(tree); + } else { + pr_info("invalid balancing factor: %d\n", + child_bfactor); + VMEM_ASSERT(0); + return NULL; + } + } + + return tree; +} +static avl_node_t *unlink_end_node(avl_node_t *tree, int dir, + avl_node_t **found_node) +{ + avl_node_t *node; + *found_node = NULL; + + if (tree == NULL) + return NULL; + + if (dir == LEFT) { + if (tree->left == NULL) { + *found_node = tree; + return NULL; + } + } else { + if (tree->right == NULL) { + *found_node = tree; + return NULL; + } + } + + if (dir == LEFT) { + node = tree->left; + tree->left = unlink_end_node(tree->left, LEFT, found_node); + if (tree->left == NULL) { + tree->left = (*found_node)->right; + (*found_node)->left = NULL; + (*found_node)->right = NULL; + } + } else { + node = tree->right; + tree->right = unlink_end_node(tree->right, RIGHT, found_node); + if (tree->right == NULL) { + tree->right = (*found_node)->left; + (*found_node)->left = NULL; + (*found_node)->right = NULL; + } + } + + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + 1; + + return do_balance(tree); +} + +static avl_node_t *avltree_insert(avl_node_t *tree, jmem_key_t key, + page_t *page) +{ + if (tree == NULL) { + tree = make_avl_node(key, page); + } else { + if (key >= tree->key) { + tree->right = avltree_insert(tree->right, key, page); + } else { + tree->left = avltree_insert(tree->left, key, page); + } + } + + tree = do_balance(tree); + + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + 1; + + return tree; +} + +static avl_node_t *do_unlink(avl_node_t *tree) +{ + avl_node_t *node; + avl_node_t *end_node; + + node = unlink_end_node(tree->right, LEFT, &end_node); + if (node) { + tree->right = node; + } else { + node = unlink_end_node(tree->left, RIGHT, &end_node); + if (node) + tree->left = node; + } + + if (node == NULL) { + node = tree->right ? tree->right : tree->left; + end_node = node; + } + + if (end_node) { + end_node->left = + (tree->left != end_node) ? tree->left : end_node->left; + end_node->right = (tree->right != end_node) ? tree->right : + end_node->right; + end_node->height = MAX(VMEM_HEIGHT(end_node->left), + VMEM_HEIGHT(end_node->right)) + + 1; + } + + tree = end_node; + + return tree; +} + +static avl_node_t *avltree_remove(avl_node_t *tree, avl_node_t **found_node, + jmem_key_t key) +{ + *found_node = NULL; + if (tree == NULL) { + pr_info("failed to find key %lu\n", (unsigned long)key); + return NULL; + } + + if (key == tree->key) { + *found_node = tree; + tree = do_unlink(tree); + } else if (key > tree->key) { + tree->right = avltree_remove(tree->right, found_node, key); + } else { + tree->left = avltree_remove(tree->left, found_node, key); + } + + if (tree) + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + + 1; + + tree = do_balance(tree); + + return tree; +} + +void jpu_avltree_free(avl_node_t *tree) +{ + if (tree == NULL) + return; + if (tree->left == NULL && tree->right == NULL) { + VMEM_P_FREE(tree); + return; + } + + jpu_avltree_free(tree->left); + tree->left = NULL; + jpu_avltree_free(tree->right); + tree->right = NULL; + VMEM_P_FREE(tree); +} + +static avl_node_t *remove_approx_value(avl_node_t *tree, avl_node_t **found, + jmem_key_t key) +{ + *found = NULL; + if (tree == NULL) { + return NULL; + } + + if (key == tree->key) { + *found = tree; + tree = do_unlink(tree); + } else if (key > tree->key) { + tree->right = remove_approx_value(tree->right, found, key); + } else { + tree->left = remove_approx_value(tree->left, found, key); + if (*found == NULL) { + *found = tree; + tree = do_unlink(tree); + } + } + if (tree) + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + + 1; + tree = do_balance(tree); + + return tree; +} + +static void set_blocks_free(jpu_mm_t *mm, int pageno, int npages) +{ + int last_pageno = pageno + npages - 1; + int i; + page_t *page; + page_t *last_page; + + VMEM_ASSERT(npages); + + if (last_pageno >= mm->num_pages) { + pr_info("set_blocks_free: invalid last page number: %d\n", + last_pageno); + VMEM_ASSERT(0); + return; + } + + for (i = pageno; i <= last_pageno; i++) { + mm->page_list[i].used = 0; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].first_pageno = -1; + } + + page = &mm->page_list[pageno]; + page->alloc_pages = npages; + last_page = &mm->page_list[last_pageno]; + last_page->first_pageno = pageno; + + mm->free_tree = + avltree_insert(mm->free_tree, MAKE_KEY(npages, pageno), page); +} + +static void set_blocks_alloc(jpu_mm_t *mm, int pageno, int npages) +{ + int last_pageno = pageno + npages - 1; + int i; + page_t *page; + page_t *last_page; + + if (last_pageno >= mm->num_pages) { + pr_info("set_blocks_free: invalid last page number: %d\n", + last_pageno); + VMEM_ASSERT(0); + return; + } + + for (i = pageno; i <= last_pageno; i++) { + mm->page_list[i].used = 1; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].first_pageno = -1; + } + + page = &mm->page_list[pageno]; + page->alloc_pages = npages; + + last_page = &mm->page_list[last_pageno]; + last_page->first_pageno = pageno; + + mm->alloc_tree = + avltree_insert(mm->alloc_tree, MAKE_KEY(page->addr, 0), page); +} + +int jmem_init(jpu_mm_t *mm, unsigned long addr, unsigned long size) +{ + int i; + + mm->base_addr = (addr + (JMEM_PAGE_SIZE - 1)) & ~(JMEM_PAGE_SIZE - 1); + mm->mem_size = size & ~JMEM_PAGE_SIZE; + mm->num_pages = mm->mem_size / JMEM_PAGE_SIZE; + mm->free_tree = NULL; + mm->alloc_tree = NULL; + mm->free_page_count = mm->num_pages; + mm->alloc_page_count = 0; + mm->page_list = (page_t *)VMEM_P_ALLOC(mm->num_pages * sizeof(page_t)); + if (mm->page_list == NULL) { + pr_err("%s:%d failed to vmalloc(%d)\n", __func__, __LINE__, + (int)(mm->num_pages * sizeof(page_t))); + return -1; + } + + CVI_DBG_MEM("mem_size = 0x%x, num_pages = %d\n", mm->mem_size, + mm->num_pages); + + for (i = 0; i < mm->num_pages; i++) { + mm->page_list[i].pageno = i; + mm->page_list[i].addr = mm->base_addr + i * JMEM_PAGE_SIZE; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].used = 0; + mm->page_list[i].first_pageno = -1; + } + + set_blocks_free(mm, 0, mm->num_pages); + + return 0; +} + +int jmem_exit(jpu_mm_t *mm) +{ + if (mm == NULL) { + pr_info("vmem_exit: invalid handle\n"); + return -1; + } + + if (mm->free_tree) { + jpu_avltree_free(mm->free_tree); + } + if (mm->alloc_tree) { + jpu_avltree_free(mm->alloc_tree); + } + + if (mm->page_list) { + VMEM_P_FREE(mm->page_list); + mm->page_list = NULL; + } + + mm->base_addr = 0; + mm->mem_size = 0; + mm->num_pages = 0; + mm->page_list = NULL; + mm->free_tree = NULL; + mm->alloc_tree = NULL; + mm->free_page_count = 0; + mm->alloc_page_count = 0; + return 0; +} + +unsigned long jmem_alloc(jpu_mm_t *mm, int size) +{ + avl_node_t *node; + page_t *free_page; + int npages, free_size; + int alloc_pageno; + unsigned long ptr; + + if (mm == NULL) { + pr_info("jmem_alloc: invalid handle\n"); + return -1; + } + + if (size <= 0) + return -1; + + npages = (size + JMEM_PAGE_SIZE - 1) / JMEM_PAGE_SIZE; + + mm->free_tree = + remove_approx_value(mm->free_tree, &node, MAKE_KEY(npages, 0)); + if (node == NULL) { + return -1; + } + free_page = node->page; + free_size = KEY_TO_VALUE(node->key); + + alloc_pageno = free_page->pageno; + set_blocks_alloc(mm, alloc_pageno, npages); + if (npages != free_size) { + int free_pageno = alloc_pageno + npages; + + set_blocks_free(mm, free_pageno, (free_size - npages)); + } + + VMEM_P_FREE(node); + + ptr = mm->page_list[alloc_pageno].addr; + mm->alloc_page_count += npages; + mm->free_page_count -= npages; + + CVI_DBG_MEM("npages = %d, free_page_count = %d\n", npages, + mm->free_page_count); + + return ptr; +} + +int jmem_free(jpu_mm_t *mm, unsigned long ptr, unsigned long pid) +{ + unsigned long addr; + avl_node_t *found; + page_t *page; + int pageno, prev_free_pageno, next_free_pageno; + int prev_size, next_size; + int merge_page_no, merge_page_size, free_page_size; + + if (mm == NULL) { + pr_info("vmem_free: invalid handle\n"); + return -1; + } + + addr = ptr; + + mm->alloc_tree = + avltree_remove(mm->alloc_tree, &found, MAKE_KEY(addr, 0)); + if (found == NULL) { + pr_info("vmem_free: 0x%lx not found\n", addr); + VMEM_ASSERT(0); + return -1; + } + + /* find previous free block */ + page = found->page; + pageno = page->pageno; + free_page_size = page->alloc_pages; + prev_free_pageno = pageno - 1; + prev_size = -1; + if (prev_free_pageno >= 0) { + if (mm->page_list[prev_free_pageno].used == 0) { + prev_free_pageno = + mm->page_list[prev_free_pageno].first_pageno; + prev_size = mm->page_list[prev_free_pageno].alloc_pages; + } + } + + /* find next free block */ + next_free_pageno = pageno + page->alloc_pages; + next_free_pageno = + (next_free_pageno == mm->num_pages) ? -1 : next_free_pageno; + next_size = -1; + if (next_free_pageno >= 0) { + if (mm->page_list[next_free_pageno].used == 0) { + next_size = mm->page_list[next_free_pageno].alloc_pages; + } + } + VMEM_P_FREE(found); + + /* merge */ + merge_page_no = page->pageno; + merge_page_size = page->alloc_pages; + if (prev_size >= 0) { + mm->free_tree = + avltree_remove(mm->free_tree, &found, + MAKE_KEY(prev_size, prev_free_pageno)); + if (found == NULL) { + VMEM_ASSERT(0); + return -1; + } + merge_page_no = found->page->pageno; + merge_page_size += found->page->alloc_pages; + VMEM_P_FREE(found); + } + if (next_size >= 0) { + mm->free_tree = + avltree_remove(mm->free_tree, &found, + MAKE_KEY(next_size, next_free_pageno)); + if (found == NULL) { + VMEM_ASSERT(0); + return -1; + } + merge_page_size += found->page->alloc_pages; + VMEM_P_FREE(found); + } + + page->alloc_pages = 0; + page->first_pageno = -1; + + set_blocks_free(mm, merge_page_no, merge_page_size); + + mm->alloc_page_count -= free_page_size; + mm->free_page_count += free_page_size; + + return 0; +} +#endif +#endif /* __JPU_JPU_MM_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/linux/driver/jpu.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/linux/driver/jpu.h new file mode 100644 index 0000000000..77cbc03a2d --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/linux/driver/jpu.h @@ -0,0 +1,40 @@ + + +#ifndef __JPU_DRV_H__ +#define __JPU_DRV_H__ + +#include +#include + +#define USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + +#define JDI_IOCTL_MAGIC 'J' + +#define JDI_IOCTL_ALLOCATE_PHYSICAL_MEMORY _IO(JDI_IOCTL_MAGIC, 0) +#define JDI_IOCTL_FREE_PHYSICAL_MEMORY _IO(JDI_IOCTL_MAGIC, 1) +#define JDI_IOCTL_WAIT_INTERRUPT _IO(JDI_IOCTL_MAGIC, 2) +#define JDI_IOCTL_SET_CLOCK_GATE _IO(JDI_IOCTL_MAGIC, 3) +#define JDI_IOCTL_RESET _IO(JDI_IOCTL_MAGIC, 4) +#define JDI_IOCTL_GET_INSTANCE_POOL _IO(JDI_IOCTL_MAGIC, 5) +#define JDI_IOCTL_GET_RESERVED_VIDEO_MEMORY_INFO _IO(JDI_IOCTL_MAGIC, 6) +#define JDI_IOCTL_OPEN_INSTANCE _IO(JDI_IOCTL_MAGIC, 7) +#define JDI_IOCTL_CLOSE_INSTANCE _IO(JDI_IOCTL_MAGIC, 8) +#define JDI_IOCTL_GET_INSTANCE_NUM _IO(JDI_IOCTL_MAGIC, 9) +#define JDI_IOCTL_GET_REGISTER_INFO _IO(JDI_IOCTL_MAGIC, 10) +#define JDI_IOCTL_GET_CONTROL_REG _IO(JDI_IOCTL_MAGIC, 11) +#define JDI_IOCTL_SET_JENC_PROC_INFO _IO(JDI_IOCTL_MAGIC, 12) +#define JDI_IOCTL_SET_JDEC_PROC_INFO _IO(JDI_IOCTL_MAGIC, 13) +#define JDI_IOCTL_GET_JENC_DEBUG_CONFIG _IO(JDI_IOCTL_MAGIC, 14) +#define JDI_IOCTL_GET_JDEC_DEBUG_CONFIG _IO(JDI_IOCTL_MAGIC, 15) + +typedef struct jpudrv_buffer_t { + __u32 size; + __u64 phys_addr; + __u64 base; /* kernel logical address in use kernel */ + __u8 *virt_addr; /* virtual user space address */ +#ifdef __arm__ + __u32 padding; /* padding for keeping same size of this structure */ +#endif +} jpudrv_buffer_t; + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/linux/jdi.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/linux/jdi.c new file mode 100644 index 0000000000..8ba4a06f7f --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/linux/jdi.c @@ -0,0 +1,1999 @@ +#if defined(linux) || defined(__linux) || defined(ANDROID) +#ifdef __arm__ +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE +#undef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 +#endif +#define MMAP mmap64 +#else +#define MMAP mmap +#endif + +#include +#include +#include + +#include "../../include/jpulog.h" +#include "../../jpuapi/jpuapifunc.h" +#include "../jdi.h" +#include "driver/jpu.h" + +#ifdef CLI_DEBUG_SUPPORT +#include "tcli.h" +#endif + +#ifdef TRY_SEM_MUTEX +#include +typedef sem_t MUTEX_HANDLE; +#define JPU_SEM_NAME "/jpu_sem_core" +#define OPEN_FLAG O_CREAT +#define OPEN_MODE 0666 +#define INIT_V 1 +#else +typedef struct mutex MUTEX_HANDLE; +extern int jpu_wait_interrupt(int timeout); +extern int jpu_set_clock_gate(int *pEnable); +extern int jpu_get_instance_pool(jpudrv_buffer_t *p_jdb); +extern int jpu_open_instance(unsigned long *pInstIdx); +extern int jpu_close_instance(unsigned long *pInstIdx); +extern int jpu_get_instance_num(int *pInstNum); +extern int jpu_get_register_info(jpudrv_buffer_t *p_jdb_register); +extern int jpu_reset(int InstIdx); +#endif +#ifdef JPU_FPGA_PLATFORM +#define HPI_BUS_LEN 8 +#define HPI_BUS_LEN_ALIGN 7 + +/*------------------------------------------------------------------------ +HPI register definitions +------------------------------------------------------------------------*/ +#define HPI_CHECK_STATUS 1 +#define HPI_WAIT_TIME 0x100000 +#define HPI_BASE 0x20030000 +#define HPI_ADDR_CMD (0x00 << 2) +#define HPI_ADDR_STATUS (0x01 << 2) +#define HPI_ADDR_ADDR_H (0x02 << 2) +#define HPI_ADDR_ADDR_L (0x03 << 2) +#define HPI_ADDR_ADDR_M (0x06 << 2) +#define HPI_ADDR_DATA (0x80 << 2) + +#define HPI_CMD_WRITE_VALUE ((8 << 4) + 2) +#define HPI_CMD_READ_VALUE ((8 << 4) + 1) + +#define HPI_MAX_PKSIZE 256 + +// clock generator in FPGA + +#define DEVICE0_ADDR_COMMAND 0x75 +#define DEVICE0_ADDR_PARAM0 0x76 +#define DEVICE0_ADDR_PARAM1 0x77 +#define DEVICE1_ADDR_COMMAND 0x78 +#define DEVICE1_ADDR_PARAM0 0x79 +#define DEVICE1_ADDR_PARAM1 0x7a +#define DEVICE_ADDR_SW_RESET 0x7b + +#define ACLK_MAX 30 +#define ACLK_MIN 16 +#define CCLK_MAX 30 +#define CCLK_MIN 16 + +static void *hpi_init(unsigned long core_idx, unsigned long dram_base); +static void hpi_release(unsigned long core_idx); +static void hpi_write_register(unsigned long core_idx, void *base, + unsigned int addr, unsigned int data, + pthread_mutex_t io_mutex); +static unsigned int hpi_read_register(unsigned long core_idx, void *base, + unsigned int addr, + pthread_mutex_t io_mutex); +static int hpi_write_memory(unsigned long core_idx, void *base, + unsigned int addr, unsigned char *data, int len, + int endian, pthread_mutex_t io_mutex); +static int hpi_read_memory(unsigned long core_idx, void *base, + unsigned int addr, unsigned char *data, int len, + int endian, pthread_mutex_t io_mutex); +static int hpi_hw_reset(void *base); + +static unsigned int pci_read_reg(unsigned int addr); +static void pci_write_reg(unsigned int addr, unsigned int data); +static void pci_write_memory(unsigned int addr, unsigned char *buf, int size); +static void pci_read_memory(unsigned int addr, unsigned char *buf, int size); + +static int hpi_set_timing_opt(unsigned long core_idx, void *base, + pthread_mutex_t io_mutex); +static int ics307m_set_clock_freg(void *base, int Device, int OutFreqMHz, + int InFreqMHz); + +static int jpu_swap_endian(unsigned char *data, int len, int endian); + +#endif // JPU_FPGA_PLATFORM + +#define JPU_BIT_REG_SIZE 0x300 +#define JPU_BIT_REG_BASE (0x50470000) +#define JDI_DRAM_PHYSICAL_BASE 0x1F8000000 +#define JDI_DRAM_PHYSICAL_SIZE (128 * 1024 * 1024) + +#ifdef JPU_FPGA_PLATFORM +// #define SUPPORT_ALLOCATE_MEMORY_FROM_DRIVER +#define SUPPORT_INTERRUPT +#define JDI_SYSTEM_ENDIAN JDI_BIG_ENDIAN +#else +#define SUPPORT_ALLOCATE_MEMORY_FROM_DRIVER +#define SUPPORT_INTERRUPT +#define JDI_SYSTEM_ENDIAN JDI_LITTLE_ENDIAN +#endif + +#define JPU_DEVICE_NAME "/dev/jpu" +#define TRY_OPEN_SEM_TIMEOUT 3 + +typedef struct jpu_buffer_pool_t { + jpudrv_buffer_t jdb; + int inuse; + int is_jpe; +} jpu_buffer_pool_t; + +typedef struct { + int jpu_fd; + jpu_instance_pool_t *pjip; + int jip_size; + int task_num; + int bSingleEsBuf; + int single_es_buf_size; + int clock_state; +#ifndef SUPPORT_ALLOCATE_MEMORY_FROM_DRIVER + jpudrv_buffer_t jdb_video_memory; +#endif + jpudrv_buffer_t jdb_register; + jpu_buffer_pool_t jpu_buffer_pool[MAX_JPU_BUFFER_POOL]; + int jpu_buffer_pool_count; +#ifdef TRY_SEM_MUTEX + void *jpu_mutex; +#endif + +#ifdef JPU_FPGA_PLATFORM + MUTEX_HANDLE io_mutex; +#endif + jpu_buffer_t vbStream; + int enc_task_num; +} jdi_info_t; + +static jdi_info_t s_jdi_info[MAX_NUM_JPU_CORE] = { 0 }; + +static int jpu_swap_endian(unsigned char *data, int len, int endian); + +int jdi_probe(void) +{ + int ret; + ret = jdi_init(); +#ifndef JPU_FPGA_PLATFORM + jdi_release(); +#endif + return ret; +} + +int jdi_get_task_num(void) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + return jdi->task_num; +} + +int jdi_use_single_es_buffer(void) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + return jdi->bSingleEsBuf; +} + +int jdi_set_enc_task(int bSingleEsBuf, int *singleEsBufSize) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + + if (jdi->enc_task_num == 0) { + jdi->bSingleEsBuf = bSingleEsBuf; + jdi->single_es_buf_size = *singleEsBufSize; + } else { + if (jdi->bSingleEsBuf != bSingleEsBuf) { + JLOG(ERR, + "[JDI]all instance use single es buffer flag must be the same\n"); + return -1; + } + } + + if (jdi->bSingleEsBuf) { + if (jdi->single_es_buf_size != *singleEsBufSize) { + JLOG(WARN, "different single es buf size %d ignored\n", + *singleEsBufSize); + JLOG(WARN, "current single es buf size %d\n", + jdi->single_es_buf_size); + *singleEsBufSize = jdi->single_es_buf_size; + } + } + + jdi->enc_task_num++; + + return 0; +} + +int jdi_delete_enc_task(void) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + + if (jdi->enc_task_num == 0) { + JLOG(ERR, "[JDI]jdi_delete_enc_task == 0\n"); + return -1; + } + jdi->enc_task_num--; + return 0; +} + +int jdi_get_enc_task_num(void) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + + return jdi->enc_task_num; +} + +int jdi_init(void) +{ + jdi_info_t *jdi = &s_jdi_info[0]; +#ifdef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + unsigned long page_size = VMEM_PAGE_SIZE; + unsigned long page_mask = (~(page_size - 1)); +#endif + PhysicalAddress pgoff; + int ret; + + if (jdi->jpu_fd != -1 && jdi->jpu_fd != 0x00) { + jdi->task_num++; + return 0; + } + memset(jdi, 0, sizeof(jdi_info_t)); + +#ifdef ANDROID + system("/system/lib/modules/load_android.sh"); + printf("s_jpu_fd\n"); +#endif + jdi->jpu_fd = 'j'; // TODO: refine this! + + memset((void *)&jdi->jpu_buffer_pool, 0x00, + sizeof(jpu_buffer_pool_t) * MAX_JPU_BUFFER_POOL); + jdi->jpu_buffer_pool_count = 0; + + // printf("jdi_get_instance_pool\n"); + jdi->pjip = jdi_get_instance_pool(); + if (!(jdi->pjip)) { + JLOG(ERR, + "[JDI] fail to create instance pool for saving context\n"); + goto ERR_JDI_INIT; + } + +#ifdef TRY_SEM_MUTEX + // it's not error if semaphore existing + jdi->jpu_mutex = sem_open(JPU_SEM_NAME, OPEN_FLAG, OPEN_MODE, INIT_V); + if (jdi->jpu_mutex == SEM_FAILED) { + JLOG(ERR, "sem_open failed...\n"); + return -1; + } +#endif + + if (!jdi->pjip->instance_pool_inited) { +#if 0 + pthread_mutexattr_t mutexattr; + + pthread_mutexattr_init(&mutexattr); + pthread_mutexattr_setpshared(&mutexattr, + PTHREAD_PROCESS_SHARED); + + pthread_mutex_init((pthread_mutex_t *)jdi->pjip->jpu_mutex, + &mutexattr); + pthread_mutexattr_destroy(&mutexattr); +#elif defined(LIBCVIJPULITE) + jdi->pjip->jpu_mutex = 0; +#endif + } + +#if defined(LIBCVIJPULITE) + ret = jdi_lock(100); +#else + mutex_init(&jdi->pjip->jpu_mutex); + + ret = jdi_lock(); +#endif + if (ret < 0) { + JLOG(ERR, "[JDI] fail to pthread_mutex_t lock function\n"); + goto ERR_JDI_INIT; + } + // printf("JDI_IOCTL_GET_RESERVED_VIDEO_MEMORY_INFO\n"); + +#ifndef SUPPORT_ALLOCATE_MEMORY_FROM_DRIVER + if (ioctl(jdi->jpu_fd, JDI_IOCTL_GET_RESERVED_VIDEO_MEMORY_INFO, + &jdi->jdb_video_memory) < 0) { + JLOG(ERR, "[JDI] fail to get video memory information\n"); + goto ERR_JDI_INIT; + return -1; + } + printf("jdi->jdb_video_memory: phy: %p, size:%d\n", + jdi->jdb_video_memory.phys_addr, jdi->jdb_video_memory.size); +#ifdef JPU_FPGA_PLATFORM + jdi->jdb_video_memory.phys_addr = JDI_DRAM_PHYSICAL_BASE; + jdi->jdb_video_memory.size = JDI_DRAM_PHYSICAL_SIZE; +#endif + + if (!jdi->pjip->instance_pool_inited) + memset(&jdi->pjip->vmem, 0x00, sizeof(jpeg_mm_t)); + + if (jmem_init(&jdi->pjip->vmem, + (unsigned long)jdi->jdb_video_memory.phys_addr, + jdi->jdb_video_memory.size) < 0) { + JLOG(ERR, "[JDI] fail to init jpu memory management logic\n"); + goto ERR_JDI_INIT; + } +#endif + +#ifdef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + if (jpu_get_register_info(&jdi->jdb_register) < 0) { + JLOG(ERR, "[JDI] fail to get host interface register\n"); + goto ERR_JDI_INIT; + } + + pgoff = jdi->jdb_register.phys_addr & page_mask; +#else + jdi->jdb_register.size = JPU_BIT_REG_SIZE; + pgoff = 0; +#endif + +#ifdef JPU_FPGA_PLATFORM + pthread_mutex_init(&jdi->io_mutex, NULL); + hpi_init(0, JDI_DRAM_PHYSICAL_BASE); +#endif + + jdi->task_num++; + jdi_unlock(); + + jdi_set_clock_gate(1); + + // JLOG(INFO, "[JDI] success to init driver\n"); + return jdi->jpu_fd; + +ERR_JDI_INIT: + jdi_unlock(); + jdi_release(); + return -1; +} + +int jdi_release(void) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + int ret; + int i; + BOOL bCloseIonFd = TRUE; + + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) + return 0; + +#if defined(LIBCVIJPULITE) + ret = jdi_lock(100); +#else + ret = jdi_lock(); +#endif + if (ret < 0) { + CVI_JPG_DBG_ERR( + "[JDI] fail to pthread_mutex_t lock function\n"); + return -1; + } + + jdi->task_num--; + // means that the opened instance remains + if (jdi->task_num > 0) { + CVI_JPG_DBG_INFO("s_task_num =%d\n", jdi->task_num); + jdi_unlock(); + return 0; + } + + jdi_set_clock_gate(0); + + memset(&jdi->jdb_register, 0x00, sizeof(jpudrv_buffer_t)); + + jdi_unlock(); + + jdi->pjip = 0x00; + + jdi->jpu_fd = -1; + +#ifdef TRY_SEM_MUTEX + if (sem_close((MUTEX_HANDLE *)jdi->jpu_mutex) < 0) { + JLOG(ERR, "[JDI] sem_close thread id = %lu\n", pthread_self()); + } +#endif + +#ifdef JPU_FPGA_PLATFORM + pthread_mutex_destroy(&jdi->io_mutex); + hpi_release(0); +#endif + + memset(jdi, 0, sizeof(jdi_info_t)); + + for (i = 0; i < MAX_NUM_JPU_CORE; i++) { + jdi = &s_jdi_info[i]; + if (jdi->jpu_fd > 0) { + bCloseIonFd = FALSE; + break; + } + } + return 0; +} + +jpu_instance_pool_t *jdi_get_instance_pool() +{ + jpudrv_buffer_t jdb = { 0 }; + jdi_info_t *jdi = &s_jdi_info[0]; + + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) + return NULL; + + if (sizeof(JpgInst) > MAX_INST_HANDLE_SIZE) { + CVI_JPG_DBG_ERR("JpgInst = %d, MAX_INST_HANDLE_SIZE = %d\n", + (int)sizeof(JpgInst), MAX_INST_HANDLE_SIZE); + } + + if (jdi->pjip) + return (jpu_instance_pool_t *)jdi->pjip; + + jdi->jip_size = sizeof(jpu_instance_pool_t); +#if 0 + jdi->jip_size += sizeof(MUTEX_HANDLE); +#endif + + jdb.size = jdi->jip_size; + + CVI_JPG_DBG_MEM("JDI_IOCTL_GET_INSTANCE_POOL, jdb.size = 0x%x\n", + jdb.size); + + if (jpu_get_instance_pool(&jdb) < 0) { + JLOG(ERR, "[JDI] fail to get instance pool. size=%d\n", + jdb.size); + return NULL; + } + + do { + jdb.virt_addr = + (__u8 *)(uintptr_t)(jdb.phys_addr); // instance pool was allocated by vmalloc + jdi->pjip = (jpu_instance_pool_t *)jdb.virt_addr; + } while (0); + +#if 0 + //change the pointer of jpu_mutex to at end pointer of jpu_instance_pool_t to assign at allocated position. + jdi->pjip->jpu_mutex = (void *)((unsigned long)jdi->pjip + + sizeof(jpu_instance_pool_t)); +#endif + + return (jpu_instance_pool_t *)jdi->pjip; +} + +int jdi_open_instance(unsigned long instIdx) +{ + int inst_num; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) + return -1; + + if (jpu_open_instance(&instIdx) < 0) { + JLOG(ERR, + "[JDI] fail to deliver open instance num instIdx=%d\n", + (int)instIdx); + return -1; + } + + if (jpu_get_instance_num(&inst_num) < 0) { + JLOG(ERR, + "[JDI] fail to deliver open instance num instIdx=%d\n", + (int)instIdx); + return -1; + } + + jdi->pjip->jpu_instance_num = inst_num; + + return 0; +} + +int jdi_close_instance(unsigned long instIdx) +{ + int inst_num; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) + return -1; + + if (jpu_close_instance(&instIdx) < 0) { + JLOG(ERR, + "[JDI] fail to deliver open instance num instIdx=%d\n", + (int)instIdx); + return -1; + } + + if (jpu_get_instance_num(&inst_num) < 0) { + JLOG(ERR, + "[JDI] fail to deliver open instance num instIdx=%d\n", + (int)instIdx); + return -1; + } + + jdi->pjip->jpu_instance_num = inst_num; + + return 0; +} + +int jdi_get_instance_num(void) +{ + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) + return -1; + + return jdi->pjip->jpu_instance_num; +} + +int jdi_hw_reset(void) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) { + return 0; + } + +#ifdef JPU_FPGA_PLATFORM + hpi_hw_reset((void *)jdi->jdb_register.virt_addr); + return 1; +#else + return jpu_reset(0); +#endif +} + +#ifdef CLI_DEBUG_SUPPORT +void cli_show_jdi_info(void) +{ + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + + tcli_print("----------jdi info--------------\n"); + tcli_print("jdi_jpu_fd:%d\n", jdi->jpu_fd); + tcli_print("memory jdi_jip_size:%d\n", jdi->jip_size); + tcli_print("jdi_task_num:%d\n", jdi->task_num); + tcli_print("jdi_bSingleEsBuf:%d\n", jdi->bSingleEsBuf); + tcli_print("jdi_single_es_buf_size:%d\n", jdi->single_es_buf_size); + tcli_print("jdi_clock_state:%d\n", jdi->clock_state); + tcli_print("jdi_enc_task_num:%d\n", jdi->enc_task_num); + tcli_print("ion jdi_vbStream.size:%d\n", jdi->vbStream.size); + tcli_print("jdi_jdb_register.size:%d\n", jdi->jdb_register.size); +#ifndef SUPPORT_ALLOCATE_MEMORY_FROM_DRIVER + tcli_print("jdi_jdb_video_memory.size:%d\n", + jdi->jdb_video_memory.size); +#endif + tcli_print("jdi_jpu_buffer_pool_count:%d\n", + jdi->jpu_buffer_pool_count); + + for (int i = 0; i < jdi->jpu_buffer_pool_count; i++) { + jpu_buffer_pool_t *p = &jdi->jpu_buffer_pool[i]; + + if (p && p->inuse) { + tcli_print(" jdi_jpu_buffer_pool[%d].jdb_size:%d\n", i, + p->jdb.size); + tcli_print(" jdi_jpu_buffer_pool[%d].is_jpe:%d\n", i, + p->is_jpe); + } + } +} +#endif + +#if defined(LIBCVIJPULITE) +int jdi_lock(int sleep_us) +#else +int jdi_lock(void) +#endif +{ +#if 0 + jdi_info_t *jdi = &s_jdi_info[0]; + + const int MUTEX_TIMEOUT = 0x7fffffff; // ms + + while (1) { + int _ret; + int i; + + for (i = 0; + (_ret = pthread_mutex_trylock( + (pthread_mutex_t *)jdi->pjip->jpu_mutex)) != 0 && + i < MUTEX_TIMEOUT; + i++) { + if (i == 0) + JLOG(ERR, + "jdi_lock: mutex is already locked - try again : ret = %d, pthread id =%lu\n", + _ret, pthread_self()); +#ifdef _KERNEL_ + udelay(1 * 1000); +#else + usleep(1 * 1000); +#endif // _KERNEL_ + JLOG(ERR, + "jdi_lock: mutex tiemout for %dms, i=%d,num=%d,jdi->pjip=%p, jpu_mutex=%p, pthread id =%lu\n", + JPU_INTERRUPT_TIMEOUT_MS, i, + jdi->pjip->jpu_instance_num, jdi->pjip, + jdi->pjip->jpu_mutex, pthread_self()); + if (i > JPU_INTERRUPT_TIMEOUT_MS * + (jdi->pjip->jpu_instance_num)) { + JLOG(ERR, + "jdi_lock: mutex tiemout for %dms, i=%d, jpu_instance_num=%d\n", + JPU_INTERRUPT_TIMEOUT_MS, i, + jdi->pjip->jpu_instance_num); + break; + } + } + + if (_ret == 0) + break; + + JLOG(ERR, + "jdi_lock: can't get lock - force to unlock. [%d:%s], pthread id =%lu\n", + _ret, strerror(_ret), pthread_self()); + jdi_unlock(); + jdi->pjip->pendingInst = NULL; + } + JLOG(INFO, "jdi->pjip=%p, jpu_mutex=%p. id=%lu\n", jdi->pjip, + jdi->pjip->jpu_mutex, pthread_self()); + +#elif defined(LIBCVIJPULITE) + + jdi_info_t *jdi = &s_jdi_info[0]; + struct timespec req = { 0, sleep_us * 1000 }; + + while (!__sync_bool_compare_and_swap(&(jdi->pjip->jpu_mutex), 0, 1)) { + int ret = nanosleep(&req, NULL); + /* interrupted by a signal handler */ + if (ret < 0) { + jdi->pjip->jpu_mutex = 0; + return -1; + } + } +#endif + + return 0; +} + +void jdi_unlock(void) +{ +#if 0 + jdi_info_t *jdi = &s_jdi_info[0]; + JLOG(INFO, "id=%lu\n", pthread_self()); + pthread_mutex_unlock((pthread_mutex_t *)jdi->pjip->jpu_mutex); +#elif defined(LIBCVIJPULITE) + jdi_info_t *jdi = &s_jdi_info[0]; + jdi->pjip->jpu_mutex = 0; +#endif +} + +void jdi_write_register(unsigned int addr, unsigned int data) +{ + unsigned int *reg_addr; + jdi_info_t *jdi; + jdi = &s_jdi_info[0]; + + if (!jdi->pjip || jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) + return; +#ifdef JPU_FPGA_PLATFORM + hpi_write_register(0, (void *)jdi->jdb_register.virt_addr, + JPU_BIT_REG_BASE + addr, data, jdi->io_mutex); +#else + reg_addr = (unsigned int *)(addr + jdi->jdb_register.virt_addr); + + writel(data, reg_addr); +#endif +} + +unsigned int jdi_read_register(unsigned int addr) +{ + unsigned int *reg_addr; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; +#ifdef JPU_FPGA_PLATFORM + return hpi_read_register(0, (void *)jdi->jdb_register.virt_addr, + JPU_BIT_REG_BASE + addr, jdi->io_mutex); +#else + reg_addr = (unsigned int *)(addr + jdi->jdb_register.virt_addr); + + return readl(reg_addr); +#endif +} + +// It could be removed in the future +void *jdi_osal_memcpy(void *dst, const void *src, int count) +{ + // return memcpy(dst, src, count); + int i; + unsigned char *dst_c = (unsigned char *)dst; + unsigned char *src_c = (unsigned char *)src; + unsigned char tmp; + for (i = 0; i < count; i++) { + tmp = *src_c; + *dst_c = tmp; + src_c++; + dst_c++; + } + + return dst; +} + +int jdi_write_memory(unsigned long addr, unsigned char *data, int len, + int endian) +{ + jpudrv_buffer_t jdb; + unsigned long offset; + int i; + + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (!jdi->pjip || jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) + return -1; + + memset(&jdb, 0x00, sizeof(jpudrv_buffer_t)); + + for (i = 0; i < MAX_JPU_BUFFER_POOL; i++) { + if (jdi->jpu_buffer_pool[i].inuse == 1) { + jdb = jdi->jpu_buffer_pool[i].jdb; + if (addr >= jdb.phys_addr && + addr < (jdb.phys_addr + jdb.size)) + break; + } + } + + if (!jdb.size) { + JLOG(ERR, "address 0x%08x is not mapped address!!!\n", + (int)addr); + return -1; + } + + offset = addr - (unsigned long)jdb.phys_addr; + +#ifdef JPU_FPGA_PLATFORM + hpi_write_memory(0, (void *)jdi->jdb_register.virt_addr, addr, data, + len, endian, jdi->io_mutex); + memcpy((BYTE *)jdb.virt_addr + offset, data, len); +#else + jpu_swap_endian(data, len, endian); + memcpy((void *)((unsigned long)jdb.virt_addr + offset), data, len); + // take place with jdi_osal_memcpy by mingyi.dong + // jdi_osal_memcpy((void *)(virtoffset), (void *)data, len); +#endif + + return len; +} + +int jdi_read_memory(unsigned long addr, unsigned char *data, int len, + int endian) +{ + jpudrv_buffer_t jdb; + unsigned long offset; + int i; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (!jdi->pjip || jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) + return -1; + + memset(&jdb, 0x00, sizeof(jpudrv_buffer_t)); + + for (i = 0; i < MAX_JPU_BUFFER_POOL; i++) { + if (jdi->jpu_buffer_pool[i].inuse == 1) { + jdb = jdi->jpu_buffer_pool[i].jdb; + if (addr >= jdb.phys_addr && + addr < (jdb.phys_addr + jdb.size)) + break; + } + } + + if (!jdb.size) + return -1; + + offset = addr - (unsigned long)jdb.phys_addr; + +#ifdef JPU_FPGA_PLATFORM + hpi_read_memory(0, (void *)jdi->jdb_register.virt_addr, addr, data, len, + endian, jdi->io_mutex); +#else + memcpy(data, (const void *)((unsigned long)jdb.virt_addr + offset), + len); + jpu_swap_endian(data, len, endian); +#endif + + return len; +} + +int jdi_get_allocated_memory(jpu_buffer_t *vb, int is_jpe) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + jpudrv_buffer_t *jdb; + int i; + int isFind = 0; + + if (!jdi->pjip) { + JLOG(ERR, "Invalid handle! jdi->pjip is NULL!\n"); + return -1; + } + + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) { + JLOG(ERR, "Invalid handle! jdi->jpu_fd=%d\n", jdi->jpu_fd); + return -1; + } + + for (i = 0; i < MAX_JPU_BUFFER_POOL; i++) { + if (jdi->jpu_buffer_pool[i].inuse == 1 && + jdi->jpu_buffer_pool[i].is_jpe == is_jpe) { + jdb = &jdi->jpu_buffer_pool[i].jdb; + if (vb->size == jdb->size) { + vb->size = jdb->size; + vb->base = jdb->base; + vb->phys_addr = jdb->phys_addr; + vb->virt_addr = jdb->virt_addr; + isFind = 1; + break; + } + } + } + if (isFind) + return 0; + else + return -1; +} + +#ifndef CVI_JPG_USE_ION_MEM +int jdi_allocate_dma_memory(jpu_buffer_t *vb, int is_jpe) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + jpudrv_buffer_t jdb = { 0 }; + int i; + int ret = 0; + + if (!jdi->pjip) { + JLOG(ERR, "Invalid handle! jdi->pjip is NULL! id=%lu", + pthread_self()); + return -1; + } + + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) { + JLOG(ERR, "Invalid handle! jdi->jpu_fd=%d. id=%lu", jdi->jpu_fd, + pthread_self()); + return -1; + } + +#if defined(LIBCVIJPULITE) + jdi_lock(100); +#else + jdi_lock(); +#endif + + memset(&jdb, 0x00, sizeof(jpudrv_buffer_t)); + + jdb.size = vb->size; + + CVI_JPG_DBG_MEM("jdb.size = 0x%x\n", jdb.size); + +#ifdef SUPPORT_ALLOCATE_MEMORY_FROM_DRIVER + if (ioctl(jdi->jpu_fd, JDI_IOCTL_ALLOCATE_PHYSICAL_MEMORY, &jdb) < 0) { + JLOG(ERR, "fail to jdi_allocate_dma_memory. size=%d, id=%lu\n", + vb->size, pthread_self()); + ret = -1; + goto fail; + } +#else + jdb.phys_addr = (unsigned long)jmem_alloc(&jdi->pjip->vmem, jdb.size); + if (jdb.phys_addr == (unsigned long)-1) { + JLOG(ERR, "Not enough memory. size=%d, id=%lu\n", vb->size, + pthread_self()); + ret = -1; + goto fail; + } + + unsigned long offset = (unsigned long)(jdb.phys_addr - + jdi->jdb_video_memory.phys_addr); + jdb.base = jdi->jdb_video_memory.base + offset; +#endif + vb->phys_addr = jdb.phys_addr; + vb->base = jdb.base; + +#ifdef JPU_FPGA_PLATFORM + jdb.virt_addr = (unsigned long)malloc(jdb.size); +#else + /* Map physical address to virtual address in user space */ + PhysicalAddress page_size = sysconf(_SC_PAGE_SIZE); + PhysicalAddress page_mask = (~(page_size - 1)); + PhysicalAddress pgoff = jdb.phys_addr & page_mask; + + CVI_JPG_DBG_TRACE("mmap\n"); + + jdb.virt_addr = MMAP(NULL, jdb.size, PROT_READ | PROT_WRITE, MAP_SHARED, + jdi->jpu_fd, pgoff); + if ((void *)jdb.virt_addr == MAP_FAILED) { + JLOG(ERR, "fail to map jdb.phys_addr=0x%lx, size=%d. id=%lu\n", + jdb.phys_addr, (int)jdb.size, pthread_self()); + memset(vb, 0x00, sizeof(jpu_buffer_t)); + ret = -1; + goto fail; + } +#endif + vb->virt_addr = jdb.virt_addr; + + for (i = 0; i < MAX_JPU_BUFFER_POOL; i++) { + if (jdi->jpu_buffer_pool[i].inuse == 0) { + jdi->jpu_buffer_pool[i].jdb = jdb; + jdi->jpu_buffer_pool_count++; + jdi->jpu_buffer_pool[i].inuse = 1; + jdi->jpu_buffer_pool[i].is_jpe = is_jpe; + break; + } + } + + if (i >= MAX_JPU_BUFFER_POOL) { + JLOG(ERR, "fail to find an unused buffer in pool! id=%lu\n", + pthread_self()); + memset(vb, 0x00, sizeof(jpu_buffer_t)); + ret = -1; + goto fail; + } + +#if 0 + JLOG(INFO, "size=%d, addr=%p, i=%d, pool_count=%d. id=%lu", jdb.size, + jdb.phys_addr, i, jdi->jpu_buffer_pool_count, pthread_self()); +#endif + +fail: + jdi_unlock(); + + return ret; +} + +void jdi_free_dma_memory(jpu_buffer_t *vb) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + jpudrv_buffer_t jdb; + int i; + int ret; + + if (!jdi->pjip) { + JLOG(ERR, "Invalid handle! jdi->pjip is NULL! id=%lu", + pthread_self()); + return; + } + + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) { + JLOG(ERR, "Invalid handle! jdi->jpu_fd=%d. id=%lu", jdi->jpu_fd, + pthread_self()); + return; + } + + if (vb->size == 0) { + JLOG(ERR, "addr=%p, id=%lu\n", vb->phys_addr, pthread_self()); + return; + } + +#if defined(LIBCVIJPULITE) + jdi_lock(100); +#else + jdi_lock(); +#endif + + memset(&jdb, 0x00, sizeof(jpudrv_buffer_t)); + + for (i = 0; i < MAX_JPU_BUFFER_POOL; i++) { + if (jdi->jpu_buffer_pool[i].jdb.phys_addr == vb->phys_addr) { + jdi->jpu_buffer_pool[i].inuse = 0; + jdi->jpu_buffer_pool[i].is_jpe = 0; + jdi->jpu_buffer_pool_count--; + jdb = jdi->jpu_buffer_pool[i].jdb; + break; + } + } + + if (!jdb.size) { + JLOG(ERR, "Invalid buffer to free! address=0x%lx. id=%lu\n", + jdb.virt_addr, pthread_self()); + jdi_unlock(); + return; + } + +#ifdef SUPPORT_ALLOCATE_MEMORY_FROM_DRIVER +#if 0 + JLOG(INFO, "size=%d, addr=%p, i=%d, pool_count=%d. id=%lu", jdb.size, + jdb.phys_addr, i, jdi->jpu_buffer_pool_count, pthread_self()); +#endif + ret = ioctl(jdi->jpu_fd, JDI_IOCTL_FREE_PHYSICAL_MEMORY, &jdb); + if (ret < 0) { + JLOG(ERR, "ioctl: free physical memory. id=%lu\n", + pthread_self()); + } +#else + jmem_free(&jdi->pjip->vmem, jdb.phys_addr, 0); +#endif + +#ifdef JPU_FPGA_PLATFORM + free((void *)jdb.virt_addr); +#else + if (munmap((void *)jdb.virt_addr, jdb.size) != 0) { + JLOG(ERR, "fail to unmap virtual address(0x%lx)! id=%lu\n", + jdb.virt_addr, pthread_self()); + } +#endif + + memset(vb, 0, sizeof(jpu_buffer_t)); + + jdi_unlock(); +} + +#else //#ifndef CVI_JPG_USE_ION_MEM + +int jdi_allocate_ion_memory(jpu_buffer_t *vb, int is_jpe, int is_cached) +{ + int ret = 0; + int i = 0; + jdi_info_t *jdi = &s_jdi_info[0]; + jpudrv_buffer_t jdb = { 0 }; + + if (!jdi->pjip) { + JLOG(ERR, "Invalid handle! jdi->pjip is NULL!\n"); + return -1; + } + + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) { + JLOG(ERR, "Invalid handle! jdi->jpu_fd=%d\n", jdi->jpu_fd); + return -1; + } + +#if defined(LIBCVIJPULITE) + jdi_lock(100); +#else + jdi_lock(); +#endif + + memset(&jdb, 0x00, sizeof(jpudrv_buffer_t)); + + jdb.size = vb->size; + + if (sys_ion_alloc_nofd((uint64_t *)&vb->phys_addr, (void **)&vb->virt_addr, + (uint8_t *)"jpeg_ion", vb->size, is_cached) != 0) { + JLOG(ERR, "fail to allocate ion memory. size=%d\n", vb->size); + jdi_unlock(); + return ret; + } + jdb.phys_addr = vb->phys_addr; + jdb.virt_addr = vb->virt_addr; + + for (i = 0; i < MAX_JPU_BUFFER_POOL; i++) { + if (jdi->jpu_buffer_pool[i].inuse == 0) { + jdi->jpu_buffer_pool_count++; + memcpy(&jdi->jpu_buffer_pool[i].jdb, &jdb, + sizeof(jpudrv_buffer_t)); + jdi->jpu_buffer_pool[i].is_jpe = is_jpe; + jdi->jpu_buffer_pool[i].inuse = 1; + break; + } + } + if (i >= MAX_JPU_BUFFER_POOL) { + JLOG(ERR, "fail to find an unused buffer in pool!\n"); + memset(vb, 0x00, sizeof(jpu_buffer_t)); + ret = -1; + goto fail; + } + + JLOG(INFO, + "phys_addr %llx, virt_addr %p, size 0x%x, cached=%d\n", + vb->phys_addr, vb->virt_addr, vb->size, is_cached); +fail: + jdi_unlock(); + return ret; +} + +int jdi_free_ion_memory(jpu_buffer_t *vb) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + jpudrv_buffer_t *p_jdb = NULL; + int ret = 0; + int i = 0; + + if (!jdi->pjip) { + JLOG(ERR, "Invalid handle! jdi->pjip is NULL!\n"); + return -1; + } + + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) { + JLOG(ERR, "Invalid handle! jdi->jpu_fd=%d\n", jdi->jpu_fd); + return -1; + } + + if (vb->size == 0) { + JLOG(ERR, "addr=%p\n", vb->phys_addr); + return -1; + } + +#if defined(LIBCVIJPULITE) + jdi_lock(100); +#else + jdi_lock(); +#endif + + for (i = 0; i < MAX_JPU_BUFFER_POOL; i++) { + if (jdi->jpu_buffer_pool[i].jdb.phys_addr == vb->phys_addr) { + jdi->jpu_buffer_pool[i].inuse = 0; + jdi->jpu_buffer_pool[i].is_jpe = 0; + jdi->jpu_buffer_pool_count--; + p_jdb = &jdi->jpu_buffer_pool[i].jdb; + break; + } + } + + if (!p_jdb->size) { + JLOG(ERR, "Invalid buffer to free! address=0x%lx\n", + p_jdb->virt_addr); + jdi_unlock(); + return -1; + } + + JLOG(INFO, "phys_addr %llx, virt_addr %p, fd %d\n", p_jdb->phys_addr, + p_jdb->virt_addr, p_jdb->base); + ret = sys_ion_free_nofd((uint64_t)vb->phys_addr); + if (ret != 0) { + JLOG(ERR, "fail to free ion phys_addr = 0x%llx\n", + vb->phys_addr); + jdi_unlock(); + return ret; + } + + memset(p_jdb, 0x0, sizeof(jpudrv_buffer_t)); + memset(vb, 0, sizeof(jpu_buffer_t)); + + jdi_unlock(); + + return ret; +} + +int jdi_invalidate_ion_cache(uint64_t u64PhyAddr, void *pVirAddr, + uint32_t u32Len) +{ + return sys_cache_invalidate(u64PhyAddr, phys_to_virt(u64PhyAddr), u32Len); +} + +int jdi_flush_ion_cache(uint64_t u64PhyAddr, void *pVirAddr, uint32_t u32Len) +{ + return sys_cache_flush(u64PhyAddr, phys_to_virt(u64PhyAddr), u32Len); +} +#endif + +int jdi_set_clock_gate(int enable) +{ + jdi_info_t *jdi = &s_jdi_info[0]; + JLOG(INFO, "jdi set clk %d\n", enable); + + if (jdi->jpu_fd == -1 || jdi->jpu_fd == 0x00) + return 0; + + jdi->clock_state = enable; + + return jpu_set_clock_gate(&enable); +} + +int jdi_get_clock_gate(void) +{ + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + return jdi->clock_state; +} + +int jdi_wait_interrupt(int timeout) +{ +#if 0//def SUPPORT_INTERRUPT + int ret; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + ret = jpu_wait_interrupt(timeout); + if (ret != 0) + ret = -1; + + // printf("receive a interrupt ......, ret = %d\n", ret); + + return ret; +#else + Int64 elapse, cur; + struct timespec64 tv; + + ktime_get_ts64(&tv); + elapse = tv.tv_sec * 1000 + tv.tv_nsec / 1000000; + + while (1) { +#ifdef CVIDEBUG_V + unsigned int reg; + reg = jdi_read_register(MJPEG_PIC_STATUS_REG); + JLOG(INFO, "The JPU status reg 0x%08x\n", reg); + if (reg) + break; +#else + if (jdi_read_register(MJPEG_PIC_STATUS_REG)) + break; +#endif /* CVIDEBUG_V */ + + ktime_get_ts64(&tv); + cur = tv.tv_sec * 1000 + tv.tv_nsec / 1000000; + + if ((cur - elapse) > timeout) { + return -1; + } + usleep_range(800, 1200); + } + return 0; +#endif +} + +void jdi_log(int cmd, int step) +{ + int i; + + switch (cmd) { + case JDI_LOG_CMD_PICRUN: + if (step == 1) // + JLOG(INFO, "\n**PIC_RUN start\n"); + else + JLOG(INFO, "\n**PIC_RUN end\n"); + break; + } + + JLOG(INFO, "\nClock Status=%d\n", jdi_get_clock_gate()); + + for (i = 0; i <= 0x238; i = i + 16) { + JLOG(INFO, "0x%04xh: 0x%08x 0x%08x 0x%08x 0x%08x\n", i, + jdi_read_register(i), jdi_read_register(i + 4), + jdi_read_register(i + 8), jdi_read_register(i + 0xc)); + } +} + +int jpu_swap_endian(unsigned char *data, int len, int endian) +{ + unsigned long *p; + unsigned long v1, v2, v3; + int i; + int swap = 0; + p = (unsigned long *)data; + + if (endian == JDI_SYSTEM_ENDIAN) + swap = 0; + else + swap = 1; + + if (swap) { + if (endian == JDI_LITTLE_ENDIAN || endian == JDI_BIG_ENDIAN) { + for (i = 0; i < (len >> 2); i += 2) { + v1 = p[i]; + v2 = (v1 >> 24) & 0xFF; + v2 |= ((v1 >> 16) & 0xFF) << 8; + v2 |= ((v1 >> 8) & 0xFF) << 16; + v2 |= ((v1 >> 0) & 0xFF) << 24; + v3 = v2; + v1 = p[i + 1]; + v2 = (v1 >> 24) & 0xFF; + v2 |= ((v1 >> 16) & 0xFF) << 8; + v2 |= ((v1 >> 8) & 0xFF) << 16; + v2 |= ((v1 >> 0) & 0xFF) << 24; + p[i] = v2; + p[i + 1] = v3; + } + } else { + int sys_endian = JDI_SYSTEM_ENDIAN; + int swap4byte = 0; + swap = 0; + if (endian == JDI_32BIT_LITTLE_ENDIAN) { + if (sys_endian == JDI_BIG_ENDIAN) { + swap = 1; + } + } else { + if (sys_endian == JDI_BIG_ENDIAN) { + swap4byte = 1; + } else if (sys_endian == JDI_LITTLE_ENDIAN) { + swap4byte = 1; + swap = 1; + } else { + swap = 1; + } + } + if (swap) { + for (i = 0; i < (len >> 2); i++) { + v1 = p[i]; + v2 = (v1 >> 24) & 0xFF; + v2 |= ((v1 >> 16) & 0xFF) << 8; + v2 |= ((v1 >> 8) & 0xFF) << 16; + v2 |= ((v1 >> 0) & 0xFF) << 24; + p[i] = v2; + } + } + if (swap4byte) { + for (i = 0; i < (len >> 2); i += 2) { + v1 = p[i]; + v2 = p[i + 1]; + p[i] = v2; + p[i + 1] = v1; + } + } + } + } + return swap; +} +PhysicalAddress jdi_get_memory_addr_high(PhysicalAddress addr) +{ + PhysicalAddress ret = 1; + + return (ret << 32) | addr; +} + +#ifdef JPU_FPGA_PLATFORM + +static void *s_hpi_base; +static unsigned long s_dram_base; +void *hpi_init(unsigned long core_idx, unsigned long dram_base) +{ +#define MAX_NUM_JPU_CORE 2 + if (core_idx > MAX_NUM_JPU_CORE) + return (void *)-1; + s_dram_base = dram_base; + + return (void *)1; +} + +void hpi_release(unsigned long core_idx) +{ +} + +void hpi_write_register(unsigned long core_idx, void *base, unsigned int addr, + unsigned int data, pthread_mutex_t io_mutex) +{ + int status; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (pthread_mutex_lock(&jdi->io_mutex) < 0) + return; + + s_hpi_base = base; + + pci_write_reg(HPI_ADDR_ADDR_H, (addr >> 16)); + pci_write_reg(HPI_ADDR_ADDR_L, (addr & 0xffff)); + + pci_write_reg(HPI_ADDR_DATA, ((data >> 16) & 0xFFFF)); + pci_write_reg(HPI_ADDR_DATA + 4, (data & 0xFFFF)); + + pci_write_reg(HPI_ADDR_CMD, HPI_CMD_WRITE_VALUE); + + do { + status = pci_read_reg(HPI_ADDR_STATUS); + status = (status >> 1) & 1; + } while (status == 0); + + pthread_mutex_unlock(&jdi->io_mutex); +} + +unsigned int hpi_read_register(unsigned long core_idx, void *base, + unsigned int addr, pthread_mutex_t io_mutex) +{ + int status; + unsigned int data; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (pthread_mutex_lock(&jdi->io_mutex) < 0) + return -1; + + s_hpi_base = base; + + pci_write_reg(HPI_ADDR_ADDR_H, ((addr >> 16) & 0xffff)); + pci_write_reg(HPI_ADDR_ADDR_L, (addr & 0xffff)); + + pci_write_reg(HPI_ADDR_CMD, HPI_CMD_READ_VALUE); + + do { + status = pci_read_reg(HPI_ADDR_STATUS); + status = status & 1; + } while (status == 0); + + data = pci_read_reg(HPI_ADDR_DATA) << 16; + data |= pci_read_reg(HPI_ADDR_DATA + 4); + + pthread_mutex_unlock(&jdi->io_mutex); + + return data; +} + +int hpi_write_memory(unsigned long core_idx, void *base, unsigned int addr, + unsigned char *data, int len, int endian, + pthread_mutex_t io_mutex) +{ + unsigned char *pBuf; + unsigned char lsBuf[HPI_BUS_LEN]; + int lsOffset; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + + if (addr < s_dram_base) { + fprintf(stderr, "[HPI] invalid address base address is 0x%lx\n", + s_dram_base); + return 0; + } + + if (pthread_mutex_lock(&jdi->io_mutex) < 0) + return 0; + + if (len == 0) { + pthread_mutex_unlock(&jdi->io_mutex); + return 0; + } + + addr = addr - s_dram_base; + s_hpi_base = base; + + lsOffset = addr - (addr / HPI_BUS_LEN) * HPI_BUS_LEN; + if (lsOffset) { + pci_read_memory((addr / HPI_BUS_LEN) * HPI_BUS_LEN, lsBuf, + HPI_BUS_LEN); + pBuf = (unsigned char *)malloc( + (len + lsOffset + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN); + if (pBuf) { + memset(pBuf, 0x00, + (len + lsOffset + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN); + memcpy(pBuf, lsBuf, HPI_BUS_LEN); + memcpy(pBuf + lsOffset, data, len); + jpu_swap_endian(pBuf, + ((len + lsOffset + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN), + endian); + pci_write_memory((addr / HPI_BUS_LEN) * HPI_BUS_LEN, + (unsigned char *)pBuf, + ((len + lsOffset + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN)); + free(pBuf); + } + } else { + pBuf = (unsigned char *)malloc((len + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN); + if (pBuf) { + memset(pBuf, 0x00, + (len + HPI_BUS_LEN_ALIGN) & ~HPI_BUS_LEN_ALIGN); + memcpy(pBuf, data, len); + jpu_swap_endian(pBuf, + (len + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN, + endian); + pci_write_memory(addr, (unsigned char *)pBuf, + (len + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN); + free(pBuf); + } + } + + pthread_mutex_unlock(&jdi->io_mutex); + + return len; +} + +int hpi_read_memory(unsigned long core_idx, void *base, unsigned int addr, + unsigned char *data, int len, int endian, + pthread_mutex_t io_mutex) +{ + unsigned char *pBuf; + unsigned char lsBuf[HPI_BUS_LEN]; + int lsOffset; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (addr < s_dram_base) { + fprintf(stderr, "[HPI] invalid address base address is 0x%lx\n", + s_dram_base); + return 0; + } + + if (pthread_mutex_lock(&jdi->io_mutex) < 0) + return 0; + + if (len == 0) { + pthread_mutex_unlock(&jdi->io_mutex); + return 0; + } + + addr = addr - s_dram_base; + s_hpi_base = base; + + lsOffset = addr - (addr / HPI_BUS_LEN) * HPI_BUS_LEN; + if (lsOffset) { + pci_read_memory((addr / HPI_BUS_LEN) * HPI_BUS_LEN, lsBuf, + HPI_BUS_LEN); + jpu_swap_endian(lsBuf, HPI_BUS_LEN, endian); + len = len - (HPI_BUS_LEN - lsOffset); + pBuf = (unsigned char *)malloc( + ((len + HPI_BUS_LEN_ALIGN) & ~HPI_BUS_LEN_ALIGN)); + if (pBuf) { + memset(pBuf, 0x00, + ((len + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN)); + pci_read_memory((addr + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN, + pBuf, + ((len + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN)); + jpu_swap_endian(pBuf, + ((len + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN), + endian); + + memcpy(data, lsBuf + lsOffset, HPI_BUS_LEN - lsOffset); + memcpy(data + HPI_BUS_LEN - lsOffset, pBuf, len); + + free(pBuf); + } + } else { + pBuf = (unsigned char *)malloc((len + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN); + if (pBuf) { + memset(pBuf, 0x00, + (len + HPI_BUS_LEN_ALIGN) & ~HPI_BUS_LEN_ALIGN); + pci_read_memory(addr, pBuf, + (len + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN); + jpu_swap_endian(pBuf, + (len + HPI_BUS_LEN_ALIGN) & + ~HPI_BUS_LEN_ALIGN, + endian); + memcpy(data, pBuf, len); + free(pBuf); + } + } + + pthread_mutex_unlock(&jdi->io_mutex); + + return len; +} + +int hpi_hw_reset(void *base) +{ + s_hpi_base = base; + pci_write_reg(DEVICE_ADDR_SW_RESET << 2, 1); // write data 1 + return 0; +} + +int hpi_write_reg_limit(unsigned long core_idx, unsigned int addr, + unsigned int data, pthread_mutex_t io_mutex) +{ + int status; + int i; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (pthread_mutex_lock(&jdi->io_mutex) < 0) + return 0; + + pci_write_reg(HPI_ADDR_ADDR_H, (addr >> 16)); + pci_write_reg(HPI_ADDR_ADDR_L, (addr & 0xffff)); + + pci_write_reg(HPI_ADDR_DATA, ((data >> 16) & 0xFFFF)); + pci_write_reg(HPI_ADDR_DATA + 4, (data & 0xFFFF)); + + pci_write_reg(HPI_ADDR_CMD, HPI_CMD_WRITE_VALUE); + + i = 0; + do { + status = pci_read_reg(HPI_ADDR_STATUS); + status = (status >> 1) & 1; + if (i++ > 10000) { + pthread_mutex_unlock(&jdi->io_mutex); + return 0; + } + } while (status == 0); + + pthread_mutex_unlock(&jdi->io_mutex); + + return 1; +} + +int hpi_read_reg_limit(unsigned long core_idx, unsigned int addr, + unsigned int *data, pthread_mutex_t io_mutex) +{ + int status; + int i; + jdi_info_t *jdi; + + jdi = &s_jdi_info[0]; + if (pthread_mutex_lock(&jdi->io_mutex) < 0) + return 0; + + pci_write_reg(HPI_ADDR_ADDR_H, ((addr >> 16) & 0xffff)); + pci_write_reg(HPI_ADDR_ADDR_L, (addr & 0xffff)); + + pci_write_reg(HPI_ADDR_CMD, HPI_CMD_READ_VALUE); + + i = 0; + do { + status = pci_read_reg(HPI_ADDR_STATUS); + status = status & 1; + if (i++ > 10000) { + pthread_mutex_unlock(&jdi->io_mutex); + return 0; + } + } while (status == 0); + + *data = pci_read_reg(HPI_ADDR_DATA) << 16; + *data |= pci_read_reg(HPI_ADDR_DATA + 4); + + pthread_mutex_unlock(&jdi->io_mutex); + + return 1; +} + +/*------------------------------------------------------------------------ + * Usage : used to program output frequency of ICS307M + * Artument : + * Device : first device selected if 0, second device if 1. + * OutFreqMHz : Target output frequency in MHz. + * InFreqMHz : Input frequency applied to device in MHz + * this must be 10 here. + * Return : TRUE if success, FALSE if invalid OutFreqMHz. + *----------------------------------------------------------------------*/ + +int ics307m_set_clock_freg(void *base, int Device, int OutFreqMHz, + int InFreqMHz) +{ + int VDW, RDW, OD, SDW, tmp; + int min_clk; + int max_clk; + + s_hpi_base = base; + if (Device == 0) { + min_clk = ACLK_MIN; + max_clk = ACLK_MAX; + } else { + min_clk = CCLK_MIN; + max_clk = CCLK_MAX; + } + + if (OutFreqMHz < min_clk || OutFreqMHz > max_clk) { + // printf ("Target Frequency should be from %2d to %2d !!!\n", + // min_clk, max_clk); + return 0; + } + + if (OutFreqMHz >= min_clk && OutFreqMHz < 14) { + switch (OutFreqMHz) { + case 6: + VDW = 4; + RDW = 2; + OD = 10; + break; + case 7: + VDW = 6; + RDW = 2; + OD = 10; + break; + case 8: + VDW = 8; + RDW = 2; + OD = 10; + break; + case 9: + VDW = 10; + RDW = 2; + OD = 10; + break; + case 10: + VDW = 12; + RDW = 2; + OD = 10; + break; + case 11: + VDW = 14; + RDW = 2; + OD = 10; + break; + case 12: + VDW = 16; + RDW = 2; + OD = 10; + break; + case 13: + VDW = 18; + RDW = 2; + OD = 10; + break; + } + } else { + VDW = OutFreqMHz - 8; // VDW + RDW = 3; // RDW + OD = 4; // OD + } + + switch (OD) { // change OD to SDW: s2:s1:s0 + case 0: + SDW = 0; + break; + case 1: + SDW = 0; + break; + case 2: + SDW = 1; + break; + case 3: + SDW = 6; + break; + case 4: + SDW = 3; + break; + case 5: + SDW = 4; + break; + case 6: + SDW = 7; + break; + case 7: + SDW = 4; + break; + case 8: + SDW = 2; + break; + case 9: + SDW = 0; + break; + case 10: + SDW = 0; + break; + default: + SDW = 0; + break; + } + + if (Device == 0) { // select device 1 + tmp = 0x20 | SDW; + pci_write_reg((DEVICE0_ADDR_PARAM0) << 2, tmp); // write data 0 + tmp = (VDW << 7) & 0xff80 | RDW; + pci_write_reg((DEVICE0_ADDR_PARAM1) << 2, tmp); // write data 1 + tmp = 1; + pci_write_reg((DEVICE0_ADDR_COMMAND) << 2, + tmp); // write command set + tmp = 0; + pci_write_reg((DEVICE0_ADDR_COMMAND) << 2, + tmp); // write command reset + } else { // select device 2 + tmp = 0x20 | SDW; + pci_write_reg((DEVICE1_ADDR_PARAM0) << 2, tmp); // write data 0 + tmp = (VDW << 7) & 0xff80 | RDW; + pci_write_reg((DEVICE1_ADDR_PARAM1) << 2, tmp); // write data 1 + tmp = 1; + pci_write_reg((DEVICE1_ADDR_COMMAND) << 2, + tmp); // write command set + tmp = 0; + pci_write_reg((DEVICE1_ADDR_COMMAND) << 2, + tmp); // write command reset + } + return 1; +} + +int hpi_set_timing_opt(unsigned long core_idx, void *base, + pthread_mutex_t io_mutex) +{ + int i; + unsigned int iAddr; + unsigned int uData; + unsigned int uuData; + int iTemp; + int testFail; +#define MIX_L1_Y_SADDR (0x11000000 + 0x0138) +#define MIX_L1_CR_SADDR (0x11000000 + 0x0140) + + s_hpi_base = base; + + i = 2; + // find HPI maximum timing register value + do { + i++; + // iAddr = BIT_BASE + 0x100; + iAddr = MIX_L1_Y_SADDR; + uData = 0x12345678; + testFail = 0; + printf("HPI Tw, Tr value: %d\r", i); + + pci_write_reg(0x70 << 2, i); + pci_write_reg(0x71 << 2, i); + if (i < 15) + pci_write_reg(0x72 << 2, 0); + else + pci_write_reg(0x72 << 2, i * 20 / 100); + + for (iTemp = 0; iTemp < 10000; iTemp++) { + if (hpi_write_reg_limit(core_idx, iAddr, uData, + io_mutex) == FALSE) { + testFail = 1; + break; + } + if (hpi_read_reg_limit(core_idx, iAddr, &uuData, + io_mutex) == FALSE) { + testFail = 1; + break; + } + if (uuData == uData) { + if (hpi_write_reg_limit(core_idx, iAddr, 0, + io_mutex) == FALSE) { + testFail = 1; + break; + } + } else { + testFail = 1; + break; + } + + iAddr += 4; + /* + * if (iAddr == BIT_BASE + 0x200) + * iAddr = BIT_BASE + 0x100; + */ + if (iAddr == MIX_L1_CR_SADDR) + iAddr = MIX_L1_Y_SADDR; + uData++; + } + } while (testFail && i < HPI_SET_TIMING_MAX); + + pci_write_reg(0x70 << 2, i); + pci_write_reg(0x71 << 2, i + i * 40 / 100); + pci_write_reg(0x72 << 2, i * 20 / 100); + + printf("\nOptimized HPI Tw value : %d\n", pci_read_reg(0x70 << 2)); + printf("Optimized HPI Tr value : %d\n", pci_read_reg(0x71 << 2)); + printf("Optimized HPI Te value : %d\n", pci_read_reg(0x72 << 2)); + + return i; +} + +void pci_write_reg(unsigned int addr, unsigned int data) +{ + unsigned long *reg_addr = + (unsigned long *)(addr + (unsigned long)s_hpi_base); + + writel(data, reg_addr); +} + +unsigned int pci_read_reg(unsigned int addr) +{ + unsigned long *reg_addr = + (unsigned long *)(addr + (unsigned long)s_hpi_base); + + return readl(reg_addr); +} + +void pci_read_memory(unsigned int addr, unsigned char *buf, int size) +{ + int status; + int i, j, k; + int data = 0; + + i = j = k = 0; + + for (i = 0; i < size / HPI_MAX_PKSIZE; i++) { + pci_write_reg(HPI_ADDR_ADDR_H, (addr >> 16)); + pci_write_reg(HPI_ADDR_ADDR_L, (addr & 0xffff)); + + pci_write_reg(HPI_ADDR_CMD, (((HPI_MAX_PKSIZE) << 4) + 1)); + + do { + status = 0; + status = pci_read_reg(HPI_ADDR_STATUS); + status = status & 1; + } while (status == 0); + + for (j = 0; j < (HPI_MAX_PKSIZE >> 1); j++) { + data = pci_read_reg(HPI_ADDR_DATA + j * 4); + buf[k] = (data >> 8) & 0xFF; + buf[k + 1] = data & 0xFF; + k = k + 2; + } + + addr += HPI_MAX_PKSIZE; + } + + size = size % HPI_MAX_PKSIZE; + + if (((addr + size) & 0xFFFFFF00) != (addr & 0xFFFFFF00)) + size = size; + + if (size) { + pci_write_reg(HPI_ADDR_ADDR_H, (addr >> 16)); + pci_write_reg(HPI_ADDR_ADDR_L, (addr & 0xffff)); + + pci_write_reg(HPI_ADDR_CMD, (((size) << 4) + 1)); + + do { + status = 0; + status = pci_read_reg(HPI_ADDR_STATUS); + status = status & 1; + + } while (status == 0); + + for (j = 0; j < (size >> 1); j++) { + data = pci_read_reg(HPI_ADDR_DATA + j * 4); + buf[k] = (data >> 8) & 0xFF; + buf[k + 1] = data & 0xFF; + k = k + 2; + } + } +} + +void pci_write_memory(unsigned int addr, unsigned char *buf, int size) +{ + int status; + int i, j, k; + int data = 0; + + i = j = k = 0; + + for (i = 0; i < size / HPI_MAX_PKSIZE; i++) { + pci_write_reg(HPI_ADDR_ADDR_H, (addr >> 16)); + pci_write_reg(HPI_ADDR_ADDR_L, (addr & 0xffff)); + + for (j = 0; j < (HPI_MAX_PKSIZE >> 1); j++) { + data = (buf[k] << 8) | buf[k + 1]; + pci_write_reg(HPI_ADDR_DATA + j * 4, data); + k = k + 2; + } + + pci_write_reg(HPI_ADDR_CMD, (((HPI_MAX_PKSIZE) << 4) + 2)); + + do { + status = 0; + status = pci_read_reg(HPI_ADDR_STATUS); + status = (status >> 1) & 1; + } while (status == 0); + + addr += HPI_MAX_PKSIZE; + } + + size = size % HPI_MAX_PKSIZE; + + if (size) { + pci_write_reg(HPI_ADDR_ADDR_H, (addr >> 16)); + pci_write_reg(HPI_ADDR_ADDR_L, (addr & 0xffff)); + + for (j = 0; j < (size >> 1); j++) { + data = (buf[k] << 8) | buf[k + 1]; + pci_write_reg(HPI_ADDR_DATA + j * 4, data); + k = k + 2; + } + + pci_write_reg(HPI_ADDR_CMD, (((size) << 4) + 2)); + + do { + status = 0; + status = pci_read_reg(HPI_ADDR_STATUS); + status = (status >> 1) & 1; + + } while (status == 0); + } +} + +int jdi_set_timing_opt(void) +{ + return 0; +} + +int jdi_set_clock_freg(int Device, int OutFreqMHz, int InFreqMHz) +{ + return 0; +} +#endif + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/mm.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/mm.c new file mode 100644 index 0000000000..18c336a40a --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/mm.c @@ -0,0 +1,608 @@ +#ifdef REDUNDENT_CODE +#include +#include "mm.h" +#include "jputypes.h" + +#ifdef __DEBUG +#define DPRINT(...) printf(__VA_ARGS__) +#else +#define DPRINT(...) +#endif + +#define P_ALLOC(_x) kmalloc(_x, GFP_KERNEL) +#define P_FREE(_x) kfree(_x) +#define ASSERT(_exp) \ + do { \ + if (!(_exp)) { \ + pr_debug("ASSERT at %s:%d\n", __FILE__, \ + __LINE__); \ + while (1) \ + ; \ + } \ + } while (0) +#define HEIGHT(_tree) (_tree == NULL ? -1 : _tree->height) + +/* + * doubly linked list + */ +typedef struct link_struct { + struct link_struct *next; + struct link_struct *prev; +} link_t; + +#define MAX(_a, _b) (_a >= _b ? _a : _b) + +typedef enum { LEFT, RIGHT } rotation_dir_t; + +typedef struct avl_node_data_struct { + int key; + page_t *page; +} avl_node_data_t; + +static avl_node_t *make_avl_node(vmem_key_t key, page_t *page) +{ + avl_node_t *node = (avl_node_t *)P_ALLOC(sizeof(avl_node_t)); + node->key = key; + node->page = page; + node->height = 0; + node->left = NULL; + node->right = NULL; + + return node; +} + +static int get_balance_factor(avl_node_t *tree) +{ + int factor = 0; + if (tree) { + factor = HEIGHT(tree->right) - HEIGHT(tree->left); + } + + return factor; +} + +/* + * Left Rotation + * + * A B + * \ / \ + * B => A C + * / \ \ + * D C D + * + */ +static avl_node_t *rotation_left(avl_node_t *tree) +{ + avl_node_t *rchild; + avl_node_t *lchild; + + if (tree == NULL) + return NULL; + + rchild = tree->right; + if (rchild == NULL) { + return tree; + } + + lchild = rchild->left; + rchild->left = tree; + tree->right = lchild; + + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + rchild->height = MAX(HEIGHT(rchild->left), HEIGHT(rchild->right)) + 1; + + return rchild; +} + +/* + * Reft Rotation + * + * A B + * \ / \ + * B => D A + * / \ / + * D C C + * + */ +static avl_node_t *rotation_right(avl_node_t *tree) +{ + avl_node_t *rchild; + avl_node_t *lchild; + + if (tree == NULL) + return NULL; + + lchild = tree->left; + if (lchild == NULL) + return NULL; + + rchild = lchild->right; + lchild->right = tree; + tree->left = rchild; + + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + lchild->height = MAX(HEIGHT(lchild->left), HEIGHT(lchild->right)) + 1; + + return lchild; +} + +static avl_node_t *do_balance(avl_node_t *tree) +{ + int bfactor = 0, child_bfactor; /* balancing factor */ + + bfactor = get_balance_factor(tree); + + if (bfactor >= 2) { + child_bfactor = get_balance_factor(tree->right); + if (child_bfactor == 1 || child_bfactor == 0) { + tree = rotation_left(tree); + } else if (child_bfactor == -1) { + tree->right = rotation_right(tree->right); + tree = rotation_left(tree); + } else { + pr_err("invalid balancing factor: %d\n", child_bfactor); + ASSERT(0); + return NULL; + } + } else if (bfactor <= -2) { + child_bfactor = get_balance_factor(tree->left); + if (child_bfactor == -1 || child_bfactor == 0) { + tree = rotation_right(tree); + } else if (child_bfactor == 1) { + tree->left = rotation_left(tree->left); + tree = rotation_right(tree); + } else { + pr_err("invalid balancing factor: %d\n", child_bfactor); + ASSERT(0); + return NULL; + } + } + + return tree; +} +static avl_node_t *unlink_end_node(avl_node_t *tree, int dir, + avl_node_t **found_node) +{ + // avl_node_t* node; + *found_node = NULL; + + if (tree == NULL) + return NULL; + + if (dir == LEFT) { + if (tree->left == NULL) { + *found_node = tree; + return NULL; + } + } else { + if (tree->right == NULL) { + *found_node = tree; + return NULL; + } + } + + if (dir == LEFT) { + // node = tree->left; + tree->left = unlink_end_node(tree->left, LEFT, found_node); + if (tree->left == NULL) { + tree->left = (*found_node)->right; + (*found_node)->left = NULL; + (*found_node)->right = NULL; + } + } else { + // node = tree->right; + tree->right = unlink_end_node(tree->right, RIGHT, found_node); + if (tree->right == NULL) { + tree->right = (*found_node)->left; + (*found_node)->left = NULL; + (*found_node)->right = NULL; + } + } + + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + + return do_balance(tree); +} + +/* + * A + * / \ => B < A <= C + * B C + */ +#if 0 +static avl_node_t *avltree_find(avl_node_t *tree, int key) +{ + if (tree == NULL) + return NULL; + + if (tree->key == key) { + return tree; + } else if (tree->key < key) { + return avltree_find(tree->right, key); + } else { + return avltree_find(tree->left, key); + } +} +#endif + +static avl_node_t *avltree_insert(avl_node_t *tree, vmem_key_t key, + page_t *page) +{ + if (tree == NULL) { + tree = make_avl_node(key, page); + } else { + if (key >= tree->key) { + tree->right = avltree_insert(tree->right, key, page); + } else { + tree->left = avltree_insert(tree->left, key, page); + } + } + + tree = do_balance(tree); + + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + + return tree; +} + +static avl_node_t *do_unlink(avl_node_t *tree) +{ + avl_node_t *node; + avl_node_t *end_node; + node = unlink_end_node(tree->right, LEFT, &end_node); + if (node) { + tree->right = node; + } else { + node = unlink_end_node(tree->left, RIGHT, &end_node); + if (node) + tree->left = node; + } + + if (node == NULL) { + node = tree->right ? tree->right : tree->left; + end_node = node; + } + + if (end_node) { + end_node->left = + (tree->left != end_node) ? tree->left : end_node->left; + end_node->right = (tree->right != end_node) ? tree->right : + end_node->right; + end_node->height = + MAX(HEIGHT(end_node->left), HEIGHT(end_node->right)) + + 1; + } + + tree = end_node; + + return tree; +} + +static avl_node_t *avltree_remove(avl_node_t *tree, avl_node_t **found_node, + vmem_key_t key) +{ + *found_node = NULL; + if (tree == NULL) { + DPRINT("failed to find key %d\n", key); + return NULL; + } + + if (key == tree->key) { + *found_node = tree; + tree = do_unlink(tree); + } else if (key > tree->key) { + tree->right = avltree_remove(tree->right, found_node, key); + } else { + tree->left = avltree_remove(tree->left, found_node, key); + } + + if (tree) + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + + tree = do_balance(tree); + + return tree; +} + +void jpu_avltree_free(avl_node_t *tree) +{ + if (tree == NULL) + return; + if (tree->left == NULL && tree->right == NULL) { + P_FREE(tree); + return; + } + + jpu_avltree_free(tree->left); + tree->left = NULL; + jpu_avltree_free(tree->right); + tree->right = NULL; + P_FREE(tree); +} + +static avl_node_t *remove_approx_value(avl_node_t *tree, avl_node_t **found, + vmem_key_t key) +{ + *found = NULL; + if (tree == NULL) { + return NULL; + } + + if (key == tree->key) { + *found = tree; + tree = do_unlink(tree); + } else if (key > tree->key) { + tree->right = remove_approx_value(tree->right, found, key); + } else { + tree->left = remove_approx_value(tree->left, found, key); + if (*found == NULL) { + *found = tree; + tree = do_unlink(tree); + } + } + if (tree) + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + tree = do_balance(tree); + + return tree; +} + +static void set_blocks_free(jpeg_mm_t *mm, int pageno, int npages) +{ + int last_pageno = pageno + npages - 1; + int i; + page_t *page; + page_t *last_page; + + ASSERT(npages); + + if (last_pageno >= mm->num_pages) { + DPRINT("set_blocks_free: invalid last page number: %d\n", + last_pageno); + ASSERT(0); + return; + } + + for (i = pageno; i <= last_pageno; i++) { + mm->page_list[i].used = 0; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].first_pageno = -1; + } + + page = &mm->page_list[pageno]; + page->alloc_pages = npages; + last_page = &mm->page_list[last_pageno]; + last_page->first_pageno = pageno; + + mm->free_tree = + avltree_insert(mm->free_tree, MAKE_KEY(npages, pageno), page); +} + +static void set_blocks_alloc(jpeg_mm_t *mm, int pageno, int npages) +{ + int last_pageno = pageno + npages - 1; + int i; + page_t *page; + page_t *last_page; + + if (last_pageno >= mm->num_pages) { + DPRINT("set_blocks_free: invalid last page number: %d\n", + last_pageno); + ASSERT(0); + return; + } + + for (i = pageno; i <= last_pageno; i++) { + mm->page_list[i].used = 1; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].first_pageno = -1; + } + + page = &mm->page_list[pageno]; + page->alloc_pages = npages; + + last_page = &mm->page_list[last_pageno]; + last_page->first_pageno = pageno; + + mm->alloc_tree = + avltree_insert(mm->alloc_tree, MAKE_KEY(page->addr, 0), page); +} + +int jmem_init(jpeg_mm_t *mm, unsigned long addr, unsigned long size) +{ + int i; + + mm->base_addr = (addr + (VMEM_PAGE_SIZE - 1)) & ~(VMEM_PAGE_SIZE - 1); + mm->mem_size = size & ~VMEM_PAGE_SIZE; + mm->num_pages = mm->mem_size / VMEM_PAGE_SIZE; + mm->page_list = (page_t *)P_ALLOC(mm->num_pages * sizeof(page_t)); + mm->free_tree = NULL; + mm->alloc_tree = NULL; + mm->free_page_count = mm->num_pages; + mm->alloc_page_count = 0; + + for (i = 0; i < mm->num_pages; i++) { + mm->page_list[i].pageno = i; + mm->page_list[i].addr = mm->base_addr + i * VMEM_PAGE_SIZE; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].used = 0; + mm->page_list[i].first_pageno = -1; + } + + set_blocks_free(mm, 0, mm->num_pages); + + return 0; +} + +int jmem_exit(jpeg_mm_t *mm) +{ + if (mm == NULL) { + DPRINT("vmem_exit: invalid handle\n"); + return -1; + } + + if (mm->free_tree) { + jpu_avltree_free(mm->free_tree); + mm->free_tree = NULL; + } + if (mm->alloc_tree) { + jpu_avltree_free(mm->alloc_tree); + mm->alloc_tree = NULL; + } + + if (mm->page_list) { + P_FREE(mm->page_list); + mm->page_list = NULL; + } + + return 0; +} + +unsigned long jmem_alloc(jpeg_mm_t *mm, unsigned int size) +{ + avl_node_t *node; + page_t *free_page; + int npages, free_size; + int alloc_pageno; + unsigned long ptr; + + if (mm == NULL) { + DPRINT("vmem_alloc: invalid handle\n"); + return (unsigned long)-1; + } + + if (size <= 0) + return -1; + + npages = (size + VMEM_PAGE_SIZE - 1) / VMEM_PAGE_SIZE; + + mm->free_tree = + remove_approx_value(mm->free_tree, &node, MAKE_KEY(npages, 0)); + if (node == NULL) { + return (unsigned long)-1; + } + free_page = node->page; + free_size = KEY_TO_VALUE(node->key); + + alloc_pageno = free_page->pageno; + set_blocks_alloc(mm, alloc_pageno, npages); + if (npages != free_size) { + int free_pageno = alloc_pageno + npages; + set_blocks_free(mm, free_pageno, (free_size - npages)); + } + + P_FREE(node); + + ptr = mm->page_list[alloc_pageno].addr; + mm->alloc_page_count += npages; + mm->free_page_count -= npages; + + return ptr; +} + +int jmem_free(jpeg_mm_t *mm, unsigned long ptr) +{ + unsigned long addr; + avl_node_t *found; + page_t *page; + int pageno, prev_free_pageno, next_free_pageno; + int prev_size, next_size; + int merge_page_no, merge_page_size, free_page_size; + + if (mm == NULL) { + DPRINT("vmem_free: invalid handle\n"); + return -1; + } + + addr = ptr; + + mm->alloc_tree = + avltree_remove(mm->alloc_tree, &found, MAKE_KEY(addr, 0)); + if (found == NULL) { + DPRINT("vmem_free: 0x%08x not found\n", addr); + return -1; + } + + /* find previous free block */ + page = found->page; + pageno = page->pageno; + free_page_size = page->alloc_pages; + prev_free_pageno = pageno - 1; + prev_size = -1; + if (prev_free_pageno >= 0) { + if (mm->page_list[prev_free_pageno].used == 0) { + prev_free_pageno = + mm->page_list[prev_free_pageno].first_pageno; + prev_size = mm->page_list[prev_free_pageno].alloc_pages; + } + } + + /* find next free block */ + next_free_pageno = pageno + page->alloc_pages; + next_free_pageno = + (next_free_pageno == mm->num_pages) ? -1 : next_free_pageno; + next_size = -1; + if (next_free_pageno >= 0) { + if (mm->page_list[next_free_pageno].used == 0) { + next_size = mm->page_list[next_free_pageno].alloc_pages; + } + } + P_FREE(found); + + /* merge */ + merge_page_no = page->pageno; + merge_page_size = page->alloc_pages; + if (prev_size >= 0) { + mm->free_tree = + avltree_remove(mm->free_tree, &found, + MAKE_KEY(prev_size, prev_free_pageno)); + if (found == NULL) { + ASSERT(0); + return -1; + } + merge_page_no = found->page->pageno; + merge_page_size += found->page->alloc_pages; + P_FREE(found); + } + if (next_size >= 0) { + mm->free_tree = + avltree_remove(mm->free_tree, &found, + MAKE_KEY(next_size, next_free_pageno)); + if (found == NULL) { + ASSERT(0); + return -1; + } + merge_page_size += found->page->alloc_pages; + P_FREE(found); + } + + page->alloc_pages = 0; + page->first_pageno = -1; + + set_blocks_free(mm, merge_page_no, merge_page_size); + + mm->alloc_page_count -= free_page_size; + mm->free_page_count += free_page_size; + + return 0; +} + +int jmem_get_info(jpeg_mm_t *mm, jmem_info_t *info) +{ + if (mm == NULL) { + DPRINT("vmem_get_info: invalid handle\n"); + return -1; + } + + if (info == NULL) { + return -1; + } + + info->total_pages = mm->num_pages; + info->alloc_pages = mm->alloc_page_count; + info->free_pages = mm->free_page_count; + info->page_size = VMEM_PAGE_SIZE; + + return 0; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/mm.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/mm.h new file mode 100644 index 0000000000..7a5551384c --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jdi/mm.h @@ -0,0 +1,73 @@ +#ifndef __JPU_VIDEO_MEMORY_MANAGEMENT_H__ +#define __JPU_VIDEO_MEMORY_MANAGEMENT_H__ + +typedef struct _jmem_info_struct { + unsigned long total_pages; + unsigned long alloc_pages; + unsigned long free_pages; + unsigned long page_size; +} jmem_info_t; + +#if defined(WIN32) || defined(WIN64) +#if (_MSC_VER == 1200) +typedef _int64 vmem_key_t; +#else +typedef unsigned long long vmem_key_t; +#endif +#else +typedef unsigned long long vmem_key_t; +#endif + +#define VMEM_PAGE_SIZE (16 * 1024) + +#define MAKE_KEY(_a, _b) (((vmem_key_t)_a) << 32 | _b) +#define KEY_TO_VALUE(_key) (_key >> 32) + +#ifdef REDUNDENT_CODE +typedef struct page_struct { + int pageno; + unsigned long addr; + int used; + int alloc_pages; + int first_pageno; +} page_t; + +typedef struct avl_node_struct { + vmem_key_t key; + int height; + page_t *page; + struct avl_node_struct *left; + struct avl_node_struct *right; +} avl_node_t; + +typedef struct _jpeg_mm_struct { + avl_node_t *free_tree; + avl_node_t *alloc_tree; + page_t *page_list; + int num_pages; + unsigned long base_addr; + unsigned long mem_size; + void *mutex; + int free_page_count; + int alloc_page_count; +} jpeg_mm_t; + +#if defined(__cplusplus) +extern "C" { +#endif + +extern int jmem_init(jpeg_mm_t *mm, unsigned long addr, unsigned long size); + +extern int jmem_exit(jpeg_mm_t *mm); + +extern unsigned long jmem_alloc(jpeg_mm_t *mm, unsigned int size); + +extern int jmem_free(jpeg_mm_t *mm, unsigned long ptr); + +extern int jmem_get_info(jpeg_mm_t *mm, jmem_info_t *info); + +#if defined(__cplusplus) +} +#endif +#endif +#endif /* __JPU_VIDEO_MEMORY_MANAGEMENT_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapi.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapi.c new file mode 100644 index 0000000000..f93f0b766b --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapi.c @@ -0,0 +1,2220 @@ +#include + +#include "jpuapifunc.h" +#include "jpuapi.h" +#include "jpuhelper.h" + +#include "../include/jpulog.h" + +uint jpeg_mask = CVI_MASK_CURR; + +module_param(jpeg_mask, uint, 0644); + +int JPU_IsBusy(void) +{ + Uint32 val; + val = JpuReadReg(MJPEG_PIC_STATUS_REG); + + if ((val & (1 << INT_JPU_DONE)) || (val & (1 << INT_JPU_ERROR))) + return 0; + + return 1; +} + +void JPU_ClrStatus(Uint32 val) +{ + if (val != 0) + JpuWriteReg(MJPEG_PIC_STATUS_REG, val); +} + +Uint32 JPU_GetStatus(void) +{ + return JpuReadReg(MJPEG_PIC_STATUS_REG); +} + +Uint32 JPU_IsInit(void) +{ + jpu_instance_pool_t *pjip; + + pjip = (jpu_instance_pool_t *)jdi_get_instance_pool(); + + if (!pjip) + return 0; + + return 1; +} + +Uint32 JPU_WaitInterrupt(int timeout) +{ + Uint32 reason = 0; + + reason = jdi_wait_interrupt(timeout); + + JpgSetClockGate(1); + + if (reason != (Uint32)-1) + reason = JpuReadReg(MJPEG_PIC_STATUS_REG); + + JpgSetClockGate(0); + + return reason; +} + +int JPU_GetOpenInstanceNum(void) +{ + jpu_instance_pool_t *pjip; + + pjip = (jpu_instance_pool_t *)jdi_get_instance_pool(); + if (!pjip) + return -1; + + return pjip->jpu_instance_num; +} + +JpgRet JPU_Init(void) +{ + jpu_instance_pool_t *pjip; + int ret; + + ret = jdi_init(); + if (ret < 0) { + JLOG(ERR, "Failed to call jdi_init()!"); + return JPG_RET_FAILURE; + } + + pjip = (jpu_instance_pool_t *)jdi_get_instance_pool(); + if (!pjip) { + JLOG(ERR, "Failed to call jdi_get_instance_pool()!"); + return JPG_RET_FAILURE; + } + + if (!pjip->instance_pool_inited) { + CVI_JPG_DBG_TRACE("instance_pool_inited = %d\n", + pjip->instance_pool_inited); + + JPU_HWReset(); + JPU_SWReset(); + } + + InitJpgInstancePool(); + + return JPG_RET_SUCCESS; +} + +void JPU_DeInit(void) +{ + jdi_release(); +} + +JpgRet JPU_GetVersionInfo(Uint32 *versionInfo) +{ + if (JPU_IsInit() == 0) { + return JPG_RET_NOT_INITIALIZED; + } + + *versionInfo = API_VERSION; + + return JPG_RET_SUCCESS; +} + +/** + * Initialize JPU encoder/decoder status. + * Initialize the internal state and control registers of JPU */ +static JpgRet JPU_InitCodecStatus(void) +{ + Uint32 val; + JpuWriteReg(MJPEG_PIC_START_REG, (1 << JPG_START_INIT)); + do { + val = JpuReadReg(MJPEG_PIC_START_REG); + } while ((val & (1 << JPG_START_INIT)) == (1 << JPG_START_INIT)); + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_SWReset(void) +{ + PhysicalAddress streamBufStartAddr; + PhysicalAddress streamBufEndAddr; + PhysicalAddress streamWrPtr; + PhysicalAddress streamRdPtr; + + streamBufStartAddr = JpuReadReg(MJPEG_BBC_BAS_ADDR_REG); + streamBufEndAddr = JpuReadReg(MJPEG_BBC_END_ADDR_REG); + streamWrPtr = JpuReadReg(MJPEG_BBC_RD_PTR_REG); + streamRdPtr = JpuReadReg(MJPEG_BBC_WR_PTR_REG); + + JPU_InitCodecStatus(); + + JpuWriteReg(MJPEG_BBC_BAS_ADDR_REG, streamBufStartAddr); + JpuWriteReg(MJPEG_BBC_END_ADDR_REG, streamBufEndAddr); + JpuWriteReg(MJPEG_BBC_RD_PTR_REG, streamRdPtr); + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, streamWrPtr); + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_HWReset(void) +{ + if (jdi_hw_reset() < 0) + return JPG_RET_FAILURE; + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecOpen(JpgDecHandle *pHandle, JpgDecOpenParam *pop) +{ + JpgInst *pJpgInst; + JpgDecInfo *pDecInfo; + JpgRet ret; +#ifdef DUMP_JPU_REGS + JPU_Print_Reg_Status(1); +#endif + ret = CheckJpgDecOpenParam(pop); + if (ret != JPG_RET_SUCCESS) { + return ret; + } + + ret = GetJpgInstance(&pJpgInst); + if (ret == JPG_RET_FAILURE) { + *pHandle = 0; + JLOG(ERR, "Failed to call GetJpgInstance()!"); + return JPG_RET_FAILURE; + } + + *pHandle = pJpgInst; + + pDecInfo = &pJpgInst->JpgInfo.decInfo; + memset(pDecInfo, 0x00, sizeof(JpgDecInfo)); + + pDecInfo->streamWrPtr = pop->bitstreamBuffer; + pDecInfo->streamRdPtr = pop->bitstreamBuffer; + + pDecInfo->streamBufStartAddr = pop->bitstreamBuffer; + pDecInfo->streamBufSize = pop->bitstreamBufferSize; + pDecInfo->streamBufEndAddr = + pop->bitstreamBuffer + pop->bitstreamBufferSize; + JpuWriteReg(MJPEG_BBC_BAS_ADDR_REG, pDecInfo->streamBufStartAddr); + JpuWriteReg(MJPEG_BBC_END_ADDR_REG, pDecInfo->streamBufEndAddr); + JpuWriteReg(MJPEG_BBC_RD_PTR_REG, pDecInfo->streamRdPtr); + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, pDecInfo->streamWrPtr); + JpuWriteReg(MJPEG_BBC_STRM_CTRL_REG, 0); + + pDecInfo->pBitStream = pop->pBitStream; + + pDecInfo->streamEndian = pop->streamEndian; + pDecInfo->frameEndian = pop->frameEndian; + pDecInfo->chromaInterleave = pop->chromaInterleave; + pDecInfo->packedFormat = pop->packedFormat; + pDecInfo->roiEnable = pop->roiEnable; + pDecInfo->roiWidth = pop->roiWidth; + pDecInfo->roiHeight = pop->roiHeight; + pDecInfo->roiOffsetX = pop->roiOffsetX; + pDecInfo->roiOffsetY = pop->roiOffsetY; + + pDecInfo->dst_type = pop->dst_type; + memcpy(&pDecInfo->dst_info, &pop->dst_info, sizeof(FrameBuffer)); + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecClose(JpgDecHandle handle) +{ + JpgInst *pJpgInst = handle; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + FreeJpgInstance(pJpgInst); + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecGetInitialInfo(JpgDecHandle handle, JpgDecInitialInfo *info) +{ + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + if (info == 0) { + return JPG_RET_INVALID_PARAM; + } + pDecInfo = &pJpgInst->JpgInfo.decInfo; + + if (JpegDecodeHeader(pDecInfo) <= 0) { + JLOG(ERR, "Failed to call JpegDecodeHeader()!"); + return JPG_RET_FAILURE; + } + + if (pDecInfo->picWidth < 16 || pDecInfo->picHeight < 16) { + JLOG(ERR, + "The picture is too small or damaged bitstream, width=%d,height=%d\n", + pDecInfo->picWidth, pDecInfo->picHeight); + return JPG_RET_INVALID_PARAM; + } + info->picWidth = pDecInfo->picWidth; + info->picHeight = pDecInfo->picHeight; + info->minFrameBufferCount = 1; + info->sourceFormat = pDecInfo->format; + info->ecsPtr = pDecInfo->ecsPtr; + + pDecInfo->initialInfoObtained = 1; + pDecInfo->minFrameBufferNum = 1; + +#ifdef MJPEG_ERROR_CONCEAL + pDecInfo->curRstIdx = 0; + pDecInfo->nextRstIdx = -1; +#endif + + if ((pDecInfo->packedFormat == PACKED_FORMAT_444) && + (pDecInfo->format != FORMAT_444)) { + JLOG(ERR, "Invalid packed format 444!"); + return JPG_RET_INVALID_PARAM; + } + + if (pDecInfo->roiEnable) { + pDecInfo->roiMcuWidth = pDecInfo->roiWidth / pDecInfo->mcuWidth; + pDecInfo->roiMcuHeight = + pDecInfo->roiHeight / pDecInfo->mcuHeight; + pDecInfo->roiMcuOffsetX = + pDecInfo->roiOffsetX / pDecInfo->mcuWidth; + pDecInfo->roiMcuOffsetY = + pDecInfo->roiOffsetY / pDecInfo->mcuHeight; + + if ((pDecInfo->roiOffsetX > pDecInfo->alignedWidth) || + (pDecInfo->roiOffsetY > pDecInfo->alignedHeight) || + (pDecInfo->roiOffsetX + pDecInfo->roiWidth > + pDecInfo->alignedWidth) || + (pDecInfo->roiOffsetY + pDecInfo->roiHeight > + pDecInfo->alignedHeight)) + return JPG_RET_INVALID_PARAM; + + if (((pDecInfo->roiOffsetX + pDecInfo->roiWidth) < + pDecInfo->mcuWidth) || + ((pDecInfo->roiOffsetY + pDecInfo->roiHeight) < + pDecInfo->mcuHeight)) + return JPG_RET_INVALID_PARAM; + + info->roiFrameWidth = + pDecInfo->roiMcuWidth * pDecInfo->mcuWidth; + info->roiFrameHeight = + pDecInfo->roiMcuHeight * pDecInfo->mcuHeight; + info->roiFrameOffsetX = + pDecInfo->roiMcuOffsetX * pDecInfo->mcuWidth; + info->roiFrameOffsetY = + pDecInfo->roiMcuOffsetY * pDecInfo->mcuHeight; + info->roiMCUSize = pDecInfo->mcuWidth; + } + info->colorComponents = pDecInfo->compNum; + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecRegisterFrameBuffer(JpgDecHandle handle, FrameBuffer *bufArray, + int num, int stride) +{ + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + pDecInfo = &pJpgInst->JpgInfo.decInfo; + + if (!pDecInfo->initialInfoObtained) { + return JPG_RET_WRONG_CALL_SEQUENCE; + } + + if (bufArray == 0) { + return JPG_RET_INVALID_FRAME_BUFFER; + } + + if (num < pDecInfo->minFrameBufferNum) { + return JPG_RET_INSUFFICIENT_FRAME_BUFFERS; + } + if (pDecInfo->usePartial && pDecInfo->bufNum == 0) { + return JPG_RET_INSUFFICIENT_FRAME_BUFFERS; + } + if (pDecInfo->usePartial && num < pDecInfo->bufNum) { + return JPG_RET_INSUFFICIENT_FRAME_BUFFERS; + } + + if (!pDecInfo->roiEnable) { + if (stride < (pDecInfo->picWidth >> 3) || stride % 8 != 0) + return JPG_RET_INVALID_STRIDE; + } + + pDecInfo->frameBufPool = bufArray; + pDecInfo->numFrameBuffers = num; + pDecInfo->stride = stride; + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecGetBitstreamBuffer(JpgDecHandle handle, PhysicalAddress *prdPtr, + PhysicalAddress *pwrPtr, int *size) +{ + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo; + JpgRet ret; + PhysicalAddress rdPtr; + PhysicalAddress wrPtr; + int room; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + if (prdPtr == 0 || pwrPtr == 0 || size == 0) { + return JPG_RET_INVALID_PARAM; + } + + pDecInfo = &pJpgInst->JpgInfo.decInfo; + + if (GetJpgPendingInst() == pJpgInst) { + rdPtr = JpuReadReg(MJPEG_BBC_RD_PTR_REG); + rdPtr = jdi_get_memory_addr_high(rdPtr); + } else { + rdPtr = pDecInfo->streamRdPtr; + } + + wrPtr = pDecInfo->streamWrPtr; + + if (wrPtr == pDecInfo->streamBufStartAddr) { + if (pDecInfo->frameOffset == 0) + room = (pDecInfo->streamBufEndAddr - + pDecInfo->streamBufStartAddr); + else + room = (pDecInfo->frameOffset); + } else { + room = (pDecInfo->streamBufEndAddr - wrPtr); + } + + room = ((room >> 9) << 9); // multiple of 512 + + *prdPtr = rdPtr; + *pwrPtr = wrPtr; + + *size = room; + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecUpdateBitstreamBuffer(JpgDecHandle handle, int size) +{ + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo; + PhysicalAddress wrPtr; + PhysicalAddress rdPtr; + JpgRet ret; + int val = 0; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + pDecInfo = &pJpgInst->JpgInfo.decInfo; + wrPtr = pDecInfo->streamWrPtr; + + if (size == 0) { + val = (wrPtr - pDecInfo->streamBufStartAddr) >> 8; + if ((wrPtr - pDecInfo->streamBufStartAddr) % 256) + val = val + 1; + if (GetJpgPendingInst() == pJpgInst) + JpuWriteReg(MJPEG_BBC_STRM_CTRL_REG, (1 << 31 | val)); + pDecInfo->streamEndflag = 1; + return JPG_RET_SUCCESS; + } + + JpgSetClockGate(1); + + wrPtr = pDecInfo->streamWrPtr; + wrPtr += size; + + if (wrPtr == pDecInfo->streamBufEndAddr) { + wrPtr = pDecInfo->streamBufStartAddr; + } + + pDecInfo->streamWrPtr = wrPtr; + + if (GetJpgPendingInst() == pJpgInst) { + rdPtr = JpuReadReg(MJPEG_BBC_RD_PTR_REG); + rdPtr = jdi_get_memory_addr_high(rdPtr); + if (rdPtr == pDecInfo->streamBufEndAddr) { + JpuWriteReg(MJPEG_BBC_CUR_POS_REG, 0); + JpuWriteReg(MJPEG_GBU_TT_CNT_REG, 0); + JpuWriteReg(MJPEG_GBU_TT_CNT_REG + 4, 0); + } + + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, wrPtr); + if (wrPtr == pDecInfo->streamBufStartAddr) + JpuWriteReg(MJPEG_BBC_END_ADDR_REG, + pDecInfo->streamBufEndAddr); + else + JpuWriteReg(MJPEG_BBC_END_ADDR_REG, wrPtr); + } else { + rdPtr = pDecInfo->streamRdPtr; + } + + pDecInfo->streamRdPtr = rdPtr; + + JpgSetClockGate(0); + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecIssueStop(JpgDecHandle handle) +{ + JpgInst *pJpgInst = handle; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + if (pJpgInst != GetJpgPendingInst()) { + return JPG_RET_WRONG_CALL_SEQUENCE; + } + + JpgSetClockGate(1); + JpuWriteReg(MJPEG_PIC_START_REG, 1 << JPG_START_STOP); + JpgSetClockGate(0); + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecCompleteStop(JpgDecHandle handle) +{ + JpgInst *pJpgInst = handle; + JpgRet ret; + Uint32 val; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + if (pJpgInst != GetJpgPendingInst()) { + return JPG_RET_WRONG_CALL_SEQUENCE; + } + + JpgSetClockGate(1); + val = JpuReadReg(MJPEG_PIC_STATUS_REG); + + if (val & (1 << INT_JPU_BIT_BUF_STOP)) { + SetJpgPendingInst(0); + JpgSetClockGate(0); + } else { + JpgSetClockGate(0); + return JPG_RET_WRONG_CALL_SEQUENCE; + } + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecSetRdPtr(JpgDecHandle handle, PhysicalAddress addr, + int updateWrPtr) +{ + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + pDecInfo = &pJpgInst->JpgInfo.decInfo; + + if (GetJpgPendingInst()) { + JLOG(ERR, "Frame is not complete!"); + return JPG_RET_FRAME_NOT_COMPLETE; + } + + pDecInfo->streamRdPtr = addr; + if (updateWrPtr) + pDecInfo->streamWrPtr = addr; + + pDecInfo->frameOffset = addr - pDecInfo->streamBufStartAddr; + pDecInfo->consumeByte = 0; + + JpuWriteReg(MJPEG_BBC_RD_PTR_REG, pDecInfo->streamRdPtr); + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_DecStartOneFrame(JpgDecHandle handle, JpgDecParam *param) +{ + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo; + Uint32 rotMir; + JpgRet ret; + Int32 val; + int i; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, "Failed to call CheckJpgInstValidity()!"); + return ret; + } + + pDecInfo = &pJpgInst->JpgInfo.decInfo; + + if (pDecInfo->frameBufPool == 0 && + pDecInfo->dst_type != 3) { // This means frame buffers have not + // been registered. + JLOG(ERR, "Wrong call sequence!"); + return JPG_RET_WRONG_CALL_SEQUENCE; + } + + rotMir = 0; + if (pDecInfo->rotationEnable) { + rotMir |= 0x10; // Enable rotator + switch (pDecInfo->rotationAngle) { + case 0: + rotMir |= 0x0; + break; + case 90: + rotMir |= 0x1; + break; + case 180: + rotMir |= 0x2; + break; + case 270: + rotMir |= 0x3; + break; + } + } + + if (pDecInfo->mirrorEnable) { + rotMir |= 0x10; // Enable rotator + switch (pDecInfo->mirrorDirection) { + case MIRDIR_NONE: + rotMir |= 0x0; + break; + case MIRDIR_VER: + rotMir |= 0x4; + break; + case MIRDIR_HOR: + rotMir |= 0x8; + break; + case MIRDIR_HOR_VER: + rotMir |= 0xc; + break; + } + } + + if (GetJpgPendingInst()) { + JLOG(ERR, "Frame is not complete!"); + ret = JPG_RET_FRAME_NOT_COMPLETE; + goto fail; + } + +#ifdef MJPEG_ERROR_CONCEAL + // Error Concealment + if (pDecInfo->errInfo.bError) { + // error conceal main function + val = JpegDecodeConcealError(pDecInfo); + if (val == -1) { + // stream buffer wrap around in error cases. + pDecInfo->frameOffset = 0; + pDecInfo->nextOffset = 0; + + // end of stream + if (pDecInfo->streamEndflag == 1) { + pDecInfo->frameOffset = -1; + SetJpgPendingInst(pJpgInst); + JLOG(ERR, "End of stream!"); + return JPG_RET_EOS; + } + + // request data + JLOG(ERR, "Bitstream is empty!"); + ret = JPG_RET_BIT_EMPTY; + goto fail; + } + + // init GBU + JpuWriteReg(MJPEG_GBU_TT_CNT_REG, 0); + JpuWriteReg(MJPEG_GBU_TT_CNT_REG + 4, 0); + + JpuWriteReg( + MJPEG_PIC_CTRL_REG, + pDecInfo->huffAcIdx << 10 | pDecInfo->huffDcIdx << 7 | + pDecInfo->userHuffTab << 6 | + (JPU_CHECK_WRITE_RESPONSE_BVALID_SIGNAL << 2) | + 0); + JpuWriteReg(MJPEG_MCU_INFO_REG, + pDecInfo->mcuBlockNum << 16 | + pDecInfo->compNum << 12 | + pDecInfo->compInfo[0] << 8 | + pDecInfo->compInfo[1] << 4 | + pDecInfo->compInfo[2]); + JpuWriteReg(MJPEG_RST_INTVAL_REG, pDecInfo->rstIntval); + + JpgDecGramSetup(pDecInfo); + + JpuWriteReg(MJPEG_DPCM_DIFF_Y_REG, 0); + JpuWriteReg(MJPEG_DPCM_DIFF_CB_REG, 0); + JpuWriteReg(MJPEG_DPCM_DIFF_CR_REG, 0); + + JpuWriteReg(MJPEG_GBU_FF_RPTR_REG, pDecInfo->bitPtr); + JpuWriteReg(MJPEG_GBU_CTRL_REG, 3); + + val = (pDecInfo->setPosX << 16) | (pDecInfo->setPosY); + JpuWriteReg(MJPEG_PIC_SETMB_REG, val); + JpuWriteReg(MJPEG_PIC_START_REG, (1 << JPG_START_PIC)); + + SetJpgPendingInst(pJpgInst); + return JPG_RET_SUCCESS; + } +#endif + + if (pDecInfo->frameOffset < 0) { + SetJpgPendingInst(pJpgInst); + JLOG(ERR, "End of stream!"); + return JPG_RET_EOS; + } + + val = JpegDecodeHeader(pDecInfo); + if (val == 0) { + JLOG(ERR, "Failed to call JpegDecodeHeader()! ret=%d", + (int)val); + ret = JPG_RET_FAILURE; + goto fail; + } + + if (val == -2) { // wrap around case + pDecInfo->frameOffset = 0; + pDecInfo->ecsPtr = 0; +#ifdef MJPEG_ERROR_CONCEAL + pDecInfo->nextOffset = 0; +#endif + val = JpegDecodeHeader(pDecInfo); + if (val == 0) { + JLOG(ERR, "Failed to call JpegDecodeHeader()!"); + ret = JPG_RET_FAILURE; + goto fail; + } + } + + if (val == -1) { // stream empty case + if (pDecInfo->streamEndflag == 1) { + SetJpgPendingInst(pJpgInst); + pDecInfo->frameOffset = -1; + JLOG(WARN, "End of stream!"); + return JPG_RET_EOS; + } + + JLOG(ERR, "Bitstream is empty!"); + ret = JPG_RET_BIT_EMPTY; + goto fail; + } + + if (pDecInfo->streamRdPtr == pDecInfo->streamBufEndAddr) { + JpuWriteReg(MJPEG_BBC_CUR_POS_REG, 0); + JpuWriteReg(MJPEG_GBU_TT_CNT_REG, 0); + JpuWriteReg(MJPEG_GBU_TT_CNT_REG + 4, 0); + } + + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, pDecInfo->streamWrPtr); + if (pDecInfo->streamWrPtr == pDecInfo->streamBufStartAddr) + JpuWriteReg(MJPEG_BBC_END_ADDR_REG, pDecInfo->streamBufEndAddr); + else + JpuWriteReg(MJPEG_BBC_END_ADDR_REG, pDecInfo->streamWrPtr); + + JpuWriteReg(MJPEG_BBC_BAS_ADDR_REG, pDecInfo->streamBufStartAddr); + // JpuWriteReg(MJPEG_BBC_END_ADDR_REG, pDecInfo->streamWrPtr); + + if (pDecInfo->streamEndflag == 1) { + val = JpuReadReg(MJPEG_BBC_STRM_CTRL_REG); + if ((val & (1 << 31)) == 0) { + val = (pDecInfo->streamWrPtr - + pDecInfo->streamBufStartAddr) / + 256; + if ((pDecInfo->streamWrPtr - + pDecInfo->streamBufStartAddr) % + 256) + val = val + 1; + + JpuWriteReg(MJPEG_BBC_STRM_CTRL_REG, (1 << 31 | val)); + } + } else { + JpuWriteReg(MJPEG_BBC_STRM_CTRL_REG, 0); + } + + JpuWriteReg(MJPEG_GBU_TT_CNT_REG, 0); + JpuWriteReg(MJPEG_GBU_TT_CNT_REG + 4, 0); + JpuWriteReg(MJPEG_PIC_ERRMB_REG, 0); + JpuWriteReg(MJPEG_PIC_CTRL_REG, + pDecInfo->huffAcIdx << 10 | pDecInfo->huffDcIdx << 7 | + pDecInfo->userHuffTab << 6 | + (JPU_CHECK_WRITE_RESPONSE_BVALID_SIGNAL << 2) | + pDecInfo->usePartial); + + JpuWriteReg(MJPEG_PIC_SIZE_REG, + (pDecInfo->alignedWidth << 16) | pDecInfo->alignedHeight); + JpuWriteReg(MJPEG_ROT_INFO_REG, 0); + JpuWriteReg(MJPEG_OP_INFO_REG, pDecInfo->lineNum << 16 | + pDecInfo->bufNum << 3 | + pDecInfo->busReqNum); + JpuWriteReg(MJPEG_MCU_INFO_REG, + pDecInfo->mcuBlockNum << 16 | pDecInfo->compNum << 12 | + pDecInfo->compInfo[0] << 8 | + pDecInfo->compInfo[1] << 4 | pDecInfo->compInfo[2]); + + if (pDecInfo->packedFormat == PACKED_FORMAT_NONE) + JpuWriteReg(MJPEG_DPB_CONFIG_REG, + (pDecInfo->frameEndian << 6) | (0 << 5) | (0 << 4) | + ((pDecInfo->chromaInterleave == 0) ? 0 : + (pDecInfo->chromaInterleave == 1) ? 2 : + 3)); + else if (pDecInfo->packedFormat == PACKED_FORMAT_444) + JpuWriteReg(MJPEG_DPB_CONFIG_REG, + (pDecInfo->frameEndian << 6) | (1 << 5) | (0 << 4) | + (0 << 2) | + ((pDecInfo->chromaInterleave == 0) ? 0 : + (pDecInfo->chromaInterleave == 1) ? 2 : + 3)); + else + JpuWriteReg(MJPEG_DPB_CONFIG_REG, + (pDecInfo->frameEndian << 6) | (0 << 5) | (1 << 4) | + ((pDecInfo->packedFormat - 1) << 2) | + ((pDecInfo->chromaInterleave == 0) ? 0 : + (pDecInfo->chromaInterleave == 1) ? 2 : + 3)); + + JpuWriteReg(MJPEG_RST_INTVAL_REG, pDecInfo->rstIntval); + + if (param) { + if (param->scaleDownRatioWidth > 0) + pDecInfo->iHorScaleMode = param->scaleDownRatioWidth; + if (param->scaleDownRatioHeight > 0) + pDecInfo->iVerScaleMode = param->scaleDownRatioHeight; + } + if (pDecInfo->iHorScaleMode | pDecInfo->iVerScaleMode) + val = ((pDecInfo->iHorScaleMode & 0x3) << 2) | + ((pDecInfo->iVerScaleMode & 0x3)) | 0x10; + else + val = 0; + JpuWriteReg(MJPEG_SCL_INFO_REG, val); + + if (pDecInfo->userHuffTab) { + if (!JpgDecHuffTabSetUp(pDecInfo)) { + JLOG(ERR, "Failed to setup HuffTab!"); + ret = JPG_RET_INVALID_PARAM; + goto fail; + } + } + + if (!JpgDecQMatTabSetUp(pDecInfo)) { + JLOG(ERR, "Failed to setup QMatTab!"); + ret = JPG_RET_INVALID_PARAM; + goto fail; + } + + JpgDecGramSetup(pDecInfo); + + JpuWriteReg(MJPEG_RST_INDEX_REG, 0); // RST index at the beginning. + JpuWriteReg(MJPEG_RST_COUNT_REG, 0); + + JpuWriteReg(MJPEG_DPCM_DIFF_Y_REG, 0); + JpuWriteReg(MJPEG_DPCM_DIFF_CB_REG, 0); + JpuWriteReg(MJPEG_DPCM_DIFF_CR_REG, 0); + + JpuWriteReg(MJPEG_GBU_FF_RPTR_REG, pDecInfo->bitPtr); + JpuWriteReg(MJPEG_GBU_CTRL_REG, 3); + + JpuWriteReg(MJPEG_ROT_INFO_REG, rotMir); + + if (rotMir & 1) { + pDecInfo->format = + (pDecInfo->format == FORMAT_422) ? FORMAT_224 : + (pDecInfo->format == FORMAT_224) ? FORMAT_422 : + pDecInfo->format; + } + + if (rotMir & 0x10) { + JpuWriteReg(MJPEG_DPB_BASE00_REG, pDecInfo->rotatorOutput.bufY); + JpuWriteReg(MJPEG_DPB_BASE01_REG, + pDecInfo->rotatorOutput.bufCb); + JpuWriteReg(MJPEG_DPB_BASE02_REG, + pDecInfo->rotatorOutput.bufCr); + } else if (pDecInfo->usePartial) { + val = (pDecInfo->frameIdx % + (pDecInfo->numFrameBuffers / pDecInfo->bufNum)); + for (i = 0; i < pDecInfo->bufNum; i++) { + JpuWriteReg( + MJPEG_DPB_BASE00_REG + (i * 12), + pDecInfo->frameBufPool[(val * pDecInfo->bufNum) + + i] + .bufY); + JpuWriteReg( + MJPEG_DPB_BASE01_REG + (i * 12), + pDecInfo->frameBufPool[(val * pDecInfo->bufNum) + + i] + .bufCb); + JpuWriteReg( + MJPEG_DPB_BASE02_REG + (i * 12), + pDecInfo->frameBufPool[(val * pDecInfo->bufNum) + + i] + .bufCr); + } + } else { +#ifdef LIBCVIJPULITE + JpuWriteReg(MJPEG_DPB_BASE00_REG, pDecInfo->rotatorOutput.bufY); + JpuWriteReg(MJPEG_DPB_BASE01_REG, + pDecInfo->rotatorOutput.bufCb); + JpuWriteReg(MJPEG_DPB_BASE02_REG, + pDecInfo->rotatorOutput.bufCr); +#else + if (pDecInfo->dst_type == 3) { + JpuWriteReg(MJPEG_DPB_BASE00_REG, + pDecInfo->dst_info.bufY); + JpuWriteReg(MJPEG_DPB_BASE01_REG, + pDecInfo->dst_info.bufCb); + JpuWriteReg(MJPEG_DPB_BASE02_REG, + pDecInfo->dst_info.bufCr); + } else { + val = (pDecInfo->frameIdx % pDecInfo->numFrameBuffers); + + JpuWriteReg(MJPEG_DPB_BASE00_REG, + pDecInfo->frameBufPool[val].bufY); + JpuWriteReg(MJPEG_DPB_BASE01_REG, + pDecInfo->frameBufPool[val].bufCb); + JpuWriteReg(MJPEG_DPB_BASE02_REG, + pDecInfo->frameBufPool[val].bufCr); + } +#endif + } + + if (pDecInfo->rotationEnable) { + JpuWriteReg(MJPEG_DPB_YSTRIDE_REG, pDecInfo->rotatorStride); + + val = (pDecInfo->format == FORMAT_420 || + pDecInfo->format == FORMAT_422 || + pDecInfo->format == FORMAT_400) ? + 2 : + 1; + if (pDecInfo->chromaInterleave) + JpuWriteReg(MJPEG_DPB_CSTRIDE_REG, + (pDecInfo->rotatorStride / (int)val) * 2); + else + JpuWriteReg(MJPEG_DPB_CSTRIDE_REG, + pDecInfo->rotatorStride / (int)val); + } else { + JpuWriteReg(MJPEG_DPB_YSTRIDE_REG, pDecInfo->stride); + + val = (pDecInfo->format == FORMAT_420 || + pDecInfo->format == FORMAT_422 || + pDecInfo->format == FORMAT_400) ? + 2 : + 1; + if (pDecInfo->chromaInterleave) + JpuWriteReg(MJPEG_DPB_CSTRIDE_REG, + (pDecInfo->stride / (int)val) * 2); + else + JpuWriteReg(MJPEG_DPB_CSTRIDE_REG, + pDecInfo->stride / (int)val); + } + if (pDecInfo->roiEnable) { + JpuWriteReg(MJPEG_CLP_INFO_REG, 1); + JpuWriteReg(MJPEG_CLP_BASE_REG, + pDecInfo->roiOffsetX << 16 | + pDecInfo->roiOffsetY); // pixel unit + JpuWriteReg(MJPEG_CLP_SIZE_REG, + (pDecInfo->roiMcuWidth * pDecInfo->mcuWidth) << 16 | + (pDecInfo->roiMcuHeight * + pDecInfo->mcuHeight)); // pixel Unit + } else { + JpuWriteReg(MJPEG_CLP_INFO_REG, 0); + } + + if (pJpgInst->loggingEnable) + jdi_log(JDI_LOG_CMD_PICRUN, 1); + + JpuWriteReg(MJPEG_PIC_STATUS_REG, JpuReadReg(MJPEG_PIC_STATUS_REG)); + + pJpgInst->u64StartTime = jpgGetCurrentTime(); + + JpuWriteReg(MJPEG_PIC_START_REG, (1 << JPG_START_PIC)); + + SetJpgPendingInst(pJpgInst); + + return JPG_RET_SUCCESS; + +fail: + return ret; +} + +JpgRet JPU_DecGetOutputInfo(JpgDecHandle handle, JpgDecOutputInfo *info) +{ + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo; + JpgRet ret; + Uint32 val = 0; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, "CheckJpgInstValidity failed!"); + goto fail; + } + + if (info == 0) { + JLOG(ERR, "Invalid parameter: info is NULL!"); + ret = JPG_RET_INVALID_PARAM; + goto fail; + } + + pDecInfo = &pJpgInst->JpgInfo.decInfo; + + val = JpuReadReg(MJPEG_PIC_STATUS_REG); + + if (pJpgInst != GetJpgPendingInst()) { + ret = JPG_RET_WRONG_CALL_SEQUENCE; + goto fail; + } + + if (pDecInfo->frameOffset < 0) { + info->numOfErrMBs = 0; + info->decodingSuccess = 1; +#ifndef LIBCVIJPULITE + info->indexFrameDisplay = -1; +#endif + ret = JPG_RET_SUCCESS; // TODO + goto fail; + } + + if (pDecInfo->roiEnable) { + info->decPicWidth = pDecInfo->roiMcuWidth * pDecInfo->mcuWidth; + info->decPicHeight = + pDecInfo->roiMcuHeight * pDecInfo->mcuHeight; + } else { + info->decPicWidth = pDecInfo->alignedWidth; + info->decPicHeight = pDecInfo->alignedHeight; + } + + info->decPicWidth >>= pDecInfo->iHorScaleMode; + info->decPicHeight >>= pDecInfo->iVerScaleMode; + +#ifndef LIBCVIJPULITE + if (pDecInfo->numFrameBuffers) { + info->indexFrameDisplay = + (pDecInfo->frameIdx % pDecInfo->numFrameBuffers); + } else { + info->indexFrameDisplay = 0; + } +#endif + +#ifdef MJPEG_ERROR_CONCEAL + info->consumedByte = pDecInfo->gbuStartPtr + + ((JpuReadReg(MJPEG_GBU_TT_CNT_REG)) >> 3); +#else + info->consumedByte = ((JpuReadReg(MJPEG_GBU_TT_CNT_REG)) >> 3); +#endif + pDecInfo->streamRdPtr = + jdi_get_memory_addr_high(JpuReadReg(MJPEG_BBC_RD_PTR_REG)); + pDecInfo->consumeByte = info->consumedByte - 16 - pDecInfo->ecsPtr; + info->bytePosFrameStart = pDecInfo->frameOffset; + info->ecsPtr = pDecInfo->ecsPtr; + + pDecInfo->ecsPtr = 0; + pDecInfo->frameIdx++; + + val = JpuReadReg(MJPEG_PIC_STATUS_REG); + if (val & (1 << INT_JPU_DONE)) { + info->decodingSuccess = 1; + info->numOfErrMBs = 0; + +#ifdef MJPEG_ERROR_CONCEAL + pDecInfo->errInfo.bError = 0; + pDecInfo->nextOffset = 0; + pDecInfo->gbuStartPtr = 0; +#endif + } else if (val & (1 << INT_JPU_ERROR)) { + info->numOfErrMBs = JpuReadReg(MJPEG_PIC_ERRMB_REG); + info->decodingSuccess = 0; + +#ifdef MJPEG_ERROR_CONCEAL + // info->numOfErrMBs = JpuReadReg(MJPEG_PIC_ERRMB_REG); + pDecInfo->errInfo.bError = 1; + pDecInfo->errInfo.errPosY = info->numOfErrMBs & 0xFFF; + pDecInfo->errInfo.errPosX = (info->numOfErrMBs >> 12) & 0xFFF; + + // set search point to find next rstMarker from origin of frame + // buffer by host + pDecInfo->nextOffset = (info->consumedByte) & (~7); + + // prevent to find same position. + if (pDecInfo->currOffset == pDecInfo->nextOffset) + pDecInfo->nextOffset += JPU_GBU_SIZE; +#endif + } + + if (val != 0) + JpuWriteReg(MJPEG_PIC_STATUS_REG, val); + + JpuWriteReg(MJPEG_INTR_MASK_REG, 0x0); + + if (pJpgInst->loggingEnable) + jdi_log(JDI_LOG_CMD_PICRUN, 0); + +fail: +#if defined(LIBCVIJPULITE) + /* To fix the bug affecting the following encoding, + * Initialize the internal status of JPU at the end of decoding. */ + JPU_InitCodecStatus(); +#endif + + ClearJpgPendingInst(); + + return ret; +} + +JpgRet JPU_DecGiveCommand(JpgDecHandle handle, JpgCommand cmd, void *param) +{ + JpgInst *pJpgInst = handle; + JpgDecInfo *pDecInfo; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + pDecInfo = &pJpgInst->JpgInfo.decInfo; + switch (cmd) { + case ENABLE_JPG_ROTATION: { + if (pDecInfo->roiEnable) { + return JPG_RET_INVALID_PARAM; + } + /* + if (pDecInfo->rotatorStride == 0) { + return JPG_RET_ROTATOR_STRIDE_NOT_SET; + } */ + pDecInfo->rotationEnable = 1; + break; + } + case DISABLE_JPG_ROTATION: { + pDecInfo->rotationEnable = 0; + break; + } + case ENABLE_JPG_MIRRORING: { + /* if (pDecInfo->rotatorStride == 0) { + return JPG_RET_ROTATOR_STRIDE_NOT_SET; + } */ + pDecInfo->mirrorEnable = 1; + break; + } + case DISABLE_JPG_MIRRORING: { + pDecInfo->mirrorEnable = 0; + break; + } + case SET_JPG_MIRROR_DIRECTION: { + JpgMirrorDirection mirDir; + + if (param == 0) { + return JPG_RET_INVALID_PARAM; + } + mirDir = *(JpgMirrorDirection *)param; + if (!(MIRDIR_NONE <= mirDir && mirDir <= MIRDIR_HOR_VER)) { + return JPG_RET_INVALID_PARAM; + } + pDecInfo->mirrorDirection = mirDir; + + break; + } + case SET_JPG_ROTATION_ANGLE: { + int angle; + + if (param == 0) { + return JPG_RET_INVALID_PARAM; + } + + angle = *(int *)param; + if (angle != 0 && angle != 90 && angle != 180 && angle != 270) { + return JPG_RET_INVALID_PARAM; + } + + pDecInfo->rotationAngle = angle; + break; + } + case SET_JPG_ROTATOR_OUTPUT: { + FrameBuffer *frame; + + if (param == 0) { + return JPG_RET_INVALID_PARAM; + } + frame = (FrameBuffer *)param; + pDecInfo->rotatorOutput = *frame; + pDecInfo->rotatorOutputValid = 1; + break; + } + case SET_JPG_ROTATOR_STRIDE: { + int stride; + + if (param == 0) { + return JPG_RET_INVALID_PARAM; + } + stride = *(int *)param; + if (stride % 8 != 0 || stride == 0) { + return JPG_RET_INVALID_STRIDE; + } + + if (pDecInfo->rotationAngle == 90 || + pDecInfo->rotationAngle == 270) { + if (pDecInfo->alignedHeight > stride) { + return JPG_RET_INVALID_STRIDE; + } + } else { + if (pDecInfo->alignedWidth > stride) { + return JPG_RET_INVALID_STRIDE; + } + } + pDecInfo->rotatorStride = stride; + break; + } + case SET_JPG_SCALE_HOR: { + int scale; + scale = *(int *)param; +#ifndef MJPEG_INTERFACE_API + if (pDecInfo->alignedWidth < 128 || + pDecInfo->alignedHeight < 128) { + if (scale) { + return JPG_RET_INVALID_PARAM; + } + } +#endif // MJPEG_INTERFACE_API + pDecInfo->iHorScaleMode = scale; + break; + } + case SET_JPG_SCALE_VER: { + int scale; + scale = *(int *)param; +#ifndef MJPEG_INTERFACE_API + if (pDecInfo->alignedWidth < 128 || + pDecInfo->alignedHeight < 128) { + if (scale) { + return JPG_RET_INVALID_PARAM; + } + } +#endif // MJPEG_INTERFACE_API + pDecInfo->iVerScaleMode = scale; + break; + } + case SET_JPG_USE_PARTIAL_MODE: { + int enable; + enable = *(int *)param; + pDecInfo->usePartial = enable; + + break; + } + case SET_JPG_PARTIAL_FRAME_NUM: { + int frame; + + if (pDecInfo->stride != 0) { + return JPG_RET_WRONG_CALL_SEQUENCE; + } + + frame = *(int *)param; + pDecInfo->bufNum = frame; + + break; + } + case SET_JPG_PARTIAL_LINE_NUM: { + int line; + + if (pDecInfo->stride != 0) { + return JPG_RET_WRONG_CALL_SEQUENCE; + } + line = *(int *)param; + pDecInfo->lineNum = line; + + break; + } + case ENABLE_LOGGING: { + pJpgInst->loggingEnable = 1; + } break; + case DISABLE_LOGGING: { + pJpgInst->loggingEnable = 0; + } break; + default: + return JPG_RET_INVALID_COMMAND; + } + return JPG_RET_SUCCESS; +} + +JpgRet JPU_EncOpen(JpgEncHandle *pHandle, JpgEncOpenParam *pop) +{ + JpgInst *pJpgInst; + JpgEncInfo *pEncInfo; +#if !defined(LIBCVIJPULITE) + int frameFormat; +#endif + JpgRet ret; + int i; +#ifdef DUMP_JPU_REGS + JPU_Print_Reg_Status(2); +#endif + ret = CheckJpgEncOpenParam(pop); + if (ret != JPG_RET_SUCCESS) { + CVI_JPG_DBG_ERR("CheckJpgEncOpenParam\n"); + return ret; + } + + ret = GetJpgInstance(&pJpgInst); + if (ret == JPG_RET_FAILURE) { + CVI_JPG_DBG_ERR("GetJpgInstance\n"); + *pHandle = 0; + return JPG_RET_FAILURE; + } + + CVI_JPG_DBG_INFO("JPU_EncOpen inst = %d\n", pJpgInst->instIndex); + *pHandle = pJpgInst; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + memset(pEncInfo, 0x00, sizeof(JpgEncInfo)); + pEncInfo->openParam = *pop; + pEncInfo->streamRdPtr = pop->bitstreamBuffer; + pEncInfo->streamWrPtr = pop->bitstreamBuffer; + + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, pEncInfo->streamWrPtr); + pEncInfo->streamBufStartAddr = pop->bitstreamBuffer; + pEncInfo->streamBufSize = pop->bitstreamBufferSize; + pEncInfo->streamBufEndAddr = + pop->bitstreamBuffer + pop->bitstreamBufferSize; + pEncInfo->streamEndian = pop->streamEndian; + pEncInfo->frameEndian = pop->frameEndian; + pEncInfo->chromaInterleave = pop->chromaInterleave; + + pEncInfo->sourceFormat = pEncInfo->openParam.sourceFormat; + pEncInfo->picWidth = pEncInfo->openParam.picWidth; + pEncInfo->picHeight = pEncInfo->openParam.picHeight; + + // Picture size alignment + if (pEncInfo->sourceFormat == FORMAT_420 || + pEncInfo->sourceFormat == FORMAT_422) + pEncInfo->alignedWidth = ((pEncInfo->picWidth + 15) >> 4) << 4; + else + pEncInfo->alignedWidth = ((pEncInfo->picWidth + 7) >> 3) << 3; + + if (pEncInfo->sourceFormat == FORMAT_420 || + pEncInfo->sourceFormat == FORMAT_224) + pEncInfo->alignedHeight = ((pEncInfo->picHeight + 15) >> 4) + << 4; + else + pEncInfo->alignedHeight = ((pEncInfo->picHeight + 7) >> 3) << 3; + + pEncInfo->rstIntval = pEncInfo->openParam.restartInterval; + +#if defined(LIBCVIJPULITE) + for (i = 0; i < 4; i++) { + pEncInfo->pHuffVal[i] = pEncInfo->openParam.huffVal[i]; + pEncInfo->pHuffBits[i] = pEncInfo->openParam.huffBits[i]; + pEncInfo->pQMatTab[i] = pEncInfo->openParam.qMatTab[i]; + pEncInfo->pCInfoTab[i] = pEncInfo->openParam.cInfoTab[i]; + } +#else + for (i = 0; i < 4; i++) + pEncInfo->pHuffVal[i] = pEncInfo->openParam.huffVal[i]; + for (i = 0; i < 4; i++) + pEncInfo->pHuffBits[i] = pEncInfo->openParam.huffBits[i]; + for (i = 0; i < 4; i++) + pEncInfo->pQMatTab[i] = pEncInfo->openParam.qMatTab[i]; + +#if 0 + frameFormat = pEncInfo->sourceFormat; + if (pEncInfo->rotationEnable && + (pEncInfo->rotationAngle == 90 || pEncInfo->rotationAngle == 270)) { + if (frameFormat == FORMAT_422) + frameFormat = FORMAT_224; + else if (frameFormat == FORMAT_224) + frameFormat = FORMAT_422; + } +#else + frameFormat = 2 /*pEncInfo->sourceFormat*/; // TODO +#endif + + pEncInfo->pCInfoTab[0] = sJpuCompInfoTable[frameFormat]; + pEncInfo->pCInfoTab[1] = pEncInfo->pCInfoTab[0] + 6; + pEncInfo->pCInfoTab[2] = pEncInfo->pCInfoTab[1] + 6; + pEncInfo->pCInfoTab[3] = pEncInfo->pCInfoTab[2] + 6; +#endif + + if (pop->packedFormat == PACKED_FORMAT_444 && + pEncInfo->sourceFormat != FORMAT_444) { + return JPG_RET_INVALID_PARAM; + } + pEncInfo->packedFormat = pop->packedFormat; +#ifdef MJPEG_INTERFACE_API + pEncInfo->rgbPacked = pop->rgbPacked; +#endif // MJPEG_INTERFACE_API + return JPG_RET_SUCCESS; +} + +JpgRet JPU_EncClose(JpgEncHandle handle) +{ + JpgInst *pJpgInst = handle; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + if (GetJpgPendingInst()) { + JLOG(ERR, "Frame is not complete!"); + return JPG_RET_FRAME_NOT_COMPLETE; + } + + JpuWriteReg(MJPEG_BBC_FLUSH_CMD_REG, 0); + FreeJpgInstance(pJpgInst); + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_EncGetInitialInfo(JpgEncHandle handle, JpgEncInitialInfo *info) +{ + JpgInst *pJpgInst = handle; + JpgEncInfo *pEncInfo; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + if (info == 0) { + return JPG_RET_INVALID_PARAM; + } + + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + if (pEncInfo->initialInfoObtained) { + return JPG_RET_CALLED_BEFORE; + } + + if (GetJpgPendingInst()) { + JLOG(ERR, "Frame is not complete!"); + return JPG_RET_FRAME_NOT_COMPLETE; + } + + if (pEncInfo->sourceFormat == FORMAT_400) { + pEncInfo->compInfo[1] = 0; + pEncInfo->compInfo[2] = 0; + } else { + pEncInfo->compInfo[1] = 5; + pEncInfo->compInfo[2] = 5; + } + + if (pEncInfo->sourceFormat == FORMAT_400) + pEncInfo->compNum = 1; + else + pEncInfo->compNum = 3; + + if (pEncInfo->sourceFormat == FORMAT_420) { + pEncInfo->mcuBlockNum = 6; + pEncInfo->compInfo[0] = 10; + pEncInfo->busReqNum = 2; + } else if (pEncInfo->sourceFormat == FORMAT_422) { + pEncInfo->mcuBlockNum = 4; + pEncInfo->busReqNum = 3; + pEncInfo->compInfo[0] = 9; + } else if (pEncInfo->sourceFormat == FORMAT_224) { + pEncInfo->mcuBlockNum = 4; + pEncInfo->busReqNum = 3; + pEncInfo->compInfo[0] = 6; + } else if (pEncInfo->sourceFormat == FORMAT_444) { + pEncInfo->mcuBlockNum = 3; + pEncInfo->compInfo[0] = 5; + pEncInfo->busReqNum = 4; + } else if (pEncInfo->sourceFormat == FORMAT_400) { + pEncInfo->mcuBlockNum = 1; + pEncInfo->busReqNum = 4; + pEncInfo->compInfo[0] = 5; + } + + info->minFrameBufferCount = 0; + info->colorComponents = pEncInfo->compNum; + + pEncInfo->initialInfo = *info; + pEncInfo->initialInfoObtained = 1; + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_EncGetBitstreamBuffer(JpgEncHandle handle, PhysicalAddress *prdPtr, + PhysicalAddress *pwrPtr, int *size) +{ + JpgInst *pJpgInst = handle; + JpgEncInfo *pEncInfo; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + if (prdPtr == 0 || pwrPtr == 0 || size == 0) { + return JPG_RET_INVALID_PARAM; + } + + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + JpgSetClockGate(1); + *prdPtr = pEncInfo->streamRdPtr; + + if (GetJpgPendingInst() == pJpgInst) + *pwrPtr = jdi_get_memory_addr_high( + JpuReadReg(MJPEG_BBC_WR_PTR_REG)); + else + *pwrPtr = pEncInfo->streamWrPtr; + + *size = *pwrPtr - *prdPtr; + JpgSetClockGate(0); + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_EncUpdateBitstreamBuffer(JpgEncHandle handle, int size) +{ + JpgInst *pJpgInst = handle; + JpgEncInfo *pEncInfo; + PhysicalAddress rdPtr; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + JpgSetClockGate(1); + rdPtr = pEncInfo->streamRdPtr; + rdPtr += size; + + if (rdPtr == pEncInfo->streamBufEndAddr) { + rdPtr = pEncInfo->streamBufStartAddr; + } + + pEncInfo->streamRdPtr = pEncInfo->streamBufStartAddr; + + if (GetJpgPendingInst() == pJpgInst) { + pEncInfo->streamWrPtr = jdi_get_memory_addr_high( + JpuReadReg(MJPEG_BBC_WR_PTR_REG)); + JpuWriteReg(MJPEG_BBC_CUR_POS_REG, 0); + JpuWriteReg(MJPEG_BBC_EXT_ADDR_REG, + pEncInfo->streamBufStartAddr); + JpuWriteReg(MJPEG_BBC_RD_PTR_REG, pEncInfo->streamBufStartAddr); + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, pEncInfo->streamBufStartAddr); + } + JpgSetClockGate(0); + return JPG_RET_SUCCESS; +} + +JpgRet JPU_EncIssueStop(JpgEncHandle handle) +{ + JpgInst *pJpgInst = handle; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + if (pJpgInst != GetJpgPendingInst()) { + return JPG_RET_WRONG_CALL_SEQUENCE; + } + + JpgSetClockGate(1); + JpuWriteReg(MJPEG_PIC_START_REG, 1 << JPG_START_STOP); + ClearJpgPendingInst(); + JpgSetClockGate(0); + return JPG_RET_SUCCESS; +} + +JpgRet JPU_EncCompleteStop(JpgEncHandle handle) +{ + JpgInst *pJpgInst = handle; + JpgRet ret; + Uint32 val; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + if (pJpgInst != GetJpgPendingInst()) { + return JPG_RET_WRONG_CALL_SEQUENCE; + } + + JpgSetClockGate(1); + val = JpuReadReg(MJPEG_PIC_STATUS_REG); + + if (val & (1 << INT_JPU_BIT_BUF_STOP)) { + SetJpgPendingInst(pJpgInst); + JpgSetClockGate(0); + } else { + JpgSetClockGate(0); + return JPG_RET_WRONG_CALL_SEQUENCE; + } + + return JPG_RET_SUCCESS; +} + +JpgRet JPU_EncStartOneFrame(JpgEncHandle handle, JpgEncParam *param) +{ + JpgInst *pJpgInst = handle; + JpgEncInfo *pEncInfo; + FrameBuffer *pBasFrame; + Uint32 rotMirEnable; + Uint32 rotMirMode; + JpgRet ret; +#ifndef LIBCVIJPULITE + int val; +#endif + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + ret = CheckJpgEncParam(handle, param); + if (ret != JPG_RET_SUCCESS) { + return ret; + } + + pBasFrame = param->sourceFrame; + rotMirEnable = 0; + rotMirMode = 0; + if (pEncInfo->rotationEnable) { + rotMirEnable = 0x10; // Enable rotator + switch (pEncInfo->rotationAngle) { + case 0: + rotMirMode |= 0x0; + break; + case 90: + rotMirMode |= 0x1; + break; + case 180: + rotMirMode |= 0x2; + break; + case 270: + rotMirMode |= 0x3; + break; + } + } + + if (pEncInfo->mirrorEnable) { + rotMirEnable = 0x10; // Enable rotator + switch (pEncInfo->mirrorDirection) { + case MIRDIR_NONE: + rotMirMode |= 0x0; + break; + case MIRDIR_VER: + rotMirMode |= 0x4; + break; + case MIRDIR_HOR: + rotMirMode |= 0x8; + break; + case MIRDIR_HOR_VER: + rotMirMode |= 0xc; + break; + } + } + + if (GetJpgPendingInst()) { + pr_debug("pJpgInst %d\n", pJpgInst->instIndex); + JLOG(ERR, "Frame is not complete!"); + ret = JPG_RET_FRAME_NOT_COMPLETE; + goto fail; + } + + JpuWriteReg(MJPEG_CLP_INFO_REG, + 0); // off ROI enable due to not supported feature for + // encoder. + + JpuWriteReg(MJPEG_BBC_BAS_ADDR_REG, pEncInfo->streamBufStartAddr); + JpuWriteReg(MJPEG_BBC_END_ADDR_REG, pEncInfo->streamBufEndAddr); + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, pEncInfo->streamBufStartAddr); + JpuWriteReg(MJPEG_BBC_RD_PTR_REG, pEncInfo->streamBufStartAddr); + JpuWriteReg(MJPEG_BBC_CUR_POS_REG, 0); + JpuWriteReg(MJPEG_BBC_DATA_CNT_REG, 64); // 64 * 4 byte == 32 * 8 byte + JpuWriteReg(MJPEG_BBC_EXT_ADDR_REG, pEncInfo->streamBufStartAddr); + JpuWriteReg(MJPEG_BBC_INT_ADDR_REG, 0); + + JpuWriteReg(MJPEG_GBU_BT_PTR_REG, 0); + JpuWriteReg(MJPEG_GBU_WD_PTR_REG, 0); + JpuWriteReg(MJPEG_GBU_BBSR_REG, 0); + JpuWriteReg(MJPEG_GBU_CTRL_REG, 0); + + JpuWriteReg(MJPEG_GBU_BBER_REG, (64 * 2) - 1); + JpuWriteReg(MJPEG_GBU_BBIR_REG, 64); // 64 * 4 byte == 32 * 8 byte + JpuWriteReg(MJPEG_GBU_BBHR_REG, 64); // 64 * 4 byte == 32 * 8 byte + JpuWriteReg(MJPEG_PIC_CTRL_REG, + 0x18 | pEncInfo->usePartial | + (JPU_CHECK_WRITE_RESPONSE_BVALID_SIGNAL << 2)); + JpuWriteReg(MJPEG_SCL_INFO_REG, 0); + if (pEncInfo->packedFormat == PACKED_FORMAT_NONE) + JpuWriteReg(MJPEG_DPB_CONFIG_REG, + (pEncInfo->frameEndian << 6) | (0 << 5) | (0 << 4) | + (0 << 2) | + ((pEncInfo->chromaInterleave == 0) ? 0 : + (pEncInfo->chromaInterleave == 1) ? 2 : + 3)); + else if (pEncInfo->packedFormat == PACKED_FORMAT_444) + JpuWriteReg(MJPEG_DPB_CONFIG_REG, + (pEncInfo->frameEndian << 6) | (1 << 5) | (0 << 4) | + (0 << 2) | + ((pEncInfo->chromaInterleave == 0) ? 0 : + (pEncInfo->chromaInterleave == 1) ? 2 : + 3)); + else + JpuWriteReg(MJPEG_DPB_CONFIG_REG, + (pEncInfo->frameEndian << 6) | (0 << 5) | (1 << 4) | + ((pEncInfo->packedFormat - 1) << 2) | + ((pEncInfo->chromaInterleave == 0) ? 0 : + (pEncInfo->chromaInterleave == 1) ? 2 : + 3)); + + JpuWriteReg(MJPEG_RST_INTVAL_REG, pEncInfo->rstIntval); + JpuWriteReg(MJPEG_BBC_CTRL_REG, (pEncInfo->streamEndian << 1) | 1); + JpuWriteReg(MJPEG_OP_INFO_REG, pEncInfo->partiallineNum << 16 | + pEncInfo->partialBufNum << 3 | + pEncInfo->busReqNum); + + // Load HUFFTab + if (!JpgEncLoadHuffTab(pEncInfo)) { + ret = JPG_RET_INVALID_PARAM; + goto fail; + } + + // Load QMATTab + if (!JpgEncLoadQMatTab(pEncInfo)) { + ret = JPG_RET_INVALID_PARAM; + goto fail; + } + + JpgEncEncodeHeader(handle, pEncInfo->paraSet); + + // although rotator is enable, this picture size must not be changed + // from widh to height. + JpuWriteReg(MJPEG_PIC_SIZE_REG, + pEncInfo->alignedWidth << 16 | pEncInfo->alignedHeight); + JpuWriteReg(MJPEG_ROT_INFO_REG, (rotMirEnable | rotMirMode)); + + JpuWriteReg(MJPEG_MCU_INFO_REG, + pEncInfo->mcuBlockNum << 16 | pEncInfo->compNum << 12 | + pEncInfo->compInfo[0] << 8 | + pEncInfo->compInfo[1] << 4 | pEncInfo->compInfo[2]); + + // JpgEncGbuResetReg + JpuWriteReg(MJPEG_GBU_CTRL_REG, + pEncInfo->stuffByteEnable << 3); // stuffing "FF" data where + // frame end + + if (pEncInfo->usePartial) { + int i; + for (i = 0; i < pEncInfo->partialBufNum; i++) { + JpuWriteReg(MJPEG_DPB_BASE00_REG + (i * 12), + pBasFrame[i].bufY); + JpuWriteReg(MJPEG_DPB_BASE01_REG + (i * 12), + pBasFrame[i].bufCb); + JpuWriteReg(MJPEG_DPB_BASE02_REG + (i * 12), + pBasFrame[i].bufCr); + } + } else { + JpuWriteReg(MJPEG_DPB_BASE00_REG, pBasFrame->bufY); + JpuWriteReg(MJPEG_DPB_BASE01_REG, pBasFrame->bufCb); + JpuWriteReg(MJPEG_DPB_BASE02_REG, pBasFrame->bufCr); + } + +#ifdef LIBCVIJPULITE + JpuWriteReg(MJPEG_DPB_YSTRIDE_REG, pBasFrame->strideY); + JpuWriteReg(MJPEG_DPB_CSTRIDE_REG, pBasFrame->strideC); +#else + JpuWriteReg(MJPEG_DPB_YSTRIDE_REG, pBasFrame->stride); + + val = (pEncInfo->sourceFormat == FORMAT_420 || + pEncInfo->sourceFormat == FORMAT_422 || + pEncInfo->sourceFormat == FORMAT_400) ? + 2 : + 1; + if (pEncInfo->chromaInterleave) + JpuWriteReg(MJPEG_DPB_CSTRIDE_REG, (pBasFrame->stride / val) + << 1); + else + JpuWriteReg(MJPEG_DPB_CSTRIDE_REG, pBasFrame->stride / val); +#endif + + if (pJpgInst->loggingEnable) + jdi_log(JDI_LOG_CMD_PICRUN, 1); + + JpuWriteReg(MJPEG_PIC_STATUS_REG, JpuReadReg(MJPEG_PIC_STATUS_REG)); + if (pEncInfo->usePartial) + JpuWriteReg(MJPEG_PIC_START_REG, + (1 << JPG_START_PIC) | (1 << JPG_START_PARTIAL)); + else { + pJpgInst->u64StartTime = jpgGetCurrentTime(); + JpuWriteReg(MJPEG_PIC_START_REG, (1 << JPG_START_PIC)); + } + + SetJpgPendingInst(pJpgInst); + + return JPG_RET_SUCCESS; + +fail: + return ret; +} + +JpgRet JPU_EncGetOutputInfo(JpgEncHandle handle, JpgEncOutputInfo *info) +{ + JpgInst *pJpgInst = handle; + JpgEncInfo *pEncInfo; + Uint32 val; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) { + goto fail; + } + + if (info == 0) { + ret = JPG_RET_INVALID_PARAM; + goto fail; + } + + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + if (pJpgInst != GetJpgPendingInst()) { + ret = JPG_RET_WRONG_CALL_SEQUENCE; + goto fail; + } + + val = JpuReadReg(MJPEG_PIC_STATUS_REG); + + if ((val & 0x4) >> 2) { + ret = JPG_RET_WRONG_CALL_SEQUENCE; + goto fail; + } + + if (val != 0) + JpuWriteReg(MJPEG_PIC_STATUS_REG, val); + + JpuWriteReg(MJPEG_INTR_MASK_REG, 0x0); + + info->bitstreamBuffer = pEncInfo->streamBufStartAddr; +#ifdef MJPEG_INTERFACE_API + info->bitstreamBuf_virt = (void *)(pEncInfo->pBitStream); +#endif /* MJPEG_INTERFACE_API */ + info->bitstreamSize = + jdi_get_memory_addr_high(JpuReadReg(MJPEG_BBC_WR_PTR_REG)) - + pEncInfo->streamBufStartAddr; + pEncInfo->streamWrPtr = + jdi_get_memory_addr_high(JpuReadReg(MJPEG_BBC_WR_PTR_REG)); + + JpuWriteReg(MJPEG_BBC_FLUSH_CMD_REG, 0); + + if (pJpgInst->loggingEnable) + jdi_log(JDI_LOG_CMD_PICRUN, 0); + +fail: +#if defined(LIBCVIJPULITE) + /* To fix the bug affecting the following encoding, + * Initialize the internal status of JPU at the end of encoding. */ + JPU_InitCodecStatus(); +#endif + + ClearJpgPendingInst(); + + return ret; +} + +JpgRet JPU_EncGiveCommand(JpgEncHandle handle, JpgCommand cmd, void *param) +{ + JpgInst *pJpgInst = handle; + JpgEncInfo *pEncInfo; + JpgRet ret; + + ret = CheckJpgInstValidity(handle); + if (ret != JPG_RET_SUCCESS) + return ret; + + pEncInfo = &pJpgInst->JpgInfo.encInfo; + switch (cmd) { + case ENABLE_JPG_ROTATION: { + pEncInfo->rotationEnable = 1; + } break; + case DISABLE_JPG_ROTATION: { + pEncInfo->rotationEnable = 0; + } break; + case ENABLE_JPG_MIRRORING: { + pEncInfo->mirrorEnable = 1; + } break; + case DISABLE_JPG_MIRRORING: { + pEncInfo->mirrorEnable = 0; + } break; + case SET_JPG_MIRROR_DIRECTION: { + JpgMirrorDirection mirDir; + + if (param == 0) { + return JPG_RET_INVALID_PARAM; + } + mirDir = *(JpgMirrorDirection *)param; + if (!(MIRDIR_NONE <= mirDir && mirDir <= MIRDIR_HOR_VER)) { + return JPG_RET_INVALID_PARAM; + } + pEncInfo->mirrorDirection = mirDir; + } break; + case SET_JPG_ROTATION_ANGLE: { + int angle; + + if (param == 0) { + return JPG_RET_INVALID_PARAM; + } + angle = *(int *)param; + if (angle != 0 && angle != 90 && angle != 180 && angle != 270) { + return JPG_RET_INVALID_PARAM; + } + if (pEncInfo->initialInfoObtained && + (angle == 90 || angle == 270)) { + return JPG_RET_INVALID_PARAM; + } + pEncInfo->rotationAngle = angle; + } break; + case ENC_JPG_GET_HEADER: { + if (param == 0) { + return JPG_RET_INVALID_PARAM; + } + + pEncInfo->paraSet = (JpgEncParamSet *)param; + break; + } + case SET_JPG_USE_PARTIAL_MODE: { + int enable; + enable = *(int *)param; + pEncInfo->usePartial = enable; + + break; + } + case SET_JPG_PARTIAL_FRAME_NUM: { + int frame; + frame = *(int *)param; + pEncInfo->partialBufNum = frame; + + break; + } + case SET_JPG_PARTIAL_LINE_NUM: { + int line; + line = *(int *)param; + pEncInfo->partiallineNum = line; + + break; + } + case SET_JPG_ENCODE_NEXT_LINE: { + JpuWriteReg(MJPEG_PIC_START_REG, (1 << JPG_START_PARTIAL)); + break; + } + case SET_JPG_USE_STUFFING_BYTE_FF: { + int enable; + enable = *(int *)param; + pEncInfo->stuffByteEnable = enable; + break; + } + case ENABLE_LOGGING: { + pJpgInst->loggingEnable = 1; + } break; + case DISABLE_LOGGING: { + pJpgInst->loggingEnable = 0; + } break; + + default: + return JPG_RET_INVALID_COMMAND; + } + return JPG_RET_SUCCESS; +} + +#ifdef DUMP_JPU_REGS +void JPU_Print_Reg_Status(int type) +{ + if (type == 1) { + // dec + printf(" Jpu dec regs:------------------------------------------------------------------\n"); + JPUSetReg(); + JPUPrintReg(); + } else if (type == 2) { + // enc + printf(" Jpu enc regs:=================================================================\n"); + JPUSetReg(); + JPUPrintReg(); + } +} + +void JPUSetReg(void) +{ + JpgSetClockGate(1); + JpuWriteReg(MJPEG_PIC_START_REG, 0x0); + JpuWriteReg(MJPEG_PIC_STATUS_REG, 0x0); + JpuWriteReg(MJPEG_PIC_SETMB_REG, 0x0); + + JpuWriteReg(MJPEG_PIC_CTRL_REG, 0x0); + JpuWriteReg(MJPEG_PIC_SIZE_REG, 0x0); + JpuWriteReg(MJPEG_MCU_INFO_REG, 0x0); + JpuWriteReg(MJPEG_ROT_INFO_REG, 0x0); + + JpuWriteReg(MJPEG_SCL_INFO_REG, 0x0); + JpuWriteReg(MJPEG_IF_INFO_REG, 0x0); + JpuWriteReg(MJPEG_CLP_INFO_REG, 0x0); + JpuWriteReg(MJPEG_OP_INFO_REG, 0x00100001); + + JpuWriteReg(MJPEG_DPB_CONFIG_REG, 0x0); + JpuWriteReg(MJPEG_DPB_BASE00_REG, 0x0); + JpuWriteReg(MJPEG_DPB_BASE01_REG, 0x0); + JpuWriteReg(MJPEG_DPB_BASE02_REG, 0x0); + + JpuWriteReg(MJPEG_DPB_BASE10_REG, 0x0); + JpuWriteReg(MJPEG_DPB_BASE11_REG, 0x0); + JpuWriteReg(MJPEG_DPB_BASE12_REG, 0x0); + JpuWriteReg(MJPEG_DPB_BASE20_REG, 0x0); + + JpuWriteReg(MJPEG_DPB_BASE21_REG, 0x0); + JpuWriteReg(MJPEG_DPB_BASE22_REG, 0x0); + JpuWriteReg(MJPEG_DPB_BASE30_REG, 0x0); + JpuWriteReg(MJPEG_DPB_BASE31_REG, 0x0); + + JpuWriteReg(MJPEG_DPB_BASE32_REG, 0x0); + JpuWriteReg(MJPEG_DPB_YSTRIDE_REG, 0x0); + JpuWriteReg(MJPEG_DPB_CSTRIDE_REG, 0x0); + + JpuWriteReg(MJPEG_CLP_BASE_REG, 0x0); + JpuWriteReg(MJPEG_CLP_SIZE_REG, 0x0); + + JpuWriteReg(MJPEG_HUFF_CTRL_REG, 0x0); + JpuWriteReg(MJPEG_HUFF_ADDR_REG, 0x0); + JpuWriteReg(MJPEG_HUFF_DATA_REG, 0x0); + + JpuWriteReg(MJPEG_QMAT_CTRL_REG, 0x0); + JpuWriteReg(MJPEG_QMAT_ADDR_REG, 0x0); + JpuWriteReg(MJPEG_QMAT_DATA_REG, 0x0); + + JpuWriteReg(MJPEG_COEF_CTRL_REG, 0x0); + JpuWriteReg(MJPEG_COEF_ADDR_REG, 0x0); + JpuWriteReg(MJPEG_COEF_DATA_REG, 0x0); + + JpuWriteReg(MJPEG_RST_INTVAL_REG, 0x0); + JpuWriteReg(MJPEG_RST_INDEX_REG, 0x0); + JpuWriteReg(MJPEG_RST_COUNT_REG, 0x0); + JpuWriteReg(MJPEG_PIC_STATUS_REG, 0x0); + + JpuWriteReg(MJPEG_INTR_MASK_REG, 0x0); + + JpuWriteReg(MJPEG_DPCM_DIFF_Y_REG, 0x0); + JpuWriteReg(MJPEG_DPCM_DIFF_CB_REG, 0x0); + JpuWriteReg(MJPEG_DPCM_DIFF_CR_REG, 0x0); + + JpuWriteReg(MJPEG_GBU_CTRL_REG, 0x0); + + JpuWriteReg(MJPEG_GBU_BT_PTR_REG, 0x0); + JpuWriteReg(MJPEG_GBU_WD_PTR_REG, 0x0); + JpuWriteReg(MJPEG_GBU_TT_CNT_REG, 0x0); + + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x0); + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, 0x0); + JpuWriteReg(MJPEG_GBU_PBIT_24_REG, 0x0); + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0x0); + + JpuWriteReg(MJPEG_GBU_BBSR_REG, 0x0); + JpuWriteReg(MJPEG_GBU_BBER_REG, 0x0); + JpuWriteReg(MJPEG_GBU_BBIR_REG, 0x0); + JpuWriteReg(MJPEG_GBU_BBHR_REG, 0x0); + + JpuWriteReg(MJPEG_GBU_BCNT_REG, 0x0); + + JpuWriteReg(MJPEG_GBU_FF_RPTR_REG, 0x0); + JpuWriteReg(MJPEG_GBU_FF_WPTR_REG, 0x0); + + JpuWriteReg(MJPEG_BBC_END_ADDR_REG, 0x0); + JpuWriteReg(MJPEG_BBC_WR_PTR_REG, 0x0); + JpuWriteReg(MJPEG_BBC_RD_PTR_REG, 0x0); + JpuWriteReg(MJPEG_BBC_EXT_ADDR_REG, 0x0); + JpuWriteReg(MJPEG_BBC_INT_ADDR_REG, 0x0); + JpuWriteReg(MJPEG_BBC_DATA_CNT_REG, 0x0); + JpuWriteReg(MJPEG_BBC_COMMAND_REG, 0x0); + + JpuWriteReg(MJPEG_BBC_CTRL_REG, 0x0); + JpuWriteReg(MJPEG_BBC_CUR_POS_REG, 0x0); + JpuWriteReg(MJPEG_BBC_BAS_ADDR_REG, 0x0); + JpuWriteReg(MJPEG_BBC_STRM_CTRL_REG, 0x0); + JpuWriteReg(MJPEG_BBC_FLUSH_CMD_REG, 0x0); + JpgSetClockGate(0); +} + +void JPUPrintReg(void) +{ + JpgSetClockGate(1); + printf(" MJPEG_PIC_START_REG = 0x%.8x\n", + JpuReadReg(MJPEG_PIC_START_REG)); + printf(" MJPEG_PIC_STATUS_REG = 0x%.8x\n", + JpuReadReg(MJPEG_PIC_STATUS_REG)); + printf(" MJPEG_PIC_ERRMB_REG = 0x%.8x\n", + JpuReadReg(MJPEG_PIC_ERRMB_REG)); + printf(" MJPEG_PIC_SETMB_REG = 0x%.8x\n", + JpuReadReg(MJPEG_PIC_SETMB_REG)); + + printf(" MJPEG_PIC_CTRL_REG = 0x%.8x\n", + JpuReadReg(MJPEG_PIC_CTRL_REG)); + printf(" MJPEG_PIC_SIZE_REG = 0x%.8x\n", + JpuReadReg(MJPEG_PIC_SIZE_REG)); + printf(" MJPEG_MCU_INFO_REG = 0x%.8x\n", + JpuReadReg(MJPEG_MCU_INFO_REG)); + printf(" MJPEG_ROT_INFO_REG = 0x%.8x\n", + JpuReadReg(MJPEG_ROT_INFO_REG)); + printf(" MJPEG_SCL_INFO_REG = 0x%.8x\n", + JpuReadReg(MJPEG_SCL_INFO_REG)); + printf(" MJPEG_IF_INFO_REG = 0x%.8x\n", + JpuReadReg(MJPEG_IF_INFO_REG)); + printf(" MJPEG_CLP_INFO_REG = 0x%.8x\n", + JpuReadReg(MJPEG_CLP_INFO_REG)); + printf(" MJPEG_OP_INFO_REG = 0x%.8x\n", + JpuReadReg(MJPEG_OP_INFO_REG)); + + printf(" MJPEG_DPB_CONFIG_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_CONFIG_REG)); + printf(" MJPEG_DPB_BASE00_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE00_REG)); + printf(" MJPEG_DPB_BASE01_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE01_REG)); + printf(" MJPEG_DPB_BASE02_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE02_REG)); + + printf(" MJPEG_DPB_BASE10_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE10_REG)); + printf(" MJPEG_DPB_BASE11_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE11_REG)); + printf(" MJPEG_DPB_BASE12_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE12_REG)); + printf(" MJPEG_DPB_BASE20_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE20_REG)); + + printf(" MJPEG_DPB_BASE21_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE21_REG)); + printf(" MJPEG_DPB_BASE22_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE22_REG)); + printf(" MJPEG_DPB_BASE30_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE30_REG)); + printf(" MJPEG_DPB_BASE31_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE31_REG)); + + printf(" MJPEG_DPB_BASE32_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_BASE32_REG)); + printf(" MJPEG_DPB_YSTRIDE_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_YSTRIDE_REG)); + printf(" MJPEG_DPB_CSTRIDE_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPB_CSTRIDE_REG)); + printf(" MJPEG_WRESP_CHECK_REG = 0x%.8x\n", + JpuReadReg(MJPEG_WRESP_CHECK_REG)); + + printf(" MJPEG_CLP_BASE_REG = 0x%.8x\n", + JpuReadReg(MJPEG_CLP_BASE_REG)); + printf(" MJPEG_CLP_SIZE_REG = 0x%.8x\n", + JpuReadReg(MJPEG_CLP_SIZE_REG)); + + printf(" MJPEG_HUFF_CTRL_REG = 0x%.8x\n", + JpuReadReg(MJPEG_HUFF_CTRL_REG)); + printf(" MJPEG_HUFF_ADDR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_HUFF_ADDR_REG)); + printf(" MJPEG_HUFF_DATA_REG = 0x%.8x\n", + JpuReadReg(MJPEG_HUFF_DATA_REG)); + + printf(" MJPEG_QMAT_CTRL_REG = 0x%.8x\n", + JpuReadReg(MJPEG_QMAT_CTRL_REG)); + printf(" MJPEG_QMAT_ADDR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_QMAT_ADDR_REG)); + printf(" MJPEG_QMAT_DATA_REG = 0x%.8x\n", + JpuReadReg(MJPEG_QMAT_DATA_REG)); + + printf(" MJPEG_COEF_CTRL_REG = 0x%.8x\n", + JpuReadReg(MJPEG_COEF_CTRL_REG)); + printf(" MJPEG_COEF_ADDR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_COEF_ADDR_REG)); + printf(" MJPEG_COEF_DATA_REG = 0x%.8x\n", + JpuReadReg(MJPEG_COEF_DATA_REG)); + + printf(" MJPEG_RST_INTVAL_REG = 0x%.8x\n", + JpuReadReg(MJPEG_RST_INTVAL_REG)); + printf(" MJPEG_RST_INDEX_REG = 0x%.8x\n", + JpuReadReg(MJPEG_RST_INDEX_REG)); + printf(" MJPEG_RST_COUNT_REG = 0x%.8x\n", + JpuReadReg(MJPEG_RST_COUNT_REG)); + + printf(" MJPEG_INTR_MASK_REG = 0x%.8x\n", + JpuReadReg(MJPEG_INTR_MASK_REG)); + printf(" MJPEG_CYCLE_INFO_REG = 0x%.8x\n", + JpuReadReg(MJPEG_CYCLE_INFO_REG)); + + printf(" MJPEG_DPCM_DIFF_Y_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPCM_DIFF_Y_REG)); + printf(" MJPEG_DPCM_DIFF_CB_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPCM_DIFF_CB_REG)); + printf(" MJPEG_DPCM_DIFF_CR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_DPCM_DIFF_CR_REG)); + + printf(" MJPEG_GBU_CTRL_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_CTRL_REG)); + printf(" MJPEG_GBU_PBIT_BUSY_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_PBIT_BUSY_REG)); + + printf(" MJPEG_GBU_BT_PTR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_BT_PTR_REG)); + printf(" MJPEG_GBU_WD_PTR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_WD_PTR_REG)); + printf(" MJPEG_GBU_TT_CNT_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_TT_CNT_REG)); + // printf(" MJPEG_GBU_TT_CNT_REG = 0x%.8x\n", + // JpuReadReg(MJPEG_GBU_TT_CNT_REG)); + + printf(" MJPEG_GBU_BBSR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_BBSR_REG)); + printf(" MJPEG_GBU_BBER_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_BBER_REG)); + printf(" MJPEG_GBU_BBIR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_BBIR_REG)); + printf(" MJPEG_GBU_BBHR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_BBHR_REG)); + + printf(" MJPEG_GBU_BCNT_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_BCNT_REG)); + + printf(" MJPEG_GBU_FF_RPTR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_FF_RPTR_REG)); + printf(" MJPEG_GBU_FF_WPTR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_GBU_FF_WPTR_REG)); + + printf(" MJPEG_BBC_END_ADDR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_END_ADDR_REG)); + printf(" MJPEG_BBC_WR_PTR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_WR_PTR_REG)); + printf(" MJPEG_BBC_RD_PTR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_RD_PTR_REG)); + + printf(" MJPEG_BBC_EXT_ADDR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_EXT_ADDR_REG)); + printf(" MJPEG_BBC_INT_ADDR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_INT_ADDR_REG)); + printf(" MJPEG_BBC_DATA_CNT_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_DATA_CNT_REG)); + printf(" MJPEG_BBC_COMMAND_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_COMMAND_REG)); + printf(" MJPEG_BBC_BUSY_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_BUSY_REG)); + + printf(" MJPEG_BBC_CTRL_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_CTRL_REG)); + printf(" MJPEG_BBC_CUR_POS_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_CUR_POS_REG)); + printf(" MJPEG_BBC_BAS_ADDR_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_BAS_ADDR_REG)); + printf(" MJPEG_BBC_STRM_CTRL_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_STRM_CTRL_REG)); + printf(" MJPEG_BBC_FLUSH_CMD_REG = 0x%.8x\n", + JpuReadReg(MJPEG_BBC_FLUSH_CMD_REG)); + JpgSetClockGate(1); +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapi.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapi.h new file mode 100644 index 0000000000..5e66f9c2e0 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapi.h @@ -0,0 +1,378 @@ + +#ifndef JPUAPI_H_INCLUDED +#define JPUAPI_H_INCLUDED + +#include "jpuconfig.h" +#include "../jdi/jdi.h" +#include "rcKernel/cvi_rc_kernel.h" + +#ifndef MAX +#define MAX(A, B) ((A >= B) ? A : B) +#endif + +#ifndef MIN +#define MIN(A, B) ((A <= B) ? A : B) +#endif + +#ifndef CLIP +#define CLIP(L, H, X) (MAX(L, MIN(X, H))) +#endif + +#define MAX_FPS 60 +#define MAX_ABS_BIT_ERR (1 << 30) + +typedef struct { + int winSize; + int total; + int stats[MAX_FPS]; + int ptrIdx; +} stSlideWinStats; + +typedef struct _stRcCfg_ { + int targetBitrate; // in kByte + //int minPicBit; // in Byte + int fps; + int width; + int height; + int minQ; + int maxQ; + int qClipRange; + int maxBitrateLimit; // in kByte + bool cviRcEn; +} stRcCfg; + +typedef struct _stRcInfo_ { + int targetBitrate; // in BYTE + //int minPicBit; // in Byte + int fps; + int picPelNum; + int picAvgBit; + int picTargetBit; + int bitErr; + int errCompSize; + int minQ; + int maxQ; + int minQs; + int maxQs; + int qClipRange; + int lastPicQ; + unsigned int picIdx; + stSlideWinStats stBitRateStats; + int maxBitrateLimit; // in kByte + + stRcKernelInfo rcKerInfo; + stRcKernelPicOut rcPicOut; + bool cviRcEn; + +} stRcInfo; + +#ifdef LIBCVIJPULITE +#include "jpu_lib.h" + +//------------------------------------------------------------------------------ +// common struct and definition +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +// decode struct and definition +//------------------------------------------------------------------------------ +typedef void *JpgDecHandle; + +typedef DecOpenParam JpgDecOpenParam; +typedef DecInitialInfo JpgDecInitialInfo; +typedef DecParam JpgDecParam; +typedef DecOutputInfo JpgDecOutputInfo; + +//------------------------------------------------------------------------------ +// encode struct and definition +//------------------------------------------------------------------------------ +typedef void *JpgEncHandle; + +typedef EncOpenParam JpgEncOpenParam; +typedef EncInitialInfo JpgEncInitialInfo; +typedef EncParam JpgEncParam; +typedef EncOutputInfo JpgEncOutputInfo; +typedef EncParamSet JpgEncParamSet; +#else + +//------------------------------------------------------------------------------ +// common struct and definition +//------------------------------------------------------------------------------ + +typedef enum { + ENABLE_JPG_ROTATION, + DISABLE_JPG_ROTATION, + ENABLE_JPG_MIRRORING, + DISABLE_JPG_MIRRORING, + SET_JPG_MIRROR_DIRECTION, + SET_JPG_ROTATION_ANGLE, + SET_JPG_ROTATOR_OUTPUT, + SET_JPG_ROTATOR_STRIDE, + SET_JPG_SCALE_HOR, + SET_JPG_SCALE_VER, + SET_JPG_USE_PARTIAL_MODE, + SET_JPG_PARTIAL_FRAME_NUM, + SET_JPG_PARTIAL_LINE_NUM, + SET_JPG_ENCODE_NEXT_LINE, + SET_JPG_USE_STUFFING_BYTE_FF, + ENC_JPG_GET_HEADER, + ENABLE_LOGGING, + DISABLE_LOGGING, + JPG_CMD_END +} JpgCommand; + +typedef enum { + JPG_RET_SUCCESS, + JPG_RET_FAILURE, + JPG_RET_BIT_EMPTY, + JPG_RET_EOS, + JPG_RET_INVALID_HANDLE, + JPG_RET_INVALID_PARAM, + JPG_RET_INVALID_COMMAND, + JPG_RET_ROTATOR_OUTPUT_NOT_SET, + JPG_RET_ROTATOR_STRIDE_NOT_SET, + JPG_RET_FRAME_NOT_COMPLETE, + JPG_RET_INVALID_FRAME_BUFFER, + JPG_RET_INSUFFICIENT_FRAME_BUFFERS, + JPG_RET_INVALID_STRIDE, + JPG_RET_WRONG_CALL_SEQUENCE, + JPG_RET_CALLED_BEFORE, + JPG_RET_NOT_INITIALIZED, + JPG_RET_HWRESET_SUCCESS, // interruption timeout happened and need reset + JPG_RET_HWRESET_FAILURE, + JPG_RET_ENC_TIMEOUT, + JPG_RET_BREAK, + JPG_RET_GOTO +} JpgRet; + +typedef enum { + MIRDIR_NONE, + MIRDIR_VER, + MIRDIR_HOR, + MIRDIR_HOR_VER +} JpgMirrorDirection; + +typedef enum { + FORMAT_420 = 0, + FORMAT_422 = 1, + FORMAT_224 = 2, + FORMAT_444 = 3, + FORMAT_400 = 4 +} FrameFormat; + +typedef enum { CBCR_ORDER_NORMAL, CBCR_ORDER_REVERSED } CbCrOrder; + +typedef enum { + CBCR_SEPARATED = 0, + CBCR_INTERLEAVE, + CRCB_INTERLEAVE +} CbCrInterLeave; + +typedef enum { + PACKED_FORMAT_NONE, + PACKED_FORMAT_422_YUYV, + PACKED_FORMAT_422_UYVY, + PACKED_FORMAT_422_YVYU, + PACKED_FORMAT_422_VYUY, + PACKED_FORMAT_444, + PACKED_FORMAT_444_RGB +} PackedOutputFormat; + +typedef enum { + INT_JPU_DONE = 0, + INT_JPU_ERROR = 1, + INT_JPU_BIT_BUF_EMPTY = 2, + INT_JPU_BIT_BUF_FULL = 2, + INT_JPU_PARIAL_OVERFLOW = 3, + INT_JPU_PARIAL_BUF0_EMPTY = 4, + INT_JPU_PARIAL_BUF1_EMPTY, + INT_JPU_PARIAL_BUF2_EMPTY, + INT_JPU_PARIAL_BUF3_EMPTY, + INT_JPU_BIT_BUF_STOP +} InterruptJpu; + +typedef enum { JPG_TBL_NORMAL, JPG_TBL_MERGE } JpgTableMode; + +typedef enum { + ENC_HEADER_MODE_NORMAL, + ENC_HEADER_MODE_SOS_ONLY +} JpgEncHeaderMode; + +typedef struct { + PhysicalAddress bufY; + PhysicalAddress bufCb; + PhysicalAddress bufCr; + int stride; +} FrameBuffer; + +struct JpgInst; + +//------------------------------------------------------------------------------ +// decode struct and definition +//------------------------------------------------------------------------------ + +typedef struct JpgInst JpgDecInst; +typedef JpgDecInst * JpgDecHandle; + +typedef struct { + PhysicalAddress bitstreamBuffer; + int bitstreamBufferSize; + BYTE *pBitStream; + int streamEndian; + int frameEndian; + CbCrInterLeave chromaInterleave; + int thumbNailEn; + PackedOutputFormat packedFormat; + int roiEnable; + int roiOffsetX; + int roiOffsetY; + int roiWidth; + int roiHeight; + int dst_type; + FrameBuffer dst_info; +} JpgDecOpenParam; + +typedef struct { + int picWidth; + int picHeight; + int minFrameBufferCount; + int sourceFormat; + int ecsPtr; + int roiFrameWidth; + int roiFrameHeight; + int roiFrameOffsetX; + int roiFrameOffsetY; + int roiMCUSize; + int colorComponents; +} JpgDecInitialInfo; + +typedef struct { + int scaleDownRatioWidth; + int scaleDownRatioHeight; +} JpgDecParam; + +typedef struct { + int indexFrameDisplay; + int numOfErrMBs; + int decodingSuccess; + int decPicHeight; + int decPicWidth; + int consumedByte; + int bytePosFrameStart; + int ecsPtr; +} JpgDecOutputInfo; + +//------------------------------------------------------------------------------ +// encode struct and definition +//------------------------------------------------------------------------------ + +typedef struct JpgInst JpgEncInst; +typedef JpgEncInst * JpgEncHandle; + +typedef struct { + PhysicalAddress bitstreamBuffer; + Uint32 bitstreamBufferSize; + int picWidth; + int picHeight; + FrameFormat sourceFormat; + int restartInterval; + int streamEndian; + int frameEndian; + CbCrInterLeave chromaInterleave; + BYTE huffVal[4][162]; + BYTE huffBits[4][256]; + BYTE qMatTab[4][64]; + PackedOutputFormat packedFormat; + int rgbPacked; + //rate control + int quality; + int bitrate; + int framerate; + stRcInfo RcInfo; + stRcCfg RcCfg; +} JpgEncOpenParam; + +typedef struct { + int minFrameBufferCount; + int colorComponents; +} JpgEncInitialInfo; + +typedef struct { + FrameBuffer *sourceFrame; +} JpgEncParam; + +typedef struct { + PhysicalAddress bitstreamBuffer; +#ifdef MJPEG_INTERFACE_API + __u8 *bitstreamBuf_virt; +#endif /* MJPEG_INTERFACE_API */ + Uint32 bitstreamSize; +} JpgEncOutputInfo; + +typedef struct { + PhysicalAddress paraSet; + BYTE *pParaSet; + int size; + int headerMode; + int quantMode; + int huffMode; + int disableAPPMarker; + int rgbPackd; +} JpgEncParamSet; + +#endif + +#ifdef __cplusplus +extern "C" { +#endif +int JPU_IsBusy(void); +Uint32 JPU_GetStatus(void); +void JPU_ClrStatus(Uint32 val); +Uint32 JPU_IsInit(void); +Uint32 JPU_WaitInterrupt(int timeout); + +JpgRet JPU_Init(void); +void JPU_DeInit(void); +int JPU_GetOpenInstanceNum(void); +JpgRet JPU_GetVersionInfo(Uint32 *versionInfo); + +// function for decode +JpgRet JPU_DecOpen(JpgDecHandle *pHandle, JpgDecOpenParam *pop); +JpgRet JPU_DecClose(JpgDecHandle handle); +JpgRet JPU_DecGetInitialInfo(JpgDecHandle handle, JpgDecInitialInfo *info); + +JpgRet JPU_DecSetRdPtr(JpgDecHandle handle, PhysicalAddress addr, + int updateWrPtr); + +JpgRet JPU_DecRegisterFrameBuffer(JpgDecHandle handle, FrameBuffer *bufArray, + int num, int stride); +JpgRet JPU_DecGetBitstreamBuffer(JpgDecHandle handle, PhysicalAddress *prdPrt, + PhysicalAddress *pwrPtr, int *size); +JpgRet JPU_DecUpdateBitstreamBuffer(JpgDecHandle handle, int size); +JpgRet JPU_HWReset(void); +JpgRet JPU_SWReset(void); +JpgRet JPU_DecStartOneFrame(JpgDecHandle handle, JpgDecParam *param); +JpgRet JPU_DecGetOutputInfo(JpgDecHandle handle, JpgDecOutputInfo *info); +JpgRet JPU_DecIssueStop(JpgDecHandle handle); +JpgRet JPU_DecCompleteStop(JpgDecHandle handle); +JpgRet JPU_DecGiveCommand(JpgDecHandle handle, JpgCommand cmd, void *parameter); + +// function for encode +JpgRet JPU_EncOpen(JpgEncHandle *pHandle, JpgEncOpenParam *pop); +JpgRet JPU_EncClose(JpgEncHandle handle); +JpgRet JPU_EncGetInitialInfo(JpgEncHandle handle, JpgEncInitialInfo *info); +JpgRet JPU_EncGetBitstreamBuffer(JpgEncHandle handle, PhysicalAddress *prdPrt, + PhysicalAddress *pwrPtr, int *size); +JpgRet JPU_EncUpdateBitstreamBuffer(JpgEncHandle handle, int size); +JpgRet JPU_EncStartOneFrame(JpgEncHandle handle, JpgEncParam *param); +JpgRet JPU_EncGetOutputInfo(JpgEncHandle handle, JpgEncOutputInfo *info); +JpgRet JPU_EncIssueStop(JpgDecHandle handle); +JpgRet JPU_EncCompleteStop(JpgDecHandle handle); +JpgRet JPU_EncGiveCommand(JpgEncHandle handle, JpgCommand cmd, void *parameter); +void JPU_EncSetHostParaAddr(PhysicalAddress baseAddr, PhysicalAddress paraAddr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapifunc.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapifunc.c new file mode 100644 index 0000000000..0d8850a247 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapifunc.c @@ -0,0 +1,2335 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "jpuapifunc.h" +#include "regdefine.h" +#include "../include/jpulog.h" + +/****************************************************************************** + * Codec Instance Slot Management + ******************************************************************************/ + +const char lendian[4] = { 0x49, 0x49, 0x2A, 0x00 }; +const char bendian[4] = { 0x4D, 0x4D, 0x00, 0x2A }; + +const char *jfif = "JFIF"; +const char *jfxx = "JFXX"; +const char *exif = "Exif"; +unsigned char sJpuCompInfoTable[5][24] = { + { 00, 02, 02, 00, 00, 00, 01, 01, 01, 01, 01, 01, + 02, 01, 01, 01, 01, 01, 03, 00, 00, 00, 00, 00 }, // 420 + { 00, 02, 01, 00, 00, 00, 01, 01, 01, 01, 01, 01, + 02, 01, 01, 01, 01, 01, 03, 00, 00, 00, 00, 00 }, // 422H + { 00, 01, 02, 00, 00, 00, 01, 01, 01, 01, 01, 01, + 02, 01, 01, 01, 01, 01, 03, 00, 00, 00, 00, 00 }, // 422V + { 00, 01, 01, 00, 00, 00, 01, 01, 01, 01, 01, 01, + 02, 01, 01, 01, 01, 01, 03, 00, 00, 00, 00, 00 }, // 444 + { 00, 01, 01, 00, 00, 00, 01, 00, 00, 00, 00, 00, + 02, 00, 00, 00, 00, 00, 03, 00, 00, 00, 00, 00 }, // 400 +}; + +DEFINE_MUTEX(jpgLock); + +static void JpgEncEncodeSOI(void) +{ + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, 0xFFD8); +} + +static void JpgEncEncodeDQT(JpgEncInfo *pEncInfo, JpgTableMode enTableMode) +{ + int i; + + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, 0xFFDB); + + if (enTableMode == JPG_TBL_NORMAL) { + JpuWriteReg(MJPEG_GBU_PBIT_24_REG, 0x004300); + + for (i = 0; i < 64; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pQMatTab[0][i] << 24 | + pEncInfo->pQMatTab[0][i + 1] << 16 | + pEncInfo->pQMatTab[0][i + 2] << 8 | + pEncInfo->pQMatTab[0][i + 3]); + } + + if (pEncInfo->sourceFormat != FORMAT_400) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0xFFDB0043); + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x01); + + for (i = 0; i < 64; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pQMatTab[1][i] << 24 | + pEncInfo->pQMatTab[1][i + 1] + << 16 | + pEncInfo->pQMatTab[1][i + 2] + << 8 | + pEncInfo->pQMatTab[1][i + 3]); + } + } + } else { // if (enTableMode == JPG_TBL_MERGE) + if (pEncInfo->sourceFormat != FORMAT_400) + JpuWriteReg(MJPEG_GBU_PBIT_24_REG, 0x008400); + else + JpuWriteReg(MJPEG_GBU_PBIT_24_REG, 0x004300); + + for (i = 0; i < 64; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pQMatTab[0][i] << 24 | + pEncInfo->pQMatTab[0][i + 1] << 16 | + pEncInfo->pQMatTab[0][i + 2] << 8 | + pEncInfo->pQMatTab[0][i + 3]); + } + + if (pEncInfo->sourceFormat != FORMAT_400) { + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x01); + for (i = 0; i < 64; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pQMatTab[1][i] << 24 | + pEncInfo->pQMatTab[1][i + 1] + << 16 | + pEncInfo->pQMatTab[1][i + 2] + << 8 | + pEncInfo->pQMatTab[1][i + 3]); + } + } + } +} + +static void JpgEncEncodeDHT(JpgEncInfo *pEncInfo, JpgTableMode enTableMode) +{ + int i; + + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, 0xFFC4); + + if (enTableMode == JPG_TBL_NORMAL) { + JpuWriteReg(MJPEG_GBU_PBIT_24_REG, 0x001F00); + + for (i = 0; i < 16; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffBits[0][i] << 24 | + pEncInfo->pHuffBits[0][i + 1] + << 16 | + pEncInfo->pHuffBits[0][i + 2] << 8 | + pEncInfo->pHuffBits[0][i + 3]); + } + + for (i = 0; i < 12; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffVal[0][i] << 24 | + pEncInfo->pHuffVal[0][i + 1] << 16 | + pEncInfo->pHuffVal[0][i + 2] << 8 | + pEncInfo->pHuffVal[0][i + 3]); + } + + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0xFFC400B5); + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x10); + + for (i = 0; i < 16; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffBits[1][i] << 24 | + pEncInfo->pHuffBits[1][i + 1] + << 16 | + pEncInfo->pHuffBits[1][i + 2] << 8 | + pEncInfo->pHuffBits[1][i + 3]); + } + + for (i = 0; i < 160; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffVal[1][i] << 24 | + pEncInfo->pHuffVal[1][i + 1] << 16 | + pEncInfo->pHuffVal[1][i + 2] << 8 | + pEncInfo->pHuffVal[1][i + 3]); + } + + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, + pEncInfo->pHuffVal[1][160] << 8 | + pEncInfo->pHuffVal[1][161]); + + if (pEncInfo->sourceFormat != FORMAT_400) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0xFFC4001F); + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x01); + + for (i = 0; i < 16; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffBits[2][i] << 24 | + pEncInfo->pHuffBits[2][i + 1] + << 16 | + pEncInfo->pHuffBits[2][i + 2] + << 8 | + pEncInfo->pHuffBits[2][i + 3]); + } + + for (i = 0; i < 12; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffVal[2][i] << 24 | + pEncInfo->pHuffVal[2][i + 1] + << 16 | + pEncInfo->pHuffVal[2][i + 2] + << 8 | + pEncInfo->pHuffVal[2][i + 3]); + } + + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0xFFC400B5); + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x11); + + for (i = 0; i < 16; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffBits[3][i] << 24 | + pEncInfo->pHuffBits[3][i + 1] + << 16 | + pEncInfo->pHuffBits[3][i + 2] + << 8 | + pEncInfo->pHuffBits[3][i + 3]); + } + + for (i = 0; i < 160; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffVal[3][i] << 24 | + pEncInfo->pHuffVal[3][i + 1] + << 16 | + pEncInfo->pHuffVal[3][i + 2] + << 8 | + pEncInfo->pHuffVal[3][i + 3]); + } + + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, + pEncInfo->pHuffVal[3][160] << 8 | + pEncInfo->pHuffVal[3][161]); + } + } else { // if (enTableMode == JPG_TBL_MERGE) + if (pEncInfo->sourceFormat != FORMAT_400) + JpuWriteReg(MJPEG_GBU_PBIT_24_REG, 0x01A200); + else + JpuWriteReg(MJPEG_GBU_PBIT_24_REG, 0x00D400); + + for (i = 0; i < 16; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffBits[0][i] << 24 | + pEncInfo->pHuffBits[0][i + 1] + << 16 | + pEncInfo->pHuffBits[0][i + 2] << 8 | + pEncInfo->pHuffBits[0][i + 3]); + } + + for (i = 0; i < 12; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffVal[0][i] << 24 | + pEncInfo->pHuffVal[0][i + 1] << 16 | + pEncInfo->pHuffVal[0][i + 2] << 8 | + pEncInfo->pHuffVal[0][i + 3]); + } + + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x10); + + for (i = 0; i < 16; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffBits[1][i] << 24 | + pEncInfo->pHuffBits[1][i + 1] + << 16 | + pEncInfo->pHuffBits[1][i + 2] << 8 | + pEncInfo->pHuffBits[1][i + 3]); + } + + for (i = 0; i < 160; i += 4) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffVal[1][i] << 24 | + pEncInfo->pHuffVal[1][i + 1] << 16 | + pEncInfo->pHuffVal[1][i + 2] << 8 | + pEncInfo->pHuffVal[1][i + 3]); + } + + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, + pEncInfo->pHuffVal[1][160] << 8 | + pEncInfo->pHuffVal[1][161]); + + if (pEncInfo->sourceFormat != FORMAT_400) { + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x01); + + for (i = 0; i < 16; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffBits[2][i] << 24 | + pEncInfo->pHuffBits[2][i + 1] + << 16 | + pEncInfo->pHuffBits[2][i + 2] + << 8 | + pEncInfo->pHuffBits[2][i + 3]); + } + + for (i = 0; i < 12; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffVal[2][i] << 24 | + pEncInfo->pHuffVal[2][i + 1] + << 16 | + pEncInfo->pHuffVal[2][i + 2] + << 8 | + pEncInfo->pHuffVal[2][i + 3]); + } + + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x11); + + for (i = 0; i < 16; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffBits[3][i] << 24 | + pEncInfo->pHuffBits[3][i + 1] + << 16 | + pEncInfo->pHuffBits[3][i + 2] + << 8 | + pEncInfo->pHuffBits[3][i + 3]); + } + + for (i = 0; i < 160; i += 4) { + JpuWriteReg( + MJPEG_GBU_PBIT_32_REG, + pEncInfo->pHuffVal[3][i] << 24 | + pEncInfo->pHuffVal[3][i + 1] + << 16 | + pEncInfo->pHuffVal[3][i + 2] + << 8 | + pEncInfo->pHuffVal[3][i + 3]); + } + + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, + pEncInfo->pHuffVal[3][160] << 8 | + pEncInfo->pHuffVal[3][161]); + } + } +} + +static void JpgEncEncodeDRI(JpgEncInfo *pEncInfo, BOOL bOpt) +{ + if (!bOpt || pEncInfo->rstIntval) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0xFFDD0004); + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, pEncInfo->rstIntval); + } +} + +static void JpgEncEncodeSOF0(JpgEncInfo *pEncInfo) +{ + BYTE *pCInfoTab[4]; + int i, frameFormat; + + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, 0xFFC0); + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, (8 + (pEncInfo->compNum * 3))); + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, 0x08); + + if (pEncInfo->rotationAngle == 90 || pEncInfo->rotationAngle == 270) + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->picWidth << 16 | pEncInfo->picHeight); + else + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + pEncInfo->picHeight << 16 | pEncInfo->picWidth); + + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, pEncInfo->compNum); + +#if defined(LIBCVIJPULITE) + for (i = 0; i < pEncInfo->compNum; i++) { + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, (i + 1)); + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, + ((pEncInfo->pCInfoTab[i][1] << 4) & 0xF0) + + (pEncInfo->pCInfoTab[i][2] & 0x0F)); + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, pEncInfo->pCInfoTab[i][3]); + } +#else + frameFormat = pEncInfo->sourceFormat; + if (pEncInfo->rotationEnable && + (pEncInfo->rotationAngle == 90 || pEncInfo->rotationAngle == 270)) { + frameFormat = (frameFormat == FORMAT_422) ? FORMAT_224 : + (frameFormat == FORMAT_224) ? FORMAT_422 : + frameFormat; + } + + pCInfoTab[0] = sJpuCompInfoTable[frameFormat]; + pCInfoTab[1] = pCInfoTab[0] + 6; + pCInfoTab[2] = pCInfoTab[1] + 6; + pCInfoTab[3] = pCInfoTab[2] + 6; + + for (i = 0; i < pEncInfo->compNum; i++) { + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, (i + 1)); + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, + ((pCInfoTab[i][1] << 4) & 0xF0) + + (pCInfoTab[i][2] & 0x0F)); + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, pCInfoTab[i][3]); + } +#endif +} + +#ifdef MJPEG_INTERFACE_API +static void JpgEncEncodeApp14Adobe(JpgEncInfo *pEncInfo) +{ + if (pEncInfo->rgbPacked) { + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0xFFEE000E); + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0x41646F62); // 'ADOBE' + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0x65640000); + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, pEncInfo->frameIdx); + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, 0x0000); + } +} +#endif + +static void JpgEncEncodeApp0JFIF(void) +{ + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, + 0xFFE00010); // APP0 marker, length 16 + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0x4a464946); // 'JFIF' + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0x00010100); // '\0' + // major version 1 + // minor version 1 + // no units for x/y density + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0x00010001); // x/y aspect ratio 1:1 + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, 0x0000); // thumbnail size 0x0 +} + +static void JpgEncEncodeApp9FrameIndex(JpgEncInfo *pEncInfo) +{ + JpuWriteReg(MJPEG_GBU_PBIT_32_REG, 0xFFE90004); + JpuWriteReg(MJPEG_GBU_PBIT_16_REG, pEncInfo->frameIdx); +} + +static void JpgEncEncodeApp15UserData(JpgEncInfo *pEncInfo) +{ + int i; + + if (pEncInfo->userDataLen > 0) { + for (i = 0; i < (int)pEncInfo->userDataLen; ++i) + JpuWriteReg(MJPEG_GBU_PBIT_08_REG, + pEncInfo->userData[i]); + pEncInfo->userDataLen = 0; + } +} + +JpgRet InitJpgInstancePool(void) +{ + int i; + JpgInst *pJpgInst; + jpu_instance_pool_t *jip; + + jip = (jpu_instance_pool_t *)jdi_get_instance_pool(); + if (!jip) + return JPG_RET_INVALID_HANDLE; + + if (sizeof(JpgInst) > MAX_INST_HANDLE_SIZE) { + CVI_JPG_DBG_ERR( + "JpgInst size = %d, MAX_INST_HANDLE_SIZE = %d\n", + (int)sizeof(JpgInst), MAX_INST_HANDLE_SIZE); + return JPG_RET_FAILURE; + } + + if (jip->instance_pool_inited == 0) { + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + pJpgInst = (JpgInst *)jip->jpgInstPool[i]; + pJpgInst->instIndex = i; + pJpgInst->inUse = 0; + } + jip->instance_pool_inited = 1; + } + + mutex_init(&jpgLock); + + return JPG_RET_SUCCESS; +} + +/* + * GetJpgInstance() obtains a instance. + * It stores a pointer to the allocated instance in *ppInst + * and returns JPG_RET_SUCCESS on success. + * Failure results in 0(null pointer) in *ppInst and JPG_RET_FAILURE. + */ + +JpgRet GetJpgInstance(JpgInst **ppInst) +{ + int i; + JpgInst *pJpgInst = 0; + jpu_instance_pool_t *jip; + + jip = (jpu_instance_pool_t *)jdi_get_instance_pool(); + if (!jip) + return JPG_RET_INVALID_HANDLE; + + for (i = 0; i < MAX_NUM_INSTANCE; ++i, ++pJpgInst) { + pJpgInst = (JpgInst *)jip->jpgInstPool[i]; + + if (!pJpgInst) { + return JPG_RET_FAILURE; + } + if (!pJpgInst->inUse) + break; + } + + if (i == MAX_NUM_INSTANCE) { + *ppInst = 0; + return JPG_RET_FAILURE; + } + + pJpgInst->inUse = 1; + *ppInst = pJpgInst; + + if (jdi_open_instance(pJpgInst->instIndex) < 0) + return JPG_RET_FAILURE; + + return JPG_RET_SUCCESS; +} + +void FreeJpgInstance(JpgInst *pJpgInst) +{ + pJpgInst->inUse = 0; + + jdi_close_instance(pJpgInst->instIndex); +} + +JpgRet CheckJpgInstValidity(JpgInst *pci) +{ + JpgInst *pJpgInst = 0; + int i; + jpu_instance_pool_t *jip; + + jip = (jpu_instance_pool_t *)jdi_get_instance_pool(); + if (!jip) + return JPG_RET_FAILURE; + + for (i = 0; i < MAX_NUM_INSTANCE; ++i, ++pJpgInst) { + if ((JpgInst *)jip->jpgInstPool[i] == pci) + return JPG_RET_SUCCESS; + } + return JPG_RET_INVALID_HANDLE; +} + +/****************************************************************************** + * API Subroutines + ******************************************************************************/ + +JpgRet CheckJpgDecOpenParam(JpgDecOpenParam *pop) +{ + if (pop == 0) { + return JPG_RET_INVALID_PARAM; + } + if (pop->bitstreamBuffer % 8) { + return JPG_RET_INVALID_PARAM; + } + if (pop->bitstreamBufferSize % 1024 || + pop->bitstreamBufferSize < 1024) { + return JPG_RET_INVALID_PARAM; + } + + if (pop->chromaInterleave != CBCR_SEPARATED && + pop->chromaInterleave != CBCR_INTERLEAVE && + pop->chromaInterleave != CRCB_INTERLEAVE) { + return JPG_RET_INVALID_PARAM; + } + + if (pop->packedFormat > PACKED_FORMAT_444) { + return JPG_RET_INVALID_PARAM; + } + + if (pop->packedFormat != PACKED_FORMAT_NONE) { + if (pop->chromaInterleave != CBCR_SEPARATED) { + return JPG_RET_INVALID_PARAM; + } + } + + return JPG_RET_SUCCESS; +} + +int JpgDecHuffTabSetUp(JpgDecInfo *jpg) +{ + int i, j; + int HuffData; // 16BITS + int HuffLength; + int v; + + // MIN Tables + JpuWriteReg(MJPEG_HUFF_CTRL_REG, 0x003); + + // DC Luma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffMin[0][j]; + v = (HuffData & 0x8000) >> 15; + v = (v << 15) | (v << 14) | (v << 13) | (v << 12) | (v << 11) | + (v << 10) | (v << 9) | (v << 8) | (v << 7) | (v << 6) | + (v << 5) | (v << 4) | (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFF) << 16) | HuffData)); // 32-bit + } + + // DC Chroma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffMin[2][j]; + v = (HuffData & 0x8000) >> 15; + v = (v << 15) | (v << 14) | (v << 13) | (v << 12) | (v << 11) | + (v << 10) | (v << 9) | (v << 8) | (v << 7) | (v << 6) | + (v << 5) | (v << 4) | (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFF) << 16) | HuffData)); // 32-bit + } + + // AC Luma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffMin[1][j]; + v = (HuffData & 0x8000) >> 15; + v = (v << 15) | (v << 14) | (v << 13) | (v << 12) | (v << 11) | + (v << 10) | (v << 9) | (v << 8) | (v << 7) | (v << 6) | + (v << 5) | (v << 4) | (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFF) << 16) | HuffData)); // 32-bit + } + + // AC Chroma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffMin[3][j]; + v = (HuffData & 0x8000) >> 15; + v = (v << 15) | (v << 14) | (v << 13) | (v << 12) | (v << 11) | + (v << 10) | (v << 9) | (v << 8) | (v << 7) | (v << 6) | + (v << 5) | (v << 4) | (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFF) << 16) | HuffData)); // 32-bit + } + // MAX Tables + JpuWriteReg(MJPEG_HUFF_CTRL_REG, 0x403); + JpuWriteReg(MJPEG_HUFF_ADDR_REG, 0x440); + + // DC Luma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffMax[0][j]; + v = (HuffData & 0x8000) >> 15; + v = (v << 15) | (v << 14) | (v << 13) | (v << 12) | (v << 11) | + (v << 10) | (v << 9) | (v << 8) | (v << 7) | (v << 6) | + (v << 5) | (v << 4) | (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFF) << 16) | HuffData)); + } + // DC Chroma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffMax[2][j]; + v = (HuffData & 0x8000) >> 15; + v = (v << 15) | (v << 14) | (v << 13) | (v << 12) | (v << 11) | + (v << 10) | (v << 9) | (v << 8) | (v << 7) | (v << 6) | + (v << 5) | (v << 4) | (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFF) << 16) | HuffData)); + } + // AC Luma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffMax[1][j]; + v = (HuffData & 0x8000) >> 15; + v = (v << 15) | (v << 14) | (v << 13) | (v << 12) | (v << 11) | + (v << 10) | (v << 9) | (v << 8) | (v << 7) | (v << 6) | + (v << 5) | (v << 4) | (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFF) << 16) | HuffData)); + } + // AC Chroma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffMax[3][j]; + v = (HuffData & 0x8000) >> 15; + v = (v << 15) | (v << 14) | (v << 13) | (v << 12) | (v << 11) | + (v << 10) | (v << 9) | (v << 8) | (v << 7) | (v << 6) | + (v << 5) | (v << 4) | (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFF) << 16) | HuffData)); + } + + // PTR Tables + JpuWriteReg(MJPEG_HUFF_CTRL_REG, 0x803); + JpuWriteReg(MJPEG_HUFF_ADDR_REG, 0x880); + + // DC Luma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffPtr[0][j]; + v = (HuffData & 0x80) >> 7; + v = (v << 23) | (v << 22) | (v << 21) | (v << 20) | (v << 19) | + (v << 18) | (v << 17) | (v << 16) | (v << 15) | (v << 14) | + (v << 13) | (v << 12) | (v << 11) | (v << 10) | (v << 9) | + (v << 8) | (v << 7) | (v << 6) | (v << 5) | (v << 4) | + (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFFFF) << 8) | HuffData)); + } + // DC Chroma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffPtr[2][j]; + v = (HuffData & 0x80) >> 7; + v = (v << 23) | (v << 22) | (v << 21) | (v << 20) | (v << 19) | + (v << 18) | (v << 17) | (v << 16) | (v << 15) | (v << 14) | + (v << 13) | (v << 12) | (v << 11) | (v << 10) | (v << 9) | + (v << 8) | (v << 7) | (v << 6) | (v << 5) | (v << 4) | + (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFFFF) << 8) | HuffData)); + } + // AC Luma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffPtr[1][j]; + v = (HuffData & 0x80) >> 7; + v = (v << 23) | (v << 22) | (v << 21) | (v << 20) | (v << 19) | + (v << 18) | (v << 17) | (v << 16) | (v << 15) | (v << 14) | + (v << 13) | (v << 12) | (v << 11) | (v << 10) | (v << 9) | + (v << 8) | (v << 7) | (v << 6) | (v << 5) | (v << 4) | + (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFFFF) << 8) | HuffData)); + } + // AC Chroma + for (j = 0; j < 16; j++) { + HuffData = jpg->huffPtr[3][j]; + v = (HuffData & 0x80) >> 7; + v = (v << 23) | (v << 22) | (v << 21) | (v << 20) | (v << 19) | + (v << 18) | (v << 17) | (v << 16) | (v << 15) | (v << 14) | + (v << 13) | (v << 12) | (v << 11) | (v << 10) | (v << 9) | + (v << 8) | (v << 7) | (v << 6) | (v << 5) | (v << 4) | + (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFFFF) << 8) | HuffData)); + } + + // VAL Tables + JpuWriteReg(MJPEG_HUFF_CTRL_REG, 0xC03); + + // VAL DC Luma + HuffLength = 0; + for (i = 0; i < 12; i++) + HuffLength += jpg->huffBits[0][i]; + + for (i = 0; i < HuffLength; i++) { // 8-bit, 12 row, 1 category (DC + // Luma) + HuffData = jpg->huffVal[0][i]; + v = (HuffData & 0x80) >> 7; + v = (v << 23) | (v << 22) | (v << 21) | (v << 20) | (v << 19) | + (v << 18) | (v << 17) | (v << 16) | (v << 15) | (v << 14) | + (v << 13) | (v << 12) | (v << 11) | (v << 10) | (v << 9) | + (v << 8) | (v << 7) | (v << 6) | (v << 5) | (v << 4) | + (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFFFF) << 8) | HuffData)); + } + + for (i = 0; i < 12 - HuffLength; i++) { + JpuWriteReg(MJPEG_HUFF_DATA_REG, 0xFFFFFFFF); + } + + // VAL DC Chroma + HuffLength = 0; + for (i = 0; i < 12; i++) + HuffLength += jpg->huffBits[2][i]; + for (i = 0; i < HuffLength; i++) { // 8-bit, 12 row, 1 category (DC + // Chroma) + HuffData = jpg->huffVal[2][i]; + v = (HuffData & 0x80) >> 7; + v = (v << 23) | (v << 22) | (v << 21) | (v << 20) | (v << 19) | + (v << 18) | (v << 17) | (v << 16) | (v << 15) | (v << 14) | + (v << 13) | (v << 12) | (v << 11) | (v << 10) | (v << 9) | + (v << 8) | (v << 7) | (v << 6) | (v << 5) | (v << 4) | + (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFFFF) << 8) | HuffData)); + } + for (i = 0; i < 12 - HuffLength; i++) { + JpuWriteReg(MJPEG_HUFF_DATA_REG, 0xFFFFFFFF); + } + + // VAL AC Luma + HuffLength = 0; + for (i = 0; i < 162; i++) + HuffLength += jpg->huffBits[1][i]; + for (i = 0; i < HuffLength; i++) { // 8-bit, 162 row, 1 category (AC + // Luma) + HuffData = jpg->huffVal[1][i]; + v = (HuffData & 0x80) >> 7; + v = (v << 23) | (v << 22) | (v << 21) | (v << 20) | (v << 19) | + (v << 18) | (v << 17) | (v << 16) | (v << 15) | (v << 14) | + (v << 13) | (v << 12) | (v << 11) | (v << 10) | (v << 9) | + (v << 8) | (v << 7) | (v << 6) | (v << 5) | (v << 4) | + (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFFFF) << 8) | HuffData)); + } + for (i = 0; i < 162 - HuffLength; i++) { + JpuWriteReg(MJPEG_HUFF_DATA_REG, 0xFFFFFFFF); + } + + // VAL AC Chroma + HuffLength = 0; + for (i = 0; i < 162; i++) + HuffLength += jpg->huffBits[3][i]; + for (i = 0; i < HuffLength; i++) { // 8-bit, 162 row, 1 category (AC + // Chroma) + HuffData = jpg->huffVal[3][i]; + v = (HuffData & 0x80) >> 7; + v = (v << 23) | (v << 22) | (v << 21) | (v << 20) | (v << 19) | + (v << 18) | (v << 17) | (v << 16) | (v << 15) | (v << 14) | + (v << 13) | (v << 12) | (v << 11) | (v << 10) | (v << 9) | + (v << 8) | (v << 7) | (v << 6) | (v << 5) | (v << 4) | + (v << 3) | (v << 2) | (v << 1) | (v); + JpuWriteReg(MJPEG_HUFF_DATA_REG, + (((v & 0xFFFFFF) << 8) | HuffData)); + } + + for (i = 0; i < 162 - HuffLength; i++) { + JpuWriteReg(MJPEG_HUFF_DATA_REG, 0xFFFFFFFF); + } + + // end SerPeriHuffTab + JpuWriteReg(MJPEG_HUFF_CTRL_REG, 0x000); + + return 1; +} + +int JpgDecQMatTabSetUp(JpgDecInfo *jpg) +{ + int i; + int table; + int val; + + // SetPeriQMatTab + // Comp 0 + JpuWriteReg(MJPEG_QMAT_CTRL_REG, 0x03); + table = jpg->cInfoTab[0][3]; + for (i = 0; i < 64; i++) { + val = jpg->qMatTab[table][i]; + JpuWriteReg(MJPEG_QMAT_DATA_REG, val); + } + JpuWriteReg(MJPEG_QMAT_CTRL_REG, 0x00); + + // Comp 1 + JpuWriteReg(MJPEG_QMAT_CTRL_REG, 0x43); + table = jpg->cInfoTab[1][3]; + for (i = 0; i < 64; i++) { + val = jpg->qMatTab[table][i]; + JpuWriteReg(MJPEG_QMAT_DATA_REG, val); + } + JpuWriteReg(MJPEG_QMAT_CTRL_REG, 0x00); + + // Comp 2 + JpuWriteReg(MJPEG_QMAT_CTRL_REG, 0x83); + table = jpg->cInfoTab[2][3]; + for (i = 0; i < 64; i++) { + val = jpg->qMatTab[table][i]; + JpuWriteReg(MJPEG_QMAT_DATA_REG, val); + } + JpuWriteReg(MJPEG_QMAT_CTRL_REG, 0x00); + return 1; +} + +void JpgDecGramSetup(JpgDecInfo *jpg) +{ + int dExtBitBufCurPos; + int dExtBitBufBaseAddr; + int dMibStatus; + + dMibStatus = 1; + dExtBitBufCurPos = jpg->pagePtr; + dExtBitBufBaseAddr = jpg->streamBufStartAddr; + + JpuWriteReg(MJPEG_BBC_CUR_POS_REG, dExtBitBufCurPos); + JpuWriteReg(MJPEG_BBC_EXT_ADDR_REG, + dExtBitBufBaseAddr + (dExtBitBufCurPos << 8)); + JpuWriteReg(MJPEG_BBC_INT_ADDR_REG, (dExtBitBufCurPos & 1) << 6); + JpuWriteReg(MJPEG_BBC_DATA_CNT_REG, 64); // 64 * 4 byte == 32 * 8 byte + JpuWriteReg(MJPEG_BBC_COMMAND_REG, (jpg->streamEndian << 1) | 0); + + while (dMibStatus == 1) { + dMibStatus = JpuReadReg(MJPEG_BBC_BUSY_REG); + } + + dMibStatus = 1; + dExtBitBufCurPos = dExtBitBufCurPos + 1; + + JpuWriteReg(MJPEG_BBC_CUR_POS_REG, dExtBitBufCurPos); + JpuWriteReg(MJPEG_BBC_EXT_ADDR_REG, + dExtBitBufBaseAddr + (dExtBitBufCurPos << 8)); + JpuWriteReg(MJPEG_BBC_INT_ADDR_REG, (dExtBitBufCurPos & 1) << 6); + JpuWriteReg(MJPEG_BBC_DATA_CNT_REG, 64); // 64 * 4 byte == 32 * 8 byte + JpuWriteReg(MJPEG_BBC_COMMAND_REG, (jpg->streamEndian << 1) | 0); + + while (dMibStatus == 1) { + dMibStatus = JpuReadReg(MJPEG_BBC_BUSY_REG); + } + + dMibStatus = 1; + dExtBitBufCurPos = dExtBitBufCurPos + 1; + + JpuWriteReg(MJPEG_BBC_CUR_POS_REG, + dExtBitBufCurPos); // next unit page pointer + + JpuWriteReg(MJPEG_BBC_CTRL_REG, (jpg->streamEndian << 1) | 1); + + JpuWriteReg(MJPEG_GBU_WD_PTR_REG, jpg->wordPtr); + + JpuWriteReg(MJPEG_GBU_BBSR_REG, 0); + JpuWriteReg(MJPEG_GBU_BBER_REG, (64 * 2) - 1); + + if (jpg->pagePtr & 1) { + JpuWriteReg(MJPEG_GBU_BBIR_REG, 0); + JpuWriteReg(MJPEG_GBU_BBHR_REG, 0); + } else { + JpuWriteReg(MJPEG_GBU_BBIR_REG, + 64); // 64 * 4 byte == 32 * 8 byte + JpuWriteReg(MJPEG_GBU_BBHR_REG, + 64); // 64 * 4 byte == 32 * 8 byte + } + + JpuWriteReg(MJPEG_GBU_CTRL_REG, 4); + JpuWriteReg(MJPEG_GBU_FF_RPTR_REG, jpg->bitPtr); +} + +enum { + SAMPLE_420 = 0xA, + SAMPLE_H422 = 0x9, + SAMPLE_V422 = 0x6, + SAMPLE_444 = 0x5, + SAMPLE_400 = 0x1 +}; + +const BYTE cDefHuffBits[4][16] = { + { // DC index 0 (Luminance DC) + 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 }, + { // AC index 0 (Luminance AC) + 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, + 0x04, 0x00, 0x00, 0x01, 0x7D }, + { // DC index 1 (Chrominance DC) + 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00 }, + { // AC index 1 (Chrominance AC) + 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, + 0x04, 0x00, 0x01, 0x02, 0x77 } +}; + +const BYTE cDefHuffVal[4][162] = { + { // DC index 0 (Luminance DC) + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, + 0x0B }, + { // AC index 0 (Luminance AC) + 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, + 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, + 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, + 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, + 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, + 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, + 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, + 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, + 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA }, + { // DC index 1 (Chrominance DC) + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, + 0x0B }, + { // AC index 1 (Chrominance AC) + 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, + 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, + 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, + 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, + 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, + 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, + 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, + 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, + 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, + 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA } +}; + +enum { + Marker = 0xFF, + FF_Marker = 0x00, + + SOI_Marker = 0xFFD8, // Start of image + EOI_Marker = 0xFFD9, // End of image + + JFIF_CODE = 0xFFE0, // Application + EXIF_CODE = 0xFFE1, + + DRI_Marker = 0xFFDD, // Define restart interval + RST_Marker = 0xD, // 0xD0 ~0xD7 + + DQT_Marker = 0xFFDB, // Define quantization table(s) + DHT_Marker = 0xFFC4, // Define Huffman table(s) + + SOF_Marker = 0xFFC0, // Start of frame : Baseline DCT + SOS_Marker = 0xFFDA, // Start of scan +}; + +static int check_start_code(JpgDecInfo *jpg) +{ + if (show_bits(&jpg->gbc, 8) == 0xFF) + return 1; + else + return 0; +} + +static int find_start_code(JpgDecInfo *jpg) +{ + int word; + + for (;;) { + if (get_bits_left(&jpg->gbc) <= 16) { + // printf("hit end of stream\n"); + return 0; + } + + word = show_bits(&jpg->gbc, 16); + if ((word > 0xFF00) && (word < 0xFFFF)) + break; + + get_bits(&jpg->gbc, 8); + } + + return word; +} + +#ifndef LIBCVIJPULITE +static int find_start_soi_code(JpgDecInfo *jpg) +{ + int word; + + for (;;) { + if (get_bits_left(&jpg->gbc) <= 16) { + // printf("hit end of stream\n"); + return 0; + } + + word = show_bits(&jpg->gbc, 16); + if ((word > 0xFF00) && (word < 0xFFFF)) { + if (word != SOI_Marker) + get_bits(&jpg->gbc, 8); + break; + } + + get_bits(&jpg->gbc, 8); + } + + return word; +} +#endif + +#ifdef MJPEG_ERROR_CONCEAL +static int find_restart_marker(JpgDecInfo *jpg) +{ + int word; + + for (;;) { + if (get_bits_left(&jpg->gbc) <= 16) { + // printf("hit end of stream\n"); + return -1; + } + + word = show_bits(&jpg->gbc, 16); + if (((word >= 0xFFD0) && (word <= 0xFFD7)) || + (word == 0xFFD8) || (word == 0xFFD9)) + break; + + get_bits(&jpg->gbc, 8); + } + + return word; +} +#endif + +static int decode_app_header(JpgDecInfo *jpg) +{ + int length; + + if (get_bits_left(&jpg->gbc) < 16) + return 0; + + length = get_bits(&jpg->gbc, 16); + length -= 2; + + while (length-- > 0) { + if (get_bits_left(&jpg->gbc) < 8) + return 0; + get_bits(&jpg->gbc, 8); + } + + return 1; +} + +/* Define Restart Interval */ +static int decode_dri_header(JpgDecInfo *jpg) +{ + if (get_bits_left(&jpg->gbc) < 16 * 2) + return 0; + + // Length, Lr + get_bits(&jpg->gbc, 16); + + jpg->rstIntval = get_bits(&jpg->gbc, 16); + + return 1; +} + +/* Define Quantization Table */ +static int decode_dqt_header(JpgDecInfo *jpg) +{ + int Pq; + int Tq; + int i; + int tmp; + if (get_bits_left(&jpg->gbc) < 16) + return 0; + + // Lq, Length of DQT + get_bits(&jpg->gbc, 16); + + do { + if (get_bits_left(&jpg->gbc) < 4 + 4 + 8 * 64) + return 0; + + // Pq, Quantization Precision + tmp = get_bits(&jpg->gbc, 8); + // Tq, Quantization table destination identifier + Pq = (tmp >> 4) & 0xf; + Tq = tmp & 0xf; + + for (i = 0; i < 64; i++) + jpg->qMatTab[Tq][i] = (BYTE)get_bits(&jpg->gbc, 8); + } while (!check_start_code(jpg)); + + if (Pq != 0) { + // not 8-bit + // printf("pq is not set to zero\n"); + return 0; + } + return 1; +} + +/* Define Huffman Table */ +static int decode_dht_header(JpgDecInfo *jpg) +{ + int Tc; + int Th; + int ThTc; + int bitCnt; + int i; + int tmp; + if (get_bits_left(&jpg->gbc) < 16) + return 0; + + // Length, Lh + get_bits(&jpg->gbc, 16); + + do { + if (get_bits_left(&jpg->gbc) < 8 + 8 * 16) + return 0; + + // Table class - DC, AC + tmp = get_bits(&jpg->gbc, 8); + // Table destination identifier + Tc = (tmp >> 4) & 0xf; + Th = tmp & 0xf; + + // DC_ID0 (0x00) -> 0 + // AC_ID0 (0x10) -> 1 + // DC_ID1 (0x01) -> 2 + // AC_ID1 (0x11) -> 3 + ThTc = ((Th & 1) << 1) | (Tc & 1); + + // Get Huff Bits list + bitCnt = 0; + for (i = 0; i < 16; i++) { + jpg->huffBits[ThTc][i] = (BYTE)get_bits(&jpg->gbc, 8); + bitCnt += jpg->huffBits[ThTc][i]; + + if (cDefHuffBits[ThTc][i] != jpg->huffBits[ThTc][i]) + jpg->userHuffTab = 1; + } + + if (get_bits_left(&jpg->gbc) < 8 * bitCnt) + return 0; + + // Get Huff Val list + for (i = 0; i < bitCnt; i++) { + jpg->huffVal[ThTc][i] = (BYTE)get_bits(&jpg->gbc, 8); + if (cDefHuffVal[ThTc][i] != jpg->huffVal[ThTc][i]) + jpg->userHuffTab = 1; + } + } while (!check_start_code(jpg)); + + return 1; +} + +/* Start Of Frame */ +static int decode_sof_header(JpgDecInfo *jpg) +{ + int samplePrecision; + int sampleFactor; + int i; + int Tqi; + BYTE compID; + int hSampFact[3] = { + 0, + }; + int vSampFact[3] = { + 0, + }; + int picX, picY; + int numComp; + int tmp; + + if (get_bits_left(&jpg->gbc) < 16 + 8 + 16 + 16 + 8) + return 0; + + // LF, Length of SOF + get_bits(&jpg->gbc, 16); + + // Sample Precision: Baseline(8), P + samplePrecision = get_bits(&jpg->gbc, 8); + if (samplePrecision != 8) { + // printf("Sample Precision is not 8\n"); + return 0; + } + + picY = get_bits(&jpg->gbc, 16); + if (picY > MAX_MJPG_PIC_WIDTH) { + // printf("Picture Vertical Size limits Maximum size\n"); + return 0; + } + + picX = get_bits(&jpg->gbc, 16); + if (picX > MAX_MJPG_PIC_HEIGHT) { + // printf("Picture Horizontal Size limits Maximum size\n"); + return 0; + } + + // Number of Components in Frame: Nf + numComp = get_bits(&jpg->gbc, 8); + if (numComp > 3) { + // printf("Picture Horizontal Size limits Maximum size\n"); + } + + if (get_bits_left(&jpg->gbc) < numComp * (8 + 4 + 4 + 8)) + return 0; + for (i = 0; i < numComp; i++) { + // Component ID, Ci 0 ~ 255 + compID = (BYTE)get_bits(&jpg->gbc, 8); + tmp = get_bits(&jpg->gbc, 8); + // Horizontal Sampling Factor, Hi + hSampFact[i] = (tmp >> 4) & 0xf; + // Vertical Sampling Factor, Vi + vSampFact[i] = tmp & 0xf; + // Quantization Table Selector, Tqi + Tqi = get_bits(&jpg->gbc, 8); + + jpg->cInfoTab[i][0] = compID; + jpg->cInfoTab[i][1] = (BYTE)hSampFact[i]; + jpg->cInfoTab[i][2] = (BYTE)vSampFact[i]; + jpg->cInfoTab[i][3] = (BYTE)Tqi; + } + + if (hSampFact[0] > 2 || vSampFact[0] > 2 || + (numComp == 3 && (hSampFact[1] != 1 || hSampFact[2] != 1 || + vSampFact[1] != 1 || vSampFact[2] != 1))) { + pr_debug("Not Supported Sampling Factor!\n"); + return 0; + } + + if (numComp == 1) + sampleFactor = SAMPLE_400; + else + sampleFactor = ((hSampFact[0] & 3) << 2) | (vSampFact[0] & 3); + + switch (sampleFactor) { + case SAMPLE_420: + jpg->format = FORMAT_420; + break; + case SAMPLE_H422: + jpg->format = FORMAT_422; + break; + case SAMPLE_V422: + jpg->format = FORMAT_224; + break; + case SAMPLE_444: + jpg->format = FORMAT_444; + break; + default: // 4:0:0 + jpg->format = FORMAT_400; + } + + jpg->picWidth = picX; + jpg->picHeight = picY; + + return 1; +} + +/* Start Of Scan */ +static int decode_sos_header(JpgDecInfo *jpg) +{ + int i, j; + int len; + int numComp; + int compID; + int ecsPtr; + int ss, se, ah, al; + int dcHufTblIdx[3] = { + 0, + }; + int acHufTblIdx[3] = { + 0, + }; + int tmp; + + if (get_bits_left(&jpg->gbc) < 8) + return 0; + + // Length, Ls + len = get_bits(&jpg->gbc, 16); + + jpg->ecsPtr = (get_bits_count(&jpg->gbc) >> 3) + len - 2; + + ecsPtr = jpg->ecsPtr + jpg->frameOffset; + +#if 0 + printf("ecsPtr=0x%x frameOffset=0x%x, ecsOffset=0x%x, wrPtr=0x%x, rdPtr0x%x\n", + jpg->ecsPtr, jpg->frameOffset, ecsPtr, jpg->streamWrPtr, + jpg->streamRdPtr); +#endif + + jpg->pagePtr = ecsPtr >> 8; // page unit ecsPtr/256; + jpg->wordPtr = (ecsPtr & 0xF0) >> 2; // word unit ((ecsPtr % 256) & + // 0xF0) / 4; + + if (jpg->pagePtr & 1) + jpg->wordPtr += 64; + if (jpg->wordPtr & 1) + jpg->wordPtr -= 1; // to make even. + + jpg->bitPtr = (ecsPtr & 0xF) << 3; // bit unit (ecsPtr & 0xF) * 8; + + if (get_bits_left(&jpg->gbc) < 8) + return 0; + + // Number of Components in Scan: Ns + numComp = get_bits(&jpg->gbc, 8); + + if (get_bits_left(&jpg->gbc) < numComp * (8 + 4 + 4)) + return 0; + for (i = 0; i < numComp; i++) { + // Component ID, Csj 0 ~ 255 + compID = get_bits(&jpg->gbc, 8); + tmp = get_bits(&jpg->gbc, 8); + // dc entropy coding table selector, Tdj + dcHufTblIdx[i] = (tmp >> 4) & 0xf; + // ac entropy coding table selector, Taj + acHufTblIdx[i] = tmp & 0xf; + + for (j = 0; j < numComp; j++) { + if (compID == jpg->cInfoTab[j][0]) { + jpg->cInfoTab[j][4] = (BYTE)dcHufTblIdx[i]; + jpg->cInfoTab[j][5] = (BYTE)acHufTblIdx[i]; + } + } + } + + if (get_bits_left(&jpg->gbc) < 8 + 8 + 4 + 4) + return 0; + // Ss 0 + ss = get_bits(&jpg->gbc, 8); + // Se 3F + se = get_bits(&jpg->gbc, 8); + tmp = get_bits(&jpg->gbc, 8); + // Ah 0 + ah = (i >> 4) & 0xf; + // Al 0 + al = tmp & 0xf; + + if ((ss != 0) || (se != 0x3F) || (ah != 0) || (al != 0)) { + // printf("The Jpeg Image must be another profile\n"); + return 0; + } + + return 1; +} + +static void genDecHuffTab(JpgDecInfo *jpg, int tabNum) +{ + unsigned char *huffPtr, *huffBits; + unsigned int *huffMax, *huffMin; + + int ptrCnt = 0; + int huffCode = 0; + int zeroFlag = 0; + int dataFlag = 0; + int i; + + huffBits = jpg->huffBits[tabNum]; + huffPtr = jpg->huffPtr[tabNum]; + huffMax = jpg->huffMax[tabNum]; + huffMin = jpg->huffMin[tabNum]; + + for (i = 0; i < 16; i++) { + if (huffBits[i]) { + // if there is bit cnt value + huffPtr[i] = (BYTE)ptrCnt; + ptrCnt += huffBits[i]; + huffMin[i] = huffCode; + huffMax[i] = huffCode + (huffBits[i] - 1); + dataFlag = 1; + zeroFlag = 0; + } else { + huffPtr[i] = 0xFF; + huffMin[i] = 0xFFFF; + huffMax[i] = 0xFFFF; + zeroFlag = 1; + } + + if (dataFlag == 1) { + if (zeroFlag == 1) + huffCode <<= 1; + else + huffCode = (huffMax[i] + 1) << 1; + } + } +} + +int JpuGbuInit(jpu_getbit_context_t *ctx, BYTE *buffer, int size) +{ + ctx->buffer = buffer; + ctx->index = 0; + ctx->size = size >> 3; + + return 1; +} + +int JpuGbuGetUsedBitCount(jpu_getbit_context_t *ctx) +{ + return ctx->index * 8; +} + +int JpuGbuGetLeftBitCount(jpu_getbit_context_t *ctx) +{ + return (ctx->size * 8) - JpuGbuGetUsedBitCount(ctx); +} + +unsigned int JpuGbuGetBit(jpu_getbit_context_t *ctx, int bit_num) +{ + BYTE *p; + unsigned int b = 0x0; + + if (bit_num > JpuGbuGetLeftBitCount(ctx)) + return (unsigned int)-1; + + p = ctx->buffer + ctx->index; + + if (bit_num == 8) { + b = *p; + ctx->index++; + } else if (bit_num == 16) { + b = *p++ << 8; + b |= *p++; + ctx->index += 2; + } else if (bit_num == 32) { + b = *p++ << 24; + b |= (*p++ << 16); + b |= (*p++ << 8); + b |= (*p++ << 0); + ctx->index += 4; + } + + return b; +} + +unsigned int JpuGguShowBit(jpu_getbit_context_t *ctx, int bit_num) +{ + BYTE *p; + unsigned int b = 0x0; + + if (bit_num > JpuGbuGetLeftBitCount(ctx)) + return (unsigned int)-1; + + p = ctx->buffer + ctx->index; + + if (bit_num == 8) { + b = *p; + } else if (bit_num == 16) { + b = *p++ << 8; + b |= *p++; + } else if (bit_num == 32) { + b = *p++ << 24; + b |= (*p++ << 16); + b |= (*p++ << 8); + b |= (*p++ << 0); + } + + return b; +} + +static int wraparound_bistream_data(JpgDecInfo *jpg, int return_type) +{ + BYTE *dst; + BYTE *src; + BYTE *data; + int data_size; + int src_size; + int dst_size; + + data_size = jpg->streamWrPtr - jpg->streamBufStartAddr; + data = vmalloc(data_size); + if (data_size && data) + JpuReadMem(jpg->streamBufStartAddr, data, data_size, + jpg->streamEndian); + + src_size = jpg->streamBufSize - jpg->frameOffset; + src = vmalloc(src_size); + dst_size = ((src_size + (JPU_GBU_SIZE - 1)) & ~(JPU_GBU_SIZE - 1)); + dst = vmalloc(dst_size); + if (dst && src) { + memset(dst, 0x00, dst_size); + JpuReadMem(jpg->streamBufStartAddr + jpg->frameOffset, src, + src_size, jpg->streamEndian); + memcpy(dst + (dst_size - src_size), src, src_size); + JpuWriteMem(jpg->streamBufStartAddr, dst, dst_size, + jpg->streamEndian); + if (data_size && data) + JpuWriteMem(jpg->streamBufStartAddr + dst_size, data, + data_size, jpg->streamEndian); + vfree(src); + vfree(dst); + } + + if (data_size && data) + vfree(data); + + if (return_type == -2) { // header wraparound + jpg->streamWrPtr = + jpg->streamBufStartAddr + dst_size + data_size; + jpg->consumeByte = 0; + return -2; + } else if (return_type == -1) { // ecsPtr wraparound + jpg->streamWrPtr = + jpg->streamBufStartAddr + dst_size + data_size; + jpg->frameOffset = 0; + return -1; + } + + return 0; // error +} + +#ifdef MJPEG_ERROR_CONCEAL +int JpegDecodeConcealError(JpgDecInfo *jpg) +{ + unsigned int code; + int ret, foced_stop = 0; + BYTE *b; + Uint32 ecsPtr = 0; + Uint32 size, wrOffset; + Uint32 nextMarkerPtr; + Uint32 iRstIdx; + int numMcu = 0, numMcuCol = 0; + + // "nextOffset" is distance between frameOffset and next_restart_index + // that exist. + nextMarkerPtr = jpg->nextOffset + jpg->frameOffset; + + if (jpg->streamWrPtr == jpg->streamBufStartAddr) { + size = jpg->streamBufSize - nextMarkerPtr; + wrOffset = jpg->streamBufSize; + } else { + size = jpg->streamWrPtr - nextMarkerPtr; + wrOffset = (jpg->streamWrPtr - jpg->streamBufStartAddr); + } + + // pointing to find next_restart_marker + b = jpg->pBitStream + nextMarkerPtr; + init_get_bits(&jpg->gbc, b, size * 8); + + for (;;) { + ret = find_restart_marker(jpg); + if (ret < 0) { + break; + } + + code = get_bits(&jpg->gbc, 16); + if (code == 0xFFD8 || code == 0xFFD9) { + // if next_start_maker meet EOI(end of picture) or next + // SOI(start of image) but decoding is not completed + // yet, To prevent over picture boundary in ringbuffer + // mode, finding previous maker and make decoding forced + // to stop. + b = jpg->pBitStream + jpg->currOffset + + jpg->frameOffset; + init_get_bits(&jpg->gbc, b, size * 8); + + nextMarkerPtr = jpg->currOffset + jpg->frameOffset; + foced_stop = 1; + continue; + } + + iRstIdx = (code & 0xF); + // you can find next restart marker which will be. + if (iRstIdx >= 0 && iRstIdx <= 7) { + int numMcuRow; + + if (get_bits_left(&jpg->gbc) < 8) + return (-1); + + jpg->ecsPtr = (get_bits_count(&jpg->gbc) >> 3); + + // set ecsPtr that restart marker is founded. + ecsPtr = jpg->ecsPtr + nextMarkerPtr; + + jpg->pagePtr = ecsPtr >> 8; + jpg->wordPtr = (ecsPtr & 0xF0) >> 2; // word unit + if (jpg->pagePtr & 1) + jpg->wordPtr += 64; + if (jpg->wordPtr & 1) + jpg->wordPtr -= 1; // to make even. + + jpg->bitPtr = (ecsPtr & 0xF) << 3; // bit unit + + numMcuRow = (jpg->alignedWidth / jpg->mcuWidth); + numMcuCol = (jpg->alignedHeight / jpg->mcuHeight); + + // num of restart marker that is rounded can be + // calculated from error position. + // numRstMakerRounding = + // ((jpg->errInfo.errPosY*numMcuRow + + // jpg->errInfo.errPosX) / (jpg->rstIntval*8)); + jpg->curRstIdx = iRstIdx; + if (jpg->curRstIdx < jpg->nextRstIdx) + jpg->numRstMakerRounding++; + + // find mcu position to restart. + numMcu = (jpg->numRstMakerRounding * jpg->rstIntval * + 8) + + (jpg->curRstIdx + 1) * jpg->rstIntval; + // numMcu = jpg->rstIntval; + jpg->setPosX = (numMcu % numMcuRow); + jpg->setPosY = (numMcu / numMcuRow); + jpg->gbuStartPtr = ((ecsPtr - jpg->frameOffset) >> 8) + << 8; + + // if setPosY is greater than Picture Height, set mcu + // position to last mcu of picture to finish decoding. + if ((jpg->setPosY > numMcuCol) || foced_stop) { + jpg->setPosX = numMcuRow - 1; + jpg->setPosY = numMcuCol - 1; + } + + // update restart_index to find next. + jpg->nextRstIdx = iRstIdx++; + + ret = 0; + break; + } + } + + // prevent to find same position. + jpg->currOffset = jpg->nextOffset; + + // if the distance between ecsPtr and streamBufEndAddr is less than + // 512byte, that rdPtr run over than streamBufEndAddr without interrupt. + // bellow is workaround to avoid this case. + if (jpg->streamBufSize - (jpg->frameOffset + ecsPtr) < JPU_GBU_SIZE) + // if((jpg->streamBufEndAddr - ecsPtr < JPU_GBU_SIZE) ) + { + ret = wraparound_bistream_data(jpg, -1); + } + + if (wrOffset - (jpg->frameOffset + jpg->ecsPtr) < JPU_GBU_SIZE && + jpg->streamEndflag == 0) { + return -1; + } + + return ret; +} +#endif + +int JpegDecodeHeader(JpgDecInfo *jpg) +{ + unsigned int code; + int ret = 1; + int i; + int v; + int wrOffset; + BYTE *b = jpg->pBitStream + jpg->frameOffset; + int size; + + if (jpg->streamWrPtr == jpg->streamBufStartAddr) { + size = jpg->streamBufSize - jpg->frameOffset; + wrOffset = jpg->streamBufSize; + } else { + if (jpg->frameOffset >= + (int)(jpg->streamWrPtr - jpg->streamBufStartAddr)) + size = jpg->streamBufSize - jpg->frameOffset; + else + size = (jpg->streamWrPtr - jpg->streamBufStartAddr) - + jpg->frameOffset; + wrOffset = (jpg->streamWrPtr - jpg->streamBufStartAddr); + } + + if (!b || !size) { + ret = -1; + goto DONE_DEC_HEADER; + } + + /* Change for decoding Motion JPEG */ +#ifndef LIBCVIJPULITE + // find start code of next frame + if (!jpg->ecsPtr) { + int nextOffset = 0; + int soiOffset = 0; + + if (jpg->consumeByte != 0) { + // meaning is frameIdx > 0 + nextOffset = jpg->consumeByte; + if (nextOffset <= 0) + nextOffset = 2; // in order to consume start + // code. + } + + // consume to find the start code of next frame. + b += nextOffset; + size -= nextOffset; + + if (size < 0) { + jpg->consumeByte -= + (b - (jpg->pBitStream + jpg->streamBufSize)); + if (jpg->consumeByte < 0) { + ret = 0; + goto DONE_DEC_HEADER; + } + ret = -1; + goto DONE_DEC_HEADER; + } + + init_get_bits(&jpg->gbc, b, size * 8); + for (;;) { + code = find_start_soi_code(jpg); + if (code == 0) { + ret = -1; + goto DONE_DEC_HEADER; + } + + if (code == SOI_Marker) + break; + } + + soiOffset = (get_bits_count(&jpg->gbc) >> 3); + + b += soiOffset; + size -= soiOffset; + jpg->frameOffset += (soiOffset + nextOffset); + } +#endif + + if (jpg->headerSize > 0 && + (jpg->headerSize > + (jpg->streamBufSize - jpg->frameOffset))) { // if header size is + // smaller than room of + // stream end. copy the + // buffer to bistream + // start. + return wraparound_bistream_data(jpg, -2); + } + + init_get_bits(&jpg->gbc, b, size * 8); + + // Initialize component information table + for (i = 0; i < 4; i++) { + jpg->cInfoTab[i][0] = 0; + jpg->cInfoTab[i][1] = 0; + jpg->cInfoTab[i][2] = 0; + jpg->cInfoTab[i][3] = 0; + jpg->cInfoTab[i][4] = 0; + jpg->cInfoTab[i][5] = 0; + } + + for (;;) { + if (find_start_code(jpg) == 0) { + ret = -1; + goto DONE_DEC_HEADER; + } + + code = get_bits(&jpg->gbc, 16); // getbit 2byte + + switch (code) { + case SOI_Marker: + break; + case JFIF_CODE: + case EXIF_CODE: + if (!decode_app_header(jpg)) { + ret = -1; + goto DONE_DEC_HEADER; + } + break; + case DRI_Marker: + if (!decode_dri_header(jpg)) { + ret = -1; + goto DONE_DEC_HEADER; + } + break; + case DQT_Marker: + if (!decode_dqt_header(jpg)) { + ret = -1; + goto DONE_DEC_HEADER; + } + break; + case DHT_Marker: + if (!decode_dht_header(jpg)) { + ret = -1; + goto DONE_DEC_HEADER; + } + break; + case SOF_Marker: + if (!decode_sof_header(jpg)) { + ret = -1; + goto DONE_DEC_HEADER; + } + break; + case SOS_Marker: + if (!decode_sos_header(jpg)) { + ret = -1; + goto DONE_DEC_HEADER; + } + // TODO we assume header size of all frame is same for + // mjpeg case + if (!jpg->headerSize) + jpg->headerSize = jpg->ecsPtr; + goto DONE_DEC_HEADER; + case EOI_Marker: + goto DONE_DEC_HEADER; + default: + switch (code & 0xFFF0) { + case 0xFFE0: // 0xFFEX + case 0xFFF0: // 0xFFFX + if (get_bits_left(&jpg->gbc) <= 0) { + { + ret = -1; + goto DONE_DEC_HEADER; + } + } else { + if (!decode_app_header(jpg)) { + ret = -1; + goto DONE_DEC_HEADER; + } + break; + } + default: + // in case, restart marker is founded. + if ((code & 0xFFF0) >= 0xFFD0 && + (code & 0xFFF0) <= 0xFFD7) + break; + + // printf("code = [%x]\n", code); + return 0; + } + break; + } + } + +DONE_DEC_HEADER: + if (ret == -1) { + if (wrOffset < jpg->frameOffset) + return -2; + + return -1; + } + + if (!jpg->ecsPtr) + return 0; + + if (wrOffset - (jpg->frameOffset + jpg->ecsPtr) < JPU_GBU_SIZE && + jpg->streamEndflag == 0) { + return -1; + } + + // this bellow is workaround to avoid the case that JPU is run over + // without interrupt. + if (jpg->streamBufSize - (jpg->frameOffset + jpg->ecsPtr) < + JPU_GBU_SIZE) + return wraparound_bistream_data(jpg, -1); + + // Generate Huffman table information + for (i = 0; i < 4; i++) + genDecHuffTab(jpg, i); + + // Q Idx + v = jpg->cInfoTab[0][3]; + v = v << 1 | jpg->cInfoTab[1][3]; + v = v << 1 | jpg->cInfoTab[2][3]; + jpg->Qidx = v; + + // Huff Idx[DC, AC] + v = jpg->cInfoTab[0][4]; + v = v << 1 | jpg->cInfoTab[1][4]; + v = v << 1 | jpg->cInfoTab[2][4]; + jpg->huffDcIdx = v; + + v = jpg->cInfoTab[0][5]; + v = v << 1 | jpg->cInfoTab[1][5]; + v = v << 1 | jpg->cInfoTab[2][5]; + jpg->huffAcIdx = v; + + switch (jpg->format) { + case FORMAT_420: + jpg->busReqNum = 2; + jpg->mcuBlockNum = 6; + jpg->compNum = 3; + jpg->compInfo[0] = 10; + jpg->compInfo[1] = 5; + jpg->compInfo[2] = 5; + jpg->alignedWidth = ((jpg->picWidth + 15) & ~15); + jpg->alignedHeight = ((jpg->picHeight + 15) & ~15); + jpg->mcuWidth = 16; + jpg->mcuHeight = 16; + break; + case FORMAT_422: + jpg->busReqNum = 3; + jpg->mcuBlockNum = 4; + jpg->compNum = 3; + jpg->compInfo[0] = 9; + jpg->compInfo[1] = 5; + jpg->compInfo[2] = 5; + jpg->alignedWidth = ((jpg->picWidth + 15) & ~15); + jpg->alignedHeight = ((jpg->picHeight + 7) & ~7); + jpg->mcuWidth = 16; + jpg->mcuHeight = 8; + break; + case FORMAT_224: + jpg->busReqNum = 3; + jpg->mcuBlockNum = 4; + jpg->compNum = 3; + jpg->compInfo[0] = 6; + jpg->compInfo[1] = 5; + jpg->compInfo[2] = 5; + jpg->alignedWidth = ((jpg->picWidth + 7) & ~7); + jpg->alignedHeight = ((jpg->picHeight + 15) & ~15); + jpg->mcuWidth = 8; + jpg->mcuHeight = 16; + break; + case FORMAT_444: + jpg->busReqNum = 4; + jpg->mcuBlockNum = 3; + jpg->compNum = 3; + jpg->compInfo[0] = 5; + jpg->compInfo[1] = 5; + jpg->compInfo[2] = 5; + jpg->alignedWidth = ((jpg->picWidth + 7) & ~7); + jpg->alignedHeight = ((jpg->picHeight + 7) & ~7); + jpg->mcuWidth = 8; + jpg->mcuHeight = 8; + break; + case FORMAT_400: + jpg->busReqNum = 4; + jpg->mcuBlockNum = 1; + jpg->compNum = 1; + jpg->compInfo[0] = 5; + jpg->compInfo[1] = 0; + jpg->compInfo[2] = 0; + jpg->alignedWidth = ((jpg->picWidth + 7) & ~7); + jpg->alignedHeight = ((jpg->picHeight + 7) & ~7); + jpg->mcuWidth = 8; + jpg->mcuHeight = 8; + break; + } + + return 1; +} + +JpgRet CheckJpgEncOpenParam(JpgEncOpenParam *pop) +{ + int picWidth; + int picHeight; + + if (pop == 0) { + return JPG_RET_INVALID_PARAM; + } + + picWidth = pop->picWidth; + picHeight = pop->picHeight; + + if (pop->bitstreamBuffer % 8) { + CVI_JPG_DBG_ERR( + "bitstreamBuffer %% 8, bitstreamBuffer = 0x%llX\n", + pop->bitstreamBuffer); + return JPG_RET_INVALID_PARAM; + } + + if (pop->bitstreamBufferSize % 1024 || + pop->bitstreamBufferSize < 1024 || + pop->bitstreamBufferSize > MAX_BS_SIZE) { + CVI_JPG_DBG_ERR("bitstreamBufferSize = 0x%x\n", + pop->bitstreamBufferSize); + return JPG_RET_INVALID_PARAM; + } + + if (picWidth < 16 || picWidth > MAX_MJPG_PIC_WIDTH) { + CVI_JPG_DBG_ERR("picWidth = %d\n", picWidth); + return JPG_RET_INVALID_PARAM; + } + if (picHeight < 16 || picHeight > MAX_MJPG_PIC_HEIGHT) { + CVI_JPG_DBG_ERR("picHeight = %d\n", picHeight); + return JPG_RET_INVALID_PARAM; + } + + return JPG_RET_SUCCESS; +} + +JpgRet CheckJpgEncParam(JpgEncHandle handle, JpgEncParam *param) +{ + JpgInst *pJpgInst; + JpgEncInfo *pEncInfo; + + pJpgInst = handle; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + if (param == 0) { + return JPG_RET_INVALID_PARAM; + } + + if (pEncInfo->packedFormat == PACKED_FORMAT_444) { +#ifdef LIBCVIJPULITE + int stride = param->sourceFrame->strideY; +#else + int stride = param->sourceFrame->stride; +#endif + if (stride < pEncInfo->openParam.picWidth * 2) { + return JPG_RET_INVALID_PARAM; + } + if (stride < pEncInfo->openParam.picWidth * 3) { + return JPG_RET_INVALID_PARAM; + } + } + + return JPG_RET_SUCCESS; +} + +int JpgEncGenHuffTab(JpgEncInfo *pEncInfo, int tabNum) +{ + int p, i, l, lastp, si, maxsymbol; + + int *huffsize = vzalloc(sizeof(int) * 256); + int *huffcode = vzalloc(sizeof(int) * 256); + int code; + + BYTE *bitleng, *huffval; + unsigned int *ehufco, *ehufsi; + + bitleng = pEncInfo->pHuffBits[tabNum]; + huffval = pEncInfo->pHuffVal[tabNum]; + ehufco = pEncInfo->huffCode[tabNum]; + ehufsi = pEncInfo->huffSize[tabNum]; + + maxsymbol = tabNum & 1 ? 256 : 16; + + /* Figure C.1: make table of Huffman code length for each symbol */ + + p = 0; + for (l = 1; l <= 16; l++) { + i = bitleng[l - 1]; + if (i < 0 || p + i > maxsymbol) { + vfree(huffsize); + vfree(huffcode); + return 0; + } + while (i--) + huffsize[p++] = l; + } + lastp = p; + + /* Figure C.2: generate the codes themselves */ + /* We also validate that the counts represent a legal Huffman code tree. + */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p] != 0) { + while (huffsize[p] == si) { + huffcode[p++] = code; + code++; + } + if (code >= (1 << si)) { + vfree(huffsize); + vfree(huffcode); + return 0; + } + code <<= 1; + si++; + } + + /* Figure C.3: generate encoding tables */ + /* These are code and size indexed by symbol value */ + + for (i = 0; i < 256; i++) + ehufsi[i] = 0x00; + + for (i = 0; i < 256; i++) + ehufco[i] = 0x00; + + for (p = 0; p < lastp; p++) { + i = huffval[p]; + if (i < 0 || i >= maxsymbol || ehufsi[i]) { + vfree(huffsize); + vfree(huffcode); + return 0; + } + ehufco[i] = huffcode[p]; + ehufsi[i] = huffsize[p]; + } + + vfree(huffsize); + vfree(huffcode); + return 1; +} + +int JpgEncLoadHuffTab(JpgEncInfo *pEncInfo) +{ + int i, j, t; + int huffData; + + for (i = 0; i < 4; i++) + JpgEncGenHuffTab(pEncInfo, i); + + JpuWriteReg(MJPEG_HUFF_CTRL_REG, 0x3); + + for (j = 0; j < 4; j++) { + t = (j == 0) ? AC_TABLE_INDEX0 : + (j == 1) ? AC_TABLE_INDEX1 : + (j == 2) ? DC_TABLE_INDEX0 : + DC_TABLE_INDEX1; + + for (i = 0; i < 256; i++) { + if ((t == DC_TABLE_INDEX0 || t == DC_TABLE_INDEX1) && + (i > 15)) // DC + break; + + if ((pEncInfo->huffSize[t][i] == 0) && + (pEncInfo->huffCode[t][i] == 0)) + huffData = 0; + else { + huffData = (pEncInfo->huffSize[t][i] - + 1); // Code length (1 ~ 16), 4-bit + huffData = (huffData << 16) | + (pEncInfo->huffCode[t][i]); // Code + // word, + // 16-bit + } + JpuWriteReg(MJPEG_HUFF_DATA_REG, huffData); + } + } + JpuWriteReg(MJPEG_HUFF_CTRL_REG, 0x0); + return 1; +} + +int JpgEncLoadQMatTab(JpgEncInfo *pEncInfo) +{ +#ifdef WIN32 + __uint64 dividend = 0x80000, divisor = 0; + __uint64 quotient; +#else + unsigned long long dividend = 0x80000, divisor = 0; + unsigned long long quotient; +#endif + int comp, i, t; + for (comp = 0; comp < 3; comp++) { + int quantID = pEncInfo->pCInfoTab[comp][3]; + if (quantID >= 4) + return 0; + t = (comp == 0) ? Q_COMPONENT0 : + (comp == 1) ? Q_COMPONENT1 : + Q_COMPONENT2; + JpuWriteReg(MJPEG_QMAT_CTRL_REG, 0x3 + t); + for (i = 0; i < 64; i++) { + divisor = pEncInfo->pQMatTab[quantID][i]; + do_div(dividend, divisor); + quotient = dividend; + dividend = 0x80000; + // enhace bit precision & rounding Q + JpuWriteReg(MJPEG_QMAT_DATA_REG, + (divisor << 20) | + (quotient & 0xFFFFF)); + } + JpuWriteReg(MJPEG_QMAT_CTRL_REG, t); + } + + return 1; +} + +int JpgEncEncodeHeader(JpgEncHandle handle, JpgEncParamSet *para) +{ + JpgInst *pJpgInst; + JpgEncInfo *pEncInfo; + int i; + + pJpgInst = handle; + pEncInfo = &pJpgInst->JpgInfo.encInfo; + + if (!para) + return 0; + + for (i = 0; i < JPG_MARKER_ORDER_CNT; i++) { + int done = 0; + + switch (pEncInfo->jpgMarkerOrder[i]) { + case JPG_SOI: + JpgEncEncodeSOI(); + break; + case JPG_DQT: + JpgEncEncodeDQT(pEncInfo, JPG_TBL_NORMAL); + break; + case JPG_DQT_MERGE: + JpgEncEncodeDQT(pEncInfo, JPG_TBL_MERGE); + break; + case JPG_DHT: + JpgEncEncodeDHT(pEncInfo, JPG_TBL_NORMAL); + break; + case JPG_DHT_MERGE: + JpgEncEncodeDHT(pEncInfo, JPG_TBL_MERGE); + break; + case JPG_DRI: + JpgEncEncodeDRI(pEncInfo, FALSE); + break; + case JPG_DRI_OPT: + JpgEncEncodeDRI(pEncInfo, TRUE); + break; + case JPG_SOF0: + JpgEncEncodeSOF0(pEncInfo); + break; + case JPG_JFIF: + JpgEncEncodeApp0JFIF(); + break; + case JPG_FRAME_INDEX: + JpgEncEncodeApp9FrameIndex(pEncInfo); + break; + case JPG_ADOBE: +#ifdef MJPEG_INTERFACE_API + JpgEncEncodeApp14Adobe(pEncInfo); +#endif + break; + case JPG_USER_DATA: + JpgEncEncodeApp15UserData(pEncInfo); + break; + default: + done = 1; + break; + } + + if (done) + break; + } + + pEncInfo->frameIdx++; + + return 1; +} + +JpgRet JpgEnterLock(void) +{ + mutex_lock_interruptible(&jpgLock); + + return JPG_RET_SUCCESS; +} + +JpgRet JpgEnterTryLock(void) +{ + int ret = 0; + + ret = mutex_trylock(&jpgLock); + if (ret == 1) { + //try lock success + return JPG_RET_SUCCESS; + + } else { + //lock failure + return JPG_RET_FAILURE; + } +} + +JpgRet JpgEnterTimeLock(int timeout_ms) +{ + int ret = 0; + int wait_cnt_ms = 1; + + while (mutex_is_locked(&jpgLock)) { + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(usecs_to_jiffies(1000)); + if (wait_cnt_ms >= timeout_ms) { + break; + } + wait_cnt_ms++; + } + + ret = mutex_trylock(&jpgLock); + // mutex_trylock returns 1 if the mutex has been acquired successfully, + // and 0 on contention. + if (ret == 0) { + //time lock failure + ret = JPG_RET_FAILURE; + } else { + //timelock success + ret = JPG_RET_SUCCESS; + } + return ret; +} + +JpgRet JpgLeaveLock(void) +{ + mutex_unlock(&jpgLock); + return JPG_RET_SUCCESS; +} + +JpgRet JpgSetClockGate(Uint32 on) +{ + JpgInst *inst; + jpu_instance_pool_t *jip; + + jip = (jpu_instance_pool_t *)jdi_get_instance_pool(); + if (!jip) + return JPG_RET_FAILURE; + + inst = jip->pendingInst; + if (inst && !on) + return JPG_RET_SUCCESS; + + return JPG_RET_SUCCESS; +} + +void SetJpgPendingInst(JpgInst *inst) +{ + jpu_instance_pool_t *jip = jdi_get_instance_pool(); + if (!jip) + return; + + jip->pendingInst = inst; +} + +void ClearJpgPendingInst(void) +{ + jpu_instance_pool_t *jip = jdi_get_instance_pool(); + if (!jip) + return; + + if (jip->pendingInst) + jip->pendingInst = NULL; +} + +JpgInst *GetJpgPendingInst(void) +{ + jpu_instance_pool_t *jip = jdi_get_instance_pool(); + if (!jip) + return NULL; + + return jip->pendingInst; +} + diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapifunc.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapifunc.h new file mode 100644 index 0000000000..3d0c713b11 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuapifunc.h @@ -0,0 +1,355 @@ + +#ifndef JPUAPI_UTIL_H_INCLUDED +#define JPUAPI_UTIL_H_INCLUDED + +#include "jpuapi.h" +#ifndef LIBCVIJPULITE +#include "mixer.h" +#endif +#include "regdefine.h" + +#define DC_TABLE_INDEX0 0 +#define AC_TABLE_INDEX0 1 +#define DC_TABLE_INDEX1 2 +#define AC_TABLE_INDEX1 3 + +#define Q_COMPONENT0 0 +#define Q_COMPONENT1 0x40 +#define Q_COMPONENT2 0x80 + +#define USER_DATA_BUF_SIZE 1024 +#define USER_DATA_MARKER 0xFFEF // Application segment 15 +#define USER_DATA_MARKER_CODE_SIZE 2 // 2 bytes for segment marker, 0xffef +#define USER_DATA_LENGTH_CODE_SIZE 2 // 2 bytes encoding segment length + +#define JPG_MARKER_ORDER_CNT 16 +#define JPG_MARKER_ORDER_BUF_SIZE (sizeof(int) * JPG_MARKER_ORDER_CNT) + +#ifdef MJPEG_INTERFACE_API +#define NUM_FRAME_BUF MAX_FRAME +#endif /* MJPEG_INTERFACE_API */ + +//#define DUMP_JPU_REGS +typedef enum { + JPG_START_PIC = 0, + JPG_START_INIT, + JPG_START_STOP, + JPG_START_PARTIAL +} JpgStartCmd; + +typedef struct { + UINT tag; + UINT type; + int count; + int offset; +} TAG; + +enum { JFIF = 0, JFXX_JPG = 1, JFXX_PAL = 2, JFXX_RAW = 3, EXIF_JPG = 4 }; + +typedef enum { + JPG_SOI = 1, + JPG_DQT, + JPG_DQT_MERGE, + JPG_DHT, + JPG_DHT_MERGE, + JPG_DRI, + JPG_DRI_OPT, + JPG_SOF0, + JPG_JFIF, + JPG_FRAME_INDEX, + JPG_ADOBE, + JPG_USER_DATA, +} JpgMarker; + +typedef struct { + int PicX; + int PicY; + int BitPerSample[3]; + int Compression; // 1 for uncompressed / 6 for compressed(jpeg) + int PixelComposition; // 2 for RGB / 6 for YCbCr + int SamplePerPixel; + int PlanrConfig; // 1 for chunky / 2 for planar + int YCbCrSubSample; // 00020002 for YCbCr 4:2:0 / 00020001 for YCbCr + // 4:2:2 + UINT JpegOffset; + UINT JpegThumbSize; +} EXIF_INFO; + +typedef struct { + BYTE *buffer; + int index; + int size; +} jpu_getbit_context_t; + +#define init_get_bits(CTX, BUFFER, SIZE) JpuGbuInit(CTX, BUFFER, SIZE) +#define show_bits(CTX, NUM) JpuGguShowBit(CTX, NUM) +#define get_bits(CTX, NUM) JpuGbuGetBit(CTX, NUM) +#define get_bits_left(CTX) JpuGbuGetLeftBitCount(CTX) +#define get_bits_count(CTX) JpuGbuGetUsedBitCount(CTX) + +typedef struct { + PhysicalAddress streamWrPtr; + PhysicalAddress streamRdPtr; + int streamEndflag; + PhysicalAddress streamBufStartAddr; + PhysicalAddress streamBufEndAddr; + int streamBufSize; + BYTE *pBitStream; + + int frameOffset; + int consumeByte; + int nextOffset; + int currOffset; + + FrameBuffer *frameBufPool; + int numFrameBuffers; + int stride; + int rotationEnable; + int mirrorEnable; + int mirrorDirection; + int rotationAngle; + FrameBuffer rotatorOutput; + int rotatorStride; + int rotatorOutputValid; + int initialInfoObtained; + int minFrameBufferNum; + int streamEndian; + int frameEndian; + int chromaInterleave; + + int picWidth; + int picHeight; + int alignedWidth; + int alignedHeight; + int headerSize; + int ecsPtr; + int pagePtr; + int wordPtr; + int bitPtr; + int format; + int rstIntval; + + int userHuffTab; + + int huffDcIdx; + int huffAcIdx; + int Qidx; + + BYTE huffVal[4][162]; + BYTE huffBits[4][256]; + BYTE cInfoTab[4][6]; + BYTE qMatTab[4][64]; + + Uint32 huffMin[4][16]; + Uint32 huffMax[4][16]; + BYTE huffPtr[4][16]; + + // partial + int usePartial; + int lineNum; + int bufNum; + + int busReqNum; + int compNum; + int mcuBlockNum; + int compInfo[3]; + int frameIdx; + int bitEmpty; + int iHorScaleMode; + int iVerScaleMode; + int mcuWidth; + int mcuHeight; + jpu_getbit_context_t gbc; + +#ifdef MJPEG_ERROR_CONCEAL + // error conceal + struct { + int bError; + int rstMarker; + int errPosX; + int errPosY; + } errInfo; + + int curRstIdx; + int nextRstIdx; + int setPosX; + int setPosY; + int gbuStartPtr; // entry point in stream buffer before pic_run + + int numRstMakerRounding; +#endif + + // ROI + int roiEnable; + int roiOffsetX; + int roiOffsetY; + int roiWidth; + int roiHeight; + int roiMcuOffsetX; + int roiMcuOffsetY; + int roiMcuWidth; + int roiMcuHeight; + int packedFormat; + int dst_type; + FrameBuffer dst_info; + +#ifdef MJPEG_INTERFACE_API + FrameBuffer frameBuf[MAX_FRAME_JPU]; + FRAME_BUF *pFrame[MAX_FRAME_JPU]; + // Uint32 framebufStride; +#endif /* MJPEG_INTERFACE_API */ + +} JpgDecInfo; + +typedef struct { + JpgEncOpenParam openParam; + JpgEncInitialInfo initialInfo; + PhysicalAddress streamRdPtr; + PhysicalAddress streamWrPtr; + PhysicalAddress streamBufStartAddr; + PhysicalAddress streamBufEndAddr; + int streamBufSize; + BYTE *pBitStream; + + FrameBuffer *frameBufPool; + int numFrameBuffers; + int stride; + int rotationEnable; + int mirrorEnable; + int mirrorDirection; + int rotationAngle; + int initialInfoObtained; + + int picWidth; + int picHeight; + int alignedWidth; + int alignedHeight; + int seqInited; + int frameIdx; + FrameFormat sourceFormat; + + int streamEndian; + int frameEndian; + CbCrInterLeave chromaInterleave; + + int rstIntval; + int busReqNum; + int mcuBlockNum; + int compNum; + int compInfo[3]; + + // give command + int disableAPPMarker; + int quantMode; + int stuffByteEnable; + + Uint32 huffCode[4][256]; + Uint32 huffSize[4][256]; + BYTE *pHuffVal[4]; + BYTE *pHuffBits[4]; + BYTE *pCInfoTab[4]; + BYTE *pQMatTab[4]; + // partial + int usePartial; + int partiallineNum; + int partialBufNum; + PackedOutputFormat packedFormat; + + JpgEncParamSet *paraSet; + +#ifdef MJPEG_INTERFACE_API + FrameBuffer frameBuf[MAX_FRAME_JPU]; + FRAME_BUF *pFrame[MAX_FRAME_JPU]; + Uint32 framebufStride; + int encHeaderMode; + int rgbPacked; +#endif /* MJPEG_INTERFACE_API */ + + Uint32 userDataLen; + BYTE userData[USER_DATA_BUF_SIZE]; + + JpgMarker jpgMarkerOrder[JPG_MARKER_ORDER_CNT]; + + BYTE *pPreStream; + Uint32 preStreamLen; + BYTE *pFinalStream; + + bool bIsoSendFrmEn; + + struct task_struct *tPthreadId; + struct completion semSendEncCmd; + struct completion semGetStreamCmd; + jpu_buffer_t tEncBitstreamData; + + bool bSbmEn; +} JpgEncInfo; + +typedef struct JpgInst { + int inUse; + int instIndex; + int loggingEnable; +#ifdef MJPEG_INTERFACE_API + /* 0 -- CVIJPGCOD_UNKNOWN */ + /* 1 -- CVIJPGCOD_DEC */ + /* 2 -- CVIJPGCOD_ENC */ + int type; +#endif /* MJPEG_INTERFACE_API */ + union { + JpgEncInfo encInfo; + JpgDecInfo decInfo; + } JpgInfo; + Uint64 u64StartTime; + Uint64 u64EndTime; + int s32ChnNum; +} JpgInst; + +extern unsigned char sJpuCompInfoTable[5][24]; + +#ifdef __cplusplus +extern "C" { +#endif + +JpgRet InitJpgInstancePool(void); +JpgRet GetJpgInstance(JpgInst **ppInst); +void FreeJpgInstance(JpgInst *pJpgInst); +JpgRet CheckJpgInstValidity(JpgInst *pci); +JpgRet CheckJpgDecOpenParam(JpgDecOpenParam *pop); + +int JpuGbuInit(jpu_getbit_context_t *ctx, BYTE *buffer, int size); +int JpuGbuGetUsedBitCount(jpu_getbit_context_t *ctx); +int JpuGbuGetLeftBitCount(jpu_getbit_context_t *ctx); +unsigned int JpuGbuGetBit(jpu_getbit_context_t *ctx, int bit_num); +unsigned int JpuGguShowBit(jpu_getbit_context_t *ctx, int bit_num); + +int JpegDecodeHeader(JpgDecInfo *jpg); +int JpgDecQMatTabSetUp(JpgDecInfo *jpg); +int JpgDecHuffTabSetUp(JpgDecInfo *jpg); +void JpgDecGramSetup(JpgDecInfo *jpg); + +JpgRet CheckJpgEncOpenParam(JpgEncOpenParam *pop); +JpgRet CheckJpgEncParam(JpgEncHandle handle, JpgEncParam *param); +int JpgEncLoadHuffTab(JpgEncInfo *pJpgEncInfo); +int JpgEncLoadQMatTab(JpgEncInfo *pJpgEncInfo); +int JpgEncEncodeHeader(JpgEncHandle handle, JpgEncParamSet *para); + +JpgRet JpgEnterLock(void); +JpgRet JpgEnterTryLock(void); +JpgRet JpgEnterTimeLock(int timout_ms); +JpgRet JpgLeaveLock(void); +JpgRet JpgSetClockGate(Uint32 on); + +void SetJpgPendingInst(JpgInst *inst); +void ClearJpgPendingInst(void); +JpgInst *GetJpgPendingInst(void); + +//void *JpuProcessEnterLock(void); +//void JpuProcessLeaveLock(void *lock); +#ifdef MJPEG_ERROR_CONCEAL +int JpegDecodeConcealError(JpgDecInfo *jpg); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* JPUAPI_UTIL_H_INCLUDED */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuconfig.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuconfig.h new file mode 100644 index 0000000000..b3edd26374 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jpuconfig.h @@ -0,0 +1,60 @@ + +#ifndef _JPU_CONFIG_H_ +#define _JPU_CONFIG_H_ + +#include "../config.h" +#include "jputypes.h" + +#define MAX_NUM_INSTANCE 8 +#define MAX_INST_HANDLE_SIZE (13 * 1024) + +#ifdef JPU_FPGA_PLATFORM +#define JPU_FRAME_ENDIAN JDI_BIG_ENDIAN +#define JPU_STREAM_ENDIAN JDI_BIG_ENDIAN +#else +#define JPU_FRAME_ENDIAN JDI_LITTLE_ENDIAN +#define JPU_STREAM_ENDIAN JDI_LITTLE_ENDIAN +#endif +#define JPU_CHROMA_INTERLEAVE 1 + // 0 (chroma separate mode), 1 (cbcr interleave mode), 2 (crcb + // interleave mode) + +#ifdef FPGA_PORTING +#define JPU_INTERRUPT_TIMEOUT_MS 4000 +#else +#define JPU_INTERRUPT_TIMEOUT_MS 2000 +#endif + +#define JPU_STUFFING_BYTE_FF 0 // 0 : ON ("0xFF"), 1 : OFF ("0x00") for stuffing + +#define JPU_PARTIAL_DECODE 1 // 0 : OFF, 1 : ON + +#define MAX_MJPG_PIC_WIDTH 32768 +#define MAX_MJPG_PIC_HEIGHT 32768 + +// TODO +#define MAX_FRAME (19 * MAX_NUM_INSTANCE) + // For AVC decoder, 16(reference) + 2(current) + 1(rotator) +#define MAX_FRAME_JPU 4 // the number of frame buffers for JPEG + +#define STREAM_FILL_SIZE 0x10000 +#define STREAM_END_SIZE 0 + +#define JPU_GBU_SIZE 512 + +#define VERIFY_IC 0 + +#if VERIFY_IC +#define STREAM_BUF_SIZE 0x1000000 +#define LARGE_STREAM_BUF_SIZE STREAM_BUF_SIZE +#else +// total 16MB in jpu_reserved(DTS file), jpu kernel use 0x18058 +#define STREAM_BUF_SIZE 0x0780000 // 8192*8192 jpg encode +#define LARGE_STREAM_BUF_SIZE 0x0900000 // 4096 * 2304 = 9MB +#endif + +#define JPU_CHECK_WRITE_RESPONSE_BVALID_SIGNAL 0 + +#define MAX_NUM_JPU_CORE 1 + +#endif /* _JPU_CONFIG_H_ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jputable.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jputable.h new file mode 100644 index 0000000000..115daa3aec --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jputable.h @@ -0,0 +1,116 @@ +#ifndef JPU_TABLE_H +#define JPU_TABLE_H + +static unsigned char lumaDcBits[16] = { + 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +static unsigned char lumaDcValue[16] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x00, +}; +static unsigned char lumaAcBits[16] = { + 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, + 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, +}; +static unsigned char lumaAcValue[168] = { + 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, + 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, + 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, + 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, + 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, + 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, + 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, + 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, + 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +static unsigned char chromaDcBits[16] = { + 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +static unsigned char chromaDcValue[16] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x00, +}; +static unsigned char chromaAcBits[16] = { + 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, + 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, +}; +static unsigned char chromaAcValue[168] = { + 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, + 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, + 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, + 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, + 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, + 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, + 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, + 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +#ifdef NOT_USED +static unsigned char lumaQ[64] = { + 0x0C, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0C, 0x09, 0x09, 0x0C, 0x11, + 0x0B, 0x0A, 0x0B, 0x11, 0x15, 0x0F, 0x0C, 0x0C, 0x0F, 0x15, 0x18, + 0x13, 0x13, 0x15, 0x13, 0x13, 0x18, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, +}; + +static unsigned char chromaBQ[64] = { + 0x0D, 0x0B, 0x0B, 0x0D, 0x0E, 0x0D, 0x10, 0x0E, 0x0E, 0x10, 0x14, + 0x0E, 0x0E, 0x0E, 0x14, 0x14, 0x0E, 0x0E, 0x0E, 0x0E, 0x14, 0x11, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x11, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, +}; +static unsigned char chromaRQ[64] = { + 0x0D, 0x0B, 0x0B, 0x0D, 0x0E, 0x0D, 0x10, 0x0E, 0x0E, 0x10, 0x14, + 0x0E, 0x0E, 0x0E, 0x14, 0x14, 0x0E, 0x0E, 0x0E, 0x0E, 0x14, 0x11, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x11, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, +}; +#endif +static unsigned char lumaQ2[64] = { + 0x06, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x05, 0x05, 0x06, 0x09, + 0x06, 0x05, 0x06, 0x09, 0x0B, 0x08, 0x06, 0x06, 0x08, 0x0B, 0x0C, + 0x0A, 0x0A, 0x0B, 0x0A, 0x0A, 0x0C, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x10, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, +}; +static unsigned char chromaBQ2[64] = { + 0x07, 0x07, 0x07, 0x0D, 0x0C, 0x0D, 0x18, 0x10, 0x10, 0x18, 0x14, + 0x0E, 0x0E, 0x0E, 0x14, 0x14, 0x0E, 0x0E, 0x0E, 0x0E, 0x14, 0x11, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x11, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, +}; + +#ifdef NOT_USED +static unsigned char chromaRQ2[64] = { + 0x07, 0x07, 0x07, 0x0D, 0x0C, 0x0D, 0x18, 0x10, 0x10, 0x18, 0x14, + 0x0E, 0x0E, 0x0E, 0x14, 0x14, 0x0E, 0x0E, 0x0E, 0x0E, 0x14, 0x11, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x11, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x11, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, + 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, +}; +#endif + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jputypes.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jputypes.h new file mode 100644 index 0000000000..e207bc5309 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/jputypes.h @@ -0,0 +1,60 @@ + +#ifndef _JPU_TYPES_H_ +#define _JPU_TYPES_H_ + +typedef unsigned int UINT; +typedef unsigned char Uint8; +typedef unsigned int Uint32; +typedef unsigned short Uint16; +typedef char Int8; +typedef int Int32; +typedef short Int16; +#if defined(_MSC_VER) +typedef unsigned _int64 Uint64; +typedef _int64 Int64; +#else +typedef unsigned long long Uint64; +typedef long long Int64; +#endif +typedef Uint64 PhysicalAddress; +typedef unsigned char BYTE; +typedef int BOOL; + +#ifndef HAVE_STDINT_H + +typedef unsigned char uint8_t; +typedef unsigned int uint32_t; +typedef int int32_t; +typedef unsigned short uint16_t; +typedef short int16_t; +#if defined(_MSC_VER) +typedef unsigned _int64 uint64_t; +typedef _int64 int64_t; +#endif + +#ifndef __int8_t_defined +typedef signed char int8_t; +#endif + +typedef int int32_t; +typedef short int16_t; + +#ifndef BYTE +typedef unsigned char BYTE; +#endif + +#ifndef BOOL +typedef int BOOL; +#endif +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#if defined(linux) || defined(__linux) || defined(ANDROID) +#define TRUE 1 +#define FALSE 0 +#endif + +#endif /* _JPU_TYPES_H_ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/regdefine.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/regdefine.h new file mode 100644 index 0000000000..c86b4e7cac --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/jpuapi/regdefine.h @@ -0,0 +1,146 @@ +#include "../config.h" + +#ifndef NPT_REGDEFINE_H_INCLUDED +#define NPT_REGDEFINE_H_INCLUDED + +//------------------------------------------------------------------------------ +// REGISTER BASE +//------------------------------------------------------------------------------ +#define NPT_REG_SIZE 0x300 +#define NPT_REG_BASE (0x10000000 + 0x3000) + +#define NPT_BASE 0x00 + +/*-------------------------------------------------------------------- +NIEUPORT REGISTERS +--------------------------------------------------------------------*/ +// MAIN CONTROL REGISTER +#define MJPEG_PIC_START_REG (NPT_BASE + 0x000) + // [3] - start partial encoding [2] - pic stop + // en/decoding[1] - pic init en/decoding [0] - pic + // start en/decoding +#define MJPEG_PIC_STATUS_REG (NPT_BASE + 0x004) + // [8] - stop [7:4] - partial buffer interrupt [3] - + // overflow, [2] - bbc interrupt, [1] - error, [0] - + // done +#define MJPEG_PIC_ERRMB_REG (NPT_BASE + 0x008) + // [27:24] - error restart idx, [23:12] - error MCU + // pos X, [11:0] - error MCU pos Y +#define MJPEG_PIC_SETMB_REG (NPT_BASE + 0x00C) + // [27:16] - MCU pos X, [11:0] - MCU pos Y + +#define MJPEG_PIC_CTRL_REG (NPT_BASE + 0x010) + // [12:7] huffman table index [6] - user huffman en, + // [4] - TC direction, [3] - encoder enable, [1:0] - + // operation mode +#define MJPEG_PIC_SIZE_REG (NPT_BASE + 0x014) +#define MJPEG_MCU_INFO_REG (NPT_BASE + 0x018) +#define MJPEG_ROT_INFO_REG (NPT_BASE + 0x01C) + // [4] - rot-mir enable, [3:0] - rot-mir mode + +#define MJPEG_SCL_INFO_REG (NPT_BASE + 0x020) +#define MJPEG_IF_INFO_REG (NPT_BASE + 0x024) + // [1] - sensor interface clear, [0] - display + // interface clear +#define MJPEG_CLP_INFO_REG (NPT_BASE + 0x028) +#define MJPEG_OP_INFO_REG (NPT_BASE + 0x02C) + // [31:16] - # of line in 1 partial buffer, [5:3] - # + // of partial buffers [2:0] - # of request + +#define MJPEG_DPB_CONFIG_REG (NPT_BASE + 0x030) +#define MJPEG_DPB_BASE00_REG (NPT_BASE + 0x034) +#define MJPEG_DPB_BASE01_REG (NPT_BASE + 0x038) +#define MJPEG_DPB_BASE02_REG (NPT_BASE + 0x03C) + +#define MJPEG_DPB_BASE10_REG (NPT_BASE + 0x040) +#define MJPEG_DPB_BASE11_REG (NPT_BASE + 0x044) +#define MJPEG_DPB_BASE12_REG (NPT_BASE + 0x048) +#define MJPEG_DPB_BASE20_REG (NPT_BASE + 0x04C) + +#define MJPEG_DPB_BASE21_REG (NPT_BASE + 0x050) +#define MJPEG_DPB_BASE22_REG (NPT_BASE + 0x054) +#define MJPEG_DPB_BASE30_REG (NPT_BASE + 0x058) +#define MJPEG_DPB_BASE31_REG (NPT_BASE + 0x05C) + +#define MJPEG_DPB_BASE32_REG (NPT_BASE + 0x060) +#define MJPEG_DPB_YSTRIDE_REG (NPT_BASE + 0x064) +#define MJPEG_DPB_CSTRIDE_REG (NPT_BASE + 0x068) +#define MJPEG_WRESP_CHECK_REG (NPT_BASE + 0x06C) + +#define MJPEG_CLP_BASE_REG (NPT_BASE + 0x070) +#define MJPEG_CLP_SIZE_REG (NPT_BASE + 0x074) + +#define MJPEG_HUFF_CTRL_REG (NPT_BASE + 0x080) +#define MJPEG_HUFF_ADDR_REG (NPT_BASE + 0x084) +#define MJPEG_HUFF_DATA_REG (NPT_BASE + 0x088) + +#define MJPEG_QMAT_CTRL_REG (NPT_BASE + 0x090) +#define MJPEG_QMAT_ADDR_REG (NPT_BASE + 0x094) +#define MJPEG_QMAT_DATA_REG (NPT_BASE + 0x098) + +#define MJPEG_COEF_CTRL_REG (NPT_BASE + 0x0A0) +#define MJPEG_COEF_ADDR_REG (NPT_BASE + 0x0A4) +#define MJPEG_COEF_DATA_REG (NPT_BASE + 0x0A8) + +#define MJPEG_RST_INTVAL_REG (NPT_BASE + 0x0B0) +#define MJPEG_RST_INDEX_REG (NPT_BASE + 0x0B4) +#define MJPEG_RST_COUNT_REG (NPT_BASE + 0x0B8) + +#define MJPEG_INTR_MASK_REG (NPT_BASE + 0x0C0) +#define MJPEG_CYCLE_INFO_REG (NPT_BASE + 0x0C8) + +#define MJPEG_DPCM_DIFF_Y_REG (NPT_BASE + 0x0F0) +#define MJPEG_DPCM_DIFF_CB_REG (NPT_BASE + 0x0F4) +#define MJPEG_DPCM_DIFF_CR_REG (NPT_BASE + 0x0F8) + +// GBU CONTROL REGISTER +#define MJPEG_GBU_CTRL_REG (NPT_BASE + 0x100) + // [3] - GBU flush for encoding [2] - init GBU for + // decoding [1] - init GBU ff emulation for decoding + // [0] - reserved +#define MJPEG_GBU_PBIT_BUSY_REG (NPT_BASE + 0x104) + +#define MJPEG_GBU_BT_PTR_REG (NPT_BASE + 0x110) +#define MJPEG_GBU_WD_PTR_REG (NPT_BASE + 0x114) +#define MJPEG_GBU_TT_CNT_REG (NPT_BASE + 0x118) +//#define MJPEG_GBU_TT_CNT_REG+4 (NPT_BASE + 0x11C) + +#define MJPEG_GBU_PBIT_08_REG (NPT_BASE + 0x120) +#define MJPEG_GBU_PBIT_16_REG (NPT_BASE + 0x124) +#define MJPEG_GBU_PBIT_24_REG (NPT_BASE + 0x128) +#define MJPEG_GBU_PBIT_32_REG (NPT_BASE + 0x12C) + +#define MJPEG_GBU_BBSR_REG (NPT_BASE + 0x140) +#define MJPEG_GBU_BBER_REG (NPT_BASE + 0x144) +#define MJPEG_GBU_BBIR_REG (NPT_BASE + 0x148) +#define MJPEG_GBU_BBHR_REG (NPT_BASE + 0x14C) + +#define MJPEG_GBU_BCNT_REG (NPT_BASE + 0x158) + +#define MJPEG_GBU_FF_RPTR_REG (NPT_BASE + 0x160) +#define MJPEG_GBU_FF_WPTR_REG (NPT_BASE + 0x164) + +// BBC CONTROL REGISTER +#define MJPEG_BBC_END_ADDR_REG (NPT_BASE + 0x208) +#define MJPEG_BBC_WR_PTR_REG (NPT_BASE + 0x20C) +#define MJPEG_BBC_RD_PTR_REG (NPT_BASE + 0x210) + +#define MJPEG_BBC_EXT_ADDR_REG (NPT_BASE + 0x214) +#define MJPEG_BBC_INT_ADDR_REG (NPT_BASE + 0x218) +#define MJPEG_BBC_DATA_CNT_REG (NPT_BASE + 0x21C) +#define MJPEG_BBC_COMMAND_REG (NPT_BASE + 0x220) + // [2:1] - endianness [0] - load/save +#define MJPEG_BBC_BUSY_REG (NPT_BASE + 0x224) + +#define MJPEG_BBC_CTRL_REG (NPT_BASE + 0x228) + // [2:1] - endianness [0] - BBC auto run +#define MJPEG_BBC_CUR_POS_REG (NPT_BASE + 0x22C) + +#define MJPEG_BBC_BAS_ADDR_REG (NPT_BASE + 0x230) +#define MJPEG_BBC_STRM_CTRL_REG (NPT_BASE + 0x234) + // [31] - end of bitstream file [23:0] - stream + // counter + +#define MJPEG_BBC_FLUSH_CMD_REG (NPT_BASE + 0x238) + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/src/jpuhelper.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/src/jpuhelper.c new file mode 100644 index 0000000000..2e10dd8c18 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/src/jpuhelper.c @@ -0,0 +1,1305 @@ +#include +#include +#include "../jpuapi/regdefine.h" +#include "../jpuapi/jpuapi.h" +#include "../jpuapi/jpuapifunc.h" +#include "../jpuapi/jputable.h" +#include "../include/jpulog.h" +#include "../include/jpuhelper.h" + +//#define INCREASE_Q_MATRIX + +static int FillSdramBurst(BufInfo *pBufInfo, PhysicalAddress targetAddr, + PhysicalAddress bsBufStartAddr, + PhysicalAddress bsBufEndAddr, Uint32 size, + int checkeos, int *streameos, int endian); +#ifdef REDUNDENT_CODE +static int StoreYuvImageBurstFormat(Uint8 *dst, int picWidth, int picHeight, + unsigned long addrY, unsigned long addrCb, + unsigned long addrCr, int stride, + int interLeave, int format, int endian, + int packed); +static void ProcessEncodedBitstreamBurst(FILE *fp, unsigned long targetAddr, + PhysicalAddress bsBufStartAddr, + PhysicalAddress bsBufEndAddr, int size, + int endian); +#endif + +// Figure A.6 - Zig-zag sequence of quantized DCT coefficients +const int InvScanTable[64] = { 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, + 13, 16, 26, 29, 42, 3, 8, 12, 17, 25, 30, + 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, + 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, + 46, 51, 55, 60, 21, 34, 37, 47, 50, 56, 59, + 61, 35, 36, 48, 49, 57, 58, 62, 63 }; + +const int ScanTable[64] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, + 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, + 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, + 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, + 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 }; + +JpgRet WriteJpgBsBufHelper(JpgDecHandle handle, BufInfo *pBufInfo, + PhysicalAddress paBsBufStart, + PhysicalAddress paBsBufEnd, int defaultsize, + int checkeos, int *pstreameos, int endian) +{ + JpgRet ret = JPG_RET_SUCCESS; + int size = 0; + int fillSize = 0; + PhysicalAddress paRdPtr, paWrPtr; + + ret = JPU_DecGetBitstreamBuffer(handle, &paRdPtr, &paWrPtr, &size); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_DecGetBitstreamBuffer failed Error code is 0x%x\n", + ret); + goto FILL_BS_ERROR; + } + + if (size <= 0) { +#ifdef MJPEG_INTERFACE_API + size += pBufInfo->size - pBufInfo->point; +#else + /* !! error designed !!*/ + return JPG_RET_SUCCESS; +#endif + } + + if (defaultsize) { + if (size < defaultsize) + fillSize = size; + else + fillSize = defaultsize; + } else { + fillSize = size; + } + + fillSize = FillSdramBurst(pBufInfo, paWrPtr, paBsBufStart, paBsBufEnd, + fillSize, checkeos, pstreameos, endian); + + if (*pstreameos == 0) { + ret = JPU_DecUpdateBitstreamBuffer(handle, fillSize); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_DecUpdateBitstreamBuffer failed Error code is 0x%x\n", + ret); + goto FILL_BS_ERROR; + } + + if ((pBufInfo->size - pBufInfo->point) <= 0) { + ret = JPU_DecUpdateBitstreamBuffer(handle, + STREAM_END_SIZE); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_DecUpdateBitstreamBuffer failed Error code is 0x%x\n", + ret); + goto FILL_BS_ERROR; + } + + pBufInfo->fillendbs = 1; + } + } else { + if (!pBufInfo->fillendbs) { + ret = JPU_DecUpdateBitstreamBuffer(handle, + STREAM_END_SIZE); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_DecUpdateBitstreamBuffer failed Error code is 0x%x\n", + ret); + goto FILL_BS_ERROR; + } + pBufInfo->fillendbs = 1; + } + } + +FILL_BS_ERROR: + + return ret; +} + +#ifdef REDUNDENT_CODE +/** + * Bitstream Read for encoders + */ +JpgRet ReadJpgBsBufHelper(JpgEncHandle handle, FILE *bsFp, + PhysicalAddress paBsBufStart, + PhysicalAddress paBsBufEnd, int encHeaderSize, + int endian) +{ + JpgRet ret = JPG_RET_SUCCESS; + int loadSize = 0; + int stuffSize; + PhysicalAddress paRdPtr, paWrPtr; + int size = 0; + + ret = JPU_EncGetBitstreamBuffer(handle, &paRdPtr, &paWrPtr, &size); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_EncGetBitstreamBuffer failed Error code is 0x%x\n", + ret); + goto LOAD_BS_ERROR; + } + + if (size > 0) { + stuffSize = 0; + if (encHeaderSize && (size + encHeaderSize) % 8) { + stuffSize = (size + encHeaderSize) - + (((size + encHeaderSize) >> 3) << 3); + stuffSize = 8 - stuffSize; + } + + loadSize = size; + + if (loadSize > 0) { + ProcessEncodedBitstreamBurst(bsFp, paRdPtr, + paBsBufStart, paBsBufEnd, + loadSize, endian); + + ret = JPU_EncUpdateBitstreamBuffer(handle, loadSize); + if (ret != JPG_RET_SUCCESS) { + JLOG(ERR, + "JPU_EncUpdateBitstreamBuffer failed Error code is 0x%x\n", + ret); + goto LOAD_BS_ERROR; + } + } + } + +LOAD_BS_ERROR: + + return ret; +} +#endif + +/****************************************************************************** + DPB Image Data Control +******************************************************************************/ +#ifdef REDUNDENT_CODE +int LoadYuvPartialImageHelperFormat( + FILE *yuvFp, Uint8 *pYuv, PhysicalAddress addrY, PhysicalAddress addrCb, + PhysicalAddress addrCr, int picWidth, int picHeight, + int picHeightPartial, int stride, int interleave, int format, + int endian, int partPosIdx, int frameIdx, int packed) +{ + int LumaPicSize; + int ChromaPicSize; + int LumaPartialSize; + int ChromaPartialSize; + int pos; + int divX, divY; + int frameSize; + + divX = format == FORMAT_420 || format == FORMAT_422 ? 2 : 1; + divY = format == FORMAT_420 || format == FORMAT_224 ? 2 : 1; + + LumaPicSize = picWidth * picHeight; + ChromaPicSize = LumaPicSize / divX / divY; + + LumaPartialSize = picWidth * picHeightPartial; + ChromaPartialSize = LumaPartialSize / divX / divY; + + if (format == FORMAT_400) + frameSize = LumaPicSize; + else + frameSize = LumaPicSize + ChromaPicSize * 2; + // Load source one picture image to encode to SDRAM frame buffer. + + if (packed) { + if (packed == PACKED_FORMAT_444) { + LumaPicSize = picWidth * 3 * picHeight; + LumaPartialSize = picWidth * 3 * picHeightPartial; + } else { + LumaPicSize = picWidth * 2 * picHeight; + LumaPartialSize = picWidth * 2 * picHeightPartial; + } + frameSize = LumaPicSize; + ChromaPicSize = 0; + ChromaPartialSize = 0; + } + + // Y + fseek(yuvFp, (frameIdx * frameSize), SEEK_SET); + pos = LumaPartialSize * partPosIdx; + fseek(yuvFp, pos, SEEK_CUR); + + if (!fread(pYuv, 1, LumaPartialSize, yuvFp)) { + if (!feof(yuvFp)) + JLOG(ERR, + "Yuv Data fread failed file handle is 0x%x\n", + yuvFp); + return 0; + } + + if (format != FORMAT_400 && packed == 0) { + // Cb + fseek(yuvFp, (frameIdx * frameSize), SEEK_SET); + pos = LumaPicSize + ChromaPartialSize * partPosIdx; + fseek(yuvFp, pos, SEEK_CUR); + + if (!fread(pYuv + LumaPartialSize, 1, ChromaPartialSize, + yuvFp)) { + if (!feof(yuvFp)) + JLOG(ERR, + "Yuv Data fread failed file handle is 0x%x\n", + yuvFp); + return 0; + } + + // Cr + fseek(yuvFp, (frameIdx * frameSize), SEEK_SET); + pos = LumaPicSize + ChromaPicSize + + ChromaPartialSize * partPosIdx; + fseek(yuvFp, pos, SEEK_CUR); + + if (!fread(pYuv + LumaPartialSize + ChromaPartialSize, 1, + ChromaPartialSize, yuvFp)) { + if (!feof(yuvFp)) + JLOG(ERR, + "Yuv Data fread failed file handle is 0x%x\n", + yuvFp); + return 0; + } + } + + LoadYuvImageBurstFormat(pYuv, picWidth, picHeightPartial, addrY, addrCb, + addrCr, stride, interleave, format, endian, + packed); + + return 1; +} + +int SaveYuvImageHelperFormat(FILE *yuvFp, Uint8 *pYuv, PhysicalAddress addrY, + PhysicalAddress addrCb, PhysicalAddress addrCr, + int picWidth, int picHeight, int stride, + int interLeave, int format, int endian, int packed, + int *pFrameSize) +{ + int frameSize; + frameSize = StoreYuvImageBurstFormat(pYuv, picWidth, picHeight, addrY, + addrCb, addrCr, stride, interLeave, + format, endian, packed); + + if (pFrameSize != NULL) { + *pFrameSize = frameSize; + } + + if (yuvFp) { + if (!fwrite(pYuv, sizeof(Uint8), frameSize, yuvFp)) { + JLOG(ERR, + "Frame Data fwrite failed file handle is 0x%x\n", + yuvFp); + return 0; + } + fflush(yuvFp); + } + return 1; +} + +int SaveYuvPartialImageHelperFormat( + FILE *yuvFp, Uint8 *pYuv, PhysicalAddress addrY, PhysicalAddress addrCb, + PhysicalAddress addrCr, int picWidth, int picHeight, + int picHeightPartial, int stride, int interLeave, int format, + int endian, int partPosIdx, int frameIdx, int packed) +{ + int LumaPicSize = 0; + int ChromaPicSize = 0; + int frameSize = 0; + + int LumaPartialSize = 0; + int ChromaPartialSize = 0; + + int pos = 0; + // int divX, divY; + + // divX = format == FORMAT_420 || format == FORMAT_422 ? 2 : 1; + // divY = format == FORMAT_420 || format == FORMAT_224 ? 2 : 1; + + switch (format) { + case FORMAT_420: + LumaPicSize = picWidth * (((picHeight + 1) >> 1) << 1); + ChromaPicSize = ((picWidth + 1) >> 1) * ((picHeight + 1) >> 1); + frameSize = (LumaPicSize + ChromaPicSize) << 1; + + LumaPartialSize = + picWidth * (((picHeightPartial + 1) >> 1) << 1); + ChromaPartialSize = + ((picWidth + 1) >> 1) * ((picHeightPartial + 1) >> 1); + if (interLeave) + ChromaPartialSize = (((picWidth + 1) >> 1) << 1) * + ((picHeightPartial + 1) >> 1); + break; + case FORMAT_224: + LumaPicSize = picWidth * (((picHeight + 1) >> 1) << 1); + ChromaPicSize = picWidth * ((picHeight + 1) >> 1); + frameSize = (LumaPicSize + ChromaPicSize) << 1; + + LumaPartialSize = + picWidth * (((picHeightPartial + 1) >> 1) << 1); + ChromaPartialSize = picWidth * ((picHeightPartial + 1) >> 1); + if (interLeave) + ChromaPartialSize = + picWidth * 2 * ((picHeightPartial + 1) >> 1); + break; + case FORMAT_422: + LumaPicSize = picWidth * picHeight; + ChromaPicSize = ((picWidth + 1) >> 1) * picHeight; + frameSize = (LumaPicSize + ChromaPicSize) << 1; + + LumaPartialSize = picWidth * picHeightPartial; + ChromaPartialSize = ((picWidth + 1) >> 1) * picHeightPartial; + if (interLeave) + ChromaPartialSize = + (((picWidth + 1) >> 1) << 1) * picHeightPartial; + break; + case FORMAT_444: + LumaPicSize = picWidth * picHeight; + ChromaPicSize = picWidth * picHeight; + frameSize = (LumaPicSize + ChromaPicSize) << 1; + + LumaPartialSize = picWidth * picHeightPartial; + ChromaPartialSize = picWidth * picHeightPartial; + if (interLeave) + ChromaPartialSize = picWidth * 2 * picHeightPartial; + break; + case FORMAT_400: + LumaPicSize = picWidth * picHeight; + ChromaPicSize = 0; + frameSize = (LumaPicSize + ChromaPicSize) << 1; + + LumaPartialSize = picWidth * picHeightPartial; + ChromaPartialSize = 0; + break; + } + + if (packed) { + if (packed == PACKED_FORMAT_444) + picWidth *= 3; + else + picWidth *= 2; + + LumaPicSize = picWidth * picHeight; + ChromaPicSize = 0; + frameSize = LumaPicSize; + LumaPartialSize = picWidth * picHeightPartial; + ChromaPartialSize = 0; + } + + StoreYuvImageBurstFormat(pYuv, picWidth, picHeightPartial, addrY, + addrCb, addrCr, stride, interLeave, format, + endian, packed); + + if (yuvFp) { + // Y + fseek(yuvFp, (frameIdx * frameSize), SEEK_SET); + pos = LumaPartialSize * partPosIdx; + fseek(yuvFp, pos, SEEK_CUR); + if (!fwrite(pYuv, sizeof(Uint8), LumaPartialSize, yuvFp)) { + JLOG(ERR, + "Frame Data fwrite failed file handle is 0x%x\n", + yuvFp); + return 0; + } + + if (packed) { + fflush(yuvFp); + return 1; + } + + if (format != FORMAT_400) { + // Cb + fseek(yuvFp, (frameIdx * frameSize), SEEK_SET); + pos = LumaPicSize + ChromaPartialSize * partPosIdx; + fseek(yuvFp, pos, SEEK_CUR); + if (!fwrite(pYuv + LumaPartialSize, sizeof(Uint8), + ChromaPartialSize, yuvFp)) { + JLOG(ERR, + "Frame Data fwrite failed file handle is 0x%x\n", + yuvFp); + return 0; + } + + if (interLeave) { + fflush(yuvFp); + return 1; + } + + // Cr + fseek(yuvFp, (frameIdx * frameSize), SEEK_SET); + pos = LumaPicSize + ChromaPicSize + + ChromaPartialSize * partPosIdx; + fseek(yuvFp, pos, SEEK_CUR); + if (!fwrite(pYuv + LumaPartialSize + ChromaPartialSize, + sizeof(Uint8), ChromaPartialSize, yuvFp)) { + JLOG(ERR, + "Frame Data fwrite failed file handle is 0x%x\n", + yuvFp); + return 0; + } + } + fflush(yuvFp); + } + return 1; +} +#endif + +/****************************************************************************** + JPEG specific Helper +******************************************************************************/ +int jpgGetHuffTable(char *huffFileName, EncMjpgParam *param) +{ + { + // Rearrange and insert pre-defined Huffman table to deticated + // variable. + memcpy(param->huffBits[DC_TABLE_INDEX0], lumaDcBits, + 16); // Luma DC BitLength + memcpy(param->huffVal[DC_TABLE_INDEX0], lumaDcValue, + 16); // Luma DC HuffValue + + memcpy(param->huffBits[AC_TABLE_INDEX0], lumaAcBits, + 16); // Luma DC BitLength + memcpy(param->huffVal[AC_TABLE_INDEX0], lumaAcValue, + 162); // Luma DC HuffValue + + memcpy(param->huffBits[DC_TABLE_INDEX1], chromaDcBits, + 16); // Chroma DC BitLength + memcpy(param->huffVal[DC_TABLE_INDEX1], chromaDcValue, + 16); // Chroma DC HuffValue + + memcpy(param->huffBits[AC_TABLE_INDEX1], chromaAcBits, + 16); // Chroma AC BitLength + memcpy(param->huffVal[AC_TABLE_INDEX1], chromaAcValue, + 162); // Chorma AC HuffValue + } + + return 1; +} + +int jpgGetQMatrix(char *qMatFileName, EncMjpgParam *param) +{ + { + // Rearrange and insert pre-defined Q-matrix to deticated + // variable. +#ifdef INCREASE_Q_MATRIX + for (int idx = 0; idx < 64; idx++) { + param->qMatTab[DC_TABLE_INDEX0][idx] = + (lumaQ2[idx] * 3 > 255) ? 255 : lumaQ2[idx] * 3; + param->qMatTab[AC_TABLE_INDEX0][idx] = + (chromaBQ2[idx] * 3 > 255) ? 255 : + chromaBQ2[idx] * 3; + } +#else + memcpy(param->qMatTab[DC_TABLE_INDEX0], lumaQ2, 64); + memcpy(param->qMatTab[AC_TABLE_INDEX0], chromaBQ2, 64); +#endif + memcpy(param->qMatTab[DC_TABLE_INDEX1], + param->qMatTab[DC_TABLE_INDEX0], 64); + memcpy(param->qMatTab[AC_TABLE_INDEX1], + param->qMatTab[AC_TABLE_INDEX0], 64); + } + + return 1; +} + +/****************************************************************************** + EncOpenParam Initialization +******************************************************************************/ + +int getJpgEncOpenParamDefault(JpgEncOpenParam *pEncOP, + EncConfigParam *pEncConfig) +{ + int ret; + EncMjpgParam *pMjpgParam = kzalloc(sizeof(EncMjpgParam), GFP_KERNEL); + + { + pEncOP->picWidth = pEncConfig->picWidth; + pEncOP->picHeight = pEncConfig->picHeight; + } + + pEncOP->sourceFormat = pEncConfig->sourceFormat; + pEncOP->restartInterval = 0; + pEncOP->chromaInterleave = pEncConfig->chromaInterleave; + pEncOP->packedFormat = pEncConfig->packedFormat; + pMjpgParam->sourceFormat = pEncConfig->sourceFormat; + ret = jpgGetHuffTable(pEncConfig->huffFileName, pMjpgParam); + if (ret == 0) { + kfree(pMjpgParam); + return ret; + } + ret = jpgGetQMatrix(pEncConfig->qMatFileName, pMjpgParam); + if (ret == 0) { + kfree(pMjpgParam); + return ret; + } + memcpy(pEncOP->huffVal, pMjpgParam->huffVal, 4 * 162); + memcpy(pEncOP->huffBits, pMjpgParam->huffBits, 4 * 256); + memcpy(pEncOP->qMatTab, pMjpgParam->qMatTab, 4 * 64); + kfree(pMjpgParam); + return 1; +} + +int FillSdramBurst(BufInfo *pBufInfo, PhysicalAddress targetAddr, + PhysicalAddress bsBufStartAddr, PhysicalAddress bsBufEndAddr, + Uint32 size, int checkeos, int *streameos, int endian) +{ + Uint8 *pBuf; + int room; + + pBufInfo->count = 0; + + if (checkeos == 1 && (pBufInfo->point >= pBufInfo->size)) { + *streameos = 1; + return 0; + } + + if ((pBufInfo->size - pBufInfo->point) < (int)size) + pBufInfo->count = (pBufInfo->size - pBufInfo->point); + else + pBufInfo->count = size; + + pBuf = pBufInfo->buf + pBufInfo->point; + if ((targetAddr + pBufInfo->count) > bsBufEndAddr) { + room = bsBufEndAddr - targetAddr; + JpuWriteMem(targetAddr, pBuf, room, endian); +#if (defined CVI_JPG_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + jdi_flush_ion_cache(targetAddr, pBuf, room); +#endif + JpuWriteMem(bsBufStartAddr, pBuf + room, + (pBufInfo->count - room), endian); +#if (defined CVI_JPG_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + jdi_flush_ion_cache(bsBufStartAddr, (pBuf + room), + (pBufInfo->count - room)); +#endif + } else { + JpuWriteMem(targetAddr, pBuf, pBufInfo->count, endian); +#if (defined CVI_JPG_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + jdi_flush_ion_cache(targetAddr, pBuf, pBufInfo->count); +#endif + } + + pBufInfo->point += pBufInfo->count; + return pBufInfo->count; +} + +#ifdef REDUNDENT_CODE +int StoreYuvImageBurstFormat(Uint8 *dst, int picWidth, int picHeight, + unsigned long addrY, unsigned long addrCb, + unsigned long addrCr, int stride, int interLeave, + int format, int endian, int packed) +{ + int size; + int y, nY = 0, nCb = 0, nCr = 0; + unsigned long addr; + int lumaSize, chromaSize = 0, chromaStride = 0, chromaWidth = 0, + chromaHeight = 0; + + Uint8 *puc; + + switch (format) { + case FORMAT_420: + nY = ((picHeight + 1) >> 1) << 1; + nCb = nCr = (picHeight + 1) >> 1; + chromaSize = ((picWidth + 1) >> 1) * ((picHeight + 1) >> 1); + chromaStride = stride >> 1; + chromaWidth = (picWidth + 1) >> 1; + chromaHeight = nY; + break; + case FORMAT_224: + nY = ((picHeight + 1) >> 1) << 1; + nCb = nCr = (picHeight + 1) >> 1; + chromaSize = (picWidth) * ((picHeight + 1) >> 1); + chromaStride = stride; + chromaWidth = picWidth; + chromaHeight = nY; + break; + case FORMAT_422: + nY = picHeight; + nCb = nCr = picHeight; + chromaSize = ((picWidth + 1) >> 1) * picHeight; + chromaStride = stride >> 1; + chromaWidth = (picWidth + 1) >> 1; + chromaHeight = nY * 2; + break; + case FORMAT_444: + nY = picHeight; + nCb = nCr = picHeight; + chromaSize = picWidth * picHeight; + chromaStride = stride; + chromaWidth = picWidth; + chromaHeight = nY * 2; + break; + case FORMAT_400: + nY = picHeight; + nCb = nCr = 0; + chromaSize = 0; + chromaStride = 0; + chromaWidth = 0; + chromaHeight = 0; + break; + } + + puc = dst; + addr = addrY; + + if (packed) { + if (packed == PACKED_FORMAT_444) + picWidth *= 3; + else + picWidth *= 2; + + chromaSize = 0; + } + + lumaSize = picWidth * nY; + + size = lumaSize + chromaSize * 2; + + if (picWidth == stride) { + JpuReadMem(addr, (Uint8 *)(puc), lumaSize, endian); + + if (packed) + return size; + + if (interLeave) { + puc = dst + lumaSize; + addr = addrCb; + JpuReadMem(addr, (Uint8 *)(puc), chromaSize * 2, + endian); + } else { + puc = dst + lumaSize; + addr = addrCb; + JpuReadMem(addr, (Uint8 *)(puc), chromaSize, endian); + + puc = dst + lumaSize + chromaSize; + addr = addrCr; + JpuReadMem(addr, (Uint8 *)(puc), chromaSize, endian); + } + } else { + for (y = 0; y < nY; ++y) { + JpuReadMem(addr + stride * y, + (Uint8 *)(puc + y * picWidth), picWidth, + endian); + } + + if (packed) + return size; + + if (interLeave) { + puc = dst + lumaSize; + addr = addrCb; + for (y = 0; y < (chromaHeight >> 1); ++y) { + JpuReadMem( + addr + (chromaStride * 2) * y, + (Uint8 *)(puc + y * (chromaWidth * 2)), + (chromaWidth * 2), endian); + } + } else { + puc = dst + lumaSize; + addr = addrCb; + for (y = 0; y < nCb; ++y) { + JpuReadMem(addr + chromaStride * y, + (Uint8 *)(puc + y * chromaWidth), + chromaWidth, endian); + } + + puc = dst + lumaSize + chromaSize; + addr = addrCr; + for (y = 0; y < nCr; ++y) { + JpuReadMem(addr + chromaStride * y, + (Uint8 *)(puc + y * chromaWidth), + chromaWidth, endian); + } + } + } + + return size; +} + +void ProcessEncodedBitstreamBurst(FILE *fp, unsigned long targetAddr, + PhysicalAddress bsBufStartAddr, + PhysicalAddress bsBufEndAddr, int size, + int endian) +{ + Uint8 *val = 0; + int room = 0; + + val = (Uint8 *)malloc(size); + if ((targetAddr + size) > (unsigned long)bsBufEndAddr) { + room = bsBufEndAddr - targetAddr; + JpuReadMem(targetAddr, val, room, endian); + JpuReadMem(bsBufStartAddr, val + room, (size - room), endian); + } else { + JpuReadMem(targetAddr, val, size, endian); + } + + if (fp) { + fwrite(val, sizeof(Uint8), size, fp); + fflush(fp); + } + + free(val); +} +#endif + +#ifdef REDUNDENT_CODE +void GetMcuUnitSize(int format, int *mcuWidth, int *mcuHeight) +{ + switch (format) { + case FORMAT_420: + *mcuWidth = 16; + *mcuHeight = 16; + break; + case FORMAT_422: + *mcuWidth = 16; + *mcuHeight = 8; + break; + case FORMAT_224: + *mcuWidth = 8; + *mcuHeight = 16; + break; + default: // FORMAT_444,400 + *mcuWidth = 8; + *mcuHeight = 8; + break; + } +} + + +unsigned int GetFrameBufSize(int framebufFormat, int picWidth, int picHeight) +{ + unsigned int framebufSize = 0; + unsigned int framebufWidth, framebufHeight; + + if (framebufFormat == FORMAT_420 || framebufFormat == FORMAT_422) + framebufWidth = ((picWidth + 15) >> 4) << 4; + else + framebufWidth = ((picWidth + 7) >> 3) << 3; + + if (framebufFormat == FORMAT_420 || framebufFormat == FORMAT_224) + framebufHeight = ((picHeight + 15) >> 4) << 4; + else + framebufHeight = ((picHeight + 7) >> 3) << 3; + + switch (framebufFormat) { + case FORMAT_420: + framebufSize = + (framebufWidth * (((framebufHeight + 1) >> 1) << 1)) + + ((((framebufWidth + 1) >> 1) * + ((framebufHeight + 1) >> 1)) + << 1); + break; + case FORMAT_224: + framebufSize = + framebufWidth * (((framebufHeight + 1) >> 1) << 1) + + ((framebufWidth * ((framebufHeight + 1) >> 1)) << 1); + break; + case FORMAT_422: + framebufSize = + framebufWidth * framebufHeight + + ((((framebufWidth + 1) >> 1) * framebufHeight) << 1); + break; + case FORMAT_444: + framebufSize = framebufWidth * framebufHeight * 3; + break; + case FORMAT_400: + framebufSize = framebufWidth * framebufHeight; + break; + } + + framebufSize = ((framebufSize + 7) & ~7); + + return framebufSize; +} + +// inteleave : 0 (chroma separate mode), 1 (cbcr interleave mode), 2 (crcb +// interleave mode) +yuv2rgb_color_format +convert_jpuapi_format_to_yuv2rgb_color_format(int planar_format, + int pack_format, int interleave) +{ + // typedef enum { YUV444, YUV422, YUV420, NV12, NV21, YUV400, YUYV, + // YVYU, UYVY, VYUY, YYY, RGB_PLANAR, RGB32, RGB24, RGB16 } + // yuv2rgb_color_format; + yuv2rgb_color_format format = YUV420; // TODO : add default + if (!pack_format) { + switch (planar_format) { + case FORMAT_400: + format = YUV400; + break; + case FORMAT_444: + format = YUV444; + break; + case FORMAT_224: + case FORMAT_422: + format = YUV422; + break; + case FORMAT_420: + if (interleave == 0) + format = YUV420; + else if (interleave == 1) + format = NV12; + else + format = NV21; + break; + } + } else { + switch (pack_format) { + case PACKED_FORMAT_422_YUYV: + format = YUYV; + break; + case PACKED_FORMAT_422_UYVY: + format = UYVY; + break; + case PACKED_FORMAT_422_YVYU: + format = YVYU; + break; + case PACKED_FORMAT_422_VYUY: + format = VYUY; + break; + case PACKED_FORMAT_444: + format = YYY; + break; + } + } + + return format; +} + +void jpu_yuv2rgb(int width, int height, yuv2rgb_color_format format, + unsigned char *src, unsigned char *rgba, int cbcr_reverse) +{ +#define jpu_clip(var) ((var >= 255) ? 255 : (var <= 0) ? 0 : var) + int j, i; + int c, d, e; + + unsigned char *line = rgba; + unsigned char *cur = NULL; + unsigned char *y = NULL; + unsigned char *u = NULL; + unsigned char *v = NULL; + unsigned char *misc = NULL; + + int frame_size_y; + int frame_size_uv; + // int frame_size; + int t_width; + + frame_size_y = width * height; + + if (format == YUV444 || format == RGB_PLANAR) + frame_size_uv = width * height; + else if (format == YUV422) + frame_size_uv = (width * height) >> 1; + else if (format == YUV420 || format == NV12 || format == NV21) + frame_size_uv = (width * height) >> 2; + else + frame_size_uv = 0; + +#if 0 + if (format == YUYV || format == YVYU || format == UYVY || + format == VYUY) + frame_size = frame_size_y * 2; + else if (format == RGB32) + frame_size = frame_size_y * 4; + else if (format == RGB24) + frame_size = frame_size_y * 3; + else if (format == RGB16) + frame_size = frame_size_y * 2; + else + frame_size = frame_size_y + frame_size_uv * 2; +#endif + + t_width = width; + + if (format == YUYV || format == YVYU || format == UYVY || + format == VYUY) { + misc = src; + } else if (format == NV12 || format == NV21) { + y = src; + misc = src + frame_size_y; + } else if (format == RGB32 || format == RGB24 || format == RGB16) { + misc = src; + } else { + y = src; + u = src + frame_size_y; + v = src + frame_size_y + frame_size_uv; + } + + if (format == YUV444) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + c = y[j * width + i] - 16; + d = u[j * width + i] - 128; + e = v[j * width + i] - 128; + + if (!cbcr_reverse) { + d = u[j * width + i] - 128; + e = v[j * width + i] - 128; + } else { + e = u[j * width + i] - 128; + e = v[j * width + i] - 128; + } + (*cur) = jpu_clip((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == YUV422) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + c = y[j * width + i] - 16; + d = u[j * (width >> 1) + (i >> 1)] - 128; + e = v[j * (width >> 1) + (i >> 1)] - 128; + + if (!cbcr_reverse) { + d = u[j * (width >> 1) + (i >> 1)] - + 128; + e = v[j * (width >> 1) + (i >> 1)] - + 128; + } else { + e = u[j * (width >> 1) + (i >> 1)] - + 128; + d = v[j * (width >> 1) + (i >> 1)] - + 128; + } + + (*cur) = jpu_clip((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == YUYV || format == YVYU || format == UYVY || + format == VYUY) { + unsigned char *t = misc; + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i += 2) { + switch (format) { + case YUYV: + c = *(t)-16; + if (!cbcr_reverse) { + d = *(t + 1) - 128; + e = *(t + 3) - 128; + } else { + e = *(t + 1) - 128; + d = *(t + 3) - 128; + } + break; + case YVYU: + c = *(t)-16; + if (!cbcr_reverse) { + d = *(t + 3) - 128; + e = *(t + 1) - 128; + } else { + e = *(t + 3) - 128; + d = *(t + 1) - 128; + } + break; + case UYVY: + c = *(t + 1) - 16; + if (!cbcr_reverse) { + d = *(t)-128; + e = *(t + 2) - 128; + } else { + e = *(t)-128; + d = *(t + 2) - 128; + } + break; + case VYUY: + c = *(t + 1) - 16; + if (!cbcr_reverse) { + d = *(t + 2) - 128; + e = *(t)-128; + } else { + e = *(t + 2) - 128; + d = *(t)-128; + } + break; + default: // like YUYV + c = *(t)-16; + if (!cbcr_reverse) { + d = *(t + 1) - 128; + e = *(t + 3) - 128; + } else { + e = *(t + 1) - 128; + d = *(t + 3) - 128; + } + break; + } + + (*cur) = jpu_clip((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + + switch (format) { + case YUYV: + case YVYU: + c = *(t + 2) - 16; + break; + + case VYUY: + case UYVY: + c = *(t + 3) - 16; + break; + default: // like YUYV + c = *(t + 2) - 16; + break; + } + + (*cur) = jpu_clip((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + + t += 4; + } + line += t_width << 2; + } + } else if (format == YUV420 || format == NV12 || format == NV21) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + c = y[j * width + i] - 16; + if (format == YUV420) { + if (!cbcr_reverse) { + d = u[(j >> 1) * (width >> 1) + + (i >> 1)] - + 128; + e = v[(j >> 1) * (width >> 1) + + (i >> 1)] - + 128; + } else { + e = u[(j >> 1) * (width >> 1) + + (i >> 1)] - + 128; + d = v[(j >> 1) * (width >> 1) + + (i >> 1)] - + 128; + } + } else if (format == NV12) { + if (!cbcr_reverse) { + d = misc[(j >> 1) * width + + (i >> 1 << 1)] - + 128; + e = misc[(j >> 1) * width + + (i >> 1 << 1) + 1] - + 128; + } else { + e = misc[(j >> 1) * width + + (i >> 1 << 1)] - + 128; + d = misc[(j >> 1) * width + + (i >> 1 << 1) + 1] - + 128; + } + } else { // if (m_color == NV21) + if (!cbcr_reverse) { + d = misc[(j >> 1) * width + + (i >> 1 << 1) + 1] - + 128; + e = misc[(j >> 1) * width + + (i >> 1 << 1)] - + 128; + } else { + e = misc[(j >> 1) * width + + (i >> 1 << 1) + 1] - + 128; + d = misc[(j >> 1) * width + + (i >> 1 << 1)] - + 128; + } + } + (*cur) = jpu_clip((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = jpu_clip((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == RGB_PLANAR) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + (*cur) = y[j * width + i]; + cur++; + (*cur) = u[j * width + i]; + cur++; + (*cur) = v[j * width + i]; + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == RGB32) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + (*cur) = misc[j * width * 4 + i]; + cur++; // R + (*cur) = misc[j * width * 4 + i + 1]; + cur++; // G + (*cur) = misc[j * width * 4 + i + 2]; + cur++; // B + (*cur) = misc[j * width * 4 + i + 3]; + cur++; // A + } + line += t_width << 2; + } + } else if (format == RGB24) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + (*cur) = misc[j * width * 3 + i]; + cur++; // R + (*cur) = misc[j * width * 3 + i + 1]; + cur++; // G + (*cur) = misc[j * width * 3 + i + 2]; + cur++; // B + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == RGB16) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + int tmp = misc[j * width * 2 + i] << 8 | + misc[j * width * 2 + i + 1]; + (*cur) = ((tmp >> 11) & 0x1F << 3); + cur++; // R(5bit) + (*cur) = ((tmp >> 5) & 0x3F << 2); + cur++; // G(6bit) + (*cur) = ((tmp)&0x1F << 3); + cur++; // B(5bit) + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else { // YYY + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + (*cur) = y[j * width + i]; + cur++; + (*cur) = y[j * width + i]; + cur++; + (*cur) = y[j * width + i]; + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } +} + +int comparateYuv(Uint8 *pYuv, Uint8 *pRefYuv, int picWidth, int picHeight, + int stride, int format) +{ + if (picHeight % 16 != 0 || picWidth % 16 != 0) { + Uint8 *pY = pYuv; + Uint8 *pRefY = pRefYuv; + int i = 0; + + // only compare luma + for (i = 0; i < picHeight; i++) { + int j = 0; + + for (j = 0; j < picWidth; j++) { + if (pY[j] != pRefY[j]) { + pr_err("comp index : %d, %d, src: 0x%x, ref: 0x%x\n", + i, j, pY[j], pRefY[j]); + return -1; + } + } + pY += stride; + pRefY += picWidth; + } + } else { + int frameBufferSize = + GetFrameBufSize(format, picWidth, picHeight); + Uint64 *p64 = (Uint64 *)pYuv; + Uint64 *pR64 = (Uint64 *)pRefYuv; + int i = 0; + pr_err("framebuffer addr: 0x%p, ref addr: 0x%p, size : %d\n", + p64, pR64, frameBufferSize); + for (i = 0; i < (frameBufferSize >> 3); i++) { + if (*p64 != *pR64) { + pr_err("comp index : %d, src: 0x%llx, ref: 0x%llx\n", + i * 4, *p64, *pR64); + return -1; + } + p64++; + pR64++; + } + + // return osal_memcmp(pYuv, pRefYuv, frameBufferSize); + } + return 0; +} +#endif +Uint64 jpgGetCurrentTime(void) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + struct timespec64 ts; +#else + struct timespec ts; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + ktime_get_ts64(&ts); +#else + ktime_get_ts(&ts); +#endif + return ts.tv_sec * 1000000 + ts.tv_nsec / 1000; // in us +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/src/jpulog.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/src/jpulog.c new file mode 100644 index 0000000000..ced7311a69 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/src/jpulog.c @@ -0,0 +1,164 @@ +#if defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || \ + defined(WIN32) || defined(__MINGW32__) +#include +#endif + +#include "../jpuapi/jpuconfig.h" +#include +#include +#include "../include/jpulog.h" + +#ifdef REDUNDENT_CODE +#if defined(linux) || defined(__linux) || defined(ANDROID) +#include +#include +#include +#include // for read() + +static struct termios initial_settings, new_settings; +static int peek_character = -1; +#endif + +static int log_colors[MAX_LOG_LEVEL] = { + 0, + TERM_COLOR_R | TERM_COLOR_BRIGHT, // ERR + TERM_COLOR_R | TERM_COLOR_B | TERM_COLOR_BRIGHT, // WARN + TERM_COLOR_R | TERM_COLOR_G | TERM_COLOR_B | TERM_COLOR_BRIGHT, // INFO + TERM_COLOR_R | TERM_COLOR_G | TERM_COLOR_B // TRACE +}; + +static unsigned int log_decor = (LOG_HAS_TIME | LOG_HAS_FILE | LOG_HAS_MICRO_SEC | + LOG_HAS_NEWLINE | LOG_HAS_SPACE | LOG_HAS_COLOR); +static FILE *fpLog; +#endif // #ifdef REDUNDENT_CODE +static int max_log_level = ERR; + +#ifdef REDUNDENT_CODE +int jdi_InitLog(void) +{ +#if 0 + fpLog = fopen("c:\\out.log", "w"); + if (fpLog == NULL) { + return -1; + } +#endif + + return 1; +} + +void jdi_DeInitLog(void) +{ + if (fpLog) { + fclose(fpLog); + fpLog = NULL; + } +} + +void jdi_SetLogColor(int level, int color) +{ + log_colors[level] = color; +} + +int jdi_GetLogColor(int level) +{ + return log_colors[level]; +} + +void jdi_SetLogDecor(int decor) +{ + log_decor = decor; +} + +int jdi_GetLogDecor(void) +{ + return log_decor; +} +#endif + +void jdi_SetMaxLogLevel(int level) +{ + max_log_level = level; +} + +int jdi_GetMaxLogLevel(void) +{ + return max_log_level; +} + +void jdi_LogMsg(int level, const char *format, ...) +{ + va_list ptr; + char logBuf[MAX_PRINT_LENGTH] = { 0 }; + + if (level > max_log_level) + return; + + va_start(ptr, format); + vsnprintf(logBuf, MAX_PRINT_LENGTH, format, ptr); + va_end(ptr); + + pr_err("%s", logBuf); +} + +#ifdef REDUNDENT_CODE + +#if defined(_MSC_VER) +static LARGE_INTEGER initial_; +static LARGE_INTEGER frequency_; +static LARGE_INTEGER counter_; +#endif + +#if defined(linux) || defined(__linux) || defined(ANDROID) + +void init_keyboard(void) +{ + tcgetattr(0, &initial_settings); + new_settings = initial_settings; + new_settings.c_lflag &= ~ICANON; + new_settings.c_lflag &= ~ECHO; + new_settings.c_lflag &= ~ISIG; + new_settings.c_cc[VMIN] = 1; + new_settings.c_cc[VTIME] = 0; + tcsetattr(0, TCSANOW, &new_settings); + peek_character = -1; +} + +void close_keyboard(void) +{ + tcsetattr(0, TCSANOW, &initial_settings); + fflush(stdout); +} + +int kbhit(void) +{ + unsigned char ch; + int nread; + + if (peek_character != -1) + return 1; + new_settings.c_cc[VMIN] = 0; + tcsetattr(0, TCSANOW, &new_settings); + nread = read(0, &ch, 1); + new_settings.c_cc[VMIN] = 1; + tcsetattr(0, TCSANOW, &new_settings); + if (nread == 1) { + peek_character = (int)ch; + return 1; + } + return 0; +} + +int getch(void) +{ + int val; + char ch; + if (peek_character != -1) { + val = peek_character; + peek_character = -1; + return val; + } + read(0, &ch, 1); + return ch; +} +#endif //#if defined(linux) || defined(__linux) || defined(ANDROID) +#endif \ No newline at end of file diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/src/mixer.c b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/src/mixer.c new file mode 100644 index 0000000000..7fe16b08a1 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/src/mixer.c @@ -0,0 +1,750 @@ +#ifdef VC_DRIVER_TEST +#include "jpuapi.h" +#include "regdefine.h" +#include "jpulog.h" +#include "jpuhelper.h" +#include "mixer.h" + +#ifndef UNREFERENCED_PARAM +#define UNREFERENCED_PARAM(x) ((void)(x)) +#endif + +typedef struct { +#ifdef MJPEG_INTERFACE_API + FRAME_BUF frameBuf[MAX_FRAME_JPU]; +#else + FRAME_BUF frameBuf[MAX_FRAME]; +#endif + jpu_buffer_t vb_base; + int instIndex; + int last_num; + __u64 last_addr; +} fb_context; + +static fb_context s_fb[MAX_NUM_INSTANCE]; + +int AllocateFrameBuffer(int instIdx, int format, int width, int height, + int frameBufNum, int pack) +{ + unsigned int divX, divY; + int i; + unsigned int lum_size, chr_size; + fb_context *fb; +#ifdef MJPEG_INTERFACE_API + unsigned long fb_virt_addr; +#endif /* MJPEG_INTERFACE_API */ + + fb = &s_fb[instIdx]; + + memset(fb, 0x00, sizeof(fb_context)); + + divX = format == FORMAT_420 || format == FORMAT_422 ? 2 : 1; + divY = format == FORMAT_420 || format == FORMAT_224 ? 2 : 1; + + switch (format) { + case FORMAT_420: + height = ((height + 1) >> 1) << 1; + width = ((width + 1) >> 1) << 1; + break; + case FORMAT_224: + height = ((height + 1) >> 1) << 1; + break; + case FORMAT_422: + width = ((width + 1) >> 1) << 1; + break; + case FORMAT_444: + height = ((height + 1) >> 1) << 1; + width = ((width + 1) >> 1) << 1; + break; + case FORMAT_400: + height = ((height + 1) >> 1) << 1; + width = ((width + 1) >> 1) << 1; + break; + } + + lum_size = (unsigned int)width * (unsigned int)height; + + if (pack) + chr_size = 0; + else + chr_size = lum_size / divX / divY; + + fb->vb_base.size = lum_size + chr_size * 2; + fb->vb_base.size *= frameBufNum; + + CVI_JPG_DBG_MEM("src FB vb_base.size = 0x%x, frameBufNum = %d\n", + fb->vb_base.size, frameBufNum); + + if (JDI_ALLOCATE_MEMORY(&fb->vb_base, 0, 0) < 0) { + JLOG(ERR, "Fail to allocate frame buffer size=%d\n", + fb->vb_base.size); + return 0; + } + + fb->last_addr = fb->vb_base.phys_addr; +#ifdef MJPEG_INTERFACE_API + fb_virt_addr = (unsigned long)fb->vb_base.virt_addr; +#endif /* MJPEG_INTERFACE_API */ + + for (i = fb->last_num; i < fb->last_num + frameBufNum; i++) { + fb->frameBuf[i].Format = format; + fb->frameBuf[i].Index = i; + + fb->frameBuf[i].vbY.phys_addr = fb->last_addr; + fb->frameBuf[i].vbY.size = lum_size; +#ifdef MJPEG_INTERFACE_API + fb->frameBuf[i].vbY.virt_addr = (void *)fb_virt_addr; + fb_virt_addr += fb->frameBuf[i].vbY.size; + fb_virt_addr = ((fb_virt_addr + 7) & ~7); +#endif /* MJPEG_INTERFACE_API */ + + fb->last_addr += fb->frameBuf[i].vbY.size; + fb->last_addr = ((fb->last_addr + 7) & ~7); + + if (chr_size) { + fb->frameBuf[i].vbCb.phys_addr = fb->last_addr; + fb->frameBuf[i].vbCb.size = chr_size; +#ifdef MJPEG_INTERFACE_API + fb->frameBuf[i].vbCb.virt_addr = (void *)fb_virt_addr; + fb_virt_addr += fb->frameBuf[i].vbCb.size; + fb_virt_addr = ((fb_virt_addr + 7) & ~7); +#endif /* MJPEG_INTERFACE_API */ + + fb->last_addr += fb->frameBuf[i].vbCb.size; + fb->last_addr = ((fb->last_addr + 7) & ~7); + + fb->frameBuf[i].vbCr.phys_addr = fb->last_addr; + fb->frameBuf[i].vbCr.size = chr_size; +#ifdef MJPEG_INTERFACE_API + fb->frameBuf[i].vbCr.virt_addr = (void *)fb_virt_addr; + fb_virt_addr += fb->frameBuf[i].vbCr.size; + fb_virt_addr = ((fb_virt_addr + 7) & ~7); +#endif /* MJPEG_INTERFACE_API */ + + fb->last_addr += fb->frameBuf[i].vbCr.size; + fb->last_addr = ((fb->last_addr + 7) & ~7); + } + + fb->frameBuf[i].strideY = width; + fb->frameBuf[i].strideC = width / divX; + } + +#ifdef CVIDEBUG_V + for (i = fb->last_num; i < fb->last_num + frameBufNum; i++) { +#ifdef MJPEG_INTERFACE_API + JLOG(TRACE, " >_Create DPB [ %i] -- Linear\n", i); + JLOG(TRACE, " >_ Luminance Frame %llx, %p\n", + fb->frameBuf[i].vbY.phys_addr, + (void *)fb->frameBuf[i].vbY.virt_addr); + JLOG(TRACE, " >_ Cb Frame %llx, %p\n", + fb->frameBuf[i].vbCb.phys_addr, + (void *)fb->frameBuf[i].vbCb.virt_addr); + JLOG(TRACE, " >_ Cr Frame %llx, %p\n", + fb->frameBuf[i].vbCr.phys_addr, + (void *)fb->frameBuf[i].vbCr.virt_addr); + JLOG(TRACE, " >_ fb->last_addr %llx\n", fb->last_addr); + JLOG(TRACE, " >_ StrideY (%d)\n", + fb->frameBuf[i].strideY); + JLOG(TRACE, " >_ StrideC (%d)\n", + fb->frameBuf[i].strideC); +#else + JLOG(TRACE, " >_Create DPB [ %i] -- Linear\n", i); + JLOG(TRACE, " >_ Luminance Frame 0x%08x\n", + fb->frameBuf[i].vbY.phys_addr); + JLOG(TRACE, " >_ Cb Frame 0x%08x\n", + fb->frameBuf[i].vbCb.phys_addr); + JLOG(TRACE, " >_ Cr Frame 0x%08x\n", + fb->frameBuf[i].vbCr.phys_addr); + JLOG(TRACE, " >_ fb->last_addr 0x%llx\n", fb->last_addr); + JLOG(TRACE, " >_ StrideY (%d)\n", + fb->frameBuf[i].strideY); + JLOG(TRACE, " >_ StrideC (%d)\n", + fb->frameBuf[i].strideC); +#endif + } +#endif + + fb->last_num += frameBufNum; + + return 1; +} + +int GetFrameBufBase(int instIdx) +{ + fb_context *fb; + fb = &s_fb[instIdx]; + + return fb->vb_base.phys_addr; +} + +int GetFrameBufAllocSize(int instIdx) +{ + fb_context *fb; + fb = &s_fb[instIdx]; + + return (fb->last_addr - fb->vb_base.phys_addr); +} + +FRAME_BUF *GetFrameBuffer(int instIdx, int index) +{ + fb_context *fb; + fb = &s_fb[instIdx]; + return &fb->frameBuf[index]; +} + +FRAME_BUF *FindFrameBuffer(int instIdx, PhysicalAddress addrY) +{ + int i; +#ifdef MJPEG_INTERFACE_API + int max_frame = MAX_FRAME_JPU; +#else + int max_frame = MAX_FRAME; +#endif + fb_context *fb; + + fb = &s_fb[instIdx]; + + for (i = 0; i < max_frame; i++) { + if (fb->frameBuf[i].vbY.phys_addr == addrY) { + return &fb->frameBuf[i]; + } + } + + return NULL; +} + +void ClearFrameBuffer(int instIdx, int index) +{ + UNREFERENCED_PARAM(instIdx); + UNREFERENCED_PARAM(index); +} + +void FreeFrameBuffer(int instIdx) +{ + fb_context *fb; + + fb = &s_fb[instIdx]; + + fb->last_num = 0; + fb->last_addr = -1; + JDI_FREE_MEMORY(&fb->vb_base); + fb->vb_base.base = 0; + fb->vb_base.size = 0; +} + +#ifdef JPU_FPGA_PLATFORM + +//------------------------------------------------------------------------------ +// MIXER REGISTER ADDRESS +//------------------------------------------------------------------------------ +#define MIX_BASE 0x1000000 +#define DISP_MIX 0x2000000 + +#define MIX_INT (MIX_BASE + 0x044) + +#define MIX_STRIDE_Y (MIX_BASE + 0x144) +#define MIX_STRIDE_CB (MIX_BASE + 0x148) +#define MIX_STRIDE_CR (MIX_BASE + 0x14c) + +#define MIX_ADDR_Y (MIX_BASE + 0x138) +#define MIX_ADDR_CB (MIX_BASE + 0x13C) +#define MIX_ADDR_CR (MIX_BASE + 0x140) + +#define MIX_RUN (MIX_BASE + 0x120) + +#define DISP_TOTAL_SAMPLE (DISP_MIX + 0x00C) +#define DISP_ACTIVE_SAMPLE (DISP_MIX + 0x010) +#define DISP_HSYNC_START_END (DISP_MIX + 0x014) +#define DISP_VSYNC_TOP_START (DISP_MIX + 0x018) +#define DISP_VSYNC_TOP_END (DISP_MIX + 0x01C) +#define DISP_VSYNC_BOT_START (DISP_MIX + 0x020) +#define DISP_VSYNC_BOT_END (DISP_MIX + 0x024) +#define DISP_ACTIVE_REGION_TOP (DISP_MIX + 0x02C) +#define DISP_ACTIVE_REGION_BOT (DISP_MIX + 0x030) + +#define MIX_MIX_INTRPT (MIX_BASE + 0x0000) +#define MIX_SYNC_STATE (MIX_BASE + 0x0004) +#define MIX_SYNC_CTRL (MIX_BASE + 0x0008) +#define MIX_TOTAL_SAMPLE (MIX_BASE + 0x000c) +#define MIX_ACTIVE_SAMPLE (MIX_BASE + 0x0010) +#define MIX_HSYNC_START_END (MIX_BASE + 0x0014) +#define MIX_VSYNC_TOP_START (MIX_BASE + 0x0018) +#define MIX_VSYNC_TOP_END (MIX_BASE + 0x001c) +#define MIX_VSYNC_BOT_START (MIX_BASE + 0x0020) +#define MIX_VSYNC_BOT_END (MIX_BASE + 0x0024) +#define MIX_ACT_REGION_SAMPLE (MIX_BASE + 0x0028) +#define MIX_ACT_REGION_TOP (MIX_BASE + 0x002c) +#define MIX_ACT_REGION_BOT (MIX_BASE + 0x0030) +#define MIX_TOP_START (MIX_BASE + 0x0034) +#define MIX_BOT_START (MIX_BASE + 0x0038) +#define MIX_LINE_INC (MIX_BASE + 0x003c) +#define MIX_LATCH_PARAM_CTRL (MIX_BASE + 0x0040) +#define MIX_INTERRUPT (MIX_BASE + 0x0044) + +#define MIX_LAYER_CTRL (MIX_BASE + 0x0100) +#define MIX_LAYER_ORDER (MIX_BASE + 0x0104) +#define MIX_BIG_ENDIAN (MIX_BASE + 0x0108) +#define MIX_L0_BG_COLOR (MIX_BASE + 0x0110) +#define MIX_L1_CTRL (MIX_BASE + 0x0120) +#define MIX_L1_LSIZE (MIX_BASE + 0x0124) +#define MIX_L1_SSIZE (MIX_BASE + 0x0128) +#define MIX_L1_LPOS (MIX_BASE + 0x012c) +#define MIX_L1_SPOS (MIX_BASE + 0x0130) +#define MIX_L1_BG_COLOR (MIX_BASE + 0x0134) +#define MIX_L1_Y_SADDR (MIX_BASE + 0x0138) +#define MIX_L1_CB_SADDR (MIX_BASE + 0x013c) +#define MIX_L1_CR_SADDR (MIX_BASE + 0x0140) +#define MIX_L1_Y_STRIDE (MIX_BASE + 0x0144) +#define MIX_L1_CB_STRIDE (MIX_BASE + 0x0148) +#define MIX_L1_CR_STRIDE (MIX_BASE + 0x014c) + +int SetMixerDecOutFrame(FRAME_BUF *pFrame, int width, int height) +{ + int staX, staY; + int div; + staX = (MAX_DISPLAY_WIDTH - width) >> 1; + if (height > MAX_DISPLAY_HEIGHT) + staY = 0; + else + staY = (MAX_DISPLAY_HEIGHT - height) >> 1; + if (staX % 16) + staX = (((staX + 15) >> 4) << 4); + + JpuWriteReg(MIX_L0_BG_COLOR, (0 << 16) | (0x80 << 8) | 0x80); + + JpuWriteReg(MIX_L1_LSIZE, (height << 12) | width); + JpuWriteReg(MIX_L1_SSIZE, (height << 12) | width); + JpuWriteReg(MIX_L1_LPOS, (staY << 12) | staX); + + div = (pFrame->Format == FORMAT_420 || pFrame->Format == FORMAT_422 || + pFrame->Format == FORMAT_400) ? + 2 : + 1; + + JpuWriteReg(MIX_STRIDE_Y, width); + JpuWriteReg(MIX_STRIDE_CB, width / div); + JpuWriteReg(MIX_STRIDE_CR, width / div); + + JpuWriteReg(MIX_ADDR_Y, pFrame->vbY.phys_addr); + JpuWriteReg(MIX_ADDR_CB, pFrame->vbCb.phys_addr); + JpuWriteReg(MIX_ADDR_CR, pFrame->vbCr.phys_addr); + + JpuWriteReg(DISP_HSYNC_START_END, + ((0x7d7 - 40) << 12) | (0x82f - 40)); // horizontal center + JpuWriteReg(DISP_ACTIVE_REGION_TOP, ((0x014 - 2) << 12) | (0x230 - 2)); + JpuWriteReg(DISP_ACTIVE_REGION_BOT, ((0x247 - 2) << 12) | (0x463 - 2)); + + JpuWriteReg(MIX_LAYER_CTRL, 0x3); // backgroup on + JpuWriteReg(MIX_RUN, 0x92); // on, vdec, from sdram + + return 1; +} + +int SetMixerDecOutLayer(int instIdx, int index, int width, int height) +{ + FRAME_BUF *pFrame; + int staX, staY; + int div; + + pFrame = GetFrameBuffer(instIdx, index); + + staX = (MAX_DISPLAY_WIDTH - width) >> 1; + if (height > MAX_DISPLAY_HEIGHT) + staY = 0; + else + staY = (MAX_DISPLAY_HEIGHT - height) >> 1; + if (staX % 16) + staX = ((staX + 15) >> 4) << 4; + + JpuWriteReg(MIX_L0_BG_COLOR, (0 << 16) | (0x80 << 8) | 0x80); + + JpuWriteReg(MIX_L1_LSIZE, (height << 12) | width); + JpuWriteReg(MIX_L1_SSIZE, (height << 12) | width); + JpuWriteReg(MIX_L1_LPOS, (staY << 12) | staX); + + div = (pFrame->Format == FORMAT_420 || pFrame->Format == FORMAT_422 || + pFrame->Format == FORMAT_400) ? + 2 : + 1; + + JpuWriteReg(MIX_STRIDE_Y, width); + JpuWriteReg(MIX_STRIDE_CB, width / div); + JpuWriteReg(MIX_STRIDE_CR, width / div); + + JpuWriteReg(MIX_ADDR_Y, pFrame->vbY.phys_addr); + JpuWriteReg(MIX_ADDR_CB, pFrame->vbCb.phys_addr); + JpuWriteReg(MIX_ADDR_CR, pFrame->vbCr.phys_addr); + + JpuWriteReg(DISP_HSYNC_START_END, + ((0x7d7 - 40) << 12) | (0x82f - 40)); // horizontal center + JpuWriteReg(DISP_ACTIVE_REGION_TOP, ((0x014 - 2) << 12) | (0x230 - 2)); + JpuWriteReg(DISP_ACTIVE_REGION_BOT, ((0x247 - 2) << 12) | (0x463 - 2)); + + JpuWriteReg(MIX_LAYER_CTRL, 0x3); // backgroup on + JpuWriteReg(MIX_RUN, 0x92); // on, vdec, from sdram + + return 1; +} + +void WaitMixerInt(void) +{ + int data; + + return; + + if (JpuReadReg(MIX_INT) == 1) + JpuWriteReg(MIX_INT, 0); + + while (1) { + data = JpuReadReg(MIX_INT); + if (data & 1) + break; + } + JpuWriteReg(MIX_INT, 0); +} + +#endif + +#if defined(PLATFORM_WIN32) || defined(PLATFORM_WINCE) +#include +#include + +#pragma comment(lib, "User32.lib") +#pragma comment(lib, "gdi32.lib") + +#define DRAW_IN_WINDOW +typedef struct { + BITMAPINFOHEADER bmih; + RGBQUAD rgb[256]; +} BITMAPINFO2; + +LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + +typedef struct { + HBITMAP s_dib_section; + void *s_dib_buffer; + HDC s_hdc_memory; + HGDIOBJ s_old_hobject; + HWND s_hWnd; + int wndShow; + BITMAPINFO2 bmi2; +} sw_mixer_context_t; + +static sw_mixer_context_t s_mixer[MAX_NUM_INSTANCE]; +#endif // defined(PLATFORM_WIN32) + +#ifdef PLATFORM_LINUX + +#include +#include +#include +#include +#include +#define FBDEV_FILENAME "/dev/fb0" + +typedef struct { + int s_fd; + unsigned char *s_scr_ptr; + unsigned char *s_rgb_ptr; + unsigned long s_product; + int s_fb_stride; + int s_fb_height; + int s_fb_width; + int s_fb_bpp; +} sw_mixer_context_t; + +static struct fb_var_screeninfo vscr_info; +static struct fb_fix_screeninfo fscr_info; + +static sw_mixer_context_t s_mixer[MAX_NUM_INSTANCE]; +#endif // PLATFORM_LINUX + +int sw_mixer_open(int instIdx, int width, int height) +{ +#ifdef PLATFORM_LINUX + + sw_mixer_context_t *mixer = &s_mixer[instIdx]; + char fb_name[256]; + + if (mixer->s_fd) + return 1; + + sprintf(fb_name, "/dev/fb%d", instIdx); + + mixer->s_fd = open(fb_name, O_RDWR); + if (mixer->s_fd < 0) { + JLOG(ERR, "Unable to open framebuffer %s! open returned: %i\n", + FBDEV_FILENAME, mixer->s_fd); + return 0; + } + /** frame buffer display configuration get */ + if (ioctl(mixer->s_fd, FBIOGET_VSCREENINFO, &vscr_info) != 0 || + ioctl(mixer->s_fd, FBIOGET_FSCREENINFO, &fscr_info) != 0) { + JLOG(ERR, + "Error during ioctl to get framebuffer parameters!\n"); + return 0; + } + if (vscr_info.bits_per_pixel != 32) { + JLOG(ERR, "Error Not supported bits_per_pixel=%d\n", + vscr_info.bits_per_pixel); + return 0; + } + mixer->s_fb_bpp = vscr_info.bits_per_pixel; + mixer->s_fb_width = vscr_info.xres; + mixer->s_fb_stride = fscr_info.line_length; + mixer->s_fb_height = height; + mixer->s_product = mixer->s_fb_stride * mixer->s_fb_height; + /** memory map frame buf memory */ + mixer->s_scr_ptr = (unsigned char *)mmap(0, mixer->s_product, + PROT_READ | PROT_WRITE, + MAP_SHARED, mixer->s_fd, 0); + if (mixer->s_scr_ptr == NULL) { + JLOG(ERR, "in %s Failed to mmap framebuffer memory!\n", + __func__); + close(mixer->s_fd); + return 0; + } + + mixer->s_rgb_ptr = malloc(width * height * 2); + if (mixer->s_rgb_ptr == NULL) { + JLOG(ERR, "in %s Failed to allocate rgb memory!\n", __func__); + close(mixer->s_fd); + return 0; + } + JLOG(TRACE, "mmap framebuffer memory =%p product=%d stride=%d\n", + mixer->s_scr_ptr, (unsigned int)mixer->s_product, (int)width); + JLOG(TRACE, "Successfully opened %s for display.\n", "/dev/fb0"); + JLOG(TRACE, "Display Size: %u x %u\n", (int)mixer->s_fb_width, + (int)mixer->s_fb_height); + JLOG(TRACE, "Bitdepth: %u\n", (int)mixer->s_fb_bpp); + +#endif //#ifdef PLATFORM_LINUX + +#if defined(PLATFORM_WIN32) + sw_mixer_context_t *mixer = &s_mixer[instIdx]; + + HDC hdc; + + if (mixer->s_dib_section) + return 0; + + memset(&mixer->bmi2, 0x00, sizeof(mixer->bmi2)); + mixer->bmi2.bmih.biSize = sizeof(BITMAPINFOHEADER); + mixer->bmi2.bmih.biWidth = width; + mixer->bmi2.bmih.biHeight = -(height); + mixer->bmi2.bmih.biPlanes = 1; + mixer->bmi2.bmih.biBitCount = 32; + mixer->bmi2.bmih.biCompression = BI_RGB; + if (mixer->bmi2.bmih.biBitCount == 16) { + mixer->bmi2.bmih.biCompression = BI_BITFIELDS; + *(DWORD *)(&mixer->bmi2.rgb[0]) = 0xF800; + *(DWORD *)(&mixer->bmi2.rgb[1]) = 0x07e0; + *(DWORD *)(&mixer->bmi2.rgb[2]) = 0x001F; + } + + mixer->s_dib_section = + CreateDIBSection(NULL, (PBITMAPINFO)&mixer->bmi2, + DIB_RGB_COLORS, &mixer->s_dib_buffer, NULL, 0); + + hdc = GetDC(mixer->s_hWnd); + mixer->s_hdc_memory = CreateCompatibleDC(hdc); + if (!mixer->s_hdc_memory) + return 0; + ReleaseDC(mixer->s_hWnd, hdc); + + mixer->s_old_hobject = + SelectObject(mixer->s_hdc_memory, mixer->s_dib_section); + if (!mixer->s_old_hobject) + return 0; + +#ifdef DRAW_IN_WINDOW + { + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = GetModuleHandle(NULL); + wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wcex.lpszMenuName = NULL; + wcex.lpszClassName = "JPUMIXER"; + wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); + + RegisterClassEx(&wcex); + + mixer->s_hWnd = CreateWindow("JPUMIXER", "YuvViewer", + WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, + CW_USEDEFAULT, width, height, NULL, + NULL, GetModuleHandle(NULL), NULL); + MoveWindow(mixer->s_hWnd, instIdx * width, 0, width + 16, + height + 38, TRUE); + mixer->wndShow = 0; + } +#endif +#endif //#if defined(PLATFORM_WIN32) + + return 1; +} + +int sw_mixer_draw(int instIdx, int x, int y, int width, int height, + int planar_format, int pack_format, int interleave, + unsigned char *pbImage) +{ +#ifdef PLATFORM_LINUX + sw_mixer_context_t *mixer = &s_mixer[instIdx]; + unsigned char *src_ptr = pbImage; + unsigned char *dest_ptr = (unsigned char *)mixer->s_scr_ptr; + unsigned char *src_cpy_ptr; + unsigned char *dest_cpy_ptr; + int i; + + UNREFERENCED_PARAM(x); + UNREFERENCED_PARAM(y); + + if (mixer->s_fd < 0) + return 0; + + jpu_yuv2rgb(width, height, + (yuv2rgb_color_format) + convert_jpuapi_format_to_yuv2rgb_color_format( + planar_format, pack_format, interleave), + src_ptr, mixer->s_rgb_ptr, 1); + + src_cpy_ptr = mixer->s_rgb_ptr; + dest_cpy_ptr = dest_ptr; + + for (i = 0; i < height; ++i) { + memcpy(dest_cpy_ptr, src_cpy_ptr, (width * 2)); + src_cpy_ptr += (width * 2); + dest_cpy_ptr += (mixer->s_fb_stride); + } +#endif //#ifdef PLATFORM_LINUX + +#if defined(PLATFORM_WIN32) + sw_mixer_context_t *mixer = &s_mixer[instIdx]; + HDC hdc_screen; + RECT rc; + int dispWidth; + int dispHeight; + + GetClientRect(mixer->s_hWnd, &rc); + dispWidth = rc.right - rc.left; + dispHeight = rc.bottom - rc.top; + + if (!mixer->wndShow) { + ShowWindow(mixer->s_hWnd, SW_SHOW); + // UpdateWindow(mixer->s_hWnd); + // SetForegroundWindow(mixer->s_hWnd); + mixer->wndShow = 1; + } else { + MSG msg = { 0 }; + while (1) { + if (PeekMessage(&msg, mixer->s_hWnd, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } else + break; + } + } + +#ifdef DRAW_IN_WINDOW + hdc_screen = GetDC(mixer->s_hWnd); +#else + hdc_screen = GetDC(NULL); +#endif + + jpu_yuv2rgb(width, height, + (yuv2rgb_color_format) + convert_jpuapi_format_to_yuv2rgb_color_format( + planar_format, pack_format, interleave), + pbImage, (unsigned char *)mixer->s_dib_buffer, 1); + + if (hdc_screen) { + if (width != dispWidth || height != dispHeight) { + StretchBlt(hdc_screen, 0, 0, dispWidth, dispHeight, + mixer->s_hdc_memory, x, y, width, height, + SRCCOPY); + } else { + BitBlt(hdc_screen, x, y, width, height, + mixer->s_hdc_memory, 0, 0, SRCCOPY); + } + ReleaseDC(mixer->s_hWnd, hdc_screen); + hdc_screen = NULL; + } +#endif //#if defined(PLATFORM_WIN32) + return 1; +} + +void sw_mixer_close(int instIdx) +{ +#ifdef PLATFORM_LINUX + sw_mixer_context_t *mixer = &s_mixer[instIdx]; + if (mixer->s_scr_ptr) { + munmap(mixer->s_scr_ptr, mixer->s_product); + mixer->s_scr_ptr = NULL; + } + if (mixer->s_rgb_ptr) { + free(mixer->s_rgb_ptr); + mixer->s_rgb_ptr = NULL; + } + + if (mixer->s_fd) { + close(mixer->s_fd); + mixer->s_fd = 0; + } +#endif + +#if defined(PLATFORM_WIN32) + sw_mixer_context_t *mixer = &s_mixer[instIdx]; + if (mixer->s_old_hobject) { + SelectObject(mixer->s_hdc_memory, mixer->s_old_hobject); + mixer->s_old_hobject = NULL; + } + if (mixer->s_hdc_memory) { + DeleteDC(mixer->s_hdc_memory); + mixer->s_hdc_memory = NULL; + } + if (mixer->s_dib_section) { + DeleteObject(mixer->s_dib_section); + mixer->s_dib_section = NULL; + } + + if (mixer->s_hWnd) { + DestroyWindow(mixer->s_hWnd); + mixer->s_hWnd = NULL; + } +#endif //#if defined(PLATFORM_WIN32) +} + +#if defined(PLATFORM_WIN32) +LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + HDC hdc; + PAINTSTRUCT ps; + + switch (message) { + case WM_CREATE: + return 0; + + case WM_PAINT: + hdc = BeginPaint(hwnd, &ps); + + EndPaint(hwnd, &ps); + return 0; + + case WM_CLOSE: + return 0; + + case WM_DESTROY: + PostQuitMessage(0); + return 0; + } + return DefWindowProc(hwnd, message, wParam, lParam); +} + +#endif // defined(PLATFORM_WIN32) +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/update_version.sh b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/update_version.sh new file mode 100644 index 0000000000..80d5d7b63f --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/update_version.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +commit_ts=`git log -1 --format="%ct"` +commit_time=`date -d@${commit_ts} +"%Y-%m-%d %H:%M:%S"` +current_time=`date +"%Y-%m-%d %H:%M:%S"` +git_version=`git log -1 --format="%h"` +sed -i s/default/"version: ${git_version}; commit: ${commit_time}; build: ${current_time}"/g include/version.h diff --git a/osdrv/interdrv/v2/cvi_vc_drv/jpeg/version.h b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/version.h new file mode 100644 index 0000000000..6e0f3538e2 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/jpeg/version.h @@ -0,0 +1 @@ +#define JPEG_VERSION "-" diff --git a/osdrv/interdrv/v2/cvi_vc_drv/mars/soph_vc_driver.ko b/osdrv/interdrv/v2/cvi_vc_drv/mars/soph_vc_driver.ko deleted file mode 100644 index 49829477d2..0000000000 Binary files a/osdrv/interdrv/v2/cvi_vc_drv/mars/soph_vc_driver.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/mars_arm/soph_vc_driver.ko b/osdrv/interdrv/v2/cvi_vc_drv/mars_arm/soph_vc_driver.ko deleted file mode 100644 index 9bd0875486..0000000000 Binary files a/osdrv/interdrv/v2/cvi_vc_drv/mars_arm/soph_vc_driver.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/mars_riscv/soph_vc_driver.ko b/osdrv/interdrv/v2/cvi_vc_drv/mars_riscv/soph_vc_driver.ko deleted file mode 100644 index 49829477d2..0000000000 Binary files a/osdrv/interdrv/v2/cvi_vc_drv/mars_riscv/soph_vc_driver.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/include/enc_ctx.h b/osdrv/interdrv/v2/cvi_vc_drv/module/include/enc_ctx.h new file mode 100644 index 0000000000..1b2a73fe6b --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/include/enc_ctx.h @@ -0,0 +1,76 @@ +#ifndef __ENC_CTX_H__ +#define __ENC_CTX_H__ + +#include +#include "cvi_jpg_interface.h" +#include "cvi_h265_interface.h" + +typedef struct _venc_jpeg_ctx { + CVIJpgHandle *handle; +} venc_jpeg_ctx; + +typedef struct _venc_vid_ctx { + CVI_VOID (*setInitCfgFixQp) + (cviInitEncConfig *pInitEncCfg, CVI_VOID *pchnctx); + CVI_VOID (*setInitCfgCbr) + (cviInitEncConfig *pInitEncCfg, CVI_VOID *pchnctx); + CVI_VOID (*setInitCfgVbr) + (cviInitEncConfig *pInitEncCfg, CVI_VOID *pchnctx); + CVI_VOID (*setInitCfgAVbr) + (cviInitEncConfig *pInitEncCfg, CVI_VOID *pchnctx); + CVI_VOID (*setInitCfgQpMap) + (cviInitEncConfig *pInitEncCfg, CVI_VOID *pchnctx); + CVI_VOID (*setInitCfgUbr) + (cviInitEncConfig *pInitEncCfg, CVI_VOID *pchnctx); + CVI_VOID (*setInitCfgRc) + (cviInitEncConfig *pInitEncCfg, CVI_VOID *pchnctx); + CVI_S32 (*mapNaluType)(VENC_PACK_S *ppack, CVI_S32 naluType); + CVI_VOID *pHandle; + cviVEncStreamInfo streamInfo; +} venc_vid_ctx; + +typedef struct _venc_h264_ctx { +} venc_h264_ctx; + +typedef struct _venc_h265_ctx { +} venc_h265_ctx; + +typedef struct _venc_enc_ctx_base { + CVI_S32 x; + CVI_S32 y; + CVI_S32 width; + CVI_S32 height; + CVI_S32 u32Profile; + CVI_S32 rcMode; + CVI_BOOL bVariFpsEn; + CVI_U64 u64PTS; + CVI_U64 u64EncHwTime; + CVI_S32 (*init)(CVI_VOID); + CVI_S32 (*open)(CVI_VOID *handle, CVI_VOID *pchnctx); + CVI_S32 (*close)(CVI_VOID *ctx); + CVI_S32 (*encOnePic) + (CVI_VOID *ctx, const VIDEO_FRAME_INFO_S *pstFrame, + CVI_S32 s32MilliSec); + CVI_S32 (*getStream) + (CVI_VOID *ctx, VENC_STREAM_S *pstStream, CVI_S32 s32MIlliSec); + CVI_S32 (*releaseStream)(CVI_VOID *ctx, VENC_STREAM_S *pstStream); + CVI_S32 (*ioctl)(CVI_VOID *ctx, CVI_S32 op, CVI_VOID *arg); +} venc_enc_ctx_base; + +typedef struct _venc_enc_ctx { + venc_enc_ctx_base base; + union { + venc_jpeg_ctx jpeg; + struct { + venc_vid_ctx vid; + union { + venc_h264_ctx h264; + venc_h265_ctx h265; + }; + }; + } ext; +} venc_enc_ctx; + +CVI_S32 venc_create_enc_ctx(venc_enc_ctx *pEncCtx, CVI_VOID *pchnctx); + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/include/module_common.h b/osdrv/interdrv/v2/cvi_vc_drv/module/include/module_common.h new file mode 100644 index 0000000000..6cebd5c95b --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/include/module_common.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved. + * + * File Name: include/module_common.h + * Description: Common video definitions. + */ + +#ifndef __MODULE_COMMON_H__ +#define __MODULE_COMMON_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define MUTEX_INIT(MUTEX_HANDLE, ATTR) mutex_init(MUTEX_HANDLE) +#define MUTEX_DESTROY(MUTEX_HANDLE) mutex_destroy(MUTEX_HANDLE) +#define MUTEX_LOCK(MUTEX_HANDLE) mutex_lock_interruptible(MUTEX_HANDLE) +#define MUTEX_UNLOCK(MUTEX_HANDLE) mutex_unlock(MUTEX_HANDLE) +#define MEM_MALLOC(SIZE) vmalloc(SIZE) +#define MEM_CALLOC(NUMBER, SIZE) vzalloc(SIZE * NUMBER) +#define MEM_FREE(PTR) vfree(PTR) +#define SEMA_INIT(P_SEM, SHARED, VALUE) sema_init(P_SEM, VALUE) +#define SEMA_DESTROY(P_SEM) +#define SEMA_WAIT(P_SEM) down_interruptible(P_SEM) +#define SEMA_TRYWAIT(P_SEM) down_trylock(P_SEM) +#define SEMA_TIMEWAIT(P_SEM, P_TS) down_timeout(P_SEM, P_TS) +#define SEMA_POST(P_SEM) up(P_SEM) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/include/vdec.h b/osdrv/interdrv/v2/cvi_vc_drv/module/include/vdec.h new file mode 100644 index 0000000000..e27c7be960 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/include/vdec.h @@ -0,0 +1,48 @@ +#ifndef __VDEC_H__ +#define __VDEC_H__ + +#include +#include + +#define DISPLAY_QUEUE_SIZE 32 +#define MAX_VDEC_FRM_NUM 32 + +typedef struct _vdec_chn_context { + VDEC_CHN VdChn; + CVI_U64 totalDecTime; + VDEC_CHN_ATTR_S ChnAttr; + VDEC_CHN_PARAM_S ChnParam; + VDEC_CHN_STATUS_S stStatus; + VIDEO_FRAME_INFO_S *VideoFrameArray; + CVI_U32 VideoFrameArrayNum; + CVI_S8 display_queue[DISPLAY_QUEUE_SIZE]; + CVI_U32 w_idx; + CVI_U32 r_idx; + CVI_U32 seqNum; + struct mutex display_queue_lock; + struct mutex status_lock; + struct mutex chnShmMutex; + CVI_VOID *pHandle; + CVI_BOOL bHasVbPool; + VDEC_CHN_POOL_S vbPool; + VB_BLK vbBLK[MAX_VDEC_FRM_NUM]; + cviBufInfo FrmArray[MAX_VDEC_FRM_NUM]; + CVI_U32 FrmNum; + CVI_BOOL bStartRecv; + struct cvi_vdec_vb_ctx *pVbCtx; + + CVI_U64 u64LastSendStreamTimeStamp; + CVI_U64 u64LastGetFrameTimeStamp; + CVI_U32 u32SendStreamCnt; + CVI_U32 u32GetFrameCnt; + VIDEO_FRAME_INFO_S stVideoFrameInfo; + VCODEC_PERF_FPS_S stFPS; + CVI_U32 u32VBSize; +} vdec_chn_context; + +typedef struct _vdec_context { + vdec_chn_context *chn_handle[VDEC_MAX_CHN_NUM]; + VDEC_MOD_PARAM_S g_stModParam; +} vdec_context; + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/include/venc.h b/osdrv/interdrv/v2/cvi_vc_drv/module/include/venc.h new file mode 100644 index 0000000000..6d8a626047 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/include/venc.h @@ -0,0 +1,145 @@ +#ifndef __VENC_H__ +#define __VENC_H__ + +#include +#include +#include +#include +#include +#include +#include "enc_ctx.h" +#include "cvi_jpg_interface.h" + +#define VENC_MEMSET memset + +typedef enum _VENC_CHN_STATE_ { + VENC_CHN_STATE_NONE = 0, + VENC_CHN_STATE_INIT, + VENC_CHN_STATE_START_ENC, + VENC_CHN_STATE_STOP_ENC, +} VENC_CHN_STATE; + +typedef enum _VENC_SBM_STATE { + VENC_SBM_STATE_IDLE = 0, + VENC_SBM_STATE_FRM_RUN, + VENC_SBM_STATE_FRM_SKIP, + VENC_SBM_STATE_CHN_CLOSED, + VENC_SBM_MAX_STATE +} VENC_SBM_STATE; + +typedef struct _venc_frc { + CVI_BOOL bFrcEnable; + CVI_S32 srcFrameDur; + CVI_S32 dstFrameDur; + CVI_S32 srcTs; + CVI_S32 dstTs; +} venc_frc; + +typedef struct _venc_vfps { + CVI_BOOL bVfpsEnable; + CVI_S32 s32NumFrmsInOneSec; + CVI_U64 u64prevSec; + CVI_U64 u64StatTime; +} venc_vfps; + +#define CVI_DEF_VFPFS_STAT_TIME 2 +#define MAX_VENC_FRM_NUM 32 + +typedef struct _venc_chn_vars { + CVI_U64 u64TimeOfSendFrame; + CVI_U64 u64LastGetStreamTimeStamp; + CVI_U64 u64LastSendFrameTimeStamp; + CVI_U64 currPTS; + CVI_U64 totalTime; + CVI_S32 frameIdx; + CVI_S32 s32RecvPicNum; + CVI_S32 bind_event_fd; + venc_frc frc; + venc_vfps vfps; + VENC_STREAM_S stStream; + VENC_JPEG_PARAM_S stJpegParam; + VENC_CHN_PARAM_S stChnParam; + VENC_CHN_STATUS_S chnStatus; + VENC_CU_PREDICTION_S cuPrediction; + VENC_FRAME_PARAM_S frameParam; + VENC_CHN_STATE chnState; + USER_RC_INFO_S stUserRcInfo; + VENC_SUPERFRAME_CFG_S stSuperFrmParam; + struct semaphore sem_send; + struct semaphore sem_release; + CVI_BOOL bAttrChange; + VENC_FRAMELOST_S frameLost; + CVI_BOOL bHasVbPool; + VENC_CHN_POOL_S vbpool; + VB_BLK vbBLK[VB_COMM_POOL_MAX_CNT]; + cviBufInfo FrmArray[MAX_VENC_FRM_NUM]; + CVI_U32 FrmNum; + CVI_U32 u32SendFrameCnt; + CVI_U32 u32GetStreamCnt; + CVI_S32 s32BindModeGetStreamRet; + CVI_U32 u32FirstPixelFormat; + CVI_BOOL bSendFirstFrm; + CVI_U32 u32Stride[3]; + VIDEO_FRAME_INFO_S stFrameInfo; + VENC_ROI_ATTR_S stRoiAttr[8]; + VCODEC_PERF_FPS_S stFPS; +} venc_chn_vars; + +typedef struct _venc_chn_context { + VENC_CHN VeChn; + VENC_CHN_ATTR_S *pChnAttr; + VENC_RC_PARAM_S rcParam; + VENC_REF_PARAM_S refParam; + VENC_FRAMELOST_S frameLost; + VENC_H264_ENTROPY_S h264Entropy; + VENC_H264_TRANS_S h264Trans; + VENC_H265_TRANS_S h265Trans; + VENC_H264_SLICE_SPLIT_S h264Split; + VENC_H265_SLICE_SPLIT_S h265Split; + union { + VENC_H264_VUI_S h264Vui; + VENC_H265_VUI_S h265Vui; + }; + VENC_H264_INTRA_PRED_S h264IntraPred; + VENC_SVC_PARAM_S svcParam; + CVI_BOOL bSvcEnable; + venc_enc_ctx encCtx; + venc_chn_vars *pChnVars; + struct cvi_venc_vb_ctx *pVbCtx; + struct mutex chnMutex; + struct mutex chnShmMutex; + CVI_BOOL bSbSkipFrm; + VENC_SBM_STATE sbm_state; + CVI_U32 jpgFrmSkipCnt; + cviVencSbSetting stSbSetting; + VIDEO_FRAME_INFO_S stVideoFrameInfo; + CVI_BOOL bChnEnable; + union { + VENC_H264_DBLK_S h264Dblk; + VENC_H265_DBLK_S h265Dblk; + }; +} venc_chn_context; + +typedef struct _venc_sbm_context { + CVI_U32 SbmNum; + VENC_CHN CurrSbmChn; + struct mutex SbmMutex; + struct task_struct *pSBMSendFrameThread; +} venc_sbm_context; + +typedef struct _CVI_VENC_MODPARAM_S { + VENC_MOD_VENC_S stVencModParam; + VENC_MOD_H264E_S stH264eModParam; + VENC_MOD_H265E_S stH265eModParam; + VENC_MOD_JPEGE_S stJpegeModParam; + VENC_MOD_RC_S stRcModParam; +} CVI_VENC_PARAM_MOD_S; + +typedef struct _venc_context { + venc_chn_context * chn_handle[VENC_MAX_CHN_NUM]; + CVI_U32 chn_status[VENC_MAX_CHN_NUM]; + CVI_VENC_PARAM_MOD_S ModParam; + venc_sbm_context sbm_context; +} venc_context; + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/include/venc_debug.h b/osdrv/interdrv/v2/cvi_vc_drv/module/include/venc_debug.h new file mode 100644 index 0000000000..e588f3e454 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/include/venc_debug.h @@ -0,0 +1,31 @@ +#ifndef __VENC_DEBUG_H__ +#define __VENC_DEBUG_H__ + +#include "cvi_venc.h" + +#ifdef CLI_DEBUG_SUPPORT +#include "tcli.h" +extern void venc_register_cmd(void); +extern void cviCliDumpSrcYuv(int chn, const VIDEO_FRAME_INFO_S *pstFrame); +extern CVI_S32 cviDumpVencBitstream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, + PAYLOAD_TYPE_E enType); +extern void venc_set_handler_state(VENC_CHN VeChn, int state); +extern void venc_channel_run_status_addself(VENC_CHN VeChn, int index); +extern void venc_handler_exit_retcode(VENC_CHN VeChn, int retcode); +extern void cviGetMaxBitstreamSize(VENC_CHN VeChn, VENC_STREAM_S *pstStream); + +#define VENC_SET_HANDLER_STATE(state) venc_set_handler_state(VencChn, state) + +#define VENC_SET_HANDLER_EXIT_RETCODE(retcode) venc_handler_exit_retcode(VencChn, retcode) + +#define VENC_STATUS_RUN_ADDSELF(index) venc_channel_run_status_addself(VencChn, index) + +#else + +#define VENC_SET_HANDLER_STATE(state) +#define VENC_SET_HANDLER_EXIT_RETCODE(retcode) +#define VENC_STATUS_RUN_ADDSELF(index) + +#endif + +#endif //__VENC_DEBUG_H__ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_vdec.c b/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_vdec.c new file mode 100644 index 0000000000..77b0130dd1 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_vdec.c @@ -0,0 +1,2040 @@ +#ifdef ENABLE_DEC +#include "cvi_vdec.h" +#include +#include +#include +#include +#include "module_common.h" +#include "cvi_vc_drv_proc.h" +#include "cvi_jpg_interface.h" +#include "cvi_h265_interface.h" +#include +#include +#include +#include "vdec.h" +#include "vb.h" + +#define CVI_VDEC_NO_INPUT -10 +#define CVI_VDEC_INPUT_ERR -11 + +#define VDEC_TIME_BLOCK_MODE (-1) +#define VDEC_RET_TIMEOUT (-2) +#define VDEC_TIME_TRY_MODE (0) +#define VDEC_DEFAULT_MUTEX_MODE VDEC_TIME_BLOCK_MODE + +// below should align to cv183x_vcodec.h +#define VPU_MISCDEV_NAME "/dev/cvi-vcodec" +#define VCODEC_VENC_SHARE_MEM_SIZE (0x30000) // 192k +#define VCODEC_VDEC_SHARE_MEM_SIZE (0x8000) // 32k +#define VCODEC_SHARE_MEM_SIZE \ + (VCODEC_VENC_SHARE_MEM_SIZE + VCODEC_VDEC_SHARE_MEM_SIZE) +#define SEC_TO_MS (1000) + +#define ALIGN(x, a) (((x) + ((a)-1)) & ~((a)-1)) +#define UNUSED(x) ((void)(x)) + +#define IF_WANNA_DISABLE_BIND_MODE() \ + ((pVbCtx->currBindMode == CVI_TRUE) && \ + (pVbCtx->enable_bind_mode == CVI_FALSE)) +#define IF_WANNA_ENABLE_BIND_MODE() \ + ((pVbCtx->currBindMode == CVI_FALSE) && \ + (pVbCtx->enable_bind_mode == CVI_TRUE)) + +vdec_dbg vdecDbg; +vdec_context *vdec_handle; +extern int32_t vb_create_pool(struct cvi_vb_pool_cfg *config); +extern int32_t vb_get_config(struct cvi_vb_cfg *pstVbConfig); +extern VB_BLK vb_get_block_with_id(VB_POOL poolId, uint32_t u32BlkSize, + MOD_ID_E modId); +extern uint64_t vb_handle2PhysAddr(VB_BLK blk); +extern VB_BLK vb_physAddr2Handle(uint64_t u64PhyAddr); +extern VB_POOL vb_handle2PoolId(VB_BLK blk); +extern int32_t vb_release_block(VB_BLK blk); +extern int32_t vb_destroy_pool(VB_POOL poolId); +// TODO: need to refine: +struct cvi_vdec_vb_ctx vdec_vb_ctx[VENC_MAX_CHN_NUM]; + +static DEFINE_MUTEX(g_vdec_handle_mutex); +static DEFINE_MUTEX(jpdLock); + +static CVI_VOID cviChangeVdecMask(CVI_S32 frameIdx); +static CVI_S32 allocate_vdec_frame(vdec_chn_context *pChnHandle, CVI_U32 idx); + +static CVI_S32 free_vdec_frame(VDEC_CHN_ATTR_S *pstAttr, + VIDEO_FRAME_INFO_S *pstVideoFrame); +static CVI_S32 cvi_jpeg_decode(VDEC_CHN VdChn, const VDEC_STREAM_S *pstStream, + VIDEO_FRAME_INFO_S *pstVideoFrame, + CVI_S32 s32MilliSec, CVI_U64 *pu64DecHwTime); +static CVI_S32 cvi_h264_decode(void *pHandle, PIXEL_FORMAT_E enPixelFormat, + const VDEC_STREAM_S *pstStream, + CVI_S32 s32MilliSec); +static CVI_S32 cvi_h265_decode(void *pHandle, PIXEL_FORMAT_E enPixelFormat, + const VDEC_STREAM_S *pstStream, + CVI_S32 s32MilliSec); +static void cviSetVideoFrameInfo(VIDEO_FRAME_INFO_S *pstVideoFrame, + cviDispFrameCfg *pdfc); +static CVI_S32 cviSetVideoChnAttrToProc(VDEC_CHN VdChn, + VIDEO_FRAME_INFO_S *psFrameInfo, + CVI_U64 u64DecHwTime); +static CVI_S32 cviSetVdecFpsToProc(VDEC_CHN VdChn, CVI_BOOL bSendStream); +static CVI_VOID cviGetDebugConfigFromDecProc(void); + +static CVI_S32 cviVdec_Mutex_Lock(struct mutex *__restrict __mutex, + CVI_S32 s32MilliSec, CVI_S32 *s32CostTime); +static CVI_S32 cviVdec_Mutex_Unlock(struct mutex *__mutex); + +static inline CVI_S32 checkTimeOutAndBusy(int s32Ret, int line) +{ + if (s32Ret == 0) + return s32Ret; + + if ((s32Ret == ETIMEDOUT) || (s32Ret == EBUSY)) { + CVI_VDEC_TRACE("mutex timeout and retry\n"); + return CVI_ERR_VDEC_BUSY; + } + + CVI_VDEC_ERR("vdec mutex error[%d], line = %d\n", s32Ret, line); + return CVI_ERR_VDEC_ERR_VDEC_MUTEX; +} + +static CVI_U64 get_current_time(CVI_VOID) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + struct timespec64 ts; +#else + struct timespec ts; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + ktime_get_ts64(&ts); +#else + ktime_get_ts(&ts); +#endif + return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; // in ms +} + +static CVI_S32 cviVdec_Mutex_Unlock(struct mutex *__mutex) +{ + mutex_unlock(__mutex); + return 0; +} + +static CVI_S32 cviVdec_Mutex_Lock(struct mutex *__restrict __mutex, + CVI_S32 s32MilliSec, CVI_S32 *s32CostTime) +{ + CVI_S32 s32RetCostTime; + CVI_S32 s32RetCheck; + CVI_U64 u64StartTime, u64EndTime; + + u64StartTime = get_current_time(); + if (s32MilliSec < 0) { + //block mode + s32RetCheck = mutex_lock_interruptible(__mutex); + u64EndTime = get_current_time(); + s32RetCostTime = u64EndTime - u64StartTime; + } else if (s32MilliSec == 0) { + //trylock + if (mutex_trylock(__mutex)) { + s32RetCheck = 0; + } else { + s32RetCheck = EBUSY; + } + s32RetCostTime = 0; + } else { + //timelock + int wait_cnt_ms = 1; + while (mutex_is_locked(__mutex)) { + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(usecs_to_jiffies(1000)); + if (wait_cnt_ms >= s32MilliSec) { + break; + } + wait_cnt_ms++; + } + if (mutex_trylock(__mutex)) { + s32RetCheck = 0; + } else { + s32RetCheck = EBUSY; + } + u64EndTime = get_current_time(); + s32RetCostTime = u64EndTime - u64StartTime; + } + //calculate cost lock time + + //check the mutex validity + if (s32RetCheck != 0) { + CVI_VDEC_ERR("mutex lock error[%d]\n", s32RetCheck); + } + + if (s32CostTime != NULL) + *s32CostTime = s32RetCostTime; + return s32RetCheck; +} + +static CVI_VOID cviChangeVdecMask(CVI_S32 frameIdx) +{ + vdec_dbg *pDbg = &vdecDbg; + + pDbg->currMask = pDbg->dbgMask; + if (pDbg->startFn >= 0) { + if (frameIdx >= pDbg->startFn && frameIdx <= pDbg->endFn) + pDbg->currMask = pDbg->dbgMask; + else + pDbg->currMask = CVI_VDEC_MASK_ERR; + } + + CVI_VDEC_TRACE("currMask = 0x%X\n", pDbg->currMask); +} + +static CVI_S32 check_vdec_chn_handle(VDEC_CHN VdChn) +{ + if (vdec_handle == NULL) { + CVI_VDEC_ERR("Call VDEC Destroy before Create, failed\n"); + return CVI_ERR_VDEC_UNEXIST; + } + + if (vdec_handle->chn_handle[VdChn] == NULL) { + CVI_VDEC_ERR("VDEC Chn #%d haven't created !\n", VdChn); + return CVI_ERR_VDEC_INVALID_CHNID; + } + + return CVI_SUCCESS; +} + +#if 0 +static CVI_U32 vdec_dump_queue_status(VDEC_CHN VdChn) +{ + + vdec_chn_context *pChnHandle = vdec_handle->chn_handle[VdChn]; + + if (vdec_handle == NULL) { + CVI_VDEC_ERR("Call VENC Destroy before Create, failed\n"); + return CVI_ERR_VDEC_UNEXIST; + } + + if (vdec_handle->chn_handle[VdChn] == NULL) { + CVI_VDEC_ERR("VDEC Chn #%d haven't created !\n", VdChn); + return CVI_ERR_VDEC_INVALID_CHNID; + } + + for (int i = 0; i < pChnHandle->ChnAttr.u32FrameBufCnt; i++) { + CVI_VDEC_INFO("FbArray %d, flag %d\n", i, pChnHandle->VideoFrameArray[i].stVFrame.u32FrameFlag); + } + + for (int i = 0; i < DISPLAY_QUEUE_SIZE; i++) { + CVI_VDEC_INFO("DisQueue %d, idx %d\n", i, pChnHandle->display_queue[i]); + } + + return CVI_SUCCESS; + +} +#endif + +static CVI_S32 get_avail_fb(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *VideoFrameArray) +{ + vdec_chn_context *pChnHandle = NULL; + CVI_S32 s32Ret = check_vdec_chn_handle(VdChn); + CVI_S32 avail_fb_idx = -1; + CVI_U32 i = 0; + VB_BLK blk; + VB_POOL hPicVbPool = VB_INVALID_POOLID; + + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return avail_fb_idx; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + if ((pChnHandle->ChnAttr.enType == PT_JPEG || pChnHandle->ChnAttr.enType == PT_MJPEG)) { + + if (vdec_handle->g_stModParam.enVdecVBSource != + VB_SOURCE_USER) { + blk = vb_get_block_with_id(VB_INVALID_POOLID, + pChnHandle->u32VBSize, + CVI_ID_VDEC); + } else { + hPicVbPool = pChnHandle->vbPool.hPicVbPool; + blk = vb_get_block_with_id(hPicVbPool, + pChnHandle->u32VBSize, + CVI_ID_VDEC); + } + + if (blk == VB_INVALID_HANDLE) { + CVI_VDEC_WARN("chn:%d get block fail\n", VdChn); + return CVI_FAILURE; + } + + for (i = 0; i < pChnHandle->VideoFrameArrayNum; i++) { + if (pChnHandle->vbBLK[i] == blk) { + avail_fb_idx = i; + break; + } + } + + // maybe vb num > VideoFrameArrayNum + if (avail_fb_idx == -1) { + CVI_VDEC_WARN("chn:%d get block fail\n", VdChn); + vb_release_block(blk); + return CVI_FAILURE; + } + } else { + for (i = 0; i < pChnHandle->VideoFrameArrayNum; i++) { + if (VideoFrameArray[i].stVFrame.u32FrameFlag == 0) { + avail_fb_idx = i; + break; + } + } + } + + CVI_VDEC_INFO("avail_fb_idx:%d\n", avail_fb_idx); + + return avail_fb_idx; +} + +static CVI_S32 insert_display_queue(CVI_U32 w_idx, CVI_S32 fb_idx, + CVI_S8 *display_queue) +{ + if (display_queue[w_idx] != -1) + return CVI_ERR_VDEC_ILLEGAL_PARAM; + CVI_VDEC_INFO("insert_display_queue, w_idx %d, fb_idx %d\n", w_idx, + fb_idx); + display_queue[w_idx] = fb_idx; + + return CVI_SUCCESS; +} + +static CVI_S32 allocate_vdec_frame(vdec_chn_context *pChnHandle, CVI_U32 idx) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + VDEC_CHN_ATTR_S *pstAttr = &pChnHandle->ChnAttr; + VDEC_CHN_PARAM_S *pstParam = &pChnHandle->ChnParam; + + VIDEO_FRAME_S *pstVFrame = &(pChnHandle->VideoFrameArray[idx].stVFrame); + VB_CAL_CONFIG_S stVbCfg; + PIXEL_FORMAT_E enPixelFormat = + (pstAttr->enType == PT_JPEG || pstAttr->enType == PT_MJPEG) ? + pstParam->enPixelFormat : + PIXEL_FORMAT_YUV_PLANAR_420; + + CVI_VDEC_API("\n"); + + memset(&stVbCfg, 0, sizeof(stVbCfg)); + VDEC_GetPicBufferConfig(pstAttr->enType, pstAttr->u32PicWidth, + pstAttr->u32PicHeight, enPixelFormat, + DATA_BITWIDTH_8, COMPRESS_MODE_NONE, &stVbCfg); + + pstVFrame->enCompressMode = COMPRESS_MODE_NONE; + pstVFrame->enPixelFormat = enPixelFormat; + pstVFrame->enVideoFormat = VIDEO_FORMAT_LINEAR; + pstVFrame->enColorGamut = COLOR_GAMUT_BT709; + pstVFrame->u32Width = pstAttr->u32PicWidth; + pstVFrame->u32Height = pstAttr->u32PicHeight; + pstVFrame->u32Stride[0] = stVbCfg.u32MainStride; + pstVFrame->u32Stride[1] = + (stVbCfg.plane_num > 1) ? stVbCfg.u32CStride : 0; + pstVFrame->u32Stride[2] = + (stVbCfg.plane_num > 2) ? stVbCfg.u32CStride : 0; + pstVFrame->u32TimeRef = 0; + pstVFrame->u64PTS = 0; + pstVFrame->enDynamicRange = DYNAMIC_RANGE_SDR8; + pstVFrame->u32FrameFlag = 0; + pChnHandle->u32VBSize = stVbCfg.u32VBSize; + + CVI_VDEC_DISP( + "u32Stride[0] = %d, u32Stride[1] = %d, u32Stride[2] = %d\n", + pstVFrame->u32Stride[0], pstVFrame->u32Stride[1], + pstVFrame->u32Stride[2]); + + if (pstVFrame->u32Width % DEFAULT_ALIGN) { + CVI_VDEC_INFO("u32Width is not algined to %d\n", DEFAULT_ALIGN); + } + + if (pstAttr->enType == PT_JPEG || pstAttr->enType == PT_MJPEG) { + VB_POOL hPicVbPool = VB_INVALID_POOLID; + VB_BLK blk; + + if (vdec_handle->g_stModParam.enVdecVBSource != + VB_SOURCE_USER) { + blk = vb_get_block_with_id(VB_INVALID_POOLID, + stVbCfg.u32VBSize, + CVI_ID_VDEC); + } else { + hPicVbPool = pChnHandle->vbPool.hPicVbPool; + blk = vb_get_block_with_id( + hPicVbPool, stVbCfg.u32VBSize, CVI_ID_VDEC); + } + + if (blk == VB_INVALID_HANDLE) { + CVI_VDEC_ERR("Can't acquire vb block\n"); + return CVI_ERR_VDEC_NOMEM; + } + + pChnHandle->vbBLK[idx] = blk; + + CVI_VDEC_INFO("alloc size %d, %d x %d\n", stVbCfg.u32VBSize, + pstAttr->u32PicWidth, pstAttr->u32PicHeight); + + pChnHandle->VideoFrameArray[idx].u32PoolId = + vb_handle2PoolId(blk); + + pstVFrame->u32Length[0] = stVbCfg.u32MainYSize; + pstVFrame->u64PhyAddr[0] = vb_handle2PhysAddr(blk); + + if (stVbCfg.plane_num > 1) { + pstVFrame->u32Length[1] = stVbCfg.u32MainCSize; + pstVFrame->u64PhyAddr[1] = pstVFrame->u64PhyAddr[0] + + ALIGN(stVbCfg.u32MainYSize, + stVbCfg.u16AddrAlign); + } else { + pstVFrame->u32Length[1] = 0; + pstVFrame->u64PhyAddr[1] = 0; + pstVFrame->pu8VirAddr[1] = NULL; + } + + if (stVbCfg.plane_num > 2) { + pstVFrame->u32Length[2] = stVbCfg.u32MainCSize; + pstVFrame->u64PhyAddr[2] = pstVFrame->u64PhyAddr[1] + + ALIGN(stVbCfg.u32MainCSize, + stVbCfg.u16AddrAlign); + } else { + pstVFrame->u32Length[2] = 0; + pstVFrame->u64PhyAddr[2] = 0; + pstVFrame->pu8VirAddr[2] = NULL; + } + + CVI_VDEC_DISP("phy addr(%llx, %llx, %llx\n", + pstVFrame->u64PhyAddr[0], + pstVFrame->u64PhyAddr[1], + pstVFrame->u64PhyAddr[2]); + + CVI_VDEC_DISP("vir addr(%p, %p, %p\n", pstVFrame->pu8VirAddr[0], + pstVFrame->pu8VirAddr[1], + pstVFrame->pu8VirAddr[2]); + + pChnHandle->FrmArray[idx].phyAddr = pstVFrame->u64PhyAddr[0]; + pChnHandle->FrmArray[idx].size = stVbCfg.u32VBSize; + pChnHandle->FrmArray[idx].virtAddr = pstVFrame->pu8VirAddr[0]; + pChnHandle->FrmNum++; + + vb_release_block(blk); + } + + return s32Ret; +} + +CVI_S32 _CVI_VDEC_InitHandle(void) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + if (MUTEX_LOCK(&g_vdec_handle_mutex) != 0) { + CVI_VDEC_ERR("can not lock g_vdec_handle_mutex\n"); + return CVI_FAILURE; + } + + if (vdec_handle == NULL) { + vdec_handle = MEM_CALLOC(1, sizeof(vdec_context)); + + if (vdec_handle == NULL) { + MUTEX_UNLOCK(&g_vdec_handle_mutex); + return CVI_ERR_VDEC_NOMEM; + } + + memset(vdec_handle, 0x00, sizeof(vdec_context)); + vdec_handle->g_stModParam.enVdecVBSource = + VB_SOURCE_COMMON; // Default is VB_SOURCE_COMMON + vdec_handle->g_stModParam.u32MiniBufMode = 0; + vdec_handle->g_stModParam.u32ParallelMode = 0; + vdec_handle->g_stModParam.stVideoModParam.u32MaxPicHeight = + 2160; + vdec_handle->g_stModParam.stVideoModParam.u32MaxPicWidth = 4096; + vdec_handle->g_stModParam.stVideoModParam.u32MaxSliceNum = 200; + vdec_handle->g_stModParam.stPictureModParam.u32MaxPicHeight = + 8192; + vdec_handle->g_stModParam.stPictureModParam.u32MaxPicWidth = + 8192; + } + + MUTEX_UNLOCK(&g_vdec_handle_mutex); + + return s32Ret; +} + +static CVI_S32 _cvi_vdec_AllocVbBuf(vdec_chn_context *pChnHandle, void *arg) +{ + int j = 0; + stCviCb_HostAllocFB *pHostAllocFB = (stCviCb_HostAllocFB *)arg; + + if (vdec_handle->g_stModParam.enVdecVBSource == VB_SOURCE_PRIVATE) { + if (pChnHandle->bHasVbPool == false) { + + struct cvi_vb_pool_cfg stVbPoolCfg; + + stVbPoolCfg.blk_size = pHostAllocFB->iFrmBufSize; + stVbPoolCfg.blk_cnt = pHostAllocFB->iFrmBufNum; + stVbPoolCfg.remap_mode = VB_REMAP_MODE_NONE; + + pChnHandle->vbPool.hPicVbPool = + vb_create_pool(&stVbPoolCfg); + + if (pChnHandle->vbPool.hPicVbPool == + VB_INVALID_POOLID) { + CVI_VDEC_ERR("CVI_VB_CreatePool failed !\n"); + return 0; + } + + pChnHandle->bHasVbPool = true; + + CVI_VDEC_TRACE( + "Create Private Pool: %d, u32BlkSize=0x%x, u32BlkCnt=%d\n", + pChnHandle->vbPool.hPicVbPool, + stVbPoolCfg.blk_size, stVbPoolCfg.blk_cnt); + } + } + + if (pChnHandle->bHasVbPool == false) { + CVI_VDEC_ERR("pChnHandle->bHasVbPool == false\n"); + return 0; + } + + if (pHostAllocFB->iFrmBufNum > MAX_VDEC_FRM_NUM) { + CVI_VDEC_ERR("iFrmBufNum > %d\n", MAX_VDEC_FRM_NUM); + return 0; + } + + for (j = 0; j < pHostAllocFB->iFrmBufNum; j++) { + CVI_U64 u64PhyAddr; + + pChnHandle->vbBLK[j] = + vb_get_block_with_id(pChnHandle->vbPool.hPicVbPool, + pHostAllocFB->iFrmBufSize, + CVI_ID_VDEC); + if (pChnHandle->vbBLK[j] == VB_INVALID_HANDLE) { + CVI_VDEC_ERR("CVI_VB_GetBlockwithID failed !\n"); + CVI_VDEC_ERR( + "Frame isn't enough. Need %d frames, size 0x%x. Now only %d frames\n", + pHostAllocFB->iFrmBufNum, + pHostAllocFB->iFrmBufSize, j); + return 0; + } + + u64PhyAddr = vb_handle2PhysAddr(pChnHandle->vbBLK[j]); + + pChnHandle->FrmArray[j].phyAddr = u64PhyAddr; + pChnHandle->FrmArray[j].size = pHostAllocFB->iFrmBufSize; + + CVI_VDEC_TRACE( + "CVI_VB_GetBlockwithID, VbBlk = %d, u64PhyAddr = 0x%llx, virtAddr = %p\n", + (CVI_S32)pChnHandle->vbBLK[j], (long long)u64PhyAddr, + pChnHandle->FrmArray[j].virtAddr); + } + + pChnHandle->FrmNum = pHostAllocFB->iFrmBufNum; + + cviVDecAttachFrmBuf((void *)pChnHandle->pHandle, + (void *)pChnHandle->FrmArray, + pHostAllocFB->iFrmBufNum); + + return 1; +} + +static CVI_S32 _cvi_vdec_FreeVbBuf(vdec_chn_context *pChnHandle) +{ + if (vdec_handle->g_stModParam.enVdecVBSource == VB_SOURCE_PRIVATE) { + CVI_VDEC_ERR("not support VB_SOURCE_PRIVATE yet\n"); + return 0; + } + + CVI_VDEC_TRACE("\n"); + + if (pChnHandle->ChnAttr.enType == PT_H264 || + pChnHandle->ChnAttr.enType == PT_H265) { + if (pChnHandle->bHasVbPool == true) { + CVI_U32 i = 0; + VB_BLK blk; + + for (i = 0; i < pChnHandle->FrmNum; i++) { + blk = vb_physAddr2Handle( + pChnHandle->FrmArray[i].phyAddr); + + if (blk != VB_INVALID_HANDLE) { + vb_release_block(blk); + } + } + } else { + CVI_VDEC_ERR("bHasVbPool = false\n"); + return 0; + } + } + + return 1; +} + +static CVI_S32 _cvi_vdec_GetDispQ_Count(vdec_chn_context *pChnHandle) +{ + CVI_S32 s32Count = 0; + + CVI_U32 i = 0; + + for (i = 0; i < pChnHandle->VideoFrameArrayNum; i++) { + VIDEO_FRAME_S *pstCurFrame; + + pstCurFrame = &pChnHandle->VideoFrameArray[i].stVFrame; + + if (pstCurFrame->u32FrameFlag == 1) { + s32Count++; + } + } + + CVI_VDEC_TRACE("s32Count=%d\n", s32Count); + + return s32Count; +} + +static CVI_S32 _cvi_vdec_CallbackFunc(unsigned int VdChn, unsigned int CbType, + void *arg) +{ + CVI_S32 s32Ret = 0, s32Check = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + s32Check = check_vdec_chn_handle(VdChn); + if (s32Check != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + CVI_VDEC_TRACE("VdChn = %d, CbType= %d\n", VdChn, CbType); + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + switch (CbType) { + case CVI_H26X_DEC_CB_AllocFB: + if (arg == NULL) { + CVI_VDEC_ERR("arg == NULL\n"); + return s32Ret; + } + + if (_cvi_vdec_AllocVbBuf(pChnHandle, arg) != 1) { + return s32Ret; + } + s32Ret = 1; + break; + case CVI_H26X_DEC_CB_FreeFB: + if (_cvi_vdec_FreeVbBuf(pChnHandle) != 1) { + return s32Ret; + } + s32Ret = 1; + break; + case CVI_H26X_DEC_CB_GET_DISPQ_COUNT: + s32Ret = _cvi_vdec_GetDispQ_Count(pChnHandle); + break; + default: + CVI_VDEC_ERR("Unsupported cbType: %d\n", CbType); + break; + } + + return s32Ret; +} + +#define VDEC_NO_FRAME_IDX 0xFFFFFFFF +CVI_BOOL _cvi_vdec_FindBlkInfo(vdec_chn_context *pChnHandle, CVI_U64 u64PhyAddr, + VB_BLK *pVbBLK, CVI_U32 *pFrmIdx) +{ + CVI_U32 i = 0; + + if ((pChnHandle == NULL) || (pVbBLK == NULL) || (pFrmIdx == NULL)) + return false; + + *pVbBLK = VB_INVALID_HANDLE; + *pFrmIdx = VDEC_NO_FRAME_IDX; + + for (i = 0; i < pChnHandle->FrmNum; i++) { + if ((pChnHandle->FrmArray[i].phyAddr <= u64PhyAddr) && + (pChnHandle->FrmArray[i].phyAddr + + pChnHandle->FrmArray[i].size) > u64PhyAddr) { + *pVbBLK = pChnHandle->vbBLK[i]; + *pFrmIdx = i; + break; + } + } + + if (i == pChnHandle->FrmNum) { + CVI_VDEC_ERR("Can't find BLK !\n"); + return false; + } + + return true; +} + +CVI_S32 _cvi_vdec_FindFrameIdx(vdec_chn_context *pChnHandle, + const VIDEO_FRAME_INFO_S *pstFrameInfo) +{ + CVI_U32 i = 0; + + if ((pChnHandle == NULL) || (pstFrameInfo == NULL)) + return -1; + + for (i = 0; i < pChnHandle->VideoFrameArrayNum; i++) { + VIDEO_FRAME_S *pstCurFrame; + + pstCurFrame = &pChnHandle->VideoFrameArray[i].stVFrame; + + if ((pstCurFrame->u32FrameFlag == 1) && + (pstCurFrame->u64PhyAddr[0] == + pstFrameInfo->stVFrame.u64PhyAddr[0]) && + (pstCurFrame->u64PhyAddr[1] == + pstFrameInfo->stVFrame.u64PhyAddr[1]) && + (pstCurFrame->u64PhyAddr[2] == + pstFrameInfo->stVFrame.u64PhyAddr[2])) { + return i; + } + } + + return -1; +} + +static CVI_S32 CVI_VDEC_Init(void) +{ + CVI_S32 ret = CVI_SUCCESS; + + CVI_VDEC_API("\n"); + + cviGetDebugConfigFromDecProc(); + + return ret; +} + +#define MAX_VDEC_DISPLAYQ_NUM 32 + +CVI_S32 CVI_VDEC_CreateChn(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr) +{ + vdec_chn_context *pChnHandle = NULL; + CVI_S32 s32Ret = CVI_SUCCESS; + + CVI_VDEC_API("VdChn = %d\n", VdChn); + + CVI_VDEC_Init(); + + s32Ret = _CVI_VDEC_InitHandle(); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("_CVI_VDEC_InitHandle failed !\n"); + return s32Ret; + } + + vdec_handle->chn_handle[VdChn] = + MEM_CALLOC(1, sizeof(vdec_chn_context)); + if (vdec_handle->chn_handle[VdChn] == NULL) { + CVI_VDEC_ERR("Allocate chn_handle memory failed !\n"); + return CVI_ERR_VDEC_NOMEM; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + pChnHandle->VdChn = VdChn; + pChnHandle->pVbCtx = &vdec_vb_ctx[VdChn]; + + memcpy(&pChnHandle->ChnAttr, pstAttr, sizeof(VDEC_CHN_ATTR_S)); + + if ((pChnHandle->ChnAttr.enType == PT_H264) || + (pChnHandle->ChnAttr.enType == PT_H265)) { + pChnHandle->VideoFrameArrayNum = MAX_VDEC_DISPLAYQ_NUM; + } else { + pChnHandle->VideoFrameArrayNum = + pChnHandle->ChnAttr.u32FrameBufCnt; + } + + pChnHandle->VideoFrameArray = MEM_CALLOC(pChnHandle->VideoFrameArrayNum, + sizeof(VIDEO_FRAME_INFO_S)); + + if (pChnHandle->VideoFrameArray == NULL) { + CVI_VDEC_ERR("Allocate VideoFrameArray memory failed !\n"); + return CVI_ERR_VDEC_NOMEM; + } + + CVI_VDEC_TRACE("u32FrameBufCnt = %d\n", + pChnHandle->ChnAttr.u32FrameBufCnt); + CVI_VDEC_TRACE("VideoFrameArrayNum = %d\n", + pChnHandle->VideoFrameArrayNum); + + memset(pChnHandle->display_queue, -1, DISPLAY_QUEUE_SIZE); + + MUTEX_INIT(&pChnHandle->display_queue_lock, 0); + MUTEX_INIT(&pChnHandle->status_lock, 0); + MUTEX_INIT(&pChnHandle->chnShmMutex, &ma); + + if (pChnHandle->ChnAttr.enType == PT_JPEG || + pChnHandle->ChnAttr.enType == PT_MJPEG) { + } else if (pChnHandle->ChnAttr.enType == PT_H264 || + pChnHandle->ChnAttr.enType == PT_H265) { + cviInitDecConfig initDecCfg, *pInitDecCfg; + + pInitDecCfg = &initDecCfg; + memset(pInitDecCfg, 0, sizeof(cviInitDecConfig)); + pInitDecCfg->codec = (pChnHandle->ChnAttr.enType == PT_H265) ? + CODEC_H265 : + CODEC_H264; + pInitDecCfg->cviApiMode = API_MODE_SDK; + + pInitDecCfg->vbSrcMode = + vdec_handle->g_stModParam.enVdecVBSource; + pInitDecCfg->chnNum = VdChn; + pInitDecCfg->bsBufferSize = + pChnHandle->ChnAttr.u32StreamBufSize; + + // I-P-P-P, need 3 + 1 = 4 + // I-P-B-P, need 4 + 1 = 5 + // If stream have B slice , need set u32FrameBufCnt >= 5 + if (pChnHandle->ChnAttr.u32FrameBufCnt > 4) + pInitDecCfg->reorderEnable = TRUE; + else + pInitDecCfg->reorderEnable = FALSE; + + s32Ret = cviVDecOpen(pInitDecCfg, &pChnHandle->pHandle); + if (s32Ret < 0) { + CVI_VDEC_ERR("cviVDecOpen, %d\n", s32Ret); + return s32Ret; + } + + if (vdec_handle->g_stModParam.enVdecVBSource != + VB_SOURCE_COMMON) { + cviVDecAttachCallBack(_cvi_vdec_CallbackFunc); + } + } + +#if 0 + { + vdec_dbg *pDbg = &vdecDbg; + pDbg->currMask = 0x0FFFFFFF; + } +#endif + return CVI_SUCCESS; +} + +CVI_S32 CVI_VDEC_DestroyChn(VDEC_CHN VdChn) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + struct cvi_vdec_vb_ctx *pVbCtx = NULL; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + pVbCtx = pChnHandle->pVbCtx; + + + if (pChnHandle->ChnAttr.enType == PT_H264 || + pChnHandle->ChnAttr.enType == PT_H265) { + s32Ret = cviVDecClose(pChnHandle->pHandle); + + if (pChnHandle->bHasVbPool == true) { + CVI_U32 i = 0; + VB_BLK blk; + + for (i = 0; i < pChnHandle->FrmNum; i++) { + blk = vb_physAddr2Handle( + pChnHandle->FrmArray[i].phyAddr); + if (blk != VB_INVALID_HANDLE) { + vb_release_block(blk); + } + } + + if (vdec_handle->g_stModParam.enVdecVBSource == + VB_SOURCE_PRIVATE) { + vb_destroy_pool(pChnHandle->vbPool.hPicVbPool); + CVI_VDEC_TRACE("CVI_VB_DestroyPool: %d\n", + pChnHandle->vbPool.hPicVbPool); + } + } + } + + MUTEX_DESTROY(&pChnHandle->display_queue_lock); + MUTEX_DESTROY(&pChnHandle->status_lock); + MUTEX_DESTROY(&pChnHandle->chnShmMutex); + + if (pChnHandle->VideoFrameArray) { + MEM_FREE(pChnHandle->VideoFrameArray); + pChnHandle->VideoFrameArray = NULL; + } + + if (vdec_handle->chn_handle[VdChn]) { + MEM_FREE(vdec_handle->chn_handle[VdChn]); + vdec_handle->chn_handle[VdChn] = NULL; + } + + { + VDEC_CHN i = 0; + CVI_BOOL bFreeVdecHandle = CVI_TRUE; + + for (i = 0; i < VDEC_MAX_CHN_NUM; i++) { + if (vdec_handle->chn_handle[i] != NULL) { + bFreeVdecHandle = CVI_FALSE; + break; + } + } + if (bFreeVdecHandle) { + MEM_FREE(vdec_handle); + vdec_handle = NULL; + } + } + + return s32Ret; +} + +static CVI_S32 free_vdec_frame(VDEC_CHN_ATTR_S *pstAttr, + VIDEO_FRAME_INFO_S *pstVideoFrame) +{ + VIDEO_FRAME_S *pstVFrame = &pstVideoFrame->stVFrame; + VB_BLK blk; + + if (pstAttr->enType == PT_JPEG || pstAttr->enType == PT_MJPEG) { + blk = vb_physAddr2Handle(pstVFrame->u64PhyAddr[0]); + if (blk != VB_INVALID_HANDLE) { + vb_release_block(blk); + } + } + + return CVI_SUCCESS; +} + +CVI_S32 CVI_VDEC_SetChnParam(VDEC_CHN VdChn, const VDEC_CHN_PARAM_S *pstParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + memcpy(&pChnHandle->ChnParam, pstParam, sizeof(VDEC_CHN_PARAM_S)); + + return s32Ret; +} + +CVI_S32 CVI_VDEC_GetChnParam(VDEC_CHN VdChn, VDEC_CHN_PARAM_S *pstParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + memcpy(pstParam, &pChnHandle->ChnParam, sizeof(VDEC_CHN_PARAM_S)); + + return s32Ret; +} + +CVI_S32 CVI_VDEC_SendStream(VDEC_CHN VdChn, const VDEC_STREAM_S *pstStream, + CVI_S32 s32MilliSec) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + CVI_S32 fb_idx; + VIDEO_FRAME_INFO_S *pstVideoFrame; + CVI_BOOL bNoFbWithDisp = CVI_FALSE; + CVI_BOOL bGetDispFrm = CVI_FALSE; + CVI_BOOL bFlushDecodeQ = CVI_FALSE; + CVI_S32 s32TimeCost; + CVI_S32 s32TimeOutMs = s32MilliSec; + CVI_U64 u64DecHwTime = 0; + struct cvi_vdec_vb_ctx *pVbCtx = NULL; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + pVbCtx = pChnHandle->pVbCtx; + + if ((pstStream->u32Len == 0) && + (pChnHandle->ChnAttr.enType == PT_JPEG || + pChnHandle->ChnAttr.enType == PT_MJPEG)) + return CVI_SUCCESS; + + if ((pstStream->u32Len == 0) && (pstStream->bEndOfStream == CVI_FALSE)) + return CVI_SUCCESS; + + if ((pstStream->bEndOfStream == CVI_TRUE) && + (pChnHandle->ChnAttr.enType != PT_JPEG && + pChnHandle->ChnAttr.enType != PT_MJPEG)) { + bFlushDecodeQ = CVI_TRUE; + } + + pChnHandle->u32SendStreamCnt++; + s32Ret = cviSetVdecFpsToProc(VdChn, CVI_TRUE); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("(chn %d) cviSetVdecFpsToProc fail\n", VdChn); + return s32Ret; + } + + cviGetDebugConfigFromDecProc(); + + while (1) { + CVI_U64 startTime, endTime; + + bNoFbWithDisp = CVI_FALSE; + bGetDispFrm = CVI_FALSE; + + fb_idx = get_avail_fb(VdChn, pChnHandle->VideoFrameArray); + if (fb_idx < 0) { + CVI_VDEC_WARN("cannot get any fb in VideoFrameArray\n"); + return CVI_ERR_VDEC_BUF_FULL; + } + + pstVideoFrame = &pChnHandle->VideoFrameArray[fb_idx]; + CVI_VDEC_INFO( + "VdChn = %d, pts %lld, addr %p, len %d, eof %d, eos %d\n", + VdChn, pstStream->u64PTS, pstStream->pu8Addr, + pstStream->u32Len, pstStream->bEndOfFrame, + pstStream->bEndOfStream); + + pChnHandle->stStatus.u32LeftStreamBytes += pstStream->u32Len; + + startTime = get_current_time(); + + if (pChnHandle->ChnAttr.enType == PT_JPEG || + pChnHandle->ChnAttr.enType == PT_MJPEG) { + s32Ret = cviVdec_Mutex_Lock(&jpdLock, s32TimeOutMs, + &s32TimeCost); + if ((s32Ret == ETIMEDOUT) || (s32Ret == EBUSY)) { + pChnHandle->stStatus.u32LeftStreamBytes -= + pstStream->u32Len; + } + s32Ret = checkTimeOutAndBusy(s32Ret, __LINE__); + if (s32Ret != 0) { + return s32Ret; + } + s32Ret = + cvi_jpeg_decode(VdChn, pstStream, pstVideoFrame, + s32TimeOutMs, &u64DecHwTime); + cviVdec_Mutex_Unlock(&jpdLock); + if (s32Ret != CVI_SUCCESS) { + if (s32Ret == CVI_ERR_VDEC_BUSY) { + pChnHandle->stStatus + .u32LeftStreamBytes -= + pstStream->u32Len; + CVI_VDEC_TRACE( + "jpeg timeout in nonblock mode[%d]\n", + s32TimeOutMs); + return s32Ret; + } + CVI_VDEC_ERR("cvi_jpeg_decode error\n"); + goto ERR_CVI_VDEC_SEND_STREAM; + } + + bGetDispFrm = CVI_TRUE; + } else if ((pChnHandle->ChnAttr.enType == PT_H264) || + (pChnHandle->ChnAttr.enType == PT_H265)) { + cviDispFrameCfg dispFrameCfg, *pdfc = &dispFrameCfg; + + if (pChnHandle->ChnAttr.enType == PT_H264) { + s32Ret = cvi_h264_decode( + pChnHandle->pHandle, + pChnHandle->ChnParam.enPixelFormat, + pstStream, s32TimeOutMs); + } else { + s32Ret = cvi_h265_decode( + pChnHandle->pHandle, + pChnHandle->ChnParam.enPixelFormat, + pstStream, s32TimeOutMs); + } + + if (bFlushDecodeQ == CVI_TRUE) { + if (s32Ret == CVI_VDEC_RET_NO_FB) { + continue; + } else if (s32Ret == CVI_VDEC_RET_LAST_FRM) { + s32Ret = CVI_SUCCESS; + break; + } + } else { + if (s32Ret == CVI_VDEC_RET_DEC_ERR) { + s32Ret = CVI_SUCCESS; + CVI_VDEC_ERR("cvi_h26x_decode error\n"); + pChnHandle->stStatus + .u32LeftStreamBytes -= + pstStream->u32Len; + goto ERR_CVI_VDEC_SEND_STREAM; + } else if (s32Ret == CVI_VDEC_RET_NO_FB) { + s32Ret = CVI_ERR_VDEC_BUF_FULL; + pChnHandle->stStatus + .u32LeftStreamBytes -= + pstStream->u32Len; + goto ERR_CVI_VDEC_SEND_STREAM; + } + } + + if (s32Ret == CVI_VDEC_RET_LOCK_TIMEOUT) { + pChnHandle->stStatus.u32LeftStreamBytes -= + pstStream->u32Len; + CVI_VDEC_TRACE("26x dec timeout[%d] chn[%d]\n", + s32TimeOutMs, VdChn); + s32Ret = CVI_ERR_VDEC_BUSY; + goto ERR_CVI_VDEC_SEND_STREAM; + } + + if (s32Ret == CVI_VDEC_RET_NO_FB_WITH_DISP) { + bNoFbWithDisp = CVI_TRUE; + CVI_VDEC_TRACE( + "chn[%d] no fb for decode but disp frame is available\n", + VdChn); + } + + if (s32Ret == CVI_VDEC_RET_FRM_DONE || + s32Ret == CVI_VDEC_RET_NO_FB_WITH_DISP) { + s32Ret = cviVDecGetFrame(pChnHandle->pHandle, + pdfc); + if (s32Ret >= 0) { + u64DecHwTime = pdfc->decHwTime; + cviSetVideoFrameInfo(pstVideoFrame, + pdfc); + bGetDispFrm = CVI_TRUE; + } + + if (!bGetDispFrm) + bNoFbWithDisp = CVI_FALSE; + + s32Ret = CVI_SUCCESS; + } + } else { + CVI_VDEC_ERR("enType = %d\n", + pChnHandle->ChnAttr.enType); + s32Ret = CVI_ERR_VDEC_NOT_SUPPORT; + goto ERR_CVI_VDEC_SEND_STREAM; + } + + pChnHandle->stStatus.u32LeftStreamBytes -= pstStream->u32Len; + + if (bGetDispFrm == CVI_TRUE) { + s32Ret = cviSetVideoChnAttrToProc(VdChn, pstVideoFrame, + u64DecHwTime); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("cviSetVideoChnAttrToProc fail"); + return s32Ret; + } + + s32Ret = cviVdec_Mutex_Lock( + &pChnHandle->display_queue_lock, + VDEC_TIME_BLOCK_MODE, &s32TimeCost); + s32Ret = checkTimeOutAndBusy(s32Ret, __LINE__); + if (s32Ret != 0) { + return s32Ret; + } + pstVideoFrame->stVFrame.u32FrameFlag = 1; + pstVideoFrame->stVFrame.u64PTS = pstStream->u64PTS; + s32Ret = + insert_display_queue(pChnHandle->w_idx, fb_idx, + pChnHandle->display_queue); + cviVdec_Mutex_Unlock(&pChnHandle->display_queue_lock); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR( + "insert_display_queue fail, w_idx %d, fb_idx %d\n", + pChnHandle->w_idx, fb_idx); + return s32Ret; + } + + pChnHandle->w_idx++; + if (pChnHandle->w_idx == DISPLAY_QUEUE_SIZE) + pChnHandle->w_idx = 0; + s32Ret = cviVdec_Mutex_Lock(&pChnHandle->status_lock, + VDEC_TIME_BLOCK_MODE, + &s32TimeCost); + s32Ret = checkTimeOutAndBusy(s32Ret, __LINE__); + if (s32Ret != 0) { + return s32Ret; + } + pChnHandle->stStatus.u32LeftPics++; + cviVdec_Mutex_Unlock(&pChnHandle->status_lock); + } else { + s32Ret = cviVdec_Mutex_Lock( + &pChnHandle->display_queue_lock, + VDEC_TIME_BLOCK_MODE, &s32TimeCost); + s32Ret = checkTimeOutAndBusy(s32Ret, __LINE__); + if (s32Ret != 0) { + return s32Ret; + } + // Can't get display frame now. + // Release pstVideoFrame which get from get_avail_fb() + pstVideoFrame->stVFrame.u32FrameFlag = 0; + cviVdec_Mutex_Unlock(&pChnHandle->display_queue_lock); + if (bFlushDecodeQ == CVI_TRUE) { + CVI_VDEC_TRACE("---->chn[%d] Decode ENd\n", + VdChn); + CVI_VDEC_TRACE( + "leftstreambytes[%d], u32LeftPics[%d]\n", + pChnHandle->stStatus.u32LeftStreamBytes, + pChnHandle->stStatus.u32LeftPics); + break; + } + } + + endTime = get_current_time(); + + pChnHandle->totalDecTime += (endTime - startTime); + CVI_VDEC_PERF( + "SendStream timestamp = %llu , dec time = %llu ms, total = %llu ms\n", + (unsigned long long)(startTime), + (unsigned long long)(endTime - startTime), + (unsigned long long)(pChnHandle->totalDecTime)); + + if (bNoFbWithDisp) + continue; + + if (bFlushDecodeQ == CVI_FALSE) + break; + + if ((pstStream->bEndOfStream == CVI_TRUE) && + (s32MilliSec > 0)) { + CVI_VDEC_TRACE( + "force flush in EndOfStream in nonblock mode flush dec\n"); + s32TimeOutMs = -1; + } + } + +ERR_CVI_VDEC_SEND_STREAM: + // set_current_state(TASK_INTERRUPTIBLE); + // schedule_timeout(usecs_to_jiffies(1000)); + return s32Ret; +} + +static void cvi_jpeg_set_frame_info(VIDEO_FRAME_S *pVideoFrame, + CVIFRAMEBUF *pCVIFrameBuf) +{ + int c_h_shift = 0; // chroma height shift + + pVideoFrame->u32Width = pCVIFrameBuf->width; + pVideoFrame->u32Height = pCVIFrameBuf->height; + pVideoFrame->u32Stride[0] = pCVIFrameBuf->strideY; + pVideoFrame->u32Stride[1] = pCVIFrameBuf->strideC; + pVideoFrame->u32Stride[2] = pCVIFrameBuf->strideC; + pVideoFrame->s16OffsetTop = 0; + pVideoFrame->s16OffsetBottom = 0; + pVideoFrame->s16OffsetLeft = 0; + pVideoFrame->s16OffsetRight = 0; + + switch (pCVIFrameBuf->format) { + case CVI_FORMAT_400: + pVideoFrame->enPixelFormat = PIXEL_FORMAT_YUV_400; + pVideoFrame->u32Stride[2] = pCVIFrameBuf->strideC; + break; + case CVI_FORMAT_422: + pVideoFrame->enPixelFormat = PIXEL_FORMAT_YUV_PLANAR_422; + pVideoFrame->u32Stride[2] = pCVIFrameBuf->strideC; + break; + case CVI_FORMAT_444: + pVideoFrame->enPixelFormat = PIXEL_FORMAT_YUV_PLANAR_444; + pVideoFrame->u32Stride[2] = pCVIFrameBuf->strideC; + break; + case CVI_FORMAT_420: + default: + c_h_shift = 1; + if (pCVIFrameBuf->chromaInterleave == CVI_CBCR_INTERLEAVE) { + pVideoFrame->enPixelFormat = PIXEL_FORMAT_NV12; + pVideoFrame->u32Stride[2] = 0; + } else if (pCVIFrameBuf->chromaInterleave == + CVI_CRCB_INTERLEAVE) { + pVideoFrame->enPixelFormat = PIXEL_FORMAT_NV21; + pVideoFrame->u32Stride[2] = 0; + } else { // CVI_CBCR_SEPARATED + pVideoFrame->enPixelFormat = + PIXEL_FORMAT_YUV_PLANAR_420; + pVideoFrame->u32Stride[2] = pCVIFrameBuf->strideC; + } + break; + } + + pVideoFrame->u32Length[0] = + ALIGN(pVideoFrame->u32Stride[0] * pVideoFrame->u32Height, + JPEGD_ALIGN_FRM); + pVideoFrame->u32Length[1] = + ALIGN(pVideoFrame->u32Stride[1] * + (pVideoFrame->u32Height >> c_h_shift), + JPEGD_ALIGN_FRM); + pVideoFrame->u32Length[2] = + ALIGN(pVideoFrame->u32Stride[2] * + (pVideoFrame->u32Height >> c_h_shift), + JPEGD_ALIGN_FRM); + + CVI_VDEC_INFO( + "jpeg dec %dx%d, strideY %d, strideC %d, sizeY %d, sizeC %d\n", + pVideoFrame->u32Width, pVideoFrame->u32Height, + pVideoFrame->u32Stride[0], pVideoFrame->u32Stride[1], + pVideoFrame->u32Length[0], pVideoFrame->u32Length[1]); +} + +static CVI_S32 cvi_jpeg_decode(VDEC_CHN VdChn, const VDEC_STREAM_S *pstStream, + VIDEO_FRAME_INFO_S *pstVideoFrame, + CVI_S32 s32MilliSec, CVI_U64 *pu64DecHwTime) +{ + int ret = CVI_SUCCESS; + CVIPackedFormat enPackedFormat = CVI_PACKED_FORMAT_NONE; + CVICbCrInterLeave enChromaInterLeave = CVI_CBCR_SEPARATED; + int iRotAngle = 0; + int iMirDir = 0; + int iROIEnable = 0; + int iROIOffsetX = 0; + int iROIOffsetY = 0; + int iROIWidth = 0; + int iROIHeight = 0; + int iVDownSampling = 0; + int iHDownSampling = 0; + + CVIJpgHandle jpgHandle = { 0 }; + CVIDecConfigParam decConfig; + CVIJpgConfig config; + + unsigned char *srcBuf; + int readLen; + CVIFRAMEBUF cviFrameBuf; + + memset(&decConfig, 0, sizeof(CVIDecConfigParam)); + memset(&config, 0, sizeof(CVIJpgConfig)); + + UNUSED(VdChn); + + /* initial JPU core */ + ret = CVIJpgInit(); + if (ret != 0) { + CVI_VDEC_ERR("\nFailed to CVIJpgInit!!!\n"); + return CVI_ERR_VDEC_ERR_INIT; + } + + /* read source file data */ + srcBuf = pstStream->pu8Addr; + readLen = pstStream->u32Len; + + config.type = CVIJPGCOD_DEC; + + if (pstVideoFrame->stVFrame.enPixelFormat == PIXEL_FORMAT_NV12) + enChromaInterLeave = CVI_CBCR_INTERLEAVE; + else if (pstVideoFrame->stVFrame.enPixelFormat == PIXEL_FORMAT_NV21) + enChromaInterLeave = CVI_CRCB_INTERLEAVE; + + // 2'b00: Normal + // 2'b10: CbCr interleave (e.g. NV12 in 4:2:0 or NV16 in 4:2:2) + // 2'b11: CrCb interleave (e.g. NV21 in 4:2:0) + memset(&(config.u.dec), 0, sizeof(CVIDecConfigParam)); + config.u.dec.dec_buf.packedFormat = enPackedFormat; + config.u.dec.dec_buf.chromaInterleave = enChromaInterLeave; + // ROI param + config.u.dec.roiEnable = iROIEnable; + config.u.dec.roiWidth = iROIWidth; + config.u.dec.roiHeight = iROIHeight; + config.u.dec.roiOffsetX = iROIOffsetX; + config.u.dec.roiOffsetY = iROIOffsetY; + // Frame Partial Mode (DON'T SUPPORT) + config.u.dec.usePartialMode = 0; + // Rotation Angle (0, 90, 180, 270) + config.u.dec.rotAngle = iRotAngle; + // mirror direction (0-no mirror, 1-vertical, 2-horizontal, + // 3-both) + + config.u.dec.mirDir = iMirDir; + config.u.dec.iHorScaleMode = iHDownSampling; + config.u.dec.iVerScaleMode = iVDownSampling; + config.u.dec.iDataLen = readLen; + config.u.dec.dst_type = JPEG_MEM_EXTERNAL; + config.u.dec.dec_buf.vbY.phys_addr = + pstVideoFrame->stVFrame.u64PhyAddr[0]; + config.u.dec.dec_buf.vbCb.phys_addr = + pstVideoFrame->stVFrame.u64PhyAddr[1]; + config.u.dec.dec_buf.vbCr.phys_addr = + pstVideoFrame->stVFrame.u64PhyAddr[2]; + + CVI_VDEC_INFO("iDataLen = %d\n", config.u.dec.iDataLen); + + config.s32ChnNum = VdChn; + /* Open JPU Devices */ + jpgHandle = CVIJpgOpen(config); + if (jpgHandle == NULL) { + CVI_VDEC_ERR("\nFailed to CVIJpgOpen\n"); + ret = CVI_ERR_VDEC_NULL_PTR; + goto FIND_ERROR; + } + + /* send jpeg data for decode or encode operator */ + ret = CVIJpgSendFrameData(jpgHandle, (void *)srcBuf, readLen, + s32MilliSec); + + if (ret != 0) { + if ((ret == VDEC_RET_TIMEOUT) && (s32MilliSec >= 0)) { + CVI_VDEC_TRACE("CVIJpgSendFrameData ret timeout\n"); + return CVI_ERR_VDEC_BUSY; + + } else { + CVI_VDEC_ERR( + "\nFailed to CVIJpgSendFrameData, ret = %d\n", + ret); + ret = CVI_ERR_VDEC_ERR_SEND_FAILED; + goto FIND_ERROR; + } + } + + memset(&cviFrameBuf, 0, sizeof(CVIFRAMEBUF)); + + ret = CVIJpgGetFrameData(jpgHandle, (unsigned char *)&cviFrameBuf, + sizeof(CVIFRAMEBUF), + (unsigned long int *)pu64DecHwTime); + if (ret != 0) { + CVI_VDEC_ERR("\nFailed to CVIJpgGetFrameData, ret = %d\n", ret); + ret = CVI_ERR_VDEC_ERR_GET_FAILED; + } + + cvi_jpeg_set_frame_info(&pstVideoFrame->stVFrame, &cviFrameBuf); + + CVIJpgReleaseFrameData(jpgHandle); +FIND_ERROR: + if (jpgHandle != NULL) { + CVIJpgClose(jpgHandle); + jpgHandle = NULL; + } + + CVIJpgUninit(); + return ret; +} + +static void cvi_h26x_set_output_format(cviDecOnePicCfg *pdopc, + PIXEL_FORMAT_E enPixelFormat) +{ + if (pdopc == NULL) + return; + + switch (enPixelFormat) { + case PIXEL_FORMAT_NV12: + pdopc->cbcrInterleave = 1; + pdopc->nv21 = 0; + break; + case PIXEL_FORMAT_NV21: + pdopc->cbcrInterleave = 1; + pdopc->nv21 = 1; + break; + default: + pdopc->cbcrInterleave = 0; + pdopc->nv21 = 0; + break; + } +} + +static CVI_S32 cvi_h264_decode(void *pHandle, PIXEL_FORMAT_E enPixelFormat, + const VDEC_STREAM_S *pstStream, + CVI_S32 s32MilliSec) +{ + cviDecOnePicCfg dopc, *pdopc = &dopc; + int decStatus = 0; + + pdopc->bsAddr = pstStream->pu8Addr; + pdopc->bsLen = pstStream->u32Len; + pdopc->bEndOfStream = pstStream->bEndOfStream; + cvi_h26x_set_output_format(pdopc, enPixelFormat); + + decStatus = cviVDecDecOnePic(pHandle, pdopc, s32MilliSec); + + return decStatus; +} + +static CVI_S32 cvi_h265_decode(void *pHandle, PIXEL_FORMAT_E enPixelFormat, + const VDEC_STREAM_S *pstStream, + CVI_S32 s32MilliSec) +{ + cviDecOnePicCfg dopc, *pdopc = &dopc; + int decStatus = 0; + + pdopc->bsAddr = pstStream->pu8Addr; + pdopc->bsLen = pstStream->u32Len; + pdopc->bEndOfStream = pstStream->bEndOfStream; + cvi_h26x_set_output_format(pdopc, enPixelFormat); + + decStatus = cviVDecDecOnePic(pHandle, pdopc, s32MilliSec); + + return decStatus; +} + +static void cviSetVideoFrameInfo(VIDEO_FRAME_INFO_S *pstVideoFrame, + cviDispFrameCfg *pdfc) +{ + VIDEO_FRAME_S *pstVFrame = &pstVideoFrame->stVFrame; + + pstVFrame->enPixelFormat = + (pdfc->cbcrInterleave) ? + ((pdfc->nv21) ? PIXEL_FORMAT_NV21 : PIXEL_FORMAT_NV12) : + PIXEL_FORMAT_YUV_PLANAR_420; + + pstVFrame->pu8VirAddr[0] = pdfc->addrY; + pstVFrame->pu8VirAddr[1] = pdfc->addrCb; + pstVFrame->pu8VirAddr[2] = pdfc->addrCr; + + pstVFrame->u64PhyAddr[0] = pdfc->phyAddrY; + pstVFrame->u64PhyAddr[1] = pdfc->phyAddrCb; + pstVFrame->u64PhyAddr[2] = pdfc->phyAddrCr; + + pstVFrame->u32Width = pdfc->width; + pstVFrame->u32Height = pdfc->height; + + pstVFrame->u32Stride[0] = pdfc->strideY; + pstVFrame->u32Stride[1] = pdfc->strideC; + pstVFrame->u32Stride[2] = pdfc->cbcrInterleave ? 0 : pdfc->strideC; + + pstVFrame->u32Length[0] = + pstVFrame->u32Stride[0] * pstVFrame->u32Height; + pstVFrame->u32Length[1] = + pstVFrame->u32Stride[1] * pstVFrame->u32Height / 2; + pstVFrame->u32Length[2] = + pstVFrame->u32Stride[2] * pstVFrame->u32Height / 2; + + pstVFrame->s16OffsetTop = 0; + pstVFrame->s16OffsetBottom = 0; + pstVFrame->s16OffsetLeft = 0; + pstVFrame->s16OffsetRight = 0; + + pstVFrame->pPrivateData = (void *)(uintptr_t)pdfc->indexFrameDisplay; +} + +static CVI_S32 cviSetVideoChnAttrToProc(VDEC_CHN VdChn, + VIDEO_FRAME_INFO_S *psFrameInfo, + CVI_U64 u64DecHwTime) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (psFrameInfo == NULL) { + CVI_VDEC_ERR("psFrameInfo is NULL\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + memcpy(&pChnHandle->stVideoFrameInfo, psFrameInfo, + sizeof(VIDEO_FRAME_INFO_S)); + pChnHandle->stFPS.u64HwTime = u64DecHwTime; + + return s32Ret; +} + +static CVI_VOID cviGetDebugConfigFromDecProc(void) +{ + extern proc_debug_config_t tVdecDebugConfig; + proc_debug_config_t *ptDecProcDebugLevel = &tVdecDebugConfig; + vdec_dbg *pDbg = &vdecDbg; + + CVI_VDEC_TRACE("\n"); + + if (ptDecProcDebugLevel == NULL) { + CVI_VDEC_ERR("ptDecProcDebugLevel is NULL\n"); + return; + } + + memset(pDbg, 0, sizeof(vdec_dbg)); + + pDbg->dbgMask = ptDecProcDebugLevel->u32DbgMask; + if (pDbg->dbgMask == CVI_VDEC_NO_INPUT || + pDbg->dbgMask == CVI_VDEC_INPUT_ERR) + pDbg->dbgMask = CVI_VDEC_MASK_ERR; + else + pDbg->dbgMask |= CVI_VDEC_MASK_ERR; + + pDbg->currMask = pDbg->dbgMask; + pDbg->startFn = ptDecProcDebugLevel->u32StartFrmIdx; + pDbg->endFn = ptDecProcDebugLevel->u32EndFrmIdx; + strcpy(pDbg->dbgDir, ptDecProcDebugLevel->cDumpPath); + + // CVI_FUNC_COND(CVI_VDEC_MASK_DUMP_YUV, cviOpenDumpYuv()); + // CVI_FUNC_COND(CVI_VDEC_MASK_DUMP_BS, cviOpenDumpBs()); + + cviChangeVdecMask(0); +} + +static CVI_S32 cviSetVdecFpsToProc(VDEC_CHN VdChn, CVI_BOOL bSendStream) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + CVI_U64 u64CurTime = get_current_time(); + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + if (bSendStream) { + if ((u64CurTime - pChnHandle->u64LastSendStreamTimeStamp) > + SEC_TO_MS) { + pChnHandle->stFPS.u32InFPS = + (CVI_U32)((pChnHandle->u32SendStreamCnt * + SEC_TO_MS) / + ((CVI_U32)(u64CurTime - + pChnHandle + ->u64LastSendStreamTimeStamp))); + pChnHandle->u64LastSendStreamTimeStamp = u64CurTime; + pChnHandle->u32SendStreamCnt = 0; + } + } else { + if ((u64CurTime - pChnHandle->u64LastGetFrameTimeStamp) > + SEC_TO_MS) { + pChnHandle->stFPS.u32OutFPS = + (CVI_U32)((pChnHandle->u32GetFrameCnt * + SEC_TO_MS) / + ((CVI_U32)(u64CurTime - + pChnHandle + ->u64LastGetFrameTimeStamp))); + pChnHandle->u64LastGetFrameTimeStamp = u64CurTime; + pChnHandle->u32GetFrameCnt = 0; + } + } + + return s32Ret; +} + +CVI_S32 CVI_VDEC_QueryStatus(VDEC_CHN VdChn, VDEC_CHN_STATUS_S *pstStatus) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + memcpy(pstStatus, &pChnHandle->stStatus, sizeof(VDEC_CHN_STATUS_S)); + + return s32Ret; +} + +CVI_S32 CVI_VDEC_ResetChn(VDEC_CHN VdChn) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + VDEC_CHN_ATTR_S *pstChnAttr; + CVI_U32 u32FrameBufCnt; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + pstChnAttr = &pChnHandle->ChnAttr; + + if (pstChnAttr->enType == PT_H264 || pstChnAttr->enType == PT_H265) { + s32Ret = cviVDecReset(pChnHandle->pHandle); + if (s32Ret < 0) { + CVI_VDEC_ERR("cviVDecReset, %d\n", s32Ret); + return CVI_ERR_VDEC_ERR_INVALID_RET; + } + + if (pChnHandle->VideoFrameArray != NULL) { + u32FrameBufCnt = pChnHandle->ChnAttr.u32FrameBufCnt; + memset(pChnHandle->VideoFrameArray, 0, + sizeof(VIDEO_FRAME_INFO_S) * u32FrameBufCnt); + } + } + + return s32Ret; +} + +CVI_S32 CVI_VDEC_StartRecvStream(VDEC_CHN VdChn) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + if (pChnHandle->bStartRecv == CVI_FALSE) { + CVI_U32 i = 0; + + //create VB buffer + for (i = 0; i < pChnHandle->ChnAttr.u32FrameBufCnt; i++) { + s32Ret = allocate_vdec_frame(pChnHandle, i); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("allocate_vdec_frame, %d\n", + s32Ret); + return s32Ret; + } + } + } + + pChnHandle->bStartRecv = CVI_TRUE; + return s32Ret; +} + +CVI_S32 CVI_VDEC_StopRecvStream(VDEC_CHN VdChn) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + if (pChnHandle->bStartRecv == CVI_TRUE) { + if (pChnHandle->ChnAttr.enType == PT_JPEG || + pChnHandle->ChnAttr.enType == PT_MJPEG) { + CVI_U32 i = 0; + + for (i = 0; i < pChnHandle->ChnAttr.u32FrameBufCnt; + i++) { + s32Ret = free_vdec_frame( + &pChnHandle->ChnAttr, + &pChnHandle->VideoFrameArray[i]); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("free_vdec_frame, %ud\n", + s32Ret); + return s32Ret; + } + } + } + } + + pChnHandle->bStartRecv = CVI_FALSE; + return s32Ret; +} + +CVI_S32 CVI_VDEC_GetFrame(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstFrameInfo, + CVI_S32 s32MilliSec) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + CVI_S32 s32TimeCost; + vdec_chn_context *pChnHandle = NULL; + CVI_S32 fb_idx; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + s32Ret = cviVdec_Mutex_Lock(&pChnHandle->display_queue_lock, + s32MilliSec, &s32TimeCost); + s32Ret = checkTimeOutAndBusy(s32Ret, __LINE__); + if (s32Ret != 0) { + return s32Ret; + } + fb_idx = pChnHandle->display_queue[pChnHandle->r_idx]; + cviVdec_Mutex_Unlock(&pChnHandle->display_queue_lock); + if (fb_idx < 0) { + CVI_VDEC_WARN("get display queue fail, r_idx %d, fb_idx %d\n", + pChnHandle->r_idx, fb_idx); + return CVI_ERR_VDEC_ERR_INVALID_RET; + } + + pChnHandle->u32GetFrameCnt++; + s32Ret = cviSetVdecFpsToProc(VdChn, CVI_FALSE); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("(chn %d) cviSetVdecFpsToProc fail\n", VdChn); + return s32Ret; + } + + memcpy(pstFrameInfo, &pChnHandle->VideoFrameArray[fb_idx], + sizeof(VIDEO_FRAME_INFO_S)); + + if (pChnHandle->stStatus.u32LeftPics <= 0) { + CVI_VDEC_ERR("u32LeftPics %d\n", + pChnHandle->stStatus.u32LeftPics); + return CVI_ERR_VDEC_BUF_EMPTY; + } + + s32Ret = cviVdec_Mutex_Lock(&pChnHandle->status_lock, + VDEC_TIME_BLOCK_MODE, &s32TimeCost); + s32Ret = checkTimeOutAndBusy(s32Ret, __LINE__); + if (s32Ret != 0) { + return s32Ret; + } + pChnHandle->stStatus.u32LeftPics--; + pstFrameInfo->stVFrame.u32TimeRef = pChnHandle->seqNum; + pChnHandle->seqNum += 2; + pChnHandle->display_queue[pChnHandle->r_idx] = -1; + pChnHandle->r_idx++; + if (pChnHandle->r_idx == DISPLAY_QUEUE_SIZE) + pChnHandle->r_idx = 0; + cviVdec_Mutex_Unlock(&pChnHandle->status_lock); + + return s32Ret; +} + +CVI_S32 CVI_VDEC_ReleaseFrame(VDEC_CHN VdChn, + const VIDEO_FRAME_INFO_S *pstFrameInfo) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle; + CVI_S32 fb_idx; + VIDEO_FRAME_S *pstVFrame; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + s32Ret = cviVdec_Mutex_Lock(&pChnHandle->display_queue_lock, + VDEC_DEFAULT_MUTEX_MODE, NULL); + s32Ret = checkTimeOutAndBusy(s32Ret, __LINE__); + if (s32Ret != 0) { + return s32Ret; + } + fb_idx = _cvi_vdec_FindFrameIdx(pChnHandle, pstFrameInfo); + if (fb_idx < 0) { + CVI_VDEC_ERR("Can't find video frame in VideoFrameArray!\n"); + cviVdec_Mutex_Unlock(&pChnHandle->display_queue_lock); + return fb_idx; + } + + pstVFrame = &pChnHandle->VideoFrameArray[fb_idx].stVFrame; + if ((pChnHandle->ChnAttr.enType == PT_H264) || + (pChnHandle->ChnAttr.enType == PT_H265)) { + cviVDecReleaseFrame(pChnHandle->pHandle, + pstVFrame->pPrivateData); + } else { + vb_release_block(pChnHandle->vbBLK[fb_idx]); + } + + CVI_VDEC_INFO("release fb_idx %d\n", fb_idx); + pstVFrame->u32FrameFlag = 0; + cviVdec_Mutex_Unlock(&pChnHandle->display_queue_lock); + + return CVI_SUCCESS; +} + +CVI_S32 CVI_VDEC_SetChnAttr(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + memcpy(&pChnHandle->ChnAttr, pstAttr, sizeof(VDEC_CHN_ATTR_S)); + + return s32Ret; +} + +CVI_S32 CVI_VDEC_GetChnAttr(VDEC_CHN VdChn, VDEC_CHN_ATTR_S *pstAttr) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + memcpy(pstAttr, &pChnHandle->ChnAttr, sizeof(VDEC_CHN_ATTR_S)); + + return s32Ret; +} + +CVI_S32 CVI_VDEC_AttachVbPool(VDEC_CHN VdChn, const VDEC_CHN_POOL_S *pstPool) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstPool == NULL) { + return CVI_ERR_VDEC_NULL_PTR; + } + + if (vdec_handle->g_stModParam.enVdecVBSource != VB_SOURCE_USER) { + CVI_VDEC_ERR("Not support enVdecVBSource:%d\n", + vdec_handle->g_stModParam.enVdecVBSource); + return CVI_ERR_VDEC_NOT_SUPPORT; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + + pChnHandle->vbPool = *pstPool; + pChnHandle->bHasVbPool = true; + + return s32Ret; +} + +CVI_S32 CVI_VDEC_DetachVbPool(VDEC_CHN VdChn) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + vdec_chn_context *pChnHandle = NULL; + + CVI_VDEC_API("\n"); + + s32Ret = check_vdec_chn_handle(VdChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (vdec_handle->g_stModParam.enVdecVBSource != VB_SOURCE_USER) { + CVI_VDEC_ERR("Invalid detachVb in ChnId[%d] VBSource:[%d]\n", + VdChn, vdec_handle->g_stModParam.enVdecVBSource); + return CVI_ERR_VDEC_NOT_SUPPORT; + } + + pChnHandle = vdec_handle->chn_handle[VdChn]; + if (pChnHandle->bStartRecv != CVI_FALSE) { + CVI_VDEC_ERR("Cannot detach vdec vb before StopRecvStream\n"); + return CVI_ERR_VDEC_ERR_SEQ_OPER; + } + + if (pChnHandle->bHasVbPool == false) { + CVI_VDEC_ERR("ChnId[%d] Null VB\n", VdChn); + return CVI_SUCCESS; + + } else { + if (pChnHandle->ChnAttr.enType == PT_H264 || + pChnHandle->ChnAttr.enType == PT_H265) { + CVI_VDEC_API("26x detach\n"); + if (pChnHandle->bHasVbPool == true) { + CVI_U32 i = 0; + VB_BLK blk; + + for (i = 0; i < pChnHandle->FrmNum; i++) { + blk = vb_physAddr2Handle( + pChnHandle->FrmArray[i].phyAddr); + + if (blk != VB_INVALID_HANDLE) + vb_release_block(blk); + } + } + } + pChnHandle->bHasVbPool = false; + } + + return CVI_SUCCESS; +} + +CVI_S32 CVI_VDEC_SetModParam(const VDEC_MOD_PARAM_S *pstModParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + if (pstModParam == NULL) { + return CVI_ERR_VDEC_ILLEGAL_PARAM; + } + + s32Ret = _CVI_VDEC_InitHandle(); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("_CVI_VDEC_InitHandle failed !\n"); + return s32Ret; + } + + s32Ret = cviVdec_Mutex_Lock(&g_vdec_handle_mutex, + VDEC_DEFAULT_MUTEX_MODE, NULL); + s32Ret = checkTimeOutAndBusy(s32Ret, __LINE__); + if (s32Ret != 0) { + return s32Ret; + } + memcpy(&vdec_handle->g_stModParam, pstModParam, + sizeof(VDEC_MOD_PARAM_S)); + cviVdec_Mutex_Unlock(&g_vdec_handle_mutex); + + return s32Ret; +} + +CVI_S32 CVI_VDEC_GetModParam(VDEC_MOD_PARAM_S *pstModParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + if (pstModParam == NULL) { + return CVI_ERR_VDEC_ILLEGAL_PARAM; + } + + s32Ret = _CVI_VDEC_InitHandle(); + if (s32Ret != CVI_SUCCESS) { + CVI_VDEC_ERR("_CVI_VDEC_InitHandle failed !\n"); + return s32Ret; + } + + s32Ret = cviVdec_Mutex_Lock(&g_vdec_handle_mutex, + VDEC_DEFAULT_MUTEX_MODE, NULL); + if (s32Ret != 0) { + if ((s32Ret == ETIMEDOUT) || (s32Ret == EBUSY)) { + CVI_VDEC_TRACE("mutex timeout and retry\n"); + return CVI_ERR_VDEC_BUSY; + } + CVI_VDEC_ERR("vdec mutex error[%d]\n", s32Ret); + return CVI_ERR_VDEC_ERR_VDEC_MUTEX; + } + memcpy(pstModParam, &vdec_handle->g_stModParam, + sizeof(VDEC_MOD_PARAM_S)); + cviVdec_Mutex_Unlock(&g_vdec_handle_mutex); + + return s32Ret; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_venc.c b/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_venc.c new file mode 100644 index 0000000000..b6dafd3ece --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/src/cvi_venc.c @@ -0,0 +1,7309 @@ +#include "cvi_venc.h" +#include +#include +#include "venc.h" +#include +#include "venc_debug.h" +#include "module_common.h" +#include +#include +#include +#include +#include +#include +#include +#include "cvi_vc_drv_proc.h" +#include "cvi_vc_drv.h" +#include "rcKernel/cvi_float_point/cvi_float_point.h" +#include "rcKernel/cvi_rc_kernel.h" +#include "cvi_vcom.h" +#include "sys.h" +#include "vpuapi.h" + +#define Q_TABLE_MAX 99 +#define Q_TABLE_CUSTOM 50 +#define Q_TABLE_MIN 0 +#define Q_TABLE_DEFAULT 0 // 0 = backward compatible +#define SRC_FRAMERATE_DEF 30 +#define SRC_FRAMERATE_MAX 240 +#define SRC_FRAMERATE_MIN 1 +#define DEST_FRAMERATE_DEF 30 +#define DEST_FRAMERATE_MAX 60 +#define DEST_FRAMERATE_MIN 1 +#define CVI_VENC_NO_INPUT -10 +#define CVI_VENC_INPUT_ERR -11 +#define DUMP_YUV "dump_src.yuv" +#define DUMP_BS "dump_bs.bin" +#define SEC_TO_MS 1000 +#define USERDATA_MAX_DEFAULT 1024 +#define USERDATA_MAX_LIMIT 65536 +#define DEFAULT_NO_INPUTDATA_TIMEOUT_SEC (5) +#define BYPASS_SB_MODE (0) +#define CLK_ENABLE_REG_2_BASE (0x03002008) +#define VC_FAB_REG_9_BASE (0xb030024) + +// below should align to cv183x_vcodec.h +#define VPU_MISCDEV_NAME "/dev/cvi-vcodec" +#define VCODEC_VENC_SHARE_MEM_SIZE (0x30000) // 192k +#define VCODEC_VDEC_SHARE_MEM_SIZE (0x8000) // 32k +#define VCODEC_SHARE_MEM_SIZE \ + (VCODEC_VENC_SHARE_MEM_SIZE + VCODEC_VDEC_SHARE_MEM_SIZE) + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +#define SET_DEFAULT_RC_PARAM(RC) \ + do { \ + (RC)->u32MaxIprop = CVI_H26X_MAX_I_PROP_DEFAULT; \ + (RC)->u32MinIprop = CVI_H26X_MIN_I_PROP_DEFAULT; \ + (RC)->u32MaxIQp = DEF_264_MAXIQP; \ + (RC)->u32MinIQp = DEF_264_MINIQP; \ + (RC)->u32MaxQp = DEF_264_MAXQP; \ + (RC)->u32MinQp = DEF_264_MINQP; \ + } while (0) + +#define SET_COMMON_RC_PARAM(DEST, SRC) \ + do { \ + (DEST)->u32MaxIprop = (SRC)->u32MaxIprop; \ + (DEST)->u32MinIprop = (SRC)->u32MinIprop; \ + (DEST)->u32MaxIQp = (SRC)->u32MaxIQp; \ + (DEST)->u32MinIQp = (SRC)->u32MinIQp; \ + (DEST)->u32MaxQp = (SRC)->u32MaxQp; \ + (DEST)->u32MinQp = (SRC)->u32MinQp; \ + (DEST)->s32MaxReEncodeTimes = (SRC)->s32MaxReEncodeTimes; \ + } while (0) + +#define IF_WANNA_DISABLE_BIND_MODE() \ + ((pVbCtx->currBindMode == CVI_TRUE) && \ + (pVbCtx->enable_bind_mode == CVI_FALSE)) +#define IF_WANNA_ENABLE_BIND_MODE() \ + ((pVbCtx->currBindMode == CVI_FALSE) && \ + (pVbCtx->enable_bind_mode == CVI_TRUE)) + +venc_dbg vencDbg; +venc_context *handle; + +extern int32_t vb_create_pool(struct cvi_vb_pool_cfg *config); +extern int32_t vb_get_config(struct cvi_vb_cfg *pstVbConfig); +extern VB_BLK vb_get_block_with_id(VB_POOL poolId, uint32_t u32BlkSize, + MOD_ID_E modId); +extern uint64_t vb_handle2PhysAddr(VB_BLK blk); +extern VB_BLK vb_physAddr2Handle(uint64_t u64PhyAddr); +extern int32_t vb_release_block(VB_BLK blk); +extern void wake_sbm_waitinng(void); +extern void cvi_VENC_SBM_IrqDisable(void); +extern void cvi_VENC_SBM_IrqEnable(void); + + +static CVI_S32 cviInitChnCtx(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstAttr); +static CVI_S32 cviCheckRcModeAttr(venc_chn_context *pChnHandle); +static CVI_S32 cviCheckGopAttr(venc_chn_context *pChnHandle); +static CVI_S32 cviInitFrc(venc_chn_context *pChnHandle, + CVI_U32 u32SrcFrameRate, CVI_FR32 fr32DstFrameRate); +static CVI_S32 cviInitFrcSoftFloat(venc_chn_context *pChnHandle, + CVI_U32 u32SrcFrameRate, CVI_FR32 fr32DstFrameRate); +static CVI_S32 cviSetChnDefault(venc_chn_context *pChnHandle); +static CVI_S32 cviSetDefaultRcParam(venc_chn_context *pChnHandle); +static CVI_VOID cviInitVfps(venc_chn_context *pChnHandle); +static CVI_S32 cviSetRcParamToDrv(venc_chn_context *pChnHandle); +static CVI_S32 cviCheckFps(venc_chn_context *pChnHandle, + const VIDEO_FRAME_INFO_S *pstFrame); +static CVI_VOID cviSetFps(venc_chn_context *pChnHandle, CVI_S32 currFps); +static CVI_S32 cviSetChnAttr(venc_chn_context *pChnHandle); +static CVI_S32 cviCheckFrc(venc_chn_context *pChnHandle); +static CVI_S32 cviUpdateFrcSrc(venc_chn_context *pChnHandle); +static CVI_S32 cviUpdateFrcDst(venc_chn_context *pChnHandle); +static CVI_VOID cviCheckFrcOverflow(venc_chn_context *pChnHandle); +static CVI_S32 cviOpenDumpYuv(CVI_VOID); +static CVI_S32 cviDumpYuv(const VIDEO_FRAME_INFO_S *pstFrame); +static CVI_S32 cviOpenDumpBs(CVI_VOID); +static CVI_S32 cviDumpBs(VENC_STREAM_S *pstStream, PAYLOAD_TYPE_E enType); +static CVI_S32 cviCheckLeftStreamFrames(venc_chn_context *pChnHandle); +static CVI_S32 cviProcessResult(venc_chn_context *pChnHandle, + VENC_STREAM_S *pstStream); +static CVI_VOID cviUpdateChnStatus(venc_chn_context *pChnHandle); +static CVI_VOID cviChangeMask(CVI_S32 frameIdx); +static CVI_S32 cviSetVencChnAttrToProc(VENC_CHN VeChn, + const VIDEO_FRAME_INFO_S *pstFrame); +static CVI_S32 cviSetVencPerfAttrToProc(venc_chn_context *pChnHandle); +static CVI_VOID cviGetDebugConfigFromEncProc(void); +static CVI_S32 cviVenc_sem_timedwait_Millsecs(struct semaphore *sem, + long msecs); +static CVI_S32 cviCheckRcParam(venc_chn_context *pChnHandle, + const VENC_RC_PARAM_S *pstRcParam); +static CVI_S32 cviSetCuPredToDrv(venc_chn_context *pChnHandle); + +//static CVI_S32 cviUpdateSbWptr(cviVencSbSetting *pstSbSetting); +//static CVI_S32 cviSbSkipOneFrm(VENC_CHN VeChn, cviVencSbSetting *pstSbSetting); +static CVI_S32 cviResetSb(cviVencSbSetting *pstSbSetting); +static CVI_S32 cviSetSBMEnable(venc_chn_context *pChnHandle, + CVI_BOOL bSBMEn); + +static CVI_S32 _cviVencAllocVbBuf(VENC_CHN VeChn); +static CVI_S32 _cviVencUpdateVbConf(venc_chn_context *pChnHandle, + cviVbVencBufConfig *pVbVencCfg, + int VbSetFrameBufSize, + int VbSetFrameBufCnt); +static CVI_S32 _cviVencInitCtxHandle(void); +static CVI_S32 _cviCheckFrameRate(venc_chn_context *pChnHandle, + CVI_U32 *pu32SrcFrameRate, + CVI_FR32 *pfr32DstFrameRate, + CVI_BOOL bVariFpsEn); +static CVI_S32 _cviVencRegVbBuf(VENC_CHN VeChn); +static CVI_S32 _cviVencSetInPixelFormat(VENC_CHN VeChn, + CVI_BOOL bCbCrInterleave, + CVI_BOOL bNV21); +static CVI_S32 _cviCheckH264VuiParam(const VENC_H264_VUI_S *pstH264Vui); +static CVI_S32 _cviCheckH265VuiParam(const VENC_H265_VUI_S *pstH265Vui); +static CVI_S32 _cviSetH264Vui(venc_chn_context *pChnHandle, + VENC_H264_VUI_S *pstH264Vui); +static CVI_S32 _cviSetH265Vui(venc_chn_context *pChnHandle, + VENC_H265_VUI_S *pstH265Vui); +static CVI_S32 cviWaitEncodeDone(venc_chn_context *pChnHandle); +static int _cviVEncSbGetSkipFrmStatus(cviVencSbSetting *pstSbSetting); + +extern int sbm_wait_interrupt(int timeout); + +static inline CVI_U32 _cviGetNumPacks(PAYLOAD_TYPE_E enType) +{ + return (enType == PT_JPEG || enType == PT_MJPEG) ? 1 : MAX_NUM_PACKS; +} + +static inline CVI_S32 cviCheckCommonRCParamHelper( + CVI_U32 u32MaxIprop, CVI_U32 u32MinIprop, + CVI_U32 u32MaxIQp, CVI_U32 u32MinIQp, + CVI_U32 u32MaxQp, CVI_U32 u32MinQp) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + s32Ret = ((u32MaxIprop >= CVI_H26X_MAX_I_PROP_MIN) && + (u32MaxIprop <= CVI_H26X_MAX_I_PROP_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MaxIprop", u32MaxIprop); + return s32Ret; + } + + s32Ret = ((u32MinIprop >= CVI_H26X_MIN_I_PROP_MIN) && + (u32MinIprop <= CVI_H26X_MAX_I_PROP_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MinIprop", u32MinIprop); + return s32Ret; + } + + s32Ret = (u32MaxIQp <= 51) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MaxIQp", u32MaxIQp); + return s32Ret; + } + + s32Ret = (u32MinIQp <= 51) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MinIQp", u32MinIQp); + return s32Ret; + } + + s32Ret = (u32MaxQp <= 51) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MaxQp", u32MaxQp); + return s32Ret; + } + + s32Ret = (u32MinQp <= 51) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MinQp", u32MinQp); + return s32Ret; + } + + return s32Ret; +} + +static inline CVI_S32 cviCheckCommonRCParam( + const VENC_RC_PARAM_S * pstRcParam, VENC_ATTR_S *pVencAttr, VENC_RC_MODE_E enRcMode) +{ + CVI_S32 s32Ret; + + s32Ret = (pstRcParam->u32RowQpDelta <= CVI_H26X_ROW_QP_DELTA_MAX) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32RowQpDelta", pstRcParam->u32RowQpDelta); + return s32Ret; + } + + if (pVencAttr->enType != PT_H265 || + pstRcParam->s32FirstFrameStartQp != 63) { + s32Ret = ((pstRcParam->s32FirstFrameStartQp >= 0) && + (pstRcParam->s32FirstFrameStartQp <= 51)) ? CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32FirstFrameStartQp", pstRcParam->s32FirstFrameStartQp); + return s32Ret; + } + } + + s32Ret = (pstRcParam->u32ThrdLv <= CVI_H26X_THRDLV_MAX) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32ThrdLv", pstRcParam->u32ThrdLv); + return s32Ret; + } + + s32Ret = ((pstRcParam->s32BgDeltaQp >= CVI_H26X_BG_DELTA_QP_MIN) && + (pstRcParam->s32BgDeltaQp <= CVI_H26X_BG_DELTA_QP_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32BgDeltaQp", pstRcParam->s32BgDeltaQp); + return s32Ret; + } + + switch (enRcMode) { + case VENC_RC_MODE_H264CBR: + { + const VENC_PARAM_H264_CBR_S *pprc = &pstRcParam->stParamH264Cbr; + + s32Ret = cviCheckCommonRCParamHelper(pprc->u32MaxIprop, pprc->u32MinIprop, + pprc->u32MaxIQp, pprc->u32MinIQp, pprc->u32MaxQp, pprc->u32MinQp); + } + break; + case VENC_RC_MODE_H264VBR: + { + const VENC_PARAM_H264_VBR_S *pprc = &pstRcParam->stParamH264Vbr; + + s32Ret = cviCheckCommonRCParamHelper(pprc->u32MaxIprop, pprc->u32MinIprop, + pprc->u32MaxIQp, pprc->u32MinIQp, pprc->u32MaxQp, pprc->u32MinQp); + } + break; + case VENC_RC_MODE_H264AVBR: + { + const VENC_PARAM_H264_AVBR_S *pprc = &pstRcParam->stParamH264AVbr; + + s32Ret = cviCheckCommonRCParamHelper(pprc->u32MaxIprop, pprc->u32MinIprop, + pprc->u32MaxIQp, pprc->u32MinIQp, pprc->u32MaxQp, pprc->u32MinQp); + } + break; + case VENC_RC_MODE_H264UBR: + { + const VENC_PARAM_H264_UBR_S *pprc = &pstRcParam->stParamH264Ubr; + + s32Ret = cviCheckCommonRCParamHelper(pprc->u32MaxIprop, pprc->u32MinIprop, + pprc->u32MaxIQp, pprc->u32MinIQp, pprc->u32MaxQp, pprc->u32MinQp); + } + break; + case VENC_RC_MODE_H265CBR: + { + const VENC_PARAM_H265_CBR_S *pprc = &pstRcParam->stParamH265Cbr; + + s32Ret = cviCheckCommonRCParamHelper(pprc->u32MaxIprop, pprc->u32MinIprop, + pprc->u32MaxIQp, pprc->u32MinIQp, pprc->u32MaxQp, pprc->u32MinQp); + } + break; + case VENC_RC_MODE_H265VBR: + { + const VENC_PARAM_H265_VBR_S *pprc = &pstRcParam->stParamH265Vbr; + + s32Ret = cviCheckCommonRCParamHelper(pprc->u32MaxIprop, pprc->u32MinIprop, + pprc->u32MaxIQp, pprc->u32MinIQp, pprc->u32MaxQp, pprc->u32MinQp); + } + break; + case VENC_RC_MODE_H265AVBR: + { + const VENC_PARAM_H265_AVBR_S *pprc = &pstRcParam->stParamH265AVbr; + + s32Ret = cviCheckCommonRCParamHelper(pprc->u32MaxIprop, pprc->u32MinIprop, + pprc->u32MaxIQp, pprc->u32MinIQp, pprc->u32MaxQp, pprc->u32MinQp); + } + break; + case VENC_RC_MODE_H265UBR: + { + const VENC_PARAM_H265_UBR_S *pprc = &pstRcParam->stParamH265Ubr; + + s32Ret = cviCheckCommonRCParamHelper(pprc->u32MaxIprop, pprc->u32MinIprop, + pprc->u32MaxIQp, pprc->u32MinIQp, pprc->u32MaxQp, pprc->u32MinQp); + } + break; + default: + break; + } + + return s32Ret; +} + +void *venc_get_share_mem(void) +{ + return NULL; +} + +static CVI_U64 get_current_time(CVI_VOID) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + struct timespec64 ts; +#else + struct timespec ts; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + ktime_get_ts64(&ts); +#else + ktime_get_ts(&ts); +#endif + return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; // in ms +} + +static int venc_event_handler(CVI_VOID *data) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)data; + VENC_CHN VencChn; + venc_chn_vars *pChnVars = NULL; + VENC_CHN_STATUS_S stStat; + venc_enc_ctx *pEncCtx; + CVI_S32 ret; + CVI_S32 s32MilliSec = -1; + MMF_CHN_S chn = { .enModId = CVI_ID_VENC, + .s32DevId = 0, + .s32ChnId = 0 }; + VB_BLK blk; + struct vb_s *vb; + VIDEO_FRAME_INFO_S stVFrame; + VIDEO_FRAME_S *pstVFrame = &stVFrame.stVFrame; + int i; + int vi_cnt = 0; +#ifdef DUMP_BIND_YUV + FILE *out_f = fopen("out.265", "wb"); +#endif + CVI_S32 s32SetFrameMilliSec = -1; + CVI_S32 s32Ret = CVI_SUCCESS; + struct cvi_venc_vb_ctx *pVbCtx; + + memset(&stVFrame, 0, sizeof(VIDEO_FRAME_INFO_S)); + + pChnVars = pChnHandle->pChnVars; + pEncCtx = &pChnHandle->encCtx; + pVbCtx = pChnHandle->pVbCtx; + VencChn = pChnHandle->VeChn; + + chn.s32ChnId = VencChn; + + memset(&stVFrame, 0, sizeof(VIDEO_FRAME_INFO_S)); + + if (SEMA_WAIT(&pChnVars->sem_send) != 0) { + CVI_VENC_ERR("can not down sem_send\n"); + return CVI_FAILURE; + } + pstVFrame->u32Width = pChnHandle->pChnAttr->stVencAttr.u32PicWidth; + pstVFrame->u32Height = pChnHandle->pChnAttr->stVencAttr.u32PicHeight; + VENC_SET_HANDLER_STATE(1); + CVI_VENC_FLOW("[%d] VENC_CHN_STATE_START_ENC\n", VencChn); + + while (!kthread_should_stop() && pChnHandle->bChnEnable) { + CVI_VENC_BIND("[%d]\n", VencChn); + VENC_SET_HANDLER_STATE(2); + if (IF_WANNA_DISABLE_BIND_MODE() || + (pChnVars->s32RecvPicNum > 0 && + vi_cnt >= pChnVars->s32RecvPicNum)) { + pChnHandle->bChnEnable = CVI_FALSE; + CVI_VENC_SYNC("end\n"); + break; + } + + VENC_STATUS_RUN_ADDSELF(0); + VENC_SET_HANDLER_STATE(3); + CVI_VENC_DEBUG("venc_handle chn:%d wait.\n", VencChn); + + while (((ret = SEMA_TIMEWAIT(&pVbCtx->vb_jobs.sem, + usecs_to_jiffies(1000 * 1000))) != 0)) { + if (pChnHandle->bChnEnable == CVI_FALSE) { + break; + } + continue; + } + if (pChnHandle->bChnEnable == CVI_FALSE) { + CVI_VENC_SYNC("end\n"); + break; + } + + if (ret == -1) + continue; + + if (pVbCtx->pause) { + CVI_VENC_TRACE("pause and skip update.\n"); + continue; + } + VENC_STATUS_RUN_ADDSELF(1); + VENC_SET_HANDLER_STATE(4); +// get venc input buf. + blk = base_mod_jobs_waitq_pop(chn, CHN_TYPE_IN); + if (blk == VB_INVALID_HANDLE) { + CVI_VENC_TRACE("No more vb for dequeue.\n"); + continue; + } + + vb = (struct vb_s *)blk; + + vb->mod_ids &= ~BIT(CVI_ID_VENC); +#ifdef DUMP_BIND_YUV + for (i = 0; i < 3; i++) + CVI_VENC_TRACE( + "[%d]phy: 0x%llx, len: 0x%x, stride: 0x%x\n", + vi_cnt, vb->buf.phy_addr[i], vb->buf.length[i], + vb->buf.stride[i]); + + if (vi_cnt > 50) { + for (i = 0; i < 3; i++) { + CVI_VOID *vir_addr = CVI_SYS_Mmap( + vb->buf.phy_addr[i], vb->buf.length[i]); + CVI_SYS_IonInvalidateCache(vb->buf.phy_addr[i], + vir_addr, + vb->buf.length[i]); + fwrite(vir_addr, vb->buf.length[i], 1, out_f); + CVI_SYS_Munmap(vir_addr, vb->buf.length[i]); + } + } +#endif + + for (i = 0; i < 3; i++) { + pstVFrame->u64PhyAddr[i] = vb->buf.phy_addr[i]; + pstVFrame->u32Stride[i] = vb->buf.stride[i]; + CVI_VENC_TRACE("phy: 0x%llx, stride: 0x%x\n", + pstVFrame->u64PhyAddr[i], + pstVFrame->u32Stride[i]); + } + pstVFrame->u64PTS = vb->buf.u64PTS; + pstVFrame->enPixelFormat = vb->buf.enPixelFormat; + pstVFrame->pPrivateData = vb; + + CVI_VENC_DEBUG("venc_handle chn:%d send.\n", VencChn); + VENC_SET_HANDLER_STATE(5); + CVI_VENC_BIND("[%d]\n", VencChn); + s32Ret = CVI_VENC_SendFrame(VencChn, &stVFrame, + s32SetFrameMilliSec); + if (s32Ret == CVI_ERR_VENC_INIT || + s32Ret == CVI_ERR_VENC_FRC_NO_ENC || + s32Ret == CVI_ERR_VENC_BUSY) { + CVI_VENC_FRC("no encode,continue\n"); + vb_done_handler(chn, CHN_TYPE_IN, blk); + continue; + } else if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "CVI_VENC_SendFrame, VencChn = %d, s32Ret = %d\n", + VencChn, s32Ret); + VENC_SET_HANDLER_STATE(6); + goto VENC_EVENT_HANDLER_ERR; + } + + VENC_SET_HANDLER_STATE(7); + VENC_STATUS_RUN_ADDSELF(2); + s32Ret = CVI_VENC_QueryStatus(VencChn, &stStat); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "CVI_VENC_QueryStatus, VencChn = %d, s32Ret = %d\n", + VencChn, s32Ret); + VENC_SET_HANDLER_STATE(8); + goto VENC_EVENT_HANDLER_ERR; + } + + if (!stStat.u32CurPacks) { + CVI_VENC_ERR("u32CurPacks = 0\n"); + s32Ret = CVI_ERR_VENC_EMPTY_PACK; + VENC_SET_HANDLER_STATE(9); + goto VENC_EVENT_HANDLER_ERR; + } + VENC_SET_HANDLER_STATE(10); + pChnVars->stStream.pstPack = (VENC_PACK_S *)MEM_MALLOC( + sizeof(VENC_PACK_S) * stStat.u32CurPacks); + if (pChnVars->stStream.pstPack == NULL) { + CVI_VENC_ERR("malloc memory failed!\n"); + s32Ret = CVI_ERR_VENC_NOMEM; + VENC_SET_HANDLER_STATE(11); + goto VENC_EVENT_HANDLER_ERR; + } + + pChnVars->stStream.u32PackCount = stStat.u32CurPacks; + VENC_SET_HANDLER_STATE(12); + + s32Ret = pEncCtx->base.getStream(pEncCtx, &pChnVars->stStream, + s32MilliSec); + pChnVars->s32BindModeGetStreamRet = s32Ret; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("getStream, VencChn = %d, s32Ret = %d\n", + VencChn, s32Ret); + SEMA_POST(&pChnVars->sem_send); + VENC_SET_HANDLER_STATE(13); + goto VENC_EVENT_HANDLER_ERR; + } + + vb_done_handler(chn, CHN_TYPE_IN, blk); + VENC_SET_HANDLER_STATE(14); + + s32Ret = cviProcessResult(pChnHandle, &pChnVars->stStream); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("(chn %d) cviProcessResult fail\n", + VencChn); + SEMA_POST(&pChnVars->sem_send); + VENC_SET_HANDLER_STATE(15); + goto VENC_EVENT_HANDLER_ERR_2; + } + + VENC_SET_HANDLER_STATE(16); + SEMA_POST(&pChnVars->sem_send); + + CVI_VENC_TRACE("[%d]wait release\n", vi_cnt); + if (SEMA_WAIT(&pChnVars->sem_release) != 0) { + CVI_VENC_ERR("can not down sem_release\n"); + VENC_SET_HANDLER_STATE(19); + goto VENC_EVENT_HANDLER_ERR_2; + } + + VENC_SET_HANDLER_STATE(17); + s32Ret = pEncCtx->base.releaseStream(pEncCtx, + &pChnVars->stStream); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("[Vench %d]releaseStream ,s32Ret = %d\n", + VencChn, s32Ret); + VENC_SET_HANDLER_STATE(18); + goto VENC_EVENT_HANDLER_ERR_2; + } + + MEM_FREE(pChnVars->stStream.pstPack); + pChnVars->stStream.pstPack = NULL; + vi_cnt++; + + cond_resched(); + } + VENC_SET_HANDLER_STATE(100); + VENC_SET_HANDLER_EXIT_RETCODE(0); + CVI_VENC_SYNC("end\n"); +#ifdef DUMP_BIND_YUV + fclose(out_f); +#endif + return CVI_SUCCESS; + +VENC_EVENT_HANDLER_ERR: + vb_done_handler(chn, CHN_TYPE_IN, blk); + +VENC_EVENT_HANDLER_ERR_2: + //if (pChnVars->stStream.pstPack) { + // MEM_FREE(pChnVars->stStream.pstPack); + // pChnVars->stStream.pstPack = NULL; + //} + + CVI_VENC_SYNC("end\n"); + + VENC_SET_HANDLER_EXIT_RETCODE(s32Ret); + +#ifdef DUMP_BIND_YUV + fclose(out_f); +#endif + return CVI_SUCCESS; +} + + +static int h26x_event_handler(CVI_VOID *data) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)data; + VENC_CHN VencChn; + venc_chn_vars *pChnVars = NULL; + //VENC_CHN_STATUS_S stStat; + venc_enc_ctx *pEncCtx; + CVI_S32 ret; + //CVI_S32 s32MilliSec = -1; + MMF_CHN_S chn = { .enModId = CVI_ID_VENC, + .s32DevId = 0, + .s32ChnId = 0 }; + VB_BLK blk; + struct vb_s *vb; + VIDEO_FRAME_INFO_S stVFrame; + VIDEO_FRAME_S *pstVFrame = &stVFrame.stVFrame; + int i; + int vi_cnt = 0; +#ifdef DUMP_BIND_YUV + FILE *out_f = fopen("out.265", "wb"); +#endif + CVI_S32 s32SetFrameMilliSec = -1; + CVI_S32 s32Ret = CVI_SUCCESS; + struct cvi_venc_vb_ctx *pVbCtx; + + memset(&stVFrame, 0, sizeof(VIDEO_FRAME_INFO_S)); + + pChnVars = pChnHandle->pChnVars; + pEncCtx = &pChnHandle->encCtx; + pVbCtx = pChnHandle->pVbCtx; + VencChn = pChnHandle->VeChn; + + chn.s32ChnId = VencChn; + + memset(&stVFrame, 0, sizeof(VIDEO_FRAME_INFO_S)); + + if (SEMA_WAIT(&pChnVars->sem_send) != 0) { + CVI_VENC_ERR("can not down sem_send\n"); + return CVI_FAILURE; + } + pstVFrame->u32Width = pChnHandle->pChnAttr->stVencAttr.u32PicWidth; + pstVFrame->u32Height = pChnHandle->pChnAttr->stVencAttr.u32PicHeight; + VENC_SET_HANDLER_STATE(1); + CVI_VENC_FLOW("[%d] VENC_CHN_STATE_START_ENC\n", VencChn); + + while (!kthread_should_stop() && pChnHandle->bChnEnable) { + CVI_VENC_BIND("[%d]\n", VencChn); + VENC_SET_HANDLER_STATE(2); + if (IF_WANNA_DISABLE_BIND_MODE() || + (pChnVars->s32RecvPicNum > 0 && + vi_cnt >= pChnVars->s32RecvPicNum)) { + pChnHandle->bChnEnable = CVI_FALSE; + CVI_VENC_SYNC("end\n"); + break; + } + + VENC_STATUS_RUN_ADDSELF(0); + VENC_SET_HANDLER_STATE(3); + CVI_VENC_DEBUG("h26x_handle chn:%d wait.\n", VencChn); + + while (((ret = SEMA_TIMEWAIT(&pVbCtx->vb_jobs.sem, usecs_to_jiffies(1000 * 1000))) != 0)) { + if (pChnHandle->bChnEnable == CVI_FALSE) + break; + + continue; + } + if (pChnHandle->bChnEnable == CVI_FALSE) { + CVI_VENC_SYNC("end\n"); + break; + } + + if (ret == -1) + continue; + + if (pVbCtx->pause) { + CVI_VENC_TRACE("pause and skip update.\n"); + continue; + } + VENC_STATUS_RUN_ADDSELF(1); + VENC_SET_HANDLER_STATE(4); +// get venc input buf. + blk = base_mod_jobs_waitq_pop(chn, CHN_TYPE_IN); + if (blk == VB_INVALID_HANDLE) { + CVI_VENC_TRACE("No more vb for dequeue.\n"); + continue; + } + vb = (struct vb_s *)blk; + + vb->mod_ids &= ~BIT(CVI_ID_VENC); +#ifdef DUMP_BIND_YUV + for (i = 0; i < 3; i++) + CVI_VENC_TRACE( + "[%d]phy: 0x%llx, len: 0x%x, stride: 0x%x\n", + vi_cnt, vb->buf.phy_addr[i], vb->buf.length[i], + vb->buf.stride[i]); + + if (vi_cnt > 50) { + for (i = 0; i < 3; i++) { + CVI_VOID *vir_addr = CVI_SYS_Mmap( + vb->buf.phy_addr[i], vb->buf.length[i]); + CVI_SYS_IonInvalidateCache(vb->buf.phy_addr[i], + vir_addr, + vb->buf.length[i]); + fwrite(vir_addr, vb->buf.length[i], 1, out_f); + CVI_SYS_Munmap(vir_addr, vb->buf.length[i]); + } + } +#endif + + for (i = 0; i < 3; i++) { + pstVFrame->u64PhyAddr[i] = vb->buf.phy_addr[i]; + pstVFrame->u32Stride[i] = vb->buf.stride[i]; + CVI_VENC_TRACE("phy: 0x%llx, stride: 0x%x\n", + pstVFrame->u64PhyAddr[i], + pstVFrame->u32Stride[i]); + } + pstVFrame->u64PTS = vb->buf.u64PTS; + pstVFrame->enPixelFormat = vb->buf.enPixelFormat; + pstVFrame->pPrivateData = vb; + CVI_VENC_DEBUG("h26x_handle chn:%d send.\n", VencChn); + VENC_SET_HANDLER_STATE(5); + CVI_VENC_BIND("[%d]\n", VencChn); + s32Ret = CVI_VENC_SendFrame(VencChn, &stVFrame, + s32SetFrameMilliSec); + if (s32Ret == CVI_ERR_VENC_INIT || + s32Ret == CVI_ERR_VENC_FRC_NO_ENC || + s32Ret == CVI_ERR_VENC_BUSY) { + CVI_VENC_FRC("no encode,continue\n"); + vb_done_handler(chn, CHN_TYPE_IN, blk); + continue; + } else if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "CVI_VENC_SendFrame, VencChn = %d, s32Ret = %d\n", + VencChn, s32Ret); + VENC_SET_HANDLER_STATE(6); + goto VENC_EVENT_HANDLER_ERR; + } + + cviWaitEncodeDone(pChnHandle); + vb_done_handler(chn, CHN_TYPE_IN, blk); + + vi_cnt++; + + cond_resched(); + } + VENC_SET_HANDLER_STATE(100); + VENC_SET_HANDLER_EXIT_RETCODE(0); + CVI_VENC_SYNC("end\n"); +#ifdef DUMP_BIND_YUV + fclose(out_f); +#endif + return CVI_SUCCESS; + +VENC_EVENT_HANDLER_ERR: + vb_done_handler(chn, CHN_TYPE_IN, blk); + + + CVI_VENC_SYNC("end\n"); + + VENC_SET_HANDLER_EXIT_RETCODE(s32Ret); + +#ifdef DUMP_BIND_YUV + fclose(out_f); +#endif + return CVI_SUCCESS; +} + +CVI_S32 check_chn_handle(VENC_CHN VeChn) +{ + if (handle == NULL) { + CVI_VENC_ERR("Call VENC Destroy before Create, failed\n"); + return CVI_ERR_VENC_UNEXIST; + } + + if (handle->chn_handle[VeChn] == NULL) { + CVI_VENC_ERR("VENC Chn #%d haven't created !\n", VeChn); + return CVI_ERR_VENC_INVALID_CHNID; + } + + return CVI_SUCCESS; +} + +static int venc_sbm_send_frame_thread(CVI_VOID *data) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_sbm_context *pSbmHandle = NULL; + + cvi_VENC_SBM_IrqEnable(); + + UNUSED(data); + while (!kthread_should_stop()) { + if (sbm_wait_interrupt(2000) == -1) { + CVI_VENC_ERR("wait sbm irq timeout\n"); + continue; + } + + if (kthread_should_stop() || handle == NULL) + break; + + pSbmHandle = &handle->sbm_context; + + s32Ret = check_chn_handle(pSbmHandle->CurrSbmChn); + if (s32Ret == CVI_ERR_VENC_UNEXIST) { + CVI_VENC_ERR("VENC closed\n"); + break; + } + else if (s32Ret == CVI_ERR_VENC_INVALID_CHNID) { + CVI_VENC_ERR("VENC chn(%d) closed\n", pSbmHandle->CurrSbmChn); + continue; + } + + pChnHandle = handle->chn_handle[pSbmHandle->CurrSbmChn]; + if (pChnHandle->sbm_state == VENC_SBM_STATE_IDLE) + pChnHandle->sbm_state = VENC_SBM_STATE_FRM_RUN; + + CVI_VENC_DEBUG("send start chn:%d,0x94=0x%x 0x90=0x%x\n", pSbmHandle->CurrSbmChn, + cvi_vc_drv_read_vc_reg(REG_SBM, 0x94), cvi_vc_drv_read_vc_reg(REG_SBM, 0x90)); + + MUTEX_LOCK(&pSbmHandle->SbmMutex); + s32Ret = CVI_VENC_SendFrame(pChnHandle->VeChn, &pChnHandle->stVideoFrameInfo, -1); + MUTEX_UNLOCK(&pSbmHandle->SbmMutex); + + CVI_VENC_DEBUG("send end s32Ret=%d,0x94=0x%x 0x90=0x%x\n", s32Ret, + cvi_vc_drv_read_vc_reg(REG_SBM, 0x94), cvi_vc_drv_read_vc_reg(REG_SBM, 0x90)); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_VENC_SendFrame(%d) fail, s32Ret=%d\n", pChnHandle->VeChn, s32Ret); + break; + } + } + + return s32Ret; +} + +static void _cviVencInitModParam(CVI_VENC_PARAM_MOD_S *pModParam) +{ + if (!pModParam) + return; + + memset(pModParam, 0, sizeof(*pModParam)); + pModParam->stJpegeModParam.JpegMarkerOrder[0] = JPEGE_MARKER_SOI; + pModParam->stJpegeModParam.JpegMarkerOrder[1] = + JPEGE_MARKER_FRAME_INDEX; + pModParam->stJpegeModParam.JpegMarkerOrder[2] = JPEGE_MARKER_USER_DATA; + pModParam->stJpegeModParam.JpegMarkerOrder[3] = JPEGE_MARKER_DRI_OPT; + pModParam->stJpegeModParam.JpegMarkerOrder[4] = JPEGE_MARKER_DQT; + pModParam->stJpegeModParam.JpegMarkerOrder[5] = JPEGE_MARKER_DHT; + pModParam->stJpegeModParam.JpegMarkerOrder[6] = JPEGE_MARKER_SOF0; + pModParam->stJpegeModParam.JpegMarkerOrder[7] = JPEGE_MARKER_BUTT; + pModParam->stH264eModParam.u32UserDataMaxLen = USERDATA_MAX_DEFAULT; + pModParam->stH265eModParam.u32UserDataMaxLen = USERDATA_MAX_DEFAULT; +} + +static CVI_S32 _cviVencInitCtxHandle(void) +{ + venc_context *pVencHandle; + + if (handle == NULL) { + handle = MEM_CALLOC(1, sizeof(venc_context)); + if (handle == NULL) { + CVI_VENC_ERR("venc_context create failure\n"); + return CVI_ERR_VENC_NOMEM; + } + + pVencHandle = (venc_context *)handle; + _cviVencInitModParam(&pVencHandle->ModParam); + } + + return CVI_SUCCESS; +} + +static CVI_S32 _cviCheckFrameRate(venc_chn_context *pChnHandle, + CVI_U32 *pu32SrcFrameRate, + CVI_FR32 *pfr32DstFrameRate, + CVI_BOOL bVariFpsEn) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + int frameRateDiv, frameRateRes; + // TODO: use soft-floating to replace it + int fSrcFrmrate, fDstFrmrate; + + CVI_VENC_CFG("dst-fps = %d\n", *pfr32DstFrameRate); + CVI_VENC_CFG("src-fps = %d\n", *pu32SrcFrameRate); + CVI_VENC_CFG("bVariFpsEn = %d\n", bVariFpsEn); + s32Ret = (bVariFpsEn <= CVI_VARI_FPS_EN_MAX) ? + CVI_SUCCESS : CVI_ERR_VENC_ILLEGAL_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "bVariFpsEn", bVariFpsEn); + return s32Ret; + } + + if (*pfr32DstFrameRate == 0) { + CVI_VENC_WARN("set fr32DstFrameRate to %d\n", + DEST_FRAMERATE_DEF); + *pfr32DstFrameRate = DEST_FRAMERATE_DEF; + } + + if (*pu32SrcFrameRate == 0) { + CVI_VENC_WARN("set u32SrcFrameRate to %d\n", + *pfr32DstFrameRate); + *pu32SrcFrameRate = *pfr32DstFrameRate; + } + + frameRateDiv = (*pfr32DstFrameRate >> 16); + frameRateRes = *pfr32DstFrameRate & 0xFFFF; + + if (frameRateDiv == 0) + fDstFrmrate = frameRateRes; + else + fDstFrmrate = frameRateRes / frameRateDiv; + + frameRateDiv = (*pu32SrcFrameRate >> 16); + frameRateRes = *pu32SrcFrameRate & 0xFFFF; + + if (frameRateDiv == 0) + fSrcFrmrate = frameRateRes; + else + fSrcFrmrate = frameRateRes / frameRateDiv; + + if (fDstFrmrate > DEST_FRAMERATE_MAX || + fDstFrmrate < DEST_FRAMERATE_MIN) { + CVI_VENC_ERR("fr32DstFrameRate = 0x%X, not support\n", + *pfr32DstFrameRate); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + if (fSrcFrmrate > SRC_FRAMERATE_MAX || + fSrcFrmrate < SRC_FRAMERATE_MIN) { + CVI_VENC_ERR("u32SrcFrameRate = %d, not support\n", + *pu32SrcFrameRate); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + if (fDstFrmrate > fSrcFrmrate) { + *pfr32DstFrameRate = *pu32SrcFrameRate; + CVI_VENC_WARN("fDstFrmrate > fSrcFrmrate\n"); + CVI_VENC_WARN("=> fr32DstFrameRate = u32SrcFrameRate\n"); + } + + s32Ret = cviInitFrc(pChnHandle, *pu32SrcFrameRate, *pfr32DstFrameRate); + + return s32Ret; +} + +static CVI_S32 _cviVencRegVbBuf(VENC_CHN VeChn) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + venc_context *pVencHandle = handle; + venc_enc_ctx *pEncCtx = NULL; + + venc_chn_context *pChnHandle = NULL; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + if (pVencHandle == NULL) { + CVI_VENC_ERR( + "p_venctx_handle NULL (Channel not create yet..)\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + + if (pEncCtx->base.ioctl) { + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_REG_VB_BUFFER, + NULL); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_REG_VB_BUFFER, %d\n", s32Ret); + return s32Ret; + } + } + + return s32Ret; +} + +static CVI_S32 _cviVencSetInPixelFormat(VENC_CHN VeChn, + CVI_BOOL bCbCrInterleave, + CVI_BOOL bNV21) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = NULL; + venc_chn_context *pChnHandle = NULL; + cviInPixelFormat inPixelFormat; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + + inPixelFormat.bCbCrInterleave = bCbCrInterleave; + inPixelFormat.bNV21 = bNV21; + + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_IN_PIXEL_FORMAT, + (CVI_VOID *)&inPixelFormat); + + return s32Ret; +} + +/** + * @brief Create One VENC Channel. + * @param[in] VeChn VENC Channel Number. + * @param[in] pstAttr pointer to VENC_CHN_ATTR_S. + * @retval 0 Success + * @retval Non-0 Failure, please see the error code table + */ +CVI_S32 CVI_VENC_CreateChn(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstAttr) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_createchn(VeChn, pstAttr); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_enc_ctx *pEncCtx = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + +#ifdef CLI_DEBUG_SUPPORT + TcliInit(); + venc_register_cmd(); +#endif + + s32Ret = cviInitChnCtx(VeChn, pstAttr); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("init\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + + s32Ret = pEncCtx->base.open(handle, pChnHandle); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("venc_init_encoder\n"); + return s32Ret; + } + + pChnHandle->bSbSkipFrm = false; + pChnHandle->sbm_state = VENC_SBM_STATE_IDLE; + handle->chn_status[VeChn] = VENC_CHN_STATE_INIT; + + CVI_VENC_TRACE("\n"); + return s32Ret; +} + +static CVI_S32 cviInitChnCtx(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstAttr) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle; + venc_sbm_context *pSbmhandle; + venc_enc_ctx *pEncCtx; + + s32Ret = _cviVencInitCtxHandle(); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("venc_context\n"); + s32Ret = CVI_ERR_VENC_NOMEM; + goto ERR_CVI_INIT_CHN_CTX; + } + + cviGetDebugConfigFromEncProc(); + + handle->chn_handle[VeChn] = MEM_CALLOC(1, sizeof(venc_chn_context)); + if (handle->chn_handle[VeChn] == NULL) { + CVI_VENC_ERR("Allocate chn_handle memory failed !\n"); + s32Ret = CVI_ERR_VENC_NOMEM; + goto ERR_CVI_INIT_CHN_CTX; + } + + pChnHandle = handle->chn_handle[VeChn]; + pSbmhandle = &handle->sbm_context; + pChnHandle->VeChn = VeChn; + + MUTEX_INIT(&pChnHandle->chnMutex, 0); + MUTEX_INIT(&pSbmhandle->SbmMutex, 0); + MUTEX_INIT(&pChnHandle->chnShmMutex, &ma); + + pChnHandle->pChnAttr = MEM_MALLOC(sizeof(VENC_CHN_ATTR_S)); + if (pChnHandle->pChnAttr == NULL) { + CVI_VENC_ERR("Allocate pChnAttr memory failed !\n"); + s32Ret = CVI_ERR_VENC_NOMEM; + goto ERR_CVI_INIT_CHN_CTX_1; + } + + memcpy(pChnHandle->pChnAttr, pstAttr, sizeof(VENC_CHN_ATTR_S)); + + pChnHandle->pChnVars = MEM_CALLOC(1, sizeof(venc_chn_vars)); + if (pChnHandle->pChnVars == NULL) { + CVI_VENC_ERR("Allocate pChnVars memory failed !\n"); + s32Ret = CVI_ERR_VENC_NOMEM; + goto ERR_CVI_INIT_CHN_CTX_2; + } + pChnHandle->pChnVars->chnState = VENC_CHN_STATE_INIT; + + pChnHandle->pVbCtx = &venc_vb_ctx[VeChn]; + + pEncCtx = &pChnHandle->encCtx; + if (venc_create_enc_ctx(pEncCtx, pChnHandle) < 0) { + CVI_VENC_ERR("venc_create_enc_ctx\n"); + s32Ret = CVI_ERR_VENC_NOMEM; + goto ERR_CVI_INIT_CHN_CTX_3; + } + + s32Ret = pEncCtx->base.init(); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("base init,s32Ret %#x\n", s32Ret); + goto ERR_CVI_INIT_CHN_CTX_3; + } + + s32Ret = cviCheckRcModeAttr(pChnHandle); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("cviCheckRcModeAttr\n"); + goto ERR_CVI_INIT_CHN_CTX_3; + } + + s32Ret = cviCheckGopAttr(pChnHandle); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("cviCheckGopAttr\n"); + goto ERR_CVI_INIT_CHN_CTX_3; + } + + s32Ret = cviSetChnDefault(pChnHandle); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("cviSetChnDefault,s32Ret %#x\n", s32Ret); + goto ERR_CVI_INIT_CHN_CTX_3; + } + + return s32Ret; + +ERR_CVI_INIT_CHN_CTX_3: + if (pChnHandle->pChnVars) { + MEM_FREE(pChnHandle->pChnVars); + pChnHandle->pChnVars = NULL; + } +ERR_CVI_INIT_CHN_CTX_2: + if (pChnHandle->pChnAttr) { + MEM_FREE(pChnHandle->pChnAttr); + pChnHandle->pChnAttr = NULL; + } +ERR_CVI_INIT_CHN_CTX_1: + if (handle->chn_handle[VeChn]) { + MEM_FREE(handle->chn_handle[VeChn]); + handle->chn_handle[VeChn] = NULL; + } +ERR_CVI_INIT_CHN_CTX: + + return s32Ret; +} + +static CVI_S32 cviCheckRcModeAttr(venc_chn_context *pChnHandle) +{ + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + CVI_S32 s32Ret = CVI_SUCCESS; + + if (pChnAttr->stVencAttr.enType == PT_MJPEG) { + if (pChnAttr->stRcAttr.enRcMode == VENC_RC_MODE_MJPEGCBR) { + VENC_MJPEG_CBR_S *pstMjpegeCbr = + &pChnAttr->stRcAttr.stMjpegCbr; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstMjpegeCbr->u32SrcFrameRate, + &pstMjpegeCbr->fr32DstFrameRate, + pstMjpegeCbr->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_MJPEGFIXQP) { + VENC_MJPEG_FIXQP_S *pstMjpegeFixQp = + &pChnAttr->stRcAttr.stMjpegFixQp; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstMjpegeFixQp->u32SrcFrameRate, + &pstMjpegeFixQp->fr32DstFrameRate, + pstMjpegeFixQp->bVariFpsEn); + } else { + s32Ret = CVI_ERR_VENC_NOT_SUPPORT; + CVI_VENC_ERR("enRcMode = %d, not support\n", + pChnAttr->stRcAttr.enRcMode); + } + } else if (pChnAttr->stVencAttr.enType == PT_H264) { + if (pChnAttr->stRcAttr.enRcMode == VENC_RC_MODE_H264CBR) { + VENC_H264_CBR_S *pstH264Cbr = + &pChnAttr->stRcAttr.stH264Cbr; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH264Cbr->u32SrcFrameRate, + &pstH264Cbr->fr32DstFrameRate, + pstH264Cbr->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264VBR) { + VENC_H264_VBR_S *pstH264Vbr = + &pChnAttr->stRcAttr.stH264Vbr; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH264Vbr->u32SrcFrameRate, + &pstH264Vbr->fr32DstFrameRate, + pstH264Vbr->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264AVBR) { + VENC_H264_AVBR_S *pstH264AVbr = + &pChnAttr->stRcAttr.stH264AVbr; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH264AVbr->u32SrcFrameRate, + &pstH264AVbr->fr32DstFrameRate, + pstH264AVbr->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264FIXQP) { + VENC_H264_FIXQP_S *pstH264FixQp = + &pChnAttr->stRcAttr.stH264FixQp; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH264FixQp->u32SrcFrameRate, + &pstH264FixQp->fr32DstFrameRate, + pstH264FixQp->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264UBR) { + VENC_H264_UBR_S *pstH264Ubr = + &pChnAttr->stRcAttr.stH264Ubr; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH264Ubr->u32SrcFrameRate, + &pstH264Ubr->fr32DstFrameRate, + pstH264Ubr->bVariFpsEn); + } else { + s32Ret = CVI_ERR_VENC_NOT_SUPPORT; + CVI_VENC_ERR("enRcMode = %d, not support\n", + pChnAttr->stRcAttr.enRcMode); + } + } else if (pChnAttr->stVencAttr.enType == PT_H265) { + if (pChnAttr->stRcAttr.enRcMode == VENC_RC_MODE_H265CBR) { + VENC_H265_CBR_S *pstH265Cbr = + &pChnAttr->stRcAttr.stH265Cbr; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH265Cbr->u32SrcFrameRate, + &pstH265Cbr->fr32DstFrameRate, + pstH265Cbr->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265VBR) { + VENC_H265_VBR_S *pstH265Vbr = + &pChnAttr->stRcAttr.stH265Vbr; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH265Vbr->u32SrcFrameRate, + &pstH265Vbr->fr32DstFrameRate, + pstH265Vbr->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265AVBR) { + VENC_H265_AVBR_S *pstH265AVbr = + &pChnAttr->stRcAttr.stH265AVbr; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH265AVbr->u32SrcFrameRate, + &pstH265AVbr->fr32DstFrameRate, + pstH265AVbr->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265FIXQP) { + VENC_H265_FIXQP_S *pstH265FixQp = + &pChnAttr->stRcAttr.stH265FixQp; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH265FixQp->u32SrcFrameRate, + &pstH265FixQp->fr32DstFrameRate, + pstH265FixQp->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265QPMAP) { + VENC_H265_QPMAP_S *pstH265QpMap = + &pChnAttr->stRcAttr.stH265QpMap; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH265QpMap->u32SrcFrameRate, + &pstH265QpMap->fr32DstFrameRate, + pstH265QpMap->bVariFpsEn); + } else if (pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265UBR) { + VENC_H265_UBR_S *pstH265Ubr = + &pChnAttr->stRcAttr.stH265Ubr; + + s32Ret = _cviCheckFrameRate( + pChnHandle, &pstH265Ubr->u32SrcFrameRate, + &pstH265Ubr->fr32DstFrameRate, + pstH265Ubr->bVariFpsEn); + } else { + s32Ret = CVI_ERR_VENC_NOT_SUPPORT; + CVI_VENC_ERR("enRcMode = %d, not support\n", + pChnAttr->stRcAttr.enRcMode); + } + } + + return s32Ret; +} + +static CVI_U32 _cviGetGop(const VENC_RC_ATTR_S *pRcAttr) +{ + switch (pRcAttr->enRcMode) { + case VENC_RC_MODE_H264CBR: + return pRcAttr->stH264Cbr.u32Gop; + case VENC_RC_MODE_H264VBR: + return pRcAttr->stH264Vbr.u32Gop; + case VENC_RC_MODE_H264AVBR: + return pRcAttr->stH264AVbr.u32Gop; + case VENC_RC_MODE_H264QVBR: + return pRcAttr->stH264QVbr.u32Gop; + case VENC_RC_MODE_H264FIXQP: + return pRcAttr->stH264FixQp.u32Gop; + case VENC_RC_MODE_H264QPMAP: + return pRcAttr->stH264QpMap.u32Gop; + case VENC_RC_MODE_H264UBR: + return pRcAttr->stH264Ubr.u32Gop; + case VENC_RC_MODE_H265CBR: + return pRcAttr->stH265Cbr.u32Gop; + case VENC_RC_MODE_H265VBR: + return pRcAttr->stH265Vbr.u32Gop; + case VENC_RC_MODE_H265AVBR: + return pRcAttr->stH265AVbr.u32Gop; + case VENC_RC_MODE_H265QVBR: + return pRcAttr->stH265QVbr.u32Gop; + case VENC_RC_MODE_H265FIXQP: + return pRcAttr->stH265FixQp.u32Gop; + case VENC_RC_MODE_H265QPMAP: + return pRcAttr->stH265QpMap.u32Gop; + case VENC_RC_MODE_H265UBR: + return pRcAttr->stH265Ubr.u32Gop; + default: + return 0; + } +} + +static CVI_S32 cviCheckGopAttr(venc_chn_context *pChnHandle) +{ + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *pRcAttr = &pChnAttr->stRcAttr; + VENC_GOP_ATTR_S *pGopAttr = &pChnAttr->stGopAttr; + CVI_U32 u32Gop = _cviGetGop(pRcAttr); + CVI_S32 s32Ret; + + if (pChnAttr->stVencAttr.enType == PT_JPEG || + pChnAttr->stVencAttr.enType == PT_MJPEG) { + return CVI_SUCCESS; + } + + if (u32Gop == 0) { + CVI_VENC_ERR("enRcMode = %d, not support\n", pRcAttr->enRcMode); + return CVI_ERR_VENC_RC_PARAM; + } + + switch (pGopAttr->enGopMode) { + case VENC_GOPMODE_NORMALP: + s32Ret = ((pGopAttr->stNormalP.s32IPQpDelta >= CVI_H26X_NORMALP_IP_QP_DELTA_MIN) && + (pGopAttr->stNormalP.s32IPQpDelta <= CVI_H26X_NORMALP_IP_QP_DELTA_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_GOP_ATTR; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32IPQpDelta", pGopAttr->stNormalP.s32IPQpDelta); + return s32Ret; + } + break; + + case VENC_GOPMODE_SMARTP: + s32Ret = ((pGopAttr->stSmartP.u32BgInterval >= u32Gop) && + (pGopAttr->stSmartP.u32BgInterval <= CVI_H26X_SMARTP_BG_INTERVAL_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_GOP_ATTR; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32BgInterval", pGopAttr->stNormalP.s32IPQpDelta); + return s32Ret; + } + s32Ret = ((pGopAttr->stSmartP.s32BgQpDelta >= CVI_H26X_SMARTP_BG_QP_DELTA_MIN) && + (pGopAttr->stSmartP.s32BgQpDelta <= CVI_H26X_SMARTP_BG_QP_DELTA_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_GOP_ATTR; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32BgQpDelta", pGopAttr->stNormalP.s32IPQpDelta); + return s32Ret; + } + s32Ret = ((pGopAttr->stSmartP.s32ViQpDelta >= CVI_H26X_SMARTP_VI_QP_DELTA_MIN) && + (pGopAttr->stSmartP.s32ViQpDelta <= CVI_H26X_SMARTP_VI_QP_DELTA_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_GOP_ATTR; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32ViQpDelta", pGopAttr->stSmartP.s32ViQpDelta); + return s32Ret; + } + if ((pGopAttr->stSmartP.u32BgInterval % u32Gop) != 0) { + CVI_VENC_ERR( + "u32BgInterval %d, not a multiple of u32Gop %d\n", + pGopAttr->stAdvSmartP.u32BgInterval, u32Gop); + return CVI_ERR_VENC_GOP_ATTR; + } + break; + + default: + CVI_VENC_ERR("enGopMode = %d, not support\n", + pGopAttr->enGopMode); + return CVI_ERR_VENC_GOP_ATTR; + } + + return CVI_SUCCESS; +} + +#define FRC_TIME_SCALE 0xFFF0 +#if SOFT_FLOAT +#define FLOAT_VAL_FRC_TIME_SCALE (0x477ff000) +#else +#define FLOAT_VAL_FRC_TIME_SCALE (FRC_TIME_SCALE) +#endif +#define FRC_TIME_OVERFLOW_OFFSET 0x40000000 + +static CVI_S32 cviInitFrc(venc_chn_context *pChnHandle, + CVI_U32 u32SrcFrameRate, CVI_FR32 fr32DstFrameRate) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + s32Ret = cviInitFrcSoftFloat(pChnHandle, u32SrcFrameRate, fr32DstFrameRate); + + return s32Ret; +} + +static CVI_S32 cviInitFrcSoftFloat(venc_chn_context *pChnHandle, + CVI_U32 u32SrcFrameRate, CVI_FR32 fr32DstFrameRate) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + venc_frc *pvf = &pChnVars->frc; + CVI_S32 s32Ret = CVI_SUCCESS; + CVI_S32 dstFrDenom; + CVI_S32 dstFrfract; + float32 srcFrameRate; + float32 dstFrameRate; + int srcFrChecker, dstFrChecker; + + dstFrDenom = (fr32DstFrameRate >> 16) & 0xFFFF; + dstFrfract = (fr32DstFrameRate & 0xFFFF); + + dstFrameRate = INT_TO_CVI_FLOAT(dstFrfract); + if (dstFrDenom != 0) + dstFrameRate = CVI_FLOAT_DIV(dstFrameRate, INT_TO_CVI_FLOAT(dstFrDenom)); + + dstFrDenom = (u32SrcFrameRate >> 16) & 0xFFFF; + dstFrfract = (u32SrcFrameRate & 0xFFFF); + + srcFrameRate = INT_TO_CVI_FLOAT(dstFrfract); + if (dstFrDenom != 0) + srcFrameRate = CVI_FLOAT_DIV(srcFrameRate, INT_TO_CVI_FLOAT(dstFrDenom)); + + if (vencDbg.currMask & CVI_VENC_MASK_FRC) { + CVI_VCOM_FLOAT("srcFrameRate = %f, dstFrameRate = %f\n", + getFloat(srcFrameRate), getFloat(dstFrameRate)); + } + + srcFrChecker = CVI_FLOAT_TO_INT(CVI_FLOAT_MUL(srcFrameRate, FLOAT_VAL_10000)); + dstFrChecker = CVI_FLOAT_TO_INT(CVI_FLOAT_MUL(dstFrameRate, FLOAT_VAL_10000)); + + CVI_VENC_FRC("srcFrChecker = %d, dstFrChecker = %d\n", + srcFrChecker, dstFrChecker); + + if (srcFrChecker > dstFrChecker) { + if (CVI_FLOAT_EQ(srcFrameRate, FLOAT_VAL_0) || + CVI_FLOAT_EQ(dstFrameRate, FLOAT_VAL_0)) { + CVI_VENC_ERR( + "Dst frame rate(%d), Src frame rate(%d), not supported\n", + dstFrameRate, srcFrameRate); + pvf->bFrcEnable = CVI_FALSE; + s32Ret = CVI_ERR_VENC_NOT_SUPPORT; + return s32Ret; + } + pvf->bFrcEnable = CVI_TRUE; + pvf->srcFrameDur = + CVI_FLOAT_TO_INT(CVI_FLOAT_DIV(FLOAT_VAL_FRC_TIME_SCALE, srcFrameRate)); + pvf->dstFrameDur = + CVI_FLOAT_TO_INT(CVI_FLOAT_DIV(FLOAT_VAL_FRC_TIME_SCALE, dstFrameRate)); + pvf->srcTs = pvf->srcFrameDur; + pvf->dstTs = pvf->dstFrameDur; + CVI_VENC_FRC("srcFrameDur = %d, dstFrameDur = %d\n", + pvf->srcFrameDur, pvf->dstFrameDur); + } else if (srcFrChecker == dstFrChecker) { + pvf->bFrcEnable = CVI_FALSE; + } else { + pvf->bFrcEnable = CVI_FALSE; + CVI_VENC_ERR( + "Dst frame rate(%d) > Src frame rate(%d), not supported\n", + dstFrameRate, srcFrameRate); + s32Ret = CVI_ERR_VENC_NOT_SUPPORT; + return s32Ret; + } + + CVI_VENC_FRC("bFrcEnable = %d\n", pvf->bFrcEnable); + + return s32Ret; +} + +static CVI_S32 cviSetChnDefault(venc_chn_context *pChnHandle) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_ATTR_S *pVencAttr = &pChnAttr->stVencAttr; + VENC_JPEG_PARAM_S *pvjp = &pChnVars->stJpegParam; + VENC_CU_PREDICTION_S *pcup = &pChnVars->cuPrediction; + VENC_SUPERFRAME_CFG_S *pcsf = &pChnVars->stSuperFrmParam; + VENC_FRAME_PARAM_S *pfp = &pChnVars->frameParam; + CVI_S32 s32Ret = CVI_SUCCESS; + MMF_CHN_S chn = { .enModId = CVI_ID_VENC, + .s32DevId = 0, + .s32ChnId = pChnHandle->VeChn }; + + if (pVencAttr->enType == PT_H264) { + pChnHandle->h264Vui.stVuiAspectRatio.aspect_ratio_idc = + CVI_H26X_ASPECT_RATIO_IDC_DEFAULT; + pChnHandle->h264Vui.stVuiAspectRatio.sar_width = + CVI_H26X_SAR_WIDTH_DEFAULT; + pChnHandle->h264Vui.stVuiAspectRatio.sar_height = + CVI_H26X_SAR_HEIGHT_DEFAULT; + pChnHandle->h264Vui.stVuiTimeInfo.num_units_in_tick = + CVI_H26X_NUM_UNITS_IN_TICK_DEFAULT; + pChnHandle->h264Vui.stVuiTimeInfo.time_scale = + CVI_H26X_TIME_SCALE_DEFAULT; + pChnHandle->h264Vui.stVuiVideoSignal.video_format = + CVI_H26X_VIDEO_FORMAT_DEFAULT; + pChnHandle->h264Vui.stVuiVideoSignal.colour_primaries = + CVI_H26X_COLOUR_PRIMARIES_DEFAULT; + pChnHandle->h264Vui.stVuiVideoSignal.transfer_characteristics = + CVI_H26X_TRANSFER_CHARACTERISTICS_DEFAULT; + pChnHandle->h264Vui.stVuiVideoSignal.matrix_coefficients = + CVI_H26X_MATRIX_COEFFICIENTS_DEFAULT; + } else if (pVencAttr->enType == PT_H265) { + pChnHandle->h265Vui.stVuiAspectRatio.aspect_ratio_idc = + CVI_H26X_ASPECT_RATIO_IDC_DEFAULT; + pChnHandle->h265Vui.stVuiAspectRatio.sar_width = + CVI_H26X_SAR_WIDTH_DEFAULT; + pChnHandle->h265Vui.stVuiAspectRatio.sar_height = + CVI_H26X_SAR_HEIGHT_DEFAULT; + pChnHandle->h265Vui.stVuiTimeInfo.num_units_in_tick = + CVI_H26X_NUM_UNITS_IN_TICK_DEFAULT; + pChnHandle->h265Vui.stVuiTimeInfo.time_scale = + CVI_H26X_TIME_SCALE_DEFAULT; + pChnHandle->h265Vui.stVuiTimeInfo.num_ticks_poc_diff_one_minus1 = + CVI_H265_NUM_TICKS_POC_DIFF_ONE_MINUS1_DEFAULT; + pChnHandle->h265Vui.stVuiVideoSignal.video_format = + CVI_H26X_VIDEO_FORMAT_DEFAULT; + pChnHandle->h265Vui.stVuiVideoSignal.colour_primaries = + CVI_H26X_COLOUR_PRIMARIES_DEFAULT; + pChnHandle->h265Vui.stVuiVideoSignal.transfer_characteristics = + CVI_H26X_TRANSFER_CHARACTERISTICS_DEFAULT; + pChnHandle->h265Vui.stVuiVideoSignal.matrix_coefficients = + CVI_H26X_MATRIX_COEFFICIENTS_DEFAULT; + } + + pChnHandle->svcParam.complex_scene_low_th = CVI_SENCE_SIMPLE_TH; + pChnHandle->svcParam.complex_scene_hight_th = CVI_SENCE_CPLX_TH; + pChnHandle->svcParam.middle_min_percent = CVI_SENCE_MIDDLE_MIN_PERCENT; + pChnHandle->svcParam.complex_min_percent = CVI_SENCE_CPLX_MIN_PERCENT; + + if (pVencAttr->enType == PT_H264) { + if (pVencAttr->u32Profile == H264E_PROFILE_BASELINE) { + pChnHandle->h264Entropy.u32EntropyEncModeI = + H264E_ENTROPY_CAVLC; + pChnHandle->h264Entropy.u32EntropyEncModeP = + H264E_ENTROPY_CAVLC; + } else { + pChnHandle->h264Entropy.u32EntropyEncModeI = + H264E_ENTROPY_CABAC; + pChnHandle->h264Entropy.u32EntropyEncModeP = + H264E_ENTROPY_CABAC; + } + } + + pvjp->u32Qfactor = Q_TABLE_DEFAULT; + pcup->u32IntraCost = CVI_H26X_INTRACOST_DEFAULT; + pcsf->enSuperFrmMode = CVI_H26X_SUPER_FRM_MODE_DEFAULT; + pcsf->u32SuperIFrmBitsThr = CVI_H26X_SUPER_I_BITS_THR_DEFAULT; + pcsf->u32SuperPFrmBitsThr = CVI_H26X_SUPER_P_BITS_THR_DEFAULT; + pfp->u32FrameQp = CVI_H26X_FRAME_QP_DEFAULT; + pfp->u32FrameBits = CVI_H26X_FRAME_BITS_DEFAULT; + + s32Ret = cviSetDefaultRcParam(pChnHandle); + if (s32Ret < 0) { + CVI_VENC_ERR("cviSetDefaultRcParam\n"); + return s32Ret; + } + + pChnVars->vbpool.hPicInfoVbPool = VB_INVALID_POOLID; + chn.s32ChnId = pChnHandle->VeChn; + base_mod_jobs_init(chn, CHN_TYPE_IN, 1, 1, 0); + SEMA_INIT(&pChnVars->sem_send, 0, 0); + SEMA_INIT(&pChnVars->sem_release, 0, 0); + + cviInitVfps(pChnHandle); + + return s32Ret; +} + +static CVI_S32 cviSetDefaultRcParam(venc_chn_context *pChnHandle) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + VENC_CHN_ATTR_S *pChnAttr; + VENC_ATTR_S *pVencAttr; + VENC_RC_ATTR_S *prcatt; + VENC_RC_PARAM_S *prcparam; + + pChnAttr = pChnHandle->pChnAttr; + pVencAttr = &pChnAttr->stVencAttr; + prcatt = &pChnAttr->stRcAttr; + prcparam = &pChnHandle->rcParam; + + prcparam->u32RowQpDelta = CVI_H26X_ROW_QP_DELTA_DEFAULT; + prcparam->s32FirstFrameStartQp = + ((pVencAttr->enType == PT_H265) ? 63 : DEF_IQP); + prcparam->s32InitialDelay = CVI_INITIAL_DELAY_DEFAULT; + prcparam->u32ThrdLv = CVI_H26X_THRDLV_DEFAULT; + prcparam->bBgEnhanceEn = CVI_H26X_BG_ENHANCE_EN_DEFAULT; + prcparam->s32BgDeltaQp = CVI_H26X_BG_DELTA_QP_DEFAULT; + + if (pVencAttr->enType == PT_H264) { + if (prcatt->enRcMode == VENC_RC_MODE_H264CBR) { + VENC_PARAM_H264_CBR_S *pstParamH264Cbr = + &prcparam->stParamH264Cbr; + + SET_DEFAULT_RC_PARAM(pstParamH264Cbr); + } else if (prcatt->enRcMode == VENC_RC_MODE_H264VBR) { + VENC_PARAM_H264_VBR_S *pstParamH264Vbr = + &prcparam->stParamH264Vbr; + + SET_DEFAULT_RC_PARAM(pstParamH264Vbr); + pstParamH264Vbr->s32ChangePos = + CVI_H26X_CHANGE_POS_DEFAULT; + } else if (prcatt->enRcMode == VENC_RC_MODE_H264AVBR) { + VENC_PARAM_H264_AVBR_S *pstParamH264AVbr = + &prcparam->stParamH264AVbr; + + SET_DEFAULT_RC_PARAM(pstParamH264AVbr); + pstParamH264AVbr->s32ChangePos = + CVI_H26X_CHANGE_POS_DEFAULT; + pstParamH264AVbr->s32MinStillPercent = + CVI_H26X_MIN_STILL_PERCENT_DEFAULT; + pstParamH264AVbr->u32MaxStillQP = + CVI_H26X_MAX_STILL_QP_DEFAULT; + pstParamH264AVbr->u32MotionSensitivity = + CVI_H26X_MOTION_SENSITIVITY_DEFAULT; + pstParamH264AVbr->s32AvbrFrmLostOpen = + CVI_H26X_AVBR_FRM_LOST_OPEN_DEFAULT; + pstParamH264AVbr->s32AvbrFrmGap = + CVI_H26X_AVBR_FRM_GAP_DEFAULT; + pstParamH264AVbr->s32AvbrPureStillThr = + CVI_H26X_AVBR_PURE_STILL_THR_DEFAULT; + } else if (prcatt->enRcMode == VENC_RC_MODE_H264UBR) { + VENC_PARAM_H264_UBR_S *pstParamH264Ubr = + &prcparam->stParamH264Ubr; + + SET_DEFAULT_RC_PARAM(pstParamH264Ubr); + } + } else if (pVencAttr->enType == PT_H265) { + if (prcatt->enRcMode == VENC_RC_MODE_H265CBR) { + VENC_PARAM_H265_CBR_S *pstParamH265Cbr = + &prcparam->stParamH265Cbr; + + SET_DEFAULT_RC_PARAM(pstParamH265Cbr); + } else if (prcatt->enRcMode == VENC_RC_MODE_H265VBR) { + VENC_PARAM_H265_VBR_S *pstParamH265Vbr = + &prcparam->stParamH265Vbr; + + SET_DEFAULT_RC_PARAM(pstParamH265Vbr); + pstParamH265Vbr->s32ChangePos = + CVI_H26X_CHANGE_POS_DEFAULT; + } else if (prcatt->enRcMode == VENC_RC_MODE_H265AVBR) { + VENC_PARAM_H265_AVBR_S *pstParamH265AVbr = + &prcparam->stParamH265AVbr; + + SET_DEFAULT_RC_PARAM(pstParamH265AVbr); + pstParamH265AVbr->s32ChangePos = + CVI_H26X_CHANGE_POS_DEFAULT; + pstParamH265AVbr->s32MinStillPercent = + CVI_H26X_MIN_STILL_PERCENT_DEFAULT; + pstParamH265AVbr->u32MaxStillQP = + CVI_H26X_MAX_STILL_QP_DEFAULT; + pstParamH265AVbr->u32MotionSensitivity = + CVI_H26X_MOTION_SENSITIVITY_DEFAULT; + pstParamH265AVbr->s32AvbrFrmLostOpen = + CVI_H26X_AVBR_FRM_LOST_OPEN_DEFAULT; + pstParamH265AVbr->s32AvbrFrmGap = + CVI_H26X_AVBR_FRM_GAP_DEFAULT; + pstParamH265AVbr->s32AvbrPureStillThr = + CVI_H26X_AVBR_PURE_STILL_THR_DEFAULT; + } else if (prcatt->enRcMode == VENC_RC_MODE_H265QPMAP) { + VENC_PARAM_H265_CBR_S *pstParamH265Cbr = + &prcparam->stParamH265Cbr; + + // When using QP Map, we use CBR as basic setting + SET_DEFAULT_RC_PARAM(pstParamH265Cbr); + } else if (prcatt->enRcMode == VENC_RC_MODE_H265UBR) { + VENC_PARAM_H265_UBR_S *pstParamH265Ubr = + &prcparam->stParamH265Ubr; + + SET_DEFAULT_RC_PARAM(pstParamH265Ubr); + } + } + + return s32Ret; +} + +static CVI_VOID cviInitVfps(venc_chn_context *pChnHandle) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + venc_vfps *pVfps = &pChnVars->vfps; + + memset(pVfps, 0, sizeof(venc_vfps)); + pVfps->u64StatTime = CVI_DEF_VFPFS_STAT_TIME * 1000 * 1000; +} + +static CVI_S32 cviSetRcParamToDrv(venc_chn_context *pChnHandle) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + VENC_RC_PARAM_S *prcparam = &pChnHandle->rcParam; + VENC_ATTR_S *pVencAttr = &pChnAttr->stVencAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + + if (pEncCtx->base.ioctl) { + cviRcParam rcp, *prcp = &rcp; + + prcp->u32RowQpDelta = prcparam->u32RowQpDelta; + prcp->firstFrmstartQp = prcparam->s32FirstFrameStartQp; + prcp->u32ThrdLv = prcparam->u32ThrdLv; + prcp->s32InitialDelay = prcparam->s32InitialDelay; + + CVI_VENC_CFG( + "RowQpDelta = %d, firstFrmstartQp = %d, ThrdLv = %d, InitialDelay = %d\n", + prcp->u32RowQpDelta, prcp->firstFrmstartQp, + prcp->u32ThrdLv, prcp->s32InitialDelay); + prcp->bBgEnhanceEn = prcparam->bBgEnhanceEn; + prcp->s32BgDeltaQp = prcparam->s32BgDeltaQp; + CVI_VENC_CFG("BgEnhanceEn = %d, BgDeltaQp = %d\n", + prcp->bBgEnhanceEn, prcp->s32BgDeltaQp); + + prcp->s32ChangePos = 0; + + if (pVencAttr->enType == PT_H264) { + if (prcatt->enRcMode == VENC_RC_MODE_H264CBR) { + VENC_PARAM_H264_CBR_S *pstParamH264Cbr = + &prcparam->stParamH264Cbr; + + SET_COMMON_RC_PARAM(prcp, pstParamH264Cbr); + } else if (prcatt->enRcMode == VENC_RC_MODE_H264VBR) { + VENC_PARAM_H264_VBR_S *pstParamH264Vbr = + &prcparam->stParamH264Vbr; + + SET_COMMON_RC_PARAM(prcp, pstParamH264Vbr); + prcp->s32ChangePos = + pstParamH264Vbr->s32ChangePos; + CVI_VENC_CFG("s32ChangePos = %d\n", + prcp->s32ChangePos); + } else if (prcatt->enRcMode == VENC_RC_MODE_H264AVBR) { + VENC_PARAM_H264_AVBR_S *pstParamH264AVbr = + &prcparam->stParamH264AVbr; + + SET_COMMON_RC_PARAM(prcp, pstParamH264AVbr); + prcp->s32ChangePos = + pstParamH264AVbr->s32ChangePos; + prcp->s32MinStillPercent = + pstParamH264AVbr->s32MinStillPercent; + prcp->u32MaxStillQP = + pstParamH264AVbr->u32MaxStillQP; + prcp->u32MotionSensitivity = + pstParamH264AVbr->u32MotionSensitivity; + prcp->s32AvbrFrmLostOpen = + pstParamH264AVbr->s32AvbrFrmLostOpen; + prcp->s32AvbrFrmGap = + pstParamH264AVbr->s32AvbrFrmGap; + prcp->s32AvbrPureStillThr = + pstParamH264AVbr->s32AvbrPureStillThr; + + CVI_VENC_CFG("s32ChangePos = %d\n", + prcp->s32ChangePos); + CVI_VENC_CFG( + "Still Percent = %d, QP = %d, MotionSensitivity = %d\n", + prcp->s32MinStillPercent, + prcp->u32MaxStillQP, + prcp->u32MotionSensitivity); + CVI_VENC_CFG( + "FrmLostOpen = %d, FrmGap = %d, PureStillThr = %d\n", + prcp->s32AvbrFrmLostOpen, + prcp->s32AvbrFrmGap, + prcp->s32AvbrPureStillThr); + } else if (prcatt->enRcMode == VENC_RC_MODE_H264UBR) { + VENC_PARAM_H264_UBR_S *pstParamH264Ubr = + &prcparam->stParamH264Ubr; + + SET_COMMON_RC_PARAM(prcp, pstParamH264Ubr); + } + } else if (pVencAttr->enType == PT_H265) { + if (prcatt->enRcMode == VENC_RC_MODE_H265CBR) { + VENC_PARAM_H265_CBR_S *pstParamH265Cbr = + &prcparam->stParamH265Cbr; + + SET_COMMON_RC_PARAM(prcp, pstParamH265Cbr); + } else if (prcatt->enRcMode == VENC_RC_MODE_H265VBR) { + VENC_PARAM_H265_VBR_S *pstParamH265Vbr = + &prcparam->stParamH265Vbr; + + SET_COMMON_RC_PARAM(prcp, pstParamH265Vbr); + prcp->s32ChangePos = + pstParamH265Vbr->s32ChangePos; + CVI_VENC_CFG("s32ChangePos = %d\n", + prcp->s32ChangePos); + } else if (prcatt->enRcMode == VENC_RC_MODE_H265AVBR) { + VENC_PARAM_H265_AVBR_S *pstParamH265AVbr = + &prcparam->stParamH265AVbr; + + SET_COMMON_RC_PARAM(prcp, pstParamH265AVbr); + prcp->s32ChangePos = + pstParamH265AVbr->s32ChangePos; + prcp->s32MinStillPercent = + pstParamH265AVbr->s32MinStillPercent; + prcp->u32MaxStillQP = + pstParamH265AVbr->u32MaxStillQP; + prcp->u32MotionSensitivity = + pstParamH265AVbr->u32MotionSensitivity; + prcp->s32AvbrFrmLostOpen = + pstParamH265AVbr->s32AvbrFrmLostOpen; + prcp->s32AvbrFrmGap = + pstParamH265AVbr->s32AvbrFrmGap; + prcp->s32AvbrPureStillThr = + pstParamH265AVbr->s32AvbrPureStillThr; + + CVI_VENC_CFG("s32ChangePos = %d\n", + prcp->s32ChangePos); + CVI_VENC_CFG( + "Still Percent = %d, QP = %d, MotionSensitivity = %d\n", + prcp->s32MinStillPercent, + prcp->u32MaxStillQP, + prcp->u32MotionSensitivity); + CVI_VENC_CFG( + "FrmLostOpen = %d, FrmGap = %d, PureStillThr = %d\n", + prcp->s32AvbrFrmLostOpen, + prcp->s32AvbrFrmGap, + prcp->s32AvbrPureStillThr); + } else if (prcatt->enRcMode == VENC_RC_MODE_H265QPMAP) { + VENC_PARAM_H265_CBR_S *pstParamH265Cbr = + &prcparam->stParamH265Cbr; + + // When using QP Map, we use CBR as basic setting + SET_COMMON_RC_PARAM(prcp, pstParamH265Cbr); + } else if (prcatt->enRcMode == VENC_RC_MODE_H265UBR) { + VENC_PARAM_H265_UBR_S *pstParamH265Ubr = + &prcparam->stParamH265Ubr; + + SET_COMMON_RC_PARAM(prcp, pstParamH265Ubr); + } + } + + CVI_VENC_CFG( + "u32MinIQp = %d, u32MaxIQp = %d, u32MinQp = %d, u32MaxQp = %d\n", + prcp->u32MinIQp, prcp->u32MaxIQp, prcp->u32MinQp, + prcp->u32MaxQp); + + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_RC_PARAM, + (CVI_VOID *)prcp); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_SET_RC_PARAM, %d\n", s32Ret); + return s32Ret; + } + } else { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + return s32Ret; +} + +CVI_S32 _cvi_h26x_trans_chn_attr(VENC_CHN_ATTR_S *pInChnAttr, + cviVidChnAttr *pOutAttr) +{ + CVI_S32 s32Ret = CVI_FAILURE; + VENC_RC_ATTR_S *pstRcAttr = NULL; + + if ((pInChnAttr == NULL) || (pOutAttr == NULL)) + return s32Ret; + + pstRcAttr = &pInChnAttr->stRcAttr; + + if (pInChnAttr->stVencAttr.enType == PT_H264) { + if (pstRcAttr->enRcMode == VENC_RC_MODE_H264CBR) { + pOutAttr->u32BitRate = pstRcAttr->stH264Cbr.u32BitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stH264Cbr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stH264Cbr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } else if (pstRcAttr->enRcMode == VENC_RC_MODE_H264VBR) { + pOutAttr->u32BitRate = + pstRcAttr->stH264Vbr.u32MaxBitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stH264Vbr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stH264Vbr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } else if (pstRcAttr->enRcMode == VENC_RC_MODE_H264AVBR) { + pOutAttr->u32BitRate = + pstRcAttr->stH264AVbr.u32MaxBitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stH264AVbr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stH264AVbr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } else if (pstRcAttr->enRcMode == VENC_RC_MODE_H264UBR) { + pOutAttr->u32BitRate = pstRcAttr->stH264Ubr.u32BitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stH264Ubr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stH264Ubr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } + } else if (pInChnAttr->stVencAttr.enType == PT_H265) { + if (pstRcAttr->enRcMode == VENC_RC_MODE_H265CBR) { + pOutAttr->u32BitRate = pstRcAttr->stH265Cbr.u32BitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stH265Cbr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stH265Cbr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } else if (pstRcAttr->enRcMode == VENC_RC_MODE_H265VBR) { + pOutAttr->u32BitRate = + pstRcAttr->stH265Vbr.u32MaxBitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stH265Vbr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stH265Vbr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } else if (pstRcAttr->enRcMode == VENC_RC_MODE_H265AVBR) { + pOutAttr->u32BitRate = + pstRcAttr->stH265AVbr.u32MaxBitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stH265AVbr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stH265AVbr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } else if (pstRcAttr->enRcMode == VENC_RC_MODE_H265UBR) { + pOutAttr->u32BitRate = pstRcAttr->stH265Ubr.u32BitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stH265Ubr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stH265Ubr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } + } + + return s32Ret; +} + +CVI_S32 _cvi_jpg_trans_chn_attr(VENC_CHN_ATTR_S *pInChnAttr, + cviJpegChnAttr *pOutAttr) +{ + CVI_S32 s32Ret = CVI_FAILURE; + VENC_RC_ATTR_S *pstRcAttr = NULL; + VENC_ATTR_S *pstVencAttr = NULL; + + if ((pInChnAttr == NULL) || (pOutAttr == NULL)) + return s32Ret; + + pstRcAttr = &(pInChnAttr->stRcAttr); + pstVencAttr = &(pInChnAttr->stVencAttr); + + if (pInChnAttr->stVencAttr.enType == PT_MJPEG) { + pOutAttr->picWidth = pstVencAttr->u32PicWidth; + pOutAttr->picHeight = pstVencAttr->u32PicHeight; + if (pstRcAttr->enRcMode == VENC_RC_MODE_MJPEGCBR) { + pOutAttr->u32BitRate = pstRcAttr->stMjpegCbr.u32BitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stMjpegCbr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stMjpegCbr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } else if (pstRcAttr->enRcMode == VENC_RC_MODE_MJPEGVBR) { + pOutAttr->u32BitRate = + pstRcAttr->stMjpegVbr.u32MaxBitRate; + pOutAttr->u32SrcFrameRate = + pstRcAttr->stMjpegVbr.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stMjpegVbr.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } else if (pstRcAttr->enRcMode == VENC_RC_MODE_MJPEGFIXQP) { + pOutAttr->u32SrcFrameRate = + pstRcAttr->stMjpegFixQp.u32SrcFrameRate; + pOutAttr->fr32DstFrameRate = + pstRcAttr->stMjpegFixQp.fr32DstFrameRate; + s32Ret = CVI_SUCCESS; + } + } else if (pInChnAttr->stVencAttr.enType == PT_JPEG) { + pOutAttr->picWidth = pstVencAttr->u32PicWidth; + pOutAttr->picHeight = pstVencAttr->u32PicHeight; + s32Ret = CVI_SUCCESS; + } + + return s32Ret; +} + +static CVI_S32 +_cvi_venc_check_jpege_format(const VENC_MOD_JPEGE_S *pJpegeModParam) +{ + int i; + unsigned int marker_cnt[JPEGE_MARKER_BUTT]; + const JPEGE_MARKER_TYPE_E *p = pJpegeModParam->JpegMarkerOrder; + + switch (pJpegeModParam->enJpegeFormat) { + case JPEGE_FORMAT_DEFAULT: + case JPEGE_FORMAT_TYPE_1: + return CVI_SUCCESS; + case JPEGE_FORMAT_CUSTOM: + // proceed to check marker order validity + break; + default: + CVI_VENC_ERR("Unknown JPEG format %d\n", + pJpegeModParam->enJpegeFormat); + return CVI_ERR_VENC_JPEG_MARKER_ORDER; + } + + memset(marker_cnt, 0, sizeof(marker_cnt)); + + if (p[0] != JPEGE_MARKER_SOI) { + CVI_VENC_ERR("The first jpeg marker must be SOI\n"); + return CVI_ERR_VENC_JPEG_MARKER_ORDER; + } + + for (i = 0; i < JPEG_MARKER_ORDER_CNT; i++) { + int type = p[i]; + if (JPEGE_MARKER_SOI <= type && type < JPEGE_MARKER_BUTT) + marker_cnt[type] += 1; + else + break; + } + + if (marker_cnt[JPEGE_MARKER_SOI] == 0) { + CVI_VENC_ERR("There must be one SOI\n"); + return CVI_ERR_VENC_JPEG_MARKER_ORDER; + } + if (marker_cnt[JPEGE_MARKER_SOF0] == 0) { + CVI_VENC_ERR("There must be one SOF0\n"); + return CVI_ERR_VENC_JPEG_MARKER_ORDER; + } + if (marker_cnt[JPEGE_MARKER_DQT] == 0 && + marker_cnt[JPEGE_MARKER_DQT_MERGE] == 0) { + CVI_VENC_ERR("There must be one DQT or DQT_MERGE\n"); + return CVI_ERR_VENC_JPEG_MARKER_ORDER; + } + if (marker_cnt[JPEGE_MARKER_DQT] > 0 && + marker_cnt[JPEGE_MARKER_DQT_MERGE] > 0) { + CVI_VENC_ERR("DQT and DQT_MERGE are mutually exclusive\n"); + return CVI_ERR_VENC_JPEG_MARKER_ORDER; + } + if (marker_cnt[JPEGE_MARKER_DHT] > 0 && + marker_cnt[JPEGE_MARKER_DHT_MERGE] > 0) { + CVI_VENC_ERR("DHT and DHT_MERGE are mutually exclusive\n"); + return CVI_ERR_VENC_JPEG_MARKER_ORDER; + } + if (marker_cnt[JPEGE_MARKER_DRI] > 0 && + marker_cnt[JPEGE_MARKER_DRI_OPT] > 0) { + CVI_VENC_ERR("DRI and DRI_OPT are mutually exclusive\n"); + return CVI_ERR_VENC_JPEG_MARKER_ORDER; + } + + for (i = JPEGE_MARKER_SOI; i < JPEGE_MARKER_BUTT; i++) { + if (marker_cnt[i] > 1) { + CVI_VENC_ERR("Repeating marker type %d present\n", i); + return CVI_ERR_VENC_JPEG_MARKER_ORDER; + } + } + + return CVI_SUCCESS; +} + +static void _cvi_venc_config_jpege_format(VENC_MOD_JPEGE_S *pJpegeModParam) +{ + switch (pJpegeModParam->enJpegeFormat) { + case JPEGE_FORMAT_DEFAULT: + pJpegeModParam->JpegMarkerOrder[0] = JPEGE_MARKER_SOI; + pJpegeModParam->JpegMarkerOrder[1] = JPEGE_MARKER_FRAME_INDEX; + pJpegeModParam->JpegMarkerOrder[2] = JPEGE_MARKER_USER_DATA; + pJpegeModParam->JpegMarkerOrder[3] = JPEGE_MARKER_DRI_OPT; + pJpegeModParam->JpegMarkerOrder[4] = JPEGE_MARKER_DQT; + pJpegeModParam->JpegMarkerOrder[5] = JPEGE_MARKER_DHT; + pJpegeModParam->JpegMarkerOrder[6] = JPEGE_MARKER_SOF0; + pJpegeModParam->JpegMarkerOrder[7] = JPEGE_MARKER_BUTT; + return; + case JPEGE_FORMAT_TYPE_1: + pJpegeModParam->JpegMarkerOrder[0] = JPEGE_MARKER_SOI; + pJpegeModParam->JpegMarkerOrder[1] = JPEGE_MARKER_JFIF; + pJpegeModParam->JpegMarkerOrder[2] = JPEGE_MARKER_DQT_MERGE; + pJpegeModParam->JpegMarkerOrder[3] = JPEGE_MARKER_SOF0; + pJpegeModParam->JpegMarkerOrder[4] = JPEGE_MARKER_DHT_MERGE; + pJpegeModParam->JpegMarkerOrder[5] = JPEGE_MARKER_DRI; + pJpegeModParam->JpegMarkerOrder[6] = JPEGE_MARKER_BUTT; + return; + default: + return; + } +} + +/** + * @brief Send encoder module parameters + * @param[in] VENC_PARAM_MOD_S. + * @retval 0 Success + * @retval Non-0 Failure, please see the error code table + */ +CVI_S32 CVI_VENC_SetModParam(const VENC_PARAM_MOD_S *pstModParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_context *pVencHandle; + CVI_U32 *pUserDataMaxLen; + + if (pstModParam == NULL) { + CVI_VENC_ERR("pstModParam NULL !\n"); + return CVI_ERR_VENC_ILLEGAL_PARAM; + } + + s32Ret = _cviVencInitCtxHandle(); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_VENC_GetModParam init failure\n"); + return s32Ret; + } + + pVencHandle = (venc_context *)handle; + if (pVencHandle == NULL) { + CVI_VENC_ERR( + "CVI_VENC_SetModParam venc_context global handle not create\n"); + return CVI_ERR_VENC_NULL_PTR; + + } else { + if (pstModParam->enVencModType == MODTYPE_H264E) { + memcpy(&pVencHandle->ModParam.stH264eModParam, + &pstModParam->stH264eModParam, + sizeof(VENC_MOD_H264E_S)); + + pUserDataMaxLen = + &(pVencHandle->ModParam.stH264eModParam + .u32UserDataMaxLen); + *pUserDataMaxLen = + MIN(*pUserDataMaxLen, USERDATA_MAX_LIMIT); + } else if (pstModParam->enVencModType == MODTYPE_H265E) { + memcpy(&pVencHandle->ModParam.stH265eModParam, + &pstModParam->stH265eModParam, + sizeof(VENC_MOD_H265E_S)); + + pUserDataMaxLen = + &(pVencHandle->ModParam.stH265eModParam + .u32UserDataMaxLen); + *pUserDataMaxLen = + MIN(*pUserDataMaxLen, USERDATA_MAX_LIMIT); + } else if (pstModParam->enVencModType == MODTYPE_JPEGE) { + s32Ret = _cvi_venc_check_jpege_format( + &pstModParam->stJpegeModParam); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "CVI_VENC_SetModParam JPEG marker order error\n"); + return s32Ret; + } + + memcpy(&pVencHandle->ModParam.stJpegeModParam, + &pstModParam->stJpegeModParam, + sizeof(VENC_MOD_JPEGE_S)); + _cvi_venc_config_jpege_format( + &pVencHandle->ModParam.stJpegeModParam); + } + } + + return s32Ret; +} + +/** + * @brief Get encoder module parameters + * @param[in] VENC_PARAM_MOD_S. + * @retval 0 Success + * @retval Non-0 Failure, please see the error code table + */ +CVI_S32 CVI_VENC_GetModParam(VENC_PARAM_MOD_S *pstModParam) +{ + CVI_S32 s32Ret; + venc_context *pVencHandle; + + if (pstModParam == NULL) { + CVI_VENC_ERR("pstModParam NULL !\n"); + return CVI_ERR_VENC_ILLEGAL_PARAM; + } + + s32Ret = _cviVencInitCtxHandle(); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_VENC_GetModParam init failure\n"); + return s32Ret; + } + + pVencHandle = (venc_context *)handle; + if (pVencHandle == NULL) { + CVI_VENC_ERR( + "CVI_VENC_GetModParam venc_context global handle not create\n"); + return CVI_ERR_VENC_NULL_PTR; + + } else { + if (pstModParam->enVencModType == MODTYPE_H264E) { + memcpy(&pstModParam->stH264eModParam, + &pVencHandle->ModParam.stH264eModParam, + sizeof(VENC_MOD_H264E_S)); + } else if (pstModParam->enVencModType == MODTYPE_H265E) { + memcpy(&pstModParam->stH265eModParam, + &pVencHandle->ModParam.stH265eModParam, + sizeof(VENC_MOD_H265E_S)); + } else if (pstModParam->enVencModType == MODTYPE_JPEGE) { + memcpy(&pstModParam->stJpegeModParam, + &pVencHandle->ModParam.stJpegeModParam, + sizeof(VENC_MOD_JPEGE_S)); + } + } + + return CVI_SUCCESS; +} + +/** + * @brief encoder module attach vb buffer + * @param[in] VeChn VENC Channel Number. + * @param[in] pstPool VENC_CHN_POOL_S. + * @retval 0 Success + * @retval Non-0 Failure, please see the error code table + */ +CVI_S32 CVI_VENC_AttachVbPool(VENC_CHN VeChn, const VENC_CHN_POOL_S *pstPool) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_context *p_venctx_handle = handle; + VB_SOURCE_E eVbSource = VB_SOURCE_COMMON; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = p_venctx_handle->chn_handle[VeChn]; + + if (pstPool == NULL) { + CVI_VENC_ERR("pstPool = NULL\n"); + return CVI_ERR_VENC_ILLEGAL_PARAM; + } + + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_JPEG || + pChnHandle->pChnAttr->stVencAttr.enType == PT_MJPEG) { + CVI_VENC_ERR("Not support Picture type\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + + } else if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) + eVbSource = p_venctx_handle->ModParam.stH264eModParam + .enH264eVBSource; + else if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265) + eVbSource = p_venctx_handle->ModParam.stH265eModParam + .enH265eVBSource; + + if (eVbSource != VB_SOURCE_USER) { + CVI_VENC_ERR("Not support eVbSource:%d\n", eVbSource); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + pChnHandle->pChnVars->bHasVbPool = CVI_TRUE; + pChnHandle->pChnVars->vbpool = *pstPool; + + return CVI_SUCCESS; +} + +/** + * @brief encoder module detach vb buffer + * @param[in] VeChn VENC Channel Number. + * @retval 0 Success + * @retval Non-0 Failure, please see the error code table + */ +CVI_S32 CVI_VENC_DetachVbPool(VENC_CHN VeChn) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_context *p_venctx_handle = handle; + venc_chn_vars *pChnVars = NULL; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = p_venctx_handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + if (pChnVars->bHasVbPool == CVI_FALSE) { + CVI_VENC_ERR("VeChn= %d vbpool not been attached\n", VeChn); + return CVI_ERR_VENC_NOT_SUPPORT; + + } else { + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265 || + (pChnHandle->pChnAttr->stVencAttr.enType == PT_H264)) { + int i = 0; + + for (i = 0; i < (int)pChnVars->FrmNum; i++) { + VB_BLK blk; + + blk = vb_physAddr2Handle( + pChnVars->FrmArray[i].phyAddr); + if (blk != VB_INVALID_HANDLE) + vb_release_block(blk); + } + } else { + CVI_VENC_ERR("Not Support Type with bHasVbPool on\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + pChnVars->bHasVbPool = CVI_FALSE; + } + + return CVI_SUCCESS; +} + +/** + * @brief Send one frame to encode + * @param[in] VeChn VENC Channel Number. + * @param[in] pstFrame pointer to VIDEO_FRAME_INFO_S. + * @param[in] s32MilliSec TODO VENC + * @retval 0 Success + * @retval Non-0 Failure, please see the error code table + */ +CVI_S32 CVI_VENC_SendFrame(VENC_CHN VeChn, const VIDEO_FRAME_INFO_S *pstFrame, + CVI_S32 s32MilliSec) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_sendframe(VeChn, pstFrame, s32MilliSec); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_enc_ctx *pEncCtx = NULL; + venc_chn_vars *pChnVars = NULL; + VENC_CHN_STATUS_S *pChnStat = NULL; + int i = 0; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + pChnVars = pChnHandle->pChnVars; + pChnStat = &pChnVars->chnStatus; + + if (pChnVars->chnState != VENC_CHN_STATE_START_ENC) { + CVI_VENC_SYNC("chnState = %d\n", pChnVars->chnState); + return CVI_ERR_VENC_INIT; + } + + if (pChnVars->bSendFirstFrm == false) { + CVI_BOOL bCbCrInterleave = 0; + CVI_BOOL bNV21 = 0; + + switch (pstFrame->stVFrame.enPixelFormat) { + case PIXEL_FORMAT_NV12: + bCbCrInterleave = true; + bNV21 = false; + break; + case PIXEL_FORMAT_NV21: + bCbCrInterleave = true; + bNV21 = true; + break; + case PIXEL_FORMAT_YUV_PLANAR_420: + default: + bCbCrInterleave = false; + bNV21 = false; + break; + } + + _cviVencSetInPixelFormat(VeChn, bCbCrInterleave, bNV21); + + s32Ret = _cviVencAllocVbBuf(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("_cviVencAllocVbBuf\n"); + return CVI_ERR_VENC_NOBUF; + } + + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H264 || + pChnHandle->pChnAttr->stVencAttr.enType == PT_H265) { + _cviVencRegVbBuf(VeChn); + } + + pChnVars->u32FirstPixelFormat = + pstFrame->stVFrame.enPixelFormat; + pChnVars->bSendFirstFrm = true; + } else { + if (pChnVars->u32FirstPixelFormat != + pstFrame->stVFrame.enPixelFormat) { + if (pChnHandle->pChnAttr->stVencAttr.enType == + PT_H264 || + pChnHandle->pChnAttr->stVencAttr.enType == + PT_H265) { + CVI_VENC_ERR("Input enPixelFormat change\n"); + return CVI_ERR_VENC_ILLEGAL_PARAM; + } + } + } + + cviGetDebugConfigFromEncProc(); + + for (i = 0; i < 3; i++) { + pChnVars->u32Stride[i] = pstFrame->stVFrame.u32Stride[i]; + } + + pChnVars->u32SendFrameCnt++; + +#ifdef CLI_DEBUG_SUPPORT + cviCliDumpSrcYuv(VeChn, pstFrame); +#endif + + s32Ret = cviSetVencChnAttrToProc(VeChn, pstFrame); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("(chn %d) cviSetVencChnAttrToProc fail\n", VeChn); + return s32Ret; + } + pChnVars->u64TimeOfSendFrame = get_current_time(); + + if (pEncCtx->base.bVariFpsEn) { + s32Ret = cviCheckFps(pChnHandle, pstFrame); + if (s32Ret == CVI_ERR_VENC_STAT_VFPS_CHANGE) { + pChnVars->bAttrChange = CVI_TRUE; + s32Ret = cviSetChnAttr(pChnHandle); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("cviSetChnAttr, %d\n", s32Ret); + return s32Ret; + } + } else if (s32Ret < 0) { + CVI_VENC_ERR("cviCheckFps, %d\n", s32Ret); + return s32Ret; + } + + CVI_FUNC_COND(CVI_VENC_MASK_DUMP_YUV, cviDumpYuv(pstFrame)); + + s32Ret = + pEncCtx->base.encOnePic(pEncCtx, pstFrame, s32MilliSec); + if (s32Ret != CVI_SUCCESS) { + if (s32Ret == CVI_ERR_VENC_BUSY) + CVI_VENC_TRACE("encOnePic Error, s32Ret = %d\n", + s32Ret); + else + CVI_VENC_ERR("encOnePic Error, s32Ret = %d\n", + s32Ret); + return s32Ret; + } + } else { + if (pChnVars->bAttrChange == CVI_TRUE) { + s32Ret = cviSetChnAttr(pChnHandle); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("cviSetChnAttr, %d\n", s32Ret); + return s32Ret; + } + } + + s32Ret = cviCheckFrc(pChnHandle); + if (s32Ret <= 0) { + cviUpdateFrcSrc(pChnHandle); + CVI_VENC_FRC("no of encoding frames = %d\n", s32Ret); + return CVI_ERR_VENC_FRC_NO_ENC; + } + + CVI_VENC_FRC("cviUpdateFrc Curr Enable = %d\n", s32Ret); + + CVI_FUNC_COND(CVI_VENC_MASK_DUMP_YUV, cviDumpYuv(pstFrame)); + + s32Ret = + pEncCtx->base.encOnePic(pEncCtx, pstFrame, s32MilliSec); + if (s32Ret != CVI_SUCCESS) { + if (s32Ret == CVI_ERR_VENC_BUSY) + CVI_VENC_TRACE("encOnePic Error, s32Ret = %d\n", + s32Ret); + else + CVI_VENC_ERR("encOnePic Error, s32Ret = %d\n", + s32Ret); + + return s32Ret; + } + + cviUpdateFrcDst(pChnHandle); + cviUpdateFrcSrc(pChnHandle); + cviCheckFrcOverflow(pChnHandle); + } + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + pChnStat->u32LeftStreamFrames++; + pChnVars->currPTS = pstFrame->stVFrame.u64PTS; + pEncCtx->base.u64PTS = pChnVars->currPTS; + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + CVI_VENC_PERF("currPTS = %lld\n", pChnVars->currPTS); + + return s32Ret; +} + +static CVI_S32 cviCheckFps(venc_chn_context *pChnHandle, + const VIDEO_FRAME_INFO_S *pstFrame) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + venc_vfps *pVfps = &pChnVars->vfps; + const VIDEO_FRAME_S *pstVFrame = &pstFrame->stVFrame; + CVI_S32 s32Ret = CVI_SUCCESS; + CVI_S32 nextFps; + + if (pVfps->u64prevSec == 0) { + pVfps->u64prevSec = pstVFrame->u64PTS; + } else { + if (pstVFrame->u64PTS - pVfps->u64prevSec >= + pVfps->u64StatTime) { + nextFps = pVfps->s32NumFrmsInOneSec / + CVI_DEF_VFPFS_STAT_TIME; + + CVI_VENC_FRC("u64PTS = %lld, prevSec = %lld\n", + pstVFrame->u64PTS, pVfps->u64prevSec); + CVI_VENC_FRC("nextFps = %d\n", nextFps); + + cviSetFps(pChnHandle, nextFps); + + pVfps->u64prevSec = pstVFrame->u64PTS; + pVfps->s32NumFrmsInOneSec = 0; + + s32Ret = CVI_ERR_VENC_STAT_VFPS_CHANGE; + } + } + pVfps->s32NumFrmsInOneSec++; + + return s32Ret; +} + +static CVI_VOID cviSetFps(venc_chn_context *pChnHandle, CVI_S32 currFps) +{ + CVI_FR32 fr32DstFrameRate = currFps & 0xFFFF; + VENC_CHN_ATTR_S *pChnAttr; + VENC_RC_ATTR_S *prcatt; + + pChnAttr = pChnHandle->pChnAttr; + prcatt = &pChnAttr->stRcAttr; + + CVI_VENC_FRC("currFps = %d\n", currFps); + + if (pChnAttr->stVencAttr.enType == PT_H264) { + if (prcatt->enRcMode == VENC_RC_MODE_H264CBR) { + prcatt->stH264Cbr.fr32DstFrameRate = fr32DstFrameRate; + } else if (prcatt->enRcMode == VENC_RC_MODE_H264VBR) { + prcatt->stH264Vbr.fr32DstFrameRate = fr32DstFrameRate; + } else if (prcatt->enRcMode == VENC_RC_MODE_H264AVBR) { + prcatt->stH264AVbr.fr32DstFrameRate = fr32DstFrameRate; + } else if (prcatt->enRcMode == VENC_RC_MODE_H264FIXQP) { + prcatt->stH264FixQp.fr32DstFrameRate = fr32DstFrameRate; + } else if (prcatt->enRcMode == VENC_RC_MODE_H264UBR) { + prcatt->stH264Ubr.fr32DstFrameRate = fr32DstFrameRate; + } + } else if (pChnAttr->stVencAttr.enType == PT_H265) { + if (prcatt->enRcMode == VENC_RC_MODE_H265CBR) { + prcatt->stH265Cbr.fr32DstFrameRate = fr32DstFrameRate; + } else if (prcatt->enRcMode == VENC_RC_MODE_H265VBR) { + prcatt->stH265Vbr.fr32DstFrameRate = fr32DstFrameRate; + } else if (prcatt->enRcMode == VENC_RC_MODE_H265AVBR) { + prcatt->stH265AVbr.fr32DstFrameRate = fr32DstFrameRate; + } else if (prcatt->enRcMode == VENC_RC_MODE_H265FIXQP) { + prcatt->stH265FixQp.fr32DstFrameRate = fr32DstFrameRate; + } else if (prcatt->enRcMode == VENC_RC_MODE_H265UBR) { + prcatt->stH265Ubr.fr32DstFrameRate = fr32DstFrameRate; + } + } +} + +static CVI_S32 cviSetChnAttr(venc_chn_context *pChnHandle) +{ + cviVidChnAttr vidChnAttr = { 0 }; + cviJpegChnAttr jpgChnAttr = { 0 }; + CVI_S32 s32Ret = CVI_SUCCESS; + VENC_CHN_ATTR_S *pChnAttr; + VENC_ATTR_S *pVencAttr; + venc_enc_ctx *pEncCtx = NULL; + venc_chn_vars *pChnVars = NULL; + + pChnAttr = pChnHandle->pChnAttr; + pChnVars = pChnHandle->pChnVars; + pVencAttr = &pChnAttr->stVencAttr; + pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + + if (pVencAttr->enType == PT_H265 || pVencAttr->enType == PT_H264) { + s32Ret = _cvi_h26x_trans_chn_attr(pChnHandle->pChnAttr, + &vidChnAttr); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("h26x trans_chn_attr fail, %d\n", s32Ret); + goto CHECK_RC_ATTR_RET; + } + + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_CHN_ATTR, + (CVI_VOID *)&vidChnAttr); + } else if (pVencAttr->enType == PT_MJPEG || + pVencAttr->enType == PT_JPEG) { + s32Ret = _cvi_jpg_trans_chn_attr(pChnHandle->pChnAttr, + &jpgChnAttr); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("mjpeg trans_chn_attr fail, %d\n", s32Ret); + goto CHECK_RC_ATTR_RET; + } + + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_JPEG_OP_SET_CHN_ATTR, + (CVI_VOID *)&jpgChnAttr); + } + + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "CVI_H26X_OP_SET_CHN_ATTR or CVI_JPEG_OP_SET_CHN_ATTR, %d\n", + s32Ret); + goto CHECK_RC_ATTR_RET; + } + + s32Ret = cviCheckRcModeAttr(pChnHandle); // RC side framerate control + +CHECK_RC_ATTR_RET: + pChnVars->bAttrChange = CVI_FALSE; + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("cviCheckRcModeAttr fail, %d\n", s32Ret); + return s32Ret; + } + + s32Ret = cviCheckGopAttr(pChnHandle); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("cviCheckGopAttr fail, %d\n", s32Ret); + return s32Ret; + } + + return s32Ret; +} + +static CVI_S32 cviCheckFrc(venc_chn_context *pChnHandle) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + venc_frc *pvf = &pChnVars->frc; + CVI_S32 ifEncode = 1; + + if (pvf->bFrcEnable) { + if (pvf->srcTs < pvf->dstTs) { + ifEncode = 0; + } + } + + CVI_VENC_FRC("srcTs = %d, dstTs = %d, ifEncode = %d\n", + pvf->srcTs, pvf->dstTs, ifEncode); + return ifEncode; +} + +static CVI_S32 cviUpdateFrcDst(venc_chn_context *pChnHandle) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + venc_frc *pvf = &pChnVars->frc; + + if (pvf->bFrcEnable) { + if (pvf->srcTs >= pvf->dstTs) { + pvf->dstTs += pvf->dstFrameDur; + } + } + + CVI_VENC_FRC("pvf->bFrcEnable = %d\n", pvf->bFrcEnable); + return pvf->bFrcEnable; +} + +static CVI_S32 cviUpdateFrcSrc(venc_chn_context *pChnHandle) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + venc_frc *pvf = &pChnVars->frc; + + if (pvf->bFrcEnable) { + pvf->srcTs += pvf->srcFrameDur; + } + + CVI_VENC_FRC("pvf->bFrcEnable = %d\n", pvf->bFrcEnable); + return pvf->bFrcEnable; +} + +static CVI_VOID cviCheckFrcOverflow(venc_chn_context *pChnHandle) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + venc_frc *pvf = &pChnVars->frc; + + if (pvf->srcTs >= FRC_TIME_OVERFLOW_OFFSET && + pvf->dstTs >= FRC_TIME_OVERFLOW_OFFSET) { + pvf->srcTs -= FRC_TIME_OVERFLOW_OFFSET; + pvf->dstTs -= FRC_TIME_OVERFLOW_OFFSET; + } +} + +CVI_S32 CVI_VENC_SendFrameEx(VENC_CHN VeChn, + const USER_FRAME_INFO_S *pstUserFrame, + CVI_S32 s32MilliSec) +{ + const VIDEO_FRAME_INFO_S *pstFrame = &pstUserFrame->stUserFrame; + cviUserRcInfo userRcInfo, *puri = &userRcInfo; + venc_chn_context *pChnHandle = NULL; + venc_chn_vars *pChnVars = NULL; + venc_enc_ctx *pEncCtx = NULL; + CVI_S32 s32Ret = CVI_SUCCESS; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + pEncCtx = &pChnHandle->encCtx; + + memcpy(&pChnVars->stUserRcInfo, &pstUserFrame->stUserRcInfo, + sizeof(USER_RC_INFO_S)); + + puri->bQpMapValid = pChnVars->stUserRcInfo.bQpMapValid; + puri->bRoiBinValid = pChnVars->stUserRcInfo.bRoiBinValid; + puri->roideltaqp = pChnVars->stUserRcInfo.roideltaqp; + puri->u64QpMapPhyAddr = pChnVars->stUserRcInfo.u64QpMapPhyAddr; + + CVI_VENC_CFG("bQpMapValid = %d\n", puri->bQpMapValid); + CVI_VENC_CFG("u64QpMapPhyAddr = 0x%llX\n", puri->u64QpMapPhyAddr); + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_USER_RC_INFO, + (CVI_VOID *)puri); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_SET_USER_RC_INFO, %X\n", s32Ret); + return s32Ret; + } + + s32Ret = CVI_VENC_SendFrame(VeChn, pstFrame, s32MilliSec); + + return s32Ret; +} + +static CVI_S32 cviOpenDumpYuv(CVI_VOID) +{ + return 0; +} + +static CVI_S32 cviDumpYuv(const VIDEO_FRAME_INFO_S *pstFrame) +{ + return 0; +} + +static CVI_S32 _cviVencUpdateVbConf(venc_chn_context *pChnHandle, + cviVbVencBufConfig *pVbVencCfg, + int VbSetFrameBufSize, int VbSetFrameBufCnt) +{ + int j = 0; + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + + for (j = 0; j < VbSetFrameBufCnt; j++) { + CVI_U64 u64PhyAddr; + + pChnVars->vbBLK[j] = + vb_get_block_with_id(pChnVars->vbpool.hPicVbPool, + VbSetFrameBufSize, CVI_ID_VENC); + if (pChnVars->vbBLK[j] == VB_INVALID_HANDLE) { + //not enough size in VB or VB pool not create + CVI_VENC_ERR( + "Not enough size in VB or VB pool Not create\n"); + return CVI_ERR_VENC_NOMEM; + } + + u64PhyAddr = vb_handle2PhysAddr(pChnVars->vbBLK[j]); + pChnVars->FrmArray[j].phyAddr = u64PhyAddr; + pChnVars->FrmArray[j].size = VbSetFrameBufSize; + pChnVars->FrmArray[j].virtAddr = + vb_handle2VirtAddr(pChnVars->vbBLK[j]); + pVbVencCfg->vbModeAddr[j] = u64PhyAddr; + } + + pChnVars->FrmNum = VbSetFrameBufCnt; + pVbVencCfg->VbSetFrameBufCnt = VbSetFrameBufCnt; + pVbVencCfg->VbSetFrameBufSize = VbSetFrameBufSize; + + return CVI_SUCCESS; +} + +static CVI_S32 _cviVencAllocVbBuf(VENC_CHN VeChn) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_context *pVencHandle = handle; + venc_chn_context *pChnHandle = NULL; + VENC_CHN_ATTR_S *pChnAttr = NULL; + VENC_ATTR_S *pVencAttr = NULL; + venc_enc_ctx *pEncCtx = NULL; + venc_chn_vars *pChnVars = NULL; + VB_SOURCE_E eVbSource; + cviVbVencBufConfig cviVbVencCfg; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + if (pVencHandle == NULL) { + CVI_VENC_ERR( + "p_venctx_handle NULL (Channel not create yet..)\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnAttr = pChnHandle->pChnAttr; + pChnVars = pChnHandle->pChnVars; + pEncCtx = &pChnHandle->encCtx; + pVencAttr = &pChnAttr->stVencAttr; + + if (pVencAttr->enType == PT_H264) { + CVI_VENC_TRACE("pt_h264 stH264eModParam\n"); + eVbSource = + pVencHandle->ModParam.stH264eModParam.enH264eVBSource; + } else if (pVencAttr->enType == PT_H265) { + CVI_VENC_TRACE("pt_h265 stH265eModParam\n"); + eVbSource = + pVencHandle->ModParam.stH265eModParam.enH265eVBSource; + } else { + CVI_VENC_TRACE("none H26X\n"); + eVbSource = VB_SOURCE_COMMON; + } + + CVI_VENC_TRACE("type[%d] eVbSource[%d]\n", pVencAttr->enType, + eVbSource); + + memset(&cviVbVencCfg, 0, sizeof(cviVbVencBufConfig)); + cviVbVencCfg.VbType = VB_SOURCE_COMMON; + + if (eVbSource == VB_SOURCE_PRIVATE) { + CVI_VENC_TRACE("enter private vb mode\n"); + if (pChnVars->bHasVbPool == CVI_FALSE) { + struct cvi_vb_pool_cfg stVbPoolCfg; + + //step1 get vb info from vpu driver: calculate the buffersize and buffer count + s32Ret = pEncCtx->base.ioctl(pEncCtx, + CVI_H26X_OP_GET_VB_INFO, + (CVI_VOID *)&cviVbVencCfg); + + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_GET_VB_INFO, %d\n", + s32Ret); + return s32Ret; + } + + CVI_VENC_TRACE("private mode get vb info ---\n"); + CVI_VENC_TRACE( + "Chn[%d]get vb info FrameBufferSize[%d] FrameBufferCnt[%d]\n", + VeChn, cviVbVencCfg.VbGetFrameBufSize, + cviVbVencCfg.VbGetFrameBufCnt); + + stVbPoolCfg.blk_size = cviVbVencCfg.VbGetFrameBufSize; + stVbPoolCfg.blk_cnt = cviVbVencCfg.VbGetFrameBufCnt; + stVbPoolCfg.remap_mode = VB_REMAP_MODE_NONE; + if (vb_create_pool(&stVbPoolCfg) == 0) { + pChnVars->vbpool.hPicVbPool = + stVbPoolCfg.pool_id; + } + pChnVars->bHasVbPool = CVI_TRUE; + s32Ret = _cviVencUpdateVbConf( + pChnHandle, &cviVbVencCfg, + cviVbVencCfg.VbGetFrameBufSize, + cviVbVencCfg.VbGetFrameBufCnt); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("_cviVencUpdateVbConf, %d\n", + s32Ret); + return s32Ret; + } + + cviVbVencCfg.VbType = VB_SOURCE_PRIVATE; + } + } else if (eVbSource == VB_SOURCE_USER) { + struct cvi_vb_cfg pstVbConfig; + CVI_S32 s32UserSetupFrmCnt; + CVI_S32 s32UserSetupFrmSize; + //step1 get vb info from vpu driver: calculate the buffersize and buffer count + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_GET_VB_INFO, + (CVI_VOID *)&cviVbVencCfg); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_GET_VB_INFO, %d\n", s32Ret); + return s32Ret; + } + + //totally setup by user vbpool id, if not been attachVB return failure + if (pChnVars->bHasVbPool == CVI_FALSE) { + CVI_VENC_ERR("[error][%s][%d]\n", __func__, __LINE__); + CVI_VENC_ERR("Not attach vb pool for channel[%d]\n", + VeChn); + return CVI_ERR_VENC_NOT_SUPPORT; + } +//check the VB config and compare with VPU requirement + s32Ret = vb_get_config(&pstVbConfig); + if (s32Ret == CVI_SUCCESS) { + CVI_VENC_TRACE( + "max pool cnt[%d] currentPoolId[%d] blksize[%d] blkcnt[%d]\n", + pstVbConfig.comm_pool_cnt, + pChnVars->vbpool.hPicVbPool, + pstVbConfig + .comm_pool[pChnVars->vbpool.hPicVbPool] + .blk_size, + pstVbConfig + .comm_pool[pChnVars->vbpool.hPicVbPool] + .blk_cnt); + if ((int)pstVbConfig + .comm_pool[pChnVars->vbpool.hPicVbPool] + .blk_size < + cviVbVencCfg.VbGetFrameBufSize) { + CVI_VENC_WARN( + "[Warning] create size is smaller than require size\n"); + } + if ((int)pstVbConfig + .comm_pool[pChnVars->vbpool.hPicVbPool] + .blk_size < cviVbVencCfg.VbGetFrameBufCnt) { + CVI_VENC_WARN( + "[Warning] create blk is smaller than require blk\n"); + } + } else + CVI_VENC_ERR("Error while CVI_VB_GetConfig\n"); + + CVI_VENC_TRACE("[required] size[%d] cnt[%d]\n", + cviVbVencCfg.VbGetFrameBufSize, + cviVbVencCfg.VbGetFrameBufCnt); + CVI_VENC_TRACE( + "[user set] size[%d] cnt[%d]\n", + pstVbConfig.comm_pool[pChnVars->vbpool.hPicVbPool] + .blk_size, + pstVbConfig.comm_pool[pChnVars->vbpool.hPicVbPool] + .blk_cnt); + + s32UserSetupFrmSize = + pstVbConfig.comm_pool[pChnVars->vbpool.hPicVbPool] + .blk_size; + //s32UserSetupFrmCnt = pstVbConfig.comm_pool[pChnHandle->vbpool.hPicVbPool].u32BlkCnt; + if (s32UserSetupFrmSize < cviVbVencCfg.VbGetFrameBufSize) { + CVI_VENC_WARN( + "Buffer size too small for frame buffer : user mode VB pool[%d] < [%d]n", + pstVbConfig + .comm_pool[pChnVars->vbpool.hPicVbPool] + .blk_size, + cviVbVencCfg.VbGetFrameBufSize); + } + + s32UserSetupFrmCnt = cviVbVencCfg.VbGetFrameBufCnt; + s32UserSetupFrmSize = cviVbVencCfg.VbGetFrameBufSize; + s32Ret = _cviVencUpdateVbConf(pChnHandle, &cviVbVencCfg, + s32UserSetupFrmSize, + s32UserSetupFrmCnt); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("_cviVencUpdateVbConf, %d\n", s32Ret); + return s32Ret; + } + cviVbVencCfg.VbType = VB_SOURCE_USER; + } + + if (pEncCtx->base.ioctl) { + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_VB_BUFFER, + (CVI_VOID *)&cviVbVencCfg); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_SET_VB_BUFFER, %d\n", s32Ret); + return s32Ret; + } + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_StartRecvFrame(VENC_CHN VeChn, + const VENC_RECV_PIC_PARAM_S *pstRecvParam) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_startrecvframe(VeChn, pstRecvParam); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_enc_ctx *pEncCtx = NULL; + venc_chn_vars *pChnVars = NULL; + struct cvi_venc_vb_ctx *pVbCtx = NULL; + VENC_ATTR_S *pVencAttr = NULL; + + CVI_VENC_API("VeChn = %d, s32RecvPicNum = %d\n", VeChn, + pstRecvParam->s32RecvPicNum); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + pEncCtx = &pChnHandle->encCtx; + pVbCtx = pChnHandle->pVbCtx; + pVencAttr = &pChnHandle->pChnAttr->stVencAttr; + + pChnVars->s32RecvPicNum = pstRecvParam->s32RecvPicNum; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + + s32Ret = cviSetRcParamToDrv(pChnHandle); + if (s32Ret < 0) { + CVI_VENC_ERR("cviSetRcParamToDrv\n"); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + return s32Ret; + } + + s32Ret = cviSetCuPredToDrv(pChnHandle); + if (s32Ret < 0) { + CVI_VENC_ERR("cviSetCuPredToDrv\n"); + return s32Ret; + } + + if (pEncCtx->base.ioctl) { + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265 || + pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) { + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_START, NULL); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_START, %d\n", s32Ret); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + return -1; + } + } else { + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_JPEG_OP_START, + (CVI_VOID *)&pChnHandle->pChnAttr->stVencAttr.bIsoSendFrmEn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_JPEG_OP_START, %d\n", s32Ret); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + return -1; + } + } + } + + pChnVars->chnState = VENC_CHN_STATE_START_ENC; + handle->chn_status[VeChn] = VENC_CHN_STATE_START_ENC; + + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (IF_WANNA_ENABLE_BIND_MODE()) { + struct sched_param param = { + .sched_priority = 95, + }; + + pVbCtx->currBindMode = CVI_TRUE; + pChnHandle->bChnEnable = CVI_TRUE; + if (!pVbCtx->thread) { + if (pVencAttr->bIsoSendFrmEn && + (pVencAttr->enType == PT_H264 || pVencAttr->enType == PT_H265)) { + pVbCtx->thread = kthread_run(h26x_event_handler, + (CVI_VOID *)pChnHandle, + "cvitask_vc_bh%d", VeChn); + } else { + pVbCtx->thread = kthread_run(venc_event_handler, + (CVI_VOID *)pChnHandle, + "venc-handler%d", VeChn); + } + + if (IS_ERR(pVbCtx->thread)) { + CVI_VENC_ERR( + "failed to create venc binde mode thread for chn %d\n", + VeChn); + return CVI_FAILURE; + } + sched_setscheduler(pVbCtx->thread, SCHED_RR, ¶m); + SEMA_POST(&pChnVars->sem_send); + } + } + + CVI_VENC_SYNC("VENC_CHN_STATE_START_ENC\n"); + return s32Ret; +} + +CVI_S32 CVI_VENC_StopRecvFrame(VENC_CHN VeChn) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_stoprecvframe(VeChn); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + struct cvi_venc_vb_ctx *pVbCtx = NULL; + venc_chn_vars *pChnVars = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + pVbCtx = pChnHandle->pVbCtx; + + if (IF_WANNA_DISABLE_BIND_MODE()) { + SEMA_POST(&pChnVars->sem_release); + pChnHandle->bChnEnable = CVI_FALSE; + SEMA_POST(&pVbCtx->vb_jobs.sem); + kthread_stop(pVbCtx->thread); + pVbCtx->thread = NULL; + pVbCtx->currBindMode = CVI_FALSE; + SEMA_POST(&pChnVars->sem_send); + CVI_VENC_SYNC("venc_event_handler end\n"); + } + + pChnVars->chnState = VENC_CHN_STATE_STOP_ENC; + handle->chn_status[VeChn] = VENC_CHN_STATE_STOP_ENC; + + return s32Ret; +} + +/** + * @brief Query the current channel status of encoder + * @param[in] VeChn VENC Channel Number. + * @param[out] pstStatus Current channel status of encoder + * @retval 0 Success + * @retval Non-0 Failure, Please see the error code table + */ +CVI_S32 CVI_VENC_QueryStatus(VENC_CHN VeChn, VENC_CHN_STATUS_S *pstStatus) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_querystatus(VeChn, pstStatus); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + VENC_ATTR_S *pVencAttr = NULL; + VENC_CHN_STATUS_S *pChnStat = NULL; + venc_chn_vars *pChnVars = NULL; + VENC_CHN_ATTR_S *pChnAttr = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + pChnAttr = pChnHandle->pChnAttr; + pChnStat = &pChnVars->chnStatus; + pVencAttr = &pChnAttr->stVencAttr; + + memcpy(pstStatus, pChnStat, sizeof(VENC_CHN_STATUS_S)); + + pstStatus->u32CurPacks = _cviGetNumPacks(pVencAttr->enType); + + return s32Ret; +} + +static CVI_S32 updateStreamPackInBindMode(venc_chn_context *pChnHandle, + venc_chn_vars *pChnVars, + VENC_STREAM_S *pstStream) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + CVI_U32 idx = 0; + + if (pChnVars->s32BindModeGetStreamRet != CVI_SUCCESS) { + CVI_VENC_ERR("bind mode get stream error: 0x%X\n", + pChnVars->s32BindModeGetStreamRet); + return pChnVars->s32BindModeGetStreamRet; + } + + if (!pChnVars->stStream.pstPack) { + CVI_VENC_ERR("pChnVars->stStream.pstPack is NULL\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + s32Ret = cviCheckLeftStreamFrames(pChnHandle); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_WARN("cviCheckLeftStreamFrames, s32Ret = 0x%X\n", + s32Ret); + return s32Ret; + } + + pstStream->u32PackCount = pChnVars->stStream.u32PackCount; + for (idx = 0; idx < pstStream->u32PackCount; idx++) { + VENC_PACK_S *ppack = &pstStream->pstPack[idx]; + + memcpy(ppack, &pChnVars->stStream.pstPack[idx], + sizeof(VENC_PACK_S)); + ppack->u64PTS = pChnVars->currPTS; + } + CVI_VENC_PERF("currPTS = %lld\n", pChnVars->currPTS); + + return s32Ret; +} + +static CVI_S32 cviVenc_sem_timedwait_Millsecs(struct semaphore *sem, long msecs) +{ + int ret; + CVI_S32 s32RetStatus; + + if (msecs < 0) + ret = SEMA_WAIT(sem); + else if (msecs == 0) + ret = SEMA_TRYWAIT(sem); + else + ret = SEMA_TIMEWAIT(sem, usecs_to_jiffies(msecs * 1000)); + + if (ret == 0) { + CVI_VENC_TRACE("sem_wait success in time[%ld]\n", msecs); + s32RetStatus = CVI_SUCCESS; + } else { + if (ret > 0) { + CVI_VENC_TRACE("sem SEMA_TRYWAIT fail in time[%ld]\n", + msecs); + s32RetStatus = CVI_ERR_VENC_BUSY; + } else if (ret == -EINTR) { + CVI_VENC_ERR("sem_wait interrupt by SIG\n"); + s32RetStatus = CVI_FAILURE; + } else if (ret == -ETIME) { + CVI_VENC_TRACE("sem ETIMEDOUT[%ld]\n", msecs); + s32RetStatus = CVI_ERR_VENC_BUSY; + } else { + CVI_VENC_ERR("sem unexpected errno[%d]time[%ld]\n", ret, + msecs); + s32RetStatus = CVI_FAILURE; + } + } + return s32RetStatus; +} + +/** + * @brief Get encoded bitstream + * @param[in] VeChn VENC Channel Number. + * @param[out] pstStream pointer to VIDEO_FRAME_INFO_S. + * @param[in] S32MilliSec TODO VENC + * @retval 0 Success + * @retval Non-0 Failure, please see the error code table + */ +CVI_S32 CVI_VENC_GetStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, + CVI_S32 S32MilliSec) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_getstream(VeChn, pstStream, S32MilliSec); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_enc_ctx *pEncCtx = NULL; + venc_chn_vars *pChnVars = NULL; + CVI_U64 getStream_e; + VENC_CHN_ATTR_S *pChnAttr; + CVI_U64 getStream_s = get_current_time(); + struct cvi_venc_vb_ctx *pVbCtx = NULL; + VENC_ATTR_S *pVencAttr = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + pChnVars = pChnHandle->pChnVars; + pChnAttr = pChnHandle->pChnAttr; + pVbCtx = pChnHandle->pVbCtx; + pVencAttr = &pChnAttr->stVencAttr; + + if (pChnHandle->bSbSkipFrm == true) { + //CVI_VENC_ERR("SbSkipFrm\n"); + return CVI_ERR_VENC_BUSY; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) && defined(__riscv) + pstStream->pstPack = vmalloc(sizeof(VENC_PACK_S) * _cviGetNumPacks(pChnAttr->stVencAttr.enType)); + if (pstStream->pstPack == NULL) + return CVI_ERR_VENC_NOMEM; +#endif + + if (!pVencAttr->bIsoSendFrmEn && pVbCtx->currBindMode == CVI_TRUE) { + CVI_VENC_TRACE("wait encode done\n"); + //sem_wait(&pChnVars->sem_send); + + s32Ret = cviVenc_sem_timedwait_Millsecs(&pChnVars->sem_send, + S32MilliSec); + if (s32Ret == CVI_FAILURE) { + CVI_VENC_ERR("sem wait error\n"); + return CVI_ERR_VENC_MUTEX_ERROR; + + } else if (s32Ret == CVI_ERR_VENC_BUSY) { + CVI_VENC_TRACE("sem wait timeout\n"); + return s32Ret; + } + + s32Ret = updateStreamPackInBindMode(pChnHandle, pChnVars, + pstStream); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "updateStreamPackInBindMode fail, s32Ret = 0x%X\n", + s32Ret); + return s32Ret; + } + + cviUpdateChnStatus(pChnHandle); + +#ifdef CLI_DEBUG_SUPPORT + cviGetMaxBitstreamSize(VeChn, pstStream); + cviDumpVencBitstream(VeChn, pstStream, + pChnAttr->stVencAttr.enType); +#endif + + return CVI_SUCCESS; + } + + s32Ret = pEncCtx->base.getStream(pEncCtx, pstStream, S32MilliSec); + + if (s32Ret != CVI_SUCCESS) { + if ((S32MilliSec >= 0) && (s32Ret == CVI_ERR_VENC_BUSY)) { + //none block mode: timeout + CVI_VENC_TRACE("Non-blcok mode timeout\n"); + } else { + //block mode + if (s32Ret != CVI_ERR_VENC_EMPTY_STREAM_FRAME) + CVI_VENC_ERR("getStream, s32Ret = %d\n", s32Ret); + } + + return s32Ret; + } + + s32Ret = cviProcessResult(pChnHandle, pstStream); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("(chn %d) cviProcessResult fail\n", VeChn); + return s32Ret; + } + + getStream_e = get_current_time(); + pChnVars->totalTime += (getStream_e - pChnVars->u64TimeOfSendFrame); + CVI_VENC_DEBUG( + "send frame timestamp = 0x%llx, enc time = 0x%llx (0x%llx + 0x%llx)ms, total time = 0x%llx\n", + (pChnVars->u64TimeOfSendFrame), + (getStream_e - pChnVars->u64TimeOfSendFrame), + (getStream_s - pChnVars->u64TimeOfSendFrame), + (getStream_e - getStream_s), pChnVars->totalTime); + + CVI_FUNC_COND(CVI_VENC_MASK_DUMP_BS, + cviDumpBs(pstStream, pChnAttr->stVencAttr.enType)); + +#ifdef CLI_DEBUG_SUPPORT + cviDumpVencBitstream(VeChn, pstStream, pChnAttr->stVencAttr.enType); +#endif + + cviUpdateChnStatus(pChnHandle); + + if (pChnHandle->sbm_state == VENC_SBM_STATE_FRM_RUN) + pChnHandle->sbm_state = VENC_SBM_STATE_IDLE; + + return s32Ret; +} + +static CVI_S32 cviCheckLeftStreamFrames(venc_chn_context *pChnHandle) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + VENC_CHN_STATUS_S *pChnStat = &pChnVars->chnStatus; + CVI_S32 s32Ret = CVI_SUCCESS; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + if (pChnStat->u32LeftStreamFrames <= 0) { + CVI_VENC_WARN( + "u32LeftStreamFrames <= 0, no stream data to get\n"); + s32Ret = CVI_ERR_VENC_EMPTY_STREAM_FRAME; + } + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + return s32Ret; +} + + +CVI_S32 cviGetLeftStreamFrames(CVI_S32 VeChn) +{ + venc_chn_context *pChnHandle = NULL; + venc_chn_vars *pChnVars = NULL; + VENC_CHN_STATUS_S *pChnStat = NULL; + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + pChnStat = &pChnVars->chnStatus; + + return pChnStat->u32LeftStreamFrames; +} + +static CVI_S32 cviProcessResult(venc_chn_context *pChnHandle, + VENC_STREAM_S *pstStream) +{ + venc_chn_vars *pChnVars = NULL; + VENC_CHN_ATTR_S *pChnAttr; + VENC_ATTR_S *pVencAttr; + CVI_S32 s32Ret = CVI_SUCCESS; + + pChnVars = pChnHandle->pChnVars; + pChnAttr = pChnHandle->pChnAttr; + pVencAttr = &pChnAttr->stVencAttr; + + pChnVars->u32GetStreamCnt++; + s32Ret = cviSetVencPerfAttrToProc(pChnHandle); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("(chn %d) cviSetVencPerfAttrToProc fail\n", + pChnHandle->VeChn); + return s32Ret; + } + + if (pVencAttr->enType == PT_JPEG || pVencAttr->enType == PT_MJPEG) { + CVI_U32 i = 0; + + for (i = 0; i < pstStream->u32PackCount; i++) { + VENC_PACK_S *ppack = &pstStream->pstPack[i]; + int j; + + for (j = (ppack->u32Len - ppack->u32Offset - 1); j > 0; + j--) { + unsigned char *tmp_ptr = + ppack->pu8Addr + ppack->u32Offset + j; + if (tmp_ptr[0] == 0xd9 && tmp_ptr[-1] == 0xff) { + break; + } + } + ppack->u32Len = ppack->u32Offset + j + 1; + } + } + + return s32Ret; +} + +static CVI_VOID cviUpdateChnStatus(venc_chn_context *pChnHandle) +{ + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + VENC_CHN_STATUS_S *pChnStat = &pChnVars->chnStatus; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return; + } + + pChnStat->stVencStrmInfo.u32MeanQp = + pEncCtx->ext.vid.streamInfo.u32MeanQp; + pChnStat->u32LeftStreamFrames--; + + CVI_VENC_TRACE("LeftStreamFrames = %d, u32MeanQp = %d\n", + pChnStat->u32LeftStreamFrames, + pChnStat->stVencStrmInfo.u32MeanQp); + + MUTEX_UNLOCK(&pChnHandle->chnMutex); +} + +static CVI_S32 cviOpenDumpBs(CVI_VOID) +{ + return 0; +} + +static CVI_S32 cviDumpBs(VENC_STREAM_S *pstStream, PAYLOAD_TYPE_E enType) +{ + return 0; +} + +CVI_S32 CVI_VENC_ReleaseStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_releasestream(VeChn, pstStream); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_enc_ctx *pEncCtx = NULL; + VENC_CHN_ATTR_S *pChnAttr; + venc_chn_vars *pChnVars = NULL; + struct cvi_venc_vb_ctx *pVbCtx = NULL; + VENC_ATTR_S *pVencAttr; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + pChnVars = pChnHandle->pChnVars; + pVbCtx = pChnHandle->pVbCtx; + pChnAttr = pChnHandle->pChnAttr; + pVencAttr = &pChnAttr->stVencAttr; + + if (!pVencAttr->bIsoSendFrmEn && pVbCtx->currBindMode == CVI_TRUE) { + CVI_VENC_TRACE("[%d]post release\n", pChnVars->frameIdx); + SEMA_POST(&pChnVars->sem_release); + } else { + s32Ret = pEncCtx->base.releaseStream(pEncCtx, pstStream); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("releaseStream, s32Ret = %d\n", s32Ret); + return s32Ret; + } + } + + pChnVars->frameIdx++; + CVI_VENC_API("frameIdx = %d\n", pChnVars->frameIdx); + + if (pChnHandle->jpgFrmSkipCnt) { + pChnHandle->jpgFrmSkipCnt--; + CVI_VENC_TRACE("chn%d: jpgFrmSkipCnt = %d\n", VeChn, pChnHandle->jpgFrmSkipCnt); + } + + cviChangeMask(pChnVars->frameIdx); + + return s32Ret; +} + +static CVI_VOID cviChangeMask(CVI_S32 frameIdx) +{ + venc_dbg *pDbg = &vencDbg; + + pDbg->currMask = pDbg->dbgMask; + if (pDbg->startFn >= 0) { + if (frameIdx >= pDbg->startFn && frameIdx <= pDbg->endFn) + pDbg->currMask = pDbg->dbgMask; + else + pDbg->currMask = CVI_VENC_MASK_ERR; + } + + CVI_VENC_TRACE("currMask = 0x%X\n", pDbg->currMask); +} + +static CVI_S32 cviSetVencChnAttrToProc(VENC_CHN VeChn, + const VIDEO_FRAME_INFO_S *pstFrame) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_vars *pChnVars = NULL; + venc_chn_context *pChnHandle = NULL; + CVI_U64 u64CurTime = get_current_time(); + + CVI_VENC_TRACE("\n"); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + if (pstFrame == NULL) { + CVI_VENC_ERR("pstFrame is NULL\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + + if (MUTEX_LOCK(&pChnHandle->chnShmMutex) != 0) { + CVI_VENC_ERR("can not lock chnShmMutex\n"); + return CVI_FAILURE; + } + memcpy(&pChnVars->stFrameInfo, pstFrame, sizeof(VIDEO_FRAME_INFO_S)); + if ((u64CurTime - pChnVars->u64LastSendFrameTimeStamp) > SEC_TO_MS) { + pChnVars->stFPS.u32InFPS = + (CVI_U32)((pChnVars->u32SendFrameCnt * SEC_TO_MS) / + (CVI_U32)(u64CurTime - + pChnVars->u64LastSendFrameTimeStamp)); + pChnVars->u64LastSendFrameTimeStamp = u64CurTime; + pChnVars->u32SendFrameCnt = 0; + } + MUTEX_UNLOCK(&pChnHandle->chnShmMutex); + + return s32Ret; +} + +static CVI_S32 cviSetVencPerfAttrToProc(venc_chn_context *pChnHandle) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_vars *pChnVars = NULL; + venc_enc_ctx *pEncCtx = NULL; + CVI_U64 u64CurTime = get_current_time(); + + CVI_VENC_TRACE("\n"); + + pChnVars = pChnHandle->pChnVars; + pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnShmMutex) != 0) { + CVI_VENC_ERR("can not lock chnShmMutex\n"); + return CVI_FAILURE; + } + if ((u64CurTime - pChnVars->u64LastGetStreamTimeStamp) > SEC_TO_MS) { + pChnVars->stFPS.u32OutFPS = + (CVI_U32)((pChnVars->u32GetStreamCnt * SEC_TO_MS) / + ((CVI_U32)(u64CurTime - + pChnVars->u64LastGetStreamTimeStamp))); + pChnVars->u64LastGetStreamTimeStamp = u64CurTime; + pChnVars->u32GetStreamCnt = 0; + } + pChnVars->stFPS.u64HwTime = pEncCtx->base.u64EncHwTime; + MUTEX_UNLOCK(&pChnHandle->chnShmMutex); + + return s32Ret; +} + +static CVI_VOID cviGetDebugConfigFromEncProc(void) +{ + extern proc_debug_config_t tVencDebugConfig; + proc_debug_config_t *ptEncProcDebugConfig = &tVencDebugConfig; + venc_dbg *pDbg = &vencDbg; + + CVI_VENC_TRACE("\n"); + + if (ptEncProcDebugConfig == NULL) { + CVI_VENC_ERR("ptEncProcDebugConfig is NULL\n"); + return; + } + + memset(pDbg, 0, sizeof(venc_dbg)); + + pDbg->dbgMask = ptEncProcDebugConfig->u32DbgMask; + if (pDbg->dbgMask == CVI_VENC_NO_INPUT || + pDbg->dbgMask == CVI_VENC_INPUT_ERR) + pDbg->dbgMask = CVI_VENC_MASK_ERR; + else + pDbg->dbgMask |= CVI_VENC_MASK_ERR; + + pDbg->currMask = pDbg->dbgMask; + pDbg->startFn = ptEncProcDebugConfig->u32StartFrmIdx; + pDbg->endFn = ptEncProcDebugConfig->u32EndFrmIdx; + strcpy(pDbg->dbgDir, ptEncProcDebugConfig->cDumpPath); + pDbg->noDataTimeout = ptEncProcDebugConfig->u32NoDataTimeout; + + CVI_FUNC_COND(CVI_VENC_MASK_DUMP_YUV, cviOpenDumpYuv()); + CVI_FUNC_COND(CVI_VENC_MASK_DUMP_BS, cviOpenDumpBs()); + + cviChangeMask(0); +} + +/** + * @brief Destroy One VENC Channel. + * @param[in] VeChn VENC Channel Number. + * @retval 0 Success + * @retval Non-0 Failure, please see the error code table + */ +CVI_S32 CVI_VENC_DestroyChn(VENC_CHN VeChn) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_destroychn(VeChn); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_sbm_context *pSbmHandle = NULL; + venc_enc_ctx *pEncCtx = NULL; + venc_chn_vars *pChnVars = NULL; + struct cvi_venc_vb_ctx *pVbCtx = NULL; + MMF_CHN_S chn = { .enModId = CVI_ID_VENC, + .s32DevId = 0, + .s32ChnId = 0}; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pSbmHandle = &handle->sbm_context; + pEncCtx = &pChnHandle->encCtx; + pChnVars = pChnHandle->pChnVars; + pVbCtx = pChnHandle->pVbCtx; + + chn.s32ChnId = pChnHandle->VeChn; + base_mod_jobs_exit(chn, CHN_TYPE_IN); + + pChnHandle->sbm_state = VENC_SBM_STATE_CHN_CLOSED; + + if (pSbmHandle->pSBMSendFrameThread) { + VENC_CHN_STATUS_S stStat; + VENC_STREAM_S stStream = {0}; + CVI_S32 s32IsNotNeedSkip; + + s32IsNotNeedSkip = _cviVEncSbGetSkipFrmStatus(&pChnHandle->stSbSetting); + + if (!s32IsNotNeedSkip) { + s32Ret = cvi_VENC_CB_SkipFrame(0, 0, pChnHandle->pChnAttr->stVencAttr.u32PicHeight, 1000); + + if (s32Ret == CVI_SUCCESS) { + s32Ret = CVI_VENC_QueryStatus(VeChn, &stStat); + + s32Ret = CVI_VENC_GetStream(VeChn, &stStream, 1000); + + if (s32Ret == CVI_SUCCESS) + CVI_VENC_ReleaseStream(VeChn, &stStream); + + if (stStream.pstPack) + MEM_FREE(stStream.pstPack); + } + } + } + + cviSetSBMEnable(pChnHandle, CVI_FALSE); + s32Ret = pEncCtx->base.close(pEncCtx); + + SEMA_DESTROY(&pChnVars->sem_send); + SEMA_DESTROY(&pChnVars->sem_release); + + if (pChnVars->bHasVbPool == CVI_TRUE && + (pChnHandle->pChnAttr->stVencAttr.enType == PT_H264 || + pChnHandle->pChnAttr->stVencAttr.enType == PT_H265)) { + CVI_U32 i = 0; + VB_SOURCE_E eVbSource; + + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) { + CVI_VENC_TRACE("pt_h264 stH264eModParam\n"); + eVbSource = + handle->ModParam.stH264eModParam.enH264eVBSource; + } else if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265) { + CVI_VENC_TRACE("pt_h265 stH265eModParam\n"); + eVbSource = + handle->ModParam.stH265eModParam.enH265eVBSource; + } else { + CVI_VENC_TRACE("none H26X\n"); + eVbSource = VB_SOURCE_COMMON; + } + + for (i = 0; i < pChnVars->FrmNum; i++) { + VB_BLK blk; + + blk = vb_physAddr2Handle( + pChnVars->FrmArray[i].phyAddr); + if (blk != VB_INVALID_HANDLE) + vb_release_block(blk); + } + + if (eVbSource == VB_SOURCE_PRIVATE) { + vb_destroy_pool(pChnVars->vbpool.hPicVbPool); + CVI_VENC_TRACE("CVI_VB_DestroyPool: %d\n", + pChnVars->vbpool.hPicVbPool); + } + + pChnVars->bHasVbPool = CVI_FALSE; + } + + if (pChnHandle->pChnVars) { + MEM_FREE(pChnHandle->pChnVars); + pChnHandle->pChnVars = NULL; + } + + if (pChnHandle->pChnAttr) { + MEM_FREE(pChnHandle->pChnAttr); + pChnHandle->pChnAttr = NULL; + } + + MUTEX_DESTROY(&pChnHandle->chnMutex); + MUTEX_DESTROY(&pChnHandle->chnShmMutex); + + if (handle->chn_handle[VeChn]) { + MEM_FREE(handle->chn_handle[VeChn]); + handle->chn_handle[VeChn] = NULL; + } + + handle->chn_status[VeChn] = VENC_CHN_STATE_NONE; + + { + VENC_CHN i = 0; + CVI_BOOL bFreeVencHandle = CVI_TRUE; + + for (i = 0; i < VENC_MAX_CHN_NUM; i++) { + if (handle->chn_handle[i] != NULL) { + bFreeVencHandle = CVI_FALSE; + break; + } + } + + if (bFreeVencHandle) { + if (pSbmHandle->pSBMSendFrameThread) { + wake_sbm_waitinng(); + kthread_stop(pSbmHandle->pSBMSendFrameThread); + MUTEX_DESTROY(&pSbmHandle->SbmMutex); + pSbmHandle->pSBMSendFrameThread = NULL; + } + + MEM_FREE(handle); + handle = NULL; + } + } + + return s32Ret; +} + +/** + * @brief Resets a VENC channel. + * @param[in] VeChn VENC Channel Number. + * @retval 0 Success + * @retval Non-0 Failure, please see the error code table + */ +CVI_S32 CVI_VENC_ResetChn(VENC_CHN VeChn) +{ + /* from Hisi, + * You are advised to call HI_MPI_VENC_ResetChn + * to reset the channel before switching the format of the input image + * from non-single-component format to single-component format. + */ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + PAYLOAD_TYPE_E enType; + venc_chn_vars *pChnVars = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + + if (pChnVars->chnState == VENC_CHN_STATE_START_ENC) { + CVI_VENC_ERR("Chn %d is not stopped, failure\n", VeChn); + return CVI_ERR_VENC_BUSY; + } + + enType = pChnHandle->pChnAttr->stVencAttr.enType; + if (enType == PT_JPEG) { + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + if (pEncCtx->base.ioctl) { + s32Ret = pEncCtx->base.ioctl( + pEncCtx, CVI_JPEG_OP_RESET_CHN, NULL); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "CVI_JPEG_OP_RESET_CHN fail, s32Ret = %d\n", + s32Ret); + return s32Ret; + } + } + } + + // TODO: + Check resolution to decide if release memory / + re-init FW + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetJpegParam(VENC_CHN VeChn, + const VENC_JPEG_PARAM_S *pstJpegParam) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_setjpegparam(VeChn, pstJpegParam); + } +#endif + venc_chn_context *pChnHandle = NULL; + VENC_JPEG_PARAM_S *pvjp = NULL; + CVI_S32 s32Ret = CVI_SUCCESS; + VENC_MJPEG_FIXQP_S *pstMJPEGFixQp; + VENC_RC_ATTR_S *prcatt; + venc_chn_vars *pChnVars; + venc_enc_ctx *pEncCtx; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + pChnVars = pChnHandle->pChnVars; + pvjp = &pChnVars->stJpegParam; + + if (pEncCtx->base.ioctl) { + s32Ret = pEncCtx->base.ioctl( + pEncCtx, CVI_JPEG_OP_SET_MCUPerECS, + (CVI_VOID *)&pstJpegParam->u32MCUPerECS); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_JPEG_OP_SET_MCUPerECS, %d\n", s32Ret); + return -1; + } + } + + if (pstJpegParam->u32Qfactor > Q_TABLE_MAX) { + CVI_VENC_ERR("u32Qfactor <= 0 || >= 100, s32Ret = %d\n", + s32Ret); + return CVI_ERR_VENC_ILLEGAL_PARAM; + } else if (pstJpegParam->u32Qfactor == Q_TABLE_CUSTOM) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + prcatt = &pChnHandle->pChnAttr->stRcAttr; + pstMJPEGFixQp = &prcatt->stMjpegFixQp; + + prcatt->enRcMode = VENC_RC_MODE_MJPEGFIXQP; + pstMJPEGFixQp->u32Qfactor = pstJpegParam->u32Qfactor; + CVI_VENC_TRACE("enRcMode = %d, u32Qfactor = %d\n", prcatt->enRcMode, + pstMJPEGFixQp->u32Qfactor); + + if (pEncCtx->base.ioctl) { + s32Ret = pEncCtx->base.ioctl( + pEncCtx, CVI_JPEG_OP_SET_QUALITY, + (CVI_VOID *)&pstMJPEGFixQp->u32Qfactor); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_JPEG_OP_SET_QUALITY, %d\n", s32Ret); + return -1; + } + } + + memcpy(pvjp, pstJpegParam, sizeof(VENC_JPEG_PARAM_S)); + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetJpegParam(VENC_CHN VeChn, VENC_JPEG_PARAM_S *pstJpegParam) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_getjpegparam(VeChn, pstJpegParam); + } +#endif + venc_chn_context *pChnHandle = NULL; + venc_chn_vars *pChnVars = NULL; + VENC_JPEG_PARAM_S *pvjp = NULL; + CVI_S32 s32Ret = CVI_SUCCESS; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + pvjp = &pChnVars->stJpegParam; + + memcpy(pstJpegParam, pvjp, sizeof(VENC_JPEG_PARAM_S)); + + return s32Ret; +} + +CVI_S32 CVI_VENC_RequestIDR(VENC_CHN VeChn, CVI_BOOL bInstant) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + PAYLOAD_TYPE_E enType; + venc_enc_ctx *pEncCtx; + + CVI_VENC_API("\n"); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + pEncCtx = &pChnHandle->encCtx; + + if (enType == PT_H264 || enType == PT_H265) { + if (pEncCtx->base.ioctl) { + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = + pEncCtx->base.ioctl(pEncCtx, + CVI_H26X_OP_SET_REQUEST_IDR, + (CVI_VOID *)&bInstant); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "CVI_H26X_OP_SET_REQUEST_IDR, %d\n", + s32Ret); + return s32Ret; + } + } + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetChnAttr(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstChnAttr) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_setchnattr(VeChn, pstChnAttr); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + VENC_RC_ATTR_S *pstRcAttr = NULL; + VENC_ATTR_S *pstVencAttr = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + if (pstChnAttr == NULL) { + CVI_VENC_ERR("pstChnAttr == NULL\n"); + return CVI_ERR_VENC_ILLEGAL_PARAM; + } + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + if ((pChnHandle->pChnAttr == NULL) || (pChnHandle->pChnVars == NULL)) { + CVI_VENC_ERR("pChnAttr or pChnVars is NULL\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + if (pstChnAttr->stVencAttr.enType != + pChnHandle->pChnAttr->stVencAttr.enType) { + CVI_VENC_ERR("enType is incorrect\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + pstRcAttr = &(pChnHandle->pChnAttr->stRcAttr); + pstVencAttr = &(pChnHandle->pChnAttr->stVencAttr); + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + memcpy(pstRcAttr, &pstChnAttr->stRcAttr, sizeof(VENC_RC_ATTR_S)); + memcpy(pstVencAttr, &pstChnAttr->stVencAttr, sizeof(VENC_ATTR_S)); + pChnHandle->pChnVars->bAttrChange = CVI_TRUE; + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetChnAttr(VENC_CHN VeChn, VENC_CHN_ATTR_S *pstChnAttr) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_getchnattr(VeChn, pstChnAttr); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + memcpy(pstChnAttr, pChnHandle->pChnAttr, sizeof(VENC_CHN_ATTR_S)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetRcParam(VENC_CHN VeChn, VENC_RC_PARAM_S *pstRcParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + memcpy(pstRcParam, &pChnHandle->rcParam, sizeof(VENC_RC_PARAM_S)); + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetRcParam(VENC_CHN VeChn, const VENC_RC_PARAM_S *pstRcParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + VENC_CHN_ATTR_S *pChnAttr; + VENC_ATTR_S *pVencAttr; + VENC_RC_PARAM_S *prcparam; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnAttr = pChnHandle->pChnAttr; + pVencAttr = &pChnAttr->stVencAttr; + prcparam = &pChnHandle->rcParam; + + s32Ret = cviCheckRcParam(pChnHandle, pstRcParam); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("cviCheckRcParam\n"); + return s32Ret; + } + + memcpy(prcparam, pstRcParam, sizeof(VENC_RC_PARAM_S)); + + if (pVencAttr->enType == PT_H264 || pVencAttr->enType == PT_H265) { + prcparam->s32FirstFrameStartQp = + (prcparam->s32FirstFrameStartQp < 0 || + prcparam->s32FirstFrameStartQp > 51) ? + ((pVencAttr->enType == PT_H265) ? 63 : + DEF_IQP) : + prcparam->s32FirstFrameStartQp; + + if (pstRcParam->s32FirstFrameStartQp != + prcparam->s32FirstFrameStartQp) { + CVI_VENC_CFG( + "pstRcParam 1stQp = %d, prcparam 1stQp = %d\n", + pstRcParam->s32FirstFrameStartQp, + prcparam->s32FirstFrameStartQp); + } + } + + s32Ret = cviSetRcParamToDrv(pChnHandle); + if (s32Ret < 0) { + CVI_VENC_ERR("cviSetRcParamToDrv\n"); + return s32Ret; + } + + return s32Ret; +} + +static CVI_S32 cviCheckRcParam(venc_chn_context *pChnHandle, + const VENC_RC_PARAM_S *pstRcParam) +{ + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_ATTR_S *pVencAttr = &pChnAttr->stVencAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + CVI_S32 s32Ret = CVI_SUCCESS; + + s32Ret = ((pstRcParam->s32InitialDelay >= CVI_INITIAL_DELAY_MIN) && + (pstRcParam->s32InitialDelay <= CVI_INITIAL_DELAY_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32InitialDelay", pstRcParam->s32InitialDelay); + return s32Ret; + } + + if (pVencAttr->enType == PT_H264) { + if (prcatt->enRcMode == VENC_RC_MODE_H264CBR) { + s32Ret = cviCheckCommonRCParam(pstRcParam, pVencAttr, prcatt->enRcMode); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + } else if (prcatt->enRcMode == VENC_RC_MODE_H264VBR) { + const VENC_PARAM_H264_VBR_S *pprc = + &pstRcParam->stParamH264Vbr; + + s32Ret = cviCheckCommonRCParam(pstRcParam, pVencAttr, prcatt->enRcMode); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = ((pprc->s32ChangePos >= CVI_H26X_CHANGE_POS_MIN) && + (pprc->s32ChangePos <= CVI_H26X_CHANGE_POS_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32ChangePos", pprc->s32ChangePos); + return s32Ret; + } + } else if (prcatt->enRcMode == VENC_RC_MODE_H264AVBR) { + const VENC_PARAM_H264_AVBR_S *pprc = + &pstRcParam->stParamH264AVbr; + CVI_VENC_CFG( + "enType = %d, enRcMode = %d, s32ChangePos = %d\n", + pVencAttr->enType, prcatt->enRcMode, + pprc->s32ChangePos); + + s32Ret = cviCheckCommonRCParam(pstRcParam, pVencAttr, prcatt->enRcMode); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = ((pprc->s32ChangePos >= CVI_H26X_CHANGE_POS_MIN) && + (pprc->s32ChangePos <= CVI_H26X_CHANGE_POS_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32ChangePos", pprc->s32ChangePos); + return s32Ret; + } + s32Ret = ((pprc->s32MinStillPercent >= CVI_H26X_MIN_STILL_PERCENT_MIN) && + (pprc->s32MinStillPercent <= CVI_H26X_MIN_STILL_PERCENT_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32MinStillPercent", pprc->s32MinStillPercent); + return s32Ret; + } + s32Ret = ((pprc->u32MaxStillQP >= pprc->u32MinQp) && + (pprc->u32MaxStillQP <= pprc->u32MaxQp)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MaxStillQP", pprc->u32MaxStillQP); + return s32Ret; + } + s32Ret = ((pprc->u32MotionSensitivity >= CVI_H26X_MOTION_SENSITIVITY_MIN) && + (pprc->u32MotionSensitivity <= CVI_H26X_MOTION_SENSITIVITY_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MotionSensitivity", pprc->u32MotionSensitivity); + return s32Ret; + } + s32Ret = ((pprc->s32AvbrFrmLostOpen >= CVI_H26X_AVBR_FRM_LOST_OPEN_MIN) && + (pprc->s32AvbrFrmLostOpen <= CVI_H26X_AVBR_FRM_LOST_OPEN_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32AvbrFrmLostOpen", pprc->s32AvbrFrmLostOpen); + return s32Ret; + } + s32Ret = ((pprc->s32AvbrFrmGap >= CVI_H26X_AVBR_FRM_GAP_MIN) && + (pprc->s32AvbrFrmGap <= CVI_H26X_AVBR_FRM_GAP_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32AvbrFrmGap", pprc->s32AvbrFrmGap); + return s32Ret; + } + s32Ret = ((pprc->s32AvbrPureStillThr >= CVI_H26X_AVBR_PURE_STILL_THR_MIN) && + (pprc->s32AvbrPureStillThr <= CVI_H26X_AVBR_PURE_STILL_THR_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32AvbrPureStillThr", pprc->s32AvbrPureStillThr); + return s32Ret; + } + } else if (prcatt->enRcMode == VENC_RC_MODE_H264UBR) { + s32Ret = cviCheckCommonRCParam(pstRcParam, pVencAttr, prcatt->enRcMode); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + } + } else if (pVencAttr->enType == PT_H265) { + if (prcatt->enRcMode == VENC_RC_MODE_H265CBR) { + s32Ret = cviCheckCommonRCParam(pstRcParam, pVencAttr, prcatt->enRcMode); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + } else if (prcatt->enRcMode == VENC_RC_MODE_H265VBR) { + const VENC_PARAM_H265_VBR_S *pprc = + &pstRcParam->stParamH265Vbr; + + s32Ret = cviCheckCommonRCParam(pstRcParam, pVencAttr, prcatt->enRcMode); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = ((pprc->s32ChangePos >= CVI_H26X_CHANGE_POS_MIN) && + (pprc->s32ChangePos <= CVI_H26X_CHANGE_POS_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32ChangePos", pprc->s32ChangePos); + return s32Ret; + } + } else if (prcatt->enRcMode == VENC_RC_MODE_H265AVBR) { + const VENC_PARAM_H265_AVBR_S *pprc = + &pstRcParam->stParamH265AVbr; + + s32Ret = cviCheckCommonRCParam(pstRcParam, pVencAttr, prcatt->enRcMode); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = ((pprc->s32ChangePos >= CVI_H26X_CHANGE_POS_MIN) && + (pprc->s32ChangePos <= CVI_H26X_CHANGE_POS_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32ChangePos", pprc->s32ChangePos); + return s32Ret; + } + s32Ret = ((pprc->s32MinStillPercent >= CVI_H26X_MIN_STILL_PERCENT_MIN) && + (pprc->s32MinStillPercent <= CVI_H26X_MIN_STILL_PERCENT_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32MinStillPercent", pprc->s32MinStillPercent); + return s32Ret; + } + s32Ret = ((pprc->u32MaxStillQP >= pprc->u32MinQp) && + (pprc->u32MaxStillQP <= pprc->u32MaxQp)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MaxStillQP", pprc->u32MaxStillQP); + return s32Ret; + } + s32Ret = ((pprc->u32MotionSensitivity >= CVI_H26X_MOTION_SENSITIVITY_MIN) && + (pprc->u32MotionSensitivity <= CVI_H26X_MOTION_SENSITIVITY_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32MotionSensitivity", pprc->u32MotionSensitivity); + return s32Ret; + } + s32Ret = ((pprc->s32AvbrFrmLostOpen >= CVI_H26X_AVBR_FRM_LOST_OPEN_MIN) && + (pprc->s32AvbrFrmLostOpen <= CVI_H26X_AVBR_FRM_LOST_OPEN_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32AvbrFrmLostOpen", pprc->s32AvbrFrmLostOpen); + return s32Ret; + } + s32Ret = ((pprc->s32AvbrFrmGap >= CVI_H26X_AVBR_FRM_GAP_MIN) && + (pprc->s32AvbrFrmGap <= CVI_H26X_AVBR_FRM_GAP_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32AvbrFrmGap", pprc->s32AvbrFrmGap); + return s32Ret; + } + s32Ret = ((pprc->s32AvbrPureStillThr >= CVI_H26X_AVBR_PURE_STILL_THR_MIN) && + (pprc->s32AvbrPureStillThr <= CVI_H26X_AVBR_PURE_STILL_THR_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_RC_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "s32AvbrPureStillThr", pprc->s32AvbrPureStillThr); + return s32Ret; + } + } else if (prcatt->enRcMode == VENC_RC_MODE_H265UBR) { + s32Ret = cviCheckCommonRCParam(pstRcParam, pVencAttr, prcatt->enRcMode); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + } + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetRefParam(VENC_CHN VeChn, VENC_REF_PARAM_S *pstRefParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + memcpy(pstRefParam, &pChnHandle->refParam, sizeof(VENC_REF_PARAM_S)); + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetRefParam(VENC_CHN VeChn, + const VENC_REF_PARAM_S *pstRefParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + memcpy(&pChnHandle->refParam, pstRefParam, sizeof(VENC_REF_PARAM_S)); + + pEncCtx = &pChnHandle->encCtx; + + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (pEncCtx->base.ioctl && (enType == PT_H264 || enType == PT_H265)) { + unsigned int tempLayer = 1; + + if (pstRefParam->u32Base == 1 && pstRefParam->u32Enhance == 1 && + pstRefParam->bEnablePred == CVI_TRUE) + tempLayer = 2; + else if (pstRefParam->u32Base == 2 && + pstRefParam->u32Enhance == 1 && + pstRefParam->bEnablePred == CVI_TRUE) + tempLayer = 3; + + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_REF_PARAM, + (CVI_VOID *)&tempLayer); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_SET_REF_PARAM, %d\n", s32Ret); + return -1; + } + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetCuPrediction(VENC_CHN VeChn, + const VENC_CU_PREDICTION_S *pstCuPrediction) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + VENC_CU_PREDICTION_S *pcup; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pcup = &pChnHandle->pChnVars->cuPrediction; + + s32Ret = (pstCuPrediction->u32IntraCost <= CVI_H26X_INTRACOST_MAX) ? + CVI_SUCCESS : CVI_ERR_VENC_CU_PREDICTION; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32IntraCost", + pstCuPrediction->u32IntraCost); + return s32Ret; + } + + memcpy(pcup, pstCuPrediction, sizeof(VENC_CU_PREDICTION_S)); + + s32Ret = cviSetCuPredToDrv(pChnHandle); + if (s32Ret < 0) { + CVI_VENC_ERR("cviSetCuPredToDrv\n"); + return s32Ret; + } + + return s32Ret; +} + +static CVI_S32 cviSetCuPredToDrv(venc_chn_context *pChnHandle) +{ + VENC_CU_PREDICTION_S *pcup = &pChnHandle->pChnVars->cuPrediction; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + cviPred pred, *pPred = &pred; + CVI_S32 s32Ret = CVI_SUCCESS; + + pPred->u32IntraCost = pcup->u32IntraCost; + + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_PREDICT, + (CVI_VOID *)pPred); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_SET_PREDICT, %d\n", s32Ret); + return CVI_ERR_VENC_CU_PREDICTION; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetCuPrediction(VENC_CHN VeChn, + VENC_CU_PREDICTION_S *pstCuPrediction) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + VENC_CU_PREDICTION_S *pcup; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pcup = &pChnHandle->pChnVars->cuPrediction; + + memcpy(pstCuPrediction, pcup, sizeof(VENC_CU_PREDICTION_S)); + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetRoiAttr(VENC_CHN VeChn, CVI_U32 u32Index, + VENC_ROI_ATTR_S *pstRoiAttr) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + pEncCtx = &pChnHandle->encCtx; + + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (pEncCtx->base.ioctl && (enType == PT_H264 || enType == PT_H265)) { + cviRoiParam RoiParam; + + memset(&RoiParam, 0x0, sizeof(cviRoiParam)); + RoiParam.roi_index = u32Index; + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_GET_ROI_PARAM, + (CVI_VOID *)&RoiParam); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_SET_ROI_PARAM, %d\n", s32Ret); + return -1; + } + pstRoiAttr->u32Index = RoiParam.roi_index; + pstRoiAttr->bEnable = RoiParam.roi_enable; + pstRoiAttr->bAbsQp = RoiParam.roi_qp_mode; + pstRoiAttr->s32Qp = RoiParam.roi_qp; + pstRoiAttr->stRect.s32X = RoiParam.roi_rect_x; + pstRoiAttr->stRect.s32Y = RoiParam.roi_rect_y; + pstRoiAttr->stRect.u32Width = RoiParam.roi_rect_width; + pstRoiAttr->stRect.u32Height = RoiParam.roi_rect_height; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetFrameLostStrategy(VENC_CHN VeChn, + const VENC_FRAMELOST_S *pstFrmLostParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + PAYLOAD_TYPE_E enType; + venc_enc_ctx *pEncCtx; + + CVI_VENC_API("\n"); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + enType = pChnHandle->pChnAttr->stVencAttr.enType; + pEncCtx = &pChnHandle->encCtx; + + if (enType == PT_H264 || enType == PT_H265) { + if (pEncCtx->base.ioctl) { + cviFrameLost frameLostSetting; + + if (pstFrmLostParam->bFrmLostOpen) { + // If frame lost is on, check parameters + if (pstFrmLostParam->enFrmLostMode != + FRMLOST_PSKIP) { + CVI_VENC_ERR( + "frame lost mode = %d, unsupport\n", + (int)(pstFrmLostParam + ->enFrmLostMode)); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + frameLostSetting.frameLostMode = + pstFrmLostParam->enFrmLostMode; + frameLostSetting.u32EncFrmGaps = + pstFrmLostParam->u32EncFrmGaps; + frameLostSetting.bFrameLostOpen = + pstFrmLostParam->bFrmLostOpen; + frameLostSetting.u32FrmLostBpsThr = + pstFrmLostParam->u32FrmLostBpsThr; + } else { + // set gap and threshold back to 0 + frameLostSetting.frameLostMode = + pstFrmLostParam->enFrmLostMode; + frameLostSetting.u32EncFrmGaps = 0; + frameLostSetting.bFrameLostOpen = 0; + frameLostSetting.u32FrmLostBpsThr = 0; + } + CVI_VENC_CFG( + "bFrameLostOpen = %d, frameLostMode = %d, u32EncFrmGaps = %d, u32FrmLostBpsThr = %d\n", + frameLostSetting.bFrameLostOpen, + frameLostSetting.frameLostMode, + frameLostSetting.u32EncFrmGaps, + frameLostSetting.u32FrmLostBpsThr); + memcpy(&pChnHandle->pChnVars->frameLost, + pstFrmLostParam, sizeof(VENC_FRAMELOST_S)); + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = pEncCtx->base.ioctl( + pEncCtx, CVI_H26X_OP_SET_FRAME_LOST_STRATEGY, + (CVI_VOID *)(&frameLostSetting)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "CVI_H26X_OP_SET_FRAME_LOST_STRATEGY, %d\n", + s32Ret); + return s32Ret; + } + } + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetRoiAttr(VENC_CHN VeChn, const VENC_ROI_ATTR_S *pstRoiAttr) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + pEncCtx = &pChnHandle->encCtx; + + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (pEncCtx->base.ioctl && (enType == PT_H264 || enType == PT_H265)) { + cviRoiParam RoiParam; + memset(&RoiParam, 0x0, sizeof(cviRoiParam)); + RoiParam.roi_index = pstRoiAttr->u32Index; + RoiParam.roi_enable = pstRoiAttr->bEnable; + RoiParam.roi_qp_mode = pstRoiAttr->bAbsQp; + RoiParam.roi_qp = pstRoiAttr->s32Qp; + RoiParam.roi_rect_x = pstRoiAttr->stRect.s32X; + RoiParam.roi_rect_y = pstRoiAttr->stRect.s32Y; + RoiParam.roi_rect_width = pstRoiAttr->stRect.u32Width; + RoiParam.roi_rect_height = pstRoiAttr->stRect.u32Height; + + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_ROI_PARAM, + (CVI_VOID *)&RoiParam); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_SET_ROI_PARAM, %d\n", s32Ret); + return -1; + } + + if (MUTEX_LOCK(&pChnHandle->chnShmMutex) != 0) { + CVI_VENC_ERR("can not lock chnShmMutex\n"); + return CVI_FAILURE; + } + memcpy(&pChnHandle->pChnVars->stRoiAttr[pstRoiAttr->u32Index], + pstRoiAttr, sizeof(VENC_ROI_ATTR_S)); + MUTEX_UNLOCK(&pChnHandle->chnShmMutex); + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetFrameLostStrategy(VENC_CHN VeChn, + VENC_FRAMELOST_S *pstFrmLostParam) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + if (pChnHandle->pChnVars) { + memcpy(pstFrmLostParam, &pChnHandle->pChnVars->frameLost, + sizeof(VENC_FRAMELOST_S)); + } else { + s32Ret = CVI_ERR_VENC_NOT_CONFIG; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetChnParam(VENC_CHN VeChn, + const VENC_CHN_PARAM_S *pstChnParam) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_setchnparam(VeChn, pstChnParam); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle; + venc_chn_vars *pChnVars; + RECT_S *prect; + venc_enc_ctx_base *pvecb; + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + prect = &pChnVars->stChnParam.stCropCfg.stRect; + pvecb = &pChnHandle->encCtx.base; + + memcpy(&pChnVars->stChnParam, pstChnParam, sizeof(VENC_CHN_PARAM_S)); + + if ((prect->s32X & 0xF) || (prect->s32Y & 0xF)) { + prect->s32X &= (~0xF); + prect->s32Y &= (~0xF); + CVI_VENC_TRACE("s32X = %d, s32Y = %d\n", prect->s32X, + prect->s32Y); + } + + pvecb->x = prect->s32X; + pvecb->y = prect->s32Y; + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetChnParam(VENC_CHN VeChn, VENC_CHN_PARAM_S *pstChnParam) +{ +#ifdef RPC_MULTI_PROCESS + if (!isMaster()) { + return rpc_client_venc_getchnparam(VeChn, pstChnParam); + } +#endif + CVI_S32 s32Ret = CVI_SUCCESS; + VENC_CHN_PARAM_S *pvcp; + venc_chn_context *pChnHandle; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pvcp = &pChnHandle->pChnVars->stChnParam; + + memcpy(pstChnParam, pvcp, sizeof(VENC_CHN_PARAM_S)); + + return s32Ret; +} + +static CVI_S32 cviVencJpegInsertUserData(venc_chn_context *pChnHandle, + CVI_U8 *pu8Data, CVI_U32 u32Len) +{ + CVI_S32 ret; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + cviJpegUserData stUserData; + + stUserData.userData = pu8Data; + stUserData.len = u32Len; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + ret = pEncCtx->base.ioctl(pEncCtx, CVI_JPEG_OP_SET_USER_DATA, + (CVI_VOID *)(&stUserData)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("jpeg failed to insert user data, %d", ret); + return ret; +} + +static CVI_S32 cviVencH26xInsertUserData(venc_chn_context *pChnHandle, + CVI_U8 *pu8Data, CVI_U32 u32Len) +{ + CVI_S32 ret; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + cviUserData stUserData; + + stUserData.userData = pu8Data; + stUserData.len = u32Len; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_USER_DATA, + (CVI_VOID *)(&stUserData)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("h26x failed to insert user data, %d", ret); + return ret; +} + +CVI_S32 CVI_VENC_InsertUserData(VENC_CHN VeChn, CVI_U8 *pu8Data, CVI_U32 u32Len) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pu8Data == NULL || u32Len == 0) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no user data\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + if (enType == PT_JPEG || enType == PT_MJPEG) { + s32Ret = cviVencJpegInsertUserData(pChnHandle, pu8Data, u32Len); + } else if (enType == PT_H264 || enType == PT_H265) { + s32Ret = cviVencH26xInsertUserData(pChnHandle, pu8Data, u32Len); + } + + if (s32Ret != CVI_SUCCESS) + CVI_VENC_ERR("failed to insert user data %d", s32Ret); + return s32Ret; +} + +static CVI_S32 cviVencH264SetEntropy(venc_chn_context *pChnHandle, + VENC_H264_ENTROPY_S *pstH264Entropy) +{ + CVI_S32 ret; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H264_ENTROPY, + (CVI_VOID *)(pstH264Entropy)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("failed to set h264 entropy, %d", ret); + + return ret; +} + +CVI_S32 CVI_VENC_SetH264Entropy(VENC_CHN VeChn, + const VENC_H264_ENTROPY_S *pstH264EntropyEnc) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + VENC_ATTR_S *pVencAttr; + venc_enc_ctx *pEncCtx; + VENC_H264_ENTROPY_S h264Entropy; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264EntropyEnc == NULL) { + CVI_VENC_ERR("no user data\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pVencAttr = &pChnHandle->pChnAttr->stVencAttr; + pEncCtx = &pChnHandle->encCtx; + + if (pVencAttr->enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + if (pVencAttr->u32Profile == H264E_PROFILE_BASELINE) { + if (pstH264EntropyEnc->u32EntropyEncModeI != + H264E_ENTROPY_CAVLC || + pstH264EntropyEnc->u32EntropyEncModeP != + H264E_ENTROPY_CAVLC) { + CVI_VENC_ERR( + "h264 Baseline Profile only supports CAVLC\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + } + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + memcpy(&h264Entropy, pstH264EntropyEnc, sizeof(VENC_H264_ENTROPY_S)); + s32Ret = cviVencH264SetEntropy(pChnHandle, &h264Entropy); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h264Entropy, &h264Entropy, + sizeof(VENC_H264_ENTROPY_S)); + } else { + CVI_VENC_ERR("failed to set h264 entropy %d", s32Ret); + s32Ret = CVI_ERR_VENC_H264_ENTROPY; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetH264Entropy(VENC_CHN VeChn, + VENC_H264_ENTROPY_S *pstH264EntropyEnc) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264EntropyEnc == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no h264 entropy param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + memcpy(pstH264EntropyEnc, &pChnHandle->h264Entropy, + sizeof(VENC_H264_ENTROPY_S)); + return CVI_SUCCESS; +} + +static CVI_S32 cviVencH264SetTrans(venc_chn_context *pChnHandle, + VENC_H264_TRANS_S *pstH264Trans) +{ + CVI_S32 ret; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H264_TRANS, + (CVI_VOID *)(pstH264Trans)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("failed to set h264 trans %d", ret); + + return ret; +} + +CVI_S32 CVI_VENC_SetH264Trans(VENC_CHN VeChn, + const VENC_H264_TRANS_S *pstH264Trans) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + VENC_H264_TRANS_S h264Trans; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264Trans == NULL) { + CVI_VENC_ERR("no h264 trans param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + memcpy(&h264Trans, pstH264Trans, sizeof(VENC_H264_TRANS_S)); + s32Ret = cviVencH264SetTrans(pChnHandle, &h264Trans); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h264Trans, &h264Trans, + sizeof(VENC_H264_TRANS_S)); + } else { + CVI_VENC_ERR("failed to set h264 trans %d", s32Ret); + s32Ret = CVI_ERR_VENC_H264_TRANS; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetH264Trans(VENC_CHN VeChn, VENC_H264_TRANS_S *pstH264Trans) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264Trans == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no h264 trans param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + memcpy(pstH264Trans, &pChnHandle->h264Trans, sizeof(VENC_H264_TRANS_S)); + return CVI_SUCCESS; +} + +static CVI_S32 cviVencH265SetTrans(venc_chn_context *pChnHandle, + VENC_H265_TRANS_S *pstH265Trans) +{ + CVI_S32 ret; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H265_TRANS, + (CVI_VOID *)(pstH265Trans)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("failed to set h265 trans %d", ret); + + return ret; +} + +CVI_S32 CVI_VENC_SetH265Trans(VENC_CHN VeChn, + const VENC_H265_TRANS_S *pstH265Trans) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + VENC_H265_TRANS_S h265Trans; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH265Trans == NULL) { + CVI_VENC_ERR("no h265 trans param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H265) { + CVI_VENC_ERR("not h265 encode channel\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + memcpy(&h265Trans, pstH265Trans, sizeof(VENC_H265_TRANS_S)); + s32Ret = cviVencH265SetTrans(pChnHandle, &h265Trans); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h265Trans, &h265Trans, + sizeof(VENC_H265_TRANS_S)); + } else { + CVI_VENC_ERR("failed to set h265 trans %d", s32Ret); + s32Ret = CVI_ERR_VENC_H265_TRANS; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetH265Trans(VENC_CHN VeChn, VENC_H265_TRANS_S *pstH265Trans) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH265Trans == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no h265 trans param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H265) { + CVI_VENC_ERR("not h265 encode channel\n"); + return CVI_ERR_VENC_NOT_SUPPORT; + } + + memcpy(pstH265Trans, &pChnHandle->h265Trans, sizeof(VENC_H265_TRANS_S)); + return CVI_SUCCESS; +} + +CVI_S32 +CVI_VENC_SetSuperFrameStrategy(VENC_CHN VeChn, + const VENC_SUPERFRAME_CFG_S *pstSuperFrmParam) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_chn_vars *pChnVars = NULL; + venc_enc_ctx *pEncCtx; + cviSuperFrame super, *pSuper = &super; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstSuperFrmParam == NULL) { + CVI_VENC_ERR("pstSuperFrmParam = NULL\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + pEncCtx = &pChnHandle->encCtx; + pSuper->enSuperFrmMode = + (pstSuperFrmParam->enSuperFrmMode == SUPERFRM_NONE) ? + CVI_SUPERFRM_NONE : + CVI_SUPERFRM_REENCODE_IDR; + pSuper->u32SuperIFrmBitsThr = pstSuperFrmParam->u32SuperIFrmBitsThr; + pSuper->u32SuperPFrmBitsThr = pstSuperFrmParam->u32SuperPFrmBitsThr; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_SUPER_FRAME, + (CVI_VOID *)pSuper); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnVars->stSuperFrmParam, pstSuperFrmParam, + sizeof(VENC_SUPERFRAME_CFG_S)); + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetSuperFrameStrategy(VENC_CHN VeChn, + VENC_SUPERFRAME_CFG_S *pstSuperFrmParam) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_chn_vars *pChnVars = NULL; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstSuperFrmParam == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("pstSuperFrmParam = NULL\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + + memcpy(pstSuperFrmParam, &pChnVars->stSuperFrmParam, + sizeof(VENC_SUPERFRAME_CFG_S)); + return CVI_SUCCESS; +} + +CVI_S32 CVI_VENC_CalcFrameParam(VENC_CHN VeChn, + VENC_FRAME_PARAM_S *pstFrameParam) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + cviFrameParam frmp, *pfp = &frmp; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstFrameParam == NULL) { + CVI_VENC_ERR("pstFrameParam is NULL\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_CALC_FRAME_PARAM, + (CVI_VOID *)(pfp)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("failed to calculate FrameParam %d", s32Ret); + s32Ret = CVI_ERR_VENC_FRAME_PARAM; + } + + pstFrameParam->u32FrameQp = pfp->u32FrameQp; + pstFrameParam->u32FrameBits = pfp->u32FrameBits; + return s32Ret; +} + +CVI_S32 CVI_VENC_SetFrameParam(VENC_CHN VeChn, + const VENC_FRAME_PARAM_S *pstFrameParam) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + venc_chn_vars *pChnVars; + cviFrameParam frmp, *pfp = &frmp; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstFrameParam == NULL) { + CVI_VENC_ERR("pstFrameParam is NULL\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + pEncCtx = &pChnHandle->encCtx; + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + pfp->u32FrameQp = pstFrameParam->u32FrameQp; + pfp->u32FrameBits = pstFrameParam->u32FrameBits; + + s32Ret = (pfp->u32FrameQp <= CVI_H26X_FRAME_QP_MAX) ? + CVI_SUCCESS : CVI_ERR_VENC_ILLEGAL_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32FrameQp", + pfp->u32FrameQp); + return s32Ret; + } + s32Ret = ((pfp->u32FrameBits >= CVI_H26X_FRAME_BITS_MIN) && + (pfp->u32FrameBits <= CVI_H26X_FRAME_BITS_MAX)) ? + CVI_SUCCESS : CVI_ERR_VENC_ILLEGAL_PARAM; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "u32FrameBits", pfp->u32FrameBits); + return s32Ret; + } + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_FRAME_PARAM, + (CVI_VOID *)(pfp)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnVars->frameParam, pstFrameParam, + sizeof(VENC_FRAME_PARAM_S)); + } else { + CVI_VENC_ERR("failed to set FrameParam %d", s32Ret); + s32Ret = CVI_ERR_VENC_FRAME_PARAM; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetFrameParam(VENC_CHN VeChn, + VENC_FRAME_PARAM_S *pstFrameParam) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_chn_vars *pChnVars; + VENC_FRAME_PARAM_S *pfp; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstFrameParam == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pChnVars = pChnHandle->pChnVars; + pfp = &pChnVars->frameParam; + + memcpy(pstFrameParam, pfp, sizeof(VENC_FRAME_PARAM_S)); + + return s32Ret; +} + +static inline CVI_S32 cviCheckVuiAspectRatio( + const VENC_VUI_ASPECT_RATIO_S * pstVuiAspectRatio, CVI_S32 s32Err) { + CVI_S32 s32Ret = CVI_SUCCESS; + + CVI_VENC_CFG( + "aspect_ratio_info_present_flag %u, aspect_ratio_idc %u, sar_width %u, sar_height %u\n", + pstVuiAspectRatio->aspect_ratio_info_present_flag, + pstVuiAspectRatio->aspect_ratio_idc, + pstVuiAspectRatio->sar_width, + pstVuiAspectRatio->sar_height); + CVI_VENC_CFG( + "overscan_info_present_flag %u, overscan_appropriate_flag %u\n", + pstVuiAspectRatio->overscan_info_present_flag, + pstVuiAspectRatio->overscan_appropriate_flag); + + s32Ret = (pstVuiAspectRatio->aspect_ratio_info_present_flag <= 1) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "aspect_ratio_info_present_flag", + pstVuiAspectRatio->aspect_ratio_info_present_flag); + return s32Ret; + } + + if (pstVuiAspectRatio->aspect_ratio_info_present_flag) { + s32Ret = (pstVuiAspectRatio->sar_width >= CVI_H26X_SAR_WIDTH_MIN) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", "sar_width", pstVuiAspectRatio->sar_width); + return s32Ret; + } + + s32Ret = (pstVuiAspectRatio->sar_height >= CVI_H26X_SAR_HEIGHT_MIN) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", "sar_height", pstVuiAspectRatio->sar_height); + return s32Ret; + } + } + + s32Ret = (pstVuiAspectRatio->overscan_info_present_flag <= 1) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "overscan_info_present_flag", + pstVuiAspectRatio->overscan_info_present_flag); + return s32Ret; + } + + if (pstVuiAspectRatio->overscan_info_present_flag) { + s32Ret = (pstVuiAspectRatio->overscan_appropriate_flag <= 1) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "overscan_appropriate_flag", + pstVuiAspectRatio->overscan_appropriate_flag); + return s32Ret; + } + } + + return s32Ret; +} + +static inline CVI_S32 cviCheckVuiH264TimingInfo( + const VENC_VUI_H264_TIME_INFO_S * pstVuiH264TimingInfo, CVI_S32 s32Err) { + CVI_S32 s32Ret = CVI_SUCCESS; + + CVI_VENC_CFG( + "timing_info_present_flag %u, fixed_frame_rate_flag %u\n", + pstVuiH264TimingInfo->timing_info_present_flag, + pstVuiH264TimingInfo->fixed_frame_rate_flag); + CVI_VENC_CFG("num_units_in_tick %u, time_scale %u\n", + pstVuiH264TimingInfo->num_units_in_tick, + pstVuiH264TimingInfo->time_scale); + + if (pstVuiH264TimingInfo->timing_info_present_flag) { + s32Ret = (pstVuiH264TimingInfo->fixed_frame_rate_flag <= 1) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "fixed_frame_rate_flag", + pstVuiH264TimingInfo->fixed_frame_rate_flag); + return s32Ret; + } + + s32Ret = ((pstVuiH264TimingInfo->num_units_in_tick >= CVI_H26X_NUM_UNITS_IN_TICK_MIN) && + (pstVuiH264TimingInfo->num_units_in_tick <= CVI_H26X_NUM_UNITS_IN_TICK_MAX)) ? + CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", "num_units_in_tick", pstVuiH264TimingInfo->num_units_in_tick); + return s32Ret; + } + + s32Ret = ((pstVuiH264TimingInfo->time_scale >= CVI_H26X_TIME_SCALE_MIN) && + (pstVuiH264TimingInfo->time_scale <= CVI_H26X_TIME_SCALE_MAX)) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", "time_scale", pstVuiH264TimingInfo->time_scale); + return s32Ret; + } + } + + return s32Ret; +} + +static inline CVI_S32 cviCheckVuiH265TimingInfo( + const VENC_VUI_H265_TIME_INFO_S * pstVuiH265TimingInfo, CVI_S32 s32Err) { + CVI_S32 s32Ret = CVI_SUCCESS; + + CVI_VENC_CFG( + "timing_info_present_flag %u, num_units_in_tick %u, time_scale %u\n", + pstVuiH265TimingInfo->timing_info_present_flag, + pstVuiH265TimingInfo->num_units_in_tick, + pstVuiH265TimingInfo->time_scale); + CVI_VENC_CFG("num_ticks_poc_diff_one_minus1 %u\n", + pstVuiH265TimingInfo->num_ticks_poc_diff_one_minus1); + + s32Ret = (pstVuiH265TimingInfo->timing_info_present_flag <= 1) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "timing_info_present_flag", + pstVuiH265TimingInfo->timing_info_present_flag); + return s32Ret; + } + + if (pstVuiH265TimingInfo->timing_info_present_flag) { + s32Ret = ((pstVuiH265TimingInfo->num_units_in_tick >= CVI_H26X_NUM_UNITS_IN_TICK_MIN) && + (pstVuiH265TimingInfo->num_units_in_tick <= CVI_H26X_NUM_UNITS_IN_TICK_MAX)) ? + CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", "num_units_in_tick", pstVuiH265TimingInfo->num_units_in_tick); + return s32Ret; + } + + s32Ret = ((pstVuiH265TimingInfo->time_scale >= CVI_H26X_TIME_SCALE_MIN) && + (pstVuiH265TimingInfo->time_scale <= CVI_H26X_TIME_SCALE_MAX)) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", "time_scale", pstVuiH265TimingInfo->time_scale); + return s32Ret; + } + + s32Ret = (pstVuiH265TimingInfo->num_ticks_poc_diff_one_minus1 + <= CVI_H265_NUM_TICKS_POC_DIFF_ONE_MINUS1_MAX) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "num_ticks_poc_diff_one_minus1", + pstVuiH265TimingInfo->num_ticks_poc_diff_one_minus1); + return s32Ret; + } + } + + return s32Ret; +} + +static inline CVI_S32 cviCheckVuiVideoSignal( + const VENC_VUI_VIDEO_SIGNAL_S * pstVuiVideoSignal, CVI_U8 u8VideoFormatMax, CVI_S32 s32Err) { + CVI_S32 s32Ret = CVI_SUCCESS; + + CVI_VENC_CFG( + "video_signal_type_present_flag %u, video_format %d, video_full_range_flag %u\n", + pstVuiVideoSignal->video_signal_type_present_flag, + pstVuiVideoSignal->video_format, + pstVuiVideoSignal->video_full_range_flag); + CVI_VENC_CFG( + "colour_description_present_flag %u, colour_primaries %u\n", + pstVuiVideoSignal->colour_description_present_flag, + pstVuiVideoSignal->colour_primaries); + CVI_VENC_CFG( + "transfer_characteristics %u, matrix_coefficients %u\n", + pstVuiVideoSignal->transfer_characteristics, + pstVuiVideoSignal->matrix_coefficients); + + s32Ret = (pstVuiVideoSignal->video_signal_type_present_flag <= 1) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "video_signal_type_present_flag", + pstVuiVideoSignal->video_signal_type_present_flag); + return s32Ret; + } + + if (pstVuiVideoSignal->video_signal_type_present_flag) { + s32Ret = (pstVuiVideoSignal->video_format <= u8VideoFormatMax) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "video_format", pstVuiVideoSignal->video_format); + return s32Ret; + } + + s32Ret = (pstVuiVideoSignal->video_full_range_flag <= 1) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "video_full_range_flag", pstVuiVideoSignal->video_full_range_flag); + return s32Ret; + } + + if (pstVuiVideoSignal->colour_description_present_flag) { + s32Ret = (pstVuiVideoSignal->colour_description_present_flag <= 1) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "colour_description_present_flag", + pstVuiVideoSignal->colour_description_present_flag); + return s32Ret; + } + } + } + + return s32Ret; +} + +static inline CVI_S32 cviCheckBitstreamRestrict( + const VENC_VUI_BITSTREAM_RESTRIC_S * pstBitstreamRestrict, CVI_S32 s32Err) { + CVI_S32 s32Ret = CVI_SUCCESS; + + CVI_VENC_CFG("bitstream_restriction_flag %u\n", + pstBitstreamRestrict->bitstream_restriction_flag); + + s32Ret = (pstBitstreamRestrict->bitstream_restriction_flag <= 1) ? CVI_SUCCESS : s32Err; + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("error, %s = %d\n", + "bitstream_restriction_flag", + pstBitstreamRestrict->bitstream_restriction_flag); + return s32Ret; + } + + return s32Ret; +} + +static CVI_S32 _cviCheckH264VuiParam(const VENC_H264_VUI_S *pstH264Vui) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + s32Ret = cviCheckVuiAspectRatio(&pstH264Vui->stVuiAspectRatio, + CVI_ERR_VENC_H264_VUI); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = cviCheckVuiH264TimingInfo(&pstH264Vui->stVuiTimeInfo, + CVI_ERR_VENC_H264_VUI); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = cviCheckVuiVideoSignal(&pstH264Vui->stVuiVideoSignal, + CVI_H264_VIDEO_FORMAT_MAX, + CVI_ERR_VENC_H264_VUI); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = cviCheckBitstreamRestrict(&pstH264Vui->stVuiBitstreamRestric, + CVI_ERR_VENC_H264_VUI); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + return s32Ret; +} + +static CVI_S32 _cviCheckH265VuiParam(const VENC_H265_VUI_S *pstH265Vui) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + s32Ret = cviCheckVuiAspectRatio(&pstH265Vui->stVuiAspectRatio, + CVI_ERR_VENC_H265_VUI); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = cviCheckVuiH265TimingInfo(&pstH265Vui->stVuiTimeInfo, + CVI_ERR_VENC_H265_VUI); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = cviCheckVuiVideoSignal(&pstH265Vui->stVuiVideoSignal, + CVI_H265_VIDEO_FORMAT_MAX, + CVI_ERR_VENC_H265_VUI); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + s32Ret = cviCheckBitstreamRestrict(&pstH265Vui->stVuiBitstreamRestric, + CVI_ERR_VENC_H265_VUI); + if (s32Ret != CVI_SUCCESS) { + return s32Ret; + } + return s32Ret; +} + +static CVI_S32 _cviSetH264Vui(venc_chn_context *pChnHandle, + VENC_H264_VUI_S *pstH264Vui) +{ + CVI_S32 ret; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H264_VUI, + (CVI_VOID *)(pstH264Vui)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("failed to set h264 vui %d", ret); + + return ret; +} + +static CVI_S32 _cviSetH265Vui(venc_chn_context *pChnHandle, + VENC_H265_VUI_S *pstH265Vui) +{ + CVI_S32 ret; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H265_VUI, + (CVI_VOID *)(pstH265Vui)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("failed to set h265 vui %d", ret); + + return ret; +} + +CVI_S32 CVI_VENC_SetH264Vui(VENC_CHN VeChn, const VENC_H264_VUI_S *pstH264Vui) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + VENC_H264_VUI_S h264Vui; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264Vui == NULL) { + CVI_VENC_ERR("no h264 vui param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_FAILURE; + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + s32Ret = _cviCheckH264VuiParam(pstH264Vui); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("invalid h264 vui param, %d\n", s32Ret); + return s32Ret; + } + + memcpy(&h264Vui, pstH264Vui, sizeof(VENC_H264_VUI_S)); + s32Ret = _cviSetH264Vui(pChnHandle, &h264Vui); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h264Vui, &h264Vui, sizeof(VENC_H264_VUI_S)); + } else { + CVI_VENC_ERR("failed to set h264 vui %d", s32Ret); + s32Ret = CVI_ERR_VENC_H264_VUI; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetH265Vui(VENC_CHN VeChn, const VENC_H265_VUI_S *pstH265Vui) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + VENC_H265_VUI_S h265Vui; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH265Vui == NULL) { + CVI_VENC_ERR("no h265 vui param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H265) { + CVI_VENC_ERR("not h265 encode channel\n"); + return CVI_FAILURE; + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + s32Ret = _cviCheckH265VuiParam(pstH265Vui); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("invalid h265 vui param, %d\n", s32Ret); + return s32Ret; + } + + memcpy(&h265Vui, pstH265Vui, sizeof(VENC_H265_VUI_S)); + s32Ret = _cviSetH265Vui(pChnHandle, &h265Vui); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h265Vui, &h265Vui, sizeof(VENC_H265_VUI_S)); + } else { + CVI_VENC_ERR("failed to set h265 vui %d", s32Ret); + s32Ret = CVI_ERR_VENC_H265_VUI; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetH264Vui(VENC_CHN VeChn, VENC_H264_VUI_S *pstH264Vui) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264Vui == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no h264 vui param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_FAILURE; + } + + memcpy(pstH264Vui, &pChnHandle->h264Vui, sizeof(VENC_H264_VUI_S)); + return CVI_SUCCESS; +} + +CVI_S32 CVI_VENC_GetH265Vui(VENC_CHN VeChn, VENC_H265_VUI_S *pstH265Vui) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH265Vui == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no h265 vui param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H265) { + CVI_VENC_ERR("not h265 encode channel\n"); + return CVI_FAILURE; + } + + memcpy(pstH265Vui, &pChnHandle->h265Vui, sizeof(VENC_H265_VUI_S)); + return CVI_SUCCESS; +} + +CVI_S32 CVI_VENC_SetH264SliceSplit(VENC_CHN VeChn, const VENC_H264_SLICE_SPLIT_S *pstSliceSplit) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + VENC_H264_SLICE_SPLIT_S h264Split; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstSliceSplit == NULL) { + CVI_VENC_ERR("no h264 split param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + if (pstSliceSplit->bSplitEnable == 1 + && pstSliceSplit->u32MbLineNum == 0) { + CVI_VENC_ERR("invalid h264 split param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_FAILURE; + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + memcpy(&h264Split, pstSliceSplit, sizeof(VENC_H264_SLICE_SPLIT_S)); + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H264_SPLIT, + (CVI_VOID *)pstSliceSplit); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h264Split, &h264Split, sizeof(VENC_H264_SLICE_SPLIT_S)); + } else { + CVI_VENC_ERR("failed to set h264 split %d", s32Ret); + s32Ret = CVI_ERR_VENC_H264_SPLIT; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetH264SliceSplit(VENC_CHN VeChn, VENC_H264_SLICE_SPLIT_S *pstH264Split) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264Split == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no h264 split param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_FAILURE; + } + + memcpy(pstH264Split, &pChnHandle->h264Split, sizeof(VENC_H264_SLICE_SPLIT_S)); + return CVI_SUCCESS; +} + +CVI_S32 CVI_VENC_SetH265SliceSplit(VENC_CHN VeChn, const VENC_H265_SLICE_SPLIT_S *pstSliceSplit) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + VENC_H265_SLICE_SPLIT_S h265Split; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstSliceSplit == NULL) { + CVI_VENC_ERR("no h265 split param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + if (pstSliceSplit->bSplitEnable == 1 + && pstSliceSplit->u32LcuLineNum == 0) { + CVI_VENC_ERR("invalid h265 split param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H265) { + CVI_VENC_ERR("not h265 encode channel\n"); + return CVI_FAILURE; + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + memcpy(&h265Split, pstSliceSplit, sizeof(VENC_H265_SLICE_SPLIT_S)); + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H265_SPLIT, + (CVI_VOID *)pstSliceSplit); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h265Split, &h265Split, sizeof(VENC_H265_SLICE_SPLIT_S)); + } else { + CVI_VENC_ERR("failed to set h265 split %d", s32Ret); + s32Ret = CVI_ERR_VENC_H265_SPLIT; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetH265SliceSplit(VENC_CHN VeChn, VENC_H265_SLICE_SPLIT_S *pstH265Split) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH265Split == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no h265 split param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H265) { + CVI_VENC_ERR("not h265 encode channel\n"); + return CVI_FAILURE; + } + + memcpy(pstH265Split, &pChnHandle->h265Split, sizeof(VENC_H265_SLICE_SPLIT_S)); + return CVI_SUCCESS; +} + +CVI_S32 CVI_VENC_SetH264Dblk(VENC_CHN VeChn, const VENC_H264_DBLK_S *pstH264Dblk) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + VENC_H264_DBLK_S h264Dblk; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264Dblk == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("pstH264Dblk is NULL\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_FAILURE; + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + memcpy(&h264Dblk, pstH264Dblk, sizeof(VENC_H264_DBLK_S)); + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H264_DBLK, (CVI_VOID *)(pstH264Dblk)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h264Dblk, pstH264Dblk, sizeof(VENC_H264_DBLK_S)); + } else { + CVI_VENC_ERR("failed to set h264 dblk %d", s32Ret); + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetH264Dblk(VENC_CHN VeChn, VENC_H264_DBLK_S *pstH264Dblk) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264Dblk == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("pstH264Dblk is NULL\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + memcpy(pstH264Dblk, &pChnHandle->h264Dblk, sizeof(VENC_H264_DBLK_S)); + return CVI_SUCCESS; +} + +CVI_S32 CVI_VENC_SetH265Dblk(VENC_CHN VeChn, const VENC_H265_DBLK_S *pstH265Dblk) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + VENC_H265_DBLK_S h265Dblk; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH265Dblk == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("pstH265Dblk is NULL\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H265) { + CVI_VENC_ERR("not h265 encode channel\n"); + return CVI_FAILURE; + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + memcpy(&h265Dblk, pstH265Dblk, sizeof(VENC_H265_DBLK_S)); + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H265_DBLK, (CVI_VOID *)(pstH265Dblk)); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h264Dblk, pstH265Dblk, sizeof(VENC_H265_DBLK_S)); + } else { + CVI_VENC_ERR("failed to set h265 dblk %d", s32Ret); + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetH265Dblk(VENC_CHN VeChn, VENC_H265_DBLK_S *pstH265Dblk) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH265Dblk == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("pstH265Dblk is NULL\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + memcpy(pstH265Dblk, &pChnHandle->h265Dblk, sizeof(VENC_H265_DBLK_S)); + return CVI_SUCCESS; +} + +CVI_S32 CVI_VENC_SetH264IntraPred(VENC_CHN VeChn, const VENC_H264_INTRA_PRED_S *pstH264IntraPred) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + VENC_H264_INTRA_PRED_S h264IntraPred; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264IntraPred == NULL) { + CVI_VENC_ERR("no h264 intra pred param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + if (pstH264IntraPred->constrained_intra_pred_flag != 0 && + pstH264IntraPred->constrained_intra_pred_flag != 1) { + CVI_VENC_ERR("intra pred param invalid:%u\n" + , pstH264IntraPred->constrained_intra_pred_flag); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_FAILURE; + } + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + memcpy(&h264IntraPred, pstH264IntraPred, sizeof(VENC_H264_INTRA_PRED_S)); + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_H264_INTRA_PRED, + (CVI_VOID *)pstH264IntraPred); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->h264IntraPred, &h264IntraPred, sizeof(VENC_H264_INTRA_PRED_S)); + } else { + CVI_VENC_ERR("failed to set intra pred %d", s32Ret); + s32Ret = CVI_ERR_VENC_H264_INTRA_PRED; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetH264IntraPred(VENC_CHN VeChn, VENC_H264_INTRA_PRED_S *pstH264IntraPred) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstH264IntraPred == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no h264 intra pred param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (enType != PT_H264) { + CVI_VENC_ERR("not h264 encode channel\n"); + return CVI_FAILURE; + } + + memcpy(pstH264IntraPred, &pChnHandle->h264IntraPred, sizeof(VENC_H264_INTRA_PRED_S)); + return CVI_SUCCESS; +} + + +#if 0 +CVI_S32 cviUpdateSbWptr(cviVencSbSetting *pstSbSetting) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + int sw_mode = 0; + int reg = 0; + + CVI_VENC_API("\n"); + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x00); + + if (pstSbSetting->codec & 0x1) + sw_mode = (reg & 0x30) >> 4; + else if (pstSbSetting->codec & 0x2) + sw_mode = (reg & 0x300) >> 8; + else if (pstSbSetting->codec & 0x4) + sw_mode = (reg & 0x3000) >> 12; + + if (sw_mode == 3) { // SW mode + // Set Register 0x0c + int wptr = 0; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x88); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x88 = 0x%x\n", reg); + + wptr = (reg >> 16) & 0x1F; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x0C); + reg = (reg & 0xFFFFFFE0) | wptr; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x0C, reg); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x0C = 0x%x\n", reg); + } + + return s32Ret; +} +#endif + +static int _cviVEncSbEnDummyPush(cviVencSbSetting *pstSbSetting) +{ + int ret = 0; + int reg = 0; + + // Enable sb dummy push + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x14); + reg |= 0x1; // reg_pri_push_ow_en bit0 + cvi_vc_drv_write_vc_reg(REG_SBM, 0x14, reg); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x14 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x14)); + + return ret; +} + +static int _cviVEncSbTrigDummyPush(cviVencSbSetting *pstSbSetting) +{ + int ret = 0; + int reg = 0; + int pop_cnt_pri = 0; + int push_cnt_pri = 0; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x94); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x\n", reg); + + push_cnt_pri = reg & 0x3F; + pop_cnt_pri = (reg >> 16) & 0x3F; + CVI_VENC_INFO("push_cnt_pri=%d, pop_cnt_pri=%d\n", push_cnt_pri, pop_cnt_pri); + + if (push_cnt_pri == pop_cnt_pri) { + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x14); + reg |= 0x4; // reg_pri_push_ow bit2 + cvi_vc_drv_write_vc_reg(REG_SBM, 0x14, reg); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x94)); + } + + return ret; +} + +static int _cviVEncSbDisDummyPush(cviVencSbSetting *pstSbSetting) +{ + int ret = 0; + int reg = 0; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x14); + reg &= (~0x1); // reg_pri_push_ow_en bit0 + cvi_vc_drv_write_vc_reg(REG_SBM, 0x14, reg); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x14 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x14)); + + return ret; +} + +static int _cviVEncSbGetSkipFrmStatus(cviVencSbSetting *pstSbSetting) +{ + int ret = 0; + int reg = 0; + int pop_cnt_pri = 0; + int push_cnt_pri = 0; + int target_slice_cnt; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x94); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x, 0x90= 0x%x\n", reg, cvi_vc_drv_read_vc_reg(REG_SBM, 0x90)); + + push_cnt_pri = reg & 0x3F; + pop_cnt_pri = (reg >> 16) & 0x3F; + + if (pstSbSetting->sb_size == 0) + target_slice_cnt = (pstSbSetting->src_height + 63) / 64; + else + target_slice_cnt = (pstSbSetting->src_height + 127) / 128; + + CVI_VENC_INFO("push_cnt_pri=%d, pop_cnt_pri=%d, src_height=%d, target_slice_cnt=%d\n", + push_cnt_pri, pop_cnt_pri, pstSbSetting->src_height, target_slice_cnt); + + if ((pop_cnt_pri == target_slice_cnt) || (push_cnt_pri > target_slice_cnt)) { + ret = 1; + CVI_VENC_INFO("psbSetting->src_height=%d, psbSetting->sb_size=%d, target_slice_cnt=%d\n", + pstSbSetting->src_height, pstSbSetting->sb_size, target_slice_cnt); + } + + return ret; +} + +static unsigned int _cviEncReadReg(unsigned long addr) +{ + unsigned int *p_reg = (unsigned int *)ioremap(addr, 4); + unsigned int value; + + value = readl(p_reg); + + iounmap(p_reg); + + return value; +} + +CVI_S32 cviSbSkipOneFrm(VENC_CHN VeChn, cviVencSbSetting *pstSbSetting) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + venc_enc_ctx *pEncCtx; + CVI_S32 s32Count = 0; + CVI_S32 s32MaxCount = 0; + venc_chn_context *pChnHandleDummy = NULL; + venc_enc_ctx *pEncCtxDummy; + CVI_U32 u32Reg94; + CVI_U32 u32Reg90; + CVI_U32 u32Reg80; + CVI_U32 u32ClkEnableReg2; + CVI_U32 u32VcFabReg9; +#if 0 + VIDEO_FRAME_INFO_S stFrame; + VENC_STREAM_S stStream; + VENC_CHN_STATUS_S stStat; +#endif + + CVI_VENC_API("VeChn = %d\n", VeChn); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + + pEncCtx = &pChnHandle->encCtx; + + pChnHandleDummy = handle->chn_handle[2]; + pEncCtxDummy = &pChnHandleDummy->encCtx; + +#if 0 + memset(&stFrame, 0, sizeof(VIDEO_FRAME_INFO_S)); + memset(&stStream, 0, sizeof(VENC_STREAM_S)); + + CVI_VENC_QueryStatus(VeChn, &stStat); + + stStream.pstPack = + (VENC_PACK_S *)MEM_MALLOC(sizeof(VENC_PACK_S) * stStat.u32CurPacks); +#endif + + s32Ret = _cviVEncSbEnDummyPush(pstSbSetting); + pChnHandle->bSbSkipFrm = true; + + // store before skip + u32Reg80 = cvi_vc_drv_read_vc_reg(REG_SBM, 0x80); + u32Reg90 = cvi_vc_drv_read_vc_reg(REG_SBM, 0x90); + u32Reg94 = cvi_vc_drv_read_vc_reg(REG_SBM, 0x94); + + // pri push cnt is 0 just return + if (!(u32Reg94 & 0x3F)) { + CVI_VENC_DEBUG("Chn:%d NO slice pushed, just return,80:0x%x, 90:0x%x, 94:0x%x\n", + VeChn, u32Reg80, u32Reg90, u32Reg94); + s32Ret = CVI_SUCCESS; + goto SKIP_FRAME_END; + } + + if (pstSbSetting->sb_size == 0) + s32MaxCount = (pstSbSetting->src_height + 63) / 64; + else + s32MaxCount = (pstSbSetting->src_height + 127) / 128; + + // 1ms for 1 slice buff, give more time to process + s32MaxCount *= 3; + + pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_DROP_FRAME, NULL); + + while (1) { + s32Ret = _cviVEncSbTrigDummyPush(pstSbSetting); + s32Ret = _cviVEncSbGetSkipFrmStatus(pstSbSetting); + if (s32Ret == 1) { + s32Ret = CVI_SUCCESS; + CVI_VENC_DEBUG("chn:%d pushcnt:%d maxcnt:%d\n", VeChn, s32Count, s32MaxCount); + CVI_VENC_DEBUG("SkipFrm done old 80:0x%x, 90:0x%x, 94:0x%x; new 80:0x%x, 90:0x%x, 94:0x%x\n", + u32Reg80, + u32Reg90, + u32Reg94, + cvi_vc_drv_read_vc_reg(REG_SBM, 0x80), + cvi_vc_drv_read_vc_reg(REG_SBM, 0x90), + cvi_vc_drv_read_vc_reg(REG_SBM, 0x94)); + break; + } + + usleep_range(1000, 5000); + if (s32Count > s32MaxCount) { + u32ClkEnableReg2 = _cviEncReadReg(CLK_ENABLE_REG_2_BASE); + u32VcFabReg9 = _cviEncReadReg(VC_FAB_REG_9_BASE); + + s32Ret = CVI_FAILURE; + pr_err("[%s][%d] SkipFrm Error, old 80:0x%x, 90:0x%x, 94:0x%x; new 80:0x%x, 90:0x%x, 94:0x%x; VPU_BUSY:%d %d; ClkEnableReg2:0x%x u32VcFabReg9:0x%x; MaxCount:%d\n", + __func__, __LINE__, + u32Reg80, + u32Reg90, + u32Reg94, + cvi_vc_drv_read_vc_reg(REG_SBM, 0x80), + cvi_vc_drv_read_vc_reg(REG_SBM, 0x90), + cvi_vc_drv_read_vc_reg(REG_SBM, 0x94), + VPU_IsBusy(0), + VPU_IsBusy(1), + u32ClkEnableReg2, + u32VcFabReg9, + s32MaxCount + ); + + break; + } + s32Count++; + } + +#if 0 + MEM_FREE(stStream.pstPack); + stStream.pstPack = NULL; +#endif +SKIP_FRAME_END: + pChnHandle->bSbSkipFrm = false; + _cviVEncSbDisDummyPush(pstSbSetting); + + return s32Ret; +} + +CVI_S32 cviResetSb(cviVencSbSetting *pstSbSetting) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + int reg = 0; + CVI_VENC_INFO("%s pid:%d comm:%s\n", __func__, current->pid, current->comm); + CVI_VENC_INFO("Before sw reset sb =================\n"); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x00 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x00)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x80 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x80)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x84 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x84)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x88 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x88)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x90 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x90)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x94)); + + // Reset VC SB ctrl + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x00); +#if 1 + reg |= 0x8; // reset all + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); +#else + if (pstSbSetting->codec & 0x1) { // h265 + reg |= 0x1; + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + } else if (pstSbSetting->codec & 0x2) { // h264 + reg |= 0x2; + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + } else { // jpeg + reg |= 0x4; + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + } +#endif + + CVI_VENC_INFO("After sw reset sb =================\n"); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x00 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x00)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x80 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x80)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x84 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x84)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x88 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x88)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x90 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x90)); + CVI_VENC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x\n", cvi_vc_drv_read_vc_reg(REG_SBM, 0x94)); + + return s32Ret; +} + +static CVI_S32 cviSetSBMEnable(venc_chn_context *pChnHandle, + CVI_BOOL bSBMEn) +{ + CVI_S32 ret; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + + if (pEncCtx->base.ioctl) { + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265 || + pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) { + ret = pEncCtx->base.ioctl(pEncCtx, + CVI_H26X_OP_SET_SBM_ENABLE, (CVI_VOID *)&bSBMEn); + if (ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_SET_SBM_ENABLE, %d\n", ret); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + return -1; + } + } else { + ret = pEncCtx->base.ioctl(pEncCtx, + CVI_JPEG_OP_SET_SBM_ENABLE, (CVI_VOID *)&bSBMEn); + if (ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_JPEG_OP_SET_SBM_ENABLE, %d\n", ret); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + return -1; + } + } + } + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("failed to set sbm enable %d", ret); + return ret; +} + +static CVI_S32 cviSetSBMStSetting(venc_chn_context *pChnHandle, + cviVencSbSetting *pstSbSetting) +{ + CVI_S32 ret; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + + memcpy(&pChnHandle->stSbSetting, pstSbSetting, sizeof(cviVencSbSetting)); + + if (pEncCtx->base.ioctl) { + ret = pEncCtx->base.ioctl(pEncCtx, + CVI_H26X_OP_SET_SBM_SETTING, (CVI_VOID *)pstSbSetting); + if (ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_H26X_OP_SET_SBM_SETTING, %d\n", ret); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + return -1; + } + } + + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("failed to set sbm enable %d", ret); + + return ret; +} + +static CVI_S32 cviWaitEncodeDone(venc_chn_context *pChnHandle) +{ + CVI_S32 ret = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + + if (pEncCtx->base.ioctl) { + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265 || + pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) { + ret = pEncCtx->base.ioctl(pEncCtx, + CVI_H26X_OP_WAIT_FRAME_DONE, NULL); + if (ret != CVI_SUCCESS) { + MUTEX_UNLOCK(&pChnHandle->chnMutex); + CVI_VENC_ERR("CVI_H26X_OP_WAIT_FRAME_DONE, %d\n", ret); + return -1; + } + } else { + ret = pEncCtx->base.ioctl(pEncCtx, + CVI_JPEG_OP_WAIT_FRAME_DONE, NULL); //CVI_JPEG_OP_SET_SBM_ENABLE + if (ret != CVI_SUCCESS) { + CVI_VENC_ERR("CVI_JPEG_OP_SET_SBM_ENABLE, %d\n", ret); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + return -1; + } + } + } + MUTEX_UNLOCK(&pChnHandle->chnMutex); + if (ret != CVI_SUCCESS) + CVI_VENC_ERR("failed to wait done %d", ret); + + return ret; +} + +#define ONLY_SEC_JPG 0 + +CVI_S32 cvi_VENC_CB_SendFrame(CVI_S32 VpssGrp, CVI_S32 VpssChn, CVI_S32 VpssChn1, + const struct cvi_buffer *pstInFrmBuf, + const struct cvi_buffer *pstInFrmBuf1, + CVI_BOOL isOnline, + CVI_U32 sb_nb, CVI_S32 s32MilliSec) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_sbm_context *pSbmHandle; + venc_chn_context *pSecChnHandle; + VIDEO_FRAME_INFO_S stVirtVideoFrame; + VIDEO_FRAME_S *pstVFrame = &stVirtVideoFrame.stVFrame; + +#if BYPASS_SB_MODE == 0 + cviVencSbSetting stSbSetting; +#endif + int i = 0; + MMF_CHN_S encChn = {0}; + CVI_S32 priChn = -1; + CVI_S32 secChn = -1; + CVI_BOOL SnapEnable = false; + MMF_CHN_S chn = {.enModId = CVI_ID_VPSS, .s32DevId = VpssGrp, .s32ChnId = VpssChn}; + MMF_BIND_DEST_S stBindDest; + + CVI_VENC_API("VpssGrp(%d) VpssChn(%d)\n", VpssGrp, VpssChn); + if (handle == NULL) { + CVI_VENC_WARN("Venc not init\n"); + return CVI_ERR_VENC_UNEXIST; + } + + if (VpssChn < 0 || !pstInFrmBuf) { + CVI_VENC_ERR("VpssChn(%d)\n", VpssChn); + return s32Ret; + } + + if (sys_get_bindbysrc(&chn, &stBindDest) != CVI_SUCCESS) { + CVI_VENC_WARN("sys_get_bindbysrc fail\n"); + return CVI_FAILURE; + } + + if (stBindDest.astMmfChn[0].enModId != CVI_ID_VENC) { + CVI_VENC_ERR("next Mod(%d) is not vcodec\n", stBindDest.astMmfChn[0].enModId); + return CVI_FAILURE; + } + + CVI_VENC_INFO("stBindDest.u32Num = %d\n", stBindDest.u32Num); + + if (stBindDest.u32Num > 2) { + CVI_VENC_ERR("vpss chn(%d) sbm bind num %d > 2\n", VpssChn, stBindDest.u32Num); + return CVI_FAILURE; + } + + for (i = 0; i < stBindDest.u32Num; i++) { + encChn = stBindDest.astMmfChn[i]; + CVI_VENC_INFO("s32DevId = %d, s32ChnId = %d\n", encChn.s32DevId, encChn.s32ChnId); + + if (handle->chn_status[encChn.s32ChnId] != VENC_CHN_STATE_START_ENC) + continue; + + pChnHandle = handle->chn_handle[encChn.s32ChnId]; + + if ((pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) || + (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265)) { + priChn = encChn.s32ChnId; + } + + if ((pChnHandle->pChnAttr->stVencAttr.enType == PT_JPEG) || + (pChnHandle->pChnAttr->stVencAttr.enType == PT_MJPEG)) { + if (stBindDest.u32Num == 1) + priChn = encChn.s32ChnId; + else + secChn = encChn.s32ChnId; + } + } + + pSbmHandle = &handle->sbm_context; + + CVI_VENC_INFO("priChn = %d, secChn = %d\n", priChn, secChn); + + if ((priChn == -1) && (secChn == -1)) { + CVI_VENC_ERR("(priChn == -1) && (secChn == -1)\n"); + return CVI_FAILURE; + } + +#if BYPASS_SB_MODE == 0 + if (priChn != -1) { + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265) { + stSbSetting.codec = 0x1; + } else if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) { + stSbSetting.codec = 0x2; + } else { + stSbSetting.codec = 0x4; + } + } + + SnapEnable = false; + + if (secChn != -1) { + s32Ret = check_chn_handle(secChn); + if (s32Ret == CVI_SUCCESS) { + pSecChnHandle = handle->chn_handle[secChn]; + CVI_VENC_INFO("pSecChnHandle->jpgFrmSkipCnt = %d\n", pSecChnHandle->jpgFrmSkipCnt); + + if (pSecChnHandle->jpgFrmSkipCnt > 0) { + stSbSetting.codec |= 0x4; + SnapEnable = true; + } + } + } + + stSbSetting.sb_mode = 2; + stSbSetting.sb_nb = sb_nb; + stSbSetting.sb_size = 0; //64 line + + stSbSetting.y_stride = pstInFrmBuf->stride[0]; + stSbSetting.uv_stride = pstInFrmBuf->stride[1]; + stSbSetting.src_height = pstInFrmBuf->size.u32Height; + stSbSetting.sb_ybase = pstInFrmBuf->phy_addr[0]; + stSbSetting.sb_uvbase = pstInFrmBuf->phy_addr[1]; + stSbSetting.sb_ybase1 = 0; + stSbSetting.sb_uvbase1 = 0; +#if ONLY_SEC_JPG + stSbSetting.sb_ybase = 0; + stSbSetting.sb_uvbase = 0; + stSbSetting.sb_ybase1 = pstInFrmBuf->phy_addr[0]; + stSbSetting.sb_uvbase1 = pstInFrmBuf->phy_addr[1]; +#endif + if (VpssChn1 != 0xFFFFFFFF) { + stSbSetting.sb_ybase1 = pstInFrmBuf1->phy_addr[0]; + stSbSetting.sb_uvbase1 = pstInFrmBuf1->phy_addr[1]; + stSbSetting.codec |= 0x4; + } + stSbSetting.VpssGrp = VpssGrp; + stSbSetting.VpssChn = VpssChn; + + MUTEX_LOCK(&pSbmHandle->SbmMutex); + + cviResetSb(NULL); + + cviSetSBMStSetting(pChnHandle, &stSbSetting); +#endif // #if BYPASS_SB_MODE == 0 + + memset(pstVFrame, 0, sizeof(*pstVFrame)); + pstVFrame->enPixelFormat = pstInFrmBuf->enPixelFormat; + pstVFrame->u32Width = pstInFrmBuf->size.u32Width; + pstVFrame->u32Height = pstInFrmBuf->size.u32Height; + pstVFrame->u32Stride[0] = pstInFrmBuf->stride[0]; + pstVFrame->u32Stride[1] = pstInFrmBuf->stride[1]; + pstVFrame->u32Stride[2] = pstInFrmBuf->stride[2]; + + pstVFrame->u32TimeRef = 0; + pstVFrame->u64PTS = 0; + pstVFrame->enDynamicRange = DYNAMIC_RANGE_SDR8; + + pstVFrame->u32Length[0] = pstInFrmBuf->length[0]; + pstVFrame->u32Length[1] = pstInFrmBuf->length[1]; + +#if BYPASS_SB_MODE + pstVFrame->u64PhyAddr[0] = pstInFrmBuf->phy_addr[0]; + pstVFrame->u64PhyAddr[1] = pstInFrmBuf->phy_addr[1]; +#else + +#if ONLY_SEC_JPG + pstVFrame->u64PhyAddr[0] = stSbSetting.src_ybase1; + pstVFrame->u64PhyAddr[1] = stSbSetting.src_uvbase1; + CVI_VENC_INFO("stSbSetting.src_ybase1 = 0x%x, stSbSetting.src_uvbase1 = 0x%x\n", + stSbSetting.src_ybase1, stSbSetting.src_uvbase1); +#else + pstVFrame->u64PhyAddr[0] = stSbSetting.src_ybase; + pstVFrame->u64PhyAddr[1] = stSbSetting.src_uvbase; + CVI_VENC_INFO("stSbSetting.src_ybase = 0x%x, stSbSetting.src_uvbase = 0x%x\n", + stSbSetting.src_ybase, stSbSetting.src_uvbase); +#endif +#endif + + CVI_VENC_INFO(" (P0:0x%llx, P1:0x%llx) (S0:%d, S1:%d)\n", pstVFrame->u64PhyAddr[0], pstVFrame->u64PhyAddr[1], + pstVFrame->u32Stride[0], pstVFrame->u32Stride[1]); + CVI_VENC_INFO(" (W:%d, H:%d)\n", pstVFrame->u32Width, pstVFrame->u32Height); + + if (priChn != -1) { + memcpy(&pChnHandle->stVideoFrameInfo, &stVirtVideoFrame, sizeof(VIDEO_FRAME_INFO_S)); + } + + if (priChn != -1) { + s32Ret = check_chn_handle(priChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle(%d), ret:%d\n", priChn, s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[priChn]; + CVI_VENC_INFO("u64PhyAddr[0]=0x%llx, u64PhyAddr[1]=0x%llx\n", + pstInFrmBuf->phy_addr[0], pstInFrmBuf->phy_addr[1]); + CVI_VENC_INFO("u32Stride[0]=%d,u32Stride[1]=%d, u32Height=%d\n", + pstInFrmBuf->stride[0], pstInFrmBuf->stride[1], + pstInFrmBuf->size.u32Height); + if (isOnline) { + if (pChnHandle->sbm_state != VENC_SBM_STATE_IDLE) { + CVI_VENC_ERR("pChnHandle->sbm_state(%d) != VENC_SBM_STATE_IDLE", pChnHandle->sbm_state); + goto SBM_CB_FAILURE; + } + + pChnHandle->sbm_state = VENC_SBM_STATE_IDLE; + + if (!pSbmHandle->pSBMSendFrameThread) { + struct sched_param param = { + .sched_priority = 99, + }; + + pSbmHandle->pSBMSendFrameThread = kthread_run(venc_sbm_send_frame_thread, + (CVI_VOID *)NULL, "cvitask_vc_sb"); + if (IS_ERR(pSbmHandle->pSBMSendFrameThread)) { + CVI_VENC_ERR( + "venc-sbm-send_frame_threadfor chn %d\n", + priChn); + goto SBM_CB_FAILURE; + } + sched_setscheduler(pSbmHandle->pSBMSendFrameThread, SCHED_RR, ¶m); + } + } + + cviSetSBMEnable(pChnHandle, CVI_TRUE); + } + + MUTEX_UNLOCK(&pSbmHandle->SbmMutex); + + return CVI_SUCCESS; +SBM_CB_FAILURE: + + MUTEX_UNLOCK(&pSbmHandle->SbmMutex); + + return CVI_FAILURE; +} + +CVI_S32 cvi_VENC_CB_SkipFrame(CVI_S32 VpssGrp, CVI_S32 VpssChn, CVI_U32 srcImgHeight, CVI_S32 s32MilliSec) +{ + CVI_S32 s32Ret = CVI_FAILURE; + cviVencSbSetting stSbSetting; + venc_chn_context *pChnHandle; + CVI_S32 priChn = -1; + CVI_S32 secChn = -1; + venc_enc_ctx *pEncCtx; +#if BYPASS_SB_MODE == 0 + cviVencSbSetting *pstSbSetting; +#endif + +#if 0 + int i = 0; + MMF_CHN_S encChn = {0}; + MMF_CHN_S chn = {.enModId = CVI_ID_VPSS, .s32DevId = VpssGrp, .s32ChnId = VpssChn}; + MMF_BIND_DEST_S stBindDest; +#endif + CVI_VENC_API("\n"); + + if (VpssChn < 0) { + CVI_VENC_ERR("VpssChn(%d)\n", VpssChn); + return s32Ret; + } +#if 0 + if (sys_get_bindbysrc(&chn, &stBindDest) != CVI_SUCCESS) { + CVI_VENC_ERR("sys_get_bindbysrc fail\n"); + return CVI_FAILURE; + } + + if (stBindDest.astMmfChn[0].enModId != CVI_ID_VENC) { + CVI_VENC_ERR("next Mod(%d) is not vcodec\n", stBindDest.astMmfChn[0].enModId); + return CVI_FAILURE; + } + + CVI_VENC_INFO("stBindDest.u32Num = %d\n", stBindDest.u32Num); + + if (stBindDest.u32Num > 2) { + CVI_VENC_ERR("vpss chn(%d) sbm bind num %d > 2\n", VpssChn, stBindDest.u32Num); + return CVI_FAILURE; + } + + for (i = 0; i < stBindDest.u32Num; i++) { + encChn = stBindDest.astMmfChn[i]; + CVI_VENC_INFO("s32DevId = %d, s32ChnId = %d\n", encChn.s32DevId, encChn.s32ChnId); + + if (handle->chn_status[encChn.s32ChnId] != VENC_CHN_STATE_START_ENC) + continue; + + pChnHandle = handle->chn_handle[encChn.s32ChnId]; + + if ((pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) || + (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265)) { + priChn = encChn.s32ChnId; + } + + if ((pChnHandle->pChnAttr->stVencAttr.enType == PT_JPEG) || + (pChnHandle->pChnAttr->stVencAttr.enType == PT_MJPEG)) { + if (stBindDest.u32Num == 1) + priChn = encChn.s32ChnId; + else + secChn = encChn.s32ChnId; + } + } +#else + // can't use sys_get_bindbysrc, unbind before stop venc + priChn = 0; + secChn = -1; +#endif + + CVI_VENC_INFO("priChn = %d, secChn = %d\n", priChn, secChn); + + if ((priChn == -1) && (secChn == -1)) { + CVI_VENC_ERR("(priChn == -1) && (secChn == -1)\n"); + return CVI_FAILURE; + } +#if BYPASS_SB_MODE == 0 + // find bind venc chn + for (priChn = 0; priChn < VENC_MAX_CHN_NUM; priChn++) { + s32Ret = check_chn_handle(priChn); + if (s32Ret != CVI_SUCCESS) { + continue; + } + pChnHandle = handle->chn_handle[priChn]; + pstSbSetting = &pChnHandle->stSbSetting; + if (pstSbSetting->VpssGrp == VpssGrp && pstSbSetting->VpssChn == VpssChn) + break; + } + + if (priChn == VENC_MAX_CHN_NUM) { + CVI_VENC_ERR("NO VPSS grp:%d chn:%d unbind VENC\n", VpssGrp, VpssChn); + return CVI_FAILURE; + } + + CVI_VENC_DEBUG("VpssGrp:%d VpssChn:%d VencChn:%d\n", VpssGrp, VpssChn, priChn); +#else + if (priChn != -1) { + s32Ret = check_chn_handle(priChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle(%d), ret:%d\n", priChn, s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[priChn]; + } +#endif + + pEncCtx = &pChnHandle->encCtx; + + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265) { + stSbSetting.codec = 0x1; // h265 + } else { + stSbSetting.codec = 0x2; // h264 + } + + stSbSetting.sb_size = 0; + stSbSetting.src_height = srcImgHeight; + + s32Ret = cviSbSkipOneFrm(priChn, &stSbSetting); + + cviResetSb(&stSbSetting); + if (pChnHandle->sbm_state == VENC_SBM_STATE_FRM_RUN) + pChnHandle->sbm_state = VENC_SBM_STATE_IDLE; + + return s32Ret; +} + +CVI_S32 cvi_VENC_CB_SnapJpgFrame(CVI_S32 VpssGrp, CVI_S32 VpssChn, CVI_U32 FrmCnt) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + int i = 0; + MMF_CHN_S jpgChn; + + MMF_CHN_S chn = {.enModId = CVI_ID_VPSS, .s32DevId = VpssGrp, .s32ChnId = VpssChn}; + MMF_BIND_DEST_S stBindDest; + + CVI_VENC_API("Grp(%d) Chn(%d) frame_cnt(%d)\n", VpssGrp, VpssChn, FrmCnt); + + if (sys_get_bindbysrc(&chn, &stBindDest) != CVI_SUCCESS) { + CVI_VENC_ERR("sys_get_bindbysrc fail\n"); + return CVI_FAILURE; + } + + CVI_VENC_INFO("stBindDest.u32Num = %d\n", stBindDest.u32Num); + + if (stBindDest.astMmfChn[0].enModId != CVI_ID_VENC) { + CVI_VENC_ERR("next Mod(%d) is not vcodec\n", stBindDest.astMmfChn[0].enModId); + return CVI_FAILURE; + } + + for (i = 0; i < stBindDest.u32Num; i++) { + jpgChn = stBindDest.astMmfChn[i]; + pChnHandle = handle->chn_handle[jpgChn.s32ChnId]; + + if ((pChnHandle->pChnAttr->stVencAttr.enType == PT_JPEG) || + (pChnHandle->pChnAttr->stVencAttr.enType == PT_MJPEG)) { + break; + } + } + + if (i == stBindDest.u32Num) { + CVI_VENC_ERR("Can't find jpeg encoder\n"); + return CVI_FAILURE; + } + + pChnHandle->jpgFrmSkipCnt = FrmCnt; + CVI_VENC_INFO("chn(%d), jpgFrmSkipCnt = %d\n", jpgChn.s32ChnId, pChnHandle->jpgFrmSkipCnt); + + s32Ret = CVI_SUCCESS; + + return s32Ret; +} + +CVI_S32 cvi_VENC_CB_SwitchChn(CVI_S32 VpssGrp, CVI_S32 VpssChn) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_sbm_context *pSbmHandle; + MMF_CHN_S VencChn; + + MMF_CHN_S chn = {.enModId = CVI_ID_VPSS, .s32DevId = VpssGrp, .s32ChnId = VpssChn}; + MMF_BIND_DEST_S stBindDest; + + CVI_VENC_API("Grp(%d) Chn(%d)\n", VpssGrp, VpssChn); + + if (sys_get_bindbysrc(&chn, &stBindDest) != CVI_SUCCESS) { + CVI_VENC_ERR("sys_get_bindbysrc fail\n"); + return CVI_FAILURE; + } + + CVI_VENC_INFO("stBindDest.u32Num = %d\n", stBindDest.u32Num); + + if (stBindDest.astMmfChn[0].enModId != CVI_ID_VENC) { + CVI_VENC_ERR("next Mod(%d) is not vcodec\n", stBindDest.astMmfChn[0].enModId); + return CVI_FAILURE; + } + + if (stBindDest.u32Num != 1) { + CVI_VENC_ERR("Dest chn num(%d) err\n", stBindDest.u32Num); + return CVI_FAILURE; + } + + VencChn = stBindDest.astMmfChn[0]; + + s32Ret = check_chn_handle(VencChn.s32ChnId); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + pSbmHandle = &handle->sbm_context; + + pSbmHandle->CurrSbmChn = VencChn.s32ChnId; + + return CVI_SUCCESS; +} + +CVI_S32 CVI_VENC_EnableSVC(VENC_CHN VeChn, CVI_BOOL bEnable) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + venc_chn_context *pChnHandle = NULL; + PAYLOAD_TYPE_E enType; + venc_enc_ctx *pEncCtx; + + CVI_VENC_API("\n"); + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle Error, s32Ret = %d\n", s32Ret); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + pEncCtx = &pChnHandle->encCtx; + + if (enType == PT_H264 || enType == PT_H265) { + pChnHandle->bSvcEnable = bEnable; + if (pEncCtx->base.ioctl) { + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = + pEncCtx->base.ioctl(pEncCtx, + CVI_H26X_OP_SET_ENABLE_SVC, + (CVI_VOID *)&bEnable); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR( + "CVI_H26X_OP_SET_ENABLE_SVC, %d\n", + s32Ret); + return s32Ret; + } + } + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_SetSvcParam(VENC_CHN VeChn, VENC_SVC_PARAM_S *pstSvcParam) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + venc_enc_ctx *pEncCtx; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (!pstSvcParam) { + CVI_VENC_ERR("no svc param\n"); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + if (pstSvcParam->complex_scene_detect_en && + pstSvcParam->complex_scene_low_th >= + pstSvcParam->complex_scene_hight_th) { + CVI_VENC_ERR("scene_th error low_th %d, hight_th %d", + pstSvcParam->complex_scene_low_th, + pstSvcParam->complex_scene_hight_th); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + if (pstSvcParam->complex_scene_detect_en && + pstSvcParam->middle_min_percent >= + pstSvcParam->complex_min_percent) { + CVI_VENC_ERR("scene bit percent error middle_percent %d, hight_percent %d", + pstSvcParam->middle_min_percent, + pstSvcParam->complex_min_percent); + return CVI_FAILURE_ILLEGAL_PARAM; + } + + pChnHandle = handle->chn_handle[VeChn]; + pEncCtx = &pChnHandle->encCtx; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + + if (!pEncCtx->base.ioctl) { + CVI_VENC_ERR("base.ioctl is NULL\n"); + return CVI_FAILURE; + } + + if (MUTEX_LOCK(&pChnHandle->chnMutex) != 0) { + CVI_VENC_ERR("can not lock chnMutex\n"); + return CVI_FAILURE; + } + s32Ret = pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_SET_SVC_PARAM, + (CVI_VOID *)pstSvcParam); + MUTEX_UNLOCK(&pChnHandle->chnMutex); + + if (s32Ret == CVI_SUCCESS) { + memcpy(&pChnHandle->svcParam, pstSvcParam, sizeof(VENC_SVC_PARAM_S)); + } else { + CVI_VENC_ERR("failed to set svc param %d", s32Ret); + s32Ret = CVI_ERR_VENC_SVC_PARAM; + } + + return s32Ret; +} + +CVI_S32 CVI_VENC_GetSvcParam(VENC_CHN VeChn, VENC_SVC_PARAM_S *pstSvcParam) +{ + CVI_S32 s32Ret = CVI_FAILURE; + venc_chn_context *pChnHandle; + PAYLOAD_TYPE_E enType; + + s32Ret = check_chn_handle(VeChn); + if (s32Ret != CVI_SUCCESS) { + CVI_VENC_ERR("check_chn_handle, %d\n", s32Ret); + return s32Ret; + } + + if (pstSvcParam == NULL) { + s32Ret = CVI_FAILURE_ILLEGAL_PARAM; + CVI_VENC_ERR("no svc param\n"); + return s32Ret; + } + + pChnHandle = handle->chn_handle[VeChn]; + enType = pChnHandle->pChnAttr->stVencAttr.enType; + memcpy(pstSvcParam, &pChnHandle->svcParam, sizeof(VENC_SVC_PARAM_S)); + return CVI_SUCCESS; +} + + diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/src/enc_ctx.c b/osdrv/interdrv/v2/cvi_vc_drv/module/src/enc_ctx.c new file mode 100644 index 0000000000..de386a41ec --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/src/enc_ctx.c @@ -0,0 +1,1194 @@ +#include "venc.h" +#include "enc_ctx.h" +#include "module_common.h" +#include "vdi_osal.h" +#include + + +#ifndef UNREFERENCED_PARAM +#define UNREFERENCED_PARAM(x) ((void)(x)) +#endif + +#define DEF_IQP 32 +#define DEF_PQP 32 +#define ENC_TIMEOUT (-2) +#define DEAULT_QP_MAP_BITRATE 6000 + +static CVI_S32 jpege_init(CVI_VOID); +static CVI_S32 jpege_open(CVI_VOID *handle, CVI_VOID *pchnctx); +static CVI_S32 jpege_close(CVI_VOID *ctx); +static CVI_S32 jpege_enc_one_pic(CVI_VOID *ctx, + const VIDEO_FRAME_INFO_S *pstFrame, + int s32MilliSec); +static CVI_VOID setSrcInfo(CVIFRAMEBUF *psi, venc_enc_ctx *pEncCtx, + const VIDEO_FRAME_INFO_S *pstFrame); +static CVI_S32 jpege_get_stream(CVI_VOID *ctx, VENC_STREAM_S *pstStream, + CVI_S32 s32MilliSec); +static CVI_S32 jpege_release_stream(CVI_VOID *ctx, VENC_STREAM_S *pstStream); +static CVI_S32 jpege_ioctl(CVI_VOID *ctx, CVI_S32 op, CVI_VOID *arg); + +static CVI_S32 vidEnc_init(CVI_VOID); +static CVI_S32 vidEnc_open(CVI_VOID *handle, CVI_VOID *pchnctx); +static CVI_S32 vidEnc_close(CVI_VOID *ctx); +static CVI_S32 vidEnc_enc_one_pic(CVI_VOID *ctx, + const VIDEO_FRAME_INFO_S *pstFrame, + CVI_S32 s32MilliSec); +static CVI_S32 vidEnc_get_stream(CVI_VOID *ctx, VENC_STREAM_S *pstStream, + CVI_S32 s32MilliSec); +static CVI_S32 vidEnc_release_stream(CVI_VOID *ctx, VENC_STREAM_S *pstStream); +static CVI_S32 vidEnc_ioctl(CVI_VOID *ctx, CVI_S32 op, CVI_VOID *arg); + +#define H264_NALU_TYPE_IDR 5 + +static CVI_VOID h265e_setInitCfgFixQp(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_VOID h265e_setInitCfgCbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_VOID h265e_setInitCfgVbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_VOID h265e_setInitCfgAVbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_VOID h265e_setInitCfgQpMap(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_VOID h265e_setInitCfgUbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_S32 h265e_mapNaluType(VENC_PACK_S *ppack, CVI_S32 naluType); + +#define H265_NALU_TYPE_W_RADL 19 +#define H265_NALU_TYPE_N_LP 20 + +static CVI_VOID cviSetInitCfgGop(cviInitEncConfig *pInitEncCfg, + venc_chn_context *pChnHandle); +static CVI_VOID h264e_setInitCfgFixQp(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_VOID h264e_setInitCfgCbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_VOID h264e_setInitCfgVbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_VOID h264e_setInitCfgAVbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_VOID h264e_setInitCfgUbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx); +static CVI_S32 h264e_mapNaluType(VENC_PACK_S *ppack, CVI_S32 naluType); + +CVI_S32 venc_create_enc_ctx(venc_enc_ctx *pEncCtx, CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_ATTR_S *pVencAttr = &pChnAttr->stVencAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + CVI_S32 status = 0; + + VENC_MEMSET(pEncCtx, 0, sizeof(venc_enc_ctx)); + + switch (pVencAttr->enType) { + case PT_JPEG: + case PT_MJPEG: + pEncCtx->base.init = &jpege_init; + pEncCtx->base.open = &jpege_open; + pEncCtx->base.close = &jpege_close; + pEncCtx->base.encOnePic = &jpege_enc_one_pic; + pEncCtx->base.getStream = &jpege_get_stream; + pEncCtx->base.releaseStream = &jpege_release_stream; + pEncCtx->base.ioctl = &jpege_ioctl; + break; + case PT_H264: + pEncCtx->base.init = &vidEnc_init; + pEncCtx->base.open = &vidEnc_open; + pEncCtx->base.close = &vidEnc_close; + pEncCtx->base.encOnePic = &vidEnc_enc_one_pic; + pEncCtx->base.getStream = &vidEnc_get_stream; + pEncCtx->base.releaseStream = &vidEnc_release_stream; + pEncCtx->base.ioctl = &vidEnc_ioctl; + + pEncCtx->ext.vid.setInitCfgFixQp = h264e_setInitCfgFixQp; + pEncCtx->ext.vid.setInitCfgCbr = h264e_setInitCfgCbr; + pEncCtx->ext.vid.setInitCfgVbr = h264e_setInitCfgVbr; + pEncCtx->ext.vid.setInitCfgAVbr = h264e_setInitCfgAVbr; + pEncCtx->ext.vid.setInitCfgUbr = h264e_setInitCfgUbr; + pEncCtx->ext.vid.mapNaluType = h264e_mapNaluType; + + pEncCtx->base.u32Profile = pVencAttr->u32Profile; + pEncCtx->base.rcMode = prcatt->enRcMode - VENC_RC_MODE_H264CBR; + + if (pEncCtx->base.rcMode == RC_MODE_CBR) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgCbr; + pEncCtx->base.bVariFpsEn = prcatt->stH264Cbr.bVariFpsEn; + } else if (pEncCtx->base.rcMode == RC_MODE_VBR) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgVbr; + pEncCtx->base.bVariFpsEn = prcatt->stH264Vbr.bVariFpsEn; + } else if (pEncCtx->base.rcMode == RC_MODE_AVBR) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgAVbr; + pEncCtx->base.bVariFpsEn = + prcatt->stH264AVbr.bVariFpsEn; + } else if (pEncCtx->base.rcMode == RC_MODE_FIXQP) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgFixQp; + pEncCtx->base.bVariFpsEn = + prcatt->stH264FixQp.bVariFpsEn; + } else if (pEncCtx->base.rcMode == RC_MODE_UBR) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgUbr; + pEncCtx->base.bVariFpsEn = prcatt->stH264Ubr.bVariFpsEn; + } + break; + case PT_H265: + pEncCtx->base.init = &vidEnc_init; + pEncCtx->base.open = &vidEnc_open; + pEncCtx->base.close = &vidEnc_close; + pEncCtx->base.encOnePic = &vidEnc_enc_one_pic; + pEncCtx->base.getStream = &vidEnc_get_stream; + pEncCtx->base.releaseStream = &vidEnc_release_stream; + pEncCtx->base.ioctl = &vidEnc_ioctl; + + pEncCtx->ext.vid.setInitCfgFixQp = h265e_setInitCfgFixQp; + pEncCtx->ext.vid.setInitCfgCbr = h265e_setInitCfgCbr; + pEncCtx->ext.vid.setInitCfgVbr = h265e_setInitCfgVbr; + pEncCtx->ext.vid.setInitCfgAVbr = h265e_setInitCfgAVbr; + pEncCtx->ext.vid.setInitCfgQpMap = h265e_setInitCfgQpMap; + pEncCtx->ext.vid.setInitCfgUbr = h265e_setInitCfgUbr; + pEncCtx->ext.vid.mapNaluType = h265e_mapNaluType; + + pEncCtx->base.u32Profile = pVencAttr->u32Profile; + pEncCtx->base.rcMode = prcatt->enRcMode - VENC_RC_MODE_H265CBR; + + if (pEncCtx->base.rcMode == RC_MODE_CBR) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgCbr; + pEncCtx->base.bVariFpsEn = prcatt->stH265Cbr.bVariFpsEn; + } else if (pEncCtx->base.rcMode == RC_MODE_VBR) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgVbr; + pEncCtx->base.bVariFpsEn = prcatt->stH265Vbr.bVariFpsEn; + } else if (pEncCtx->base.rcMode == RC_MODE_AVBR) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgAVbr; + pEncCtx->base.bVariFpsEn = + prcatt->stH265AVbr.bVariFpsEn; + } else if (pEncCtx->base.rcMode == RC_MODE_FIXQP) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgFixQp; + pEncCtx->base.bVariFpsEn = + prcatt->stH265FixQp.bVariFpsEn; + } else if (pEncCtx->base.rcMode == RC_MODE_QPMAP) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgQpMap; + pEncCtx->base.bVariFpsEn = + prcatt->stH265QpMap.bVariFpsEn; + } else if (pEncCtx->base.rcMode == RC_MODE_UBR) { + pEncCtx->ext.vid.setInitCfgRc = + pEncCtx->ext.vid.setInitCfgUbr; + pEncCtx->base.bVariFpsEn = prcatt->stH265Ubr.bVariFpsEn; + } + break; + default: + CVI_VENC_ERR("enType = %d\n", pVencAttr->enType); + return -1; + } + + pEncCtx->base.width = pVencAttr->u32PicWidth; + pEncCtx->base.height = pVencAttr->u32PicHeight; + + return status; +} + +static CVI_S32 jpege_init(CVI_VOID) +{ + CVI_S32 status = CVI_SUCCESS; + + status = CVIJpgInit(); + if (status != CVI_SUCCESS) { + CVIJpgUninit(); + CVI_VENC_ERR("CVIJpgUninit\n"); + return CVI_FAILURE; + } + + return status; +} + +static CVI_S32 jpege_open(CVI_VOID *handle, CVI_VOID *pchnctx) +{ + venc_context *pHandle = (venc_context *)handle; + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + CVI_S32 status = CVI_SUCCESS; + CVIJpgConfig config; + CVIJpgHandle jpghandle = NULL; + VENC_RC_ATTR_S *prcatt = NULL; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + + memset(&config, 0, sizeof(CVIJpgConfig)); + + // JPEG marker order + memcpy(config.u.enc.jpgMarkerOrder, + pHandle->ModParam.stJpegeModParam.JpegMarkerOrder, + CVI_JPG_MARKER_ORDER_BUF_SIZE); + + config.type = CVIJPGCOD_ENC; + config.u.enc.picWidth = pEncCtx->base.width; + config.u.enc.picHeight = pEncCtx->base.height; + config.u.enc.sourceFormat = CVI_FORMAT_420; // TODO + config.u.enc.chromaInterleave = 0; // CbCr Separated + config.u.enc.mirDir = 0; // no mirror + config.u.enc.packedFormat = 0; // planar + config.u.enc.src_type = JPEG_MEM_EXTERNAL; + config.u.enc.singleEsBuffer = + pHandle->ModParam.stJpegeModParam.bSingleEsBuf; + if (config.u.enc.singleEsBuffer) + config.u.enc.bitstreamBufSize = + pHandle->ModParam.stJpegeModParam.u32SingleEsBufSize; + else + config.u.enc.bitstreamBufSize = pChnAttr->stVencAttr.u32BufSize; + + if ((config.u.enc.bitstreamBufSize & 0x3FF) != 0) { + CVI_VENC_ERR("%s bitstreamBufSize (0x%x) must align to 1024\n", + __func__, config.u.enc.bitstreamBufSize); + return CVI_ERR_VENC_NOT_SUPPORT; + } + prcatt = &pChnAttr->stRcAttr; + + if (prcatt->enRcMode == VENC_RC_MODE_MJPEGFIXQP) { + VENC_MJPEG_FIXQP_S *pstMJPEGFixQp = &prcatt->stMjpegFixQp; + + config.u.enc.quality = pstMJPEGFixQp->u32Qfactor; + CVI_VENC_TRACE("enRcMode = %d, u32Qfactor = %d\n", + prcatt->enRcMode, pstMJPEGFixQp->u32Qfactor); + } else { + VENC_MJPEG_CBR_S *pstMJPEGCbr = &prcatt->stMjpegCbr; + int frameRateDiv, frameRateRes; + + config.u.enc.bitrate = pstMJPEGCbr->u32BitRate; + frameRateDiv = (pstMJPEGCbr->fr32DstFrameRate >> 16); + frameRateRes = pstMJPEGCbr->fr32DstFrameRate & 0xFFFF; + + if (frameRateDiv == 0) { + config.u.enc.framerate = frameRateRes; + } else { + config.u.enc.framerate = + ((frameRateDiv - 1) << 16) + frameRateRes; + } + } + + config.s32ChnNum = pChnHandle->VeChn; + jpghandle = CVIJpgOpen(config); + if (jpghandle == NULL) { + CVI_VENC_ERR("%s CVIJpgOpen failed !\n", __func__); + jpege_close(pEncCtx); + return CVI_ERR_VENC_NULL_PTR; + } + pEncCtx->ext.jpeg.handle = jpghandle; + + return status; +} + +static CVI_S32 jpege_close(CVI_VOID *ctx) +{ + CVI_S32 status = CVI_SUCCESS; + CVIJpgHandle *pHandle; + + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + + pHandle = pEncCtx->ext.jpeg.handle; + if (pHandle != NULL) { + CVIJpgClose(pHandle); + pEncCtx->ext.jpeg.handle = NULL; + CVIJpgUninit(); + } + + return status; +} + +static CVI_S32 jpege_enc_one_pic(CVI_VOID *ctx, + const VIDEO_FRAME_INFO_S *pstFrame, + CVI_S32 s32MIlliSec) +{ + CVIJpgHandle *pHandle; + CVIFRAMEBUF srcInfo, *psi = &srcInfo; + CVI_S32 status = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + + pHandle = pEncCtx->ext.jpeg.handle; + + setSrcInfo(psi, pEncCtx, pstFrame); + + status = CVIJpgSendFrameData(pHandle, (void *)&srcInfo, + JPEG_MEM_EXTERNAL, s32MIlliSec); + + if (status == ENC_TIMEOUT) { + //jpeg_enc_one_pic TimeOut..dont close + //otherwise parallel / multiple jpg encode will failure + return CVI_ERR_VENC_BUSY; + } + + if (status != CVI_SUCCESS) { + CVI_VENC_ERR("Failed to CVIJpgSendFrameData, ret = %x\n", + status); + jpege_close(pEncCtx); + return CVI_ERR_VENC_BUSY; + } + + return status; +} + +static CVI_VOID setSrcInfo(CVIFRAMEBUF *psi, venc_enc_ctx *pEncCtx, + const VIDEO_FRAME_INFO_S *pstFrame) +{ + venc_enc_ctx_base *pvecb = &pEncCtx->base; + const VIDEO_FRAME_S *pstVFrame; + + pstVFrame = &pstFrame->stVFrame; + + psi->strideY = pstVFrame->u32Stride[0]; + psi->strideC = pstVFrame->u32Stride[1]; + psi->vbY.phys_addr = + pstVFrame->u64PhyAddr[0] + psi->strideY * pvecb->y + pvecb->x; + + switch (pstVFrame->enPixelFormat) { + case PIXEL_FORMAT_YUV_PLANAR_422: + psi->format = CVI_FORMAT_422; + psi->packedFormat = CVI_PACKED_FORMAT_NONE; + psi->chromaInterleave = CVI_CBCR_SEPARATED; + psi->vbCb.phys_addr = pstVFrame->u64PhyAddr[1] + + psi->strideC * pvecb->y + pvecb->x / 2; + psi->vbCr.phys_addr = pstVFrame->u64PhyAddr[2] + + psi->strideC * pvecb->y + pvecb->x / 2; + break; + case PIXEL_FORMAT_NV12: + case PIXEL_FORMAT_NV21: + psi->format = CVI_FORMAT_420; + psi->packedFormat = CVI_PACKED_FORMAT_NONE; + psi->chromaInterleave = + (pstVFrame->enPixelFormat == PIXEL_FORMAT_NV12) ? + CVI_CBCR_INTERLEAVE : + CVI_CRCB_INTERLEAVE; + psi->vbCb.phys_addr = pstVFrame->u64PhyAddr[1] + + psi->strideC * pvecb->y / 2 + pvecb->x; + psi->vbCr.phys_addr = 0; + break; + case PIXEL_FORMAT_YUV_PLANAR_420: + default: + psi->format = CVI_FORMAT_420; + psi->packedFormat = CVI_PACKED_FORMAT_NONE; + psi->chromaInterleave = CVI_CBCR_SEPARATED; + psi->vbCb.phys_addr = pstVFrame->u64PhyAddr[1] + + psi->strideC * pvecb->y / 2 + + pvecb->x / 2; + psi->vbCr.phys_addr = pstVFrame->u64PhyAddr[2] + + psi->strideC * pvecb->y / 2 + + pvecb->x / 2; + break; + } + + psi->vbY.virt_addr = (void *)pstVFrame->pu8VirAddr[0] + + (psi->vbY.phys_addr - pstVFrame->u64PhyAddr[0]); + psi->vbCb.virt_addr = (void *)pstVFrame->pu8VirAddr[1] + + (psi->vbCb.phys_addr - pstVFrame->u64PhyAddr[1]); + psi->vbCr.virt_addr = (void *)pstVFrame->pu8VirAddr[2] + + (psi->vbCr.phys_addr - pstVFrame->u64PhyAddr[2]); + + CVI_VENC_SRC("x = %d, y = %d, stride = %d\n", pvecb->x, pvecb->y, + psi->strideY); + CVI_VENC_SRC("orig pa Y = 0x%llx, Cb = 0x%llx, Cr = 0x%llx\n", + pstVFrame->u64PhyAddr[0], pstVFrame->u64PhyAddr[1], + pstVFrame->u64PhyAddr[2]); + CVI_VENC_SRC( + "phyAddrY = 0x%llX, phyAddrCb = 0x%llX, phyAddrCr = 0x%llX\n", + psi->vbY.phys_addr, psi->vbCb.phys_addr, psi->vbCr.phys_addr); +} + +static CVI_S32 jpege_get_stream(CVI_VOID *ctx, VENC_STREAM_S *pstStream, + CVI_S32 s32MilliSec) +{ + CVIBUF cviBuf = { 0 }; + CVI_S32 status = CVI_SUCCESS; + CVIJpgHandle *pHandle; + VENC_PACK_S *ppack; + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + + UNREFERENCED_PARAM(s32MilliSec); + + pHandle = pEncCtx->ext.jpeg.handle; + + status = CVIJpgGetFrameData( + pHandle, (CVI_U8 *)&cviBuf, sizeof(CVIBUF), + (unsigned long int *)&pEncCtx->base.u64EncHwTime); +#if 0 + if (status != CVI_SUCCESS) { + CVI_VENC_ERR("Failed to CVIJpgGetFrameData, ret = %x\n", + status); + jpege_close(pEncCtx); + return CVI_ERR_VENC_BUSY; + } +#else + if (status != CVI_SUCCESS) { + CVI_VENC_ERR("Failed to CVIJpgGetFrameData, ret = %x\n", status); + return CVI_ERR_VENC_BUSY; + } +#endif + pstStream->u32PackCount = 1; + ppack = &pstStream->pstPack[0]; + + memset(ppack, 0, sizeof(VENC_PACK_S)); + + ppack->pu8Addr = (CVI_U8 *)cviBuf.virt_addr; + ppack->u64PhyAddr = cviBuf.phys_addr; + ppack->u32Len = cviBuf.size; + ppack->u64PTS = pEncCtx->base.u64PTS; + + return status; +} + +static CVI_S32 jpege_release_stream(CVI_VOID *ctx, VENC_STREAM_S *pstStream) +{ + CVI_S32 status = CVI_SUCCESS; + CVIJpgHandle *pHandle; + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + + UNREFERENCED_PARAM(pstStream); + + pHandle = pEncCtx->ext.jpeg.handle; + status = CVIJpgReleaseFrameData(pHandle); + + if (status != CVI_SUCCESS) { + CVI_VENC_ERR("Failed to CVIJpgReleaseFrameData, ret = %x\n", + status); + jpege_close(pEncCtx); + return CVI_ERR_VENC_BUSY; + } + + return CVI_SUCCESS; +} + +static CVI_S32 jpege_ioctl(CVI_VOID *ctx, CVI_S32 op, CVI_VOID *arg) +{ + CVI_S32 status = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + CVI_S32 currOp; + + CVI_VENC_TRACE("\n"); + + currOp = (op & CVI_JPEG_OP_MASK) >> CVI_JPEG_OP_SHIFT; + if (currOp == 0) { + CVI_VENC_TRACE("op = 0x%X, currOp = 0x%X\n", op, currOp); + return 0; + } + + status = cviJpegIoctl(pEncCtx->ext.jpeg.handle, currOp, arg); + if (status != CVI_SUCCESS) { + CVI_VENC_ERR("cviJpgIoctl, currOp = 0x%X, status = %d\n", + currOp, status); + return status; + } + + return status; +} + +static CVI_S32 vidEnc_init(CVI_VOID) +{ + CVI_S32 status = CVI_SUCCESS; + return status; +} + +static CVI_S32 vidEnc_open(CVI_VOID *handle, CVI_VOID *pchnctx) +{ + venc_context *pHandle = (venc_context *)handle; + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + CVI_S32 status = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = &pChnHandle->encCtx; + VENC_ATTR_S *pVencAttr = &pChnAttr->stVencAttr; + cviInitEncConfig initEncCfg, *pInitEncCfg; + + pInitEncCfg = &initEncCfg; + memset(pInitEncCfg, 0, sizeof(cviInitEncConfig)); + + pInitEncCfg->codec = + (pVencAttr->enType == PT_H265) ? CODEC_H265 : CODEC_H264; + pInitEncCfg->width = pEncCtx->base.width; + pInitEncCfg->height = pEncCtx->base.height; + pInitEncCfg->u32Profile = pEncCtx->base.u32Profile; + pInitEncCfg->rcMode = pEncCtx->base.rcMode; + CVI_VENC_TRACE("codec = %d, width = %d, height = %d, rcMode = %d\n", + pInitEncCfg->codec, pInitEncCfg->width, + pInitEncCfg->height, pInitEncCfg->rcMode); + + pInitEncCfg->bitrate = 0; + if (pInitEncCfg->codec == CODEC_H264) { + pInitEncCfg->userDataMaxLength = + pHandle->ModParam.stH264eModParam.u32UserDataMaxLen; + pInitEncCfg->singleLumaBuf = + pVencAttr->stAttrH264e.bSingleLumaBuf; + pInitEncCfg->bSingleEsBuf = pVencAttr->bIsoSendFrmEn ? 0 : + pHandle->ModParam.stH264eModParam.bSingleEsBuf; + } else if (pInitEncCfg->codec == CODEC_H265) { + pInitEncCfg->userDataMaxLength = + pHandle->ModParam.stH265eModParam.u32UserDataMaxLen; + pInitEncCfg->bSingleEsBuf = pVencAttr->bIsoSendFrmEn ? 0 : + pHandle->ModParam.stH265eModParam.bSingleEsBuf; + if (pHandle->ModParam.stH265eModParam.enRefreshType == + H265E_REFRESH_IDR) + pInitEncCfg->decodingRefreshType = H265_RT_IDR; + else + pInitEncCfg->decodingRefreshType = H265_RT_CRA; + } + + if (pInitEncCfg->bSingleEsBuf) { + if (pInitEncCfg->codec == CODEC_H264) + pInitEncCfg->bitstreamBufferSize = + pHandle->ModParam.stH264eModParam + .u32SingleEsBufSize; + else if (pInitEncCfg->codec == CODEC_H265) + pInitEncCfg->bitstreamBufferSize = + pHandle->ModParam.stH265eModParam + .u32SingleEsBufSize; + } else { + pInitEncCfg->bitstreamBufferSize = pVencAttr->u32BufSize; + } + pInitEncCfg->s32ChnNum = pChnHandle->VeChn; + pInitEncCfg->bEsBufQueueEn = pVencAttr->bEsBufQueueEn; + pInitEncCfg->bIsoSendFrmEn = pVencAttr->bIsoSendFrmEn; + pInitEncCfg->svc_enable = pChnHandle->bSvcEnable; + pInitEncCfg->fg_protect_en = pChnHandle->svcParam.fg_protect_en; + pInitEncCfg->fg_dealt_qp = pChnHandle->svcParam.fg_dealt_qp; + pInitEncCfg->complex_scene_detect_en = pChnHandle->svcParam + .complex_scene_detect_en; + pInitEncCfg->complex_scene_low_th = pChnHandle->svcParam + .complex_scene_low_th; + pInitEncCfg->complex_scene_hight_th = pChnHandle->svcParam + .complex_scene_hight_th; + + pInitEncCfg->middle_min_percent = pChnHandle->svcParam + .middle_min_percent; + pInitEncCfg->complex_min_percent = pChnHandle->svcParam + .complex_min_percent; + + pInitEncCfg->smart_ai_en = pChnHandle->svcParam.smart_ai_en; + + CVI_VENC_TRACE("width = %d, height = %d, rcMode = %d\n", + pInitEncCfg->width, pInitEncCfg->height, + pInitEncCfg->rcMode); + CVI_VENC_TRACE("es buf size = 0x%X, singleLumaBuf = %d\n", + pInitEncCfg->bitstreamBufferSize, + pInitEncCfg->singleLumaBuf); + + if (pEncCtx->ext.vid.setInitCfgRc) + pEncCtx->ext.vid.setInitCfgRc(pInitEncCfg, pChnHandle); + + pEncCtx->ext.vid.pHandle = cviVEncOpen(pInitEncCfg); + if (!pEncCtx->ext.vid.pHandle) { + CVI_VENC_ERR("cviVEncOpen\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + return status; +} + +static CVI_VOID cviSetInitCfgGop(cviInitEncConfig *pInitEncCfg, + venc_chn_context *pChnHandle) +{ + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_GOP_ATTR_S *pga = &pChnAttr->stGopAttr; + + pInitEncCfg->virtualIPeriod = 0; + + if (pga->enGopMode == VENC_GOPMODE_NORMALP) { + pInitEncCfg->s32IPQpDelta = pga->stNormalP.s32IPQpDelta; + CVI_VENC_CFG("s32IPQpDelta = %d\n", pInitEncCfg->s32IPQpDelta); + + } else if (pga->enGopMode == VENC_GOPMODE_SMARTP) { + pInitEncCfg->virtualIPeriod = pInitEncCfg->gop; + pInitEncCfg->gop = pga->stSmartP.u32BgInterval; + pInitEncCfg->s32BgQpDelta = pga->stSmartP.s32BgQpDelta; + pInitEncCfg->s32ViQpDelta = pga->stSmartP.s32ViQpDelta; + CVI_VENC_CFG( + "virtualIPeriod = %d, gop = %d, bgQpDelta = %d, ViQpDelta = %d\n", + pInitEncCfg->virtualIPeriod, pInitEncCfg->gop, + pInitEncCfg->s32BgQpDelta, pInitEncCfg->s32ViQpDelta); + } +} + +static CVI_VOID h264e_setInitCfgFixQp(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H264_FIXQP_S *pstH264FixQp = &prcatt->stH264FixQp; + + pInitEncCfg->iqp = pstH264FixQp->u32IQp; + pInitEncCfg->pqp = pstH264FixQp->u32PQp; + pInitEncCfg->gop = pstH264FixQp->u32Gop; + pInitEncCfg->framerate = (int)pstH264FixQp->fr32DstFrameRate; + + CVI_VENC_CFG("iqp = %d, pqp = %d, gop = %d, framerate = %d\n", + pInitEncCfg->iqp, pInitEncCfg->pqp, pInitEncCfg->gop, + pInitEncCfg->framerate); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_VOID h264e_setInitCfgCbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H264_CBR_S *pstH264Cbr = &prcatt->stH264Cbr; + + pInitEncCfg->statTime = pstH264Cbr->u32StatTime; + pInitEncCfg->gop = pstH264Cbr->u32Gop; + pInitEncCfg->bitrate = pstH264Cbr->u32BitRate; + pInitEncCfg->framerate = (int)pstH264Cbr->fr32DstFrameRate; + + CVI_VENC_CFG("statTime = %d, gop = %d, bitrate = %d, fps = %d\n", + pInitEncCfg->statTime, pInitEncCfg->gop, + pInitEncCfg->bitrate, pInitEncCfg->framerate); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_VOID h264e_setInitCfgVbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H264_VBR_S *pstH264Vbr = &prcatt->stH264Vbr; + VENC_RC_PARAM_S *prcparam = &pChnHandle->rcParam; + + pInitEncCfg->statTime = pstH264Vbr->u32StatTime; + pInitEncCfg->gop = pstH264Vbr->u32Gop; + pInitEncCfg->maxbitrate = pstH264Vbr->u32MaxBitRate; + pInitEncCfg->framerate = (int)pstH264Vbr->fr32DstFrameRate; + pInitEncCfg->s32ChangePos = prcparam->stParamH264Vbr.s32ChangePos; + + CVI_VENC_CFG( + "statTime = %d, gop = %d, maxbitrate = %d, fps = %d, s32ChangePos = %d\n", + pInitEncCfg->statTime, pInitEncCfg->gop, + pInitEncCfg->maxbitrate, pInitEncCfg->framerate, + pInitEncCfg->s32ChangePos); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_VOID h264e_setInitCfgAVbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H264_AVBR_S *pstH264AVbr = &prcatt->stH264AVbr; + VENC_PARAM_H264_AVBR_S *pprc = &pChnHandle->rcParam.stParamH264AVbr; + + pInitEncCfg->statTime = pstH264AVbr->u32StatTime; + pInitEncCfg->gop = pstH264AVbr->u32Gop; + pInitEncCfg->framerate = (int)pstH264AVbr->fr32DstFrameRate; + pInitEncCfg->maxbitrate = pstH264AVbr->u32MaxBitRate; + pInitEncCfg->s32ChangePos = pprc->s32ChangePos; + pInitEncCfg->s32MinStillPercent = pprc->s32MinStillPercent; + pInitEncCfg->u32MaxStillQP = pprc->u32MaxStillQP; + pInitEncCfg->u32MotionSensitivity = pprc->u32MotionSensitivity; + pInitEncCfg->s32AvbrFrmLostOpen = pprc->s32AvbrFrmLostOpen; + pInitEncCfg->s32AvbrFrmGap = pprc->s32AvbrFrmGap; + pInitEncCfg->s32AvbrPureStillThr = pprc->s32AvbrPureStillThr; + CVI_VENC_CFG( + "statTime = %d, gop = %d, maxbitrate = %d, fps = %d, s32ChangePos = %d\n", + pInitEncCfg->statTime, pInitEncCfg->gop, + pInitEncCfg->maxbitrate, pInitEncCfg->framerate, + pInitEncCfg->s32ChangePos); + CVI_VENC_CFG( + "StillPercent = %d, StillQP = %d, MotionSensitivity = %d\n", + pInitEncCfg->s32MinStillPercent, pInitEncCfg->u32MaxStillQP, + pInitEncCfg->u32MotionSensitivity); + CVI_VENC_CFG("FrmLostOpen = %d, FrmGap = %d, PureStillThr = %d\n", + pInitEncCfg->s32AvbrFrmLostOpen, + pInitEncCfg->s32AvbrFrmGap, + pInitEncCfg->s32AvbrPureStillThr); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_VOID h264e_setInitCfgUbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H264_UBR_S *pstH264Ubr = &prcatt->stH264Ubr; + + pInitEncCfg->statTime = pstH264Ubr->u32StatTime; + pInitEncCfg->gop = pstH264Ubr->u32Gop; + pInitEncCfg->bitrate = pstH264Ubr->u32BitRate; + pInitEncCfg->framerate = (int)pstH264Ubr->fr32DstFrameRate; + + CVI_VENC_CFG("statTime = %d, gop = %d, bitrate = %d, fps = %d\n", + pInitEncCfg->statTime, pInitEncCfg->gop, + pInitEncCfg->bitrate, pInitEncCfg->framerate); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_S32 h264e_mapNaluType(VENC_PACK_S *ppack, CVI_S32 cviNalType) +{ + int h264naluType[] = { + -1, + H264E_NALU_ISLICE, + H264E_NALU_PSLICE, + H264E_NALU_BSLICE, + H264E_NALU_IDRSLICE, + H264E_NALU_SPS, + H264E_NALU_PPS, + H264E_NALU_SEI, + }; + int naluType; + + if (!ppack) { + CVI_VENC_ERR("ppack is NULL\n"); + return -1; + } + + if (!ppack->pu8Addr) { + CVI_VENC_ERR("ppack->pu8Addr is NULL\n"); + return -1; + } + + naluType = ppack->pu8Addr[4] & 0x1f; + + if (cviNalType <= NAL_NONE || cviNalType >= NAL_VPS) { + CVI_VENC_ERR("cviNalType = %d\n", cviNalType); + return -1; + } + + if (naluType == H264_NALU_TYPE_IDR) + ppack->DataType.enH264EType = H264E_NALU_IDRSLICE; + else + ppack->DataType.enH264EType = h264naluType[cviNalType]; + + CVI_VENC_BS("enH264EType = %d\n", ppack->DataType.enH264EType); + + return 0; +} + +static CVI_VOID h265e_setInitCfgFixQp(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H265_FIXQP_S *pstH265FixQp = &prcatt->stH265FixQp; + + pInitEncCfg->iqp = pstH265FixQp->u32IQp; + pInitEncCfg->pqp = pstH265FixQp->u32PQp; + pInitEncCfg->gop = pstH265FixQp->u32Gop; + pInitEncCfg->framerate = (int)pstH265FixQp->fr32DstFrameRate; + + CVI_VENC_CFG("iqp = %d, pqp = %d, gop = %d, framerate = %d\n", + pInitEncCfg->iqp, pInitEncCfg->pqp, pInitEncCfg->gop, + pInitEncCfg->framerate); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_VOID h265e_setInitCfgCbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H265_CBR_S *pstH265Cbr = &prcatt->stH265Cbr; + + pInitEncCfg->statTime = pstH265Cbr->u32StatTime; + pInitEncCfg->gop = pstH265Cbr->u32Gop; + pInitEncCfg->bitrate = pstH265Cbr->u32BitRate; + pInitEncCfg->framerate = (int)pstH265Cbr->fr32DstFrameRate; + + CVI_VENC_CFG("statTime = %d, gop = %d, bitrate = %d, fps = %d\n", + pInitEncCfg->statTime, pInitEncCfg->gop, + pInitEncCfg->bitrate, pInitEncCfg->framerate); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_VOID h265e_setInitCfgVbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H265_VBR_S *pstH265Vbr = &prcatt->stH265Vbr; + VENC_RC_PARAM_S *prcparam = &pChnHandle->rcParam; + + pInitEncCfg->statTime = pstH265Vbr->u32StatTime; + pInitEncCfg->gop = pstH265Vbr->u32Gop; + pInitEncCfg->maxbitrate = pstH265Vbr->u32MaxBitRate; + pInitEncCfg->s32ChangePos = prcparam->stParamH265Vbr.s32ChangePos; + pInitEncCfg->framerate = (int)pstH265Vbr->fr32DstFrameRate; + + CVI_VENC_CFG( + "statTime = %d, gop = %d, maxbitrate = %d, fps = %d, s32ChangePos = %d\n", + pInitEncCfg->statTime, pInitEncCfg->gop, + pInitEncCfg->maxbitrate, pInitEncCfg->framerate, + pInitEncCfg->s32ChangePos); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_VOID h265e_setInitCfgAVbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H265_AVBR_S *pstH265AVbr = &prcatt->stH265AVbr; + VENC_PARAM_H265_AVBR_S *pprc = &pChnHandle->rcParam.stParamH265AVbr; + + pInitEncCfg->statTime = pstH265AVbr->u32StatTime; + pInitEncCfg->gop = pstH265AVbr->u32Gop; + pInitEncCfg->framerate = (int)pstH265AVbr->fr32DstFrameRate; + pInitEncCfg->maxbitrate = pstH265AVbr->u32MaxBitRate; + pInitEncCfg->s32ChangePos = pprc->s32ChangePos; + pInitEncCfg->s32MinStillPercent = pprc->s32MinStillPercent; + pInitEncCfg->u32MaxStillQP = pprc->u32MaxStillQP; + pInitEncCfg->u32MotionSensitivity = pprc->u32MotionSensitivity; + pInitEncCfg->s32AvbrFrmLostOpen = pprc->s32AvbrFrmLostOpen; + pInitEncCfg->s32AvbrFrmGap = pprc->s32AvbrFrmGap; + pInitEncCfg->s32AvbrPureStillThr = pprc->s32AvbrPureStillThr; + + CVI_VENC_CFG( + "statTime = %d, gop = %d, maxbitrate = %d, fps = %d, s32ChangePos = %d\n", + pInitEncCfg->statTime, pInitEncCfg->gop, + pInitEncCfg->maxbitrate, pInitEncCfg->framerate, + pInitEncCfg->s32ChangePos); + CVI_VENC_CFG( + "StillPercent = %d, StillQP = %d, MotionSensitivity = %d\n", + pInitEncCfg->s32MinStillPercent, pInitEncCfg->u32MaxStillQP, + pInitEncCfg->u32MotionSensitivity); + CVI_VENC_CFG("FrmLostOpen = %d, FrmGap = %d, PureStillThr = %d\n", + pInitEncCfg->s32AvbrFrmLostOpen, + pInitEncCfg->s32AvbrFrmGap, + pInitEncCfg->s32AvbrPureStillThr); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_VOID h265e_setInitCfgQpMap(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H265_QPMAP_S *pstH265QpMap = &prcatt->stH265QpMap; + + pInitEncCfg->statTime = pstH265QpMap->u32StatTime; + pInitEncCfg->gop = pstH265QpMap->u32Gop; + pInitEncCfg->bitrate = + DEAULT_QP_MAP_BITRATE; // QpMap uses CBR as basic settings + pInitEncCfg->framerate = (int)pstH265QpMap->fr32DstFrameRate; + + CVI_VENC_CFG("statTime = %d, gop = %d, bitrate = %d, fps = %d\n", + pInitEncCfg->statTime, pInitEncCfg->gop, + pInitEncCfg->bitrate, pInitEncCfg->framerate); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_VOID h265e_setInitCfgUbr(cviInitEncConfig *pInitEncCfg, + CVI_VOID *pchnctx) +{ + venc_chn_context *pChnHandle = (venc_chn_context *)pchnctx; + VENC_CHN_ATTR_S *pChnAttr = pChnHandle->pChnAttr; + VENC_RC_ATTR_S *prcatt = &pChnAttr->stRcAttr; + VENC_H265_UBR_S *pstH265Ubr = &prcatt->stH265Ubr; + + pInitEncCfg->statTime = pstH265Ubr->u32StatTime; + pInitEncCfg->gop = pstH265Ubr->u32Gop; + pInitEncCfg->bitrate = pstH265Ubr->u32BitRate; + pInitEncCfg->framerate = (int)pstH265Ubr->fr32DstFrameRate; + + CVI_VENC_CFG("statTime = %d, gop = %d, bitrate = %d, fps = %d\n", + pInitEncCfg->statTime, pInitEncCfg->gop, + pInitEncCfg->bitrate, pInitEncCfg->framerate); + + cviSetInitCfgGop(pInitEncCfg, pChnHandle); +} + +static CVI_S32 h265e_mapNaluType(VENC_PACK_S *ppack, CVI_S32 cviNalType) +{ + int h265naluType[] = { + -1, + H265E_NALU_ISLICE, + H265E_NALU_PSLICE, + H265E_NALU_BSLICE, + H265E_NALU_IDRSLICE, + H265E_NALU_SPS, + H265E_NALU_PPS, + H265E_NALU_SEI, + H265E_NALU_VPS, + }; + int naluType; + + if (!ppack) { + CVI_VENC_ERR("ppack is NULL\n"); + return -1; + } + + if (!ppack->pu8Addr) { + CVI_VENC_ERR("ppack->pu8Addr is NULL\n"); + return -1; + } + + naluType = (ppack->pu8Addr[4] & 0x7f) >> 1; + + if (cviNalType <= NAL_NONE || cviNalType >= NAL_MAX) { + CVI_VENC_ERR("cviNalType = %d\n", cviNalType); + return -1; + } + + if (naluType == H265_NALU_TYPE_W_RADL || + naluType == H265_NALU_TYPE_N_LP) + ppack->DataType.enH265EType = H265E_NALU_IDRSLICE; + else + ppack->DataType.enH265EType = h265naluType[cviNalType]; + + CVI_VENC_BS("enH265EType = %d\n", ppack->DataType.enH265EType); + + return 0; +} + +static CVI_S32 vidEnc_close(CVI_VOID *ctx) +{ + CVI_S32 status = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + + if (pEncCtx->ext.vid.pHandle) { + status = cviVEncClose(pEncCtx->ext.vid.pHandle); + if (status < 0) { + CVI_VENC_ERR("cviVEncClose, status = %d\n", status); + return status; + } + } + + return status; +} + +static CVI_S32 vidEnc_enc_one_pic(CVI_VOID *ctx, + const VIDEO_FRAME_INFO_S *pstFrame, + CVI_S32 s32MilliSec) +{ + CVI_S32 status = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + cviEncOnePicCfg encOnePicCfg; + cviEncOnePicCfg *pPicCfg = &encOnePicCfg; + CVIFRAMEBUF srcInfo, *psi = &srcInfo; + struct vb_s *blk = (struct vb_s *)pstFrame->stVFrame.pPrivateData; + CVI_U8 *mtable = kzalloc(MO_TBL_SIZE, GFP_ATOMIC); + + if (!mtable) { + CVI_VENC_SRC("fail to kzalloc(%d)\n", MO_TBL_SIZE); + return CVI_FAILURE; + } + + memset(pPicCfg, 0, sizeof(cviEncOnePicCfg)); + setSrcInfo(psi, pEncCtx, pstFrame); + + pPicCfg->addrY = psi->vbY.virt_addr; + pPicCfg->addrCb = psi->vbCb.virt_addr; + pPicCfg->addrCr = psi->vbCr.virt_addr; + + pPicCfg->phyAddrY = psi->vbY.phys_addr; + pPicCfg->phyAddrCb = psi->vbCb.phys_addr; + pPicCfg->phyAddrCr = psi->vbCr.phys_addr; + pPicCfg->u64Pts = pstFrame->stVFrame.u64PTS; + + pPicCfg->stride = psi->strideY; + switch (pstFrame->stVFrame.enPixelFormat) { + case PIXEL_FORMAT_NV12: + pPicCfg->cbcrInterleave = 1; + pPicCfg->nv21 = 0; + break; + case PIXEL_FORMAT_NV21: + pPicCfg->cbcrInterleave = 1; + pPicCfg->nv21 = 1; + break; + case PIXEL_FORMAT_YUV_PLANAR_420: + default: + pPicCfg->cbcrInterleave = 0; + pPicCfg->nv21 = 0; + break; + } + + if (pEncCtx->base.rcMode <= RC_MODE_AVBR) { + if (blk) { + pPicCfg->picMotionLevel = blk->buf.motion_lv; + pPicCfg->picDciLv = 0; + pPicCfg->picMotionMap = mtable; + pPicCfg->picMotionMapSize = MO_TBL_SIZE; + memcpy(mtable, blk->buf.motion_table, MO_TBL_SIZE); + } + pPicCfg->picMotionMap = mtable; + cviCopyMotionMap(pEncCtx->ext.vid.pHandle, pPicCfg, pEncCtx->ext.vid.pHandle); + } + + CVI_VENC_SRC("pa Y = 0x%llX, pa Cb = 0x%llX, pa Cr = 0x%llX\n", + pPicCfg->phyAddrY, pPicCfg->phyAddrCb, pPicCfg->phyAddrCr); + CVI_VENC_SRC("MLevel = %d, MSize = %d\n", pPicCfg->picMotionLevel, + pPicCfg->picMotionMapSize); + + status = cviVEncEncOnePic(pEncCtx->ext.vid.pHandle, pPicCfg, + s32MilliSec); + kfree(mtable); + + if (status == ENC_TIMEOUT) + return CVI_ERR_VENC_BUSY; + + return status; +} + +// should mutex psp->packMutex in caller +static CVI_S32 drop_all_packs(stStreamPack *psp) +{ + CVI_U32 idx = 0; + stPack *pPack; + + if (psp->totalPacks) { + for (idx = 0; idx < psp->totalPacks && (idx < MAX_NUM_PACKS); idx++) { + pPack = &psp->pack[idx]; + + if (pPack->addr && pPack->need_free) { + if (pPack->cviNalType >= NAL_I && pPack->cviNalType <= NAL_IDR) { + osal_ion_free(pPack->addr); + } else { + osal_kfree(pPack->addr); + } + pPack->addr = NULL; + } + pPack->len = 0; + pPack->bUsed = CVI_FALSE; + } + psp->totalPacks = 0; + psp->dropCnt++; + psp->seq++; + } + + return 0; +} + + +static CVI_S32 vidEnc_get_stream(CVI_VOID *ctx, VENC_STREAM_S *pstStream, + CVI_S32 s32MilliSec) +{ + CVI_S32 status = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + cviVEncStreamInfo *pStreamInfo = &pEncCtx->ext.vid.streamInfo; + stStreamPack *psp; + VENC_PACK_S *ppack; + CVI_U32 idx = 0; + status = cviVEncGetStream(pEncCtx->ext.vid.pHandle, pStreamInfo, + s32MilliSec); + CVI_VENC_INFO("cviVEncGetStream status %d\n", status); + if (status == ENC_TIMEOUT) { + return CVI_ERR_VENC_BUSY; + } else if (status) { + CVI_VENC_ERR("get stream failed,status %d\n", status); + return CVI_ERR_VENC_INVALILD_RET; + } + + psp = pStreamInfo->psp; + if (!psp) { + CVI_VENC_ERR("psp is null\n"); + return CVI_ERR_VENC_NULL_PTR; + } + + MUTEX_LOCK(&psp->packMutex); + pstStream->u32PackCount = 0; + for (idx = 0; (idx < psp->totalPacks) && (idx < MAX_NUM_PACKS); idx++) { + ppack = &pstStream->pstPack[idx]; + + if (!ppack) { + CVI_VENC_ERR("get NULL pack, uPackCount:%d idx:%d\n", pstStream->u32PackCount, idx); + break; + } + memset(ppack, 0, sizeof(VENC_PACK_S)); + + if (!psp->pack[idx].addr || !psp->pack[idx].len || !psp->pack[idx].u64PhyAddr) { + CVI_VENC_ERR("packs error, idx:%d addr:%p, len:%d phy:%llx\n", + idx, psp->pack[idx].addr, psp->pack[idx].len, psp->pack[idx].u64PhyAddr); + drop_all_packs(psp); + MUTEX_UNLOCK(&psp->packMutex); + return CVI_ERR_VENC_ILLEGAL_PARAM; + } + + psp->pack[idx].bUsed = CVI_TRUE; + ppack->u64PhyAddr = psp->pack[idx].u64PhyAddr; + ppack->pu8Addr = psp->pack[idx].addr; + ppack->u32Len = psp->pack[idx].len; + ppack->u64PTS = psp->pack[idx].u64PTS; + status = pEncCtx->ext.vid.mapNaluType( + ppack, psp->pack[idx].cviNalType); + if (status) { + CVI_VENC_ERR("mapNaluType, status = %d, idx:%d\n", status, idx); + drop_all_packs(psp); + MUTEX_UNLOCK(&psp->packMutex); + return status; + } + + pstStream->u32PackCount++; + + // division [P] + [P] + // division [P] + [VPS SPS PPS I] + // division [SEI P] + [VPS SPS PPS SEI I] + if (psp->pack[idx].cviNalType == NAL_P + || psp->pack[idx].cviNalType == NAL_I + || psp->pack[idx].cviNalType == NAL_IDR) { + break; + } + } + pstStream->u32Seq = psp->seq; + psp->seq++; + MUTEX_UNLOCK(&psp->packMutex); + pEncCtx->base.u64EncHwTime = (CVI_U64)pStreamInfo->encHwTime; + + return status; +} + +static CVI_S32 vidEnc_release_stream(CVI_VOID *ctx, VENC_STREAM_S *pstStream) +{ + CVI_S32 status = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + cviVEncStreamInfo *pStreamInfo = &pEncCtx->ext.vid.streamInfo; + + UNREFERENCED_PARAM(pstStream); + + status = cviVEncReleaseStream(pEncCtx->ext.vid.pHandle, pStreamInfo); + if (status != CVI_SUCCESS) { + CVI_VENC_ERR("cviVEncReleaseStream, status = %d\n", status); + return status; + } + + return status; +} + +static CVI_S32 vidEnc_ioctl(CVI_VOID *ctx, CVI_S32 op, CVI_VOID *arg) +{ + CVI_S32 status = CVI_SUCCESS; + venc_enc_ctx *pEncCtx = (venc_enc_ctx *)ctx; + CVI_S32 currOp; + + currOp = (op & CVI_H26X_OP_MASK) >> CVI_H26X_OP_SHIFT; + if (currOp == 0) { + CVI_VENC_TRACE("op = 0x%X, currOp = 0x%X\n", op, currOp); + return 0; + } + + status = cviVEncIoctl(pEncCtx->ext.vid.pHandle, currOp, arg); + if (status != CVI_SUCCESS) { + CVI_VENC_ERR("cviVEncIoctl, currOp = 0x%X, status = %d\n", + currOp, status); + return status; + } + + return status; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/module/src/venc_debug.c b/osdrv/interdrv/v2/cvi_vc_drv/module/src/venc_debug.c new file mode 100644 index 0000000000..31a14b3a7a --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/module/src/venc_debug.c @@ -0,0 +1,1181 @@ +#ifdef CLI_DEBUG_SUPPORT +#include +#include +#include +#include "tcli.h" +#include "cvi_venc.h" +#include "cvi_sys.h" +#include "venc.h" + +#ifndef UNUSED +#define UNUSED(x) ((x) = (x)) +#endif + +extern venc_context *handle; +static int bVencCliReg; +static pthread_mutex_t vencCliMutex = PTHREAD_MUTEX_INITIALIZER; +#define MAX_RUN_CNT (3) + +typedef struct _VENC_S_CLI_DBG { + int dump_yuv_cnt; + int bDumpBsEnable; + CVI_S32 s32handlerState; + CVI_S32 s32handerExitRetcode; + CVI_U32 u32MaxBsSize; + CVI_U32 u32RunCnt[MAX_RUN_CNT]; + +} VENC_S_CLI_DBG; + +VENC_S_CLI_DBG __astVencCliDbgInfo[VENC_MAX_CHN_NUM]; + +static void getCodecTypeStr(PAYLOAD_TYPE_E enType, char *pcCodecType) +{ + switch (enType) { + case PT_JPEG: + strcpy(pcCodecType, "JPEG"); + break; + case PT_MJPEG: + strcpy(pcCodecType, "MJPEG"); + break; + case PT_H264: + strcpy(pcCodecType, "H264"); + break; + case PT_H265: + strcpy(pcCodecType, "H265"); + break; + default: + strcpy(pcCodecType, "N/A"); + break; + } +} + +static void getRcModeStr(VENC_RC_MODE_E enRcMode, char *pRcMode) +{ + switch (enRcMode) { + case VENC_RC_MODE_H264CBR: + case VENC_RC_MODE_H265CBR: + case VENC_RC_MODE_MJPEGCBR: + strcpy(pRcMode, "CBR"); + break; + case VENC_RC_MODE_H264VBR: + case VENC_RC_MODE_H265VBR: + case VENC_RC_MODE_MJPEGVBR: + strcpy(pRcMode, "VBR"); + break; + case VENC_RC_MODE_H264AVBR: + case VENC_RC_MODE_H265AVBR: + strcpy(pRcMode, "AVBR"); + break; + case VENC_RC_MODE_H264QVBR: + case VENC_RC_MODE_H265QVBR: + strcpy(pRcMode, "QVBR"); + break; + case VENC_RC_MODE_H264FIXQP: + case VENC_RC_MODE_H265FIXQP: + case VENC_RC_MODE_MJPEGFIXQP: + strcpy(pRcMode, "FIXQP"); + break; + case VENC_RC_MODE_H264QPMAP: + case VENC_RC_MODE_H265QPMAP: + strcpy(pRcMode, "QPMAP"); + break; + default: + strcpy(pRcMode, "N/A"); + break; + } +} + +static void getGopModeStr(VENC_GOP_MODE_E enGopMode, char *pcGopMode) +{ + switch (enGopMode) { + case VENC_GOPMODE_NORMALP: + strcpy(pcGopMode, "NORMALP"); + break; + case VENC_GOPMODE_DUALP: + strcpy(pcGopMode, "DUALP"); + break; + case VENC_GOPMODE_SMARTP: + strcpy(pcGopMode, "SMARTP"); + break; + case VENC_GOPMODE_ADVSMARTP: + strcpy(pcGopMode, "ADVSMARTP"); + break; + case VENC_GOPMODE_BIPREDB: + strcpy(pcGopMode, "BIPREDB"); + break; + case VENC_GOPMODE_LOWDELAYB: + strcpy(pcGopMode, "LOWDELAYB"); + break; + case VENC_GOPMODE_BUTT: + strcpy(pcGopMode, "BUTT"); + break; + default: + strcpy(pcGopMode, "N/A"); + break; + } +} + +static void getPixelFormatStr(PIXEL_FORMAT_E enPixelFormat, char *pcPixelFormat) +{ + switch (enPixelFormat) { + case PIXEL_FORMAT_YUV_PLANAR_422: + strcpy(pcPixelFormat, "YUV422"); + break; + case PIXEL_FORMAT_YUV_PLANAR_420: + strcpy(pcPixelFormat, "YUV420"); + break; + case PIXEL_FORMAT_YUV_PLANAR_444: + strcpy(pcPixelFormat, "YUV444"); + break; + case PIXEL_FORMAT_NV12: + strcpy(pcPixelFormat, "NV12"); + break; + case PIXEL_FORMAT_NV21: + strcpy(pcPixelFormat, "NV21"); + break; + default: + strcpy(pcPixelFormat, "N/A"); + break; + } +} + +static void getFrameRate(venc_proc_info_t *ptVencProcInfo, + CVI_U32 *pu32SrcFrameRate, CVI_FR32 *pfr32DstFrameRate) +{ + switch (ptVencProcInfo->chnAttr.stRcAttr.enRcMode) { + case VENC_RC_MODE_H264CBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264Cbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264Cbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_H265CBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265Cbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265Cbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_MJPEGCBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stMjpegCbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stMjpegCbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_H264VBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264Vbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264Vbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_H265VBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265Vbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265Vbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_MJPEGVBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stMjpegVbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stMjpegVbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_H264FIXQP: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264FixQp + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr + .stH264FixQp.fr32DstFrameRate; + break; + case VENC_RC_MODE_H265FIXQP: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265FixQp + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr + .stH265FixQp.fr32DstFrameRate; + break; + case VENC_RC_MODE_MJPEGFIXQP: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr + .stMjpegFixQp.u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr + .stMjpegFixQp.fr32DstFrameRate; + break; + case VENC_RC_MODE_H264AVBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264AVbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264AVbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_H265AVBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265AVbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265AVbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_H264QVBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264QVbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264QVbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_H265QVBR: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265QVbr + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265QVbr + .fr32DstFrameRate; + break; + case VENC_RC_MODE_H264QPMAP: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH264QpMap + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr + .stH264QpMap.fr32DstFrameRate; + break; + case VENC_RC_MODE_H265QPMAP: + *pu32SrcFrameRate = ptVencProcInfo->chnAttr.stRcAttr.stH265QpMap + .u32SrcFrameRate; + *pfr32DstFrameRate = ptVencProcInfo->chnAttr.stRcAttr + .stH265QpMap.fr32DstFrameRate; + break; + default: + break; + } +} + +extern void *venc_get_share_mem(void); + +static void cliVencInfoShow(int idx) +{ + venc_proc_info_t *pProcInfoShareMem = + (venc_proc_info_t *)venc_get_share_mem(); + if (!pProcInfoShareMem) { + tcli_print("no venc channel has been created.\n"); + return; + } + + int roiIdx = 0; + venc_proc_info_t *ptVencProcInfo = (pProcInfoShareMem + idx); + + if (ptVencProcInfo->u8ChnUsed == 1) { + char cCodecType[6] = { '\0' }; + char cRcMode[6] = { '\0' }; + char cGopMode[10] = { '\0' }; + char cPixelFormat[8] = { '\0' }; + CVI_U32 u32SrcFrameRate = 0; + CVI_FR32 fr32DstFrameRate = 0; + + getCodecTypeStr(ptVencProcInfo->chnAttr.stVencAttr.enType, + cCodecType); + getRcModeStr(ptVencProcInfo->chnAttr.stRcAttr.enRcMode, + cRcMode); + getGopModeStr(ptVencProcInfo->chnAttr.stGopAttr.enGopMode, + cGopMode); + getPixelFormatStr(ptVencProcInfo->stFrame.enPixelFormat, + cPixelFormat); + getFrameRate(ptVencProcInfo, &u32SrcFrameRate, + &fr32DstFrameRate); + + tcli_print( + "-----VENC CHN ATTR 1---------------------------------------------\n"); + tcli_print( + "ID: %d\t Width: %u\t Height: %u\t Type: %s\t RcMode: %s", + idx, ptVencProcInfo->chnAttr.stVencAttr.u32PicWidth, + ptVencProcInfo->chnAttr.stVencAttr.u32PicHeight, + cCodecType, cRcMode); + tcli_print( + "\t ByFrame: %s\t Sequence: %u\t LeftBytes: %u\t LeftFrm: %u", + ptVencProcInfo->chnAttr.stVencAttr.bByFrame ? "Y" : "N", + ptVencProcInfo->stStream.u32Seq, + ptVencProcInfo->chnStatus.u32LeftStreamBytes, + ptVencProcInfo->chnStatus.u32LeftStreamFrames); + tcli_print("\t CurPacks: %u\t GopMode: %s\t Prio: %d\n", + ptVencProcInfo->chnStatus.u32CurPacks, cGopMode, + ptVencProcInfo->stChnParam.u32Priority); + + tcli_print( + "-----VENC CHN ATTR 2-----------------------------------------------\n"); + tcli_print( + "VeStr: Y\t SrcFr: %u\t TarFr: %u\t Timeref: %u\t PixFmt: %s", + u32SrcFrameRate, fr32DstFrameRate, + ptVencProcInfo->stFrame.u32TimeRef, cPixelFormat); + tcli_print("\t PicAddr: 0x%llx\t WakeUpFrmCnt: %u\n", + ptVencProcInfo->stFrame.u64PhyAddr[0], + ptVencProcInfo->stChnParam.u32PollWakeUpFrmCnt); + + tcli_print( + "-----VENC CROP INFO------------------------------------------------\n"); + tcli_print( + "ID: %d\t CropEn: %s\t StartX: %d\t StartY: %d\t Width: %u\t Height: %u\n", + idx, + ptVencProcInfo->stChnParam.stCropCfg.bEnable ? "Y" : + "N", + ptVencProcInfo->stChnParam.stCropCfg.stRect.s32X, + ptVencProcInfo->stChnParam.stCropCfg.stRect.s32Y, + ptVencProcInfo->stChnParam.stCropCfg.stRect.u32Width, + ptVencProcInfo->stChnParam.stCropCfg.stRect.u32Height); + + tcli_print( + "-----ROI INFO-----------------------------------------------------\n"); + for (roiIdx = 0; roiIdx < 8; roiIdx++) { + if (ptVencProcInfo->stRoiAttr[roiIdx].bEnable) { + tcli_print( + "ID: %d\t Index: %u\t bRoiEn: %s\t bAbsQp: %s\t Qp: %d", + idx, + ptVencProcInfo->stRoiAttr[roiIdx] + .u32Index, + ptVencProcInfo->stRoiAttr[roiIdx] + .bEnable ? + "Y" : + "N", + ptVencProcInfo->stRoiAttr[roiIdx].bAbsQp ? + "Y" : + "N", + ptVencProcInfo->stRoiAttr[roiIdx].s32Qp); + tcli_print( + "\t Width: %u\t Height: %u\t StartX: %d\t StartY: %d\n", + ptVencProcInfo->stRoiAttr[roiIdx] + .stRect.u32Width, + ptVencProcInfo->stRoiAttr[roiIdx] + .stRect.u32Height, + ptVencProcInfo->stRoiAttr[roiIdx] + .stRect.s32X, + ptVencProcInfo->stRoiAttr[roiIdx] + .stRect.s32Y); + } + } + + tcli_print( + "-----VENC PTS STATE------------------------------------------------\n"); + tcli_print("ID: %d\t RcvFirstFrmPts: %llu\t RcvFrmPts: %llu\n", + idx, 0LL, ptVencProcInfo->stFrame.u64PTS); + + tcli_print( + "-----VENC CHN PERFORMANCE------------------------------------------------\n"); + tcli_print( + "ID: %d\t InFPS: %u\t OutFPS: %u\t HwEncTime: %llu us\n\n", + idx, ptVencProcInfo->stFPS.u32InFPS, + ptVencProcInfo->stFPS.u32OutFPS, + ptVencProcInfo->stFPS.u64EncHwTime); + } +} + +static int __cliVencInfoShow(int32_t argc, char *argv[]) +{ + int idx = 0; + + if (argc == 1) { + for (idx = 0; idx < VENC_MAX_CHN_NUM; idx++) + cliVencInfoShow(idx); + return 0; + } + + if (argc == 2) { + idx = atoi(argv[1]); + if (idx < 0 || idx >= VENC_MAX_CHN_NUM) { + tcli_print("usage:%s chn\n", argv[0]); + tcli_print("chn:[0 ~ %d]\n", VENC_MAX_CHN_NUM - 1); + return -1; + } + cliVencInfoShow(idx); + } + + return 0; +} + +void venc_set_handler_state(VENC_CHN VeChn, int state) +{ + __astVencCliDbgInfo[VeChn].s32handlerState = state; +} + +void venc_handler_exit_retcode(VENC_CHN VeChn, int retcode) +{ + __astVencCliDbgInfo[VeChn].s32handerExitRetcode = retcode; +} + +void venc_channel_run_status_addself(VENC_CHN VeChn, int index) +{ + if (index >= MAX_RUN_CNT) { + return; + } + __astVencCliDbgInfo[VeChn].u32RunCnt[index]++; +} + +static int cliShowVencDbgInfo(int32_t argc, char *argv[]) +{ + int chnIdx = 0; + + if (argc != 2) { + tcli_print("usage:%s chn\n", argv[0]); + return 0; + } + + chnIdx = atoi(argv[1]); + if (chnIdx > VENC_MAX_CHN_NUM) { + tcli_print("channle range [0:%d]\n", VENC_MAX_CHN_NUM); + return -1; + } + + tcli_print("chnIdx = %d\n", chnIdx); + tcli_print("dump_yuv_cnt = %d\n", + __astVencCliDbgInfo[chnIdx].dump_yuv_cnt); + tcli_print("s32handlerState = %d\n", + __astVencCliDbgInfo[chnIdx].s32handlerState); + tcli_print("s32handerExitRet = %d\n", + __astVencCliDbgInfo[chnIdx].s32handerExitRetcode); + for (int i = 0; i < MAX_RUN_CNT; i++) { + tcli_print("RunCnt[%d]: %d\n", i, + __astVencCliDbgInfo[chnIdx].u32RunCnt[i]); + } + + return 0; +} + +void cviCliDumpSrcYuv(int chn, const VIDEO_FRAME_INFO_S *pstFrame) +{ + FILE *fp = NULL; + const VIDEO_FRAME_S *pstVFrame; + CVI_VOID *vir_addr; + CVI_U32 u32LumaSize; + CVI_U32 u32ChrmSize; + CVI_U8 u8PlaneNum; + char filename[64] = { 0 }; + + if (__astVencCliDbgInfo[chn].dump_yuv_cnt <= 0) { + return; + } + + snprintf(filename, 64, "/tmp/venc_ch%d_src.yuv", chn); + + pstVFrame = &pstFrame->stVFrame; + u32LumaSize = pstVFrame->u32Stride[0] * pstVFrame->u32Height; + if ((pstVFrame->enPixelFormat == PIXEL_FORMAT_NV12) || + (pstVFrame->enPixelFormat == PIXEL_FORMAT_NV21)) { + u32ChrmSize = pstVFrame->u32Stride[1] * pstVFrame->u32Height; + u8PlaneNum = 2; + } else { //default yuv420 + u32ChrmSize = + pstVFrame->u32Stride[1] * pstVFrame->u32Height >> 1; + u8PlaneNum = 3; + } + + //warning: u_stride must be half of the y_stride,not align by the half of pic_width + + if (!u32LumaSize || !u32ChrmSize) { + CVI_VENC_ERR( + "dump chn:%d,[%u,%u] u32LumaSize:%d,u32ChrmSize:%d\n", + chn, pstVFrame->u32Width, pstVFrame->u32Height, + u32LumaSize, u32ChrmSize); + return; + } + + fp = fopen(filename, "ab+"); + if (fp == NULL) { + CVI_VENC_ERR("open %s failed\n", filename); + return; + } + + for (int i = 0; i < u8PlaneNum; i++) { + CVI_U32 u32len = i == 0 ? u32LumaSize : u32ChrmSize; + if (!pstVFrame->pu8VirAddr[i] && + pstVFrame->u64PhyAddr[i]) { //bind mode + vir_addr = + CVI_SYS_Mmap(pstVFrame->u64PhyAddr[i], u32len); + CVI_SYS_IonInvalidateCache(pstVFrame->u64PhyAddr[i], + vir_addr, u32len); + fwrite(vir_addr, u32len, 1, fp); + CVI_SYS_Munmap(vir_addr, u32len); + } else { + fwrite((void *)pstVFrame->pu8VirAddr[i], 1, u32len, fp); + } + } + + fflush(fp); + fclose(fp); + + __astVencCliDbgInfo[chn].dump_yuv_cnt--; +} + +CVI_S32 cviDumpVencBitstream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, + PAYLOAD_TYPE_E enType) +{ + char filename[64] = { 0 }; + VENC_PACK_S *ppack; + FILE *fp = NULL; + + if (!__astVencCliDbgInfo[VeChn].bDumpBsEnable) { + return -1; + } + + snprintf(filename, 64, "/tmp/chn%d.%s", VeChn, + enType == PT_H264 ? "264" : + (enType == PT_H265) ? "265" : + "mjpg"); + + fp = fopen(filename, "ab+"); + if (fp == NULL) { + CVI_VENC_ERR("open %s failed\n", filename); + return -1; + } + + for (CVI_U32 i = 0; i < pstStream->u32PackCount; i++) { + ppack = &pstStream->pstPack[i]; + fwrite(ppack->pu8Addr + ppack->u32Offset, + ppack->u32Len - ppack->u32Offset, 1, fp); + } + + fflush(fp); + fclose(fp); + + return 0; +} + +static int __cliDumpVencBs(int32_t argc, char *argv[]) +{ + int VencChn = 0; + + if (argc != 3) { + tcli_print("usage:dumpbitstream chn switch\n"); + tcli_print("chn:[0,%d]\n", VENC_MAX_CHN_NUM); + tcli_print("siwtch:[0,1]\n"); + return -1; + } + + VencChn = atoi(argv[1]); + if (VencChn < 0 || VencChn >= VENC_MAX_CHN_NUM) { + tcli_print("channel range[0,%d]\n", VENC_MAX_CHN_NUM); + return -1; + } + __astVencCliDbgInfo[VencChn].bDumpBsEnable = atoi(argv[2]) ? 1 : 0; + + tcli_print("dumpbitstream chn:%d switch:%d\n", VencChn, + __astVencCliDbgInfo[VencChn].bDumpBsEnable); + + return 0; +} + +static int __cliDumpVencSrcYUV(int32_t argc, char *argv[]) +{ + int VencChn = 0; + + if (argc != 3) { + tcli_print("usage:dumpyuv chn yuv_count\n"); + return -1; + } + + VencChn = atoi(argv[1]); + if (VencChn < 0 || VencChn >= VENC_MAX_CHN_NUM) { + tcli_print("channel range[0,%d]\n", VENC_MAX_CHN_NUM); + return -1; + } + __astVencCliDbgInfo[VencChn].dump_yuv_cnt = atoi(argv[2]); + + tcli_print("dumpyuv chn:%d cnt:%d\n", VencChn, + __astVencCliDbgInfo[VencChn].dump_yuv_cnt); + + return 0; +} + +void cviGetMaxBitstreamSize(VENC_CHN VeChn, VENC_STREAM_S *pstStream) +{ + if (!pstStream || VeChn < 0 || VeChn >= VENC_MAX_CHN_NUM) { + return; + } + + for (CVI_U32 i = 0; i < pstStream->u32PackCount; i++) { + VENC_PACK_S *ppack = &pstStream->pstPack[i]; + if (ppack && + (ppack->u32Len > __astVencCliDbgInfo[VeChn].u32MaxBsSize)) { + __astVencCliDbgInfo[VeChn].u32MaxBsSize = ppack->u32Len; + } + } +} + +static int __cliGetmaxBsSize(int argc, char *argv[]) +{ + int VencChn = 0; + + if (argc != 2) { + tcli_print("usage:getmaxBsSize chn\n"); + return -1; + } + + VencChn = atoi(argv[1]); + if (VencChn < 0 || VencChn >= VENC_MAX_CHN_NUM) { + tcli_print("channel range[0,%d]\n", VENC_MAX_CHN_NUM); + return -1; + } + + tcli_print("venc chn[%d]'s max bitstream size:%d\n", VencChn, + __astVencCliDbgInfo[VencChn].u32MaxBsSize); + + return 0; +} + +static void cviDumpChnPram(int chnIdx) +{ + venc_chn_context *pChnHandle = handle->chn_handle[chnIdx]; + + if (pChnHandle == NULL) + return; + + tcli_print( + "---------------------------------------------------------\n"); + tcli_print("VeChn:\t\t\t%d\n", pChnHandle->VeChn); + + tcli_print("enType:\t\t\t%d\n", + pChnHandle->pChnAttr->stVencAttr.enType); + tcli_print("u32Profile:\t\t%d\n", + pChnHandle->pChnAttr->stVencAttr.u32Profile); + tcli_print("u32BufSize:\t\t%d\n", + pChnHandle->pChnAttr->stVencAttr.u32BufSize); + tcli_print("u32PicWidth:\t\t%d\n", + pChnHandle->pChnAttr->stVencAttr.u32PicWidth); + tcli_print("u32PicHeight:\t\t%d\n", + pChnHandle->pChnAttr->stVencAttr.u32PicHeight); + + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) { + tcli_print("bSingleLumaBuf:\t\t%d\n", + pChnHandle->pChnAttr->stVencAttr.stAttrH264e + .bSingleLumaBuf); + tcli_print("\n"); + tcli_print("enH264eVBSource:\t%d\n", + handle->ModParam.stH264eModParam.enH264eVBSource); + tcli_print("bSingleEsBuf:\t\t%d\n", + handle->ModParam.stH264eModParam.bSingleEsBuf); + tcli_print("u32SingleEsBufSize:\t%d\n", + handle->ModParam.stH264eModParam.u32SingleEsBufSize); + } else if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265) { + tcli_print("\n"); + tcli_print("enH264eVBSource:\t%d\n", + handle->ModParam.stH265eModParam.enH265eVBSource); + tcli_print("bSingleEsBuf:\t\t%d\n", + handle->ModParam.stH265eModParam.bSingleEsBuf); + tcli_print("u32SingleEsBufSize:\t%d\n", + handle->ModParam.stH265eModParam.u32SingleEsBufSize); + tcli_print("enRefreshType:\t\t%d\n", + handle->ModParam.stH265eModParam.enRefreshType); + } else if (pChnHandle->pChnAttr->stVencAttr.enType == PT_JPEG) { + tcli_print("\n"); + tcli_print("bSingleEsBuf:\t\t%d\n", + handle->ModParam.stJpegeModParam.bSingleEsBuf); + tcli_print("u32SingleEsBufSize:\t%d\n", + handle->ModParam.stJpegeModParam.u32SingleEsBufSize); + tcli_print("enJpegeFormat:\t\t%d\n", + handle->ModParam.stJpegeModParam.enJpegeFormat); + } + + tcli_print("\n"); + tcli_print("enRcMode:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.enRcMode); + + if (pChnHandle->pChnAttr->stRcAttr.enRcMode == VENC_RC_MODE_H264CBR) { + tcli_print("u32Gop:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Cbr.u32Gop); + tcli_print( + "u32StatTime:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Cbr.u32StatTime); + tcli_print("u32BitRate:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Cbr.u32BitRate); + tcli_print("u32SrcFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Cbr + .u32SrcFrameRate); + tcli_print("fr32DstFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Cbr + .fr32DstFrameRate); + tcli_print("u32MaxIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264Cbr.u32MaxIQp); + tcli_print("u32MinIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264Cbr.u32MinIQp); + tcli_print("u32MaxQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264Cbr.u32MaxQp); + tcli_print("u32MinQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264Cbr.u32MinQp); + tcli_print("u32MaxIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH264Cbr.u32MaxIprop); + tcli_print("u32MinIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH264Cbr.u32MinIprop); + tcli_print( + "s32MaxReEncodeTimes:\t%d\n", + pChnHandle->rcParam.stParamH264Cbr.s32MaxReEncodeTimes); + } else if (pChnHandle->pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264VBR) { + tcli_print("u32Gop:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Vbr.u32Gop); + tcli_print( + "u32StatTime:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Vbr.u32StatTime); + tcli_print( + "u32MaxBitRate:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Vbr.u32MaxBitRate); + tcli_print("u32SrcFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Vbr + .u32SrcFrameRate); + tcli_print("fr32DstFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Vbr + .fr32DstFrameRate); + tcli_print("s32ChangePos:\t\t%d\n", + pChnHandle->rcParam.stParamH264Vbr.s32ChangePos); + tcli_print("u32MaxIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264Vbr.u32MaxIQp); + tcli_print("u32MinIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264Vbr.u32MinIQp); + tcli_print("u32MaxQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264Vbr.u32MaxQp); + tcli_print("u32MinQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264Vbr.u32MinQp); + tcli_print("u32MaxIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH264Vbr.u32MaxIprop); + tcli_print("u32MinIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH264Vbr.u32MinIprop); + tcli_print( + "s32MaxReEncodeTimes:\t%d\n", + pChnHandle->rcParam.stParamH264Vbr.s32MaxReEncodeTimes); + } else if (pChnHandle->pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264AVBR) { + tcli_print("u32Gop:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264AVbr.u32Gop); + tcli_print( + "u32StatTime:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264Vbr.u32StatTime); + tcli_print( + "u32MaxBitRate:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264AVbr.u32MaxBitRate); + tcli_print("u32SrcFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264AVbr + .u32SrcFrameRate); + tcli_print("fr32DstFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264AVbr + .fr32DstFrameRate); + tcli_print("s32ChangePos:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.s32ChangePos); + tcli_print( + "s32MinStillPercent:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.s32MinStillPercent); + tcli_print("u32MaxStillQP:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.u32MaxStillQP); + tcli_print("u32MaxIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.u32MaxIQp); + tcli_print("u32MinIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.u32MinIQp); + tcli_print("u32MaxQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.u32MaxQp); + tcli_print("u32MinQp:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.u32MinQp); + tcli_print("u32MaxIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.u32MaxIprop); + tcli_print("u32MinIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.u32MinIprop); + tcli_print( + "s32MaxReEncodeTimes:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.s32MaxReEncodeTimes); + tcli_print("u32MinQpDelta:\t\t%d\n", + pChnHandle->rcParam.stParamH264AVbr.u32MinQpDelta); + tcli_print("u32MotionSensitivity:\t%d\n", + pChnHandle->rcParam.stParamH264AVbr + .u32MotionSensitivity); + } else if (pChnHandle->pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H264FIXQP) { + tcli_print("u32Gop:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264FixQp.u32Gop); + tcli_print("u32SrcFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264FixQp + .u32SrcFrameRate); + tcli_print("fr32DstFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264FixQp + .fr32DstFrameRate); + tcli_print("u32IQp:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264FixQp.u32IQp); + tcli_print("u32PQp:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264FixQp.u32PQp); + tcli_print("u32BQp:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH264FixQp.u32BQp); + } else if (pChnHandle->pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265CBR) { + tcli_print("u32Gop:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Cbr.u32Gop); + tcli_print( + "u32StatTime:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Cbr.u32StatTime); + tcli_print("u32BitRate:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Cbr.u32BitRate); + tcli_print("u32SrcFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Cbr + .u32SrcFrameRate); + tcli_print("fr32DstFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Cbr + .fr32DstFrameRate); + tcli_print("u32MaxIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265Cbr.u32MaxIQp); + tcli_print("u32MinIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265Cbr.u32MinIQp); + tcli_print("u32MaxQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265Cbr.u32MaxQp); + tcli_print("u32MinQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265Cbr.u32MinQp); + tcli_print("u32MaxIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH265Cbr.u32MaxIprop); + tcli_print("u32MinIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH265Cbr.u32MinIprop); + tcli_print( + "s32MaxReEncodeTimes:\t%d\n", + pChnHandle->rcParam.stParamH265Cbr.s32MaxReEncodeTimes); + } else if (pChnHandle->pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265VBR) { + tcli_print("u32Gop:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Vbr.u32Gop); + tcli_print( + "u32StatTime:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Vbr.u32StatTime); + tcli_print( + "u32MaxBitRate:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Vbr.u32MaxBitRate); + tcli_print("u32SrcFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Vbr + .u32SrcFrameRate); + tcli_print("fr32DstFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265Vbr + .fr32DstFrameRate); + tcli_print("s32ChangePos:\t\t%d\n", + pChnHandle->rcParam.stParamH265Vbr.s32ChangePos); + tcli_print("u32MaxIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265Vbr.u32MaxIQp); + tcli_print("u32MinIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265Vbr.u32MinIQp); + tcli_print("u32MaxQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265Vbr.u32MaxQp); + tcli_print("u32MinQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265Vbr.u32MinQp); + tcli_print("u32MaxIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH265Vbr.u32MaxIprop); + tcli_print("u32MinIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH265Vbr.u32MinIprop); + tcli_print( + "s32MaxReEncodeTimes:\t%d\n", + pChnHandle->rcParam.stParamH265Vbr.s32MaxReEncodeTimes); + } else if (pChnHandle->pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265AVBR) { + tcli_print("u32Gop:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265AVbr.u32Gop); + tcli_print( + "u32StatTime:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265AVbr.u32StatTime); + tcli_print( + "u32MaxBitRate:\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265AVbr.u32MaxBitRate); + tcli_print("u32SrcFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265AVbr + .u32SrcFrameRate); + tcli_print("fr32DstFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265AVbr + .fr32DstFrameRate); + tcli_print("s32ChangePos:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.s32ChangePos); + tcli_print( + "s32MinStillPercent:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.s32MinStillPercent); + tcli_print("u32MaxStillQP:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.u32MaxStillQP); + tcli_print("u32MaxIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.u32MaxIQp); + tcli_print("u32MinIQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.u32MinIQp); + tcli_print("u32MaxQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.u32MaxQp); + tcli_print("u32MinQp:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.u32MinQp); + tcli_print("u32MaxIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.u32MaxIprop); + tcli_print("u32MinIprop:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.u32MinIprop); + tcli_print( + "s32MaxReEncodeTimes:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.s32MaxReEncodeTimes); + tcli_print("u32MinQpDelta:\t\t%d\n", + pChnHandle->rcParam.stParamH265AVbr.u32MinQpDelta); + tcli_print("u32MotionSensitivity:\t%d\n", + pChnHandle->rcParam.stParamH265AVbr + .u32MotionSensitivity); + } else if (pChnHandle->pChnAttr->stRcAttr.enRcMode == + VENC_RC_MODE_H265FIXQP) { + tcli_print("u32Gop:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265FixQp.u32Gop); + tcli_print("u32SrcFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265FixQp + .u32SrcFrameRate); + tcli_print("fr32DstFrameRate:\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265FixQp + .fr32DstFrameRate); + tcli_print("u32IQp:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265FixQp.u32IQp); + tcli_print("u32PQp:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265FixQp.u32PQp); + tcli_print("u32BQp:\t\t\t%d\n", + pChnHandle->pChnAttr->stRcAttr.stH265FixQp.u32BQp); + } + + tcli_print("s32FirstFrameStartQp:\t%d\n", + pChnHandle->rcParam.s32FirstFrameStartQp); + tcli_print("s32InitialDelay:\t%d\n", + pChnHandle->rcParam.s32InitialDelay); + tcli_print("u32RowQpDelta:\t\t%d\n", pChnHandle->rcParam.u32RowQpDelta); + + tcli_print("\n"); + tcli_print("enGopMode:\t\t%d\n", + pChnHandle->pChnAttr->stGopAttr.enGopMode); + + if (pChnHandle->pChnAttr->stGopAttr.enGopMode == VENC_GOPMODE_NORMALP) { + tcli_print( + "s32IPQpDelta:\t\t%d\n", + pChnHandle->pChnAttr->stGopAttr.stNormalP.s32IPQpDelta); + } else if (pChnHandle->pChnAttr->stGopAttr.enGopMode == + VENC_GOPMODE_SMARTP) { + tcli_print( + "s32IPQpDelta:\t\t%d\n", + pChnHandle->pChnAttr->stGopAttr.stSmartP.s32BgQpDelta); + tcli_print( + "u32BgInterval:\t\t%d\n", + pChnHandle->pChnAttr->stGopAttr.stSmartP.u32BgInterval); + tcli_print( + "s32ViQpDelta:\t\t%d\n", + pChnHandle->pChnAttr->stGopAttr.stSmartP.s32ViQpDelta); + } + + tcli_print("\n"); + tcli_print("currPTS:\t\t%llu\n", pChnHandle->pChnVars->currPTS); + + tcli_print("\n"); + + if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H264) { + tcli_print("chroma_qp_index_offset:\t%d\n", + pChnHandle->h264Trans.chroma_qp_index_offset); + } else if (pChnHandle->pChnAttr->stVencAttr.enType == PT_H265) { + tcli_print("cb_qp_offset:\t\t%d\n", + pChnHandle->h265Trans.cb_qp_offset); + tcli_print("cr_qp_offset:\t\t%d\n", + pChnHandle->h265Trans.cr_qp_offset); + } + + tcli_print("\n"); + tcli_print("bFrmLostOpen:\t\t%d\n", pChnHandle->frameLost.bFrmLostOpen); + tcli_print("enFrmLostMode:\t\t%d\n", + pChnHandle->frameLost.enFrmLostMode); + tcli_print("u32EncFrmGaps:\t\t%d\n", + pChnHandle->frameLost.u32EncFrmGaps); + tcli_print("u32FrmLostBpsThr:\t%d\n", + pChnHandle->frameLost.u32FrmLostBpsThr); + + venc_chn_vars *pChnVars = pChnHandle->pChnVars; + + if (pChnVars) { + tcli_print("venc_chn_vars info:\n"); + tcli_print("u64TimeOfSendFrame:%llu\n", + pChnVars->u64TimeOfSendFrame); + tcli_print("u64LastGetStreamTimeStamp:%llu\n", + pChnVars->u64LastGetStreamTimeStamp); + tcli_print("u64LastSendFrameTimeStamp:%llu\n", + pChnVars->u64LastSendFrameTimeStamp); + tcli_print("currPTS:%llu\n", pChnVars->currPTS); + tcli_print("totalTime:%llu\n", pChnVars->totalTime); + tcli_print("frameIdx:%d\n", pChnVars->frameIdx); + tcli_print("s32RecvPicNum:%d\n", pChnVars->s32RecvPicNum); + tcli_print("bFrcEnable:%d\n", pChnVars->frc.bFrcEnable); + tcli_print("u32Seq:%u\n", pChnVars->stStream.u32Seq); + tcli_print("chnState:%d\n", pChnVars->chnState); + tcli_print("bAttrChang:%d\n", pChnVars->bAttrChange); + tcli_print("bHasVbPool:%d\n", pChnVars->bHasVbPool); + tcli_print("FrmNum:%u\n", pChnVars->FrmNum); + tcli_print("u32SendFrameCnt:%d\n", pChnVars->u32SendFrameCnt); + tcli_print("u32GetStreamCnt:%u\n", pChnVars->u32GetStreamCnt); + tcli_print("s32BindModeGetStreamRet:%d\n", + pChnVars->s32BindModeGetStreamRet); + + tcli_print("stChnParam_bColor2Grey:%d\n", + pChnVars->stChnParam.bColor2Grey); + tcli_print("stChnParam_u32Priority:%d\n", + pChnVars->stChnParam.u32Priority); + tcli_print("stChnParam_u32MaxStrmCnt:%d\n", + pChnVars->stChnParam.u32MaxStrmCnt); + tcli_print("stChnParam_u32Priority:%d\n", + pChnVars->stChnParam.u32Priority); + tcli_print("stChnParam_u32PollWakeUpFrmCnt:%d\n", + pChnVars->stChnParam.u32PollWakeUpFrmCnt); + tcli_print("stChnParam_s32SrcFrmRate:%d\n", + pChnVars->stChnParam.stFrameRate.s32SrcFrmRate); + tcli_print("s32DstFrmRate:%d\n", + pChnVars->stChnParam.stFrameRate.s32DstFrmRate); + tcli_print("stCropCfg_bEnable:%d\n", + pChnVars->stChnParam.stCropCfg.bEnable); + tcli_print("stCropCfg:x(%d) y(%d) width(%d) height(%d)\n", + pChnVars->stChnParam.stCropCfg.stRect.s32X, + pChnVars->stChnParam.stCropCfg.stRect.s32Y, + pChnVars->stChnParam.stCropCfg.stRect.u32Width, + pChnVars->stChnParam.stCropCfg.stRect.u32Height); + + tcli_print("chnStatus_u32LeftPics:%d\n", + pChnVars->chnStatus.u32LeftPics); + tcli_print("chnStatus_u32LeftStreamBytes:%d\n", + pChnVars->chnStatus.u32LeftStreamBytes); + tcli_print("chnStatus_u32LeftStreamFrames:%d\n", + pChnVars->chnStatus.u32LeftStreamFrames); + tcli_print("chnStatus_u32CurPacks:%d\n", + pChnVars->chnStatus.u32CurPacks); + tcli_print("chnStatus_u32LeftRecvPics:%d\n", + pChnVars->chnStatus.u32LeftRecvPics); + tcli_print("chnStatus_u32LeftEncPics:%d\n", + pChnVars->chnStatus.u32LeftEncPics); + tcli_print("chnStatus_bJpegSnapEnd:%d\n", + pChnVars->chnStatus.bJpegSnapEnd); + tcli_print("u32Stride [0]:%d [1]:%d [2]:%d\n", + pChnVars->u32Stride[0], pChnVars->u32Stride[1], + pChnVars->u32Stride[2]); + } + + venc_enc_ctx *pEncCtx; + + pEncCtx = &pChnHandle->encCtx; + PAYLOAD_TYPE_E enType = pChnHandle->pChnAttr->stVencAttr.enType; + + tcli_print( + "-------------------------ipinfo---------------------------\n"); + if (pEncCtx->base.ioctl && (enType == PT_H264 || enType == PT_H265)) { + pEncCtx->base.ioctl(pEncCtx, CVI_H26X_OP_GET_CHN_INFO, NULL); + } else if (pEncCtx->base.ioctl && + (enType == PT_JPEG || enType == PT_MJPEG)) { + pEncCtx->base.ioctl(pEncCtx, CVI_JPEG_OP_SHOW_CHN_INFO, NULL); + } + tcli_print( + "---------------------------------------------------------\n"); +} + +static int showVencParam(int32_t argc, char *argv[]) +{ + int chnIdx = 0; + + if (argc != 2) { + for (chnIdx = 0; chnIdx < VENC_MAX_CHN_NUM; chnIdx++) + cviDumpChnPram(chnIdx); + + return 0; + } + + chnIdx = atoi(argv[1]); + tcli_print("show chnIdx = %d\n", chnIdx); + cviDumpChnPram(chnIdx); + + return 0; +} + +static int setIpQpDeltaParam(int32_t argc, char *argv[]) +{ + int VencChn = 0; + int delta = 0; + int s32Ret = 0; + + if (argc != 3) { + tcli_print("usage:setipqpdelta chn delta\n"); + + return -1; + } + + VencChn = atoi(argv[1]); + delta = atoi(argv[2]); + + VENC_CHN_ATTR_S stVencChnAttr; + + s32Ret = CVI_VENC_GetChnAttr(VencChn, &stVencChnAttr); + if (s32Ret != CVI_SUCCESS) { + tcli_print("CVI_VENC_GetChnAttr, VencChn = %d, s32Ret = %d\n", + VencChn, s32Ret); + return -1; + } + + stVencChnAttr.stGopAttr.stNormalP.s32IPQpDelta = delta; + + if (CVI_VENC_SetChnAttr(VencChn, &stVencChnAttr)) { + tcli_print("CVI_VENC_SetChnAttr failed\n"); + return -1; + } + + tcli_print("set suc.\n"); + + return 0; +} + +static int getIpQpDeltaParam(int32_t argc, char *argv[]) +{ + int VencChn = 0; + int delta = 0; + int s32Ret = 0; + + if (argc != 2) { + tcli_print("usage:getipqpdelta chn\n"); + + return -1; + } + + VencChn = atoi(argv[1]); + + VENC_CHN_ATTR_S stVencChnAttr; + + s32Ret = CVI_VENC_GetChnAttr(VencChn, &stVencChnAttr); + if (s32Ret != CVI_SUCCESS) { + tcli_print("CVI_VENC_GetChnAttr, VencChn = %d, s32Ret = %d\n", + VencChn, s32Ret); + return -1; + } + + delta = stVencChnAttr.stGopAttr.stNormalP.s32IPQpDelta; + + tcli_print("enGopMode:%d,delta = %d\n", + stVencChnAttr.stGopAttr.enGopMode, delta); + + return 0; +} + +static TELNET_CLI_S_COMMAND venc_cmd_list[] = { + DECLARE_CLI_CMD_MACRO(channelinfo, NULL, showVencParam, + show venc channel info, 0), + DECLARE_CLI_CMD_MACRO(getipqpdelta, NULL, getIpQpDeltaParam, + get ipqpdelta, 0), + DECLARE_CLI_CMD_MACRO(setipqpdelta, NULL, setIpQpDeltaParam, + set ipqpdelta, 0), + DECLARE_CLI_CMD_MACRO(dumpyuv, NULL, __cliDumpVencSrcYUV, dump venc yuv, + 0), + DECLARE_CLI_CMD_MACRO(dbginfo, NULL, cliShowVencDbgInfo, + show chn debug info, 0), + DECLARE_CLI_CMD_MACRO(dumpbitstream, NULL, __cliDumpVencBs, + dump venc bitstream, 0), + DECLARE_CLI_CMD_MACRO(vencinfo, NULL, __cliVencInfoShow, + dump venc bitstream, 0), + DECLARE_CLI_CMD_MACRO(getmaxBsSize, NULL, __cliGetmaxBsSize, + get max bs size, 0), + DECLARE_CLI_CMD_MACRO_END() +}; + +static TELNET_CLI_S_COMMAND vcodec_cli_cmd_list[] = { + DECLARE_CLI_CMD_MACRO(venc, venc_cmd_list, NULL, venc cmd list, 0), + DECLARE_CLI_CMD_MACRO_END() +}; + +void venc_register_cmd(void) +{ + int enRet = 0; + + pthread_mutex_lock(&vencCliMutex); + + if (bVencCliReg) { + pthread_mutex_unlock(&vencCliMutex); + return; + } + memset(__astVencCliDbgInfo, 0, sizeof(__astVencCliDbgInfo)); + + bVencCliReg = 1; + enRet = RegisterCliCommand((void *)vcodec_cli_cmd_list); + + if (enRet) { + printf("<%s,%d>:cmd register failed,enRet=%#x\r\n", __func__, + __LINE__, enRet); + pthread_mutex_unlock(&vencCliMutex); + return; + } + + pthread_mutex_unlock(&vencCliMutex); +} + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/phobos/soph_vc_driver.ko b/osdrv/interdrv/v2/cvi_vc_drv/phobos/soph_vc_driver.ko deleted file mode 100644 index 7964debd8a..0000000000 Binary files a/osdrv/interdrv/v2/cvi_vc_drv/phobos/soph_vc_driver.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/phobos_riscv/soph_vc_driver.ko b/osdrv/interdrv/v2/cvi_vc_drv/phobos_riscv/soph_vc_driver.ko deleted file mode 100644 index 7964debd8a..0000000000 Binary files a/osdrv/interdrv/v2/cvi_vc_drv/phobos_riscv/soph_vc_driver.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/config.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/config.h new file mode 100644 index 0000000000..88bfce4f66 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/config.h @@ -0,0 +1,105 @@ +//------------------------------------------------------------------------------ +// File: config.h +// +// Copyright (c) 2006, Chips & Media. All rights reserved. +// This file should be modified by some developers of C&M according to product +// version. +//------------------------------------------------------------------------------ +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || \ + defined(WIN32) || defined(__MINGW32__) +#define PLATFORM_WIN32 +#elif defined(linux) || defined(__linux) || defined(ANDROID) +#if defined(USE_KERNEL_MODE) +#define PLATFORM_LINUX_KERNEL +#else +#define PLATFORM_LINUX +#endif +#elif defined(unix) || defined(__unix) +#define PLATFORM_QNX +#else +#define PLATFORM_NON_OS +#define SUPPORT_DONT_READ_STREAM +#endif + +#if defined(_MSC_VER) +#include +#define inline _inline +#elif defined(__GNUC__) +#elif defined(__ARMCC__) +#else +#error "Unknown compiler." +#endif + +#define API_VERSION_MAJOR 5 +#define API_VERSION_MINOR 5 +#define API_VERSION_PATCH 35 +#define API_VERSION \ + ((API_VERSION_MAJOR << 16) | (API_VERSION_MINOR << 8) | \ + API_VERSION_PATCH) + +#if defined(PLATFORM_NON_OS) || defined(ANDROID) || defined(MFHMFT_EXPORTS) || \ + defined(PLATFORM_QNX) || defined(_LINUX_) || \ + defined(PLATFORM_LINUX_KERNEL) +//#define SUPPORT_FFMPEG_DEMUX +#else +#define SUPPORT_FFMPEG_DEMUX +#endif + +//------------------------------------------------------------------------------ +// COMMON +//------------------------------------------------------------------------------ + +// do not define BIT_CODE_FILE_PATH in case of multiple product support. because +// wave410 and coda980 has different firmware binary format. +#define CORE_0_BIT_CODE_FILE_PATH "cezzane.bin" // for wave420 +// for coda980,md5sum:02d773cb7b1ef926c7f1e30e5b7918f8 +#define CORE_1_BIT_CODE_FILE_PATH "/usr/share/fw_vcodec/coda980.bin" +#define CORE_2_BIT_CODE_FILE_PATH "pissarro.bin" // for wave412 +#define CORE_3_BIT_CODE_FILE_PATH "michelangel.bin" // for wave410 +#define CORE_4_BIT_CODE_FILE_PATH "coda960.out" // for coda960 +// for wave420L,md5sum:202043a809fdfa607a2d01d179aa7c3d +#define CORE_5_BIT_CODE_FILE_PATH "/usr/share/fw_vcodec/monet.bin" +#define CORE_6_BIT_CODE_FILE_PATH "mondrian.bin" // for wave510 +#define CORE_7_BIT_CODE_FILE_PATH "picasso.bin" // for wave510 +#define CORE_8_BIT_CODE_FILE_PATH "kepler.bin" // for wave515 +#define CORE_9_BIT_CODE_FILE_PATH "millet.bin" // for wave520 + +//------------------------------------------------------------------------------ +// OMX +//------------------------------------------------------------------------------ + +#define REPORT_PIC_SUM_VAR +//------------------------------------------------------------------------------ +// CODA980 +//------------------------------------------------------------------------------ +//#define SUPPORT_ROI_50 +//#define SUPPORT_LIB_THEORA +#define AUTO_FRM_SKIP_DROP +#define CLIP_PIC_DELTA_QP + +#define SUPPORT_980_ROI_RC_LIB +#define ROI_MB_RC +#define RC_PIC_PARACHANGE + +//------------------------------------------------------------------------------ +// WAVE420 +//------------------------------------------------------------------------------ +//#define SUPPORT_ENCODE_CUSTOM_HEADER // to make VUI/HRD/SEI data +#ifdef SUPPORT_ENCODE_CUSTOM_HEADER +#define TEST_ENCODE_CUSTOM_HEADER +#endif + +#define SUPPORT_HOST_RC_PARAM + +#ifdef __cplusplus +} +#endif + +#endif /* __CONFIG_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_dec_internal.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_dec_internal.c new file mode 100644 index 0000000000..4b0a80bad4 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_dec_internal.c @@ -0,0 +1,3284 @@ +/* + * Copyright Cvitek Technologies Inc. + * + * Created Time: Aug, 2020 + */ +#ifdef ENABLE_DEC +#include +#include "cvi_dec_internal.h" +#include "cvi_h265_interface.h" +#include "product.h" +#include "cvi_vc_getopt.h" + +#define FEEDING_SIZE 0x20000 +#define USERDATA_BUFFER_SIZE (512 * 1024) +#define STREAM_BUF_SIZE_HEVC 0xA00000 + +#define SECONDARY_AXI_H264 0xf +#define SECONDARY_AXI_H265 0x7 + +static int cviBitstreamFeeder_Act(cviVideoDecoder *pvdec); +static int cviInitSeq(cviVideoDecoder *pvdec); + +#ifdef CVI_WRITE_FRAME +static int cviWriteFrame(cviVideoDecoder *pvdec); +static int cviWriteComp(cviVideoDecoder *pvdec, PhysicalAddress buf, int width, + int height, int stride); +#endif + +CVI_VDEC_CALLBACK pVdecDrvCbFunc; + +cviVideoDecoder *cviAllocVideoDecoder(void) +{ + cviVideoDecoder *pvdec; + + pvdec = (cviVideoDecoder *)osal_malloc(sizeof(cviVideoDecoder)); + if (!pvdec) { + CVI_VC_ERR("malloc, cviVideoDecoder\n"); + return NULL; + } + memset(pvdec, 0, sizeof(cviVideoDecoder)); + return pvdec; +} + +void cviFreeVideoDecoder(cviVideoDecoder **ppvdec) +{ + cviVideoDecoder *pvdec; + + if (!ppvdec) { + CVI_VC_ERR("ppvdec\n"); + return; + } + + pvdec = *ppvdec; + + if (!pvdec) { + CVI_VC_ERR("pvdec\n"); + return; + } + + osal_free(pvdec); + + *ppvdec = NULL; +} + +int cviInitDecMcuEnv(cviDecConfig *pdeccfg) +{ + Uint32 productId = PRODUCT_ID_980; +#ifndef FIRMWARE_H + char *fwPath = NULL; +#endif + + cviSetCoreIdx(&pdeccfg->coreIdx, pdeccfg->bitFormat); + + if (pdeccfg->bitFormat == STD_HEVC) { + productId = PRODUCT_ID_420L; + } + + CVI_VC_TRACE("\n"); +#ifdef FIRMWARE_H + if (pdeccfg->sizeInWord == 0 && pdeccfg->pusBitCode == NULL) { + if (LoadFirmwareH(productId, (Uint8 **)&pdeccfg->pusBitCode, + &pdeccfg->sizeInWord) < 0) { + CVI_VC_ERR("Failed to load firmware: productId = %d\n", productId); + return CVI_ERR_DEC_MCU; + } + } +#else + switch (productId) { + case PRODUCT_ID_980: + fwPath = CORE_1_BIT_CODE_FILE_PATH; + break; + case PRODUCT_ID_420L: + fwPath = CORE_5_BIT_CODE_FILE_PATH; + break; + default: + CVI_VC_ERR("Unknown product id: %d\n", productId); + return -1; + } + if (pdeccfg->sizeInWord == 0 && pdeccfg->pusBitCode == NULL) { + if (LoadFirmware(productId, (Uint8 **)&pdeccfg->pusBitCode, + &pdeccfg->sizeInWord, fwPath) < 0) { + CVI_VC_ERR("Failed to load firmware: %s\n", fwPath); + return 1; + } + } +#endif + + return 0; +} + +void cviFreeDecMcuEnv(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + + if (pdeccfg->pusBitCode) { +#ifndef FIRMWARE_H + osal_free(pdeccfg->pusBitCode); +#endif + pdeccfg->pusBitCode = NULL; + pdeccfg->sizeInWord = 0; + } +} + +static int _cviH265_InitDecoder(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + DecOpenParam dop, *pdop = &dop; + RetCode ret = RETCODE_FAILURE; +#ifndef CVI_H26X_USE_ION_MEM + Uint32 index; +#else +#ifdef BITSTREAM_ION_CACHED_MEM + Int32 bBsStreamCached = 1; +#else + Int32 bBsStreamCached = 0; +#endif +#endif + Uint64 start_time, end_time; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + memset(&dop, 0, sizeof(dop)); + + pvdec->seqInited = FALSE; + pvdec->feeder = NULL; + pvdec->renderer = NULL; + pvdec->comparator = NULL; + pvdec->enablePPU = FALSE; + pvdec->ppuFbCount = PPU_FB_COUNT; + pvdec->decodedIdx = 0; + pvdec->framebufHeight = 0; + pvdec->doDumpImage = FALSE; + pvdec->waitPostProcessing = FALSE; + pvdec->needStream = FALSE; + pvdec->seqChangeRequest = FALSE; + pvdec->decHandle = NULL; + pvdec->dispIdx = 0; + pvdec->noFbCount = 0; + pvdec->assertedFieldDoneInt = FALSE; + //pvdec->ppuQ = NULL; + pvdec->noResponseCount = MAX_COUNT_NO_RESPONSE; + pvdec->seqChangedStreamEndFlag = 0; + pvdec->seqChangedRdPtr = 0; + pvdec->seqChangedWrPtr = 0; + + pvdec->bsBufferCount = 1; + pvdec->bsQueueIndex = 0; + + pdeccfg->enableCrop = TRUE; + + pvdec->productId = VPU_GetProductId(pdeccfg->coreIdx); + if (pvdec->productId == -1) { + CVI_VC_ERR("Failed to get product ID\n"); + return CVI_ERR_DEC_INIT; + } + + start_time = cviGetCurrentTime(); + + ret = VPU_InitWithBitcode(pdeccfg->coreIdx, + (const Uint16 *)pdeccfg->pusBitCode, + pdeccfg->sizeInWord); + if (ret != RETCODE_CALLED_BEFORE && ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "Failed to boot up VPU(coreIdx: %d, productId: %d)\n", + pdeccfg->coreIdx, pvdec->productId); + return CVI_ERR_DEC_INIT; + } + + end_time = cviGetCurrentTime(); + CVI_VC_PERF("VPU_InitWithBitcode = %llu us\n", end_time - start_time); + + PrintVpuVersionInfo(pdeccfg->coreIdx); + + pvdec->bsBufferCount = + (pdeccfg->bitstreamMode == BS_MODE_PIC_END) ? 2 : 1; + + sprintf(ionName, "VDEC_%d_BitStreamBuffer", pvdec->chnNum); +#ifndef CVI_H26X_USE_ION_MEM + for (index = 0; index < pvdec->bsBufferCount; index++) { + pvdec->vbStream[index].size = pdeccfg->bsSize; + CVI_VC_MEM("vbStream[%d].size = 0x%X\n", index, + pvdec->vbStream[index].size); + if (VDI_ALLOCATE_MEMORY(pdeccfg->coreIdx, + &pvdec->vbStream[index], 0, + ionName) < 0) { + VLOG(ERR, "fail to allocate bitstream buffer\n"); + return CVI_ERR_DEC_INIT; + } + } +#else + pvdec->vbStream[0].size = pdeccfg->bsSize * pvdec->bsBufferCount; + if (VDI_ALLOCATE_MEMORY(pdeccfg->coreIdx, &pvdec->vbStream[0], + bBsStreamCached, ionName) < 0) { + VLOG(ERR, "fail to allocate bitstream buffer\n"); + return CVI_ERR_DEC_INIT; + } + pvdec->vbStream[0].size = pvdec->vbStream[1].size = pdeccfg->bsSize; + pvdec->vbStream[1].phys_addr = + pvdec->vbStream[0].phys_addr + pdeccfg->bsSize; + pvdec->vbStream[1].virt_addr = + pvdec->vbStream[0].virt_addr + pdeccfg->bsSize; +#endif + + CVI_VC_TRACE("cviApiMode = %d, bitstreamMode = %d\n", pvdec->cviApiMode, + pdeccfg->bitstreamMode); +#ifdef VC_DRIVER_TEST + if (pvdec->cviApiMode == API_MODE_DRIVER) { + if (pdeccfg->feedingMode == FEEDING_METHOD_FRAME_SIZE) { + CodStd codecId; + pvdec->feeder = BitstreamFeeder_Create( + pdeccfg->inputPath, FEEDING_METHOD_FRAME_SIZE, + pvdec->vbStream[0].phys_addr, + pvdec->vbStream[0].size, pdeccfg->bitFormat, + &codecId, NULL, NULL, NULL); + pdeccfg->bitFormat = codecId; + } else if (pdeccfg->feedingMode == FEEDING_METHOD_FIXED_SIZE) { + pvdec->feeder = BitstreamFeeder_Create( + pdeccfg->inputPath, FEEDING_METHOD_FIXED_SIZE, + pvdec->vbStream[0].phys_addr, + pvdec->vbStream[0].size, FEEDING_SIZE); + } else { + /* FEEDING_METHOD_SIZE_PLUS_ES */ + pvdec->feeder = BitstreamFeeder_Create( + pdeccfg->inputPath, FEEDING_METHOD_SIZE_PLUS_ES, + pvdec->vbStream[0].phys_addr, + pvdec->vbStream[0].size); + } + + if (pvdec->feeder == NULL) { + VLOG(ERR, "fail to create feeder\n"); + return CVI_ERR_DEC_INIT; + } + BitstreamFeeder_SetFillMode(pvdec->feeder, + (pdeccfg->bitstreamMode == + BS_MODE_PIC_END) ? + BSF_FILLING_LINEBUFFER : + BSF_FILLING_RINGBUFFER); + } else +#endif + { + pvdec->feeder = BitstreamFeeder_Create( + pdeccfg->inputPath, FEEDING_METHOD_ES_IN, + pvdec->vbStream[0].phys_addr, pvdec->vbStream[0].size, + FEEDING_SIZE); + } + + /* set up decoder configurations */ + pdop->bitstreamFormat = (CodStd)pdeccfg->bitFormat; + pdop->coreIdx = pdeccfg->coreIdx; + pdop->bitstreamBuffer = pvdec->vbStream[0].phys_addr; + pdop->bitstreamBufferSize = + pvdec->vbStream[0].size * pvdec->bsBufferCount; + pdop->bitstreamMode = pdeccfg->bitstreamMode; + pdop->wtlEnable = pdeccfg->enableWTL; + pdop->wtlMode = pdeccfg->wtlMode; + pdop->cbcrInterleave = pdeccfg->cbcrInterleave; + pdop->nv21 = pdeccfg->nv21; + pdop->streamEndian = pdeccfg->streamEndian; + pdop->frameEndian = pdeccfg->frameEndian; + pdop->fbc_mode = pdeccfg->wave4.fbcMode; + pdop->bwOptimization = pdeccfg->wave4.bwOptimization; + pdop->s32ChnNum = pvdec->chnNum; + + /******************************************************************************** + * CREATE INSTANCE * + ********************************************************************************/ + ret = VPU_DecOpen(&pvdec->decHandle, pdop); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_DecOpen failed Error code is 0x%x\n", ret); + return CVI_ERR_DECODE_END; + } + + pvdec->vbUserData.size = USERDATA_BUFFER_SIZE; + CVI_VC_MEM("vbUserData.size = 0x%X\n", pvdec->vbUserData.size); + + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VDEC_%d_UserData", pvdec->chnNum); + if (VDI_ALLOCATE_MEMORY(pdeccfg->coreIdx, &pvdec->vbUserData, 0, + ionName) < 0) { + VLOG(ERR, "%s:%d Failed to allocate memory\n", __func__, + __LINE__); + return CVI_ERR_DECODE_END; + } + //pBase = (Uint8*)osal_malloc(USERDATA_BUFFER_SIZE); + VPU_DecGiveCommand(pvdec->decHandle, SET_ADDR_REP_USERDATA, + (void *)&pvdec->vbUserData.phys_addr); + VPU_DecGiveCommand(pvdec->decHandle, SET_SIZE_REP_USERDATA, + (void *)&pvdec->vbUserData.size); + VPU_DecGiveCommand(pvdec->decHandle, ENABLE_REP_USERDATA, + (void *)&pdeccfg->enableUserData); + + if (pdeccfg->thumbnailMode == TRUE) { + VPU_DecGiveCommand(pvdec->decHandle, ENABLE_DEC_THUMBNAIL_MODE, + NULL); + } + + pvdec->renderer = SimpleRenderer_Create( + pvdec->decHandle, pdeccfg->renderType, pdeccfg->outputPath); + if (pvdec->renderer == NULL) { + CVI_VC_ERR("renderer = NULL\n"); + return CVI_ERR_DECODE_END; + } + + pvdec->displayQ = Queue_Create(MAX_REG_FRAME, sizeof(DecOutputInfo)); + if (pvdec->displayQ == NULL) { + CVI_VC_ERR("Create displayQ fail\n"); + return CVI_ERR_DECODE_END; + } + + pvdec->sequenceQ = Queue_Create(MAX_REG_FRAME, sizeof(Uint32)); + if (pvdec->sequenceQ == NULL) { + CVI_VC_ERR("Create sequenceQ fail\n"); + return CVI_ERR_DECODE_END; + } + + return CVI_INIT_DECODER_OK; +} + +static int _cviH264_InitDecoder(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + VpuReportConfig_t *pdrc = &pvdec->decReportCfg; + vpu_buffer_t *pvbs = &pvdec->vbStream[0]; + DecOpenParam dop, *pdop = &dop; + RetCode ret = RETCODE_FAILURE; + Uint64 start_time, end_time; +#ifdef CVI_H26X_USE_ION_MEM +#ifdef BITSTREAM_ION_CACHED_MEM + Int32 bBsStreamCached = 1; +#else + Int32 bBsStreamCached = 0; +#endif +#endif + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + memset(&dop, 0, sizeof(dop)); + pvdec->seqInited = FALSE; + pvdec->feeder = NULL; + pvdec->renderer = NULL; + pvdec->comparator = NULL; + pvdec->enablePPU = FALSE; + pvdec->ppuFbCount = PPU_FB_COUNT; + pvdec->decodedIdx = 0; + pvdec->framebufHeight = 0; + pvdec->doDumpImage = FALSE; + pvdec->waitPostProcessing = FALSE; + pvdec->needStream = FALSE; + pvdec->seqChangeRequest = FALSE; + pvdec->decHandle = NULL; + pvdec->dispIdx = 0; + pvdec->noFbCount = 0; + pvdec->assertedFieldDoneInt = FALSE; + pvdec->ppuQ = NULL; + pvdec->noResponseCount = MAX_COUNT_NO_RESPONSE; + pvdec->seqChangedStreamEndFlag = 0; + pvdec->seqChangedRdPtr = 0; + pvdec->seqChangedWrPtr = 0; + + pdeccfg->enableCrop = TRUE; + + pvdec->productId = VPU_GetProductId(pdeccfg->coreIdx); + if (pvdec->productId == -1) { + CVI_VC_ERR("Failed to get product ID\n"); + return CVI_ERR_DEC_INIT; + } + + start_time = cviGetCurrentTime(); + + ret = VPU_InitWithBitcode(pdeccfg->coreIdx, + (const Uint16 *)pdeccfg->pusBitCode, + pdeccfg->sizeInWord); + if (ret != RETCODE_CALLED_BEFORE && ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "Failed to boot up VPU(coreIdx: %d, productId: %d)\n", + pdeccfg->coreIdx, pvdec->productId); + return CVI_ERR_DEC_INIT; + } + + end_time = cviGetCurrentTime(); + CVI_VC_PERF("VPU_InitWithBitcode = %llu us\n", end_time - start_time); + + PrintVpuVersionInfo(pdeccfg->coreIdx); + + if (pvdec->cviApiMode == API_MODE_SDK) { + pvbs->size = pdeccfg->bsSize; + } else { + pvbs->size = STREAM_BUF_SIZE; + } + CVI_VC_MEM("vbStream, pvbs.size = 0x%X\n", pvbs->size); + + sprintf(ionName, "VDEC_%d_BitStreamBuffer", pvdec->chnNum); + if (VDI_ALLOCATE_MEMORY(pdeccfg->coreIdx, pvbs, bBsStreamCached, + ionName) < 0) { + CVI_VC_ERR("fail to allocate bitstream buffer\n"); + return CVI_ERR_DEC_INIT; + } + + CVI_VC_TRACE("cviApiMode = %d, bitstreamMode = %d\n", pvdec->cviApiMode, + pdeccfg->bitstreamMode); +#ifdef VC_DRIVER_TEST + if (pvdec->cviApiMode == API_MODE_DRIVER) { + if (pdeccfg->bitstreamMode == BS_MODE_PIC_END || + pdeccfg->bitFormat == STD_THO) { + CodStd codecId; + Uint32 mp4Id; + + pvdec->feeder = BitstreamFeeder_Create( + pdeccfg->inputPath, FEEDING_METHOD_FRAME_SIZE, + pvbs->phys_addr, pvbs->size, pdeccfg->bitFormat, + &codecId, &mp4Id, NULL, NULL); + pdeccfg->bitFormat = codecId; + pdeccfg->coda9.mp4class = mp4Id; + } else { + CVI_VC_TRACE("phys_addr = 0x%llX\n", pvbs->phys_addr); + pvdec->feeder = BitstreamFeeder_Create( + pdeccfg->inputPath, FEEDING_METHOD_FIXED_SIZE, + pvbs->phys_addr, pvbs->size, 0x2000); + } + } else +#endif + { + pvdec->feeder = BitstreamFeeder_Create(pdeccfg->inputPath, + FEEDING_METHOD_ES_IN, + pvbs->phys_addr, + pvbs->size, 0x2000); + } + + if (pvdec->feeder == NULL) { + CVI_VC_ERR("feeder = NULL\n"); + return CVI_ERR_DECODE_END; + } + + /* set up decoder configurations */ + pdop->bitstreamFormat = (CodStd)pdeccfg->bitFormat; + pdop->avcExtension = pdeccfg->coda9.enableMvc; + pdop->coreIdx = pdeccfg->coreIdx; + pdop->bitstreamBuffer = pvbs->phys_addr; + pdop->bitstreamBufferSize = pvbs->size; + pdop->bitstreamMode = pdeccfg->bitstreamMode; + pdop->tiled2LinearEnable = pdeccfg->coda9.enableTiled2Linear; + pdop->tiled2LinearMode = pdeccfg->coda9.tiled2LinearMode; + pdop->wtlEnable = pdeccfg->enableWTL; + pdop->wtlMode = pdeccfg->wtlMode; + pdop->cbcrInterleave = pdeccfg->cbcrInterleave; + pdop->nv21 = pdeccfg->nv21; + pdop->streamEndian = pdeccfg->streamEndian; + pdop->frameEndian = pdeccfg->frameEndian; + pdop->bwbEnable = pdeccfg->coda9.enableBWB; + pdop->mp4DeblkEnable = pdeccfg->coda9.enableDeblock; + pdop->mp4Class = pdeccfg->coda9.mp4class; + pdop->s32ChnNum = pvdec->chnNum; + pdop->reorderEnable = pvdec->ReorderEnable; + + VLOG(INFO, + "-------------- DECODER OPTIONS ------------------------------\n"); + VLOG(INFO, "[coreIdx ]: %d\n", pdop->coreIdx); + VLOG(INFO, "[mapType ]: %d\n", pdeccfg->mapType); + VLOG(INFO, "[tiled2linear ]: %d\n", + pdeccfg->coda9.enableTiled2Linear); + VLOG(INFO, "[wtlEnable ]: %d\n", pdop->wtlEnable); + VLOG(INFO, "[wtlMode ]: %d\n", pdop->wtlMode); + VLOG(INFO, "[bitstreamBuffer ]: 0x%08x\n", pdop->bitstreamBuffer); + VLOG(INFO, "[bitstreamBufferSize]: %d\n", pdop->bitstreamBufferSize); + VLOG(INFO, "[bitstreamMode ]: %d\n", pdop->bitstreamMode); + VLOG(INFO, "[cbcrInterleave ]: %d\n", pdop->cbcrInterleave); + VLOG(INFO, "[nv21 ]: %d\n", pdop->nv21); + VLOG(INFO, "[streamEndian ]: %d\n", pdop->streamEndian); + VLOG(INFO, "[frameEndian ]: %d\n", pdop->frameEndian); + VLOG(INFO, "[BWB ]: %d\n", pdop->bwbEnable); + VLOG(INFO, "[reorderEnable ]: %d\n", pdop->reorderEnable); + VLOG(WARN, + "-------------------------------------------------------------\n"); + + /******************************************************************************** + * CREATE INSTANCE * + ********************************************************************************/ + ret = VPU_DecOpen(&pvdec->decHandle, pdop); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_DecOpen failed Error code is 0x%x\n", ret); + return CVI_ERR_DECODE_END; + } + + if (pdop->bitstreamFormat == STD_AVC) { + ret = VPU_DecGiveCommand(pvdec->decHandle, SET_LOW_DELAY_CONFIG, + &pdeccfg->coda9.lowDelay); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "VPU_DecGiveCommand[SET_LOW_DELAY_CONFIG] failed Error code is 0x%x\n", + ret); + return CVI_ERR_DECODE_END; + } + } + + pdrc->userDataEnable = pdeccfg->enableUserData; + pdrc->userDataReportMode = 1; +#ifdef REDUNDENT_CODE + OpenDecReport(pdeccfg->coreIdx, pdrc); + ConfigDecReport(pdeccfg->coreIdx, pvdec->decHandle); +#endif + +#ifdef ENABLE_CNM_DEBUG_MSG + // VPU_DecGiveCommand(pvdec->decHandle, ENABLE_LOGGING, 0); +#endif + pvdec->renderer = SimpleRenderer_Create( + pvdec->decHandle, pdeccfg->renderType, pdeccfg->outputPath); + if (pvdec->renderer == NULL) { + CVI_VC_ERR("renderer = NULL\n"); + return CVI_ERR_DECODE_END; + } + + return CVI_INIT_DECODER_OK; +} + +int cviInitDecoder(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + int ret = CVI_INIT_DECODER_OK; + + if (pdeccfg->bitFormat == STD_AVC) + ret = _cviH264_InitDecoder(pvdec); + else + ret = _cviH265_InitDecoder(pvdec); + + return ret; +} + +int cviInitSeqSetting(cviVideoDecoder *pvdec) +{ + CVI_DEC_STATUS decStatus; + cviDecConfig *pdeccfg = &pvdec->decConfig; + vpu_buffer_t *pvbs = &pvdec->vbStream[0]; + + CVI_VC_TRACE("\n"); + + VPU_DecSetOutputFormat(pvdec->decHandle, pdeccfg->cbcrInterleave, + pdeccfg->nv21); + + if (pdeccfg->bitFormat == STD_HEVC) { + pvdec->bsQueueIndex = + (pvdec->bsQueueIndex + 1) % (pvdec->bsBufferCount); + VPU_DecSetRdPtr(pvdec->decHandle, + pvdec->vbStream[pvdec->bsQueueIndex].phys_addr, + TRUE); + } else { + VPU_DecSetRdPtr(pvdec->decHandle, pvbs->phys_addr, TRUE); + } + + pvdec->nWritten = cviBitstreamFeeder_Act(pvdec); + + if (pvdec->nWritten < 0) { + CVI_VC_ERR("nWritten < 0\n"); + return CVI_ERR_DECODE_END; + } + +#ifdef REDUNDENT_CODE + if (pdeccfg->bitstreamMode == BS_MODE_PIC_END) { + if ((CodStd)pdeccfg->bitFormat != STD_THO && + (CodStd)pdeccfg->bitFormat != STD_H263 && + (CodStd)pdeccfg->bitFormat != STD_RV) { + // Need first picture. In case of Theora, ffmpeg returns + // a coded frame including sequence header. + // cviBitstreamFeeder_Act(pvdec); + } + } +#endif + + decStatus = cviInitSeq(pvdec); + if (decStatus == CVI_ERR_DECODE_END) { + CVI_VC_ERR("cviInitSeq, decStatus = %d\n", decStatus); + return decStatus; + } + + return 0; +} + +static int cviBitstreamFeeder_Act(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + vpu_buffer_t *bsBuf = NULL; + + if (pvdec->cviApiMode == API_MODE_SDK) { + bsBuf = &pvdec->sdkParam.bsBuf; + } + + return BitstreamFeeder_Act(pvdec->decHandle, pvdec->feeder, + pdeccfg->streamEndian, bsBuf); +} + +BOOL _AllocateH265DecFrameBuffer(cviVideoDecoder *pvdec, DecHandle decHandle, + cviDecConfig *pdeccfg, Uint32 tiledFbCount, + Uint32 linearFbCount, FrameBuffer *retFbArray, + vpu_buffer_t *retFbAddrs, Uint32 *retStride) +{ + Uint32 framebufSize; + Uint32 totalFbCount; + Uint32 coreIndex; + Uint32 index; + FrameBufferFormat format = pdeccfg->wtlFormat; + DecInitialInfo seqInfo; + FrameBufferAllocInfo fbAllocInfo; + RetCode ret; + vpu_buffer_t *pvb; + size_t framebufStride; + size_t framebufHeight; + Uint32 productId; + DRAMConfig *pDramCfg = NULL; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + coreIndex = VPU_HANDLE_CORE_INDEX(decHandle); + productId = VPU_HANDLE_PRODUCT_ID(decHandle); + VPU_DecGiveCommand(decHandle, DEC_GET_SEQ_INFO, (void *)&seqInfo); + + if (productId != PRODUCT_ID_420L) + CVI_VC_WARN("productId != PRODUCT_ID_420L\n"); + CVI_VC_INFO("coreIndex=%d, productId=%d\n", coreIndex, productId); + + totalFbCount = tiledFbCount + linearFbCount; + + if (productId == PRODUCT_ID_4102 || productId == PRODUCT_ID_420 || + productId == PRODUCT_ID_412 || productId == PRODUCT_ID_420L || + productId == PRODUCT_ID_510 || productId == PRODUCT_ID_512 || + productId == PRODUCT_ID_515) { + format = (seqInfo.lumaBitdepth > 8 || + seqInfo.chromaBitdepth > 8) ? + FORMAT_420_P10_16BIT_LSB : + FORMAT_420; + } + + *retStride = VPU_ALIGN32(seqInfo.picWidth); + framebufStride = CalcStride(seqInfo.picWidth, seqInfo.picHeight, format, + pdeccfg->cbcrInterleave, pdeccfg->mapType, + FALSE, TRUE); + framebufHeight = seqInfo.picHeight; + framebufSize = + VPU_GetFrameBufSize(decHandle->coreIdx, framebufStride, + seqInfo.picHeight, pdeccfg->mapType, format, + pdeccfg->cbcrInterleave, pDramCfg); + + osal_memset((void *)&fbAllocInfo, 0x00, sizeof(fbAllocInfo)); + if (pvdec->eVdecVBSource == E_CVI_VB_SRC_COMMON) { + osal_memset((void *)retFbArray, 0x00, + sizeof(FrameBuffer) * totalFbCount); + } + + fbAllocInfo.format = format; + fbAllocInfo.cbcrInterleave = pdeccfg->cbcrInterleave; + fbAllocInfo.mapType = pdeccfg->mapType; + fbAllocInfo.stride = framebufStride; + fbAllocInfo.height = framebufHeight; + fbAllocInfo.size = framebufSize; + fbAllocInfo.lumaBitDepth = seqInfo.lumaBitdepth; + fbAllocInfo.chromaBitDepth = seqInfo.chromaBitdepth; + fbAllocInfo.num = tiledFbCount; + fbAllocInfo.endian = pdeccfg->frameEndian; + fbAllocInfo.type = FB_TYPE_CODEC; + osal_memset((void *)retFbAddrs, 0x00, + sizeof(vpu_buffer_t) * totalFbCount); + + if (pvdec->eVdecVBSource == E_CVI_VB_SRC_COMMON) { + for (index = 0; index < tiledFbCount; index++) { + pvb = &retFbAddrs[index]; + pvb->size = framebufSize; + CVI_VC_MEM("FB[%d], size = 0x%X\n", index, pvb->size); + sprintf(ionName, "VDEC_%d_FrameBuffer", pvdec->chnNum); + if (VDI_ALLOCATE_MEMORY(coreIndex, pvb, 0, ionName) < + 0) { + CVI_VC_ERR("fail to allocate frame buffer\n"); + ReleaseVideoMemory(coreIndex, retFbAddrs, + totalFbCount); + return FALSE; + } + retFbArray[index].bufY = pvb->phys_addr; + retFbArray[index].bufCb = (PhysicalAddress)-1; + retFbArray[index].bufCr = (PhysicalAddress)-1; + retFbArray[index].updateFbInfo = TRUE; + retFbArray[index].size = framebufSize; + } + } else { + stCviCb_HostAllocFB hostAllocFb; + Int32 result; + + hostAllocFb.iFrmBufNum = totalFbCount; + hostAllocFb.iFrmBufSize = framebufSize; + result = pVdecDrvCbFunc(pvdec->chnNum, CVI_H26X_DEC_CB_AllocFB, + (void *)&hostAllocFb); + if (result == 0) { + CVI_VC_ERR("fail to allocate frame buffer\n"); + return FALSE; + } + } + + if (tiledFbCount != 0) { + ret = VPU_DecAllocateFrameBuffer(decHandle, fbAllocInfo, + retFbArray); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "failed to VPU_DecAllocateFrameBuffer(), ret(%d)\n", + ret); + ReleaseVideoMemory(coreIndex, retFbAddrs, totalFbCount); + return FALSE; + } + } + + if (pdeccfg->enableWTL == TRUE || linearFbCount != 0) { + size_t linearStride; + size_t picWidth; + size_t picHeight; + size_t fbHeight; + Uint32 mapType = LINEAR_FRAME_MAP; + FrameBufferFormat outFormat = pdeccfg->wtlFormat; + picWidth = seqInfo.picWidth; + picHeight = seqInfo.picHeight; + fbHeight = picHeight; + + { + linearStride = + CalcStride(picWidth, picHeight, outFormat, + pdeccfg->cbcrInterleave, + (TiledMapType)mapType, FALSE, TRUE); + } + + framebufSize = + VPU_GetFrameBufSize(coreIndex, linearStride, fbHeight, + (TiledMapType)mapType, outFormat, + pdeccfg->cbcrInterleave, pDramCfg); + + if (pvdec->eVdecVBSource == E_CVI_VB_SRC_COMMON) { + for (index = tiledFbCount; index < totalFbCount; + index++) { + pvb = &retFbAddrs[index]; + pvb->size = framebufSize; + CVI_VC_MEM( + "tiledFbCount, FB[%d], pvb.size = 0x%X\n", + index, pvb->size); + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VDEC_%d_tiledFrameBuffer", + pvdec->chnNum); + if (VDI_ALLOCATE_MEMORY(coreIndex, pvb, 0, + ionName) < 0) { + CVI_VC_ERR( + "fail to allocate frame buffer\n"); + ReleaseVideoMemory(coreIndex, + retFbAddrs, + totalFbCount); + return FALSE; + } + retFbArray[index].bufY = pvb->phys_addr; + retFbArray[index].bufCb = -1; + retFbArray[index].bufCr = -1; + retFbArray[index].updateFbInfo = TRUE; + retFbArray[index].size = framebufSize; + } + } + + fbAllocInfo.nv21 = pdeccfg->nv21; + fbAllocInfo.format = outFormat; + fbAllocInfo.num = linearFbCount; + fbAllocInfo.mapType = (TiledMapType)mapType; + fbAllocInfo.stride = linearStride; + fbAllocInfo.height = fbHeight; + ret = VPU_DecAllocateFrameBuffer(decHandle, fbAllocInfo, + &retFbArray[tiledFbCount]); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "failed to VPU_DecAllocateFrameBuffer() ret:%d\n", + ret); + ReleaseVideoMemory(coreIndex, retFbAddrs, totalFbCount); + return FALSE; + } + } + + return TRUE; +} + +int _cviH265_FreeFrmBuf(cviVideoDecoder *pvdec) +{ + if (pvdec->eVdecVBSource == E_CVI_VB_SRC_COMMON) { + CVI_VC_WARN("Don't support E_CVI_VB_SRC_COMMON now!!\n"); + // ReleaseVideoMemory(pdeccfg->coreIdx, pvdec->fbMem, totalFbCount); + } else { + pVdecDrvCbFunc(pvdec->chnNum, CVI_H26X_DEC_CB_FreeFB, + (void *)NULL); + } + + return CVI_INIT_SEQ_OK; +} + +static void _ReleasePreviousSequenceResources(DecHandle handle, + vpu_buffer_t *arrFbMem, + DecGetFramebufInfo *prevSeqFbInfo) +{ + Uint32 i; + Uint32 coreIndex; + + if (handle == NULL) { + return; + } + + coreIndex = VPU_HANDLE_CORE_INDEX(handle); + + if (arrFbMem != NULL) { + for (i = 0; i < MAX_REG_FRAME; i++) { + if (arrFbMem[i].size > 0) + VDI_FREE_MEMORY(coreIndex, &arrFbMem[i]); + } + } + + for (i = 0; i < MAX_REG_FRAME; i++) { + if (prevSeqFbInfo->vbFbcYTbl[i].size > 0) + VDI_FREE_MEMORY(coreIndex, + &prevSeqFbInfo->vbFbcYTbl[i]); + if (prevSeqFbInfo->vbFbcCTbl[i].size > 0) + VDI_FREE_MEMORY(coreIndex, + &prevSeqFbInfo->vbFbcCTbl[i]); + if (prevSeqFbInfo->vbMvCol[i].size > 0) + VDI_FREE_MEMORY(coreIndex, &prevSeqFbInfo->vbMvCol[i]); + } +} + +int _cviH265_Free_ReAlloc_FrmBuf(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + DecInitialInfo *pSeqInfo = &pvdec->sequenceInfo; + Uint32 index; + RetCode ret; + Uint32 *ptr; + SequenceMemInfo *p; + Uint32 framebufStride; + Int32 compressedFbCount, linearFbCount; + + for (index = 0; index < MAX_REG_FRAME; index++) { + // free allocated framebuffer + if (pvdec->fbMem[index].size > 0) { + VDI_FREE_MEMORY(pdeccfg->coreIdx, &pvdec->fbMem[index]); + } + } + + _cviH265_FreeFrmBuf(pvdec); + + ptr = (Uint32 *)Queue_Peek(pvdec->sequenceQ); + index = (*ptr) % MAX_SEQUENCE_MEM_COUNT; + p = &pvdec->seqMemInfo[index]; + _ReleasePreviousSequenceResources(pvdec->decHandle, NULL, &p->fbInfo); + osal_memset(p, 0x00, sizeof(SequenceMemInfo)); + Queue_Dequeue(pvdec->sequenceQ); + + VPU_DecGiveCommand(pvdec->decHandle, DEC_RESET_FRAMEBUF_INFO, NULL); + + // Get current(changed) sequence information. + VPU_DecGiveCommand(pvdec->decHandle, DEC_GET_SEQ_INFO, pSeqInfo); + + compressedFbCount = + pSeqInfo->minFrameBufferCount + + EXTRA_FRAME_BUFFER_NUM; /* max_dec_pic_buffering + @, @ >= 1 */ + linearFbCount = pSeqInfo->frameBufDelay + + (1 + EXTRA_FRAME_BUFFER_NUM * 2); + /* max_num_reorder_pics + @, @ >= 1, + * In most case, # of linear fbs must be greater or equal than max_num_reorder, + * but the expression of @ in the sample code is in order to make the situation + * that # of linear is greater than # of fbc. + */ + osal_memset((void *)pvdec->fbMem, 0x00, + sizeof(vpu_buffer_t) * MAX_REG_FRAME); + + if (_AllocateH265DecFrameBuffer(pvdec, pvdec->decHandle, pdeccfg, + compressedFbCount, linearFbCount, + pvdec->Frame, pvdec->fbMem, + &framebufStride) == FALSE) { + CVI_VC_ERR("[SEQ_CHANGE] AllocateDecFrameBuffer failed\n"); + return CVI_ERR_DECODE_END; + } + ret = VPU_DecRegisterFrameBufferEx(pvdec->decHandle, pvdec->Frame, + compressedFbCount, linearFbCount, + framebufStride, pSeqInfo->picHeight, + COMPRESSED_FRAME_MAP); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "[SEQ_CHANGE] VPU_DecRegisterFrameBufferEx failed Error code is 0x%x\n", + ret); + return CVI_ERR_DECODE_END; + } + + return CVI_INIT_SEQ_OK; +} + +int _cviH264_Free_ReAlloc_FrmBuf(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + CVI_DEC_STATUS decStatus; + Int32 index; + vpu_buffer_t *pvb = NULL; + + VPU_DecGiveCommand(pvdec->decHandle, DEC_FREE_FRAME_BUFFER, 0x00); + for (index = 0; index < MAX_REG_FRAME; index++) { + pvb = &pvdec->fbMem[index]; + if (pvb->size > 0) + VDI_FREE_MEMORY(pdeccfg->coreIdx, pvb); + + pvb = &pvdec->PPUFbMem[index]; + if (pvb->size > 0) + VDI_FREE_MEMORY(pdeccfg->coreIdx, pvb); + } + pvdec->seqInited = FALSE; + + decStatus = cviInitSeq(pvdec); + if (decStatus == CVI_ERR_DECODE_END) { + CVI_VC_ERR("cviInitSeq, decStatus = %d\n", decStatus); + } + + return decStatus; +} + +int _cviH265_AllocFrmBuf(cviVideoDecoder *pvdec) +{ + DecInitialInfo *pSeqInfo = &pvdec->sequenceInfo; + cviDecConfig *pdeccfg = &pvdec->decConfig; + SecAxiUse *psau = &pvdec->secAxiUse; + Uint32 framebufStride; //, framebufSize; + Int32 compressedFbCount, linearFbCount; + RetCode ret; + Uint32 val; + BOOL bRet = FALSE; + + /******************************************************************************** + * ALLOCATE FRAME BUFFER * + ********************************************************************************/ + /* Set up the secondary AXI is depending on H/W configuration. + * Note that turn off all the secondary AXI configuration + * if target ASIC has no memory only for IP, LF and BIT. + */ + psau->u.wave4.useIpEnable = + (pdeccfg->secondaryAXI & 0x01) ? TRUE : FALSE; + psau->u.wave4.useLfRowEnable = + (pdeccfg->secondaryAXI & 0x02) ? TRUE : FALSE; + psau->u.wave4.useBitEnable = + (pdeccfg->secondaryAXI & 0x04) ? TRUE : FALSE; + VPU_DecGiveCommand(pvdec->decHandle, SET_SEC_AXI, psau); + + compressedFbCount = pSeqInfo->minFrameBufferCount + + EXTRA_FRAME_BUFFER_NUM; // max_dec_pic_buffering + if (pdeccfg->enableWTL == TRUE) { + linearFbCount = compressedFbCount; + VPU_DecGiveCommand(pvdec->decHandle, DEC_SET_WTL_FRAME_FORMAT, + &pdeccfg->wtlFormat); + } else { + linearFbCount = 0; + } + + CVI_VC_INFO( + "min FB Buf Count = %d, compressedFbCount = %d, linearFbCount = %d\n", + pSeqInfo->minFrameBufferCount, compressedFbCount, + linearFbCount); + + osal_memset((void *)pvdec->fbMem, 0x00, + sizeof(vpu_buffer_t) * MAX_REG_FRAME); + + bRet = _AllocateH265DecFrameBuffer(pvdec, pvdec->decHandle, pdeccfg, + compressedFbCount, linearFbCount, + pvdec->Frame, pvdec->fbMem, + &framebufStride); + if (bRet == FALSE) { + return CVI_ERR_DEC_INIT; + } + + /******************************************************************************** + * REGISTER FRAME BUFFER * + ********************************************************************************/ + CVI_VC_FLOW("REGISTER FRAME BUFFER\n"); + ret = VPU_DecRegisterFrameBufferEx(pvdec->decHandle, pvdec->Frame, + compressedFbCount, linearFbCount, + framebufStride, pSeqInfo->picHeight, + COMPRESSED_FRAME_MAP); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "VPU_DecRegisterFrameBuffer failed Error code is 0x%x\n", + ret); + return CVI_ERR_DEC_INIT; + } + + pvdec->doDumpImage = (BOOL)(pdeccfg->compareType == YUV_COMPARE || + (strlen(pdeccfg->outputPath) > 0) || + pdeccfg->renderType == RENDER_DEVICE_FBDEV); + + val = (pdeccfg->bitFormat == STD_HEVC) ? SEQ_CHANGE_ENABLE_ALL_HEVC : + SEQ_CHANGE_ENABLE_ALL_VP9; + VPU_DecGiveCommand(pvdec->decHandle, DEC_SET_SEQ_CHANGE_MASK, + (void *)&val); + + return CVI_INIT_SEQ_OK; +} + +int _cviH264_FreeFrmBuf(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + vpu_buffer_t *pvb = NULL; + int index; + + if (pvdec->eVdecVBSource == E_CVI_VB_SRC_COMMON) { + for (index = 0; index < pvdec->fbCount; index++) { + pvb = &pvdec->fbMem[index]; + if (pvb->size > 0) + VDI_FREE_MEMORY(pdeccfg->coreIdx, pvb); + } + } else { + pVdecDrvCbFunc(pvdec->chnNum, CVI_H26X_DEC_CB_FreeFB, + (void *)NULL); + } + + return CVI_INIT_SEQ_OK; +} + +int _cviH264_AllocFrmBuf(cviVideoDecoder *pvdec) +{ + MaverickCacheConfig *pCacheCfg = &pvdec->cacheCfg; + FrameBufferAllocInfo *pFbAllocInfo = &pvdec->fbAllocInfo; + DecInitialInfo *pSeqInfo = &pvdec->sequenceInfo; + cviDecConfig *pdeccfg = &pvdec->decConfig; + SecAxiUse *psau = &pvdec->secAxiUse; + Uint32 framebufStride, framebufSize; + Int32 index = 0; + FrameBuffer *pfb; + vpu_buffer_t *pvb = NULL; + RetCode ret; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + /******************************************************************************** + * ALLOCATE RECON FRAMEBUFFERS * + ********************************************************************************/ + pvdec->framebufHeight = VPU_ALIGN32(pSeqInfo->picHeight); + framebufStride = CalcStride(pSeqInfo->picWidth, pSeqInfo->picHeight, + FORMAT_420, pdeccfg->cbcrInterleave, + pdeccfg->mapType, FALSE, TRUE); + framebufSize = + VPU_GetFrameBufSize(pdeccfg->coreIdx, framebufStride, + pvdec->framebufHeight, pdeccfg->mapType, + FORMAT_420, pdeccfg->cbcrInterleave, NULL); + pvdec->fbCount = pSeqInfo->minFrameBufferCount + EXTRA_FRAME_BUFFER_NUM; + + if (pvdec->fbCount > MAX_REG_FRAME) { + CVI_VC_ERR("pvdec->fbCount > MAX_REG_FRAME\n"); + return CVI_ERR_DECODE_END; + } + + pFbAllocInfo->format = FORMAT_420; + pFbAllocInfo->cbcrInterleave = pdeccfg->cbcrInterleave; + pFbAllocInfo->mapType = pdeccfg->mapType; + pFbAllocInfo->stride = framebufStride; + pFbAllocInfo->height = pvdec->framebufHeight; + pFbAllocInfo->lumaBitDepth = pSeqInfo->lumaBitdepth; + pFbAllocInfo->chromaBitDepth = pSeqInfo->chromaBitdepth; + pFbAllocInfo->num = pvdec->fbCount; + pFbAllocInfo->endian = pdeccfg->frameEndian; + pFbAllocInfo->type = FB_TYPE_CODEC; + + if (pvdec->eVdecVBSource == E_CVI_VB_SRC_COMMON) { + for (index = 0; index < pvdec->fbCount; index++) { + pvb = &pvdec->fbMem[index]; + pvb->size = framebufSize; + CVI_VC_MEM("FB[%d], pvb.size = 0x%X\n", index, + pvb->size); + sprintf(ionName, "VDEC_%d_FrameBuffer", pvdec->chnNum); + if (VDI_ALLOCATE_MEMORY(pdeccfg->coreIdx, pvb, 0, + ionName) < 0) { + CVI_VC_ERR("fail to allocate frame buffer\n"); + return CVI_ERR_DECODE_END; + } + pfb = &pvdec->Frame[index]; + pfb->bufY = pvb->phys_addr; + pfb->bufCb = -1; + pfb->bufCr = -1; + pfb->updateFbInfo = TRUE; + } + } else { + stCviCb_HostAllocFB hostAllocFb; + Int32 result; + + hostAllocFb.iFrmBufNum = pvdec->fbCount; + hostAllocFb.iFrmBufSize = framebufSize; + result = pVdecDrvCbFunc(pvdec->chnNum, CVI_H26X_DEC_CB_AllocFB, + (void *)&hostAllocFb); + + if (result == 0) { + CVI_VC_ERR("fail to allocate frame buffer\n"); + return CVI_ERR_DECODE_END; + } + } + + ret = VPU_DecAllocateFrameBuffer(pvdec->decHandle, pvdec->fbAllocInfo, + pvdec->Frame); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "%s:%d failed to VPU_DecAllocateFrameBuffer(), ret(%d)\n", + __func__, __LINE__, ret); + return CVI_ERR_DECODE_END; + } + /******************************************************************************** + * ALLOCATE WTL FRAMEBUFFERS * + ********************************************************************************/ + if (pdeccfg->enableWTL == TRUE) { + TiledMapType linearMapType = pdeccfg->wtlMode == FF_FRAME ? + LINEAR_FRAME_MAP : + LINEAR_FIELD_MAP; + Uint32 strideWtl; + + strideWtl = CalcStride(pSeqInfo->picWidth, pSeqInfo->picHeight, + FORMAT_420, pdeccfg->cbcrInterleave, + linearMapType, FALSE, TRUE); + framebufSize = + VPU_GetFrameBufSize(pdeccfg->coreIdx, strideWtl, + pvdec->framebufHeight, + linearMapType, FORMAT_420, + pdeccfg->cbcrInterleave, NULL); + + for (index = pvdec->fbCount; index < pvdec->fbCount * 2; + index++) { + pvb = &pvdec->fbMem[index]; + pvb->size = framebufSize; + CVI_VC_MEM("wtlEnable = 1, FB[%d], pvb.size = 0x%X\n", + index, pvb->size); + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VDEC_%d_FrameBuffer", pvdec->chnNum); + if (VDI_ALLOCATE_MEMORY(pdeccfg->coreIdx, pvb, 0, + ionName) < 0) { + VLOG(ERR, + "%s:%d fail to allocate frame buffer\n", + __func__, __LINE__); + return CVI_ERR_DECODE_END; + } + pfb = &pvdec->Frame[index]; + pfb->bufY = pvb->phys_addr; + pfb->bufCb = -1; + pfb->bufCr = -1; + pfb->updateFbInfo = TRUE; + } + pFbAllocInfo->mapType = linearMapType; + pFbAllocInfo->cbcrInterleave = pdeccfg->cbcrInterleave; + pFbAllocInfo->nv21 = pdeccfg->nv21; + pFbAllocInfo->format = FORMAT_420; + pFbAllocInfo->stride = strideWtl; + pFbAllocInfo->height = pvdec->framebufHeight; + pFbAllocInfo->endian = pdeccfg->frameEndian; + pFbAllocInfo->lumaBitDepth = 8; + pFbAllocInfo->chromaBitDepth = 8; + pFbAllocInfo->num = pvdec->fbCount; + pFbAllocInfo->type = FB_TYPE_CODEC; + ret = VPU_DecAllocateFrameBuffer(pvdec->decHandle, + pvdec->fbAllocInfo, + &pvdec->Frame[pvdec->fbCount]); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "%s:%d failed to VPU_DecAllocateFrameBuffer() ret:%d\n", + __func__, __LINE__, ret); + return CVI_ERR_DECODE_END; + } + } + + /******************************************************************************** + * SET_FRAMEBUF * + ********************************************************************************/ + psau->u.coda9.useBitEnable = (pdeccfg->secondaryAXI >> 0) & 0x01; + psau->u.coda9.useIpEnable = (pdeccfg->secondaryAXI >> 1) & 0x01; + psau->u.coda9.useDbkYEnable = (pdeccfg->secondaryAXI >> 2) & 0x01; + psau->u.coda9.useDbkCEnable = (pdeccfg->secondaryAXI >> 3) & 0x01; + psau->u.coda9.useOvlEnable = (pdeccfg->secondaryAXI >> 4) & 0x01; + psau->u.coda9.useBtpEnable = (pdeccfg->secondaryAXI >> 5) & 0x01; + VPU_DecGiveCommand(pvdec->decHandle, SET_SEC_AXI, psau); + + MaverickCache2Config(pCacheCfg, TRUE /*Decoder*/, + pdeccfg->cbcrInterleave, + pdeccfg->coda9.frameCacheBypass, + pdeccfg->coda9.frameCacheBurst, + pdeccfg->coda9.frameCacheMerge, pdeccfg->mapType, + pdeccfg->coda9.frameCacheWayShape); + VPU_DecGiveCommand(pvdec->decHandle, SET_CACHE_CONFIG, pCacheCfg); + + framebufStride = + CalcStride(pSeqInfo->picWidth, pSeqInfo->picHeight, FORMAT_420, + pdeccfg->cbcrInterleave, + pdeccfg->enableWTL == TRUE ? LINEAR_FRAME_MAP : + pdeccfg->mapType, + FALSE, TRUE); + ret = VPU_DecRegisterFrameBuffer(pvdec->decHandle, pvdec->Frame, + pvdec->fbCount, framebufStride, + pvdec->framebufHeight, + (int)pdeccfg->mapType); + if (ret != RETCODE_SUCCESS) { +#ifdef REDUNDENT_CODE + if (ret == RETCODE_MEMORY_ACCESS_VIOLATION) + PrintMemoryAccessViolationReason(pdeccfg->coreIdx, + NULL); +#endif + VLOG(ERR, + "VPU_DecRegisterFrameBuffer failed Error code is 0x%x\n", + ret); + return CVI_ERR_DECODE_END; + } + /******************************************************************************** + * ALLOCATE PPU FRAMEBUFFERS (When rotator, mirror or tiled2linear are + *enabled) * NOTE: VPU_DecAllocateFrameBuffer() WITH PPU FRAMEBUFFER + *SHOULD BE CALLED * AFTER VPU_DecRegisterFrameBuffer(). * + ********************************************************************************/ + pvdec->enablePPU = + (BOOL)(pdeccfg->coda9.rotate > 0 || pdeccfg->coda9.mirror > 0 || + pdeccfg->coda9.enableTiled2Linear == TRUE || + pdeccfg->coda9.enableDering == TRUE); + if (pvdec->enablePPU == TRUE) { + Uint32 stridePpu; + Uint32 sizePPUFb; + Uint32 rotate = pdeccfg->coda9.rotate; + Uint32 rotateWidth = pSeqInfo->picWidth; + Uint32 rotateHeight = pSeqInfo->picHeight; + + if (rotate == 90 || rotate == 270) { + rotateWidth = pSeqInfo->picHeight; + rotateHeight = pSeqInfo->picWidth; + } + rotateWidth = VPU_ALIGN32(rotateWidth); + rotateHeight = VPU_ALIGN32(rotateHeight); + + stridePpu = CalcStride(rotateWidth, rotateHeight, FORMAT_420, + pdeccfg->cbcrInterleave, + LINEAR_FRAME_MAP, FALSE, TRUE); + sizePPUFb = VPU_GetFrameBufSize(pdeccfg->coreIdx, stridePpu, + rotateHeight, LINEAR_FRAME_MAP, + FORMAT_420, + pdeccfg->cbcrInterleave, NULL); + + for (index = 0; index < pvdec->ppuFbCount; index++) { + pvb = &pvdec->PPUFbMem[index]; + pvb->size = sizePPUFb; + CVI_VC_MEM("PPU, FB[%d], pvb.size = 0x%X\n", index, + pvb->size); + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VDEC_%d_PPUFb", pvdec->chnNum); + if (VDI_ALLOCATE_MEMORY(pdeccfg->coreIdx, pvb, 0, + ionName) < 0) { + VLOG(ERR, + "%s:%d fail to allocate frame buffer\n", + __func__, __LINE__); + return CVI_ERR_DECODE_END; + } + pfb = &pvdec->PPUFrame[index]; + pfb->bufY = pvb->phys_addr; + pfb->bufCb = -1; + pfb->bufCr = -1; + pfb->updateFbInfo = TRUE; + } + + pFbAllocInfo->mapType = LINEAR_FRAME_MAP; + pFbAllocInfo->cbcrInterleave = pdeccfg->cbcrInterleave; + pFbAllocInfo->nv21 = pdeccfg->nv21; + pFbAllocInfo->format = FORMAT_420; + pFbAllocInfo->stride = stridePpu; + pFbAllocInfo->height = rotateHeight; + pFbAllocInfo->endian = pdeccfg->frameEndian; + pFbAllocInfo->lumaBitDepth = 8; + pFbAllocInfo->chromaBitDepth = 8; + pFbAllocInfo->num = pvdec->ppuFbCount; + pFbAllocInfo->type = FB_TYPE_PPU; + + ret = VPU_DecAllocateFrameBuffer( + pvdec->decHandle, pvdec->fbAllocInfo, pvdec->PPUFrame); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "%s:%d failed to VPU_DecAllocateFrameBuffer() ret:%d\n", + __func__, __LINE__, ret); + return CVI_ERR_DECODE_END; + } + // Note: Please keep the below call sequence. + VPU_DecGiveCommand(pvdec->decHandle, SET_ROTATION_ANGLE, + (void *)&pdeccfg->coda9.rotate); + VPU_DecGiveCommand(pvdec->decHandle, SET_MIRROR_DIRECTION, + (void *)&pdeccfg->coda9.mirror); + VPU_DecGiveCommand(pvdec->decHandle, SET_ROTATOR_STRIDE, + (void *)&stridePpu); + + pvdec->ppuQ = Queue_Create(MAX_REG_FRAME, sizeof(FrameBuffer)); + if (pvdec->ppuQ == NULL) { + CVI_VC_ERR("ppuQ = NULL\n"); + return CVI_ERR_DECODE_END; + } + for (index = 0; index < pvdec->ppuFbCount; index++) { + Queue_Enqueue(pvdec->ppuQ, + (void *)&pvdec->PPUFrame[index]); + } + } + +#ifdef REDUNDENT_CODE + PrepareDecoderTest(pvdec->decHandle); +#endif + pvdec->doDumpImage = (BOOL)(pdeccfg->compareType == YUV_COMPARE || + pdeccfg->renderType == RENDER_DEVICE_FBDEV); + pvdec->waitPostProcessing = pvdec->enablePPU; + pvdec->needStream = FALSE; + pvdec->prevFbIndex = -1; + + return CVI_INIT_SEQ_OK; +} + +static int cviInitSeq(cviVideoDecoder *pvdec) +{ + DecInitialInfo *pSeqInfo = &pvdec->sequenceInfo; + cviDecConfig *pdeccfg = &pvdec->decConfig; + BOOL seqInitEscape; + RetCode ret; + + seqInitEscape = FALSE; + ret = VPU_DecSetEscSeqInit(pvdec->decHandle, seqInitEscape); + if (ret != RETCODE_SUCCESS) { + seqInitEscape = 0; + CVI_VC_INFO( + "can not to set seqInitEscape in current bitstream mode Option\n"); + } + + if (seqInitEscape) { + // if you set to seqInitEscape option to TRUE, It is more easy + // to control that APP uses VPU_DecGetInitialInfo instead of + // VPU_DecIssueSeqInit and VPU_DecCompleteSeqInit + ret = VPU_DecGetInitialInfo(pvdec->decHandle, pSeqInfo); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "VPU_DecGetInitialInfo failed Error code is 0x%x\n", + ret); + CVI_VC_ERR("Error reason is 0x%x\n", + pSeqInfo->seqInitErrReason); + return CVI_ERR_DECODE_END; + } + } else { + Int32 timeoutCount = 0; + Int32 interruptFlag = 0; + + // Scan and retrieve sequence header information from the + // bitstream buffer. + ret = VPU_DecIssueSeqInit(pvdec->decHandle); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_DecIssueSeqInit, 0x%x\n", ret); + return CVI_ERR_DECODE_END; + } + timeoutCount = 0; + while (pvdec->seqInited == FALSE) { + // wait for 10ms to save stream filling time. + interruptFlag = VPU_WaitInterrupt(pdeccfg->coreIdx, + VPU_WAIT_TIME_OUT); + if (interruptFlag == -1) { + if (timeoutCount * VPU_WAIT_TIME_OUT > + VPU_DEC_TIMEOUT) { + VLOG(ERR, + "\n VPU interrupt wait timeout\n"); + VPU_SWReset(pdeccfg->coreIdx, + SW_RESET_SAFETY, + pvdec->decHandle); + return CVI_ERR_DECODE_END; + } + timeoutCount++; + interruptFlag = 0; + } + + if (interruptFlag) { + VPU_ClearInterrupt(pdeccfg->coreIdx); + if (interruptFlag & (1 << INT_BIT_SEQ_INIT)) { + pvdec->seqInited = TRUE; + CVI_VC_BS("seqInited = TRUE\n"); + break; + } + } + + if (pdeccfg->bitstreamMode != BS_MODE_PIC_END) { + pvdec->nWritten = cviBitstreamFeeder_Act(pvdec); + if (pvdec->nWritten < 0) { + CVI_VC_ERR("nWritten < 0\n"); + return CVI_ERR_DECODE_END; + } + } + } + + ret = VPU_DecCompleteSeqInit(pvdec->decHandle, pSeqInfo); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("SEQ_INIT(ERROR REASON: %d(0x%x)\n", + pSeqInfo->seqInitErrReason, + pSeqInfo->seqInitErrReason); + pvdec->seqInited = FALSE; + CVI_VC_ERR("seqInited = FALSE\n"); + return CVI_ERR_DECODE_END; + } + if (pvdec->seqInited == FALSE) { + CVI_VC_ERR("seqInited = FALSE\n"); + return CVI_ERR_DECODE_END; + } + } + + PrintDecSeqWarningMessages(pvdec->productId, pSeqInfo); +#ifdef REDUNDENT_CODE + if (pvdec->comparator == NULL) { + char *goldenPath = NULL; + + switch (pdeccfg->compareType) { + case NO_COMPARE: + goldenPath = NULL; + pvdec->comparator = Comparator_Create( + pdeccfg->compareType, goldenPath); + break; + + case YUV_COMPARE: + goldenPath = pdeccfg->refYuvPath; + pvdec->comparator = Comparator_Create( + pdeccfg->compareType, goldenPath, + VPU_ALIGN16(pSeqInfo->picWidth), + VPU_ALIGN16(pSeqInfo->picHeight), + pdeccfg->wtlFormat, pdeccfg->cbcrInterleave); + break; + + default: + CVI_VC_ERR("compareType = %d\n", pdeccfg->compareType); + return CVI_ERR_DECODE_END; + } + } + + if (pvdec->comparator == NULL) { + CVI_VC_ERR("comparator = NULL\n"); + return CVI_ERR_DECODE_END; + } +#endif + if (pdeccfg->bitFormat == STD_AVC) { + ret = _cviH264_FreeFrmBuf(pvdec); + } else { + ret = _cviH265_FreeFrmBuf(pvdec); + } + + if ((int)ret != CVI_INIT_SEQ_OK) { + CVI_VC_ERR("Alloc VDEC Frame Buffer Fail!\n"); + return CVI_ERR_DECODE_END; + } + + if (pdeccfg->bitFormat == STD_AVC) + ret = _cviH264_AllocFrmBuf(pvdec); + else + ret = _cviH265_AllocFrmBuf(pvdec); + + if ((int)ret != CVI_INIT_SEQ_OK) { + CVI_VC_ERR("Alloc VDEC Frame Buffer Fail!\n"); + return CVI_ERR_DECODE_END; + } + + DisplayDecodedInformation(pvdec->decHandle, (CodStd)pdeccfg->bitFormat, + 0, NULL); + + return CVI_INIT_SEQ_OK; +} + +int _cviH265_DecodeOneFrame(cviVideoDecoder *pvdec) +{ + /******************************************************************************** + * DEC_PIC * + ********************************************************************************/ + + cviDecConfig *pdeccfg = &pvdec->decConfig; + RetCode ret; +#ifdef VC_DRIVER_TEST + DecInitialInfo *pSeqInfo = &pvdec->sequenceInfo; + DecOutputInfo *pDisplayInfo; + Uint32 index; + if (pvdec->cviApiMode == API_MODE_DRIVER) { + pDisplayInfo = (DecOutputInfo *)SimpleRenderer_GetFreeFrameInfo( + pvdec->renderer); + + if (pDisplayInfo != NULL) { + Uint32 *ptr; + + ptr = (Uint32 *)Queue_Peek(pvdec->sequenceQ); + if (ptr && *ptr != pDisplayInfo->sequenceNo) { + /* Release all framebuffers of previous sequence */ + SequenceMemInfo *p; + index = (*ptr) % MAX_SEQUENCE_MEM_COUNT; + p = &pvdec->seqMemInfo[index]; + _ReleasePreviousSequenceResources( + pvdec->decHandle, p->allocFbMem, + &p->fbInfo); + osal_memset(p, 0x00, sizeof(SequenceMemInfo)); + Queue_Dequeue(pvdec->sequenceQ); + } + if (pDisplayInfo->sequenceNo == pSeqInfo->sequenceNo) { + VPU_DecClrDispFlag( + pvdec->decHandle, + pDisplayInfo->indexFrameDisplay); + } + } + } +#endif + if ((pvdec->cviApiMode == API_MODE_SDK) && + (pvdec->waitFrmBufFree == TRUE)) { + Int32 count; + + count = pVdecDrvCbFunc(pvdec->chnNum, + CVI_H26X_DEC_CB_GET_DISPQ_COUNT, NULL); + + if (count == 0) { + pvdec->waitFrmBufFree = FALSE; + + CVI_VC_TRACE("Seq Chnge: Free Buffer. Realloc Buffer\n"); + // Free Buffer. Realloc Buffer + if (_cviH265_Free_ReAlloc_FrmBuf(pvdec) != CVI_INIT_SEQ_OK) { + return CVI_ERR_DECODE_END; + } + } else { + return CVI_DECODE_NO_FB; + } + } + + if (pvdec->needStream == TRUE) { + pvdec->bsQueueIndex = + (pvdec->bsQueueIndex + 1) % (pvdec->bsBufferCount); + VPU_DecSetRdPtr(pvdec->decHandle, + pvdec->vbStream[pvdec->bsQueueIndex].phys_addr, + TRUE); + pvdec->nWritten = cviBitstreamFeeder_Act(pvdec); + + if (pvdec->nWritten < 0) { + CVI_VC_ERR("nWritten = %d\n", pvdec->nWritten); + return CVI_ERR_DECODE_END; + } + } + + pvdec->decParam.skipframeMode = pdeccfg->skipMode; + if (pvdec->decParam.skipframeMode == 1) { + SimpleRenderer_Flush(pvdec->renderer); + } + + if (pvdec->bStreamOfEnd == TRUE) { + // Now that we are done with decoding, close the open instance. + VPU_DecUpdateBitstreamBuffer(pvdec->decHandle, STREAM_END_SIZE); + } + + // Start decoding a frame. + pvdec->decParam.craAsBlaFlag = pdeccfg->wave4.craAsBla; + ret = VPU_DecStartOneFrame(pvdec->decHandle, &pvdec->decParam); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_DecStartOneFrame failed Error code is 0x%x\n", + ret); + return CVI_ERR_DECODE_END; + } + + return CVI_DECODE_ONE_FRAME_OK; +} + +int _cviH264_DecodeOneFrame(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + DecParam *pdp = &pvdec->decParam; + RetCode ret; + int status; +#ifdef VC_DRIVER_TEST + DecOutputInfo *pDisplayInfo; + + if (pvdec->cviApiMode == API_MODE_DRIVER) { + do { + pDisplayInfo = (DecOutputInfo *) + SimpleRenderer_GetFreeFrameInfo( + pvdec->renderer); + if (!pDisplayInfo) + break; + + if (pvdec->enablePPU == TRUE) { + Queue_Enqueue(pvdec->ppuQ, + (void *)&pDisplayInfo->dispFrame); + } else { + CVI_VC_DISP("myIndex = %d\n", + pDisplayInfo->dispFrame.myIndex); + VPU_DecClrDispFlag( + pvdec->decHandle, + pDisplayInfo->dispFrame.myIndex); + } + } while (1); + } +#endif + if (pvdec->needStream == TRUE) { + VPU_DecSetRdPtr(pvdec->decHandle, pvdec->vbStream[0].phys_addr, + TRUE); + + if (pvdec->assertedFieldDoneInt == FALSE) { + pvdec->nWritten = cviBitstreamFeeder_Act(pvdec); + } else { + pvdec->nWritten = cviBitstreamFeeder_Act(pvdec); + } + + if (pvdec->nWritten < 0) { + CVI_VC_ERR("nWritten = %d\n", pvdec->nWritten); + status = CVI_ERR_DECODE_END; + goto ERR_CVI_H264_DECODE_ONE_FRAME; + } + + pvdec->needStream = FALSE; + } + + if ((pvdec->cviApiMode == API_MODE_SDK) && + (pvdec->waitFrmBufFree == TRUE)) { + Int32 count; + + count = pVdecDrvCbFunc(pvdec->chnNum, + CVI_H26X_DEC_CB_GET_DISPQ_COUNT, NULL); + if (count == 0) { + pvdec->waitFrmBufFree = FALSE; + + CVI_VC_TRACE("Seq Chnge: Free Buffer. Realloc Buffer\n"); + // Release all memory related to framebuffer. + if (_cviH264_Free_ReAlloc_FrmBuf(pvdec) == CVI_ERR_DECODE_END) { + return CVI_ERR_DECODE_END; + } + } else { + pvdec->needStream = TRUE; + return CVI_DECODE_NO_FB; + } + } + + if (pvdec->assertedFieldDoneInt == TRUE) { + VPU_ClearInterrupt(pdeccfg->coreIdx); + pvdec->assertedFieldDoneInt = FALSE; + } else { + // When the field done interrupt is asserted, just fill + // elementary stream into the bitstream buffer. + if (pvdec->enablePPU == TRUE) { + pvdec->ppuFb = + (FrameBuffer *)Queue_Dequeue(pvdec->ppuQ); + if (pvdec->ppuFb == NULL) { + MSleep(0); + pvdec->needStream = FALSE; + status = CVI_DECODE_CONTINUE; + goto ERR_CVI_H264_DECODE_ONE_FRAME; + } + VPU_DecGiveCommand(pvdec->decHandle, SET_ROTATOR_OUTPUT, + (void *)pvdec->ppuFb); + if (pdeccfg->coda9.rotate > 0) { + VPU_DecGiveCommand(pvdec->decHandle, + ENABLE_ROTATION, NULL); + } + if (pdeccfg->coda9.mirror > 0) { + VPU_DecGiveCommand(pvdec->decHandle, + ENABLE_MIRRORING, NULL); + } + if (pdeccfg->coda9.enableDering == TRUE) { + VPU_DecGiveCommand(pvdec->decHandle, + ENABLE_DERING, NULL); + } + } + + VPU_DecGiveCommand(pvdec->decHandle, DEC_SET_TARGET_TEMPORAL_ID, + (void *)&pdeccfg->tid); + + if (pvdec->bStreamOfEnd == TRUE) { + // Now that we are done with decoding, close the open instance. + VPU_DecUpdateBitstreamBuffer(pvdec->decHandle, + STREAM_END_SIZE); + } + + // Start decoding a frame. + ret = VPU_DecStartOneFrame(pvdec->decHandle, pdp); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "VPU_DecStartOneFrame failed Error code is 0x%x\n", + ret); + status = CVI_ERR_DECODE_END; + goto ERR_CVI_H264_DECODE_ONE_FRAME; + } + } + + return CVI_DECODE_ONE_FRAME_OK; + +ERR_CVI_H264_DECODE_ONE_FRAME: + return status; +} + +int cviDecodeOneFrame(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + int ret = CVI_DECODE_ONE_FRAME_OK; + + if (pdeccfg->bitFormat == STD_AVC) + ret = _cviH264_DecodeOneFrame(pvdec); + else + ret = _cviH265_DecodeOneFrame(pvdec); + + return ret; +} + +int _cviH265_WaitInterrupt(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + BOOL repeat; + Int32 timeoutCount; + Int32 interruptFlag; + + timeoutCount = 0; + repeat = TRUE; + while (repeat == TRUE) { + interruptFlag = + VPU_WaitInterrupt(pdeccfg->coreIdx, VPU_WAIT_TIME_OUT); + if (interruptFlag == -1) { + // wait for 10ms to save stream filling time. + if (timeoutCount * VPU_WAIT_TIME_OUT > + VPU_DEC_TIMEOUT) { +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(pdeccfg->coreIdx, + pvdec->productId); +#endif + CVI_VC_WARN( + "\n VPU interrupt wait timeout instIdx=%d\n", + pdeccfg->instIdx); + VPU_SWReset(pdeccfg->coreIdx, SW_RESET_SAFETY, + pvdec->decHandle); + return CVI_ERR_DECODE_END; + } + timeoutCount++; + interruptFlag = 0; + } + + if (interruptFlag > 0) { + VPU_ClearInterrupt(pdeccfg->coreIdx); + } + + if (interruptFlag & (1 << INT_WAVE_DEC_PIC)) { + repeat = FALSE; + CVI_VC_TRACE("DEC_PIC\n"); + } + + if (interruptFlag & (1 << INT_WAVE_BIT_BUF_EMPTY)) { + /* TODO: handling empty interrupt */ + Uint32 avail; + VPU_DecGetBitstreamBuffer(pvdec->decHandle, NULL, NULL, + &avail); + if (avail < FEEDING_SIZE) { + VPU_DecUpdateBitstreamBuffer( + pvdec->decHandle, + 0); // Set end-of-stream + VLOG(ERR, "Not enough bitstream buffer\n"); + break; + } + } + + if (repeat == FALSE) + break; + + // In PICEND mode, the below codes are not called. + if (pdeccfg->bitstreamMode == BS_MODE_INTERRUPT && + pvdec->seqChangeRequest == FALSE) { + if (pvdec->cviApiMode == API_MODE_SDK) { + PhysicalAddress rdPtr, wrPtr; + Uint32 room; + + CVI_VC_BS("SDK, BS_MODE_INTERRUPT\n"); + VPU_DecGetBitstreamBuffer(pvdec->decHandle, + &rdPtr, &wrPtr, + &room); + CVI_VC_BS( + "rdPtr = 0x%llX, wrPtr = 0x%llX, room = 0x%X\n", + rdPtr, wrPtr, room); + } +#ifdef VC_DRIVER_TEST + else { + pvdec->nWritten = BitstreamFeeder_Act( + pvdec->decHandle, pvdec->feeder, + pdeccfg->streamEndian, NULL); + if (pvdec->nWritten < 0) { + return CVI_ERR_DECODE_END; + } + } +#endif + } + } + + return CVI_WAIT_INT_OK; +} + +int _cviH264_WaitInterrupt(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; +#ifdef REDUNDENT_CODE + DecOutputInfo *pdoi = &pvdec->outputInfo; +#endif + BOOL repeat; + Int32 timeoutCount; + Int32 interruptFlag; + + timeoutCount = 0; + repeat = TRUE; + while (repeat == TRUE) { + interruptFlag = + VPU_WaitInterrupt(pdeccfg->coreIdx, VPU_WAIT_TIME_OUT); + if (interruptFlag == -1) { + // wait for 10ms to save stream filling time. + if (timeoutCount * VPU_WAIT_TIME_OUT > + VPU_DEC_TIMEOUT) { +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(pdeccfg->coreIdx, + pvdec->productId); +#endif + CVI_VC_WARN( + "\n VPU interrupt wait timeout instIdx=%d\n", + pdeccfg->instIdx); + VPU_SWReset(pdeccfg->coreIdx, SW_RESET_SAFETY, + pvdec->decHandle); + return CVI_ERR_DECODE_END; + } + timeoutCount++; + interruptFlag = 0; + } + +#ifdef REDUNDENT_CODE + CheckUserDataInterrupt(pdeccfg->coreIdx, + pdoi->indexFrameDecoded, + (CodStd)pdeccfg->bitFormat, + interruptFlag); +#endif + + if (interruptFlag & (1 << INT_BIT_PIC_RUN)) { + repeat = FALSE; + CVI_VC_TRACE("PIC_RUN\n"); + } + + if (interruptFlag & (1 << INT_BIT_DEC_FIELD)) { + if (pdeccfg->bitstreamMode == BS_MODE_PIC_END) { + // do not clear interrupt until feeding + // next field picture. + pvdec->assertedFieldDoneInt = TRUE; + break; + } + } + if (interruptFlag & (1 << INT_BIT_DEC_MB_ROWS)) { + VPU_ClearInterrupt(pdeccfg->coreIdx); + // VPU_DecGiveCommand(pvdec->decHandle, + // GET_LOW_DELAY_OUTPUT, pdoi); VLOG(INFO, + // "MB ROW interrupt is generated displayIdx=%d + // pvdec->decodedIdx=%d picType=%d decodeSuccess=%d\n", + //// pdoi->indexFrameDisplay, + ///pdoi->indexFrameDecoded, + ///pdoi->picType, + ///pdoi->decodingSuccess); + } + + if (interruptFlag > 0) + VPU_ClearInterrupt(pdeccfg->coreIdx); + + if (repeat == FALSE) + break; + + // In PICEND mode, the below codes are not called. + if (pdeccfg->bitstreamMode == BS_MODE_INTERRUPT && + pvdec->seqChangeRequest == FALSE) { + if (pvdec->cviApiMode == API_MODE_SDK) { + PhysicalAddress rdPtr, wrPtr; + Uint32 room; + ////////// + CVI_VC_BS("SDK, BS_MODE_INTERRUPT\n"); + VPU_DecGetBitstreamBuffer(pvdec->decHandle, + &rdPtr, &wrPtr, + &room); + CVI_VC_BS( + "rdPtr = 0x%llX, wrPtr = 0x%llX, room = 0x%X\n", + rdPtr, wrPtr, room); + } +#ifdef VC_DRIVER_TEST + else { + pvdec->nWritten = cviBitstreamFeeder_Act(pvdec); + if (pvdec->nWritten < 0) { + return CVI_ERR_DECODE_END; + } + } +#endif + } + } + + if (pvdec->assertedFieldDoneInt == TRUE) { + pvdec->needStream = TRUE; + return CVI_DECODE_CONTINUE; + } + + return CVI_WAIT_INT_OK; +} + +int cviWaitInterrupt(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + int ret = CVI_DECODE_ONE_FRAME_OK; + + if (pdeccfg->bitFormat == STD_AVC) + ret = _cviH264_WaitInterrupt(pvdec); + else + ret = _cviH265_WaitInterrupt(pvdec); + + return ret; +} +#ifdef VC_DRIVER_TEST +static void _cviH265FreeAllocatedFrmBuffer(cviVideoDecoder *pvdec, + DecOutputInfo *pDecOutInfo, Uint32 curSeqNo, Uint32 retNum) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + DecOutputInfo *pdoi = &pvdec->outputInfo; + Uint32 index, dispFlag; + Int32 fbIndex; + BOOL remainingFbs[MAX_REG_FRAME]; + + osal_memset((void *)remainingFbs, 0x00, + sizeof(remainingFbs)); + + // Free allocated framebuffers except ones to be displayed. + for (index = 0; index < retNum; index++) { + fbIndex = pDecOutInfo[index] + .indexFrameDisplay; + if (fbIndex >= 0) { + VLOG(INFO, + "PUSH SEQ[%02d] LINEAR(%02d) COMPRESSED(%02d)\n", + curSeqNo, + pDecOutInfo[index] + .indexFrameDisplay, + pDecOutInfo[index] + .indexFrameDisplayForTiled); + + Queue_Enqueue( + pvdec->displayQ, + (void *)&pDecOutInfo + [index]); + if (pdeccfg->enableWTL == + TRUE) { + fbIndex = VPU_CONVERT_WTL_INDEX( + pvdec->decHandle, + fbIndex); + remainingFbs[fbIndex] = + TRUE; + } else { + fbIndex = + pDecOutInfo[index] + .indexFrameDisplayForTiled; + remainingFbs[fbIndex] = + TRUE; + } + } + } + + /* Check Not displayed framebuffers */ + dispFlag = pdoi->frameDisplayFlag; + for (index = 0; index < MAX_GDI_IDX; index++) { + fbIndex = index; + if ((dispFlag >> index) & 0x01) { + if (pdeccfg->enableWTL == + TRUE) { + fbIndex = VPU_CONVERT_WTL_INDEX( + pvdec->decHandle, + fbIndex); + } + remainingFbs[fbIndex] = TRUE; + } + } + + for (index = 0; index < MAX_REG_FRAME; + index++) { + if (remainingFbs[index] == FALSE) { + // free allocated framebuffer + if (pvdec->fbMem[index].size > + 0) { + VDI_FREE_MEMORY( + pdeccfg->coreIdx, + &pvdec->fbMem + [index]); + } + } + } +} +#endif +int _cviH265_GetDecodedData(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + DecOutputInfo *pdoi = &pvdec->outputInfo; + DecOutputInfo *pDisplayInfo = NULL; + RetCode ret; + Int32 repeat; + + ret = VPU_DecGetOutputInfo(pvdec->decHandle, pdoi); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "VPU_DecGetOutputInfo failed Error code is 0x%x , instIdx=%d\n", + ret, pdeccfg->instIdx); + if (ret == RETCODE_MEMORY_ACCESS_VIOLATION) { +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(pdeccfg->coreIdx, pvdec->productId); +#endif +#ifdef REDUNDENT_CODE + PrintMemoryAccessViolationReason(pdeccfg->coreIdx, + pdoi); +#endif + return CVI_DECODE_BREAK; + } + + return CVI_DECODE_CONTINUE; + } + + // To do, user data hanlding + // ------------------------------------- + + if ((pdoi->decodingSuccess & 0x01) == 0) { + if (pdoi->indexFramePrescan == -2) { + CVI_VC_WARN("Stream is insufficient to prescan\n"); + } else { + CVI_VC_ERR( + "instance(%d) VPU_DecGetOutputInfo decode fail framdIdx %d error(0x%08x) reason(0x%08x), reasonExt(0x%08x)\n", + pvdec->decHandle->instIndex, pvdec->decodedIdx, + pdoi->decodingSuccess, pdoi->errorReason, + pdoi->errorReasonExt); + if (pdoi->errorReason == + WAVE4_SYSERR_WATCHDOG_TIMEOUT) { + VPU_SWReset(pdeccfg->coreIdx, SW_RESET_SAFETY, + pvdec->decHandle); + CVI_VC_ERR("VPU_SWReset (SW_RESET_SAFETY)\n"); + } + } + } + + pvdec->sequenceChangeFlag = pdoi->sequenceChanged; + + if (pvdec->sequenceChangeFlag) { + BOOL dpbChanged, sizeChanged, bitDepthChanged; + + dpbChanged = (pvdec->sequenceChangeFlag & + SEQ_CHANGE_ENABLE_DPB_COUNT) ? + TRUE : + FALSE; + sizeChanged = + (pvdec->sequenceChangeFlag & SEQ_CHANGE_ENABLE_SIZE) ? + TRUE : + FALSE; + bitDepthChanged = (pvdec->sequenceChangeFlag & + SEQ_CHANGE_ENABLE_BITDEPTH) ? + TRUE : + FALSE; + + if (dpbChanged || sizeChanged || bitDepthChanged) { + DecOutputInfo *pDecOutInfo = + (DecOutputInfo *)osal_malloc( + sizeof(DecOutputInfo) * MAX_GDI_IDX); + Uint32 retNum; + Uint32 curSeqNo = pdoi->sequenceNo; + Uint32 seqMemIndex = curSeqNo % MAX_SEQUENCE_MEM_COUNT; + SequenceMemInfo *pSeqMem = + &pvdec->seqMemInfo[seqMemIndex]; + DecGetFramebufInfo *prevSeqFbInfo = + (DecGetFramebufInfo *)osal_malloc( + sizeof(DecGetFramebufInfo)); + + VLOG(INFO, "---> SEQUENCE CHANGED <---\n"); + if (prevSeqFbInfo == NULL) { + CVI_VC_ERR("no memory for prevSeqFbInfo\n"); + if (pDecOutInfo != NULL) { + osal_free(pDecOutInfo); + } + return CVI_ERR_ALLOC_VDEC; + } + memset(prevSeqFbInfo, 0x0, sizeof(DecGetFramebufInfo)); +#ifdef VC_DRIVER_TEST + if (pvdec->cviApiMode != API_MODE_SDK) { + Uint32 framebufStride; + Int32 compressedFbCount, linearFbCount; + BOOL remainingFbs[MAX_REG_FRAME]; + DecInitialInfo *pSeqInfo = &pvdec->sequenceInfo; + + Queue_Enqueue(pvdec->sequenceQ, + (void *)&curSeqNo); + osal_memset((void *)remainingFbs, 0x00, + sizeof(remainingFbs)); + // Get previous memory related to framebuffer + VPU_DecGiveCommand(pvdec->decHandle, + DEC_GET_FRAMEBUF_INFO, + (void *)prevSeqFbInfo); + // Get current(changed) sequence information. + VPU_DecGiveCommand(pvdec->decHandle, + DEC_GET_SEQ_INFO, pSeqInfo); + // Flush all remaining framebuffers of previous sequence. + VPU_DecFrameBufferFlush(pvdec->decHandle, + pDecOutInfo, &retNum); + + VLOG(INFO, "sequenceChanged : %x\n", + pvdec->sequenceChangeFlag); + VLOG(INFO, "SEQUENCE NO : %d\n", + pdoi->sequenceNo); + VLOG(INFO, "DPB COUNT: %d\n", + pSeqInfo->minFrameBufferCount); + VLOG(INFO, "BITDEPTH : LUMA(%d), CHROMA(%d)\n", + pSeqInfo->lumaBitdepth, + pSeqInfo->chromaBitdepth); + VLOG(INFO, + "SIZE : WIDTH(%d), HEIGHT(%d)\n", + pSeqInfo->picWidth, pSeqInfo->picHeight); + + _cviH265FreeAllocatedFrmBuffer(pvdec, + pDecOutInfo, curSeqNo, retNum); + + ret = _cviH265_FreeFrmBuf(pvdec); + + osal_memset(pSeqMem, 0x00, + sizeof(SequenceMemInfo)); + osal_memcpy(&pSeqMem->fbInfo, prevSeqFbInfo, + sizeof(DecGetFramebufInfo)); + osal_memcpy(pSeqMem->allocFbMem, pvdec->fbMem, + sizeof(pvdec->fbMem)); + + VPU_DecGiveCommand(pvdec->decHandle, + DEC_RESET_FRAMEBUF_INFO, + NULL); + + compressedFbCount = + pSeqInfo->minFrameBufferCount + + EXTRA_FRAME_BUFFER_NUM; /* max_dec_pic_buffering + @, @ >= 1 */ + linearFbCount = + pSeqInfo->frameBufDelay + + (1 + + EXTRA_FRAME_BUFFER_NUM * + 2); + /* max_num_reorder_pics + @, @ >= 1, + * In most case, # of linear fbs must be greater or equal than max_num_reorder, + * but the expression of @ in the sample code is in order to make the situation + * that # of linear is greater than # of fbc. + */ + osal_memset((void *)pvdec->fbMem, 0x00, + sizeof(vpu_buffer_t) * + MAX_REG_FRAME); + + if (_AllocateH265DecFrameBuffer( + pvdec, pvdec->decHandle, pdeccfg, + compressedFbCount, linearFbCount, + pvdec->Frame, pvdec->fbMem, + &framebufStride) == FALSE) { + if (pDecOutInfo != NULL) { + osal_free(pDecOutInfo); + } + if (prevSeqFbInfo != NULL) { + osal_free(prevSeqFbInfo); + } + + CVI_VC_ERR( + "[SEQ_CHANGE] AllocateDecFrameBuffer failed\n"); + return CVI_ERR_DECODE_END; + } + ret = VPU_DecRegisterFrameBufferEx( + pvdec->decHandle, pvdec->Frame, + compressedFbCount, linearFbCount, + framebufStride, pSeqInfo->picHeight, + COMPRESSED_FRAME_MAP); + if (ret != RETCODE_SUCCESS) { + if (pDecOutInfo != NULL) { + osal_free(pDecOutInfo); + } + if (prevSeqFbInfo != NULL) { + osal_free(prevSeqFbInfo); + } + CVI_VC_ERR( + "[SEQ_CHANGE] VPU_DecRegisterFrameBufferEx failed Error code is 0x%x\n", + ret); + return CVI_ERR_DECODE_END; + } + + VLOG(INFO, "----------------------------\n"); + + if (pDecOutInfo != NULL) { + osal_free(pDecOutInfo); + } + if (prevSeqFbInfo != NULL) { + osal_free(prevSeqFbInfo); + } + } else +#endif + { + Queue_Enqueue(pvdec->sequenceQ, + (void *)&curSeqNo); + // Get previous memory related to framebuffer + VPU_DecGiveCommand(pvdec->decHandle, + DEC_GET_FRAMEBUF_INFO, + (void *)prevSeqFbInfo); + osal_memcpy(&pSeqMem->fbInfo, prevSeqFbInfo, + sizeof(DecGetFramebufInfo)); + + // Flush all remaining framebuffers of previous sequence. + VPU_DecFrameBufferFlush(pvdec->decHandle, + pDecOutInfo, &retNum); + + if (pDecOutInfo != NULL) { + osal_free(pDecOutInfo); + } + if (prevSeqFbInfo != NULL) { + osal_free(prevSeqFbInfo); + } + pvdec->needStream = TRUE; + pvdec->waitFrmBufFree = TRUE; + + return CVI_SEQ_CHG_WAIT_BUF_FREE; + } + } + } + + if (pdoi->indexFrameDisplay != DISPLAY_IDX_FLAG_SEQ_END) { + if (pvdec->sequenceChangeFlag == 0) { + Queue_Enqueue(pvdec->displayQ, (void *)pdoi); + } + } + + repeat = TRUE; + do { + pDisplayInfo = (DecOutputInfo *)Queue_Dequeue(pvdec->displayQ); + if (pDisplayInfo == NULL) + break; + + osal_memcpy((void *)pdoi, pDisplayInfo, sizeof(DecOutputInfo)); + DisplayDecodedInformation(pvdec->decHandle, + (CodStd)pdeccfg->bitFormat, + pvdec->decodedIdx, pdoi); + if (pdoi->indexFrameDecoded < 0 && + pdoi->indexFrameDisplay == DISPLAY_IDX_FLAG_NO_FB) { + //notDecodedCount++; + continue; + } + break; + } while (repeat == TRUE); + + if (pDisplayInfo != NULL) { + if (pdoi->indexFrameDisplay >= 0) { +#ifdef REDUNDENT_CODE + Uint32 width = 0, height = 0, Bpp; + size_t frameSizeInByte = 0; +#else + Uint32 width = 0, height = 0; +#endif + Uint8 *pYuv = NULL; +#ifdef REDUNDENT_CODE + void *decodedData = NULL; + Uint32 decodedDataSize = 0; +#endif + VpuRect rcDisplay; + + rcDisplay.left = 0; + rcDisplay.top = 0; + rcDisplay.right = pdoi->dispPicWidth; + rcDisplay.bottom = pdoi->dispPicHeight; + + if (pvdec->doDumpImage == TRUE) { + if (strlen(pdeccfg->outputPath) > 0) { + } +#ifdef REDUNDENT_CODE + if (pdeccfg->compareType == YUV_COMPARE || + pdeccfg->renderType == + RENDER_DEVICE_FBDEV) { + pYuv = GetYUVFromFrameBuffer( + pvdec->decHandle, + &pdoi->dispFrame, rcDisplay, + &width, &height, &Bpp, + &frameSizeInByte); + } +#endif + } else { + width = pdoi->dispPicWidth; + height = pdoi->dispPicHeight; + } +#ifdef REDUNDENT_CODE + switch (pdeccfg->compareType) { + case NO_COMPARE: + break; + + case YUV_COMPARE: + decodedData = (void *)pYuv; + decodedDataSize = frameSizeInByte; + break; + } + + if ((Comparator_Act(pvdec->comparator, decodedData, + decodedDataSize)) != TRUE) { + CVI_VC_ERR("Comparator_Act\n"); + return CVI_ERR_DECODE_END; + } +#endif + /* + * pYuv is released at the renderer module. + * SimpleRenderer releases all framebuffer memory of the previous sequence. + */ + if (pvdec->seqChangeRequest != TRUE) { + SimpleRenderer_Act(pvdec->renderer, pdoi, pYuv, + width, height); + pvdec->dispIdx++; + } else { + VPU_DecClrDispFlag( + pvdec->decHandle, + pDisplayInfo->indexFrameDisplay); + } + } + + if (pvdec->dispIdx > 0 && + pvdec->dispIdx == (Uint32)pdeccfg->forceOutNum) { + return CVI_DECODE_BREAK; + } + + if (pdoi->indexFrameDecoded >= 0) + pvdec->decodedIdx++; + } + + if (pdeccfg->bitstreamMode == BS_MODE_PIC_END) { + pvdec->needStream = TRUE; + if (pdoi->indexFrameDecoded == DECODED_IDX_FLAG_NO_FB) { + pvdec->needStream = FALSE; + } + + if (pvdec->decHandle->codecMode == C7_HEVC_DEC) { + //if (pdoi->indexFramePrescan == -1 || pdoi->sequenceChanged != 0) { + if (pdoi->indexFramePrescan == -1 || + pvdec->seqChangeRequest != 0) { + pvdec->needStream = FALSE; + VPU_DecSetRdPtr( + pvdec->decHandle, + pvdec->vbStream[pvdec->bsQueueIndex] + .phys_addr, + FALSE); + } + } + } + + if (pdoi->indexFrameDisplay == DISPLAY_IDX_FLAG_SEQ_END) { + if (Queue_Peek(pvdec->displayQ) != NULL) { + VLOG(ERR, "Queue_Peek=%d\n", + Queue_Peek(pvdec->displayQ)); + pvdec->success = FALSE; + } + + return CVI_DISP_LAST_FRM; + } + + if ((pdoi->indexFrameDecoded == DECODED_IDX_FLAG_NO_FB) && + (pdoi->indexFrameDisplay == DISPLAY_IDX_FLAG_NO_FB)) { + return CVI_DECODE_NO_FB; + } + + return CVI_DECODE_DATA_OK; +} + +int _cviH264_GetDecodedData(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + DecOutputInfo *pdoi = &pvdec->outputInfo; + RetCode ret; +#ifdef REDUNDENT_CODE + BOOL result; +#endif +#ifdef VC_DRIVER_TEST + Int32 index; + CVI_DEC_STATUS decStatus; + vpu_buffer_t *pvb; +#endif + ret = VPU_DecGetOutputInfo(pvdec->decHandle, pdoi); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "VPU_DecGetOutputInfo failed Error code is 0x%x , instIdx=%d\n", + ret, pdeccfg->instIdx); + if (ret == RETCODE_MEMORY_ACCESS_VIOLATION) { +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(pdeccfg->coreIdx, pvdec->productId); +#endif +#ifdef REDUNDENT_CODE + PrintMemoryAccessViolationReason(pdeccfg->coreIdx, + pdoi); +#endif + } + if (pvdec->noResponseCount == 0) { + return CVI_DECODE_BREAK; + } + return CVI_DECODE_CONTINUE; + } + + if (pdoi->indexFrameDecoded == DECODED_IDX_FLAG_NO_FB && + pdoi->indexFrameDisplay == DISPLAY_IDX_FLAG_NO_FB) { + pvdec->noFbCount++; + } else { + pvdec->noFbCount = 0; + } + pvdec->noResponseCount = MAX_COUNT_NO_RESPONSE; + DisplayDecodedInformation(pvdec->decHandle, (CodStd)pdeccfg->bitFormat, + pvdec->decodedIdx, pdoi); + + if (pdoi->sequenceChanged == TRUE) { + pvdec->seqChangeRequest = TRUE; + pvdec->seqChangedRdPtr = pdoi->rdPtr; + pvdec->seqChangedWrPtr = pdoi->wrPtr; + VLOG(INFO, "seqChangeRdPtr: 0x%08x, WrPtr: 0x%08x\n", + pvdec->seqChangedRdPtr, pvdec->seqChangedWrPtr); + + ret = VPU_DecSetRdPtr(pvdec->decHandle, pvdec->seqChangedRdPtr, + TRUE); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("Failed to VPU_DecSetRdPtr(%d), ret(%d)\n", + pvdec->seqChangedRdPtr, ret); + return CVI_DECODE_BREAK; + } + pvdec->seqChangedStreamEndFlag = pdoi->streamEndFlag; + VPU_DecUpdateBitstreamBuffer(pvdec->decHandle, + 1); // let f/w to know + // stream end condition + // in bitstream buffer. + // force to know that + // bitstream buffer + // will be empty. + VPU_DecUpdateBitstreamBuffer( + pvdec->decHandle, + STREAM_END_SET_FLAG); // set to stream end + // condition to pump out a + // delayed framebuffer. + VLOG(INFO, "---> SEQUENCE CHANGED <---\n"); + } + + if (pdoi->indexFrameDecoded >= 0) + pvdec->decodedIdx++; + + if (pvdec->enablePPU == TRUE) { + if (pvdec->prevFbIndex >= 0) { + VPU_DecClrDispFlag(pvdec->decHandle, + pvdec->prevFbIndex); + } + pvdec->prevFbIndex = pdoi->indexFrameDisplay; + + if (pvdec->waitPostProcessing != TRUE) { + if (pdoi->indexFrameDisplay < 0) { + pvdec->waitPostProcessing = TRUE; + } + } else { + if (pdoi->indexFrameDisplay >= 0) { + pvdec->waitPostProcessing = FALSE; + } + pvdec->rcPpu = pdoi->rcDisplay; + /* Release framebuffer for PPU */ + Queue_Enqueue(pvdec->ppuQ, (void *)pvdec->ppuFb); + pvdec->needStream = + (pdeccfg->bitstreamMode == BS_MODE_PIC_END); + if (pdoi->chunkReuseRequired == TRUE) { + pvdec->needStream = FALSE; + } + // Not ready for ppu buffer. + return CVI_DECODE_CONTINUE; + } + } + + if (pdoi->indexFrameDisplay >= 0 || pvdec->enablePPU == TRUE) { + Uint32 width = 0, height = 0; +#ifdef REDUNDENT_CODE + void *decodedData = NULL; + Uint32 decodedDataSize = 0; +#endif +#ifndef CVI_WRITE_FRAME + Uint8 *pYuv = NULL; +#endif + VpuRect rc = pvdec->enablePPU == TRUE ? pvdec->rcPpu : + pdoi->rcDisplay; +#ifdef VC_DRIVER_TEST + if (pvdec->cviApiMode == API_MODE_DRIVER) { + if (pvdec->doDumpImage == TRUE) { + size_t frameSizeInByte; + Uint32 Bpp; +#ifdef CVI_WRITE_FRAME + if (pvdec->saveFp != NULL) { + ret = cviWriteFrame(pvdec); + CVI_VC_TRACE( + "saveFp, width = %d, height = %d\n", + width, height); + } +#else + pYuv = GetYUVFromFrameBuffer(pvdec->decHandle, + &pdoi->dispFrame, + rc, &width, + &height, &Bpp, + &frameSizeInByte); +#endif + } + } else +#endif + { + width = rc.right - rc.left; + height = rc.bottom - rc.top; + } +#ifdef REDUNDENT_CODE + switch (pdeccfg->compareType) { + case NO_COMPARE: + break; + + case YUV_COMPARE: + decodedData = (void *)pYuv; + decodedDataSize = frameSizeInByte; + break; + + } + + result = Comparator_Act(pvdec->comparator, decodedData, + decodedDataSize); + if (result == FALSE) { + CVI_VC_ERR("Comparator_Act\n"); + return CVI_ERR_DECODE_END; + } +#endif + + /* + * pYuv is released at the renderer module. + * SimpleRenderer releases all framebuffer memory of the + * previous sequence. + */ + CVI_VC_DISP("width = %d, height = %d\n", width, height); + SimpleRenderer_Act(pvdec->renderer, pdoi, pYuv, width, height); + pvdec->dispIdx++; + } + + if (pvdec->dispIdx > 0 && + pvdec->dispIdx == (Uint32)pdeccfg->forceOutNum) { + return CVI_DECODE_BREAK; + } + + if (pdoi->indexFrameDisplay == DISPLAY_IDX_FLAG_SEQ_END) { + if (pvdec->seqChangeRequest == TRUE) { + int ret; + + pvdec->seqChangeRequest = FALSE; + + if (pvdec->cviApiMode == API_MODE_SDK) { + pvdec->needStream = TRUE; + pvdec->waitFrmBufFree = TRUE; + if (pvdec->seqChangedStreamEndFlag == 1) { + VPU_DecUpdateBitstreamBuffer( + pvdec->decHandle, + STREAM_END_SET_FLAG); + } else { + VPU_DecUpdateBitstreamBuffer( + pvdec->decHandle, + STREAM_END_CLEAR_FLAG); + } + + ret = CVI_SEQ_CHG_WAIT_BUF_FREE; + } +#ifdef VC_DRIVER_TEST + else { + VPU_DecSetRdPtr(pvdec->decHandle, + pvdec->seqChangedRdPtr, TRUE); + + if (pvdec->seqChangedStreamEndFlag == 1) { + VPU_DecUpdateBitstreamBuffer( + pvdec->decHandle, + STREAM_END_SET_FLAG); + } else { + VPU_DecUpdateBitstreamBuffer( + pvdec->decHandle, + STREAM_END_CLEAR_FLAG); + } + + if (pvdec->seqChangedWrPtr >= + pvdec->seqChangedRdPtr) { + VPU_DecUpdateBitstreamBuffer( + pvdec->decHandle, + pvdec->seqChangedWrPtr - + pvdec->seqChangedRdPtr); + } else { + VPU_DecUpdateBitstreamBuffer( + pvdec->decHandle, + (pvdec->vbStream[0].phys_addr + + pvdec->vbStream[0].size) - + pvdec->seqChangedRdPtr + + (pvdec->seqChangedWrPtr - + pvdec->vbStream[0] + .phys_addr)); + } + + // Flush renderer: waiting all picture displayed. + SimpleRenderer_Flush(pvdec->renderer); + + // Release all memory related to framebuffer. + VPU_DecGiveCommand(pvdec->decHandle, + DEC_FREE_FRAME_BUFFER, 0x00); + for (index = 0; index < MAX_REG_FRAME; + index++) { + pvb = &pvdec->fbMem[index]; + if (pvb->size > 0) + VDI_FREE_MEMORY( + pdeccfg->coreIdx, pvb); + + pvb = &pvdec->PPUFbMem[index]; + if (pvb->size > 0) + VDI_FREE_MEMORY( + pdeccfg->coreIdx, pvb); + } + pvdec->seqInited = FALSE; + + decStatus = cviInitSeq(pvdec); + if (decStatus == CVI_ERR_DECODE_END) { + CVI_VC_ERR( + "cviInitSeq, decStatus = %d\n", + decStatus); + return CVI_ERR_DECODE_END; + } + + ret = CVI_SEQ_CHANGE; + } +#endif + return ret; + } + + return CVI_DISP_LAST_FRM; + } + + if (pdeccfg->bitstreamMode == BS_MODE_PIC_END) { + if (pdoi->indexFrameDecoded == DECODED_IDX_FLAG_NO_FB) { + pvdec->needStream = FALSE; + } else { + pvdec->needStream = TRUE; + } + } + + if (pdoi->chunkReuseRequired == TRUE) { + pvdec->needStream = FALSE; + } + +#ifdef REDUNDENT_CODE + SaveDecReport(pdeccfg->coreIdx, pdoi, (CodStd)pdeccfg->bitFormat); +#endif + + if (pvdec->seqChangeRequest == TRUE) { + CVI_VC_TRACE("CVI_SEQ_CHG_FLUSH\n"); + return CVI_SEQ_CHG_FLUSH; + } + + if ((pdoi->indexFrameDecoded == DECODED_IDX_FLAG_NO_FB) && + (pdoi->indexFrameDisplay == DISPLAY_IDX_FLAG_NO_FB)) { + return CVI_DECODE_NO_FB; + } + + // There is no available frame buffer for decoding the current input, + // but a previously decoded frame is ready for display. + if (pdoi->indexFrameDecoded == DECODED_IDX_FLAG_NO_FB && + pdoi->indexFrameDisplay != DISPLAY_IDX_FLAG_SEQ_END && + pdoi->indexFrameDisplay != DISPLAY_IDX_FLAG_NO_FB) { + return CVI_DECODE_NO_FB_WITH_DISP; + } + + return CVI_DECODE_DATA_OK; +} + +int cviGetDecodedData(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + int ret = CVI_DECODE_ONE_FRAME_OK; + + if (pdeccfg->bitFormat == STD_AVC) + ret = _cviH264_GetDecodedData(pvdec); + else + ret = _cviH265_GetDecodedData(pvdec); + + return ret; +} + +#ifdef CVI_WRITE_FRAME +static int cviWriteFrame(cviVideoDecoder *pvdec) +{ + DecOutputInfo *pdoi = &pvdec->outputInfo; + FrameBuffer *fb = &pdoi->dispFrame; + VpuRect rc = pvdec->enablePPU == TRUE ? pvdec->rcPpu : pdoi->rcDisplay; + int width, height; + int ret; + + width = rc.right - rc.left; + height = rc.bottom - rc.top; + + ret = cviWriteComp(pvdec, fb->bufY, width, height, fb->stride); + if (ret < 0) { + CVI_VC_ERR("cviWriteComp, Y\n"); + return CVI_ERR_WRITE_ERR; + } + + ret = cviWriteComp(pvdec, fb->bufCb, width >> 1, height >> 1, + fb->stride >> 1); + if (ret < 0) { + CVI_VC_ERR("cviWriteComp, Cb\n"); + return CVI_ERR_WRITE_ERR; + } + + ret = cviWriteComp(pvdec, fb->bufCr, width >> 1, height >> 1, + fb->stride >> 1); + if (ret < 0) { + CVI_VC_ERR("cviWriteComp, Cr\n"); + return CVI_ERR_WRITE_ERR; + } + + return 0; +} + +static int cviWriteComp(cviVideoDecoder *pvdec, PhysicalAddress buf, int width, + int height, int stride) +{ + void *addr; + int i; + + addr = vdi_get_vir_addr(VPU_HANDLE_CORE_INDEX(pvdec->decHandle), buf); + if (!addr) { + CVI_VC_ERR("vdi_get_vir_addr\n"); + return CVI_ERR_VIR_ADDR; + } + CVI_VC_DISP("width = %d, height = %d, stride = %d\n", width, height, + stride); + + for (i = 0; i < height; i++) { + fwrite(addr, width, 1, pvdec->saveFp); + addr += stride; + } + + return 0; +} +#endif + +void _cviH265_CloseDecoder(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + //DecOutputInfo *pdoi = &pvdec->outputInfo; + Uint32 index; + //vpu_buffer_t *pvb = NULL; + + // Now that we are done with decoding, close the open instance. + VPU_DecUpdateBitstreamBuffer(pvdec->decHandle, STREAM_END_SIZE); + + /* Release all previous sequence resources */ + if (pvdec->decHandle) { + for (index = 0; index < MAX_SEQUENCE_MEM_COUNT; index++) { + _ReleasePreviousSequenceResources( + pvdec->decHandle, + pvdec->seqMemInfo[index].allocFbMem, + &pvdec->seqMemInfo[index].fbInfo); + } + } + + /* Release current sequence resources */ + for (index = 0; index < MAX_REG_FRAME; index++) { + if (pvdec->fbMem[index].size > 0) + VDI_FREE_MEMORY(pdeccfg->coreIdx, &pvdec->fbMem[index]); + } + +#ifndef CVI_H26X_USE_ION_MEM + for (index = 0; index < pvdec->bsBufferCount; index++) { + VDI_FREE_MEMORY(pdeccfg->coreIdx, &pvdec->vbStream[index]); + } +#else + pvdec->vbStream[0].size *= pvdec->bsBufferCount; + VDI_FREE_MEMORY(pdeccfg->coreIdx, &pvdec->vbStream[0]); + pvdec->vbStream[0].size /= pvdec->bsBufferCount; +#endif + + VDI_FREE_MEMORY(pdeccfg->coreIdx, &pvdec->vbUserData); + + /******************************************************************************** + * DESTROY INSTANCE * + ********************************************************************************/ + VPU_DecClose(pvdec->decHandle); + if (pvdec->feeder != NULL) + BitstreamFeeder_Destroy(pvdec->feeder); + + if (pvdec->renderer != NULL) + SimpleRenderer_Destroy(pvdec->renderer); +#ifdef REDUNDENT_CODE + if (pvdec->comparator != NULL) { + Comparator_Destroy(pvdec->comparator); + osal_free(pvdec->comparator); + } +#endif + if (pvdec->displayQ != NULL) + Queue_Destroy(pvdec->displayQ); + + if (pvdec->sequenceQ != NULL) + Queue_Destroy(pvdec->sequenceQ); + + VLOG(INFO, "\nDec End. Tot Frame %d\n", pvdec->decodedIdx); +} + +void _cviH264_CloseDecoder(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; +#ifdef REDUNDENT_CODE + DecOutputInfo *pdoi = &pvdec->outputInfo; +#endif + Int32 index; + vpu_buffer_t *pvb = NULL; + +#ifdef REDUNDENT_CODE + CloseDecReport(pdeccfg->coreIdx); +#endif + // Now that we are done with decoding, close the open instance. + VPU_DecUpdateBitstreamBuffer(pvdec->decHandle, STREAM_END_SIZE); +#ifdef REDUNDENT_CODE + if (pdeccfg->compareType && + pdoi->indexFrameDisplay == DISPLAY_IDX_FLAG_SEQ_END && + pdeccfg->forceOutNum == 0) { + if (pvdec->success == TRUE) { + pvdec->success = + Comparator_CheckFrameCount(pvdec->comparator); + } + } +#endif + /******************************************************************************** + * DESTROY INSTANCE * + ********************************************************************************/ + VPU_DecClose(pvdec->decHandle); + + if (pvdec->feeder != NULL) + BitstreamFeeder_Destroy(pvdec->feeder); + if (pvdec->renderer != NULL) + SimpleRenderer_Destroy(pvdec->renderer); +#ifdef REDUNDENT_CODE + if (pvdec->comparator != NULL) { + Comparator_Destroy(pvdec->comparator); + osal_free(pvdec->comparator); + } +#endif + if (pvdec->ppuQ != NULL) + Queue_Destroy(pvdec->ppuQ); + + for (index = 0; index < MAX_REG_FRAME; index++) { + pvb = &pvdec->fbMem[index]; + if (pvb->size > 0) + VDI_FREE_MEMORY(pdeccfg->coreIdx, pvb); + pvb = &pvdec->PPUFbMem[index]; + if (pvb->size > 0) + VDI_FREE_MEMORY(pdeccfg->coreIdx, pvb); + } + VLOG(INFO, "\nDec End. Tot Frame %d\n", pvdec->decodedIdx); +} + +void cviCloseDecoder(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + + if (pdeccfg->bitFormat == STD_AVC) + _cviH264_CloseDecoder(pvdec); + else + _cviH265_CloseDecoder(pvdec); +} + +void _cviH265_DeInitDecoder(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + + VPU_DeInit(pdeccfg->coreIdx); +} + +void _cviH264_DeInitDecoder(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + vpu_buffer_t *pvbs = &pvdec->vbStream[0]; + + if (pvbs->size > 0) + VDI_FREE_MEMORY(pdeccfg->coreIdx, pvbs); + + VPU_DeInit(pdeccfg->coreIdx); +} + +void cviDeInitDecoder(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + + if (pdeccfg->bitFormat == STD_AVC) + _cviH264_DeInitDecoder(pvdec); + else + _cviH265_DeInitDecoder(pvdec); +} + +void initDefaultcDecConfig(cviVideoDecoder *pvdec) +{ + cviDecConfig *pdeccfg = &pvdec->decConfig; + + pdeccfg->enableWTL = TRUE; + if (pvdec->cviApiMode == API_MODE_DRIVER) { + pdeccfg->bitstreamMode = BS_MODE_INTERRUPT; + pdeccfg->renderType = RENDER_DEVICE_NULL; + } else { + pdeccfg->bitstreamMode = BS_MODE_PIC_END; + pdeccfg->renderType = RENDER_DEVICE_SDK; + } + + if (pdeccfg->bitFormat == STD_HEVC) { + pdeccfg->feedingMode = FEEDING_METHOD_FIXED_SIZE; + pdeccfg->streamEndian = VPU_STREAM_ENDIAN; + pdeccfg->frameEndian = VPU_FRAME_ENDIAN; + pdeccfg->cbcrInterleave = FALSE; + pdeccfg->nv21 = FALSE; + pdeccfg->bitFormat = STD_HEVC; + pdeccfg->mapType = COMPRESSED_FRAME_MAP; + pdeccfg->enableWTL = TRUE; + pdeccfg->wtlMode = FF_FRAME; + pdeccfg->wtlFormat = FORMAT_420; + pdeccfg->wave4.fbcMode = 0x0c; + if (pvdec->cviApiMode == API_MODE_DRIVER) + pdeccfg->bsSize = STREAM_BUF_SIZE_HEVC; + pdeccfg->wave4.numVCores = 1; + pdeccfg->wave4.bwOptimization = FALSE; + pdeccfg->secondaryAXI = SECONDARY_AXI_H265; + } else { + pdeccfg->streamEndian = VDI_LITTLE_ENDIAN; + pdeccfg->frameEndian = VDI_LITTLE_ENDIAN; + pdeccfg->cbcrInterleave = FALSE; + pdeccfg->nv21 = FALSE; + pdeccfg->bitFormat = STD_AVC; + pdeccfg->mapType = LINEAR_FRAME_MAP; + pdeccfg->coda9.enableBWB = VPU_ENABLE_BWB; + pdeccfg->coda9.frameCacheBypass = 0; + pdeccfg->coda9.frameCacheBurst = 0; + pdeccfg->coda9.frameCacheMerge = 3; + pdeccfg->coda9.frameCacheWayShape = 15; + pdeccfg->tid = AVC_MAX_SUB_LAYER_ID; + pdeccfg->secondaryAXI = SECONDARY_AXI_H264; + pdeccfg->reorderEnable = pvdec->ReorderEnable; + + strcpy(pdeccfg->outputPath, "decoded.yuv"); + } +} + +#ifdef VC_DRIVER_TEST +static void Help(const char *programName) +{ + CVI_PRNT( + "-------------------------------------------------------------------\n"); + CVI_PRNT("%s(API v%d.%d.%d)\n", programName, API_VERSION_MAJOR, + API_VERSION_MINOR, API_VERSION_PATCH); + CVI_PRNT("\tAll rights reserved by Chips&Media(C)\n"); + CVI_PRNT( + "-------------------------------------------------------------------\n"); + CVI_PRNT("%s [option] --input bistream\n", programName); + CVI_PRNT("-h help\n"); + CVI_PRNT("-n [num] output frame number\n"); + CVI_PRNT("-v print version information\n"); + CVI_PRNT("-c compare with golden\n"); + CVI_PRNT(" 0 : no comparison\n"); + CVI_PRNT( + " 1 : compare with golden specified --ref-yuv option\n"); + CVI_PRNT("-u Enable userdata\n"); + CVI_PRNT("--input bitstream path\n"); + CVI_PRNT("--output YUV path\n"); + CVI_PRNT("--codec The index of codec (H.264:0)\n"); + CVI_PRNT( + "--bsmode 0: INTERRUPT MODE, 1: reserved, 2: PICEND MODE\n"); + CVI_PRNT("--coreIdx core index: default 0\n"); + CVI_PRNT( + "--loop-count integer number. loop test, default 0\n"); + CVI_PRNT("--stream-endian 0~3, default 0(LE)\n"); + CVI_PRNT("--frame-endian 0~3, default 0(LE)\n"); + CVI_PRNT( + "--enable-cbcrinterleave enable cbcrInterleave(NV12), default off\n"); + CVI_PRNT("--enable-nv21 enable NV21, default off\n"); + CVI_PRNT("--secondary-axi 0~63: bit oring valuest\n"); + CVI_PRNT("--rotate 90, 180, 270\n"); + CVI_PRNT( + "--mirror 0: none, 1: vertical, 2: horizontal, 3: both\n"); + CVI_PRNT("--enable-dering MPEG-2, MPEG-4 only\n"); + CVI_PRNT("--enable-deblock MPEG-2, MPEG-4 only\n"); + CVI_PRNT( + "--maptype CODA960: 0~6, CODA980: 0~9, default 0\n"); + CVI_PRNT( + " Please refer TiledMapType in vpuapi.h\n"); + CVI_PRNT( + "--enable-tiled2linear enable tiled2linear. default off\n"); + CVI_PRNT("--enable-wtl enable WTL. default off\n"); + CVI_PRNT("--enable-mvc enable H.264 MVC, default off\n"); + CVI_PRNT( + "--low-delay mbrows enable low delay option with mbrows. H.264\n"); + CVI_PRNT("--render 0 : no rendering picture\n"); + CVI_PRNT( + " 1 : render a picture with the framebuffer device\n"); + CVI_PRNT("--ref-yuv golden yuv path\n"); + CVI_PRNT("--tid N target temporal id (0..2)\n"); +} + +//extern char *optarg; /* argument associated with option */ +static struct OptionExt options_help[] = { + { "output", 1, NULL, 0, "--output" }, + { "input", 1, NULL, 0, "--input" }, + { "codec", 1, NULL, 0, "--codec" }, + { "render", 1, NULL, 0, "--render" }, + { "maptype", 1, NULL, 0, "--maptype" }, + { "disable-wtl", 0, NULL, 0, "--disable-wtl" }, + { "coreIdx", 1, NULL, 0, "--coreIdx" }, + { "loop-count", 1, NULL, 0, "--loop-count" }, + { "enable-cbcrinterleave", 0, NULL, 0, + "--enable-cbcrinterleave" }, + { "stream-endian", 1, NULL, 0, "--stream-endian" }, + { "frame-endian", 1, NULL, 0, "--frame-endian" }, + { "enable-nv21", 0, NULL, 0, "--enable-nv21" }, + { "secondary-axi", 1, NULL, 0, "--secondary-axi" }, + { "bsmode", 1, NULL, 0, "--bsmode" }, + { "enable-tiled2linear", 0, NULL, 0, "--enable-tiled2linear" }, + { "rotate", 1, NULL, 0, "--rotate" }, + { "mirror", 1, NULL, 0, "--mirror" }, + { "enable-dering", 0, NULL, 0, "--enable-dering" }, + { "enable-deblock", 0, NULL, 0, "--enable-deblock" }, + { "mp4class", 1, NULL, 0, "--mp4class" }, + { "ref-yuv", 1, NULL, 0, "--ref-yuv" }, + { "enable-mvc", 0, NULL, 0, "--enable-mvc" }, + { "low-delay", 1, NULL, 0, "--low-delay" }, + { "tid", 1, NULL, 0, "--tid" }, + { NULL, 0, NULL, 0, NULL }, +}; + +static struct option options[MAX_GETOPT_OPTIONS]; +int parseVdecArgs(int argc, char **argv, cviDecConfig *pdeccfg) +{ + char *optString = "c:hvn:u"; + Int32 ret = 0; + Int32 i, index, val; + Int32 opt; + + for (i = 0; i < MAX_GETOPT_OPTIONS; i++) { + if (options_help[i].name == NULL) + break; + osal_memcpy(&options[i], &options_help[i], + sizeof(struct option)); + } + + while ((opt = getopt_long(argc, argv, optString, options, &index)) != + -1) { + switch (opt) { + case 'c': + pdeccfg->compareType = atoi(optarg); + if (pdeccfg->compareType < NO_COMPARE || + pdeccfg->compareType > YUV_COMPARE) { + CVI_VC_ERR("Invalid compare type(%d)\n", + pdeccfg->compareType); + Help(argv[0]); + return -1; + } + break; + case 'n': + pdeccfg->forceOutNum = atoi(optarg); + break; + case 'h': + Help(argv[0]); + return 0; + case 'u': + pdeccfg->enableUserData = TRUE; + break; + case 0: + if (strcmp(options[index].name, "output") == 0) { + memcpy(pdeccfg->outputPath, optarg, + strlen(optarg)); +#ifdef REDUNDENT_CODE + ChangePathStyle(pdeccfg->outputPath); +#endif + } else if (strcmp(options[index].name, "input") == 0) { + memcpy(pdeccfg->inputPath, optarg, + strlen(optarg)); +#ifdef REDUNDENT_CODE + ChangePathStyle(pdeccfg->inputPath); +#endif + } else if (strcmp(options[index].name, "codec") == 0) { + pdeccfg->bitFormat = atoi(optarg); + } else if (strcmp(options[index].name, "render") == 0) { + pdeccfg->renderType = + (RenderDeviceType)atoi(optarg); + if (pdeccfg->renderType < RENDER_DEVICE_NULL || + pdeccfg->renderType >= RENDER_DEVICE_MAX) { + CVI_VC_ERR( + "unknown render device type(%d)\n", + pdeccfg->renderType); + Help(argv[0]); + return -1; + } + } else if (strcmp(options[index].name, "maptype") == + 0) { + pdeccfg->mapType = (TiledMapType)atoi(optarg); + } else if (strcmp(options[index].name, "disable-wtl") == + 0) { + pdeccfg->enableWTL = FALSE; + } else if (strcmp(options[index].name, "coreIdx") == + 0) { + pdeccfg->coreIdx = atoi(optarg); + } else if (strcmp(options[index].name, "loop-count") == + 0) { + pdeccfg->loopCount = atoi(optarg); + } else if (strcmp(options[index].name, + "enable-cbcrinterleave") == 0) { + pdeccfg->cbcrInterleave = TRUE; + } else if (strcmp(options[index].name, + "stream-endian") == 0) { + pdeccfg->streamEndian = + (EndianMode)atoi(optarg); + } else if (strcmp(options[index].name, + "frame-endian") == 0) { + pdeccfg->frameEndian = (EndianMode)atoi(optarg); + } else if (strcmp(options[index].name, "enable-nv21") == + 0) { + pdeccfg->nv21 = TRUE; + pdeccfg->cbcrInterleave = TRUE; + } else if (strcmp(options[index].name, "secondary-axi") == 0) { + long long secondaryAXI = 0; + + if (kstrtoll(optarg, !strncmp("0x", optarg, 2) ? 16 : 10, + &secondaryAXI) != 0) { + pr_err("secondaryAXI input error\n"); + } + pdeccfg->secondaryAXI = secondaryAXI; + } else if (strcmp(options[index].name, "bsmode") == 0) { + pdeccfg->bitstreamMode = atoi(optarg); + } else if (strcmp(options[index].name, + "enable-tiled2linear") == 0) { + pdeccfg->coda9.enableTiled2Linear = TRUE; + pdeccfg->coda9.tiled2LinearMode = FF_FRAME; + pdeccfg->enableWTL = FALSE; + } else if (strcmp(options[index].name, "rotate") == 0) { + val = atoi(optarg); + if ((val % 90) != 0) { + CVI_VC_ERR( + "Invalid rotation value: %d\n", + val); + Help(argv[0]); + return -1; + } + pdeccfg->coda9.rotate = val; + } else if (strcmp(options[index].name, "mirror") == 0) { + val = atoi(optarg); + if (val < 0 || val > 3) { + CVI_VC_ERR( + "Invalid mirror option: %d\n", + val); + Help(argv[0]); + return -1; + } + pdeccfg->coda9.mirror = val; + } else if (strcmp(options[index].name, + "enable-dering") == 0) { + pdeccfg->coda9.enableDering = TRUE; + } else if (strcmp(options[index].name, + "enable-deblock") == 0) { + pdeccfg->coda9.enableDeblock = TRUE; + } else if (strcmp(options[index].name, "mp4class") == + 0) { + pdeccfg->coda9.mp4class = atoi(optarg); + } else if (strcmp(options[index].name, "ref-yuv") == + 0) { + memcpy(pdeccfg->refYuvPath, optarg, + strlen(optarg)); +#ifdef REDUNDENT_CODE + ChangePathStyle(pdeccfg->refYuvPath); +#endif + } else if (strcmp(options[index].name, "enable-mvc") == + 0) { + pdeccfg->coda9.enableMvc = TRUE; + } else if (strcmp(options[index].name, "low-delay") == + 0) { + pdeccfg->coda9.lowDelay.lowDelayEn = TRUE; + pdeccfg->coda9.lowDelay.numRows = atoi(optarg); + } else if (strcmp(options[index].name, "tid") == 0) { + pdeccfg->tid = (Uint32)atoi(optarg); + } + break; + case '?': + default: + CVI_VC_ERR("%s\n", optarg); + Help(argv[0]); + return -1; + } + } + + if (strlen(pdeccfg->inputPath) == 0) { + CVI_VC_ERR("No input bitstream\n"); + Help(argv[0]); + return -1; + } + + return ret; +} +#endif + +void checkDecConfig(cviDecConfig *pdeccfg) +{ + /* Check combination of parameters of decoder */ + CVI_VC_WARN("------ WRONG PARAMETER COMBINATION ------n"); + if (pdeccfg->mapType != LINEAR_FRAME_MAP) { + if (pdeccfg->enableWTL == TRUE) { + pdeccfg->enableWTL = TRUE; + pdeccfg->wtlMode = FF_FRAME; + } + } + + switch (pdeccfg->mapType) { + case LINEAR_FRAME_MAP: + case LINEAR_FIELD_MAP: + if (pdeccfg->coda9.enableTiled2Linear == TRUE || + pdeccfg->enableWTL == TRUE) { + CVI_VC_WARN( + "can't enable Tiled2Linear OR WTL where map is LINEAR_FRAME\n"); + CVI_VC_WARN("Disable WTL or Tiled2Linear\n"); + pdeccfg->coda9.enableTiled2Linear = FALSE; + pdeccfg->coda9.tiled2LinearMode = FF_NONE; + pdeccfg->enableWTL = FALSE; + pdeccfg->wtlMode = FF_NONE; + } + break; + case TILED_FRAME_MB_RASTER_MAP: + case TILED_FIELD_MB_RASTER_MAP: + if (pdeccfg->cbcrInterleave == FALSE) { + CVI_VC_WARN( + "CBCR-interleave must be enable when maptype is TILED_FRAME/FIELD_MB_RASTER_MAP.\n"); + CVI_VC_WARN("Enable cbcr-interleave\n"); + pdeccfg->cbcrInterleave = TRUE; + } + break; + default: + break; + } + + if (pdeccfg->coda9.enableTiled2Linear == TRUE) { + CVI_VC_WARN( + "In case of Tiledmap, disabled BWB for better performance.\n"); + pdeccfg->coda9.enableBWB = FALSE; + } + + if (pdeccfg->coda9.lowDelay.lowDelayEn == TRUE && + pdeccfg->bitFormat != STD_AVC) { + CVI_VC_WARN( + "The low-delay decoding option is valid when a codec is H.264\n"); + pdeccfg->coda9.lowDelay.lowDelayEn = FALSE; + pdeccfg->coda9.lowDelay.numRows = 0; + } + CVI_VC_WARN("--------------------------------\n"); + /* END OF CHECK COMBINATION */ +} + +int cviAttachFrmBuf(cviVideoDecoder *pvdec, cviBufInfo *pFrmBufArray, + int nFrmNum) +{ + int ret = 0; + int i = 0; + + CVI_VC_TRACE(" nFrmNum=%d\n", nFrmNum); + + for (i = 0; i < nFrmNum; i++) { + pvdec->Frame[i].bufY = pFrmBufArray[i].phyAddr; + pvdec->Frame[i].bufCb = -1; + pvdec->Frame[i].bufCr = -1; + pvdec->Frame[i].updateFbInfo = TRUE; + pvdec->Frame[i].size = pFrmBufArray[i].size; + + pvdec->vbFrame[i].phys_addr = pFrmBufArray[i].phyAddr; + pvdec->vbFrame[i].virt_addr = pFrmBufArray[i].virtAddr; + pvdec->vbFrame[i].size = pFrmBufArray[i].size; + + CVI_VC_TRACE("vbAddr=0x%llx, vbsize=0x%x, vbVirt=%p\n", + (Uint64)pvdec->vbFrame[i].phys_addr, + pvdec->vbFrame[i].size, + (void *)pvdec->vbFrame[i].virt_addr); + } + + pvdec->nVbFrameNum = nFrmNum; + + return ret; +} + +void cviDecAttachCallBack(CVI_VDEC_CALLBACK pCbFunc) +{ + if (pCbFunc == NULL) { + CVI_VC_ERR("pCbFunc == NULL\n"); + return; + } + + CVI_VC_TRACE("\n"); + + if (pVdecDrvCbFunc == NULL) { + pVdecDrvCbFunc = pCbFunc; + } +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_dec_internal.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_dec_internal.h new file mode 100644 index 0000000000..ce8155a086 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_dec_internal.h @@ -0,0 +1,222 @@ +/* + * Copyright Cvitek Technologies Inc. + * + * Created Time: Aug, 2020 + */ + +#ifndef __CVI_DEC_INTERNAL_H__ +#define __CVI_DEC_INTERNAL_H__ +#include "main_helper.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define PPU_FB_COUNT 2 +#define MAX_COUNT_NO_RESPONSE 3 // For integration test. +#define STREAM_BUF_SIZE 0x700000 // max bitstream size +#define EXTRA_FRAME_BUFFER_NUM 1 +#define MAX_SEQUENCE_MEM_COUNT 16 +#define HEVC_OUTPUT_FP_NUMBER 4 +#define MAX_NUM_BS_BUFFER 2 + +typedef enum _CVI_VB_SOURCE_ { + E_CVI_VB_SRC_COMMON = 0, + E_CVI_VB_SRC_MODULE = 1, + E_CVI_VB_SRC_PRIVATE = 2, + E_CVI_VB_SRC_USER = 3, + E_CVI_VB_SRC_BUTT +} E_CVI_VB_SOURCE; + +typedef enum _CVI_DEC_STATUS_ { + CVI_ERR_DECODE_END = -100, + CVI_ERR_DEC_INIT, + CVI_ERR_DEC_ARGV, + CVI_ERR_DEC_MCU, + CVI_ERR_ALLOC_VDEC, + CVI_ERR_WRITE_ERR, + CVI_ERR_VIR_ADDR, + CVI_INIT_DECODER_OK = 30, + CVI_INIT_SEQ_OK, + CVI_DECODE_ONE_FRAME_OK, + CVI_WAIT_INT_OK, + CVI_DECODE_DATA_OK, + CVI_DECODE_CONTINUE, + CVI_DECODE_BREAK, + CVI_DECODE_NO_FB, + CVI_DISP_LAST_FRM, + CVI_SEQ_CHANGE, + CVI_SEQ_CHG_FLUSH, + CVI_SEQ_CHG_WAIT_BUF_FREE, + CVI_DECODE_NO_FB_WITH_DISP, +} CVI_DEC_STATUS; + +typedef struct cviDecConfig_struct { + Uint32 magicNumber; + char outputPath[MAX_FILE_PATH]; + char inputPath[MAX_FILE_PATH]; + Int32 forceOutNum; + Int32 bitFormat; + Int32 reorder; + TiledMapType mapType; + Int32 bitstreamMode; + FeedingMethod feedingMode; + BOOL enableWTL; + FrameFlag wtlMode; + FrameBufferFormat wtlFormat; + Int32 coreIdx; + Int32 instIdx; + BOOL enableCrop; //!<< option for saving yuv + Uint32 loopCount; + BOOL cbcrInterleave; //!<< 0: None, 1: NV12, 2: NV21 + BOOL nv21; //!<< FALSE: NV12, TRUE: NV21, + //!<< This variable is valid when cbcrInterleave is TRUE + EndianMode streamEndian; + EndianMode frameEndian; + Int32 secondaryAXI; + Int32 compareType; + char md5Path[MAX_FILE_PATH]; + char fwPath[MAX_FILE_PATH]; + char refYuvPath[MAX_FILE_PATH]; + RenderDeviceType renderType; + BOOL thumbnailMode; + Int32 skipMode; + size_t bsSize; + struct { + BOOL enableMvc; //!<< H.264 MVC + BOOL enableSvc; + BOOL enableTiled2Linear; + FrameFlag tiled2LinearMode; + BOOL enableBWB; + Uint32 rotate; //!<< 0, 90, 180, 270 + Uint32 mirror; + BOOL enableDering; //!<< MPEG-2/4 + BOOL enableDeblock; //!<< MPEG-2/4 + Uint32 mp4class; //!<< MPEG_4 + Uint32 frameCacheBypass; + Uint32 frameCacheBurst; + Uint32 frameCacheMerge; + Uint32 frameCacheWayShape; + LowDelayInfo lowDelay; //!<< H.264 + } coda9; + struct { + Uint32 numVCores; //!<< This numVCores is valid on + //! +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) +#include +#endif +#include "cvi_enc_internal.h" +#include "main_enc_cvitest.h" + +#include "cvi_vc_drv.h" +#include "cvi_vcodec_lib.h" +#include "module_common.h" + + +#define ROUND_UP_N_BIT(val, bit) ((((val) + (1 << (bit)) - 1) >> (bit)) << (bit)) + +static int cviInitPageTable(stTestEncoder *pTestEnc, int comp, Uint32 startAddr); +static int cviConfigPageTable(CodecInst *pCodecInst); +static int cviFindWriteEntry(CodecInst *pCodecInst, int comp); +static int cviConfigPageTableEntry(CodecInst *pCodecInst, int comp); +static void cviPrintPageTable(CodecInst *pCodecInst); + +static int cviEncode265HeaderByType(stTestEncoder *pTestEnc, + HevcHeaderType enType) +{ + int ret = TRUE; + NAL_TYPE nal_type; + int nalIdx = 0; +#if CACHE_ENCODE_HEADER + stPack *pPack; + stStreamPack *psp = &pTestEnc->streamPack; + Uint8 *pSpsBuf = NULL; +#endif + + switch (enType) { + case CODEOPT_ENC_VPS: + nal_type = NAL_VPS; + nalIdx = 0; + CVI_VC_FLOW("VPS\n"); + break; + case CODEOPT_ENC_SPS: + nal_type = NAL_SPS; + nalIdx = 1; + CVI_VC_FLOW("SPS\n"); + break; + case CODEOPT_ENC_PPS: + nal_type = NAL_PPS; + nalIdx = 2; + CVI_VC_FLOW("PPS\n"); + break; + default: + CVI_VC_ERR("unknown H265 header type %d\n", enType); + return FALSE; + } + + do { + if (pTestEnc->encOP.ringBufferEnable == TRUE) { + VPU_EncSetWrPtr(pTestEnc->handle, + pTestEnc->encOP.bitstreamBuffer, 1); + } else { + pTestEnc->encHeaderParam.buf = + pTestEnc->encOP.bitstreamBuffer; + pTestEnc->encHeaderParam.size = + pTestEnc->encOP.bitstreamBufferSize; + } + + #if CACHE_ENCODE_HEADER + if (pTestEnc->bEncHeader == 1) { + MUTEX_LOCK(&psp->packMutex); + if (psp->totalPacks >= MAX_NUM_PACKS) { + CVI_VC_ERR("hevc cache header droped, type:%d, totalpacks:%d\n", + nal_type, psp->totalPacks); + MUTEX_UNLOCK(&psp->packMutex); + return TRUE; + } + + pPack = &psp->pack[psp->totalPacks]; + pPack->len = pTestEnc->headerBackup[nalIdx].size; + pPack->addr = pTestEnc->headerBackup[nalIdx].pBuf; + pPack->u64PhyAddr = pTestEnc->headerBackup[nalIdx].buf; + pPack->cviNalType = nal_type; + pPack->need_free = 0; + pPack->u64PTS = pTestEnc->u64Pts; + + // sps maybe realloc mem for vui info later + if (enType == CODEOPT_ENC_SPS) { + pSpsBuf = (Uint8 *)osal_kmalloc(pPack->len); + memcpy(pSpsBuf, pPack->addr, pPack->len); + pPack->addr = pSpsBuf; + pPack->u64PhyAddr = virt_to_phys(pSpsBuf); + pPack->need_free = 1; + } + + psp->totalPacks++; + MUTEX_UNLOCK(&psp->packMutex); + return TRUE; + } + #endif + + pTestEnc->encHeaderParam.headerType = enType; + ret = VPU_EncGiveCommand(pTestEnc->handle, ENC_PUT_VIDEO_HEADER, + &pTestEnc->encHeaderParam); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "VPU_EncGiveCommand(ENC_PUT_VIDEO_HEADER) for H265 header type %d failed. Error 0x%x\n", + enType, ret); + ret = FALSE; + break; + } + + if (pTestEnc->encHeaderParam.size == 0) { + CVI_VC_ERR("encHeaderParam.size=0\n"); + ret = FALSE; + break; + } + +#ifdef SUPPORT_DONT_READ_STREAM + ret = updateBitstream(&pTestEnc->vbStream[0], + pTestEnc->encHeaderParam.size); +#else + if (pTestEnc->encConfig.cviApiMode == API_MODE_SDK) { + ret = cviPutEsInPack( + pTestEnc, pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.buf + pTestEnc->encHeaderParam.size, + pTestEnc->encHeaderParam.size, nal_type); + } +#ifdef VC_DRIVER_TEST + else { + ret = BitstreamReader_Act( + pTestEnc->bsReader, + pTestEnc->encHeaderParam.buf, + pTestEnc->encOP.bitstreamBufferSize, + pTestEnc->encHeaderParam.size, + pTestEnc->comparatorBitStream); + } +#endif + +#if CACHE_ENCODE_HEADER + if (pTestEnc->bEncHeader == 0) { + pPack = &psp->pack[nalIdx]; + pTestEnc->headerBackup[nalIdx].size = pPack->len; + pTestEnc->headerBackup[nalIdx].pBuf = (Uint8 *)osal_kmalloc(pPack->len); + pTestEnc->headerBackup[nalIdx].buf = virt_to_phys(pTestEnc->headerBackup[nalIdx].pBuf); + memcpy(pTestEnc->headerBackup[nalIdx].pBuf, pPack->addr, pPack->len); + } +#endif + + CVI_VC_BS("encHeaderParam.buf = 0x%llX, size = 0x%zx\n", + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size); +#endif + } while (0); + +#if CACHE_ENCODE_HEADER + if (enType == CODEOPT_ENC_PPS) + pTestEnc->bEncHeader = 1; +#endif + + return ret; +} + +int cviCheckIdrPeriod(stTestEncoder *pTestEnc) +{ + EncOpenParam *pEncOP = &pTestEnc->encOP; + EncParam *pEncParam = &pTestEnc->encParam; + int isIframe, nthIframe; + + CVI_VC_TRACE("gopSize = %d, frameIdx = %d\n", pEncOP->gopSize, + pTestEnc->frameIdx); + + if (pTestEnc->frameIdx == 0) { + pEncParam->is_i_period = TRUE; + return TRUE; + } else if (pEncOP->gopSize == 0) { + pEncParam->is_i_period = FALSE; + return FALSE; + } + isIframe = ((pTestEnc->frameIdx % pEncOP->gopSize) == 0); + nthIframe = (pTestEnc->frameIdx / pEncOP->gopSize); + + CVI_VC_RC( + "gopSize = %d, idrInterval = %d, isIframe = %d, nthIframe = %d\n", + pEncOP->gopSize, pEncOP->idrInterval, isIframe, nthIframe); + + pEncParam->is_i_period = isIframe; + if (isIframe) { + if (pEncOP->idrInterval) { + if ((nthIframe % pEncOP->idrInterval) == 0) + return TRUE; + } else { + return FALSE; + } + } + return FALSE; +} + +static void cviBackupEncodeHeader(stTestEncoder *pTestEnc, int cacheIdx) +{ +#if CACHE_ENCODE_HEADER + stStreamPack *psp = &pTestEnc->streamPack; + int totalPaks = psp->totalPacks; + stPack *pPack = NULL; + + if (totalPaks >= 1) { + pPack = &psp->pack[totalPaks-1]; + pTestEnc->headerBackup[cacheIdx].size = pPack->len; + pTestEnc->headerBackup[cacheIdx].pBuf = (Uint8 *)osal_kmalloc(pPack->len); + pTestEnc->headerBackup[cacheIdx].buf = virt_to_phys(pTestEnc->headerBackup[cacheIdx].pBuf); + memcpy(pTestEnc->headerBackup[cacheIdx].pBuf, pPack->addr, pPack->len); + } +#endif +} + +int cviEncode264Header(stTestEncoder *pTestEnc) +{ + EncOpenParam *pEncOP = &pTestEnc->encOP; + int ret = TRUE; + int i; +#if CACHE_ENCODE_HEADER + int cacheIdx = 0; // 0: sei; 1:sps; 2:sps mvc; 3:pps; 4:pps mvc + int nalType; + stStreamPack *psp = &pTestEnc->streamPack; + stPack *pPack = NULL; + Uint8 *pSpsBuf = NULL; + + if (pTestEnc->bEncHeader == 1) { + for (cacheIdx = 0; cacheIdx < 8; ++cacheIdx) { + if (pTestEnc->headerBackup[cacheIdx].size) { + switch (cacheIdx) { + case 0: + nalType = NAL_SEI; + break; + case 1: + case 2: + nalType = NAL_SPS; + break; + case 3: + case 4: + nalType = NAL_PPS; + break; + default: + CVI_VC_ERR("unknown H264 header type %d\n", cacheIdx); + continue; + } + + MUTEX_LOCK(&psp->packMutex); + if (psp->totalPacks >= MAX_NUM_PACKS) { + CVI_VC_ERR("avc cache header droped, type:%d, totalpacks:%d\n", + nalType, psp->totalPacks); + MUTEX_UNLOCK(&psp->packMutex); + return TRUE; + } + + pPack = &psp->pack[psp->totalPacks]; + pPack->len = pTestEnc->headerBackup[cacheIdx].size; + pPack->addr = pTestEnc->headerBackup[cacheIdx].pBuf; + pPack->u64PhyAddr = pTestEnc->headerBackup[cacheIdx].buf; + pPack->cviNalType = nalType; + pPack->need_free = 0; + pPack->u64PTS = pTestEnc->u64Pts; + + // sps maybe realloc mem for vui info later + if (nalType == NAL_SPS) { + pSpsBuf = (Uint8 *)osal_kmalloc(pPack->len); + memcpy(pSpsBuf, pPack->addr, pPack->len); + pPack->addr = pSpsBuf; + pPack->u64PhyAddr = virt_to_phys(pSpsBuf); + pPack->need_free = 1; + } + + psp->totalPacks++; + MUTEX_UNLOCK(&psp->packMutex); + } + } + return TRUE; + } +#endif + + do { + pTestEnc->encHeaderParam.zeroPaddingEnable = 0; + + if (pEncOP->EncStdParam.avcParam.mvcExtension && + pEncOP->EncStdParam.avcParam.parasetRefreshEn) + break; + + if (pTestEnc->handle->CodecInfo->encInfo.max_temporal_id) { + pTestEnc->encHeaderParam.headerType = SVC_RBSP_SEI; + if (pEncOP->ringBufferEnable == FALSE) { + pTestEnc->encHeaderParam.buf = + pTestEnc->vbStream[0].phys_addr; + } + pTestEnc->encHeaderParam.size = + pTestEnc->vbStream[0].size; + + ret = VPU_EncGiveCommand( + pTestEnc->handle, ENC_PUT_VIDEO_HEADER, + &pTestEnc->encHeaderParam); + if (ret == RETCODE_SUCCESS) { + ret = TRUE; + } else { + CVI_VC_ERR( + "VPU_EncGiveCommand ( ENC_PUT_VIDEO_HEADER ) for SPS_RBSP failed Error code is 0x%x\n", + ret); + ret = FALSE; + break; + } + + if (pEncOP->ringBufferEnable == FALSE) { + if (pTestEnc->encConfig.cviApiMode == API_MODE_SDK) { + ret = cviPutEsInPack( + pTestEnc, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, + NAL_SEI); + cviBackupEncodeHeader(pTestEnc, 0); + } + #ifdef VC_DRIVER_TEST + else { + ret = BitstreamReader_Act( + pTestEnc->bsReader, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, + 0, + pTestEnc->comparatorBitStream); + } + #endif + if (ret == FALSE) { + CVI_VC_ERR("\n"); + break; + } + } + } + + CVI_VC_FLOW("SPS\n"); + pTestEnc->encHeaderParam.headerType = SPS_RBSP; + if (pEncOP->ringBufferEnable == FALSE) { + pTestEnc->encHeaderParam.buf = + pTestEnc->vbStream[0].phys_addr; + } + pTestEnc->encHeaderParam.size = pTestEnc->vbStream[0].size; + + ret = VPU_EncGiveCommand( + pTestEnc->handle, ENC_PUT_VIDEO_HEADER, + &pTestEnc->encHeaderParam); + if (ret == RETCODE_SUCCESS) { + ret = TRUE; + } else { + CVI_VC_ERR( + "VPU_EncGiveCommand ( ENC_PUT_VIDEO_HEADER ) for SPS_RBSP failed Error code is 0x%x\n", + ret); + ret = FALSE; + break; + } + + if (pEncOP->ringBufferEnable == FALSE) { + if (pTestEnc->encConfig.cviApiMode == API_MODE_SDK) { + ret = cviPutEsInPack( + pTestEnc, pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, NAL_SPS); + cviBackupEncodeHeader(pTestEnc, 1); + } + #ifdef VC_DRIVER_TEST + else { + ret = BitstreamReader_Act( + pTestEnc->bsReader, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, 0, + pTestEnc->comparatorBitStream); + } + #endif + if (ret == FALSE) { + CVI_VC_ERR("\n"); + break; + } + } + + if (pEncOP->EncStdParam.avcParam.mvcExtension == TRUE) { + if (pEncOP->ringBufferEnable == 0) + pTestEnc->encHeaderParam.buf = + pTestEnc->vbStream[0].phys_addr; + + pTestEnc->encHeaderParam.headerType = SPS_RBSP_MVC; + pTestEnc->encHeaderParam.size = + pTestEnc->vbStream[0].size; + ret = VPU_EncGiveCommand(pTestEnc->handle, + ENC_PUT_VIDEO_HEADER, + &pTestEnc->encHeaderParam); + if (ret == RETCODE_SUCCESS) { + ret = TRUE; + } else { + CVI_VC_ERR( + "VPU_EncGiveCommand ( ENC_PUT_VIDEO_HEADER ) for SPS_RBSP_MVC failed Error code is 0x%x\n", + ret); + ret = FALSE; + break; + } + if (pEncOP->ringBufferEnable == FALSE) { + if (pTestEnc->encConfig.cviApiMode == API_MODE_SDK) { + ret = cviPutEsInPack( + pTestEnc, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, + NAL_SPS); + cviBackupEncodeHeader(pTestEnc, 2); + } + #ifdef VC_DRIVER_TEST + else { + ret = BitstreamReader_Act( + pTestEnc->bsReader, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, + 0, + pTestEnc->comparatorBitStream); + } + #endif + if (ret == FALSE) { + CVI_VC_ERR("\n"); + break; + } + } + } + + CVI_VC_FLOW("PPS, ppsNum = %d\n", + pEncOP->EncStdParam.avcParam.ppsNum); + pTestEnc->encHeaderParam.headerType = PPS_RBSP; + for (i = 0; i < pEncOP->EncStdParam.avcParam.ppsNum; i++) { + if (pEncOP->ringBufferEnable == FALSE) { + pTestEnc->encHeaderParam.buf = + pTestEnc->vbStream[0].phys_addr; + pTestEnc->encHeaderParam.pBuf = + (BYTE *)pTestEnc->vbStream[0].virt_addr; + } + pTestEnc->encHeaderParam.size = + pTestEnc->vbStream[0].size; + ret = VPU_EncGiveCommand(pTestEnc->handle, + ENC_PUT_VIDEO_HEADER, + &pTestEnc->encHeaderParam); + if (ret == RETCODE_SUCCESS) { + ret = TRUE; + } else { + CVI_VC_ERR( + "VPU_EncGiveCommand ( ENC_PUT_VIDEO_HEADER ) for PPS_RBSP failed Error code is 0x%x\n", + ret); + ret = FALSE; + break; + } + if (pEncOP->ringBufferEnable == FALSE) { + if (pTestEnc->encConfig.cviApiMode == + API_MODE_SDK) { + ret = cviPutEsInPack( + pTestEnc, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, + NAL_PPS); + cviBackupEncodeHeader(pTestEnc, 3); + } + #ifdef VC_DRIVER_TEST + else { + ret = BitstreamReader_Act( + pTestEnc->bsReader, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, + 0, + pTestEnc->comparatorBitStream); + } + #endif + if (ret == FALSE) { + CVI_VC_ERR("\n"); + break; + } + } + } + + CVI_VC_TRACE("\n"); + + if (pEncOP->EncStdParam.avcParam.mvcExtension) { + pTestEnc->encHeaderParam.headerType = PPS_RBSP_MVC; + pTestEnc->encHeaderParam.size = + pTestEnc->vbStream[0].size; + ret = VPU_EncGiveCommand( + pTestEnc->handle, ENC_PUT_VIDEO_HEADER, + &pTestEnc->encHeaderParam); + if (ret == RETCODE_SUCCESS) { + ret = TRUE; + } else { + CVI_VC_ERR( + "VPU_EncGiveCommand ( ENC_PUT_VIDEO_HEADER ) for PPS_RBSP_MVC failed Error code is 0x%x\n", + ret); + ret = FALSE; + break; + } + if (pEncOP->ringBufferEnable == FALSE) { + if (pTestEnc->encConfig.cviApiMode == + API_MODE_SDK) { + ret = cviPutEsInPack( + pTestEnc, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, + NAL_PPS); + cviBackupEncodeHeader(pTestEnc, 4); + } + #ifdef VC_DRIVER_TEST + else { + ret = BitstreamReader_Act( + pTestEnc->bsReader, + pTestEnc->encHeaderParam.buf, + pTestEnc->encHeaderParam.size, + 0, + pTestEnc->comparatorBitStream); + } + #endif + if (ret == FALSE) { + CVI_VC_ERR("\n"); + break; + } + } + } + + CVI_VC_TRACE("\n"); + + } while (0); + +#if CACHE_ENCODE_HEADER + if (pTestEnc->bEncHeader == 0) { + pTestEnc->bEncHeader = 1; + } +#endif + CVI_VC_TRACE("\n"); + + return ret; +} + +int cviEncode265Header(stTestEncoder *pTestEnc) +{ + int ret = TRUE; + + do { + ret = cviEncode265HeaderByType(pTestEnc, CODEOPT_ENC_VPS); + if (ret == FALSE) + break; + + ret = cviEncode265HeaderByType(pTestEnc, CODEOPT_ENC_SPS); + if (ret == FALSE) + break; + + ret = cviEncode265HeaderByType(pTestEnc, CODEOPT_ENC_PPS); + if (ret == FALSE) + break; + } while (0); + + CVI_VC_TRACE("\n"); + + return ret; +} + +static int cviInsertOneUserDataSegment(stStreamPack *psp, Uint8 *pUserData, + Uint32 userDataLen) +{ + stPack *pPack; + Uint8 *pBuffer; + + MUTEX_LOCK(&psp->packMutex); + if (psp->totalPacks >= MAX_NUM_PACKS) { + CVI_VC_ERR("totalPacks (%d) >= MAX_NUM_PACKS\n", + psp->totalPacks); + MUTEX_UNLOCK(&psp->packMutex); + return FALSE; + } + MUTEX_UNLOCK(&psp->packMutex); + + pBuffer = (Uint8 *)osal_kmalloc(userDataLen); + if (pBuffer == NULL) { + CVI_VC_ERR("out of memory\n"); + return FALSE; + } + + memcpy(pBuffer, pUserData, userDataLen); + + MUTEX_LOCK(&psp->packMutex); + pPack = &psp->pack[psp->totalPacks++]; + pPack->addr = pBuffer; + pPack->len = userDataLen; + pPack->cviNalType = NAL_SEI; + pPack->need_free = TRUE; + pPack->u64PhyAddr = virt_to_phys(pBuffer); + vdi_flush_ion_cache(pPack->u64PhyAddr, pBuffer, userDataLen); + MUTEX_UNLOCK(&psp->packMutex); + + return TRUE; +} + +int cviInsertUserData(stTestEncoder *pTestEnc) +{ + int ret = TRUE; + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + UserDataList *userdataNode = NULL; + UserDataList *n; + + list_for_each_entry_safe(userdataNode, n, &pEncCfg->userdataList, list) { + if (userdataNode->userDataBuf != NULL && userdataNode->userDataLen != 0) { + if (!cviInsertOneUserDataSegment(&pTestEnc->streamPack, + userdataNode->userDataBuf, + userdataNode->userDataLen)) { + CVI_VC_ERR("failed to insert user data\n"); + ret = FALSE; + } + osal_free(userdataNode->userDataBuf); + list_del(&userdataNode->list); + osal_free(userdataNode); + return ret; + } + } + + return ret; +} + +static int cviConcatePartialEsBuffer(stTestEncoder *pTestEnc, stPack *pPack, + Uint8 *esBuf, Int32 esCopiedSize) +{ + Uint8 *pu8ResultBitStream = + osal_ion_alloc(esCopiedSize + pTestEnc->u32PreStreamLen); + + if (!pu8ResultBitStream) { + CVI_VC_ERR("can not allocate memory for result bitStream\n"); + osal_free(pTestEnc->pu8PreStream); + pTestEnc->pu8PreStream = NULL; + pTestEnc->u32PreStreamLen = 0; + return FALSE; + } + + CVI_VC_INFO("u32PreStreamLen 0x%x\n", pTestEnc->u32PreStreamLen); + + memcpy(pu8ResultBitStream, pTestEnc->pu8PreStream, + pTestEnc->u32PreStreamLen); + memcpy(pu8ResultBitStream + pTestEnc->u32PreStreamLen, esBuf, + esCopiedSize); + + if (pPack->need_free) { + if (pPack->cviNalType >= NAL_I && pPack->cviNalType <= NAL_IDR) { + osal_ion_free(esBuf); + } else { + osal_kfree(esBuf); + } + esBuf = NULL; + } + + pPack->addr = pu8ResultBitStream; + pPack->len = esCopiedSize + pTestEnc->u32PreStreamLen; + pPack->u64PhyAddr = virt_to_phys(pu8ResultBitStream); + vdi_flush_ion_cache(pPack->u64PhyAddr, pPack->addr, pPack->len); + pPack->need_free = TRUE; + + osal_free(pTestEnc->pu8PreStream); + pTestEnc->pu8PreStream = NULL; + pTestEnc->u32PreStreamLen = 0; + + return TRUE; +} + +int cviPutEsInPack(stTestEncoder *pTestEnc, PhysicalAddress paBsBufStart, + PhysicalAddress paBsBufEnd, Uint32 esSize, Int32 cviNalType) +{ + stStreamPack *psp = &pTestEnc->streamPack; + stPack *pPack; + Int32 esCopiedSize = 0; + Uint8 *esBuf = NULL; + int esBufValidSize, ret; + BOOL bSkipCopy = FALSE; + +#if defined(CVI_H26X_USE_ION_MEM) + if (!vdi_get_is_single_es_buf(pTestEnc->encConfig.coreIdx)) { + if (cviNalType >= NAL_I && cviNalType <= NAL_IDR) + bSkipCopy = TRUE; + } +#endif + + ret = cviCopyStreamToBuf(pTestEnc->bsReader, &esCopiedSize, &esBuf, + esSize, &esBufValidSize, paBsBufStart, + paBsBufEnd, &bSkipCopy, cviNalType); + + if (ret < 0) { + CVI_VC_ERR("cviCopyStreamToBuf, ret = %d\n", ret); + return FALSE; + } + + MUTEX_LOCK(&psp->packMutex); + if (psp->totalPacks >= MAX_NUM_PACKS) { + CVI_VENC_DEBUG("[WARN]totalPacks (%d) >= MAX_NUM_PACKS,drop this packet\n", + psp->totalPacks); + if (!bSkipCopy) { + if (esBuf && !bSkipCopy) { + if (cviNalType >= NAL_I && cviNalType <= NAL_IDR) { + osal_ion_free(esBuf); + } else { + osal_kfree(esBuf); + } + } + } + + if (esBufValidSize > 0) { + ret = VPU_EncUpdateBitstreamBuffer(pTestEnc->handle, + esCopiedSize); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_EncUpdateBitstreamBuffer, 0x%x\n", ret); + MUTEX_UNLOCK(&psp->packMutex); + return FALSE; + } + } + psp->dropCnt++; + psp->seq++; + MUTEX_UNLOCK(&psp->packMutex); + return TRUE; + } + + pPack = &psp->pack[psp->totalPacks]; + pPack->addr = esBuf; + pPack->len = esCopiedSize; + pPack->cviNalType = cviNalType; + pPack->need_free = !bSkipCopy; + pPack->u64PTS = pTestEnc->u64Pts; + if (pPack->need_free) { + pPack->u64PhyAddr = virt_to_phys(esBuf); + vdi_flush_ion_cache(pPack->u64PhyAddr, pPack->addr, pPack->len); + } else { + CodecInst *pCodecInst = (CodecInst *)pTestEnc->handle; + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + + pPack->u64PhyAddr = vdi_remap_memory_address( + pTestEnc->coreIdx, pEncInfo->streamRdPtr); + } + if (pPack->cviNalType <= NAL_NONE || pPack->cviNalType >= NAL_MAX) { + CVI_VC_ERR("cviNalType = %d\n", cviNalType); + MUTEX_UNLOCK(&psp->packMutex); + return FALSE; + } + + psp->totalPacks++; + if (pTestEnc->pu8PreStream) { + if (cviConcatePartialEsBuffer(pTestEnc, pPack, esBuf, + esCopiedSize) != TRUE) { + CVI_VC_ERR("cviConcatePartialEsBuffer failed %d,drop this packet\n", ret); + } + } + MUTEX_UNLOCK(&psp->packMutex); + + CVI_VC_BS("pack[%d] addr = %p, len = 0x%x, cviNalType = %d\n", + psp->totalPacks, pPack->addr, pPack->len, pPack->cviNalType); + + + + if (esBufValidSize > 0) { + ret = VPU_EncUpdateBitstreamBuffer(pTestEnc->handle, + esCopiedSize); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_EncUpdateBitstreamBuffer, 0x%x\n", ret); + return FALSE; + } + } + + return TRUE; +} + +void cviPrintRc(stTestEncoder *pTestEnc) +{ + EncOpenParam *pEncOP = &pTestEnc->encOP; + + UNUSED(pEncOP); + CVI_VC_RC("-------------------\n"); + CVI_VC_RC("gopPreset = %d, LongTermPeriod = %d, LongTermDeltaQp = %d\n", + pEncOP->gopPreset, pEncOP->LongTermPeriod, + pEncOP->LongTermDeltaQp); + CVI_VC_RC("HvsQpScaleDiv2 = %d, EnHvsQp = %d, EnRowLevelRc = %d\n", + pEncOP->HvsQpScaleDiv2, pEncOP->EnHvsQp, + pEncOP->EnRowLevelRc); + CVI_VC_RC("RcInitialQp = %d, enAutoFrmSkip = %d, vbvThreshold = %d\n", + pEncOP->RcInitialQp, pEncOP->enAutoFrmSkip, + pEncOP->vbvThreshold); + CVI_VC_RC( + "rcWeightFactor = %d, coda9RoiEnable = %d, RoiPicAvgQp = %d\n", + pEncOP->rcWeightFactor, pEncOP->coda9RoiEnable, + pEncOP->RoiPicAvgQp); +} + +int cviInitAddrRemap(stTestEncoder *pTestEnc) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + EncOpenParam *pEncOP = &pTestEnc->encOP; + CodecInst *pCodecInst = (CodecInst *) pTestEnc->handle; + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + AddrRemap *par = &pEncInfo->addrRemap; + int coreIdx = pEncCfg->coreIdx; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + int extraSizeInPage[2], compSize[2], compSizeInPage[2]; + int framebufStride = 0, ret = 0; + int comp, productId; + + par->mode = cviVcodecGetEnv("ARMode"); + + par->numExtraLine = cviVcodecGetEnv("ARExtraLine"); + + par->pageSizeSel = AR_PAGE_256KB; + par->mmuEnable = AR_MMU_BIT30; + par->pageSizeInBit = par->pageSizeSel + AR_PAGE_SIZE_OFFSET; + par->pageSize = 1 << par->pageSizeInBit; + par->lastWriteFb = 1; + memset(par->u32ReadPhyAddr, 0, sizeof(par->u32ReadPhyAddr)); + + CVI_VC_CFG("mode = %d, pageSize = 0x%X, numExtraLine = %d\n", + par->mode, par->pageSize, par->numExtraLine); + + productId = ProductVpuGetId(coreIdx); + + framebufStride = + CalcStride(pTestEnc->framebufWidth, + pTestEnc->framebufHeight, + pEncOP->srcFormat, + pEncOP->cbcrInterleave, + (TiledMapType)(pEncCfg->mapType & 0x0f), + FALSE, FALSE); + + compSize[AR_COMP_LUMA] = + CalcLumaSize(productId, + framebufStride, pTestEnc->framebufHeight, + pEncOP->cbcrInterleave, (TiledMapType)(pEncCfg->mapType & 0x0f), NULL); + + compSize[AR_COMP_CHROMA] = + CalcChromaSize(productId, + framebufStride, pTestEnc->framebufHeight, pEncOP->srcFormat, + pEncOP->cbcrInterleave, (TiledMapType)(pEncCfg->mapType & 0x0f), NULL); + compSize[AR_COMP_CHROMA] = compSize[AR_COMP_CHROMA] << 1; + + extraSizeInPage[AR_COMP_LUMA] = + ROUND_UP_N_BIT(framebufStride * par->numExtraLine, par->pageSizeInBit); + extraSizeInPage[AR_COMP_CHROMA] = + ROUND_UP_N_BIT(extraSizeInPage[AR_COMP_LUMA] >> 1, par->pageSizeInBit); + + /* STD_AVC Luma use one frame size*/ + if (pEncOP->bitstreamFormat == STD_AVC) + extraSizeInPage[AR_COMP_LUMA] = 0; + + for (comp = AR_COMP_LUMA; comp < AR_COMP_MAX; comp++) { + vpu_buffer_t *pvbRecFb = &pTestEnc->vbReconFrameBuf[comp]; + + CVI_VC_AR("comp = %d\n", comp); + + compSizeInPage[comp] = ROUND_UP_N_BIT(compSize[comp], par->pageSizeInBit); + par->numFramePage[comp] = compSizeInPage[comp] >> par->pageSizeInBit; + + compSizeInPage[comp] += extraSizeInPage[comp]; + + par->numVirPageInFbs[comp] = compSizeInPage[comp] >> par->pageSizeInBit; + + if (par->mode == AR_MODE_ORIG) + compSizeInPage[comp] += par->pageSize; + + pvbRecFb->size = compSizeInPage[comp]; + + par->numPhyPageInFbs[comp] = compSizeInPage[comp] >> par->pageSizeInBit; + + CVI_VC_AR("compSize = 0x%X, compSizeInPage = 0x%X, extraSizeInPage = 0x%X\n", + compSize[comp], compSizeInPage[comp], extraSizeInPage[comp]); + CVI_VC_AR("numPhyPageInFbs = 0x%X, numVirPageInFbs = 0x%X\n", + par->numPhyPageInFbs[comp], par->numVirPageInFbs[comp]); + + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VENC_%d_ReconFb_%d", pCodecInst->s32ChnNum, comp); + + if (VDI_ALLOCATE_MEMORY(coreIdx, pvbRecFb, 0, ionName) < 0) { + CVI_VC_ERR("fail to allocate recon buffer, %d\n", comp); + return TE_ERR_ENC_OPEN; + } + } + + + for (comp = AR_COMP_LUMA; comp < AR_COMP_MAX; comp++) { + vpu_buffer_t *pvbRecFb = &pTestEnc->vbReconFrameBuf[comp]; + FrameBuffer *pfb = &pTestEnc->fbRecon[comp]; + + pfb->size = pvbRecFb->size; + pfb->bufCb = (PhysicalAddress) - 1; + pfb->bufCr = (PhysicalAddress) - 1; + pfb->updateFbInfo = TRUE; + + if (par->mode == AR_MODE_ORIG) { + pfb->bufY = ROUND_UP_N_BIT(pvbRecFb->phys_addr, par->pageSizeInBit); + } else { + pfb->bufY = pvbRecFb->phys_addr; + } + + CVI_VC_AR("fbRecon[%d], bufY = 0x%llX, bufCb = 0x%llX, bufCr = 0x%llX\n", + comp, pfb->bufY, pfb->bufCb, pfb->bufCr); + CVI_VC_AR("vbReconFrameBuf[%d], phys_addr = 0x%llX\n", + comp, pvbRecFb->phys_addr); + + ret = cviInitPageTable(pTestEnc, comp, pfb->bufY); + if (ret != 0) { + CVI_VC_ERR("cviInitPageTable\n"); + return ret; + } + } + + return ret; +} + +static int cviInitPageTable(stTestEncoder *pTestEnc, int comp, Uint32 startAddr) +{ + CodecInst *pCodecInst = (CodecInst *) pTestEnc->handle; + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + AddrRemap *par = &pEncInfo->addrRemap; + Uint32 currAddr = startAddr; + int ret = 0; + Int32 i, j; + + CVI_VC_AR("PageTable[%d]\n", comp); + CVI_VC_AR("numPhyPageInFbs = %d\n", par->numPhyPageInFbs[comp]); + + for (i = 0; i < par->numVirPageInFbs[comp]; i++) { + PageEntry *pEntry = &par->pageTable[comp][i]; + + pEntry->phyAddr = currAddr; + pEntry->flag = pTestEnc->regFrameBufCount; + + CVI_VC_AR("[%d] phyAddr = 0x%X, flag = 0x%X\n", i, pEntry->phyAddr, pEntry->flag); + + currAddr += par->pageSize; + } + + if (pTestEnc->regFrameBufCount > AR_MAX_FB_NUM) { + CVI_VC_ERR("PageTable[%d]\n", comp); + return -1; + } + + for (i = 0; i < pTestEnc->regFrameBufCount; i++) { + for (comp = AR_COMP_LUMA; comp < AR_COMP_MAX; comp++) { + for (j = 0; j < par->numFramePage[comp]; j++) { + par->fbPageIndex[i][comp][j] = j; + } + } + } + + return ret; +} + +int cviInitAddrRemapFb(CodecInst *pCodecInst) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + AddrRemap *par = &pEncInfo->addrRemap; + Uint32 val, reg; + int i; + + // Enable vc addr remap, reg VC_FAB_MMU_CTRL + val = 0; + val |= (par->mmuEnable & 0x3); + val |= ((par->mode & 0x1) << 3); + val |= ((par->pageSizeSel & 0x3) << 4); + + reg = CtrlReadReg(coreIdx, VC_FAB_MMU_CTRL); + + if (pCodecInst->productId == PRODUCT_ID_420L) { + reg &= 0x0000FFFF; + reg |= (val << 16); + } else { + reg &= 0xFFFF0000; + reg |= val; + } + CtrlWriteReg(coreIdx, VC_FAB_MMU_CTRL, reg); + + val = CtrlReadReg(coreIdx, VC_FAB_MMU_CTRL); + CVI_VC_AR("VC CTRL Reg 0x%x = 0x%x\n", VC_FAB_MMU_CTRL, val); + + // Setup recon frame YUV virtual address + val = 1 << (AR_MMU_ENABLE_OFFSET - par->mmuEnable); + + for (i = 0; i < pEncInfo->numFrameBuffers; i++) { + FrameBuffer *pFb = &pEncInfo->frameBufPool[i]; + + pFb->bufY = val; + val += (par->numFramePage[AR_COMP_LUMA] << par->pageSizeInBit); + + pFb->bufCb = val; + val += (par->numFramePage[AR_COMP_CHROMA] << par->pageSizeInBit); + + CVI_VC_AR("frameBufPool[%d] bufY = 0x%llX, bufCb = 0x%llX\n", + i, pFb->bufY, pFb->bufCb); + } + + return RETCODE_SUCCESS; +} + +int cviSetupPicConfig(stTestEncoder *pTestEnc) +{ + EncOpenParam *pEncOP = &pTestEnc->encOP; + EncParam *pEncParam = &pTestEnc->encParam; + stRcInfo *pRcInfo; + CodecInst *pCodecInst; + EncInfo *pEncInfo; + AddrRemap *par; + int ret = 0; + + pCodecInst = pTestEnc->handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + par = &pEncInfo->addrRemap; + + pRcInfo = &pCodecInst->rcInfo; + + pRcInfo->frameIdx = pTestEnc->frameIdx; + + if (pEncInfo->cviRcEn) + cviEncRc_RcKernelEstimatePic(pRcInfo, pEncParam, pEncInfo->frameIdx); + + if (pEncInfo->addrRemapEn) { + if (pEncOP->bitstreamFormat == STD_HEVC) { + if (pEncParam->is_idr_frame) + par->lastWriteFb = 1; + } + + ret = cviConfigPageTable(pCodecInst); + if (ret < 0) { + CVI_VC_ERR("cviConfigPageTable, %d\n", ret); + return ret; + } + + cviPrintPageTable(pCodecInst); + } + + return ret; +} + +static int cviConfigPageTable(CodecInst *pCodecInst) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + AddrRemap *par = &pEncInfo->addrRemap; + int comp; + int ret = 0; + + CVI_VC_AR("frameIdx = %d, lastWriteFb = %d\n", pEncInfo->frameIdx, par->lastWriteFb); + + for (comp = AR_COMP_LUMA; comp < AR_COMP_MAX; comp++) { + ret = cviFindWriteEntry(pCodecInst, comp); + if (ret < 0) { + CVI_VC_ERR("cviFindWriteEntry, comp = %d\n", comp); + return -1; + } + + ret = cviConfigPageTableEntry(pCodecInst, comp); + } + + par->lastWriteFb = (par->lastWriteFb + 1) & 0x1; + + return ret; +} + +static int cviFindWriteEntry(CodecInst *pCodecInst, int comp) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + AddrRemap *par = &pEncInfo->addrRemap; + int currWriteFb = (par->lastWriteFb + 1) & 0x1; + int foundPage, currPage; + int j; + + // find from unused pages + currPage = 0; + for (j = 0; j < par->numVirPageInFbs[comp]; j++) { + if (par->pageTable[comp][j].flag != par->lastWriteFb) { + foundPage = j; + + par->fbPageIndex[currWriteFb][comp][currPage] = foundPage; + par->pageTable[comp][foundPage].flag = currWriteFb; + + currPage++; + + if (currPage >= par->numFramePage[comp]) { + CVI_VC_AR("find finished, currPage = %d\n", currPage); + return 0; + } + } + } + + // find from the last written Frame Buffer + for (j = 0; j < par->numVirPageInFbs[comp]; j++) { + foundPage = par->fbPageIndex[par->lastWriteFb][comp][j]; + + par->fbPageIndex[currWriteFb][comp][currPage] = foundPage; + par->pageTable[comp][foundPage].flag = currWriteFb; + + currPage++; + + if (currPage >= par->numFramePage[comp]) { + CVI_VC_AR("top of lastWriteFb, currPage = %d\n", currPage); + return 0; + } + } + + CVI_VC_ERR("currPage = %d, not enough free page\n", currPage); + + return -1; +} + +static int cviConfigPageTableEntry(CodecInst *pCodecInst, int comp) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + EncOpenParam *pOpenParam = &pEncInfo->openParam; + AddrRemap *par = &pEncInfo->addrRemap; + int regStartAddr; + int currWriteFb = (par->lastWriteFb + 1) & 0x1; + int i; + + CVI_VC_AR("chn:%d PageTable[%d]\n", pCodecInst->s32ChnNum, comp); + + if (par->u32ReadPhyAddr[comp][0]) { + regStartAddr = (par->lastWriteFb & 0x1) * + (par->numFramePage[AR_COMP_LUMA] + par->numFramePage[AR_COMP_CHROMA]); + regStartAddr += comp * par->numFramePage[AR_COMP_LUMA]; + regStartAddr <<= 2; + if (pOpenParam->bitstreamFormat == STD_HEVC) + regStartAddr += H265_MAP_REG_OFFSET; + for (i = 0; i < par->numFramePage[comp]; i++) { + RemapWriteReg(pCodecInst->coreIdx, regStartAddr, par->u32ReadPhyAddr[comp][i]); + CVI_VC_AR("[%d] last write, regStartAddr = 0x%X, phyAddr = 0x%X\n", + i, regStartAddr, par->u32ReadPhyAddr[comp][i]); + regStartAddr += 4; + } + } + + regStartAddr = currWriteFb * + (par->numFramePage[AR_COMP_LUMA] + par->numFramePage[AR_COMP_CHROMA]); + regStartAddr += comp * par->numFramePage[AR_COMP_LUMA]; + regStartAddr <<= 2; + + if (pOpenParam->bitstreamFormat == STD_HEVC) + regStartAddr += H265_MAP_REG_OFFSET; + + for (i = 0; i < par->numFramePage[comp]; i++) { + int newEntry = par->fbPageIndex[currWriteFb][comp][i]; + int phyAddr = par->pageTable[comp][newEntry].phyAddr; + + if (newEntry >= AR_MAX_NUM_PAGE_TABLE_ENTRY) { + CVI_VC_ERR("comp = %d, i = %d\n", comp, i); + return -1; + } + + CVI_VC_AR("[%d] page idx = %d, regStartAddr = 0x%X, phyAddr = 0x%X\n", + i, newEntry, regStartAddr, phyAddr); + + RemapWriteReg(pCodecInst->coreIdx, regStartAddr, phyAddr); + par->u32ReadPhyAddr[comp][i] = phyAddr; + + regStartAddr += 4; + } + + return 0; +} + +static void cviPrintPageTable(CodecInst *pCodecInst) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + EncOpenParam *pOpenParam = &pEncInfo->openParam; + AddrRemap *par = &pEncInfo->addrRemap; + PageEntry *pEntry; + + int comp, i, val, addr; + int fb; + + if ((vcodec_mask & CVI_MASK_AR) == 0) + return; + + UNUSED(pEntry); + CVI_VC_AR("PageTable -------------------------------------\n"); + + for (comp = AR_COMP_LUMA; comp < AR_COMP_MAX; comp++) { + CVI_VC_AR("PageTable[%d]\n", comp); + CVI_VC_AR("numPhyPageInFbs = %d\n", par->numPhyPageInFbs[comp]); + + for (i = 0; i < par->numVirPageInFbs[comp]; i++) { + pEntry = &par->pageTable[comp][i]; + CVI_VC_AR("[%d] phyAddr = 0x%X, flag = 0x%X\n", i, pEntry->phyAddr, pEntry->flag); + } + } + + CVI_VC_AR("Addr Remap registers --------------------------\n"); + + addr = (pOpenParam->bitstreamFormat == STD_HEVC) ? H265_MAP_REG_OFFSET : 0; + + for (fb = 0; fb < 2; fb++) { + CVI_VC_AR("fb = %d\n", fb); + + for (comp = AR_COMP_LUMA; comp < AR_COMP_MAX; comp++) { + CVI_VC_AR("comp = %d\n", comp); + + for (i = 0; i < par->numFramePage[comp]; i++) { + + val = RemapReadReg(pCodecInst->coreIdx, addr); + CVI_VC_AR("addr = 0x%X, val = 0x%X\n", addr, val); + addr += 4; + } + } + } +} + +void cviSetApiMode(EncHandle pHandle, int cviApiMode) +{ + ((CodecInst *)pHandle)->cviApiMode = cviApiMode; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_internal.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_internal.h new file mode 100644 index 0000000000..6e13115ca5 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_internal.h @@ -0,0 +1,41 @@ +/* + * Copyright Cvitek Technologies Inc. + * + * Created Time: May, 2020 + */ + +#ifndef __CVI_ENC_INTERNAL_H__ +#define __CVI_ENC_INTERNAL_H__ + +#include "cvitest_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define VC_FAB_MMU_CTRL 0x40 +#define H265_MAP_REG_OFFSET 0x200 + +// cvi_enc_internal.c +int cviCheckIdrPeriod(stTestEncoder *pTestEnc); +int cviEncode264Header(stTestEncoder *pTestEnc); +int cviEncode265Header(stTestEncoder *pTestEnc); +int cviInsertUserData(stTestEncoder *pTestEnc); +int cviPutEsInPack(stTestEncoder *pTestEnc, PhysicalAddress paBsBufStart, + PhysicalAddress paBsBufEnd, Uint32 esSize, Int32 cviNalType); +void cviPrintRc(stTestEncoder *pTestEnc); +int cviSetupPicConfig(stTestEncoder *pTestEnc); +int cviInitAddrRemap(stTestEncoder *pTestEnc); + +// vpuapi.c +RetCode cviConfigEncParam(CodecInst *pCodec, EncOpenParam *param); + +// coda9.c / wave4.c +int cviInitAddrRemapFb(CodecInst *pCodecInst); +void cviSetApiMode(EncHandle pHandle, int cviApiMode); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_rc.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_rc.c new file mode 100644 index 0000000000..0af5628aa8 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_rc.c @@ -0,0 +1,657 @@ +#include "cvi_enc_rc.h" +#include "cvi_vcom.h" + +// +/* +typedef enum _RC_MODE_ { + RC_MODE_CBR = 0, + RC_MODE_VBR, + RC_MODE_AVBR, + RC_MODE_QVBR, + RC_MODE_FIXQP, + RC_MODE_QPMAP, + RC_MODE_MAX, +} RC_MODE; +*/ +#define CVI_RC_MIN_I_PROP 1 +#define CVI_RC_MDL_UPDATE_TYPE 0 +#define CVI_RC_DEF_STAT_TIME 2 + +static void cviEncRc_RcKernelInit(stRcInfo *pRcInfo, EncOpenParam *pEncOP); +static void cviEncRc_RcKernelUpdatePic(stRcInfo *pRcInfo, EncOutputInfo *pEncOutInfo); + +static void set_pic_qp_by_delta(stRcInfo *pRcInfo, EncOpenParam *pEncOP, + int delta) +{ + pRcInfo->picIMaxQp = (pEncOP->userQpMaxI > 0) ? + CLIP3(0, 51, pEncOP->userQpMaxI - delta) : + 51; + pRcInfo->picIMinQp = (pEncOP->userQpMinI > 0) ? + CLIP3(0, 51, pEncOP->userQpMinI + delta) : + 0; + pRcInfo->picPMaxQp = (pEncOP->userQpMaxP > 0) ? + CLIP3(0, 51, pEncOP->userQpMaxP - delta) : + 51; + pRcInfo->picPMinQp = (pEncOP->userQpMinP > 0) ? + CLIP3(0, 51, pEncOP->userQpMinP + delta) : + 0; +} + +// --------------------------------------------------------- +int _cviEncRc_getBitrate(stRcInfo *pRcInfo) +{ + if (!pRcInfo->rcEnable) { + return 0; + } + return (pRcInfo->rcMode == RC_MODE_CBR || + pRcInfo->rcMode == RC_MODE_UBR) ? + pRcInfo->targetBitrate : + pRcInfo->maximumBitrate; +} + +static void _cviEncRc_setBitrateParam(stRcInfo *pRcInfo, EncOpenParam *pEncOP) +{ + stRcKernelInfo *pRcKerInfo = &pRcInfo->rcKerInfo; + int frameRateDiv, frameRateRes; + + // VBR + if (pRcInfo->rcMode == RC_MODE_VBR) { + pRcInfo->convergStateBufThr = pEncOP->bitRate * 1000; + pRcInfo->targetBitrate = + (pEncOP->bitRate * pEncOP->changePos) / 100; + pRcInfo->maximumBitrate = pEncOP->bitRate; + } else if (pRcInfo->rcMode == RC_MODE_AVBR) { + int minPercent = pEncOP->minStillPercent; + int motLv = pRcInfo->periodMotionLv; + int motBitRatio = 0, bitrateByMotLv = 0; + + if (pEncOP->svc_enable && pEncOP->complex_scene_detect_en) { + minPercent = pRcInfo->periodDciLv <= + pEncOP->complex_scene_low_th ? + minPercent : pEncOP->middle_min_percent; + minPercent = pRcInfo->periodDciLv >= + pEncOP->complex_scene_hight_th ? + pEncOP->complex_min_percent : minPercent; + } + + pRcInfo->lastMinPercent = minPercent; + motBitRatio = + (((100 - minPercent) * (motLv)) / 255) + minPercent; + bitrateByMotLv = (pEncOP->bitRate * motBitRatio) / 100; + //bitrateByMotLv = (pRcInfo->avbrLastPeriodBitrate * 0.25) + (bitrateByMotLv * 0.75); + pRcInfo->avbrLastPeriodBitrate = bitrateByMotLv; + pRcInfo->convergStateBufThr = bitrateByMotLv * 1000; + pRcInfo->targetBitrate = + (bitrateByMotLv * pEncOP->changePos) / 100; + pRcInfo->maximumBitrate = pEncOP->bitRate; + CVI_VC_INFO("minPercent %d new targetBitrate = %d periodDciLv %d\n", + minPercent, pRcInfo->targetBitrate, pRcInfo->periodDciLv); + } else { + pRcInfo->targetBitrate = pEncOP->bitRate; + } + + frameRateDiv = (pEncOP->frameRateInfo >> 16) + 1; + frameRateRes = pEncOP->frameRateInfo & 0xFFFF; + + if (pRcInfo->cviRcEn) { + // TODO: use soft-floating to replace it + pRcInfo->picAvgBit = (int)(pRcInfo->targetBitrate * 1000 * + frameRateDiv / frameRateRes); + } else { + CVI_VC_RC("cviRcEn = %d\n", pRcInfo->cviRcEn); + } + + CVI_VC_RC("gopSize = %d, maxIprop = %d\n", pEncOP->gopSize, + pEncOP->maxIprop); + + if ((pRcInfo->codec == STD_AVC || pRcInfo->rcMode == RC_MODE_UBR) && + pEncOP->maxIprop > 0 && pEncOP->gopSize > 1) { + if (pRcInfo->cviRcEn) { + pRcInfo->maxIPicBit = + (int)(pEncOP->maxIprop * pEncOP->gopSize * + pRcInfo->targetBitrate * 1000 * frameRateDiv / + frameRateRes / + (pEncOP->maxIprop + pEncOP->gopSize - 1)); + } else { + CVI_VC_RC("cviRcEn = %d\n", pRcInfo->cviRcEn); + } + CVI_VC_RC("maxIPicBit = %d\n", pRcInfo->maxIPicBit); + } + + if (pRcInfo->cviRcEn) { + RC_Float frameRate = CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(frameRateRes), + INT_TO_CVI_FLOAT(frameRateDiv)); + + if (vcodec_mask & CVI_MASK_CVRC) { + CVI_VCOM_FLOAT("bitRate = %d, frameRate = %f\n", pEncOP->bitRate, getFloat(frameRate)); + } + cviRcKernel_setBitrateAndFrameRate(pRcKerInfo, + pRcInfo->targetBitrate * 1000, frameRate); + } +} + +int _cviEncRc_getFramerate(stRcInfo *pRcInfo) +{ + if (!pRcInfo->rcEnable) { + return 0; + } + + return pRcInfo->framerate; +} + +static void _cviEncRc_setFramerateParam(stRcInfo *pRcInfo, EncOpenParam *pEncOP) +{ + pRcInfo->framerate = pEncOP->frameRateInfo; + CVI_VC_CFG("framerate = %d\n", pRcInfo->framerate); +} + +int cviEncRc_GetParam(stRcInfo *pRcInfo, eRcParam eParam) +{ + int ret = 0; + + if (!pRcInfo->rcEnable) { + return ret; + } + + switch (eParam) { + case E_BITRATE: + ret = _cviEncRc_getBitrate(pRcInfo); + break; + case E_FRAMERATE: + ret = _cviEncRc_getFramerate(pRcInfo); + break; + default: + break; + } + + return ret; +} + +int cviEncRc_SetParam(stRcInfo *pRcInfo, EncOpenParam *pEncOP, eRcParam eParam) +{ + int ret = 0; + + if (!pRcInfo->rcEnable) { + return ret; + } + + switch (eParam) { + case E_BITRATE: + _cviEncRc_setBitrateParam(pRcInfo, pEncOP); + ret = 1; + break; + case E_FRAMERATE: + _cviEncRc_setFramerateParam(pRcInfo, pEncOP); + ret = 1; + break; + default: + break; + } + + return ret; +} + +static int calc_avg_motionLv(stRcInfo *pRcInfo) +{ + int winSize = pRcInfo->bitrateChangePeriod; + // trimmed average + /* + int idx = 0, motionWin[AVBR_MAX_BITRATE_WIN]; + for(idx=0; idxpicMotionLvWindow[idx]; + } + insertion_sort(motionWin, winSize); + int startIdx = (winSize >> 2); + int endIdx = startIdx + ((winSize)>>1); + int accum = 0; + for(idx=startIdx; idx> 1))); + */ + int accum = 0, idx = 0; + for (idx = 0; idx < winSize; idx++) { + accum += pRcInfo->picMotionLvWindow[idx % winSize]; + } + return CLIP3(0, 255, (accum / winSize)); +} + +static int calc_avg_dcilv(stRcInfo *pRcInfo) +{ + int winSize = pRcInfo->bitrateChangePeriod; + int accum = 0, idx = 0; + + for (idx = 0; idx < winSize; idx++) + accum += pRcInfo->picDciLvWindow[idx % winSize]; + return accum / winSize; +} + +BOOL cviEnc_Avbr_PicCtrl(stRcInfo *pRcInfo, EncOpenParam *pEncOP, int frameIdx) +{ + BOOL changeBrEn = FALSE; + int winSize, coring_offset, coring_in, coring_out, coring_gain; + + if (pRcInfo->rcMode != RC_MODE_AVBR) { + return FALSE; + } + winSize = pRcInfo->bitrateChangePeriod; + coring_offset = pEncOP->pureStillThr; + coring_in = pEncOP->picMotionLevel; + coring_out = CLIP3(0, 255, (coring_in - coring_offset)); + CVI_VC_INFO("pic mot in = %d, mot lv = %d\n", coring_in, coring_out); + + pEncOP->picMotionLevel = coring_out; + pRcInfo->picMotionLvWindow[frameIdx % winSize] = pEncOP->picMotionLevel; + pRcInfo->picDciLvWindow[frameIdx % winSize] = pEncOP->picDciLv; + pRcInfo->avbrChangeBrEn = FALSE; + coring_gain = pEncOP->motionSensitivy; + pRcInfo->lastPeriodDciLv = pRcInfo->periodDciLv; + pRcInfo->periodDciLv = calc_avg_dcilv(pRcInfo); + pRcInfo->periodMotionLvRaw = calc_avg_motionLv(pRcInfo); + pRcInfo->periodMotionLv = + CLIP3(0, 255, (pRcInfo->periodMotionLvRaw * coring_gain) / 10); + CVI_VC_INFO("periodMotionLvRaw = %d periodMotionLv = %d\n", + pRcInfo->periodMotionLvRaw, pRcInfo->periodMotionLv); + pRcInfo->avbrChangeValidCnt = + (pRcInfo->avbrChangeValidCnt > 0) ? + (pRcInfo->avbrChangeValidCnt - 1) : + 0; + CVI_VC_INFO("avbrChangeValidCnt = %d\n", pRcInfo->avbrChangeValidCnt); + if (pRcInfo->avbrChangeValidCnt == 0) { + int MotionLvLower; + // quantize motion diff to avoid too frequently bitrate change + int diffMotLv = (pRcInfo->lastPeriodMotionLv > + pRcInfo->periodMotionLv) ? + (pRcInfo->lastPeriodMotionLv - + pRcInfo->periodMotionLv) >> + 4 : + (pRcInfo->periodMotionLv - + pRcInfo->lastPeriodMotionLv) >> + 4; + int diffDciLv = abs(pRcInfo->lastPeriodDciLv - pRcInfo->periodDciLv); + + changeBrEn = + (diffMotLv >= 1) || (pRcInfo->periodMotionLv == 0 && + pRcInfo->lastPeriodMotionLv > 0 && + pRcInfo->lastPeriodMotionLv <= 16) || + (diffDciLv >= 80); + MotionLvLower = CLIP3( + 0, 255, pRcInfo->lastPeriodMotionLv - MOT_LOWER_THR); + pRcInfo->periodMotionLv = + MAX(MotionLvLower, pRcInfo->periodMotionLv); + + if (changeBrEn) { + pRcInfo->lastPeriodMotionLv = pRcInfo->periodMotionLv; + pRcInfo->avbrChangeBrEn = TRUE; + pRcInfo->avbrChangeValidCnt = MAX( + 20, pRcInfo->framerate); //AVBR_MAX_BITRATE_WIN; + } + //CVI_VC_INFO("avbr bitrate = %d\n", pRcInfo->targetBitrate); + } + return (changeBrEn) ? TRUE : FALSE; +} + +int cviEncRc_Avbr_GetQpDelta(stRcInfo *pRcInfo, EncOpenParam *pEncOP) +{ + int qDelta = 0; + + if ((!pRcInfo->rcEnable) || (pRcInfo->rcMode != RC_MODE_AVBR)) { + return 0; + } + + do { + int qDiff = 0; + int stillQp = pEncOP->maxStillQp; + int maxQp = (pEncOP->userQpMaxI + pEncOP->userQpMaxP) >> 1; + int ratio = CLIP3(0, 64, 64 - pRcInfo->periodMotionLvRaw); + if (pRcInfo->svcEnable) + qDiff = MIN(0, stillQp - pEncOP->userQpMaxI); + else + qDiff = MIN(0, stillQp - maxQp); + + qDelta = (ratio * qDiff) >> 6; + pRcInfo->qDelta = qDelta; + } while (0); + return pRcInfo->svcEnable ? 0 : qDelta; +} + +BOOL cviEncRc_Avbr_CheckFrameSkip(stRcInfo *pRcInfo, EncOpenParam *pEncOP, + int isIFrame) +{ + BOOL isFrameSkip = FALSE; + BOOL isStillPic = TRUE; + int idx; + + if ((!pRcInfo->rcEnable) || (pRcInfo->rcMode != RC_MODE_AVBR) || + pRcInfo->avbrContiSkipNum == 0) { + return FALSE; + } + + for (idx = 0; idx < pRcInfo->bitrateChangePeriod; idx++) { + if (pRcInfo->picMotionLvWindow[idx] > 0) { + isStillPic = FALSE; + break; + } + } + + if (isStillPic && pRcInfo->frameSkipCnt < pRcInfo->avbrContiSkipNum && + !isIFrame) { + isFrameSkip = TRUE; + pRcInfo->frameSkipCnt++; + } else { + isFrameSkip = FALSE; + pRcInfo->frameSkipCnt = 0; + } + CVI_VC_INFO("FrameSkipByStillPic: %d %d %d\n", isFrameSkip, + pEncOP->picMotionLevel, pRcInfo->periodMotionLv); + return isFrameSkip; +} + +void cviEncRc_Open(stRcInfo *pRcInfo, EncOpenParam *pEncOP) +{ + pRcInfo->rcEnable = pEncOP->rcEnable; + pRcInfo->cviRcEn = pEncOP->cviRcEn; + pRcInfo->svcEnable = pEncOP->svc_enable; + if (!pRcInfo->rcEnable) { + return; + } + + pRcInfo->codec = pEncOP->bitstreamFormat; + + // params setting + pRcInfo->rcMode = pEncOP->rcMode; + pRcInfo->numOfPixel = pEncOP->picWidth * pEncOP->picHeight; + // frame skipping + pRcInfo->contiSkipNum = (!pEncOP->frmLostOpen) ? 0 : + (pEncOP->encFrmGaps == 0) ? 65535 : + pEncOP->encFrmGaps; + pRcInfo->frameSkipBufThr = pEncOP->frmLostBpsThr; + + // avbr setting + if (pRcInfo->rcMode == RC_MODE_AVBR) { + int basePeriod, idx; + for (basePeriod = AVBR_MAX_BITRATE_WIN; basePeriod > 0; + basePeriod--) { + if (pEncOP->gopSize % basePeriod == 0) { + pRcInfo->bitrateChangePeriod = basePeriod; + break; + } + } + for (idx = 0; idx < AVBR_MAX_BITRATE_WIN; idx++) { + pRcInfo->picMotionLvWindow[idx] = MOT_LV_DEFAULT; + } + } + pRcInfo->periodMotionLv = MOT_LV_DEFAULT; + pRcInfo->lastPeriodMotionLv = MOT_LV_DEFAULT; + pRcInfo->avbrContiSkipNum = + (!pEncOP->avbrFrmLostOpen) ? 0 : + (pEncOP->avbrFrmGaps == 0) ? 65535 : + pEncOP->avbrFrmGaps; + + pRcInfo->maxIPicBit = -1; + // bitrate + cviEncRc_SetParam(pRcInfo, pEncOP, E_BITRATE); + cviEncRc_SetParam(pRcInfo, pEncOP, E_FRAMERATE); + + // pic min/max qp + pRcInfo->picMinMaxQpClipRange = 0; + set_pic_qp_by_delta(pRcInfo, pEncOP, pRcInfo->picMinMaxQpClipRange); + + // initial value setup + pRcInfo->frameSkipCnt = 0; + pRcInfo->bitrateBuffer = + pRcInfo->targetBitrate * 400; // initial buffer level + pRcInfo->ConvergenceState = 0; + pRcInfo->rcState = STEADY; + pRcInfo->avbrLastPeriodBitrate = pRcInfo->targetBitrate; + pRcInfo->avbrChangeBrEn = FALSE; + pRcInfo->isLastPicI = FALSE; + pRcInfo->avbrChangeValidCnt = 20; + pRcInfo->periodMotionLvRaw = 32; + pRcInfo->s32HrdBufLevel = pRcInfo->targetBitrate * pEncOP->rcInitDelay / 4; + +// I frame RQ model for max I frame size constraint + + CVI_VC_INFO("rcEnable = %d\n", pRcInfo->rcEnable); + CVI_VC_INFO("rc mode = %d\n", pRcInfo->rcMode); + CVI_VC_INFO("targetBitrate = %dk\n", pRcInfo->targetBitrate); + CVI_VC_INFO("frame rate = %d\n", pEncOP->frameRateInfo); + CVI_VC_INFO("picAvgBit = %d\n", pRcInfo->picAvgBit); + CVI_VC_INFO("convergStateBufThr = %d\n", pRcInfo->convergStateBufThr); + if (pRcInfo->rcMode == RC_MODE_AVBR) { + CVI_VC_INFO("bitrateChangePeriod = %d\n", + pRcInfo->bitrateChangePeriod); + CVI_VC_INFO("motionSensitivy = %d\n", pEncOP->motionSensitivy); + CVI_VC_INFO("minStillPercent = %d\n", pEncOP->minStillPercent); + CVI_VC_INFO("maxStillQp = %d\n", pEncOP->maxStillQp); + CVI_VC_INFO("pureStillThr = %d\n", pEncOP->pureStillThr); + CVI_VC_INFO("avbrContiSkipNum = %d\n", + pRcInfo->avbrContiSkipNum); + } + CVI_VC_INFO("bFrmLostOpen = %d\n", pEncOP->frmLostOpen); + if (pEncOP->frmLostOpen) { + CVI_VC_INFO("bitrateBuffer = %d\n", pRcInfo->bitrateBuffer); + CVI_VC_INFO("frameSkipBufThr = %d\n", pRcInfo->frameSkipBufThr); + CVI_VC_INFO("contiSkipNum = %d\n", pRcInfo->contiSkipNum); + } + + CVI_VC_INFO("maxIprop = %d, gopSize = %d, maxIPicBit = %d\n", + pEncOP->maxIprop, pEncOP->gopSize, pRcInfo->maxIPicBit); + + CVI_VC_RC("cviRcEn = %d\n", pRcInfo->cviRcEn); + if (pRcInfo->cviRcEn) + cviEncRc_RcKernelInit(pRcInfo, pEncOP); +} + +static void cviEncRc_RcKernelInit(stRcInfo *pRcInfo, EncOpenParam *pEncOP) +{ + stRcKernelInfo *pRcKerInfo = &pRcInfo->rcKerInfo; + stRcKernelCfg rcKerCfg, *pRcKerCfg = &rcKerCfg; + int frameRateDiv, frameRateRes; + + pRcKerCfg->targetBitrate = pRcInfo->targetBitrate * 1000; + pRcKerCfg->codec = pRcInfo->codec; + + frameRateDiv = (pRcInfo->framerate >> 16) + 1; + frameRateRes = pRcInfo->framerate & 0xFFFF; + + CVI_VC_INFO("framerate = %d\n", pRcInfo->framerate); + pRcKerCfg->framerate = + CVI_FLOAT_DIV(INT_TO_CVI_FLOAT(frameRateRes), INT_TO_CVI_FLOAT(frameRateDiv)); + pRcKerCfg->intraPeriod = pEncOP->gopSize; + pRcKerCfg->statTime = (pEncOP->statTime < 0) ? CVI_RC_DEF_STAT_TIME : pEncOP->statTime; + pRcKerCfg->ipQpDelta = -pEncOP->rcGopIQpOffset; + pRcKerCfg->numOfPixel = pRcInfo->numOfPixel; + pRcKerCfg->maxIprop = pEncOP->maxIprop; + pRcKerCfg->minIprop = CVI_RC_MIN_I_PROP; + pRcKerCfg->maxQp = pEncOP->userQpMaxP; + pRcKerCfg->minQp = pEncOP->userQpMinP; + pRcKerCfg->maxIQp = pEncOP->userQpMaxI; + pRcKerCfg->minIQp = pEncOP->userQpMinI; + pRcKerCfg->firstFrmstartQp = pEncOP->RcInitialQp; + pRcKerCfg->rcMdlUpdatType = CVI_RC_MDL_UPDATE_TYPE; + + CVI_VC_CVRC("targetBitrate = %d, codec = %d, framerate = %d, intraPeriod = %d\n", + pRcKerCfg->targetBitrate, pRcKerCfg->codec, pRcKerCfg->framerate, pRcKerCfg->intraPeriod); + CVI_VC_CVRC("statTime = %d, ipQpDelta = %d, numOfPixel = %d, maxIprop = %d, minIprop = %d\n", + pRcKerCfg->statTime, + pRcKerCfg->ipQpDelta, + pRcKerCfg->numOfPixel, + pRcKerCfg->maxIprop, + pRcKerCfg->minIprop); + CVI_VC_CVRC("maxQp = %d, minQp = %d, maxIQp = %d, minIQp = %d, firstFrmstartQp = %d, rcMdlUpdatType = %d\n", + pRcKerCfg->maxQp, + pRcKerCfg->minQp, + pRcKerCfg->maxIQp, + pRcKerCfg->minIQp, + pRcKerCfg->firstFrmstartQp, + pRcKerCfg->rcMdlUpdatType); + + cviRcKernel_init(pRcKerInfo, pRcKerCfg); + + if (pRcInfo->codec == STD_AVC) { + cviRcKernel_setLastPicQpClip(pRcKerInfo, 10); + cviRcKernel_setLevelPicQpClip(pRcKerInfo, 10); + cviRcKernel_setpPicQpNormalClip(pRcKerInfo, 10); + cviRcKernel_setRCModelUpdateStep(pRcKerInfo, FLOAT_VAL_p2, FLOAT_VAL_p1); + } + if (vcodec_mask & CVI_MASK_CVRC) { + CVI_PRNT(" fn, targetBit, qp, encodedBit\n"); + CVI_PRNT("-------------------------------\n"); + } +} + +void cviEncRc_RcKernelEstimatePic(stRcInfo *pRcInfo, EncParam *pEncParam, int frameIdx) +{ + int maxQp, minQp; + stRcKernelInfo *pRcKerInfo = &pRcInfo->rcKerInfo; + stRcKernelPicOut *pRcPicOut = &pRcInfo->rcPicOut; + + cviRcKernel_estimatePic(pRcKerInfo, pRcPicOut, pEncParam->is_idr_frame, frameIdx); + + CVI_VC_TRACE("frameIdx = %d, qp = %d, targetBit = %d\n", + frameIdx, pRcPicOut->qp, pRcPicOut->targetBit); + + pEncParam->u32FrameQp = pRcPicOut->qp; + pEncParam->u32FrameBits = pRcPicOut->targetBit; + pEncParam->s32HrdBufLevel = pRcInfo->s32HrdBufLevel; + + pRcInfo->skipPicture = pEncParam->skipPicture; + + if (pRcInfo->rcMode == RC_MODE_AVBR) { + if (!pRcInfo->svcEnable) { + maxQp = (pEncParam->is_idr_frame) ? pRcInfo->picIMaxQp : pRcInfo->picPMaxQp; + minQp = (pEncParam->is_idr_frame) ? pRcInfo->picIMinQp : pRcInfo->picPMinQp; + pEncParam->u32FrameQp = CLIP3(minQp, maxQp + pRcInfo->qDelta, pRcPicOut->qp); + } else if (pEncParam->is_idr_frame) { + pEncParam->u32FrameQp = CLIP3(pRcInfo->picIMinQp, + pRcInfo->picIMaxQp + pRcInfo->qDelta, + pRcPicOut->qp); + } + } +} + +void cviEncRc_UpdatePicInfo(stRcInfo *pRcInfo, EncOutputInfo *pEncOutInfo) +{ + int encPicBit = pEncOutInfo->encPicByte << 3; + + if (!pRcInfo->rcEnable) { + return; + } + + pRcInfo->bitrateBuffer = + MAX(pRcInfo->bitrateBuffer + encPicBit - pRcInfo->picAvgBit, 0); + pRcInfo->isLastPicI = (pEncOutInfo->picType == PIC_TYPE_I) || + (pEncOutInfo->picType == PIC_TYPE_IDR); + // for Coda, last picture qp is updated in driver code. + if (pRcInfo->codec == STD_HEVC) { + pRcInfo->lastPicQp = pEncOutInfo->avgCtuQp; + } + + if (pRcInfo->cviRcEn) + cviEncRc_RcKernelUpdatePic(pRcInfo, pEncOutInfo); +} + +static void cviEncRc_RcKernelUpdatePic(stRcInfo *pRcInfo, EncOutputInfo *pEncOutInfo) +{ + stRcKernelInfo *pRcKerInfo = &pRcInfo->rcKerInfo; + stRcKernelPicOut *pRcPicOut = &pRcInfo->rcPicOut; + stRcKernelPicIn rcPicIn, *pRcPicIn = &rcPicIn; + int encodedBit; + + encodedBit = pEncOutInfo->encPicByte << 3; + + pRcPicIn->madi = INT_TO_CVI_FLOAT(-1); + if (pRcInfo->codec == STD_AVC) { + int mbs = pRcInfo->numOfPixel / 256; // for avc, mb:16*16 + + pRcPicIn->encodedQp = CVI_FLOAT_DIV( + INT_TO_CVI_FLOAT(pEncOutInfo->u32SumQp), + INT_TO_CVI_FLOAT(mbs)); + + if (pRcInfo->isLastPicI) + pRcPicIn->madi = CVI_FLOAT_DIV( + INT_TO_CVI_FLOAT(pEncOutInfo->picVariance), + INT_TO_CVI_FLOAT(mbs)); + + pRcInfo->s32HrdBufLevel += encodedBit - pRcKerInfo->picAvgBit; + } else if (pRcInfo->codec == STD_HEVC) { + int mbs = pRcInfo->numOfPixel / 1024; // for hevc, subCTU:32*32 + pRcPicIn->encodedQp = INT_TO_CVI_FLOAT(pEncOutInfo->avgCtuQp); + if (pRcInfo->isLastPicI) { + pRcPicIn->madi = CVI_FLOAT_DIV( + INT_TO_CVI_FLOAT(pEncOutInfo->sumPicVar), + INT_TO_CVI_FLOAT(mbs)); + } + + // pEncOutInfo->numOfSkipBlock + } + + pRcPicIn->encodedLambda = INT_TO_CVI_FLOAT(-1); + pRcPicIn->encodedBit = encodedBit; + pRcPicIn->mse = INT_TO_CVI_FLOAT(-1); + pRcPicIn->skipRatio = (pRcInfo->skipPicture) ? FLOAT_VAL_minus_1 : FLOAT_VAL_0; + + CVI_VC_CVRC("isLastPicI = %d, encodedBit = %d avg qp = %d\n", + pRcInfo->isLastPicI, pRcPicIn->encodedBit, CVI_FLOAT_TO_INT(pRcPicIn->encodedQp)); + cviRcKernel_updatePic(pRcKerInfo, pRcPicIn, pRcInfo->isLastPicI); + + if (vcodec_mask & CVI_MASK_CVRC) { + CVI_PRNT("rc update: %4d, %9d, %2d, %11d, %4d\n", + pRcInfo->frameIdx, pRcPicOut->targetBit, pRcPicOut->qp, pRcPicIn->encodedBit, + CVI_FLOAT_TO_INT(pRcPicIn->encodedQp)); + } +} + +void cviEncRc_UpdateFrameSkipSetting(stRcInfo *pRcInfo, int frmLostOpen, + int encFrmGaps, int frmLostBpsThr) +{ + pRcInfo->contiSkipNum = (!frmLostOpen) ? 0 : + (encFrmGaps == 0) ? 65535 : + encFrmGaps; + pRcInfo->frameSkipBufThr = frmLostBpsThr; +} + +int cviEncRc_ChkFrameSkipByBitrate(stRcInfo *pRcInfo, int isIFrame) +{ + int isFrameDrop = 0; + + if ((!pRcInfo->rcEnable) || (pRcInfo->contiSkipNum == 0)) { + return 0; + } + + if (pRcInfo->bitrateBuffer > pRcInfo->frameSkipBufThr && + pRcInfo->frameSkipCnt < pRcInfo->contiSkipNum && !isIFrame) { + isFrameDrop = 1; + pRcInfo->frameSkipCnt++; + } else { + isFrameDrop = 0; + pRcInfo->frameSkipCnt = 0; + } + CVI_VC_INFO("FrameDrop: %d %d / %d\n", isFrameDrop, + pRcInfo->bitrateBuffer, pRcInfo->frameSkipBufThr); + return isFrameDrop; +} + +BOOL cviEncRc_StateCheck(stRcInfo *pRcInfo, BOOL detect) +{ + eRcState curState = pRcInfo->rcState; + BOOL transition = FALSE; + switch (curState) { + case UNSTABLE: + transition |= (!detect); + pRcInfo->rcState += (!detect); + break; + case RECOVERY: + pRcInfo->rcState = (detect) ? UNSTABLE : STEADY; + transition = TRUE; + break; + default: + transition |= detect; + pRcInfo->rcState += detect; + break; + } + + return transition; +} + diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_rc.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_rc.h new file mode 100644 index 0000000000..29cde0441d --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_enc_rc.h @@ -0,0 +1,106 @@ +#ifndef __CVI_ENC_RC_H__ +#define __CVI_ENC_RC_H__ + +#include "../vpuapi/vpuapi.h" +#include "../sample/cvi_h265_interface.h" +#include "rcKernel/cvi_rc_kernel.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define AVBR_MAX_BITRATE_WIN 20 +#define MOT_LV_DEFAULT 32 +#define MOT_LOWER_THR 64 + +typedef enum { STEADY = 0, UNSTABLE = 1, RECOVERY = 2 } eRcState; + +typedef enum { + E_BITRATE = 0, + E_FRAMERATE = 1, +} eRcParam; + +typedef struct _stRQModel_ { + int picPelNum; + int lastQ; + float alpha; + float beta; + float alphaStep; + float betaStep; +} stRQModel; + +typedef struct _stRcInfo_ { + int frameIdx; + int numOfPixel; + int rcEnable; + int targetBitrate; + int picAvgBit; + int maximumBitrate; // VBR, AVBR + int bitrateBuffer; + int frameSkipBufThr; + int frameSkipCnt; + int contiSkipNum; + int skipPicture; + + int convergStateBufThr; + int ConvergenceState; + int codec; + int rcMode; // 0:CBR, 1:VBR, 2:AVBR, 5:QpMap, 6:UBR + int picIMinQp; + int picIMaxQp; + int picPMinQp; + int picPMaxQp; + int picMinMaxQpClipRange; + int lastPicQp; + eRcState rcState; + int framerate; + // AVBR + int bitrateChangePeriod; + int periodMotionLv; + int lastPeriodMotionLv; + int periodMotionLvRaw; + int lastMinPercent; + int avbrContiSkipNum; + int picMotionLvWindow[AVBR_MAX_BITRATE_WIN]; + int avbrLastPeriodBitrate; + BOOL avbrChangeBrEn; + BOOL isLastPicI; + int avbrChangeValidCnt; + int qDelta; + int picDciLvWindow[AVBR_MAX_BITRATE_WIN]; + int periodDciLv; + int lastPeriodDciLv; + // maxIprop + int maxIPicBit; + stRQModel IntraRqMdl; + BOOL isReEncodeIdr; + int s32SuperFrmBitsThr; + BOOL bTestUbrEn; + int s32HrdBufLevel; + + stRcKernelInfo rcKerInfo; + stRcKernelPicOut rcPicOut; + bool cviRcEn; + bool svcEnable; +} stRcInfo; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +void cviEncRc_Open(stRcInfo *pRcInfo, EncOpenParam *pEncOP); +void cviEncRc_RcKernelEstimatePic(stRcInfo *pRcInfo, EncParam *pEncParam, int frameIdx); +void cviEncRc_UpdatePicInfo(stRcInfo *pRcInfo, EncOutputInfo *pEncOutInfo); +void cviEncRc_UpdateFrameSkipSetting(stRcInfo *pRcInfo, int frmLostOpen, + int encFrmGaps, int frmLostBpsThr); +int cviEncRc_ChkFrameSkipByBitrate(stRcInfo *pRcInfo, int isIFrame); +BOOL cviEncRc_StateCheck(stRcInfo *pRcInfo, BOOL detect); +BOOL cviEnc_Avbr_PicCtrl(stRcInfo *pRcInfo, EncOpenParam *pEncOP, int frameIdx); +BOOL cviEncRc_Avbr_CheckFrameSkip(stRcInfo *pRcInfo, EncOpenParam *pEncOP, + int isIFrame); +int cviEncRc_Avbr_GetQpDelta(stRcInfo *pRcInfo, EncOpenParam *pEncOP); + +int cviEncRc_GetParam(stRcInfo *pRcInfo, eRcParam eParam); +int cviEncRc_SetParam(stRcInfo *pRcInfo, EncOpenParam *pEncOP, eRcParam eParam); + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_h264_dec.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_h264_dec.c new file mode 100644 index 0000000000..d4409b2d9c --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_h264_dec.c @@ -0,0 +1,117 @@ +//--=========================================================================-- +// This file is a part of VPUAPI +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2004 - 2014 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//----------------------------------------------------------------------------- +#ifdef ENABLE_DEC +#ifdef VC_DRIVER_TEST +#include +#include + +#include "cvi_vc_drv.h" +#include "cvi_vc_drv_proc.h" +#include "vcodec_cb.h" +#include "cvi_vc_getopt.h" + +#include "vpuapifunc.h" +#include "main_helper.h" +#include "cvi_vcodec_lib.h" +#include "cvi_dec_internal.h" +#include "cvi_h265_interface.h" + +BOOL h264_TestDecoder(cviVideoDecoder *pvdec) +{ + int decStatus; + + /******************************************************************************** + * PIC_RUN * + ********************************************************************************/ + while (TRUE) { + decStatus = (CVI_DEC_STATUS)cviVDecDecOnePic(pvdec, NULL, + H26X_BLOCK_MODE); + if (decStatus == CVI_VDEC_RET_CONTI) { + CVI_VC_TRACE("CVI_VDEC_RET_CONTI\n"); + continue; + } else if (decStatus == CVI_VDEC_RET_STOP) { + CVI_VC_TRACE("CVI_VDEC_RET_STOP\n"); + break; + } else if (decStatus == CVI_VDEC_RET_LAST_FRM) { + CVI_VC_TRACE("CVI_VDEC_RET_LAST_FRM\n"); + break; + } else if (decStatus == CVI_VDEC_RET_DEC_ERR) { + CVI_VC_ERR("decStatus = %d\n", decStatus); + return CVI_VDEC_RET_DEC_ERR; + } + } + + pvdec->success = TRUE; + + return (pvdec->success == TRUE); +} + +int h264_dec_main(int argc, char **argv) +{ + cviInitDecConfig initDecCfg, *pInitDecCfg; + cviVideoDecoder *pvdec; + Int32 ret = FALSE; + CVI_DEC_STATUS decStatus; + + pInitDecCfg = &initDecCfg; + memset(pInitDecCfg, 0, sizeof(cviInitDecConfig)); + pInitDecCfg->cviApiMode = API_MODE_DRIVER; + pInitDecCfg->codec = CODEC_H264; + pInitDecCfg->argc = argc; + pInitDecCfg->argv = argv; + + decStatus = cviVDecOpen(pInitDecCfg, (void *)&pvdec); + if (decStatus < 0) { + CVI_VC_ERR("cviVDecOpen, %d\n", decStatus); + return 1; + } + + ret = h264_TestDecoder(pvdec); + + cviVDecClose((void *)pvdec); + + return ret == TRUE ? 0 : 1; +} + +int h264_dec_test(u_long arg) +{ +#define MAX_ARG_CNT 30 + char buf[512]; + char *pArgv[MAX_ARG_CNT] = {0}; + char *save_ptr; + unsigned int u32Argc = 0; + char *pBuf; + unsigned int __user *argp = (unsigned int __user *)arg; + + memset(buf, 0, 512); + if (argp != NULL) { + if (copy_from_user(buf, (char *)argp, 512)) + return -1; + } + pBuf = buf; + + while (NULL != (pArgv[u32Argc] = cvi_strtok_r(pBuf, " ", &save_ptr))) { + u32Argc++; + if (u32Argc >= MAX_ARG_CNT) { + break; + } + pBuf = NULL; + } + + return h264_dec_main(u32Argc, pArgv); +} +#endif +#endif \ No newline at end of file diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_h265_dec.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_h265_dec.c new file mode 100644 index 0000000000..cc39278177 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_h265_dec.c @@ -0,0 +1,120 @@ +//------------------------------------------------------------------------------ +// File: main.c +// +// Copyright (c) 2006, Chips & Media. All rights reserved. +//------------------------------------------------------------------------------ +#ifdef ENABLE_DEC +#ifdef VC_DRIVER_TEST +#include +#include + +#include "cvi_vc_drv.h" +#include "cvi_vc_drv_proc.h" +#include "vcodec_cb.h" +#include "cvi_vc_getopt.h" + +#include "vdi_osal.h" +#include "config.h" +#include "main_helper.h" +#include "vpuapifunc.h" +#include "cvi_vcodec_lib.h" +#include "cvi_dec_internal.h" +#include "cvi_h265_interface.h" + +#define STREAM_BUF_SIZE_HEVC \ + 0xA00000 // max bitstream size(HEVC:10MB,VP9:not specified) +#define STREAM_BUF_SIZE_VP9 \ + 0x1400000 // max bitstream size(HEVC:10MB,VP9:not specified) +#define USERDATA_BUFFER_SIZE (512 * 1024) +#define EXTRA_FRAME_BUFFER_NUM 1 +#define MAX_SEQUENCE_MEM_COUNT 16 +#define MAX_NOT_DEC_COUNT 200 +#define NUM_VCORES 1 +#define FEEDING_SIZE 0x20000 + +BOOL h265_TestDecoder(cviVideoDecoder *pvdec) +{ + int decStatus; + + /******************************************************************************** + * PIC_RUN * + ********************************************************************************/ + while (TRUE) { + decStatus = (CVI_DEC_STATUS)cviVDecDecOnePic(pvdec, NULL, + H26X_BLOCK_MODE); + if (decStatus == CVI_VDEC_RET_CONTI) { + CVI_VC_TRACE("CVI_VDEC_RET_CONTI\n"); + continue; + } else if (decStatus == CVI_VDEC_RET_STOP) { + CVI_VC_TRACE("CVI_VDEC_RET_STOP\n"); + break; + } else if (decStatus == CVI_VDEC_RET_LAST_FRM) { + CVI_VC_TRACE("CVI_VDEC_RET_LAST_FRM\n"); + break; + } else if (decStatus == CVI_VDEC_RET_DEC_ERR) { + CVI_VC_ERR("decStatus = %d\n", decStatus); + return CVI_VDEC_RET_DEC_ERR; + } + } + + pvdec->success = TRUE; + + return (pvdec->success == TRUE); +} + +int h265_dec_main(int argc, char **argv) +{ + cviInitDecConfig initDecCfg, *pInitDecCfg; + cviVideoDecoder *pvdec; + Int32 ret = FALSE; + CVI_DEC_STATUS decStatus; + + pInitDecCfg = &initDecCfg; + memset(pInitDecCfg, 0, sizeof(cviInitDecConfig)); + pInitDecCfg->cviApiMode = API_MODE_DRIVER; + pInitDecCfg->codec = CODEC_H265; + pInitDecCfg->argc = argc; + pInitDecCfg->argv = argv; + + decStatus = cviVDecOpen(pInitDecCfg, (void *)&pvdec); + if (decStatus < 0) { + CVI_VC_ERR("cviVDecOpen, %d\n", decStatus); + return 1; + } + + ret = h265_TestDecoder(pvdec); + + cviVDecClose((void *)pvdec); + + return ret == TRUE ? 0 : 1; +} + +int h265_dec_test(u_long arg) +{ +#define MAX_ARG_CNT 30 + char buf[512]; + char *pArgv[MAX_ARG_CNT] = {0}; + char *save_ptr; + unsigned int u32Argc = 0; + char *pBuf; + unsigned int __user *argp = (unsigned int __user *)arg; + + memset(buf, 0, 512); + if (argp != NULL) { + if (copy_from_user(buf, (char *)argp, 512)) + return -1; + } + pBuf = buf; + + while (NULL != (pArgv[u32Argc] = cvi_strtok_r(pBuf, " ", &save_ptr))) { + u32Argc++; + if (u32Argc >= MAX_ARG_CNT) { + break; + } + pBuf = NULL; + } + + return h265_dec_main(u32Argc, pArgv); +} +#endif +#endif \ No newline at end of file diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_vcodec_lib.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_vcodec_lib.c new file mode 100644 index 0000000000..6af2b69836 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_vcodec_lib.c @@ -0,0 +1,102 @@ +/* + * Copyright Cvitek Technologies Inc. + * + * Created Time: July, 2020 + */ +#include "cvi_vcodec_lib.h" +#include "vdi_osal.h" + +#ifdef CLI_DEBUG_SUPPORT +#include "tcli.h" + +void vcodec_register_cmd(void); +#endif + +static atomic_t vcodecInited = ATOMIC_INIT(false); + +unsigned int vcodec_mask = CVI_MASK_CURR; +unsigned int vcodec_level; +module_param(vcodec_mask, uint, 0644); +module_param(vcodec_level, uint, 0644); + +bool addrRemapEn; +module_param(addrRemapEn, bool, 0644); +bool ARMode = AR_MODE_OFFSET; +module_param(ARMode, bool, 0644); +uint ARExtraLine = AR_DEFAULT_EXTRA_LINE; +module_param(ARExtraLine, uint, 0644); + +int cviVcodecInit(void) +{ + bool expect = false; + + if (atomic_cmpxchg(&vcodecInited, expect, true)) { + CVI_VC_INFO("vcodecInited\n"); + return -1; + } + +#ifdef CLI_DEBUG_SUPPORT + TcliInit(); + vcodec_register_cmd(); +#endif + + cvi_vdi_init(); + + cviVcodecMask(); + + return 0; +} + +void cviVcodecMask(void) +{ + SetMaxLogLevel(vcodec_level); + + CVI_VC_TRACE("max_log_level = %d\n", GetMaxLogLevel()); +} + +int cviVcodecGetEnv(char *envVar) +{ + if (strcmp(envVar, "addrRemapEn") == 0) + return addrRemapEn; + + if (strcmp(envVar, "ARMode") == 0) + return ARMode; + + if (strcmp(envVar, "ARExtraLine") == 0) + return ARExtraLine; + + return -1; +} + +int cviSetCoreIdx(int *pCoreIdx, CodStd stdMode) +{ + if (stdMode == STD_HEVC) + *pCoreIdx = CORE_H265; + else if (stdMode == STD_AVC) + *pCoreIdx = CORE_H264; + else { + CVI_VC_ERR("stdMode = %d\n", stdMode); + return -1; + } + + CVI_VC_TRACE("stdMode = %d, coreIdx = %d\n", stdMode, *pCoreIdx); + + return 0; +} + +Uint64 cviGetCurrentTime(void) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + struct timespec64 ts; +#else + struct timespec ts; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + ktime_get_ts64(&ts); +#else + ktime_get_ts(&ts); +#endif + + return ts.tv_sec * 1000000 + ts.tv_nsec / 1000; // in us +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_vcodec_lib.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_vcodec_lib.h new file mode 100644 index 0000000000..93fb6df249 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_vcodec_lib.h @@ -0,0 +1,29 @@ +/* + * Copyright Cvitek Technologies Inc. + * + * Created Time: May, 2020 + */ + +#ifndef __CVI_VCODEC_LIB_H__ +#define __CVI_VCODEC_LIB_H__ + +#include "vpuapi.h" +#include "product.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define AR_DEFAULT_EXTRA_LINE 512 + +int cviVcodecInit(void); +void cviVcodecMask(void); +int cviVcodecGetEnv(char *envVar); +int cviSetCoreIdx(int *pCoreIdx, CodStd stdMode); +Uint64 cviGetCurrentTime(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_vdec_api.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_vdec_api.c new file mode 100644 index 0000000000..3da87bfa4e --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/cvi/cvi_vdec_api.c @@ -0,0 +1,462 @@ +/* + * Copyright Cvitek Technologies Inc. + * + * Created Time: July, 2020 + */ +#ifdef ENABLE_DEC +#include "vdi_osal.h" +#include "cvi_dec_internal.h" +#include "product.h" +#include "cvi_h265_interface.h" + +#define IS_VALID_PA(pa) (((pa) != 0) && ((pa) != (PhysicalAddress)(-1))) + +static int _cviVDecOpen(cviInitDecConfig *pInitDecCfg, void *pHandle); + +int cviVDecOpen(cviInitDecConfig *pInitDecCfg, void *pHandle) +{ + cviVideoDecoder **ppvdec = (cviVideoDecoder **)pHandle; + CVI_DEC_STATUS decStatus; + Uint32 core_idx = + pInitDecCfg->codec == CODEC_H265 ? CORE_H265 : CORE_H264; + + decStatus = cviVcodecInit(); + if (decStatus < 0) { + CVI_VC_INFO("cviVcodecInit, %d\n", decStatus); + } + + CVI_VC_IF("\n"); + + decStatus = _cviVDecOpen(pInitDecCfg, pHandle); + if (decStatus < 0) { + CVI_VC_ERR("_cviVDecOpen, %d\n", decStatus); + } + + if (decStatus == CVI_ERR_ALLOC_VDEC) { + EnterVcodecLock(core_idx); + goto CVI_VDEC_API_ERR_ALLOC_VDEC; + } else if (decStatus == CVI_ERR_DEC_ARGV) { + EnterVcodecLock(core_idx); + goto CVI_VDEC_API_ARGV; + } else if (decStatus == CVI_ERR_DEC_MCU) { + EnterVcodecLock(core_idx); + goto CVI_VDEC_API_MCU; + } else if (decStatus == CVI_ERR_DEC_INIT) { + EnterVcodecLock(core_idx); + goto CVI_VDEC_API_INIT; + } else if (decStatus == CVI_ERR_DECODE_END) { + EnterVcodecLock(core_idx); + goto CVI_VDEC_API_DECODE_END; + } + + return decStatus; + +CVI_VDEC_API_DECODE_END: + cviCloseDecoder(*ppvdec); +CVI_VDEC_API_INIT: + cviDeInitDecoder(*ppvdec); +CVI_VDEC_API_MCU: + cviFreeDecMcuEnv(*ppvdec); +CVI_VDEC_API_ARGV: + cviFreeVideoDecoder(ppvdec); +CVI_VDEC_API_ERR_ALLOC_VDEC: + + LeaveVcodecLock(core_idx); + + return decStatus; +} + +static int _cviVDecOpen(cviInitDecConfig *pInitDecCfg, void *pHandle) +{ + cviVideoDecoder **ppvdec = (cviVideoDecoder **)pHandle; + cviVideoDecoder *pvdec; + cviDecConfig *pdeccfg; + CVI_DEC_STATUS decStatus; + int ret; + Uint32 core_idx = + pInitDecCfg->codec == CODEC_H265 ? CORE_H265 : CORE_H264; + + *ppvdec = cviAllocVideoDecoder(); + if (!(*ppvdec)) { + CVI_VC_ERR("cviAllocVideoDecoder\n"); + return CVI_ERR_ALLOC_VDEC; + } + pvdec = *ppvdec; + + pdeccfg = &pvdec->decConfig; + pvdec->cviApiMode = pInitDecCfg->cviApiMode; + pvdec->chnNum = pInitDecCfg->chnNum; + + if (pInitDecCfg->codec == CODEC_H265) + pdeccfg->bitFormat = STD_HEVC; + else if (pInitDecCfg->codec == CODEC_H264) + pdeccfg->bitFormat = STD_AVC; +#ifdef VC_DRIVER_TEST + if (pvdec->cviApiMode == API_MODE_DRIVER) { + + ret = parseVdecArgs(pInitDecCfg->argc, pInitDecCfg->argv, pdeccfg); + if (ret < 0) { + CVI_VC_ERR("parseArgs, %d\n", ret); + return CVI_ERR_DEC_ARGV; + } + + } else +#endif + { + pdeccfg->bsSize = pInitDecCfg->bsBufferSize; + } + + pvdec->eVdecVBSource = pInitDecCfg->vbSrcMode; + pvdec->ReorderEnable = pInitDecCfg->reorderEnable; + initDefaultcDecConfig(pvdec); + + ret = cviInitDecMcuEnv(pdeccfg); + if (ret < 0) { + CVI_VC_ERR("cviInitDecMcuEnv, ret = %d\n", ret); + return CVI_ERR_DEC_MCU; + } + + checkDecConfig(pdeccfg); + + EnterVcodecLock(core_idx); + decStatus = cviInitDecoder(pvdec); + LeaveVcodecLock(core_idx); + + if (decStatus == CVI_ERR_DEC_INIT) { + CVI_VC_ERR("CVI_ERR_DEC_INIT\n"); + return CVI_ERR_DEC_INIT; + } else if (decStatus == CVI_ERR_DECODE_END) { + CVI_VC_ERR("CVI_ERR_DECODE_END\n"); + return CVI_ERR_DECODE_END; + } else if (decStatus < 0) { + CVI_VC_ERR("decStatus = %d\n", decStatus); + return decStatus; + } + + pvdec->success = FALSE; + + return 0; +} + +int cviVDecClose(void *pHandle) +{ + cviVideoDecoder *pvdec = (cviVideoDecoder *)pHandle; + Uint32 core_idx = pvdec->decConfig.coreIdx; + + CVI_VC_IF("\n"); + + EnterVcodecLock(core_idx); + + cviCloseDecoder(pvdec); + cviDeInitDecoder(pvdec); + cviFreeDecMcuEnv(pvdec); + cviFreeVideoDecoder(&pvdec); + + LeaveVcodecLock(core_idx); + + return 0; +} + +static int cviVDecLock(int core_idx, int timeout_ms) +{ + int err; + int ret = RETCODE_SUCCESS; + + if (timeout_ms <= -1) { + //block mode + EnterVcodecLock(core_idx); + } else { + //time lock mode + err = VcodecTimeLock(core_idx, timeout_ms); + if (err != RETCODE_SUCCESS) { + if (err == RETCODE_VPU_RESPONSE_TIMEOUT) { + //timeout + ret = RETCODE_VPU_RESPONSE_TIMEOUT; + } else { + //never been lock success + CVI_VC_ERR("VcodecTimeLock abnormal ret:%d\n", + ret); + ret = RETCODE_FAILURE; + } + } + } + return ret; +} + +int cviVDecReset(void *pHandle) +{ + cviVideoDecoder *pvdec = (cviVideoDecoder *)pHandle; + Uint32 core_idx = pvdec->decConfig.coreIdx; + CVI_DEC_STATUS decStatus; + cviDecConfig *pdeccfg; + Int32 cviApiMode; + Int32 chnNum; + E_CVI_VB_SOURCE eVdecVBSource; + Int32 bitFormat; + size_t bsSize; + Uint32 sizeInWord; + Uint16 *pusBitCode; + Int32 ReorderEnable; + + CVI_VC_IF("\n"); + + EnterVcodecLock(core_idx); + + // record previous settings + cviApiMode = pvdec->cviApiMode; + chnNum = pvdec->chnNum; + eVdecVBSource = pvdec->eVdecVBSource; + + pdeccfg = &pvdec->decConfig; + bitFormat = pdeccfg->bitFormat; + bsSize = pdeccfg->bsSize; + sizeInWord = pdeccfg->sizeInWord; + pusBitCode = pdeccfg->pusBitCode; + ReorderEnable = pdeccfg->reorderEnable; + + cviCloseDecoder(pvdec); + cviDeInitDecoder(pvdec); + + memset(pvdec, 0, sizeof(cviVideoDecoder)); + + pvdec->cviApiMode = cviApiMode; + pvdec->chnNum = chnNum; + pvdec->eVdecVBSource = eVdecVBSource; + pvdec->ReorderEnable = ReorderEnable; + + pdeccfg->bitFormat = bitFormat; + pdeccfg->bsSize = bsSize; + + initDefaultcDecConfig(pvdec); + + pdeccfg->coreIdx = core_idx; + pdeccfg->sizeInWord = sizeInWord; + pdeccfg->pusBitCode = pusBitCode; + + checkDecConfig(pdeccfg); + + decStatus = cviInitDecoder(pvdec); + if (decStatus < 0) { + CVI_VC_ERR("decStatus = %d\n", decStatus); + LeaveVcodecLock(core_idx); + return decStatus; + } + + LeaveVcodecLock(core_idx); + + return 0; +} + +int cviVDecDecOnePic(void *pHandle, cviDecOnePicCfg *pdopc, int timeout_ms) +{ + cviVideoDecoder *pvdec = (cviVideoDecoder *)pHandle; + cviDecConfig *pdeccfg = &pvdec->decConfig; + CVI_DEC_STATUS decStatus; + int ret; + + CVI_VC_IF("\n"); + //EnterVcodecLock(pdeccfg->coreIdx); + ret = cviVDecLock(pdeccfg->coreIdx, timeout_ms); + + if (ret != RETCODE_SUCCESS) { + CVI_VC_TRACE("cviVDecLock, ret = %d\n", ret); + if (ret == RETCODE_VPU_RESPONSE_TIMEOUT) { + return CVI_VDEC_RET_LOCK_TIMEOUT; + //timeout return + } else { + CVI_VC_ERR("cviVDecLock error[%d]timeout_ms[%d]\n", + ret, timeout_ms); + return CVI_VDEC_RET_STOP; + } + } + + if (pvdec->cviApiMode == API_MODE_SDK) { + cviSdkParam *psdkp = &pvdec->sdkParam; + + if (!pdopc) { + CVI_VC_ERR("pdopc NULL, CVI_ERR_DECODE_END\n"); + decStatus = CVI_ERR_DECODE_END; + goto ERR_CVI_VDEC_DEC_ONEPIC; + } + + psdkp->bsBuf.virt_addr = pdopc->bsAddr; + psdkp->bsBuf.size = pdopc->bsLen; + pvdec->bStreamOfEnd = pdopc->bEndOfStream; + pdeccfg->cbcrInterleave = pdopc->cbcrInterleave; + pdeccfg->nv21 = pdopc->nv21; + + CVI_VC_BS("virt_addr = %p, size = %d, bStreamOfEnd = %d\n", + psdkp->bsBuf.virt_addr, psdkp->bsBuf.size, + pvdec->bStreamOfEnd); + } + + if (pvdec->frameNum == 0 && pvdec->seqInited == FALSE) { + decStatus = cviInitSeqSetting(pvdec); + if (decStatus == CVI_ERR_DECODE_END) { + CVI_VC_ERR("CVI_ERR_DECODE_END\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else { + CVI_VC_TRACE("decStatus = %d\n", decStatus); + } + } + +SEQ_CHANGE_FLUSH: + decStatus = cviDecodeOneFrame(pvdec); + if (decStatus == CVI_DECODE_CONTINUE) { + CVI_VC_TRACE("CVI_DECODE_CONTINUE\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else if (decStatus == CVI_ERR_DECODE_END) { + CVI_VC_ERR("CVI_ERR_DECODE_END\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else if (decStatus == CVI_DECODE_NO_FB) { + CVI_VC_TRACE("CVI_DECODE_NO_FB\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else { + CVI_VC_TRACE("decStatus = %d\n", decStatus); + } + + decStatus = cviWaitInterrupt(pvdec); + if (decStatus == CVI_DECODE_CONTINUE) { + CVI_VC_TRACE("CVI_DECODE_CONTINUE\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else if (decStatus == CVI_ERR_DECODE_END) { + CVI_VC_ERR("CVI_ERR_DECODE_END\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else if (decStatus == CVI_WAIT_INT_OK) { + CVI_VC_TRACE("CVI_WAIT_INT_OK\n"); + } else { + CVI_VC_TRACE("decStatus = %d\n", decStatus); + } + + decStatus = cviGetDecodedData(pvdec); + if (decStatus == CVI_DECODE_CONTINUE) { + CVI_VC_TRACE("CVI_DECODE_CONTINUE\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else if (decStatus == CVI_DECODE_BREAK) { + CVI_VC_TRACE("CVI_DECODE_BREAK\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else if (decStatus == CVI_ERR_DECODE_END) { + CVI_VC_ERR("CVI_ERR_DECODE_END\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else if (decStatus == CVI_DECODE_NO_FB) { + CVI_VC_TRACE("CVI_DECODE_NO_FB\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else if (decStatus == CVI_DECODE_NO_FB_WITH_DISP) { + CVI_VC_TRACE("CVI_DECODE_NO_FB_WITH_DISP\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } else if (decStatus == CVI_SEQ_CHANGE) { + CVI_VC_TRACE("CVI_SEQ_CHANGE\n"); + goto SEQ_CHANGE_FLUSH; + } else if (decStatus == CVI_SEQ_CHG_FLUSH) { + CVI_VC_TRACE("CVI_SEQ_CHG_FLUSH\n"); + goto SEQ_CHANGE_FLUSH; + } else if (decStatus == CVI_SEQ_CHG_WAIT_BUF_FREE) { + CVI_VC_TRACE("CVI_SEQ_CHG_WAIT_BUF_FREE\n"); + goto ERR_CVI_VDEC_DEC_ONEPIC; + } + + pvdec->frameNum++; + +ERR_CVI_VDEC_DEC_ONEPIC: + switch (decStatus) { + case CVI_DECODE_CONTINUE: + ret = CVI_VDEC_RET_CONTI; + break; + case CVI_ERR_DECODE_END: + ret = CVI_VDEC_RET_DEC_ERR; + break; + case CVI_DECODE_BREAK: + ret = CVI_VDEC_RET_STOP; + break; + case CVI_DECODE_NO_FB: + case CVI_SEQ_CHG_WAIT_BUF_FREE: + ret = CVI_VDEC_RET_NO_FB; + break; + case CVI_DECODE_NO_FB_WITH_DISP: + ret = CVI_VDEC_RET_NO_FB_WITH_DISP; + break; + case CVI_DECODE_DATA_OK: + ret = CVI_VDEC_RET_FRM_DONE; + break; + case CVI_DISP_LAST_FRM: + ret = CVI_VDEC_RET_LAST_FRM; + break; + default: + ret = CVI_DECODE_CONTINUE; + break; + } + + LeaveVcodecLock(pdeccfg->coreIdx); + + return ret; +} + +int cviVDecGetFrame(void *pHandle, cviDispFrameCfg *pdfc) +{ + cviVideoDecoder *pvdec = (cviVideoDecoder *)pHandle; + DecOutputInfo outputInfo, *pdoi = &outputInfo; + FrameBuffer *fb; + void *pDispInfo; + + CVI_VC_IF("\n"); + + pDispInfo = cviGetDispFrame(pvdec->renderer, pdoi); + + if (!pDispInfo) { + CVI_VC_WARN("no frame\n"); + return -1; + } + + fb = &pdoi->dispFrame; + pdfc->phyAddrY = fb->bufY; + pdfc->phyAddrCb = fb->bufCb; + + if (IS_VALID_PA(fb->bufCr)) { + pdfc->phyAddrCr = fb->bufCr; + } else { + pdfc->phyAddrCr = 0; + pdfc->addrCr = NULL; + } + + pdfc->width = pvdec->sequenceInfo.picCropRect.right; + pdfc->height = pvdec->sequenceInfo.picCropRect.bottom; + + pdfc->strideY = fb->stride; + pdfc->strideC = fb->cbcrInterleave ? fb->stride : (fb->stride >> 1); + pdfc->cbcrInterleave = fb->cbcrInterleave; + pdfc->nv21 = fb->nv21; + pdfc->indexFrameDisplay = pdoi->indexFrameDisplay; + CVI_VC_DISP("width = %d, height = %d\n", fb->width, fb->height); + pdfc->decHwTime = pdoi->decHwTime; + + return 0; +} + +void cviVDecReleaseFrame(void *pHandle, void *arg) +{ + cviVideoDecoder *pvdec = (cviVideoDecoder *)pHandle; + + CVI_VC_IF("\n"); + + cviReleaseDispFrameSDK(pvdec->renderer, arg); +} + +void cviVDecAttachFrmBuf(void *pHandle, void *pFrmBufArray, int nFrmNum) +{ + cviVideoDecoder *pvdec = (cviVideoDecoder *)pHandle; + + CVI_VC_IF("\n"); + + cviAttachFrmBuf(pvdec, pFrmBufArray, nFrmNum); +} + +void cviVDecAttachCallBack(CVI_VDEC_DRV_CALLBACK pCbFunc) +{ + if (pCbFunc == NULL) { + CVI_VC_ERR("pCbFunc == NULL\n"); + return; + } + + cviDecAttachCallBack(pCbFunc); +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/debug/vcodec_debug.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/debug/vcodec_debug.c new file mode 100644 index 0000000000..022b1f5a5f --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/debug/vcodec_debug.c @@ -0,0 +1,599 @@ +#ifdef CLI_DEBUG_SUPPORT +#include +#include +#include +#include "tcli.h" +#include "../vdi/vdi.h" +#include "../vdi/vdi_osal.h" +#include "../vpuapi/vpuapifunc.h" +#include "../sample/cvitest_internal.h" + +#ifndef UNUSED +#define UNUSED(x) //((void)(x)) +#endif + +static int bVcodecCliReg; +static pthread_mutex_t vcodecCliMutex = PTHREAD_MUTEX_INITIALIZER; + +static int showVpuReg(int32_t argc, char *argv[]) +{ + int coreIdx = 0; + int idx = 0; + + if (argc != 2) { + tcli_print("usage:%s num\n", argv[0]); + return -1; + } + + coreIdx = atoi(argv[1]) ? 1 : 0; + tcli_print("show coreid = %d regs from hw:\n", coreIdx); + tcli_print("0x%04X %llX\n", idx, VpuReadReg(coreIdx, idx + 0)); + tcli_print("0x%04X %llX\n", idx + 0x4, VpuReadReg(coreIdx, idx + 0x4)); + tcli_print("0x%04X %llX\n", idx + 0x8, VpuReadReg(coreIdx, idx + 0x8)); + tcli_print("0x%04X %llX\n", idx + 0xC, VpuReadReg(coreIdx, idx + 0xC)); + tcli_print("0x%04X %llX\n", idx + 0x010, + VpuReadReg(coreIdx, idx + 0x010)); + tcli_print("0x%04X %llX\n", idx + 0x014, + VpuReadReg(coreIdx, idx + 0x014)); + tcli_print("0x%04X %llX\n", idx + 0x018, + VpuReadReg(coreIdx, idx + 0x018)); + tcli_print("0x%04X %llX\n", idx + 0x024, + VpuReadReg(coreIdx, idx + 0x024)); + tcli_print("0x%04X %llX\n", idx + 0x034, + VpuReadReg(coreIdx, idx + 0x034)); + + for (idx = 0x100; idx <= 0x200; idx += 0x10) { + tcli_print("0x%04X %011llX %011llX %011llX\t %011llX\n", + idx, VpuReadReg(coreIdx, idx), + VpuReadReg(coreIdx, idx + 0x4), + VpuReadReg(coreIdx, idx + 0x8), + VpuReadReg(coreIdx, idx + 0xC)); + } + + return 0; +} + +static int vcodecModMaskDebug(int32_t argc, char *argv[]) +{ + int dbg_mask_tmp = 0; + + if (argc != 2) { + tcli_print("usage:%s mask_value\n", argv[0]); + tcli_print("current dbg_mask=%#x\n", dbg_mask); + return -1; + } + + dbg_mask_tmp = (int)atoi(argv[1]); + dbg_mask = dbg_mask_tmp; + tcli_print("set suc,current dbg_mask=%#x\n", dbg_mask); + + return 0; +} + +void showCodecInstPoolInfo(CodecInst *pCodecInst) +{ + if (pCodecInst && pCodecInst->inUse) { + tcli_print("================start=================\n"); + tcli_print("inUse:%d\n", pCodecInst->inUse); + tcli_print("instIndex:%d\n", pCodecInst->instIndex); + tcli_print("coreIdx:%d\n", pCodecInst->coreIdx); + tcli_print("codecMode:%d\n", pCodecInst->codecMode); + tcli_print("codecModeAux:%d\n", pCodecInst->codecModeAux); + tcli_print("productId:%d\n", pCodecInst->productId); +#ifdef ENABLE_CNM_DEBUG_MSG + tcli_print("loggingEnable:%d\n", pCodecInst->loggingEnable); +#endif + tcli_print("isDecoder:%s\n", + pCodecInst->isDecoder ? "decode" : "encode"); + tcli_print("state:%d\n", pCodecInst->state); + + if (!pCodecInst->isDecoder) { //enc + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + + tcli_print("encInfo:\n"); + tcli_print(" bitRate:%d\n", + pEncInfo->openParam.bitRate); + tcli_print(" bitstreamBufferSize:%d\n", + pEncInfo->openParam.bitstreamBufferSize); + tcli_print(" picWidth:%d\n", + pEncInfo->openParam.picWidth); + tcli_print(" picHeight:%d\n", + pEncInfo->openParam.picHeight); + tcli_print(" frameSkipDisable:%d\n", + pEncInfo->openParam.frameSkipDisable); + tcli_print(" ringBufferEnable:%d\n", + pEncInfo->openParam.ringBufferEnable); + tcli_print(" frameRateInfo:%d\n", + pEncInfo->openParam.frameRateInfo); + tcli_print(" gopSize:%d\n", + pEncInfo->openParam.gopSize); + tcli_print(" initialDelay:%d\n", + pEncInfo->openParam.initialDelay); + tcli_print(" changePos:%d\n", + pEncInfo->openParam.changePos); + + tcli_print(" minFrameBufferCount:%d\n", + pEncInfo->initialInfo.minFrameBufferCount); + tcli_print(" minSrcFrameCount:%d\n", + pEncInfo->initialInfo.minSrcFrameCount); + + tcli_print(" streamBufSize:%d\n", + pEncInfo->streamBufSize); + tcli_print(" linear2TiledEnable:%d\n", + pEncInfo->linear2TiledEnable); + tcli_print(" linear2TiledMode:%d\n", + pEncInfo->linear2TiledMode); + tcli_print(" mapType:%d\n", pEncInfo->mapType); + tcli_print(" stride:%d\n", + pEncInfo->frameBufPool[0].stride); + tcli_print(" myIndex:%d\n", + pEncInfo->frameBufPool[0].myIndex); + tcli_print(" width:%d\n", + pEncInfo->frameBufPool[0].width); + tcli_print(" height:%d\n", + pEncInfo->frameBufPool[0].height); + tcli_print(" size:%d\n", + pEncInfo->frameBufPool[0].size); + tcli_print(" format:%d\n", + pEncInfo->frameBufPool[0].format); + tcli_print(" vbFrame_size:%d\n", + pEncInfo->vbFrame.size); + tcli_print(" vbPPU_size:%d\n", pEncInfo->vbPPU.size); + tcli_print(" streamBufSize:%d\n", + pEncInfo->frameAllocExt); + tcli_print(" ppuAllocExt:%d\n", pEncInfo->ppuAllocExt); + tcli_print(" numFrameBuffers:%d\n", + pEncInfo->numFrameBuffers); + tcli_print(" ActivePPSIdx:%d\n", + pEncInfo->ActivePPSIdx); + tcli_print(" frameIdx:%d\n", pEncInfo->frameIdx); + + if (pCodecInst->coreIdx) { + int ActivePPSIdx = pEncInfo->ActivePPSIdx; + EncAvcParam *pAvcParam = + &pEncInfo->openParam.EncStdParam + .avcParam; + AvcPpsParam *ActivePPS = + &pAvcParam->ppsParam[ActivePPSIdx]; + + tcli_print(" entropyCodingMode:%d\n", + ActivePPS->entropyCodingMode); + tcli_print(" transform8x8Mode:%d\n", + ActivePPS->transform8x8Mode); + tcli_print(" profile:%d\n", pAvcParam->profile); + tcli_print(" fieldFlag:%d\n", + pAvcParam->fieldFlag); + tcli_print(" chromaFormat400:%d\n", + pAvcParam->chromaFormat400); + } + + tcli_print(" numFrameBuffers:%d\n", + pEncInfo->numFrameBuffers); + tcli_print(" stride:%d\n", pEncInfo->stride); + tcli_print(" frameBufferHeight:%d\n", + pEncInfo->frameBufferHeight); + tcli_print(" rotationEnable:%d\n", + pEncInfo->rotationEnable); + tcli_print(" mirrorEnable:%d\n", + pEncInfo->mirrorEnable); + tcli_print(" mirrorDirection:%d\n", + pEncInfo->mirrorDirection); + tcli_print(" rotationAngle:%d\n", + pEncInfo->rotationAngle); + tcli_print(" initialInfoObtained:%d\n", + pEncInfo->initialInfoObtained); + tcli_print(" ringBufferEnable:%d\n", + pEncInfo->ringBufferEnable); + tcli_print(" mirrorEnable:%d\n", + pEncInfo->mirrorEnable); + tcli_print(" encoded_frames_in_gop:%d\n", + pEncInfo->encoded_frames_in_gop); + + tcli_print(" lineBufIntEn:%d\n", + pEncInfo->lineBufIntEn); + tcli_print(" bEsBufQueueEn:%d\n", + pEncInfo->bEsBufQueueEn); + tcli_print(" vbWork_size:%d\n", pEncInfo->vbWork.size); + tcli_print(" vbScratch_size:%d\n", + pEncInfo->vbScratch.size); + tcli_print(" vbTemp_size:%d\n", pEncInfo->vbTemp.size); + tcli_print(" vbMV_size:%d\n", pEncInfo->vbMV.size); + tcli_print(" vbFbcYTbl_size:%d\n", + pEncInfo->vbFbcYTbl.size); + tcli_print(" vbFbcCTbl_size:%d\n", + pEncInfo->vbFbcCTbl.size); + tcli_print(" vbSubSamBuf_size:%d\n", + pEncInfo->vbSubSamBuf.size); + tcli_print(" errorReasonCode:%d\n", + pEncInfo->errorReasonCode); + tcli_print(" curPTS:%llu\n", pEncInfo->curPTS); + tcli_print(" instanceQueueCount:%d\n", + pEncInfo->instanceQueueCount); +#ifdef SUPPORT_980_ROI_RC_LIB + tcli_print(" gop_size:%d\n", pEncInfo->gop_size); + tcli_print(" max_latency_pictures:%d\n", + pEncInfo->max_latency_pictures); +#endif + tcli_print(" force_as_long_term_ref:%d\n", + pEncInfo->force_as_long_term_ref); + tcli_print(" pic_ctu_avg_qp:%d\n", + pEncInfo->pic_ctu_avg_qp); + } else { //dec + DecInfo *pDecInfo = &pCodecInst->CodecInfo->decInfo; + + tcli_print("decInfo:\n"); + tcli_print(" bitstreamBufferSize:%d\n", + pDecInfo->openParam.bitstreamBufferSize); + tcli_print(" streamBufSize:%d\n", + pDecInfo->streamBufSize); + tcli_print(" numFbsForDecoding:%d\n", + pDecInfo->numFbsForDecoding); + tcli_print(" wtlEnable:%d\n", pDecInfo->wtlEnable); + tcli_print(" picWidth:%d\n", + pDecInfo->initialInfo.picWidth); + tcli_print(" picHeight:%d\n", + pDecInfo->initialInfo.picHeight); + tcli_print(" wtlEnable:%d\n", pDecInfo->wtlEnable); + tcli_print(" frameBufPool_size:%d\n", + pDecInfo->frameBufPool[0].size); + tcli_print(" frameBufPool_width:%d\n", + pDecInfo->frameBufPool[0].width); + tcli_print(" frameBufPool_height:%d\n", + pDecInfo->frameBufPool[0].height); + tcli_print(" frameBufPool_format:%d\n", + pDecInfo->frameBufPool[0].format); + } + + tcli_print("rcInfo begin:\n"); + tcli_print(" rcEnable:%d\n", pCodecInst->rcInfo.rcEnable); + tcli_print(" targetBitrate:%d\n", + pCodecInst->rcInfo.targetBitrate); + tcli_print(" picAvgBit:%d\n", pCodecInst->rcInfo.picAvgBit); + tcli_print(" maximumBitrate:%d\n", + pCodecInst->rcInfo.maximumBitrate); + tcli_print(" bitrateBuffer:%d\n", + pCodecInst->rcInfo.bitrateBuffer); + tcli_print(" frameSkipBufThr:%d\n", + pCodecInst->rcInfo.frameSkipBufThr); + tcli_print(" frameSkipCnt:%d\n", + pCodecInst->rcInfo.frameSkipCnt); + tcli_print(" contiSkipNum:%d\n", + pCodecInst->rcInfo.contiSkipNum); + tcli_print(" convergStateBufThr:%d\n", + pCodecInst->rcInfo.convergStateBufThr); + tcli_print(" ConvergenceState:%d\n", + pCodecInst->rcInfo.ConvergenceState); + tcli_print(" codec:%d\n", pCodecInst->rcInfo.codec); + tcli_print(" rcMode:%d\n", pCodecInst->rcInfo.rcMode); + tcli_print(" picIMinQp:%d\n", pCodecInst->rcInfo.picIMinQp); + tcli_print(" picIMaxQp:%d\n", pCodecInst->rcInfo.picIMaxQp); + tcli_print(" picPMinQp:%d\n", pCodecInst->rcInfo.picPMinQp); + tcli_print(" picPMaxQp:%d\n", pCodecInst->rcInfo.picPMaxQp); + + tcli_print(" picMinMaxQpClipRange:%d\n", + pCodecInst->rcInfo.picMinMaxQpClipRange); + tcli_print(" lastPicQp:%d\n", pCodecInst->rcInfo.lastPicQp); + tcli_print(" rcState:%d\n", pCodecInst->rcInfo.rcState); + tcli_print(" framerate:%d\n", pCodecInst->rcInfo.framerate); + tcli_print(" maxIPicBit:%d\n", pCodecInst->rcInfo.maxIPicBit); + tcli_print("cviApiMode:%d\n", pCodecInst->cviApiMode); + tcli_print("u64StartTime:%d\n", pCodecInst->u64StartTime); + tcli_print("u64EndTime:%d\n", pCodecInst->u64EndTime); + tcli_print("================end=================\n"); + tcli_print("================memory info=================\n"); + uint32_t total_size = 0; + vpu_buffer_t vbu_comm_bf; + + vdi_get_common_memory(pCodecInst->coreIdx, &vbu_comm_bf); + tcli_print("dts common_size:%d\n", vbu_comm_bf.size); + if (!pCodecInst->isDecoder) { + tcli_print("ion bitstreamBufferSize:%d\n", + pCodecInst->CodecInfo->encInfo.openParam + .bitstreamBufferSize); + + tcli_print("ion work_buf_size:%d\n", + pCodecInst->CodecInfo->encInfo.vbWork.size); + tcli_print("TestEncConfig_size:%d\n", + sizeof(TestEncConfig)); + tcli_print("ion reconFBsize:%d\n", + pCodecInst->CodecInfo->encInfo + .frameBufPool[0] + .size); + tcli_print( + "numFrameBuffers:%d\n", + pCodecInst->CodecInfo->encInfo.numFrameBuffers); + tcli_print( + "ion vbScratch_size:%d\n", + pCodecInst->CodecInfo->encInfo.vbScratch.size); + tcli_print("sram vbTemp_size:%d\n", + pCodecInst->CodecInfo->encInfo.vbTemp.size); + tcli_print("ion vbMV_size:%d\n", + pCodecInst->CodecInfo->encInfo.vbMV.size); + tcli_print( + "ion vbFbcYTbl_size:%d\n", + pCodecInst->CodecInfo->encInfo.vbFbcYTbl.size); + tcli_print( + "ion vbFbcCTbl_size:%d\n", + pCodecInst->CodecInfo->encInfo.vbFbcCTbl.size); + tcli_print( + "ion vbSubSamBuf_size:%d\n", + pCodecInst->CodecInfo->encInfo.vbSubSamBuf.size); + total_size = + pCodecInst->CodecInfo->encInfo.openParam + .bitstreamBufferSize + + pCodecInst->CodecInfo->encInfo.vbWork.size + + sizeof(TestEncConfig) + + pCodecInst->CodecInfo->encInfo.numFrameBuffers * + pCodecInst->CodecInfo->encInfo + .frameBufPool[0] + .size + + pCodecInst->CodecInfo->encInfo.vbScratch.size + // + pCodecInst->CodecInfo->encInfo.vbTemp.size + + + pCodecInst->CodecInfo->encInfo.vbFbcYTbl.size + + pCodecInst->CodecInfo->encInfo.vbFbcCTbl.size + + pCodecInst->CodecInfo->encInfo.vbSubSamBuf.size; + tcli_print( + "currnet enc instance's total_size:%d (%d KB)\n", + total_size, total_size / 1000); + } else { + DecInfo *pDecInfo = &pCodecInst->CodecInfo->decInfo; + + tcli_print("ion bitstreamBufferSize:%d\n", + pDecInfo->openParam.bitstreamBufferSize); + tcli_print("work_buf_size:%d\n", pDecInfo->vbWork.size); + tcli_print("DecInfo_size:%d\n", sizeof(DecInfo)); + tcli_print("FrameBuffer_size:%d\n", + pDecInfo->initialInfo.picWidth * + pDecInfo->initialInfo.picHeight * + pDecInfo->numFbsForDecoding); + + total_size = pDecInfo->openParam.bitstreamBufferSize + + pDecInfo->vbWork.size + sizeof(DecInfo) + + pDecInfo->initialInfo.picWidth * + pDecInfo->initialInfo.picHeight * + pDecInfo->numFbsForDecoding; + tcli_print( + "currnet dec instance's total_size:%d (%d KB)\n", + total_size, total_size / 1000); + } + } +} + +static int vcodecH26xInstaccePoolInfo(int32_t argc, char *argv[]) +{ + int coreIdx = 0; + + if (argc != 2) { + tcli_print("usage:%s idx\n", argv[0]); + tcli_print("0: 265,1: 264", argv[0]); + return -1; + } + + coreIdx = (int)atoi(argv[1]); + + if (coreIdx > 1 || coreIdx < 0) { + tcli_print("0: 265,1: 264", argv[0]); + return -1; + } + + vdi_show_vdi_info(coreIdx); + + int i; + vpu_instance_pool_t *vip; + CodecInst *pCodecInst; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); + + if (!vip) { + tcli_print("no resource in vdi instance pool\n"); + return -1; + } + + tcli_print("show inst pool info:\n"); + + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + pCodecInst = (CodecInst *)vip->codecInstPool[i]; + + showCodecInstPoolInfo(pCodecInst); + } + + return 0; +} + +static uint32_t getVcodecMemoryInfo(int coreIdx) +{ + int i; + vpu_instance_pool_t *vip; + CodecInst *pCodecInst; + uint32_t total_size = 0; + uint32_t all_total_size = 0; + vpu_buffer_t vbu_comm_bf; + int bAddStreamSize = 0; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); + + if (!vip) { + tcli_print("no resource in vdi instance pool\n"); + return -1; + } + + tcli_print("key infomation:\n"); + tcli_print("is_single_es_buf:%d\n", vdi_get_is_single_es_buf(coreIdx)); + + vdi_get_common_memory(coreIdx, &vbu_comm_bf); + tcli_print("dts common_size:%d\n", vbu_comm_bf.size); + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + pCodecInst = (CodecInst *)vip->codecInstPool[i]; + + if (pCodecInst && pCodecInst->inUse) { + tcli_print("================%s=================\n", + pCodecInst->isDecoder ? "decode" : "encode"); + + if (!pCodecInst->isDecoder) { + EncInfo *pEncInfo = + &pCodecInst->CodecInfo->encInfo; + + tcli_print( + "ion bitstreamBufferSize:%d\n", + pEncInfo->openParam.bitstreamBufferSize); + + tcli_print("ion work_buf_size:%d\n", + pEncInfo->vbWork.size); + tcli_print("mem stTestEncoder_size:%d\n", + sizeof(stTestEncoder)); + tcli_print("ion reconFBsize:%d\n", + pEncInfo->frameBufPool[0].size); + tcli_print("numFrameBuffers:%d\n", + pEncInfo->numFrameBuffers); + tcli_print("ion vbScratch_size:%d\n", + pEncInfo->vbScratch.size); + tcli_print("sram vbTemp_size:%d\n", + pEncInfo->vbTemp.size); + tcli_print("ion vbMV_size:%d\n", + pEncInfo->vbMV.size); + tcli_print("ion vbFbcYTbl_size:%d\n", + pEncInfo->vbFbcYTbl.size); + tcli_print("ion vbFbcCTbl_size:%d\n", + pEncInfo->vbFbcCTbl.size); + tcli_print("ion vbSubSamBuf_size:%d\n", + pEncInfo->vbSubSamBuf.size); + total_size = + pEncInfo->vbWork.size + + sizeof(stTestEncoder) + + pEncInfo->numFrameBuffers * + pEncInfo->frameBufPool[0].size + + pEncInfo->vbScratch.size + + pEncInfo->vbMV.size + + pEncInfo->vbFbcYTbl.size + + pEncInfo->vbFbcCTbl.size + + pEncInfo->vbSubSamBuf.size; + if (vdi_get_is_single_es_buf(coreIdx)) { + if (!bAddStreamSize) { + total_size += + pEncInfo->openParam + .bitstreamBufferSize; + bAddStreamSize = 1; + } + } else { + total_size += + pEncInfo->openParam + .bitstreamBufferSize; + } + + tcli_print( + "currnet enc instance's total_size:%d (%d KB)\n", + total_size, total_size / 1024); + } else { + DecInfo *pDecInfo = + &pCodecInst->CodecInfo->decInfo; + + tcli_print( + "bitstreamBufferSize:%d\n", + pDecInfo->openParam.bitstreamBufferSize); + tcli_print("common_size:%d\n", + vbu_comm_bf.size); + tcli_print("work_buf_size:%d\n", + pDecInfo->vbWork.size); + tcli_print("DecInfo_size:%d\n", + sizeof(DecInfo)); + tcli_print( + "FrameBuffer_size:%d\n", + pDecInfo->initialInfo.picWidth * + pDecInfo->initialInfo.picHeight * + pDecInfo->numFbsForDecoding); + + total_size = + pDecInfo->openParam.bitstreamBufferSize + + pDecInfo->vbWork.size + + sizeof(DecInfo) + + pDecInfo->initialInfo.picWidth * + pDecInfo->initialInfo.picHeight * + pDecInfo->numFbsForDecoding; + tcli_print( + "currnet dec instance's total_size:%d (%d KB)\n", + total_size, total_size / 1024); + } + + all_total_size += total_size; + tcli_print("================end=================\n"); + } + } + + all_total_size += vbu_comm_bf.size; + tcli_print("all total_size:%d KB\n", all_total_size / 1024); + + return all_total_size; +} + +static int vcodecMemoryInfo(int32_t argc, char *argv[]) +{ + int coreIdx = 0; + + if (argc > 2) { + tcli_print("usage:%s idx\n", argv[0]); + tcli_print("usage:%s\n", argv[0]); + tcli_print("0: 265,1: 264", argv[0]); + return -1; + } + + if (argc == 2) { + coreIdx = (int)atoi(argv[1]); + + if (coreIdx > 1 || coreIdx < 0) { + tcli_print("0: 265,1: 264", argv[0]); + return -1; + } + getVcodecMemoryInfo(coreIdx); + return 0; + } + + uint32_t all_size = 0; + + all_size = getVcodecMemoryInfo(0) + getVcodecMemoryInfo(1); + + tcli_print("h264 and h265 use total_size:%d KB\n", all_size / 1000); + return 0; +} + +static TELNET_S_CLICMD vcodec_cli_cmd_list_subSecond[] = { + DECLARE_CLI_CMD_MACRO(vpuregs, NULL, showVpuReg, show vcodec regs, 0), + + DECLARE_CLI_CMD_MACRO(vcdbgmask, NULL, vcodecModMaskDebug, get or set dbg_mask for vcodec, 0), + DECLARE_CLI_CMD_MACRO(instPoolInfo, NULL, vcodecH26xInstaccePoolInfo, get vcodec instance pool, 0), + DECLARE_CLI_CMD_MACRO(meminfo, NULL, vcodecMemoryInfo, get vcodec mem info, 0), + DECLARE_CLI_CMD_MACRO_END() + }; + +static TELNET_CLI_S_COMMAND vcodec_cli_cmd_list[] = { + DECLARE_CLI_CMD_MACRO(vcodec, vcodec_cli_cmd_list_subSecond, NULL, + vcodec commands, 0), + DECLARE_CLI_CMD_MACRO_END() +}; + +void vcodec_register_cmd(void) +{ + int enRet = 0; + + pthread_mutex_lock(&vcodecCliMutex); + + if (bVcodecCliReg) { + pthread_mutex_unlock(&vcodecCliMutex); + return; + } + + bVcodecCliReg = 1; + + enRet = RegisterCliCommand((void *)vcodec_cli_cmd_list); + + if (enRet) { + printf("<%s,%d>:cmd register failed,enRet=%#x\r\n", __func__, + __LINE__, enRet); + pthread_mutex_unlock(&vcodecCliMutex); + return; + } + + printf("register vcodec_cli_cmd_list suc.\n"); + pthread_mutex_unlock(&vcodecCliMutex); +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvi_h265_enc_test.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvi_h265_enc_test.c new file mode 100644 index 0000000000..3f0bc2917f --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvi_h265_enc_test.c @@ -0,0 +1,10 @@ +//------------------------------------------------------------------------------ +// File: cvi_h265_enc_test.c +// +//------------------------------------------------------------------------------ +#include "main_enc_cvitest.h" + +int main(int argc, char **argv) +{ + return cvitest_venc_main(argc, argv); +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvi_h265_interface.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvi_h265_interface.h new file mode 100644 index 0000000000..63bcea6d4d --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvi_h265_interface.h @@ -0,0 +1,711 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved. + * + * File Name: cvi_common.h + * Description: Common video definitions. + */ + +#ifndef __CVI_H265_INTERFACE_H__ +#define __CVI_H265_INTERFACE_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifndef PhysicalAddress +/** +* @brief This is a type for representing physical addresses which are +recognizable by VPU. In general, VPU hardware does not know about virtual +address space which is set and handled by host processor. All these virtual +addresses are translated into physical addresses by Memory Management Unit. All +data buffer addresses such as stream buffer and frame buffer should be given to +VPU as an address on physical address space. +*/ +#include "vputypes.h" +#if defined(__aarch64__) || defined(__arm__) || defined(__riscv) +#include +typedef __u64 PhysicalAddress; +#else +#if defined(__amd64__) || defined(__x86_64__) +typedef Uint64 PhysicalAddress; +#else +typedef Uint32 PhysicalAddress; +#endif +#endif +#endif + +typedef enum _CVI_H264E_PROFILE { + CVI_H264E_PROFILE_BASELINE = 0, + CVI_H264E_PROFILE_MAIN, + CVI_H264E_PROFILE_HIGH, +} CVI_H264E_PROFILE; + +typedef enum _RC_MODE_ { + RC_MODE_CBR = 0, + RC_MODE_VBR, + RC_MODE_AVBR, + RC_MODE_QVBR, + RC_MODE_FIXQP, + RC_MODE_QPMAP, + RC_MODE_UBR, + RC_MODE_MAX, +} RC_MODE; + +enum _CODEC_ { + CODEC_NONE = 0, + CODEC_H264, + CODEC_H265, + CODEC_JPEG, + CODEC_MAX, +}; + +typedef enum _NAL_TYPE_ { + NAL_NONE = 0, + NAL_I, + NAL_P, + NAL_B, + NAL_IDR, + NAL_SPS, + NAL_PPS, + NAL_SEI, + NAL_VPS, + NAL_MAX, +} NAL_TYPE; + +/*the super frame mode*/ +typedef enum _CVI_SUPERFRM_MODE_E_ { + CVI_SUPERFRM_NONE = 0, /* sdk don't care super frame */ + CVI_SUPERFRM_REENCODE_IDR, /* the super frame is re-encode to IDR */ + CVI_SUPERFRM_MAX +} CVI_SUPERFRM_MODE_E; + +// H265 decoding refresh type +typedef enum _H265_REFRESH_TYPE_ { + H265_RT_NON_IRAP = 0, + H265_RT_CRA, + H265_RT_IDR, +} H265_REFRESH_TYPE; + +typedef enum _ApiMode_ { + API_MODE_DRIVER = 0, + API_MODE_SDK, + API_MODE_NON_OS, +} ApiMode; + +typedef enum _CVI_VDEC_DEC_RET_ { + CVI_VDEC_RET_FRM_DONE = 0, + CVI_VDEC_RET_DEC_ERR, + CVI_VDEC_RET_NO_FB, + CVI_VDEC_RET_LAST_FRM, + CVI_VDEC_RET_CONTI, + CVI_VDEC_RET_STOP, + CVI_VDEC_RET_LOCK_TIMEOUT, + CVI_VDEC_RET_NO_FB_WITH_DISP, +} CVI_VDEC_DEC_RET; + +typedef struct _cviInitEncConfig_ { + int codec; + int width; + int height; + unsigned int u32Profile; + int rcMode; + int s32IPQpDelta; + int s32BgQpDelta; + int s32ViQpDelta; + int iqp; + int pqp; + int gop; + int virtualIPeriod; + int bitrate; + int framerate; + int bVariFpsEn; + int maxbitrate; + int s32ChangePos; + int s32MinStillPercent; + int u32MaxStillQP; + int u32MotionSensitivity; + int s32AvbrFrmLostOpen; + int s32AvbrFrmGap; + int s32AvbrPureStillThr; + int bBgEnhanceEn; + int s32BgDeltaQp; + int statTime; + unsigned int bitstreamBufferSize; + int singleLumaBuf; + int bSingleEsBuf; + int userDataMaxLength; + int decodingRefreshType; + int initialDelay; + int s32ChnNum; + int bEsBufQueueEn; + int bIsoSendFrmEn; + int svc_enable; + int fg_protect_en; + int fg_dealt_qp; + int complex_scene_detect_en; + int complex_scene_low_th; + int complex_scene_hight_th; + int middle_min_percent; + int complex_min_percent; + int smart_ai_en; +} cviInitEncConfig; + +typedef struct _cviEncOnePicCfg_ { + void *addrY; + void *addrCb; + void *addrCr; + PhysicalAddress phyAddrY; + PhysicalAddress phyAddrCb; + PhysicalAddress phyAddrCr; + int stride; + int cbcrInterleave; + int nv21; + int picMotionLevel; + int picDciLv; + unsigned char *picMotionMap; + int picMotionMapSize; + uint64_t u64Pts; +} cviEncOnePicCfg; + +typedef struct _cviDispFrameCfg_ { + void *addrY; + void *addrCb; + void *addrCr; + PhysicalAddress phyAddrY; + PhysicalAddress phyAddrCb; + PhysicalAddress phyAddrCr; + int width; + int height; + int strideY; + int strideC; + int cbcrInterleave; + int nv21; + int indexFrameDisplay; + uint64_t decHwTime; +} cviDispFrameCfg; + +typedef struct _cviBufInfo { + PhysicalAddress phyAddr; + void *virtAddr; + int size; +} cviBufInfo; + +#define MAX_NUM_PACKS 8 +#define H26X_BLOCK_MODE (-1) +#define RET_VDEC_LOCK_TIMEOUT (-2) + +typedef struct _stPack_ { + uint64_t u64PhyAddr; + void *addr; + int len; + int cviNalType; + int need_free; + uint64_t u64PTS; + int bUsed; +} stPack; + +typedef struct _stStreamPack_ { + struct mutex packMutex; + int totalPacks; + unsigned int dropCnt; + stPack pack[MAX_NUM_PACKS]; + unsigned int seq; +} stStreamPack; + +typedef struct _cviVEncStreamInfo_ { + stStreamPack *psp; + uint64_t encHwTime; + uint32_t u32MeanQp; +} cviVEncStreamInfo; + +typedef struct _cviRcParam_ { + unsigned int u32ThrdLv; + unsigned int + bBgEnhanceEn; /* RW; Range:[0, 1]; Enable background enhancement */ + int s32BgDeltaQp; /* RW; Range:[-51, 51]; Backgournd Qp Delta */ + unsigned int u32RowQpDelta; + // RW; Range:[0, 10];the start QP value of each macroblock row relative to the start QP value + int firstFrmstartQp; + // RW; Range:[50, 100]; Indicates the ratio of the current bit rate to the maximum + // bit rate when the QP value starts to be adjusted + int s32ChangePos; + unsigned int + u32MaxIprop; /* RW; Range:[MinIprop, 100];the max I prop value */ + unsigned int + u32MinIprop; /* RW; Range:[1, 100];the min I prop prop value */ + unsigned int u32MaxQp; /* RW; Range:(MinQp, 51];the max QP value */ + unsigned int u32MinQp; /* RW; Range:[0, 51]; the min QP value */ + unsigned int u32MaxIQp; /* RW; Range:(MinQp, 51]; max qp for i frame */ + unsigned int u32MinIQp; /* RW; Range:[0, 51]; min qp for i frame */ + int s32MinStillPercent; /* RW; Range:[20, 100]; the min percent of target bitrate for still scene */ + unsigned int + u32MaxStillQP; /* RW; Range:[MinIQp, MaxIQp]; the max QP value of I frame for still scene*/ + unsigned int + u32MotionSensitivity; /* RW; Range:[0, 100]; Motion Sensitivity */ + unsigned int s32AvbrFrmLostOpen; + unsigned int s32AvbrFrmGap; + unsigned int s32AvbrPureStillThr; + int s32InitialDelay; + int s32MaxReEncodeTimes; /* RW; Range:[0, 3]; Range:max number of re-encode times.*/ +} cviRcParam; + +#define MAX_REG_FRAME_H26X 62 +typedef struct _cviVbVencBufConfig { + int VbType; + //vb type private mode, get calculate buf size + int VbGetFrameBufSize; + int VbGetFrameBufCnt; + //vb type private mode & user mode + //set in frm cnt & size by user + int VbSetFrameBufSize; + int VbSetFrameBufCnt; + uint64_t vbModeAddr[10]; +} cviVbVencBufConfig; + +typedef struct _cviPred_ { + unsigned int u32IntraCost; +} cviPred; + +typedef struct _cviInPixelFormat_ { + int bCbCrInterleave; + int bNV21; +} cviInPixelFormat; + +typedef struct _cviRoiParam_ { + int roi_index; + int roi_enable; + int roi_qp_mode; + int roi_qp; + int roi_rect_x; // pixel position + int roi_rect_y; // pixel position + unsigned int roi_rect_width; // pixel width + unsigned int roi_rect_height; // pixel width +} cviRoiParam; + +typedef struct _cviVidChnAttr_ { + unsigned int + u32SrcFrameRate; /* RW; Range:[1, 240]; the input frame rate of the venc channel */ + unsigned int + fr32DstFrameRate; /* RW; Range:[0.015625, u32SrcFrmRate]; the target frame rate of the venc channel */ + unsigned int u32BitRate; /* RW; Range:[2, 409600]; average bitrate */ +} cviVidChnAttr; + +typedef struct _cviFrameLost_ { + int frameLostMode; + unsigned int u32EncFrmGaps; + int bFrameLostOpen; + unsigned int u32FrmLostBpsThr; +} cviFrameLost; + +typedef struct _cviUserData_ { + unsigned char *userData; + unsigned int len; +} cviUserData; + +typedef struct _cviH264Entropy_ { + unsigned int + entropyEncModeI; /* RW; Range:[0,1]; Entropy encoding mode for the I frame, 0:cavlc, 1:cabac */ + unsigned int + entropyEncModeP; /* RW; Range:[0,1]; Entropy encoding mode for the P frame, 0:cavlc, 1:cabac */ + unsigned int + entropyEncModeB; /* RW; Range:[0,1]; Entropy encoding mode for the B frame, 0:cavlc, 1:cabac */ + unsigned int + cabac_init_idc; /* RW; Range:[0,2]; see the H.264 protocol for the meaning */ +} cviH264Entropy; + +typedef struct _cviH264Trans_ { + unsigned int u32IntraTransMode; // RW; Range:[0,2]; Conversion mode for + // intra-prediction,0: trans4x4, trans8x8; 1: trans4x4, 2: trans8x8 + unsigned int u32InterTransMode; // RW; Range:[0,2]; Conversion mode for + // inter-prediction,0: trans4x4, trans8x8; 1: trans4x4, 2: trans8x8 + + int bScalingListValid; /* RW; Range:[0,1]; enable Scaling,default: CVI_FALSE */ + unsigned char InterScalingList8X8 + [64]; /* RW; Range:[1,255]; A quantization table for 8x8 inter-prediction*/ + unsigned char IntraScalingList8X8 + [64]; /* RW; Range:[1,255]; A quantization table for 8x8 intra-prediction*/ + + int chroma_qp_index_offset; /* RW; Range:[-12,12];default value: 0, see the H.264 protocol for the meaning*/ +} cviH264Trans; + +typedef struct _cviH265Trans_ { + int cb_qp_offset; /* RW; Range:[-12,12]; see the H.265 protocol for the meaning. */ + int cr_qp_offset; /* RW; Range:[-12,12]; see the H.265 protocol for the meaning. */ + + int bScalingListEnabled; /* RW; Range:[0,1]; If 1, specifies that a scaling list is used.*/ + + int bScalingListTu4Valid; /* RW; Range:[0,1]; If 1, ScalingList4X4 belows will be encoded.*/ + unsigned char InterScalingList4X4 + [2][16]; /* RW; Range:[1,255]; Scaling List for inter 4X4 block.*/ + unsigned char IntraScalingList4X4 + [2][16]; /* RW; Range:[1,255]; Scaling List for intra 4X4 block.*/ + + int bScalingListTu8Valid; /* RW; Range:[0,1]; If 1, ScalingList8X8 belows will be encoded.*/ + unsigned char InterScalingList8X8 + [2][64]; /* RW; Range:[1,255]; Scaling List for inter 8X8 block.*/ + unsigned char IntraScalingList8X8 + [2][64]; /* RW; Range:[1,255]; Scaling List for intra 8X8 block.*/ + + int bScalingListTu16Valid; /* RW; Range:[0,1]; If 1, ScalingList16X16 belows will be encoded.*/ + unsigned char InterScalingList16X16 + [2] + [64]; /* RW; Range:[1,255]; Scaling List for inter 16X16 block..*/ + unsigned char IntraScalingList16X16 + [2] + [64]; /* RW; Range:[1,255]; Scaling List for inter 16X16 block.*/ + + int bScalingListTU32Valid; /* RW; Range:[0,1]; If 1, ScalingList32X32 belows will be encoded.*/ + unsigned char InterScalingList32X32 + [64]; /* RW; Range:[1,255]; Scaling List for inter 32X32 block..*/ + unsigned char IntraScalingList32X32 + [64]; /* RW; Range:[1,255]; Scaling List for inter 32X32 block.*/ +} cviH265Trans; + +#define EXTENDED_SAR 255 + +typedef struct _cviVuiAspectRatio_ { + unsigned char + aspect_ratio_info_present_flag; + // RW; Range: [0, 1]; If 1, aspect ratio info below will be encoded into vui. + unsigned char + aspect_ratio_idc; // RW; Range: [0, 255]; 17~254 is reserved. See the protocol for the meaning. + unsigned char + overscan_info_present_flag; // RW; Range: [0, 1]; If 1, overscan info below will be encoded into vui. + unsigned char + overscan_appropriate_flag; // RW; Range: [0, 1]; See the protocol for the meaning. + unsigned short + sar_width; // RW; Range: [1, 65535]; See the protocol for the meaning. + unsigned short + sar_height; // RW; Range: [1, 65535]; See the protocol for the meaning. + // note: sar_width and sar_height shall be relatively prime. +} cviVuiAspectRatio; + +typedef struct _cviVuiH264TimingInfo_ { + unsigned char + timing_info_present_flag; // RW; Range: [0, 1]; If 1, timing info below will be encoded into vui. + unsigned char + fixed_frame_rate_flag; // RW; Range: [0, 1]; See the H.264 protocol for the meaning. + unsigned int + num_units_in_tick; // RW; Range: [1, 4294967295]; See the H.264 protocol for the meaning. + unsigned int + time_scale; // RW; Range: [1, 4294967295]; See the H.264 protocol for the meaning. +} cviVuiH264TimingInfo; + +typedef struct _cviVuiH265TimingInfo_ { + unsigned int + timing_info_present_flag; // RW; Range: [0, 1]; If 1, timing info below will be encoded into vui. + unsigned int + num_units_in_tick; // RW; Range: [1, 4294967295]; See the H.265 protocol for the meaning. + unsigned int + time_scale; // RW; Range: [1, 4294967295]; See the H.265 protocol for the meaning. + unsigned int + num_ticks_poc_diff_one_minus1; // RW; Range: [0, 4294967294]; See the H.265 protocol for the meaning. +} cviVuiH265TimingInfo; + +typedef struct _cviVuiVideoSignalType_ { + unsigned char + video_signal_type_present_flag; // RW; Range: [0, 1]; If 1, video singnal info will be encoded into vui. + unsigned char + video_format; // RW; H.264e Range: [0, 7], H.265e Range: [0, 5]; See the protocol for the meaning. + unsigned char + video_full_range_flag; // RW; Range: [0, 1]; See the protocol for the meaning. + unsigned char + colour_description_present_flag; // RO; Range: [0, 1]; See the protocol for the meaning. + unsigned char + colour_primaries; // RO; Range: [0, 255]; See the protocol for the meaning. + unsigned char + transfer_characteristics; // RO; Range: [0, 255]; See the protocol for the meaning. + unsigned char + matrix_coefficients; // RO; Range: [0, 255]; See the protocol for the meaning. +} cviVuiVideoSignalType; + +typedef struct _cviVuiBitstreamRestriction_ { + unsigned char + bitstream_restriction_flag; // RW; Range: {0, 1}; See the protocol for the meaning. +} cviVuiBitstreamRestriction; + +typedef struct _cviH264Vui_ { + cviVuiAspectRatio aspect_ratio_info; + cviVuiH264TimingInfo timing_info; + cviVuiVideoSignalType video_signal_type; + cviVuiBitstreamRestriction bitstream_restriction; +} cviH264Vui; + +typedef struct _cvi_h265Vui_ { + cviVuiAspectRatio aspect_ratio_info; + cviVuiH265TimingInfo timing_info; + cviVuiVideoSignalType video_signal_type; + cviVuiBitstreamRestriction bitstream_restriction; +} cviH265Vui; + +typedef struct _cvi_h264Dblk_ { + CVI_U32 disable_deblocking_filter_idc; + CVI_S32 slice_alpha_c0_offset_div2; + CVI_S32 slice_beta_offset_div2; +} cviH264Dblk; + +typedef struct _cvi_h265Dblk_ { + CVI_U32 slice_deblocking_filter_disabled_flag; + CVI_S32 slice_beta_offset_div2; + CVI_S32 slice_tc_offset_div2; +} cviH265Dblk; + +typedef struct _cviUserRcInfo_ { + unsigned int bQpMapValid; + unsigned int bRoiBinValid; + int roideltaqp; + PhysicalAddress u64QpMapPhyAddr; +} cviUserRcInfo; + +typedef struct _cviSuperFrame { + CVI_SUPERFRM_MODE_E enSuperFrmMode; + unsigned int + u32SuperIFrmBitsThr; // RW; Range:[0, 33554432];Indicate the threshold + // of the super I frame for enabling the super frame processing mode + unsigned int + u32SuperPFrmBitsThr; // RW; Range:[0, 33554432];Indicate the threshold + // of the super P frame for enabling the super frame processing mode +} cviSuperFrame; + +typedef struct _cviFrameParam_ { + unsigned int u32FrameQp; + unsigned int u32FrameBits; +} cviFrameParam; + +typedef struct _cvi_h264Split_ { + int bSplitEnable; + // RW; Range:[0,1]; slice split enable, CVI_TRUE:enable, CVI_FALSE:disable, default value:CVI_FALSE + unsigned int u32MbLineNum; + // RW; Range:[1,(Picture height + 15)/16]; this value presents the mb line number of one slice +} cviH264Split; + +typedef struct _cvi_h265Split_ { + int bSplitEnable; // RW; Range:[0,1]; slice split enable, CVI_TRUE:enable, default value:CVI_FALSE + unsigned int u32LcuLineNum; // RW; Range:(Picture height + lcu size minus one)/lcu, lcu=64 +} cviH265Split; + +typedef struct _cvi_h264IntraPred_ { + CVI_U32 constrained_intra_pred_flag; + // RW; Range:[0,1];default: CVI_FALSE, see the H.264 protocol for the meaning +} cviH264IntraPred; + +typedef struct _cvi_svcParam_ { + int fg_protect_en; + int fg_dealt_qp; + + /*static scene auto change bitrate according dci_lv threshold*/ + int complex_scene_detect_en; + /*dci_lv avg < threshold as simple scene Range:[0, 512]*/ + unsigned int complex_scene_low_th; + /*dci_lv avg > threshold as complex scene Range:[0, 512]*/ + unsigned int complex_scene_hight_th; + /*middle scene still case min bitrate*/ + unsigned int middle_min_percent; + /*complex scene still case min bitrate*/ + unsigned int complex_min_percent; + + /*when smart_ai_en is 1, user show pass level roi used USER_FRAME_INFO_S + * and bRoiBinValid set valid + */ + int smart_ai_en; +} cviSvcParam; + +#define CVI_H26X_OP_BASE 0x100 +#define CVI_H26X_OP_MASK 0xFF00 +#define CVI_H26X_OP_SHIFT 8 + +enum EncIoctlOp { + OP_NONE = 0, + OP_SET_RC_PARAM, + OP_START, +#if 0 + OP_GET_FD, +#endif + OP_SET_REQUEST_IDR, + OP_SET_CHN_ATTR, + OP_SET_REF_PARAM, + OP_SET_ROI_PARAM, + OP_GET_ROI_PARAM, + OP_SET_FRAME_LOST_STRATEGY, + OP_GET_VB_INFO, + OP_SET_VB_BUFFER, + OP_SET_USER_DATA, + OP_SET_PREDICT, + OP_SET_H264_ENTROPY, + OP_SET_H264_TRANS, + OP_SET_H265_TRANS, + OP_REG_VB_BUFFER, + OP_SET_IN_PIXEL_FORMAT, + OP_GET_CHN_INFO, + OP_SET_USER_RC_INFO, + OP_SET_SUPER_FRAME, + OP_SET_H264_VUI, + OP_SET_H265_VUI, + OP_SET_FRAME_PARAM, + OP_CALC_FRAME_PARAM, +#if 0 + OP_SET_SB_MODE, + OP_START_SB_MODE, + OP_UPDATE_SB_WPTR, + OP_RESET_SB, + OP_SB_EN_DUMMY_PUSH, + OP_SB_TRIG_DUMMY_PUSH, + OP_SB_DIS_DUMMY_PUSH, + OP_SB_GET_SKIP_FRM_STATUS, +#endif + OP_SET_SBM_ENABLE, + OP_WAIT_FRAME_DONE, + OP_SET_H264_SPLIT, + OP_SET_H265_SPLIT, + OP_SET_H264_DBLK, + OP_SET_H265_DBLK, + OP_SET_H264_INTRA_PRED, + OP_DROP_FRAME, + SET_SBM_SETTING, + OP_SET_ENABLE_SVC, + OP_SET_SVC_PARAM, + OP_GET_RC_REAL_INFO, + OP_MAX, +}; + +typedef enum _cviVEncIoctlOp_ { + CVI_H26X_OP_NONE = 0, + CVI_H26X_OP_SET_RC_PARAM = (OP_SET_RC_PARAM << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_START = (OP_START << CVI_H26X_OP_SHIFT), +#if 0 + CVI_H26X_OP_GET_FD = (OP_GET_FD << CVI_H26X_OP_SHIFT), +#endif + CVI_H26X_OP_SET_REQUEST_IDR = (OP_SET_REQUEST_IDR << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_CHN_ATTR = (OP_SET_CHN_ATTR << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_REF_PARAM = (OP_SET_REF_PARAM << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_ROI_PARAM = (OP_SET_ROI_PARAM << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_GET_ROI_PARAM = (OP_GET_ROI_PARAM << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_FRAME_LOST_STRATEGY = (OP_SET_FRAME_LOST_STRATEGY << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_GET_VB_INFO = (OP_GET_VB_INFO << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_VB_BUFFER = (OP_SET_VB_BUFFER << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_USER_DATA = (OP_SET_USER_DATA << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_PREDICT = (OP_SET_PREDICT << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H264_ENTROPY = (OP_SET_H264_ENTROPY << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H264_TRANS = (OP_SET_H264_TRANS << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H265_TRANS = (OP_SET_H265_TRANS << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_REG_VB_BUFFER = (OP_REG_VB_BUFFER << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_IN_PIXEL_FORMAT = (OP_SET_IN_PIXEL_FORMAT << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_GET_CHN_INFO = (OP_GET_CHN_INFO << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_USER_RC_INFO = (OP_SET_USER_RC_INFO << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_SUPER_FRAME = (OP_SET_SUPER_FRAME << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H264_VUI = (OP_SET_H264_VUI << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H265_VUI = (OP_SET_H265_VUI << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_FRAME_PARAM = (OP_SET_FRAME_PARAM << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_CALC_FRAME_PARAM = (OP_CALC_FRAME_PARAM << CVI_H26X_OP_SHIFT), +#if 0 + CVI_H26X_OP_SET_SB_MODE = (OP_SET_SB_MODE << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_START_SB_MODE = (OP_START_SB_MODE << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_UPDATE_SB_WPTR = (OP_UPDATE_SB_WPTR << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_RESET_SB = (OP_RESET_SB << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SB_EN_DUMMY_PUSH = (OP_SB_EN_DUMMY_PUSH << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SB_TRIG_DUMMY_PUSH = (OP_SB_TRIG_DUMMY_PUSH << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SB_DIS_DUMMY_PUSH = (OP_SB_DIS_DUMMY_PUSH << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SB_GET_SKIP_FRM_STATUS = (OP_SB_GET_SKIP_FRM_STATUS << CVI_H26X_OP_SHIFT), +#endif + CVI_H26X_OP_SET_SBM_ENABLE = (OP_SET_SBM_ENABLE << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_WAIT_FRAME_DONE = (OP_WAIT_FRAME_DONE << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H264_SPLIT = (OP_SET_H264_SPLIT << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H265_SPLIT = (OP_SET_H265_SPLIT << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H264_DBLK = (OP_SET_H264_DBLK << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H265_DBLK = (OP_SET_H265_DBLK << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_H264_INTRA_PRED = (OP_SET_H264_INTRA_PRED << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_DROP_FRAME = (OP_DROP_FRAME << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_SBM_SETTING = (SET_SBM_SETTING << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_ENABLE_SVC = (OP_SET_ENABLE_SVC << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_SET_SVC_PARAM = (OP_SET_SVC_PARAM << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_GET_RC_REAL_INFO = (OP_GET_RC_REAL_INFO << CVI_H26X_OP_SHIFT), + CVI_H26X_OP_MAX = (OP_MAX << CVI_H26X_OP_SHIFT), +} cviVEncIoctlOp; + +void cviVcodecGetVersion(void); +void *cviVEncOpen(cviInitEncConfig *pInitEncCfg); +int cviVEncClose(void *handle); +int cviVEncEncOnePic(void *handle, cviEncOnePicCfg *pPicCfg, int s32MilliSec); +int cviVEncGetStream(void *handle, cviVEncStreamInfo *pStreamInfo, + int s32MilliSec); +int cviVEncReleaseStream(void *handle, cviVEncStreamInfo *pStreamInfo); +int cviVEncIoctl(void *handle, int op, void *arg); +void cviCopyMotionMap(void *handle, cviEncOnePicCfg *pPicCfg, void *phandle); +typedef struct _cviInitDecConfig_ { + int codec; + int cviApiMode; + int vbSrcMode; + int chnNum; + int argc; + char **argv; + int bsBufferSize; + int reorderEnable; +} cviInitDecConfig; + +typedef struct _cviDecOnePicCfg_ { + void *bsAddr; + int bsLen; + int bEndOfStream; + + // output buffer format + int cbcrInterleave; + int nv21; +} cviDecOnePicCfg; + +typedef struct _stCviCb_HostAllocFB_ { + int iFrmBufSize; + int iFrmBufNum; + int iTmpBufSize; + int iTmpBufNum; +} stCviCb_HostAllocFB; + +typedef struct _cviVencSbSetting_ { + unsigned int codec; // 0x1:h265, 0x2:h264, 0x4:jpeg + CVI_U32 sb_mode; + CVI_U32 sb_size; + CVI_U32 sb_nb; + CVI_U32 y_stride; + CVI_U32 uv_stride; + CVI_U32 src_height; + //pri sb address + CVI_U32 sb_ybase; + CVI_U32 sb_uvbase; + CVI_U32 src_ybase; //[out] + CVI_U32 src_uvbase; //[out] + // sec sb address + CVI_U32 sb_ybase1; + CVI_U32 sb_uvbase1; + CVI_U32 src_ybase1; //[out] + CVI_U32 src_uvbase1; //[out] + // status + unsigned int status; + //bind Vpss Chn + CVI_S32 VpssGrp; + CVI_S32 VpssChn; +} cviVencSbSetting; + +typedef enum _eCviVDecCbOp_ { + CVI_H26X_DEC_CB_NONE = 0, + CVI_H26X_DEC_CB_AllocFB, + CVI_H26X_DEC_CB_FreeFB, + CVI_H26X_DEC_CB_GET_DISPQ_COUNT, + CVI_H26X_DEC_CB_MAX, +} eCviVDecCbOp; + +typedef int (*CVI_VDEC_DRV_CALLBACK)(unsigned int nChn, unsigned int nCbType, + void *pArg); + +int cviVDecOpen(cviInitDecConfig *pInitDecCfg, void *pHandle); +int cviVDecClose(void *pHandle); +int cviVDecReset(void *pHandle); +int cviVDecDecOnePic(void *pHandle, cviDecOnePicCfg *pdopc, int timeout_ms); +int cviVDecGetFrame(void *pHandle, cviDispFrameCfg *pdfc); +void cviVDecReleaseFrame(void *pHandle, void *arg); +void cviVDecAttachFrmBuf(void *pHandle, void *pFrmBufArray, int nFrmNum); +void cviVDecAttachCallBack(CVI_VDEC_DRV_CALLBACK pCbFunc); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvi_vcodec_version.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvi_vcodec_version.h new file mode 100644 index 0000000000..519f0b48c3 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvi_vcodec_version.h @@ -0,0 +1 @@ +#define VCODEC_VERSION "-" diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvitest_internal.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvitest_internal.h new file mode 100644 index 0000000000..ccfd159b85 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/cvitest_internal.h @@ -0,0 +1,117 @@ +/* + * Copyright Cvitek Technologies Inc. + * + * Created Time: Dec, 2019 + */ +#ifndef __CVITEST_INTERNAL_H__ +#define __CVITEST_INTERNAL_H__ + +#include + +#include "main_helper.h" +#include "vpuapi.h" +#include "cvi_h265_interface.h" +#include "vdi.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define MAX_CTU_NUM 0x4000 // CTU num for max resolution = 8192x8192/(64x64) +#define NUM_OF_BS_BUF 1 + +#define CACHE_ENCODE_HEADER 1 + +//is bitstreambuff is not enough, drop frame +//or alloc ion to store it +#define DROP_FRAME 1 + +typedef struct _stTestEncoder_ { + EncHandle handle; + EncOpenParam encOP; + EncParam encParam; + EncInitialInfo initialInfo; + EncOutputInfo outputInfo; + SecAxiUse secAxiUse; + vpu_buffer_t vbStream[NUM_OF_BS_BUF]; + Uint32 bsBufferCount; + Uint32 bsQueueIndex; + vpu_buffer_t vbReport; + vpu_buffer_t vbReconFrameBuf[MAX_REG_FRAME]; + vpu_buffer_t vbSourceFrameBuf[MAX_REG_FRAME]; + FrameBuffer fbSrc[ENC_SRC_BUF_NUM]; +#ifdef SUPPORT_DIRECT_YUV + FrameBuffer fbSrcFixed; +#endif + FrameBufferAllocInfo fbAllocInfo; + int ret; + EncHeaderParam encHeaderParam; +#if CACHE_ENCODE_HEADER + int bEncHeader; + EncHeaderParam headerBackup[8]; +#endif + int srcFrameIdx; + Uint32 frameIdx; + int srcFrameWidth, srcFrameHeight, srcFrameStride; + int framebufStride, framebufWidth, framebufHeight; + int suc; + int regFrameBufCount; + int coreIdx; + TestEncConfig encConfig; + Int32 productId; + Comparator comparatorBitStream; + BitstreamReader bsReader; + FrameBuffer fbRecon[MAX_REG_FRAME]; + vpu_buffer_t vbRoi[MAX_REG_FRAME]; + vpu_buffer_t vbRoiBin[MAX_REG_FRAME]; + vpu_buffer_t vbCtuQp[MAX_REG_FRAME]; + Uint8 ctuQpMapBuf[MAX_CTU_NUM]; + // for encode host rbsp header + vpu_buffer_t vbPrefixSeiNal[MAX_REG_FRAME]; + vpu_buffer_t vbSuffixSeiNal[MAX_REG_FRAME]; + vpu_buffer_t vbHrdRbsp; + vpu_buffer_t vbVuiRbsp; +#ifdef TEST_ENCODE_CUSTOM_HEADER + vpu_buffer_t vbSeiNal[MAX_REG_FRAME]; + vpu_buffer_t vbCustomHeader; +#endif + + Uint8 roiMapBuf[MAX_CTU_NUM]; + void *yuvFeeder; + YuvInfo yuvFeederInfo; + Uint32 interruptTimeout; +#ifdef TEST_ENCODE_CUSTOM_HEADER + hrd_t hrd; +#endif + feederYuvaddr yuvAddr; + + stStreamPack streamPack; + Uint8 bIsEncoderInited; + + /* for handle BIT_BUF_FULL interrupt */ + Uint8 *pu8PreStream; + Uint32 u32PreStreamLen; + Uint32 u32BsRotateOffset; +#ifdef DROP_FRAME + Uint8 bDrop; // Drop bitstream + int originBitrate; // srore rc origin bitrate +#endif + struct task_struct *tPthreadId; + struct completion semSendEncCmd; + struct completion semGetStreamCmd; + struct completion semEncDoneCmd; + + Uint8 tPthreadRunFlag; + cviVEncStreamInfo tStreamInfo; + Uint64 u64Pts; + cviVencSbSetting SbSetting; +} stTestEncoder; + +int initEncoder(stTestEncoder *pTestEnc, TestEncConfig *pEncConfig); +void initDefaultEncConfig(TestEncConfig *pEncConfig); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/binaryreader.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/binaryreader.c new file mode 100644 index 0000000000..3e540117fa --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/binaryreader.c @@ -0,0 +1,16 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "main_helper.h" diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bitstreamfeeder.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bitstreamfeeder.c new file mode 100644 index 0000000000..22e72e21ea --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bitstreamfeeder.c @@ -0,0 +1,543 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "vpuapifunc.h" +#include "main_helper.h" + +typedef struct { + FeedingMethod method; + Uint8 *remainData; + Uint32 remainDataSize; + void *actualFeeder; + PhysicalAddress base; + Uint32 size; + Uint32 fillingMode; + BOOL eos; + VpuThread threadHandle; + DecHandle decHandle; + EndianMode endian; + BSFeederHook observer; + void *observerArg; + BOOL autoUpdate; /* TRUE - Call VPU_DecUpdateBitstreamBuffer() in the + bitstream feeder. default */ +} BitstreamFeeder; + +static void BitstreamFeeder_DummyObserver(void *handle, void *es, Uint32 size, + void *arg) +{ + UNREFERENCED_PARAMETER(handle); + UNREFERENCED_PARAMETER(es); + UNREFERENCED_PARAMETER(size); + UNREFERENCED_PARAMETER(arg); +} + +extern void *BSFeederFixedSize_Create(const char *path, Uint32 chunkSize); + +extern BOOL BSFeederFixedSize_Destroy(BSFeeder feeder); + +extern Int32 BSFeederFixedSize_Act(void *feeder, BSChunk *chunk); + +extern Int32 BSFeederFixedSize_Rewind(void *feeder); + +extern Int32 BSFeederFixedSize_GetFeedingSize(void *feeder); + +#ifdef REDUNDENT_CODE +extern void *BSFeederFrameSize_Create(const char *path, CodStd codec, + CodStd *retCodecId, Uint32 *retMp4ClassId, + Uint32 *retSeqWidth, + Uint32 *retSeqHeight); + +extern BOOL BSFeederFrameSize_Destroy(void *feeder); + +extern Int32 BSFeederFrameSize_Act(void *feeder, BSChunk *packet); + +extern BOOL BSFeederFrameSize_Rewind(void *feeder); + +extern void *BSFeederSizePlusEs_Create(const char *path); + +extern BOOL BSFeederSizePlusEs_Destroy(void *feeder); + +extern Int32 BSFeederSizePlusEs_Act(void *feeder, BSChunk *chunk); + +extern Int32 BSFeederSizePlusEs_Rewind(void *feeder); +#endif + +extern void *BSFeederEsIn_Create(void); +extern BOOL BSFeederEsIn_Destroy(void *feeder); +extern Int32 BSFeederEsIn_Act(void *feeder, BSChunk *chunk); +extern BOOL BSFeederEsIn_Rewind(void *feeder); + +/** + * Abstract Bitstream Feeader Functions + */ +void *BitstreamFeeder_Create(const char *path, FeedingMethod method, + PhysicalAddress base, Uint32 size, ...) +{ + /*lint -esym(438, ap) */ +#if defined(VC_DRIVER_TEST) || defined(REDUNDENT_CODE) + va_list ap; +#endif +#ifdef VC_DRIVER_TEST + Uint32 chunkSize; +#endif + BitstreamFeeder *handle = NULL; + void *feeder = NULL; +#ifdef REDUNDENT_CODE + CodStd codecId; + CodStd *retCodecId; + Uint32 *retMp4ClassId; + Uint32 *retSeqWidth; + Uint32 *retSeqHeight; +#endif + + switch (method) { +#ifdef VC_DRIVER_TEST + case FEEDING_METHOD_FIXED_SIZE: + va_start(ap, size); + chunkSize = va_arg(ap, int); + va_end(ap); + feeder = BSFeederFixedSize_Create(path, chunkSize); + break; +#endif +#ifdef REDUNDENT_CODE + case FEEDING_METHOD_FRAME_SIZE: + va_start(ap, size); + codecId = (CodStd)va_arg(ap, Int32); + retCodecId = (CodStd *)va_arg(ap, CodStd *); + retMp4ClassId = (Uint32 *)va_arg(ap, Uint32 *); + retSeqWidth = (Uint32 *)va_arg(ap, Uint32 *); + retSeqHeight = (Uint32 *)va_arg(ap, Uint32 *); + va_end(ap); + feeder = BSFeederFrameSize_Create(path, codecId, retCodecId, + retMp4ClassId, retSeqWidth, + retSeqHeight); + break; + case FEEDING_METHOD_SIZE_PLUS_ES: + feeder = BSFeederSizePlusEs_Create(path); + break; +#endif + case FEEDING_METHOD_ES_IN: + feeder = BSFeederEsIn_Create(); + break; + default: + feeder = NULL; + break; + } + + if (feeder != NULL) { + handle = + (BitstreamFeeder *)osal_malloc(sizeof(BitstreamFeeder)); + if (handle == NULL) { + CVI_VC_ERR("Failed to allocate memory\n"); + return NULL; + } + handle->actualFeeder = feeder; + handle->method = method; + handle->remainData = NULL; + handle->remainDataSize = 0; + handle->base = base; + handle->size = size; + handle->fillingMode = (method == FEEDING_METHOD_FIXED_SIZE) ? + BSF_FILLING_RINGBUFFER : + BSF_FILLING_LINEBUFFER; + handle->threadHandle = NULL; + handle->eos = FALSE; + handle->observer = (BSFeederHook)BitstreamFeeder_DummyObserver; + handle->observerArg = NULL; + handle->autoUpdate = TRUE; + } + + return handle; + /*lint +esym(438, ap) */ +} + +void BitstreamFeeder_SetFillMode(BSFeeder feeder, Uint32 mode) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + + switch (mode) { + case BSF_FILLING_AUTO: + bsf->fillingMode = (bsf->method == FEEDING_METHOD_FIXED_SIZE) ? + BSF_FILLING_RINGBUFFER : + BSF_FILLING_LINEBUFFER; + break; + case BSF_FILLING_RINGBUFFER: + case BSF_FILLING_LINEBUFFER: + case BSF_FILLING_RINGBUFFER_WITH_ENDFLAG: + bsf->fillingMode = mode; + break; + default: + VLOG(INFO, "%s Not supported mode %d\n", __func__, mode); + break; + } +} + +static Uint32 FeedBitstream(BSFeeder feeder, vpu_buffer_t *buffer) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + Int32 feedingSize = 0; + BSChunk chunk = { 0 }; + PhysicalAddress rdPtr, wrPtr; + Uint32 room; + DecHandle decHandle; + EndianMode endian; + + if (bsf == NULL) { + CVI_VC_ERR("Null handle\n"); + return 0; + } + + decHandle = bsf->decHandle; + endian = bsf->endian; + + if (bsf->remainData == NULL) { + if (bsf->method == FEEDING_METHOD_ES_IN) { + chunk.size = buffer->size; + chunk.data = buffer->virt_addr; + chunk.eos = FALSE; + } +#ifdef VC_DIRVER_TEST + else if (bsf->method == FEEDING_METHOD_FIXED_SIZE) { + chunk.size = BSFeederFixedSize_GetFeedingSize( + bsf->actualFeeder); + chunk.data = osal_malloc(chunk.size); + chunk.eos = FALSE; + } +#endif + else { + chunk.size = bsf->size; + chunk.data = osal_malloc(chunk.size); + chunk.eos = FALSE; + } + + if (chunk.data == NULL) { + CVI_VC_WARN("chunk.data\n"); + return 0; + } + + switch (bsf->method) { +#ifdef VC_DIRVER_TEST + case FEEDING_METHOD_FIXED_SIZE: + feedingSize = BSFeederFixedSize_Act(bsf->actualFeeder, + &chunk); + break; +#endif +#ifdef REDUNDENT_CODE + case FEEDING_METHOD_FRAME_SIZE: + feedingSize = BSFeederFrameSize_Act(bsf->actualFeeder, + &chunk); + break; + case FEEDING_METHOD_SIZE_PLUS_ES: + feedingSize = BSFeederSizePlusEs_Act(bsf->actualFeeder, + &chunk); + break; +#endif + case FEEDING_METHOD_ES_IN: + feedingSize = + BSFeederEsIn_Act(bsf->actualFeeder, &chunk); + break; + default: + CVI_VC_ERR("Invalid method(%d)\n", bsf->method); + osal_free(chunk.data); + return 0; + } + } else { + chunk.data = bsf->remainData; + feedingSize = bsf->remainDataSize; + } + + CVI_VC_BS("feedingSize = %d\n", feedingSize); + + bsf->observer((void *)bsf, chunk.data, feedingSize, bsf->observerArg); + + if (feedingSize < 0) { + CVI_VC_ERR("feeding size is negative value: %d\n", feedingSize); + + if (chunk.data) + osal_free(chunk.data); + return 0; + } + + if (feedingSize > 0) { + Uint32 coreIdx = VPU_HANDLE_CORE_INDEX(decHandle); + Uint32 rightSize = 0, leftSize = feedingSize; + + if (bsf->method == FEEDING_METHOD_ES_IN || buffer == NULL) { + VPU_DecGetBitstreamBuffer(decHandle, &rdPtr, &wrPtr, + &room); + CVI_VC_BS( + "rdPtr = 0x%llX, wrPtr = 0x%llX, room = 0x%X\n", + rdPtr, wrPtr, room); + } else { + rdPtr = wrPtr = buffer->phys_addr; + room = buffer->size; + CVI_VC_BS("\n"); + } + + if ((Int32)room < feedingSize) { + bsf->remainData = chunk.data; + bsf->remainDataSize = feedingSize; + CVI_VC_ERR("room < feedingSize\n"); + return 0; + } + + if (bsf->fillingMode == BSF_FILLING_RINGBUFFER || + bsf->fillingMode == BSF_FILLING_RINGBUFFER_WITH_ENDFLAG) { + if ((wrPtr + feedingSize) >= (bsf->base + bsf->size)) { + PhysicalAddress endAddr = bsf->base + bsf->size; + + CVI_VC_TRACE("endAddr = 0x%llX\n", endAddr); + + rightSize = endAddr - wrPtr; + leftSize = (wrPtr + feedingSize) - endAddr; + if (rightSize > 0) { + VpuWriteMem(coreIdx, wrPtr, + (unsigned char *)chunk.data, + rightSize, (int)endian); +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_flush_ion_cache( + wrPtr, (void *)(chunk.data), + rightSize); +#endif + } + wrPtr = bsf->base; + } + } + + VpuWriteMem(coreIdx, wrPtr, + (unsigned char *)chunk.data + rightSize, leftSize, + (int)endian); +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_flush_ion_cache(wrPtr, (void *)(chunk.data + rightSize), + leftSize); +#endif + CVI_VC_BS("rightSize = 0x%X, leftSize = 0x%X\n", rightSize, + leftSize); + } + + if (bsf->autoUpdate == TRUE) { + /* If feedingSize is equal to zero then VPU will be ready to + * terminate current sequence. */ + VPU_DecUpdateBitstreamBuffer(decHandle, feedingSize); + if (chunk.eos == TRUE || + bsf->fillingMode == BSF_FILLING_RINGBUFFER_WITH_ENDFLAG) { + VPU_DecUpdateBitstreamBuffer(decHandle, + STREAM_END_SET_FLAG); + } + } + + bsf->eos = chunk.eos; + + if (bsf->method != FEEDING_METHOD_ES_IN) + osal_free(chunk.data); + + bsf->remainData = NULL; + bsf->remainDataSize = 0; + + return feedingSize; +} + +#ifdef REDUNDENT_CODE +static void FeederThread(void *arg) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)arg; + + while (bsf->eos == FALSE) { + MSleep(10); + FeedBitstream(bsf, NULL); + } +} +#endif + +Uint32 BitstreamFeeder_Act(DecHandle decHandle, BSFeeder feeder, + EndianMode endian, vpu_buffer_t *buffer) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + + bsf->decHandle = decHandle; + bsf->endian = endian; + return FeedBitstream(feeder, buffer); +} + +#ifdef REDUNDENT_CODE +/* \param sync FALSE: The thread fill bitstream into a bitstream buffer + * continously TRUE: The thread start to fill bitstream into a bitstream buffer + * just one time. Client MUST call BitstreamFeeder_Run() with fourth parameter + * TRUE for every decoding sequence. + */ +BOOL BitstreamFeeder_Run(DecHandle decHandle, BSFeeder feeder, + EndianMode endian) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + VpuThreadRunner runner = (VpuThreadRunner)FeederThread; + + bsf->decHandle = decHandle; + bsf->endian = endian; + + bsf->threadHandle = VpuThread_Create(runner, (void *)bsf); + if (bsf->threadHandle == NULL) { + return FALSE; + } + + return TRUE; +} + +BOOL BitstreamFeeder_IsEos(BSFeeder feeder) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + + if (bsf == NULL) { + CVI_VC_ERR("Null handle\n"); + return FALSE; + } + + return bsf->eos; +} + +void BitstreamFeeder_Stop(BSFeeder feeder) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + + if (bsf == NULL) { + CVI_VC_ERR("Null handle\n"); + return; + } + + if (bsf->threadHandle != NULL) { + bsf->eos = TRUE; + VpuThread_Join(bsf->threadHandle); + osal_free(bsf->threadHandle); + bsf->threadHandle = NULL; + } +} +#endif + +BOOL BitstreamFeeder_Destroy(BSFeeder feeder) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + + if (bsf == NULL) { + CVI_VC_ERR("Null handle\n"); + return FALSE; + } + + if (bsf->threadHandle) { + bsf->eos = TRUE; + VpuThread_Join(bsf->threadHandle); + osal_free(bsf->threadHandle); + bsf->threadHandle = NULL; + } + + switch (bsf->method) { +#ifdef VC_DIRVER_TEST + case FEEDING_METHOD_FIXED_SIZE: + BSFeederFixedSize_Destroy(bsf->actualFeeder); + break; +#endif +#ifdef REDUNDENT_CODE + case FEEDING_METHOD_FRAME_SIZE: + BSFeederFrameSize_Destroy(bsf->actualFeeder); + break; + case FEEDING_METHOD_SIZE_PLUS_ES: + BSFeederSizePlusEs_Destroy(bsf->actualFeeder); + break; +#endif + case FEEDING_METHOD_ES_IN: + BSFeederEsIn_Destroy(bsf->actualFeeder); + break; + default: + CVI_VC_ERR("Invalid method(%d)\n", bsf->method); + break; + } + + if (bsf->remainData) { + osal_free(bsf->remainData); + } + + osal_free(bsf); + + return TRUE; +} + +#ifdef REDUNDENT_CODE +BOOL BitstreamFeeder_Rewind(BSFeeder feeder) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + BOOL success = FALSE; + + if (bsf == NULL) { + CVI_VC_ERR("handle is NULL\n"); + return success; + } + + switch (bsf->method) { + case FEEDING_METHOD_FIXED_SIZE: + success = BSFeederFixedSize_Rewind(bsf->actualFeeder); + break; + case FEEDING_METHOD_FRAME_SIZE: + success = BSFeederFrameSize_Rewind(bsf->actualFeeder); + break; + case FEEDING_METHOD_SIZE_PLUS_ES: + success = BSFeederSizePlusEs_Rewind(bsf->actualFeeder); + break; + case FEEDING_METHOD_ES_IN: + success = BSFeederEsIn_Rewind(bsf->actualFeeder); + break; + default: + CVI_VC_ERR("Invalid method(%d)\n", bsf->method); + break; + } + + if (success == TRUE) { + bsf->eos = FALSE; + } + + return success; +} + +BOOL BitstreamFeeder_SetHook(BSFeeder feeder, BSFeederHook hookFunc, + void *hookArg) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + + if (bsf == NULL) { + CVI_VC_ERR("handle is NULL\n"); + return FALSE; + } + + if (hookFunc == NULL) { + bsf->observer = (BSFeederHook)BitstreamFeeder_DummyObserver; + } else { + bsf->observer = hookFunc; + } + bsf->observerArg = hookArg; + + return TRUE; +} + +BOOL BitstreamFeeder_SetAutoUpdate(BSFeeder feeder, BOOL onoff) +{ + BitstreamFeeder *bsf = (BitstreamFeeder *)feeder; + + if (bsf == NULL) { + CVI_VC_ERR("handle is NULL\n"); + return FALSE; + } + bsf->autoUpdate = onoff; + + return TRUE; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bitstreamreader.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bitstreamreader.c new file mode 100644 index 0000000000..ce4468b1fa --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bitstreamreader.c @@ -0,0 +1,292 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "main_helper.h" +#include "vdi.h" +typedef struct { + Uint32 type; + EndianMode endian; + BitstreamReaderImpl *impl; + osal_file_t *fp; + EncHandle *handle; + vpu_buffer_t *streamVb; +} AbstractBitstreamReader; + +BitstreamReader BitstreamReader_Create(Uint32 type, char *path, + EndianMode endian, EncHandle *handle) +{ + AbstractBitstreamReader *reader; + osal_file_t *fp; + + CVI_VC_TRACE("\n"); + + if (path == NULL) { + CVI_VC_ERR("path is NULL\n"); + return NULL; + } + + if (strcmp(path, "CVISDK")) { + fp = osal_fopen(path, "wb"); + if (fp == NULL) { + VLOG(ERR, "%s:%d failed to open bin file: %s\n", + __func__, __LINE__, path); + return FALSE; + } + } else { + fp = NULL; + } + + CVI_VC_TRACE("output bin file: %s\n", path); + + reader = (AbstractBitstreamReader *)osal_malloc( + sizeof(AbstractBitstreamReader)); + + reader->fp = fp; + reader->handle = handle; + reader->type = type; + reader->endian = endian; + + return reader; +} + +BOOL BitstreamReader_SetVbStream(BitstreamReader reader, vpu_buffer_t *vb) +{ + AbstractBitstreamReader *absReader = (AbstractBitstreamReader *)reader; + BOOL success = TRUE; + + absReader->streamVb = vb; + CVI_VC_TRACE("phys_addr = 0x%llX, virt_addr = 0x%p\n", + absReader->streamVb->phys_addr, + (void *)absReader->streamVb->virt_addr); + + return success; +} + +BOOL BitstreamReader_Act(BitstreamReader reader, + PhysicalAddress bitstreamBuffer, + Uint32 bitstreamBufferSize, Uint32 streamReadSize, + Comparator comparator) +{ + AbstractBitstreamReader *absReader = (AbstractBitstreamReader *)reader; + osal_file_t *fp; + EncHandle *handle; + RetCode ret = RETCODE_SUCCESS; + int size = 0; + Int32 loadSize = 0; + PhysicalAddress paBsBufEnd = bitstreamBuffer + bitstreamBufferSize; + PhysicalAddress paBsBufStart = bitstreamBuffer; + Uint8 *buf = NULL; + BOOL success = TRUE; + BOOL bSkipCopy = FALSE; + + CVI_VC_TRACE("\n"); + + if (reader == NULL) { +#ifdef SUPPORT_DONT_READ_STREAM + return TRUE; +#else + CVI_VC_ERR("Invalid handle\n"); + return FALSE; +#endif + } + fp = absReader->fp; + handle = absReader->handle; + + CVI_VC_TRACE("\n"); + + ret = cviCopyStreamToBuf(absReader, &loadSize, &buf, streamReadSize, + &size, paBsBufStart, paBsBufEnd, &bSkipCopy, NAL_NONE); + if (ret < 0) { + CVI_VC_ERR("cviCopyStreamToBuf, ret = %d\n", ret); + return FALSE; + } + + if (size > 0) { + CVI_VC_TRACE("loadSize = 0x%X\n", loadSize); + + if (fp != NULL) { + osal_fwrite((void *)buf, sizeof(Uint8), loadSize, fp); + } + + CVI_VC_TRACE("comparator = 0x%p\n", comparator); +#ifdef REDUNDENT_CODE + if (comparator != NULL) { + if (Comparator_Act(comparator, buf, loadSize) == + FALSE) { + success = FALSE; + } + } +#endif + osal_free(buf); + } + + if (size > 0) { + CVI_VC_TRACE("\n"); + + ret = VPU_EncUpdateBitstreamBuffer(*handle, loadSize); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "VPU_EncUpdateBitstreamBuffer failed Error code is 0x%x\n", + ret); + success = FALSE; + } + } + CVI_VC_TRACE("\n"); + + return success; +} + +int cviCopyStreamToBuf(BitstreamReader reader, Int32 *pEsCopiedSize, + Uint8 **ppOutputEsBuf, Uint32 userEsReadSize, + int *pEsBufValidSize, PhysicalAddress paBsBufStart, + PhysicalAddress paBsBufEnd, BOOL *bSkipCopy, Int32 cviNalType) +{ + int ret = 0; + AbstractBitstreamReader *absReader = (AbstractBitstreamReader *)reader; + EncHandle *handle = absReader->handle; + Int32 esCopiedSize = 0; + Uint8 *pOutputEsBuf = 0; + Int32 esBufValidSize = 0; + Uint32 coreIdx = VPU_HANDLE_CORE_INDEX(*handle); + PhysicalAddress paRdPtr; + PhysicalAddress paWrPtr; + + ret = VPU_EncGetBitstreamBuffer(*handle, &paRdPtr, &paWrPtr, + &esBufValidSize); + + CVI_VC_BS( + "esBufValidSize = 0x%X, userEsReadSize = 0x%X, bSkipCopy %d\n", + esBufValidSize, userEsReadSize, *bSkipCopy); + if (esBufValidSize > 0) { + if (userEsReadSize > 0) { + if ((Uint32)esBufValidSize < userEsReadSize) { + CVI_VC_WARN( + "esBufValidSize (0x%X) < esSize(0x%X)\n", + esBufValidSize, userEsReadSize); + esCopiedSize = esBufValidSize; + } else { + esCopiedSize = userEsReadSize; + } + } else { + esCopiedSize = esBufValidSize; + } + +#if defined(CVI_H26X_USE_ION_MEM) + if (*bSkipCopy && + absReader->type != BUFFER_MODE_TYPE_RINGBUFFER) { + *bSkipCopy = TRUE; + pOutputEsBuf = vdi_get_vir_addr( + coreIdx, + vdi_remap_memory_address(coreIdx, paRdPtr)); +#if defined(BITSTREAM_ION_CACHED_MEM) + vdi_invalidate_ion_cache( + vdi_remap_memory_address(coreIdx, paRdPtr), + (void *)pOutputEsBuf, esCopiedSize); +#endif + } else +#endif + { + *bSkipCopy = FALSE; + if (cviNalType >= NAL_I && cviNalType <= NAL_IDR) { + pOutputEsBuf = (Uint8 *)osal_ion_alloc(esCopiedSize); + } else if (cviNalType == NAL_NONE) { + pOutputEsBuf = (Uint8 *)osal_malloc(esCopiedSize); + } else { + pOutputEsBuf = (Uint8 *)osal_kmalloc(esCopiedSize); + } + if (pOutputEsBuf == NULL) { + CVI_VC_ERR("malloc size %d, cviNalType:%d fail\n", esCopiedSize, cviNalType); + return -1; + } + + CVI_VC_TRACE("pOutputEsBuf = %p, type = %d, paRdPtr = 0x%llX\n", + pOutputEsBuf, absReader->type, paRdPtr); + CVI_VC_TRACE("streamVb phy addr = 0x%llX, virt addr = 0x%p, esCopiedSize = 0x%X\n", + absReader->streamVb->phys_addr, + (void *)absReader->streamVb->virt_addr, + esCopiedSize); + + if (absReader->type == BUFFER_MODE_TYPE_RINGBUFFER) { + if ((paRdPtr + esCopiedSize) > paBsBufEnd) { + Uint32 room; + room = paBsBufEnd - paRdPtr; +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_invalidate_ion_cache( + paRdPtr, (void *)pOutputEsBuf, + room); +#endif + vdi_read_memory(coreIdx, paRdPtr, + pOutputEsBuf, room, + absReader->endian); +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_invalidate_ion_cache( + paBsBufStart, + (void *)(pOutputEsBuf + room), + (esCopiedSize - room)); +#endif + vdi_read_memory(coreIdx, paBsBufStart, + pOutputEsBuf + room, + (esCopiedSize - room), + absReader->endian); + } else { +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_invalidate_ion_cache( + paRdPtr, (void *)pOutputEsBuf, + esCopiedSize); +#endif + vdi_read_memory(coreIdx, paRdPtr, + pOutputEsBuf, + esCopiedSize, + absReader->endian); + } + } else { +/* Linebuffer */ +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_invalidate_ion_cache( + vdi_remap_memory_address(coreIdx, + paRdPtr), + (void *)pOutputEsBuf, esCopiedSize); +#endif + vdi_read_memory(coreIdx, + vdi_remap_memory_address( + coreIdx, paRdPtr), + pOutputEsBuf, esCopiedSize, + absReader->endian); + } + } + } + + *pEsCopiedSize = esCopiedSize; + *ppOutputEsBuf = pOutputEsBuf; + *pEsBufValidSize = esBufValidSize; + + return ret; +} + +BOOL BitstreamReader_Destroy(BitstreamReader reader) +{ + AbstractBitstreamReader *absReader = (AbstractBitstreamReader *)reader; + + if (reader == NULL) { + CVI_VC_ERR("Invalid handle\n"); + return FALSE; + } + + if (absReader->fp) + osal_fclose(absReader->fp); + osal_free(absReader); + + return TRUE; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_es_in_impl.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_es_in_impl.c new file mode 100644 index 0000000000..d5e3d794b8 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_es_in_impl.c @@ -0,0 +1,73 @@ +/* + * Copyright Cvitek Technologies Inc. + * + * Created Time: Aug, 2020 + */ + +#include "vpuapifunc.h" +#include "main_helper.h" + +#define MAX_FEEDING_SIZE 0x400000 /* 4MBytes */ + +typedef struct struct_ReaderConext { + Int32 feedingSize; + void *feedingAddr; + BOOL eos; +} ReaderContext; + +void *BSFeederEsIn_Create(void) +{ + ReaderContext *context = NULL; + + context = (ReaderContext *)osal_malloc(sizeof(ReaderContext)); + if (context == NULL) { + CVI_VC_ERR("failed to allocate memory\n"); + return NULL; + } + + context->feedingSize = 0; + context->eos = FALSE; + + return (void *)context; +} + +BOOL BSFeederEsIn_Destroy(void *feeder) +{ + ReaderContext *context = (ReaderContext *)feeder; + + if (context == NULL) { + CVI_VC_ERR("Null handle\n"); + return FALSE; + } + + osal_free(context); + + return TRUE; +} + +Int32 BSFeederEsIn_Act(void *feeder, BSChunk *chunk) +{ + ReaderContext *context = (ReaderContext *)feeder; + + if (context == NULL) { + CVI_VC_ERR("Null handle\n"); + return FALSE; + } + + if (context->eos == TRUE) { + return 0; + } + + if (chunk->size == 0) { + context->eos = TRUE; + } + + CVI_VC_TRACE("size = %d\n", chunk->size); + + return chunk->size; +} + +BOOL BSFeederEsIn_Rewind(void) +{ + return TRUE; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_fixedsize_impl.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_fixedsize_impl.c new file mode 100644 index 0000000000..77f1e5af02 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_fixedsize_impl.c @@ -0,0 +1,138 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#ifdef VC_DRIVER_TEST + +#include "vpuapifunc.h" +#include "main_helper.h" + +#define MAX_FEEDING_SIZE 0x400000 /* 4MBytes */ + +typedef struct struct_ReaderConext { + osal_file_t *fp; + Uint32 feedingSize; + BOOL eos; +} ReaderContext; + +void *BSFeederFixedSize_Create(const char *path, Uint32 feedingSize) +{ + osal_file_t *fp = NULL; + ReaderContext *context = NULL; + + fp = osal_fopen(path, "rb"); + if (fp == NULL) { + CVI_VC_ERR("failed to open %s\n", path); + return NULL; + } + + context = (ReaderContext *)osal_malloc(sizeof(ReaderContext)); + if (context == NULL) { + CVI_VC_ERR("failed to allocate memory\n"); + osal_fclose(fp); + return NULL; + } + + context->fp = fp; + context->feedingSize = feedingSize; + context->eos = FALSE; + + return (void *)context; +} + +BOOL BSFeederFixedSize_Destroy(void *feeder) +{ + ReaderContext *context = (ReaderContext *)feeder; + + if (context == NULL) { + CVI_VC_ERR("Null handle\n"); + return FALSE; + } + + if (context->fp) + osal_fclose(context->fp); + + osal_free(context); + + return TRUE; +} + +Int32 BSFeederFixedSize_Act(void *feeder, BSChunk *chunk) +{ + ReaderContext *context = (ReaderContext *)feeder; + size_t nRead; + Uint32 size; + Uint32 feedingSize; + + if (context == NULL) { + CVI_VC_ERR("Null handle\n"); + return 0; + } + + if (context->eos == TRUE) { + chunk->eos = TRUE; + return 0; + } + + feedingSize = context->feedingSize; + if (feedingSize == 0) { + Uint32 KB = 1024; + BOOL probability10; + + feedingSize = osal_rand() % MAX_FEEDING_SIZE; + probability10 = (BOOL)((feedingSize % 100) < 10); + if (feedingSize < KB) { + if (probability10 == FALSE) + feedingSize *= 100; + } + } + + size = (chunk->size < feedingSize) ? chunk->size : feedingSize; + + do { + nRead = osal_fread(chunk->data, 1, size, context->fp); + if (nRead > size) { + + return 0; + } else if (nRead < size) { + context->eos = TRUE; + chunk->eos = TRUE; + } + } while (FALSE); + + return nRead; +} + +BOOL BSFeederFixedSize_Rewind(void *feeder) +{ + ReaderContext *context = (ReaderContext *)feeder; + Int32 ret; + + ret = osal_fseek(context->fp, 0, SEEK_SET); + if (ret != 0) { + CVI_VC_ERR("Failed to fseek(ret: %d)\n", ret); + return FALSE; + } + context->eos = FALSE; + + return TRUE; +} + +Int32 BSFeederFixedSize_GetFeedingSize(void *feeder) +{ + ReaderContext *context = (ReaderContext *)feeder; + + return context->feedingSize; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_framesize_impl.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_framesize_impl.c new file mode 100644 index 0000000000..146bb875db --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_framesize_impl.c @@ -0,0 +1,1113 @@ +//--=========================================================================-- +// This file is a part of QC Tool project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2004 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#include "main_helper.h" +#ifdef SUPPORT_FFMPEG_DEMUX +#include "theora_parser.h" +#include + +#define RCV_V2 +#define IS_VP9_SUPERFRAME(__header) ((__header & 0xe0) == 0xc0) +#define MAX_VP9_SUPERFRAME_INDEX_SIZE 34 +#define VP9_MAX_SUBFRAMES 8 + +typedef struct VP9Superframe { + Uint32 nframes; + Uint32 frameSize[VP9_MAX_SUBFRAMES]; + void *frames[VP9_MAX_SUBFRAMES]; /* A superframe has multiple frames up + to 8 frames. */ + Uint32 currentIndex; +} VP9Superframe; + +typedef struct ReaderContext { + AVFormatContext *avContext; + BOOL isFirstPacket; + Uint32 videoIndex; + Uint32 standard; + Uint32 mp4ClassId; + tho_parser_t *theora; + Uint8 *tempBuffer; + Uint32 tempRdPtr; + Uint32 tempWrPtr; + Uint32 seqWidth; + Uint32 seqHeight; + VP9Superframe superframe; +} ReaderContext; + +static Uint32 u_bytes(Uint8 *data, Uint32 len) +{ + Uint32 i; + Uint32 val = 0; + + for (i = 0; i < len; i++) { + val |= data[i] << (i * 8); + } + + return val; +} + +static BOOL VP9ParseSuperframe(void *chunk, Uint32 size, + VP9Superframe *superframe) +{ + Uint32 startPos; + Uint32 frameSizeLength = 0; + Uint32 numFrames, totalSubframeSize = 0; + Uint32 i; + Uint8 *pData = NULL, superframeMarker; + + startPos = size - 1; + + pData = (Uint8 *)chunk; + pData = &pData[startPos]; + superframeMarker = *pData; + + frameSizeLength = ((*pData >> 3) & 0x03) + 1; + numFrames = (*pData & 0x07) + 1; + pData -= frameSizeLength * numFrames + 1; + /* Check first SUPERFRAME_MARKER */ + if (*pData != superframeMarker) { + VLOG(ERR, "INVALID POST SUPERFRAME_MARKER\n"); + return FALSE; + } + pData++; + + for (i = 0; i < numFrames; i++) { + superframe->frameSize[i] = u_bytes(pData, frameSizeLength); + pData += frameSizeLength; + } + + /* Check size */ + for (i = 0; i < numFrames; i++) { + totalSubframeSize += superframe->frameSize[i]; + } + if (totalSubframeSize >= size) { + VLOG(ERR, + "TOTAL SIZE OF SUBFRAMES IS BIGGER THAN CHUNK SIZE\n"); + return FALSE; + } + + pData = (Uint8 *)chunk; + for (i = 0; i < numFrames; i++) { + superframe->frames[i] = + (void *)osal_malloc(superframe->frameSize[i]); + osal_memcpy(superframe->frames[i], (void *)pData, + superframe->frameSize[i]); + pData += superframe->frameSize[i]; + } + superframe->currentIndex = 0; + superframe->nframes = numFrames; + + return TRUE; +} + +static Int32 BuildSeqHeader(Uint8 *pbHeader, const CodStd codStd, + const AVStream *st, Int32 *sizelength) +{ + /*lint -save -e438 */ + AVCodecContext *avc = st->codec; + Uint8 *pbMetaData = avc->extradata; + Int32 nMetaData = avc->extradata_size; + Uint8 *p = pbMetaData; + Uint8 *a = p + 4 - ((long)p & 3); + Uint8 *t = pbHeader; + Int32 size; + Int32 fourcc; + Int32 sps, pps, i, nal; + Int32 frameRate = 0; + + fourcc = avc->codec_tag; + if (!fourcc) + fourcc = ConvCodecIdToFourcc(avc->codec_id); + + if (st->avg_frame_rate.den && st->avg_frame_rate.num) + frameRate = (Int32)((double)st->avg_frame_rate.num / + (double)st->avg_frame_rate.den); + + size = 0; + *sizelength = 4; // default size length(in bytes) = 4 + if (codStd == STD_AVC || codStd == STD_AVS) { + if (nMetaData > 1 && pbMetaData && pbMetaData[0] == 0x01) { + // check mov/mo4 file format stream + p += 4; + *sizelength = (*p++ & 0x3) + 1; + sps = (*p & 0x1f); // Number of sps + p++; + for (i = 0; i < sps; i++) { + nal = (*p << 8) + *(p + 1) + 2; + PUT_BYTE(t, 0x00); + PUT_BYTE(t, 0x00); + PUT_BYTE(t, 0x00); + PUT_BYTE(t, 0x01); + PUT_BUFFER(t, p + 2, nal - 2); + p += nal; + size += (nal - 2 + 4); // 4 => length of start + // code to be inserted + } + + pps = *(p++); // number of pps + for (i = 0; i < pps; i++) { + nal = (*p << 8) + *(p + 1) + 2; + PUT_BYTE(t, 0x00); + PUT_BYTE(t, 0x00); + PUT_BYTE(t, 0x00); + PUT_BYTE(t, 0x01); + PUT_BUFFER(t, p + 2, nal - 2); + p += nal; + size += (nal - 2 + 4); // 4 => length of start + // code to be inserted + } + } else if (nMetaData > 3) { + size = -1; // return to meaning of invalid stream data; + for (; p < a; p++) { + if (p[0] == 0 && p[1] == 0 && p[2] == 1) { + // find startcode + size = avc->extradata_size; + PUT_BUFFER(pbHeader, pbMetaData, size); + break; + } + } + } + } else if (codStd == STD_HEVC) { + if (nMetaData > 1 && pbMetaData && pbMetaData[0] == 0x01) { + static const Uint8 nalu_header[4] = { 0, 0, 0, 1 }; + Int32 numOfArrays = 0; + Uint16 numNalus = 0; + Uint16 nalUnitLength = 0; + Uint32 offset = 0; + + p += 21; + *sizelength = (*p++ & 0x3) + 1; + numOfArrays = *p++; + + while (numOfArrays--) { + p++; // NAL type + numNalus = (*p << 8) + *(p + 1); + p += 2; + for (i = 0; i < numNalus; i++) { + nalUnitLength = (*p << 8) + *(p + 1); + p += 2; + // if(i == 0) + { + osal_memcpy(pbHeader + offset, + nalu_header, 4); + offset += 4; + osal_memcpy(pbHeader + offset, + p, nalUnitLength); + offset += nalUnitLength; + } + p += nalUnitLength; + } + } + + size = offset; + } else if (nMetaData > 3) { + size = -1; // return to meaning of invalid stream data; + + for (; p < a; p++) { + // find startcode + if (p[0] == 0 && p[1] == 0 && p[2] == 1) { + size = avc->extradata_size; + PUT_BUFFER(pbHeader, pbMetaData, size); + break; + } + } + } + } else if (codStd == STD_VC1) { + if (!fourcc) + return -1; + // VC AP + if (fourcc == MKTAG('W', 'V', 'C', '1') || + fourcc == MKTAG('W', 'M', 'V', 'A')) { + size = nMetaData; + PUT_BUFFER(pbHeader, pbMetaData, size); + // if there is no seq startcode in pbMetatData. VPU will + // be failed at seq_init stage. + } else { +#ifdef RCV_V2 + PUT_LE32(pbHeader, ((0xC5 << 24) | 0)); + size += 4; // version + PUT_LE32(pbHeader, nMetaData); + size += 4; + PUT_BUFFER(pbHeader, pbMetaData, nMetaData); + size += nMetaData; + PUT_LE32(pbHeader, avc->height); + size += 4; + PUT_LE32(pbHeader, avc->width); + size += 4; + PUT_LE32(pbHeader, 12); + size += 4; + PUT_LE32(pbHeader, + 2 << 29 | 1 << 28 | 0x80 << 24 | 1 << 0); + size += 4; // STRUCT_B_FRIST + // (LEVEL:3|CBR:1:RESERVE:4:HRD_BUFFER|24) + PUT_LE32(pbHeader, avc->bit_rate); + size += 4; // hrd_rate + PUT_LE32(pbHeader, frameRate); + size += 4; // frameRate +#else // RCV_V1 + PUT_LE32(pbHeader, (0x85 << 24) | 0x00); + size += 4; // frames count will be here + PUT_LE32(pbHeader, nMetaData); + size += 4; + PUT_BUFFER(pbHeader, pbMetaData, nMetaData); + size += nMetaData; + PUT_LE32(pbHeader, avc->height); + size += 4; + PUT_LE32(pbHeader, avc->width); + size += 4; +#endif + } + } else if (codStd == STD_RV) { + Int32 st_size = 0; + + if (!fourcc) + return -1; + if (fourcc != MKTAG('R', 'V', '3', '0') && + fourcc != MKTAG('R', 'V', '4', '0')) + return -1; + + size = 26 + nMetaData; + PUT_BE32(pbHeader, size); // Length + PUT_LE32(pbHeader, MKTAG('V', 'I', 'D', 'O')); // MOFTag + PUT_LE32(pbHeader, fourcc); // SubMOFTagl + PUT_BE16(pbHeader, avc->width); + PUT_BE16(pbHeader, avc->height); + PUT_BE16(pbHeader, 0x0c); // BitCount; + PUT_BE16(pbHeader, 0x00); // PadWidth; + PUT_BE16(pbHeader, 0x00); // PadHeight; + + PUT_LE32(pbHeader, frameRate); + PUT_BUFFER(pbHeader, pbMetaData, nMetaData); // OpaqueDatata + size += st_size; // add for startcode pattern. + } else if (codStd == STD_DIV3) { + // not implemented yet + if (!nMetaData) { + PUT_LE32(pbHeader, + MKTAG('C', 'N', 'M', 'V')); // signature + // 'CNMV' + PUT_LE16(pbHeader, 0x00); // version + PUT_LE16(pbHeader, 0x20); // length of header in bytes + PUT_LE32(pbHeader, MKTAG('D', 'I', 'V', '3')); // codec + // FourCC + PUT_LE16(pbHeader, avc->width); // width + PUT_LE16(pbHeader, avc->height); // height + PUT_LE32(pbHeader, st->avg_frame_rate.num); // frame + // rate + PUT_LE32(pbHeader, + st->avg_frame_rate.den); // time scale(?) + PUT_LE32(pbHeader, + st->nb_index_entries); // number of frames in + // file + PUT_LE32(pbHeader, 0); // unused + size += 32; + return size; + } + + PUT_BE32(pbHeader, nMetaData); + size += 4; + + PUT_BUFFER(pbHeader, pbMetaData, nMetaData); + size += nMetaData; + } + + else if (codStd == STD_VP8) { + PUT_LE32(pbHeader, MKTAG('D', 'K', 'I', 'F')); // signature + // 'DKIF' + PUT_LE16(pbHeader, 0x00); // version + PUT_LE16(pbHeader, 0x20); // length of header in bytes + PUT_LE32(pbHeader, MKTAG('V', 'P', '8', '0')); // codec FourCC + PUT_LE16(pbHeader, avc->width); // width + PUT_LE16(pbHeader, avc->height); // height + PUT_LE32(pbHeader, st->avg_frame_rate.num); // frame rate + PUT_LE32(pbHeader, st->avg_frame_rate.den); // time scale(?) + PUT_LE32(pbHeader, + st->nb_index_entries); // number of frames in file + PUT_LE32(pbHeader, 0); // unused + size += 32; + } else if (codStd == STD_VP9) { + PUT_LE32(pbHeader, MKTAG('D', 'K', 'I', 'F')); // signature + // 'DKIF' + PUT_LE16(pbHeader, 0x00); // version + PUT_LE16(pbHeader, 0x20); // length of header in bytes + PUT_LE32(pbHeader, MKTAG('V', 'P', '9', '0')); // codec FourCC + PUT_LE16(pbHeader, avc->width); // width + PUT_LE16(pbHeader, avc->height); // height + PUT_LE32(pbHeader, st->avg_frame_rate.num); // frame rate + PUT_LE32(pbHeader, st->avg_frame_rate.den); // time scale(?) + PUT_LE32(pbHeader, + st->nb_index_entries); // number of frames in file + PUT_LE32(pbHeader, 0); // unused + size += 32; + } else { + PUT_BUFFER(pbHeader, pbMetaData, nMetaData); + size = nMetaData; + } + + return size; + /*lint -restore */ +} + +static Int32 BuildPicHeader(Uint8 *pbHeader, const CodStd codStd, + const AVStream *st, const AVPacket *pkt, + Int32 sizelength) +{ + AVCodecContext *avc = st->codec; + Uint8 *pbChunk = pkt->data; + Int32 size = 0; + Int32 fourcc; + Int32 cSlice, nSlice; + Int32 i, val, offset; + BOOL hasStartCode = 0; + + size = 0; + offset = 0; + fourcc = avc->codec_tag; + if (!fourcc) + fourcc = ConvCodecIdToFourcc(avc->codec_id); + + if (codStd == STD_VC1) { + if (!fourcc) + return -1; + + if (fourcc == MKTAG('W', 'V', 'C', '1') || + fourcc == MKTAG('W', 'M', 'V', 'A')) { + if (pbChunk[0] != 0 || pbChunk[1] != 0 || + pbChunk[2] != 1) { + // check start code as prefix (0x00, 0x00, 0x01) + pbHeader[0] = 0x00; + pbHeader[1] = 0x00; + pbHeader[2] = 0x01; + pbHeader[3] = 0x0D; // replace to the correct + // picture header to + // indicate as frame + + size += 4; + } + } else { + PUT_LE32(pbHeader, + pkt->size | ((pkt->flags & AV_PKT_FLAG_KEY) ? + 0x80000000 : + 0)); + size += 4; +#ifdef RCV_V2 + if (AV_NOPTS_VALUE == pkt->pts) { + PUT_LE32(pbHeader, 0); + } else { + PUT_LE32( + pbHeader, + (int)((double)(pkt->pts / + st->time_base + .den))); // milli_sec + } + size += 4; +#endif + } + } else if (codStd == STD_HEVC) { + if (pkt->size < 5) + return 0; + + if (!(avc->extradata_size > 1 && avc->extradata && + avc->extradata[0] == 0x01)) { + const Uint8 *pbEnd = + pbChunk + 4 - ((intptr_t)pbChunk & 3); + + for (; pbChunk < pbEnd; pbChunk++) { + if (pbChunk[0] == 0 && pbChunk[1] == 0 && + pbChunk[2] == 1) { + hasStartCode = TRUE; + break; + } + } + } + + if ((!hasStartCode && avc->extradata[0] == 0x01) || + (avc->extradata_size > 1 && avc->extradata && + avc->extradata[0] == 0x01)) { + // check sequence metadata if the stream is mov/mo4 file + // format. + pbChunk = pkt->data; + while (offset < pkt->size) { + if (sizelength == 3) { + nSlice = pbChunk[offset] << 16 | + pbChunk[offset + 1] << 8 | + pbChunk[offset + 2]; + + pbChunk[offset] = 0x00; + pbChunk[offset + 1] = 0x00; + pbChunk[offset + 2] = 0x01; + + offset += 3; + } else { // sizeLength = 4 + nSlice = pbChunk[offset] << 24 | + pbChunk[offset + 1] << 16 | + pbChunk[offset + 2] << 8 | + pbChunk[offset + 3]; + + pbChunk[offset] = 0x00; + pbChunk[offset + 1] = 0x00; + pbChunk[offset + 2] = 0x00; + pbChunk[offset + 3] = 0x01; // replace + // size to + // startcode + + offset += 4; + } + + switch ((pbChunk[offset] & 0x7E) >> 1) { /* NAL + unit + */ + case 39: /* PREFIX SEI */ + case 40: /* SUFFIX SEI */ + case 32: /* VPS */ + case 33: /* SPS */ + case 34: /* PPS */ + /* check next */ + break; + } + + offset += nSlice; + } + } + } else if (codStd == STD_RV) { + int st_size = 0; + + if (!fourcc) + return -1; + if (fourcc != MKTAG('R', 'V', '3', '0') && + fourcc != MKTAG('R', 'V', '4', '0')) // RV version 8, 9 , 10 + return -1; + + cSlice = pbChunk[0] + 1; + nSlice = pkt->size - 1 - (cSlice * 8); + size = 20 + (cSlice * 8); + + PUT_BE32(pbHeader, nSlice); + if (AV_NOPTS_VALUE == pkt->pts) { + PUT_LE32(pbHeader, 0); + } else { + PUT_LE32( + pbHeader, + (int)((double)(pkt->pts / + st->time_base.den))); // milli_sec + } + + PUT_BE16(pbHeader, avc->frame_number); + PUT_BE16(pbHeader, 0x02); // Flags + PUT_BE32(pbHeader, 0x00); // LastPacket + PUT_BE32(pbHeader, cSlice); // NumSegments + offset = 1; + for (i = 0; i < (int)cSlice; i++) { + val = (pbChunk[offset + 3] << 24) | + (pbChunk[offset + 2] << 16) | + (pbChunk[offset + 1] << 8) | pbChunk[offset]; + PUT_BE32(pbHeader, val); // isValid + offset += 4; + val = (pbChunk[offset + 3] << 24) | + (pbChunk[offset + 2] << 16) | + (pbChunk[offset + 1] << 8) | pbChunk[offset]; + PUT_BE32(pbHeader, val); // Offset + offset += 4; + } + + size += st_size; + } else if (codStd == STD_AVC) { + if (pkt->size < 5) + return 0; + + if (!(avc->extradata_size > 1 && avc->extradata && + avc->extradata[0] == 0x01)) { + const Uint8 *pbEnd = + pbChunk + 4 - ((intptr_t)pbChunk & 3); + + for (; pbChunk < pbEnd; pbChunk++) { + if (pbChunk[0] == 0 && pbChunk[1] == 0 && + pbChunk[2] == 1) { + hasStartCode = 1; + break; + } + } + } + + if ((!hasStartCode && avc->extradata[0] == 0x01) || + (avc->extradata_size > 1 && avc->extradata && + avc->extradata[0] == 0x01)) { + // check sequence metadata if the stream is mov/mo4 file + // format. + pbChunk = pkt->data; + + while (offset < pkt->size) { + if (sizelength == 3) { + nSlice = pbChunk[offset] << 16 | + pbChunk[offset + 1] << 8 | + pbChunk[offset + 2]; + pbChunk[offset] = 0x00; + pbChunk[offset + 1] = 0x00; + pbChunk[offset + 2] = 0x01; + offset += 3; + } else { // size length = 4 + nSlice = pbChunk[offset] << 24 | + pbChunk[offset + 1] << 16 | + pbChunk[offset + 2] << 8 | + pbChunk[offset + 3]; + pbChunk[offset] = 0x00; + pbChunk[offset + 1] = 0x00; + pbChunk[offset + 2] = 0x00; + pbChunk[offset + 3] = 0x01; // replace + // size to + // startcode + offset += 4; + } + + switch (pbChunk[offset] & 0x1f) { /* NAL unit */ + case 6: /* SEI */ + case 7: /* SPS */ + case 8: /* PPS */ + case 9: /* AU */ + /* check next */ + break; + } + + offset += nSlice; + } + } + } else if (codStd == STD_AVS) { + const Uint8 *pbEnd; + + if (pkt->size < 5) + return 0; + + pbEnd = pbChunk + 4 - ((intptr_t)pbChunk & 3); + + for (; pbChunk < pbEnd; pbChunk++) { + if (pbChunk[0] == 0 && pbChunk[1] == 0 && + pbChunk[2] == 1) { + hasStartCode = 1; + break; + } + } + + if (hasStartCode == 0) { + pbChunk = pkt->data; + + while (offset < pkt->size) { + nSlice = pbChunk[offset] << 24 | + pbChunk[offset + 1] << 16 | + pbChunk[offset + 2] << 8 | + pbChunk[offset + 3]; + + pbChunk[offset] = 0x00; + pbChunk[offset + 1] = 0x00; + pbChunk[offset + 2] = 0x00; + pbChunk[offset + 3] = 0x00; // replace size to + // startcode + pbChunk[offset + 4] = 0x01; + + offset += 4; + + /* NAL unit */ + switch (pbChunk[offset] & 0x1f) { + case 6: /* SEI */ + case 7: /* SPS */ + case 8: /* PPS */ + case 9: /* AU */ + /* check next */ + break; + } + + offset += nSlice; + } + } + } else if (codStd == STD_DIV3 || codStd == STD_VP8 || + codStd == STD_VP9) { + PUT_LE32(pbHeader, pkt->size); + PUT_LE32(pbHeader, 0); + PUT_LE32(pbHeader, 0); + size += 12; + } + return size; +} + +static Int32 MakeupTheoraPacket(tho_parser_t *theora, BSChunk *packet, + AVPacket *avPacket, Uint32 seqSize) +{ + size_t size; + Int32 ret; + Uint8 *stream = (Uint8 *)packet->data; + + ret = theora->read_frame(theora->handle, avPacket->data, + avPacket->size); + if (ret < 0) { + VLOG(ERR, "%s:%d failed to read theora frame\n", __func__, + __LINE__); + return -1; + } + + size = theora_make_stream(theora->handle, stream + seqSize, PIC_RUN); + + return (size + seqSize); +} + +void *BSFeederFrameSize_Create(const char *path, CodStd codecId, + CodStd *retCodecId, Uint32 *retMp4ClassId, + Uint32 *retSeqWidth, Uint32 *retSeqHeight) +{ + /*lint -esym(438, avContext) */ + ReaderContext *ffmpegReader = NULL; + AVFormatContext *avContext = NULL; + AVCodecContext *codec = NULL; + AVInputFormat *fmt = NULL; + Int32 error; + Int32 videoIndex; + Uint32 mp4ClassId; + Int32 standard; + + av_register_all(); + + avContext = avformat_alloc_context(); + if (avContext == NULL) { + return NULL; + } + + avContext->flags |= CODEC_FLAG_TRUNCATED; + + error = avformat_open_input(&avContext, path, fmt, NULL); + if (error) { + VLOG(ERR, "%s:%d failed to av_open_input_file error(%d), %s\n", + __FILE__, __LINE__, error, path); + goto __failed_to_end; + } + + error = avformat_find_stream_info(avContext, NULL); + if (error < 0) { + VLOG(ERR, + "%s:%d failed to avformat_find_stream_info. error(%d)\n", + __func__, __LINE__, error); + goto __failed_to_end; + } + + videoIndex = av_find_best_stream(avContext, AVMEDIA_TYPE_VIDEO, -1, -1, + NULL, 0); + if (videoIndex < 0) { + VLOG(ERR, "%s:%d failed to av_find_best_stream.\n", + __func__, __LINE__); + goto __failed_to_end; + } + + codec = avContext->streams[videoIndex]->codec; + standard = ConvFOURCCToCodStd(codec->codec_tag); + + if (standard == -1) + standard = ConvCodecIdToCodStd(codec->codec_id); + + mp4ClassId = ConvFOURCCToMp4Class(codec->codec_tag); + if (mp4ClassId == -1) + mp4ClassId = ConvCodecIdToMp4Class(codec->codec_id); + + if (standard != STD_MPEG4) { + mp4ClassId = 0; + } + + if (retCodecId != NULL) { + *retCodecId = (CodStd)standard; + } + if (retMp4ClassId != NULL) { + *retMp4ClassId = mp4ClassId; + } + + if (retSeqWidth != NULL && retSeqHeight != NULL) { + *retSeqWidth = codec->width; + *retSeqHeight = codec->height; + } + + ffmpegReader = (ReaderContext *)osal_malloc(sizeof(ReaderContext)); + if (ffmpegReader == NULL) + goto __failed_to_end; + + ffmpegReader->standard = standard; + ffmpegReader->mp4ClassId = mp4ClassId; + ffmpegReader->avContext = avContext; + ffmpegReader->videoIndex = videoIndex; + ffmpegReader->isFirstPacket = TRUE; + ffmpegReader->tempBuffer = NULL; + ffmpegReader->tempRdPtr = 0; + ffmpegReader->tempWrPtr = 0; + ffmpegReader->theora = NULL; + osal_memset((void *)&ffmpegReader->superframe, 0x00, + sizeof(VP9Superframe)); + + if (standard == STD_THO || standard == STD_VP3) { + theora_parser_init((void **)&ffmpegReader->theora); + } + + return (void *)ffmpegReader; + +__failed_to_end: + if (avContext) { + avformat_free_context(avContext); + avContext = NULL; + } + + if (ffmpegReader) { + if (ffmpegReader->theora) + ffmpegReader->theora->close(ffmpegReader->theora); + osal_free(ffmpegReader); + } + + return NULL; + /*lint +esym(438, avContext) */ +} + +BOOL BSFeederFrameSize_Destroy(void *feeder) +{ + ReaderContext *ctx = (ReaderContext *)feeder; + Uint32 i; + + if (ctx == NULL) { + VLOG(ERR, "%s:%d Invalid handle\n", __func__, __LINE__); + return FALSE; + } + + if (ctx->avContext) + avformat_close_input(&ctx->avContext); + + if (ctx->theora) + ctx->theora->close(ctx->theora); + + for (i = 0; i < ctx->superframe.nframes; i++) { + if (ctx->superframe.frames[i] != NULL) { + free(ctx->superframe.frames[i]); + } + } + + osal_free(ctx); + + return TRUE; +} + +Int32 BSFeederFrameSize_Act(void *feeder, BSChunk *packet) +{ + ReaderContext *ffmpegReader = (ReaderContext *)feeder; + AVFormatContext *avFormatContext = ffmpegReader->avContext; + AVPacket avpacket; + Int32 error; + Uint8 *seqHeader = NULL; + Uint8 *picHeader = NULL; + Uint8 *ptr; + Int32 seqHeaderSize; + Int32 picHeaderSize; + Uint32 vindex, size, thoSeqSize; + Int32 retSize = -1; + Int32 packetSize = -1; + + if (ffmpegReader->tempBuffer) { + goto __consume_tempBuffer; + } + + if (ffmpegReader->standard == STD_VP9) { + VP9Superframe *superframe = &ffmpegReader->superframe; + if (superframe->nframes > 0) { + Uint32 index = superframe->currentIndex; + if (index >= superframe->nframes) { + Uint32 i; + for (i = 0; i < VP9_MAX_SUBFRAMES; i++) { + if (superframe->frames[i] != NULL) { + osal_free( + superframe->frames[i]); + } + } + osal_memset((void *)superframe, 0x00, + sizeof(VP9Superframe)); + } else { + osal_memcpy(packet->data, + superframe->frames[index], + superframe->frameSize[index]); + packet->size = superframe->frameSize[index]; + superframe->currentIndex++; + return packet->size; + } + } + } + + seqHeaderSize = 0; + picHeaderSize = 0; + thoSeqSize = 0; + + av_init_packet(&avpacket); + while (TRUE) { + error = av_read_frame(avFormatContext, &avpacket); + if (error < 0) { + if (!(error == AVERROR_EOF || + avFormatContext->pb->eof_reached == TRUE)) { + VLOG(ERR, + "%s:%d failed to av_read_frame error(0x%08x)\n", + __func__, __LINE__, error); + goto __end_read; + } else { + packet->eos = TRUE; + return 0; + } + } + + if (avpacket.stream_index != ffmpegReader->videoIndex) + continue; + + break; + } + + if (avpacket.size == 0) + return 0; + + if (avpacket.size >= (signed int)packet->size) { + VLOG(ERR, + "one packet size(%d) is bigger than STREAM_BUF_SIZE(%d)\n", + avpacket.size, packet->size); + return -1; + } + + osal_memset(packet->data, 0x00, packet->size); + + vindex = ffmpegReader->videoIndex; + + if (ffmpegReader->isFirstPacket) { + AVCodecContext *codec; + tho_parser_t *theora = ffmpegReader->theora; + Int32 ret; + struct { + int frameWidth; + int frameHeight; + int picWidth; + int picHeight; + int picOffsetX; + int picOffsetY; + } theoraScaleInfo; + + codec = ffmpegReader->avContext->streams[vindex]->codec; + seqHeader = (Uint8 *)osal_malloc(codec->extradata_size + 1024); + if (seqHeader == NULL) { + goto __end_read; + } + osal_memset((void *)seqHeader, 0x00, + codec->extradata_size + 1024); + + seqHeaderSize = BuildSeqHeader( + seqHeader, (CodStd)ffmpegReader->standard, + ffmpegReader->avContext->streams[vindex], &retSize); + if (seqHeaderSize < 0) { + VLOG(ERR, "%s:%d Can't make sequence header!\n", + __func__, __LINE__); + packetSize = -1; + goto __end_read; + } + + if (ffmpegReader->standard == STD_THO || + ffmpegReader->standard == STD_VP3) { + size = seqHeaderSize; + if (ffmpegReader->standard == STD_VP3) { + size = 0; + } + + ret = theora->open(theora->handle, seqHeader, size, + (Int32 *)&theoraScaleInfo); + if (ret < 0) { + VLOG(ERR, + "%s:%d failed to open theora parser error(%d)\n", + __func__, __LINE__, ret); + goto __end_read; + } + + thoSeqSize = theora_make_stream(theora->handle, + (Uint8 *)packet->data, + DEC_SEQ_INIT); + + osal_free(seqHeader); + seqHeader = NULL; + seqHeaderSize = 0; + } + + ffmpegReader->isFirstPacket = FALSE; + } + + picHeader = (Uint8 *)osal_malloc(1024); + picHeaderSize = + BuildPicHeader(picHeader, (CodStd)ffmpegReader->standard, + ffmpegReader->avContext->streams[vindex], + &avpacket, 0); + if (picHeaderSize < 0) { + VLOG(ERR, "%s:%d failed to build picture header\n", + __func__, __LINE__); + goto __end_read; + } + + ptr = avpacket.data; + size = avpacket.size; + switch (ffmpegReader->standard) { + case STD_RV: + if (seqHeaderSize) + osal_memcpy((char *)packet->data, seqHeader, + seqHeaderSize); + + if (picHeaderSize) + osal_memcpy((char *)packet->data + seqHeaderSize, + picHeader, picHeaderSize); + + if (ffmpegReader->standard == STD_RV) { + int cSlice = ptr[0] + 1; + int nSlice = avpacket.size - 1 - (cSlice * 8); + ptr += (1 + (cSlice * 8)); + size = nSlice; + } + + osal_memcpy((char *)packet->data + seqHeaderSize + + picHeaderSize, + ptr, size); + packetSize = seqHeaderSize + picHeaderSize + size; + break; + case STD_THO: + case STD_VP3: + packetSize = MakeupTheoraPacket(ffmpegReader->theora, packet, + &avpacket, thoSeqSize); + break; + case STD_VP9: + packet->size = size; + osal_memcpy((char *)packet->data, ptr, size); + packetSize = size; + break; + default: + if (picHeaderSize) + osal_memcpy((char *)packet->data, picHeader, + picHeaderSize); + + osal_memcpy((char *)packet->data + picHeaderSize, ptr, size); + packetSize = picHeaderSize + size; + break; + } + + if (avFormatContext->pb->eof_reached && + avFormatContext->packet_buffer == NULL) { + packet->eos = TRUE; + } + + // Sequence header data should be only one chunk data unit. + // In case of RV, 1st chunk should be Sequence header + 1st frame. + if (ffmpegReader->standard != STD_VP9 && + ffmpegReader->standard != STD_RV) { + if (seqHeaderSize > 0) { + ffmpegReader->tempBuffer = + (Uint8 *)osal_malloc(packetSize); + ffmpegReader->tempWrPtr = packetSize; + osal_memcpy(ffmpegReader->tempBuffer, + (Uint8 *)(packet->data), packetSize); + osal_memcpy(packet->data, seqHeader, seqHeaderSize); + packetSize = seqHeaderSize; + goto __end_read; + } + } else if (ffmpegReader->standard == STD_VP9) { + Uint8 *pData = (Uint8 *)packet->data; + Uint32 lastIndex = packet->size - 1; + + if (IS_VP9_SUPERFRAME(pData[lastIndex]) == TRUE) { + VP9Superframe *superframe = &ffmpegReader->superframe; + if (VP9ParseSuperframe(pData, packet->size, + superframe) == TRUE) { + osal_memcpy(packet->data, superframe->frames[0], + superframe->frameSize[0]); + packet->size = superframe->frameSize[0]; + packetSize = packet->size; + superframe->currentIndex++; + } + } + } + +__end_read: + av_free_packet(&avpacket); + + if (picHeader) + osal_free(picHeader); + if (seqHeader) + osal_free(seqHeader); + + return packetSize; + +__consume_tempBuffer: + if (ffmpegReader->tempBuffer != NULL) { + osal_memcpy(packet->data, ffmpegReader->tempBuffer, + ffmpegReader->tempWrPtr); + packetSize = ffmpegReader->tempWrPtr; + osal_free(ffmpegReader->tempBuffer); + ffmpegReader->tempBuffer = NULL; + ffmpegReader->tempWrPtr = 0; + ffmpegReader->tempRdPtr = 0; + } + + return packetSize; +} + +BOOL BSFeederFrameSize_Rewind(void *feeder) +{ + ReaderContext *ffmpegReader = (ReaderContext *)feeder; + AVFormatContext *avFormatContext = ffmpegReader->avContext; + Int32 ret; + + ret = av_seek_frame(avFormatContext, ffmpegReader->videoIndex, 0, 0); + if (ret < 0) { + VLOG(ERR, "%s:%d Failed to av_seek_frame:(ret:%d)\n", + __func__, __LINE__, ret); + return FALSE; + } + + return TRUE; +} +#else +void *BSFeederFrameSize_Create(const char *path, CodStd codecId, + CodStd *retCodecId, Uint32 *retMp4ClassId, + Uint32 *retSeqWidth, Uint32 *retSeqHeight) +{ + UNREFERENCED_PARAMETER(path); + UNREFERENCED_PARAMETER(codecId); + UNREFERENCED_PARAMETER(retCodecId); + UNREFERENCED_PARAMETER(retMp4ClassId); + UNREFERENCED_PARAMETER(retSeqWidth); + UNREFERENCED_PARAMETER(retSeqHeight); + + VLOG(ERR, "PLEASE PORT THIS %s ON YOUR ANDROID SYSTEM\n", __func__); + + return NULL; +} + +BOOL BSFeederFrameSize_Destroy(void *feeder) +{ + UNREFERENCED_PARAMETER(feeder); + + VLOG(ERR, "PLEASE PORT THIS %s ON YOUR ANDROID SYSTEM\n", __func__); + + return FALSE; +} + +Int32 BSFeederFrameSize_Act(void *feeder, BSChunk *packet) +{ + UNREFERENCED_PARAMETER(feeder); + UNREFERENCED_PARAMETER(packet); + + VLOG(ERR, "PLEASE PORT THIS %s ON YOUR ANDROID SYSTEM\n", __func__); + + return -1; +} + +BOOL BSFeederFrameSize_Rewind(void *feeder) +{ + UNREFERENCED_PARAMETER(feeder); + return FALSE; +} +#endif /* SUPPORT_FFMPEG_DEMUX */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_size_plus_es_impl.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_size_plus_es_impl.c new file mode 100644 index 0000000000..df06b6192d --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/bitstream/bsfeeder_size_plus_es_impl.c @@ -0,0 +1,119 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#include +#include +#include +#include + +#include "vpuapifunc.h" +#include "main_helper.h" + +#define MAX_FEEDING_SIZE 0x400000 /* 4MBytes */ + +typedef struct struct_ReaderConext { + osal_file_t fp; + Uint32 feedingSize; + BOOL eos; +} ReaderContext; + +void *BSFeederSizePlusEs_Create(const char *path) +{ + osal_file_t fp = NULL; + ReaderContext *context = NULL; + + fp = osal_fopen(path, "rb"); + if (fp == NULL) { + VLOG(ERR, "%s:%d failed to open %s\n", __func__, __LINE__, + path); + return NULL; + } + + context = (ReaderContext *)osal_malloc(sizeof(ReaderContext)); + if (context == NULL) { + VLOG(ERR, "%s:%d failed to allocate memory\n", __func__, + __LINE__); + osal_fclose(fp); + return NULL; + } + + context->fp = fp; + context->feedingSize = 0; + context->eos = FALSE; + + return (void *)context; +} + +BOOL BSFeederSizePlusEs_Destroy(void *feeder) +{ + ReaderContext *context = (ReaderContext *)feeder; + + if (context == NULL) { + VLOG(ERR, "%s:%d Null handle\n", __func__, __LINE__); + return FALSE; + } + + if (context->fp) + osal_fclose(context->fp); + + osal_free(context); + + return TRUE; +} + +Int32 BSFeederSizePlusEs_Act(void *feeder, BSChunk *chunk) +{ + ReaderContext *context = (ReaderContext *)feeder; + size_t nRead; + Uint32 chunkSize = 0; + + if (context == NULL) { + VLOG(ERR, "%s:%d Null handle\n", __func__, __LINE__); + return FALSE; + } + + if (context->eos == TRUE) { + return 0; + } + + osal_fread(&chunkSize, 1, 4, context->fp); + + nRead = osal_fread(chunk->data, 1, chunkSize, context->fp); + if (nRead > chunkSize) { + VLOG(ERR, "%s:%d failed to read bitstream(errno: %d)\n", + __func__, __LINE__, errno); + return 0; + } else if (nRead < chunkSize) { + context->eos = TRUE; + } + chunk->size = chunkSize; + + return nRead; +} + +BOOL BSFeederSizePlusEs_Rewind(void *feeder) +{ + ReaderContext *context = (ReaderContext *)feeder; + Int32 ret; + + ret = osal_fseek(context->fp, 0, SEEK_SET); + if (ret != 0) { + VLOG(ERR, "%s:%d failed osal_fseek(ret:%d)\n", __func__, + __LINE__, ret); + return FALSE; + } + + return TRUE; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/bin_comparator_impl.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/bin_comparator_impl.c new file mode 100644 index 0000000000..22aa4e654c --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/bin_comparator_impl.c @@ -0,0 +1,140 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "config.h" +#include "main_helper.h" + +typedef struct { + FILE *fp; +} Context; + +BOOL BinComparator_Create(ComparatorImpl *impl, char *path) +{ + Context *ctx; + FILE *fp; + + fp = osal_fopen(path, "rb"); + if (fp == NULL) { + VLOG(ERR, "%s:%d failed to open bin file: %s\n", __func__, + __LINE__, path); + return FALSE; + } + + ctx = (Context *)osal_malloc(sizeof(Context)); + if (ctx == NULL) { + osal_fclose(fp); + return FALSE; + } + + ctx->fp = fp; + impl->context = ctx; + impl->eof = FALSE; + + return TRUE; +} + +BOOL BinComparator_Destroy(ComparatorImpl *impl) +{ + Context *ctx = (Context *)impl->context; + + osal_fclose(ctx->fp); + osal_free(ctx); + + return TRUE; +} + +BOOL BinComparator_Compare(ComparatorImpl *impl, void *data, Uint32 size) +{ + Uint8 *pBin = NULL; + Context *ctx = (Context *)impl->context; + BOOL match = FALSE; + + pBin = (Uint8 *)osal_malloc(size); + + osal_fread(pBin, size, 1, ctx->fp); + + if (IsEndOfFile(ctx->fp) == TRUE) + impl->eof = TRUE; + else + impl->numOfFrames++; + + match = (osal_memcmp(data, (void *)pBin, size) == 0 ? TRUE : FALSE); + if (match == FALSE) { + FILE *fpGolden; + FILE *fpOutput; + char tmp[200]; + + if (impl->curIndex == 1) // because of header + VLOG(ERR, "MISMATCH WITH GOLDEN bin at header\n"); + else + VLOG(ERR, "MISMATCH WITH GOLDEN bin at %d frame\n", + impl->curIndex - 1); + + sprintf(tmp, "./golden_%s_%05d.bin", + GetBasename(impl->filename), impl->curIndex - 1); + + fpGolden = osal_fopen(tmp, "wb"); + if (fpGolden == NULL) { + VLOG(ERR, "Faild to create %s\n", tmp); + osal_free(pBin); + return FALSE; + } + VLOG(ERR, "Saving... Golden Bin at %s\n", tmp); + osal_fwrite(pBin, size, 1, fpGolden); + osal_fclose(fpGolden); + + sprintf(tmp, "./encoded_%s_%05d.bin", + GetBasename(impl->filename), impl->curIndex - 1); + + fpOutput = osal_fopen(tmp, "wb"); + if (fpOutput == NULL) { + VLOG(ERR, "Faild to create %s\n", tmp); + osal_free(pBin); + return FALSE; + } + VLOG(ERR, "Saving... encoded Bin at %s\n", tmp); + osal_fwrite(data, size, 1, fpOutput); + osal_fclose(fpOutput); + } + + osal_free(pBin); + + return match; +} + +BOOL BinComparator_Configure(ComparatorImpl *impl, ComparatorConfType type, + void *val) +{ + UNREFERENCED_PARAMETER(impl); + UNREFERENCED_PARAMETER(type); + UNREFERENCED_PARAMETER(val); + return FALSE; +} + +ComparatorImpl binComparatorImpl = { + NULL, + NULL, + 0, + 0, + BinComparator_Create, + BinComparator_Destroy, + BinComparator_Compare, + BinComparator_Configure, + (void *)NULL, + FALSE, + FALSE, + FALSE, +}; diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/comparator.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/comparator.c new file mode 100644 index 0000000000..7b2a9c0031 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/comparator.c @@ -0,0 +1,284 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#ifdef REDUNDENT_CODE +#include +#include "main_helper.h" +#include "../misc/skip.h" + +extern ComparatorImpl binComparatorImpl; +extern ComparatorImpl yuvComparatorImpl; + +static BOOL NullComparator_Create(ComparatorImpl *impl, char *path) +{ + UNREFERENCED_PARAMETER(impl); + UNREFERENCED_PARAMETER(path); + return TRUE; +} + +static BOOL NullComparator_Destroy(ComparatorImpl *impl) +{ + UNREFERENCED_PARAMETER(impl); + + return TRUE; +} + +static BOOL NullComparator_Compare(ComparatorImpl *impl, void *data, + Uint32 size) +{ + UNREFERENCED_PARAMETER(impl); + UNREFERENCED_PARAMETER(data); + UNREFERENCED_PARAMETER(size); + return TRUE; +} + +static BOOL NullComparator_Configure(ComparatorImpl *impl, + ComparatorConfType cmd, void *val) +{ + UNREFERENCED_PARAMETER(impl); + UNREFERENCED_PARAMETER(cmd); + UNREFERENCED_PARAMETER(val); + + return TRUE; +} + +static BOOL NullComparator_Rewind(ComparatorImpl *impl) +{ + UNREFERENCED_PARAMETER(impl); + return TRUE; +} + +ComparatorImpl nullComparatorImpl = { NULL, + NULL, + 0, + 0, + NullComparator_Create, + NullComparator_Destroy, + NullComparator_Compare, + NullComparator_Configure, + NullComparator_Rewind, + FALSE, + FALSE, + FALSE }; + +BOOL BinComparator_Create(ComparatorImpl *impl, char *path); + +BOOL BinComparator_Destroy(ComparatorImpl *impl); + +BOOL BinComparator_Compare(ComparatorImpl *impl, void *data, Uint32 size); + +BOOL BinComparator_Configure(ComparatorImpl *impl, ComparatorConfType type, + void *val); + +BOOL YUVComparator_Create(ComparatorImpl *impl, char *path); + +BOOL YUVComparator_Destroy(ComparatorImpl *impl); + +BOOL YUVComparator_Compare(ComparatorImpl *impl, void *data, Uint32 size); + +BOOL YUVComparator_Configure(ComparatorImpl *impl, ComparatorConfType cmd, + void *val); + +BOOL YUVComparator_Rewind(ComparatorImpl *impl); + +Comparator Comparator_Create(Uint32 type, char *goldenPath, ...) +{ + /*lint -esym(438, ap) */ + AbstractComparator *comp; + ComparatorImpl *impl = NULL; + va_list ap; + BOOL success = FALSE; + + if (type != NO_COMPARE && goldenPath == NULL) { + VLOG(ERR, "%s:%d golden path is NULL\n", __func__, + __LINE__); + return NULL; + } + + switch (type) { + case NO_COMPARE: + impl = (ComparatorImpl *)osal_malloc(sizeof(ComparatorImpl)); + osal_memset((void *)impl, 0x00, sizeof(ComparatorImpl)); + impl->Create = NullComparator_Create; + impl->Compare = NullComparator_Compare; + impl->Destroy = NullComparator_Destroy; + impl->Configure = NullComparator_Configure; + impl->Rewind = NullComparator_Rewind; + success = impl->Create(impl, goldenPath); + break; + case YUV_COMPARE: + impl = (ComparatorImpl *)osal_malloc(sizeof(ComparatorImpl)); + osal_memset((void *)impl, 0x00, sizeof(ComparatorImpl)); + impl->Create = YUVComparator_Create; + impl->Compare = YUVComparator_Compare; + impl->Destroy = YUVComparator_Destroy; + impl->Configure = YUVComparator_Configure; + impl->Rewind = YUVComparator_Rewind; + + success = impl->Create(impl, goldenPath); + if (success == TRUE) { + PictureInfo picInfo; + va_start(ap, goldenPath); + picInfo.width = va_arg(ap, Uint32); + picInfo.height = va_arg(ap, Uint32); + picInfo.format = (FrameBufferFormat)va_arg(ap, Uint32); + picInfo.cbcrInterleave = va_arg(ap, BOOL); + picInfo.isVp9 = va_arg(ap, BOOL); + va_end(ap); + impl->Configure(impl, COMPARATOR_CONF_SET_PICINFO, + (void *)&picInfo); + } + break; + case STREAM_COMPARE: + impl = osal_malloc(sizeof(ComparatorImpl)); + osal_memset((void *)impl, 0x00, sizeof(ComparatorImpl)); + impl->Create = &BinComparator_Create; + impl->Compare = &BinComparator_Compare; + impl->Destroy = &BinComparator_Destroy; + impl->Configure = &BinComparator_Configure; + va_start(ap, goldenPath); + impl->filename = va_arg(ap, char *); + va_end(ap); + success = impl->Create(impl, goldenPath); + break; + default: + VLOG(ERR, "Invalid comparison type:%d\n", type); + return NULL; + } + + if (success == FALSE) + return NULL; + + comp = (AbstractComparator *)osal_malloc(sizeof(AbstractComparator)); + impl->curIndex = 0; + comp->impl = impl; + comp->totalFrames = impl->numOfFrames; + + return comp; + /*lint +esym(438, ap) */ +} + +BOOL Comparator_Destroy(Comparator comp) +{ + ComparatorImpl *impl = NULL; + AbstractComparator *absComp = (AbstractComparator *)comp; + + if (comp == NULL) { + VLOG(ERR, "%s:%d Invalid handle\n", __func__, __LINE__); + return FALSE; + } + + impl = absComp->impl; + + impl->Destroy(impl); + + osal_free(impl); + + return TRUE; +} + +BOOL Comparator_Act(Comparator comp, void *data, Uint32 size) +{ + ComparatorImpl *impl = NULL; + AbstractComparator *absComp = (AbstractComparator *)comp; + + if (comp == NULL) { + VLOG(ERR, "%s:%d Invalid handle\n", __func__, __LINE__); + return FALSE; + } + + impl = absComp->impl; + impl->curIndex++; + if (impl->usePrevDataOneTime == TRUE) + impl->curIndex--; + + return impl->Compare(impl, data, size); +} + +BOOL Comparator_CheckFrameCount(Comparator comp) +{ + ComparatorImpl *impl = NULL; + AbstractComparator *absComp = (AbstractComparator *)comp; + BOOL match = TRUE; + + if (comp == NULL) { + VLOG(ERR, "%s:%d Invalid handle\n", __func__, __LINE__); + return FALSE; + } + + impl = absComp->impl; + + if (impl->curIndex != absComp->totalFrames) { + VLOG(ERR, "MISMATCH FRAME COUNT: GOLDEN(%d) DECODED(%d)\n", + impl->numOfFrames, impl->curIndex); + match = FALSE; + } + + return match; +} + +/* \brief When scan mode is enable, Comparator_Act() tries to find data + * matched with decoded result by scanning all data + */ +BOOL Comparator_SetScanMode(Comparator comp, BOOL enable) +{ + AbstractComparator *absComp = (AbstractComparator *)comp; + ComparatorImpl *impl = NULL; + + if (absComp == NULL) { + return FALSE; + } + impl = absComp->impl; + + impl->enableScanMode = enable; + + return TRUE; +} + +BOOL Comparator_Rewind(Comparator comp) +{ + AbstractComparator *absComp = (AbstractComparator *)comp; + ComparatorImpl *impl = NULL; + + if (absComp == NULL) { + return FALSE; + } + impl = absComp->impl; + absComp->totalFrames += impl->numOfFrames; + + return impl->Rewind(impl); +} + +BOOL Comparator_CheckEOF(Comparator comp) +{ + ComparatorImpl *impl = NULL; + AbstractComparator *absComp = (AbstractComparator *)comp; + BOOL match = TRUE; + + if (comp == NULL) { + VLOG(ERR, "%s:%d Invalid handle\n", __func__, __LINE__); + return FALSE; + } + + impl = absComp->impl; + + if (impl->eof == FALSE) { + VLOG(ERR, "It is not the end of file.\n"); + match = FALSE; + } + + return match; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/md5_comparator_impl.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/md5_comparator_impl.c new file mode 100644 index 0000000000..95080a8fa8 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/md5_comparator_impl.c @@ -0,0 +1,181 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include +#include "main_helper.h" +#include "../misc/skip.h" + +typedef struct { + osal_file_t fp; + Uint32 md5Size; + Uint32 prevMd5[12]; +} Context; + +BOOL MD5Comparator_Create(ComparatorImpl *impl, char *path) +{ + Context *ctx; + osal_file_t fp; + Uint32 temp; + + fp = osal_fopen(path, "r"); + if (fp == NULL) { + VLOG(ERR, "%s:%d failed to open md5 file: %s, errno(%d)\n", + __func__, __LINE__, path, errno); + return FALSE; + } + + ctx = (Context *)osal_malloc(sizeof(Context)); + if (ctx == NULL) { + osal_fclose(fp); + return FALSE; + } + + while (!osal_feof(fp)) { + if (osal_fscanf((FILE *)fp, "%08x", &temp) < 1) + break; + impl->numOfFrames++; + } + + osal_fseek(fp, 0, SEEK_SET); + + ctx->fp = fp; + ctx->md5Size = 12; + impl->context = ctx; + impl->eof = FALSE; + + return TRUE; +} + +BOOL MD5Comparator_Destroy(ComparatorImpl *impl) +{ + Context *ctx = (Context *)impl->context; + + osal_fclose(ctx->fp); + osal_free(ctx); + + return TRUE; +} + +BOOL MD5Comparator_Compare(ComparatorImpl *impl, void *data, Uint32 size) +{ + Context *ctx = (Context *)impl->context; + BOOL match = TRUE; + Uint32 md5[12]; + Uint32 index; + Uint32 *decodedMD5 = (Uint32 *)data; + + if (ctx->md5Size != size) { + VLOG(ERR, "%s:%d different MD5 size\n", __func__, __LINE__); + return FALSE; + } + + do { + osal_memset((void *)md5, 0x00, sizeof(md5)); + if (impl->usePrevDataOneTime == TRUE) { + impl->usePrevDataOneTime = FALSE; + osal_memcpy(md5, ctx->prevMd5, + ctx->md5Size * sizeof(md5[0])); + } else { + for (index = 0; index < ctx->md5Size; index++) { + /* FIXME: osal_osal_fscanf has problem on + * Windows. + */ + osal_fscanf((FILE *)ctx->fp, "%08x", + &md5[index]); + + if (IsEndOfFile(ctx->fp) == TRUE) { + impl->eof = TRUE; + break; + } + } + } + + if (data == NULL) + return FALSE; + + match = TRUE; + for (index = 0; index < size; index++) { + if (md5[index] != decodedMD5[index]) { + match = FALSE; + break; + } + } + } while (impl->enableScanMode == TRUE && match == FALSE && + impl->eof == FALSE); + + osal_memcpy(ctx->prevMd5, md5, ctx->md5Size * sizeof(md5[0])); + + if (match == FALSE) { + VLOG(ERR, "MISMATCH WITH GOLDEN MD5 at %d frame\n", + impl->curIndex); + VLOG(ERR, "GOLDEN DECODED\n" + "-----------------------\n"); + for (index = 0; index < size; index++) + VLOG(ERR, "%08x %08x\n", md5[index], + decodedMD5[index]); + } + + return match; +} + +BOOL MD5Comparator_Configure(ComparatorImpl *impl, ComparatorConfType type, + void *val) +{ + Context *ctx = (Context *)impl->context; + BOOL ret = TRUE; + + switch (type) { + case COMPARATOR_CONF_SET_GOLDEN_DATA_SIZE: + ctx->md5Size = *(Uint32 *)val; + impl->numOfFrames /= ctx->md5Size; + break; + default: + ret = FALSE; + break; + } + + return ret; +} + +BOOL MD5Comparator_Rewind(ComparatorImpl *impl) +{ + Context *ctx = (Context *)impl->context; + Int32 ret; + + ret = osal_fseek(ctx->fp, 0, SEEK_SET); + if (ret != 0) { + VLOG(ERR, "%s:%d Failed to osal_fseek(ret: %d)\n", __func__, + __LINE__, ret); + return FALSE; + } + + return TRUE; +} + +ComparatorImpl md5ComparatorImpl = { + NULL, + NULL, + 0, + 0, + MD5Comparator_Create, + MD5Comparator_Destroy, + MD5Comparator_Compare, + MD5Comparator_Configure, + MD5Comparator_Rewind, + FALSE, + FALSE, + FALSE, +}; diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/yuv_comparator_impl.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/yuv_comparator_impl.c new file mode 100644 index 0000000000..fba35dcdc5 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/comparator/yuv_comparator_impl.c @@ -0,0 +1,331 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "config.h" +#include "main_helper.h" +#include "../misc/skip.h" +#if defined(PLATFORM_LINUX) || defined(PLATFORM_QNX) +#include +#include +#endif +#ifdef PLATFORM_NON_OS +#ifdef LIB_C_STUB +#include +#include +#endif +#endif + +typedef struct { + osal_file_t fp; + Uint32 width; + Uint32 height; + Uint32 frameSize; + BOOL cbcrInterleave; + FrameBufferFormat format; + char *path; + Uint32 isVp9; +} Context; + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +static Uint32 Calculate(Context *ctx) +{ + Uint32 lumaSize = 0; + Uint32 chromaSize = 0; + Uint32 frameSize = 0; + Uint32 frames = 0; + Uint32 width = ctx->width; + Uint32 height = ctx->height; + Uint64 endPos = 0; + BOOL cbcrInterleave = ctx->cbcrInterleave; + FrameBufferFormat format = ctx->format; +#if defined(PLATFORM_LINUX) || defined(PLATFORM_QNX) + struct stat file_info; +#endif +#ifdef PLATFORM_NON_OS +#ifdef LIB_C_STUB + struct stat file_info; +#endif +#endif + + lumaSize = width * height; + switch (format) { + case FORMAT_400: + chromaSize = 0; + break; + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + chromaSize = lumaSize; + break; + case FORMAT_420: + chromaSize = lumaSize >> 1; + break; + case FORMAT_422: + case FORMAT_224: + chromaSize = lumaSize; + break; + case FORMAT_444: + chromaSize = lumaSize * 2; + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + lumaSize *= 2; + chromaSize = lumaSize >> 1; + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: +#ifdef DUMP_YUV_WHOLE_DATA + if (cbcrInterleave) { + lumaSize = + ((VPU_ALIGN16(width) + 11) / 12 * 16) * height; + chromaSize = + (VPU_ALIGN16(((VPU_ALIGN16((width >> 1))) * 2 + + 11) / + 12 * 16) * + height) >> + 1; + } else { + lumaSize = + ((VPU_ALIGN16(width) + 11) / 12 * 16) * height; + chromaSize = + ((VPU_ALIGN16( + ((VPU_ALIGN16((width >> 1))) + 11) / + 12 * 16) * + height) >> + 1) + << 1; + } +#else + if (cbcrInterleave) { + lumaSize = ((width + 2) / 3 * 4) * height; + chromaSize = (((width + 2) / 3 * 4) * height) >> 1; + } else { + lumaSize = (width + 2) / 3 * 4 * height; + chromaSize = + ((((width >> 1) + 2) / 3 * 4 * height) >> 1) + << 1; + } +#endif + break; + case FORMAT_422_P10_16BIT_MSB: + case FORMAT_422_P10_16BIT_LSB: + lumaSize *= 2; + chromaSize = lumaSize; + break; + case FORMAT_422_P10_32BIT_LSB: + case FORMAT_422_P10_32BIT_MSB: { + Uint32 twice = cbcrInterleave ? 2 : 1; + if (ctx->isVp9 == TRUE) { + lumaSize = VPU_ALIGN32(((width + 11) / 12) * 16); + chromaSize = (((width >> 1) + 11) * twice / 12) * 16; + } else { + width = VPU_ALIGN32(width); + lumaSize = ((VPU_ALIGN16(width) + 11) / 12) * 16; + chromaSize = ((VPU_ALIGN16((width >> 1)) + 11) * twice / + 12) * + 16; + if ((chromaSize * 2) > lumaSize) { + lumaSize = chromaSize * 2; + } + } + if (cbcrInterleave == TRUE) { + lumaSize = MAX(lumaSize, chromaSize); + } + } break; + default: + VLOG(ERR, "%s:%d Invalid format: %d\n", __FILE__, __LINE__, + format); + } + frameSize = lumaSize + chromaSize; + +#ifdef PLATFORM_WIN32 +#if (_MSC_VER == 1200) + osal_fseek(ctx->fp, 0, SEEK_END); + endPos = ftell(ctx->fp); + osal_fseek(ctx->fp, 0, SEEK_SET); +#else + _fseeki64((FILE *)ctx->fp, 0LL, SEEK_END); + endPos = _ftelli64((FILE *)ctx->fp); + _fseeki64((FILE *)ctx->fp, 0LL, SEEK_SET); +#endif +#else + stat(ctx->path, &file_info); + endPos = file_info.st_size; +#endif + + frames = (Uint32)(endPos / frameSize); + + if (endPos % frameSize) { + VLOG(ERR, "%s:%d Mismatch - file_size: %llu frameSize: %d\n", + __func__, __LINE__, endPos, frameSize); + } + ctx->frameSize = frameSize; + + return frames; +} + +BOOL YUVComparator_Create(ComparatorImpl *impl, char *path) +{ + Context *ctx; + osal_file_t *fp; + + fp = osal_fopen(path, "rb"); + if (fp == NULL) { + VLOG(ERR, "%s:%d failed to open yuv file: %s\n", __func__, + __LINE__, path); + return FALSE; + } + + ctx = (Context *)osal_malloc(sizeof(Context)); + if (ctx == NULL) { + osal_fclose(fp); + return FALSE; + } + + ctx->fp = fp; + ctx->path = path; + impl->context = ctx; + impl->eof = FALSE; + + return TRUE; +} + +BOOL YUVComparator_Destroy(ComparatorImpl *impl) +{ + Context *ctx = (Context *)impl->context; + + osal_fclose(ctx->fp); + osal_free(ctx); + + return TRUE; +} + +BOOL YUVComparator_Compare(ComparatorImpl *impl, void *data, Uint32 size) +{ + Uint8 *pYuv = NULL; + Context *ctx = (Context *)impl->context; + BOOL match = FALSE; + + if (data == (void *)COMPARATOR_SKIP) { + int fpos; + fpos = osal_ftell(ctx->fp); + osal_fseek(ctx->fp, fpos + size, SEEK_SET); + + if (IsEndOfFile(ctx->fp) == TRUE) + impl->eof = TRUE; + + return TRUE; + } + + pYuv = (Uint8 *)osal_malloc(size); + osal_fread(pYuv, 1, size, ctx->fp); + + if (IsEndOfFile(ctx->fp) == TRUE) + impl->eof = TRUE; + + match = (osal_memcmp(data, (void *)pYuv, size) == 0 ? TRUE : FALSE); + if (match == FALSE) { + osal_file_t *fpGolden; + osal_file_t *fpOutput; + char tmp[200]; + + VLOG(ERR, "MISMATCH WITH GOLDEN YUV at %d frame\n", + impl->curIndex); + sprintf(tmp, "./golden.yuv"); + + fpGolden = osal_fopen(tmp, "wb"); + if (fpGolden == NULL) { + VLOG(ERR, "Faild to create golden.yuv\n"); + osal_free(pYuv); + return FALSE; + } + VLOG(ERR, "Saving... Golden YUV at %s\n", tmp); + + sprintf(tmp, "./decoded.yuv"); + osal_fwrite(pYuv, 1, size, fpGolden); + osal_fclose(fpGolden); + + fpOutput = osal_fopen(tmp, "wb"); + if (fpOutput == NULL) { + VLOG(ERR, "Faild to create golden.yuv\n"); + osal_free(pYuv); + return FALSE; + } + VLOG(ERR, "Saving... decoded YUV at %s\n", tmp); + osal_fwrite(data, 1, size, fpOutput); + osal_fclose(fpOutput); + } + osal_free(pYuv); + + return match; +} + +BOOL YUVComparator_Configure(ComparatorImpl *impl, ComparatorConfType type, + void *val) +{ + PictureInfo *yuv = NULL; + Context *ctx = (Context *)impl->context; + BOOL ret = TRUE; + + switch (type) { + case COMPARATOR_CONF_SET_PICINFO: + yuv = (PictureInfo *)val; + ctx->width = yuv->width; + ctx->height = yuv->height; + ctx->format = yuv->format; + ctx->cbcrInterleave = yuv->cbcrInterleave; + // can not calculate a sequence changed YUV + impl->numOfFrames = Calculate(ctx); + break; + default: + ret = FALSE; + break; + } + return ret; +} + +BOOL YUVComparator_Rewind(ComparatorImpl *impl) +{ + Context *ctx = (Context *)impl->context; + Int32 ret; + + ret = osal_fseek(ctx->fp, 0, SEEK_SET); + if (ret != 0) { + VLOG(ERR, "%s:%d failed to osal_fseek(ret:%d)\n", __func__, + __LINE__, ret); + return FALSE; + } + + return TRUE; +} + +ComparatorImpl yuvComparatorImpl = { + NULL, + NULL, + 0, + 0, + YUVComparator_Create, + YUVComparator_Destroy, + YUVComparator_Compare, + YUVComparator_Configure, + YUVComparator_Rewind, + FALSE, + FALSE, + FALSE, +}; diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/display/fbdev_impl.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/display/fbdev_impl.c new file mode 100644 index 0000000000..b3c0658307 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/display/fbdev_impl.c @@ -0,0 +1,907 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "main_helper.h" + +typedef enum { + YUV444, + YUV422, + YUV420, + NV12, + NV21, + YUV400, + YUYV, + YVYU, + UYVY, + VYUY, + YYY, + RGB_PLANAR, + RGB32, + RGB24, + RGB16, + YUV2RGB_COLOR_FORMAT_MAX +} YUV2RGBColorFmt; + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_QNX) +#include +#endif + +#if defined(PLATFORM_WIN32) || defined(PLATFORM_LINUX) || defined(PLATFORM_QNX) +static void ConvertYuvToRgb(Uint32 width, Uint32 height, YUV2RGBColorFmt format, + Uint8 *src, Uint8 *rgba, BOOL chroma_reverse); + +static YUV2RGBColorFmt ConvertToDeviceColorFormat(int yuv_format, + int interleave); +#endif // defined(PLATFORM_WIN32) || defined(PLATFORM_LINUX) + +#if defined(PLATFORM_WIN32) +#include +#include + +#pragma comment(lib, "User32.lib") +#pragma comment(lib, "gdi32.lib") + +#define DRAW_IN_WINDOW +typedef struct { + BITMAPINFOHEADER bmih; + RGBQUAD rgb[256]; +} BITMAPINFO2; + +static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, + LPARAM lParam); + +typedef struct { + HBITMAP s_dib_section; + void *s_dib_buffer; + HDC s_hdc_memory; + HGDIOBJ s_old_hobject; + HWND s_hWnd; + int wndShow; + Uint32 winWidth; + Uint32 winHeight; +} FBDev; + +static FBDev s_mixer[MAX_NUM_VPU_CORE * MAX_NUM_INSTANCE]; +#endif // defined(PLATFORM_WIN32) + +#ifdef PLATFORM_LINUX + +#include +#include +#include +#include +#include + +typedef struct { + int s_fd; + unsigned char *s_scr_ptr; + unsigned char *s_rgb_ptr; + unsigned long s_product; + int s_fb_stride; + int s_fb_height; + int s_fb_width; + int s_fb_bpp; +} FBDev; + +static struct fb_var_screeninfo vscr_info; +static struct fb_fix_screeninfo fscr_info; + +static FBDev s_mixer[MAX_NUM_VPU_CORE * MAX_NUM_INSTANCE]; +#endif // PLATFORM_LINUX + +static Int32 PlatformDev_Open(Uint32 coreIndex, Int32 width, Int32 height) +{ +#ifdef PLATFORM_LINUX + FBDev *mixer = &s_mixer[coreIndex]; + char fb_name[256]; + + if (mixer->s_fd) + return 1; +#ifdef ANDROID + sprintf(fb_name, "/dev/graphics/fb%d", coreIndex); +#else + sprintf(fb_name, "/dev/fb%d", coreIndex); +#endif + + mixer->s_fd = open(fb_name, O_RDWR); + if (mixer->s_fd < 0) { + VLOG(ERR, "Unable to open framebuffer %s\n", fb_name); + return 0; + } + /** frame buffer display configuration get */ + if (ioctl(mixer->s_fd, FBIOGET_VSCREENINFO, &vscr_info) != 0 || + ioctl(mixer->s_fd, FBIOGET_FSCREENINFO, &fscr_info) != 0) { + VLOG(ERR, + "Error during ioctl to get framebuffer parameters!\n"); + return 0; + } + mixer->s_fb_bpp = vscr_info.bits_per_pixel >> 3; + mixer->s_fb_width = vscr_info.xres; + mixer->s_fb_stride = fscr_info.line_length; + mixer->s_fb_height = vscr_info.yres; + mixer->s_product = mixer->s_fb_stride * mixer->s_fb_height; + /** memory map frame buf memory */ + mixer->s_scr_ptr = (unsigned char *)mmap(0, mixer->s_product, + PROT_READ | PROT_WRITE, + MAP_SHARED, mixer->s_fd, 0); + if (mixer->s_scr_ptr == NULL) { + VLOG(ERR, "in %s Failed to mmap framebuffer memory!\n", + __func__); + close(mixer->s_fd); + return 0; + } + + mixer->s_rgb_ptr = osal_malloc(width * height * mixer->s_fb_bpp); + if (mixer->s_rgb_ptr == NULL) { + VLOG(ERR, "in %s Failed to allocate rgb memory!\n", __func__); + close(mixer->s_fd); + return 0; + } + VLOG(TRACE, "Successfully opened %s for display.\n", fb_name); + VLOG(TRACE, "mmap framebuffer memory =%p product=%d\n", + mixer->s_scr_ptr, (unsigned int)mixer->s_product, (int)width); + VLOG(TRACE, + "Display Size: width=%d, height=%d, stride=%d, Bit Count: %d\n", + (int)mixer->s_fb_width, (int)mixer->s_fb_height, + (int)mixer->s_fb_stride, (int)mixer->s_fb_bpp); + +#endif //#ifdef PLATFORM_LINUX + +#if defined(PLATFORM_WIN32) + FBDev *mixer = &s_mixer[coreIndex]; + + HDC hdc; + BITMAPINFO2 bmi2; + if (mixer->s_dib_section) + return 0; + + osal_memset(&bmi2, 0x00, sizeof(bmi2)); + bmi2.bmih.biSize = sizeof(BITMAPINFOHEADER); + bmi2.bmih.biWidth = width; + bmi2.bmih.biHeight = -(height); + bmi2.bmih.biPlanes = 1; + bmi2.bmih.biBitCount = 32; + bmi2.bmih.biCompression = BI_RGB; + if (bmi2.bmih.biBitCount == 16) { + bmi2.bmih.biCompression = BI_BITFIELDS; + *(DWORD *)(&bmi2.rgb[0]) = 0xF800; + *(DWORD *)(&bmi2.rgb[1]) = 0x07e0; + *(DWORD *)(&bmi2.rgb[2]) = 0x001F; + } else + bmi2.bmih.biCompression = BI_RGB; + + mixer->s_dib_section = + CreateDIBSection(NULL, (PBITMAPINFO)&bmi2, DIB_RGB_COLORS, + &mixer->s_dib_buffer, NULL, 0); + + hdc = GetDC(mixer->s_hWnd); + mixer->s_hdc_memory = CreateCompatibleDC(hdc); + if (!mixer->s_hdc_memory) + return 0; + ReleaseDC(mixer->s_hWnd, hdc); + + mixer->s_old_hobject = + SelectObject(mixer->s_hdc_memory, mixer->s_dib_section); + if (!mixer->s_old_hobject) + return 0; + +#ifdef DRAW_IN_WINDOW + { + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = GetModuleHandle(NULL); + wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wcex.lpszMenuName = NULL; + wcex.lpszClassName = (LPCTSTR) "CNMMIXER"; + wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); + + RegisterClassEx(&wcex); + + mixer->s_hWnd = CreateWindow((LPCTSTR) "CNMMIXER", + (LPCTSTR) "C&M YuvViewer", + WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, + CW_USEDEFAULT, width, height, NULL, + NULL, GetModuleHandle(NULL), NULL); + MoveWindow(mixer->s_hWnd, coreIndex * width, 0, width + 16, + height + 38, TRUE); + mixer->wndShow = 0; + } +#endif +#endif //#if defined(PLATFORM_WIN32) + +#if defined(PLATFORM_QNX) +#endif + return 1; +} + +#ifdef PLATFORM_WIN32 +static Uint8 *convert16bitTo8bit(Uint8 *src, Uint32 w, Uint32 h, + FrameBufferFormat format) +{ + Uint8 *dst; + Uint8 *pdst; + Uint16 *psrc = (Uint16 *)src; + Uint32 x, y, shift; + + if (format == FORMAT_420_P10_16BIT_MSB) + shift = 8; + else + shift = 2; + + pdst = dst = (Uint8 *)osal_malloc((w * h * 3) >> 1); + /* Y */ + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + *dst++ = ((*psrc++) >> shift) & 0xff; + } + } + /* Cb */ + for (y = 0; y < (h >> 1); y++) { + for (x = 0; x < (w >> 1); x++) { + *dst++ = (*psrc++ >> shift) & 0xff; + } + } + /* Cr */ + for (y = 0; y < (h >> 1); y++) { + for (x = 0; x < (w >> 1); x++) { + *dst++ = (*psrc++ >> shift) & 0xff; + } + } + + return pdst; +} +#endif /* PLATFORM_WIN32 */ + +static void PlatformDev_Close(Uint32 coreIndex) +{ +#ifdef PLATFORM_LINUX + FBDev *mixer = &s_mixer[coreIndex]; + if (mixer->s_scr_ptr) { + munmap(mixer->s_scr_ptr, mixer->s_product); + mixer->s_scr_ptr = NULL; + } + if (mixer->s_rgb_ptr) { + osal_free(mixer->s_rgb_ptr); + mixer->s_rgb_ptr = NULL; + } + + if (mixer->s_fd) { + close(mixer->s_fd); + mixer->s_fd = 0; + } +#endif + +#if defined(PLATFORM_WIN32) + FBDev *mixer = &s_mixer[coreIndex]; + if (mixer->s_old_hobject) { + SelectObject(mixer->s_hdc_memory, mixer->s_old_hobject); + } + if (mixer->s_hdc_memory) { + DeleteDC(mixer->s_hdc_memory); + } + if (mixer->s_dib_section) { + DeleteObject(mixer->s_dib_section); + } + + if (mixer->s_hWnd) { + DestroyWindow(mixer->s_hWnd); + } + + osal_memset(mixer, 0x00, sizeof(FBDev)); +#endif //#if defined(PLATFORM_WIN32) + +#if defined(PLATFORM_QNX) +#endif +} + +static int PlatformDev_Draw(Uint32 coreIndex, Uint32 x, Uint32 y, Uint32 width, + Uint32 height, FrameBufferFormat format, + Uint8 *pbImage, BOOL interleave, Uint32 bpp) +{ +#ifdef PLATFORM_LINUX + FBDev *mixer = &s_mixer[coreIndex]; + unsigned char *src_ptr = pbImage; + YUV2RGBColorFmt colorFormat; + + UNREFERENCED_PARAMETER(x); + UNREFERENCED_PARAMETER(y); + UNREFERENCED_PARAMETER(bpp); + + if (mixer->s_fd < 0) + return 0; + + colorFormat = ConvertToDeviceColorFormat(format, interleave); + if (colorFormat == YUV2RGB_COLOR_FORMAT_MAX) { + VLOG(ERR, "[ERROR]not supported image format\n"); + return 0; + } + + if (mixer->s_fb_bpp == 8) { + ConvertYuvToRgb(width, height, colorFormat, src_ptr, + mixer->s_rgb_ptr, 1); + } else { + return 0; + } + // Not implemented yet +#endif //#ifdef PLATFORM_LINUX + +#if defined(PLATFORM_WIN32) + FBDev *mixer = &s_mixer[coreIndex]; + HDC hdc_screen; + YUV2RGBColorFmt color_format; + Uint8 *pYuv = NULL; + + if (mixer->winWidth != width || mixer->winHeight != height) { + /* re-create window */ + PlatformDev_Close(coreIndex); + PlatformDev_Open(coreIndex, width, height); + mixer->winWidth = width; + mixer->winHeight = height; + } + + if (!mixer->wndShow) { + ShowWindow(mixer->s_hWnd, SW_SHOW); + UpdateWindow(mixer->s_hWnd); + // SetForegroundWindow(mixer->s_hWnd); + mixer->wndShow = 1; + } else { + MSG msg = { 0 }; + while (1) { + if (PeekMessage(&msg, mixer->s_hWnd, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } else + break; + } + } + +#ifdef DRAW_IN_WINDOW + hdc_screen = GetDC(mixer->s_hWnd); +#else + hdc_screen = GetDC(NULL); +#endif + + color_format = ConvertToDeviceColorFormat(format, interleave); + + if (color_format == YUV2RGB_COLOR_FORMAT_MAX) { + VLOG(ERR, "[ERROR]not supported image format\n"); + return 0; + } + + if (bpp == 16) + pYuv = convert16bitTo8bit(pbImage, width, height, format); + else + pYuv = pbImage; + + ConvertYuvToRgb(width, height, color_format, pYuv, + (unsigned char *)mixer->s_dib_buffer, 1); + + if (bpp == 16) + osal_free(pYuv); + + if (hdc_screen) { +#if 0 + RECT rc; + Int32 dispWidth; + Int32 dispHeight; + GetClientRect(mixer->s_hWnd, &rc); + dispWidth = rc.right - rc.left; + dispHeight = rc.bottom - rc.top; + if (width != dispWidth || height != dispHeight) + StretchBlt(hdc_screen, 0, 0, dispWidth, dispHeight, + mixer->s_hdc_memory, x, y, width, height, + SRCCOPY); + else + BitBlt(hdc_screen, x, y, width, height, + mixer->s_hdc_memory, 0, 0, SRCCOPY); +#else + BitBlt(hdc_screen, x, y, width, height, mixer->s_hdc_memory, 0, + 0, SRCCOPY); +#endif + + ReleaseDC(mixer->s_hWnd, hdc_screen); + } + + // SetForegroundWindow(s_hWnd); +#endif //#if defined(PLATFORM_WIN32) + +#if defined(PLATFORM_QNX) +#endif + return 1; +} + +#if defined(PLATFORM_WIN32) +static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, + LPARAM lParam) +{ + PAINTSTRUCT ps; + switch (message) { + case WM_CREATE: + return 0; + + case WM_PAINT: + BeginPaint(hwnd, &ps); + + EndPaint(hwnd, &ps); + return 0; + + case WM_CLOSE: + return 0; + + case WM_DESTROY: + PostQuitMessage(0); + return 0; + } + return DefWindowProc(hwnd, message, wParam, lParam); +} + +#endif // defined(PLATFORM_WIN32) + +#if defined(PLATFORM_WIN32) || defined(PLATFORM_LINUX) || defined(PLATFORM_QNX) +// inteleave : 0 (chroma separate mode), 1 (cbcr interleave mode), 2 (crcb +// interleave mode) +static YUV2RGBColorFmt ConvertToDeviceColorFormat(int yuv_format, + int interleave) +{ + YUV2RGBColorFmt format; + + switch (yuv_format) { + case FORMAT_400: + format = YUV400; + break; + case FORMAT_444: + format = YUV444; + break; + case FORMAT_224: + case FORMAT_422: + format = YUV422; + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_420: + if (interleave == 0) + format = YUV420; + else if (interleave == 1) + format = NV12; + else + format = NV21; + break; + default: + format = YUV2RGB_COLOR_FORMAT_MAX; + } + + return format; +} +#endif // defined(PLATFORM_WIN32) || defined(PLATFORM_LINUX) + +#if defined(PLATFORM_WIN32) || defined(PLATFORM_LINUX) || defined(PLATFORM_QNX) +static void ConvertYuvToRgb(Uint32 width, Uint32 height, YUV2RGBColorFmt format, + Uint8 *src, Uint8 *rgba, BOOL cbcr_reverse) +{ +#define CLIP(var) ((var >= 255) ? 255 : (var <= 0) ? 0 : var) + Uint32 j, i; + Int32 c, d, e; + + Uint8 *line = rgba; + Uint8 *cur; + Uint8 *y = NULL; + Uint8 *u = NULL; + Uint8 *v = NULL; + Uint8 *misc = NULL; + + Uint32 frame_size_y; + Uint32 frame_size_uv; + Uint32 t_width; + + frame_size_y = width * height; + + if (format == YUV444 || format == RGB_PLANAR) + frame_size_uv = width * height; + else if (format == YUV422) + frame_size_uv = (width * height) >> 1; + else if (format == YUV420 || format == NV12 || format == NV21) + frame_size_uv = (width * height) >> 2; + else + frame_size_uv = 0; + + t_width = width; + + if (format == YUYV || format == YVYU || format == UYVY || + format == VYUY) { + misc = src; + } else if (format == NV12 || format == NV21) { + y = src; + misc = src + frame_size_y; + } else if (format == RGB32 || format == RGB24 || format == RGB16) { + misc = src; + } else { + y = src; + u = src + frame_size_y; + v = src + frame_size_y + frame_size_uv; + } + + if (format == YUV444) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + c = y[j * width + i] - 16; + d = u[j * width + i] - 128; + e = v[j * width + i] - 128; + + if (!cbcr_reverse) { + d = u[j * width + i] - 128; + e = v[j * width + i] - 128; + } else { + e = u[j * width + i] - 128; + e = v[j * width + i] - 128; + } + (*cur) = (BYTE)CLIP((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == YUV422) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + c = y[j * width + i] - 16; + d = u[j * (width >> 1) + (i >> 1)] - 128; + e = v[j * (width >> 1) + (i >> 1)] - 128; + + if (!cbcr_reverse) { + d = u[j * (width >> 1) + (i >> 1)] - + 128; + e = v[j * (width >> 1) + (i >> 1)] - + 128; + } else { + e = u[j * (width >> 1) + (i >> 1)] - + 128; + d = v[j * (width >> 1) + (i >> 1)] - + 128; + } + + (*cur) = (BYTE)CLIP((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == YUYV || format == YVYU || format == UYVY || + format == VYUY) { + unsigned char *t = misc; + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i += 2) { + switch (format) { + case YUYV: + c = *(t)-16; + if (!cbcr_reverse) { + d = *(t + 1) - 128; + e = *(t + 3) - 128; + } else { + e = *(t + 1) - 128; + d = *(t + 3) - 128; + } + break; + case YVYU: + c = *(t)-16; + if (!cbcr_reverse) { + d = *(t + 3) - 128; + e = *(t + 1) - 128; + } else { + e = *(t + 3) - 128; + d = *(t + 1) - 128; + } + break; + case UYVY: + c = *(t + 1) - 16; + if (!cbcr_reverse) { + d = *(t)-128; + e = *(t + 2) - 128; + } else { + e = *(t)-128; + d = *(t + 2) - 128; + } + break; + case VYUY: + c = *(t + 1) - 16; + if (!cbcr_reverse) { + d = *(t + 2) - 128; + e = *(t)-128; + } else { + e = *(t + 2) - 128; + d = *(t)-128; + } + break; + default: // like YUYV + c = *(t)-16; + if (!cbcr_reverse) { + d = *(t + 1) - 128; + e = *(t + 3) - 128; + } else { + e = *(t + 1) - 128; + d = *(t + 3) - 128; + } + break; + } + + (*cur) = (BYTE)CLIP((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + + switch (format) { + case YUYV: + case YVYU: + c = *(t + 2) - 16; + break; + + case VYUY: + case UYVY: + c = *(t + 3) - 16; + break; + default: // like YUYV + c = *(t + 2) - 16; + break; + } + + (*cur) = (BYTE)CLIP((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + + t += 4; + } + line += t_width << 2; + } + } else if (format == YUV420 || format == NV12 || format == NV21) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + c = y[j * width + i] - 16; + if (format == YUV420) { + if (!cbcr_reverse) { + d = u[(j >> 1) * ((width) >> 1) + + (i >> 1)] - + 128; + e = v[(j >> 1) * ((width) >> 1) + + (i >> 1)] - + 128; + } else { + e = u[(j >> 1) * ((width) >> 1) + + (i >> 1)] - + 128; + d = v[(j >> 1) * ((width) >> 1) + + (i >> 1)] - + 128; + } + } else if (format == NV12) { + if (!cbcr_reverse) { + d = misc[(j >> 1) * width + + ((i >> 1) << 1)] - + 128; + e = misc[(j >> 1) * width + + ((i >> 1) << 1) + 1] - + 128; + } else { + e = misc[(j >> 1) * width + + ((i >> 1) << 1)] - + 128; + d = misc[(j >> 1) * width + + ((i >> 1) << 1) + 1] - + 128; + } + } else { // if (m_color == NV21) + if (!cbcr_reverse) { + d = misc[(j >> 1) * width + + ((i >> 1) << 1) + 1] - + 128; + e = misc[(j >> 1) * width + + ((i >> 1) << 1)] - + 128; + } else { + e = misc[(j >> 1) * width + + ((i >> 1) << 1) + 1] - + 128; + d = misc[(j >> 1) * width + + ((i >> 1) << 1)] - + 128; + } + } + (*cur) = (BYTE)CLIP((298 * c + 409 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP( + (298 * c - 100 * d - 208 * e + 128) >> + 8); + cur++; + (*cur) = (BYTE)CLIP((298 * c + 516 * d + 128) >> + 8); + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == RGB_PLANAR) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + (*cur) = y[j * width + i]; + cur++; + (*cur) = u[j * width + i]; + cur++; + (*cur) = v[j * width + i]; + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == RGB32) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + (*cur) = misc[j * width * 4 + i]; + cur++; // R + (*cur) = misc[j * width * 4 + i + 1]; + cur++; // G + (*cur) = misc[j * width * 4 + i + 2]; + cur++; // B + (*cur) = misc[j * width * 4 + i + 3]; + cur++; // A + } + line += t_width << 2; + } + } else if (format == RGB24) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + (*cur) = misc[j * width * 3 + i]; + cur++; // R + (*cur) = misc[j * width * 3 + i + 1]; + cur++; // G + (*cur) = misc[j * width * 3 + i + 2]; + cur++; // B + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else if (format == RGB16) { + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + int tmp = misc[j * width * 2 + i] << 8 | + misc[j * width * 2 + i + 1]; + (*cur) = (BYTE)((tmp >> 11) & 0x1F << 3); + cur++; // R(5bit) + (*cur) = (BYTE)((tmp >> 5) & 0x3F << 2); + cur++; // G(6bit) + (*cur) = (BYTE)((tmp)&0x1F << 3); + cur++; // B(5bit) + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } else { // YYY + for (j = 0; j < height; j++) { + cur = line; + for (i = 0; i < width; i++) { + (*cur) = (BYTE)y[j * width + i]; + cur++; + (*cur) = (BYTE)y[j * width + i]; + cur++; + (*cur) = (BYTE)y[j * width + i]; + cur++; + (*cur) = 0; + cur++; + } + line += t_width << 2; + } + } +} +#endif // defined(PLATFORM_WIN32) || defined(PLATFORM_LINUX) + +BOOL FBDisplayDevice_Open(RenderDevice *device) +{ + Uint32 coreIndex; + DecHandle decHandle = device->decHandle; + + VLOG(INFO, "%s\n", __func__); + coreIndex = VPU_HANDLE_CORE_INDEX(decHandle); + PlatformDev_Open((coreIndex + 1) * (device->decHandle->instIndex), 0, + 0); + + return TRUE; +} + +void FBDisplayDevice_Render(RenderDevice *device, + DecOutputInfo *fbInfo, //!<< fbInfo is not used + Uint8 *pYuv, Uint32 width, Uint32 height) +{ + Uint32 coreIndex = VPU_HANDLE_CORE_INDEX(device->decHandle); + Uint32 Bpp = 1; //!<< Byte per pixel + FrameBuffer *fbSrc = &fbInfo->dispFrame; + + UNREFERENCED_PARAMETER(fbInfo); + + switch (fbSrc->format) { + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + Bpp = 2; + break; + default: + Bpp = 1; + } + PlatformDev_Draw((coreIndex + 1) * (device->decHandle->instIndex), 0, 0, + width, height, fbSrc->format, pYuv, FALSE, Bpp * 8); +} + +BOOL FBDisplayDevice_Close(RenderDevice *device) +{ + DecHandle decHandle = device->decHandle; + Uint32 coreIndex = VPU_HANDLE_CORE_INDEX(decHandle); + + PlatformDev_Close((coreIndex + 1) * (device->decHandle->instIndex)); + + return TRUE; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/display/hdmi_impl.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/display/hdmi_impl.c new file mode 100644 index 0000000000..86eee1b693 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/display/hdmi_impl.c @@ -0,0 +1,152 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "main_helper.h" + +#define WAVE4_FRAME 0x09000000 +#define DISP_BASE 0x2a000000 + +typedef struct HDMIContext_Struct { + Uint32 curDPBufY; + Uint32 curDPBufU; + Uint32 curDPBufV; + Uint32 count; +} HDMIContext; + +BOOL HDMIDisplayDevice_Open(RenderDevice *device) +{ + HDMIContext *ctx = (HDMIContext *)osal_malloc(sizeof(HDMIContext)); + ctx->curDPBufY = 0; + ctx->curDPBufU = 0; + ctx->curDPBufV = 0; + ctx->count = 0; + device->context = ctx; + return TRUE; +} + +BOOL HDMIDisplayDevice_Close(RenderDevice *device) +{ + osal_free(device->context); + + return TRUE; +} + +void HDMIDisplayDevice_Render(RenderDevice *device, + DecOutputInfo *fbInfo, //!<< fbInfo is not used + Uint8 *pYuv, Uint32 width, Uint32 height) +{ + HDMIContext *ctx = device->context; + Int32 core_idx = 0; + Int32 fry, frcb, frcr; + Int32 DP_BUFF_Y0 = 0x00000000; + Int32 DP_BUFF_U0 = 0x00800000; + Int32 DP_BUFF_V0 = 0x00c00000; + Uint32 DP_BUFF_Y1 = 0x01000000; + Int32 DP_BUFF_U1 = 0x01800000; + Int32 DP_BUFF_V1 = 0x01c00000; + FrameBuffer *fp = &fbInfo->dispFrame; + BOOL is4K; + + UNREFERENCED_PARAMETER(pYuv); + + //----------------------------------------------------------------------------------------------- + // disp setting + is4K = (BOOL)(width > 1920 || height > 1088); + + if (fp->myIndex) { + if (ctx->curDPBufY == DP_BUFF_Y1) { + ctx->curDPBufY = DP_BUFF_Y0; + ctx->curDPBufU = DP_BUFF_U0; + ctx->curDPBufV = DP_BUFF_V0; + } else { + ctx->curDPBufY = DP_BUFF_Y1; + ctx->curDPBufU = DP_BUFF_U1; + ctx->curDPBufV = DP_BUFF_V1; + } + } else { + if (ctx->curDPBufY == DP_BUFF_Y1) { + ctx->curDPBufY = DP_BUFF_Y0; + ctx->curDPBufU = DP_BUFF_U0; + ctx->curDPBufV = DP_BUFF_V0; + } else { + ctx->curDPBufY = DP_BUFF_Y1; + ctx->curDPBufU = DP_BUFF_U1; + ctx->curDPBufV = DP_BUFF_V1; + } + } + + fry = fp->bufY; + frcb = fp->bufCb; + frcr = fp->bufCr; + + // FRAME Y COPY + VpuWriteReg(core_idx, WAVE4_FRAME + 0xc, ((frcb - fry) / 256)); + VpuWriteReg(core_idx, WAVE4_FRAME + 0x10, fp->bufY); + VpuWriteReg(core_idx, DISP_BASE + 0x40, ctx->curDPBufY); + VpuWriteReg(core_idx, WAVE4_FRAME + 0x4, 0x0); + + while (VpuReadReg(core_idx, WAVE4_FRAME + 0x8)) { + MSleep(1); + } + // FRAME cb COPY + VpuWriteReg(core_idx, WAVE4_FRAME + 0xc, ((frcr - frcb) / 256)); + VpuWriteReg(core_idx, WAVE4_FRAME + 0x10, fp->bufCb); + VpuWriteReg(core_idx, DISP_BASE + 0x40, ctx->curDPBufU); + VpuWriteReg(core_idx, WAVE4_FRAME + 0x4, 0x0); + + while (VpuReadReg(core_idx, WAVE4_FRAME + 0x8)) { + MSleep(1); + } + + // FRAME CR COPY + VpuWriteReg(core_idx, WAVE4_FRAME + 0xc, ((frcr - frcb) / 256)); + VpuWriteReg(core_idx, WAVE4_FRAME + 0x10, fp->bufCr); + VpuWriteReg(core_idx, DISP_BASE + 0x40, ctx->curDPBufV); + VpuWriteReg(core_idx, WAVE4_FRAME + 0x4, 0x0); + + while (VpuReadReg(core_idx, WAVE4_FRAME + 0x8)) { + MSleep(1); + } + + if (is4K == TRUE) { + VpuWriteReg(core_idx, DISP_BASE + 0x104, 0x00000000); // CLK + VpuWriteReg(core_idx, DISP_BASE + 0x004, 0x00000003); // + VpuWriteReg(core_idx, DISP_BASE + 0x014, + 0x00000006); // format 0 : RGB888i, 4 : YUV420p + VpuWriteReg(core_idx, DISP_BASE + 0x034, 0x00000f00); + VpuWriteReg(core_idx, DISP_BASE + 0x030, + 0x00000001); // YUV->RGB + VpuWriteReg(core_idx, DISP_BASE + 0x000, 0x00000001); // start + } else { + VpuWriteReg(core_idx, DISP_BASE + 0x104, 0x01); + VpuWriteReg(core_idx, DISP_BASE + 0x004, 0x02); + VpuWriteReg(core_idx, DISP_BASE + 0x034, fp->stride); + VpuWriteReg(core_idx, DISP_BASE + 0x014, 0x06); + VpuWriteReg(core_idx, DISP_BASE + 0x030, 0x01); + VpuWriteReg(core_idx, DISP_BASE + 0x000, 0x01); + } + + VpuWriteReg(core_idx, DISP_BASE + 0x008, ctx->curDPBufY); + VpuWriteReg(core_idx, DISP_BASE + 0x00c, ctx->curDPBufU); + VpuWriteReg(core_idx, DISP_BASE + 0x010, ctx->curDPBufV); + + ctx->count++; + + if (ctx->count == 1) { + /* Waiting for initializing HDMI */ + MSleep(1); + } +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/display/simplerenderer.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/display/simplerenderer.c new file mode 100644 index 0000000000..215c88f9d5 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/display/simplerenderer.c @@ -0,0 +1,395 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "vpuapifunc.h" +#include "main_helper.h" + +typedef struct { + DecOutputInfo fbInfo; + Uint8 *pYuv; + Uint32 displayWidth; + Uint32 displayHeight; +} DisplayInfo; + +typedef struct { + DecHandle decHandle; //!<< decoder handle + Uint32 period; //!<< period of displaying picture in ms + VpuThread threadHandle; + BOOL isRunning; + BOOL stop; + BOOL hasPrevSequence; + Queue *Q; + Queue *freeQ; + VpuMutex lock; + RenderDevice *device; + Uint32 numOfFrames; + DisplayInfo dispInfo; +} RendererContext; + +static BOOL NullDisplayDevice_Open(RenderDevice *device) +{ + UNREFERENCED_PARAMETER(device); + + return TRUE; +} + +static void NullDisplayDevice_Render(RenderDevice *device, + DecOutputInfo *fbInfo, Uint8 *pYuv, + Uint32 width, Uint32 height) +{ + UNREFERENCED_PARAMETER(device); + UNREFERENCED_PARAMETER(fbInfo); + UNREFERENCED_PARAMETER(pYuv); + UNREFERENCED_PARAMETER(width); + UNREFERENCED_PARAMETER(height); +} + +static BOOL NullDisplayDevice_Close(RenderDevice *device) +{ + UNREFERENCED_PARAMETER(device); + + return TRUE; +} + +#ifdef REDUNDENT_CODE +BOOL FBDisplayDevice_Close(RenderDevice *device); + +void FBDisplayDevice_Render(RenderDevice *device, + DecOutputInfo *fbInfo, //!<< fbInfo is not used + Uint8 *pYuv, Uint32 width, Uint32 height); + +BOOL FBDisplayDevice_Open(RenderDevice *device); + +BOOL HDMIDisplayDevice_Close(RenderDevice *device); + +void HDMIDisplayDevice_Render(RenderDevice *device, + DecOutputInfo *fbInfo, //!<< fbInfo is not used + Uint8 *pYuv, Uint32 width, Uint32 height); + +BOOL HDMIDisplayDevice_Open(RenderDevice *device); +#endif + +static RenderDevice *CreateRenderDevice(DecHandle decHandle, + RenderDeviceType type) +{ + RenderDevice *device = NULL; + + CVI_VC_TRACE("type = %d\n", type); + + switch (type) { +#ifdef REDUNDENT_CODE + case RENDER_DEVICE_FBDEV: + device = osal_malloc(sizeof(RenderDevice)); + device->context = NULL; + device->Open = &FBDisplayDevice_Open; + device->Render = &FBDisplayDevice_Render; + device->Close = &FBDisplayDevice_Close; + break; + case RENDER_DEVICE_HDMI: + device = osal_malloc(sizeof(RenderDevice)); + device->context = NULL; + device->Open = &HDMIDisplayDevice_Open; + device->Render = &HDMIDisplayDevice_Render; + device->Close = &HDMIDisplayDevice_Close; + break; +#endif + default: + device = osal_malloc(sizeof(RenderDevice)); + device->context = NULL; + device->Open = &NullDisplayDevice_Open; + device->Render = &NullDisplayDevice_Render; + device->Close = &NullDisplayDevice_Close; + break; + } + + device->decHandle = decHandle; + + return device; +} + +static void RenderPicture(void *arg) +{ + RendererContext *ctx = (RendererContext *)arg; + RenderDevice *device; + DisplayInfo *temp; + DisplayInfo *pDispInfo; + DecOutputInfo outputInfo, *pdoi = &outputInfo; + DecOutputInfo *fbInfo = NULL; + Uint8 *pYuv; + Uint32 width; + Uint32 height; + + device = ctx->device; + + do { + ctx->isRunning = TRUE; + MSleep(ctx->period); + + pDispInfo = cviGetDispFrame(ctx, pdoi); + if (pDispInfo) { + device->Render(device, &pDispInfo->fbInfo, + pDispInfo->pYuv, pDispInfo->displayWidth, + pDispInfo->displayHeight); + cviReleaseDispFrame(ctx, pDispInfo); + } + } while (ctx->stop == FALSE); + + VpuMutex_Lock(ctx->lock); + while ((temp = (DisplayInfo *)Queue_Dequeue(ctx->Q)) != NULL) { + fbInfo = &temp->fbInfo; + pYuv = temp->pYuv; + width = temp->displayWidth; + height = temp->displayHeight; + device->Render(device, fbInfo, pYuv, width, height); + if (temp->pYuv) + osal_free(temp->pYuv); + } + VpuMutex_Unlock(ctx->lock); +} + +void *cviGetDispFrame(Renderer renderer, DecOutputInfo *pdoi) +{ + RendererContext *ctx = (RendererContext *)renderer; + DisplayInfo *pdi; + + VpuMutex_Lock(ctx->lock); + + pdi = (DisplayInfo *)Queue_Dequeue(ctx->Q); + if (pdi != NULL) { + CVI_VC_DISP("displayWidth = %d, displayHeight = %d\n", + pdi->displayWidth, pdi->displayHeight); + + osal_memcpy((void *)&ctx->dispInfo, pdi, sizeof(DisplayInfo)); + osal_memcpy(pdoi, &pdi->fbInfo, sizeof(DecOutputInfo)); + pdoi->dispFrame.width = pdi->displayWidth; + pdoi->dispFrame.height = pdi->displayHeight; + CVI_VC_DISP("width = %d, height = %d\n", pdoi->dispFrame.width, + pdoi->dispFrame.height); + } + + VpuMutex_Unlock(ctx->lock); + + return pdi; +} + +void cviReleaseDispFrame(Renderer renderer, void *arg) +{ + RendererContext *ctx = (RendererContext *)renderer; + DisplayInfo *pDispInfo = (DisplayInfo *)arg; + + VpuMutex_Lock(ctx->lock); + + Queue_Enqueue(ctx->freeQ, (void *)&pDispInfo->fbInfo); + if (pDispInfo->pYuv) + osal_free(pDispInfo->pYuv); + + VpuMutex_Unlock(ctx->lock); +} + +void cviReleaseDispFrameSDK(Renderer renderer, void *arg) +{ + RendererContext *ctx = (RendererContext *)renderer; + int indexFrameDisplay = (uintptr_t)arg; + + VpuMutex_Lock(ctx->lock); + VPU_DecClrDispFlag(ctx->decHandle, indexFrameDisplay); + VpuMutex_Unlock(ctx->lock); +} + +Renderer SimpleRenderer_Create(DecHandle decHandle, RenderDeviceType deviceType, + const char *yuvPath) +{ + RendererContext *ctx = + (RendererContext *)osal_malloc(sizeof(RendererContext)); + + UNREFERENCED_PARAMETER(yuvPath); + + osal_memset((void *)ctx, 0x00, sizeof(RendererContext)); + + ctx->decHandle = decHandle; +#ifdef PLATFORM_NON_OS + ctx->period = 0; // 33 ms, NTSC + ctx->stop = TRUE; +#else + ctx->period = 33; // 33 ms, NTSC + ctx->stop = FALSE; +#endif + ctx->isRunning = FALSE; + ctx->numOfFrames = 0; + ctx->Q = Queue_Create(32, sizeof(DisplayInfo)); + if (ctx->Q == NULL) + goto __FAILURE_RETURN; + + ctx->freeQ = Queue_Create(32, sizeof(DecOutputInfo)); + if (ctx->freeQ == NULL) + goto __FAILURE_RETURN; + + ctx->lock = VpuMutex_Create(); + if (ctx->lock == NULL) + goto __FAILURE_RETURN; + + ctx->device = CreateRenderDevice(decHandle, deviceType); + if (ctx->device == NULL) + goto __FAILURE_RETURN; + + ctx->device->Open(ctx->device); + ctx->hasPrevSequence = FALSE; + +#ifdef PLATFORM_NON_OS + ctx->threadHandle = NULL; +#else + if (deviceType != RENDER_DEVICE_SDK) { + CVI_VC_DISP("VpuThread_Create\n"); + ctx->threadHandle = VpuThread_Create( + (VpuThreadRunner)RenderPicture, (void *)ctx); + if (ctx->threadHandle == NULL) { + ctx->device->Close(ctx->device); + osal_free(ctx->device); + goto __FAILURE_RETURN; + } + } +#endif + + return (Renderer)ctx; + +__FAILURE_RETURN: + if (ctx->Q) + Queue_Destroy(ctx->Q); + if (ctx->freeQ) + Queue_Destroy(ctx->freeQ); + if (ctx->lock) + VpuMutex_Destroy(ctx->lock); + osal_free(ctx); + + return NULL; +} + +Uint32 SimpleRenderer_Act(Renderer renderer, DecOutputInfo *fbInfo, Uint8 *pYuv, + Uint32 width, Uint32 height) +{ + RendererContext *ctx = (RendererContext *)renderer; + DisplayInfo displayInfo; + + if (renderer == NULL) { + VLOG(ERR, "%s:%d Invalid handle\n", __func__, __LINE__); + return 0; + } + + ctx->numOfFrames++; + + VpuMutex_Lock(ctx->lock); + osal_memset((void *)&displayInfo, 0x00, sizeof(DisplayInfo)); + osal_memcpy((void *)&displayInfo.fbInfo, fbInfo, sizeof(DecOutputInfo)); + displayInfo.pYuv = pYuv; + displayInfo.displayWidth = width; + displayInfo.displayHeight = height; + CVI_VC_DISP("displayWidth = %d, displayHeight = %d\n", + displayInfo.displayWidth, displayInfo.displayHeight); + + Queue_Enqueue(ctx->Q, (void *)&displayInfo); + VpuMutex_Unlock(ctx->lock); +#ifdef PLATFORM_NON_OS + RenderPicture((void *)ctx); +#endif + + return ctx->numOfFrames; +} + +void SimpleRenderer_Flush(Renderer renderer) +{ + RendererContext *ctx = (RendererContext *)renderer; + DisplayInfo *temp = NULL; + + VpuMutex_Lock(ctx->lock); + + while ((temp = (DisplayInfo *)Queue_Dequeue(ctx->Q)) != NULL) { + Queue_Enqueue(ctx->freeQ, (void *)&temp->fbInfo); + if (temp->pYuv) + osal_free(temp->pYuv); + } + + for (temp = NULL; temp != NULL; + temp = (DisplayInfo *)Queue_Dequeue(ctx->freeQ)) { + VPU_DecClrDispFlag(ctx->decHandle, + temp->fbInfo.indexFrameDisplay); + } + VpuMutex_Unlock(ctx->lock); +} + +void *SimpleRenderer_GetFreeFrameInfo(Renderer renderer) +{ + RendererContext *ctx = (RendererContext *)renderer; + void *data = NULL; + + if (renderer == NULL) { + VLOG(ERR, "%s:%d Invalid handle\n", __func__, __LINE__); + return NULL; + } + + VpuMutex_Lock(ctx->lock); + data = Queue_Dequeue(ctx->freeQ); + VpuMutex_Unlock(ctx->lock); + + return data; +} + +BOOL SimpleRenderer_Destroy(Renderer renderer) +{ + RendererContext *ctx = (RendererContext *)renderer; + + if (renderer == NULL) { + VLOG(ERR, "%s:%d Invalid handle\n", __func__, __LINE__); + return FALSE; + } + + ctx->stop = TRUE; + + if (ctx->threadHandle) { + VpuThread_Join(ctx->threadHandle); + osal_free(ctx->threadHandle); + ctx->threadHandle = NULL; + } + + VpuMutex_Destroy(ctx->lock); + Queue_Destroy(ctx->Q); + Queue_Destroy(ctx->freeQ); + ctx->device->Close(ctx->device); + + osal_free(ctx->device); + osal_free(ctx); + + return TRUE; +} + +#ifdef REDUNDENT_CODE +BOOL SimpleRenderer_SetFrameRate(Renderer renderer, Uint32 fps) +{ + RendererContext *ctx = (RendererContext *)renderer; + + if (renderer == NULL) { + VLOG(ERR, "%s:%d Invalid handle\n", __func__, __LINE__); + return FALSE; + } + + if (fps == 0) { + ctx->period = 0; + } else { + ctx->period = (Uint32)(1000 / fps); + } + + return TRUE; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/fw_h264.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/fw_h264.h new file mode 100644 index 0000000000..42a7f9fd45 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/fw_h264.h @@ -0,0 +1,21167 @@ +#ifdef FIRMWARE_H +static uint8_t fw_h264[] = { + 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x88, 0x03, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0xA2, 0x03, 0x0E, 0xE4, + 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, + 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, + 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, + 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, + 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, + 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, + 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x88, 0x03, + 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, + 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, + 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, + 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, + 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, + 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, + 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, + 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, + 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, + 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, + 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, + 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, + 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, + 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, + 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, + 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, + 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, + 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, + 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, + 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, + 0x00, 0x28, 0x12, 0xD1, 0x5E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, + 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, + 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, + 0xA8, 0x03, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, + 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, + 0x7C, 0xE6, 0xAA, 0x03, 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, + 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, + 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, + 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, + 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xEE, 0x01, + 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, + 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, + 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, + 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, + 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, + 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, + 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, + 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, + 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, + 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, 0x90, 0x01, 0x1A, 0xE4, + 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x3E, 0xA2, + 0x2E, 0xE4, 0x4A, 0x00, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x02, 0xA2, + 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0x20, 0xA2, 0x00, 0xA2, 0x76, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0xC2, 0xE0, 0xFC, 0xA2, 0x72, 0x00, 0xC2, 0xE0, + 0x71, 0x00, 0xC2, 0xE0, 0xFA, 0xA2, 0x77, 0x00, 0x84, 0xE1, 0x0F, 0x27, + 0x22, 0xD0, 0x2E, 0xE4, 0x48, 0xF0, 0x4A, 0x00, 0xC0, 0xE0, 0xAA, 0x01, + 0xC0, 0xE0, 0xE8, 0xF7, 0x1F, 0x04, 0xC0, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, + 0xEE, 0xA1, 0x3D, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0xC2, 0xE0, 0x11, 0x00, 0x04, 0xE0, 0x9D, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0x2E, 0xE4, 0x3C, 0x04, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xE0, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0x45, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3C, 0x04, 0x28, 0xE4, 0x04, 0xA1, + 0x0E, 0xA8, 0x04, 0xAF, 0xC0, 0xE0, 0x4A, 0x00, 0xC2, 0xE0, 0x02, 0xA2, + 0x48, 0xCA, 0x8E, 0xF9, 0xE8, 0xF7, 0x11, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0xE8, 0xF7, 0x02, 0xA8, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xF8, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x3C, 0x04, 0x42, 0x3C, 0x43, 0x34, + 0x01, 0xC0, 0x2E, 0xE4, 0x43, 0x2C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, + 0x09, 0xC0, 0x2A, 0xE4, 0x00, 0xC0, 0x42, 0x2E, 0x46, 0xE0, 0x00, 0xC0, + 0x56, 0x4E, 0x57, 0x26, 0x57, 0x18, 0x10, 0xAF, 0x4A, 0xE0, 0xB4, 0xF0, + 0x58, 0x1A, 0xFF, 0x00, 0x09, 0xE0, 0x74, 0xF0, 0xFE, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x34, 0xF0, 0x1E, 0xF1, 0x5D, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, + 0x01, 0xC0, 0xEE, 0xF0, 0x5E, 0x3C, 0x01, 0xC0, 0x5F, 0x3C, 0x01, 0xC0, + 0xBE, 0xF0, 0x5E, 0x28, 0x5E, 0x1A, 0x5D, 0x2A, 0x01, 0xC0, 0x8E, 0xF0, + 0x5F, 0x2A, 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, 0x08, 0x08, 0xC2, 0xE0, + 0x2E, 0xE4, 0x00, 0xC0, 0x02, 0x08, 0x62, 0xE1, 0x0B, 0x08, 0xC3, 0xE0, + 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x02, 0xA2, 0x92, 0x9F, 0x00, 0x02, + 0x05, 0xE0, 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, 0x12, 0x9F, 0x12, 0x9F, + 0x12, 0x81, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0xC0, 0xE0, 0x00, 0x08, + 0xC2, 0xE0, 0x02, 0xA2, 0x02, 0xAE, 0x2E, 0xE4, 0xE8, 0xF7, 0x00, 0x08, + 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0x00, 0x34, 0x1E, 0xAE, 0x18, 0xE0, + 0x00, 0x82, 0x01, 0x3C, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0xE0, 0x01, 0x82, + 0x32, 0xA2, 0x20, 0x06, 0x60, 0xD1, 0x5E, 0x02, 0x40, 0xCE, 0x2E, 0xE4, + 0xC0, 0xCE, 0x18, 0xAE, 0x02, 0x00, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, + 0x02, 0xA8, 0x48, 0xCA, 0x80, 0x00, 0x23, 0xD1, 0x22, 0xAE, 0x04, 0xA2, + 0x2E, 0xE4, 0xE8, 0xF7, 0x8C, 0xCC, 0x72, 0xCC, 0x00, 0xA2, 0x9E, 0xCC, + 0x20, 0xAE, 0x10, 0xA8, 0x04, 0xE0, 0x8E, 0xCC, 0x6F, 0xD1, 0x4A, 0xCE, + 0x22, 0x93, 0x0A, 0xE0, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x03, 0x00, + 0x60, 0xA2, 0x2E, 0xE4, 0x00, 0x00, 0x6F, 0xD1, 0xEA, 0xF7, 0x02, 0xA8, + 0x50, 0xCA, 0x50, 0xCE, 0x20, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x50, 0xCE, 0x3D, 0x04, 0xC1, 0xE0, + 0x2E, 0xE4, 0x1C, 0x04, 0x00, 0x01, 0x0A, 0xE0, 0xD9, 0xF7, 0xEF, 0xA1, + 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0x61, 0x00, 0xC0, 0xE0, + 0x2A, 0xE4, 0xD2, 0x02, 0x82, 0x02, 0x1E, 0xE4, 0x1F, 0x00, 0x08, 0xE0, + 0x47, 0x03, 0x1E, 0xE4, 0x0D, 0x03, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0x04, + 0xC2, 0xE0, 0x12, 0xAE, 0xF8, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x37, 0x03, + 0x04, 0xA8, 0x10, 0x02, 0xC0, 0xE0, 0x2A, 0xE4, 0x08, 0xE0, 0x15, 0x02, + 0xC0, 0xE0, 0x18, 0xF1, 0x16, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, + 0x08, 0xE0, 0x13, 0x02, 0xC0, 0xE0, 0xBE, 0xF0, 0x14, 0x02, 0xC0, 0xE0, + 0x4A, 0xF0, 0x00, 0x01, 0x1E, 0xE4, 0x0B, 0x02, 0xC0, 0xE0, 0x3E, 0xF0, + 0x1E, 0xE4, 0x0D, 0x03, 0x1E, 0xE4, 0x82, 0x02, 0x10, 0x02, 0xC1, 0xE0, + 0x12, 0xAE, 0x47, 0x03, 0xC1, 0xE0, 0x56, 0xE0, 0x15, 0xAE, 0x03, 0xA8, + 0x07, 0xAE, 0x7F, 0xA8, 0x0B, 0xAF, 0x04, 0x02, 0x0F, 0xA8, 0x04, 0x02, + 0xC1, 0xE0, 0x56, 0xE0, 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x56, 0xE0, + 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x37, 0x03, 0x52, 0xE0, 0x1F, 0xAE, + 0x03, 0xA2, 0x92, 0xE0, 0x94, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0xEA, 0xF1, + 0x84, 0xE0, 0x8A, 0xF1, 0x06, 0xA8, 0x08, 0xAF, 0x21, 0xA8, 0x85, 0xE0, + 0x16, 0xE0, 0x1E, 0xA8, 0xC0, 0xE0, 0x0A, 0xF1, 0x56, 0xE0, 0x17, 0xE0, + 0x16, 0xE0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0x07, 0xA8, 0x1B, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x3A, 0xF0, 0x56, 0xE0, 0x03, 0xA8, 0x1B, 0xE0, + 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x1F, 0xAE, 0x03, 0xA2, + 0x44, 0x00, 0xC0, 0xE0, 0xD2, 0x02, 0x1E, 0xE4, 0xEA, 0xF0, 0x52, 0xE0, + 0x69, 0xF0, 0x13, 0x21, 0x1E, 0xE4, 0xB8, 0xF0, 0x1E, 0xA8, 0x12, 0xAF, + 0x44, 0x00, 0xC0, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x38, 0xF0, + 0x08, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, 0x18, 0xE0, 0x88, 0xC7, + 0xA4, 0xCC, 0xFF, 0x00, 0x04, 0xAE, 0x02, 0xA0, 0x00, 0x05, 0x00, 0xE0, + 0xC2, 0xE0, 0x02, 0xA2, 0x1A, 0x04, 0xC2, 0xE0, 0xEA, 0xF7, 0x19, 0x04, + 0xC0, 0xE0, 0x18, 0x04, 0xC0, 0xE0, 0x18, 0x04, 0xC2, 0xE0, 0x02, 0xA2, + 0x1B, 0x04, 0xC0, 0xE0, 0xEA, 0xF7, 0x19, 0x04, 0x28, 0xAE, 0x08, 0xAF, + 0x1E, 0xA0, 0x20, 0xAF, 0xFF, 0xFF, 0x09, 0xE0, 0x1B, 0x04, 0xC1, 0xE0, + 0x56, 0xE0, 0x09, 0xAE, 0x09, 0xAF, 0x1F, 0xA0, 0xC0, 0xE0, 0x2E, 0xE4, + 0x1D, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0x02, 0x0A, 0xE0, 0x1C, 0x04, + 0xF0, 0xF7, 0x02, 0xA1, 0x28, 0xA2, 0x1C, 0x04, 0x00, 0x02, 0x0C, 0xE0, + 0x1C, 0x04, 0xC0, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0x2E, 0xE4, 0x02, 0xA8, 0x04, 0xAF, 0x44, 0x00, 0x2E, 0xE4, 0x00, 0xC0, + 0x41, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x41, 0x2C, 0x01, 0xC0, + 0x1E, 0x26, 0x7A, 0xF1, 0x50, 0x03, 0x1E, 0xE4, 0xC0, 0xE0, 0x30, 0xF1, + 0x46, 0xE0, 0x59, 0x4E, 0xEA, 0xF0, 0x00, 0x20, 0x08, 0xE0, 0x5C, 0x00, + 0x00, 0x20, 0x0A, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0x17, 0x08, 0x1E, 0xE4, + 0x5D, 0x00, 0xC2, 0xE0, 0x1E, 0xE4, 0x00, 0xA2, 0x01, 0xCE, 0x03, 0xA2, + 0x65, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x4C, 0x03, 0xC0, 0xE0, 0xEA, 0xF0, + 0x02, 0xA8, 0x24, 0xAF, 0xFF, 0x00, 0x08, 0xE0, 0xBA, 0xF0, 0x6D, 0x00, + 0x00, 0x3C, 0x58, 0x08, 0x72, 0xF0, 0x58, 0x18, 0x0E, 0xA0, 0x18, 0xE0, + 0x57, 0x82, 0x00, 0x84, 0xC0, 0xE0, 0x2E, 0xE4, 0x4C, 0x03, 0x1E, 0xE4, + 0x2E, 0xE4, 0x02, 0xA8, 0x24, 0xAF, 0x65, 0x00, 0xAC, 0x03, 0x0E, 0xE4, + 0x35, 0x0D, 0x0E, 0xE4, 0xB4, 0x03, 0x0E, 0xE4, 0xB0, 0x03, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0xCA, 0x03, 0x0E, 0xE4, 0xD0, 0x03, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xD4, 0x03, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x06, 0x04, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x2E, 0x04, 0x1E, 0xE4, + 0x04, 0xE0, 0x16, 0x02, 0x1E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x10, 0x02, + 0x1E, 0xE4, 0x4D, 0x00, 0x1E, 0xE4, 0x02, 0x11, 0x1E, 0xE4, 0xD8, 0x03, + 0x89, 0xF7, 0x1E, 0x02, 0x1E, 0xE4, 0xD9, 0x04, 0xB6, 0x01, 0x1E, 0xE4, + 0xFF, 0x10, 0x1E, 0xE4, 0xD8, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x24, 0x06, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x27, 0x06, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x58, 0x06, 0x1E, 0xE4, + 0x01, 0xC0, 0x2B, 0xE4, 0x19, 0x02, 0x1E, 0xE4, 0x1E, 0xE4, 0x00, 0xC0, + 0x5E, 0x3C, 0x5D, 0x28, 0x00, 0xC0, 0x5E, 0x2A, 0x01, 0xC0, 0x83, 0x03, + 0x85, 0xA1, 0x64, 0x00, 0x05, 0xE0, 0x3A, 0xF0, 0x28, 0xE4, 0x56, 0xE0, + 0x04, 0xA8, 0x24, 0x28, 0x17, 0xAE, 0x15, 0xA2, 0x40, 0x00, 0xC0, 0xE0, + 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0xE0, 0x0B, 0x00, 0x13, 0xD1, + 0x00, 0x28, 0x12, 0xD1, 0xCB, 0x05, 0x67, 0xE1, 0x2E, 0xE4, 0xE1, 0xE1, + 0x03, 0x00, 0x22, 0xD0, 0x64, 0x00, 0x66, 0xE1, 0x17, 0x35, 0x16, 0x9E, + 0x04, 0x04, 0x84, 0xE1, 0x86, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x17, 0x3D, + 0xA7, 0x04, 0x1E, 0xE4, 0xBE, 0x3C, 0xAD, 0x3C, 0x95, 0x07, 0x1E, 0xE4, + 0x45, 0x06, 0x1E, 0xE4, 0x1E, 0xE4, 0x00, 0xA2, 0x0A, 0x0A, 0x1E, 0xE4, + 0x1E, 0xE4, 0x4D, 0x00, 0x04, 0xE0, 0x16, 0x02, 0xDD, 0xF0, 0x2F, 0x04, + 0x1E, 0xE4, 0x10, 0x02, 0x76, 0x04, 0x1A, 0xE4, 0x47, 0x0C, 0x1E, 0xE4, + 0x1E, 0xE4, 0x83, 0x3C, 0x10, 0x3C, 0xFE, 0xA2, 0x86, 0x3C, 0x02, 0xA2, + 0x3A, 0xF0, 0x51, 0x15, 0xC5, 0x08, 0x1E, 0xE4, 0x6B, 0x0C, 0x1E, 0xE4, + 0xAE, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, 0x6A, 0xE1, 0xF0, 0x3C, 0x3E, 0xA2, + 0x38, 0xF0, 0x04, 0xA1, 0x1E, 0xE4, 0x58, 0xF1, 0x47, 0x0C, 0x1E, 0xE4, + 0x04, 0xA1, 0x3A, 0xF1, 0x0E, 0xA1, 0x77, 0x0C, 0x02, 0xA1, 0x6A, 0xF0, + 0x02, 0xA1, 0x2A, 0xF3, 0xCE, 0xF6, 0x4A, 0x0A, 0x1E, 0xE4, 0x4A, 0xF0, + 0x04, 0xA2, 0x58, 0xF0, 0x47, 0x0C, 0x1E, 0xE4, 0x6B, 0xE1, 0x5E, 0xF6, + 0x52, 0x0A, 0x1E, 0xE4, 0x1E, 0xE4, 0x33, 0x15, 0x1E, 0xE4, 0x2E, 0xE4, + 0x10, 0x3C, 0xFE, 0xA2, 0xEA, 0xF5, 0x82, 0x0A, 0x00, 0x28, 0x9A, 0xF5, + 0x93, 0x1B, 0x1E, 0xE4, 0x1E, 0xE4, 0xA5, 0x1B, 0x1E, 0xE4, 0x10, 0x3C, + 0x19, 0x0D, 0x1E, 0xE4, 0x00, 0xA2, 0xDF, 0x09, 0x01, 0x15, 0x1E, 0xE4, + 0x9B, 0x3C, 0x00, 0xA2, 0xC0, 0xE0, 0x2C, 0xE4, 0x10, 0x3C, 0xFE, 0xA2, + 0x0A, 0xE4, 0x15, 0x00, 0x08, 0xE0, 0x45, 0x00, 0x3A, 0x15, 0x1E, 0xE4, + 0x2E, 0xE4, 0x2F, 0x04, 0x4A, 0x0A, 0x1E, 0xE4, 0x33, 0x15, 0x1E, 0xE4, + 0x77, 0x0C, 0x1E, 0xE4, 0x2F, 0x04, 0x0E, 0xE4, 0x08, 0xA1, 0x6A, 0xF1, + 0x02, 0xA1, 0xEA, 0xF0, 0x16, 0xF1, 0x08, 0xA1, 0x3A, 0xF1, 0xA4, 0xF0, + 0x6A, 0xF0, 0x02, 0xA1, 0x8A, 0xF0, 0x02, 0xA1, 0x4A, 0x0A, 0x1E, 0xE4, + 0xBA, 0xF0, 0x06, 0xA1, 0x58, 0xF0, 0x47, 0x0C, 0x1E, 0xE4, 0xEE, 0xF6, + 0x7E, 0xF6, 0x52, 0x0A, 0x1E, 0xE4, 0x04, 0xA2, 0x00, 0x01, 0x61, 0xE1, + 0x00, 0xA2, 0x2E, 0xE4, 0xC0, 0xE0, 0x11, 0x3D, 0xFF, 0x0A, 0x88, 0xE1, + 0x11, 0xAE, 0x35, 0x00, 0x05, 0xE0, 0x41, 0x00, 0x00, 0x01, 0x11, 0xD1, + 0x20, 0xCE, 0x42, 0xE0, 0x02, 0x00, 0x13, 0xD1, 0x80, 0x01, 0x12, 0xD1, + 0x1E, 0xE4, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x1E, 0xE4, 0x4B, 0x02, + 0x1E, 0xE4, 0x91, 0x04, 0x6A, 0xE1, 0xAE, 0x3C, 0x04, 0xA2, 0x26, 0x01, + 0x00, 0x00, 0x3A, 0xD0, 0x00, 0x00, 0x30, 0xD1, 0x00, 0x00, 0x08, 0xD0, + 0x00, 0x00, 0x4C, 0xD0, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0x00, 0x22, 0xD0, + 0x02, 0xA2, 0x25, 0x01, 0xC2, 0xE0, 0x00, 0x01, 0x26, 0x3C, 0x25, 0x3C, + 0xFE, 0xA2, 0xD3, 0x3C, 0x29, 0x3C, 0x10, 0x3C, 0x28, 0x3C, 0x27, 0x3C, + 0x11, 0x35, 0xC7, 0x05, 0x61, 0xE1, 0x56, 0x3C, 0xAF, 0x3C, 0x11, 0x3D, + 0x11, 0x35, 0x11, 0x3D, 0x7D, 0x1B, 0x1E, 0xE4, 0x09, 0x0D, 0x1E, 0xE4, + 0x0A, 0x17, 0x1E, 0xE4, 0x46, 0x20, 0x1E, 0xE4, 0x09, 0xC0, 0x86, 0x3C, + 0x00, 0xA2, 0x2E, 0xE4, 0x6D, 0x07, 0x1E, 0xE4, 0x00, 0xC0, 0x53, 0x3C, + 0x4D, 0x1B, 0x1E, 0xE4, 0x2D, 0x1B, 0x1E, 0xE4, 0x1A, 0xE4, 0xD3, 0x28, + 0xBF, 0x05, 0x1E, 0xE4, 0x1E, 0xE4, 0x14, 0x0A, 0x1E, 0xE4, 0x3A, 0x15, + 0x1E, 0xE4, 0x8B, 0x02, 0x1E, 0xE4, 0x5E, 0x07, 0x0A, 0xE4, 0x16, 0x06, + 0x1E, 0xE4, 0xEE, 0x21, 0x3F, 0x44, 0x16, 0xE0, 0x40, 0x28, 0xBC, 0x05, + 0x5F, 0x14, 0x1E, 0xE4, 0x14, 0x0A, 0x18, 0xE4, 0x78, 0xF0, 0x29, 0xE4, + 0x1E, 0x02, 0x1E, 0xE4, 0xBC, 0x05, 0x08, 0xE4, 0x47, 0x0C, 0x1E, 0xE4, + 0xF6, 0x01, 0x1E, 0xE4, 0x8A, 0x05, 0x0E, 0xE4, 0x5E, 0x07, 0x1E, 0xE4, + 0x8A, 0x05, 0x04, 0xE4, 0xBA, 0xF0, 0xBD, 0x28, 0x86, 0x3C, 0x02, 0xA2, + 0x84, 0x3C, 0xFC, 0xA2, 0x55, 0x07, 0x1E, 0xE4, 0xB4, 0x3C, 0x02, 0xA2, + 0x3A, 0x3C, 0x00, 0xA2, 0x02, 0xA0, 0xA4, 0x28, 0x8A, 0x05, 0x0E, 0xE4, + 0xBE, 0x06, 0x1E, 0xE4, 0x8A, 0x05, 0x08, 0xE4, 0x1E, 0xE4, 0xDD, 0x06, + 0x1E, 0xE4, 0x9A, 0xF0, 0x0E, 0xE4, 0xD3, 0x3C, 0x00, 0xA2, 0xB1, 0x06, + 0x84, 0x28, 0x64, 0x1B, 0x1E, 0xE4, 0x53, 0x05, 0x04, 0xE4, 0x84, 0x28, + 0x55, 0x07, 0x14, 0xE4, 0x1E, 0xE4, 0xC4, 0xF0, 0x84, 0x28, 0x8A, 0x05, + 0x05, 0xE0, 0x06, 0xA2, 0x9B, 0xF0, 0x13, 0x21, 0x84, 0x28, 0x67, 0x21, + 0x1E, 0xE4, 0x00, 0x03, 0x67, 0x22, 0x1E, 0xE4, 0x8F, 0x21, 0x1E, 0xE4, + 0x08, 0xF1, 0xA5, 0x28, 0xB1, 0x06, 0x1E, 0xE4, 0x1B, 0xE4, 0x84, 0x28, + 0x40, 0x4E, 0x4E, 0x2A, 0xF5, 0x1C, 0x18, 0xE4, 0x4E, 0x28, 0x4C, 0x20, + 0x7E, 0x28, 0xA9, 0x19, 0x1A, 0xE4, 0x40, 0x28, 0x40, 0x28, 0xD3, 0x3C, + 0x00, 0xA2, 0x82, 0x3C, 0x1E, 0xE4, 0x3C, 0x07, 0x1E, 0xE4, 0x58, 0xF0, + 0x40, 0x28, 0x44, 0x07, 0x1E, 0xE4, 0x40, 0x07, 0x1E, 0xE4, 0xCA, 0xF2, + 0x3F, 0x44, 0x02, 0xAA, 0x76, 0x04, 0x1A, 0xE4, 0x98, 0xF1, 0x67, 0x07, + 0x48, 0x00, 0xC0, 0xE0, 0x6B, 0x0C, 0x1E, 0xE4, 0x0F, 0xA1, 0x45, 0xE0, + 0x49, 0x00, 0xC1, 0xE0, 0x02, 0xA1, 0xDB, 0x09, 0x1E, 0xE4, 0xE7, 0xF0, + 0x0A, 0xA1, 0x6A, 0xF1, 0x08, 0xA1, 0x8A, 0xF1, 0x1E, 0xE4, 0x4A, 0xF0, + 0x02, 0xA1, 0x6A, 0xF0, 0xC2, 0xE0, 0x84, 0x28, 0x9E, 0xF6, 0x4A, 0x0A, + 0xC2, 0xE0, 0x46, 0x09, 0x1E, 0xE4, 0x77, 0x00, 0x06, 0xAF, 0x45, 0x00, + 0xC0, 0xE0, 0x73, 0x00, 0x9C, 0x06, 0x1A, 0xE4, 0x04, 0xA1, 0x06, 0xA8, + 0x37, 0x22, 0x1E, 0xE4, 0xF5, 0x04, 0x0E, 0xE4, 0x98, 0x05, 0x0A, 0xE4, + 0x02, 0xA0, 0xA4, 0x28, 0x3A, 0x15, 0x1E, 0xE4, 0xB4, 0x3C, 0x02, 0xA2, + 0x3A, 0x3C, 0x00, 0xA2, 0x55, 0x07, 0x1E, 0xE4, 0x3A, 0xF0, 0x3A, 0x44, + 0x47, 0x0C, 0x1E, 0xE4, 0x57, 0x0C, 0x1E, 0xE4, 0xA4, 0x3C, 0x3E, 0x28, + 0xE9, 0x3C, 0xE0, 0x1A, 0x1E, 0xE4, 0x4A, 0xF0, 0x74, 0xF0, 0x85, 0x3C, + 0xDB, 0x19, 0x1E, 0xE4, 0x38, 0xF0, 0x85, 0x18, 0x54, 0xF0, 0x56, 0x28, + 0x56, 0x3C, 0x85, 0x28, 0x85, 0x3C, 0xFA, 0xA2, 0x1E, 0xE4, 0x83, 0x3C, + 0x24, 0xF0, 0x84, 0x28, 0x1E, 0xE4, 0x10, 0x08, 0x1E, 0xE4, 0x4F, 0x22, + 0x2E, 0xE4, 0x6B, 0x0C, 0x1E, 0xE4, 0x4D, 0x1B, 0x00, 0xA2, 0xCE, 0xF4, + 0x86, 0x3C, 0x02, 0xA2, 0x5B, 0x3C, 0x09, 0xC0, 0x4C, 0xCC, 0x4A, 0xCC, + 0xC4, 0x3C, 0x62, 0x3C, 0x00, 0xC0, 0x5A, 0x3C, 0xB4, 0x3C, 0xAE, 0x3C, + 0xBD, 0x3C, 0xC5, 0x3C, 0xC1, 0x3C, 0xC0, 0x3C, 0xFE, 0xA2, 0xA5, 0x3C, + 0x97, 0x3C, 0x00, 0xA2, 0xC3, 0x3C, 0xC2, 0x3C, 0x34, 0x07, 0x1A, 0xE4, + 0xAD, 0x28, 0xBC, 0x3C, 0x40, 0x07, 0x1E, 0xE4, 0x3C, 0x07, 0x1E, 0xE4, + 0xBA, 0x3C, 0x0C, 0xA2, 0x44, 0x07, 0x1E, 0xE4, 0xA4, 0x3C, 0xFE, 0xA2, + 0xB9, 0x3C, 0xBB, 0x3C, 0x41, 0x3C, 0x40, 0x3C, 0x3F, 0x3C, 0x09, 0xC0, + 0xF0, 0x3C, 0x04, 0xA2, 0x00, 0xC0, 0x42, 0x3C, 0x85, 0x3C, 0xFA, 0xA2, + 0x84, 0x3C, 0xFC, 0xA2, 0x68, 0xF0, 0x84, 0xA1, 0x11, 0x28, 0x2E, 0xE4, + 0x02, 0xA2, 0x38, 0xF0, 0x04, 0xA8, 0x24, 0x28, 0x00, 0xA2, 0x2E, 0xE4, + 0x00, 0xA2, 0x2E, 0xE4, 0x30, 0xD1, 0x00, 0x00, 0x52, 0xD1, 0x44, 0xCC, + 0xFF, 0xD1, 0x03, 0x00, 0xE0, 0xD1, 0x00, 0x00, 0x99, 0xD1, 0xD0, 0x03, + 0xFD, 0xD1, 0xB0, 0x03, 0x3A, 0xD0, 0x20, 0x07, 0xFC, 0xD1, 0x24, 0x02, + 0x08, 0xD0, 0x00, 0x00, 0x4C, 0xD0, 0x00, 0x00, 0xB1, 0x28, 0x00, 0x02, + 0x4B, 0xD1, 0x00, 0x00, 0x47, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0xCE, 0xCF, + 0x90, 0x20, 0x1E, 0xE4, 0x9E, 0xF0, 0x2A, 0xF0, 0x3A, 0xF0, 0x84, 0x3E, + 0xF5, 0xB7, 0x84, 0x2A, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0xC0, 0xE0, 0x2E, 0xE4, 0xAD, 0x07, 0x1E, 0xE4, 0x00, 0x00, 0x11, 0xD1, + 0x20, 0xCE, 0x42, 0x00, 0x13, 0x00, 0x13, 0xD1, 0x80, 0x00, 0x12, 0xD1, + 0x61, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x1E, 0xE4, 0x02, 0xA2, + 0xE7, 0x0C, 0x1E, 0xE4, 0x28, 0xE1, 0xF6, 0x0A, 0x1E, 0xE4, 0xF1, 0x0C, + 0x1E, 0xE4, 0x48, 0xF0, 0x60, 0x00, 0xC0, 0xE0, 0xBE, 0x1B, 0x1E, 0xE4, + 0x3E, 0xF0, 0x93, 0x1B, 0x01, 0xA2, 0x40, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x00, 0x50, 0x05, 0xE0, 0x42, 0xE0, 0x17, 0xAE, 0x11, 0xD1, 0x20, 0xCE, + 0x42, 0xE0, 0x03, 0xAE, 0x13, 0xD1, 0x00, 0x01, 0x12, 0xD1, 0x00, 0x08, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x10, 0x3C, 0x29, 0x3C, + 0xFE, 0xA2, 0x80, 0xE1, 0x8C, 0x06, 0x1E, 0xE4, 0x46, 0x20, 0x1E, 0xE4, + 0x5A, 0xF0, 0x21, 0x28, 0x74, 0x1B, 0x1E, 0xE4, 0xEA, 0x28, 0x2A, 0xF0, + 0x04, 0xA1, 0x16, 0x28, 0xE7, 0x3C, 0x81, 0x3C, 0x00, 0xA2, 0xE9, 0x3C, + 0x66, 0xE1, 0xE5, 0x3C, 0xE8, 0x3C, 0xE6, 0x3C, 0x67, 0xE1, 0x16, 0x3D, + 0x10, 0xC7, 0xAB, 0x05, 0x00, 0xA2, 0x54, 0x00, 0x66, 0xE1, 0x18, 0x05, + 0x44, 0xCC, 0x02, 0xA1, 0x7F, 0x28, 0xB2, 0x3C, 0xB2, 0x5C, 0x06, 0x9E, + 0x85, 0x06, 0x84, 0xE1, 0xB2, 0x28, 0x17, 0x3D, 0x90, 0xB6, 0x02, 0xA8, + 0x00, 0xA2, 0x90, 0xE1, 0xB2, 0x3C, 0x02, 0xA0, 0x2E, 0xE4, 0x19, 0x0D, + 0x1E, 0xE4, 0x60, 0x3C, 0x3F, 0xC7, 0x00, 0xA2, 0x00, 0x02, 0x61, 0xE1, + 0x1F, 0x00, 0x22, 0xD0, 0xB2, 0x3C, 0x11, 0x3D, 0x4C, 0x20, 0x1E, 0xE4, + 0x9A, 0x06, 0x84, 0xE1, 0x2E, 0xE4, 0xB2, 0x3C, 0x02, 0xA0, 0xB2, 0x28, + 0x00, 0x04, 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0xC1, 0xE0, 0x00, 0x04, + 0x04, 0xE0, 0x2A, 0xE4, 0x5D, 0x00, 0xC3, 0xE0, 0x55, 0xE0, 0x5D, 0x00, + 0x5D, 0x00, 0xC0, 0xE0, 0x00, 0xCE, 0x02, 0xA2, 0xB8, 0xF7, 0x90, 0xE1, + 0x00, 0x04, 0x08, 0xE0, 0xBC, 0x3E, 0x4F, 0x4E, 0xBC, 0x2A, 0x2E, 0xE4, + 0x6B, 0xF0, 0x3F, 0x2A, 0xB9, 0x3C, 0xA1, 0x28, 0x2E, 0xF0, 0xBA, 0x3C, + 0x39, 0xF0, 0x42, 0x2A, 0xC8, 0xF1, 0xA5, 0x28, 0x2E, 0xE4, 0xBB, 0x3C, + 0xA5, 0x4C, 0xD8, 0x28, 0x88, 0xF1, 0x40, 0x28, 0x7A, 0xF0, 0x20, 0x07, + 0x1E, 0xE4, 0x78, 0xF1, 0x4F, 0x28, 0x7A, 0xF0, 0x25, 0x07, 0x1E, 0xE4, + 0x2A, 0x07, 0x1E, 0xE4, 0xEE, 0xF0, 0xD8, 0xF0, 0x6E, 0xF0, 0x98, 0xF0, + 0x38, 0x28, 0x42, 0xF0, 0x4E, 0x28, 0x36, 0xF0, 0x2A, 0x07, 0x1E, 0xE4, + 0x02, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x3A, 0xF0, 0x12, 0xE4, 0x84, 0x28, + 0xA5, 0x3C, 0x2E, 0xE4, 0x53, 0x20, 0x12, 0xE4, 0x84, 0x28, 0x4C, 0x20, + 0xFC, 0xA2, 0x5A, 0x20, 0x12, 0xE4, 0x84, 0x28, 0xF1, 0x06, 0x1E, 0xE4, + 0x3E, 0x3C, 0x84, 0x3C, 0x14, 0x0A, 0x1E, 0xE4, 0x27, 0x0C, 0x1E, 0xE4, + 0x8A, 0xF1, 0x77, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0x44, 0xF1, 0x08, 0xA1, + 0x9A, 0xF1, 0x02, 0xA1, 0x02, 0xA1, 0xDA, 0xF0, 0x02, 0xA1, 0x6A, 0xF1, + 0x02, 0xA1, 0x9A, 0xF0, 0x02, 0xA1, 0xBA, 0xF0, 0x02, 0xA1, 0x66, 0xF0, + 0x04, 0xA1, 0x7A, 0xF0, 0x2E, 0xE4, 0x52, 0xF0, 0x0E, 0xA1, 0x7A, 0xF0, + 0x1E, 0xE4, 0x2E, 0xE4, 0x47, 0x0C, 0x1E, 0xE4, 0x0A, 0xAF, 0xA2, 0xCA, + 0x4E, 0xF6, 0x4A, 0x0A, 0x1E, 0xE4, 0xB8, 0xF0, 0x4E, 0x18, 0x06, 0xA8, + 0x84, 0x24, 0x1E, 0xE4, 0xCA, 0xF5, 0x82, 0x0A, 0x1E, 0xE4, 0x7A, 0xF5, + 0x94, 0x28, 0x9A, 0xF5, 0x2E, 0xE4, 0x27, 0x0C, 0x1E, 0xE4, 0x6E, 0x0C, + 0x02, 0xA8, 0x04, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0x16, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA8, + 0x03, 0xA1, 0x07, 0xA8, 0x07, 0xAF, 0x65, 0x00, 0x2E, 0xE4, 0x36, 0xB6, + 0x03, 0xA1, 0xF6, 0xB7, 0x48, 0x00, 0xC0, 0xE0, 0x27, 0x0C, 0x1E, 0xE4, + 0x8E, 0xF1, 0x34, 0x3C, 0x33, 0x34, 0x09, 0xC0, 0x4E, 0xF1, 0x34, 0x4C, + 0x33, 0x24, 0x09, 0xC0, 0x0E, 0xF1, 0x36, 0x3C, 0x35, 0x34, 0x09, 0xC0, + 0x48, 0x00, 0xC0, 0xE0, 0x27, 0x0C, 0x1E, 0xE4, 0x8E, 0xF0, 0x38, 0x3C, + 0x37, 0x34, 0x09, 0xC0, 0x4E, 0xF0, 0x36, 0x4C, 0x35, 0x24, 0x09, 0xC0, + 0x00, 0xC0, 0x38, 0x4C, 0x37, 0x24, 0x09, 0xC0, 0xAD, 0x28, 0x6E, 0x0C, + 0x1E, 0xE4, 0x2E, 0xE4, 0xC2, 0xE0, 0x3C, 0x07, 0x1E, 0xE4, 0x2A, 0xE4, + 0x7F, 0x21, 0x1E, 0xE4, 0x2E, 0xE4, 0x48, 0x00, 0xFB, 0x05, 0x1E, 0xE4, + 0x22, 0x21, 0x1E, 0xE4, 0xC0, 0xE0, 0x2E, 0xE4, 0x36, 0x26, 0x1E, 0xE4, + 0x04, 0xA1, 0x06, 0xA8, 0x06, 0xAF, 0x45, 0x00, 0xB5, 0x34, 0x6B, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0xB7, 0x34, 0x6C, 0x00, 0xC0, 0xE0, 0xB6, 0x3C, + 0x08, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0xB8, 0x3C, 0x1E, 0xA8, 0x60, 0x00, + 0xC0, 0xE0, 0x88, 0x30, 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x87, 0x3C, + 0x00, 0x06, 0x67, 0xE1, 0x00, 0xA2, 0x8A, 0x3C, 0xC0, 0xE0, 0x01, 0xA2, + 0x17, 0x3D, 0x03, 0xC7, 0xEC, 0x17, 0x18, 0xE4, 0x40, 0xA8, 0x65, 0x00, + 0x1E, 0xE4, 0xA6, 0x3C, 0x88, 0x00, 0x04, 0xE0, 0xD6, 0x3C, 0x71, 0x00, + 0xC0, 0xE0, 0x6E, 0x03, 0x60, 0x00, 0xC0, 0xE0, 0x01, 0xC0, 0x2E, 0xE4, + 0x61, 0x00, 0xC0, 0xE0, 0x01, 0x3C, 0x00, 0x34, 0x00, 0xC0, 0x07, 0x3C, + 0x06, 0x34, 0x14, 0xAE, 0x21, 0x30, 0x02, 0xAF, 0x62, 0x00, 0xC0, 0xE0, + 0x00, 0xA2, 0xAA, 0x3C, 0x3E, 0xA8, 0x02, 0xAF, 0xB1, 0x3C, 0x02, 0xA8, + 0x67, 0x00, 0xC0, 0xE0, 0x1E, 0xE4, 0xFA, 0x03, 0x1E, 0xE4, 0x2E, 0xE4, + 0x20, 0xCE, 0x42, 0x00, 0xC0, 0xE0, 0x4C, 0x01, 0xC0, 0x00, 0x12, 0xD1, + 0x40, 0x06, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x11, 0xD1, 0x20, 0xCE, 0x00, 0x02, 0x00, 0xE0, 0x13, 0xD1, 0xC0, 0x00, + 0x12, 0xD1, 0x40, 0x0B, 0x04, 0xA2, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, + 0x1E, 0xE4, 0x67, 0x21, 0x1E, 0xE4, 0x01, 0xA2, 0xC0, 0xE0, 0xEC, 0x07, + 0x0B, 0xE4, 0x13, 0x21, 0x20, 0xCE, 0x80, 0x03, 0x00, 0xE0, 0x42, 0x00, + 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x06, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, + 0x03, 0x00, 0x13, 0xD1, 0x11, 0xD1, 0x20, 0xCE, 0x80, 0x01, 0x00, 0xE0, + 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x04, 0xA2, 0xF9, 0xF7, + 0x29, 0xCA, 0x03, 0x00, 0x67, 0x21, 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, + 0x04, 0xE0, 0xA5, 0x10, 0x1E, 0xE4, 0x00, 0xA2, 0xC0, 0xE0, 0xA5, 0x10, + 0x1E, 0xE4, 0x40, 0x00, 0x2B, 0xF0, 0x13, 0x21, 0x1E, 0xE4, 0x60, 0x00, + 0x61, 0x00, 0xC0, 0xE0, 0x7F, 0x3C, 0x02, 0xAF, 0x1E, 0xE4, 0x6E, 0x00, + 0xC0, 0xE0, 0x66, 0x3C, 0xC0, 0xE0, 0xFD, 0x05, 0x67, 0xE1, 0xF1, 0x01, + 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x62, 0x00, 0x6F, 0x00, 0xC0, 0xE0, + 0x17, 0x3D, 0x63, 0x00, 0x2E, 0xE4, 0xAF, 0x3C, 0xE9, 0x3C, 0x34, 0xF0, + 0x55, 0x4C, 0x54, 0x24, 0x64, 0xF0, 0x84, 0x28, 0x61, 0x28, 0x55, 0x3C, + 0x54, 0x34, 0x02, 0xA0, 0x90, 0x4C, 0x02, 0xAE, 0x91, 0x4C, 0x04, 0xAE, + 0x3F, 0x20, 0x09, 0xC0, 0x60, 0x00, 0xC2, 0xE0, 0x41, 0x20, 0x61, 0x00, + 0xC2, 0xE0, 0x40, 0x4C, 0x62, 0x00, 0xC2, 0xE0, 0x00, 0xC0, 0x42, 0x4C, + 0xC2, 0xE0, 0x27, 0x4C, 0x26, 0x24, 0x09, 0xC0, 0xC2, 0xE0, 0x29, 0x4C, + 0x28, 0x24, 0x67, 0x00, 0xC2, 0xE0, 0x2B, 0x4C, 0x2A, 0x24, 0x68, 0x00, + 0x0A, 0x17, 0x1E, 0xE4, 0x00, 0xC0, 0x69, 0x00, 0x3F, 0x44, 0x40, 0x54, + 0x16, 0xE0, 0x42, 0x28, 0x83, 0x09, 0x1B, 0xE4, 0x23, 0x2A, 0x00, 0x3C, + 0x02, 0xAE, 0x83, 0x09, 0x19, 0xE4, 0x3F, 0x2A, 0x09, 0xC0, 0x6A, 0x00, + 0xC2, 0xE0, 0x23, 0x4C, 0x6B, 0x00, 0xC2, 0xE0, 0x3C, 0x4C, 0x3B, 0x20, + 0x6E, 0x00, 0xC2, 0xE0, 0x3E, 0x4C, 0x3D, 0x20, 0x09, 0xAE, 0xC0, 0x2A, + 0x00, 0xA2, 0x00, 0xC0, 0x56, 0xE0, 0x07, 0xAE, 0xC1, 0x2A, 0x56, 0xE0, + 0xC3, 0x2A, 0x56, 0xE0, 0x05, 0xAE, 0xC2, 0x2A, 0x72, 0x20, 0x6D, 0x00, + 0xC2, 0xE0, 0x56, 0xE0, 0x1E, 0xE4, 0x6C, 0x00, 0xC2, 0xE0, 0x73, 0x4C, + 0x1E, 0xE4, 0x7B, 0x00, 0xC2, 0xE0, 0x3D, 0x15, 0x57, 0x20, 0x5F, 0x00, + 0xC2, 0xE0, 0x47, 0x15, 0x6F, 0x00, 0xC2, 0xE0, 0x08, 0xAE, 0x58, 0x4C, + 0x70, 0x00, 0xC2, 0xE0, 0x55, 0x4C, 0x54, 0x24, 0x09, 0xC0, 0x71, 0x00, + 0xC2, 0xE0, 0x85, 0x28, 0xC2, 0xE0, 0x00, 0xC0, 0x5A, 0x4C, 0x5B, 0x24, + 0xC2, 0xE0, 0x46, 0x09, 0x1E, 0xE4, 0x72, 0x00, 0x74, 0x00, 0xC2, 0xE0, + 0x00, 0xA2, 0x73, 0x00, 0x56, 0xE0, 0x21, 0xAE, 0xB4, 0x2A, 0x86, 0x28, + 0xBD, 0x2A, 0x56, 0xE0, 0x23, 0xAE, 0xAE, 0x2A, 0x76, 0x00, 0xC2, 0xE0, + 0x56, 0xE0, 0x29, 0xAE, 0x51, 0x00, 0xC2, 0xE0, 0x4C, 0x07, 0x1E, 0xE4, + 0x52, 0x00, 0xC2, 0xE0, 0x50, 0x07, 0x1E, 0xE4, 0x22, 0x2A, 0x77, 0x00, + 0xC2, 0xE0, 0x84, 0x28, 0x11, 0x4D, 0x11, 0x21, 0xE4, 0x05, 0x61, 0xE1, + 0x78, 0x00, 0xC2, 0xE0, 0x02, 0xAE, 0x2B, 0xF0, 0x02, 0xAE, 0x2B, 0xF0, + 0x11, 0x4D, 0x11, 0x21, 0xC2, 0xE0, 0xD7, 0x28, 0x79, 0x00, 0xC2, 0xE0, + 0x7A, 0x00, 0xC2, 0xE0, 0xB0, 0x28, 0x64, 0x00, 0x7C, 0x00, 0xC2, 0xE0, + 0x26, 0x4C, 0x25, 0x20, 0x17, 0x4D, 0x17, 0x21, 0xC7, 0x05, 0x67, 0xE1, + 0x17, 0x4D, 0x17, 0x21, 0x7E, 0x00, 0xC2, 0xE0, 0x4D, 0xC8, 0x4A, 0xC8, + 0x7D, 0x00, 0xC2, 0xE0, 0x53, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x20, 0xAE, + 0xC2, 0xE0, 0x3D, 0x15, 0x1E, 0xE4, 0x2E, 0xE4, 0xC2, 0xE0, 0x47, 0x15, + 0x1E, 0xE4, 0x63, 0x00, 0x83, 0x09, 0x1B, 0xE4, 0x23, 0x2A, 0x5F, 0x00, + 0x02, 0xAE, 0x83, 0x09, 0x19, 0xE4, 0x3F, 0x2A, 0x27, 0x20, 0x64, 0x00, + 0xC2, 0xE0, 0x23, 0x4C, 0x86, 0x28, 0x6D, 0x00, 0xC2, 0xE0, 0x28, 0x4C, + 0x58, 0x4C, 0x57, 0x20, 0x70, 0x00, 0xC2, 0xE0, 0x25, 0x20, 0x71, 0x00, + 0xC2, 0xE0, 0x08, 0xAE, 0x21, 0x28, 0x72, 0x00, 0xC2, 0xE0, 0x26, 0x4C, + 0x9A, 0xF0, 0x04, 0xA1, 0x16, 0x28, 0xCA, 0xF0, 0xC2, 0xE0, 0x04, 0xA0, + 0xB3, 0x3C, 0xEB, 0x28, 0x7E, 0xF0, 0xE9, 0x3C, 0xEA, 0x28, 0x73, 0x00, + 0x73, 0x00, 0xC2, 0xE0, 0x04, 0xA0, 0x19, 0x28, 0xC2, 0xE0, 0xE9, 0x28, + 0xE9, 0x3C, 0x00, 0xA2, 0x47, 0x28, 0x09, 0xC0, 0x00, 0xA2, 0x74, 0x00, + 0x09, 0xE0, 0x48, 0x2A, 0x3F, 0x00, 0x08, 0xE0, 0x56, 0xE0, 0x12, 0xAE, + 0x00, 0xC0, 0xFF, 0x01, 0x61, 0xE1, 0x22, 0x2A, 0x75, 0x00, 0xC2, 0xE0, + 0x2B, 0xF0, 0x11, 0x4D, 0x11, 0x21, 0xE4, 0x05, 0x11, 0x21, 0x76, 0x00, + 0xC2, 0xE0, 0x02, 0xAE, 0xC2, 0xE0, 0x02, 0xAE, 0x2B, 0xF0, 0x11, 0x4D, + 0xF0, 0x58, 0x16, 0xE0, 0x86, 0x28, 0x77, 0x00, 0xC7, 0x05, 0x61, 0xE1, + 0x78, 0x00, 0xC2, 0xE0, 0x7A, 0x00, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0x79, 0x00, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x02, 0xA8, 0x32, 0xAF, + 0x3D, 0x15, 0x1E, 0xE4, 0x19, 0x4E, 0x09, 0xAE, 0x1B, 0xE0, 0x19, 0x2A, + 0x04, 0xAE, 0x22, 0x2A, 0x56, 0xE0, 0x05, 0xAE, 0x56, 0xE0, 0x08, 0xAE, + 0x24, 0x2A, 0x56, 0xE0, 0x1B, 0x2A, 0x56, 0xE0, 0x04, 0xAE, 0x1D, 0x2A, + 0x10, 0xAE, 0x56, 0xE0, 0x02, 0xAE, 0x17, 0xE0, 0xC2, 0xE0, 0x11, 0x4C, + 0x10, 0xAE, 0x1F, 0x4C, 0x02, 0xA0, 0xA4, 0x28, 0x2E, 0xE4, 0x7B, 0x00, + 0x56, 0xB6, 0x02, 0xA2, 0x3D, 0x2A, 0x4A, 0xF0, 0x79, 0xF0, 0x40, 0x2A, + 0x00, 0xA2, 0x92, 0xE0, 0x0F, 0xA8, 0xB9, 0x2A, 0x53, 0xF0, 0xA4, 0x2A, + 0x9B, 0xF0, 0x00, 0x2A, 0x2E, 0xF1, 0x56, 0xE0, 0x56, 0xE0, 0x07, 0xAE, + 0x0F, 0xA8, 0xBA, 0x2A, 0x8E, 0xF0, 0x56, 0xE0, 0x0F, 0xA8, 0xBB, 0x2A, + 0x56, 0xE0, 0x07, 0xAE, 0x0F, 0xA8, 0xBB, 0x2A, 0x01, 0x3C, 0x56, 0xE0, + 0x0F, 0xA8, 0xBA, 0x2A, 0x83, 0x09, 0x1B, 0xE4, 0x23, 0x2A, 0xA3, 0x28, + 0x02, 0xAE, 0x83, 0x09, 0x19, 0xE4, 0x3F, 0x2A, 0x04, 0xAE, 0x00, 0x4C, + 0x0C, 0xAE, 0x23, 0x4C, 0x24, 0xAE, 0x3F, 0x4C, 0x02, 0xAE, 0x43, 0x4C, + 0xBC, 0x2A, 0x56, 0xE0, 0x21, 0xAE, 0x83, 0xE0, 0x0F, 0xAE, 0x3B, 0x2A, + 0x56, 0xE0, 0x0D, 0xAE, 0x3F, 0x28, 0x2E, 0xE4, 0x01, 0x4C, 0x56, 0xE0, + 0x09, 0xC0, 0xF2, 0xF0, 0xA4, 0x28, 0x2A, 0xE4, 0x3E, 0x1C, 0x3D, 0x10, + 0x3C, 0x4C, 0x3B, 0x20, 0x6C, 0xB6, 0x80, 0xB6, 0x4A, 0xF0, 0x00, 0xC0, + 0x96, 0xB6, 0x72, 0xB6, 0x00, 0x2A, 0x2E, 0xE4, 0x02, 0xA2, 0x48, 0xF0, + 0x23, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, 0xA3, 0x28, 0x2E, 0xE4, 0x42, 0x08, + 0x33, 0x00, 0x17, 0x89, 0x34, 0x00, 0x17, 0x89, 0x36, 0x00, 0x17, 0x89, + 0x35, 0x00, 0x17, 0x89, 0x38, 0x00, 0x17, 0x89, 0x37, 0x00, 0x17, 0x89, + 0x17, 0x4D, 0x17, 0x21, 0x17, 0x81, 0x17, 0x81, 0x62, 0xCC, 0x17, 0x4D, + 0x17, 0x21, 0x60, 0xCC, 0x17, 0x21, 0x64, 0xCC, 0x17, 0x4D, 0x17, 0x21, + 0x17, 0x8B, 0x2E, 0xE4, 0x72, 0xCC, 0x17, 0x4D, 0x17, 0x8B, 0x33, 0x00, + 0x17, 0x8B, 0x34, 0x00, 0x17, 0x8B, 0x36, 0x00, 0x17, 0x8B, 0x35, 0x00, + 0x17, 0x81, 0x38, 0x00, 0x17, 0x8B, 0x37, 0x00, 0x17, 0x3D, 0x17, 0x35, + 0x60, 0xC8, 0x17, 0x81, 0x64, 0xC8, 0x17, 0x3D, 0x17, 0x35, 0x62, 0xC8, + 0x17, 0x35, 0x72, 0xC8, 0x17, 0x3D, 0x17, 0x35, 0x13, 0x3C, 0x01, 0xC0, + 0x2E, 0xE4, 0x17, 0x3D, 0x6E, 0xF0, 0x13, 0x28, 0x01, 0xC0, 0x9E, 0xF0, + 0x01, 0xC0, 0x3E, 0xF0, 0x14, 0x3C, 0x01, 0xC0, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0xC0, 0x14, 0x28, 0x06, 0xAE, 0x00, 0xC0, 0x31, 0x4C, 0x30, 0x24, + 0x6B, 0xE1, 0x22, 0xE4, 0x46, 0xE0, 0x73, 0xC8, 0x9E, 0xF0, 0x33, 0x3C, + 0x01, 0xC0, 0x2E, 0xE4, 0x01, 0xC0, 0x6E, 0xF0, 0x33, 0x28, 0x01, 0xC0, + 0x11, 0x28, 0x01, 0xC0, 0x3E, 0xF0, 0x11, 0x3C, 0x40, 0x00, 0x48, 0xD1, + 0x2E, 0xE4, 0x00, 0xC0, 0x00, 0x00, 0x45, 0xD1, 0x00, 0x00, 0x44, 0xD1, + 0x00, 0x00, 0x6B, 0xD1, 0x00, 0x00, 0x68, 0xD1, 0x18, 0xAE, 0x32, 0xA2, + 0x00, 0x02, 0x4B, 0xD1, 0x9A, 0xCA, 0x0C, 0x00, 0x4C, 0xD1, 0xC0, 0xCE, + 0x00, 0x24, 0x01, 0xC0, 0x2E, 0xE4, 0xF8, 0xF7, 0x08, 0x34, 0x07, 0x0C, + 0x06, 0x04, 0x01, 0x4C, 0x81, 0xE1, 0x2A, 0x20, 0x71, 0xD0, 0x09, 0x3C, + 0x1E, 0xE4, 0xAA, 0xF0, 0x0C, 0x28, 0x01, 0xC0, 0x45, 0x00, 0xC0, 0xE0, + 0x45, 0xE0, 0x5E, 0x0C, 0x0C, 0x30, 0x12, 0xB6, 0x02, 0xA8, 0x04, 0xAF, + 0x08, 0xE0, 0x02, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0x48, 0x00, 0xC0, 0xE0, + 0x03, 0x3C, 0x00, 0xFE, 0x00, 0xA2, 0x0B, 0x3C, 0xFF, 0x01, 0x08, 0xE0, + 0x84, 0xE1, 0xFF, 0x00, 0x22, 0xD0, 0x78, 0xCC, 0x1E, 0xE4, 0x90, 0xE1, + 0x7A, 0xCC, 0x32, 0x0A, 0x1E, 0xE4, 0x15, 0x0B, 0x1E, 0xE4, 0xF6, 0x0A, + 0x1A, 0x3C, 0x00, 0xA2, 0x01, 0xC0, 0xF6, 0x09, 0x52, 0x0A, 0x12, 0xE4, + 0x02, 0xA1, 0x0B, 0x28, 0x00, 0xA2, 0x1A, 0x3C, 0x02, 0xA2, 0x01, 0xC0, + 0x1E, 0xE4, 0x00, 0xA2, 0x00, 0xC0, 0xAA, 0xCE, 0x90, 0xE1, 0xA0, 0xCA, + 0x2E, 0xE4, 0x19, 0x0D, 0x18, 0xE4, 0x9C, 0xCA, 0xF8, 0xF7, 0x9A, 0xCA, + 0x84, 0xE1, 0x44, 0xCC, 0x2E, 0xE4, 0x15, 0x0B, 0x15, 0x0B, 0x18, 0xE4, + 0x9C, 0xCA, 0x5B, 0x0A, 0x90, 0xE1, 0xF9, 0xF7, 0x9B, 0xCA, 0xA0, 0xCA, + 0xB0, 0xCE, 0x00, 0x01, 0x04, 0xE0, 0x2E, 0xE4, 0xB8, 0xCE, 0x14, 0xE0, + 0xFF, 0x00, 0x04, 0xE0, 0x00, 0x00, 0x5E, 0xD1, 0x00, 0x00, 0x5D, 0xD1, + 0x18, 0xAE, 0x32, 0xA2, 0x00, 0x00, 0x5F, 0xD1, 0x57, 0xD1, 0xC0, 0xCE, + 0x20, 0x06, 0x0A, 0xE0, 0x4C, 0xD1, 0x00, 0x00, 0x4A, 0xD1, 0x00, 0x00, + 0x15, 0x0B, 0x18, 0xE4, 0x9C, 0xCA, 0x03, 0x00, 0x02, 0xA8, 0xAE, 0xCA, + 0xC8, 0xF7, 0x9A, 0xCA, 0x15, 0x0B, 0x18, 0xE4, 0x9C, 0xCA, 0x3A, 0xF7, + 0x1E, 0xE4, 0x06, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x1C, 0xA1, 0xDB, 0x09, + 0x1E, 0xE4, 0x52, 0x0A, 0x1E, 0xE4, 0xD8, 0x3C, 0x00, 0xA2, 0x68, 0xF2, + 0x1E, 0xE4, 0x00, 0xA2, 0x98, 0xF2, 0x47, 0x0C, 0x0E, 0xAF, 0xD2, 0x09, + 0x1E, 0xE4, 0x52, 0x0A, 0x0C, 0xAF, 0xD5, 0x09, 0x1E, 0xE4, 0xAA, 0xF1, + 0x1E, 0xE4, 0x4F, 0x3C, 0x16, 0xE0, 0x02, 0xA8, 0x1E, 0xE4, 0x00, 0xA2, + 0x98, 0xF1, 0x47, 0x0C, 0x38, 0xF1, 0x47, 0x0C, 0x1E, 0xE4, 0x52, 0x0A, + 0x0A, 0xAF, 0x52, 0x0A, 0x1E, 0xE4, 0x00, 0xA2, 0x36, 0xF0, 0xD6, 0x18, + 0xD7, 0x3C, 0x0E, 0xA8, 0xB8, 0x0A, 0x1E, 0xE4, 0xD8, 0x3E, 0x03, 0xA2, + 0x00, 0xC0, 0x31, 0x4C, 0x30, 0x20, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xA2, + 0x2E, 0xE4, 0x1A, 0xE0, 0x31, 0x3C, 0x30, 0x3C, 0x00, 0xA2, 0x01, 0xC0, + 0x01, 0xC0, 0xC6, 0x0A, 0x1E, 0xE4, 0x33, 0x3C, 0x28, 0xE1, 0x01, 0xC0, + 0xF6, 0x0A, 0x1E, 0xE4, 0x33, 0x28, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, + 0x92, 0xCE, 0x0E, 0xAE, 0x00, 0xC0, 0x11, 0x44, 0x00, 0x00, 0x58, 0xD1, + 0x00, 0x00, 0x4A, 0xD1, 0xB8, 0xCE, 0x14, 0xE0, 0xFF, 0x01, 0x04, 0xE0, + 0x00, 0x00, 0x5E, 0xD1, 0x00, 0x00, 0x5D, 0xD1, 0x03, 0x00, 0x61, 0xD1, + 0x00, 0x00, 0x5F, 0xD1, 0x38, 0x06, 0x0A, 0xE0, 0x18, 0xAE, 0x32, 0xA2, + 0x9C, 0xCA, 0x03, 0x00, 0x4C, 0xD1, 0xC0, 0xCE, 0xC8, 0xF7, 0x9A, 0xCA, + 0x15, 0x0B, 0x18, 0xE4, 0x01, 0xC0, 0x9E, 0xCA, 0xA8, 0xF7, 0x9C, 0xCA, + 0x30, 0x00, 0x94, 0xCA, 0x92, 0xCC, 0x32, 0x3C, 0x90, 0xCC, 0x31, 0x3C, + 0x30, 0x34, 0x31, 0x0C, 0x95, 0x14, 0x04, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0x00, 0x00, 0x30, 0xD0, 0x9E, 0xCC, 0x20, 0xAE, 0x00, 0x00, 0x33, 0xD0, + 0x00, 0x00, 0x34, 0xD0, 0x7F, 0x00, 0x36, 0xD0, 0x00, 0x00, 0x35, 0xD0, + 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0x01, 0x00, 0x4B, 0xD0, + 0x00, 0x00, 0x39, 0xD0, 0x00, 0x00, 0x46, 0xD0, 0x00, 0x00, 0x4C, 0xD0, + 0x00, 0x00, 0x49, 0xD1, 0x00, 0x00, 0x47, 0xD0, 0x3A, 0xF2, 0x0C, 0x28, + 0x01, 0xC0, 0x2E, 0xE4, 0x04, 0xE0, 0x01, 0xC0, 0x73, 0x02, 0x1E, 0xE4, + 0x06, 0xA8, 0x0D, 0x28, 0x50, 0xCE, 0x40, 0x04, 0x06, 0xAE, 0x06, 0xA8, + 0x12, 0xE0, 0x08, 0xA1, 0x40, 0x58, 0x0B, 0x01, 0x04, 0xE0, 0x40, 0x3C, + 0xE8, 0xF7, 0x04, 0xA8, 0x50, 0xCA, 0x52, 0xCE, 0x4E, 0xD1, 0x01, 0xC0, + 0x7A, 0x02, 0x1E, 0xE4, 0x02, 0x24, 0x00, 0x00, 0x44, 0xD1, 0x00, 0x00, + 0x02, 0x34, 0x00, 0x02, 0x00, 0xE0, 0x03, 0x4C, 0x00, 0x00, 0x27, 0xD0, + 0x5E, 0xF3, 0x03, 0x3C, 0x01, 0xC0, 0x7C, 0x0B, 0x1A, 0xE4, 0x0C, 0x28, + 0x1A, 0xF2, 0x0D, 0x28, 0x01, 0x00, 0x27, 0xD0, 0x02, 0x24, 0xE8, 0xF7, + 0x02, 0xA8, 0x48, 0xCA, 0x00, 0x00, 0x21, 0xD1, 0x40, 0xCE, 0x03, 0x4C, + 0x43, 0x00, 0xC0, 0xE0, 0x40, 0x00, 0x22, 0xD1, 0x46, 0xCE, 0x32, 0xA0, + 0x02, 0xAE, 0x06, 0xA8, 0x04, 0xE0, 0xE8, 0xF7, 0x02, 0xA8, 0x48, 0xCA, + 0x02, 0x34, 0x03, 0x0C, 0x02, 0x04, 0x00, 0x02, 0x54, 0xF0, 0x09, 0x1C, + 0x08, 0x14, 0x03, 0x3C, 0x03, 0x3C, 0x02, 0x34, 0x01, 0x4C, 0x00, 0x24, + 0x1E, 0xE4, 0xCF, 0x0B, 0x18, 0xE4, 0x0C, 0x28, 0x00, 0x00, 0x4E, 0xD1, + 0x01, 0xC0, 0x27, 0x0C, 0x2E, 0xE4, 0x00, 0xC0, 0x00, 0x00, 0x44, 0xD1, + 0x00, 0xA2, 0x03, 0xA1, 0x59, 0x00, 0xC1, 0xE0, 0xC1, 0xE0, 0x1C, 0x00, + 0x00, 0xE0, 0x36, 0xB6, 0x2E, 0xE4, 0x1A, 0xE0, 0x52, 0xE0, 0x45, 0x00, + 0x04, 0xE0, 0x0A, 0x3C, 0x00, 0xA2, 0x01, 0xC0, 0x43, 0x00, 0xC0, 0xE0, + 0x0D, 0x3C, 0x00, 0x02, 0x70, 0x0B, 0x1E, 0xE4, 0xD8, 0xF3, 0x08, 0xA8, + 0x03, 0x4C, 0x02, 0x24, 0x0C, 0x3C, 0x01, 0xC0, 0x05, 0x3E, 0x04, 0x36, + 0x49, 0x00, 0xC1, 0xE0, 0x33, 0xF0, 0x45, 0xE0, 0x05, 0x4E, 0x04, 0x26, + 0x00, 0x02, 0x03, 0xE0, 0x07, 0x0E, 0x06, 0x06, 0x73, 0xF2, 0x0C, 0x3C, + 0x02, 0xB6, 0x0C, 0x28, 0x0C, 0x28, 0x0D, 0x3E, 0x00, 0x02, 0x01, 0xE0, + 0x17, 0xE0, 0x1B, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0x08, 0xE4, 0x0A, 0x28, + 0xD8, 0xF1, 0x52, 0xE0, 0x01, 0xC0, 0xCA, 0x01, 0x1E, 0xE4, 0x86, 0x0B, + 0x00, 0x40, 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, + 0x86, 0x0B, 0x0A, 0xE4, 0xC0, 0xE0, 0xC8, 0xF7, 0x00, 0x20, 0x08, 0xE0, + 0xC2, 0xE0, 0x00, 0x40, 0x0A, 0xE0, 0x5D, 0x00, 0x0A, 0x3C, 0x00, 0xCE, + 0x02, 0xA2, 0x5D, 0x00, 0x0C, 0x2A, 0x0D, 0x28, 0x86, 0x0B, 0x0E, 0xE4, + 0x0D, 0x3C, 0x00, 0x02, 0x04, 0xE0, 0x39, 0xF0, 0x09, 0xE0, 0x5D, 0x00, + 0xC1, 0xE0, 0x00, 0xC0, 0x01, 0xC0, 0x2E, 0xE4, 0xC9, 0xF7, 0x00, 0x40, + 0x0D, 0x28, 0x01, 0xC0, 0x73, 0x02, 0x1E, 0xE4, 0x1B, 0x0C, 0x0A, 0xE4, + 0x00, 0x02, 0x02, 0xE0, 0x08, 0xA1, 0x6A, 0xF2, 0x06, 0xA8, 0x0D, 0x28, + 0x0D, 0x28, 0x40, 0x3C, 0x06, 0xAE, 0x12, 0xE0, 0xC0, 0x01, 0x00, 0xE0, + 0x20, 0xAE, 0x04, 0xAF, 0x50, 0xCA, 0x52, 0xCA, 0x90, 0xE1, 0x50, 0xCE, + 0x40, 0x5C, 0x52, 0xCA, 0xE8, 0xF7, 0x04, 0xA8, 0x07, 0xAE, 0x07, 0xA8, + 0x0D, 0x2A, 0x40, 0x58, 0x40, 0x5E, 0x0B, 0x01, 0x05, 0xE0, 0x40, 0x3E, + 0x21, 0xAE, 0x05, 0xAF, 0x0D, 0x2A, 0x56, 0xE0, 0x90, 0xE1, 0x51, 0xCE, + 0x40, 0x01, 0x01, 0xE0, 0xE8, 0xF7, 0x04, 0xA8, 0x50, 0xCA, 0x52, 0xCE, + 0x22, 0xF0, 0x0D, 0x18, 0xFC, 0x01, 0x04, 0xE0, 0x06, 0xA0, 0x0D, 0x28, + 0x01, 0xC0, 0x7E, 0xF1, 0x40, 0x04, 0x00, 0xE0, 0x20, 0xAE, 0x04, 0xAF, + 0x08, 0xA1, 0x06, 0xA8, 0x0D, 0x28, 0x50, 0xCE, 0x40, 0x3C, 0x06, 0xAE, + 0x06, 0xA8, 0x12, 0xE0, 0x52, 0xCE, 0x40, 0x58, 0x0B, 0x01, 0x04, 0xE0, + 0x00, 0xC0, 0xE8, 0xF7, 0x04, 0xA8, 0x50, 0xCA, 0x27, 0x0C, 0x1E, 0xE4, + 0x7A, 0x02, 0x0E, 0xE4, 0x17, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0x01, 0xC0, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x18, 0x3C, 0x4E, 0xF8, 0x16, 0xB6, + 0x1A, 0x2A, 0xAA, 0xCA, 0x01, 0xC0, 0x2E, 0xE4, 0xAA, 0xCE, 0x00, 0xA2, + 0x0E, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0x40, 0x3C, 0x40, 0x08, 0x0F, 0x4C, + 0x0E, 0x24, 0x0F, 0x3C, 0x33, 0xF0, 0x01, 0x1E, 0x00, 0x16, 0x49, 0xE0, + 0x08, 0x16, 0x49, 0xE0, 0x07, 0x0C, 0x06, 0x04, 0x07, 0x1C, 0x06, 0x14, + 0x35, 0xF0, 0x09, 0x1E, 0x01, 0xC0, 0xFE, 0xF0, 0x48, 0x00, 0xC2, 0xE0, + 0x27, 0x0C, 0x1E, 0xE4, 0xCA, 0xF0, 0x0C, 0x28, 0x45, 0xE0, 0x5E, 0x0C, + 0x1E, 0xE4, 0x01, 0xC0, 0x00, 0x02, 0x03, 0xE0, 0x26, 0xB6, 0x00, 0xA2, + 0x0E, 0xFF, 0x2E, 0xE4, 0x00, 0xC0, 0x06, 0xB6, 0x04, 0xAF, 0x45, 0x00, + 0xC0, 0xE0, 0x2A, 0xE4, 0x49, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, + 0x0F, 0x4C, 0x0E, 0x24, 0x0F, 0x3C, 0x0E, 0x34, 0x0F, 0x3E, 0x0E, 0x36, + 0x48, 0x00, 0xC1, 0xE0, 0x1E, 0xE4, 0x2E, 0xE4, 0x0F, 0x4E, 0x0E, 0x26, + 0xAA, 0xCE, 0x00, 0xA2, 0x2E, 0xE4, 0x27, 0x0C, 0x00, 0xC0, 0x18, 0x4C, + 0x17, 0x24, 0x01, 0xC0, 0x1E, 0xE4, 0x2E, 0xE4, 0x48, 0x00, 0xC2, 0xE0, + 0x18, 0xF1, 0x47, 0x0C, 0x1E, 0xE4, 0x5D, 0x0A, 0x49, 0xE0, 0xA2, 0xCA, + 0x1E, 0x0C, 0x1E, 0xE4, 0x1F, 0x00, 0x09, 0xE0, 0x80, 0x00, 0x08, 0xE0, + 0x1E, 0xE4, 0x04, 0xA2, 0x59, 0xF0, 0x11, 0xB6, 0x3E, 0xF0, 0xA2, 0xCA, + 0xEE, 0xF6, 0x52, 0x0A, 0xFF, 0x00, 0x08, 0xE0, 0x0B, 0x01, 0x04, 0xE0, + 0xD5, 0x09, 0x1E, 0xE4, 0xD2, 0x09, 0x1E, 0xE4, 0x1E, 0xE4, 0xD8, 0x09, + 0x1E, 0xE4, 0x3E, 0xA8, 0x4E, 0x3C, 0x06, 0xA8, 0x0A, 0xAF, 0xD5, 0x09, + 0x16, 0xE0, 0x0A, 0xA1, 0xDB, 0x09, 0x1E, 0xE4, 0x2E, 0xE4, 0xDB, 0x09, + 0x1E, 0xE4, 0x4F, 0x3C, 0x73, 0xC8, 0x16, 0xE0, 0x32, 0x28, 0x01, 0xC0, + 0x30, 0x24, 0x07, 0xAF, 0xE8, 0xF1, 0x11, 0xA0, 0xAE, 0xF0, 0xFA, 0xF0, + 0x46, 0xE0, 0x31, 0x28, 0x01, 0x29, 0x01, 0x06, 0x61, 0xE1, 0x01, 0xC0, + 0x46, 0xE0, 0x07, 0xAF, 0x11, 0xA0, 0x73, 0xC8, 0x0E, 0xB6, 0x22, 0xB6, + 0x49, 0xE0, 0x5A, 0xF0, 0x28, 0xF0, 0x0E, 0xA8, 0x68, 0xC8, 0xBE, 0xF0, + 0x03, 0xA2, 0x35, 0x78, 0x35, 0x3C, 0x10, 0xA2, 0x00, 0xC0, 0x46, 0xE0, + 0x03, 0xAF, 0x35, 0x5A, 0x95, 0x3C, 0x4F, 0x2A, 0x4E, 0x28, 0x2E, 0xE4, + 0x32, 0x2A, 0x31, 0x28, 0x01, 0xC0, 0x96, 0x3E, 0x2E, 0xE4, 0x00, 0xC0, + 0x37, 0x3E, 0x36, 0x3C, 0x4F, 0x3E, 0x4E, 0x3C, 0x96, 0x2A, 0x95, 0x28, + 0x31, 0x3C, 0x37, 0x2A, 0x36, 0x28, 0x01, 0xC0, 0x00, 0xA2, 0x93, 0xCC, + 0x90, 0xCC, 0x32, 0x3E, 0x1E, 0xE4, 0x00, 0xC0, 0x33, 0x3C, 0x30, 0x3C, + 0x01, 0xC0, 0x2E, 0xE4, 0x28, 0xE1, 0xF6, 0x0A, 0x2E, 0xE4, 0x00, 0xC0, + 0x31, 0x3C, 0x30, 0x34, 0x00, 0xC0, 0x31, 0x4C, 0x30, 0x24, 0x01, 0xC0, + 0x00, 0xC0, 0x32, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x32, 0x28, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x10, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0xC0, 0x10, 0x28, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x38, 0x3C, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x38, 0x28, 0x01, 0xC0, 0x2E, 0xE4, + 0x41, 0x00, 0xC0, 0xE0, 0x01, 0xC0, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, + 0x20, 0x01, 0x05, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0x21, 0x3C, 0x20, 0x34, + 0x00, 0xC0, 0x21, 0x4C, 0x20, 0x24, 0x01, 0xC0, 0x64, 0x3C, 0x8E, 0xE0, + 0x63, 0x3C, 0x2E, 0xE4, 0x2D, 0x0D, 0x1E, 0xE4, 0x25, 0x0D, 0x1E, 0xE4, + 0x60, 0x3C, 0x63, 0x28, 0x9E, 0xE0, 0x64, 0x28, 0x00, 0xE0, 0x08, 0xAE, + 0x60, 0x28, 0x2E, 0xE4, 0xB7, 0x09, 0x1E, 0xE4, 0x9E, 0xE0, 0x38, 0x05, + 0x00, 0xE0, 0x08, 0xAE, 0x63, 0x28, 0x2E, 0xE4, 0x9C, 0x09, 0x1E, 0xE4, + 0x9E, 0xE0, 0x38, 0x05, 0x37, 0x1C, 0x08, 0xE4, 0x60, 0x28, 0x2E, 0xE4, + 0x1E, 0xE4, 0xB8, 0xF1, 0xF5, 0x0C, 0x1E, 0xE4, 0xC6, 0x0A, 0x1E, 0xE4, + 0x68, 0xF0, 0xEC, 0x09, 0x96, 0xC8, 0x70, 0xE4, 0x00, 0x00, 0x4C, 0xD0, + 0x4C, 0xD0, 0x58, 0x0D, 0x1E, 0xE4, 0x5A, 0xF0, 0x05, 0xE0, 0xF2, 0x09, + 0x1E, 0xE4, 0x00, 0x00, 0x4B, 0xD0, 0x6F, 0xCC, 0x15, 0xB6, 0x80, 0x00, + 0xF9, 0x0C, 0x1E, 0xE4, 0x02, 0xA2, 0x01, 0x00, 0x70, 0xE4, 0x00, 0x00, + 0x4C, 0xD0, 0x70, 0xE4, 0x1E, 0xE4, 0x10, 0x3C, 0x00, 0xA2, 0x01, 0xC0, + 0x96, 0xCC, 0x32, 0x28, 0x01, 0xC0, 0xC6, 0x0A, 0x00, 0xC0, 0x11, 0x3C, + 0x16, 0xE0, 0x11, 0x28, 0x4A, 0xF8, 0x38, 0xF0, 0x0C, 0xBA, 0x2E, 0xE4, + 0x4C, 0xBA, 0x2E, 0xE4, 0xFC, 0xBC, 0x2E, 0xE4, 0x02, 0xA0, 0x9D, 0x28, + 0x9D, 0x3C, 0x0C, 0xA2, 0x40, 0xBA, 0xD2, 0xF0, 0x40, 0xA1, 0x9D, 0x3C, + 0xAB, 0x34, 0x02, 0xA1, 0x9D, 0x58, 0xAA, 0xF7, 0x91, 0x0D, 0x1E, 0xE4, + 0x9D, 0x28, 0xAC, 0x3C, 0x6B, 0xE1, 0x2E, 0xE4, 0xAC, 0x0C, 0xAB, 0x00, + 0x8A, 0xFE, 0xD8, 0xF0, 0x0C, 0xBA, 0x2E, 0xE4, 0x00, 0x00, 0xAC, 0x8C, + 0xAC, 0x3C, 0x2D, 0xE4, 0x2C, 0xE4, 0x12, 0xE0, 0x02, 0xAF, 0x02, 0xA0, + 0x7E, 0xBE, 0x2E, 0xE4, 0x6A, 0xE1, 0x12, 0xE0, 0x20, 0xA0, 0x50, 0xF0, + 0x20, 0xA1, 0x2E, 0xE4, 0x9E, 0x3C, 0x2E, 0xE4, 0x9E, 0x74, 0x9E, 0x3C, + 0x56, 0xE0, 0x9E, 0x76, 0x9E, 0x58, 0x5E, 0xBA, 0x68, 0xC8, 0x2A, 0xE4, + 0x40, 0xBA, 0x2E, 0xE4, 0x28, 0xE4, 0x16, 0xE0, 0x00, 0x3C, 0x0E, 0xA8, + 0x38, 0x2A, 0x2E, 0xE4, 0x16, 0xE0, 0x00, 0x74, 0x2B, 0xF0, 0x25, 0xE4, + 0x2F, 0x28, 0x03, 0xA1, 0x5E, 0x3C, 0x02, 0xA0, 0xF4, 0xB7, 0x30, 0x28, + 0x5A, 0xA2, 0x4A, 0xF0, 0x24, 0xE4, 0x04, 0xA1, 0x00, 0x3C, 0x0E, 0xBC, + 0x2E, 0xE4, 0x5F, 0x3C, 0x0E, 0xBC, 0x2A, 0xF0, 0x22, 0x28, 0x2D, 0xE4, + 0x06, 0xAE, 0x01, 0x28, 0x2D, 0xE4, 0x01, 0x3C, 0x28, 0x07, 0x61, 0xE1, + 0x5F, 0x3C, 0x00, 0x4C, 0x22, 0x00, 0x48, 0x88, 0x20, 0x07, 0x64, 0xE1, + 0x3C, 0xA2, 0x2D, 0xE4, 0x0C, 0x0E, 0x1E, 0xE4, 0x86, 0xF0, 0x46, 0xE0, + 0x0D, 0x3E, 0x48, 0x2A, 0x64, 0xE1, 0x28, 0x07, 0x61, 0xE1, 0x0F, 0x3C, + 0x38, 0x28, 0xF1, 0x0D, 0x1E, 0xE4, 0x28, 0x07, 0x88, 0x07, 0x61, 0xE1, + 0x28, 0xE4, 0x04, 0xA1, 0x22, 0x00, 0x49, 0x88, 0x24, 0x07, 0x64, 0xE1, + 0x49, 0x2A, 0x3C, 0xA2, 0x0C, 0x0E, 0x1E, 0xE4, 0x46, 0xE0, 0x49, 0x00, + 0x65, 0xE1, 0x0D, 0x3E, 0x88, 0x07, 0x61, 0xE1, 0x0F, 0x3C, 0x86, 0xF0, + 0xF1, 0x0D, 0x1E, 0xE4, 0x88, 0x07, 0x64, 0xE1, 0x4E, 0xF0, 0x94, 0xE0, + 0x06, 0xA2, 0x2E, 0xE4, 0x01, 0x2B, 0x93, 0xE0, 0x41, 0xA0, 0x83, 0xE0, + 0x98, 0xE0, 0x02, 0xA0, 0x0D, 0x08, 0x88, 0xE0, 0x02, 0xA1, 0x84, 0xE0, + 0x14, 0x3F, 0x0F, 0x86, 0xC6, 0xE0, 0x2E, 0xE4, 0x38, 0xF7, 0x94, 0xE0, + 0xC7, 0xE0, 0x10, 0xAE, 0x03, 0x44, 0x80, 0x00, 0x2E, 0xE4, 0x56, 0xE0, + 0x03, 0x46, 0x80, 0x00, 0x40, 0xA0, 0x94, 0xE0, 0x40, 0xA0, 0x82, 0xE0, + 0x03, 0x3C, 0xFF, 0x00, 0x04, 0xE0, 0x96, 0xE0, 0x07, 0x3C, 0x06, 0x3C, + 0x05, 0x3C, 0x00, 0xA2, 0x46, 0x0E, 0x84, 0xE1, 0x09, 0x3C, 0x08, 0x3C, + 0x03, 0x0E, 0x1E, 0xE4, 0x5A, 0xF0, 0x40, 0xBA, 0x00, 0x58, 0x02, 0xA2, + 0xCE, 0xF0, 0x11, 0x3D, 0x07, 0x4E, 0x06, 0x22, 0x11, 0x3D, 0x10, 0xAE, + 0x06, 0x34, 0x56, 0xE0, 0x05, 0x58, 0x02, 0xA2, 0x40, 0xBA, 0x6A, 0xF1, + 0x22, 0x28, 0x07, 0x3C, 0x12, 0x3D, 0x03, 0x0E, 0x1E, 0xE4, 0x8A, 0xF0, + 0xDE, 0xF0, 0x13, 0x3D, 0x03, 0x0E, 0x1E, 0xE4, 0x12, 0x3D, 0x10, 0xAE, + 0x01, 0x58, 0x02, 0xA2, 0x02, 0xA2, 0x09, 0x4E, 0x08, 0x22, 0x13, 0x3D, + 0x09, 0x3C, 0x08, 0x34, 0x56, 0xE0, 0x05, 0x58, 0x06, 0x20, 0x05, 0x3C, + 0x02, 0xA0, 0x05, 0x28, 0x08, 0x20, 0x4D, 0x0E, 0x1E, 0xE4, 0x07, 0x4C, + 0x14, 0x3D, 0x14, 0x35, 0x14, 0xE0, 0x09, 0x4C, 0x0D, 0xE4, 0xFF, 0xFF, + 0xC4, 0xE0, 0x2E, 0xE4, 0x58, 0x3C, 0x59, 0x34, 0x09, 0xC0, 0x5B, 0x0F, + 0xA1, 0x3C, 0xFE, 0xA2, 0x38, 0xF0, 0x00, 0xC0, 0x09, 0xC0, 0x98, 0xF0, + 0x83, 0x03, 0x1E, 0xE4, 0x1A, 0xE0, 0x00, 0xC0, 0x58, 0x4C, 0x59, 0x24, + 0x12, 0xBC, 0x5B, 0x0F, 0x08, 0xE4, 0x51, 0x44, 0xA8, 0xB4, 0x0A, 0xA1, + 0x5B, 0x0F, 0x0D, 0xE4, 0xB4, 0xB7, 0x5B, 0x0F, 0x00, 0xE4, 0x04, 0xA1, + 0xA1, 0x3C, 0xA1, 0x60, 0x38, 0x3C, 0x06, 0xA0, 0x51, 0x2A, 0x5B, 0x0F, + 0x0D, 0xE4, 0xFE, 0xBD, 0x6A, 0xF0, 0x29, 0x18, 0x49, 0xE0, 0x9B, 0xF0, + 0x0A, 0xE4, 0xFC, 0x1B, 0x1E, 0xE4, 0x29, 0x3E, 0x00, 0xA2, 0x39, 0x3C, + 0x13, 0x74, 0x5B, 0x0F, 0x68, 0xF0, 0x1B, 0x28, 0x42, 0x3C, 0x3F, 0x3C, + 0x40, 0xBA, 0x3A, 0xF0, 0x3F, 0x3C, 0x40, 0xBA, 0x09, 0xC0, 0xAA, 0xF3, + 0x51, 0x28, 0x42, 0x3C, 0x3F, 0x5C, 0x00, 0xC0, 0x56, 0x4C, 0x57, 0x24, + 0x40, 0x3C, 0x00, 0xA2, 0x44, 0x3C, 0x52, 0x34, 0x68, 0x0F, 0x1E, 0xE4, + 0x8A, 0xF0, 0x3A, 0x28, 0xA4, 0x3C, 0x3E, 0x28, 0xA8, 0xF1, 0x40, 0x3C, + 0x4E, 0x28, 0x3A, 0x3C, 0x3F, 0x28, 0x9E, 0xF1, 0x3C, 0x3C, 0x39, 0x28, + 0x3B, 0x3C, 0x1A, 0xE0, 0x3E, 0x3C, 0xFC, 0xA2, 0x3D, 0x3C, 0x42, 0x28, + 0x4E, 0x28, 0xB8, 0xF0, 0x08, 0xA8, 0xAA, 0x28, 0x6A, 0xF0, 0x39, 0x1C, + 0x50, 0x28, 0x98, 0xF0, 0x00, 0xA2, 0x3E, 0xF0, 0xBE, 0x3C, 0x02, 0xA2, + 0x58, 0x2C, 0x59, 0x24, 0x09, 0xC0, 0x3A, 0x3C, 0x18, 0xF0, 0x40, 0x28, + 0x38, 0xF0, 0x00, 0xC0, 0x43, 0x3C, 0x1C, 0x44, 0x16, 0xE0, 0x3F, 0x28, + 0x41, 0x3C, 0x74, 0xB6, 0x42, 0x08, 0x3F, 0x28, 0x65, 0x0D, 0x1E, 0xE4, + 0x6A, 0xF0, 0x4F, 0x28, 0x1E, 0xE4, 0x45, 0x3C, 0x5B, 0x0F, 0x0D, 0xE4, + 0x1E, 0xE4, 0x7A, 0xF0, 0x35, 0x28, 0x45, 0x19, 0x08, 0xE4, 0x5B, 0x0F, + 0x0D, 0xE4, 0x65, 0x0D, 0x38, 0xF0, 0x04, 0xA1, 0x38, 0x28, 0x5B, 0x0F, + 0x48, 0x3C, 0x2C, 0x28, 0x46, 0x3C, 0x40, 0xBA, 0xEA, 0xF0, 0x38, 0x28, + 0x49, 0x3C, 0x2E, 0x28, 0x48, 0x3C, 0x3E, 0xBC, 0xCA, 0xF0, 0x40, 0xBA, + 0x04, 0xA1, 0x38, 0x28, 0x5B, 0x0F, 0x0D, 0xE4, 0x0D, 0xE4, 0x49, 0x3C, + 0x3E, 0xBC, 0x58, 0xF0, 0x1E, 0xE4, 0x5A, 0xF0, 0x51, 0x28, 0x5B, 0x0F, + 0x38, 0x28, 0x84, 0x0F, 0x1E, 0xE4, 0xE0, 0x1C, 0x0A, 0xE4, 0x8B, 0x0F, + 0x1A, 0xE4, 0x16, 0xE0, 0x0D, 0xE4, 0xA7, 0x0D, 0x1E, 0xE4, 0x5B, 0x0F, + 0x1E, 0xE4, 0x6A, 0xF0, 0x51, 0x28, 0x5B, 0x0F, 0xFE, 0xF1, 0x5B, 0x0F, + 0x0A, 0xE4, 0x11, 0x18, 0x4A, 0xF0, 0x4F, 0x28, 0xDA, 0xF1, 0x4E, 0x28, + 0x40, 0xBA, 0x8E, 0xF1, 0x40, 0xBA, 0x40, 0xBA, 0x5B, 0x0F, 0x0D, 0xE4, + 0x0C, 0xBC, 0x6A, 0xF1, 0x04, 0xA1, 0x8A, 0xF0, 0x06, 0xA1, 0x2A, 0xF1, + 0x0D, 0xE4, 0x65, 0x0D, 0x1E, 0xE4, 0x9A, 0xF7, 0x65, 0x0D, 0x1E, 0xE4, + 0x4E, 0xF7, 0x5B, 0x0F, 0x0D, 0xE4, 0x40, 0xBC, 0x5B, 0x0F, 0x0D, 0xE4, + 0x1A, 0xE0, 0x38, 0x28, 0xCE, 0xF6, 0x5B, 0x0F, 0x0D, 0xF3, 0x04, 0xBC, + 0x3A, 0xF0, 0x2D, 0x44, 0x31, 0x08, 0xDD, 0xF2, 0x66, 0xBE, 0x47, 0x3C, + 0x00, 0xA2, 0x4A, 0x3C, 0x66, 0xA5, 0x00, 0xA4, 0x33, 0x28, 0x4D, 0x3C, + 0x4C, 0x3C, 0x4B, 0x3C, 0x4B, 0x3C, 0x1D, 0xF2, 0x04, 0xBC, 0x0A, 0xF1, + 0xCD, 0xF1, 0x0C, 0xBE, 0xBA, 0xF0, 0x02, 0xA1, 0x0C, 0xBE, 0x4C, 0x3C, + 0x3E, 0xA8, 0x02, 0xAE, 0x4D, 0x3C, 0x3E, 0xA8, 0x02, 0xAE, 0x7D, 0xF1, + 0x09, 0xC0, 0x43, 0x2A, 0x1A, 0xF0, 0x2B, 0x28, 0x19, 0xE4, 0x00, 0xC0, + 0x58, 0x4C, 0x59, 0x24, 0x58, 0x3C, 0x59, 0x34, 0x09, 0xC0, 0x7D, 0x0F, + 0x46, 0xE0, 0x44, 0x4E, 0x52, 0x26, 0x00, 0xC0, 0x1E, 0xE4, 0x2E, 0xE4, + 0x02, 0xA2, 0x32, 0xF0, 0x51, 0x28, 0x6A, 0xE1, 0x99, 0xF0, 0x1E, 0x02, + 0x3A, 0x28, 0x51, 0xE0, 0x17, 0xE0, 0x40, 0x2A, 0x2E, 0xE4, 0x00, 0xA2, + 0x3A, 0x3C, 0x12, 0xB6, 0x3F, 0x28, 0x2A, 0xE4, 0x16, 0xE0, 0x4F, 0x28, + 0x3D, 0x28, 0x2A, 0xE4, 0x3A, 0x28, 0x2A, 0xE4, 0x48, 0xF0, 0x4E, 0x28, + 0x2A, 0xE4, 0x42, 0x18, 0x3B, 0x28, 0x2E, 0xE4, 0x16, 0xE0, 0x3B, 0x28, + 0x16, 0xE0, 0x39, 0x18, 0x3C, 0x28, 0x2A, 0xE4, 0x57, 0x7E, 0x0F, 0xC7, + 0x49, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x46, 0xE0, 0x02, 0xAE, 0x21, 0xAF, + 0x70, 0x03, 0x62, 0xE1, 0x00, 0x00, 0xF3, 0xD1, 0x61, 0xE1, 0x2E, 0xE4, + 0xE4, 0xCF, 0x12, 0x29, 0x3A, 0xF0, 0x02, 0xA1, 0x38, 0x28, 0x70, 0x03, + 0x04, 0x3C, 0x48, 0x28, 0x90, 0x03, 0x61, 0xE1, 0xE6, 0x0F, 0x1E, 0xE4, + 0xB0, 0x02, 0x62, 0xE1, 0x62, 0xE1, 0x00, 0x00, 0xF3, 0xD1, 0x2A, 0xE4, + 0x84, 0xE1, 0x22, 0x00, 0x48, 0x88, 0xB0, 0x02, 0x38, 0x28, 0xE4, 0xCF, + 0x12, 0x29, 0xA2, 0x0F, 0x04, 0x3C, 0x49, 0x28, 0x28, 0xE4, 0x04, 0xA1, + 0xD0, 0x02, 0x62, 0xE1, 0xB0, 0x03, 0x61, 0xE1, 0xF3, 0xD1, 0x2A, 0xE4, + 0xE6, 0x0F, 0x1E, 0xE4, 0x49, 0x88, 0xD0, 0x02, 0x62, 0xE1, 0x20, 0x00, + 0x12, 0x29, 0xB8, 0x0F, 0x84, 0xE1, 0x22, 0x00, 0x62, 0xE1, 0xE0, 0x10, + 0x1E, 0xE4, 0xE4, 0xCF, 0x9E, 0x10, 0x1E, 0xE4, 0x02, 0x29, 0xD0, 0x02, + 0x71, 0x3C, 0x70, 0x34, 0xC2, 0x10, 0x1E, 0xE4, 0x60, 0x02, 0x00, 0xE0, + 0x02, 0xAE, 0x02, 0x29, 0x17, 0x23, 0x17, 0x4D, 0x17, 0x21, 0x9E, 0xE0, + 0x72, 0x12, 0x73, 0x1C, 0x72, 0x10, 0x17, 0x4F, 0x46, 0xE0, 0x11, 0xE0, + 0x10, 0xE0, 0x73, 0x1E, 0x02, 0x29, 0x7A, 0x3C, 0x08, 0xB6, 0x24, 0xB6, + 0x28, 0xB6, 0x02, 0xA1, 0x97, 0x10, 0x1E, 0xE4, 0x00, 0xE0, 0x02, 0xAF, + 0x02, 0x29, 0x78, 0x3C, 0x79, 0x3C, 0x07, 0x29, 0x9E, 0xE0, 0xA0, 0x02, + 0x98, 0xE0, 0x82, 0xE0, 0x2E, 0xE4, 0x02, 0xA2, 0x22, 0x00, 0x04, 0x88, + 0x98, 0xF0, 0x40, 0xBA, 0x12, 0x3D, 0x11, 0x29, 0xEF, 0x0F, 0x84, 0xE1, + 0x82, 0xE0, 0x6D, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x3F, 0x58, 0x15, 0x4C, + 0x14, 0x20, 0x08, 0x3C, 0x3F, 0x58, 0x39, 0x2C, 0x01, 0x3C, 0x00, 0x34, + 0x04, 0x28, 0x03, 0x3C, 0x02, 0x34, 0x3F, 0x08, 0x00, 0xA2, 0x00, 0x06, + 0x63, 0xE1, 0x05, 0x3C, 0x0D, 0xE4, 0x06, 0xBC, 0x13, 0x3D, 0x1F, 0xC7, + 0x3A, 0xF1, 0x02, 0xA1, 0x6A, 0xF0, 0x51, 0x10, 0x1E, 0xE4, 0x1E, 0xF3, + 0xBA, 0xF1, 0x02, 0xA1, 0x02, 0xA0, 0x51, 0x10, 0x0D, 0xE4, 0x65, 0x0D, + 0x32, 0xF0, 0x12, 0xE0, 0x03, 0x1C, 0x02, 0x10, 0x03, 0x3C, 0x02, 0x34, + 0x01, 0x0C, 0x00, 0x00, 0x65, 0x0D, 0x1E, 0xE4, 0xDE, 0xF0, 0x03, 0xA2, + 0x02, 0x00, 0x02, 0xA0, 0x51, 0x10, 0x0D, 0xE4, 0x0E, 0xF7, 0x01, 0x1C, + 0x00, 0x10, 0x03, 0x0C, 0x1E, 0xE4, 0x0F, 0x3C, 0xFF, 0xA2, 0x40, 0xBC, + 0x3F, 0x28, 0x03, 0xA2, 0x82, 0xF0, 0x66, 0x10, 0x04, 0x29, 0x03, 0xA8, + 0x0F, 0x2A, 0x3A, 0xF0, 0x81, 0x10, 0x1E, 0xE4, 0x12, 0x3D, 0x46, 0xE0, + 0x04, 0xA0, 0x05, 0x3C, 0x02, 0xA1, 0x05, 0x28, 0x08, 0x28, 0x06, 0x10, + 0x0E, 0xE4, 0x2A, 0xE4, 0x00, 0x06, 0x63, 0xE1, 0x92, 0xE0, 0x02, 0xA1, + 0x11, 0x81, 0x13, 0x29, 0xA4, 0xF0, 0x05, 0x28, 0x05, 0x28, 0x12, 0x3D, + 0x01, 0x29, 0xE8, 0xF7, 0x02, 0xA2, 0x6E, 0xF7, 0x05, 0x3C, 0x02, 0xA1, + 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, 0x0B, 0x02, 0xC2, 0xE0, + 0x24, 0xE4, 0x84, 0x28, 0x13, 0x21, 0x1E, 0xE4, 0x14, 0x02, 0xC2, 0xE0, + 0x16, 0x02, 0xC2, 0xE0, 0x7F, 0x28, 0x4B, 0xF0, 0x6E, 0x34, 0xC2, 0x10, + 0x1E, 0xE4, 0x84, 0x28, 0x07, 0x3E, 0x06, 0x3C, 0x2E, 0xE4, 0x6F, 0x3C, + 0x02, 0xA1, 0x19, 0x28, 0x30, 0x03, 0x63, 0xE1, 0x44, 0xCC, 0x02, 0xA0, + 0x02, 0xAE, 0x24, 0xE4, 0x0B, 0x2B, 0x13, 0x2D, 0x7E, 0x10, 0x84, 0xE1, + 0x69, 0xF0, 0x78, 0xF0, 0x07, 0x1A, 0x06, 0x1C, 0x02, 0xAF, 0x30, 0x03, + 0x02, 0xE0, 0x86, 0xE0, 0xFE, 0xA2, 0x13, 0x81, 0x13, 0x81, 0x2E, 0xE4, + 0x92, 0xE0, 0x08, 0x28, 0x09, 0x3C, 0x2E, 0xE4, 0x44, 0xCC, 0x02, 0xA1, + 0x2A, 0xE4, 0x6D, 0x28, 0x09, 0x18, 0x01, 0x29, 0x8D, 0x10, 0x84, 0xE1, + 0x82, 0xE0, 0x2E, 0xE4, 0x11, 0x81, 0x3A, 0xF0, 0x96, 0xE0, 0x00, 0x06, + 0x00, 0xE0, 0x08, 0x18, 0x02, 0xAF, 0x2E, 0xE4, 0x03, 0x3D, 0x02, 0xA2, + 0x9E, 0xE0, 0x01, 0x02, 0x00, 0xE0, 0x04, 0xAE, 0x04, 0xAE, 0x02, 0xAF, + 0x2E, 0xE4, 0x07, 0x29, 0x07, 0x29, 0x9E, 0xE0, 0x03, 0x02, 0x00, 0xE0, + 0x42, 0x00, 0xC0, 0xE0, 0x0A, 0x3C, 0x2E, 0xE4, 0x07, 0xA2, 0x0A, 0x08, + 0x80, 0x01, 0x00, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, + 0x0A, 0x0A, 0x0F, 0xAE, 0x6E, 0x00, 0x05, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, + 0x05, 0xA2, 0x42, 0xE0, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x2E, 0xE4, + 0x28, 0xCA, 0x27, 0xCE, 0x20, 0x00, 0x12, 0xD1, 0x02, 0xAF, 0x0A, 0x3C, + 0x2E, 0xE4, 0xF8, 0xF7, 0x42, 0xE0, 0x41, 0x00, 0xC1, 0xE0, 0x06, 0xAE, + 0x42, 0xE0, 0x0F, 0xAE, 0x6E, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x06, + 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x04, 0x00, + 0x9E, 0xE0, 0x00, 0x06, 0x04, 0xE0, 0xF8, 0xF7, 0x03, 0xA8, 0x0A, 0x2A, + 0x17, 0x4D, 0x17, 0x21, 0x2E, 0xE4, 0x17, 0x4D, 0x17, 0x21, 0x2B, 0xE4, + 0x1F, 0xC7, 0x3E, 0xA2, 0x00, 0x06, 0x61, 0xE1, 0xB0, 0x02, 0x00, 0xE0, + 0x48, 0x28, 0x11, 0x3D, 0x22, 0x00, 0x48, 0x88, 0x48, 0x2A, 0x94, 0xE0, + 0x00, 0xE0, 0x0A, 0x29, 0xF3, 0x10, 0x84, 0xE1, 0x03, 0xA1, 0x01, 0x3F, + 0x92, 0xE0, 0x00, 0x06, 0x00, 0x06, 0x62, 0xE1, 0x00, 0x00, 0xF9, 0xD1, + 0xFD, 0x10, 0x84, 0xE1, 0x1F, 0x00, 0x22, 0xD0, 0x1E, 0xE4, 0x2E, 0xE4, + 0xF0, 0xCF, 0x12, 0x29, 0x00, 0x00, 0xF3, 0xD1, 0x2E, 0xE4, 0xE0, 0x10, + 0x3F, 0x00, 0x22, 0xD0, 0xB0, 0x02, 0x67, 0xE1, 0xE4, 0xCF, 0x17, 0x29, + 0x0B, 0x11, 0x84, 0xE1, 0x00, 0x06, 0x67, 0xE1, 0x00, 0x00, 0xF9, 0xD1, + 0x15, 0x11, 0x84, 0xE1, 0x1F, 0x00, 0x22, 0xD0, 0x4E, 0xBA, 0x2E, 0xE4, + 0xF0, 0xCF, 0x17, 0x29, 0x00, 0xC0, 0x5F, 0x2A, 0x01, 0xC0, 0x11, 0x3C, + 0x00, 0xA2, 0x0D, 0x02, 0x1E, 0xE4, 0x39, 0xF0, 0x84, 0xE1, 0x07, 0x00, + 0x22, 0xD0, 0x24, 0x3C, 0x56, 0xE0, 0x24, 0x5A, 0x41, 0xBA, 0x2A, 0x11, + 0x24, 0x3C, 0x24, 0x3E, 0x03, 0xA0, 0x24, 0x2A, 0x0C, 0xAF, 0x24, 0x28, + 0xF0, 0x3C, 0x08, 0xA2, 0xF0, 0x3C, 0x24, 0xA2, 0x34, 0x12, 0x08, 0xE4, + 0x16, 0xA1, 0x0A, 0xF1, 0x84, 0xA1, 0x11, 0x28, 0x14, 0xA1, 0xCA, 0xF0, + 0x2E, 0xA1, 0xEA, 0xF0, 0x0A, 0xE4, 0x18, 0xA1, 0x36, 0x12, 0x0A, 0xE4, + 0x03, 0x00, 0x08, 0xE0, 0x24, 0x28, 0x36, 0x12, 0xF0, 0x3C, 0x26, 0xA2, + 0x36, 0x12, 0x0A, 0xE4, 0x10, 0x3C, 0x3E, 0xBC, 0x1F, 0x3C, 0x4E, 0xBA, + 0x67, 0x3C, 0x00, 0xA2, 0x22, 0x3C, 0x02, 0xA2, 0x06, 0xBC, 0x28, 0xF3, + 0xC8, 0xA1, 0x11, 0x28, 0x08, 0xBC, 0xF0, 0x3C, 0x0A, 0xA2, 0x22, 0x3C, + 0xF0, 0x3C, 0x0C, 0xA2, 0x34, 0x12, 0x08, 0xE4, 0x40, 0xBA, 0x34, 0x12, + 0x08, 0xE4, 0x08, 0xBC, 0x01, 0xA2, 0x2A, 0xF2, 0x67, 0x3C, 0x40, 0xBA, + 0x40, 0xBA, 0x00, 0xC4, 0x6B, 0x3E, 0x69, 0x3E, 0x56, 0xE0, 0x03, 0xAE, + 0x69, 0x2A, 0x1A, 0xF1, 0x0A, 0x14, 0x1E, 0xE4, 0x80, 0xE0, 0x69, 0x3C, + 0x6B, 0x3C, 0x56, 0xE0, 0x03, 0xAE, 0x6B, 0x2A, 0x3D, 0x14, 0x1E, 0xE4, + 0x01, 0xA2, 0x80, 0xE0, 0x69, 0x3E, 0x03, 0xAE, 0x69, 0x2A, 0x7E, 0xF0, + 0x80, 0xE0, 0x6B, 0x3E, 0x03, 0xAE, 0x6B, 0x2A, 0x48, 0xF6, 0x10, 0xA1, + 0x90, 0xE0, 0x02, 0xA0, 0x0D, 0xE4, 0x18, 0xBC, 0xF0, 0x3C, 0x0E, 0xA2, + 0x02, 0xA2, 0x13, 0x3C, 0x08, 0xA0, 0x34, 0x12, 0x10, 0xA2, 0x15, 0x3C, + 0x14, 0x34, 0x13, 0x58, 0x0D, 0xE4, 0x16, 0x3C, 0x04, 0xBC, 0xF0, 0x3C, + 0xAA, 0xF0, 0x34, 0xF0, 0x02, 0xA1, 0x34, 0x12, 0x18, 0xBC, 0xF0, 0x3C, + 0x12, 0xA2, 0x3E, 0xF3, 0x17, 0x3C, 0x08, 0xA0, 0x34, 0x12, 0x0D, 0xE4, + 0x1E, 0xE4, 0x18, 0x3C, 0x40, 0xBA, 0xBE, 0xF2, 0x61, 0xE1, 0x07, 0x09, + 0x60, 0xE1, 0x81, 0x0D, 0x1E, 0xE4, 0x01, 0x3D, 0x00, 0x35, 0x08, 0x09, + 0x63, 0xE1, 0x09, 0x09, 0x62, 0xE1, 0x81, 0x0D, 0x14, 0xA2, 0x03, 0x3D, + 0x02, 0x35, 0x0A, 0x09, 0x34, 0x12, 0x0D, 0xE4, 0xFE, 0xBD, 0xF0, 0x3C, + 0x0A, 0xF1, 0x04, 0x3D, 0x0B, 0x09, 0x64, 0xE1, 0xE0, 0x09, 0x62, 0xE1, + 0x44, 0xCC, 0x02, 0xA1, 0x81, 0x0D, 0x1E, 0xE4, 0xC5, 0x11, 0x84, 0xE1, + 0xF0, 0x3C, 0x16, 0xA2, 0x12, 0x3D, 0x12, 0x35, 0x0D, 0xE4, 0x1E, 0xF0, + 0x30, 0x13, 0x1E, 0xE4, 0x20, 0xBC, 0xF0, 0x3C, 0x18, 0xA2, 0x34, 0x12, + 0x40, 0xBA, 0x19, 0x3C, 0x34, 0x12, 0x0D, 0xE4, 0xFE, 0xBD, 0xF0, 0x3C, + 0x1A, 0xA2, 0x1A, 0x3C, 0x57, 0x3C, 0x02, 0xA0, 0x34, 0x12, 0x0D, 0xE4, + 0x0D, 0xE4, 0xFE, 0xBD, 0xF0, 0x3C, 0x1C, 0xA2, 0x57, 0x84, 0x58, 0x3C, + 0x02, 0xA0, 0x34, 0x12, 0x09, 0xC0, 0x3F, 0x02, 0x1E, 0xE4, 0x58, 0x28, + 0x00, 0xA2, 0x00, 0xC0, 0x56, 0x3C, 0x57, 0x34, 0xD8, 0xF0, 0x1B, 0x3C, + 0x40, 0xBA, 0x1C, 0x3C, 0x02, 0xAE, 0x58, 0x28, 0x1C, 0x3C, 0x40, 0xBA, + 0x56, 0x4C, 0x57, 0x24, 0x09, 0xC0, 0x58, 0x3C, 0x00, 0xC0, 0x56, 0x3C, + 0x57, 0x34, 0x02, 0xAE, 0xF0, 0x3C, 0x1E, 0xA2, 0xFB, 0x12, 0x1E, 0xE4, + 0x1D, 0x3C, 0x36, 0xB6, 0x40, 0xBA, 0x1B, 0x2A, 0x61, 0xE1, 0x40, 0xBA, + 0xF0, 0x3C, 0x20, 0xA2, 0x6A, 0xF1, 0x11, 0x3D, 0x03, 0xC7, 0xE4, 0x05, + 0x65, 0x0D, 0x1E, 0xE4, 0xE4, 0x05, 0x61, 0xE1, 0x11, 0x3D, 0x65, 0x0D, + 0x1E, 0xE4, 0x11, 0x3D, 0x29, 0xF0, 0x1B, 0x2A, 0x65, 0x0D, 0x1E, 0xE4, + 0x65, 0x0D, 0x1E, 0xE4, 0x11, 0x3D, 0x02, 0xAE, 0x11, 0x3D, 0x02, 0xAE, + 0x29, 0xF0, 0x1B, 0x2A, 0x91, 0x3C, 0x90, 0x3C, 0x00, 0xA2, 0x4D, 0xF1, + 0x1E, 0xE4, 0xEB, 0x3C, 0xEA, 0x3C, 0x20, 0x28, 0x40, 0xBA, 0x4C, 0x15, + 0x1E, 0xE4, 0x42, 0x15, 0x5A, 0xF0, 0x40, 0x13, 0x1A, 0xE4, 0x16, 0xE0, + 0x2E, 0xE4, 0x6A, 0xE1, 0x9D, 0x0D, 0x1E, 0xE4, 0x40, 0xA9, 0xAE, 0x28, + 0x2E, 0xE4, 0x6B, 0xE1, 0x1E, 0xE4, 0x2E, 0xE4, 0x6B, 0xE1, 0xAE, 0x3C, + 0x0D, 0xE4, 0x3E, 0xBC, 0x29, 0x3C, 0x65, 0x0D, 0x10, 0x08, 0xFA, 0xF0, + 0x10, 0x18, 0xEE, 0x12, 0x0D, 0xE4, 0xA5, 0x1B, 0x1E, 0xE4, 0x10, 0x3C, + 0x9E, 0xCC, 0x22, 0xAE, 0x04, 0xA2, 0xEE, 0x12, 0x02, 0xA2, 0x19, 0x0D, + 0x1E, 0xE4, 0x02, 0xA2, 0x40, 0xBA, 0x2D, 0x3C, 0x40, 0xBA, 0x9B, 0x3C, + 0xEE, 0x12, 0x0D, 0xE4, 0x0E, 0xBC, 0x2A, 0x3C, 0xEE, 0x12, 0x0D, 0xE4, + 0x3A, 0xF0, 0x2B, 0x3C, 0x52, 0xE0, 0x1B, 0xE0, 0x2B, 0x2A, 0x2D, 0x28, + 0x0D, 0xE4, 0x3E, 0xBC, 0xEE, 0x12, 0x08, 0xE4, 0x2E, 0x3C, 0x3E, 0xBC, + 0x2C, 0x3C, 0xEE, 0x12, 0x2F, 0x3C, 0x40, 0xBA, 0xEE, 0x12, 0x0D, 0xE4, + 0x0B, 0xE4, 0x07, 0xA1, 0x30, 0x3E, 0x43, 0xBA, 0x79, 0xF1, 0x1E, 0x02, + 0x1E, 0xE4, 0xEE, 0x12, 0x2F, 0x28, 0xD8, 0xF0, 0x84, 0xA1, 0x11, 0x28, + 0x38, 0xF0, 0x2D, 0x28, 0x58, 0xF0, 0x30, 0x4C, 0x4D, 0x00, 0x04, 0xE0, + 0xD8, 0xF0, 0x1B, 0x28, 0x2B, 0x28, 0xCE, 0xF0, 0x0D, 0x02, 0x1E, 0xE4, + 0x1E, 0xE4, 0x42, 0x00, 0x04, 0xE0, 0x6A, 0xF0, 0x1E, 0xE4, 0x00, 0xA2, + 0x5E, 0xF0, 0x0D, 0x02, 0x1E, 0xE4, 0x02, 0xA2, 0x4E, 0xF0, 0x16, 0x02, + 0xEE, 0x12, 0x0D, 0xE4, 0x34, 0xBE, 0x16, 0x02, 0xEE, 0x12, 0x04, 0xE4, + 0x31, 0x3C, 0x34, 0xA0, 0x34, 0xBE, 0xEE, 0x12, 0x02, 0xE4, 0x68, 0xA1, + 0x04, 0xE4, 0x34, 0xA0, 0xEE, 0x12, 0x0D, 0xE4, 0xEE, 0x12, 0x02, 0xE4, + 0x68, 0xA1, 0xEE, 0x12, 0x32, 0x3C, 0xEE, 0x12, 0x0D, 0xE4, 0x18, 0xBE, + 0x40, 0xBA, 0x33, 0x3C, 0x40, 0xBA, 0x36, 0x3C, 0x00, 0xA2, 0x35, 0x3C, + 0x40, 0xBA, 0x34, 0x3C, 0x84, 0xA1, 0x11, 0x28, 0x68, 0x3C, 0x37, 0x3C, + 0x1E, 0xE4, 0x02, 0x3C, 0x29, 0x28, 0x6A, 0xF3, 0xFA, 0xF2, 0xB0, 0x0C, + 0x1E, 0xE4, 0xAA, 0x1C, 0x68, 0x3C, 0x40, 0xBA, 0x37, 0x3C, 0x40, 0xBA, + 0x6C, 0x3E, 0x6A, 0x3E, 0x01, 0xA2, 0x7A, 0xF2, 0x37, 0x18, 0x0C, 0xA1, + 0x80, 0xE0, 0x00, 0xC4, 0x1A, 0xF1, 0x40, 0xBA, 0x32, 0xF1, 0x37, 0x18, + 0x6A, 0x3C, 0x56, 0xE0, 0x03, 0xAE, 0x6A, 0x2A, 0x6C, 0x2A, 0x0A, 0x14, + 0x1E, 0xE4, 0x80, 0xE0, 0x80, 0xE0, 0x6C, 0x3C, 0x56, 0xE0, 0x03, 0xAE, + 0x7E, 0xF0, 0x3D, 0x14, 0x1E, 0xE4, 0x03, 0xA2, 0x6C, 0x2A, 0x6A, 0x3E, + 0x03, 0xAE, 0x6A, 0x2A, 0x02, 0xA0, 0x80, 0xE0, 0x6C, 0x3E, 0x03, 0xAE, + 0x18, 0xBE, 0xF8, 0xF5, 0x10, 0xA1, 0x90, 0xE0, 0x9D, 0x0D, 0x1E, 0xE4, + 0x36, 0x3C, 0x6D, 0xF0, 0x59, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x02, 0xA2, + 0xAE, 0x28, 0x03, 0xA2, 0x79, 0xF0, 0x07, 0xA1, 0xAE, 0x3E, 0xAE, 0x4E, + 0x11, 0xB6, 0x40, 0xA8, 0x61, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, + 0x22, 0xD0, 0xD8, 0x08, 0x62, 0xE1, 0xC8, 0x08, 0x09, 0xC0, 0x0A, 0x13, + 0x84, 0xE1, 0x0E, 0x00, 0x12, 0x29, 0x00, 0xC0, 0x56, 0x4E, 0x57, 0x26, + 0x1F, 0x2A, 0x17, 0xF0, 0x11, 0x29, 0x45, 0xE0, 0x61, 0xE1, 0x1F, 0x3C, + 0x23, 0xF0, 0x45, 0xE0, 0x22, 0xD0, 0xC8, 0x08, 0x62, 0xE1, 0xE8, 0x08, + 0x11, 0x29, 0x1A, 0x13, 0x84, 0xE1, 0x0E, 0x00, 0x04, 0xAE, 0x17, 0xF0, + 0x12, 0x1F, 0x1F, 0x2E, 0x57, 0x22, 0x09, 0xC0, 0x0A, 0x3C, 0x09, 0x34, + 0x22, 0xD0, 0x01, 0xC4, 0x00, 0xC0, 0x56, 0x4E, 0x46, 0xE0, 0x29, 0x13, + 0x84, 0xE1, 0x0F, 0x00, 0x19, 0x2A, 0x82, 0xE0, 0x11, 0x81, 0x24, 0xF0, + 0x2E, 0xE4, 0x20, 0x3C, 0x20, 0xA5, 0x62, 0xE0, 0x26, 0x00, 0x05, 0xE0, + 0x41, 0x00, 0xC0, 0xE0, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0xE0, 0x11, 0xAE, + 0x13, 0xD1, 0x00, 0x02, 0x12, 0xD1, 0xE0, 0x09, 0x2E, 0xE4, 0xF8, 0xF7, + 0x28, 0xCA, 0x02, 0x00, 0x0E, 0xC7, 0x00, 0x00, 0x66, 0xE1, 0x00, 0xA2, + 0x0D, 0x3C, 0x0E, 0x3C, 0x04, 0xA2, 0x16, 0x3D, 0x40, 0xBA, 0x09, 0x3C, + 0x0A, 0xA2, 0x05, 0x3C, 0x0A, 0xF1, 0x26, 0x3E, 0x25, 0x3E, 0xFF, 0xA2, + 0x26, 0x3C, 0x25, 0x3E, 0x01, 0xA2, 0x4E, 0xBA, 0x02, 0xA2, 0x98, 0xF0, + 0xFF, 0x00, 0x02, 0xE0, 0x16, 0xB6, 0x5F, 0xBA, 0x5E, 0xBA, 0x07, 0x3C, + 0x40, 0xBA, 0x26, 0x3E, 0x25, 0x3C, 0x15, 0xB6, 0x0C, 0x3C, 0x40, 0xBA, + 0x3A, 0xF0, 0x0B, 0x3C, 0x44, 0xBA, 0xEA, 0xF0, 0x0A, 0x3C, 0x40, 0xBA, + 0x40, 0xBA, 0x08, 0x3C, 0x40, 0xBA, 0x09, 0x3C, 0x05, 0x3C, 0x4E, 0xBA, + 0x7A, 0xF0, 0x06, 0x3C, 0x0E, 0x3C, 0x4E, 0xBA, 0x0D, 0x3C, 0x4E, 0xBA, + 0x0A, 0xBC, 0x5A, 0xF0, 0x04, 0x3C, 0x40, 0xBA, 0x40, 0xBA, 0x02, 0x3C, + 0x0A, 0xBC, 0x03, 0x3C, 0x61, 0xE1, 0x7E, 0xBA, 0xBA, 0xF0, 0x01, 0x3C, + 0x7E, 0xBA, 0x11, 0x3D, 0x11, 0x35, 0xC7, 0x05, 0x00, 0x3C, 0x40, 0xBA, + 0x11, 0x3D, 0x11, 0x35, 0x61, 0xE1, 0x16, 0xE0, 0x90, 0x3C, 0x40, 0xBA, + 0x0A, 0xE4, 0xF0, 0x13, 0x1A, 0xE4, 0xBD, 0x05, 0x16, 0xE0, 0x91, 0x3C, + 0x40, 0xBA, 0xED, 0x13, 0xF0, 0x13, 0x1A, 0xE4, 0xC2, 0x05, 0x61, 0xE1, + 0x91, 0x4C, 0x90, 0x28, 0xED, 0x13, 0x0A, 0xE4, 0x23, 0x3C, 0x40, 0xBA, + 0x40, 0xBA, 0x2A, 0xF0, 0x20, 0xBC, 0x40, 0xBA, 0xAA, 0xF0, 0x40, 0xBA, + 0x20, 0xBC, 0x20, 0xBC, 0x20, 0xBC, 0x20, 0xBC, 0xEB, 0x28, 0xEB, 0x3C, + 0x20, 0xBC, 0xEA, 0x3C, 0x5A, 0xF0, 0xEB, 0x28, 0x70, 0xF0, 0x20, 0xA1, + 0x5E, 0xF0, 0x20, 0xF0, 0xEB, 0x18, 0x19, 0x28, 0xEB, 0x3E, 0x20, 0x2A, + 0x29, 0xF0, 0xB3, 0x2A, 0x3D, 0xAE, 0x0A, 0x2A, 0x3E, 0xAE, 0x02, 0xA2, + 0x56, 0xE0, 0x37, 0xAE, 0x09, 0x2A, 0x56, 0xE0, 0x07, 0x2A, 0x56, 0xE0, + 0x35, 0xAE, 0x08, 0x2A, 0x31, 0xAE, 0x06, 0x2A, 0x56, 0xE0, 0x33, 0xAE, + 0x56, 0xE0, 0x21, 0xAE, 0x05, 0x2A, 0x56, 0xE0, 0x0C, 0x2A, 0x56, 0xE0, + 0x15, 0xAE, 0x0B, 0x2A, 0x11, 0xAE, 0x04, 0x2A, 0x56, 0xE0, 0x13, 0xAE, + 0x56, 0xE0, 0x0B, 0xAE, 0x03, 0x2A, 0x56, 0xE0, 0x01, 0x2A, 0x56, 0xE0, + 0x05, 0xAE, 0x02, 0x2A, 0x56, 0xE0, 0x00, 0x2A, 0x56, 0xE0, 0x03, 0xAE, + 0x0D, 0x2A, 0x00, 0xA2, 0x42, 0x15, 0x1E, 0xE4, 0x56, 0xE0, 0x0E, 0x2A, + 0x56, 0xE0, 0x11, 0xAE, 0x02, 0xA2, 0x6A, 0xE1, 0x4C, 0x15, 0x1E, 0xE4, + 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, 0x61, 0x3C, 0x44, 0xCC, + 0x65, 0x0D, 0x1E, 0xE4, 0x46, 0xBA, 0x46, 0xBA, 0x11, 0x3D, 0x02, 0xA0, + 0x65, 0x0D, 0x1E, 0xE4, 0xFE, 0x13, 0x84, 0xE1, 0x22, 0xD0, 0x40, 0xBA, + 0x65, 0x0D, 0x1E, 0xE4, 0x48, 0xBA, 0x05, 0x14, 0x84, 0xE1, 0x02, 0x00, + 0x11, 0x3D, 0x48, 0xBA, 0x11, 0x3D, 0x02, 0xA0, 0x0F, 0x00, 0x22, 0xD0, + 0x2E, 0xE4, 0x02, 0xA2, 0x3F, 0x00, 0x22, 0xD0, 0x34, 0xF0, 0x0C, 0xA1, + 0x06, 0x3C, 0x10, 0xA2, 0x00, 0x06, 0x61, 0xE1, 0x09, 0x3C, 0x08, 0x3C, + 0x00, 0xA2, 0x07, 0x3C, 0x3A, 0x14, 0x84, 0xE1, 0x9E, 0xE0, 0x9C, 0xE0, + 0x81, 0x0D, 0x1E, 0xE4, 0x0A, 0xF1, 0x07, 0x28, 0x00, 0x01, 0x00, 0xE0, + 0x06, 0x08, 0x2D, 0xE4, 0x09, 0x4C, 0x07, 0x3C, 0xFF, 0x00, 0x08, 0xE0, + 0x02, 0xA2, 0x9E, 0xE0, 0x16, 0xE0, 0x1A, 0xE0, 0x06, 0x28, 0x28, 0xF0, + 0x07, 0x28, 0x09, 0x3C, 0x9D, 0xE0, 0x03, 0xA0, 0x8D, 0xE0, 0x06, 0x3C, + 0x11, 0xAE, 0x85, 0xE0, 0x59, 0xF0, 0x03, 0xA8, 0x8E, 0xE0, 0x94, 0xE0, + 0x11, 0x3D, 0x56, 0xE0, 0x11, 0xA2, 0x06, 0x3C, 0x08, 0x3E, 0x2E, 0xE4, + 0x90, 0xB6, 0x64, 0xF0, 0x0C, 0xA1, 0x07, 0x3E, 0x07, 0x3C, 0x40, 0xA2, + 0x06, 0x3C, 0x0C, 0xA0, 0x1C, 0xA0, 0x2B, 0xF0, 0x08, 0x2A, 0x06, 0x28, + 0x41, 0x00, 0xC0, 0xE0, 0x06, 0x3C, 0x08, 0xAE, 0x42, 0xE0, 0x11, 0xAE, + 0x35, 0x00, 0x05, 0xE0, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x06, 0x08, + 0x02, 0x00, 0x13, 0xD1, 0x24, 0xCE, 0x07, 0x28, 0x02, 0xA2, 0x2E, 0xE4, + 0xF8, 0xF7, 0x28, 0xCA, 0x47, 0x0C, 0x1E, 0xE4, 0x9E, 0xE0, 0x51, 0x3C, + 0x77, 0x0C, 0x1E, 0xE4, 0xCD, 0x14, 0x08, 0xE4, 0xDC, 0x14, 0x0A, 0xE4, + 0x02, 0xA1, 0x8A, 0xF2, 0x0A, 0xE4, 0x90, 0x14, 0x04, 0xE4, 0x08, 0xA1, + 0xAD, 0x14, 0x0A, 0xE4, 0x02, 0xA1, 0xDC, 0x14, 0x02, 0xA1, 0x93, 0x14, + 0x0A, 0xE4, 0x02, 0xA1, 0x0A, 0xE4, 0x02, 0xA1, 0xA2, 0x14, 0x0A, 0xE4, + 0xC6, 0x14, 0x0A, 0xE4, 0x02, 0xA1, 0xB8, 0x14, 0x02, 0xA1, 0xC6, 0x14, + 0x0A, 0xE4, 0x02, 0xA1, 0x05, 0xA1, 0x49, 0xE0, 0xD2, 0x14, 0x0A, 0xE4, + 0x1E, 0xE4, 0x62, 0xF0, 0x8B, 0x14, 0x0B, 0xE4, 0xD7, 0x14, 0x0E, 0xE4, + 0x5A, 0xF5, 0x82, 0x0A, 0x8E, 0xE0, 0x0E, 0xF5, 0x4A, 0x0A, 0x1E, 0xE4, + 0x33, 0x15, 0x1E, 0xE4, 0x3A, 0x15, 0x18, 0xE4, 0x82, 0x0A, 0x1E, 0xE4, + 0x9E, 0xE0, 0x00, 0xA2, 0x93, 0x1B, 0x1E, 0xE4, 0x62, 0x14, 0x0A, 0xE4, + 0x9E, 0xE0, 0x02, 0xA2, 0xD7, 0x14, 0x0E, 0xE4, 0x82, 0x0A, 0x1E, 0xE4, + 0x33, 0x15, 0x1E, 0xE4, 0xBE, 0x1B, 0x1E, 0xE4, 0x62, 0x14, 0x0A, 0xE4, + 0x1E, 0xE4, 0x9E, 0xE0, 0x02, 0xA2, 0xBE, 0xF2, 0x0A, 0xE4, 0x82, 0x0A, + 0x1E, 0xE4, 0x33, 0x15, 0x0E, 0xF2, 0x67, 0x15, 0x1E, 0xE4, 0x62, 0x14, + 0x3A, 0x15, 0x1E, 0xE4, 0x9E, 0xE0, 0x00, 0xA2, 0x82, 0x0A, 0x1E, 0xE4, + 0x33, 0x15, 0x1E, 0xE4, 0x1E, 0xE4, 0x44, 0xBA, 0x62, 0x14, 0x0A, 0xE4, + 0x47, 0x0C, 0x1E, 0xE4, 0x2E, 0xF1, 0x9D, 0x0D, 0x52, 0x0A, 0x1E, 0xE4, + 0x04, 0xA2, 0x58, 0xF0, 0xF5, 0x14, 0x08, 0xE4, 0x51, 0x28, 0xBE, 0xF0, + 0x1E, 0xE4, 0x04, 0xA2, 0xEE, 0x14, 0x0E, 0xE4, 0x51, 0x28, 0x62, 0x14, + 0x0E, 0xE4, 0x52, 0x0A, 0x62, 0x14, 0x0E, 0xE4, 0xEE, 0x14, 0x0A, 0xE4, + 0x82, 0x0A, 0x1E, 0xE4, 0x33, 0x15, 0x1E, 0xE4, 0x51, 0x0E, 0x1E, 0xE4, + 0x62, 0x14, 0x0A, 0xE4, 0xF9, 0x14, 0x09, 0xE4, 0x1E, 0x02, 0x1E, 0xE4, + 0x92, 0x3C, 0x4E, 0x28, 0x62, 0x14, 0x0A, 0xE4, 0x51, 0x3C, 0x00, 0xA2, + 0x93, 0x3C, 0x4F, 0x28, 0x02, 0xA2, 0xA8, 0xF0, 0x16, 0x15, 0x1E, 0xE4, + 0xFE, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x2E, 0xE4, 0x55, 0x07, + 0x1E, 0xE4, 0x2E, 0xE4, 0xE0, 0x1A, 0x1E, 0xE4, 0x01, 0x15, 0x1E, 0xE4, + 0x57, 0x28, 0xE8, 0x05, 0x65, 0xE1, 0x3E, 0xF7, 0x21, 0x28, 0x15, 0x3D, + 0x58, 0x28, 0x15, 0x3D, 0x17, 0xE0, 0x05, 0xA1, 0x16, 0x2A, 0x16, 0xE0, + 0xEB, 0x28, 0x29, 0xF0, 0x19, 0x28, 0x55, 0xE0, 0x11, 0x28, 0x15, 0x3D, + 0x1B, 0x28, 0x15, 0x3D, 0xE8, 0x05, 0x65, 0xE1, 0x2E, 0xE4, 0x15, 0x3D, + 0x58, 0x28, 0x68, 0xF1, 0x15, 0x19, 0x57, 0x28, 0x16, 0xE0, 0x21, 0x28, + 0x38, 0xF1, 0x15, 0x19, 0x55, 0xE0, 0x17, 0xE0, 0x05, 0xA1, 0x16, 0x2A, + 0x15, 0x19, 0xEB, 0x28, 0x29, 0xF0, 0x19, 0x28, 0x58, 0xF0, 0x15, 0x19, + 0x1B, 0x28, 0x88, 0xF0, 0x2E, 0xE4, 0x28, 0xF0, 0x15, 0x19, 0x11, 0x28, + 0xAD, 0x28, 0x2E, 0xE4, 0xBD, 0x3C, 0x02, 0xA2, 0x02, 0xA2, 0x34, 0x07, + 0x1E, 0xE4, 0x28, 0xE4, 0xAD, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xAD, 0x3C, + 0x3A, 0x4C, 0x39, 0x20, 0x09, 0xC0, 0x2E, 0xE4, 0x39, 0x34, 0x09, 0xC0, + 0x2E, 0xE4, 0x00, 0xC0, 0x09, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x3A, 0x3C, + 0x2E, 0xE4, 0x00, 0xC0, 0x55, 0x4C, 0x54, 0x20, 0x00, 0xC0, 0x55, 0x3C, + 0x54, 0x34, 0x09, 0xC0, 0x57, 0x2C, 0xF0, 0x3C, 0x22, 0xA2, 0x2E, 0xE4, + 0x65, 0x15, 0x00, 0xE4, 0x00, 0x01, 0x02, 0xE0, 0x00, 0xE4, 0x00, 0x01, + 0x02, 0xE0, 0x58, 0x2C, 0x00, 0xC0, 0x57, 0x2C, 0x09, 0xC0, 0x65, 0x15, + 0x02, 0xA2, 0x65, 0x15, 0x00, 0xE4, 0x02, 0xA1, 0x00, 0xA2, 0x2E, 0xE4, + 0x00, 0xA2, 0x2E, 0xE4, 0xFF, 0x00, 0x03, 0xE0, 0x42, 0xE0, 0x4F, 0xBA, + 0x00, 0xA2, 0x00, 0x18, 0x1E, 0xE4, 0xCB, 0xF7, 0xFF, 0x00, 0x03, 0xE0, + 0x42, 0xE0, 0x4F, 0xBA, 0x4A, 0xF0, 0x06, 0x18, 0x1E, 0xE4, 0xCB, 0xF7, + 0x1E, 0xE4, 0x2A, 0xE4, 0x81, 0x15, 0x1E, 0xE4, 0x9D, 0x0D, 0x1E, 0xE4, + 0xA8, 0xF6, 0xA4, 0x0C, 0x8A, 0xF1, 0x03, 0x18, 0x1E, 0xE4, 0x2E, 0xE4, + 0xAA, 0xF1, 0x04, 0xA1, 0x9A, 0xF1, 0x02, 0xA1, 0xCA, 0xF1, 0x02, 0xA1, + 0xBA, 0xF1, 0x02, 0xA1, 0x40, 0xA1, 0x02, 0xA0, 0xDA, 0xF1, 0x02, 0xA1, + 0x1E, 0xE4, 0xBA, 0xF1, 0x10, 0xA1, 0x0A, 0xF2, 0x02, 0xA1, 0x4F, 0xBA, + 0x4A, 0xF0, 0x0C, 0x18, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0xE8, 0xF7, + 0xEB, 0x15, 0x1E, 0xE4, 0x6E, 0xF1, 0xBB, 0x15, 0x0E, 0xF1, 0x39, 0x16, + 0x1E, 0xE4, 0x3E, 0xF1, 0x1E, 0xE4, 0xDE, 0xF0, 0x4A, 0x16, 0x1E, 0xE4, + 0xA8, 0x16, 0x1E, 0xE4, 0xAE, 0xF0, 0xA4, 0x16, 0x4E, 0xF0, 0xB7, 0x16, + 0x1E, 0xE4, 0x7E, 0xF0, 0x2A, 0xE4, 0x1E, 0xF0, 0xB3, 0x16, 0x1E, 0xE4, + 0x28, 0xE4, 0x16, 0xE0, 0x0E, 0xA8, 0x68, 0xC8, 0x3E, 0xBC, 0x2E, 0xE4, + 0x9D, 0x0D, 0x1E, 0xE4, 0x10, 0x08, 0x2A, 0xF1, 0x10, 0x18, 0x0D, 0xF2, + 0x3E, 0xA0, 0x50, 0xF0, 0x3E, 0xA1, 0x74, 0xF0, 0x00, 0xA2, 0xA5, 0x1B, + 0x1E, 0xE4, 0x10, 0x3C, 0x9B, 0x3E, 0x01, 0xA2, 0x19, 0x0D, 0x1E, 0xE4, + 0x2A, 0xE4, 0x6A, 0xE1, 0x1A, 0xB6, 0x02, 0xA2, 0x18, 0xE4, 0xBD, 0x05, + 0x61, 0xE1, 0x90, 0x28, 0xC2, 0x05, 0x61, 0xE1, 0x91, 0x28, 0xDF, 0x15, + 0x2E, 0xE4, 0x02, 0xA2, 0xDF, 0x15, 0x18, 0xE4, 0x11, 0x29, 0x2E, 0xE4, + 0x6A, 0xE1, 0x00, 0xA2, 0xE9, 0x15, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, + 0x01, 0x29, 0x91, 0x0D, 0x1E, 0xE4, 0x01, 0x29, 0x90, 0x28, 0x2E, 0xE4, + 0x91, 0x0D, 0x1E, 0xE4, 0x61, 0xE1, 0x38, 0xF0, 0xBF, 0x05, 0x61, 0xE1, + 0x11, 0x29, 0x1A, 0xF1, 0x91, 0x4C, 0xC4, 0x05, 0x3F, 0x34, 0x09, 0xC0, + 0x91, 0x0D, 0x1E, 0xE4, 0x1E, 0xE4, 0x11, 0x29, 0x00, 0xC0, 0x40, 0x3C, + 0x42, 0x3C, 0x41, 0x34, 0x09, 0xC0, 0x91, 0x0D, 0x30, 0xA2, 0x2E, 0xF0, + 0x11, 0x29, 0x00, 0xC0, 0x28, 0xE4, 0x16, 0xE0, 0x23, 0x28, 0x02, 0x3C, + 0x04, 0xB6, 0x12, 0xA1, 0xA3, 0x3C, 0x46, 0xBA, 0x00, 0xA2, 0x49, 0xE0, + 0x12, 0xA0, 0x2A, 0xE4, 0x26, 0xB4, 0x05, 0xA1, 0x26, 0xB4, 0x07, 0xA1, + 0x84, 0xE1, 0x44, 0xCC, 0xF6, 0xB5, 0x05, 0xA1, 0xBE, 0xF1, 0x28, 0xF0, + 0x40, 0xBA, 0x36, 0x16, 0x40, 0xBA, 0x48, 0xBA, 0x40, 0xBA, 0x42, 0xBA, + 0x4E, 0xBA, 0x40, 0xBA, 0x40, 0xBA, 0x03, 0x3C, 0x4A, 0xBA, 0x4A, 0xBA, + 0x5A, 0xF0, 0x03, 0x28, 0x8A, 0xF0, 0x40, 0xBA, 0xAE, 0xF0, 0x48, 0xBA, + 0x4A, 0xBA, 0x5A, 0xF0, 0x40, 0xBA, 0x4A, 0xBA, 0x02, 0x28, 0x48, 0xBA, + 0x2A, 0xF0, 0x40, 0xBA, 0x02, 0xA2, 0x90, 0xE1, 0x91, 0x0D, 0x1E, 0xE4, + 0xDA, 0xF0, 0x0C, 0x18, 0x1E, 0xE4, 0x2E, 0xE4, 0xFF, 0x00, 0x04, 0xE0, + 0x44, 0xCC, 0x02, 0xA1, 0x52, 0xE0, 0x4F, 0xBA, 0x43, 0x16, 0x84, 0xE1, + 0x2A, 0xE4, 0x16, 0xE0, 0xFF, 0x00, 0x02, 0xE0, 0x92, 0xE0, 0x72, 0xC8, + 0x2E, 0xE4, 0x02, 0xA2, 0x28, 0xF0, 0xFF, 0x00, 0x02, 0xE0, 0x4E, 0xBA, + 0x5E, 0xBA, 0xBF, 0x3C, 0x02, 0xA2, 0x4E, 0xBA, 0xA8, 0xF2, 0x04, 0xA1, + 0x5A, 0xF1, 0x5E, 0xA1, 0x54, 0x44, 0x05, 0xE0, 0x7E, 0xBA, 0xBF, 0x3C, + 0x45, 0xE0, 0x31, 0x47, 0x0B, 0xE0, 0x21, 0xAE, 0x05, 0xE0, 0xBE, 0xF0, + 0x6E, 0xFB, 0x39, 0xF0, 0x34, 0x39, 0x0B, 0xE0, 0x21, 0xAE, 0x41, 0x47, + 0x06, 0xA1, 0x0E, 0xBA, 0x89, 0xF1, 0x45, 0xE0, 0x68, 0xCC, 0x66, 0xCC, + 0x00, 0xA2, 0x58, 0xF1, 0x80, 0xF9, 0x06, 0xAF, 0x82, 0xE0, 0x28, 0xE1, + 0x4B, 0x26, 0x09, 0xC0, 0x92, 0x16, 0x1E, 0xE4, 0x4A, 0x3E, 0x4B, 0x36, + 0x45, 0xE0, 0x4A, 0x4E, 0x02, 0xA2, 0x15, 0x17, 0x1E, 0xE4, 0x00, 0xC0, + 0x09, 0xC0, 0x92, 0x16, 0x1E, 0xE4, 0x2E, 0xE4, 0x46, 0xE0, 0x00, 0xC0, + 0x4A, 0x4E, 0x4B, 0x26, 0x02, 0xA1, 0x2E, 0xE4, 0x02, 0xA2, 0x30, 0xF8, + 0x4E, 0xBA, 0x90, 0x16, 0x84, 0xE1, 0x44, 0xCC, 0x83, 0xE0, 0x72, 0xC8, + 0x2E, 0xE4, 0x90, 0xE1, 0x40, 0xBA, 0x2E, 0xE4, 0x06, 0xAF, 0x46, 0xE0, + 0x2B, 0xE4, 0x4A, 0xBA, 0x41, 0xBA, 0x28, 0xE4, 0x09, 0xC0, 0xB0, 0x3C, + 0x46, 0xBA, 0x46, 0xBA, 0x2E, 0xE4, 0x00, 0xC0, 0x53, 0x3C, 0x02, 0xA2, + 0x2E, 0xE4, 0x02, 0xA2, 0x15, 0x17, 0x1E, 0xE4, 0x40, 0xBA, 0xC0, 0x3C, + 0x65, 0x0D, 0x1E, 0xE4, 0x42, 0xBA, 0xC2, 0x3C, 0x40, 0xBA, 0xC1, 0x3C, + 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0xC3, 0x3C, 0x1E, 0xE4, 0x2E, 0xE4, + 0x02, 0xA2, 0x15, 0x17, 0x09, 0xC0, 0x65, 0x0D, 0x1E, 0xE4, 0x0A, 0x17, + 0x2A, 0xAE, 0x40, 0xBA, 0x27, 0x3C, 0x26, 0x34, 0x08, 0xE4, 0x29, 0x3E, + 0x28, 0x36, 0x49, 0xE0, 0x55, 0xE0, 0x0C, 0xAE, 0x4C, 0xBA, 0xFE, 0x16, + 0x4A, 0xBA, 0x55, 0xE0, 0x28, 0xAE, 0x40, 0xBA, 0x55, 0xE0, 0x26, 0xAE, + 0x40, 0xBA, 0x55, 0xE0, 0x40, 0xBA, 0x55, 0xE0, 0x24, 0xAE, 0x40, 0xBA, + 0x20, 0xAE, 0x40, 0xBA, 0x55, 0xE0, 0x22, 0xAE, 0x55, 0xE0, 0x1E, 0xAE, + 0x40, 0xBA, 0x55, 0xE0, 0x28, 0x36, 0x55, 0xE0, 0x1C, 0xAE, 0x40, 0xBA, + 0x02, 0xA8, 0x28, 0xAF, 0x4A, 0xE0, 0x29, 0x3E, 0x0B, 0xA1, 0x3F, 0xA8, + 0x0D, 0xAF, 0x16, 0xE0, 0x01, 0xA2, 0xEA, 0xF0, 0x52, 0xE0, 0x1B, 0xE0, + 0x46, 0xBA, 0x55, 0xE0, 0x38, 0xAE, 0x46, 0xBA, 0x28, 0xAE, 0x46, 0xBA, + 0x55, 0xE0, 0x30, 0xAE, 0x55, 0xE0, 0x20, 0xAE, 0x46, 0xBA, 0x55, 0xE0, + 0x55, 0xE0, 0x64, 0x40, 0xC4, 0xE0, 0x4E, 0xBA, 0x29, 0x4E, 0x28, 0x22, + 0x2B, 0x3E, 0x2A, 0x36, 0x28, 0x36, 0x55, 0xE0, 0x1A, 0xAE, 0x40, 0xBA, + 0x1A, 0xB6, 0x02, 0xA2, 0x00, 0xC0, 0x29, 0x3E, 0xFE, 0xA2, 0x09, 0xC0, + 0x28, 0xE4, 0x6A, 0xE1, 0x28, 0x34, 0x00, 0xA2, 0x27, 0x3C, 0x26, 0x34, + 0x00, 0xC0, 0x2B, 0x3C, 0x2A, 0x34, 0x29, 0x3C, 0x78, 0xA8, 0x65, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x0C, 0x18, 0x1E, 0xE4, 0xBA, 0xF0, 0x40, 0xA1, + 0x21, 0x17, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x93, 0x17, 0x0E, 0xE4, + 0x90, 0xE1, 0x4E, 0xBA, 0x07, 0x29, 0xEE, 0x17, 0x1E, 0xE4, 0x01, 0xA2, + 0x20, 0xA1, 0x17, 0x3D, 0x0C, 0x3C, 0x02, 0xA0, 0x03, 0x18, 0x1E, 0xE4, + 0x07, 0x2B, 0xE0, 0xF6, 0x41, 0xE0, 0x0C, 0x18, 0x1E, 0xE4, 0x5A, 0xF0, + 0x06, 0xAE, 0x02, 0xA0, 0x61, 0x28, 0x5E, 0xF0, 0x07, 0xAE, 0x07, 0xAF, + 0x0F, 0xA0, 0x41, 0xE0, 0x01, 0xA2, 0xDB, 0xF0, 0x1F, 0xAF, 0x4A, 0xE0, + 0x17, 0x81, 0x17, 0x81, 0xEE, 0x17, 0x1E, 0xE4, 0x01, 0xA2, 0x07, 0x3D, + 0x02, 0xA2, 0x07, 0x29, 0x17, 0x3D, 0x0E, 0xF5, 0xEC, 0x17, 0x1E, 0xE4, + 0x67, 0xE1, 0xEC, 0x17, 0x1E, 0xE4, 0x01, 0xA2, 0x17, 0x3D, 0x03, 0x18, + 0x1E, 0xE4, 0x00, 0x06, 0x1E, 0xE4, 0x4A, 0xF0, 0x03, 0x18, 0x1E, 0xE4, + 0x02, 0xA0, 0x61, 0x28, 0x4E, 0xF0, 0x0C, 0x18, 0x1E, 0xE4, 0x0C, 0x2A, + 0x17, 0x3D, 0x06, 0xAE, 0x00, 0xA2, 0x0B, 0x3C, 0x00, 0xA2, 0xEC, 0x17, + 0x17, 0x3D, 0x03, 0xC7, 0x00, 0x06, 0x67, 0xE1, 0x03, 0x18, 0x1E, 0xE4, + 0x00, 0x06, 0x67, 0xE1, 0x0B, 0x3C, 0x02, 0xA0, 0x0B, 0x28, 0x9A, 0xF2, + 0xA6, 0x3C, 0x02, 0xA0, 0xA6, 0x28, 0x4F, 0xBA, 0x10, 0xAE, 0x0A, 0x28, + 0x58, 0xF0, 0x02, 0xA8, 0xA6, 0x28, 0x0A, 0x3E, 0x17, 0x3D, 0x56, 0xE0, + 0x1E, 0xE4, 0xAE, 0x17, 0x1A, 0xE4, 0x0E, 0xA8, 0xA6, 0x28, 0xB0, 0xF6, + 0x0B, 0x18, 0x0C, 0x18, 0x03, 0xA8, 0xA6, 0x2A, 0xEA, 0xF0, 0x0E, 0xA8, + 0x17, 0x3F, 0x11, 0xAE, 0x0A, 0x2A, 0x4B, 0xF0, 0x07, 0xAE, 0x07, 0xAF, + 0x0F, 0xA0, 0xA6, 0x2A, 0x0E, 0xE4, 0xAE, 0x17, 0x18, 0xE4, 0xA6, 0x3E, + 0x0B, 0x3C, 0x02, 0xA0, 0x0B, 0x28, 0xAC, 0x17, 0x17, 0x35, 0x91, 0x0D, + 0x1E, 0xE4, 0x01, 0x29, 0x91, 0x0D, 0x1E, 0xE4, 0x01, 0x29, 0x17, 0x3D, + 0x10, 0xA0, 0xA6, 0x28, 0x17, 0x3D, 0x17, 0x35, 0x61, 0x28, 0xAE, 0x17, + 0x1E, 0xE4, 0xA6, 0x3C, 0x1A, 0xF0, 0xB0, 0xF6, 0x0B, 0x18, 0x02, 0xA0, + 0xB8, 0x4C, 0xB7, 0x24, 0x2E, 0xE4, 0x02, 0xA2, 0x42, 0xF2, 0xA6, 0x18, + 0x88, 0x00, 0x00, 0xE0, 0x02, 0xA8, 0x12, 0xAF, 0x65, 0x00, 0xC0, 0xE0, + 0xEE, 0x17, 0x1E, 0xE4, 0x01, 0xA2, 0xDA, 0xF0, 0x02, 0xA2, 0x07, 0x29, + 0x17, 0x81, 0x17, 0x81, 0xEC, 0x17, 0x1E, 0xE4, 0x01, 0xA2, 0x07, 0x3D, + 0xC1, 0xE0, 0x00, 0x02, 0x04, 0xE0, 0x2E, 0xE4, 0x5D, 0x00, 0xC3, 0xE0, + 0x55, 0xE0, 0x5D, 0x00, 0x5D, 0x00, 0xC0, 0xE0, 0x00, 0xCE, 0x02, 0xA2, + 0xB8, 0xF7, 0x90, 0xE1, 0x00, 0x02, 0x08, 0xE0, 0xB5, 0x24, 0xA6, 0x3C, + 0x90, 0x00, 0x04, 0xE0, 0x20, 0xCE, 0x10, 0xA1, 0xA6, 0x08, 0xB6, 0x4C, + 0x04, 0x00, 0x12, 0xD1, 0x00, 0x06, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, + 0x00, 0x00, 0x13, 0xD1, 0x03, 0xC7, 0x00, 0x06, 0x67, 0xE1, 0x00, 0xA2, + 0x2E, 0xE4, 0x00, 0x06, 0x67, 0xE1, 0x17, 0x3D, 0x0D, 0x3C, 0x02, 0xA2, + 0x2E, 0xF0, 0x00, 0xA2, 0x42, 0xE0, 0x07, 0xAE, 0xB6, 0x4C, 0xB5, 0x24, + 0x12, 0xD1, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x13, 0x01, + 0x0D, 0x88, 0x04, 0x00, 0x2E, 0xE4, 0x00, 0x06, 0x67, 0xE1, 0xF8, 0xF7, + 0x09, 0xC0, 0xDE, 0xF0, 0x49, 0x3C, 0x09, 0xC0, 0x08, 0xE0, 0x09, 0xC0, + 0xAE, 0xF0, 0x49, 0x28, 0x4E, 0xF0, 0x4A, 0x3C, 0x4B, 0x34, 0xFF, 0x1F, + 0x00, 0xC0, 0x4A, 0x4C, 0x4B, 0x24, 0x09, 0xC0, 0x02, 0xA2, 0x7B, 0x3C, + 0x39, 0x2C, 0x2E, 0xE4, 0x7E, 0x3C, 0x7D, 0x3C, 0x00, 0xA2, 0x7C, 0x3C, + 0x4F, 0x28, 0x28, 0xE4, 0x16, 0xE0, 0x4E, 0x28, 0x40, 0xBA, 0xAE, 0x18, + 0x1E, 0xE4, 0xCA, 0xF0, 0x7C, 0x3C, 0x34, 0xB6, 0xF0, 0xB7, 0x40, 0xBA, + 0x2E, 0xE4, 0x02, 0xA2, 0x7B, 0x3C, 0x00, 0xA2, 0x7D, 0x3C, 0x02, 0xA2, + 0x48, 0xF0, 0x40, 0xBA, 0x02, 0xAE, 0x2A, 0xE4, 0x19, 0x28, 0x2E, 0xE4, + 0x3F, 0x58, 0x15, 0x4C, 0x14, 0x20, 0x09, 0x3C, 0x3F, 0x58, 0x39, 0x2C, + 0x01, 0x3C, 0x00, 0x34, 0x0C, 0xBC, 0x03, 0x3C, 0x02, 0x34, 0x3F, 0x08, + 0xA9, 0x18, 0x0A, 0xE4, 0xAB, 0x18, 0x0D, 0xE4, 0xFA, 0xF1, 0x02, 0xA1, + 0xCA, 0xF0, 0x02, 0xA1, 0x9A, 0xF3, 0x02, 0xA1, 0x4A, 0xF2, 0x02, 0xA1, + 0x0E, 0xE4, 0x89, 0x18, 0x0A, 0xE4, 0x02, 0xA1, 0x0D, 0xE4, 0x65, 0x0D, + 0x1E, 0xE4, 0x91, 0x18, 0x03, 0x1C, 0x02, 0x10, 0x02, 0xA0, 0xAB, 0x18, + 0x00, 0x00, 0x32, 0xF0, 0x0A, 0x3C, 0x12, 0xE0, 0xB5, 0x18, 0x1E, 0xE4, + 0x03, 0xA2, 0x01, 0x0C, 0x1A, 0xE4, 0x4F, 0x4C, 0x04, 0x3E, 0x0A, 0x2A, + 0x0D, 0xE4, 0x40, 0xBC, 0xAE, 0xF5, 0xCD, 0x18, 0xB5, 0x18, 0x1E, 0xE4, + 0xFF, 0xA2, 0xAB, 0x18, 0x0D, 0xE4, 0x65, 0x0D, 0x1E, 0xE4, 0x3E, 0xF5, + 0x03, 0x1C, 0x02, 0x10, 0x02, 0xA0, 0xAB, 0x18, 0x01, 0x0C, 0x00, 0x00, + 0x32, 0xF0, 0x12, 0xE0, 0x21, 0xBC, 0x3F, 0x44, 0x02, 0xA8, 0x06, 0x3C, + 0x07, 0x3E, 0x41, 0xE0, 0x3F, 0x5A, 0x3D, 0xF3, 0x3B, 0x18, 0x0E, 0xE4, + 0xFB, 0x18, 0x1E, 0xE4, 0x3F, 0x58, 0x02, 0xA1, 0xAD, 0xF2, 0x20, 0xBC, + 0x0E, 0xE4, 0x16, 0x19, 0x1E, 0xE4, 0x3F, 0x08, 0x02, 0xA2, 0xAE, 0x18, + 0x1E, 0xE4, 0x3B, 0x18, 0x0E, 0xE4, 0x7B, 0x3C, 0x00, 0xA2, 0x7E, 0x3C, + 0x7B, 0x3C, 0x9D, 0xF1, 0x20, 0xBC, 0x3B, 0x18, 0xFF, 0xA2, 0x3F, 0x08, + 0x3F, 0x58, 0x7B, 0x28, 0x3F, 0x28, 0xA8, 0xF7, 0xB5, 0x18, 0x1E, 0xE4, + 0x7B, 0x28, 0x78, 0xF0, 0x40, 0x28, 0x9A, 0xF0, 0xB5, 0x18, 0x1E, 0xE4, + 0xFF, 0xA2, 0x02, 0xAE, 0x0E, 0xE4, 0x7C, 0x3C, 0xFE, 0xA2, 0xB8, 0xF7, + 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, 0x3B, 0x18, 0x61, 0xE1, 0x10, 0xC4, + 0x2E, 0xE4, 0x00, 0xA2, 0x31, 0x3D, 0x1F, 0xC7, 0x00, 0xA2, 0xF1, 0x02, + 0x61, 0xE1, 0x05, 0x3E, 0x04, 0x3C, 0x2E, 0xE4, 0x84, 0xE1, 0x22, 0x00, + 0x09, 0x88, 0xF0, 0x02, 0x04, 0x1C, 0x09, 0x2B, 0x11, 0x2D, 0xC8, 0x18, + 0x11, 0x81, 0x59, 0xF0, 0x68, 0xF0, 0x05, 0x1A, 0x11, 0x81, 0x5E, 0xF0, + 0x09, 0x3D, 0x00, 0xA2, 0x02, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x11, 0x81, + 0x09, 0x88, 0xF0, 0x02, 0x61, 0xE1, 0x2E, 0xE4, 0x11, 0x2D, 0xDD, 0x18, + 0x84, 0xE1, 0x22, 0x00, 0x50, 0xF0, 0x05, 0x1A, 0x04, 0x18, 0x09, 0x2B, + 0x09, 0x3D, 0x00, 0xA2, 0x11, 0x81, 0x49, 0xF0, 0x61, 0xE1, 0x18, 0xC4, + 0x11, 0x81, 0x11, 0x81, 0x84, 0xE1, 0x22, 0x00, 0x09, 0x88, 0xF1, 0x02, + 0x01, 0x2D, 0x1A, 0xF1, 0x09, 0x29, 0xF8, 0x18, 0x53, 0xF0, 0x45, 0xE0, + 0x3F, 0x5A, 0x39, 0x2E, 0x46, 0xE0, 0x3F, 0x5A, 0x15, 0x4E, 0x14, 0x22, + 0x00, 0xA2, 0x52, 0xF0, 0x04, 0x18, 0x02, 0xAE, 0x31, 0x81, 0x2E, 0xE4, + 0x01, 0x3D, 0x11, 0x81, 0x07, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x90, 0xE1, + 0xC8, 0xF7, 0xB5, 0x18, 0x1E, 0xE4, 0xFF, 0xA2, 0x22, 0x00, 0x09, 0x88, + 0xF0, 0x02, 0x61, 0xE1, 0x09, 0x2B, 0x11, 0x2D, 0x11, 0x19, 0x84, 0xE1, + 0x07, 0x28, 0x67, 0xF0, 0x78, 0xF0, 0x06, 0x1C, 0x5E, 0xF0, 0x09, 0x3D, + 0xFE, 0xA2, 0x11, 0x3D, 0x2E, 0xE4, 0x00, 0xA2, 0x11, 0x81, 0x11, 0x81, + 0x61, 0xE1, 0x08, 0x3C, 0x2E, 0xE4, 0x02, 0xA2, 0x84, 0xE1, 0x22, 0x00, + 0x09, 0x88, 0xF0, 0x02, 0x08, 0x18, 0x09, 0x2B, 0x11, 0x2D, 0x26, 0x19, + 0x00, 0xA2, 0x11, 0x81, 0x43, 0xF0, 0x56, 0xF0, 0x2E, 0xE4, 0x11, 0x81, + 0x11, 0x81, 0x09, 0x3D, 0x12, 0x28, 0x22, 0xF1, 0x12, 0x18, 0x19, 0x28, + 0x02, 0x02, 0x61, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x6A, 0xF0, 0x11, 0x29, + 0x3B, 0x19, 0x84, 0xE1, 0x00, 0xA2, 0x4C, 0x20, 0x12, 0xE4, 0x09, 0x29, + 0x92, 0xE0, 0x06, 0xA0, 0x82, 0xE0, 0x11, 0x3D, 0x16, 0x28, 0x12, 0x3C, + 0x2C, 0xB6, 0x19, 0x28, 0xE0, 0x1A, 0x1E, 0xE4, 0x28, 0xE4, 0x04, 0xA1, + 0x44, 0xF0, 0x02, 0xA1, 0x16, 0x28, 0x2E, 0xE4, 0x17, 0x74, 0x81, 0x19, + 0x0E, 0xE4, 0x4A, 0xF1, 0x3F, 0x28, 0x00, 0x3D, 0x03, 0x09, 0x60, 0xE1, + 0x81, 0x0D, 0x18, 0xE4, 0x2A, 0x44, 0x16, 0xE0, 0x11, 0x35, 0x04, 0x09, + 0x61, 0xE1, 0x2D, 0xE4, 0x8E, 0xF2, 0xF9, 0x19, 0x1E, 0xE4, 0x01, 0x3D, + 0x10, 0x35, 0x03, 0x09, 0x60, 0xE1, 0x00, 0xA2, 0x18, 0x28, 0x00, 0x3D, + 0x10, 0x35, 0x10, 0x3D, 0x2D, 0xE4, 0x81, 0x0D, 0x1E, 0xE4, 0x38, 0xF1, + 0x04, 0x3D, 0x14, 0x35, 0x03, 0x09, 0x64, 0xE1, 0x88, 0xF0, 0x3F, 0x28, + 0xAA, 0xF0, 0x2A, 0x28, 0x66, 0xE1, 0x2D, 0xE4, 0x81, 0x0D, 0x1E, 0xE4, + 0x1E, 0xE4, 0x06, 0x3D, 0x16, 0x35, 0x05, 0x09, 0x03, 0x09, 0x64, 0xE1, + 0xAE, 0xF0, 0x49, 0x1A, 0x04, 0x3D, 0x14, 0x35, 0x14, 0x3D, 0x14, 0x35, + 0x3F, 0x28, 0x99, 0x1A, 0x1E, 0xE4, 0x3E, 0xF0, 0x74, 0x20, 0x38, 0xF1, + 0xB9, 0xF1, 0x42, 0x2A, 0x3C, 0x3C, 0x3B, 0x34, 0x09, 0xC0, 0x75, 0x4C, + 0x09, 0xC0, 0x77, 0x4C, 0x76, 0x20, 0x00, 0xC0, 0x74, 0x20, 0x00, 0xC0, + 0x3E, 0x3C, 0x3D, 0x34, 0x66, 0xE0, 0x77, 0x4E, 0x76, 0x22, 0x75, 0x4C, + 0x09, 0xC0, 0x75, 0x4C, 0x74, 0x20, 0xEE, 0xF0, 0x7E, 0xF0, 0x00, 0xC0, + 0x3C, 0x3C, 0x3B, 0x34, 0x3D, 0x34, 0x09, 0xC0, 0x77, 0x4C, 0x76, 0x20, + 0x73, 0x3C, 0x72, 0x34, 0x00, 0xC0, 0x3E, 0x3C, 0x2E, 0xE4, 0x2A, 0xF0, + 0xC5, 0x28, 0x2E, 0xE4, 0xE0, 0x1A, 0x18, 0xE4, 0x7E, 0x4C, 0x4F, 0x28, + 0x78, 0x05, 0x00, 0xE0, 0x02, 0xAE, 0xE5, 0x28, 0x11, 0x35, 0x73, 0x4C, + 0x72, 0x20, 0x92, 0xE0, 0x9A, 0x05, 0x00, 0xE0, 0xE5, 0x28, 0x11, 0x3D, + 0xE5, 0x28, 0x11, 0x3D, 0x84, 0x28, 0x92, 0xE0, 0x16, 0x2A, 0xEB, 0x28, + 0xE5, 0x3C, 0x02, 0xA0, 0x16, 0xB6, 0x21, 0x2A, 0x16, 0xB6, 0x05, 0xA1, + 0x07, 0x3C, 0xAF, 0x28, 0x25, 0xF0, 0xAF, 0x2A, 0x1E, 0xE4, 0x48, 0xF0, + 0x70, 0x20, 0x1E, 0xE4, 0x80, 0x20, 0x1E, 0xE4, 0xBE, 0xF7, 0xE5, 0x1A, + 0x2E, 0xE4, 0xC5, 0x3C, 0x02, 0xA2, 0x4A, 0xF0, 0xE9, 0x28, 0x8E, 0xF7, + 0xE5, 0x1A, 0x1E, 0xE4, 0x4E, 0xF1, 0xE9, 0x3C, 0x02, 0xA1, 0x4A, 0xF0, + 0x00, 0xE0, 0xE7, 0x28, 0x2A, 0xF1, 0xE8, 0x28, 0x02, 0xA0, 0xE7, 0x28, + 0x92, 0xE0, 0xAB, 0x05, 0xE7, 0x3C, 0x28, 0xF0, 0x22, 0xA1, 0xE7, 0x3C, + 0x01, 0x29, 0xE8, 0x3C, 0x02, 0xA1, 0xE8, 0x28, 0x1E, 0xE4, 0x25, 0xE4, + 0x7F, 0x1A, 0x49, 0xE0, 0xF2, 0xB7, 0xFA, 0xA2, 0x49, 0xE0, 0x57, 0x0C, + 0x02, 0xAF, 0x17, 0x58, 0x02, 0xA2, 0x2E, 0xE4, 0xB8, 0xF0, 0x82, 0x2A, + 0x4F, 0x28, 0x06, 0x3C, 0x14, 0x21, 0x06, 0x09, 0x64, 0xE1, 0xD9, 0xF0, + 0x16, 0x23, 0x08, 0x09, 0x66, 0xE1, 0x14, 0x4D, 0x01, 0xA2, 0x00, 0xA2, + 0x9E, 0xF0, 0x16, 0x4F, 0x0A, 0x09, 0x61, 0xE1, 0x00, 0xA2, 0x6E, 0xF0, + 0x01, 0x3C, 0x00, 0x34, 0x11, 0x4F, 0x11, 0x23, 0x03, 0x09, 0x61, 0xE1, + 0x03, 0x3E, 0x02, 0x36, 0x71, 0xF0, 0x03, 0x1E, 0x02, 0x12, 0x01, 0x2F, + 0x06, 0x0C, 0x85, 0xF0, 0x06, 0x1E, 0x13, 0xE0, 0x37, 0xF0, 0x06, 0x1E, + 0x5E, 0xF0, 0x06, 0x0C, 0x05, 0x3C, 0x04, 0x34, 0x06, 0x1C, 0x06, 0x1C, + 0x74, 0x34, 0x01, 0x0D, 0x03, 0x09, 0x61, 0xE1, 0x12, 0x01, 0x04, 0x09, + 0x62, 0xE1, 0x75, 0x3C, 0x4E, 0x28, 0x77, 0x3C, 0x76, 0x34, 0x12, 0x0D, + 0x61, 0xE1, 0x75, 0x4C, 0x74, 0x20, 0x4A, 0xF1, 0x04, 0x20, 0x11, 0x3D, + 0x11, 0x35, 0x0A, 0x09, 0x14, 0x35, 0x06, 0x09, 0x64, 0xE1, 0x05, 0x4C, + 0x66, 0xE1, 0x03, 0x09, 0x61, 0xE1, 0x14, 0x3D, 0x16, 0x3D, 0x16, 0x35, + 0x01, 0x2D, 0x08, 0x09, 0x60, 0xE1, 0xAA, 0x1A, 0x1E, 0xE4, 0x2E, 0xE4, + 0x00, 0x20, 0x3A, 0xF3, 0x00, 0x29, 0x0B, 0x09, 0x4E, 0x2A, 0xF6, 0xF2, + 0x39, 0x0C, 0x01, 0x4C, 0xA4, 0xF2, 0x02, 0xA1, 0x46, 0xE0, 0x17, 0xE0, + 0x00, 0x7D, 0x0F, 0xC7, 0x0B, 0x09, 0x60, 0xE1, 0xD0, 0x1A, 0x1E, 0xE4, + 0x03, 0x3C, 0x02, 0x34, 0x02, 0xA1, 0x03, 0x29, 0x0B, 0x09, 0x63, 0xE1, + 0x00, 0xA2, 0xE0, 0x09, 0x61, 0xE1, 0x44, 0xCC, 0x11, 0x0D, 0x11, 0x01, + 0x6B, 0x1A, 0x84, 0xE1, 0xFF, 0xFF, 0x08, 0xE0, 0x04, 0x34, 0x02, 0xAE, + 0x04, 0x82, 0x03, 0x84, 0x05, 0x3C, 0x02, 0xAF, 0x1C, 0xE0, 0x05, 0x82, + 0x1E, 0xAE, 0x18, 0xE0, 0x22, 0x00, 0x02, 0x88, 0xE0, 0x09, 0x61, 0xE1, + 0x11, 0x0D, 0x11, 0x01, 0x7F, 0x1A, 0x84, 0xE1, 0x59, 0xF0, 0x4E, 0x2A, + 0x00, 0xA2, 0x2E, 0xF0, 0x11, 0x0D, 0x11, 0x01, 0x07, 0x09, 0x61, 0xE1, + 0x14, 0x0D, 0x14, 0x01, 0x03, 0x09, 0x64, 0xE1, 0x09, 0x09, 0x62, 0xE1, + 0x75, 0x3C, 0x74, 0x34, 0x05, 0x09, 0x66, 0xE1, 0x12, 0x0D, 0x12, 0x01, + 0x77, 0x3C, 0x76, 0x34, 0x16, 0x0D, 0x16, 0x01, 0x4F, 0x28, 0xAA, 0x1A, + 0x1E, 0xE4, 0x2E, 0xE4, 0x01, 0x4C, 0x00, 0x20, 0x8A, 0xF0, 0x16, 0xE0, + 0x17, 0xE0, 0x4E, 0x2A, 0x02, 0xAE, 0x39, 0x0C, 0x76, 0x34, 0x75, 0x3C, + 0x74, 0x34, 0x46, 0xE0, 0x9A, 0xF0, 0x82, 0x28, 0x2E, 0xE4, 0x77, 0x3C, + 0x12, 0x35, 0x01, 0x09, 0x62, 0xE1, 0x00, 0xA2, 0x01, 0x3D, 0x00, 0x09, + 0x61, 0xE1, 0x12, 0x3D, 0x62, 0xE1, 0xDA, 0xF0, 0x16, 0xE0, 0x4F, 0x28, + 0x61, 0xE1, 0x12, 0x4D, 0x12, 0x21, 0x01, 0x09, 0x47, 0xF0, 0x39, 0x1E, + 0x01, 0x2F, 0x00, 0x09, 0x00, 0x34, 0x42, 0xE0, 0x13, 0x5A, 0x03, 0xA2, + 0x00, 0x09, 0x61, 0xE1, 0x39, 0x28, 0x01, 0x3C, 0x62, 0xE1, 0x01, 0x4C, + 0x00, 0x20, 0x01, 0x3D, 0x2E, 0xE4, 0x12, 0x3D, 0x12, 0x35, 0x01, 0x09, + 0x26, 0x00, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x11, 0xD1, 0x20, 0xCE, + 0x42, 0xE0, 0x11, 0xAE, 0x13, 0xD1, 0x00, 0x02, 0x12, 0xD1, 0xE0, 0x09, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0xE5, 0x1A, 0x1E, 0xE4, + 0x26, 0xE4, 0xE5, 0x28, 0x61, 0xE1, 0x26, 0xE4, 0xE5, 0x28, 0xCE, 0xF7, + 0x11, 0x21, 0x78, 0x05, 0x62, 0xE1, 0x78, 0x05, 0x03, 0xA2, 0x00, 0x3E, + 0x01, 0xA2, 0x11, 0x4D, 0x44, 0xCC, 0xE4, 0xF0, 0x04, 0xA1, 0xE5, 0x28, + 0x0A, 0x4D, 0x12, 0x21, 0xFF, 0x1A, 0x84, 0xE1, 0x82, 0xE0, 0x56, 0xF0, + 0x11, 0x1D, 0x11, 0x11, 0x03, 0xA0, 0x00, 0x3E, 0x94, 0xE0, 0x04, 0xA1, + 0x00, 0x28, 0x92, 0xE0, 0x04, 0xA0, 0x84, 0xE0, 0x02, 0xA0, 0x98, 0xE0, + 0x9A, 0x05, 0x00, 0xE0, 0x1E, 0xE4, 0x01, 0x3C, 0x04, 0x29, 0x96, 0xE0, + 0x04, 0xA1, 0x00, 0x18, 0xE5, 0x28, 0x53, 0x20, 0x19, 0x1B, 0x84, 0xE1, + 0x44, 0xCC, 0xA4, 0xF0, 0x12, 0x3D, 0x11, 0x29, 0x12, 0x3D, 0x11, 0x29, + 0xF0, 0xB5, 0xE5, 0x28, 0x14, 0x3D, 0x13, 0x29, 0xAB, 0x05, 0x00, 0xE0, + 0xE6, 0x28, 0xE5, 0x3C, 0xE6, 0x28, 0x01, 0x3D, 0x01, 0x28, 0x92, 0xE0, + 0x28, 0xF0, 0x22, 0xA1, 0xE6, 0x3C, 0x02, 0xA0, 0xE8, 0x3C, 0x02, 0xA0, + 0xE8, 0x28, 0xE6, 0x3C, 0x04, 0xE0, 0xB2, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x02, 0xA1, 0x7F, 0x28, 0x9C, 0xE0, 0x54, 0x00, 0x06, 0x9E, 0x4B, 0x1B, + 0x84, 0xE1, 0x44, 0xCC, 0xB2, 0x28, 0xB8, 0xF0, 0x02, 0xA8, 0xB2, 0x5C, + 0x9F, 0xE0, 0x18, 0x05, 0x01, 0xE0, 0x49, 0xE0, 0x5A, 0x20, 0x19, 0xE4, + 0x09, 0xA8, 0x07, 0x2B, 0x1E, 0xE4, 0x09, 0xA2, 0xB2, 0x28, 0x5E, 0xF0, + 0xB2, 0x3E, 0x03, 0xA0, 0xB2, 0x2A, 0x69, 0x20, 0x9E, 0xE0, 0x18, 0x05, + 0x04, 0xE0, 0x2E, 0xE4, 0x7F, 0x28, 0x9C, 0xE0, 0x54, 0x00, 0x04, 0xE0, + 0xB2, 0x3C, 0x00, 0xA2, 0x44, 0xCC, 0x02, 0xA1, 0x05, 0xAF, 0x17, 0x2B, + 0x61, 0x1B, 0x84, 0xE1, 0xB2, 0x2A, 0x56, 0xE0, 0xB2, 0x5A, 0x03, 0xA8, + 0x2E, 0xE4, 0x06, 0x9F, 0xB2, 0x3E, 0x03, 0xA0, 0x58, 0xF0, 0x40, 0x28, + 0xE8, 0xF0, 0xC4, 0x28, 0x8E, 0xF0, 0x3E, 0x3C, 0x9C, 0x20, 0x1E, 0xE4, + 0x84, 0x3C, 0xFC, 0xA2, 0x48, 0xF0, 0xC4, 0x28, 0x2E, 0xE4, 0x84, 0x3C, + 0x3E, 0x28, 0x3E, 0xF0, 0x61, 0xE1, 0x2E, 0xE4, 0x77, 0x1B, 0x1E, 0xE4, + 0x11, 0x3D, 0x0A, 0xC7, 0x00, 0xA2, 0x00, 0x09, 0x00, 0xA2, 0x00, 0x06, + 0x61, 0xE1, 0x2E, 0xE4, 0x3F, 0x01, 0x22, 0xD0, 0x02, 0x3C, 0x11, 0x3D, + 0xA8, 0x1C, 0x1E, 0xE4, 0x8A, 0x1B, 0x84, 0xE1, 0x00, 0xA2, 0x02, 0x3C, + 0x02, 0xA0, 0x02, 0x28, 0x47, 0x3C, 0xFE, 0xA2, 0x09, 0xC0, 0x9B, 0x3C, + 0x6E, 0xBA, 0x2E, 0xE4, 0x00, 0xC0, 0x48, 0x3C, 0x10, 0x18, 0x00, 0x3C, + 0xDD, 0xF0, 0x3E, 0xBC, 0x00, 0x28, 0x10, 0x3C, 0xFE, 0xA2, 0x38, 0xF0, + 0x44, 0x1C, 0x1E, 0xE4, 0x00, 0x01, 0x00, 0xE0, 0x00, 0xA2, 0x6A, 0xE1, + 0x2E, 0xE4, 0x02, 0xA2, 0x00, 0xC0, 0x53, 0x28, 0x09, 0xC0, 0x2E, 0xE4, + 0x04, 0xA2, 0xB0, 0x3C, 0x00, 0xA2, 0x38, 0xF0, 0x00, 0x01, 0x00, 0xE0, + 0x10, 0x28, 0x9B, 0x3C, 0x1E, 0xE4, 0x2A, 0xE4, 0x7F, 0x1C, 0x1E, 0xE4, + 0x10, 0x28, 0x28, 0x19, 0x1C, 0xE4, 0x17, 0x11, 0x47, 0x3C, 0x09, 0xC0, + 0x10, 0x3C, 0xFA, 0xB7, 0x65, 0x0D, 0x1E, 0xE4, 0x2E, 0xE4, 0x00, 0xC0, + 0x02, 0xE0, 0x01, 0x3C, 0xDC, 0x1B, 0x0D, 0xE4, 0x01, 0x28, 0xDC, 0x1B, + 0x00, 0xE4, 0xFF, 0x00, 0x29, 0x3C, 0xFE, 0xA2, 0xB8, 0xF0, 0x29, 0x18, + 0x40, 0x01, 0x62, 0xE1, 0x92, 0xE0, 0x01, 0x28, 0x98, 0x3C, 0x02, 0xA2, + 0xDF, 0x1B, 0x1E, 0xE4, 0x01, 0x28, 0xAE, 0x3C, 0x02, 0xA8, 0xAE, 0x28, + 0x2E, 0xE4, 0x02, 0xA2, 0x44, 0x1C, 0x1E, 0xE4, 0x82, 0xE0, 0x2E, 0xE4, + 0x00, 0xA2, 0x6A, 0xE1, 0x84, 0xE0, 0xAA, 0x1C, 0x1E, 0xE4, 0x02, 0x3C, + 0x84, 0xE0, 0xA8, 0x1C, 0x1E, 0xE4, 0x02, 0x3C, 0x49, 0xE0, 0xF5, 0x1B, + 0x1E, 0xE4, 0x18, 0xAE, 0xF5, 0x1B, 0x1E, 0xE4, 0x18, 0xAE, 0x82, 0xE0, + 0x22, 0x02, 0x1E, 0xE4, 0x00, 0x10, 0x61, 0xE1, 0x1E, 0xE4, 0x05, 0x3C, + 0x04, 0x34, 0x2E, 0xE4, 0x2E, 0xE4, 0x05, 0x0C, 0x04, 0x04, 0x14, 0x0D, + 0x1E, 0xE4, 0x29, 0x28, 0x9B, 0x3C, 0x02, 0xA2, 0x1E, 0xE4, 0x26, 0x1C, + 0x0A, 0xE4, 0x7F, 0x1C, 0x98, 0x2A, 0x15, 0x1C, 0x08, 0xE4, 0x3B, 0x12, + 0x1E, 0xE4, 0x00, 0xA2, 0x26, 0x1C, 0x0B, 0xE4, 0x29, 0x28, 0x40, 0x01, + 0x61, 0xE1, 0x19, 0x0D, 0x0E, 0xE4, 0xDF, 0x1B, 0x1E, 0xE4, 0x94, 0xE0, + 0x99, 0xF1, 0x1E, 0x02, 0x1E, 0xE4, 0xFF, 0x1B, 0x19, 0x0D, 0x1E, 0xE4, + 0x00, 0xA2, 0x65, 0x3C, 0x7A, 0xF0, 0x65, 0x28, 0x9B, 0x3E, 0x01, 0xA2, + 0x00, 0xC0, 0x48, 0x3C, 0x09, 0xC0, 0x29, 0x28, 0x59, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0x02, 0xA2, 0x04, 0xA1, 0xAE, 0x28, 0x79, 0xF0, 0x07, 0xA1, + 0xAE, 0x3C, 0x02, 0xA9, 0xAE, 0x28, 0x4A, 0xF0, 0x48, 0x3C, 0x09, 0xC0, + 0x29, 0x3C, 0xFE, 0xA2, 0x60, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x00, 0xC0, + 0x9A, 0x4C, 0x99, 0x24, 0x6A, 0xF0, 0x02, 0xA1, 0x1E, 0xE4, 0x70, 0xE4, + 0xC2, 0x1C, 0x1E, 0xE4, 0x70, 0xE4, 0xC9, 0x1C, 0x1E, 0xE4, 0xDB, 0x1C, + 0x00, 0xA2, 0xAA, 0x1C, 0x1E, 0xE4, 0x02, 0x3C, 0x04, 0x34, 0x18, 0xAE, + 0x02, 0x28, 0x06, 0x3C, 0x04, 0x04, 0x14, 0x0D, 0x1E, 0xE4, 0x05, 0x3C, + 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x05, 0x0C, 0x0E, 0xA0, 0x06, 0x18, + 0xEC, 0x0C, 0x1E, 0xE4, 0x13, 0xD1, 0x24, 0xCE, 0x02, 0xAE, 0x06, 0xAF, + 0x2C, 0xCA, 0xF8, 0xF7, 0x28, 0xCA, 0x12, 0x00, 0x28, 0xF1, 0xF5, 0x0C, + 0x1E, 0xE4, 0xFA, 0xF7, 0x00, 0x02, 0x00, 0xE0, 0x05, 0x4C, 0x04, 0x20, + 0xEC, 0x0C, 0x1E, 0xE4, 0x05, 0x3C, 0x04, 0x34, 0x1E, 0xE4, 0xC6, 0x0A, + 0x1E, 0xE4, 0x06, 0x3C, 0x20, 0xF0, 0x00, 0x10, 0x02, 0xE0, 0xEC, 0x0C, + 0x02, 0xA2, 0x00, 0x06, 0x61, 0xE1, 0x9E, 0xF5, 0x01, 0x3D, 0xEC, 0x0C, + 0x1E, 0xE4, 0x11, 0x3D, 0x02, 0x3C, 0x2E, 0xE4, 0xA8, 0x1C, 0x1E, 0xE4, + 0x00, 0x06, 0x61, 0xE1, 0xAA, 0x1C, 0x1E, 0xE4, 0x18, 0xAE, 0x02, 0x28, + 0x2A, 0xE4, 0x11, 0x29, 0x03, 0xA1, 0x9B, 0x2A, 0xF5, 0x1B, 0x1E, 0xE4, + 0x04, 0xA2, 0xC2, 0x1C, 0x1E, 0xE4, 0x9B, 0xF0, 0x90, 0x00, 0x04, 0xE0, + 0x19, 0x0D, 0x1E, 0xE4, 0x02, 0xA2, 0xC9, 0x1C, 0x1E, 0xE4, 0x8E, 0xF0, + 0x80, 0x00, 0x04, 0xE0, 0x19, 0x0D, 0x1E, 0xE4, 0x1E, 0xA0, 0x6E, 0xCC, + 0x6A, 0xCC, 0x66, 0xCC, 0x68, 0xCC, 0x60, 0xCC, 0x00, 0xA2, 0x6C, 0xCC, + 0x2E, 0xE4, 0x02, 0xA2, 0x28, 0xE1, 0x70, 0xCC, 0x0A, 0x3C, 0x06, 0xA2, + 0x2E, 0xF0, 0x04, 0xA2, 0x11, 0xD1, 0x20, 0xCE, 0xB8, 0x1C, 0x1E, 0xE4, + 0x0A, 0x88, 0x04, 0x00, 0x12, 0xD1, 0x00, 0x06, 0x2E, 0xE4, 0xF8, 0xF7, + 0x28, 0xCA, 0x13, 0x01, 0x2A, 0x00, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, + 0x07, 0xAE, 0x02, 0x2A, 0x42, 0xE0, 0x11, 0xAE, 0x80, 0xA0, 0x20, 0xCE, + 0x2E, 0xE4, 0x42, 0xE0, 0x90, 0x00, 0x11, 0xD1, 0x9A, 0x3C, 0x99, 0x34, + 0x1E, 0xE4, 0x80, 0xA0, 0x20, 0xCE, 0x7E, 0xF0, 0x12, 0xD1, 0x80, 0x00, + 0x11, 0xD1, 0xD6, 0x1C, 0x28, 0xCA, 0x13, 0x00, 0x13, 0xD1, 0x10, 0x00, + 0x10, 0x34, 0x09, 0xC0, 0x2E, 0xE4, 0xF8, 0xF7, 0x09, 0xC0, 0x2E, 0xE4, + 0x00, 0xC0, 0x11, 0x3C, 0x2E, 0xE4, 0x00, 0xC0, 0x11, 0x4C, 0x10, 0x24, + 0x00, 0x3C, 0x02, 0xA1, 0x2A, 0xE4, 0x19, 0x28, 0x09, 0xA8, 0xAA, 0x2A, + 0x1A, 0xE0, 0x4E, 0x28, 0x52, 0xE0, 0x17, 0xE0, 0xBE, 0x2A, 0x49, 0xF0, + 0x49, 0x1E, 0x1E, 0xE4, 0x0C, 0x1E, 0x18, 0xE4, 0xB5, 0x1E, 0x1E, 0xE4, + 0x7D, 0x1E, 0x1E, 0xE4, 0x74, 0x20, 0x1A, 0xF1, 0x7E, 0x28, 0x2E, 0xE4, + 0x74, 0x34, 0x73, 0x1C, 0x72, 0x10, 0x75, 0x4C, 0x72, 0x10, 0x77, 0x4C, + 0x76, 0x20, 0x75, 0x3C, 0x00, 0xA2, 0x77, 0x3C, 0x76, 0x34, 0x73, 0x1C, + 0x00, 0xA2, 0x3C, 0x3C, 0x73, 0x3C, 0x72, 0x34, 0x7E, 0x4E, 0x4F, 0x2A, + 0x39, 0x2C, 0xBE, 0x3C, 0x2A, 0xF1, 0x19, 0x28, 0x80, 0x3C, 0x12, 0xB6, + 0x50, 0x3C, 0x39, 0x28, 0x00, 0x3C, 0x02, 0xA1, 0x40, 0x28, 0xD0, 0x1D, + 0x1A, 0xE4, 0x7D, 0x28, 0x40, 0x28, 0xA1, 0x1D, 0x18, 0xE4, 0x16, 0xE0, + 0x25, 0x1D, 0x1E, 0xE4, 0x65, 0x1D, 0x08, 0xE4, 0x4C, 0x20, 0x1E, 0xE4, + 0x84, 0x28, 0x2E, 0xE4, 0x02, 0x02, 0x61, 0xE1, 0x20, 0xC4, 0x2E, 0xE4, + 0x2E, 0x1D, 0x84, 0xE1, 0x22, 0x00, 0x00, 0x88, 0x2E, 0xE4, 0x31, 0x81, + 0x3A, 0xF0, 0x01, 0x29, 0x04, 0xAF, 0x02, 0x02, 0x02, 0xE0, 0x82, 0xE0, + 0x7C, 0x28, 0x09, 0x3D, 0x41, 0x28, 0x0A, 0x3C, 0x09, 0x81, 0x31, 0x3D, + 0x7B, 0x28, 0x09, 0x3D, 0x00, 0xE0, 0x82, 0xE0, 0x11, 0x3D, 0x84, 0x28, + 0x60, 0x02, 0x02, 0xE0, 0x94, 0xE0, 0x5C, 0x00, 0x92, 0xE0, 0x40, 0x02, + 0x00, 0xE0, 0x02, 0xAF, 0x11, 0x3D, 0x11, 0x35, 0x73, 0x4C, 0x72, 0x20, + 0x0A, 0x4D, 0x12, 0x21, 0x05, 0xA1, 0x41, 0x2A, 0x12, 0x35, 0x75, 0x4C, + 0x74, 0x20, 0x3B, 0xF0, 0x35, 0xF0, 0x0A, 0x4D, 0x12, 0x21, 0x12, 0x3D, + 0x12, 0x3D, 0x12, 0x35, 0x77, 0x4C, 0x76, 0x20, 0x92, 0xE0, 0xA0, 0x02, + 0x00, 0xE0, 0x0A, 0x28, 0x01, 0x3D, 0x1A, 0xE0, 0x41, 0x18, 0x06, 0xA2, + 0x00, 0x88, 0x00, 0x02, 0x61, 0xE1, 0x2E, 0xE4, 0x11, 0x2D, 0x72, 0x1D, + 0x84, 0xE1, 0x22, 0x00, 0x28, 0xF0, 0x7C, 0x1A, 0x7B, 0x1C, 0x11, 0x2B, + 0x2E, 0xE4, 0x11, 0x81, 0x11, 0x81, 0x4B, 0xF0, 0x00, 0xE0, 0x82, 0xE0, + 0x01, 0x3D, 0x06, 0xA2, 0x60, 0x02, 0x02, 0xE0, 0x94, 0xE0, 0x5E, 0x00, + 0x92, 0xE0, 0x40, 0x02, 0x00, 0xE0, 0x02, 0xAF, 0x0A, 0x3C, 0x02, 0xAF, + 0x40, 0x02, 0x02, 0xE0, 0x09, 0x4F, 0x11, 0x23, 0x73, 0x4C, 0x72, 0x20, + 0x1E, 0xF4, 0x11, 0x3D, 0x11, 0x35, 0x66, 0xE0, 0x00, 0x88, 0x02, 0x02, + 0x61, 0xE1, 0x20, 0xC4, 0x01, 0x29, 0x95, 0x1D, 0x84, 0xE1, 0x22, 0x00, + 0x06, 0xA2, 0x2E, 0xE4, 0x31, 0x81, 0x3A, 0xF0, 0x50, 0x28, 0x09, 0x3D, + 0x02, 0xA2, 0x09, 0x3D, 0x11, 0x3D, 0xFE, 0xA2, 0x09, 0x81, 0x31, 0x3D, + 0x61, 0xE1, 0x20, 0xC4, 0x00, 0xA2, 0x2E, 0xE4, 0x84, 0xE1, 0x22, 0x00, + 0x00, 0x88, 0x02, 0x02, 0x42, 0xE0, 0x1B, 0xE0, 0x31, 0x2B, 0xAB, 0x1D, + 0x21, 0xAE, 0x03, 0xA2, 0x24, 0xE4, 0x19, 0x18, 0x22, 0x00, 0x00, 0x88, + 0x02, 0x02, 0x61, 0xE1, 0x1A, 0xF1, 0x09, 0x29, 0xC9, 0x1D, 0x84, 0xE1, + 0x50, 0x1C, 0x01, 0x2D, 0xE6, 0xF0, 0x09, 0x29, 0x50, 0x0C, 0x15, 0x1C, + 0x14, 0x10, 0x36, 0xF0, 0x49, 0xE0, 0x42, 0xE0, 0x62, 0xF0, 0x46, 0xE0, + 0x11, 0x81, 0x94, 0xE0, 0x04, 0xA0, 0x82, 0xE0, 0x12, 0x3D, 0x00, 0xA2, + 0x31, 0x81, 0x11, 0x81, 0x2E, 0xE4, 0x4C, 0x20, 0x12, 0xE4, 0x12, 0x29, + 0xF0, 0x02, 0x62, 0xE1, 0x00, 0x02, 0x61, 0xE1, 0x0A, 0x1E, 0x84, 0xE1, + 0x22, 0x00, 0x00, 0x88, 0x02, 0x3C, 0x12, 0x29, 0x98, 0xF0, 0x3F, 0x28, + 0x70, 0xB6, 0x1A, 0xE0, 0x03, 0x3C, 0x12, 0x29, 0x02, 0xAF, 0x12, 0x29, + 0x5E, 0xF1, 0x04, 0x3C, 0x1A, 0xE0, 0x03, 0x3C, 0x12, 0x29, 0x02, 0x3C, + 0x1A, 0xE0, 0x0A, 0x29, 0x12, 0x81, 0x04, 0x3C, 0x02, 0xA8, 0x04, 0x3C, + 0x04, 0x4C, 0x02, 0xAE, 0x02, 0x3C, 0x02, 0xAF, 0x12, 0x29, 0x68, 0xF0, + 0x12, 0x81, 0x04, 0x28, 0x03, 0x3C, 0x0A, 0x29, 0x11, 0x3D, 0x02, 0x28, + 0x8A, 0xF0, 0x12, 0x81, 0x11, 0x3D, 0x04, 0x28, 0x11, 0x3D, 0x03, 0x28, + 0x01, 0x29, 0x11, 0x81, 0x11, 0x81, 0xAE, 0xF0, 0x01, 0x29, 0x4A, 0xF0, + 0x11, 0x3F, 0x01, 0xA2, 0x2E, 0xE4, 0x11, 0x81, 0x4C, 0x20, 0x12, 0xE4, + 0x2A, 0xE4, 0x19, 0x28, 0x28, 0xE4, 0x4F, 0x28, 0x04, 0xA8, 0xAA, 0x28, + 0x28, 0xE4, 0x40, 0x28, 0x1A, 0x4C, 0x39, 0x20, 0x1E, 0xE4, 0x58, 0xF0, + 0xAA, 0x28, 0x50, 0x3C, 0x80, 0x2C, 0x2A, 0xE4, 0x0F, 0x3C, 0x00, 0xA2, + 0x38, 0xF0, 0x04, 0xA8, 0x15, 0x4E, 0x14, 0x22, 0x02, 0xA0, 0x50, 0x28, + 0x39, 0x1C, 0x50, 0x3C, 0x52, 0xE0, 0x03, 0xA1, 0x1A, 0x4C, 0x02, 0xA8, + 0xAA, 0x28, 0x2A, 0xE4, 0x1E, 0xE4, 0xA1, 0x1D, 0x1E, 0xE4, 0x5A, 0xF0, + 0xD8, 0xF6, 0x04, 0xA8, 0xAA, 0x28, 0x8C, 0x1D, 0x20, 0xA9, 0xAE, 0x28, + 0xB8, 0xF6, 0x1A, 0x28, 0x0F, 0x3C, 0x02, 0xA0, 0x0F, 0x28, 0xAE, 0x3C, + 0xAE, 0x18, 0x1E, 0xE4, 0x42, 0xF0, 0x20, 0xA1, 0x1E, 0xE4, 0x8C, 0x06, + 0x1E, 0xE4, 0x0E, 0xF6, 0xAE, 0x3C, 0x08, 0xA9, 0xAE, 0x28, 0xE0, 0x1A, + 0x62, 0xE1, 0x00, 0x02, 0x61, 0xE1, 0x2E, 0xE4, 0x84, 0xE1, 0x22, 0x00, + 0x00, 0x88, 0xF0, 0x02, 0x11, 0x29, 0xC8, 0xF0, 0x3F, 0x28, 0x71, 0x1E, + 0x07, 0xA1, 0x11, 0x2B, 0x11, 0x29, 0x12, 0x3D, 0x12, 0x3D, 0x00, 0xA2, + 0x12, 0x3D, 0x12, 0xB6, 0x02, 0xAE, 0x11, 0x29, 0x4E, 0xF1, 0x12, 0x3D, + 0x11, 0x29, 0x12, 0x3D, 0x42, 0x18, 0x02, 0xA0, 0x0A, 0x3D, 0x16, 0xB6, + 0x03, 0xA8, 0x09, 0x2B, 0x12, 0x3D, 0x02, 0xAA, 0x12, 0x81, 0x12, 0x29, + 0x16, 0xB6, 0x05, 0xA8, 0x11, 0x2B, 0x11, 0x29, 0x30, 0x03, 0x61, 0xE1, + 0x11, 0x81, 0x12, 0x3D, 0x3F, 0x00, 0x22, 0xD0, 0xF0, 0x02, 0x62, 0xE1, + 0x11, 0x3D, 0x12, 0x29, 0x7B, 0x1E, 0x84, 0xE1, 0x1E, 0xE4, 0xD8, 0xF0, + 0x3F, 0x28, 0x2E, 0xE4, 0x70, 0x03, 0x00, 0xE0, 0x08, 0x28, 0xF7, 0x1E, + 0x08, 0x28, 0x3D, 0x1F, 0x1E, 0xE4, 0x96, 0xE0, 0x1E, 0xE4, 0x2E, 0xE4, + 0x6D, 0x3C, 0x09, 0x08, 0x08, 0x28, 0x70, 0x03, 0x63, 0xE1, 0xF7, 0x1E, + 0x00, 0xE0, 0x08, 0x3C, 0xDF, 0x1F, 0x1E, 0xE4, 0x3D, 0x1F, 0x1E, 0xE4, + 0x96, 0xE0, 0x70, 0x03, 0x96, 0xE0, 0x70, 0x03, 0x00, 0xE0, 0x08, 0x28, + 0x08, 0x08, 0xDF, 0x1F, 0x1E, 0xE4, 0x09, 0x28, 0xB4, 0x1E, 0x00, 0xE4, + 0x42, 0x18, 0x6D, 0x3C, 0xB4, 0x1E, 0x0A, 0xE4, 0x20, 0xA8, 0xAE, 0x28, + 0x5A, 0xF0, 0x42, 0x28, 0x70, 0x03, 0x63, 0xE1, 0x13, 0x3D, 0x00, 0xA2, + 0x13, 0x3D, 0x3E, 0xA2, 0x13, 0x3D, 0x3C, 0xA2, 0x13, 0x3D, 0x3E, 0xA2, + 0x1E, 0xE4, 0x58, 0xF1, 0x3F, 0x28, 0x2E, 0xE4, 0x90, 0x03, 0x00, 0xE0, + 0x08, 0x28, 0x68, 0x1F, 0x08, 0x28, 0x3D, 0x1F, 0x1E, 0xE4, 0x96, 0xE0, + 0x1E, 0xE4, 0x96, 0xE0, 0xB0, 0x03, 0x00, 0xE0, 0x6D, 0x3C, 0x09, 0x08, + 0x08, 0x28, 0x3D, 0x1F, 0x1E, 0xE4, 0x2E, 0xE4, 0x22, 0x20, 0x1E, 0xE4, + 0x08, 0x28, 0x90, 0x03, 0x63, 0xE1, 0x68, 0x1F, 0xB0, 0x03, 0x63, 0xE1, + 0xDF, 0x1F, 0x1E, 0xE4, 0x08, 0x3C, 0xDF, 0x1F, 0x1E, 0xE4, 0x08, 0x28, + 0x96, 0xE0, 0x90, 0x03, 0x00, 0xE0, 0x08, 0x28, 0x00, 0xE0, 0x08, 0x28, + 0x3D, 0x1F, 0x1E, 0xE4, 0x1E, 0xE4, 0x09, 0x28, 0x96, 0xE0, 0x90, 0x03, + 0xB0, 0x03, 0x00, 0xE0, 0x08, 0x28, 0xDF, 0x1F, 0x08, 0x28, 0x3D, 0x1F, + 0x1E, 0xE4, 0x96, 0xE0, 0x09, 0x28, 0x96, 0xE0, 0xB0, 0x03, 0x00, 0xE0, + 0x6D, 0x3C, 0x08, 0x08, 0xDF, 0x1F, 0x1E, 0xE4, 0x4E, 0xFB, 0x2E, 0xE4, + 0x22, 0x20, 0x1E, 0xE4, 0xFE, 0xA2, 0x70, 0x03, 0x63, 0xE1, 0x08, 0x3C, + 0x13, 0xE0, 0x21, 0xAE, 0x03, 0xA2, 0x06, 0x3C, 0x12, 0x29, 0x1A, 0x1F, + 0x84, 0xE1, 0x6E, 0xFB, 0x24, 0xF1, 0x05, 0x18, 0x09, 0x29, 0x68, 0xF1, + 0x39, 0x1C, 0x01, 0x2D, 0xF6, 0xF0, 0x09, 0x29, 0x39, 0x0C, 0x15, 0x1C, + 0x14, 0x10, 0x36, 0xF0, 0x49, 0xE0, 0x42, 0xE0, 0x76, 0xF0, 0x46, 0xE0, + 0x06, 0x3C, 0x01, 0x06, 0x02, 0xE0, 0x84, 0xE0, 0x06, 0x28, 0x31, 0x81, + 0x11, 0x81, 0x11, 0x81, 0x94, 0xE0, 0x00, 0x06, 0x00, 0xE0, 0x24, 0xE4, + 0x02, 0xAE, 0x06, 0x28, 0x02, 0x3D, 0x02, 0xA2, 0x08, 0x3C, 0x02, 0xA0, + 0x08, 0x28, 0x13, 0x3D, 0x61, 0xE1, 0x2E, 0xE4, 0x28, 0xF5, 0x19, 0x18, + 0x11, 0x3D, 0x0F, 0xC7, 0x00, 0xA2, 0x00, 0x06, 0x20, 0xC4, 0x05, 0x3C, + 0x74, 0xB6, 0x3F, 0x28, 0x02, 0x02, 0x61, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, + 0x22, 0x00, 0x00, 0x88, 0x00, 0x06, 0x62, 0xE1, 0xFE, 0xA2, 0x09, 0x3C, + 0xEE, 0xFE, 0x2E, 0xE4, 0x84, 0xE1, 0x4E, 0xFF, 0x21, 0xA2, 0x07, 0x3C, + 0x09, 0x29, 0x18, 0xF1, 0x12, 0x29, 0x57, 0x1F, 0xA2, 0xF0, 0x09, 0x29, + 0xD4, 0xF0, 0x05, 0x18, 0x42, 0xE0, 0x72, 0xF0, 0x46, 0xE0, 0x01, 0x2D, + 0x01, 0x06, 0x02, 0xE0, 0x84, 0xE0, 0x49, 0xE0, 0x31, 0x81, 0x11, 0x81, + 0x11, 0x81, 0x07, 0x3C, 0x00, 0x06, 0x00, 0xE0, 0x24, 0xE4, 0x07, 0x28, + 0x07, 0x28, 0x02, 0x3D, 0x02, 0xA2, 0x94, 0xE0, 0x02, 0xA0, 0x09, 0x28, + 0x13, 0x3D, 0x02, 0xAE, 0x2E, 0xE4, 0x98, 0xF5, 0x19, 0x18, 0x09, 0x3C, + 0x90, 0x03, 0x63, 0xE1, 0x0A, 0x3C, 0x3E, 0xFC, 0x06, 0x3C, 0xFE, 0xA2, + 0xB0, 0x03, 0x64, 0xE1, 0x40, 0x02, 0x65, 0xE1, 0x5E, 0xFC, 0x07, 0x3C, + 0xC8, 0xF2, 0x12, 0x29, 0xA5, 0x1F, 0x84, 0xE1, 0x09, 0x29, 0x84, 0xF2, + 0x05, 0x18, 0x09, 0x29, 0x72, 0x10, 0x0D, 0x4D, 0x15, 0x21, 0x56, 0xF2, + 0x64, 0xF0, 0x06, 0x28, 0x10, 0xF1, 0x73, 0x1C, 0x0D, 0x1C, 0x0C, 0x10, + 0x0D, 0x4D, 0x15, 0x21, 0x0C, 0x34, 0x0D, 0x4D, 0x15, 0x21, 0x96, 0xF1, + 0x01, 0x06, 0x02, 0xE0, 0x84, 0xE0, 0x0D, 0x3C, 0x64, 0xF0, 0x07, 0x28, + 0x0E, 0xF1, 0x06, 0x3C, 0x0F, 0x1C, 0x0E, 0x10, 0x0D, 0x4D, 0x15, 0x21, + 0x0E, 0x34, 0x0D, 0x4D, 0x15, 0x21, 0x92, 0xF0, 0x01, 0x06, 0x02, 0xE0, + 0x84, 0xE0, 0x0F, 0x3C, 0x31, 0x81, 0x11, 0x81, 0x11, 0x81, 0x07, 0x3C, + 0x94, 0xF0, 0x06, 0x28, 0x15, 0x81, 0x15, 0x81, 0x02, 0xA2, 0x94, 0xE0, + 0x00, 0x06, 0x00, 0xE0, 0x13, 0x3D, 0x02, 0xAE, 0x06, 0x28, 0x02, 0x3D, + 0x00, 0x06, 0x00, 0xE0, 0x94, 0xF0, 0x07, 0x28, 0x07, 0x28, 0x02, 0x3D, + 0x02, 0xA2, 0x94, 0xE0, 0x02, 0xA0, 0x0A, 0x28, 0x14, 0x3D, 0x02, 0xAE, + 0x6E, 0x1F, 0x08, 0xE4, 0x19, 0x18, 0x0A, 0x3C, 0x0C, 0x3C, 0x90, 0x03, + 0x02, 0xE0, 0x86, 0xE0, 0x0D, 0x3C, 0xB0, 0x03, 0x02, 0xE0, 0x88, 0xE0, + 0x64, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x9A, 0xF0, 0x14, 0x29, 0xD0, 0x1F, + 0x84, 0xE1, 0xB0, 0x03, 0x02, 0xA1, 0x9A, 0xF0, 0x0C, 0x28, 0x13, 0x3D, + 0x84, 0xE1, 0x90, 0x03, 0x63, 0xE1, 0x44, 0xCC, 0x0C, 0x28, 0x14, 0x3D, + 0x13, 0x29, 0xDA, 0x1F, 0x2A, 0xE4, 0x2E, 0xE4, 0x08, 0x3C, 0x0D, 0x08, + 0x98, 0xE0, 0x86, 0xE0, 0x0C, 0x3C, 0x02, 0xA1, 0x22, 0x00, 0x0C, 0x88, + 0x00, 0x06, 0x61, 0xE1, 0x02, 0xAE, 0x03, 0x29, 0xFA, 0x1F, 0x84, 0xE1, + 0x02, 0x29, 0x94, 0xE0, 0x02, 0x02, 0x00, 0xE0, 0x11, 0x3D, 0x03, 0x29, + 0x3A, 0xF0, 0x02, 0xA8, 0x03, 0x29, 0x4A, 0xF0, 0x04, 0xA8, 0x02, 0x29, + 0x82, 0xE0, 0x13, 0x81, 0x11, 0x3D, 0x02, 0xA0, 0x02, 0xA1, 0x2A, 0xE4, + 0x00, 0x06, 0x02, 0xE0, 0x0E, 0x3C, 0x42, 0x28, 0x0D, 0x3C, 0x0C, 0x3C, + 0x22, 0x00, 0x0C, 0x88, 0x00, 0x06, 0x61, 0xE1, 0x44, 0xF0, 0x01, 0x29, + 0x0F, 0x20, 0x84, 0xE1, 0x11, 0x81, 0x6A, 0xF0, 0x0E, 0x18, 0x02, 0xA8, + 0x1E, 0xF7, 0x0E, 0x3C, 0x16, 0xE0, 0x0E, 0x28, 0x01, 0x3D, 0xFE, 0xA2, + 0x14, 0x3D, 0x01, 0x29, 0x0D, 0x28, 0x0E, 0x3C, 0x16, 0xE0, 0x0E, 0x28, + 0x0C, 0x28, 0x62, 0xF6, 0x0D, 0x3C, 0x02, 0xA1, 0x02, 0xA1, 0x6D, 0x28, + 0x2E, 0xE4, 0x02, 0xA0, 0x90, 0x03, 0x63, 0xE1, 0x44, 0xCC, 0x26, 0xE4, + 0x2F, 0x20, 0x84, 0xE1, 0xB0, 0x03, 0x64, 0xE1, 0x90, 0xE1, 0x28, 0xE4, + 0x14, 0x19, 0x13, 0x29, 0xB0, 0x03, 0x64, 0xE1, 0x91, 0x03, 0x63, 0xE1, + 0x14, 0x3D, 0x03, 0x29, 0x14, 0x3D, 0x0B, 0x29, 0x02, 0xA1, 0x26, 0xE4, + 0x19, 0x28, 0x2E, 0xE4, 0x02, 0x02, 0x61, 0xE1, 0x20, 0xC4, 0x44, 0xCC, + 0x28, 0xE4, 0x01, 0x29, 0x44, 0x20, 0x84, 0xE1, 0x18, 0x05, 0x61, 0xE1, + 0x2E, 0xE4, 0x31, 0x81, 0x2E, 0xE4, 0x11, 0x3D, 0x1F, 0xC7, 0x08, 0xA2, + 0x07, 0x29, 0x9E, 0xE0, 0x18, 0x05, 0x00, 0xE0, 0x00, 0xE0, 0x2E, 0xE4, + 0x07, 0x3D, 0x0C, 0xA8, 0x0A, 0xA8, 0x07, 0x29, 0x9E, 0xE0, 0x18, 0x05, + 0x00, 0xE0, 0x81, 0x3C, 0x2E, 0xE4, 0x07, 0x3D, 0x06, 0xA8, 0x07, 0x29, + 0x9E, 0xE0, 0x18, 0x05, 0x81, 0x3C, 0x02, 0xA0, 0x81, 0x28, 0x07, 0x3D, + 0x81, 0x3C, 0x00, 0xA2, 0x28, 0xE4, 0x7F, 0x18, 0x9E, 0xE0, 0x18, 0x05, + 0x00, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x07, 0x3D, 0x56, 0xE0, 0x07, 0x29, + 0x02, 0xA1, 0x7F, 0x28, 0x18, 0x05, 0x61, 0xE1, 0x7B, 0x20, 0x84, 0xE1, + 0x01, 0xA2, 0x44, 0xCC, 0x41, 0xE0, 0x1A, 0xE0, 0x04, 0xA8, 0x11, 0x29, + 0x2E, 0xE4, 0x02, 0xB6, 0x02, 0xA2, 0x07, 0x1A, 0x02, 0xA1, 0x7F, 0x28, + 0x18, 0x05, 0x61, 0xE1, 0x8B, 0x20, 0x84, 0xE1, 0x00, 0xA2, 0x44, 0xCC, + 0x42, 0xE0, 0x1B, 0xE0, 0x07, 0xA8, 0x11, 0x2B, 0x2E, 0xE4, 0x1A, 0xE0, + 0x02, 0xA1, 0xEB, 0x18, 0x02, 0xA1, 0x7F, 0x28, 0x18, 0x05, 0x61, 0xE1, + 0x11, 0x29, 0x9A, 0x20, 0x84, 0xE1, 0x44, 0xCC, 0x2E, 0xE4, 0x90, 0xE1, + 0x28, 0xE4, 0x16, 0xE0, 0x18, 0x05, 0x04, 0xE0, 0x00, 0x3C, 0x81, 0x28, + 0x01, 0x29, 0x94, 0xE0, 0x92, 0xE0, 0x00, 0x08, 0x00, 0x3C, 0x02, 0xA0, + 0x00, 0x28, 0x0A, 0xF1, 0x00, 0x3C, 0x00, 0xA2, 0x38, 0xF0, 0x7F, 0x18, + 0x00, 0xA2, 0x08, 0xF7, 0x81, 0x18, 0x00, 0x28, 0x2E, 0xE4, 0x84, 0x3C, + 0xFE, 0xA2, 0x81, 0x3C, 0xC4, 0x3C, 0x02, 0xA2, 0x02, 0x3D, 0x0E, 0xA2, + 0x1E, 0xE4, 0x2E, 0xE4, 0x84, 0x3C, 0x00, 0x28, 0x07, 0xAE, 0x17, 0xE0, + 0x22, 0x2A, 0xF3, 0x20, 0x0A, 0xAE, 0xEA, 0x20, 0x1E, 0xE4, 0x55, 0xE0, + 0x2E, 0xE4, 0x02, 0x01, 0xC2, 0xE0, 0x56, 0xE0, 0x22, 0x2A, 0xF3, 0x20, + 0x1E, 0xE4, 0x92, 0xE0, 0x1E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, 0x17, 0xE0, + 0x83, 0xE0, 0x56, 0xE0, 0x06, 0xAE, 0xEA, 0x20, 0x13, 0x02, 0xC2, 0xE0, + 0x56, 0xE0, 0x0F, 0xAE, 0xF3, 0x20, 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, + 0x55, 0xE0, 0x09, 0xAE, 0x17, 0xE0, 0x22, 0x2A, 0x56, 0xE0, 0x06, 0xAE, + 0xEA, 0x20, 0x1E, 0xE4, 0xC2, 0xE0, 0x56, 0xE0, 0x0F, 0xAE, 0x83, 0xE0, + 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x15, 0x02, 0xC0, 0xE0, 0x2E, 0xE4, + 0x02, 0xA8, 0x06, 0xAF, 0xC0, 0xE0, 0x58, 0xF0, 0x80, 0xA8, 0x60, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x44, 0x00, 0x2E, 0xE4, 0x0E, 0xA8, + 0x20, 0xAF, 0x60, 0x00, 0x03, 0xAE, 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x56, 0xE0, 0x07, 0xA8, 0x1B, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0x13, 0xA2, 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, 0xC1, 0xE0, 0x2E, 0xE4, + 0x01, 0xA2, 0x2E, 0xE4, 0x2E, 0xE4, 0x07, 0xA8, 0x23, 0xAF, 0x44, 0x00, + 0x07, 0xA8, 0x23, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x13, 0xA2, + 0x39, 0xF0, 0x05, 0xA1, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x01, 0xA2, + 0xC0, 0xE0, 0x28, 0xE4, 0x02, 0xA8, 0x20, 0xAF, 0xC0, 0xE0, 0x2A, 0xE4, + 0x60, 0xA8, 0x60, 0x00, 0x88, 0xC7, 0xA4, 0xCC, 0x3E, 0xA8, 0x61, 0x00, + 0x9E, 0xE0, 0x00, 0x05, 0x00, 0xE0, 0x18, 0xE0, 0xC0, 0xE0, 0x0D, 0x04, + 0xC2, 0xE0, 0x02, 0xA2, 0x1E, 0xE4, 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, + 0xFC, 0x20, 0x1E, 0xE4, 0x04, 0xAF, 0xEF, 0x20, 0x49, 0x21, 0x0B, 0xE4, + 0x04, 0x21, 0x1E, 0xE4, 0x09, 0xAE, 0x09, 0x21, 0x1E, 0xE4, 0x1E, 0xA8, + 0x6E, 0x00, 0xC1, 0xE0, 0x20, 0xAE, 0x56, 0xE0, 0x17, 0x9F, 0x56, 0xE0, + 0xFF, 0x1F, 0x09, 0xE0, 0x64, 0xE1, 0x17, 0x9F, 0xC8, 0x21, 0x1E, 0xE4, + 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, + 0x14, 0x9E, 0x5A, 0x21, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, + 0x01, 0xA2, 0x17, 0x9F, 0x14, 0x9E, 0x62, 0x21, 0xEC, 0x3C, 0x2E, 0xE4, + 0x0D, 0x04, 0xC3, 0xE0, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x0F, 0x3E, + 0x0F, 0x08, 0x42, 0xE0, 0x11, 0xAE, 0x20, 0x00, 0x00, 0xE0, 0x5E, 0xF8, + 0x40, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x40, 0x0B, 0x11, 0xD1, 0x80, 0x01, + 0x13, 0x01, 0xEC, 0x88, 0xC0, 0x00, 0x12, 0xD1, 0x06, 0xA2, 0x2E, 0xE4, + 0xF9, 0xF7, 0x29, 0xCA, 0x66, 0x28, 0x67, 0x21, 0x1E, 0xE4, 0x01, 0xA2, + 0x24, 0xE4, 0x02, 0xA1, 0x7F, 0x28, 0x94, 0xE0, 0x1E, 0xE4, 0x0C, 0xC4, + 0x49, 0xE0, 0x92, 0xE0, 0x66, 0x2A, 0x8E, 0xF7, 0x82, 0xE0, 0x9E, 0x21, + 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x95, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, + 0x49, 0xF0, 0x23, 0xA1, 0x1E, 0xE4, 0x04, 0xC4, 0x7F, 0x2A, 0x95, 0xE0, + 0x86, 0xC7, 0xA4, 0xCC, 0x2E, 0xE4, 0x9E, 0x21, 0x9A, 0xE0, 0x40, 0x06, + 0x00, 0xE0, 0x18, 0xE0, 0x07, 0xAE, 0x9C, 0xE0, 0x00, 0x05, 0x00, 0xE0, + 0x1E, 0xE4, 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, 0xFC, 0x20, 0x1E, 0xE4, + 0x04, 0xAF, 0xF3, 0x20, 0x1E, 0xE4, 0x1E, 0xA8, 0x69, 0xF0, 0x89, 0xE0, + 0x20, 0xAE, 0x56, 0xE0, 0x09, 0xAE, 0x18, 0x21, 0x1E, 0xE4, 0x17, 0x9F, + 0x42, 0xE0, 0x85, 0xE0, 0xC8, 0x21, 0x1B, 0xE4, 0x89, 0xE0, 0xC4, 0x21, + 0x2E, 0xE4, 0xD3, 0x21, 0x1E, 0xE4, 0x17, 0x9F, 0x2E, 0xE4, 0x08, 0xAE, + 0x58, 0x4C, 0x57, 0x20, 0x60, 0x00, 0xC1, 0xE0, 0x58, 0x4C, 0x57, 0x20, + 0x58, 0x20, 0x39, 0xF0, 0x23, 0xA1, 0x23, 0xA8, 0x02, 0xA2, 0x2E, 0xE4, + 0x08, 0xAE, 0x57, 0x4C, 0x0E, 0x04, 0xC2, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, + 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0xE2, 0x21, 0x84, 0xE1, + 0x02, 0x00, 0x22, 0xD0, 0x22, 0xD0, 0x17, 0x9F, 0x15, 0x4D, 0x15, 0x21, + 0x16, 0x21, 0xE9, 0x21, 0x84, 0xE1, 0x02, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0x17, 0x9F, 0x16, 0x4D, 0x89, 0x3C, 0x56, 0x28, 0x2E, 0xE4, 0x0D, 0x04, + 0x88, 0x3C, 0x00, 0xA2, 0x32, 0xF0, 0x89, 0x28, 0x1E, 0xE4, 0x8E, 0x3C, + 0x8D, 0x3C, 0x00, 0xA2, 0x89, 0x28, 0x2A, 0xE4, 0x88, 0x28, 0x5C, 0x22, + 0x43, 0x01, 0xC2, 0xE0, 0x89, 0x28, 0x24, 0xE4, 0x00, 0xA2, 0x44, 0x01, + 0xC2, 0xE0, 0x8A, 0x28, 0x02, 0xA1, 0x8B, 0x28, 0x49, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0x02, 0xA1, 0x8C, 0x4C, 0x20, 0xAE, 0x20, 0xAE, 0xEF, 0x20, + 0x1E, 0xE4, 0x42, 0x01, 0x4E, 0x01, 0xC2, 0xE0, 0x42, 0xE0, 0x87, 0x2A, + 0x8C, 0x1A, 0x8E, 0x2A, 0x89, 0x28, 0x2E, 0xE4, 0x8E, 0x4C, 0x10, 0xAE, + 0x8D, 0x28, 0x23, 0xE4, 0x8F, 0x2A, 0x8F, 0x3E, 0x15, 0xB6, 0x03, 0xA2, + 0x56, 0xE0, 0x21, 0xAE, 0x03, 0xA9, 0x03, 0xAE, 0xC2, 0xE0, 0xE9, 0xF7, + 0x4B, 0x01, 0xC1, 0xE0, 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x4D, 0x01, + 0x8B, 0x1A, 0x8D, 0x3E, 0x03, 0xA0, 0x8D, 0x2A, 0x8E, 0x3E, 0x03, 0xA0, + 0x8E, 0x2A, 0x65, 0xF0, 0x88, 0x28, 0x2E, 0xE4, 0x8D, 0x3E, 0x01, 0xA2, + 0x32, 0xF0, 0x8C, 0x18, 0x8E, 0x28, 0x4A, 0xF1, 0x4B, 0x01, 0xC0, 0xE0, + 0xCE, 0xF7, 0x9E, 0xFD, 0xC2, 0xE0, 0x20, 0xAE, 0x04, 0xA2, 0xE8, 0xF7, + 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x4D, 0x01, 0xE8, 0xF7, 0x4B, 0x01, + 0xC0, 0xE0, 0x90, 0xE1, 0x84, 0x28, 0x2E, 0xE4, 0x89, 0x3C, 0x85, 0x28, + 0x84, 0x08, 0xB0, 0x01, 0x04, 0xE0, 0x24, 0xE4, 0x40, 0xA0, 0x02, 0x3F, + 0x57, 0x2A, 0x94, 0xE0, 0x2E, 0xE4, 0x02, 0x3F, 0x58, 0x2A, 0x94, 0xE0, + 0x94, 0xE0, 0x89, 0x08, 0xB0, 0x01, 0x04, 0xE0, 0x94, 0xE0, 0x40, 0xA0, + 0x8B, 0x3E, 0x02, 0x2B, 0x1E, 0xE4, 0x2E, 0xE4, 0x8C, 0x3E, 0x02, 0x2B, + 0x1E, 0xE4, 0x07, 0x24, 0x1E, 0xE4, 0x69, 0x23, 0x1E, 0xE4, 0x10, 0x23, + 0x1E, 0xE4, 0x54, 0x10, 0x59, 0x3C, 0x1E, 0x3C, 0x00, 0xA2, 0x62, 0x26, + 0x09, 0xC0, 0x7A, 0xF0, 0x83, 0x03, 0x1E, 0xE4, 0x08, 0xE4, 0x00, 0xC0, + 0x58, 0x4C, 0x59, 0x24, 0x58, 0x3C, 0x59, 0x34, 0x09, 0xC0, 0xD1, 0x22, + 0x1E, 0x24, 0x01, 0x25, 0x1E, 0xE4, 0x00, 0xC0, 0x46, 0xE0, 0x44, 0x4E, + 0x52, 0x26, 0x59, 0x4C, 0x77, 0x0C, 0x1E, 0xE4, 0x0B, 0x23, 0x02, 0xE4, + 0x08, 0xA1, 0xCA, 0xF1, 0x02, 0xA1, 0x5A, 0xF1, 0x0A, 0xE4, 0x0A, 0xA1, + 0x9A, 0xF1, 0x14, 0xF1, 0xF7, 0x22, 0x0A, 0xE4, 0x02, 0xA1, 0xF7, 0x22, + 0x04, 0xA1, 0xF2, 0x22, 0x0A, 0xE4, 0x02, 0xA1, 0x04, 0xE4, 0x0A, 0xA1, + 0xA1, 0x22, 0x0A, 0xE4, 0x7E, 0xF6, 0x4A, 0x0A, 0x1E, 0xE4, 0xFA, 0x22, + 0x59, 0x34, 0x09, 0xC0, 0x44, 0x4C, 0x52, 0x24, 0x82, 0x0A, 0x1E, 0xE4, + 0x00, 0xC0, 0x58, 0x3C, 0x92, 0x2A, 0x1A, 0xE0, 0x4E, 0x28, 0xEA, 0xF5, + 0xFA, 0x22, 0x08, 0xE4, 0x5A, 0xE0, 0x1B, 0xE0, 0xFA, 0x22, 0x08, 0xE4, + 0x93, 0x18, 0x4F, 0x28, 0x84, 0x24, 0x1E, 0xE4, 0xC9, 0x0C, 0x1E, 0xE4, + 0x52, 0x2C, 0x9A, 0xF0, 0x94, 0x28, 0xEA, 0xF4, 0x1E, 0xE4, 0x0E, 0x3C, + 0x44, 0x2C, 0x0D, 0x3C, 0x1E, 0xE4, 0x6E, 0x0C, 0x1E, 0xE4, 0x56, 0x25, + 0x4F, 0x28, 0x92, 0x3C, 0x4E, 0x28, 0xD4, 0x0C, 0x0A, 0xE4, 0x51, 0x0E, + 0x1E, 0xE4, 0x93, 0x3C, 0x09, 0xC0, 0x94, 0x3E, 0x01, 0xA2, 0x8A, 0x22, + 0x0D, 0x34, 0x00, 0xC0, 0x58, 0x4C, 0x59, 0x24, 0x46, 0xE0, 0x59, 0x4E, + 0x1E, 0x26, 0x0E, 0x3C, 0x56, 0x25, 0x10, 0xE4, 0x8A, 0x22, 0x04, 0xE4, + 0x00, 0xC0, 0x58, 0x4C, 0x59, 0x24, 0x09, 0xC0, 0x02, 0xE4, 0x46, 0xE0, + 0x44, 0x4E, 0x52, 0x2E, 0x5A, 0xF0, 0xBE, 0x06, 0x1E, 0xE4, 0x0B, 0x23, + 0x0B, 0x23, 0x0E, 0xE4, 0xDD, 0x06, 0x1E, 0xE4, 0x1E, 0xE4, 0x04, 0xA2, + 0x81, 0x22, 0x0E, 0xE4, 0x1E, 0xE4, 0x8A, 0x22, 0x0E, 0xE4, 0x52, 0x0A, + 0x59, 0x4C, 0x1E, 0x24, 0x1A, 0xF0, 0x47, 0x0C, 0x02, 0xE4, 0x46, 0xE0, + 0x44, 0x4E, 0x52, 0x26, 0x44, 0x2C, 0x0D, 0x3C, 0x52, 0x2C, 0x07, 0x23, + 0x92, 0x28, 0x56, 0x25, 0x1E, 0xE4, 0x0E, 0x3C, 0x1E, 0xE4, 0x4F, 0x3C, + 0x93, 0x28, 0x4E, 0x3C, 0x2E, 0xE4, 0xF8, 0xF7, 0xCC, 0xCB, 0x1D, 0x27, + 0x22, 0x4C, 0x04, 0xA2, 0xA8, 0xCF, 0x00, 0xA2, 0x36, 0x2A, 0x0A, 0xAE, + 0x37, 0x4C, 0x02, 0xAE, 0x32, 0x2A, 0x0A, 0xAE, 0x56, 0xE0, 0x3F, 0xA8, + 0x1D, 0x4C, 0x02, 0xAE, 0x56, 0xE0, 0x3F, 0xA8, 0x43, 0x4C, 0x02, 0xAE, + 0x2D, 0x4C, 0x02, 0xAE, 0x02, 0xAE, 0x1A, 0xE0, 0x4E, 0x28, 0x80, 0xCF, + 0x02, 0xAE, 0x1D, 0x4C, 0x02, 0xAE, 0x1B, 0x4C, 0x02, 0xA1, 0x57, 0x28, + 0xC2, 0xCF, 0x43, 0x4C, 0x3F, 0x4C, 0x02, 0xAE, 0x34, 0x4C, 0x02, 0xAE, + 0x43, 0x4C, 0x02, 0xAE, 0x42, 0x4C, 0x02, 0xAE, 0x85, 0xD1, 0x0B, 0x00, + 0xD3, 0xD1, 0x00, 0xCF, 0xC6, 0xCF, 0x6F, 0x4C, 0x6E, 0x24, 0x01, 0x00, + 0x61, 0xE1, 0x20, 0xC4, 0x01, 0x00, 0xE5, 0xD1, 0x0F, 0x00, 0x22, 0xD0, + 0x00, 0xA2, 0x01, 0x02, 0x02, 0xAE, 0x31, 0x2B, 0x4C, 0x23, 0x84, 0xE1, + 0x73, 0x4C, 0x72, 0x20, 0xE8, 0xCF, 0x2A, 0xB4, 0xEC, 0xCF, 0x75, 0x4C, + 0x74, 0x20, 0xEA, 0xCF, 0x04, 0xE0, 0xEE, 0xCF, 0x77, 0x4C, 0x76, 0x20, + 0x3B, 0xF0, 0x03, 0xA8, 0xCF, 0xCB, 0x60, 0x00, 0x61, 0xE1, 0x30, 0xCE, + 0x70, 0x00, 0x04, 0xE0, 0x84, 0xE1, 0x1F, 0x00, 0x22, 0xD0, 0x60, 0x02, + 0x32, 0xCE, 0x11, 0x4D, 0x11, 0x21, 0x67, 0x23, 0xF6, 0x07, 0x61, 0xE1, + 0x00, 0xA2, 0x2E, 0xE4, 0x68, 0x4C, 0x67, 0x28, 0x11, 0x3D, 0x07, 0xC7, + 0xF6, 0x07, 0x61, 0xE1, 0x2E, 0xE4, 0x28, 0xF0, 0x9A, 0xF3, 0x67, 0x28, + 0x00, 0x3C, 0x0E, 0xA2, 0x08, 0xF1, 0x02, 0xA8, 0x00, 0x5C, 0x69, 0x28, + 0x02, 0xA2, 0x49, 0xF0, 0x0F, 0xA1, 0x00, 0x2A, 0x09, 0xA1, 0x00, 0x2A, + 0x7E, 0xF1, 0x11, 0x3D, 0x1E, 0xF1, 0x11, 0x3D, 0x04, 0xA2, 0x49, 0xF0, + 0x6B, 0x28, 0xEE, 0xF0, 0x11, 0x3D, 0x0A, 0xA2, 0x00, 0x28, 0x8A, 0xF0, + 0x02, 0xA8, 0x00, 0x5C, 0x03, 0xA2, 0x24, 0xF0, 0x05, 0xA2, 0x0A, 0xA1, + 0x11, 0x3D, 0x06, 0xA2, 0x3E, 0xF0, 0x11, 0x3F, 0x02, 0xA1, 0x00, 0x3C, + 0x02, 0xA1, 0x00, 0x28, 0xFF, 0x00, 0x0C, 0xE0, 0x69, 0x28, 0xC8, 0xF5, + 0x02, 0xA8, 0x00, 0x5C, 0x56, 0xE0, 0x6B, 0x2A, 0x55, 0xB6, 0x00, 0x28, + 0x03, 0xA2, 0x6A, 0xF0, 0x11, 0x3D, 0x06, 0xA2, 0x3E, 0xF0, 0x11, 0x3F, + 0xEA, 0xF6, 0x00, 0x3C, 0x02, 0xA1, 0x00, 0x28, 0x00, 0x3C, 0x0E, 0xA2, + 0xF6, 0x07, 0x61, 0xE1, 0x00, 0x5C, 0x6A, 0x28, 0x2A, 0xE4, 0x68, 0x28, + 0x0E, 0xA1, 0x00, 0x28, 0x88, 0xF1, 0x02, 0xA8, 0x11, 0x81, 0x3B, 0xF0, + 0x67, 0x2A, 0x88, 0xF0, 0xBE, 0xF1, 0x11, 0x3D, 0x02, 0xA2, 0xE9, 0xF1, + 0x67, 0x2A, 0x89, 0xF0, 0x09, 0xA1, 0x00, 0x2A, 0x04, 0xA2, 0x49, 0xF1, + 0x11, 0x81, 0x3B, 0xF0, 0x11, 0x3D, 0x0A, 0xA2, 0x1E, 0xF1, 0x11, 0x3D, + 0x02, 0xA8, 0x00, 0x5C, 0x6C, 0x28, 0xEE, 0xF0, 0x05, 0xA2, 0x0A, 0xA1, + 0x00, 0x28, 0x8A, 0xF0, 0x3E, 0xF0, 0x11, 0x3F, 0x03, 0xA2, 0x24, 0xF0, + 0x02, 0xA1, 0x00, 0x28, 0x11, 0x3D, 0x08, 0xA2, 0x6A, 0x28, 0x48, 0xF5, + 0x02, 0xA1, 0x00, 0x3C, 0x68, 0xF0, 0x02, 0xA8, 0x67, 0x4C, 0x00, 0x5C, + 0x11, 0x3F, 0x55, 0xB6, 0x00, 0x28, 0x03, 0xA2, 0xFF, 0x00, 0x0C, 0xE0, + 0x6C, 0x28, 0x6E, 0xF1, 0x02, 0xA8, 0x00, 0x5C, 0x52, 0xE0, 0x6A, 0x2A, + 0x02, 0xA8, 0x00, 0x5C, 0x6A, 0x28, 0xC8, 0xF0, 0x55, 0xB6, 0x00, 0x28, + 0x03, 0xA2, 0x6A, 0xF0, 0x3E, 0xF0, 0x11, 0x81, 0x5E, 0xF0, 0x11, 0x3F, + 0x02, 0xA1, 0x00, 0x28, 0x11, 0x3D, 0x08, 0xA2, 0x02, 0xA2, 0x2E, 0xE4, + 0xEA, 0xF5, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0xA2, 0x3C, 0x01, 0xC2, 0xE0, + 0x62, 0xE1, 0xF6, 0x07, 0x61, 0xE1, 0x01, 0x3C, 0x66, 0xF0, 0x04, 0xA1, + 0x11, 0x29, 0x78, 0x08, 0x04, 0xA0, 0x50, 0x24, 0x0A, 0xE4, 0x06, 0xA1, + 0x04, 0x3C, 0x06, 0xAE, 0x04, 0xA0, 0x02, 0xF1, 0x04, 0x28, 0x54, 0xF0, + 0x0C, 0xA1, 0x00, 0x28, 0x04, 0xE0, 0x04, 0x3C, 0x30, 0xA0, 0x04, 0xAE, + 0x9E, 0xF2, 0x04, 0x3C, 0x04, 0x08, 0x00, 0x08, 0x03, 0x3E, 0x11, 0xA2, + 0x02, 0x3E, 0x01, 0xA2, 0x02, 0x3E, 0xE0, 0x00, 0x05, 0xE0, 0x4A, 0xF0, + 0x0C, 0xA1, 0x09, 0xAE, 0x00, 0x2A, 0x00, 0x28, 0x05, 0xE0, 0x58, 0xF0, + 0x02, 0xA1, 0x5A, 0xF0, 0x02, 0x0A, 0x03, 0x3C, 0x40, 0xA2, 0xA0, 0x00, + 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x02, 0x3E, 0x02, 0x08, 0x42, 0xE0, + 0x11, 0xAE, 0x35, 0x00, 0x03, 0x28, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, + 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x24, 0xCE, 0x04, 0x3C, 0x00, 0x06, + 0x04, 0xE0, 0xF8, 0xF7, 0x24, 0xF0, 0x0F, 0xA2, 0x0C, 0xA1, 0x00, 0x28, + 0x96, 0xE0, 0x04, 0x28, 0x45, 0xCC, 0x3F, 0xA2, 0x01, 0x08, 0x12, 0x29, + 0x6A, 0x24, 0x84, 0xE1, 0x11, 0xAF, 0x03, 0x2B, 0x3E, 0x01, 0xC2, 0xE0, + 0x01, 0x08, 0x12, 0x29, 0x3F, 0x01, 0xC3, 0xE0, 0x09, 0xE0, 0x13, 0x2B, + 0x3E, 0x01, 0xC2, 0xE0, 0x62, 0xE1, 0x3F, 0x01, 0xC3, 0xE0, 0xFF, 0x00, + 0x01, 0x3E, 0x21, 0xA0, 0x01, 0x2A, 0x78, 0x08, 0x0C, 0xA1, 0x00, 0x3C, + 0x02, 0xA0, 0x00, 0x28, 0x88, 0x08, 0x62, 0xE1, 0x11, 0x24, 0x04, 0xE4, + 0x01, 0x3E, 0x61, 0xA0, 0x11, 0x24, 0x0A, 0xE4, 0x6A, 0xE1, 0x11, 0x24, + 0x08, 0xE4, 0x04, 0xA1, 0x2E, 0xE4, 0x3C, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x65, 0x0D, 0x1E, 0xE4, 0x94, 0x3C, 0x00, 0xA2, 0x19, 0xE4, 0x43, 0x2A, + 0xFE, 0x24, 0x0D, 0xE4, 0x46, 0xE0, 0x44, 0x4E, 0x52, 0x26, 0x7D, 0x0F, + 0x0D, 0xE4, 0x12, 0xBC, 0xFE, 0x24, 0x02, 0xE4, 0x04, 0xA1, 0xA8, 0xB4, + 0x0A, 0xA1, 0xFE, 0x24, 0x0D, 0xE4, 0xFE, 0xBD, 0xFE, 0x24, 0x00, 0xE4, + 0x02, 0xA2, 0x3A, 0xF0, 0x29, 0x18, 0xFE, 0x24, 0x3A, 0xF0, 0x39, 0x1C, + 0x13, 0x74, 0x94, 0x3C, 0xD8, 0xF0, 0x1B, 0x28, 0x94, 0x3C, 0x02, 0xA2, + 0x02, 0xA2, 0x3A, 0xF0, 0x3F, 0x18, 0x40, 0xBA, 0x40, 0xBA, 0x6A, 0xF0, + 0x3F, 0x28, 0x94, 0x3C, 0x94, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, 0x42, 0x18, + 0x65, 0x0D, 0x1E, 0xE4, 0x9A, 0xF0, 0x4F, 0x28, 0x3A, 0xF0, 0x45, 0x1C, + 0xFE, 0x24, 0x0D, 0xE4, 0x02, 0xA1, 0x16, 0x28, 0x94, 0x3C, 0x02, 0xA2, + 0x17, 0x74, 0x4E, 0xF3, 0xBA, 0xF1, 0x34, 0xF0, 0x3A, 0xF0, 0x00, 0x1D, + 0x03, 0x09, 0x60, 0xE1, 0x16, 0xE0, 0x3F, 0x28, 0x94, 0x3C, 0x02, 0xA2, + 0x81, 0x0D, 0x1E, 0xE4, 0x9A, 0xF2, 0x2A, 0x44, 0x11, 0x11, 0x04, 0x09, + 0x61, 0xE1, 0xED, 0xF2, 0x94, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, 0x01, 0x1D, + 0xBE, 0xF1, 0x81, 0x0D, 0x18, 0xE4, 0xEE, 0xF1, 0x81, 0x0D, 0x1E, 0xE4, + 0x98, 0xF1, 0x18, 0x28, 0x13, 0x11, 0x03, 0x09, 0x63, 0xE1, 0xED, 0xF1, + 0x94, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, 0x03, 0x1D, 0xBA, 0xF0, 0x2A, 0x44, + 0x16, 0xE0, 0x3F, 0x28, 0x65, 0xE1, 0x0D, 0xF1, 0x81, 0x0D, 0x1E, 0xE4, + 0x3A, 0xF0, 0x05, 0x1D, 0x15, 0x11, 0x05, 0x09, 0xEC, 0x0C, 0x1E, 0xE4, + 0x94, 0x3C, 0x02, 0xA2, 0x34, 0xF0, 0x46, 0xE0, 0x73, 0xC8, 0x06, 0xAE, + 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, 0xF9, 0x0C, 0x1E, 0xE4, + 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0xC8, 0xF0, 0xF5, 0x0C, 0x1E, 0xE4, + 0xF9, 0x0C, 0x1E, 0xE4, 0xE9, 0x09, 0x1E, 0xE4, 0xFF, 0x00, 0x36, 0xD0, + 0xEF, 0x09, 0x1E, 0xE4, 0x09, 0xC0, 0x6A, 0xE1, 0x80, 0x00, 0x37, 0xD0, + 0x1E, 0x34, 0x00, 0xC0, 0x58, 0x4C, 0x59, 0x24, 0x1E, 0xE4, 0x0C, 0x3C, + 0x00, 0xA2, 0x59, 0x3C, 0x1E, 0xE4, 0x08, 0xF2, 0x2D, 0x28, 0x7C, 0x25, + 0x52, 0x26, 0x59, 0x4C, 0x1E, 0x24, 0x54, 0x03, 0x1E, 0xE4, 0xF2, 0xF0, + 0x46, 0xE0, 0x44, 0x4E, 0x18, 0xE4, 0x43, 0x28, 0xBD, 0xF2, 0xC3, 0x25, + 0x02, 0xA1, 0x86, 0xCB, 0x7D, 0xF2, 0xC3, 0x25, 0x38, 0x25, 0x18, 0xE4, + 0x94, 0xC8, 0xF0, 0xF6, 0x2E, 0xE4, 0x9D, 0x0D, 0x1E, 0xE4, 0xB8, 0xF6, + 0x1A, 0xB6, 0x02, 0xA2, 0xDF, 0x09, 0x1E, 0xE4, 0xAF, 0x25, 0x1E, 0xE4, + 0x2E, 0xE4, 0x6A, 0xE1, 0x59, 0x4C, 0x1E, 0x24, 0x54, 0x03, 0x1E, 0xE4, + 0xA2, 0xF0, 0x46, 0xE0, 0x44, 0x4E, 0x52, 0x26, 0x43, 0x28, 0xAD, 0xF0, + 0xC3, 0x25, 0x1E, 0xE4, 0x60, 0xBB, 0x6D, 0xF0, 0xC3, 0x25, 0x18, 0xE4, + 0x2E, 0xE4, 0x9F, 0x0D, 0x1E, 0xE4, 0x0A, 0xF7, 0x05, 0x3C, 0x38, 0x28, + 0x2E, 0xE4, 0x6A, 0xE1, 0x02, 0xA2, 0x38, 0x3C, 0x16, 0xE0, 0x4F, 0x28, + 0x05, 0x28, 0x7C, 0x25, 0x1E, 0xE4, 0x0C, 0x3C, 0x1E, 0xE4, 0x0C, 0x3C, + 0x00, 0xA2, 0x38, 0x3C, 0x0D, 0x2E, 0x59, 0x4C, 0x1E, 0x2C, 0x54, 0x03, + 0x1E, 0xE4, 0x12, 0xF1, 0x46, 0xE0, 0x0E, 0x4E, 0x03, 0x26, 0x18, 0xE4, + 0x43, 0x28, 0x03, 0x26, 0x00, 0xC0, 0x5A, 0x4C, 0x5B, 0x24, 0x09, 0xC0, + 0x5B, 0x34, 0x09, 0xC0, 0x43, 0x08, 0x02, 0xA0, 0x2E, 0xE4, 0x9E, 0xF6, + 0x00, 0xC0, 0x5A, 0x3C, 0x04, 0xAE, 0x1A, 0xE0, 0x36, 0x18, 0x32, 0x28, + 0x0A, 0xAE, 0x4C, 0x4C, 0x0A, 0xAE, 0x4B, 0x4C, 0x0A, 0xAE, 0x49, 0x28, + 0x30, 0xCF, 0x4D, 0x4C, 0x82, 0xCF, 0x38, 0x4C, 0x04, 0xAE, 0x48, 0x4C, + 0x96, 0xCF, 0x4A, 0x28, 0x00, 0x00, 0xC3, 0xD1, 0x02, 0xAE, 0x48, 0x4C, + 0x08, 0xAE, 0x49, 0x28, 0x02, 0xAE, 0x79, 0x4C, 0x02, 0xAE, 0x7A, 0x4C, + 0x04, 0xAE, 0x46, 0x4C, 0x02, 0xAE, 0x78, 0x4C, 0xFA, 0x01, 0x5E, 0x88, + 0xC4, 0xCF, 0x38, 0x4C, 0x0C, 0x28, 0xC8, 0xCF, 0x71, 0x4C, 0x70, 0x24, + 0x88, 0xD1, 0x3A, 0xF0, 0x38, 0x28, 0x3A, 0xF0, 0x28, 0xE4, 0x04, 0xA1, + 0x38, 0x28, 0x01, 0x00, 0x68, 0xC8, 0x2E, 0xE4, 0x02, 0x00, 0xE5, 0xD1, + 0x04, 0xE0, 0x9E, 0x74, 0x9E, 0x3C, 0x0E, 0xA8, 0x88, 0xCC, 0x50, 0xBA, + 0x86, 0xCC, 0xFE, 0x01, 0x0C, 0xAE, 0x47, 0x08, 0x1A, 0xE0, 0x38, 0x28, + 0x03, 0x00, 0x40, 0xD0, 0x82, 0xCC, 0x4A, 0x4C, 0x85, 0xD1, 0x2E, 0xE4, + 0xF8, 0xF7, 0x84, 0xC8, 0x90, 0xE1, 0x3F, 0x00, 0xD0, 0xD1, 0x02, 0x00, + 0x18, 0xE4, 0xFD, 0x0C, 0x1E, 0xE4, 0x80, 0xE1, 0x10, 0xA8, 0xA0, 0xCB, + 0x81, 0xE1, 0x58, 0x0D, 0xB8, 0xF7, 0xF9, 0x25, 0x09, 0xE4, 0xA3, 0xCB, + 0xF8, 0xF7, 0xE0, 0xCB, 0xD7, 0x26, 0x1E, 0xE4, 0xA0, 0xCB, 0xFE, 0x26, + 0x1A, 0xE4, 0x5A, 0x28, 0xC8, 0xF7, 0xF9, 0x25, 0x09, 0xE4, 0xA3, 0xCB, + 0x04, 0x00, 0x85, 0xD1, 0x01, 0x00, 0x86, 0xD1, 0x1E, 0x34, 0x06, 0xCB, + 0x15, 0x27, 0x1E, 0xE4, 0x28, 0xF0, 0xFE, 0xFF, 0x02, 0xE0, 0x59, 0x3C, + 0x2D, 0x44, 0x04, 0xAF, 0x8A, 0xCB, 0x90, 0xE1, 0x86, 0xCC, 0xFE, 0x01, + 0x04, 0xE0, 0x2A, 0xE4, 0x01, 0x00, 0x40, 0xD0, 0x88, 0xCC, 0x50, 0xBA, + 0xD1, 0xD1, 0x00, 0x00, 0xD0, 0xD1, 0x2E, 0xE4, 0xE0, 0xCB, 0xF8, 0xF7, + 0x1C, 0xCB, 0x00, 0x00, 0x85, 0xD1, 0x2E, 0xE4, 0x6B, 0xE1, 0xF8, 0xF7, + 0xC2, 0xD1, 0x00, 0x00, 0x86, 0xD1, 0x02, 0x00, 0xC4, 0xD1, 0x00, 0x00, + 0xC5, 0xD1, 0x01, 0x00, 0xA0, 0xCB, 0x0E, 0x00, 0xD0, 0xD1, 0x00, 0x00, + 0x1A, 0xE0, 0x55, 0x4C, 0x54, 0x20, 0xF8, 0xF7, 0x00, 0x00, 0xC2, 0xD1, + 0x98, 0xF0, 0xC4, 0xCF, 0x03, 0x00, 0xC4, 0xD1, 0x03, 0x00, 0xC5, 0xD1, + 0x20, 0x00, 0xD0, 0xD1, 0x00, 0x00, 0xC8, 0xD1, 0xC2, 0xE0, 0x00, 0xA2, + 0xD7, 0x26, 0x1E, 0xE4, 0x5A, 0x28, 0xF8, 0xF7, 0xE0, 0xCB, 0x26, 0x01, + 0xF8, 0xF7, 0xA0, 0xCB, 0xFE, 0x26, 0x1A, 0xE4, 0x04, 0x00, 0x85, 0xD1, + 0x01, 0x00, 0x86, 0xD1, 0x1E, 0x34, 0x06, 0xCB, 0x15, 0x27, 0x1E, 0xE4, + 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x59, 0x3C, 0xC2, 0xE0, 0x3D, 0x01, + 0xC2, 0xE0, 0x00, 0x01, 0x92, 0xB6, 0x88, 0x2A, 0x8E, 0xCC, 0x25, 0x01, + 0x78, 0x01, 0xC2, 0xE0, 0x1C, 0xA9, 0x08, 0xAE, 0x4E, 0x28, 0x79, 0x01, + 0xC2, 0xE0, 0x18, 0xA2, 0x56, 0xE0, 0x17, 0xE0, 0x13, 0x21, 0x1E, 0xE4, + 0x1E, 0xE4, 0xC8, 0x20, 0x1E, 0xE4, 0x50, 0xB6, 0x1E, 0xE4, 0x52, 0xB6, + 0x16, 0xB6, 0x13, 0x21, 0x10, 0x02, 0xC2, 0xE0, 0x02, 0xA2, 0xD9, 0x20, + 0xC2, 0xE0, 0x08, 0xAE, 0x58, 0x4C, 0x57, 0x20, 0x1E, 0xE4, 0x05, 0x02, + 0xC2, 0xE0, 0x01, 0x01, 0x50, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xBB, 0x20, + 0x08, 0x3C, 0x7F, 0x00, 0x08, 0xE0, 0x49, 0xE0, 0x09, 0x3E, 0x7F, 0x00, + 0x09, 0xE0, 0x11, 0xAF, 0x08, 0x2A, 0x00, 0xA2, 0x08, 0x3E, 0x08, 0x46, + 0x08, 0x2A, 0x04, 0xA9, 0x2B, 0xF0, 0x03, 0xA8, 0x08, 0x2A, 0x12, 0xA9, + 0x2B, 0xF0, 0x05, 0xA8, 0x08, 0x2A, 0x40, 0xA9, 0x2B, 0xF0, 0x09, 0xA8, + 0xC2, 0xE0, 0x80, 0xA9, 0x2B, 0xF0, 0x11, 0xA8, 0x04, 0xE0, 0x46, 0x00, + 0xC1, 0xE0, 0x0C, 0x04, 0x09, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x02, 0x00, + 0xCB, 0x05, 0x61, 0xE1, 0x5B, 0xF0, 0x03, 0xA8, 0xC1, 0xE0, 0x0E, 0xCF, + 0x11, 0x4D, 0x11, 0x21, 0x10, 0xAE, 0x92, 0x00, 0x04, 0xE0, 0x46, 0x00, + 0x5B, 0xF0, 0x05, 0xA8, 0x09, 0x2A, 0x42, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0xCD, 0x05, 0x61, 0xE1, 0x46, 0x00, 0xC1, 0xE0, 0x03, 0x01, 0xC2, 0xE0, + 0x42, 0xE0, 0x10, 0xAE, 0xF2, 0x00, 0x04, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, + 0x09, 0xA8, 0x09, 0x2A, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xCF, 0x05, + 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x11, 0x02, 0x10, 0xAE, 0x80, 0x00, + 0x00, 0xE0, 0xF2, 0x00, 0x5B, 0xF0, 0x11, 0xA8, 0x09, 0x2A, 0x42, 0xE0, + 0x11, 0x4D, 0x11, 0x21, 0xD1, 0x05, 0x61, 0xE1, 0x02, 0xAE, 0x43, 0x28, + 0x12, 0x02, 0xC2, 0xE0, 0xC2, 0xE0, 0x42, 0x4C, 0x02, 0xAE, 0x3F, 0x4C, + 0x00, 0xA2, 0x04, 0x02, 0xC2, 0xE0, 0x04, 0x01, 0x21, 0x27, 0x1E, 0xE4, + 0x08, 0x02, 0xC2, 0xE0, 0x1E, 0xE4, 0x12, 0x03, 0xC2, 0xE0, 0x0E, 0xA2, + 0x02, 0xA2, 0x9E, 0x02, 0x1E, 0xE4, 0x64, 0x01, 0x02, 0xCB, 0x2E, 0xE4, + 0x06, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x13, 0x01, 0xC2, 0xE0, 0x02, 0xAF, + 0x56, 0xE0, 0x03, 0xAE, 0x15, 0xCB, 0x0D, 0x03, 0xC2, 0xE0, 0x94, 0xCB, + 0x2B, 0x02, 0xC2, 0xE0, 0x26, 0x01, 0xC2, 0xE0, 0xA4, 0xCB, 0x15, 0x01, + 0x02, 0xA8, 0x14, 0x01, 0xC2, 0xE0, 0x8A, 0xCB, 0x0A, 0xAE, 0x14, 0xCB, + 0x2A, 0xE4, 0x5A, 0x3C, 0x20, 0x01, 0xC2, 0xE0, 0x56, 0xE0, 0x19, 0xCB, + 0x8E, 0xCB, 0x21, 0x01, 0xC2, 0xE0, 0x8C, 0xCB, 0xC2, 0xE0, 0x90, 0xCB, + 0x22, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0xD0, 0xCB, 0x2E, 0xE4, 0x23, 0x01, + 0x09, 0x03, 0xC2, 0xE0, 0xD2, 0xCB, 0x0C, 0x03, 0xDA, 0xCB, 0x0A, 0x03, + 0xC2, 0xE0, 0xD8, 0xCB, 0xC2, 0xE0, 0x5E, 0x28, 0x0B, 0x03, 0xC2, 0xE0, + 0xC2, 0xE0, 0x5F, 0x28, 0x2A, 0xE4, 0x20, 0x03, 0x22, 0x03, 0xC2, 0xE0, + 0xF6, 0xCB, 0x21, 0x03, 0xC2, 0xE0, 0x02, 0xA2, 0x8E, 0xF8, 0x2E, 0xE4, + 0x15, 0x22, 0x18, 0xE4, 0x88, 0x28, 0x10, 0x01, 0xE8, 0xF7, 0x11, 0x01, + 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0x03, 0xC2, 0xE0, 0x02, 0xA2, 0x2E, 0xE4, + 0x60, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x20, 0xA2, 0x62, 0xE1, 0x03, 0x02, + 0x61, 0xE1, 0x04, 0x00, 0x84, 0xE1, 0x80, 0x03, 0x63, 0xE1, 0x02, 0x02, + 0x29, 0xF0, 0x32, 0x2B, 0x31, 0x29, 0x39, 0x27, 0x13, 0x81, 0x03, 0x9F, + 0x08, 0xB6, 0x83, 0x28, 0x00, 0xA2, 0x90, 0xE1, 0x13, 0x81, 0x13, 0x81, + 0x90, 0xE1, 0x2E, 0xE4, 0x02, 0x03, 0xC2, 0xE0, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0xE4, + 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x88, 0x03, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0xA2, 0x03, 0x0E, 0xE4, 0x78, 0x00, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, + 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, 0x9A, 0xF0, 0x4A, 0x00, + 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, 0x00, 0xA2, 0xED, 0x3C, + 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0xC2, 0xE0, + 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0x5D, 0x00, 0xC3, 0xE0, + 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, 0x2A, 0x24, 0x71, 0xD0, + 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, 0x1E, 0xE4, 0x81, 0xE1, + 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, 0x59, 0x00, 0xC0, 0xE0, + 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x88, 0x03, 0x00, 0xE0, 0x02, 0xAE, + 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, 0xC0, 0xE0, 0xEE, 0x3C, + 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, 0xC1, 0xE0, 0x5B, 0x00, + 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, 0x1E, 0xE4, 0x2A, 0xE4, + 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, 0x9E, 0xE0, 0x42, 0x01, + 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0xED, 0x5A, 0x03, 0xA2, + 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0xC2, 0xE0, 0x58, 0x00, + 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, 0x0E, 0xF0, 0x08, 0x00, + 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x98, 0xF1, + 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, 0x03, 0x00, 0x04, 0xE0, + 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, 0x0A, 0xE0, 0x20, 0xAE, + 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, 0x02, 0xA2, 0x4E, 0xF6, + 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, 0x03, 0xA1, 0x3E, 0xA2, + 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, 0x4E, 0xA2, 0x5B, 0xF3, + 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, 0x40, 0x00, 0x04, 0xE0, + 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, 0x8B, 0xF2, 0x03, 0xA1, + 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, 0xC1, 0xE0, 0x00, 0xA2, + 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, 0xCB, 0xF1, 0x5E, 0x00, + 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, 0x46, 0x00, 0x04, 0xE0, + 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, + 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, 0x04, 0xE0, 0x7B, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA1, 0x68, 0x00, + 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, 0x00, 0x00, 0x11, 0xD1, + 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, + 0x5E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, 0x2A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0xC0, 0xE0, + 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x31, 0x01, + 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, 0xA8, 0x03, 0x04, 0xE0, + 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0x04, 0xE0, 0x2E, 0xE4, + 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, 0x7C, 0xE6, 0xAA, 0x03, + 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, 0x11, 0x3D, 0x09, 0x0B, + 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, + 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x00, + 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, 0xEC, 0x88, 0x00, 0x0C, + 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xEE, 0x01, 0x07, 0xA1, 0xD6, 0xB6, + 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, 0x00, 0xE0, 0x36, 0xB6, + 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x14, 0x04, + 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, 0x44, 0x00, 0xC1, 0xE0, + 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, + 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, 0x17, 0x35, 0x56, 0xE0, + 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, 0x50, 0x01, 0xC2, 0xE0, + 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, + 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, 0x1A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x86, 0x01, + 0x47, 0x00, 0xC0, 0xE0, 0x90, 0x01, 0x1A, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, + 0x48, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x3E, 0xA2, 0x2E, 0xE4, 0x4A, 0x00, + 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x02, 0xA2, 0x2E, 0xE4, 0x70, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0x00, 0xA2, 0x76, 0x00, 0xC2, 0xE0, 0x20, 0xA2, + 0xC2, 0xE0, 0xFC, 0xA2, 0x72, 0x00, 0xC2, 0xE0, 0x71, 0x00, 0xC2, 0xE0, + 0xFA, 0xA2, 0x77, 0x00, 0x84, 0xE1, 0x0F, 0x27, 0x22, 0xD0, 0x2E, 0xE4, + 0x48, 0xF0, 0x4A, 0x00, 0xC0, 0xE0, 0xAA, 0x01, 0xC0, 0xE0, 0xE8, 0xF7, + 0x1F, 0x04, 0xC0, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, + 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x11, 0x00, + 0x04, 0xE0, 0x9D, 0x01, 0xAF, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, 0x3C, 0x04, + 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, + 0xE0, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, 0x45, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x3C, 0x04, 0x28, 0xE4, 0x04, 0xA1, 0x0E, 0xA8, 0x04, 0xAF, + 0xC0, 0xE0, 0x4A, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x48, 0xCA, 0x8E, 0xF9, + 0xE8, 0xF7, 0x11, 0x01, 0xAF, 0x01, 0x1E, 0xE4, 0xE8, 0xF7, 0x02, 0xA8, + 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, + 0xF8, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, 0xF8, 0xF7, 0x28, 0xCA, + 0x2E, 0xE4, 0x3C, 0x04, 0x42, 0x3C, 0x43, 0x34, 0x01, 0xC0, 0x2E, 0xE4, + 0x43, 0x2C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x09, 0xC0, 0x2A, 0xE4, + 0x00, 0xC0, 0x42, 0x2E, 0x46, 0xE0, 0x00, 0xC0, 0x56, 0x4E, 0x57, 0x26, + 0x57, 0x18, 0x10, 0xAF, 0x4A, 0xE0, 0xB4, 0xF0, 0x58, 0x1A, 0xFF, 0x00, + 0x09, 0xE0, 0x74, 0xF0, 0xFE, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x34, 0xF0, + 0x1E, 0xF1, 0x5D, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x01, 0xC0, 0xEE, 0xF0, + 0x5E, 0x3C, 0x01, 0xC0, 0x5F, 0x3C, 0x01, 0xC0, 0xBE, 0xF0, 0x5E, 0x28, + 0x5E, 0x1A, 0x5D, 0x2A, 0x01, 0xC0, 0x8E, 0xF0, 0x5F, 0x2A, 0x01, 0xC0, + 0x3E, 0xF0, 0x1B, 0xE0, 0x08, 0x08, 0xC2, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0x02, 0x08, 0x62, 0xE1, 0x0B, 0x08, 0xC3, 0xE0, 0x12, 0x9F, 0x00, 0xA2, + 0x12, 0x9F, 0x02, 0xA2, 0x92, 0x9F, 0x00, 0x02, 0x05, 0xE0, 0x12, 0x9F, + 0x82, 0xE0, 0x12, 0x81, 0x12, 0x9F, 0x12, 0x9F, 0x12, 0x81, 0x12, 0x9F, + 0x00, 0xA2, 0x12, 0x9F, 0xC0, 0xE0, 0x00, 0x08, 0xC2, 0xE0, 0x02, 0xA2, + 0x02, 0xAE, 0x2E, 0xE4, 0xE8, 0xF7, 0x00, 0x08, 0x02, 0xAF, 0xFF, 0xFF, + 0x08, 0xE0, 0x00, 0x34, 0x1E, 0xAE, 0x18, 0xE0, 0x00, 0x82, 0x01, 0x3C, + 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0xE0, 0x01, 0x82, 0x32, 0xA2, 0x20, 0x06, + 0x60, 0xD1, 0x5E, 0x02, 0x40, 0xCE, 0x2E, 0xE4, 0xC0, 0xCE, 0x18, 0xAE, + 0x02, 0x00, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, 0x02, 0xA8, 0x48, 0xCA, + 0x80, 0x00, 0x23, 0xD1, 0x22, 0xAE, 0x04, 0xA2, 0x2E, 0xE4, 0xE8, 0xF7, + 0x8C, 0xCC, 0x72, 0xCC, 0x00, 0xA2, 0x9E, 0xCC, 0x20, 0xAE, 0x10, 0xA8, + 0x04, 0xE0, 0x8E, 0xCC, 0x6F, 0xD1, 0x4A, 0xCE, 0x22, 0x93, 0x0A, 0xE0, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x03, 0x00, 0x60, 0xA2, 0x2E, 0xE4, + 0x00, 0x00, 0x6F, 0xD1, 0xEA, 0xF7, 0x02, 0xA8, 0x50, 0xCA, 0x50, 0xCE, + 0x20, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0xC2, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0x50, 0xCE, 0x3D, 0x04, 0xC1, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, + 0x00, 0x01, 0x0A, 0xE0, 0xD9, 0xF7, 0xEF, 0xA1, 0x1E, 0xE4, 0x2E, 0xE4, + 0x1C, 0x04, 0xC2, 0xE0, 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0xD2, 0x02, + 0x82, 0x02, 0x1E, 0xE4, 0x1F, 0x00, 0x08, 0xE0, 0x47, 0x03, 0x1E, 0xE4, + 0x0D, 0x03, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x12, 0xAE, + 0xF8, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x37, 0x03, 0x04, 0xA8, 0x10, 0x02, + 0xC0, 0xE0, 0x2A, 0xE4, 0x08, 0xE0, 0x15, 0x02, 0xC0, 0xE0, 0x18, 0xF1, + 0x16, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, 0x08, 0xE0, 0x13, 0x02, + 0xC0, 0xE0, 0xBE, 0xF0, 0x14, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, + 0x1E, 0xE4, 0x0B, 0x02, 0xC0, 0xE0, 0x3E, 0xF0, 0x1E, 0xE4, 0x0D, 0x03, + 0x1E, 0xE4, 0x82, 0x02, 0x10, 0x02, 0xC1, 0xE0, 0x12, 0xAE, 0x47, 0x03, + 0xC1, 0xE0, 0x56, 0xE0, 0x15, 0xAE, 0x03, 0xA8, 0x07, 0xAE, 0x7F, 0xA8, + 0x0B, 0xAF, 0x04, 0x02, 0x0F, 0xA8, 0x04, 0x02, 0xC1, 0xE0, 0x56, 0xE0, + 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x56, 0xE0, 0x44, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x37, 0x03, 0x52, 0xE0, 0x1F, 0xAE, 0x03, 0xA2, 0x92, 0xE0, + 0x94, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0xEA, 0xF1, 0x84, 0xE0, 0x8A, 0xF1, + 0x06, 0xA8, 0x08, 0xAF, 0x21, 0xA8, 0x85, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, + 0xC0, 0xE0, 0x0A, 0xF1, 0x56, 0xE0, 0x17, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, + 0x12, 0xAF, 0x44, 0x00, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, + 0x3A, 0xF0, 0x56, 0xE0, 0x03, 0xA8, 0x1B, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, + 0x2E, 0xE4, 0x02, 0xA2, 0x1F, 0xAE, 0x03, 0xA2, 0x44, 0x00, 0xC0, 0xE0, + 0xD2, 0x02, 0x1E, 0xE4, 0xEA, 0xF0, 0x52, 0xE0, 0x69, 0xF0, 0xA3, 0x23, + 0x1E, 0xE4, 0xB8, 0xF0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0xC0, 0xE0, + 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x38, 0xF0, 0x08, 0xE0, 0x1C, 0x04, + 0xC0, 0xE0, 0x2E, 0xE4, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, 0xFF, 0x00, + 0x04, 0xAE, 0x02, 0xA0, 0x00, 0x05, 0x00, 0xE0, 0xC2, 0xE0, 0x02, 0xA2, + 0x1A, 0x04, 0xC2, 0xE0, 0xEA, 0xF7, 0x19, 0x04, 0xC0, 0xE0, 0x18, 0x04, + 0xC0, 0xE0, 0x18, 0x04, 0xC2, 0xE0, 0x02, 0xA2, 0x1B, 0x04, 0xC0, 0xE0, + 0xEA, 0xF7, 0x19, 0x04, 0x28, 0xAE, 0x08, 0xAF, 0x1E, 0xA0, 0x20, 0xAF, + 0xFF, 0xFF, 0x09, 0xE0, 0x1B, 0x04, 0xC1, 0xE0, 0x56, 0xE0, 0x09, 0xAE, + 0x09, 0xAF, 0x1F, 0xA0, 0xC0, 0xE0, 0x2E, 0xE4, 0x1D, 0x04, 0xC2, 0xE0, + 0xC2, 0xE0, 0x00, 0x02, 0x0A, 0xE0, 0x1C, 0x04, 0xF0, 0xF7, 0x02, 0xA1, + 0x28, 0xA2, 0x1C, 0x04, 0x00, 0x02, 0x0C, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, + 0xC0, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, + 0x04, 0xAF, 0x44, 0x00, 0x2E, 0xE4, 0x00, 0xC0, 0x41, 0x3C, 0x01, 0xC0, + 0x2E, 0xE4, 0x00, 0xC0, 0x41, 0x2C, 0x01, 0xC0, 0x1E, 0x26, 0x7A, 0xF1, + 0x50, 0x03, 0x1E, 0xE4, 0xC0, 0xE0, 0x30, 0xF1, 0x46, 0xE0, 0x59, 0x4E, + 0xEA, 0xF0, 0x00, 0x20, 0x08, 0xE0, 0x5C, 0x00, 0x00, 0x20, 0x0A, 0xE0, + 0x5D, 0x00, 0xC0, 0xE0, 0xF4, 0x07, 0x1E, 0xE4, 0x5D, 0x00, 0xC2, 0xE0, + 0x1E, 0xE4, 0x00, 0xA2, 0x01, 0xCE, 0x03, 0xA2, 0x65, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x4C, 0x03, 0xC0, 0xE0, 0xEA, 0xF0, 0x02, 0xA8, 0x24, 0xAF, + 0xFF, 0x00, 0x08, 0xE0, 0xBA, 0xF0, 0x6D, 0x00, 0x00, 0x3C, 0x58, 0x08, + 0x72, 0xF0, 0x58, 0x18, 0x0E, 0xA0, 0x18, 0xE0, 0x57, 0x82, 0x00, 0x84, + 0xC0, 0xE0, 0x2E, 0xE4, 0x4C, 0x03, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA8, + 0x24, 0xAF, 0x65, 0x00, 0xAC, 0x03, 0x0E, 0xE4, 0x9D, 0x0C, 0x0E, 0xE4, + 0xB4, 0x03, 0x0E, 0xE4, 0xB0, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0xCA, 0x03, 0x0E, 0xE4, 0xD0, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0xD4, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x06, 0x04, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x2E, 0x04, 0x1E, 0xE4, 0x04, 0xE0, 0x16, 0x02, + 0x1E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x10, 0x02, 0x1E, 0xE4, 0x4D, 0x00, + 0x1E, 0xE4, 0xE2, 0x0F, 0x1E, 0xE4, 0xD8, 0x03, 0x89, 0xF7, 0x1E, 0x02, + 0x1E, 0xE4, 0xDB, 0x04, 0xB6, 0x01, 0x1E, 0xE4, 0xE1, 0x0F, 0x1E, 0xE4, + 0xD8, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x0D, 0x06, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x10, 0x06, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x41, 0x06, 0x1E, 0xE4, 0x01, 0xC0, 0x2B, 0xE4, + 0x19, 0x02, 0x1E, 0xE4, 0x1E, 0xE4, 0x00, 0xC0, 0x5E, 0x3C, 0x5D, 0x28, + 0x00, 0xC0, 0x5E, 0x2A, 0x01, 0xC0, 0x83, 0x03, 0x85, 0xA1, 0x64, 0x00, + 0x05, 0xE0, 0x3A, 0xF0, 0x2A, 0xE4, 0x56, 0xE0, 0x04, 0xA8, 0x24, 0x28, + 0x17, 0xAE, 0x01, 0xA2, 0x40, 0x00, 0xC0, 0xE0, 0x00, 0x00, 0x11, 0xD1, + 0x20, 0xCE, 0x42, 0xE0, 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, + 0xCB, 0x05, 0x67, 0xE1, 0x2E, 0xE4, 0xE1, 0xE1, 0x03, 0x00, 0x22, 0xD0, + 0x64, 0x00, 0x66, 0xE1, 0x17, 0x35, 0x16, 0x9E, 0x04, 0x04, 0x84, 0xE1, + 0x86, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x17, 0x3D, 0xA9, 0x04, 0x1E, 0xE4, + 0xBE, 0x3C, 0xAD, 0x3C, 0x72, 0x07, 0x1E, 0xE4, 0x2E, 0x06, 0x1E, 0xE4, + 0x1E, 0xE4, 0x00, 0xA2, 0xB7, 0x09, 0x1E, 0xE4, 0x1E, 0xE4, 0x4D, 0x00, + 0x04, 0xE0, 0x16, 0x02, 0xDD, 0xF0, 0x2F, 0x04, 0x1E, 0xE4, 0x10, 0x02, + 0x76, 0x04, 0x1A, 0xE4, 0xCD, 0x0B, 0x1E, 0xE4, 0x1E, 0xE4, 0x83, 0x3C, + 0x10, 0x3C, 0xFE, 0xA2, 0x86, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, 0xCC, 0x19, + 0x95, 0x08, 0x1E, 0xE4, 0xF1, 0x0B, 0x1E, 0xE4, 0xAE, 0x28, 0x2E, 0xE4, + 0x2E, 0xE4, 0x6A, 0xE1, 0xF0, 0x3C, 0x3E, 0xA2, 0x38, 0xF0, 0x04, 0xA1, + 0x1E, 0xE4, 0x58, 0xF1, 0xCD, 0x0B, 0x1E, 0xE4, 0x04, 0xA1, 0x3A, 0xF1, + 0x0E, 0xA1, 0xFD, 0x0B, 0x02, 0xA1, 0x6A, 0xF0, 0x02, 0xA1, 0x2A, 0xF3, + 0xCE, 0xF6, 0xF7, 0x09, 0x1E, 0xE4, 0x4A, 0xF0, 0x04, 0xA2, 0x58, 0xF0, + 0xCD, 0x0B, 0x1E, 0xE4, 0x6B, 0xE1, 0x5E, 0xF6, 0xFF, 0x09, 0x1E, 0xE4, + 0x1E, 0xE4, 0xAE, 0x19, 0x1E, 0xE4, 0x2E, 0xE4, 0x10, 0x3C, 0xFE, 0xA2, + 0xEA, 0xF5, 0x2F, 0x0A, 0x00, 0x28, 0x9A, 0xF5, 0xE6, 0x1F, 0x1E, 0xE4, + 0x1E, 0xE4, 0xF8, 0x1F, 0x1E, 0xE4, 0x10, 0x3C, 0x81, 0x0C, 0x1E, 0xE4, + 0x00, 0xA2, 0x8C, 0x09, 0x7C, 0x19, 0x1E, 0xE4, 0x9B, 0x3C, 0x00, 0xA2, + 0xC0, 0xE0, 0x2C, 0xE4, 0x10, 0x3C, 0xFE, 0xA2, 0x0A, 0xE4, 0x15, 0x00, + 0x08, 0xE0, 0x45, 0x00, 0xB5, 0x19, 0x1E, 0xE4, 0x2E, 0xE4, 0x2F, 0x04, + 0xF7, 0x09, 0x1E, 0xE4, 0xAE, 0x19, 0x1E, 0xE4, 0xFD, 0x0B, 0x1E, 0xE4, + 0x2F, 0x04, 0x0E, 0xE4, 0x08, 0xA1, 0x4A, 0xF1, 0x02, 0xA1, 0xCA, 0xF0, + 0xF6, 0xF0, 0x08, 0xA1, 0x1A, 0xF1, 0x84, 0xF0, 0x4A, 0xF0, 0x02, 0xA1, + 0x6A, 0xF0, 0x02, 0xA1, 0x1E, 0xE4, 0x0E, 0xF7, 0xF7, 0x09, 0x1E, 0xE4, + 0x1E, 0xE4, 0x04, 0xA2, 0x58, 0xF0, 0xCD, 0x0B, 0xF4, 0x0B, 0x1E, 0xE4, + 0x9E, 0xF6, 0xFF, 0x09, 0x00, 0xA2, 0x2E, 0xE4, 0xA4, 0x0B, 0x1E, 0xE4, + 0xFF, 0x0A, 0x88, 0xE1, 0x00, 0x01, 0x61, 0xE1, 0x05, 0xE0, 0x41, 0x00, + 0xC0, 0xE0, 0x11, 0x3D, 0x20, 0xCE, 0x42, 0xE0, 0x11, 0xAE, 0x35, 0x00, + 0x80, 0x01, 0x12, 0xD1, 0x00, 0x01, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, + 0x02, 0x00, 0x13, 0xD1, 0x1E, 0xE4, 0x93, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, + 0x04, 0xA2, 0x26, 0x01, 0x1E, 0xE4, 0x4B, 0x02, 0x00, 0x00, 0x30, 0xD1, + 0x6A, 0xE1, 0xAE, 0x3C, 0x00, 0x00, 0x4C, 0xD0, 0x00, 0x00, 0x3A, 0xD0, + 0x00, 0x00, 0x22, 0xD0, 0x00, 0x00, 0x08, 0xD0, 0xC2, 0xE0, 0x00, 0x01, + 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0xD3, 0x3C, 0x02, 0xA2, 0x25, 0x01, + 0x28, 0x3C, 0x27, 0x3C, 0x26, 0x3C, 0x25, 0x3C, 0x61, 0xE1, 0x56, 0x3C, + 0x29, 0x3C, 0x10, 0x3C, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, 0xC7, 0x05, + 0x71, 0x0C, 0x1E, 0xE4, 0xAF, 0x3C, 0x11, 0x3D, 0xD6, 0x22, 0x1E, 0xE4, + 0xD0, 0x1F, 0x1E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x85, 0x1B, 0x1E, 0xE4, + 0x00, 0xC0, 0x53, 0x3C, 0x09, 0xC0, 0x86, 0x3C, 0x80, 0x1F, 0x1E, 0xE4, + 0x4D, 0x07, 0x1E, 0xE4, 0xAB, 0x05, 0x1E, 0xE4, 0xA0, 0x1F, 0x1E, 0xE4, + 0x1E, 0xE4, 0xB5, 0x19, 0x1A, 0xE4, 0xD3, 0x28, 0x1E, 0xE4, 0x3E, 0x07, + 0x1E, 0xE4, 0xC1, 0x09, 0x1E, 0xE4, 0x7E, 0x24, 0x1E, 0xE4, 0x8B, 0x02, + 0x40, 0x28, 0xA8, 0x05, 0x0A, 0xE4, 0xFF, 0x05, 0xC1, 0x09, 0x18, 0xE4, + 0x3F, 0x44, 0x16, 0xE0, 0x1E, 0x02, 0x1E, 0xE4, 0xB4, 0x18, 0x1E, 0xE4, + 0xCD, 0x0B, 0x1E, 0xE4, 0x78, 0xF0, 0x29, 0xE4, 0x88, 0x05, 0x0E, 0xE4, + 0xA8, 0x05, 0x08, 0xE4, 0x88, 0x05, 0x04, 0xE4, 0xF6, 0x01, 0x1E, 0xE4, + 0x86, 0x3C, 0x02, 0xA2, 0x3E, 0x07, 0x1E, 0xE4, 0x35, 0x07, 0x1E, 0xE4, + 0xBA, 0xF0, 0xBD, 0x28, 0x3A, 0x3C, 0x00, 0xA2, 0x84, 0x3C, 0xFC, 0xA2, + 0x88, 0x05, 0x0E, 0xE4, 0xB4, 0x3C, 0x02, 0xA2, 0x1E, 0xE4, 0x9A, 0xF0, + 0xA7, 0x06, 0x1E, 0xE4, 0x00, 0xA2, 0x9A, 0x06, 0x1E, 0xE4, 0xC3, 0x06, + 0x1E, 0xE4, 0x51, 0x05, 0x0E, 0xE4, 0xD3, 0x3C, 0x35, 0x07, 0x14, 0xE4, + 0x84, 0x28, 0xB7, 0x1F, 0x84, 0x28, 0x88, 0x05, 0x04, 0xE4, 0x84, 0x28, + 0x9B, 0xF0, 0xA3, 0x23, 0x1E, 0xE4, 0xC4, 0xF0, 0x1E, 0xE4, 0x00, 0x03, + 0x05, 0xE0, 0x06, 0xA2, 0x1F, 0x24, 0x1E, 0xE4, 0x84, 0x28, 0xF7, 0x23, + 0x9A, 0x06, 0x1E, 0xE4, 0xF7, 0x24, 0x1E, 0xE4, 0x40, 0x4E, 0x4E, 0x2A, + 0x08, 0xF1, 0xA5, 0x28, 0x4E, 0x28, 0xDC, 0x22, 0x1B, 0xE4, 0x84, 0x28, + 0x1A, 0xE4, 0x40, 0x28, 0x46, 0x21, 0x18, 0xE4, 0x00, 0xA2, 0x82, 0x3C, + 0x7E, 0x28, 0xFE, 0x1D, 0x1E, 0xE4, 0x58, 0xF0, 0x40, 0x28, 0xD3, 0x3C, + 0x1E, 0xE4, 0x20, 0x07, 0x1E, 0xE4, 0x1C, 0x07, 0x3F, 0x44, 0x02, 0xAA, + 0x40, 0x28, 0x24, 0x07, 0x98, 0xF1, 0x47, 0x07, 0x1E, 0xE4, 0xCA, 0xF2, + 0xF1, 0x0B, 0x1E, 0xE4, 0x76, 0x04, 0x1A, 0xE4, 0x49, 0x00, 0xC1, 0xE0, + 0x48, 0x00, 0xC0, 0xE0, 0x1E, 0xE4, 0xE7, 0xF0, 0x0F, 0xA1, 0x45, 0xE0, + 0x08, 0xA1, 0x8A, 0xF1, 0x02, 0xA1, 0x88, 0x09, 0x02, 0xA1, 0x6A, 0xF0, + 0x0A, 0xA1, 0x6A, 0xF1, 0x9E, 0xF6, 0xF7, 0x09, 0x1E, 0xE4, 0x4A, 0xF0, + 0x1E, 0xE4, 0x77, 0x00, 0xC2, 0xE0, 0x84, 0x28, 0xC0, 0xE0, 0x73, 0x00, + 0xC2, 0xE0, 0x16, 0x09, 0x04, 0xA1, 0x06, 0xA8, 0x06, 0xAF, 0x45, 0x00, + 0xF7, 0x04, 0x0E, 0xE4, 0x85, 0x06, 0x1A, 0xE4, 0xDD, 0x0B, 0x1E, 0xE4, + 0xC7, 0x24, 0x1E, 0xE4, 0xE9, 0x3C, 0x35, 0x1F, 0x1E, 0xE4, 0x4A, 0xF0, + 0x74, 0xF0, 0x85, 0x3C, 0x30, 0x1E, 0x1E, 0xE4, 0x38, 0xF0, 0x85, 0x18, + 0x54, 0xF0, 0x56, 0x28, 0x56, 0x3C, 0x85, 0x28, 0x85, 0x3C, 0xFA, 0xA2, + 0x1E, 0xE4, 0x83, 0x3C, 0x24, 0xF0, 0x84, 0x28, 0x1E, 0xE4, 0xED, 0x07, + 0x1E, 0xE4, 0xDF, 0x24, 0x2E, 0xE4, 0xF1, 0x0B, 0x1E, 0xE4, 0xA0, 0x1F, + 0x00, 0xA2, 0xEE, 0xF5, 0x86, 0x3C, 0x02, 0xA2, 0x5B, 0x3C, 0x09, 0xC0, + 0x4C, 0xCC, 0x4A, 0xCC, 0xC4, 0x3C, 0x62, 0x3C, 0x00, 0xC0, 0x5A, 0x3C, + 0xB4, 0x3C, 0xAE, 0x3C, 0xBD, 0x3C, 0xC5, 0x3C, 0xC1, 0x3C, 0xC0, 0x3C, + 0xFE, 0xA2, 0xA5, 0x3C, 0x97, 0x3C, 0x00, 0xA2, 0xC3, 0x3C, 0xC2, 0x3C, + 0x14, 0x07, 0x1A, 0xE4, 0xAD, 0x28, 0xBC, 0x3C, 0x20, 0x07, 0x1E, 0xE4, + 0x1C, 0x07, 0x1E, 0xE4, 0xED, 0x0F, 0x1E, 0xE4, 0x24, 0x07, 0x1E, 0xE4, + 0xB9, 0x3C, 0xBB, 0x3C, 0xBA, 0x3C, 0x0C, 0xA2, 0x41, 0x3C, 0x40, 0x3C, + 0x3F, 0x3C, 0x09, 0xC0, 0xF0, 0x3C, 0x04, 0xA2, 0x00, 0xC0, 0x42, 0x3C, + 0x85, 0x3C, 0xFA, 0xA2, 0x84, 0x3C, 0xFC, 0xA2, 0x3A, 0xF0, 0x84, 0xA1, + 0x11, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0x00, 0x00, 0x52, 0xD1, 0x44, 0xCC, 0x00, 0xA2, 0x03, 0x00, 0xE0, 0xD1, + 0x00, 0x00, 0x30, 0xD1, 0xD0, 0x03, 0xFD, 0xD1, 0xB0, 0x03, 0xFF, 0xD1, + 0x20, 0x07, 0xFC, 0xD1, 0x24, 0x02, 0x99, 0xD1, 0x00, 0x00, 0x4C, 0xD0, + 0x00, 0x00, 0x3A, 0xD0, 0x00, 0x02, 0x4B, 0xD1, 0x00, 0x00, 0x08, 0xD0, + 0x1E, 0xE4, 0x2E, 0xE4, 0xCE, 0xCF, 0xB1, 0x28, 0x1E, 0xE4, 0x9E, 0xF0, + 0x2A, 0xF0, 0xCD, 0x0B, 0x84, 0x3E, 0xF5, 0xB7, 0x84, 0x2A, 0x20, 0x23, + 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x3A, 0xF0, 0x2E, 0xE4, 0x8A, 0x07, + 0x1E, 0xE4, 0x2E, 0xE4, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0x00, 0xC0, 0xE0, + 0x13, 0xD1, 0x80, 0x00, 0x12, 0xD1, 0x00, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, + 0x28, 0xCA, 0x13, 0x00, 0x02, 0xA2, 0x4F, 0x0C, 0x1E, 0xE4, 0x61, 0x00, + 0x7C, 0x0A, 0x1E, 0xE4, 0x59, 0x0C, 0x1E, 0xE4, 0x48, 0xF0, 0x60, 0x00, + 0xC0, 0xE0, 0x28, 0xE1, 0x1E, 0xE4, 0x3E, 0xF0, 0xE6, 0x1F, 0x1E, 0xE4, + 0x40, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x11, 0x20, 0x05, 0xE0, 0x42, 0xE0, + 0x17, 0xAE, 0x01, 0xA2, 0x20, 0xCE, 0x42, 0xE0, 0x03, 0xAE, 0x00, 0x50, + 0x00, 0x01, 0x12, 0xD1, 0x00, 0x08, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, + 0x03, 0x00, 0x13, 0xD1, 0x29, 0x3C, 0xFE, 0xA2, 0x80, 0xE1, 0x2E, 0xE4, + 0x1E, 0xE4, 0xD6, 0x22, 0x1E, 0xE4, 0x10, 0x3C, 0x21, 0x28, 0xC7, 0x1F, + 0x1E, 0xE4, 0x75, 0x06, 0x2A, 0xF0, 0x04, 0xA1, 0x16, 0x28, 0x5A, 0xF0, + 0x81, 0x3C, 0x00, 0xA2, 0xE9, 0x3C, 0xEA, 0x28, 0xE5, 0x3C, 0xE8, 0x3C, + 0xE6, 0x3C, 0xE7, 0x3C, 0x16, 0x3D, 0x10, 0xC7, 0xAB, 0x05, 0x66, 0xE1, + 0x54, 0x00, 0x66, 0xE1, 0x18, 0x05, 0x67, 0xE1, 0x02, 0xA1, 0x7F, 0x28, + 0xB2, 0x3C, 0x00, 0xA2, 0x06, 0x9E, 0x6E, 0x06, 0x84, 0xE1, 0x44, 0xCC, + 0x17, 0x3D, 0x90, 0xB6, 0x02, 0xA8, 0xB2, 0x5C, 0x90, 0xE1, 0xB2, 0x3C, + 0x02, 0xA0, 0xB2, 0x28, 0x81, 0x0C, 0x1E, 0xE4, 0x60, 0x3C, 0x00, 0xA2, + 0x00, 0xA2, 0x00, 0x02, 0x61, 0xE1, 0x2E, 0xE4, 0x22, 0xD0, 0xB2, 0x3C, + 0x11, 0x3D, 0x3F, 0xC7, 0x1E, 0xE4, 0x83, 0x06, 0x84, 0xE1, 0x1F, 0x00, + 0xB2, 0x3C, 0x02, 0xA0, 0xB2, 0x28, 0xDC, 0x22, 0x08, 0xE0, 0x5C, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0x04, 0x04, 0xE0, 0x2A, 0xE4, 0x00, 0x04, + 0xC3, 0xE0, 0x55, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0xC0, 0xE0, 0x00, 0xCE, + 0x02, 0xA2, 0x5D, 0x00, 0x90, 0xE1, 0x00, 0x04, 0x08, 0xE0, 0x5D, 0x00, + 0x4F, 0x4E, 0xBC, 0x2A, 0x2E, 0xE4, 0xB8, 0xF7, 0x3F, 0x2A, 0xB9, 0x3C, + 0xA1, 0x28, 0xBC, 0x3E, 0xBA, 0x3C, 0x39, 0xF0, 0x42, 0x2A, 0x6B, 0xF0, + 0xA5, 0x28, 0x2E, 0xE4, 0xBB, 0x3C, 0x2E, 0xF0, 0x1E, 0xE4, 0x58, 0xF1, + 0x40, 0x28, 0x98, 0xF1, 0x05, 0x07, 0x1E, 0xE4, 0x7A, 0xF0, 0x00, 0x07, + 0xEE, 0xF0, 0xD8, 0xF0, 0x4F, 0x28, 0x7A, 0xF0, 0x38, 0x28, 0x42, 0xF0, + 0x0A, 0x07, 0x1E, 0xE4, 0x0A, 0x07, 0x1E, 0xE4, 0x6E, 0xF0, 0x98, 0xF0, + 0x00, 0xA2, 0x3A, 0xF0, 0x4E, 0x28, 0x36, 0xF0, 0xA5, 0x3C, 0x2E, 0xE4, + 0x02, 0xA2, 0x2E, 0xE4, 0x84, 0x28, 0xDC, 0x22, 0x12, 0xE4, 0x84, 0x28, + 0x12, 0xE4, 0x84, 0x28, 0xE3, 0x22, 0x12, 0xE4, 0x3E, 0x3C, 0x84, 0x3C, + 0xFC, 0xA2, 0xEA, 0x22, 0x8A, 0xF1, 0xFD, 0x0B, 0x1E, 0xE4, 0x2E, 0xE4, + 0x44, 0xF1, 0x08, 0xA1, 0x9A, 0xF1, 0x02, 0xA1, 0x02, 0xA1, 0xDA, 0xF0, + 0x02, 0xA1, 0x6A, 0xF1, 0x02, 0xA1, 0x9A, 0xF0, 0x02, 0xA1, 0xBA, 0xF0, + 0x02, 0xA1, 0x66, 0xF0, 0x04, 0xA1, 0x7A, 0xF0, 0x2E, 0xE4, 0x52, 0xF0, + 0x0E, 0xA1, 0x7A, 0xF0, 0x1E, 0xE4, 0x2E, 0xE4, 0xCD, 0x0B, 0x1E, 0xE4, + 0x0A, 0xAF, 0xA2, 0xCA, 0x4E, 0xF6, 0xF7, 0x09, 0x1E, 0xE4, 0xB8, 0xF0, + 0x4E, 0x18, 0x06, 0xA8, 0x88, 0x25, 0x1E, 0xE4, 0xCA, 0xF5, 0x2F, 0x0A, + 0x1E, 0xE4, 0x7A, 0xF5, 0x94, 0x28, 0x9A, 0xF5, 0x2E, 0xE4, 0xAD, 0x0B, + 0x1E, 0xE4, 0xF4, 0x0B, 0x02, 0xA8, 0x04, 0xAF, 0x65, 0x00, 0xC0, 0xE0, + 0x16, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xC1, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0x02, 0xA8, 0x03, 0xA1, 0x07, 0xA8, 0x07, 0xAF, 0x65, 0x00, + 0x2E, 0xE4, 0x36, 0xB6, 0x03, 0xA1, 0xF6, 0xB7, 0x48, 0x00, 0xC0, 0xE0, + 0xAD, 0x0B, 0x1E, 0xE4, 0x8E, 0xF1, 0x34, 0x3C, 0x33, 0x34, 0x09, 0xC0, + 0x4E, 0xF1, 0x34, 0x4C, 0x33, 0x24, 0x09, 0xC0, 0x0E, 0xF1, 0x36, 0x3C, + 0x35, 0x34, 0x09, 0xC0, 0x48, 0x00, 0xC0, 0xE0, 0xAD, 0x0B, 0x1E, 0xE4, + 0x8E, 0xF0, 0x38, 0x3C, 0x37, 0x34, 0x09, 0xC0, 0x4E, 0xF0, 0x36, 0x4C, + 0x35, 0x24, 0x09, 0xC0, 0x00, 0xC0, 0x38, 0x4C, 0x37, 0x24, 0x09, 0xC0, + 0xAD, 0x28, 0xF4, 0x0B, 0x1E, 0xE4, 0x2E, 0xE4, 0xC2, 0xE0, 0x1C, 0x07, + 0x1E, 0xE4, 0x2A, 0xE4, 0x0F, 0x24, 0x1E, 0xE4, 0x2E, 0xE4, 0x48, 0x00, + 0xE4, 0x05, 0x1E, 0xE4, 0xB2, 0x23, 0x1E, 0xE4, 0xC0, 0xE0, 0x2E, 0xE4, + 0xD1, 0x26, 0x1E, 0xE4, 0x04, 0xA1, 0x06, 0xA8, 0x06, 0xAF, 0x45, 0x00, + 0xB5, 0x34, 0x6B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xB7, 0x34, 0x6C, 0x00, + 0xC0, 0xE0, 0xB6, 0x3C, 0x08, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0xB8, 0x3C, + 0x1E, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x88, 0x30, 0x3E, 0xA8, 0x61, 0x00, + 0xC0, 0xE0, 0x87, 0x3C, 0x00, 0x06, 0x67, 0xE1, 0x00, 0xA2, 0x8A, 0x3C, + 0xC0, 0xE0, 0x01, 0xA2, 0x17, 0x3D, 0x03, 0xC7, 0x67, 0x1C, 0x18, 0xE4, + 0x40, 0xA8, 0x65, 0x00, 0x1E, 0xE4, 0xA6, 0x3C, 0x88, 0x00, 0x04, 0xE0, + 0xC0, 0xE0, 0x01, 0xC0, 0x2E, 0xE4, 0x6E, 0x03, 0xC0, 0xE0, 0x01, 0x3C, + 0x00, 0x34, 0x60, 0x00, 0x07, 0x3C, 0x06, 0x34, 0x14, 0xAE, 0x61, 0x00, + 0x02, 0xAF, 0x62, 0x00, 0xC0, 0xE0, 0x00, 0xC0, 0xAA, 0x3C, 0x3E, 0xA8, + 0x02, 0xAF, 0x21, 0x30, 0x02, 0xA8, 0x67, 0x00, 0xC0, 0xE0, 0x00, 0xA2, + 0xFA, 0x03, 0x1E, 0xE4, 0x2E, 0xE4, 0xB1, 0x3C, 0x42, 0x00, 0xC0, 0xE0, + 0x4C, 0x01, 0x1E, 0xE4, 0x12, 0xD1, 0x40, 0x06, 0x11, 0xD1, 0x20, 0xCE, + 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x20, 0xCE, 0x00, 0x02, + 0x00, 0xE0, 0xF9, 0xF7, 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, + 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xF7, 0x23, 0x1E, 0xE4, + 0x01, 0xA2, 0x04, 0xA2, 0xC9, 0x07, 0x0B, 0xE4, 0xA3, 0x23, 0x1E, 0xE4, + 0x80, 0x03, 0x00, 0xE0, 0x42, 0x00, 0xC0, 0xE0, 0x12, 0xD1, 0x40, 0x06, + 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, + 0x20, 0xCE, 0x80, 0x01, 0x00, 0xE0, 0xF9, 0xF7, 0xC0, 0x00, 0x12, 0xD1, + 0x40, 0x0B, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, 0x04, 0xA2, 0xC4, 0x0F, 0x1E, 0xE4, + 0x00, 0xA2, 0xF7, 0x23, 0xC4, 0x0F, 0x1E, 0xE4, 0x40, 0x00, 0x04, 0xE0, + 0xA3, 0x23, 0x1E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x7F, 0x3C, + 0x02, 0xAF, 0x2B, 0xF0, 0x6E, 0x00, 0xC0, 0xE0, 0x66, 0x3C, 0x61, 0x00, + 0xFD, 0x05, 0x67, 0xE1, 0xF1, 0x01, 0x1E, 0xE4, 0x17, 0x3D, 0x17, 0x35, + 0x62, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x17, 0x3D, 0x63, 0x00, 0xC0, 0xE0, + 0xAF, 0x3C, 0xE9, 0x3C, 0x34, 0xF0, 0x6F, 0x00, 0x54, 0x24, 0x64, 0xF0, + 0x84, 0x28, 0x2E, 0xE4, 0x55, 0x3C, 0x54, 0x34, 0x02, 0xA0, 0x55, 0x4C, + 0x02, 0xAE, 0x91, 0x4C, 0x04, 0xAE, 0x61, 0x28, 0x09, 0xC0, 0x60, 0x00, + 0xC2, 0xE0, 0x90, 0x4C, 0x61, 0x00, 0xC2, 0xE0, 0x40, 0x4C, 0x3F, 0x20, + 0xC2, 0xE0, 0x00, 0xC0, 0x42, 0x4C, 0x41, 0x20, 0x27, 0x4C, 0x26, 0x24, + 0x09, 0xC0, 0x62, 0x00, 0x29, 0x4C, 0x28, 0x24, 0x67, 0x00, 0xC2, 0xE0, + 0x2B, 0x4C, 0x2A, 0x24, 0x68, 0x00, 0xC2, 0xE0, 0x1E, 0xE4, 0x00, 0xC0, + 0x69, 0x00, 0xC2, 0xE0, 0x23, 0x2A, 0x00, 0x3C, 0x42, 0x28, 0x85, 0x1B, + 0x19, 0xE4, 0x3F, 0x2A, 0x47, 0x09, 0x1B, 0xE4, 0xC2, 0xE0, 0x23, 0x4C, + 0x02, 0xAE, 0x47, 0x09, 0x09, 0xAE, 0xC0, 0x2A, 0x00, 0xA2, 0x6A, 0x00, + 0x56, 0xE0, 0x07, 0xAE, 0xC1, 0x2A, 0x56, 0xE0, 0xC3, 0x2A, 0x56, 0xE0, + 0x05, 0xAE, 0xC2, 0x2A, 0x72, 0x20, 0x6D, 0x00, 0xC2, 0xE0, 0x56, 0xE0, + 0x1E, 0xE4, 0x6C, 0x00, 0xC2, 0xE0, 0x73, 0x4C, 0x1E, 0xE4, 0x7B, 0x00, + 0xC2, 0xE0, 0xB8, 0x19, 0x57, 0x20, 0x5F, 0x00, 0xC2, 0xE0, 0xC2, 0x19, + 0x6F, 0x00, 0xC2, 0xE0, 0x08, 0xAE, 0x58, 0x4C, 0x70, 0x00, 0xC2, 0xE0, + 0x55, 0x4C, 0x54, 0x24, 0x09, 0xC0, 0x71, 0x00, 0xC2, 0xE0, 0x85, 0x28, + 0xC2, 0xE0, 0x00, 0xC0, 0x5A, 0x4C, 0x5B, 0x24, 0xC2, 0xE0, 0x16, 0x09, + 0x1E, 0xE4, 0x72, 0x00, 0x74, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x73, 0x00, + 0x56, 0xE0, 0x05, 0xAE, 0x97, 0x2A, 0x86, 0x28, 0xAE, 0x2A, 0x56, 0xE0, + 0x21, 0xAE, 0xB4, 0x2A, 0x29, 0xAE, 0xBD, 0x2A, 0x56, 0xE0, 0x23, 0xAE, + 0x1E, 0xE4, 0x76, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x1E, 0xE4, 0x51, 0x00, + 0xC2, 0xE0, 0x2C, 0x07, 0x84, 0x28, 0x52, 0x00, 0xC2, 0xE0, 0x30, 0x07, + 0x61, 0xE1, 0x22, 0x2A, 0x77, 0x00, 0xC2, 0xE0, 0x2B, 0xF0, 0x11, 0x4D, + 0x11, 0x21, 0xE4, 0x05, 0x11, 0x21, 0x78, 0x00, 0xC2, 0xE0, 0x02, 0xAE, + 0xC2, 0xE0, 0x02, 0xAE, 0x2B, 0xF0, 0x11, 0x4D, 0x7A, 0x00, 0xC2, 0xE0, + 0xB0, 0x28, 0x79, 0x00, 0x7C, 0x00, 0xC2, 0xE0, 0x26, 0x4C, 0x25, 0x20, + 0x17, 0x4D, 0x17, 0x21, 0xC7, 0x05, 0x67, 0xE1, 0x17, 0x4D, 0x17, 0x21, + 0x7E, 0x00, 0xC2, 0xE0, 0x4D, 0xC8, 0x4A, 0xC8, 0x7D, 0x00, 0xC2, 0xE0, + 0x53, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x20, 0xAE, 0xC2, 0xE0, 0xB8, 0x19, + 0x1E, 0xE4, 0x2E, 0xE4, 0xC2, 0xE0, 0xC2, 0x19, 0x1E, 0xE4, 0x63, 0x00, + 0x47, 0x09, 0x1B, 0xE4, 0x23, 0x2A, 0x5F, 0x00, 0x02, 0xAE, 0x47, 0x09, + 0x19, 0xE4, 0x3F, 0x2A, 0x27, 0x20, 0x64, 0x00, 0xC2, 0xE0, 0x23, 0x4C, + 0x86, 0x28, 0x6D, 0x00, 0xC2, 0xE0, 0x28, 0x4C, 0x58, 0x4C, 0x57, 0x20, + 0x70, 0x00, 0xC2, 0xE0, 0x25, 0x20, 0x71, 0x00, 0xC2, 0xE0, 0x08, 0xAE, + 0x21, 0x28, 0x72, 0x00, 0xC2, 0xE0, 0x26, 0x4C, 0x9A, 0xF0, 0x04, 0xA1, + 0x16, 0x28, 0xCA, 0xF0, 0xC2, 0xE0, 0x04, 0xA0, 0xB3, 0x3C, 0xEB, 0x28, + 0x7E, 0xF0, 0xE9, 0x3C, 0xEA, 0x28, 0x73, 0x00, 0x73, 0x00, 0xC2, 0xE0, + 0x04, 0xA0, 0x19, 0x28, 0xC2, 0xE0, 0xE9, 0x28, 0xE9, 0x3C, 0x00, 0xA2, + 0x47, 0x28, 0x09, 0xC0, 0x00, 0xA2, 0x74, 0x00, 0x09, 0xE0, 0x48, 0x2A, + 0x3F, 0x00, 0x08, 0xE0, 0x56, 0xE0, 0x12, 0xAE, 0x00, 0xC0, 0xFF, 0x01, + 0x61, 0xE1, 0x22, 0x2A, 0x75, 0x00, 0xC2, 0xE0, 0x2B, 0xF0, 0x11, 0x4D, + 0x11, 0x21, 0xE4, 0x05, 0x11, 0x21, 0x76, 0x00, 0xC2, 0xE0, 0x02, 0xAE, + 0xC2, 0xE0, 0x02, 0xAE, 0x2B, 0xF0, 0x11, 0x4D, 0xF0, 0x58, 0x16, 0xE0, + 0x86, 0x28, 0x77, 0x00, 0xC7, 0x05, 0x61, 0xE1, 0x78, 0x00, 0xC2, 0xE0, + 0x7A, 0x00, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x79, 0x00, 0xC2, 0xE0, + 0x11, 0x4D, 0x11, 0x21, 0x02, 0xA8, 0x32, 0xAF, 0xB8, 0x19, 0x1E, 0xE4, + 0x19, 0x4E, 0x09, 0xAE, 0x1B, 0xE0, 0x19, 0x2A, 0x04, 0xAE, 0x22, 0x2A, + 0x56, 0xE0, 0x05, 0xAE, 0x56, 0xE0, 0x08, 0xAE, 0x24, 0x2A, 0x56, 0xE0, + 0x1B, 0x2A, 0x56, 0xE0, 0x04, 0xAE, 0x1D, 0x2A, 0x10, 0xAE, 0x56, 0xE0, + 0x02, 0xAE, 0x17, 0xE0, 0xC2, 0xE0, 0x11, 0x4C, 0x10, 0xAE, 0x1F, 0x4C, + 0x40, 0x2A, 0x00, 0xA2, 0x2E, 0xE4, 0x7B, 0x00, 0x56, 0xE0, 0x0F, 0xA8, + 0xB9, 0x2A, 0x59, 0xF0, 0xBA, 0x2A, 0x9B, 0xF0, 0x00, 0x2A, 0x2E, 0xF1, + 0xBB, 0x2A, 0x56, 0xE0, 0x07, 0xAE, 0x0F, 0xA8, 0xBB, 0x2A, 0x8E, 0xF0, + 0x56, 0xE0, 0x0F, 0xA8, 0xBA, 0x2A, 0x56, 0xE0, 0x07, 0xAE, 0x0F, 0xA8, + 0xA3, 0x28, 0x01, 0x3C, 0x56, 0xE0, 0x0F, 0xA8, 0x3F, 0x2A, 0x47, 0x09, + 0x1B, 0xE4, 0x23, 0x2A, 0x23, 0x4C, 0x02, 0xAE, 0x47, 0x09, 0x19, 0xE4, + 0x43, 0x4C, 0x04, 0xAE, 0x00, 0x4C, 0x0C, 0xAE, 0xBC, 0x2A, 0x24, 0xAE, + 0x3F, 0x4C, 0x02, 0xAE, 0x0F, 0xAE, 0x3B, 0x2A, 0x56, 0xE0, 0x0D, 0xAE, + 0x00, 0xA2, 0x2E, 0xE4, 0x01, 0x4C, 0x56, 0xE0, 0x17, 0x89, 0x34, 0x00, + 0x17, 0x89, 0x2E, 0xE4, 0x17, 0x89, 0x35, 0x00, 0x17, 0x89, 0x33, 0x00, + 0x17, 0x89, 0x37, 0x00, 0x17, 0x89, 0x36, 0x00, 0x17, 0x21, 0x17, 0x81, + 0x17, 0x81, 0x38, 0x00, 0x17, 0x4D, 0x17, 0x21, 0x60, 0xCC, 0x17, 0x4D, + 0x64, 0xCC, 0x17, 0x4D, 0x17, 0x21, 0x62, 0xCC, 0x2E, 0xE4, 0x72, 0xCC, + 0x17, 0x4D, 0x17, 0x21, 0x33, 0x00, 0x17, 0x8B, 0x34, 0x00, 0x17, 0x8B, + 0x36, 0x00, 0x17, 0x8B, 0x35, 0x00, 0x17, 0x8B, 0x38, 0x00, 0x17, 0x8B, + 0x37, 0x00, 0x17, 0x8B, 0x17, 0x35, 0x60, 0xC8, 0x17, 0x81, 0x17, 0x81, + 0x17, 0x3D, 0x17, 0x35, 0x62, 0xC8, 0x17, 0x3D, 0x72, 0xC8, 0x17, 0x3D, + 0x17, 0x35, 0x64, 0xC8, 0x01, 0xC0, 0x2E, 0xE4, 0x17, 0x3D, 0x17, 0x35, + 0x13, 0x28, 0x01, 0xC0, 0x9E, 0xF0, 0x13, 0x3C, 0x3E, 0xF0, 0x14, 0x3C, + 0x01, 0xC0, 0x6E, 0xF0, 0x2E, 0xE4, 0x00, 0xC0, 0x14, 0x28, 0x01, 0xC0, + 0x00, 0xC0, 0x31, 0x4C, 0x30, 0x24, 0x01, 0xC0, 0x22, 0xE4, 0x46, 0xE0, + 0x73, 0xC8, 0x06, 0xAE, 0x33, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x6B, 0xE1, + 0x6E, 0xF0, 0x33, 0x28, 0x01, 0xC0, 0x9E, 0xF0, 0x01, 0xC0, 0x3E, 0xF0, + 0x11, 0x3C, 0x01, 0xC0, 0x48, 0xD1, 0x2E, 0xE4, 0x00, 0xC0, 0x11, 0x28, + 0x45, 0xD1, 0x00, 0x00, 0x44, 0xD1, 0x40, 0x00, 0x6B, 0xD1, 0x00, 0x00, + 0x68, 0xD1, 0x00, 0x00, 0x32, 0xA2, 0x00, 0x02, 0x4B, 0xD1, 0x00, 0x00, + 0x0C, 0x00, 0x4C, 0xD1, 0xC0, 0xCE, 0x18, 0xAE, 0x01, 0xC0, 0x2E, 0xE4, + 0xF8, 0xF7, 0x9A, 0xCA, 0x07, 0x0C, 0x06, 0x04, 0x01, 0x4C, 0x00, 0x24, + 0x2A, 0x20, 0x71, 0xD0, 0x09, 0x3C, 0x08, 0x34, 0xAA, 0xF0, 0x0C, 0x28, + 0x01, 0xC0, 0x81, 0xE1, 0xC0, 0xE0, 0x45, 0xE0, 0xE4, 0x0B, 0x1E, 0xE4, + 0x12, 0xB6, 0x02, 0xA8, 0x04, 0xAF, 0x45, 0x00, 0x02, 0x34, 0x48, 0x00, + 0xC0, 0xE0, 0x0C, 0x30, 0xC0, 0xE0, 0x03, 0x3C, 0x00, 0xFE, 0x08, 0xE0, + 0x0B, 0x3C, 0xFF, 0x01, 0x08, 0xE0, 0x48, 0x00, 0xFF, 0x00, 0x22, 0xD0, + 0x78, 0xCC, 0x00, 0xA2, 0x90, 0xE1, 0x7A, 0xCC, 0xDF, 0x09, 0x84, 0xE1, + 0x9B, 0x0A, 0x1E, 0xE4, 0x7C, 0x0A, 0x1E, 0xE4, 0x00, 0xA2, 0x01, 0xC0, + 0xA3, 0x09, 0x1E, 0xE4, 0x12, 0xE4, 0x02, 0xA1, 0x0B, 0x28, 0x1A, 0x3C, + 0x1A, 0x3C, 0x02, 0xA2, 0x01, 0xC0, 0xFF, 0x09, 0x00, 0xA2, 0x00, 0xC0, + 0xAA, 0xCE, 0x00, 0xA2, 0xA0, 0xCA, 0x2E, 0xE4, 0x81, 0x0C, 0x1E, 0xE4, + 0x9C, 0xCA, 0xF8, 0xF7, 0x9A, 0xCA, 0x90, 0xE1, 0x44, 0xCC, 0x2E, 0xE4, + 0x9B, 0x0A, 0x18, 0xE4, 0x18, 0xE4, 0x9C, 0xCA, 0x08, 0x0A, 0x84, 0xE1, + 0xF9, 0xF7, 0x9B, 0xCA, 0xA0, 0xCA, 0x9B, 0x0A, 0x00, 0x01, 0x04, 0xE0, + 0x2E, 0xE4, 0x90, 0xE1, 0x14, 0xE0, 0xFF, 0x00, 0x04, 0xE0, 0xB0, 0xCE, + 0x5E, 0xD1, 0x00, 0x00, 0x5D, 0xD1, 0xB8, 0xCE, 0x32, 0xA2, 0x00, 0x00, + 0x5F, 0xD1, 0x00, 0x00, 0xC0, 0xCE, 0x20, 0x06, 0x0A, 0xE0, 0x18, 0xAE, + 0x00, 0x00, 0x4A, 0xD1, 0x00, 0x00, 0x57, 0xD1, 0x18, 0xE4, 0x9C, 0xCA, + 0x03, 0x00, 0x4C, 0xD1, 0xAE, 0xCA, 0xC8, 0xF7, 0x9A, 0xCA, 0x9B, 0x0A, + 0x18, 0xE4, 0x9C, 0xCA, 0x3A, 0xF7, 0x02, 0xA8, 0x06, 0xA2, 0x2E, 0xE4, + 0x00, 0xA2, 0x9B, 0x0A, 0x3C, 0x0A, 0x1E, 0xE4, 0xFF, 0x09, 0x1E, 0xE4, + 0x00, 0xC0, 0x31, 0x4C, 0x30, 0x20, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xA2, + 0x2E, 0xE4, 0x1A, 0xE0, 0x31, 0x3C, 0x30, 0x3C, 0x00, 0xA2, 0x01, 0xC0, + 0x01, 0xC0, 0x4C, 0x0A, 0x1E, 0xE4, 0x33, 0x3C, 0x28, 0xE1, 0x01, 0xC0, + 0x7C, 0x0A, 0x1E, 0xE4, 0x2E, 0xE4, 0x00, 0xC0, 0x38, 0x3C, 0x00, 0xA2, + 0x00, 0xC0, 0x11, 0x44, 0x33, 0x28, 0x01, 0xC0, 0x00, 0x00, 0x4A, 0xD1, + 0x92, 0xCE, 0x0E, 0xAE, 0xFF, 0x01, 0x04, 0xE0, 0x00, 0x00, 0x58, 0xD1, + 0x00, 0x00, 0x5D, 0xD1, 0xB8, 0xCE, 0x14, 0xE0, 0x00, 0x00, 0x5F, 0xD1, + 0x00, 0x00, 0x5E, 0xD1, 0x18, 0xAE, 0x32, 0xA2, 0x03, 0x00, 0x61, 0xD1, + 0x4C, 0xD1, 0xC0, 0xCE, 0x38, 0x06, 0x0A, 0xE0, 0x9B, 0x0A, 0x18, 0xE4, + 0x9C, 0xCA, 0x03, 0x00, 0xA8, 0xF7, 0x9C, 0xCA, 0xC8, 0xF7, 0x9A, 0xCA, + 0x92, 0xCC, 0x32, 0x3C, 0x01, 0xC0, 0x9E, 0xCA, 0x30, 0x34, 0x31, 0x0C, + 0x30, 0x00, 0x94, 0xCA, 0x2E, 0xE4, 0x00, 0xC0, 0x90, 0xCC, 0x31, 0x3C, + 0x9E, 0xCC, 0x20, 0xAE, 0x95, 0x14, 0x04, 0xE0, 0x00, 0x00, 0x34, 0xD0, + 0x00, 0x00, 0x30, 0xD0, 0x00, 0x00, 0x35, 0xD0, 0x00, 0x00, 0x33, 0xD0, + 0x00, 0x00, 0x37, 0xD0, 0x7F, 0x00, 0x36, 0xD0, 0x00, 0x00, 0x39, 0xD0, + 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, 0x4C, 0xD0, 0x01, 0x00, 0x4B, 0xD0, + 0x00, 0x00, 0x47, 0xD0, 0x00, 0x00, 0x46, 0xD0, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0x00, 0x49, 0xD1, 0x73, 0x02, 0x1E, 0xE4, 0x3A, 0xF2, 0x0C, 0x28, + 0x50, 0xCE, 0x40, 0x04, 0x04, 0xE0, 0x01, 0xC0, 0x12, 0xE0, 0x08, 0xA1, + 0x06, 0xA8, 0x0D, 0x28, 0x04, 0xE0, 0x40, 0x3C, 0x06, 0xAE, 0x06, 0xA8, + 0x50, 0xCA, 0x52, 0xCE, 0x40, 0x58, 0x0B, 0x01, 0x7A, 0x02, 0x1E, 0xE4, + 0xE8, 0xF7, 0x04, 0xA8, 0x44, 0xD1, 0x00, 0x00, 0x4E, 0xD1, 0x01, 0xC0, + 0x00, 0xE0, 0x03, 0x4C, 0x02, 0x24, 0x00, 0x00, 0x5E, 0xF3, 0x03, 0x3C, + 0x02, 0x34, 0x00, 0x02, 0x1A, 0xE4, 0x0C, 0x28, 0x00, 0x00, 0x27, 0xD0, + 0x01, 0x00, 0x27, 0xD0, 0x01, 0xC0, 0x02, 0x0B, 0x02, 0xA8, 0x48, 0xCA, + 0x1A, 0xF2, 0x0D, 0x28, 0x40, 0xCE, 0x03, 0x4C, 0x02, 0x24, 0xE8, 0xF7, + 0x40, 0x00, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, 0x02, 0xAE, 0x06, 0xA8, + 0x43, 0x00, 0xC0, 0xE0, 0x02, 0xA8, 0x48, 0xCA, 0x46, 0xCE, 0x32, 0xA0, + 0x02, 0x04, 0x00, 0x02, 0x04, 0xE0, 0xE8, 0xF7, 0x08, 0x14, 0x03, 0x3C, + 0x02, 0x34, 0x03, 0x0C, 0x01, 0x4C, 0x00, 0x24, 0x54, 0xF0, 0x09, 0x1C, + 0x18, 0xE4, 0x0C, 0x28, 0x03, 0x3C, 0x02, 0x34, 0x01, 0xC0, 0xAD, 0x0B, + 0x1E, 0xE4, 0x55, 0x0B, 0x00, 0x00, 0x44, 0xD1, 0x00, 0x00, 0x4E, 0xD1, + 0x59, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0x00, 0xE0, 0x36, 0xB6, + 0x00, 0xA2, 0x03, 0xA1, 0x52, 0xE0, 0x45, 0x00, 0xC1, 0xE0, 0x1C, 0x00, + 0x00, 0xA2, 0x01, 0xC0, 0x2E, 0xE4, 0x1A, 0xE0, 0x0D, 0x3C, 0x00, 0x02, + 0x04, 0xE0, 0x0A, 0x3C, 0xD8, 0xF3, 0x08, 0xA8, 0x43, 0x00, 0xC0, 0xE0, + 0x0C, 0x3C, 0x01, 0xC0, 0xF6, 0x0A, 0x1E, 0xE4, 0x49, 0x00, 0xC1, 0xE0, + 0x03, 0x4C, 0x02, 0x24, 0x05, 0x4E, 0x04, 0x26, 0x05, 0x3E, 0x04, 0x36, + 0x07, 0x0E, 0x06, 0x06, 0x33, 0xF0, 0x45, 0xE0, 0x02, 0xB6, 0x0C, 0x28, + 0x00, 0x02, 0x03, 0xE0, 0x00, 0x02, 0x01, 0xE0, 0x73, 0xF2, 0x0C, 0x3C, + 0x5D, 0x00, 0xC1, 0xE0, 0x0C, 0x28, 0x0D, 0x3E, 0xD8, 0xF1, 0x52, 0xE0, + 0x17, 0xE0, 0x1B, 0xE0, 0x1E, 0xE4, 0x0C, 0x0B, 0x08, 0xE4, 0x0A, 0x28, + 0x5C, 0x00, 0xC0, 0xE0, 0x01, 0xC0, 0xCA, 0x01, 0x0C, 0x0B, 0x0A, 0xE4, + 0x00, 0x40, 0x08, 0xE0, 0x00, 0x20, 0x08, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, + 0x0A, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0xC8, 0xF7, 0x02, 0xA2, 0x5D, 0x00, + 0xC2, 0xE0, 0x00, 0x40, 0x0C, 0x0B, 0x0E, 0xE4, 0x0A, 0x3C, 0x00, 0xCE, + 0x04, 0xE0, 0x39, 0xF0, 0x0C, 0x2A, 0x0D, 0x28, 0xC1, 0xE0, 0x00, 0xC0, + 0x0D, 0x3C, 0x00, 0x02, 0xC9, 0xF7, 0x00, 0x40, 0x09, 0xE0, 0x5D, 0x00, + 0x73, 0x02, 0x1E, 0xE4, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0x02, 0x02, 0xE0, + 0x0D, 0x28, 0x01, 0xC0, 0x06, 0xA8, 0x0D, 0x28, 0xA1, 0x0B, 0x0A, 0xE4, + 0x06, 0xAE, 0x12, 0xE0, 0x08, 0xA1, 0x6A, 0xF2, 0x20, 0xAE, 0x04, 0xAF, + 0x0D, 0x28, 0x40, 0x3C, 0x90, 0xE1, 0x50, 0xCE, 0xC0, 0x01, 0x00, 0xE0, + 0xE8, 0xF7, 0x04, 0xA8, 0x50, 0xCA, 0x52, 0xCA, 0x0D, 0x2A, 0x40, 0x58, + 0x40, 0x5C, 0x52, 0xCA, 0x05, 0xE0, 0x40, 0x3E, 0x07, 0xAE, 0x07, 0xA8, + 0x0D, 0x2A, 0x56, 0xE0, 0x40, 0x5E, 0x0B, 0x01, 0x40, 0x01, 0x01, 0xE0, + 0x21, 0xAE, 0x05, 0xAF, 0x50, 0xCA, 0x52, 0xCE, 0x90, 0xE1, 0x51, 0xCE, + 0xFC, 0x01, 0x04, 0xE0, 0xE8, 0xF7, 0x04, 0xA8, 0x01, 0xC0, 0x7E, 0xF1, + 0x22, 0xF0, 0x0D, 0x18, 0x20, 0xAE, 0x04, 0xAF, 0x06, 0xA0, 0x0D, 0x28, + 0x0D, 0x28, 0x50, 0xCE, 0x40, 0x04, 0x00, 0xE0, 0x06, 0xA8, 0x12, 0xE0, + 0x08, 0xA1, 0x06, 0xA8, 0x0B, 0x01, 0x04, 0xE0, 0x40, 0x3C, 0x06, 0xAE, + 0x04, 0xA8, 0x50, 0xCA, 0x52, 0xCE, 0x40, 0x58, 0x7A, 0x02, 0x0E, 0xE4, + 0x00, 0xC0, 0xE8, 0xF7, 0xC0, 0xE0, 0x01, 0xC0, 0xAD, 0x0B, 0x1E, 0xE4, + 0x00, 0xC0, 0x18, 0x3C, 0x17, 0x34, 0x48, 0x00, 0x1A, 0x2A, 0xAA, 0xCA, + 0x01, 0xC0, 0x2E, 0xE4, 0xAA, 0xCE, 0x00, 0xA2, 0x4E, 0xF8, 0x16, 0xB6, + 0xC0, 0xE0, 0x40, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x0E, 0x24, 0x0F, 0x3C, + 0x0E, 0x34, 0x48, 0x00, 0x00, 0x16, 0x49, 0xE0, 0x40, 0x08, 0x0F, 0x4C, + 0x07, 0x0C, 0x06, 0x04, 0x33, 0xF0, 0x01, 0x1E, 0x35, 0xF0, 0x09, 0x1E, + 0x08, 0x16, 0x49, 0xE0, 0x48, 0x00, 0xC2, 0xE0, 0x07, 0x1C, 0x06, 0x14, + 0xCA, 0xF0, 0x0C, 0x28, 0x01, 0xC0, 0xFE, 0xF0, 0x1E, 0xE4, 0x01, 0xC0, + 0xAD, 0x0B, 0x1E, 0xE4, 0x26, 0xB6, 0x00, 0xA2, 0x45, 0xE0, 0xE4, 0x0B, + 0x00, 0xC0, 0x06, 0xB6, 0x00, 0x02, 0x03, 0xE0, 0xC0, 0xE0, 0x2A, 0xE4, + 0x0E, 0xFF, 0x2E, 0xE4, 0x2E, 0xE4, 0x02, 0xA8, 0x04, 0xAF, 0x45, 0x00, + 0x0F, 0x3C, 0x0E, 0x34, 0x49, 0x00, 0xC0, 0xE0, 0x48, 0x00, 0xC1, 0xE0, + 0x0F, 0x4C, 0x0E, 0x24, 0x0F, 0x4E, 0x0E, 0x26, 0x0F, 0x3E, 0x0E, 0x36, + 0x2E, 0xE4, 0xAD, 0x0B, 0x1E, 0xE4, 0x2E, 0xE4, 0x17, 0x24, 0x01, 0xC0, + 0xAA, 0xCE, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, 0x00, 0xC0, 0x18, 0x4C, + 0x1E, 0xE4, 0x0A, 0x0A, 0x1E, 0xE4, 0x2E, 0xE4, 0xA4, 0x0B, 0x1E, 0xE4, + 0x18, 0xF1, 0xCD, 0x0B, 0x80, 0x00, 0x08, 0xE0, 0x49, 0xE0, 0xA2, 0xCA, + 0x59, 0xF0, 0x11, 0xB6, 0x1F, 0x00, 0x09, 0xE0, 0xEE, 0xF6, 0xFF, 0x09, + 0x1E, 0xE4, 0x04, 0xA2, 0x0B, 0x01, 0x04, 0xE0, 0x3E, 0xF0, 0xA2, 0xCA, + 0x7F, 0x09, 0x1E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x1E, 0xE4, 0x3E, 0xA8, + 0x82, 0x09, 0x1E, 0xE4, 0x0A, 0xAF, 0x82, 0x09, 0x1E, 0xE4, 0x85, 0x09, + 0x88, 0x09, 0x1E, 0xE4, 0x4E, 0x3C, 0x06, 0xA8, 0x1E, 0xE4, 0x4F, 0x3C, + 0x16, 0xE0, 0x0A, 0xA1, 0x32, 0x28, 0x01, 0xC0, 0x2E, 0xE4, 0x88, 0x09, + 0xE8, 0xF1, 0x11, 0xA0, 0x73, 0xC8, 0x16, 0xE0, 0x46, 0xE0, 0x31, 0x28, + 0x30, 0x24, 0x07, 0xAF, 0x61, 0xE1, 0x01, 0xC0, 0xAE, 0xF0, 0xFA, 0xF0, + 0x11, 0xA0, 0x73, 0xC8, 0x01, 0x29, 0x01, 0x06, 0x49, 0xE0, 0x5A, 0xF0, + 0x46, 0xE0, 0x07, 0xAF, 0x68, 0xC8, 0xBE, 0xF0, 0x0E, 0xB6, 0x22, 0xB6, + 0x35, 0x3C, 0x10, 0xA2, 0x28, 0xF0, 0x0E, 0xA8, 0x03, 0xAF, 0x35, 0x5A, + 0x03, 0xA2, 0x35, 0x78, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x46, 0xE0, + 0x2E, 0xE4, 0x00, 0xC0, 0x31, 0x3C, 0x30, 0x34, 0x00, 0xC0, 0x31, 0x4C, + 0x30, 0x24, 0x01, 0xC0, 0x00, 0xC0, 0x32, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0xC0, 0x32, 0x28, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x10, 0x3C, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x10, 0x28, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0xC0, 0x38, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x38, 0x28, + 0x01, 0xC0, 0x2E, 0xE4, 0x41, 0x00, 0xC0, 0xE0, 0x01, 0xC0, 0x2E, 0xE4, + 0x42, 0xE0, 0x11, 0xAE, 0x20, 0x01, 0x05, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0x21, 0x3C, 0x20, 0x34, 0x00, 0xC0, 0x21, 0x4C, 0x20, 0x24, 0x01, 0xC0, + 0x64, 0x3C, 0x8E, 0xE0, 0x63, 0x3C, 0x2E, 0xE4, 0x95, 0x0C, 0x1E, 0xE4, + 0x8D, 0x0C, 0x1E, 0xE4, 0x60, 0x3C, 0x63, 0x28, 0x9E, 0xE0, 0x64, 0x28, + 0x00, 0xE0, 0x08, 0xAE, 0x60, 0x28, 0x2E, 0xE4, 0x64, 0x09, 0x1E, 0xE4, + 0x9E, 0xE0, 0x38, 0x05, 0x00, 0xE0, 0x08, 0xAE, 0x63, 0x28, 0x2E, 0xE4, + 0x49, 0x09, 0x1E, 0xE4, 0x9E, 0xE0, 0x38, 0x05, 0x02, 0xA1, 0xCA, 0xF0, + 0x60, 0x28, 0x2E, 0xE4, 0x0A, 0xE4, 0x02, 0xA1, 0x8A, 0x20, 0x0A, 0xE4, + 0x4C, 0xD0, 0x53, 0x11, 0x1E, 0xE4, 0x8A, 0x20, 0x5D, 0x0C, 0x1E, 0xE4, + 0x70, 0xE4, 0x00, 0x00, 0x88, 0xF0, 0x6D, 0x0C, 0x1E, 0xE4, 0x88, 0xF0, + 0x4C, 0x0A, 0x1E, 0xE4, 0xF3, 0x0F, 0x1E, 0xE4, 0x1E, 0xE4, 0x70, 0xE4, + 0x00, 0x00, 0x4C, 0xD0, 0x98, 0xF0, 0x9F, 0x09, 0x1E, 0xE4, 0x36, 0x11, + 0x37, 0xD0, 0x9C, 0x09, 0x1E, 0xE4, 0x02, 0xA2, 0x70, 0xE4, 0x00, 0x00, + 0x4C, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0x9C, 0x09, 0x1E, 0xE4, 0x00, 0xA2, + 0x70, 0xE4, 0x00, 0x00, 0x4C, 0xD0, 0x80, 0x00, 0x53, 0x11, 0x1E, 0xE4, + 0x8A, 0x20, 0x0E, 0xE4, 0x01, 0xC0, 0x70, 0xE4, 0x00, 0x00, 0x4C, 0xD0, + 0x36, 0x11, 0x1E, 0xE4, 0x10, 0x3C, 0x00, 0xA2, 0x11, 0x28, 0x96, 0xCC, + 0x32, 0x28, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x11, 0x3C, 0x16, 0xE0, + 0x2E, 0xE4, 0x4A, 0xF8, 0x38, 0xF0, 0x0C, 0xBA, 0x0C, 0xA2, 0x4C, 0xBA, + 0x2E, 0xE4, 0xFC, 0xBC, 0x9D, 0x3C, 0x02, 0xA0, 0x9D, 0x28, 0x9D, 0x3C, + 0xAA, 0xF7, 0x40, 0xBA, 0xD2, 0xF0, 0x40, 0xA1, 0xAC, 0x3C, 0xAB, 0x34, + 0x02, 0xA1, 0x9D, 0x58, 0xAB, 0x00, 0x0C, 0x0D, 0x1E, 0xE4, 0x9D, 0x28, + 0x2E, 0xE4, 0x6B, 0xE1, 0x2E, 0xE4, 0xAC, 0x0C, 0x2D, 0xE4, 0x8A, 0xFE, + 0xD8, 0xF0, 0x0C, 0xBA, 0x02, 0xA0, 0x00, 0x00, 0xAC, 0x8C, 0xAC, 0x3C, + 0x12, 0xE0, 0x2C, 0xE4, 0x12, 0xE0, 0x02, 0xAF, 0x2E, 0xE4, 0x7E, 0xBE, + 0x2E, 0xE4, 0x6A, 0xE1, 0x9E, 0x3C, 0x20, 0xA0, 0x50, 0xF0, 0x20, 0xA1, + 0x5E, 0xBA, 0x9E, 0x3C, 0x2E, 0xE4, 0x9E, 0x74, 0x2E, 0xE4, 0x56, 0xE0, + 0x9E, 0x76, 0x9E, 0x58, 0x0E, 0xA8, 0x68, 0xC8, 0x2A, 0xE4, 0x40, 0xBA, + 0x00, 0x74, 0x28, 0xE4, 0x16, 0xE0, 0x00, 0x3C, 0x03, 0xA1, 0x38, 0x2A, + 0x2E, 0xE4, 0x16, 0xE0, 0x30, 0x28, 0x2B, 0xF0, 0x25, 0xE4, 0x2F, 0x28, + 0x04, 0xA1, 0x5E, 0x3C, 0x02, 0xA0, 0xF4, 0xB7, 0x5F, 0x3C, 0x5A, 0xA2, + 0x4A, 0xF0, 0x24, 0xE4, 0x2D, 0xE4, 0x00, 0x3C, 0x0E, 0xBC, 0x2E, 0xE4, + 0x01, 0x3C, 0x0E, 0xBC, 0x2A, 0xF0, 0x22, 0x28, 0x00, 0x4C, 0x06, 0xAE, + 0x01, 0x28, 0x2D, 0xE4, 0x64, 0xE1, 0x28, 0x07, 0x61, 0xE1, 0x5F, 0x3C, + 0x1E, 0xE4, 0x22, 0x00, 0x48, 0x88, 0x20, 0x07, 0x48, 0x2A, 0x3C, 0xA2, + 0x2D, 0xE4, 0x87, 0x0D, 0x0F, 0x3C, 0x86, 0xF0, 0x46, 0xE0, 0x0D, 0x3E, + 0x28, 0x07, 0x64, 0xE1, 0x28, 0x07, 0x61, 0xE1, 0x04, 0xA1, 0x38, 0x28, + 0x6C, 0x0D, 0x1E, 0xE4, 0x64, 0xE1, 0x88, 0x07, 0x61, 0xE1, 0x28, 0xE4, + 0x1E, 0xE4, 0x22, 0x00, 0x49, 0x88, 0x24, 0x07, 0x0D, 0x3E, 0x49, 0x2A, + 0x3C, 0xA2, 0x87, 0x0D, 0x86, 0xF0, 0x46, 0xE0, 0x49, 0x00, 0x65, 0xE1, + 0x64, 0xE1, 0x88, 0x07, 0x61, 0xE1, 0x0F, 0x3C, 0x2E, 0xE4, 0x6C, 0x0D, + 0x1E, 0xE4, 0x88, 0x07, 0x83, 0xE0, 0x4E, 0xF0, 0x94, 0xE0, 0x06, 0xA2, + 0x88, 0xE0, 0x01, 0x2B, 0x93, 0xE0, 0x41, 0xA0, 0x0F, 0x86, 0x98, 0xE0, + 0x02, 0xA0, 0x0D, 0x08, 0x94, 0xE0, 0x02, 0xA1, 0x84, 0xE0, 0x14, 0x3F, + 0x80, 0x00, 0xC6, 0xE0, 0x2E, 0xE4, 0x38, 0xF7, 0x80, 0x00, 0xC7, 0xE0, + 0x10, 0xAE, 0x03, 0x44, 0x82, 0xE0, 0x2E, 0xE4, 0x56, 0xE0, 0x03, 0x46, + 0x96, 0xE0, 0x40, 0xA0, 0x94, 0xE0, 0x40, 0xA0, 0x00, 0xA2, 0x03, 0x3C, + 0xFF, 0x00, 0x04, 0xE0, 0x08, 0x3C, 0x07, 0x3C, 0x06, 0x3C, 0x05, 0x3C, + 0x40, 0xBA, 0xC1, 0x0D, 0x84, 0xE1, 0x09, 0x3C, 0x11, 0x3D, 0x7E, 0x0D, + 0x1E, 0xE4, 0x5A, 0xF0, 0x10, 0xAE, 0x00, 0x58, 0x02, 0xA2, 0xCE, 0xF0, + 0x02, 0xA2, 0x07, 0x4E, 0x06, 0x22, 0x11, 0x3D, 0x07, 0x3C, 0x06, 0x34, + 0x56, 0xE0, 0x05, 0x58, 0x8A, 0xF0, 0x40, 0xBA, 0x6A, 0xF1, 0x22, 0x28, + 0x1E, 0xE4, 0x12, 0x3D, 0x7E, 0x0D, 0x1E, 0xE4, 0x02, 0xA2, 0xDE, 0xF0, + 0x13, 0x3D, 0x7E, 0x0D, 0x13, 0x3D, 0x12, 0x3D, 0x10, 0xAE, 0x01, 0x58, + 0x05, 0x58, 0x02, 0xA2, 0x09, 0x4E, 0x08, 0x22, 0x05, 0x28, 0x09, 0x3C, + 0x08, 0x34, 0x56, 0xE0, 0x07, 0x4C, 0x06, 0x20, 0x05, 0x3C, 0x02, 0xA0, + 0x09, 0x4C, 0x08, 0x20, 0xC8, 0x0D, 0x1E, 0xE4, 0x2E, 0xE4, 0x14, 0x3D, + 0x14, 0x35, 0x14, 0xE0, 0xCE, 0x0E, 0x0D, 0xE4, 0xFF, 0xFF, 0xC4, 0xE0, + 0x00, 0xC0, 0x58, 0x3C, 0x59, 0x34, 0x09, 0xC0, 0x12, 0xBC, 0xA1, 0x3C, + 0xFE, 0xA2, 0x38, 0xF0, 0xA8, 0xB4, 0x0A, 0xA1, 0xCE, 0x0E, 0x0D, 0xE4, + 0xB4, 0xB7, 0xCE, 0x0E, 0x00, 0xE4, 0x04, 0xA1, 0xA1, 0x3C, 0xA1, 0x60, + 0x38, 0x3C, 0x06, 0xA0, 0x51, 0x2A, 0xCE, 0x0E, 0x0D, 0xE4, 0xFE, 0xBD, + 0x6A, 0xF0, 0x29, 0x18, 0x49, 0xE0, 0x9B, 0xF0, 0x0A, 0xE4, 0x4F, 0x20, + 0x1E, 0xE4, 0x29, 0x3E, 0x00, 0xA2, 0x39, 0x3C, 0x13, 0x74, 0xCE, 0x0E, + 0x68, 0xF0, 0x1B, 0x28, 0x42, 0x3C, 0x3F, 0x3C, 0x40, 0xBA, 0x3A, 0xF0, + 0x3F, 0x3C, 0x40, 0xBA, 0x09, 0xC0, 0x7A, 0xF3, 0x51, 0x28, 0x42, 0x3C, + 0x3F, 0x5C, 0x00, 0xC0, 0x56, 0x4C, 0x57, 0x24, 0x40, 0x3C, 0x00, 0xA2, + 0x44, 0x3C, 0x52, 0x34, 0xDB, 0x0E, 0x1E, 0xE4, 0x5A, 0xF0, 0x3A, 0x28, + 0x3A, 0x3C, 0x3F, 0x28, 0x78, 0xF1, 0x40, 0x3C, 0x39, 0x28, 0x3B, 0x3C, + 0x1A, 0xE0, 0x4E, 0x28, 0xFC, 0xA2, 0x3D, 0x3C, 0x42, 0x28, 0x3C, 0x3C, + 0xB8, 0xF0, 0x08, 0xA8, 0xAA, 0x28, 0x3E, 0x3C, 0x39, 0x1C, 0x50, 0x28, + 0x98, 0xF0, 0x4E, 0x28, 0x3E, 0xF0, 0xBE, 0x3C, 0x02, 0xA2, 0x6A, 0xF0, + 0x59, 0x24, 0x09, 0xC0, 0x3A, 0x3C, 0x00, 0xA2, 0x40, 0x28, 0x38, 0xF0, + 0x00, 0xC0, 0x58, 0x2C, 0x1C, 0x44, 0x16, 0xE0, 0x3F, 0x28, 0x18, 0xF0, + 0x74, 0xB6, 0x42, 0x08, 0x3F, 0x28, 0x43, 0x3C, 0x1E, 0xE4, 0x6A, 0xF0, + 0x4F, 0x28, 0x41, 0x3C, 0x45, 0x3C, 0xCE, 0x0E, 0x0D, 0xE4, 0xE0, 0x0C, + 0x7A, 0xF0, 0x35, 0x28, 0xB0, 0x1D, 0x1E, 0xE4, 0xCE, 0x0E, 0x0D, 0xE4, + 0xE0, 0x0C, 0x1E, 0xE4, 0x04, 0xA1, 0x38, 0x28, 0xCE, 0x0E, 0x08, 0xE4, + 0x2C, 0x28, 0x46, 0x3C, 0x40, 0xBA, 0x38, 0xF0, 0x38, 0x28, 0x49, 0x3C, + 0x2E, 0x28, 0x48, 0x3C, 0x3E, 0xBC, 0xCA, 0xF0, 0x40, 0xBA, 0xEA, 0xF0, + 0x38, 0x28, 0xCE, 0x0E, 0x0D, 0xE4, 0x48, 0x3C, 0x49, 0x3C, 0x3E, 0xBC, + 0x58, 0xF0, 0x04, 0xA1, 0x5A, 0xF0, 0x51, 0x28, 0xCE, 0x0E, 0x0D, 0xE4, + 0xF7, 0x0E, 0x1E, 0xE4, 0x33, 0x21, 0x1E, 0xE4, 0xFE, 0x0E, 0x1A, 0xE4, + 0x16, 0xE0, 0x38, 0x28, 0x22, 0x0D, 0x1E, 0xE4, 0xCE, 0x0E, 0x0A, 0xE4, + 0x6A, 0xF0, 0x51, 0x28, 0xCE, 0x0E, 0x0D, 0xE4, 0xCE, 0x0E, 0x0A, 0xE4, + 0x8C, 0x1C, 0x1E, 0xE4, 0x4F, 0x28, 0xDA, 0xF1, 0x4E, 0x28, 0xFE, 0xF1, + 0x8E, 0xF1, 0x40, 0xBA, 0x40, 0xBA, 0x4A, 0xF0, 0x0D, 0xE4, 0x0C, 0xBC, + 0x6A, 0xF1, 0x40, 0xBA, 0x8A, 0xF0, 0x06, 0xA1, 0x2A, 0xF1, 0xCE, 0x0E, + 0xE0, 0x0C, 0x1E, 0xE4, 0x9A, 0xF7, 0x04, 0xA1, 0x1E, 0xE4, 0x4E, 0xF7, + 0xCE, 0x0E, 0x0D, 0xE4, 0x40, 0xBC, 0xCE, 0x0E, 0x0D, 0xE4, 0xE0, 0x0C, + 0x38, 0x28, 0xCE, 0xF6, 0xCE, 0x0E, 0x0D, 0xE4, 0x04, 0xBC, 0x3A, 0xF0, + 0x2D, 0x44, 0x1A, 0xE0, 0x3D, 0xF3, 0x66, 0xBE, 0x47, 0x3C, 0x6D, 0xF3, + 0x4A, 0x3C, 0x66, 0xA5, 0x00, 0xA4, 0x31, 0x08, 0x4D, 0x3C, 0x4C, 0x3C, + 0x4B, 0x3C, 0x00, 0xA2, 0x7D, 0xF2, 0x04, 0xBC, 0x0A, 0xF1, 0x33, 0x28, + 0x0C, 0xBE, 0xBA, 0xF0, 0x02, 0xA1, 0x4B, 0x3C, 0x4C, 0x3C, 0x3E, 0xA8, + 0x02, 0xAE, 0x2D, 0xF2, 0x3E, 0xA8, 0x02, 0xAE, 0xDD, 0xF1, 0x0C, 0xBE, + 0x51, 0x28, 0x7A, 0xF0, 0x2B, 0x28, 0x4D, 0x3C, 0x1E, 0xE4, 0x3E, 0xF0, + 0xDE, 0x74, 0x38, 0xF0, 0x59, 0x24, 0x09, 0xC0, 0x43, 0x2A, 0xAF, 0x13, + 0xF0, 0x0E, 0x19, 0xE4, 0x00, 0xC0, 0x58, 0x4C, 0x00, 0xC0, 0x58, 0x3C, + 0x59, 0x34, 0x09, 0xC0, 0x32, 0xF0, 0x46, 0xE0, 0x44, 0x4E, 0x52, 0x26, + 0x1E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0x40, 0x2A, 0x51, 0x28, + 0x6A, 0xE1, 0x99, 0xF0, 0x12, 0xB6, 0x3A, 0x28, 0x51, 0xE0, 0x17, 0xE0, + 0x4F, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x3A, 0x3C, 0x2A, 0xE4, 0x3F, 0x28, + 0x2A, 0xE4, 0x16, 0xE0, 0x42, 0x18, 0x3D, 0x28, 0x2A, 0xE4, 0x3A, 0x28, + 0x3B, 0x28, 0x48, 0xF0, 0x4E, 0x28, 0x2A, 0xE4, 0x2A, 0xE4, 0x3B, 0x28, + 0x2E, 0xE4, 0x16, 0xE0, 0x2E, 0xE4, 0x16, 0xE0, 0x39, 0x18, 0x3C, 0x28, + 0x21, 0xAF, 0x57, 0x7E, 0x0F, 0xC7, 0x49, 0xE0, 0xF3, 0xD1, 0x2E, 0xE4, + 0x46, 0xE0, 0x02, 0xAE, 0x12, 0x29, 0x70, 0x03, 0x62, 0xE1, 0x00, 0x00, + 0x04, 0x3C, 0x48, 0x28, 0x2E, 0xE4, 0xE4, 0xCF, 0xB0, 0x02, 0x62, 0xE1, + 0x70, 0x03, 0x61, 0xE1, 0xF3, 0xD1, 0x2A, 0xE4, 0x13, 0x0F, 0x1E, 0xE4, + 0x48, 0x88, 0xB0, 0x02, 0x62, 0xE1, 0x00, 0x00, 0x12, 0x29, 0x10, 0x0F, + 0x84, 0xE1, 0x22, 0x00, 0x82, 0xE0, 0x2E, 0xE4, 0x02, 0xA2, 0xE4, 0xCF, + 0x04, 0x88, 0x98, 0xF0, 0x40, 0xBA, 0x98, 0xE0, 0x11, 0x29, 0x1C, 0x0F, + 0x84, 0xE1, 0x22, 0x00, 0x6D, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x12, 0x3D, + 0x15, 0x4C, 0x14, 0x20, 0x08, 0x3C, 0x82, 0xE0, 0x02, 0x34, 0x39, 0x2C, + 0x01, 0x3C, 0x00, 0x34, 0x63, 0xE1, 0x05, 0x3C, 0x04, 0x28, 0x03, 0x3C, + 0x13, 0x3D, 0x1F, 0xC7, 0x00, 0xA2, 0x00, 0x06, 0x6A, 0xF0, 0x7C, 0x0F, + 0x0D, 0xE4, 0x06, 0xBC, 0xBA, 0xF1, 0x02, 0xA1, 0x3A, 0xF1, 0x02, 0xA1, + 0x0D, 0xE4, 0xE0, 0x0C, 0x1E, 0xE4, 0x2E, 0xF3, 0x03, 0x1C, 0x02, 0x10, + 0x02, 0xA0, 0x7C, 0x0F, 0x01, 0x0C, 0x00, 0x00, 0x32, 0xF0, 0x12, 0xE0, + 0xDE, 0xF0, 0x03, 0xA2, 0x03, 0x3C, 0x02, 0x34, 0x7C, 0x0F, 0x0D, 0xE4, + 0xE0, 0x0C, 0x1E, 0xE4, 0x00, 0x10, 0x03, 0x0C, 0x02, 0x00, 0x02, 0xA0, + 0xFF, 0xA2, 0x40, 0xBC, 0x0E, 0xF7, 0x01, 0x1C, 0x82, 0xF0, 0x8C, 0x0F, + 0x1E, 0xE4, 0x0F, 0x3C, 0x0F, 0x2A, 0x3A, 0xF0, 0x3F, 0x28, 0x03, 0xA2, + 0xD4, 0xF1, 0x46, 0xE0, 0x04, 0x29, 0x03, 0xA8, 0x05, 0x28, 0xA7, 0x0F, + 0x1E, 0xE4, 0x12, 0x3D, 0x2A, 0xE4, 0x04, 0xA0, 0x05, 0x3C, 0x02, 0xA1, + 0x02, 0xA1, 0x08, 0x28, 0x30, 0x0F, 0x0E, 0xE4, 0x05, 0x28, 0x00, 0x06, + 0x63, 0xE1, 0x92, 0xE0, 0xE8, 0xF7, 0x11, 0x81, 0x13, 0x29, 0xA4, 0xF0, + 0x02, 0xA1, 0x05, 0x28, 0x12, 0x3D, 0x01, 0x29, 0x2E, 0xE4, 0x02, 0xA2, + 0x6E, 0xF7, 0x05, 0x3C, 0x84, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, + 0xC2, 0xE0, 0x0B, 0x02, 0xC2, 0xE0, 0x24, 0xE4, 0x4B, 0xF0, 0xA3, 0x23, + 0x1E, 0xE4, 0x14, 0x02, 0x2E, 0xE4, 0x16, 0x02, 0xC2, 0xE0, 0x7F, 0x28, + 0x30, 0x03, 0x63, 0xE1, 0x07, 0x3E, 0x06, 0x3C, 0x02, 0xAE, 0x24, 0xE4, + 0x02, 0xA1, 0x19, 0x28, 0xA4, 0x0F, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA0, + 0x07, 0x1A, 0x06, 0x1C, 0x0B, 0x2B, 0x13, 0x2D, 0x02, 0xE0, 0x86, 0xE0, + 0x69, 0xF0, 0x78, 0xF0, 0x13, 0x81, 0x2E, 0xE4, 0x02, 0xAF, 0x30, 0x03, + 0x09, 0x3C, 0x2E, 0xE4, 0xFE, 0xA2, 0x13, 0x81, 0x2A, 0xE4, 0x6D, 0x28, + 0x92, 0xE0, 0x08, 0x28, 0xB3, 0x0F, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, + 0x11, 0x81, 0x3A, 0xF0, 0x09, 0x18, 0x01, 0x29, 0x00, 0xE0, 0x08, 0x18, + 0x82, 0xE0, 0x2E, 0xE4, 0x03, 0x3D, 0x02, 0xA2, 0x96, 0xE0, 0x00, 0x06, + 0x00, 0xE0, 0x04, 0xAE, 0x02, 0xAF, 0x2E, 0xE4, 0x2E, 0xE4, 0x07, 0x29, + 0x9E, 0xE0, 0x03, 0x02, 0x00, 0xE0, 0x42, 0x00, 0xC0, 0xE0, 0x0A, 0x3C, + 0x1E, 0xE4, 0x07, 0xA2, 0x0A, 0x08, 0x80, 0x01, 0x05, 0xE0, 0x41, 0x00, + 0xC0, 0xE0, 0xD8, 0x0F, 0x42, 0xE0, 0x0A, 0x0A, 0x0F, 0xAE, 0x6E, 0x00, + 0x2E, 0xE4, 0xD8, 0x0F, 0x1E, 0xE4, 0x05, 0xA2, 0x12, 0xD1, 0x00, 0x06, + 0x11, 0xD1, 0x20, 0xCE, 0xF8, 0xF7, 0x28, 0xCA, 0x27, 0xCE, 0x20, 0x00, + 0x00, 0x00, 0xF3, 0xD1, 0x2E, 0xE4, 0x2E, 0xE4, 0x1F, 0x00, 0x22, 0xD0, + 0xB0, 0x02, 0x67, 0xE1, 0xE4, 0xCF, 0x17, 0x29, 0xEB, 0x0F, 0x84, 0xE1, + 0xCC, 0x11, 0x1E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x62, 0x28, 0x2E, 0xE4, + 0xD2, 0x11, 0x1E, 0xE4, 0x67, 0xE1, 0xD6, 0x11, 0x1E, 0xE4, 0x2A, 0xE4, + 0x42, 0xE0, 0x17, 0x4F, 0x17, 0x27, 0xFD, 0x05, 0x11, 0xD1, 0x20, 0xCE, + 0xF9, 0xF7, 0x29, 0xCA, 0x13, 0xD1, 0x80, 0x00, 0x12, 0xD1, 0x00, 0x00, + 0x2C, 0xCA, 0xF8, 0xF7, 0x28, 0xCA, 0x12, 0x00, 0x2E, 0xE4, 0x62, 0x3C, + 0x04, 0xA2, 0xFA, 0xF7, 0x59, 0x24, 0x09, 0xC0, 0x00, 0x06, 0x61, 0xE1, + 0x1E, 0xE4, 0x11, 0x3D, 0x00, 0xC0, 0x58, 0x4C, 0x11, 0x3D, 0x11, 0x35, + 0x10, 0xAE, 0xD6, 0x11, 0x15, 0xAE, 0x01, 0x2F, 0xFF, 0x05, 0x61, 0xE1, + 0x00, 0x02, 0x03, 0xE0, 0x45, 0xE0, 0x10, 0xAF, 0x57, 0xF3, 0x97, 0x3C, + 0x2E, 0xB6, 0x00, 0xA2, 0x1E, 0xE4, 0x98, 0xF0, 0x04, 0xA1, 0x62, 0x28, + 0x1E, 0xE4, 0x00, 0x02, 0x00, 0xE0, 0xD6, 0x11, 0x1E, 0xE4, 0x62, 0x3C, + 0x00, 0xA2, 0xD2, 0x11, 0x11, 0x27, 0xFD, 0x05, 0x61, 0xE1, 0xD6, 0x11, + 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x11, 0x4F, 0x12, 0xD1, 0x00, 0x00, + 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x12, 0x00, 0x13, 0xD1, 0x80, 0x00, + 0x1E, 0xE4, 0xFA, 0xF7, 0x2C, 0xCA, 0xF8, 0xF7, 0x1E, 0xE4, 0x00, 0x02, + 0x00, 0xE0, 0xD6, 0x11, 0x01, 0x2F, 0xFF, 0x05, 0x61, 0xE1, 0xD2, 0x11, + 0x5D, 0x0C, 0x1E, 0xE4, 0x45, 0xE0, 0x15, 0xAE, 0x97, 0x3C, 0x2E, 0xB6, + 0x00, 0xA2, 0x88, 0xF0, 0x8E, 0xF5, 0x4C, 0x0A, 0x1E, 0xE4, 0x47, 0xF0, + 0x54, 0x0C, 0x1E, 0xE4, 0x02, 0x06, 0x61, 0xE1, 0x01, 0x4D, 0xFF, 0x00, + 0x08, 0xE0, 0x20, 0xAF, 0x01, 0x3D, 0x54, 0x0C, 0x1E, 0xE4, 0x11, 0x3D, + 0x11, 0x4F, 0x11, 0x27, 0x01, 0x06, 0x61, 0xE1, 0x42, 0xE0, 0x54, 0x0C, + 0x1E, 0xE4, 0x11, 0xAF, 0x52, 0xE0, 0x15, 0xE0, 0x0F, 0xA2, 0x0E, 0xA0, + 0xCF, 0x11, 0x1E, 0xE4, 0xD2, 0x11, 0x1E, 0xE4, 0xCF, 0x11, 0x1E, 0xE4, + 0x76, 0x11, 0x1E, 0xE4, 0x2E, 0xE4, 0xCC, 0x11, 0x1E, 0xE4, 0x02, 0xA0, + 0x0A, 0xE4, 0xCF, 0x11, 0x1E, 0xE4, 0x00, 0x3C, 0x61, 0xE1, 0x04, 0x3C, + 0x02, 0xA1, 0xE4, 0x10, 0x02, 0x3C, 0x0F, 0x27, 0x04, 0xE0, 0x00, 0x06, + 0x8A, 0x11, 0x1E, 0xE4, 0x03, 0x3C, 0xFE, 0xA2, 0x01, 0x29, 0x2A, 0xF1, + 0x00, 0x18, 0x01, 0x29, 0x02, 0x3C, 0x01, 0x29, 0x52, 0xF0, 0x02, 0x18, + 0x02, 0xA1, 0x04, 0x28, 0x03, 0x3C, 0x04, 0x28, 0x04, 0xE4, 0x03, 0x28, + 0x12, 0xF7, 0x04, 0x3C, 0x8A, 0x11, 0x1E, 0xE4, 0x04, 0x3C, 0xE4, 0x10, + 0x01, 0x29, 0x9C, 0x09, 0x1E, 0xE4, 0x00, 0xA2, 0x00, 0xC0, 0x58, 0x3C, + 0x59, 0x34, 0x09, 0xC0, 0x11, 0x21, 0x11, 0x3D, 0x0F, 0x27, 0x04, 0xE0, + 0xAA, 0x11, 0x1E, 0xE4, 0x10, 0xAF, 0x09, 0x4D, 0x04, 0xE0, 0x76, 0x11, + 0x1E, 0xE4, 0x04, 0x28, 0x1E, 0xE4, 0x7F, 0x00, 0x05, 0xE0, 0x00, 0x00, + 0x10, 0xAF, 0x01, 0x4D, 0x11, 0x21, 0x9F, 0x11, 0xDA, 0x11, 0x1E, 0xE4, + 0x00, 0x02, 0x00, 0xE0, 0x20, 0xAE, 0xFF, 0x00, 0x08, 0xE0, 0x11, 0x29, + 0x90, 0xCC, 0x4F, 0x0C, 0x1E, 0xE4, 0x01, 0x4D, 0xE2, 0x11, 0x1E, 0xE4, + 0x00, 0x02, 0x02, 0xE0, 0x59, 0x0C, 0x1E, 0xE4, 0x28, 0xB6, 0x04, 0xB6, + 0x69, 0x0C, 0x1E, 0xE4, 0x02, 0xA2, 0x92, 0xCC, 0x02, 0xA2, 0x28, 0xE4, + 0x5D, 0x0C, 0x1E, 0xE4, 0x36, 0x11, 0x1E, 0xE4, 0x9C, 0x09, 0x1E, 0xE4, + 0x36, 0xD0, 0x9C, 0x09, 0x1E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x80, 0x00, + 0x37, 0xD0, 0xFF, 0x00, 0x59, 0x34, 0x09, 0xC0, 0x44, 0x4C, 0x52, 0x24, + 0x00, 0x3C, 0x2E, 0xE4, 0x00, 0xC0, 0x58, 0x3C, 0xEA, 0x11, 0x1E, 0xE4, + 0x4A, 0xE0, 0x01, 0x3E, 0x02, 0xA1, 0xEA, 0xF0, 0xCF, 0x11, 0x1E, 0xE4, + 0x1E, 0xE4, 0x00, 0x06, 0x61, 0xE1, 0x04, 0x3C, 0x7A, 0xF0, 0x00, 0x18, + 0x01, 0x29, 0x8A, 0x11, 0x82, 0xF7, 0x04, 0x3C, 0x02, 0xA1, 0x04, 0x28, + 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x00, 0xA2, 0x11, 0x21, 0x11, 0x3D, + 0x0F, 0x27, 0x04, 0xE0, 0x1E, 0xE4, 0x01, 0x2A, 0x10, 0xAF, 0x09, 0x4D, + 0x76, 0x11, 0x1E, 0xE4, 0x04, 0x28, 0xBB, 0x11, 0x00, 0x00, 0x00, 0xE0, + 0x0A, 0xAE, 0x01, 0x28, 0x01, 0x28, 0x9F, 0x11, 0x1E, 0xE4, 0x3F, 0xA2, + 0x94, 0xE0, 0x10, 0x04, 0x00, 0xE0, 0x04, 0xAE, 0x00, 0xE0, 0x10, 0xAF, + 0x01, 0x4D, 0x11, 0x21, 0x11, 0x29, 0x12, 0x3D, 0x12, 0x35, 0x80, 0x00, + 0x01, 0x4D, 0x20, 0xAE, 0xFF, 0x00, 0x08, 0xE0, 0x02, 0xE0, 0x90, 0xCC, + 0x4F, 0x0C, 0x1E, 0xE4, 0x04, 0xB6, 0x12, 0x3D, 0x12, 0x35, 0x80, 0x00, + 0x92, 0xCC, 0x59, 0x0C, 0x1E, 0xE4, 0x28, 0xB6, 0x01, 0x00, 0x15, 0xD1, + 0x2E, 0xE4, 0x02, 0xA2, 0x1E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x90, 0xE1, + 0x15, 0xD1, 0xAA, 0x11, 0x1E, 0xE4, 0xDE, 0x11, 0x00, 0xE0, 0xDE, 0x11, + 0x1E, 0xE4, 0x00, 0x00, 0x1E, 0xE4, 0xDA, 0x11, 0x1E, 0xE4, 0x00, 0x02, + 0x1E, 0xE4, 0x00, 0x02, 0x02, 0xE0, 0xE6, 0x11, 0x1E, 0xE4, 0x28, 0xB6, + 0x04, 0xB6, 0xE2, 0x11, 0x82, 0xE0, 0x2E, 0xE4, 0x92, 0xCC, 0x59, 0x0C, + 0x1E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0xE4, 0x3C, 0x00, 0xE0, 0x04, 0xAE, + 0x49, 0xE0, 0xED, 0x11, 0x09, 0x4D, 0x11, 0x21, 0x92, 0xE0, 0x10, 0x04, + 0x09, 0x4D, 0x11, 0x21, 0xBB, 0x11, 0x1E, 0xE4, 0x11, 0x3D, 0x11, 0x35, + 0x80, 0x00, 0x00, 0xE0, 0x80, 0x00, 0x02, 0xE0, 0x09, 0x4D, 0x11, 0x21, + 0x28, 0xB6, 0x04, 0xB6, 0x11, 0x3D, 0x11, 0x35, 0xE4, 0x28, 0x92, 0xCC, + 0x59, 0x0C, 0x1E, 0xE4, 0x05, 0xE0, 0x06, 0xAE, 0x2E, 0xE4, 0x92, 0xE0, + 0xC1, 0xE0, 0x42, 0xE0, 0x11, 0xAE, 0x3A, 0x02, 0xF9, 0xF7, 0x29, 0xCA, + 0x42, 0xE0, 0x46, 0x00, 0x12, 0xD1, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, + 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x04, 0x00, 0x06, 0xAE, 0x04, 0x28, + 0x2E, 0xE4, 0xF8, 0xF7, 0x42, 0xE0, 0x11, 0xAE, 0x3A, 0x02, 0x05, 0xE0, + 0x29, 0xCA, 0x42, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x00, 0x06, 0x11, 0xD1, + 0x20, 0xCE, 0xF9, 0xF7, 0x03, 0x00, 0x13, 0xD1, 0x04, 0x00, 0x12, 0xD1, + 0x66, 0xCC, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x6C, 0xCC, 0x42, 0xE0, + 0x6E, 0xCC, 0x6A, 0xCC, 0x70, 0xCC, 0x68, 0xCC, 0x60, 0xCC, 0x00, 0xA2, + 0xFD, 0x05, 0x67, 0xE1, 0x2E, 0xE4, 0x28, 0xE1, 0x29, 0xCA, 0x42, 0xE0, + 0x17, 0x4F, 0x17, 0x27, 0x9F, 0x09, 0x1E, 0xE4, 0x20, 0xCE, 0xF9, 0xF7, + 0x23, 0xCE, 0x15, 0xB6, 0x80, 0x00, 0x05, 0xE0, 0x0B, 0xAE, 0xDE, 0xF0, + 0x80, 0x00, 0x12, 0xD1, 0x67, 0xE1, 0x23, 0xCE, 0x00, 0x00, 0x01, 0xE0, + 0x42, 0xE0, 0x17, 0x4F, 0x17, 0x27, 0xFD, 0x05, 0x13, 0xD1, 0x20, 0x00, + 0x12, 0xD1, 0x20, 0xCE, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x13, 0x00, + 0x09, 0xC0, 0x1E, 0xF2, 0x20, 0x3C, 0x09, 0xC0, 0x1E, 0x34, 0x09, 0xC0, + 0xEE, 0xF1, 0x20, 0x28, 0x1E, 0x24, 0x09, 0xC0, 0xAE, 0xF1, 0x1F, 0x3C, + 0x22, 0x34, 0x09, 0xC0, 0x6E, 0xF1, 0x1F, 0x4C, 0x22, 0x24, 0x09, 0xC0, + 0x2E, 0xF1, 0x23, 0x3C, 0x24, 0x34, 0x09, 0xC0, 0xEE, 0xF0, 0x23, 0x4C, + 0x24, 0x24, 0x09, 0xC0, 0xAE, 0xF0, 0x25, 0x3C, 0x21, 0x3C, 0x09, 0xC0, + 0x6E, 0xF0, 0x25, 0x4C, 0x00, 0xC0, 0x21, 0x28, 0x09, 0xC0, 0x3E, 0xF0, + 0x0A, 0xE4, 0xCF, 0x11, 0x1E, 0xE4, 0x2E, 0xE4, 0x61, 0xE1, 0x04, 0x3C, + 0x02, 0xA1, 0x06, 0x12, 0x01, 0x29, 0x8A, 0x11, 0x1E, 0xE4, 0x00, 0x06, + 0x00, 0xC0, 0x58, 0x4E, 0x59, 0x26, 0x09, 0xC0, 0x02, 0xA1, 0x04, 0x28, + 0x7A, 0xF0, 0x46, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, 0x42, 0xF7, 0x04, 0x3C, + 0x1E, 0xE4, 0x06, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0xC2, 0xE0, 0x4E, 0x00, + 0x04, 0xE0, 0x81, 0x0C, 0x79, 0x01, 0xC2, 0xE0, 0x18, 0xA2, 0x78, 0x01, + 0x1E, 0xE4, 0xE0, 0x3C, 0xDF, 0x3C, 0x00, 0xA2, 0xE0, 0x3C, 0x02, 0xA0, + 0xE0, 0x28, 0x6E, 0x12, 0x1E, 0x3C, 0x00, 0xA2, 0xA4, 0xF7, 0xD7, 0x18, + 0x1E, 0xE4, 0x5C, 0x3C, 0x5B, 0x3C, 0x59, 0x3C, 0x59, 0x4C, 0x1E, 0x24, + 0xE0, 0x3C, 0x65, 0x12, 0x02, 0xE4, 0x46, 0xE0, 0x44, 0x4E, 0x52, 0x26, + 0xD9, 0x3C, 0x65, 0x12, 0x1E, 0xE4, 0x61, 0x12, 0xD9, 0x28, 0x19, 0x13, + 0x18, 0xE4, 0xE0, 0x18, 0x1E, 0x13, 0x1A, 0xE4, 0xDF, 0x28, 0xE0, 0x3C, + 0x7A, 0xF0, 0xDF, 0x28, 0x47, 0x13, 0x1E, 0xE4, 0x6A, 0xE1, 0x0C, 0xF1, + 0x70, 0x26, 0x1E, 0xE4, 0x16, 0xE0, 0x4F, 0x28, 0xDF, 0x3C, 0x00, 0xA2, + 0x09, 0xC0, 0x9E, 0x26, 0x1E, 0xE4, 0x38, 0x3C, 0x5B, 0x34, 0x02, 0xA0, + 0x5A, 0x4C, 0x5B, 0x24, 0x68, 0x13, 0x1E, 0xE4, 0x00, 0xC0, 0x5A, 0x3C, + 0xDF, 0x28, 0x5C, 0x3C, 0x5B, 0x34, 0x04, 0xCB, 0x02, 0xA1, 0x86, 0xCB, + 0x26, 0x12, 0x0A, 0xE4, 0x1E, 0xE4, 0xC8, 0xF4, 0x94, 0xC8, 0xE0, 0xF4, + 0x0E, 0xE4, 0xDF, 0x3C, 0x00, 0xA2, 0x18, 0x0D, 0x81, 0x0C, 0x1E, 0xE4, + 0x00, 0xA2, 0x26, 0x12, 0x73, 0x13, 0x1A, 0xE4, 0x5B, 0x28, 0x2E, 0xE4, + 0x94, 0xE0, 0x5B, 0x08, 0x90, 0x03, 0x04, 0xE0, 0xB0, 0x04, 0x61, 0xE1, + 0x2E, 0xE4, 0x02, 0x29, 0x11, 0x3D, 0x48, 0x28, 0x11, 0x3D, 0x38, 0x28, + 0x11, 0x3D, 0x4B, 0x28, 0x11, 0x3D, 0x4A, 0x28, 0x11, 0x3D, 0x4D, 0x28, + 0x11, 0x3D, 0x4C, 0x28, 0x11, 0x3D, 0x96, 0xCB, 0x11, 0x3D, 0x86, 0xCB, + 0x54, 0x0C, 0x1E, 0xE4, 0x11, 0x3D, 0xDF, 0x28, 0x5D, 0x0C, 0x1E, 0xE4, + 0x11, 0x3D, 0x11, 0x35, 0x22, 0xD0, 0xB0, 0x02, 0x62, 0xE1, 0x11, 0x3D, + 0x12, 0x29, 0x90, 0x12, 0x84, 0xE1, 0x0F, 0x00, 0x11, 0x8B, 0x34, 0x00, + 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x3D, 0x11, 0x35, 0x60, 0xC8, 0x33, 0x00, + 0x64, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x62, 0xC8, 0x35, 0x00, 0x11, 0x8B, + 0x11, 0x3D, 0x11, 0x35, 0x37, 0x00, 0x11, 0x8B, 0x36, 0x00, 0x11, 0x8B, + 0x0E, 0xAE, 0xE0, 0x28, 0x38, 0x00, 0x11, 0x8B, 0x42, 0xE0, 0x11, 0xAE, + 0xF2, 0x01, 0x05, 0xE0, 0x29, 0xCA, 0x42, 0xE0, 0x46, 0x00, 0xC1, 0xE0, + 0xB0, 0x04, 0x11, 0xD1, 0x20, 0xCE, 0xF9, 0xF7, 0x02, 0x00, 0x13, 0xD1, + 0x28, 0x00, 0x12, 0xD1, 0xD9, 0x28, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, + 0x11, 0xAE, 0xF2, 0x01, 0x05, 0xE0, 0x0E, 0xAE, 0x42, 0xE0, 0x46, 0x00, + 0xC1, 0xE0, 0x42, 0xE0, 0x11, 0xD1, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, + 0x13, 0xD1, 0x28, 0x00, 0x12, 0xD1, 0xB0, 0x04, 0x61, 0xE1, 0xF8, 0xF7, + 0x28, 0xCA, 0x03, 0x00, 0x11, 0x29, 0x38, 0x3C, 0x11, 0x29, 0xB0, 0x04, + 0x11, 0x29, 0x4A, 0x3C, 0x11, 0x29, 0x48, 0x3C, 0x11, 0x29, 0x4C, 0x3C, + 0x11, 0x29, 0x4B, 0x3C, 0x11, 0x29, 0x55, 0x26, 0x1E, 0xE4, 0x4D, 0x3C, + 0x11, 0x29, 0x96, 0xCF, 0x11, 0x29, 0x86, 0xCF, 0x1E, 0xE4, 0x11, 0x4D, + 0x11, 0x25, 0xDF, 0x3C, 0x1E, 0xE4, 0x11, 0x29, 0x90, 0xCC, 0x4F, 0x0C, + 0xB0, 0x02, 0x62, 0xE1, 0x92, 0xCC, 0x59, 0x0C, 0xF5, 0x12, 0x84, 0xE1, + 0x0F, 0x00, 0x22, 0xD0, 0x00, 0x00, 0xF3, 0xD1, 0x12, 0x3D, 0x11, 0x29, + 0x22, 0x00, 0x48, 0x88, 0xB0, 0x02, 0x62, 0xE1, 0xE4, 0xCF, 0x12, 0x29, + 0xFF, 0x12, 0x84, 0xE1, 0x11, 0x89, 0xEA, 0x11, 0x1E, 0xE4, 0xD9, 0x28, + 0x11, 0x21, 0x33, 0x00, 0x11, 0x89, 0x34, 0x00, 0x11, 0x4D, 0x11, 0x21, + 0x60, 0xCC, 0x11, 0x4D, 0x64, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x62, 0xCC, + 0x36, 0x00, 0x11, 0x89, 0x35, 0x00, 0x11, 0x89, 0x38, 0x00, 0x11, 0x89, + 0x37, 0x00, 0x11, 0x89, 0x1E, 0xE4, 0x6E, 0x12, 0x1E, 0xE4, 0x2E, 0xE4, + 0x59, 0x4C, 0x1E, 0x24, 0x2E, 0xE4, 0xBB, 0x12, 0x2A, 0xE4, 0xEB, 0x10, + 0x1E, 0xE4, 0xD9, 0x2A, 0x2A, 0xE4, 0x6A, 0xE1, 0xCC, 0x0D, 0x1E, 0xE4, + 0x2F, 0x13, 0x1E, 0xE4, 0x55, 0x26, 0x1E, 0xE4, 0x03, 0xA2, 0x2E, 0xE4, + 0xDF, 0x3C, 0x02, 0xA2, 0x61, 0xE1, 0xFF, 0x00, 0x0D, 0xE0, 0xD9, 0x5A, + 0x84, 0xE1, 0x22, 0x00, 0x57, 0x88, 0x30, 0x04, 0x11, 0x3D, 0x52, 0xE0, + 0x01, 0x29, 0x3B, 0x13, 0xE2, 0x28, 0xE1, 0x3C, 0x52, 0xE0, 0xE1, 0x28, + 0x00, 0xA2, 0x2E, 0xE4, 0xE2, 0x3C, 0x52, 0xE0, 0x5B, 0x28, 0x2E, 0xE4, + 0xE2, 0x3C, 0xE1, 0x3C, 0x00, 0xE0, 0x5B, 0x28, 0x43, 0x13, 0x1A, 0xE4, + 0xD9, 0x5C, 0xE1, 0x28, 0x92, 0xE0, 0x30, 0x04, 0xD9, 0x5C, 0x11, 0x29, + 0xE3, 0x3C, 0x02, 0xA8, 0xE3, 0x3C, 0xE3, 0x4C, 0x02, 0xAE, 0x02, 0xA8, + 0x04, 0xAE, 0x02, 0xA8, 0xD9, 0x5C, 0x11, 0x29, 0xD9, 0x5C, 0xE2, 0x28, + 0xE3, 0x3C, 0xE3, 0x4C, 0xE3, 0x3C, 0xE3, 0x4C, 0x06, 0xAE, 0x02, 0xA8, + 0x2E, 0xE4, 0x00, 0x00, 0x8A, 0xD1, 0x12, 0xCF, 0x92, 0xE0, 0x30, 0x04, + 0x00, 0xE0, 0x5B, 0x28, 0xD9, 0x58, 0x02, 0xA2, 0xE2, 0x3C, 0x01, 0x29, + 0x5C, 0x28, 0x2E, 0xE4, 0xE1, 0x3C, 0x01, 0x3D, 0x11, 0xAE, 0xF6, 0x01, + 0x05, 0xE0, 0x10, 0xAE, 0x42, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x42, 0xE0, + 0x11, 0xD1, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x08, 0xE0, 0x06, 0xA0, + 0x57, 0x28, 0x90, 0x03, 0x03, 0x00, 0x13, 0xD1, 0x24, 0xCE, 0xFC, 0x00, + 0xD8, 0x3C, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x57, 0x24, 0x09, 0xC0, + 0xD7, 0x3C, 0x02, 0xA0, 0x44, 0x3C, 0x52, 0x34, 0x00, 0xC0, 0x56, 0x4C, + 0x0A, 0xE4, 0x2D, 0xE4, 0xD6, 0x3C, 0x0C, 0xBC, 0x0A, 0x14, 0x0A, 0xE4, + 0x02, 0xA1, 0xD2, 0x13, 0x06, 0xA1, 0x27, 0x14, 0x0A, 0xE4, 0x02, 0xA1, + 0x0A, 0xE4, 0x02, 0xA1, 0xA7, 0x13, 0x06, 0xE4, 0x40, 0xBA, 0x2E, 0xE4, + 0x6B, 0xE1, 0x15, 0x15, 0x2D, 0xE4, 0xE0, 0x0C, 0x1E, 0xE4, 0xDA, 0x3C, + 0x00, 0xA2, 0x2E, 0xE4, 0xDB, 0x3C, 0x02, 0xA0, 0x24, 0xE4, 0x06, 0xA1, + 0xD6, 0x28, 0xDE, 0x3C, 0x44, 0x4C, 0x52, 0x24, 0x20, 0xE4, 0x04, 0xA1, + 0xDB, 0x7C, 0x0F, 0xC7, 0x02, 0xA1, 0xDB, 0x08, 0x51, 0x15, 0x1E, 0xE4, + 0xFF, 0xFF, 0x08, 0xE0, 0xDC, 0x84, 0xDC, 0x3C, 0xDE, 0x74, 0xDE, 0x3C, + 0x44, 0x4E, 0x52, 0x26, 0x18, 0xE0, 0xDB, 0x82, 0x08, 0xA1, 0xD6, 0x28, + 0xDC, 0x3C, 0x66, 0xE0, 0xEA, 0x14, 0x0A, 0xE4, 0x79, 0x14, 0x04, 0xE4, + 0x00, 0x06, 0x61, 0xE1, 0xEA, 0x14, 0x0E, 0xE4, 0xDC, 0x13, 0x84, 0xE1, + 0x22, 0x00, 0xD8, 0x88, 0x02, 0xA0, 0x2D, 0xE4, 0xE0, 0x0C, 0x1E, 0xE4, + 0x62, 0xE1, 0x00, 0x06, 0x61, 0xE1, 0x11, 0x3D, 0x00, 0x3C, 0xD9, 0x3C, + 0x00, 0xA2, 0x90, 0x03, 0x02, 0xA0, 0x00, 0x28, 0x5C, 0x3C, 0x5B, 0x3C, + 0x00, 0xA2, 0xE6, 0xF0, 0x01, 0x19, 0x00, 0x3C, 0xD9, 0x3C, 0x02, 0xA0, + 0xD9, 0x28, 0x00, 0x3C, 0x00, 0xA2, 0x46, 0xF7, 0xD8, 0x18, 0x11, 0x81, + 0xFE, 0xF6, 0x00, 0x06, 0x61, 0xE1, 0xD9, 0x3C, 0x02, 0xA0, 0x5B, 0x28, + 0x12, 0x3D, 0xD9, 0x28, 0x5B, 0x3C, 0x84, 0xF6, 0x57, 0x18, 0x5B, 0x3C, + 0x02, 0xA0, 0x5C, 0x28, 0x35, 0x15, 0x1E, 0xE4, 0x90, 0x03, 0x62, 0xE1, + 0x58, 0x18, 0x5C, 0x3C, 0x5C, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xE4, 0xF5, + 0xD7, 0x82, 0x5C, 0x84, 0x90, 0x03, 0x62, 0xE1, 0xD7, 0x7C, 0x0F, 0xC7, + 0x02, 0xAF, 0x18, 0xE0, 0x45, 0xCC, 0x03, 0xA1, 0x57, 0x2A, 0x20, 0xAF, + 0x02, 0xA0, 0x12, 0x3D, 0x1E, 0x14, 0x84, 0xE1, 0x1E, 0xE4, 0x16, 0xB6, + 0xD7, 0x1A, 0x49, 0xE0, 0x5C, 0x3C, 0x02, 0xA0, 0x5C, 0x28, 0x35, 0x15, + 0x67, 0xE1, 0x2E, 0xE4, 0x74, 0xF6, 0x58, 0x18, 0x44, 0xCC, 0x02, 0xA1, + 0xD8, 0x28, 0x00, 0x06, 0xE0, 0x0C, 0x1E, 0xE4, 0x35, 0x14, 0x84, 0xE1, + 0xE0, 0x0C, 0x1E, 0xE4, 0x17, 0x3D, 0x2D, 0xE4, 0x90, 0x03, 0x62, 0xE1, + 0x17, 0x3D, 0x2D, 0xE4, 0xD7, 0x28, 0x04, 0x3C, 0x02, 0xA1, 0x57, 0x28, + 0x00, 0xA2, 0x12, 0x3D, 0x04, 0x86, 0x02, 0xA1, 0x5C, 0x28, 0x35, 0x15, + 0x1E, 0xE4, 0x5C, 0x3C, 0xA4, 0xF7, 0x58, 0x18, 0x5C, 0x3C, 0x02, 0xA0, + 0xD9, 0x28, 0xD9, 0x3C, 0x04, 0xA1, 0xD7, 0x28, 0x92, 0xE0, 0x00, 0x06, + 0x00, 0xE0, 0x02, 0xAE, 0x00, 0x34, 0x57, 0x7C, 0x0F, 0xC7, 0x11, 0x29, + 0x57, 0x7C, 0x0F, 0xC7, 0x11, 0x29, 0x02, 0x3C, 0x5C, 0x3C, 0x02, 0x28, + 0x03, 0x3C, 0x01, 0x34, 0xFA, 0xF7, 0x2C, 0xCA, 0x70, 0xF1, 0x03, 0x18, + 0x00, 0xE0, 0x00, 0x28, 0x37, 0x15, 0x1E, 0xE4, 0x00, 0x18, 0x01, 0x28, + 0x94, 0xE0, 0x90, 0x03, 0x04, 0x86, 0xD9, 0x28, 0x04, 0x3C, 0x54, 0xF0, + 0x5C, 0x28, 0x35, 0x15, 0x1E, 0xE4, 0x12, 0x3D, 0xD6, 0xF6, 0x03, 0x18, + 0x5C, 0x3C, 0x02, 0xA0, 0x42, 0xF5, 0xD9, 0x3C, 0x02, 0xA1, 0xD9, 0x28, + 0xFE, 0xA2, 0xE0, 0x09, 0x62, 0xE1, 0x2E, 0xE4, 0x00, 0xC0, 0x56, 0x4E, + 0x57, 0x26, 0x09, 0xC0, 0x00, 0x86, 0x00, 0x3E, 0x09, 0xAF, 0x1F, 0xA0, + 0x0A, 0xE4, 0xDC, 0x28, 0x57, 0x84, 0x12, 0x3D, 0x02, 0xAF, 0xDA, 0x18, + 0x57, 0x28, 0xD3, 0x14, 0x02, 0xAF, 0xDA, 0x18, 0x58, 0x28, 0x5B, 0x3C, + 0x07, 0x3C, 0x02, 0xA1, 0x57, 0x28, 0x5C, 0x3C, 0xFE, 0xA2, 0x08, 0x3C, + 0x02, 0xA1, 0x58, 0x28, 0xDA, 0x08, 0x00, 0xA2, 0x04, 0x3C, 0xDA, 0x08, + 0x01, 0x3C, 0x00, 0x3C, 0x00, 0xA2, 0x05, 0x3C, 0x1E, 0xE4, 0x03, 0x3C, + 0x02, 0xA2, 0x02, 0x3C, 0x5A, 0xE0, 0x01, 0x29, 0xAA, 0xF0, 0x58, 0x15, + 0x00, 0x3C, 0x02, 0xA0, 0x00, 0x28, 0x01, 0x3D, 0x5B, 0x28, 0x5A, 0xF2, + 0xDC, 0x18, 0x00, 0x28, 0x5B, 0x3C, 0x07, 0x64, 0x00, 0xA4, 0x04, 0x08, + 0x08, 0x64, 0x00, 0xA4, 0x05, 0x08, 0x5C, 0x28, 0x02, 0x3C, 0x02, 0xA0, + 0x02, 0x28, 0x5C, 0x3C, 0x03, 0x28, 0x02, 0x3C, 0x68, 0xF6, 0x03, 0x18, + 0x01, 0x18, 0x02, 0xA2, 0x03, 0x3C, 0x01, 0x08, 0x04, 0x28, 0x78, 0xF0, + 0xDA, 0x28, 0x01, 0x3C, 0x05, 0x3C, 0x04, 0x3E, 0x13, 0xE0, 0x05, 0x2A, + 0x12, 0xE0, 0x05, 0x2A, 0x04, 0x28, 0x7E, 0xF5, 0x00, 0xA2, 0x1E, 0xF5, + 0x05, 0x3C, 0x04, 0x3E, 0x00, 0xA2, 0x90, 0x03, 0x62, 0xE1, 0x5C, 0x3C, + 0x1A, 0xE0, 0x58, 0x15, 0x1E, 0xE4, 0x5B, 0x3C, 0x5B, 0x3C, 0x02, 0xA0, + 0x5B, 0x28, 0x12, 0x3D, 0x35, 0x15, 0x1E, 0xE4, 0x84, 0xF7, 0x57, 0x18, + 0x58, 0x18, 0x5C, 0x3C, 0x02, 0xA0, 0x5C, 0x28, 0x38, 0xF0, 0xDA, 0x28, + 0x2E, 0xE4, 0xD4, 0xF6, 0x44, 0x4C, 0x52, 0x24, 0x4E, 0xF0, 0xDC, 0x28, + 0x5C, 0x3C, 0x00, 0xA2, 0x00, 0x3C, 0xDC, 0x18, 0x5B, 0x3C, 0x00, 0xA2, + 0x90, 0x03, 0x62, 0xE1, 0x5B, 0x08, 0x18, 0xE0, 0x5C, 0x82, 0x57, 0x84, + 0x58, 0x84, 0x5B, 0xF0, 0x09, 0xA1, 0xD6, 0x2A, 0x00, 0x18, 0x5C, 0x08, + 0x18, 0xE0, 0x5B, 0x82, 0x12, 0x3F, 0x17, 0xE0, 0x24, 0xF0, 0xDA, 0x2A, + 0x57, 0x18, 0x5B, 0x3C, 0x02, 0xA0, 0x5B, 0x28, 0x5C, 0x28, 0x35, 0x15, + 0x1E, 0xE4, 0xC4, 0xF6, 0x14, 0xF6, 0x58, 0x18, 0x5C, 0x3C, 0x02, 0xA0, + 0x2D, 0xE4, 0xE0, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0x46, 0xE0, 0x44, 0x4E, + 0x52, 0x26, 0x02, 0xA0, 0x1E, 0xE4, 0xD8, 0x28, 0xA5, 0x13, 0x08, 0xE4, + 0x5C, 0x3C, 0x00, 0xA2, 0x00, 0x3C, 0x51, 0x15, 0x02, 0xA1, 0x57, 0x28, + 0x90, 0x03, 0x62, 0xE1, 0x00, 0x74, 0x2C, 0x15, 0x84, 0xE1, 0x44, 0xCC, + 0x5C, 0x28, 0x35, 0x15, 0x1E, 0xE4, 0x12, 0x3D, 0x14, 0xF7, 0x58, 0x18, + 0x5C, 0x3C, 0x02, 0xA0, 0x06, 0xA2, 0x2E, 0xF0, 0x04, 0xA2, 0x2E, 0xE4, + 0x05, 0xE0, 0x10, 0xAE, 0x5C, 0x28, 0x09, 0x3C, 0xC1, 0xE0, 0x42, 0xE0, + 0x11, 0xAE, 0xF6, 0x01, 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x46, 0x00, + 0x57, 0x28, 0x90, 0x03, 0x11, 0xD1, 0x20, 0xCE, 0x24, 0xCE, 0xFC, 0x00, + 0x08, 0xE0, 0x06, 0xA0, 0xF8, 0xF7, 0x28, 0xCA, 0x13, 0x01, 0x09, 0x88, + 0x02, 0xAF, 0x4A, 0xF0, 0x01, 0xA2, 0x2E, 0xE4, 0x2E, 0xE4, 0x4A, 0xE0, + 0xE8, 0xF7, 0x03, 0xA0, 0x1E, 0x34, 0x5B, 0x08, 0x18, 0xE0, 0x5C, 0x82, + 0xE0, 0x09, 0x00, 0xE0, 0x08, 0xAF, 0x59, 0x3C, 0x1E, 0xA8, 0x59, 0x4C, + 0x1E, 0x24, 0x92, 0xE0, 0x01, 0x29, 0x06, 0x5A, 0x03, 0xA2, 0x06, 0x3C, + 0x11, 0x3C, 0x4E, 0xBA, 0x2E, 0xE4, 0x52, 0xE0, 0x39, 0xF0, 0x00, 0xC0, + 0x5F, 0x2A, 0x01, 0xC0, 0x24, 0x3C, 0x00, 0xA2, 0x0D, 0x02, 0x1E, 0xE4, + 0x7D, 0x15, 0x84, 0xE1, 0x07, 0x00, 0x22, 0xD0, 0x24, 0x2A, 0x56, 0xE0, + 0x24, 0x5A, 0x41, 0xBA, 0x08, 0xA2, 0x24, 0x3C, 0x24, 0x3E, 0x03, 0xA0, + 0x08, 0xE4, 0x0C, 0xAF, 0x24, 0x28, 0xF0, 0x3C, 0x11, 0x28, 0xF0, 0x3C, + 0x24, 0xA2, 0x87, 0x16, 0xEA, 0xF0, 0x16, 0xA1, 0x0A, 0xF1, 0x84, 0xA1, + 0x0A, 0xE4, 0x14, 0xA1, 0xCA, 0xF0, 0x2E, 0xA1, 0x89, 0x16, 0x0A, 0xE4, + 0x18, 0xA1, 0x89, 0x16, 0x0A, 0xE4, 0x03, 0x00, 0x08, 0xE0, 0x24, 0x28, + 0x4E, 0xBA, 0xF0, 0x3C, 0x26, 0xA2, 0x89, 0x16, 0x02, 0xA2, 0x10, 0x3C, + 0x3E, 0xBC, 0x1F, 0x3C, 0x11, 0x28, 0x67, 0x3C, 0x00, 0xA2, 0x22, 0x3C, + 0x22, 0x3C, 0x06, 0xBC, 0x28, 0xF3, 0xC8, 0xA1, 0x08, 0xE4, 0x08, 0xBC, + 0xF0, 0x3C, 0x0A, 0xA2, 0x08, 0xBC, 0xF0, 0x3C, 0x0C, 0xA2, 0x87, 0x16, + 0x40, 0xBA, 0x40, 0xBA, 0x87, 0x16, 0x08, 0xE4, 0x69, 0x3E, 0x01, 0xA2, + 0x2A, 0xF2, 0x67, 0x3C, 0x1A, 0xF1, 0x40, 0xBA, 0x00, 0xC4, 0x6B, 0x3E, + 0x69, 0x3C, 0x56, 0xE0, 0x03, 0xAE, 0x69, 0x2A, 0x6B, 0x2A, 0x5F, 0x18, + 0x1E, 0xE4, 0x80, 0xE0, 0x80, 0xE0, 0x6B, 0x3C, 0x56, 0xE0, 0x03, 0xAE, + 0x7E, 0xF0, 0x92, 0x18, 0x1E, 0xE4, 0x01, 0xA2, 0x6B, 0x2A, 0x69, 0x3E, + 0x03, 0xAE, 0x69, 0x2A, 0x02, 0xA0, 0x80, 0xE0, 0x6B, 0x3E, 0x03, 0xAE, + 0x0E, 0xA2, 0x48, 0xF6, 0x10, 0xA1, 0x90, 0xE0, 0x87, 0x16, 0x0D, 0xE4, + 0x18, 0xBC, 0xF0, 0x3C, 0x13, 0x58, 0x02, 0xA2, 0x13, 0x3C, 0x08, 0xA0, + 0xF0, 0x3C, 0x10, 0xA2, 0x15, 0x3C, 0x14, 0x34, 0x87, 0x16, 0x0D, 0xE4, + 0x16, 0x3C, 0x04, 0xBC, 0x3E, 0xF3, 0xAA, 0xF0, 0x34, 0xF0, 0x02, 0xA1, + 0x0D, 0xE4, 0x18, 0xBC, 0xF0, 0x3C, 0x12, 0xA2, 0xBE, 0xF2, 0x17, 0x3C, + 0x08, 0xA0, 0x87, 0x16, 0xFC, 0x0C, 0x1E, 0xE4, 0x18, 0x3C, 0x40, 0xBA, + 0x08, 0x09, 0x61, 0xE1, 0x07, 0x09, 0x60, 0xE1, 0xFC, 0x0C, 0x1E, 0xE4, + 0x01, 0x3D, 0x00, 0x35, 0x0A, 0x09, 0x63, 0xE1, 0x09, 0x09, 0x62, 0xE1, + 0xF0, 0x3C, 0x14, 0xA2, 0x03, 0x3D, 0x02, 0x35, 0x64, 0xE1, 0x87, 0x16, + 0x0D, 0xE4, 0xFE, 0xBD, 0x02, 0xA1, 0x0A, 0xF1, 0x04, 0x3D, 0x0B, 0x09, + 0x84, 0xE1, 0xE0, 0x09, 0x62, 0xE1, 0x44, 0xCC, 0x12, 0x35, 0xFC, 0x0C, + 0x1E, 0xE4, 0x18, 0x16, 0x1E, 0xE4, 0xF0, 0x3C, 0x16, 0xA2, 0x12, 0x3D, + 0x87, 0x16, 0x0D, 0xE4, 0x1E, 0xF0, 0x85, 0x17, 0x0D, 0xE4, 0x20, 0xBC, + 0xF0, 0x3C, 0x18, 0xA2, 0x1A, 0x3C, 0x40, 0xBA, 0x19, 0x3C, 0x87, 0x16, + 0x0D, 0xE4, 0xFE, 0xBD, 0xF0, 0x3C, 0x1A, 0xA2, 0x1C, 0xA2, 0x57, 0x3C, + 0x02, 0xA0, 0x87, 0x16, 0x87, 0x16, 0x0D, 0xE4, 0xFE, 0xBD, 0xF0, 0x3C, + 0x58, 0x28, 0x57, 0x84, 0x58, 0x3C, 0x02, 0xA0, 0x57, 0x34, 0x09, 0xC0, + 0x3F, 0x02, 0x1E, 0xE4, 0x1C, 0x3C, 0x00, 0xA2, 0x00, 0xC0, 0x56, 0x3C, + 0x40, 0xBA, 0xD8, 0xF0, 0x1B, 0x3C, 0x40, 0xBA, 0x58, 0x3C, 0x02, 0xAE, + 0x58, 0x28, 0x1C, 0x3C, 0x02, 0xAE, 0x56, 0x4C, 0x57, 0x24, 0x09, 0xC0, + 0x1E, 0xE4, 0x00, 0xC0, 0x56, 0x3C, 0x57, 0x34, 0x1B, 0x2A, 0xF0, 0x3C, + 0x1E, 0xA2, 0x50, 0x17, 0x20, 0xA2, 0x1D, 0x3C, 0x36, 0xB6, 0x40, 0xBA, + 0xE4, 0x05, 0x61, 0xE1, 0x40, 0xBA, 0xF0, 0x3C, 0x61, 0xE1, 0x6A, 0xF1, + 0x11, 0x3D, 0x03, 0xC7, 0x11, 0x3D, 0xE0, 0x0C, 0x1E, 0xE4, 0xE4, 0x05, + 0x1E, 0xE4, 0x11, 0x3D, 0xE0, 0x0C, 0x1E, 0xE4, 0x02, 0xAE, 0x29, 0xF0, + 0x1B, 0x2A, 0xE0, 0x0C, 0x1B, 0x2A, 0xE0, 0x0C, 0x1E, 0xE4, 0x11, 0x3D, + 0x4D, 0xF1, 0x11, 0x3D, 0x02, 0xAE, 0x29, 0xF0, 0x20, 0x28, 0x91, 0x3C, + 0x90, 0x3C, 0x00, 0xA2, 0xBD, 0x19, 0x1E, 0xE4, 0xEB, 0x3C, 0xEA, 0x3C, + 0x16, 0xE0, 0x40, 0xBA, 0xC7, 0x19, 0x1E, 0xE4, 0x1E, 0xE4, 0x5A, 0xF0, + 0x95, 0x17, 0x1A, 0xE4, 0x6B, 0xE1, 0x2E, 0xE4, 0x6A, 0xE1, 0x18, 0x0D, + 0xAE, 0x3C, 0x40, 0xA9, 0xAE, 0x28, 0x2E, 0xE4, 0xE0, 0x0C, 0x1E, 0xE4, + 0x2E, 0xE4, 0x6B, 0xE1, 0x43, 0x17, 0x0D, 0xE4, 0x3E, 0xBC, 0x29, 0x3C, + 0x10, 0x3C, 0x10, 0x08, 0xFA, 0xF0, 0x10, 0x18, 0x43, 0x17, 0x0D, 0xE4, + 0xF8, 0x1F, 0x1E, 0xE4, 0x02, 0xA2, 0x9E, 0xCC, 0x22, 0xAE, 0x04, 0xA2, + 0x9B, 0x3C, 0x02, 0xA2, 0x81, 0x0C, 0x1E, 0xE4, 0x2A, 0x3C, 0x40, 0xBA, + 0x2D, 0x3C, 0x40, 0xBA, 0x2B, 0x3C, 0x43, 0x17, 0x0D, 0xE4, 0x0E, 0xBC, + 0x0D, 0xE4, 0x8B, 0x13, 0x1E, 0xE4, 0x5A, 0xF0, 0x1B, 0xE0, 0x2B, 0x2A, + 0x2D, 0x28, 0x43, 0x17, 0x3E, 0xBC, 0x43, 0x17, 0x08, 0xE4, 0x52, 0xE0, + 0x3E, 0xBC, 0x2C, 0x3C, 0x43, 0x17, 0x0D, 0xE4, 0x40, 0xBA, 0x43, 0x17, + 0x0D, 0xE4, 0x2E, 0x3C, 0x07, 0xA1, 0x30, 0x3E, 0x43, 0xBA, 0x2F, 0x3C, + 0x1E, 0x02, 0x1E, 0xE4, 0x43, 0x17, 0x0B, 0xE4, 0xD8, 0xF0, 0x84, 0xA1, + 0x11, 0x28, 0x79, 0xF1, 0x2D, 0x28, 0x58, 0xF0, 0x30, 0x4C, 0x2F, 0x28, + 0x04, 0xE0, 0xD8, 0xF0, 0x1B, 0x28, 0x38, 0xF0, 0xCE, 0xF0, 0x0D, 0x02, + 0x1E, 0xE4, 0x4D, 0x00, 0x42, 0x00, 0x04, 0xE0, 0x6A, 0xF0, 0x2B, 0x28, + 0x00, 0xA2, 0x5E, 0xF0, 0x0D, 0x02, 0x1E, 0xE4, 0x02, 0xA2, 0x4E, 0xF0, + 0x16, 0x02, 0x1E, 0xE4, 0x0D, 0xE4, 0x34, 0xBE, 0x16, 0x02, 0x1E, 0xE4, + 0x04, 0xE4, 0x31, 0x3C, 0x34, 0xA0, 0x43, 0x17, 0x43, 0x17, 0x02, 0xE4, + 0x68, 0xA1, 0x43, 0x17, 0x34, 0xA0, 0x43, 0x17, 0x0D, 0xE4, 0x34, 0xBE, + 0x02, 0xE4, 0x68, 0xA1, 0x43, 0x17, 0x04, 0xE4, 0x43, 0x17, 0x0D, 0xE4, + 0x18, 0xBE, 0x43, 0x17, 0x33, 0x3C, 0x40, 0xBA, 0x36, 0x3C, 0x32, 0x3C, + 0x35, 0x3C, 0x40, 0xBA, 0x34, 0x3C, 0x40, 0xBA, 0x11, 0x28, 0x68, 0x3C, + 0x37, 0x3C, 0x00, 0xA2, 0x02, 0x3C, 0x29, 0x28, 0x6A, 0xF3, 0x84, 0xA1, + 0x36, 0x0C, 0x1E, 0xE4, 0xFD, 0x20, 0x1E, 0xE4, 0x40, 0xBA, 0x37, 0x3C, + 0x40, 0xBA, 0xFA, 0xF2, 0x6A, 0x3E, 0x01, 0xA2, 0x7A, 0xF2, 0x68, 0x3C, + 0x0C, 0xA1, 0x80, 0xE0, 0x00, 0xC4, 0x6C, 0x3E, 0x40, 0xBA, 0x32, 0xF1, + 0x37, 0x18, 0x37, 0x18, 0x56, 0xE0, 0x03, 0xAE, 0x6A, 0x2A, 0x1A, 0xF1, + 0x5F, 0x18, 0x1E, 0xE4, 0x80, 0xE0, 0x6A, 0x3C, 0x6C, 0x3C, 0x56, 0xE0, + 0x03, 0xAE, 0x6C, 0x2A, 0x92, 0x18, 0x1E, 0xE4, 0x03, 0xA2, 0x80, 0xE0, + 0x6A, 0x3E, 0x03, 0xAE, 0x6A, 0x2A, 0x7E, 0xF0, 0x80, 0xE0, 0x6C, 0x3E, + 0x03, 0xAE, 0x6C, 0x2A, 0xF8, 0xF5, 0x10, 0xA1, 0x90, 0xE0, 0x02, 0xA0, + 0x1E, 0xE4, 0x36, 0x3C, 0x6D, 0xF0, 0x18, 0xBE, 0xC1, 0xE0, 0x2E, 0xE4, + 0x02, 0xA2, 0x18, 0x0D, 0x03, 0xA2, 0x79, 0xF0, 0x07, 0xA1, 0x59, 0x00, + 0xAE, 0x4E, 0x11, 0xB6, 0x40, 0xA8, 0xAE, 0x28, 0x2E, 0xE4, 0x00, 0xA2, + 0x6A, 0xE1, 0xAE, 0x3E, 0xD8, 0x08, 0x62, 0xE1, 0xC8, 0x08, 0x61, 0xE1, + 0x5F, 0x17, 0x84, 0xE1, 0x0E, 0x00, 0x22, 0xD0, 0x00, 0xC0, 0x56, 0x4E, + 0x57, 0x26, 0x09, 0xC0, 0x17, 0xF0, 0x11, 0x29, 0x45, 0xE0, 0x12, 0x29, + 0x1F, 0x3C, 0x23, 0xF0, 0x45, 0xE0, 0x1F, 0x2A, 0xC8, 0x08, 0x62, 0xE1, + 0xE8, 0x08, 0x61, 0xE1, 0x6F, 0x17, 0x84, 0xE1, 0x0E, 0x00, 0x22, 0xD0, + 0x17, 0xF0, 0x12, 0x1F, 0x1F, 0x2E, 0x11, 0x29, 0x09, 0xC0, 0x0A, 0x3C, + 0x09, 0x34, 0x04, 0xAE, 0x01, 0xC4, 0x00, 0xC0, 0x56, 0x4E, 0x57, 0x22, + 0x7E, 0x17, 0x84, 0xE1, 0x0F, 0x00, 0x22, 0xD0, 0x82, 0xE0, 0x11, 0x81, + 0x24, 0xF0, 0x46, 0xE0, 0x20, 0x3C, 0x20, 0xA5, 0x62, 0xE0, 0x19, 0x2A, + 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x20, 0xCE, 0x42, 0xE0, + 0x11, 0xAE, 0x26, 0x00, 0x00, 0x02, 0x12, 0xD1, 0xE0, 0x09, 0x11, 0xD1, + 0xF8, 0xF7, 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x00, 0x00, 0x66, 0xE1, + 0x00, 0xA2, 0x2E, 0xE4, 0x0E, 0x3C, 0x04, 0xA2, 0x16, 0x3D, 0x0E, 0xC7, + 0x09, 0x3C, 0x0A, 0xA2, 0x05, 0x3C, 0x0D, 0x3C, 0x26, 0x3E, 0x25, 0x3E, + 0xFF, 0xA2, 0x40, 0xBA, 0x25, 0x3E, 0x01, 0xA2, 0x4E, 0xBA, 0x0A, 0xF1, + 0x98, 0xF0, 0xFF, 0x00, 0x02, 0xE0, 0x26, 0x3C, 0x5F, 0xBA, 0x5E, 0xBA, + 0x07, 0x3C, 0x02, 0xA2, 0x26, 0x3E, 0x25, 0x3C, 0x15, 0xB6, 0x16, 0xB6, + 0x40, 0xBA, 0x3A, 0xF0, 0x0B, 0x3C, 0x40, 0xBA, 0xEA, 0xF0, 0x0A, 0x3C, + 0x40, 0xBA, 0x0C, 0x3C, 0x08, 0x3C, 0x40, 0xBA, 0x09, 0x3C, 0x44, 0xBA, + 0x4E, 0xBA, 0x7A, 0xF0, 0x06, 0x3C, 0x40, 0xBA, 0x4E, 0xBA, 0x0D, 0x3C, + 0x4E, 0xBA, 0x05, 0x3C, 0x5A, 0xF0, 0x04, 0x3C, 0x40, 0xBA, 0x0E, 0x3C, + 0x02, 0x3C, 0x0A, 0xBC, 0x03, 0x3C, 0x0A, 0xBC, 0x7E, 0xBA, 0xBA, 0xF0, + 0x01, 0x3C, 0x40, 0xBA, 0x11, 0x3D, 0x11, 0x35, 0xC7, 0x05, 0x61, 0xE1, + 0x40, 0xBA, 0x11, 0x3D, 0x11, 0x35, 0x7E, 0xBA, 0x16, 0xE0, 0x90, 0x3C, + 0x40, 0xBA, 0x00, 0x3C, 0x45, 0x18, 0x1A, 0xE4, 0xBD, 0x05, 0x61, 0xE1, + 0x91, 0x3C, 0x40, 0xBA, 0x42, 0x18, 0x0A, 0xE4, 0x1A, 0xE4, 0xC2, 0x05, + 0x61, 0xE1, 0x16, 0xE0, 0x90, 0x28, 0x42, 0x18, 0x0A, 0xE4, 0x45, 0x18, + 0x40, 0xBA, 0x40, 0xBA, 0x2A, 0xF0, 0x91, 0x4C, 0x40, 0xBA, 0xAA, 0xF0, + 0x40, 0xBA, 0x23, 0x3C, 0x20, 0xBC, 0x20, 0xBC, 0x20, 0xBC, 0x20, 0xBC, + 0xEB, 0x3C, 0x20, 0xBC, 0xEA, 0x3C, 0x20, 0xBC, 0xEB, 0x28, 0x70, 0xF0, + 0x20, 0xA1, 0xEB, 0x28, 0x20, 0xF0, 0xEB, 0x18, 0x19, 0x28, 0x5A, 0xF0, + 0x20, 0x2A, 0x29, 0xF0, 0xB3, 0x2A, 0x5E, 0xF0, 0x0A, 0x2A, 0x3E, 0xAE, + 0x02, 0xA2, 0xEB, 0x3E, 0x37, 0xAE, 0x09, 0x2A, 0x56, 0xE0, 0x3D, 0xAE, + 0x56, 0xE0, 0x35, 0xAE, 0x08, 0x2A, 0x56, 0xE0, 0x06, 0x2A, 0x56, 0xE0, + 0x33, 0xAE, 0x07, 0x2A, 0x21, 0xAE, 0x05, 0x2A, 0x56, 0xE0, 0x31, 0xAE, + 0x56, 0xE0, 0x15, 0xAE, 0x0B, 0x2A, 0x56, 0xE0, 0x04, 0x2A, 0x56, 0xE0, + 0x13, 0xAE, 0x0C, 0x2A, 0x0B, 0xAE, 0x03, 0x2A, 0x56, 0xE0, 0x11, 0xAE, + 0x56, 0xE0, 0x05, 0xAE, 0x02, 0x2A, 0x56, 0xE0, 0x00, 0x2A, 0x56, 0xE0, + 0x03, 0xAE, 0x01, 0x2A, 0x00, 0xA2, 0xBD, 0x19, 0x1E, 0xE4, 0x56, 0xE0, + 0x0E, 0x2A, 0x56, 0xE0, 0x11, 0xAE, 0x0D, 0x2A, 0x6A, 0xE1, 0xC7, 0x19, + 0x1E, 0xE4, 0x56, 0xE0, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, + 0x44, 0xCC, 0xE0, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0x46, 0xBA, 0x11, 0x3D, + 0x02, 0xA0, 0x61, 0x3C, 0x1E, 0xE4, 0x53, 0x18, 0x84, 0xE1, 0x46, 0xBA, + 0x40, 0xBA, 0xE0, 0x0C, 0x1E, 0xE4, 0xE0, 0x0C, 0x5A, 0x18, 0x84, 0xE1, + 0x02, 0x00, 0x22, 0xD0, 0x48, 0xBA, 0x11, 0x3D, 0x02, 0xA0, 0x48, 0xBA, + 0x22, 0xD0, 0x2E, 0xE4, 0x02, 0xA2, 0x11, 0x3D, 0x22, 0xD0, 0x34, 0xF0, + 0x0C, 0xA1, 0x0F, 0x00, 0x10, 0xA2, 0x00, 0x06, 0x61, 0xE1, 0x3F, 0x00, + 0x08, 0x3C, 0x00, 0xA2, 0x07, 0x3C, 0x06, 0x3C, 0x84, 0xE1, 0x9E, 0xE0, + 0x9C, 0xE0, 0x09, 0x3C, 0x1E, 0xE4, 0x0A, 0xF1, 0x07, 0x28, 0x8F, 0x18, + 0x00, 0xE0, 0x06, 0x08, 0x2D, 0xE4, 0xFC, 0x0C, 0x07, 0x3C, 0xFF, 0x00, + 0x08, 0xE0, 0x00, 0x01, 0x9E, 0xE0, 0x16, 0xE0, 0x1A, 0xE0, 0x09, 0x4C, + 0x28, 0xF0, 0x07, 0x28, 0x09, 0x3C, 0x02, 0xA2, 0x03, 0xA0, 0x8D, 0xE0, + 0x06, 0x3C, 0x06, 0x28, 0x85, 0xE0, 0x59, 0xF0, 0x03, 0xA8, 0x9D, 0xE0, + 0x94, 0xE0, 0x11, 0x3D, 0x56, 0xE0, 0x11, 0xAE, 0x06, 0x3C, 0x08, 0x3E, + 0x2E, 0xE4, 0x8E, 0xE0, 0x64, 0xF0, 0x0C, 0xA1, 0x07, 0x3E, 0x11, 0xA2, + 0x40, 0xA2, 0x06, 0x3C, 0x0C, 0xA0, 0x90, 0xB6, 0x2B, 0xF0, 0x08, 0x2A, + 0x06, 0x28, 0x07, 0x3C, 0xC0, 0xE0, 0x06, 0x3C, 0x08, 0xAE, 0x1C, 0xA0, + 0x11, 0xAE, 0x35, 0x00, 0x05, 0xE0, 0x41, 0x00, 0x11, 0xD1, 0x20, 0xCE, + 0x06, 0x08, 0x42, 0xE0, 0x13, 0xD1, 0x24, 0xCE, 0x07, 0x28, 0x00, 0x06, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x02, 0x00, 0x1E, 0xE4, 0x9E, 0xE0, + 0x51, 0x3C, 0x02, 0xA2, 0x1E, 0xE4, 0x1E, 0x19, 0x08, 0xE4, 0xCD, 0x0B, + 0x0A, 0xE4, 0x02, 0xA1, 0x4A, 0xF2, 0xFD, 0x0B, 0xE1, 0x18, 0x04, 0xE4, + 0x08, 0xA1, 0x2D, 0x19, 0x0A, 0xE4, 0x02, 0xA1, 0x2D, 0x19, 0x0A, 0xE4, + 0xE4, 0x18, 0x0A, 0xE4, 0x02, 0xA1, 0xFE, 0x18, 0x02, 0xA1, 0xF3, 0x18, + 0x0A, 0xE4, 0x02, 0xA1, 0x0A, 0xE4, 0x02, 0xA1, 0x09, 0x19, 0x0A, 0xE4, + 0x17, 0x19, 0x0A, 0xE4, 0x02, 0xA1, 0x17, 0x19, 0x62, 0xF0, 0x23, 0x19, + 0x0A, 0xE4, 0x02, 0xA1, 0x0E, 0xE4, 0x9A, 0xF5, 0x2F, 0x0A, 0x1E, 0xE4, + 0x4E, 0xF5, 0xF7, 0x09, 0x1E, 0xE4, 0x28, 0x19, 0x1E, 0xE4, 0xB5, 0x19, + 0x18, 0xE4, 0x8E, 0xE0, 0x1E, 0xE4, 0x9E, 0xE0, 0x00, 0xA2, 0xAE, 0x19, + 0x1E, 0xE4, 0xB7, 0x18, 0x0A, 0xE4, 0x2F, 0x0A, 0x02, 0xA2, 0x28, 0x19, + 0x0E, 0xE4, 0xE6, 0x1F, 0x1E, 0xE4, 0xAE, 0x19, 0x1E, 0xE4, 0x9E, 0xE0, + 0x1E, 0xE4, 0xB7, 0x18, 0x0A, 0xE4, 0x2F, 0x0A, 0x9E, 0xE0, 0x02, 0xA2, + 0xBE, 0xF2, 0x11, 0x20, 0x2F, 0x0A, 0x1E, 0xE4, 0xAE, 0x19, 0x1E, 0xE4, + 0xE2, 0x19, 0x1E, 0xE4, 0xB7, 0x18, 0x0A, 0xE4, 0x1E, 0xE4, 0x9E, 0xE0, + 0x00, 0xA2, 0x0E, 0xF2, 0x1E, 0xE4, 0xAE, 0x19, 0x1E, 0xE4, 0xB5, 0x19, + 0x44, 0xBA, 0xB7, 0x18, 0x0A, 0xE4, 0x2F, 0x0A, 0x1E, 0xE4, 0x2E, 0xF1, + 0x18, 0x0D, 0x1E, 0xE4, 0x1E, 0xE4, 0x04, 0xA2, 0x58, 0xF0, 0xCD, 0x0B, + 0x08, 0xE4, 0x51, 0x28, 0xBE, 0xF0, 0xFF, 0x09, 0x04, 0xA2, 0x65, 0x19, + 0x0E, 0xE4, 0x70, 0x19, 0xB7, 0x18, 0x0E, 0xE4, 0xFF, 0x09, 0x1E, 0xE4, + 0x0E, 0xE4, 0x65, 0x19, 0x0A, 0xE4, 0x51, 0x28, 0x1E, 0xE4, 0xAE, 0x19, + 0x1E, 0xE4, 0xB7, 0x18, 0x51, 0x28, 0xB7, 0x18, 0x0A, 0xE4, 0x2F, 0x0A, + 0x1E, 0xE4, 0x62, 0x3C, 0x02, 0xA2, 0x2A, 0xF1, 0x09, 0xE4, 0x1E, 0x02, + 0x1E, 0xE4, 0xCC, 0x0D, 0x4E, 0x28, 0xB7, 0x18, 0x0A, 0xE4, 0x74, 0x19, + 0x00, 0xA2, 0x93, 0x3C, 0x4F, 0x28, 0x92, 0x3C, 0x1A, 0xE0, 0x4E, 0x28, + 0x3E, 0xF1, 0x51, 0x3C, 0x18, 0xF1, 0x5A, 0xE0, 0x1B, 0xE0, 0x92, 0x2A, + 0x1E, 0xE4, 0xE8, 0xF0, 0x93, 0x18, 0x4F, 0x28, 0x01, 0x28, 0xB7, 0x18, + 0x0A, 0xE4, 0x88, 0x25, 0x58, 0xF0, 0x94, 0x28, 0xB7, 0x18, 0x08, 0xE4, + 0xB7, 0x18, 0x0E, 0xE4, 0x0C, 0x10, 0x1E, 0xE4, 0x51, 0x3C, 0x00, 0xA2, + 0xF4, 0x0B, 0x1E, 0xE4, 0x4F, 0x28, 0x92, 0x3C, 0x4E, 0x28, 0x5E, 0xF0, + 0x93, 0x28, 0x4E, 0x3C, 0x92, 0x28, 0x93, 0x3C, 0x1E, 0xE4, 0x51, 0x3C, + 0x00, 0xA2, 0x4F, 0x3C, 0x2E, 0xE4, 0x02, 0xA2, 0xA8, 0xF0, 0x91, 0x19, + 0x2E, 0xE4, 0xFE, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x2E, 0xE4, + 0x35, 0x07, 0x1E, 0xE4, 0x3E, 0xF7, 0x35, 0x1F, 0x1E, 0xE4, 0x7C, 0x19, + 0x15, 0x3D, 0x57, 0x28, 0xE8, 0x05, 0x65, 0xE1, 0x16, 0xE0, 0x21, 0x28, + 0x15, 0x3D, 0x58, 0x28, 0x55, 0xE0, 0x17, 0xE0, 0x05, 0xA1, 0x16, 0x2A, + 0x15, 0x3D, 0xEB, 0x28, 0x29, 0xF0, 0x19, 0x28, 0x15, 0x3D, 0x11, 0x28, + 0x15, 0x3D, 0x1B, 0x28, 0x57, 0x28, 0xE8, 0x05, 0x65, 0xE1, 0x2E, 0xE4, + 0x15, 0x19, 0x58, 0x28, 0x68, 0xF1, 0x15, 0x19, 0x16, 0x2A, 0x16, 0xE0, + 0x21, 0x28, 0x38, 0xF1, 0x19, 0x28, 0x55, 0xE0, 0x17, 0xE0, 0x05, 0xA1, + 0x88, 0xF0, 0x15, 0x19, 0xEB, 0x28, 0x29, 0xF0, 0x11, 0x28, 0x58, 0xF0, + 0x15, 0x19, 0x1B, 0x28, 0x02, 0xA2, 0x2E, 0xE4, 0x28, 0xF0, 0x15, 0x19, + 0x28, 0xE4, 0xAD, 0x28, 0x2E, 0xE4, 0xBD, 0x3C, 0xAD, 0x3C, 0x02, 0xA2, + 0x14, 0x07, 0x1E, 0xE4, 0x2E, 0xE4, 0xAD, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x00, 0xC0, 0x3A, 0x4C, 0x39, 0x20, 0x09, 0xC0, 0x3A, 0x3C, 0x39, 0x34, + 0x09, 0xC0, 0x2E, 0xE4, 0x54, 0x20, 0x09, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, + 0x09, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x55, 0x4C, 0x2E, 0xE4, 0x00, 0xC0, + 0x55, 0x3C, 0x54, 0x34, 0x02, 0xE0, 0x57, 0x2C, 0xF0, 0x3C, 0x22, 0xA2, + 0x58, 0x2C, 0xE0, 0x19, 0x00, 0xE4, 0x00, 0x01, 0xE0, 0x19, 0x00, 0xE4, + 0x00, 0x01, 0x02, 0xE0, 0x02, 0xA1, 0x00, 0xC0, 0x57, 0x2C, 0x09, 0xC0, + 0x2E, 0xE4, 0x02, 0xA2, 0xE0, 0x19, 0x00, 0xE4, 0x4F, 0xBA, 0x00, 0xA2, + 0x2E, 0xE4, 0x00, 0xA2, 0xCB, 0xF7, 0xFF, 0x00, 0x03, 0xE0, 0x42, 0xE0, + 0x4F, 0xBA, 0x00, 0xA2, 0x7B, 0x1C, 0x1E, 0xE4, 0xCB, 0xF7, 0xFF, 0x00, + 0x03, 0xE0, 0x42, 0xE0, 0x1E, 0xE4, 0x4A, 0xF0, 0x81, 0x1C, 0x1E, 0xE4, + 0x2A, 0x0C, 0x1E, 0xE4, 0x2A, 0xE4, 0xFC, 0x19, 0x2E, 0xE4, 0x18, 0x0D, + 0x1E, 0xE4, 0xA8, 0xF6, 0x02, 0xA1, 0x8A, 0xF1, 0x7E, 0x1C, 0x1E, 0xE4, + 0x02, 0xA1, 0xAA, 0xF1, 0x04, 0xA1, 0x9A, 0xF1, 0x02, 0xA1, 0xCA, 0xF1, + 0x02, 0xA1, 0xBA, 0xF1, 0x0A, 0xF2, 0x40, 0xA1, 0x02, 0xA0, 0xDA, 0xF1, + 0x87, 0x1C, 0x1E, 0xE4, 0xBA, 0xF1, 0x10, 0xA1, 0xE8, 0xF7, 0x02, 0xA1, + 0x4F, 0xBA, 0x4A, 0xF0, 0x36, 0x1A, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, + 0x3E, 0xF1, 0x66, 0x1A, 0x1E, 0xE4, 0x6E, 0xF1, 0x1E, 0xE4, 0x0E, 0xF1, + 0xB4, 0x1A, 0x1E, 0xE4, 0x1F, 0x1B, 0x1E, 0xE4, 0xDE, 0xF0, 0xC5, 0x1A, + 0x7E, 0xF0, 0x23, 0x1B, 0x1E, 0xE4, 0xAE, 0xF0, 0x1E, 0xE4, 0x4E, 0xF0, + 0x32, 0x1B, 0x1E, 0xE4, 0x68, 0xC8, 0x2A, 0xE4, 0x1E, 0xF0, 0x2E, 0x1B, + 0x1E, 0xE4, 0x28, 0xE4, 0x16, 0xE0, 0x0E, 0xA8, 0x0D, 0xF2, 0x3E, 0xBC, + 0x2E, 0xE4, 0x18, 0x0D, 0x74, 0xF0, 0x10, 0x08, 0x2A, 0xF1, 0x10, 0x18, + 0x10, 0x3C, 0x3E, 0xA0, 0x50, 0xF0, 0x3E, 0xA1, 0x1E, 0xE4, 0x00, 0xA2, + 0xF8, 0x1F, 0x1E, 0xE4, 0x02, 0xA2, 0x9B, 0x3E, 0x01, 0xA2, 0x81, 0x0C, + 0x90, 0x28, 0x2A, 0xE4, 0x6A, 0xE1, 0x1A, 0xB6, 0x5A, 0x1A, 0x18, 0xE4, + 0xBD, 0x05, 0x61, 0xE1, 0x18, 0xE4, 0xC2, 0x05, 0x61, 0xE1, 0x91, 0x28, + 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x5A, 0x1A, 0x02, 0xA1, 0x11, 0x29, + 0x2E, 0xE4, 0x6A, 0xE1, 0x01, 0x29, 0x64, 0x1A, 0x84, 0xE1, 0x44, 0xCC, + 0x1E, 0xE4, 0x01, 0x29, 0x0C, 0x0D, 0x1E, 0xE4, 0x61, 0xE1, 0x90, 0x28, + 0x2E, 0xE4, 0x0C, 0x0D, 0xC4, 0x05, 0x61, 0xE1, 0x38, 0xF0, 0xBF, 0x05, + 0x1E, 0xE4, 0x11, 0x29, 0x1A, 0xF1, 0x91, 0x4C, 0x40, 0x3C, 0x3F, 0x34, + 0x09, 0xC0, 0x0C, 0x0D, 0x0C, 0x0D, 0x1E, 0xE4, 0x11, 0x29, 0x00, 0xC0, + 0x00, 0xC0, 0x42, 0x3C, 0x41, 0x34, 0x09, 0xC0, 0x02, 0x3C, 0x30, 0xA2, + 0x2E, 0xF0, 0x11, 0x29, 0x46, 0xBA, 0x28, 0xE4, 0x16, 0xE0, 0x23, 0x28, + 0x2A, 0xE4, 0x04, 0xB6, 0x12, 0xA1, 0xA3, 0x3C, 0x07, 0xA1, 0x00, 0xA2, + 0x49, 0xE0, 0x12, 0xA0, 0x05, 0xA1, 0x26, 0xB4, 0x05, 0xA1, 0x26, 0xB4, + 0xB1, 0x1A, 0x84, 0xE1, 0x44, 0xCC, 0xF6, 0xB5, 0x42, 0xBA, 0xBE, 0xF1, + 0x28, 0xF0, 0x40, 0xBA, 0x03, 0x3C, 0x40, 0xBA, 0x48, 0xBA, 0x40, 0xBA, + 0x03, 0x28, 0x4E, 0xBA, 0x40, 0xBA, 0x40, 0xBA, 0x48, 0xBA, 0x4A, 0xBA, + 0x4A, 0xBA, 0x5A, 0xF0, 0x4A, 0xBA, 0x8A, 0xF0, 0x40, 0xBA, 0xAE, 0xF0, + 0x40, 0xBA, 0x4A, 0xBA, 0x5A, 0xF0, 0x40, 0xBA, 0x1E, 0xE4, 0x02, 0x28, + 0x48, 0xBA, 0x2A, 0xF0, 0x2E, 0xE4, 0x02, 0xA2, 0x90, 0xE1, 0x0C, 0x0D, + 0x02, 0xA1, 0xDA, 0xF0, 0x87, 0x1C, 0x1E, 0xE4, 0x84, 0xE1, 0xFF, 0x00, + 0x04, 0xE0, 0x44, 0xCC, 0x02, 0xE0, 0x52, 0xE0, 0x4F, 0xBA, 0xBE, 0x1A, + 0x02, 0xA2, 0x2A, 0xE4, 0x16, 0xE0, 0xFF, 0x00, 0x4E, 0xBA, 0x92, 0xE0, + 0x72, 0xC8, 0x2E, 0xE4, 0x4E, 0xBA, 0x28, 0xF0, 0xFF, 0x00, 0x02, 0xE0, + 0x5E, 0xA1, 0x5E, 0xBA, 0xBF, 0x3C, 0x02, 0xA2, 0xBF, 0x3C, 0xA8, 0xF2, + 0x04, 0xA1, 0x5A, 0xF1, 0x21, 0xAE, 0x54, 0x44, 0x05, 0xE0, 0x7E, 0xBA, + 0x39, 0xF0, 0x45, 0xE0, 0x31, 0x47, 0x0B, 0xE0, 0x41, 0x47, 0x05, 0xE0, + 0xBE, 0xF0, 0x6E, 0xFB, 0x45, 0xE0, 0x34, 0x39, 0x0B, 0xE0, 0x21, 0xAE, + 0x58, 0xF1, 0x06, 0xA1, 0x0E, 0xBA, 0x89, 0xF1, 0x28, 0xE1, 0x68, 0xCC, + 0x66, 0xCC, 0x00, 0xA2, 0x1E, 0xE4, 0x80, 0xF9, 0x06, 0xAF, 0x82, 0xE0, + 0x4A, 0x4E, 0x4B, 0x26, 0x09, 0xC0, 0x0D, 0x1B, 0x00, 0xC0, 0x4A, 0x3E, + 0x4B, 0x36, 0x45, 0xE0, 0x2E, 0xE4, 0x02, 0xA2, 0x90, 0x1B, 0x1E, 0xE4, + 0x4B, 0x26, 0x09, 0xC0, 0x0D, 0x1B, 0x1E, 0xE4, 0x30, 0xF8, 0x46, 0xE0, + 0x00, 0xC0, 0x4A, 0x4E, 0x44, 0xCC, 0x02, 0xA1, 0x2E, 0xE4, 0x02, 0xA2, + 0x90, 0xE1, 0x4E, 0xBA, 0x0B, 0x1B, 0x84, 0xE1, 0x46, 0xE0, 0x83, 0xE0, + 0x72, 0xC8, 0x2E, 0xE4, 0x28, 0xE4, 0x40, 0xBA, 0x2E, 0xE4, 0x06, 0xAF, + 0x46, 0xBA, 0x2B, 0xE4, 0x4A, 0xBA, 0x41, 0xBA, 0x02, 0xA2, 0x09, 0xC0, + 0xB0, 0x3C, 0x46, 0xBA, 0x1E, 0xE4, 0x2E, 0xE4, 0x00, 0xC0, 0x53, 0x3C, + 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0x90, 0x1B, 0xC1, 0x3C, 0x40, 0xBA, + 0xC0, 0x3C, 0xE0, 0x0C, 0xC3, 0x3C, 0x42, 0xBA, 0xC2, 0x3C, 0x40, 0xBA, + 0x90, 0x1B, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0x85, 0x1B, 0x1E, 0xE4, + 0x2E, 0xE4, 0x02, 0xA2, 0x26, 0x34, 0x09, 0xC0, 0xE0, 0x0C, 0x1E, 0xE4, + 0x49, 0xE0, 0x2A, 0xAE, 0x40, 0xBA, 0x27, 0x3C, 0x79, 0x1B, 0x08, 0xE4, + 0x29, 0x3E, 0x28, 0x36, 0x40, 0xBA, 0x55, 0xE0, 0x0C, 0xAE, 0x4C, 0xBA, + 0x55, 0xE0, 0x4A, 0xBA, 0x55, 0xE0, 0x28, 0xAE, 0x40, 0xBA, 0x55, 0xE0, + 0x26, 0xAE, 0x40, 0xBA, 0x22, 0xAE, 0x40, 0xBA, 0x55, 0xE0, 0x24, 0xAE, + 0x55, 0xE0, 0x20, 0xAE, 0x40, 0xBA, 0x55, 0xE0, 0x40, 0xBA, 0x55, 0xE0, + 0x1E, 0xAE, 0x40, 0xBA, 0x29, 0x3E, 0x28, 0x36, 0x55, 0xE0, 0x1C, 0xAE, + 0x16, 0xE0, 0x02, 0xA8, 0x28, 0xAF, 0x4A, 0xE0, 0x1B, 0xE0, 0x0B, 0xA1, + 0x3F, 0xA8, 0x0D, 0xAF, 0x46, 0xBA, 0x01, 0xA2, 0xEA, 0xF0, 0x52, 0xE0, + 0x30, 0xAE, 0x46, 0xBA, 0x55, 0xE0, 0x38, 0xAE, 0x55, 0xE0, 0x28, 0xAE, + 0x46, 0xBA, 0x55, 0xE0, 0x4E, 0xBA, 0x55, 0xE0, 0x20, 0xAE, 0x46, 0xBA, + 0x2A, 0x36, 0x55, 0xE0, 0x64, 0x40, 0xC4, 0xE0, 0x40, 0xBA, 0x29, 0x4E, + 0x28, 0x22, 0x2B, 0x3E, 0x29, 0x3E, 0x28, 0x36, 0x55, 0xE0, 0x1A, 0xAE, + 0x6A, 0xE1, 0x1A, 0xB6, 0x02, 0xA2, 0x00, 0xC0, 0x26, 0x34, 0xFE, 0xA2, + 0x09, 0xC0, 0x28, 0xE4, 0x29, 0x3C, 0x28, 0x34, 0x00, 0xA2, 0x27, 0x3C, + 0x2E, 0xE4, 0x00, 0xC0, 0x2B, 0x3C, 0x2A, 0x34, 0x40, 0xA1, 0x78, 0xA8, + 0x65, 0x00, 0xC0, 0xE0, 0x02, 0xA1, 0x87, 0x1C, 0x1E, 0xE4, 0xBA, 0xF0, + 0x4E, 0xBA, 0x9C, 0x1B, 0x84, 0xE1, 0x44, 0xCC, 0x01, 0xA2, 0x0E, 0x1C, + 0x0E, 0xE4, 0x90, 0xE1, 0x02, 0xA0, 0x07, 0x29, 0x69, 0x1C, 0x1E, 0xE4, + 0xE0, 0xF6, 0x20, 0xA1, 0x17, 0x3D, 0x0C, 0x3C, 0x5A, 0xF0, 0x7E, 0x1C, + 0x1E, 0xE4, 0x07, 0x2B, 0x5E, 0xF0, 0x41, 0xE0, 0x87, 0x1C, 0x1E, 0xE4, + 0x41, 0xE0, 0x06, 0xAE, 0x02, 0xA0, 0x61, 0x28, 0x4A, 0xE0, 0x07, 0xAE, + 0x07, 0xAF, 0x0F, 0xA0, 0x1E, 0xE4, 0x01, 0xA2, 0xDB, 0xF0, 0x1F, 0xAF, + 0x07, 0x29, 0x17, 0x81, 0x17, 0x81, 0x69, 0x1C, 0x1E, 0xE4, 0x01, 0xA2, + 0x07, 0x3D, 0x02, 0xA2, 0x01, 0xA2, 0x17, 0x3D, 0x0E, 0xF5, 0x67, 0x1C, + 0x00, 0x06, 0x67, 0xE1, 0x67, 0x1C, 0x1E, 0xE4, 0x1E, 0xE4, 0x17, 0x3D, + 0x7E, 0x1C, 0x1E, 0xE4, 0x87, 0x1C, 0x1E, 0xE4, 0x4A, 0xF0, 0x7E, 0x1C, + 0x06, 0xAE, 0x02, 0xA0, 0x61, 0x28, 0x4E, 0xF0, 0x67, 0x1C, 0x1E, 0xE4, + 0x0C, 0x2A, 0x17, 0x3D, 0x67, 0xE1, 0x00, 0xA2, 0x0B, 0x3C, 0x00, 0xA2, + 0x67, 0xE1, 0x17, 0x3D, 0x03, 0xC7, 0x00, 0x06, 0x9A, 0xF2, 0x7E, 0x1C, + 0x1E, 0xE4, 0x00, 0x06, 0x4F, 0xBA, 0x0B, 0x3C, 0x02, 0xA0, 0x0B, 0x28, + 0x02, 0xA8, 0xA6, 0x3C, 0x02, 0xA0, 0xA6, 0x28, 0x56, 0xE0, 0x10, 0xAE, + 0x0A, 0x28, 0x58, 0xF0, 0x0E, 0xA8, 0xA6, 0x28, 0x0A, 0x3E, 0x17, 0x3D, + 0x87, 0x1C, 0x1E, 0xE4, 0x29, 0x1C, 0x1A, 0xE4, 0x0E, 0xA8, 0xA6, 0x28, + 0xB0, 0xF6, 0x0B, 0x18, 0x4B, 0xF0, 0x03, 0xA8, 0xA6, 0x2A, 0xEA, 0xF0, + 0xA6, 0x2A, 0x17, 0x3F, 0x11, 0xAE, 0x0A, 0x2A, 0xA6, 0x3E, 0x07, 0xAE, + 0x07, 0xAF, 0x0F, 0xA0, 0x27, 0x1C, 0x0E, 0xE4, 0x29, 0x1C, 0x18, 0xE4, + 0x01, 0x29, 0x0B, 0x3C, 0x02, 0xA0, 0x0B, 0x28, 0x17, 0x3D, 0x17, 0x35, + 0x0C, 0x0D, 0x1E, 0xE4, 0x17, 0x35, 0x0C, 0x0D, 0x1E, 0xE4, 0x01, 0x29, + 0xA6, 0x3C, 0x10, 0xA0, 0xA6, 0x28, 0x17, 0x3D, 0x02, 0xA0, 0x61, 0x28, + 0x29, 0x1C, 0x1E, 0xE4, 0x02, 0xA2, 0x1A, 0xF0, 0xB0, 0xF6, 0x0B, 0x18, + 0x00, 0xE0, 0xB8, 0x4C, 0xB7, 0x24, 0x2E, 0xE4, 0xC0, 0xE0, 0x42, 0xF2, + 0xA6, 0x18, 0x88, 0x00, 0xDA, 0xF0, 0x02, 0xA8, 0x12, 0xAF, 0x65, 0x00, + 0x17, 0x81, 0x69, 0x1C, 0x1E, 0xE4, 0x01, 0xA2, 0x07, 0x3D, 0x02, 0xA2, + 0x07, 0x29, 0x17, 0x81, 0x2E, 0xE4, 0x67, 0x1C, 0x1E, 0xE4, 0x01, 0xA2, + 0x5D, 0x00, 0xC1, 0xE0, 0x00, 0x02, 0x04, 0xE0, 0x02, 0xA2, 0x5D, 0x00, + 0xC3, 0xE0, 0x55, 0xE0, 0x08, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0x00, 0xCE, + 0x04, 0xE0, 0xB8, 0xF7, 0x90, 0xE1, 0x00, 0x02, 0xB6, 0x4C, 0xB5, 0x24, + 0xA6, 0x3C, 0x90, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x10, 0xA1, 0xA6, 0x08, + 0x13, 0xD1, 0x04, 0x00, 0x12, 0xD1, 0x00, 0x06, 0x00, 0xA2, 0xF8, 0xF7, + 0x28, 0xCA, 0x00, 0x00, 0x17, 0x3D, 0x03, 0xC7, 0x00, 0x06, 0x67, 0xE1, + 0x00, 0xA2, 0x2E, 0xE4, 0x00, 0x06, 0x67, 0xE1, 0xB5, 0x24, 0x0D, 0x3C, + 0x02, 0xA2, 0x2E, 0xF0, 0x20, 0xCE, 0x42, 0xE0, 0x07, 0xAE, 0xB6, 0x4C, + 0x04, 0x00, 0x12, 0xD1, 0x00, 0x06, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, + 0x13, 0x01, 0x0D, 0x88, 0x09, 0xC0, 0x2E, 0xE4, 0x00, 0x06, 0x67, 0xE1, + 0x49, 0x28, 0x09, 0xC0, 0xDE, 0xF0, 0x49, 0x3C, 0xFF, 0x1F, 0x08, 0xE0, + 0x09, 0xC0, 0xAE, 0xF0, 0x09, 0xC0, 0x4E, 0xF0, 0x4A, 0x3C, 0x4B, 0x34, + 0x2E, 0xE4, 0x00, 0xC0, 0x4A, 0x4C, 0x4B, 0x24, 0x7C, 0x3C, 0x02, 0xA2, + 0x7B, 0x3C, 0x39, 0x2C, 0x4E, 0x28, 0x7E, 0x3C, 0x7D, 0x3C, 0x00, 0xA2, + 0xCA, 0xF0, 0x4F, 0x28, 0x28, 0xE4, 0x16, 0xE0, 0x40, 0xBA, 0x40, 0xBA, + 0x1B, 0x1D, 0x1E, 0xE4, 0x00, 0xA2, 0x7C, 0x3C, 0x34, 0xB6, 0xF0, 0xB7, + 0x40, 0xBA, 0x2E, 0xE4, 0x02, 0xA2, 0x7B, 0x3C, 0x2E, 0xE4, 0x7D, 0x3C, + 0x02, 0xA2, 0x48, 0xF0, 0x09, 0x3C, 0x02, 0xAE, 0x2A, 0xE4, 0x19, 0x28, + 0x01, 0x3C, 0x00, 0x34, 0x15, 0x4C, 0x14, 0x20, 0x0C, 0xBC, 0x03, 0x3C, + 0x02, 0x34, 0x39, 0x2C, 0x16, 0x1D, 0x0A, 0xE4, 0x18, 0x1D, 0x0D, 0xE4, + 0xFA, 0xF1, 0x02, 0xA1, 0xCA, 0xF0, 0x02, 0xA1, 0x5A, 0xF3, 0x02, 0xA1, + 0x4A, 0xF2, 0x02, 0xA1, 0x0E, 0xE4, 0xFB, 0x1C, 0x0A, 0xE4, 0x02, 0xA1, + 0x0D, 0xE4, 0xE0, 0x0C, 0x1E, 0xE4, 0x03, 0x1D, 0x03, 0x1C, 0x02, 0x10, + 0x02, 0xA0, 0x18, 0x1D, 0x00, 0x00, 0x32, 0xF0, 0x0A, 0x3C, 0x12, 0xE0, + 0x22, 0x1D, 0x1E, 0xE4, 0x03, 0xA2, 0x01, 0x0C, 0x1A, 0xE4, 0x4F, 0x4C, + 0x04, 0x3E, 0x0A, 0x2A, 0x0D, 0xE4, 0x40, 0xBC, 0xAE, 0xF5, 0x3A, 0x1D, + 0x22, 0x1D, 0x1E, 0xE4, 0xFF, 0xA2, 0x18, 0x1D, 0x0D, 0xE4, 0xE0, 0x0C, + 0x1E, 0xE4, 0x3E, 0xF5, 0x03, 0x1C, 0x02, 0x10, 0x02, 0xA0, 0x18, 0x1D, + 0x01, 0x0C, 0x00, 0x00, 0x32, 0xF0, 0x12, 0xE0, 0x07, 0x3C, 0xAD, 0xF2, + 0x20, 0xBC, 0x06, 0x3C, 0xB3, 0x1C, 0x0E, 0xE4, 0x66, 0x1D, 0x1E, 0xE4, + 0x1E, 0xE4, 0x02, 0xA1, 0x3D, 0xF2, 0x20, 0xBC, 0x1E, 0xE4, 0xB3, 0x1C, + 0x0E, 0xE4, 0x81, 0x1D, 0x00, 0xA2, 0x7E, 0x3C, 0x02, 0xA2, 0x1B, 0x1D, + 0x20, 0xBC, 0xB3, 0x1C, 0x0E, 0xE4, 0x7B, 0x3C, 0xFF, 0xA2, 0x7B, 0x28, + 0x7B, 0x3C, 0x4D, 0xF1, 0x7E, 0xF0, 0xC8, 0xF7, 0x22, 0x1D, 0x1E, 0xE4, + 0x1E, 0xE4, 0xFF, 0xA2, 0x02, 0xAE, 0x7B, 0x28, 0x7C, 0x3C, 0xFE, 0xA2, + 0xB8, 0xF7, 0x22, 0x1D, 0x2E, 0xE4, 0x02, 0xA2, 0xB3, 0x1C, 0x0E, 0xE4, + 0x10, 0xC4, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x1F, 0xC7, 0x00, 0xA2, + 0xF1, 0x02, 0x61, 0xE1, 0x05, 0x3E, 0x04, 0x3C, 0x2E, 0xE4, 0x31, 0x3D, + 0x22, 0x00, 0x09, 0x88, 0xF0, 0x02, 0x61, 0xE1, 0x09, 0x2B, 0x11, 0x2D, + 0x35, 0x1D, 0x84, 0xE1, 0x59, 0xF0, 0x68, 0xF0, 0x05, 0x1A, 0x04, 0x1C, + 0x5E, 0xF0, 0x09, 0x3D, 0x00, 0xA2, 0x11, 0x81, 0x2E, 0xE4, 0x00, 0xA2, + 0x11, 0x81, 0x11, 0x81, 0xF0, 0x02, 0x61, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, + 0x4A, 0x1D, 0x84, 0xE1, 0x22, 0x00, 0x09, 0x88, 0x05, 0x1A, 0x04, 0x18, + 0x09, 0x2B, 0x11, 0x2D, 0x00, 0xA2, 0x11, 0x81, 0x49, 0xF0, 0x50, 0xF0, + 0x18, 0xC4, 0x11, 0x81, 0x11, 0x81, 0x09, 0x3D, 0x22, 0x00, 0x09, 0x88, + 0xF1, 0x02, 0x61, 0xE1, 0xFA, 0xF0, 0x09, 0x29, 0x63, 0x1D, 0x84, 0xE1, + 0x43, 0xF0, 0x45, 0xE0, 0x39, 0x2E, 0x01, 0x2D, 0x02, 0xAE, 0x46, 0xE0, + 0x15, 0x4E, 0x14, 0x22, 0x11, 0x81, 0x00, 0xA2, 0x52, 0xF0, 0x04, 0x18, + 0x90, 0xE1, 0x31, 0x81, 0x2E, 0xE4, 0x01, 0x3D, 0xFF, 0xA2, 0x07, 0x28, + 0x2E, 0xE4, 0x02, 0xA2, 0x61, 0xE1, 0xC8, 0xF7, 0x22, 0x1D, 0x1E, 0xE4, + 0x84, 0xE1, 0x22, 0x00, 0x09, 0x88, 0xF0, 0x02, 0x06, 0x1C, 0x09, 0x2B, + 0x11, 0x2D, 0x7C, 0x1D, 0x11, 0x3D, 0x07, 0x28, 0x67, 0xF0, 0x78, 0xF0, + 0x11, 0x81, 0x5E, 0xF0, 0x09, 0x3D, 0xFE, 0xA2, 0x02, 0xA2, 0x2E, 0xE4, + 0x00, 0xA2, 0x11, 0x81, 0xF0, 0x02, 0x61, 0xE1, 0x08, 0x3C, 0x2E, 0xE4, + 0x91, 0x1D, 0x84, 0xE1, 0x22, 0x00, 0x09, 0x88, 0x56, 0xF0, 0x08, 0x18, + 0x09, 0x2B, 0x11, 0x2D, 0x09, 0x3D, 0x00, 0xA2, 0x11, 0x81, 0x43, 0xF0, + 0x19, 0x28, 0x2E, 0xE4, 0x11, 0x81, 0x11, 0x81, 0x02, 0xA1, 0x12, 0x28, + 0x22, 0xF1, 0x12, 0x18, 0x84, 0xE1, 0x02, 0x02, 0x61, 0xE1, 0x44, 0xCC, + 0x09, 0x29, 0x6A, 0xF0, 0x11, 0x29, 0xA6, 0x1D, 0x11, 0x3D, 0x00, 0xA2, + 0xDC, 0x22, 0x12, 0xE4, 0x19, 0x28, 0x92, 0xE0, 0x06, 0xA0, 0x82, 0xE0, + 0x04, 0xA1, 0x16, 0x28, 0x12, 0x3C, 0x2C, 0xB6, 0x2E, 0xE4, 0x35, 0x1F, + 0x1E, 0xE4, 0x28, 0xE4, 0x2A, 0xF1, 0x44, 0xF0, 0x02, 0xA1, 0x16, 0x28, + 0x60, 0xE1, 0x17, 0x74, 0xE8, 0x1D, 0x0E, 0xE4, 0x18, 0xE4, 0x2A, 0x28, + 0x00, 0x3D, 0x03, 0x09, 0x04, 0x09, 0x61, 0xE1, 0x2D, 0xE4, 0xFC, 0x0C, + 0x4E, 0x1E, 0x1E, 0xE4, 0x01, 0x3D, 0x11, 0x35, 0x03, 0x09, 0x60, 0xE1, + 0x00, 0xA2, 0x6E, 0xF2, 0x00, 0x3D, 0x10, 0x35, 0x10, 0x3D, 0x10, 0x35, + 0xFC, 0x0C, 0x1E, 0xE4, 0x18, 0xF1, 0x18, 0x28, 0x14, 0x35, 0x03, 0x09, + 0x64, 0xE1, 0x2D, 0xE4, 0x1E, 0xE4, 0x8A, 0xF0, 0x2A, 0x28, 0x04, 0x3D, + 0x05, 0x09, 0x66, 0xE1, 0x2D, 0xE4, 0xFC, 0x0C, 0x9E, 0x1E, 0x1E, 0xE4, + 0x06, 0x3D, 0x16, 0x35, 0x14, 0x35, 0x03, 0x09, 0x64, 0xE1, 0xAE, 0xF0, + 0x3E, 0xF0, 0x04, 0x3D, 0x14, 0x35, 0x14, 0x3D, 0x75, 0x4C, 0x74, 0x20, + 0xEE, 0x1E, 0x1E, 0xE4, 0x00, 0xC0, 0x3C, 0x3C, 0x3B, 0x34, 0x09, 0xC0, + 0x3D, 0x34, 0x09, 0xC0, 0x77, 0x4C, 0x76, 0x20, 0x75, 0x4C, 0x74, 0x20, + 0x00, 0xC0, 0x3E, 0x3C, 0x72, 0x34, 0x66, 0xE0, 0x77, 0x4E, 0x76, 0x22, + 0x2A, 0xF0, 0xC5, 0x28, 0x2E, 0xE4, 0x73, 0x3C, 0x18, 0xE4, 0x7E, 0x4C, + 0x4F, 0x28, 0x2E, 0xE4, 0x00, 0xE0, 0x02, 0xAE, 0xE5, 0x28, 0x35, 0x1F, + 0x73, 0x4C, 0x72, 0x20, 0x92, 0xE0, 0x78, 0x05, 0x00, 0xE0, 0xE5, 0x28, + 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x84, 0x28, 0x92, 0xE0, 0x9A, 0x05, + 0xEB, 0x28, 0xE5, 0x3C, 0x02, 0xA0, 0xE5, 0x28, 0x21, 0x2A, 0x16, 0xB6, + 0x05, 0xA1, 0x16, 0x2A, 0xAF, 0x28, 0x25, 0xF0, 0xAF, 0x2A, 0x16, 0xB6, + 0x48, 0xF0, 0x00, 0x23, 0x1E, 0xE4, 0x07, 0x3C, 0x1E, 0xE4, 0xBE, 0xF7, + 0x3A, 0x1F, 0x1E, 0xE4, 0xC5, 0x3C, 0x02, 0xA2, 0x4A, 0xF0, 0x10, 0x23, + 0x8E, 0xF7, 0x3A, 0x1F, 0x1E, 0xE4, 0x2E, 0xE4, 0xE9, 0x3C, 0x02, 0xA1, + 0x4A, 0xF0, 0xE9, 0x28, 0xE7, 0x28, 0x2A, 0xF1, 0xE8, 0x28, 0x4E, 0xF1, + 0xE7, 0x28, 0x92, 0xE0, 0xAB, 0x05, 0x00, 0xE0, 0x28, 0xF0, 0x22, 0xA1, + 0xE7, 0x3C, 0x02, 0xA0, 0xE8, 0x3C, 0x02, 0xA1, 0xE8, 0x28, 0xE7, 0x3C, + 0x25, 0xE4, 0x7F, 0x1A, 0x49, 0xE0, 0x01, 0x29, 0xFA, 0xA2, 0x49, 0xE0, + 0xDD, 0x0B, 0x1E, 0xE4, 0x17, 0x58, 0x02, 0xA2, 0x2E, 0xE4, 0xF2, 0xB7, + 0x82, 0x2A, 0x4F, 0x28, 0x06, 0x3C, 0x02, 0xAF, 0x06, 0x09, 0x64, 0xE1, + 0xD9, 0xF0, 0xB8, 0xF0, 0x08, 0x09, 0x66, 0xE1, 0x14, 0x4D, 0x14, 0x21, + 0x00, 0xA2, 0x9E, 0xF0, 0x16, 0x4F, 0x16, 0x23, 0x61, 0xE1, 0x00, 0xA2, + 0x6E, 0xF0, 0x01, 0xA2, 0x00, 0x34, 0x11, 0x4F, 0x11, 0x23, 0x0A, 0x09, + 0x61, 0xE1, 0x03, 0x3E, 0x02, 0x36, 0x01, 0x3C, 0x03, 0x1E, 0x02, 0x12, + 0x01, 0x2F, 0x03, 0x09, 0x85, 0xF0, 0x06, 0x1E, 0x13, 0xE0, 0x71, 0xF0, + 0x06, 0x1E, 0x5E, 0xF0, 0x06, 0x0C, 0x06, 0x0C, 0x04, 0x34, 0x06, 0x1C, + 0x06, 0x1C, 0x37, 0xF0, 0x01, 0x0D, 0x03, 0x09, 0x61, 0xE1, 0x05, 0x3C, + 0x04, 0x09, 0x62, 0xE1, 0x75, 0x3C, 0x74, 0x34, 0x77, 0x3C, 0x76, 0x34, + 0x12, 0x0D, 0x12, 0x01, 0x75, 0x4C, 0x74, 0x20, 0x4A, 0xF1, 0x4E, 0x28, + 0x11, 0x3D, 0x11, 0x35, 0x0A, 0x09, 0x61, 0xE1, 0x06, 0x09, 0x64, 0xE1, + 0x05, 0x4C, 0x04, 0x20, 0x03, 0x09, 0x61, 0xE1, 0x14, 0x3D, 0x14, 0x35, + 0x16, 0x35, 0x01, 0x2D, 0x08, 0x09, 0x66, 0xE1, 0xFF, 0x1E, 0x1E, 0xE4, + 0x2E, 0xE4, 0x16, 0x3D, 0x3A, 0xF3, 0x00, 0x29, 0x0B, 0x09, 0x60, 0xE1, + 0xF6, 0xF2, 0x39, 0x0C, 0x01, 0x4C, 0x00, 0x20, 0x02, 0xA1, 0x46, 0xE0, + 0x17, 0xE0, 0x4E, 0x2A, 0x0F, 0xC7, 0x0B, 0x09, 0x60, 0xE1, 0xA4, 0xF2, + 0x1E, 0xE4, 0x03, 0x3C, 0x02, 0x34, 0x00, 0x7D, 0x03, 0x29, 0x0B, 0x09, + 0x63, 0xE1, 0x25, 0x1F, 0xE0, 0x09, 0x61, 0xE1, 0x44, 0xCC, 0x02, 0xA1, + 0x11, 0x01, 0xC0, 0x1E, 0x84, 0xE1, 0x00, 0xA2, 0x08, 0xE0, 0x04, 0x34, + 0x02, 0xAE, 0x11, 0x0D, 0x03, 0x84, 0x05, 0x3C, 0x02, 0xAF, 0xFF, 0xFF, + 0x05, 0x82, 0x1E, 0xAE, 0x18, 0xE0, 0x04, 0x82, 0x02, 0x88, 0xE0, 0x09, + 0x61, 0xE1, 0x1C, 0xE0, 0x11, 0x01, 0xD4, 0x1E, 0x84, 0xE1, 0x22, 0x00, + 0x4E, 0x2A, 0x00, 0xA2, 0x2E, 0xF0, 0x11, 0x0D, 0x11, 0x01, 0x07, 0x09, + 0x61, 0xE1, 0x59, 0xF0, 0x14, 0x01, 0x03, 0x09, 0x64, 0xE1, 0x11, 0x0D, + 0x62, 0xE1, 0x75, 0x3C, 0x74, 0x34, 0x14, 0x0D, 0x66, 0xE1, 0x12, 0x0D, + 0x12, 0x01, 0x09, 0x09, 0x76, 0x34, 0x16, 0x0D, 0x16, 0x01, 0x05, 0x09, + 0xFF, 0x1E, 0x1E, 0xE4, 0x2E, 0xE4, 0x77, 0x3C, 0x00, 0x20, 0x8A, 0xF0, + 0x16, 0xE0, 0x4F, 0x28, 0x4E, 0x2A, 0x02, 0xAE, 0x39, 0x0C, 0x01, 0x4C, + 0x75, 0x3C, 0x74, 0x34, 0x46, 0xE0, 0x17, 0xE0, 0x82, 0x28, 0x2E, 0xE4, + 0x77, 0x3C, 0x76, 0x34, 0x01, 0x09, 0x62, 0xE1, 0x00, 0xA2, 0x9A, 0xF0, + 0x00, 0x09, 0x61, 0xE1, 0x12, 0x3D, 0x12, 0x35, 0xDA, 0xF0, 0x16, 0xE0, + 0x4F, 0x28, 0x01, 0x3D, 0x12, 0x4D, 0x12, 0x21, 0x01, 0x09, 0x62, 0xE1, + 0x39, 0x1E, 0x01, 0x2F, 0x00, 0x09, 0x61, 0xE1, 0x42, 0xE0, 0x13, 0x5A, + 0x03, 0xA2, 0x47, 0xF0, 0x61, 0xE1, 0x39, 0x28, 0x01, 0x3C, 0x00, 0x34, + 0x01, 0x4C, 0x00, 0x20, 0x01, 0x3D, 0x00, 0x09, 0x12, 0x3D, 0x12, 0x35, + 0x01, 0x09, 0x62, 0xE1, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x20, 0xCE, 0x42, 0xE0, 0x11, 0xAE, 0x26, 0x00, 0x00, 0x02, 0x12, 0xD1, + 0xE0, 0x09, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x1E, 0xE4, 0x26, 0xE4, 0xE5, 0x28, 0x2E, 0xE4, 0x78, 0x05, 0x61, 0xE1, + 0xCE, 0xF7, 0x3A, 0x1F, 0x11, 0x4D, 0x11, 0x21, 0x78, 0x05, 0x62, 0xE1, + 0xE5, 0x28, 0x03, 0xA2, 0x00, 0x3E, 0x01, 0xA2, 0x84, 0xE1, 0x44, 0xCC, + 0xE4, 0xF0, 0x04, 0xA1, 0x11, 0x11, 0x0A, 0x4D, 0x12, 0x21, 0x52, 0x1F, + 0x04, 0xA1, 0x82, 0xE0, 0x56, 0xF0, 0x11, 0x1D, 0x84, 0xE0, 0x03, 0xA0, + 0x00, 0x3E, 0x94, 0xE0, 0x00, 0xE0, 0x00, 0x28, 0x92, 0xE0, 0x04, 0xA0, + 0x96, 0xE0, 0x02, 0xA0, 0x98, 0xE0, 0x9A, 0x05, 0xE3, 0x22, 0x1E, 0xE4, + 0x01, 0x3C, 0x04, 0x29, 0xA4, 0xF0, 0x04, 0xA1, 0x00, 0x18, 0xE5, 0x28, + 0x11, 0x29, 0x6C, 0x1F, 0x84, 0xE1, 0x44, 0xCC, 0x13, 0x29, 0x12, 0x3D, + 0x11, 0x29, 0x12, 0x3D, 0xE5, 0x3C, 0xF0, 0xB5, 0xE5, 0x28, 0x14, 0x3D, + 0x92, 0xE0, 0xAB, 0x05, 0x00, 0xE0, 0xE6, 0x28, 0x02, 0xA0, 0xE6, 0x28, + 0x01, 0x3D, 0x01, 0x28, 0xE6, 0x3C, 0x28, 0xF0, 0x22, 0xA1, 0xE6, 0x3C, + 0x2E, 0xE4, 0xE8, 0x3C, 0x02, 0xA0, 0xE8, 0x28, 0x54, 0x00, 0x04, 0xE0, + 0xB2, 0x3C, 0x00, 0xA2, 0x44, 0xCC, 0x02, 0xA1, 0x7F, 0x28, 0x9C, 0xE0, + 0xB2, 0x5C, 0x06, 0x9E, 0x9E, 0x1F, 0x84, 0xE1, 0x49, 0xE0, 0xB2, 0x28, + 0xB8, 0xF0, 0x02, 0xA8, 0x07, 0x2B, 0x9F, 0xE0, 0x18, 0x05, 0x01, 0xE0, + 0x5E, 0xF0, 0xEA, 0x22, 0x19, 0xE4, 0x09, 0xA8, 0xF9, 0x22, 0x1E, 0xE4, + 0x09, 0xA2, 0xB2, 0x28, 0x2E, 0xE4, 0xB2, 0x3E, 0x03, 0xA0, 0xB2, 0x2A, + 0x04, 0xE0, 0x9E, 0xE0, 0x18, 0x05, 0x04, 0xE0, 0x02, 0xA1, 0x7F, 0x28, + 0x9C, 0xE0, 0x54, 0x00, 0x84, 0xE1, 0xB2, 0x3C, 0x00, 0xA2, 0x44, 0xCC, + 0x03, 0xA8, 0x05, 0xAF, 0x17, 0x2B, 0xB4, 0x1F, 0x03, 0xA0, 0xB2, 0x2A, + 0x56, 0xE0, 0xB2, 0x5A, 0xC4, 0x28, 0x2E, 0xE4, 0x06, 0x9F, 0xB2, 0x3E, + 0x1E, 0xE4, 0x58, 0xF0, 0x40, 0x28, 0xE8, 0xF0, 0xC4, 0x28, 0x8E, 0xF0, + 0x3E, 0x3C, 0x2C, 0x23, 0x3E, 0xF0, 0x84, 0x3C, 0xFC, 0xA2, 0x48, 0xF0, + 0x1E, 0xE4, 0x2E, 0xE4, 0x84, 0x3C, 0x3E, 0x28, 0x00, 0x09, 0x61, 0xE1, + 0x2E, 0xE4, 0xCA, 0x1F, 0x2E, 0xE4, 0x11, 0x3D, 0x0A, 0xC7, 0x00, 0xA2, + 0x11, 0x3D, 0x00, 0xA2, 0x00, 0x06, 0x61, 0xE1, 0x84, 0xE1, 0x3F, 0x01, + 0x22, 0xD0, 0x02, 0x3C, 0x02, 0x28, 0xFB, 0x20, 0x1E, 0xE4, 0xDD, 0x1F, + 0x9B, 0x3C, 0x00, 0xA2, 0x02, 0x3C, 0x02, 0xA0, 0x48, 0x3C, 0x47, 0x3C, + 0xFE, 0xA2, 0x09, 0xC0, 0x3E, 0xBC, 0x6E, 0xBA, 0x2E, 0xE4, 0x00, 0xC0, + 0x38, 0xF0, 0x10, 0x18, 0x00, 0x3C, 0xDD, 0xF0, 0x00, 0xE0, 0x00, 0x28, + 0x10, 0x3C, 0xFE, 0xA2, 0x02, 0xA2, 0x97, 0x20, 0x1E, 0xE4, 0x00, 0x01, + 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, 0x38, 0xF0, 0x00, 0xC0, + 0x53, 0x28, 0x09, 0xC0, 0x9B, 0x3C, 0x04, 0xA2, 0xB0, 0x3C, 0x00, 0xA2, + 0x1E, 0xE4, 0x00, 0x01, 0x00, 0xE0, 0x10, 0x28, 0x6A, 0x15, 0x1E, 0xE4, + 0x2A, 0xE4, 0xD2, 0x20, 0xFA, 0xB7, 0x10, 0x28, 0x93, 0x1D, 0x1C, 0xE4, + 0x00, 0xC0, 0x47, 0x3C, 0x09, 0xC0, 0x10, 0x3C, 0x0D, 0xE4, 0xE0, 0x0C, + 0x1E, 0xE4, 0x2E, 0xE4, 0xFF, 0x00, 0x02, 0xE0, 0x01, 0x3C, 0x2F, 0x20, + 0x29, 0x18, 0x01, 0x28, 0x2F, 0x20, 0x00, 0xE4, 0x01, 0x28, 0x29, 0x3C, + 0xFE, 0xA2, 0xB8, 0xF0, 0x1E, 0xE4, 0x40, 0x01, 0x62, 0xE1, 0x92, 0xE0, + 0xAE, 0x28, 0x98, 0x3C, 0x02, 0xA2, 0x32, 0x20, 0x1E, 0xE4, 0x01, 0x28, + 0xAE, 0x3C, 0x02, 0xA8, 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, 0x97, 0x20, + 0x02, 0x3C, 0x82, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, 0x02, 0x3C, 0x84, 0xE0, + 0xFD, 0x20, 0x1E, 0xE4, 0x18, 0xAE, 0x84, 0xE0, 0xFB, 0x20, 0x1E, 0xE4, + 0x82, 0xE0, 0x49, 0xE0, 0x48, 0x20, 0x1E, 0xE4, 0x61, 0xE1, 0x48, 0x20, + 0x1E, 0xE4, 0x18, 0xAE, 0x2E, 0xE4, 0x22, 0x02, 0x1E, 0xE4, 0x00, 0x10, + 0x7C, 0x0C, 0x1E, 0xE4, 0x05, 0x3C, 0x04, 0x34, 0x02, 0xA2, 0x2E, 0xE4, + 0x05, 0x0C, 0x04, 0x04, 0xD2, 0x20, 0x1E, 0xE4, 0x29, 0x28, 0x9B, 0x3C, + 0x8E, 0x16, 0x1E, 0xE4, 0x79, 0x20, 0x0A, 0xE4, 0x0B, 0xE4, 0x98, 0x2A, + 0x68, 0x20, 0x08, 0xE4, 0x81, 0x0C, 0x1E, 0xE4, 0x00, 0xA2, 0x79, 0x20, + 0x94, 0xE0, 0x29, 0x28, 0x40, 0x01, 0x61, 0xE1, 0x52, 0x20, 0x0E, 0xE4, + 0x32, 0x20, 0x1E, 0xE4, 0x65, 0x3C, 0x99, 0xF1, 0x1E, 0x02, 0x1E, 0xE4, + 0x01, 0xA2, 0x81, 0x0C, 0x1E, 0xE4, 0x00, 0xA2, 0x29, 0x28, 0x7A, 0xF0, + 0x65, 0x28, 0x9B, 0x3E, 0x02, 0xA2, 0x00, 0xC0, 0x48, 0x3C, 0x09, 0xC0, + 0x07, 0xA1, 0x59, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x4A, 0xF0, 0x04, 0xA1, + 0xAE, 0x28, 0x79, 0xF0, 0xFE, 0xA2, 0xAE, 0x3C, 0x02, 0xA9, 0xAE, 0x28, + 0x00, 0xC0, 0x48, 0x3C, 0x09, 0xC0, 0x29, 0x3C, 0x02, 0xA1, 0x60, 0x28, + 0x2E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x9A, 0x4C, 0x99, 0x24, 0x6A, 0xF0, + 0x2E, 0x21, 0x1E, 0xE4, 0x70, 0xE4, 0x15, 0x21, 0x02, 0x3C, 0x70, 0xE4, + 0x1C, 0x21, 0x1E, 0xE4, 0x06, 0x3C, 0x00, 0xA2, 0xFD, 0x20, 0x1E, 0xE4, + 0x05, 0x3C, 0x04, 0x34, 0x18, 0xAE, 0x02, 0x28, 0x05, 0x0C, 0x04, 0x04, + 0x7C, 0x0C, 0x1E, 0xE4, 0x1E, 0xE4, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, + 0x06, 0xAF, 0x0E, 0xA0, 0x06, 0x18, 0x54, 0x0C, 0x12, 0x00, 0x13, 0xD1, + 0x24, 0xCE, 0x02, 0xAE, 0xFA, 0xF7, 0x2C, 0xCA, 0xF8, 0xF7, 0x28, 0xCA, + 0x04, 0x20, 0x28, 0xF1, 0x5D, 0x0C, 0x1E, 0xE4, 0x04, 0x34, 0x00, 0x02, + 0x00, 0xE0, 0x05, 0x4C, 0x06, 0x3C, 0x54, 0x0C, 0x1E, 0xE4, 0x05, 0x3C, + 0x54, 0x0C, 0x1E, 0xE4, 0x4C, 0x0A, 0x1E, 0xE4, 0x9E, 0xF5, 0x20, 0xF0, + 0x00, 0x10, 0x02, 0xE0, 0x11, 0x3D, 0x02, 0xA2, 0x00, 0x06, 0x61, 0xE1, + 0x1E, 0xE4, 0x01, 0x3D, 0x54, 0x0C, 0x1E, 0xE4, 0x1E, 0xE4, 0x02, 0x3C, + 0x2E, 0xE4, 0xFB, 0x20, 0x11, 0x29, 0x00, 0x06, 0x61, 0xE1, 0xFD, 0x20, + 0x1E, 0xE4, 0x18, 0xAE, 0x02, 0x28, 0x2A, 0xE4, 0x9B, 0xF0, 0x03, 0xA1, + 0x9B, 0x2A, 0x48, 0x20, 0x1E, 0xE4, 0x04, 0xA2, 0x15, 0x21, 0x1E, 0xE4, + 0x8E, 0xF0, 0x90, 0x00, 0x04, 0xE0, 0x81, 0x0C, 0x1E, 0xE4, 0x02, 0xA2, + 0x1C, 0x21, 0x1E, 0xE4, 0x66, 0xCC, 0x80, 0x00, 0x04, 0xE0, 0x81, 0x0C, + 0x6C, 0xCC, 0x1E, 0xA0, 0x6E, 0xCC, 0x6A, 0xCC, 0x70, 0xCC, 0x68, 0xCC, + 0x60, 0xCC, 0x00, 0xA2, 0x04, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x28, 0xE1, + 0x1E, 0xE4, 0x0A, 0x3C, 0x06, 0xA2, 0x2E, 0xF0, 0x00, 0x06, 0x11, 0xD1, + 0x20, 0xCE, 0x0B, 0x21, 0x13, 0x01, 0x0A, 0x88, 0x04, 0x00, 0x12, 0xD1, + 0xC0, 0xE0, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x11, 0xAE, 0x2A, 0x00, + 0x05, 0xE0, 0x41, 0x00, 0x42, 0xE0, 0x07, 0xAE, 0x02, 0x2A, 0x42, 0xE0, + 0x99, 0x34, 0x80, 0xA0, 0x20, 0xCE, 0x2E, 0xE4, 0x7E, 0xF0, 0x90, 0x00, + 0x11, 0xD1, 0x9A, 0x3C, 0x29, 0x21, 0x1E, 0xE4, 0x80, 0xA0, 0x20, 0xCE, + 0x10, 0x00, 0x12, 0xD1, 0x80, 0x00, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, + 0x13, 0x00, 0x13, 0xD1, 0x11, 0x3C, 0x10, 0x34, 0x09, 0xC0, 0x2E, 0xE4, + 0x10, 0x24, 0x09, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x19, 0x28, 0x2E, 0xE4, + 0x00, 0xC0, 0x11, 0x4C, 0x4E, 0x28, 0x00, 0x3C, 0x02, 0xA1, 0x2A, 0xE4, + 0x49, 0xF0, 0x09, 0xA8, 0xAA, 0x2A, 0x1A, 0xE0, 0x18, 0xE4, 0x52, 0xE0, + 0x17, 0xE0, 0xBE, 0x2A, 0x1E, 0xE4, 0x2F, 0x22, 0x1E, 0xE4, 0xF4, 0x21, + 0x0A, 0xF1, 0x7E, 0x28, 0x2E, 0xE4, 0x4D, 0x22, 0x73, 0x1C, 0x72, 0x10, + 0x75, 0x4C, 0x74, 0x20, 0x77, 0x4C, 0x76, 0x20, 0x75, 0x3C, 0x74, 0x34, + 0x77, 0x3C, 0x76, 0x34, 0x73, 0x1C, 0x72, 0x10, 0x00, 0xA2, 0x73, 0x3C, + 0x72, 0x34, 0x00, 0xA2, 0x7E, 0x4E, 0x4F, 0x2A, 0x39, 0x2C, 0xBE, 0x3C, + 0xEA, 0xF0, 0x19, 0x28, 0x80, 0x3C, 0x12, 0xB6, 0x50, 0x3C, 0x39, 0x28, + 0x00, 0x3C, 0x02, 0xA1, 0x02, 0xA2, 0xCF, 0x21, 0x1A, 0xE4, 0x7D, 0x28, + 0x71, 0x21, 0x1E, 0xE4, 0xA0, 0x21, 0x18, 0xE4, 0xDC, 0x22, 0x1E, 0xE4, + 0x84, 0x28, 0x2E, 0xE4, 0x02, 0x02, 0x61, 0xE1, 0x20, 0xC4, 0x2E, 0xE4, + 0x7A, 0x21, 0x84, 0xE1, 0x22, 0x00, 0x00, 0x88, 0x2E, 0xE4, 0x31, 0x81, + 0x3A, 0xF0, 0x01, 0x29, 0x04, 0xAF, 0x02, 0x02, 0x02, 0xE0, 0x82, 0xE0, + 0x7C, 0x28, 0x09, 0x3D, 0x06, 0xA2, 0x0A, 0x3C, 0x09, 0x81, 0x31, 0x3D, + 0x7B, 0x28, 0x09, 0x3D, 0x20, 0xC4, 0x2E, 0xE4, 0x11, 0x3D, 0x84, 0x28, + 0x22, 0x00, 0x00, 0x88, 0x02, 0x02, 0x61, 0xE1, 0x3A, 0xF0, 0x01, 0x29, + 0x94, 0x21, 0x84, 0xE1, 0x09, 0x3D, 0x06, 0xA2, 0x2E, 0xE4, 0x31, 0x81, + 0x31, 0x3D, 0x50, 0x28, 0x09, 0x3D, 0x02, 0xA2, 0x2E, 0xE4, 0x11, 0x3D, + 0xFE, 0xA2, 0x09, 0x81, 0x02, 0x02, 0x61, 0xE1, 0x20, 0xC4, 0x00, 0xA2, + 0xAA, 0x21, 0x84, 0xE1, 0x22, 0x00, 0x00, 0x88, 0x19, 0x18, 0x42, 0xE0, + 0x1B, 0xE0, 0x31, 0x2B, 0x61, 0xE1, 0x21, 0xAE, 0x03, 0xA2, 0x24, 0xE4, + 0x84, 0xE1, 0x22, 0x00, 0x00, 0x88, 0x02, 0x02, 0x09, 0x29, 0x1A, 0xF1, + 0x09, 0x29, 0xC8, 0x21, 0x36, 0xF0, 0x50, 0x1C, 0x01, 0x2D, 0xE6, 0xF0, + 0x46, 0xE0, 0x50, 0x0C, 0x15, 0x1C, 0x14, 0x10, 0x82, 0xE0, 0x49, 0xE0, + 0x42, 0xE0, 0x62, 0xF0, 0x11, 0x81, 0x11, 0x81, 0x94, 0xE0, 0x04, 0xA0, + 0x12, 0x29, 0x12, 0x3D, 0x00, 0xA2, 0x31, 0x81, 0x61, 0xE1, 0x2E, 0xE4, + 0xDC, 0x22, 0x12, 0xE4, 0x00, 0x88, 0xF0, 0x02, 0x62, 0xE1, 0x00, 0x02, + 0x12, 0x29, 0xF2, 0x21, 0x84, 0xE1, 0x22, 0x00, 0x1A, 0xE0, 0x03, 0x3C, + 0x12, 0x29, 0x02, 0x3C, 0x12, 0x81, 0x04, 0x28, 0x04, 0x3C, 0x70, 0xB6, + 0x11, 0x3D, 0x02, 0x28, 0x8A, 0xF0, 0x12, 0x81, 0x11, 0x3D, 0x04, 0x28, + 0x11, 0x3D, 0x03, 0x28, 0x01, 0x29, 0x11, 0x81, 0x11, 0x81, 0xAE, 0xF0, + 0x01, 0x29, 0x4A, 0xF0, 0x11, 0x3F, 0x01, 0xA2, 0x2E, 0xE4, 0x11, 0x81, + 0xDC, 0x22, 0x12, 0xE4, 0x2A, 0xE4, 0x19, 0x28, 0x28, 0xE4, 0x4F, 0x28, + 0x1E, 0xE4, 0x58, 0xF0, 0x04, 0xA8, 0xAA, 0x28, 0x80, 0x2C, 0x2A, 0xE4, + 0x1A, 0x4C, 0xC9, 0x22, 0x38, 0xF0, 0x04, 0xA8, 0xAA, 0x28, 0x50, 0x3C, + 0x02, 0xA0, 0x50, 0x28, 0x0F, 0x3C, 0x00, 0xA2, 0x52, 0xE0, 0x03, 0xA1, + 0x15, 0x4E, 0x14, 0x22, 0xAA, 0x28, 0x2A, 0xE4, 0x39, 0x1C, 0x50, 0x3C, + 0x1E, 0xE4, 0x5A, 0xF0, 0x1A, 0x4C, 0x02, 0xA8, 0xAA, 0x28, 0x8B, 0x21, + 0x1E, 0xE4, 0xA0, 0x21, 0xB8, 0xF6, 0x1A, 0x28, 0xD8, 0xF6, 0x04, 0xA8, + 0x0F, 0x28, 0xAE, 0x3C, 0x20, 0xA9, 0xAE, 0x28, 0x42, 0xF0, 0x20, 0xA1, + 0x0F, 0x3C, 0x02, 0xA0, 0x1E, 0xE4, 0x0E, 0xF6, 0x1B, 0x1D, 0x1E, 0xE4, + 0xAE, 0x28, 0x35, 0x1F, 0x1E, 0xE4, 0x75, 0x06, 0x61, 0xE1, 0x2E, 0xE4, + 0xAE, 0x3C, 0x08, 0xA9, 0x00, 0x88, 0xF0, 0x02, 0x62, 0xE1, 0x00, 0x02, + 0x11, 0x29, 0x41, 0x22, 0x84, 0xE1, 0x22, 0x00, 0x07, 0xA1, 0x11, 0x2B, + 0x11, 0x29, 0x12, 0x3D, 0x12, 0x3D, 0x00, 0xA2, 0x12, 0x3D, 0x12, 0xB6, + 0x30, 0x03, 0x61, 0xE1, 0x11, 0x81, 0x12, 0x3D, 0x3F, 0x00, 0x22, 0xD0, + 0xF0, 0x02, 0x62, 0xE1, 0x11, 0x3D, 0x12, 0x29, 0x4B, 0x22, 0x84, 0xE1, + 0x08, 0x28, 0x59, 0x22, 0x1E, 0xE4, 0x2E, 0xE4, 0x1E, 0xE4, 0x96, 0xE0, + 0x70, 0x03, 0x00, 0xE0, 0x6D, 0x3C, 0x09, 0x08, 0x08, 0x28, 0x9E, 0x22, + 0x63, 0xE1, 0x08, 0x3C, 0x4E, 0xFB, 0x2E, 0xE4, 0x03, 0xA2, 0x06, 0x3C, + 0xFE, 0xA2, 0x70, 0x03, 0x84, 0xE1, 0x5E, 0xFB, 0x13, 0xE0, 0x21, 0xAE, + 0x09, 0x29, 0x68, 0xF1, 0x12, 0x29, 0x7C, 0x22, 0xF6, 0xF0, 0x09, 0x29, + 0x24, 0xF1, 0x05, 0x18, 0x14, 0x10, 0x36, 0xF0, 0x39, 0x1C, 0x01, 0x2D, + 0x76, 0xF0, 0x46, 0xE0, 0x39, 0x0C, 0x15, 0x1C, 0x02, 0xE0, 0x84, 0xE0, + 0x49, 0xE0, 0x42, 0xE0, 0x11, 0x81, 0x11, 0x81, 0x06, 0x3C, 0x01, 0x06, + 0x00, 0xE0, 0x24, 0xE4, 0x06, 0x28, 0x31, 0x81, 0x02, 0x3D, 0x02, 0xA2, + 0x94, 0xE0, 0x00, 0x06, 0x08, 0x28, 0x13, 0x3D, 0x02, 0xAE, 0x06, 0x28, + 0x28, 0xF5, 0x19, 0x18, 0x08, 0x3C, 0x02, 0xA0, 0x00, 0xA2, 0x00, 0x06, + 0x61, 0xE1, 0x2E, 0xE4, 0x05, 0x3C, 0x06, 0xA2, 0x11, 0x3D, 0x0F, 0xC7, + 0x61, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, 0x20, 0xC4, 0x00, 0x88, 0x00, 0x06, + 0x62, 0xE1, 0x02, 0x02, 0x09, 0x3C, 0xFE, 0xFE, 0x2E, 0xE4, 0x22, 0x00, + 0x4E, 0xFF, 0x21, 0xA2, 0x07, 0x3C, 0xFE, 0xA2, 0x18, 0xF1, 0x12, 0x29, + 0xB8, 0x22, 0x84, 0xE1, 0x09, 0x29, 0xD4, 0xF0, 0x05, 0x18, 0x09, 0x29, + 0x72, 0xF0, 0x46, 0xE0, 0x01, 0x2D, 0xA2, 0xF0, 0x02, 0xE0, 0x84, 0xE0, + 0x49, 0xE0, 0x42, 0xE0, 0x11, 0x81, 0x11, 0x81, 0x07, 0x3C, 0x01, 0x06, + 0x00, 0xE0, 0x24, 0xE4, 0x07, 0x28, 0x31, 0x81, 0x02, 0x3D, 0x02, 0xA2, + 0x94, 0xE0, 0x00, 0x06, 0x09, 0x28, 0x13, 0x3D, 0x02, 0xAE, 0x07, 0x28, + 0x98, 0xF5, 0x19, 0x18, 0x09, 0x3C, 0x02, 0xA0, 0x02, 0xA1, 0x26, 0xE4, + 0x19, 0x28, 0x2E, 0xE4, 0x02, 0x02, 0x61, 0xE1, 0x20, 0xC4, 0x44, 0xCC, + 0x28, 0xE4, 0x01, 0x29, 0xD4, 0x22, 0x84, 0xE1, 0x18, 0x05, 0x61, 0xE1, + 0x2E, 0xE4, 0x31, 0x81, 0x2E, 0xE4, 0x11, 0x3D, 0x1F, 0xC7, 0x08, 0xA2, + 0x07, 0x29, 0x9E, 0xE0, 0x18, 0x05, 0x00, 0xE0, 0x00, 0xE0, 0x2E, 0xE4, + 0x07, 0x3D, 0x0C, 0xA8, 0x0A, 0xA8, 0x07, 0x29, 0x9E, 0xE0, 0x18, 0x05, + 0x00, 0xE0, 0x81, 0x3C, 0x2E, 0xE4, 0x07, 0x3D, 0x06, 0xA8, 0x07, 0x29, + 0x9E, 0xE0, 0x18, 0x05, 0x81, 0x3C, 0x02, 0xA0, 0x81, 0x28, 0x07, 0x3D, + 0x81, 0x3C, 0x00, 0xA2, 0x28, 0xE4, 0x7F, 0x18, 0x9E, 0xE0, 0x18, 0x05, + 0x00, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x07, 0x3D, 0x56, 0xE0, 0x07, 0x29, + 0x02, 0xA1, 0x7F, 0x28, 0x18, 0x05, 0x61, 0xE1, 0x0B, 0x23, 0x84, 0xE1, + 0x01, 0xA2, 0x44, 0xCC, 0x41, 0xE0, 0x1A, 0xE0, 0x04, 0xA8, 0x11, 0x29, + 0x2E, 0xE4, 0x02, 0xB6, 0x02, 0xA2, 0x07, 0x1A, 0x02, 0xA1, 0x7F, 0x28, + 0x18, 0x05, 0x61, 0xE1, 0x1B, 0x23, 0x84, 0xE1, 0x00, 0xA2, 0x44, 0xCC, + 0x42, 0xE0, 0x1B, 0xE0, 0x07, 0xA8, 0x11, 0x2B, 0x2E, 0xE4, 0x1A, 0xE0, + 0x02, 0xA1, 0xEB, 0x18, 0x02, 0xA1, 0x7F, 0x28, 0x18, 0x05, 0x61, 0xE1, + 0x11, 0x29, 0x2A, 0x23, 0x84, 0xE1, 0x44, 0xCC, 0x2E, 0xE4, 0x90, 0xE1, + 0x28, 0xE4, 0x16, 0xE0, 0x18, 0x05, 0x04, 0xE0, 0x00, 0x3C, 0x81, 0x28, + 0x01, 0x29, 0x94, 0xE0, 0x92, 0xE0, 0x00, 0x08, 0x00, 0x3C, 0x02, 0xA0, + 0x00, 0x28, 0x0A, 0xF1, 0x00, 0x3C, 0x00, 0xA2, 0x38, 0xF0, 0x7F, 0x18, + 0x00, 0xA2, 0x08, 0xF7, 0x81, 0x18, 0x00, 0x28, 0x2E, 0xE4, 0x84, 0x3C, + 0xFE, 0xA2, 0x81, 0x3C, 0xC4, 0x3C, 0x02, 0xA2, 0x02, 0x3D, 0x0E, 0xA2, + 0x1E, 0xE4, 0x2E, 0xE4, 0x84, 0x3C, 0x00, 0x28, 0x07, 0xAE, 0x17, 0xE0, + 0x22, 0x2A, 0x83, 0x23, 0x0A, 0xAE, 0x7A, 0x23, 0x1E, 0xE4, 0x55, 0xE0, + 0x2E, 0xE4, 0x02, 0x01, 0xC2, 0xE0, 0x56, 0xE0, 0x22, 0x2A, 0x83, 0x23, + 0x1E, 0xE4, 0x92, 0xE0, 0x1E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, 0x17, 0xE0, + 0x83, 0xE0, 0x56, 0xE0, 0x06, 0xAE, 0x7A, 0x23, 0x13, 0x02, 0xC2, 0xE0, + 0x56, 0xE0, 0x0F, 0xAE, 0x83, 0x23, 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, + 0x55, 0xE0, 0x09, 0xAE, 0x17, 0xE0, 0x22, 0x2A, 0x56, 0xE0, 0x06, 0xAE, + 0x7A, 0x23, 0x1E, 0xE4, 0xC2, 0xE0, 0x56, 0xE0, 0x0F, 0xAE, 0x83, 0xE0, + 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x15, 0x02, 0xC0, 0xE0, 0x2E, 0xE4, + 0x02, 0xA8, 0x06, 0xAF, 0xC0, 0xE0, 0x58, 0xF0, 0x80, 0xA8, 0x60, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x44, 0x00, 0x2E, 0xE4, 0x0E, 0xA8, + 0x20, 0xAF, 0x60, 0x00, 0x03, 0xAE, 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x56, 0xE0, 0x07, 0xA8, 0x1B, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0x13, 0xA2, 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, 0xC1, 0xE0, 0x2E, 0xE4, + 0x01, 0xA2, 0x2E, 0xE4, 0x2E, 0xE4, 0x07, 0xA8, 0x23, 0xAF, 0x44, 0x00, + 0x07, 0xA8, 0x23, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x13, 0xA2, + 0x39, 0xF0, 0x05, 0xA1, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x01, 0xA2, + 0xC0, 0xE0, 0x28, 0xE4, 0x02, 0xA8, 0x20, 0xAF, 0xC0, 0xE0, 0x2A, 0xE4, + 0x60, 0xA8, 0x60, 0x00, 0x88, 0xC7, 0xA4, 0xCC, 0x3E, 0xA8, 0x61, 0x00, + 0x9E, 0xE0, 0x00, 0x05, 0x00, 0xE0, 0x18, 0xE0, 0xC0, 0xE0, 0x0D, 0x04, + 0xC2, 0xE0, 0x02, 0xA2, 0x1E, 0xE4, 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, + 0x8C, 0x23, 0x1E, 0xE4, 0x04, 0xAF, 0x7F, 0x23, 0xD9, 0x23, 0x0B, 0xE4, + 0x94, 0x23, 0x1E, 0xE4, 0x09, 0xAE, 0x99, 0x23, 0x1E, 0xE4, 0x1E, 0xA8, + 0x6E, 0x00, 0xC1, 0xE0, 0x20, 0xAE, 0x56, 0xE0, 0x17, 0x9F, 0x56, 0xE0, + 0xFF, 0x1F, 0x09, 0xE0, 0x64, 0xE1, 0x17, 0x9F, 0x58, 0x24, 0x1E, 0xE4, + 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, + 0x14, 0x9E, 0xEA, 0x23, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, + 0x01, 0xA2, 0x17, 0x9F, 0x14, 0x9E, 0xF2, 0x23, 0xEC, 0x3C, 0x2E, 0xE4, + 0x0D, 0x04, 0xC3, 0xE0, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x0F, 0x3E, + 0x0F, 0x08, 0x42, 0xE0, 0x11, 0xAE, 0x20, 0x00, 0x00, 0xE0, 0x5E, 0xF8, + 0x40, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x40, 0x0B, 0x11, 0xD1, 0x80, 0x01, + 0x13, 0x01, 0xEC, 0x88, 0xC0, 0x00, 0x12, 0xD1, 0x06, 0xA2, 0x2E, 0xE4, + 0xF9, 0xF7, 0x29, 0xCA, 0x66, 0x28, 0xF7, 0x23, 0x1E, 0xE4, 0x01, 0xA2, + 0x24, 0xE4, 0x02, 0xA1, 0x7F, 0x28, 0x94, 0xE0, 0x1E, 0xE4, 0x0C, 0xC4, + 0x49, 0xE0, 0x92, 0xE0, 0x66, 0x2A, 0x8E, 0xF7, 0x82, 0xE0, 0x2E, 0x24, + 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x95, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, + 0x49, 0xF0, 0x23, 0xA1, 0x1E, 0xE4, 0x04, 0xC4, 0x7F, 0x2A, 0x95, 0xE0, + 0x86, 0xC7, 0xA4, 0xCC, 0x2E, 0xE4, 0x2E, 0x24, 0x9A, 0xE0, 0x40, 0x06, + 0x00, 0xE0, 0x18, 0xE0, 0x07, 0xAE, 0x9C, 0xE0, 0x00, 0x05, 0x00, 0xE0, + 0x1E, 0xE4, 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, 0x8C, 0x23, 0x1E, 0xE4, + 0x04, 0xAF, 0x83, 0x23, 0x1E, 0xE4, 0x1E, 0xA8, 0x69, 0xF0, 0x89, 0xE0, + 0x20, 0xAE, 0x56, 0xE0, 0x09, 0xAE, 0xA8, 0x23, 0x1E, 0xE4, 0x17, 0x9F, + 0x42, 0xE0, 0x85, 0xE0, 0x58, 0x24, 0x1B, 0xE4, 0x89, 0xE0, 0x54, 0x24, + 0x2E, 0xE4, 0x63, 0x24, 0x1E, 0xE4, 0x17, 0x9F, 0x2E, 0xE4, 0x08, 0xAE, + 0x58, 0x4C, 0x57, 0x20, 0x60, 0x00, 0xC1, 0xE0, 0x58, 0x4C, 0x57, 0x20, + 0x58, 0x20, 0x39, 0xF0, 0x23, 0xA1, 0x23, 0xA8, 0x02, 0xA2, 0x2E, 0xE4, + 0x08, 0xAE, 0x57, 0x4C, 0x0E, 0x04, 0xC2, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, + 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x72, 0x24, 0x84, 0xE1, + 0x02, 0x00, 0x22, 0xD0, 0x22, 0xD0, 0x17, 0x9F, 0x15, 0x4D, 0x15, 0x21, + 0x16, 0x21, 0x79, 0x24, 0x84, 0xE1, 0x02, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0x17, 0x9F, 0x16, 0x4D, 0x89, 0x3C, 0x56, 0x28, 0x2E, 0xE4, 0x0D, 0x04, + 0x88, 0x3C, 0x00, 0xA2, 0x32, 0xF0, 0x89, 0x28, 0x1E, 0xE4, 0x8E, 0x3C, + 0x8D, 0x3C, 0x00, 0xA2, 0x89, 0x28, 0x2A, 0xE4, 0x88, 0x28, 0xEC, 0x24, + 0x43, 0x01, 0xC2, 0xE0, 0x89, 0x28, 0x24, 0xE4, 0x00, 0xA2, 0x44, 0x01, + 0xC2, 0xE0, 0x8A, 0x28, 0x02, 0xA1, 0x8B, 0x28, 0x49, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0x02, 0xA1, 0x8C, 0x4C, 0x20, 0xAE, 0x20, 0xAE, 0x7F, 0x23, + 0x1E, 0xE4, 0x42, 0x01, 0x4E, 0x01, 0xC2, 0xE0, 0x42, 0xE0, 0x87, 0x2A, + 0x8C, 0x1A, 0x8E, 0x2A, 0x89, 0x28, 0x2E, 0xE4, 0x8E, 0x4C, 0x10, 0xAE, + 0x8D, 0x28, 0x23, 0xE4, 0x8F, 0x2A, 0x8F, 0x3E, 0x15, 0xB6, 0x03, 0xA2, + 0x56, 0xE0, 0x21, 0xAE, 0x03, 0xA9, 0x03, 0xAE, 0xC2, 0xE0, 0xE9, 0xF7, + 0x4B, 0x01, 0xC1, 0xE0, 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x4D, 0x01, + 0x8B, 0x1A, 0x8D, 0x3E, 0x03, 0xA0, 0x8D, 0x2A, 0x8E, 0x3E, 0x03, 0xA0, + 0x8E, 0x2A, 0x65, 0xF0, 0x88, 0x28, 0x2E, 0xE4, 0x8D, 0x3E, 0x01, 0xA2, + 0x32, 0xF0, 0x8C, 0x18, 0x8E, 0x28, 0x4A, 0xF1, 0x4B, 0x01, 0xC0, 0xE0, + 0xCE, 0xF7, 0x9E, 0xFD, 0xC2, 0xE0, 0x20, 0xAE, 0x04, 0xA2, 0xE8, 0xF7, + 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x4D, 0x01, 0xE8, 0xF7, 0x4B, 0x01, + 0xC0, 0xE0, 0x90, 0xE1, 0x84, 0x28, 0x2E, 0xE4, 0x89, 0x3C, 0x85, 0x28, + 0x84, 0x08, 0xB0, 0x01, 0x04, 0xE0, 0x24, 0xE4, 0x40, 0xA0, 0x02, 0x3F, + 0x57, 0x2A, 0x94, 0xE0, 0x2E, 0xE4, 0x02, 0x3F, 0x58, 0x2A, 0x94, 0xE0, + 0x94, 0xE0, 0x89, 0x08, 0xB0, 0x01, 0x04, 0xE0, 0x94, 0xE0, 0x40, 0xA0, + 0x8B, 0x3E, 0x02, 0x2B, 0x1E, 0xE4, 0x2E, 0xE4, 0x8C, 0x3E, 0x02, 0x2B, + 0x1E, 0xE4, 0x7F, 0x0F, 0x1E, 0xE4, 0x76, 0x25, 0x1E, 0xE4, 0xFD, 0x26, + 0x1E, 0xE4, 0x32, 0x25, 0x1E, 0xE4, 0x4A, 0xF0, 0x2B, 0x28, 0xF7, 0x0E, + 0x1E, 0x34, 0x00, 0xA2, 0xAE, 0xF2, 0x0A, 0x12, 0x52, 0x26, 0x59, 0x4C, + 0x1E, 0x24, 0x59, 0x3C, 0x1E, 0x24, 0x12, 0xF2, 0x46, 0xE0, 0x44, 0x4E, + 0x7C, 0x10, 0x1E, 0xE4, 0x01, 0xA2, 0x59, 0x4C, 0x00, 0xC0, 0x58, 0x4C, + 0x59, 0x24, 0x09, 0xC0, 0x59, 0x4E, 0x1E, 0x26, 0x0E, 0x3C, 0x0D, 0x34, + 0x1E, 0xE4, 0x4A, 0xF0, 0xC4, 0xF6, 0x46, 0xE0, 0xCC, 0x0D, 0x1E, 0xE4, + 0xE2, 0xF0, 0x33, 0x26, 0x5A, 0xF0, 0xA7, 0x06, 0x1E, 0xE4, 0x5A, 0xF6, + 0x2F, 0x25, 0x0E, 0xE4, 0xC3, 0x06, 0x1E, 0xE4, 0x1E, 0xE4, 0xBE, 0xF5, + 0x00, 0x26, 0x1E, 0xE4, 0xA8, 0xCF, 0x00, 0xA2, 0x2E, 0xE4, 0xA9, 0x27, + 0x32, 0x2A, 0x0C, 0xAE, 0x02, 0xA9, 0x04, 0xA2, 0x32, 0x2A, 0x0A, 0xAE, + 0x56, 0xE0, 0x3F, 0xA8, 0x80, 0xCF, 0x06, 0xAE, 0x56, 0xE0, 0x3F, 0xA8, + 0x1A, 0xE0, 0x2B, 0x28, 0xC2, 0xCF, 0x08, 0xA2, 0x02, 0xAE, 0x02, 0xA1, + 0x57, 0x4C, 0x10, 0xAE, 0xD3, 0xD1, 0x00, 0xCF, 0x06, 0xAE, 0x34, 0x4C, + 0x20, 0xC4, 0x01, 0x00, 0x85, 0xD1, 0x0B, 0x00, 0x22, 0xD0, 0x00, 0xA2, + 0x01, 0x02, 0x61, 0xE1, 0x31, 0x2B, 0x59, 0x25, 0x84, 0xE1, 0x0F, 0x00, + 0x72, 0x20, 0xE8, 0xCF, 0x2A, 0xB4, 0x02, 0xAE, 0x75, 0x4C, 0x74, 0x20, + 0xEA, 0xCF, 0x73, 0x4C, 0xEE, 0xCF, 0x77, 0x4C, 0x76, 0x20, 0xEC, 0xCF, + 0x03, 0xA8, 0xCF, 0xCB, 0x60, 0x00, 0x04, 0xE0, 0x30, 0xCE, 0x70, 0x00, + 0x04, 0xE0, 0x3B, 0xF0, 0x1F, 0x00, 0x22, 0xD0, 0x60, 0x02, 0x61, 0xE1, + 0x11, 0x4D, 0x11, 0x21, 0x74, 0x25, 0x84, 0xE1, 0xC2, 0xE0, 0x02, 0xA2, + 0x2E, 0xE4, 0x32, 0xCE, 0x22, 0xD0, 0x21, 0xA2, 0x00, 0xA2, 0x3C, 0x01, + 0xC2, 0xE0, 0x83, 0x25, 0x84, 0xE1, 0xDF, 0x00, 0x02, 0xA0, 0x3F, 0x01, + 0xC3, 0xE0, 0x3E, 0x01, 0x2E, 0xE4, 0x3C, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0xE0, 0x0C, 0x1E, 0xE4, 0x94, 0x3C, 0x00, 0xA2, 0x59, 0x34, 0x09, 0xC0, + 0xFD, 0x25, 0x0D, 0xE4, 0x44, 0x4E, 0x52, 0x26, 0x00, 0xC0, 0x58, 0x3C, + 0x12, 0xBC, 0xFD, 0x25, 0x02, 0xE4, 0x46, 0xE0, 0xA8, 0xB4, 0x0A, 0xA1, + 0xFD, 0x25, 0x0D, 0xE4, 0xFE, 0xBD, 0xFD, 0x25, 0x00, 0xE4, 0x04, 0xA1, + 0x3A, 0xF0, 0x29, 0x18, 0xFD, 0x25, 0x0D, 0xE4, 0x39, 0x1C, 0x13, 0x74, + 0x94, 0x3C, 0x02, 0xA2, 0x4F, 0x28, 0x94, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, + 0x0D, 0xE4, 0xE0, 0x0C, 0x1E, 0xE4, 0x9A, 0xF0, 0x02, 0xA2, 0x3A, 0xF0, + 0x45, 0x1C, 0xFD, 0x25, 0x34, 0xF0, 0x02, 0xA1, 0x16, 0x28, 0x94, 0x3C, + 0x60, 0xE1, 0x17, 0x74, 0xDE, 0xF2, 0x6A, 0xF1, 0x02, 0xA2, 0x3A, 0xF0, + 0x00, 0x1D, 0x03, 0x09, 0x1E, 0xE4, 0x4A, 0xF2, 0x2A, 0x28, 0x94, 0x3C, + 0x04, 0x09, 0x61, 0xE1, 0x8D, 0xF3, 0xFC, 0x0C, 0x02, 0xA2, 0x3A, 0xF0, + 0x01, 0x1D, 0x11, 0x11, 0x78, 0xF1, 0x18, 0x28, 0x9E, 0xF1, 0x94, 0x3C, + 0x63, 0xE1, 0xBD, 0xF2, 0xFC, 0x0C, 0x1E, 0xE4, 0x3A, 0xF0, 0x03, 0x1D, + 0x13, 0x11, 0x03, 0x09, 0xBA, 0xF0, 0x2A, 0x28, 0x94, 0x3C, 0x02, 0xA2, + 0x65, 0xE1, 0xFD, 0xF1, 0xFC, 0x0C, 0x1E, 0xE4, 0x3A, 0xF0, 0x05, 0x1D, + 0x15, 0x11, 0x05, 0x09, 0x6A, 0xF0, 0x35, 0x28, 0x94, 0x3C, 0x02, 0xA2, + 0x01, 0xA2, 0x3A, 0xF0, 0x4D, 0xF1, 0xFE, 0xBC, 0x68, 0xF0, 0x94, 0x28, + 0x01, 0x3C, 0x94, 0x3E, 0xF1, 0x11, 0x1E, 0xE4, 0x48, 0xF0, 0x01, 0x28, + 0x06, 0xAE, 0x54, 0x0C, 0x1E, 0xE4, 0x94, 0x3C, 0x02, 0xA2, 0x34, 0xF0, + 0x46, 0xE0, 0x73, 0xC8, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, + 0x1E, 0xE4, 0x61, 0x0C, 0x1E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x02, 0xA2, + 0x68, 0xF0, 0x5D, 0x0C, 0x6A, 0xE1, 0x61, 0x0C, 0x1E, 0xE4, 0x96, 0x09, + 0x00, 0xC0, 0x58, 0x4C, 0x59, 0x24, 0x09, 0xC0, 0x0C, 0x3C, 0x00, 0xA2, + 0x59, 0x3C, 0x1E, 0x34, 0x54, 0x03, 0x1E, 0xE4, 0x55, 0x26, 0x1E, 0xE4, + 0x44, 0x4E, 0x52, 0x26, 0x59, 0x4C, 0x1E, 0x24, 0x70, 0x26, 0x1E, 0xE4, + 0xB2, 0xF0, 0x46, 0xE0, 0x30, 0xF7, 0x02, 0xA1, 0x86, 0xCB, 0x1D, 0xF1, + 0xF8, 0xF6, 0x2B, 0x26, 0x18, 0xE4, 0x94, 0xC8, 0x1E, 0xE4, 0x2E, 0xE4, + 0x18, 0x0D, 0x1E, 0xE4, 0x6A, 0xE1, 0x1A, 0xB6, 0x02, 0xA2, 0x8C, 0x09, + 0x38, 0x28, 0x2E, 0xE4, 0x6A, 0xE1, 0x2E, 0xE4, 0x38, 0x3C, 0x16, 0xE0, + 0x4F, 0x28, 0x05, 0x3C, 0x55, 0x26, 0x1E, 0xE4, 0x0C, 0x3C, 0x02, 0xA2, + 0x0C, 0x3C, 0x00, 0xA2, 0x38, 0x3C, 0x05, 0x28, 0x59, 0x4C, 0x1E, 0x2C, + 0x54, 0x03, 0x1E, 0xE4, 0xD2, 0xF0, 0x46, 0xE0, 0x0E, 0x4E, 0x0D, 0x2E, + 0x5B, 0x24, 0x09, 0xC0, 0x9E, 0x26, 0x1E, 0xE4, 0x09, 0xC0, 0x02, 0xA0, + 0x00, 0xC0, 0x5A, 0x4C, 0xDE, 0xF6, 0x00, 0xC0, 0x5A, 0x3C, 0x5B, 0x34, + 0x4B, 0x28, 0x00, 0x00, 0xFA, 0xD1, 0x2E, 0xE4, 0x4D, 0x4C, 0x0A, 0xAE, + 0x4C, 0x4C, 0x0A, 0xAE, 0x38, 0x4C, 0x04, 0xAE, 0x48, 0x28, 0x30, 0xCF, + 0x4A, 0x28, 0x00, 0x00, 0xC3, 0xD1, 0x82, 0xCF, 0x38, 0x4C, 0x0C, 0xAE, + 0x48, 0x28, 0x96, 0xCF, 0x38, 0x28, 0x3A, 0xF0, 0x0C, 0x28, 0xC4, 0xCF, + 0x2E, 0xE4, 0x01, 0x00, 0x88, 0xD1, 0x3A, 0xF0, 0x3F, 0x00, 0xD0, 0xD1, + 0x02, 0x00, 0x85, 0xD1, 0x09, 0xE4, 0xA3, 0xCB, 0x10, 0xA8, 0xA0, 0xCB, + 0x6E, 0x27, 0x1E, 0xE4, 0xB8, 0xF7, 0x94, 0x26, 0x1A, 0xE4, 0x5A, 0x28, + 0xF8, 0xF7, 0xE0, 0xCB, 0x09, 0xE4, 0xA3, 0xCB, 0xA0, 0xCB, 0x91, 0x27, + 0x01, 0x00, 0x86, 0xD1, 0xC8, 0xF7, 0x94, 0x26, 0xA1, 0x27, 0x1E, 0xE4, + 0x04, 0x00, 0x85, 0xD1, 0x02, 0xE0, 0x59, 0x3C, 0x1E, 0x34, 0x06, 0xCB, + 0x2E, 0xE4, 0x90, 0xE1, 0x28, 0xF0, 0xFE, 0xFF, 0x00, 0x00, 0xD1, 0xD1, + 0x00, 0x00, 0xD0, 0xD1, 0xF8, 0xF7, 0xE0, 0xCB, 0xF8, 0xF7, 0x1C, 0xCB, + 0x02, 0x00, 0x85, 0xD1, 0x2E, 0xE4, 0x6B, 0xE1, 0x01, 0x00, 0xC2, 0xD1, + 0x00, 0x00, 0x86, 0xD1, 0x00, 0x00, 0xC4, 0xD1, 0x00, 0x00, 0xC5, 0xD1, + 0xF8, 0xF7, 0xA0, 0xCB, 0x0E, 0x00, 0xD0, 0xD1, 0xC4, 0xCF, 0x1A, 0xE0, + 0x55, 0x4C, 0x54, 0x20, 0xC5, 0xD1, 0x00, 0x00, 0xC2, 0xD1, 0x98, 0xF0, + 0xC8, 0xD1, 0x03, 0x00, 0xC4, 0xD1, 0x03, 0x00, 0x1E, 0xE4, 0x20, 0x00, + 0xD0, 0xD1, 0x00, 0x00, 0x26, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x6E, 0x27, + 0x1A, 0xE4, 0x5A, 0x28, 0xF8, 0xF7, 0xE0, 0xCB, 0x86, 0xD1, 0xF8, 0xF7, + 0xA0, 0xCB, 0x91, 0x27, 0x1E, 0xE4, 0x04, 0x00, 0x85, 0xD1, 0x01, 0x00, + 0x59, 0x3C, 0x1E, 0x34, 0x06, 0xCB, 0xA1, 0x27, 0x00, 0x01, 0xC2, 0xE0, + 0x00, 0xA2, 0x2E, 0xE4, 0x25, 0x01, 0xC2, 0xE0, 0x3D, 0x01, 0xC2, 0xE0, + 0x08, 0xAE, 0x92, 0xB6, 0x88, 0x2A, 0x8E, 0xCC, 0x18, 0xA2, 0x78, 0x01, + 0xC2, 0xE0, 0x1C, 0xA9, 0x1E, 0xE4, 0x4E, 0x28, 0x79, 0x01, 0xC2, 0xE0, + 0x50, 0xB6, 0x56, 0xE0, 0x17, 0xE0, 0xA3, 0x23, 0xA3, 0x23, 0x1E, 0xE4, + 0x58, 0x23, 0x1E, 0xE4, 0x69, 0x23, 0x1E, 0xE4, 0x52, 0xB6, 0x16, 0xB6, + 0x57, 0x20, 0x10, 0x02, 0xC2, 0xE0, 0x02, 0xA2, 0x01, 0x01, 0xC2, 0xE0, + 0x08, 0xAE, 0x58, 0x4C, 0x4B, 0x23, 0x1E, 0xE4, 0x05, 0x02, 0xC2, 0xE0, + 0x49, 0xE0, 0x50, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x11, 0xAF, 0x08, 0x3C, + 0x7F, 0x00, 0x08, 0xE0, 0x08, 0x46, 0x09, 0x3E, 0x7F, 0x00, 0x09, 0xE0, + 0x03, 0xA8, 0x08, 0x2A, 0x00, 0xA2, 0x08, 0x3E, 0x05, 0xA8, 0x08, 0x2A, + 0x04, 0xA9, 0x2B, 0xF0, 0x09, 0xA8, 0x08, 0x2A, 0x12, 0xA9, 0x2B, 0xF0, + 0x11, 0xA8, 0x08, 0x2A, 0x40, 0xA9, 0x2B, 0xF0, 0x0C, 0x04, 0xC2, 0xE0, + 0x80, 0xA9, 0x2B, 0xF0, 0x02, 0x00, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, + 0x03, 0xA8, 0x09, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x11, 0x21, 0xCB, 0x05, + 0x61, 0xE1, 0x5B, 0xF0, 0x46, 0x00, 0xC1, 0xE0, 0x0E, 0xCF, 0x11, 0x4D, + 0x42, 0xE0, 0x10, 0xAE, 0x92, 0x00, 0x04, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, + 0x05, 0xA8, 0x09, 0x2A, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xCD, 0x05, + 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x03, 0x01, 0x09, 0x2A, 0x42, 0xE0, + 0x10, 0xAE, 0xF2, 0x00, 0xCF, 0x05, 0x61, 0xE1, 0x5B, 0xF0, 0x09, 0xA8, + 0x11, 0x02, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xF2, 0x00, 0x04, 0xE0, + 0x46, 0x00, 0xC1, 0xE0, 0x42, 0xE0, 0x10, 0xAE, 0x80, 0x00, 0x00, 0xE0, + 0x61, 0xE1, 0x5B, 0xF0, 0x11, 0xA8, 0x09, 0x2A, 0xC2, 0xE0, 0x11, 0x4D, + 0x11, 0x21, 0xD1, 0x05, 0x04, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x12, 0x02, + 0xC2, 0xE0, 0x00, 0xA2, 0x04, 0x02, 0xC2, 0xE0, 0x0E, 0xA2, 0xAD, 0x27, + 0x1E, 0xE4, 0x08, 0x02, 0x64, 0x01, 0x1E, 0xE4, 0x12, 0x03, 0xC2, 0xE0, + 0xC2, 0xE0, 0x02, 0xA2, 0x9E, 0x02, 0x1E, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0x06, 0x01, 0xC2, 0xE0, 0x0D, 0x03, 0xC2, 0xE0, 0x13, 0x01, + 0x15, 0x01, 0xC2, 0xE0, 0x94, 0xCB, 0x2B, 0x02, 0x8A, 0xCB, 0x26, 0x01, + 0xC2, 0xE0, 0xA4, 0xCB, 0x5A, 0x3C, 0x02, 0xA8, 0x14, 0x01, 0xC2, 0xE0, + 0x19, 0xCB, 0x0A, 0xAE, 0x14, 0xCB, 0x2A, 0xE4, 0x8C, 0xCB, 0x20, 0x01, + 0xC2, 0xE0, 0x56, 0xE0, 0xC2, 0xE0, 0x8E, 0xCB, 0x21, 0x01, 0xC2, 0xE0, + 0x23, 0x01, 0xC2, 0xE0, 0x90, 0xCB, 0x22, 0x01, 0x0C, 0x03, 0xC2, 0xE0, + 0xD0, 0xCB, 0x2E, 0xE4, 0xD8, 0xCB, 0x09, 0x03, 0xC2, 0xE0, 0xD2, 0xCB, + 0xC2, 0xE0, 0xDA, 0xCB, 0x0A, 0x03, 0xC2, 0xE0, 0x20, 0x03, 0xC2, 0xE0, + 0x00, 0xA2, 0x0B, 0x03, 0xC2, 0xE0, 0x02, 0xA2, 0x8E, 0xF8, 0x2E, 0xE4, + 0xA5, 0x24, 0x18, 0xE4, 0x88, 0x28, 0x10, 0x01, 0xE8, 0xF7, 0x11, 0x01, + 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0x03, 0xC2, 0xE0, 0x02, 0xA2, 0x2E, 0xE4, + 0x60, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x20, 0xA2, 0x62, 0xE1, 0x03, 0x02, + 0x61, 0xE1, 0x04, 0x00, 0x84, 0xE1, 0x80, 0x03, 0x63, 0xE1, 0x02, 0x02, + 0x29, 0xF0, 0x32, 0x2B, 0x31, 0x29, 0xC5, 0x27, 0x13, 0x81, 0x03, 0x9F, + 0x08, 0xB6, 0x83, 0x28, 0x00, 0xA2, 0x90, 0xE1, 0x13, 0x81, 0x13, 0x81, + 0x90, 0xE1, 0x2E, 0xE4, 0x02, 0x03, 0xC2, 0xE0, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1C, 0x1C, 0x14, 0x14, + 0x14, 0x0D, 0x0D, 0x06, 0x2A, 0x25, 0x25, 0x20, 0x20, 0x20, 0x1C, 0x1C, + 0x18, 0x18, 0x14, 0x14, 0x14, 0x0E, 0x0E, 0x0A, 0x22, 0x1E, 0x1E, 0x1B, + 0x1B, 0x1B, 0x18, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0D, 0x0B, + 0x0D, 0x0A, 0x0A, 0x06, 0x17, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x10, + 0x19, 0x19, 0x19, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1B, 0x1B, 0x1B, 0x1B, + 0x19, 0x19, 0x19, 0x19, 0x1D, 0x1D, 0x1D, 0x1D, 0x1B, 0x1B, 0x1B, 0x1B, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1D, 0x1D, 0x1D, 0x24, 0x24, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x1F, 0x2A, 0x28, 0x28, 0x26, 0x26, 0x26, 0x24, 0x24, + 0x11, 0x11, 0x0F, 0x0D, 0x0F, 0x0D, 0x0D, 0x09, 0x15, 0x13, 0x13, 0x13, + 0x13, 0x13, 0x11, 0x11, 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x18, 0x18, 0x18, 0x18, 0x16, 0x16, 0x16, 0x16, 0x19, 0x19, 0x19, 0x19, + 0x18, 0x18, 0x18, 0x18, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x19, 0x19, 0x19, + 0x1E, 0x1E, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1B, 0x23, 0x21, 0x21, 0x20, + 0x20, 0x20, 0x1E, 0x1E, 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x00, 0x0A, 0x00, 0x0D, 0x00, + 0x0C, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0B, 0x00, 0x07, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x03, 0x00, + 0x02, 0x00, 0x09, 0x00, 0x19, 0x00, 0x20, 0x00, 0x18, 0x00, 0x11, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x12, 0x00, 0x21, 0x00, 0x1A, 0x00, + 0x13, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x29, 0x00, 0x30, 0x00, 0x28, 0x00, + 0x06, 0x00, 0x0D, 0x00, 0x14, 0x00, 0x1B, 0x00, 0x1C, 0x00, 0x15, 0x00, + 0x0E, 0x00, 0x07, 0x00, 0x38, 0x00, 0x31, 0x00, 0x2A, 0x00, 0x23, 0x00, + 0x24, 0x00, 0x2B, 0x00, 0x32, 0x00, 0x39, 0x00, 0x17, 0x00, 0x0F, 0x00, + 0x16, 0x00, 0x1D, 0x00, 0x33, 0x00, 0x2C, 0x00, 0x25, 0x00, 0x1E, 0x00, + 0x2D, 0x00, 0x34, 0x00, 0x3B, 0x00, 0x3A, 0x00, 0x2E, 0x00, 0x27, 0x00, + 0x1F, 0x00, 0x26, 0x00, 0x36, 0x00, 0x3D, 0x00, 0x3C, 0x00, 0x35, 0x00, + 0x3F, 0x00, 0x3E, 0x00, 0x37, 0x00, 0x2F, 0x00, 0x0D, 0x00, 0x0C, 0x00, + 0x0B, 0x00, 0x0A, 0x00, 0x1E, 0x00, 0x16, 0x00, 0x15, 0x00, 0x14, 0x00, + 0x29, 0x00, 0x28, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x33, 0x00, + 0x32, 0x00, 0x2A, 0x00, 0x8C, 0x01, 0x8C, 0x01, 0x8C, 0x01, 0x63, 0x00, + 0x54, 0x06, 0x54, 0x06, 0x18, 0x03, 0x8C, 0x01, 0x00, 0x20, 0x00, 0x20, + 0x00, 0x14, 0x10, 0x0E, 0x00, 0x00, 0xEE, 0x8F, 0x40, 0x56, 0x00, 0x22, + 0x52, 0x02, 0x52, 0x02, 0xE1, 0x00, 0x63, 0x00, 0xE9, 0x07, 0xE9, 0x07, + 0xA4, 0x04, 0x52, 0x02, 0x00, 0x20, 0x00, 0x20, 0x00, 0x14, 0x94, 0x11, + 0x00, 0x00, 0x00, 0xB4, 0xD0, 0x6B, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x73, 0x03, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x8D, 0x03, 0x0E, 0xE4, + 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, + 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, + 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, + 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, + 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, + 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, + 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x73, 0x03, + 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, + 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, + 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, + 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, + 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, + 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, + 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, + 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, + 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, + 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, + 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, + 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, + 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, + 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, + 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, + 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, + 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, + 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, + 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, + 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, + 0x00, 0x28, 0x12, 0xD1, 0x49, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, + 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, + 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, + 0x93, 0x03, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, + 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, + 0x7C, 0xE6, 0x95, 0x03, 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, + 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, + 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, + 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, + 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xEE, 0x01, + 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, + 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, + 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, + 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, + 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, + 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, + 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, + 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, + 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, + 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, 0x90, 0x01, 0x1A, 0xE4, + 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x3E, 0xA2, + 0x2E, 0xE4, 0x4A, 0x00, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x02, 0xA2, + 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0x20, 0xA2, 0x00, 0xA2, 0x76, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0xC2, 0xE0, 0xFC, 0xA2, 0x72, 0x00, 0xC2, 0xE0, + 0x71, 0x00, 0xC2, 0xE0, 0xFA, 0xA2, 0x77, 0x00, 0x84, 0xE1, 0x0F, 0x27, + 0x22, 0xD0, 0x2E, 0xE4, 0x48, 0xF0, 0x4A, 0x00, 0xC0, 0xE0, 0xAA, 0x01, + 0xC0, 0xE0, 0xE8, 0xF7, 0x1F, 0x04, 0xC0, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, + 0xEE, 0xA1, 0x3D, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0xC2, 0xE0, 0x11, 0x00, 0x04, 0xE0, 0x9D, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0x2E, 0xE4, 0x3C, 0x04, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xE0, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0x45, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3C, 0x04, 0x28, 0xE4, 0x04, 0xA1, + 0x0E, 0xA8, 0x04, 0xAF, 0xC0, 0xE0, 0x4A, 0x00, 0xC2, 0xE0, 0x02, 0xA2, + 0x48, 0xCA, 0x8E, 0xF9, 0xE8, 0xF7, 0x11, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0xE8, 0xF7, 0x02, 0xA8, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xF8, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x3C, 0x04, 0x42, 0x3C, 0x43, 0x34, + 0x01, 0xC0, 0x2E, 0xE4, 0x43, 0x2C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, + 0x09, 0xC0, 0x2A, 0xE4, 0x00, 0xC0, 0x42, 0x2E, 0x46, 0xE0, 0x00, 0xC0, + 0x56, 0x4E, 0x57, 0x26, 0x57, 0x18, 0x10, 0xAF, 0x4A, 0xE0, 0xB4, 0xF0, + 0x58, 0x1A, 0xFF, 0x00, 0x09, 0xE0, 0x74, 0xF0, 0xFE, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x34, 0xF0, 0xC3, 0xE0, 0x08, 0x08, 0xC2, 0xE0, 0x2E, 0xE4, + 0x02, 0xA2, 0x02, 0x08, 0x62, 0xE1, 0x0B, 0x08, 0x12, 0x9F, 0x12, 0x9F, + 0x00, 0xA2, 0x12, 0x9F, 0x12, 0x9F, 0x92, 0x9F, 0x00, 0x02, 0x05, 0xE0, + 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, 0x12, 0x9F, 0x02, 0xA2, 0x12, 0x81, + 0x12, 0x9F, 0x00, 0xA2, 0x00, 0x08, 0xC0, 0xE0, 0x00, 0x08, 0xC2, 0xE0, + 0x00, 0x34, 0x02, 0xAE, 0x2E, 0xE4, 0xE8, 0xF7, 0x01, 0x3C, 0x02, 0xAF, + 0xFF, 0xFF, 0x08, 0xE0, 0x01, 0x82, 0x1E, 0xAE, 0x18, 0xE0, 0x00, 0x82, + 0x49, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0xE0, 0x18, 0xAE, 0x32, 0xA2, + 0x20, 0x06, 0x60, 0xD1, 0x21, 0xD1, 0x40, 0xCE, 0x2E, 0xE4, 0xC0, 0xCE, + 0x23, 0xD1, 0x02, 0x00, 0x22, 0xD1, 0x00, 0x00, 0xE8, 0xF7, 0x02, 0xA8, + 0x48, 0xCA, 0x80, 0x00, 0x9E, 0xCC, 0x22, 0xAE, 0x04, 0xA2, 0x2E, 0xE4, + 0x8E, 0xCC, 0x8C, 0xCC, 0x72, 0xCC, 0x00, 0xA2, 0x0A, 0xE0, 0x20, 0xAE, + 0x10, 0xA8, 0x04, 0xE0, 0x03, 0x00, 0x6F, 0xD1, 0x4A, 0xCE, 0x22, 0x93, + 0x6F, 0xD1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x50, 0xCE, 0x60, 0xA2, + 0x2E, 0xE4, 0x00, 0x00, 0x00, 0xC0, 0xEA, 0xF7, 0x02, 0xA8, 0x50, 0xCA, + 0x50, 0xCE, 0x20, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0x00, 0xA2, 0x2E, 0xE4, 0xEF, 0xA1, 0x3D, 0x04, 0xC1, 0xE0, 0x2E, 0xE4, + 0xC2, 0xE0, 0x00, 0x01, 0x0A, 0xE0, 0xD9, 0xF7, 0xBD, 0x02, 0x1E, 0xE4, + 0x2E, 0xE4, 0x1C, 0x04, 0x08, 0xE0, 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, + 0x1E, 0xE4, 0x6D, 0x02, 0x1E, 0xE4, 0x1F, 0x00, 0x12, 0xAE, 0x32, 0x03, + 0x1E, 0xE4, 0xF8, 0x02, 0x22, 0x03, 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, + 0x2A, 0xE4, 0xE3, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x18, 0xF1, 0x04, 0xA8, + 0x10, 0x02, 0xC0, 0xE0, 0x00, 0x01, 0x08, 0xE0, 0x15, 0x02, 0xC0, 0xE0, + 0xBE, 0xF0, 0x16, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, 0x08, 0xE0, + 0x13, 0x02, 0xC0, 0xE0, 0x3E, 0xF0, 0x14, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, + 0x6D, 0x02, 0x1E, 0xE4, 0x0B, 0x02, 0xC0, 0xE0, 0x32, 0x03, 0x1E, 0xE4, + 0xF8, 0x02, 0x1E, 0xE4, 0x03, 0xA8, 0x10, 0x02, 0xC1, 0xE0, 0x12, 0xAE, + 0x04, 0x02, 0xC1, 0xE0, 0x56, 0xE0, 0x15, 0xAE, 0x56, 0xE0, 0x07, 0xAE, + 0x7F, 0xA8, 0x0B, 0xAF, 0x56, 0xE0, 0x0F, 0xA8, 0x04, 0x02, 0xC1, 0xE0, + 0x22, 0x03, 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x92, 0xE0, 0x44, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0xEA, 0xF1, 0x52, 0xE0, 0x1F, 0xAE, 0x03, 0xA2, + 0x08, 0xAF, 0x94, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0x1E, 0xA8, 0x84, 0xE0, + 0x8A, 0xF1, 0x06, 0xA8, 0x17, 0xE0, 0x21, 0xA8, 0x85, 0xE0, 0x16, 0xE0, + 0x44, 0x00, 0xC0, 0xE0, 0x0A, 0xF1, 0x56, 0xE0, 0xC1, 0xE0, 0x16, 0xE0, + 0x1E, 0xA8, 0x12, 0xAF, 0x1B, 0xE0, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, + 0x02, 0xA2, 0x3A, 0xF0, 0x56, 0xE0, 0x03, 0xA8, 0xC0, 0xE0, 0x2E, 0xE4, + 0x00, 0xA2, 0x2E, 0xE4, 0x52, 0xE0, 0x1F, 0xAE, 0x03, 0xA2, 0x44, 0x00, + 0xB8, 0xF0, 0xBD, 0x02, 0x1E, 0xE4, 0xEA, 0xF0, 0xC0, 0xE0, 0x69, 0xF0, + 0x26, 0x21, 0x1E, 0xE4, 0x38, 0xF0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, + 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0xFF, 0x00, 0x08, 0xE0, + 0x1C, 0x04, 0xC0, 0xE0, 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, + 0xC2, 0xE0, 0x04, 0xAE, 0x02, 0xA0, 0x00, 0x05, 0x18, 0x04, 0xC2, 0xE0, + 0x02, 0xA2, 0x1A, 0x04, 0x02, 0xA2, 0xEA, 0xF7, 0x19, 0x04, 0xC0, 0xE0, + 0x19, 0x04, 0xC0, 0xE0, 0x18, 0x04, 0xC2, 0xE0, 0x20, 0xAF, 0x1B, 0x04, + 0xC0, 0xE0, 0xEA, 0xF7, 0xC1, 0xE0, 0x28, 0xAE, 0x08, 0xAF, 0x1E, 0xA0, + 0x1F, 0xA0, 0xFF, 0xFF, 0x09, 0xE0, 0x1B, 0x04, 0xC2, 0xE0, 0x56, 0xE0, + 0x09, 0xAE, 0x09, 0xAF, 0x1C, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, 0x1D, 0x04, + 0x1C, 0x04, 0xC2, 0xE0, 0x00, 0x02, 0x0A, 0xE0, 0xC0, 0xE0, 0xF0, 0xF7, + 0x02, 0xA1, 0x28, 0xA2, 0xC2, 0xE0, 0x00, 0x02, 0x0C, 0xE0, 0x1C, 0x04, + 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0x01, 0xC0, 0x2E, 0xE4, + 0x02, 0xA8, 0x04, 0xAF, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x41, 0x3C, + 0x1E, 0xE4, 0x2E, 0xE4, 0x00, 0xC0, 0x41, 0x2C, 0x59, 0x4E, 0x1E, 0x26, + 0x7A, 0xF1, 0x3B, 0x03, 0x5C, 0x00, 0xC0, 0xE0, 0x30, 0xF1, 0x46, 0xE0, + 0xC0, 0xE0, 0xEA, 0xF0, 0x00, 0x20, 0x08, 0xE0, 0xC2, 0xE0, 0x00, 0x20, + 0x0A, 0xE0, 0x5D, 0x00, 0x03, 0xA2, 0xCC, 0x07, 0x1E, 0xE4, 0x5D, 0x00, + 0x37, 0x03, 0x1E, 0xE4, 0x00, 0xA2, 0x01, 0xCE, 0x24, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x6D, 0x00, 0xC0, 0xE0, 0xEA, 0xF0, 0x02, 0xA8, + 0x58, 0x18, 0xFF, 0x00, 0x08, 0xE0, 0xBA, 0xF0, 0x00, 0x84, 0x00, 0x3C, + 0x58, 0x08, 0x72, 0xF0, 0x1E, 0xE4, 0x0E, 0xA0, 0x18, 0xE0, 0x57, 0x82, + 0x65, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x37, 0x03, 0x0E, 0xE4, 0x2E, 0xE4, + 0x02, 0xA8, 0x24, 0xAF, 0x0E, 0xE4, 0x97, 0x03, 0x0E, 0xE4, 0xD3, 0x0C, + 0x0E, 0xE4, 0x9F, 0x03, 0x0E, 0xE4, 0x9B, 0x03, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0xA9, 0x03, 0x0E, 0xE4, 0xAD, 0x03, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xB1, 0x03, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x1E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xC1, 0x03, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xE2, 0x03, 0x1E, 0xE4, 0x96, 0x04, + 0x1E, 0xE4, 0xAE, 0x10, 0x0E, 0xE4, 0xB6, 0x01, 0x1E, 0xE4, 0xAB, 0x10, + 0x0E, 0xE4, 0xDD, 0x05, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xE0, 0x05, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x11, 0x06, 0x1E, 0xE4, 0x6A, 0x00, + 0x66, 0xE1, 0xCB, 0x05, 0x67, 0xE1, 0x6A, 0x00, 0x84, 0xE1, 0x03, 0x00, + 0x22, 0xD0, 0x64, 0x00, 0x17, 0x3D, 0x17, 0x35, 0x16, 0x9E, 0xBF, 0x03, + 0xAD, 0x3C, 0x86, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x1E, 0xE4, 0x5E, 0x04, + 0x1E, 0xE4, 0xBE, 0x3C, 0x1E, 0xE4, 0x4A, 0x07, 0x1E, 0xE4, 0xFE, 0x05, + 0xDD, 0xF0, 0xE3, 0x03, 0x1E, 0xE4, 0xAF, 0x09, 0x2B, 0x04, 0x1A, 0xE4, + 0xE5, 0x0B, 0x1E, 0xE4, 0x1E, 0xE4, 0x83, 0x3C, 0x10, 0x3C, 0xFE, 0xA2, + 0x86, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, 0xF3, 0x14, 0x6A, 0x08, 0x1E, 0xE4, + 0x09, 0x0C, 0x1E, 0xE4, 0xAE, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, 0x6A, 0xE1, + 0xF0, 0x3C, 0x3E, 0xA2, 0x38, 0xF0, 0x04, 0xA1, 0x1E, 0xE4, 0x58, 0xF1, + 0xE5, 0x0B, 0x1E, 0xE4, 0x04, 0xA1, 0x3A, 0xF1, 0x0E, 0xA1, 0x15, 0x0C, + 0x02, 0xA1, 0x6A, 0xF0, 0x02, 0xA1, 0x3A, 0xF3, 0xCE, 0xF6, 0xEF, 0x09, + 0x1E, 0xE4, 0x4A, 0xF0, 0x04, 0xA2, 0x58, 0xF0, 0xE5, 0x0B, 0x1E, 0xE4, + 0x6B, 0xE1, 0x5E, 0xF6, 0xF7, 0x09, 0x1E, 0xE4, 0x1E, 0xE4, 0xD5, 0x14, + 0x1E, 0xE4, 0x2E, 0xE4, 0x10, 0x3C, 0xFE, 0xA2, 0xEA, 0xF5, 0x27, 0x0A, + 0x00, 0x28, 0x9A, 0xF5, 0x32, 0x1B, 0x1E, 0xE4, 0x1E, 0xE4, 0x47, 0x1B, + 0x1E, 0xE4, 0x10, 0x3C, 0xB7, 0x0C, 0x1E, 0xE4, 0x00, 0xA2, 0x84, 0x09, + 0x1A, 0xE4, 0xD6, 0x28, 0x9B, 0x3C, 0x00, 0xA2, 0x2C, 0xE4, 0x10, 0x3C, + 0xFE, 0xA2, 0xA3, 0x14, 0x15, 0x00, 0x08, 0xE0, 0x45, 0x00, 0xC0, 0xE0, + 0x1E, 0xE4, 0x2E, 0xE4, 0xE3, 0x03, 0x0A, 0xE4, 0x1E, 0xE4, 0xD5, 0x14, + 0x1E, 0xE4, 0xDC, 0x14, 0x1E, 0xE4, 0xE3, 0x03, 0x0E, 0xE4, 0xEF, 0x09, + 0x8A, 0xF1, 0x02, 0xA1, 0x0A, 0xF1, 0x15, 0x0C, 0x08, 0xA1, 0x5A, 0xF1, + 0xC4, 0xF0, 0x08, 0xA1, 0x02, 0xA1, 0xAA, 0xF0, 0x02, 0xA1, 0x36, 0xF1, + 0x02, 0xA1, 0xDA, 0xF0, 0x06, 0xA1, 0x8A, 0xF0, 0xCE, 0xF6, 0xEF, 0x09, + 0x1E, 0xE4, 0xBA, 0xF0, 0x04, 0xA2, 0x58, 0xF0, 0xE5, 0x0B, 0x1E, 0xE4, + 0x2E, 0xE4, 0x5E, 0xF6, 0xF7, 0x09, 0x1E, 0xE4, 0x88, 0xE1, 0x00, 0x01, + 0x61, 0xE1, 0x00, 0xA2, 0x41, 0x00, 0xC0, 0xE0, 0x11, 0x3D, 0xFF, 0x0A, + 0x42, 0xE0, 0x11, 0xAE, 0x35, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x01, + 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x80, 0x01, + 0x48, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, 0xF8, 0xF7, 0x26, 0x01, 0x1E, 0xE4, + 0x36, 0x02, 0x1E, 0xE4, 0x30, 0xD1, 0x6A, 0xE1, 0xAE, 0x3C, 0x04, 0xA2, + 0x4C, 0xD0, 0x00, 0x00, 0x3A, 0xD0, 0x00, 0x00, 0x22, 0xD0, 0x00, 0x00, + 0x08, 0xD0, 0x00, 0x00, 0x00, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0x00, + 0xD3, 0x3C, 0x02, 0xA2, 0x25, 0x01, 0xC2, 0xE0, 0x27, 0x3C, 0x26, 0x3C, + 0x25, 0x3C, 0xFE, 0xA2, 0x56, 0x3C, 0x29, 0x3C, 0x10, 0x3C, 0x28, 0x3C, + 0xC7, 0x05, 0x61, 0xE1, 0xD7, 0x3C, 0xDA, 0x3C, 0x11, 0x3D, 0x11, 0x35, + 0x11, 0x3D, 0x11, 0x35, 0x1E, 0xE4, 0xA7, 0x0C, 0x1E, 0xE4, 0xAF, 0x3C, + 0x1E, 0xE4, 0x51, 0x20, 0x1E, 0xE4, 0x1C, 0x1B, 0x00, 0xA2, 0x52, 0x27, + 0x1E, 0xE4, 0x9B, 0x16, 0x86, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xD8, 0x3C, + 0x1E, 0xE4, 0x00, 0xC0, 0x53, 0x3C, 0x09, 0xC0, 0x1E, 0xE4, 0xCA, 0x1A, + 0x1E, 0xE4, 0x25, 0x07, 0xD3, 0x28, 0x86, 0x05, 0x1E, 0xE4, 0xEA, 0x1A, + 0xB9, 0x09, 0x1E, 0xE4, 0xDC, 0x14, 0x1A, 0xE4, 0x76, 0x02, 0x1E, 0xE4, + 0x16, 0x07, 0x1E, 0xE4, 0x58, 0xF0, 0xDB, 0x28, 0x01, 0x22, 0x1E, 0xE4, + 0x83, 0x05, 0x0A, 0xE4, 0xCF, 0x05, 0x1E, 0xE4, 0x18, 0xE4, 0x3F, 0x44, + 0x16, 0xE0, 0x40, 0x28, 0x78, 0xF0, 0xEA, 0x13, 0x1E, 0xE4, 0xB9, 0x09, + 0x83, 0x05, 0x08, 0xE4, 0xE5, 0x0B, 0x1E, 0xE4, 0xF6, 0x01, 0x1E, 0xE4, + 0x4D, 0x05, 0x0E, 0xE4, 0x16, 0x07, 0x1E, 0xE4, 0x4D, 0x05, 0x04, 0xE4, + 0xBA, 0xF0, 0xBD, 0x28, 0x86, 0x3C, 0x02, 0xA2, 0x84, 0x3C, 0xFC, 0xA2, + 0x0D, 0x07, 0x1E, 0xE4, 0xB4, 0x3C, 0x02, 0xA2, 0x3A, 0x3C, 0x00, 0xA2, + 0x02, 0xA0, 0xA4, 0x28, 0x4D, 0x05, 0x0E, 0xE4, 0x77, 0x06, 0x1E, 0xE4, + 0x4D, 0x05, 0x08, 0xE4, 0x1E, 0xE4, 0x95, 0x06, 0x1E, 0xE4, 0x9A, 0xF0, + 0x0E, 0xE4, 0xD3, 0x3C, 0x00, 0xA2, 0x6A, 0x06, 0x84, 0x28, 0x01, 0x1B, + 0x1E, 0xE4, 0x13, 0x05, 0x04, 0xE4, 0x84, 0x28, 0x0D, 0x07, 0x14, 0xE4, + 0x1E, 0xE4, 0xC4, 0xF0, 0x84, 0x28, 0x4D, 0x05, 0x05, 0xE0, 0x06, 0xA2, + 0x9B, 0xF0, 0x26, 0x21, 0x84, 0x28, 0x7A, 0x21, 0x1E, 0xE4, 0x00, 0x03, + 0x7A, 0x22, 0x1E, 0xE4, 0xA2, 0x21, 0x1E, 0xE4, 0x48, 0xF1, 0xA5, 0x28, + 0x6A, 0x06, 0x1E, 0xE4, 0x1B, 0xE4, 0x84, 0x28, 0x40, 0x4E, 0x4E, 0x2A, + 0xDA, 0x1C, 0x18, 0xE4, 0x4E, 0x28, 0x57, 0x20, 0xD7, 0x3E, 0x84, 0x2A, + 0x38, 0xF0, 0xD6, 0x28, 0x7E, 0x28, 0x3A, 0x19, 0x1A, 0xE4, 0x40, 0x28, + 0x40, 0x28, 0xD3, 0x3C, 0x00, 0xA2, 0x82, 0x3C, 0x1E, 0xE4, 0xF4, 0x06, + 0x1E, 0xE4, 0x58, 0xF0, 0x00, 0xA2, 0xFC, 0x06, 0x1E, 0xE4, 0xF8, 0x06, + 0x02, 0xAA, 0x40, 0x28, 0x6C, 0x27, 0x1E, 0xE4, 0x1F, 0x07, 0x1E, 0xE4, + 0xCA, 0xF2, 0x3F, 0x44, 0x1E, 0xE4, 0x2B, 0x04, 0x1A, 0xE4, 0x98, 0xF1, + 0xC1, 0xE0, 0x48, 0x00, 0xC0, 0xE0, 0x09, 0x0C, 0xE7, 0xF0, 0x0F, 0xA1, + 0x45, 0xE0, 0x49, 0x00, 0x8A, 0xF1, 0x02, 0xA1, 0x80, 0x09, 0x1E, 0xE4, + 0x6A, 0xF0, 0x0A, 0xA1, 0x6A, 0xF1, 0x08, 0xA1, 0xEF, 0x09, 0x1E, 0xE4, + 0x4A, 0xF0, 0x02, 0xA1, 0x77, 0x00, 0xC2, 0xE0, 0x84, 0x28, 0x9E, 0xF6, + 0x73, 0x00, 0xC2, 0xE0, 0xEB, 0x08, 0x1E, 0xE4, 0x06, 0xA8, 0x06, 0xAF, + 0x45, 0x00, 0xC0, 0xE0, 0x0E, 0xE4, 0x55, 0x06, 0x1A, 0xE4, 0x04, 0xA1, + 0xA4, 0x28, 0x4A, 0x22, 0x1E, 0xE4, 0xB4, 0x04, 0x02, 0xA2, 0x5D, 0x05, + 0x0A, 0xE4, 0x02, 0xA0, 0x1E, 0xE4, 0xDC, 0x14, 0x1E, 0xE4, 0xB4, 0x3C, + 0x3E, 0x28, 0x3A, 0x3C, 0x00, 0xA2, 0x0D, 0x07, 0x3A, 0x44, 0xE5, 0x0B, + 0x1E, 0xE4, 0x84, 0x3C, 0x3E, 0x28, 0xA4, 0x3C, 0x3E, 0x28, 0x5A, 0xF0, + 0x4A, 0xF0, 0xF5, 0x0B, 0x1E, 0xE4, 0x84, 0x3C, 0x1E, 0xE4, 0xE9, 0x3C, + 0x7D, 0x1A, 0x1E, 0xE4, 0x56, 0x28, 0x74, 0xF0, 0x85, 0x3C, 0x6D, 0x19, + 0xFA, 0xA2, 0x38, 0xF0, 0x85, 0x18, 0x54, 0xF0, 0x84, 0x28, 0x56, 0x3C, + 0x85, 0x28, 0x85, 0x3C, 0x62, 0x22, 0x1E, 0xE4, 0x83, 0x3C, 0x24, 0xF0, + 0xEA, 0x1A, 0x1E, 0xE4, 0xC5, 0x07, 0x1E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, + 0x09, 0x0C, 0x1E, 0xE4, 0x4A, 0xCC, 0x00, 0xA2, 0x8E, 0xF4, 0x86, 0x3C, + 0x5A, 0x3C, 0x5B, 0x3C, 0x09, 0xC0, 0x4C, 0xCC, 0xAE, 0x3C, 0xBD, 0x3C, + 0x62, 0x3C, 0x00, 0xC0, 0xBC, 0x3C, 0x97, 0x3C, 0xA5, 0x3C, 0xB4, 0x3C, + 0x1A, 0xE4, 0xAD, 0x28, 0xA8, 0x3C, 0xA7, 0x3C, 0x1E, 0xE4, 0xF4, 0x06, + 0x1E, 0xE4, 0xEC, 0x06, 0x0C, 0xA2, 0xFC, 0x06, 0x1E, 0xE4, 0xF8, 0x06, + 0xFE, 0xA2, 0xB9, 0x3C, 0xBB, 0x3C, 0xBA, 0x3C, 0x40, 0x3C, 0x3F, 0x3C, + 0x09, 0xC0, 0xA4, 0x3C, 0x04, 0xA2, 0x00, 0xC0, 0x42, 0x3C, 0x41, 0x3C, + 0xFA, 0xA2, 0x84, 0x3C, 0xFC, 0xA2, 0xF0, 0x3C, 0x2E, 0xE4, 0x00, 0xA2, + 0x2E, 0xE4, 0x85, 0x3C, 0x00, 0x00, 0x52, 0xD1, 0x44, 0xCC, 0x00, 0xA2, + 0x03, 0x00, 0xE0, 0xD1, 0x00, 0x00, 0x30, 0xD1, 0xD0, 0x03, 0xFD, 0xD1, + 0xB0, 0x03, 0xFF, 0xD1, 0x20, 0x07, 0xFC, 0xD1, 0x24, 0x02, 0x99, 0xD1, + 0x00, 0x00, 0x4C, 0xD0, 0x00, 0x00, 0x3A, 0xD0, 0x00, 0x02, 0x4B, 0xD1, + 0x00, 0x00, 0x08, 0xD0, 0x1E, 0xE4, 0x2E, 0xE4, 0xCE, 0xCF, 0xB1, 0x28, + 0x1E, 0xE4, 0x9E, 0xF0, 0x2A, 0xF0, 0xE5, 0x0B, 0x84, 0x3E, 0xF5, 0xB7, + 0x84, 0x2A, 0x9D, 0x20, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x3A, 0xF0, + 0x2E, 0xE4, 0x62, 0x07, 0x1E, 0xE4, 0x2E, 0xE4, 0x11, 0xD1, 0x20, 0xCE, + 0x42, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0x80, 0x00, 0x12, 0xD1, 0x00, 0x00, + 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x13, 0x00, 0x02, 0xA2, 0x85, 0x0C, + 0x1E, 0xE4, 0x61, 0x00, 0x94, 0x0A, 0x1E, 0xE4, 0x8F, 0x0C, 0x1E, 0xE4, + 0x48, 0xF0, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE1, 0x1E, 0xE4, 0x3E, 0xF0, + 0x32, 0x1B, 0x1E, 0xE4, 0x40, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x63, 0x1B, + 0x05, 0xE0, 0x42, 0xE0, 0x17, 0xAE, 0x01, 0xA2, 0x20, 0xCE, 0x42, 0xE0, + 0x03, 0xAE, 0x00, 0x50, 0x00, 0x01, 0x12, 0xD1, 0x00, 0x08, 0x11, 0xD1, + 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x29, 0x3C, 0xFE, 0xA2, + 0x80, 0xE1, 0x2E, 0xE4, 0x1E, 0xE4, 0x51, 0x20, 0x1E, 0xE4, 0x10, 0x3C, + 0x21, 0x28, 0x0E, 0x1B, 0x1E, 0xE4, 0x45, 0x06, 0x2A, 0xF0, 0x04, 0xA1, + 0x16, 0x28, 0x5A, 0xF0, 0x81, 0x3C, 0x00, 0xA2, 0xE9, 0x3C, 0xEA, 0x28, + 0xE5, 0x3C, 0xE8, 0x3C, 0xE6, 0x3C, 0xE7, 0x3C, 0x16, 0x3D, 0x10, 0xC7, + 0xAB, 0x05, 0x66, 0xE1, 0x54, 0x00, 0x66, 0xE1, 0x18, 0x05, 0x67, 0xE1, + 0x02, 0xA1, 0x7F, 0x28, 0xB2, 0x3C, 0x00, 0xA2, 0x06, 0x9E, 0x3E, 0x06, + 0x84, 0xE1, 0x44, 0xCC, 0x17, 0x3D, 0x90, 0xB6, 0x02, 0xA8, 0xB2, 0x5C, + 0x90, 0xE1, 0xB2, 0x3C, 0x02, 0xA0, 0xB2, 0x28, 0xB7, 0x0C, 0x1E, 0xE4, + 0x60, 0x3C, 0x00, 0xA2, 0x00, 0xA2, 0x00, 0x02, 0x61, 0xE1, 0x2E, 0xE4, + 0x22, 0xD0, 0xB2, 0x3C, 0x11, 0x3D, 0x3F, 0xC7, 0x1E, 0xE4, 0x53, 0x06, + 0x84, 0xE1, 0x1F, 0x00, 0xB2, 0x3C, 0x02, 0xA0, 0xB2, 0x28, 0x57, 0x20, + 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0x04, 0x04, 0xE0, + 0x2A, 0xE4, 0x00, 0x04, 0xC3, 0xE0, 0x55, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, + 0xC0, 0xE0, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, 0x90, 0xE1, 0x00, 0x04, + 0x08, 0xE0, 0x5D, 0x00, 0x4F, 0x4E, 0xBC, 0x2A, 0x2E, 0xE4, 0xB8, 0xF7, + 0x3F, 0x2A, 0xB9, 0x3C, 0xA1, 0x28, 0xBC, 0x3E, 0xBA, 0x3C, 0x39, 0xF0, + 0x42, 0x2A, 0x6B, 0xF0, 0xA5, 0x28, 0x2E, 0xE4, 0xBB, 0x3C, 0x2E, 0xF0, + 0x1E, 0xE4, 0x78, 0xF1, 0x40, 0x28, 0xB8, 0xF1, 0xDD, 0x06, 0x1E, 0xE4, + 0x7A, 0xF0, 0xD8, 0x06, 0x0E, 0xF1, 0xF8, 0xF0, 0x4F, 0x28, 0x7A, 0xF0, + 0xD6, 0x28, 0x62, 0xF0, 0xE2, 0x06, 0x1E, 0xE4, 0x6E, 0xF0, 0x98, 0xF0, + 0x38, 0x28, 0xB8, 0xF0, 0x4E, 0x28, 0x36, 0xF0, 0xE2, 0x06, 0x1E, 0xE4, + 0x02, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x3A, 0xF0, 0x12, 0xE4, 0x84, 0x28, + 0xA5, 0x3C, 0x2E, 0xE4, 0x5E, 0x20, 0x12, 0xE4, 0x84, 0x28, 0x57, 0x20, + 0xFC, 0xA2, 0x67, 0x20, 0x12, 0xE4, 0x84, 0x28, 0xA9, 0x06, 0x1E, 0xE4, + 0x3E, 0x3C, 0x84, 0x3C, 0xB9, 0x09, 0x1E, 0xE4, 0xC5, 0x0B, 0x1E, 0xE4, + 0x8A, 0xF1, 0x15, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0x44, 0xF1, 0x08, 0xA1, + 0x9A, 0xF1, 0x02, 0xA1, 0x02, 0xA1, 0xDA, 0xF0, 0x02, 0xA1, 0x6A, 0xF1, + 0x02, 0xA1, 0x9A, 0xF0, 0x02, 0xA1, 0xBA, 0xF0, 0x02, 0xA1, 0x66, 0xF0, + 0x04, 0xA1, 0x7A, 0xF0, 0x2E, 0xE4, 0x52, 0xF0, 0x0E, 0xA1, 0x7A, 0xF0, + 0x1E, 0xE4, 0x2E, 0xE4, 0xE5, 0x0B, 0x1E, 0xE4, 0x0A, 0xAF, 0xA2, 0xCA, + 0x4E, 0xF6, 0xEF, 0x09, 0x1E, 0xE4, 0xB8, 0xF0, 0x4E, 0x18, 0x06, 0xA8, + 0x9B, 0x24, 0x1E, 0xE4, 0xCA, 0xF5, 0x27, 0x0A, 0x1E, 0xE4, 0x7A, 0xF5, + 0x94, 0x28, 0x9A, 0xF5, 0x2E, 0xE4, 0xC5, 0x0B, 0x1E, 0xE4, 0x0C, 0x0C, + 0x02, 0xA8, 0x04, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0x16, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA8, + 0x03, 0xA1, 0x07, 0xA8, 0x07, 0xAF, 0x65, 0x00, 0x2E, 0xE4, 0x36, 0xB6, + 0x03, 0xA1, 0xF6, 0xB7, 0x48, 0x00, 0xC0, 0xE0, 0xC5, 0x0B, 0x1E, 0xE4, + 0x8E, 0xF1, 0x34, 0x3C, 0x33, 0x34, 0x09, 0xC0, 0x4E, 0xF1, 0x34, 0x4C, + 0x33, 0x24, 0x09, 0xC0, 0x0E, 0xF1, 0x36, 0x3C, 0x35, 0x34, 0x09, 0xC0, + 0x48, 0x00, 0xC0, 0xE0, 0xC5, 0x0B, 0x1E, 0xE4, 0x8E, 0xF0, 0x38, 0x3C, + 0x37, 0x34, 0x09, 0xC0, 0x4E, 0xF0, 0x36, 0x4C, 0x35, 0x24, 0x09, 0xC0, + 0x00, 0xC0, 0x38, 0x4C, 0x37, 0x24, 0x09, 0xC0, 0xAD, 0x28, 0x0C, 0x0C, + 0x1E, 0xE4, 0x2E, 0xE4, 0xC2, 0xE0, 0xF4, 0x06, 0x1E, 0xE4, 0x2A, 0xE4, + 0x92, 0x21, 0x1E, 0xE4, 0x2E, 0xE4, 0x48, 0x00, 0xB4, 0x05, 0x1E, 0xE4, + 0x35, 0x21, 0x1E, 0xE4, 0xC0, 0xE0, 0x2E, 0xE4, 0x4D, 0x26, 0x1E, 0xE4, + 0x04, 0xA1, 0x06, 0xA8, 0x06, 0xAF, 0x45, 0x00, 0xB5, 0x34, 0x6B, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0xB7, 0x34, 0x6C, 0x00, 0xC0, 0xE0, 0xB6, 0x3C, + 0x08, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0xB8, 0x3C, 0x1E, 0xA8, 0x60, 0x00, + 0xC0, 0xE0, 0x88, 0x30, 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x87, 0x3C, + 0x00, 0x06, 0x67, 0xE1, 0x00, 0xA2, 0x8A, 0x3C, 0xC0, 0xE0, 0x01, 0xA2, + 0x17, 0x3D, 0x03, 0xC7, 0x7D, 0x17, 0x18, 0xE4, 0x40, 0xA8, 0x65, 0x00, + 0x1E, 0xE4, 0xA6, 0x3C, 0x88, 0x00, 0x04, 0xE0, 0xC0, 0xE0, 0x01, 0xC0, + 0x2E, 0xE4, 0x59, 0x03, 0xC0, 0xE0, 0x01, 0x3C, 0x00, 0x34, 0x60, 0x00, + 0x07, 0x3C, 0x06, 0x34, 0x14, 0xAE, 0x61, 0x00, 0x02, 0xAF, 0x62, 0x00, + 0xC0, 0xE0, 0x00, 0xC0, 0xAA, 0x3C, 0x3E, 0xA8, 0x02, 0xAF, 0x21, 0x30, + 0x02, 0xA8, 0x67, 0x00, 0xC0, 0xE0, 0x00, 0xA2, 0xB5, 0x03, 0x1E, 0xE4, + 0x2E, 0xE4, 0xB1, 0x3C, 0x42, 0x00, 0xC0, 0xE0, 0x4C, 0x01, 0x1E, 0xE4, + 0x12, 0xD1, 0x40, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, + 0x13, 0xD1, 0xC0, 0x00, 0x20, 0xCE, 0x00, 0x02, 0x00, 0xE0, 0xF9, 0xF7, + 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, + 0x03, 0x00, 0x13, 0xD1, 0x7A, 0x21, 0x1E, 0xE4, 0x01, 0xA2, 0x04, 0xA2, + 0xA1, 0x07, 0x0B, 0xE4, 0x26, 0x21, 0x1E, 0xE4, 0x80, 0x03, 0x00, 0xE0, + 0x42, 0x00, 0xC0, 0xE0, 0x12, 0xD1, 0x40, 0x06, 0x11, 0xD1, 0x20, 0xCE, + 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x20, 0xCE, 0x80, 0x01, + 0x00, 0xE0, 0xF9, 0xF7, 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, + 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x1E, 0xE4, 0x00, 0x03, + 0x05, 0xE0, 0x04, 0xA2, 0x51, 0x10, 0x1E, 0xE4, 0x00, 0xA2, 0x7A, 0x21, + 0x51, 0x10, 0x1E, 0xE4, 0x40, 0x00, 0x04, 0xE0, 0x26, 0x21, 0x1E, 0xE4, + 0x60, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x7F, 0x3C, 0x02, 0xAF, 0x2B, 0xF0, + 0x6E, 0x00, 0xC0, 0xE0, 0x66, 0x3C, 0x61, 0x00, 0xFD, 0x05, 0x67, 0xE1, + 0xF1, 0x01, 0x1E, 0xE4, 0x17, 0x3D, 0x17, 0x35, 0x62, 0x00, 0xC0, 0xE0, + 0xC0, 0xE0, 0x17, 0x3D, 0x63, 0x00, 0xC0, 0xE0, 0xAF, 0x3C, 0xE9, 0x3C, + 0x34, 0xF0, 0x6F, 0x00, 0x54, 0x24, 0x64, 0xF0, 0x84, 0x28, 0x2E, 0xE4, + 0x55, 0x3C, 0x54, 0x34, 0x02, 0xA0, 0x55, 0x4C, 0x02, 0xAE, 0x91, 0x4C, + 0x04, 0xAE, 0x61, 0x28, 0x09, 0xC0, 0x60, 0x00, 0xC2, 0xE0, 0x90, 0x4C, + 0x61, 0x00, 0xC2, 0xE0, 0x40, 0x4C, 0x3F, 0x20, 0xC2, 0xE0, 0x00, 0xC0, + 0x42, 0x4C, 0x41, 0x20, 0x27, 0x4C, 0x26, 0x24, 0x09, 0xC0, 0x62, 0x00, + 0x29, 0x4C, 0x28, 0x24, 0x67, 0x00, 0xC2, 0xE0, 0x2B, 0x4C, 0x2A, 0x24, + 0x68, 0x00, 0xC2, 0xE0, 0x1E, 0xE4, 0x00, 0xC0, 0x69, 0x00, 0xC2, 0xE0, + 0x40, 0x54, 0x16, 0xE0, 0x42, 0x28, 0x9B, 0x16, 0x1B, 0xE4, 0x23, 0x2A, + 0x00, 0x3C, 0x3F, 0x44, 0x28, 0x09, 0x19, 0xE4, 0x3F, 0x2A, 0x28, 0x09, + 0x6A, 0x00, 0xC2, 0xE0, 0x23, 0x4C, 0x02, 0xAE, 0xC2, 0xE0, 0x3C, 0x4C, + 0x3B, 0x20, 0x09, 0xC0, 0xC2, 0xE0, 0x3E, 0x4C, 0x3D, 0x20, 0x6B, 0x00, + 0x73, 0x4C, 0x72, 0x20, 0x00, 0xC0, 0x6E, 0x00, 0xDF, 0x14, 0x1E, 0xE4, + 0x6C, 0x00, 0xC2, 0xE0, 0xE9, 0x14, 0x1E, 0xE4, 0x7B, 0x00, 0xC2, 0xE0, + 0x58, 0x4C, 0x57, 0x20, 0x5F, 0x00, 0xC2, 0xE0, 0x54, 0x24, 0x6F, 0x00, + 0xC2, 0xE0, 0x08, 0xAE, 0x85, 0x28, 0x70, 0x00, 0xC2, 0xE0, 0x55, 0x4C, + 0x5B, 0x24, 0x09, 0xC0, 0x71, 0x00, 0xC2, 0xE0, 0x72, 0x00, 0xC2, 0xE0, + 0x00, 0xC0, 0x5A, 0x4C, 0x73, 0x00, 0xC2, 0xE0, 0xEB, 0x08, 0x1E, 0xE4, + 0x74, 0x00, 0xC2, 0xE0, 0xA8, 0x4C, 0xA7, 0x24, 0x56, 0xE0, 0x21, 0xAE, + 0xB4, 0x2A, 0x86, 0x28, 0xBD, 0x2A, 0x56, 0xE0, 0x23, 0xAE, 0xAE, 0x2A, + 0x76, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x29, 0xAE, 0x51, 0x00, 0xC2, 0xE0, + 0x04, 0x07, 0x1E, 0xE4, 0x52, 0x00, 0xC2, 0xE0, 0x08, 0x07, 0x1E, 0xE4, + 0x22, 0x2A, 0x77, 0x00, 0xC2, 0xE0, 0x84, 0x28, 0x11, 0x4D, 0x11, 0x21, + 0xE4, 0x05, 0x61, 0xE1, 0x78, 0x00, 0xC2, 0xE0, 0x02, 0xAE, 0x2B, 0xF0, + 0x02, 0xAE, 0x2B, 0xF0, 0x11, 0x4D, 0x11, 0x21, 0xC2, 0xE0, 0xB0, 0x28, + 0x79, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x26, 0x4C, 0x25, 0x20, 0x7A, 0x00, + 0x17, 0x21, 0xC7, 0x05, 0x67, 0xE1, 0x7C, 0x00, 0x17, 0x21, 0x7E, 0x00, + 0xC2, 0xE0, 0x17, 0x4D, 0x4A, 0xC8, 0x7D, 0x00, 0xC2, 0xE0, 0x17, 0x4D, + 0xC2, 0xE0, 0x56, 0xE0, 0x20, 0xAE, 0x4D, 0xC8, 0xDF, 0x14, 0x1E, 0xE4, + 0x2E, 0xE4, 0x53, 0x00, 0xE9, 0x14, 0x1E, 0xE4, 0x63, 0x00, 0xC2, 0xE0, + 0x1B, 0xE4, 0x23, 0x2A, 0x5F, 0x00, 0xC2, 0xE0, 0x28, 0x09, 0x19, 0xE4, + 0x3F, 0x2A, 0x28, 0x09, 0x64, 0x00, 0xC2, 0xE0, 0x23, 0x4C, 0x02, 0xAE, + 0x6D, 0x00, 0xC2, 0xE0, 0x28, 0x4C, 0x27, 0x20, 0x57, 0x20, 0x70, 0x00, + 0xC2, 0xE0, 0x86, 0x28, 0x71, 0x00, 0xC2, 0xE0, 0x08, 0xAE, 0x58, 0x4C, + 0x72, 0x00, 0xC2, 0xE0, 0x26, 0x4C, 0x25, 0x20, 0x04, 0xA1, 0x16, 0x28, + 0xCA, 0xF0, 0x21, 0x28, 0x06, 0xA0, 0xB3, 0x3C, 0xEB, 0x28, 0x9A, 0xF0, + 0xE9, 0x3C, 0xEA, 0x28, 0x73, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x06, 0xA0, + 0xEB, 0x28, 0x7E, 0xF0, 0xE9, 0x28, 0xE9, 0x3C, 0x00, 0xA2, 0x73, 0x00, + 0x09, 0xC0, 0x00, 0xA2, 0x74, 0x00, 0xC2, 0xE0, 0x48, 0x2A, 0x3F, 0x00, + 0x08, 0xE0, 0x47, 0x28, 0x12, 0xAE, 0x00, 0xC0, 0xFF, 0x01, 0x09, 0xE0, + 0x22, 0x2A, 0x75, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0xE4, 0x05, 0x61, 0xE1, 0x76, 0x00, 0xC2, 0xE0, 0x02, 0xAE, 0x2B, 0xF0, + 0x02, 0xAE, 0x2B, 0xF0, 0x11, 0x4D, 0x11, 0x21, 0x16, 0xE0, 0x86, 0x28, + 0x77, 0x00, 0xC2, 0xE0, 0x61, 0xE1, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, + 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xC7, 0x05, 0xC2, 0xE0, 0x11, 0x4D, + 0x11, 0x21, 0x7A, 0x00, 0x32, 0xAF, 0xDF, 0x14, 0x1E, 0xE4, 0x79, 0x00, + 0x09, 0xAE, 0x1B, 0xE0, 0x19, 0x2A, 0x02, 0xA8, 0x22, 0x2A, 0x56, 0xE0, + 0x05, 0xAE, 0x19, 0x4E, 0x08, 0xAE, 0x24, 0x2A, 0x56, 0xE0, 0x04, 0xAE, + 0x56, 0xE0, 0x04, 0xAE, 0x1D, 0x2A, 0x56, 0xE0, 0x56, 0xE0, 0x02, 0xAE, + 0x17, 0xE0, 0x1B, 0x2A, 0x11, 0x4C, 0x10, 0xAE, 0x1F, 0x4C, 0x10, 0xAE, + 0xA4, 0x28, 0x2E, 0xE4, 0x7B, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x3D, 0x2A, + 0x4A, 0xF0, 0x02, 0xA0, 0x40, 0x2A, 0x00, 0xA2, 0x92, 0xE0, 0x56, 0xB6, + 0xB9, 0x2A, 0x53, 0xF0, 0xA4, 0x2A, 0x79, 0xF0, 0x00, 0x2A, 0x2E, 0xF1, + 0x56, 0xE0, 0x0F, 0xA8, 0x07, 0xAE, 0x0F, 0xA8, 0xBA, 0x2A, 0x9B, 0xF0, + 0x56, 0xE0, 0x0F, 0xA8, 0xBB, 0x2A, 0x56, 0xE0, 0x07, 0xAE, 0x0F, 0xA8, + 0xBB, 0x2A, 0x8E, 0xF0, 0x56, 0xE0, 0x0F, 0xA8, 0xBA, 0x2A, 0x56, 0xE0, + 0x1B, 0xE4, 0x23, 0x2A, 0xA3, 0x28, 0x01, 0x3C, 0x28, 0x09, 0x19, 0xE4, + 0x3F, 0x2A, 0x28, 0x09, 0x00, 0x4C, 0x0C, 0xAE, 0x23, 0x4C, 0x02, 0xAE, + 0x3F, 0x4C, 0x02, 0xAE, 0x43, 0x4C, 0x04, 0xAE, 0x56, 0xE0, 0x21, 0xAE, + 0x83, 0xE0, 0x24, 0xAE, 0x3B, 0x2A, 0x56, 0xE0, 0x0D, 0xAE, 0xBC, 0x2A, + 0x2E, 0xE4, 0x01, 0x4C, 0x56, 0xE0, 0x0F, 0xAE, 0xF2, 0xF0, 0xA4, 0x28, + 0x2A, 0xE4, 0x3F, 0x28, 0x3D, 0x10, 0x3C, 0x4C, 0x3B, 0x20, 0x09, 0xC0, + 0x80, 0xB6, 0x4A, 0xF0, 0x00, 0xC0, 0x3E, 0x1C, 0x72, 0xB6, 0x00, 0x2A, + 0x2E, 0xE4, 0x6C, 0xB6, 0x48, 0xF0, 0x23, 0x28, 0x2E, 0xE4, 0x96, 0xB6, + 0xA3, 0x28, 0x2E, 0xE4, 0x42, 0x08, 0x02, 0xA2, 0x17, 0x89, 0x34, 0x00, + 0x17, 0x89, 0x2E, 0xE4, 0x17, 0x89, 0x35, 0x00, 0x17, 0x89, 0x33, 0x00, + 0x17, 0x89, 0x37, 0x00, 0x17, 0x89, 0x36, 0x00, 0x17, 0x21, 0x17, 0x81, + 0x17, 0x81, 0x38, 0x00, 0x17, 0x4D, 0x17, 0x21, 0x60, 0xCC, 0x17, 0x4D, + 0x64, 0xCC, 0x17, 0x4D, 0x17, 0x21, 0x62, 0xCC, 0x2E, 0xE4, 0x72, 0xCC, + 0x17, 0x4D, 0x17, 0x21, 0x33, 0x00, 0x17, 0x8B, 0x34, 0x00, 0x17, 0x8B, + 0x36, 0x00, 0x17, 0x8B, 0x35, 0x00, 0x17, 0x8B, 0x38, 0x00, 0x17, 0x8B, + 0x37, 0x00, 0x17, 0x8B, 0x17, 0x35, 0x60, 0xC8, 0x17, 0x81, 0x17, 0x81, + 0x17, 0x3D, 0x17, 0x35, 0x62, 0xC8, 0x17, 0x3D, 0x72, 0xC8, 0x17, 0x3D, + 0x17, 0x35, 0x64, 0xC8, 0x01, 0xC0, 0x2E, 0xE4, 0x17, 0x3D, 0x17, 0x35, + 0x13, 0x28, 0x01, 0xC0, 0x9E, 0xF0, 0x13, 0x3C, 0x3E, 0xF0, 0x14, 0x3C, + 0x01, 0xC0, 0x6E, 0xF0, 0x2E, 0xE4, 0x00, 0xC0, 0x14, 0x28, 0x01, 0xC0, + 0x00, 0xC0, 0x31, 0x4C, 0x30, 0x24, 0x01, 0xC0, 0x22, 0xE4, 0x46, 0xE0, + 0x73, 0xC8, 0x06, 0xAE, 0x33, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x6B, 0xE1, + 0x6E, 0xF0, 0x33, 0x28, 0x01, 0xC0, 0x9E, 0xF0, 0x01, 0xC0, 0x3E, 0xF0, + 0x11, 0x3C, 0x01, 0xC0, 0x48, 0xD1, 0x2E, 0xE4, 0x00, 0xC0, 0x11, 0x28, + 0x45, 0xD1, 0x00, 0x00, 0x44, 0xD1, 0x40, 0x00, 0x6B, 0xD1, 0x00, 0x00, + 0x68, 0xD1, 0x00, 0x00, 0x32, 0xA2, 0x00, 0x02, 0x4B, 0xD1, 0x00, 0x00, + 0x0C, 0x00, 0x4C, 0xD1, 0xC0, 0xCE, 0x18, 0xAE, 0x01, 0xC0, 0x2E, 0xE4, + 0xF8, 0xF7, 0x9A, 0xCA, 0x07, 0x0C, 0x06, 0x04, 0x01, 0x4C, 0x00, 0x24, + 0x2A, 0x20, 0x71, 0xD0, 0x09, 0x3C, 0x08, 0x34, 0xAA, 0xF0, 0x0C, 0x28, + 0x01, 0xC0, 0x81, 0xE1, 0xC0, 0xE0, 0x45, 0xE0, 0xFC, 0x0B, 0x1E, 0xE4, + 0x12, 0xB6, 0x02, 0xA8, 0x04, 0xAF, 0x45, 0x00, 0x02, 0x34, 0x48, 0x00, + 0xC0, 0xE0, 0x0C, 0x30, 0xC0, 0xE0, 0x03, 0x3C, 0x00, 0xFE, 0x08, 0xE0, + 0x0B, 0x3C, 0xFF, 0x01, 0x08, 0xE0, 0x48, 0x00, 0xFF, 0x00, 0x22, 0xD0, + 0x78, 0xCC, 0x00, 0xA2, 0x90, 0xE1, 0x7A, 0xCC, 0xD7, 0x09, 0x84, 0xE1, + 0xB3, 0x0A, 0x1E, 0xE4, 0x94, 0x0A, 0x1E, 0xE4, 0x00, 0xA2, 0x01, 0xC0, + 0x9B, 0x09, 0x1E, 0xE4, 0x12, 0xE4, 0x02, 0xA1, 0x0B, 0x28, 0x1A, 0x3C, + 0x1A, 0x3C, 0x02, 0xA2, 0x01, 0xC0, 0xF7, 0x09, 0x00, 0xA2, 0x00, 0xC0, + 0xAA, 0xCE, 0x00, 0xA2, 0xA0, 0xCA, 0x2E, 0xE4, 0xB7, 0x0C, 0x1E, 0xE4, + 0x9C, 0xCA, 0xF8, 0xF7, 0x9A, 0xCA, 0x90, 0xE1, 0x44, 0xCC, 0x2E, 0xE4, + 0xB3, 0x0A, 0x18, 0xE4, 0x18, 0xE4, 0x9C, 0xCA, 0x00, 0x0A, 0x84, 0xE1, + 0xF9, 0xF7, 0x9B, 0xCA, 0xA0, 0xCA, 0xB3, 0x0A, 0x00, 0x01, 0x04, 0xE0, + 0x2E, 0xE4, 0x90, 0xE1, 0x14, 0xE0, 0xFF, 0x00, 0x04, 0xE0, 0xB0, 0xCE, + 0x5E, 0xD1, 0x00, 0x00, 0x5D, 0xD1, 0xB8, 0xCE, 0x32, 0xA2, 0x00, 0x00, + 0x5F, 0xD1, 0x00, 0x00, 0xC0, 0xCE, 0x20, 0x06, 0x0A, 0xE0, 0x18, 0xAE, + 0x00, 0x00, 0x4A, 0xD1, 0x00, 0x00, 0x57, 0xD1, 0x18, 0xE4, 0x9C, 0xCA, + 0x03, 0x00, 0x4C, 0xD1, 0xAE, 0xCA, 0xC8, 0xF7, 0x9A, 0xCA, 0xB3, 0x0A, + 0x18, 0xE4, 0x9C, 0xCA, 0x3A, 0xF7, 0x02, 0xA8, 0x06, 0xA2, 0x2E, 0xE4, + 0x00, 0xA2, 0xB3, 0x0A, 0x80, 0x09, 0x1E, 0xE4, 0xF7, 0x09, 0x1E, 0xE4, + 0xDA, 0xF1, 0xD6, 0x3C, 0x16, 0xE0, 0x28, 0xA1, 0x00, 0xA2, 0x28, 0xF2, + 0xE5, 0x0B, 0x1E, 0xE4, 0x77, 0x09, 0x1E, 0xE4, 0xF7, 0x09, 0x1E, 0xE4, + 0x7A, 0x09, 0x1E, 0xE4, 0x38, 0xF1, 0x0E, 0xAF, 0x4F, 0x3C, 0x16, 0xE0, + 0x02, 0xA8, 0x0C, 0xAF, 0x00, 0xA2, 0x28, 0xF1, 0xE5, 0x0B, 0x1E, 0xE4, + 0xE5, 0x0B, 0x1E, 0xE4, 0xF7, 0x09, 0x1E, 0xE4, 0xF7, 0x09, 0x1E, 0xE4, + 0x00, 0xA2, 0xC8, 0xF0, 0x30, 0x20, 0x01, 0xC0, 0x56, 0x0A, 0x1E, 0xE4, + 0x2E, 0xE4, 0x1A, 0xE0, 0x00, 0xC0, 0x31, 0x4C, 0x00, 0xA2, 0x01, 0xC0, + 0x2E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x33, 0x3C, 0x31, 0x3C, 0x30, 0x3C, + 0x94, 0x0A, 0x1E, 0xE4, 0x01, 0xC0, 0x64, 0x0A, 0x2E, 0xE4, 0x00, 0xC0, + 0x28, 0xE1, 0x01, 0xC0, 0x00, 0xC0, 0x11, 0x44, 0x33, 0x28, 0x01, 0xC0, + 0x00, 0x00, 0x4A, 0xD1, 0x92, 0xCE, 0x0E, 0xAE, 0xFF, 0x01, 0x04, 0xE0, + 0x00, 0x00, 0x58, 0xD1, 0x00, 0x00, 0x5D, 0xD1, 0xB8, 0xCE, 0x14, 0xE0, + 0x00, 0x00, 0x5F, 0xD1, 0x00, 0x00, 0x5E, 0xD1, 0x18, 0xAE, 0x32, 0xA2, + 0x03, 0x00, 0x61, 0xD1, 0x4C, 0xD1, 0xC0, 0xCE, 0x38, 0x06, 0x0A, 0xE0, + 0xB3, 0x0A, 0x18, 0xE4, 0x9C, 0xCA, 0x03, 0x00, 0xA8, 0xF7, 0x9C, 0xCA, + 0xC8, 0xF7, 0x9A, 0xCA, 0x92, 0xCC, 0x32, 0x3C, 0x01, 0xC0, 0x9E, 0xCA, + 0x30, 0x34, 0x31, 0x0C, 0x30, 0x00, 0x94, 0xCA, 0x2E, 0xE4, 0x00, 0xC0, + 0x90, 0xCC, 0x31, 0x3C, 0x9E, 0xCC, 0x20, 0xAE, 0x95, 0x14, 0x04, 0xE0, + 0x00, 0x00, 0x34, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x00, 0x00, 0x35, 0xD0, + 0x00, 0x00, 0x33, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0x7F, 0x00, 0x36, 0xD0, + 0x00, 0x00, 0x39, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, 0x4C, 0xD0, + 0x01, 0x00, 0x4B, 0xD0, 0x00, 0x00, 0x47, 0xD0, 0x00, 0x00, 0x46, 0xD0, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0x00, 0x49, 0xD1, 0x5E, 0x02, 0x1E, 0xE4, + 0x3A, 0xF2, 0x0C, 0x28, 0x50, 0xCE, 0x40, 0x04, 0x04, 0xE0, 0x01, 0xC0, + 0x12, 0xE0, 0x08, 0xA1, 0x06, 0xA8, 0x0D, 0x28, 0x04, 0xE0, 0x40, 0x3C, + 0x06, 0xAE, 0x06, 0xA8, 0x50, 0xCA, 0x52, 0xCE, 0x40, 0x58, 0x0B, 0x01, + 0x65, 0x02, 0x1E, 0xE4, 0xE8, 0xF7, 0x04, 0xA8, 0x44, 0xD1, 0x00, 0x00, + 0x4E, 0xD1, 0x01, 0xC0, 0x00, 0xE0, 0x03, 0x4C, 0x02, 0x24, 0x00, 0x00, + 0x5E, 0xF3, 0x03, 0x3C, 0x02, 0x34, 0x00, 0x02, 0x1A, 0xE4, 0x0C, 0x28, + 0x00, 0x00, 0x27, 0xD0, 0x01, 0x00, 0x27, 0xD0, 0x01, 0xC0, 0x1A, 0x0B, + 0x02, 0xA8, 0x48, 0xCA, 0x1A, 0xF2, 0x0D, 0x28, 0x40, 0xCE, 0x03, 0x4C, + 0x02, 0x24, 0xE8, 0xF7, 0x40, 0x00, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, + 0x02, 0xAE, 0x06, 0xA8, 0x43, 0x00, 0xC0, 0xE0, 0x02, 0xA8, 0x48, 0xCA, + 0x46, 0xCE, 0x32, 0xA0, 0x02, 0x04, 0x00, 0x02, 0x04, 0xE0, 0xE8, 0xF7, + 0x08, 0x14, 0x03, 0x3C, 0x02, 0x34, 0x03, 0x0C, 0x01, 0x4C, 0x00, 0x24, + 0x54, 0xF0, 0x09, 0x1C, 0x18, 0xE4, 0x0C, 0x28, 0x03, 0x3C, 0x02, 0x34, + 0x01, 0xC0, 0xC5, 0x0B, 0x1E, 0xE4, 0x6D, 0x0B, 0x00, 0x00, 0x44, 0xD1, + 0x00, 0x00, 0x4E, 0xD1, 0x59, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0x00, 0xE0, 0x36, 0xB6, 0x00, 0xA2, 0x03, 0xA1, 0x52, 0xE0, 0x45, 0x00, + 0xC1, 0xE0, 0x1C, 0x00, 0x00, 0xA2, 0x01, 0xC0, 0x2E, 0xE4, 0x1A, 0xE0, + 0x0D, 0x3C, 0x00, 0x02, 0x04, 0xE0, 0x0A, 0x3C, 0xD8, 0xF3, 0x08, 0xA8, + 0x43, 0x00, 0xC0, 0xE0, 0x0C, 0x3C, 0x01, 0xC0, 0x0E, 0x0B, 0x1E, 0xE4, + 0x49, 0x00, 0xC1, 0xE0, 0x03, 0x4C, 0x02, 0x24, 0x05, 0x4E, 0x04, 0x26, + 0x05, 0x3E, 0x04, 0x36, 0x07, 0x0E, 0x06, 0x06, 0x33, 0xF0, 0x45, 0xE0, + 0x02, 0xB6, 0x0C, 0x28, 0x00, 0x02, 0x03, 0xE0, 0x00, 0x02, 0x01, 0xE0, + 0x73, 0xF2, 0x0C, 0x3C, 0x5D, 0x00, 0xC1, 0xE0, 0x0C, 0x28, 0x0D, 0x3E, + 0xD8, 0xF1, 0x52, 0xE0, 0x17, 0xE0, 0x1B, 0xE0, 0x1E, 0xE4, 0x24, 0x0B, + 0x08, 0xE4, 0x0A, 0x28, 0x5C, 0x00, 0xC0, 0xE0, 0x01, 0xC0, 0xCA, 0x01, + 0x24, 0x0B, 0x0A, 0xE4, 0x00, 0x40, 0x08, 0xE0, 0x00, 0x20, 0x08, 0xE0, + 0x5D, 0x00, 0xC0, 0xE0, 0x0A, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0xC8, 0xF7, + 0x02, 0xA2, 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x40, 0x24, 0x0B, 0x0E, 0xE4, + 0x0A, 0x3C, 0x00, 0xCE, 0x04, 0xE0, 0x39, 0xF0, 0x0C, 0x2A, 0x0D, 0x28, + 0xC1, 0xE0, 0x00, 0xC0, 0x0D, 0x3C, 0x00, 0x02, 0xC9, 0xF7, 0x00, 0x40, + 0x09, 0xE0, 0x5D, 0x00, 0x5E, 0x02, 0x1E, 0xE4, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0x02, 0x02, 0xE0, 0x0D, 0x28, 0x01, 0xC0, 0x06, 0xA8, 0x0D, 0x28, + 0xB9, 0x0B, 0x0A, 0xE4, 0x06, 0xAE, 0x12, 0xE0, 0x08, 0xA1, 0x6A, 0xF2, + 0x20, 0xAE, 0x04, 0xAF, 0x0D, 0x28, 0x40, 0x3C, 0x90, 0xE1, 0x50, 0xCE, + 0xC0, 0x01, 0x00, 0xE0, 0xE8, 0xF7, 0x04, 0xA8, 0x50, 0xCA, 0x52, 0xCA, + 0x0D, 0x2A, 0x40, 0x58, 0x40, 0x5C, 0x52, 0xCA, 0x05, 0xE0, 0x40, 0x3E, + 0x07, 0xAE, 0x07, 0xA8, 0x0D, 0x2A, 0x56, 0xE0, 0x40, 0x5E, 0x0B, 0x01, + 0x40, 0x01, 0x01, 0xE0, 0x21, 0xAE, 0x05, 0xAF, 0x50, 0xCA, 0x52, 0xCE, + 0x90, 0xE1, 0x51, 0xCE, 0xFC, 0x01, 0x04, 0xE0, 0xE8, 0xF7, 0x04, 0xA8, + 0x01, 0xC0, 0x7E, 0xF1, 0x22, 0xF0, 0x0D, 0x18, 0x20, 0xAE, 0x04, 0xAF, + 0x06, 0xA0, 0x0D, 0x28, 0x0D, 0x28, 0x50, 0xCE, 0x40, 0x04, 0x00, 0xE0, + 0x06, 0xA8, 0x12, 0xE0, 0x08, 0xA1, 0x06, 0xA8, 0x0B, 0x01, 0x04, 0xE0, + 0x40, 0x3C, 0x06, 0xAE, 0x04, 0xA8, 0x50, 0xCA, 0x52, 0xCE, 0x40, 0x58, + 0x65, 0x02, 0x0E, 0xE4, 0x00, 0xC0, 0xE8, 0xF7, 0xC0, 0xE0, 0x01, 0xC0, + 0xC5, 0x0B, 0x1E, 0xE4, 0x00, 0xC0, 0x18, 0x3C, 0x17, 0x34, 0x48, 0x00, + 0x1A, 0x2A, 0xAA, 0xCA, 0x01, 0xC0, 0x2E, 0xE4, 0xAA, 0xCE, 0x00, 0xA2, + 0x4E, 0xF8, 0x16, 0xB6, 0xC0, 0xE0, 0x40, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, + 0x0E, 0x24, 0x0F, 0x3C, 0x0E, 0x34, 0x48, 0x00, 0x00, 0x16, 0x49, 0xE0, + 0x40, 0x08, 0x0F, 0x4C, 0x07, 0x0C, 0x06, 0x04, 0x33, 0xF0, 0x01, 0x1E, + 0x35, 0xF0, 0x09, 0x1E, 0x08, 0x16, 0x49, 0xE0, 0x48, 0x00, 0xC2, 0xE0, + 0x07, 0x1C, 0x06, 0x14, 0xCA, 0xF0, 0x0C, 0x28, 0x01, 0xC0, 0xFE, 0xF0, + 0x1E, 0xE4, 0x01, 0xC0, 0xC5, 0x0B, 0x1E, 0xE4, 0x26, 0xB6, 0x00, 0xA2, + 0x45, 0xE0, 0xFC, 0x0B, 0x00, 0xC0, 0x06, 0xB6, 0x00, 0x02, 0x03, 0xE0, + 0xC0, 0xE0, 0x2A, 0xE4, 0x0E, 0xFF, 0x2E, 0xE4, 0x2E, 0xE4, 0x02, 0xA8, + 0x04, 0xAF, 0x45, 0x00, 0x0F, 0x3C, 0x0E, 0x34, 0x49, 0x00, 0xC0, 0xE0, + 0x48, 0x00, 0xC1, 0xE0, 0x0F, 0x4C, 0x0E, 0x24, 0x0F, 0x4E, 0x0E, 0x26, + 0x0F, 0x3E, 0x0E, 0x36, 0x2E, 0xE4, 0xC5, 0x0B, 0x1E, 0xE4, 0x2E, 0xE4, + 0x17, 0x24, 0x01, 0xC0, 0xAA, 0xCE, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, + 0x00, 0xC0, 0x18, 0x4C, 0x1E, 0xE4, 0x02, 0x0A, 0x1E, 0xE4, 0x2E, 0xE4, + 0xBC, 0x0B, 0x1E, 0xE4, 0x18, 0xF1, 0xE5, 0x0B, 0x80, 0x00, 0x08, 0xE0, + 0x49, 0xE0, 0xA2, 0xCA, 0x59, 0xF0, 0x11, 0xB6, 0x1F, 0x00, 0x09, 0xE0, + 0xEE, 0xF6, 0xF7, 0x09, 0x1E, 0xE4, 0x04, 0xA2, 0x0B, 0x01, 0x04, 0xE0, + 0x3E, 0xF0, 0xA2, 0xCA, 0x77, 0x09, 0x1E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, + 0x1E, 0xE4, 0x3E, 0xA8, 0x7A, 0x09, 0x1E, 0xE4, 0x0A, 0xAF, 0x7A, 0x09, + 0x1E, 0xE4, 0x7D, 0x09, 0x80, 0x09, 0x1E, 0xE4, 0x4E, 0x3C, 0x06, 0xA8, + 0x1E, 0xE4, 0x4F, 0x3C, 0x16, 0xE0, 0x0A, 0xA1, 0x32, 0x28, 0x01, 0xC0, + 0x2E, 0xE4, 0x80, 0x09, 0xE8, 0xF1, 0x11, 0xA0, 0x73, 0xC8, 0x16, 0xE0, + 0x46, 0xE0, 0x31, 0x28, 0x30, 0x24, 0x07, 0xAF, 0x61, 0xE1, 0x01, 0xC0, + 0xAE, 0xF0, 0xFA, 0xF0, 0x11, 0xA0, 0x73, 0xC8, 0x01, 0x29, 0x01, 0x06, + 0x49, 0xE0, 0x5A, 0xF0, 0x46, 0xE0, 0x07, 0xAF, 0x68, 0xC8, 0xBE, 0xF0, + 0x0E, 0xB6, 0x22, 0xB6, 0x35, 0x3C, 0x10, 0xA2, 0x28, 0xF0, 0x0E, 0xA8, + 0x03, 0xAF, 0x35, 0x5A, 0x03, 0xA2, 0x35, 0x78, 0x4E, 0x28, 0x2E, 0xE4, + 0x00, 0xC0, 0x46, 0xE0, 0x01, 0xC0, 0x96, 0x3E, 0x95, 0x3C, 0x4F, 0x2A, + 0x37, 0x3E, 0x36, 0x3C, 0x32, 0x2A, 0x31, 0x28, 0x96, 0x2A, 0x95, 0x28, + 0x2E, 0xE4, 0x00, 0xC0, 0x36, 0x28, 0x01, 0xC0, 0x4F, 0x3E, 0x4E, 0x3C, + 0x90, 0xCC, 0x32, 0x3E, 0x31, 0x3C, 0x37, 0x2A, 0x33, 0x3C, 0x30, 0x3C, + 0x00, 0xA2, 0x93, 0xCC, 0x28, 0xE1, 0x94, 0x0A, 0x1E, 0xE4, 0x00, 0xC0, + 0x31, 0x3C, 0x30, 0x34, 0x01, 0xC0, 0x2E, 0xE4, 0x30, 0x24, 0x01, 0xC0, + 0x2E, 0xE4, 0x00, 0xC0, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x31, 0x4C, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x32, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0xC0, 0x32, 0x28, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x10, 0x3C, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x10, 0x28, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0xC0, 0x38, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x38, 0x28, + 0x20, 0x01, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x21, 0x3C, 0x20, 0x34, + 0x42, 0xE0, 0x11, 0xAE, 0x20, 0x24, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, + 0x63, 0x3C, 0x2E, 0xE4, 0x00, 0xC0, 0x21, 0x4C, 0xC3, 0x0C, 0x1E, 0xE4, + 0x64, 0x3C, 0x8E, 0xE0, 0x9E, 0xE0, 0x64, 0x28, 0xCB, 0x0C, 0x1E, 0xE4, + 0x60, 0x28, 0x2E, 0xE4, 0x60, 0x3C, 0x63, 0x28, 0x9E, 0xE0, 0x38, 0x05, + 0x00, 0xE0, 0x08, 0xAE, 0x63, 0x28, 0x2E, 0xE4, 0x5C, 0x09, 0x1E, 0xE4, + 0x9E, 0xE0, 0x38, 0x05, 0x00, 0xE0, 0x08, 0xAE, 0x60, 0x28, 0x2E, 0xE4, + 0x41, 0x09, 0x1E, 0xE4, 0x93, 0x0C, 0x1E, 0xE4, 0xD9, 0x1B, 0x08, 0xE4, + 0x68, 0xF0, 0x91, 0x09, 0x1E, 0xE4, 0xB8, 0xF1, 0x00, 0x00, 0x4C, 0xD0, + 0x64, 0x0A, 0x1E, 0xE4, 0x1E, 0xE4, 0x5A, 0xF0, 0x96, 0xC8, 0x70, 0xE4, + 0x1E, 0xE4, 0x00, 0x00, 0x4C, 0xD0, 0xF6, 0x0C, 0x15, 0xB6, 0x80, 0x00, + 0x05, 0xE0, 0x97, 0x09, 0x02, 0xA2, 0x01, 0x00, 0x4B, 0xD0, 0x6F, 0xCC, + 0x4C, 0xD0, 0x70, 0xE4, 0x97, 0x0C, 0x1E, 0xE4, 0x00, 0xA2, 0x01, 0xC0, + 0x70, 0xE4, 0x00, 0x00, 0x01, 0xC0, 0x64, 0x0A, 0x1E, 0xE4, 0x10, 0x3C, + 0x16, 0xE0, 0x11, 0x28, 0x96, 0xCC, 0x32, 0x28, 0x0C, 0xBA, 0x2E, 0xE4, + 0x00, 0xC0, 0x11, 0x3C, 0xFC, 0xBC, 0x2E, 0xE4, 0x4A, 0xF8, 0x38, 0xF0, + 0x9D, 0x3C, 0x0C, 0xA2, 0x4C, 0xBA, 0x2E, 0xE4, 0x40, 0xA1, 0x9D, 0x3C, + 0x02, 0xA0, 0x9D, 0x28, 0x9D, 0x58, 0xAA, 0xF7, 0x40, 0xBA, 0xD2, 0xF0, + 0x9D, 0x28, 0xAC, 0x3C, 0xAB, 0x34, 0x02, 0xA1, 0xAC, 0x0C, 0xAB, 0x00, + 0x2F, 0x0D, 0x1E, 0xE4, 0x0C, 0xBA, 0x2E, 0xE4, 0x6B, 0xE1, 0x2E, 0xE4, + 0xAC, 0x3C, 0x2D, 0xE4, 0x8A, 0xFE, 0xD8, 0xF0, 0x02, 0xAF, 0x02, 0xA0, + 0x00, 0x00, 0xAC, 0x8C, 0x6A, 0xE1, 0x12, 0xE0, 0x2C, 0xE4, 0x12, 0xE0, + 0x20, 0xA1, 0x2E, 0xE4, 0x7E, 0xBE, 0x2E, 0xE4, 0x9E, 0x74, 0x9E, 0x3C, + 0x20, 0xA0, 0x50, 0xF0, 0x9E, 0x58, 0x5E, 0xBA, 0x9E, 0x3C, 0x2E, 0xE4, + 0x40, 0xBA, 0x2E, 0xE4, 0x56, 0xE0, 0x9E, 0x76, 0x00, 0x3C, 0x0E, 0xA8, + 0x68, 0xC8, 0x2A, 0xE4, 0x16, 0xE0, 0x00, 0x74, 0x28, 0xE4, 0x16, 0xE0, + 0x2F, 0x28, 0x03, 0xA1, 0x38, 0x2A, 0x2E, 0xE4, 0xF4, 0xB7, 0x30, 0x28, + 0x2B, 0xF0, 0x25, 0xE4, 0x24, 0xE4, 0x04, 0xA1, 0x5E, 0x3C, 0x02, 0xA0, + 0x2E, 0xE4, 0x5F, 0x3C, 0x5A, 0xA2, 0x4A, 0xF0, 0x22, 0x28, 0x2D, 0xE4, + 0x00, 0x3C, 0x0E, 0xBC, 0x2D, 0xE4, 0x01, 0x3C, 0x0E, 0xBC, 0x2A, 0xF0, + 0x5F, 0x3C, 0x00, 0x4C, 0x06, 0xAE, 0x01, 0x28, 0x20, 0x07, 0x64, 0xE1, + 0x28, 0x07, 0x61, 0xE1, 0xAA, 0x0D, 0x1E, 0xE4, 0x22, 0x00, 0x48, 0x88, + 0x0D, 0x3E, 0x48, 0x2A, 0x3C, 0xA2, 0x2D, 0xE4, 0x61, 0xE1, 0x0F, 0x3C, + 0x86, 0xF0, 0x46, 0xE0, 0x1E, 0xE4, 0x28, 0x07, 0x64, 0xE1, 0x28, 0x07, + 0x28, 0xE4, 0x04, 0xA1, 0x38, 0x28, 0x8F, 0x0D, 0x24, 0x07, 0x64, 0xE1, + 0x88, 0x07, 0x61, 0xE1, 0xAA, 0x0D, 0x1E, 0xE4, 0x22, 0x00, 0x49, 0x88, + 0x65, 0xE1, 0x0D, 0x3E, 0x49, 0x2A, 0x3C, 0xA2, 0x0F, 0x3C, 0x86, 0xF0, + 0x46, 0xE0, 0x49, 0x00, 0x88, 0x07, 0x64, 0xE1, 0x88, 0x07, 0x61, 0xE1, + 0x06, 0xA2, 0x2E, 0xE4, 0x8F, 0x0D, 0x1E, 0xE4, 0x41, 0xA0, 0x83, 0xE0, + 0x4E, 0xF0, 0x94, 0xE0, 0x0D, 0x08, 0x88, 0xE0, 0x01, 0x2B, 0x93, 0xE0, + 0x14, 0x3F, 0x0F, 0x86, 0x98, 0xE0, 0x02, 0xA0, 0x38, 0xF7, 0x94, 0xE0, + 0x02, 0xA1, 0x84, 0xE0, 0x03, 0x44, 0x80, 0x00, 0xC6, 0xE0, 0x2E, 0xE4, + 0x03, 0x46, 0x80, 0x00, 0xC7, 0xE0, 0x10, 0xAE, 0x40, 0xA0, 0x82, 0xE0, + 0x2E, 0xE4, 0x56, 0xE0, 0x04, 0xE0, 0x96, 0xE0, 0x40, 0xA0, 0x94, 0xE0, + 0x05, 0x3C, 0x00, 0xA2, 0x03, 0x3C, 0xFF, 0x00, 0x09, 0x3C, 0x08, 0x3C, + 0x07, 0x3C, 0x06, 0x3C, 0x5A, 0xF0, 0x40, 0xBA, 0xE4, 0x0D, 0x84, 0xE1, + 0xCE, 0xF0, 0x11, 0x3D, 0xA1, 0x0D, 0x1E, 0xE4, 0x11, 0x3D, 0x10, 0xAE, + 0x00, 0x58, 0x02, 0xA2, 0x05, 0x58, 0x02, 0xA2, 0x07, 0x4E, 0x06, 0x22, + 0x22, 0x28, 0x07, 0x3C, 0x06, 0x34, 0x56, 0xE0, 0x1E, 0xE4, 0x8A, 0xF0, + 0x40, 0xBA, 0x6A, 0xF1, 0xA1, 0x0D, 0x1E, 0xE4, 0x12, 0x3D, 0xA1, 0x0D, + 0x01, 0x58, 0x02, 0xA2, 0xDE, 0xF0, 0x13, 0x3D, 0x08, 0x22, 0x13, 0x3D, + 0x12, 0x3D, 0x10, 0xAE, 0x56, 0xE0, 0x05, 0x58, 0x02, 0xA2, 0x09, 0x4E, + 0x02, 0xA0, 0x05, 0x28, 0x09, 0x3C, 0x08, 0x34, 0x1E, 0xE4, 0x07, 0x4C, + 0x06, 0x20, 0x05, 0x3C, 0x14, 0xE0, 0x09, 0x4C, 0x08, 0x20, 0xEB, 0x0D, + 0xC4, 0xE0, 0x2E, 0xE4, 0x14, 0x3D, 0x14, 0x35, 0x09, 0xC0, 0xFE, 0x0E, + 0x0D, 0xE4, 0xFF, 0xFF, 0x38, 0xF0, 0x00, 0xC0, 0x58, 0x3C, 0x59, 0x34, + 0x6E, 0x03, 0x1E, 0xE4, 0xA1, 0x3C, 0xFE, 0xA2, 0x58, 0x4C, 0x59, 0x24, + 0x09, 0xC0, 0x98, 0xF0, 0x08, 0xE4, 0x51, 0x44, 0x1A, 0xE0, 0x00, 0xC0, + 0xFE, 0x0E, 0x0D, 0xE4, 0x12, 0xBC, 0xFE, 0x0E, 0x00, 0xE4, 0x04, 0xA1, + 0xA8, 0xB4, 0x0A, 0xA1, 0x38, 0x3C, 0x06, 0xA0, 0xB4, 0xB7, 0xFE, 0x0E, + 0x0D, 0xE4, 0xFE, 0xBD, 0xA1, 0x3C, 0xA1, 0x60, 0x49, 0xE0, 0x9B, 0xF0, + 0x51, 0x2A, 0xFE, 0x0E, 0x1E, 0xE4, 0x29, 0x3E, 0x6A, 0xF0, 0x29, 0x18, + 0x13, 0x74, 0xFE, 0x0E, 0x0A, 0xE4, 0xA1, 0x1B, 0x42, 0x3C, 0x3F, 0x3C, + 0x00, 0xA2, 0x39, 0x3C, 0x3F, 0x3C, 0x40, 0xBA, 0x68, 0xF0, 0x1B, 0x28, + 0x51, 0x28, 0x42, 0x3C, 0x40, 0xBA, 0x3A, 0xF0, 0x56, 0x4C, 0x57, 0x24, + 0x09, 0xC0, 0xAA, 0xF3, 0x44, 0x3C, 0x52, 0x34, 0x3F, 0x5C, 0x00, 0xC0, + 0x8A, 0xF0, 0x3A, 0x28, 0x40, 0x3C, 0x00, 0xA2, 0xA8, 0xF1, 0x40, 0x3C, + 0x08, 0x0F, 0x1E, 0xE4, 0x3F, 0x28, 0x9E, 0xF1, 0xA4, 0x3C, 0x3E, 0x28, + 0x3B, 0x3C, 0x1A, 0xE0, 0x4E, 0x28, 0x3A, 0x3C, 0x3D, 0x3C, 0x42, 0x28, + 0x3C, 0x3C, 0x39, 0x28, 0x08, 0xA8, 0xAA, 0x28, 0x3E, 0x3C, 0xFC, 0xA2, + 0x50, 0x28, 0x98, 0xF0, 0x4E, 0x28, 0xB8, 0xF0, 0xBE, 0x3C, 0x02, 0xA2, + 0x6A, 0xF0, 0x39, 0x1C, 0x09, 0xC0, 0x3A, 0x3C, 0x00, 0xA2, 0x3E, 0xF0, + 0x38, 0xF0, 0x00, 0xC0, 0x58, 0x2C, 0x59, 0x24, 0x16, 0xE0, 0x3F, 0x28, + 0x18, 0xF0, 0x40, 0x28, 0x42, 0x08, 0x3F, 0x28, 0x43, 0x3C, 0x1C, 0x44, + 0x6A, 0xF0, 0x4F, 0x28, 0x41, 0x3C, 0x74, 0xB6, 0xFE, 0x0E, 0x0D, 0xE4, + 0x03, 0x0D, 0x1E, 0xE4, 0x35, 0x28, 0xD6, 0x18, 0x1E, 0xE4, 0x45, 0x3C, + 0x0D, 0xE4, 0x03, 0x0D, 0x1E, 0xE4, 0x7A, 0xF0, 0x38, 0x28, 0xFE, 0x0E, + 0x08, 0xE4, 0xFE, 0x0E, 0x46, 0x3C, 0x40, 0xBA, 0x38, 0xF0, 0x04, 0xA1, + 0x49, 0x3C, 0x2E, 0x28, 0x48, 0x3C, 0x2C, 0x28, 0xCA, 0xF0, 0x40, 0xBA, + 0xEA, 0xF0, 0x38, 0x28, 0xFE, 0x0E, 0x0D, 0xE4, 0x48, 0x3C, 0x3E, 0xBC, + 0x3E, 0xBC, 0x58, 0xF0, 0x04, 0xA1, 0x38, 0x28, 0x51, 0x28, 0xFE, 0x0E, + 0x0D, 0xE4, 0x49, 0x3C, 0x3A, 0xF0, 0x4F, 0x44, 0xD6, 0x28, 0xAA, 0xF0, + 0x82, 0x1C, 0x1E, 0xE4, 0xC8, 0x1C, 0x1E, 0xE4, 0x16, 0xE0, 0x38, 0x28, + 0x24, 0x0F, 0x1E, 0xE4, 0xFE, 0x0E, 0x0A, 0xE4, 0x2B, 0x0F, 0x1A, 0xE4, + 0xFE, 0x0E, 0x0D, 0xE4, 0x45, 0x0D, 0x1E, 0xE4, 0xA2, 0x17, 0x1E, 0xE4, + 0x6A, 0xF0, 0x51, 0x28, 0x4E, 0x28, 0xFE, 0xF1, 0xFE, 0x0E, 0x0A, 0xE4, + 0x40, 0xBA, 0x4A, 0xF0, 0x4F, 0x28, 0xDA, 0xF1, 0x6A, 0xF1, 0x40, 0xBA, + 0x8E, 0xF1, 0x40, 0xBA, 0x2A, 0xF1, 0xFE, 0x0E, 0x0D, 0xE4, 0x0C, 0xBC, + 0x9A, 0xF7, 0x04, 0xA1, 0x8A, 0xF0, 0x06, 0xA1, 0xFE, 0x0E, 0x0D, 0xE4, + 0x03, 0x0D, 0x1E, 0xE4, 0x0D, 0xE4, 0x03, 0x0D, 0x1E, 0xE4, 0x4E, 0xF7, + 0xFE, 0x0E, 0x0D, 0xE4, 0x40, 0xBC, 0xFE, 0x0E, 0x2D, 0x44, 0x1A, 0xE0, + 0x38, 0x28, 0xCE, 0xF6, 0x47, 0x3C, 0x0D, 0xF3, 0x04, 0xBC, 0x3A, 0xF0, + 0x00, 0xA4, 0x31, 0x08, 0xDD, 0xF2, 0x66, 0xBE, 0x4B, 0x3C, 0x00, 0xA2, + 0x4A, 0x3C, 0x66, 0xA5, 0x0A, 0xF1, 0x33, 0x28, 0x4D, 0x3C, 0x4C, 0x3C, + 0x02, 0xA1, 0x4B, 0x3C, 0x1D, 0xF2, 0x04, 0xBC, 0x02, 0xAE, 0xCD, 0xF1, + 0x0C, 0xBE, 0xBA, 0xF0, 0x7D, 0xF1, 0x0C, 0xBE, 0x4C, 0x3C, 0x3E, 0xA8, + 0x2B, 0x28, 0x4D, 0x3C, 0x3E, 0xA8, 0x02, 0xAE, 0x59, 0x24, 0x09, 0xC0, + 0x43, 0x2A, 0x1A, 0xF0, 0x1D, 0x0F, 0x19, 0xE4, 0x00, 0xC0, 0x58, 0x4C, + 0x00, 0xC0, 0x58, 0x3C, 0x59, 0x34, 0x09, 0xC0, 0x32, 0xF0, 0x46, 0xE0, + 0x44, 0x4E, 0x52, 0x26, 0x51, 0x28, 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, + 0x3A, 0x28, 0x51, 0xE0, 0x17, 0xE0, 0x40, 0x2A, 0x2E, 0xE4, 0x00, 0xA2, + 0x3A, 0x3C, 0x12, 0xB6, 0x3F, 0x28, 0x2A, 0xE4, 0x16, 0xE0, 0x4F, 0x28, + 0x3D, 0x28, 0x2A, 0xE4, 0x3A, 0x28, 0x2A, 0xE4, 0x48, 0xF0, 0x4E, 0x28, + 0x2A, 0xE4, 0x42, 0x18, 0x3B, 0x28, 0x2E, 0xE4, 0x16, 0xE0, 0x3B, 0x28, + 0x16, 0xE0, 0x39, 0x18, 0x3C, 0x28, 0x2A, 0xE4, 0x57, 0x7E, 0x0F, 0xC7, + 0x49, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x46, 0xE0, 0x02, 0xAE, 0x21, 0xAF, + 0x70, 0x03, 0x62, 0xE1, 0x00, 0x00, 0xF3, 0xD1, 0x61, 0xE1, 0x2E, 0xE4, + 0xE4, 0xCF, 0x12, 0x29, 0x3A, 0xF0, 0x02, 0xA1, 0x38, 0x28, 0x70, 0x03, + 0x04, 0x3C, 0x48, 0x28, 0x90, 0x03, 0x61, 0xE1, 0x86, 0x0F, 0x1E, 0xE4, + 0xB0, 0x02, 0x62, 0xE1, 0x62, 0xE1, 0x00, 0x00, 0xF3, 0xD1, 0x2A, 0xE4, + 0x84, 0xE1, 0x22, 0x00, 0x48, 0x88, 0xB0, 0x02, 0x38, 0x28, 0xE4, 0xCF, + 0x12, 0x29, 0x42, 0x0F, 0x04, 0x3C, 0x49, 0x28, 0x28, 0xE4, 0x04, 0xA1, + 0xD0, 0x02, 0x62, 0xE1, 0xB0, 0x03, 0x61, 0xE1, 0xF3, 0xD1, 0x2A, 0xE4, + 0x86, 0x0F, 0x1E, 0xE4, 0x49, 0x88, 0xD0, 0x02, 0x62, 0xE1, 0x20, 0x00, + 0x12, 0x29, 0x58, 0x0F, 0x84, 0xE1, 0x22, 0x00, 0x62, 0xE1, 0x8C, 0x10, + 0x1E, 0xE4, 0xE4, 0xCF, 0x4A, 0x10, 0x1E, 0xE4, 0x02, 0x29, 0xD0, 0x02, + 0x71, 0x3C, 0x70, 0x34, 0x6E, 0x10, 0x1E, 0xE4, 0x60, 0x02, 0x00, 0xE0, + 0x02, 0xAE, 0x02, 0x29, 0x17, 0x23, 0x17, 0x4D, 0x17, 0x21, 0x9E, 0xE0, + 0x72, 0x12, 0x73, 0x1C, 0x72, 0x10, 0x17, 0x4F, 0x46, 0xE0, 0x11, 0xE0, + 0x10, 0xE0, 0x73, 0x1E, 0x02, 0x29, 0x7A, 0x3C, 0x08, 0xB6, 0x24, 0xB6, + 0x28, 0xB6, 0x02, 0xA1, 0x43, 0x10, 0x1E, 0xE4, 0x00, 0xE0, 0x02, 0xAF, + 0x02, 0x29, 0x78, 0x3C, 0x79, 0x3C, 0x07, 0x29, 0x9E, 0xE0, 0xA0, 0x02, + 0x98, 0xE0, 0x82, 0xE0, 0x2E, 0xE4, 0x02, 0xA2, 0x22, 0x00, 0x04, 0x88, + 0x98, 0xF0, 0x40, 0xBA, 0x12, 0x3D, 0x11, 0x29, 0x8F, 0x0F, 0x84, 0xE1, + 0x82, 0xE0, 0x6D, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x3F, 0x58, 0x15, 0x4C, + 0x14, 0x20, 0x08, 0x3C, 0x3F, 0x58, 0x39, 0x2C, 0x01, 0x3C, 0x00, 0x34, + 0x04, 0x28, 0x03, 0x3C, 0x02, 0x34, 0x3F, 0x08, 0x00, 0xA2, 0x00, 0x06, + 0x63, 0xE1, 0x05, 0x3C, 0x0D, 0xE4, 0x0A, 0xBC, 0x13, 0x3D, 0x1F, 0xC7, + 0x7A, 0xF1, 0x02, 0xA1, 0xAA, 0xF0, 0xFC, 0x0F, 0xDA, 0xF1, 0x04, 0xA1, + 0x6A, 0xF2, 0x02, 0xA1, 0x1E, 0xE4, 0x8E, 0xF3, 0xBA, 0xF1, 0x02, 0xA1, + 0x02, 0xA0, 0xFC, 0x0F, 0x0D, 0xE4, 0x03, 0x0D, 0x32, 0xF0, 0x12, 0xE0, + 0x03, 0x1C, 0x02, 0x10, 0x03, 0x3C, 0x02, 0x34, 0x01, 0x0C, 0x00, 0x00, + 0x03, 0x0D, 0x1E, 0xE4, 0x4E, 0xF1, 0x03, 0xA2, 0x02, 0x00, 0x02, 0xA0, + 0xFC, 0x0F, 0x0D, 0xE4, 0x0E, 0xF7, 0x01, 0x1C, 0x00, 0x10, 0x03, 0x0C, + 0xFC, 0x0F, 0x0D, 0xE4, 0x03, 0x0D, 0x1E, 0xE4, 0x40, 0xBC, 0x3E, 0xF0, + 0xFD, 0xA2, 0x3F, 0x28, 0x11, 0x10, 0x1E, 0xE4, 0x0F, 0x3C, 0xFF, 0xA2, + 0x3A, 0xF0, 0x3F, 0x28, 0x03, 0xA2, 0x82, 0xF0, 0x46, 0xE0, 0x04, 0x29, + 0x03, 0xA8, 0x0F, 0x2A, 0x05, 0x28, 0x2D, 0x10, 0x1E, 0xE4, 0x12, 0x3D, + 0x2A, 0xE4, 0x04, 0xA0, 0x05, 0x3C, 0x02, 0xA1, 0x02, 0xA1, 0x08, 0x28, + 0xA6, 0x0F, 0x0E, 0xE4, 0x05, 0x28, 0x00, 0x06, 0x63, 0xE1, 0x92, 0xE0, + 0xE8, 0xF7, 0x11, 0x81, 0x13, 0x29, 0xA4, 0xF0, 0x02, 0xA1, 0x05, 0x28, + 0x12, 0x3D, 0x01, 0x29, 0x2E, 0xE4, 0x02, 0xA2, 0x6E, 0xF7, 0x05, 0x3C, + 0x84, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0xC2, 0xE0, 0x0B, 0x02, + 0xC2, 0xE0, 0x24, 0xE4, 0x4B, 0xF0, 0x26, 0x21, 0x1E, 0xE4, 0x14, 0x02, + 0x84, 0x28, 0x16, 0x02, 0xC2, 0xE0, 0x7F, 0x28, 0x6F, 0x3C, 0x6E, 0x34, + 0x6E, 0x10, 0x1E, 0xE4, 0x63, 0xE1, 0x07, 0x3E, 0x06, 0x3C, 0x2E, 0xE4, + 0xF6, 0xB5, 0xD6, 0x2A, 0x19, 0x28, 0x30, 0x03, 0x44, 0xCC, 0x02, 0xA0, + 0x02, 0xAE, 0x24, 0xE4, 0x0B, 0x2B, 0x13, 0x2D, 0x2A, 0x10, 0x84, 0xE1, + 0x69, 0xF0, 0x78, 0xF0, 0x07, 0x1A, 0x06, 0x1C, 0x02, 0xAF, 0x30, 0x03, + 0x02, 0xE0, 0x86, 0xE0, 0xFE, 0xA2, 0x13, 0x81, 0x13, 0x81, 0x2E, 0xE4, + 0x92, 0xE0, 0x08, 0x28, 0x09, 0x3C, 0x2E, 0xE4, 0x44, 0xCC, 0x02, 0xA1, + 0x2A, 0xE4, 0x6D, 0x28, 0x09, 0x18, 0x01, 0x29, 0x39, 0x10, 0x84, 0xE1, + 0x82, 0xE0, 0x2E, 0xE4, 0x11, 0x81, 0x3A, 0xF0, 0x96, 0xE0, 0x00, 0x06, + 0x00, 0xE0, 0x08, 0x18, 0x02, 0xAF, 0x2E, 0xE4, 0x03, 0x3D, 0x02, 0xA2, + 0x9E, 0xE0, 0x01, 0x02, 0x00, 0xE0, 0x04, 0xAE, 0x04, 0xAE, 0x02, 0xAF, + 0x2E, 0xE4, 0x07, 0x29, 0x07, 0x29, 0x9E, 0xE0, 0x03, 0x02, 0x00, 0xE0, + 0x42, 0x00, 0xC0, 0xE0, 0x0A, 0x3C, 0x2E, 0xE4, 0x07, 0xA2, 0x0A, 0x08, + 0x80, 0x01, 0x00, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x65, 0x10, 0x1E, 0xE4, + 0x0A, 0x0A, 0x0F, 0xAE, 0x6E, 0x00, 0x05, 0xE0, 0x65, 0x10, 0x1E, 0xE4, + 0x05, 0xA2, 0x42, 0xE0, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x2E, 0xE4, + 0x28, 0xCA, 0x27, 0xCE, 0x20, 0x00, 0x12, 0xD1, 0x02, 0xAF, 0x0A, 0x3C, + 0x2E, 0xE4, 0xF8, 0xF7, 0x42, 0xE0, 0x41, 0x00, 0xC1, 0xE0, 0x06, 0xAE, + 0x42, 0xE0, 0x0F, 0xAE, 0x6E, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x06, + 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x04, 0x00, + 0x9E, 0xE0, 0x00, 0x06, 0x04, 0xE0, 0xF8, 0xF7, 0x03, 0xA8, 0x0A, 0x2A, + 0x17, 0x4D, 0x17, 0x21, 0x2E, 0xE4, 0x17, 0x4D, 0x17, 0x21, 0x2B, 0xE4, + 0x1F, 0xC7, 0x3E, 0xA2, 0x00, 0x06, 0x61, 0xE1, 0xB0, 0x02, 0x00, 0xE0, + 0x48, 0x28, 0x11, 0x3D, 0x22, 0x00, 0x48, 0x88, 0x48, 0x2A, 0x94, 0xE0, + 0x00, 0xE0, 0x0A, 0x29, 0x9F, 0x10, 0x84, 0xE1, 0x03, 0xA1, 0x01, 0x3F, + 0x92, 0xE0, 0x00, 0x06, 0x00, 0x06, 0x62, 0xE1, 0x00, 0x00, 0xF9, 0xD1, + 0xA9, 0x10, 0x84, 0xE1, 0x1F, 0x00, 0x22, 0xD0, 0x1E, 0xE4, 0x2E, 0xE4, + 0xF0, 0xCF, 0x12, 0x29, 0x00, 0x00, 0xF3, 0xD1, 0x2E, 0xE4, 0x8C, 0x10, + 0x3F, 0x00, 0x22, 0xD0, 0xB0, 0x02, 0x67, 0xE1, 0xE4, 0xCF, 0x17, 0x29, + 0xB7, 0x10, 0x84, 0xE1, 0x00, 0x06, 0x67, 0xE1, 0x00, 0x00, 0xF9, 0xD1, + 0xC1, 0x10, 0x84, 0xE1, 0x1F, 0x00, 0x22, 0xD0, 0x4E, 0xBA, 0x2E, 0xE4, + 0xF0, 0xCF, 0x17, 0x29, 0x22, 0xD0, 0x24, 0x3C, 0x00, 0xA2, 0x11, 0x3C, + 0x41, 0xBA, 0xD0, 0x10, 0x84, 0xE1, 0x07, 0x00, 0x03, 0xA0, 0x24, 0x2A, + 0x56, 0xE0, 0x24, 0x5A, 0xF0, 0x3C, 0x08, 0xA2, 0x24, 0x3C, 0x24, 0x3E, + 0xDF, 0x11, 0x08, 0xE4, 0x0C, 0xAF, 0x24, 0x28, 0x84, 0xA1, 0x11, 0x28, + 0xF0, 0x3C, 0x24, 0xA2, 0x2E, 0xA1, 0x0A, 0xF1, 0x16, 0xA1, 0x2A, 0xF1, + 0xE1, 0x11, 0x0A, 0xE4, 0x14, 0xA1, 0xEA, 0xF0, 0x0C, 0xA1, 0xE1, 0x11, + 0x0A, 0xE4, 0x18, 0xA1, 0x23, 0x00, 0x08, 0xE0, 0x24, 0x28, 0x6A, 0xF0, + 0xF0, 0x3C, 0x26, 0xA2, 0xE1, 0x11, 0x0A, 0xE4, 0x10, 0x3C, 0x3E, 0xBC, + 0x1F, 0x3C, 0x4E, 0xBA, 0x67, 0x3C, 0x00, 0xA2, 0x22, 0x3C, 0x02, 0xA2, + 0x24, 0xA1, 0x6A, 0xF0, 0xC8, 0xA1, 0x11, 0x28, 0x2E, 0xF3, 0x2A, 0xF0, + 0x14, 0xA1, 0x4A, 0xF0, 0xF0, 0x3C, 0x0A, 0xA2, 0x22, 0x3C, 0x06, 0xBC, + 0x0C, 0xA2, 0xDF, 0x11, 0x08, 0xE4, 0x08, 0xBC, 0xDF, 0x11, 0x08, 0xE4, + 0x08, 0xBC, 0xF0, 0x3C, 0x2A, 0xF2, 0x67, 0x3C, 0x40, 0xBA, 0x40, 0xBA, + 0x00, 0xC4, 0x6B, 0x3E, 0x69, 0x3E, 0x01, 0xA2, 0x03, 0xAE, 0x69, 0x2A, + 0x1A, 0xF1, 0x40, 0xBA, 0x1E, 0xE4, 0x80, 0xE0, 0x69, 0x3C, 0x56, 0xE0, + 0x56, 0xE0, 0x03, 0xAE, 0x6B, 0x2A, 0x95, 0x13, 0x1E, 0xE4, 0x01, 0xA2, + 0x80, 0xE0, 0x6B, 0x3C, 0x03, 0xAE, 0x69, 0x2A, 0x7E, 0xF0, 0xC8, 0x13, + 0x6B, 0x3E, 0x03, 0xAE, 0x6B, 0x2A, 0x69, 0x3E, 0x10, 0xA1, 0x90, 0xE0, + 0x02, 0xA0, 0x80, 0xE0, 0x18, 0xBC, 0xF0, 0x3C, 0x0E, 0xA2, 0x48, 0xF6, + 0x13, 0x3C, 0x08, 0xA0, 0xDF, 0x11, 0x0D, 0xE4, 0x15, 0x3C, 0x14, 0x34, + 0x13, 0x58, 0x02, 0xA2, 0x16, 0x3C, 0x04, 0xBC, 0xF0, 0x3C, 0x10, 0xA2, + 0x34, 0xF0, 0x02, 0xA1, 0xDF, 0x11, 0x0D, 0xE4, 0xF0, 0x3C, 0x12, 0xA2, + 0x3E, 0xF3, 0xAA, 0xF0, 0x08, 0xA0, 0xDF, 0x11, 0x0D, 0xE4, 0x18, 0xBC, + 0x18, 0x3C, 0x40, 0xBA, 0xBE, 0xF2, 0x17, 0x3C, 0x07, 0x09, 0x60, 0xE1, + 0x1F, 0x0D, 0x1E, 0xE4, 0x01, 0x3D, 0x00, 0x35, 0x08, 0x09, 0x61, 0xE1, + 0x09, 0x09, 0x62, 0xE1, 0x1F, 0x0D, 0x1E, 0xE4, 0x03, 0x3D, 0x02, 0x35, + 0x0A, 0x09, 0x63, 0xE1, 0x0D, 0xE4, 0xFE, 0xBD, 0xF0, 0x3C, 0x14, 0xA2, + 0x04, 0x3D, 0x0B, 0x09, 0x64, 0xE1, 0xDF, 0x11, 0x62, 0xE1, 0x44, 0xCC, + 0x02, 0xA1, 0x0A, 0xF1, 0x1E, 0xE4, 0x72, 0x11, 0x84, 0xE1, 0xE0, 0x09, + 0x16, 0xA2, 0x12, 0x3D, 0x12, 0x35, 0x1F, 0x0D, 0x1E, 0xF0, 0xBD, 0x12, + 0x1E, 0xE4, 0xF0, 0x3C, 0xF0, 0x3C, 0x18, 0xA2, 0xDF, 0x11, 0x0D, 0xE4, + 0x19, 0x3C, 0xDF, 0x11, 0x0D, 0xE4, 0x20, 0xBC, 0xF0, 0x3C, 0x1A, 0xA2, + 0x1A, 0x3C, 0x40, 0xBA, 0x02, 0xA0, 0xDF, 0x11, 0x0D, 0xE4, 0xFE, 0xBD, + 0xFE, 0xBD, 0xF0, 0x3C, 0x1C, 0xA2, 0x57, 0x3C, 0x58, 0x3C, 0x02, 0xA0, + 0xDF, 0x11, 0x0D, 0xE4, 0x2A, 0x02, 0x1E, 0xE4, 0x58, 0x28, 0x57, 0x84, + 0x00, 0xC0, 0x56, 0x3C, 0x57, 0x34, 0x09, 0xC0, 0x1B, 0x3C, 0x40, 0xBA, + 0x1C, 0x3C, 0x00, 0xA2, 0x58, 0x28, 0x1C, 0x3C, 0x40, 0xBA, 0xD8, 0xF0, + 0x57, 0x24, 0x09, 0xC0, 0x58, 0x3C, 0x02, 0xAE, 0x56, 0x3C, 0x57, 0x34, + 0x02, 0xAE, 0x56, 0x4C, 0x1E, 0xA2, 0x86, 0x12, 0x1E, 0xE4, 0x00, 0xC0, + 0x36, 0xB6, 0x40, 0xBA, 0x1B, 0x2A, 0xF0, 0x3C, 0x40, 0xBA, 0xF0, 0x3C, + 0x20, 0xA2, 0x1D, 0x3C, 0x11, 0x3D, 0x03, 0xC7, 0xE4, 0x05, 0x61, 0xE1, + 0x1E, 0xE4, 0xE4, 0x05, 0x61, 0xE1, 0x6A, 0xF1, 0x03, 0x0D, 0x1E, 0xE4, + 0x11, 0x3D, 0x03, 0x0D, 0x1B, 0x2A, 0x03, 0x0D, 0x1E, 0xE4, 0x11, 0x3D, + 0x1E, 0xE4, 0x11, 0x3D, 0x02, 0xAE, 0x29, 0xF0, 0x02, 0xAE, 0x29, 0xF0, + 0x1B, 0x2A, 0x03, 0x0D, 0x90, 0x3C, 0x00, 0xA2, 0x2D, 0xF1, 0x11, 0x3D, + 0xEB, 0x3C, 0xEA, 0x3C, 0x20, 0x28, 0x91, 0x3C, 0xEE, 0x14, 0x1E, 0xE4, + 0xE4, 0x14, 0x1E, 0xE4, 0xCD, 0x12, 0x1A, 0xE4, 0x16, 0xE0, 0x40, 0xBA, + 0x6B, 0xE1, 0x2E, 0xE4, 0x6A, 0xE1, 0x3A, 0xF0, 0xAE, 0x3C, 0x40, 0xA9, + 0xAE, 0x28, 0x2E, 0xE4, 0x03, 0x0D, 0x1E, 0xE4, 0x2E, 0xE4, 0x6B, 0xE1, + 0x79, 0x12, 0x0D, 0xE4, 0x3E, 0xBC, 0x29, 0x3C, 0x10, 0x3C, 0x10, 0x08, + 0xFA, 0xF0, 0x10, 0x18, 0x79, 0x12, 0x0D, 0xE4, 0x47, 0x1B, 0x1E, 0xE4, + 0x02, 0xA2, 0x9E, 0xCC, 0x22, 0xAE, 0x04, 0xA2, 0x9B, 0x3C, 0x02, 0xA2, + 0xB7, 0x0C, 0x1E, 0xE4, 0x2A, 0x3C, 0x40, 0xBA, 0x2D, 0x3C, 0x40, 0xBA, + 0x2B, 0x3C, 0x79, 0x12, 0x0D, 0xE4, 0x0E, 0xBC, 0x2D, 0x28, 0x79, 0x12, + 0x0D, 0xE4, 0x3A, 0xF0, 0x08, 0xE4, 0x52, 0xE0, 0x1B, 0xE0, 0x2B, 0x2A, + 0x79, 0x12, 0x0D, 0xE4, 0x3E, 0xBC, 0x79, 0x12, 0x0D, 0xE4, 0x2E, 0x3C, + 0x3E, 0xBC, 0x2C, 0x3C, 0x43, 0xBA, 0x2F, 0x3C, 0x40, 0xBA, 0x79, 0x12, + 0x79, 0x12, 0x0B, 0xE4, 0x07, 0xA1, 0x30, 0x3E, 0x34, 0xA0, 0x79, 0x12, + 0x0D, 0xE4, 0x34, 0xBE, 0x68, 0xA1, 0x79, 0x12, 0x04, 0xE4, 0x31, 0x3C, + 0x0D, 0xE4, 0x34, 0xBE, 0x79, 0x12, 0x02, 0xE4, 0x79, 0x12, 0x04, 0xE4, + 0x34, 0xA0, 0x79, 0x12, 0x18, 0xBE, 0x79, 0x12, 0x02, 0xE4, 0x68, 0xA1, + 0x36, 0x3C, 0x32, 0x3C, 0x79, 0x12, 0x0D, 0xE4, 0x34, 0x3C, 0x40, 0xBA, + 0x33, 0x3C, 0x40, 0xBA, 0x37, 0x3C, 0x00, 0xA2, 0x35, 0x3C, 0x40, 0xBA, + 0x6A, 0xF3, 0x84, 0xA1, 0x11, 0x28, 0x68, 0x3C, 0x4C, 0x1C, 0x1E, 0xE4, + 0x02, 0x3C, 0x29, 0x28, 0x40, 0xBA, 0xFA, 0xF2, 0x4E, 0x0C, 0x1E, 0xE4, + 0x7A, 0xF2, 0x68, 0x3C, 0x40, 0xBA, 0x37, 0x3C, 0x00, 0xC4, 0x6C, 0x3E, + 0x6A, 0x3E, 0x01, 0xA2, 0x37, 0x18, 0x37, 0x18, 0x0C, 0xA1, 0x80, 0xE0, + 0x6A, 0x2A, 0x1A, 0xF1, 0x40, 0xBA, 0x32, 0xF1, 0x80, 0xE0, 0x6A, 0x3C, + 0x56, 0xE0, 0x03, 0xAE, 0x03, 0xAE, 0x6C, 0x2A, 0x95, 0x13, 0x1E, 0xE4, + 0x03, 0xA2, 0x80, 0xE0, 0x6C, 0x3C, 0x56, 0xE0, 0x6A, 0x2A, 0x7E, 0xF0, + 0xC8, 0x13, 0x1E, 0xE4, 0x03, 0xAE, 0x6C, 0x2A, 0x6A, 0x3E, 0x03, 0xAE, + 0x90, 0xE0, 0x02, 0xA0, 0x80, 0xE0, 0x6C, 0x3E, 0x6D, 0xF0, 0x18, 0xBE, + 0xF8, 0xF5, 0x10, 0xA1, 0x02, 0xA2, 0x3B, 0x0D, 0x1E, 0xE4, 0x36, 0x3C, + 0x07, 0xA1, 0x59, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x40, 0xA8, 0xAE, 0x28, + 0x03, 0xA2, 0x79, 0xF0, 0x6A, 0xE1, 0xAE, 0x3E, 0xAE, 0x4E, 0x11, 0xB6, + 0xC8, 0x08, 0x61, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, 0x0E, 0x00, 0x22, 0xD0, + 0xD8, 0x08, 0x62, 0xE1, 0x57, 0x26, 0x09, 0xC0, 0x95, 0x12, 0x84, 0xE1, + 0x45, 0xE0, 0x12, 0x29, 0x00, 0xC0, 0x56, 0x4E, 0x45, 0xE0, 0x1F, 0x2A, + 0x17, 0xF0, 0x11, 0x29, 0xE8, 0x08, 0x61, 0xE1, 0x1F, 0x3C, 0x23, 0xF0, + 0x0E, 0x00, 0x22, 0xD0, 0xC8, 0x08, 0x62, 0xE1, 0x1F, 0x2E, 0x11, 0x29, + 0xA5, 0x12, 0x84, 0xE1, 0x09, 0x34, 0x04, 0xAE, 0x17, 0xF0, 0x12, 0x1F, + 0x56, 0x4E, 0x57, 0x22, 0x09, 0xC0, 0x0A, 0x3C, 0x0F, 0x00, 0x22, 0xD0, + 0x01, 0xC4, 0x00, 0xC0, 0x24, 0xF0, 0x46, 0xE0, 0xB4, 0x12, 0x84, 0xE1, + 0x19, 0x2A, 0x02, 0xAE, 0x82, 0xE0, 0x11, 0x81, 0x20, 0x3C, 0x20, 0xA5, + 0x62, 0xE0, 0x03, 0xAE, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x20, 0xCE, 0x42, 0xE0, 0x11, 0xAE, 0x26, 0x00, 0x00, 0x02, 0x12, 0xD1, + 0xE0, 0x09, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, + 0x00, 0x00, 0x66, 0xE1, 0x00, 0xA2, 0x2E, 0xE4, 0x0E, 0x3C, 0x04, 0xA2, + 0x16, 0x3D, 0x0E, 0xC7, 0x09, 0x3C, 0x0A, 0xA2, 0x05, 0x3C, 0x0D, 0x3C, + 0x26, 0x3E, 0x25, 0x3E, 0xFF, 0xA2, 0x40, 0xBA, 0x25, 0x3E, 0x01, 0xA2, + 0x4E, 0xBA, 0x0A, 0xF1, 0x98, 0xF0, 0xFF, 0x00, 0x02, 0xE0, 0x26, 0x3C, + 0x5F, 0xBA, 0x5E, 0xBA, 0x07, 0x3C, 0x02, 0xA2, 0x26, 0x3E, 0x25, 0x3C, + 0x15, 0xB6, 0x16, 0xB6, 0x40, 0xBA, 0x3A, 0xF0, 0x0B, 0x3C, 0x40, 0xBA, + 0xEA, 0xF0, 0x0A, 0x3C, 0x40, 0xBA, 0x0C, 0x3C, 0x08, 0x3C, 0x40, 0xBA, + 0x09, 0x3C, 0x44, 0xBA, 0x4E, 0xBA, 0x7A, 0xF0, 0x06, 0x3C, 0x40, 0xBA, + 0x4E, 0xBA, 0x0D, 0x3C, 0x4E, 0xBA, 0x05, 0x3C, 0x5A, 0xF0, 0x04, 0x3C, + 0x40, 0xBA, 0x0E, 0x3C, 0x02, 0x3C, 0x0A, 0xBC, 0x03, 0x3C, 0x0A, 0xBC, + 0x7E, 0xBA, 0xBA, 0xF0, 0x01, 0x3C, 0x40, 0xBA, 0x11, 0x3D, 0x11, 0x35, + 0xC7, 0x05, 0x61, 0xE1, 0x40, 0xBA, 0x11, 0x3D, 0x11, 0x35, 0x7E, 0xBA, + 0x16, 0xE0, 0x90, 0x3C, 0x40, 0xBA, 0x00, 0x3C, 0x7B, 0x13, 0x1A, 0xE4, + 0xBD, 0x05, 0x61, 0xE1, 0x91, 0x3C, 0x40, 0xBA, 0x78, 0x13, 0x0A, 0xE4, + 0x1A, 0xE4, 0xC2, 0x05, 0x61, 0xE1, 0x16, 0xE0, 0x90, 0x28, 0x78, 0x13, + 0x0A, 0xE4, 0x7B, 0x13, 0x40, 0xBA, 0x40, 0xBA, 0x2A, 0xF0, 0x91, 0x4C, + 0x40, 0xBA, 0x8A, 0xF0, 0x40, 0xBA, 0x23, 0x3C, 0x20, 0xBC, 0x20, 0xBC, + 0x20, 0xBC, 0x20, 0xBC, 0x20, 0xA1, 0xEB, 0x28, 0x20, 0xBC, 0x20, 0xBC, + 0x19, 0x28, 0x5A, 0xF0, 0xEB, 0x28, 0x70, 0xF0, 0xB3, 0x2A, 0x5E, 0xF0, + 0x20, 0xF0, 0xEB, 0x18, 0x02, 0xA2, 0xEB, 0x3E, 0x20, 0x2A, 0x29, 0xF0, + 0x56, 0xE0, 0x3D, 0xAE, 0x0A, 0x2A, 0x3E, 0xAE, 0x08, 0x2A, 0x56, 0xE0, + 0x37, 0xAE, 0x09, 0x2A, 0x33, 0xAE, 0x07, 0x2A, 0x56, 0xE0, 0x35, 0xAE, + 0x56, 0xE0, 0x31, 0xAE, 0x06, 0x2A, 0x56, 0xE0, 0x0B, 0x2A, 0x56, 0xE0, + 0x21, 0xAE, 0x05, 0x2A, 0x13, 0xAE, 0x0C, 0x2A, 0x56, 0xE0, 0x15, 0xAE, + 0x56, 0xE0, 0x11, 0xAE, 0x04, 0x2A, 0x56, 0xE0, 0x02, 0x2A, 0x56, 0xE0, + 0x0B, 0xAE, 0x03, 0x2A, 0x03, 0xAE, 0x01, 0x2A, 0x56, 0xE0, 0x05, 0xAE, + 0x1E, 0xE4, 0x56, 0xE0, 0x00, 0x2A, 0x56, 0xE0, 0x11, 0xAE, 0x0D, 0x2A, + 0x00, 0xA2, 0xE4, 0x14, 0x1E, 0xE4, 0x56, 0xE0, 0x0E, 0x2A, 0x56, 0xE0, + 0x2E, 0xE4, 0x02, 0xA2, 0x6A, 0xE1, 0xEE, 0x14, 0x1E, 0xE4, 0x2E, 0xE4, + 0x00, 0xA2, 0x6A, 0xE1, 0x02, 0xA0, 0x61, 0x3C, 0x44, 0xCC, 0x03, 0x0D, + 0x84, 0xE1, 0x46, 0xBA, 0x46, 0xBA, 0x11, 0x3D, 0x1E, 0xE4, 0x03, 0x0D, + 0x1E, 0xE4, 0x89, 0x13, 0x02, 0x00, 0x22, 0xD0, 0x40, 0xBA, 0x03, 0x0D, + 0x02, 0xA0, 0x48, 0xBA, 0x90, 0x13, 0x84, 0xE1, 0x02, 0xA2, 0x11, 0x3D, + 0x48, 0xBA, 0x11, 0x3D, 0x0C, 0xA1, 0x0F, 0x00, 0x22, 0xD0, 0x2E, 0xE4, + 0x61, 0xE1, 0x3F, 0x00, 0x22, 0xD0, 0x34, 0xF0, 0x07, 0x3C, 0x06, 0x3C, + 0x10, 0xA2, 0x00, 0x06, 0x9C, 0xE0, 0x09, 0x3C, 0x08, 0x3C, 0x00, 0xA2, + 0x07, 0x28, 0xC5, 0x13, 0x84, 0xE1, 0x9E, 0xE0, 0x2D, 0xE4, 0x1F, 0x0D, + 0x1E, 0xE4, 0x0A, 0xF1, 0x08, 0xE0, 0x00, 0x01, 0x00, 0xE0, 0x06, 0x08, + 0x1A, 0xE0, 0x09, 0x4C, 0x07, 0x3C, 0xFF, 0x00, 0x09, 0x3C, 0x02, 0xA2, + 0x9E, 0xE0, 0x16, 0xE0, 0x06, 0x3C, 0x06, 0x28, 0x28, 0xF0, 0x07, 0x28, + 0x03, 0xA8, 0x9D, 0xE0, 0x03, 0xA0, 0x8D, 0xE0, 0x56, 0xE0, 0x11, 0xAE, + 0x85, 0xE0, 0x59, 0xF0, 0x2E, 0xE4, 0x8E, 0xE0, 0x94, 0xE0, 0x11, 0x3D, + 0x07, 0x3E, 0x11, 0xA2, 0x06, 0x3C, 0x08, 0x3E, 0x0C, 0xA0, 0x90, 0xB6, + 0x64, 0xF0, 0x0C, 0xA1, 0x06, 0x28, 0x07, 0x3C, 0x40, 0xA2, 0x06, 0x3C, + 0x08, 0xAE, 0x1C, 0xA0, 0x2B, 0xF0, 0x08, 0x2A, 0x05, 0xE0, 0x41, 0x00, + 0xC0, 0xE0, 0x06, 0x3C, 0x06, 0x08, 0x42, 0xE0, 0x11, 0xAE, 0x35, 0x00, + 0x07, 0x28, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x02, 0x00, + 0x13, 0xD1, 0x24, 0xCE, 0x51, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0xF8, 0xF7, + 0x08, 0xE4, 0xE5, 0x0B, 0x1E, 0xE4, 0x9E, 0xE0, 0xCA, 0xF2, 0x15, 0x0C, + 0x1E, 0xE4, 0x6A, 0x14, 0x08, 0xA1, 0x7C, 0x14, 0x0A, 0xE4, 0x02, 0xA1, + 0x7C, 0x14, 0x0A, 0xE4, 0x1F, 0x14, 0x04, 0xE4, 0x02, 0xA1, 0x4A, 0x14, + 0x0A, 0xE4, 0x02, 0xA1, 0x0A, 0xE4, 0x02, 0xA1, 0x30, 0x14, 0x0A, 0xE4, + 0x55, 0x14, 0x0A, 0xE4, 0x02, 0xA1, 0x3F, 0x14, 0x02, 0xA1, 0x63, 0x14, + 0x0A, 0xE4, 0x02, 0xA1, 0x0A, 0xE4, 0x02, 0xA1, 0x63, 0x14, 0x0A, 0xE4, + 0x22, 0x14, 0x0A, 0xE4, 0x06, 0xA1, 0x6F, 0x14, 0x02, 0xA0, 0x79, 0x14, + 0x0A, 0xE4, 0x0A, 0xA1, 0x27, 0x0A, 0x1E, 0xE4, 0x62, 0xF0, 0x0E, 0xA1, + 0x1E, 0xE4, 0x74, 0x14, 0x0E, 0xE4, 0x1A, 0xF5, 0x9E, 0xE0, 0x02, 0xA2, + 0xCE, 0xF4, 0xEF, 0x09, 0x27, 0x0A, 0x1E, 0xE4, 0xD5, 0x14, 0x1E, 0xE4, + 0xD6, 0x3C, 0x02, 0xA2, 0xED, 0x13, 0x0A, 0xE4, 0x74, 0x14, 0x0E, 0xE4, + 0x32, 0x1B, 0x1E, 0xE4, 0x1E, 0xE4, 0xDC, 0x14, 0x18, 0xE4, 0x8E, 0xE0, + 0x1E, 0xE4, 0x9E, 0xE0, 0x00, 0xA2, 0xD5, 0x14, 0x1E, 0xE4, 0xED, 0x13, + 0x0A, 0xE4, 0x27, 0x0A, 0x02, 0xA2, 0x74, 0x14, 0x0E, 0xE4, 0x32, 0x1B, + 0x1E, 0xE4, 0xD5, 0x14, 0x1E, 0xE4, 0x9E, 0xE0, 0x1E, 0xE4, 0xED, 0x13, + 0x0A, 0xE4, 0x27, 0x0A, 0x9E, 0xE0, 0x02, 0xA2, 0xBE, 0xF2, 0x63, 0x1B, + 0x27, 0x0A, 0x1E, 0xE4, 0xD5, 0x14, 0x1E, 0xE4, 0x09, 0x15, 0x1E, 0xE4, + 0xED, 0x13, 0x0A, 0xE4, 0x1E, 0xE4, 0x9E, 0xE0, 0x00, 0xA2, 0x0E, 0xF2, + 0x1E, 0xE4, 0xD5, 0x14, 0x1E, 0xE4, 0xDC, 0x14, 0x44, 0xBA, 0xED, 0x13, + 0x0A, 0xE4, 0x27, 0x0A, 0x1E, 0xE4, 0x2E, 0xF1, 0x3B, 0x0D, 0x1E, 0xE4, + 0x1E, 0xE4, 0x04, 0xA2, 0x58, 0xF0, 0xE5, 0x0B, 0x08, 0xE4, 0x51, 0x28, + 0xBE, 0xF0, 0xF7, 0x09, 0x04, 0xA2, 0x8E, 0x14, 0x0E, 0xE4, 0x97, 0x14, + 0xED, 0x13, 0x0E, 0xE4, 0xF7, 0x09, 0x1E, 0xE4, 0x0E, 0xE4, 0x8E, 0x14, + 0x0A, 0xE4, 0x51, 0x28, 0x6C, 0x27, 0x1E, 0xE4, 0x02, 0xA2, 0xED, 0x13, + 0x27, 0x0A, 0x1E, 0xE4, 0xD5, 0x14, 0x1E, 0xE4, 0xEF, 0x0D, 0x1E, 0xE4, + 0xED, 0x13, 0x0A, 0xE4, 0x00, 0xA2, 0x6C, 0x27, 0x1E, 0xE4, 0x48, 0xF0, + 0x92, 0x3C, 0x4E, 0x28, 0xED, 0x13, 0x0A, 0xE4, 0x51, 0x3C, 0x00, 0xA2, + 0x93, 0x3C, 0x4F, 0x28, 0xB8, 0x14, 0x1E, 0xE4, 0x48, 0xF0, 0xD6, 0x28, + 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0xA8, 0xF0, 0x1E, 0xE4, 0x2E, 0xE4, + 0xFE, 0xA2, 0x2E, 0xE4, 0xA3, 0x14, 0x1E, 0xE4, 0x2E, 0xE4, 0x0D, 0x07, + 0x65, 0xE1, 0x3E, 0xF7, 0x7D, 0x1A, 0x1E, 0xE4, 0x58, 0x28, 0x15, 0x3D, + 0x57, 0x28, 0xE8, 0x05, 0x16, 0x2A, 0x16, 0xE0, 0x21, 0x28, 0x15, 0x3D, + 0x19, 0x28, 0x55, 0xE0, 0x17, 0xE0, 0x05, 0xA1, 0x1B, 0x28, 0x15, 0x3D, + 0xEB, 0x28, 0x29, 0xF0, 0x2E, 0xE4, 0x15, 0x3D, 0x11, 0x28, 0x15, 0x3D, + 0x15, 0x19, 0x57, 0x28, 0xE8, 0x05, 0x65, 0xE1, 0x38, 0xF1, 0x15, 0x19, + 0x58, 0x28, 0x68, 0xF1, 0x05, 0xA1, 0x16, 0x2A, 0x16, 0xE0, 0x21, 0x28, + 0x29, 0xF0, 0x19, 0x28, 0x55, 0xE0, 0x17, 0xE0, 0x1B, 0x28, 0x88, 0xF0, + 0x15, 0x19, 0xEB, 0x28, 0x15, 0x19, 0x11, 0x28, 0x58, 0xF0, 0x15, 0x19, + 0xBD, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x28, 0xF0, 0x1E, 0xE4, 0x28, 0xE4, + 0xAD, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, 0xAD, 0x3C, 0x02, 0xA2, 0xEC, 0x06, + 0x09, 0xC0, 0x2E, 0xE4, 0xAD, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x00, 0xC0, + 0x3A, 0x4C, 0x39, 0x20, 0x00, 0xC0, 0x3A, 0x3C, 0x39, 0x34, 0x09, 0xC0, + 0x55, 0x4C, 0x54, 0x20, 0x09, 0xC0, 0x2E, 0xE4, 0x54, 0x34, 0x09, 0xC0, + 0x2E, 0xE4, 0x00, 0xC0, 0x22, 0xA2, 0x2E, 0xE4, 0x00, 0xC0, 0x55, 0x3C, + 0x00, 0x01, 0x02, 0xE0, 0x57, 0x2C, 0xF0, 0x3C, 0x02, 0xE0, 0x58, 0x2C, + 0x07, 0x15, 0x00, 0xE4, 0x09, 0xC0, 0x07, 0x15, 0x00, 0xE4, 0x00, 0x01, + 0x00, 0xE4, 0x02, 0xA1, 0x00, 0xC0, 0x57, 0x2C, 0x00, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x07, 0x15, 0x42, 0xE0, 0x4F, 0xBA, 0x00, 0xA2, 0x2E, 0xE4, + 0x1E, 0xE4, 0xCB, 0xF7, 0xFF, 0x00, 0x03, 0xE0, 0x42, 0xE0, 0x4F, 0xBA, + 0x00, 0xA2, 0x91, 0x17, 0x1E, 0xE4, 0xCB, 0xF7, 0xFF, 0x00, 0x03, 0xE0, + 0x23, 0x15, 0x1E, 0xE4, 0x4A, 0xF0, 0x97, 0x17, 0xA8, 0xF6, 0x42, 0x0C, + 0x1E, 0xE4, 0x2A, 0xE4, 0x1E, 0xE4, 0x2E, 0xE4, 0x3B, 0x0D, 0x1E, 0xE4, + 0x6A, 0xF1, 0x02, 0xA1, 0x5A, 0xF1, 0x94, 0x17, 0x8A, 0xF1, 0x02, 0xA1, + 0x7A, 0xF1, 0x04, 0xA1, 0xDA, 0xF1, 0x40, 0xA1, 0x9A, 0xF1, 0x02, 0xA1, + 0x9D, 0x17, 0x1E, 0xE4, 0x8A, 0xF1, 0x10, 0xA1, 0xE8, 0xF7, 0x02, 0xA1, + 0x4F, 0xBA, 0x4A, 0xF0, 0x57, 0x15, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, + 0x0E, 0xF1, 0x87, 0x15, 0x1E, 0xE4, 0x3E, 0xF1, 0x1E, 0xE4, 0xDE, 0xF0, + 0xD5, 0x15, 0x1E, 0xE4, 0x40, 0x16, 0x1E, 0xE4, 0xAE, 0xF0, 0xE6, 0x15, + 0x4E, 0xF0, 0x48, 0x16, 0x1E, 0xE4, 0x7E, 0xF0, 0x2A, 0xE4, 0x1E, 0xF0, + 0x44, 0x16, 0x1E, 0xE4, 0x28, 0xE4, 0x16, 0xE0, 0x0E, 0xA8, 0x68, 0xC8, + 0x3E, 0xBC, 0x2E, 0xE4, 0x3B, 0x0D, 0x1E, 0xE4, 0x10, 0x08, 0x2A, 0xF1, + 0x10, 0x18, 0x0D, 0xF2, 0x3E, 0xA0, 0x50, 0xF0, 0x3E, 0xA1, 0x74, 0xF0, + 0x00, 0xA2, 0x47, 0x1B, 0x1E, 0xE4, 0x10, 0x3C, 0x9B, 0x3E, 0x01, 0xA2, + 0xB7, 0x0C, 0x1E, 0xE4, 0x2A, 0xE4, 0x6A, 0xE1, 0x1A, 0xB6, 0x02, 0xA2, + 0x18, 0xE4, 0xBD, 0x05, 0x61, 0xE1, 0x90, 0x28, 0xC2, 0x05, 0x61, 0xE1, + 0x91, 0x28, 0x7B, 0x15, 0x2E, 0xE4, 0x02, 0xA2, 0x7B, 0x15, 0x18, 0xE4, + 0x11, 0x29, 0x2E, 0xE4, 0x6A, 0xE1, 0x00, 0xA2, 0x85, 0x15, 0x84, 0xE1, + 0x44, 0xCC, 0x02, 0xA1, 0x01, 0x29, 0x2F, 0x0D, 0x1E, 0xE4, 0x01, 0x29, + 0x90, 0x28, 0x2E, 0xE4, 0x2F, 0x0D, 0x1E, 0xE4, 0x61, 0xE1, 0x38, 0xF0, + 0xBF, 0x05, 0x61, 0xE1, 0x11, 0x29, 0x1A, 0xF1, 0x91, 0x4C, 0xC4, 0x05, + 0x3F, 0x34, 0x09, 0xC0, 0x2F, 0x0D, 0x1E, 0xE4, 0x1E, 0xE4, 0x11, 0x29, + 0x00, 0xC0, 0x40, 0x3C, 0x42, 0x3C, 0x41, 0x34, 0x09, 0xC0, 0x2F, 0x0D, + 0x30, 0xA2, 0x2E, 0xF0, 0x11, 0x29, 0x00, 0xC0, 0x28, 0xE4, 0x16, 0xE0, + 0x23, 0x28, 0x02, 0x3C, 0x04, 0xB6, 0x12, 0xA1, 0xA3, 0x3C, 0x46, 0xBA, + 0x00, 0xA2, 0x49, 0xE0, 0x12, 0xA0, 0x2A, 0xE4, 0x26, 0xB4, 0x05, 0xA1, + 0x26, 0xB4, 0x07, 0xA1, 0x84, 0xE1, 0x44, 0xCC, 0xF6, 0xB5, 0x05, 0xA1, + 0xBE, 0xF1, 0x28, 0xF0, 0x40, 0xBA, 0xD2, 0x15, 0x40, 0xBA, 0x48, 0xBA, + 0x40, 0xBA, 0x42, 0xBA, 0x4E, 0xBA, 0x40, 0xBA, 0x40, 0xBA, 0x03, 0x3C, + 0x4A, 0xBA, 0x4A, 0xBA, 0x5A, 0xF0, 0x03, 0x28, 0x8A, 0xF0, 0x40, 0xBA, + 0xAE, 0xF0, 0x48, 0xBA, 0x4A, 0xBA, 0x5A, 0xF0, 0x40, 0xBA, 0x4A, 0xBA, + 0x02, 0x28, 0x48, 0xBA, 0x2A, 0xF0, 0x40, 0xBA, 0x02, 0xA2, 0x90, 0xE1, + 0x2F, 0x0D, 0x1E, 0xE4, 0xDA, 0xF0, 0x9D, 0x17, 0x1E, 0xE4, 0x2E, 0xE4, + 0xFF, 0x00, 0x04, 0xE0, 0x44, 0xCC, 0x02, 0xA1, 0x52, 0xE0, 0x4F, 0xBA, + 0xDF, 0x15, 0x84, 0xE1, 0x2A, 0xE4, 0x16, 0xE0, 0xFF, 0x00, 0x02, 0xE0, + 0x92, 0xE0, 0x72, 0xC8, 0x2E, 0xE4, 0x02, 0xA2, 0x28, 0xF0, 0xFF, 0x00, + 0x02, 0xE0, 0x4E, 0xBA, 0x5E, 0xBA, 0xBF, 0x3C, 0x02, 0xA2, 0x4E, 0xBA, + 0xA8, 0xF2, 0x04, 0xA1, 0x5A, 0xF1, 0x5E, 0xA1, 0x54, 0x44, 0x05, 0xE0, + 0x7E, 0xBA, 0xBF, 0x3C, 0x45, 0xE0, 0x31, 0x47, 0x0B, 0xE0, 0x21, 0xAE, + 0x05, 0xE0, 0xBE, 0xF0, 0x6E, 0xFB, 0x39, 0xF0, 0x34, 0x39, 0x0B, 0xE0, + 0x21, 0xAE, 0x41, 0x47, 0x06, 0xA1, 0x0E, 0xBA, 0x89, 0xF1, 0x45, 0xE0, + 0x68, 0xCC, 0x66, 0xCC, 0x00, 0xA2, 0x58, 0xF1, 0x80, 0xF9, 0x06, 0xAF, + 0x82, 0xE0, 0x28, 0xE1, 0x4B, 0x26, 0x09, 0xC0, 0x2E, 0x16, 0x1E, 0xE4, + 0x4A, 0x3E, 0x4B, 0x36, 0x45, 0xE0, 0x4A, 0x4E, 0x02, 0xA2, 0xA6, 0x16, + 0x1E, 0xE4, 0x00, 0xC0, 0x09, 0xC0, 0x2E, 0x16, 0x1E, 0xE4, 0x2E, 0xE4, + 0x46, 0xE0, 0x00, 0xC0, 0x4A, 0x4E, 0x4B, 0x26, 0x02, 0xA1, 0x2E, 0xE4, + 0x02, 0xA2, 0x30, 0xF8, 0x4E, 0xBA, 0x2C, 0x16, 0x84, 0xE1, 0x44, 0xCC, + 0x83, 0xE0, 0x72, 0xC8, 0x2E, 0xE4, 0x90, 0xE1, 0x40, 0xBA, 0x2E, 0xE4, + 0x06, 0xAF, 0x46, 0xE0, 0x2B, 0xE4, 0x4A, 0xBA, 0x41, 0xBA, 0x28, 0xE4, + 0x09, 0xC0, 0xB0, 0x3C, 0x46, 0xBA, 0x46, 0xBA, 0x2E, 0xE4, 0x00, 0xC0, + 0x53, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0xA6, 0x16, 0x1E, 0xE4, + 0x2E, 0xE4, 0x02, 0xA2, 0xA6, 0x16, 0x1E, 0xE4, 0x03, 0x0D, 0x1E, 0xE4, + 0x9B, 0x16, 0x1E, 0xE4, 0x40, 0xBA, 0x27, 0x3C, 0x26, 0x34, 0x09, 0xC0, + 0x29, 0x3E, 0x28, 0x36, 0x49, 0xE0, 0x2A, 0xAE, 0x0C, 0xAE, 0x4C, 0xBA, + 0x8F, 0x16, 0x08, 0xE4, 0x55, 0xE0, 0x28, 0xAE, 0x40, 0xBA, 0x55, 0xE0, + 0x26, 0xAE, 0x40, 0xBA, 0x55, 0xE0, 0x4A, 0xBA, 0x55, 0xE0, 0x24, 0xAE, + 0x40, 0xBA, 0x55, 0xE0, 0x40, 0xBA, 0x55, 0xE0, 0x22, 0xAE, 0x40, 0xBA, + 0x1E, 0xAE, 0x40, 0xBA, 0x55, 0xE0, 0x20, 0xAE, 0x55, 0xE0, 0x1C, 0xAE, + 0x40, 0xBA, 0x55, 0xE0, 0x28, 0xAF, 0x4A, 0xE0, 0x29, 0x3E, 0x28, 0x36, + 0x3F, 0xA8, 0x0D, 0xAF, 0x16, 0xE0, 0x02, 0xA8, 0xEA, 0xF0, 0x52, 0xE0, + 0x1B, 0xE0, 0x0B, 0xA1, 0x55, 0xE0, 0x38, 0xAE, 0x46, 0xBA, 0x01, 0xA2, + 0x46, 0xBA, 0x55, 0xE0, 0x30, 0xAE, 0x46, 0xBA, 0x20, 0xAE, 0x46, 0xBA, + 0x55, 0xE0, 0x28, 0xAE, 0x64, 0x40, 0xC4, 0xE0, 0x4E, 0xBA, 0x55, 0xE0, + 0x28, 0x22, 0x2B, 0x3E, 0x2A, 0x36, 0x55, 0xE0, 0x55, 0xE0, 0x1A, 0xAE, + 0x40, 0xBA, 0x29, 0x4E, 0x02, 0xA2, 0x00, 0xC0, 0x29, 0x3E, 0x28, 0x36, + 0x09, 0xC0, 0x28, 0xE4, 0x6A, 0xE1, 0x1A, 0xB6, 0x00, 0xA2, 0x27, 0x3C, + 0x26, 0x34, 0xFE, 0xA2, 0x2B, 0x3C, 0x2A, 0x34, 0x29, 0x3C, 0x28, 0x34, + 0x65, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0x1E, 0xE4, 0xBA, 0xF0, + 0x40, 0xA1, 0x78, 0xA8, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x9D, 0x17, + 0x0E, 0xE4, 0x90, 0xE1, 0x4E, 0xBA, 0xB2, 0x16, 0x7F, 0x17, 0x1E, 0xE4, + 0x01, 0xA2, 0x24, 0x17, 0x17, 0x3D, 0x0C, 0x3C, 0x02, 0xA0, 0x07, 0x29, + 0x1E, 0xE4, 0x07, 0x2B, 0xE0, 0xF6, 0x20, 0xA1, 0x9D, 0x17, 0x1E, 0xE4, + 0x5A, 0xF0, 0x94, 0x17, 0x02, 0xA0, 0x61, 0x28, 0x5E, 0xF0, 0x41, 0xE0, + 0x07, 0xAF, 0x0F, 0xA0, 0x41, 0xE0, 0x06, 0xAE, 0xDB, 0xF0, 0x1F, 0xAF, + 0x4A, 0xE0, 0x07, 0xAE, 0x17, 0x81, 0x7F, 0x17, 0x1E, 0xE4, 0x01, 0xA2, + 0x07, 0x3D, 0x02, 0xA2, 0x07, 0x29, 0x17, 0x81, 0x0E, 0xF5, 0x7D, 0x17, + 0x1E, 0xE4, 0x01, 0xA2, 0x7D, 0x17, 0x1E, 0xE4, 0x01, 0xA2, 0x17, 0x3D, + 0x94, 0x17, 0x1E, 0xE4, 0x00, 0x06, 0x67, 0xE1, 0x4A, 0xF0, 0x94, 0x17, + 0x1E, 0xE4, 0x17, 0x3D, 0x61, 0x28, 0x4E, 0xF0, 0x9D, 0x17, 0x1E, 0xE4, + 0x0C, 0x2A, 0x17, 0x3D, 0x06, 0xAE, 0x02, 0xA0, 0x0B, 0x3C, 0x00, 0xA2, + 0x7D, 0x17, 0x1E, 0xE4, 0x03, 0xC7, 0x00, 0x06, 0x67, 0xE1, 0x00, 0xA2, + 0x1E, 0xE4, 0x00, 0x06, 0x67, 0xE1, 0x17, 0x3D, 0x02, 0xA0, 0x0B, 0x28, + 0x9A, 0xF2, 0x94, 0x17, 0x02, 0xA0, 0xA6, 0x28, 0x4F, 0xBA, 0x0B, 0x3C, + 0x0A, 0x28, 0x58, 0xF0, 0x02, 0xA8, 0xA6, 0x3C, 0x0A, 0x3E, 0x17, 0x3D, + 0x56, 0xE0, 0x10, 0xAE, 0x3F, 0x17, 0x1A, 0xE4, 0x0E, 0xA8, 0xA6, 0x28, + 0xB0, 0xF6, 0x0B, 0x18, 0x9D, 0x17, 0x1E, 0xE4, 0xA6, 0x2A, 0xEA, 0xF0, + 0x0E, 0xA8, 0xA6, 0x28, 0x11, 0xAE, 0x0A, 0x2A, 0x4B, 0xF0, 0x03, 0xA8, + 0x07, 0xAF, 0x0F, 0xA0, 0xA6, 0x2A, 0x17, 0x3F, 0x3F, 0x17, 0x18, 0xE4, + 0xA6, 0x3E, 0x07, 0xAE, 0x02, 0xA0, 0x0B, 0x28, 0x3D, 0x17, 0x0E, 0xE4, + 0x2F, 0x0D, 0x1E, 0xE4, 0x01, 0x29, 0x0B, 0x3C, 0x1E, 0xE4, 0x01, 0x29, + 0x17, 0x3D, 0x17, 0x35, 0xA6, 0x28, 0x17, 0x3D, 0x17, 0x35, 0x2F, 0x0D, + 0x3F, 0x17, 0x1E, 0xE4, 0xA6, 0x3C, 0x10, 0xA0, 0xB0, 0xF6, 0x0B, 0x18, + 0x02, 0xA0, 0x61, 0x28, 0xB7, 0x24, 0x2E, 0xE4, 0x02, 0xA2, 0x1A, 0xF0, + 0xA6, 0x18, 0x88, 0x00, 0x00, 0xE0, 0xB8, 0x4C, 0x12, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x42, 0xF2, 0x1E, 0xE4, 0x01, 0xA2, 0xDA, 0xF0, 0x02, 0xA8, + 0x07, 0x29, 0x17, 0x81, 0x17, 0x81, 0x7F, 0x17, 0x1E, 0xE4, 0x01, 0xA2, + 0x07, 0x3D, 0x02, 0xA2, 0x00, 0x02, 0x04, 0xE0, 0x2E, 0xE4, 0x7D, 0x17, + 0xC3, 0xE0, 0x55, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0xC0, 0xE0, 0x00, 0xCE, + 0x02, 0xA2, 0x5D, 0x00, 0x90, 0xE1, 0x00, 0x02, 0x08, 0xE0, 0x5D, 0x00, + 0xA6, 0x3C, 0x90, 0x00, 0x04, 0xE0, 0xB8, 0xF7, 0x10, 0xA1, 0xA6, 0x08, + 0xB6, 0x4C, 0xB5, 0x24, 0x12, 0xD1, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, + 0x28, 0xCA, 0x00, 0x00, 0x13, 0xD1, 0x04, 0x00, 0x00, 0x06, 0x67, 0xE1, + 0x00, 0xA2, 0xF8, 0xF7, 0x00, 0x06, 0x67, 0xE1, 0x17, 0x3D, 0x03, 0xC7, + 0x02, 0xA2, 0x2E, 0xF0, 0x00, 0xA2, 0x2E, 0xE4, 0x07, 0xAE, 0xB6, 0x4C, + 0xB5, 0x24, 0x0D, 0x3C, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0xE0, + 0x13, 0x01, 0x0D, 0x88, 0x04, 0x00, 0x12, 0xD1, 0x00, 0x06, 0x67, 0xE1, + 0xF8, 0xF7, 0x28, 0xCA, 0xDE, 0xF0, 0x49, 0x3C, 0x09, 0xC0, 0x2E, 0xE4, + 0x09, 0xC0, 0xAE, 0xF0, 0x49, 0x28, 0x09, 0xC0, 0x4A, 0x3C, 0x4B, 0x34, + 0xFF, 0x1F, 0x08, 0xE0, 0x4A, 0x4C, 0x4B, 0x24, 0x09, 0xC0, 0x4E, 0xF0, + 0x7B, 0x3C, 0x39, 0x2C, 0x2E, 0xE4, 0x00, 0xC0, 0x7D, 0x3C, 0x00, 0xA2, + 0x7C, 0x3C, 0x02, 0xA2, 0x28, 0xE4, 0x16, 0xE0, 0x4E, 0x28, 0x7E, 0x3C, + 0x3F, 0x18, 0x1E, 0xE4, 0xCA, 0xF0, 0x4F, 0x28, 0x34, 0xB6, 0xF0, 0xB7, + 0x40, 0xBA, 0x40, 0xBA, 0x02, 0xA2, 0x7B, 0x3C, 0x00, 0xA2, 0x7C, 0x3C, + 0x02, 0xA2, 0x48, 0xF0, 0x40, 0xBA, 0x2E, 0xE4, 0x2A, 0xE4, 0x19, 0x28, + 0x2E, 0xE4, 0x7D, 0x3C, 0x15, 0x4C, 0x14, 0x20, 0x09, 0x3C, 0x02, 0xAE, + 0x39, 0x2C, 0x01, 0x3C, 0x00, 0x34, 0x3F, 0x58, 0x03, 0x3C, 0x02, 0x34, + 0x3F, 0x08, 0x3F, 0x58, 0x0A, 0xE4, 0x3C, 0x18, 0x0D, 0xE4, 0x0C, 0xBC, + 0x02, 0xA1, 0xCA, 0xF0, 0x02, 0xA1, 0x3A, 0x18, 0x02, 0xA1, 0x4A, 0xF2, + 0x02, 0xA1, 0xFA, 0xF1, 0x1A, 0x18, 0x0A, 0xE4, 0x02, 0xA1, 0x9A, 0xF3, + 0x03, 0x0D, 0x1E, 0xE4, 0x22, 0x18, 0x0E, 0xE4, 0x02, 0x10, 0x02, 0xA0, + 0x3C, 0x18, 0x0D, 0xE4, 0x32, 0xF0, 0x0A, 0x3C, 0x12, 0xE0, 0x03, 0x1C, + 0x1E, 0xE4, 0x03, 0xA2, 0x01, 0x0C, 0x00, 0x00, 0x4F, 0x4C, 0x04, 0x3E, + 0x0A, 0x2A, 0x46, 0x18, 0x40, 0xBC, 0xAE, 0xF5, 0x5E, 0x18, 0x1A, 0xE4, + 0x1E, 0xE4, 0xFF, 0xA2, 0x3C, 0x18, 0x0D, 0xE4, 0x03, 0x0D, 0x1E, 0xE4, + 0x3E, 0xF5, 0x46, 0x18, 0x02, 0x10, 0x02, 0xA0, 0x3C, 0x18, 0x0D, 0xE4, + 0x00, 0x00, 0x32, 0xF0, 0x12, 0xE0, 0x03, 0x1C, 0x3F, 0x44, 0x02, 0xA8, + 0x06, 0x3C, 0x01, 0x0C, 0x41, 0xE0, 0x3F, 0x5A, 0x3D, 0xF3, 0x21, 0xBC, + 0x0E, 0xE4, 0x8C, 0x18, 0x1E, 0xE4, 0x07, 0x3E, 0x02, 0xA1, 0xAD, 0xF2, + 0x20, 0xBC, 0xCC, 0x17, 0xA7, 0x18, 0x1E, 0xE4, 0x3F, 0x08, 0x3F, 0x58, + 0x3F, 0x18, 0x1E, 0xE4, 0xCC, 0x17, 0x0E, 0xE4, 0x7B, 0x3C, 0x00, 0xA2, + 0x7E, 0x3C, 0x02, 0xA2, 0x9D, 0xF1, 0x20, 0xBC, 0xCC, 0x17, 0x0E, 0xE4, + 0x3F, 0x08, 0x3F, 0x58, 0x7B, 0x28, 0x7B, 0x3C, 0xA8, 0xF7, 0x46, 0x18, + 0x1E, 0xE4, 0xFF, 0xA2, 0x78, 0xF0, 0x40, 0x28, 0x9A, 0xF0, 0x3F, 0x28, + 0x1E, 0xE4, 0xFF, 0xA2, 0x02, 0xAE, 0x7B, 0x28, 0x7C, 0x3C, 0xFE, 0xA2, + 0xB8, 0xF7, 0x46, 0x18, 0x2E, 0xE4, 0x02, 0xA2, 0xCC, 0x17, 0x0E, 0xE4, + 0x10, 0xC4, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x1F, 0xC7, 0x00, 0xA2, + 0xF1, 0x02, 0x61, 0xE1, 0x05, 0x3E, 0x04, 0x3C, 0x2E, 0xE4, 0x31, 0x3D, + 0x22, 0x00, 0x09, 0x88, 0xF0, 0x02, 0x61, 0xE1, 0x09, 0x2B, 0x11, 0x2D, + 0x59, 0x18, 0x84, 0xE1, 0x59, 0xF0, 0x68, 0xF0, 0x05, 0x1A, 0x04, 0x1C, + 0x5E, 0xF0, 0x09, 0x3D, 0x00, 0xA2, 0x11, 0x81, 0x2E, 0xE4, 0x00, 0xA2, + 0x11, 0x81, 0x11, 0x81, 0xF0, 0x02, 0x61, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, + 0x6E, 0x18, 0x84, 0xE1, 0x22, 0x00, 0x09, 0x88, 0x05, 0x1A, 0x04, 0x18, + 0x09, 0x2B, 0x11, 0x2D, 0x00, 0xA2, 0x11, 0x81, 0x49, 0xF0, 0x50, 0xF0, + 0x18, 0xC4, 0x11, 0x81, 0x11, 0x81, 0x09, 0x3D, 0x22, 0x00, 0x09, 0x88, + 0xF1, 0x02, 0x61, 0xE1, 0x1A, 0xF1, 0x09, 0x29, 0x89, 0x18, 0x84, 0xE1, + 0x45, 0xE0, 0x3F, 0x5A, 0x39, 0x2E, 0x01, 0x2D, 0x3F, 0x5A, 0x15, 0x4E, + 0x14, 0x22, 0x53, 0xF0, 0x52, 0xF0, 0x04, 0x18, 0x02, 0xAE, 0x46, 0xE0, + 0x2E, 0xE4, 0x01, 0x3D, 0x11, 0x81, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0x90, 0xE1, 0x31, 0x81, 0x46, 0x18, 0x1E, 0xE4, 0xFF, 0xA2, 0x07, 0x28, + 0x09, 0x88, 0xF0, 0x02, 0x61, 0xE1, 0xC8, 0xF7, 0x11, 0x2D, 0xA2, 0x18, + 0x84, 0xE1, 0x22, 0x00, 0x67, 0xF0, 0x78, 0xF0, 0x06, 0x1C, 0x09, 0x2B, + 0x09, 0x3D, 0xFE, 0xA2, 0x11, 0x3D, 0x07, 0x28, 0x00, 0xA2, 0x11, 0x81, + 0x11, 0x81, 0x5E, 0xF0, 0x08, 0x3C, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, + 0x22, 0x00, 0x09, 0x88, 0xF0, 0x02, 0x61, 0xE1, 0x09, 0x2B, 0x11, 0x2D, + 0xB7, 0x18, 0x84, 0xE1, 0x11, 0x81, 0x43, 0xF0, 0x56, 0xF0, 0x08, 0x18, + 0x11, 0x81, 0x11, 0x81, 0x09, 0x3D, 0x00, 0xA2, 0x22, 0xF1, 0x12, 0x18, + 0x19, 0x28, 0x2E, 0xE4, 0x61, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x12, 0x28, + 0x11, 0x29, 0xCC, 0x18, 0x84, 0xE1, 0x02, 0x02, 0x57, 0x20, 0x12, 0xE4, + 0x09, 0x29, 0x6A, 0xF0, 0x06, 0xA0, 0x82, 0xE0, 0x11, 0x3D, 0x00, 0xA2, + 0x12, 0x3C, 0x2C, 0xB6, 0x19, 0x28, 0x92, 0xE0, 0x1E, 0xE4, 0x28, 0xE4, + 0x04, 0xA1, 0x16, 0x28, 0x02, 0xA1, 0x16, 0x28, 0x2E, 0xE4, 0x7D, 0x1A, + 0x12, 0x19, 0x0E, 0xE4, 0x4A, 0xF1, 0x44, 0xF0, 0x00, 0x3D, 0x03, 0x09, + 0x60, 0xE1, 0x17, 0x74, 0x18, 0xE4, 0x2A, 0x44, 0x16, 0xE0, 0x3F, 0x28, + 0x04, 0x09, 0x61, 0xE1, 0x2D, 0xE4, 0x1F, 0x0D, 0x96, 0x19, 0x1E, 0xE4, + 0x01, 0x3D, 0x11, 0x35, 0x03, 0x09, 0x60, 0xE1, 0x00, 0xA2, 0x8E, 0xF2, + 0x00, 0x3D, 0x10, 0x35, 0x10, 0x3D, 0x10, 0x35, 0x1F, 0x0D, 0x1E, 0xE4, + 0x38, 0xF1, 0x18, 0x28, 0x14, 0x35, 0x03, 0x09, 0x64, 0xE1, 0x2D, 0xE4, + 0x3F, 0x28, 0xAA, 0xF0, 0x2A, 0x28, 0x04, 0x3D, 0x2D, 0xE4, 0x1F, 0x0D, + 0x1E, 0xE4, 0x88, 0xF0, 0x06, 0x3D, 0x16, 0x35, 0x05, 0x09, 0x66, 0xE1, + 0x64, 0xE1, 0xAE, 0xF0, 0xE6, 0x19, 0x1E, 0xE4, 0x14, 0x35, 0x14, 0x3D, + 0x14, 0x35, 0x03, 0x09, 0x36, 0x1A, 0x1E, 0xE4, 0x3E, 0xF0, 0x04, 0x3D, + 0x38, 0xF1, 0xB9, 0xF1, 0x42, 0x2A, 0x3F, 0x28, 0x3B, 0x34, 0x09, 0xC0, + 0x75, 0x4C, 0x74, 0x20, 0x77, 0x4C, 0x76, 0x20, 0x00, 0xC0, 0x3C, 0x3C, + 0x00, 0xC0, 0x3E, 0x3C, 0x3D, 0x34, 0x09, 0xC0, 0x77, 0x4E, 0x76, 0x22, + 0x75, 0x4C, 0x74, 0x20, 0x75, 0x4C, 0x74, 0x20, 0xEE, 0xF0, 0x66, 0xE0, + 0x00, 0xC0, 0x3C, 0x3C, 0x3B, 0x34, 0x09, 0xC0, 0x09, 0xC0, 0x77, 0x4C, + 0x76, 0x20, 0x7E, 0xF0, 0x72, 0x34, 0x00, 0xC0, 0x3E, 0x3C, 0x3D, 0x34, + 0x7E, 0x4C, 0x4F, 0x28, 0x2E, 0xE4, 0x73, 0x3C, 0x18, 0xE4, 0x16, 0xE0, + 0xD6, 0x28, 0x3A, 0xF0, 0x00, 0xE0, 0x02, 0xAE, 0xE5, 0x28, 0x7D, 0x1A, + 0x73, 0x4C, 0x72, 0x20, 0x92, 0xE0, 0x78, 0x05, 0x00, 0xE0, 0xE5, 0x28, + 0x11, 0x3D, 0x11, 0x35, 0xD8, 0x2A, 0x84, 0x28, 0x92, 0xE0, 0x9A, 0x05, + 0xE5, 0x28, 0x11, 0x3D, 0x56, 0xE0, 0x1F, 0xAE, 0x16, 0x2A, 0xEB, 0x28, + 0xE5, 0x3C, 0x02, 0xA0, 0x16, 0xB6, 0x21, 0x2A, 0x16, 0xB6, 0x05, 0xA1, + 0x07, 0x3C, 0xAF, 0x28, 0x25, 0xF0, 0xAF, 0x2A, 0x1E, 0xE4, 0x48, 0xF0, + 0x7D, 0x20, 0x1E, 0xE4, 0x8D, 0x20, 0x1E, 0xE4, 0xBE, 0xF7, 0x82, 0x1A, + 0x82, 0x1A, 0x1E, 0xE4, 0x2E, 0xE4, 0x2A, 0xF0, 0x02, 0xA1, 0x4A, 0xF0, + 0xE9, 0x28, 0xAE, 0xF7, 0xDA, 0xF1, 0xE8, 0x28, 0xFE, 0xF1, 0xE9, 0x3C, + 0x92, 0xE0, 0xAB, 0x05, 0x00, 0xE0, 0xE7, 0x28, 0x24, 0xA1, 0xE7, 0x3C, + 0x02, 0xA0, 0xE7, 0x28, 0x02, 0xA1, 0xE8, 0x28, 0xE7, 0x3C, 0x28, 0xF0, + 0x09, 0xE0, 0x49, 0xE0, 0x01, 0x29, 0xE8, 0x3C, 0xA8, 0x4E, 0xA7, 0x26, + 0x8B, 0xF0, 0x00, 0x80, 0x08, 0xE0, 0xA8, 0x3E, 0xA7, 0x36, 0x03, 0xA9, + 0x25, 0xE4, 0x7F, 0x1A, 0x49, 0xE0, 0xFF, 0x7F, 0xFA, 0xA2, 0x49, 0xE0, + 0xF5, 0x0B, 0x1E, 0xE4, 0x17, 0x58, 0x02, 0xA2, 0x2E, 0xE4, 0xF2, 0xB7, + 0x82, 0x2A, 0x4F, 0x28, 0x06, 0x3C, 0x02, 0xAF, 0x06, 0x09, 0x64, 0xE1, + 0xD9, 0xF0, 0xB8, 0xF0, 0x08, 0x09, 0x66, 0xE1, 0x14, 0x4D, 0x14, 0x21, + 0x00, 0xA2, 0x9E, 0xF0, 0x16, 0x4F, 0x16, 0x23, 0x61, 0xE1, 0x00, 0xA2, + 0x6E, 0xF0, 0x01, 0xA2, 0x00, 0x34, 0x11, 0x4F, 0x11, 0x23, 0x0A, 0x09, + 0x61, 0xE1, 0x03, 0x3E, 0x02, 0x36, 0x01, 0x3C, 0x03, 0x1E, 0x02, 0x12, + 0x01, 0x2F, 0x03, 0x09, 0x85, 0xF0, 0x06, 0x1E, 0x13, 0xE0, 0x71, 0xF0, + 0x06, 0x1E, 0x5E, 0xF0, 0x06, 0x0C, 0x06, 0x0C, 0x04, 0x34, 0x06, 0x1C, + 0x06, 0x1C, 0x37, 0xF0, 0x01, 0x0D, 0x03, 0x09, 0x61, 0xE1, 0x05, 0x3C, + 0x04, 0x09, 0x62, 0xE1, 0x75, 0x3C, 0x74, 0x34, 0x77, 0x3C, 0x76, 0x34, + 0x12, 0x0D, 0x12, 0x01, 0x75, 0x4C, 0x74, 0x20, 0x4A, 0xF1, 0x4E, 0x28, + 0x11, 0x3D, 0x11, 0x35, 0x0A, 0x09, 0x61, 0xE1, 0x06, 0x09, 0x64, 0xE1, + 0x05, 0x4C, 0x04, 0x20, 0x03, 0x09, 0x61, 0xE1, 0x14, 0x3D, 0x14, 0x35, + 0x16, 0x35, 0x01, 0x2D, 0x08, 0x09, 0x66, 0xE1, 0x47, 0x1A, 0x1E, 0xE4, + 0x2E, 0xE4, 0x16, 0x3D, 0x3A, 0xF3, 0x00, 0x29, 0x0B, 0x09, 0x60, 0xE1, + 0xF6, 0xF2, 0x39, 0x0C, 0x01, 0x4C, 0x00, 0x20, 0x02, 0xA1, 0x46, 0xE0, + 0x17, 0xE0, 0x4E, 0x2A, 0x0F, 0xC7, 0x0B, 0x09, 0x60, 0xE1, 0xA4, 0xF2, + 0x1E, 0xE4, 0x03, 0x3C, 0x02, 0x34, 0x00, 0x7D, 0x03, 0x29, 0x0B, 0x09, + 0x63, 0xE1, 0x6D, 0x1A, 0xE0, 0x09, 0x61, 0xE1, 0x44, 0xCC, 0x02, 0xA1, + 0x11, 0x01, 0x08, 0x1A, 0x84, 0xE1, 0x00, 0xA2, 0x08, 0xE0, 0x04, 0x34, + 0x02, 0xAE, 0x11, 0x0D, 0x03, 0x84, 0x05, 0x3C, 0x02, 0xAF, 0xFF, 0xFF, + 0x05, 0x82, 0x1E, 0xAE, 0x18, 0xE0, 0x04, 0x82, 0x02, 0x88, 0xE0, 0x09, + 0x61, 0xE1, 0x1C, 0xE0, 0x11, 0x01, 0x1C, 0x1A, 0x84, 0xE1, 0x22, 0x00, + 0x4E, 0x2A, 0x00, 0xA2, 0x2E, 0xF0, 0x11, 0x0D, 0x11, 0x01, 0x07, 0x09, + 0x61, 0xE1, 0x59, 0xF0, 0x14, 0x01, 0x03, 0x09, 0x64, 0xE1, 0x11, 0x0D, + 0x62, 0xE1, 0x75, 0x3C, 0x74, 0x34, 0x14, 0x0D, 0x66, 0xE1, 0x12, 0x0D, + 0x12, 0x01, 0x09, 0x09, 0x76, 0x34, 0x16, 0x0D, 0x16, 0x01, 0x05, 0x09, + 0x47, 0x1A, 0x1E, 0xE4, 0x2E, 0xE4, 0x77, 0x3C, 0x00, 0x20, 0x8A, 0xF0, + 0x16, 0xE0, 0x4F, 0x28, 0x4E, 0x2A, 0x02, 0xAE, 0x39, 0x0C, 0x01, 0x4C, + 0x75, 0x3C, 0x74, 0x34, 0x46, 0xE0, 0x17, 0xE0, 0x82, 0x28, 0x2E, 0xE4, + 0x77, 0x3C, 0x76, 0x34, 0x01, 0x09, 0x62, 0xE1, 0x00, 0xA2, 0x9A, 0xF0, + 0x00, 0x09, 0x61, 0xE1, 0x12, 0x3D, 0x12, 0x35, 0xDA, 0xF0, 0x16, 0xE0, + 0x4F, 0x28, 0x01, 0x3D, 0x12, 0x4D, 0x12, 0x21, 0x01, 0x09, 0x62, 0xE1, + 0x39, 0x1E, 0x01, 0x2F, 0x00, 0x09, 0x61, 0xE1, 0x42, 0xE0, 0x13, 0x5A, + 0x03, 0xA2, 0x47, 0xF0, 0x61, 0xE1, 0x39, 0x28, 0x01, 0x3C, 0x00, 0x34, + 0x01, 0x4C, 0x00, 0x20, 0x01, 0x3D, 0x00, 0x09, 0x12, 0x3D, 0x12, 0x35, + 0x01, 0x09, 0x62, 0xE1, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x20, 0xCE, 0x42, 0xE0, 0x11, 0xAE, 0x26, 0x00, 0x00, 0x02, 0x12, 0xD1, + 0xE0, 0x09, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x1E, 0xE4, 0x26, 0xE4, 0xE5, 0x28, 0x2E, 0xE4, 0x26, 0xE4, 0xE5, 0x28, + 0xCE, 0xF7, 0x82, 0x1A, 0x78, 0x05, 0x62, 0xE1, 0x78, 0x05, 0x61, 0xE1, + 0x00, 0x3E, 0x01, 0xA2, 0x11, 0x4D, 0x11, 0x21, 0xE4, 0xF0, 0x04, 0xA1, + 0xE5, 0x28, 0x03, 0xA2, 0x12, 0x21, 0x9C, 0x1A, 0x84, 0xE1, 0x44, 0xCC, + 0x56, 0xF0, 0x11, 0x1D, 0x11, 0x11, 0x0A, 0x4D, 0x00, 0x3E, 0x94, 0xE0, + 0x04, 0xA1, 0x82, 0xE0, 0x92, 0xE0, 0x04, 0xA0, 0x84, 0xE0, 0x03, 0xA0, + 0x98, 0xE0, 0x9A, 0x05, 0x00, 0xE0, 0x00, 0x28, 0x01, 0x3C, 0x04, 0x29, + 0x96, 0xE0, 0x02, 0xA0, 0x00, 0x18, 0xE5, 0x28, 0x5E, 0x20, 0x1E, 0xE4, + 0x84, 0xE1, 0x44, 0xCC, 0xA4, 0xF0, 0x04, 0xA1, 0x11, 0x29, 0x12, 0x3D, + 0x11, 0x29, 0xB6, 0x1A, 0xE5, 0x28, 0x14, 0x3D, 0x13, 0x29, 0x12, 0x3D, + 0x00, 0xE0, 0xE6, 0x28, 0xE5, 0x3C, 0xF0, 0xB5, 0x01, 0x3D, 0x01, 0x28, + 0x92, 0xE0, 0xAB, 0x05, 0x24, 0xA1, 0xE6, 0x3C, 0x02, 0xA0, 0xE6, 0x28, + 0x02, 0xA0, 0xE8, 0x28, 0xE6, 0x3C, 0x28, 0xF0, 0xB2, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0xE8, 0x3C, 0x7F, 0x28, 0x9C, 0xE0, 0x54, 0x00, 0x04, 0xE0, + 0xE8, 0x1A, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0xB8, 0xF0, 0x02, 0xA8, + 0xB2, 0x5C, 0x06, 0x9E, 0x18, 0x05, 0x01, 0xE0, 0x49, 0xE0, 0xB2, 0x28, + 0x19, 0xE4, 0x09, 0xA8, 0x07, 0x2B, 0x9F, 0xE0, 0x09, 0xA2, 0xB2, 0x28, + 0x5E, 0xF0, 0x67, 0x20, 0x03, 0xA0, 0xB2, 0x2A, 0x76, 0x20, 0x1E, 0xE4, + 0x18, 0x05, 0x04, 0xE0, 0x2E, 0xE4, 0xB2, 0x3E, 0x9C, 0xE0, 0x54, 0x00, + 0x04, 0xE0, 0x9E, 0xE0, 0x00, 0xA2, 0x44, 0xCC, 0x02, 0xA1, 0x7F, 0x28, + 0x17, 0x2B, 0xFE, 0x1A, 0x84, 0xE1, 0xB2, 0x3C, 0x56, 0xE0, 0xB2, 0x5A, + 0x03, 0xA8, 0x05, 0xAF, 0x06, 0x9F, 0xB2, 0x3E, 0x03, 0xA0, 0xB2, 0x2A, + 0x1E, 0xE4, 0x58, 0xF0, 0x40, 0x28, 0x2E, 0xE4, 0x3E, 0x28, 0x7E, 0xF0, + 0x3E, 0x3C, 0xAA, 0x20, 0x35, 0xB6, 0xD6, 0x28, 0x01, 0xA2, 0x84, 0x3C, + 0x1E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0xDB, 0x3E, 0x00, 0xA2, 0x16, 0x1B, + 0x1E, 0xE4, 0x6C, 0x27, 0x00, 0x09, 0x61, 0xE1, 0x6C, 0x27, 0x1E, 0xE4, + 0x2E, 0xE4, 0x11, 0x3D, 0x0A, 0xC7, 0x00, 0xA2, 0x11, 0x3D, 0x00, 0xA2, + 0x00, 0x06, 0x61, 0xE1, 0x84, 0xE1, 0x3F, 0x01, 0x22, 0xD0, 0x02, 0x3C, + 0x02, 0x28, 0x4A, 0x1C, 0x1E, 0xE4, 0x29, 0x1B, 0x9B, 0x3C, 0x00, 0xA2, + 0x02, 0x3C, 0x02, 0xA0, 0x48, 0x3C, 0x47, 0x3C, 0xFE, 0xA2, 0x09, 0xC0, + 0x3E, 0xBC, 0x6E, 0xBA, 0x2E, 0xE4, 0x00, 0xC0, 0x38, 0xF0, 0x10, 0x18, + 0x00, 0x3C, 0x0D, 0xF1, 0xD6, 0x2A, 0x40, 0xA2, 0x10, 0x3C, 0xFE, 0xA2, + 0x00, 0x01, 0x00, 0xE0, 0x00, 0x08, 0x16, 0xB6, 0x2E, 0xE4, 0x02, 0xA2, + 0xE6, 0x1B, 0x1E, 0xE4, 0x09, 0xC0, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, + 0x00, 0xA2, 0x38, 0xF0, 0x00, 0xC0, 0x53, 0x28, 0x40, 0xA2, 0x9B, 0x3C, + 0x04, 0xA2, 0xB0, 0x3C, 0x00, 0xE0, 0x10, 0x08, 0x16, 0xB6, 0xD6, 0x2A, + 0x2A, 0xE4, 0x21, 0x1C, 0x1E, 0xE4, 0x00, 0x01, 0xB9, 0x18, 0x1C, 0xE4, + 0xC3, 0x10, 0x1E, 0xE4, 0x09, 0xC0, 0x10, 0x3C, 0xFA, 0xB7, 0x10, 0x28, + 0x1E, 0xE4, 0x2E, 0xE4, 0x00, 0xC0, 0x47, 0x3C, 0x01, 0x3C, 0x81, 0x1B, + 0x0D, 0xE4, 0x03, 0x0D, 0x81, 0x1B, 0x00, 0xE4, 0xFF, 0x00, 0x02, 0xE0, + 0xFE, 0xA2, 0xB8, 0xF0, 0x29, 0x18, 0x01, 0x28, 0x62, 0xE1, 0x92, 0xE0, + 0x01, 0x28, 0x29, 0x3C, 0x02, 0xA2, 0x84, 0x1B, 0x1E, 0xE4, 0x40, 0x01, + 0xAE, 0x3C, 0x02, 0xA8, 0xAE, 0x28, 0x98, 0x3C, 0x02, 0xA2, 0xE6, 0x1B, + 0x1E, 0xE4, 0x01, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, + 0x4C, 0x1C, 0x1E, 0xE4, 0x02, 0x3C, 0x82, 0xE0, 0x4A, 0x1C, 0x1E, 0xE4, + 0x02, 0x3C, 0x84, 0xE0, 0x9A, 0x1B, 0x1E, 0xE4, 0x18, 0xAE, 0x84, 0xE0, + 0x1E, 0xE4, 0x18, 0xAE, 0x82, 0xE0, 0x49, 0xE0, 0x1E, 0xE4, 0x00, 0x10, + 0x61, 0xE1, 0x9A, 0x1B, 0x05, 0x3C, 0x04, 0x34, 0x2E, 0xE4, 0x0D, 0x02, + 0x05, 0x0C, 0x04, 0x04, 0xB2, 0x0C, 0x1E, 0xE4, 0x29, 0x28, 0x9B, 0x3C, + 0x02, 0xA2, 0x2E, 0xE4, 0xC8, 0x1B, 0x0A, 0xE4, 0x21, 0x1C, 0x1E, 0xE4, + 0xBA, 0x1B, 0x08, 0xE4, 0xE6, 0x11, 0x1E, 0xE4, 0x00, 0xA2, 0xC8, 0x1B, + 0x0B, 0xE4, 0x98, 0x2A, 0x40, 0x01, 0x61, 0xE1, 0xB7, 0x0C, 0x1E, 0xE4, + 0x84, 0x1B, 0x1E, 0xE4, 0x94, 0xE0, 0x29, 0x28, 0x00, 0xA2, 0x65, 0x3C, + 0xA4, 0x1B, 0x0E, 0xE4, 0x9B, 0x3E, 0x01, 0xA2, 0xB7, 0x0C, 0x1E, 0xE4, + 0x09, 0xC0, 0x29, 0x28, 0x7A, 0xF0, 0x65, 0x28, 0x2E, 0xE4, 0x02, 0xA2, + 0x00, 0xC0, 0x48, 0x3C, 0x79, 0xF0, 0x07, 0xA1, 0x59, 0x00, 0xC1, 0xE0, + 0xAE, 0x28, 0x4A, 0xF0, 0x04, 0xA1, 0xAE, 0x28, 0x29, 0x3C, 0xFE, 0xA2, + 0xAE, 0x3C, 0x02, 0xA9, 0x00, 0xA2, 0x00, 0xC0, 0x48, 0x3C, 0x09, 0xC0, + 0x6A, 0xF0, 0x02, 0xA1, 0x60, 0x28, 0x2E, 0xE4, 0x64, 0x1C, 0x1E, 0xE4, + 0x9A, 0x4C, 0x99, 0x24, 0x1E, 0xE4, 0x7D, 0x1C, 0x1E, 0xE4, 0x70, 0xE4, + 0x1E, 0xE4, 0x02, 0x3C, 0x70, 0xE4, 0x6B, 0x1C, 0x02, 0x28, 0x06, 0x3C, + 0x00, 0xA2, 0x4C, 0x1C, 0x1E, 0xE4, 0x05, 0x3C, 0x04, 0x34, 0x18, 0xAE, + 0x20, 0xCE, 0x05, 0x0C, 0x04, 0x04, 0xB2, 0x0C, 0x8A, 0x0C, 0x1E, 0xE4, + 0x00, 0x00, 0x11, 0xD1, 0x02, 0xAE, 0x06, 0xAF, 0x0E, 0xA0, 0x06, 0x18, + 0x28, 0xCA, 0x12, 0x00, 0x13, 0xD1, 0x24, 0xCE, 0x1E, 0xE4, 0xFA, 0xF7, + 0x2C, 0xCA, 0xF8, 0xF7, 0x05, 0x4C, 0x04, 0x20, 0x28, 0xF1, 0x93, 0x0C, + 0x05, 0x3C, 0x04, 0x34, 0x00, 0x02, 0x00, 0xE0, 0x1E, 0xE4, 0x06, 0x3C, + 0x8A, 0x0C, 0x1E, 0xE4, 0x02, 0xE0, 0x8A, 0x0C, 0x1E, 0xE4, 0x64, 0x0A, + 0x61, 0xE1, 0x9E, 0xF5, 0x20, 0xF0, 0x00, 0x10, 0x1E, 0xE4, 0x11, 0x3D, + 0x02, 0xA2, 0x00, 0x06, 0x4A, 0x1C, 0x1E, 0xE4, 0x01, 0x3D, 0x8A, 0x0C, + 0x4C, 0x1C, 0x1E, 0xE4, 0x02, 0x3C, 0x2E, 0xE4, 0x2A, 0xE4, 0x11, 0x29, + 0x00, 0x06, 0x61, 0xE1, 0x9A, 0x1B, 0x1E, 0xE4, 0x18, 0xAE, 0x02, 0x28, + 0x1E, 0xE4, 0x9B, 0xF0, 0x03, 0xA1, 0x9B, 0x2A, 0xB7, 0x0C, 0x1E, 0xE4, + 0x04, 0xA2, 0x64, 0x1C, 0x1E, 0xE4, 0x8E, 0xF0, 0x90, 0x00, 0x04, 0xE0, + 0xB7, 0x0C, 0x1E, 0xE4, 0x02, 0xA2, 0x6B, 0x1C, 0x6A, 0xCC, 0x66, 0xCC, + 0x80, 0x00, 0x04, 0xE0, 0x00, 0xA2, 0x6C, 0xCC, 0x1E, 0xA0, 0x6E, 0xCC, + 0x28, 0xE1, 0x70, 0xCC, 0x68, 0xCC, 0x60, 0xCC, 0x2E, 0xF0, 0x04, 0xA2, + 0x2E, 0xE4, 0x02, 0xA2, 0x5A, 0x1C, 0x1E, 0xE4, 0x0A, 0x3C, 0x06, 0xA2, + 0x12, 0xD1, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x13, 0x01, + 0x0A, 0x88, 0x04, 0x00, 0x41, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xF8, 0xF7, + 0x42, 0xE0, 0x11, 0xAE, 0x2A, 0x00, 0x05, 0xE0, 0x2E, 0xE4, 0x42, 0xE0, + 0x07, 0xAE, 0x02, 0x2A, 0x9A, 0x3C, 0x99, 0x34, 0x80, 0xA0, 0x20, 0xCE, + 0x20, 0xCE, 0x7E, 0xF0, 0x90, 0x00, 0x11, 0xD1, 0x11, 0xD1, 0x78, 0x1C, + 0x1E, 0xE4, 0x80, 0xA0, 0x13, 0xD1, 0x10, 0x00, 0x12, 0xD1, 0x80, 0x00, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x13, 0x00, 0x00, 0xC0, 0x11, 0x3C, + 0x10, 0x34, 0x09, 0xC0, 0x11, 0x4C, 0x10, 0x24, 0x09, 0xC0, 0x2E, 0xE4, + 0x99, 0x1C, 0x1E, 0xE4, 0x2E, 0xE4, 0x00, 0xC0, 0x00, 0x3C, 0x02, 0xA1, + 0x2A, 0xE4, 0x19, 0x28, 0x09, 0xA8, 0xAA, 0x2A, 0x1A, 0xE0, 0x4E, 0x28, + 0x52, 0xE0, 0x17, 0xE0, 0xBE, 0x2A, 0x49, 0xF0, 0x2F, 0x1E, 0x1E, 0xE4, + 0xF1, 0x1D, 0x18, 0xE4, 0x9A, 0x1E, 0x1E, 0xE4, 0x67, 0x1E, 0x1E, 0xE4, + 0x19, 0x2A, 0x2A, 0xE4, 0xD6, 0x28, 0x2E, 0xE4, 0xD7, 0x28, 0x00, 0x02, + 0x01, 0xE0, 0x05, 0xAE, 0x11, 0x3D, 0x00, 0xA2, 0x93, 0xE0, 0x34, 0xF2, + 0x11, 0x3D, 0x06, 0xA2, 0x11, 0x3D, 0xFC, 0xA2, 0x03, 0xAE, 0x19, 0x2A, + 0x11, 0x3D, 0xD7, 0x28, 0x19, 0x2A, 0x9B, 0xE0, 0x40, 0x02, 0x01, 0xE0, + 0x9D, 0xE0, 0x60, 0x02, 0x01, 0xE0, 0x05, 0xAE, 0x9F, 0xE0, 0xA0, 0x02, + 0x01, 0xE0, 0x19, 0x2A, 0x15, 0x3D, 0x15, 0x35, 0x73, 0x4C, 0x72, 0x20, + 0x16, 0x3D, 0x16, 0x35, 0x16, 0x3D, 0x16, 0x35, 0x05, 0xA0, 0x5E, 0xF0, + 0x07, 0x3D, 0x00, 0xA2, 0x2E, 0xE4, 0x01, 0x3D, 0x00, 0xA2, 0x93, 0xE0, + 0x01, 0xA2, 0x02, 0x02, 0x61, 0xE1, 0x18, 0xC4, 0x44, 0xCC, 0x02, 0xA1, + 0xC6, 0xF0, 0x19, 0x28, 0x5A, 0xF0, 0x11, 0x29, 0xD8, 0x1C, 0x84, 0xE1, + 0x11, 0x3F, 0x57, 0x20, 0x1E, 0xE4, 0x09, 0x29, 0x1A, 0xF1, 0x7E, 0x28, + 0x2E, 0xE4, 0x31, 0x81, 0x73, 0x1C, 0x72, 0x10, 0x75, 0x4C, 0x74, 0x20, + 0x77, 0x4C, 0x76, 0x20, 0x75, 0x3C, 0x74, 0x34, 0x77, 0x3C, 0x76, 0x34, + 0x73, 0x1C, 0x72, 0x10, 0x3C, 0x3C, 0x73, 0x3C, 0x72, 0x34, 0x00, 0xA2, + 0x4F, 0x2A, 0x39, 0x2C, 0xBE, 0x3C, 0x00, 0xA2, 0x19, 0x28, 0x80, 0x3C, + 0x12, 0xB6, 0x7E, 0x4E, 0x39, 0x28, 0x00, 0x3C, 0x02, 0xA1, 0x2A, 0xF1, + 0xB5, 0x1D, 0x1A, 0xE4, 0x7D, 0x28, 0x50, 0x3C, 0x86, 0x1D, 0x18, 0xE4, + 0x16, 0xE0, 0x40, 0x28, 0x1E, 0xE4, 0x4A, 0x1D, 0x08, 0xE4, 0x40, 0x28, + 0x1E, 0xE4, 0x84, 0x28, 0x2E, 0xE4, 0x0A, 0x1D, 0x61, 0xE1, 0x20, 0xC4, + 0x2E, 0xE4, 0x57, 0x20, 0x84, 0xE1, 0x22, 0x00, 0x00, 0x88, 0x02, 0x02, + 0x31, 0x81, 0x3A, 0xF0, 0x01, 0x29, 0x13, 0x1D, 0x02, 0x02, 0x02, 0xE0, + 0x82, 0xE0, 0x2E, 0xE4, 0x09, 0x3D, 0x41, 0x28, 0x0A, 0x3C, 0x04, 0xAF, + 0x31, 0x3D, 0x7B, 0x28, 0x09, 0x3D, 0x7C, 0x28, 0x82, 0xE0, 0x11, 0x3D, + 0x84, 0x28, 0x09, 0x81, 0x02, 0xE0, 0x94, 0xE0, 0x5C, 0x00, 0x00, 0xE0, + 0x40, 0x02, 0x00, 0xE0, 0x02, 0xAF, 0x60, 0x02, 0x11, 0x35, 0x73, 0x4C, + 0x72, 0x20, 0x92, 0xE0, 0x12, 0x21, 0x05, 0xA1, 0x41, 0x2A, 0x11, 0x3D, + 0x75, 0x4C, 0x74, 0x20, 0x3B, 0xF0, 0x0A, 0x4D, 0x0A, 0x4D, 0x12, 0x21, + 0x12, 0x3D, 0x12, 0x35, 0x12, 0x35, 0x77, 0x4C, 0x76, 0x20, 0x35, 0xF0, + 0xA0, 0x02, 0x00, 0xE0, 0x0A, 0x28, 0x12, 0x3D, 0x1A, 0xE0, 0x41, 0x18, + 0x06, 0xA2, 0x92, 0xE0, 0x00, 0x02, 0x61, 0xE1, 0x2E, 0xE4, 0x01, 0x3D, + 0x57, 0x1D, 0x84, 0xE1, 0x22, 0x00, 0x00, 0x88, 0x7C, 0x1A, 0x7B, 0x1C, + 0x11, 0x2B, 0x11, 0x2D, 0x11, 0x81, 0x11, 0x81, 0x4B, 0xF0, 0x28, 0xF0, + 0x82, 0xE0, 0x01, 0x3D, 0x06, 0xA2, 0x2E, 0xE4, 0x02, 0xE0, 0x94, 0xE0, + 0x5E, 0x00, 0x00, 0xE0, 0x40, 0x02, 0x00, 0xE0, 0x02, 0xAF, 0x60, 0x02, + 0x02, 0xAF, 0x40, 0x02, 0x02, 0xE0, 0x92, 0xE0, 0x11, 0x23, 0x73, 0x4C, + 0x72, 0x20, 0x0A, 0x3C, 0x11, 0x3D, 0x11, 0x35, 0x66, 0xE0, 0x09, 0x4F, + 0x02, 0x02, 0x61, 0xE1, 0x20, 0xC4, 0x1E, 0xF4, 0x7A, 0x1D, 0x84, 0xE1, + 0x22, 0x00, 0x00, 0x88, 0x2E, 0xE4, 0x31, 0x81, 0x3A, 0xF0, 0x01, 0x29, + 0x09, 0x3D, 0x02, 0xA2, 0x09, 0x3D, 0x06, 0xA2, 0xFE, 0xA2, 0x09, 0x81, + 0x31, 0x3D, 0x50, 0x28, 0x20, 0xC4, 0x00, 0xA2, 0x2E, 0xE4, 0x11, 0x3D, + 0x22, 0x00, 0x00, 0x88, 0x02, 0x02, 0x61, 0xE1, 0x1B, 0xE0, 0x31, 0x2B, + 0x90, 0x1D, 0x84, 0xE1, 0x03, 0xA2, 0x24, 0xE4, 0x19, 0x18, 0x42, 0xE0, + 0x00, 0x88, 0x02, 0x02, 0x61, 0xE1, 0x21, 0xAE, 0x09, 0x29, 0xAE, 0x1D, + 0x84, 0xE1, 0x22, 0x00, 0x01, 0x2D, 0xE6, 0xF0, 0x09, 0x29, 0x1A, 0xF1, + 0x15, 0x1C, 0x14, 0x10, 0x36, 0xF0, 0x50, 0x1C, 0x42, 0xE0, 0x62, 0xF0, + 0x46, 0xE0, 0x50, 0x0C, 0x94, 0xE0, 0x04, 0xA0, 0x82, 0xE0, 0x49, 0xE0, + 0x00, 0xA2, 0x31, 0x81, 0x11, 0x81, 0x11, 0x81, 0x57, 0x20, 0x12, 0xE4, + 0x12, 0x29, 0x12, 0x3D, 0x62, 0xE1, 0x00, 0x02, 0x61, 0xE1, 0x2E, 0xE4, + 0x84, 0xE1, 0x22, 0x00, 0x00, 0x88, 0xF0, 0x02, 0x12, 0x29, 0x98, 0xF0, + 0x3F, 0x28, 0xEF, 0x1D, 0x1A, 0xE0, 0x03, 0x3C, 0x12, 0x29, 0x02, 0x3C, + 0x12, 0x29, 0x5E, 0xF1, 0x04, 0x3C, 0x70, 0xB6, 0x03, 0x3C, 0x12, 0x29, + 0x02, 0x3C, 0x02, 0xAF, 0x0A, 0x29, 0x12, 0x81, 0x04, 0x3C, 0x1A, 0xE0, + 0x04, 0x3C, 0x04, 0x4C, 0x02, 0xAE, 0x1A, 0xE0, 0x02, 0xAF, 0x12, 0x29, + 0x68, 0xF0, 0x02, 0xA8, 0x04, 0x28, 0x03, 0x3C, 0x0A, 0x29, 0x02, 0x3C, + 0x02, 0x28, 0x8A, 0xF0, 0x12, 0x81, 0x12, 0x81, 0x04, 0x28, 0x11, 0x3D, + 0x03, 0x28, 0x11, 0x3D, 0x11, 0x81, 0x11, 0x81, 0xAE, 0xF0, 0x11, 0x3D, + 0x4A, 0xF0, 0x11, 0x3F, 0x01, 0xA2, 0x01, 0x29, 0x11, 0x81, 0x57, 0x20, + 0x12, 0xE4, 0x01, 0x29, 0x19, 0x28, 0x28, 0xE4, 0x4F, 0x28, 0x2E, 0xE4, + 0xAA, 0x28, 0x28, 0xE4, 0x40, 0x28, 0x2A, 0xE4, 0x44, 0x20, 0x1E, 0xE4, + 0x58, 0xF0, 0x04, 0xA8, 0x50, 0x3C, 0x80, 0x2C, 0x2A, 0xE4, 0x1A, 0x4C, + 0x00, 0xA2, 0x38, 0xF0, 0x04, 0xA8, 0xAA, 0x28, 0x14, 0x22, 0x02, 0xA0, + 0x50, 0x28, 0x0F, 0x3C, 0x50, 0x3C, 0x52, 0xE0, 0x03, 0xA1, 0x15, 0x4E, + 0x02, 0xA8, 0xAA, 0x28, 0x2A, 0xE4, 0x39, 0x1C, 0x86, 0x1D, 0x1E, 0xE4, + 0x5A, 0xF0, 0x1A, 0x4C, 0x04, 0xA8, 0xAA, 0x28, 0x71, 0x1D, 0x1E, 0xE4, + 0xAE, 0x28, 0xB8, 0xF6, 0x1A, 0x28, 0xD8, 0xF6, 0x02, 0xA0, 0x0F, 0x28, + 0xAE, 0x3C, 0x20, 0xA9, 0x1E, 0xE4, 0x42, 0xF0, 0x20, 0xA1, 0x0F, 0x3C, + 0x45, 0x06, 0x1E, 0xE4, 0x0E, 0xF6, 0x3F, 0x18, 0xAE, 0x28, 0x7D, 0x1A, + 0x1A, 0xE4, 0xD6, 0x28, 0x61, 0xE1, 0x2E, 0xE4, 0xAE, 0x3C, 0x08, 0xA9, + 0x00, 0x88, 0xF0, 0x02, 0x62, 0xE1, 0x00, 0x02, 0x19, 0x88, 0x3A, 0xF0, + 0xD6, 0x28, 0x22, 0x00, 0x3F, 0x28, 0x5B, 0x1E, 0x84, 0xE1, 0x22, 0x00, + 0x11, 0x29, 0x12, 0x3D, 0x11, 0x29, 0xC8, 0xF0, 0x12, 0x3D, 0x12, 0xB6, + 0x07, 0xA1, 0x11, 0x2B, 0x4E, 0xF1, 0x12, 0x3D, 0x12, 0x3D, 0x00, 0xA2, + 0x42, 0x18, 0x02, 0xA0, 0x02, 0xAE, 0x11, 0x29, 0x03, 0xA8, 0x09, 0x2B, + 0x11, 0x29, 0x12, 0x3D, 0x12, 0x81, 0x12, 0x29, 0x0A, 0x3D, 0x16, 0xB6, + 0x11, 0x2B, 0x11, 0x29, 0x12, 0x3D, 0x02, 0xAA, 0x11, 0x81, 0x12, 0x3D, + 0x16, 0xB6, 0x05, 0xA8, 0xF0, 0x02, 0x62, 0xE1, 0x30, 0x03, 0x61, 0xE1, + 0x65, 0x1E, 0x84, 0xE1, 0x3F, 0x00, 0x22, 0xD0, 0x3F, 0x28, 0x2E, 0xE4, + 0x11, 0x3D, 0x12, 0x29, 0x08, 0x28, 0xF8, 0x1E, 0x1E, 0xE4, 0x48, 0xF1, + 0x1E, 0xE4, 0x96, 0xE0, 0x70, 0x03, 0x00, 0xE0, 0x6D, 0x3C, 0x09, 0x08, + 0x08, 0x28, 0x3E, 0x1F, 0x1E, 0xE4, 0x96, 0xE0, 0x70, 0x03, 0x00, 0xE0, + 0x2E, 0xE4, 0x6D, 0x3C, 0x6D, 0x08, 0xE0, 0x1F, 0x70, 0x03, 0x63, 0xE1, + 0xF8, 0x1E, 0x1E, 0xE4, 0x08, 0x3C, 0xEA, 0x1F, 0x1E, 0xE4, 0x08, 0x28, + 0x1E, 0xE4, 0x96, 0xE0, 0x70, 0x03, 0x00, 0xE0, 0x70, 0x03, 0x00, 0xE0, + 0x08, 0x28, 0x3E, 0x1F, 0xEA, 0x1F, 0x1E, 0xE4, 0x09, 0x28, 0x96, 0xE0, + 0x70, 0x03, 0x00, 0xE0, 0x6D, 0x3C, 0x08, 0x08, 0x6D, 0x08, 0xE0, 0x1F, + 0x1E, 0xE4, 0x96, 0xE0, 0x38, 0xF2, 0x3F, 0x28, 0x2E, 0xE4, 0x6D, 0x3C, + 0x00, 0xE0, 0x08, 0x28, 0x69, 0x1F, 0x1E, 0xE4, 0x3E, 0x1F, 0x1E, 0xE4, + 0x96, 0xE0, 0x90, 0x03, 0x96, 0xE0, 0xB0, 0x03, 0x00, 0xE0, 0x08, 0x28, + 0x09, 0x08, 0x08, 0x28, 0x3E, 0x1F, 0x1E, 0xE4, 0x6D, 0x28, 0x2D, 0x20, + 0x1E, 0xE4, 0x6D, 0x3C, 0x1E, 0xE4, 0x96, 0xE0, 0x90, 0x03, 0x00, 0xE0, + 0xB0, 0x03, 0x00, 0xE0, 0x6D, 0x28, 0xE0, 0x1F, 0x6D, 0x08, 0xE0, 0x1F, + 0x1E, 0xE4, 0x96, 0xE0, 0x69, 0x1F, 0x1E, 0xE4, 0x2E, 0xE4, 0x6D, 0x3C, + 0x1E, 0xE4, 0x08, 0x28, 0x90, 0x03, 0x63, 0xE1, 0x08, 0x28, 0xB0, 0x03, + 0x63, 0xE1, 0xEA, 0x1F, 0x08, 0x28, 0x08, 0x3C, 0xEA, 0x1F, 0x1E, 0xE4, + 0x1E, 0xE4, 0x96, 0xE0, 0x90, 0x03, 0x00, 0xE0, 0x90, 0x03, 0x00, 0xE0, + 0x08, 0x28, 0x3E, 0x1F, 0xEA, 0x1F, 0x1E, 0xE4, 0x09, 0x28, 0x96, 0xE0, + 0x96, 0xE0, 0xB0, 0x03, 0x00, 0xE0, 0x08, 0x28, 0x00, 0xE0, 0x08, 0x28, + 0x3E, 0x1F, 0x1E, 0xE4, 0x1E, 0xE4, 0x09, 0x28, 0x96, 0xE0, 0xB0, 0x03, + 0x1E, 0xE4, 0x6D, 0x3C, 0x08, 0x08, 0xEA, 0x1F, 0x90, 0x03, 0x00, 0xE0, + 0x6D, 0x28, 0x2D, 0x20, 0x6D, 0x28, 0xE0, 0x1F, 0x1E, 0xE4, 0x96, 0xE0, + 0x1E, 0xE4, 0x96, 0xE0, 0xB0, 0x03, 0x00, 0xE0, 0x2E, 0xE4, 0x6D, 0x3C, + 0x6D, 0x08, 0xE0, 0x1F, 0x70, 0x03, 0x63, 0xE1, 0x08, 0x3C, 0x4E, 0xFB, + 0x21, 0xAE, 0x03, 0xA2, 0x06, 0x3C, 0xFE, 0xA2, 0x1B, 0x1F, 0x84, 0xE1, + 0x6E, 0xFB, 0x13, 0xE0, 0x05, 0x18, 0x09, 0x29, 0x68, 0xF1, 0x12, 0x29, + 0x01, 0x2D, 0xF6, 0xF0, 0x09, 0x29, 0x24, 0xF1, 0x15, 0x1C, 0x14, 0x10, + 0x36, 0xF0, 0x39, 0x1C, 0x42, 0xE0, 0x76, 0xF0, 0x46, 0xE0, 0x39, 0x0C, + 0x01, 0x06, 0x02, 0xE0, 0x84, 0xE0, 0x49, 0xE0, 0x31, 0x81, 0x11, 0x81, + 0x11, 0x81, 0x06, 0x3C, 0x00, 0x06, 0x00, 0xE0, 0x24, 0xE4, 0x06, 0x28, + 0x06, 0x28, 0x02, 0x3D, 0x02, 0xA2, 0x94, 0xE0, 0x02, 0xA0, 0x08, 0x28, + 0x13, 0x3D, 0x02, 0xAE, 0x2E, 0xE4, 0x28, 0xF5, 0x19, 0x18, 0x08, 0x3C, + 0x0F, 0xC7, 0x00, 0xA2, 0x00, 0x06, 0x61, 0xE1, 0x05, 0x3C, 0x74, 0xB6, + 0x3F, 0x28, 0x11, 0x3D, 0x61, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, 0x20, 0xC4, + 0x00, 0x88, 0x00, 0x06, 0x62, 0xE1, 0x02, 0x02, 0x09, 0x3C, 0xEE, 0xFE, + 0x2E, 0xE4, 0x22, 0x00, 0x4E, 0xFF, 0x21, 0xA2, 0x07, 0x3C, 0xFE, 0xA2, + 0x18, 0xF1, 0x12, 0x29, 0x58, 0x1F, 0x84, 0xE1, 0x09, 0x29, 0xD4, 0xF0, + 0x05, 0x18, 0x09, 0x29, 0x72, 0xF0, 0x46, 0xE0, 0x01, 0x2D, 0xA2, 0xF0, + 0x02, 0xE0, 0x84, 0xE0, 0x49, 0xE0, 0x42, 0xE0, 0x11, 0x81, 0x11, 0x81, + 0x07, 0x3C, 0x01, 0x06, 0x00, 0xE0, 0x24, 0xE4, 0x07, 0x28, 0x31, 0x81, + 0x02, 0x3D, 0x02, 0xA2, 0x94, 0xE0, 0x00, 0x06, 0x09, 0x28, 0x13, 0x3D, + 0x02, 0xAE, 0x07, 0x28, 0x98, 0xF5, 0x19, 0x18, 0x09, 0x3C, 0x02, 0xA0, + 0x63, 0xE1, 0x0A, 0x3C, 0x3E, 0xFC, 0x2E, 0xE4, 0xFE, 0xA2, 0xB0, 0x03, + 0x64, 0xE1, 0x90, 0x03, 0x65, 0xE1, 0x5E, 0xFC, 0x07, 0x3C, 0x06, 0x3C, + 0x12, 0x29, 0xA6, 0x1F, 0x84, 0xE1, 0x40, 0x02, 0x84, 0xF2, 0x05, 0x18, + 0x09, 0x29, 0xC8, 0xF2, 0x0D, 0x4D, 0x15, 0x21, 0x56, 0xF2, 0x09, 0x29, + 0x06, 0x28, 0x10, 0xF1, 0x73, 0x1C, 0x72, 0x10, 0x0C, 0x10, 0x0D, 0x4D, + 0x15, 0x21, 0x64, 0xF0, 0x0D, 0x4D, 0x15, 0x21, 0x96, 0xF1, 0x0D, 0x1C, + 0x02, 0xE0, 0x84, 0xE0, 0x0D, 0x3C, 0x0C, 0x34, 0x07, 0x28, 0x0E, 0xF1, + 0x06, 0x3C, 0x01, 0x06, 0x0E, 0x10, 0x0D, 0x4D, 0x15, 0x21, 0x64, 0xF0, + 0x0D, 0x4D, 0x15, 0x21, 0x92, 0xF0, 0x0F, 0x1C, 0x02, 0xE0, 0x84, 0xE0, + 0x0F, 0x3C, 0x0E, 0x34, 0x11, 0x81, 0x11, 0x81, 0x07, 0x3C, 0x01, 0x06, + 0x06, 0x28, 0x15, 0x81, 0x15, 0x81, 0x31, 0x81, 0x94, 0xE0, 0x00, 0x06, + 0x00, 0xE0, 0x94, 0xF0, 0x02, 0xAE, 0x06, 0x28, 0x02, 0x3D, 0x02, 0xA2, + 0x00, 0xE0, 0x94, 0xF0, 0x07, 0x28, 0x13, 0x3D, 0x02, 0x3D, 0x02, 0xA2, + 0x94, 0xE0, 0x00, 0x06, 0x0A, 0x28, 0x14, 0x3D, 0x02, 0xAE, 0x07, 0x28, + 0x08, 0xE4, 0x19, 0x18, 0x0A, 0x3C, 0x02, 0xA0, 0x90, 0x03, 0x02, 0xE0, + 0x86, 0xE0, 0x6F, 0x1F, 0xB0, 0x03, 0x02, 0xE0, 0x88, 0xE0, 0x0C, 0x3C, + 0x44, 0xCC, 0x02, 0xA1, 0x9A, 0xF0, 0x0D, 0x3C, 0xD1, 0x1F, 0x84, 0xE1, + 0xB0, 0x03, 0x64, 0xE1, 0x9A, 0xF0, 0x0C, 0x28, 0x13, 0x3D, 0x14, 0x29, + 0x90, 0x03, 0x63, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x14, 0x3D, 0x13, 0x29, + 0xDB, 0x1F, 0x84, 0xE1, 0x2E, 0xE4, 0x08, 0x3C, 0x0D, 0x08, 0x0C, 0x28, + 0x02, 0xAE, 0x19, 0x28, 0x7A, 0xF0, 0xD6, 0x28, 0x2E, 0xE4, 0x02, 0xA2, + 0x03, 0x3D, 0x42, 0x08, 0x02, 0xA1, 0x2A, 0xE4, 0x2E, 0xE4, 0x00, 0xA2, + 0x61, 0xE1, 0x98, 0xE0, 0x86, 0xE0, 0x0C, 0x3C, 0x84, 0xE1, 0x22, 0x00, + 0x0C, 0x88, 0x00, 0x06, 0x00, 0xE0, 0x02, 0xAE, 0x03, 0x29, 0x05, 0x20, + 0x02, 0xA8, 0x02, 0x29, 0x94, 0xE0, 0x02, 0x02, 0x02, 0x29, 0x11, 0x3D, + 0x03, 0x29, 0x3A, 0xF0, 0x02, 0xA0, 0x03, 0x29, 0x4A, 0xF0, 0x04, 0xA8, + 0x02, 0xE0, 0x82, 0xE0, 0x13, 0x81, 0x11, 0x3D, 0x0C, 0x3C, 0x02, 0xA1, + 0x2A, 0xE4, 0x00, 0x06, 0x61, 0xE1, 0x0E, 0x3C, 0x42, 0x28, 0x0D, 0x3C, + 0x84, 0xE1, 0x22, 0x00, 0x0C, 0x88, 0x00, 0x06, 0x02, 0xA8, 0x44, 0xF0, + 0x01, 0x29, 0x1A, 0x20, 0x0E, 0x28, 0x11, 0x81, 0x6A, 0xF0, 0x0E, 0x18, + 0x01, 0x29, 0x1E, 0xF7, 0x0E, 0x3C, 0x16, 0xE0, 0x0E, 0x28, 0x01, 0x3D, + 0xFE, 0xA2, 0x14, 0x3D, 0x02, 0xA1, 0x0D, 0x28, 0x0E, 0x3C, 0x16, 0xE0, + 0x02, 0xA0, 0x0C, 0x28, 0x62, 0xF6, 0x0D, 0x3C, 0x26, 0xE4, 0x02, 0xA1, + 0x6D, 0x28, 0x2E, 0xE4, 0x64, 0xE1, 0x90, 0x03, 0x63, 0xE1, 0x44, 0xCC, + 0x13, 0x29, 0x3A, 0x20, 0x84, 0xE1, 0xB0, 0x03, 0x63, 0xE1, 0x90, 0xE1, + 0x28, 0xE4, 0x14, 0x19, 0x0B, 0x29, 0xB0, 0x03, 0x64, 0xE1, 0x91, 0x03, + 0x2E, 0xE4, 0x14, 0x3D, 0x03, 0x29, 0x14, 0x3D, 0x44, 0xCC, 0x02, 0xA1, + 0x26, 0xE4, 0x19, 0x28, 0x84, 0xE1, 0x02, 0x02, 0x61, 0xE1, 0x20, 0xC4, + 0x31, 0x81, 0x28, 0xE4, 0x01, 0x29, 0x4F, 0x20, 0x08, 0xA2, 0x18, 0x05, + 0x61, 0xE1, 0x2E, 0xE4, 0x00, 0xE0, 0x2E, 0xE4, 0x11, 0x3D, 0x1F, 0xC7, + 0x0C, 0xA8, 0x07, 0x29, 0x9E, 0xE0, 0x18, 0x05, 0xFF, 0x7F, 0x08, 0xE0, + 0x2E, 0xE4, 0x07, 0x3D, 0x07, 0x29, 0x9E, 0xE0, 0x18, 0x05, 0x00, 0xE0, + 0x81, 0x3C, 0x2E, 0xE4, 0x07, 0x3D, 0x0A, 0xA8, 0x07, 0x29, 0x9E, 0xE0, + 0x18, 0x05, 0x00, 0xE0, 0x02, 0xA0, 0x81, 0x28, 0x07, 0x3D, 0x06, 0xA8, + 0x00, 0xA2, 0x28, 0xE4, 0x7F, 0x18, 0x81, 0x3C, 0x18, 0x05, 0x00, 0xE0, + 0x2E, 0xE4, 0x81, 0x3C, 0x07, 0x3D, 0x56, 0xE0, 0x07, 0x29, 0x9E, 0xE0, + 0x7F, 0x28, 0x18, 0x05, 0x61, 0xE1, 0x2E, 0xE4, 0x84, 0xE1, 0x01, 0xA2, + 0x44, 0xCC, 0x02, 0xA1, 0x1A, 0xE0, 0x04, 0xA8, 0x11, 0x29, 0x88, 0x20, + 0x02, 0xB6, 0x02, 0xA2, 0x07, 0x1A, 0x41, 0xE0, 0x7F, 0x28, 0x18, 0x05, + 0x61, 0xE1, 0x2E, 0xE4, 0x84, 0xE1, 0x00, 0xA2, 0x44, 0xCC, 0x02, 0xA1, + 0x1B, 0xE0, 0x07, 0xA8, 0x11, 0x2B, 0x98, 0x20, 0x1A, 0xE0, 0x02, 0xA1, + 0xEB, 0x18, 0x42, 0xE0, 0x7F, 0x28, 0x18, 0x05, 0x61, 0xE1, 0x2E, 0xE4, + 0x84, 0xE1, 0x49, 0xE0, 0x44, 0xCC, 0x02, 0xA1, 0x02, 0xA2, 0xF1, 0xB5, + 0x11, 0x29, 0xA6, 0x20, 0x00, 0x3C, 0x81, 0x28, 0x2E, 0xE4, 0x0E, 0xB6, + 0x92, 0xE0, 0x00, 0x08, 0x18, 0x05, 0x04, 0xE0, 0x00, 0x28, 0x0A, 0xF1, + 0x01, 0x29, 0x94, 0xE0, 0x38, 0xF0, 0x7F, 0x18, 0x00, 0x3C, 0x02, 0xA0, + 0x81, 0x18, 0x00, 0x28, 0x00, 0x3C, 0x00, 0xA2, 0xFE, 0xA2, 0x81, 0x3C, + 0x00, 0xA2, 0x08, 0xF7, 0x02, 0x3D, 0x0E, 0xA2, 0x2E, 0xE4, 0x84, 0x3C, + 0xA8, 0x4C, 0xA7, 0x24, 0x03, 0xAE, 0xD8, 0x2A, 0x00, 0x28, 0xA8, 0x3C, + 0xA7, 0x34, 0x56, 0xE0, 0x06, 0x21, 0x1E, 0xE4, 0x2E, 0xE4, 0x84, 0x3C, + 0x55, 0xE0, 0x07, 0xAE, 0x17, 0xE0, 0x22, 0x2A, 0x56, 0xE0, 0x0A, 0xAE, + 0xFD, 0x20, 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, 0x02, 0x01, 0xC2, 0xE0, + 0x17, 0xE0, 0x22, 0x2A, 0x06, 0x21, 0x1E, 0xE4, 0xFD, 0x20, 0x1E, 0xE4, + 0x55, 0xE0, 0x09, 0xAE, 0x0F, 0xAE, 0x83, 0xE0, 0x56, 0xE0, 0x06, 0xAE, + 0x2E, 0xE4, 0x13, 0x02, 0xC2, 0xE0, 0x56, 0xE0, 0x22, 0x2A, 0x06, 0x21, + 0x1E, 0xE4, 0x92, 0xE0, 0x1E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, 0x17, 0xE0, + 0x83, 0xE0, 0x56, 0xE0, 0x06, 0xAE, 0xFD, 0x20, 0x15, 0x02, 0xC2, 0xE0, + 0x56, 0xE0, 0x0F, 0xAE, 0x06, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, 0x44, 0x00, 0xC0, 0xE0, + 0x58, 0xF0, 0x80, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, + 0xC1, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x20, 0xAF, 0x56, 0xE0, 0x03, 0xAE, + 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, + 0x2E, 0xE4, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0x07, 0xA8, 0x1B, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, 0x05, 0xA1, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0xA2, 0xC1, 0xE0, 0x2E, 0xE4, + 0x07, 0xA8, 0x23, 0xAF, 0x05, 0xA1, 0x07, 0xA8, 0x23, 0xAF, 0x44, 0x00, + 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, 0x20, 0xAF, 0x44, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x02, 0xA8, + 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x60, 0xA8, 0x18, 0xE0, 0x88, 0xC7, + 0xA4, 0xCC, 0x3E, 0xA8, 0x02, 0xA2, 0x9E, 0xE0, 0x00, 0x05, 0x00, 0xE0, + 0x20, 0x04, 0xC0, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, 0x02, 0x21, 0x1E, 0xE4, + 0xDA, 0xF7, 0x02, 0xA8, 0x1E, 0xE4, 0x0F, 0x21, 0x1E, 0xE4, 0x04, 0xAF, + 0x1E, 0xA8, 0x5C, 0x21, 0x0B, 0xE4, 0x17, 0x21, 0x56, 0xE0, 0x09, 0xAE, + 0x1C, 0x21, 0x1E, 0xE4, 0x09, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0x20, 0xAE, + 0x1E, 0xE4, 0x17, 0x9F, 0x56, 0xE0, 0xFF, 0x1F, 0x62, 0x00, 0x64, 0xE1, + 0x17, 0x9F, 0xDB, 0x21, 0x6D, 0x21, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, + 0x7A, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x75, 0x21, 0x84, 0xE1, + 0x02, 0x00, 0x22, 0xD0, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, 0x14, 0x9E, + 0x0F, 0x3E, 0xEC, 0x3C, 0x2E, 0xE4, 0x0D, 0x04, 0x20, 0x00, 0x05, 0xE0, + 0x41, 0x00, 0xC0, 0xE0, 0x11, 0xD1, 0x0F, 0x08, 0x42, 0xE0, 0x11, 0xAE, + 0x80, 0x01, 0x00, 0xE0, 0x5E, 0xF8, 0x40, 0x06, 0x12, 0xD1, 0x20, 0xCE, + 0x40, 0x0B, 0x11, 0xD1, 0x29, 0xCA, 0x13, 0x01, 0xEC, 0x88, 0xC0, 0x00, + 0x01, 0xA2, 0x06, 0xA2, 0x2E, 0xE4, 0xF9, 0xF7, 0x94, 0xE0, 0x66, 0x28, + 0x7A, 0x21, 0x1E, 0xE4, 0x92, 0xE0, 0x24, 0xE4, 0x02, 0xA1, 0x7F, 0x28, + 0xB1, 0x21, 0x1E, 0xE4, 0x0C, 0xC4, 0x49, 0xE0, 0x95, 0xE0, 0x66, 0x2A, + 0x8E, 0xF7, 0x82, 0xE0, 0x23, 0xA1, 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, + 0x95, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0x49, 0xF0, 0xB1, 0x21, 0x1E, 0xE4, + 0x04, 0xC4, 0x7F, 0x2A, 0x18, 0xE0, 0x86, 0xC7, 0xA4, 0xCC, 0x2E, 0xE4, + 0x00, 0xE0, 0x9A, 0xE0, 0x40, 0x06, 0x00, 0xE0, 0x01, 0xE0, 0x07, 0xAE, + 0x9C, 0xE0, 0x00, 0x05, 0x06, 0x21, 0x1E, 0xE4, 0x9F, 0xE0, 0x00, 0x05, + 0x89, 0xE0, 0x0F, 0x21, 0x1E, 0xE4, 0x04, 0xAF, 0x2B, 0x21, 0x1E, 0xE4, + 0x1E, 0xA8, 0x69, 0xF0, 0x85, 0xE0, 0x20, 0xAE, 0x56, 0xE0, 0x09, 0xAE, + 0xD7, 0x21, 0x1E, 0xE4, 0x17, 0x9F, 0x42, 0xE0, 0x17, 0x9F, 0xDB, 0x21, + 0x1B, 0xE4, 0x89, 0xE0, 0x57, 0x20, 0x2E, 0xE4, 0xE6, 0x21, 0x1E, 0xE4, + 0x57, 0x20, 0x2E, 0xE4, 0x08, 0xAE, 0x58, 0x4C, 0x23, 0xA8, 0x60, 0x00, + 0xC1, 0xE0, 0x58, 0x4C, 0x57, 0x4C, 0x58, 0x20, 0x39, 0xF0, 0x23, 0xA1, + 0xC2, 0xE0, 0x02, 0xA2, 0x2E, 0xE4, 0x08, 0xAE, 0xC0, 0xE0, 0x0E, 0x04, + 0xC2, 0xE0, 0x0D, 0x04, 0x22, 0xD0, 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, + 0x15, 0x21, 0xF5, 0x21, 0x84, 0xE1, 0x02, 0x00, 0x02, 0x00, 0x22, 0xD0, + 0x17, 0x9F, 0x15, 0x4D, 0x16, 0x4D, 0x16, 0x21, 0xFC, 0x21, 0x84, 0xE1, + 0x0D, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x17, 0x9F, 0x89, 0x28, 0x89, 0x3C, + 0x56, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x88, 0x3C, 0x00, 0xA2, 0x32, 0xF0, + 0x6F, 0x22, 0x1E, 0xE4, 0x8E, 0x3C, 0x8D, 0x3C, 0x24, 0xE4, 0x89, 0x28, + 0x2A, 0xE4, 0x88, 0x28, 0x8A, 0x28, 0x43, 0x01, 0xC2, 0xE0, 0x89, 0x28, + 0xC2, 0xE0, 0x00, 0xA2, 0x44, 0x01, 0xC2, 0xE0, 0x20, 0xAE, 0x02, 0xA1, + 0x8B, 0x28, 0x49, 0x01, 0x42, 0x01, 0xC2, 0xE0, 0x02, 0xA1, 0x8C, 0x4C, + 0x87, 0x2A, 0x20, 0xAE, 0x02, 0x21, 0x1E, 0xE4, 0x2E, 0xE4, 0x4E, 0x01, + 0xC2, 0xE0, 0x42, 0xE0, 0x23, 0xE4, 0x8C, 0x1A, 0x8E, 0x2A, 0x89, 0x28, + 0x03, 0xA2, 0x8E, 0x4C, 0x10, 0xAE, 0x8D, 0x28, 0x03, 0xAE, 0x8F, 0x2A, + 0x8F, 0x3E, 0x15, 0xB6, 0xC1, 0xE0, 0x56, 0xE0, 0x21, 0xAE, 0x03, 0xA9, + 0x4D, 0x01, 0xC2, 0xE0, 0xE9, 0xF7, 0x4B, 0x01, 0x8D, 0x2A, 0x4A, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0x65, 0xF0, 0x8B, 0x1A, 0x8D, 0x3E, 0x03, 0xA0, + 0x01, 0xA2, 0x8E, 0x3E, 0x03, 0xA0, 0x8E, 0x2A, 0x4A, 0xF1, 0x88, 0x28, + 0x2E, 0xE4, 0x8D, 0x3E, 0x9E, 0xFD, 0x32, 0xF0, 0x8C, 0x18, 0x8E, 0x28, + 0xE8, 0xF7, 0x4B, 0x01, 0xC0, 0xE0, 0xCE, 0xF7, 0x4D, 0x01, 0xC2, 0xE0, + 0x20, 0xAE, 0x04, 0xA2, 0x90, 0xE1, 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, + 0x85, 0x28, 0xE8, 0xF7, 0x4B, 0x01, 0xC0, 0xE0, 0x24, 0xE4, 0x84, 0x28, + 0x2E, 0xE4, 0x89, 0x3C, 0x94, 0xE0, 0x84, 0x08, 0xB0, 0x01, 0x04, 0xE0, + 0x94, 0xE0, 0x40, 0xA0, 0x02, 0x3F, 0x57, 0x2A, 0x04, 0xE0, 0x2E, 0xE4, + 0x02, 0x3F, 0x58, 0x2A, 0x02, 0x2B, 0x94, 0xE0, 0x89, 0x08, 0xB0, 0x01, + 0x02, 0x2B, 0x94, 0xE0, 0x40, 0xA0, 0x8B, 0x3E, 0x80, 0x23, 0x1E, 0xE4, + 0x2E, 0xE4, 0x8C, 0x3E, 0xFF, 0x0F, 0x1E, 0xE4, 0x1E, 0x24, 0x1E, 0xE4, + 0x74, 0x26, 0x1E, 0xE4, 0x27, 0x23, 0x1E, 0xE4, 0x1E, 0xE4, 0x59, 0x3C, + 0x1E, 0x3C, 0x00, 0xA2, 0x59, 0x24, 0x09, 0xC0, 0x7A, 0xF0, 0x6E, 0x03, + 0xE8, 0x22, 0x08, 0xE4, 0x00, 0xC0, 0x58, 0x4C, 0x00, 0xC0, 0x58, 0x3C, + 0x59, 0x34, 0x09, 0xC0, 0x59, 0x4C, 0x1E, 0x24, 0x18, 0x25, 0x1E, 0xE4, + 0x02, 0xE4, 0x46, 0xE0, 0x44, 0x4E, 0x52, 0x26, 0x9A, 0xF1, 0x15, 0x0C, + 0x1E, 0xE4, 0x22, 0x23, 0x54, 0xF1, 0x08, 0xA1, 0x0A, 0xF2, 0x02, 0xA1, + 0x0E, 0x23, 0x0A, 0xE4, 0x0A, 0xA1, 0xDA, 0xF1, 0x02, 0xA1, 0x0E, 0x23, + 0x0A, 0xE4, 0x02, 0xA1, 0x0A, 0xE4, 0x04, 0xA1, 0x09, 0x23, 0x0A, 0xE4, + 0x0A, 0xE4, 0x0A, 0xA1, 0x02, 0xA1, 0xB8, 0x22, 0x11, 0x23, 0x04, 0xE4, + 0x02, 0xA0, 0xC1, 0x22, 0x52, 0x24, 0x3E, 0xF6, 0xEF, 0x09, 0x1E, 0xE4, + 0x58, 0x3C, 0x59, 0x34, 0x09, 0xC0, 0x44, 0x4C, 0xAA, 0xF5, 0x27, 0x0A, + 0x1E, 0xE4, 0x00, 0xC0, 0x1B, 0xE0, 0x92, 0x2A, 0x1A, 0xE0, 0x4E, 0x28, + 0x4F, 0x28, 0x11, 0x23, 0x08, 0xE4, 0x5A, 0xE0, 0x1E, 0xE4, 0x11, 0x23, + 0x08, 0xE4, 0x93, 0x18, 0xAA, 0xF4, 0x9B, 0x24, 0x1E, 0xE4, 0x67, 0x0C, + 0x0D, 0x3C, 0x52, 0x2C, 0x9A, 0xF0, 0x94, 0x28, 0x6D, 0x25, 0x1E, 0xE4, + 0x0E, 0x3C, 0x44, 0x2C, 0x72, 0x0C, 0x1E, 0xE4, 0x0C, 0x0C, 0x1E, 0xE4, + 0x93, 0x3C, 0x4F, 0x28, 0x92, 0x3C, 0x4E, 0x28, 0x9D, 0x22, 0x0A, 0xE4, + 0xEF, 0x0D, 0x1E, 0xE4, 0x59, 0x24, 0x09, 0xC0, 0x94, 0x3E, 0x01, 0xA2, + 0x0E, 0x3C, 0x0D, 0x34, 0x00, 0xC0, 0x58, 0x4C, 0x04, 0xE4, 0x46, 0xE0, + 0x59, 0x4E, 0x1E, 0x26, 0x09, 0xC0, 0x6D, 0x25, 0x10, 0xE4, 0x9D, 0x22, + 0x52, 0x2E, 0x00, 0xC0, 0x58, 0x4C, 0x59, 0x24, 0x22, 0x23, 0x02, 0xE4, + 0x46, 0xE0, 0x44, 0x4E, 0x1E, 0xE4, 0x5A, 0xF0, 0x77, 0x06, 0x1E, 0xE4, + 0x0E, 0xE4, 0x22, 0x23, 0x0E, 0xE4, 0x95, 0x06, 0xF7, 0x09, 0x1E, 0xE4, + 0x04, 0xA2, 0x94, 0x22, 0xE5, 0x0B, 0x1E, 0xE4, 0x9D, 0x22, 0x0E, 0xE4, + 0x52, 0x26, 0x59, 0x4C, 0x1E, 0x24, 0x1A, 0xF0, 0x1E, 0x23, 0x02, 0xE4, + 0x46, 0xE0, 0x44, 0x4E, 0x0E, 0x3C, 0x44, 0x2C, 0x0D, 0x3C, 0x52, 0x2C, + 0x4E, 0x3C, 0x92, 0x28, 0x6D, 0x25, 0x1E, 0xE4, 0x2F, 0x27, 0x1E, 0xE4, + 0x4F, 0x3C, 0x93, 0x28, 0x00, 0xA2, 0x2E, 0xE4, 0xF8, 0xF7, 0xCC, 0xCB, + 0x02, 0xAE, 0x22, 0x4C, 0x04, 0xA2, 0xA8, 0xCF, 0x3F, 0xA8, 0x36, 0x2A, + 0x0A, 0xAE, 0x37, 0x4C, 0x3F, 0xA8, 0x32, 0x2A, 0x0A, 0xAE, 0x56, 0xE0, + 0x02, 0xAE, 0x1D, 0x4C, 0x02, 0xAE, 0x56, 0xE0, 0x80, 0xCF, 0x43, 0x4C, + 0x02, 0xAE, 0x2D, 0x4C, 0x1B, 0x4C, 0x02, 0xAE, 0x1A, 0xE0, 0x4E, 0x28, + 0x43, 0x4C, 0x02, 0xAE, 0x1D, 0x4C, 0x02, 0xAE, 0x02, 0xAE, 0x02, 0xA1, + 0x57, 0x28, 0xC2, 0xCF, 0x02, 0xAE, 0x3F, 0x4C, 0x02, 0xAE, 0x34, 0x4C, + 0x00, 0xCF, 0x43, 0x4C, 0x02, 0xAE, 0x42, 0x4C, 0x01, 0x00, 0x85, 0xD1, + 0x0B, 0x00, 0xD3, 0xD1, 0xE5, 0xD1, 0xC6, 0xCF, 0x6F, 0x4C, 0x6E, 0x24, + 0x01, 0x02, 0x61, 0xE1, 0x20, 0xC4, 0x01, 0x00, 0x84, 0xE1, 0x0F, 0x00, + 0x22, 0xD0, 0x00, 0xA2, 0x2A, 0xB4, 0x02, 0xAE, 0x31, 0x2B, 0x63, 0x23, + 0xEA, 0xCF, 0x73, 0x4C, 0x72, 0x20, 0xE8, 0xCF, 0x76, 0x20, 0xEC, 0xCF, + 0x75, 0x4C, 0x74, 0x20, 0x60, 0x00, 0x04, 0xE0, 0xEE, 0xCF, 0x77, 0x4C, + 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA8, 0xCF, 0xCB, 0x60, 0x02, 0x61, 0xE1, + 0x30, 0xCE, 0x70, 0x00, 0x7E, 0x23, 0x84, 0xE1, 0x1F, 0x00, 0x22, 0xD0, + 0x2E, 0xE4, 0x32, 0xCE, 0x11, 0x4D, 0x11, 0x21, 0x07, 0xC7, 0xF6, 0x07, + 0x61, 0xE1, 0x00, 0xA2, 0x28, 0xF0, 0x68, 0x4C, 0x67, 0x28, 0x11, 0x3D, + 0x0E, 0xA2, 0xF6, 0x07, 0x61, 0xE1, 0x2E, 0xE4, 0x69, 0x28, 0x9A, 0xF3, + 0x67, 0x28, 0x00, 0x3C, 0x00, 0x2A, 0x08, 0xF1, 0x02, 0xA8, 0x00, 0x5C, + 0x11, 0x3D, 0x02, 0xA2, 0x49, 0xF0, 0x0F, 0xA1, 0x49, 0xF0, 0x09, 0xA1, + 0x00, 0x2A, 0x7E, 0xF1, 0x0A, 0xA2, 0x1E, 0xF1, 0x11, 0x3D, 0x04, 0xA2, + 0x00, 0x5C, 0x6B, 0x28, 0xEE, 0xF0, 0x11, 0x3D, 0x0A, 0xA1, 0x00, 0x28, + 0x8A, 0xF0, 0x02, 0xA8, 0x11, 0x3F, 0x03, 0xA2, 0x24, 0xF0, 0x05, 0xA2, + 0x00, 0x28, 0x11, 0x3D, 0x06, 0xA2, 0x3E, 0xF0, 0xC8, 0xF5, 0x02, 0xA1, + 0x00, 0x3C, 0x02, 0xA1, 0x6B, 0x2A, 0xFF, 0x00, 0x0C, 0xE0, 0x69, 0x28, + 0x6A, 0xF0, 0x02, 0xA8, 0x00, 0x5C, 0x56, 0xE0, 0x11, 0x3F, 0x55, 0xB6, + 0x00, 0x28, 0x03, 0xA2, 0x00, 0x28, 0x11, 0x3D, 0x06, 0xA2, 0x3E, 0xF0, + 0x61, 0xE1, 0xEA, 0xF6, 0x00, 0x3C, 0x02, 0xA1, 0x68, 0x28, 0x00, 0x3C, + 0x0E, 0xA2, 0xF6, 0x07, 0x02, 0xA8, 0x00, 0x5C, 0x6A, 0x28, 0x2A, 0xE4, + 0x88, 0xF0, 0x0E, 0xA1, 0x00, 0x28, 0x88, 0xF1, 0xE9, 0xF1, 0x11, 0x81, + 0x3B, 0xF0, 0x67, 0x2A, 0x00, 0x2A, 0xBE, 0xF1, 0x11, 0x3D, 0x02, 0xA2, + 0x3B, 0xF0, 0x67, 0x2A, 0x89, 0xF0, 0x09, 0xA1, 0x11, 0x3D, 0x04, 0xA2, + 0x49, 0xF1, 0x11, 0x81, 0xEE, 0xF0, 0x11, 0x3D, 0x0A, 0xA2, 0x1E, 0xF1, + 0x8A, 0xF0, 0x02, 0xA8, 0x00, 0x5C, 0x6C, 0x28, 0x24, 0xF0, 0x05, 0xA2, + 0x0A, 0xA1, 0x00, 0x28, 0x08, 0xA2, 0x3E, 0xF0, 0x11, 0x3F, 0x03, 0xA2, + 0x00, 0x3C, 0x02, 0xA1, 0x00, 0x28, 0x11, 0x3D, 0x00, 0x5C, 0x6A, 0x28, + 0x48, 0xF5, 0x02, 0xA1, 0x03, 0xA2, 0x68, 0xF0, 0x02, 0xA8, 0x67, 0x4C, + 0x6E, 0xF1, 0x11, 0x3F, 0x55, 0xB6, 0x00, 0x28, 0x6A, 0x2A, 0xFF, 0x00, + 0x0C, 0xE0, 0x6C, 0x28, 0xC8, 0xF0, 0x02, 0xA8, 0x00, 0x5C, 0x52, 0xE0, + 0x6A, 0xF0, 0x02, 0xA8, 0x00, 0x5C, 0x6A, 0x28, 0x11, 0x3F, 0x55, 0xB6, + 0x00, 0x28, 0x03, 0xA2, 0x08, 0xA2, 0x3E, 0xF0, 0x11, 0x81, 0x5E, 0xF0, + 0x00, 0x3C, 0x02, 0xA1, 0x00, 0x28, 0x11, 0x3D, 0xC2, 0xE0, 0x02, 0xA2, + 0x2E, 0xE4, 0xEA, 0xF5, 0x01, 0x3C, 0x00, 0x3C, 0x00, 0xA2, 0x3C, 0x01, + 0x78, 0x08, 0x62, 0xE1, 0xF6, 0x07, 0x61, 0xE1, 0x06, 0xA1, 0x66, 0xF0, + 0x04, 0xA1, 0x11, 0x29, 0x02, 0xF1, 0x04, 0xA0, 0x67, 0x24, 0x0A, 0xE4, + 0x00, 0x28, 0x04, 0x3C, 0x06, 0xAE, 0x04, 0xA0, 0x04, 0xAE, 0x04, 0x28, + 0x54, 0xF0, 0x0C, 0xA1, 0x00, 0x08, 0x04, 0xE0, 0x04, 0x3C, 0x30, 0xA0, + 0x01, 0xA2, 0x9E, 0xF2, 0x04, 0x3C, 0x04, 0x08, 0x4A, 0xF0, 0x03, 0x3E, + 0x11, 0xA2, 0x02, 0x3E, 0x00, 0x28, 0x02, 0x3E, 0xE0, 0x00, 0x05, 0xE0, + 0x5A, 0xF0, 0x0C, 0xA1, 0x09, 0xAE, 0x00, 0x2A, 0xA0, 0x00, 0x05, 0xE0, + 0x58, 0xF0, 0x02, 0xA1, 0x02, 0x3E, 0x02, 0x0A, 0x03, 0x3C, 0x40, 0xA2, + 0x35, 0x00, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x20, 0xCE, 0x02, 0x08, + 0x42, 0xE0, 0x11, 0xAE, 0x24, 0xCE, 0x03, 0x28, 0x00, 0x06, 0x11, 0xD1, + 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x04, 0x3C, + 0x00, 0x06, 0x04, 0xE0, 0x3F, 0xA2, 0x24, 0xF0, 0x0F, 0xA2, 0x0C, 0xA1, + 0x84, 0xE1, 0x96, 0xE0, 0x04, 0x28, 0x45, 0xCC, 0xC2, 0xE0, 0x01, 0x08, + 0x12, 0x29, 0x81, 0x24, 0xC3, 0xE0, 0x11, 0xAF, 0x03, 0x2B, 0x3E, 0x01, + 0xC2, 0xE0, 0x01, 0x08, 0x12, 0x29, 0x3F, 0x01, 0xFF, 0x00, 0x09, 0xE0, + 0x13, 0x2B, 0x3E, 0x01, 0x78, 0x08, 0x62, 0xE1, 0x3F, 0x01, 0xC3, 0xE0, + 0x00, 0x28, 0x01, 0x3E, 0x21, 0xA0, 0x01, 0x2A, 0x04, 0xE4, 0x0C, 0xA1, + 0x00, 0x3C, 0x02, 0xA0, 0x0A, 0xE4, 0x88, 0x08, 0x62, 0xE1, 0x28, 0x24, + 0x04, 0xA1, 0x01, 0x3E, 0x61, 0xA0, 0x28, 0x24, 0x00, 0xA2, 0x6A, 0xE1, + 0x28, 0x24, 0x08, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x3C, 0x01, 0xC2, 0xE0, + 0x0D, 0xE4, 0x03, 0x0D, 0x1E, 0xE4, 0x94, 0x3C, 0x1D, 0x0F, 0x19, 0xE4, + 0x43, 0x2A, 0x15, 0x25, 0x02, 0xE4, 0x46, 0xE0, 0x44, 0x4E, 0x52, 0x26, + 0x15, 0x25, 0x0D, 0xE4, 0x12, 0xBC, 0x15, 0x25, 0x00, 0xE4, 0x04, 0xA1, + 0xA8, 0xB4, 0x0A, 0xA1, 0x15, 0x25, 0x0D, 0xE4, 0xFE, 0xBD, 0x15, 0x25, + 0x94, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, 0x29, 0x18, 0x02, 0xA2, 0x3A, 0xF0, + 0x39, 0x1C, 0x13, 0x74, 0x40, 0xBA, 0xD8, 0xF0, 0x1B, 0x28, 0x94, 0x3C, + 0x94, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, 0x3F, 0x18, 0x42, 0x18, 0x40, 0xBA, + 0x6A, 0xF0, 0x3F, 0x28, 0x4F, 0x28, 0x94, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, + 0x0D, 0xE4, 0x03, 0x0D, 0x1E, 0xE4, 0x9A, 0xF0, 0x02, 0xA2, 0x3A, 0xF0, + 0x45, 0x1C, 0x15, 0x25, 0x34, 0xF0, 0x02, 0xA1, 0x16, 0x28, 0x94, 0x3C, + 0x60, 0xE1, 0x17, 0x74, 0x4E, 0xF3, 0xBA, 0xF1, 0x02, 0xA2, 0x3A, 0xF0, + 0x00, 0x1D, 0x03, 0x09, 0x2A, 0x44, 0x16, 0xE0, 0x3F, 0x28, 0x94, 0x3C, + 0xED, 0xF2, 0x1F, 0x0D, 0x1E, 0xE4, 0x9A, 0xF2, 0x01, 0x1D, 0x11, 0x11, + 0x04, 0x09, 0x61, 0xE1, 0xEE, 0xF1, 0x94, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, + 0x18, 0x28, 0xBE, 0xF1, 0x1F, 0x0D, 0x18, 0xE4, 0xED, 0xF1, 0x1F, 0x0D, + 0x1E, 0xE4, 0x98, 0xF1, 0x03, 0x1D, 0x13, 0x11, 0x03, 0x09, 0x63, 0xE1, + 0x3F, 0x28, 0x94, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, 0x1E, 0xE4, 0xBA, 0xF0, + 0x2A, 0x44, 0x16, 0xE0, 0x05, 0x09, 0x65, 0xE1, 0x0D, 0xF1, 0x1F, 0x0D, + 0x02, 0xA2, 0x3A, 0xF0, 0x05, 0x1D, 0x15, 0x11, 0x06, 0xAE, 0x8A, 0x0C, + 0x1E, 0xE4, 0x94, 0x3C, 0x02, 0xA2, 0x34, 0xF0, 0x46, 0xE0, 0x73, 0xC8, + 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, 0x1E, 0xE4, 0x97, 0x0C, + 0x1E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x02, 0xA2, 0xC8, 0xF0, 0x93, 0x0C, + 0x1E, 0xE4, 0x97, 0x0C, 0x1E, 0xE4, 0x8E, 0x09, 0x37, 0xD0, 0xFF, 0x00, + 0x36, 0xD0, 0x94, 0x09, 0x59, 0x24, 0x09, 0xC0, 0x6A, 0xE1, 0x80, 0x00, + 0x59, 0x3C, 0x1E, 0x34, 0x00, 0xC0, 0x58, 0x4C, 0x93, 0x25, 0x1E, 0xE4, + 0x0C, 0x3C, 0x00, 0xA2, 0x3F, 0x03, 0x1E, 0xE4, 0x08, 0xF2, 0x2D, 0x28, + 0x44, 0x4E, 0x52, 0x26, 0x59, 0x4C, 0x1E, 0x24, 0xDA, 0x25, 0x1E, 0xE4, + 0xF2, 0xF0, 0x46, 0xE0, 0xDA, 0x25, 0x18, 0xE4, 0x43, 0x28, 0xBD, 0xF2, + 0xF0, 0xF6, 0x02, 0xA1, 0x86, 0xCB, 0x7D, 0xF2, 0xB8, 0xF6, 0x4F, 0x25, + 0x18, 0xE4, 0x94, 0xC8, 0x1E, 0xE4, 0x2E, 0xE4, 0x3B, 0x0D, 0x1E, 0xE4, + 0x6A, 0xE1, 0x1A, 0xB6, 0x02, 0xA2, 0x84, 0x09, 0x1E, 0xE4, 0xC6, 0x25, + 0x1E, 0xE4, 0x2E, 0xE4, 0x52, 0x26, 0x59, 0x4C, 0x1E, 0x24, 0x3F, 0x03, + 0x1E, 0xE4, 0xA2, 0xF0, 0x46, 0xE0, 0x44, 0x4E, 0x18, 0xE4, 0x43, 0x28, + 0xAD, 0xF0, 0xDA, 0x25, 0x0A, 0xF7, 0x60, 0xBB, 0x6D, 0xF0, 0xDA, 0x25, + 0x6A, 0xE1, 0x2E, 0xE4, 0x3D, 0x0D, 0x1E, 0xE4, 0x4F, 0x28, 0x05, 0x3C, + 0x38, 0x28, 0x2E, 0xE4, 0x0C, 0x3C, 0x02, 0xA2, 0x38, 0x3C, 0x16, 0xE0, + 0x38, 0x3C, 0x05, 0x28, 0x93, 0x25, 0x1E, 0xE4, 0x3F, 0x03, 0x1E, 0xE4, + 0x0C, 0x3C, 0x00, 0xA2, 0x0E, 0x4E, 0x0D, 0x2E, 0x59, 0x4C, 0x1E, 0x2C, + 0x1A, 0x26, 0x1E, 0xE4, 0x12, 0xF1, 0x46, 0xE0, 0x09, 0xC0, 0x1A, 0x26, + 0x18, 0xE4, 0x43, 0x28, 0x02, 0xA0, 0x00, 0xC0, 0x5A, 0x4C, 0x5B, 0x24, + 0x5A, 0x3C, 0x5B, 0x34, 0x09, 0xC0, 0x43, 0x08, 0x32, 0x28, 0x2E, 0xE4, + 0x9E, 0xF6, 0x00, 0xC0, 0x4B, 0x4C, 0x04, 0xAE, 0x1A, 0xE0, 0x36, 0x18, + 0x4D, 0x4C, 0x0A, 0xAE, 0x4C, 0x4C, 0x0A, 0xAE, 0x48, 0x4C, 0x0A, 0xAE, + 0x49, 0x28, 0x30, 0xCF, 0xC3, 0xD1, 0x82, 0xCF, 0x38, 0x4C, 0x04, 0xAE, + 0x49, 0x28, 0x96, 0xCF, 0x4A, 0x28, 0x00, 0x00, 0x7A, 0x4C, 0x02, 0xAE, + 0x48, 0x4C, 0x08, 0xAE, 0x78, 0x4C, 0x02, 0xAE, 0x79, 0x4C, 0x02, 0xAE, + 0x38, 0x4C, 0x04, 0xAE, 0x46, 0x4C, 0x02, 0xAE, 0x70, 0x24, 0xFA, 0x01, + 0x5E, 0x88, 0xC4, 0xCF, 0x3A, 0xF0, 0x0C, 0x28, 0xC8, 0xCF, 0x71, 0x4C, + 0x01, 0x00, 0x88, 0xD1, 0x3A, 0xF0, 0x38, 0x28, 0xE5, 0xD1, 0x28, 0xE4, + 0x04, 0xA1, 0x38, 0x28, 0x0E, 0xA8, 0x68, 0xC8, 0x2E, 0xE4, 0x02, 0x00, + 0xFE, 0x01, 0x04, 0xE0, 0x9E, 0x74, 0x9E, 0x3C, 0x38, 0x28, 0x88, 0xCC, + 0x50, 0xBA, 0x86, 0xCC, 0x4A, 0x4C, 0x0C, 0xAE, 0x47, 0x08, 0x1A, 0xE0, + 0x84, 0xC8, 0x03, 0x00, 0x40, 0xD0, 0x82, 0xCC, 0x02, 0x00, 0x85, 0xD1, + 0x2E, 0xE4, 0xF8, 0xF7, 0x80, 0xE1, 0x90, 0xE1, 0x3F, 0x00, 0xD0, 0xD1, + 0xF6, 0x0C, 0x18, 0xE4, 0x9B, 0x0C, 0x1E, 0xE4, 0xA3, 0xCB, 0x10, 0xA8, + 0xA0, 0xCB, 0x81, 0xE1, 0x1E, 0xE4, 0xB8, 0xF7, 0x10, 0x26, 0x09, 0xE4, + 0x5A, 0x28, 0xF8, 0xF7, 0xE0, 0xCB, 0xE9, 0x26, 0xA3, 0xCB, 0xA0, 0xCB, + 0x10, 0x27, 0x1A, 0xE4, 0x86, 0xD1, 0xC8, 0xF7, 0x10, 0x26, 0x09, 0xE4, + 0x1E, 0xE4, 0x04, 0x00, 0x85, 0xD1, 0x01, 0x00, 0x59, 0x3C, 0x1E, 0x34, + 0x06, 0xCB, 0x27, 0x27, 0x90, 0xE1, 0x28, 0xF0, 0xFE, 0xFF, 0x02, 0xE0, + 0x2A, 0xE4, 0x2D, 0x44, 0x04, 0xAF, 0x8A, 0xCB, 0x50, 0xBA, 0x86, 0xCC, + 0xFE, 0x01, 0x04, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x40, 0xD0, 0x88, 0xCC, + 0x00, 0x00, 0xD1, 0xD1, 0x00, 0x00, 0xD0, 0xD1, 0xF8, 0xF7, 0xE0, 0xCB, + 0xF8, 0xF7, 0x1C, 0xCB, 0x02, 0x00, 0x85, 0xD1, 0x2E, 0xE4, 0x6B, 0xE1, + 0x01, 0x00, 0xC2, 0xD1, 0x00, 0x00, 0x86, 0xD1, 0x00, 0x00, 0xC4, 0xD1, + 0x00, 0x00, 0xC5, 0xD1, 0xF8, 0xF7, 0xA0, 0xCB, 0x0E, 0x00, 0xD0, 0xD1, + 0xC4, 0xCF, 0x1A, 0xE0, 0x55, 0x4C, 0x54, 0x20, 0xC5, 0xD1, 0x00, 0x00, + 0xC2, 0xD1, 0x98, 0xF0, 0xC8, 0xD1, 0x03, 0x00, 0xC4, 0xD1, 0x03, 0x00, + 0x1E, 0xE4, 0x20, 0x00, 0xD0, 0xD1, 0x00, 0x00, 0x26, 0x01, 0xC2, 0xE0, + 0x00, 0xA2, 0xE9, 0x26, 0x1A, 0xE4, 0x5A, 0x28, 0xF8, 0xF7, 0xE0, 0xCB, + 0x86, 0xD1, 0xF8, 0xF7, 0xA0, 0xCB, 0x10, 0x27, 0x1E, 0xE4, 0x04, 0x00, + 0x85, 0xD1, 0x01, 0x00, 0x59, 0x3C, 0x1E, 0x34, 0x06, 0xCB, 0x27, 0x27, + 0x00, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x25, 0x01, 0xC2, 0xE0, + 0x3D, 0x01, 0xC2, 0xE0, 0x08, 0xAE, 0x92, 0xB6, 0x88, 0x2A, 0x8E, 0xCC, + 0x18, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x1C, 0xA9, 0x1E, 0xE4, 0x04, 0xA2, + 0x79, 0x01, 0xC2, 0xE0, 0x16, 0xB6, 0x26, 0x21, 0x1E, 0xE4, 0xDB, 0x20, + 0x02, 0xA2, 0xEC, 0x20, 0x1E, 0xE4, 0x52, 0xB6, 0x58, 0x4C, 0x57, 0x20, + 0x10, 0x02, 0xC2, 0xE0, 0xC2, 0xE0, 0x01, 0x01, 0xC2, 0xE0, 0x08, 0xAE, + 0x2E, 0xE4, 0xCE, 0x20, 0x1E, 0xE4, 0x05, 0x02, 0x08, 0xE0, 0x49, 0xE0, + 0x50, 0x00, 0xC0, 0xE0, 0x09, 0xE0, 0x11, 0xAF, 0x08, 0x3C, 0x7F, 0x00, + 0x08, 0x3E, 0x08, 0x46, 0x09, 0x3E, 0x7F, 0x00, 0x2B, 0xF0, 0x03, 0xA8, + 0x08, 0x2A, 0x00, 0xA2, 0x2B, 0xF0, 0x05, 0xA8, 0x08, 0x2A, 0x04, 0xA9, + 0x2B, 0xF0, 0x09, 0xA8, 0x08, 0x2A, 0x12, 0xA9, 0x2B, 0xF0, 0x11, 0xA8, + 0x08, 0x2A, 0x40, 0xA9, 0xC1, 0xE0, 0x0C, 0x04, 0xC2, 0xE0, 0x80, 0xA9, + 0x10, 0xAE, 0x02, 0x00, 0x04, 0xE0, 0x46, 0x00, 0x5B, 0xF0, 0x03, 0xA8, + 0x09, 0x2A, 0x42, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xCB, 0x05, 0x61, 0xE1, + 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x0E, 0xCF, 0x09, 0x2A, 0x42, 0xE0, + 0x10, 0xAE, 0x92, 0x00, 0xCD, 0x05, 0x61, 0xE1, 0x5B, 0xF0, 0x05, 0xA8, + 0x03, 0x01, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xF2, 0x00, 0x04, 0xE0, + 0x46, 0x00, 0xC1, 0xE0, 0x09, 0xA8, 0x09, 0x2A, 0x42, 0xE0, 0x10, 0xAE, + 0x11, 0x21, 0xCF, 0x05, 0x61, 0xE1, 0x5B, 0xF0, 0xC1, 0xE0, 0x11, 0x02, + 0xC2, 0xE0, 0x11, 0x4D, 0x00, 0xE0, 0xF2, 0x00, 0x04, 0xE0, 0x46, 0x00, + 0x09, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x80, 0x00, 0xD1, 0x05, 0x61, 0xE1, + 0x5B, 0xF0, 0x11, 0xA8, 0x12, 0x02, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0x02, 0xAE, 0x3F, 0x4C, 0x02, 0xAE, 0x43, 0x28, 0xC2, 0xE0, 0x04, 0x01, + 0xC2, 0xE0, 0x42, 0x4C, 0x08, 0x02, 0xC2, 0xE0, 0x00, 0xA2, 0x04, 0x02, + 0xC2, 0xE0, 0x0E, 0xA2, 0x33, 0x27, 0x1E, 0xE4, 0x1E, 0xE4, 0x64, 0x01, + 0x1E, 0xE4, 0x12, 0x03, 0x06, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x89, 0x02, + 0xC2, 0xE0, 0x02, 0xAF, 0x02, 0xCB, 0x2E, 0xE4, 0x15, 0xCB, 0x0D, 0x03, + 0xC2, 0xE0, 0x13, 0x01, 0x2B, 0x02, 0xC2, 0xE0, 0x56, 0xE0, 0x03, 0xAE, + 0xA4, 0xCB, 0x15, 0x01, 0xC2, 0xE0, 0x94, 0xCB, 0xC2, 0xE0, 0x8A, 0xCB, + 0x26, 0x01, 0xC2, 0xE0, 0x2A, 0xE4, 0x5A, 0x3C, 0x02, 0xA8, 0x14, 0x01, + 0x56, 0xE0, 0x19, 0xCB, 0x0A, 0xAE, 0x14, 0xCB, 0xC2, 0xE0, 0x8C, 0xCB, + 0x20, 0x01, 0xC2, 0xE0, 0x22, 0x01, 0xC2, 0xE0, 0x8E, 0xCB, 0x21, 0x01, + 0x2E, 0xE4, 0x23, 0x01, 0xC2, 0xE0, 0x90, 0xCB, 0xD2, 0xCB, 0x0C, 0x03, + 0xC2, 0xE0, 0xD0, 0xCB, 0xC2, 0xE0, 0xD8, 0xCB, 0x09, 0x03, 0xC2, 0xE0, + 0x0B, 0x03, 0xC2, 0xE0, 0xDA, 0xCB, 0x0A, 0x03, 0x2A, 0xE4, 0x20, 0x03, + 0xC2, 0xE0, 0x5E, 0x28, 0xF6, 0xCB, 0x21, 0x03, 0xC2, 0xE0, 0x5F, 0x28, + 0x8E, 0xF8, 0x2E, 0xE4, 0x22, 0x03, 0xC2, 0xE0, 0x88, 0x28, 0x10, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0xC0, 0xE0, 0x2E, 0xE4, 0x28, 0x22, 0x18, 0xE4, + 0x02, 0xA2, 0x2E, 0xE4, 0xE8, 0xF7, 0x11, 0x01, 0xD6, 0x2A, 0x20, 0xA2, + 0x02, 0x03, 0xC2, 0xE0, 0x04, 0x00, 0x60, 0xE1, 0x44, 0xCC, 0xF6, 0xB5, + 0x02, 0x02, 0x62, 0xE1, 0x03, 0x02, 0x61, 0xE1, 0x4C, 0x27, 0x84, 0xE1, + 0x80, 0x03, 0x63, 0xE1, 0x83, 0x28, 0x29, 0xF0, 0x32, 0x2B, 0x31, 0x29, + 0x13, 0x81, 0x13, 0x81, 0x03, 0x9F, 0x08, 0xB6, 0xC2, 0xE0, 0x00, 0xA2, + 0x90, 0xE1, 0x13, 0x81, 0x20, 0x06, 0x65, 0xE1, 0x2E, 0xE4, 0x02, 0x03, + 0x15, 0x3D, 0x1F, 0x00, 0x88, 0xE1, 0x00, 0xA2, 0x07, 0x00, 0x22, 0xD0, + 0xE6, 0x27, 0x1E, 0xE4, 0xCF, 0x27, 0x1E, 0xE4, 0x60, 0x27, 0x84, 0xE1, + 0x65, 0xE1, 0xE6, 0x27, 0x1E, 0xE4, 0x90, 0xE1, 0x06, 0xA2, 0x15, 0x3D, + 0xFE, 0xA2, 0x20, 0x06, 0x2E, 0xE4, 0xCF, 0x27, 0x1E, 0xE4, 0x15, 0x3D, + 0x03, 0x28, 0x2A, 0xE4, 0xD8, 0x18, 0x03, 0x3C, 0x03, 0x28, 0xD9, 0x3C, + 0x29, 0x28, 0x3A, 0xF0, 0x64, 0xE1, 0xA3, 0x27, 0x1E, 0xE4, 0xD8, 0x3C, + 0x1E, 0xE4, 0xB0, 0x00, 0x04, 0xE0, 0x00, 0x02, 0x1E, 0xE4, 0x80, 0x00, + 0x64, 0xE1, 0xB3, 0x27, 0x1E, 0xE4, 0x82, 0x00, 0x64, 0xE1, 0xBB, 0x27, + 0x1E, 0xE4, 0x12, 0x00, 0x64, 0xE1, 0xBB, 0x27, 0x04, 0xE0, 0x3A, 0x00, + 0x64, 0xE1, 0xBB, 0x27, 0x64, 0xE1, 0xB3, 0x27, 0x1E, 0xE4, 0x05, 0x00, + 0x1E, 0xE4, 0x0C, 0x00, 0x04, 0xE0, 0x00, 0x09, 0xFE, 0xA2, 0xAE, 0x27, + 0x1E, 0xE4, 0xB3, 0x27, 0x28, 0xE4, 0x03, 0x28, 0x10, 0x3C, 0x29, 0x3C, + 0x24, 0xE4, 0x29, 0x3C, 0xD9, 0x28, 0xD6, 0x3C, 0x1E, 0xE4, 0x2E, 0xE4, + 0xA1, 0x1B, 0x1E, 0xE4, 0x1E, 0xE4, 0x02, 0x3C, 0x00, 0xA2, 0xE6, 0x27, + 0x66, 0xE1, 0x20, 0x06, 0x65, 0xE1, 0xDA, 0x27, 0x2A, 0xE4, 0x02, 0x28, + 0x2E, 0xE4, 0x00, 0x06, 0x02, 0xA1, 0x2E, 0xE4, 0xCF, 0x27, 0x1E, 0xE4, + 0x1E, 0xE4, 0xB9, 0x27, 0x84, 0xE1, 0x44, 0xCC, 0x04, 0x29, 0x2E, 0xE4, + 0x90, 0xE1, 0xBB, 0x27, 0x02, 0x28, 0x14, 0x3D, 0x16, 0x29, 0x15, 0x3D, + 0x24, 0xE4, 0x40, 0xA1, 0x02, 0x3C, 0x02, 0xA0, 0xDA, 0x27, 0x1E, 0xE4, + 0xCF, 0x27, 0x1E, 0xE4, 0x00, 0x06, 0x66, 0xE1, 0x20, 0x06, 0x65, 0xE1, + 0x05, 0xA2, 0x2E, 0xE4, 0x02, 0x3C, 0x00, 0xA2, 0xDD, 0x27, 0x1E, 0xE4, + 0x20, 0x06, 0x11, 0xD1, 0x00, 0x34, 0x80, 0xA0, 0x01, 0x4C, 0x00, 0x24, + 0x11, 0xD1, 0x07, 0xA2, 0x2E, 0xE4, 0x01, 0x3C, 0x20, 0xCE, 0x01, 0x4C, + 0x00, 0x24, 0x00, 0x06, 0x28, 0xCA, 0x27, 0xCE, 0x20, 0x00, 0x12, 0xD1, + 0x41, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xF8, 0xF7, 0x42, 0xE0, 0x11, 0xAE, + 0x38, 0x00, 0x05, 0xE0, 0x90, 0xE1, 0x2E, 0xE4, 0x01, 0x3C, 0x00, 0x34, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0xE4, + 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x3C, 0x03, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x56, 0x03, 0x0E, 0xE4, 0x78, 0x00, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, + 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, 0x9A, 0xF0, 0x4A, 0x00, + 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, 0x00, 0xA2, 0xED, 0x3C, + 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0xC2, 0xE0, + 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0x5D, 0x00, 0xC3, 0xE0, + 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, 0x2A, 0x24, 0x71, 0xD0, + 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, 0x1E, 0xE4, 0x81, 0xE1, + 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, 0x59, 0x00, 0xC0, 0xE0, + 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x3C, 0x03, 0x00, 0xE0, 0x02, 0xAE, + 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, 0xC0, 0xE0, 0xEE, 0x3C, + 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, 0xC1, 0xE0, 0x5B, 0x00, + 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, 0x1E, 0xE4, 0x2A, 0xE4, + 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, 0x9E, 0xE0, 0x42, 0x01, + 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0xED, 0x5A, 0x03, 0xA2, + 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0xC2, 0xE0, 0x58, 0x00, + 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, 0x0E, 0xF0, 0x08, 0x00, + 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x98, 0xF1, + 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, 0x03, 0x00, 0x04, 0xE0, + 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, 0x0A, 0xE0, 0x20, 0xAE, + 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, 0x02, 0xA2, 0x4E, 0xF6, + 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, 0x03, 0xA1, 0x3E, 0xA2, + 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, 0x4E, 0xA2, 0x5B, 0xF3, + 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, 0x40, 0x00, 0x04, 0xE0, + 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, 0x8B, 0xF2, 0x03, 0xA1, + 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, 0xC1, 0xE0, 0x00, 0xA2, + 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, 0xCB, 0xF1, 0x5E, 0x00, + 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, 0x46, 0x00, 0x04, 0xE0, + 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, + 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, 0x04, 0xE0, 0x7B, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA1, 0x68, 0x00, + 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, 0x00, 0x00, 0x11, 0xD1, + 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, + 0x4E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, 0x2A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0xC0, 0xE0, + 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x31, 0x01, + 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, 0x5C, 0x03, 0x04, 0xE0, + 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0x04, 0xE0, 0x2E, 0xE4, + 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, 0x7C, 0xE6, 0x5E, 0x03, + 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, 0x11, 0x3D, 0x09, 0x0B, + 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, + 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x00, + 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, 0xEC, 0x88, 0x00, 0x0C, + 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xEE, 0x01, 0x07, 0xA1, 0xD6, 0xB6, + 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, 0x00, 0xE0, 0x36, 0xB6, + 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x14, 0x04, + 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, 0x44, 0x00, 0xC1, 0xE0, + 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, + 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, 0x17, 0x35, 0x56, 0xE0, + 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, 0x50, 0x01, 0xC2, 0xE0, + 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, + 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, 0x1A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x86, 0x01, + 0x47, 0x00, 0xC0, 0xE0, 0x90, 0x01, 0x1A, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, + 0x48, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x3E, 0xA2, 0x2E, 0xE4, 0x4A, 0x00, + 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x02, 0xA2, 0x2E, 0xE4, 0x70, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0x00, 0xA2, 0x76, 0x00, 0xC2, 0xE0, 0x20, 0xA2, + 0xC2, 0xE0, 0xFC, 0xA2, 0x72, 0x00, 0xC2, 0xE0, 0x71, 0x00, 0xC2, 0xE0, + 0xFA, 0xA2, 0x77, 0x00, 0x84, 0xE1, 0x0F, 0x27, 0x22, 0xD0, 0x2E, 0xE4, + 0x48, 0xF0, 0x4A, 0x00, 0xC0, 0xE0, 0xAA, 0x01, 0xC0, 0xE0, 0xE8, 0xF7, + 0x1F, 0x04, 0xC0, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, + 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x11, 0x00, + 0x04, 0xE0, 0x9D, 0x01, 0xAF, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, 0x3C, 0x04, + 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, + 0xE0, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, 0x45, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x3C, 0x04, 0x28, 0xE4, 0x04, 0xA1, 0x0E, 0xA8, 0x04, 0xAF, + 0xC0, 0xE0, 0x4A, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x48, 0xCA, 0x8E, 0xF9, + 0xE8, 0xF7, 0x11, 0x01, 0xAF, 0x01, 0x1E, 0xE4, 0xE8, 0xF7, 0x02, 0xA8, + 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, + 0xF8, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, 0xF8, 0xF7, 0x28, 0xCA, + 0x2E, 0xE4, 0x3C, 0x04, 0x42, 0x3C, 0x43, 0x34, 0x01, 0xC0, 0x2E, 0xE4, + 0x43, 0x2C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0xEB, 0x1C, 0x2A, 0xE4, + 0x00, 0xC0, 0x42, 0x2E, 0x55, 0x18, 0x10, 0xAF, 0x4A, 0xE0, 0xB4, 0xF0, + 0x56, 0x1A, 0xFF, 0x00, 0x09, 0xE0, 0x74, 0xF0, 0xFE, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x34, 0xF0, 0x1E, 0xF1, 0x5D, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, + 0x01, 0xC0, 0xEE, 0xF0, 0x5E, 0x3C, 0x01, 0xC0, 0x5F, 0x3C, 0x01, 0xC0, + 0xBE, 0xF0, 0x5E, 0x28, 0x5E, 0x1A, 0x5D, 0x2A, 0x01, 0xC0, 0x8E, 0xF0, + 0x5F, 0x2A, 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, 0x08, 0x08, 0xC2, 0xE0, + 0x2E, 0xE4, 0x00, 0xC0, 0x02, 0x08, 0x62, 0xE1, 0x0B, 0x08, 0xC3, 0xE0, + 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x02, 0xA2, 0x92, 0x9F, 0x00, 0x02, + 0x05, 0xE0, 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, 0x12, 0x9F, 0x12, 0x9F, + 0x12, 0x81, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0xC0, 0xE0, 0x00, 0x08, + 0xC2, 0xE0, 0x02, 0xA2, 0x1E, 0xE4, 0x2E, 0xE4, 0xE8, 0xF7, 0x00, 0x08, + 0x32, 0xA2, 0x20, 0x06, 0x60, 0xD1, 0x4E, 0x02, 0x40, 0xCE, 0x2E, 0xE4, + 0xC0, 0xCE, 0x18, 0xAE, 0x02, 0x00, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, + 0x02, 0xA8, 0x48, 0xCA, 0x80, 0x00, 0x23, 0xD1, 0x22, 0xAE, 0x04, 0xA2, + 0x2E, 0xE4, 0xE8, 0xF7, 0x8C, 0xCC, 0x72, 0xCC, 0x00, 0xA2, 0x9E, 0xCC, + 0x20, 0xAE, 0x10, 0xA8, 0x04, 0xE0, 0x8E, 0xCC, 0x6F, 0xD1, 0x4A, 0xCE, + 0x22, 0x93, 0x0A, 0xE0, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x03, 0x00, + 0x60, 0xA2, 0x2E, 0xE4, 0x00, 0x00, 0x6F, 0xD1, 0xEA, 0xF7, 0x02, 0xA8, + 0x50, 0xCA, 0x50, 0xCE, 0x20, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x50, 0xCE, 0x3D, 0x04, 0xC1, 0xE0, + 0x2E, 0xE4, 0x1C, 0x04, 0x00, 0x01, 0x0A, 0xE0, 0xD9, 0xF7, 0xEF, 0xA1, + 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0x61, 0x00, 0xC0, 0xE0, + 0x2A, 0xE4, 0xC2, 0x02, 0x72, 0x02, 0x1E, 0xE4, 0x1F, 0x00, 0x08, 0xE0, + 0x37, 0x03, 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0x04, + 0xC2, 0xE0, 0x12, 0xAE, 0xE8, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x27, 0x03, + 0x04, 0xA8, 0x10, 0x02, 0xC0, 0xE0, 0x2A, 0xE4, 0x08, 0xE0, 0x15, 0x02, + 0xC0, 0xE0, 0x18, 0xF1, 0x16, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, + 0x08, 0xE0, 0x13, 0x02, 0xC0, 0xE0, 0xBE, 0xF0, 0x14, 0x02, 0xC0, 0xE0, + 0x4A, 0xF0, 0x00, 0x01, 0x1E, 0xE4, 0x0B, 0x02, 0xC0, 0xE0, 0x3E, 0xF0, + 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, 0x72, 0x02, 0x10, 0x02, 0xC1, 0xE0, + 0x12, 0xAE, 0x37, 0x03, 0xC1, 0xE0, 0x56, 0xE0, 0x15, 0xAE, 0x03, 0xA8, + 0x07, 0xAE, 0x7F, 0xA8, 0x0B, 0xAF, 0x04, 0x02, 0x0F, 0xA8, 0x04, 0x02, + 0xC1, 0xE0, 0x56, 0xE0, 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x56, 0xE0, + 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x27, 0x03, 0x52, 0xE0, 0x1F, 0xAE, + 0x03, 0xA2, 0x92, 0xE0, 0x94, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0xEA, 0xF1, + 0x84, 0xE0, 0x8A, 0xF1, 0x06, 0xA8, 0x08, 0xAF, 0x21, 0xA8, 0x85, 0xE0, + 0x16, 0xE0, 0x1E, 0xA8, 0xC0, 0xE0, 0x0A, 0xF1, 0x56, 0xE0, 0x17, 0xE0, + 0x16, 0xE0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0x07, 0xA8, 0x1B, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x3A, 0xF0, 0x56, 0xE0, 0x03, 0xA8, 0x1B, 0xE0, + 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x1F, 0xAE, 0x03, 0xA2, + 0x44, 0x00, 0xC0, 0xE0, 0xC2, 0x02, 0x1E, 0xE4, 0xEA, 0xF0, 0x52, 0xE0, + 0x69, 0xF0, 0xFD, 0x1A, 0x1E, 0xE4, 0xB8, 0xF0, 0x1E, 0xA8, 0x12, 0xAF, + 0x44, 0x00, 0xC0, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x38, 0xF0, + 0x08, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, 0x18, 0xE0, 0x88, 0xC7, + 0xA4, 0xCC, 0xFF, 0x00, 0x04, 0xAE, 0x02, 0xA0, 0x00, 0x05, 0x00, 0xE0, + 0xC2, 0xE0, 0x02, 0xA2, 0x1A, 0x04, 0xC2, 0xE0, 0xEA, 0xF7, 0x19, 0x04, + 0xC0, 0xE0, 0x18, 0x04, 0xC0, 0xE0, 0x18, 0x04, 0xC2, 0xE0, 0x02, 0xA2, + 0x1B, 0x04, 0xC0, 0xE0, 0xEA, 0xF7, 0x19, 0x04, 0x28, 0xAE, 0x08, 0xAF, + 0x1E, 0xA0, 0x20, 0xAF, 0xFF, 0xFF, 0x09, 0xE0, 0x1B, 0x04, 0xC1, 0xE0, + 0x56, 0xE0, 0x09, 0xAE, 0x09, 0xAF, 0x1F, 0xA0, 0xC0, 0xE0, 0x2E, 0xE4, + 0x1D, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0x02, 0x0A, 0xE0, 0x1C, 0x04, + 0xF0, 0xF7, 0x02, 0xA1, 0x28, 0xA2, 0x1C, 0x04, 0x00, 0x02, 0x0C, 0xE0, + 0x1C, 0x04, 0xC0, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0x2E, 0xE4, 0x02, 0xA8, 0x04, 0xAF, 0x44, 0x00, 0x60, 0x03, 0x0E, 0xE4, + 0xFB, 0x06, 0x0E, 0xE4, 0x68, 0x03, 0x0E, 0xE4, 0x64, 0x03, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6E, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x72, 0x03, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x76, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x85, 0x03, 0x1E, 0xE4, + 0xB6, 0x01, 0x1E, 0xE4, 0x03, 0x04, 0x1E, 0xE4, 0x87, 0x03, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0xDC, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x21, 0x04, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xCD, 0x08, 0x1E, 0xE4, + 0x75, 0x04, 0x1E, 0xE4, 0x98, 0x0C, 0x1E, 0xE4, 0xAD, 0x15, 0x1E, 0xE4, + 0xCD, 0x0C, 0x1E, 0xE4, 0x40, 0x04, 0x1E, 0xE4, 0x1E, 0xE4, 0x2E, 0xE4, + 0x02, 0xA2, 0x2E, 0xE4, 0x28, 0xCA, 0x4C, 0x01, 0x1E, 0xE4, 0x8B, 0x05, + 0x20, 0xCE, 0x42, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, 0xC4, 0x00, 0x12, 0xD1, + 0x00, 0x08, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x80, 0x00, 0x00, 0xE0, 0x80, 0x01, 0x00, 0xE0, 0x12, 0xD1, 0x40, 0x0B, + 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, + 0x1E, 0xE4, 0x01, 0xA2, 0x04, 0xA2, 0xF9, 0xF7, 0x0B, 0xE4, 0xFD, 0x1A, + 0x1E, 0xE4, 0x8F, 0x1B, 0x00, 0xE0, 0x42, 0x00, 0xC0, 0xE0, 0xCE, 0x03, + 0x00, 0xE0, 0x80, 0x00, 0x00, 0xE0, 0x80, 0x01, 0x00, 0x08, 0x11, 0xD1, + 0x20, 0xCE, 0x80, 0x01, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, + 0x80, 0x01, 0x00, 0xE0, 0xF9, 0xF7, 0x29, 0xCA, 0x12, 0xD1, 0x40, 0x0B, + 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, + 0x00, 0x03, 0x05, 0xE0, 0x04, 0xA2, 0xF9, 0xF7, 0x60, 0x00, 0xC0, 0xE0, + 0x8F, 0x1B, 0x1E, 0xE4, 0x02, 0xAF, 0x2B, 0xF0, 0xFD, 0x1A, 0x1E, 0xE4, + 0xB4, 0x3C, 0x61, 0x00, 0xC0, 0xE0, 0x98, 0x3C, 0x2E, 0xE4, 0x54, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xCD, 0x0C, 0x1E, 0xE4, 0xED, 0x03, 0x1E, 0xE4, + 0x9F, 0x3C, 0x9E, 0x3C, 0x91, 0x3C, 0x00, 0xA2, 0xFF, 0xFF, 0x04, 0xE0, + 0xA1, 0x3C, 0xA0, 0x3C, 0x01, 0x3D, 0x11, 0x3D, 0xC5, 0x08, 0x61, 0xE1, + 0x02, 0x2B, 0xD8, 0x08, 0x62, 0xE1, 0x2E, 0xE4, 0xFE, 0xA2, 0xFC, 0x08, + 0x63, 0xE1, 0x11, 0xA8, 0x64, 0xE1, 0xCB, 0xF0, 0x0B, 0x3D, 0x13, 0x35, + 0x65, 0xE1, 0x04, 0x5B, 0x03, 0xA2, 0xCE, 0x08, 0x56, 0xE0, 0x05, 0x4D, + 0x15, 0x21, 0xC5, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, 0x0B, 0x3D, 0x13, 0x35, + 0x4B, 0xD1, 0x62, 0x05, 0x1E, 0xE4, 0x8A, 0x04, 0x1E, 0xE4, 0x72, 0x06, + 0x1E, 0xE4, 0x00, 0x02, 0x1C, 0x04, 0x08, 0xE4, 0xDB, 0x28, 0x0C, 0x09, + 0x04, 0xA1, 0xE0, 0x28, 0x13, 0x07, 0x1E, 0xE4, 0x13, 0x08, 0x1E, 0xE4, + 0x5C, 0x0C, 0x1A, 0xE4, 0x0A, 0xF7, 0x04, 0xA1, 0xE0, 0x28, 0x48, 0xF0, + 0x75, 0x08, 0x1E, 0xE4, 0xE3, 0x04, 0x1E, 0xE4, 0x1E, 0xE4, 0x4E, 0x02, + 0x1E, 0xE4, 0x2E, 0xE4, 0x3A, 0xD0, 0x01, 0x00, 0x30, 0xD1, 0x26, 0x01, + 0x39, 0xD0, 0x00, 0x00, 0x08, 0xD0, 0x01, 0x00, 0x47, 0xD0, 0x00, 0x00, + 0x49, 0xD0, 0x00, 0x00, 0x02, 0xAF, 0x62, 0x00, 0xC0, 0xE0, 0x00, 0x00, + 0x02, 0xAF, 0x96, 0x30, 0x06, 0xAF, 0x89, 0x30, 0xFE, 0xA2, 0x12, 0x3C, + 0x02, 0xA2, 0x8A, 0x30, 0x2E, 0xE4, 0x79, 0x00, 0xC2, 0xE0, 0x22, 0x3C, + 0x00, 0x00, 0x47, 0xD0, 0x00, 0x00, 0x49, 0xD0, 0x71, 0x00, 0xC2, 0xE0, + 0x17, 0x4C, 0x16, 0x20, 0x21, 0x28, 0x7A, 0x00, 0xC2, 0xE0, 0x22, 0x28, + 0x02, 0xA0, 0x97, 0x28, 0x79, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x99, 0x28, + 0x73, 0x00, 0xC2, 0xE0, 0x1C, 0x4C, 0x0A, 0xAE, 0x12, 0x28, 0x74, 0x00, + 0x19, 0x4C, 0x02, 0xAE, 0x18, 0x4C, 0x02, 0xAE, 0x10, 0x4C, 0x10, 0xAE, + 0x11, 0x4C, 0x10, 0xAE, 0x10, 0xAE, 0x1F, 0x28, 0x7B, 0x00, 0xC2, 0xE0, + 0xFE, 0xA2, 0x72, 0x00, 0xC2, 0xE0, 0x20, 0x4C, 0x77, 0x00, 0xC2, 0xE0, + 0x76, 0x00, 0xC2, 0xE0, 0x70, 0x00, 0xC2, 0xE0, 0x16, 0xE0, 0x93, 0x28, + 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x93, 0x28, 0x3F, 0xA2, 0x40, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0x1F, 0x05, 0xE0, 0x42, 0xE0, 0x17, 0xAE, + 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x03, 0xAE, 0x12, 0xD1, 0xF0, 0x06, + 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x00, 0x01, + 0xDC, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xF8, 0xF7, 0x30, 0xD1, 0xDB, 0x3C, + 0x4C, 0xCC, 0x4A, 0xCC, 0x08, 0xD0, 0x01, 0x00, 0x3A, 0xD0, 0x01, 0x00, + 0x1E, 0xE4, 0xA7, 0x1B, 0x1E, 0xE4, 0x00, 0x00, 0x7B, 0x02, 0x1A, 0xE4, + 0x3D, 0x28, 0x0C, 0x1B, 0x08, 0xE0, 0x49, 0xE0, 0x50, 0x00, 0xC0, 0xE0, + 0x09, 0xE0, 0x11, 0xAF, 0xB7, 0x3C, 0x7F, 0x00, 0xB7, 0x3E, 0xB7, 0x46, + 0xB8, 0x3E, 0x7F, 0x00, 0x3B, 0xF0, 0x03, 0xA8, 0xB7, 0x2A, 0x00, 0xA2, + 0x05, 0xA8, 0xB7, 0x2A, 0x02, 0x00, 0x0A, 0xE0, 0xB7, 0x2A, 0x09, 0x00, + 0x0A, 0xE0, 0x3B, 0xF0, 0x20, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0x09, 0xA8, + 0x0A, 0xE0, 0x3B, 0xF0, 0x11, 0xA8, 0xB7, 0x2A, 0x3B, 0xF0, 0x21, 0xA8, + 0xB7, 0x2A, 0x40, 0x00, 0x41, 0xA8, 0xB7, 0x2A, 0x10, 0x00, 0x0A, 0xE0, + 0xC2, 0xE0, 0x02, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0xA5, 0x3C, 0xA4, 0x3C, + 0x00, 0xA2, 0x0C, 0x04, 0x49, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0xA6, 0x3C, + 0xA5, 0x30, 0x08, 0xAF, 0xA6, 0x3E, 0x1F, 0xA8, 0x04, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x02, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0xDF, 0x3C, 0x0E, 0xA8, + 0xE0, 0x3C, 0x00, 0xA2, 0xDE, 0x30, 0x16, 0xAF, 0x49, 0xD0, 0x2E, 0xE4, + 0xC7, 0x19, 0x1E, 0xE4, 0xA0, 0x20, 0x00, 0x00, 0x47, 0xD0, 0x00, 0x00, + 0xE0, 0x28, 0x70, 0x00, 0xC2, 0xE0, 0xA1, 0x4C, 0x00, 0xE0, 0x9C, 0x28, + 0x5C, 0x0C, 0x18, 0xE4, 0xC2, 0xE0, 0x02, 0x29, 0x94, 0xE0, 0xCA, 0x08, + 0x72, 0x00, 0xC2, 0xE0, 0x95, 0x28, 0x71, 0x00, 0x02, 0xAE, 0x4F, 0x4C, + 0x02, 0xAE, 0x50, 0x28, 0x02, 0xAE, 0x4A, 0x4C, 0x04, 0xAE, 0x4E, 0x4C, + 0x06, 0xAE, 0x4B, 0x4C, 0x1E, 0xAE, 0x19, 0x4C, 0x21, 0xAE, 0x16, 0x2A, + 0x09, 0xC0, 0x4C, 0x4C, 0x73, 0x00, 0xC2, 0xE0, 0x00, 0xC0, 0x56, 0xE0, + 0x6F, 0x00, 0xC2, 0xE0, 0x54, 0x4C, 0x53, 0x20, 0xC2, 0xE0, 0x20, 0x4C, + 0x10, 0xAE, 0x1F, 0x28, 0x7E, 0x00, 0xC2, 0xE0, 0x22, 0x28, 0x7C, 0x00, + 0x00, 0xA2, 0x7D, 0x00, 0xC2, 0xE0, 0x21, 0x28, 0xE4, 0x08, 0x01, 0xE0, + 0x05, 0xAE, 0x9C, 0x2A, 0x0F, 0xA8, 0x07, 0xAF, 0x02, 0x2B, 0x95, 0xE0, + 0xC2, 0xE0, 0x12, 0xB6, 0xE0, 0x2A, 0x56, 0xE0, 0x04, 0xAE, 0xE0, 0x28, + 0x00, 0xA2, 0x74, 0x00, 0x16, 0xE0, 0x94, 0x28, 0x75, 0x00, 0xC2, 0xE0, + 0xDB, 0x2A, 0x56, 0xE0, 0x29, 0xAE, 0xDB, 0x2A, 0x76, 0x00, 0xC2, 0xE0, + 0x56, 0xE0, 0x21, 0xAE, 0xE8, 0xB7, 0x02, 0x29, 0xC7, 0x08, 0x62, 0xE1, + 0x94, 0x2A, 0xD6, 0xB7, 0x09, 0xA1, 0x4B, 0x2A, 0xD8, 0x08, 0x62, 0xE1, + 0xC4, 0xF0, 0xD2, 0xB7, 0x05, 0xAF, 0x02, 0x2B, 0xCF, 0x08, 0x64, 0xE1, + 0x25, 0xF0, 0x04, 0x2B, 0x4B, 0xF0, 0x07, 0xA8, 0xC2, 0xE0, 0xD2, 0xB7, + 0xE0, 0x2A, 0x04, 0x29, 0x20, 0xAE, 0x4D, 0xC8, 0x4A, 0xC8, 0x77, 0x00, + 0xFE, 0xA2, 0x53, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x79, 0x00, 0xC2, 0xE0, + 0x78, 0x00, 0xC2, 0xE0, 0x7F, 0x19, 0x1E, 0xE4, 0x6C, 0x05, 0x1E, 0xE4, + 0x54, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x0D, 0x4D, 0x15, 0x21, + 0xC5, 0x08, 0x65, 0xE1, 0x2E, 0xE4, 0x0D, 0x3D, 0x15, 0x35, 0x52, 0xE0, + 0x01, 0x3C, 0x05, 0x29, 0xC7, 0x08, 0x65, 0xE1, 0x54, 0x00, 0xC0, 0xE0, + 0x01, 0x5A, 0x03, 0xA2, 0x62, 0xE1, 0x54, 0x00, 0xC2, 0xE0, 0x56, 0xE0, + 0x02, 0x2B, 0xCF, 0x08, 0x64, 0xE1, 0xD8, 0x08, 0x04, 0x2B, 0xCB, 0xF0, + 0x07, 0xA8, 0x05, 0xAF, 0x03, 0xA2, 0x01, 0x3C, 0x04, 0x29, 0xA5, 0xF0, + 0x56, 0xE0, 0x54, 0x00, 0xC0, 0xE0, 0x01, 0x5A, 0x66, 0xE1, 0x2E, 0xE4, + 0x54, 0x00, 0xC2, 0xE0, 0x22, 0xD0, 0xF0, 0x08, 0x67, 0xE1, 0x64, 0x00, + 0x16, 0x9E, 0x95, 0x05, 0x84, 0xE1, 0x03, 0x00, 0xDC, 0x07, 0x67, 0xE1, + 0x17, 0x3D, 0x17, 0x35, 0x9E, 0x05, 0x84, 0xE1, 0x01, 0x00, 0x22, 0xD0, + 0x2E, 0xE4, 0x17, 0x3D, 0x17, 0x35, 0x16, 0x9E, 0x00, 0x00, 0x44, 0xD1, + 0x40, 0x00, 0x48, 0xD1, 0x00, 0x00, 0x68, 0xD1, 0x00, 0x00, 0x45, 0xD1, + 0x19, 0x00, 0x04, 0xE0, 0x00, 0x02, 0x4B, 0xD1, 0x0C, 0x00, 0x4C, 0xD1, + 0xC0, 0xCE, 0x18, 0xAE, 0x44, 0xCC, 0x2E, 0xE4, 0xF8, 0xF7, 0x9A, 0xCA, + 0x18, 0xE4, 0x9C, 0xCA, 0xBC, 0x05, 0x84, 0xE1, 0xF9, 0xF7, 0x9B, 0xCA, + 0xA0, 0xCA, 0x6D, 0x07, 0xD7, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x90, 0xE1, + 0x13, 0x08, 0x1E, 0xE4, 0xD4, 0x3C, 0xD6, 0x3C, 0x1E, 0xE4, 0x14, 0x06, + 0x1E, 0xE4, 0x38, 0xF1, 0xBB, 0x08, 0x1E, 0xE4, 0xE8, 0xF0, 0x13, 0x08, + 0xFF, 0x00, 0x09, 0xE0, 0xA3, 0xCA, 0x06, 0xA2, 0x03, 0x3C, 0xB3, 0x05, + 0x1E, 0xE4, 0x56, 0xB6, 0x04, 0xE0, 0x6A, 0xF0, 0x13, 0x08, 0x1E, 0xE4, + 0x2E, 0xE4, 0x00, 0xA2, 0xD3, 0x3C, 0xFF, 0x00, 0x03, 0x28, 0x78, 0xF6, + 0x0E, 0xAF, 0x03, 0x28, 0xE0, 0x06, 0x1E, 0xE4, 0xD3, 0x3C, 0x3E, 0xA8, + 0x2E, 0xE4, 0x02, 0xA2, 0x1C, 0x07, 0x1E, 0xE4, 0xD4, 0x3C, 0xD6, 0x3C, + 0xD7, 0x3C, 0x00, 0xA2, 0x1E, 0xE4, 0x98, 0xF1, 0x13, 0x08, 0x1E, 0xE4, + 0x48, 0xF1, 0x13, 0x08, 0x1E, 0xE4, 0x14, 0x06, 0x08, 0xE0, 0xA2, 0xCA, + 0xBB, 0x08, 0x1E, 0xE4, 0x7F, 0x00, 0x08, 0xE0, 0x03, 0x3C, 0xFF, 0x00, + 0x56, 0xF0, 0x2A, 0xA1, 0x34, 0xF0, 0x14, 0xA1, 0xCE, 0xF6, 0xB3, 0x05, + 0x1E, 0xE4, 0x02, 0xA2, 0x04, 0xE0, 0x6A, 0xF0, 0x13, 0x08, 0x1E, 0xE4, + 0x2E, 0xE4, 0x00, 0xA2, 0xD3, 0x3C, 0xFF, 0x00, 0x03, 0x28, 0x18, 0xF6, + 0x0E, 0xAF, 0x03, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0xD3, 0x3C, 0x3E, 0xA8, + 0xFF, 0x00, 0x04, 0xE0, 0x00, 0x01, 0x58, 0xD1, 0x00, 0x00, 0x5D, 0xD1, + 0xB8, 0xCE, 0x14, 0xE0, 0x00, 0x00, 0x5F, 0xD1, 0x00, 0x00, 0x5E, 0xD1, + 0x0A, 0xE0, 0x18, 0xAE, 0x19, 0x00, 0x04, 0xE0, 0x00, 0x00, 0x57, 0xD1, + 0xC0, 0xCE, 0x20, 0x06, 0x03, 0x00, 0x4C, 0xD1, 0x00, 0x00, 0x4A, 0xD1, + 0x9A, 0xCA, 0x6D, 0x07, 0x18, 0xE4, 0x9C, 0xCA, 0x3A, 0xF7, 0x02, 0xA8, + 0xAE, 0xCA, 0xC8, 0xF7, 0x00, 0xA2, 0x6D, 0x07, 0x18, 0xE4, 0x9C, 0xCA, + 0x04, 0xE0, 0x28, 0xE4, 0xD4, 0x28, 0x2E, 0xE4, 0x92, 0xCE, 0x16, 0xB6, + 0xC8, 0x2A, 0x80, 0x00, 0xFF, 0x01, 0x04, 0xE0, 0x00, 0x00, 0x58, 0xD1, + 0x00, 0x00, 0x5D, 0xD1, 0xB8, 0xCE, 0x14, 0xE0, 0x00, 0x00, 0x5F, 0xD1, + 0x00, 0x00, 0x5E, 0xD1, 0x0A, 0xE0, 0x18, 0xAE, 0x19, 0x00, 0x04, 0xE0, + 0x03, 0x00, 0x61, 0xD1, 0xC0, 0xCE, 0x38, 0x06, 0x03, 0x00, 0x4C, 0xD1, + 0x00, 0x00, 0x4A, 0xD1, 0x9A, 0xCA, 0x6D, 0x07, 0x18, 0xE4, 0x9C, 0xCA, + 0x94, 0xCA, 0xA8, 0xF7, 0x9C, 0xCA, 0xC8, 0xF7, 0xD5, 0x28, 0xD4, 0x3C, + 0x9E, 0xCA, 0xD5, 0x3C, 0xD6, 0x3C, 0xD7, 0x34, 0xD6, 0x0C, 0xD7, 0x00, + 0x92, 0xCC, 0xD4, 0x28, 0x8C, 0xCC, 0x90, 0xCC, 0x16, 0xE0, 0xC8, 0x28, + 0x28, 0xE4, 0x8E, 0xCC, 0x59, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xC8, 0x3C, + 0x02, 0xA1, 0x7F, 0x06, 0x0A, 0xE4, 0x02, 0xA1, 0x0A, 0xE4, 0x02, 0xA1, + 0xDA, 0x06, 0x0A, 0xE4, 0xC0, 0xE0, 0xDA, 0x06, 0x0E, 0xE4, 0x8E, 0x06, + 0xBF, 0x34, 0xBA, 0x3C, 0xB9, 0x34, 0x60, 0x00, 0x14, 0xAE, 0x61, 0x00, + 0xC0, 0xE0, 0xC0, 0x3C, 0xBA, 0x0C, 0xB9, 0x04, 0xBC, 0x3C, 0xBB, 0x34, + 0x3A, 0xF1, 0xC7, 0x28, 0xBE, 0x3C, 0xBD, 0x34, 0xD2, 0x3C, 0xD1, 0x34, + 0x48, 0x00, 0xC0, 0xE0, 0x49, 0x00, 0xC1, 0xE0, 0xD2, 0x4C, 0xD1, 0x24, + 0xC2, 0x1C, 0xC1, 0x14, 0xC2, 0x3E, 0xC1, 0x36, 0x03, 0xA8, 0x05, 0xAF, + 0x45, 0x00, 0xC1, 0xE0, 0x48, 0x00, 0xC0, 0xE0, 0xC7, 0x3E, 0x11, 0xB6, + 0xC0, 0xE0, 0xC5, 0x3C, 0xFF, 0x01, 0x08, 0xE0, 0x00, 0xFE, 0x08, 0xE0, + 0xBF, 0x34, 0x48, 0x00, 0xC3, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0xC0, 0x3C, + 0x8E, 0xCC, 0x92, 0xCC, 0x00, 0xA2, 0xC4, 0x3C, 0x1E, 0xE4, 0xE0, 0x06, + 0x1E, 0xE4, 0x80, 0xE1, 0x81, 0xE1, 0x2A, 0x20, 0x71, 0xD0, 0x3B, 0x02, + 0x04, 0xA1, 0x3C, 0x28, 0xC9, 0x3C, 0x00, 0xA2, 0xD6, 0x3C, 0xD7, 0x34, + 0x00, 0xA2, 0x0A, 0xF1, 0xC5, 0x2C, 0x1C, 0x07, 0x1E, 0xE4, 0x72, 0xCC, + 0xDE, 0xF7, 0x4F, 0xBA, 0x34, 0xF0, 0x02, 0xA1, 0xBE, 0xF0, 0xB5, 0x08, + 0x1E, 0xE4, 0x72, 0xC8, 0xA0, 0x05, 0x1E, 0xE4, 0x6D, 0x07, 0x1E, 0xE4, + 0xB3, 0x05, 0x12, 0xE4, 0x02, 0xA1, 0xC5, 0x28, 0xC9, 0x3C, 0x02, 0xA2, + 0xAA, 0xCE, 0x00, 0xA2, 0x2E, 0xE4, 0x6A, 0xE1, 0x1A, 0xB6, 0x02, 0xA2, + 0x00, 0x00, 0x31, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x00, 0x00, 0x34, 0xD0, + 0x00, 0x00, 0x32, 0xD0, 0x00, 0x00, 0x35, 0xD0, 0x00, 0x00, 0x33, 0xD0, + 0x00, 0x00, 0x37, 0xD0, 0xFF, 0x00, 0x36, 0xD0, 0x00, 0x00, 0x39, 0xD0, + 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, 0x4C, 0xD0, 0x01, 0x00, 0x4B, 0xD0, + 0x96, 0xC8, 0x2E, 0xE4, 0x00, 0x00, 0x49, 0xD1, 0xD9, 0x3C, 0x29, 0x07, + 0x1E, 0xE4, 0x5A, 0xF0, 0x00, 0xA2, 0x01, 0x00, 0x4B, 0xD0, 0x58, 0xF0, + 0x4C, 0xD0, 0x6E, 0xCC, 0xD8, 0x28, 0xD9, 0x3C, 0xD9, 0x3C, 0x02, 0xA2, + 0x70, 0xE4, 0x00, 0x00, 0x2A, 0xE4, 0x96, 0xCC, 0x29, 0x07, 0x1E, 0xE4, + 0x96, 0xC8, 0x2E, 0xE4, 0x6E, 0xCC, 0xD8, 0x28, 0xD8, 0x28, 0x01, 0x00, + 0x4B, 0xD0, 0x28, 0xE4, 0x2E, 0xE4, 0x00, 0x00, 0x4C, 0xD0, 0x6E, 0xCC, + 0x1E, 0xE4, 0xD8, 0x3C, 0xC8, 0x3C, 0x00, 0xA2, 0x01, 0x00, 0x4B, 0xD0, + 0xD9, 0x3C, 0x29, 0x07, 0x28, 0xE1, 0x90, 0xE1, 0x6E, 0xCC, 0xD8, 0x28, + 0x4A, 0xF0, 0x04, 0xA1, 0x3C, 0x28, 0x2E, 0xE4, 0x1E, 0xE4, 0x3E, 0xF0, + 0x38, 0x07, 0x1E, 0xE4, 0xC8, 0x2A, 0x80, 0x00, 0x04, 0xE0, 0x39, 0x06, + 0x2E, 0xE4, 0x00, 0xA2, 0xD8, 0x3C, 0x16, 0xB6, 0x00, 0x00, 0x27, 0xD0, + 0x28, 0xE4, 0xC7, 0x28, 0x01, 0x00, 0x27, 0xD0, 0xC9, 0x07, 0x1E, 0xE4, + 0xC0, 0x4C, 0xBF, 0x24, 0xF8, 0xF7, 0x28, 0xCA, 0x22, 0xCE, 0x0E, 0xAE, + 0xC8, 0x28, 0x20, 0xCE, 0x43, 0x00, 0xC0, 0xE0, 0x80, 0x00, 0x12, 0xD1, + 0x26, 0xCE, 0x22, 0xA0, 0x02, 0xAE, 0x06, 0xA8, 0xC0, 0x4C, 0xBF, 0x24, + 0xF8, 0xF7, 0x28, 0xCA, 0xC0, 0x3C, 0xBF, 0x34, 0x00, 0x02, 0x00, 0xE0, + 0xB9, 0x24, 0x54, 0xF0, 0xBE, 0x1C, 0xBD, 0x14, 0x1E, 0xE4, 0xC0, 0x3C, + 0xBF, 0x34, 0xBA, 0x4C, 0xC8, 0x3C, 0x16, 0xE0, 0xC8, 0x28, 0x77, 0x08, + 0xD7, 0x34, 0xD6, 0x0C, 0xD7, 0x00, 0xDA, 0x28, 0x8E, 0xCC, 0xC7, 0x28, + 0x8C, 0xCC, 0xD6, 0x3C, 0x1E, 0xE4, 0xDA, 0xF1, 0xC7, 0x28, 0x2E, 0xE4, + 0x50, 0xCE, 0x40, 0x04, 0x00, 0xE0, 0x63, 0x02, 0x06, 0xA8, 0xDA, 0x28, + 0x0A, 0x01, 0x05, 0xE0, 0x06, 0xAE, 0x06, 0xA8, 0x12, 0xE0, 0x08, 0xA1, + 0xFE, 0x58, 0x0A, 0x01, 0x04, 0xE0, 0xFE, 0x3C, 0xE8, 0xF7, 0x04, 0xA8, + 0x50, 0xCA, 0x52, 0xCE, 0x00, 0x00, 0x4E, 0xD1, 0x6A, 0x02, 0x1E, 0xE4, + 0x27, 0xD0, 0x2E, 0xE4, 0x00, 0x00, 0x44, 0xD1, 0x27, 0xD0, 0xC9, 0x07, + 0x1E, 0xE4, 0x00, 0x00, 0x48, 0xCA, 0x1A, 0xF2, 0xDA, 0x28, 0x01, 0x00, + 0xC0, 0x4C, 0xBF, 0x24, 0xE8, 0xF7, 0x02, 0xA8, 0x22, 0xD1, 0x00, 0x00, + 0x21, 0xD1, 0x40, 0xCE, 0x06, 0xA8, 0x43, 0x00, 0xC0, 0xE0, 0x40, 0x00, + 0x48, 0xCA, 0x46, 0xCE, 0x32, 0xA0, 0x02, 0xAE, 0xC0, 0x4C, 0xBF, 0x24, + 0xE8, 0xF7, 0x02, 0xA8, 0xC0, 0x3C, 0xBF, 0x34, 0x00, 0x02, 0x00, 0xE0, + 0xB9, 0x24, 0x54, 0xF0, 0xBE, 0x1C, 0xBD, 0x14, 0xC7, 0x28, 0xC0, 0x3C, + 0xBF, 0x34, 0xBA, 0x4C, 0x77, 0x08, 0x1E, 0xE4, 0x2A, 0x08, 0x18, 0xE4, + 0x00, 0x00, 0x44, 0xD1, 0x00, 0x00, 0x4E, 0xD1, 0x03, 0xA1, 0x59, 0x00, + 0xC1, 0xE0, 0x2E, 0xE4, 0x1C, 0x00, 0x00, 0xE0, 0x36, 0xB6, 0x00, 0xA2, + 0x1A, 0xE0, 0x52, 0xE0, 0x45, 0x00, 0xC1, 0xE0, 0x08, 0xA8, 0x43, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x04, 0xE0, 0xC6, 0x3C, 0x00, 0xA2, 0x68, 0xF3, + 0xBD, 0x07, 0x1E, 0xE4, 0xDA, 0x3C, 0x00, 0x02, 0xC1, 0xE0, 0xC0, 0x4C, + 0xBF, 0x24, 0xC7, 0x3C, 0xD1, 0x26, 0xD2, 0x3E, 0xD1, 0x36, 0x49, 0x00, + 0xBB, 0x06, 0x33, 0xF0, 0x45, 0xE0, 0xD2, 0x4E, 0xC7, 0x28, 0x00, 0x02, + 0x03, 0xE0, 0xBC, 0x0E, 0x01, 0xE0, 0xC3, 0xF1, 0xC7, 0x3C, 0x02, 0xB6, + 0xC1, 0xE0, 0xC7, 0x28, 0xDA, 0x3E, 0x00, 0x02, 0x52, 0xE0, 0x17, 0xE0, + 0x1B, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0x08, 0xF6, 0xC6, 0x28, 0x28, 0xF1, + 0xBA, 0xF5, 0x00, 0x40, 0x08, 0xE0, 0x5C, 0x00, 0x00, 0x40, 0x0A, 0xE0, + 0x5D, 0x00, 0xC0, 0xE0, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, 0xC2, 0xE0, + 0xC7, 0x2A, 0xDA, 0x28, 0x1E, 0xF5, 0xC6, 0x3C, 0xDA, 0x3C, 0x00, 0x02, + 0x04, 0xE0, 0x39, 0xF0, 0x00, 0x40, 0x09, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, + 0x0E, 0xA8, 0x68, 0xC8, 0x2E, 0xE4, 0xC9, 0xF7, 0xC7, 0x28, 0x2E, 0xE4, + 0x00, 0x74, 0x00, 0x3C, 0xC0, 0xE0, 0x77, 0x08, 0x1E, 0xE4, 0x2A, 0xE4, + 0xD1, 0x24, 0xD2, 0x3C, 0xD1, 0x34, 0x49, 0x00, 0xD1, 0x36, 0x48, 0x00, + 0xC1, 0xE0, 0xD2, 0x4C, 0x45, 0xE0, 0xD2, 0x4E, 0xD1, 0x26, 0xD2, 0x3E, + 0x00, 0x02, 0x03, 0xE0, 0x26, 0xB6, 0x00, 0xA2, 0x63, 0x02, 0x1E, 0xE4, + 0x2E, 0xE4, 0x06, 0xB6, 0x0A, 0xE4, 0x00, 0x02, 0x02, 0xE0, 0xDA, 0x28, + 0x6A, 0xF2, 0x06, 0xA8, 0xDA, 0x28, 0x73, 0x08, 0xFE, 0x3C, 0x06, 0xAE, + 0x12, 0xE0, 0x08, 0xA1, 0x00, 0xE0, 0x20, 0xAE, 0x04, 0xAF, 0xDA, 0x28, + 0x52, 0xCA, 0x90, 0xE1, 0x50, 0xCE, 0xC0, 0x01, 0x52, 0xCA, 0xE8, 0xF7, + 0x04, 0xA8, 0x50, 0xCA, 0x07, 0xA8, 0xDA, 0x2A, 0xFE, 0x58, 0xFE, 0x5C, + 0x0A, 0x01, 0x05, 0xE0, 0xFE, 0x3E, 0x07, 0xAE, 0x05, 0xAF, 0xDA, 0x2A, + 0x56, 0xE0, 0xFE, 0x5E, 0x51, 0xCE, 0x40, 0x01, 0x01, 0xE0, 0x21, 0xAE, + 0x04, 0xA8, 0x50, 0xCA, 0x52, 0xCE, 0x90, 0xE1, 0xDA, 0x18, 0xFC, 0x01, + 0x04, 0xE0, 0xE8, 0xF7, 0x06, 0xA0, 0xDA, 0x28, 0x6E, 0xF1, 0x22, 0xF0, + 0x40, 0x04, 0x00, 0xE0, 0x20, 0xAE, 0x04, 0xAF, 0x08, 0xA1, 0x06, 0xA8, + 0xDA, 0x28, 0x50, 0xCE, 0xFE, 0x3C, 0x3E, 0xA8, 0x06, 0xAE, 0x12, 0xE0, + 0x52, 0xCE, 0xFE, 0x58, 0x0A, 0x01, 0x04, 0xE0, 0x0E, 0xE4, 0xE8, 0xF7, + 0x04, 0xA8, 0x50, 0xCA, 0x3C, 0x28, 0x0E, 0x08, 0x1E, 0xE4, 0x6A, 0x02, + 0x01, 0xC0, 0x72, 0xC8, 0xAA, 0xF1, 0x04, 0xA1, 0xD7, 0x26, 0x00, 0xC0, + 0x3C, 0x3C, 0x3B, 0x34, 0x53, 0xF0, 0x45, 0xE0, 0x07, 0xAE, 0xD6, 0x4E, + 0x73, 0xCC, 0x07, 0xAE, 0xD6, 0x4E, 0xD7, 0x26, 0x01, 0xC0, 0x49, 0xE0, + 0xB0, 0x08, 0x1E, 0xE4, 0x06, 0xAF, 0x00, 0xC0, 0x3C, 0x4C, 0x3B, 0x24, + 0xAA, 0xCA, 0x2E, 0xF0, 0x08, 0xB6, 0x46, 0xE0, 0x48, 0x00, 0xC1, 0xE0, + 0x16, 0xB6, 0xC9, 0x2A, 0xD2, 0x4E, 0xD1, 0x26, 0xD2, 0x3E, 0xD1, 0x36, + 0xBE, 0x1E, 0xBD, 0x16, 0x49, 0xE0, 0x42, 0xE0, 0xC2, 0xE0, 0xBC, 0x1C, + 0xBB, 0x14, 0x35, 0xF0, 0x00, 0xA2, 0x52, 0x00, 0xC2, 0xE0, 0x48, 0x00, + 0x3C, 0x4C, 0x3B, 0x24, 0x01, 0xC0, 0xAA, 0xCE, 0x2E, 0xE4, 0xB5, 0x08, + 0x1E, 0xE4, 0x00, 0xC0, 0x00, 0xC0, 0x3A, 0x4C, 0x39, 0x24, 0x01, 0xC0, + 0x39, 0x34, 0x06, 0xAF, 0x01, 0xC0, 0x2E, 0xE4, 0x1E, 0xE4, 0x2E, 0xE4, + 0x00, 0xC0, 0x3A, 0x3C, 0x48, 0x00, 0xC0, 0xE0, 0x01, 0xC0, 0x77, 0x08, + 0x2E, 0xE4, 0x00, 0xC0, 0x18, 0x3C, 0x17, 0x34, 0x17, 0x24, 0x01, 0xC0, + 0xAA, 0xCE, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, 0x00, 0xC0, 0x18, 0x4C, + 0x49, 0xE0, 0x67, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x10, 0xA8, 0x4A, 0xE0, + 0x3C, 0x3C, 0x06, 0xA8, 0x1B, 0xE4, 0x09, 0xA8, 0xE6, 0x3C, 0x1A, 0xE0, + 0xAA, 0xF2, 0x72, 0x06, 0x1E, 0xE4, 0x40, 0x0B, 0x6A, 0xE1, 0x93, 0x3C, + 0x91, 0x3C, 0x00, 0xA2, 0x3E, 0xA2, 0xE8, 0xF0, 0x04, 0xA1, 0x3C, 0x28, + 0x0A, 0xE4, 0xA2, 0x0B, 0x1E, 0xE4, 0xF0, 0x3C, 0x1E, 0xE4, 0xBE, 0x05, + 0x1E, 0xE4, 0x05, 0x09, 0x6E, 0xF0, 0x05, 0x09, 0x0D, 0xE4, 0xC8, 0x10, + 0x00, 0x00, 0xFF, 0xD1, 0xD1, 0x0F, 0x1E, 0xE4, 0x16, 0x28, 0xF0, 0x3C, + 0x14, 0xA2, 0x1D, 0xF1, 0xA0, 0xF0, 0x00, 0x08, 0x02, 0xE0, 0xD6, 0xF0, + 0x00, 0x08, 0x02, 0xE0, 0x86, 0xF0, 0x17, 0x28, 0x02, 0xA2, 0x93, 0x3C, + 0x00, 0xA2, 0x50, 0xF0, 0x6A, 0xE1, 0x93, 0x3C, 0x02, 0xA2, 0x5E, 0xF0, + 0x2E, 0xE4, 0x75, 0x08, 0x1E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x68, 0xF0, + 0xF2, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0x93, 0x0A, 0x1E, 0xE4, 0x8E, 0x0A, + 0x24, 0x09, 0x08, 0xE4, 0x04, 0xA1, 0x10, 0x28, 0x1E, 0xE4, 0x2E, 0xE4, + 0x71, 0x09, 0x0E, 0xE4, 0x45, 0x00, 0xC0, 0xE0, 0x5A, 0xF0, 0x13, 0x08, + 0x2E, 0xE4, 0x91, 0x3C, 0x1A, 0xE0, 0x08, 0xA8, 0x62, 0xE1, 0x95, 0x3C, + 0x94, 0x3C, 0x00, 0xA2, 0x6A, 0xE1, 0x12, 0x3D, 0x3F, 0xC7, 0x70, 0x06, + 0x08, 0xA2, 0x9A, 0xF0, 0x1B, 0x09, 0x1E, 0xE4, 0x83, 0x0A, 0x1E, 0xE4, + 0x4C, 0x3C, 0x4B, 0x3C, 0x1E, 0xE4, 0x2E, 0xE4, 0x93, 0x0A, 0x1E, 0xE4, + 0x6C, 0xF0, 0x01, 0x00, 0xFF, 0xD1, 0xB1, 0x11, 0x02, 0xA2, 0x4C, 0x3C, + 0x4B, 0x3C, 0x08, 0xA2, 0x1E, 0xE4, 0xDA, 0xF0, 0xDF, 0x28, 0x94, 0x3C, + 0xF9, 0x0C, 0x1E, 0xE4, 0xAA, 0xF0, 0x3A, 0x0C, 0x36, 0xB4, 0x91, 0x2A, + 0x9F, 0x4C, 0x9E, 0x20, 0x1E, 0xE4, 0x7E, 0xF0, 0x9F, 0x3C, 0x9E, 0x34, + 0x1E, 0xE4, 0xD0, 0x0A, 0x1E, 0xE4, 0x83, 0x0A, 0x05, 0xE0, 0x42, 0x4C, + 0x41, 0x20, 0x93, 0x0A, 0x52, 0xF1, 0x46, 0xE0, 0x21, 0xAE, 0x30, 0x00, + 0x73, 0xC8, 0x06, 0xAE, 0x42, 0x4C, 0x41, 0x20, 0x0F, 0xA8, 0x49, 0xE0, + 0xF6, 0xF0, 0x46, 0xE0, 0x45, 0xCC, 0x03, 0xA1, 0x46, 0xE0, 0x9B, 0xF0, + 0x90, 0xE1, 0x41, 0xBA, 0x6B, 0x09, 0x84, 0xE1, 0xE0, 0xF7, 0x10, 0xA1, + 0x4F, 0xBA, 0x46, 0xF0, 0x00, 0xA2, 0x92, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x09, 0xC0, 0x57, 0x3C, 0x52, 0x3C, 0x51, 0x3C, 0x92, 0x28, 0x00, 0xC0, + 0x16, 0x3C, 0x00, 0xA2, 0x00, 0xA2, 0xBA, 0xF0, 0xDD, 0x28, 0x28, 0xE4, + 0xD3, 0x28, 0x92, 0xCC, 0xD4, 0x28, 0xDD, 0x3C, 0x0E, 0xE4, 0xD2, 0x09, + 0x0A, 0xE4, 0x18, 0xA1, 0x0A, 0xE4, 0xE8, 0x05, 0x1E, 0xE4, 0xD8, 0x09, + 0x9A, 0xF2, 0x14, 0xA1, 0xD3, 0x28, 0xB8, 0x09, 0xD3, 0x28, 0xBA, 0xF3, + 0x16, 0xA1, 0xD3, 0x28, 0x1A, 0xA1, 0xD3, 0x28, 0xDA, 0xF3, 0x18, 0xA1, + 0x1C, 0xA1, 0xD3, 0x28, 0xD8, 0x09, 0x0A, 0xE4, 0x1E, 0xA1, 0xD3, 0x28, + 0xE4, 0x09, 0x0A, 0xE4, 0x36, 0xA1, 0xD3, 0x28, 0xEE, 0x09, 0x0A, 0xE4, + 0x38, 0xA1, 0xD3, 0x28, 0x01, 0x0A, 0x0A, 0xE4, 0x3A, 0xA1, 0xD3, 0x28, + 0x01, 0x0A, 0x0A, 0xE4, 0x3C, 0xA1, 0xD3, 0x28, 0x01, 0x0A, 0x0A, 0xE4, + 0x3E, 0xA1, 0xD3, 0x28, 0x01, 0x0A, 0x0A, 0xE4, 0x7B, 0x09, 0x0E, 0xE4, + 0x01, 0x0A, 0x0A, 0xE4, 0xD3, 0x28, 0xB8, 0xF0, 0x1B, 0x09, 0x1E, 0xE4, + 0x19, 0x0A, 0x0A, 0xE4, 0xFF, 0x00, 0x02, 0xE0, 0x0E, 0xE4, 0xB3, 0x05, + 0x1E, 0xE4, 0x02, 0xA2, 0x4C, 0x3C, 0x4B, 0x3C, 0x08, 0xA2, 0x7B, 0x09, + 0x93, 0x0A, 0x1E, 0xE4, 0x83, 0x0A, 0x1E, 0xE4, 0xB3, 0x05, 0x1E, 0xE4, + 0x02, 0xA2, 0x2E, 0xE4, 0xBE, 0x05, 0x1E, 0xE4, 0x7B, 0x09, 0x0E, 0xE4, + 0x7B, 0x09, 0x0E, 0xE4, 0x5F, 0x0A, 0x1E, 0xE4, 0xBE, 0x05, 0x1E, 0xE4, + 0x6D, 0x0C, 0x1E, 0xE4, 0x06, 0xA1, 0x4A, 0x28, 0x20, 0x0A, 0x1E, 0xE4, + 0x7B, 0x09, 0x0E, 0xE4, 0x83, 0x0C, 0x1A, 0xE4, 0x66, 0x11, 0x1E, 0xE4, + 0xBE, 0x05, 0x1E, 0xE4, 0x00, 0x00, 0xFF, 0xD1, 0xA2, 0x11, 0x1E, 0xE4, + 0xBE, 0x05, 0x1E, 0xE4, 0x7B, 0x09, 0x0E, 0xE4, 0xB6, 0x15, 0x1E, 0xE4, + 0xC8, 0x10, 0x1E, 0xE4, 0xEF, 0x0C, 0x1E, 0xE4, 0x3F, 0x11, 0x1E, 0xE4, + 0x00, 0x00, 0xFF, 0xD1, 0x91, 0x3C, 0x00, 0xA2, 0x0E, 0xE4, 0x07, 0x0A, + 0x08, 0xE4, 0xDB, 0x28, 0x1E, 0xE4, 0xBE, 0x05, 0x1E, 0xE4, 0x7B, 0x09, + 0x1E, 0xE4, 0x7B, 0x09, 0x0E, 0xE4, 0xE4, 0x19, 0x02, 0xA2, 0xC4, 0x08, + 0x1E, 0xE4, 0xAD, 0x15, 0x9C, 0x28, 0xC7, 0x08, 0x61, 0xE1, 0x92, 0x3C, + 0xFE, 0xA2, 0x94, 0xE0, 0xCA, 0x08, 0x00, 0xE0, 0x0E, 0xE4, 0x02, 0x3D, + 0xFA, 0xA2, 0x01, 0x3D, 0x1E, 0xE4, 0x94, 0x3C, 0x02, 0xA2, 0x7B, 0x09, + 0x2E, 0xE4, 0x93, 0x0A, 0x1E, 0xE4, 0x8E, 0x0A, 0x62, 0xE1, 0x95, 0x3C, + 0x94, 0x3C, 0x00, 0xA2, 0x6A, 0xE1, 0x12, 0x3D, 0x3F, 0xC7, 0x70, 0x06, + 0x01, 0x00, 0xFF, 0xD1, 0xDA, 0x11, 0x1E, 0xE4, 0x4C, 0x3C, 0x4B, 0x3C, + 0x08, 0xA2, 0x6C, 0xF0, 0x18, 0xE4, 0xDF, 0x28, 0x94, 0x3C, 0x02, 0xA2, + 0x58, 0xF0, 0xF9, 0x0C, 0x18, 0xE4, 0x3A, 0x0C, 0xD0, 0x0A, 0x1E, 0xE4, + 0x83, 0x0A, 0x1E, 0xE4, 0x09, 0xA1, 0x4B, 0x2A, 0x06, 0xA1, 0x4A, 0x28, + 0x93, 0x0A, 0x1E, 0xE4, 0x5A, 0xF0, 0x36, 0xB6, 0x28, 0xE4, 0x92, 0x28, + 0x92, 0x3C, 0x02, 0xA2, 0x1E, 0xE4, 0x51, 0x3C, 0x02, 0xA0, 0x51, 0x28, + 0x28, 0xE4, 0xE0, 0x28, 0x28, 0xE4, 0xD0, 0x0B, 0x52, 0x3C, 0x4E, 0x28, + 0x94, 0x3C, 0x02, 0xA2, 0x52, 0x0D, 0x1E, 0xE4, 0x57, 0x3C, 0x00, 0xA2, + 0x93, 0x0A, 0x1E, 0xE4, 0xD0, 0x0A, 0x1E, 0xE4, 0x4A, 0x28, 0x2E, 0xE4, + 0x92, 0x3C, 0x02, 0xA2, 0x02, 0xA1, 0x51, 0x28, 0x28, 0xE4, 0x06, 0xA1, + 0x1E, 0xE4, 0xE8, 0xF0, 0xE0, 0x28, 0x28, 0xE4, 0x3C, 0xF0, 0x01, 0x00, + 0xFF, 0xD1, 0xF1, 0x11, 0x52, 0x0D, 0x1E, 0xE4, 0x94, 0x3C, 0x02, 0xA2, + 0x93, 0x0A, 0x1E, 0xE4, 0xD0, 0x0A, 0x1E, 0xE4, 0xE0, 0x28, 0x2E, 0xE4, + 0x92, 0x3C, 0x02, 0xA2, 0xFF, 0xD1, 0xFD, 0x11, 0x1E, 0xE4, 0x28, 0xE4, + 0x94, 0x3C, 0x02, 0xA2, 0x3C, 0xF0, 0x01, 0x00, 0x1E, 0xE4, 0x2E, 0xE4, + 0xD0, 0x0A, 0x1E, 0xE4, 0x1E, 0xE4, 0xF9, 0x0C, 0x1E, 0xE4, 0x4F, 0x17, + 0x1E, 0xE4, 0x52, 0x19, 0x1E, 0xE4, 0x52, 0x0D, 0x14, 0x0D, 0x1E, 0xE4, + 0x2E, 0xE4, 0xB3, 0x18, 0x1E, 0xE4, 0x2E, 0xE4, 0xB3, 0x18, 0x1E, 0xE4, + 0x04, 0xAE, 0x02, 0xA2, 0x2E, 0xE4, 0x12, 0x19, 0xC2, 0xE0, 0x52, 0x4C, + 0x02, 0xAE, 0x4A, 0x4C, 0x2E, 0xE4, 0xA0, 0x0A, 0x1E, 0xE4, 0x04, 0x01, + 0xC2, 0xE0, 0x13, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x14, 0x01, 0xC2, 0xE0, + 0x00, 0xA2, 0x0D, 0x03, 0x16, 0x01, 0xC2, 0xE0, 0x15, 0x01, 0xC2, 0xE0, + 0x57, 0x18, 0x88, 0x28, 0x27, 0x01, 0xC2, 0xE0, 0x28, 0x01, 0xC2, 0xE0, + 0x16, 0xE0, 0x87, 0x4C, 0x3E, 0xA2, 0x26, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x00, 0xA2, 0x0F, 0x03, 0xC2, 0xE0, 0xC2, 0xE0, 0x55, 0x00, + 0x04, 0xE0, 0x09, 0x03, 0x0A, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x0C, 0x03, + 0xB0, 0x03, 0x62, 0xE1, 0x0B, 0x03, 0xC2, 0xE0, 0x84, 0xE1, 0x1F, 0x00, + 0x22, 0xD0, 0x00, 0xA2, 0x2E, 0xE4, 0x90, 0xE1, 0x12, 0x9F, 0xCE, 0x0A, + 0x24, 0xE4, 0x06, 0x29, 0xC7, 0x08, 0x66, 0xE1, 0xFD, 0x16, 0x1E, 0xE4, + 0xC7, 0x15, 0x1E, 0xE4, 0x2E, 0xF0, 0x6A, 0xE1, 0x38, 0xF0, 0x94, 0x28, + 0x2A, 0xE4, 0x08, 0xA1, 0x4B, 0x28, 0x6B, 0xE1, 0x01, 0x00, 0x8C, 0xD1, + 0x08, 0xCF, 0xFE, 0xA2, 0x87, 0x3C, 0x00, 0xA2, 0xF8, 0xF7, 0x18, 0xCB, + 0x37, 0x1C, 0x1E, 0xE4, 0x86, 0x3C, 0x88, 0x3C, 0xA9, 0x1C, 0x1E, 0xE4, + 0x51, 0x1C, 0x1E, 0xE4, 0x1E, 0xE4, 0x29, 0x19, 0x18, 0xE4, 0xA7, 0x28, + 0x86, 0x28, 0x02, 0x00, 0xFF, 0xD1, 0xCB, 0x1C, 0x02, 0xA0, 0x87, 0x28, + 0x86, 0x3C, 0x02, 0xA0, 0x00, 0xA2, 0xC4, 0xF6, 0x55, 0x18, 0x87, 0x3C, + 0x88, 0x3C, 0x02, 0xA0, 0x88, 0x28, 0x87, 0x3C, 0x3E, 0x2A, 0x02, 0xA2, + 0x12, 0xF3, 0x56, 0x18, 0x33, 0x0B, 0x0A, 0xE4, 0x2C, 0x12, 0x19, 0xE4, + 0x94, 0xC8, 0xC8, 0xF5, 0x04, 0xA1, 0x10, 0x28, 0x08, 0xF2, 0x94, 0x28, + 0x98, 0xF5, 0x6B, 0x4C, 0x1E, 0xE4, 0xDA, 0xF1, 0x06, 0x0C, 0x1E, 0xE4, + 0xFF, 0xD1, 0xFD, 0x11, 0x1E, 0xE4, 0xBE, 0x05, 0x57, 0x18, 0x88, 0x28, + 0x6D, 0xF1, 0x01, 0x00, 0x06, 0xF1, 0x57, 0x18, 0x56, 0x28, 0x38, 0xF1, + 0xFD, 0x16, 0x1E, 0xE4, 0xC7, 0x15, 0x1E, 0xE4, 0x88, 0x3C, 0x57, 0x28, + 0x87, 0x3C, 0x00, 0xA2, 0x86, 0x3C, 0x18, 0xE0, 0x55, 0x82, 0x88, 0x84, + 0x6B, 0xE1, 0xEA, 0x0A, 0x0E, 0xE4, 0x6A, 0xE1, 0x08, 0xCF, 0x56, 0x28, + 0xEA, 0x0A, 0x0E, 0xE4, 0xF8, 0xF7, 0x18, 0xCB, 0x01, 0x00, 0x8C, 0xD1, + 0x2E, 0xE4, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x00, 0x00, 0x34, 0xD0, + 0x00, 0x00, 0x30, 0xD0, 0x00, 0x00, 0x35, 0xD0, 0x00, 0x00, 0x33, 0xD0, + 0x00, 0x00, 0x37, 0xD0, 0x7F, 0x00, 0x36, 0xD0, 0xC0, 0xE0, 0x81, 0xE1, + 0x00, 0x00, 0x38, 0xD0, 0xC0, 0xE0, 0xBA, 0x3C, 0xB9, 0x34, 0x60, 0x00, + 0xBC, 0x3C, 0xBB, 0x34, 0x14, 0xAE, 0x61, 0x00, 0xBE, 0x3C, 0xBD, 0x34, + 0xBA, 0x0C, 0xB9, 0x04, 0xFF, 0x01, 0x08, 0xE0, 0x48, 0x00, 0xC0, 0xE0, + 0xBF, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0xC5, 0x3C, 0x28, 0xCA, 0xC0, 0x3C, + 0x00, 0xFE, 0x08, 0xE0, 0x20, 0xCE, 0xC0, 0x4C, 0xBF, 0x24, 0xF8, 0xF7, + 0x80, 0x00, 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x02, 0xAE, 0x06, 0xA8, + 0x43, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x26, 0xCE, 0x22, 0xA0, + 0x00, 0x02, 0x00, 0xE0, 0xC0, 0x4C, 0xBF, 0x24, 0xBD, 0x16, 0x49, 0xE0, + 0xC0, 0x3C, 0xBF, 0x34, 0xBA, 0x4C, 0xB9, 0x24, 0x55, 0xF0, 0xBE, 0x1E, + 0x11, 0xD1, 0x20, 0xCE, 0xC0, 0x3C, 0xBF, 0x34, 0xC0, 0xE0, 0x80, 0x00, + 0x12, 0xD1, 0x80, 0x00, 0x22, 0xA0, 0x02, 0xAE, 0x06, 0xA8, 0x43, 0x00, + 0x28, 0xE1, 0xF8, 0xF7, 0x28, 0xCA, 0x26, 0xCE, 0x4F, 0xBA, 0x34, 0xF0, + 0x02, 0xA1, 0xC5, 0x28, 0x85, 0x00, 0x09, 0xE0, 0x3F, 0xBA, 0xDE, 0xF7, + 0x36, 0xB6, 0x04, 0xA2, 0x85, 0x00, 0x03, 0xE0, 0xE8, 0x05, 0x1E, 0xE4, + 0x2E, 0xE4, 0x3C, 0x3C, 0x0A, 0xF2, 0x14, 0xA1, 0xD3, 0x28, 0x3A, 0xF2, + 0xD3, 0x28, 0x1A, 0xF2, 0x16, 0xA1, 0xD3, 0x28, 0x1A, 0xA1, 0xD3, 0x28, + 0xEA, 0xF1, 0x18, 0xA1, 0x8A, 0xF1, 0x1C, 0xA1, 0xD3, 0x28, 0xBA, 0xF1, + 0xD3, 0x28, 0x3A, 0xF1, 0x1E, 0xA1, 0xD3, 0x28, 0x38, 0xA1, 0xD3, 0x28, + 0x2A, 0xF1, 0x36, 0xA1, 0xCA, 0xF0, 0x3A, 0xA1, 0xD3, 0x28, 0xFA, 0xF0, + 0xD3, 0x28, 0x9A, 0xF0, 0x3C, 0xA1, 0xD3, 0x28, 0x00, 0xA2, 0x5E, 0xF0, + 0x6A, 0xF0, 0x3E, 0xA1, 0x02, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, + 0xA2, 0x0B, 0x0E, 0xE4, 0xB3, 0x05, 0x1E, 0xE4, 0xD3, 0x28, 0x5A, 0xF2, + 0xE8, 0x05, 0x1E, 0xE4, 0x16, 0xA1, 0xD3, 0x28, 0x2A, 0xF2, 0x14, 0xA1, + 0xEA, 0xF1, 0x18, 0xA1, 0xD3, 0x28, 0xFA, 0xF1, 0xD3, 0x28, 0x9A, 0xF1, + 0x1A, 0xA1, 0xD3, 0x28, 0x1E, 0xA1, 0xD3, 0x28, 0x6A, 0xF1, 0x1C, 0xA1, + 0x4A, 0xF1, 0x36, 0xA1, 0xD3, 0x28, 0x3A, 0xF1, 0xD3, 0x28, 0x1A, 0xF1, + 0x38, 0xA1, 0xD3, 0x28, 0x3C, 0xA1, 0xD3, 0x28, 0xEA, 0xF0, 0x3A, 0xA1, + 0x3E, 0xA1, 0xD3, 0x28, 0xFB, 0x0B, 0x0A, 0xE4, 0x00, 0xA2, 0xBE, 0xF0, + 0xFB, 0x0B, 0x0A, 0xE4, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, + 0x0E, 0xE4, 0xE4, 0x19, 0x1E, 0xE4, 0xBE, 0x05, 0xB3, 0x05, 0x1E, 0xE4, + 0x02, 0xA2, 0xD0, 0x0B, 0xE8, 0x05, 0x1E, 0xE4, 0xD0, 0x0B, 0x0E, 0xE4, + 0x0A, 0xF2, 0x14, 0xA1, 0xD3, 0x28, 0x3A, 0xF2, 0xD3, 0x28, 0xFA, 0xF1, + 0x16, 0xA1, 0xD3, 0x28, 0x1A, 0xA1, 0xD3, 0x28, 0xAA, 0xF1, 0x18, 0xA1, + 0x4A, 0xF1, 0x1C, 0xA1, 0xD3, 0x28, 0x7A, 0xF1, 0xD3, 0x28, 0x1A, 0xF1, + 0x1E, 0xA1, 0xD3, 0x28, 0x38, 0xA1, 0xD3, 0x28, 0x2A, 0xF1, 0x36, 0xA1, + 0xCA, 0xF0, 0x3A, 0xA1, 0xD3, 0x28, 0xFA, 0xF0, 0xD3, 0x28, 0x9A, 0xF0, + 0x3C, 0xA1, 0xD3, 0x28, 0x00, 0xA2, 0xBE, 0xF0, 0x6A, 0xF0, 0x3E, 0xA1, + 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x0E, 0xE4, 0xE4, 0x19, + 0x1E, 0xE4, 0xBE, 0x05, 0xB3, 0x05, 0x1E, 0xE4, 0x02, 0xA2, 0x06, 0x0C, + 0xA8, 0xF0, 0xDE, 0x28, 0x06, 0x0C, 0x0E, 0xE4, 0xAA, 0xF0, 0x02, 0xA1, + 0xBA, 0xF1, 0xDF, 0x28, 0xCA, 0xF0, 0x04, 0xA1, 0x8A, 0xF0, 0x02, 0xA1, + 0x1A, 0xF1, 0x4C, 0x08, 0x4B, 0x28, 0x0E, 0xF1, 0x4C, 0x08, 0xA0, 0xF0, + 0x4B, 0x28, 0xCE, 0xF0, 0x4B, 0x28, 0x6E, 0xF0, 0xB6, 0xF0, 0x02, 0xA1, + 0x1E, 0xF0, 0x6A, 0xF0, 0x04, 0xA8, 0x4C, 0x4C, 0x2E, 0xE4, 0x02, 0xA2, + 0xE0, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0xE0, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x2A, 0xF0, 0x04, 0xA1, 0x3C, 0x28, 0x1E, 0xE4, 0x28, 0xE4, + 0x13, 0x08, 0x1E, 0xE4, 0x28, 0xE4, 0x16, 0xA1, 0xD3, 0x28, 0xE8, 0x05, + 0x5E, 0xF7, 0xB3, 0x05, 0x1E, 0xE4, 0x02, 0xA2, 0x01, 0xC0, 0x28, 0xE4, + 0xDC, 0x28, 0x2E, 0xE4, 0xC2, 0xE0, 0x00, 0xC0, 0x18, 0x4C, 0x17, 0x24, + 0x2E, 0xE4, 0xDC, 0x3C, 0x02, 0xA2, 0x51, 0x00, 0x77, 0x08, 0x1E, 0xE4, + 0x28, 0xE4, 0xDC, 0x28, 0x51, 0x00, 0xC2, 0xE0, 0x48, 0x00, 0xC0, 0xE0, + 0xC0, 0xE0, 0x2E, 0xE4, 0xDC, 0x3C, 0x02, 0xA2, 0x2A, 0xE4, 0x00, 0x04, + 0x08, 0xE0, 0x5C, 0x00, 0x5D, 0x00, 0xC1, 0xE0, 0x00, 0x04, 0x04, 0xE0, + 0x02, 0xA2, 0x5D, 0x00, 0xC3, 0xE0, 0x55, 0xE0, 0x08, 0xE0, 0x5D, 0x00, + 0xC0, 0xE0, 0x00, 0xCE, 0x2E, 0xE4, 0xB8, 0xF7, 0x90, 0xE1, 0x00, 0x04, + 0x10, 0x2A, 0x3F, 0x28, 0x8E, 0x3C, 0x02, 0xA2, 0x00, 0xA2, 0x8B, 0x3C, + 0x36, 0xB6, 0x05, 0xA1, 0x04, 0xA2, 0x8F, 0x3C, 0x02, 0xA2, 0x8C, 0x3C, + 0x04, 0xA2, 0x97, 0x3C, 0x52, 0xB4, 0x8F, 0x2A, 0x8F, 0x46, 0x33, 0xB6, + 0x05, 0xA1, 0x10, 0x2A, 0x16, 0xB6, 0x8C, 0x4E, 0x8B, 0x2A, 0x32, 0xB6, + 0x30, 0xF0, 0x04, 0xA1, 0x97, 0x3C, 0x97, 0x08, 0x8F, 0x2A, 0x00, 0xA2, + 0x97, 0x3C, 0x06, 0xA2, 0x99, 0x3C, 0x16, 0xB6, 0x89, 0x2A, 0x32, 0xB4, + 0x9A, 0x3C, 0x30, 0xB6, 0x8E, 0x4C, 0x8D, 0x28, 0x16, 0xB6, 0x89, 0x2A, + 0x9B, 0x3C, 0x8F, 0x28, 0x02, 0xA2, 0x9C, 0x3C, 0x00, 0xA2, 0x9B, 0x3C, + 0xA0, 0x3C, 0x9E, 0x3C, 0x00, 0xA2, 0x9D, 0x3C, 0x00, 0xA2, 0xE0, 0x07, + 0x65, 0xE1, 0x2E, 0xE4, 0xD5, 0x0C, 0x84, 0xE1, 0x1F, 0x00, 0x22, 0xD0, + 0xC3, 0x08, 0x65, 0xE1, 0x02, 0xA0, 0x15, 0x3D, 0x04, 0xE0, 0x15, 0x3D, + 0x15, 0x35, 0x00, 0xA2, 0x65, 0xE1, 0x15, 0x3D, 0x15, 0x3D, 0xFF, 0xFF, + 0x15, 0x3D, 0x08, 0xC7, 0xFA, 0xA2, 0xC7, 0x08, 0x08, 0xAE, 0x08, 0xAF, + 0x1E, 0xA0, 0x16, 0x28, 0x08, 0xAF, 0x1E, 0xA0, 0x17, 0x28, 0xA2, 0x3C, + 0x02, 0xA2, 0x2E, 0xE4, 0xA3, 0x3C, 0x08, 0xAE, 0xDB, 0x0D, 0x1E, 0xE4, + 0x2E, 0xE4, 0x9D, 0x3C, 0x0C, 0xB6, 0x02, 0xA1, 0xB4, 0x0F, 0x1E, 0xE4, + 0xE0, 0x28, 0xDB, 0x0D, 0x1E, 0xE4, 0x2E, 0xE4, 0x15, 0x0E, 0x1E, 0xE4, + 0xE3, 0x0D, 0x1A, 0xE4, 0x08, 0x0F, 0x1E, 0xE4, 0xA3, 0x0E, 0x1E, 0xE4, + 0x9D, 0x3C, 0x00, 0xA2, 0xE8, 0xF0, 0xE0, 0x28, 0x36, 0xB4, 0x91, 0x2A, + 0x9F, 0x4C, 0x9E, 0x20, 0xA1, 0x4C, 0xA0, 0x20, 0x9F, 0x3C, 0x9E, 0x34, + 0x2E, 0xE4, 0xA1, 0x3C, 0xA0, 0x34, 0x02, 0xA0, 0x62, 0xE1, 0xFA, 0xA2, + 0xDB, 0x0D, 0x1E, 0xE4, 0xDB, 0x08, 0x62, 0xE1, 0x02, 0x3D, 0xC7, 0x08, + 0xEF, 0x08, 0x64, 0xE1, 0xEB, 0x08, 0x63, 0xE1, 0x25, 0x0D, 0x84, 0xE1, + 0x03, 0x00, 0x22, 0xD0, 0x03, 0x00, 0x22, 0xD0, 0x0C, 0x3D, 0x0B, 0x29, + 0x0C, 0x3D, 0x0B, 0x29, 0x2B, 0x0D, 0x84, 0xE1, 0x31, 0x0D, 0x84, 0xE1, + 0x03, 0x00, 0x22, 0xD0, 0xC7, 0x08, 0x62, 0xE1, 0x0C, 0x3D, 0x0A, 0x29, + 0xCC, 0x08, 0x64, 0xE1, 0xCB, 0x08, 0x63, 0xE1, 0x0C, 0x3D, 0x0B, 0x29, + 0x0C, 0x3D, 0x0B, 0x29, 0xE8, 0x08, 0x62, 0xE1, 0x0C, 0x3D, 0x0A, 0x29, + 0x02, 0x4D, 0x02, 0xAE, 0xA5, 0x4C, 0xA4, 0x28, 0xA5, 0x4C, 0x02, 0xAE, + 0xA4, 0x28, 0x12, 0x3D, 0x02, 0x4D, 0x14, 0xAE, 0xA6, 0x4C, 0x08, 0xAE, + 0x00, 0xA2, 0x08, 0x0F, 0x1E, 0xE4, 0x02, 0x3D, 0x4B, 0x00, 0x04, 0xE0, + 0x2E, 0xE4, 0x9D, 0x3C, 0x0C, 0xA8, 0x02, 0x29, 0x94, 0xE0, 0x51, 0x08, + 0x9E, 0x0D, 0x08, 0xE4, 0x51, 0x28, 0x28, 0xE4, 0xD5, 0x08, 0x00, 0xE0, + 0x02, 0xAE, 0x52, 0x28, 0x02, 0x29, 0x96, 0xE0, 0x0A, 0xA1, 0x94, 0xE0, + 0x02, 0xAE, 0x16, 0xE0, 0x52, 0x28, 0x03, 0x3D, 0x0A, 0xA1, 0x94, 0xE0, + 0xD5, 0x08, 0x00, 0xE0, 0x06, 0xA2, 0x03, 0x3D, 0x02, 0x29, 0x96, 0xE0, + 0x07, 0xA1, 0x4A, 0x2A, 0x16, 0xB6, 0x52, 0x2A, 0x94, 0xE0, 0x67, 0x00, + 0x00, 0xE0, 0x12, 0xB6, 0xD1, 0x08, 0x00, 0xE0, 0x02, 0xAE, 0x52, 0x28, + 0x0A, 0x4D, 0x0C, 0xAE, 0x0A, 0x29, 0x96, 0xE0, 0x06, 0xA2, 0x03, 0x3D, + 0x0A, 0x4D, 0x02, 0xAE, 0x07, 0xA1, 0x4A, 0x2A, 0x12, 0xB6, 0x52, 0x2A, + 0x94, 0xE0, 0x67, 0x00, 0x00, 0xE0, 0x12, 0xB6, 0x00, 0xE0, 0x02, 0xAE, + 0x16, 0xE0, 0x52, 0x28, 0x0C, 0xAE, 0x0A, 0x29, 0x96, 0xE0, 0xD1, 0x08, + 0x03, 0x3D, 0x0A, 0x4D, 0x02, 0xAE, 0x0A, 0x4D, 0x03, 0xC7, 0x00, 0xA2, + 0xD4, 0x08, 0x62, 0xE1, 0x02, 0xAE, 0x52, 0x28, 0x2E, 0xE4, 0x12, 0x3D, + 0x02, 0xA1, 0x94, 0xE0, 0xD1, 0x08, 0x00, 0xE0, 0x52, 0x28, 0x03, 0x3D, + 0x02, 0x29, 0x96, 0xE0, 0xD5, 0x08, 0x00, 0xE0, 0x02, 0xAE, 0x16, 0xE0, + 0x02, 0x29, 0x96, 0xE0, 0x02, 0xA1, 0x94, 0xE0, 0x16, 0xB6, 0x52, 0x2A, + 0x06, 0xA2, 0x03, 0x3D, 0x00, 0xE0, 0x12, 0xB6, 0x07, 0xA1, 0x4A, 0x2A, + 0x02, 0xAE, 0x52, 0x28, 0x94, 0xE0, 0x67, 0x00, 0x0A, 0x29, 0x96, 0xE0, + 0xD1, 0x08, 0x00, 0xE0, 0x0A, 0x4D, 0x02, 0xAE, 0x0A, 0x4D, 0x0C, 0xAE, + 0x12, 0xB6, 0x52, 0x2A, 0x06, 0xA2, 0x03, 0x3D, 0x00, 0xE0, 0x12, 0xB6, + 0x07, 0xA1, 0x4A, 0x2A, 0x16, 0xE0, 0x52, 0x28, 0x94, 0xE0, 0x67, 0x00, + 0x96, 0xE0, 0xD5, 0x08, 0x00, 0xE0, 0x02, 0xAE, 0x02, 0xAE, 0x0A, 0x4D, + 0x0C, 0xAE, 0x0A, 0x29, 0x9C, 0x28, 0x2E, 0xE4, 0x03, 0x3D, 0x0A, 0x4D, + 0x02, 0x29, 0xCA, 0x08, 0x62, 0xE1, 0x26, 0xE4, 0x62, 0xE1, 0x2E, 0xE4, + 0x60, 0x0F, 0x1E, 0xE4, 0x38, 0x4C, 0x02, 0xAE, 0x36, 0x28, 0xD8, 0x08, + 0x39, 0x4C, 0x06, 0xAE, 0x37, 0x4C, 0x06, 0xAE, 0x8C, 0x4C, 0x02, 0xAE, + 0x5C, 0x4C, 0x02, 0xAE, 0x36, 0x2A, 0x02, 0xAE, 0x5B, 0x4C, 0x04, 0xAE, + 0x32, 0xB4, 0x8B, 0x46, 0x5C, 0x4E, 0x38, 0x4E, 0x8C, 0x46, 0x33, 0xB6, + 0x5B, 0x2A, 0x02, 0xAE, 0x02, 0xAE, 0x00, 0xA9, 0x02, 0xAE, 0x32, 0xB4, + 0x02, 0xAE, 0x00, 0xA2, 0x12, 0x3D, 0x00, 0xA9, 0x04, 0xAE, 0x00, 0xA9, + 0x08, 0xAE, 0x00, 0xA9, 0x06, 0xAE, 0x4A, 0x4C, 0x04, 0xAE, 0x10, 0x4C, + 0x12, 0x3D, 0x4C, 0x4C, 0x06, 0xAE, 0x4B, 0x4C, 0x12, 0x3D, 0x54, 0x28, + 0x12, 0x3D, 0x53, 0x28, 0x08, 0xE4, 0x04, 0xA8, 0x4B, 0x28, 0x2E, 0xE4, + 0x63, 0xE1, 0xC7, 0x08, 0x62, 0xE1, 0x77, 0x0E, 0x0B, 0x1B, 0x13, 0x2B, + 0x03, 0xA2, 0xC8, 0x08, 0x03, 0x29, 0x71, 0x0F, 0x19, 0xE4, 0x13, 0x29, + 0xF2, 0xB7, 0x91, 0x2A, 0xD2, 0xB7, 0xE0, 0x2A, 0xE0, 0x4E, 0x91, 0x4E, + 0x09, 0xA8, 0x4B, 0x2A, 0x62, 0xE1, 0x02, 0x3D, 0x1C, 0x0F, 0x1B, 0xE4, + 0x64, 0xE1, 0xDC, 0x08, 0x63, 0xE1, 0xD8, 0x08, 0x84, 0xE1, 0x03, 0x00, + 0x22, 0xD0, 0xE0, 0x08, 0x22, 0xD0, 0x13, 0x3D, 0x14, 0x29, 0x3A, 0x0E, + 0x12, 0x29, 0x40, 0x0E, 0x84, 0xE1, 0x03, 0x00, 0x63, 0xE1, 0xC7, 0x08, + 0x62, 0xE1, 0x13, 0x3D, 0x14, 0x29, 0xC9, 0x08, 0x64, 0xE1, 0xC8, 0x08, + 0x9B, 0x28, 0x13, 0x3D, 0x12, 0x29, 0x13, 0x3D, 0xDF, 0x08, 0x00, 0xE0, + 0x04, 0xAE, 0x16, 0xE0, 0x64, 0xE1, 0xEB, 0x08, 0x63, 0xE1, 0x94, 0xE0, + 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0xEF, 0x08, 0x22, 0xD0, 0x0C, 0x3D, + 0x0B, 0x29, 0x5A, 0x0E, 0x0B, 0x29, 0x60, 0x0E, 0x84, 0xE1, 0x03, 0x00, + 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0x0C, 0x3D, 0x9B, 0x28, 0x0C, 0x3D, + 0x0A, 0x29, 0x66, 0x0E, 0x94, 0xE0, 0xC8, 0x08, 0x00, 0xE0, 0x16, 0xE0, + 0xCC, 0x08, 0x64, 0xE1, 0xCB, 0x08, 0x63, 0xE1, 0x0C, 0x3D, 0x0B, 0x29, + 0x0C, 0x3D, 0x0B, 0x29, 0xE0, 0x2A, 0x2E, 0xE4, 0x0C, 0x3D, 0x0A, 0x29, + 0x62, 0xE1, 0x3E, 0x0F, 0x1B, 0xE4, 0xD2, 0xB7, 0xDB, 0x08, 0x62, 0xE1, + 0x02, 0x3D, 0xC7, 0x08, 0xEF, 0x08, 0x64, 0xE1, 0xEB, 0x08, 0x63, 0xE1, + 0x89, 0x0E, 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0x03, 0x00, 0x22, 0xD0, + 0x0C, 0x3D, 0x0B, 0x29, 0x0C, 0x3D, 0x0B, 0x29, 0x8F, 0x0E, 0x84, 0xE1, + 0x95, 0x0E, 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0xC7, 0x08, 0x62, 0xE1, + 0x0C, 0x3D, 0x0A, 0x29, 0xCC, 0x08, 0x64, 0xE1, 0xCB, 0x08, 0x63, 0xE1, + 0x0C, 0x3D, 0x0B, 0x29, 0x0C, 0x3D, 0x0B, 0x29, 0x62, 0xE1, 0x2E, 0xE4, + 0x0C, 0x3D, 0x0A, 0x29, 0x02, 0xAE, 0xA5, 0x4C, 0xA4, 0x28, 0xE8, 0x08, + 0x02, 0xAE, 0xA4, 0x28, 0x12, 0x3D, 0x02, 0x4D, 0x14, 0xAE, 0xA6, 0x4C, + 0x08, 0xAE, 0xA5, 0x4C, 0x04, 0xA8, 0x4B, 0x28, 0x02, 0x3D, 0x02, 0x4D, + 0xCD, 0x08, 0x62, 0xE1, 0xE9, 0x0E, 0x08, 0xE4, 0xCF, 0x08, 0x64, 0xE1, + 0xCE, 0x08, 0x63, 0xE1, 0xC7, 0x08, 0x61, 0xE1, 0x04, 0x3D, 0xFA, 0xA2, + 0xD8, 0x08, 0x61, 0xE1, 0xD5, 0xF0, 0x01, 0x2B, 0x01, 0xA2, 0x8B, 0xF0, + 0x19, 0xA8, 0x01, 0x2B, 0x1B, 0xE4, 0x09, 0xA8, 0x4B, 0x2A, 0x03, 0x29, + 0x02, 0x3D, 0x03, 0x29, 0x04, 0x3D, 0x1C, 0x0F, 0x02, 0x2B, 0x03, 0xA2, + 0x03, 0x3D, 0x04, 0x29, 0x71, 0x0F, 0x19, 0xE4, 0x02, 0x29, 0x03, 0x1B, + 0x24, 0xE4, 0x03, 0x29, 0xCA, 0x08, 0x63, 0xE1, 0x18, 0xA8, 0x02, 0x29, + 0xE4, 0x08, 0x62, 0xE1, 0x00, 0xE0, 0x16, 0xE0, 0x9B, 0x28, 0x2A, 0xE4, + 0x03, 0x3D, 0x04, 0x29, 0x98, 0xE0, 0xCD, 0x08, 0x62, 0xE1, 0xD8, 0x08, + 0x61, 0xE1, 0x2E, 0xE4, 0x64, 0xE1, 0xCA, 0x08, 0x63, 0xE1, 0xC7, 0x08, + 0x02, 0x29, 0x04, 0x3D, 0xFA, 0xA2, 0xCF, 0x08, 0x2A, 0xE4, 0x18, 0xA8, + 0x11, 0x29, 0x24, 0xE4, 0x0C, 0xAF, 0x11, 0x29, 0x04, 0x3D, 0x02, 0x29, + 0x1E, 0xE4, 0x78, 0xF0, 0x06, 0xA1, 0x06, 0xA8, 0x1E, 0xE4, 0x02, 0x29, + 0x04, 0x3D, 0x3E, 0x0F, 0x2E, 0xE4, 0x03, 0x3D, 0x04, 0x29, 0x83, 0x0F, + 0xCA, 0x08, 0x00, 0xE0, 0x02, 0xA0, 0x9C, 0x28, 0x1E, 0xE4, 0x34, 0xF0, + 0x02, 0x29, 0x94, 0xE0, 0x12, 0x29, 0xCA, 0x08, 0x62, 0xE1, 0x95, 0x0F, + 0x26, 0xE4, 0x9C, 0x28, 0x60, 0x0F, 0x12, 0xE4, 0x2E, 0xE4, 0x60, 0x0F, + 0x12, 0xE4, 0x12, 0x29, 0x15, 0x4D, 0x15, 0x21, 0xC3, 0x08, 0x65, 0xE1, + 0x65, 0xE1, 0x56, 0xE0, 0x15, 0x4F, 0x15, 0x23, 0x03, 0xA1, 0xB7, 0xF0, + 0x98, 0x2A, 0xE0, 0x07, 0x15, 0x2B, 0x30, 0x0F, 0x84, 0xE1, 0x45, 0xCC, + 0x03, 0xA8, 0x01, 0x5E, 0x49, 0xE0, 0x01, 0x3E, 0x65, 0xE1, 0x2E, 0xE4, + 0xFA, 0xA2, 0x3B, 0xF0, 0x03, 0xA2, 0x0D, 0x4D, 0x15, 0x21, 0xC3, 0x08, + 0x0D, 0x3D, 0x15, 0x35, 0x56, 0xE0, 0x01, 0x5A, 0xC3, 0x08, 0x65, 0xE1, + 0x2E, 0xE4, 0x01, 0x28, 0x15, 0x4F, 0x15, 0x23, 0x15, 0x4D, 0x15, 0x21, + 0x98, 0x2A, 0xE0, 0x07, 0x65, 0xE1, 0x56, 0xE0, 0x84, 0xE1, 0x45, 0xCC, + 0x03, 0xA1, 0xB7, 0xF0, 0x49, 0xE0, 0x01, 0x3E, 0x15, 0x2B, 0x52, 0x0F, + 0xFA, 0xA2, 0x3B, 0xF0, 0x03, 0xA8, 0x01, 0x5E, 0x15, 0x21, 0xC5, 0x08, + 0x65, 0xE1, 0x2E, 0xE4, 0x56, 0xE0, 0x01, 0x5A, 0x03, 0xA2, 0x0D, 0x4D, + 0x2E, 0xE4, 0x01, 0x28, 0x0D, 0x3D, 0x15, 0x35, 0x02, 0xA1, 0x98, 0x28, + 0x01, 0x3C, 0x24, 0xE4, 0xC5, 0x08, 0x65, 0xE1, 0x24, 0xE4, 0x01, 0x18, + 0x01, 0x5A, 0x03, 0xA2, 0x0D, 0x4D, 0x15, 0x21, 0x01, 0x28, 0x0D, 0x3D, + 0x15, 0x35, 0x56, 0xE0, 0x98, 0x28, 0x01, 0x3C, 0x24, 0xE4, 0x2E, 0xE4, + 0x65, 0xE1, 0x24, 0xE4, 0x01, 0x18, 0x02, 0xA1, 0x03, 0xA2, 0x0D, 0x4D, + 0x15, 0x21, 0xC3, 0x08, 0x15, 0x35, 0x52, 0xE0, 0x15, 0xE0, 0x01, 0x5A, + 0x24, 0xE4, 0x2E, 0xE4, 0x01, 0x28, 0x0D, 0x3D, 0x01, 0x18, 0x02, 0xA1, + 0x98, 0x28, 0x01, 0x3C, 0x15, 0x21, 0xC5, 0x08, 0x65, 0xE1, 0x24, 0xE4, + 0x15, 0xE0, 0x01, 0x5A, 0x03, 0xA2, 0x0D, 0x4D, 0x01, 0x28, 0x0D, 0x3D, + 0x15, 0x35, 0x52, 0xE0, 0x98, 0x28, 0x01, 0x3C, 0x24, 0xE4, 0x2E, 0xE4, + 0x65, 0xE1, 0x24, 0xE4, 0x01, 0x18, 0x02, 0xA1, 0x03, 0xA1, 0x87, 0xF0, + 0x98, 0x2A, 0xE0, 0x07, 0x15, 0x2B, 0xA5, 0x0F, 0x84, 0xE1, 0x45, 0xCC, + 0x2E, 0xE4, 0xFA, 0xA2, 0x3B, 0xF0, 0x01, 0x1A, 0xAE, 0x0F, 0x84, 0xE1, + 0x67, 0xF0, 0x45, 0xC8, 0x01, 0x28, 0x15, 0x81, 0x15, 0x3D, 0x0D, 0x29, + 0x2E, 0xE4, 0x01, 0x28, 0x15, 0x3D, 0x0D, 0x81, 0xC3, 0x08, 0x65, 0xE1, + 0x02, 0x3C, 0x00, 0xA2, 0x15, 0x4F, 0x15, 0x23, 0x15, 0x4D, 0x15, 0x21, + 0x98, 0x2A, 0xE0, 0x07, 0x65, 0xE1, 0x56, 0xE0, 0x84, 0xE1, 0x45, 0xCC, + 0x03, 0xA1, 0xF7, 0xF0, 0x49, 0xE0, 0x01, 0x3E, 0x15, 0x2B, 0xCE, 0x0F, + 0x02, 0x2A, 0x49, 0xF0, 0x03, 0xA8, 0x01, 0x5E, 0x02, 0x28, 0x90, 0xE1, + 0x02, 0x3E, 0x03, 0xA0, 0x4E, 0xBA, 0x0E, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, + 0x4F, 0xBA, 0x56, 0xE0, 0x11, 0xAE, 0x4F, 0xBA, 0x05, 0xE0, 0xF4, 0xB7, + 0x56, 0xE0, 0x21, 0xAE, 0xFF, 0xFF, 0x0B, 0xE0, 0x21, 0xAE, 0xFF, 0x00, + 0x3B, 0x3C, 0x3A, 0x34, 0xF6, 0xB7, 0x45, 0xE0, 0x85, 0x00, 0x08, 0xE0, + 0x3C, 0x3C, 0x4E, 0xBA, 0xF0, 0x3E, 0x03, 0xA2, 0x85, 0x00, 0x02, 0xE0, + 0x4F, 0xBA, 0x4E, 0xBA, 0xAA, 0x10, 0x08, 0xE4, 0x21, 0xAE, 0x4F, 0xBA, + 0x56, 0xE0, 0x11, 0xAE, 0x55, 0xE0, 0x31, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, + 0x05, 0xE4, 0xF0, 0x3C, 0x04, 0xA2, 0x09, 0xA1, 0x42, 0xBA, 0xF0, 0x3C, + 0x06, 0xA2, 0xAA, 0x10, 0x40, 0xBA, 0x48, 0x3C, 0x40, 0xBA, 0x10, 0x3C, + 0x48, 0xBA, 0x13, 0x3C, 0x44, 0xBA, 0x49, 0x3C, 0x40, 0xBA, 0x2C, 0x3C, + 0x40, 0xBA, 0x14, 0x3C, 0x40, 0xBA, 0x3D, 0x3C, 0x40, 0xBA, 0x43, 0x3C, + 0x40, 0xBA, 0x2D, 0x3C, 0x40, 0xBA, 0x44, 0x3C, 0x40, 0xBA, 0x2F, 0x3C, + 0x42, 0xBA, 0x2E, 0x3C, 0x40, 0xBA, 0x45, 0x3C, 0x40, 0xBA, 0x30, 0x3C, + 0x40, 0xBA, 0x3E, 0x3C, 0x40, 0xBA, 0x31, 0x3C, 0x42, 0xBA, 0x40, 0x3C, + 0x44, 0xBA, 0x3F, 0x3C, 0x40, 0xBA, 0x1B, 0x3C, 0x40, 0xBA, 0x32, 0x3C, + 0x04, 0xA0, 0x04, 0xAE, 0x13, 0x28, 0x46, 0x3C, 0x79, 0x00, 0xC2, 0xE0, + 0x7D, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x08, 0xA2, 0x22, 0x3C, 0x02, 0xA2, + 0x0A, 0xA2, 0xAA, 0x10, 0x08, 0xE4, 0x48, 0x28, 0xAA, 0x10, 0x08, 0xE4, + 0x49, 0x28, 0xF0, 0x3C, 0x04, 0xA1, 0x10, 0x28, 0xF0, 0x3C, 0x06, 0xA2, + 0xF0, 0x3C, 0x0E, 0xA2, 0xAA, 0x10, 0x0A, 0xE4, 0x0C, 0xA2, 0xAA, 0x10, + 0x0A, 0xE4, 0x44, 0x28, 0xAA, 0x10, 0x08, 0xE4, 0x43, 0x28, 0xF0, 0x3C, + 0x04, 0xA0, 0xF4, 0xB7, 0x04, 0xA1, 0x10, 0x28, 0x03, 0xA1, 0x4E, 0xBA, + 0x47, 0xF0, 0x10, 0x3C, 0x11, 0xAE, 0x4F, 0xBA, 0x4E, 0xBA, 0xE1, 0xF7, + 0x56, 0xE0, 0x21, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x17, 0x3C, 0x56, 0xE0, + 0x31, 0xAE, 0x4F, 0xBA, 0x11, 0xAE, 0x4F, 0xBA, 0x4E, 0xBA, 0x34, 0x3C, + 0x56, 0xE0, 0x21, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x16, 0x3C, 0x56, 0xE0, + 0x31, 0xAE, 0x4F, 0xBA, 0x03, 0xE0, 0x3C, 0x2A, 0x00, 0xA2, 0x33, 0x3C, + 0x00, 0xA1, 0x3C, 0x3C, 0x36, 0xB6, 0xC5, 0x00, 0x4F, 0xBA, 0x4E, 0xBA, + 0xAB, 0x10, 0x0A, 0xE4, 0x21, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x11, 0xAE, + 0x56, 0xE0, 0x31, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x87, 0xF2, 0x6A, 0xF0, + 0x18, 0xA1, 0x49, 0xE0, 0x4E, 0xF2, 0xE1, 0xF7, 0x03, 0xA1, 0x4E, 0xBA, + 0x46, 0xBA, 0x40, 0xBA, 0x11, 0x3C, 0x44, 0xBA, 0x56, 0xE0, 0x11, 0xAE, + 0x4F, 0xBA, 0x4E, 0xBA, 0x61, 0xE1, 0x56, 0xE0, 0x21, 0xAE, 0x4F, 0xBA, + 0x4E, 0xBA, 0x11, 0x3D, 0x11, 0x35, 0x58, 0x07, 0x4F, 0xBA, 0x56, 0xE0, + 0x11, 0xAE, 0x4F, 0xBA, 0x31, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x21, 0xAE, + 0x11, 0x35, 0x18, 0x07, 0x61, 0xE1, 0x56, 0xE0, 0x4E, 0xBA, 0x4E, 0xBA, + 0x4E, 0xBA, 0x11, 0x3D, 0x2E, 0xE4, 0x6B, 0xE1, 0x2E, 0xF0, 0x4E, 0xBA, + 0x58, 0x07, 0x62, 0xE1, 0x18, 0x07, 0x61, 0xE1, 0x02, 0xA1, 0x56, 0xF1, + 0x27, 0x3C, 0x48, 0xBA, 0x00, 0x3C, 0x0C, 0xA0, 0x46, 0xBA, 0x44, 0xCC, + 0x84, 0xE1, 0x01, 0x3C, 0x08, 0xA0, 0x46, 0xBA, 0x00, 0x58, 0x02, 0xA0, + 0x5E, 0xBA, 0xC6, 0x10, 0x02, 0xA0, 0x5E, 0xBA, 0x11, 0x3D, 0x11, 0x35, + 0x2E, 0xE4, 0x12, 0x3D, 0x12, 0x35, 0x01, 0x58, 0x44, 0xBA, 0x10, 0x3C, + 0x02, 0xA1, 0x42, 0xBA, 0x44, 0xBA, 0x12, 0x3C, 0x42, 0xBA, 0x11, 0x3C, + 0x40, 0xBA, 0x14, 0x3C, 0x48, 0xBA, 0x13, 0x3C, 0x02, 0xAE, 0x02, 0xA0, + 0x56, 0xBA, 0x15, 0x3C, 0x02, 0xAE, 0x02, 0xA0, 0x56, 0xBA, 0x16, 0x3C, + 0x40, 0xBA, 0x18, 0x3C, 0x40, 0xBA, 0x17, 0x3C, 0x40, 0xBA, 0x1A, 0x3C, + 0x40, 0xBA, 0x19, 0x3C, 0x1C, 0x3C, 0x40, 0xBA, 0x40, 0xBA, 0x1B, 0x3C, + 0x02, 0xA2, 0x45, 0x3C, 0x43, 0x3C, 0x00, 0xA2, 0x0A, 0xE4, 0x40, 0xBA, + 0x46, 0x3C, 0x44, 0x3C, 0x1D, 0x3C, 0x02, 0xA0, 0x5A, 0xBA, 0x3A, 0x11, + 0x40, 0xBA, 0x1E, 0x3C, 0x02, 0xA0, 0x5A, 0xBA, 0x1F, 0xA1, 0x49, 0xE0, + 0x46, 0xBA, 0x7A, 0xF1, 0x1F, 0x3C, 0x02, 0xA0, 0x4E, 0xBA, 0x89, 0xF0, + 0xCE, 0xF0, 0x20, 0x3C, 0x02, 0xA0, 0x4E, 0xBA, 0x98, 0xE0, 0xF0, 0x06, + 0x00, 0xE0, 0x49, 0xE0, 0x04, 0x29, 0x9B, 0xE0, 0x00, 0x07, 0x01, 0xE0, + 0x40, 0xBA, 0x20, 0x3C, 0x05, 0x29, 0x1F, 0x3C, 0x4E, 0xBA, 0x88, 0xF1, + 0x40, 0xBA, 0x2A, 0xF2, 0x98, 0xE0, 0x10, 0x07, 0x00, 0xE0, 0x0E, 0xA8, + 0x82, 0xE1, 0x21, 0x84, 0x21, 0x3C, 0x04, 0x29, 0xC2, 0xE0, 0x21, 0x3C, + 0x18, 0xE0, 0xE8, 0x03, 0x04, 0xE0, 0x79, 0x00, 0xC2, 0xE0, 0x7D, 0x00, + 0x22, 0xB4, 0x03, 0xA1, 0x47, 0xBA, 0xE8, 0x03, 0x02, 0xA0, 0x5E, 0xBA, + 0x9E, 0xF0, 0x22, 0x3C, 0x79, 0x00, 0xC2, 0xE0, 0x7D, 0x00, 0xC2, 0xE0, + 0x7A, 0xF0, 0x40, 0xBA, 0x22, 0x3C, 0x40, 0xA2, 0x24, 0x3C, 0x4E, 0xBA, + 0x23, 0x3C, 0x4E, 0xBA, 0x26, 0x3C, 0x40, 0xBA, 0x25, 0x3C, 0x4E, 0xBA, + 0x10, 0x28, 0x2E, 0xE4, 0xAC, 0x10, 0x18, 0xE4, 0x1E, 0xE4, 0x40, 0xF0, + 0x04, 0xA1, 0x64, 0xF0, 0x10, 0x3C, 0x04, 0xA2, 0x82, 0xF0, 0xF6, 0x01, + 0x17, 0x3C, 0xA3, 0x28, 0x16, 0x3C, 0xA2, 0x28, 0x58, 0x07, 0x61, 0xE1, + 0x2E, 0xE4, 0x6B, 0xE1, 0x26, 0xF1, 0x27, 0x28, 0x98, 0x07, 0x62, 0xE1, + 0x64, 0x11, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x00, 0x84, 0x00, 0x3C, + 0x02, 0xA0, 0x4E, 0xBA, 0x00, 0x84, 0x20, 0xAE, 0x18, 0xE0, 0x11, 0x83, + 0x10, 0xAF, 0x42, 0xE0, 0x19, 0xE0, 0x11, 0x83, 0x28, 0x3C, 0x40, 0xBA, + 0x2E, 0xE4, 0x12, 0x3D, 0x2A, 0x3C, 0x40, 0xBA, 0x29, 0x3C, 0x40, 0xBA, + 0x2C, 0x3C, 0x40, 0xBA, 0x2B, 0x3C, 0x40, 0xBA, 0x2E, 0x3C, 0x40, 0xBA, + 0x2D, 0x3C, 0x40, 0xBA, 0x30, 0x3C, 0x40, 0xBA, 0x2F, 0x3C, 0x42, 0xBA, + 0x32, 0x3C, 0x42, 0xBA, 0x31, 0x3C, 0x40, 0xBA, 0x16, 0x28, 0x4E, 0x11, + 0x18, 0xE4, 0x26, 0x28, 0x40, 0xBA, 0x34, 0x3C, 0x17, 0x28, 0x33, 0x3C, + 0x02, 0xAE, 0x02, 0xA0, 0x56, 0xBA, 0x9A, 0xF0, 0x02, 0xAE, 0x02, 0xA0, + 0x56, 0xBA, 0x33, 0x3C, 0x2E, 0x28, 0x35, 0x3C, 0x00, 0xA2, 0x34, 0x3C, + 0x00, 0xA2, 0x35, 0x3C, 0x40, 0xBA, 0x3A, 0xF0, 0x3A, 0xF0, 0x36, 0x3C, + 0x40, 0xBA, 0x37, 0x3C, 0x39, 0x3C, 0x00, 0xA2, 0x37, 0x3C, 0x44, 0xBA, + 0x44, 0xBA, 0x2A, 0xE4, 0x38, 0x3C, 0x40, 0xBA, 0x86, 0xF0, 0x33, 0x28, + 0x2E, 0xE4, 0x39, 0x3C, 0x46, 0xF0, 0x34, 0x28, 0x60, 0xF0, 0x16, 0x18, + 0x16, 0x28, 0x6E, 0xF0, 0x20, 0xF0, 0x17, 0x18, 0x6B, 0xE1, 0x34, 0x3C, + 0x17, 0x28, 0x33, 0x3C, 0x52, 0x3C, 0x51, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x08, 0xE0, 0x3E, 0xBA, 0x6B, 0x3C, 0x57, 0x3C, 0x85, 0x00, 0x02, 0xE0, + 0x49, 0xE0, 0xFF, 0x00, 0x1A, 0xE4, 0x52, 0xE0, 0xC5, 0x00, 0x03, 0xE0, + 0x1E, 0xE4, 0x78, 0x0C, 0x1E, 0xE4, 0xD1, 0x0F, 0x39, 0xD0, 0x77, 0x08, + 0x1E, 0xE4, 0x4D, 0x12, 0xB5, 0x08, 0x1E, 0xE4, 0x00, 0xA2, 0x00, 0x00, + 0x41, 0x20, 0x4C, 0x3C, 0x4B, 0x3C, 0x08, 0xA2, 0x6A, 0xE1, 0x26, 0xE4, + 0x02, 0xA1, 0x42, 0x4C, 0x1E, 0xE4, 0x2D, 0xE4, 0x67, 0x12, 0x1E, 0xE4, + 0x51, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xAC, 0x13, 0x6A, 0xE1, 0x6B, 0x3C, + 0x57, 0x3C, 0x52, 0x3C, 0x4B, 0x28, 0x2D, 0xE4, 0xC4, 0x12, 0x1E, 0xE4, + 0x2D, 0xE4, 0x67, 0x13, 0x18, 0xE4, 0x08, 0xA1, 0x4E, 0x28, 0x48, 0xF0, + 0x06, 0xA1, 0x4A, 0x28, 0xAC, 0x13, 0x1E, 0xE4, 0x52, 0x3C, 0x16, 0xE0, + 0x00, 0xA2, 0x52, 0x3C, 0x4E, 0x28, 0x2E, 0xE4, 0x1E, 0xE4, 0x6A, 0xE1, + 0x6B, 0x3C, 0x57, 0x3C, 0xAC, 0x13, 0x1E, 0xE4, 0x2D, 0xE4, 0x67, 0x13, + 0x15, 0xB6, 0x56, 0x2A, 0x51, 0x28, 0x2E, 0xE4, 0x40, 0xBA, 0x57, 0x3C, + 0x46, 0xE0, 0x50, 0xBA, 0x62, 0xE1, 0x6B, 0x3C, 0x00, 0xA2, 0x2A, 0xE4, + 0x22, 0xD0, 0x10, 0x06, 0x63, 0xE1, 0x4A, 0x00, 0x12, 0x29, 0x10, 0x12, + 0x84, 0xE1, 0x38, 0x00, 0xC4, 0x12, 0x1E, 0xE4, 0x6A, 0xE1, 0x13, 0x3D, + 0x18, 0xE4, 0x08, 0xA1, 0x4B, 0x28, 0xDD, 0xF0, 0xC9, 0x13, 0x1E, 0xE4, + 0x8D, 0xF0, 0x67, 0x13, 0x2D, 0xF0, 0xAC, 0x13, 0x1E, 0xE4, 0x5D, 0xF0, + 0x63, 0xE1, 0x10, 0x06, 0x62, 0xE1, 0x2E, 0xE4, 0x84, 0xE1, 0x38, 0x00, + 0x22, 0xD0, 0x4A, 0x00, 0x2E, 0xE4, 0x13, 0x3D, 0x12, 0x29, 0x2A, 0x12, + 0xC8, 0xF1, 0x40, 0xBA, 0xEA, 0xF1, 0x3E, 0x28, 0x4F, 0xBA, 0x00, 0xA2, + 0x0E, 0x08, 0x1E, 0xE4, 0x10, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x10, 0xAE, + 0xBA, 0xF0, 0xAA, 0x00, 0x02, 0xE0, 0x56, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, + 0x3A, 0xF0, 0x02, 0xA1, 0x4E, 0xBA, 0x4E, 0xBA, 0x4E, 0xBA, 0x4E, 0xBA, + 0x4E, 0xBA, 0x4E, 0xBA, 0x4E, 0xBA, 0x4E, 0xBA, 0x02, 0xA2, 0x4E, 0xBA, + 0x4E, 0xBA, 0x4E, 0xBA, 0x4E, 0xBA, 0x0E, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, + 0x4F, 0xBA, 0x56, 0xE0, 0x11, 0xAE, 0x4F, 0xBA, 0x42, 0x3C, 0x41, 0x34, + 0x56, 0xE0, 0x21, 0xAE, 0x28, 0xE4, 0x02, 0xA1, 0x3C, 0x28, 0x4E, 0xBA, + 0x56, 0xE0, 0x11, 0xAE, 0x4F, 0xBA, 0x4E, 0xBA, 0x4F, 0xBA, 0x56, 0xE0, + 0x21, 0xAE, 0x4F, 0xBA, 0x1B, 0x28, 0x2E, 0xE4, 0x56, 0xE0, 0x31, 0xAE, + 0x00, 0xA2, 0x42, 0xBA, 0x40, 0xBA, 0x2A, 0xF0, 0x5C, 0x3C, 0x40, 0xBA, + 0x3B, 0xF0, 0x3F, 0x2A, 0x2E, 0xF0, 0x40, 0xBA, 0x39, 0xF0, 0x40, 0x2A, + 0x06, 0xA1, 0x4C, 0x3C, 0x4B, 0x3C, 0x00, 0xB8, 0x2C, 0xA1, 0x5D, 0x3C, + 0x08, 0xB8, 0x88, 0xF0, 0x4C, 0x3C, 0x4B, 0x3C, 0x04, 0xA2, 0x48, 0xF0, + 0x92, 0xE0, 0x51, 0x08, 0x4B, 0x00, 0x04, 0xE0, 0x85, 0x2A, 0x61, 0x28, + 0x85, 0x3C, 0x01, 0x29, 0x03, 0xA1, 0x85, 0x2A, 0x36, 0xB6, 0x03, 0xA8, + 0x85, 0x28, 0x61, 0x3C, 0x02, 0xA8, 0x36, 0xB4, 0x1E, 0xE4, 0x4C, 0xBA, + 0x28, 0xF0, 0x02, 0xA8, 0x2B, 0xF0, 0x2E, 0x2A, 0x00, 0xA2, 0xDF, 0x13, + 0x04, 0xA8, 0x85, 0x28, 0x62, 0x3C, 0x04, 0xB8, 0x2B, 0xF0, 0x3D, 0x2A, + 0x00, 0xA2, 0x68, 0xF0, 0x5B, 0x2A, 0x33, 0x28, 0x5B, 0x3C, 0x42, 0xBA, + 0x02, 0xAF, 0x02, 0xA0, 0x3B, 0xF0, 0x03, 0xA8, 0x55, 0x3C, 0x08, 0xAF, + 0x1E, 0xA0, 0x53, 0x3C, 0x3B, 0xF0, 0x05, 0xA8, 0x5B, 0x2A, 0x34, 0x28, + 0x1E, 0xA0, 0x54, 0x3C, 0x02, 0xAF, 0x02, 0xA0, 0x46, 0x14, 0x1E, 0xE4, + 0x56, 0x3C, 0x08, 0xAF, 0xEE, 0x14, 0x1E, 0xE4, 0xA4, 0x14, 0x1E, 0xE4, + 0x4E, 0x3C, 0x02, 0xA2, 0x45, 0x15, 0x1E, 0xE4, 0x2E, 0xE4, 0x60, 0x3C, + 0x5F, 0x3C, 0x00, 0xA2, 0x0A, 0xB8, 0x2B, 0xF0, 0x19, 0x2A, 0x00, 0xA2, + 0x02, 0xB8, 0x5A, 0xF0, 0x06, 0xA1, 0x4A, 0x3C, 0x44, 0xBA, 0xEE, 0xF0, + 0x4C, 0x3C, 0x4B, 0x3C, 0x50, 0xAF, 0x04, 0xE0, 0x4C, 0x3C, 0x02, 0xAE, + 0x04, 0xE0, 0x4B, 0x3C, 0x06, 0xA8, 0x4C, 0x5C, 0x4C, 0x3C, 0x06, 0xA8, + 0x4C, 0x5C, 0x44, 0xBB, 0x1A, 0x28, 0x5A, 0xF0, 0x08, 0xA1, 0x4B, 0x28, + 0x00, 0xA2, 0x4D, 0x3C, 0x4E, 0xBA, 0x3A, 0xF0, 0x4E, 0x3C, 0x02, 0xA2, + 0x4F, 0x3C, 0x50, 0x3C, 0x8A, 0xF0, 0x19, 0x28, 0xCA, 0xF0, 0x18, 0x28, + 0x4E, 0x3C, 0x40, 0xBA, 0x68, 0xF0, 0x1C, 0x28, 0x42, 0xBA, 0x3E, 0xF0, + 0x4F, 0x3C, 0x40, 0xBA, 0x02, 0xA2, 0x8A, 0xF2, 0x2A, 0x28, 0x50, 0x3C, + 0x12, 0xB6, 0x1C, 0x2A, 0x16, 0xB6, 0x19, 0x2A, 0x4F, 0x08, 0x50, 0x28, + 0x47, 0x3C, 0x02, 0xA0, 0x47, 0x3C, 0x47, 0x08, 0x16, 0xB6, 0x18, 0x2A, + 0xB8, 0x07, 0x61, 0xE1, 0x9A, 0xF1, 0x40, 0xBA, 0xD0, 0x07, 0x63, 0xE1, + 0xC4, 0x07, 0x62, 0xE1, 0xF6, 0xF0, 0x47, 0x28, 0xD6, 0x07, 0x64, 0xE1, + 0x1D, 0x13, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x62, 0xBA, 0x11, 0x3D, + 0x11, 0x35, 0x62, 0xBA, 0x13, 0x3D, 0x5A, 0xBA, 0x12, 0x3D, 0x12, 0x35, + 0x08, 0xA1, 0x4B, 0x28, 0x14, 0x3D, 0x5A, 0xBA, 0x51, 0x08, 0x4B, 0x00, + 0x04, 0xE0, 0x2A, 0xE4, 0x40, 0xBA, 0x85, 0x3C, 0x01, 0x29, 0x92, 0xE0, + 0x2B, 0xF0, 0x19, 0x2A, 0x00, 0xA2, 0x61, 0x3C, 0x4A, 0x28, 0x1B, 0x2A, + 0x58, 0x3C, 0x40, 0xBA, 0x2B, 0xF0, 0x00, 0xA2, 0x11, 0xB6, 0x00, 0xA1, + 0x00, 0xA1, 0x4A, 0x28, 0x59, 0x3C, 0x40, 0xBA, 0x7A, 0xF0, 0x32, 0xB6, + 0x07, 0xA1, 0x85, 0x2A, 0x05, 0xA8, 0x85, 0x2A, 0x06, 0xA1, 0x4A, 0x28, + 0x5D, 0x3C, 0x08, 0xB8, 0x38, 0xF0, 0x36, 0xB6, 0x12, 0xB6, 0x07, 0xA1, + 0x4A, 0x2A, 0x2B, 0x28, 0xCA, 0xF0, 0x12, 0xB6, 0x05, 0xA8, 0x85, 0x2A, + 0x79, 0xF0, 0x07, 0xA1, 0x49, 0xE0, 0x42, 0xBA, 0x49, 0xE0, 0x02, 0xA0, + 0x5B, 0xF0, 0x41, 0xBA, 0x33, 0x28, 0x5E, 0x3C, 0xB7, 0xF7, 0x21, 0xA1, + 0x55, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, 0x53, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x54, 0x3C, 0x34, 0x28, 0x02, 0xA0, 0x39, 0xF0, 0x07, 0xA1, 0x4A, 0x2A, + 0x04, 0xE0, 0x2E, 0xE4, 0x56, 0x3C, 0x02, 0xAF, 0x01, 0x29, 0x92, 0xE0, + 0x51, 0x08, 0x4B, 0x00, 0x00, 0xA2, 0xDF, 0x13, 0x1E, 0xE4, 0x85, 0x3C, + 0x5A, 0x3C, 0x42, 0xBA, 0x2B, 0xF0, 0x15, 0x2A, 0x07, 0xA1, 0x85, 0x2A, + 0x04, 0xA1, 0x4A, 0x28, 0x5D, 0x3C, 0x08, 0xB8, 0x38, 0xF0, 0x32, 0xB6, + 0x4A, 0x28, 0x60, 0x3C, 0x5F, 0x3C, 0x00, 0xA2, 0x02, 0xA1, 0x85, 0x28, + 0x18, 0xF1, 0x06, 0xA1, 0xB8, 0xF0, 0x06, 0xA1, 0x85, 0x28, 0x9A, 0xF0, + 0x60, 0x3C, 0x00, 0xA2, 0x5F, 0x3C, 0x02, 0xA2, 0x38, 0xF0, 0x5F, 0x3C, + 0x40, 0xBA, 0x6E, 0xF0, 0x02, 0xA8, 0x85, 0x28, 0x60, 0x3C, 0x40, 0xBA, + 0x2B, 0xF0, 0x2E, 0x2A, 0x00, 0xA2, 0xEA, 0xF0, 0x4A, 0x28, 0x35, 0x2A, + 0x62, 0x3C, 0x04, 0xB8, 0x2B, 0xF0, 0x00, 0xA2, 0x15, 0xB6, 0x00, 0xA1, + 0x46, 0x14, 0x1E, 0xE4, 0x63, 0x3C, 0x04, 0xB8, 0x1E, 0xE4, 0x2D, 0xE4, + 0xA4, 0x14, 0x1E, 0xE4, 0x2E, 0xE4, 0x45, 0x15, 0x1E, 0xE4, 0xEE, 0x14, + 0x33, 0x28, 0x62, 0xF0, 0xF6, 0x01, 0x1E, 0xE4, 0x6B, 0xE1, 0x54, 0x3C, + 0x34, 0x28, 0x53, 0x3C, 0x02, 0xA2, 0x5E, 0xF0, 0x26, 0xF0, 0x7B, 0x28, + 0xCD, 0xF0, 0x6B, 0xE1, 0x7C, 0x3C, 0x7B, 0x3C, 0x41, 0x20, 0x8A, 0xF0, + 0x04, 0xA1, 0x3C, 0x28, 0x21, 0xAE, 0x30, 0x00, 0x05, 0xE0, 0x42, 0x4C, + 0x6B, 0xE1, 0x2E, 0xF0, 0x22, 0xF0, 0x46, 0xE0, 0x4A, 0x28, 0x10, 0x06, + 0x62, 0xE1, 0x2E, 0xE4, 0x19, 0x06, 0x62, 0xE1, 0x08, 0xF1, 0x12, 0x19, + 0x54, 0x28, 0xB8, 0xF0, 0x12, 0x19, 0x53, 0x28, 0x12, 0x19, 0x55, 0x28, + 0x88, 0xF0, 0x12, 0x19, 0x28, 0xF0, 0x12, 0x19, 0x56, 0x28, 0x58, 0xF0, + 0x49, 0xBA, 0x2E, 0xE4, 0x6B, 0xE1, 0x2E, 0xF0, 0x21, 0xF0, 0x00, 0xA2, + 0x11, 0xA1, 0x7A, 0x3E, 0x32, 0x2A, 0x7A, 0x28, 0x7D, 0x3C, 0x40, 0xBA, + 0x11, 0xA1, 0x7A, 0x2A, 0xA9, 0xF0, 0x01, 0xA1, 0xAE, 0xB5, 0x39, 0xA1, + 0x7A, 0x2A, 0x77, 0xF0, 0x7B, 0x3C, 0x3E, 0xA1, 0x02, 0xAE, 0x37, 0xF0, + 0xC3, 0xF0, 0x05, 0xA1, 0x32, 0x2A, 0x7C, 0x3C, 0x7A, 0x2A, 0x00, 0xA2, + 0x73, 0xF0, 0x03, 0xA0, 0x2E, 0xE4, 0x7E, 0x3C, 0x2E, 0xB6, 0x11, 0xA1, + 0x32, 0x28, 0x2E, 0xE4, 0x7E, 0x3C, 0x40, 0xBA, 0x00, 0xA2, 0x2E, 0xE4, + 0x7E, 0x3C, 0x02, 0xA8, 0x02, 0xA2, 0x80, 0x3C, 0x06, 0xA2, 0x7F, 0x3C, + 0x59, 0xF0, 0x03, 0xA8, 0x2F, 0x2A, 0x82, 0x3C, 0x2E, 0xE4, 0x59, 0xF2, + 0x05, 0xA8, 0x2F, 0x2A, 0x42, 0xBA, 0x7F, 0x3C, 0x2A, 0xE4, 0x40, 0xBA, + 0xAA, 0xF0, 0x02, 0xA1, 0x9A, 0xF0, 0x80, 0x3C, 0x82, 0x3C, 0x40, 0xBA, + 0x1A, 0xF1, 0x02, 0xA1, 0x81, 0x3C, 0x1E, 0xA2, 0xCE, 0xF1, 0x2A, 0xE4, + 0x81, 0x3C, 0x04, 0xAE, 0x42, 0xBA, 0x9E, 0xF1, 0x1E, 0xA8, 0x81, 0x5C, + 0x6C, 0x93, 0x04, 0xE0, 0x04, 0xAE, 0x42, 0xBA, 0x0E, 0xF1, 0x81, 0x3C, + 0x81, 0x5C, 0x48, 0x12, 0x04, 0xE0, 0x81, 0x3C, 0x02, 0xA2, 0x7E, 0xF0, + 0x81, 0x3C, 0x1E, 0xA8, 0x1E, 0xA2, 0x80, 0x3C, 0x00, 0xA2, 0x7F, 0x3C, + 0x0F, 0xA1, 0x49, 0xE0, 0x44, 0xBA, 0x81, 0x3C, 0x48, 0xBA, 0x29, 0xF0, + 0x02, 0xA0, 0x7B, 0x08, 0x62, 0xE1, 0x00, 0xA2, 0x2E, 0xE4, 0x7C, 0x3C, + 0x02, 0xA2, 0x12, 0x3D, 0x05, 0xC7, 0x65, 0x00, 0x85, 0x2A, 0x5B, 0xF0, + 0x03, 0xA1, 0x85, 0x2A, 0x4A, 0x2A, 0x3E, 0xF3, 0xCB, 0xF1, 0x07, 0xA1, + 0x02, 0xA2, 0x41, 0xBA, 0x59, 0xF0, 0x05, 0xA1, 0x7B, 0x2A, 0x08, 0xA2, + 0xCE, 0xF2, 0x72, 0xB6, 0x0E, 0xB8, 0x64, 0x3C, 0x0E, 0xB6, 0x19, 0xA1, + 0x2B, 0xF0, 0x65, 0x3E, 0x05, 0xAF, 0x49, 0xE0, 0x64, 0x3C, 0x02, 0xAE, + 0x64, 0x08, 0x10, 0xB8, 0x06, 0xA8, 0x64, 0x5C, 0x2D, 0xE4, 0x04, 0xE0, + 0x5B, 0xF0, 0x01, 0xA1, 0x4A, 0x2A, 0x9E, 0xF1, 0x2E, 0xF1, 0x6B, 0xF0, + 0x07, 0xA1, 0x4A, 0x2A, 0xEE, 0xF0, 0x32, 0xB6, 0x00, 0xA2, 0x41, 0xBA, + 0x0E, 0xB6, 0x19, 0xA1, 0x7B, 0x2A, 0x08, 0xA2, 0x02, 0xAE, 0x64, 0x08, + 0x10, 0xB8, 0x64, 0x3C, 0x64, 0x5C, 0x2D, 0xE4, 0x04, 0xE0, 0x64, 0x3C, + 0x04, 0xA1, 0x4A, 0x28, 0x64, 0x3C, 0x06, 0xA8, 0x38, 0xF0, 0x36, 0xB6, + 0x03, 0xA8, 0x85, 0x2A, 0x2A, 0xE4, 0x65, 0x28, 0x65, 0x3C, 0x40, 0xBA, + 0x36, 0xB8, 0x58, 0xF0, 0x06, 0xA1, 0x4A, 0x28, 0x65, 0x28, 0x65, 0x30, + 0x02, 0xAF, 0x68, 0x30, 0x4A, 0xBA, 0x66, 0x3C, 0x4A, 0xBA, 0x5A, 0xF0, + 0x4A, 0xBA, 0x5A, 0xF0, 0x68, 0x28, 0x67, 0x3C, 0x2E, 0xE4, 0x6A, 0x3C, + 0x4A, 0xBA, 0x69, 0x3C, 0x6F, 0x3C, 0x6E, 0x3C, 0x6D, 0x3C, 0x00, 0xA2, + 0x4A, 0x2A, 0x6F, 0x00, 0x62, 0xE1, 0x11, 0xC4, 0x31, 0xB6, 0x02, 0xA1, + 0x85, 0x28, 0x01, 0xA1, 0x1B, 0xE4, 0x31, 0xB6, 0x06, 0xA1, 0x64, 0x28, + 0x62, 0xE1, 0x11, 0xC4, 0x2D, 0xE4, 0x9C, 0x16, 0x85, 0x28, 0x07, 0xA1, + 0x4A, 0x2A, 0x6F, 0x00, 0x9C, 0x16, 0x1B, 0xE4, 0x31, 0xB6, 0x06, 0xA1, + 0x6F, 0x00, 0x62, 0xE1, 0x11, 0xC4, 0x2D, 0xE4, 0x06, 0xA1, 0x85, 0x28, + 0x07, 0xA1, 0x4A, 0x2A, 0x2D, 0xE4, 0x9C, 0x16, 0x19, 0xE4, 0x11, 0xB6, + 0x4A, 0x2A, 0x6E, 0x00, 0x62, 0xE1, 0x09, 0xC4, 0x15, 0xB6, 0x02, 0xA8, + 0x85, 0x28, 0x07, 0xA1, 0x11, 0xC4, 0x2D, 0xE4, 0x9C, 0x16, 0x19, 0xE4, + 0x05, 0xA1, 0x4A, 0x2A, 0x6F, 0x00, 0x62, 0xE1, 0x1B, 0xE4, 0x31, 0xB6, + 0x02, 0xA8, 0x85, 0x28, 0x62, 0xE1, 0x09, 0xC4, 0x2D, 0xE4, 0x9C, 0x16, + 0x85, 0x28, 0x05, 0xA1, 0x10, 0x2A, 0x6E, 0x00, 0x9C, 0x16, 0x1B, 0xE4, + 0x31, 0xB6, 0x02, 0xA8, 0x24, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x2D, 0xE4, + 0x2A, 0xE4, 0x02, 0xA8, 0x85, 0x28, 0x74, 0x3C, 0x4A, 0x28, 0x5A, 0xF0, + 0x04, 0xA1, 0x4A, 0x28, 0x42, 0xBA, 0x1E, 0xF1, 0xAA, 0xF0, 0x06, 0xA1, + 0x07, 0xA1, 0x64, 0x2A, 0x51, 0x00, 0x00, 0xE0, 0x44, 0xBA, 0x9E, 0xF0, + 0x70, 0x3C, 0x92, 0xB4, 0x07, 0xA1, 0x64, 0x2A, 0x41, 0x00, 0x00, 0xE0, + 0x02, 0xA2, 0x70, 0x3C, 0x92, 0xB4, 0x92, 0xB4, 0x5F, 0x2A, 0x7B, 0xF0, + 0x01, 0xA1, 0x4A, 0x2A, 0x3D, 0x00, 0x00, 0xE0, 0x42, 0xBA, 0x91, 0xF0, + 0x31, 0x00, 0x00, 0xE0, 0x42, 0xBA, 0x8E, 0xF0, 0x35, 0x00, 0x00, 0xE0, + 0x44, 0xBA, 0x4E, 0xF0, 0x5B, 0xF0, 0x01, 0xA1, 0x4A, 0x2A, 0x73, 0x3C, + 0x4E, 0xF0, 0x29, 0x00, 0x00, 0xE0, 0x44, 0xBA, 0x74, 0x3C, 0x25, 0x00, + 0x00, 0xE0, 0x42, 0xBA, 0x02, 0xA8, 0x85, 0x28, 0x05, 0xA1, 0x4A, 0x2A, + 0x42, 0xBA, 0x49, 0xF0, 0x00, 0xA2, 0x35, 0xB6, 0x4A, 0x28, 0x71, 0x3C, + 0x20, 0x00, 0x00, 0xE0, 0x32, 0xB6, 0x07, 0xA1, 0x85, 0x2A, 0x04, 0xA1, + 0x64, 0x28, 0x01, 0xA1, 0x4A, 0x2A, 0x8A, 0xF0, 0x4B, 0xF0, 0x00, 0xA2, + 0x11, 0xB6, 0x06, 0xA1, 0x72, 0x3C, 0x1C, 0x00, 0x00, 0xE0, 0x42, 0xBA, + 0x85, 0x28, 0x7F, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x18, 0xE4, 0x2F, 0x28, + 0xFA, 0xF0, 0x02, 0xA8, 0x00, 0xA2, 0x75, 0x3C, 0x02, 0xA2, 0x07, 0x14, + 0x40, 0xBA, 0x6A, 0xF0, 0x30, 0x28, 0x76, 0x3C, 0x76, 0x3C, 0x42, 0xBA, + 0x3A, 0xF0, 0x75, 0x3C, 0x7A, 0xF1, 0x31, 0x28, 0x6C, 0x3C, 0x00, 0xA2, + 0x04, 0xA2, 0x4A, 0xF1, 0x06, 0xA1, 0x85, 0x28, 0x10, 0x28, 0x83, 0xF0, + 0x13, 0xA1, 0x7B, 0x2A, 0x32, 0xB6, 0x03, 0xA8, 0x85, 0x2A, 0x04, 0xA1, + 0x01, 0xC4, 0x6C, 0x3C, 0x0C, 0xB8, 0xA8, 0xF0, 0x1A, 0xE4, 0x06, 0xA1, + 0x6D, 0x00, 0x62, 0xE1, 0x85, 0x2A, 0x43, 0x28, 0x2D, 0xE4, 0x9C, 0x16, + 0x40, 0xBA, 0x2A, 0xF0, 0x12, 0xB6, 0x03, 0xA8, 0x02, 0xA8, 0x85, 0x28, + 0x83, 0x2A, 0x83, 0x3C, 0x40, 0xBA, 0x2A, 0xF0, 0x45, 0x44, 0x36, 0xB6, + 0x78, 0x3C, 0x5D, 0x00, 0x04, 0xE0, 0x84, 0x3C, 0x7A, 0x28, 0x98, 0xF1, + 0x84, 0x28, 0x79, 0x3C, 0x06, 0xB8, 0x01, 0xB6, 0x03, 0xA2, 0x10, 0xA1, + 0x5D, 0x00, 0x00, 0xE0, 0x72, 0xB4, 0x11, 0xB6, 0x02, 0xA8, 0x85, 0x28, + 0x79, 0x3C, 0x78, 0x3C, 0x03, 0xA2, 0x10, 0xA1, 0x7A, 0x28, 0xB8, 0xF0, + 0x72, 0xB4, 0x11, 0xB6, 0x06, 0xB8, 0x01, 0xB6, 0x40, 0xBA, 0x79, 0x3C, + 0x5D, 0x00, 0x00, 0xE0, 0x10, 0x28, 0x77, 0x3C, 0x59, 0x00, 0x00, 0xE0, + 0x32, 0xB6, 0x03, 0xA8, 0x85, 0x2A, 0x04, 0xA1, 0x07, 0x14, 0x1A, 0xE4, + 0x36, 0xB6, 0x2F, 0x2A, 0x16, 0x28, 0x40, 0x04, 0x61, 0xE1, 0x2E, 0xE4, + 0x19, 0x28, 0x11, 0x3D, 0x17, 0x28, 0x11, 0x3D, 0x40, 0x04, 0x61, 0xE1, + 0x2E, 0xE4, 0x11, 0x3D, 0x17, 0x28, 0xA8, 0xF0, 0x11, 0x19, 0x16, 0x28, + 0x11, 0x19, 0x19, 0x28, 0x78, 0xF0, 0x11, 0x19, 0x2E, 0xE4, 0xDB, 0x3C, + 0x00, 0xA2, 0x48, 0xF0, 0x57, 0x28, 0x2E, 0xE4, 0xDB, 0x3C, 0x02, 0xA2, + 0x56, 0x4C, 0x10, 0xAE, 0x55, 0x4C, 0x10, 0xAE, 0x04, 0xCF, 0xC6, 0xCF, + 0x44, 0xCF, 0x24, 0xCF, 0x84, 0x4C, 0x02, 0xAE, 0x46, 0x4C, 0x00, 0xA2, + 0x2D, 0x4C, 0x02, 0xAE, 0x10, 0x4C, 0x04, 0xAE, 0x05, 0xE0, 0x04, 0xAE, + 0x4A, 0x4C, 0x04, 0xAE, 0x01, 0x4D, 0x93, 0xE0, 0x51, 0x0A, 0x4B, 0x00, + 0x52, 0x4C, 0x02, 0xAE, 0x51, 0x4C, 0x02, 0xAE, 0x75, 0x4C, 0x02, 0xAE, + 0x6C, 0x4C, 0x04, 0xAE, 0x60, 0x4C, 0x02, 0xAE, 0x5F, 0x4C, 0x02, 0xAE, + 0x62, 0x4C, 0x04, 0xAE, 0x64, 0x4C, 0x04, 0xAE, 0x5D, 0x4C, 0x0A, 0xAE, + 0x63, 0x4C, 0x04, 0xAE, 0xC8, 0xCF, 0x46, 0xCF, 0x5E, 0x4C, 0x0A, 0xAE, + 0x02, 0xAE, 0x46, 0x4C, 0x00, 0xA2, 0x06, 0xCF, 0x11, 0xA1, 0x7A, 0x2A, + 0x02, 0xAE, 0x84, 0x4C, 0x04, 0xAE, 0x7F, 0x4C, 0x04, 0xAE, 0x2E, 0xB4, + 0x02, 0xAE, 0x81, 0x4C, 0x08, 0xAE, 0x80, 0x4C, 0x04, 0xAE, 0x75, 0x4C, + 0x02, 0xAE, 0x82, 0x4C, 0x0A, 0xAE, 0x7B, 0x4C, 0x0A, 0xAE, 0x76, 0x4C, + 0x02, 0xAE, 0x7D, 0x4C, 0x02, 0xAE, 0x7C, 0x4C, 0x03, 0xE0, 0x77, 0x2A, + 0x02, 0xAE, 0x7E, 0x4C, 0x78, 0x2A, 0x04, 0xAE, 0x56, 0xE0, 0x59, 0x00, + 0x04, 0xAE, 0x56, 0xE0, 0x5D, 0x00, 0x03, 0xE0, 0x56, 0xE0, 0x5D, 0x00, + 0x03, 0xE0, 0x79, 0x2A, 0x70, 0x2A, 0x00, 0xA2, 0x64, 0xCF, 0x48, 0xCF, + 0x56, 0xE0, 0x3F, 0xA8, 0x41, 0x00, 0x03, 0xE0, 0x24, 0x00, 0x03, 0xE0, + 0x74, 0x2A, 0x08, 0xAE, 0x72, 0x2A, 0x04, 0xAE, 0x56, 0xE0, 0x1F, 0xA8, + 0x56, 0xE0, 0x07, 0xA8, 0x1C, 0x00, 0x03, 0xE0, 0x20, 0x00, 0x03, 0xE0, + 0x71, 0x2A, 0x04, 0xAE, 0x73, 0x2A, 0x08, 0xAE, 0x56, 0xE0, 0x07, 0xA8, + 0x56, 0xE0, 0x1F, 0xA8, 0x31, 0x00, 0x03, 0xE0, 0x04, 0xE0, 0x46, 0x00, + 0xC1, 0xE0, 0x4A, 0xCF, 0xB8, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x00, 0x00, + 0xDE, 0x07, 0x61, 0xE1, 0x5B, 0xF0, 0x41, 0xA8, 0x4C, 0xCF, 0x6D, 0x4C, + 0x11, 0x4D, 0x11, 0x21, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x1A, 0xCF, + 0xB8, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x10, 0x00, 0xDE, 0x07, 0x61, 0xE1, + 0x7B, 0xF0, 0x41, 0xA8, 0x42, 0xE0, 0xE5, 0x2A, 0x11, 0x4D, 0x11, 0x21, + 0xC1, 0xE0, 0x1C, 0xCF, 0x4E, 0xCF, 0x6E, 0x4C, 0x10, 0xAE, 0x20, 0x00, + 0x04, 0xE0, 0x46, 0x00, 0x8B, 0xF0, 0x41, 0xA8, 0xB8, 0x2A, 0x42, 0xE0, + 0x11, 0x4D, 0x11, 0x21, 0xDE, 0x07, 0x61, 0xE1, 0x6F, 0x4C, 0x42, 0xE0, + 0x03, 0xAE, 0xE5, 0x2A, 0x46, 0x00, 0xC1, 0xE0, 0x1E, 0xCF, 0x50, 0xCF, + 0x42, 0xE0, 0x10, 0xAE, 0x30, 0x00, 0x04, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, + 0x03, 0xA8, 0xB8, 0x2A, 0x00, 0xCF, 0x11, 0x4D, 0x11, 0x21, 0xF0, 0x08, + 0x15, 0x4D, 0x15, 0x21, 0xC0, 0x08, 0x65, 0xE1, 0xB7, 0x2A, 0x22, 0x00, + 0x04, 0xE0, 0x02, 0xCF, 0x41, 0xA8, 0xB7, 0x2A, 0x16, 0xB6, 0x03, 0xA8, + 0x14, 0xCF, 0x11, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0x2E, 0xE4, 0xC4, 0xCF, + 0x54, 0x4C, 0x53, 0x20, 0xF9, 0x16, 0x00, 0xE4, 0x04, 0xA1, 0x82, 0xE0, + 0x24, 0xCF, 0x56, 0x4C, 0x10, 0xAE, 0x55, 0x28, 0x23, 0xCB, 0x20, 0xCB, + 0x00, 0x02, 0x90, 0xD1, 0x26, 0xCB, 0xC8, 0xF7, 0xF9, 0x16, 0x09, 0xE4, + 0x02, 0xA2, 0x2A, 0xE4, 0x00, 0xA1, 0x02, 0x3D, 0x55, 0x28, 0x80, 0xE1, + 0x80, 0xE1, 0x6B, 0x3C, 0x02, 0x84, 0x02, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x04, 0xAF, 0x08, 0xA0, 0x18, 0xE0, 0x56, 0x82, 0x49, 0xE0, 0x02, 0xAE, + 0xE4, 0x3C, 0x04, 0xAE, 0x05, 0xE0, 0x63, 0xF0, 0x00, 0x01, 0x03, 0xE0, + 0x6E, 0xF0, 0x00, 0x02, 0x04, 0xE0, 0x00, 0x01, 0x03, 0xE0, 0x3B, 0xF0, + 0xFF, 0x00, 0x09, 0xE0, 0x28, 0xCA, 0xE5, 0x3C, 0x46, 0xE0, 0x00, 0x01, + 0x00, 0xA2, 0x03, 0xA1, 0x83, 0xE0, 0xF8, 0xF7, 0x00, 0xE0, 0x04, 0xAE, + 0x82, 0xB4, 0x86, 0xB4, 0x46, 0x00, 0xC1, 0xE0, 0x10, 0xAE, 0x00, 0x00, + 0xDB, 0xF0, 0x41, 0xA8, 0xB8, 0x2A, 0x42, 0xE0, 0x45, 0xF0, 0x00, 0xA2, + 0x03, 0xA1, 0x83, 0xE0, 0x63, 0xE1, 0xE5, 0x08, 0x27, 0xF0, 0xE5, 0x08, + 0x42, 0xE0, 0x13, 0x4F, 0x13, 0x23, 0xDE, 0x07, 0xE4, 0x28, 0x00, 0x02, + 0x11, 0xD1, 0x20, 0xCE, 0x04, 0xA9, 0x40, 0xA8, 0xB7, 0x28, 0x24, 0xCE, + 0x81, 0xE1, 0xF8, 0xF7, 0x28, 0xCA, 0x26, 0xCE, 0x6B, 0xE1, 0x00, 0x00, + 0x91, 0xD1, 0x2E, 0xE4, 0x1E, 0xE4, 0x0F, 0x17, 0x1E, 0xE4, 0x2E, 0xE4, + 0x57, 0x28, 0xEB, 0x17, 0x1E, 0xE4, 0x62, 0x17, 0x02, 0xA2, 0x8E, 0x02, + 0x1E, 0xE4, 0x28, 0xE4, 0xC0, 0xE0, 0x2E, 0xE4, 0x06, 0x01, 0xC2, 0xE0, + 0x10, 0x28, 0x2E, 0xE4, 0xE8, 0xF7, 0x11, 0x01, 0x00, 0x01, 0xC2, 0xE0, + 0x02, 0xA9, 0x08, 0xAE, 0xA5, 0x2A, 0x25, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x2C, 0xA9, 0x08, 0xAE, 0x92, 0xB6, 0xA4, 0x4E, 0x14, 0x00, 0x04, 0xE0, + 0x78, 0x01, 0xC2, 0xE0, 0x56, 0x4C, 0x55, 0x20, 0x79, 0x01, 0xC2, 0xE0, + 0x39, 0xF0, 0x05, 0xA1, 0x10, 0x2A, 0x08, 0xAE, 0x01, 0x01, 0xC2, 0xE0, + 0x54, 0x4C, 0x53, 0x20, 0x46, 0x00, 0xC1, 0xE0, 0xA5, 0x1A, 0x1E, 0xE4, + 0x42, 0xE0, 0x10, 0xAE, 0x50, 0x00, 0x04, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, + 0x05, 0xA8, 0xB8, 0x2A, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xF2, 0x08, + 0x51, 0x08, 0x4B, 0x00, 0x04, 0xE0, 0x03, 0x01, 0x4A, 0x4C, 0x04, 0xAE, + 0x01, 0x29, 0x92, 0xE0, 0x04, 0x01, 0xC2, 0xE0, 0x52, 0x4C, 0x02, 0xAE, + 0x32, 0xB4, 0x01, 0xA1, 0x6C, 0x2A, 0x00, 0xA2, 0x10, 0x28, 0x2E, 0xE4, + 0x05, 0x01, 0xC2, 0xE0, 0x00, 0x01, 0xC2, 0xE0, 0x02, 0xA9, 0x08, 0xAE, + 0x08, 0xAE, 0x92, 0xB6, 0xA4, 0x4E, 0xA5, 0x2A, 0x04, 0xE0, 0x78, 0x01, + 0xC2, 0xE0, 0x2C, 0xA9, 0x1E, 0xE4, 0x79, 0x01, 0xC2, 0xE0, 0x14, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xA5, 0x1A, 0x15, 0x2B, 0xD0, 0x08, + 0x65, 0xE1, 0x20, 0x03, 0x03, 0xA8, 0x15, 0x2B, 0x52, 0xB4, 0x03, 0xA8, + 0x03, 0xA8, 0x15, 0x2B, 0x04, 0xAE, 0x32, 0xB4, 0x32, 0xB4, 0x03, 0xA8, + 0x15, 0x2B, 0x52, 0xB4, 0x52, 0xB4, 0x03, 0xA8, 0x15, 0x2B, 0x04, 0xAE, + 0x04, 0xAE, 0x32, 0xB4, 0x03, 0xA8, 0x15, 0x2B, 0x15, 0x2B, 0x52, 0xB4, + 0x03, 0xA8, 0x15, 0x2B, 0x20, 0xC4, 0x04, 0xAE, 0x32, 0xB4, 0x03, 0xA8, + 0x0F, 0xAF, 0x35, 0x2B, 0xDC, 0x08, 0x65, 0xE1, 0x0F, 0xAF, 0x35, 0x2B, + 0x52, 0xB4, 0x03, 0xA8, 0x64, 0x2A, 0x04, 0xAE, 0x32, 0xB4, 0x03, 0xA8, + 0x02, 0xAE, 0x32, 0xB4, 0x03, 0xA8, 0x56, 0xB4, 0x65, 0xE1, 0x03, 0x03, + 0xC2, 0xE0, 0x61, 0x4C, 0x22, 0xD0, 0x04, 0x03, 0x66, 0xE1, 0xD0, 0x08, + 0x15, 0x29, 0xA5, 0x17, 0x84, 0xE1, 0x03, 0x00, 0x03, 0xAF, 0x15, 0x2B, + 0x18, 0xAE, 0x02, 0xAF, 0x65, 0xE1, 0x20, 0xC4, 0x16, 0x9F, 0x42, 0xE0, + 0x0D, 0xAF, 0x35, 0x2B, 0x00, 0xA2, 0xDD, 0x08, 0x42, 0xE0, 0x73, 0xB6, + 0x01, 0xA1, 0x07, 0xA8, 0x01, 0xA1, 0x07, 0xA8, 0x0D, 0xAF, 0x35, 0x2B, + 0xC2, 0xE0, 0x42, 0xE0, 0x05, 0xAE, 0x73, 0xB6, 0x02, 0xA2, 0x28, 0xE4, + 0x57, 0x28, 0x08, 0x03, 0xC8, 0x08, 0x65, 0xE1, 0x02, 0x03, 0xC2, 0xE0, + 0xC9, 0x08, 0x65, 0xE1, 0x82, 0xF0, 0x05, 0x29, 0xC7, 0x08, 0x65, 0xE1, + 0x42, 0xF0, 0x05, 0x29, 0xE7, 0x3C, 0x80, 0x03, 0xC2, 0xE0, 0x05, 0x29, + 0x82, 0xF0, 0x05, 0x29, 0xC9, 0x08, 0x65, 0xE1, 0x42, 0xF0, 0x05, 0x29, + 0xC8, 0x08, 0x65, 0xE1, 0xC2, 0xE0, 0x05, 0x29, 0xC7, 0x08, 0x65, 0xE1, + 0xC7, 0x08, 0x65, 0xE1, 0xE8, 0x3C, 0x83, 0x03, 0x51, 0x2A, 0x86, 0x03, + 0xC2, 0xE0, 0x05, 0x29, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0x3C, 0x2B, 0xF0, + 0x12, 0x03, 0xC2, 0xE0, 0x0E, 0xA2, 0x02, 0x03, 0x02, 0xA2, 0x2E, 0xE4, + 0x64, 0x01, 0x1E, 0xE4, 0x56, 0xE0, 0x07, 0xA8, 0x10, 0x2A, 0x04, 0xAE, + 0x51, 0x0A, 0x4B, 0x00, 0x05, 0xE0, 0x04, 0xAE, 0x56, 0xE0, 0x07, 0xA8, + 0x01, 0x2B, 0x93, 0xE0, 0x56, 0xE0, 0x07, 0xA8, 0x4A, 0x2A, 0x04, 0xAE, + 0x56, 0xE0, 0x03, 0xA8, 0x52, 0x2A, 0x02, 0xAE, 0x6C, 0x2A, 0x04, 0xA2, + 0x04, 0x02, 0xC2, 0xE0, 0x12, 0xB6, 0x2C, 0x2A, 0x12, 0xB6, 0x01, 0xA1, + 0x11, 0xA8, 0x02, 0x2B, 0xD8, 0x08, 0x62, 0xE1, 0x92, 0xB4, 0x01, 0xA1, + 0x6C, 0x2A, 0x12, 0xB6, 0x46, 0x00, 0xC1, 0xE0, 0x08, 0x02, 0xC2, 0xE0, + 0x42, 0xE0, 0x10, 0xAE, 0x90, 0x00, 0x04, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, + 0x21, 0xA8, 0xB8, 0x2A, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xDC, 0x07, + 0xFD, 0x1A, 0x1E, 0xE4, 0x04, 0xA2, 0x09, 0x02, 0x12, 0xB6, 0x01, 0xA1, + 0x6C, 0x2A, 0x12, 0xB6, 0xD8, 0x08, 0x62, 0xE1, 0x12, 0xB6, 0x2C, 0x2A, + 0x2C, 0x4C, 0x12, 0xB6, 0x11, 0xA8, 0x02, 0x2B, 0x46, 0x00, 0xC1, 0xE0, + 0x10, 0x02, 0xC2, 0xE0, 0x42, 0xE0, 0x10, 0xAE, 0xE0, 0x00, 0x04, 0xE0, + 0x61, 0xE1, 0x5B, 0xF0, 0x09, 0xA8, 0xB8, 0x2A, 0xC2, 0xE0, 0x11, 0x4D, + 0x11, 0x21, 0xF4, 0x08, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x11, 0x02, + 0x10, 0xAE, 0x80, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x5B, 0xF0, 0x11, 0xA8, + 0xB8, 0x2A, 0x42, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xF6, 0x08, 0x61, 0xE1, + 0x54, 0x4C, 0x53, 0x20, 0x12, 0x02, 0xC2, 0xE0, 0x63, 0xE1, 0x04, 0xA2, + 0x05, 0x02, 0xC2, 0xE0, 0x03, 0x2B, 0xCF, 0x08, 0x64, 0xE1, 0xC7, 0x08, + 0x4A, 0xB6, 0x04, 0x2B, 0x16, 0xB6, 0x04, 0x1B, 0x62, 0xE1, 0x00, 0xA2, + 0xB2, 0x1A, 0x1E, 0xE4, 0x02, 0x2B, 0xCF, 0x08, 0x64, 0xE1, 0xD8, 0x08, + 0x04, 0x2B, 0x72, 0xB6, 0x03, 0xA8, 0x07, 0xAF, 0x2B, 0xF0, 0xFD, 0x1A, + 0x1E, 0xE4, 0x0A, 0xB6, 0x65, 0xE1, 0xC3, 0x1A, 0x1E, 0xE4, 0x04, 0xA9, + 0x0B, 0x02, 0xC2, 0xE0, 0x05, 0x29, 0xC7, 0x08, 0x51, 0x1B, 0x1E, 0xE4, + 0x14, 0x02, 0xC2, 0xE0, 0x06, 0xA2, 0xEB, 0xF0, 0xFD, 0x1A, 0x1E, 0xE4, + 0x8F, 0x1B, 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, 0x65, 0xE1, 0x3B, 0xF0, + 0x11, 0xA8, 0x02, 0x2B, 0xB7, 0x1B, 0x1E, 0xE4, 0x05, 0x29, 0xCF, 0x08, + 0xC7, 0x08, 0x63, 0xE1, 0xD8, 0x08, 0x62, 0xE1, 0x02, 0x2B, 0x00, 0xA2, + 0xCF, 0x08, 0x64, 0xE1, 0x10, 0xAE, 0x32, 0xB4, 0x03, 0xA8, 0x0F, 0xAF, + 0xFF, 0x00, 0x09, 0xE0, 0x11, 0xAF, 0x02, 0x2B, 0xC2, 0xE0, 0x0A, 0xB6, + 0x04, 0x2B, 0x56, 0xE0, 0x29, 0xF0, 0xFD, 0x1A, 0x1E, 0xE4, 0x18, 0x02, + 0x05, 0x29, 0xCF, 0x08, 0x65, 0xE1, 0x25, 0xE4, 0xFD, 0x1A, 0x1E, 0xE4, + 0x16, 0x02, 0xC2, 0xE0, 0x16, 0x02, 0xC2, 0xE0, 0x98, 0x28, 0x4B, 0xF0, + 0x62, 0xE1, 0x2E, 0xE4, 0x51, 0x1B, 0x1E, 0xE4, 0x64, 0xE1, 0xE8, 0x08, + 0x63, 0xE1, 0xCB, 0x08, 0x00, 0xA2, 0xEA, 0x08, 0x65, 0xE1, 0xE9, 0x08, + 0x02, 0x2B, 0x32, 0xB6, 0x05, 0xA8, 0x03, 0x2B, 0x04, 0xE0, 0x2A, 0xE4, + 0xA7, 0x3C, 0x0A, 0xB6, 0x00, 0xA2, 0x7F, 0x01, 0xC2, 0xE0, 0x2C, 0x01, + 0x7F, 0x01, 0xC2, 0xE0, 0xDD, 0x1A, 0x1E, 0xE4, 0x1E, 0xA0, 0xFF, 0x7F, + 0x08, 0xE0, 0x15, 0x29, 0x08, 0xE0, 0x15, 0x29, 0xA8, 0x3C, 0x08, 0xAF, + 0xA9, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, 0xFF, 0x7F, 0xAD, 0x3C, 0x18, 0xE0, + 0xA9, 0x82, 0xA8, 0x84, 0xAC, 0x3C, 0xAB, 0x3C, 0xAA, 0x3C, 0x00, 0xA2, + 0xA9, 0x4C, 0x20, 0xAE, 0x02, 0xA1, 0xA8, 0x28, 0x03, 0x29, 0x42, 0x01, + 0xC2, 0xE0, 0x02, 0xA1, 0x49, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x0E, 0xAF, + 0x04, 0x2B, 0x20, 0xAE, 0xD9, 0x1A, 0x1E, 0xE4, 0x56, 0xE0, 0x09, 0xAE, + 0x03, 0xA8, 0x1F, 0xAF, 0x56, 0xE0, 0x1F, 0xA8, 0x15, 0xAF, 0x04, 0x2B, + 0x00, 0xE0, 0x9C, 0x28, 0x4E, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x05, 0x29, + 0x9A, 0xE0, 0xCB, 0x08, 0x03, 0x2B, 0x6C, 0x1B, 0x1E, 0xE4, 0x43, 0x01, + 0xCB, 0x08, 0x65, 0xE1, 0x79, 0xF0, 0x05, 0xA8, 0x6E, 0xF0, 0x44, 0x01, + 0xC2, 0xE0, 0x05, 0x29, 0xC2, 0xE0, 0x7E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, + 0x2A, 0xE4, 0xA7, 0x28, 0x2E, 0xE4, 0x44, 0x01, 0xC0, 0xE0, 0xE8, 0xF7, + 0x29, 0x19, 0x1E, 0xE4, 0x04, 0xA9, 0x00, 0xA2, 0xE8, 0xF7, 0x4B, 0x01, + 0xAB, 0x4C, 0x10, 0xAE, 0xAA, 0x4C, 0x10, 0xAE, 0xC2, 0xE0, 0x02, 0xA2, + 0x4D, 0x01, 0xC2, 0xE0, 0xE8, 0xF7, 0x4B, 0x01, 0xC0, 0xE0, 0x4A, 0x01, + 0xAD, 0x1A, 0xAC, 0x2A, 0x00, 0xA2, 0x2E, 0xE4, 0xE8, 0xF7, 0x4B, 0x01, + 0xC0, 0xE0, 0x23, 0xE4, 0x02, 0xAE, 0x22, 0xB4, 0xAC, 0x2A, 0x00, 0xA2, + 0x10, 0xAE, 0x2A, 0xB4, 0xAD, 0x1A, 0xAC, 0x2A, 0xC2, 0xE0, 0xAB, 0x4C, + 0x10, 0xAE, 0xAA, 0x4C, 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x4D, 0x01, + 0xAC, 0x3E, 0x03, 0xA0, 0xAC, 0x2A, 0x02, 0xA2, 0xA8, 0x1A, 0xAA, 0x3E, + 0x03, 0xA0, 0xAA, 0x2A, 0xAB, 0x2A, 0xAA, 0x3E, 0x01, 0xA2, 0x25, 0xE4, + 0x25, 0xE4, 0xA9, 0x1A, 0xAB, 0x3E, 0x03, 0xA0, 0x65, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x00, 0xA2, 0x28, 0xCA, 0x2A, 0xE4, 0x00, 0x01, 0x08, 0xE0, + 0x20, 0xCE, 0x6A, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, 0x04, 0x00, 0x12, 0xD1, + 0x00, 0x03, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0xFA, 0x08, 0x62, 0xE1, 0x00, 0x03, 0x61, 0xE1, 0x11, 0x35, 0x20, 0xA9, + 0x30, 0xAE, 0x02, 0xA2, 0x12, 0x35, 0x11, 0x4D, 0x11, 0x21, 0x11, 0x3D, + 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x12, 0x3D, 0x00, 0x03, 0x11, 0xD1, + 0x20, 0xCE, 0x6A, 0x00, 0x02, 0x00, 0x13, 0xD1, 0x04, 0x00, 0x12, 0xD1, + 0xC0, 0xE0, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x2A, 0xE4, 0x02, 0xA8, + 0x10, 0xAF, 0x65, 0x00, 0xC3, 0x08, 0x63, 0xE1, 0x00, 0x03, 0x61, 0xE1, + 0x01, 0x3C, 0x00, 0xA2, 0xC5, 0x08, 0x64, 0xE1, 0xA1, 0x19, 0x84, 0xE1, + 0x07, 0x00, 0x22, 0xD0, 0x0B, 0x4F, 0x13, 0x23, 0x08, 0xAE, 0x00, 0xA2, + 0x14, 0x23, 0x52, 0xB4, 0x03, 0xA8, 0x01, 0x5E, 0x92, 0xB4, 0x03, 0xA8, + 0x01, 0x5E, 0x0C, 0x4F, 0x07, 0xA8, 0x01, 0x3E, 0x03, 0xA0, 0x01, 0x2A, + 0xC7, 0x08, 0x62, 0xE1, 0x11, 0x3D, 0x19, 0xF7, 0x00, 0xE0, 0x04, 0xAF, + 0xF4, 0xF0, 0x02, 0x29, 0x02, 0x2B, 0x18, 0xA2, 0x92, 0xE0, 0x00, 0x03, + 0x01, 0x3C, 0x46, 0xE0, 0x05, 0xAE, 0x07, 0xA8, 0x01, 0x3D, 0x01, 0x4D, + 0x01, 0x58, 0x02, 0xA2, 0xF8, 0xF7, 0x28, 0xCA, 0x80, 0xE1, 0x80, 0xE1, + 0x12, 0x4D, 0x12, 0x21, 0xFA, 0x08, 0x62, 0xE1, 0x12, 0xD1, 0x00, 0x03, + 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x08, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x81, 0xE1, 0xF8, 0xF7, 0x2A, 0xE4, 0x02, 0xA8, + 0x0A, 0xAF, 0x65, 0x00, 0xE3, 0x3C, 0xE2, 0x3C, 0xE1, 0x3C, 0x00, 0xA2, + 0x12, 0x3D, 0x12, 0x3D, 0x00, 0x03, 0x62, 0xE1, 0xF8, 0xF7, 0x28, 0xCA, + 0x12, 0x3D, 0x12, 0x3D, 0x11, 0xD1, 0x20, 0xCE, 0x6B, 0x00, 0xC0, 0xE0, + 0x13, 0xD1, 0x04, 0x00, 0x12, 0xD1, 0x00, 0x03, 0x2E, 0xE4, 0xF8, 0xF7, + 0x28, 0xCA, 0x00, 0x00, 0x02, 0xA8, 0x0A, 0xAF, 0x65, 0x00, 0xC0, 0xE0, + 0x20, 0xA1, 0x7E, 0xA8, 0xE1, 0x2C, 0x2A, 0xE4, 0x3E, 0x1A, 0x1E, 0xE4, + 0x00, 0xA2, 0x22, 0xE4, 0xD6, 0x4C, 0xD7, 0x20, 0xCA, 0xF7, 0xD4, 0x28, + 0x60, 0xF7, 0x46, 0xE0, 0x07, 0xAF, 0x71, 0xC8, 0xE1, 0x2C, 0x3E, 0x1A, + 0x1E, 0xE4, 0x02, 0xA2, 0x00, 0x03, 0x61, 0xE1, 0xE1, 0x3C, 0x02, 0xA0, + 0x06, 0xAF, 0x70, 0xC8, 0x11, 0x3D, 0xD3, 0x28, 0x11, 0x3D, 0x11, 0x3D, + 0x00, 0xA2, 0x11, 0x3D, 0x20, 0xA2, 0x9A, 0xF0, 0x16, 0xAF, 0x70, 0xC8, + 0x00, 0xA2, 0x01, 0x03, 0x61, 0xE1, 0xE1, 0x3C, 0x28, 0xCA, 0x11, 0x3D, + 0x11, 0x3D, 0x11, 0x3D, 0xE1, 0x2E, 0x6B, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, + 0x20, 0xCE, 0x42, 0xE0, 0x07, 0xAE, 0x7F, 0xA8, 0x04, 0x00, 0x12, 0xD1, + 0x00, 0x03, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, 0x00, 0x00, 0x13, 0xD1, + 0x7E, 0xA8, 0xE1, 0x2C, 0x00, 0x03, 0x61, 0xE1, 0xE1, 0x2C, 0x11, 0x3D, + 0xE2, 0x2C, 0x11, 0x3D, 0x11, 0x3D, 0x00, 0xA2, 0x11, 0x3D, 0x10, 0xAF, + 0x6B, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x12, 0xD1, 0x00, 0x03, + 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x00, 0x00, 0x13, 0xD1, 0x04, 0x00, + 0xC0, 0xE0, 0x78, 0xF2, 0x2E, 0xE4, 0xF8, 0xF7, 0xC0, 0xE0, 0xC0, 0xF2, + 0xE3, 0x1C, 0x6C, 0x00, 0x68, 0xF0, 0x02, 0xA8, 0x14, 0xAF, 0x65, 0x00, + 0x00, 0x02, 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x7E, 0xA8, 0xE1, 0x2C, + 0x4E, 0xBA, 0x98, 0xF0, 0xE1, 0x3C, 0x42, 0xE0, 0x11, 0xAE, 0x03, 0xA2, + 0x0A, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0xA2, 0x5D, 0x00, + 0xC2, 0xE0, 0x00, 0x02, 0x08, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0x00, 0xCE, + 0xE3, 0x3C, 0x00, 0xA2, 0xC8, 0xF7, 0x00, 0x02, 0x2A, 0xE4, 0x0E, 0xA8, + 0xE3, 0x2C, 0xAE, 0xF0, 0x06, 0xAE, 0x06, 0xAF, 0x0E, 0xA0, 0xE3, 0x2C, + 0x0E, 0xA8, 0xE3, 0x2C, 0x0E, 0xF2, 0xE3, 0x3C, 0x00, 0xA2, 0x00, 0x03, + 0x61, 0xE1, 0x88, 0xF0, 0x11, 0x3D, 0x11, 0x3D, 0x11, 0x3D, 0x11, 0x3D, + 0x00, 0xE0, 0x02, 0xAF, 0x0E, 0xA8, 0xE3, 0x2C, 0x02, 0xA8, 0xE3, 0x2C, + 0x92, 0xE0, 0x00, 0x03, 0x11, 0x3D, 0x10, 0xAE, 0x4E, 0xBA, 0x58, 0xF0, + 0x11, 0x3D, 0x01, 0x4D, 0x4E, 0xBA, 0x4E, 0xF0, 0x0E, 0xA8, 0xE3, 0x3C, + 0x02, 0xA0, 0xE3, 0x2C, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x28, 0xE4, + 0xE3, 0x2E, 0x88, 0x00, 0x00, 0xE0, 0x6B, 0x00, 0x42, 0xE0, 0x07, 0xAE, + 0x07, 0xAF, 0x03, 0xA1, 0x12, 0xD1, 0x00, 0x03, 0x11, 0xD1, 0x20, 0xCE, + 0x28, 0xCA, 0x00, 0x00, 0x13, 0xD1, 0x04, 0x00, 0xE2, 0x3C, 0x10, 0xA0, + 0xE2, 0x2C, 0xF8, 0xF7, 0x12, 0x2A, 0xDD, 0x1A, 0x1E, 0xE4, 0x2E, 0xE4, + 0x1E, 0xE4, 0x55, 0xE0, 0x07, 0xAE, 0x17, 0xE0, 0xC2, 0xE0, 0x56, 0xE0, + 0x0A, 0xAE, 0xD4, 0x1A, 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, 0x02, 0x01, + 0x09, 0xAE, 0x17, 0xE0, 0x12, 0x2A, 0xDD, 0x1A, 0x06, 0xAE, 0xD4, 0x1A, + 0x1E, 0xE4, 0x55, 0xE0, 0x56, 0xE0, 0x0F, 0xAE, 0x83, 0xE0, 0x56, 0xE0, + 0x92, 0xE0, 0x2E, 0xE4, 0x13, 0x02, 0xC2, 0xE0, 0x17, 0xE0, 0x12, 0x2A, + 0xDD, 0x1A, 0x1E, 0xE4, 0xD4, 0x1A, 0x1E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, + 0x0F, 0xAE, 0x83, 0xE0, 0x56, 0xE0, 0x06, 0xAE, 0x2E, 0xE4, 0x15, 0x02, + 0xC2, 0xE0, 0x56, 0xE0, 0x02, 0xA8, 0x06, 0xAF, 0x44, 0x00, 0xC0, 0xE0, + 0x80, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x44, 0x00, + 0xC0, 0xE0, 0x58, 0xF0, 0x20, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x08, 0xE0, 0x56, 0xE0, + 0x03, 0xAE, 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, + 0xC1, 0xE0, 0x2E, 0xE4, 0x07, 0xA8, 0x1B, 0xAF, 0x05, 0xA1, 0x07, 0xA8, + 0x1B, 0xAF, 0x44, 0x00, 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, + 0x23, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x44, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0x07, 0xA8, 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, 0x23, 0xAF, + 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, 0x02, 0xA8, 0x20, 0xAF, + 0x44, 0x00, 0xC0, 0xE0, 0x60, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, + 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x00, 0xE0, 0x18, 0xE0, + 0x88, 0xC7, 0xA4, 0xCC, 0xC2, 0xE0, 0x02, 0xA2, 0x9E, 0xE0, 0x00, 0x05, + 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x0D, 0x04, 0x04, 0xAF, 0xD9, 0x1A, + 0x1E, 0xE4, 0xDA, 0xF7, 0xEE, 0x1A, 0x1E, 0xE4, 0xE6, 0x1A, 0x1E, 0xE4, + 0x1E, 0xE4, 0x1E, 0xA8, 0x33, 0x1B, 0x0B, 0xE4, 0x20, 0xAE, 0x56, 0xE0, + 0x09, 0xAE, 0xF3, 0x1A, 0xFF, 0x1F, 0x09, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, + 0xF5, 0x1B, 0x1E, 0xE4, 0x17, 0x9F, 0x56, 0xE0, 0x22, 0xD0, 0x62, 0x00, + 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x44, 0x1B, 0x84, 0xE1, 0x02, 0x00, + 0x22, 0xD0, 0x7A, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x4C, 0x1B, + 0x84, 0xE1, 0x02, 0x00, 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, + 0xC2, 0xE0, 0x02, 0xA2, 0x00, 0x3C, 0x2E, 0xE4, 0x02, 0xA8, 0x20, 0x04, + 0xC0, 0xE0, 0x0D, 0x04, 0x18, 0xE0, 0x88, 0xC7, 0x00, 0x84, 0xDA, 0xF7, + 0x55, 0x20, 0x9E, 0xE0, 0x01, 0x05, 0x00, 0xE0, 0x05, 0xA1, 0x10, 0x2A, + 0x08, 0xAE, 0x56, 0x4C, 0x07, 0x9F, 0x54, 0x4C, 0x53, 0x20, 0x39, 0xF0, + 0x2E, 0xE4, 0x0D, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x0D, 0x04, 0xC2, 0xE0, + 0x02, 0xA2, 0x00, 0x3C, 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, + 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0x00, 0x84, 0xA9, 0x4C, 0xA8, 0x20, + 0x9E, 0xE0, 0x01, 0x05, 0xB9, 0xF0, 0x05, 0xA1, 0x10, 0x2A, 0x08, 0xAE, + 0x08, 0xE0, 0x15, 0x29, 0xEA, 0x08, 0x65, 0xE1, 0x09, 0xE0, 0x15, 0x2B, + 0x20, 0xAE, 0xFF, 0x7F, 0x00, 0xA2, 0x07, 0x9F, 0x56, 0xE0, 0xFF, 0x7F, + 0xEC, 0x3C, 0x2E, 0xE4, 0x0D, 0x04, 0xC2, 0xE0, 0x05, 0xE0, 0x41, 0x00, + 0xC0, 0xE0, 0xE9, 0x3E, 0xE9, 0x08, 0x42, 0xE0, 0x11, 0xAE, 0x20, 0x00, + 0x00, 0xE0, 0x5E, 0xF8, 0x00, 0x08, 0x11, 0xD1, 0x20, 0xCE, 0x40, 0x0B, + 0x11, 0xD1, 0x80, 0x01, 0x13, 0x01, 0xEC, 0x88, 0xC0, 0x00, 0x12, 0xD1, + 0x06, 0xA2, 0x2E, 0xE4, 0xF9, 0xF7, 0x29, 0xCA, 0xB4, 0x28, 0x8F, 0x1B, + 0x1E, 0xE4, 0x01, 0xA2, 0x24, 0xE4, 0x02, 0xA1, 0x98, 0x28, 0x94, 0xE0, + 0x1E, 0xE4, 0x0C, 0xC4, 0x49, 0xE0, 0x92, 0xE0, 0xB4, 0x2A, 0x8E, 0xF7, + 0x82, 0xE0, 0xC6, 0x1B, 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x95, 0xE0, + 0x6E, 0x00, 0xC1, 0xE0, 0x49, 0xF0, 0x23, 0xA1, 0x1E, 0xE4, 0x04, 0xC4, + 0x98, 0x2A, 0x95, 0xE0, 0x86, 0xC7, 0xA4, 0xCC, 0x2E, 0xE4, 0xC6, 0x1B, + 0x9A, 0xE0, 0x00, 0x08, 0x00, 0xE0, 0x18, 0xE0, 0x07, 0xAE, 0x9C, 0xE0, + 0x40, 0x03, 0x00, 0xE0, 0x1E, 0xE4, 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, + 0xE6, 0x1A, 0x1E, 0xE4, 0x04, 0xAF, 0xDD, 0x1A, 0x1E, 0xE4, 0x1E, 0xA8, + 0x69, 0xF0, 0x89, 0xE0, 0x20, 0xAE, 0x56, 0xE0, 0x09, 0xAE, 0x02, 0x1B, + 0x1E, 0xE4, 0x17, 0x9F, 0x42, 0xE0, 0x85, 0xE0, 0xF5, 0x1B, 0x1B, 0xE4, + 0x89, 0xE0, 0xEC, 0x1B, 0x2E, 0xE4, 0x00, 0x1C, 0x1E, 0xE4, 0x17, 0x9F, + 0x10, 0x2A, 0x08, 0xAE, 0x56, 0x4C, 0x55, 0x20, 0x54, 0x4C, 0x53, 0x20, + 0x39, 0xF0, 0x05, 0xA1, 0xC1, 0xE0, 0x56, 0x4C, 0x55, 0x20, 0x2E, 0xE4, + 0x39, 0xF0, 0x23, 0xA1, 0x23, 0xA8, 0x60, 0x00, 0x2E, 0xE4, 0x08, 0xAE, + 0x55, 0x4C, 0x56, 0x20, 0xC2, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, 0x02, 0xA2, + 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x0E, 0x04, 0x84, 0xE1, 0x02, 0x00, + 0x22, 0xD0, 0xDA, 0xF7, 0x17, 0x9F, 0x15, 0x4D, 0x15, 0x21, 0x0F, 0x1C, + 0x16, 0x1C, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x00, 0xA2, 0x17, 0x9F, + 0x16, 0x4D, 0x16, 0x21, 0x87, 0x28, 0x2E, 0xE4, 0x0D, 0x04, 0xC2, 0xE0, + 0xCA, 0xCF, 0x52, 0xCF, 0x88, 0x4C, 0x10, 0xAE, 0x8B, 0xD1, 0x01, 0x00, + 0x8C, 0xD1, 0x08, 0xCF, 0xE1, 0xD1, 0xF8, 0xF7, 0x16, 0xCB, 0x00, 0x00, + 0x2E, 0xE4, 0xF8, 0xF7, 0xC2, 0xCB, 0x00, 0x00, 0x01, 0x00, 0x8B, 0xD1, + 0xF8, 0xF7, 0x18, 0xCB, 0xC3, 0xCB, 0x16, 0xCB, 0x01, 0x00, 0xE1, 0xD1, + 0x1E, 0xE4, 0x2E, 0xE4, 0xD9, 0xF7, 0xE8, 0xF7, 0x01, 0x00, 0xA0, 0xD1, + 0x2D, 0xF1, 0x1B, 0x1C, 0xD8, 0xF7, 0xA9, 0xF0, 0x43, 0xCB, 0x40, 0xCB, + 0x0A, 0xCF, 0x66, 0xCF, 0x54, 0xCB, 0x8D, 0xF0, 0x2E, 0xE4, 0x6C, 0xCF, + 0x56, 0xCB, 0xD0, 0xCF, 0xA0, 0xD1, 0x6B, 0xE1, 0x00, 0x00, 0xA1, 0xD1, + 0x2E, 0xF7, 0xF8, 0xF7, 0x40, 0xCB, 0x00, 0x00, 0x01, 0x00, 0xB0, 0xD1, + 0x7D, 0xF1, 0x2E, 0xE4, 0x1A, 0xE4, 0xD9, 0x28, 0x80, 0xE1, 0x80, 0xE1, + 0x75, 0x1C, 0x1E, 0xE4, 0x81, 0xE1, 0x0A, 0x07, 0xD8, 0xF7, 0x89, 0xF0, + 0x63, 0xCB, 0x60, 0xCB, 0x6A, 0xCB, 0x0E, 0xCF, 0x68, 0xCB, 0x6D, 0xF0, + 0x00, 0x00, 0xE0, 0xD1, 0x2E, 0xE4, 0x10, 0xCF, 0x00, 0x00, 0xB1, 0xD1, + 0x75, 0x1C, 0x1E, 0xE4, 0xC0, 0xE0, 0x10, 0xCF, 0x0E, 0xCF, 0x00, 0xA2, + 0x6B, 0xE1, 0x24, 0x01, 0xC2, 0xE0, 0x24, 0x01, 0x13, 0x01, 0xC2, 0xE0, + 0x00, 0xA2, 0x2E, 0xE4, 0x88, 0xCB, 0x0D, 0x03, 0xC2, 0xE0, 0x90, 0xCB, + 0xC2, 0xE0, 0x8A, 0xCB, 0x14, 0x01, 0xC2, 0xE0, 0x27, 0x01, 0xC2, 0xE0, + 0x8C, 0xCB, 0x15, 0x01, 0x16, 0xE0, 0x87, 0x4C, 0x57, 0x18, 0x88, 0x28, + 0xC2, 0xE0, 0x8E, 0xCB, 0x28, 0x01, 0xC2, 0xE0, 0x21, 0x02, 0xC2, 0xE0, + 0x82, 0xCB, 0x26, 0x01, 0x7B, 0x28, 0x20, 0x02, 0xC2, 0xE0, 0x84, 0xCB, + 0xF8, 0xF7, 0xD0, 0xCB, 0x2C, 0x02, 0xC2, 0xE0, 0xDA, 0xF0, 0x0F, 0x03, + 0xC2, 0xE0, 0x92, 0xCB, 0xD4, 0xCB, 0x09, 0x03, 0xC2, 0xE0, 0xD2, 0xCB, + 0xC2, 0xE0, 0xD6, 0xCB, 0x0C, 0x03, 0xC2, 0xE0, 0x0B, 0x03, 0xC2, 0xE0, + 0xD8, 0xCB, 0x0A, 0x03, 0x1A, 0xE0, 0xA1, 0x4C, 0xA0, 0x20, 0x2E, 0xE4, + 0x4A, 0xF0, 0x52, 0xE0, 0x3B, 0xB6, 0x01, 0xA2, 0x80, 0xCB, 0x2E, 0xF1, + 0x96, 0x0A, 0x1E, 0xE4, 0x12, 0xCF, 0xDA, 0xCB, 0x16, 0x01, 0xC2, 0xE0, + 0x07, 0x00, 0x22, 0xD0, 0x24, 0x02, 0x61, 0xE1, 0xC1, 0x1C, 0x84, 0xE1, + 0x00, 0x00, 0x86, 0xD1, 0x2C, 0x1C, 0x1E, 0xE4, 0x11, 0x9F, 0x86, 0xCB, + 0x02, 0xA2, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x95, 0x28, 0x2E, 0xE4, + 0x10, 0x01, 0xC2, 0xE0, 0x2A, 0xE4, 0x96, 0x28, 0x95, 0x3C, 0x3A, 0xB4, + 0x87, 0x08, 0x0E, 0xAE, 0x88, 0x28, 0xFC, 0xF0, 0x98, 0xE0, 0x70, 0x06, + 0x00, 0xE0, 0x08, 0xAF, 0x02, 0xA2, 0x00, 0x3C, 0x1E, 0xA8, 0x87, 0x28, + 0x87, 0x28, 0x04, 0x3D, 0x04, 0x4D, 0x00, 0x58, 0xAC, 0xA1, 0x88, 0x28, + 0x24, 0xE4, 0xAA, 0xA1, 0x36, 0xB6, 0x0F, 0xA1, 0x0F, 0xA8, 0x88, 0x2A, + 0x88, 0x2A, 0x42, 0x00, 0xC0, 0xE0, 0x24, 0xE4, 0x80, 0xE1, 0x42, 0xE0, + 0x0F, 0xAE, 0x07, 0xAF, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x80, 0xE1, + 0x40, 0x00, 0x12, 0xD1, 0x70, 0x06, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, + 0x02, 0x00, 0x13, 0xD1, 0x00, 0xA2, 0x70, 0x06, 0x64, 0xE1, 0x81, 0xE1, + 0x90, 0xE1, 0x2E, 0xE4, 0x14, 0x3D, 0x3F, 0xC7, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x0A, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x18, 0x00, 0x28, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x12, 0x00, + 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x40, 0x00, + 0x0B, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0B, 0x00, + 0x21, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x21, 0x00, 0x0B, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x19, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x48, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x32, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x76, 0x03, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0x03, 0x0E, 0xE4, + 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, + 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, + 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, + 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, + 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, + 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, + 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x76, 0x03, + 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, + 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, + 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, + 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, + 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, + 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, + 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, + 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, + 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, + 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, + 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, + 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, + 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, + 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, + 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, + 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, + 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, + 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, + 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, + 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, + 0x00, 0x28, 0x12, 0xD1, 0x4E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, + 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, + 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, + 0x96, 0x03, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, + 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, + 0x7C, 0xE6, 0x98, 0x03, 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, + 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, + 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, + 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, + 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xEE, 0x01, + 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, + 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, + 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, + 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, + 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, + 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, + 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, + 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, + 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, + 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, 0x90, 0x01, 0x1A, 0xE4, + 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x3E, 0xA2, + 0x2E, 0xE4, 0x4A, 0x00, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x02, 0xA2, + 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0x20, 0xA2, 0x00, 0xA2, 0x76, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0xC2, 0xE0, 0xFC, 0xA2, 0x72, 0x00, 0xC2, 0xE0, + 0x71, 0x00, 0xC2, 0xE0, 0xFA, 0xA2, 0x77, 0x00, 0x84, 0xE1, 0x0F, 0x27, + 0x22, 0xD0, 0x2E, 0xE4, 0x48, 0xF0, 0x4A, 0x00, 0xC0, 0xE0, 0xAA, 0x01, + 0xC0, 0xE0, 0xE8, 0xF7, 0x1F, 0x04, 0xC0, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, + 0xEE, 0xA1, 0x3D, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0xC2, 0xE0, 0x11, 0x00, 0x04, 0xE0, 0x9D, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0x2E, 0xE4, 0x3C, 0x04, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xE0, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0x45, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3C, 0x04, 0x28, 0xE4, 0x04, 0xA1, + 0x0E, 0xA8, 0x04, 0xAF, 0xC0, 0xE0, 0x4A, 0x00, 0xC2, 0xE0, 0x02, 0xA2, + 0x48, 0xCA, 0x8E, 0xF9, 0xE8, 0xF7, 0x11, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0xE8, 0xF7, 0x02, 0xA8, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xF8, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x3C, 0x04, 0x42, 0x3C, 0x43, 0x34, + 0x01, 0xC0, 0x2E, 0xE4, 0x43, 0x2C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, + 0x54, 0x1C, 0x2A, 0xE4, 0x00, 0xC0, 0x42, 0x2E, 0x55, 0x18, 0x10, 0xAF, + 0x4A, 0xE0, 0xB4, 0xF0, 0x56, 0x1A, 0xFF, 0x00, 0x09, 0xE0, 0x74, 0xF0, + 0xFE, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x34, 0xF0, 0x1E, 0xF1, 0x5D, 0x3C, + 0x01, 0xC0, 0x2E, 0xE4, 0x01, 0xC0, 0xEE, 0xF0, 0x5E, 0x3C, 0x01, 0xC0, + 0x5F, 0x3C, 0x01, 0xC0, 0xBE, 0xF0, 0x5E, 0x28, 0x5E, 0x1A, 0x5D, 0x2A, + 0x01, 0xC0, 0x8E, 0xF0, 0x5F, 0x2A, 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, + 0x08, 0x08, 0xC2, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0x02, 0x08, 0x62, 0xE1, + 0x0B, 0x08, 0xC3, 0xE0, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x02, 0xA2, + 0x92, 0x9F, 0x00, 0x02, 0x05, 0xE0, 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, + 0x12, 0x9F, 0x12, 0x9F, 0x12, 0x81, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, + 0xC0, 0xE0, 0x00, 0x08, 0xC2, 0xE0, 0x02, 0xA2, 0x1E, 0xE4, 0x2E, 0xE4, + 0xE8, 0xF7, 0x00, 0x08, 0x32, 0xA2, 0x20, 0x06, 0x60, 0xD1, 0x4E, 0x02, + 0x40, 0xCE, 0x2E, 0xE4, 0xC0, 0xCE, 0x18, 0xAE, 0x02, 0x00, 0x22, 0xD1, + 0x00, 0x00, 0x21, 0xD1, 0x02, 0xA8, 0x48, 0xCA, 0x80, 0x00, 0x23, 0xD1, + 0x22, 0xAE, 0x04, 0xA2, 0x2E, 0xE4, 0xE8, 0xF7, 0x8C, 0xCC, 0x72, 0xCC, + 0x00, 0xA2, 0x9E, 0xCC, 0x20, 0xAE, 0x10, 0xA8, 0x04, 0xE0, 0x8E, 0xCC, + 0x6F, 0xD1, 0x4A, 0xCE, 0x22, 0x93, 0x0A, 0xE0, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x03, 0x00, 0x60, 0xA2, 0x2E, 0xE4, 0x00, 0x00, 0x6F, 0xD1, + 0xEA, 0xF7, 0x02, 0xA8, 0x50, 0xCA, 0x50, 0xCE, 0x20, 0x00, 0x04, 0xE0, + 0x2E, 0xE4, 0x00, 0xC0, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x50, 0xCE, + 0x3D, 0x04, 0xC1, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0x00, 0x01, 0x0A, 0xE0, + 0xD9, 0xF7, 0xEF, 0xA1, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0xC2, 0x02, 0x72, 0x02, 0x1E, 0xE4, + 0x1F, 0x00, 0x08, 0xE0, 0x37, 0x03, 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, + 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x12, 0xAE, 0xE8, 0x02, 0x1E, 0xE4, + 0x2E, 0xE4, 0x27, 0x03, 0x04, 0xA8, 0x10, 0x02, 0xC0, 0xE0, 0x2A, 0xE4, + 0x08, 0xE0, 0x15, 0x02, 0xC0, 0xE0, 0x18, 0xF1, 0x16, 0x02, 0xC0, 0xE0, + 0x4A, 0xF0, 0x00, 0x01, 0x08, 0xE0, 0x13, 0x02, 0xC0, 0xE0, 0xBE, 0xF0, + 0x14, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, 0x1E, 0xE4, 0x0B, 0x02, + 0xC0, 0xE0, 0x3E, 0xF0, 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, 0x72, 0x02, + 0x10, 0x02, 0xC1, 0xE0, 0x12, 0xAE, 0x37, 0x03, 0xC1, 0xE0, 0x56, 0xE0, + 0x15, 0xAE, 0x03, 0xA8, 0x07, 0xAE, 0x7F, 0xA8, 0x0B, 0xAF, 0x04, 0x02, + 0x0F, 0xA8, 0x04, 0x02, 0xC1, 0xE0, 0x56, 0xE0, 0x1E, 0xE4, 0x1E, 0x04, + 0xC2, 0xE0, 0x56, 0xE0, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x27, 0x03, + 0x52, 0xE0, 0x1F, 0xAE, 0x03, 0xA2, 0x92, 0xE0, 0x94, 0xE0, 0x60, 0x00, + 0xC0, 0xE0, 0xEA, 0xF1, 0x84, 0xE0, 0x8A, 0xF1, 0x06, 0xA8, 0x08, 0xAF, + 0x21, 0xA8, 0x85, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, 0xC0, 0xE0, 0x0A, 0xF1, + 0x56, 0xE0, 0x17, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, + 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x3A, 0xF0, 0x56, 0xE0, + 0x03, 0xA8, 0x1B, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0x1F, 0xAE, 0x03, 0xA2, 0x44, 0x00, 0xC0, 0xE0, 0xC2, 0x02, 0x1E, 0xE4, + 0xEA, 0xF0, 0x52, 0xE0, 0x69, 0xF0, 0x0D, 0x16, 0x1E, 0xE4, 0xB8, 0xF0, + 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x38, 0xF0, 0x08, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, + 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, 0xFF, 0x00, 0x04, 0xAE, 0x02, 0xA0, + 0x00, 0x05, 0x00, 0xE0, 0xC2, 0xE0, 0x02, 0xA2, 0x1A, 0x04, 0xC2, 0xE0, + 0xEA, 0xF7, 0x19, 0x04, 0xC0, 0xE0, 0x18, 0x04, 0xC0, 0xE0, 0x18, 0x04, + 0xC2, 0xE0, 0x02, 0xA2, 0x1B, 0x04, 0xC0, 0xE0, 0xEA, 0xF7, 0x19, 0x04, + 0x28, 0xAE, 0x08, 0xAF, 0x1E, 0xA0, 0x20, 0xAF, 0xFF, 0xFF, 0x09, 0xE0, + 0x1B, 0x04, 0xC1, 0xE0, 0x56, 0xE0, 0x09, 0xAE, 0x09, 0xAF, 0x1F, 0xA0, + 0xC0, 0xE0, 0x2E, 0xE4, 0x1D, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0x02, + 0x0A, 0xE0, 0x1C, 0x04, 0xF0, 0xF7, 0x02, 0xA1, 0x28, 0xA2, 0x1C, 0x04, + 0x00, 0x02, 0x0C, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, + 0x1C, 0x04, 0xC2, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, 0x04, 0xAF, 0x44, 0x00, + 0x2E, 0xE4, 0x00, 0xC0, 0x41, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, + 0x41, 0x2C, 0x01, 0xC0, 0x57, 0x1C, 0x5A, 0xF1, 0x40, 0x03, 0x1E, 0xE4, + 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x30, 0xF1, 0x5D, 0x00, 0xC0, 0xE0, + 0xEA, 0xF0, 0x00, 0x20, 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x20, 0x0A, 0xE0, + 0x01, 0xCE, 0x03, 0xA2, 0x4F, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, 0x3C, 0x03, + 0x1E, 0xE4, 0x00, 0xA2, 0x02, 0xA8, 0x24, 0xAF, 0x65, 0x00, 0xC0, 0xE0, + 0xBA, 0xF0, 0x6D, 0x00, 0xC0, 0xE0, 0xEA, 0xF0, 0x72, 0xF0, 0x56, 0x18, + 0xFF, 0x00, 0x08, 0xE0, 0x55, 0x82, 0x00, 0x84, 0x00, 0x3C, 0x56, 0x08, + 0x3C, 0x03, 0x1E, 0xE4, 0x0E, 0xA0, 0x18, 0xE0, 0x24, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0xA3, 0x13, 0x0E, 0xE4, 0x2E, 0xE4, 0x02, 0xA8, + 0x9E, 0x03, 0x0E, 0xE4, 0x9A, 0x03, 0x0E, 0xE4, 0xA8, 0x03, 0x0E, 0xE4, + 0xA2, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0xAE, 0x03, 0x0E, 0xE4, 0xAC, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x4A, 0x05, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6E, 0x05, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6F, 0x05, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xB6, 0x01, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x22, 0x06, 0x1E, 0xE4, 0xC2, 0x06, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x59, 0x00, 0xC0, 0xE0, 0x6A, 0x00, 0x0E, 0xE4, + 0x2A, 0xE4, 0x02, 0xA1, 0xAA, 0xF2, 0x02, 0xA1, 0x0A, 0xE4, 0x02, 0xA1, + 0x5A, 0xF0, 0x02, 0xA1, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xF2, 0x03, + 0xC2, 0x30, 0x02, 0xAF, 0xC1, 0x30, 0x08, 0xAF, 0xC0, 0x3C, 0x1E, 0xA8, + 0x60, 0x00, 0xC0, 0xE0, 0xC4, 0x3C, 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, + 0xA5, 0x30, 0x04, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0x06, 0xA8, 0x06, 0xAF, + 0x65, 0x00, 0xC0, 0xE0, 0x0A, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0xA3, 0x3C, + 0xC0, 0xE0, 0x5C, 0x03, 0x1E, 0xE4, 0xD8, 0x30, 0x01, 0xC0, 0x2E, 0xE4, + 0xA4, 0x3C, 0x66, 0x00, 0x01, 0x3C, 0x00, 0x34, 0x60, 0x00, 0xC0, 0xE0, + 0x06, 0x34, 0x14, 0xAE, 0x61, 0x00, 0xC0, 0xE0, 0x62, 0x00, 0xC0, 0xE0, + 0x00, 0xC0, 0x07, 0x3C, 0x0A, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0x09, 0x30, + 0x9E, 0x06, 0x1E, 0xE4, 0x2E, 0xE4, 0xD8, 0x30, 0xF8, 0xF7, 0x28, 0xCA, + 0x4C, 0x01, 0x1E, 0xE4, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0x00, 0xC0, 0xE0, + 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, 0x00, 0x02, 0x00, 0xE0, 0xF9, 0xF7, + 0x29, 0xCA, 0x03, 0x00, 0x20, 0xCE, 0x80, 0x00, 0x00, 0xE0, 0x80, 0x01, + 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, + 0x03, 0x00, 0x13, 0xD1, 0x61, 0x16, 0x1E, 0xE4, 0x01, 0xA2, 0x04, 0xA2, + 0x39, 0x04, 0x0B, 0xE4, 0x0D, 0x16, 0x1E, 0xE4, 0x80, 0x01, 0x00, 0xE0, + 0x42, 0x00, 0xC0, 0xE0, 0x80, 0x01, 0x00, 0xE0, 0x80, 0x00, 0x00, 0xE0, + 0x12, 0xD1, 0x00, 0x02, 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, + 0x13, 0xD1, 0xC0, 0x00, 0x20, 0xCE, 0x80, 0x01, 0x00, 0xE0, 0xF9, 0xF7, + 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, + 0x03, 0x00, 0x13, 0xD1, 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, 0x04, 0xA2, + 0x1E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, 0x61, 0x16, 0xA8, 0x3C, 0x02, 0xAF, + 0x2B, 0xF0, 0x0D, 0x16, 0xC0, 0xE0, 0xA9, 0x3C, 0x61, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0xF1, 0x01, 0x1E, 0xE4, 0x6E, 0x00, 0xA7, 0x4C, 0xA6, 0x24, + 0x64, 0xF0, 0xA1, 0x28, 0x5D, 0x24, 0xA7, 0x3C, 0xA6, 0x34, 0x02, 0xA0, + 0xA6, 0x24, 0x6F, 0x00, 0xC2, 0xE0, 0x5E, 0x4C, 0xA2, 0x28, 0x70, 0x00, + 0xC2, 0xE0, 0xA7, 0x4C, 0xC2, 0xE0, 0xA0, 0x28, 0x71, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0x2E, 0x05, 0x1E, 0xE4, 0x72, 0x00, 0x82, 0x2A, 0x1C, 0xAE, + 0x81, 0x28, 0x73, 0x00, 0x56, 0xE0, 0x80, 0x2A, 0x02, 0xAE, 0x56, 0xE0, + 0xD9, 0x2A, 0x0C, 0x28, 0x74, 0x00, 0xC2, 0xE0, 0x23, 0xAE, 0x4F, 0x2A, + 0x56, 0xE0, 0x21, 0xAE, 0x56, 0xE0, 0x29, 0xAE, 0xDA, 0x2A, 0x56, 0xE0, + 0x0B, 0x07, 0x1E, 0xE4, 0x76, 0x00, 0xC2, 0xE0, 0x0E, 0x07, 0x1E, 0xE4, + 0x51, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0xA1, 0x28, 0x52, 0x00, 0xC2, 0xE0, + 0x78, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, 0x77, 0x00, 0xC2, 0xE0, 0x5B, 0x28, + 0x79, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0xAC, 0x4C, 0xAB, 0x20, 0x7A, 0x00, + 0x17, 0x21, 0xDC, 0x02, 0x67, 0xE1, 0x7C, 0x00, 0x17, 0x21, 0x7E, 0x00, + 0xC2, 0xE0, 0x17, 0x4D, 0xD4, 0x28, 0x7D, 0x00, 0xC2, 0xE0, 0x17, 0x4D, + 0x07, 0xA8, 0xD1, 0x2A, 0xD5, 0x4C, 0x20, 0xAE, 0xD2, 0x28, 0x60, 0x00, + 0xC2, 0xE0, 0xF6, 0xB7, 0x19, 0xA8, 0xD1, 0x2A, 0xD3, 0x4C, 0x20, 0xAE, + 0x61, 0xE1, 0x61, 0x00, 0xC2, 0xE0, 0xF6, 0xB7, 0x6A, 0x00, 0xC2, 0xE0, + 0x11, 0x29, 0x60, 0x03, 0x67, 0x00, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0x68, 0x00, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x69, 0x00, 0xC2, 0xE0, + 0x11, 0x4D, 0x11, 0x21, 0x56, 0xE0, 0x20, 0xAE, 0x4D, 0xC8, 0x4A, 0xC8, + 0x00, 0xA2, 0x2E, 0xE4, 0x53, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x0C, 0x28, + 0x6D, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x5E, 0x4C, 0x5D, 0x24, 0x70, 0x00, + 0xC2, 0xE0, 0xAC, 0x4C, 0xAB, 0x20, 0x71, 0x00, 0xC2, 0xE0, 0x09, 0x08, + 0x08, 0xA2, 0x72, 0x00, 0xB3, 0x28, 0xB3, 0x3C, 0x02, 0xA2, 0x73, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0x74, 0x00, 0xC2, 0xE0, 0x76, 0x00, 0xC2, 0xE0, + 0xFE, 0xA2, 0x75, 0x00, 0x0C, 0x28, 0x77, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, + 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x16, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0xDC, 0x02, 0x61, 0xE1, 0x11, 0x4D, 0x11, 0x21, 0x7A, 0x00, 0xC2, 0xE0, + 0x20, 0xAE, 0xD4, 0x28, 0x79, 0x00, 0xC2, 0xE0, 0xF6, 0xB7, 0x07, 0xA8, + 0xD1, 0x2A, 0xD5, 0x4C, 0x20, 0xAE, 0xD2, 0x28, 0x60, 0x00, 0xC2, 0xE0, + 0xF6, 0xB7, 0x19, 0xA8, 0xD1, 0x2A, 0xD3, 0x4C, 0x1C, 0xAE, 0x81, 0x28, + 0x61, 0x00, 0xC2, 0xE0, 0x80, 0x2A, 0x02, 0xAE, 0x56, 0xE0, 0x82, 0x2A, + 0xAA, 0x28, 0x6E, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x56, 0xE0, 0x17, 0xE0, + 0x26, 0x2A, 0x0E, 0xAE, 0x2C, 0x4C, 0x10, 0xAE, 0x2D, 0x4C, 0x10, 0xAE, + 0x16, 0x05, 0x1E, 0xE4, 0x7B, 0x00, 0xC2, 0xE0, 0x65, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x2E, 0xE4, 0x62, 0xE1, 0x3A, 0xF1, 0x02, 0xA8, 0x0A, 0xAF, + 0xE5, 0x2C, 0x12, 0x3D, 0xE4, 0x2C, 0xC8, 0x04, 0x29, 0xCA, 0x6B, 0x00, + 0xC0, 0xE0, 0x12, 0x3D, 0xC8, 0x04, 0x11, 0xD1, 0x20, 0xCE, 0xF9, 0xF7, + 0x00, 0x00, 0x13, 0xD1, 0x04, 0x00, 0x12, 0xD1, 0x02, 0xAE, 0x26, 0x28, + 0x2E, 0xE4, 0xE1, 0xE1, 0x43, 0x2A, 0xD7, 0x4C, 0x06, 0xAE, 0x3C, 0x4C, + 0x3E, 0x4C, 0x04, 0xAE, 0x34, 0x4E, 0x07, 0xAE, 0x39, 0x4C, 0x02, 0xAE, + 0x3A, 0x4C, 0x02, 0xAE, 0x32, 0x4C, 0x02, 0xAE, 0x3D, 0x4C, 0x04, 0xAE, + 0x0B, 0xE4, 0x73, 0x2A, 0x56, 0xE0, 0x24, 0xAE, 0x21, 0xAE, 0x33, 0x1A, + 0x05, 0xA2, 0x49, 0x05, 0x0C, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x56, 0xE0, + 0x1E, 0xE4, 0x4C, 0xCC, 0x4A, 0xCC, 0x00, 0xA2, 0x00, 0xA2, 0xB2, 0x03, + 0x1E, 0xE4, 0xAA, 0x06, 0x1E, 0xE4, 0xE8, 0x10, 0x1E, 0xE4, 0x0C, 0x3C, + 0xDB, 0x0A, 0x1E, 0xE4, 0xDD, 0xF0, 0xC3, 0x0A, 0x8B, 0x0C, 0x1E, 0xE4, + 0xCD, 0x0D, 0x1E, 0xE4, 0x3A, 0xF0, 0x4E, 0x06, 0x1E, 0xE4, 0x6D, 0xF0, + 0x2B, 0x0C, 0x1E, 0xE4, 0x0C, 0x3C, 0x02, 0xA2, 0xBF, 0x04, 0x1E, 0xE4, + 0x1D, 0x13, 0x1E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x2E, 0xE4, 0x6A, 0xE1, + 0x1E, 0xE4, 0xB2, 0x03, 0x1E, 0xE4, 0x0C, 0x3C, 0x1E, 0xE4, 0x90, 0x07, + 0x1E, 0xE4, 0x7B, 0x07, 0x1E, 0xE4, 0x79, 0x16, 0x1E, 0xE4, 0x25, 0x06, + 0x1E, 0xE4, 0xD1, 0x06, 0x1E, 0xE4, 0x1C, 0x16, 0x1E, 0xE4, 0xE8, 0x16, + 0x1E, 0xE4, 0xEC, 0x13, 0x0A, 0xE4, 0x4E, 0x06, 0x1E, 0xE4, 0xF2, 0x10, + 0x0A, 0xE4, 0x17, 0x06, 0x1E, 0xE4, 0xF2, 0x05, 0x0A, 0xE4, 0x5E, 0x0B, + 0x1E, 0xE4, 0xF2, 0x05, 0x16, 0xE0, 0x3B, 0x28, 0xA0, 0xF0, 0xF2, 0x05, + 0x3B, 0x3E, 0x3B, 0x56, 0x32, 0x2A, 0x32, 0x44, 0x1E, 0xE4, 0xF2, 0x05, + 0x0E, 0xE4, 0x58, 0xF7, 0x1E, 0xE4, 0xF2, 0x05, 0x04, 0xE4, 0xF6, 0x01, + 0x2B, 0x0C, 0x1E, 0xE4, 0xDA, 0xF0, 0x34, 0x0C, 0x1A, 0x07, 0x1E, 0xE4, + 0x5B, 0x07, 0x1E, 0xE4, 0xD9, 0x3C, 0x02, 0xA2, 0xA1, 0x3C, 0xFC, 0xA2, + 0xF8, 0x06, 0x1E, 0xE4, 0xF2, 0x05, 0x0E, 0xE4, 0x1A, 0xE4, 0x3B, 0x28, + 0xF2, 0x05, 0x08, 0xE4, 0x3B, 0x28, 0x0C, 0x06, 0x04, 0xE4, 0xE9, 0x07, + 0x63, 0x08, 0x1E, 0xE4, 0x24, 0x08, 0x1A, 0xE4, 0xC0, 0xE0, 0x24, 0x07, + 0x1A, 0xE4, 0x3B, 0x28, 0x04, 0xA1, 0x06, 0xA8, 0x06, 0xAF, 0x45, 0x00, + 0x1D, 0x13, 0x1E, 0xE4, 0xDB, 0x0A, 0x1A, 0xE4, 0x7A, 0xF2, 0x3B, 0x3C, + 0x3B, 0x54, 0x32, 0x28, 0x44, 0x3C, 0x40, 0x28, 0x43, 0x3C, 0x34, 0x28, + 0x06, 0xA8, 0x06, 0xAF, 0x45, 0x00, 0xC0, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, + 0x68, 0xF0, 0x04, 0xA1, 0x1E, 0xE4, 0xFA, 0xF0, 0x00, 0x00, 0x02, 0xE0, + 0xA1, 0x28, 0x73, 0x00, 0xC2, 0xE0, 0x2E, 0x05, 0x45, 0x00, 0xC0, 0xE0, + 0x77, 0x00, 0xC2, 0xE0, 0x1A, 0xE4, 0x04, 0xA1, 0x06, 0xA8, 0x06, 0xAF, + 0x06, 0xAF, 0x45, 0x00, 0xC0, 0xE0, 0xE3, 0x06, 0xF2, 0x10, 0x1A, 0xE4, + 0x04, 0xA1, 0x06, 0xA8, 0x3A, 0x17, 0x1E, 0xE4, 0x8D, 0x05, 0x0E, 0xE4, + 0xF8, 0x06, 0x1E, 0xE4, 0xA3, 0x0A, 0x1E, 0xE4, 0x1E, 0xE4, 0xD9, 0x3C, + 0x02, 0xA2, 0x3A, 0xF0, 0x25, 0x15, 0x1E, 0xE4, 0x00, 0xA2, 0x04, 0x07, + 0xA1, 0x28, 0x7A, 0xF0, 0x09, 0x13, 0x1E, 0xE4, 0x00, 0xA2, 0x5B, 0x07, + 0x1E, 0xE4, 0x52, 0xF0, 0xA2, 0x3C, 0x39, 0x07, 0x1E, 0xE4, 0xB3, 0x3C, + 0x5F, 0x17, 0x1E, 0xE4, 0xB4, 0x3C, 0xA2, 0x28, 0x90, 0x07, 0x1E, 0xE4, + 0x48, 0x04, 0x1E, 0xE4, 0xC0, 0xE0, 0x2E, 0xE4, 0x1D, 0x13, 0x1E, 0xE4, + 0x5A, 0xF0, 0x02, 0xA8, 0x1E, 0xAF, 0x65, 0x00, 0x2E, 0xE4, 0x00, 0xA2, + 0x5B, 0x07, 0x1E, 0xE4, 0xB2, 0x03, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, + 0x5C, 0x3C, 0x46, 0x3C, 0xFE, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x43, 0x3C, + 0x34, 0x3C, 0x0C, 0xA2, 0x86, 0x00, 0x61, 0xE1, 0x8B, 0x3C, 0xA0, 0x3C, + 0x44, 0x3C, 0x3B, 0x3C, 0x11, 0x3D, 0x04, 0xC7, 0xD3, 0x3C, 0xD2, 0x3C, + 0xD1, 0x3C, 0xE4, 0x3C, 0x00, 0xA2, 0xD6, 0x3C, 0xD5, 0x3C, 0xD4, 0x3C, + 0x1E, 0xE4, 0xDA, 0x3C, 0xD9, 0x3C, 0xB9, 0x3C, 0xFC, 0xA2, 0x04, 0x07, + 0x1E, 0xE4, 0xFD, 0x06, 0x72, 0x28, 0xA2, 0x3C, 0xFA, 0xA2, 0xA1, 0x3C, + 0xFE, 0xA2, 0x72, 0x3C, 0x16, 0xB6, 0x73, 0x2A, 0xF0, 0x3C, 0x02, 0xA2, + 0x2E, 0xE4, 0x90, 0x3C, 0x02, 0xE0, 0x9C, 0x06, 0x06, 0xE4, 0x55, 0x28, + 0x04, 0xA2, 0x9C, 0x06, 0x00, 0xE4, 0x78, 0x00, 0x9C, 0x06, 0x06, 0xE4, + 0x56, 0x28, 0xF0, 0x3C, 0x9C, 0x06, 0x00, 0xE4, 0x78, 0x00, 0x02, 0xE0, + 0x90, 0xF3, 0xE0, 0x1F, 0x02, 0xE0, 0x54, 0x28, 0x38, 0xF3, 0x06, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x1E, 0xF3, 0x2A, 0xF0, 0xF9, 0x12, 0x1E, 0xE4, + 0xBA, 0xF0, 0x09, 0x28, 0xB8, 0x3C, 0xB7, 0x28, 0x1E, 0xE4, 0x11, 0x3C, + 0xA6, 0x07, 0x1E, 0xE4, 0x14, 0x2A, 0x11, 0x28, 0x14, 0x3C, 0xA6, 0x07, + 0x11, 0x3C, 0xFA, 0xA2, 0x7E, 0xF0, 0xEA, 0xB7, 0x14, 0x28, 0x14, 0x3C, + 0xA6, 0x07, 0x1E, 0xE4, 0x11, 0x28, 0xA1, 0x3E, 0xE9, 0xB7, 0xA1, 0x2A, + 0x1E, 0xE4, 0x11, 0x28, 0xD1, 0x07, 0x1E, 0xE4, 0xE1, 0x07, 0x1E, 0xE4, + 0x11, 0x28, 0xD9, 0x07, 0x14, 0x28, 0xD1, 0x07, 0x1E, 0xE4, 0x14, 0x28, + 0x1E, 0xE4, 0x14, 0x28, 0xD9, 0x07, 0x1E, 0xE4, 0xA1, 0x28, 0xB7, 0x3C, + 0xB8, 0x28, 0xE1, 0x07, 0x2E, 0xE4, 0x02, 0xA2, 0x3A, 0xF0, 0x02, 0xA0, + 0xD0, 0x02, 0x67, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, 0x03, 0x00, 0x22, 0xD0, + 0x64, 0x00, 0x66, 0xE1, 0x17, 0x35, 0x16, 0x9E, 0xA8, 0x06, 0x84, 0xE1, + 0x26, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, 0x17, 0x3D, 0xFE, 0xA2, 0x02, 0x00, + 0x30, 0xD1, 0x6A, 0xE1, 0x61, 0xE1, 0x28, 0x3C, 0xA7, 0x3C, 0xA6, 0x34, + 0x02, 0xA2, 0x11, 0x3D, 0x03, 0xC7, 0xD8, 0x02, 0x61, 0xE1, 0xAC, 0x3C, + 0xAB, 0x3C, 0xAA, 0x3C, 0x1E, 0xE4, 0x11, 0x3D, 0x03, 0xC7, 0xDC, 0x02, + 0x48, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, 0x48, 0x08, 0x10, 0x03, 0x67, 0xE1, + 0x0C, 0x3E, 0x00, 0xA2, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0xA8, 0x28, + 0x90, 0xE1, 0x17, 0x3D, 0x08, 0xA2, 0xCE, 0x06, 0x4A, 0xCC, 0x44, 0xCC, + 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0x00, 0x30, 0xD1, 0x72, 0xCC, 0x4C, 0xCC, + 0x01, 0x00, 0x4B, 0xD0, 0x02, 0x00, 0x3A, 0xD0, 0x00, 0x00, 0x08, 0xD0, + 0x00, 0x00, 0x4C, 0xD0, 0xC0, 0xE0, 0x2E, 0xE4, 0x7B, 0x02, 0x1E, 0xE4, + 0x2A, 0xE4, 0x00, 0x04, 0x08, 0xE0, 0x5C, 0x00, 0x5D, 0x00, 0xC1, 0xE0, + 0x00, 0x04, 0x04, 0xE0, 0x02, 0xA2, 0x5D, 0x00, 0xC3, 0xE0, 0x55, 0xE0, + 0x08, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0x00, 0xCE, 0x2E, 0xE4, 0xB8, 0xF7, + 0x90, 0xE1, 0x00, 0x04, 0x3B, 0x3E, 0x11, 0xB6, 0x73, 0x28, 0x3B, 0x2A, + 0xC0, 0xE0, 0xD9, 0x12, 0x1E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0xBB, 0x3C, + 0xBA, 0x34, 0x48, 0x00, 0x48, 0x00, 0xC0, 0xE0, 0xD9, 0x12, 0x1E, 0xE4, + 0xBA, 0x24, 0x2E, 0xE4, 0xBD, 0x3C, 0xBC, 0x34, 0xBD, 0x4C, 0xBC, 0x24, + 0x2E, 0xE4, 0xBB, 0x4C, 0x01, 0xC0, 0xD9, 0x12, 0x1E, 0xE4, 0x2E, 0xE4, + 0x1C, 0x3C, 0x1B, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0xAA, 0xCE, 0x00, 0xA2, + 0x2E, 0xE4, 0x00, 0xC0, 0x00, 0xC0, 0x1C, 0x4C, 0x1B, 0x24, 0x01, 0xC0, + 0x2E, 0xE4, 0x2E, 0xE4, 0x48, 0x00, 0xC2, 0xE0, 0xA1, 0x28, 0x42, 0x2A, + 0x88, 0xF0, 0x09, 0x28, 0x16, 0x29, 0x01, 0x03, 0x66, 0xE1, 0xB9, 0xF0, + 0x49, 0xF0, 0xA1, 0x28, 0x42, 0x2A, 0x7E, 0xF0, 0xB6, 0x3C, 0xD0, 0x3E, + 0xA1, 0x2A, 0xD0, 0x28, 0x69, 0x07, 0x1E, 0xE4, 0xD9, 0x07, 0x1E, 0xE4, + 0x02, 0xA1, 0x4A, 0xF0, 0xB3, 0x28, 0x2E, 0xE4, 0x2A, 0xF1, 0xB2, 0x28, + 0x4E, 0xF1, 0xB3, 0x3C, 0x92, 0xE0, 0xE0, 0x02, 0x00, 0xE0, 0xB1, 0x28, + 0x22, 0xA1, 0xB1, 0x3C, 0x02, 0xA0, 0xB1, 0x28, 0x02, 0xA1, 0xB2, 0x28, + 0xB1, 0x3C, 0x28, 0xF0, 0xA8, 0x1A, 0x49, 0xE0, 0x01, 0x29, 0xB2, 0x3C, + 0x49, 0xE0, 0x09, 0x13, 0x1E, 0xE4, 0x25, 0xE4, 0xF2, 0xB7, 0xFA, 0xA2, + 0x42, 0xF0, 0xA1, 0x28, 0x00, 0xA2, 0x2E, 0xE4, 0xFA, 0xA2, 0x2E, 0xE4, + 0xFC, 0xA2, 0x41, 0x3C, 0x02, 0xA2, 0x42, 0x3C, 0x24, 0x08, 0x1E, 0xE4, + 0xA1, 0x3C, 0x14, 0x3C, 0x24, 0xE4, 0xB6, 0x28, 0x24, 0x07, 0x1E, 0xE4, + 0xB0, 0x28, 0x24, 0xE4, 0xB6, 0x28, 0x3E, 0xF7, 0xB6, 0x28, 0x92, 0xE0, + 0xE0, 0x02, 0x00, 0xE0, 0xB0, 0x3C, 0x02, 0xA0, 0xB0, 0x28, 0x01, 0x3D, + 0xB2, 0x28, 0xB0, 0x3C, 0x28, 0xF0, 0x22, 0xA1, 0x00, 0xA2, 0x2E, 0xE4, + 0xB2, 0x3C, 0x02, 0xA0, 0x9C, 0xE0, 0x54, 0x00, 0x04, 0xE0, 0x00, 0x3C, + 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0xA8, 0x28, 0x02, 0xA8, 0x00, 0x5C, + 0x06, 0x9E, 0x8E, 0x07, 0xE1, 0x07, 0x1E, 0xE4, 0x00, 0x28, 0x48, 0xF0, + 0x2E, 0xE4, 0x00, 0x3E, 0x03, 0xA0, 0x00, 0x2A, 0x54, 0x00, 0x04, 0xE0, + 0x10, 0x03, 0x67, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0xA8, 0x28, 0x9C, 0xE0, + 0xA3, 0x07, 0x84, 0xE1, 0x00, 0x3C, 0x00, 0xA2, 0x00, 0x5A, 0x03, 0xA8, + 0x05, 0xAF, 0x17, 0x2B, 0x00, 0x3E, 0x03, 0xA0, 0x00, 0x2A, 0x56, 0xE0, + 0x00, 0x3C, 0xB7, 0x28, 0x2E, 0xE4, 0x06, 0x9F, 0x92, 0xE0, 0x10, 0x03, + 0x00, 0xE0, 0x00, 0x28, 0x02, 0xA0, 0x00, 0x28, 0xDA, 0xF0, 0x01, 0x29, + 0x00, 0xA2, 0x38, 0xF0, 0xA8, 0x18, 0x00, 0x3C, 0x18, 0xF7, 0xB7, 0x18, + 0x00, 0x28, 0x00, 0x3C, 0x01, 0x3D, 0x0E, 0xA2, 0x2E, 0xE4, 0xFE, 0xA2, + 0xA8, 0x18, 0xB7, 0x3C, 0x02, 0xA0, 0x00, 0x28, 0x00, 0x28, 0xB7, 0x3C, + 0x00, 0xA2, 0x38, 0xF0, 0xA8, 0x28, 0x10, 0x03, 0x61, 0xE1, 0x2E, 0xE4, + 0xCF, 0x07, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x90, 0xE1, 0x28, 0xE4, + 0x16, 0xE0, 0x11, 0x29, 0x10, 0x03, 0x00, 0xE0, 0x24, 0xE4, 0x2E, 0xE4, + 0x01, 0x3D, 0x0C, 0xA8, 0x01, 0x29, 0x92, 0xE0, 0x10, 0x03, 0x00, 0xE0, + 0x24, 0xE4, 0x2E, 0xE4, 0x01, 0x3D, 0x0A, 0xA8, 0x01, 0x29, 0x92, 0xE0, + 0x10, 0x03, 0x00, 0xE0, 0x24, 0xE4, 0x2E, 0xE4, 0x01, 0x3D, 0x06, 0xA8, + 0x01, 0x29, 0x92, 0xE0, 0xFA, 0xA2, 0xB4, 0x3C, 0xA2, 0x28, 0x2E, 0xE4, + 0xD8, 0xF0, 0x09, 0x28, 0x14, 0x3C, 0x11, 0x3C, 0xA1, 0x3C, 0xE4, 0xF1, + 0xA6, 0x07, 0x1E, 0xE4, 0x42, 0x2A, 0x11, 0x3C, 0xFA, 0xA2, 0x14, 0x3C, + 0x3E, 0xF1, 0xD1, 0x07, 0x19, 0xE4, 0xA1, 0x28, 0xA6, 0x07, 0x1E, 0xE4, + 0xA8, 0xF0, 0x42, 0x28, 0xD9, 0x07, 0x1E, 0xE4, 0x14, 0x3C, 0x04, 0xF1, + 0x1E, 0xE4, 0xE1, 0x07, 0x1E, 0xE4, 0x14, 0x28, 0x11, 0x3C, 0xA1, 0x3C, + 0x74, 0xF0, 0xA6, 0x07, 0x2E, 0xE4, 0x00, 0xA2, 0xD1, 0x07, 0x1E, 0xE4, + 0x14, 0x28, 0xD1, 0x07, 0x1E, 0xE4, 0x14, 0x28, 0x1E, 0xE4, 0x14, 0x28, + 0xD9, 0x07, 0x1E, 0xE4, 0xD1, 0x07, 0x1E, 0xE4, 0x11, 0x28, 0xE1, 0x07, + 0x11, 0x28, 0xD9, 0x07, 0x1E, 0xE4, 0x11, 0x28, 0x2E, 0xE4, 0xFE, 0xA2, + 0xE1, 0x07, 0x1E, 0xE4, 0x00, 0x03, 0x66, 0xE1, 0x48, 0xF1, 0x42, 0x28, + 0x14, 0x28, 0x12, 0x3C, 0x08, 0xB6, 0x16, 0x29, 0x0E, 0x29, 0x01, 0x03, + 0x66, 0xE1, 0x13, 0x3C, 0x00, 0x03, 0x66, 0xE1, 0xD1, 0x07, 0x1E, 0xE4, + 0x06, 0x3D, 0x14, 0x28, 0x0E, 0x3D, 0x16, 0x29, 0x16, 0x29, 0x00, 0x03, + 0x66, 0xE1, 0x2E, 0xE4, 0x08, 0xB6, 0x16, 0x29, 0x13, 0x3C, 0x08, 0xB6, + 0x66, 0xE1, 0xFA, 0xA2, 0x2E, 0xE4, 0x12, 0x3C, 0x2E, 0xE4, 0x16, 0x3D, + 0x01, 0xC7, 0x00, 0x03, 0xB4, 0x3C, 0x13, 0x3C, 0x12, 0x3C, 0xFA, 0xA2, + 0xB3, 0x3C, 0x02, 0xA2, 0xD0, 0x3C, 0x11, 0x3C, 0xB2, 0x3C, 0xB0, 0x3C, + 0xB1, 0x3C, 0x00, 0xA2, 0x10, 0xC7, 0xE0, 0x02, 0x66, 0xE1, 0xB5, 0x3C, + 0x00, 0xA2, 0x42, 0x08, 0x1E, 0xE4, 0x16, 0x3D, 0x08, 0xA2, 0x10, 0x03, + 0x61, 0xE1, 0xB7, 0x3C, 0x6A, 0xE1, 0x2E, 0xE4, 0x11, 0x3D, 0x1F, 0xC7, + 0x09, 0x2A, 0x14, 0x28, 0x89, 0xF0, 0x3B, 0x2A, 0x1E, 0xE4, 0xFF, 0xA2, + 0xA1, 0x28, 0x2B, 0xF0, 0x1E, 0xE4, 0x79, 0x16, 0x1E, 0xE4, 0x59, 0x17, + 0x7B, 0x02, 0x1A, 0xE4, 0x3B, 0x28, 0x1C, 0x16, 0x82, 0x0A, 0x1E, 0xE4, + 0x05, 0x14, 0x1E, 0xE4, 0x3B, 0x28, 0x64, 0xF1, 0x43, 0x0C, 0x1E, 0xE4, + 0x46, 0x28, 0x5C, 0x3C, 0xFE, 0xA2, 0x3A, 0xF0, 0x89, 0x08, 0x02, 0xE4, + 0x46, 0xE0, 0x5C, 0x2A, 0x0D, 0x09, 0x1E, 0xE4, 0x47, 0x3C, 0x54, 0x2C, + 0x1E, 0xE4, 0x94, 0x13, 0x1E, 0xE4, 0xEE, 0xF0, 0x9A, 0xF6, 0x9E, 0x0A, + 0x1E, 0xE4, 0x9D, 0x08, 0x10, 0xE4, 0x57, 0x1C, 0x47, 0x3C, 0x54, 0x2C, + 0x82, 0xD1, 0x6A, 0xE1, 0x1E, 0xF0, 0x0D, 0x09, 0xE8, 0xF7, 0x11, 0x01, + 0xC0, 0xE0, 0x07, 0x00, 0xDD, 0xF3, 0x3D, 0x0A, 0x1E, 0xE4, 0x2E, 0xE4, + 0x02, 0xA2, 0xAD, 0xF3, 0x4A, 0x0A, 0x1E, 0xE4, 0x10, 0xE4, 0x57, 0x1C, + 0x47, 0x2C, 0x48, 0x3C, 0xDD, 0xF2, 0x59, 0x0A, 0x1E, 0xE4, 0x0D, 0x09, + 0x81, 0x10, 0x18, 0xE4, 0x02, 0xA1, 0x48, 0x28, 0x16, 0x10, 0x1A, 0xE4, + 0x02, 0xA1, 0x48, 0x28, 0x48, 0x3C, 0x02, 0xA1, 0x48, 0x2C, 0x4D, 0xF2, + 0x59, 0x28, 0x8D, 0x3C, 0x58, 0x28, 0x9F, 0x3C, 0x1E, 0xE4, 0x8B, 0x0A, + 0x1E, 0xE4, 0x8C, 0x3C, 0x78, 0x13, 0x1E, 0xE4, 0x28, 0xE4, 0x9E, 0x0A, + 0x25, 0x44, 0x16, 0xE0, 0x58, 0x28, 0x28, 0xE4, 0x58, 0x3C, 0x8D, 0x28, + 0xD3, 0x08, 0x0A, 0xE4, 0xDE, 0x08, 0x1E, 0xE4, 0x59, 0x3C, 0x8C, 0x28, + 0x48, 0x28, 0x2E, 0xE4, 0x8B, 0x0A, 0x1E, 0xE4, 0x2E, 0xF5, 0x2D, 0xF0, + 0x3D, 0x0A, 0x1A, 0xE4, 0x2E, 0xE4, 0x9F, 0x3C, 0x02, 0xA2, 0x6A, 0xE1, + 0xD0, 0x04, 0x61, 0xE1, 0x2E, 0xE4, 0x6A, 0xE1, 0x58, 0x28, 0x11, 0x3D, + 0x8C, 0x3C, 0x59, 0x28, 0x02, 0xAF, 0x39, 0xF0, 0x9F, 0x2A, 0x01, 0x3D, + 0x1E, 0xE4, 0x72, 0x09, 0x1E, 0xE4, 0x01, 0x3D, 0x55, 0x18, 0x02, 0xA0, + 0x58, 0x28, 0xA4, 0x10, 0x59, 0x28, 0xD0, 0x04, 0x61, 0xE1, 0x2A, 0xF1, + 0x58, 0x28, 0xD2, 0x04, 0x61, 0xE1, 0x01, 0x3D, 0x59, 0x28, 0x72, 0x09, + 0x1E, 0xE4, 0x01, 0x3D, 0x1E, 0xE4, 0x8D, 0x3C, 0x58, 0x28, 0x8C, 0x3C, + 0xD0, 0x04, 0x61, 0xE1, 0xAE, 0xF6, 0x8B, 0x0A, 0xD2, 0x04, 0x61, 0xE1, + 0x01, 0x3D, 0x8C, 0x28, 0x72, 0x09, 0x1E, 0xE4, 0x01, 0x3D, 0x8D, 0x28, + 0x59, 0x28, 0xD0, 0x04, 0x61, 0xE1, 0x2E, 0xE4, 0x01, 0x3D, 0x58, 0x28, + 0x11, 0x3D, 0x8C, 0x3C, 0x01, 0x3D, 0x02, 0xAF, 0x39, 0xF0, 0x9F, 0x2A, + 0xA4, 0x10, 0x1E, 0xE4, 0x72, 0x09, 0x1E, 0xE4, 0x61, 0xE1, 0xAA, 0xF0, + 0x8C, 0x18, 0x59, 0x28, 0x11, 0x3D, 0x8C, 0x3C, 0x59, 0x28, 0xD0, 0x04, + 0x72, 0x09, 0x1E, 0xE4, 0x09, 0x3D, 0x58, 0x28, 0xB8, 0xF0, 0x55, 0x18, + 0x02, 0xA0, 0x58, 0x28, 0x01, 0x3D, 0x59, 0x28, 0xD0, 0x04, 0x61, 0xE1, + 0x01, 0x3D, 0x58, 0x28, 0xD2, 0x04, 0x61, 0xE1, 0x8C, 0x3C, 0x59, 0x28, + 0x72, 0x09, 0x1E, 0xE4, 0x8B, 0x0A, 0x1E, 0xE4, 0x8D, 0x3C, 0x58, 0x28, + 0x47, 0x2C, 0x58, 0xF0, 0x9E, 0x0A, 0x1E, 0xE4, 0x61, 0xE1, 0x8E, 0xF5, + 0x2A, 0xF0, 0x57, 0x1C, 0x61, 0xE1, 0x01, 0x3D, 0x8C, 0x28, 0xD0, 0x04, + 0x1E, 0xE4, 0x01, 0x3D, 0x8D, 0x28, 0xD2, 0x04, 0x05, 0xE0, 0x06, 0xAE, + 0x2E, 0xE4, 0x72, 0x09, 0xC1, 0xE0, 0x42, 0xE0, 0x11, 0xAE, 0x20, 0x01, + 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x46, 0x00, 0x12, 0xD1, 0xD0, 0x04, + 0x11, 0xD1, 0x20, 0xCE, 0x4E, 0x09, 0x1E, 0xE4, 0x2E, 0xE4, 0x04, 0x00, + 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x90, 0x3C, 0x11, 0x29, + 0xD0, 0x04, 0x61, 0xE1, 0x05, 0xA1, 0x49, 0xE0, 0x11, 0x29, 0x91, 0x3C, + 0x01, 0x29, 0x8E, 0x3C, 0x4A, 0xE0, 0x25, 0xF0, 0x8C, 0x28, 0x01, 0xA2, + 0x2E, 0xE4, 0x8F, 0x3C, 0x7A, 0x09, 0x84, 0xE1, 0x04, 0x00, 0x22, 0xD0, + 0x8B, 0x3E, 0x03, 0xA0, 0x26, 0xF0, 0x20, 0xA1, 0x18, 0xE0, 0x90, 0xC7, + 0x8B, 0x84, 0x8C, 0x2A, 0x50, 0x58, 0x02, 0xA2, 0x50, 0x3E, 0x45, 0xE0, + 0x93, 0xE0, 0x8B, 0x0A, 0x86, 0x00, 0x05, 0xE0, 0x1E, 0xE4, 0x8C, 0x28, + 0x01, 0x3D, 0x01, 0x4D, 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x4E, 0x09, + 0x1F, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, 0xF8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, + 0xC0, 0xE0, 0xE8, 0xF7, 0x1C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, + 0x08, 0xB6, 0x14, 0x28, 0x92, 0xF0, 0x12, 0x28, 0x33, 0xF0, 0x14, 0x1A, + 0x03, 0xA1, 0xA8, 0x2A, 0x14, 0x28, 0x95, 0x3C, 0x02, 0xA1, 0xA8, 0x28, + 0x14, 0x1A, 0x03, 0xA1, 0xA8, 0x2A, 0x08, 0xB6, 0x9C, 0x3C, 0x02, 0xA1, + 0xA8, 0x28, 0x33, 0xF0, 0xC9, 0x09, 0x1E, 0xE4, 0x92, 0x3C, 0x00, 0xA2, + 0x92, 0x3C, 0x04, 0xA2, 0x06, 0x0A, 0x1E, 0xE4, 0x06, 0x0A, 0x1E, 0xE4, + 0xC9, 0x09, 0x1E, 0xE4, 0x06, 0xA2, 0x78, 0xF0, 0x37, 0x03, 0x1E, 0xE4, + 0x1E, 0xE4, 0xC9, 0x09, 0x1E, 0xE4, 0x92, 0x3C, 0xE8, 0xF7, 0x00, 0x08, + 0xC0, 0xE0, 0x06, 0x0A, 0x9A, 0x3C, 0x93, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x90, 0x28, 0x9B, 0x3C, 0x94, 0x3C, 0x92, 0x28, 0x96, 0x3C, 0x32, 0x58, + 0x08, 0xAE, 0x49, 0xE0, 0x8E, 0x28, 0x10, 0xF0, 0x12, 0x28, 0x9D, 0x3C, + 0x91, 0x28, 0x9E, 0x3C, 0x97, 0x3C, 0x08, 0xAE, 0x32, 0x58, 0x08, 0xAE, + 0x90, 0x18, 0x02, 0xA0, 0x02, 0xAF, 0x2B, 0xF0, 0x01, 0xA1, 0x92, 0x2A, + 0x8E, 0x18, 0x02, 0xA0, 0x8F, 0x28, 0x98, 0x3C, 0x00, 0xA1, 0x92, 0x28, + 0x99, 0x3C, 0x08, 0xAE, 0x48, 0xF0, 0x37, 0x03, 0x1E, 0xE4, 0x7A, 0xF0, + 0x92, 0x28, 0x99, 0x3C, 0x02, 0xAF, 0x99, 0x28, 0x02, 0xAF, 0x96, 0x28, + 0x0A, 0xF1, 0x00, 0xA1, 0x78, 0xF0, 0x37, 0x03, 0x1E, 0xE4, 0x96, 0x3C, + 0x9E, 0x28, 0x97, 0x3C, 0x02, 0xAF, 0x97, 0x28, 0x02, 0xAF, 0x9D, 0x28, + 0x9E, 0x3C, 0x02, 0xAF, 0x00, 0x08, 0xC0, 0xE0, 0x2E, 0xE4, 0x9D, 0x3C, + 0x02, 0x08, 0xC2, 0xE0, 0x02, 0xA2, 0xE8, 0xF7, 0xC2, 0xE0, 0x20, 0xAE, + 0x37, 0x03, 0x1E, 0xE4, 0x05, 0xE0, 0x20, 0xAE, 0x20, 0xA2, 0x04, 0x08, + 0x05, 0x08, 0xC2, 0xE0, 0x56, 0xE0, 0x10, 0x10, 0x02, 0xA2, 0x06, 0x08, + 0xC2, 0xE0, 0x00, 0xA2, 0x94, 0x4C, 0x04, 0xAE, 0x93, 0x4C, 0x04, 0xAE, + 0x07, 0x08, 0xC2, 0xE0, 0x95, 0x4C, 0x10, 0xAE, 0x08, 0x08, 0xC2, 0xE0, + 0x97, 0x4C, 0x96, 0x20, 0x09, 0x08, 0xC2, 0xE0, 0x99, 0x4C, 0x98, 0x20, + 0x04, 0xAE, 0x9A, 0x4C, 0x04, 0xAE, 0x02, 0xA2, 0xC2, 0xE0, 0x9C, 0x4C, + 0x10, 0xAE, 0x9B, 0x4C, 0xC2, 0xE0, 0x9E, 0x4C, 0x9D, 0x20, 0x0A, 0x08, + 0x00, 0x08, 0xC2, 0xE0, 0x02, 0xA2, 0x0B, 0x08, 0x2D, 0xE4, 0x00, 0xB8, + 0x01, 0xA2, 0x2E, 0xE4, 0x02, 0xA1, 0xCA, 0xF7, 0x7E, 0xA1, 0x8A, 0xF0, + 0x2E, 0xE4, 0x48, 0x3E, 0x41, 0xE0, 0x7E, 0xA8, 0x46, 0x82, 0x55, 0x84, + 0x5E, 0xF7, 0x43, 0xA0, 0x42, 0xE0, 0x03, 0xA1, 0x48, 0x2E, 0x18, 0xE0, + 0x42, 0xF0, 0x54, 0x1C, 0x47, 0x2C, 0x47, 0x3C, 0x6B, 0xE1, 0x22, 0xE4, + 0x57, 0x1C, 0x47, 0x2C, 0x48, 0x2C, 0x4A, 0xF0, 0x40, 0x28, 0x2E, 0xE4, + 0x6B, 0xE1, 0x2E, 0xE4, 0x28, 0xF0, 0x02, 0xA1, 0x14, 0x28, 0x64, 0x3C, + 0x48, 0xBA, 0x2E, 0xE4, 0xA1, 0x28, 0x3A, 0xF0, 0x09, 0x28, 0x01, 0x3C, + 0x53, 0x17, 0x1E, 0xE4, 0x01, 0x28, 0x01, 0x3C, 0x1E, 0xE4, 0x64, 0x2A, + 0x01, 0x28, 0x52, 0xF0, 0x04, 0xAE, 0x65, 0x4C, 0x02, 0xAE, 0x59, 0x17, + 0x22, 0xCF, 0x56, 0xE0, 0x07, 0xA8, 0x23, 0xCB, 0x40, 0xBA, 0x4E, 0xBA, + 0x6A, 0xF0, 0x40, 0xBA, 0x82, 0xD1, 0xDE, 0xF7, 0x4E, 0xBA, 0x3A, 0xF0, + 0x57, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x07, 0x00, 0x62, 0xCF, 0x64, 0xCF, + 0x59, 0x3C, 0x58, 0x3C, 0x57, 0x2C, 0x2E, 0xE4, 0x01, 0x00, 0xB3, 0xD1, + 0x58, 0x2C, 0x64, 0xCF, 0x57, 0x3C, 0x02, 0xA0, 0x78, 0xF0, 0x55, 0x1C, + 0x58, 0x3C, 0x02, 0xA0, 0x59, 0x2C, 0x58, 0x3C, 0x04, 0x00, 0xB3, 0xD1, + 0x59, 0x4C, 0x58, 0x24, 0x59, 0x3C, 0x02, 0xA0, 0x45, 0x1C, 0x59, 0x2C, + 0x2E, 0xE4, 0x62, 0xCF, 0x00, 0xA2, 0x2E, 0xE4, 0x16, 0xE0, 0x1A, 0xE0, + 0x84, 0xE1, 0x0F, 0x00, 0x22, 0xD0, 0x8C, 0x3C, 0x8B, 0x0A, 0x86, 0x00, + 0x05, 0xE0, 0xBD, 0x0A, 0x03, 0xA2, 0x50, 0x3C, 0x8C, 0x28, 0x95, 0xE0, + 0x8B, 0x84, 0x9B, 0xF0, 0x02, 0x47, 0x50, 0x5A, 0x1E, 0xE4, 0x8C, 0x08, + 0x18, 0xE0, 0x90, 0xC7, 0x8C, 0x28, 0x92, 0x09, 0x1E, 0xE4, 0x5E, 0x09, + 0x02, 0xA1, 0x8B, 0x28, 0x8C, 0x3C, 0x02, 0xA0, 0x3E, 0xA2, 0x2E, 0xE4, + 0x22, 0xF6, 0x8B, 0x3C, 0x28, 0xF1, 0xF9, 0x12, 0x1E, 0xE4, 0xF0, 0x3C, + 0xB9, 0x10, 0x1E, 0xE4, 0x29, 0x13, 0x1E, 0xE4, 0x1E, 0xE4, 0x4A, 0xF0, + 0xB3, 0x00, 0x02, 0xE0, 0x5D, 0x11, 0x1E, 0xE4, 0x4E, 0xF7, 0x25, 0x11, + 0x2A, 0xF0, 0xE3, 0x0C, 0x1E, 0xE4, 0x1A, 0xF7, 0x1E, 0xE4, 0x2E, 0xE4, + 0x6B, 0xE1, 0x2E, 0xE4, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, 0x29, 0x13, + 0xB9, 0x10, 0x1E, 0xE4, 0x8A, 0xF2, 0xB3, 0x00, 0x1E, 0xE4, 0xBA, 0xF2, + 0xB8, 0x00, 0x02, 0xE0, 0xEA, 0xF2, 0xB2, 0x00, 0x02, 0xE0, 0xB9, 0x10, + 0xB5, 0x00, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, 0xB9, 0x10, 0x1E, 0xE4, + 0x48, 0x0B, 0x0A, 0xE4, 0x1E, 0xE4, 0x1A, 0xF1, 0x00, 0x00, 0x02, 0xE0, + 0x4A, 0xF0, 0xB7, 0x00, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, 0xDE, 0xF5, + 0x25, 0x11, 0x1E, 0xE4, 0x07, 0x0B, 0x0E, 0xE4, 0x3A, 0xF0, 0xF9, 0x12, + 0x0E, 0xE4, 0x5E, 0xF5, 0x5D, 0x11, 0x1E, 0xE4, 0x0A, 0xE4, 0x5D, 0x11, + 0x1E, 0xE4, 0x51, 0x0B, 0x0E, 0xE4, 0xE3, 0x0C, 0x1E, 0xE4, 0xDB, 0x0A, + 0x8A, 0xF4, 0x5D, 0x11, 0x1E, 0xE4, 0xDB, 0x0A, 0x59, 0x0D, 0x1E, 0xE4, + 0x3B, 0x3C, 0x00, 0xA2, 0x0A, 0xE4, 0x5D, 0x11, 0x1E, 0xE4, 0x3E, 0xF4, + 0x0B, 0x3C, 0x0A, 0x34, 0x3E, 0xBA, 0xDB, 0x0A, 0x68, 0xF0, 0x0A, 0x18, + 0x54, 0x44, 0x04, 0xE0, 0x28, 0xF0, 0x0B, 0x18, 0x31, 0x47, 0x04, 0xE0, + 0x0A, 0x18, 0x41, 0x47, 0x04, 0xE0, 0x4E, 0xF1, 0x0B, 0x18, 0x34, 0x39, + 0x04, 0xE0, 0xB8, 0xF0, 0x0C, 0xA1, 0x0E, 0xBA, 0x7E, 0xBA, 0x78, 0xF0, + 0xD8, 0x28, 0xD6, 0x3C, 0x02, 0xA2, 0xEA, 0xF0, 0xDB, 0x0A, 0x0E, 0xE4, + 0x20, 0x0F, 0x18, 0xE4, 0x54, 0x0B, 0x1E, 0xE4, 0xFF, 0x0F, 0x1E, 0xE4, + 0xCE, 0x0F, 0x1E, 0xE4, 0xDB, 0x0A, 0x0E, 0xE4, 0xDB, 0x0A, 0x0E, 0xE4, + 0x54, 0x0B, 0x1E, 0xE4, 0xDB, 0x0A, 0x0A, 0xE4, 0x5D, 0x11, 0x1E, 0xE4, + 0x0E, 0xE4, 0x6A, 0xE1, 0xE4, 0x0D, 0x1E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, + 0x6A, 0xE1, 0xDB, 0x0A, 0x28, 0xE1, 0x68, 0xCC, 0x66, 0xCC, 0x00, 0xA2, + 0x18, 0xE4, 0xD8, 0x28, 0xD6, 0x3C, 0x00, 0xA2, 0x4F, 0x3C, 0x04, 0xA2, + 0x2E, 0xE4, 0x20, 0x0F, 0x29, 0x13, 0x1E, 0xE4, 0x5F, 0x3C, 0x00, 0xA2, + 0xF9, 0x12, 0x1E, 0xE4, 0x11, 0x07, 0x1E, 0xE4, 0x29, 0x13, 0x1E, 0xE4, + 0xA6, 0x0B, 0x08, 0xE4, 0xB3, 0x00, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, + 0xB9, 0x10, 0x1E, 0xE4, 0xBE, 0x0B, 0x0A, 0xE4, 0xCD, 0x0B, 0x0A, 0xE4, + 0xB8, 0x00, 0x02, 0xE0, 0xB2, 0x00, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, + 0xB9, 0x10, 0x1E, 0xE4, 0xD5, 0x0B, 0x0A, 0xE4, 0x06, 0x0C, 0x0A, 0xE4, + 0xB5, 0x00, 0x02, 0xE0, 0x00, 0x00, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, + 0xB9, 0x10, 0x1E, 0xE4, 0xA8, 0x0B, 0x0A, 0xE4, 0x9B, 0x0B, 0x04, 0xE4, + 0x01, 0x00, 0x02, 0xE0, 0xAF, 0x00, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, + 0xB9, 0x10, 0x1E, 0xE4, 0x11, 0x0C, 0x04, 0xE4, 0x1E, 0xE4, 0x5A, 0xF0, + 0xB7, 0x00, 0x02, 0xE0, 0x1E, 0xE4, 0x66, 0x0B, 0x0E, 0xE4, 0x25, 0x11, + 0x1E, 0xE4, 0xA6, 0x0B, 0x08, 0xE4, 0xF9, 0x12, 0x21, 0x0C, 0x0E, 0xE4, + 0x1E, 0xF4, 0x5D, 0x11, 0x5D, 0x11, 0x1E, 0xE4, 0x0C, 0x10, 0x1E, 0xE4, + 0x64, 0x0D, 0x1E, 0xE4, 0x66, 0x0B, 0x0A, 0xE4, 0x1D, 0xE4, 0x5F, 0x3C, + 0x1A, 0xB6, 0x02, 0xA2, 0x20, 0x13, 0x18, 0xE4, 0x73, 0x28, 0x13, 0x10, + 0x6A, 0xE1, 0x1F, 0x0C, 0x08, 0xE4, 0x73, 0x28, 0x4A, 0xF0, 0x3B, 0x28, + 0x66, 0x0B, 0x0E, 0xE4, 0x1E, 0xE4, 0x1F, 0x0C, 0x0E, 0xE4, 0x73, 0x3C, + 0x0A, 0xE4, 0x5D, 0x11, 0x1E, 0xE4, 0x11, 0x07, 0x0E, 0xE4, 0xE3, 0x0C, + 0x1E, 0xE4, 0x66, 0x0B, 0x0A, 0xE4, 0x5D, 0x11, 0x1E, 0xE4, 0x66, 0x0B, + 0x0E, 0xE4, 0x59, 0x0D, 0x1E, 0xE4, 0x66, 0x0B, 0x0A, 0xE4, 0x5D, 0x11, + 0x1E, 0xE4, 0x66, 0x0B, 0x0B, 0x3C, 0x0A, 0x34, 0x3E, 0xBA, 0x66, 0x0B, + 0x78, 0xF0, 0x0A, 0x18, 0x54, 0x44, 0x04, 0xE0, 0x38, 0xF0, 0x0B, 0x18, + 0x31, 0x47, 0x04, 0xE0, 0x41, 0x47, 0x04, 0xE0, 0xFA, 0x0B, 0x0E, 0xE4, + 0x34, 0x39, 0x04, 0xE0, 0xC8, 0xF0, 0x0A, 0x18, 0x0E, 0xBA, 0x7E, 0xBA, + 0x88, 0xF0, 0x0B, 0x18, 0x02, 0xA2, 0x00, 0x0C, 0x0A, 0xE4, 0x0C, 0xA1, + 0x20, 0x0F, 0x18, 0xE4, 0xD8, 0x28, 0xD6, 0x3C, 0xFF, 0x0F, 0x1E, 0xE4, + 0x66, 0x0B, 0x0E, 0xE4, 0x66, 0x0B, 0x0E, 0xE4, 0x54, 0x0B, 0x1E, 0xE4, + 0x54, 0x0B, 0x1E, 0xE4, 0xCE, 0x0F, 0x1E, 0xE4, 0x5D, 0x11, 0x1E, 0xE4, + 0x66, 0x0B, 0x0E, 0xE4, 0xE4, 0x0D, 0x1E, 0xE4, 0x66, 0x0B, 0x0A, 0xE4, + 0x04, 0xA2, 0x66, 0x0B, 0x0E, 0xE4, 0x6A, 0xE1, 0x18, 0x0C, 0x08, 0xE4, + 0x5F, 0x28, 0x2E, 0xE4, 0x66, 0x0B, 0x0E, 0xE4, 0x5D, 0x11, 0x1E, 0xE4, + 0x8B, 0x0C, 0x1E, 0xE4, 0xCD, 0x0D, 0x1E, 0xE4, 0x02, 0xA2, 0x78, 0xF0, + 0xC2, 0x0C, 0x1E, 0xE4, 0x00, 0xA2, 0x8B, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, + 0xFD, 0xA2, 0xDB, 0x0A, 0x1E, 0xE4, 0x2E, 0xE4, 0x65, 0xE1, 0x2E, 0xE4, + 0xFE, 0xA2, 0xA1, 0x3E, 0x56, 0x28, 0x15, 0x3D, 0x55, 0x28, 0x50, 0x03, + 0x2E, 0xE4, 0x15, 0x3D, 0x26, 0x28, 0x15, 0x3D, 0x15, 0x19, 0x55, 0x28, + 0x50, 0x03, 0x65, 0xE1, 0x58, 0xF0, 0x15, 0x19, 0x56, 0x28, 0x88, 0xF0, + 0x2E, 0xE4, 0x28, 0xF0, 0x15, 0x19, 0x26, 0x28, 0x1E, 0xE4, 0x2E, 0xE4, + 0xDA, 0x3C, 0x02, 0xA2, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, 0x29, 0x13, + 0x1E, 0xE4, 0x79, 0x0C, 0x0A, 0xE4, 0xB3, 0x00, 0x0A, 0xE4, 0xB8, 0x00, + 0x02, 0xE0, 0xB9, 0x10, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, 0x79, 0x0C, + 0x1E, 0xE4, 0x79, 0x0C, 0x0A, 0xE4, 0xB2, 0x00, 0x0A, 0xE4, 0xB5, 0x00, + 0x02, 0xE0, 0xB9, 0x10, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, 0x79, 0x0C, + 0x1E, 0xE4, 0x79, 0x0C, 0x0A, 0xE4, 0x00, 0x00, 0x04, 0xE4, 0x01, 0x00, + 0x02, 0xE0, 0xB9, 0x10, 0x02, 0xE0, 0xB9, 0x10, 0x1E, 0xE4, 0x79, 0x0C, + 0x1E, 0xE4, 0x7B, 0x0C, 0x04, 0xE4, 0xAF, 0x00, 0x08, 0xE4, 0xB7, 0x00, + 0x02, 0xE0, 0xB9, 0x10, 0x0A, 0xE4, 0xF9, 0x12, 0x1E, 0xE4, 0x79, 0x0C, + 0x46, 0x28, 0x89, 0x0C, 0x0E, 0xE4, 0x89, 0x0C, 0x0A, 0xE4, 0x5D, 0x11, + 0x1E, 0xE4, 0x5C, 0x3C, 0x02, 0xA1, 0xB9, 0x10, 0x1E, 0xE4, 0x43, 0x0C, + 0x00, 0xA2, 0x61, 0x0A, 0x1E, 0xE4, 0x46, 0x3C, 0x66, 0xE1, 0x2E, 0xE4, + 0xFE, 0xA2, 0x2E, 0xE4, 0xFE, 0xA2, 0xDE, 0x02, 0x67, 0xE1, 0xDC, 0x02, + 0x0F, 0x3D, 0x17, 0x35, 0x0E, 0x3D, 0x16, 0x35, 0x04, 0xA1, 0x31, 0xA2, + 0x24, 0xE4, 0x28, 0x28, 0xBA, 0xF0, 0x35, 0xB4, 0x02, 0xA1, 0xE6, 0xF0, + 0x02, 0xA1, 0x86, 0xF0, 0xCD, 0xB4, 0x04, 0xA1, 0x2E, 0xE4, 0x26, 0xF0, + 0x04, 0xA1, 0x5A, 0xF0, 0x50, 0x84, 0x50, 0x3E, 0x35, 0xA0, 0x15, 0xA0, + 0x50, 0x84, 0x50, 0x3C, 0x18, 0xE0, 0x29, 0x82, 0x17, 0x35, 0x18, 0xE0, + 0xE8, 0x03, 0x82, 0xE1, 0x28, 0x28, 0xE9, 0x03, 0x05, 0xE0, 0x17, 0x3D, + 0x4A, 0xF0, 0x06, 0xA1, 0x6A, 0xF0, 0x02, 0xA1, 0x50, 0x3E, 0x03, 0xA1, + 0x2A, 0xF0, 0x06, 0xA1, 0x16, 0x35, 0x18, 0xE0, 0x2A, 0x82, 0x50, 0x84, + 0x9A, 0xF0, 0xA5, 0x28, 0x2E, 0xE4, 0x16, 0x3D, 0x0A, 0xE4, 0x40, 0x4C, + 0x3B, 0x44, 0x44, 0x28, 0x3E, 0xF1, 0xDF, 0x0C, 0x0E, 0xE4, 0xCB, 0x0C, + 0x02, 0xA1, 0xDF, 0x0C, 0x0A, 0xE4, 0xA3, 0x28, 0x02, 0xA1, 0x9A, 0xF0, + 0x02, 0xA1, 0x5A, 0xF0, 0x40, 0x4C, 0x3B, 0x44, 0x44, 0x28, 0xAA, 0xF0, + 0x42, 0x28, 0x4E, 0xF0, 0xDF, 0x0C, 0x08, 0xE4, 0x00, 0xA2, 0x3E, 0xF0, + 0xDF, 0x0C, 0x0A, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, + 0x5B, 0x3C, 0xE3, 0x3C, 0x27, 0x3C, 0x25, 0x3C, 0x06, 0xC7, 0x60, 0x03, + 0x61, 0xE1, 0x00, 0xA2, 0x2A, 0x3C, 0x29, 0x3C, 0x02, 0xA2, 0x11, 0x3D, + 0x0E, 0x3C, 0x5D, 0x28, 0x0D, 0x3C, 0x25, 0x28, 0x56, 0xBA, 0x5D, 0x2A, + 0x0F, 0x3C, 0x5E, 0x28, 0x02, 0xE0, 0x5D, 0x3C, 0x46, 0x0D, 0x0A, 0xE4, + 0x0E, 0xE4, 0x5D, 0x3E, 0x56, 0xF0, 0x80, 0x07, 0x52, 0x3C, 0x5D, 0x28, + 0x90, 0xE1, 0x46, 0x0D, 0x5E, 0x2A, 0x55, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x02, 0xE0, 0x5E, 0x3C, 0xDA, 0xF3, 0x56, 0xBA, 0x7E, 0xF3, 0x5E, 0x3E, + 0x36, 0xF0, 0x80, 0x04, 0x08, 0xAF, 0x1E, 0xA0, 0x53, 0x3C, 0x5E, 0x28, + 0x56, 0x82, 0x55, 0x84, 0x45, 0x3C, 0x56, 0x3C, 0xAA, 0x3C, 0x02, 0xA2, + 0x54, 0x3C, 0x18, 0xE0, 0x7A, 0xF2, 0x46, 0xBA, 0xF0, 0x3C, 0x06, 0xA2, + 0xF0, 0x3C, 0x08, 0xA2, 0xAC, 0x3C, 0xAB, 0x34, 0x0A, 0xA2, 0x28, 0x3C, + 0x1A, 0xF2, 0x46, 0xBA, 0xBA, 0xF1, 0x40, 0xBA, 0x62, 0xBA, 0xF0, 0x3C, + 0xD9, 0x0E, 0x1E, 0xE4, 0x40, 0xBA, 0x52, 0xBA, 0x1E, 0xE4, 0x29, 0x13, + 0x1E, 0xE4, 0x68, 0xF1, 0x08, 0xE4, 0xB5, 0x00, 0x02, 0xE0, 0xB9, 0x10, + 0x6A, 0xF7, 0x5D, 0x11, 0x1E, 0xE4, 0x44, 0x0D, 0x46, 0x0D, 0x08, 0xE4, + 0x02, 0xA1, 0x46, 0xBA, 0x12, 0x0E, 0x1E, 0xE4, 0x25, 0x3C, 0x02, 0xA2, + 0x25, 0x3C, 0x0D, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x08, 0xAF, 0x1E, 0xA0, + 0x5D, 0x3C, 0x0E, 0x28, 0x1E, 0xA0, 0x5E, 0x3C, 0x0F, 0x28, 0x55, 0x3C, + 0x55, 0x84, 0x45, 0x3C, 0x56, 0x3C, 0x08, 0xAF, 0x00, 0xA2, 0x54, 0x3C, + 0x18, 0xE0, 0x56, 0x82, 0x40, 0xBA, 0xE3, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, + 0x4A, 0xBA, 0x40, 0xBA, 0x4A, 0xBA, 0x48, 0xBA, 0x2E, 0xE4, 0x40, 0xBA, + 0x40, 0xBA, 0x4A, 0xBA, 0x49, 0xF0, 0x07, 0xA1, 0x59, 0x00, 0xC1, 0xE0, + 0x04, 0xA2, 0x4F, 0x3C, 0x02, 0xA8, 0x4F, 0x28, 0x00, 0xA2, 0xA8, 0xF0, + 0x3B, 0x28, 0xE3, 0x3C, 0x0A, 0xE4, 0x0E, 0xA8, 0x18, 0xBA, 0x73, 0x3C, + 0x8E, 0xF0, 0x72, 0x3C, 0x52, 0xBA, 0xC8, 0x0D, 0x73, 0x3C, 0x4A, 0xF0, + 0x72, 0x18, 0x12, 0xBA, 0x44, 0xBA, 0x52, 0xBA, 0xC8, 0x0D, 0x0E, 0xE4, + 0x2F, 0x3E, 0x34, 0x2A, 0xC8, 0x0D, 0x0A, 0xE4, 0x09, 0xE4, 0x05, 0xAF, + 0x49, 0xE0, 0x02, 0xA1, 0x34, 0x58, 0x02, 0xA2, 0x34, 0x3C, 0xC8, 0x0D, + 0x02, 0xAF, 0x41, 0x30, 0x02, 0xAF, 0x40, 0x30, 0x49, 0x28, 0x49, 0x30, + 0x02, 0xAF, 0x42, 0x30, 0x25, 0x28, 0x5F, 0xBA, 0x38, 0xF3, 0x25, 0x44, + 0x46, 0xBA, 0x98, 0xF2, 0x40, 0x28, 0x8A, 0xF0, 0x4E, 0xF2, 0x46, 0xBA, + 0x68, 0xF2, 0x41, 0x28, 0x00, 0x04, 0x62, 0xE1, 0x49, 0x4C, 0x40, 0x28, + 0x40, 0xBA, 0xD8, 0xF1, 0x04, 0x04, 0x63, 0xE1, 0x44, 0xBA, 0xE8, 0xF1, + 0x25, 0x44, 0x7D, 0x3C, 0x02, 0x3D, 0x12, 0x3D, 0x02, 0xA1, 0xCA, 0xF1, + 0x13, 0x3F, 0x13, 0x3F, 0x12, 0x5B, 0x21, 0xA2, 0x7E, 0x3C, 0x40, 0xBA, + 0xE8, 0xF0, 0x41, 0x28, 0xDA, 0xF0, 0x44, 0xBA, 0xF8, 0xF0, 0x25, 0x44, + 0x21, 0xA2, 0x02, 0x3D, 0x12, 0x3D, 0x02, 0xA1, 0x40, 0xBA, 0x03, 0x3F, + 0x13, 0x3F, 0x02, 0x5B, 0x2E, 0xE4, 0xDE, 0xF7, 0x4E, 0xBA, 0x3A, 0xF0, + 0x6B, 0xE1, 0x4F, 0x3C, 0x02, 0xA9, 0x4F, 0x28, 0x00, 0xA2, 0x28, 0xE4, + 0x25, 0x28, 0x2E, 0xE4, 0x33, 0x3C, 0x37, 0x3C, 0x35, 0x3C, 0x36, 0x3C, + 0x02, 0xA2, 0x30, 0x3C, 0x38, 0x3C, 0x3A, 0x3C, 0x26, 0x3C, 0x3E, 0x3C, + 0x31, 0x3C, 0x3C, 0x3C, 0x1E, 0xA0, 0x53, 0x28, 0x3D, 0x3C, 0x06, 0xA2, + 0x2E, 0xE4, 0x45, 0x3C, 0x56, 0x3C, 0x08, 0xAF, 0x02, 0xA1, 0xCA, 0xF0, + 0x02, 0xA1, 0x46, 0xBA, 0x02, 0xA1, 0x0A, 0xF1, 0x02, 0xA1, 0xCA, 0xF0, + 0x02, 0xA1, 0x8A, 0xF1, 0x06, 0xA1, 0x4A, 0xF1, 0x2E, 0xE4, 0x6B, 0xE1, + 0x2E, 0xE4, 0xCA, 0xF1, 0x43, 0x0E, 0x1E, 0xE4, 0x25, 0x3C, 0x02, 0xA2, + 0x25, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x6A, 0xE1, 0x2E, 0xE4, 0x6A, 0xE1, + 0x54, 0x0E, 0x1E, 0xE4, 0xC7, 0x0E, 0x1E, 0xE4, 0x25, 0x3C, 0x02, 0xA2, + 0x25, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x6A, 0xE1, 0x2E, 0xE4, 0x6A, 0xE1, + 0xAE, 0x0E, 0x1E, 0xE4, 0x67, 0x0E, 0x1E, 0xE4, 0x25, 0x3C, 0x02, 0xA2, + 0x2C, 0x3C, 0x46, 0xBA, 0x2E, 0xE4, 0x6A, 0xE1, 0x26, 0x3C, 0x40, 0xBA, + 0x2D, 0x3C, 0x46, 0xBA, 0x09, 0xAF, 0x1F, 0xA0, 0x4A, 0xF0, 0x53, 0x2A, + 0x03, 0xAE, 0x0B, 0xAF, 0x3F, 0xA0, 0x4E, 0xF0, 0x42, 0xBA, 0xF0, 0x3C, + 0x10, 0xA2, 0x56, 0x3E, 0xF0, 0x3C, 0x12, 0xA2, 0xC8, 0xF1, 0x02, 0xA1, + 0xF0, 0x3C, 0x14, 0xA2, 0x88, 0xF1, 0x42, 0xBA, 0xF0, 0x3C, 0x16, 0xA2, + 0x48, 0xF1, 0x42, 0xBA, 0x40, 0xBA, 0xF0, 0x3C, 0x18, 0xA2, 0x56, 0xBA, + 0x4E, 0xBA, 0xF0, 0x3C, 0x1A, 0xA2, 0xDA, 0xF0, 0x02, 0xA0, 0x42, 0xBA, + 0x80, 0x3C, 0x40, 0xBA, 0x2A, 0x3C, 0x02, 0xA0, 0x48, 0xBA, 0x29, 0x3C, + 0x44, 0xBA, 0x2E, 0xE4, 0x6B, 0xE1, 0x2E, 0xE4, 0x4E, 0xBA, 0x4E, 0xBA, + 0x4A, 0xF0, 0x40, 0xBA, 0x0A, 0xA2, 0x81, 0x3C, 0x5A, 0xBA, 0x4E, 0xBA, + 0x5A, 0xBA, 0x4A, 0xF0, 0x40, 0xBA, 0xF0, 0x3C, 0x2E, 0xE4, 0x6B, 0xE1, + 0x2E, 0xE4, 0x82, 0x3C, 0x00, 0xA2, 0xF8, 0xF0, 0xD9, 0x0E, 0x1E, 0xE4, + 0x84, 0xE1, 0x01, 0x00, 0x22, 0xD0, 0x50, 0x3C, 0x3F, 0xC7, 0x3B, 0xF0, + 0x41, 0xBA, 0x62, 0x0E, 0x29, 0xF0, 0x50, 0x3E, 0x50, 0x4E, 0x4E, 0xBA, + 0x62, 0xE1, 0x2E, 0xE4, 0x6B, 0xE1, 0x2E, 0xE4, 0x1C, 0xA2, 0x04, 0x04, + 0x63, 0xE1, 0x00, 0x04, 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0xF0, 0x3C, + 0x02, 0x3D, 0x02, 0xA1, 0x46, 0xBA, 0x76, 0x0E, 0x43, 0xBA, 0x13, 0x3F, + 0x12, 0x5B, 0x21, 0xA2, 0x43, 0xBA, 0xF0, 0x3C, 0x1E, 0xA2, 0x30, 0x3E, + 0x33, 0x32, 0x03, 0xA1, 0xFB, 0xF2, 0x3D, 0x3E, 0x32, 0x3E, 0x17, 0xE0, + 0x31, 0x3E, 0x03, 0xAF, 0x58, 0xF2, 0x31, 0x28, 0x3A, 0xF0, 0x3B, 0x28, + 0x18, 0xE0, 0x56, 0x82, 0x55, 0x84, 0x31, 0x2A, 0x56, 0x28, 0x54, 0x3C, + 0x02, 0xAF, 0x29, 0xF0, 0x40, 0xBA, 0x45, 0x3C, 0x02, 0xAF, 0x29, 0xF0, + 0x40, 0xBA, 0x3C, 0x3C, 0x40, 0xBA, 0x39, 0x3C, 0x40, 0xBA, 0x36, 0x3C, + 0x40, 0xBA, 0x38, 0x3C, 0x40, 0xBA, 0x35, 0x3C, 0x40, 0xBA, 0x37, 0x3C, + 0x3E, 0x3C, 0x40, 0xBA, 0x40, 0xBA, 0x3A, 0x3C, 0x40, 0xBA, 0x2A, 0xE4, + 0x40, 0xBA, 0x03, 0xA2, 0x2E, 0xE4, 0x5E, 0xBA, 0xD7, 0x3C, 0x44, 0xBA, + 0x60, 0x03, 0x61, 0xE1, 0x2E, 0xE4, 0x6B, 0xE1, 0x3A, 0x08, 0x4B, 0xF0, + 0x26, 0x2A, 0x02, 0xA2, 0x3A, 0x08, 0x31, 0x08, 0x3E, 0xF0, 0x39, 0x08, + 0x44, 0xCC, 0x02, 0xA1, 0x02, 0xAE, 0x11, 0x3D, 0x11, 0x3D, 0x5E, 0xBA, + 0xC1, 0x0E, 0x84, 0xE1, 0x0A, 0xA2, 0x2E, 0xE4, 0x2A, 0xF0, 0x40, 0xBA, + 0x40, 0xBA, 0x2E, 0xE4, 0x6B, 0xE1, 0xF0, 0x3C, 0x40, 0xBA, 0x4C, 0xBA, + 0x40, 0xBA, 0x4E, 0xBA, 0x6A, 0xF0, 0x40, 0xBA, 0x66, 0xBA, 0x9A, 0xF0, + 0x6A, 0xBA, 0x3A, 0xF0, 0x40, 0xBA, 0x6A, 0xBA, 0x6B, 0xE1, 0xF0, 0x3C, + 0x0A, 0xA2, 0x2E, 0xE4, 0xC3, 0xE0, 0x1B, 0xF2, 0x41, 0xBA, 0x2E, 0xE4, + 0x61, 0xE1, 0x7C, 0x3C, 0x00, 0xA2, 0x3C, 0x01, 0x3E, 0x01, 0xC2, 0xE0, + 0x7C, 0x28, 0x20, 0x04, 0xF0, 0x3C, 0x0C, 0xA2, 0x7C, 0x3C, 0x02, 0xA0, + 0x3F, 0x01, 0xC2, 0xE0, 0x11, 0x3D, 0x4E, 0xBA, 0xF9, 0x0E, 0x84, 0xE1, + 0x3E, 0x00, 0x22, 0xD0, 0x02, 0xA0, 0x3E, 0x01, 0xC2, 0xE0, 0x7C, 0x28, + 0x11, 0x3D, 0x8A, 0xF2, 0x4E, 0xBA, 0x7C, 0x3C, 0x40, 0xBA, 0x90, 0xE1, + 0x3F, 0x01, 0xC2, 0xE0, 0x02, 0xAE, 0x3C, 0x01, 0xC2, 0xE0, 0xAA, 0xF1, + 0x7C, 0x3C, 0x40, 0x00, 0x04, 0xE0, 0x55, 0xE0, 0xF0, 0x3C, 0x0E, 0xA2, + 0x60, 0x04, 0x62, 0xE1, 0x14, 0x0F, 0x84, 0xE1, 0x3F, 0x00, 0x22, 0xD0, + 0x02, 0xA0, 0x3E, 0x01, 0xC2, 0xE0, 0x7C, 0x28, 0xC2, 0xE0, 0x12, 0x3D, + 0x4E, 0xBA, 0x7C, 0x3C, 0x27, 0x3E, 0x27, 0x4E, 0x90, 0xE1, 0x3F, 0x01, + 0xC2, 0xE0, 0x00, 0xA2, 0x3D, 0x01, 0xC3, 0xE0, 0x2E, 0xE4, 0x02, 0xA2, + 0x2E, 0xE4, 0x3C, 0x01, 0x15, 0xB6, 0x20, 0xA1, 0xE4, 0x28, 0xD8, 0x2A, + 0xE2, 0x3C, 0x00, 0xA2, 0x2B, 0xE4, 0xD8, 0x3E, 0x9A, 0xF0, 0xD6, 0x28, + 0xC8, 0x04, 0x62, 0xE1, 0x04, 0xE0, 0x12, 0x3D, 0x41, 0x47, 0x04, 0xE0, + 0xE2, 0x3C, 0x08, 0xA2, 0x12, 0x3D, 0x34, 0x39, 0x4E, 0xBA, 0x68, 0xF1, + 0x7D, 0x0F, 0x1E, 0xE4, 0x10, 0xAE, 0x49, 0xF0, 0x03, 0xA8, 0xE2, 0x2A, + 0x12, 0x3D, 0xE1, 0x4C, 0x3E, 0xF0, 0xE1, 0x3C, 0x0F, 0xA8, 0xE2, 0x3E, + 0x03, 0xA0, 0xE2, 0x2A, 0xAA, 0xF0, 0xD8, 0x28, 0xAD, 0x0F, 0x1B, 0xE4, + 0x9E, 0xF6, 0x28, 0xF0, 0x7D, 0x0F, 0x1E, 0xE4, 0xE1, 0x28, 0x3A, 0xF0, + 0x02, 0xA8, 0xE2, 0x28, 0x0E, 0xA8, 0xE2, 0x28, 0x11, 0xA2, 0x12, 0x3D, + 0x6B, 0xF0, 0x03, 0xAF, 0x45, 0xE0, 0xBA, 0xF0, 0x50, 0x86, 0x01, 0xA2, + 0x50, 0x3E, 0x03, 0xA1, 0x01, 0xA2, 0xAD, 0x0F, 0x1E, 0xE4, 0x12, 0x3F, + 0x12, 0x3D, 0xE3, 0x28, 0xC8, 0x04, 0x62, 0xE1, 0x00, 0xA2, 0x12, 0x3F, + 0x12, 0x3D, 0xE2, 0x28, 0xE4, 0x28, 0x6B, 0x00, 0xC1, 0xE0, 0x12, 0x3D, + 0x06, 0xAF, 0x41, 0xE0, 0x06, 0xAE, 0x02, 0xA0, 0x21, 0xCE, 0xF8, 0xF7, + 0x28, 0xCA, 0xE4, 0x3C, 0x04, 0x00, 0x12, 0xD1, 0xC8, 0x04, 0x11, 0xD1, + 0xF8, 0xF7, 0x28, 0xCA, 0x00, 0x00, 0x13, 0xD1, 0x28, 0xF0, 0x32, 0x28, + 0x01, 0xC0, 0x2E, 0xE4, 0x06, 0xAE, 0x31, 0x4C, 0x30, 0x24, 0x7E, 0xF0, + 0x00, 0xA2, 0x46, 0xF0, 0x46, 0xE0, 0x73, 0xC8, 0x00, 0xC0, 0x02, 0xA2, + 0x2E, 0xE4, 0x00, 0xC0, 0xC0, 0xE0, 0xE7, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x12, 0xAF, 0x65, 0x00, 0xC1, 0xE0, 0x5C, 0x00, 0x16, 0xE0, 0x03, 0xA8, + 0x15, 0xAF, 0x02, 0xA8, 0xD8, 0x3C, 0x00, 0xA2, 0x4A, 0xF0, 0x56, 0xE0, + 0xC0, 0xE0, 0x5A, 0xF0, 0xE8, 0x28, 0x2E, 0xE4, 0xC0, 0xE0, 0xBE, 0xF7, + 0x2A, 0xE4, 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x02, 0x0A, 0xE0, 0x5D, 0x00, + 0xE8, 0x3C, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, 0xC0, 0xE0, 0xF9, 0xF7, + 0x29, 0xCA, 0x1E, 0xF7, 0xE7, 0x0C, 0x88, 0x00, 0x00, 0xE0, 0x6B, 0x00, + 0x11, 0xD1, 0x04, 0x00, 0x12, 0xD1, 0x20, 0xCE, 0xE1, 0xE1, 0x00, 0x00, + 0x13, 0xD1, 0xC8, 0x04, 0xE7, 0x2E, 0xE5, 0x2C, 0xC8, 0x04, 0x62, 0xE1, + 0xE7, 0x3E, 0xE5, 0x3C, 0x11, 0xA0, 0x10, 0xA0, 0x88, 0x00, 0x02, 0xE0, + 0x6C, 0x00, 0xC0, 0xE0, 0x00, 0xA2, 0x8D, 0x0F, 0x16, 0xE4, 0x46, 0xE0, + 0x40, 0xBA, 0x4E, 0xBA, 0x2E, 0xE4, 0xE8, 0x3C, 0x02, 0xAE, 0x56, 0xE0, + 0x41, 0xBA, 0x02, 0xAE, 0x41, 0xBA, 0x02, 0xAE, 0x56, 0xE0, 0x41, 0xBA, + 0xD1, 0x28, 0x46, 0xBA, 0xD1, 0x3C, 0x56, 0xE0, 0x06, 0xA1, 0x42, 0xBA, + 0x6A, 0xF0, 0x10, 0xA8, 0xD1, 0x28, 0xD2, 0x3C, 0x5A, 0xBA, 0xD8, 0xF1, + 0x06, 0xA1, 0x42, 0xBA, 0x6A, 0xF0, 0x08, 0xA8, 0xD1, 0x28, 0xD3, 0x3C, + 0x5A, 0xBA, 0x58, 0xF1, 0x06, 0xA1, 0x42, 0xBA, 0x6A, 0xF0, 0x04, 0xA8, + 0xD1, 0x28, 0xD4, 0x3C, 0x5A, 0xBA, 0xD8, 0xF0, 0x06, 0xA1, 0x42, 0xBA, + 0x6A, 0xF0, 0x02, 0xA8, 0x03, 0xA2, 0xD5, 0x3C, 0x5A, 0xBA, 0x58, 0xF0, + 0x7E, 0xBA, 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, 0x4A, 0xBA, 0x41, 0xBA, + 0x98, 0xF0, 0x40, 0xBA, 0x5B, 0x3C, 0x46, 0xBA, 0x46, 0xBA, 0x4B, 0xF0, + 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, 0x03, 0xA2, 0xFD, 0x06, 0x1E, 0xE4, + 0x28, 0xE4, 0xB9, 0x28, 0x00, 0xA2, 0x2E, 0xE4, 0xB9, 0x3C, 0x02, 0xA2, + 0x02, 0x00, 0x80, 0xD1, 0x2E, 0xE4, 0xB9, 0x3C, 0x03, 0xCB, 0x00, 0xCB, + 0xE5, 0x13, 0x1E, 0xE4, 0x0C, 0xCB, 0xC8, 0xF7, 0x7D, 0x10, 0x09, 0xE4, + 0x02, 0xAF, 0x61, 0x30, 0x02, 0xAF, 0x60, 0x30, 0x02, 0xAF, 0x70, 0x30, + 0x02, 0xAF, 0x6F, 0x30, 0x02, 0xAF, 0x65, 0x30, 0x02, 0xAF, 0x6A, 0x30, + 0x00, 0xA2, 0x64, 0x3C, 0x16, 0xCB, 0x3A, 0xF0, 0x41, 0x46, 0x17, 0xE0, + 0x60, 0x4E, 0x70, 0x2A, 0x22, 0xCB, 0x24, 0xCF, 0x6E, 0x3C, 0x32, 0xB6, + 0x02, 0xAE, 0x6F, 0x4C, 0x02, 0xA8, 0x08, 0xAF, 0x36, 0xB6, 0x55, 0xE0, + 0x60, 0x2A, 0x70, 0x4C, 0x6F, 0x4C, 0x70, 0x4C, 0x6A, 0x28, 0x71, 0x3C, + 0x20, 0xCB, 0x01, 0x00, 0x90, 0xD1, 0x8A, 0xF0, 0xC8, 0xF7, 0x7D, 0x10, + 0x09, 0xE4, 0x03, 0xCB, 0x61, 0x2A, 0x60, 0x18, 0x00, 0xA2, 0x6A, 0x74, + 0x08, 0xCF, 0xBD, 0xF2, 0x08, 0xB8, 0x3B, 0xF0, 0x60, 0x2A, 0x00, 0xA2, + 0x26, 0x01, 0xC2, 0xE0, 0x52, 0xB6, 0x6A, 0x4E, 0x6E, 0x4E, 0x17, 0xE0, + 0x00, 0xCB, 0x01, 0x00, 0x80, 0xD1, 0x20, 0xCF, 0x20, 0xCB, 0xD8, 0xF7, + 0xC9, 0xF1, 0x03, 0xCB, 0x49, 0x74, 0xD8, 0xF7, 0x89, 0xF1, 0x03, 0xCB, + 0x00, 0xA2, 0x3D, 0xF1, 0xBD, 0x10, 0x1E, 0xE4, 0x00, 0xA2, 0x04, 0xCF, + 0x36, 0xB6, 0x60, 0x2A, 0xD2, 0xB6, 0x60, 0x46, 0x17, 0xE0, 0x6A, 0x2A, + 0x52, 0xB6, 0x6E, 0x2A, 0x00, 0xA2, 0x04, 0xCF, 0x5D, 0x15, 0x1E, 0xE4, + 0x00, 0xA2, 0x04, 0xCF, 0x02, 0xCF, 0x00, 0xA2, 0x6B, 0xE1, 0x2E, 0xE4, + 0x02, 0x00, 0x92, 0xD1, 0x50, 0x3C, 0x2E, 0xE4, 0x04, 0xAF, 0x0C, 0xCB, + 0x01, 0x00, 0x82, 0xD1, 0x0C, 0xCF, 0x10, 0xA2, 0x38, 0xF0, 0x06, 0xA8, + 0x52, 0xB6, 0x41, 0x2A, 0x60, 0x3C, 0x00, 0xA2, 0x20, 0xCB, 0x02, 0x00, + 0x90, 0xD1, 0x04, 0xCF, 0x6F, 0x28, 0xD8, 0xF7, 0xB9, 0xF0, 0x03, 0xCB, + 0x71, 0x3C, 0x34, 0xB6, 0x70, 0x4C, 0x02, 0xAE, 0x2E, 0xE4, 0x5D, 0x15, + 0x1E, 0xE4, 0x50, 0x28, 0x2E, 0xE4, 0x02, 0xCF, 0x00, 0xA2, 0x6B, 0xE1, + 0x5D, 0x15, 0x14, 0xE4, 0xA7, 0x4C, 0xA6, 0x20, 0x81, 0x10, 0x12, 0xE4, + 0xA7, 0x4C, 0xA6, 0x20, 0x2E, 0xE4, 0xA0, 0x3C, 0x02, 0xA0, 0xA0, 0x2C, + 0x01, 0xC0, 0x9E, 0xF0, 0x13, 0x3C, 0x01, 0xC0, 0x14, 0x3C, 0x01, 0xC0, + 0x6E, 0xF0, 0x13, 0x28, 0x00, 0xC0, 0x14, 0x28, 0x01, 0xC0, 0x3E, 0xF0, + 0x31, 0x4C, 0x30, 0x24, 0x01, 0xC0, 0x2E, 0xE4, 0x46, 0xE0, 0x73, 0xC8, + 0x06, 0xAE, 0x00, 0xC0, 0x01, 0xC0, 0x2E, 0xE4, 0x6B, 0xE1, 0x22, 0xE4, + 0x33, 0x28, 0x01, 0xC0, 0x9E, 0xF0, 0x33, 0x3C, 0x3E, 0xF0, 0x11, 0x3C, + 0x01, 0xC0, 0x6E, 0xF0, 0x2E, 0xE4, 0x00, 0xC0, 0x11, 0x28, 0x01, 0xC0, + 0x00, 0x00, 0x44, 0xD1, 0x40, 0x00, 0x48, 0xD1, 0x00, 0x00, 0x68, 0xD1, + 0x00, 0x00, 0x45, 0xD1, 0x00, 0x02, 0x4B, 0xD1, 0x00, 0x00, 0x6B, 0xD1, + 0x4C, 0xD1, 0xC0, 0xCE, 0x18, 0xAE, 0x32, 0xA2, 0x2E, 0xE4, 0xF8, 0xF7, + 0x9A, 0xCA, 0x0C, 0x00, 0x06, 0x04, 0x01, 0x4C, 0x00, 0x24, 0x01, 0xC0, + 0x71, 0xD0, 0x09, 0x3C, 0x08, 0x34, 0x07, 0x0C, 0x0C, 0x28, 0x01, 0xC0, + 0x81, 0xE1, 0x2A, 0x20, 0x45, 0xE0, 0x10, 0x13, 0x1E, 0xE4, 0xAA, 0xF0, + 0x02, 0xA8, 0x04, 0xAF, 0x45, 0x00, 0xC0, 0xE0, 0x48, 0x00, 0xC0, 0xE0, + 0x0C, 0x30, 0x12, 0xB6, 0x03, 0x3C, 0x00, 0xFE, 0x08, 0xE0, 0x02, 0x34, + 0xFF, 0x01, 0x08, 0xE0, 0x48, 0x00, 0xC0, 0xE0, 0x22, 0xD0, 0x78, 0xCC, + 0x00, 0xA2, 0x0B, 0x3C, 0x7A, 0xCC, 0x10, 0x11, 0x84, 0xE1, 0xFF, 0x00, + 0x1E, 0xE4, 0xA8, 0x11, 0x1E, 0xE4, 0x90, 0xE1, 0x01, 0xC0, 0xD4, 0x10, + 0x1E, 0xE4, 0xC7, 0x11, 0x02, 0xA1, 0x0B, 0x28, 0x1A, 0x3C, 0x00, 0xA2, + 0x02, 0xA2, 0x01, 0xC0, 0x2D, 0x11, 0x12, 0xE4, 0x00, 0xC0, 0xAA, 0xCE, + 0x00, 0xA2, 0x1A, 0x3C, 0x9A, 0xCA, 0x90, 0xE1, 0xA0, 0xCA, 0x2E, 0xE4, + 0xC7, 0x11, 0x18, 0xE4, 0x9C, 0xCA, 0xF8, 0xF7, 0x36, 0x11, 0x84, 0xE1, + 0x44, 0xCC, 0x2E, 0xE4, 0xA0, 0xCA, 0xC7, 0x11, 0x18, 0xE4, 0x9C, 0xCA, + 0x2E, 0xE4, 0x90, 0xE1, 0xF9, 0xF7, 0x9B, 0xCA, 0x04, 0xE0, 0xB0, 0xCE, + 0x00, 0x01, 0x04, 0xE0, 0x5D, 0xD1, 0xB8, 0xCE, 0x14, 0xE0, 0xFF, 0x00, + 0x5F, 0xD1, 0x00, 0x00, 0x5E, 0xD1, 0x00, 0x00, 0x0A, 0xE0, 0x18, 0xAE, + 0x32, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x57, 0xD1, 0xC0, 0xCE, 0x20, 0x06, + 0x03, 0x00, 0x4C, 0xD1, 0x00, 0x00, 0x4A, 0xD1, 0x9A, 0xCA, 0xC7, 0x11, + 0x18, 0xE4, 0x9C, 0xCA, 0x3A, 0xF7, 0x02, 0xA8, 0xAE, 0xCA, 0xC8, 0xF7, + 0x00, 0xA2, 0xC7, 0x11, 0x18, 0xE4, 0x9C, 0xCA, 0x2D, 0x11, 0x1E, 0xE4, + 0x06, 0xA2, 0x2E, 0xE4, 0x30, 0x20, 0x01, 0xC0, 0x6A, 0x11, 0x1E, 0xE4, + 0x2E, 0xE4, 0x1A, 0xE0, 0x00, 0xC0, 0x31, 0x4C, 0x00, 0xA2, 0x01, 0xC0, + 0x2E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x33, 0x3C, 0x31, 0x3C, 0x30, 0x3C, + 0xA8, 0x11, 0x1E, 0xE4, 0x01, 0xC0, 0x78, 0x11, 0x2E, 0xE4, 0x00, 0xC0, + 0x28, 0xE1, 0x01, 0xC0, 0x00, 0xC0, 0x11, 0x44, 0x33, 0x28, 0x01, 0xC0, + 0x00, 0x00, 0x4A, 0xD1, 0x92, 0xCE, 0x0E, 0xAE, 0xFF, 0x00, 0x04, 0xE0, + 0x00, 0x01, 0x58, 0xD1, 0x00, 0x00, 0x5D, 0xD1, 0xB8, 0xCE, 0x14, 0xE0, + 0x00, 0x00, 0x5F, 0xD1, 0x00, 0x00, 0x5E, 0xD1, 0x18, 0xAE, 0x32, 0xA2, + 0x03, 0x00, 0x61, 0xD1, 0x4C, 0xD1, 0xC0, 0xCE, 0x20, 0x06, 0x0A, 0xE0, + 0xC7, 0x11, 0x18, 0xE4, 0x9C, 0xCA, 0x03, 0x00, 0xA8, 0xF7, 0x9C, 0xCA, + 0xC8, 0xF7, 0x9A, 0xCA, 0x92, 0xCC, 0x32, 0x3C, 0x01, 0xC0, 0x9E, 0xCA, + 0x30, 0x34, 0x31, 0x0C, 0x30, 0x00, 0x94, 0xCA, 0x2E, 0xE4, 0x00, 0xC0, + 0x90, 0xCC, 0x31, 0x3C, 0x9E, 0xCC, 0x20, 0xAE, 0x95, 0x14, 0x04, 0xE0, + 0x00, 0x00, 0x34, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x00, 0x00, 0x35, 0xD0, + 0x00, 0x00, 0x33, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0x7F, 0x00, 0x36, 0xD0, + 0x00, 0x00, 0x39, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, 0x4C, 0xD0, + 0x01, 0x00, 0x4B, 0xD0, 0x00, 0x00, 0x47, 0xD0, 0x00, 0x00, 0x46, 0xD0, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0x00, 0x49, 0xD1, 0x63, 0x02, 0x1E, 0xE4, + 0x3A, 0xF2, 0x0C, 0x28, 0x50, 0xCE, 0x40, 0x04, 0x04, 0xE0, 0x01, 0xC0, + 0x12, 0xE0, 0x08, 0xA1, 0x06, 0xA8, 0x0D, 0x28, 0x04, 0xE0, 0x40, 0x3C, + 0x06, 0xAE, 0x06, 0xA8, 0x50, 0xCA, 0x52, 0xCE, 0x40, 0x58, 0xB7, 0x01, + 0x6A, 0x02, 0x1E, 0xE4, 0xE8, 0xF7, 0x04, 0xA8, 0x44, 0xD1, 0x00, 0x00, + 0x4E, 0xD1, 0x01, 0xC0, 0x00, 0xE0, 0x03, 0x4C, 0x02, 0x24, 0x00, 0x00, + 0x5E, 0xF3, 0x03, 0x3C, 0x02, 0x34, 0x00, 0x02, 0x1A, 0xE4, 0x0C, 0x28, + 0x00, 0x00, 0x27, 0xD0, 0x01, 0x00, 0x27, 0xD0, 0x01, 0xC0, 0x2E, 0x12, + 0x02, 0xA8, 0x48, 0xCA, 0x1A, 0xF2, 0x0D, 0x28, 0x40, 0xCE, 0x03, 0x4C, + 0x02, 0x24, 0xE8, 0xF7, 0x40, 0x00, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, + 0x02, 0xAE, 0x06, 0xA8, 0x43, 0x00, 0xC0, 0xE0, 0x02, 0xA8, 0x48, 0xCA, + 0x46, 0xCE, 0x32, 0xA0, 0x02, 0x04, 0x00, 0x02, 0x04, 0xE0, 0xE8, 0xF7, + 0x08, 0x14, 0x03, 0x3C, 0x02, 0x34, 0x03, 0x0C, 0x01, 0x4C, 0x00, 0x24, + 0x54, 0xF0, 0x09, 0x1C, 0x18, 0xE4, 0x0C, 0x28, 0x03, 0x3C, 0x02, 0x34, + 0x01, 0xC0, 0xD9, 0x12, 0x1E, 0xE4, 0x81, 0x12, 0x00, 0x00, 0x44, 0xD1, + 0x00, 0x00, 0x4E, 0xD1, 0x59, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0x00, 0xE0, 0x36, 0xB6, 0x00, 0xA2, 0x03, 0xA1, 0x52, 0xE0, 0x45, 0x00, + 0xC1, 0xE0, 0x1C, 0x00, 0x00, 0xA2, 0x01, 0xC0, 0x2E, 0xE4, 0x1A, 0xE0, + 0x0D, 0x3C, 0x00, 0x02, 0x04, 0xE0, 0x0A, 0x3C, 0xD8, 0xF3, 0x08, 0xA8, + 0x43, 0x00, 0xC0, 0xE0, 0x0C, 0x3C, 0x01, 0xC0, 0x22, 0x12, 0x1E, 0xE4, + 0x49, 0x00, 0xC1, 0xE0, 0x03, 0x4C, 0x02, 0x24, 0x05, 0x4E, 0x04, 0x26, + 0x05, 0x3E, 0x04, 0x36, 0x07, 0x0E, 0x06, 0x06, 0x33, 0xF0, 0x45, 0xE0, + 0x02, 0xB6, 0x0C, 0x28, 0x00, 0x02, 0x03, 0xE0, 0x00, 0x02, 0x01, 0xE0, + 0x73, 0xF2, 0x0C, 0x3C, 0x5D, 0x00, 0xC1, 0xE0, 0x0C, 0x28, 0x0D, 0x3E, + 0xD8, 0xF1, 0x52, 0xE0, 0x17, 0xE0, 0x1B, 0xE0, 0x1E, 0xE4, 0x38, 0x12, + 0x08, 0xE4, 0x0A, 0x28, 0x5C, 0x00, 0xC0, 0xE0, 0x01, 0xC0, 0xCA, 0x01, + 0x38, 0x12, 0x0A, 0xE4, 0x00, 0x40, 0x08, 0xE0, 0x00, 0x20, 0x08, 0xE0, + 0x5D, 0x00, 0xC0, 0xE0, 0x0A, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0xC8, 0xF7, + 0x02, 0xA2, 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x40, 0x38, 0x12, 0x0E, 0xE4, + 0x0A, 0x3C, 0x00, 0xCE, 0x04, 0xE0, 0x39, 0xF0, 0x0C, 0x2A, 0x0D, 0x28, + 0xC1, 0xE0, 0x00, 0xC0, 0x0D, 0x3C, 0x00, 0x02, 0xC9, 0xF7, 0x00, 0x40, + 0x09, 0xE0, 0x5D, 0x00, 0x63, 0x02, 0x1E, 0xE4, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0x02, 0x02, 0xE0, 0x0D, 0x28, 0x01, 0xC0, 0x06, 0xA8, 0x0D, 0x28, + 0xCD, 0x12, 0x0A, 0xE4, 0x06, 0xAE, 0x12, 0xE0, 0x08, 0xA1, 0x6A, 0xF2, + 0x20, 0xAE, 0x04, 0xAF, 0x0D, 0x28, 0x40, 0x3C, 0x90, 0xE1, 0x50, 0xCE, + 0xC0, 0x01, 0x00, 0xE0, 0xE8, 0xF7, 0x04, 0xA8, 0x50, 0xCA, 0x52, 0xCA, + 0x0D, 0x2A, 0x40, 0x58, 0x40, 0x5C, 0x52, 0xCA, 0x05, 0xE0, 0x40, 0x3E, + 0x07, 0xAE, 0x07, 0xA8, 0x0D, 0x2A, 0x56, 0xE0, 0x40, 0x5E, 0xB7, 0x01, + 0x40, 0x01, 0x01, 0xE0, 0x21, 0xAE, 0x05, 0xAF, 0x50, 0xCA, 0x52, 0xCE, + 0x90, 0xE1, 0x51, 0xCE, 0xFC, 0x01, 0x04, 0xE0, 0xE8, 0xF7, 0x04, 0xA8, + 0x01, 0xC0, 0x7E, 0xF1, 0x22, 0xF0, 0x0D, 0x18, 0x20, 0xAE, 0x04, 0xAF, + 0x06, 0xA0, 0x0D, 0x28, 0x0D, 0x28, 0x50, 0xCE, 0x40, 0x04, 0x00, 0xE0, + 0x06, 0xA8, 0x12, 0xE0, 0x08, 0xA1, 0x06, 0xA8, 0xB7, 0x01, 0x04, 0xE0, + 0x40, 0x3C, 0x06, 0xAE, 0x04, 0xA8, 0x50, 0xCA, 0x52, 0xCE, 0x40, 0x58, + 0x6A, 0x02, 0x0E, 0xE4, 0x00, 0xC0, 0xE8, 0xF7, 0xC0, 0xE0, 0x01, 0xC0, + 0xD9, 0x12, 0x1E, 0xE4, 0x00, 0xC0, 0x18, 0x3C, 0x17, 0x34, 0x48, 0x00, + 0x1A, 0x2A, 0xAA, 0xCA, 0x01, 0xC0, 0x2E, 0xE4, 0xAA, 0xCE, 0x00, 0xA2, + 0x4E, 0xF8, 0x16, 0xB6, 0xC0, 0xE0, 0x40, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, + 0x0E, 0x24, 0x0F, 0x3C, 0x0E, 0x34, 0x48, 0x00, 0x00, 0x16, 0x49, 0xE0, + 0x40, 0x08, 0x0F, 0x4C, 0x07, 0x0C, 0x06, 0x04, 0x33, 0xF0, 0x01, 0x1E, + 0x35, 0xF0, 0x09, 0x1E, 0x08, 0x16, 0x49, 0xE0, 0x48, 0x00, 0xC2, 0xE0, + 0x07, 0x1C, 0x06, 0x14, 0xCA, 0xF0, 0x0C, 0x28, 0x01, 0xC0, 0xFE, 0xF0, + 0x1E, 0xE4, 0x01, 0xC0, 0xD9, 0x12, 0x1E, 0xE4, 0x26, 0xB6, 0x00, 0xA2, + 0x45, 0xE0, 0x10, 0x13, 0x00, 0xC0, 0x06, 0xB6, 0x00, 0x02, 0x03, 0xE0, + 0xC0, 0xE0, 0x2A, 0xE4, 0x0E, 0xFF, 0x2E, 0xE4, 0x2E, 0xE4, 0x02, 0xA8, + 0x04, 0xAF, 0x45, 0x00, 0x0F, 0x3C, 0x0E, 0x34, 0x49, 0x00, 0xC0, 0xE0, + 0x48, 0x00, 0xC1, 0xE0, 0x0F, 0x4C, 0x0E, 0x24, 0x0F, 0x4E, 0x0E, 0x26, + 0x0F, 0x3E, 0x0E, 0x36, 0x2E, 0xE4, 0xD9, 0x12, 0x1E, 0xE4, 0x2E, 0xE4, + 0x17, 0x24, 0x01, 0xC0, 0xAA, 0xCE, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, + 0x00, 0xC0, 0x18, 0x4C, 0x1E, 0xE4, 0x38, 0x11, 0x1E, 0xE4, 0x2E, 0xE4, + 0xD0, 0x12, 0x1E, 0xE4, 0x28, 0xF1, 0xF9, 0x12, 0xA8, 0xF0, 0xFF, 0x00, + 0x08, 0xE0, 0xA2, 0xCA, 0x02, 0xA1, 0x20, 0xAF, 0x4E, 0x13, 0x1E, 0xE4, + 0x2D, 0x11, 0x1E, 0xE4, 0x04, 0xA2, 0x58, 0xF0, 0x04, 0xE0, 0x3E, 0xF0, + 0xA2, 0xCA, 0xDE, 0xF6, 0x1E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0xB7, 0x01, + 0x08, 0xE0, 0xB3, 0x10, 0x1E, 0xE4, 0xB0, 0x10, 0x1E, 0xE4, 0xB6, 0x10, + 0x1E, 0xE4, 0xFF, 0x00, 0x90, 0x01, 0x62, 0xE1, 0x2E, 0xE4, 0xB9, 0x10, + 0x82, 0xCA, 0x12, 0x3D, 0x12, 0x35, 0x80, 0xCA, 0x12, 0x35, 0x84, 0xCA, + 0x12, 0x3D, 0x12, 0x35, 0x12, 0x3D, 0x12, 0x35, 0x86, 0xCA, 0x12, 0x3D, + 0x03, 0xA0, 0x8B, 0xCA, 0x08, 0xA2, 0x8B, 0xCA, 0x92, 0x01, 0x00, 0xE0, + 0x46, 0xE0, 0x03, 0xAF, 0x48, 0xF0, 0x02, 0xA8, 0x8A, 0xCA, 0x94, 0xE0, + 0x12, 0x2D, 0x2E, 0xE4, 0x12, 0x4D, 0x12, 0x25, 0x12, 0x4D, 0x20, 0xAE, + 0xFF, 0x00, 0x08, 0xE0, 0x31, 0xAF, 0x12, 0x4F, 0x12, 0x27, 0x10, 0xAE, + 0x2E, 0xE4, 0x56, 0xE0, 0xFF, 0x00, 0x09, 0xE0, 0x2C, 0xBA, 0x68, 0xF0, + 0x32, 0x28, 0x01, 0xC0, 0xFE, 0xF0, 0x32, 0x3C, 0x02, 0xA2, 0x58, 0xF1, + 0x73, 0xC8, 0x06, 0xAE, 0x31, 0x4C, 0x30, 0x24, 0x00, 0xB6, 0x2E, 0xA1, + 0x96, 0xF0, 0x46, 0xE0, 0x03, 0xA2, 0x32, 0x78, 0x32, 0x3C, 0x2E, 0xA0, + 0x00, 0xC0, 0x02, 0xA2, 0x48, 0xF0, 0x32, 0x3E, 0x2E, 0xE4, 0x00, 0xC0, + 0x00, 0xA2, 0x2E, 0xE4, 0x32, 0x28, 0x10, 0x3C, 0x00, 0xA2, 0x01, 0xC0, + 0x10, 0x3C, 0x33, 0x3C, 0x02, 0xA2, 0x98, 0xF0, 0x37, 0xD0, 0xFF, 0x00, + 0x36, 0xD0, 0x11, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x80, 0x00, + 0x32, 0x28, 0xE8, 0xF7, 0x0C, 0xA8, 0x20, 0xCB, 0x1E, 0xE4, 0x78, 0xF0, + 0x33, 0x28, 0xB8, 0xF1, 0x00, 0x00, 0x4C, 0xD0, 0x01, 0xC0, 0x78, 0x11, + 0x1E, 0xE4, 0x5A, 0xF0, 0x96, 0xC8, 0x3E, 0xF1, 0x1E, 0xE4, 0x00, 0x00, + 0x4C, 0xD0, 0xC7, 0x13, 0x15, 0xB6, 0x80, 0x00, 0x05, 0xE0, 0xD0, 0x10, + 0x02, 0xA2, 0x01, 0x00, 0x4B, 0xD0, 0x6F, 0xCC, 0x4C, 0xD0, 0x70, 0xE4, + 0xDD, 0x13, 0x1E, 0xE4, 0x00, 0xA2, 0x70, 0xE4, 0x00, 0xC0, 0x00, 0x00, + 0x78, 0x11, 0x1E, 0xE4, 0xDD, 0x13, 0x1E, 0xE4, 0x1E, 0xE4, 0x96, 0xCC, + 0xD9, 0x13, 0x1E, 0xE4, 0xCD, 0x10, 0x1E, 0xE4, 0x16, 0xE0, 0xD0, 0x10, + 0x00, 0xC0, 0x32, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x32, 0x28, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x10, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0xC0, 0x10, 0x28, 0x01, 0xC0, 0x2E, 0xE4, 0xE1, 0x13, 0x1E, 0xE4, + 0x80, 0xE1, 0x2E, 0xE4, 0x2E, 0xE4, 0x81, 0xE1, 0xC7, 0x13, 0x18, 0xE4, + 0x04, 0xA9, 0x08, 0xAE, 0x16, 0xE0, 0x25, 0x28, 0xC2, 0xE0, 0x00, 0xA2, + 0x00, 0x01, 0xC2, 0xE0, 0x25, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x3D, 0x01, + 0x08, 0xAE, 0x92, 0xB6, 0xC2, 0x4E, 0xC1, 0x2A, 0x08, 0xA2, 0x78, 0x01, + 0xC2, 0xE0, 0x0C, 0xA9, 0xB5, 0x15, 0x1E, 0xE4, 0x79, 0x01, 0xC2, 0xE0, + 0x20, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xD0, 0x14, 0x08, 0xE4, + 0x3B, 0x28, 0x8E, 0xCC, 0x50, 0x00, 0xC0, 0xE0, 0xEC, 0x13, 0x1E, 0xE4, + 0x08, 0x3C, 0x7F, 0x00, 0x08, 0xE0, 0x49, 0xE0, 0x10, 0x3E, 0x7F, 0x00, + 0x09, 0xE0, 0x11, 0xAF, 0x08, 0x2A, 0x00, 0xA2, 0x08, 0x3E, 0x08, 0x46, + 0x20, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0x09, 0xA8, 0x0A, 0xE0, 0x3B, 0xF0, + 0x11, 0xA8, 0x08, 0x2A, 0x55, 0x28, 0x0C, 0x04, 0xC2, 0xE0, 0x40, 0x00, + 0xC2, 0xE0, 0x08, 0xAE, 0x56, 0x4C, 0x20, 0xAE, 0x55, 0x28, 0x05, 0x02, + 0xC2, 0xE0, 0x01, 0x01, 0x03, 0xA1, 0x56, 0x2A, 0x20, 0xAE, 0x02, 0xA1, + 0xC2, 0xE0, 0x00, 0xA2, 0x60, 0xCF, 0x56, 0xE0, 0xC2, 0xE0, 0x13, 0x01, + 0xC2, 0xE0, 0x03, 0x01, 0xC2, 0xE0, 0x21, 0x01, 0xC2, 0xE0, 0x20, 0x01, + 0xC2, 0xE0, 0x23, 0x01, 0xC2, 0xE0, 0x22, 0x01, 0x26, 0x01, 0xC2, 0xE0, + 0x7E, 0xA2, 0x03, 0x03, 0x18, 0xE4, 0x3D, 0x01, 0xC2, 0xE0, 0x27, 0x28, + 0x42, 0x28, 0x74, 0xF1, 0x14, 0x28, 0x85, 0x15, 0x17, 0xE0, 0x0D, 0x16, + 0x1E, 0xE4, 0x16, 0xE0, 0xC2, 0xE0, 0x16, 0xB6, 0x52, 0xB6, 0x55, 0xE0, + 0x10, 0x02, 0xC2, 0xE0, 0x04, 0xA2, 0x08, 0x02, 0x00, 0xA2, 0xC2, 0x15, + 0x1E, 0xE4, 0x00, 0xA2, 0xC2, 0xE0, 0x14, 0x28, 0xD3, 0x15, 0x1E, 0xE4, + 0x1E, 0xE4, 0xC8, 0xF0, 0x09, 0x28, 0x0B, 0x02, 0x05, 0xE0, 0x06, 0xA2, + 0x9B, 0xF0, 0x0D, 0x16, 0x14, 0x28, 0x61, 0x16, 0x1E, 0xE4, 0x00, 0x03, + 0xC2, 0xE0, 0x02, 0xA2, 0x89, 0x16, 0x1E, 0xE4, 0x12, 0x03, 0xC2, 0xE0, + 0x0E, 0xA2, 0x02, 0x03, 0x52, 0xF0, 0x12, 0x28, 0x64, 0x01, 0x1E, 0xE4, + 0x08, 0xB6, 0xA1, 0x28, 0x32, 0xF0, 0x13, 0x28, 0x42, 0xF0, 0x13, 0x28, + 0x80, 0x03, 0xC2, 0xE0, 0xC2, 0xE0, 0x08, 0xB6, 0xA1, 0x28, 0x12, 0x28, + 0x02, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x83, 0x03, 0x46, 0x00, 0xC1, 0xE0, + 0x2A, 0xF3, 0x09, 0x28, 0x42, 0xE0, 0x10, 0xAE, 0x00, 0x00, 0x04, 0xE0, + 0x67, 0xE1, 0x5B, 0xF0, 0x09, 0xA8, 0x10, 0x2A, 0xC2, 0xE0, 0x17, 0x4D, + 0x17, 0x21, 0xD4, 0x02, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x11, 0x02, + 0x10, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x80, 0x00, 0xD6, 0x02, 0x67, 0xE1, + 0x5B, 0xF0, 0x11, 0xA8, 0x12, 0x02, 0xC2, 0xE0, 0x17, 0x4D, 0x17, 0x21, + 0x04, 0xA2, 0xD3, 0x15, 0x1E, 0xE4, 0x00, 0xA2, 0xC2, 0xE0, 0x11, 0x28, + 0xC2, 0x15, 0x1E, 0xE4, 0x10, 0x02, 0xC2, 0xE0, 0x02, 0xA2, 0x14, 0x02, + 0x4A, 0xF0, 0x42, 0x28, 0x68, 0xCF, 0x00, 0xA2, 0x1E, 0xE4, 0x08, 0x02, + 0xC2, 0xE0, 0x00, 0xA2, 0x09, 0x2A, 0x02, 0xA2, 0xFB, 0xF0, 0x0D, 0x16, + 0x00, 0xA2, 0x10, 0x02, 0xC2, 0xE0, 0x16, 0xB6, 0x1E, 0xE4, 0x04, 0xA2, + 0xD3, 0x15, 0x1E, 0xE4, 0x14, 0x02, 0xC2, 0xE0, 0xA8, 0x28, 0xC2, 0x15, + 0x34, 0xB4, 0xA0, 0xB5, 0x04, 0xA1, 0x34, 0x28, 0x32, 0x4C, 0x04, 0xAE, + 0x60, 0xA9, 0x04, 0xA0, 0x04, 0x02, 0xC2, 0xE0, 0x33, 0x4C, 0x02, 0xAE, + 0x02, 0xAE, 0x40, 0x4C, 0x02, 0xAE, 0x49, 0x28, 0x02, 0xAE, 0x3B, 0x4C, + 0x02, 0xAE, 0x41, 0x4C, 0x02, 0xAE, 0x7E, 0x4C, 0x02, 0xAE, 0x39, 0x4C, + 0x04, 0xAE, 0x38, 0x4C, 0x02, 0xAE, 0x7D, 0x4C, 0x04, 0xAE, 0x3C, 0x4C, + 0x02, 0xAE, 0x30, 0x4C, 0x03, 0xA0, 0x34, 0x2A, 0x04, 0xAE, 0x3D, 0x4C, + 0x37, 0x4C, 0x02, 0xAE, 0x56, 0xE0, 0x07, 0xA8, 0x56, 0xE0, 0x17, 0xE0, + 0x25, 0x2A, 0x02, 0xAE, 0x22, 0xD0, 0x00, 0x04, 0x62, 0xE1, 0x06, 0xCF, + 0x08, 0xAE, 0x04, 0x15, 0x84, 0xE1, 0x03, 0x00, 0x02, 0xAE, 0x02, 0xA2, + 0x28, 0xCF, 0x12, 0x4D, 0x02, 0xAE, 0x32, 0x4C, 0x0A, 0xAE, 0x35, 0x4C, + 0x1E, 0xE4, 0x04, 0x01, 0xC2, 0xE0, 0x33, 0x4C, 0x06, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x8E, 0x02, 0xC2, 0xE0, 0x03, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x20, 0x01, 0xC2, 0xE0, 0x13, 0x01, 0xC2, 0xE0, 0x22, 0x01, + 0xC2, 0xE0, 0x21, 0x01, 0x02, 0xA2, 0x03, 0x03, 0xC2, 0xE0, 0x23, 0x01, + 0x35, 0xB4, 0x42, 0x28, 0x2B, 0x2A, 0x2E, 0xE4, 0x04, 0xA2, 0x39, 0xF0, + 0x07, 0xA1, 0x2B, 0x3E, 0x0A, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0x2B, 0x3C, + 0xC8, 0x04, 0x62, 0xE1, 0x3A, 0xF1, 0x02, 0xA8, 0x12, 0x3D, 0xE5, 0x2C, + 0x12, 0x3D, 0xE4, 0x2C, 0x6B, 0x00, 0xC0, 0xE0, 0xF9, 0xF7, 0x29, 0xCA, + 0x12, 0xD1, 0xC8, 0x04, 0x11, 0xD1, 0x20, 0xCE, 0xE1, 0xE1, 0x00, 0x00, + 0x13, 0xD1, 0x04, 0x00, 0x00, 0x01, 0x08, 0xE0, 0x65, 0x00, 0xC0, 0xE0, + 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0xEA, 0xF0, 0x04, 0x00, 0x12, 0xD1, + 0x20, 0xCE, 0x6A, 0x00, 0x02, 0x00, 0x13, 0xD1, 0xC0, 0x04, 0x11, 0xD1, + 0xE5, 0x3C, 0x00, 0xA2, 0xF8, 0xF7, 0x28, 0xCA, 0xE8, 0x3C, 0xE7, 0x3C, + 0xD8, 0x3C, 0xE4, 0x3C, 0x6C, 0x15, 0x0A, 0xE4, 0x09, 0x28, 0x2E, 0xE4, + 0x0F, 0xA8, 0x23, 0xCB, 0x06, 0xAE, 0x64, 0x28, 0x01, 0x00, 0xB6, 0xD1, + 0x23, 0xCF, 0x55, 0xE0, 0xF8, 0xF7, 0x6A, 0xCB, 0x01, 0x00, 0xB5, 0xD1, + 0xC2, 0xE0, 0x60, 0x4C, 0x08, 0xAE, 0x65, 0x28, 0x64, 0x4C, 0x0A, 0xAE, + 0x36, 0x28, 0x14, 0x01, 0x26, 0x01, 0xC0, 0xE0, 0x15, 0x01, 0xC2, 0xE0, + 0x11, 0x01, 0xC0, 0xE0, 0x16, 0x01, 0xC2, 0xE0, 0x10, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0xE8, 0xF7, 0x13, 0x17, 0x18, 0xE4, 0xC2, 0x4C, 0xC1, 0x28, + 0xC2, 0xE0, 0x4A, 0xF1, 0x02, 0xA8, 0x2E, 0xE4, 0x61, 0xE1, 0x7C, 0x3C, + 0x00, 0xA2, 0x3C, 0x01, 0x84, 0xE1, 0x3F, 0x00, 0x22, 0xD0, 0x20, 0x04, + 0x3E, 0x01, 0xC2, 0xE0, 0x7C, 0x28, 0x98, 0x15, 0xC2, 0xE0, 0x11, 0x29, + 0x7C, 0x3C, 0x02, 0xA0, 0x02, 0xAF, 0x27, 0x28, 0x90, 0xE1, 0x3F, 0x01, + 0x04, 0xE0, 0x3C, 0x01, 0xC2, 0xE0, 0x5A, 0xF1, 0x60, 0x04, 0x62, 0xE1, + 0x7C, 0x3C, 0x40, 0x00, 0xAF, 0x15, 0x84, 0xE1, 0x3F, 0x00, 0x22, 0xD0, + 0x02, 0xA0, 0x3E, 0x01, 0xC2, 0xE0, 0x7C, 0x28, 0x3F, 0x01, 0xC2, 0xE0, + 0x12, 0x29, 0x7C, 0x3C, 0x3C, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x90, 0xE1, + 0xAA, 0x2A, 0xED, 0x15, 0x1E, 0xE4, 0x2E, 0xE4, 0x1E, 0xE4, 0x55, 0xE0, + 0x07, 0xAE, 0x17, 0xE0, 0xC2, 0xE0, 0x56, 0xE0, 0x0A, 0xAE, 0xE4, 0x15, + 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, 0x02, 0x01, 0x09, 0xAE, 0x17, 0xE0, + 0xAA, 0x2A, 0xED, 0x15, 0x06, 0xAE, 0xE4, 0x15, 0x1E, 0xE4, 0x55, 0xE0, + 0x56, 0xE0, 0x0F, 0xAE, 0x83, 0xE0, 0x56, 0xE0, 0x92, 0xE0, 0x2E, 0xE4, + 0x13, 0x02, 0xC2, 0xE0, 0x17, 0xE0, 0xAA, 0x2A, 0xED, 0x15, 0x1E, 0xE4, + 0xE4, 0x15, 0x1E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, 0x0F, 0xAE, 0x83, 0xE0, + 0x56, 0xE0, 0x06, 0xAE, 0x2E, 0xE4, 0x15, 0x02, 0xC2, 0xE0, 0x56, 0xE0, + 0x02, 0xA8, 0x06, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x80, 0xA8, 0x60, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x44, 0x00, 0xC0, 0xE0, 0x58, 0xF0, + 0x20, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x44, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0x0E, 0xA8, 0x08, 0xE0, 0x56, 0xE0, 0x03, 0xAE, 0x0D, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0x07, 0xA8, 0x1B, 0xAF, 0x05, 0xA1, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, + 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, 0x23, 0xAF, 0x44, 0x00, + 0xC1, 0xE0, 0x2E, 0xE4, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x07, 0xA8, + 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, 0x23, 0xAF, 0x2E, 0xE4, 0x01, 0xA2, + 0x2E, 0xE4, 0x13, 0xA2, 0x02, 0xA8, 0x20, 0xAF, 0x44, 0x00, 0xC0, 0xE0, + 0x60, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x3E, 0xA8, 0x61, 0x00, + 0xC0, 0xE0, 0x2A, 0xE4, 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, + 0xC2, 0xE0, 0x02, 0xA2, 0x9E, 0xE0, 0x00, 0x05, 0x02, 0xA8, 0x20, 0x04, + 0xC0, 0xE0, 0x0D, 0x04, 0x04, 0xAF, 0xE9, 0x15, 0x1E, 0xE4, 0xDA, 0xF7, + 0xFE, 0x15, 0x1E, 0xE4, 0xF6, 0x15, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0xA8, + 0x43, 0x16, 0x0B, 0xE4, 0x20, 0xAE, 0x56, 0xE0, 0x09, 0xAE, 0x03, 0x16, + 0xFF, 0x1F, 0x09, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0xC2, 0x16, 0x1E, 0xE4, + 0x17, 0x9F, 0x56, 0xE0, 0x22, 0xD0, 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, + 0x14, 0x9E, 0x54, 0x16, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, + 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x5C, 0x16, 0x84, 0xE1, 0x02, 0x00, + 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, 0xC0, 0xE0, 0x4C, 0x3E, + 0xEC, 0x3C, 0x2E, 0xE4, 0x11, 0xAE, 0x20, 0x00, 0x05, 0xE0, 0x41, 0x00, + 0x00, 0x02, 0x11, 0xD1, 0x4C, 0x08, 0x42, 0xE0, 0x11, 0xD1, 0x80, 0x01, + 0x00, 0xE0, 0x5E, 0xF8, 0xC0, 0x00, 0x12, 0xD1, 0x20, 0xCE, 0x40, 0x0B, + 0xF9, 0xF7, 0x29, 0xCA, 0x13, 0x01, 0xEC, 0x88, 0x1E, 0xE4, 0x01, 0xA2, + 0x06, 0xA2, 0x2E, 0xE4, 0xA8, 0x28, 0x94, 0xE0, 0xA9, 0x28, 0x61, 0x16, + 0x49, 0xE0, 0x92, 0xE0, 0x24, 0xE4, 0x02, 0xA1, 0x82, 0xE0, 0x98, 0x16, + 0x1E, 0xE4, 0x0C, 0xC4, 0xC1, 0xE0, 0x95, 0xE0, 0xA9, 0x2A, 0x8E, 0xF7, + 0x49, 0xF0, 0x23, 0xA1, 0x23, 0xA8, 0x60, 0x00, 0xA8, 0x2A, 0x95, 0xE0, + 0x6E, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x98, 0x16, 0x1E, 0xE4, 0x04, 0xC4, + 0x00, 0xE0, 0x18, 0xE0, 0x86, 0xC7, 0xA4, 0xCC, 0x40, 0x09, 0x00, 0xE0, + 0x9A, 0xE0, 0x00, 0x02, 0x00, 0x05, 0x01, 0xE0, 0x07, 0xAE, 0x9C, 0xE0, + 0x04, 0xAF, 0xED, 0x15, 0x1E, 0xE4, 0x9F, 0xE0, 0x69, 0xF0, 0x89, 0xE0, + 0xF6, 0x15, 0x1E, 0xE4, 0x09, 0xAE, 0x12, 0x16, 0x1E, 0xE4, 0x1E, 0xA8, + 0x42, 0xE0, 0x85, 0xE0, 0x20, 0xAE, 0x56, 0xE0, 0x89, 0xE0, 0xBE, 0x16, + 0x1E, 0xE4, 0x17, 0x9F, 0x1E, 0xE4, 0x17, 0x9F, 0xC2, 0x16, 0x1B, 0xE4, + 0x56, 0x4C, 0x55, 0x20, 0x2E, 0xE4, 0xCD, 0x16, 0x56, 0x4C, 0x55, 0x20, + 0x2E, 0xE4, 0x08, 0xAE, 0x23, 0xA1, 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, + 0x08, 0xAE, 0x55, 0x4C, 0x56, 0x20, 0x39, 0xF0, 0x0D, 0x04, 0xC2, 0xE0, + 0x02, 0xA2, 0x2E, 0xE4, 0x20, 0x04, 0xC0, 0xE0, 0x0E, 0x04, 0xC2, 0xE0, + 0x02, 0x00, 0x22, 0xD0, 0xDA, 0xF7, 0x02, 0xA8, 0x15, 0x4D, 0x15, 0x21, + 0xDC, 0x16, 0x84, 0xE1, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x17, 0x9F, + 0x17, 0x9F, 0x16, 0x4D, 0x16, 0x21, 0xE3, 0x16, 0x2E, 0xE4, 0x0D, 0x04, + 0xC2, 0xE0, 0x00, 0xA2, 0x42, 0xF0, 0xC3, 0x28, 0xC3, 0x3C, 0xB4, 0x28, + 0x00, 0xA2, 0xC2, 0x3C, 0xC1, 0x3C, 0x00, 0xA2, 0x6C, 0x17, 0x1E, 0xE4, + 0xC9, 0x3C, 0xC8, 0x3C, 0xC3, 0x28, 0x2A, 0xE4, 0xC2, 0x4C, 0xC1, 0x28, + 0x43, 0x01, 0xC2, 0xE0, 0xC3, 0x28, 0x24, 0xE4, 0x00, 0xA2, 0x44, 0x01, + 0xC2, 0xE0, 0xC4, 0x28, 0x02, 0xA1, 0xC6, 0x28, 0x49, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0x02, 0xA1, 0xC7, 0x4C, 0x20, 0xAE, 0x20, 0xAE, 0xE9, 0x15, + 0x1E, 0xE4, 0x42, 0x01, 0x42, 0xE0, 0xC0, 0x4E, 0x09, 0xAE, 0xC2, 0x2A, + 0xC3, 0x28, 0x2E, 0xE4, 0x4E, 0x01, 0xC2, 0xE0, 0xC9, 0x2A, 0xC5, 0x3C, + 0x53, 0x17, 0x1E, 0xE4, 0x10, 0xAE, 0xC8, 0x28, 0x23, 0xE4, 0xC7, 0x1A, + 0xCA, 0x3E, 0x15, 0xB6, 0x03, 0xA2, 0xC9, 0x4C, 0x03, 0xAE, 0xCA, 0x4E, + 0x03, 0xAE, 0xC5, 0x2A, 0xC1, 0xE0, 0x56, 0xE0, 0x21, 0xAE, 0x03, 0xA9, + 0x4D, 0x01, 0xC2, 0xE0, 0xE9, 0xF7, 0x4B, 0x01, 0xC8, 0x2A, 0x4A, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0x65, 0xF0, 0xC6, 0x1A, 0xC8, 0x3E, 0x03, 0xA0, + 0x01, 0xA2, 0xC9, 0x3E, 0x03, 0xA0, 0xC9, 0x2A, 0xC2, 0x4C, 0xC1, 0x28, + 0x2E, 0xE4, 0xC8, 0x3E, 0x32, 0xF0, 0xC7, 0x18, 0xC9, 0x28, 0x4A, 0xF1, + 0x4B, 0x01, 0xC0, 0xE0, 0xCE, 0xF7, 0x3E, 0xFD, 0xC2, 0xE0, 0x20, 0xAE, + 0x04, 0xA2, 0xE8, 0xF7, 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x4D, 0x01, + 0xE8, 0xF7, 0x4B, 0x01, 0xC0, 0xE0, 0x90, 0xE1, 0x24, 0xE4, 0x2E, 0xE4, + 0xC3, 0x3C, 0xA2, 0x28, 0x06, 0x29, 0x9C, 0xE0, 0x30, 0x03, 0x00, 0xE0, + 0x30, 0x03, 0x00, 0xE0, 0x24, 0xE4, 0x2E, 0xE4, 0xA1, 0x28, 0x2E, 0xE4, + 0x06, 0x3F, 0x9C, 0xE0, 0xA1, 0x08, 0xB0, 0x01, 0x04, 0xE0, 0x24, 0xE4, + 0x40, 0xA0, 0x02, 0x3F, 0x55, 0x2A, 0x94, 0xE0, 0x2E, 0xE4, 0x02, 0x3F, + 0x56, 0x2A, 0x94, 0xE0, 0x94, 0xE0, 0xC3, 0x08, 0xB0, 0x01, 0x04, 0xE0, + 0x94, 0xE0, 0x40, 0xA0, 0xC6, 0x3E, 0x02, 0x2B, 0x90, 0xE1, 0x2E, 0xE4, + 0xC7, 0x3E, 0x02, 0x2B, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x3C, 0x03, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x56, 0x03, 0x0E, 0xE4, + 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, + 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, + 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, + 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, + 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, + 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, + 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x3C, 0x03, + 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, + 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, + 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, + 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, + 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, + 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, + 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, + 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, + 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, + 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, + 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, + 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, + 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, + 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, + 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, + 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, + 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, + 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, + 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, + 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, + 0x00, 0x28, 0x12, 0xD1, 0x4E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, + 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, + 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, + 0x5C, 0x03, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, + 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, + 0x7C, 0xE6, 0x5E, 0x03, 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, + 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, + 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, + 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, + 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xEE, 0x01, + 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, + 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, + 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, + 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, + 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, + 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, + 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, + 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, + 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, + 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, 0x90, 0x01, 0x1A, 0xE4, + 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x3E, 0xA2, + 0x2E, 0xE4, 0x4A, 0x00, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x02, 0xA2, + 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0x20, 0xA2, 0x00, 0xA2, 0x76, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0xC2, 0xE0, 0xFC, 0xA2, 0x72, 0x00, 0xC2, 0xE0, + 0x71, 0x00, 0xC2, 0xE0, 0xFA, 0xA2, 0x77, 0x00, 0x84, 0xE1, 0x0F, 0x27, + 0x22, 0xD0, 0x2E, 0xE4, 0x48, 0xF0, 0x4A, 0x00, 0xC0, 0xE0, 0xAA, 0x01, + 0xC0, 0xE0, 0xE8, 0xF7, 0x1F, 0x04, 0xC0, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, + 0xEE, 0xA1, 0x3D, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0xC2, 0xE0, 0x11, 0x00, 0x04, 0xE0, 0x9D, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0x2E, 0xE4, 0x3C, 0x04, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xE0, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0x45, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3C, 0x04, 0x28, 0xE4, 0x04, 0xA1, + 0x0E, 0xA8, 0x04, 0xAF, 0xC0, 0xE0, 0x4A, 0x00, 0xC2, 0xE0, 0x02, 0xA2, + 0x48, 0xCA, 0x8E, 0xF9, 0xE8, 0xF7, 0x11, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0xE8, 0xF7, 0x02, 0xA8, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xF8, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x3C, 0x04, 0x42, 0x3C, 0x43, 0x34, + 0x01, 0xC0, 0x2E, 0xE4, 0x43, 0x2C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, + 0x52, 0x1C, 0x2A, 0xE4, 0x00, 0xC0, 0x42, 0x2E, 0x50, 0x18, 0x10, 0xAF, + 0x4A, 0xE0, 0xB4, 0xF0, 0x51, 0x1A, 0xFF, 0x00, 0x09, 0xE0, 0x74, 0xF0, + 0xFE, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x34, 0xF0, 0x1E, 0xF1, 0x5D, 0x3C, + 0x01, 0xC0, 0x2E, 0xE4, 0x01, 0xC0, 0xEE, 0xF0, 0x5E, 0x3C, 0x01, 0xC0, + 0x5F, 0x3C, 0x01, 0xC0, 0xBE, 0xF0, 0x5E, 0x28, 0x5E, 0x1A, 0x5D, 0x2A, + 0x01, 0xC0, 0x8E, 0xF0, 0x5F, 0x2A, 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, + 0x08, 0x08, 0xC2, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0x02, 0x08, 0x62, 0xE1, + 0x0B, 0x08, 0xC3, 0xE0, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x02, 0xA2, + 0x92, 0x9F, 0x00, 0x02, 0x05, 0xE0, 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, + 0x12, 0x9F, 0x12, 0x9F, 0x12, 0x81, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, + 0xC0, 0xE0, 0x00, 0x08, 0xC2, 0xE0, 0x02, 0xA2, 0x1E, 0xE4, 0x2E, 0xE4, + 0xE8, 0xF7, 0x00, 0x08, 0x32, 0xA2, 0x20, 0x06, 0x60, 0xD1, 0x4E, 0x02, + 0x40, 0xCE, 0x2E, 0xE4, 0xC0, 0xCE, 0x18, 0xAE, 0x02, 0x00, 0x22, 0xD1, + 0x00, 0x00, 0x21, 0xD1, 0x02, 0xA8, 0x48, 0xCA, 0x80, 0x00, 0x23, 0xD1, + 0x22, 0xAE, 0x04, 0xA2, 0x2E, 0xE4, 0xE8, 0xF7, 0x8C, 0xCC, 0x72, 0xCC, + 0x00, 0xA2, 0x9E, 0xCC, 0x20, 0xAE, 0x10, 0xA8, 0x04, 0xE0, 0x8E, 0xCC, + 0x6F, 0xD1, 0x4A, 0xCE, 0x22, 0x93, 0x0A, 0xE0, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x03, 0x00, 0x60, 0xA2, 0x2E, 0xE4, 0x00, 0x00, 0x6F, 0xD1, + 0xEA, 0xF7, 0x02, 0xA8, 0x50, 0xCA, 0x50, 0xCE, 0x20, 0x00, 0x04, 0xE0, + 0x2E, 0xE4, 0x00, 0xC0, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x50, 0xCE, + 0x3D, 0x04, 0xC1, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0x00, 0x01, 0x0A, 0xE0, + 0xD9, 0xF7, 0xEF, 0xA1, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0xC2, 0x02, 0x72, 0x02, 0x1E, 0xE4, + 0x1F, 0x00, 0x08, 0xE0, 0x37, 0x03, 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, + 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x12, 0xAE, 0xE8, 0x02, 0x1E, 0xE4, + 0x2E, 0xE4, 0x27, 0x03, 0x04, 0xA8, 0x10, 0x02, 0xC0, 0xE0, 0x2A, 0xE4, + 0x08, 0xE0, 0x15, 0x02, 0xC0, 0xE0, 0x18, 0xF1, 0x16, 0x02, 0xC0, 0xE0, + 0x4A, 0xF0, 0x00, 0x01, 0x08, 0xE0, 0x13, 0x02, 0xC0, 0xE0, 0xBE, 0xF0, + 0x14, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, 0x1E, 0xE4, 0x0B, 0x02, + 0xC0, 0xE0, 0x3E, 0xF0, 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, 0x72, 0x02, + 0x10, 0x02, 0xC1, 0xE0, 0x12, 0xAE, 0x37, 0x03, 0xC1, 0xE0, 0x56, 0xE0, + 0x15, 0xAE, 0x03, 0xA8, 0x07, 0xAE, 0x7F, 0xA8, 0x0B, 0xAF, 0x04, 0x02, + 0x0F, 0xA8, 0x04, 0x02, 0xC1, 0xE0, 0x56, 0xE0, 0x1E, 0xE4, 0x1E, 0x04, + 0xC2, 0xE0, 0x56, 0xE0, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x27, 0x03, + 0x52, 0xE0, 0x1F, 0xAE, 0x03, 0xA2, 0x92, 0xE0, 0x94, 0xE0, 0x60, 0x00, + 0xC0, 0xE0, 0xEA, 0xF1, 0x84, 0xE0, 0x8A, 0xF1, 0x06, 0xA8, 0x08, 0xAF, + 0x21, 0xA8, 0x85, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, 0xC0, 0xE0, 0x0A, 0xF1, + 0x56, 0xE0, 0x17, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, + 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x3A, 0xF0, 0x56, 0xE0, + 0x03, 0xA8, 0x1B, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0x1F, 0xAE, 0x03, 0xA2, 0x44, 0x00, 0xC0, 0xE0, 0xC2, 0x02, 0x1E, 0xE4, + 0xEA, 0xF0, 0x52, 0xE0, 0x69, 0xF0, 0xCE, 0x03, 0x1E, 0xE4, 0xB8, 0xF0, + 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x38, 0xF0, 0x08, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, + 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, 0xFF, 0x00, 0x04, 0xAE, 0x02, 0xA0, + 0x00, 0x05, 0x00, 0xE0, 0xC2, 0xE0, 0x02, 0xA2, 0x1A, 0x04, 0xC2, 0xE0, + 0xEA, 0xF7, 0x19, 0x04, 0xC0, 0xE0, 0x18, 0x04, 0xC0, 0xE0, 0x18, 0x04, + 0xC2, 0xE0, 0x02, 0xA2, 0x1B, 0x04, 0xC0, 0xE0, 0xEA, 0xF7, 0x19, 0x04, + 0x28, 0xAE, 0x08, 0xAF, 0x1E, 0xA0, 0x20, 0xAF, 0xFF, 0xFF, 0x09, 0xE0, + 0x1B, 0x04, 0xC1, 0xE0, 0x56, 0xE0, 0x09, 0xAE, 0x09, 0xAF, 0x1F, 0xA0, + 0xC0, 0xE0, 0x2E, 0xE4, 0x1D, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0x02, + 0x0A, 0xE0, 0x1C, 0x04, 0xF0, 0xF7, 0x02, 0xA1, 0x28, 0xA2, 0x1C, 0x04, + 0x00, 0x02, 0x0C, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, + 0x1C, 0x04, 0xC2, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, 0x04, 0xAF, 0x44, 0x00, + 0x60, 0x03, 0x0E, 0xE4, 0xA9, 0x14, 0x0E, 0xE4, 0x68, 0x03, 0x0E, 0xE4, + 0x64, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6E, 0x03, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x72, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x34, 0x05, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x92, 0x05, 0x1E, 0xE4, 0xB6, 0x01, 0x1E, 0xE4, 0x93, 0x05, 0x1E, 0xE4, + 0xBD, 0x07, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x15, 0x08, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0xAE, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x55, 0xE0, 0x07, 0xAE, 0x17, 0xE0, 0x08, 0x2A, 0x56, 0xE0, 0x0A, 0xAE, + 0xA5, 0x03, 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, 0x02, 0x01, 0xC2, 0xE0, + 0x17, 0xE0, 0x08, 0x2A, 0xAE, 0x03, 0x1E, 0xE4, 0xA5, 0x03, 0x1E, 0xE4, + 0x55, 0xE0, 0x09, 0xAE, 0x0F, 0xAE, 0x83, 0xE0, 0x56, 0xE0, 0x06, 0xAE, + 0x2E, 0xE4, 0x13, 0x02, 0xC2, 0xE0, 0x56, 0xE0, 0x08, 0x2A, 0xAE, 0x03, + 0x1E, 0xE4, 0x92, 0xE0, 0x1E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, 0x17, 0xE0, + 0x83, 0xE0, 0x56, 0xE0, 0x06, 0xAE, 0xA5, 0x03, 0x15, 0x02, 0xC2, 0xE0, + 0x56, 0xE0, 0x0F, 0xAE, 0x06, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, 0x44, 0x00, 0xC0, 0xE0, + 0x58, 0xF0, 0x80, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, + 0xC1, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x20, 0xAF, 0x56, 0xE0, 0x03, 0xAE, + 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, + 0x2E, 0xE4, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0x07, 0xA8, 0x1B, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, 0x05, 0xA1, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0xA2, 0xC1, 0xE0, 0x2E, 0xE4, + 0x07, 0xA8, 0x23, 0xAF, 0x05, 0xA1, 0x07, 0xA8, 0x23, 0xAF, 0x44, 0x00, + 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, 0x20, 0xAF, 0x44, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x02, 0xA8, + 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x60, 0xA8, 0x18, 0xE0, 0x88, 0xC7, + 0xA4, 0xCC, 0x3E, 0xA8, 0x02, 0xA2, 0x9E, 0xE0, 0x00, 0x05, 0x00, 0xE0, + 0x20, 0x04, 0xC0, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, 0xAA, 0x03, 0x1E, 0xE4, + 0xDA, 0xF7, 0x02, 0xA8, 0x1E, 0xE4, 0xB7, 0x03, 0x1E, 0xE4, 0x04, 0xAF, + 0x1E, 0xA8, 0x04, 0x04, 0x0B, 0xE4, 0xBF, 0x03, 0x56, 0xE0, 0x09, 0xAE, + 0xC4, 0x03, 0x1E, 0xE4, 0x09, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0x20, 0xAE, + 0x1E, 0xE4, 0x17, 0x9F, 0x56, 0xE0, 0xFF, 0x1F, 0x62, 0x00, 0x64, 0xE1, + 0x17, 0x9F, 0x88, 0x04, 0x15, 0x04, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, + 0x7A, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x1D, 0x04, 0x84, 0xE1, + 0x02, 0x00, 0x22, 0xD0, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, 0x14, 0x9E, + 0x01, 0x3E, 0xEC, 0x3C, 0x2E, 0xE4, 0x0D, 0x04, 0x20, 0x00, 0x05, 0xE0, + 0x41, 0x00, 0xC0, 0xE0, 0x11, 0xD1, 0x01, 0x08, 0x42, 0xE0, 0x11, 0xAE, + 0x80, 0x01, 0x00, 0xE0, 0x5E, 0xF8, 0x00, 0x05, 0x12, 0xD1, 0x20, 0xCE, + 0x40, 0x0B, 0x11, 0xD1, 0x29, 0xCA, 0x13, 0x01, 0xEC, 0x88, 0xC0, 0x00, + 0x01, 0xA2, 0x06, 0xA2, 0x2E, 0xE4, 0xF9, 0xF7, 0x94, 0xE0, 0x62, 0x28, + 0x22, 0x04, 0x1E, 0xE4, 0x92, 0xE0, 0x24, 0xE4, 0x02, 0xA1, 0x4D, 0x28, + 0x59, 0x04, 0x1E, 0xE4, 0x0C, 0xC4, 0x49, 0xE0, 0x95, 0xE0, 0x62, 0x2A, + 0x8E, 0xF7, 0x82, 0xE0, 0x23, 0xA1, 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, + 0x95, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0x49, 0xF0, 0x59, 0x04, 0x1E, 0xE4, + 0x04, 0xC4, 0x4D, 0x2A, 0x18, 0xE0, 0x86, 0xC7, 0xA4, 0xCC, 0x2E, 0xE4, + 0x00, 0xE0, 0x9A, 0xE0, 0x00, 0x05, 0x00, 0xE0, 0x01, 0xE0, 0x07, 0xAE, + 0x9C, 0xE0, 0x40, 0x06, 0xAE, 0x03, 0x1E, 0xE4, 0x9F, 0xE0, 0x00, 0x05, + 0x89, 0xE0, 0xB7, 0x03, 0x1E, 0xE4, 0x04, 0xAF, 0xD3, 0x03, 0x1E, 0xE4, + 0x1E, 0xA8, 0x69, 0xF0, 0x85, 0xE0, 0x20, 0xAE, 0x56, 0xE0, 0x09, 0xAE, + 0x7F, 0x04, 0x1E, 0xE4, 0x17, 0x9F, 0x42, 0xE0, 0x17, 0x9F, 0x88, 0x04, + 0x1B, 0xE4, 0x89, 0xE0, 0xD3, 0x2A, 0x2E, 0xE4, 0x93, 0x04, 0x1E, 0xE4, + 0x4E, 0xF0, 0x0A, 0x4C, 0x09, 0x20, 0x4B, 0xF0, 0x2E, 0xE4, 0x08, 0xAE, + 0x51, 0x4C, 0x50, 0x20, 0x60, 0x00, 0xC1, 0xE0, 0x51, 0x4C, 0x50, 0x20, + 0x51, 0x20, 0x39, 0xF0, 0x23, 0xA1, 0x23, 0xA8, 0x02, 0xA2, 0x2E, 0xE4, + 0x08, 0xAE, 0x50, 0x4C, 0x0E, 0x04, 0xC2, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, + 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0xA2, 0x04, 0x84, 0xE1, + 0x02, 0x00, 0x22, 0xD0, 0x22, 0xD0, 0x17, 0x9F, 0x15, 0x4D, 0x15, 0x21, + 0x16, 0x21, 0xA9, 0x04, 0x84, 0xE1, 0x02, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0x17, 0x9F, 0x16, 0x4D, 0x67, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x0D, 0x04, + 0xD1, 0x30, 0x9B, 0xF0, 0x45, 0xE0, 0x11, 0xA2, 0xD3, 0x30, 0x02, 0xAF, + 0xD2, 0x30, 0x02, 0xAF, 0x00, 0xA2, 0x6E, 0xF0, 0xC0, 0x30, 0x02, 0xAF, + 0xD1, 0x3C, 0xD3, 0x3C, 0x02, 0xA2, 0xD2, 0x3C, 0x10, 0xAF, 0x63, 0x30, + 0x62, 0x00, 0xC0, 0xE0, 0x0A, 0x4C, 0x09, 0x20, 0x2E, 0xE4, 0x10, 0x30, + 0xC2, 0xE0, 0x21, 0x28, 0x71, 0x00, 0xC2, 0xE0, 0x79, 0x00, 0xC2, 0xE0, + 0x20, 0x2C, 0x7A, 0x00, 0x0E, 0xA8, 0xC2, 0x28, 0x0F, 0xAE, 0x39, 0x2A, + 0x30, 0x4C, 0x02, 0xAE, 0x35, 0x4C, 0x02, 0xAE, 0x22, 0x4C, 0x02, 0xAE, + 0x23, 0x4C, 0x02, 0xAE, 0xAD, 0x28, 0x75, 0x00, 0xC2, 0xE0, 0x56, 0xE0, + 0x56, 0xE0, 0x1B, 0xE0, 0x02, 0xAE, 0xE0, 0x2A, 0x1F, 0xA8, 0xE0, 0x2A, + 0xCB, 0xF0, 0x0E, 0xAE, 0x09, 0xAF, 0xE0, 0x2A, 0x10, 0xAE, 0x56, 0xE0, + 0x56, 0xE0, 0x2F, 0xAE, 0x08, 0x2A, 0x56, 0xE0, 0x08, 0x2A, 0xE1, 0x4C, + 0x10, 0xAE, 0x6E, 0xF0, 0x7B, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x2F, 0xAE, + 0xE2, 0x28, 0x09, 0xAE, 0x0B, 0xB6, 0x7A, 0x2A, 0x08, 0xA2, 0x72, 0x00, + 0xC2, 0xE0, 0x56, 0xE0, 0x19, 0x28, 0x73, 0x00, 0xC2, 0xE0, 0x63, 0x08, + 0xC2, 0xE0, 0x1F, 0x28, 0x74, 0x00, 0xC2, 0xE0, 0x76, 0x00, 0xC2, 0xE0, + 0xFE, 0xA2, 0x70, 0x00, 0x16, 0xE0, 0x1F, 0x28, 0x77, 0x00, 0xC2, 0xE0, + 0x2E, 0xE4, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x91, 0x30, 0x08, 0xAF, + 0x45, 0x00, 0xC0, 0xE0, 0x1F, 0xA8, 0x49, 0xE0, 0x60, 0x00, 0xC0, 0xE0, + 0x02, 0xAF, 0x75, 0x30, 0x08, 0xAF, 0x76, 0x3E, 0x04, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x71, 0x30, 0x1D, 0x3C, 0x06, 0xA8, 0x02, 0xAF, 0x1E, 0x30, + 0x6C, 0x00, 0xC0, 0xE0, 0xE3, 0x3C, 0x00, 0xA2, 0xC0, 0xE0, 0xDA, 0x3C, + 0x88, 0x00, 0x02, 0xE0, 0x2E, 0xE4, 0xE3, 0x30, 0x0A, 0xAF, 0x65, 0x00, + 0x30, 0xD1, 0x4C, 0xCC, 0x4A, 0xCC, 0x00, 0xA2, 0x08, 0xD0, 0x03, 0x00, + 0x3A, 0xD0, 0x03, 0x00, 0x25, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0x00, + 0x4E, 0x02, 0x1E, 0xE4, 0x26, 0x01, 0x1E, 0xE4, 0x28, 0x08, 0x1E, 0xE4, + 0x7D, 0x05, 0x1E, 0xE4, 0x1F, 0x3C, 0x00, 0xA2, 0x29, 0x14, 0x1E, 0xE4, + 0xF2, 0x3C, 0xF1, 0x3C, 0x0A, 0x3C, 0x09, 0x3C, 0xAE, 0x04, 0x1E, 0xE4, + 0xF4, 0x3C, 0xF3, 0x3C, 0x58, 0x14, 0x1E, 0xE4, 0xDD, 0x3C, 0x04, 0xA2, + 0x30, 0x28, 0x5D, 0xF1, 0xDA, 0x08, 0x1E, 0xE4, 0x28, 0xE1, 0x2D, 0x15, + 0x1E, 0xE4, 0x4A, 0xF0, 0x15, 0x3C, 0x0F, 0x28, 0x38, 0xF0, 0x10, 0x28, + 0x63, 0x3C, 0x12, 0xB6, 0x35, 0x2A, 0x63, 0x28, 0x02, 0xA2, 0x5A, 0xF0, + 0x30, 0x08, 0x1E, 0xE4, 0x1F, 0x28, 0x19, 0x3C, 0x02, 0xA2, 0x1F, 0x3C, + 0x0A, 0x28, 0xF3, 0x3C, 0x09, 0x28, 0xF2, 0x3C, 0x1E, 0xE4, 0xD9, 0x15, + 0x1E, 0xE4, 0xF4, 0x3C, 0x6A, 0xE1, 0x4B, 0x08, 0x1E, 0xE4, 0xC6, 0x04, + 0x5B, 0xA2, 0x40, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0x1E, 0x05, 0xE0, + 0x42, 0xE0, 0x17, 0xAE, 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x03, 0xAE, + 0x12, 0xD1, 0x00, 0x02, 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x03, 0x00, + 0x13, 0xD1, 0x00, 0x01, 0x00, 0xA2, 0x2E, 0xE4, 0x2E, 0xE4, 0xF8, 0xF7, + 0x03, 0x00, 0x30, 0xD1, 0x4C, 0xCC, 0x4A, 0xCC, 0x00, 0x00, 0x08, 0xD0, + 0x03, 0x00, 0x3A, 0xD0, 0x14, 0x05, 0x1E, 0xE4, 0xAE, 0x07, 0x1E, 0xE4, + 0x9F, 0x08, 0x1E, 0xE4, 0xC5, 0x08, 0x1E, 0xE4, 0x01, 0xA2, 0x06, 0xA2, + 0x6B, 0x14, 0x1E, 0xE4, 0x3A, 0x04, 0x1E, 0xE4, 0x22, 0x04, 0x1E, 0xE4, + 0x7B, 0x02, 0x1E, 0xE4, 0xDD, 0x03, 0x1E, 0xE4, 0x9E, 0x15, 0x1E, 0xE4, + 0x20, 0x16, 0x1E, 0xE4, 0x4C, 0x07, 0x18, 0xE4, 0x30, 0x28, 0xE8, 0xF0, + 0xF1, 0x28, 0x5B, 0x07, 0x1A, 0xE4, 0x30, 0x28, 0x9E, 0x15, 0x1E, 0xE4, + 0x40, 0x06, 0x08, 0xE4, 0x1F, 0x3C, 0x02, 0xA2, 0xF7, 0x05, 0x0A, 0xE4, + 0x02, 0xA8, 0x04, 0xAF, 0x45, 0x00, 0xC0, 0xE0, 0xA6, 0xF1, 0x19, 0x28, + 0xF1, 0x06, 0x0A, 0xE4, 0xA4, 0x28, 0x19, 0x3C, 0x02, 0xA1, 0x19, 0x28, + 0x72, 0x3C, 0x43, 0x14, 0x1E, 0xE4, 0xA4, 0xF0, 0x9C, 0x13, 0x1E, 0xE4, + 0x51, 0x14, 0x1E, 0xE4, 0xA1, 0x28, 0x63, 0x2A, 0x5F, 0x13, 0x19, 0xE4, + 0xA4, 0x3C, 0x1C, 0x3C, 0xA3, 0x28, 0x2B, 0xF0, 0x0E, 0xE4, 0xA3, 0x3C, + 0xA1, 0x3C, 0xFE, 0xA2, 0xA1, 0x28, 0xA4, 0xF0, 0x19, 0x28, 0xF1, 0x06, + 0xA3, 0x3C, 0xA3, 0x28, 0x2B, 0xF0, 0x63, 0x2A, 0xD8, 0xF5, 0x08, 0xAF, + 0x60, 0x00, 0xC0, 0xE0, 0xFC, 0xA2, 0x1C, 0x3C, 0xA1, 0x3C, 0xFE, 0xA2, + 0x15, 0x28, 0xF1, 0x06, 0x0E, 0xE4, 0x1B, 0x3C, 0x98, 0xF1, 0x08, 0xA1, + 0x17, 0x28, 0xCA, 0xF1, 0x43, 0x14, 0x1E, 0xE4, 0x64, 0xF0, 0xA4, 0x28, + 0x1E, 0xE4, 0x51, 0x14, 0x1E, 0xE4, 0x72, 0x3C, 0xA2, 0x28, 0x5F, 0x13, + 0x19, 0xE4, 0x9C, 0x13, 0xA5, 0x3C, 0xA6, 0x28, 0x2B, 0xF0, 0x63, 0x2A, + 0x17, 0x3C, 0x00, 0xA2, 0xA4, 0x3C, 0x1C, 0x3C, 0xF1, 0x06, 0x0E, 0xE4, + 0x74, 0x3C, 0x02, 0xA2, 0x1F, 0x3C, 0x02, 0xA2, 0x1B, 0x3C, 0xFE, 0xA2, + 0xF1, 0x06, 0x0A, 0xE4, 0xB6, 0x08, 0x1E, 0xE4, 0x1B, 0x3C, 0xFC, 0xA2, + 0x1A, 0x3C, 0x00, 0xA2, 0x18, 0xE4, 0x30, 0x28, 0x1F, 0x3C, 0x02, 0xA2, + 0x30, 0x28, 0xC2, 0x05, 0x04, 0xE4, 0x87, 0x09, 0xC2, 0x05, 0x04, 0xE4, + 0x3A, 0x09, 0x1A, 0xE4, 0x0D, 0xE4, 0x1F, 0x3C, 0x1A, 0xB6, 0x1F, 0x28, + 0x4D, 0x06, 0x0A, 0xE4, 0xF2, 0x28, 0xF1, 0x06, 0x08, 0xE4, 0x46, 0xE0, + 0xF3, 0x2A, 0x09, 0x28, 0x46, 0xE0, 0xF4, 0x2A, 0x0A, 0x28, 0x40, 0x06, + 0x4D, 0x06, 0x0E, 0xE4, 0x40, 0x06, 0x08, 0xE4, 0xFE, 0xA2, 0x1F, 0x3C, + 0xF1, 0x3C, 0x02, 0xA2, 0x0A, 0x28, 0xF3, 0x3C, 0x09, 0x28, 0x1B, 0x3C, + 0x0E, 0xE4, 0x29, 0x16, 0x1E, 0xE4, 0xF4, 0x3C, 0x24, 0x28, 0xEA, 0xF0, + 0x1E, 0x28, 0xF1, 0x06, 0x02, 0xA2, 0xBA, 0xF1, 0x91, 0x28, 0xAA, 0xF0, + 0x1E, 0xE4, 0xF1, 0x06, 0x0E, 0xE4, 0x1F, 0x3C, 0x77, 0x06, 0x0E, 0xE4, + 0x7E, 0xF4, 0x4C, 0x07, 0x4A, 0xF0, 0x02, 0xA1, 0xAA, 0xF1, 0x1D, 0x28, + 0x24, 0x28, 0xBE, 0xF0, 0x5A, 0xF0, 0x02, 0xA1, 0x04, 0xA1, 0x24, 0x28, + 0x8E, 0xF0, 0x3A, 0xF1, 0x04, 0xA2, 0x3A, 0xF0, 0x15, 0x28, 0xF8, 0xF0, + 0x00, 0xA2, 0x4C, 0x07, 0x1E, 0xE4, 0x17, 0x3C, 0x1C, 0x3C, 0xA5, 0x3C, + 0xFC, 0xA2, 0x46, 0x3C, 0x15, 0x28, 0xF1, 0x06, 0x0E, 0xE4, 0xA4, 0x3C, + 0xA4, 0x28, 0x78, 0xF1, 0x2D, 0x28, 0x9A, 0xF1, 0x72, 0x3C, 0x43, 0x14, + 0x1E, 0xE4, 0x64, 0xF0, 0x9C, 0x13, 0x1E, 0xE4, 0x51, 0x14, 0x1E, 0xE4, + 0x1C, 0x3C, 0xFA, 0xA2, 0x5F, 0x13, 0x19, 0xE4, 0x06, 0xA2, 0xA4, 0x3C, + 0x1B, 0x3C, 0xFC, 0xA2, 0x0E, 0xE4, 0x74, 0x3C, 0x02, 0xA2, 0x17, 0x3C, + 0x2D, 0x28, 0xC9, 0x0F, 0x1E, 0xE4, 0xF1, 0x06, 0xC2, 0x2A, 0x00, 0x3E, + 0x17, 0xE0, 0x3F, 0x2A, 0x52, 0xE0, 0x00, 0x4E, 0x17, 0xE0, 0x03, 0xA1, + 0x00, 0xA2, 0x00, 0x03, 0x62, 0xE1, 0xC8, 0xF1, 0x3E, 0x3C, 0x44, 0x3C, + 0x12, 0x3D, 0x11, 0xC7, 0xB6, 0x3C, 0xB5, 0x3C, 0x0C, 0x3C, 0x0D, 0x3C, + 0x43, 0x3C, 0x52, 0x28, 0x0B, 0x3C, 0x6C, 0x3C, 0x00, 0x10, 0x04, 0xE0, + 0x42, 0x3C, 0x02, 0xA2, 0x1E, 0xE4, 0x01, 0x00, 0xB3, 0xD1, 0x02, 0xCF, + 0xCE, 0xF1, 0x46, 0x3C, 0x00, 0xA2, 0x4B, 0x17, 0x09, 0xB6, 0x03, 0xA2, + 0xF6, 0x01, 0x1E, 0xE4, 0x36, 0x28, 0xF1, 0x06, 0x04, 0xE4, 0x1F, 0x3E, + 0x1E, 0xE4, 0xA8, 0xF0, 0x30, 0x44, 0x16, 0xE0, 0x1F, 0x3E, 0x15, 0xB6, + 0x03, 0xA2, 0x34, 0x16, 0xD3, 0x06, 0x0E, 0xE4, 0xF1, 0x06, 0x0A, 0xE4, + 0x15, 0xB6, 0x03, 0xA2, 0x98, 0x16, 0x1E, 0xE4, 0x1E, 0xE4, 0xF1, 0x06, + 0x0A, 0xE4, 0x1F, 0x3E, 0x15, 0x28, 0xFA, 0xF0, 0x91, 0x28, 0xE6, 0x11, + 0xA8, 0xF0, 0x02, 0xA1, 0x24, 0x28, 0xDA, 0xF0, 0x02, 0xE0, 0x3E, 0xBA, + 0x99, 0x15, 0x1E, 0xE4, 0x1A, 0x3C, 0x02, 0xA2, 0x48, 0xF0, 0xB6, 0x01, + 0xA8, 0xF0, 0x4B, 0x4C, 0x4A, 0x24, 0x1F, 0x3C, 0xF1, 0x06, 0x01, 0xE4, + 0x03, 0xA1, 0x24, 0x2A, 0xFA, 0xA2, 0xA4, 0x3C, 0xA5, 0x3C, 0xFE, 0xA2, + 0x77, 0x00, 0xC2, 0xE0, 0x1B, 0x28, 0x1C, 0x3C, 0x02, 0xA2, 0x71, 0x00, + 0xC2, 0xE0, 0x1C, 0x28, 0x4B, 0x0C, 0x4A, 0x04, 0x0A, 0xB6, 0x1B, 0x2A, + 0x70, 0x00, 0xC2, 0xE0, 0x4B, 0x3C, 0x4A, 0x34, 0x09, 0x24, 0x72, 0x00, + 0xC2, 0xE0, 0x46, 0x28, 0x2D, 0x28, 0x6F, 0x00, 0xC2, 0xE0, 0x0A, 0x4C, + 0x08, 0xA2, 0x3A, 0xF0, 0x15, 0x28, 0x58, 0xF0, 0x24, 0x4C, 0x2A, 0xAE, + 0xAE, 0x28, 0x24, 0x3C, 0x2D, 0x2A, 0x56, 0xE0, 0x25, 0xAE, 0xAD, 0x2A, + 0x73, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x0D, 0xAE, 0xE2, 0x28, 0x09, 0xAE, + 0x0B, 0xB6, 0x7A, 0x2A, 0x21, 0x28, 0x7C, 0x00, 0xC2, 0xE0, 0x56, 0xE0, + 0xC2, 0xE0, 0x20, 0x2C, 0x7E, 0x00, 0xC2, 0xE0, 0x78, 0x00, 0xC2, 0xE0, + 0xFE, 0xA2, 0x7D, 0x00, 0x9F, 0x08, 0x1E, 0xE4, 0x79, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0x1F, 0x4C, 0x20, 0xAE, 0x1A, 0x28, 0xDD, 0x2A, 0x76, 0x00, + 0xC0, 0xE0, 0x76, 0x00, 0x76, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x23, 0xAE, + 0x29, 0xAE, 0xF1, 0x2A, 0x76, 0x00, 0xC0, 0xE0, 0x4A, 0xC8, 0x76, 0x00, + 0xC2, 0xE0, 0x56, 0xE0, 0xC2, 0xE0, 0x56, 0xE0, 0x20, 0xAE, 0x4D, 0xC8, + 0x74, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x53, 0x00, 0x2E, 0xE4, 0x6A, 0xE1, + 0xD9, 0x15, 0x1E, 0xE4, 0x2E, 0x28, 0x5B, 0xF0, 0x30, 0x2A, 0x00, 0xA2, + 0x00, 0xCF, 0x20, 0xA9, 0x0C, 0xAE, 0x1A, 0xE0, 0x04, 0x00, 0x90, 0xD1, + 0x00, 0x00, 0x99, 0xD1, 0x00, 0xA2, 0x2E, 0xE4, 0xF8, 0xF7, 0x20, 0xCB, + 0x80, 0xD1, 0x00, 0x00, 0x99, 0xD1, 0xAE, 0x3C, 0x20, 0xCB, 0x04, 0x00, + 0x90, 0xD1, 0x00, 0x00, 0xF0, 0xB7, 0x9E, 0x15, 0x1E, 0xE4, 0xF8, 0xF7, + 0x00, 0x01, 0x02, 0xE0, 0x3E, 0xBA, 0x28, 0xE4, 0x30, 0xF0, 0x3E, 0xA1, + 0xAA, 0x07, 0x04, 0xE4, 0x04, 0xE4, 0x02, 0xA1, 0xAA, 0x07, 0x0E, 0xE4, + 0x90, 0xF0, 0x0F, 0x00, 0x02, 0xE0, 0xAA, 0x07, 0xF1, 0x28, 0x53, 0x0A, + 0x1E, 0xE4, 0x7E, 0xBA, 0x61, 0x07, 0x0E, 0xE4, 0xAD, 0x07, 0x08, 0xE4, + 0x7E, 0xBA, 0x68, 0xF0, 0x81, 0x00, 0x02, 0xE0, 0x61, 0x07, 0x0E, 0xE4, + 0x2B, 0x0A, 0x1E, 0xE4, 0x1E, 0xE4, 0x7E, 0xBA, 0x68, 0xF0, 0x04, 0xA1, + 0x02, 0xA1, 0x61, 0x07, 0x0E, 0xE4, 0xBD, 0x0D, 0x53, 0x0B, 0x1E, 0xE4, + 0x7E, 0xBA, 0x68, 0xF0, 0x68, 0xF0, 0x04, 0xA1, 0x61, 0x07, 0x0E, 0xE4, + 0x0E, 0xE4, 0x32, 0x0A, 0x1E, 0xE4, 0x7E, 0xBA, 0x2E, 0xE4, 0x28, 0xF0, + 0x02, 0xA1, 0x61, 0x07, 0x61, 0x07, 0x0B, 0xE4, 0x74, 0x2A, 0x7E, 0xBA, + 0x7E, 0xBA, 0x61, 0x07, 0x08, 0xE4, 0x1A, 0xA1, 0x0E, 0xE4, 0x7E, 0xBA, + 0x61, 0x07, 0x0E, 0xE4, 0xE9, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x61, 0x07, + 0x46, 0x3C, 0x3F, 0x3C, 0xD6, 0x3C, 0xE5, 0x3C, 0xFA, 0xA2, 0x1B, 0x3C, + 0xFC, 0xA2, 0xBE, 0x3C, 0xF1, 0x3C, 0x1F, 0x3C, 0x00, 0xA2, 0x1C, 0x3C, + 0x1E, 0xE4, 0x4C, 0x12, 0x1E, 0xE4, 0x2E, 0xE4, 0xC0, 0xE0, 0xF8, 0xF7, + 0x28, 0xCA, 0x4C, 0x01, 0x00, 0x05, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0x00, + 0x03, 0x00, 0x13, 0xD1, 0xC4, 0x00, 0x12, 0xD1, 0x80, 0x01, 0x00, 0xE0, + 0xF9, 0xF7, 0x29, 0xCA, 0x11, 0xD1, 0x20, 0xCE, 0x80, 0x00, 0x00, 0xE0, + 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x04, 0xA2, 0xF9, 0xF7, + 0x29, 0xCA, 0x03, 0x00, 0x1E, 0xE4, 0x22, 0x04, 0x1E, 0xE4, 0x01, 0xA2, + 0xC0, 0xE0, 0x04, 0x08, 0x0B, 0xE4, 0xCE, 0x03, 0x00, 0xE0, 0x80, 0x01, + 0x00, 0xE0, 0x42, 0x00, 0x20, 0xCE, 0x80, 0x01, 0x00, 0xE0, 0x80, 0x00, + 0xC0, 0x00, 0x12, 0xD1, 0x00, 0x05, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, + 0x03, 0x00, 0x13, 0xD1, 0x11, 0xD1, 0x20, 0xCE, 0x80, 0x01, 0x00, 0xE0, + 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x04, 0xA2, 0xF9, 0xF7, + 0x29, 0xCA, 0x03, 0x00, 0x22, 0x04, 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, + 0xCE, 0x03, 0x1E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x4D, 0x3C, + 0x02, 0xAF, 0x2B, 0xF0, 0x6E, 0x00, 0xC0, 0xE0, 0x62, 0x3C, 0x61, 0x00, + 0x3A, 0x04, 0x1E, 0xE4, 0xF1, 0x01, 0x1E, 0xE4, 0x1E, 0xE4, 0x4B, 0x08, + 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0x1A, 0x3C, 0x00, 0xA2, 0x29, 0x14, + 0x4D, 0x28, 0x12, 0x03, 0x67, 0xE1, 0x19, 0x3C, 0x25, 0x08, 0x84, 0xE1, + 0x44, 0xCC, 0x02, 0xA1, 0x2E, 0xE4, 0x90, 0xE1, 0x17, 0x3D, 0x08, 0xA2, + 0xC2, 0xE0, 0x7A, 0x3C, 0x21, 0x3C, 0xFE, 0xA2, 0x2E, 0xE4, 0x7A, 0x00, + 0xC2, 0xE0, 0x79, 0x00, 0x66, 0xF1, 0x50, 0x28, 0xF0, 0x3C, 0x3C, 0xA2, + 0x51, 0x28, 0x30, 0xF1, 0x78, 0x00, 0x02, 0xE0, 0xE0, 0xF0, 0x78, 0x00, + 0x02, 0xE0, 0x16, 0xF1, 0xA0, 0xF0, 0xE0, 0x1F, 0x02, 0xE0, 0x52, 0x28, + 0x48, 0xF0, 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x02, 0xA2, 0x38, 0xF0, + 0x9E, 0x15, 0x1E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, + 0x73, 0x3C, 0x72, 0x3C, 0x4B, 0x3C, 0x4A, 0x3C, 0xA5, 0x3C, 0xA4, 0x3C, + 0xA2, 0x3C, 0xFE, 0xA2, 0xA3, 0x3C, 0xFC, 0xA2, 0xA1, 0x3C, 0xA0, 0x3C, + 0x74, 0x3C, 0xA7, 0x3C, 0x6D, 0x3C, 0x00, 0xA2, 0x1F, 0xC7, 0x12, 0x03, + 0x61, 0xE1, 0x08, 0xA2, 0x06, 0x3C, 0xA7, 0x28, 0x2E, 0xE4, 0x11, 0x3D, + 0x92, 0xE0, 0x12, 0x03, 0x00, 0xE0, 0x06, 0x28, 0x02, 0xA0, 0x06, 0x28, + 0xDA, 0xF0, 0x01, 0x29, 0x00, 0xA2, 0x38, 0xF0, 0x4D, 0x18, 0x06, 0x3C, + 0x18, 0xF7, 0xA7, 0x18, 0x06, 0x28, 0x06, 0x3C, 0x52, 0xB6, 0x08, 0xA2, + 0x2E, 0xE4, 0xFE, 0xA2, 0xA7, 0x3C, 0x02, 0xA0, 0x06, 0x28, 0x01, 0x3D, + 0xA7, 0x3C, 0x00, 0xA2, 0x38, 0xF0, 0x4D, 0x18, 0x00, 0xE0, 0x24, 0xE4, + 0x2E, 0xE4, 0x06, 0x28, 0x01, 0x3D, 0x00, 0xA2, 0x92, 0xE0, 0x12, 0x03, + 0x92, 0xE0, 0x12, 0x03, 0x00, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x01, 0x3D, + 0x56, 0xE0, 0x01, 0x29, 0x01, 0x29, 0x92, 0xE0, 0x12, 0x03, 0x00, 0xE0, + 0x24, 0xE4, 0x2E, 0xE4, 0x01, 0x3D, 0x06, 0xA8, 0x01, 0x29, 0x92, 0xE0, + 0x12, 0x03, 0x00, 0xE0, 0x04, 0xE0, 0x2E, 0xE4, 0x01, 0x3D, 0x0A, 0xA8, + 0x54, 0x00, 0x04, 0xE0, 0x9E, 0xE0, 0x12, 0x03, 0x44, 0xCC, 0x02, 0xA1, + 0x4D, 0x28, 0x9C, 0xE0, 0xB3, 0x08, 0x84, 0xE1, 0x06, 0x3C, 0x00, 0xA2, + 0x06, 0x5A, 0x03, 0xA8, 0x05, 0xAF, 0x17, 0x2B, 0x06, 0x3E, 0x03, 0xA0, + 0x06, 0x2A, 0x56, 0xE0, 0x12, 0x03, 0x61, 0xE1, 0x2E, 0xE4, 0x06, 0x9F, + 0x00, 0xA2, 0x44, 0xCC, 0x02, 0xA1, 0x4D, 0x28, 0x0D, 0xA8, 0x11, 0x2B, + 0xC1, 0x08, 0x84, 0xE1, 0x1A, 0xE0, 0x4D, 0x18, 0x42, 0xE0, 0x1B, 0xE0, + 0x04, 0xE0, 0x06, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA1, 0x4D, 0x28, + 0x9C, 0xE0, 0x54, 0x00, 0x06, 0x9E, 0xD8, 0x08, 0x84, 0xE1, 0x44, 0xCC, + 0x06, 0x28, 0x48, 0xF0, 0x02, 0xA8, 0x06, 0x5C, 0x03, 0xA0, 0x06, 0x2A, + 0x90, 0x08, 0x12, 0xE4, 0x08, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x06, 0x3E, + 0x3C, 0x3C, 0x00, 0xA2, 0xF0, 0x3C, 0x3E, 0xA2, 0x04, 0x00, 0x99, 0xD1, + 0x03, 0x00, 0x30, 0xD1, 0x9E, 0x15, 0x1E, 0xE4, 0x04, 0x00, 0x90, 0xD1, + 0xB8, 0xF7, 0x20, 0xCB, 0x32, 0xCF, 0x08, 0xA9, 0x34, 0x09, 0x08, 0xE4, + 0x9E, 0x15, 0x1E, 0xE4, 0xBA, 0xF2, 0x02, 0xA1, 0x08, 0xAF, 0x32, 0xCB, + 0x02, 0xE0, 0x3E, 0xBA, 0x5A, 0xF3, 0x02, 0xA1, 0x1E, 0xE4, 0x7E, 0xBA, + 0x58, 0xF0, 0xB0, 0x01, 0x02, 0xE0, 0x3E, 0xBA, 0x7E, 0xF6, 0x2B, 0x0A, + 0x02, 0xE0, 0x3E, 0xBA, 0x76, 0xF1, 0x1F, 0x01, 0x0F, 0x00, 0x00, 0xE0, + 0x50, 0xF1, 0x2F, 0x01, 0x53, 0x0A, 0x1E, 0xE4, 0x7E, 0xBA, 0x24, 0xF1, + 0x9D, 0xF2, 0x3C, 0x3C, 0x1A, 0xB6, 0x02, 0xA2, 0x35, 0x3C, 0x34, 0x3C, + 0x30, 0x3C, 0x00, 0xA2, 0xDE, 0xF4, 0x2E, 0x3C, 0x37, 0x3C, 0x36, 0x3C, + 0x28, 0xE4, 0x3C, 0x28, 0xBE, 0xF4, 0x7E, 0xBA, 0x67, 0x00, 0xC0, 0xE0, + 0x7E, 0xF4, 0x7E, 0xBA, 0x6A, 0xBA, 0x88, 0xF0, 0x02, 0xA8, 0x10, 0xAF, + 0x02, 0xA2, 0x2D, 0xF1, 0x46, 0x0C, 0x1E, 0xE4, 0xF0, 0x3C, 0x3E, 0xA2, + 0x2E, 0xE4, 0x30, 0x3C, 0x0A, 0xE4, 0xF0, 0x0E, 0x1E, 0xE4, 0x60, 0xBA, + 0x2E, 0xE4, 0x30, 0x3C, 0x02, 0xA2, 0xE4, 0x08, 0xF0, 0x3C, 0x3E, 0xA2, + 0x28, 0xE4, 0x3C, 0x28, 0xAE, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x6B, 0xE1, + 0x00, 0x00, 0x80, 0xD1, 0x00, 0x00, 0x99, 0xD1, 0xF8, 0xF7, 0x20, 0xCB, + 0x04, 0x00, 0x90, 0xD1, 0x28, 0xE4, 0xF0, 0xB7, 0x9E, 0x15, 0x1E, 0xE4, + 0x02, 0xE0, 0x7E, 0xBA, 0x20, 0x16, 0x1E, 0xE4, 0x20, 0xF0, 0x3E, 0xA1, + 0x44, 0xF3, 0x00, 0x01, 0x02, 0xE0, 0xF4, 0xF2, 0x02, 0xA1, 0x0E, 0xF7, + 0x53, 0x0A, 0x1E, 0xE4, 0x80, 0xF0, 0x0F, 0x00, 0x6D, 0xF2, 0x85, 0x09, + 0x08, 0xE4, 0xF1, 0x28, 0x48, 0xF0, 0x81, 0x00, 0x02, 0xE0, 0x4E, 0xF6, + 0x04, 0xA1, 0xEE, 0xF5, 0x2B, 0x0A, 0x1E, 0xE4, 0x9E, 0xF5, 0xBD, 0x0D, + 0x1E, 0xE4, 0x48, 0xF0, 0x53, 0x0B, 0x1E, 0xE4, 0x48, 0xF0, 0x02, 0xA1, + 0x1E, 0xE4, 0x48, 0xF0, 0x04, 0xA1, 0x4E, 0xF5, 0x78, 0xF0, 0x02, 0xA1, + 0xFE, 0xF4, 0x32, 0x0A, 0x5E, 0x0B, 0x1E, 0xE4, 0xBB, 0x0F, 0x1E, 0xE4, + 0x5B, 0xF4, 0x74, 0x2A, 0x2E, 0xE4, 0x9A, 0xF0, 0x7E, 0xBA, 0x40, 0x09, + 0x08, 0xE4, 0x1A, 0xA1, 0x6B, 0xE1, 0xC6, 0x0F, 0x1E, 0xE4, 0x0E, 0xF4, + 0xDD, 0x28, 0x2E, 0xE4, 0x6A, 0xE1, 0x2E, 0xE4, 0x1A, 0xE0, 0x2E, 0x28, + 0xDD, 0x3C, 0x02, 0xA8, 0x99, 0xD1, 0x00, 0xCF, 0x20, 0xA9, 0x0C, 0xAE, + 0x20, 0xCB, 0x04, 0x00, 0x90, 0xD1, 0x00, 0x00, 0xF0, 0xB7, 0x9E, 0x15, + 0x1E, 0xE4, 0xF8, 0xF7, 0x2E, 0x28, 0x20, 0x16, 0x1E, 0xE4, 0x28, 0xE4, + 0xBB, 0x0F, 0x1E, 0xE4, 0x60, 0xBA, 0x8A, 0xF0, 0x2E, 0xE4, 0x9A, 0xF0, + 0xF0, 0x0E, 0x1E, 0xE4, 0x1E, 0xE4, 0xBB, 0x0F, 0x1E, 0xE4, 0x6A, 0xBA, + 0x6A, 0xE1, 0x2E, 0xE4, 0x2D, 0xF0, 0x46, 0x0C, 0x1E, 0xE4, 0x9E, 0xF5, + 0x99, 0x15, 0x1E, 0xE4, 0x5E, 0xBA, 0x2E, 0xE4, 0x6B, 0xE1, 0xC6, 0x0F, + 0x48, 0x74, 0x48, 0x3C, 0x20, 0xA1, 0x60, 0x28, 0x48, 0x3C, 0xBE, 0x0E, + 0x1E, 0xE4, 0x52, 0x28, 0x34, 0xF0, 0x52, 0x18, 0x01, 0x3C, 0x48, 0x74, + 0x27, 0x3C, 0x48, 0xBA, 0x01, 0x3C, 0x52, 0x28, 0x01, 0xA2, 0x03, 0x0A, + 0x0A, 0xE4, 0x40, 0xBA, 0xC3, 0xE0, 0xE8, 0xF7, 0x31, 0xB4, 0x40, 0xBA, + 0x03, 0x0A, 0x0A, 0xE4, 0x40, 0xBA, 0x78, 0x00, 0x48, 0x3C, 0xBE, 0x0E, + 0x1E, 0xE4, 0x20, 0x2C, 0x79, 0x00, 0xC2, 0xE0, 0x2B, 0x3C, 0x48, 0x74, + 0x42, 0xBA, 0x03, 0x0A, 0x0A, 0xE4, 0x40, 0xBA, 0x3F, 0x3C, 0x16, 0xE0, + 0x06, 0xA1, 0x24, 0x3C, 0x9E, 0xE0, 0x20, 0x02, 0x00, 0xE0, 0x44, 0xBA, + 0xCA, 0xF1, 0x24, 0x28, 0x26, 0x3C, 0x07, 0x29, 0x02, 0xA1, 0x0C, 0x3C, + 0x28, 0x3C, 0x44, 0xBA, 0x29, 0x58, 0x02, 0xA2, 0x11, 0x3C, 0x29, 0x3C, + 0x24, 0x28, 0x12, 0x3C, 0x2A, 0x3C, 0x02, 0xA1, 0x0D, 0x3C, 0x44, 0xBA, + 0xE8, 0xF0, 0x04, 0xA1, 0x13, 0x58, 0x02, 0xA2, 0x13, 0x3C, 0x02, 0xA1, + 0x40, 0x00, 0x04, 0xE0, 0x14, 0x3C, 0x02, 0xA1, 0x01, 0x28, 0x0C, 0x4C, + 0x0C, 0xAE, 0x0D, 0x4C, 0x60, 0xBA, 0x28, 0xF0, 0x05, 0x3C, 0x2E, 0xE4, + 0xEA, 0xF1, 0x40, 0xBA, 0xF0, 0x3C, 0x24, 0xA2, 0x48, 0x3C, 0xA5, 0x0F, + 0x1E, 0xE4, 0x52, 0x28, 0x02, 0xE0, 0x52, 0x28, 0x01, 0x3E, 0x48, 0x76, + 0x58, 0xF0, 0x05, 0x28, 0x76, 0xF0, 0x2F, 0x06, 0xEA, 0xF0, 0x40, 0xBA, + 0xF0, 0x3C, 0x24, 0xA2, 0x27, 0x3C, 0x48, 0xBA, 0x38, 0xF0, 0x05, 0x28, + 0x6A, 0xF0, 0x40, 0xBA, 0xF0, 0x3C, 0x24, 0xA2, 0x01, 0x28, 0x42, 0xBA, + 0x28, 0xF0, 0x05, 0x28, 0x4E, 0xBA, 0x2E, 0xE4, 0xFE, 0xA2, 0x2E, 0xE4, + 0x1E, 0xE4, 0xD5, 0x3C, 0x00, 0xA2, 0xE0, 0x3C, 0x8A, 0xF0, 0x40, 0xBA, + 0x2E, 0xE4, 0xB8, 0x0D, 0x08, 0xA1, 0x24, 0xE4, 0x02, 0xA1, 0x46, 0xBA, + 0x46, 0xBA, 0x2A, 0xE4, 0x44, 0xBA, 0x20, 0xE4, 0x8A, 0xF0, 0x40, 0xBA, + 0x28, 0xE4, 0x02, 0xA1, 0x4A, 0xF0, 0x40, 0xBA, 0x40, 0xBA, 0x44, 0xBA, + 0x1E, 0xE4, 0x4E, 0xBA, 0x4E, 0xBA, 0x4E, 0xBA, 0xD5, 0x3C, 0x02, 0xA2, + 0x2A, 0xE4, 0x9E, 0x0E, 0x9E, 0x0E, 0x1E, 0xE4, 0xB8, 0x0D, 0x1E, 0xE4, + 0x02, 0xA2, 0x2E, 0xE4, 0x7E, 0xBA, 0x2A, 0xE4, 0xE1, 0x3C, 0x4E, 0xBA, + 0x40, 0xBA, 0x02, 0x3C, 0xF0, 0x3C, 0x02, 0xA2, 0xDA, 0xF0, 0x40, 0xBA, + 0x51, 0x0B, 0x04, 0xE4, 0x02, 0xA1, 0x46, 0xBA, 0x0A, 0xA0, 0x51, 0x0B, + 0x00, 0xE4, 0x08, 0xA1, 0xE2, 0x3C, 0x46, 0xBA, 0x44, 0xBA, 0x02, 0x3C, + 0xF0, 0x3C, 0x04, 0xA2, 0xB8, 0xF0, 0x1E, 0xA1, 0xF0, 0x3C, 0x06, 0xA2, + 0x7A, 0x3C, 0x4E, 0xBA, 0x7A, 0x3E, 0x7A, 0x4E, 0x11, 0xAE, 0x4F, 0xBA, + 0xF0, 0x3C, 0x08, 0xA2, 0x5A, 0xF2, 0x40, 0xBA, 0x51, 0x0B, 0x08, 0xE4, + 0x02, 0xA1, 0x42, 0xBA, 0x5C, 0xBA, 0xCA, 0xF1, 0x40, 0xBA, 0x40, 0xBA, + 0x0A, 0xE4, 0x40, 0xBA, 0xF0, 0x3C, 0x0A, 0xA2, 0x0A, 0xE4, 0x40, 0xBA, + 0x5C, 0xBA, 0x51, 0x0B, 0x0A, 0xE4, 0x40, 0xBA, 0x5C, 0xBA, 0x51, 0x0B, + 0x0A, 0xA2, 0x54, 0xBA, 0x44, 0xBA, 0x51, 0x0B, 0x51, 0x0B, 0x0A, 0xE4, + 0x40, 0xBA, 0xF0, 0x3C, 0x40, 0xBA, 0xF0, 0x3C, 0x0A, 0xA2, 0x5C, 0xBA, + 0xF0, 0x3C, 0x0C, 0xA2, 0x51, 0x0B, 0x0A, 0xE4, 0x0A, 0xA2, 0x51, 0x0B, + 0x08, 0xE4, 0x42, 0xBA, 0x51, 0x0B, 0x0A, 0xE4, 0x40, 0xBA, 0xF0, 0x3C, + 0xF0, 0x3C, 0x0E, 0xA2, 0x21, 0x3C, 0xFE, 0xA2, 0x20, 0x3C, 0x51, 0x0B, + 0x0A, 0xE4, 0x5E, 0xBA, 0x02, 0xA1, 0xBE, 0x0E, 0x1E, 0xE4, 0x20, 0x2C, + 0x3D, 0x3C, 0x02, 0xA0, 0x00, 0xA2, 0x22, 0xF0, 0x40, 0xBA, 0x40, 0xBA, + 0xF0, 0x3C, 0x0A, 0xA2, 0xF0, 0x3C, 0x10, 0xA2, 0xC1, 0x0A, 0x0A, 0xE4, + 0x21, 0x3C, 0x51, 0x0B, 0x0A, 0xE4, 0x3D, 0x74, 0x0A, 0xA2, 0x21, 0x3C, + 0x02, 0xA2, 0x3E, 0xF0, 0x51, 0x0B, 0x0A, 0xE4, 0x40, 0xBA, 0xF0, 0x3C, + 0x45, 0xE0, 0x5B, 0xF0, 0x09, 0x2A, 0x58, 0xBA, 0x09, 0x3C, 0xF1, 0x3E, + 0x03, 0xA2, 0x3B, 0xF0, 0x0A, 0xA2, 0x50, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x0A, 0x2A, 0x58, 0xBA, 0x41, 0xBA, 0xF0, 0x3C, 0x03, 0xA2, 0x3B, 0xF0, + 0x45, 0xE0, 0x5B, 0xF0, 0x08, 0xAF, 0x1E, 0xA0, 0x0A, 0x3C, 0xF1, 0x3E, + 0x50, 0x0B, 0x08, 0xE4, 0xF1, 0x28, 0x51, 0x3C, 0x0A, 0xE4, 0x40, 0xBA, + 0xF0, 0x3C, 0x0A, 0xA2, 0x12, 0xA2, 0xAD, 0x3C, 0x40, 0xBA, 0x51, 0x0B, + 0x51, 0x0B, 0x0A, 0xE4, 0x40, 0xBA, 0xF0, 0x3C, 0x52, 0xB6, 0x36, 0xB6, + 0x03, 0xA1, 0x02, 0x2A, 0x48, 0x76, 0xF0, 0x3E, 0x15, 0xA2, 0x48, 0x3C, + 0xF0, 0x3C, 0x14, 0xA2, 0x5A, 0xF0, 0xC0, 0x28, 0x03, 0xA1, 0x8B, 0xF1, + 0x51, 0x0B, 0x09, 0xE4, 0x4A, 0xE0, 0x03, 0xA1, 0x51, 0x0B, 0x0B, 0xE4, + 0x0B, 0xE4, 0x03, 0xA1, 0xC1, 0x3C, 0x16, 0xE0, 0x42, 0xBA, 0xC2, 0x3C, + 0x4A, 0xBA, 0x51, 0x0B, 0xC2, 0x28, 0xC3, 0x3C, 0x40, 0xBA, 0xC4, 0x3C, + 0xF0, 0x3C, 0x14, 0xA2, 0x54, 0xF0, 0x04, 0xA1, 0xF0, 0x3C, 0x16, 0xA2, + 0x51, 0x0B, 0x0E, 0xE4, 0x40, 0xBA, 0x51, 0x0B, 0x08, 0xE4, 0x40, 0xBA, + 0x18, 0xE4, 0x40, 0xBA, 0x7A, 0xF0, 0x0E, 0x3C, 0xDC, 0x0E, 0x18, 0xE4, + 0x40, 0xBA, 0xC8, 0x0E, 0x2A, 0x0B, 0x0A, 0xE4, 0x02, 0xA1, 0x02, 0x28, + 0xF0, 0x3C, 0x18, 0xA2, 0x18, 0x3C, 0x40, 0xBA, 0x40, 0xBA, 0x51, 0x0B, + 0x0A, 0xE4, 0x40, 0xBA, 0x35, 0x0B, 0x0A, 0xE4, 0x22, 0x3C, 0x40, 0xBA, + 0x02, 0xA1, 0x02, 0x28, 0x23, 0x3C, 0x40, 0xBA, 0x3A, 0xF0, 0x40, 0xBA, + 0x3F, 0x0B, 0x0A, 0xE4, 0x2C, 0x3C, 0x40, 0xBA, 0x40, 0xBA, 0x42, 0xBA, + 0x08, 0xE4, 0x40, 0xBA, 0xF0, 0x3C, 0x1A, 0xA2, 0xAA, 0xF0, 0x9E, 0x0E, + 0x1E, 0xE4, 0x51, 0x0B, 0xB8, 0x0D, 0x1E, 0xE4, 0xD5, 0x3C, 0x04, 0xA2, + 0x52, 0x3C, 0x18, 0xE0, 0x51, 0x82, 0x50, 0x84, 0x62, 0xBA, 0x2E, 0xE4, + 0x6B, 0xE1, 0x2E, 0xE4, 0x9E, 0x0E, 0x1E, 0xE4, 0x40, 0xBA, 0x40, 0xBA, + 0x1E, 0xE4, 0xD5, 0x3C, 0x06, 0xA2, 0x2A, 0xE4, 0xAE, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0xB8, 0x0D, 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0xAC, 0x3C, + 0xDD, 0x3C, 0x02, 0xA8, 0xDD, 0x28, 0x48, 0xF0, 0x16, 0xE0, 0x06, 0xA1, + 0x24, 0x3C, 0x42, 0xBA, 0x31, 0xB4, 0x40, 0xBA, 0x01, 0xA2, 0x3F, 0x3C, + 0x78, 0x00, 0xC3, 0xE0, 0x00, 0x3E, 0xE8, 0xF7, 0x3D, 0x28, 0x41, 0x0C, + 0x0A, 0xE4, 0x40, 0xBA, 0x49, 0x3C, 0x02, 0xA0, 0x3D, 0x28, 0x8A, 0xF0, + 0xCE, 0xF1, 0x2A, 0xF0, 0x02, 0xA8, 0x49, 0x78, 0x3D, 0x3C, 0x02, 0xA2, + 0x44, 0xCC, 0x1C, 0xA2, 0x02, 0xA1, 0x24, 0x28, 0x9A, 0x0B, 0x84, 0xE1, + 0x49, 0x3C, 0x0A, 0xA0, 0x3D, 0x28, 0x9A, 0xF0, 0xCA, 0xF0, 0x30, 0xA1, + 0x3E, 0xA8, 0x49, 0x78, 0x49, 0x3C, 0x0C, 0xA0, 0x3D, 0x28, 0x8E, 0xF0, + 0x4A, 0xF0, 0x60, 0xA1, 0x6E, 0xA8, 0x49, 0x78, 0x3D, 0x74, 0x3D, 0x3C, + 0x02, 0xA0, 0x3D, 0x28, 0x24, 0x28, 0x79, 0x00, 0xC2, 0xE0, 0x2B, 0x3C, + 0xA8, 0x3C, 0xA9, 0x28, 0xFA, 0xF0, 0x04, 0xA1, 0x20, 0x82, 0xA9, 0x84, + 0xA9, 0x3C, 0x00, 0x08, 0xB0, 0x28, 0x4E, 0x3C, 0x2B, 0x08, 0x18, 0xE0, + 0xEE, 0xF1, 0xB0, 0x3C, 0x4E, 0x28, 0xAF, 0x3C, 0x00, 0x84, 0x00, 0x3C, + 0x00, 0x08, 0xA8, 0x28, 0x4E, 0x3C, 0x2B, 0x08, 0x18, 0xE0, 0x20, 0x82, + 0xAF, 0x18, 0x4E, 0x28, 0x48, 0xF0, 0xB2, 0x28, 0xB2, 0x7C, 0x0F, 0xC7, + 0xAF, 0x28, 0xB2, 0x3C, 0xB2, 0x7C, 0x0F, 0xC7, 0xB0, 0x28, 0x00, 0x3C, + 0x4E, 0x28, 0xB3, 0x3C, 0x02, 0xAE, 0x00, 0x18, 0x02, 0xAE, 0x00, 0x18, + 0xB2, 0x7C, 0x0F, 0xC7, 0x41, 0x0C, 0x0A, 0xE4, 0x40, 0xBA, 0xB4, 0x3C, + 0x3F, 0x0C, 0x0A, 0xE4, 0x2D, 0x3C, 0x40, 0xBA, 0x02, 0xA1, 0x24, 0x28, + 0x25, 0x3C, 0x00, 0xA2, 0xC1, 0x28, 0x58, 0xF0, 0x04, 0xA1, 0x5A, 0xF0, + 0x2C, 0x28, 0x25, 0x3C, 0x40, 0xBA, 0x3A, 0xF0, 0x42, 0xF0, 0x04, 0xA1, + 0x24, 0x28, 0x7A, 0xF0, 0x44, 0xBA, 0x41, 0x0C, 0x08, 0xE4, 0x40, 0xBA, + 0x07, 0x29, 0x9E, 0xE0, 0x20, 0x02, 0x00, 0xE0, 0x40, 0xBA, 0x5A, 0xF0, + 0xAD, 0x28, 0x26, 0x3C, 0x3F, 0x28, 0xAC, 0x3C, 0x40, 0xBA, 0xAE, 0x3C, + 0x52, 0xE0, 0x1B, 0xE0, 0xC2, 0x2A, 0xC1, 0x44, 0x22, 0xD0, 0xB2, 0x03, + 0x62, 0xE1, 0x3A, 0xF2, 0x3C, 0xB8, 0x13, 0x0C, 0x84, 0xE1, 0x01, 0x00, + 0x02, 0xA1, 0xEA, 0xF0, 0x41, 0x0C, 0x0D, 0xE4, 0x05, 0xA2, 0x78, 0xF0, + 0x40, 0xBA, 0x00, 0x3C, 0x46, 0xE0, 0x00, 0x74, 0x03, 0xA1, 0x00, 0x5A, + 0x56, 0xE0, 0x00, 0x76, 0x00, 0x58, 0x4E, 0xF0, 0x41, 0x0C, 0x0A, 0xE4, + 0x40, 0xBA, 0x12, 0x3D, 0x0D, 0xE4, 0x3E, 0xB8, 0x6A, 0xF0, 0xC3, 0x28, + 0x48, 0xBA, 0x00, 0x74, 0x00, 0x3C, 0x41, 0x0C, 0x3F, 0x0C, 0x0A, 0xE4, + 0x24, 0x28, 0x27, 0x3C, 0x0A, 0xE4, 0x0C, 0x3C, 0x28, 0x3C, 0x44, 0xBA, + 0x11, 0x3C, 0x29, 0x3C, 0x02, 0xA1, 0x41, 0x0C, 0x2A, 0x3C, 0x02, 0xA1, + 0x29, 0x58, 0x02, 0xA2, 0x08, 0xF1, 0x04, 0xA1, 0x24, 0x28, 0x12, 0x3C, + 0x41, 0x0C, 0x0A, 0xE4, 0x0D, 0x3C, 0x44, 0xBA, 0x13, 0x58, 0x02, 0xA2, + 0x13, 0x3C, 0x02, 0xA1, 0x40, 0x00, 0x04, 0xE0, 0x14, 0x3C, 0x02, 0xA1, + 0x02, 0xA2, 0x0C, 0x4C, 0x0C, 0xAE, 0x0D, 0x4C, 0xDD, 0x3C, 0x02, 0xA9, + 0xDD, 0x28, 0x2E, 0xE4, 0x2B, 0x3C, 0x4E, 0xBA, 0x2E, 0xE4, 0x00, 0xA2, + 0x0A, 0xE4, 0x40, 0xBA, 0xF0, 0x3C, 0x02, 0xA2, 0x40, 0xBA, 0xF0, 0x3C, + 0x04, 0xA2, 0x6E, 0x0D, 0x40, 0xBA, 0x40, 0xBA, 0x6E, 0x0D, 0x08, 0xE4, + 0x0E, 0xA1, 0x02, 0x3C, 0x44, 0xBA, 0x40, 0xBA, 0x24, 0x3C, 0x40, 0xBA, + 0x7A, 0x0C, 0x0A, 0xE4, 0xF0, 0x3C, 0x08, 0xA2, 0x39, 0x3C, 0x40, 0xBA, + 0x48, 0xBA, 0x6E, 0x0D, 0x08, 0xE4, 0x44, 0xBA, 0x40, 0xBA, 0xF0, 0x3C, + 0x04, 0xA2, 0x27, 0x3C, 0xF0, 0x3C, 0x0A, 0xA2, 0x6E, 0x0D, 0x08, 0xE4, + 0x6E, 0x0D, 0x0A, 0xE4, 0xA7, 0x0E, 0x1E, 0xE4, 0x36, 0x3C, 0x35, 0x3C, + 0x34, 0x3C, 0x00, 0xA2, 0x38, 0x3C, 0x25, 0x3C, 0x3A, 0x3C, 0x37, 0x3C, + 0x3A, 0x3C, 0x02, 0xA2, 0x2D, 0x0D, 0x0E, 0xE4, 0xF0, 0x3C, 0x0C, 0xA2, + 0x02, 0x3C, 0x00, 0xA2, 0x00, 0xE4, 0x02, 0xA1, 0x03, 0x3C, 0x44, 0xBA, + 0x44, 0xBA, 0xAF, 0x0C, 0x04, 0xE4, 0x6E, 0x0D, 0x1E, 0xE4, 0x5A, 0xF0, + 0x0C, 0xA1, 0x02, 0x3C, 0x40, 0xBA, 0x6E, 0x0D, 0x0A, 0xE4, 0xA7, 0x0E, + 0x10, 0xA2, 0x39, 0x3C, 0x40, 0xBA, 0x38, 0x3C, 0x6E, 0x0D, 0x08, 0xE4, + 0x42, 0xBA, 0xF0, 0x3C, 0x35, 0x3C, 0x40, 0xBA, 0x34, 0x3C, 0x40, 0xBA, + 0xF0, 0x3C, 0x12, 0xA2, 0x36, 0x3C, 0x40, 0xBA, 0x40, 0xBA, 0x6E, 0x0D, + 0x08, 0xE4, 0x44, 0xBA, 0x40, 0xBA, 0xF0, 0x3C, 0x02, 0xA2, 0x37, 0x3C, + 0xF0, 0x3C, 0x04, 0xA2, 0x6E, 0x0D, 0x0A, 0xE4, 0x14, 0xA2, 0x6E, 0x0D, + 0x08, 0xE4, 0x44, 0xBA, 0x00, 0xE4, 0x02, 0xA1, 0x44, 0xBA, 0xF0, 0x3C, + 0x16, 0xA2, 0x24, 0x3C, 0x02, 0xA0, 0x6E, 0x0D, 0x6E, 0x0D, 0x08, 0xE4, + 0x42, 0xBA, 0xF0, 0x3C, 0xF0, 0x3C, 0x18, 0xA2, 0x25, 0x3C, 0x40, 0xBA, + 0x6E, 0x0D, 0x08, 0xE4, 0x02, 0xA1, 0x44, 0xBA, 0x08, 0xE4, 0x40, 0xBA, + 0xF0, 0x3C, 0x1A, 0xA2, 0x48, 0xF2, 0x0C, 0xA1, 0x02, 0x28, 0x6E, 0x0D, + 0xF0, 0x3C, 0x1C, 0xA2, 0x2A, 0xF2, 0x03, 0x28, 0x0A, 0xE4, 0xE2, 0x3C, + 0x7A, 0x3C, 0x46, 0xBA, 0x04, 0xAE, 0x02, 0xA0, 0x50, 0xBA, 0x6E, 0x0D, + 0x09, 0x3C, 0xDB, 0x0C, 0x0B, 0xE4, 0x09, 0x2A, 0x50, 0xBA, 0x6E, 0x0D, + 0x0A, 0xE4, 0x40, 0xBA, 0xE4, 0x0C, 0x0B, 0xE4, 0x0A, 0x2A, 0x04, 0xAE, + 0x08, 0xAF, 0x1E, 0xA0, 0x09, 0x28, 0x0A, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x0A, 0x28, 0x50, 0x3C, 0x7A, 0x28, 0x7D, 0x0F, 0x1E, 0xE4, 0x51, 0x3C, + 0x4E, 0xBA, 0xB8, 0xF0, 0x1E, 0xA1, 0xDA, 0xF0, 0x4E, 0xBA, 0x6E, 0x0D, + 0x0A, 0xE4, 0x7A, 0x3C, 0x7A, 0x4C, 0x10, 0xAE, 0x6E, 0x0D, 0x0A, 0xE4, + 0x3A, 0xF1, 0x03, 0x44, 0x38, 0x28, 0x7A, 0x3C, 0x00, 0xE0, 0x40, 0xBA, + 0xF0, 0x3C, 0x1E, 0xA2, 0x6E, 0x0D, 0x0B, 0xE4, 0x4D, 0xBA, 0xE8, 0x03, + 0x77, 0x1B, 0x04, 0xE0, 0x20, 0x3E, 0x21, 0x3C, 0x0F, 0xC7, 0x40, 0x00, + 0x0A, 0xE0, 0x10, 0xAE, 0x5A, 0xF0, 0x38, 0x28, 0x20, 0x3C, 0x20, 0x7C, + 0x2B, 0x3C, 0x2B, 0x4C, 0x10, 0xAE, 0x42, 0xBA, 0x40, 0xBA, 0x9A, 0xF0, + 0x03, 0x44, 0x39, 0x28, 0xF0, 0x3C, 0x20, 0xA2, 0x68, 0xF0, 0x3B, 0x3C, + 0x36, 0x28, 0x6E, 0x0D, 0x0A, 0xE4, 0x40, 0xBA, 0xF0, 0x3C, 0x22, 0xA2, + 0x6A, 0xF0, 0x03, 0x44, 0x48, 0xBA, 0x6E, 0x0D, 0x08, 0xE4, 0x42, 0xBA, + 0x4E, 0xBA, 0x3A, 0xF0, 0x40, 0xBA, 0x27, 0x3C, 0x18, 0xE0, 0x51, 0x82, + 0x50, 0x84, 0xDE, 0xF7, 0x02, 0xA2, 0x5A, 0xF0, 0x36, 0x28, 0x52, 0x3C, + 0x38, 0x28, 0x44, 0xF3, 0x05, 0x0A, 0x1E, 0xE4, 0x21, 0x3C, 0xE9, 0x03, + 0x04, 0xE0, 0x78, 0xF0, 0x00, 0xA2, 0x20, 0x3C, 0x30, 0x75, 0x04, 0xE0, + 0x28, 0x3C, 0x02, 0xA2, 0x23, 0x3C, 0x22, 0x3C, 0x29, 0x3C, 0x00, 0xA2, + 0x2D, 0x3C, 0x0C, 0x3C, 0x07, 0x29, 0x20, 0x02, 0x67, 0xE1, 0x2A, 0x3C, + 0x3A, 0x28, 0xBA, 0xF1, 0x39, 0x28, 0x26, 0x3C, 0x3B, 0x28, 0x7E, 0xF1, + 0x00, 0xA2, 0x38, 0xF0, 0x2D, 0xA1, 0x50, 0x2A, 0x04, 0xA2, 0x5A, 0xF1, + 0x27, 0xF0, 0x2D, 0xA1, 0x02, 0xA0, 0x57, 0xF0, 0x51, 0x2A, 0x04, 0xA2, + 0x00, 0x3C, 0x02, 0xA0, 0x25, 0xA1, 0x02, 0xA0, 0x57, 0xF0, 0x25, 0xA1, + 0x00, 0x4C, 0x06, 0xAE, 0x02, 0xA0, 0x27, 0xF0, 0x2E, 0xE4, 0x6B, 0xE1, + 0x2E, 0xE4, 0x1E, 0xF0, 0x04, 0xE0, 0x3F, 0xBA, 0x30, 0x06, 0x64, 0xE1, + 0x58, 0x76, 0x0A, 0xE0, 0x20, 0xAE, 0x69, 0x44, 0x76, 0x58, 0x04, 0xE0, + 0xBA, 0xF0, 0x46, 0xE0, 0x46, 0xE0, 0x44, 0x69, 0x0A, 0xE0, 0x20, 0xAE, + 0x2E, 0xE4, 0xDC, 0x3C, 0x00, 0xA2, 0xCA, 0xF1, 0x14, 0x3D, 0x4E, 0xBA, + 0xDC, 0x3C, 0x0A, 0xA2, 0x14, 0x3D, 0x4E, 0xBA, 0x14, 0x3D, 0x4E, 0xBA, + 0x16, 0x3C, 0x02, 0xA2, 0x14, 0x3D, 0x4E, 0xBA, 0x2A, 0xF0, 0x6A, 0xA1, + 0x14, 0x3D, 0x4E, 0xBA, 0x00, 0xA2, 0x58, 0xF0, 0xD2, 0x28, 0x2E, 0xE4, + 0x2E, 0xE4, 0xD1, 0x3C, 0x02, 0xA2, 0xD3, 0x3C, 0x58, 0x00, 0x04, 0xE0, + 0xDC, 0x3C, 0x08, 0xA2, 0x14, 0x3D, 0x76, 0x00, 0x04, 0xE0, 0x14, 0x3D, + 0x04, 0xE0, 0x14, 0x3D, 0x69, 0x00, 0x04, 0xE0, 0xD2, 0x3C, 0x02, 0xA2, + 0x14, 0x3D, 0x44, 0x00, 0x18, 0xA1, 0x1E, 0xBA, 0xD1, 0x3C, 0x00, 0xA2, + 0x02, 0xA2, 0xD3, 0x3C, 0x00, 0xA2, 0x56, 0xF0, 0x2E, 0xE4, 0xD3, 0x3C, + 0x02, 0xA2, 0x2E, 0xE4, 0x28, 0xE4, 0xB2, 0x01, 0x02, 0xE0, 0x3E, 0xBA, + 0xE3, 0x2A, 0xDC, 0x3C, 0x00, 0xA2, 0x7E, 0xBA, 0x02, 0xA8, 0x0A, 0xAF, + 0x65, 0x00, 0xC0, 0xE0, 0x1E, 0xE4, 0xE5, 0x3C, 0x52, 0xE0, 0x17, 0xE0, + 0x08, 0xE4, 0xE3, 0x28, 0x9A, 0xF1, 0x70, 0x0D, 0x2E, 0xBA, 0x68, 0xF0, + 0x16, 0x28, 0xE5, 0x0D, 0xCE, 0xF7, 0x4E, 0xBA, 0x2A, 0xE4, 0x02, 0xA1, + 0x4E, 0xBA, 0x2A, 0xE4, 0x02, 0xA1, 0x2E, 0xBA, 0x02, 0xA2, 0xA8, 0xF7, + 0x70, 0x00, 0x02, 0xE0, 0x2E, 0xF0, 0x0F, 0x3C, 0x39, 0xF0, 0x10, 0x2A, + 0x28, 0xF0, 0xE3, 0x28, 0x3E, 0xF7, 0x15, 0x3C, 0x20, 0xA1, 0xD6, 0x28, + 0xE3, 0x2A, 0x2E, 0xE4, 0xCD, 0x0D, 0x0B, 0xE4, 0xE3, 0x3E, 0x15, 0xB6, + 0x02, 0xA1, 0x2E, 0xBA, 0x68, 0xF1, 0x16, 0x28, 0x03, 0xA8, 0xDC, 0x2A, + 0x4E, 0xBA, 0x4A, 0xF3, 0x3E, 0xF0, 0xDB, 0x3C, 0x10, 0xAE, 0x49, 0xF0, + 0x03, 0xA0, 0xDC, 0x2A, 0x14, 0x3D, 0xDB, 0x4C, 0x7F, 0x0E, 0x1B, 0xE4, + 0x0F, 0xA8, 0xDC, 0x3E, 0x2E, 0xBA, 0xCE, 0xF6, 0x6A, 0xF3, 0xE3, 0x28, + 0x02, 0xE0, 0x4E, 0xBA, 0xFA, 0xF1, 0x02, 0xA1, 0x49, 0xF0, 0x10, 0x2A, + 0x88, 0xF0, 0x70, 0x00, 0x03, 0xA2, 0x3E, 0xF0, 0x0F, 0x3E, 0x03, 0xA2, + 0xDC, 0x2A, 0x70, 0x00, 0x00, 0xE0, 0x15, 0x3E, 0xDB, 0x3C, 0x10, 0xAE, + 0x49, 0xF0, 0x03, 0xA8, 0xDC, 0x2A, 0x14, 0x3D, 0xDB, 0x4C, 0x3E, 0xF0, + 0x1B, 0xE4, 0x0F, 0xA8, 0xDC, 0x3E, 0x03, 0xA0, 0x0E, 0xF6, 0x5A, 0xF1, + 0xE3, 0x28, 0x7F, 0x0E, 0xDB, 0x28, 0x3B, 0xF0, 0x03, 0xA8, 0xDC, 0x2A, + 0x0E, 0xA8, 0xDC, 0x28, 0x11, 0xA2, 0x14, 0x3D, 0x6B, 0xF0, 0x03, 0xAF, + 0x45, 0xE0, 0xBA, 0xF0, 0x00, 0x86, 0x01, 0xA2, 0x00, 0x3E, 0x03, 0xA1, + 0x01, 0xA2, 0x7F, 0x0E, 0x1E, 0xE4, 0x14, 0x3F, 0x4E, 0xBA, 0x4A, 0xF0, + 0x02, 0xA1, 0x2E, 0xBA, 0x62, 0xE1, 0xE5, 0x3E, 0xBE, 0xF7, 0x03, 0xA2, + 0xDC, 0x28, 0x12, 0x3D, 0xD5, 0x28, 0x30, 0x06, 0x00, 0xA2, 0x12, 0x3D, + 0xE5, 0x28, 0x12, 0x3D, 0xD6, 0x28, 0x6B, 0x00, 0xC1, 0xE0, 0x12, 0x3D, + 0x06, 0xAF, 0x41, 0xE0, 0x06, 0xAE, 0x02, 0xA0, 0x80, 0xE1, 0xF8, 0xF7, + 0x28, 0xCA, 0xD6, 0x3C, 0x12, 0xD1, 0x30, 0x06, 0x11, 0xD1, 0x21, 0xCE, + 0xE1, 0xE1, 0x00, 0x00, 0x13, 0xD1, 0x04, 0x00, 0x00, 0xA2, 0x28, 0xE4, + 0xE3, 0x28, 0x81, 0xE1, 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0xD8, 0x3C, + 0x15, 0xAF, 0x02, 0xA8, 0x12, 0xAF, 0x65, 0x00, 0x4A, 0xF0, 0x56, 0xE0, + 0x16, 0xE0, 0x03, 0xA8, 0xD9, 0x28, 0x2E, 0xE4, 0xE3, 0x3C, 0x00, 0xA2, + 0x2A, 0xE4, 0x5D, 0x00, 0xC0, 0xE0, 0x5A, 0xF0, 0x0A, 0xE0, 0x5D, 0x00, + 0xC0, 0xE0, 0xBE, 0xF7, 0x02, 0xA2, 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x02, + 0xC0, 0xE0, 0x1E, 0xF7, 0xD9, 0x3C, 0x00, 0xCE, 0xD8, 0x08, 0x88, 0x00, + 0x00, 0xE0, 0x6B, 0x00, 0x20, 0xCE, 0x80, 0xE1, 0xF9, 0xF7, 0x29, 0xCA, + 0x04, 0x00, 0x12, 0xD1, 0x30, 0x06, 0x11, 0xD1, 0x81, 0xE1, 0xE1, 0xE1, + 0x00, 0x00, 0x13, 0xD1, 0xD8, 0x2A, 0xD7, 0x28, 0x30, 0x06, 0x64, 0xE1, + 0xD8, 0x3E, 0xD7, 0x3C, 0x11, 0xA0, 0x10, 0xA0, 0x00, 0xA2, 0x5F, 0x0E, + 0x1B, 0xE4, 0xDA, 0x1A, 0x99, 0x15, 0x1E, 0xE4, 0x2E, 0xE4, 0xD9, 0x3C, + 0x28, 0xE4, 0x16, 0xE0, 0x02, 0xA1, 0x2E, 0xBA, 0x02, 0x28, 0x2E, 0xE4, + 0xBE, 0xF7, 0x4E, 0xBA, 0x9E, 0xE0, 0x00, 0x02, 0x00, 0xE0, 0x04, 0xAE, + 0x09, 0x3C, 0x1B, 0xF0, 0x09, 0x2A, 0x17, 0x29, 0x0A, 0x2A, 0x17, 0x29, + 0x50, 0x3C, 0x08, 0xAF, 0x51, 0x3C, 0x08, 0xAF, 0x0A, 0x3C, 0x1B, 0xF0, + 0x31, 0x3C, 0x07, 0x29, 0x32, 0x3C, 0x17, 0x29, 0x01, 0xA2, 0x02, 0xA1, + 0x2E, 0xE4, 0x1A, 0xE0, 0xE8, 0xF7, 0x03, 0xA0, 0x02, 0xAF, 0x4A, 0xF0, + 0x2E, 0xE4, 0x02, 0xA2, 0x28, 0xE4, 0x4A, 0xE0, 0x32, 0x03, 0x65, 0xE1, + 0x40, 0x00, 0x04, 0xE0, 0x15, 0x3F, 0x00, 0x3E, 0x5B, 0xF0, 0x4F, 0xBA, + 0x02, 0xA1, 0x6A, 0xF0, 0xB0, 0xF7, 0x02, 0xA1, 0x15, 0x3F, 0x01, 0x86, + 0x00, 0x2A, 0x01, 0x3C, 0x2E, 0xE4, 0xAA, 0x3C, 0x02, 0xA9, 0xAA, 0x28, + 0x72, 0x03, 0x65, 0xE1, 0x40, 0x00, 0x04, 0xE0, 0x15, 0x3F, 0x00, 0x3E, + 0x5B, 0xF0, 0x4F, 0xBA, 0x02, 0xA1, 0x6A, 0xF0, 0xB0, 0xF7, 0x02, 0xA1, + 0x15, 0x3F, 0x01, 0x86, 0x00, 0x2A, 0x01, 0x3C, 0x2E, 0xE4, 0xAA, 0x3C, + 0x04, 0xA9, 0xAA, 0x28, 0x2F, 0x3C, 0x48, 0xBA, 0xF0, 0x3C, 0x2A, 0xA2, + 0x2C, 0xA2, 0x3E, 0x0F, 0x02, 0xE4, 0x04, 0xA1, 0x2F, 0x4C, 0x14, 0x04, + 0xC0, 0xE0, 0xF0, 0x3C, 0x2E, 0x3C, 0x02, 0xA2, 0x3E, 0x0F, 0x0A, 0xE4, + 0xF0, 0x3C, 0x2E, 0xA2, 0x2B, 0x3C, 0x4E, 0xBA, 0x3E, 0x0F, 0x00, 0xE4, + 0x0C, 0xA1, 0x44, 0xBA, 0x0A, 0xE4, 0x40, 0x0F, 0x1E, 0xE4, 0x08, 0xA0, + 0x02, 0xA1, 0x24, 0x3C, 0x42, 0xBA, 0x3E, 0x0F, 0x03, 0xA2, 0x46, 0xF0, + 0xBE, 0x3E, 0x01, 0xA2, 0x48, 0xBA, 0x40, 0xBA, 0xBE, 0x3E, 0x24, 0x3E, + 0x4E, 0xBA, 0x3A, 0xF0, 0x40, 0xBA, 0x27, 0x3C, 0x34, 0x3C, 0x39, 0x3C, + 0x00, 0xA2, 0xDE, 0xF7, 0x3A, 0x3C, 0x37, 0x3C, 0x36, 0x3C, 0x35, 0x3C, + 0x23, 0x3C, 0x22, 0x3C, 0x38, 0x3C, 0x25, 0x3C, 0x2D, 0x3C, 0x0C, 0x3C, + 0x28, 0x3C, 0x02, 0xA2, 0x26, 0x3C, 0x07, 0x29, 0x20, 0x02, 0x67, 0xE1, + 0x52, 0x3C, 0x18, 0xE0, 0x51, 0x82, 0x50, 0x84, 0x21, 0x3C, 0x02, 0xA2, + 0xE2, 0x3C, 0xFE, 0xA2, 0xF0, 0x3C, 0x00, 0xA2, 0x20, 0x3C, 0xFE, 0xA2, + 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x4E, 0xBA, 0x4A, 0xF0, + 0x02, 0xA0, 0x92, 0xF0, 0x5F, 0xBA, 0x5E, 0xBA, 0x8E, 0xF2, 0x4F, 0xBA, + 0x77, 0xF1, 0x45, 0xE0, 0x07, 0xA2, 0x5E, 0xF2, 0x9F, 0xE0, 0x00, 0x02, + 0x01, 0xE0, 0x05, 0xAE, 0x54, 0x0F, 0x0B, 0xE4, 0x09, 0x2A, 0x17, 0x29, + 0x0B, 0xE4, 0x0A, 0x2A, 0x17, 0x29, 0x09, 0x3C, 0x32, 0x3C, 0x17, 0x29, + 0x0A, 0x3C, 0x59, 0x0F, 0x51, 0x3C, 0x31, 0x3C, 0x07, 0x29, 0x50, 0x3C, + 0x04, 0xE0, 0x7B, 0xF0, 0x2E, 0xE4, 0x02, 0xA2, 0x0E, 0xE4, 0x78, 0x00, + 0x05, 0xE0, 0xA0, 0x00, 0x05, 0xE0, 0x40, 0x01, 0x04, 0xE0, 0x6D, 0x0F, + 0x1E, 0xA0, 0x0A, 0x3E, 0x09, 0x3C, 0xF0, 0x00, 0x50, 0x3C, 0x09, 0xAF, + 0x08, 0xAF, 0x1F, 0xA0, 0x09, 0x3C, 0x09, 0xAE, 0x08, 0xAE, 0x51, 0x3E, + 0x02, 0xA2, 0x7D, 0x0F, 0x1E, 0xE4, 0x0A, 0x3E, 0x90, 0x01, 0x02, 0xE0, + 0x0A, 0x28, 0x2E, 0xE4, 0xA6, 0xF0, 0x90, 0x01, 0x02, 0xE0, 0x86, 0xF0, + 0x6E, 0xF1, 0xF6, 0xF0, 0x60, 0x01, 0x02, 0xE0, 0x31, 0x3C, 0x51, 0x28, + 0x32, 0x3C, 0x50, 0x28, 0x32, 0x3C, 0x02, 0xAE, 0x50, 0x28, 0x2E, 0xE4, + 0x31, 0x3C, 0x02, 0xAF, 0x02, 0xA0, 0x51, 0x28, 0x32, 0x3C, 0x04, 0xAE, + 0x50, 0x28, 0x2E, 0xE4, 0x31, 0x3C, 0x04, 0xAF, 0x06, 0xA0, 0x51, 0x28, + 0x32, 0x3C, 0x06, 0xAE, 0x50, 0x28, 0x2E, 0xE4, 0x31, 0x3C, 0x06, 0xAF, + 0x0E, 0xA0, 0x51, 0x28, 0x5F, 0xA1, 0x03, 0xA1, 0x49, 0xE0, 0x2E, 0xE4, + 0x0E, 0xA2, 0x67, 0xA1, 0x27, 0xE4, 0x0C, 0xA2, 0x12, 0xA2, 0x29, 0x01, + 0x03, 0xE0, 0x27, 0xE4, 0x16, 0xA2, 0xA4, 0x04, 0x03, 0xE0, 0x27, 0xE4, + 0x1A, 0xA2, 0x90, 0x12, 0x03, 0xE0, 0x27, 0xE4, 0xE9, 0x28, 0x2E, 0xE4, + 0x1C, 0xA2, 0x27, 0xE4, 0x18, 0x4C, 0x17, 0x24, 0x01, 0xC0, 0x28, 0xE4, + 0x02, 0xA2, 0x51, 0x00, 0xC2, 0xE0, 0x00, 0xC0, 0xE9, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0xE9, 0x3C, 0xC2, 0xE0, 0x8E, 0xCC, 0x00, 0xA2, 0x2E, 0xE4, + 0x37, 0x28, 0x20, 0x03, 0xC2, 0xE0, 0x0A, 0x03, 0x35, 0x4C, 0x02, 0xAE, + 0x36, 0x4C, 0x02, 0xAE, 0xD1, 0x2A, 0x04, 0xAE, 0x34, 0x4C, 0x02, 0xAE, + 0x06, 0xA9, 0x08, 0xAE, 0x30, 0x4C, 0x72, 0xB4, 0xC2, 0xE0, 0x00, 0xA2, + 0x00, 0x01, 0xC2, 0xE0, 0x92, 0xB6, 0x71, 0x4E, 0x75, 0x2A, 0x25, 0x01, + 0x78, 0x01, 0xC2, 0xE0, 0x2C, 0xA9, 0x08, 0xAE, 0x79, 0x01, 0xC2, 0xE0, + 0x14, 0x00, 0x04, 0xE0, 0x08, 0xE0, 0x49, 0xE0, 0x50, 0x00, 0xC0, 0xE0, + 0x09, 0xE0, 0x11, 0xAF, 0xBC, 0x3C, 0x7F, 0x00, 0xBC, 0x3E, 0xBC, 0x46, + 0xBD, 0x3E, 0x7F, 0x00, 0x3B, 0xF0, 0x03, 0xA8, 0xBC, 0x2A, 0x00, 0xA2, + 0x05, 0xA8, 0xBC, 0x2A, 0x02, 0x00, 0x0A, 0xE0, 0xBC, 0x2A, 0x09, 0x00, + 0x0A, 0xE0, 0x3B, 0xF0, 0x20, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0x09, 0xA8, + 0x0A, 0xE0, 0x3B, 0xF0, 0x11, 0xA8, 0xBC, 0x2A, 0x35, 0x28, 0x0C, 0x04, + 0xC2, 0xE0, 0x40, 0x00, 0x46, 0x00, 0xC1, 0xE0, 0xFA, 0xF1, 0x63, 0x4C, + 0x42, 0xE0, 0x10, 0xAE, 0x48, 0x00, 0x04, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, + 0x09, 0xA8, 0xBD, 0x2A, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0xE4, 0x05, + 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x11, 0x02, 0xBD, 0x2A, 0x42, 0xE0, + 0x10, 0xAE, 0x88, 0x00, 0xE6, 0x05, 0x61, 0xE1, 0x5B, 0xF0, 0x11, 0xA8, + 0x12, 0x02, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x00, 0x00, 0x05, 0xE0, + 0x46, 0x00, 0xC0, 0xE0, 0x05, 0xA8, 0xBD, 0x2A, 0x42, 0xE0, 0x11, 0xAE, + 0x11, 0x21, 0xE2, 0x05, 0x61, 0xE1, 0x5B, 0xF0, 0x61, 0xE1, 0x03, 0x01, + 0xC2, 0xE0, 0x11, 0x4D, 0x42, 0xCF, 0x11, 0x4D, 0x11, 0x21, 0xC0, 0x05, + 0x40, 0x00, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x03, 0xA8, 0xBD, 0x2A, + 0x42, 0xE0, 0x10, 0xAE, 0x11, 0x21, 0xE0, 0x05, 0x61, 0xE1, 0x5B, 0xF0, + 0xC3, 0xE0, 0xAA, 0x2A, 0x44, 0xCF, 0x11, 0x4D, 0x19, 0xE4, 0x00, 0xA2, + 0x03, 0xA8, 0x3D, 0x01, 0x02, 0xA2, 0x05, 0xA8, 0xAA, 0x2A, 0x33, 0x12, + 0x4B, 0xF0, 0xD3, 0x2A, 0x33, 0x12, 0x19, 0xE4, 0x50, 0x20, 0x4E, 0xF0, + 0x0A, 0x4C, 0x09, 0x20, 0x01, 0x01, 0xC2, 0xE0, 0x08, 0xAE, 0x51, 0x4C, + 0x20, 0xAE, 0x50, 0x28, 0x05, 0x02, 0xC2, 0xE0, 0x37, 0x28, 0x60, 0xCF, + 0x08, 0xAE, 0x51, 0x4C, 0x17, 0xE0, 0x05, 0xA1, 0x24, 0x2A, 0x68, 0xCF, + 0x18, 0x4C, 0x02, 0xAE, 0x3E, 0x28, 0x66, 0x3E, 0x0C, 0x4C, 0x06, 0xAE, + 0x0D, 0x4C, 0x06, 0xAE, 0xD2, 0x4C, 0x02, 0xAE, 0x2F, 0x28, 0x46, 0xCF, + 0x04, 0xA9, 0x04, 0xAE, 0xD1, 0x4C, 0x02, 0xAE, 0x04, 0xAE, 0x2E, 0x4C, + 0x02, 0xAE, 0xAD, 0x4C, 0x29, 0xF0, 0x30, 0x2A, 0x02, 0xAE, 0x30, 0x4C, + 0x02, 0xAE, 0x24, 0x4C, 0x04, 0xAE, 0x02, 0xA9, 0x02, 0xAE, 0x34, 0x28, + 0x00, 0xCF, 0xAE, 0x4C, 0x05, 0xA1, 0x24, 0x2A, 0x02, 0xAE, 0x35, 0x4C, + 0x23, 0x4C, 0x02, 0xAE, 0x22, 0x4C, 0x5B, 0xF0, 0x37, 0x4C, 0x02, 0xAE, + 0x02, 0xAE, 0x2E, 0xF0, 0x63, 0x28, 0x76, 0x03, 0x1E, 0xE4, 0x24, 0xCF, + 0x1E, 0xE4, 0x63, 0x2A, 0x78, 0xF0, 0x66, 0x44, 0xA5, 0x3C, 0xA2, 0x3C, + 0x1B, 0x3C, 0x62, 0x08, 0x97, 0x08, 0x1B, 0xE4, 0x66, 0x2A, 0xA0, 0x28, + 0x1E, 0xE4, 0x01, 0xA2, 0x7B, 0xF0, 0x63, 0x2A, 0x1B, 0x3C, 0xA5, 0x3C, + 0xA6, 0x3C, 0x62, 0x08, 0xCE, 0x03, 0x1E, 0xE4, 0xC4, 0xF0, 0xA5, 0x28, + 0x00, 0x03, 0x05, 0xE0, 0x06, 0xA2, 0x9B, 0xF0, 0x1E, 0xE4, 0xA5, 0x28, + 0x22, 0x04, 0x1E, 0xE4, 0x43, 0x14, 0x12, 0xE4, 0xA4, 0x28, 0x4A, 0x04, + 0x2F, 0x14, 0x1E, 0xE4, 0xA5, 0x28, 0x72, 0x3C, 0x51, 0x14, 0x1E, 0xE4, + 0x72, 0x28, 0x73, 0x3C, 0x24, 0x28, 0xA8, 0xF1, 0x74, 0x3C, 0x66, 0x28, + 0x58, 0xF0, 0xBE, 0x28, 0x3E, 0x30, 0x16, 0xE0, 0x89, 0x08, 0x12, 0xE4, + 0x05, 0xA2, 0xA2, 0x28, 0x63, 0x2A, 0xA2, 0x28, 0xA5, 0x3C, 0xA3, 0x28, + 0x90, 0x08, 0x12, 0xE4, 0xA2, 0x28, 0x5B, 0xF0, 0x38, 0xF0, 0xBF, 0x28, + 0xA3, 0x3C, 0xA6, 0x28, 0xA1, 0x3C, 0xA2, 0x28, 0xA0, 0x3C, 0xA1, 0x28, + 0x08, 0xAE, 0x06, 0xA2, 0xBF, 0x3C, 0xBE, 0x28, 0x04, 0x02, 0xC2, 0xE0, + 0x06, 0xAE, 0x24, 0x4C, 0x32, 0xB6, 0x63, 0x4E, 0x35, 0x2A, 0x04, 0xA2, + 0xCE, 0x03, 0x1E, 0xE4, 0x10, 0x02, 0xC2, 0xE0, 0x16, 0xB6, 0x52, 0xB6, + 0x63, 0x4E, 0x35, 0x4E, 0xCE, 0x03, 0x1E, 0xE4, 0x83, 0x03, 0x1E, 0xE4, + 0x16, 0xB6, 0x63, 0x4E, 0x35, 0x2A, 0x16, 0xB6, 0x63, 0x2A, 0x04, 0xA2, + 0x15, 0x02, 0xC2, 0xE0, 0xC2, 0xE0, 0x12, 0xB6, 0x35, 0x4E, 0x66, 0x46, + 0xC3, 0xE0, 0xA2, 0x2A, 0x49, 0xF0, 0x08, 0x02, 0xEA, 0xF0, 0x63, 0x4C, + 0x35, 0x28, 0x0B, 0x02, 0xA2, 0x28, 0x2B, 0xF0, 0x35, 0x2A, 0xA6, 0x28, + 0xCE, 0x03, 0x1E, 0xE4, 0x14, 0x02, 0xC2, 0xE0, 0x16, 0x02, 0xC2, 0xE0, + 0x4D, 0x28, 0x4B, 0xF0, 0x7B, 0xF0, 0xCE, 0x03, 0x1E, 0xE4, 0xAE, 0xF0, + 0x00, 0xA2, 0x14, 0x02, 0xC2, 0xE0, 0x4D, 0x28, 0x74, 0xF1, 0xA1, 0x28, + 0x10, 0x02, 0xC2, 0xE0, 0xA0, 0x28, 0x02, 0x03, 0xC2, 0xE0, 0x02, 0xA2, + 0xA2, 0x28, 0x32, 0xF0, 0xA1, 0x28, 0x52, 0xF0, 0xA1, 0x28, 0x80, 0x03, + 0xC2, 0xE0, 0x08, 0xB6, 0xA2, 0x28, 0x32, 0xF0, 0xA0, 0x28, 0x52, 0xF0, + 0x00, 0xA2, 0x83, 0x03, 0xC2, 0xE0, 0x08, 0xB6, 0x18, 0x4C, 0x04, 0xA2, + 0x02, 0x03, 0xC2, 0xE0, 0x03, 0x03, 0xC2, 0xE0, 0x25, 0x4C, 0x02, 0xAE, + 0x1E, 0xE4, 0x12, 0x03, 0xC2, 0xE0, 0x0E, 0xA2, 0x08, 0x03, 0xC2, 0xE0, + 0x00, 0xA2, 0x64, 0x01, 0x71, 0x3C, 0x76, 0x3C, 0x75, 0x3C, 0x00, 0xA2, + 0x12, 0xE4, 0xA4, 0x28, 0x78, 0x3C, 0x02, 0xA2, 0x24, 0xF0, 0x1C, 0x3C, + 0xA5, 0x28, 0x9C, 0x13, 0x01, 0xA2, 0x6B, 0x3C, 0x02, 0xA2, 0xA4, 0x3C, + 0xC3, 0xE0, 0x0B, 0xAE, 0xD1, 0xB6, 0xAC, 0x28, 0x5B, 0xF0, 0x05, 0xA1, + 0x6D, 0x2A, 0x04, 0x01, 0x6D, 0x3E, 0x35, 0xB4, 0x66, 0x28, 0x05, 0xA0, + 0xC2, 0xE0, 0x02, 0xA2, 0x8E, 0x02, 0x1E, 0xE4, 0x0C, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x06, 0x01, 0x29, 0xCA, 0xB8, 0x11, 0x0A, 0xE4, 0x0E, 0xA8, + 0x6A, 0x00, 0xC1, 0xE0, 0x80, 0xE1, 0xF9, 0xF7, 0x12, 0xD1, 0x18, 0x06, + 0x11, 0xD1, 0x21, 0xCE, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x0C, 0x00, + 0xE4, 0x30, 0x04, 0xAF, 0x81, 0xE1, 0xF9, 0xF7, 0x10, 0xA2, 0xB8, 0x11, + 0x0A, 0xE4, 0xE4, 0x28, 0x63, 0xE1, 0x12, 0x03, 0x62, 0xE1, 0x00, 0x3C, + 0x02, 0x00, 0x22, 0xD0, 0x01, 0xA2, 0x10, 0x06, 0x1E, 0xA8, 0x12, 0x29, + 0x9D, 0x11, 0x84, 0xE1, 0x1E, 0xA8, 0x12, 0x29, 0x09, 0xAE, 0x55, 0xE0, + 0x02, 0xA1, 0x00, 0x28, 0x13, 0x3F, 0x55, 0xE0, 0x29, 0xCA, 0xFE, 0xF6, + 0x00, 0x3C, 0x3A, 0xF0, 0x12, 0x21, 0x1A, 0x06, 0x62, 0xE1, 0xF9, 0xF7, + 0x11, 0xD1, 0x20, 0xCE, 0x80, 0xE1, 0x12, 0x4D, 0x13, 0xD1, 0x08, 0x00, + 0x12, 0xD1, 0x10, 0x06, 0x81, 0xE1, 0xF8, 0xF7, 0x28, 0xCA, 0x02, 0x00, + 0x00, 0xA2, 0x10, 0xC4, 0x18, 0x06, 0x62, 0xE1, 0x12, 0x3D, 0x10, 0xAE, + 0x32, 0xB6, 0xE4, 0x2A, 0x00, 0xA2, 0x2E, 0xE4, 0x12, 0x3D, 0x20, 0xA2, + 0xC2, 0xE0, 0x20, 0x03, 0xC2, 0xE0, 0x8E, 0xCC, 0x36, 0x4C, 0x02, 0xAE, + 0x37, 0x28, 0x0A, 0x03, 0x34, 0x4C, 0x02, 0xAE, 0x35, 0x4C, 0x02, 0xAE, + 0x30, 0x4C, 0x72, 0xB4, 0xD1, 0x2A, 0x04, 0xAE, 0x00, 0x01, 0xC2, 0xE0, + 0x06, 0xA9, 0x08, 0xAE, 0x08, 0xAE, 0x92, 0xB6, 0x71, 0x4E, 0x75, 0x2A, + 0x04, 0xE0, 0x78, 0x01, 0xC2, 0xE0, 0x2C, 0xA9, 0x1E, 0xE4, 0x79, 0x01, + 0xC2, 0xE0, 0x14, 0x00, 0x65, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x76, 0x03, + 0x62, 0xE1, 0x6A, 0xF1, 0x02, 0xA8, 0x0A, 0xAF, 0xD7, 0x28, 0x12, 0x3D, + 0xD6, 0x28, 0x30, 0x06, 0x80, 0xE1, 0xF9, 0xF7, 0x29, 0xCA, 0x12, 0x3D, + 0x11, 0xD1, 0x20, 0xCE, 0x6B, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0x04, 0x00, + 0x12, 0xD1, 0x30, 0x06, 0x81, 0xE1, 0xF8, 0xF7, 0x28, 0xCA, 0x00, 0x00, + 0x00, 0x01, 0x08, 0xE0, 0x65, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0xF9, 0xF7, + 0x29, 0xCA, 0x0A, 0xF1, 0x12, 0xD1, 0x20, 0xCE, 0x80, 0xE1, 0x6A, 0x00, + 0x13, 0xD1, 0x18, 0x06, 0x11, 0xD1, 0x04, 0x00, 0x81, 0xE1, 0xF8, 0xF7, + 0x28, 0xCA, 0x02, 0x00, 0xE3, 0x3C, 0xD6, 0x3C, 0xD7, 0x3C, 0x00, 0xA2, + 0x11, 0x01, 0xC0, 0xE0, 0xD9, 0x3C, 0xD8, 0x3C, 0x2A, 0xE4, 0x71, 0x4C, + 0x75, 0x28, 0xE8, 0xF7, 0x02, 0xA1, 0x50, 0x4C, 0x10, 0xAE, 0x04, 0xA2, + 0xC1, 0xE0, 0x02, 0xA1, 0x51, 0x4C, 0x10, 0xAE, 0x4D, 0x01, 0xC2, 0xE0, + 0xE9, 0xF7, 0x4B, 0x01, 0xC1, 0xE0, 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, + 0x61, 0xE1, 0x2E, 0xE4, 0xE9, 0xF7, 0x4B, 0x01, 0x61, 0xE1, 0x5A, 0xF0, + 0x01, 0xA2, 0x32, 0x03, 0x02, 0xA2, 0x40, 0x00, 0x05, 0xE0, 0x72, 0x03, + 0x3F, 0x00, 0x22, 0xD0, 0x3C, 0x01, 0xC2, 0xE0, 0xC3, 0xE0, 0x11, 0x29, + 0x47, 0x12, 0x84, 0xE1, 0x03, 0xA0, 0x3F, 0x01, 0xC2, 0xE0, 0x3E, 0x01, + 0x2E, 0xE4, 0x3C, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x64, 0x00, 0x66, 0xE1, + 0xE0, 0x05, 0x67, 0xE1, 0x56, 0x12, 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, + 0x2E, 0xE4, 0x17, 0x3D, 0x17, 0x35, 0x16, 0x9E, 0x0A, 0xAE, 0x0E, 0x28, + 0xE6, 0x3E, 0x01, 0xA2, 0x7F, 0xA2, 0x15, 0x01, 0xC2, 0xE0, 0x5D, 0x4C, + 0xC3, 0xE0, 0x5E, 0x2A, 0x28, 0xF0, 0x58, 0x28, 0x16, 0x01, 0xC2, 0xE0, + 0x7E, 0xA2, 0x26, 0x01, 0xC2, 0xE0, 0x58, 0x4C, 0x08, 0xAE, 0xAB, 0x28, + 0x7A, 0xF0, 0x63, 0x4C, 0x35, 0x28, 0x14, 0x01, 0x0A, 0xAE, 0x16, 0xE0, + 0x35, 0x44, 0x59, 0x28, 0x1A, 0xE4, 0x58, 0x28, 0x6A, 0xCF, 0x5D, 0x4C, + 0x66, 0x4C, 0x16, 0xE0, 0x58, 0x28, 0x8E, 0x12, 0x1E, 0xE4, 0x8A, 0x19, + 0x1E, 0xE4, 0x38, 0xF0, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0xDD, 0x12, + 0x1E, 0xE4, 0x10, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x18, 0xE4, 0x71, 0x4C, + 0x75, 0x28, 0xCE, 0x13, 0xC3, 0xE0, 0x0B, 0x2A, 0x2E, 0xE4, 0x74, 0x13, + 0x3B, 0xF0, 0x66, 0x2A, 0x00, 0xA2, 0x0D, 0x03, 0x72, 0xB6, 0x5B, 0x2A, + 0x76, 0xB6, 0x6C, 0x2A, 0x06, 0xAE, 0x00, 0x3C, 0x32, 0xB6, 0x0B, 0x2A, + 0x00, 0x4C, 0x0C, 0xAE, 0x00, 0x3C, 0x00, 0x4C, 0x6C, 0x2A, 0x66, 0x28, + 0x09, 0x03, 0xC2, 0xE0, 0x16, 0xE0, 0x52, 0xE0, 0x17, 0xE0, 0x05, 0xA1, + 0x07, 0xA1, 0x6C, 0x2A, 0x00, 0xA2, 0x64, 0x3C, 0x02, 0xAE, 0x65, 0x3C, + 0x66, 0x44, 0x2A, 0xB6, 0xE6, 0x4C, 0x04, 0xAE, 0xE6, 0x3C, 0x64, 0x4C, + 0xC2, 0xE0, 0xE6, 0x4C, 0x08, 0xAE, 0xE6, 0x3C, 0x64, 0x46, 0x0B, 0x2A, + 0x00, 0xA2, 0x0C, 0x03, 0xB5, 0x4C, 0x0A, 0xAE, 0xB5, 0x28, 0x8B, 0xF0, + 0xB6, 0x4C, 0x0A, 0xAE, 0xB6, 0x4C, 0x0A, 0xAE, 0x20, 0xAE, 0x02, 0xA2, + 0x0A, 0x03, 0xC2, 0xE0, 0x65, 0x46, 0x0B, 0x2A, 0x42, 0x08, 0x0A, 0xE0, + 0xB7, 0x4E, 0x0B, 0xAE, 0xB7, 0x2A, 0x9B, 0xF0, 0xB8, 0x4E, 0x0B, 0xAE, + 0xB8, 0x4E, 0x0B, 0xAE, 0x24, 0x28, 0x0B, 0x03, 0xC2, 0xE0, 0x56, 0xE0, + 0x8A, 0x19, 0x1E, 0xE4, 0x2A, 0xE4, 0x04, 0xA1, 0x28, 0x01, 0xC2, 0xE0, + 0x6B, 0x28, 0x2E, 0xE4, 0xC2, 0xE0, 0x5C, 0x28, 0x6B, 0x3C, 0x00, 0xA2, + 0x6A, 0x4C, 0x69, 0x20, 0x2E, 0xE4, 0x27, 0x01, 0x59, 0x4C, 0x58, 0x4C, + 0x56, 0x28, 0x48, 0xCF, 0xB3, 0xD1, 0x08, 0x00, 0xB3, 0xD1, 0x9A, 0xF0, + 0x0E, 0xE4, 0x58, 0xF0, 0x3F, 0x28, 0x10, 0x00, 0x59, 0x28, 0x1A, 0xF1, + 0x3F, 0x28, 0x1F, 0x13, 0x52, 0xE0, 0x17, 0xE0, 0x16, 0xE0, 0xC5, 0x2A, + 0x12, 0x21, 0xB2, 0x03, 0x62, 0xE1, 0xB8, 0xF0, 0x0A, 0x4D, 0x12, 0x21, + 0x4C, 0xCF, 0x0A, 0x4D, 0x62, 0xE1, 0x1F, 0x13, 0x0E, 0xE4, 0x54, 0xCF, + 0x4C, 0xCF, 0x12, 0x4D, 0x12, 0x21, 0x01, 0x03, 0x12, 0x21, 0x4E, 0xCF, + 0x12, 0x4D, 0x12, 0x21, 0x12, 0x4D, 0x12, 0x21, 0x50, 0xCF, 0x12, 0x4D, + 0x12, 0x81, 0x9A, 0xF0, 0x66, 0x28, 0x52, 0xCF, 0x54, 0xCF, 0x32, 0x4D, + 0x12, 0x21, 0x18, 0xC4, 0x6C, 0x28, 0x58, 0xCF, 0x32, 0x4D, 0x12, 0x21, + 0x0A, 0xE4, 0x3E, 0x44, 0x66, 0x44, 0x16, 0xE0, 0x02, 0xA2, 0xF8, 0xF7, + 0x28, 0xCA, 0x50, 0x13, 0x46, 0x00, 0xC0, 0xE0, 0x64, 0xCF, 0x62, 0xCF, + 0x42, 0xE0, 0x11, 0xAE, 0xA8, 0x00, 0x05, 0xE0, 0x20, 0xCE, 0x80, 0xE1, + 0xF9, 0xF7, 0x29, 0xCA, 0x08, 0x00, 0x12, 0xD1, 0xD0, 0x05, 0x11, 0xD1, + 0xF8, 0xF7, 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x05, 0xE0, 0x46, 0x00, + 0xC0, 0xE0, 0x81, 0xE1, 0x29, 0xCA, 0x42, 0xE0, 0x11, 0xAE, 0xA8, 0x00, + 0x11, 0xD1, 0x20, 0xCE, 0x80, 0xE1, 0xF9, 0xF7, 0x13, 0xD1, 0x02, 0x00, + 0x12, 0xD1, 0x48, 0x00, 0x81, 0xE1, 0xF8, 0xF7, 0x28, 0xCA, 0x1B, 0x00, + 0xF8, 0xF7, 0x40, 0xCB, 0x01, 0x00, 0xA0, 0xD1, 0x3E, 0x44, 0x66, 0x44, + 0x16, 0xE0, 0x6C, 0x28, 0x54, 0x20, 0x64, 0xCF, 0x53, 0x28, 0x2A, 0xE4, + 0x1E, 0xE4, 0x2E, 0xE4, 0x62, 0xCF, 0x55, 0x4C, 0x55, 0x3C, 0x54, 0x3C, + 0x00, 0xA2, 0xC3, 0x11, 0x74, 0x13, 0x1E, 0xE4, 0x78, 0x3C, 0x02, 0xA2, + 0x00, 0xA2, 0xC8, 0xF7, 0x0E, 0x14, 0x1E, 0xE4, 0x90, 0xE1, 0x74, 0x13, + 0x1E, 0xE4, 0x78, 0x3C, 0x2E, 0xE4, 0xE9, 0xF7, 0x4B, 0x01, 0xC1, 0xE0, + 0x77, 0x3C, 0x1A, 0xE0, 0x55, 0x4C, 0x54, 0x28, 0x1A, 0xE4, 0x54, 0x28, + 0x1A, 0xF1, 0x71, 0x28, 0x00, 0xE0, 0x02, 0xAF, 0x54, 0x28, 0xEB, 0x13, + 0x54, 0x2A, 0x07, 0x29, 0x9E, 0xE0, 0x60, 0x04, 0x08, 0xE0, 0x10, 0xAF, + 0x29, 0xF0, 0x03, 0xA8, 0x02, 0xAE, 0x79, 0x28, 0x79, 0x3C, 0x1F, 0x00, + 0x10, 0xAE, 0x78, 0x4C, 0x02, 0xAE, 0x77, 0x4C, 0xC1, 0xE0, 0x55, 0x4C, + 0x10, 0xAE, 0x54, 0x4C, 0x4D, 0x01, 0xC2, 0xE0, 0xE9, 0xF7, 0x4B, 0x01, + 0x2E, 0xE4, 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x61, 0xA8, 0x49, 0xE0, + 0x60, 0x00, 0xC0, 0xE0, 0x76, 0x3C, 0x1E, 0xA8, 0x49, 0xE0, 0x2B, 0xE4, + 0x71, 0x32, 0x03, 0xAF, 0x75, 0x32, 0x09, 0xAF, 0x00, 0xA2, 0x43, 0x01, + 0xC2, 0xE0, 0xA4, 0x28, 0x49, 0x01, 0xC2, 0xE0, 0x7F, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0xAE, 0x03, 0x1E, 0xE4, 0x00, 0xA2, 0x20, 0xAE, 0x02, 0xA1, + 0x50, 0x28, 0x7F, 0x01, 0x42, 0x01, 0xC2, 0xE0, 0x02, 0xA1, 0x51, 0x4C, + 0x71, 0x2A, 0x20, 0xAE, 0xAA, 0x03, 0x1E, 0xE4, 0x2B, 0xF0, 0x75, 0x2A, + 0x56, 0xE0, 0x09, 0xAE, 0xC0, 0xE0, 0x4E, 0x01, 0xC2, 0xE0, 0x76, 0x4C, + 0x44, 0x01, 0xC2, 0xE0, 0x7E, 0xA8, 0x61, 0x00, 0x02, 0xAF, 0x54, 0x28, + 0x2E, 0xE4, 0x03, 0xA2, 0x07, 0x29, 0x9E, 0xE0, 0x20, 0x04, 0x00, 0xE0, + 0x39, 0xF0, 0x5D, 0x4C, 0x03, 0xA8, 0x54, 0x2A, 0x54, 0x28, 0x07, 0x3D, + 0x10, 0xAE, 0x5D, 0x28, 0xE1, 0x13, 0x1A, 0xE4, 0x50, 0x18, 0x02, 0xA0, + 0xF8, 0xF7, 0x28, 0xCA, 0x80, 0xE1, 0x2E, 0xE4, 0x06, 0x3C, 0x04, 0xA2, + 0x07, 0x3C, 0x73, 0x28, 0x80, 0xE1, 0xAE, 0xF0, 0x20, 0x04, 0x11, 0xD1, + 0x07, 0x3C, 0x72, 0x28, 0xF8, 0xF7, 0x28, 0xCA, 0x60, 0x04, 0x11, 0xD1, + 0x06, 0x3C, 0x06, 0xA2, 0x44, 0x00, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, + 0x1D, 0xAE, 0x07, 0x2A, 0x42, 0xE0, 0x11, 0xAE, 0x42, 0xE0, 0x0F, 0xAE, + 0x55, 0x2A, 0x42, 0xE0, 0x02, 0xAF, 0x02, 0xA0, 0x50, 0x28, 0x20, 0xCE, + 0x24, 0xCE, 0x52, 0xE0, 0xF9, 0xA2, 0x06, 0xA0, 0xF8, 0xF7, 0x28, 0xCA, + 0x13, 0x01, 0x06, 0x88, 0x02, 0xA0, 0x54, 0x28, 0x2E, 0xE4, 0x81, 0xE1, + 0x54, 0x3C, 0x28, 0xE4, 0x50, 0x18, 0x54, 0x3C, 0x51, 0x18, 0x55, 0x3C, + 0x02, 0xA0, 0x55, 0x28, 0x18, 0x58, 0x04, 0xA2, 0x12, 0x81, 0x2E, 0xE4, + 0xE7, 0x44, 0x02, 0x29, 0xE7, 0x3C, 0x02, 0xA1, 0x18, 0x5C, 0x02, 0xAF, + 0x02, 0x29, 0xE8, 0x3C, 0x0A, 0x3D, 0xE8, 0x4C, 0x04, 0xAE, 0x18, 0x58, + 0xFE, 0xA2, 0xA0, 0x04, 0x61, 0xE1, 0x2E, 0xE4, 0x06, 0x3C, 0x2E, 0xE4, + 0x11, 0x3D, 0x03, 0xC7, 0x00, 0xA2, 0x92, 0xE0, 0xA0, 0x04, 0x04, 0xE0, + 0x49, 0xE0, 0x02, 0xA0, 0x75, 0xF0, 0x11, 0x2B, 0x2E, 0xE4, 0x00, 0xA2, + 0xB9, 0xF7, 0x09, 0xA1, 0x93, 0xE0, 0xA0, 0x04, 0x01, 0xE0, 0x49, 0xE0, + 0x06, 0x3C, 0x2E, 0xE4, 0x11, 0x3F, 0x06, 0x2A, 0x00, 0xA2, 0x92, 0xE0, + 0xA0, 0x04, 0x04, 0xE0, 0x02, 0xA0, 0x6B, 0xF0, 0x06, 0x1A, 0x11, 0x2B, + 0x00, 0xA2, 0xA9, 0xF7, 0x09, 0xA1, 0x49, 0xE0, 0xA0, 0x04, 0x00, 0xE0, + 0x24, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x01, 0x3D, 0xFE, 0xA2, 0x92, 0xE0, + 0x91, 0x30, 0x08, 0xAF, 0x45, 0x00, 0xC0, 0xE0, 0x81, 0x3C, 0x80, 0x34, + 0x60, 0x00, 0xC0, 0xE0, 0x61, 0x00, 0xC0, 0xE0, 0x87, 0x3C, 0x86, 0x34, + 0x80, 0x04, 0x83, 0x3C, 0x82, 0x34, 0x14, 0xAE, 0x8C, 0x28, 0x85, 0x3C, + 0x84, 0x34, 0x81, 0x0C, 0x92, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0x3A, 0xF1, + 0xC1, 0xE0, 0x93, 0x4C, 0x92, 0x24, 0x93, 0x3C, 0x88, 0x14, 0x89, 0x3E, + 0x88, 0x36, 0x49, 0x00, 0x05, 0xAF, 0x45, 0x00, 0xC1, 0xE0, 0x89, 0x1C, + 0xC0, 0xE0, 0x8C, 0x3E, 0x11, 0xB6, 0x03, 0xA8, 0x8A, 0x3C, 0xFF, 0x01, + 0x08, 0xE0, 0x48, 0x00, 0x08, 0xE0, 0x86, 0x34, 0x48, 0x00, 0xC0, 0xE0, + 0x92, 0xCC, 0x00, 0xA2, 0x87, 0x3C, 0x00, 0xFE, 0x2D, 0x15, 0x1E, 0xE4, + 0x80, 0xE1, 0x8E, 0xCC, 0x00, 0xA2, 0x81, 0xE1, 0x2A, 0x20, 0x71, 0xD0, + 0x97, 0x3C, 0x98, 0x34, 0x00, 0xA2, 0x8E, 0x3C, 0x8A, 0x2C, 0xD8, 0x14, + 0x1E, 0xE4, 0x72, 0xCC, 0xDE, 0xF7, 0x4F, 0xBA, 0x34, 0xF0, 0x02, 0xA1, + 0x02, 0xA2, 0x1C, 0x16, 0x1E, 0xE4, 0x72, 0xC8, 0x6A, 0xE1, 0x1A, 0xB6, + 0x02, 0xA2, 0x8E, 0x3C, 0x96, 0xC8, 0xF8, 0xF7, 0x40, 0xCB, 0x2E, 0xE4, + 0x1E, 0xE4, 0xA8, 0xF0, 0x8C, 0x28, 0x1A, 0xF1, 0x00, 0xA2, 0x8A, 0xF0, + 0x8C, 0x28, 0xF1, 0x14, 0x2E, 0xB6, 0xFC, 0x01, 0x03, 0xE0, 0x9B, 0x2A, + 0x9A, 0x3C, 0x00, 0xA2, 0xEE, 0x14, 0x18, 0xE4, 0x00, 0xA2, 0x01, 0x00, + 0x4B, 0xD0, 0x5E, 0xF0, 0x4C, 0xD0, 0x6E, 0xCC, 0x99, 0x28, 0x9A, 0x3C, + 0x28, 0xE4, 0x8C, 0x28, 0x70, 0xE4, 0x00, 0x00, 0xF1, 0x14, 0x1E, 0xE4, + 0x9A, 0x3C, 0x02, 0xA2, 0x96, 0xC8, 0x2E, 0xE4, 0x96, 0xCC, 0x8C, 0x28, + 0x99, 0x28, 0x01, 0x00, 0x4B, 0xD0, 0x28, 0xE4, 0x2E, 0xE4, 0x00, 0x00, + 0x4C, 0xD0, 0x6E, 0xCC, 0x1E, 0xE4, 0x99, 0x3C, 0x8D, 0x3C, 0x00, 0xA2, + 0x8C, 0x28, 0x9A, 0x3C, 0x00, 0xA2, 0xF1, 0x14, 0x42, 0xF0, 0x18, 0xA1, + 0x9B, 0x28, 0x7A, 0xF0, 0x4B, 0xD0, 0x9E, 0xF7, 0xEE, 0x14, 0x1E, 0xE4, + 0x90, 0xE1, 0x6E, 0xCC, 0x99, 0x28, 0x01, 0x00, 0xB5, 0x15, 0x1E, 0xE4, + 0x2E, 0xE4, 0x28, 0xE1, 0x03, 0x15, 0x1A, 0xE4, 0x8C, 0x28, 0x4E, 0xF0, + 0x02, 0xA8, 0x8D, 0x08, 0x12, 0xAF, 0x9B, 0x28, 0xFF, 0x01, 0x08, 0xE0, + 0x9B, 0x28, 0x8D, 0x3C, 0x9B, 0x08, 0x12, 0xAE, 0x8D, 0x28, 0x9B, 0x3C, + 0x27, 0xD0, 0x2E, 0xE4, 0x99, 0x3C, 0x04, 0xAF, 0x27, 0xD0, 0x54, 0x15, + 0x1E, 0xE4, 0x00, 0x00, 0x28, 0xCA, 0x2A, 0xE4, 0x9B, 0x28, 0x01, 0x00, + 0x20, 0xCE, 0x87, 0x4C, 0x86, 0x24, 0xF8, 0xF7, 0x12, 0xD1, 0x22, 0xCE, + 0x0E, 0xAE, 0x8D, 0x28, 0x06, 0xA8, 0x43, 0x00, 0xC0, 0xE0, 0x80, 0x00, + 0x28, 0xCA, 0x26, 0xCE, 0x22, 0xA0, 0x02, 0xAE, 0x00, 0xE0, 0x87, 0x4C, + 0x86, 0x24, 0xF8, 0xF7, 0x84, 0x14, 0x87, 0x3C, 0x86, 0x34, 0x00, 0x02, + 0x81, 0x4C, 0x80, 0x24, 0x54, 0xF0, 0x85, 0x1C, 0xDB, 0x15, 0x1E, 0xE4, + 0x87, 0x3C, 0x86, 0x34, 0x31, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x2E, 0xE4, + 0x34, 0xD0, 0x00, 0x00, 0x32, 0xD0, 0x00, 0x00, 0x35, 0xD0, 0x00, 0x00, + 0x33, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0xFF, 0x00, 0x36, 0xD0, 0x00, 0x00, + 0x39, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, 0x4C, 0xD0, 0x01, 0x00, + 0x4B, 0xD0, 0x00, 0x00, 0x2E, 0xE4, 0x00, 0x00, 0x49, 0xD1, 0x00, 0x00, + 0x00, 0xA2, 0x03, 0xA1, 0x59, 0x00, 0xC1, 0xE0, 0xC1, 0xE0, 0x1C, 0x00, + 0x00, 0xE0, 0x36, 0xB6, 0x2E, 0xE4, 0x1A, 0xE0, 0x52, 0xE0, 0x45, 0x00, + 0x68, 0xF3, 0x08, 0xA8, 0x43, 0x00, 0xC0, 0xE0, 0x00, 0x02, 0x04, 0xE0, + 0x8B, 0x3C, 0x00, 0xA2, 0x8C, 0x3C, 0x48, 0x15, 0x1E, 0xE4, 0x9B, 0x3C, + 0x49, 0x00, 0xC1, 0xE0, 0x87, 0x4C, 0x86, 0x24, 0x93, 0x4E, 0x92, 0x26, + 0x93, 0x3E, 0x92, 0x36, 0x83, 0x0E, 0x82, 0x06, 0x33, 0xF0, 0x45, 0xE0, + 0x06, 0xB6, 0x8C, 0x28, 0x00, 0x02, 0x03, 0xE0, 0x00, 0x02, 0x01, 0xE0, + 0xC3, 0xF1, 0x8C, 0x3C, 0x5D, 0x00, 0xC1, 0xE0, 0x8C, 0x28, 0x9B, 0x3E, + 0x28, 0xF1, 0x52, 0xE0, 0x17, 0xE0, 0x1B, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, + 0x08, 0xF6, 0x8B, 0x28, 0xC0, 0xE0, 0xBA, 0xF5, 0x00, 0x40, 0x08, 0xE0, + 0xC2, 0xE0, 0x00, 0x40, 0x0A, 0xE0, 0x5D, 0x00, 0x8B, 0x3C, 0x00, 0xCE, + 0x02, 0xA2, 0x5D, 0x00, 0x39, 0xF0, 0x8C, 0x2A, 0x9B, 0x28, 0x1E, 0xF5, + 0xC1, 0xE0, 0x9B, 0x3C, 0x00, 0x02, 0x04, 0xE0, 0xC9, 0xF7, 0x00, 0x40, + 0x09, 0xE0, 0x5D, 0x00, 0x00, 0x3C, 0x0E, 0xA8, 0x68, 0xC8, 0x2E, 0xE4, + 0x2A, 0xE4, 0x8C, 0x28, 0x2E, 0xE4, 0x00, 0x74, 0x49, 0x00, 0xC0, 0xE0, + 0xDB, 0x15, 0x1E, 0xE4, 0x93, 0x4C, 0x92, 0x24, 0x93, 0x3C, 0x92, 0x34, + 0x93, 0x3E, 0x92, 0x36, 0x48, 0x00, 0xC1, 0xE0, 0x00, 0xA2, 0x45, 0xE0, + 0x93, 0x4E, 0x92, 0x26, 0x06, 0xB6, 0x00, 0x02, 0x03, 0xE0, 0x26, 0xB6, + 0x30, 0x2A, 0xB1, 0x01, 0x04, 0xE0, 0x2E, 0xE4, 0x7B, 0x3C, 0x00, 0x80, + 0x04, 0xE0, 0x3B, 0xF0, 0x04, 0xAF, 0x9B, 0x08, 0x12, 0xAE, 0x8D, 0x28, + 0x06, 0xA8, 0x9B, 0x28, 0x76, 0xCC, 0x78, 0xCC, 0x7C, 0x3C, 0x06, 0xAE, + 0xDA, 0xF0, 0x7D, 0x3C, 0x7A, 0xC8, 0x7D, 0x3C, 0x7C, 0x18, 0x40, 0xA2, + 0x7C, 0x5E, 0x7B, 0x2E, 0x7D, 0x58, 0x7D, 0x5C, 0x7D, 0x58, 0x7B, 0x2C, + 0x7A, 0xCC, 0x42, 0xE0, 0x9B, 0x3C, 0x08, 0xA0, 0x9B, 0x28, 0x7A, 0xCC, + 0x72, 0xC8, 0x99, 0x15, 0x1E, 0xE4, 0x2E, 0xE4, 0x19, 0x16, 0x1E, 0xE4, + 0x9D, 0x3C, 0x9C, 0x34, 0x06, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, 0x49, 0xE0, + 0x16, 0xB6, 0x8E, 0x2A, 0x08, 0xB6, 0x46, 0xE0, 0x93, 0x3E, 0x92, 0x36, + 0x48, 0x00, 0xC1, 0xE0, 0x49, 0xE0, 0x42, 0xE0, 0x93, 0x4E, 0x92, 0x26, + 0x82, 0x14, 0x35, 0xF0, 0x85, 0x1E, 0x84, 0x16, 0xC2, 0xE0, 0x48, 0x00, + 0xC2, 0xE0, 0x83, 0x1C, 0x1E, 0xE4, 0x9D, 0x4C, 0x9C, 0x24, 0x52, 0x00, + 0xC0, 0xE0, 0x2A, 0xE4, 0x8C, 0x28, 0x1C, 0x16, 0x92, 0x24, 0x93, 0x3C, + 0x92, 0x34, 0x49, 0x00, 0x92, 0x36, 0x48, 0x00, 0xC1, 0xE0, 0x93, 0x4C, + 0x45, 0xE0, 0x93, 0x4E, 0x92, 0x26, 0x93, 0x3E, 0x00, 0x02, 0x03, 0xE0, + 0x26, 0xB6, 0x00, 0xA2, 0x49, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x06, 0xB6, + 0x52, 0x00, 0xC2, 0xE0, 0x48, 0x00, 0xC2, 0xE0, 0x2E, 0xE4, 0x9F, 0x4C, + 0x9E, 0x24, 0x2E, 0xE4, 0x2E, 0xE4, 0x9F, 0x3C, 0x9E, 0x34, 0x06, 0xAF, + 0xC0, 0xE0, 0x01, 0xC0, 0xDB, 0x15, 0x1E, 0xE4, 0x00, 0xC0, 0x18, 0x3C, + 0x17, 0x34, 0x48, 0x00, 0x18, 0x4C, 0x17, 0x24, 0x01, 0xC0, 0x2E, 0xE4, + 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, 0x00, 0xC0, 0x2E, 0xE4, 0x9F, 0x3C, + 0x9E, 0x3C, 0x72, 0xCC, 0x24, 0x28, 0x23, 0xA2, 0x01, 0x00, 0xB3, 0xD1, + 0x02, 0xA1, 0x21, 0xA0, 0x0C, 0x2A, 0xCA, 0xF0, 0x0C, 0x28, 0x68, 0xF0, + 0x3F, 0x28, 0x8A, 0xF0, 0x25, 0xA4, 0x21, 0xA0, 0x61, 0xE0, 0x0D, 0x2A, + 0x61, 0xE1, 0x68, 0xF0, 0x24, 0x28, 0x60, 0x3E, 0x11, 0x3D, 0x11, 0xC7, + 0x00, 0xA2, 0x00, 0x03, 0x70, 0x3C, 0x00, 0xA2, 0x42, 0x3C, 0x27, 0x28, + 0x62, 0xCF, 0x64, 0xCF, 0x44, 0x3C, 0x43, 0x3C, 0x02, 0xA1, 0x51, 0x28, + 0x9A, 0xF0, 0x66, 0x28, 0x60, 0xCB, 0x62, 0xCF, 0x02, 0xA2, 0x68, 0xF0, + 0x70, 0x4C, 0x44, 0x28, 0x60, 0xCF, 0x20, 0xA0, 0x1E, 0xE4, 0x88, 0xF0, + 0x36, 0x28, 0x4A, 0xF1, 0xB3, 0x09, 0x1E, 0xE4, 0xDA, 0xF0, 0xBD, 0x17, + 0xE5, 0x17, 0x1E, 0xE4, 0xBE, 0xF0, 0x43, 0x3C, 0x05, 0x0A, 0x1E, 0xE4, + 0x00, 0xA2, 0x6A, 0xF0, 0x43, 0x3C, 0x52, 0x28, 0x3E, 0xF0, 0x43, 0x3C, + 0x7A, 0xF0, 0x80, 0xF6, 0x43, 0x18, 0x44, 0x28, 0x44, 0x3C, 0x43, 0x28, + 0x4B, 0x17, 0x1E, 0xE4, 0x70, 0x3C, 0x02, 0xA2, 0x9A, 0xF1, 0x52, 0x18, + 0x22, 0x44, 0x1A, 0xE0, 0x04, 0xA1, 0x24, 0x28, 0xB3, 0xD1, 0xED, 0x16, + 0x1E, 0xE4, 0x68, 0xF0, 0xDA, 0x17, 0x1E, 0xE4, 0x6E, 0xF0, 0x06, 0x00, + 0x6B, 0x28, 0x28, 0xE4, 0x02, 0x00, 0xB3, 0xD1, 0x52, 0x18, 0x44, 0x28, + 0x6B, 0x3C, 0x02, 0xA0, 0x2E, 0xE4, 0x02, 0xA2, 0x5E, 0x16, 0x04, 0xE4, + 0x42, 0x3C, 0x27, 0x28, 0x01, 0x00, 0xB3, 0xD1, 0x33, 0x3C, 0x44, 0x3C, + 0x43, 0x3C, 0x00, 0xA2, 0x40, 0x3C, 0xFE, 0xA2, 0x62, 0xCF, 0x64, 0xCF, + 0x1E, 0xE4, 0x72, 0xF0, 0x43, 0x18, 0x44, 0x28, 0x52, 0x18, 0x44, 0x3C, + 0x43, 0x28, 0x4B, 0x17, 0x43, 0x28, 0xED, 0x16, 0x1E, 0xE4, 0x5A, 0xF3, + 0x34, 0xF0, 0x52, 0x18, 0x43, 0x3C, 0x32, 0x08, 0x02, 0xA0, 0x33, 0x28, + 0x43, 0x3C, 0x52, 0x28, 0x6A, 0xF2, 0x52, 0x18, 0x44, 0x28, 0x33, 0x3C, + 0x43, 0x18, 0x44, 0x28, 0x78, 0xF6, 0x2E, 0x28, 0x18, 0xF6, 0x02, 0xA1, + 0x20, 0xBA, 0x94, 0xF0, 0x02, 0xA0, 0x6B, 0x28, 0x02, 0x00, 0xB3, 0xD1, + 0x41, 0x3C, 0xC7, 0x17, 0x1E, 0xE4, 0x6B, 0x3C, 0x41, 0x3C, 0x48, 0xBA, + 0x60, 0xBA, 0x2A, 0xF1, 0x46, 0xE0, 0x38, 0xF0, 0x43, 0xBA, 0x40, 0x28, + 0x41, 0x28, 0x27, 0x3C, 0x48, 0xBA, 0x58, 0xF7, 0x18, 0xE0, 0x32, 0x82, + 0x33, 0x84, 0x33, 0x3C, 0x43, 0x3C, 0x52, 0x28, 0x7E, 0xF4, 0x43, 0x3C, + 0x75, 0x17, 0x1E, 0xE4, 0x2C, 0xA2, 0x4E, 0xF4, 0x99, 0x15, 0x1E, 0xE4, + 0x48, 0xF0, 0x7E, 0xA1, 0x02, 0xA2, 0x99, 0x15, 0x1E, 0xE4, 0x6A, 0xBA, + 0x32, 0x28, 0x61, 0x3C, 0x27, 0x28, 0x2E, 0xE4, 0x53, 0x3C, 0x43, 0x28, + 0x45, 0x3C, 0x43, 0x08, 0x55, 0x3C, 0x54, 0x34, 0x50, 0x7C, 0x0F, 0xC7, + 0x46, 0x17, 0x0A, 0xE4, 0x52, 0x18, 0x53, 0x28, 0x49, 0x17, 0x0A, 0xE4, + 0xAF, 0x18, 0x1E, 0xE4, 0x02, 0xA0, 0x53, 0x28, 0x61, 0x3C, 0x5D, 0x28, + 0xFF, 0x17, 0x1E, 0xE4, 0x64, 0xCF, 0x53, 0x3C, 0x55, 0x4C, 0x54, 0x20, + 0x78, 0x3C, 0x1A, 0xE0, 0x2B, 0x17, 0x0A, 0xE4, 0x30, 0x28, 0x62, 0xCF, + 0x53, 0x28, 0x24, 0x17, 0x08, 0xE4, 0x36, 0x28, 0x61, 0x28, 0xF8, 0x16, + 0x08, 0xE4, 0x45, 0x18, 0xBA, 0xF2, 0x02, 0xA1, 0x20, 0xBA, 0x27, 0x3C, + 0x02, 0xA1, 0x75, 0x17, 0x1E, 0xE4, 0x22, 0xA2, 0x3E, 0xF2, 0x99, 0x15, + 0x1E, 0xE4, 0x68, 0xF2, 0xF8, 0x16, 0x0A, 0xE4, 0xB1, 0x17, 0x1E, 0xE4, + 0x90, 0xD1, 0xCE, 0xF1, 0x99, 0x15, 0x1E, 0xE4, 0x1E, 0xE4, 0xF8, 0xF7, + 0x20, 0xCB, 0x08, 0x00, 0x1E, 0xE4, 0x40, 0xBA, 0x5A, 0xF0, 0x98, 0x17, + 0x80, 0x17, 0x1E, 0xE4, 0x1E, 0xF1, 0x99, 0x15, 0x51, 0x18, 0x55, 0x28, + 0xF8, 0x16, 0x0A, 0xE4, 0x02, 0xA8, 0xB0, 0x19, 0x1E, 0xE4, 0x6A, 0xF0, + 0x1E, 0xE4, 0x40, 0xBA, 0xF8, 0x16, 0x08, 0xE4, 0x44, 0x3C, 0x53, 0x28, + 0x1E, 0xF0, 0x99, 0x15, 0x4A, 0x24, 0xCE, 0xF7, 0x6A, 0xE1, 0x2E, 0xE4, + 0x16, 0xE0, 0x58, 0x3C, 0x16, 0xE0, 0x4B, 0x4C, 0x00, 0xA2, 0x5D, 0x3C, + 0x42, 0x28, 0x59, 0x3C, 0x44, 0x28, 0x5C, 0x3C, 0x5F, 0x3C, 0x5B, 0x3C, + 0x54, 0x34, 0x50, 0x7C, 0x0F, 0xC7, 0x53, 0x3C, 0x12, 0xF1, 0x43, 0x18, + 0x53, 0x28, 0x55, 0x3C, 0x58, 0x12, 0x1E, 0xE4, 0xE6, 0x12, 0x1E, 0xE4, + 0x64, 0xCF, 0x53, 0x3C, 0x02, 0xA0, 0x53, 0x28, 0x78, 0x3C, 0x1A, 0xE0, + 0xFF, 0x17, 0x1E, 0xE4, 0xEE, 0xF6, 0x62, 0xCF, 0x55, 0x4C, 0x54, 0x20, + 0x46, 0x3C, 0x46, 0x08, 0x44, 0x18, 0x43, 0x28, 0x0F, 0xA8, 0x69, 0xC8, + 0x48, 0x3C, 0x2E, 0xE4, 0x03, 0xA2, 0x49, 0x78, 0x49, 0x3C, 0x42, 0xE0, + 0x2E, 0xE4, 0x52, 0xE0, 0x03, 0xA1, 0x48, 0x5A, 0xE8, 0xB6, 0x02, 0xA1, + 0x0E, 0xA8, 0x68, 0xC8, 0x03, 0xA2, 0x48, 0x78, 0x48, 0x3C, 0x02, 0xA0, + 0x46, 0xE0, 0x03, 0xA1, 0x03, 0xAF, 0x48, 0x5A, 0x48, 0x08, 0x2E, 0xA2, + 0x2A, 0xE4, 0x16, 0xE0, 0x2F, 0xAE, 0x03, 0xA2, 0x48, 0x78, 0x48, 0x3C, + 0x2E, 0xE4, 0x16, 0xE0, 0x52, 0xE0, 0x03, 0xA1, 0xE8, 0xB6, 0x02, 0xA1, + 0x0E, 0xA8, 0x68, 0xC8, 0x03, 0xA2, 0x48, 0x78, 0x48, 0x3C, 0x02, 0xA0, + 0x46, 0xE0, 0x03, 0xA1, 0x03, 0xAF, 0x48, 0x5A, 0x48, 0x08, 0x60, 0x28, + 0x2A, 0xE4, 0x16, 0xE0, 0x60, 0x5A, 0x03, 0xA2, 0x48, 0x78, 0x48, 0x3C, + 0x16, 0xE0, 0x02, 0xA1, 0x52, 0xE0, 0x03, 0xA1, 0x48, 0x3E, 0x0F, 0xA8, + 0x69, 0xC8, 0x2E, 0xE4, 0x48, 0x3E, 0x23, 0xA0, 0x16, 0xE0, 0x48, 0x78, + 0x16, 0xE0, 0x02, 0xA1, 0x48, 0x78, 0x2A, 0xE4, 0x60, 0x78, 0x99, 0x15, + 0x1E, 0xE4, 0x2E, 0xE4, 0x2C, 0xBA, 0x28, 0xE4, 0x16, 0xE0, 0x02, 0xA1, + 0x20, 0xBA, 0x9E, 0xF7, 0x4E, 0xBA, 0x2A, 0xE4, 0xCE, 0xF7, 0x40, 0xBA, + 0x3A, 0xF0, 0x02, 0xA1, 0x2A, 0xE4, 0x41, 0x3C, 0x3E, 0xA8, 0x2A, 0xBA, + 0x33, 0x18, 0x41, 0x28, 0x2A, 0xE4, 0x3E, 0xA1, 0x32, 0xF7, 0x32, 0x18, + 0x41, 0x28, 0x64, 0xF7, 0x04, 0xA1, 0x24, 0x28, 0x2E, 0xE4, 0x41, 0x28, + 0x02, 0xA2, 0x4B, 0x17, 0x1E, 0xE4, 0x58, 0xF0, 0x00, 0xA2, 0xDD, 0x19, + 0x1E, 0xE4, 0x2E, 0xE4, 0x20, 0xBA, 0x99, 0x15, 0x1E, 0xE4, 0x2E, 0xE4, + 0xCE, 0xF7, 0x4E, 0xBA, 0x3A, 0xF0, 0x02, 0xA1, 0x3E, 0xA1, 0x2A, 0xE4, + 0x3E, 0xA8, 0x2A, 0xBA, 0x7A, 0xF7, 0x08, 0xAF, 0x3E, 0xA0, 0x2A, 0xE4, + 0x5F, 0x3C, 0x58, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0xE6, 0x12, + 0x18, 0xE4, 0x24, 0x28, 0x88, 0xD1, 0x2E, 0xE4, 0x58, 0x12, 0x1E, 0xE4, + 0x54, 0x3C, 0x02, 0xA0, 0x54, 0x28, 0x01, 0x00, 0x04, 0x00, 0xB3, 0xD1, + 0x28, 0xE4, 0x50, 0x18, 0x55, 0x3C, 0x02, 0xA0, 0x55, 0x28, 0x54, 0x3C, + 0x00, 0xE0, 0x42, 0xBA, 0x2E, 0xE4, 0x51, 0x18, 0x61, 0x08, 0x07, 0x29, + 0x9E, 0xE0, 0x28, 0x02, 0x2E, 0xE4, 0x5D, 0x3C, 0x3E, 0xA5, 0x02, 0xA4, + 0xDA, 0xF0, 0x40, 0xBA, 0x5A, 0xF7, 0x37, 0x28, 0x00, 0xE0, 0x61, 0x08, + 0x0A, 0xAE, 0x40, 0xBA, 0x61, 0x08, 0x07, 0x29, 0x9E, 0xE0, 0x2C, 0x02, + 0x2E, 0xE4, 0x5D, 0x3C, 0x3E, 0xA5, 0x02, 0xA4, 0x61, 0xE1, 0x2E, 0xE4, + 0x5D, 0x3C, 0x48, 0xBA, 0x03, 0xA2, 0x3A, 0xF0, 0x0B, 0x28, 0x00, 0x03, + 0x11, 0x3F, 0x73, 0xB6, 0x5B, 0x2A, 0x3E, 0xF0, 0x1E, 0xE4, 0x43, 0x18, + 0x84, 0xE1, 0x45, 0xCC, 0x1E, 0xE4, 0x11, 0x3D, 0x2D, 0xE4, 0x45, 0x18, + 0x0B, 0x28, 0x11, 0x3D, 0x2D, 0xE4, 0x45, 0x18, 0x90, 0xE1, 0x11, 0x81, + 0x11, 0x81, 0x3A, 0xF0, 0x2D, 0xE4, 0x40, 0xA1, 0x0C, 0xB8, 0x2E, 0xE4, + 0x2A, 0x1A, 0x29, 0x76, 0x29, 0x58, 0x2A, 0xE4, 0x42, 0xE0, 0x46, 0xE0, + 0x46, 0xE0, 0x30, 0xF0, 0x0A, 0xE4, 0x02, 0xA8, 0x6C, 0x28, 0x2E, 0xE4, + 0x11, 0x28, 0x28, 0x3C, 0x0C, 0x28, 0x6F, 0x18, 0x61, 0xE1, 0x2A, 0x3C, + 0x12, 0x28, 0x29, 0x3C, 0x45, 0xCC, 0x11, 0x3F, 0x0B, 0x2A, 0x00, 0x03, + 0x45, 0x18, 0x1E, 0xE4, 0x6E, 0x18, 0x84, 0xE1, 0x45, 0x18, 0x1E, 0xE4, + 0x11, 0x3D, 0x2D, 0xE4, 0x3A, 0xF0, 0x0B, 0x28, 0x11, 0x3D, 0x2D, 0xE4, + 0x6C, 0x28, 0x90, 0xE1, 0x11, 0x81, 0x11, 0x81, 0x0D, 0x28, 0xEA, 0xF1, + 0x06, 0xA1, 0x0A, 0xF2, 0x14, 0x28, 0x29, 0x3C, 0x13, 0x28, 0x28, 0x3C, + 0x0B, 0x2A, 0x00, 0x03, 0x61, 0xE1, 0x2A, 0x3C, 0x11, 0x3F, 0x09, 0x03, + 0x61, 0xE1, 0x01, 0x3F, 0x1E, 0xE4, 0x8F, 0x18, 0x84, 0xE1, 0x45, 0xCC, + 0x1E, 0xE4, 0x11, 0x3D, 0x2D, 0xE4, 0x45, 0x18, 0x0B, 0x28, 0x11, 0x3D, + 0x2D, 0xE4, 0x45, 0x18, 0x90, 0xE1, 0x11, 0x81, 0x11, 0x81, 0x3A, 0xF0, + 0x2A, 0xF0, 0xAF, 0x18, 0xB0, 0x28, 0x2E, 0xE4, 0x6A, 0x3C, 0xAF, 0x18, + 0x4E, 0x28, 0x69, 0x3C, 0x62, 0xE1, 0x00, 0x03, 0x61, 0xE1, 0x2E, 0xE4, + 0x12, 0x3D, 0x11, 0x3D, 0x06, 0xA2, 0x09, 0x03, 0x12, 0x3D, 0x11, 0x3D, + 0xAC, 0x18, 0x1E, 0xE4, 0x11, 0x3D, 0xAC, 0x18, 0x1E, 0xE4, 0x2D, 0xE4, + 0x2E, 0xE4, 0x91, 0x18, 0x1E, 0xE4, 0x12, 0x3D, 0x61, 0x28, 0x2E, 0xE4, + 0x40, 0xA1, 0x0C, 0xB8, 0x3F, 0x19, 0x08, 0xE4, 0x30, 0x28, 0x36, 0xCF, + 0xB0, 0x19, 0x1E, 0xE4, 0xDA, 0xF0, 0x66, 0x28, 0x17, 0xE0, 0xC1, 0x2A, + 0x02, 0xA8, 0x38, 0xCF, 0x00, 0x10, 0x04, 0xE0, 0x5A, 0xF0, 0x52, 0xE0, + 0x02, 0x00, 0x90, 0xD1, 0xEE, 0xF0, 0x02, 0xCF, 0x1A, 0xE4, 0x9A, 0x28, + 0x80, 0xE1, 0x80, 0xE1, 0xF8, 0xF7, 0x20, 0xCB, 0x81, 0xE1, 0xC6, 0x14, + 0x02, 0xCB, 0x3A, 0x19, 0x08, 0xE4, 0x22, 0xCB, 0x02, 0xAF, 0xB7, 0x30, + 0x02, 0xAF, 0xB8, 0x30, 0x02, 0xAF, 0xB5, 0x30, 0x02, 0xAF, 0xB6, 0x30, + 0x02, 0xAF, 0x0B, 0x30, 0x02, 0xAF, 0xC5, 0x30, 0x06, 0xAF, 0x5C, 0x30, + 0x02, 0xAF, 0xAB, 0x30, 0x02, 0xAF, 0x58, 0x30, 0x02, 0xAF, 0x5B, 0x30, + 0x02, 0xAF, 0x56, 0x30, 0x02, 0xAF, 0x59, 0x30, 0x04, 0xAF, 0x6C, 0x3E, + 0x07, 0xA8, 0x49, 0xE0, 0x0A, 0xAF, 0x5D, 0x3E, 0x3F, 0xA8, 0x49, 0xE0, + 0x34, 0x19, 0x08, 0xE4, 0x59, 0x28, 0x5E, 0x3C, 0x91, 0x18, 0x18, 0xE4, + 0x56, 0x2A, 0x56, 0x28, 0x6C, 0x28, 0xAA, 0xF0, 0x66, 0x28, 0x39, 0xF2, + 0x18, 0xE4, 0x6C, 0x28, 0x99, 0x18, 0x1A, 0xE4, 0x7E, 0xF0, 0x3A, 0x19, + 0x0D, 0xE4, 0x51, 0x18, 0x2B, 0x18, 0x1A, 0xE4, 0xC5, 0x4C, 0x58, 0x28, + 0x61, 0x2A, 0x58, 0x28, 0x3A, 0x19, 0x0D, 0xE4, 0x12, 0xB6, 0x66, 0x2A, + 0x06, 0xB6, 0x26, 0x1A, 0x2E, 0x2A, 0x24, 0xCB, 0x26, 0xCF, 0x5F, 0x3C, + 0x24, 0xCB, 0x56, 0xE0, 0x30, 0x46, 0x17, 0xE0, 0x19, 0xE4, 0x24, 0x2A, + 0x01, 0x00, 0x90, 0xD1, 0x9A, 0x28, 0x80, 0xE1, 0x80, 0xE1, 0xE6, 0x12, + 0x20, 0xCB, 0x81, 0xE1, 0xC6, 0x14, 0x1A, 0xE4, 0x02, 0xAE, 0x02, 0xAF, + 0x24, 0xCB, 0xF8, 0xF7, 0xBB, 0x3C, 0x02, 0xA2, 0x24, 0xCF, 0x37, 0x4C, + 0x00, 0xA2, 0x3A, 0x19, 0x08, 0xE4, 0x22, 0xCB, 0x2E, 0xE4, 0x02, 0xA2, + 0x58, 0x12, 0x1E, 0xE4, 0xF5, 0x17, 0x1E, 0xE4, 0x6C, 0x3C, 0x08, 0xA2, + 0x00, 0x00, 0x91, 0xD1, 0x2E, 0xE4, 0x02, 0xA2, 0x90, 0xD1, 0x2E, 0xE4, + 0x00, 0xA2, 0x6A, 0xE1, 0x22, 0xCB, 0xF8, 0xF7, 0x20, 0xCB, 0x02, 0x00, + 0x0E, 0xAF, 0x02, 0xCB, 0x85, 0x19, 0x08, 0xE4, 0x06, 0xAF, 0x5C, 0x3E, + 0x07, 0xA8, 0x49, 0xE0, 0x02, 0xAF, 0x58, 0x30, 0x02, 0xAF, 0x5B, 0x30, + 0x3E, 0xA8, 0x49, 0xE0, 0x08, 0xAF, 0x59, 0x30, 0x59, 0x28, 0x5E, 0x3E, + 0x0B, 0xAF, 0x5D, 0x3C, 0x39, 0x28, 0x78, 0xF0, 0x58, 0x28, 0x98, 0xF2, + 0x1E, 0xE4, 0x3E, 0xF0, 0x2A, 0xF0, 0x3A, 0x44, 0x34, 0x28, 0x85, 0x19, + 0x0D, 0xE4, 0x2B, 0x18, 0x58, 0x28, 0x5F, 0x3C, 0x58, 0x44, 0x16, 0xE0, + 0x26, 0xCF, 0x5F, 0x4C, 0x02, 0xAE, 0x34, 0x44, 0x18, 0xE4, 0x24, 0x28, + 0x01, 0x00, 0x90, 0xD1, 0x9A, 0x28, 0x80, 0xE1, 0x80, 0xE1, 0xE6, 0x12, + 0x21, 0xCB, 0x81, 0xE1, 0xC6, 0x14, 0x1A, 0xE4, 0x85, 0x19, 0x08, 0xE4, + 0x22, 0xCB, 0xF9, 0xF7, 0x02, 0xA2, 0x58, 0x12, 0x1E, 0xE4, 0x00, 0xA2, + 0x02, 0xA2, 0xF5, 0x17, 0x1E, 0xE4, 0x2E, 0xE4, 0x6A, 0xE1, 0x00, 0x00, + 0x91, 0xD1, 0x2E, 0xE4, 0x04, 0xAF, 0x54, 0x28, 0x2E, 0xE4, 0x00, 0xA2, + 0x54, 0x2A, 0x9E, 0xE0, 0x00, 0x04, 0x00, 0xE0, 0x05, 0xAE, 0x13, 0xE0, + 0x07, 0xA1, 0x07, 0xA8, 0xFE, 0xA2, 0x00, 0x5A, 0x1F, 0xA2, 0x00, 0x3E, + 0x59, 0x2A, 0x52, 0xE0, 0x07, 0x29, 0x59, 0xE0, 0x07, 0x3D, 0x56, 0xE0, + 0x00, 0x5A, 0x5B, 0xF0, 0xB6, 0x4E, 0x03, 0xAE, 0xB5, 0x2A, 0xAE, 0xF0, + 0x00, 0x5A, 0x03, 0xAE, 0x0B, 0x4E, 0x03, 0xAE, 0x02, 0xA0, 0x54, 0x28, + 0x07, 0x3D, 0x56, 0xE0, 0x2E, 0xE4, 0xC2, 0x19, 0x1A, 0xE4, 0x50, 0x18, + 0x54, 0x28, 0xC4, 0x19, 0x1A, 0xE4, 0x54, 0x28, 0x92, 0xE0, 0x00, 0x04, + 0x00, 0xE0, 0x04, 0xAF, 0x13, 0xE0, 0x07, 0xA1, 0x07, 0xA8, 0x54, 0x2A, + 0x00, 0x5C, 0x01, 0x29, 0x00, 0x3E, 0x05, 0xAE, 0x2E, 0xF0, 0x04, 0xA2, + 0x2E, 0xE4, 0x1E, 0xA8, 0x41, 0x00, 0xC0, 0xE0, 0x06, 0x3C, 0x06, 0xA2, + 0x42, 0xE0, 0x11, 0xAE, 0x26, 0x00, 0x05, 0xE0, 0x29, 0xCA, 0x42, 0xE0, + 0x0D, 0xAE, 0x55, 0x2A, 0x11, 0xD1, 0x20, 0xCE, 0x80, 0xE1, 0xF9, 0xF7, + 0x06, 0x88, 0x20, 0x00, 0x12, 0xD1, 0x00, 0x04, 0x81, 0xE1, 0xF8, 0xF7, + 0x28, 0xCA, 0x13, 0x01, 0x32, 0x28, 0x61, 0x3C, 0x27, 0x28, 0x2E, 0xE4, + 0x06, 0x00, 0x60, 0xE1, 0x45, 0x3C, 0x43, 0x08, 0x23, 0x1A, 0x1E, 0xE4, + 0xA8, 0xF0, 0x24, 0x28, 0x8A, 0x1A, 0x1E, 0xE4, 0x21, 0x1A, 0x0A, 0xE4, + 0x1E, 0xE4, 0x9E, 0xF0, 0x21, 0x1A, 0x0A, 0xE4, 0x1E, 0xE4, 0x21, 0x1A, + 0x0A, 0xE4, 0xC1, 0x1A, 0x00, 0xA2, 0x21, 0x1A, 0x0A, 0xE4, 0x2B, 0x1B, + 0x0F, 0xC7, 0x53, 0x3C, 0x43, 0x28, 0x4F, 0x3C, 0x27, 0x28, 0x55, 0x3C, + 0x54, 0x34, 0x50, 0x7C, 0x52, 0x18, 0x53, 0x28, 0x5D, 0x3C, 0x61, 0x3C, + 0xAD, 0x1B, 0x1E, 0xE4, 0x1E, 0x1A, 0x0A, 0xE4, 0x61, 0x3C, 0x5D, 0x28, + 0x21, 0x1A, 0x0A, 0xE4, 0x64, 0xCF, 0x53, 0x3C, 0x02, 0xA0, 0x53, 0x28, + 0x78, 0x3C, 0x1A, 0xE0, 0xFF, 0x17, 0x1E, 0xE4, 0x53, 0x28, 0x62, 0xCF, + 0x55, 0x4C, 0x54, 0x20, 0x40, 0xBA, 0x02, 0x1A, 0x08, 0xE4, 0x45, 0x18, + 0x44, 0x3C, 0x53, 0x28, 0x99, 0x15, 0x1E, 0xE4, 0xB3, 0xD1, 0xCE, 0xF7, + 0x6A, 0xE1, 0x2E, 0xE4, 0x61, 0xE1, 0x67, 0x3C, 0x00, 0xA2, 0x20, 0x00, + 0x68, 0x3C, 0x00, 0x08, 0x04, 0xE0, 0x00, 0x08, 0x52, 0x18, 0x53, 0x28, + 0x53, 0x3C, 0x43, 0x28, 0x36, 0xCF, 0x61, 0x28, 0x7F, 0x1A, 0x02, 0xE4, + 0x61, 0x28, 0x03, 0xA2, 0x00, 0x00, 0x99, 0xD1, 0x09, 0xA9, 0x5F, 0x3E, + 0x05, 0xB6, 0x26, 0x18, 0x20, 0xCB, 0x02, 0x00, 0x90, 0xD1, 0x27, 0xCF, + 0x84, 0x1A, 0x08, 0xE4, 0x22, 0xCB, 0xF8, 0xF7, 0x02, 0xAF, 0xB6, 0x30, + 0x04, 0xAF, 0x02, 0xCB, 0x00, 0xA2, 0x0B, 0x30, 0x04, 0xAF, 0xB5, 0x30, + 0x49, 0xE0, 0x20, 0xAF, 0x02, 0xCB, 0x59, 0x3C, 0x06, 0xAE, 0x5F, 0x4C, + 0x02, 0xAE, 0xFE, 0xA8, 0x5D, 0x3E, 0x3F, 0xA8, 0x11, 0x3D, 0x08, 0xA9, + 0x11, 0x35, 0x2C, 0xCB, 0xBB, 0xF0, 0x5F, 0x2A, 0x11, 0x3D, 0x11, 0x35, + 0x2E, 0xCB, 0x11, 0x3D, 0x2E, 0xF0, 0x11, 0x3D, 0x11, 0x35, 0x30, 0xCB, + 0xF0, 0x08, 0x02, 0xE0, 0x82, 0xE0, 0x31, 0x81, 0x67, 0x28, 0x19, 0x1C, + 0x1E, 0xE4, 0x84, 0xF0, 0x00, 0x08, 0x61, 0xE1, 0x67, 0x3C, 0x02, 0xA0, + 0x08, 0x00, 0x90, 0xD1, 0x58, 0xF0, 0x5F, 0x28, 0x61, 0x3C, 0x5D, 0x28, + 0xF8, 0xF7, 0x20, 0xCB, 0x32, 0xCB, 0x53, 0x3C, 0x02, 0xA0, 0x53, 0x28, + 0x64, 0xBA, 0x2E, 0x1A, 0x0A, 0xE4, 0x08, 0xA8, 0x2E, 0xE4, 0x02, 0xA2, + 0x45, 0x3E, 0x53, 0x2A, 0x53, 0x3C, 0x43, 0x28, 0x00, 0x00, 0x91, 0xD1, + 0x03, 0xA1, 0x43, 0x1A, 0x2E, 0xE4, 0x00, 0xA2, 0x1E, 0xE4, 0x7A, 0xF0, + 0x67, 0x28, 0x45, 0xCC, 0x1E, 0xE4, 0x67, 0x3C, 0x00, 0xA2, 0x19, 0x1C, + 0x84, 0xE1, 0x00, 0x08, 0x61, 0xE1, 0x1B, 0x1C, 0x2D, 0xF2, 0x09, 0xB8, + 0x40, 0xBA, 0xB0, 0x1A, 0x01, 0x2B, 0x16, 0xAE, 0x56, 0xE0, 0x08, 0xAE, + 0x82, 0xE0, 0x31, 0x81, 0x11, 0x3D, 0x56, 0xE0, 0x1E, 0xE4, 0xA4, 0xF0, + 0xF0, 0x08, 0x02, 0xE0, 0x67, 0x3C, 0x02, 0xA0, 0x67, 0x28, 0x19, 0x1C, + 0x00, 0x08, 0x61, 0xE1, 0x1B, 0x1C, 0x1E, 0xE4, 0x1E, 0xE4, 0x9A, 0xF0, + 0x67, 0x28, 0x90, 0xE1, 0x1E, 0xE4, 0x67, 0x3C, 0x00, 0xA2, 0x19, 0x1C, + 0x02, 0xA2, 0x67, 0x3C, 0x02, 0xA2, 0x1B, 0x1C, 0x00, 0xA2, 0x53, 0x3C, + 0x43, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x20, 0x00, 0xB3, 0xD1, 0x2E, 0xE4, + 0x43, 0x28, 0x00, 0x08, 0x61, 0xE1, 0x67, 0x3C, 0x68, 0x3E, 0x53, 0x3C, + 0x00, 0x08, 0x05, 0xE0, 0x22, 0x1B, 0x02, 0xE4, 0x52, 0x18, 0x53, 0x28, + 0x11, 0x3D, 0xD6, 0x1A, 0x0A, 0xE4, 0x40, 0xBA, 0x0E, 0xA1, 0x02, 0xB8, + 0x01, 0x1B, 0x0E, 0xE4, 0x0E, 0xA0, 0x6A, 0xF7, 0x27, 0x1B, 0x0D, 0xE4, + 0x02, 0xAF, 0x5A, 0x30, 0x02, 0xAF, 0x58, 0x30, 0x5A, 0x28, 0x01, 0x3C, + 0x02, 0xAF, 0x5B, 0x30, 0x58, 0x4C, 0x0E, 0xAE, 0x01, 0x4C, 0x04, 0xAE, + 0x11, 0x3D, 0x02, 0xAE, 0x5B, 0x4C, 0x02, 0xAE, 0x70, 0xB6, 0x5B, 0x28, + 0x18, 0xF1, 0x58, 0x28, 0x1E, 0xE4, 0xFC, 0x1A, 0x84, 0xE1, 0x44, 0xCC, + 0x11, 0x3D, 0x27, 0x1B, 0x0D, 0xE4, 0x45, 0x18, 0x27, 0x1B, 0x0D, 0xE4, + 0x45, 0x18, 0x1E, 0xE4, 0x2A, 0xF0, 0x58, 0x28, 0x4E, 0xF0, 0x11, 0x3D, + 0xF0, 0x08, 0x02, 0xE0, 0x82, 0xE0, 0x31, 0x81, 0x67, 0x28, 0x19, 0x1C, + 0x1E, 0xE4, 0x84, 0xF0, 0x00, 0x08, 0x61, 0xE1, 0x67, 0x3C, 0x02, 0xA0, + 0x99, 0xD1, 0x53, 0x3C, 0x02, 0xA0, 0x53, 0x28, 0x20, 0xCB, 0x08, 0x00, + 0x90, 0xD1, 0x02, 0x00, 0x0A, 0xE4, 0x08, 0xA8, 0x32, 0xCB, 0xF8, 0xF7, + 0xB6, 0x30, 0x04, 0xAF, 0x02, 0xCB, 0xCC, 0x1A, 0x0B, 0x30, 0x04, 0xAF, + 0xB5, 0x30, 0x02, 0xAF, 0x53, 0x2A, 0x60, 0xBA, 0x59, 0x30, 0x0E, 0xAF, + 0x43, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x45, 0x3E, 0x43, 0x1A, 0x2E, 0xE4, + 0x00, 0xA2, 0x53, 0x3C, 0x7A, 0xF0, 0x67, 0x28, 0x45, 0xCC, 0x03, 0xA1, + 0x67, 0x3C, 0x00, 0xA2, 0x19, 0x1C, 0x1E, 0xE4, 0x00, 0x08, 0x61, 0xE1, + 0x1B, 0x1C, 0x1E, 0xE4, 0x00, 0x3C, 0x01, 0x29, 0x9A, 0x1B, 0x84, 0xE1, + 0x45, 0x1B, 0x0B, 0xE4, 0x03, 0xA8, 0x49, 0xE0, 0x0E, 0xE4, 0x11, 0x3F, + 0x5D, 0x3C, 0x61, 0x28, 0x02, 0xAF, 0x5B, 0x30, 0x02, 0xAF, 0x8C, 0x1B, + 0x58, 0x28, 0x5A, 0x30, 0x12, 0xAF, 0x58, 0x30, 0x02, 0xCF, 0x12, 0xAE, + 0x5A, 0x4C, 0x04, 0xAE, 0x61, 0x2A, 0x58, 0x28, 0x36, 0xCF, 0x61, 0x28, + 0x08, 0xA9, 0x5F, 0x3C, 0x06, 0xB6, 0x26, 0x1A, 0x00, 0x28, 0x02, 0x00, + 0x90, 0xD1, 0x26, 0xCF, 0x20, 0xCB, 0x00, 0x3C, 0xFF, 0x07, 0x08, 0xE0, + 0xA7, 0x1B, 0x08, 0xE4, 0x22, 0xCB, 0xF8, 0xF7, 0x12, 0xAF, 0x5C, 0x30, + 0x0E, 0xAF, 0x02, 0xCB, 0x0E, 0xAF, 0x5D, 0x3E, 0x51, 0xE0, 0x3F, 0xA2, + 0x5E, 0x4C, 0x08, 0xAE, 0x5C, 0x28, 0x5E, 0x3C, 0x5F, 0x4C, 0x02, 0xAE, + 0x5D, 0x4C, 0x0E, 0xAE, 0x58, 0x28, 0x11, 0x3D, 0x00, 0x4C, 0x06, 0xAE, + 0x2C, 0xCB, 0xBA, 0xF0, 0x5F, 0x28, 0xFA, 0xF0, 0x11, 0x35, 0x2E, 0xCB, + 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, 0x30, 0xCB, 0x11, 0x3D, + 0x11, 0x81, 0x6E, 0xF0, 0x31, 0x81, 0x8E, 0xF0, 0x31, 0x81, 0x2A, 0xF0, + 0x5B, 0x28, 0x11, 0x81, 0xA4, 0xF0, 0xF0, 0x08, 0x02, 0xE0, 0x82, 0xE0, + 0x02, 0xA0, 0x67, 0x28, 0x19, 0x1C, 0x1E, 0xE4, 0x61, 0xE1, 0x1B, 0x1C, + 0x1E, 0xE4, 0x67, 0x3C, 0x67, 0x28, 0x61, 0x3C, 0x5D, 0x28, 0x00, 0x08, + 0x00, 0xA2, 0x19, 0x1C, 0x1E, 0xE4, 0x9A, 0xF0, 0x02, 0xA2, 0x1B, 0x1C, + 0x1E, 0xE4, 0x67, 0x3C, 0x91, 0xD1, 0x2E, 0xE4, 0x02, 0xA2, 0x67, 0x3C, + 0x00, 0xA2, 0x53, 0x3C, 0x43, 0x28, 0x00, 0x00, 0x68, 0x28, 0x36, 0xCF, + 0x61, 0x28, 0x2E, 0xE4, 0x59, 0x2A, 0x59, 0x30, 0x11, 0x29, 0x92, 0xE0, + 0x5B, 0x30, 0x02, 0xAF, 0x0C, 0x1C, 0x09, 0xE4, 0x5F, 0x30, 0x02, 0xAF, + 0x58, 0x30, 0x02, 0xAF, 0x5D, 0x3E, 0x51, 0xE0, 0x3F, 0xA2, 0x02, 0xAF, + 0x5E, 0x3E, 0x51, 0xE0, 0x7F, 0xA2, 0x0A, 0xAF, 0xC8, 0xF0, 0x58, 0x28, + 0x5C, 0x3C, 0x0C, 0xAF, 0x5B, 0x2A, 0x0E, 0xA2, 0x01, 0x03, 0x62, 0xE1, + 0xD1, 0x1B, 0x84, 0xE1, 0x44, 0xCC, 0x36, 0xB6, 0x5F, 0x28, 0xEE, 0xF0, + 0x12, 0x3D, 0x11, 0x29, 0x2C, 0xCF, 0x11, 0x4D, 0x11, 0x21, 0xBA, 0xF0, + 0x11, 0x21, 0x2E, 0xCF, 0x11, 0x4D, 0x11, 0x21, 0x31, 0x81, 0x2E, 0xF0, + 0x30, 0xCF, 0x11, 0x4D, 0x02, 0xAE, 0x59, 0x4C, 0x08, 0xAE, 0x5E, 0x28, + 0x14, 0xAE, 0x5B, 0x4C, 0x02, 0xAE, 0x58, 0x4C, 0x90, 0xD1, 0x26, 0xCF, + 0x5F, 0x28, 0x02, 0xCF, 0xE6, 0x12, 0x18, 0xE4, 0x24, 0x28, 0x01, 0x00, + 0x1A, 0xE4, 0x9A, 0x28, 0x80, 0xE1, 0x80, 0xE1, 0xF8, 0xF7, 0x20, 0xCB, + 0x81, 0xE1, 0xC6, 0x14, 0x1E, 0xE4, 0x00, 0xA2, 0x88, 0xF1, 0x22, 0xCB, + 0x02, 0xE0, 0x68, 0x3C, 0x82, 0xE0, 0x58, 0x12, 0x1B, 0x1C, 0x1E, 0xE4, + 0x94, 0xF0, 0xF0, 0x08, 0x04, 0xE0, 0x67, 0x3C, 0x02, 0xA0, 0x67, 0x28, + 0x2E, 0xE4, 0x02, 0xA2, 0x68, 0x3C, 0x00, 0x08, 0xF5, 0x17, 0x1E, 0xE4, + 0x00, 0x10, 0x81, 0xD1, 0x6A, 0xE1, 0x00, 0x00, 0x91, 0xD1, 0xDE, 0xF6, + 0x00, 0xA2, 0x46, 0x3C, 0x02, 0xA0, 0x46, 0x28, 0x06, 0xA2, 0x2E, 0xF0, + 0x04, 0xA2, 0x2E, 0xE4, 0x05, 0xE0, 0x46, 0x00, 0xC0, 0xE0, 0x06, 0x3C, + 0x11, 0xAE, 0x67, 0x0A, 0x67, 0x0A, 0xA9, 0x00, 0x20, 0xCE, 0xF9, 0xF7, + 0x29, 0xCA, 0x42, 0xE0, 0x00, 0x01, 0x12, 0xD1, 0x00, 0x08, 0x11, 0xD1, + 0xF8, 0xF7, 0x28, 0xCA, 0x26, 0xCE, 0x06, 0x28, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x2E, 0xE4, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, + 0x60, 0x00, 0x80, 0x00, 0x09, 0x00, 0x0B, 0x00, 0x90, 0x00, 0xB0, 0x00, + 0x12, 0x00, 0x16, 0x00, 0x20, 0x01, 0x60, 0x01, 0x12, 0x00, 0x58, 0x00, + 0x40, 0x02, 0xC0, 0x02, 0x12, 0x00, 0x60, 0x01, 0x80, 0x04, 0x80, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0F, 0x00, 0x0D, 0x00, 0x63, 0x00, + 0x00, 0x00, 0x17, 0x00, 0x15, 0x00, 0x13, 0x00, 0x02, 0x00, 0x01, 0x00, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, + 0xFD, 0xFF, 0xFE, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, + 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0xFB, 0xFF, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x3C, 0x03, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x56, 0x03, 0x0E, 0xE4, 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, + 0x27, 0xD0, 0x68, 0xE1, 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x04, 0xE0, 0x5A, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, + 0xC2, 0xE0, 0x00, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, + 0x74, 0x01, 0x1E, 0xE4, 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, + 0xEE, 0x28, 0x4E, 0xF0, 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, + 0x00, 0xCE, 0x1A, 0xE0, 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, + 0x96, 0x00, 0x1E, 0xE4, 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, + 0x9E, 0xE0, 0x42, 0x01, 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, + 0x07, 0x9F, 0x02, 0xA2, 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, + 0x6A, 0xE1, 0x3C, 0x03, 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, + 0x7C, 0xE6, 0x00, 0xC0, 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, + 0x11, 0xAE, 0x5E, 0x00, 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, + 0xEF, 0x3C, 0x56, 0xE0, 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, + 0x3E, 0xAE, 0x02, 0xA2, 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, + 0xC0, 0xE0, 0x07, 0x9F, 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, + 0x5D, 0x00, 0xC3, 0xE0, 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, + 0x00, 0xCE, 0x1A, 0xE0, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, + 0x00, 0x00, 0x04, 0xE0, 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, + 0x78, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, + 0x28, 0xCC, 0x04, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, + 0x05, 0xE0, 0x20, 0xAE, 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0x38, 0xD6, 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, + 0x00, 0xA2, 0x71, 0x00, 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, + 0x01, 0x00, 0x27, 0xD0, 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, + 0x2B, 0xF3, 0x03, 0xA1, 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, + 0x7B, 0xF1, 0x03, 0xA1, 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, + 0x3B, 0xF1, 0x05, 0xA1, 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, + 0x9B, 0xF1, 0x03, 0xA1, 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, + 0xAE, 0xF1, 0x2A, 0xA2, 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, + 0xC1, 0xE0, 0x5A, 0xA2, 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, + 0x04, 0xE0, 0xFB, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, + 0xCE, 0xF0, 0x4E, 0x00, 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, + 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, + 0x16, 0xAE, 0x72, 0x00, 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, + 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, 0x4E, 0x02, 0x1E, 0xE4, + 0x2E, 0xE4, 0xE1, 0xE1, 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x98, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, + 0x5B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, + 0xC0, 0xE0, 0x7C, 0xE6, 0x5C, 0x03, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, + 0x10, 0xA8, 0x5B, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, + 0x01, 0xC4, 0x00, 0xA2, 0x7C, 0xE6, 0x5E, 0x03, 0x61, 0xE1, 0x11, 0x3D, + 0xEB, 0x00, 0x88, 0xE1, 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, + 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, + 0x00, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, + 0x1E, 0xE4, 0x13, 0x01, 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0xEE, 0x01, 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, + 0x2E, 0xE4, 0x70, 0x00, 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, + 0x6B, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, + 0x33, 0xAE, 0x09, 0xA8, 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, + 0x6A, 0x00, 0xC0, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, + 0x2E, 0xE4, 0x07, 0x3D, 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, + 0xA0, 0x01, 0x67, 0xE1, 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, + 0xDA, 0xF7, 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, + 0xC2, 0xE0, 0x08, 0xA2, 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, + 0x90, 0x01, 0x1A, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, + 0xF0, 0x3C, 0x3E, 0xA2, 0x2E, 0xE4, 0x4A, 0x00, 0x78, 0x00, 0xC2, 0xE0, + 0xF0, 0x58, 0x02, 0xA2, 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0x20, 0xA2, + 0x00, 0xA2, 0x76, 0x00, 0xC2, 0xE0, 0x20, 0xA2, 0xC2, 0xE0, 0xFC, 0xA2, + 0x72, 0x00, 0xC2, 0xE0, 0x71, 0x00, 0xC2, 0xE0, 0xFA, 0xA2, 0x77, 0x00, + 0x84, 0xE1, 0x0F, 0x27, 0x22, 0xD0, 0x2E, 0xE4, 0x48, 0xF0, 0x4A, 0x00, + 0xC0, 0xE0, 0xAA, 0x01, 0xC0, 0xE0, 0xE8, 0xF7, 0x1F, 0x04, 0xC0, 0xE0, + 0x00, 0xA2, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, + 0x1C, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x11, 0x00, 0x04, 0xE0, 0x9D, 0x01, + 0xAF, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, 0x3C, 0x04, 0xD8, 0xF7, 0xEE, 0xA1, + 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0xE0, 0x01, 0x04, 0xE0, + 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, + 0xE8, 0xF7, 0x0D, 0x00, 0x45, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3C, 0x04, + 0x28, 0xE4, 0x04, 0xA1, 0x0E, 0xA8, 0x04, 0xAF, 0xC0, 0xE0, 0x4A, 0x00, + 0xC2, 0xE0, 0x02, 0xA2, 0x48, 0xCA, 0x8E, 0xF9, 0xE8, 0xF7, 0x11, 0x01, + 0xAF, 0x01, 0x1E, 0xE4, 0xE8, 0xF7, 0x02, 0xA8, 0xD8, 0xF7, 0xEE, 0xA1, + 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0xF8, 0x01, 0x04, 0xE0, + 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, + 0xE8, 0xF7, 0x0D, 0x00, 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x3C, 0x04, + 0x42, 0x3C, 0x43, 0x34, 0x01, 0xC0, 0x2E, 0xE4, 0x43, 0x2C, 0x01, 0xC0, + 0x2E, 0xE4, 0x00, 0xC0, 0x32, 0x1C, 0x2A, 0xE4, 0x00, 0xC0, 0x42, 0x2E, + 0x30, 0x18, 0x10, 0xAF, 0x4A, 0xE0, 0xB4, 0xF0, 0x31, 0x1A, 0xFF, 0x00, + 0x09, 0xE0, 0x74, 0xF0, 0xFE, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x34, 0xF0, + 0x1E, 0xF1, 0x5D, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x01, 0xC0, 0xEE, 0xF0, + 0x5E, 0x3C, 0x01, 0xC0, 0x5F, 0x3C, 0x01, 0xC0, 0xBE, 0xF0, 0x5E, 0x28, + 0x5E, 0x1A, 0x5D, 0x2A, 0x01, 0xC0, 0x8E, 0xF0, 0x5F, 0x2A, 0x01, 0xC0, + 0x3E, 0xF0, 0x1B, 0xE0, 0x08, 0x08, 0xC2, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0x02, 0x08, 0x62, 0xE1, 0x0B, 0x08, 0xC3, 0xE0, 0x12, 0x9F, 0x00, 0xA2, + 0x12, 0x9F, 0x02, 0xA2, 0x92, 0x9F, 0x00, 0x02, 0x05, 0xE0, 0x12, 0x9F, + 0x82, 0xE0, 0x12, 0x81, 0x12, 0x9F, 0x12, 0x9F, 0x12, 0x81, 0x12, 0x9F, + 0x00, 0xA2, 0x12, 0x9F, 0xC0, 0xE0, 0x00, 0x08, 0xC2, 0xE0, 0x02, 0xA2, + 0x1E, 0xE4, 0x2E, 0xE4, 0xE8, 0xF7, 0x00, 0x08, 0x32, 0xA2, 0x20, 0x06, + 0x60, 0xD1, 0x4E, 0x02, 0x40, 0xCE, 0x2E, 0xE4, 0xC0, 0xCE, 0x18, 0xAE, + 0x02, 0x00, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, 0x02, 0xA8, 0x48, 0xCA, + 0x80, 0x00, 0x23, 0xD1, 0x22, 0xAE, 0x04, 0xA2, 0x2E, 0xE4, 0xE8, 0xF7, + 0x8C, 0xCC, 0x72, 0xCC, 0x00, 0xA2, 0x9E, 0xCC, 0x20, 0xAE, 0x10, 0xA8, + 0x04, 0xE0, 0x8E, 0xCC, 0x6F, 0xD1, 0x4A, 0xCE, 0x22, 0x93, 0x0A, 0xE0, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x03, 0x00, 0x60, 0xA2, 0x2E, 0xE4, + 0x00, 0x00, 0x6F, 0xD1, 0xEA, 0xF7, 0x02, 0xA8, 0x50, 0xCA, 0x50, 0xCE, + 0x20, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0xC2, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0x50, 0xCE, 0x3D, 0x04, 0xC1, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, + 0x00, 0x01, 0x0A, 0xE0, 0xD9, 0xF7, 0xEF, 0xA1, 0x1E, 0xE4, 0x2E, 0xE4, + 0x1C, 0x04, 0xC2, 0xE0, 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0xC2, 0x02, + 0x72, 0x02, 0x1E, 0xE4, 0x1F, 0x00, 0x08, 0xE0, 0x37, 0x03, 0x1E, 0xE4, + 0xFD, 0x02, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x12, 0xAE, + 0xE8, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x27, 0x03, 0x04, 0xA8, 0x10, 0x02, + 0xC0, 0xE0, 0x2A, 0xE4, 0x08, 0xE0, 0x15, 0x02, 0xC0, 0xE0, 0x18, 0xF1, + 0x16, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, 0x08, 0xE0, 0x13, 0x02, + 0xC0, 0xE0, 0xBE, 0xF0, 0x14, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, + 0x1E, 0xE4, 0x0B, 0x02, 0xC0, 0xE0, 0x3E, 0xF0, 0x1E, 0xE4, 0xFD, 0x02, + 0x1E, 0xE4, 0x72, 0x02, 0x10, 0x02, 0xC1, 0xE0, 0x12, 0xAE, 0x37, 0x03, + 0xC1, 0xE0, 0x56, 0xE0, 0x15, 0xAE, 0x03, 0xA8, 0x07, 0xAE, 0x7F, 0xA8, + 0x0B, 0xAF, 0x04, 0x02, 0x0F, 0xA8, 0x04, 0x02, 0xC1, 0xE0, 0x56, 0xE0, + 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x56, 0xE0, 0x44, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x27, 0x03, 0x52, 0xE0, 0x1F, 0xAE, 0x03, 0xA2, 0x92, 0xE0, + 0x94, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0xEA, 0xF1, 0x84, 0xE0, 0x8A, 0xF1, + 0x06, 0xA8, 0x08, 0xAF, 0x21, 0xA8, 0x85, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, + 0xC0, 0xE0, 0x0A, 0xF1, 0x56, 0xE0, 0x17, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, + 0x12, 0xAF, 0x44, 0x00, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, + 0x3A, 0xF0, 0x56, 0xE0, 0x03, 0xA8, 0x1B, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, + 0x2E, 0xE4, 0x02, 0xA2, 0x1F, 0xAE, 0x03, 0xA2, 0x44, 0x00, 0xC0, 0xE0, + 0xC2, 0x02, 0x1E, 0xE4, 0xEA, 0xF0, 0x52, 0xE0, 0x69, 0xF0, 0xCE, 0x03, + 0x1E, 0xE4, 0xB8, 0xF0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0xC0, 0xE0, + 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x38, 0xF0, 0x08, 0xE0, 0x1C, 0x04, + 0xC0, 0xE0, 0x2E, 0xE4, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, 0xFF, 0x00, + 0x04, 0xAE, 0x02, 0xA0, 0x00, 0x05, 0x00, 0xE0, 0xC2, 0xE0, 0x02, 0xA2, + 0x1A, 0x04, 0xC2, 0xE0, 0xEA, 0xF7, 0x19, 0x04, 0xC0, 0xE0, 0x18, 0x04, + 0xC0, 0xE0, 0x18, 0x04, 0xC2, 0xE0, 0x02, 0xA2, 0x1B, 0x04, 0xC0, 0xE0, + 0xEA, 0xF7, 0x19, 0x04, 0x28, 0xAE, 0x08, 0xAF, 0x1E, 0xA0, 0x20, 0xAF, + 0xFF, 0xFF, 0x09, 0xE0, 0x1B, 0x04, 0xC1, 0xE0, 0x56, 0xE0, 0x09, 0xAE, + 0x09, 0xAF, 0x1F, 0xA0, 0xC0, 0xE0, 0x2E, 0xE4, 0x1D, 0x04, 0xC2, 0xE0, + 0xC2, 0xE0, 0x00, 0x02, 0x0A, 0xE0, 0x1C, 0x04, 0xF0, 0xF7, 0x02, 0xA1, + 0x28, 0xA2, 0x1C, 0x04, 0x00, 0x02, 0x0C, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, + 0xC0, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, + 0x04, 0xAF, 0x44, 0x00, 0x60, 0x03, 0x0E, 0xE4, 0xAC, 0x0B, 0x0E, 0xE4, + 0x68, 0x03, 0x0E, 0xE4, 0x64, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6E, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x72, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xB8, 0x04, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x11, 0x05, 0x1E, 0xE4, 0xB6, 0x01, 0x1E, 0xE4, + 0x12, 0x05, 0x1E, 0xE4, 0x03, 0x06, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x55, 0x06, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xAE, 0x03, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x55, 0xE0, 0x07, 0xAE, 0x17, 0xE0, 0x72, 0x2A, + 0x56, 0xE0, 0x0A, 0xAE, 0xA5, 0x03, 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, + 0x02, 0x01, 0xC2, 0xE0, 0x17, 0xE0, 0x72, 0x2A, 0xAE, 0x03, 0x1E, 0xE4, + 0xA5, 0x03, 0x1E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, 0x0F, 0xAE, 0x83, 0xE0, + 0x56, 0xE0, 0x06, 0xAE, 0x2E, 0xE4, 0x13, 0x02, 0xC2, 0xE0, 0x56, 0xE0, + 0x72, 0x2A, 0xAE, 0x03, 0x1E, 0xE4, 0x92, 0xE0, 0x1E, 0xE4, 0x55, 0xE0, + 0x09, 0xAE, 0x17, 0xE0, 0x83, 0xE0, 0x56, 0xE0, 0x06, 0xAE, 0xA5, 0x03, + 0x15, 0x02, 0xC2, 0xE0, 0x56, 0xE0, 0x0F, 0xAE, 0x06, 0xAF, 0x44, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, + 0x44, 0x00, 0xC0, 0xE0, 0x58, 0xF0, 0x80, 0xA8, 0x60, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x0E, 0xA8, 0xC1, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x20, 0xAF, + 0x56, 0xE0, 0x03, 0xAE, 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0xFF, 0x00, 0x08, 0xE0, 0x2E, 0xE4, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, + 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x13, 0xA2, + 0x39, 0xF0, 0x05, 0xA1, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0xA2, + 0xC1, 0xE0, 0x2E, 0xE4, 0x07, 0xA8, 0x23, 0xAF, 0x05, 0xA1, 0x07, 0xA8, + 0x23, 0xAF, 0x44, 0x00, 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, + 0x20, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, + 0x28, 0xE4, 0x02, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x60, 0xA8, + 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, 0x3E, 0xA8, 0x02, 0xA2, 0x9E, 0xE0, + 0x00, 0x05, 0x00, 0xE0, 0x20, 0x04, 0xC0, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, + 0xAA, 0x03, 0x1E, 0xE4, 0xDA, 0xF7, 0x02, 0xA8, 0x1E, 0xE4, 0xB7, 0x03, + 0x1E, 0xE4, 0x04, 0xAF, 0x1E, 0xA8, 0x04, 0x04, 0x0B, 0xE4, 0xBF, 0x03, + 0x56, 0xE0, 0x09, 0xAE, 0xC4, 0x03, 0x1E, 0xE4, 0x09, 0xE0, 0x6E, 0x00, + 0xC1, 0xE0, 0x20, 0xAE, 0x1E, 0xE4, 0x17, 0x9F, 0x56, 0xE0, 0xFF, 0x1F, + 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x83, 0x04, 0x15, 0x04, 0x84, 0xE1, + 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, + 0x1D, 0x04, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0xC3, 0xE0, 0x01, 0xA2, + 0x17, 0x9F, 0x14, 0x9E, 0x1F, 0x3E, 0xEC, 0x3C, 0x2E, 0xE4, 0x0D, 0x04, + 0x20, 0x00, 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x11, 0xD1, 0x1F, 0x08, + 0x42, 0xE0, 0x11, 0xAE, 0x80, 0x01, 0x00, 0xE0, 0x5E, 0xF8, 0x00, 0x04, + 0x12, 0xD1, 0x20, 0xCE, 0x40, 0x0B, 0x11, 0xD1, 0x29, 0xCA, 0x13, 0x01, + 0xEC, 0x88, 0xC0, 0x00, 0x01, 0xA2, 0x06, 0xA2, 0x2E, 0xE4, 0xF9, 0xF7, + 0x94, 0xE0, 0x40, 0x28, 0x22, 0x04, 0x1E, 0xE4, 0x92, 0xE0, 0x24, 0xE4, + 0x02, 0xA1, 0x2C, 0x28, 0x59, 0x04, 0x1E, 0xE4, 0x0C, 0xC4, 0x49, 0xE0, + 0x95, 0xE0, 0x40, 0x2A, 0x8E, 0xF7, 0x82, 0xE0, 0x23, 0xA1, 0x23, 0xA8, + 0x60, 0x00, 0xC1, 0xE0, 0x95, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0x49, 0xF0, + 0x59, 0x04, 0x1E, 0xE4, 0x04, 0xC4, 0x2C, 0x2A, 0x18, 0xE0, 0x86, 0xC7, + 0xA4, 0xCC, 0x2E, 0xE4, 0x00, 0xE0, 0x9A, 0xE0, 0x00, 0x04, 0x00, 0xE0, + 0x01, 0xE0, 0x07, 0xAE, 0x9C, 0xE0, 0x40, 0x07, 0xAE, 0x03, 0x1E, 0xE4, + 0x9F, 0xE0, 0x00, 0x05, 0x89, 0xE0, 0xB7, 0x03, 0x1E, 0xE4, 0x04, 0xAF, + 0xD3, 0x03, 0x1E, 0xE4, 0x1E, 0xA8, 0x69, 0xF0, 0x85, 0xE0, 0x20, 0xAE, + 0x56, 0xE0, 0x09, 0xAE, 0x7F, 0x04, 0x1E, 0xE4, 0x17, 0x9F, 0x42, 0xE0, + 0x17, 0x9F, 0x83, 0x04, 0x1B, 0xE4, 0x89, 0xE0, 0x30, 0x20, 0x2E, 0xE4, + 0x8E, 0x04, 0x1E, 0xE4, 0x30, 0x20, 0x2E, 0xE4, 0x08, 0xAE, 0x31, 0x4C, + 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x31, 0x4C, 0x30, 0x4C, 0x31, 0x20, + 0x39, 0xF0, 0x23, 0xA1, 0xC2, 0xE0, 0x02, 0xA2, 0x2E, 0xE4, 0x08, 0xAE, + 0xC0, 0xE0, 0x0E, 0x04, 0xC2, 0xE0, 0x0D, 0x04, 0x22, 0xD0, 0xDA, 0xF7, + 0x02, 0xA8, 0x20, 0x04, 0x15, 0x21, 0x9D, 0x04, 0x84, 0xE1, 0x02, 0x00, + 0x02, 0x00, 0x22, 0xD0, 0x17, 0x9F, 0x15, 0x4D, 0x16, 0x4D, 0x16, 0x21, + 0xA4, 0x04, 0x84, 0xE1, 0x0D, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x17, 0x9F, + 0xC0, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x45, 0x3E, 0x1F, 0xA8, + 0x49, 0xE0, 0x60, 0x00, 0x65, 0x00, 0xC0, 0xE0, 0x44, 0x30, 0x08, 0xAF, + 0x2E, 0xE4, 0x5A, 0x3C, 0x0E, 0xA8, 0x04, 0xAF, 0x4E, 0x02, 0x1E, 0xE4, + 0x26, 0x01, 0x1E, 0xE4, 0x30, 0xD1, 0x4C, 0xCC, 0x4A, 0xCC, 0x00, 0xA2, + 0x4C, 0xD0, 0x01, 0x00, 0x4B, 0xD0, 0x03, 0x00, 0x3A, 0xD0, 0x00, 0x00, + 0x08, 0xD0, 0x00, 0x00, 0x3E, 0xA2, 0x7F, 0x3C, 0x00, 0xA2, 0x00, 0x00, + 0x00, 0xA1, 0x62, 0x0B, 0x1E, 0xE4, 0xF0, 0x3C, 0x00, 0xA1, 0x0D, 0x08, + 0x1E, 0xE4, 0x7A, 0xF0, 0x1E, 0xE4, 0x7F, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, + 0x1E, 0xE4, 0xDE, 0x04, 0x1E, 0xE4, 0x33, 0x0A, 0xC2, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0x10, 0x0C, 0x64, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x63, 0x00, + 0x00, 0xA2, 0x6D, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, 0xC2, 0xE0, 0x7F, 0x28, + 0x6E, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0xB6, 0x4C, 0xB5, 0x20, 0x70, 0x00, + 0x72, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, 0x71, 0x00, 0x00, 0xA2, 0x73, 0x00, + 0xC2, 0xE0, 0x04, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0x74, 0x00, 0xC2, 0xE0, + 0x76, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, 0x75, 0x00, 0x16, 0xE0, 0x7F, 0x28, + 0x77, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, + 0x7A, 0x00, 0xC2, 0xE0, 0x79, 0x00, 0xC2, 0xE0, 0x7B, 0x00, 0xC2, 0xE0, + 0x2E, 0xAE, 0x72, 0x28, 0x44, 0xCC, 0x00, 0xA2, 0x2E, 0xE4, 0x2E, 0xE4, + 0xB1, 0x3C, 0xB0, 0x3C, 0x4C, 0xCC, 0x4A, 0xCC, 0xB7, 0x28, 0x28, 0x3C, + 0x29, 0x3C, 0x33, 0x3C, 0x31, 0x28, 0x50, 0x3C, 0x02, 0xA2, 0xB8, 0xF0, + 0x30, 0x84, 0x50, 0x3C, 0x50, 0x7C, 0x0F, 0xC7, 0x1E, 0xE4, 0x50, 0x3C, + 0x18, 0xE0, 0x50, 0x82, 0x1E, 0xE4, 0x66, 0x06, 0x1E, 0xE4, 0xAB, 0x04, + 0x08, 0xD0, 0x03, 0x00, 0x30, 0xD1, 0x80, 0x06, 0x1E, 0xE4, 0x00, 0x00, + 0x3A, 0xD0, 0x00, 0x00, 0x06, 0xA2, 0x99, 0x05, 0x0A, 0xE4, 0x8D, 0x0B, + 0x1E, 0xE4, 0x22, 0x04, 0x1E, 0xE4, 0x01, 0xA2, 0x1E, 0xE4, 0xDD, 0x03, + 0x1E, 0xE4, 0x3A, 0x04, 0x77, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, 0x7B, 0x02, + 0x02, 0xA2, 0x71, 0x00, 0xC2, 0xE0, 0xFA, 0xA2, 0xDA, 0x0B, 0x1E, 0xE4, + 0x76, 0x00, 0xC2, 0xE0, 0x19, 0xE4, 0x2E, 0x2A, 0x99, 0x05, 0x08, 0xE4, + 0x0A, 0xE4, 0x50, 0x08, 0x1E, 0xE4, 0x0D, 0x08, 0x2A, 0xE4, 0x97, 0x06, + 0x1E, 0xE4, 0x9E, 0x05, 0x30, 0xD1, 0x77, 0x00, 0xC2, 0xE0, 0xFC, 0xA2, + 0x4B, 0xD0, 0x03, 0x00, 0x3A, 0xD0, 0x03, 0x00, 0x08, 0xD0, 0x00, 0x00, + 0x4C, 0xD0, 0x01, 0x00, 0x0A, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0x00, + 0x0A, 0xE4, 0xA5, 0x07, 0x1E, 0xE4, 0x29, 0x3C, 0x04, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x9E, 0x05, 0x3B, 0x28, 0xFA, 0xF0, 0x3B, 0x3C, 0x0E, 0xA8, + 0xAA, 0xF0, 0x22, 0x28, 0xC0, 0xF0, 0x04, 0xA1, 0x22, 0x28, 0x71, 0x00, + 0xC2, 0xE0, 0xFA, 0xA2, 0x16, 0x0C, 0x1E, 0xE4, 0x73, 0x00, 0xC2, 0xE0, + 0x1E, 0xE4, 0x3A, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, 0x1E, 0xE4, 0x7B, 0x02, + 0x1E, 0xE4, 0xDD, 0x03, 0xA8, 0xF0, 0x25, 0x28, 0x24, 0xE4, 0x70, 0x08, + 0x27, 0x3C, 0x32, 0x28, 0x28, 0x3C, 0x00, 0xA2, 0x29, 0x3C, 0x00, 0xA2, + 0x1C, 0x07, 0x1E, 0xE4, 0x0A, 0xE4, 0xBB, 0x06, 0x1E, 0xE4, 0x5E, 0xF0, + 0x1E, 0xE4, 0xA2, 0x05, 0x1E, 0xE4, 0x9E, 0x05, 0xC2, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0x16, 0x0C, 0xC2, 0xE0, 0x00, 0xA2, 0x8E, 0xF7, 0x76, 0x00, + 0xC2, 0xE0, 0x7D, 0x00, 0xC2, 0xE0, 0x75, 0x00, 0x78, 0x00, 0xC2, 0xE0, + 0xFE, 0xA2, 0x7E, 0x00, 0x38, 0xF0, 0x90, 0x28, 0x79, 0x00, 0xC2, 0xE0, + 0x02, 0xA0, 0x2B, 0x2C, 0xFB, 0x09, 0x1E, 0xE4, 0x22, 0x28, 0x70, 0x00, + 0xC2, 0xE0, 0x2B, 0x3C, 0xB6, 0x4C, 0xB5, 0x20, 0x73, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0xFE, 0xA2, 0x6F, 0x00, 0xC2, 0xE0, 0x17, 0x21, 0x05, 0x00, + 0x67, 0xE1, 0x7C, 0x00, 0x17, 0x21, 0x7E, 0x00, 0xC2, 0xE0, 0x17, 0x4D, + 0x29, 0x28, 0x7D, 0x00, 0xC2, 0xE0, 0x07, 0x4D, 0x4D, 0xC8, 0x4A, 0xC8, + 0x72, 0x00, 0xC2, 0xE0, 0x53, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x20, 0xAE, + 0x0A, 0xF2, 0x90, 0x28, 0x80, 0x06, 0x1E, 0xE4, 0xD2, 0xB7, 0x90, 0x2A, + 0x77, 0x00, 0xC0, 0xE0, 0x3B, 0xF0, 0x44, 0x2A, 0x77, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0xFE, 0xA2, 0x6A, 0xF0, 0x8D, 0x28, 0x02, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x71, 0x00, 0x7A, 0x28, 0x7B, 0x3E, 0x79, 0x2A, 0x8D, 0x3C, + 0x71, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, 0x7D, 0x3C, 0x1E, 0xE4, 0x77, 0x00, + 0xC2, 0xE0, 0xFC, 0xA2, 0x2E, 0xE4, 0xA6, 0x06, 0x1E, 0xE4, 0xD1, 0x09, + 0x30, 0x18, 0x34, 0x3C, 0x02, 0xA0, 0x34, 0x28, 0x02, 0xA0, 0x35, 0x28, + 0x34, 0x3C, 0x28, 0xE4, 0x1E, 0xE4, 0x2E, 0xE4, 0x31, 0x18, 0x35, 0x3C, + 0x29, 0xCA, 0x4C, 0x01, 0x1E, 0xE4, 0x5D, 0x08, 0x20, 0xCE, 0x42, 0x00, + 0xC0, 0xE0, 0xF9, 0xF7, 0xC0, 0x00, 0x12, 0xD1, 0x00, 0x04, 0x11, 0xD1, + 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x80, 0x00, 0x00, 0xE0, + 0x80, 0x01, 0x00, 0xE0, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, 0x20, 0xCE, + 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x1E, 0xE4, 0x01, 0xA2, + 0x04, 0xA2, 0xF9, 0xF7, 0x0B, 0xE4, 0xCE, 0x03, 0x1E, 0xE4, 0x22, 0x04, + 0x00, 0xE0, 0x42, 0x00, 0xC0, 0xE0, 0x4A, 0x06, 0x00, 0xE0, 0x80, 0x00, + 0x00, 0xE0, 0x80, 0x01, 0x00, 0x04, 0x11, 0xD1, 0x20, 0xCE, 0x80, 0x01, + 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, 0x80, 0x01, 0x00, 0xE0, + 0xF9, 0xF7, 0x29, 0xCA, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, 0x20, 0xCE, + 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x00, 0x03, 0x05, 0xE0, + 0x04, 0xA2, 0xF9, 0xF7, 0x60, 0x00, 0xC0, 0xE0, 0x22, 0x04, 0x1E, 0xE4, + 0x02, 0xAF, 0x2B, 0xF0, 0xCE, 0x03, 0x1E, 0xE4, 0x40, 0x3C, 0x61, 0x00, + 0xC0, 0xE0, 0x2C, 0x3C, 0x33, 0x0A, 0x1E, 0xE4, 0x80, 0xE1, 0x2E, 0xE4, + 0x67, 0xE1, 0x90, 0x3C, 0x1D, 0x3C, 0x00, 0xA2, 0x44, 0xCC, 0x02, 0xA1, + 0x2C, 0x28, 0xC0, 0x04, 0x17, 0x3D, 0x08, 0xA2, 0x63, 0x06, 0x84, 0xE1, + 0x3C, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x90, 0xE1, 0x2C, 0x28, 0x9C, 0xE0, + 0x54, 0x00, 0x04, 0xE0, 0x7E, 0x06, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, + 0x58, 0xF0, 0x02, 0xA8, 0x3C, 0x5C, 0x06, 0x9E, 0x5E, 0xF0, 0x70, 0x0A, + 0x1E, 0xE4, 0x3C, 0x28, 0x69, 0x0A, 0x1E, 0xE4, 0x09, 0xA2, 0x3C, 0x28, + 0x2E, 0xE4, 0x3C, 0x3E, 0x03, 0xA0, 0x3C, 0x2A, 0x04, 0xE0, 0x9E, 0xE0, + 0xC0, 0x04, 0x04, 0xE0, 0x02, 0xA1, 0x2C, 0x28, 0x9C, 0xE0, 0x54, 0x00, + 0x84, 0xE1, 0x3C, 0x3C, 0x00, 0xA2, 0x44, 0xCC, 0x03, 0xA8, 0x05, 0xAF, + 0x17, 0x2B, 0x94, 0x06, 0x03, 0xA0, 0x3C, 0x2A, 0x56, 0xE0, 0x3C, 0x5A, + 0x61, 0xE1, 0x2E, 0xE4, 0x06, 0x9F, 0x3C, 0x3E, 0x44, 0xCC, 0x02, 0xA1, + 0x2C, 0x28, 0xC0, 0x04, 0x11, 0x2B, 0xA2, 0x06, 0x84, 0xE1, 0x00, 0xA2, + 0x2C, 0x18, 0x42, 0xE0, 0x1B, 0xE0, 0x0D, 0xA8, 0xC1, 0x09, 0x1E, 0xE4, + 0x2E, 0xE4, 0x1A, 0xE0, 0x02, 0xA2, 0x35, 0x3C, 0x34, 0x3C, 0x00, 0xA2, + 0x1E, 0xE4, 0x8D, 0x0A, 0x1E, 0xE4, 0x47, 0x3C, 0x47, 0x3C, 0x00, 0xA2, + 0xC8, 0xF7, 0xF8, 0x05, 0xC1, 0xE0, 0x90, 0xE1, 0x8D, 0x0A, 0x1E, 0xE4, + 0x24, 0x28, 0x2E, 0xE4, 0xE9, 0xF7, 0x4B, 0x01, 0x66, 0xCF, 0x02, 0xA2, + 0x15, 0x01, 0xC2, 0xE0, 0x64, 0xCF, 0x28, 0x3C, 0x33, 0x3C, 0x00, 0xA2, + 0x33, 0x28, 0x51, 0x3C, 0x00, 0xA2, 0x62, 0xCF, 0x32, 0x1A, 0x51, 0x2A, + 0x51, 0x3C, 0x50, 0x08, 0x1E, 0xE4, 0x51, 0x3E, 0x32, 0x2A, 0x37, 0xF0, + 0x3A, 0x3E, 0x03, 0xA0, 0x3A, 0x2A, 0xF3, 0x06, 0x32, 0x18, 0x51, 0x28, + 0xB4, 0xF0, 0x51, 0x18, 0xE2, 0x06, 0x1A, 0xE4, 0x22, 0x28, 0xF4, 0xF6, + 0x2E, 0xE4, 0x02, 0xA2, 0x08, 0x08, 0x1E, 0xE4, 0x59, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x00, 0xA2, 0x45, 0xE0, 0x88, 0x4C, 0x89, 0x20, 0x73, 0xC8, + 0x46, 0xE0, 0x06, 0xAE, 0x02, 0x4C, 0x03, 0x24, 0x54, 0xBA, 0x48, 0xBA, + 0x24, 0xE4, 0x22, 0xA1, 0x33, 0x28, 0x2E, 0xE4, 0x59, 0x3C, 0x40, 0xBA, + 0x35, 0x3C, 0x34, 0x34, 0x30, 0x7C, 0x0F, 0xC7, 0x28, 0xF0, 0x94, 0x00, + 0x02, 0xE0, 0x33, 0x28, 0x0A, 0xE4, 0x3C, 0x07, 0x1E, 0xE4, 0x90, 0xE1, + 0x34, 0x20, 0x8B, 0x07, 0x1E, 0xE4, 0x13, 0x07, 0x02, 0xE0, 0x33, 0x28, + 0x62, 0xCF, 0x35, 0x4C, 0x33, 0x28, 0x90, 0xE1, 0x28, 0xF0, 0xC8, 0x00, + 0x66, 0xCF, 0x04, 0xA2, 0xB8, 0xF6, 0x51, 0x18, 0x33, 0x28, 0x2E, 0xE4, + 0x28, 0x3C, 0x33, 0x28, 0x1E, 0xE4, 0x27, 0x3C, 0x51, 0x28, 0x28, 0x3C, + 0x3E, 0xF7, 0x6A, 0xE1, 0x33, 0x28, 0x1C, 0x07, 0x16, 0xE0, 0x36, 0x3C, + 0x16, 0xE0, 0x2B, 0x2C, 0x28, 0x28, 0x38, 0x3C, 0x00, 0xA2, 0x37, 0x3C, + 0x34, 0x34, 0x30, 0x7C, 0x0F, 0xC7, 0x33, 0x3C, 0xC2, 0xF0, 0x27, 0x18, + 0x33, 0x28, 0x35, 0x3C, 0x1E, 0xE4, 0x56, 0x0B, 0x18, 0xE4, 0x22, 0x28, + 0x34, 0x20, 0x8B, 0x07, 0x1E, 0xE4, 0x15, 0x0A, 0x27, 0x28, 0x3E, 0xF7, + 0x62, 0xCF, 0x35, 0x4C, 0x2E, 0xE4, 0x29, 0x3C, 0x29, 0x08, 0x28, 0x18, + 0x90, 0xD1, 0x26, 0xCF, 0x06, 0xAE, 0x53, 0x28, 0x22, 0xCB, 0xF8, 0xF7, + 0x20, 0xCB, 0x02, 0x00, 0x0E, 0xAF, 0x02, 0xCB, 0x7E, 0x07, 0x08, 0xE4, + 0x02, 0xAF, 0x36, 0x30, 0x08, 0xAF, 0x38, 0x30, 0x36, 0x28, 0x39, 0x3C, + 0x12, 0xAF, 0x37, 0x30, 0x36, 0x28, 0x41, 0x0B, 0x1A, 0xE4, 0x37, 0x4C, + 0x22, 0x28, 0x9F, 0x07, 0x18, 0xE4, 0x37, 0x4C, 0x90, 0xE1, 0x82, 0x01, + 0x39, 0x88, 0x68, 0xF0, 0x22, 0x44, 0x37, 0x28, 0x39, 0x3C, 0x04, 0xCB, + 0x7E, 0x07, 0x0D, 0xE4, 0x56, 0x0B, 0x18, 0xE4, 0x26, 0xCF, 0x36, 0x28, + 0x58, 0xF1, 0x37, 0x28, 0x02, 0xAE, 0x37, 0x4C, 0x08, 0xAE, 0x39, 0x28, + 0x90, 0xD1, 0x02, 0xCF, 0x16, 0xAE, 0x36, 0x4C, 0x56, 0x0B, 0x18, 0xE4, + 0x22, 0x28, 0x01, 0x00, 0x22, 0xCB, 0xF8, 0xF7, 0x20, 0xCB, 0xAD, 0xF0, + 0x15, 0x0A, 0x1E, 0xE4, 0x7E, 0x07, 0x08, 0xE4, 0x00, 0x00, 0x91, 0xD1, + 0x2E, 0xE4, 0x02, 0xA2, 0x34, 0x20, 0x8B, 0x07, 0x1E, 0xE4, 0x6A, 0xE1, + 0x02, 0xA0, 0x29, 0x28, 0x62, 0xCF, 0x35, 0x4C, 0x02, 0xA2, 0x2E, 0xE4, + 0x00, 0xA2, 0x29, 0x3C, 0x33, 0x3C, 0x02, 0xA0, 0x33, 0x28, 0x10, 0xCF, + 0x34, 0x3C, 0x02, 0xA0, 0x34, 0x28, 0x64, 0xCF, 0x66, 0xCF, 0x08, 0xA2, + 0x28, 0xE4, 0x30, 0x18, 0x02, 0xA0, 0x35, 0x28, 0x34, 0x3C, 0x00, 0xA2, + 0x01, 0xA2, 0x2E, 0xE4, 0x31, 0x18, 0x35, 0x3C, 0x11, 0x3F, 0x11, 0x3F, + 0xE0, 0x04, 0x61, 0xE1, 0x89, 0x34, 0x88, 0x3C, 0x72, 0xC8, 0x2E, 0xE4, + 0x48, 0xBA, 0x26, 0x3C, 0x22, 0x3C, 0x42, 0xBA, 0x02, 0xA2, 0xD8, 0xF2, + 0x22, 0x28, 0x24, 0x3C, 0x28, 0xA2, 0x56, 0x3C, 0x24, 0xA2, 0xB7, 0x3C, + 0x32, 0xA2, 0x55, 0x3C, 0x2C, 0xA2, 0x57, 0x3C, 0x48, 0xBA, 0x23, 0x3C, + 0x02, 0xA2, 0x54, 0x3C, 0x50, 0x3C, 0x06, 0x08, 0x06, 0xE4, 0x2C, 0xA1, + 0x50, 0x3C, 0x50, 0x7C, 0x0F, 0xC7, 0x31, 0x28, 0x50, 0x3C, 0x18, 0xE0, + 0x50, 0x82, 0x30, 0x84, 0x35, 0xA2, 0x40, 0xBA, 0x5A, 0xF0, 0x40, 0xBA, + 0x5A, 0xF0, 0x40, 0xBA, 0x54, 0x3C, 0x42, 0xE0, 0x55, 0x3C, 0x42, 0xE0, + 0x2F, 0xA2, 0x40, 0xBA, 0x56, 0x3C, 0x42, 0xE0, 0x25, 0xA2, 0x40, 0xBA, + 0x24, 0xA2, 0x7E, 0xF2, 0x57, 0x3C, 0x04, 0xA0, 0x2C, 0xA2, 0x57, 0x3C, + 0x28, 0xA2, 0x56, 0x3C, 0x38, 0xA2, 0x54, 0x3C, 0x32, 0xA2, 0x55, 0x3C, + 0x23, 0x28, 0x4A, 0xF0, 0x59, 0x28, 0x58, 0x3C, 0x23, 0x3C, 0x00, 0xA2, + 0x2E, 0xF0, 0x16, 0xE0, 0x8A, 0xF0, 0x40, 0xBA, 0x53, 0x3C, 0x40, 0xBA, + 0x55, 0x3C, 0x42, 0xE0, 0x2E, 0xA2, 0x41, 0xBA, 0x40, 0xBA, 0x54, 0x3C, + 0x42, 0xE0, 0x34, 0xA2, 0x04, 0xA0, 0x56, 0x3C, 0x42, 0xE0, 0x25, 0xA2, + 0x42, 0xE0, 0x39, 0xA2, 0x40, 0xBA, 0x57, 0x3C, 0x02, 0xA2, 0x25, 0x3C, + 0x02, 0xA2, 0x58, 0x3C, 0x2E, 0xE4, 0x00, 0xA2, 0x7E, 0xBA, 0x2E, 0xE4, + 0x2A, 0x74, 0x2A, 0x3C, 0x0E, 0xA8, 0x68, 0xC8, 0x43, 0x00, 0x05, 0xE0, + 0x7E, 0xBA, 0x2E, 0xE4, 0x9B, 0xA9, 0x11, 0xAE, 0x9D, 0xA9, 0x11, 0xAE, + 0x08, 0xE4, 0x46, 0xE0, 0xAD, 0xA9, 0x11, 0xAE, 0x00, 0x3C, 0x31, 0x0B, + 0x1E, 0xE4, 0x4E, 0x08, 0x7E, 0xBA, 0x01, 0x3C, 0x31, 0x0B, 0x1E, 0xE4, + 0x31, 0x0B, 0x1E, 0xE4, 0x03, 0x3C, 0x02, 0x34, 0xB6, 0x3C, 0x31, 0x0B, + 0x1E, 0xE4, 0xB5, 0x3C, 0x05, 0x3C, 0x04, 0x34, 0x36, 0x0B, 0x1E, 0xE4, + 0x07, 0x3C, 0x06, 0x34, 0x36, 0x0B, 0x1E, 0xE4, 0x09, 0x3C, 0x08, 0x34, + 0x36, 0x0B, 0x1E, 0xE4, 0x08, 0xAF, 0x1E, 0xA0, 0xB5, 0x28, 0x7E, 0xBA, + 0x1E, 0xA0, 0xB6, 0x28, 0x70, 0x3C, 0x08, 0xAE, 0x70, 0x28, 0x71, 0x3C, + 0x08, 0xAE, 0x08, 0xAF, 0x71, 0x28, 0x30, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x30, 0x84, 0x31, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, 0x02, 0xA2, 0x32, 0x3C, + 0x18, 0xE0, 0x31, 0x82, 0x2E, 0xE4, 0x00, 0x28, 0x2E, 0xE4, 0x72, 0x3C, + 0x22, 0xD0, 0x9A, 0xF0, 0x36, 0x0B, 0x1E, 0xE4, 0x4E, 0xBA, 0x58, 0x08, + 0x84, 0xE1, 0x07, 0x00, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x90, 0xE1, + 0xC0, 0xE0, 0x80, 0x00, 0x67, 0xE1, 0x2E, 0xE4, 0xC0, 0xE0, 0x17, 0x3D, + 0x17, 0x35, 0x64, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x65, 0x00, + 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x66, 0x00, 0x2E, 0xE4, 0x17, 0x3D, + 0x17, 0x35, 0x67, 0x00, 0x68, 0xCF, 0x46, 0xCF, 0x24, 0xCF, 0x00, 0xA2, + 0x7F, 0x01, 0xC2, 0xE0, 0x04, 0x01, 0xC2, 0xE0, 0x08, 0x03, 0xC2, 0xE0, + 0x49, 0x01, 0xC2, 0xE0, 0x09, 0x03, 0xC2, 0xE0, 0x0D, 0x03, 0xC2, 0xE0, + 0x0B, 0x03, 0xC2, 0xE0, 0x0A, 0x03, 0xC2, 0xE0, 0x46, 0xA2, 0x20, 0x03, + 0xC2, 0xE0, 0x8E, 0xCC, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0x01, 0xC2, 0xE0, + 0x08, 0xAE, 0x92, 0xB6, 0x44, 0x2A, 0x25, 0x01, 0x04, 0xE0, 0x78, 0x01, + 0xC2, 0xE0, 0x2C, 0xA9, 0xC0, 0xE0, 0x79, 0x01, 0xC2, 0xE0, 0x14, 0x00, + 0x7F, 0x00, 0x08, 0xE0, 0x49, 0xE0, 0x50, 0x00, 0x7F, 0x00, 0x09, 0xE0, + 0x11, 0xAF, 0x48, 0x3C, 0x00, 0xA2, 0x48, 0x3E, 0x48, 0x46, 0x49, 0x3E, + 0x0A, 0xE0, 0x3B, 0xF0, 0x03, 0xA8, 0x48, 0x2A, 0x3B, 0xF0, 0x05, 0xA8, + 0x48, 0x2A, 0x02, 0x00, 0x09, 0xA8, 0x48, 0x2A, 0x09, 0x00, 0x0A, 0xE0, + 0x48, 0x2A, 0x20, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0x40, 0x00, 0x0A, 0xE0, + 0x3B, 0xF0, 0x11, 0xA8, 0x46, 0x00, 0xC1, 0xE0, 0x0C, 0x04, 0xC2, 0xE0, + 0x42, 0xE0, 0x10, 0xAE, 0x44, 0x00, 0x04, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, + 0x09, 0xA8, 0x49, 0x2A, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x84, 0x00, + 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x11, 0x02, 0x49, 0x2A, 0x42, 0xE0, + 0x10, 0xAE, 0x80, 0x00, 0x86, 0x00, 0x61, 0xE1, 0x5B, 0xF0, 0x11, 0xA8, + 0x12, 0x02, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x49, 0xE0, 0x04, 0xAE, + 0x32, 0xA1, 0x54, 0x28, 0x03, 0xAE, 0x55, 0xE0, 0x2C, 0xA1, 0x55, 0x28, + 0x2B, 0xCF, 0x55, 0xE0, 0x24, 0xA1, 0x56, 0x28, 0x3C, 0x00, 0x04, 0xE0, + 0x46, 0x00, 0xC1, 0xE0, 0x03, 0xA8, 0x49, 0x2A, 0x42, 0xE0, 0x10, 0xAE, + 0x11, 0x21, 0x80, 0x00, 0x61, 0xE1, 0x5B, 0xF0, 0x22, 0x4C, 0x20, 0xA2, + 0x44, 0xCF, 0x11, 0x4D, 0x46, 0xCF, 0x00, 0xA2, 0x00, 0xCF, 0x02, 0xAE, + 0x08, 0xAE, 0x31, 0x4C, 0x20, 0xAE, 0x30, 0x28, 0x05, 0x02, 0xC2, 0xE0, + 0x01, 0x01, 0xC2, 0xE0, 0x05, 0xE0, 0x46, 0x00, 0xC0, 0xE0, 0x60, 0xCF, + 0x49, 0x2A, 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x82, 0x00, 0x61, 0xE1, + 0x5B, 0xF0, 0x05, 0xA8, 0x03, 0x01, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0xD5, 0xB6, 0x00, 0xA2, 0x76, 0x03, 0x1E, 0xE4, 0x62, 0x0A, 0x12, 0xE4, + 0x7B, 0x28, 0x11, 0xB6, 0x12, 0xE4, 0x05, 0xA2, 0x7B, 0x3C, 0x79, 0x28, + 0xC2, 0xE0, 0x45, 0x0A, 0x1E, 0xE4, 0x69, 0x0A, 0x7A, 0x3C, 0xA8, 0xB7, + 0x79, 0x3C, 0x77, 0x00, 0x03, 0xA2, 0x79, 0x28, 0x5B, 0xF1, 0x01, 0xA2, + 0x45, 0x0A, 0x1E, 0xE4, 0x62, 0x0A, 0x12, 0xE4, 0x12, 0xE4, 0x09, 0xA2, + 0x7A, 0x3C, 0x7C, 0x3C, 0xFA, 0xA2, 0x82, 0xF0, 0x7A, 0x28, 0x62, 0x0A, + 0xC2, 0xE0, 0xFE, 0xA2, 0x71, 0x00, 0xC2, 0xE0, 0xC4, 0xF0, 0x7A, 0x28, + 0x2E, 0xE4, 0x77, 0x00, 0x06, 0xA2, 0x9B, 0xF0, 0xCE, 0x03, 0x1E, 0xE4, + 0x22, 0x04, 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, 0x06, 0xA2, 0x4A, 0x04, + 0x1E, 0xE4, 0x7A, 0x28, 0xC2, 0xE0, 0x06, 0xAE, 0x22, 0x4C, 0x08, 0xAE, + 0xCE, 0x03, 0x1E, 0xE4, 0x04, 0xA2, 0x04, 0x02, 0x00, 0xA2, 0x10, 0x02, + 0xC2, 0xE0, 0x12, 0xB6, 0xCE, 0x03, 0x1E, 0xE4, 0x15, 0x02, 0xC2, 0xE0, + 0x83, 0x03, 0x1E, 0xE4, 0x52, 0xB6, 0x16, 0xB6, 0x04, 0xA2, 0x94, 0x03, + 0x1E, 0xE4, 0x00, 0xA2, 0xC3, 0xE0, 0x79, 0x2A, 0x08, 0x02, 0xC2, 0xE0, + 0x4B, 0xF0, 0xCE, 0x03, 0x1E, 0xE4, 0x0B, 0x02, 0x7B, 0x28, 0x14, 0x02, + 0xC2, 0xE0, 0x2C, 0x28, 0xC2, 0xE0, 0x02, 0xA2, 0x8A, 0x09, 0x04, 0xE4, + 0x79, 0x28, 0x32, 0xF0, 0x7B, 0x28, 0x02, 0x03, 0x04, 0xE0, 0x80, 0x03, + 0xC2, 0xE0, 0x08, 0xB6, 0x08, 0xA2, 0x0C, 0x03, 0xC2, 0xE0, 0x55, 0x00, + 0x0E, 0xA2, 0x03, 0x03, 0xC2, 0xE0, 0x23, 0x4C, 0x64, 0x01, 0x1E, 0xE4, + 0x12, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x08, 0x03, 0xC2, 0xE0, 0x00, 0xA2, + 0x44, 0x3C, 0x00, 0xA2, 0x02, 0x03, 0xC2, 0xE0, 0x7D, 0x28, 0x47, 0x3C, + 0x02, 0xA2, 0x45, 0x3C, 0x49, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0x54, 0xF2, + 0x1F, 0xA8, 0x44, 0x30, 0x0A, 0xF2, 0x08, 0xAF, 0x43, 0x01, 0xC2, 0xE0, + 0x7D, 0x28, 0x45, 0x3E, 0xC2, 0xE0, 0xAE, 0x03, 0x1E, 0xE4, 0x00, 0xA2, + 0x20, 0xAE, 0x02, 0xA1, 0x30, 0x28, 0x7F, 0x01, 0x42, 0x01, 0xC2, 0xE0, + 0x02, 0xA1, 0x31, 0x4C, 0x44, 0x2A, 0x20, 0xAE, 0xAA, 0x03, 0x1E, 0xE4, + 0x4E, 0x01, 0xC2, 0xE0, 0x45, 0x4C, 0x2B, 0xF0, 0xC2, 0xE0, 0x7E, 0xA8, + 0x61, 0x00, 0xC0, 0xE0, 0xC2, 0xE0, 0x7D, 0x3C, 0x7A, 0x28, 0x44, 0x01, + 0x1E, 0xE4, 0x3A, 0x3C, 0x02, 0xA2, 0x71, 0x00, 0x06, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x8E, 0x02, 0x00, 0x01, 0xC2, 0xE0, 0x46, 0xA2, 0x2E, 0xE4, + 0x2C, 0xA9, 0x08, 0xAE, 0x92, 0xB6, 0x44, 0x2A, 0x14, 0x00, 0x04, 0xE0, + 0x78, 0x01, 0xC2, 0xE0, 0x76, 0x03, 0x1E, 0xE4, 0x79, 0x01, 0xC2, 0xE0, + 0x49, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x44, 0x32, 0x09, 0xAF, + 0x45, 0x3C, 0x1E, 0xA8, 0x00, 0xA2, 0x43, 0x01, 0xC2, 0xE0, 0x7D, 0x28, + 0x49, 0x01, 0xC2, 0xE0, 0x7F, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0xAE, 0x03, + 0x1E, 0xE4, 0x00, 0xA2, 0x20, 0xAE, 0x02, 0xA1, 0x30, 0x28, 0x7F, 0x01, + 0x42, 0x01, 0xC2, 0xE0, 0x02, 0xA1, 0x31, 0x4C, 0x44, 0x2A, 0x20, 0xAE, + 0xAA, 0x03, 0x1E, 0xE4, 0x4E, 0x01, 0xC2, 0xE0, 0x45, 0x4C, 0x2B, 0xF0, + 0xC2, 0xE0, 0x7E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x24, 0x28, 0x2E, 0xE4, + 0x03, 0xA2, 0x44, 0x01, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x43, 0x3C, + 0x10, 0xAE, 0x04, 0xA2, 0x2A, 0xE4, 0x44, 0x28, 0x31, 0x4C, 0x10, 0xAE, + 0x02, 0xA1, 0x30, 0x4C, 0xE9, 0xF7, 0x4B, 0x01, 0xC1, 0xE0, 0x02, 0xA1, + 0xC2, 0xE0, 0x02, 0xA2, 0x4D, 0x01, 0xC2, 0xE0, 0xE9, 0xF7, 0x4B, 0x01, + 0xC1, 0xE0, 0x4A, 0x01, 0x28, 0xF0, 0x36, 0x28, 0x7F, 0xA2, 0x2E, 0xE4, + 0x36, 0x28, 0x26, 0x01, 0xC3, 0xE0, 0x39, 0x2A, 0x2A, 0x0A, 0x1E, 0xE4, + 0x14, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, + 0x18, 0xE4, 0x44, 0x28, 0x10, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x3A, 0x28, + 0x2E, 0xE4, 0x8D, 0x0A, 0x38, 0x4C, 0x3A, 0x3C, 0x00, 0xA2, 0x28, 0x01, + 0xFE, 0xA2, 0x2E, 0xE4, 0x27, 0x01, 0xC2, 0xE0, 0x7D, 0x3C, 0x7A, 0x3C, + 0x79, 0x3C, 0x7B, 0x3C, 0x9B, 0xF0, 0x2C, 0x2A, 0x7E, 0x3C, 0x00, 0xA2, + 0x61, 0xE1, 0x04, 0xA2, 0x45, 0xCC, 0x03, 0xA1, 0x11, 0x3D, 0x43, 0x0A, + 0x84, 0xE1, 0xC0, 0x04, 0x3C, 0x28, 0x3C, 0x3C, 0x7E, 0x28, 0x2E, 0xE4, + 0x01, 0x29, 0x92, 0xE0, 0xC0, 0x04, 0x00, 0xE0, 0x3C, 0x3C, 0x02, 0xA0, + 0x3C, 0x28, 0xCA, 0xF0, 0x3C, 0x28, 0x3C, 0x3C, 0x28, 0xF0, 0x2C, 0x18, + 0x2E, 0xE4, 0xFE, 0xA2, 0x28, 0xF7, 0x7E, 0x18, 0x3C, 0x08, 0x02, 0xA2, + 0x01, 0x3D, 0x0A, 0xA2, 0x7E, 0x3C, 0x28, 0xF0, 0x2C, 0x18, 0x7E, 0x3C, + 0xC0, 0x04, 0x00, 0xE0, 0x2E, 0xE4, 0x3C, 0x28, 0x01, 0x3D, 0x52, 0xE0, + 0x01, 0x29, 0x92, 0xE0, 0x92, 0xE0, 0xC0, 0x04, 0x00, 0xE0, 0x2E, 0xE4, + 0x2E, 0xE4, 0x01, 0x3D, 0x56, 0xE0, 0x01, 0x29, 0x01, 0x29, 0x92, 0xE0, + 0xC0, 0x04, 0x00, 0xE0, 0x34, 0x28, 0x2E, 0xE4, 0x01, 0x3D, 0x02, 0xA8, + 0x43, 0x28, 0x46, 0x3C, 0x1A, 0xE0, 0x35, 0x4C, 0x47, 0x4C, 0x02, 0xAE, + 0x46, 0x4C, 0x02, 0xAE, 0x35, 0x4C, 0x10, 0xAE, 0x34, 0x4C, 0x10, 0xAE, + 0xC2, 0xE0, 0xE9, 0xF7, 0x4B, 0x01, 0xC1, 0xE0, 0x4A, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x4D, 0x01, 0x1A, 0xE0, 0x35, 0x4C, 0x34, 0x28, 0x2E, 0xE4, + 0x46, 0x4C, 0x02, 0xAE, 0x43, 0x28, 0x46, 0x3C, 0x34, 0x4C, 0x10, 0xAE, + 0x47, 0x4C, 0x02, 0xAE, 0x4B, 0x01, 0xC1, 0xE0, 0x35, 0x4C, 0x10, 0xAE, + 0x02, 0xA2, 0x4D, 0x01, 0xC2, 0xE0, 0xE9, 0xF7, 0x18, 0xA2, 0x2E, 0xE4, + 0x4A, 0x01, 0xC2, 0xE0, 0x9D, 0x4C, 0x9C, 0x24, 0xB4, 0x3C, 0xB3, 0x34, + 0x8E, 0x0C, 0x1E, 0xE4, 0x00, 0x00, 0x27, 0xD0, 0x9C, 0x24, 0xF8, 0xF2, + 0x01, 0x00, 0x27, 0xD0, 0x95, 0xE0, 0x63, 0x0C, 0x1E, 0xE4, 0x9D, 0x4C, + 0x02, 0xAF, 0x84, 0xE0, 0x67, 0x0C, 0x1E, 0xE4, 0x1E, 0xE4, 0x92, 0xE0, + 0x00, 0x05, 0x00, 0xE0, 0x1E, 0xE4, 0x02, 0xA8, 0x84, 0xE0, 0x18, 0x0B, + 0xB0, 0x34, 0xB1, 0x0C, 0xB0, 0x00, 0x30, 0x0C, 0x94, 0x4E, 0x93, 0x26, + 0x86, 0xF1, 0xB1, 0x3C, 0xB1, 0x4C, 0xB0, 0x24, 0x42, 0xF1, 0x46, 0xE0, + 0xB3, 0x34, 0xB1, 0x3C, 0xB0, 0x34, 0x18, 0xA0, 0x27, 0xD0, 0x9D, 0x4C, + 0x9C, 0x24, 0xB4, 0x3C, 0x27, 0xD0, 0x8E, 0x0C, 0x1E, 0xE4, 0x00, 0x00, + 0x2E, 0xE4, 0x00, 0xA2, 0x48, 0xF0, 0x01, 0x00, 0xB1, 0x3C, 0xB0, 0x34, + 0x00, 0xA2, 0x6B, 0xE1, 0xA2, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0x9C, 0x24, 0xB4, 0x3C, 0xB3, 0x34, 0x40, 0xA2, 0x1E, 0xE4, 0x00, 0x00, + 0x27, 0xD0, 0x9D, 0x4C, 0x08, 0xE4, 0x01, 0x00, 0x27, 0xD0, 0x8E, 0x0C, + 0x1E, 0xE4, 0x9D, 0x4C, 0x9C, 0x24, 0x16, 0x0B, 0x67, 0x0C, 0x1E, 0xE4, + 0x95, 0xE0, 0x63, 0x0C, 0x00, 0xE0, 0x02, 0xAF, 0x0C, 0xA0, 0x84, 0xE0, + 0x02, 0xA8, 0x84, 0xE0, 0x92, 0xE0, 0x00, 0x05, 0xFF, 0xFF, 0x08, 0xE0, + 0x30, 0x0C, 0x1E, 0xE4, 0xB2, 0x28, 0xF4, 0xF0, 0x40, 0xA1, 0xB2, 0x3C, + 0x9D, 0x4C, 0x9C, 0x24, 0xB4, 0x3C, 0xB3, 0x34, 0x8E, 0x0C, 0x1E, 0xE4, + 0x00, 0x00, 0x27, 0xD0, 0x00, 0xA2, 0x48, 0xF0, 0x01, 0x00, 0x27, 0xD0, + 0x2E, 0xE4, 0x02, 0xA2, 0x6B, 0xE1, 0x2E, 0xE4, 0x43, 0x00, 0x05, 0xE0, + 0x09, 0x4D, 0x11, 0x21, 0x9B, 0xA9, 0x11, 0xAE, 0x9D, 0xA9, 0x11, 0xAE, + 0x5A, 0xF0, 0x46, 0xE0, 0xAD, 0xA9, 0x11, 0xAE, 0x2E, 0xE4, 0x2E, 0x3C, + 0xB1, 0x3C, 0x00, 0xA2, 0x82, 0xE0, 0x03, 0xAF, 0xB1, 0x3E, 0x41, 0xA2, + 0x2E, 0x3C, 0x02, 0xA2, 0x92, 0xE0, 0x42, 0xE0, 0x11, 0xAE, 0x4F, 0xBA, + 0x4E, 0xBA, 0x2E, 0xE4, 0x4F, 0xBA, 0x4E, 0xBA, 0x2E, 0xE4, 0x56, 0xE0, + 0x21, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x11, 0xAE, 0x56, 0xE0, 0x31, 0xAE, + 0x4F, 0xBA, 0x56, 0xE0, 0x61, 0xE1, 0x2D, 0xE4, 0x58, 0x68, 0x2E, 0xE4, + 0x40, 0xA1, 0x4A, 0xBA, 0x88, 0xF0, 0xE0, 0x04, 0x11, 0x3D, 0x40, 0xA1, + 0x4A, 0xBA, 0x11, 0x3D, 0x40, 0xA1, 0x7E, 0xA8, 0x49, 0xE0, 0x2E, 0xE4, + 0x41, 0xA1, 0x7F, 0xA8, 0x0D, 0xAF, 0x11, 0x3D, 0x00, 0x00, 0xA5, 0xD1, + 0x2E, 0xE4, 0x11, 0x3F, 0x11, 0x4D, 0x11, 0x21, 0xE0, 0x04, 0x61, 0xE1, + 0x41, 0xCB, 0x01, 0x00, 0xA0, 0xD1, 0x4C, 0xCF, 0x4E, 0x02, 0x1E, 0xE4, + 0x2E, 0xE4, 0xF9, 0xF7, 0x60, 0xD1, 0xC0, 0xCE, 0x1E, 0xAE, 0x06, 0xA2, + 0x91, 0x34, 0x60, 0x00, 0xC0, 0xE0, 0x00, 0x06, 0x15, 0xAE, 0x61, 0x00, + 0xC1, 0xE0, 0x92, 0x3C, 0x95, 0x34, 0x42, 0xE0, 0x94, 0x3E, 0x93, 0x36, + 0x9C, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0x96, 0x3C, 0x00, 0xFE, 0x08, 0xE0, + 0x97, 0x34, 0x9D, 0x3C, 0xFF, 0x01, 0x08, 0xE0, 0x9D, 0x2C, 0x98, 0x3C, + 0x7D, 0xF0, 0xE2, 0x0A, 0x1E, 0xE4, 0xA0, 0x3C, 0xDC, 0x0B, 0x1E, 0xE4, + 0xF1, 0x0B, 0x1E, 0xE4, 0x6A, 0xE1, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0xC0, 0xCE, 0x1E, 0xAE, 0x06, 0xA2, 0x2E, 0xE4, 0x48, 0x00, 0xC0, 0xE0, + 0x00, 0x06, 0x60, 0xD1, 0x9D, 0x3C, 0x9C, 0x34, 0x51, 0x00, 0xC2, 0xE0, + 0x98, 0x3C, 0x00, 0xFE, 0x08, 0xE0, 0x97, 0x34, 0xA0, 0x3C, 0xFF, 0x01, + 0x08, 0xE0, 0x9D, 0x2C, 0x1E, 0xE4, 0x78, 0xF0, 0xA3, 0x0A, 0x1E, 0xE4, + 0x02, 0xA2, 0xDC, 0x0B, 0x1E, 0xE4, 0xF1, 0x0B, 0x2E, 0xE4, 0x00, 0xA2, + 0x6A, 0xE1, 0x2E, 0xE4, 0xB1, 0x0B, 0x1E, 0xE4, 0xF8, 0xF7, 0x40, 0xCB, + 0x04, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x70, 0xE4, 0x0E, 0xAE, 0xA1, 0x28, + 0x24, 0xCE, 0x80, 0x00, 0x20, 0xCE, 0x98, 0x4C, 0x97, 0x24, 0x22, 0xCE, + 0x02, 0xAE, 0x06, 0xA8, 0x43, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, + 0x26, 0xCE, 0x22, 0xA0, 0x00, 0x02, 0x00, 0xE0, 0x98, 0x4C, 0x97, 0x24, + 0x96, 0x1C, 0x95, 0x14, 0x98, 0x3C, 0x97, 0x34, 0x97, 0x34, 0x92, 0x4C, + 0x91, 0x24, 0x54, 0xF0, 0xA1, 0x28, 0x00, 0x00, 0x4C, 0xD0, 0x98, 0x3C, + 0x16, 0xE0, 0xA1, 0x28, 0x6E, 0xCC, 0x0E, 0xAE, 0x2E, 0xE4, 0x90, 0x28, + 0x2E, 0xE4, 0xA1, 0x3C, 0x1E, 0xE4, 0x92, 0xCE, 0xA1, 0x3C, 0x00, 0xA2, + 0x28, 0xE1, 0xB1, 0x0B, 0x1E, 0xE4, 0xB1, 0x0B, 0xA0, 0x2C, 0x81, 0xE1, + 0x20, 0x20, 0x71, 0xD0, 0x84, 0xE1, 0x44, 0xCC, 0x74, 0xF0, 0x02, 0xA1, + 0x90, 0xE1, 0x90, 0xE1, 0x4E, 0xBA, 0xEE, 0x0B, 0x20, 0xAE, 0x95, 0x14, + 0x04, 0xE0, 0x2E, 0xE4, 0x34, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x9E, 0xCC, + 0x35, 0xD0, 0x00, 0x00, 0x33, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0xFF, 0x00, + 0x36, 0xD0, 0x00, 0x00, 0x39, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, + 0x4C, 0xD0, 0x01, 0x00, 0x4B, 0xD0, 0x00, 0x00, 0x47, 0xD0, 0x00, 0x00, + 0x46, 0xD0, 0x00, 0x00, 0x2E, 0xE4, 0x00, 0x00, 0x49, 0xD1, 0x00, 0x00, + 0x9C, 0x34, 0xB2, 0x08, 0x9D, 0x4C, 0x9C, 0x24, 0x9D, 0x4C, 0x9C, 0x24, + 0x7E, 0xF0, 0x9D, 0x3C, 0x9D, 0x3C, 0x9C, 0x34, 0xB1, 0x0C, 0xB0, 0x04, + 0x9C, 0x24, 0x74, 0xF0, 0x96, 0x1C, 0x95, 0x14, 0x9C, 0x34, 0x94, 0x1C, + 0x93, 0x14, 0x9D, 0x4C, 0xC2, 0xE0, 0x9D, 0x4C, 0x9C, 0x24, 0x9D, 0x3C, + 0x2E, 0xE4, 0x52, 0x00, 0xC2, 0xE0, 0x48, 0x00, 0x2E, 0xE4, 0xB1, 0x3C, + 0xB0, 0x34, 0x00, 0xA2, 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0x29, 0xA8, 0xF0, + 0xFF, 0xFF, 0x09, 0xE0, 0x11, 0x2B, 0x20, 0xAE, 0x08, 0xE0, 0x11, 0x29, + 0xFE, 0xF0, 0x42, 0xE0, 0x09, 0xE0, 0x11, 0x2B, 0x20, 0xAE, 0xFF, 0x00, + 0x11, 0x2B, 0x10, 0xAE, 0x42, 0xE0, 0xFF, 0xFF, 0x42, 0xE0, 0x11, 0xAF, + 0x00, 0xFF, 0x09, 0xE0, 0x31, 0xAF, 0x49, 0xE0, 0x2B, 0xE4, 0xA2, 0x2A, + 0x49, 0xE0, 0x93, 0xE0, 0xFF, 0x00, 0x09, 0xE0, 0x95, 0xE0, 0xFF, 0x00, + 0x09, 0xE0, 0x21, 0xAF, 0xFF, 0x00, 0x09, 0xE0, 0x11, 0xAF, 0x49, 0xE0, + 0x56, 0xE0, 0x10, 0xAE, 0xFF, 0x00, 0x08, 0xE0, 0x10, 0xAE, 0x56, 0xE0, + 0x85, 0xE0, 0x10, 0xAE, 0x49, 0xE0, 0x2E, 0xE4, 0x56, 0xE0, 0x83, 0xE0, + 0x29, 0xCA, 0x2E, 0xE4, 0x46, 0xE0, 0x0F, 0xA8, 0x20, 0xCE, 0x00, 0x05, + 0x11, 0xD1, 0xF9, 0xF7, 0x04, 0xE0, 0x45, 0xE0, 0x96, 0x4E, 0x95, 0x26, + 0x25, 0xCE, 0x03, 0xAF, 0x65, 0xE0, 0x40, 0x00, 0x40, 0xA2, 0x85, 0x0C, + 0x1E, 0xE4, 0xA3, 0x3E, 0xA3, 0x28, 0x24, 0xCE, 0x26, 0xE4, 0xA3, 0x18, + 0x91, 0x24, 0x22, 0xCE, 0x00, 0x05, 0x00, 0xE0, 0x85, 0x0C, 0x1E, 0xE4, + 0x20, 0xCE, 0x92, 0x4C, 0x06, 0xA8, 0x43, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x28, 0xCA, 0x26, 0xCE, 0x02, 0xA0, 0x02, 0xAE, 0xCA, 0x3C, 0xC9, 0x34, + 0x2E, 0xE4, 0xF8, 0xF7, 0x49, 0x00, 0xC0, 0xE0, 0x15, 0x3C, 0x00, 0xA2, + 0x45, 0x00, 0xC0, 0xE0, 0xCC, 0x3C, 0xCB, 0x34, 0x49, 0x00, 0xC0, 0xE0, + 0x1D, 0x30, 0x04, 0xAF, 0xCC, 0x1C, 0xCB, 0x10, 0x9A, 0x3C, 0x99, 0x34, + 0x99, 0x26, 0x15, 0x3E, 0x11, 0xB6, 0x15, 0x2A, 0x33, 0xF0, 0xCA, 0x1E, + 0xC9, 0x16, 0x9A, 0x4E, 0xB4, 0x1E, 0xB3, 0x16, 0x94, 0x0E, 0x93, 0x06, + 0x90, 0x3C, 0x1D, 0x28, 0xC3, 0xF1, 0x00, 0xA2, 0x17, 0xE0, 0x1B, 0xE0, + 0x5D, 0x00, 0xC1, 0xE0, 0xF8, 0xF5, 0x15, 0x28, 0x48, 0xF1, 0x52, 0xE0, + 0x5C, 0x00, 0xC0, 0xE0, 0xCA, 0x01, 0x1E, 0xE4, 0xC0, 0xE0, 0x8A, 0xF5, + 0x00, 0x40, 0x08, 0xE0, 0xC2, 0xE0, 0x00, 0x40, 0x0A, 0xE0, 0x5D, 0x00, + 0x15, 0x3C, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, 0x09, 0xE0, 0x5D, 0x00, + 0xC1, 0xE0, 0xEE, 0xF4, 0x90, 0xE1, 0x2E, 0xE4, 0xC9, 0xF7, 0x00, 0x40, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x08, 0x00, 0x60, 0x00, 0x80, 0x00, 0x09, 0x00, 0x0B, 0x00, + 0x90, 0x00, 0xB0, 0x00, 0x12, 0x00, 0x16, 0x00, 0x20, 0x01, 0x60, 0x01, + 0x12, 0x00, 0x58, 0x00, 0x40, 0x02, 0xC0, 0x02, 0x12, 0x00, 0x60, 0x01, + 0x80, 0x04, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0F, 0x00, + 0x0D, 0x00, 0x63, 0x00, 0x00, 0x00, 0x17, 0x00, 0x15, 0x00, 0x13, 0x00, + 0x02, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, + 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFB, 0xFF, 0x01, 0x00, + 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x3C, 0x03, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x56, 0x03, 0x0E, 0xE4, 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, + 0x27, 0xD0, 0x68, 0xE1, 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x04, 0xE0, 0x5A, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, + 0xC2, 0xE0, 0x00, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, + 0x74, 0x01, 0x1E, 0xE4, 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, + 0xEE, 0x28, 0x4E, 0xF0, 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, + 0x00, 0xCE, 0x1A, 0xE0, 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, + 0x96, 0x00, 0x1E, 0xE4, 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, + 0x9E, 0xE0, 0x42, 0x01, 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, + 0x07, 0x9F, 0x02, 0xA2, 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, + 0x6A, 0xE1, 0x3C, 0x03, 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, + 0x7C, 0xE6, 0x00, 0xC0, 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, + 0x11, 0xAE, 0x5E, 0x00, 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, + 0xEF, 0x3C, 0x56, 0xE0, 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, + 0x3E, 0xAE, 0x02, 0xA2, 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, + 0xC0, 0xE0, 0x07, 0x9F, 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, + 0x5D, 0x00, 0xC3, 0xE0, 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, + 0x00, 0xCE, 0x1A, 0xE0, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, + 0x00, 0x00, 0x04, 0xE0, 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, + 0x78, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, + 0x28, 0xCC, 0x04, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, + 0x05, 0xE0, 0x20, 0xAE, 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0x38, 0xD6, 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, + 0x00, 0xA2, 0x71, 0x00, 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, + 0x01, 0x00, 0x27, 0xD0, 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, + 0x2B, 0xF3, 0x03, 0xA1, 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, + 0x7B, 0xF1, 0x03, 0xA1, 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, + 0x3B, 0xF1, 0x05, 0xA1, 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, + 0x9B, 0xF1, 0x03, 0xA1, 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, + 0xAE, 0xF1, 0x2A, 0xA2, 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, + 0xC1, 0xE0, 0x5A, 0xA2, 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, + 0x04, 0xE0, 0xFB, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, + 0xCE, 0xF0, 0x4E, 0x00, 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, + 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, + 0x16, 0xAE, 0x72, 0x00, 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, + 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, 0x4E, 0x02, 0x1E, 0xE4, + 0x2E, 0xE4, 0xE1, 0xE1, 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x98, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, + 0x5B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, + 0xC0, 0xE0, 0x7C, 0xE6, 0x5C, 0x03, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, + 0x10, 0xA8, 0x5B, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, + 0x01, 0xC4, 0x00, 0xA2, 0x7C, 0xE6, 0x5E, 0x03, 0x61, 0xE1, 0x11, 0x3D, + 0xEB, 0x00, 0x88, 0xE1, 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, + 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, + 0x00, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, + 0x1E, 0xE4, 0x13, 0x01, 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0xEE, 0x01, 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, + 0x2E, 0xE4, 0x70, 0x00, 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, + 0x6B, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, + 0x33, 0xAE, 0x09, 0xA8, 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, + 0x6A, 0x00, 0xC0, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, + 0x2E, 0xE4, 0x07, 0x3D, 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, + 0xA0, 0x01, 0x67, 0xE1, 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, + 0xDA, 0xF7, 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, + 0xC2, 0xE0, 0x08, 0xA2, 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, + 0x90, 0x01, 0x1A, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, + 0xF0, 0x3C, 0x3E, 0xA2, 0x2E, 0xE4, 0x4A, 0x00, 0x78, 0x00, 0xC2, 0xE0, + 0xF0, 0x58, 0x02, 0xA2, 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0x20, 0xA2, + 0x00, 0xA2, 0x76, 0x00, 0xC2, 0xE0, 0x20, 0xA2, 0xC2, 0xE0, 0xFC, 0xA2, + 0x72, 0x00, 0xC2, 0xE0, 0x71, 0x00, 0xC2, 0xE0, 0xFA, 0xA2, 0x77, 0x00, + 0x84, 0xE1, 0x0F, 0x27, 0x22, 0xD0, 0x2E, 0xE4, 0x48, 0xF0, 0x4A, 0x00, + 0xC0, 0xE0, 0xAA, 0x01, 0xC0, 0xE0, 0xE8, 0xF7, 0x1F, 0x04, 0xC0, 0xE0, + 0x00, 0xA2, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, + 0x1C, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x11, 0x00, 0x04, 0xE0, 0x9D, 0x01, + 0xAF, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, 0x3C, 0x04, 0xD8, 0xF7, 0xEE, 0xA1, + 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0xE0, 0x01, 0x04, 0xE0, + 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, + 0xE8, 0xF7, 0x0D, 0x00, 0x45, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3C, 0x04, + 0x28, 0xE4, 0x04, 0xA1, 0x0E, 0xA8, 0x04, 0xAF, 0xC0, 0xE0, 0x4A, 0x00, + 0xC2, 0xE0, 0x02, 0xA2, 0x48, 0xCA, 0x8E, 0xF9, 0xE8, 0xF7, 0x11, 0x01, + 0xAF, 0x01, 0x1E, 0xE4, 0xE8, 0xF7, 0x02, 0xA8, 0xD8, 0xF7, 0xEE, 0xA1, + 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0xF8, 0x01, 0x04, 0xE0, + 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, + 0xE8, 0xF7, 0x0D, 0x00, 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x3C, 0x04, + 0x42, 0x3C, 0x43, 0x34, 0x01, 0xC0, 0x2E, 0xE4, 0x43, 0x2C, 0x01, 0xC0, + 0x2E, 0xE4, 0x00, 0xC0, 0x42, 0x1C, 0x2A, 0xE4, 0x00, 0xC0, 0x42, 0x2E, + 0x40, 0x18, 0x10, 0xAF, 0x4A, 0xE0, 0xB4, 0xF0, 0x41, 0x1A, 0xFF, 0x00, + 0x09, 0xE0, 0x74, 0xF0, 0xFE, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x34, 0xF0, + 0x1E, 0xF1, 0x5D, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0x01, 0xC0, 0xEE, 0xF0, + 0x5E, 0x3C, 0x01, 0xC0, 0x5F, 0x3C, 0x01, 0xC0, 0xBE, 0xF0, 0x5E, 0x28, + 0x5E, 0x1A, 0x5D, 0x2A, 0x01, 0xC0, 0x8E, 0xF0, 0x5F, 0x2A, 0x01, 0xC0, + 0x3E, 0xF0, 0x1B, 0xE0, 0x08, 0x08, 0xC2, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0x02, 0x08, 0x62, 0xE1, 0x0B, 0x08, 0xC3, 0xE0, 0x12, 0x9F, 0x00, 0xA2, + 0x12, 0x9F, 0x02, 0xA2, 0x92, 0x9F, 0x00, 0x02, 0x05, 0xE0, 0x12, 0x9F, + 0x82, 0xE0, 0x12, 0x81, 0x12, 0x9F, 0x12, 0x9F, 0x12, 0x81, 0x12, 0x9F, + 0x00, 0xA2, 0x12, 0x9F, 0xC0, 0xE0, 0x00, 0x08, 0xC2, 0xE0, 0x02, 0xA2, + 0x1E, 0xE4, 0x2E, 0xE4, 0xE8, 0xF7, 0x00, 0x08, 0x32, 0xA2, 0x20, 0x06, + 0x60, 0xD1, 0x4E, 0x02, 0x40, 0xCE, 0x2E, 0xE4, 0xC0, 0xCE, 0x18, 0xAE, + 0x02, 0x00, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, 0x02, 0xA8, 0x48, 0xCA, + 0x80, 0x00, 0x23, 0xD1, 0x22, 0xAE, 0x04, 0xA2, 0x2E, 0xE4, 0xE8, 0xF7, + 0x8C, 0xCC, 0x72, 0xCC, 0x00, 0xA2, 0x9E, 0xCC, 0x20, 0xAE, 0x10, 0xA8, + 0x04, 0xE0, 0x8E, 0xCC, 0x6F, 0xD1, 0x4A, 0xCE, 0x22, 0x93, 0x0A, 0xE0, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x03, 0x00, 0x60, 0xA2, 0x2E, 0xE4, + 0x00, 0x00, 0x6F, 0xD1, 0xEA, 0xF7, 0x02, 0xA8, 0x50, 0xCA, 0x50, 0xCE, + 0x20, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0xC2, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0x50, 0xCE, 0x3D, 0x04, 0xC1, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, + 0x00, 0x01, 0x0A, 0xE0, 0xD9, 0xF7, 0xEF, 0xA1, 0x1E, 0xE4, 0x2E, 0xE4, + 0x1C, 0x04, 0xC2, 0xE0, 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0xC2, 0x02, + 0x72, 0x02, 0x1E, 0xE4, 0x1F, 0x00, 0x08, 0xE0, 0x37, 0x03, 0x1E, 0xE4, + 0xFD, 0x02, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x12, 0xAE, + 0xE8, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x27, 0x03, 0x04, 0xA8, 0x10, 0x02, + 0xC0, 0xE0, 0x2A, 0xE4, 0x08, 0xE0, 0x15, 0x02, 0xC0, 0xE0, 0x18, 0xF1, + 0x16, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, 0x08, 0xE0, 0x13, 0x02, + 0xC0, 0xE0, 0xBE, 0xF0, 0x14, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, + 0x1E, 0xE4, 0x0B, 0x02, 0xC0, 0xE0, 0x3E, 0xF0, 0x1E, 0xE4, 0xFD, 0x02, + 0x1E, 0xE4, 0x72, 0x02, 0x10, 0x02, 0xC1, 0xE0, 0x12, 0xAE, 0x37, 0x03, + 0xC1, 0xE0, 0x56, 0xE0, 0x15, 0xAE, 0x03, 0xA8, 0x07, 0xAE, 0x7F, 0xA8, + 0x0B, 0xAF, 0x04, 0x02, 0x0F, 0xA8, 0x04, 0x02, 0xC1, 0xE0, 0x56, 0xE0, + 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x56, 0xE0, 0x44, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x27, 0x03, 0x52, 0xE0, 0x1F, 0xAE, 0x03, 0xA2, 0x92, 0xE0, + 0x94, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0xEA, 0xF1, 0x84, 0xE0, 0x8A, 0xF1, + 0x06, 0xA8, 0x08, 0xAF, 0x21, 0xA8, 0x85, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, + 0xC0, 0xE0, 0x0A, 0xF1, 0x56, 0xE0, 0x17, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, + 0x12, 0xAF, 0x44, 0x00, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, + 0x3A, 0xF0, 0x56, 0xE0, 0x03, 0xA8, 0x1B, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, + 0x2E, 0xE4, 0x02, 0xA2, 0x1F, 0xAE, 0x03, 0xA2, 0x44, 0x00, 0xC0, 0xE0, + 0xC2, 0x02, 0x1E, 0xE4, 0xEA, 0xF0, 0x52, 0xE0, 0x69, 0xF0, 0x13, 0x0B, + 0x1E, 0xE4, 0xB8, 0xF0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0xC0, 0xE0, + 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x38, 0xF0, 0x08, 0xE0, 0x1C, 0x04, + 0xC0, 0xE0, 0x2E, 0xE4, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, 0xFF, 0x00, + 0x04, 0xAE, 0x02, 0xA0, 0x00, 0x05, 0x00, 0xE0, 0xC2, 0xE0, 0x02, 0xA2, + 0x1A, 0x04, 0xC2, 0xE0, 0xEA, 0xF7, 0x19, 0x04, 0xC0, 0xE0, 0x18, 0x04, + 0xC0, 0xE0, 0x18, 0x04, 0xC2, 0xE0, 0x02, 0xA2, 0x1B, 0x04, 0xC0, 0xE0, + 0xEA, 0xF7, 0x19, 0x04, 0x28, 0xAE, 0x08, 0xAF, 0x1E, 0xA0, 0x20, 0xAF, + 0xFF, 0xFF, 0x09, 0xE0, 0x1B, 0x04, 0xC1, 0xE0, 0x56, 0xE0, 0x09, 0xAE, + 0x09, 0xAF, 0x1F, 0xA0, 0xC0, 0xE0, 0x2E, 0xE4, 0x1D, 0x04, 0xC2, 0xE0, + 0xC2, 0xE0, 0x00, 0x02, 0x0A, 0xE0, 0x1C, 0x04, 0xF0, 0xF7, 0x02, 0xA1, + 0x28, 0xA2, 0x1C, 0x04, 0x00, 0x02, 0x0C, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, + 0xC0, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, + 0x04, 0xAF, 0x44, 0x00, 0x60, 0x03, 0x0E, 0xE4, 0x8A, 0x0C, 0x0E, 0xE4, + 0x68, 0x03, 0x0E, 0xE4, 0x64, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6E, 0x03, 0x0E, 0xE4, 0x72, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x74, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x78, 0x03, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x99, 0x03, 0x1E, 0xE4, 0xB6, 0x01, 0x1E, 0xE4, + 0x9A, 0x03, 0x1E, 0xE4, 0x06, 0x04, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x0F, 0x04, 0x1E, 0xE4, 0x8D, 0x09, 0x1E, 0xE4, 0x26, 0x01, 0x1E, 0xE4, + 0x5A, 0x0A, 0x1E, 0xE4, 0x3D, 0x04, 0x1E, 0xE4, 0x00, 0xA2, 0x4C, 0xCC, + 0x4A, 0xCC, 0x00, 0xA2, 0x1E, 0xE4, 0xB8, 0x09, 0x1E, 0xE4, 0x1F, 0x3C, + 0x58, 0x07, 0x1E, 0xE4, 0xAA, 0xF0, 0x58, 0x0C, 0x1E, 0xE4, 0x5D, 0xF0, + 0x88, 0x05, 0x1E, 0xE4, 0x1E, 0xE4, 0x1F, 0x3C, 0x02, 0xA2, 0x43, 0x07, + 0x6A, 0xE1, 0xEC, 0x0C, 0x1E, 0xE4, 0xE6, 0x09, 0x44, 0xCC, 0x00, 0xA2, + 0x2E, 0xE4, 0x2E, 0xE4, 0x62, 0x3C, 0xCD, 0x3C, 0x4C, 0xCC, 0x4A, 0xCC, + 0x1E, 0xE4, 0x63, 0x3C, 0x4B, 0x3C, 0x4A, 0x3C, 0xFA, 0xF3, 0x58, 0x0C, + 0x1E, 0xE4, 0xB8, 0x09, 0xFF, 0x08, 0x1E, 0xE4, 0x58, 0x07, 0x1E, 0xE4, + 0x51, 0x0C, 0x1E, 0xE4, 0x71, 0x0A, 0x1E, 0xE4, 0xEE, 0x0B, 0x1E, 0xE4, + 0x90, 0x07, 0x1E, 0xE4, 0xF8, 0xF2, 0xC1, 0x28, 0x7B, 0x0A, 0x1E, 0xE4, + 0x7A, 0xF0, 0x1A, 0x28, 0x3E, 0x04, 0x1E, 0xE4, 0x4A, 0x07, 0x1E, 0xE4, + 0x88, 0x05, 0x1E, 0xE4, 0x1A, 0xE4, 0x63, 0x28, 0x01, 0x04, 0x08, 0xE4, + 0x1F, 0x3C, 0x1A, 0xB6, 0x02, 0xA2, 0xB1, 0x05, 0xC1, 0x28, 0x3E, 0x04, + 0x1E, 0xE4, 0xED, 0xF1, 0xB8, 0xF1, 0x42, 0x04, 0x1E, 0xE4, 0xA8, 0xF1, + 0x3C, 0x09, 0x1E, 0xE4, 0x3E, 0x04, 0x1E, 0xE4, 0x9B, 0xF0, 0x13, 0x0B, + 0x1E, 0xE4, 0x2A, 0xF1, 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, 0x06, 0xA2, + 0x8F, 0x0B, 0x1E, 0xE4, 0x52, 0x28, 0x67, 0x0B, 0x85, 0x0A, 0x1E, 0xE4, + 0x3E, 0x04, 0x1E, 0xE4, 0x02, 0xA0, 0x52, 0x28, 0x53, 0x04, 0x1E, 0xE4, + 0x1E, 0xE4, 0xC1, 0x28, 0x0D, 0x0D, 0x1A, 0xE4, 0x1E, 0xE4, 0x63, 0x09, + 0x1E, 0xE4, 0x76, 0x09, 0x1E, 0xE4, 0x52, 0x0C, 0x1E, 0xE4, 0x87, 0x04, + 0x5C, 0x28, 0x39, 0x0C, 0x1E, 0xE4, 0x3A, 0x08, 0x1E, 0xE4, 0x25, 0x09, + 0x1E, 0xE4, 0x5F, 0x3C, 0x6A, 0xE1, 0xEC, 0x0C, 0x1E, 0xE4, 0xE6, 0x09, + 0x1E, 0xE4, 0x43, 0x07, 0x1E, 0xE4, 0x2E, 0xE4, 0xB8, 0x09, 0x1E, 0xE4, + 0x5E, 0xF6, 0x0D, 0x0D, 0x63, 0x0A, 0x1E, 0xE4, 0xA3, 0x08, 0x1E, 0xE4, + 0x80, 0xE1, 0x2E, 0xE4, 0x7F, 0x0B, 0x1E, 0xE4, 0xBE, 0x3C, 0x00, 0xA2, + 0x8D, 0x09, 0x1E, 0xE4, 0x5B, 0x3C, 0x5A, 0x3C, 0xFA, 0xA2, 0xC1, 0x3C, + 0xFE, 0xA2, 0x52, 0x3C, 0xFC, 0xA2, 0x5C, 0x3C, 0x56, 0x3C, 0x57, 0x3C, + 0x00, 0xA2, 0x53, 0x3C, 0x6A, 0xF1, 0x06, 0x9E, 0x54, 0x00, 0x66, 0xE1, + 0x00, 0xA2, 0x44, 0xCC, 0x02, 0xA1, 0x51, 0x28, 0x06, 0x9E, 0x37, 0x04, + 0x84, 0xE1, 0x5E, 0x3C, 0x5E, 0x28, 0x7A, 0xF0, 0x02, 0xA8, 0x5E, 0x5C, + 0x08, 0xA2, 0x9E, 0xE0, 0xD0, 0x02, 0x00, 0xE0, 0x5E, 0x3C, 0x02, 0xA0, + 0x5E, 0x28, 0x07, 0x3D, 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x90, 0xE1, + 0x02, 0xA0, 0x61, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, 0x2A, 0xE4, 0x60, 0x28, + 0x2E, 0xE4, 0x61, 0x3C, 0x5A, 0xF0, 0x02, 0xA1, 0x4A, 0xF0, 0x02, 0xA1, + 0x4E, 0xF0, 0x78, 0xF0, 0x29, 0x28, 0x9E, 0xF0, 0x00, 0xA2, 0x3A, 0xF0, + 0x04, 0xA1, 0x29, 0x28, 0x2B, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, + 0x5A, 0xF0, 0x04, 0xA1, 0x29, 0x28, 0x2D, 0x3C, 0x4E, 0xF0, 0x2D, 0x3C, + 0x2C, 0x3C, 0x2B, 0x28, 0x1E, 0xE4, 0x2D, 0x3C, 0x2B, 0x64, 0x2C, 0x28, + 0x1E, 0xE4, 0x6D, 0x07, 0x1E, 0xE4, 0xF4, 0x04, 0x1E, 0xE4, 0x22, 0x0B, + 0x1E, 0xE4, 0x7F, 0x0B, 0x1E, 0xE4, 0xAE, 0x07, 0x1E, 0xE4, 0x7B, 0x02, + 0x47, 0x3C, 0x46, 0x34, 0x00, 0xA2, 0xA8, 0x07, 0x46, 0x20, 0xDD, 0xF0, + 0x88, 0x04, 0x1E, 0xE4, 0x1E, 0xE4, 0xC2, 0xF0, 0x42, 0x18, 0x47, 0x4C, + 0x46, 0x10, 0x45, 0x2C, 0x6D, 0xF0, 0x27, 0x06, 0x1E, 0xE4, 0x2A, 0xF7, + 0xA4, 0xF7, 0x47, 0x1C, 0x01, 0x00, 0xE6, 0xD1, 0x6A, 0xE1, 0xB1, 0x04, + 0x2E, 0xE4, 0x2E, 0xE4, 0xF8, 0xF7, 0xE2, 0xCB, 0x36, 0x18, 0x22, 0x28, + 0xCA, 0x04, 0x1E, 0xE4, 0x28, 0xF0, 0x37, 0x18, 0x23, 0x28, 0x58, 0xF0, + 0x02, 0xA8, 0x1A, 0xE0, 0x29, 0x28, 0x3E, 0xF1, 0x23, 0x28, 0x36, 0x3C, + 0x22, 0x28, 0x88, 0xF0, 0x3E, 0xF0, 0x38, 0x3C, 0x00, 0xA2, 0x37, 0x3C, + 0x38, 0x28, 0x22, 0x28, 0x38, 0x3C, 0x02, 0xA2, 0x1E, 0xE4, 0x2E, 0xE4, + 0x6B, 0xE1, 0x3A, 0xF0, 0x47, 0x4C, 0x46, 0x20, 0x2D, 0xE4, 0x1C, 0x05, + 0x02, 0xA1, 0x86, 0xCB, 0x22, 0xE4, 0x42, 0x18, 0x48, 0xF7, 0xE4, 0x04, + 0x1E, 0xE4, 0x70, 0xF7, 0x56, 0x24, 0x88, 0xF0, 0x29, 0x28, 0x2E, 0xE4, + 0x10, 0x4C, 0x04, 0xA2, 0x5A, 0xF0, 0x57, 0x4C, 0x47, 0x4C, 0x46, 0x20, + 0xC6, 0xCF, 0x80, 0xCF, 0x47, 0x4C, 0x46, 0x20, 0xCA, 0x04, 0x1A, 0xE4, + 0x50, 0x05, 0x1E, 0xE4, 0x22, 0xE4, 0x42, 0x18, 0x4A, 0x34, 0x02, 0xA0, + 0x4B, 0x4C, 0x4A, 0x24, 0x82, 0xCF, 0x2A, 0x28, 0x5E, 0xF7, 0x4B, 0x3C, + 0x96, 0xCF, 0x2B, 0x28, 0x00, 0x00, 0xC3, 0xD1, 0x02, 0xA1, 0x24, 0x28, + 0x01, 0x00, 0x88, 0xD1, 0x25, 0x28, 0x26, 0x3C, 0x16, 0xE0, 0x25, 0x18, + 0x00, 0xE0, 0x02, 0xAE, 0x25, 0x3C, 0x02, 0xA0, 0x11, 0x4D, 0x11, 0x21, + 0x92, 0xE0, 0x60, 0x03, 0x2E, 0xE4, 0x28, 0x3C, 0x27, 0x34, 0x06, 0xAE, + 0x27, 0x10, 0x72, 0xC8, 0x28, 0xE4, 0x26, 0x28, 0x0E, 0xA1, 0x24, 0xE4, + 0x0E, 0xA0, 0x28, 0x1C, 0x2A, 0xE4, 0x0C, 0xB6, 0x49, 0x3C, 0x12, 0xE0, + 0x2E, 0xE4, 0x49, 0x74, 0x28, 0xE4, 0x49, 0x78, 0x2F, 0x28, 0x9A, 0xF0, + 0x04, 0xA1, 0x29, 0x28, 0x31, 0x3C, 0x33, 0x08, 0x22, 0xF0, 0x30, 0x18, + 0x30, 0x28, 0x2E, 0xE4, 0x30, 0x3C, 0x2F, 0x28, 0x32, 0x3C, 0x33, 0x08, + 0x22, 0xF0, 0x2F, 0x18, 0x32, 0x3C, 0x00, 0xA4, 0x32, 0x18, 0x31, 0x28, + 0x31, 0x7C, 0x0F, 0xC7, 0x1C, 0xAE, 0x32, 0x28, 0x1C, 0xAE, 0x32, 0x18, + 0x31, 0x28, 0x34, 0x3C, 0x05, 0xE0, 0x35, 0x3C, 0x31, 0x7C, 0x0F, 0xC7, + 0x34, 0x3C, 0x66, 0xE0, 0x34, 0x28, 0xFF, 0x3F, 0x2E, 0xE4, 0x35, 0x3C, + 0x66, 0xE0, 0x35, 0x28, 0x00, 0x00, 0x85, 0xD1, 0x02, 0x00, 0x84, 0xD1, + 0xA0, 0xCB, 0x3F, 0x00, 0xD0, 0xD1, 0x90, 0xE1, 0xC8, 0xF7, 0x09, 0xF2, + 0xA3, 0xCB, 0x10, 0xA8, 0xF8, 0xF7, 0xE0, 0xCB, 0x3E, 0x08, 0x1E, 0xE4, + 0x1E, 0xE4, 0x54, 0x08, 0x1A, 0xE4, 0x48, 0x28, 0x39, 0xF1, 0xA3, 0xCB, + 0xA0, 0xCB, 0x58, 0x08, 0x84, 0xD1, 0x01, 0x00, 0x85, 0xD1, 0xD8, 0xF7, + 0x06, 0xCB, 0x65, 0x08, 0x1E, 0xE4, 0x04, 0x00, 0x72, 0x4C, 0x71, 0x28, + 0x47, 0x3C, 0x46, 0x34, 0x14, 0xE4, 0x77, 0x18, 0x79, 0x28, 0x2A, 0xE4, + 0x00, 0x00, 0xD0, 0xD1, 0x2E, 0xE4, 0x17, 0x0C, 0xF8, 0xF7, 0x0C, 0xCB, + 0x00, 0x00, 0xD1, 0xD1, 0x2E, 0xE4, 0x6B, 0xE1, 0xF8, 0xF7, 0xE0, 0xCB, + 0x00, 0x00, 0x85, 0xD1, 0x02, 0x00, 0x84, 0xD1, 0x00, 0x00, 0xC4, 0xD1, + 0xCA, 0x01, 0x2B, 0x88, 0x00, 0x00, 0xC5, 0xD1, 0x01, 0x00, 0xC2, 0xD1, + 0xF8, 0xF7, 0xA0, 0xCB, 0x0E, 0x00, 0xD0, 0xD1, 0xC2, 0xD1, 0x58, 0xF0, + 0x57, 0x4C, 0x56, 0x24, 0xD0, 0xD1, 0x03, 0x00, 0xC5, 0xD1, 0x00, 0x00, + 0x00, 0xA2, 0x3E, 0x08, 0x1E, 0xE4, 0x30, 0x00, 0xF8, 0xF7, 0xE0, 0xCB, + 0x26, 0x01, 0xC2, 0xE0, 0x1E, 0xE4, 0x54, 0x08, 0x1A, 0xE4, 0x48, 0x28, + 0x85, 0xD1, 0xF8, 0xF7, 0xA0, 0xCB, 0x58, 0x08, 0x1E, 0xE4, 0x04, 0x00, + 0x84, 0xD1, 0x01, 0x00, 0x47, 0x3C, 0x46, 0x34, 0x06, 0xCB, 0x65, 0x08, + 0x79, 0x28, 0x2A, 0xE4, 0x72, 0x4C, 0x71, 0x28, 0x2E, 0xE4, 0x17, 0x0C, + 0x14, 0xE4, 0x77, 0x18, 0x7E, 0xBA, 0x6A, 0xE1, 0x10, 0x3C, 0x00, 0xA2, + 0x49, 0x56, 0x04, 0xE0, 0x19, 0x3C, 0x18, 0x34, 0x3F, 0xA2, 0x4F, 0x44, + 0x0A, 0xE0, 0x20, 0xAE, 0x88, 0xF1, 0x46, 0xE0, 0x7F, 0xBA, 0xF0, 0x3E, + 0x1E, 0xE4, 0x33, 0x3C, 0x00, 0x20, 0x04, 0xE0, 0xBF, 0x06, 0x1E, 0xE4, + 0x2D, 0xF1, 0x55, 0x06, 0x1E, 0xE4, 0xF1, 0x01, 0x1E, 0xE4, 0x42, 0x28, + 0x13, 0x3C, 0x22, 0x28, 0xA4, 0xF0, 0xF6, 0x01, 0x37, 0x3C, 0x14, 0x3C, + 0x23, 0x28, 0x36, 0x3C, 0x6B, 0xE1, 0x2E, 0xE4, 0x1D, 0x3C, 0x02, 0xA2, + 0x21, 0x3C, 0x20, 0x34, 0x7E, 0xBA, 0x2E, 0xE4, 0x46, 0xF3, 0xF0, 0x3E, + 0x09, 0xA2, 0x08, 0xA1, 0x90, 0xE1, 0x5E, 0xBA, 0x90, 0xE1, 0x7E, 0xBA, + 0x90, 0xE1, 0x7E, 0xBA, 0x90, 0xE1, 0x5E, 0xBA, 0x86, 0xF2, 0xF0, 0x3E, + 0x0B, 0xA2, 0x7E, 0xBA, 0xF0, 0x3E, 0x0D, 0xA2, 0x00, 0x01, 0x02, 0xE0, + 0x24, 0x3C, 0x00, 0x01, 0x00, 0xE0, 0x30, 0xF2, 0x02, 0xA1, 0x24, 0x28, + 0x60, 0x03, 0x61, 0xE1, 0x7E, 0xBA, 0xDC, 0x05, 0x84, 0xE1, 0x44, 0xCC, + 0x11, 0x35, 0x7E, 0xBA, 0x6A, 0xF1, 0x90, 0xE1, 0x00, 0xF1, 0x21, 0x1C, + 0x20, 0x14, 0x11, 0x3D, 0x00, 0xA2, 0x00, 0x00, 0x39, 0xD0, 0x90, 0xE1, + 0x1E, 0xE4, 0xF0, 0x3E, 0x0F, 0xA2, 0x25, 0x3C, 0xF0, 0x3C, 0x00, 0xA2, + 0x6D, 0xF0, 0xEF, 0x05, 0x39, 0xD0, 0x2E, 0xE4, 0x63, 0x3C, 0x02, 0xA2, + 0x11, 0xA2, 0x2E, 0xE4, 0x6B, 0xE1, 0x00, 0x00, 0x10, 0x74, 0x38, 0xF3, + 0x40, 0xBA, 0xF0, 0x3E, 0x42, 0xBA, 0xF8, 0xF2, 0x10, 0x74, 0x18, 0xF3, + 0x10, 0x74, 0x29, 0x3C, 0x08, 0xB6, 0x02, 0xA1, 0x10, 0x28, 0x2B, 0x3C, + 0x48, 0xBA, 0x90, 0xE1, 0x15, 0xA2, 0x40, 0xBA, 0xAA, 0xF0, 0x16, 0xE0, + 0xF0, 0x3E, 0x17, 0xA2, 0x08, 0xF2, 0xF0, 0x3E, 0x2A, 0x3C, 0x42, 0xBA, + 0xC8, 0xF1, 0x40, 0xBA, 0x2F, 0x3C, 0x58, 0xBA, 0x2E, 0x3C, 0x40, 0xBA, + 0x22, 0x3C, 0x86, 0xE0, 0xE0, 0x06, 0x1E, 0xE4, 0x23, 0x3C, 0x88, 0xE0, + 0x00, 0xF1, 0x13, 0x18, 0xBF, 0x06, 0x1E, 0xE4, 0xC0, 0xF0, 0x14, 0x18, + 0x45, 0x3C, 0x44, 0x74, 0xF0, 0x3E, 0x19, 0xA2, 0x10, 0x74, 0x30, 0xF0, + 0x42, 0x18, 0x58, 0xF0, 0x40, 0xBA, 0x2E, 0xE4, 0x6B, 0xE1, 0x2E, 0xE4, + 0x10, 0x74, 0x98, 0xF2, 0x10, 0x74, 0xB8, 0xF2, 0x08, 0xB6, 0x02, 0xA1, + 0x42, 0xBA, 0x78, 0xF2, 0x90, 0xE1, 0x10, 0x74, 0x28, 0xF2, 0x29, 0x18, + 0x16, 0xE0, 0x10, 0x28, 0x2B, 0x3C, 0x48, 0xBA, 0x40, 0xBA, 0x98, 0xF1, + 0x40, 0xBA, 0x6A, 0xF0, 0x40, 0xBA, 0x2A, 0x3C, 0x42, 0xBA, 0x78, 0xF1, + 0x2F, 0x18, 0x58, 0xBA, 0x28, 0xF1, 0x2E, 0x18, 0x86, 0xE0, 0xE0, 0x06, + 0x1E, 0xE4, 0xF8, 0xF0, 0x23, 0x18, 0x88, 0xE0, 0xA8, 0xF0, 0x22, 0x18, + 0x42, 0x18, 0x45, 0x3C, 0x44, 0x74, 0x78, 0xF0, 0x6B, 0xE1, 0x2E, 0xE4, + 0x10, 0x74, 0x32, 0xF0, 0x56, 0x52, 0x02, 0xE0, 0x1E, 0xBA, 0x2E, 0xE4, + 0x0A, 0xE4, 0xF0, 0x3E, 0x03, 0xA2, 0x16, 0xE0, 0x02, 0xE0, 0x1E, 0xBA, + 0x5E, 0xBA, 0xBD, 0x06, 0x02, 0xE0, 0x1E, 0xBA, 0xAA, 0xF0, 0x30, 0x34, + 0xF0, 0x3E, 0x05, 0xA2, 0x16, 0xE0, 0x30, 0x33, 0x10, 0x3C, 0x02, 0xA2, + 0xBD, 0x06, 0x0A, 0xE4, 0x22, 0x3C, 0x5E, 0xBA, 0x90, 0xE1, 0x5E, 0xBA, + 0x90, 0xE1, 0x5E, 0xBA, 0x23, 0x3C, 0x5E, 0xBA, 0x90, 0xE1, 0x5E, 0xBA, + 0x90, 0xE1, 0x5E, 0xBA, 0x12, 0x3C, 0x5E, 0xBA, 0x90, 0xE1, 0x4E, 0xBA, + 0x11, 0x3C, 0x00, 0x01, 0x04, 0xE0, 0x4E, 0xBA, 0x18, 0xAF, 0x7E, 0xBA, + 0x90, 0xE1, 0x7E, 0xBA, 0x26, 0xF0, 0x13, 0xA2, 0x0A, 0xA1, 0x1E, 0xA8, + 0x10, 0x28, 0x16, 0x3E, 0x15, 0x36, 0x03, 0xA0, 0x44, 0xA1, 0x19, 0x4C, + 0x18, 0x20, 0x98, 0xF0, 0x8A, 0xF2, 0x02, 0xA1, 0x4F, 0xBA, 0xB6, 0xF2, + 0x16, 0x3E, 0x15, 0x36, 0x11, 0xA2, 0xDE, 0xF7, 0x17, 0x3C, 0x00, 0xA2, + 0xF0, 0x3E, 0x07, 0xA2, 0x11, 0x3D, 0x22, 0x28, 0x30, 0x03, 0x61, 0xE1, + 0x19, 0x4C, 0x18, 0x20, 0x11, 0x3D, 0x23, 0x28, 0x05, 0xAE, 0x4F, 0xBA, + 0x66, 0xF1, 0x44, 0xA1, 0x11, 0x3F, 0x05, 0xAE, 0x4F, 0xBA, 0x11, 0x3F, + 0x11, 0xA1, 0x17, 0x3E, 0x03, 0xA0, 0x17, 0x2A, 0x17, 0x28, 0x40, 0xF7, + 0x04, 0xA1, 0xD3, 0xF0, 0x02, 0xA0, 0x17, 0x28, 0x17, 0x3C, 0x02, 0xA0, + 0x6A, 0xE1, 0x17, 0x3C, 0x06, 0xA5, 0x02, 0xAF, 0x22, 0x28, 0x2E, 0xE4, + 0x6B, 0xE1, 0x2E, 0xE4, 0x23, 0x28, 0x40, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x40, 0x84, 0x41, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, 0x60, 0xA1, 0x42, 0x3C, + 0x18, 0xE0, 0x41, 0x82, 0xE6, 0xF0, 0x66, 0xA1, 0x16, 0xF1, 0x0D, 0xA2, + 0x02, 0xE0, 0xA6, 0xF0, 0x29, 0x01, 0x02, 0xE0, 0x90, 0x12, 0x02, 0xE0, + 0x66, 0xF0, 0xA4, 0x04, 0x05, 0xA0, 0x05, 0xA0, 0x03, 0xA0, 0x26, 0xF0, + 0x2E, 0xE4, 0x44, 0x3E, 0x03, 0xA0, 0x05, 0xA0, 0xFA, 0xF0, 0x17, 0x28, + 0xDA, 0xF0, 0x10, 0x28, 0x30, 0x03, 0x00, 0xE0, 0x02, 0xAE, 0x17, 0x74, + 0x11, 0x29, 0x96, 0xE0, 0x11, 0x29, 0x92, 0xE0, 0x8A, 0xF0, 0x29, 0x28, + 0x2E, 0xE4, 0x98, 0xE0, 0x96, 0xE0, 0x22, 0x28, 0x6A, 0xF0, 0x40, 0xBA, + 0x05, 0xE0, 0x2E, 0xE4, 0x98, 0xE0, 0x23, 0x28, 0x02, 0xA1, 0xCA, 0xF1, + 0x44, 0xBA, 0xA0, 0x00, 0x02, 0xA1, 0x6A, 0xF1, 0x02, 0xA1, 0x9A, 0xF1, + 0x02, 0xA1, 0x0A, 0xF1, 0x02, 0xA1, 0x3A, 0xF1, 0x01, 0xA2, 0x9A, 0xF0, + 0x02, 0xA1, 0xCA, 0xF0, 0xFF, 0x00, 0x02, 0xE0, 0x41, 0xE0, 0x4E, 0xBA, + 0x81, 0xA0, 0x8E, 0xF0, 0x05, 0xAE, 0xCA, 0xF7, 0xA1, 0xA0, 0x41, 0xA0, + 0x20, 0x01, 0x01, 0xE0, 0x05, 0xE0, 0x97, 0xE0, 0x21, 0xA0, 0x81, 0xA0, + 0x02, 0xA1, 0x7A, 0xF2, 0x44, 0xBA, 0x78, 0x00, 0x02, 0xA1, 0x1A, 0xF2, + 0x02, 0xA1, 0x4A, 0xF2, 0x02, 0xA1, 0xBA, 0xF1, 0x02, 0xA1, 0xEA, 0xF1, + 0x88, 0xF0, 0x41, 0xBA, 0x02, 0xA1, 0x7A, 0xF1, 0x6E, 0xF1, 0xB4, 0x00, + 0x05, 0xE0, 0x49, 0xF0, 0x49, 0xF0, 0x3E, 0xF1, 0x68, 0x01, 0x05, 0xE0, + 0x01, 0xA2, 0xFE, 0xF0, 0x40, 0x02, 0x05, 0xE0, 0xFF, 0x00, 0x02, 0xE0, + 0x41, 0xE0, 0x4E, 0xBA, 0x01, 0xE0, 0x7E, 0xF0, 0x05, 0xAE, 0xCA, 0xF7, + 0x19, 0xA0, 0xC1, 0xA0, 0x61, 0xA0, 0xC0, 0x00, 0x61, 0xE1, 0x2E, 0xE4, + 0x99, 0xE0, 0x19, 0xA0, 0x14, 0x28, 0x11, 0x3D, 0x13, 0x28, 0x40, 0x06, + 0x40, 0x06, 0x61, 0xE1, 0x2E, 0xE4, 0x11, 0x3D, 0x14, 0x28, 0x78, 0xF0, + 0x11, 0x19, 0x13, 0x28, 0x62, 0x3C, 0x00, 0xA2, 0x48, 0xF0, 0x11, 0x19, + 0x2E, 0xE4, 0x62, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x00, 0x00, 0x31, 0xD1, + 0x04, 0x00, 0x30, 0xD1, 0x04, 0x00, 0x3A, 0xD0, 0x00, 0x00, 0x08, 0xD0, + 0xB0, 0x03, 0xE1, 0xD1, 0x01, 0x00, 0xE0, 0xD1, 0xBF, 0x00, 0x22, 0xD0, + 0x40, 0x00, 0xF3, 0xD1, 0xE8, 0xCF, 0x00, 0xA2, 0x6B, 0x07, 0x84, 0xE1, + 0x10, 0x4C, 0x02, 0xAE, 0x29, 0x28, 0x2E, 0xE4, 0x0B, 0x00, 0xD3, 0xD1, + 0xC6, 0xCF, 0x80, 0xCF, 0x29, 0x4C, 0x04, 0xAE, 0x02, 0xA1, 0x40, 0x28, + 0x2E, 0x28, 0x00, 0xCF, 0x10, 0x4C, 0x02, 0xAE, 0x01, 0x00, 0x84, 0xD1, + 0x02, 0xCF, 0x00, 0xA2, 0x08, 0xAE, 0x41, 0x4C, 0x20, 0xAE, 0x40, 0x28, + 0x17, 0x21, 0xC0, 0x02, 0x67, 0xE1, 0xC4, 0xCF, 0xCE, 0xCF, 0x34, 0x28, + 0xCA, 0xCF, 0x17, 0x4D, 0x2E, 0xE4, 0x2E, 0xE4, 0x00, 0x00, 0xE6, 0xD1, + 0xC2, 0xE0, 0x08, 0xA9, 0x08, 0xAE, 0x10, 0x28, 0x25, 0x01, 0xC2, 0xE0, + 0x00, 0xA2, 0x00, 0x01, 0x71, 0x2A, 0x3D, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x1C, 0xA9, 0x08, 0xAE, 0x92, 0xB6, 0x72, 0x4E, 0xC2, 0xE0, 0x18, 0xA2, + 0x78, 0x01, 0xC2, 0xE0, 0x2E, 0xE4, 0xBB, 0x0A, 0x1E, 0xE4, 0x79, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0x8E, 0x02, 0x1E, 0xE4, 0x8E, 0xCC, 0x00, 0xA2, + 0x2E, 0xE4, 0x06, 0x01, 0x08, 0xAE, 0x10, 0x28, 0x25, 0x01, 0xC2, 0xE0, + 0x71, 0x2A, 0x00, 0x01, 0xC2, 0xE0, 0x08, 0xA9, 0x1C, 0xA9, 0x08, 0xAE, + 0x92, 0xB6, 0x72, 0x4E, 0x0C, 0x00, 0x04, 0xE0, 0x78, 0x01, 0xC2, 0xE0, + 0x04, 0xAE, 0x08, 0xA2, 0x79, 0x01, 0xC2, 0xE0, 0x06, 0xAE, 0x29, 0x4C, + 0x04, 0xAE, 0x10, 0x4C, 0xC2, 0xE0, 0x00, 0xA2, 0x04, 0x02, 0xC2, 0xE0, + 0xC2, 0xE0, 0x06, 0xAE, 0x29, 0x28, 0x08, 0x02, 0x04, 0xE0, 0x46, 0x00, + 0xC1, 0xE0, 0x04, 0x01, 0xC8, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x00, 0x00, + 0x00, 0x07, 0x61, 0xE1, 0x5B, 0xF0, 0x03, 0xA8, 0xC1, 0xE0, 0xC8, 0xCF, + 0x11, 0x4D, 0x11, 0x21, 0x10, 0xAE, 0x40, 0x00, 0x04, 0xE0, 0x46, 0x00, + 0x5B, 0xF0, 0x05, 0xA8, 0xC8, 0x2A, 0x42, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0x02, 0x07, 0x61, 0xE1, 0x16, 0xE0, 0x2E, 0x28, 0x03, 0x01, 0xC2, 0xE0, + 0x1E, 0xE4, 0x04, 0xA2, 0x10, 0x02, 0xC2, 0xE0, 0x16, 0xB6, 0x13, 0x0B, + 0x1E, 0xE4, 0xC8, 0x0A, 0xC1, 0xE0, 0xD9, 0x0A, 0x1E, 0xE4, 0x52, 0xB6, + 0x10, 0xAE, 0x70, 0x00, 0x04, 0xE0, 0x46, 0x00, 0x5B, 0xF0, 0x09, 0xA8, + 0xC8, 0x2A, 0x42, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x04, 0x07, 0x61, 0xE1, + 0x46, 0x00, 0xC1, 0xE0, 0x11, 0x02, 0xC2, 0xE0, 0x40, 0x00, 0x00, 0xE0, + 0x70, 0x00, 0x04, 0xE0, 0x11, 0xA8, 0xC8, 0x2A, 0x42, 0xE0, 0x10, 0xAE, + 0x11, 0x21, 0x06, 0x07, 0x61, 0xE1, 0x5B, 0xF0, 0x40, 0x24, 0x12, 0x02, + 0xC2, 0xE0, 0x11, 0x4D, 0x01, 0x01, 0xC2, 0xE0, 0x08, 0xAE, 0x41, 0x4C, + 0xBB, 0x0A, 0x1E, 0xE4, 0x05, 0x02, 0xC2, 0xE0, 0xC2, 0xE0, 0x2D, 0x4C, + 0x0A, 0xAE, 0x00, 0xA2, 0x1E, 0xE4, 0x6C, 0x08, 0x1E, 0xE4, 0x17, 0x02, + 0x12, 0x03, 0xC2, 0xE0, 0x0E, 0xA2, 0x77, 0x08, 0xC2, 0xE0, 0x00, 0xA2, + 0x64, 0x01, 0x1E, 0xE4, 0xC2, 0xE0, 0x34, 0x4C, 0x35, 0x20, 0x0D, 0x03, + 0x11, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x10, 0x03, 0xC2, 0xE0, 0x94, 0xCB, + 0x2E, 0xE4, 0xE8, 0xF7, 0x26, 0x01, 0xC2, 0xE0, 0xA4, 0xCB, 0x15, 0x01, + 0x02, 0xA8, 0x14, 0x01, 0xC2, 0xE0, 0x8A, 0xCB, 0xC2, 0xE0, 0x12, 0xCB, + 0x2A, 0xE4, 0x48, 0x3C, 0x21, 0x01, 0xC2, 0xE0, 0x8C, 0xCB, 0x20, 0x01, + 0x2E, 0xE4, 0x22, 0x01, 0xC2, 0xE0, 0x8E, 0xCB, 0x2E, 0xE4, 0x11, 0x03, + 0xC2, 0xE0, 0xD0, 0xCB, 0x42, 0xCB, 0x24, 0x02, 0xC2, 0xE0, 0x40, 0xCB, + 0xC2, 0xE0, 0x44, 0xCB, 0x25, 0x02, 0xC2, 0xE0, 0x27, 0x02, 0xC2, 0xE0, + 0x46, 0xCB, 0x26, 0x02, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, + 0x2E, 0xE4, 0x10, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0xC2, 0xE0, 0x0B, 0x02, + 0xC2, 0xE0, 0x52, 0x28, 0x4B, 0xF0, 0x13, 0x0B, 0x1E, 0xE4, 0x14, 0x02, + 0x00, 0xA2, 0x16, 0x02, 0xC2, 0xE0, 0x51, 0x28, 0x82, 0x00, 0x04, 0xE0, + 0x0A, 0x03, 0xC2, 0xE0, 0x42, 0x08, 0x0A, 0xE0, 0x20, 0xAE, 0x02, 0xA2, + 0xC2, 0xE0, 0x02, 0xA2, 0x0B, 0x03, 0xC2, 0xE0, 0x82, 0xF0, 0x04, 0xA1, + 0x29, 0x28, 0x02, 0x03, 0x08, 0xB6, 0x52, 0x28, 0x32, 0xF0, 0x5B, 0x28, + 0x5A, 0x28, 0x9E, 0xF0, 0x80, 0x03, 0xC2, 0xE0, 0x52, 0x28, 0x32, 0xF0, + 0x5B, 0x28, 0x52, 0xF0, 0x5B, 0x28, 0x80, 0x03, 0xC2, 0xE0, 0x08, 0xB6, + 0x52, 0x28, 0x32, 0xF0, 0x5A, 0x28, 0x52, 0xF0, 0x00, 0xA2, 0x83, 0x03, + 0xC2, 0xE0, 0x08, 0xB6, 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0x03, 0xC2, 0xE0, + 0x3A, 0x04, 0x1E, 0xE4, 0x50, 0x3C, 0x61, 0x00, 0x11, 0xD1, 0x20, 0xCE, + 0x42, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0xC4, 0x00, 0x12, 0xD1, 0x00, 0x02, + 0x00, 0xE0, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x20, 0xCE, 0x80, 0x00, + 0x00, 0xE0, 0x80, 0x01, 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, + 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x67, 0x0B, 0x1E, 0xE4, + 0x01, 0xA2, 0x04, 0xA2, 0x80, 0x01, 0x00, 0xE0, 0x42, 0x00, 0xC0, 0xE0, + 0x12, 0xD1, 0xC0, 0x02, 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x03, 0x00, + 0x13, 0xD1, 0x04, 0x00, 0x0B, 0xE4, 0x13, 0x0B, 0x1E, 0xE4, 0xF8, 0xF7, + 0x00, 0xE0, 0x42, 0x00, 0xC0, 0xE0, 0xF6, 0x08, 0x00, 0xE0, 0x80, 0x00, + 0x00, 0xE0, 0x80, 0x01, 0x00, 0x02, 0x11, 0xD1, 0x20, 0xCE, 0x80, 0x01, + 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, 0x80, 0x01, 0x00, 0xE0, + 0xF9, 0xF7, 0x29, 0xCA, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, 0x20, 0xCE, + 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x00, 0x03, 0x05, 0xE0, + 0x04, 0xA2, 0xF9, 0xF7, 0x60, 0x00, 0xC0, 0xE0, 0x67, 0x0B, 0x1E, 0xE4, + 0x02, 0xAF, 0x2B, 0xF0, 0x13, 0x0B, 0x1E, 0xE4, 0xFC, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x51, 0x3C, 0xC0, 0xE0, 0x5C, 0x3C, 0xFA, 0xA2, 0x52, 0x3C, + 0x1E, 0xE4, 0x0A, 0x09, 0x1E, 0xE4, 0x54, 0x00, 0x5E, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x25, 0x09, 0x51, 0x28, 0x9C, 0xE0, 0x54, 0x00, 0x04, 0xE0, + 0x23, 0x09, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0xA8, 0xF0, 0x02, 0xA8, + 0x5E, 0x5C, 0x06, 0x9E, 0xD0, 0x02, 0x01, 0xE0, 0x49, 0xE0, 0x5E, 0x28, + 0x19, 0xE4, 0x09, 0xA8, 0x07, 0x2B, 0x9F, 0xE0, 0x5E, 0x3C, 0x02, 0xA0, + 0x5E, 0x28, 0xAA, 0x09, 0x9E, 0xE0, 0xD0, 0x02, 0x04, 0xE0, 0x2E, 0xE4, + 0x51, 0x28, 0x9C, 0xE0, 0x54, 0x00, 0x04, 0xE0, 0x5E, 0x3C, 0x00, 0xA2, + 0x44, 0xCC, 0x02, 0xA1, 0x05, 0xAF, 0x17, 0x2B, 0x39, 0x09, 0x84, 0xE1, + 0x5E, 0x2A, 0x56, 0xE0, 0x5E, 0x5A, 0x03, 0xA8, 0x2E, 0xE4, 0x06, 0x9F, + 0x5E, 0x3E, 0x03, 0xA0, 0xE8, 0xB7, 0x53, 0x28, 0xCD, 0x3C, 0x51, 0x28, + 0x02, 0xA0, 0x84, 0xE0, 0x92, 0xE0, 0x94, 0xE0, 0x52, 0x3C, 0x16, 0xB6, + 0x45, 0xE0, 0x51, 0x2A, 0x59, 0xF0, 0x45, 0xE0, 0x83, 0xE0, 0x94, 0xE0, + 0x2E, 0xE4, 0x00, 0xA2, 0x52, 0x3C, 0xFE, 0xA2, 0x52, 0x3C, 0xFE, 0xA2, + 0x51, 0xF0, 0xCD, 0x2A, 0x00, 0xE0, 0x53, 0x3C, 0x2E, 0xE4, 0x00, 0xA2, + 0xCD, 0x2A, 0x07, 0x29, 0x9E, 0xE0, 0xD0, 0x02, 0x0A, 0xA2, 0x48, 0xF6, + 0xCD, 0x3E, 0x03, 0xA1, 0x52, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x07, 0x3D, + 0x04, 0xA1, 0xF4, 0xF0, 0x29, 0x28, 0x14, 0xF1, 0x9F, 0x09, 0x1E, 0xE4, + 0x5A, 0x28, 0xD2, 0xF0, 0x5B, 0x3C, 0x52, 0x28, 0x5A, 0x3C, 0x5B, 0x28, + 0x57, 0x3C, 0x02, 0xA0, 0x57, 0x4C, 0x56, 0x24, 0x30, 0xB6, 0x5D, 0x2A, + 0x2E, 0xE4, 0x56, 0x34, 0xFA, 0xA2, 0x98, 0xF0, 0x5D, 0x3E, 0x45, 0xE0, + 0x29, 0x28, 0x24, 0xE4, 0x52, 0x28, 0x5C, 0x3C, 0x5D, 0x2A, 0x62, 0xF0, + 0x04, 0xA1, 0x24, 0xE4, 0x2E, 0xE4, 0x5C, 0x3C, 0xEA, 0xB7, 0x5B, 0x28, + 0x9F, 0x09, 0x1E, 0xE4, 0x5C, 0x3C, 0x52, 0x28, 0x08, 0xA2, 0xD0, 0x02, + 0x67, 0xE1, 0x2E, 0xE4, 0x5A, 0x3C, 0xFA, 0xA2, 0x17, 0x3D, 0x1F, 0xC7, + 0x00, 0xA2, 0x53, 0x3C, 0xFE, 0xA2, 0x5B, 0x3C, 0x56, 0x3C, 0x57, 0x3C, + 0x59, 0x3C, 0x58, 0x3C, 0x24, 0xE4, 0x2E, 0xE4, 0x5D, 0x3C, 0x02, 0xA2, + 0x00, 0xE0, 0x23, 0xE4, 0x51, 0x1A, 0x49, 0xE0, 0x08, 0xA8, 0x07, 0x29, + 0x9E, 0xE0, 0xD0, 0x02, 0xD0, 0x02, 0x00, 0xE0, 0x2E, 0xE4, 0x07, 0x3D, + 0x07, 0x3D, 0x02, 0xA8, 0x07, 0x29, 0x9E, 0xE0, 0x9E, 0xE0, 0xD0, 0x02, + 0x00, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x07, 0x3D, 0x07, 0x4D, 0x08, 0xA2, + 0x0A, 0xF2, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x4A, 0xF0, 0x02, 0xA1, + 0x2A, 0xE4, 0x02, 0xA1, 0xC0, 0xE0, 0x2E, 0xE4, 0x4A, 0xF2, 0x02, 0xA1, + 0x02, 0xAF, 0x71, 0x30, 0x08, 0xAF, 0x60, 0x00, 0x1E, 0xA8, 0x60, 0x00, + 0xC0, 0xE0, 0x72, 0x30, 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x70, 0x3C, + 0x09, 0xA8, 0x65, 0x00, 0xC1, 0xE0, 0x74, 0x3C, 0x06, 0xA8, 0x06, 0xAF, + 0x65, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, 0x60, 0x3C, 0x32, 0xB6, + 0xC0, 0xE0, 0xB1, 0x3C, 0xB0, 0x34, 0x60, 0x00, 0xB3, 0x3C, 0xB2, 0x34, + 0x14, 0xAE, 0x61, 0x00, 0x59, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, + 0x02, 0xA1, 0x2F, 0x0A, 0x0A, 0xE4, 0x02, 0xA1, 0x02, 0xA1, 0x5A, 0xF0, + 0x02, 0xA1, 0x2A, 0xE4, 0x22, 0x20, 0x2E, 0xE4, 0x59, 0x0A, 0x0A, 0xE4, + 0x56, 0x24, 0x6F, 0x00, 0xC2, 0xE0, 0x23, 0x4C, 0x5C, 0x28, 0x70, 0x00, + 0xC2, 0xE0, 0x57, 0x4C, 0x4B, 0x4C, 0x4A, 0x24, 0x71, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0x29, 0x28, 0x72, 0x00, 0xC2, 0xE0, 0x74, 0x00, 0xC2, 0xE0, + 0x00, 0xA2, 0x73, 0x00, 0x56, 0xE0, 0x29, 0xAE, 0x62, 0x2A, 0x1F, 0x28, + 0xC1, 0x2A, 0x52, 0x28, 0x76, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, 0x77, 0x00, + 0xC2, 0xE0, 0xD2, 0xB7, 0x79, 0x00, 0xC2, 0xE0, 0x78, 0x00, 0xC2, 0xE0, + 0x32, 0x28, 0x7A, 0x00, 0xC2, 0xE0, 0x2F, 0x28, 0xC2, 0xE0, 0xFE, 0xA2, + 0x7B, 0x00, 0xC2, 0xE0, 0x7E, 0x00, 0xC2, 0xE0, 0x11, 0x28, 0x7C, 0x00, + 0x4A, 0xC8, 0x7D, 0x00, 0xC2, 0xE0, 0x12, 0x28, 0xC2, 0xE0, 0x56, 0xE0, + 0x20, 0xAE, 0x4D, 0xC8, 0x02, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x53, 0x00, + 0xC2, 0xE0, 0xFE, 0xA2, 0x74, 0x00, 0xC2, 0xE0, 0x1F, 0x28, 0x77, 0x00, + 0xC2, 0xE0, 0x76, 0x00, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x16, 0xE0, + 0x12, 0x28, 0x7A, 0x00, 0xC2, 0xE0, 0x11, 0x28, 0xC2, 0xE0, 0xFE, 0xA2, + 0x79, 0x00, 0xC2, 0xE0, 0x08, 0xA2, 0x6D, 0x00, 0xC2, 0xE0, 0x72, 0x00, + 0x14, 0x4C, 0x13, 0x20, 0x73, 0x00, 0xC2, 0xE0, 0x16, 0x4C, 0x15, 0x20, + 0x71, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x56, 0xE0, 0x2F, 0xAE, 0x1D, 0x2A, + 0x70, 0x00, 0xC2, 0xE0, 0x1F, 0x28, 0x7B, 0x00, 0x41, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0x20, 0x00, 0x05, 0xE0, + 0x1E, 0xE4, 0x2E, 0xE4, 0x77, 0x0A, 0x1E, 0xE4, 0x66, 0xE1, 0x00, 0x07, + 0x67, 0xE1, 0x4C, 0x01, 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0x64, 0x00, + 0x17, 0x3D, 0x17, 0x35, 0x16, 0x9E, 0x6F, 0x0A, 0x08, 0xE0, 0x50, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA0, 0x2E, 0xE4, 0xC8, 0x3C, 0x7F, 0x00, + 0x1E, 0xE4, 0x2E, 0xE4, 0x06, 0xAE, 0x06, 0xAF, 0x1E, 0xE4, 0x22, 0x0B, + 0x1E, 0xE4, 0x7F, 0x0B, 0x02, 0xA2, 0xA6, 0x0A, 0x1E, 0xE4, 0x7B, 0x02, + 0x03, 0xA2, 0xF4, 0xF1, 0x52, 0x28, 0x2E, 0xE4, 0x88, 0xC7, 0xA4, 0xCC, + 0x0D, 0x04, 0xC3, 0xE0, 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, 0x19, 0xE0, + 0xDB, 0xF7, 0x03, 0xA8, 0x20, 0x04, 0xC1, 0xE0, 0x04, 0xAF, 0xF3, 0x0A, + 0x1E, 0xE4, 0x00, 0xA2, 0x50, 0x2E, 0x20, 0xAE, 0xFC, 0x0A, 0x1E, 0xE4, + 0x41, 0x4C, 0x40, 0x20, 0x17, 0x9F, 0x56, 0xE0, 0xC3, 0xE0, 0x01, 0xA2, + 0x17, 0x9F, 0x08, 0xAE, 0xC8, 0x2A, 0x00, 0xA2, 0x2E, 0xE4, 0x0D, 0x04, + 0x02, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0x03, 0xA8, 0x12, 0xA9, 0x2B, 0xF0, + 0x05, 0xA8, 0xC8, 0x2A, 0x40, 0xA9, 0x2B, 0xF0, 0x09, 0xA8, 0xC8, 0x2A, + 0x80, 0xA9, 0x2B, 0xF0, 0x11, 0xA8, 0xC8, 0x2A, 0x1E, 0xE4, 0x2E, 0xE4, + 0x0C, 0x04, 0xC2, 0xE0, 0x07, 0xAE, 0x17, 0xE0, 0x1D, 0x2A, 0xF3, 0x0A, + 0x0A, 0xAE, 0xEA, 0x0A, 0x1E, 0xE4, 0x55, 0xE0, 0x2E, 0xE4, 0x02, 0x01, + 0xC2, 0xE0, 0x56, 0xE0, 0x1D, 0x2A, 0xF3, 0x0A, 0x1E, 0xE4, 0x92, 0xE0, + 0x1E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, 0x17, 0xE0, 0x83, 0xE0, 0x56, 0xE0, + 0x06, 0xAE, 0xEA, 0x0A, 0x13, 0x02, 0xC2, 0xE0, 0x56, 0xE0, 0x0F, 0xAE, + 0xF3, 0x0A, 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, + 0x17, 0xE0, 0x1D, 0x2A, 0x56, 0xE0, 0x06, 0xAE, 0xEA, 0x0A, 0x1E, 0xE4, + 0xC2, 0xE0, 0x56, 0xE0, 0x0F, 0xAE, 0x83, 0xE0, 0x44, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x15, 0x02, 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, 0x06, 0xAF, + 0xC0, 0xE0, 0x58, 0xF0, 0x80, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x0E, 0xA8, 0x44, 0x00, 0x2E, 0xE4, 0x0E, 0xA8, 0x20, 0xAF, 0x60, 0x00, + 0x03, 0xAE, 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, + 0x08, 0xE0, 0x56, 0xE0, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, + 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, + 0x05, 0xA1, 0x07, 0xA8, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, + 0x2E, 0xE4, 0x07, 0xA8, 0x23, 0xAF, 0x44, 0x00, 0x07, 0xA8, 0x23, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, 0x05, 0xA1, + 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x01, 0xA2, 0xC0, 0xE0, 0x28, 0xE4, + 0x02, 0xA8, 0x20, 0xAF, 0xC0, 0xE0, 0x2A, 0xE4, 0x60, 0xA8, 0x60, 0x00, + 0x88, 0xC7, 0xA4, 0xCC, 0x3E, 0xA8, 0x61, 0x00, 0x9E, 0xE0, 0x00, 0x05, + 0x00, 0xE0, 0x18, 0xE0, 0xC0, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, 0x02, 0xA2, + 0x1E, 0xE4, 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, 0xFC, 0x0A, 0x1E, 0xE4, + 0x04, 0xAF, 0xEF, 0x0A, 0x49, 0x0B, 0x0B, 0xE4, 0x04, 0x0B, 0x1E, 0xE4, + 0x09, 0xAE, 0x09, 0x0B, 0x1E, 0xE4, 0x1E, 0xA8, 0x6E, 0x00, 0xC1, 0xE0, + 0x20, 0xAE, 0x56, 0xE0, 0x17, 0x9F, 0x56, 0xE0, 0xFF, 0x1F, 0x09, 0xE0, + 0x64, 0xE1, 0x17, 0x9F, 0xC8, 0x0B, 0x1E, 0xE4, 0x84, 0xE1, 0x02, 0x00, + 0x22, 0xD0, 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x5A, 0x0B, + 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, 0x01, 0xA2, 0x17, 0x9F, + 0x14, 0x9E, 0x62, 0x0B, 0xEC, 0x3C, 0x2E, 0xE4, 0x0D, 0x04, 0xC3, 0xE0, + 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x7B, 0x3E, 0x7B, 0x08, 0x42, 0xE0, + 0x11, 0xAE, 0x20, 0x00, 0x00, 0xE0, 0x5E, 0xF8, 0x00, 0x02, 0x11, 0xD1, + 0x20, 0xCE, 0x40, 0x0B, 0x11, 0xD1, 0x80, 0x01, 0x13, 0x01, 0xEC, 0x88, + 0xC0, 0x00, 0x12, 0xD1, 0x06, 0xA2, 0x2E, 0xE4, 0xF9, 0xF7, 0x29, 0xCA, + 0x50, 0x28, 0x67, 0x0B, 0x1E, 0xE4, 0x01, 0xA2, 0x24, 0xE4, 0x02, 0xA1, + 0x51, 0x28, 0x94, 0xE0, 0x1E, 0xE4, 0x0C, 0xC4, 0x49, 0xE0, 0x92, 0xE0, + 0x50, 0x2A, 0x8E, 0xF7, 0x82, 0xE0, 0x9E, 0x0B, 0x23, 0xA8, 0x60, 0x00, + 0xC1, 0xE0, 0x95, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0x49, 0xF0, 0x23, 0xA1, + 0x1E, 0xE4, 0x04, 0xC4, 0x51, 0x2A, 0x95, 0xE0, 0x86, 0xC7, 0xA4, 0xCC, + 0x2E, 0xE4, 0x9E, 0x0B, 0x9A, 0xE0, 0x00, 0x02, 0x00, 0xE0, 0x18, 0xE0, + 0x07, 0xAE, 0x9C, 0xE0, 0x40, 0x09, 0x00, 0xE0, 0x1E, 0xE4, 0x9F, 0xE0, + 0x00, 0x05, 0x01, 0xE0, 0xFC, 0x0A, 0x1E, 0xE4, 0x04, 0xAF, 0xF3, 0x0A, + 0x1E, 0xE4, 0x1E, 0xA8, 0x69, 0xF0, 0x89, 0xE0, 0x20, 0xAE, 0x56, 0xE0, + 0x09, 0xAE, 0x18, 0x0B, 0x1E, 0xE4, 0x17, 0x9F, 0x42, 0xE0, 0x85, 0xE0, + 0xC8, 0x0B, 0x1B, 0xE4, 0x89, 0xE0, 0xC4, 0x0B, 0x2E, 0xE4, 0xD3, 0x0B, + 0x1E, 0xE4, 0x17, 0x9F, 0x2E, 0xE4, 0x08, 0xAE, 0x41, 0x4C, 0x40, 0x20, + 0x60, 0x00, 0xC1, 0xE0, 0x41, 0x4C, 0x40, 0x20, 0x41, 0x20, 0x39, 0xF0, + 0x23, 0xA1, 0x23, 0xA8, 0x02, 0xA2, 0x2E, 0xE4, 0x08, 0xAE, 0x40, 0x4C, + 0x0E, 0x04, 0xC2, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, 0xDA, 0xF7, 0x02, 0xA8, + 0x20, 0x04, 0xC0, 0xE0, 0xE2, 0x0B, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, + 0x22, 0xD0, 0x17, 0x9F, 0x15, 0x4D, 0x15, 0x21, 0x16, 0x21, 0xE9, 0x0B, + 0x84, 0xE1, 0x02, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x17, 0x9F, 0x16, 0x4D, + 0x73, 0x3C, 0x5F, 0x28, 0x2E, 0xE4, 0x0D, 0x04, 0x71, 0x3C, 0x00, 0xA2, + 0x32, 0xF0, 0x73, 0x28, 0x40, 0x28, 0x79, 0x3C, 0x78, 0x3C, 0x00, 0xA2, + 0x71, 0x28, 0x77, 0x3C, 0x41, 0x28, 0x76, 0x3C, 0x73, 0x28, 0x24, 0xE4, + 0x73, 0x28, 0x2A, 0xE4, 0xC2, 0xE0, 0x74, 0x28, 0x43, 0x01, 0xC2, 0xE0, + 0x49, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x44, 0x01, 0x77, 0x4C, 0x20, 0xAE, + 0x02, 0xA1, 0x76, 0x28, 0x1E, 0xE4, 0x42, 0x01, 0xC2, 0xE0, 0x02, 0xA1, + 0x42, 0xE0, 0x70, 0x2A, 0x20, 0xAE, 0xEF, 0x0A, 0x73, 0x28, 0x2E, 0xE4, + 0x4E, 0x01, 0xC2, 0xE0, 0x78, 0x28, 0x23, 0xE4, 0x77, 0x1A, 0x79, 0x2A, + 0x15, 0xB6, 0x03, 0xA2, 0x79, 0x4C, 0x10, 0xAE, 0x03, 0xA9, 0x03, 0xAE, + 0x7A, 0x2A, 0x7A, 0x3E, 0x4B, 0x01, 0xC1, 0xE0, 0x56, 0xE0, 0x21, 0xAE, + 0x02, 0xA2, 0x4D, 0x01, 0xC2, 0xE0, 0xE9, 0xF7, 0x03, 0xA0, 0x78, 0x2A, + 0x4A, 0x01, 0xC2, 0xE0, 0x79, 0x2A, 0x65, 0xF0, 0x76, 0x1A, 0x78, 0x3E, + 0x78, 0x3E, 0x01, 0xA2, 0x79, 0x3E, 0x03, 0xA0, 0x79, 0x28, 0x4A, 0xF1, + 0x71, 0x28, 0x2E, 0xE4, 0xCE, 0xF7, 0x9E, 0xFD, 0x32, 0xF0, 0x77, 0x18, + 0x04, 0xA2, 0xE8, 0xF7, 0x4B, 0x01, 0xC0, 0xE0, 0x02, 0xA2, 0x4D, 0x01, + 0xC2, 0xE0, 0x20, 0xAE, 0xC0, 0xE0, 0x90, 0xE1, 0x4A, 0x01, 0xC2, 0xE0, + 0x73, 0x3C, 0x5C, 0x28, 0xE8, 0xF7, 0x4B, 0x01, 0x2E, 0xE4, 0x2E, 0xE4, + 0x2E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, + 0x0A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x85, 0x0C, 0x0A, 0xE4, + 0x02, 0xA1, 0x65, 0x0C, 0x0E, 0xE4, 0x6B, 0x0C, 0x0A, 0xE4, 0x02, 0xA1, + 0xB2, 0x04, 0xB1, 0x4C, 0xB0, 0x24, 0x85, 0x0C, 0x06, 0xA2, 0xB5, 0x3C, + 0xB4, 0x34, 0xB3, 0x0C, 0x00, 0x06, 0x60, 0xD1, 0xC0, 0xCE, 0x1E, 0xAE, + 0x51, 0x00, 0xC2, 0xE0, 0x48, 0x00, 0xC0, 0xE0, 0x08, 0xE0, 0xB6, 0x34, + 0xBB, 0x3C, 0xBA, 0x34, 0x08, 0xE0, 0xBB, 0x2C, 0xB7, 0x3C, 0x00, 0xFE, + 0xB0, 0x0D, 0x1E, 0xE4, 0xBC, 0x3C, 0xFF, 0x01, 0x1E, 0xE4, 0xCD, 0x0C, + 0x1E, 0xE4, 0x7D, 0xF0, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0xB8, 0x0C, + 0x8D, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0x6A, 0xE1, 0x04, 0xE0, 0xF8, 0xF7, + 0x28, 0xCA, 0x70, 0xE4, 0x0E, 0xAE, 0xBF, 0x28, 0x24, 0xCE, 0x80, 0x00, + 0x20, 0xCE, 0xB7, 0x4C, 0xB6, 0x24, 0x22, 0xCE, 0x02, 0xAE, 0x06, 0xA8, + 0x43, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x26, 0xCE, 0x22, 0xA0, + 0x00, 0x02, 0x00, 0xE0, 0xB7, 0x4C, 0xB6, 0x24, 0xB5, 0x1C, 0xB4, 0x14, + 0xB7, 0x3C, 0xB6, 0x34, 0xB6, 0x34, 0xB1, 0x4C, 0xB0, 0x24, 0x54, 0xF0, + 0xBF, 0x28, 0x00, 0x00, 0x4C, 0xD0, 0xB7, 0x3C, 0x16, 0xE0, 0xBF, 0x28, + 0x6E, 0xCC, 0x0E, 0xAE, 0x2E, 0xE4, 0xC1, 0x28, 0x2E, 0xE4, 0xBF, 0x3C, + 0x1E, 0xE4, 0x92, 0xCE, 0xBF, 0x3C, 0x00, 0xA2, 0x28, 0xE1, 0x8D, 0x0C, + 0x1E, 0xE4, 0x8D, 0x0C, 0xBC, 0x2C, 0x81, 0xE1, 0x20, 0x20, 0x71, 0xD0, + 0x84, 0xE1, 0x44, 0xCC, 0x74, 0xF0, 0x02, 0xA1, 0x90, 0xE1, 0x90, 0xE1, + 0x4E, 0xBA, 0xCA, 0x0C, 0x20, 0xAE, 0x95, 0x14, 0x04, 0xE0, 0x2E, 0xE4, + 0x34, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x9E, 0xCC, 0x35, 0xD0, 0x00, 0x00, + 0x33, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0xFF, 0x00, 0x36, 0xD0, 0x00, 0x00, + 0x39, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, 0x4C, 0xD0, 0x01, 0x00, + 0x4B, 0xD0, 0x00, 0x00, 0x47, 0xD0, 0x00, 0x00, 0x46, 0xD0, 0x00, 0x00, + 0x2E, 0xE4, 0x00, 0x00, 0x49, 0xD1, 0x00, 0x00, 0x0A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x02, 0xA1, 0x2A, 0xE4, 0x02, 0xA1, 0xF7, 0x0C, + 0xC5, 0x24, 0x2A, 0xE4, 0xF7, 0x0C, 0x0A, 0xE4, 0xBA, 0x34, 0xBB, 0x0C, + 0xBA, 0x04, 0xC6, 0x4C, 0x74, 0xF0, 0xB5, 0x1C, 0xB4, 0x14, 0xBB, 0x3C, + 0xB3, 0x1C, 0xB2, 0x14, 0xBB, 0x4C, 0xBA, 0x24, 0xBB, 0x4C, 0xBA, 0x24, + 0xBB, 0x3C, 0xBA, 0x34, 0x52, 0x00, 0xC2, 0xE0, 0x48, 0x00, 0xC2, 0xE0, + 0xC6, 0x3C, 0xC5, 0x34, 0x00, 0xA2, 0x2E, 0xE4, 0x08, 0xE0, 0x11, 0x29, + 0xA8, 0xF0, 0x2E, 0xE4, 0x09, 0xE0, 0x11, 0x2B, 0x20, 0xAE, 0xFF, 0xFF, + 0x11, 0x29, 0xFE, 0xF0, 0x42, 0xE0, 0xFF, 0xFF, 0x11, 0x2B, 0x20, 0xAE, + 0xFF, 0x00, 0x08, 0xE0, 0x10, 0xAE, 0x42, 0xE0, 0xFF, 0xFF, 0x09, 0xE0, + 0x11, 0xAF, 0x00, 0xFF, 0x09, 0xE0, 0x11, 0x2B, 0x49, 0xE0, 0x2B, 0xE4, + 0xC7, 0x2A, 0x42, 0xE0, 0x93, 0xE0, 0xFF, 0x00, 0x09, 0xE0, 0x31, 0xAF, + 0xFF, 0x00, 0x09, 0xE0, 0x21, 0xAF, 0x49, 0xE0, 0x09, 0xE0, 0x11, 0xAF, + 0x49, 0xE0, 0x95, 0xE0, 0x10, 0xAE, 0xFF, 0x00, 0x08, 0xE0, 0xFF, 0x00, + 0x56, 0xE0, 0x85, 0xE0, 0x10, 0xAE, 0x56, 0xE0, 0x2E, 0xE4, 0x56, 0xE0, + 0x83, 0xE0, 0x10, 0xAE, 0x2E, 0xE4, 0x46, 0xE0, 0x0F, 0xA8, 0x49, 0xE0, + 0x00, 0x06, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x45, 0xE0, 0xB5, 0x4E, + 0xB4, 0x26, 0x20, 0xCE, 0x03, 0xAF, 0x65, 0xE0, 0x40, 0x00, 0x04, 0xE0, + 0x66, 0x0D, 0x1E, 0xE4, 0xC0, 0x3E, 0x25, 0xCE, 0x24, 0xCE, 0x26, 0xE4, + 0xC0, 0x18, 0x40, 0xA2, 0x22, 0xCE, 0x00, 0x06, 0x00, 0xE0, 0xC0, 0x28, + 0x1E, 0xE4, 0x20, 0xCE, 0xB1, 0x4C, 0xB0, 0x24, 0x43, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x66, 0x0D, 0x26, 0xCE, 0x02, 0xA0, 0x02, 0xAE, 0x06, 0xA8, + 0xC9, 0x34, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0xC0, 0xE0, 0xBD, 0x3C, + 0x00, 0xA2, 0xCA, 0x3C, 0xC0, 0xE0, 0xCC, 0x3C, 0xCB, 0x34, 0x49, 0x00, + 0xC0, 0xE0, 0xBE, 0x30, 0x04, 0xAF, 0x45, 0x00, 0xCB, 0x10, 0xB9, 0x3C, + 0xB8, 0x34, 0x49, 0x00, 0xBD, 0x3E, 0x11, 0xB6, 0xBD, 0x2A, 0xCC, 0x1C, + 0xCA, 0x1E, 0xC9, 0x16, 0xB9, 0x4E, 0xB8, 0x26, 0xC3, 0x16, 0xB3, 0x0E, + 0xB2, 0x06, 0x33, 0xF0, 0xBE, 0x28, 0xC3, 0xF1, 0x00, 0xA2, 0xC4, 0x1E, + 0x1B, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0xC1, 0x3C, 0xBD, 0x28, 0x48, 0xF1, + 0x52, 0xE0, 0x17, 0xE0, 0xC0, 0xE0, 0xCA, 0x01, 0x1E, 0xE4, 0xF8, 0xF5, + 0x8A, 0xF5, 0x00, 0x40, 0x08, 0xE0, 0x5C, 0x00, 0x00, 0x40, 0x0A, 0xE0, + 0x5D, 0x00, 0xC0, 0xE0, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, 0xC2, 0xE0, + 0x5D, 0x00, 0xC1, 0xE0, 0xEE, 0xF4, 0xBD, 0x3C, 0x2E, 0xE4, 0xC9, 0xF7, + 0x00, 0x40, 0x09, 0xE0, 0x0A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x02, 0xA1, 0x2A, 0xE4, 0x02, 0xA1, 0xBB, 0x0D, 0x00, 0xA2, 0x2E, 0xE4, + 0xE5, 0x0D, 0x0A, 0xE4, 0xC4, 0x3C, 0xC3, 0x34, 0x44, 0xA2, 0xC7, 0x3C, + 0x00, 0x00, 0x27, 0xD0, 0xBB, 0x4C, 0xBA, 0x24, 0x01, 0x00, 0x27, 0xD0, + 0x6F, 0x0D, 0x1E, 0xE4, 0xBB, 0x4C, 0xBA, 0x24, 0xE3, 0x0D, 0x08, 0xE4, + 0x1E, 0xE4, 0x95, 0xE0, 0x44, 0x0D, 0x1E, 0xE4, 0x00, 0xE0, 0x02, 0xAF, + 0x84, 0xE0, 0x48, 0x0D, 0x02, 0xA8, 0x84, 0xE0, 0x92, 0xE0, 0x00, 0x06, + 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0x0D, 0x1E, 0xE4, 0x34, 0xF0, 0x44, 0xA1, + 0xC6, 0x3C, 0xC5, 0x34, 0x02, 0xA2, 0x6B, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, + 0xC4, 0x3C, 0xC3, 0x34, 0x28, 0xA2, 0x2E, 0xE4, 0x00, 0x00, 0x27, 0xD0, + 0xBB, 0x4C, 0xBA, 0x24, 0x01, 0x00, 0x27, 0xD0, 0x6F, 0x0D, 0x1E, 0xE4, + 0xBB, 0x4C, 0xBA, 0x24, 0x30, 0x0E, 0x08, 0xE4, 0x1E, 0xE4, 0x95, 0xE0, + 0x44, 0x0D, 0x1E, 0xE4, 0x00, 0xE0, 0x02, 0xAF, 0x84, 0xE0, 0x48, 0x0D, + 0x3E, 0x0E, 0x1E, 0xE4, 0x92, 0xE0, 0x00, 0x06, 0x11, 0x0D, 0x1E, 0xE4, + 0x02, 0xA8, 0x84, 0xE0, 0xC6, 0x3C, 0xC5, 0x34, 0xC6, 0x0C, 0xC5, 0x00, + 0x46, 0xE0, 0xB3, 0x4E, 0xB2, 0x26, 0x86, 0xF2, 0x1B, 0x00, 0x20, 0xA0, + 0x84, 0xE0, 0x42, 0xF2, 0x00, 0x06, 0x00, 0xE0, 0x02, 0xAF, 0x1C, 0x0C, + 0x1E, 0xE4, 0x02, 0xA8, 0x84, 0xE0, 0x92, 0xE0, 0x24, 0x28, 0x54, 0xF1, + 0x24, 0x3C, 0x11, 0x0D, 0xC6, 0x0C, 0xC5, 0x04, 0x28, 0xA0, 0x06, 0xAE, + 0xC4, 0x3C, 0xC3, 0x34, 0xC6, 0x3C, 0xC5, 0x34, 0x00, 0x00, 0x27, 0xD0, + 0xBB, 0x4C, 0xBA, 0x24, 0x01, 0x00, 0x27, 0xD0, 0x6F, 0x0D, 0x1E, 0xE4, + 0x6B, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, 0x48, 0xF0, 0x48, 0x00, 0xC1, 0xE0, + 0x49, 0x00, 0xC0, 0xE0, 0xB3, 0x0C, 0xB2, 0x04, 0x32, 0xF0, 0x46, 0xE0, + 0xEC, 0x0C, 0x1E, 0xE4, 0xC6, 0x3C, 0xC5, 0x34, 0x11, 0x4D, 0x11, 0x21, + 0x2E, 0xE4, 0x02, 0xA2, 0x11, 0x4D, 0x11, 0x21, 0x1C, 0x3C, 0x1B, 0x34, + 0x05, 0xE0, 0x29, 0x81, 0x04, 0x00, 0x60, 0xE1, 0x4F, 0x44, 0x0B, 0xE0, + 0x21, 0xAE, 0x49, 0x56, 0x1A, 0x3C, 0x00, 0xA2, 0x8A, 0xF0, 0x46, 0xE0, + 0xC6, 0x3C, 0xC5, 0x34, 0x1C, 0x3C, 0x1B, 0x34, 0xC5, 0x36, 0x1C, 0x4E, + 0x1B, 0x22, 0x2E, 0xE4, 0x42, 0xE0, 0x82, 0xE0, 0x03, 0xAF, 0xC6, 0x3E, + 0x2E, 0xE4, 0x1A, 0x3C, 0x02, 0xA2, 0x92, 0xE0, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0xE4, + 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x77, 0x03, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x91, 0x03, 0x0E, 0xE4, 0x78, 0x00, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, + 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, 0x9A, 0xF0, 0x4A, 0x00, + 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, 0x00, 0xA2, 0xED, 0x3C, + 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0xC2, 0xE0, + 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0x5D, 0x00, 0xC3, 0xE0, + 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, 0x2A, 0x24, 0x71, 0xD0, + 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, 0x1E, 0xE4, 0x81, 0xE1, + 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, 0x59, 0x00, 0xC0, 0xE0, + 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x77, 0x03, 0x00, 0xE0, 0x02, 0xAE, + 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, 0xC0, 0xE0, 0xEE, 0x3C, + 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, 0xC1, 0xE0, 0x5B, 0x00, + 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, 0x1E, 0xE4, 0x2A, 0xE4, + 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, 0x9E, 0xE0, 0x42, 0x01, + 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0xED, 0x5A, 0x03, 0xA2, + 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0xC2, 0xE0, 0x58, 0x00, + 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, 0x0E, 0xF0, 0x08, 0x00, + 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x98, 0xF1, + 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, 0x03, 0x00, 0x04, 0xE0, + 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, 0x0A, 0xE0, 0x20, 0xAE, + 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, 0x02, 0xA2, 0x4E, 0xF6, + 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, 0x03, 0xA1, 0x3E, 0xA2, + 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, 0x4E, 0xA2, 0x5B, 0xF3, + 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, 0x40, 0x00, 0x04, 0xE0, + 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, 0x8B, 0xF2, 0x03, 0xA1, + 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, 0xC1, 0xE0, 0x00, 0xA2, + 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, 0xCB, 0xF1, 0x5E, 0x00, + 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, 0x46, 0x00, 0x04, 0xE0, + 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, + 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, 0x04, 0xE0, 0x7B, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA1, 0x68, 0x00, + 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, 0x00, 0x00, 0x11, 0xD1, + 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, + 0x4F, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, 0x2A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0xC0, 0xE0, + 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x31, 0x01, + 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, 0x97, 0x03, 0x04, 0xE0, + 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0x04, 0xE0, 0x2E, 0xE4, + 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, 0x7C, 0xE6, 0x99, 0x03, + 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, 0x11, 0x3D, 0x09, 0x0B, + 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, + 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x00, + 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, 0xEC, 0x88, 0x00, 0x0C, + 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xEF, 0x01, 0x07, 0xA1, 0xD6, 0xB6, + 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, 0x00, 0xE0, 0x36, 0xB6, + 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x14, 0x04, + 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, 0x44, 0x00, 0xC1, 0xE0, + 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, + 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, 0x17, 0x35, 0x56, 0xE0, + 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, 0x50, 0x01, 0xC2, 0xE0, + 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, + 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, 0x1A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x86, 0x01, + 0x47, 0x00, 0xC0, 0xE0, 0x90, 0x01, 0x1A, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, + 0x48, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x3E, 0xA2, 0x2E, 0xE4, 0x4A, 0x00, + 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x02, 0xA2, 0x2E, 0xE4, 0x70, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0x00, 0xA2, 0x76, 0x00, 0xC2, 0xE0, 0x20, 0xA2, + 0xC2, 0xE0, 0xFC, 0xA2, 0x72, 0x00, 0xC2, 0xE0, 0x71, 0x00, 0xC2, 0xE0, + 0xFA, 0xA2, 0x77, 0x00, 0x84, 0xE1, 0x0F, 0x27, 0x22, 0xD0, 0x2E, 0xE4, + 0x58, 0xF0, 0x4A, 0x00, 0xC0, 0xE0, 0xAB, 0x01, 0x18, 0xF0, 0x30, 0xAF, + 0x72, 0x00, 0xC0, 0xE0, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x11, 0x00, 0x04, 0xE0, + 0x9D, 0x01, 0x1E, 0xE4, 0x1E, 0xE4, 0x2E, 0xE4, 0x3C, 0x04, 0xC2, 0xE0, + 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0xB0, 0x01, 0xC2, 0xE0, 0xE0, 0x01, + 0x04, 0xE0, 0xD8, 0xF7, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x09, 0x00, + 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, + 0x3C, 0x04, 0xC2, 0xE0, 0x04, 0xA1, 0x0E, 0xA8, 0x04, 0xAF, 0x45, 0x00, + 0x4A, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x28, 0xE4, 0x8E, 0xF9, 0xE8, 0xF7, + 0x11, 0x01, 0xC0, 0xE0, 0x1E, 0xE4, 0xE8, 0xF7, 0x02, 0xA8, 0x48, 0xCA, + 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0xB0, 0x01, 0xC2, 0xE0, 0xF8, 0x01, + 0x04, 0xE0, 0xD8, 0xF7, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x09, 0x00, + 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, 0xC0, 0xE0, 0x28, 0xCA, 0x2E, 0xE4, + 0x3C, 0x04, 0xC2, 0xE0, 0x43, 0x34, 0x01, 0xC0, 0x2E, 0xE4, 0xF8, 0xF7, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x42, 0x3C, 0x2A, 0xE4, 0x00, 0xC0, + 0x42, 0x2E, 0x43, 0x2C, 0x10, 0xAF, 0x4A, 0xE0, 0xB4, 0xF0, 0x47, 0x1C, + 0xFF, 0x00, 0x09, 0xE0, 0x74, 0xF0, 0x44, 0x18, 0x2E, 0xE4, 0x02, 0xA2, + 0x34, 0xF0, 0x45, 0x1A, 0x5D, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, 0xFE, 0xA2, + 0xEE, 0xF0, 0x5E, 0x3C, 0x01, 0xC0, 0x1E, 0xF1, 0x01, 0xC0, 0xBE, 0xF0, + 0x5E, 0x28, 0x01, 0xC0, 0x5D, 0x2A, 0x01, 0xC0, 0x8E, 0xF0, 0x5F, 0x3C, + 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, 0x5E, 0x1A, 0xC2, 0xE0, 0x2E, 0xE4, + 0x00, 0xC0, 0x5F, 0x2A, 0x62, 0xE1, 0x0B, 0x08, 0xC3, 0xE0, 0x08, 0x08, + 0x00, 0xA2, 0x12, 0x9F, 0x02, 0xA2, 0x02, 0x08, 0x00, 0x02, 0x05, 0xE0, + 0x12, 0x9F, 0x12, 0x9F, 0x12, 0x81, 0x12, 0x9F, 0x12, 0x9F, 0x92, 0x9F, + 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x82, 0xE0, 0x00, 0x08, 0xC2, 0xE0, + 0x02, 0xA2, 0x12, 0x81, 0x2E, 0xE4, 0xE8, 0xF7, 0x00, 0x08, 0xC0, 0xE0, + 0x20, 0x06, 0x60, 0xD1, 0x4F, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xC0, 0xCE, + 0x18, 0xAE, 0x32, 0xA2, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, 0x40, 0xCE, + 0x48, 0xCA, 0x80, 0x00, 0x23, 0xD1, 0x02, 0x00, 0x04, 0xA2, 0x2E, 0xE4, + 0xE8, 0xF7, 0x02, 0xA8, 0x72, 0xCC, 0x00, 0xA2, 0x9E, 0xCC, 0x22, 0xAE, + 0x10, 0xA8, 0x04, 0xE0, 0x8E, 0xCC, 0x8C, 0xCC, 0x4A, 0xCE, 0x22, 0x93, + 0x0A, 0xE0, 0x20, 0xAE, 0x90, 0xE1, 0x90, 0xE1, 0x03, 0x00, 0x6F, 0xD1, + 0x2E, 0xE4, 0x00, 0x00, 0x6F, 0xD1, 0x90, 0xE1, 0x02, 0xA8, 0x50, 0xCA, + 0x50, 0xCE, 0x60, 0xA2, 0x04, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0xEA, 0xF7, + 0x00, 0xA2, 0x2E, 0xE4, 0x50, 0xCE, 0x20, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0x1C, 0x04, 0xC2, 0xE0, 0x0A, 0xE0, 0xD9, 0xF7, 0xEF, 0xA1, 0x3D, 0x04, + 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0x00, 0x01, 0xC0, 0xE0, 0x2A, 0xE4, + 0xC3, 0x02, 0x1E, 0xE4, 0x1E, 0xE4, 0x1F, 0x00, 0x08, 0xE0, 0x61, 0x00, + 0x1E, 0xE4, 0xFE, 0x02, 0x1E, 0xE4, 0x73, 0x02, 0x1E, 0x04, 0xC2, 0xE0, + 0x12, 0xAE, 0x38, 0x03, 0x1E, 0xE4, 0x2E, 0xE4, 0x28, 0x03, 0x1E, 0xE4, + 0x10, 0x02, 0xC0, 0xE0, 0x2A, 0xE4, 0xE9, 0x02, 0x15, 0x02, 0xC0, 0xE0, + 0x18, 0xF1, 0x04, 0xA8, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, 0x08, 0xE0, + 0x13, 0x02, 0xC0, 0xE0, 0xBE, 0xF0, 0x16, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, + 0x00, 0x01, 0x08, 0xE0, 0x0B, 0x02, 0xC0, 0xE0, 0x3E, 0xF0, 0x14, 0x02, + 0xFE, 0x02, 0x1E, 0xE4, 0x73, 0x02, 0x1E, 0xE4, 0xC1, 0xE0, 0x12, 0xAE, + 0x38, 0x03, 0x1E, 0xE4, 0x56, 0xE0, 0x15, 0xAE, 0x03, 0xA8, 0x10, 0x02, + 0x7F, 0xA8, 0x0B, 0xAF, 0x04, 0x02, 0xC1, 0xE0, 0x04, 0x02, 0xC1, 0xE0, + 0x56, 0xE0, 0x07, 0xAE, 0x1E, 0x04, 0xC2, 0xE0, 0x56, 0xE0, 0x0F, 0xA8, + 0xC0, 0xE0, 0x2E, 0xE4, 0x28, 0x03, 0x1E, 0xE4, 0x1F, 0xAE, 0x03, 0xA2, + 0x92, 0xE0, 0x44, 0x00, 0x60, 0x00, 0xC0, 0xE0, 0xEA, 0xF1, 0x52, 0xE0, + 0x8A, 0xF1, 0x06, 0xA8, 0x08, 0xAF, 0x94, 0xE0, 0x85, 0xE0, 0x16, 0xE0, + 0x1E, 0xA8, 0x84, 0xE0, 0x0A, 0xF1, 0x56, 0xE0, 0x17, 0xE0, 0x21, 0xA8, + 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x1B, 0xAF, 0x44, 0x00, + 0xC1, 0xE0, 0x16, 0xE0, 0x56, 0xE0, 0x03, 0xA8, 0x1B, 0xE0, 0x07, 0xA8, + 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x3A, 0xF0, 0x03, 0xA2, 0x44, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x1E, 0xE4, 0xEA, 0xF0, 0x52, 0xE0, 0x1F, 0xAE, + 0xE4, 0x11, 0x1E, 0xE4, 0xB8, 0xF0, 0xC3, 0x02, 0x12, 0xAF, 0x44, 0x00, + 0xC0, 0xE0, 0x69, 0xF0, 0x2E, 0xE4, 0x02, 0xA2, 0x38, 0xF0, 0x1E, 0xA8, + 0x1C, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, 0x88, 0xC7, 0xA4, 0xCC, + 0xFF, 0x00, 0x08, 0xE0, 0x02, 0xA0, 0x00, 0x05, 0x00, 0xE0, 0x18, 0xE0, + 0x02, 0xA2, 0x1A, 0x04, 0xC2, 0xE0, 0x04, 0xAE, 0x19, 0x04, 0xC0, 0xE0, + 0x18, 0x04, 0xC2, 0xE0, 0x18, 0x04, 0xC2, 0xE0, 0x02, 0xA2, 0xEA, 0xF7, + 0xC0, 0xE0, 0xEA, 0xF7, 0x19, 0x04, 0xC0, 0xE0, 0x08, 0xAF, 0x1E, 0xA0, + 0x20, 0xAF, 0x1B, 0x04, 0x09, 0xE0, 0x1B, 0x04, 0xC1, 0xE0, 0x28, 0xAE, + 0x09, 0xAE, 0x09, 0xAF, 0x1F, 0xA0, 0xFF, 0xFF, 0x2E, 0xE4, 0x1D, 0x04, + 0xC2, 0xE0, 0x56, 0xE0, 0x00, 0x02, 0x0A, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, + 0x02, 0xA1, 0x28, 0xA2, 0x1C, 0x04, 0xC2, 0xE0, 0x0C, 0xE0, 0x1C, 0x04, + 0xC0, 0xE0, 0xF0, 0xF7, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0x00, 0x02, + 0x02, 0xA8, 0x04, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x00, 0xC0, 0x41, 0x3C, + 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x41, 0x2C, 0x01, 0xC0, 0x2E, 0xE4, + 0x5A, 0xF1, 0x41, 0x03, 0x1E, 0xE4, 0x2E, 0xE4, 0x5C, 0x00, 0xC0, 0xE0, + 0x30, 0xF1, 0x41, 0x1C, 0xC0, 0xE0, 0xEA, 0xF0, 0x00, 0x20, 0x08, 0xE0, + 0xC2, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x5D, 0x00, 0x03, 0xA2, 0xE5, 0x09, + 0x1E, 0xE4, 0x5D, 0x00, 0x3D, 0x03, 0x1E, 0xE4, 0x00, 0xA2, 0x01, 0xCE, + 0x24, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x6D, 0x00, 0xC0, 0xE0, + 0xEA, 0xF0, 0x02, 0xA8, 0x45, 0x18, 0xFF, 0x00, 0x08, 0xE0, 0xBA, 0xF0, + 0x00, 0x84, 0x00, 0x3C, 0x45, 0x08, 0x72, 0xF0, 0x1E, 0xE4, 0x0E, 0xA0, + 0x18, 0xE0, 0x44, 0x82, 0x65, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3D, 0x03, + 0x0E, 0xE4, 0x2E, 0xE4, 0x02, 0xA8, 0x24, 0xAF, 0x0E, 0xE4, 0x9B, 0x03, + 0x0E, 0xE4, 0xA4, 0x07, 0x0E, 0xE4, 0xA3, 0x03, 0x0E, 0xE4, 0x9F, 0x03, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xA9, 0x03, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xAD, 0x03, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x1E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0xB1, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xD4, 0x03, + 0x0E, 0xE4, 0xB7, 0x01, 0x1E, 0xE4, 0xD5, 0x03, 0x0E, 0xE4, 0x72, 0x04, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xB8, 0x05, 0x1E, 0xE4, 0x6A, 0x00, + 0x00, 0xA2, 0xB6, 0x3C, 0x00, 0xA2, 0x6A, 0x00, 0xC0, 0x04, 0x1E, 0xE4, + 0x4C, 0xCC, 0x4A, 0xCC, 0xEE, 0x04, 0x1E, 0xE4, 0xE1, 0x05, 0x1E, 0xE4, + 0x39, 0x07, 0x1E, 0xE4, 0x3F, 0x09, 0x1E, 0xE4, 0x1E, 0xE4, 0xAD, 0xF0, + 0x7C, 0x0A, 0x1E, 0xE4, 0x1E, 0xE4, 0x4D, 0x05, 0x1E, 0xE4, 0x62, 0x0A, + 0xB6, 0x3C, 0x02, 0xA2, 0x3A, 0xF0, 0x14, 0x05, 0x23, 0x0A, 0x1E, 0xE4, + 0xFB, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, 0x6A, 0xE1, 0xF5, 0x05, 0x1E, 0xE4, + 0x00, 0xA2, 0xB6, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x1E, 0xE4, 0x3F, 0x09, + 0x1E, 0xE4, 0x35, 0x3C, 0x1E, 0xE4, 0x83, 0x06, 0x1E, 0xE4, 0x6E, 0x06, + 0x1E, 0xE4, 0xE7, 0x13, 0x1E, 0xE4, 0x39, 0x07, 0x1E, 0xE4, 0x7C, 0x12, + 0x1E, 0xE4, 0x06, 0x05, 0x1E, 0xE4, 0xD8, 0x04, 0x1E, 0xE4, 0xF3, 0x11, + 0x33, 0x3C, 0x16, 0xE0, 0x15, 0x28, 0x6F, 0x0F, 0xF5, 0x13, 0x1E, 0xE4, + 0xF5, 0x0B, 0x1E, 0xE4, 0x3E, 0x04, 0x08, 0xE4, 0x82, 0x08, 0x1E, 0xE4, + 0x1D, 0x04, 0x08, 0xE4, 0x34, 0x44, 0x33, 0x28, 0x3E, 0x04, 0x0D, 0xE4, + 0x2E, 0x0B, 0x1E, 0xE4, 0x08, 0xE4, 0x19, 0x28, 0x6B, 0x0A, 0x1E, 0xE4, + 0x14, 0xF7, 0x2A, 0x0F, 0x1E, 0xE4, 0x5F, 0x04, 0x0E, 0xE4, 0x4D, 0x05, + 0x1E, 0xE4, 0x5A, 0xF0, 0x04, 0xE4, 0xF7, 0x01, 0x1E, 0xE4, 0x3E, 0x04, + 0x1E, 0xE4, 0x43, 0x0F, 0x1E, 0xE4, 0x3E, 0x04, 0x1E, 0xE4, 0x3E, 0x04, + 0x0A, 0xE4, 0x3A, 0x05, 0x1E, 0xE4, 0x56, 0x04, 0x04, 0xE4, 0xE5, 0x06, + 0x33, 0x28, 0xA0, 0x0D, 0x1E, 0xE4, 0x00, 0x07, 0x33, 0x28, 0x0E, 0x06, + 0x1A, 0xE4, 0x34, 0x44, 0x33, 0x28, 0x09, 0x07, 0x1A, 0xE4, 0x34, 0x54, + 0x33, 0x28, 0x62, 0x0F, 0x1A, 0xE4, 0x34, 0x54, 0x1A, 0x28, 0x0A, 0xF1, + 0x34, 0x3C, 0x34, 0x54, 0x02, 0xA2, 0xDC, 0x09, 0x1E, 0xE4, 0xAB, 0x3C, + 0x06, 0xAF, 0x45, 0x00, 0xC0, 0xE0, 0x35, 0x3C, 0xC5, 0x05, 0x1A, 0xE4, + 0x04, 0xA1, 0x06, 0xA8, 0x08, 0xE4, 0x33, 0x28, 0xF8, 0x03, 0x0E, 0xE4, + 0x1C, 0x28, 0xC2, 0xCF, 0x02, 0xA2, 0x45, 0x04, 0x1E, 0xE4, 0x40, 0x14, + 0x1E, 0xE4, 0xC8, 0xCF, 0x8A, 0xF0, 0x82, 0x08, 0x1E, 0xE4, 0xF8, 0x10, + 0x1E, 0xE4, 0x5A, 0xF0, 0x99, 0x08, 0x1E, 0xE4, 0x1E, 0xE4, 0xA7, 0x3C, + 0x00, 0xA2, 0x3F, 0x06, 0xA8, 0x3C, 0xA3, 0x28, 0xA3, 0x3C, 0x22, 0x06, + 0x83, 0x06, 0x1E, 0xE4, 0xDC, 0x09, 0x1E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, + 0xFB, 0x08, 0x1E, 0xE4, 0x1E, 0xE4, 0x62, 0x0A, 0x1E, 0xE4, 0xA7, 0x3C, + 0xFC, 0xA2, 0xA8, 0x3C, 0xA3, 0x3C, 0x22, 0x06, 0x1E, 0xE4, 0xEE, 0x13, + 0x1E, 0xE4, 0xA2, 0x3C, 0x1E, 0xE4, 0x83, 0x06, 0x1E, 0xE4, 0xDC, 0x09, + 0x3F, 0x09, 0x1E, 0xE4, 0x2E, 0xE4, 0xFB, 0x08, 0x66, 0xE1, 0xD4, 0x02, + 0x67, 0xE1, 0x2E, 0xE4, 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0x64, 0x00, + 0x17, 0x3D, 0x17, 0x35, 0x16, 0x9E, 0x7F, 0x04, 0x00, 0xA2, 0x50, 0x05, + 0x61, 0xE1, 0x2E, 0xE4, 0x13, 0x18, 0x08, 0xAE, 0x44, 0x28, 0x11, 0x3D, + 0x45, 0x28, 0x11, 0x3D, 0x00, 0xA2, 0x11, 0x3D, 0x02, 0xAF, 0x02, 0xA0, + 0x49, 0xF0, 0x15, 0x2A, 0x11, 0x3D, 0x14, 0x18, 0x08, 0xAE, 0x02, 0xAE, + 0x2E, 0xE4, 0x28, 0xF0, 0x03, 0x3C, 0x2E, 0xE4, 0x02, 0xA1, 0xE6, 0xF0, + 0x04, 0xA1, 0x31, 0xA2, 0xCD, 0xB4, 0x04, 0xA1, 0xBA, 0xF0, 0x35, 0xB4, + 0x04, 0xA1, 0x5A, 0xF0, 0x02, 0xA1, 0x86, 0xF0, 0x29, 0xA0, 0x15, 0xA0, + 0x2E, 0xE4, 0x26, 0xF0, 0xE8, 0x03, 0x82, 0xE1, 0x01, 0x84, 0x01, 0x3E, + 0x11, 0x35, 0x56, 0x05, 0x61, 0xE1, 0x18, 0xE0, 0x03, 0x28, 0xE9, 0x03, + 0x05, 0xE0, 0x11, 0x3D, 0x4A, 0xF0, 0x06, 0xA1, 0x6A, 0xF0, 0x02, 0xA1, + 0x61, 0xE1, 0x03, 0xA1, 0x2A, 0xF0, 0x06, 0xA1, 0x2E, 0xE4, 0x11, 0x3F, + 0x11, 0x37, 0x54, 0x05, 0x30, 0xD1, 0x6A, 0xE1, 0x26, 0x01, 0x1E, 0xE4, + 0xB5, 0x3C, 0xB4, 0x34, 0xFE, 0xA2, 0x05, 0x00, 0x11, 0x3D, 0x03, 0xC7, + 0x54, 0x05, 0x61, 0xE1, 0x11, 0x3D, 0x03, 0xC7, 0x50, 0x05, 0x61, 0xE1, + 0xB0, 0x3C, 0x00, 0xA2, 0xB7, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x1E, 0x07, + 0x1E, 0xE4, 0xB1, 0x3C, 0x4C, 0xCC, 0x4A, 0xCC, 0x44, 0xCC, 0x00, 0xA2, + 0xCC, 0xD1, 0x05, 0x00, 0x30, 0xD1, 0x72, 0xCC, 0x3A, 0xD0, 0x00, 0x00, + 0xCE, 0xD1, 0x00, 0x00, 0x4C, 0xD0, 0x01, 0x00, 0x4B, 0xD0, 0x05, 0x00, + 0x1E, 0xE4, 0x00, 0x00, 0x08, 0xD0, 0x00, 0x00, 0x2A, 0xE4, 0x10, 0x28, + 0x2E, 0xE4, 0x7C, 0x02, 0x40, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, + 0x42, 0xE0, 0x17, 0xAE, 0x40, 0x00, 0x05, 0xE0, 0x42, 0xE0, 0x03, 0xAE, + 0x00, 0x17, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x06, 0x11, 0xD1, 0x20, 0xCE, + 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x00, 0x01, 0x60, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0xF8, 0xF7, 0x33, 0x3C, 0x34, 0x3C, 0xB8, 0x3C, 0x00, 0xA2, + 0xFC, 0xA2, 0x66, 0x3C, 0x65, 0x3C, 0x19, 0x3C, 0x2E, 0xE4, 0xA3, 0x3C, + 0xFA, 0xA2, 0xA2, 0x3C, 0x40, 0xA1, 0x16, 0x28, 0xF0, 0x3C, 0x02, 0xA2, + 0x7A, 0xF0, 0x56, 0xE0, 0x17, 0xE0, 0x11, 0x2A, 0x17, 0xE0, 0x10, 0x2A, + 0x90, 0xA1, 0x16, 0x28, 0xF0, 0x3C, 0x04, 0xA2, 0x78, 0xF1, 0x56, 0xE0, + 0x1A, 0xF1, 0x14, 0x2C, 0x3A, 0xF1, 0x13, 0x2C, 0xD0, 0xF0, 0x80, 0x07, + 0x02, 0xE0, 0x13, 0x2C, 0x90, 0xF0, 0x80, 0x07, 0x02, 0xE0, 0x14, 0x2C, + 0x02, 0xE0, 0x18, 0xE0, 0x45, 0x82, 0x44, 0x84, 0x2E, 0xE4, 0x02, 0xA2, + 0x30, 0xF0, 0xE0, 0x1F, 0x82, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, 0x00, 0xA2, + 0xB9, 0x06, 0x1E, 0xE4, 0x8E, 0xF0, 0x2A, 0xF0, 0x6A, 0xF0, 0xA2, 0x3E, + 0xF5, 0xB7, 0xA2, 0x2A, 0xFE, 0xA2, 0xA2, 0x3C, 0xFC, 0xA2, 0x2E, 0xE4, + 0x00, 0xA2, 0xEE, 0x13, 0x1E, 0xE4, 0x2E, 0xE4, 0xA6, 0xCE, 0x00, 0xA2, + 0x6A, 0xE1, 0x2E, 0xE4, 0x96, 0x05, 0x08, 0xE4, 0x82, 0x08, 0x1E, 0xE4, + 0x02, 0xE0, 0xD3, 0x28, 0x35, 0x13, 0x1E, 0xE4, 0xD3, 0x28, 0x8C, 0x05, + 0x06, 0xE4, 0xAF, 0x00, 0xD3, 0x28, 0x8A, 0xF2, 0xB0, 0x00, 0x02, 0xE0, + 0xD3, 0x28, 0xAA, 0xF2, 0xB1, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0x6A, 0xF2, + 0xB2, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0x1A, 0xF2, 0xB3, 0x00, 0x02, 0xE0, + 0xD3, 0x28, 0xEA, 0xF1, 0xB4, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0xEA, 0xF1, + 0xB5, 0x00, 0x02, 0xE0, 0x8B, 0x05, 0x0A, 0xE4, 0xB6, 0x00, 0x02, 0xE0, + 0x0A, 0xE4, 0xB7, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0xB8, 0x00, 0x02, 0xE0, + 0xD3, 0x28, 0x8C, 0x05, 0xB9, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0xCA, 0xF0, + 0x09, 0x13, 0x1E, 0xE4, 0x7E, 0xF0, 0x82, 0xF0, 0xBE, 0xF0, 0x3E, 0xF4, + 0xDB, 0x0A, 0x1E, 0xE4, 0x4D, 0x05, 0x0E, 0xE4, 0x09, 0x13, 0x1E, 0xE4, + 0x01, 0x0B, 0x1E, 0xE4, 0x09, 0x13, 0x1E, 0xE4, 0x2E, 0xE4, 0x6A, 0xE1, + 0x4D, 0x05, 0x0E, 0xE4, 0x82, 0x08, 0x1E, 0xE4, 0xA6, 0xCE, 0x00, 0xA2, + 0x35, 0x13, 0x1E, 0xE4, 0xA5, 0x05, 0x08, 0xE4, 0xA5, 0x05, 0x08, 0xE4, + 0x82, 0x08, 0x1E, 0xE4, 0x02, 0xAE, 0x1D, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, + 0x04, 0xAE, 0x1F, 0x4C, 0x02, 0xAE, 0x20, 0x4C, 0x17, 0xE0, 0x1D, 0x2A, + 0x02, 0xAE, 0x1E, 0x4C, 0x4B, 0xF0, 0x1A, 0x4C, 0x24, 0xAE, 0x56, 0xE0, + 0x2E, 0xE4, 0x56, 0xE0, 0x07, 0xAE, 0xAB, 0x2A, 0x00, 0x04, 0x67, 0xE1, + 0x1E, 0x07, 0x1E, 0xE4, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0xAD, 0x28, + 0x90, 0xE1, 0x17, 0x3D, 0x08, 0xA2, 0xC2, 0x05, 0x08, 0xE0, 0x5C, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0x04, 0x04, 0xE0, 0x2A, 0xE4, 0x00, 0x04, + 0xC3, 0xE0, 0x55, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0xC0, 0xE0, 0x00, 0xCE, + 0x02, 0xA2, 0x5D, 0x00, 0x90, 0xE1, 0x00, 0x04, 0x08, 0xE0, 0x5D, 0x00, + 0xFD, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, 0xB8, 0xF7, 0x51, 0x00, 0xC2, 0xE0, + 0x48, 0x00, 0xC0, 0xE0, 0x20, 0xAF, 0x13, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, + 0x28, 0xE4, 0x10, 0x30, 0x12, 0xAF, 0x11, 0x30, 0x00, 0x98, 0x02, 0xE0, + 0x11, 0x04, 0xC0, 0xE0, 0x16, 0x04, 0xC0, 0xE0, 0x01, 0xA2, 0x28, 0xE4, + 0x10, 0x3E, 0x25, 0xB6, 0xA0, 0xA5, 0x02, 0xE0, 0x02, 0x03, 0xC2, 0xE0, + 0x02, 0xA2, 0x2E, 0xE4, 0x80, 0x03, 0x61, 0xE1, 0x44, 0xCC, 0x20, 0xA2, + 0x01, 0x9F, 0x02, 0x06, 0x84, 0xE1, 0x02, 0xA2, 0x90, 0xE1, 0x11, 0x81, + 0x11, 0x81, 0x11, 0x81, 0xC2, 0xE0, 0x0A, 0x03, 0xC2, 0xE0, 0x00, 0xA2, + 0x02, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x0B, 0x03, 0x54, 0x2A, 0xA2, 0x28, + 0x2E, 0xE4, 0x2E, 0xE4, 0x4B, 0xF0, 0x05, 0xA1, 0x1A, 0x2A, 0x7B, 0xF0, + 0xA9, 0x3C, 0x16, 0x29, 0x98, 0x05, 0x66, 0xE1, 0x2A, 0xE4, 0x04, 0xA8, + 0xDD, 0x06, 0x1E, 0xE4, 0x1E, 0xE4, 0xCD, 0x06, 0x1E, 0xE4, 0xA9, 0x28, + 0x02, 0xA1, 0xA7, 0x28, 0x2E, 0xE4, 0x5C, 0x06, 0x2A, 0xF1, 0xA6, 0x28, + 0xA7, 0x3C, 0x08, 0xB6, 0x92, 0xE0, 0x78, 0x05, 0x00, 0xE0, 0xA5, 0x28, + 0x22, 0xA1, 0xA5, 0x3C, 0x02, 0xA0, 0xA5, 0x28, 0x02, 0xA1, 0xA6, 0x28, + 0xA5, 0x3C, 0x28, 0xF0, 0xAD, 0x1A, 0x49, 0xE0, 0x01, 0x29, 0xA6, 0x3C, + 0x49, 0xE0, 0x9D, 0x08, 0x1E, 0xE4, 0x25, 0xE4, 0x66, 0xE1, 0x2E, 0xE4, + 0xF2, 0xB7, 0xFA, 0xA2, 0xDD, 0x06, 0x1E, 0xE4, 0x06, 0x29, 0x99, 0x05, + 0xA9, 0x3C, 0x06, 0x29, 0x7A, 0xF0, 0x04, 0xA8, 0x5C, 0x06, 0x1E, 0xE4, + 0xCD, 0x06, 0x1E, 0xE4, 0x1E, 0xE4, 0x06, 0x29, 0x98, 0x05, 0x66, 0xE1, + 0x06, 0x29, 0x7A, 0xF0, 0x04, 0xA8, 0xDD, 0x06, 0x1E, 0xE4, 0xCD, 0x06, + 0x1E, 0xE4, 0xA9, 0x3C, 0x2E, 0xE4, 0x18, 0x07, 0x1E, 0xE4, 0x5C, 0x06, + 0x00, 0xE0, 0xA4, 0x28, 0x24, 0xE4, 0xA9, 0x28, 0x01, 0x3D, 0xA9, 0x28, + 0x92, 0xE0, 0x78, 0x05, 0x22, 0xA1, 0xA4, 0x3C, 0x02, 0xA0, 0xA4, 0x28, + 0x02, 0xA0, 0xA6, 0x28, 0xA4, 0x3C, 0x28, 0xF0, 0x06, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0xA6, 0x3C, 0xAD, 0x28, 0x9C, 0xE0, 0x54, 0x00, 0x04, 0xE0, + 0x81, 0x06, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x48, 0xF0, 0x02, 0xA8, + 0x06, 0x5C, 0x06, 0x9E, 0x06, 0x2A, 0xD5, 0x06, 0x1E, 0xE4, 0x06, 0x28, + 0x04, 0xE0, 0x2E, 0xE4, 0x06, 0x3E, 0x03, 0xA0, 0x54, 0x00, 0x04, 0xE0, + 0x9E, 0xE0, 0x00, 0x04, 0x44, 0xCC, 0x02, 0xA1, 0xAD, 0x28, 0x9C, 0xE0, + 0x97, 0x06, 0x84, 0xE1, 0x06, 0x3C, 0x00, 0xA2, 0x06, 0x5A, 0x03, 0xA8, + 0x05, 0xAF, 0x17, 0x2B, 0x06, 0x3E, 0x03, 0xA0, 0x06, 0x2A, 0x56, 0xE0, + 0x06, 0x3C, 0xAA, 0x28, 0x2E, 0xE4, 0x06, 0x9F, 0x92, 0xE0, 0x00, 0x04, + 0x00, 0xE0, 0x06, 0x28, 0x02, 0xA0, 0x06, 0x28, 0xDA, 0xF0, 0x01, 0x29, + 0x00, 0xA2, 0x38, 0xF0, 0xAD, 0x18, 0x06, 0x3C, 0x18, 0xF7, 0xAA, 0x18, + 0x06, 0x28, 0x06, 0x3C, 0x01, 0x3D, 0x0E, 0xA2, 0x2E, 0xE4, 0xFE, 0xA2, + 0xAD, 0x18, 0xAA, 0x3C, 0x02, 0xA0, 0x06, 0x28, 0x06, 0x28, 0xAA, 0x3C, + 0x00, 0xA2, 0x38, 0xF0, 0xAD, 0x28, 0x00, 0x04, 0x61, 0xE1, 0x2E, 0xE4, + 0xC3, 0x06, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x90, 0xE1, 0x28, 0xE4, + 0x16, 0xE0, 0x11, 0x29, 0x00, 0x04, 0x00, 0xE0, 0x24, 0xE4, 0x2E, 0xE4, + 0x01, 0x3D, 0x0C, 0xA8, 0x01, 0x29, 0x92, 0xE0, 0x00, 0x04, 0x00, 0xE0, + 0x24, 0xE4, 0x2E, 0xE4, 0x01, 0x3D, 0x0A, 0xA8, 0x01, 0x29, 0x92, 0xE0, + 0x00, 0x04, 0x00, 0xE0, 0x24, 0xE4, 0x2E, 0xE4, 0x01, 0x3D, 0x06, 0xA8, + 0x01, 0x29, 0x92, 0xE0, 0x25, 0xE4, 0x00, 0xA2, 0x49, 0xE0, 0x2E, 0xE4, + 0x01, 0x29, 0x93, 0xE0, 0x00, 0x04, 0x01, 0xE0, 0x1E, 0xE4, 0xA8, 0x3C, + 0xA3, 0x28, 0x2E, 0xE4, 0xC4, 0xF0, 0xA2, 0x3C, 0x54, 0xF1, 0x9A, 0x06, + 0x06, 0xA2, 0x9B, 0xF0, 0xE4, 0x11, 0x1E, 0xE4, 0x64, 0x12, 0x1E, 0xE4, + 0x00, 0x03, 0x05, 0xE0, 0x1A, 0x2A, 0x8C, 0x12, 0x1E, 0xE4, 0xA2, 0x28, + 0xC5, 0x06, 0x1B, 0xE4, 0xA2, 0x28, 0x05, 0xA1, 0x2E, 0xE4, 0xFE, 0xA2, + 0x2E, 0xE4, 0x00, 0xA2, 0x08, 0xB6, 0x16, 0x29, 0x98, 0x05, 0x66, 0xE1, + 0xA0, 0x3C, 0x08, 0xB6, 0x16, 0x29, 0xA1, 0x3C, 0x2A, 0xE4, 0x04, 0xA1, + 0x1A, 0x28, 0x2E, 0xE4, 0x1E, 0xE4, 0x0E, 0x29, 0x99, 0x05, 0x66, 0xE1, + 0x16, 0x29, 0x98, 0x05, 0x66, 0xE1, 0xC5, 0x06, 0x2E, 0xE4, 0x06, 0x3D, + 0xA2, 0x28, 0x0E, 0x3D, 0x01, 0xC7, 0x98, 0x05, 0x66, 0xE1, 0xFA, 0xA2, + 0xA0, 0x3C, 0xFA, 0xA2, 0x2E, 0xE4, 0x16, 0x3D, 0xA7, 0x3C, 0x02, 0xA2, + 0xA8, 0x3C, 0xA1, 0x3C, 0xA6, 0x3C, 0xA4, 0x3C, 0xA5, 0x3C, 0x00, 0xA2, + 0x10, 0xC7, 0x78, 0x05, 0x66, 0xE1, 0xA9, 0x3C, 0x00, 0xA2, 0x18, 0x07, + 0x1E, 0xE4, 0x16, 0x3D, 0x00, 0x04, 0x61, 0xE1, 0x08, 0xA2, 0xAA, 0x3C, + 0x11, 0x3D, 0x01, 0x86, 0x01, 0x3E, 0x3F, 0xA2, 0x02, 0xA1, 0x59, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x0A, 0xE4, 0x02, 0xA1, 0x46, 0x07, 0x0A, 0xE4, + 0x4C, 0x07, 0x0A, 0xE4, 0x02, 0xA1, 0x82, 0x07, 0xC1, 0x4C, 0xC0, 0x24, + 0x82, 0x07, 0x0E, 0xE4, 0xC5, 0x3C, 0xC4, 0x34, 0xC3, 0x0C, 0xC2, 0x04, + 0x48, 0x00, 0xC0, 0xE0, 0x3A, 0xF1, 0xCC, 0x28, 0xD0, 0x4C, 0xCF, 0x24, + 0xD0, 0x3C, 0xCF, 0x34, 0xC9, 0x3E, 0xC8, 0x36, 0x49, 0x00, 0xC1, 0xE0, + 0x45, 0x00, 0xC1, 0xE0, 0xC9, 0x1C, 0xC8, 0x14, 0xCC, 0x3E, 0x11, 0xB6, + 0x03, 0xA8, 0x05, 0xAF, 0xFF, 0x01, 0x08, 0xE0, 0x48, 0x00, 0xC0, 0xE0, + 0xC6, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0xCA, 0x3C, 0x00, 0xA2, 0xC7, 0x3C, + 0x00, 0xFE, 0x08, 0xE0, 0x1E, 0xE4, 0x80, 0xE1, 0x8E, 0xCC, 0x92, 0xCC, + 0x71, 0xD0, 0x3C, 0x02, 0x1E, 0xE4, 0x89, 0x07, 0xCE, 0x3C, 0x00, 0xA2, + 0x81, 0xE1, 0x2A, 0x20, 0xEB, 0x12, 0x1E, 0xE4, 0xDB, 0x07, 0x1E, 0xE4, + 0xFE, 0x12, 0x12, 0xE4, 0x02, 0xA1, 0xCA, 0x28, 0xCE, 0x3C, 0x02, 0xA2, + 0xAA, 0xCE, 0x00, 0xA2, 0x2E, 0xE4, 0x6A, 0xE1, 0x1A, 0xB6, 0x02, 0xA2, + 0x31, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x2E, 0xE4, 0x34, 0xD0, 0x00, 0x00, + 0x32, 0xD0, 0x00, 0x00, 0x35, 0xD0, 0x00, 0x00, 0x33, 0xD0, 0x00, 0x00, + 0x37, 0xD0, 0xFF, 0x00, 0x36, 0xD0, 0x00, 0x00, 0x39, 0xD0, 0x00, 0x00, + 0x38, 0xD0, 0x00, 0x00, 0x4C, 0xD0, 0x01, 0x00, 0x4B, 0xD0, 0x00, 0x00, + 0x2E, 0xE4, 0x00, 0x00, 0x49, 0xD1, 0x00, 0x00, 0xD2, 0x07, 0x1E, 0xE4, + 0x5A, 0xF0, 0x96, 0xC8, 0x01, 0x00, 0x4B, 0xD0, 0x58, 0xF0, 0xDC, 0x3C, + 0x6E, 0xCC, 0xD8, 0x28, 0xDC, 0x3C, 0x00, 0xA2, 0x02, 0xA2, 0x70, 0xE4, + 0x00, 0x00, 0x4C, 0xD0, 0x96, 0xCC, 0xD2, 0x07, 0x1E, 0xE4, 0xDC, 0x3C, + 0x2E, 0xE4, 0x6E, 0xCC, 0xD8, 0x28, 0x2A, 0xE4, 0x01, 0x00, 0x4B, 0xD0, + 0x28, 0xE4, 0x96, 0xC8, 0x00, 0x00, 0x4C, 0xD0, 0x6E, 0xCC, 0xD8, 0x28, + 0xD8, 0x3C, 0xCD, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x4B, 0xD0, 0xDC, 0x3C, + 0xD2, 0x07, 0x1E, 0xE4, 0x90, 0xE1, 0x6E, 0xCC, 0xD8, 0x28, 0x01, 0x00, + 0xA8, 0x13, 0x1E, 0xE4, 0x2E, 0xE4, 0x28, 0xE1, 0x16, 0xB6, 0xCD, 0x2A, + 0x80, 0x00, 0x04, 0xE0, 0xCC, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0xD8, 0x3C, + 0x00, 0xE0, 0x64, 0x02, 0x1E, 0xE4, 0xDA, 0xF1, 0xB1, 0x01, 0x05, 0xE0, + 0x50, 0xCE, 0x40, 0x04, 0x12, 0xE0, 0x08, 0xA1, 0x06, 0xA8, 0xD9, 0x28, + 0x04, 0xE0, 0xFE, 0x3C, 0x06, 0xAE, 0x06, 0xA8, 0x50, 0xCA, 0x52, 0xCE, + 0xFE, 0x58, 0xB1, 0x01, 0x6B, 0x02, 0x1E, 0xE4, 0xE8, 0xF7, 0x04, 0xA8, + 0x00, 0x00, 0x44, 0xD1, 0x00, 0x00, 0x4E, 0xD1, 0x1E, 0xE4, 0x00, 0x00, + 0x27, 0xD0, 0x2E, 0xE4, 0xD9, 0x28, 0x01, 0x00, 0x27, 0xD0, 0x37, 0x08, + 0xE8, 0xF7, 0x02, 0xA8, 0x48, 0xCA, 0x1A, 0xF2, 0x21, 0xD1, 0x40, 0xCE, + 0xC7, 0x4C, 0xC6, 0x24, 0xC0, 0xE0, 0x40, 0x00, 0x22, 0xD1, 0x00, 0x00, + 0x32, 0xA0, 0x02, 0xAE, 0x06, 0xA8, 0x43, 0x00, 0xE8, 0xF7, 0x02, 0xA8, + 0x48, 0xCA, 0x46, 0xCE, 0x00, 0x02, 0x00, 0xE0, 0xC7, 0x4C, 0xC6, 0x24, + 0xC5, 0x1C, 0xC4, 0x14, 0xC7, 0x3C, 0xC6, 0x34, 0xC6, 0x34, 0xC1, 0x4C, + 0xC0, 0x24, 0x54, 0xF0, 0xB0, 0x08, 0x18, 0xE4, 0xCC, 0x28, 0xC7, 0x3C, + 0x00, 0x00, 0x4E, 0xD1, 0xFD, 0x08, 0x1E, 0xE4, 0xC1, 0xE0, 0x2E, 0xE4, + 0x00, 0x00, 0x44, 0xD1, 0x36, 0xB6, 0x00, 0xA2, 0x03, 0xA1, 0x59, 0x00, + 0x45, 0x00, 0xC1, 0xE0, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, + 0x1A, 0xE0, 0x52, 0xE0, 0xD9, 0x3C, 0x00, 0x02, 0x04, 0xE0, 0xCB, 0x3C, + 0xC6, 0x24, 0xCC, 0x3C, 0x2B, 0x08, 0x1E, 0xE4, 0xCF, 0x36, 0x49, 0x00, + 0xC1, 0xE0, 0xC7, 0x4C, 0x45, 0xE0, 0xD0, 0x4E, 0xCF, 0x26, 0xD0, 0x3E, + 0x03, 0xE0, 0xC3, 0x0E, 0xC2, 0x06, 0x33, 0xF0, 0xCC, 0x3C, 0x02, 0xB6, + 0xCC, 0x28, 0x00, 0x02, 0xD9, 0x3E, 0x00, 0x02, 0x01, 0xE0, 0x13, 0xF2, + 0x1B, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0xCC, 0x28, 0xCB, 0x28, 0x78, 0xF1, + 0x52, 0xE0, 0x17, 0xE0, 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0xF6, + 0x5D, 0x00, 0xC0, 0xE0, 0xBA, 0xF5, 0x00, 0x40, 0xC0, 0xE0, 0xC8, 0xF7, + 0x00, 0x20, 0x08, 0xE0, 0xC2, 0xE0, 0x00, 0x40, 0x0A, 0xE0, 0x5D, 0x00, + 0xCB, 0x3C, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, 0x39, 0xF0, 0xCC, 0x2A, + 0xD9, 0x28, 0xCE, 0xF4, 0xC1, 0xE0, 0xD9, 0x3C, 0x00, 0x02, 0x04, 0xE0, + 0xC9, 0xF7, 0x00, 0x40, 0x09, 0xE0, 0x5D, 0x00, 0x04, 0x3C, 0x0E, 0xA8, + 0x68, 0xC8, 0x2E, 0xE4, 0x2A, 0xE4, 0xCC, 0x28, 0x2E, 0xE4, 0x04, 0x74, + 0x49, 0x00, 0xC0, 0xE0, 0xFD, 0x08, 0x1E, 0xE4, 0xD0, 0x4C, 0xCF, 0x24, + 0xD0, 0x3C, 0xCF, 0x34, 0xD0, 0x3E, 0xCF, 0x36, 0x48, 0x00, 0xC1, 0xE0, + 0x00, 0xA2, 0x45, 0xE0, 0xD0, 0x4E, 0xCF, 0x26, 0x06, 0xB6, 0x00, 0x02, + 0x03, 0xE0, 0x26, 0xB6, 0x08, 0xA8, 0x45, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x2A, 0xE4, 0x82, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA8, 0x04, 0xAF, + 0x45, 0x00, 0xC0, 0xE0, 0x07, 0xAF, 0x45, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0x04, 0xA2, 0x29, 0xE4, 0x03, 0xA8, 0x02, 0xA2, 0x2E, 0xE4, 0x08, 0xA2, + 0x29, 0xE4, 0x05, 0xA8, 0x02, 0xE0, 0xD9, 0x28, 0x64, 0x02, 0x1E, 0xE4, + 0xD9, 0x28, 0xF9, 0x08, 0x0A, 0xE4, 0x00, 0x02, 0x12, 0xE0, 0x08, 0xA1, + 0x6A, 0xF2, 0x06, 0xA8, 0x04, 0xAF, 0xD9, 0x28, 0xFE, 0x3C, 0x06, 0xAE, + 0x50, 0xCE, 0xC0, 0x01, 0x00, 0xE0, 0x20, 0xAE, 0x04, 0xA8, 0x50, 0xCA, + 0x52, 0xCA, 0x90, 0xE1, 0xFE, 0x58, 0xFE, 0x5C, 0x52, 0xCA, 0xE8, 0xF7, + 0xFE, 0x3E, 0x07, 0xAE, 0x07, 0xA8, 0xD9, 0x2A, 0x56, 0xE0, 0xFE, 0x5E, + 0xB1, 0x01, 0x05, 0xE0, 0x01, 0xE0, 0x21, 0xAE, 0x05, 0xAF, 0xD9, 0x2A, + 0x52, 0xCE, 0x90, 0xE1, 0x51, 0xCE, 0x40, 0x01, 0x04, 0xE0, 0xE8, 0xF7, + 0x04, 0xA8, 0x50, 0xCA, 0x6E, 0xF1, 0x22, 0xF0, 0xD9, 0x18, 0xFC, 0x01, + 0x20, 0xAE, 0x04, 0xAF, 0x06, 0xA0, 0xD9, 0x28, 0xD9, 0x28, 0x50, 0xCE, + 0x40, 0x04, 0x00, 0xE0, 0x06, 0xAE, 0x12, 0xE0, 0x08, 0xA1, 0x06, 0xA8, + 0xB1, 0x01, 0x04, 0xE0, 0xFE, 0x3C, 0x3E, 0xA8, 0x04, 0xA8, 0x50, 0xCA, + 0x52, 0xCE, 0xFE, 0x58, 0x1E, 0xE4, 0x6B, 0x02, 0x0E, 0xE4, 0xE8, 0xF7, + 0x01, 0xC0, 0x72, 0xC8, 0xAE, 0xF1, 0x7D, 0x08, 0xD7, 0x26, 0x00, 0xC0, + 0x3C, 0x3C, 0x3B, 0x34, 0x53, 0xF0, 0x45, 0xE0, 0x07, 0xAE, 0xD6, 0x4E, + 0x73, 0xCC, 0x07, 0xAE, 0xD6, 0x4E, 0xD7, 0x26, 0x01, 0xC0, 0x49, 0xE0, + 0x34, 0x09, 0x1E, 0xE4, 0x06, 0xAF, 0x00, 0xC0, 0x3C, 0x4C, 0x3B, 0x24, + 0xAA, 0xCA, 0x2E, 0xF0, 0x08, 0xB6, 0x46, 0xE0, 0x48, 0x00, 0xC1, 0xE0, + 0x16, 0xB6, 0xCE, 0x2A, 0xD0, 0x4E, 0xCF, 0x26, 0xD0, 0x3E, 0xCF, 0x36, + 0xC5, 0x1E, 0xC4, 0x16, 0x49, 0xE0, 0x42, 0xE0, 0xC2, 0xE0, 0xC3, 0x1C, + 0xC2, 0x14, 0x35, 0xF0, 0x00, 0xA2, 0x52, 0x00, 0xC2, 0xE0, 0x48, 0x00, + 0x3C, 0x4C, 0x3B, 0x24, 0x01, 0xC0, 0xAA, 0xCE, 0x2E, 0xE4, 0x39, 0x09, + 0x1E, 0xE4, 0x00, 0xC0, 0x00, 0xC0, 0x3A, 0x4C, 0x39, 0x24, 0x01, 0xC0, + 0x39, 0x34, 0x06, 0xAF, 0x01, 0xC0, 0x2E, 0xE4, 0xC0, 0xE0, 0x2E, 0xE4, + 0x00, 0xC0, 0x3A, 0x3C, 0x02, 0xA1, 0x6A, 0xF3, 0x02, 0xA1, 0x59, 0x00, + 0x02, 0xA1, 0x5A, 0xF0, 0x02, 0xA1, 0x2A, 0xE4, 0xC0, 0xE0, 0x2E, 0xE4, + 0x86, 0x09, 0x0A, 0xE4, 0x02, 0xAF, 0xE1, 0x30, 0x08, 0xAF, 0x60, 0x00, + 0x1E, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0xE2, 0x30, 0x3E, 0xA8, 0x61, 0x00, + 0xC0, 0xE0, 0xE0, 0x3C, 0x04, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0xE4, 0x3C, + 0x56, 0x3C, 0x00, 0xA2, 0xBA, 0x3C, 0x0E, 0xA8, 0x02, 0xA2, 0x5D, 0x03, + 0x1E, 0xE4, 0x55, 0x3C, 0xC0, 0xE0, 0x1A, 0xF1, 0x56, 0x28, 0xB9, 0x3C, + 0x5C, 0x3C, 0x88, 0x00, 0x02, 0xE0, 0x6C, 0x00, 0x12, 0xD1, 0x20, 0xCE, + 0x6A, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0x36, 0x05, 0x11, 0xD1, 0x0C, 0x00, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0xC1, 0x3C, 0xC0, 0x34, + 0x60, 0x00, 0xC0, 0xE0, 0xC2, 0x34, 0x14, 0xAE, 0x61, 0x00, 0xC0, 0xE0, + 0x02, 0xAF, 0x62, 0x00, 0xC0, 0xE0, 0xC3, 0x3C, 0x75, 0x04, 0x1E, 0xE4, + 0x2E, 0xE4, 0x54, 0x30, 0xF8, 0xF7, 0x28, 0xCA, 0x4C, 0x01, 0x1E, 0xE4, + 0x11, 0xD1, 0x20, 0xCE, 0x42, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0xC4, 0x00, + 0x12, 0xD1, 0x10, 0x02, 0x00, 0xE0, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, + 0x20, 0xCE, 0x80, 0x00, 0x00, 0xE0, 0x80, 0x01, 0xC0, 0x00, 0x12, 0xD1, + 0x40, 0x0B, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x64, 0x12, 0x1E, 0xE4, 0x01, 0xA2, 0x04, 0xA2, 0xCD, 0x09, 0x0B, 0xE4, + 0xE4, 0x11, 0x1E, 0xE4, 0x80, 0x01, 0x00, 0xE0, 0x42, 0x00, 0xC0, 0xE0, + 0x80, 0x01, 0x00, 0xE0, 0x80, 0x00, 0x00, 0xE0, 0x12, 0xD1, 0x10, 0x02, + 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, + 0x20, 0xCE, 0x80, 0x01, 0x00, 0xE0, 0xF9, 0xF7, 0xC0, 0x00, 0x12, 0xD1, + 0x40, 0x0B, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, 0x04, 0xA2, 0x1E, 0xE4, 0x60, 0x00, + 0xC0, 0xE0, 0x64, 0x12, 0xAD, 0x3C, 0x02, 0xAF, 0x2B, 0xF0, 0xE4, 0x11, + 0xC0, 0xE0, 0xAE, 0x3C, 0x61, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xF2, 0x01, + 0x1E, 0xE4, 0x6E, 0x00, 0x64, 0xF0, 0xA2, 0x28, 0x8A, 0xF0, 0x35, 0x28, + 0xB4, 0x34, 0x02, 0xA0, 0xB5, 0x4C, 0xB4, 0x24, 0x08, 0xAE, 0x45, 0x4C, + 0x44, 0x24, 0xB5, 0x3C, 0xB5, 0x4C, 0xB4, 0x24, 0x6F, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0xA3, 0x28, 0x70, 0x00, 0xC2, 0xE0, 0x72, 0x00, 0xC2, 0xE0, + 0xB8, 0x2C, 0x71, 0x00, 0x73, 0x00, 0xC2, 0xE0, 0xA6, 0x05, 0x1E, 0xE4, + 0xB6, 0x28, 0x74, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x56, 0xE0, + 0x29, 0xAE, 0x19, 0x2A, 0x77, 0x00, 0xC2, 0xE0, 0xA2, 0x28, 0x76, 0x00, + 0x11, 0x4D, 0x11, 0x21, 0x50, 0x05, 0x61, 0xE1, 0x11, 0x4D, 0x11, 0x21, + 0x78, 0x00, 0xC2, 0xE0, 0xB1, 0x4C, 0xB0, 0x20, 0x79, 0x00, 0xC2, 0xE0, + 0x54, 0x05, 0x67, 0xE1, 0x7C, 0x00, 0xC2, 0xE0, 0x7E, 0x00, 0xC2, 0xE0, + 0x17, 0x4D, 0x17, 0x21, 0x7D, 0x00, 0xC2, 0xE0, 0x17, 0x4D, 0x17, 0x21, + 0x56, 0xE0, 0x20, 0xAE, 0x4D, 0xC8, 0x4A, 0xC8, 0xB3, 0x24, 0x2E, 0xE4, + 0x53, 0x00, 0xC2, 0xE0, 0xB6, 0x28, 0x6D, 0x00, 0xC2, 0xE0, 0xB2, 0x4C, + 0x45, 0x4C, 0x44, 0x24, 0x70, 0x00, 0xC2, 0xE0, 0xB0, 0x20, 0x71, 0x00, + 0xC2, 0xE0, 0x08, 0xAE, 0x08, 0xA2, 0x72, 0x00, 0xC2, 0xE0, 0xB1, 0x4C, + 0xC2, 0xE0, 0x02, 0xA2, 0x73, 0x00, 0xC2, 0xE0, 0x75, 0x00, 0xC2, 0xE0, + 0x00, 0xA2, 0x74, 0x00, 0x11, 0x4D, 0x11, 0x21, 0x50, 0x05, 0x61, 0xE1, + 0x11, 0x4D, 0x11, 0x21, 0x76, 0x00, 0xC2, 0xE0, 0x16, 0xE0, 0xB6, 0x28, + 0x77, 0x00, 0xC2, 0xE0, 0x61, 0xE1, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, + 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x54, 0x05, 0xC2, 0xE0, 0x11, 0x4D, + 0x11, 0x21, 0x7A, 0x00, 0x15, 0x2A, 0x0E, 0xAE, 0xB7, 0x28, 0x79, 0x00, + 0x17, 0x4C, 0x10, 0xAE, 0x56, 0xE0, 0x17, 0xE0, 0x7B, 0x00, 0xC2, 0xE0, + 0x16, 0x4C, 0x10, 0xAE, 0xA8, 0x05, 0x61, 0xE1, 0x2E, 0xE4, 0x2E, 0xE4, + 0x11, 0x3D, 0x14, 0x28, 0x11, 0x3D, 0x13, 0x28, 0x61, 0xE1, 0x2E, 0xE4, + 0x11, 0x3D, 0x15, 0x28, 0xA8, 0xF0, 0x11, 0x19, 0x13, 0x28, 0xA8, 0x05, + 0x15, 0x28, 0x78, 0xF0, 0x11, 0x19, 0x14, 0x28, 0x19, 0x3C, 0x00, 0xA2, + 0x48, 0xF0, 0x11, 0x19, 0x2E, 0xE4, 0x19, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, + 0x00, 0xA2, 0x6A, 0xE1, 0x28, 0x3C, 0x00, 0xA2, 0x1E, 0xE4, 0xF0, 0x3C, + 0x3E, 0xA2, 0xA6, 0xCE, 0x1E, 0xE4, 0xD7, 0x0A, 0x08, 0xE4, 0x82, 0x08, + 0xAF, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0x35, 0x13, 0x02, 0xE0, 0xD3, 0x28, + 0xCB, 0x0A, 0x06, 0xE4, 0x02, 0xE0, 0xD3, 0x28, 0x9A, 0xF2, 0xB0, 0x00, + 0x02, 0xE0, 0xD3, 0x28, 0x6A, 0xF3, 0xB1, 0x00, 0x02, 0xE0, 0xD3, 0x28, + 0x2A, 0xF3, 0xB2, 0x00, 0xD3, 0x28, 0xC5, 0x0A, 0x0A, 0xE4, 0xB3, 0x00, + 0xD3, 0x28, 0x9A, 0xF2, 0xB4, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0xBA, 0xF2, + 0xB5, 0x00, 0x02, 0xE0, 0xC5, 0x0A, 0x0A, 0xE4, 0xB6, 0x00, 0x02, 0xE0, + 0x0A, 0xE4, 0xB7, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0xB8, 0x00, 0x02, 0xE0, + 0xD3, 0x28, 0xCB, 0x0A, 0xB9, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0x7A, 0xF1, + 0xE7, 0x13, 0x1E, 0xE4, 0x2E, 0xF1, 0x32, 0xF1, 0xDB, 0x0A, 0x1E, 0xE4, + 0x09, 0x13, 0x1E, 0xE4, 0x0E, 0xE4, 0x28, 0x3C, 0x02, 0xA2, 0x9D, 0xF1, + 0x1E, 0xE4, 0x28, 0xE4, 0x28, 0x28, 0x7E, 0x0A, 0x28, 0x28, 0x7E, 0x0A, + 0x0E, 0xE4, 0x09, 0x13, 0x0E, 0xE4, 0x09, 0x13, 0x1E, 0xE4, 0x28, 0xE4, + 0x1E, 0xE4, 0x09, 0x13, 0x1E, 0xE4, 0x7E, 0x0A, 0x28, 0x28, 0x7E, 0x0A, + 0x0E, 0xE4, 0x01, 0x0B, 0x4E, 0xBA, 0x2E, 0xE4, 0x6B, 0xE1, 0x28, 0xE4, + 0x40, 0xBA, 0x17, 0x3C, 0x4E, 0xBA, 0x16, 0x3C, 0x5A, 0xBA, 0x13, 0x3C, + 0x5A, 0xBA, 0x15, 0x3C, 0x33, 0x3C, 0x16, 0xE0, 0x15, 0x28, 0x14, 0x3C, + 0x81, 0x04, 0x1E, 0xE4, 0xF5, 0x0B, 0x1E, 0xE4, 0x00, 0xA2, 0x44, 0xBA, + 0xB7, 0x3C, 0x42, 0xBA, 0x46, 0xBA, 0xB1, 0x3C, 0x46, 0xBA, 0xB0, 0x3C, + 0x41, 0xBA, 0x62, 0xBA, 0x95, 0x04, 0x1E, 0xE4, 0xB3, 0x34, 0x56, 0xE0, + 0x25, 0xAE, 0x57, 0xBA, 0x6A, 0xBA, 0x18, 0x3C, 0x40, 0xBA, 0xB2, 0x3C, + 0x8A, 0xF0, 0x04, 0xA1, 0x46, 0xBA, 0x2E, 0xE4, 0x3A, 0xF0, 0x06, 0xA1, + 0xFA, 0xF0, 0x04, 0xA1, 0x46, 0xBA, 0x2E, 0xE4, 0x0A, 0xF1, 0x08, 0xA1, + 0x5A, 0xBA, 0x6E, 0xBA, 0x2A, 0xF0, 0x40, 0xBA, 0x9E, 0xF1, 0x42, 0xBA, + 0x5A, 0xBA, 0x40, 0xBA, 0x6A, 0xBA, 0x6C, 0xBA, 0x68, 0xBA, 0x62, 0xBA, + 0x6C, 0xBA, 0x6C, 0xBA, 0x7E, 0xBA, 0x4E, 0xF1, 0x60, 0xBA, 0x60, 0xBA, + 0x60, 0xBA, 0x6C, 0xBA, 0x6C, 0xBA, 0x60, 0xBA, 0x60, 0xBA, 0x60, 0xBA, + 0x6C, 0xBA, 0x6C, 0xBA, 0x6C, 0xBA, 0x6C, 0xBA, 0x7E, 0xBA, 0x40, 0xBA, + 0x90, 0xE1, 0x7E, 0xBA, 0x28, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, + 0x1E, 0xE4, 0xA6, 0xCE, 0x00, 0xA2, 0x6A, 0xE1, 0x1E, 0xE4, 0xB1, 0x0B, + 0x08, 0xE4, 0x82, 0x08, 0xAF, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0x35, 0x13, + 0x02, 0xE0, 0xD3, 0x28, 0xAA, 0x0B, 0x06, 0xE4, 0x02, 0xE0, 0xD3, 0x28, + 0xEA, 0xF2, 0xB0, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0x6A, 0xF3, 0xB1, 0x00, + 0x02, 0xE0, 0xD3, 0x28, 0x6A, 0xF3, 0xB2, 0x00, 0xD3, 0x28, 0x86, 0x0B, + 0x0A, 0xE4, 0xB3, 0x00, 0xD3, 0x28, 0x9A, 0xF1, 0xB4, 0x00, 0x02, 0xE0, + 0x93, 0x0B, 0x0A, 0xE4, 0xB5, 0x00, 0x02, 0xE0, 0x0A, 0xE4, 0xB6, 0x00, + 0x02, 0xE0, 0xD3, 0x28, 0xB7, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0x99, 0x0B, + 0x02, 0xE0, 0xD3, 0x28, 0xA6, 0x0B, 0x0A, 0xE4, 0x02, 0xE0, 0xD3, 0x28, + 0x6A, 0xF0, 0xB8, 0x00, 0x1E, 0xE4, 0x90, 0xE1, 0x22, 0xF0, 0xB9, 0x00, + 0x1E, 0xE4, 0x30, 0x0B, 0x0E, 0xE4, 0x09, 0x13, 0x1E, 0xE4, 0x09, 0x13, + 0x1E, 0xE4, 0xE7, 0x13, 0x0A, 0xE4, 0x14, 0x05, 0x1E, 0xE4, 0xDB, 0x0A, + 0x1E, 0xE4, 0x30, 0x0B, 0x0E, 0xE4, 0xBC, 0x0B, 0x1E, 0xE4, 0x30, 0x0B, + 0x0E, 0xE4, 0x09, 0x13, 0x0E, 0x0D, 0x18, 0xE4, 0x56, 0x28, 0x09, 0x13, + 0x96, 0x0D, 0x1E, 0xE4, 0x30, 0x0B, 0x0E, 0xE4, 0xBE, 0x0B, 0x1E, 0xE4, + 0x09, 0x13, 0x1E, 0xE4, 0x1D, 0xE4, 0x28, 0x3C, 0x1A, 0xB6, 0x02, 0xA2, + 0x1E, 0xE4, 0x30, 0x0B, 0x0E, 0xE4, 0x9D, 0x0D, 0x0E, 0xE4, 0x01, 0x0B, + 0x1E, 0xE4, 0x09, 0x13, 0x1E, 0xE4, 0x96, 0x0D, 0x1E, 0xE4, 0x30, 0x0B, + 0x02, 0xA2, 0x10, 0x0C, 0x1E, 0xE4, 0x09, 0x13, 0x9D, 0x0D, 0x1D, 0xE4, + 0x28, 0x3C, 0x1A, 0xB6, 0x09, 0x13, 0x1E, 0xE4, 0x30, 0x0B, 0x0E, 0xE4, + 0x08, 0xE4, 0x28, 0x28, 0x30, 0x0B, 0x0E, 0xE4, 0x0E, 0xE4, 0x09, 0x13, + 0x1E, 0xE4, 0xB1, 0x0B, 0x1E, 0x28, 0x1B, 0x3C, 0x1A, 0x28, 0x30, 0x0B, + 0xF5, 0x0B, 0x1E, 0xE4, 0x33, 0x3C, 0x16, 0xE0, 0x28, 0xE4, 0x28, 0x28, + 0x81, 0x04, 0x1E, 0xE4, 0x16, 0x28, 0x5E, 0xBA, 0x2E, 0xE4, 0x6B, 0xE1, + 0x4C, 0xBA, 0x40, 0xBA, 0x38, 0xF0, 0x90, 0xA1, 0x6E, 0xBA, 0x28, 0xF0, + 0x02, 0xA1, 0x40, 0xBA, 0x18, 0x28, 0x1C, 0x3C, 0x4E, 0xBA, 0x40, 0xBA, + 0xA2, 0xCB, 0xA0, 0xCF, 0x38, 0xF0, 0x02, 0xA1, 0x03, 0xA1, 0x1D, 0x3C, + 0x49, 0xE0, 0x40, 0xBA, 0x40, 0xBA, 0x1E, 0x3C, 0x40, 0xBA, 0x2B, 0xF0, + 0x40, 0xBA, 0x20, 0x3C, 0x40, 0xBA, 0x1F, 0x3C, 0x1D, 0x28, 0x22, 0x3C, + 0x4A, 0xBA, 0x21, 0x3C, 0x23, 0x3C, 0x40, 0xBA, 0x38, 0xF0, 0x1E, 0x4C, + 0x98, 0xF0, 0x27, 0x3C, 0x40, 0xBA, 0x46, 0xBA, 0xA4, 0xCB, 0xA0, 0xCF, + 0x7A, 0xF0, 0x40, 0xBA, 0x25, 0x3C, 0xA4, 0xCB, 0xA0, 0xCF, 0x24, 0x3C, + 0x1A, 0x3C, 0x00, 0xA2, 0x97, 0x0C, 0x1E, 0xE4, 0x08, 0xAF, 0x1E, 0xA0, + 0x13, 0x28, 0x2E, 0xE4, 0x08, 0xAF, 0x1E, 0xA0, 0x14, 0x28, 0x44, 0x3C, + 0x45, 0x28, 0x6A, 0xF0, 0x33, 0x28, 0x45, 0x3C, 0x45, 0x3C, 0x02, 0xAE, + 0x02, 0xAF, 0x02, 0xA0, 0x47, 0x3C, 0x18, 0xE0, 0x45, 0x82, 0x44, 0x84, + 0x2A, 0xE4, 0x33, 0x28, 0x48, 0x3C, 0x45, 0x2C, 0x2E, 0xE4, 0x48, 0x3C, + 0x02, 0xAF, 0x45, 0x2C, 0x38, 0xF0, 0x90, 0xA1, 0x16, 0x28, 0x5E, 0xBA, + 0x39, 0x3C, 0x42, 0xBA, 0x4C, 0xBA, 0x40, 0xBA, 0x3A, 0xF0, 0x18, 0x28, + 0x1C, 0x3C, 0x4E, 0xBA, 0x1D, 0x3C, 0x40, 0xBA, 0xA2, 0xCB, 0xA0, 0xCF, + 0x48, 0xF0, 0x1E, 0x3C, 0x40, 0xBA, 0x68, 0xF0, 0x40, 0xBA, 0x1E, 0x3C, + 0x2E, 0xF0, 0x40, 0xBA, 0x40, 0xBA, 0x20, 0x3C, 0x40, 0xBA, 0x1F, 0x3C, + 0x39, 0x28, 0x22, 0x3C, 0x4A, 0xBA, 0x21, 0x3C, 0x56, 0xE0, 0x03, 0xA1, + 0x1E, 0x2A, 0x04, 0xA1, 0x40, 0xBA, 0x26, 0x3C, 0x40, 0xBA, 0x3A, 0xF0, + 0x12, 0xB6, 0x91, 0xA1, 0x16, 0x2A, 0x40, 0xBA, 0x16, 0xB6, 0x39, 0x2A, + 0x12, 0xB6, 0x1E, 0x2A, 0x03, 0xA1, 0x65, 0x3C, 0x29, 0xF0, 0x03, 0xA1, + 0x40, 0xBA, 0x42, 0xBA, 0x66, 0x3C, 0x29, 0xF0, 0x98, 0xF0, 0x27, 0x3C, + 0x40, 0xBA, 0x23, 0x3C, 0xA4, 0xCB, 0xA0, 0xCF, 0x7A, 0xF0, 0x40, 0xBA, + 0x25, 0x3C, 0xA4, 0xCB, 0xA0, 0xCF, 0x24, 0x3C, 0x39, 0x2A, 0x02, 0xA2, + 0x97, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0x1A, 0x3C, 0x56, 0xB6, 0x05, 0xA1, + 0x87, 0x0C, 0x08, 0xE4, 0x82, 0x08, 0x1E, 0xE4, 0x02, 0xE0, 0xD3, 0x28, + 0x35, 0x13, 0x1E, 0xE4, 0xD3, 0x28, 0x87, 0x0C, 0x0A, 0xE4, 0xB0, 0x00, + 0x87, 0x0C, 0x0A, 0xE4, 0xB2, 0x00, 0x02, 0xE0, 0x0A, 0xE4, 0xB5, 0x00, + 0x02, 0xE0, 0xD3, 0x28, 0xB3, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0x87, 0x0C, + 0x02, 0xE0, 0xD3, 0x28, 0x87, 0x0C, 0x0A, 0xE4, 0xD3, 0x28, 0x87, 0x0C, + 0x0A, 0xE4, 0xB6, 0x00, 0x89, 0x0C, 0x06, 0xE4, 0xAF, 0x00, 0x02, 0xE0, + 0x0A, 0xE4, 0xB1, 0x00, 0x02, 0xE0, 0xD3, 0x28, 0x0E, 0xE4, 0x87, 0x0C, + 0x0E, 0xE4, 0x87, 0x0C, 0x28, 0xF0, 0x09, 0x13, 0x1E, 0xE4, 0x95, 0x0C, + 0x18, 0xE0, 0xD3, 0x82, 0x44, 0x84, 0x4E, 0xF5, 0x00, 0xA2, 0xDA, 0x0C, + 0x1E, 0xE4, 0x46, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xFE, 0xA2, 0x2E, 0xE4, + 0x69, 0x3C, 0x68, 0x3C, 0x64, 0x3C, 0x61, 0x3C, 0x40, 0xBA, 0x2A, 0xE4, + 0x40, 0xA1, 0x16, 0x28, 0x40, 0xBA, 0x40, 0xBA, 0x6A, 0xF3, 0x61, 0x3C, + 0x7E, 0xA8, 0xA4, 0xCB, 0xA0, 0xCF, 0x98, 0xF0, 0x7E, 0xA8, 0xA4, 0xCB, + 0xA0, 0xCF, 0x68, 0x3C, 0x43, 0xBA, 0x62, 0x3C, 0x42, 0xBA, 0x69, 0x3C, + 0x67, 0xE1, 0xD8, 0xF0, 0x02, 0xA1, 0x63, 0x3E, 0x22, 0xD0, 0xC0, 0x06, + 0x66, 0xE1, 0xB0, 0x05, 0xA0, 0xCF, 0xBE, 0x0C, 0x84, 0xE1, 0x05, 0x00, + 0x02, 0xA1, 0x17, 0x3F, 0x16, 0x0B, 0xA5, 0xCB, 0x66, 0xE1, 0xB6, 0x05, + 0x67, 0xE1, 0xD8, 0xF0, 0x84, 0xE1, 0x05, 0x00, 0x22, 0xD0, 0xC6, 0x06, + 0x16, 0x09, 0xA4, 0xCB, 0xA0, 0xCF, 0xCC, 0x0C, 0x67, 0xE1, 0x78, 0xF0, + 0x02, 0xA1, 0x17, 0x3D, 0x05, 0xC7, 0x80, 0x00, 0x04, 0xE0, 0xB6, 0x05, + 0x40, 0xBA, 0x56, 0x11, 0x1E, 0xE4, 0x17, 0x3D, 0x02, 0xE0, 0x13, 0x28, + 0x2E, 0xE4, 0x64, 0x3C, 0x21, 0x28, 0x44, 0xBA, 0x24, 0xF0, 0xF0, 0x0A, + 0x4A, 0xBA, 0x30, 0x3C, 0x40, 0xBA, 0x58, 0xF0, 0x40, 0xBA, 0x7A, 0xF2, + 0x1A, 0x28, 0x31, 0x3C, 0x3A, 0xF0, 0x1E, 0x28, 0x4A, 0xF2, 0x37, 0x3C, + 0x4A, 0xF0, 0x34, 0x28, 0x7E, 0xF0, 0x04, 0xA2, 0x08, 0xA2, 0x2B, 0xF0, + 0x1B, 0x2A, 0x02, 0xA2, 0x62, 0xE1, 0x00, 0x02, 0x61, 0xE1, 0x01, 0x3C, + 0x64, 0xE1, 0x08, 0x02, 0x63, 0xE1, 0x04, 0x02, 0x84, 0xE1, 0x44, 0xCC, + 0x02, 0xA1, 0x0C, 0x02, 0x4E, 0xBA, 0x11, 0x3D, 0x4E, 0xBA, 0x0A, 0x0D, + 0x13, 0x3D, 0x4E, 0xBA, 0x40, 0xBA, 0x12, 0x3D, 0x40, 0xBA, 0x40, 0xBA, + 0x14, 0x3D, 0x4E, 0xBA, 0x5A, 0x28, 0x56, 0x2A, 0x2E, 0xE4, 0x36, 0x3C, + 0x2B, 0xE4, 0x56, 0x3E, 0x15, 0xB6, 0x20, 0xA1, 0x20, 0x05, 0x62, 0xE1, + 0x58, 0x3C, 0x00, 0xA2, 0x49, 0xF0, 0x03, 0xA8, 0x58, 0x2A, 0x4E, 0xBA, + 0x57, 0x4C, 0x3E, 0xF0, 0x57, 0x3C, 0x10, 0xAE, 0x58, 0x3E, 0x03, 0xA0, + 0x58, 0x2A, 0x12, 0x3D, 0x56, 0x28, 0x7A, 0x0D, 0x1B, 0xE4, 0x0F, 0xA8, + 0x58, 0x28, 0xE8, 0xF6, 0x94, 0xC8, 0x9A, 0xF0, 0x57, 0x28, 0x3A, 0xF0, + 0x02, 0xA8, 0x58, 0x28, 0x0E, 0xA8, 0x58, 0x28, 0x11, 0xA2, 0x12, 0x3D, + 0x6B, 0xF0, 0x03, 0xAF, 0x45, 0xE0, 0xBA, 0xF0, 0x01, 0x86, 0x01, 0xA2, + 0x01, 0x3E, 0x03, 0xA1, 0x62, 0xE1, 0x7A, 0x0D, 0x1E, 0xE4, 0x12, 0x3F, + 0x58, 0x28, 0x12, 0x3D, 0x59, 0x28, 0x20, 0x05, 0x12, 0x3D, 0x12, 0x3D, + 0x00, 0xA2, 0x12, 0x3D, 0x02, 0xA0, 0x5A, 0x28, 0x6B, 0x00, 0xC1, 0xE0, + 0x5A, 0x3C, 0x06, 0xAF, 0x41, 0xE0, 0x06, 0xAE, 0x12, 0xD1, 0x20, 0x05, + 0x11, 0xD1, 0x21, 0xCE, 0x28, 0xCA, 0x00, 0x00, 0x13, 0xD1, 0x04, 0x00, + 0x5D, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xF8, 0xF7, 0x65, 0x00, 0xC1, 0xE0, + 0x5C, 0x00, 0xC0, 0xE0, 0x03, 0xA8, 0x15, 0xAF, 0x02, 0xA8, 0x12, 0xAF, + 0x00, 0xA2, 0x4A, 0xF0, 0x56, 0xE0, 0x16, 0xE0, 0x5A, 0xF0, 0x5E, 0x28, + 0x2E, 0xE4, 0x56, 0x3C, 0xBE, 0xF7, 0x2A, 0xE4, 0x5D, 0x00, 0xC0, 0xE0, + 0x00, 0x02, 0x0A, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0x00, 0xCE, 0x02, 0xA2, + 0x5D, 0x00, 0xC2, 0xE0, 0x04, 0x00, 0x12, 0xD1, 0x1E, 0xF7, 0x5E, 0x3C, + 0x88, 0x00, 0x00, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, 0x20, 0x05, 0x11, 0xD1, + 0x20, 0xCE, 0x5D, 0x08, 0xF8, 0xF7, 0x28, 0xCA, 0x00, 0x00, 0x13, 0xD1, + 0x5D, 0x2A, 0x5B, 0x28, 0x20, 0x05, 0x62, 0xE1, 0x5D, 0x3E, 0x5B, 0x3C, + 0x11, 0xA0, 0x10, 0xA0, 0x00, 0xA2, 0x5A, 0x0D, 0x1B, 0xE4, 0x5C, 0x1A, + 0x28, 0xE4, 0x60, 0x28, 0x2E, 0xE4, 0x5E, 0x3C, 0x60, 0x3C, 0x02, 0xA2, + 0xDA, 0x05, 0x1E, 0xE4, 0x2E, 0xE4, 0x60, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x00, 0xA2, 0x88, 0xF0, 0x10, 0x28, 0x6A, 0xE1, 0x34, 0x2A, 0x41, 0x28, + 0x43, 0x3C, 0x42, 0x3C, 0x4A, 0xF0, 0x34, 0x28, 0x41, 0x3C, 0x16, 0xB6, + 0x1E, 0xE4, 0x1A, 0x3C, 0x34, 0xB6, 0x1A, 0x28, 0x6A, 0xE1, 0xC8, 0xCF, + 0x1C, 0x28, 0x88, 0x0F, 0x1E, 0xE4, 0xB4, 0xF0, 0x5C, 0x0C, 0x1E, 0xE4, + 0x84, 0x11, 0x18, 0xE4, 0x64, 0x28, 0x2E, 0x10, 0x70, 0x0E, 0x1E, 0xE4, + 0xD9, 0x0D, 0x1E, 0xE4, 0x98, 0xCB, 0xBA, 0xF0, 0x10, 0x28, 0x3A, 0xF7, + 0x18, 0xE0, 0x48, 0x82, 0x44, 0x84, 0x41, 0x3C, 0x02, 0xAE, 0x6B, 0xF0, + 0x34, 0x46, 0x33, 0x2A, 0x18, 0xE0, 0x48, 0x82, 0x44, 0x84, 0x4E, 0xF0, + 0x06, 0x0E, 0x10, 0xE4, 0x41, 0x18, 0x46, 0x3C, 0xE8, 0xF7, 0x11, 0x01, + 0xC0, 0xE0, 0x6A, 0xE1, 0x3A, 0xF0, 0x10, 0x28, 0x6A, 0xE1, 0x2E, 0xE4, + 0x41, 0x1C, 0x46, 0x2C, 0x41, 0x3C, 0x98, 0xCB, 0x45, 0x03, 0x1E, 0xE4, + 0x06, 0x0E, 0x10, 0xE4, 0x1A, 0xE4, 0x10, 0x28, 0xBB, 0x0E, 0x1E, 0xE4, + 0xCA, 0x0E, 0x18, 0xE4, 0x10, 0x28, 0x02, 0x0F, 0x1E, 0xE4, 0xC5, 0x10, + 0x1E, 0xE4, 0x2D, 0xF1, 0x64, 0x28, 0x6A, 0xF0, 0x10, 0x28, 0xA1, 0x0E, + 0xF8, 0xF7, 0x80, 0xCB, 0x80, 0xCF, 0x0A, 0xAE, 0x1E, 0xE4, 0x48, 0xF0, + 0x70, 0x0E, 0x1E, 0xE4, 0xD6, 0x4C, 0xD7, 0x24, 0x5A, 0xF6, 0x7D, 0x0E, + 0x22, 0xE4, 0x46, 0xE0, 0x73, 0xC8, 0x06, 0xAE, 0x45, 0x03, 0x1E, 0xE4, + 0x2E, 0xE4, 0x6B, 0xE1, 0x1E, 0x0E, 0x1E, 0xE4, 0xBB, 0x0E, 0x1E, 0xE4, + 0x1E, 0xE4, 0xB8, 0x3C, 0x02, 0xA0, 0xB8, 0x2C, 0x1E, 0xE4, 0xA1, 0x0E, + 0x1E, 0xE4, 0xC5, 0x10, 0x3A, 0xF0, 0x10, 0x28, 0x28, 0xE4, 0x70, 0x0E, + 0x41, 0x1C, 0x46, 0x2C, 0x41, 0x3C, 0x98, 0xCB, 0x48, 0xF0, 0x10, 0x28, + 0x9E, 0xF6, 0x2A, 0xE4, 0xF0, 0xD1, 0x5E, 0xF0, 0x40, 0x3C, 0xFE, 0xA2, + 0xCE, 0xD1, 0x00, 0x00, 0xF1, 0xD1, 0x00, 0x00, 0xC0, 0xCB, 0x00, 0x00, + 0xC3, 0xD1, 0x00, 0x00, 0x7A, 0xF0, 0x10, 0x28, 0xE8, 0xF7, 0x1E, 0xA8, + 0xE0, 0xD1, 0x80, 0xCF, 0x80, 0x00, 0x04, 0xE0, 0x20, 0x00, 0xC0, 0xD1, + 0x5E, 0xF0, 0x02, 0x00, 0x1E, 0xA8, 0xC0, 0xCB, 0x10, 0x00, 0xE0, 0xD1, + 0xE0, 0xD1, 0x38, 0xF0, 0x10, 0x28, 0xE8, 0xF7, 0x00, 0xA2, 0x40, 0x3C, + 0xFE, 0xA2, 0x0A, 0x00, 0xC2, 0xE0, 0x33, 0x28, 0x13, 0x01, 0xC2, 0xE0, + 0x14, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x0D, 0x03, 0x26, 0x01, 0xC2, 0xE0, + 0x15, 0x01, 0xC2, 0xE0, 0x20, 0x01, 0xC2, 0xE0, 0x17, 0x01, 0xC2, 0xE0, + 0x23, 0x01, 0xC2, 0xE0, 0x21, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x09, 0x03, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x55, 0x00, 0x04, 0xE0, 0x20, 0x03, + 0x0A, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x0C, 0x03, 0xB0, 0x03, 0x62, 0xE1, + 0x0B, 0x03, 0xC2, 0xE0, 0x84, 0xE1, 0x1F, 0x00, 0x22, 0xD0, 0x00, 0xA2, + 0x2E, 0xE4, 0x90, 0xE1, 0x12, 0x9F, 0x6E, 0x0E, 0x04, 0xA8, 0x9E, 0xCB, + 0x7A, 0xF0, 0x10, 0x28, 0x2E, 0xE4, 0x16, 0xB6, 0x99, 0xCB, 0x1A, 0xE0, + 0x16, 0xE0, 0x1A, 0xE0, 0x48, 0x1C, 0x43, 0x2C, 0x00, 0xA2, 0x3A, 0xF0, + 0x42, 0x28, 0x2E, 0xE4, 0x39, 0xF0, 0x10, 0x2A, 0x8A, 0xCB, 0x2E, 0xE4, + 0x2A, 0xE4, 0x16, 0xE0, 0x40, 0x3C, 0x0C, 0xB6, 0x06, 0xAE, 0x8C, 0xC8, + 0x3A, 0xF1, 0x10, 0x28, 0x21, 0xA1, 0x49, 0xE0, 0x46, 0xE0, 0x73, 0xC8, + 0x04, 0x78, 0x04, 0x3C, 0x21, 0xE4, 0x02, 0xB6, 0x46, 0xE0, 0x03, 0xAF, + 0x04, 0x5A, 0x03, 0xA2, 0x2E, 0xE4, 0x42, 0xE0, 0x8F, 0xC8, 0x16, 0xE0, + 0x42, 0xE0, 0x17, 0xE0, 0x95, 0xC8, 0x8E, 0xC8, 0x10, 0x28, 0x01, 0x00, + 0xC8, 0xD1, 0x2E, 0xE4, 0x41, 0x3C, 0x02, 0xA0, 0x41, 0x28, 0x08, 0xF1, + 0x44, 0x18, 0x42, 0x3C, 0x02, 0xA0, 0x42, 0x28, 0x42, 0x3C, 0x04, 0x00, + 0xC6, 0xD1, 0x28, 0xE4, 0x2E, 0xE4, 0x43, 0x3C, 0x02, 0xA0, 0x43, 0x28, + 0x44, 0x18, 0x42, 0x3C, 0x02, 0xA0, 0x42, 0x28, 0x10, 0x28, 0x2E, 0xE4, + 0x42, 0x3C, 0x28, 0xE4, 0x42, 0x4C, 0x0E, 0xAE, 0x43, 0x28, 0x28, 0xE4, + 0xC3, 0xD1, 0x98, 0xCF, 0x41, 0x28, 0x94, 0xCF, 0xE0, 0xD1, 0xF8, 0xF7, + 0xC0, 0xCB, 0x00, 0x00, 0x1E, 0xA8, 0xC0, 0xCB, 0x2E, 0xE4, 0x05, 0x00, + 0xDC, 0x28, 0x80, 0xE1, 0x80, 0xE1, 0xE8, 0xF7, 0xC0, 0xD1, 0x81, 0xE1, + 0xB3, 0x07, 0x1A, 0xE4, 0x03, 0xA1, 0x00, 0x80, 0x05, 0xE0, 0x0F, 0x00, + 0x04, 0xA8, 0x80, 0xCB, 0xFE, 0x0E, 0x05, 0xE4, 0x05, 0xE0, 0x01, 0x00, + 0xE0, 0xD1, 0xB8, 0xF7, 0xFE, 0x0E, 0x05, 0xE4, 0x03, 0xA1, 0x00, 0x80, + 0x08, 0xE4, 0x9C, 0xCB, 0xC8, 0xF7, 0x80, 0xCB, 0x40, 0x3C, 0xF6, 0xF0, + 0x8A, 0xCB, 0xFE, 0x0E, 0x34, 0x2A, 0x4B, 0xF0, 0x33, 0x2A, 0x47, 0x2C, + 0x46, 0xE0, 0x99, 0xCB, 0x02, 0xAF, 0x29, 0xF0, 0x08, 0xA8, 0x9E, 0xCB, + 0x94, 0xF0, 0x40, 0x18, 0xE8, 0xF7, 0x1E, 0xA8, 0xC0, 0xCB, 0x68, 0xF0, + 0x00, 0x00, 0xCE, 0xD1, 0x2E, 0xE4, 0x6A, 0xE1, 0x1E, 0xA8, 0xC0, 0xCB, + 0x2E, 0xE4, 0x6B, 0xE1, 0xDC, 0x28, 0x80, 0xE1, 0x80, 0xE1, 0xE8, 0xF7, + 0xC0, 0xD1, 0x81, 0xE1, 0xB3, 0x07, 0x1A, 0xE4, 0x03, 0xA1, 0x00, 0x80, + 0x05, 0xE0, 0x0F, 0x00, 0x80, 0xCB, 0x48, 0xF1, 0x9C, 0xCB, 0x65, 0xF1, + 0xC0, 0xD1, 0x0A, 0x00, 0xE0, 0xD1, 0xB8, 0xF7, 0x40, 0x3C, 0x0C, 0xB6, + 0x8A, 0xCB, 0x10, 0x00, 0x40, 0x18, 0x41, 0x18, 0x47, 0x2C, 0x56, 0xF0, + 0xE8, 0xF7, 0x1E, 0xA8, 0xC0, 0xCB, 0x64, 0xF0, 0x00, 0x00, 0xCE, 0xD1, + 0x2E, 0xE4, 0x6A, 0xE1, 0x6A, 0xF1, 0xBA, 0x28, 0x2E, 0xE4, 0x6B, 0xE1, + 0xBA, 0xF0, 0x02, 0xA1, 0x6A, 0xF0, 0x02, 0xA1, 0x1B, 0x28, 0xAE, 0xF0, + 0x5A, 0xF0, 0x04, 0xA1, 0x02, 0xA1, 0x1B, 0x28, 0xCE, 0xF0, 0x88, 0xF0, + 0x6A, 0xF0, 0x1B, 0x28, 0x3E, 0xF0, 0x96, 0xF0, 0x02, 0xA2, 0x2E, 0xE4, + 0xFE, 0xA2, 0x3E, 0xF0, 0x00, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0xC8, 0xCF, 0x3B, 0x28, 0xC2, 0xCF, 0xFE, 0xA2, 0xC8, 0xCF, + 0x3B, 0x28, 0xC2, 0xCF, 0x3A, 0x28, 0xC2, 0xCF, 0x00, 0xA2, 0xCA, 0xCF, + 0x3A, 0x28, 0xC2, 0xCF, 0x02, 0xA2, 0xC8, 0xCF, 0x00, 0xA2, 0xCA, 0xCF, + 0xFE, 0xA2, 0xC8, 0xCF, 0x02, 0xA2, 0xC8, 0xCF, 0x3C, 0x28, 0xC2, 0xCF, + 0xFE, 0xA2, 0xC8, 0xCF, 0x3C, 0x28, 0xC2, 0xCF, 0x04, 0xA1, 0x1A, 0x28, + 0x2E, 0xE4, 0xCA, 0xCF, 0x3C, 0x28, 0x3B, 0x3C, 0x3A, 0x28, 0x2A, 0xE4, + 0x13, 0xAE, 0x33, 0x2A, 0x1C, 0x28, 0x3A, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x3C, 0x3C, 0x56, 0xE0, 0x08, 0xAE, 0x36, 0xB6, 0x91, 0xA1, 0x16, 0x2A, + 0x00, 0xA2, 0x00, 0x01, 0xC2, 0xE0, 0x0A, 0xA9, 0xE2, 0x4E, 0xE1, 0x2A, + 0x25, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x1C, 0xA9, 0x08, 0xAE, 0x92, 0xB6, + 0xC2, 0xE0, 0x4C, 0x00, 0x04, 0xE0, 0x78, 0x01, 0x2E, 0xE4, 0x8C, 0x11, + 0x1E, 0xE4, 0x79, 0x01, 0x08, 0xE0, 0x49, 0xE0, 0x50, 0x00, 0xC0, 0xE0, + 0x09, 0xE0, 0x11, 0xAF, 0x0C, 0x3C, 0x7F, 0x00, 0x0C, 0x3E, 0x0C, 0x46, + 0x0D, 0x3E, 0x7F, 0x00, 0x00, 0xA2, 0x3D, 0x01, 0xC2, 0xE0, 0x61, 0x28, + 0x0A, 0xE0, 0x3B, 0xF0, 0x03, 0xA8, 0x0C, 0x2A, 0x3B, 0xF0, 0x05, 0xA8, + 0x0C, 0x2A, 0x02, 0x00, 0x09, 0xA8, 0x0C, 0x2A, 0x09, 0x00, 0x0A, 0xE0, + 0x0C, 0x2A, 0x20, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0x40, 0x00, 0x0A, 0xE0, + 0x3B, 0xF0, 0x11, 0xA8, 0x46, 0x00, 0xC1, 0xE0, 0x0C, 0x04, 0xC2, 0xE0, + 0x42, 0xE0, 0x10, 0xAE, 0x10, 0x00, 0x04, 0xE0, 0x67, 0xE1, 0x5B, 0xF0, + 0x05, 0xA8, 0x0D, 0x2A, 0xC2, 0xE0, 0x17, 0x4D, 0x17, 0x21, 0xD6, 0x02, + 0x45, 0x4C, 0x20, 0xAE, 0x44, 0x28, 0x03, 0x01, 0xC6, 0xD1, 0x01, 0x01, + 0xC2, 0xE0, 0x08, 0xAE, 0x44, 0x4C, 0x0E, 0xAE, 0x45, 0x28, 0x01, 0x00, + 0x18, 0xE0, 0x45, 0x82, 0x44, 0x84, 0x96, 0xCF, 0x0C, 0xAE, 0x7E, 0xA8, + 0x24, 0x28, 0x9A, 0xCF, 0x8E, 0xCF, 0x56, 0xE0, 0x7F, 0xA8, 0x25, 0x2A, + 0x02, 0xAE, 0x26, 0x28, 0xD6, 0xCF, 0x00, 0xA2, 0xC2, 0xCF, 0x34, 0x4C, + 0x02, 0xAE, 0x1E, 0x4C, 0x0C, 0xAE, 0x68, 0x28, 0x38, 0xF1, 0x34, 0x28, + 0x02, 0xAE, 0x64, 0x4C, 0x02, 0xAE, 0x69, 0x4C, 0x02, 0xAE, 0x65, 0x4C, + 0x02, 0xAE, 0x66, 0x4C, 0x02, 0xAE, 0x22, 0x4C, 0x0C, 0xAE, 0x21, 0x4C, + 0x82, 0xCF, 0x1A, 0x4C, 0x04, 0xAE, 0x23, 0x4C, 0x08, 0xA9, 0x33, 0x28, + 0x88, 0xCF, 0x1A, 0x28, 0x33, 0x4C, 0x04, 0xAE, 0x1A, 0x4C, 0x04, 0xAE, + 0x04, 0x01, 0xC2, 0xE0, 0x34, 0x4C, 0x02, 0xAE, 0x08, 0xAE, 0x5B, 0x00, + 0xC0, 0xE0, 0x33, 0x2A, 0x02, 0xAE, 0x56, 0xE0, 0x04, 0xAE, 0x1A, 0x4C, + 0x34, 0x28, 0x04, 0x02, 0xC2, 0xE0, 0x34, 0x4C, 0x66, 0x10, 0x1E, 0xE4, + 0xA7, 0x10, 0x1A, 0xE4, 0x01, 0x4D, 0x11, 0x21, 0xD0, 0x02, 0x61, 0xE1, + 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0xC6, 0xCF, 0x0D, 0x2A, 0x42, 0xE0, + 0x10, 0xAE, 0x00, 0x00, 0xD4, 0x02, 0x67, 0xE1, 0x5B, 0xF0, 0x03, 0xA8, + 0x66, 0x28, 0xC4, 0xCF, 0x17, 0x4D, 0x17, 0x21, 0xE0, 0xD1, 0x68, 0xF0, + 0x34, 0x44, 0x16, 0xE0, 0xE8, 0xF7, 0x1E, 0xA8, 0xC0, 0xCB, 0x04, 0x00, + 0xC2, 0xE0, 0x02, 0xA2, 0x8F, 0x02, 0x1E, 0xE4, 0xB8, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x06, 0x01, 0x30, 0x28, 0x8A, 0xCF, 0x40, 0x3C, 0xFE, 0xA2, + 0x37, 0x4C, 0x02, 0xAE, 0x31, 0x4C, 0x0C, 0xAE, 0xC6, 0xD1, 0x84, 0xCF, + 0x36, 0x4C, 0x02, 0xAE, 0x62, 0xE1, 0x00, 0x02, 0x61, 0xE1, 0x02, 0x00, + 0x64, 0xE1, 0x08, 0x02, 0x63, 0xE1, 0x04, 0x02, 0x11, 0x4D, 0x10, 0xAE, + 0x11, 0x29, 0x0C, 0x02, 0x01, 0x4D, 0x10, 0xAE, 0x11, 0x4D, 0x10, 0xAE, + 0x12, 0x4D, 0x10, 0xAE, 0x12, 0x29, 0xCE, 0xCF, 0x02, 0x4D, 0x10, 0xAE, + 0x12, 0x4D, 0x10, 0xAE, 0x13, 0x4D, 0x10, 0xAE, 0x13, 0x29, 0xD0, 0xCF, + 0x03, 0x4D, 0x10, 0xAE, 0x13, 0x4D, 0x10, 0xAE, 0x14, 0x4D, 0x10, 0xAE, + 0x14, 0x29, 0xD2, 0xCF, 0x04, 0x4D, 0x10, 0xAE, 0x14, 0x4D, 0x10, 0xAE, + 0x45, 0x2A, 0x13, 0x20, 0x2E, 0xE4, 0xD4, 0xCF, 0x05, 0x02, 0xC2, 0xE0, + 0x56, 0xE0, 0x09, 0xAE, 0x1E, 0xE4, 0x99, 0x11, 0x1E, 0xE4, 0x04, 0xA2, + 0x1E, 0xE4, 0x52, 0xB6, 0x16, 0xB6, 0xE4, 0x11, 0x08, 0x02, 0xC2, 0xE0, + 0x00, 0xA2, 0xAA, 0x11, 0xC1, 0xE0, 0x10, 0x02, 0xC2, 0xE0, 0x02, 0xA2, + 0x10, 0xAE, 0x40, 0x00, 0x04, 0xE0, 0x46, 0x00, 0x5B, 0xF0, 0x09, 0xA8, + 0x0D, 0x2A, 0x42, 0xE0, 0x17, 0x4D, 0x17, 0x21, 0xD8, 0x02, 0x67, 0xE1, + 0x46, 0x00, 0xC1, 0xE0, 0x11, 0x02, 0xC2, 0xE0, 0x40, 0x00, 0x00, 0xE0, + 0x40, 0x00, 0x04, 0xE0, 0x11, 0xA8, 0x0D, 0x2A, 0x42, 0xE0, 0x10, 0xAE, + 0x17, 0x21, 0xDA, 0x02, 0x67, 0xE1, 0x5B, 0xF0, 0x1E, 0xE4, 0x12, 0x02, + 0xC2, 0xE0, 0x17, 0x4D, 0xC2, 0xE0, 0xAD, 0x28, 0x4B, 0xF0, 0xE4, 0x11, + 0x14, 0x02, 0xC2, 0xE0, 0xA2, 0x28, 0x16, 0x02, 0x02, 0xA2, 0x2E, 0xE4, + 0x38, 0x12, 0x1E, 0xE4, 0xC2, 0xE0, 0x0E, 0xA2, 0x02, 0x03, 0xC2, 0xE0, + 0xA1, 0x28, 0x52, 0xF0, 0xA0, 0x28, 0x12, 0x03, 0xC2, 0xE0, 0x08, 0xB6, + 0xA2, 0x28, 0x32, 0xF0, 0xA2, 0x28, 0x32, 0xF0, 0xA1, 0x28, 0x80, 0x03, + 0xA2, 0x28, 0x83, 0x03, 0xC2, 0xE0, 0x08, 0xB6, 0x1E, 0xE4, 0x86, 0x03, + 0xC2, 0xE0, 0x08, 0xB6, 0x02, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x64, 0x01, + 0xA6, 0xCB, 0x68, 0xF1, 0x10, 0x28, 0x2E, 0xE4, 0xC2, 0xE0, 0xA8, 0xCB, + 0x14, 0x01, 0xC2, 0xE0, 0x26, 0x01, 0xC2, 0xE0, 0xAA, 0xCB, 0x15, 0x01, + 0xAE, 0xCB, 0x17, 0x01, 0xC2, 0xE0, 0xAC, 0xCB, 0xC2, 0xE0, 0xB0, 0xCB, + 0x20, 0x01, 0xC2, 0xE0, 0x23, 0x01, 0xC2, 0xE0, 0xB2, 0xCB, 0x21, 0x01, + 0x8C, 0xF0, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x24, 0x01, 0xC2, 0xE0, + 0x24, 0x01, 0xC0, 0xE0, 0x27, 0x28, 0x20, 0x03, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x02, 0xA2, 0xF2, 0x10, 0x18, 0xE4, 0x18, 0xE4, 0xE2, 0x4C, + 0xE1, 0x28, 0x10, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x1E, 0x14, + 0x2E, 0xE4, 0x25, 0x02, 0xC2, 0xE0, 0x24, 0x02, 0x12, 0xA8, 0x0A, 0xAF, + 0x65, 0x00, 0xC0, 0xE0, 0x1A, 0xF2, 0x55, 0x28, 0x29, 0x11, 0x0A, 0xE4, + 0x28, 0x05, 0x66, 0xE1, 0x00, 0x04, 0x67, 0xE1, 0x0F, 0x11, 0x84, 0xE1, + 0x07, 0x00, 0x22, 0xD0, 0x08, 0xAE, 0x17, 0x4D, 0x08, 0xAE, 0x17, 0x29, + 0x16, 0x3D, 0x17, 0x4D, 0x08, 0xAE, 0x17, 0x4D, 0x67, 0xE1, 0xF8, 0xF7, + 0x28, 0xCA, 0x90, 0xE1, 0x20, 0xCE, 0x17, 0x4D, 0x17, 0x21, 0x38, 0x05, + 0x08, 0x00, 0x12, 0xD1, 0x28, 0x05, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, + 0x02, 0x00, 0x13, 0xD1, 0x55, 0x2A, 0x00, 0xA2, 0x36, 0x05, 0x62, 0xE1, + 0x20, 0xA2, 0x12, 0x3D, 0x10, 0xAE, 0x32, 0xB6, 0x0A, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x12, 0x3D, 0x20, 0x05, 0x62, 0xE1, 0x2A, 0xF1, 0x02, 0xA8, + 0x12, 0x3D, 0x5B, 0x28, 0x12, 0x3D, 0x5A, 0x28, 0x11, 0xD1, 0x20, 0xCE, + 0x6B, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0x04, 0x00, 0x12, 0xD1, 0x20, 0x05, + 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x00, 0x00, 0xCA, 0xF0, 0x0E, 0xA8, + 0x0C, 0xAF, 0x65, 0x00, 0x12, 0xD1, 0x20, 0xCE, 0x6A, 0x00, 0xC0, 0xE0, + 0x13, 0xD1, 0x36, 0x05, 0x11, 0xD1, 0x0C, 0x00, 0x00, 0xA2, 0xF8, 0xF7, + 0x28, 0xCA, 0x02, 0x00, 0x5D, 0x3C, 0x56, 0x3C, 0x5A, 0x3C, 0x5B, 0x3C, + 0xC2, 0xE0, 0x02, 0xA2, 0x2E, 0xE4, 0x5E, 0x3C, 0xC6, 0x06, 0x05, 0xE0, + 0x62, 0x28, 0x3C, 0x01, 0x02, 0xA1, 0xB0, 0x05, 0x05, 0xE0, 0x5A, 0xF0, + 0x86, 0xC7, 0x63, 0x84, 0x01, 0x3E, 0xC1, 0xB4, 0x00, 0x06, 0x00, 0xE0, + 0x06, 0xAE, 0x18, 0xE0, 0x2F, 0x00, 0x22, 0xD0, 0x01, 0xA2, 0x9C, 0xE0, + 0x01, 0x08, 0x16, 0x29, 0x76, 0x11, 0x84, 0xE1, 0x3E, 0x01, 0xC3, 0xE0, + 0x07, 0x29, 0x9E, 0xE0, 0x22, 0xD0, 0x03, 0xA0, 0x3F, 0x01, 0xC2, 0xE0, + 0xC3, 0xE0, 0x7F, 0x11, 0x84, 0xE1, 0x0F, 0x00, 0x03, 0xA0, 0x3F, 0x01, + 0xC2, 0xE0, 0x3E, 0x01, 0x2E, 0xE4, 0x3C, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x40, 0x00, 0x04, 0xE0, 0x7D, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, 0xF8, 0xF7, + 0x80, 0xCB, 0x80, 0xCF, 0x17, 0xE0, 0xB7, 0x2A, 0xC4, 0x11, 0x1E, 0xE4, + 0xBB, 0x11, 0x1E, 0xE4, 0x55, 0xE0, 0x07, 0xAE, 0x02, 0x01, 0xC2, 0xE0, + 0x56, 0xE0, 0x0A, 0xAE, 0xC4, 0x11, 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, + 0x55, 0xE0, 0x09, 0xAE, 0x17, 0xE0, 0xB7, 0x2A, 0x56, 0xE0, 0x06, 0xAE, + 0xBB, 0x11, 0x1E, 0xE4, 0xC2, 0xE0, 0x56, 0xE0, 0x0F, 0xAE, 0x83, 0xE0, + 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, 0x13, 0x02, 0x09, 0xAE, 0x17, 0xE0, + 0xB7, 0x2A, 0xC4, 0x11, 0x06, 0xAE, 0xBB, 0x11, 0x1E, 0xE4, 0x55, 0xE0, + 0x56, 0xE0, 0x0F, 0xAE, 0x83, 0xE0, 0x56, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, + 0x15, 0x02, 0xC2, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, 0x06, 0xAF, 0x44, 0x00, + 0x58, 0xF0, 0x80, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, + 0x44, 0x00, 0xC0, 0xE0, 0x0E, 0xA8, 0x20, 0xAF, 0x60, 0x00, 0xC0, 0xE0, + 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, + 0x56, 0xE0, 0x03, 0xAE, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x07, 0xA8, 0x39, 0xF0, 0x05, 0xA1, + 0x07, 0xA8, 0x1B, 0xAF, 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, + 0x07, 0xA8, 0x23, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x23, 0xAF, 0x44, 0x00, + 0xC1, 0xE0, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, + 0xC0, 0xE0, 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, 0x28, 0xE4, 0x02, 0xA8, + 0x20, 0xAF, 0x44, 0x00, 0x2A, 0xE4, 0x60, 0xA8, 0x60, 0x00, 0xC0, 0xE0, + 0xA4, 0xCC, 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x00, 0x05, 0x00, 0xE0, + 0x18, 0xE0, 0x88, 0xC7, 0x0D, 0x04, 0xC2, 0xE0, 0x02, 0xA2, 0x9E, 0xE0, + 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x1E, 0xE4, 0x04, 0xAF, + 0xC0, 0x11, 0x1E, 0xE4, 0x0B, 0xE4, 0xD5, 0x11, 0x1E, 0xE4, 0xCD, 0x11, + 0xDA, 0x11, 0x1E, 0xE4, 0x1E, 0xA8, 0x1A, 0x12, 0xC1, 0xE0, 0x20, 0xAE, + 0x56, 0xE0, 0x09, 0xAE, 0x56, 0xE0, 0xFF, 0x1F, 0x09, 0xE0, 0x6E, 0x00, + 0x17, 0x9F, 0xC5, 0x12, 0x1E, 0xE4, 0x17, 0x9F, 0x02, 0x00, 0x22, 0xD0, + 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x2B, 0x12, 0x84, 0xE1, + 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, + 0x33, 0x12, 0x84, 0xE1, 0x2E, 0xE4, 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, + 0x0D, 0x04, 0xC2, 0xE0, 0x02, 0xA2, 0x01, 0x3C, 0xDA, 0xF7, 0x02, 0xA8, + 0x20, 0x04, 0xC0, 0xE0, 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0x01, 0x84, + 0x45, 0x4C, 0x44, 0x20, 0x9E, 0xE0, 0x01, 0x05, 0xC2, 0xE0, 0x00, 0xA2, + 0x07, 0x9F, 0x08, 0xAE, 0x02, 0xA2, 0x01, 0x3C, 0x2E, 0xE4, 0x0D, 0x04, + 0x20, 0x04, 0xC0, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, 0x88, 0xC7, 0x01, 0x84, + 0xDA, 0xF7, 0x02, 0xA8, 0x9E, 0xE0, 0x01, 0x05, 0x00, 0xE0, 0x18, 0xE0, + 0x07, 0x9F, 0x08, 0xAE, 0x45, 0x4C, 0x44, 0x20, 0x2E, 0xE4, 0x0D, 0x04, + 0xC2, 0xE0, 0x00, 0xA2, 0x41, 0x00, 0xC0, 0xE0, 0x4A, 0x3E, 0xEC, 0x3C, + 0x42, 0xE0, 0x11, 0xAE, 0x20, 0x00, 0x05, 0xE0, 0x5E, 0xF8, 0x10, 0x02, + 0x11, 0xD1, 0x4A, 0x08, 0x40, 0x0B, 0x11, 0xD1, 0x80, 0x01, 0x00, 0xE0, + 0xEC, 0x88, 0xC0, 0x00, 0x12, 0xD1, 0x20, 0xCE, 0x2E, 0xE4, 0xF9, 0xF7, + 0x29, 0xCA, 0x13, 0x01, 0x64, 0x12, 0x1E, 0xE4, 0x01, 0xA2, 0x06, 0xA2, + 0x02, 0xA1, 0xAD, 0x28, 0x94, 0xE0, 0xAE, 0x28, 0x0C, 0xC4, 0x49, 0xE0, + 0x92, 0xE0, 0x24, 0xE4, 0x8E, 0xF7, 0x82, 0xE0, 0x9B, 0x12, 0x1E, 0xE4, + 0x60, 0x00, 0xC1, 0xE0, 0x95, 0xE0, 0xAE, 0x2A, 0xC1, 0xE0, 0x49, 0xF0, + 0x23, 0xA1, 0x23, 0xA8, 0x04, 0xC4, 0xAD, 0x2A, 0x95, 0xE0, 0x6E, 0x00, + 0xA4, 0xCC, 0x2E, 0xE4, 0x9B, 0x12, 0x1E, 0xE4, 0x10, 0x02, 0x00, 0xE0, + 0x18, 0xE0, 0x86, 0xC7, 0x9C, 0xE0, 0x30, 0x09, 0x00, 0xE0, 0x9A, 0xE0, + 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, 0x07, 0xAE, 0x1E, 0xE4, 0x04, 0xAF, + 0xC4, 0x11, 0x1E, 0xE4, 0x1E, 0xA8, 0x69, 0xF0, 0x89, 0xE0, 0xCD, 0x11, + 0x56, 0xE0, 0x09, 0xAE, 0xE9, 0x11, 0x1E, 0xE4, 0x17, 0x9F, 0x42, 0xE0, + 0x85, 0xE0, 0x20, 0xAE, 0x1B, 0xE4, 0x89, 0xE0, 0xC1, 0x12, 0x1E, 0xE4, + 0xD0, 0x12, 0x1E, 0xE4, 0x17, 0x9F, 0xC5, 0x12, 0x08, 0xAE, 0x45, 0x4C, + 0x44, 0x20, 0x2E, 0xE4, 0xC1, 0xE0, 0x45, 0x4C, 0x44, 0x20, 0x2E, 0xE4, + 0x39, 0xF0, 0x23, 0xA1, 0x23, 0xA8, 0x60, 0x00, 0x2E, 0xE4, 0x08, 0xAE, + 0x44, 0x4C, 0x45, 0x20, 0xC2, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, 0x02, 0xA2, + 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x0E, 0x04, 0x84, 0xE1, 0x02, 0x00, + 0x22, 0xD0, 0xDA, 0xF7, 0x17, 0x9F, 0x15, 0x4D, 0x15, 0x21, 0xDF, 0x12, + 0xE6, 0x12, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x00, 0xA2, 0x17, 0x9F, + 0x16, 0x4D, 0x16, 0x21, 0x48, 0xD1, 0x2E, 0xE4, 0x0D, 0x04, 0xC2, 0xE0, + 0x45, 0xD1, 0x00, 0x00, 0x44, 0xD1, 0x40, 0x00, 0x4B, 0xD1, 0x00, 0x00, + 0x68, 0xD1, 0x00, 0x00, 0x18, 0xAE, 0x19, 0x00, 0x04, 0xE0, 0x00, 0x02, + 0x9A, 0xCA, 0x0C, 0x00, 0x4C, 0xD1, 0xC0, 0xCE, 0x84, 0xE1, 0x44, 0xCC, + 0x2E, 0xE4, 0xF8, 0xF7, 0xDB, 0x07, 0x18, 0xE4, 0x9C, 0xCA, 0x07, 0x13, + 0x90, 0xE1, 0xF9, 0xF7, 0x9B, 0xCA, 0xA0, 0xCA, 0xD6, 0x3C, 0xD7, 0x3C, + 0x00, 0xA2, 0x2E, 0xE4, 0x78, 0xF1, 0x82, 0x08, 0x1E, 0xE4, 0xD4, 0x3C, + 0x82, 0x08, 0x1E, 0xE4, 0x81, 0x13, 0x1E, 0xE4, 0xFF, 0x00, 0x09, 0xE0, + 0xA3, 0xCA, 0x28, 0xF1, 0xFE, 0x12, 0x1E, 0xE4, 0x04, 0xA2, 0xDB, 0x3E, + 0x1A, 0xF7, 0x02, 0xA1, 0x10, 0xAF, 0xA2, 0xCA, 0x1E, 0xE4, 0xFE, 0x12, + 0x1E, 0xE4, 0x00, 0xA2, 0xB1, 0x00, 0x04, 0xE0, 0x6A, 0xF0, 0x82, 0x08, + 0xDB, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0xD3, 0x3C, 0x1E, 0xE4, 0xD3, 0x3C, + 0xFF, 0x00, 0x08, 0xE0, 0x02, 0xA2, 0xC5, 0x07, 0x1E, 0xE4, 0x89, 0x07, + 0xD6, 0x3C, 0xD7, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x78, 0xF1, 0x82, 0x08, + 0x1E, 0xE4, 0xD4, 0x3C, 0x82, 0x08, 0x1E, 0xE4, 0x81, 0x13, 0x1E, 0xE4, + 0xFF, 0x00, 0x08, 0xE0, 0xA2, 0xCA, 0x28, 0xF1, 0x5A, 0x13, 0x1E, 0xE4, + 0xA8, 0xF0, 0xDB, 0x3C, 0x04, 0xA2, 0x58, 0xF0, 0x02, 0xA1, 0x20, 0xAF, + 0x1E, 0xE4, 0xEE, 0xF6, 0xFE, 0x12, 0x1E, 0xE4, 0xB1, 0x00, 0x04, 0xE0, + 0x4A, 0xF0, 0x82, 0x08, 0xFF, 0x00, 0x08, 0xE0, 0xDB, 0x28, 0xDB, 0x3C, + 0xA0, 0x05, 0x62, 0xE1, 0x2E, 0xE4, 0xD3, 0x3C, 0x82, 0xCA, 0x12, 0x3D, + 0x12, 0x35, 0x80, 0xCA, 0x12, 0x35, 0x84, 0xCA, 0x12, 0x3D, 0x12, 0x35, + 0x12, 0x3D, 0x12, 0x35, 0x86, 0xCA, 0x12, 0x3D, 0x03, 0xA0, 0x8B, 0xCA, + 0x08, 0xA2, 0x8B, 0xCA, 0xA2, 0x05, 0x00, 0xE0, 0x46, 0xE0, 0x03, 0xAF, + 0x48, 0xF0, 0x02, 0xA8, 0x8A, 0xCA, 0x94, 0xE0, 0x12, 0x25, 0x2E, 0xE4, + 0x12, 0x4D, 0x12, 0x25, 0x12, 0x4F, 0x12, 0x27, 0x10, 0xAE, 0x12, 0x4D, + 0x56, 0xE0, 0xFF, 0x00, 0x09, 0xE0, 0x31, 0xAF, 0x58, 0xD1, 0x00, 0x00, + 0x53, 0xD1, 0x2E, 0xE4, 0x14, 0xE0, 0xFF, 0x00, 0x04, 0xE0, 0x00, 0x01, + 0x5E, 0xD1, 0x00, 0x00, 0x5D, 0xD1, 0xB8, 0xCE, 0x04, 0xE0, 0x00, 0x00, + 0x5F, 0xD1, 0x00, 0x00, 0x20, 0x06, 0x0A, 0xE0, 0x18, 0xAE, 0x19, 0x00, + 0x4A, 0xD1, 0x00, 0x00, 0x57, 0xD1, 0xC0, 0xCE, 0x9C, 0xCA, 0x03, 0x00, + 0x4C, 0xD1, 0x00, 0x00, 0xC8, 0xF7, 0x9A, 0xCA, 0xDB, 0x07, 0x18, 0xE4, + 0x9C, 0xCA, 0x3A, 0xF7, 0x02, 0xA8, 0xAE, 0xCA, 0x2E, 0xE4, 0x00, 0xA2, + 0xDB, 0x07, 0x18, 0xE4, 0x80, 0x00, 0x04, 0xE0, 0x28, 0xE4, 0xD4, 0x28, + 0x58, 0xD1, 0x92, 0xCE, 0x16, 0xB6, 0xCD, 0x2A, 0x14, 0xE0, 0xFF, 0x01, + 0x04, 0xE0, 0x00, 0x00, 0x5E, 0xD1, 0x00, 0x00, 0x5D, 0xD1, 0xB8, 0xCE, + 0x04, 0xE0, 0x00, 0x00, 0x5F, 0xD1, 0x00, 0x00, 0x32, 0x06, 0x0A, 0xE0, + 0x18, 0xAE, 0x19, 0x00, 0x04, 0xA9, 0x04, 0xAE, 0xD2, 0x28, 0xC0, 0xCE, + 0x4C, 0xD1, 0x00, 0x00, 0x4A, 0xD1, 0xC2, 0xCE, 0xDB, 0x07, 0x18, 0xE4, + 0x9C, 0xCA, 0x03, 0x00, 0xA8, 0xF7, 0x9C, 0xCA, 0xC8, 0xF7, 0x9A, 0xCA, + 0xD2, 0x3C, 0x02, 0xA8, 0x04, 0xAF, 0xC2, 0xCA, 0xD4, 0x3C, 0x9E, 0xCA, + 0xD5, 0x3C, 0x94, 0xCA, 0xD7, 0x34, 0xD6, 0x0C, 0xD7, 0x00, 0xD5, 0x28, + 0xD4, 0x28, 0x8C, 0xCC, 0x90, 0xCC, 0xD6, 0x3C, 0xCD, 0x28, 0x28, 0xE4, + 0x8E, 0xCC, 0x92, 0xCC, 0x1E, 0xE4, 0x2E, 0xE4, 0xCD, 0x3C, 0x16, 0xE0, + 0xDE, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0xFD, 0x08, 0xAA, 0xCE, 0x00, 0xA2, + 0x2E, 0xE4, 0xDF, 0x3C, 0x48, 0x00, 0xC2, 0xE0, 0xDF, 0x4C, 0xDE, 0x24, + 0xE3, 0x28, 0xE3, 0x3C, 0xA8, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0xE1, 0x3C, + 0x00, 0xA2, 0x32, 0xF0, 0xE6, 0x3C, 0x44, 0x28, 0xE9, 0x3C, 0xE8, 0x3C, + 0x2A, 0xE4, 0xE1, 0x28, 0xE7, 0x3C, 0x45, 0x28, 0xC2, 0xE0, 0xE3, 0x28, + 0x24, 0xE4, 0xE3, 0x28, 0x44, 0x01, 0xC2, 0xE0, 0xE4, 0x28, 0x43, 0x01, + 0xE6, 0x28, 0x49, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x02, 0xA1, 0xE7, 0x4C, + 0x20, 0xAE, 0x02, 0xA1, 0xC0, 0x11, 0x1E, 0xE4, 0x42, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0x42, 0xE0, 0xE0, 0x2A, 0x20, 0xAE, 0xE9, 0x2A, 0xE3, 0x28, + 0x2E, 0xE4, 0x4E, 0x01, 0x10, 0xAE, 0xE8, 0x28, 0x23, 0xE4, 0xE7, 0x1A, + 0xEA, 0x3E, 0x15, 0xB6, 0x03, 0xA2, 0xE9, 0x4C, 0x21, 0xAE, 0x03, 0xA9, + 0x03, 0xAE, 0xEA, 0x2A, 0xE9, 0xF7, 0x4B, 0x01, 0xC1, 0xE0, 0x56, 0xE0, + 0xC2, 0xE0, 0x02, 0xA2, 0x4D, 0x01, 0xC2, 0xE0, 0xE8, 0x3E, 0x03, 0xA0, + 0xE8, 0x2A, 0x4A, 0x01, 0x03, 0xA0, 0xE9, 0x2A, 0x65, 0xF0, 0xE6, 0x1A, + 0x2E, 0xE4, 0xE8, 0x3E, 0x01, 0xA2, 0xE9, 0x3E, 0xE7, 0x18, 0xE9, 0x28, + 0x4A, 0xF1, 0xE1, 0x28, 0xC0, 0xE0, 0xCE, 0xF7, 0x9E, 0xFD, 0x32, 0xF0, + 0x20, 0xAE, 0x04, 0xA2, 0xE8, 0xF7, 0x4B, 0x01, 0xC2, 0xE0, 0x02, 0xA2, + 0x4D, 0x01, 0xC2, 0xE0, 0x4B, 0x01, 0xC0, 0xE0, 0x90, 0xE1, 0x4A, 0x01, + 0x2E, 0xE4, 0xE3, 0x3C, 0xA3, 0x28, 0xE8, 0xF7, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, + 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x03, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, + 0xA0, 0x00, 0x8F, 0x00, 0x8F, 0x00, 0x87, 0x00, 0x62, 0x00, 0x80, 0x00, + 0xD5, 0x00, 0xA0, 0x00, 0x80, 0x00, 0x74, 0x00, 0x74, 0x00, 0x6A, 0x00, + 0x2B, 0x00, 0x2B, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x2D, 0x00, + 0x2C, 0x00, 0x2C, 0x00, 0x2F, 0x00, 0x2F, 0x00, 0x2E, 0x00, 0x2E, 0x00, + 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x32, 0x00, 0x32, 0x00, + 0x31, 0x00, 0x31, 0x00, 0x90, 0xE1, 0x90, 0xE1, 0x33, 0x00, 0x32, 0x00, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0xE4, + 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x3C, 0x03, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x56, 0x03, 0x0E, 0xE4, 0x78, 0x00, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, + 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, 0x9A, 0xF0, 0x4A, 0x00, + 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, 0x00, 0xA2, 0xED, 0x3C, + 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0xC2, 0xE0, + 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0x5D, 0x00, 0xC3, 0xE0, + 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, 0x2A, 0x24, 0x71, 0xD0, + 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, 0x1E, 0xE4, 0x81, 0xE1, + 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, 0x59, 0x00, 0xC0, 0xE0, + 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x3C, 0x03, 0x00, 0xE0, 0x02, 0xAE, + 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, 0xC0, 0xE0, 0xEE, 0x3C, + 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, 0xC1, 0xE0, 0x5B, 0x00, + 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, 0x1E, 0xE4, 0x2A, 0xE4, + 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, 0x9E, 0xE0, 0x42, 0x01, + 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0xED, 0x5A, 0x03, 0xA2, + 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0xC2, 0xE0, 0x58, 0x00, + 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, 0x0E, 0xF0, 0x08, 0x00, + 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x98, 0xF1, + 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, 0x03, 0x00, 0x04, 0xE0, + 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, 0x0A, 0xE0, 0x20, 0xAE, + 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, 0x02, 0xA2, 0x4E, 0xF6, + 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, 0x03, 0xA1, 0x3E, 0xA2, + 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, 0x4E, 0xA2, 0x5B, 0xF3, + 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, 0x40, 0x00, 0x04, 0xE0, + 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, 0x8B, 0xF2, 0x03, 0xA1, + 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, 0xC1, 0xE0, 0x00, 0xA2, + 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, 0xCB, 0xF1, 0x5E, 0x00, + 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, 0x46, 0x00, 0x04, 0xE0, + 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, + 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, 0x04, 0xE0, 0x7B, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA1, 0x68, 0x00, + 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, 0x00, 0x00, 0x11, 0xD1, + 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, + 0x4E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, 0x2A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0xC0, 0xE0, + 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x31, 0x01, + 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, 0x5C, 0x03, 0x04, 0xE0, + 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0x04, 0xE0, 0x2E, 0xE4, + 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, 0x7C, 0xE6, 0x5E, 0x03, + 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, 0x11, 0x3D, 0x09, 0x0B, + 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, + 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x00, + 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, 0xEC, 0x88, 0x00, 0x0C, + 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xEE, 0x01, 0x07, 0xA1, 0xD6, 0xB6, + 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, 0x00, 0xE0, 0x36, 0xB6, + 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x14, 0x04, + 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, 0x44, 0x00, 0xC1, 0xE0, + 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, + 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, 0x17, 0x35, 0x56, 0xE0, + 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, 0x50, 0x01, 0xC2, 0xE0, + 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, + 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, 0x1A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x86, 0x01, + 0x47, 0x00, 0xC0, 0xE0, 0x90, 0x01, 0x1A, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, + 0x48, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x3E, 0xA2, 0x2E, 0xE4, 0x4A, 0x00, + 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x02, 0xA2, 0x2E, 0xE4, 0x70, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0x00, 0xA2, 0x76, 0x00, 0xC2, 0xE0, 0x20, 0xA2, + 0xC2, 0xE0, 0xFC, 0xA2, 0x72, 0x00, 0xC2, 0xE0, 0x71, 0x00, 0xC2, 0xE0, + 0xFA, 0xA2, 0x77, 0x00, 0x84, 0xE1, 0x0F, 0x27, 0x22, 0xD0, 0x2E, 0xE4, + 0x48, 0xF0, 0x4A, 0x00, 0xC0, 0xE0, 0xAA, 0x01, 0xC0, 0xE0, 0xE8, 0xF7, + 0x1F, 0x04, 0xC0, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, + 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x11, 0x00, + 0x04, 0xE0, 0x9D, 0x01, 0xAF, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, 0x3C, 0x04, + 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, + 0xE0, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, 0x45, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x3C, 0x04, 0x28, 0xE4, 0x04, 0xA1, 0x0E, 0xA8, 0x04, 0xAF, + 0xC0, 0xE0, 0x4A, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x48, 0xCA, 0x8E, 0xF9, + 0xE8, 0xF7, 0x11, 0x01, 0xAF, 0x01, 0x1E, 0xE4, 0xE8, 0xF7, 0x02, 0xA8, + 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, + 0xF8, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, 0xF8, 0xF7, 0x28, 0xCA, + 0x2E, 0xE4, 0x3C, 0x04, 0x42, 0x3C, 0x43, 0x34, 0x01, 0xC0, 0x2E, 0xE4, + 0x43, 0x2C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, 0x26, 0x1C, 0x2A, 0xE4, + 0x00, 0xC0, 0x42, 0x2E, 0x27, 0x18, 0x10, 0xAF, 0x4A, 0xE0, 0xB4, 0xF0, + 0x28, 0x1A, 0xFF, 0x00, 0x09, 0xE0, 0x74, 0xF0, 0xFE, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x34, 0xF0, 0x1E, 0xF1, 0x5D, 0x3C, 0x01, 0xC0, 0x2E, 0xE4, + 0x01, 0xC0, 0xEE, 0xF0, 0x5E, 0x3C, 0x01, 0xC0, 0x5F, 0x3C, 0x01, 0xC0, + 0xBE, 0xF0, 0x5E, 0x28, 0x5E, 0x1A, 0x5D, 0x2A, 0x01, 0xC0, 0x8E, 0xF0, + 0x5F, 0x2A, 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, 0x08, 0x08, 0xC2, 0xE0, + 0x2E, 0xE4, 0x00, 0xC0, 0x02, 0x08, 0x62, 0xE1, 0x0B, 0x08, 0xC3, 0xE0, + 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x02, 0xA2, 0x92, 0x9F, 0x00, 0x02, + 0x05, 0xE0, 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, 0x12, 0x9F, 0x12, 0x9F, + 0x12, 0x81, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0xC0, 0xE0, 0x00, 0x08, + 0xC2, 0xE0, 0x02, 0xA2, 0x1E, 0xE4, 0x2E, 0xE4, 0xE8, 0xF7, 0x00, 0x08, + 0x32, 0xA2, 0x20, 0x06, 0x60, 0xD1, 0x4E, 0x02, 0x40, 0xCE, 0x2E, 0xE4, + 0xC0, 0xCE, 0x18, 0xAE, 0x02, 0x00, 0x22, 0xD1, 0x00, 0x00, 0x21, 0xD1, + 0x02, 0xA8, 0x48, 0xCA, 0x80, 0x00, 0x23, 0xD1, 0x22, 0xAE, 0x04, 0xA2, + 0x2E, 0xE4, 0xE8, 0xF7, 0x8C, 0xCC, 0x72, 0xCC, 0x00, 0xA2, 0x9E, 0xCC, + 0x20, 0xAE, 0x10, 0xA8, 0x04, 0xE0, 0x8E, 0xCC, 0x6F, 0xD1, 0x4A, 0xCE, + 0x22, 0x93, 0x0A, 0xE0, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x03, 0x00, + 0x60, 0xA2, 0x2E, 0xE4, 0x00, 0x00, 0x6F, 0xD1, 0xEA, 0xF7, 0x02, 0xA8, + 0x50, 0xCA, 0x50, 0xCE, 0x20, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, + 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x50, 0xCE, 0x3D, 0x04, 0xC1, 0xE0, + 0x2E, 0xE4, 0x1C, 0x04, 0x00, 0x01, 0x0A, 0xE0, 0xD9, 0xF7, 0xEF, 0xA1, + 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, 0x61, 0x00, 0xC0, 0xE0, + 0x2A, 0xE4, 0xC2, 0x02, 0x72, 0x02, 0x1E, 0xE4, 0x1F, 0x00, 0x08, 0xE0, + 0x37, 0x03, 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0x04, + 0xC2, 0xE0, 0x12, 0xAE, 0xE8, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x27, 0x03, + 0x04, 0xA8, 0x10, 0x02, 0xC0, 0xE0, 0x2A, 0xE4, 0x08, 0xE0, 0x15, 0x02, + 0xC0, 0xE0, 0x18, 0xF1, 0x16, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, + 0x08, 0xE0, 0x13, 0x02, 0xC0, 0xE0, 0xBE, 0xF0, 0x14, 0x02, 0xC0, 0xE0, + 0x4A, 0xF0, 0x00, 0x01, 0x1E, 0xE4, 0x0B, 0x02, 0xC0, 0xE0, 0x3E, 0xF0, + 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, 0x72, 0x02, 0x10, 0x02, 0xC1, 0xE0, + 0x12, 0xAE, 0x37, 0x03, 0xC1, 0xE0, 0x56, 0xE0, 0x15, 0xAE, 0x03, 0xA8, + 0x07, 0xAE, 0x7F, 0xA8, 0x0B, 0xAF, 0x04, 0x02, 0x0F, 0xA8, 0x04, 0x02, + 0xC1, 0xE0, 0x56, 0xE0, 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x56, 0xE0, + 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x27, 0x03, 0x52, 0xE0, 0x1F, 0xAE, + 0x03, 0xA2, 0x92, 0xE0, 0x94, 0xE0, 0x60, 0x00, 0xC0, 0xE0, 0xEA, 0xF1, + 0x84, 0xE0, 0x8A, 0xF1, 0x06, 0xA8, 0x08, 0xAF, 0x21, 0xA8, 0x85, 0xE0, + 0x16, 0xE0, 0x1E, 0xA8, 0xC0, 0xE0, 0x0A, 0xF1, 0x56, 0xE0, 0x17, 0xE0, + 0x16, 0xE0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0x07, 0xA8, 0x1B, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x3A, 0xF0, 0x56, 0xE0, 0x03, 0xA8, 0x1B, 0xE0, + 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x1F, 0xAE, 0x03, 0xA2, + 0x44, 0x00, 0xC0, 0xE0, 0xC2, 0x02, 0x1E, 0xE4, 0xEA, 0xF0, 0x52, 0xE0, + 0x69, 0xF0, 0x21, 0x0B, 0x1E, 0xE4, 0xB8, 0xF0, 0x1E, 0xA8, 0x12, 0xAF, + 0x44, 0x00, 0xC0, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x38, 0xF0, + 0x08, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, 0x18, 0xE0, 0x88, 0xC7, + 0xA4, 0xCC, 0xFF, 0x00, 0x04, 0xAE, 0x02, 0xA0, 0x00, 0x05, 0x00, 0xE0, + 0xC2, 0xE0, 0x02, 0xA2, 0x1A, 0x04, 0xC2, 0xE0, 0xEA, 0xF7, 0x19, 0x04, + 0xC0, 0xE0, 0x18, 0x04, 0xC0, 0xE0, 0x18, 0x04, 0xC2, 0xE0, 0x02, 0xA2, + 0x1B, 0x04, 0xC0, 0xE0, 0xEA, 0xF7, 0x19, 0x04, 0x28, 0xAE, 0x08, 0xAF, + 0x1E, 0xA0, 0x20, 0xAF, 0xFF, 0xFF, 0x09, 0xE0, 0x1B, 0x04, 0xC1, 0xE0, + 0x56, 0xE0, 0x09, 0xAE, 0x09, 0xAF, 0x1F, 0xA0, 0xC0, 0xE0, 0x2E, 0xE4, + 0x1D, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0x02, 0x0A, 0xE0, 0x1C, 0x04, + 0xF0, 0xF7, 0x02, 0xA1, 0x28, 0xA2, 0x1C, 0x04, 0x00, 0x02, 0x0C, 0xE0, + 0x1C, 0x04, 0xC0, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0x2E, 0xE4, 0x02, 0xA8, 0x04, 0xAF, 0x44, 0x00, 0x60, 0x03, 0x0E, 0xE4, + 0xFA, 0x04, 0x0E, 0xE4, 0x68, 0x03, 0x0E, 0xE4, 0x64, 0x03, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6E, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x72, 0x03, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x76, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x96, 0x03, 0x1E, 0xE4, + 0xB6, 0x01, 0x1E, 0xE4, 0x65, 0x04, 0x1E, 0xE4, 0xAE, 0x03, 0x1E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0xAE, 0x09, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x26, 0x01, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x30, 0xD1, 0x4C, 0xCC, + 0x4A, 0xCC, 0x00, 0xA2, 0x1E, 0xE4, 0x00, 0x00, 0x31, 0xD1, 0x07, 0x00, + 0xCA, 0xF0, 0xB0, 0x04, 0x1E, 0xE4, 0x98, 0x03, 0x1E, 0xE4, 0x9D, 0xF0, + 0xB5, 0x03, 0x1E, 0xE4, 0x00, 0xA2, 0x60, 0x05, 0x1E, 0xE4, 0x90, 0x06, + 0x1E, 0xE4, 0x2E, 0xE4, 0x3A, 0x3C, 0x36, 0x3C, 0xC2, 0xE0, 0x00, 0xA2, + 0x6A, 0xE1, 0x60, 0x05, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x70, 0x00, + 0x40, 0x00, 0xC0, 0xE0, 0xAD, 0x04, 0x1E, 0xE4, 0x42, 0xE0, 0x17, 0xAE, + 0x46, 0x00, 0x05, 0xE0, 0x42, 0xE0, 0x03, 0xAE, 0x00, 0x1F, 0x05, 0xE0, + 0x12, 0xD1, 0xA0, 0x08, 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x03, 0x00, + 0x13, 0xD1, 0x40, 0x00, 0xB0, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, 0xAD, 0x04, + 0x4C, 0x01, 0x1E, 0xE4, 0xC9, 0x09, 0x1E, 0xE4, 0x08, 0xE4, 0x86, 0xA1, + 0x4E, 0xBA, 0x2E, 0xE4, 0x08, 0xE4, 0x9C, 0xA1, 0x4E, 0xBA, 0x13, 0x04, + 0x08, 0xE4, 0x9A, 0xA1, 0x4E, 0xBA, 0x13, 0x04, 0x08, 0xE4, 0xAC, 0xA1, + 0x4E, 0xBA, 0x13, 0x04, 0x11, 0xAE, 0x4F, 0xBA, 0x4E, 0xBA, 0x13, 0x04, + 0x4F, 0xBA, 0x4E, 0xBA, 0x00, 0x3C, 0x56, 0xE0, 0x7E, 0xBA, 0x01, 0x3C, + 0x56, 0xE0, 0x11, 0xAE, 0x4F, 0xBA, 0x4E, 0xBA, 0x03, 0x3C, 0x02, 0x34, + 0x4E, 0xBA, 0x12, 0x3E, 0x55, 0xE0, 0x11, 0xAE, 0x13, 0x3E, 0x55, 0xE0, + 0x11, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x11, 0xAE, 0x4F, 0xBA, 0x4E, 0xBA, + 0x4F, 0xBA, 0x56, 0xE0, 0x21, 0xAE, 0x4F, 0xBA, 0x05, 0x3C, 0x04, 0x34, + 0x56, 0xE0, 0x31, 0xAE, 0x56, 0xE0, 0x11, 0xAE, 0x4F, 0xBA, 0x4E, 0xBA, + 0x4F, 0xBA, 0x56, 0xE0, 0x21, 0xAE, 0x4F, 0xBA, 0x07, 0x3C, 0x06, 0x34, + 0x56, 0xE0, 0x31, 0xAE, 0x7E, 0xBA, 0x09, 0x3C, 0x08, 0x34, 0x7E, 0xBA, + 0x08, 0xAE, 0x08, 0xAF, 0x1E, 0xA0, 0x12, 0x28, 0x08, 0xAF, 0x1E, 0xA0, + 0x13, 0x28, 0x10, 0x3C, 0x22, 0x3C, 0x10, 0x28, 0x11, 0x3C, 0x08, 0xAE, + 0x11, 0x28, 0x27, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, 0x28, 0x3C, 0x08, 0xAF, + 0x1E, 0xA0, 0x23, 0x3C, 0x26, 0x3C, 0x18, 0xE0, 0x28, 0x82, 0x27, 0x84, + 0x6B, 0xE1, 0x2E, 0xE4, 0x0D, 0x3C, 0x02, 0xA2, 0x11, 0xAE, 0x4F, 0xBA, + 0x4E, 0xBA, 0x2E, 0xE4, 0x56, 0xE0, 0x21, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, + 0xDA, 0xF1, 0x56, 0xE0, 0x31, 0xAE, 0x4F, 0xBA, 0x25, 0x04, 0x84, 0xE1, + 0x07, 0x00, 0x22, 0xD0, 0x39, 0xD0, 0x90, 0xE1, 0x90, 0xE1, 0x4E, 0xBA, + 0x88, 0xF0, 0x2B, 0x3C, 0x4E, 0xBA, 0x00, 0x00, 0x51, 0x3C, 0x4E, 0xBA, + 0x20, 0x3C, 0x4E, 0xBA, 0x4E, 0xBA, 0x2E, 0xE4, 0x50, 0x3C, 0x4E, 0xBA, + 0x20, 0x3C, 0x02, 0xA2, 0x4E, 0xBA, 0x4E, 0xBA, 0x2E, 0xE4, 0x50, 0x3C, + 0x00, 0xA2, 0x51, 0x3C, 0x4F, 0xBA, 0x4E, 0xBA, 0x2E, 0xE4, 0x6B, 0xE1, + 0x21, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x11, 0xAE, 0x56, 0xE0, 0x31, 0xAE, + 0x4F, 0xBA, 0x56, 0xE0, 0x00, 0x03, 0x61, 0xE1, 0x7E, 0xBA, 0x0A, 0x3C, + 0x18, 0xE0, 0x80, 0x01, 0x82, 0xE1, 0x51, 0x84, 0x59, 0x04, 0x84, 0xE1, + 0x44, 0xCC, 0x02, 0xA1, 0x04, 0xA1, 0x0A, 0x28, 0x11, 0x3D, 0x5E, 0xBA, + 0x0A, 0x28, 0x90, 0xE1, 0x2A, 0xF0, 0x0A, 0x3C, 0x84, 0xE1, 0x44, 0xCC, + 0x02, 0xA1, 0x26, 0xE4, 0x90, 0xE1, 0x90, 0xE1, 0x4E, 0xBA, 0x62, 0x04, + 0x00, 0xA2, 0xD2, 0x06, 0x1E, 0xE4, 0x2E, 0xE4, 0x30, 0xD1, 0x4C, 0xCC, + 0x4A, 0xCC, 0x82, 0x3C, 0xC0, 0xE0, 0x00, 0x00, 0x31, 0xD1, 0x07, 0x00, + 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x5A, 0x00, 0x07, 0x09, 0x1E, 0xE4, + 0xA0, 0x0A, 0x1E, 0xE4, 0x7C, 0x09, 0x1E, 0xE4, 0x17, 0x0A, 0x1E, 0xE4, + 0x50, 0x09, 0x1E, 0xE4, 0x97, 0x09, 0x1E, 0xE4, 0x18, 0xE4, 0x60, 0x28, + 0x99, 0x04, 0x0A, 0xE4, 0x1E, 0xE4, 0x07, 0x0A, 0x1E, 0xE4, 0x30, 0x0B, + 0x1E, 0xE4, 0x09, 0x0A, 0x1E, 0xE4, 0xD4, 0x09, 0x33, 0x3C, 0xFE, 0xA2, + 0x68, 0xF0, 0xDB, 0x04, 0x1E, 0xE4, 0x7E, 0xF0, 0x61, 0x0A, 0x1E, 0xE4, + 0x1E, 0xE4, 0xE2, 0x06, 0x1E, 0xE4, 0x7B, 0x02, 0x1E, 0xE4, 0x97, 0x09, + 0x1E, 0xE4, 0x66, 0x05, 0x4A, 0xC8, 0xAF, 0x0A, 0x1E, 0xE4, 0xA7, 0x06, + 0xC2, 0xE0, 0x56, 0xE0, 0x20, 0xAE, 0x4D, 0xC8, 0x66, 0x05, 0x1E, 0xE4, + 0x2E, 0xE4, 0x53, 0x00, 0x76, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x6A, 0xE1, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x1E, 0xAE, 0x06, 0xA2, + 0x4E, 0x02, 0x1E, 0xE4, 0xC0, 0xE0, 0x00, 0x06, 0x60, 0xD1, 0xC0, 0xCE, + 0xC1, 0xE0, 0xB1, 0x3C, 0xB0, 0x34, 0x60, 0x00, 0xB3, 0x3E, 0xB2, 0x36, + 0x15, 0xAE, 0x61, 0x00, 0xC0, 0xE0, 0xB5, 0x3C, 0xB4, 0x34, 0x42, 0xE0, + 0xB6, 0x34, 0xBB, 0x3C, 0xBA, 0x34, 0x48, 0x00, 0xBB, 0x2C, 0xB7, 0x3C, + 0x00, 0xFE, 0x08, 0xE0, 0x1E, 0xE4, 0xBC, 0x3C, 0xFF, 0x01, 0x08, 0xE0, + 0x41, 0x05, 0x1E, 0xE4, 0x7D, 0xF0, 0x5A, 0x06, 0x2E, 0xE4, 0x02, 0xA2, + 0x28, 0x05, 0x1E, 0xE4, 0x06, 0xA2, 0x2E, 0xE4, 0x6A, 0xE1, 0x00, 0xA2, + 0x00, 0x06, 0x60, 0xD1, 0xC0, 0xCE, 0x1E, 0xAE, 0x51, 0x00, 0xC2, 0xE0, + 0x48, 0x00, 0xC0, 0xE0, 0x08, 0xE0, 0xB6, 0x34, 0xBB, 0x3C, 0xBA, 0x34, + 0x08, 0xE0, 0xBB, 0x28, 0xB7, 0x3C, 0x00, 0xFE, 0x1F, 0x06, 0x1E, 0xE4, + 0xBC, 0x3C, 0xFF, 0x01, 0x1E, 0xE4, 0x41, 0x05, 0x1E, 0xE4, 0x78, 0xF0, + 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, 0x28, 0x05, 0xFD, 0x04, 0x1E, 0xE4, + 0x2E, 0xE4, 0x00, 0xA2, 0x04, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x70, 0xE4, + 0x0E, 0xAE, 0xBF, 0x28, 0x24, 0xCE, 0x80, 0x00, 0x20, 0xCE, 0xB7, 0x4C, + 0xB6, 0x24, 0x22, 0xCE, 0x02, 0xAE, 0x06, 0xA8, 0xCE, 0x4C, 0xCD, 0x24, + 0xF8, 0xF7, 0x28, 0xCA, 0x26, 0xCE, 0x22, 0xA0, 0x00, 0x02, 0x00, 0xE0, + 0xB7, 0x4C, 0xB6, 0x24, 0xB5, 0x1C, 0xB4, 0x14, 0xB7, 0x3C, 0xB6, 0x34, + 0xB6, 0x34, 0xB1, 0x4C, 0xB0, 0x24, 0x54, 0xF0, 0xBF, 0x28, 0x00, 0x00, + 0x4C, 0xD0, 0xB7, 0x3C, 0x16, 0xE0, 0xBF, 0x28, 0x6E, 0xCC, 0x0E, 0xAE, + 0x2E, 0xE4, 0xC1, 0x28, 0x2E, 0xE4, 0xBF, 0x3C, 0xC0, 0xE0, 0x92, 0xCE, + 0xBF, 0x3C, 0x00, 0xA2, 0x1E, 0xE4, 0xCE, 0x3C, 0xCD, 0x34, 0x43, 0x00, + 0x28, 0xE1, 0xFD, 0x04, 0x1E, 0xE4, 0xFD, 0x04, 0xBC, 0x2C, 0x81, 0xE1, + 0x20, 0x20, 0x71, 0xD0, 0x84, 0xE1, 0x44, 0xCC, 0x74, 0xF0, 0x02, 0xA1, + 0x90, 0xE1, 0x90, 0xE1, 0x4E, 0xBA, 0x3E, 0x05, 0x20, 0xAE, 0x95, 0x14, + 0x04, 0xE0, 0x2E, 0xE4, 0x34, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x9E, 0xCC, + 0x35, 0xD0, 0x00, 0x00, 0x33, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0xFF, 0x00, + 0x36, 0xD0, 0x00, 0x00, 0x39, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, + 0x4C, 0xD0, 0x01, 0x00, 0x4B, 0xD0, 0x00, 0x00, 0x47, 0xD0, 0x00, 0x00, + 0x46, 0xD0, 0x00, 0x00, 0x2E, 0xE4, 0x00, 0x00, 0x49, 0xD1, 0x00, 0x00, + 0xBA, 0x34, 0xC2, 0x08, 0xBB, 0x4C, 0xBA, 0x24, 0xBB, 0x4C, 0xBA, 0x24, + 0x7E, 0xF0, 0xBB, 0x3C, 0xBB, 0x3C, 0xBA, 0x34, 0xC6, 0x0C, 0xC5, 0x04, + 0xBA, 0x24, 0x74, 0xF0, 0xB5, 0x1C, 0xB4, 0x14, 0xBA, 0x34, 0xB3, 0x1C, + 0xB2, 0x14, 0xBB, 0x4C, 0xC2, 0xE0, 0xBB, 0x4C, 0xBA, 0x24, 0xBB, 0x3C, + 0x2E, 0xE4, 0x52, 0x00, 0xC2, 0xE0, 0x48, 0x00, 0x2E, 0xE4, 0xC6, 0x3C, + 0xC5, 0x34, 0x00, 0xA2, 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0x29, 0xA8, 0xF0, + 0xFF, 0xFF, 0x09, 0xE0, 0x11, 0x2B, 0x20, 0xAE, 0x08, 0xE0, 0x11, 0x29, + 0xFE, 0xF0, 0x42, 0xE0, 0x09, 0xE0, 0x11, 0x2B, 0x20, 0xAE, 0xFF, 0x00, + 0x11, 0x2B, 0x10, 0xAE, 0x42, 0xE0, 0xFF, 0xFF, 0x42, 0xE0, 0x11, 0xAF, + 0x00, 0xFF, 0x09, 0xE0, 0x31, 0xAF, 0x49, 0xE0, 0x2B, 0xE4, 0xC7, 0x2A, + 0x49, 0xE0, 0x93, 0xE0, 0xFF, 0x00, 0x09, 0xE0, 0x95, 0xE0, 0xFF, 0x00, + 0x09, 0xE0, 0x21, 0xAF, 0xFF, 0x00, 0x09, 0xE0, 0x11, 0xAF, 0x49, 0xE0, + 0x56, 0xE0, 0x10, 0xAE, 0xFF, 0x00, 0x08, 0xE0, 0x10, 0xAE, 0x56, 0xE0, + 0x85, 0xE0, 0x10, 0xAE, 0x49, 0xE0, 0x2E, 0xE4, 0x56, 0xE0, 0x83, 0xE0, + 0x29, 0xCA, 0x2E, 0xE4, 0x46, 0xE0, 0x0F, 0xA8, 0x20, 0xCE, 0x30, 0x08, + 0x11, 0xD1, 0xF9, 0xF7, 0x04, 0xE0, 0x45, 0xE0, 0xB5, 0x4E, 0xB4, 0x26, + 0x25, 0xCE, 0x03, 0xAF, 0x65, 0xE0, 0x40, 0x00, 0x40, 0xA2, 0xD5, 0x05, + 0x1E, 0xE4, 0xC0, 0x3E, 0xC0, 0x28, 0x24, 0xCE, 0x26, 0xE4, 0xC0, 0x18, + 0xB0, 0x24, 0x22, 0xCE, 0x30, 0x08, 0x00, 0xE0, 0xD5, 0x05, 0x1E, 0xE4, + 0x20, 0xCE, 0xB1, 0x4C, 0x06, 0xA8, 0x43, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x28, 0xCA, 0x26, 0xCE, 0x02, 0xA0, 0x02, 0xAE, 0xCA, 0x3C, 0xC9, 0x34, + 0x2E, 0xE4, 0xF8, 0xF7, 0x49, 0x00, 0xC0, 0xE0, 0xBD, 0x3C, 0x00, 0xA2, + 0x45, 0x00, 0xC0, 0xE0, 0xCC, 0x3C, 0xCB, 0x34, 0x49, 0x00, 0xC0, 0xE0, + 0xBE, 0x30, 0x04, 0xAF, 0xCC, 0x1C, 0xCB, 0x10, 0xB9, 0x3C, 0xB8, 0x34, + 0xB8, 0x26, 0xBD, 0x3E, 0x11, 0xB6, 0xBD, 0x2A, 0x33, 0xF0, 0xCA, 0x1E, + 0xC9, 0x16, 0xB9, 0x4E, 0xC4, 0x1E, 0xC3, 0x16, 0xB3, 0x0E, 0xB2, 0x06, + 0xC1, 0x3C, 0xBE, 0x28, 0xC3, 0xF1, 0x00, 0xA2, 0x17, 0xE0, 0x1B, 0xE0, + 0x5D, 0x00, 0xC1, 0xE0, 0xF8, 0xF5, 0xBD, 0x28, 0x48, 0xF1, 0x52, 0xE0, + 0x5C, 0x00, 0xC0, 0xE0, 0xCA, 0x01, 0x1E, 0xE4, 0xC0, 0xE0, 0x8A, 0xF5, + 0x00, 0x40, 0x08, 0xE0, 0xC2, 0xE0, 0x00, 0x40, 0x0A, 0xE0, 0x5D, 0x00, + 0xBD, 0x3C, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, 0x09, 0xE0, 0x5D, 0x00, + 0xC1, 0xE0, 0xEE, 0xF4, 0x18, 0xA2, 0x2E, 0xE4, 0xC9, 0xF7, 0x00, 0x40, + 0xBB, 0x4C, 0xBA, 0x24, 0xC4, 0x3C, 0xC3, 0x34, 0xDE, 0x05, 0x1E, 0xE4, + 0x00, 0x00, 0x27, 0xD0, 0xBA, 0x24, 0xB8, 0xF2, 0x01, 0x00, 0x27, 0xD0, + 0x95, 0xE0, 0xB3, 0x05, 0x1E, 0xE4, 0xBB, 0x4C, 0x02, 0xAF, 0x84, 0xE0, + 0xB7, 0x05, 0x1E, 0xE4, 0x84, 0xE0, 0x92, 0xE0, 0x30, 0x08, 0x00, 0xE0, + 0xC5, 0x34, 0x80, 0x05, 0x1E, 0xE4, 0x02, 0xA8, 0xB3, 0x4E, 0xB2, 0x26, + 0x86, 0xF1, 0xC6, 0x3C, 0xC6, 0x4C, 0xC5, 0x24, 0x42, 0xF1, 0x46, 0xE0, + 0xC3, 0x34, 0xC6, 0x3C, 0xC5, 0x34, 0x18, 0xA0, 0x27, 0xD0, 0xBB, 0x4C, + 0xBA, 0x24, 0xC4, 0x3C, 0x27, 0xD0, 0xDE, 0x05, 0x1E, 0xE4, 0x00, 0x00, + 0x2E, 0xE4, 0x00, 0xA2, 0x48, 0xF0, 0x01, 0x00, 0xC6, 0x3C, 0xC5, 0x34, + 0x00, 0xA2, 0x6B, 0xE1, 0xC7, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0xBA, 0x24, 0xC4, 0x3C, 0xC3, 0x34, 0x40, 0xA2, 0x1E, 0xE4, 0x00, 0x00, + 0x27, 0xD0, 0xBB, 0x4C, 0x08, 0xE4, 0x01, 0x00, 0x27, 0xD0, 0xDE, 0x05, + 0x1E, 0xE4, 0xBB, 0x4C, 0xBA, 0x24, 0x8E, 0x06, 0xB7, 0x05, 0x1E, 0xE4, + 0x95, 0xE0, 0xB3, 0x05, 0x00, 0xE0, 0x02, 0xAF, 0x0C, 0xA0, 0x84, 0xE0, + 0x02, 0xA8, 0x84, 0xE0, 0x92, 0xE0, 0x30, 0x08, 0xFF, 0xFF, 0x08, 0xE0, + 0x80, 0x05, 0x1E, 0xE4, 0xC2, 0x28, 0xF4, 0xF0, 0x40, 0xA1, 0xC2, 0x3C, + 0xBB, 0x4C, 0xBA, 0x24, 0xC4, 0x3C, 0xC3, 0x34, 0xDE, 0x05, 0x1E, 0xE4, + 0x00, 0x00, 0x27, 0xD0, 0x00, 0xA2, 0x48, 0xF0, 0x01, 0x00, 0x27, 0xD0, + 0x2E, 0xE4, 0x02, 0xA2, 0x6B, 0xE1, 0x2E, 0xE4, 0x12, 0x20, 0x74, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x71, 0x00, 0xC2, 0xE0, 0x13, 0x4C, + 0x6D, 0x00, 0xC2, 0xE0, 0x72, 0x00, 0xC2, 0xE0, 0x77, 0x00, 0xC2, 0xE0, + 0x76, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x73, 0x00, 0xC2, 0xE0, 0x06, 0xA2, + 0x00, 0xA2, 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0xFE, 0xA2, + 0x75, 0x00, 0xC2, 0xE0, 0x33, 0x28, 0x79, 0x00, 0xC2, 0xE0, 0x78, 0x00, + 0xC2, 0xE0, 0x82, 0x28, 0x71, 0x00, 0xC2, 0xE0, 0x73, 0x00, 0xC2, 0xE0, + 0x20, 0x28, 0x72, 0x00, 0x34, 0x28, 0x76, 0x00, 0xC2, 0xE0, 0x02, 0xA2, + 0x13, 0x4C, 0x12, 0x20, 0x77, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, + 0x6F, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x3A, 0x4C, 0x36, 0x24, 0x75, 0x00, + 0xC2, 0xE0, 0x2E, 0xAE, 0x0D, 0x28, 0x70, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0x7B, 0x00, 0x4A, 0xCC, 0x00, 0xA2, 0x2E, 0xE4, 0x76, 0x00, + 0x25, 0x3C, 0x24, 0x3C, 0x50, 0x3C, 0x4C, 0xCC, 0x80, 0x3C, 0x29, 0x3C, + 0x6B, 0x3C, 0x6A, 0x3C, 0x0C, 0xA2, 0x51, 0x3C, 0xFE, 0xA2, 0x82, 0x3C, + 0x34, 0x3C, 0xFC, 0xA2, 0x2E, 0xE4, 0x20, 0x3C, 0x70, 0x07, 0x0D, 0xE4, + 0x15, 0x04, 0x1E, 0xE4, 0x07, 0xA8, 0x05, 0xAF, 0x65, 0x00, 0xC1, 0xE0, + 0x70, 0x07, 0x09, 0xE4, 0x15, 0xB6, 0x20, 0x28, 0x26, 0x05, 0x1E, 0xE4, + 0x58, 0xF0, 0x2B, 0x28, 0x02, 0xCF, 0x18, 0xA2, 0x70, 0x07, 0x08, 0xE4, + 0x04, 0xE4, 0x34, 0x3C, 0x33, 0x09, 0x1E, 0xE4, 0x2E, 0x0A, 0x18, 0xE4, + 0x60, 0x28, 0x70, 0x07, 0x21, 0x0B, 0x1E, 0xE4, 0xD6, 0x07, 0x1E, 0xE4, + 0x00, 0x03, 0x05, 0xE0, 0x06, 0xA2, 0x9B, 0xF0, 0x1E, 0xE4, 0x34, 0x28, + 0x75, 0x0B, 0x1E, 0xE4, 0x28, 0x28, 0xE3, 0x07, 0x1E, 0xE4, 0x9D, 0x0B, + 0xC8, 0xF1, 0x2B, 0x28, 0x25, 0x3C, 0x02, 0xA1, 0x4A, 0x08, 0x1E, 0xE4, + 0x3E, 0x04, 0x1E, 0xE4, 0x56, 0xE0, 0x11, 0xAE, 0x4F, 0xBA, 0x4E, 0xBA, + 0x4F, 0xBA, 0x56, 0xE0, 0x21, 0xAE, 0x4F, 0xBA, 0x12, 0xB6, 0x2B, 0x2A, + 0x56, 0xE0, 0x31, 0xAE, 0x0C, 0x3C, 0x0B, 0x34, 0x0C, 0x3C, 0x0B, 0x34, + 0xB7, 0x07, 0x1E, 0xE4, 0x00, 0xA2, 0x7E, 0xBA, 0x1E, 0xE4, 0xB7, 0x07, + 0x1E, 0xE4, 0x02, 0xA2, 0xE8, 0xF7, 0x02, 0xA8, 0x04, 0xCB, 0xDE, 0x07, + 0x28, 0xF1, 0x74, 0x07, 0x18, 0xE4, 0x2B, 0x28, 0x08, 0xA8, 0x04, 0xCB, + 0x02, 0xCF, 0x12, 0xA2, 0xAA, 0xF0, 0x10, 0xA8, 0x04, 0xCB, 0xEA, 0xF7, + 0x1E, 0xE4, 0x02, 0xA8, 0x08, 0xAF, 0x04, 0xCB, 0x18, 0xE4, 0x06, 0xA8, + 0x04, 0xCB, 0xB7, 0x07, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x98, 0x07, + 0x60, 0x28, 0x10, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x6A, 0x28, 0x66, 0x3C, + 0x02, 0xA2, 0xBA, 0xF0, 0x1E, 0xE4, 0x65, 0x3C, 0x1A, 0xE0, 0x6B, 0x4C, + 0x1E, 0xE4, 0x92, 0x0A, 0x1E, 0xE4, 0x4B, 0x0A, 0x0E, 0xE4, 0x61, 0x07, + 0x0A, 0xE4, 0x7F, 0x07, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x2F, 0x07, + 0x86, 0x0A, 0x1E, 0xE4, 0x3A, 0xF0, 0x60, 0x28, 0x97, 0x09, 0x1E, 0xE4, + 0x0C, 0x09, 0x1E, 0xE4, 0x33, 0x3C, 0x34, 0x28, 0xBC, 0x09, 0x1E, 0xE4, + 0x2E, 0xE4, 0x02, 0xA2, 0xAF, 0x0A, 0x1E, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, + 0x42, 0xCF, 0x06, 0xA2, 0x04, 0xCB, 0x02, 0xCF, 0x14, 0xA2, 0x24, 0x02, + 0x29, 0x28, 0x2E, 0xE4, 0xEA, 0xF7, 0x02, 0xA8, 0x03, 0xA1, 0x26, 0x2A, + 0x29, 0x3C, 0x02, 0xA0, 0x24, 0x28, 0x96, 0x07, 0x00, 0xE4, 0x46, 0xE0, + 0x04, 0xE4, 0x27, 0x18, 0x24, 0x3C, 0x02, 0xA0, 0x25, 0x3C, 0x02, 0xA1, + 0x25, 0x28, 0x94, 0x07, 0x96, 0x07, 0x04, 0xE4, 0x24, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x02, 0xA0, 0x82, 0x28, + 0x80, 0x3C, 0x02, 0xA2, 0x0A, 0xE4, 0x3A, 0x4C, 0x36, 0x20, 0x82, 0x3C, + 0xAC, 0x07, 0x08, 0xE4, 0x20, 0x28, 0xA8, 0x07, 0xB4, 0x07, 0x0E, 0xE4, + 0x42, 0xCF, 0x06, 0xA2, 0xB4, 0x07, 0x0E, 0xE4, 0x42, 0xCF, 0x02, 0xA2, + 0xB0, 0x03, 0xC0, 0xE0, 0x42, 0xCF, 0x04, 0xA2, 0x46, 0xCF, 0xB1, 0x03, + 0xC0, 0xE0, 0x44, 0xCF, 0x10, 0xAE, 0x2E, 0xE4, 0x02, 0xCF, 0x14, 0xA2, + 0x26, 0xE4, 0x0C, 0x4C, 0x0B, 0x20, 0x30, 0xCE, 0x0B, 0x20, 0x44, 0xCC, + 0xFF, 0x00, 0x04, 0xE0, 0x04, 0xAF, 0x00, 0x04, 0x02, 0xE0, 0x0C, 0x4C, + 0x04, 0xAF, 0x0C, 0x4C, 0x0B, 0x20, 0x62, 0xF0, 0xCD, 0x07, 0x84, 0xE1, + 0x44, 0xCC, 0x02, 0xA1, 0x0C, 0x4C, 0x0B, 0x20, 0x32, 0xCE, 0x7E, 0xBA, + 0x0B, 0x34, 0x0C, 0xB6, 0x00, 0x04, 0x02, 0xE0, 0x20, 0xAE, 0x20, 0x28, + 0x2E, 0xE4, 0x0C, 0x3C, 0x27, 0x4C, 0x56, 0xE0, 0x11, 0xAE, 0x28, 0x2A, + 0x10, 0xAE, 0x25, 0x28, 0x2E, 0xE4, 0x00, 0xCF, 0x00, 0xA2, 0x2E, 0xE4, + 0x06, 0xCF, 0x24, 0x4C, 0x08, 0xAE, 0x92, 0xB6, 0x64, 0x4E, 0x61, 0x2A, + 0x04, 0xE0, 0x78, 0x01, 0xC2, 0xE0, 0x0C, 0xA9, 0x0E, 0xA2, 0x79, 0x01, + 0xC2, 0xE0, 0x04, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0x23, 0x4C, 0x22, 0x20, 0x25, 0x01, 0x20, 0x28, 0xC9, 0x0A, + 0x1E, 0xE4, 0x01, 0x01, 0x04, 0x01, 0xC2, 0xE0, 0x06, 0xAE, 0x02, 0xA8, + 0xC2, 0xE0, 0x0E, 0xA2, 0x64, 0x01, 0x1E, 0xE4, 0x02, 0x03, 0xC2, 0xE0, + 0x02, 0xA2, 0x12, 0x03, 0x31, 0x28, 0x80, 0x03, 0xC2, 0xE0, 0x32, 0x28, + 0xC2, 0xE0, 0x00, 0xA2, 0x83, 0x03, 0xC2, 0xE0, 0x20, 0x2A, 0x0E, 0xAE, + 0x0E, 0xA2, 0x02, 0x03, 0xC2, 0xE0, 0x56, 0xE0, 0x07, 0xAE, 0x07, 0xA8, + 0x21, 0x0B, 0x1E, 0xE4, 0x35, 0x28, 0x04, 0x02, 0x34, 0x28, 0x16, 0x02, + 0xC2, 0xE0, 0x16, 0xB6, 0x23, 0x4C, 0x22, 0x20, 0x14, 0x02, 0xC2, 0xE0, + 0xC2, 0xE0, 0x00, 0xA2, 0x05, 0x02, 0xC2, 0xE0, 0x10, 0x02, 0xC2, 0xE0, + 0x02, 0xA2, 0x08, 0x02, 0x11, 0x02, 0xC2, 0xE0, 0x41, 0x4C, 0x40, 0x20, + 0x12, 0x02, 0xC2, 0xE0, 0x43, 0x4C, 0x42, 0x20, 0x1E, 0xE4, 0xD6, 0x0A, + 0x1E, 0xE4, 0x04, 0xA2, 0x1E, 0xE4, 0x52, 0xB6, 0x16, 0xB6, 0x21, 0x0B, + 0x17, 0x02, 0xC2, 0xE0, 0x50, 0x28, 0xE7, 0x0A, 0xC2, 0xE0, 0x02, 0xA2, + 0x8E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x06, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x93, 0x3C, 0x95, 0x3C, + 0x00, 0xA2, 0x3C, 0x01, 0x83, 0xC7, 0x51, 0x84, 0x52, 0x3C, 0x94, 0x3C, + 0x02, 0xA1, 0x2A, 0x28, 0x2A, 0x3C, 0x18, 0xE0, 0x00, 0xA2, 0x2A, 0x3C, + 0xAA, 0x08, 0x04, 0xE4, 0x68, 0xF0, 0x06, 0xA1, 0x93, 0x28, 0x52, 0x3C, + 0x02, 0xA0, 0x94, 0x28, 0x93, 0x3C, 0x00, 0xA2, 0x18, 0xE0, 0x83, 0xC7, + 0x93, 0x84, 0x94, 0x3C, 0x52, 0x28, 0x96, 0x3C, 0x42, 0xE0, 0x94, 0x2A, + 0x60, 0xE1, 0xA1, 0x08, 0x0A, 0xE4, 0x04, 0xA1, 0x52, 0x2A, 0x02, 0xAE, + 0x95, 0x28, 0xA0, 0x08, 0x82, 0xE1, 0x91, 0x84, 0x91, 0x3C, 0x42, 0xE0, + 0x61, 0xE1, 0x91, 0x3C, 0x18, 0xE0, 0x40, 0x00, 0x92, 0xE0, 0x91, 0x0C, + 0x82, 0xE0, 0x00, 0x03, 0x42, 0xE0, 0x52, 0x2A, 0x02, 0xAE, 0x96, 0x28, + 0x40, 0x00, 0x82, 0xE1, 0x92, 0x84, 0x92, 0x3C, 0x3F, 0x00, 0x22, 0xD0, + 0x92, 0x3C, 0x18, 0xE0, 0xC3, 0xE0, 0x92, 0x2A, 0x9A, 0x08, 0x84, 0xE1, + 0x10, 0x29, 0x92, 0x3E, 0x03, 0xA0, 0x3E, 0x01, 0x02, 0x29, 0x94, 0xE0, + 0x42, 0xE0, 0x83, 0xE0, 0x90, 0xE1, 0x00, 0xA2, 0x3F, 0x01, 0xC2, 0xE0, + 0x0E, 0xE4, 0x52, 0x3C, 0x02, 0xA0, 0x52, 0x28, 0x02, 0xA0, 0x95, 0x28, + 0x90, 0xE1, 0x6B, 0x08, 0x93, 0x3C, 0x02, 0xA0, 0x93, 0x28, 0x95, 0x3C, + 0x00, 0xA2, 0x90, 0xE1, 0x56, 0x08, 0x0E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, + 0x3C, 0x01, 0xC2, 0xE0, 0xC0, 0xE0, 0x21, 0x3C, 0x61, 0x00, 0xC0, 0xE0, + 0xAD, 0x04, 0x1E, 0xE4, 0x35, 0x3C, 0x60, 0x00, 0x11, 0xD1, 0x20, 0xCE, + 0x42, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, 0x00, 0x02, + 0xC0, 0xE0, 0xAD, 0x04, 0x1E, 0xE4, 0x03, 0x00, 0x00, 0xE0, 0x80, 0x01, + 0x00, 0xE0, 0x42, 0x00, 0x40, 0x0B, 0x11, 0xD1, 0x20, 0xCE, 0x80, 0x00, + 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, 0x01, 0xA2, 0x04, 0xA2, + 0xAD, 0x04, 0x1E, 0xE4, 0x21, 0x0B, 0x1E, 0xE4, 0x75, 0x0B, 0x1E, 0xE4, + 0x42, 0x00, 0xC0, 0xE0, 0xFD, 0x08, 0x0B, 0xE4, 0x80, 0x00, 0x00, 0xE0, + 0x80, 0x01, 0x00, 0xE0, 0x11, 0xD1, 0x20, 0xCE, 0x80, 0x01, 0x00, 0xE0, + 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, 0x00, 0x02, 0xC0, 0xE0, 0xAD, 0x04, + 0x1E, 0xE4, 0x03, 0x00, 0x20, 0xCE, 0x80, 0x01, 0x00, 0xE0, 0x42, 0x00, + 0xC0, 0x00, 0x12, 0xD1, 0x40, 0x0B, 0x11, 0xD1, 0xAD, 0x04, 0x1E, 0xE4, + 0x03, 0x00, 0x13, 0xD1, 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, 0x04, 0xA2, + 0x1E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, 0x75, 0x0B, 0x35, 0x3C, 0x02, 0xAF, + 0x2B, 0xF0, 0x21, 0x0B, 0xFC, 0xA2, 0x2E, 0xE4, 0x26, 0x09, 0x1E, 0xE4, + 0x2E, 0xE4, 0x33, 0x3C, 0xFA, 0xA2, 0x34, 0x3C, 0x09, 0xA2, 0x32, 0x28, + 0x79, 0xF0, 0x20, 0x2A, 0x32, 0x3C, 0x34, 0x28, 0x67, 0x09, 0x12, 0xE4, + 0x31, 0x28, 0x5A, 0xF0, 0x31, 0x18, 0x32, 0x28, 0x34, 0x28, 0x67, 0x09, + 0x12, 0xE4, 0x09, 0xA2, 0x6E, 0x09, 0x1E, 0xE4, 0x03, 0xA2, 0x31, 0x3C, + 0x36, 0x36, 0x03, 0xA0, 0x3A, 0x4E, 0x36, 0x26, 0x34, 0x3C, 0xFE, 0xA2, + 0x2E, 0xE4, 0x3A, 0x3E, 0x00, 0xA2, 0x33, 0x3C, 0x32, 0x3C, 0x31, 0x3C, + 0x70, 0x08, 0x61, 0xE1, 0x08, 0xA2, 0x30, 0x3C, 0x30, 0x28, 0x2E, 0xE4, + 0x11, 0x3D, 0x1F, 0xC7, 0x70, 0x08, 0x00, 0xE0, 0x91, 0x28, 0x91, 0x3C, + 0x91, 0x28, 0xCA, 0xF0, 0x01, 0x29, 0x92, 0xE0, 0x28, 0xF0, 0x35, 0x18, + 0x91, 0x3C, 0x02, 0xA0, 0x28, 0xF7, 0x30, 0x18, 0x91, 0x28, 0x91, 0x3C, + 0x01, 0x3D, 0x0A, 0xA2, 0x2E, 0xE4, 0xFE, 0xA2, 0x35, 0x18, 0x30, 0x3C, + 0x91, 0x08, 0x02, 0xA2, 0x2E, 0xE4, 0x91, 0x28, 0x30, 0x3C, 0x28, 0xF0, + 0x00, 0xE0, 0x91, 0x28, 0x91, 0x3C, 0x30, 0x28, 0xEA, 0xF0, 0x01, 0x29, + 0x92, 0xE0, 0x70, 0x08, 0x35, 0x18, 0x91, 0x3C, 0x02, 0xA0, 0x91, 0x28, + 0x30, 0x18, 0x91, 0x28, 0x91, 0x3C, 0x28, 0xF0, 0x00, 0xA2, 0x34, 0x3C, + 0xFE, 0xA2, 0x28, 0xF7, 0x00, 0xE0, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, + 0x52, 0xE0, 0x01, 0x29, 0x92, 0xE0, 0x70, 0x08, 0x70, 0x08, 0x00, 0xE0, + 0x2E, 0xE4, 0x01, 0x3D, 0x01, 0x3D, 0x56, 0xE0, 0x01, 0x29, 0x92, 0xE0, + 0x92, 0xE0, 0x70, 0x08, 0x00, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x01, 0x3D, + 0x06, 0xA8, 0x01, 0x29, 0x54, 0x00, 0x04, 0xE0, 0x91, 0x3C, 0x00, 0xA2, + 0x44, 0xCC, 0x02, 0xA1, 0x35, 0x28, 0x9C, 0xE0, 0x91, 0x5C, 0x06, 0x9E, + 0x95, 0x09, 0x84, 0xE1, 0x49, 0xE0, 0x91, 0x28, 0xA8, 0xF0, 0x02, 0xA8, + 0x07, 0x2B, 0x9F, 0xE0, 0x70, 0x08, 0x01, 0xE0, 0x91, 0x2A, 0x75, 0x09, + 0x19, 0xE4, 0x09, 0xA8, 0x04, 0xE0, 0x2E, 0xE4, 0x91, 0x3E, 0x03, 0xA0, + 0x54, 0x00, 0x04, 0xE0, 0x9E, 0xE0, 0x70, 0x08, 0x44, 0xCC, 0x02, 0xA1, + 0x35, 0x28, 0x9C, 0xE0, 0xAB, 0x09, 0x84, 0xE1, 0x91, 0x3C, 0x00, 0xA2, + 0x91, 0x5A, 0x03, 0xA8, 0x05, 0xAF, 0x17, 0x2B, 0x91, 0x3E, 0x03, 0xA0, + 0x91, 0x2A, 0x56, 0xE0, 0x1E, 0xE4, 0x80, 0xE1, 0x2E, 0xE4, 0x06, 0x9F, + 0x35, 0x28, 0x70, 0x08, 0x67, 0xE1, 0x26, 0x09, 0xB9, 0x09, 0x84, 0xE1, + 0x44, 0xCC, 0x02, 0xA1, 0x2E, 0xE4, 0x90, 0xE1, 0x17, 0x3D, 0x08, 0xA2, + 0x35, 0x28, 0x9E, 0xE0, 0x70, 0x08, 0x04, 0xE0, 0xC7, 0x09, 0x84, 0xE1, + 0x44, 0xCC, 0x02, 0xA1, 0x06, 0xAE, 0x56, 0xE0, 0x0F, 0xA8, 0x17, 0x2B, + 0x67, 0xE1, 0x66, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xC0, 0xE0, 0x17, 0x3D, + 0x17, 0x35, 0xE0, 0x08, 0x2E, 0xE4, 0x17, 0x3D, 0x17, 0x35, 0x67, 0x00, + 0x08, 0xE0, 0x49, 0xE0, 0x50, 0x00, 0xC0, 0xE0, 0x09, 0xE0, 0x11, 0xAF, + 0x45, 0x3C, 0x7F, 0x00, 0x45, 0x3E, 0x45, 0x46, 0x44, 0x3E, 0x7F, 0x00, + 0x00, 0x00, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x03, 0x0A, 0x1E, 0xE4, + 0x42, 0xE0, 0x10, 0xAE, 0x61, 0xE1, 0x5B, 0xF0, 0x09, 0xA8, 0x44, 0x2A, + 0x40, 0x34, 0x11, 0x4D, 0x11, 0x21, 0xE0, 0x08, 0x04, 0xE0, 0x46, 0x00, + 0xC1, 0xE0, 0x41, 0x3C, 0x1E, 0xE4, 0x42, 0xE0, 0x10, 0xAE, 0x10, 0x00, + 0x5B, 0xF0, 0x11, 0xA8, 0x44, 0x2A, 0x03, 0x0A, 0x11, 0x4D, 0x11, 0x21, + 0xE2, 0x08, 0x61, 0xE1, 0x0E, 0xA0, 0x2E, 0xE4, 0x43, 0x3C, 0x42, 0x34, + 0x0E, 0xE4, 0x2E, 0xE4, 0x06, 0xAE, 0x06, 0xAF, 0x09, 0xA8, 0x45, 0x2A, + 0x00, 0xA2, 0x8D, 0x0B, 0x45, 0x2A, 0x20, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, + 0x40, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0x11, 0xA8, 0x00, 0xA2, 0x2E, 0xE4, + 0x0C, 0x04, 0xC2, 0xE0, 0x1E, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x6C, 0x3C, + 0xC0, 0xE0, 0x94, 0xF0, 0x31, 0x28, 0x62, 0x3C, 0x60, 0x30, 0x61, 0x30, + 0x08, 0xAF, 0x60, 0x00, 0x00, 0xA2, 0x6E, 0xF0, 0x64, 0x30, 0x02, 0xAF, + 0x62, 0x3C, 0x64, 0x3C, 0x61, 0x3C, 0x60, 0x3C, 0xFD, 0x0A, 0x1E, 0xE4, + 0x2E, 0xE4, 0x02, 0xA2, 0x56, 0xE0, 0x09, 0xAE, 0x64, 0x2A, 0x20, 0xAE, + 0x27, 0x28, 0x4E, 0x01, 0xC2, 0xE0, 0x62, 0x4C, 0x02, 0xA1, 0x28, 0x4C, + 0x20, 0xAE, 0x02, 0xA1, 0x6E, 0x00, 0xC0, 0xE0, 0x42, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0x31, 0x28, 0x7F, 0x01, 0xC2, 0xE0, 0x7E, 0xA8, 0x61, 0x00, + 0xC0, 0xE0, 0x43, 0x01, 0x64, 0x28, 0x2E, 0xE4, 0x44, 0x01, 0xC2, 0xE0, + 0x02, 0xAE, 0x65, 0x28, 0x9E, 0x0A, 0x18, 0xE4, 0x10, 0xAE, 0x6A, 0x4C, + 0x10, 0xAE, 0x66, 0x4C, 0xE9, 0xF7, 0x4B, 0x01, 0xC1, 0xE0, 0x6B, 0x08, + 0xC2, 0xE0, 0x02, 0xA2, 0x4D, 0x01, 0xC2, 0xE0, 0x6C, 0x3C, 0x02, 0xA0, + 0x6C, 0x28, 0x4A, 0x01, 0x00, 0xA2, 0xFA, 0xF2, 0x60, 0x28, 0x2E, 0xE4, + 0xC2, 0xE0, 0x6B, 0x3C, 0x6A, 0x3C, 0x29, 0x3C, 0x1E, 0xE4, 0x49, 0x01, + 0xC2, 0xE0, 0x7F, 0x01, 0x01, 0x0B, 0x1E, 0xE4, 0x00, 0xA2, 0x2E, 0x0A, + 0x26, 0x18, 0x29, 0x28, 0x02, 0x01, 0xC2, 0xE0, 0x6A, 0x28, 0x66, 0x3C, + 0x02, 0xA2, 0xF2, 0xF0, 0x1E, 0xE4, 0x65, 0x3C, 0x1A, 0xE0, 0x6B, 0x4C, + 0x29, 0x28, 0x92, 0x0A, 0x1E, 0xE4, 0x4B, 0x0A, 0x1E, 0xE4, 0x08, 0xF7, + 0x29, 0x3C, 0x02, 0xA0, 0x6A, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x86, 0x0A, + 0x65, 0x3C, 0x02, 0xA2, 0x66, 0x3C, 0x6B, 0x3C, 0x4B, 0x01, 0xC1, 0xE0, + 0x4B, 0x0A, 0x1E, 0xE4, 0x02, 0xA0, 0x6A, 0x28, 0x2E, 0xE4, 0xE9, 0xF7, + 0x9D, 0x0A, 0x04, 0xE4, 0x27, 0x18, 0x6A, 0x3C, 0x00, 0xA2, 0x6B, 0x3C, + 0x02, 0xA0, 0x6B, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x6A, 0x3C, + 0xA0, 0x30, 0x10, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0xA2, 0x3C, 0xA1, 0x34, + 0x6A, 0x00, 0xC0, 0xE0, 0x1E, 0xE4, 0x06, 0xA2, 0x4A, 0xF0, 0xA0, 0x28, + 0xA0, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0xBA, 0x0A, 0x02, 0xA2, 0x08, 0x08, + 0x60, 0xE1, 0x8A, 0xF0, 0x10, 0x3D, 0x20, 0xA2, 0x10, 0x3D, 0x10, 0xAE, + 0x1E, 0xE4, 0x92, 0x3C, 0x2E, 0xE4, 0x02, 0xA2, 0x20, 0xCE, 0xA2, 0x4C, + 0xA1, 0x24, 0xAD, 0x04, 0x24, 0xCE, 0x18, 0xA2, 0x08, 0x08, 0x11, 0xD1, + 0xAD, 0x04, 0x1E, 0xE4, 0x26, 0xCE, 0x92, 0x28, 0x0D, 0x2A, 0x01, 0x0B, + 0x1E, 0xE4, 0x2E, 0xE4, 0x1E, 0xE4, 0x55, 0xE0, 0x07, 0xAE, 0x17, 0xE0, + 0xC2, 0xE0, 0x56, 0xE0, 0x0A, 0xAE, 0xF8, 0x0A, 0x1E, 0xE4, 0x92, 0xE0, + 0x2E, 0xE4, 0x02, 0x01, 0x09, 0xAE, 0x17, 0xE0, 0x0D, 0x2A, 0x01, 0x0B, + 0x06, 0xAE, 0xF8, 0x0A, 0x1E, 0xE4, 0x55, 0xE0, 0x56, 0xE0, 0x0F, 0xAE, + 0x83, 0xE0, 0x56, 0xE0, 0x92, 0xE0, 0x2E, 0xE4, 0x13, 0x02, 0xC2, 0xE0, + 0x17, 0xE0, 0x0D, 0x2A, 0x01, 0x0B, 0x1E, 0xE4, 0xF8, 0x0A, 0x1E, 0xE4, + 0x55, 0xE0, 0x09, 0xAE, 0x0F, 0xAE, 0x83, 0xE0, 0x56, 0xE0, 0x06, 0xAE, + 0x2E, 0xE4, 0x15, 0x02, 0xC2, 0xE0, 0x56, 0xE0, 0x02, 0xA8, 0x06, 0xAF, + 0x44, 0x00, 0xC0, 0xE0, 0x80, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x0E, 0xA8, 0x44, 0x00, 0xC0, 0xE0, 0x58, 0xF0, 0x20, 0xAF, 0x60, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, + 0x08, 0xE0, 0x56, 0xE0, 0x03, 0xAE, 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0xFF, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x07, 0xA8, 0x1B, 0xAF, + 0x05, 0xA1, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0x01, 0xA2, 0x2E, 0xE4, + 0x13, 0xA2, 0x39, 0xF0, 0x23, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x07, 0xA8, 0x39, 0xF0, 0x05, 0xA1, + 0x07, 0xA8, 0x23, 0xAF, 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, + 0x02, 0xA8, 0x20, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x60, 0xA8, 0x60, 0x00, + 0xC0, 0xE0, 0x28, 0xE4, 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, + 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, 0xC2, 0xE0, 0x02, 0xA2, + 0x9E, 0xE0, 0x00, 0x05, 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x0D, 0x04, + 0x04, 0xAF, 0xFD, 0x0A, 0x1E, 0xE4, 0xDA, 0xF7, 0x12, 0x0B, 0x1E, 0xE4, + 0x0A, 0x0B, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0xA8, 0x57, 0x0B, 0x0B, 0xE4, + 0x20, 0xAE, 0x56, 0xE0, 0x09, 0xAE, 0x17, 0x0B, 0xFF, 0x1F, 0x09, 0xE0, + 0x6E, 0x00, 0xC1, 0xE0, 0xD5, 0x0B, 0x1E, 0xE4, 0x17, 0x9F, 0x56, 0xE0, + 0x22, 0xD0, 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x68, 0x0B, + 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, 0x64, 0xE1, 0x17, 0x9F, + 0x14, 0x9E, 0x70, 0x0B, 0x84, 0xE1, 0x02, 0x00, 0x0D, 0x04, 0xC3, 0xE0, + 0x01, 0xA2, 0x17, 0x9F, 0xC0, 0xE0, 0x3D, 0x3E, 0xEC, 0x3C, 0x2E, 0xE4, + 0x11, 0xAE, 0x20, 0x00, 0x05, 0xE0, 0x41, 0x00, 0x00, 0x02, 0x11, 0xD1, + 0x3D, 0x08, 0x42, 0xE0, 0x11, 0xD1, 0x80, 0x01, 0x00, 0xE0, 0x5E, 0xF8, + 0xC0, 0x00, 0x12, 0xD1, 0x20, 0xCE, 0x40, 0x0B, 0xF9, 0xF7, 0x29, 0xCA, + 0x13, 0x01, 0xEC, 0x88, 0x1E, 0xE4, 0x01, 0xA2, 0x06, 0xA2, 0x2E, 0xE4, + 0x35, 0x28, 0x94, 0xE0, 0x21, 0x28, 0x75, 0x0B, 0x49, 0xE0, 0x92, 0xE0, + 0x24, 0xE4, 0x02, 0xA1, 0x82, 0xE0, 0xAC, 0x0B, 0x1E, 0xE4, 0x0C, 0xC4, + 0xC1, 0xE0, 0x95, 0xE0, 0x21, 0x2A, 0x8E, 0xF7, 0x49, 0xF0, 0x23, 0xA1, + 0x23, 0xA8, 0x60, 0x00, 0x35, 0x2A, 0x95, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0xAC, 0x0B, 0x1E, 0xE4, 0x04, 0xC4, 0x00, 0xE0, 0x18, 0xE0, + 0x86, 0xC7, 0xA4, 0xCC, 0x40, 0x09, 0x00, 0xE0, 0x9A, 0xE0, 0x00, 0x02, + 0x00, 0x05, 0x01, 0xE0, 0x07, 0xAE, 0x9C, 0xE0, 0x04, 0xAF, 0x01, 0x0B, + 0x1E, 0xE4, 0x9F, 0xE0, 0x69, 0xF0, 0x89, 0xE0, 0x0A, 0x0B, 0x1E, 0xE4, + 0x09, 0xAE, 0x26, 0x0B, 0x1E, 0xE4, 0x1E, 0xA8, 0x42, 0xE0, 0x85, 0xE0, + 0x20, 0xAE, 0x56, 0xE0, 0x89, 0xE0, 0xD2, 0x0B, 0x1E, 0xE4, 0x17, 0x9F, + 0x1E, 0xE4, 0x17, 0x9F, 0xD5, 0x0B, 0x1B, 0xE4, 0x23, 0x4C, 0x22, 0x20, + 0x2E, 0xE4, 0xE0, 0x0B, 0xC1, 0xE0, 0x28, 0x4C, 0x27, 0x20, 0x2E, 0xE4, + 0x39, 0xF0, 0x23, 0xA1, 0x23, 0xA8, 0x60, 0x00, 0x2E, 0xE4, 0x08, 0xAE, + 0x27, 0x4C, 0x28, 0x20, 0xC2, 0xE0, 0x0D, 0x04, 0xC2, 0xE0, 0x02, 0xA2, + 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x0E, 0x04, 0x84, 0xE1, 0x02, 0x00, + 0x22, 0xD0, 0xDA, 0xF7, 0x17, 0x9F, 0x15, 0x4D, 0x15, 0x21, 0xEF, 0x0B, + 0xF6, 0x0B, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x00, 0xA2, 0x17, 0x9F, + 0x16, 0x4D, 0x16, 0x21, 0x90, 0xE1, 0x2E, 0xE4, 0x0D, 0x04, 0xC2, 0xE0, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, + 0x0A, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, + 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, + 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00, 0x1B, 0x00, + 0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x21, 0x00, + 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, + 0x28, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x2B, 0x00, 0x2C, 0x00, 0x2D, 0x00, + 0x2E, 0x00, 0x2F, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, + 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, + 0x3A, 0x00, 0x3B, 0x00, 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, + 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x3C, 0x03, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x56, 0x03, 0x0E, 0xE4, + 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, + 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, + 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, + 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, + 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, + 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, + 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x3C, 0x03, + 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, + 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, + 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, + 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, + 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, + 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, + 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, + 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, + 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, + 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, + 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, + 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, + 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, + 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, + 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, + 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, + 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, + 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, + 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, + 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, + 0x00, 0x28, 0x12, 0xD1, 0x4E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, + 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, + 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, + 0x5C, 0x03, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, + 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, + 0x7C, 0xE6, 0x5E, 0x03, 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, + 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, + 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, + 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, + 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xEE, 0x01, + 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, + 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, + 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, + 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, + 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, + 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, + 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, + 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, + 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, + 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, 0x90, 0x01, 0x1A, 0xE4, + 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, 0xF0, 0x3C, 0x3E, 0xA2, + 0x2E, 0xE4, 0x4A, 0x00, 0x78, 0x00, 0xC2, 0xE0, 0xF0, 0x58, 0x02, 0xA2, + 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0x20, 0xA2, 0x00, 0xA2, 0x76, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0xC2, 0xE0, 0xFC, 0xA2, 0x72, 0x00, 0xC2, 0xE0, + 0x71, 0x00, 0xC2, 0xE0, 0xFA, 0xA2, 0x77, 0x00, 0x84, 0xE1, 0x0F, 0x27, + 0x22, 0xD0, 0x2E, 0xE4, 0x48, 0xF0, 0x4A, 0x00, 0xC0, 0xE0, 0xAA, 0x01, + 0xC0, 0xE0, 0xE8, 0xF7, 0x1F, 0x04, 0xC0, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, + 0xEE, 0xA1, 0x3D, 0x04, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0xC2, 0xE0, 0x11, 0x00, 0x04, 0xE0, 0x9D, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0x2E, 0xE4, 0x3C, 0x04, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xE0, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0x45, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3C, 0x04, 0x28, 0xE4, 0x04, 0xA1, + 0x0E, 0xA8, 0x04, 0xAF, 0xC0, 0xE0, 0x4A, 0x00, 0xC2, 0xE0, 0x02, 0xA2, + 0x48, 0xCA, 0x8E, 0xF9, 0xE8, 0xF7, 0x11, 0x01, 0xAF, 0x01, 0x1E, 0xE4, + 0xE8, 0xF7, 0x02, 0xA8, 0xD8, 0xF7, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, + 0x09, 0x00, 0xC2, 0xE0, 0xF8, 0x01, 0x04, 0xE0, 0xC0, 0xE0, 0x09, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xC2, 0xE0, 0x00, 0xA2, 0xE8, 0xF7, 0x0D, 0x00, + 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, 0x3C, 0x04, 0x42, 0x3C, 0x43, 0x34, + 0x01, 0xC0, 0x2E, 0xE4, 0x43, 0x2C, 0x01, 0xC0, 0x2E, 0xE4, 0x00, 0xC0, + 0x0E, 0x1C, 0x2A, 0xE4, 0x00, 0xC0, 0x42, 0x2E, 0x0C, 0x18, 0x10, 0xAF, + 0x4A, 0xE0, 0xB4, 0xF0, 0x0D, 0x1A, 0xFF, 0x00, 0x09, 0xE0, 0x74, 0xF0, + 0xFE, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x34, 0xF0, 0x1E, 0xF1, 0x5D, 0x3C, + 0x01, 0xC0, 0x2E, 0xE4, 0x01, 0xC0, 0xEE, 0xF0, 0x5E, 0x3C, 0x01, 0xC0, + 0x5F, 0x3C, 0x01, 0xC0, 0xBE, 0xF0, 0x5E, 0x28, 0x5E, 0x1A, 0x5D, 0x2A, + 0x01, 0xC0, 0x8E, 0xF0, 0x5F, 0x2A, 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, + 0x08, 0x08, 0xC2, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0x02, 0x08, 0x62, 0xE1, + 0x0B, 0x08, 0xC3, 0xE0, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x02, 0xA2, + 0x92, 0x9F, 0x00, 0x02, 0x05, 0xE0, 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, + 0x12, 0x9F, 0x12, 0x9F, 0x12, 0x81, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, + 0xC0, 0xE0, 0x00, 0x08, 0xC2, 0xE0, 0x02, 0xA2, 0x1E, 0xE4, 0x2E, 0xE4, + 0xE8, 0xF7, 0x00, 0x08, 0x32, 0xA2, 0x20, 0x06, 0x60, 0xD1, 0x4E, 0x02, + 0x40, 0xCE, 0x2E, 0xE4, 0xC0, 0xCE, 0x18, 0xAE, 0x02, 0x00, 0x22, 0xD1, + 0x00, 0x00, 0x21, 0xD1, 0x02, 0xA8, 0x48, 0xCA, 0x80, 0x00, 0x23, 0xD1, + 0x22, 0xAE, 0x04, 0xA2, 0x2E, 0xE4, 0xE8, 0xF7, 0x8C, 0xCC, 0x72, 0xCC, + 0x00, 0xA2, 0x9E, 0xCC, 0x20, 0xAE, 0x10, 0xA8, 0x04, 0xE0, 0x8E, 0xCC, + 0x6F, 0xD1, 0x4A, 0xCE, 0x22, 0x93, 0x0A, 0xE0, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x03, 0x00, 0x60, 0xA2, 0x2E, 0xE4, 0x00, 0x00, 0x6F, 0xD1, + 0xEA, 0xF7, 0x02, 0xA8, 0x50, 0xCA, 0x50, 0xCE, 0x20, 0x00, 0x04, 0xE0, + 0x2E, 0xE4, 0x00, 0xC0, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x50, 0xCE, + 0x3D, 0x04, 0xC1, 0xE0, 0x2E, 0xE4, 0x1C, 0x04, 0x00, 0x01, 0x0A, 0xE0, + 0xD9, 0xF7, 0xEF, 0xA1, 0x1E, 0xE4, 0x2E, 0xE4, 0x1C, 0x04, 0xC2, 0xE0, + 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0xC2, 0x02, 0x72, 0x02, 0x1E, 0xE4, + 0x1F, 0x00, 0x08, 0xE0, 0x37, 0x03, 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, + 0x1E, 0xE4, 0x1E, 0x04, 0xC2, 0xE0, 0x12, 0xAE, 0xE8, 0x02, 0x1E, 0xE4, + 0x2E, 0xE4, 0x27, 0x03, 0x04, 0xA8, 0x10, 0x02, 0xC0, 0xE0, 0x2A, 0xE4, + 0x08, 0xE0, 0x15, 0x02, 0xC0, 0xE0, 0x18, 0xF1, 0x16, 0x02, 0xC0, 0xE0, + 0x4A, 0xF0, 0x00, 0x01, 0x08, 0xE0, 0x13, 0x02, 0xC0, 0xE0, 0xBE, 0xF0, + 0x14, 0x02, 0xC0, 0xE0, 0x4A, 0xF0, 0x00, 0x01, 0x1E, 0xE4, 0x0B, 0x02, + 0xC0, 0xE0, 0x3E, 0xF0, 0x1E, 0xE4, 0xFD, 0x02, 0x1E, 0xE4, 0x72, 0x02, + 0x10, 0x02, 0xC1, 0xE0, 0x12, 0xAE, 0x37, 0x03, 0xC1, 0xE0, 0x56, 0xE0, + 0x15, 0xAE, 0x03, 0xA8, 0x07, 0xAE, 0x7F, 0xA8, 0x0B, 0xAF, 0x04, 0x02, + 0x0F, 0xA8, 0x04, 0x02, 0xC1, 0xE0, 0x56, 0xE0, 0x1E, 0xE4, 0x1E, 0x04, + 0xC2, 0xE0, 0x56, 0xE0, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x27, 0x03, + 0x52, 0xE0, 0x1F, 0xAE, 0x03, 0xA2, 0x92, 0xE0, 0x94, 0xE0, 0x60, 0x00, + 0xC0, 0xE0, 0xEA, 0xF1, 0x84, 0xE0, 0x8A, 0xF1, 0x06, 0xA8, 0x08, 0xAF, + 0x21, 0xA8, 0x85, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, 0xC0, 0xE0, 0x0A, 0xF1, + 0x56, 0xE0, 0x17, 0xE0, 0x16, 0xE0, 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, + 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x3A, 0xF0, 0x56, 0xE0, + 0x03, 0xA8, 0x1B, 0xE0, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0x1F, 0xAE, 0x03, 0xA2, 0x44, 0x00, 0xC0, 0xE0, 0xC2, 0x02, 0x1E, 0xE4, + 0xEA, 0xF0, 0x52, 0xE0, 0x69, 0xF0, 0xCD, 0x13, 0x1E, 0xE4, 0xB8, 0xF0, + 0x1E, 0xA8, 0x12, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x38, 0xF0, 0x08, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, 0x2E, 0xE4, + 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, 0xFF, 0x00, 0x04, 0xAE, 0x02, 0xA0, + 0x00, 0x05, 0x00, 0xE0, 0xC2, 0xE0, 0x02, 0xA2, 0x1A, 0x04, 0xC2, 0xE0, + 0xEA, 0xF7, 0x19, 0x04, 0xC0, 0xE0, 0x18, 0x04, 0xC0, 0xE0, 0x18, 0x04, + 0xC2, 0xE0, 0x02, 0xA2, 0x1B, 0x04, 0xC0, 0xE0, 0xEA, 0xF7, 0x19, 0x04, + 0x28, 0xAE, 0x08, 0xAF, 0x1E, 0xA0, 0x20, 0xAF, 0xFF, 0xFF, 0x09, 0xE0, + 0x1B, 0x04, 0xC1, 0xE0, 0x56, 0xE0, 0x09, 0xAE, 0x09, 0xAF, 0x1F, 0xA0, + 0xC0, 0xE0, 0x2E, 0xE4, 0x1D, 0x04, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0x02, + 0x0A, 0xE0, 0x1C, 0x04, 0xF0, 0xF7, 0x02, 0xA1, 0x28, 0xA2, 0x1C, 0x04, + 0x00, 0x02, 0x0C, 0xE0, 0x1C, 0x04, 0xC0, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, + 0x1C, 0x04, 0xC2, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, 0x04, 0xAF, 0x44, 0x00, + 0x60, 0x03, 0x0E, 0xE4, 0x61, 0x0F, 0x0E, 0xE4, 0x68, 0x03, 0x0E, 0xE4, + 0x64, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6E, 0x03, 0x0E, 0xE4, + 0x72, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x74, 0x03, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0xA1, 0x0C, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0xD6, 0x0C, 0x1E, 0xE4, 0xB6, 0x01, 0x1E, 0xE4, 0xDE, 0x0C, 0x1E, 0xE4, + 0xD7, 0x0C, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, + 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x4C, 0x0D, 0x1E, 0xE4, + 0x2E, 0xE4, 0x02, 0xA2, 0x22, 0xCF, 0x02, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0x22, 0xCF, 0x04, 0xA2, 0x08, 0xA9, 0x08, 0xAE, 0xFF, 0x00, 0x08, 0xE0, + 0x18, 0xAF, 0x22, 0xCB, 0x90, 0xE1, 0x22, 0xCF, 0x80, 0x00, 0x04, 0xE0, + 0x2E, 0xE4, 0x02, 0xA8, 0x90, 0xE1, 0x22, 0xCF, 0x08, 0xA9, 0x08, 0xAE, + 0x2E, 0xE4, 0x02, 0xA8, 0x18, 0xAF, 0x22, 0xCB, 0x84, 0xE1, 0x01, 0xA2, + 0x44, 0xCC, 0x02, 0xA1, 0x08, 0xAE, 0x80, 0x00, 0x04, 0xE0, 0xA3, 0x03, + 0x22, 0xCB, 0x90, 0xE1, 0x22, 0xCF, 0x08, 0xA9, 0x55, 0xE0, 0x03, 0xAE, + 0x02, 0xA8, 0x18, 0xAF, 0x06, 0x00, 0x22, 0xD0, 0x2E, 0xE4, 0x4A, 0xE0, + 0x04, 0xE0, 0xB5, 0x03, 0x84, 0xE1, 0x01, 0xA2, 0x22, 0xCF, 0x08, 0xA9, + 0x08, 0xAE, 0x80, 0x00, 0x02, 0xA8, 0x18, 0xAF, 0x22, 0xCB, 0x90, 0xE1, + 0x02, 0xAE, 0x4A, 0xE0, 0x55, 0xE0, 0x03, 0xAE, 0x07, 0x00, 0x22, 0xD0, + 0x2E, 0xE4, 0x34, 0xB6, 0x04, 0xE0, 0xC9, 0x03, 0x84, 0xE1, 0x01, 0xA2, + 0x22, 0xCF, 0x08, 0xA9, 0x08, 0xAE, 0x80, 0x00, 0x02, 0xA8, 0x18, 0xAF, + 0x22, 0xCB, 0x90, 0xE1, 0x2E, 0xE4, 0x4A, 0xE0, 0x55, 0xE0, 0x03, 0xAE, + 0x84, 0xE1, 0x01, 0xA2, 0x07, 0x00, 0x22, 0xD0, 0x08, 0xAE, 0x80, 0x00, + 0x04, 0xE0, 0xDB, 0x03, 0x22, 0xCB, 0x90, 0xE1, 0x22, 0xCF, 0x08, 0xA9, + 0x55, 0xE0, 0x03, 0xAE, 0x02, 0xA8, 0x18, 0xAF, 0x04, 0xE0, 0x2E, 0xE4, + 0x34, 0xB6, 0x4A, 0xE0, 0x22, 0xCF, 0x08, 0xA9, 0x08, 0xAE, 0x80, 0x00, + 0x02, 0xA8, 0x18, 0xAF, 0x22, 0xCB, 0x90, 0xE1, 0x08, 0xA9, 0xF0, 0x00, + 0x04, 0xE0, 0x2E, 0xE4, 0x07, 0x00, 0x30, 0xD1, 0x2E, 0xE4, 0x02, 0xCF, + 0x03, 0xAE, 0x03, 0xA2, 0x02, 0x00, 0x31, 0xD1, 0x03, 0xAE, 0x55, 0xE0, + 0x16, 0xE0, 0x12, 0x28, 0x18, 0x28, 0x03, 0xAE, 0x55, 0xE0, 0x19, 0x28, + 0x55, 0xE0, 0x2B, 0x28, 0x03, 0xAE, 0x55, 0xE0, 0x11, 0xAE, 0x55, 0xE0, + 0x0C, 0x28, 0x11, 0xAE, 0x00, 0xA2, 0x01, 0xCF, 0x55, 0xE0, 0x0D, 0x28, + 0x19, 0x28, 0x17, 0xE0, 0x12, 0x2A, 0x80, 0x3C, 0x66, 0xE1, 0x80, 0x30, + 0x56, 0xE0, 0x18, 0x44, 0x0E, 0x4D, 0x10, 0xAE, 0x0E, 0x29, 0x02, 0x02, + 0x2F, 0x4C, 0x10, 0xAE, 0x06, 0x4D, 0x10, 0xAE, 0x70, 0x28, 0x84, 0x05, + 0x1E, 0xE4, 0x24, 0xCF, 0x1E, 0xE4, 0x48, 0xF0, 0x12, 0x28, 0x8A, 0xF0, + 0x67, 0x05, 0x1E, 0xE4, 0x3E, 0xF0, 0x56, 0x05, 0x06, 0x02, 0x66, 0xE1, + 0x2A, 0xE4, 0x12, 0x28, 0x10, 0xAE, 0x0E, 0x4D, 0x10, 0xAE, 0x0E, 0x29, + 0x30, 0xCF, 0x06, 0x4D, 0x10, 0xAE, 0x0E, 0x4D, 0x10, 0xAE, 0x0E, 0x29, + 0x09, 0x02, 0x66, 0xE1, 0x32, 0xCF, 0x06, 0x4D, 0x10, 0xAE, 0x0E, 0x4D, + 0x10, 0xAE, 0x2D, 0x4C, 0x10, 0xAE, 0x2E, 0x28, 0x0A, 0x02, 0x66, 0xE1, + 0x34, 0xCF, 0x2C, 0x4C, 0x56, 0xE0, 0x21, 0xAE, 0x16, 0x2B, 0x16, 0x29, + 0x11, 0xAE, 0x16, 0x2B, 0x1D, 0x02, 0x66, 0xE1, 0x56, 0xE0, 0x31, 0xAE, + 0x16, 0x2B, 0x56, 0xE0, 0x0E, 0x29, 0x0F, 0x02, 0x66, 0xE1, 0x26, 0xCF, + 0x0E, 0x4D, 0x10, 0xAE, 0x0E, 0x4D, 0x10, 0xAE, 0x66, 0xE1, 0x28, 0xCF, + 0x06, 0x4D, 0x10, 0xAE, 0x0E, 0x4D, 0x10, 0xAE, 0x0E, 0x29, 0x12, 0x02, + 0x66, 0xE1, 0x2A, 0xCF, 0x06, 0x4D, 0x10, 0xAE, 0x0E, 0x4D, 0x10, 0xAE, + 0x0E, 0x29, 0x22, 0x02, 0x06, 0x4D, 0x10, 0xAE, 0x0E, 0x4D, 0x10, 0xAE, + 0x0E, 0x29, 0x25, 0x02, 0x66, 0xE1, 0x2C, 0xCF, 0x06, 0x4D, 0x10, 0xAE, + 0x0E, 0x4D, 0x10, 0xAE, 0x0E, 0x29, 0x27, 0x02, 0x66, 0xE1, 0x2E, 0xCF, + 0x66, 0xE1, 0x10, 0xAE, 0x06, 0x4D, 0x10, 0xAE, 0x06, 0x4D, 0x10, 0xAE, + 0x0E, 0x4D, 0x14, 0x02, 0x0E, 0x29, 0x18, 0x02, 0x66, 0xE1, 0x36, 0xCF, + 0x0E, 0x4D, 0x10, 0xAE, 0x0E, 0x4D, 0x10, 0xAE, 0xF8, 0x00, 0x05, 0xE0, + 0x06, 0x4D, 0x10, 0xAE, 0x3C, 0xCF, 0x3B, 0xCF, 0x00, 0x80, 0x0B, 0xE0, + 0x0E, 0x29, 0x1C, 0x02, 0x66, 0xE1, 0x90, 0xE1, 0x0E, 0x4D, 0x10, 0xAE, + 0x0E, 0x4D, 0x10, 0xAE, 0xF8, 0x00, 0x05, 0xE0, 0x06, 0x4D, 0x10, 0xAE, + 0x3C, 0xCF, 0x3B, 0xCF, 0x01, 0x80, 0x0B, 0xE0, 0x0E, 0x29, 0x2B, 0x02, + 0x66, 0xE1, 0x90, 0xE1, 0x0E, 0x4D, 0x10, 0xAE, 0x0E, 0x4D, 0x10, 0xAE, + 0xFC, 0x00, 0x05, 0xE0, 0x06, 0x4D, 0x10, 0xAE, 0x3C, 0xCF, 0x3B, 0xCF, + 0x00, 0x80, 0x0B, 0xE0, 0x0E, 0x29, 0x2F, 0x02, 0x66, 0xE1, 0x90, 0xE1, + 0x0E, 0x4D, 0x10, 0xAE, 0x0E, 0x4D, 0x10, 0xAE, 0xFC, 0x00, 0x05, 0xE0, + 0x06, 0x4D, 0x10, 0xAE, 0x3C, 0xCF, 0x3B, 0xCF, 0x01, 0x80, 0x0B, 0xE0, + 0x1F, 0x28, 0x01, 0xA2, 0x2E, 0xE4, 0x90, 0xE1, 0x55, 0xE0, 0x22, 0x28, + 0x11, 0xAE, 0x55, 0xE0, 0x07, 0xAE, 0x55, 0xE0, 0x7F, 0x28, 0x0D, 0xAE, + 0x1D, 0x28, 0x0D, 0xAE, 0x55, 0xE0, 0x1E, 0x28, 0x55, 0xE0, 0x1B, 0x28, + 0x03, 0xAE, 0x55, 0xE0, 0x80, 0x06, 0x66, 0xE1, 0x01, 0xA2, 0xA1, 0xCF, + 0x55, 0xE0, 0xFF, 0x00, 0x08, 0xE0, 0x16, 0x29, 0x10, 0xAE, 0xFF, 0x00, + 0x08, 0xE0, 0x16, 0x29, 0xFF, 0x00, 0x08, 0xE0, 0x16, 0x29, 0x55, 0xE0, + 0x08, 0xE0, 0x16, 0x29, 0x55, 0xE0, 0x20, 0xAE, 0xA3, 0xCF, 0x55, 0xE0, + 0x30, 0xAE, 0xFF, 0x00, 0x16, 0x29, 0x84, 0x06, 0x66, 0xE1, 0x01, 0xA2, + 0x16, 0x29, 0x55, 0xE0, 0xFF, 0x00, 0x08, 0xE0, 0x55, 0xE0, 0x10, 0xAE, + 0xFF, 0x00, 0x08, 0xE0, 0x20, 0xAE, 0xFF, 0x00, 0x08, 0xE0, 0x16, 0x29, + 0xFF, 0x00, 0x08, 0xE0, 0x16, 0x29, 0x55, 0xE0, 0x01, 0xA2, 0xA5, 0xCF, + 0x55, 0xE0, 0x30, 0xAE, 0x08, 0xE0, 0x16, 0x29, 0x8C, 0x06, 0x66, 0xE1, + 0x08, 0xE0, 0x16, 0x29, 0x55, 0xE0, 0xFF, 0x00, 0x16, 0x29, 0x55, 0xE0, + 0x10, 0xAE, 0xFF, 0x00, 0x55, 0xE0, 0x20, 0xAE, 0xFF, 0x00, 0x08, 0xE0, + 0x30, 0xAE, 0xFF, 0x00, 0x08, 0xE0, 0x16, 0x29, 0x66, 0xE1, 0x01, 0xA2, + 0xA7, 0xCF, 0x55, 0xE0, 0xFF, 0x00, 0x08, 0xE0, 0x16, 0x29, 0x88, 0x06, + 0xFF, 0x00, 0x08, 0xE0, 0x16, 0x29, 0x55, 0xE0, 0x08, 0xE0, 0x16, 0x29, + 0x55, 0xE0, 0x10, 0xAE, 0x16, 0x29, 0x55, 0xE0, 0x20, 0xAE, 0xFF, 0x00, + 0x55, 0xE0, 0x30, 0xAE, 0xFF, 0x00, 0x08, 0xE0, 0x21, 0xAE, 0x80, 0x00, + 0x05, 0xE0, 0xA9, 0xCF, 0x05, 0xE0, 0xAB, 0xCF, 0x00, 0x01, 0x0B, 0xE0, + 0x3F, 0x01, 0x04, 0xE0, 0x21, 0xAE, 0x1F, 0x01, 0x9F, 0x00, 0x05, 0xE0, + 0xAD, 0xCF, 0x55, 0xE0, 0x55, 0xE0, 0xBF, 0x00, 0x04, 0xE0, 0x21, 0xAE, + 0x1E, 0xE4, 0xB0, 0xCF, 0x00, 0xA2, 0xB7, 0xCF, 0x10, 0xAE, 0x75, 0x28, + 0x2E, 0xE4, 0x7D, 0x05, 0x00, 0xA2, 0x2E, 0xE4, 0x06, 0xCF, 0x76, 0x4C, + 0x02, 0xAE, 0x74, 0x4C, 0x02, 0xAE, 0x72, 0x4C, 0x08, 0xAE, 0x73, 0x4C, + 0x02, 0xAE, 0x71, 0x4C, 0x1F, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x84, 0x3C, + 0x40, 0xCF, 0x00, 0x00, 0x0A, 0xE0, 0x20, 0xAE, 0x05, 0xE0, 0x42, 0xCF, + 0x00, 0x01, 0x04, 0xE0, 0x3F, 0x01, 0x04, 0xE0, 0x21, 0xAE, 0x1F, 0x01, + 0x04, 0xE0, 0x2E, 0xE4, 0x45, 0xCF, 0x55, 0xE0, 0x00, 0x00, 0x0A, 0xE0, + 0x20, 0xAE, 0xFF, 0x00, 0x62, 0xCF, 0x00, 0x01, 0x04, 0xE0, 0x60, 0xCF, + 0x04, 0xE0, 0x21, 0xAE, 0x1F, 0x01, 0x05, 0xE0, 0x28, 0x28, 0x65, 0xCF, + 0x55, 0xE0, 0x3F, 0x01, 0x68, 0xCF, 0x04, 0xAE, 0x27, 0x4C, 0x02, 0xAE, + 0x20, 0xAE, 0x1F, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0xC0, 0xCF, + 0x00, 0x00, 0x0A, 0xE0, 0x66, 0xE1, 0x00, 0x3C, 0x80, 0x00, 0x04, 0xE0, + 0x00, 0x28, 0x02, 0x00, 0x60, 0xE1, 0x30, 0x02, 0x00, 0x2A, 0x38, 0xCF, + 0x16, 0x4D, 0x10, 0xAE, 0x84, 0xE1, 0x04, 0x00, 0x22, 0xD0, 0x07, 0xAE, + 0x16, 0x81, 0x10, 0xAE, 0x4A, 0xE0, 0x9C, 0x05, 0x3E, 0xCF, 0x36, 0x4D, + 0x10, 0xAE, 0x0E, 0x4D, 0x06, 0xA8, 0x00, 0x28, 0x03, 0xA2, 0x03, 0xA0, + 0x42, 0xE0, 0x00, 0x28, 0x55, 0xB6, 0x04, 0xA1, 0x4E, 0xF6, 0x28, 0xF0, + 0x10, 0xAF, 0x00, 0x3C, 0xFE, 0xA2, 0x34, 0x3C, 0xFC, 0xA2, 0x2E, 0xE4, + 0x3C, 0x3C, 0x37, 0x3C, 0x36, 0x3C, 0x35, 0x3C, 0x3D, 0x3C, 0x39, 0x3C, + 0x38, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x3A, 0x3C, 0x3B, 0x3C, 0x3E, 0x3C, + 0xC0, 0xE0, 0x32, 0x3C, 0x61, 0x00, 0xC0, 0xE0, 0x2B, 0xF0, 0xCD, 0x13, + 0x1E, 0xE4, 0x60, 0x00, 0x5B, 0x0D, 0x1E, 0xE4, 0x33, 0x3C, 0x02, 0xAF, + 0x11, 0xD1, 0x20, 0xCE, 0x42, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0xC0, 0x00, + 0x12, 0xD1, 0x00, 0x07, 0x00, 0xE0, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, + 0x20, 0xCE, 0x80, 0x00, 0x00, 0xE0, 0x80, 0x01, 0xC0, 0x00, 0x12, 0xD1, + 0x40, 0x0B, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x41, 0x14, 0x1E, 0xE4, 0x01, 0xA2, 0x04, 0xA2, 0x05, 0x06, 0x0B, 0xE4, + 0xCD, 0x13, 0x1E, 0xE4, 0x80, 0x01, 0x00, 0xE0, 0x42, 0x00, 0xC0, 0xE0, + 0x80, 0x01, 0x00, 0xE0, 0x80, 0x00, 0x00, 0xE0, 0x12, 0xD1, 0x00, 0x07, + 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, + 0x20, 0xCE, 0x80, 0x01, 0x00, 0xE0, 0xF9, 0xF7, 0xC0, 0x00, 0x12, 0xD1, + 0x40, 0x0B, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, 0x04, 0xA2, 0xFC, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x41, 0x14, 0x39, 0x3C, 0x54, 0x00, 0xC0, 0xE0, 0x34, 0x3C, + 0x35, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x38, 0x34, 0x44, 0xCC, 0x02, 0xA1, + 0x33, 0x28, 0x34, 0x3C, 0x02, 0xA0, 0x34, 0x28, 0x27, 0x06, 0x84, 0xE1, + 0x34, 0x3C, 0x16, 0xB6, 0x45, 0xE0, 0x33, 0x2A, 0x37, 0x2A, 0x9B, 0xF0, + 0x45, 0xE0, 0x36, 0x2A, 0x39, 0x4C, 0x38, 0x24, 0x6B, 0xF0, 0x45, 0xE0, + 0x90, 0xE1, 0x6A, 0xF0, 0x02, 0xA8, 0x34, 0x5C, 0x2E, 0xE4, 0x00, 0xA2, + 0x34, 0x3C, 0xFE, 0xA2, 0x34, 0x58, 0x02, 0xA2, 0x8A, 0xF0, 0x14, 0x28, + 0x39, 0x3C, 0x56, 0xE0, 0x39, 0x4E, 0x38, 0x26, 0x00, 0xA2, 0x2E, 0xE4, + 0x02, 0xA2, 0x38, 0x34, 0x2A, 0x28, 0x35, 0x2A, 0x99, 0x3C, 0x98, 0x3C, + 0x26, 0x28, 0x99, 0x3E, 0x34, 0x2A, 0x28, 0xF0, 0x99, 0x28, 0x48, 0xF0, + 0x02, 0xA1, 0xFA, 0xF0, 0x48, 0xF0, 0x02, 0xA1, 0xAE, 0xF0, 0x37, 0x3C, + 0xFE, 0xA2, 0x5E, 0xF0, 0x37, 0x3C, 0x36, 0x28, 0x25, 0x28, 0x37, 0x3C, + 0x00, 0xA2, 0x98, 0x3C, 0x99, 0x28, 0x48, 0xF0, 0x02, 0xA1, 0xFA, 0xF0, + 0x48, 0xF0, 0x02, 0xA1, 0xAE, 0xF0, 0x36, 0x3C, 0xFE, 0xA2, 0x5E, 0xF0, + 0x36, 0x3C, 0x37, 0x28, 0x23, 0x28, 0x36, 0x3C, 0x00, 0xA2, 0x98, 0x3C, + 0x24, 0x28, 0x36, 0x3C, 0x34, 0x28, 0x3A, 0xF0, 0x2A, 0x28, 0x37, 0x3C, + 0x34, 0x28, 0x3A, 0xF0, 0x4E, 0xF0, 0x3C, 0x3C, 0x34, 0x28, 0x48, 0xF0, + 0x3A, 0x24, 0x3C, 0x3C, 0x35, 0x3C, 0x34, 0x28, 0x3A, 0x34, 0x3B, 0x3C, + 0x02, 0xA0, 0x3B, 0x4C, 0x03, 0xA2, 0x45, 0xF0, 0x35, 0x2A, 0x00, 0xA2, + 0x45, 0xF0, 0x36, 0x2A, 0x56, 0xE0, 0x35, 0x5A, 0x37, 0x2A, 0x56, 0xE0, + 0x36, 0x5A, 0x03, 0xA2, 0x56, 0xE0, 0x37, 0x5A, 0x03, 0xA2, 0x45, 0xF0, + 0x34, 0x5A, 0x03, 0xA2, 0x45, 0xF0, 0x34, 0x2A, 0x98, 0x28, 0x3E, 0x3C, + 0x3D, 0x34, 0x56, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x38, 0xF0, + 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x1E, 0xE4, 0x42, 0xE0, + 0x11, 0xAE, 0x26, 0x00, 0x00, 0xE0, 0x43, 0x3C, 0x42, 0x34, 0xCE, 0x06, + 0x47, 0x34, 0xCE, 0x06, 0x1E, 0xE4, 0xA0, 0x08, 0xC0, 0xE0, 0xC0, 0x0A, + 0x00, 0xE0, 0x48, 0x3C, 0x15, 0xAE, 0x2C, 0x00, 0x05, 0xE0, 0x46, 0x00, + 0x4A, 0x34, 0xCE, 0x06, 0x1E, 0xE4, 0x42, 0xE0, 0x4C, 0x01, 0x1E, 0xE4, + 0x2E, 0xE4, 0x4B, 0x3C, 0x64, 0x00, 0x66, 0xE1, 0xB5, 0x06, 0x67, 0xE1, + 0xBA, 0x06, 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0xC0, 0xE0, 0x17, 0x3D, + 0x17, 0x35, 0x16, 0x9E, 0x2E, 0xE4, 0x45, 0x3C, 0x44, 0x34, 0x6C, 0x00, + 0x08, 0xE0, 0x49, 0xE0, 0x50, 0x00, 0xC0, 0xE0, 0x09, 0xE0, 0x11, 0xAF, + 0x41, 0x3C, 0x7F, 0x00, 0x41, 0x3E, 0x41, 0x46, 0x40, 0x3E, 0x7F, 0x00, + 0x06, 0xAF, 0x0E, 0xA0, 0x2E, 0xE4, 0x02, 0xA2, 0xF4, 0x06, 0x1E, 0xE4, + 0x2E, 0xE4, 0x06, 0xAE, 0xBA, 0xF1, 0x2E, 0x07, 0x1E, 0xE4, 0xA8, 0xF0, + 0x02, 0xA2, 0x8A, 0xF1, 0x70, 0x07, 0x1E, 0xE4, 0x2E, 0x07, 0x1E, 0xE4, + 0x9E, 0xF0, 0xEB, 0x3C, 0xFA, 0xF0, 0x70, 0x07, 0x1E, 0xE4, 0x2A, 0xF1, + 0xF0, 0x3C, 0x04, 0xA2, 0xEB, 0x3C, 0x00, 0xA2, 0x06, 0xA2, 0x80, 0xF0, + 0xF0, 0xA1, 0x0C, 0x28, 0x30, 0xF0, 0xF0, 0xA1, 0x0D, 0x28, 0xF0, 0x3C, + 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x44, 0x00, 0x04, 0xE0, + 0x6F, 0x3C, 0x02, 0xA2, 0x56, 0xE0, 0x4B, 0x00, 0x05, 0xE0, 0x10, 0xAE, + 0x56, 0xE0, 0x49, 0x00, 0x05, 0xE0, 0x10, 0xAE, 0x56, 0xE0, 0x46, 0x00, + 0x05, 0xE0, 0x10, 0xAE, 0x7E, 0xBA, 0x68, 0xF2, 0x46, 0xE0, 0x3F, 0xBA, + 0x4E, 0xBA, 0x4F, 0xBA, 0x7E, 0xBA, 0x7E, 0xBA, 0xFF, 0x3F, 0x08, 0xE0, + 0x56, 0xE0, 0x10, 0xAE, 0x10, 0xAE, 0x4E, 0xBA, 0x4F, 0xBA, 0x08, 0x3C, + 0x09, 0x3C, 0xFF, 0x3F, 0x08, 0xE0, 0x56, 0xE0, 0x0C, 0x3C, 0x08, 0xAF, + 0x1E, 0xA0, 0x08, 0x28, 0x0D, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, 0x09, 0x28, + 0x0E, 0x3C, 0x18, 0xE0, 0x0C, 0x82, 0xA4, 0xCC, 0x29, 0x07, 0x84, 0xE1, + 0x0F, 0x00, 0x22, 0xD0, 0x2E, 0xE4, 0x02, 0xA2, 0x90, 0xE1, 0x4E, 0xBA, + 0x00, 0x3C, 0x4E, 0xBA, 0x2E, 0xE4, 0x00, 0xA2, 0x02, 0x3C, 0x4E, 0xBA, + 0x01, 0x3C, 0x4E, 0xBA, 0x10, 0xAE, 0x03, 0x28, 0x03, 0x3C, 0x4E, 0xBA, + 0x10, 0xAE, 0x01, 0x4C, 0x10, 0xAE, 0x02, 0x4C, 0x22, 0xD0, 0x6B, 0x3C, + 0x6A, 0x34, 0x00, 0x4C, 0x4E, 0xBA, 0x44, 0x07, 0x84, 0xE1, 0x07, 0x00, + 0x72, 0xCC, 0x00, 0xA2, 0x90, 0xE1, 0x90, 0xE1, 0x3E, 0xBA, 0x2E, 0xE4, + 0x02, 0xA2, 0xB7, 0x3C, 0x97, 0xA9, 0x11, 0xAE, 0x44, 0x00, 0x05, 0xE0, + 0x8D, 0xA9, 0x11, 0xAE, 0x93, 0xA9, 0x11, 0xAE, 0x2E, 0xE4, 0xF4, 0x06, + 0x1A, 0xE4, 0x46, 0xE0, 0x2E, 0x07, 0x1E, 0xE4, 0x4B, 0x07, 0x1E, 0xE4, + 0x6A, 0xF0, 0x70, 0x07, 0x1E, 0xE4, 0x9A, 0xF0, 0x02, 0xA2, 0x3A, 0xF0, + 0x76, 0x09, 0x1E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, + 0x3A, 0xF0, 0x29, 0x08, 0x1E, 0xE4, 0x70, 0x3C, 0x2E, 0xE4, 0x00, 0xA2, + 0x2E, 0xE4, 0x02, 0xA2, 0x4F, 0xBA, 0x4E, 0xBA, 0x07, 0x3C, 0x02, 0xA2, + 0x21, 0xAE, 0x4F, 0xBA, 0x56, 0xE0, 0x11, 0xAE, 0x12, 0x3C, 0x02, 0xA8, + 0x4A, 0xE0, 0x55, 0xE0, 0x13, 0x3C, 0x0E, 0xA8, 0x02, 0xAF, 0x4A, 0xE0, + 0x14, 0x3C, 0x02, 0xA8, 0x08, 0xAF, 0x4A, 0xE0, 0x16, 0x3C, 0x15, 0x34, + 0x0A, 0xAF, 0x4A, 0xE0, 0x1E, 0xE4, 0xB7, 0x3C, 0x06, 0xA0, 0xB7, 0x28, + 0xC0, 0xE0, 0x8A, 0xF0, 0x12, 0x28, 0x52, 0x09, 0xE6, 0x07, 0x0A, 0xE4, + 0x02, 0xA1, 0x59, 0x00, 0x94, 0x3C, 0x08, 0x28, 0xD7, 0x07, 0x0E, 0xE4, + 0x05, 0xE0, 0x4E, 0xBA, 0x95, 0x3C, 0x09, 0x28, 0xE8, 0x07, 0x08, 0xE4, + 0x46, 0xE0, 0x9D, 0x00, 0x46, 0xE0, 0x01, 0x00, 0x05, 0xE0, 0x4E, 0xBA, + 0x05, 0xE0, 0x4E, 0xBA, 0xE8, 0x07, 0x08, 0xE4, 0xE8, 0x07, 0x08, 0xE4, + 0x46, 0xE0, 0x2A, 0x00, 0x10, 0xAE, 0x4E, 0xBA, 0x49, 0xE0, 0x4E, 0xBA, + 0xFF, 0x3F, 0x08, 0xE0, 0x4A, 0xE0, 0x55, 0xE0, 0x06, 0xA8, 0x1C, 0xAF, + 0x4A, 0xE0, 0x08, 0x3C, 0x4E, 0xBA, 0x49, 0xE0, 0x4E, 0xBA, 0x0A, 0x3C, + 0x08, 0xE0, 0x4A, 0xE0, 0x55, 0xE0, 0x10, 0xAE, 0x1C, 0xAF, 0x4A, 0xE0, + 0x09, 0x3C, 0xFF, 0x3F, 0x0E, 0xA0, 0xB7, 0x28, 0x0B, 0x3C, 0x06, 0xA8, + 0xCA, 0xF0, 0x94, 0x18, 0x08, 0x28, 0xB7, 0x3C, 0x8A, 0xF0, 0x95, 0x18, + 0x09, 0x28, 0x4E, 0xF0, 0x4B, 0xF0, 0x95, 0x4A, 0x94, 0x2A, 0x02, 0xA2, + 0x08, 0x28, 0x34, 0x3C, 0xFC, 0xA2, 0x82, 0x3C, 0x09, 0x28, 0x0C, 0x3C, + 0x08, 0xAF, 0x1E, 0xA0, 0xA4, 0xCC, 0x0D, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x5A, 0xF0, 0x0E, 0x3C, 0x18, 0xE0, 0x0C, 0x82, 0xF0, 0x3C, 0x02, 0xA2, + 0x2E, 0xE4, 0x02, 0xA2, 0x0B, 0x4C, 0x0A, 0x28, 0x2E, 0xE4, 0x00, 0xA2, + 0x09, 0x28, 0x0F, 0x3C, 0x08, 0x28, 0x68, 0xF0, 0x0A, 0x2A, 0x02, 0xA2, + 0x2E, 0xE4, 0x10, 0x3C, 0xB6, 0xB6, 0x03, 0xA1, 0xB6, 0xB6, 0x03, 0xA1, + 0x02, 0xA2, 0x00, 0x3C, 0x56, 0xB6, 0x03, 0xA1, 0x03, 0xA1, 0x96, 0xB6, + 0x03, 0xA1, 0x0A, 0x2A, 0x01, 0x3C, 0x36, 0xB6, 0x03, 0xA1, 0x76, 0xB6, + 0xB6, 0xB6, 0x03, 0xA1, 0x0B, 0x2A, 0x02, 0xA2, 0x56, 0xB6, 0x03, 0xA1, + 0xB6, 0xB6, 0x03, 0xA1, 0x03, 0xA1, 0x0B, 0x2A, 0x02, 0xA2, 0x02, 0x3C, + 0x03, 0xA1, 0x76, 0xB6, 0x03, 0xA1, 0x96, 0xB6, 0xA4, 0xCC, 0x08, 0x28, + 0x03, 0x3C, 0x36, 0xB6, 0x01, 0x7C, 0x0F, 0xC7, 0x18, 0xE0, 0x00, 0x82, + 0xA4, 0xCC, 0x09, 0x28, 0x0F, 0x3C, 0x90, 0xE1, 0x03, 0x7C, 0x0F, 0xC7, + 0x18, 0xE0, 0x02, 0x82, 0x82, 0x28, 0x2E, 0xE4, 0x10, 0x3C, 0x90, 0xE1, + 0x12, 0x28, 0x78, 0x03, 0x1E, 0xE4, 0x2E, 0xE4, 0x17, 0x3C, 0x8A, 0x03, + 0x1E, 0xE4, 0x68, 0xF0, 0x8A, 0x03, 0x1E, 0xE4, 0x8A, 0x03, 0x1E, 0xE4, + 0x8A, 0x03, 0x1E, 0xE4, 0xFA, 0xF2, 0x18, 0x3C, 0x1A, 0x3C, 0x8A, 0x03, + 0x1E, 0xE4, 0x19, 0x3C, 0x1B, 0x3C, 0x8A, 0x03, 0x1E, 0xE4, 0xCA, 0xF1, + 0x96, 0x3C, 0x0E, 0xA2, 0x80, 0x06, 0x66, 0xE1, 0x9F, 0x09, 0x1E, 0xE4, + 0x9F, 0x09, 0x1E, 0xE4, 0x9F, 0x09, 0x1E, 0xE4, 0x9F, 0x09, 0x1E, 0xE4, + 0x96, 0x3C, 0x0C, 0xA2, 0x84, 0x06, 0x66, 0xE1, 0x9F, 0x09, 0x1E, 0xE4, + 0x9F, 0x09, 0x1E, 0xE4, 0x9F, 0x09, 0x1E, 0xE4, 0x9F, 0x09, 0x1E, 0xE4, + 0x00, 0x02, 0x66, 0xE1, 0xBA, 0xF0, 0x19, 0x28, 0xB0, 0x09, 0x1E, 0xE4, + 0x96, 0x3C, 0x10, 0xA2, 0xB0, 0x09, 0x1E, 0xE4, 0xB0, 0x09, 0x1E, 0xE4, + 0x0C, 0xA2, 0x1C, 0x3C, 0x8A, 0x03, 0x1E, 0xE4, 0x06, 0xA2, 0x1D, 0x3C, + 0x94, 0x03, 0x1E, 0xE4, 0x00, 0xA2, 0x1E, 0x3C, 0x94, 0x03, 0x1E, 0xE4, + 0x1F, 0x3C, 0x8A, 0x03, 0x1E, 0xE4, 0x20, 0x3C, 0x20, 0x3C, 0x8A, 0x03, + 0x1E, 0xE4, 0xDA, 0xF1, 0x0C, 0xA2, 0x88, 0x06, 0x66, 0xE1, 0x9A, 0xF1, + 0x1E, 0xE4, 0xBC, 0x09, 0x1E, 0xE4, 0x96, 0x3C, 0x1E, 0xE4, 0xBC, 0x09, + 0x1E, 0xE4, 0xBC, 0x09, 0x0C, 0xA2, 0x8C, 0x06, 0x66, 0xE1, 0xBC, 0x09, + 0x1E, 0xE4, 0xBC, 0x09, 0x1E, 0xE4, 0x96, 0x3C, 0x1E, 0xE4, 0xBC, 0x09, + 0x1E, 0xE4, 0xBC, 0x09, 0x94, 0x03, 0x1E, 0xE4, 0x04, 0xA2, 0xBC, 0x09, + 0x21, 0x3C, 0x21, 0x58, 0x02, 0xA2, 0x21, 0x3C, 0x00, 0xE4, 0x10, 0xA1, + 0x50, 0x09, 0x06, 0xE4, 0x94, 0x03, 0x1E, 0xE4, 0x0E, 0xA2, 0x50, 0x09, + 0x08, 0xA2, 0xB0, 0x06, 0x66, 0xE1, 0x22, 0x3C, 0x1E, 0xE4, 0xCC, 0x09, + 0x1E, 0xE4, 0x96, 0x3C, 0x1E, 0xE4, 0xCC, 0x09, 0x1E, 0xE4, 0xCC, 0x09, + 0x12, 0x28, 0xCC, 0x09, 0x1E, 0xE4, 0xCC, 0x09, 0x23, 0x3C, 0x8A, 0x03, + 0x1E, 0xE4, 0xDA, 0xF1, 0x00, 0xA2, 0x24, 0x3C, 0x8A, 0x03, 0x1E, 0xE4, + 0x04, 0xA2, 0x58, 0xF0, 0x23, 0x28, 0x25, 0x3C, 0x00, 0xA2, 0x25, 0x3C, + 0x94, 0x03, 0x1E, 0xE4, 0x04, 0xA2, 0x58, 0xF0, 0x24, 0x28, 0x26, 0x3C, + 0x1E, 0xE4, 0x26, 0x3C, 0x94, 0x03, 0x1E, 0xE4, 0x8A, 0x03, 0x1E, 0xE4, + 0x27, 0x3C, 0x8A, 0x03, 0x29, 0x3C, 0x8A, 0x03, 0x1E, 0xE4, 0x28, 0x3C, + 0x1E, 0xE4, 0x02, 0x00, 0x04, 0xE0, 0x58, 0xF0, 0x02, 0xA2, 0x48, 0xF0, + 0x12, 0x28, 0xE1, 0x0E, 0x8A, 0x03, 0x1E, 0xE4, 0x4E, 0xF0, 0x2A, 0x3C, + 0x00, 0xA2, 0x30, 0x02, 0x67, 0xE1, 0x2A, 0x3C, 0xBA, 0xF1, 0x08, 0xA1, + 0x00, 0x28, 0x00, 0x3C, 0x65, 0xE1, 0xF0, 0x0E, 0x1E, 0xE4, 0x00, 0x28, + 0x01, 0x3C, 0x08, 0x01, 0x04, 0xE0, 0x00, 0x09, 0x07, 0x2B, 0x80, 0x03, + 0x1E, 0xE4, 0x15, 0x29, 0x49, 0xE0, 0xCC, 0x03, 0x1E, 0xE4, 0x4A, 0xF0, + 0x01, 0x3C, 0x02, 0xA1, 0x01, 0x28, 0x17, 0x3F, 0x02, 0xA0, 0x00, 0x28, + 0x90, 0xE1, 0x48, 0xF7, 0x2F, 0x3C, 0x00, 0xA2, 0x4E, 0xF6, 0x00, 0x3C, + 0x4A, 0xF0, 0x2B, 0x3C, 0x8A, 0x03, 0x1E, 0xE4, 0x12, 0x28, 0x2F, 0x3C, + 0xCC, 0x03, 0x1E, 0xE4, 0xCC, 0x03, 0x1E, 0xE4, 0x4E, 0x09, 0x0A, 0xE4, + 0x2D, 0x3C, 0xCC, 0x03, 0x1E, 0xE4, 0x2C, 0x3C, 0x66, 0xE1, 0x2E, 0x3C, + 0xCC, 0x03, 0x1E, 0xE4, 0xDA, 0xF0, 0x8A, 0x03, 0x1E, 0xE4, 0x03, 0x02, + 0x1E, 0xE4, 0x16, 0x3D, 0xCC, 0x03, 0x1E, 0xE4, 0xCC, 0x03, 0x1E, 0xE4, + 0x16, 0x3D, 0xCC, 0x03, 0x16, 0x3D, 0xCC, 0x03, 0x1E, 0xE4, 0x16, 0x3D, + 0x8A, 0x03, 0x1E, 0xE4, 0x07, 0x02, 0x66, 0xE1, 0x16, 0x3D, 0xCC, 0x03, + 0x1E, 0xE4, 0xAA, 0xF0, 0x1E, 0xE4, 0x16, 0x3D, 0xCC, 0x03, 0x1E, 0xE4, + 0x0C, 0x0F, 0x1E, 0xE4, 0x16, 0x3D, 0xCC, 0x03, 0x0A, 0x02, 0x66, 0xE1, + 0x50, 0x06, 0x65, 0xE1, 0x8A, 0xF0, 0x26, 0xA1, 0x00, 0x3C, 0x00, 0xA2, + 0x00, 0x28, 0xDC, 0x09, 0x1E, 0xE4, 0x15, 0x29, 0x00, 0xA2, 0x8E, 0xF7, + 0x00, 0x3C, 0x02, 0xA0, 0x15, 0x29, 0x8A, 0xF0, 0x26, 0xA1, 0x00, 0x3C, + 0x02, 0xA0, 0x00, 0x28, 0xDC, 0x09, 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, + 0x8E, 0xF7, 0x00, 0x3C, 0x78, 0xF0, 0x13, 0x28, 0x2E, 0xE4, 0x00, 0xA2, + 0x7D, 0x3E, 0x7C, 0x3E, 0x7B, 0x3E, 0x01, 0xA2, 0x88, 0xF0, 0x02, 0xA1, + 0xCE, 0xF1, 0x7F, 0x3E, 0x03, 0xA2, 0x7F, 0x3E, 0x7B, 0x3E, 0x01, 0xA2, + 0x02, 0xA1, 0x3E, 0xF1, 0x7D, 0x3E, 0x7C, 0x3E, 0x7F, 0x3E, 0x7C, 0x3E, + 0x01, 0xA2, 0x88, 0xF0, 0xAE, 0xF0, 0x7D, 0x3E, 0x7B, 0x3E, 0x03, 0xA2, + 0x7B, 0x3E, 0x03, 0xA2, 0x78, 0xF0, 0x02, 0xA1, 0x2E, 0xF0, 0x7F, 0x3E, + 0x7D, 0x3E, 0x7C, 0x3E, 0x28, 0xF2, 0x12, 0x28, 0x2E, 0xE4, 0x0E, 0xF6, + 0x1B, 0x3C, 0x00, 0xA2, 0xC9, 0x0E, 0x1E, 0xE4, 0x07, 0x00, 0x22, 0xD0, + 0x80, 0x06, 0x66, 0xE1, 0x90, 0xE1, 0x16, 0x3D, 0x83, 0x09, 0x84, 0xE1, + 0x88, 0x06, 0x66, 0xE1, 0x00, 0xA2, 0x90, 0xE1, 0x8D, 0x09, 0x84, 0xE1, + 0x07, 0x00, 0x22, 0xD0, 0x02, 0xA2, 0x90, 0xE1, 0x90, 0xE1, 0x16, 0x3D, + 0x25, 0x3C, 0x00, 0xA2, 0x24, 0x3C, 0x23, 0x3C, 0x28, 0x3C, 0x27, 0x3C, + 0x00, 0xA2, 0x26, 0x3C, 0x11, 0xB6, 0x7D, 0x28, 0x03, 0xA2, 0x5E, 0xF0, + 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0x79, 0x3E, 0x1E, 0xE4, 0x96, 0x28, + 0xCA, 0xF0, 0x8A, 0x03, 0x8A, 0x03, 0x1E, 0xE4, 0x06, 0x3D, 0x94, 0x03, + 0x16, 0x3F, 0x13, 0xE0, 0x2A, 0xF0, 0x06, 0x2B, 0x2E, 0xE4, 0x16, 0x3D, + 0x00, 0xA2, 0x3E, 0xF0, 0x96, 0x28, 0x6A, 0xF0, 0x8A, 0x03, 0x1E, 0xE4, + 0x4E, 0xF0, 0x16, 0x3D, 0x94, 0x03, 0x1E, 0xE4, 0x2E, 0xE4, 0x16, 0x3D, + 0xFF, 0x00, 0x04, 0xE0, 0x96, 0x28, 0xCA, 0xF0, 0x8A, 0x03, 0x1E, 0xE4, + 0x1E, 0xE4, 0x06, 0x3D, 0x94, 0x03, 0x1E, 0xE4, 0x13, 0xE0, 0x2A, 0xF0, + 0x06, 0x2B, 0x8A, 0x03, 0x2E, 0xE4, 0x16, 0x81, 0x2E, 0xF0, 0x16, 0x3F, + 0x96, 0x28, 0xCA, 0xF0, 0x8A, 0x03, 0x1E, 0xE4, 0x1E, 0xE4, 0x06, 0x3D, + 0x94, 0x03, 0x1E, 0xE4, 0x13, 0xE0, 0x2A, 0xF0, 0x06, 0x2B, 0x8A, 0x03, + 0x2E, 0xE4, 0x16, 0x3D, 0x2E, 0xF0, 0x16, 0x3F, 0x4A, 0xF0, 0x06, 0x2B, + 0x80, 0x03, 0x1E, 0xE4, 0x16, 0x3F, 0x49, 0xE0, 0xA6, 0x03, 0x1E, 0xE4, + 0xFE, 0xA2, 0x66, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x12, 0x28, 0x70, 0x3C, + 0x02, 0xA2, 0x67, 0x3C, 0x00, 0xA2, 0x73, 0x3C, 0x16, 0xE0, 0x71, 0x3C, + 0x4B, 0x05, 0x1E, 0xE4, 0x74, 0x3C, 0x72, 0x3C, 0x59, 0x14, 0x1E, 0xE4, + 0xEE, 0x03, 0x1E, 0xE4, 0x7B, 0x02, 0x1E, 0xE4, 0xDC, 0x13, 0x1E, 0xE4, + 0xE9, 0x03, 0x1E, 0xE4, 0xF8, 0x11, 0x1E, 0xE4, 0x55, 0x0A, 0x1E, 0xE4, + 0xF2, 0x11, 0x1E, 0xE4, 0x69, 0x4C, 0x16, 0xE0, 0x36, 0x0B, 0x1E, 0xE4, + 0x21, 0x28, 0x90, 0x06, 0x66, 0xE1, 0x69, 0x3C, 0x44, 0xCC, 0x02, 0xA1, + 0xFA, 0xF0, 0x02, 0xA1, 0x49, 0xE0, 0x4E, 0xBA, 0x1B, 0x0A, 0x84, 0xE1, + 0x4E, 0xBA, 0x55, 0xE0, 0x10, 0xAE, 0x4E, 0xBA, 0x16, 0x3F, 0x16, 0x37, + 0x55, 0xE0, 0x20, 0xAE, 0x73, 0x3C, 0x70, 0x3C, 0x00, 0xA2, 0x90, 0xE1, + 0x74, 0x3C, 0x72, 0x3C, 0x02, 0xA2, 0x71, 0x3C, 0xBE, 0x04, 0x1E, 0xE4, + 0x4B, 0x05, 0x1E, 0xE4, 0x38, 0xF1, 0x02, 0xA1, 0x1A, 0xF2, 0x21, 0x28, + 0xE9, 0x03, 0x1E, 0xE4, 0x67, 0x0B, 0x1E, 0xE4, 0x6A, 0x24, 0x00, 0xA2, + 0x79, 0x0A, 0x1E, 0xE4, 0x45, 0xE0, 0x73, 0xC8, 0x06, 0xAE, 0x6B, 0x4C, + 0x69, 0x3C, 0x69, 0x4C, 0x02, 0xA2, 0x47, 0xF0, 0x7F, 0x0B, 0x1E, 0xE4, + 0x2E, 0xE4, 0x02, 0xA2, 0xE9, 0x03, 0x1E, 0xE4, 0x67, 0x0B, 0x1E, 0xE4, + 0x80, 0x0A, 0x1E, 0xE4, 0x72, 0xCC, 0x00, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, + 0x2E, 0xE4, 0x02, 0xA2, 0x24, 0x4C, 0x23, 0x4C, 0x16, 0xE0, 0x12, 0x28, + 0x02, 0xA2, 0x7A, 0x3C, 0x22, 0x28, 0x3A, 0xF0, 0x00, 0xA2, 0x77, 0x3C, + 0xFE, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x68, 0x3C, 0x76, 0x3C, + 0x77, 0x3E, 0x03, 0xA0, 0x77, 0x2A, 0x75, 0x3C, 0x75, 0x28, 0xFD, 0xF0, + 0x80, 0x0D, 0x1E, 0xE4, 0x64, 0xF7, 0x0C, 0x18, 0x75, 0x3C, 0x02, 0xA0, + 0x0D, 0x18, 0x76, 0x3C, 0x02, 0xA0, 0x76, 0x28, 0x02, 0xA2, 0xA9, 0x0D, + 0x1E, 0xE4, 0xF4, 0xF6, 0x0E, 0x2A, 0x67, 0x3C, 0x77, 0x28, 0x2E, 0xE4, + 0x00, 0xA2, 0x6A, 0xE1, 0x68, 0x3E, 0x45, 0xE0, 0x1E, 0xE4, 0x78, 0x03, + 0x1E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x1E, 0x0B, 0x1A, 0xE4, 0xFB, 0x0A, + 0x76, 0x3C, 0x00, 0xA2, 0x77, 0x3C, 0xFE, 0xA2, 0x76, 0x28, 0x6A, 0xE1, + 0x8B, 0x3C, 0x75, 0x3C, 0x8B, 0x3C, 0x52, 0xE0, 0x03, 0xA1, 0x21, 0x2A, + 0x76, 0x28, 0x72, 0xF0, 0x21, 0x18, 0x76, 0x28, 0x78, 0x03, 0x1E, 0xE4, + 0x87, 0x10, 0x18, 0xE4, 0x1E, 0xE4, 0xBB, 0x10, 0x1E, 0xE4, 0x9E, 0xF0, + 0x1E, 0xE4, 0x11, 0x00, 0x04, 0xE0, 0x7C, 0x03, 0x9D, 0xF1, 0xE2, 0x0A, + 0x1E, 0xE4, 0xD0, 0x10, 0x10, 0x00, 0x04, 0xE0, 0xAA, 0x10, 0x1E, 0xE4, + 0x02, 0xA0, 0x76, 0x28, 0xD0, 0x10, 0x1E, 0xE4, 0x1E, 0xE4, 0xD4, 0xF5, + 0x0D, 0x18, 0x76, 0x3C, 0x1E, 0xE4, 0x8B, 0x3C, 0x00, 0xA2, 0xA9, 0x0D, + 0x8B, 0x3C, 0x02, 0xA0, 0x8B, 0x28, 0xBD, 0x0A, 0x2E, 0xE4, 0x02, 0xA2, + 0xA4, 0xF7, 0x21, 0x18, 0x00, 0xA2, 0x6A, 0xE1, 0x1E, 0x0B, 0x1E, 0xE4, + 0x8B, 0x2A, 0x00, 0x08, 0x04, 0xE0, 0x2E, 0xE4, 0x9C, 0xE0, 0x1C, 0xE0, + 0x98, 0xC7, 0xA5, 0xCC, 0xA5, 0xCC, 0x8B, 0x2A, 0x90, 0x06, 0x04, 0xE0, + 0x16, 0x81, 0x9E, 0xE0, 0x1C, 0xE0, 0x82, 0xC7, 0x16, 0x81, 0x16, 0x81, + 0x16, 0x81, 0x16, 0x81, 0x16, 0x81, 0x16, 0x81, 0x16, 0x81, 0x16, 0x81, + 0x16, 0x21, 0x16, 0x81, 0x16, 0x81, 0x16, 0x81, 0x07, 0xAE, 0x17, 0x4F, + 0x17, 0x27, 0x16, 0x4D, 0x69, 0x4C, 0x02, 0xA2, 0x46, 0xF0, 0x46, 0xE0, + 0x58, 0xF1, 0x70, 0x28, 0x2E, 0xE4, 0x69, 0x3C, 0x77, 0x2A, 0x67, 0x28, + 0x75, 0x3C, 0x00, 0xA2, 0x77, 0x28, 0x44, 0xF0, 0x77, 0x3E, 0x03, 0xA0, + 0x80, 0x0D, 0x1E, 0xE4, 0xB2, 0xF0, 0x67, 0x18, 0x75, 0x3C, 0x02, 0xA0, + 0x75, 0x28, 0x8D, 0xF0, 0x2E, 0xE4, 0x02, 0xA2, 0x14, 0xF7, 0x0C, 0x18, + 0xFE, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x6B, 0xE1, 0x6A, 0xE1, 0x76, 0x3C, + 0x00, 0xA2, 0x77, 0x3C, 0x77, 0x2A, 0x67, 0x28, 0x75, 0x3C, 0x00, 0xA2, + 0x77, 0x28, 0x44, 0xF0, 0x77, 0x3E, 0x03, 0xA0, 0x80, 0x0D, 0x1E, 0xE4, + 0x22, 0xF1, 0x67, 0x18, 0x75, 0x3C, 0x02, 0xA0, 0x75, 0x28, 0xFD, 0xF0, + 0x02, 0xA0, 0x76, 0x28, 0x14, 0xF7, 0x0C, 0x18, 0x1E, 0xE4, 0xA4, 0xF6, + 0x0D, 0x18, 0x76, 0x3C, 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, 0xA9, 0x0D, + 0x1E, 0xE4, 0x6A, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, 0x02, 0xA0, 0x75, 0x28, + 0x2D, 0xF1, 0xBE, 0x0D, 0x03, 0xA0, 0x77, 0x2A, 0x0C, 0x18, 0x75, 0x3C, + 0x75, 0x3C, 0x00, 0xA2, 0x64, 0xF7, 0x77, 0x3E, 0x0D, 0x18, 0x76, 0x3C, + 0x02, 0xA0, 0x76, 0x28, 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, 0xF4, 0xF6, + 0x15, 0x26, 0x00, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x42, 0xE0, 0xB7, 0x2E, + 0x42, 0xE0, 0x16, 0x4E, 0x91, 0xF1, 0x45, 0xE0, 0x73, 0xC8, 0x06, 0xAE, + 0x3A, 0xF1, 0x49, 0xE0, 0x46, 0xE0, 0x73, 0xC8, 0x44, 0xCC, 0xB4, 0xF0, + 0x02, 0xA1, 0x0A, 0xAF, 0x4E, 0xBA, 0x4E, 0xBA, 0x4F, 0x0B, 0x84, 0xE1, + 0x90, 0xE1, 0x4E, 0xBA, 0x4E, 0xBA, 0x90, 0xE1, 0x3A, 0xF0, 0x3E, 0xA8, + 0x4A, 0xE0, 0x90, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, 0x06, 0x92, 0x9C, 0xE0, + 0x15, 0x26, 0x00, 0xA2, 0x2D, 0x0F, 0x1E, 0xE4, 0x42, 0xE0, 0xB7, 0x2E, + 0x42, 0xE0, 0x16, 0x4E, 0x18, 0xA0, 0x40, 0xA0, 0x2B, 0xF0, 0x6F, 0x2A, + 0x00, 0xA2, 0x2E, 0xE4, 0xDE, 0xF5, 0x06, 0xAE, 0xB7, 0x2E, 0x42, 0xE0, + 0x16, 0x4E, 0x15, 0x26, 0xE5, 0xF0, 0x03, 0xA1, 0x21, 0x2A, 0x42, 0xE0, + 0x1C, 0xE0, 0x83, 0xC7, 0xA5, 0xCC, 0x4B, 0xF0, 0x61, 0xF0, 0x45, 0xE0, + 0x73, 0xC8, 0x06, 0xAE, 0x42, 0x0B, 0x0E, 0xE4, 0x46, 0xE0, 0x73, 0xC8, + 0x66, 0xE1, 0x2E, 0xE4, 0x00, 0xA2, 0x90, 0xE1, 0x00, 0xA2, 0xA0, 0x06, + 0x67, 0xE1, 0x90, 0x06, 0xB7, 0x2E, 0x42, 0xE0, 0x16, 0x4E, 0x15, 0x26, + 0x01, 0xF2, 0x11, 0xA1, 0x21, 0x2A, 0x42, 0xE0, 0xA5, 0xCC, 0xD7, 0xF1, + 0x03, 0xA1, 0x21, 0x2A, 0x17, 0x3D, 0x17, 0x35, 0x1C, 0xE0, 0x83, 0xC7, + 0x45, 0xCC, 0x03, 0xA1, 0x03, 0xA1, 0x21, 0x2A, 0x16, 0x4F, 0x16, 0x27, + 0x9E, 0x0B, 0x84, 0xE1, 0x6A, 0x26, 0x17, 0x3D, 0x17, 0x35, 0x42, 0xE0, + 0x12, 0x28, 0x07, 0xA1, 0x45, 0xE0, 0x6B, 0x4E, 0x41, 0xE0, 0xB7, 0x2C, + 0x0F, 0xA1, 0x28, 0xF0, 0x02, 0xA2, 0x90, 0xE1, 0x16, 0x3F, 0x16, 0x37, + 0x1E, 0xE4, 0x01, 0xA2, 0x06, 0xA2, 0x2E, 0xE4, 0x1E, 0xE4, 0x59, 0x14, + 0x1E, 0xE4, 0x41, 0x14, 0x1E, 0xE4, 0x7B, 0x02, 0x1E, 0xE4, 0xDC, 0x13, + 0x1E, 0xE4, 0x2E, 0xE4, 0x02, 0xA2, 0xBD, 0x0B, 0x03, 0xA8, 0x41, 0x2A, + 0x00, 0xA2, 0x21, 0x14, 0x41, 0x2A, 0x02, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, + 0x41, 0x2A, 0x12, 0xA9, 0x2B, 0xF0, 0x05, 0xA8, 0x41, 0x2A, 0x40, 0xA9, + 0x2B, 0xF0, 0x09, 0xA8, 0xC2, 0xE0, 0x80, 0xA9, 0x2B, 0xF0, 0x11, 0xA8, + 0x59, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x0C, 0x04, 0x2A, 0xE4, 0x02, 0xA1, + 0x0A, 0xF2, 0x02, 0xA1, 0x4A, 0xF2, 0x02, 0xA1, 0x4A, 0xF0, 0x02, 0xA1, + 0x08, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xC0, 0xE0, 0x52, 0x30, + 0x02, 0xAF, 0x51, 0x30, 0xC0, 0xE0, 0x50, 0x3C, 0x1E, 0xA8, 0x60, 0x00, + 0xC1, 0xE0, 0x54, 0x3C, 0x3E, 0xA8, 0x61, 0x00, 0x65, 0x00, 0xC0, 0xE0, + 0x09, 0xA8, 0x65, 0x00, 0x4C, 0x3C, 0x32, 0xB6, 0x06, 0xA8, 0x06, 0xAF, + 0xA0, 0x34, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x14, 0xAE, 0x61, 0x00, + 0xC0, 0xE0, 0xA1, 0x3C, 0x2E, 0xE4, 0x2E, 0xE4, 0xA3, 0x3C, 0xA2, 0x34, + 0x0A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x02, 0xA1, 0x2A, 0xE4, + 0x02, 0xA1, 0x6D, 0x0C, 0x98, 0x0C, 0x0A, 0xE4, 0x02, 0xA1, 0x5A, 0xF0, + 0x75, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x7E, 0x00, 0xC2, 0xE0, + 0x7D, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x78, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, + 0xD2, 0xB7, 0xB1, 0x2A, 0x34, 0x28, 0x79, 0x00, 0x49, 0xE0, 0x34, 0x28, + 0x77, 0x00, 0xC2, 0xE0, 0xB6, 0xB7, 0x14, 0x2A, 0xB6, 0xB7, 0x03, 0xA0, + 0x52, 0x4E, 0x51, 0x2A, 0xF2, 0xB7, 0xB1, 0x2A, 0x71, 0x00, 0xC2, 0xE0, + 0xF2, 0xB7, 0xB1, 0x46, 0x54, 0x00, 0xC2, 0xE0, 0x39, 0x4C, 0x38, 0x24, + 0x6F, 0x00, 0xC2, 0xE0, 0x09, 0x4C, 0x08, 0x20, 0x70, 0x00, 0xC2, 0xE0, + 0x3B, 0x4C, 0x3A, 0x24, 0x12, 0x28, 0x72, 0x00, 0xC2, 0xE0, 0x68, 0x28, + 0x1E, 0xE4, 0x73, 0x00, 0xC2, 0xE0, 0x02, 0xA8, 0x00, 0xA2, 0x7C, 0x00, + 0xC2, 0xE0, 0x99, 0x0C, 0x56, 0xE0, 0xFF, 0x00, 0x09, 0xE0, 0x36, 0x2A, + 0xFF, 0x00, 0x09, 0xE0, 0x37, 0x2A, 0x10, 0xAE, 0x09, 0xE0, 0x35, 0x2A, + 0x10, 0xAE, 0x56, 0xE0, 0x13, 0x4C, 0x0E, 0xAE, 0x56, 0xE0, 0xFF, 0x00, + 0x7A, 0x00, 0xC2, 0xE0, 0x14, 0x4C, 0x02, 0xAE, 0x03, 0xA1, 0x78, 0x2A, + 0x02, 0xAE, 0x78, 0x28, 0x56, 0xE0, 0x21, 0xAE, 0x69, 0x2A, 0x32, 0xB6, + 0xC2, 0xE0, 0x56, 0xE0, 0x29, 0xAE, 0x82, 0x2A, 0x20, 0xAE, 0x4D, 0xC8, + 0x4A, 0xC8, 0x76, 0x00, 0x02, 0xA2, 0x53, 0x00, 0xC2, 0xE0, 0x56, 0xE0, + 0x74, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x7A, 0x00, 0xC2, 0xE0, + 0x79, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x72, 0x00, 0xC2, 0xE0, 0xFE, 0xA2, + 0xC2, 0xE0, 0x76, 0x00, 0xC2, 0xE0, 0x6D, 0x00, 0x73, 0x00, 0xC2, 0xE0, + 0x08, 0xA2, 0x77, 0x00, 0x71, 0x00, 0xC2, 0xE0, 0x09, 0x4C, 0x08, 0x20, + 0x56, 0xE0, 0x2F, 0xAE, 0x07, 0x2A, 0x13, 0x28, 0x99, 0x0C, 0x1E, 0xE4, + 0x7B, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x83, 0x28, 0x75, 0x00, 0xC2, 0xE0, + 0xF0, 0x58, 0x16, 0xE0, 0x83, 0x28, 0x70, 0x00, 0x2E, 0xE4, 0x02, 0xA2, + 0x78, 0x00, 0xC2, 0xE0, 0x0B, 0x4C, 0x04, 0xAE, 0x0A, 0x28, 0x2E, 0xE4, + 0x09, 0x4C, 0x1C, 0xAE, 0x08, 0x4C, 0x1C, 0xAE, 0x1E, 0xE4, 0x26, 0x01, + 0x1E, 0xE4, 0x2E, 0xE4, 0x1E, 0xE4, 0x5E, 0x0D, 0x1E, 0xE4, 0x4E, 0x02, + 0x31, 0xD1, 0x07, 0x00, 0x30, 0xD1, 0x91, 0x06, 0x4C, 0xD0, 0x01, 0x00, + 0x4B, 0xD0, 0x02, 0x00, 0x3A, 0xD0, 0x00, 0x00, 0x08, 0xD0, 0x00, 0x00, + 0x4C, 0xCC, 0x4A, 0xCC, 0x00, 0xA2, 0x00, 0x00, 0xEB, 0x3C, 0x00, 0xA2, + 0x83, 0x3C, 0x00, 0xA2, 0x2D, 0x0F, 0x1E, 0xE4, 0xD2, 0x0B, 0x1E, 0xE4, + 0x1E, 0xE4, 0xB7, 0x3C, 0x00, 0xA2, 0xDA, 0xF0, 0x1E, 0xE4, 0x7A, 0xF0, + 0x00, 0xA1, 0xD2, 0x06, 0x02, 0xA2, 0x38, 0xF0, 0x12, 0x28, 0xEA, 0x07, + 0x1E, 0xE4, 0xA9, 0x05, 0x1E, 0xE4, 0x83, 0x3C, 0xC3, 0x0F, 0x1A, 0xE4, + 0xEB, 0x28, 0x00, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x6A, 0xE1, + 0x1E, 0xE4, 0xAE, 0x06, 0x1E, 0xE4, 0xB8, 0x05, 0x44, 0xCC, 0x00, 0xA2, + 0x2E, 0xE4, 0x59, 0x14, 0xB5, 0x3C, 0x82, 0x3C, 0x4C, 0xCC, 0x4A, 0xCC, + 0x30, 0xD1, 0x78, 0x3C, 0x69, 0x3C, 0xB4, 0x3C, 0x08, 0xD0, 0x02, 0x00, + 0x31, 0xD1, 0x07, 0x00, 0x1E, 0xE4, 0x00, 0x00, 0x3A, 0xD0, 0x00, 0x00, + 0x1E, 0xE4, 0x6F, 0x3C, 0x00, 0xA2, 0xD2, 0x0B, 0x00, 0xA2, 0x3A, 0x0D, + 0x0A, 0xE4, 0x2D, 0x0F, 0x1E, 0xE4, 0x07, 0x06, 0x1E, 0xE4, 0xB7, 0x3C, + 0x1E, 0xE4, 0x24, 0x0F, 0x1E, 0xE4, 0xC0, 0x06, 0x1E, 0xE4, 0x63, 0x0E, + 0x1E, 0xE4, 0xDB, 0x11, 0x1E, 0xE4, 0x48, 0xF3, 0xB1, 0x28, 0xAD, 0x0B, + 0xFA, 0xF2, 0x58, 0x07, 0x1E, 0xE4, 0x6B, 0x0D, 0x6F, 0x0D, 0x1E, 0xE4, + 0x6B, 0x0D, 0x1E, 0xE4, 0xB1, 0x28, 0x6B, 0x0D, 0x1E, 0xE4, 0xA8, 0xF2, + 0x38, 0xF2, 0x27, 0x08, 0x1E, 0xE4, 0x68, 0xF2, 0x0F, 0x06, 0x1E, 0xE4, + 0x6B, 0x0D, 0x1E, 0xE4, 0x1E, 0xE4, 0x6B, 0x0D, 0x1E, 0xE4, 0xEA, 0xF1, + 0x6B, 0x0D, 0x1E, 0xE4, 0x9A, 0xF1, 0x67, 0x07, 0x1E, 0xE4, 0x63, 0x0D, + 0x18, 0xE4, 0x29, 0x28, 0x9B, 0xF0, 0xCD, 0x13, 0x1E, 0xE4, 0xBB, 0x0B, + 0x1E, 0xE4, 0x00, 0x03, 0x05, 0xE0, 0x06, 0xA2, 0x69, 0x14, 0x1E, 0xE4, + 0x34, 0x28, 0x41, 0x14, 0x37, 0x06, 0x1E, 0xE4, 0xE5, 0x09, 0x1E, 0xE4, + 0x4C, 0x0A, 0x1E, 0xE4, 0x67, 0x0D, 0x1E, 0xE4, 0x88, 0x12, 0x1E, 0xE4, + 0x26, 0x0F, 0x1E, 0xE4, 0x00, 0x0C, 0x1E, 0xE4, 0xAE, 0x0E, 0x1E, 0xE4, + 0x02, 0xA0, 0x34, 0x28, 0x68, 0xF0, 0x82, 0x28, 0x2E, 0xE4, 0xC3, 0x0F, + 0x1A, 0xE4, 0x16, 0xE0, 0x35, 0x3C, 0xFE, 0xA2, 0x34, 0x3C, 0xFC, 0xA2, + 0x00, 0xA2, 0x3C, 0x3C, 0x37, 0x3C, 0x36, 0x3C, 0x3E, 0x3C, 0x3D, 0x3C, + 0xB1, 0x3C, 0xAE, 0x3C, 0x28, 0xCA, 0x2E, 0xE4, 0x3A, 0x3C, 0x3B, 0x3C, + 0xC9, 0x0E, 0x1E, 0xE4, 0x2E, 0xE4, 0xF8, 0xF7, 0x04, 0xA2, 0x2E, 0xE4, + 0x45, 0x13, 0x1E, 0xE4, 0x06, 0xA2, 0x2E, 0xE4, 0xE1, 0x0E, 0x1E, 0xE4, + 0x78, 0x28, 0x2E, 0xE4, 0xE1, 0x0E, 0x1E, 0xE4, 0x4C, 0x28, 0x2E, 0xE4, + 0x78, 0x3C, 0x02, 0xA0, 0x02, 0xA1, 0x4A, 0xF0, 0x02, 0xA1, 0x2A, 0xE4, + 0x78, 0xF0, 0x12, 0x28, 0x9E, 0xF0, 0x5A, 0xF0, 0x3A, 0xF0, 0x04, 0xA1, + 0x12, 0x28, 0x4E, 0xF0, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, + 0x75, 0x28, 0x22, 0x22, 0x09, 0xE0, 0x05, 0xCB, 0x58, 0xF0, 0x06, 0xCF, + 0x76, 0x4C, 0x10, 0xAE, 0xAE, 0xF0, 0xD0, 0x0D, 0x1E, 0xE4, 0x6A, 0xE1, + 0x05, 0xCB, 0xE2, 0x0D, 0x1E, 0xE4, 0x3B, 0xF0, 0x1E, 0xE4, 0x3B, 0xF0, + 0x03, 0xA8, 0x21, 0xAF, 0x02, 0xCF, 0x08, 0xA9, 0x84, 0x28, 0x25, 0x0E, + 0x70, 0x2A, 0x02, 0xCF, 0x02, 0xA9, 0x84, 0x28, 0x29, 0xE4, 0xE8, 0xF7, + 0x02, 0xA8, 0x02, 0xCB, 0xDA, 0xF7, 0x02, 0xA8, 0x14, 0xAF, 0x04, 0xCB, + 0xDE, 0x12, 0x1E, 0xE4, 0x8C, 0x12, 0x1E, 0xE4, 0x09, 0xE0, 0x05, 0xCB, + 0x70, 0x28, 0x2E, 0xE4, 0x1E, 0xE4, 0x3B, 0xF0, 0x7A, 0xF0, 0x22, 0x22, + 0x2E, 0xE4, 0x0B, 0x0E, 0x1E, 0xE4, 0xE2, 0x0D, 0x3B, 0xF0, 0x03, 0xA8, + 0x21, 0xAF, 0x05, 0xCB, 0x18, 0xE4, 0x80, 0x28, 0x25, 0x0E, 0x1E, 0xE4, + 0x10, 0xAE, 0x75, 0x28, 0x2E, 0xE4, 0x49, 0x0E, 0x08, 0xA9, 0x84, 0x28, + 0x06, 0xCF, 0x76, 0x4C, 0x02, 0xCF, 0x06, 0xA9, 0x84, 0x28, 0x02, 0xCF, + 0x1E, 0xE4, 0xE8, 0xF7, 0x02, 0xA8, 0x02, 0xCB, 0x2E, 0xE4, 0xDE, 0x12, + 0x1E, 0xE4, 0x8C, 0x12, 0x85, 0x3C, 0x46, 0x3C, 0x00, 0xA2, 0x70, 0x2A, + 0x1E, 0xE4, 0xB9, 0xF0, 0x86, 0x3C, 0x49, 0x3C, 0x80, 0x28, 0xF1, 0x0D, + 0x1E, 0xE4, 0xF1, 0x0D, 0x1E, 0xE4, 0x2F, 0x0E, 0x1E, 0xE4, 0x58, 0xF0, + 0x70, 0x28, 0x9A, 0x3E, 0x2E, 0xE4, 0x2F, 0x0E, 0x1E, 0xE4, 0x3B, 0xF0, + 0x5A, 0xF0, 0x45, 0xA8, 0x09, 0xE0, 0x9A, 0x2A, 0x2E, 0xE4, 0x0B, 0x0E, + 0xF1, 0x0D, 0x1E, 0xE4, 0x3B, 0xF0, 0x00, 0x02, 0x46, 0x2E, 0x45, 0x4C, + 0x44, 0x20, 0x2E, 0xE4, 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x11, 0xAE, + 0x00, 0x01, 0x04, 0xE0, 0x85, 0x2A, 0x20, 0xCE, 0x22, 0xCE, 0x20, 0x01, + 0x04, 0xE0, 0x3B, 0xF0, 0x19, 0x00, 0x13, 0xD1, 0x20, 0x00, 0x12, 0xD1, + 0x46, 0x2C, 0x85, 0x3C, 0x02, 0xAA, 0x85, 0x28, 0x44, 0x20, 0x2E, 0xE4, + 0x46, 0x3C, 0x02, 0xA0, 0x42, 0xE0, 0x11, 0xAE, 0x46, 0x2E, 0x45, 0x4C, + 0x85, 0x2A, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x04, 0xE0, 0x3B, 0xF0, + 0x00, 0x01, 0x04, 0xE0, 0x20, 0x00, 0x12, 0xD1, 0x22, 0xCE, 0x20, 0x01, + 0x02, 0xAA, 0x85, 0x28, 0x18, 0x00, 0x13, 0xD1, 0x46, 0x3C, 0x02, 0xA0, + 0x46, 0x2C, 0x85, 0x3C, 0x80, 0x28, 0x88, 0xF0, 0x70, 0x28, 0x2E, 0xE4, + 0x2E, 0xE4, 0x49, 0x0E, 0x1E, 0xE4, 0x4A, 0xF0, 0x47, 0x20, 0x2E, 0xE4, + 0x2F, 0x0E, 0x1E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0x49, 0x2E, 0x48, 0x4C, + 0x86, 0x2A, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x04, 0xE0, 0x3B, 0xF0, + 0x80, 0x00, 0x04, 0xE0, 0x20, 0x00, 0x12, 0xD1, 0x22, 0xCE, 0xA0, 0x00, + 0x02, 0xAA, 0x86, 0x28, 0x19, 0x00, 0x13, 0xD1, 0x49, 0x3C, 0x02, 0xA0, + 0x49, 0x2C, 0x86, 0x3C, 0x49, 0x2E, 0x48, 0x4C, 0x47, 0x20, 0x2E, 0xE4, + 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x11, 0xAE, 0x80, 0x00, 0x04, 0xE0, + 0x86, 0x2A, 0x20, 0xCE, 0x22, 0xCE, 0xA0, 0x00, 0x04, 0xE0, 0x3B, 0xF0, + 0x18, 0x00, 0x13, 0xD1, 0x20, 0x00, 0x12, 0xD1, 0x49, 0x2C, 0x86, 0x3C, + 0x02, 0xAA, 0x86, 0x28, 0x3F, 0x28, 0x2E, 0xE4, 0x49, 0x3C, 0x02, 0xA0, + 0x00, 0xA2, 0x32, 0xF0, 0x53, 0x28, 0x53, 0x3C, 0x59, 0x3C, 0x58, 0x3C, + 0x00, 0xA2, 0x51, 0x3C, 0x57, 0x3C, 0x0D, 0x28, 0x56, 0x3C, 0x0C, 0x28, + 0x24, 0xE4, 0x53, 0x28, 0x2A, 0xE4, 0x51, 0x28, 0x54, 0x28, 0x43, 0x01, + 0xC2, 0xE0, 0x53, 0x28, 0xC2, 0xE0, 0x00, 0xA2, 0x44, 0x01, 0xC2, 0xE0, + 0x20, 0xAE, 0x02, 0xA1, 0x56, 0x28, 0x49, 0x01, 0x42, 0x01, 0xC2, 0xE0, + 0x02, 0xA1, 0x57, 0x4C, 0x50, 0x2A, 0x20, 0xAE, 0xA9, 0x13, 0x1E, 0xE4, + 0x2E, 0xE4, 0x4E, 0x01, 0xC2, 0xE0, 0x42, 0xE0, 0x23, 0xE4, 0x57, 0x1A, + 0x59, 0x2A, 0x53, 0x28, 0x03, 0xA2, 0x59, 0x4C, 0x10, 0xAE, 0x58, 0x28, + 0x03, 0xAE, 0x5A, 0x2A, 0x5A, 0x3E, 0x15, 0xB6, 0xC1, 0xE0, 0x56, 0xE0, + 0x21, 0xAE, 0x03, 0xA9, 0x4D, 0x01, 0xC2, 0xE0, 0xE9, 0xF7, 0x4B, 0x01, + 0x58, 0x2A, 0x4A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x65, 0xF0, 0x56, 0x1A, + 0x58, 0x3E, 0x03, 0xA0, 0x01, 0xA2, 0x59, 0x3E, 0x03, 0xA0, 0x59, 0x2A, + 0x4A, 0xF1, 0x51, 0x28, 0x2E, 0xE4, 0x58, 0x3E, 0x9E, 0xFD, 0x32, 0xF0, + 0x57, 0x18, 0x59, 0x28, 0xE8, 0xF7, 0x4B, 0x01, 0xC0, 0xE0, 0xCE, 0xF7, + 0x4D, 0x01, 0xC2, 0xE0, 0x20, 0xAE, 0x04, 0xA2, 0x90, 0xE1, 0x4A, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0x14, 0x2A, 0xE8, 0xF7, 0x4B, 0x01, 0xC0, 0xE0, + 0x53, 0x3C, 0x3F, 0x3C, 0xF6, 0xB7, 0x34, 0x28, 0x40, 0x00, 0xC1, 0xE0, + 0x00, 0xA2, 0x2E, 0xE4, 0x17, 0xAE, 0x4E, 0x00, 0x05, 0xE0, 0x42, 0xE0, + 0x03, 0xAE, 0x00, 0x1C, 0x05, 0xE0, 0x42, 0xE0, 0x20, 0xCE, 0xF9, 0xF7, + 0x29, 0xCA, 0x42, 0xE0, 0x50, 0x04, 0x12, 0xD1, 0x00, 0x02, 0x11, 0xD1, + 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x43, 0x4C, 0x42, 0x20, + 0x90, 0x3C, 0x2E, 0xE4, 0x11, 0xD1, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, + 0x90, 0x28, 0x50, 0x04, 0x12, 0xD1, 0x00, 0x02, 0x2E, 0xE4, 0xF8, 0xF7, + 0x28, 0xCA, 0x26, 0xCE, 0x18, 0xE0, 0x08, 0x01, 0x82, 0xE1, 0xA4, 0xCC, + 0x42, 0xE0, 0x40, 0x00, 0xC1, 0xE0, 0x02, 0xAE, 0x42, 0xE0, 0x17, 0xAE, + 0x4E, 0x00, 0x05, 0xE0, 0x42, 0xE0, 0x03, 0xAE, 0x50, 0x20, 0x05, 0xE0, + 0x11, 0xD1, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x13, 0xD1, 0x08, 0x01, + 0x12, 0xD1, 0x00, 0x09, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, + 0x42, 0xE0, 0x40, 0x00, 0xC1, 0xE0, 0x00, 0xA2, 0x42, 0xE0, 0x17, 0xAE, + 0x4E, 0x00, 0x05, 0xE0, 0x42, 0xE0, 0x03, 0xAE, 0x50, 0x25, 0x05, 0xE0, + 0x11, 0xD1, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x13, 0xD1, 0x28, 0x00, + 0x12, 0xD1, 0x50, 0x06, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, + 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x2E, 0xE4, + 0x2E, 0xE4, 0x2E, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x0A, 0xE4, 0x02, 0xA1, 0x3A, 0x0F, 0x0A, 0xE4, 0x42, 0x0F, 0x0A, 0xE4, + 0x02, 0xA1, 0x5C, 0x0F, 0x4E, 0x02, 0x1E, 0xE4, 0x5C, 0x0F, 0x0E, 0xE4, + 0xA3, 0x0C, 0xA2, 0x04, 0xA1, 0x4C, 0xA0, 0x24, 0x1E, 0xAE, 0x06, 0xA2, + 0xA5, 0x3C, 0xA4, 0x34, 0xC0, 0xE0, 0x00, 0x06, 0x60, 0xD1, 0xC0, 0xCE, + 0xAA, 0x34, 0x51, 0x00, 0xC2, 0xE0, 0x48, 0x00, 0x00, 0xFE, 0x08, 0xE0, + 0xA6, 0x34, 0xAB, 0x3C, 0xFF, 0x01, 0x08, 0xE0, 0xAB, 0x2C, 0xA7, 0x3C, + 0x7D, 0xF0, 0x30, 0x11, 0x1E, 0xE4, 0xAC, 0x3C, 0x8F, 0x0F, 0x1E, 0xE4, + 0xA4, 0x0F, 0x1E, 0xE4, 0x6A, 0xE1, 0x00, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, + 0x70, 0xE4, 0x64, 0x0F, 0x1E, 0xE4, 0x2E, 0xE4, 0x80, 0x00, 0x04, 0xE0, + 0xF8, 0xF7, 0x28, 0xCA, 0x22, 0xCE, 0x0E, 0xAE, 0xAF, 0x28, 0x24, 0xCE, + 0xC0, 0xE0, 0x20, 0xCE, 0xA7, 0x4C, 0xA6, 0x24, 0x22, 0xA0, 0x02, 0xAE, + 0x06, 0xA8, 0x43, 0x00, 0xA6, 0x24, 0xF8, 0xF7, 0x28, 0xCA, 0x26, 0xCE, + 0xA6, 0x34, 0x00, 0x02, 0x00, 0xE0, 0xA7, 0x4C, 0x54, 0xF0, 0xA5, 0x1C, + 0xA4, 0x14, 0xA7, 0x3C, 0xA7, 0x3C, 0xA6, 0x34, 0xA1, 0x4C, 0xA0, 0x24, + 0x0E, 0xAE, 0xAF, 0x28, 0x00, 0x00, 0x4C, 0xD0, 0xAF, 0x3C, 0x16, 0xE0, + 0xAF, 0x28, 0x6E, 0xCC, 0x00, 0xA2, 0x2E, 0xE4, 0xB1, 0x28, 0x2E, 0xE4, + 0x64, 0x0F, 0x1E, 0xE4, 0x92, 0xCE, 0xAF, 0x3C, 0x71, 0xD0, 0x28, 0xE1, + 0x64, 0x0F, 0x1E, 0xE4, 0x02, 0xA1, 0xAC, 0x2C, 0x81, 0xE1, 0x20, 0x20, + 0xA1, 0x0F, 0x84, 0xE1, 0x44, 0xCC, 0x74, 0xF0, 0x2E, 0xE4, 0x90, 0xE1, + 0x90, 0xE1, 0x4E, 0xBA, 0x9E, 0xCC, 0x20, 0xAE, 0x95, 0x14, 0x04, 0xE0, + 0x00, 0x00, 0x34, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x00, 0x00, 0x35, 0xD0, + 0x00, 0x00, 0x33, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0xFF, 0x00, 0x36, 0xD0, + 0x00, 0x00, 0x39, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, 0x4C, 0xD0, + 0x01, 0x00, 0x4B, 0xD0, 0x00, 0x00, 0x47, 0xD0, 0x00, 0x00, 0x46, 0xD0, + 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0x00, 0x49, 0xD1, 0xCE, 0x0F, 0x0A, 0xE4, + 0x02, 0xA1, 0x59, 0x00, 0x0A, 0xE4, 0x02, 0xA1, 0x2A, 0xE4, 0x02, 0xA1, + 0xB5, 0x4C, 0xB4, 0x24, 0x2A, 0xE4, 0xCE, 0x0F, 0xAB, 0x3C, 0xAA, 0x34, + 0xAB, 0x0C, 0xAA, 0x04, 0xAA, 0x24, 0x74, 0xF0, 0xA5, 0x1C, 0xA4, 0x14, + 0xAA, 0x34, 0xA3, 0x1C, 0xA2, 0x14, 0xAB, 0x4C, 0xC2, 0xE0, 0xAB, 0x4C, + 0xAA, 0x24, 0xAB, 0x3C, 0x2E, 0xE4, 0x52, 0x00, 0xC2, 0xE0, 0x48, 0x00, + 0x2E, 0xE4, 0xB5, 0x3C, 0xB4, 0x34, 0x00, 0xA2, 0xFF, 0xFF, 0x08, 0xE0, + 0x11, 0x29, 0xA8, 0xF0, 0xFF, 0xFF, 0x09, 0xE0, 0x11, 0x2B, 0x20, 0xAE, + 0x08, 0xE0, 0x11, 0x29, 0xFE, 0xF0, 0x42, 0xE0, 0x09, 0xE0, 0x11, 0x2B, + 0x20, 0xAE, 0xFF, 0x00, 0x11, 0x2B, 0x10, 0xAE, 0x42, 0xE0, 0xFF, 0xFF, + 0x42, 0xE0, 0x11, 0xAF, 0x00, 0xFF, 0x09, 0xE0, 0x31, 0xAF, 0x49, 0xE0, + 0x2B, 0xE4, 0xB6, 0x2A, 0x49, 0xE0, 0x93, 0xE0, 0xFF, 0x00, 0x09, 0xE0, + 0x95, 0xE0, 0xFF, 0x00, 0x09, 0xE0, 0x21, 0xAF, 0xFF, 0x00, 0x09, 0xE0, + 0x11, 0xAF, 0x49, 0xE0, 0x56, 0xE0, 0x10, 0xAE, 0xFF, 0x00, 0x08, 0xE0, + 0x10, 0xAE, 0x56, 0xE0, 0x85, 0xE0, 0x10, 0xAE, 0x49, 0xE0, 0x2E, 0xE4, + 0x56, 0xE0, 0x83, 0xE0, 0x29, 0xCA, 0x2E, 0xE4, 0x46, 0xE0, 0x0F, 0xA8, + 0x20, 0xCE, 0xC0, 0x07, 0x11, 0xD1, 0xF9, 0xF7, 0x04, 0xE0, 0x45, 0xE0, + 0xA5, 0x4E, 0xA4, 0x26, 0x25, 0xCE, 0x03, 0xAF, 0x65, 0xE0, 0x40, 0x00, + 0x40, 0xA2, 0x3D, 0x10, 0x1E, 0xE4, 0xB0, 0x3E, 0xB0, 0x28, 0x24, 0xCE, + 0x26, 0xE4, 0xB0, 0x18, 0xA0, 0x24, 0x22, 0xCE, 0xC0, 0x07, 0x00, 0xE0, + 0x3D, 0x10, 0x1E, 0xE4, 0x20, 0xCE, 0xA1, 0x4C, 0x06, 0xA8, 0x43, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x28, 0xCA, 0x26, 0xCE, 0x02, 0xA0, 0x02, 0xAE, + 0xB9, 0x3C, 0xB8, 0x34, 0x2E, 0xE4, 0xF8, 0xF7, 0x49, 0x00, 0xC0, 0xE0, + 0xAD, 0x3C, 0x00, 0xA2, 0x45, 0x00, 0xC0, 0xE0, 0xBB, 0x3C, 0xBA, 0x34, + 0x49, 0x00, 0xC0, 0xE0, 0xAE, 0x30, 0x04, 0xAF, 0xBB, 0x1C, 0xBA, 0x10, + 0xA9, 0x3C, 0xA8, 0x34, 0xA8, 0x26, 0xAD, 0x3E, 0x11, 0xB6, 0xAD, 0x2A, + 0x33, 0xF0, 0xB9, 0x1E, 0xB8, 0x16, 0xA9, 0x4E, 0xB3, 0x1E, 0xB2, 0x16, + 0xA3, 0x0E, 0xA2, 0x06, 0xB1, 0x3C, 0xAE, 0x28, 0xC3, 0xF1, 0x00, 0xA2, + 0x17, 0xE0, 0x1B, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0xF8, 0xF5, 0xAD, 0x28, + 0x48, 0xF1, 0x52, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0xCA, 0x01, 0x1E, 0xE4, + 0xC0, 0xE0, 0x8A, 0xF5, 0x00, 0x40, 0x08, 0xE0, 0xC2, 0xE0, 0x00, 0x40, + 0x0A, 0xE0, 0x5D, 0x00, 0xAD, 0x3C, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, + 0x09, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0xEE, 0xF4, 0x04, 0xE0, 0x2E, 0xE4, + 0xC9, 0xF7, 0x00, 0x40, 0x42, 0xE0, 0x03, 0xAE, 0x8B, 0x2A, 0xA0, 0x06, + 0xAA, 0x26, 0x16, 0x4D, 0x16, 0x25, 0x9C, 0xE0, 0x49, 0xE0, 0x42, 0xE0, + 0x19, 0xA0, 0xAB, 0x4E, 0xA6, 0x36, 0x45, 0xE0, 0xFF, 0x01, 0x08, 0xE0, + 0xA7, 0x4C, 0xA6, 0x24, 0xAC, 0x3C, 0xA7, 0x3E, 0xA0, 0x04, 0x54, 0xF0, + 0xA5, 0x1C, 0xA4, 0x14, 0x1E, 0xE4, 0xA7, 0x3C, 0xA6, 0x34, 0xA1, 0x0C, + 0x00, 0xA2, 0x8F, 0x0F, 0x1E, 0xE4, 0xA4, 0x0F, 0xC0, 0x08, 0x04, 0xE0, + 0x2E, 0xE4, 0x72, 0xCC, 0x9C, 0xE0, 0x42, 0xE0, 0x05, 0xAE, 0x8B, 0x2A, + 0x16, 0x3D, 0x16, 0x35, 0xA7, 0x4C, 0xA6, 0x20, 0x16, 0x3D, 0xAF, 0x28, + 0x16, 0x3D, 0xAC, 0x28, 0x1E, 0xE4, 0x2E, 0xE4, 0xE2, 0x10, 0x1E, 0xE4, + 0x8B, 0x2A, 0xC0, 0x08, 0x04, 0xE0, 0xA4, 0x0F, 0x16, 0x21, 0x9C, 0xE0, + 0x42, 0xE0, 0x05, 0xAE, 0x16, 0x29, 0xA7, 0x3C, 0xA6, 0x34, 0x16, 0x4D, + 0x0E, 0xAE, 0xAF, 0x3C, 0x16, 0x29, 0xAC, 0x3C, 0x2E, 0xE4, 0x08, 0x11, + 0x1E, 0xE4, 0x92, 0xCE, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x90, 0x3C, + 0x4A, 0x26, 0x14, 0xAE, 0x8B, 0x28, 0x00, 0x00, 0x12, 0xD1, 0x20, 0xCE, + 0x42, 0xE0, 0x4B, 0x4E, 0x29, 0xCA, 0x26, 0xCE, 0x90, 0x28, 0x00, 0x01, + 0x00, 0x08, 0x04, 0xE0, 0x2E, 0xE4, 0xF9, 0xF7, 0x1C, 0xE0, 0x98, 0xC7, + 0xA5, 0xCC, 0x8B, 0x2A, 0x16, 0x3D, 0x16, 0x35, 0x60, 0xC8, 0x9C, 0xE0, + 0x64, 0xC8, 0x16, 0x3D, 0x16, 0x35, 0x62, 0xC8, 0x16, 0x3D, 0x66, 0xC8, + 0x16, 0x3D, 0x16, 0x35, 0x16, 0x3D, 0x6A, 0xC8, 0x16, 0x3D, 0x68, 0xC8, + 0x16, 0x3D, 0x6E, 0xC8, 0x16, 0x3D, 0x6C, 0xC8, 0x16, 0x35, 0x72, 0xC8, + 0x16, 0x3D, 0x70, 0xC8, 0x16, 0x3D, 0x16, 0x35, 0x8C, 0xC8, 0x16, 0x3D, + 0x2E, 0xE4, 0x16, 0x3D, 0x16, 0x35, 0x20, 0xCB, 0xA5, 0xCC, 0x8B, 0x2A, + 0x00, 0x08, 0x04, 0xE0, 0x16, 0x21, 0x9C, 0xE0, 0x1C, 0xE0, 0x98, 0xC7, + 0x16, 0x4D, 0x16, 0x21, 0x60, 0xCC, 0x16, 0x4D, 0x64, 0xCC, 0x16, 0x4D, + 0x16, 0x21, 0x62, 0xCC, 0x68, 0xCC, 0x16, 0x29, 0x66, 0xCC, 0x16, 0x29, + 0x6C, 0xCC, 0x16, 0x29, 0x6A, 0xCC, 0x16, 0x29, 0x70, 0xCC, 0x16, 0x29, + 0x6E, 0xCC, 0x16, 0x29, 0x16, 0x21, 0x72, 0xCC, 0x16, 0x4D, 0x16, 0x21, + 0x16, 0x4D, 0x16, 0x21, 0x8C, 0xCC, 0x16, 0x4D, 0x2E, 0xE4, 0x20, 0xCF, + 0x08, 0xAE, 0x08, 0xAF, 0x0A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x78, 0x11, 0x0A, 0xE4, 0x04, 0xA1, 0x38, 0x11, 0xB2, 0x34, 0x40, 0xA2, + 0xB6, 0x3C, 0x02, 0xA2, 0x27, 0xD0, 0xAB, 0x4C, 0xAA, 0x24, 0xB3, 0x3C, + 0x27, 0xD0, 0x46, 0x10, 0x1E, 0xE4, 0x00, 0x00, 0xAA, 0x24, 0x6A, 0x11, + 0x08, 0xE4, 0x01, 0x00, 0x95, 0xE0, 0x1B, 0x10, 0x1E, 0xE4, 0xAB, 0x4C, + 0x02, 0xAF, 0x84, 0xE0, 0x1F, 0x10, 0x1E, 0xE4, 0x1E, 0xE4, 0x92, 0xE0, + 0xC0, 0x07, 0x00, 0xE0, 0x40, 0xA1, 0xB5, 0x4C, 0xB4, 0x24, 0xB7, 0x11, + 0x2C, 0xA0, 0xB5, 0x4C, 0xB4, 0x24, 0x04, 0xF2, 0xAB, 0x4C, 0xAA, 0x24, + 0xB3, 0x3C, 0xB2, 0x34, 0x46, 0x10, 0x1E, 0xE4, 0x00, 0x00, 0x27, 0xD0, + 0x00, 0xA2, 0x48, 0xF0, 0x01, 0x00, 0x27, 0xD0, 0x49, 0x00, 0xC0, 0xE0, + 0x6B, 0xE1, 0x2E, 0xE4, 0x32, 0xF0, 0x46, 0xE0, 0x48, 0x00, 0xC1, 0xE0, + 0xB5, 0x3C, 0xB4, 0x34, 0xA3, 0x0C, 0xA2, 0x04, 0x2E, 0xE4, 0x02, 0xA2, + 0xC3, 0x0F, 0x1E, 0xE4, 0xAA, 0x24, 0xB3, 0x3C, 0xB2, 0x34, 0x18, 0xA2, + 0x1E, 0xE4, 0x00, 0x00, 0x27, 0xD0, 0xAB, 0x4C, 0xF8, 0xF2, 0x01, 0x00, + 0x27, 0xD0, 0x46, 0x10, 0x1B, 0x10, 0x1E, 0xE4, 0xAB, 0x4C, 0xAA, 0x24, + 0x84, 0xE0, 0x1F, 0x10, 0x1E, 0xE4, 0x95, 0xE0, 0x92, 0xE0, 0xC0, 0x07, + 0x00, 0xE0, 0x02, 0xAF, 0x02, 0xA8, 0x84, 0xE0, 0xB7, 0x11, 0x1E, 0xE4, + 0xB5, 0x0C, 0xB4, 0x00, 0xE8, 0x0F, 0x1E, 0xE4, 0xA2, 0x26, 0x86, 0xF1, + 0xB5, 0x3C, 0xB4, 0x34, 0xB4, 0x24, 0x42, 0xF1, 0x46, 0xE0, 0xA3, 0x4E, + 0xB5, 0x3C, 0xB4, 0x34, 0x18, 0xA0, 0xB5, 0x4C, 0xAB, 0x4C, 0xAA, 0x24, + 0xB3, 0x3C, 0xB2, 0x34, 0x46, 0x10, 0x1E, 0xE4, 0x00, 0x00, 0x27, 0xD0, + 0x00, 0xA2, 0x48, 0xF0, 0x01, 0x00, 0x27, 0xD0, 0xB4, 0x34, 0x00, 0xA2, + 0x6B, 0xE1, 0x2E, 0xE4, 0x11, 0x21, 0x2E, 0xE4, 0x02, 0xA2, 0xB5, 0x3C, + 0xBB, 0xF0, 0x03, 0xA8, 0x85, 0xE0, 0x09, 0x4D, 0x93, 0xE0, 0x05, 0xA0, + 0x83, 0xE0, 0x10, 0xAE, 0x83, 0xE0, 0x56, 0xE0, 0x11, 0xAF, 0x01, 0x2B, + 0x44, 0x00, 0x05, 0xE0, 0x93, 0xE0, 0x05, 0xA1, 0x11, 0xAE, 0x44, 0x00, + 0x05, 0xE0, 0x11, 0xAE, 0x11, 0xAE, 0x93, 0xA9, 0x11, 0xAE, 0x97, 0xA9, + 0x11, 0xB6, 0x41, 0xA2, 0x46, 0xE0, 0x8D, 0xA9, 0x82, 0xE0, 0x03, 0xAF, + 0xB5, 0x3E, 0xB4, 0x36, 0x0E, 0xA2, 0x2E, 0xE4, 0x92, 0xE0, 0x42, 0xE0, + 0x00, 0xA2, 0x00, 0x01, 0xC2, 0xE0, 0x40, 0xA9, 0xC2, 0xE0, 0x00, 0xA2, + 0x3D, 0x01, 0xC2, 0xE0, 0x92, 0xB6, 0x52, 0x4E, 0x51, 0x2A, 0x25, 0x01, + 0x78, 0x01, 0xC2, 0xE0, 0x1C, 0xA9, 0x08, 0xAE, 0x1E, 0xE4, 0x79, 0x01, + 0xC2, 0xE0, 0x18, 0xA2, 0x8E, 0x02, 0x1E, 0xE4, 0x2E, 0xE4, 0x75, 0x13, + 0x2E, 0xE4, 0x06, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x00, 0x01, 0xC2, 0xE0, + 0x40, 0xA9, 0x0E, 0xA2, 0x51, 0x2A, 0x3D, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x1C, 0xA9, 0x08, 0xAE, 0x92, 0xB6, 0x52, 0x4E, 0xC2, 0xE0, 0x18, 0xA2, + 0x78, 0x01, 0xC2, 0xE0, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x79, 0x01, + 0x40, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x00, 0x00, 0xB7, 0x06, 0x61, 0xE1, + 0x5B, 0xF0, 0x05, 0xA8, 0x03, 0x01, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0xC1, 0xE0, 0x10, 0x02, 0xC2, 0xE0, 0x02, 0xA2, 0x10, 0xAE, 0x30, 0x00, + 0x04, 0xE0, 0x46, 0x00, 0x5B, 0xF0, 0x09, 0xA8, 0x40, 0x2A, 0x42, 0xE0, + 0x11, 0x4D, 0x11, 0x21, 0xB9, 0x06, 0x61, 0xE1, 0x46, 0x00, 0xC1, 0xE0, + 0x11, 0x02, 0xC2, 0xE0, 0x40, 0x00, 0x00, 0xE0, 0x30, 0x00, 0x04, 0xE0, + 0x11, 0xA8, 0x40, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x11, 0x21, 0xBB, 0x06, + 0x61, 0xE1, 0x5B, 0xF0, 0x0C, 0x20, 0x12, 0x02, 0xC2, 0xE0, 0x11, 0x4D, + 0x01, 0x01, 0xC2, 0xE0, 0x08, 0xAE, 0x0D, 0x4C, 0x75, 0x13, 0x1E, 0xE4, + 0x05, 0x02, 0xC2, 0xE0, 0xC2, 0xE0, 0x06, 0xAE, 0x02, 0xA8, 0x12, 0x28, + 0x04, 0xA9, 0x04, 0xAE, 0x0E, 0xA2, 0x04, 0x01, 0x00, 0xA9, 0x06, 0xAE, + 0x12, 0x4C, 0x04, 0xAE, 0xC2, 0xE0, 0x00, 0xA2, 0x04, 0x02, 0xC2, 0xE0, + 0x82, 0x13, 0x1E, 0xE4, 0x04, 0xA2, 0x08, 0x02, 0x52, 0xB6, 0x16, 0xB6, + 0xCD, 0x13, 0x1E, 0xE4, 0x1E, 0xE4, 0x33, 0x28, 0x93, 0x13, 0x1E, 0xE4, + 0x16, 0x02, 0xC2, 0xE0, 0x16, 0xB6, 0xCD, 0x13, 0xC2, 0xE0, 0x0B, 0x02, + 0xC2, 0xE0, 0x34, 0x28, 0x17, 0x02, 0xC2, 0xE0, 0x1C, 0x28, 0x14, 0x02, + 0xC2, 0xE0, 0x16, 0x29, 0xB0, 0x06, 0x66, 0xE1, 0xC2, 0xE0, 0x16, 0x4D, + 0x16, 0x21, 0x54, 0x01, 0xC2, 0xE0, 0x16, 0x4D, 0x16, 0x21, 0x55, 0x01, + 0x1E, 0xE4, 0x5D, 0x13, 0x1E, 0xE4, 0x56, 0x01, 0x00, 0xA2, 0xEC, 0x12, + 0x1E, 0xE4, 0x30, 0x13, 0x0D, 0x03, 0xC2, 0xE0, 0x13, 0x01, 0xC2, 0xE0, + 0x2E, 0xE4, 0x02, 0xA2, 0x2B, 0x02, 0xC2, 0xE0, 0x2E, 0xE4, 0xE8, 0xF7, + 0x11, 0x01, 0xC0, 0xE0, 0x87, 0x3C, 0xFE, 0xA8, 0x10, 0xAF, 0xB2, 0xCB, + 0xB2, 0xCB, 0x15, 0x01, 0xC2, 0xE0, 0x30, 0xAE, 0xC3, 0xE0, 0x11, 0xB6, + 0x7F, 0xA2, 0x20, 0xA8, 0x49, 0xE0, 0x88, 0x30, 0xB2, 0xCB, 0x26, 0x01, + 0x14, 0xA8, 0x5A, 0xE0, 0x03, 0xAE, 0x03, 0xA8, 0x1F, 0xA8, 0xB3, 0xCB, + 0x14, 0xAE, 0x1A, 0xE0, 0x88, 0x28, 0x14, 0x01, 0xC2, 0xE0, 0x56, 0xE0, + 0x89, 0x20, 0x05, 0xA1, 0x78, 0xF1, 0xB5, 0xCB, 0x6E, 0xF0, 0x02, 0xAE, + 0x39, 0xF0, 0x8A, 0x4C, 0x02, 0xAE, 0x49, 0xE0, 0x49, 0xF0, 0x03, 0xA1, + 0x04, 0xE0, 0x0A, 0x03, 0xC2, 0xE0, 0x56, 0xE0, 0xC0, 0xE0, 0x0C, 0x03, + 0xC2, 0xE0, 0x55, 0x00, 0x2E, 0xE4, 0x9C, 0x3C, 0x9B, 0x34, 0xB0, 0x03, + 0x1A, 0xE0, 0x0C, 0x18, 0x02, 0xA0, 0x75, 0x28, 0x01, 0xA2, 0x52, 0xE0, + 0x1B, 0xE0, 0x76, 0x2A, 0x76, 0x28, 0x31, 0xB4, 0x75, 0x28, 0x91, 0xB6, + 0x06, 0xA1, 0x06, 0xA8, 0x4A, 0xE0, 0x51, 0xB4, 0x20, 0x01, 0xC3, 0xE0, + 0x95, 0xB4, 0x95, 0xB4, 0xBA, 0xCB, 0x21, 0x01, 0xC2, 0xE0, 0xB8, 0xCB, + 0xC2, 0xE0, 0xBC, 0xCB, 0x22, 0x01, 0xC2, 0xE0, 0x11, 0x01, 0xC0, 0xE0, + 0x2E, 0xE4, 0x23, 0x01, 0x10, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0xE8, 0xF7, + 0x59, 0x28, 0x2A, 0xE4, 0x52, 0x4C, 0x51, 0x28, 0x2E, 0xE4, 0x8C, 0x0E, + 0x14, 0xE4, 0x57, 0x18, 0x02, 0xA2, 0x0B, 0x03, 0xC2, 0xE0, 0x00, 0xA2, + 0x08, 0xB6, 0x35, 0x28, 0x02, 0x03, 0xC2, 0xE0, 0x08, 0xB6, 0x35, 0x28, + 0x80, 0x03, 0xC2, 0xE0, 0x08, 0xB6, 0x36, 0x28, 0x83, 0x03, 0xC2, 0xE0, + 0x08, 0xB6, 0x37, 0x28, 0x86, 0x03, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, + 0x89, 0x03, 0xC2, 0xE0, 0x89, 0x3C, 0x21, 0x04, 0x04, 0xE0, 0x02, 0x03, + 0x00, 0xA2, 0x8A, 0x3C, 0x42, 0x08, 0x04, 0xE0, 0x0C, 0xAE, 0x79, 0x28, + 0x03, 0x03, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, 0x30, 0x03, 0xC2, 0xE0, + 0xE0, 0x06, 0x66, 0xE1, 0x79, 0x28, 0x08, 0x03, 0x66, 0xE1, 0x38, 0xF0, + 0x31, 0x03, 0x67, 0xE1, 0x84, 0xE1, 0x07, 0x00, 0x22, 0xD0, 0xC0, 0x06, + 0x16, 0x4D, 0x10, 0xAE, 0x16, 0x29, 0x28, 0x13, 0x16, 0x4D, 0x10, 0xAE, + 0x16, 0x4D, 0x10, 0xAE, 0xC2, 0xE0, 0x0E, 0xA2, 0x90, 0xE1, 0x17, 0x9F, + 0x2E, 0xE4, 0x64, 0x01, 0x1E, 0xE4, 0x12, 0x03, 0x01, 0xA2, 0x3C, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0xFF, 0x00, 0x22, 0xD0, 0x00, 0x02, 0x66, 0xE1, + 0xC3, 0xE0, 0x16, 0x29, 0x3F, 0x13, 0x84, 0xE1, 0x03, 0xA0, 0x3F, 0x01, + 0xC2, 0xE0, 0x3E, 0x01, 0x3C, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x90, 0xE1, + 0x40, 0x00, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x17, 0xAE, 0x4E, 0x00, + 0x05, 0xE0, 0x42, 0xE0, 0x03, 0xAE, 0x80, 0x25, 0x05, 0xE0, 0x42, 0xE0, + 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x40, 0x00, 0x12, 0xD1, + 0xC0, 0x06, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x40, 0x00, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x17, 0xAE, 0x4E, 0x00, + 0x05, 0xE0, 0x42, 0xE0, 0x03, 0xAE, 0xC0, 0x25, 0x05, 0xE0, 0x42, 0xE0, + 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x00, 0x01, 0x12, 0xD1, + 0x00, 0x02, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x07, 0x2A, 0xAD, 0x13, 0x1E, 0xE4, 0x2E, 0xE4, 0x1E, 0xE4, 0x55, 0xE0, + 0x07, 0xAE, 0x17, 0xE0, 0xC2, 0xE0, 0x56, 0xE0, 0x0A, 0xAE, 0xA4, 0x13, + 0x1E, 0xE4, 0x92, 0xE0, 0x2E, 0xE4, 0x02, 0x01, 0x09, 0xAE, 0x17, 0xE0, + 0x07, 0x2A, 0xAD, 0x13, 0x06, 0xAE, 0xA4, 0x13, 0x1E, 0xE4, 0x55, 0xE0, + 0x56, 0xE0, 0x0F, 0xAE, 0x83, 0xE0, 0x56, 0xE0, 0x92, 0xE0, 0x2E, 0xE4, + 0x13, 0x02, 0xC2, 0xE0, 0x17, 0xE0, 0x07, 0x2A, 0xAD, 0x13, 0x1E, 0xE4, + 0xA4, 0x13, 0x1E, 0xE4, 0x55, 0xE0, 0x09, 0xAE, 0x0F, 0xAE, 0x83, 0xE0, + 0x56, 0xE0, 0x06, 0xAE, 0x2E, 0xE4, 0x15, 0x02, 0xC2, 0xE0, 0x56, 0xE0, + 0x02, 0xA8, 0x06, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x80, 0xA8, 0x60, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x44, 0x00, 0xC0, 0xE0, 0x58, 0xF0, + 0x20, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x44, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0x0E, 0xA8, 0x08, 0xE0, 0x56, 0xE0, 0x03, 0xAE, 0x0D, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0x07, 0xA8, 0x1B, 0xAF, 0x05, 0xA1, 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, + 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, 0x23, 0xAF, 0x44, 0x00, + 0xC1, 0xE0, 0x2E, 0xE4, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x07, 0xA8, + 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, 0x23, 0xAF, 0x2E, 0xE4, 0x01, 0xA2, + 0x2E, 0xE4, 0x13, 0xA2, 0x02, 0xA8, 0x20, 0xAF, 0x44, 0x00, 0xC0, 0xE0, + 0x60, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x3E, 0xA8, 0x61, 0x00, + 0xC0, 0xE0, 0x2A, 0xE4, 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, + 0xC2, 0xE0, 0x02, 0xA2, 0x9E, 0xE0, 0x00, 0x05, 0x02, 0xA8, 0x20, 0x04, + 0xC0, 0xE0, 0x0D, 0x04, 0x04, 0xAF, 0xA9, 0x13, 0x1E, 0xE4, 0xDA, 0xF7, + 0xBE, 0x13, 0x1E, 0xE4, 0xB6, 0x13, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0xA8, + 0x03, 0x14, 0x0B, 0xE4, 0x20, 0xAE, 0x56, 0xE0, 0x09, 0xAE, 0xC3, 0x13, + 0xFF, 0x1F, 0x09, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0xA2, 0x14, 0x1E, 0xE4, + 0x17, 0x9F, 0x56, 0xE0, 0x22, 0xD0, 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, + 0x14, 0x9E, 0x14, 0x14, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, + 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x1C, 0x14, 0x84, 0xE1, 0x02, 0x00, + 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, 0x03, 0xA2, 0xE4, 0xF1, + 0x34, 0x28, 0x2E, 0xE4, 0x88, 0xC7, 0xA4, 0xCC, 0x0D, 0x04, 0xC3, 0xE0, + 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, 0x19, 0xE0, 0xDB, 0xF7, 0x03, 0xA8, + 0x20, 0x04, 0xC1, 0xE0, 0x1E, 0xE4, 0x04, 0xAF, 0xAD, 0x13, 0x1E, 0xE4, + 0x56, 0xE0, 0x32, 0x2E, 0x20, 0xAE, 0xB6, 0x13, 0x08, 0xAE, 0x0D, 0x4C, + 0x0C, 0x20, 0x17, 0x9F, 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, + 0xC0, 0xE0, 0x6D, 0x3E, 0xEC, 0x3C, 0x2E, 0xE4, 0x11, 0xAE, 0x20, 0x00, + 0x05, 0xE0, 0x41, 0x00, 0x00, 0x07, 0x11, 0xD1, 0x6D, 0x08, 0x42, 0xE0, + 0x11, 0xD1, 0x80, 0x01, 0x00, 0xE0, 0x5E, 0xF8, 0xC0, 0x00, 0x12, 0xD1, + 0x20, 0xCE, 0x40, 0x0B, 0xF9, 0xF7, 0x29, 0xCA, 0x13, 0x01, 0xEC, 0x88, + 0x1E, 0xE4, 0x01, 0xA2, 0x06, 0xA2, 0x2E, 0xE4, 0x33, 0x28, 0x94, 0xE0, + 0x32, 0x28, 0x41, 0x14, 0x49, 0xE0, 0x92, 0xE0, 0x24, 0xE4, 0x02, 0xA1, + 0x82, 0xE0, 0x78, 0x14, 0x1E, 0xE4, 0x0C, 0xC4, 0xC1, 0xE0, 0x95, 0xE0, + 0x32, 0x2A, 0x8E, 0xF7, 0x49, 0xF0, 0x23, 0xA1, 0x23, 0xA8, 0x60, 0x00, + 0x33, 0x2A, 0x95, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x78, 0x14, + 0x1E, 0xE4, 0x04, 0xC4, 0x00, 0xE0, 0x18, 0xE0, 0x86, 0xC7, 0xA4, 0xCC, + 0x40, 0x04, 0x00, 0xE0, 0x9A, 0xE0, 0x00, 0x07, 0x00, 0x05, 0x01, 0xE0, + 0x07, 0xAE, 0x9C, 0xE0, 0x04, 0xAF, 0xAD, 0x13, 0x1E, 0xE4, 0x9F, 0xE0, + 0x69, 0xF0, 0x89, 0xE0, 0xB6, 0x13, 0x1E, 0xE4, 0x09, 0xAE, 0xD2, 0x13, + 0x1E, 0xE4, 0x1E, 0xA8, 0x42, 0xE0, 0x85, 0xE0, 0x20, 0xAE, 0x56, 0xE0, + 0x89, 0xE0, 0x9E, 0x14, 0x1E, 0xE4, 0x17, 0x9F, 0x1E, 0xE4, 0x17, 0x9F, + 0xA2, 0x14, 0x1B, 0xE4, 0x0D, 0x4C, 0x0C, 0x20, 0x2E, 0xE4, 0xAD, 0x14, + 0x0D, 0x4C, 0x0C, 0x20, 0x2E, 0xE4, 0x08, 0xAE, 0x23, 0xA1, 0x23, 0xA8, + 0x60, 0x00, 0xC1, 0xE0, 0x08, 0xAE, 0x0C, 0x4C, 0x0D, 0x20, 0x39, 0xF0, + 0x0D, 0x04, 0xC2, 0xE0, 0x02, 0xA2, 0x2E, 0xE4, 0x20, 0x04, 0xC0, 0xE0, + 0x0E, 0x04, 0xC2, 0xE0, 0x02, 0x00, 0x22, 0xD0, 0xDA, 0xF7, 0x02, 0xA8, + 0x15, 0x4D, 0x15, 0x21, 0xBC, 0x14, 0x84, 0xE1, 0x84, 0xE1, 0x02, 0x00, + 0x22, 0xD0, 0x17, 0x9F, 0x17, 0x9F, 0x16, 0x4D, 0x16, 0x21, 0xC3, 0x14, + 0x2E, 0xE4, 0x0D, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xA2, 0x00, 0x25, 0x00, 0x8C, 0x00, 0x56, 0x00, + 0x80, 0x00, 0xA2, 0x00, 0xCC, 0x00, 0x65, 0x00, 0x93, 0x00, 0xAC, 0x00, + 0x92, 0x00, 0xE1, 0x00, 0x80, 0x00, 0x9C, 0x00, 0x27, 0x00, 0xD6, 0x00, + 0x91, 0x00, 0x4B, 0x00, 0x84, 0x00, 0x81, 0x00, 0xFE, 0x00, 0xEF, 0x00, + 0xCE, 0x00, 0xB2, 0x00, 0xCC, 0x00, 0x80, 0x00, 0xA4, 0x00, 0xFE, 0x00, + 0x8C, 0x00, 0xEB, 0x00, 0x77, 0x00, 0xAA, 0x00, 0x82, 0x00, 0x80, 0x00, + 0xE4, 0x00, 0xE6, 0x00, 0xB4, 0x00, 0x94, 0x00, 0x4A, 0x00, 0x82, 0x00, + 0xFE, 0x00, 0xFE, 0x00, 0xEC, 0x00, 0xCB, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFE, 0x00, 0x88, 0x00, 0xFD, 0x00, 0x80, 0x00, 0x80, 0x00, 0xDB, 0x00, + 0xE4, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xF2, 0x00, 0x81, 0x00, 0xBD, 0x00, 0xDB, 0x00, 0xFF, 0x00, + 0xD5, 0x00, 0xE3, 0x00, 0x6A, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xD6, 0x00, 0xFC, 0x00, 0xE3, 0x00, 0x7E, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xD1, 0x00, 0x62, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xE2, 0x00, 0xEC, 0x00, 0xFF, 0x00, 0xF8, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xEE, 0x00, 0x85, 0x00, 0xB5, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xEA, 0x00, 0xDD, 0x00, 0xFE, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x9A, 0x00, 0xF7, 0x00, 0xCA, 0x00, 0x86, 0x00, 0x4E, 0x00, + 0xDB, 0x00, 0xFF, 0x00, 0xB4, 0x00, 0xC6, 0x00, 0x01, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xF3, 0x00, 0xFF, 0x00, 0xF9, 0x00, 0xB9, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x96, 0x00, 0xB8, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xE0, 0x00, 0xEC, 0x00, 0xFF, 0x00, 0xF7, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xD8, 0x00, 0x6E, 0x00, + 0x4D, 0x00, 0x80, 0x00, 0x80, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xFF, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFB, 0x00, + 0x65, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xF1, 0x00, + 0xAA, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xEC, 0x00, 0xFC, 0x00, + 0xF1, 0x00, 0x8B, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xD1, 0x00, + 0x74, 0x00, 0x25, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xE4, 0x00, + 0xF3, 0x00, 0xC4, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xCC, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xF5, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xFA, 0x00, 0xA0, 0x00, 0xCF, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xEE, 0x00, 0x66, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xD3, 0x00, 0xFF, 0x00, 0xE7, 0x00, 0x67, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xAB, 0x00, 0x98, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xF0, 0x00, 0xFF, 0x00, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xF3, 0x00, 0x87, 0x00, 0xB1, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xE1, 0x00, 0xEA, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xD3, 0x00, 0x81, 0x00, 0x50, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xE0, 0x00, 0xC2, 0x00, 0x01, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x01, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0xF6, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xDF, 0x00, 0xED, 0x00, + 0x23, 0x00, 0xC6, 0x00, 0xA0, 0x00, 0xA2, 0x00, 0xBB, 0x00, 0xC1, 0x00, + 0x83, 0x00, 0x3E, 0x00, 0x9B, 0x00, 0x91, 0x00, 0xAC, 0x00, 0xDD, 0x00, + 0xC6, 0x00, 0x2D, 0x00, 0xFC, 0x00, 0x9D, 0x00, 0xDC, 0x00, 0xB0, 0x00, + 0x2F, 0x00, 0x44, 0x00, 0x01, 0x00, 0xDD, 0x00, 0xA7, 0x00, 0x95, 0x00, + 0xD0, 0x00, 0x92, 0x00, 0xDF, 0x00, 0xFF, 0x00, 0xA2, 0x00, 0xDD, 0x00, + 0xF1, 0x00, 0x95, 0x00, 0x01, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xE0, 0x00, + 0xDD, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xFD, 0x00, 0xEA, 0x00, 0x8D, 0x00, 0xB8, 0x00, 0xC7, 0x00, 0xFF, 0x00, + 0xDC, 0x00, 0xDE, 0x00, 0x51, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xB0, 0x00, 0xF2, 0x00, 0xB5, 0x00, 0x63, 0x00, 0xFF, 0x00, 0xCA, 0x00, + 0xF9, 0x00, 0xBE, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xC5, 0x00, 0xD6, 0x00, 0xFD, 0x00, 0xE8, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xC4, 0x00, 0xF2, 0x00, 0xD2, 0x00, 0x79, 0x00, 0x63, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xC6, 0x00, 0xC9, 0x00, 0xFA, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xCA, 0x00, 0xF2, 0x00, 0xA3, 0x00, 0x5B, 0x00, 0x17, 0x00, + 0xD2, 0x00, 0xF7, 0x00, 0xBB, 0x00, 0xAA, 0x00, 0x01, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xEA, 0x00, 0xFF, 0x00, 0xF6, 0x00, 0xC8, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xB2, 0x00, 0x6D, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xF5, 0x00, 0xE7, 0x00, 0xFF, 0x00, 0xF1, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xC9, 0x00, 0x82, 0x00, + 0x2C, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xC0, 0x00, 0xCD, 0x00, 0xFD, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFB, 0x00, 0xEF, 0x00, + 0x84, 0x00, 0x01, 0x00, 0xA5, 0x00, 0xFF, 0x00, 0xD1, 0x00, 0xDB, 0x00, + 0x5E, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xDA, 0x00, 0xFB, 0x00, + 0xE1, 0x00, 0x88, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xBE, 0x00, + 0x64, 0x00, 0x16, 0x00, 0x80, 0x00, 0x80, 0x00, 0xA1, 0x00, 0xBA, 0x00, + 0xF5, 0x00, 0xAE, 0x00, 0x80, 0x00, 0x80, 0x00, 0xC7, 0x00, 0xFF, 0x00, + 0xF9, 0x00, 0xB6, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, 0xEB, 0x00, + 0xE8, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xF1, 0x00, 0x8F, 0x00, 0x7C, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xEA, 0x00, 0xE3, 0x00, 0x23, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xC1, 0x00, 0xFB, 0x00, 0xB5, 0x00, 0x4D, 0x00, 0x80, 0x00, 0xCD, 0x00, + 0xFF, 0x00, 0xD3, 0x00, 0x9D, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xE7, 0x00, 0xEC, 0x00, 0xFF, 0x00, 0xF7, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xEB, 0x00, 0x8D, 0x00, 0x79, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xE3, 0x00, 0xE1, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xFF, 0x00, 0xFB, 0x00, 0xBC, 0x00, 0x63, 0x00, 0x2D, 0x00, + 0xE0, 0x00, 0xFF, 0x00, 0xD9, 0x00, 0xC3, 0x00, 0x01, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xD5, 0x00, 0xFF, 0x00, 0xFB, 0x00, 0x01, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x01, 0x00, 0xCB, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xF8, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xB1, 0x00, 0x01, 0x00, + 0x89, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xE0, 0x00, 0xFF, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFB, 0x00, 0xF8, 0x00, + 0x09, 0x00, 0xFD, 0x00, 0xC0, 0x00, 0xFF, 0x00, 0xD0, 0x00, 0xCF, 0x00, + 0xAF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xC1, 0x00, 0xF3, 0x00, + 0xE0, 0x00, 0x0D, 0x00, 0xFF, 0x00, 0xC6, 0x00, 0xF9, 0x00, 0xB9, 0x00, + 0x11, 0x00, 0x49, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xB3, 0x00, 0xA1, 0x00, + 0xDD, 0x00, 0xAB, 0x00, 0xEA, 0x00, 0xFF, 0x00, 0xA7, 0x00, 0xEC, 0x00, + 0xF7, 0x00, 0x5F, 0x00, 0x01, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xB7, 0x00, + 0xD4, 0x00, 0xFD, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xFA, 0x00, 0xF4, 0x00, 0x5A, 0x00, 0xEF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xD1, 0x00, 0xD3, 0x00, 0x9B, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xBC, 0x00, 0xF8, 0x00, 0xC3, 0x00, 0x4D, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xC3, 0x00, 0x18, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xDB, 0x00, 0xDA, 0x00, 0xFB, 0x00, 0xEF, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xCD, 0x00, 0xFF, 0x00, 0xDB, 0x00, 0x33, 0x00, 0xC9, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xEF, 0x00, 0xBE, 0x00, 0x2E, 0x00, 0x45, 0x00, + 0xE4, 0x00, 0xFF, 0x00, 0xDA, 0x00, 0xC9, 0x00, 0x01, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFB, 0x00, 0xBF, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xA5, 0x00, 0xDF, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xD5, 0x00, 0xFF, 0x00, 0xF9, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF8, 0x00, 0x7C, 0x00, + 0x8D, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xF8, 0x00, + 0x10, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xBE, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xEC, 0x00, 0xFF, 0x00, + 0xE6, 0x00, 0x24, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0x01, 0x00, 0x95, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xE2, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xFF, 0x00, 0xC0, 0x00, 0xF7, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xF0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x86, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xFA, 0x00, 0x3E, 0x00, 0xD5, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x5D, 0x00, 0x37, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xEB, 0x00, 0xD5, 0x00, + 0x18, 0x00, 0xCA, 0x00, 0xA0, 0x00, 0xDC, 0x00, 0xBF, 0x00, 0xBA, 0x00, + 0x7E, 0x00, 0xFF, 0x00, 0xAF, 0x00, 0xF0, 0x00, 0xA9, 0x00, 0xE8, 0x00, + 0xB6, 0x00, 0x26, 0x00, 0xFF, 0x00, 0xAE, 0x00, 0xE4, 0x00, 0xB8, 0x00, + 0x2E, 0x00, 0x3D, 0x00, 0x80, 0x00, 0xBB, 0x00, 0xB2, 0x00, 0x97, 0x00, + 0xDB, 0x00, 0x8A, 0x00, 0xD8, 0x00, 0xFF, 0x00, 0xAA, 0x00, 0xF0, 0x00, + 0xE6, 0x00, 0x70, 0x00, 0x01, 0x00, 0x80, 0x00, 0xF7, 0x00, 0xBF, 0x00, + 0xC7, 0x00, 0xFA, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x9F, 0x00, + 0xFC, 0x00, 0xE4, 0x00, 0x6D, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xFF, 0x00, + 0xD7, 0x00, 0xD3, 0x00, 0x27, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xAC, 0x00, 0xE8, 0x00, 0xA2, 0x00, 0x4D, 0x00, 0xFF, 0x00, 0xB2, 0x00, + 0xF5, 0x00, 0xB4, 0x00, 0x34, 0x00, 0x01, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xC7, 0x00, 0xC6, 0x00, 0xF6, 0x00, 0xDC, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xDC, 0x00, 0xF9, 0x00, 0xBF, 0x00, 0x4A, 0x00, 0x7C, 0x00, 0x80, 0x00, + 0xFA, 0x00, 0xC1, 0x00, 0xB7, 0x00, 0xF3, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xDD, 0x00, 0xDB, 0x00, 0x82, 0x00, 0x47, 0x00, 0x18, 0x00, + 0xB6, 0x00, 0xF3, 0x00, 0xAA, 0x00, 0x9A, 0x00, 0x01, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xDB, 0x00, 0xF9, 0x00, 0xE1, 0x00, 0xB6, 0x00, + 0x80, 0x00, 0xE0, 0x00, 0xFF, 0x00, 0xF0, 0x00, 0x96, 0x00, 0x95, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xCD, 0x00, 0xD8, 0x00, 0xFC, 0x00, 0xE2, 0x00, + 0x80, 0x00, 0x80, 0x00, 0xAB, 0x00, 0xFF, 0x00, 0xAA, 0x00, 0x6C, 0x00, + 0x1C, 0x00, 0x80, 0x00, 0xFE, 0x00, 0xC2, 0x00, 0xB7, 0x00, 0xF2, 0x00, + 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xDF, 0x00, 0xFC, 0x00, 0xE6, 0x00, + 0x51, 0x00, 0x01, 0x00, 0xC0, 0x00, 0xFF, 0x00, 0xCB, 0x00, 0xCC, 0x00, + 0x7B, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xBC, 0x00, 0xF7, 0x00, + 0xD1, 0x00, 0x66, 0x00, 0x80, 0x00, 0xE9, 0x00, 0xFF, 0x00, 0xC4, 0x00, + 0x5F, 0x00, 0x14, 0x00, 0x80, 0x00, 0x80, 0x00, 0xAD, 0x00, 0xA4, 0x00, + 0xF3, 0x00, 0x99, 0x00, 0x80, 0x00, 0x80, 0x00, 0xCB, 0x00, 0xFF, 0x00, + 0xF8, 0x00, 0xDE, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, 0xD5, 0x00, + 0xD8, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFC, 0x00, 0xF6, 0x00, 0xAF, 0x00, 0xA8, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xCD, 0x00, 0xEB, 0x00, 0x2F, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xD3, 0x00, 0xFF, 0x00, 0xD7, 0x00, 0x74, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xD4, 0x00, 0x79, 0x00, 0x01, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xD6, 0x00, 0xD4, 0x00, 0xFD, 0x00, 0xEC, 0x00, 0x80, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xD5, 0x00, 0x54, 0x00, 0x8D, 0x00, 0x80, 0x00, + 0xFF, 0x00, 0xCA, 0x00, 0xC9, 0x00, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0xDB, 0x00, 0xF0, 0x00, 0xA0, 0x00, 0x50, 0x00, 0x2A, 0x00, + 0xCD, 0x00, 0xFF, 0x00, 0xB9, 0x00, 0xA2, 0x00, 0x01, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x01, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0xF4, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x01, 0x00, + 0xEE, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xF6, 0x00, 0xB0, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFC, 0x00, 0xF1, 0x00, 0xDF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xF9, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xF4, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xEA, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xF6, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xEF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xF8, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFB, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFB, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFA, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xD9, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xE1, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, + 0xF1, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, + 0xFA, 0x00, 0xEA, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, + 0xFA, 0x00, 0xF1, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFD, 0x00, + 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xDF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xEE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xF8, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xF9, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xF7, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFA, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFA, 0x00, + 0xFB, 0x00, 0xBA, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xEA, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xF4, 0x00, 0xFB, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFB, 0x00, 0xFB, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFD, 0x00, 0xF3, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFE, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFE, 0x00, 0xFD, 0x00, 0xEC, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFB, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFE, 0x00, 0xFD, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xF8, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFA, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFC, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xF8, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFD, 0x00, 0xF9, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFD, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFD, 0x00, 0xFD, 0x00, 0xF6, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFE, 0x00, 0xFB, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xFE, 0x00, 0xF8, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFD, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFB, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFB, 0x00, 0xF5, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFD, 0x00, + 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, + 0xFB, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xF9, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFA, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x00, 0xFD, 0x00, 0xF6, 0x00, 0xED, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0xFA, 0x00, 0xFA, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xE7, 0x00, 0xFE, 0x00, + 0xFE, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFD, 0x00, 0xF5, 0x00, 0xF3, 0x00, + 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFB, 0x00, 0xFB, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x0C, 0x00, 0x7B, 0x00, 0x06, 0x00, 0x21, 0x00, 0x24, 0x00, + 0x6C, 0x00, 0x8B, 0x00, 0x18, 0x00, 0x32, 0x00, 0x5D, 0x00, 0x09, 0x00, + 0x43, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0xD0, 0x00, 0x24, 0x00, 0x5D, 0x00, + 0x32, 0x00, 0x06, 0x00, 0x2E, 0x00, 0x6C, 0x00, 0x24, 0x00, 0x48, 0x00, + 0x18, 0x00, 0x7B, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x07, 0x00, 0x06, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x08, 0x00, + 0x0E, 0x00, 0x0D, 0x00, 0x0C, 0x00, 0x0B, 0x00, 0x11, 0x00, 0x11, 0x00, + 0x10, 0x00, 0x0F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x13, 0x00, 0x12, 0x00, + 0x16, 0x00, 0x16, 0x00, 0x15, 0x00, 0x15, 0x00, 0x19, 0x00, 0x18, 0x00, + 0x17, 0x00, 0x17, 0x00, 0x1C, 0x00, 0x1B, 0x00, 0x1A, 0x00, 0x19, 0x00, + 0x20, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1D, 0x00, 0x24, 0x00, 0x23, 0x00, + 0x22, 0x00, 0x21, 0x00, 0x27, 0x00, 0x26, 0x00, 0x25, 0x00, 0x25, 0x00, + 0x2B, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x2E, 0x00, + 0x2D, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x31, 0x00, 0x30, 0x00, 0x2F, 0x00, + 0x36, 0x00, 0x35, 0x00, 0x34, 0x00, 0x33, 0x00, 0x3A, 0x00, 0x39, 0x00, + 0x38, 0x00, 0x37, 0x00, 0x3E, 0x00, 0x3D, 0x00, 0x3C, 0x00, 0x3B, 0x00, + 0x42, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x46, 0x00, 0x45, 0x00, + 0x44, 0x00, 0x43, 0x00, 0x4A, 0x00, 0x49, 0x00, 0x48, 0x00, 0x47, 0x00, + 0x4D, 0x00, 0x4C, 0x00, 0x4C, 0x00, 0x4B, 0x00, 0x51, 0x00, 0x50, 0x00, + 0x4F, 0x00, 0x4E, 0x00, 0x55, 0x00, 0x54, 0x00, 0x53, 0x00, 0x52, 0x00, + 0x59, 0x00, 0x58, 0x00, 0x57, 0x00, 0x56, 0x00, 0x60, 0x00, 0x5F, 0x00, + 0x5D, 0x00, 0x5B, 0x00, 0x66, 0x00, 0x65, 0x00, 0x64, 0x00, 0x62, 0x00, + 0x6E, 0x00, 0x6C, 0x00, 0x6A, 0x00, 0x68, 0x00, 0x76, 0x00, 0x74, 0x00, + 0x72, 0x00, 0x70, 0x00, 0x80, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0x7A, 0x00, + 0x88, 0x00, 0x86, 0x00, 0x84, 0x00, 0x82, 0x00, 0x91, 0x00, 0x8F, 0x00, + 0x8C, 0x00, 0x8A, 0x00, 0x9D, 0x00, 0x9A, 0x00, 0x97, 0x00, 0x94, 0x00, + 0x07, 0x00, 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x0A, 0x00, + 0x09, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0D, 0x00, 0x0C, 0x00, + 0x13, 0x00, 0x12, 0x00, 0x11, 0x00, 0x10, 0x00, 0x17, 0x00, 0x16, 0x00, + 0x15, 0x00, 0x14, 0x00, 0x1B, 0x00, 0x1A, 0x00, 0x19, 0x00, 0x18, 0x00, + 0x1F, 0x00, 0x1E, 0x00, 0x1D, 0x00, 0x1C, 0x00, 0x23, 0x00, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0x27, 0x00, 0x26, 0x00, 0x25, 0x00, 0x24, 0x00, + 0x2B, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x28, 0x00, 0x2F, 0x00, 0x2E, 0x00, + 0x2D, 0x00, 0x2C, 0x00, 0x33, 0x00, 0x32, 0x00, 0x31, 0x00, 0x30, 0x00, + 0x37, 0x00, 0x36, 0x00, 0x35, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x3A, 0x00, + 0x39, 0x00, 0x38, 0x00, 0x44, 0x00, 0x42, 0x00, 0x40, 0x00, 0x3E, 0x00, + 0x4C, 0x00, 0x4A, 0x00, 0x48, 0x00, 0x46, 0x00, 0x54, 0x00, 0x52, 0x00, + 0x50, 0x00, 0x4E, 0x00, 0x5C, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x56, 0x00, + 0x64, 0x00, 0x62, 0x00, 0x60, 0x00, 0x5E, 0x00, 0x6C, 0x00, 0x6A, 0x00, + 0x68, 0x00, 0x66, 0x00, 0x74, 0x00, 0x72, 0x00, 0x70, 0x00, 0x6E, 0x00, + 0x80, 0x00, 0x7D, 0x00, 0x7A, 0x00, 0x77, 0x00, 0x8C, 0x00, 0x89, 0x00, + 0x86, 0x00, 0x83, 0x00, 0x98, 0x00, 0x95, 0x00, 0x92, 0x00, 0x8F, 0x00, + 0xA4, 0x00, 0xA1, 0x00, 0x9E, 0x00, 0x9B, 0x00, 0xB1, 0x00, 0xAD, 0x00, + 0xAA, 0x00, 0xA7, 0x00, 0xC1, 0x00, 0xBD, 0x00, 0xB9, 0x00, 0xB5, 0x00, + 0xD1, 0x00, 0xCD, 0x00, 0xC9, 0x00, 0xC5, 0x00, 0xE1, 0x00, 0xDD, 0x00, + 0xD9, 0x00, 0xD5, 0x00, 0xF5, 0x00, 0xEF, 0x00, 0xEA, 0x00, 0xE5, 0x00, + 0x08, 0x01, 0x03, 0x01, 0xFE, 0x00, 0xF9, 0x00, 0x1C, 0x01, 0x17, 0x01, + 0x12, 0x01, 0x0D, 0x01, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0xE4, + 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x1D, 0x02, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x37, 0x02, 0x0E, 0xE4, 0x78, 0x00, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, 0xC2, 0xE0, 0x00, 0xA2, + 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, + 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, 0x9A, 0xF0, 0x4A, 0x00, + 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, 0x00, 0xA2, 0xED, 0x3C, + 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0xC2, 0xE0, + 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0x5D, 0x00, 0xC3, 0xE0, + 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, 0x2A, 0x24, 0x71, 0xD0, + 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, 0x1E, 0xE4, 0x81, 0xE1, + 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, 0x59, 0x00, 0xC0, 0xE0, + 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x1D, 0x02, 0x00, 0xE0, 0x02, 0xAE, + 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, 0xC0, 0xE0, 0xEE, 0x3C, + 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, 0xC1, 0xE0, 0x5B, 0x00, + 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, 0x1E, 0xE4, 0x2A, 0xE4, + 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, 0x9E, 0xE0, 0x42, 0x01, + 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0xED, 0x5A, 0x03, 0xA2, + 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, 0x15, 0xB6, 0x52, 0xE0, + 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, 0xC2, 0xE0, 0x58, 0x00, + 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, 0x0E, 0xF0, 0x08, 0x00, + 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x98, 0xF1, + 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, 0x03, 0x00, 0x04, 0xE0, + 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, 0x0A, 0xE0, 0x20, 0xAE, + 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, 0x02, 0xA2, 0x4E, 0xF6, + 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, 0x03, 0xA1, 0x3E, 0xA2, + 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, 0x4E, 0xA2, 0x5B, 0xF3, + 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, 0x40, 0x00, 0x04, 0xE0, + 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, 0x8B, 0xF2, 0x03, 0xA1, + 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, 0xC1, 0xE0, 0x00, 0xA2, + 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, 0xCB, 0xF1, 0x5E, 0x00, + 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, 0x46, 0x00, 0x04, 0xE0, + 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, + 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, 0x04, 0xE0, 0x7B, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA1, 0x68, 0x00, + 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, 0x00, 0x00, 0x11, 0xD1, + 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, + 0x20, 0x21, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, 0x2A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0xC0, 0xE0, + 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x31, 0x01, + 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, 0x3D, 0x02, 0x04, 0xE0, + 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0x04, 0xE0, 0x2E, 0xE4, + 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, 0x7C, 0xE6, 0x3F, 0x02, + 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, 0x11, 0x3D, 0x09, 0x0B, + 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, + 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x00, + 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, 0xEC, 0x88, 0x00, 0x0C, + 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xE8, 0x01, 0x07, 0xA1, 0xD6, 0xB6, + 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, 0x00, 0xE0, 0x36, 0xB6, + 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x14, 0x04, + 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, 0x44, 0x00, 0xC1, 0xE0, + 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, + 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, 0x17, 0x35, 0x56, 0xE0, + 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, 0x50, 0x01, 0xC2, 0xE0, + 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, + 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, 0x1A, 0xE4, 0x02, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x86, 0x01, + 0x47, 0x00, 0xC0, 0xE0, 0x8A, 0x01, 0x1A, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, + 0x48, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x20, 0xA2, 0x2E, 0xE4, 0x4A, 0x00, + 0xC2, 0xE0, 0x20, 0xA2, 0x2E, 0xE4, 0x70, 0x00, 0x72, 0x00, 0xC2, 0xE0, + 0x00, 0xA2, 0x76, 0x00, 0xFA, 0xA2, 0x77, 0x00, 0xC2, 0xE0, 0xFC, 0xA2, + 0x22, 0xD0, 0x2E, 0xE4, 0x71, 0x00, 0xC2, 0xE0, 0xC0, 0xE0, 0xA4, 0x01, + 0x84, 0xE1, 0x0F, 0x27, 0x1F, 0x04, 0xC0, 0xE0, 0x48, 0xF0, 0x4A, 0x00, + 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0xE8, 0xF7, 0x1C, 0x04, 0xC2, 0xE0, + 0x00, 0xA2, 0xD8, 0xF7, 0x04, 0xE0, 0x97, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, + 0x2E, 0xE4, 0x3C, 0x04, 0xC2, 0xE0, 0x11, 0x00, 0x3D, 0x04, 0xC0, 0xE0, + 0xA9, 0x01, 0x1E, 0xE4, 0xE0, 0x01, 0x04, 0xE0, 0xD8, 0xF7, 0xEE, 0xA1, + 0xC2, 0xE0, 0x00, 0xA2, 0x09, 0x00, 0xC2, 0xE0, 0xE8, 0xF7, 0x0D, 0x00, + 0xC0, 0xE0, 0x09, 0x00, 0x2E, 0xE4, 0x3C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, + 0x0E, 0xA8, 0x04, 0xAF, 0x45, 0x00, 0xC0, 0xE0, 0xC2, 0xE0, 0x02, 0xA2, + 0x28, 0xE4, 0x04, 0xA1, 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x4A, 0x00, + 0xE8, 0xF7, 0x02, 0xA8, 0x48, 0xCA, 0x8E, 0xF9, 0x3D, 0x04, 0xC0, 0xE0, + 0xA9, 0x01, 0x1E, 0xE4, 0xF8, 0x01, 0x04, 0xE0, 0xD8, 0xF7, 0xEE, 0xA1, + 0xC2, 0xE0, 0x00, 0xA2, 0x09, 0x00, 0xC2, 0xE0, 0xE8, 0xF7, 0x0D, 0x00, + 0xC0, 0xE0, 0x09, 0x00, 0x2E, 0xE4, 0x3C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, + 0x01, 0xC0, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x5E, 0x3C, 0x01, 0xC0, + 0x1E, 0xF1, 0x5D, 0x3C, 0xBE, 0xF0, 0x5E, 0x28, 0x01, 0xC0, 0xEE, 0xF0, + 0x01, 0xC0, 0x8E, 0xF0, 0x5F, 0x3C, 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, + 0x5E, 0x1A, 0x5D, 0x2A, 0x2E, 0xE4, 0x00, 0xC0, 0x5F, 0x2A, 0x01, 0xC0, + 0x0B, 0x08, 0xC3, 0xE0, 0x08, 0x08, 0xC2, 0xE0, 0x12, 0x9F, 0x02, 0xA2, + 0x02, 0x08, 0x62, 0xE1, 0x05, 0xE0, 0x12, 0x9F, 0x12, 0x9F, 0x00, 0xA2, + 0x12, 0x9F, 0x12, 0x9F, 0x92, 0x9F, 0x00, 0x02, 0x00, 0xA2, 0x12, 0x9F, + 0x82, 0xE0, 0x12, 0x81, 0xC2, 0xE0, 0x02, 0xA2, 0x12, 0x81, 0x12, 0x9F, + 0xE8, 0xF7, 0x00, 0x08, 0xC0, 0xE0, 0x00, 0x08, 0x0E, 0xE4, 0x1E, 0x1E, + 0x0E, 0xE4, 0x2E, 0xE4, 0x0E, 0xE4, 0x45, 0x02, 0x0E, 0xE4, 0x41, 0x02, + 0x0E, 0xE4, 0x4F, 0x02, 0x0E, 0xE4, 0x49, 0x02, 0x0E, 0xE4, 0x57, 0x02, + 0x0E, 0xE4, 0x53, 0x02, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x5B, 0x02, 0x0E, 0xE4, 0x5F, 0x02, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x3F, 0x1E, + 0x0E, 0xE4, 0xBB, 0x07, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x63, 0x02, + 0x1E, 0xE4, 0xE7, 0x07, 0x0E, 0xE4, 0xB7, 0x02, 0x1E, 0xE4, 0x6A, 0x00, + 0x1E, 0xE4, 0x1E, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x1E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0xB0, 0x01, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xF3, 0x03, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x35, 0x04, 0x1E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x84, 0x04, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x50, 0x06, + 0x30, 0xD1, 0x6A, 0x00, 0x0E, 0xE4, 0xC4, 0x02, 0x1E, 0xE4, 0x26, 0x01, + 0x1E, 0xE4, 0x08, 0x00, 0x00, 0xA2, 0xA5, 0x07, 0x1E, 0xE4, 0x20, 0x21, + 0x44, 0xCC, 0x72, 0xCC, 0x33, 0x3C, 0x29, 0x3C, 0x6B, 0x3C, 0x1C, 0x3C, + 0x31, 0x3C, 0x7C, 0x3C, 0x01, 0x3D, 0x60, 0x08, 0x61, 0xE1, 0x6C, 0x3C, + 0x7B, 0x3C, 0x02, 0xA2, 0xF5, 0x07, 0x1E, 0xE4, 0x0A, 0xA2, 0x5A, 0xF3, + 0x02, 0x05, 0x1E, 0xE4, 0x40, 0x2A, 0x12, 0x3C, 0x02, 0xA0, 0x10, 0x3C, + 0x04, 0xA2, 0x38, 0xF0, 0x7B, 0x28, 0x5B, 0xF0, 0x02, 0xA1, 0x13, 0x3C, + 0x02, 0xA2, 0x2E, 0xF0, 0x20, 0x3C, 0x21, 0x3C, 0x00, 0xA2, 0x22, 0x3C, + 0x34, 0xA2, 0x11, 0x3C, 0x04, 0xA2, 0x27, 0x3C, 0x00, 0x01, 0x02, 0xE0, + 0x50, 0x28, 0x23, 0x3C, 0x00, 0x01, 0x02, 0xE0, 0x51, 0x28, 0xB0, 0xF1, + 0x44, 0xF1, 0x0C, 0xA1, 0x50, 0x28, 0x70, 0xF1, 0x00, 0xF1, 0x51, 0x18, + 0x02, 0xA0, 0x40, 0x28, 0xFE, 0x1D, 0x1E, 0xE4, 0xB7, 0x0C, 0x1E, 0xE4, + 0x18, 0xE4, 0x15, 0x28, 0x2A, 0x1E, 0x1E, 0xE4, 0x02, 0xA2, 0xDA, 0x1C, + 0x1E, 0xE4, 0x62, 0x12, 0x00, 0xA2, 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, + 0x30, 0xD1, 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0xD0, 0x28, 0x28, 0xE4, + 0xCF, 0x28, 0x08, 0x00, 0xFB, 0x3C, 0xFA, 0x3C, 0x00, 0xA2, 0x7A, 0xF0, + 0x2E, 0xE4, 0x2E, 0xE4, 0x1F, 0x1E, 0x1E, 0xE4, 0x02, 0xAF, 0x6B, 0x30, + 0x60, 0x00, 0xC0, 0xE0, 0x03, 0x3D, 0x6C, 0x08, 0x63, 0xE1, 0x7E, 0xA8, + 0x6E, 0x08, 0x64, 0xE1, 0x60, 0x00, 0xC0, 0xE0, 0x6B, 0x28, 0x04, 0x3D, + 0x7E, 0xA8, 0x0E, 0xAF, 0x61, 0x00, 0xC0, 0xE0, 0x18, 0x03, 0x0A, 0xE4, + 0x18, 0x03, 0x01, 0xE4, 0x15, 0xA1, 0x49, 0xE0, 0x61, 0xE1, 0x48, 0x3C, + 0x82, 0xE0, 0x6C, 0x3C, 0x22, 0xD0, 0x62, 0x00, 0x62, 0xE1, 0x20, 0x07, + 0x12, 0x9E, 0xFC, 0x02, 0x84, 0xE1, 0x09, 0x00, 0xFF, 0x00, 0x08, 0xE0, + 0x20, 0xAF, 0x49, 0xE0, 0x08, 0xE0, 0x30, 0xAF, 0x4A, 0xE0, 0x11, 0x3D, + 0x08, 0xE0, 0x4A, 0xE0, 0x11, 0x3D, 0xFF, 0x00, 0x10, 0xAF, 0x4A, 0xE0, + 0x11, 0x3D, 0xFF, 0x00, 0x12, 0x9E, 0x11, 0x3D, 0xFF, 0x00, 0x08, 0xE0, + 0xC0, 0xE0, 0x43, 0x07, 0x61, 0xE1, 0x11, 0x3D, 0x08, 0xE0, 0x20, 0xAF, + 0x49, 0xE0, 0x76, 0x00, 0x30, 0xAF, 0x4A, 0xE0, 0x11, 0x3D, 0xFF, 0x00, + 0x4A, 0xE0, 0x11, 0x3D, 0xFF, 0x00, 0x08, 0xE0, 0x4A, 0xE0, 0x11, 0x3D, + 0xFF, 0x00, 0x08, 0xE0, 0x11, 0x3D, 0xFF, 0x00, 0x08, 0xE0, 0x10, 0xAF, + 0x4E, 0xF0, 0x76, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x48, 0x28, 0x76, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0x08, 0x00, 0x30, 0xD1, 0x2E, 0xE4, 0x92, 0xE0, + 0x44, 0xCC, 0x4C, 0xCC, 0x4A, 0xCC, 0x00, 0xA2, 0x63, 0xE1, 0x00, 0xA2, + 0x74, 0x00, 0xC2, 0xE0, 0x13, 0x3D, 0x13, 0x3D, 0x13, 0x3D, 0x28, 0x08, + 0x00, 0xA2, 0x13, 0x3D, 0x13, 0x3D, 0x13, 0x3D, 0x06, 0xAF, 0x65, 0x00, + 0xC0, 0xE0, 0x67, 0x3C, 0x02, 0xAF, 0x68, 0x30, 0x07, 0x00, 0x08, 0xE0, + 0x1E, 0xE4, 0x6A, 0x30, 0x02, 0xAF, 0x69, 0x30, 0x54, 0x11, 0x1E, 0xE4, + 0x06, 0xA2, 0x3A, 0x1D, 0xBC, 0x11, 0x1E, 0xE4, 0x6A, 0x11, 0x1E, 0xE4, + 0x02, 0xAF, 0x53, 0x2C, 0x0A, 0xF1, 0x40, 0x28, 0x49, 0xF0, 0x32, 0x06, + 0x1E, 0xE4, 0x54, 0x3C, 0x40, 0x28, 0x9E, 0xF0, 0x40, 0x3C, 0x04, 0xA2, + 0x40, 0x3C, 0x04, 0xA2, 0x6A, 0xF0, 0x06, 0xA1, 0xD0, 0x28, 0x54, 0x3C, + 0x53, 0x2C, 0x3E, 0xF0, 0xC0, 0xE0, 0xAA, 0xF0, 0xD1, 0x28, 0x2A, 0xF2, + 0xC0, 0xE0, 0x45, 0x3C, 0x44, 0x34, 0x66, 0x00, 0x47, 0x3C, 0x46, 0x34, + 0x04, 0xAE, 0x67, 0x00, 0x1E, 0xE4, 0xFB, 0x3C, 0xFA, 0x34, 0x00, 0xA2, + 0x00, 0xA2, 0x20, 0x21, 0x1E, 0xE4, 0x1F, 0x1E, 0xFA, 0x1E, 0x1E, 0xE4, + 0xD4, 0x3C, 0xD3, 0x3C, 0x33, 0x1F, 0x1E, 0xE4, 0x16, 0x1F, 0x1E, 0xE4, + 0x57, 0x1F, 0x1E, 0xE4, 0x5B, 0x1E, 0x1E, 0xE4, 0x00, 0x00, 0xE0, 0xD1, + 0x62, 0x1F, 0x1E, 0xE4, 0xB0, 0x03, 0xFF, 0xD1, 0x00, 0x00, 0xE7, 0xD1, + 0x24, 0x02, 0x99, 0xD1, 0x08, 0x00, 0x30, 0xD1, 0x01, 0x00, 0x4B, 0xD0, + 0x00, 0x00, 0x3A, 0xD0, 0x00, 0x00, 0x08, 0xD0, 0x00, 0x00, 0x4C, 0xD0, + 0x2A, 0xF0, 0xD0, 0x28, 0x03, 0x08, 0x1E, 0xE4, 0x40, 0x28, 0x1A, 0xF0, + 0xCF, 0x28, 0x3E, 0xF0, 0x1A, 0x28, 0xBA, 0xF0, 0x06, 0xA1, 0xDA, 0xF0, + 0x1E, 0xE4, 0x40, 0x3C, 0x06, 0xA2, 0x1B, 0x3C, 0x0E, 0xE4, 0xDB, 0x03, + 0x09, 0xE4, 0x32, 0x06, 0x40, 0x3C, 0x50, 0xB6, 0x40, 0x28, 0x57, 0x03, + 0x33, 0x2C, 0x29, 0x3C, 0x02, 0xA0, 0x29, 0x2C, 0x70, 0x00, 0xC2, 0xE0, + 0x33, 0x3C, 0x02, 0xA0, 0xEC, 0x24, 0x71, 0x00, 0xC2, 0xE0, 0x28, 0x28, + 0x64, 0xE1, 0x6A, 0x00, 0xC2, 0xE0, 0xED, 0x4C, 0xC2, 0xE0, 0x04, 0x4D, + 0x14, 0x21, 0x28, 0x08, 0x14, 0x21, 0x2A, 0x08, 0x64, 0xE1, 0x77, 0x00, + 0x64, 0xE1, 0x78, 0x00, 0xC2, 0xE0, 0x04, 0x4D, 0xC2, 0xE0, 0x04, 0x4D, + 0x14, 0x21, 0x2C, 0x08, 0x6B, 0xF0, 0x1A, 0x28, 0x40, 0x2A, 0x79, 0x00, + 0x1A, 0x28, 0x39, 0xF0, 0x32, 0x06, 0x1E, 0xE4, 0x1E, 0xE4, 0x73, 0x00, + 0xC2, 0xE0, 0x1B, 0x08, 0x76, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x4C, 0x1D, + 0xC2, 0xE0, 0x00, 0xA2, 0xE7, 0x03, 0x0E, 0xE4, 0x33, 0x2C, 0xE7, 0x03, + 0x0E, 0xE4, 0x76, 0x00, 0xC2, 0xE0, 0x28, 0x28, 0x70, 0x00, 0xC2, 0xE0, + 0x73, 0x00, 0xC2, 0xE0, 0x1A, 0x28, 0x71, 0x00, 0x01, 0xA2, 0x76, 0x00, + 0xC2, 0xE0, 0x06, 0xA2, 0x00, 0x00, 0x39, 0xD0, 0x6C, 0x3E, 0x6B, 0x3E, + 0x56, 0xE0, 0x20, 0xAE, 0x4D, 0xC8, 0x4A, 0xC8, 0x1E, 0xE4, 0x2E, 0xE4, + 0x53, 0x00, 0xC2, 0xE0, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, 0x29, 0x04, + 0x42, 0x00, 0xC0, 0xE0, 0x07, 0x3D, 0xA0, 0x01, 0x12, 0xD1, 0xD0, 0x03, + 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, + 0x00, 0xE0, 0x80, 0x01, 0x00, 0xE0, 0xF9, 0xF7, 0x40, 0x0B, 0x11, 0xD1, + 0x20, 0xCE, 0x80, 0x00, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, + 0x1E, 0xE4, 0x04, 0xA2, 0xF9, 0xF7, 0x29, 0xCA, 0x32, 0x3C, 0x60, 0x00, + 0xC0, 0xE0, 0x54, 0x11, 0x04, 0xE0, 0x70, 0x3C, 0x61, 0x00, 0xC0, 0xE0, + 0x62, 0x00, 0xC0, 0xE0, 0x96, 0xE0, 0x90, 0x04, 0x63, 0x00, 0xC0, 0xE0, + 0x13, 0x3D, 0x13, 0x35, 0x6A, 0x11, 0x1E, 0xE4, 0x13, 0x3D, 0x13, 0x35, + 0x66, 0xE1, 0x94, 0x03, 0x67, 0xE1, 0x2E, 0xE4, 0x84, 0xE1, 0x03, 0x00, + 0x22, 0xD0, 0x64, 0x00, 0x17, 0x3D, 0x17, 0x35, 0x16, 0x9E, 0x33, 0x04, + 0xD0, 0x28, 0x08, 0x00, 0x30, 0xD1, 0x2E, 0xE4, 0xC0, 0xE0, 0xAA, 0xF0, + 0xD1, 0x28, 0x2A, 0xF2, 0xC0, 0xE0, 0x45, 0x3C, 0x44, 0x34, 0x61, 0x00, + 0x47, 0x3C, 0x46, 0x34, 0x04, 0xAE, 0x62, 0x00, 0x1E, 0xE4, 0xFB, 0x3C, + 0xFA, 0x34, 0x00, 0xA2, 0x00, 0xA2, 0x20, 0x21, 0x1E, 0xE4, 0x1F, 0x1E, + 0xFA, 0x1E, 0x1E, 0xE4, 0xD4, 0x3C, 0xD3, 0x3C, 0x33, 0x1F, 0x1E, 0xE4, + 0x16, 0x1F, 0x1E, 0xE4, 0x57, 0x1F, 0x1E, 0xE4, 0x5B, 0x1E, 0x1E, 0xE4, + 0x60, 0x00, 0xC0, 0xE0, 0x62, 0x1F, 0x1E, 0xE4, 0x0A, 0xE4, 0x02, 0xA1, + 0xDA, 0xF0, 0x0E, 0xA8, 0x02, 0xA1, 0x8A, 0xF0, 0x02, 0xA1, 0x6F, 0x04, + 0x2A, 0xF0, 0x02, 0xA1, 0x6F, 0x04, 0x0A, 0xE4, 0xB0, 0x04, 0x1E, 0xE4, + 0x5E, 0xF1, 0x2E, 0xE4, 0x1E, 0xE4, 0x0E, 0xF1, 0x40, 0x07, 0x1E, 0xE4, + 0xBE, 0xF0, 0x6D, 0x07, 0x1E, 0xE4, 0xEB, 0x04, 0x30, 0x3C, 0x16, 0xA2, + 0x2E, 0xF0, 0x14, 0xA2, 0x74, 0x1F, 0x1E, 0xE4, 0x2F, 0x3C, 0x00, 0xA2, + 0x2A, 0xF0, 0xD0, 0x28, 0x9E, 0x1F, 0x1E, 0xE4, 0x2E, 0xE4, 0x1A, 0xF0, + 0xCF, 0x28, 0x3E, 0xF0, 0x92, 0xCE, 0x00, 0xA2, 0x0F, 0x1E, 0x1E, 0xE4, + 0x8A, 0xF0, 0x0E, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x4A, 0xF0, 0x02, 0xA1, + 0xBA, 0xF0, 0x02, 0xA1, 0x1E, 0xE4, 0xAE, 0xF0, 0x7A, 0xF0, 0x02, 0xA1, + 0x5E, 0xF0, 0x9A, 0x0B, 0x1E, 0xE4, 0xB0, 0x04, 0x07, 0x0C, 0x1E, 0xE4, + 0xEB, 0x04, 0x1E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0x06, 0xAF, 0x70, 0xC8, + 0xDF, 0xBA, 0x6E, 0xCC, 0x80, 0x00, 0x04, 0xE0, 0x11, 0xD1, 0x20, 0xCE, + 0x42, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0x00, 0x01, 0x12, 0xD1, 0x00, 0x00, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x12, 0x00, 0x08, 0xE0, 0x30, 0xAF, + 0x60, 0x00, 0xC0, 0xE0, 0x42, 0x3C, 0x50, 0xA2, 0x0E, 0x3C, 0x1F, 0x00, + 0x09, 0xE0, 0x11, 0xAF, 0x60, 0x00, 0xC1, 0xE0, 0x2B, 0xF0, 0x42, 0x28, + 0x67, 0xA5, 0xFF, 0x00, 0x6A, 0x00, 0xC0, 0xE0, 0x42, 0x3C, 0x4A, 0xE0, + 0x16, 0xE0, 0x68, 0x00, 0xC0, 0xE0, 0x41, 0x3C, 0x40, 0x30, 0x69, 0x00, + 0xC0, 0xE0, 0x43, 0x30, 0x02, 0xAF, 0x69, 0x00, 0xC0, 0xE0, 0x7A, 0xF0, + 0x00, 0xA2, 0x2E, 0xF0, 0x02, 0xA2, 0x3A, 0xF0, 0x1E, 0xE4, 0x8B, 0x07, + 0x1E, 0xE4, 0x7B, 0x3C, 0x06, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0xDA, 0x1C, + 0xC0, 0xE0, 0x2A, 0xE4, 0x73, 0x30, 0x02, 0xA8, 0xC1, 0xE0, 0x75, 0x3C, + 0x74, 0x34, 0x63, 0x00, 0x56, 0xE0, 0x77, 0x3E, 0x76, 0x36, 0x64, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x73, 0x3C, 0x1A, 0xE0, 0x1F, 0x00, 0x08, 0xE0, + 0x30, 0xAF, 0x60, 0x00, 0x20, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x0E, 0x3C, + 0xC0, 0xE0, 0x0F, 0x3C, 0xFF, 0x00, 0x08, 0xE0, 0x66, 0x00, 0xC0, 0xE0, + 0x3E, 0x30, 0x65, 0x00, 0x67, 0x00, 0xC0, 0xE0, 0x2E, 0x3C, 0x06, 0xA8, + 0x74, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3F, 0x30, 0x74, 0x00, 0xC0, 0xE0, + 0x8F, 0x3C, 0x06, 0xA8, 0x64, 0x00, 0xC0, 0xE0, 0x90, 0x3C, 0x04, 0xAF, + 0x16, 0x3D, 0x16, 0x35, 0xC2, 0x04, 0x66, 0xE1, 0x65, 0x00, 0xC0, 0xE0, + 0x8B, 0x07, 0x1E, 0xE4, 0x02, 0xA0, 0x17, 0x28, 0x16, 0x3C, 0x17, 0x34, + 0x30, 0x06, 0x0A, 0xE4, 0x16, 0x28, 0x17, 0x3C, 0x19, 0x30, 0x04, 0xAF, + 0x62, 0x00, 0xC0, 0xE0, 0x7F, 0x30, 0x0A, 0xAF, 0x62, 0x00, 0xC0, 0xE0, + 0xC0, 0xE0, 0x80, 0x3E, 0x71, 0x00, 0xC1, 0xE0, 0xC0, 0xE0, 0x8C, 0x34, + 0x8B, 0x3C, 0x78, 0x00, 0x62, 0x00, 0xC0, 0xE0, 0x87, 0x3C, 0x7D, 0x00, + 0x1A, 0x08, 0x63, 0xE1, 0x02, 0xAF, 0x0C, 0xAF, 0x63, 0xE1, 0x73, 0x00, + 0xC0, 0xE0, 0x03, 0x31, 0x62, 0x00, 0xC0, 0xE0, 0x03, 0x3D, 0x1B, 0x08, + 0xC0, 0xE0, 0x7A, 0xF0, 0x40, 0x30, 0x14, 0xAF, 0x02, 0xA2, 0x3A, 0xF0, + 0x16, 0xAF, 0x62, 0x00, 0x1E, 0xE4, 0x7B, 0x3C, 0x00, 0xA2, 0x2E, 0xF0, + 0x49, 0xE0, 0x68, 0x00, 0xC0, 0xE0, 0x8B, 0x07, 0x24, 0x3E, 0x3F, 0xAF, + 0x3F, 0xAE, 0x3F, 0xA8, 0x49, 0xE0, 0x26, 0x32, 0x0B, 0xAF, 0x49, 0xE0, + 0x49, 0xE0, 0x2B, 0x3E, 0x07, 0xA8, 0x0D, 0xAF, 0x41, 0xAE, 0x41, 0xAF, + 0x1F, 0xA8, 0x11, 0xAF, 0x19, 0xAF, 0x49, 0xE0, 0x2C, 0x3E, 0x03, 0xAE, + 0x03, 0xAE, 0x41, 0xAE, 0x41, 0xAF, 0x1F, 0xA8, 0x2D, 0x4C, 0x2C, 0x4C, + 0x2B, 0x28, 0x2D, 0x3E, 0x69, 0x00, 0xC0, 0xE0, 0x25, 0x3C, 0x1A, 0xE0, + 0xC0, 0xE0, 0x37, 0x30, 0x1A, 0xE0, 0x06, 0xA8, 0x04, 0xA5, 0x02, 0xA1, + 0x06, 0xA8, 0x69, 0x00, 0x69, 0x00, 0xC0, 0xE0, 0x38, 0x3C, 0x00, 0xA4, + 0x08, 0xE0, 0x20, 0xAF, 0x39, 0x3C, 0x04, 0xAF, 0x37, 0x06, 0x1E, 0xE4, + 0x3A, 0x3C, 0xFF, 0x3F, 0xFF, 0x03, 0x08, 0xE0, 0x6A, 0x00, 0xC0, 0xE0, + 0x1E, 0xA8, 0x77, 0x00, 0xC0, 0xE0, 0x14, 0x3C, 0x08, 0xAF, 0x77, 0x00, + 0xC0, 0xE0, 0x15, 0x3C, 0x82, 0x3C, 0x06, 0xA8, 0x20, 0xAF, 0x83, 0x3C, + 0x02, 0xA8, 0x2C, 0xAF, 0x77, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x03, 0x3D, + 0x49, 0x08, 0x63, 0xE1, 0x66, 0x08, 0x63, 0xE1, 0x2E, 0xAF, 0x77, 0x00, + 0x02, 0xAF, 0x1D, 0x30, 0x02, 0xAF, 0x13, 0x31, 0x6B, 0x00, 0xC0, 0xE0, + 0xAF, 0x3C, 0x1E, 0xA8, 0x81, 0x28, 0xAD, 0x3C, 0x1E, 0xA8, 0x81, 0x34, + 0x05, 0x31, 0x6D, 0x08, 0x65, 0xE1, 0x1E, 0xAF, 0x81, 0x3C, 0xFF, 0x7F, + 0x08, 0xE0, 0x81, 0x28, 0x03, 0x29, 0x69, 0x08, 0x63, 0xE1, 0x00, 0xA2, + 0x6A, 0x00, 0xC0, 0xE0, 0x2A, 0xF1, 0x15, 0x28, 0x03, 0xA8, 0x09, 0xAF, + 0x49, 0xE0, 0x20, 0xAF, 0x03, 0xA8, 0x07, 0xAF, 0x49, 0xE0, 0xBB, 0xF0, + 0x12, 0xE0, 0x0E, 0xA8, 0x12, 0xE0, 0x5B, 0xF0, 0xC0, 0xE0, 0x03, 0x3D, + 0x0E, 0xA8, 0x2E, 0xF0, 0x61, 0x08, 0x61, 0xE1, 0x2A, 0xAF, 0x6A, 0x00, + 0x4B, 0x08, 0x63, 0xE1, 0x00, 0xA2, 0x01, 0x3D, 0x4D, 0x08, 0x67, 0xE1, + 0x4C, 0x08, 0x66, 0xE1, 0xC0, 0xE0, 0x07, 0x3D, 0x06, 0x3D, 0x03, 0x3D, + 0x7B, 0xF0, 0x21, 0xAF, 0x49, 0xE0, 0x7C, 0x00, 0x14, 0xAE, 0xFF, 0xFF, + 0x08, 0xE0, 0x03, 0x33, 0x6D, 0x00, 0xC0, 0xE0, 0x07, 0x3D, 0x06, 0x35, + 0xC0, 0xE0, 0x1E, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x50, 0x08, 0x63, 0xE1, + 0x20, 0xAF, 0x6D, 0x00, 0x22, 0xAF, 0x6D, 0x00, 0xC0, 0xE0, 0x13, 0x31, + 0x24, 0xAF, 0x6D, 0x00, 0xC0, 0xE0, 0x13, 0x31, 0x02, 0xE0, 0x01, 0xA2, + 0x53, 0x2C, 0x03, 0x31, 0x90, 0x01, 0x02, 0xE0, 0x25, 0xB4, 0xC8, 0x00, + 0x75, 0x00, 0xC0, 0xE0, 0x36, 0x3E, 0x25, 0xB4, 0x16, 0x3D, 0x16, 0x35, + 0xC0, 0x04, 0x66, 0xE1, 0x18, 0xA8, 0x49, 0xE0, 0x76, 0x00, 0xC0, 0xE0, + 0x06, 0xA8, 0x4A, 0xE0, 0xDC, 0x3C, 0x10, 0xA5, 0x08, 0xAF, 0x4A, 0xE0, + 0xDC, 0x3C, 0xDC, 0x4C, 0xDD, 0x3C, 0x1E, 0xA8, 0x02, 0xAF, 0xDE, 0x30, + 0x63, 0xE1, 0x06, 0xA8, 0x12, 0xAF, 0x4A, 0xE0, 0x16, 0xE0, 0xDE, 0x28, + 0x03, 0x3D, 0x63, 0x08, 0xDE, 0x3C, 0xDE, 0x4C, 0x02, 0xAE, 0xDE, 0x3C, + 0xDD, 0x3C, 0x1E, 0xA2, 0x28, 0xF0, 0xDD, 0x28, 0xCF, 0x30, 0x06, 0xAF, + 0x43, 0x00, 0xC0, 0xE0, 0xD1, 0x30, 0x02, 0xAF, 0xD0, 0x30, 0x02, 0xAF, + 0x2E, 0xE4, 0x02, 0xA2, 0xD2, 0x30, 0x02, 0xAF, 0x65, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0x00, 0xA2, 0x37, 0x28, 0x2E, 0xE4, 0x03, 0xA8, 0x11, 0xAF, + 0x48, 0xF1, 0x04, 0xA1, 0x38, 0x28, 0x7A, 0xF1, 0x42, 0x00, 0xC0, 0xE0, + 0xF8, 0xF7, 0x28, 0xCA, 0x39, 0x2C, 0x00, 0x0A, 0x11, 0xD1, 0x20, 0xCE, + 0x05, 0xE0, 0x04, 0xAE, 0x04, 0xAF, 0x08, 0xA0, 0x13, 0xD1, 0x24, 0xCE, + 0x66, 0xE0, 0x00, 0x01, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, + 0x0B, 0xE4, 0x03, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x1E, 0xE4, 0x61, 0x00, + 0xC0, 0xE0, 0x59, 0x06, 0x05, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0xA0, 0x1C, + 0x62, 0x00, 0xC0, 0xE0, 0x62, 0x06, 0x0B, 0xE4, 0x60, 0x00, 0xC1, 0xE0, + 0xCF, 0x1C, 0x1E, 0xE4, 0xC0, 0xE0, 0x6B, 0x06, 0x0B, 0xE4, 0x09, 0xA8, + 0xC1, 0xE0, 0xC0, 0x1C, 0x1E, 0xE4, 0x63, 0x00, 0x74, 0x06, 0x0B, 0xE4, + 0x11, 0xA8, 0x60, 0x00, 0x89, 0x1C, 0x1E, 0xE4, 0x64, 0x00, 0xC0, 0xE0, + 0x0B, 0xE4, 0x21, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x1E, 0x3C, 0x65, 0x00, + 0xC0, 0xE0, 0x7C, 0x06, 0x0B, 0xE4, 0x41, 0xA8, 0x60, 0x00, 0xC1, 0xE0, + 0x06, 0xA8, 0x66, 0x00, 0xC0, 0xE0, 0x97, 0x06, 0x66, 0x00, 0xC0, 0xE0, + 0x37, 0x30, 0x1A, 0xE0, 0x00, 0xA4, 0x04, 0xA5, 0x02, 0xA1, 0x06, 0xA8, + 0x04, 0xAF, 0x66, 0x00, 0xC0, 0xE0, 0x38, 0x3C, 0xFF, 0x3F, 0x08, 0xE0, + 0x20, 0xAF, 0x39, 0x3C, 0xC1, 0xE0, 0x37, 0x06, 0x1E, 0xE4, 0x3A, 0x3C, + 0x0B, 0xE4, 0x40, 0x00, 0x09, 0xE0, 0x60, 0x00, 0x8B, 0x3C, 0x6F, 0x00, + 0xC0, 0xE0, 0xA3, 0x06, 0xC1, 0xE0, 0x4D, 0x1B, 0x1E, 0xE4, 0x8C, 0x34, + 0x0B, 0xE4, 0x80, 0x00, 0x09, 0xE0, 0x60, 0x00, 0x3E, 0x30, 0x68, 0x00, + 0xC0, 0xE0, 0xAC, 0x06, 0x00, 0x01, 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, + 0x69, 0x00, 0xC0, 0xE0, 0xB6, 0x06, 0x0B, 0xE4, 0x60, 0x00, 0xC1, 0xE0, + 0x2E, 0x3C, 0x06, 0xA8, 0xBF, 0x06, 0x0B, 0xE4, 0x00, 0x02, 0x09, 0xE0, + 0xC1, 0xE0, 0x3F, 0x30, 0x6A, 0x00, 0xC0, 0xE0, 0x0B, 0xE4, 0x00, 0x04, + 0x09, 0xE0, 0x60, 0x00, 0x16, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, 0xC9, 0x06, + 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, 0x43, 0x30, 0xC0, 0xE0, 0xD4, 0x06, + 0x0B, 0xE4, 0x00, 0x08, 0x0F, 0x3C, 0xFF, 0x00, 0x08, 0xE0, 0x6D, 0x00, + 0x00, 0x10, 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, 0x6C, 0x00, 0xC0, 0xE0, + 0xEA, 0x06, 0x0B, 0xE4, 0x6C, 0x00, 0xC0, 0xE0, 0x7A, 0xF0, 0x40, 0x30, + 0x2E, 0xF0, 0x02, 0xA2, 0x3A, 0xF0, 0x02, 0xAF, 0x8B, 0x07, 0x1E, 0xE4, + 0x7B, 0x3C, 0x00, 0xA2, 0x60, 0x00, 0xC1, 0xE0, 0xDA, 0x1C, 0x1E, 0xE4, + 0xF3, 0x06, 0x0B, 0xE4, 0x00, 0x20, 0x09, 0xE0, 0xC1, 0xE0, 0x41, 0x3C, + 0x6E, 0x00, 0xC0, 0xE0, 0x0B, 0xE4, 0x00, 0x40, 0x09, 0xE0, 0x60, 0x00, + 0x87, 0x3C, 0x71, 0x00, 0xC0, 0xE0, 0x3F, 0x07, 0x63, 0xE1, 0x49, 0xE0, + 0x72, 0x00, 0xC0, 0xE0, 0x1D, 0x30, 0x02, 0xAF, 0x03, 0x31, 0x66, 0x08, + 0x4A, 0xE0, 0xAF, 0x3C, 0x1E, 0xA8, 0x02, 0xAF, 0x00, 0xA2, 0xAD, 0x3C, + 0x1E, 0xA8, 0x0C, 0xAF, 0x1B, 0x08, 0x64, 0xE1, 0x69, 0x08, 0x63, 0xE1, + 0x04, 0x3D, 0x03, 0x3D, 0x1A, 0x08, 0x65, 0xE1, 0x20, 0xAF, 0x73, 0x00, + 0xC0, 0xE0, 0x05, 0x3D, 0x01, 0xA2, 0x81, 0x3C, 0xFF, 0x7F, 0x08, 0xE0, + 0xC0, 0xE0, 0x1A, 0x08, 0x63, 0xE1, 0xC4, 0x3E, 0x6A, 0xF0, 0x03, 0x29, + 0x03, 0x31, 0x73, 0x00, 0x1B, 0x08, 0x64, 0xE1, 0x74, 0x00, 0xC0, 0xE0, + 0xC0, 0xE0, 0x69, 0x08, 0x63, 0xE1, 0x04, 0x3D, 0x49, 0xE0, 0x3E, 0xA8, + 0x02, 0xAF, 0x73, 0x00, 0x49, 0xE0, 0xBB, 0xF0, 0x03, 0xA8, 0x09, 0xAF, + 0x12, 0xE0, 0x5B, 0xF0, 0x03, 0xA8, 0x07, 0xAF, 0x0E, 0xA8, 0x2E, 0xF0, + 0x12, 0xE0, 0x0E, 0xA8, 0x2E, 0xE4, 0xB2, 0x19, 0x1E, 0xE4, 0x03, 0x3D, + 0x30, 0x3C, 0x0E, 0xA2, 0x2F, 0x3C, 0x06, 0xA2, 0x9A, 0x0B, 0x1E, 0xE4, + 0x74, 0x1F, 0x1E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, 0x9E, 0x1F, 0x1E, 0xE4, + 0x51, 0x07, 0x1E, 0xE4, 0x2A, 0xE4, 0x3E, 0xAF, 0x7F, 0xA0, 0x49, 0xE0, + 0x72, 0xC8, 0x2E, 0xE4, 0x2B, 0xE4, 0x45, 0xE0, 0x0D, 0xAE, 0x0D, 0xAF, + 0x03, 0xA1, 0x07, 0xAF, 0x72, 0xCC, 0x42, 0xE0, 0x00, 0xA2, 0x62, 0x07, + 0x84, 0xE1, 0x45, 0xCC, 0x00, 0xA2, 0xC4, 0xCE, 0xF9, 0xF7, 0x9B, 0xCA, + 0x0F, 0x1E, 0x1E, 0xE4, 0xAA, 0xCE, 0x96, 0xCE, 0x9E, 0x1F, 0x1E, 0xE4, + 0x92, 0xCE, 0x00, 0xA2, 0x10, 0xA2, 0x2F, 0x3C, 0x06, 0xA2, 0x2E, 0xE4, + 0x1E, 0xE4, 0x74, 0x1F, 0x1E, 0xE4, 0x30, 0x3C, 0xC0, 0xE0, 0x9E, 0x1F, + 0x1E, 0xE4, 0x07, 0x0C, 0x1E, 0xE4, 0x2A, 0xE4, 0x3E, 0xAF, 0x60, 0x00, + 0x2F, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x51, 0x07, 0x74, 0x1F, 0x1E, 0xE4, + 0x30, 0x3C, 0x12, 0xA2, 0xA2, 0x0C, 0x1E, 0xE4, 0x84, 0xBA, 0x04, 0xA2, + 0x66, 0xE1, 0x2E, 0xE4, 0x9E, 0x1F, 0x1E, 0xE4, 0x50, 0x34, 0x16, 0x4D, + 0x16, 0x21, 0xC2, 0x04, 0x08, 0xAF, 0x1E, 0xA0, 0x50, 0x28, 0x51, 0x3C, + 0x08, 0xAF, 0x1E, 0xA0, 0x51, 0x28, 0x50, 0x3C, 0x51, 0x28, 0x5B, 0xF0, + 0x40, 0x2A, 0x52, 0x3C, 0x51, 0x3C, 0x02, 0xAE, 0x0A, 0xAF, 0x3E, 0xA0, + 0x53, 0x3C, 0x18, 0xE0, 0x51, 0x82, 0x50, 0x84, 0xC0, 0xE0, 0xF8, 0xF7, + 0x28, 0xCA, 0x2E, 0xE4, 0x17, 0xAE, 0x58, 0x00, 0x05, 0xE0, 0x40, 0x00, + 0x03, 0xAE, 0x00, 0x24, 0x05, 0xE0, 0x42, 0xE0, 0x50, 0x02, 0x11, 0xD1, + 0x20, 0xCE, 0x42, 0xE0, 0x03, 0x00, 0x13, 0xD1, 0x40, 0x01, 0x12, 0xD1, + 0x06, 0xA2, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x5A, 0x00, 0xC0, 0xE0, + 0x31, 0x01, 0x1E, 0xE4, 0x1E, 0xE4, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, + 0x12, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x20, 0x21, 0x00, 0xA2, 0x2A, 0xE4, + 0x06, 0xA1, 0x2A, 0xE4, 0xFA, 0x1E, 0x1E, 0xE4, 0xD4, 0x3C, 0xD3, 0x3C, + 0x33, 0x1F, 0x1E, 0xE4, 0x16, 0x1F, 0x1E, 0xE4, 0x3A, 0xF0, 0x0C, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0x5B, 0x1E, 0x1E, 0xE4, 0xED, 0x20, 0x1E, 0xE4, + 0x62, 0x1F, 0x1E, 0xE4, 0x57, 0x1F, 0x1E, 0xE4, 0x2A, 0xE4, 0x0C, 0xA1, + 0x59, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, 0xF5, 0x20, 0x1E, 0xE4, + 0x06, 0xA1, 0x7A, 0xF0, 0x0C, 0xA1, 0x59, 0x00, 0x1E, 0xE4, 0x3A, 0xF0, + 0x06, 0xA1, 0x5A, 0xF0, 0x31, 0x01, 0x1E, 0xE4, 0x04, 0xA2, 0xD9, 0x20, + 0xC0, 0xE0, 0xC9, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xFF, 0x0F, 0x08, 0xE0, + 0x10, 0xAF, 0x14, 0x04, 0x22, 0xE4, 0x46, 0xE0, 0x05, 0x02, 0x05, 0xE0, + 0x1E, 0xE4, 0x2E, 0xE4, 0xC9, 0x3C, 0x02, 0xA2, 0x19, 0x28, 0x9D, 0x08, + 0x1E, 0xE4, 0x66, 0x08, 0x7C, 0x3C, 0x31, 0x28, 0x7E, 0x07, 0x18, 0xE4, + 0x2A, 0x3C, 0x3D, 0x28, 0xAB, 0x08, 0x1E, 0xE4, 0x52, 0xE0, 0x17, 0xE0, + 0x40, 0x2A, 0x72, 0x28, 0x35, 0x28, 0x63, 0x09, 0x1E, 0xE4, 0xAA, 0xF0, + 0x18, 0xE4, 0x15, 0x28, 0x72, 0x00, 0xC2, 0xE0, 0x16, 0x1D, 0x1E, 0xE4, + 0x2E, 0xE4, 0x09, 0x14, 0x1E, 0xE4, 0x0B, 0x3C, 0x0A, 0x3C, 0xFE, 0xA2, + 0x1E, 0xE4, 0x9C, 0x10, 0x1E, 0xE4, 0xBE, 0x0C, 0x1E, 0xE4, 0x0C, 0x0B, + 0x1E, 0xE4, 0x74, 0x0A, 0x1E, 0xE4, 0x55, 0x3C, 0xFE, 0xA2, 0xFB, 0x09, + 0x1A, 0x3C, 0x55, 0x3C, 0x00, 0xA2, 0xE4, 0x0A, 0x18, 0xE4, 0x1A, 0x28, + 0x4A, 0xF0, 0xC4, 0x28, 0x67, 0x28, 0x20, 0x09, 0x1E, 0xE4, 0x36, 0x14, + 0x0C, 0x15, 0x1E, 0xE4, 0x67, 0x3C, 0x02, 0xAA, 0xC0, 0xE0, 0xC2, 0xF1, + 0x54, 0x1C, 0x55, 0x2C, 0x6A, 0xF1, 0x00, 0x02, 0x08, 0xE0, 0x65, 0x00, + 0x00, 0x08, 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x0A, 0xE0, 0x5D, 0x00, + 0xC0, 0xE0, 0x1A, 0xF1, 0x02, 0xA2, 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x08, + 0x09, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0x00, 0xCE, 0x04, 0x00, 0xC0, 0xE0, + 0xC9, 0xF7, 0x00, 0x08, 0xC0, 0x10, 0x1E, 0xE4, 0x7E, 0xF5, 0x98, 0xF7, + 0x18, 0xE4, 0x15, 0x28, 0xEE, 0x0E, 0x1E, 0xE4, 0x16, 0xE0, 0x43, 0x28, + 0x2E, 0xE4, 0x09, 0x14, 0x56, 0xE0, 0x03, 0xA8, 0x3F, 0x2A, 0x02, 0xAE, + 0x17, 0xE0, 0x03, 0xA8, 0x43, 0x2A, 0x02, 0xAE, 0x1B, 0xE0, 0x40, 0x2A, + 0x02, 0xAE, 0x56, 0xE0, 0x3E, 0x2A, 0x02, 0xAE, 0x56, 0xE0, 0x03, 0xA8, + 0x24, 0x2A, 0x0A, 0xAE, 0x56, 0xE0, 0x03, 0xA8, 0x80, 0xCF, 0x06, 0xAE, + 0x56, 0xE0, 0x3F, 0xA8, 0xE4, 0xCF, 0x35, 0x28, 0x00, 0x00, 0xF3, 0xD1, + 0x55, 0x00, 0xE8, 0xD1, 0xC0, 0x00, 0xE1, 0xD1, 0x02, 0xA1, 0x50, 0x28, + 0x00, 0x00, 0xEE, 0xD1, 0x40, 0x4C, 0x04, 0xAE, 0x26, 0x4C, 0x02, 0xAE, + 0x01, 0x00, 0x85, 0xD1, 0x00, 0xCF, 0x02, 0xAE, 0x00, 0x00, 0x85, 0xD1, + 0x90, 0xE1, 0x90, 0xE1, 0x04, 0x00, 0x40, 0xD0, 0x2A, 0xE4, 0x3E, 0x28, + 0x50, 0x28, 0x64, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x50, 0x28, 0x64, 0xF0, + 0x81, 0x00, 0x02, 0xE0, 0x2E, 0xE4, 0x1B, 0x0B, 0x1E, 0xE4, 0x64, 0x3C, + 0x00, 0xA2, 0x2E, 0xE4, 0x2E, 0x0B, 0x1E, 0xE4, 0x65, 0x00, 0xC0, 0xE0, + 0xED, 0x3C, 0xEC, 0x34, 0x02, 0xA8, 0x40, 0x28, 0x7A, 0xF0, 0x04, 0xA8, + 0x7D, 0x3C, 0x29, 0x3C, 0x00, 0xA2, 0x48, 0xF0, 0x68, 0xF1, 0x29, 0x2C, + 0x78, 0xF0, 0x14, 0x28, 0xDE, 0xF0, 0x38, 0xF1, 0x02, 0xA8, 0x40, 0x28, + 0x9A, 0xF0, 0x7D, 0x28, 0xBA, 0xF0, 0x02, 0xA1, 0x2A, 0xF0, 0x04, 0xA8, + 0x40, 0x28, 0x14, 0x2A, 0x68, 0xF0, 0x46, 0xE0, 0x7D, 0x28, 0x03, 0xAE, + 0x7D, 0x3C, 0x02, 0xA2, 0x28, 0x3C, 0x00, 0xA2, 0x7D, 0x08, 0x28, 0x3C, + 0x02, 0xA2, 0x5E, 0xF0, 0x61, 0xE1, 0xE8, 0xF0, 0x28, 0x28, 0x7D, 0x3C, + 0x01, 0x29, 0x61, 0x08, 0x62, 0xE1, 0x60, 0x08, 0x29, 0x3C, 0x00, 0xA2, + 0x48, 0xF0, 0x02, 0x19, 0x01, 0x3D, 0x02, 0xA0, 0x01, 0x29, 0x01, 0x3D, + 0x72, 0x3C, 0x00, 0xA2, 0x88, 0xF0, 0x40, 0x28, 0x18, 0xE4, 0x02, 0xA8, + 0x65, 0x00, 0xC0, 0xE0, 0x3D, 0x3C, 0x63, 0x00, 0xC0, 0xE0, 0x1C, 0x09, + 0x1A, 0xE4, 0x28, 0x28, 0x6A, 0xF1, 0x15, 0x28, 0x7D, 0x28, 0x47, 0x08, + 0x63, 0xE1, 0xFA, 0x12, 0x3D, 0x3C, 0x39, 0x13, 0x1E, 0xE4, 0x03, 0x3D, + 0x48, 0xF0, 0x6B, 0x28, 0x68, 0xF0, 0x15, 0x28, 0x40, 0x28, 0x3D, 0x3C, + 0x63, 0x00, 0xC0, 0xE0, 0x00, 0xA2, 0x1C, 0x09, 0x19, 0xE4, 0x38, 0xF0, + 0x36, 0x14, 0x18, 0xE4, 0xC4, 0x28, 0x1A, 0x3C, 0x02, 0xA8, 0x40, 0x28, + 0xA8, 0xF0, 0x29, 0x2C, 0x1C, 0x2A, 0x31, 0x3C, 0x02, 0xA2, 0x78, 0xF0, + 0x00, 0xA2, 0x3E, 0xF0, 0x1C, 0x3E, 0x03, 0xA0, 0x2E, 0xE4, 0x2F, 0x3C, + 0x04, 0xA0, 0x31, 0x3C, 0x2E, 0xE4, 0x72, 0x3C, 0x28, 0x3C, 0x02, 0xA2, + 0x0A, 0xA2, 0x31, 0x2A, 0x01, 0x00, 0x4D, 0xD0, 0x74, 0x1F, 0x1E, 0xE4, + 0x30, 0x3C, 0x36, 0xB6, 0x0C, 0x0A, 0x1E, 0xE4, 0x39, 0x0C, 0x1E, 0xE4, + 0x3E, 0x28, 0xA2, 0x0C, 0x1A, 0xE4, 0x3E, 0x28, 0x9E, 0x1F, 0x1E, 0xE4, + 0xAC, 0x0C, 0x18, 0xE4, 0x1A, 0x28, 0x3B, 0x09, 0x18, 0xE4, 0x6A, 0x28, + 0x67, 0xE1, 0x2E, 0xE4, 0x1A, 0x3C, 0x02, 0xA0, 0x55, 0x2C, 0x17, 0x3D, + 0x00, 0xA2, 0xAC, 0x04, 0x50, 0xA0, 0x9A, 0xC8, 0x17, 0x3D, 0x02, 0xA1, + 0x49, 0xE0, 0x1A, 0x2C, 0x17, 0x3D, 0x17, 0x35, 0x06, 0xAE, 0x81, 0xF1, + 0xFF, 0x1F, 0x03, 0xE0, 0x17, 0x4F, 0x17, 0x23, 0xBB, 0x04, 0x67, 0xE1, + 0x40, 0x28, 0xF8, 0xF7, 0x28, 0xCA, 0x41, 0xE0, 0x00, 0x01, 0x04, 0xE0, + 0x48, 0xF0, 0x06, 0xA1, 0xAC, 0x04, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, + 0x02, 0x00, 0x13, 0xD1, 0x04, 0x00, 0x12, 0xD1, 0x00, 0xA2, 0x2E, 0xE4, + 0xF8, 0xF7, 0x28, 0xCA, 0x3E, 0x28, 0x0B, 0x3C, 0x0A, 0x3C, 0x55, 0x3C, + 0xB6, 0xCF, 0x02, 0xA9, 0x08, 0xA2, 0xCA, 0xF2, 0x0A, 0xE0, 0x20, 0xAE, + 0xFF, 0xFF, 0x04, 0xE0, 0x84, 0xCF, 0x02, 0xA2, 0x9E, 0xCF, 0xFF, 0xFF, + 0xEA, 0xCF, 0xE8, 0xCF, 0xD2, 0xCF, 0x00, 0xA2, 0x8A, 0xCF, 0x10, 0xA2, + 0xEE, 0xCF, 0xEC, 0xCF, 0x82, 0xCF, 0x28, 0x4C, 0x04, 0xAE, 0x2A, 0x28, + 0x00, 0x00, 0x82, 0xD1, 0x01, 0x00, 0xCD, 0xD1, 0x01, 0x00, 0xDC, 0xD1, + 0x01, 0x00, 0xCE, 0xD1, 0x50, 0x18, 0x0A, 0x3C, 0x02, 0xA0, 0x0A, 0x28, + 0x0B, 0x28, 0x0A, 0x3C, 0x00, 0xA2, 0x68, 0xF0, 0xFA, 0xF7, 0xBE, 0xCB, + 0x0B, 0x3C, 0x02, 0xA0, 0x74, 0x1F, 0x1E, 0xE4, 0x30, 0x3C, 0x02, 0xA2, + 0x63, 0x3C, 0x54, 0x2C, 0x39, 0x0C, 0x1E, 0xE4, 0x55, 0x1C, 0x54, 0x2C, + 0x43, 0x0A, 0x1E, 0xE4, 0x3E, 0x28, 0x63, 0x3C, 0x66, 0xE0, 0x63, 0x2E, + 0x18, 0xE4, 0x3E, 0x28, 0xBA, 0x09, 0x1A, 0xE4, 0x1A, 0x2C, 0x9E, 0x1F, + 0x1E, 0xE4, 0xC2, 0x09, 0x55, 0x1C, 0x54, 0x2C, 0x1A, 0x3C, 0x02, 0xA0, + 0x00, 0xA2, 0x2A, 0xE4, 0x3E, 0x28, 0x48, 0xF6, 0xDC, 0xD1, 0x84, 0xCF, + 0x9E, 0xCF, 0xB6, 0xCF, 0xFC, 0xBB, 0x63, 0x2C, 0x2E, 0xE4, 0x00, 0x00, + 0x1E, 0xE4, 0x55, 0x3C, 0x42, 0xE0, 0x55, 0x2E, 0x0C, 0x3C, 0x55, 0x2C, + 0x2E, 0xE4, 0xA2, 0x0C, 0xC5, 0x0A, 0x1E, 0xE4, 0x0D, 0x3C, 0x63, 0x0C, + 0x06, 0xA2, 0x03, 0xA1, 0x55, 0x1E, 0x54, 0x2E, 0x01, 0x00, 0xDA, 0xD1, + 0x9A, 0xCF, 0x56, 0xB6, 0x00, 0xA2, 0x04, 0xCF, 0x0B, 0x4C, 0x0A, 0x24, + 0x0D, 0x2E, 0x56, 0xB6, 0x0C, 0x1E, 0x55, 0x2E, 0x12, 0xA2, 0x29, 0xF0, + 0x03, 0xA1, 0x55, 0x1E, 0x55, 0x1E, 0x54, 0x2E, 0x96, 0xB6, 0x03, 0xA1, + 0x9C, 0xCF, 0x10, 0xA2, 0x29, 0xF0, 0x03, 0xA1, 0x02, 0xA0, 0x55, 0x2C, + 0x01, 0x00, 0xDC, 0xD1, 0x0A, 0x3C, 0x02, 0xA0, 0x0A, 0x28, 0x55, 0x3C, + 0x0A, 0x3C, 0x00, 0xA2, 0x68, 0xF0, 0x50, 0x18, 0xBE, 0xCB, 0x0B, 0x3C, + 0x02, 0xA0, 0x0B, 0x28, 0x18, 0xF5, 0x0D, 0x1C, 0x55, 0x2C, 0xFA, 0xF7, + 0x2B, 0x28, 0x2E, 0xE4, 0xAC, 0x0C, 0x1E, 0xE4, 0x56, 0xE0, 0x3F, 0xA8, + 0x2C, 0x2A, 0x0A, 0xAE, 0x56, 0xE0, 0x3F, 0xA8, 0x2D, 0x2A, 0x0A, 0xAE, + 0x02, 0xA2, 0xC4, 0xCF, 0x28, 0x28, 0x30, 0xCF, 0x2E, 0xE4, 0x90, 0xCF, + 0x2A, 0x4C, 0x18, 0xAE, 0x66, 0xA5, 0x00, 0xA4, 0x24, 0x08, 0x2A, 0x28, + 0x06, 0x29, 0x9C, 0xE0, 0xF0, 0x02, 0x00, 0xE0, 0x2A, 0x4C, 0x0C, 0xAE, + 0x06, 0x4D, 0x0C, 0xAE, 0x00, 0xA2, 0x82, 0xCF, 0x28, 0x4C, 0x04, 0xAE, + 0x3E, 0x28, 0x43, 0x0A, 0x1E, 0xE4, 0x3B, 0x3C, 0x1E, 0xE4, 0xC5, 0x0A, + 0x1E, 0xE4, 0x3A, 0xF0, 0x5E, 0x8A, 0x0E, 0x0B, 0x1E, 0xE4, 0x47, 0x0A, + 0x9A, 0xC8, 0xE4, 0x0A, 0x1E, 0xE4, 0x4D, 0x00, 0x5F, 0x3C, 0xFF, 0xFF, + 0x08, 0xE0, 0x5E, 0x1C, 0x8A, 0xF0, 0x28, 0x28, 0xA8, 0xF0, 0x6B, 0x28, + 0x28, 0xA1, 0x5F, 0x28, 0x66, 0xF0, 0x0B, 0x28, 0x55, 0x2C, 0x5C, 0x3C, + 0xAA, 0x28, 0x32, 0xF0, 0x0A, 0xE4, 0x3B, 0x28, 0x42, 0xF0, 0x54, 0x1C, + 0x02, 0xA2, 0x2E, 0xE4, 0x02, 0xA2, 0x23, 0x0A, 0x37, 0x28, 0x5E, 0x0A, + 0x0E, 0xE4, 0x3C, 0x3C, 0xE1, 0x28, 0xA9, 0xF0, 0x2A, 0xE4, 0x38, 0x2A, + 0x02, 0xA1, 0xE1, 0x3C, 0x02, 0xA1, 0x2A, 0xE4, 0x2E, 0xE4, 0x3B, 0x3C, + 0x02, 0xA2, 0x28, 0xE4, 0x03, 0xA0, 0x3C, 0x2E, 0x63, 0x1C, 0x3C, 0x2C, + 0x3C, 0x3C, 0x02, 0xA2, 0x28, 0xE4, 0x3C, 0x3E, 0x2A, 0xE4, 0x37, 0x28, + 0x2E, 0xE4, 0x3B, 0x3C, 0x3A, 0xF0, 0x04, 0xA1, 0x2A, 0xE4, 0x38, 0x28, + 0x39, 0x1C, 0x1A, 0x2C, 0xDE, 0xF0, 0x39, 0x2C, 0x00, 0x0A, 0x00, 0xE0, + 0x1A, 0x2C, 0x80, 0xF0, 0x3E, 0xF0, 0x02, 0xA0, 0x06, 0x29, 0x9C, 0xE0, + 0x2E, 0xE4, 0x63, 0x3C, 0xFF, 0xFF, 0x04, 0xE0, 0xD7, 0x3C, 0xD8, 0x3C, + 0xE1, 0x3C, 0x00, 0xA2, 0xD6, 0x3C, 0xD5, 0x3C, 0x02, 0xA2, 0xD9, 0x3C, + 0x10, 0xB6, 0xD7, 0x3C, 0xD6, 0x28, 0x1E, 0xF2, 0x2B, 0xE4, 0x38, 0x28, + 0x37, 0x2A, 0xD6, 0x3C, 0xD5, 0x2C, 0x2E, 0xE4, 0x01, 0xA2, 0x38, 0xF0, + 0xD8, 0x1C, 0x02, 0xA1, 0xD5, 0x3C, 0x02, 0xA0, 0x04, 0xA1, 0x38, 0x28, + 0x28, 0xE4, 0x01, 0xA2, 0xD5, 0x3E, 0xD6, 0x3E, 0x03, 0xA2, 0x5A, 0xF0, + 0xD5, 0x3E, 0xD6, 0x3E, 0x03, 0xA2, 0x2E, 0xE4, 0x0E, 0xE4, 0xD9, 0x3C, + 0x02, 0xA0, 0xD9, 0x28, 0x38, 0x28, 0x2A, 0xE4, 0x37, 0x28, 0xA5, 0x0A, + 0x39, 0x28, 0x3A, 0xF0, 0x04, 0xA1, 0x2A, 0xE4, 0x80, 0xF0, 0x39, 0x1C, + 0xD9, 0x2C, 0xDE, 0xF0, 0x9C, 0xE0, 0x00, 0x0A, 0x00, 0xE0, 0xD9, 0x2C, + 0x04, 0xE0, 0x3E, 0xF0, 0x02, 0xA0, 0x06, 0x29, 0x2E, 0xE4, 0x03, 0xA2, + 0xD8, 0x3C, 0xFF, 0xFF, 0x2B, 0xE4, 0x5D, 0x4C, 0x38, 0x28, 0x37, 0x2A, + 0x9A, 0xC8, 0x28, 0xE4, 0xE1, 0x28, 0x28, 0xE4, 0x24, 0xE4, 0x46, 0xE0, + 0x39, 0x4E, 0x3A, 0x26, 0xE1, 0x3E, 0x0D, 0xA2, 0xD6, 0x3E, 0x03, 0xA2, + 0xDA, 0xF0, 0x0E, 0xA8, 0x68, 0xC8, 0x2E, 0xE4, 0x07, 0x3C, 0x07, 0x18, + 0x10, 0xA2, 0x07, 0x3C, 0x84, 0xE1, 0x02, 0xA2, 0x44, 0xCC, 0x02, 0xA1, + 0x90, 0xE1, 0x90, 0xE1, 0xE0, 0xBA, 0xD2, 0x0A, 0x2E, 0x08, 0x1A, 0xE0, + 0x3A, 0xF0, 0x28, 0x28, 0x40, 0xD0, 0x82, 0xCC, 0x2A, 0x4C, 0x0C, 0xAE, + 0xF8, 0xF7, 0x84, 0xC8, 0x90, 0xE1, 0x02, 0x00, 0x2E, 0xE4, 0xF8, 0xF7, + 0x1C, 0xCB, 0x2E, 0xE4, 0xDC, 0xD1, 0x10, 0x0B, 0x18, 0xE4, 0xC9, 0x28, + 0x9D, 0x18, 0x18, 0xE4, 0x15, 0x28, 0x01, 0x00, 0x02, 0xA0, 0x55, 0x2C, + 0x69, 0x1C, 0x1E, 0xE4, 0x1E, 0xE4, 0x7D, 0x0A, 0x1E, 0xE4, 0x55, 0x3C, + 0x1E, 0xE4, 0x0D, 0x10, 0x1E, 0xE4, 0x1B, 0x10, 0xBE, 0xCB, 0x35, 0x10, + 0x1E, 0xE4, 0x55, 0x0F, 0x38, 0x0B, 0x19, 0xE4, 0x64, 0x2A, 0xFA, 0xF7, + 0x68, 0x2A, 0x7F, 0x1D, 0x19, 0xE4, 0x69, 0x2A, 0xDC, 0xD1, 0x2E, 0xE4, + 0xC4, 0x1D, 0x19, 0xE4, 0x2E, 0xE4, 0xFA, 0xF7, 0xBE, 0xCB, 0x01, 0x00, + 0xD4, 0x0E, 0x0E, 0xE4, 0x76, 0x0E, 0x0E, 0xE4, 0x6F, 0xC8, 0x2A, 0xE4, + 0x06, 0xA8, 0xC8, 0xCA, 0x66, 0xC8, 0xFF, 0x00, 0x09, 0xE0, 0x09, 0xA1, + 0x1E, 0xE4, 0x2E, 0xE4, 0x75, 0xF7, 0x45, 0xE0, 0x64, 0x28, 0x65, 0x3C, + 0x00, 0xA2, 0x91, 0x0B, 0x64, 0x3C, 0x04, 0xAF, 0x06, 0xA0, 0x26, 0xE4, + 0x64, 0x28, 0x68, 0xCF, 0x02, 0xA1, 0x02, 0xAE, 0x6A, 0xCF, 0x00, 0xA2, + 0x66, 0xCF, 0x02, 0xA1, 0x02, 0xA1, 0x50, 0x28, 0x2E, 0xE4, 0x6C, 0xCF, + 0x00, 0xA2, 0x66, 0xCF, 0x02, 0xAF, 0x68, 0xCF, 0x2E, 0xE4, 0x65, 0x3C, + 0x6C, 0xCF, 0x6A, 0xCF, 0x66, 0x3C, 0x00, 0xA2, 0x8A, 0xF1, 0x1E, 0xCB, + 0x51, 0x4C, 0x20, 0xAE, 0x02, 0xA1, 0x50, 0x28, 0x16, 0xE0, 0x46, 0xE0, + 0x05, 0xCB, 0x02, 0xA1, 0x72, 0x0B, 0x1E, 0xE4, 0x28, 0xE4, 0x66, 0x3C, + 0x39, 0xF0, 0x04, 0xA1, 0x65, 0x28, 0x66, 0x2A, 0x02, 0xA0, 0x65, 0x28, + 0x52, 0x0B, 0x12, 0xE4, 0x04, 0xA0, 0x65, 0x28, 0x2E, 0xE4, 0x65, 0x3C, + 0x18, 0xE0, 0x64, 0x82, 0xA4, 0xCC, 0x06, 0xA8, 0x42, 0xE0, 0x46, 0x00, + 0xC1, 0xE0, 0x08, 0xAE, 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, + 0x64, 0x28, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x02, 0xAE, 0x16, 0xB6, + 0x03, 0xA8, 0x65, 0x2A, 0x24, 0xCE, 0x02, 0xAE, 0x64, 0x28, 0x22, 0xCE, + 0xF9, 0xF7, 0x29, 0xCA, 0x19, 0x00, 0x13, 0xD1, 0x06, 0xA8, 0x65, 0x28, + 0x2E, 0xE4, 0x90, 0xE1, 0x08, 0xAE, 0x18, 0xE0, 0x64, 0x82, 0xA4, 0xCC, + 0x05, 0xE0, 0x42, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x29, 0xCA, 0x42, 0xE0, + 0x11, 0xAE, 0x00, 0x00, 0x65, 0x2A, 0x64, 0x28, 0x20, 0xCE, 0xF9, 0xF7, + 0x22, 0xCE, 0x02, 0xAE, 0x16, 0xB6, 0x03, 0xA8, 0x13, 0xD1, 0x24, 0xCE, + 0x02, 0xAE, 0x64, 0x28, 0x90, 0xE1, 0xF9, 0xF7, 0x29, 0xCA, 0x18, 0x00, + 0x22, 0xD0, 0x30, 0xCE, 0x00, 0xA2, 0x2E, 0xE4, 0x90, 0xE1, 0x98, 0x0B, + 0x84, 0xE1, 0x00, 0x02, 0x5A, 0xF1, 0x41, 0x28, 0x2E, 0xE4, 0x32, 0xCE, + 0x64, 0x00, 0x04, 0xE0, 0xAA, 0xF0, 0x02, 0xA1, 0xC0, 0xBA, 0xC0, 0xBA, + 0xC0, 0xBA, 0x8E, 0xBA, 0x04, 0xE0, 0xB7, 0x0B, 0x0E, 0xE4, 0xC4, 0xBA, + 0xE0, 0xBA, 0xC0, 0xBA, 0x8E, 0xBA, 0x4D, 0x00, 0xB7, 0x0B, 0x0E, 0xE4, + 0xC4, 0xBA, 0xC0, 0xBA, 0xC0, 0xBA, 0x8E, 0xBA, 0x42, 0x00, 0x04, 0xE0, + 0x42, 0x28, 0xC4, 0xBA, 0xC0, 0xBA, 0xE0, 0xBA, 0x41, 0x28, 0xFC, 0xBB, + 0x0E, 0x28, 0x8E, 0xBA, 0xFC, 0xBB, 0x43, 0x28, 0x88, 0xF0, 0x04, 0xA1, + 0xC0, 0xBA, 0xFC, 0xBB, 0xFC, 0xBB, 0x00, 0xA2, 0xFC, 0xBB, 0x08, 0xA1, + 0x10, 0x28, 0xC0, 0xBA, 0x48, 0xF0, 0x11, 0x28, 0xFC, 0xBB, 0x11, 0x28, + 0x13, 0x28, 0xFC, 0xBB, 0x08, 0xA1, 0x12, 0x28, 0x50, 0x28, 0xC0, 0xBA, + 0x90, 0xE1, 0xFC, 0xBB, 0x40, 0x2A, 0x51, 0x28, 0xFC, 0xBB, 0x02, 0xA1, + 0xFC, 0xBB, 0x02, 0xA1, 0x02, 0xAF, 0x2B, 0xF0, 0xC0, 0xBA, 0x4A, 0xF0, + 0x40, 0x28, 0x90, 0xE1, 0x90, 0xE1, 0xE0, 0xBA, 0x2E, 0xF0, 0xC0, 0xBA, + 0xC0, 0xBA, 0x38, 0xF0, 0x73, 0x28, 0xE0, 0xBA, 0x43, 0x2A, 0x00, 0xA2, + 0xE0, 0xBA, 0x7E, 0xF1, 0x40, 0x2A, 0x08, 0x3C, 0x07, 0x3C, 0x32, 0xB4, + 0x07, 0x5C, 0x74, 0x28, 0x08, 0x3C, 0x32, 0xB4, 0xFC, 0xBB, 0x07, 0x5C, + 0x75, 0x28, 0xFC, 0xBB, 0x77, 0x28, 0xFC, 0xBB, 0x08, 0x5C, 0x76, 0x28, + 0xC0, 0xBA, 0x90, 0xE1, 0xFC, 0xBB, 0x08, 0x5C, 0x2E, 0xE4, 0x02, 0xA2, + 0xA2, 0x0C, 0x1E, 0xE4, 0x0F, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, + 0x3E, 0x28, 0xFC, 0xBB, 0x0E, 0x28, 0xFC, 0xBB, 0x21, 0x28, 0x80, 0xBA, + 0x20, 0x28, 0x80, 0xBA, 0x22, 0x28, 0x36, 0x0C, 0x08, 0xE4, 0xFC, 0xBB, + 0xFC, 0xBB, 0x90, 0xE1, 0x00, 0xA2, 0xFC, 0xBB, 0xC1, 0xBA, 0x90, 0xE1, + 0xC0, 0xBA, 0x90, 0xE1, 0xFE, 0xBB, 0x34, 0xA1, 0x23, 0x28, 0x90, 0xE1, + 0xFE, 0xBB, 0x24, 0x28, 0xFE, 0xBB, 0x00, 0xA2, 0x80, 0xBA, 0x26, 0x28, + 0x80, 0xBA, 0x25, 0x28, 0x04, 0xA1, 0x41, 0x28, 0x80, 0xBA, 0x27, 0x28, + 0xC0, 0xBA, 0x80, 0xBA, 0x3F, 0x28, 0x68, 0xF0, 0xA2, 0x0C, 0x1E, 0xE4, + 0xFE, 0xBB, 0x24, 0x28, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, + 0x28, 0x28, 0xFC, 0xBB, 0x55, 0x2C, 0x2E, 0xE4, 0xFC, 0xBB, 0x0A, 0xA0, + 0x02, 0xAE, 0x16, 0xE0, 0x48, 0xF0, 0x40, 0x28, 0xFC, 0xBB, 0x0F, 0x28, + 0x29, 0x2C, 0x7E, 0xF0, 0x10, 0x70, 0x29, 0x2C, 0x02, 0xA8, 0x40, 0x2C, + 0xE0, 0xBA, 0x10, 0x70, 0x1C, 0x28, 0x6A, 0xF0, 0x31, 0x28, 0x80, 0xBA, + 0xFC, 0xBB, 0xFF, 0xFF, 0x08, 0xE0, 0x02, 0xA1, 0x02, 0xAE, 0x33, 0x2C, + 0x98, 0xF0, 0x11, 0x28, 0x5E, 0x0C, 0x0A, 0xE4, 0x20, 0x28, 0x12, 0x70, + 0x0A, 0xE4, 0x27, 0x28, 0xFE, 0xBB, 0x00, 0xA2, 0x28, 0x28, 0xFC, 0xBB, + 0x00, 0xA2, 0x63, 0x0C, 0x58, 0xF0, 0x04, 0xA1, 0x13, 0x28, 0x8A, 0xF1, + 0x3E, 0xF0, 0xFC, 0xBB, 0x00, 0xA2, 0xE0, 0xBA, 0x04, 0xA1, 0x40, 0x28, + 0x90, 0xE1, 0xC0, 0xBA, 0xE0, 0xBA, 0x9B, 0xF0, 0x7B, 0x2A, 0xB8, 0xF0, + 0xFC, 0xBB, 0x04, 0xA2, 0xFC, 0xBB, 0x00, 0xA2, 0xC0, 0xBA, 0x2E, 0xF0, + 0xFC, 0xBB, 0x06, 0xA2, 0x31, 0x28, 0x88, 0x0C, 0x0A, 0xE4, 0x2F, 0x28, + 0x90, 0xE1, 0xC0, 0xBA, 0x87, 0x0C, 0x0A, 0xE4, 0xC0, 0xBA, 0x88, 0x0C, + 0x0E, 0xE4, 0xC0, 0xBA, 0x2E, 0x28, 0x3A, 0xF0, 0x28, 0x44, 0x3E, 0x28, + 0xFE, 0xBB, 0x23, 0x18, 0x2A, 0x28, 0xFC, 0xBB, 0x2B, 0x28, 0x9E, 0x0C, + 0x0A, 0xE4, 0x25, 0x28, 0x9E, 0x0C, 0x0A, 0xE4, 0x02, 0xA1, 0xFC, 0xBB, + 0x2D, 0x28, 0xFE, 0xBB, 0x02, 0xAF, 0x2C, 0x28, 0x2E, 0xE4, 0x02, 0xA2, + 0xFE, 0xBB, 0x02, 0xAF, 0x68, 0xC8, 0xE0, 0xBA, 0x2E, 0xE4, 0x00, 0xA2, + 0x12, 0xE0, 0x10, 0xA1, 0x2A, 0xE4, 0x0E, 0xA8, 0x2E, 0xE4, 0xFE, 0x70, + 0x00, 0xA2, 0xFE, 0x3C, 0x07, 0x3C, 0x8A, 0xF0, 0x0E, 0xA8, 0x68, 0xC8, + 0x00, 0xA2, 0x07, 0x3C, 0x07, 0x18, 0x10, 0xA2, 0x00, 0xA2, 0x2E, 0xE4, + 0x90, 0xE1, 0x07, 0x70, 0x1E, 0xE4, 0x08, 0x12, 0x1E, 0xE4, 0x34, 0x3C, + 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xD2, 0x10, 0x17, 0xAE, 0x3F, 0x2A, + 0x10, 0xA2, 0x25, 0x01, 0x15, 0xAE, 0x17, 0xE0, 0x3E, 0x2A, 0x56, 0xE0, + 0x28, 0x2A, 0x00, 0x01, 0xC2, 0xE0, 0x56, 0xE0, 0x04, 0xE0, 0x39, 0xF0, + 0x6F, 0x01, 0x04, 0xE0, 0x00, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x68, 0x01, + 0xC2, 0xE0, 0x00, 0xA2, 0x79, 0x01, 0xC2, 0xE0, 0xC0, 0xE0, 0x3D, 0x01, + 0xC2, 0xE0, 0x3C, 0x01, 0x7F, 0x00, 0x08, 0xE0, 0x49, 0xE0, 0x50, 0x00, + 0x7F, 0x00, 0x09, 0xE0, 0x11, 0xAF, 0x00, 0x3C, 0x00, 0xA2, 0x00, 0x3E, + 0x00, 0x46, 0x01, 0x3E, 0x0A, 0xE0, 0x3B, 0xF0, 0x03, 0xA8, 0x00, 0x2A, + 0x2B, 0xF0, 0x05, 0xA8, 0x00, 0x2A, 0x02, 0x00, 0x2B, 0xF0, 0x09, 0xA8, + 0x00, 0x2A, 0x12, 0xA9, 0x2B, 0xF0, 0x11, 0xA8, 0x00, 0x2A, 0x40, 0xA9, + 0xC1, 0xE0, 0x0C, 0x04, 0xC2, 0xE0, 0x80, 0xA9, 0x10, 0xAE, 0x00, 0x00, + 0x04, 0xE0, 0x46, 0x00, 0x5B, 0xF0, 0x03, 0xA8, 0x01, 0x2A, 0x42, 0xE0, + 0x11, 0x4D, 0x11, 0x21, 0x94, 0x03, 0x61, 0xE1, 0x04, 0xE0, 0x46, 0x00, + 0xC1, 0xE0, 0x0E, 0xCF, 0x01, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x40, 0x00, + 0x96, 0x03, 0x61, 0xE1, 0x5B, 0xF0, 0x05, 0xA8, 0x03, 0x01, 0xC2, 0xE0, + 0x11, 0x4D, 0x11, 0x21, 0x00, 0xA2, 0x08, 0x02, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x02, 0xA2, 0x1C, 0x02, 0xC2, 0xE0, 0x15, 0x02, 0xC2, 0xE0, + 0x00, 0xA2, 0x10, 0x02, 0x09, 0xAE, 0x03, 0xA2, 0xEF, 0x10, 0x1E, 0xE4, + 0x43, 0x2A, 0x56, 0xE0, 0x09, 0xAE, 0x01, 0xA9, 0x1B, 0xE0, 0x56, 0xE0, + 0x09, 0xAE, 0x17, 0xE0, 0x13, 0x02, 0xC2, 0xE0, 0x56, 0xE0, 0x0D, 0xAE, + 0x70, 0x00, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x09, 0xA8, 0x01, 0x2A, + 0x42, 0xE0, 0x10, 0xAE, 0x11, 0x21, 0x98, 0x03, 0x61, 0xE1, 0x5B, 0xF0, + 0xC1, 0xE0, 0x11, 0x02, 0xC2, 0xE0, 0x11, 0x4D, 0x00, 0xE0, 0x70, 0x00, + 0x04, 0xE0, 0x46, 0x00, 0x01, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x40, 0x00, + 0x9A, 0x03, 0x61, 0xE1, 0x5B, 0xF0, 0x11, 0xA8, 0x12, 0x02, 0xC2, 0xE0, + 0x11, 0x4D, 0x11, 0x21, 0x72, 0x2A, 0x71, 0x3C, 0x64, 0x00, 0xC0, 0xE0, + 0x08, 0xE0, 0x08, 0xAE, 0x08, 0xAF, 0x3B, 0xF0, 0xC1, 0xE0, 0x5B, 0xF0, + 0x72, 0x2A, 0xFF, 0xFF, 0xC1, 0xE0, 0x6E, 0xF0, 0x0F, 0xA8, 0x44, 0x00, + 0x27, 0x00, 0x09, 0xE0, 0x21, 0xAF, 0x64, 0x00, 0x17, 0xE0, 0x43, 0x2A, + 0x56, 0xE0, 0x21, 0xAE, 0x05, 0xA8, 0x40, 0x2A, 0x56, 0xE0, 0x27, 0xAE, + 0x7B, 0x2A, 0x9B, 0xF0, 0x72, 0x2A, 0xBB, 0xF0, 0x4E, 0xF0, 0x29, 0xF0, + 0x7C, 0x2A, 0x49, 0xF0, 0x40, 0x2A, 0x2E, 0xF0, 0x03, 0xAA, 0x40, 0x2A, + 0xC2, 0xE0, 0x56, 0xE0, 0x2D, 0xAE, 0x0F, 0xA8, 0x08, 0xAE, 0x51, 0x4C, + 0x50, 0x20, 0x38, 0x01, 0x05, 0x02, 0xC2, 0xE0, 0x01, 0x01, 0xC2, 0xE0, + 0x72, 0x2A, 0x08, 0xAE, 0x52, 0x4C, 0x50, 0x20, 0x4B, 0xF0, 0x03, 0xA8, + 0x71, 0x46, 0x03, 0xAA, 0xC2, 0xE0, 0x08, 0xAE, 0x50, 0x4C, 0x52, 0x20, + 0xEF, 0x10, 0x1E, 0xE4, 0x00, 0xA2, 0x42, 0x01, 0x56, 0xE0, 0x07, 0xAE, + 0x17, 0xE0, 0x43, 0x2A, 0x06, 0xAE, 0x28, 0x28, 0x02, 0x01, 0xC2, 0xE0, + 0x10, 0xA2, 0x04, 0x01, 0xC2, 0xE0, 0x40, 0x4C, 0x40, 0x4C, 0x06, 0xAE, + 0x28, 0x4C, 0x08, 0xAE, 0x5A, 0xF0, 0x72, 0x28, 0x04, 0x02, 0xC2, 0xE0, + 0x3E, 0xF0, 0x35, 0x28, 0x8B, 0xF0, 0x7B, 0x2A, 0xC2, 0xE0, 0x7E, 0xA8, + 0x60, 0x00, 0xC0, 0xE0, 0xC2, 0xE0, 0x69, 0x00, 0xC0, 0xE0, 0x43, 0x01, + 0x0B, 0x02, 0xC2, 0xE0, 0x34, 0x28, 0x7F, 0x01, 0xC2, 0xE0, 0x02, 0xA2, + 0x14, 0x02, 0xC2, 0xE0, 0x7B, 0x28, 0x3B, 0xF0, 0x40, 0x2A, 0x02, 0x03, + 0x80, 0x03, 0xC2, 0xE0, 0x35, 0x28, 0xEA, 0xF0, 0x86, 0x03, 0xC2, 0xE0, + 0x83, 0x03, 0xC2, 0xE0, 0xE5, 0x10, 0x1E, 0xE4, 0x89, 0x03, 0xC2, 0xE0, + 0xC2, 0xE0, 0x00, 0xA2, 0x40, 0x12, 0x1E, 0xE4, 0x72, 0x00, 0xC2, 0xE0, + 0x34, 0x28, 0x02, 0x03, 0x69, 0xF0, 0x7B, 0x2A, 0x8B, 0xF0, 0x40, 0x2A, + 0x29, 0xF0, 0x31, 0x2A, 0x49, 0xF0, 0x7C, 0x2A, 0x05, 0xA1, 0x40, 0x2A, + 0x35, 0x3C, 0x02, 0xAA, 0x34, 0x3C, 0x02, 0xA0, 0x34, 0x28, 0x7B, 0xF0, + 0x40, 0x2A, 0x34, 0x3C, 0x28, 0xF0, 0x32, 0x18, 0x72, 0x28, 0xD8, 0xF1, + 0x7B, 0x28, 0xFB, 0xF1, 0xC0, 0xE0, 0x3E, 0xF0, 0x35, 0x28, 0x3A, 0xF0, + 0x43, 0x01, 0xC2, 0xE0, 0x7E, 0xA8, 0x60, 0x00, 0x35, 0x28, 0x02, 0x03, + 0xC2, 0xE0, 0x02, 0xA2, 0x83, 0x03, 0xC2, 0xE0, 0x80, 0x03, 0xC2, 0xE0, + 0x89, 0x03, 0xC2, 0xE0, 0x86, 0x03, 0xC2, 0xE0, 0x40, 0x12, 0x1E, 0xE4, + 0xE5, 0x10, 0x1E, 0xE4, 0x00, 0xA2, 0x02, 0x03, 0xC2, 0xE0, 0x00, 0xA2, + 0x20, 0x03, 0xC2, 0xE0, 0x13, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x02, 0xA8, + 0x02, 0xAF, 0x40, 0x28, 0x7B, 0x2A, 0x02, 0xA8, 0x40, 0x28, 0x0D, 0x03, + 0x02, 0xAA, 0x2B, 0xF0, 0x7C, 0x2A, 0x39, 0xF0, 0x55, 0xE0, 0x0B, 0xAE, + 0x55, 0xE0, 0x01, 0xA2, 0x55, 0xE0, 0x0B, 0xAE, 0x55, 0xE0, 0x0B, 0xAE, + 0x0B, 0x03, 0xC3, 0xE0, 0x0A, 0x03, 0xC3, 0xE0, 0x0C, 0x03, 0xC2, 0xE0, + 0x55, 0x00, 0x04, 0xE0, 0x26, 0x01, 0xC2, 0xE0, 0x3F, 0x00, 0x04, 0xE0, + 0xFF, 0xFF, 0x04, 0xE0, 0x6A, 0xF0, 0x72, 0x28, 0x66, 0xE1, 0x7E, 0xF0, + 0x1F, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x16, 0x4D, 0x16, 0x21, 0xC0, 0x04, + 0x75, 0x01, 0xC2, 0xE0, 0x26, 0x28, 0x1F, 0x01, 0x0C, 0x12, 0x1E, 0xE4, + 0xD3, 0x10, 0x1E, 0xE4, 0x02, 0xA2, 0x71, 0x01, 0xC2, 0xE0, 0x28, 0x28, + 0x39, 0x01, 0xC2, 0xE0, 0x06, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, + 0xDA, 0x3C, 0x14, 0xA2, 0x05, 0xA8, 0xDA, 0x2A, 0xDB, 0x3C, 0x40, 0x01, + 0x52, 0xB4, 0xDB, 0x2A, 0x36, 0xB6, 0x00, 0xA2, 0xDA, 0x2A, 0x0D, 0x01, + 0xC2, 0xE0, 0x08, 0xAE, 0x3E, 0x2A, 0x10, 0xA2, 0x89, 0xF0, 0x11, 0xA8, + 0xC2, 0xE0, 0x56, 0xE0, 0x15, 0xAE, 0x17, 0xE0, 0x04, 0xA8, 0x39, 0x01, + 0xC0, 0xE0, 0x00, 0x01, 0x02, 0xA0, 0x0A, 0x28, 0x2E, 0xE4, 0xDA, 0xF7, + 0x00, 0xA2, 0x29, 0xF0, 0x45, 0xE0, 0x50, 0x2E, 0x02, 0xA0, 0x0B, 0x28, + 0x28, 0xE4, 0x0A, 0x3C, 0x55, 0x3C, 0xF6, 0xA2, 0x2E, 0xE4, 0x0B, 0x3C, + 0x00, 0xA2, 0x3F, 0x00, 0xC2, 0xE0, 0x5D, 0x3C, 0x1E, 0xE4, 0x7D, 0x0A, + 0x1E, 0xE4, 0x92, 0x3C, 0x1E, 0xE4, 0x06, 0x3C, 0x2A, 0x28, 0x1A, 0x0F, + 0xF8, 0xA2, 0x56, 0x10, 0x1E, 0xE4, 0x35, 0x10, 0x3F, 0x00, 0xC2, 0xE0, + 0x55, 0x28, 0x55, 0x3C, 0x1B, 0x10, 0x1E, 0xE4, 0xA8, 0xF0, 0x08, 0xA0, + 0x35, 0x10, 0x1E, 0xE4, 0x0D, 0x10, 0x1E, 0xE4, 0x02, 0xA1, 0xFE, 0xF2, + 0x5A, 0x10, 0x1E, 0xE4, 0x1E, 0xE4, 0x1B, 0x10, 0x1E, 0xE4, 0xE8, 0xF0, + 0x1E, 0xE4, 0x35, 0x10, 0x1E, 0xE4, 0x0D, 0x10, 0x1E, 0xE4, 0x4E, 0x0F, + 0x1E, 0xE4, 0x5A, 0x10, 0x02, 0xA1, 0xD4, 0xF1, 0x0E, 0xF2, 0x44, 0x0F, + 0x9D, 0x18, 0x18, 0xE4, 0x15, 0x28, 0xEA, 0xF0, 0x63, 0xE1, 0x8A, 0xF0, + 0x1E, 0x01, 0xC0, 0xE0, 0x02, 0xA0, 0x0B, 0x4D, 0x13, 0x21, 0x28, 0x08, + 0x7D, 0x0A, 0x1E, 0xE4, 0x03, 0x3D, 0x13, 0x35, 0x0D, 0x10, 0x1E, 0xE4, + 0x1B, 0x10, 0x1E, 0xE4, 0x55, 0x0F, 0x1E, 0xE4, 0x35, 0x10, 0x1E, 0xE4, + 0x1E, 0xE4, 0xBE, 0xF0, 0xDB, 0x0E, 0x1E, 0xE4, 0x1E, 0xE4, 0x5E, 0x10, + 0x1E, 0xE4, 0x5A, 0x10, 0x1E, 0xE4, 0x1A, 0x0F, 0x1E, 0xE4, 0x7D, 0x0A, + 0x55, 0x3C, 0x02, 0xA0, 0x55, 0x28, 0x56, 0x10, 0x2E, 0xE4, 0x5D, 0x3C, + 0x89, 0x0E, 0x04, 0xE4, 0x08, 0xE0, 0x3F, 0x00, 0xC2, 0xE0, 0x55, 0x28, + 0x1E, 0xE4, 0x7F, 0x00, 0xC2, 0xE0, 0xFF, 0xFF, 0x2D, 0x0F, 0x19, 0xE4, + 0x28, 0x2A, 0xB4, 0x0A, 0xC3, 0xE0, 0xD7, 0x4E, 0x03, 0xAE, 0xD6, 0x2A, + 0x02, 0xA2, 0x8E, 0x01, 0xC3, 0xE0, 0x28, 0x01, 0xC2, 0xE0, 0xE9, 0xF7, + 0x11, 0x01, 0xC1, 0xE0, 0x5A, 0x10, 0x1E, 0xE4, 0x2E, 0xE4, 0x10, 0x01, + 0x0F, 0xA8, 0x54, 0x2E, 0x0A, 0xF1, 0x68, 0x28, 0x17, 0x21, 0xB3, 0x04, + 0x67, 0xE1, 0xDB, 0xF0, 0x07, 0xAF, 0x0F, 0xA0, 0x54, 0x2E, 0x17, 0x4D, + 0x1E, 0xE4, 0x42, 0xE0, 0x03, 0xA1, 0x07, 0xAE, 0x54, 0x2C, 0xBA, 0xF0, + 0x69, 0x28, 0xEC, 0x1D, 0x07, 0xA0, 0x54, 0x2E, 0x06, 0xA1, 0x06, 0xA8, + 0x18, 0xE4, 0x03, 0xA1, 0x05, 0xAE, 0x05, 0xAF, 0x3F, 0x00, 0xC2, 0xE0, + 0x54, 0x2C, 0xAA, 0x1D, 0x5A, 0x10, 0x1E, 0xE4, 0x56, 0x10, 0x1E, 0xE4, + 0x02, 0xA8, 0x18, 0x01, 0xC0, 0xE0, 0x90, 0xE1, 0x02, 0xAE, 0xD6, 0x28, + 0x2E, 0xE4, 0x8A, 0xF7, 0xC2, 0xE0, 0x28, 0x01, 0xC2, 0xE0, 0xD7, 0x4C, + 0x02, 0xA1, 0x55, 0x28, 0x2E, 0xE4, 0x8E, 0x01, 0x2E, 0xE4, 0xE0, 0x3C, + 0x06, 0xAE, 0x0E, 0xA8, 0xDF, 0x3C, 0x06, 0xAE, 0x0E, 0xA8, 0x55, 0x28, + 0x05, 0x3C, 0x90, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0xE0, 0xDF, 0x28, + 0x09, 0x03, 0xC2, 0xE0, 0x91, 0x01, 0x62, 0xE1, 0x92, 0xE0, 0x00, 0x02, + 0x22, 0xD0, 0x20, 0xC4, 0xB0, 0x03, 0x63, 0xE1, 0x12, 0x9E, 0x41, 0x0F, + 0x84, 0xE1, 0x03, 0x00, 0x2E, 0xE4, 0x2E, 0xE4, 0x11, 0x3D, 0x11, 0x35, + 0x60, 0x28, 0x19, 0x01, 0xC2, 0xE0, 0x62, 0x28, 0xC2, 0xE0, 0x61, 0x28, + 0x1A, 0x01, 0xC2, 0xE0, 0x62, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x1B, 0x01, + 0x61, 0x3C, 0x60, 0x3C, 0x22, 0x22, 0x04, 0xE0, 0x2B, 0xF0, 0x55, 0x2C, + 0x5D, 0x2A, 0x2E, 0xE4, 0x34, 0xF0, 0x54, 0x1C, 0x0C, 0xA0, 0x55, 0x28, + 0x0A, 0x28, 0x2E, 0xE4, 0xD6, 0x3C, 0x02, 0xA2, 0x29, 0xF0, 0x45, 0xE0, + 0x50, 0x2E, 0x02, 0xA0, 0x0B, 0x28, 0x48, 0xF0, 0x0A, 0x3C, 0x00, 0xA2, + 0x48, 0x3C, 0x82, 0xE0, 0x0B, 0x3C, 0x02, 0xA0, 0x6E, 0x08, 0x63, 0xE1, + 0x20, 0x07, 0x61, 0xE1, 0x0A, 0xE4, 0x6C, 0x28, 0x06, 0x3C, 0x03, 0x29, + 0x11, 0x19, 0x0B, 0x28, 0x6D, 0x3C, 0x02, 0x10, 0x0A, 0x2A, 0x56, 0xE0, + 0x0B, 0x1A, 0x11, 0x2B, 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, + 0x06, 0x3E, 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, + 0x11, 0x19, 0x0B, 0x28, 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, + 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, + 0x06, 0x3E, 0x24, 0xF0, 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, + 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, 0x06, 0x3E, 0x24, 0xF0, + 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, + 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, 0x11, 0x2B, 0x56, 0xE0, + 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, 0x06, 0x3E, 0x24, 0xF0, + 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, 0x0A, 0x1A, 0x11, 0x2B, + 0x56, 0xE0, 0x11, 0x1B, 0x06, 0x3E, 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, + 0x0B, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, 0x56, 0xE0, 0x11, 0x1B, + 0x0A, 0x2A, 0x56, 0xE0, 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, + 0x11, 0x19, 0x0B, 0x28, 0x06, 0x3E, 0x24, 0xF0, 0x0A, 0x2A, 0x56, 0xE0, + 0x0B, 0x1A, 0x11, 0x2B, 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, + 0x06, 0x3E, 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, + 0x11, 0x19, 0x0B, 0x28, 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, + 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, + 0x06, 0x3E, 0x24, 0xF0, 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, + 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, 0x06, 0x3E, 0x24, 0xF0, + 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, + 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, 0x11, 0x2B, 0x56, 0xE0, + 0x0A, 0x1A, 0x11, 0x2B, 0x92, 0xE0, 0x48, 0x28, 0x06, 0x3E, 0x24, 0xF0, + 0x62, 0xE0, 0x01, 0xA2, 0x6E, 0x08, 0x06, 0x28, 0x06, 0x3C, 0x5C, 0x3C, + 0x66, 0xE0, 0x67, 0xA2, 0x4A, 0xE0, 0x46, 0x01, 0xC1, 0xE0, 0x2E, 0xE4, + 0x08, 0xE0, 0xBB, 0xF7, 0x03, 0xA8, 0x0F, 0xAF, 0x42, 0xE0, 0xED, 0x4E, + 0xEC, 0x26, 0x3F, 0x00, 0x5C, 0x28, 0x2E, 0xE4, 0xED, 0x3C, 0xEC, 0x34, + 0x6B, 0x2A, 0xA9, 0xF0, 0x15, 0x2A, 0xAA, 0x3C, 0x2E, 0xE4, 0x5F, 0x0F, + 0x1E, 0xE4, 0x4B, 0xF0, 0x2E, 0xE4, 0x06, 0x3C, 0x5C, 0x3C, 0x2A, 0x28, + 0x6B, 0xF0, 0x6B, 0x2A, 0x8C, 0x18, 0x1E, 0xE4, 0xFA, 0x17, 0x1E, 0xE4, + 0x5F, 0x0F, 0x1E, 0xE4, 0x06, 0x3C, 0x14, 0x18, 0x1E, 0xE4, 0x2E, 0xE4, + 0x05, 0x29, 0x3C, 0x08, 0x65, 0xE1, 0x2E, 0xE4, 0x1E, 0xE4, 0x1E, 0xF0, + 0x58, 0x17, 0x18, 0xE4, 0x24, 0x08, 0xBA, 0x3C, 0x06, 0x28, 0xCD, 0x10, + 0xF0, 0x02, 0x00, 0xE0, 0x66, 0xA5, 0x00, 0xA4, 0x06, 0x4D, 0x0C, 0xAE, + 0x06, 0x29, 0x9C, 0xE0, 0x15, 0x01, 0xC2, 0xE0, 0xBA, 0x4C, 0x0C, 0xAE, + 0x63, 0xE1, 0x71, 0x01, 0xC2, 0xE0, 0x28, 0x28, 0x02, 0x29, 0x06, 0x00, + 0x62, 0xE1, 0x22, 0x08, 0xC2, 0xE0, 0x02, 0xA2, 0x2E, 0xE4, 0x03, 0x3D, + 0x11, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x10, 0x01, 0x1C, 0x01, 0xC0, 0xE0, + 0x2E, 0xE4, 0xE8, 0xF7, 0x10, 0x32, 0x04, 0xE0, 0x2E, 0xE4, 0xEA, 0xF7, + 0xC2, 0xE0, 0x00, 0x21, 0x0A, 0xE0, 0x20, 0xAE, 0x20, 0xAE, 0x10, 0x92, + 0x04, 0xE0, 0x55, 0x01, 0x58, 0x01, 0xC2, 0xE0, 0x00, 0x21, 0x0A, 0xE0, + 0x0A, 0xE0, 0x20, 0xAE, 0x00, 0x10, 0x04, 0xE0, 0xC2, 0xE0, 0x56, 0x01, + 0xC2, 0xE0, 0x00, 0x10, 0xC2, 0xE0, 0x04, 0x00, 0x04, 0xE0, 0x59, 0x01, + 0x02, 0xA2, 0x57, 0x01, 0xC2, 0xE0, 0x54, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, + 0x5A, 0x01, 0xC2, 0xE0, 0x23, 0x08, 0x63, 0xE1, 0x49, 0xF0, 0xCD, 0x10, + 0x03, 0x29, 0x22, 0x08, 0x63, 0xE1, 0x3E, 0xF0, 0x00, 0xE0, 0x4E, 0xA5, + 0x08, 0xB6, 0x18, 0xA1, 0xC2, 0xE0, 0x06, 0x29, 0x9C, 0xE0, 0x30, 0x03, + 0x71, 0x01, 0xC2, 0xE0, 0x28, 0x28, 0x70, 0x01, 0x2E, 0xE4, 0x72, 0x01, + 0xC2, 0xE0, 0x00, 0xA2, 0x28, 0xE4, 0x72, 0x28, 0x2A, 0xE4, 0x28, 0x28, + 0x03, 0x2B, 0x51, 0x08, 0x63, 0xE1, 0x02, 0xA2, 0x1E, 0x2A, 0x56, 0xE0, + 0x09, 0xA2, 0x3B, 0xF0, 0x20, 0xAE, 0x1F, 0x4C, 0x02, 0xAE, 0x16, 0xB6, + 0x4F, 0x20, 0x08, 0x01, 0xC2, 0xE0, 0x1E, 0x4C, 0x54, 0x20, 0x09, 0x01, + 0xC2, 0xE0, 0x4A, 0x4C, 0x4B, 0x20, 0x0A, 0x01, 0xC2, 0xE0, 0x00, 0xA9, + 0x4D, 0x20, 0x0B, 0x01, 0xC2, 0xE0, 0x4C, 0x4C, 0x2E, 0xE4, 0x0C, 0x01, + 0xC2, 0xE0, 0x4E, 0x4C, 0x28, 0xE4, 0x72, 0x28, 0x2A, 0xE4, 0x28, 0x28, + 0x4C, 0x3C, 0x4B, 0x34, 0x0B, 0x01, 0xC0, 0xE0, 0x4E, 0x3C, 0x4D, 0x34, + 0x0C, 0x01, 0xC0, 0xE0, 0x21, 0xAF, 0x00, 0x01, 0xC1, 0xE0, 0x2E, 0xE4, + 0x28, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, 0x03, 0xA8, 0x07, 0x2B, 0xA0, 0x01, + 0x67, 0xE1, 0x0A, 0xF1, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, 0xC3, 0xE0, + 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, 0x50, 0x01, 0x50, 0x01, 0xC2, 0xE0, + 0x08, 0xA2, 0xDA, 0xF7, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, + 0xC0, 0xE0, 0x2E, 0xE4, 0x02, 0xA8, 0x06, 0xAF, 0xC0, 0xE0, 0x58, 0xF0, + 0x80, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x44, 0x00, + 0x2E, 0xE4, 0x0E, 0xA8, 0x20, 0xAF, 0x60, 0x00, 0x03, 0xAE, 0x0D, 0xAF, + 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x56, 0xE0, + 0x07, 0xA8, 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x1B, 0xAF, 0x44, 0x00, + 0xC1, 0xE0, 0x2E, 0xE4, 0x13, 0xA2, 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, + 0xC0, 0xE0, 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, 0x28, 0xE4, 0x02, 0xA8, + 0x20, 0xAF, 0x44, 0x00, 0x2A, 0xE4, 0x60, 0xA8, 0x60, 0x00, 0xC0, 0xE0, + 0xA4, 0xCC, 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x00, 0x05, 0x00, 0xE0, + 0x18, 0xE0, 0x88, 0xC7, 0x0D, 0x04, 0xC2, 0xE0, 0x02, 0xA2, 0x9E, 0xE0, + 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x1E, 0xE4, 0x04, 0xAF, + 0xEB, 0x10, 0x1E, 0xE4, 0x0B, 0xE4, 0x00, 0x11, 0x1E, 0xE4, 0xF8, 0x10, + 0x05, 0x11, 0x1E, 0xE4, 0x1E, 0xA8, 0x36, 0x11, 0xC1, 0xE0, 0x20, 0xAE, + 0x56, 0xE0, 0x09, 0xAE, 0x56, 0xE0, 0xFF, 0x1F, 0x09, 0xE0, 0x6E, 0x00, + 0x17, 0x9F, 0x96, 0x11, 0x1E, 0xE4, 0x17, 0x9F, 0x02, 0x00, 0x22, 0xD0, + 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x47, 0x11, 0x84, 0xE1, + 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, + 0x4F, 0x11, 0x84, 0xE1, 0x2E, 0xE4, 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, + 0x05, 0xE0, 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x11, 0xD1, 0x42, 0xE0, + 0x11, 0xAE, 0x20, 0x00, 0x80, 0x01, 0x00, 0xE0, 0x5E, 0xF8, 0xD0, 0x03, + 0x12, 0xD1, 0x20, 0xCE, 0x40, 0x0B, 0x11, 0xD1, 0x29, 0xCA, 0x13, 0x01, + 0xEC, 0x88, 0xC0, 0x00, 0x94, 0xE0, 0x70, 0x28, 0x2E, 0xE4, 0xF9, 0xF7, + 0x92, 0xE0, 0x24, 0xE4, 0x02, 0xA1, 0x32, 0x28, 0x76, 0x11, 0x1E, 0xE4, + 0x0C, 0xC4, 0x49, 0xE0, 0x86, 0xC7, 0xA4, 0xCC, 0x8E, 0xF7, 0x82, 0xE0, + 0x9A, 0xE0, 0xD0, 0x03, 0x00, 0xE0, 0x18, 0xE0, 0x07, 0xAE, 0x9C, 0xE0, + 0x70, 0x07, 0x00, 0xE0, 0x1E, 0xE4, 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, + 0xF8, 0x10, 0x1E, 0xE4, 0x04, 0xAF, 0xEF, 0x10, 0x17, 0x9F, 0x42, 0xE0, + 0x85, 0xE0, 0x20, 0xAE, 0x1E, 0xE4, 0x17, 0x9F, 0x92, 0x11, 0x1E, 0xE4, + 0x51, 0x4C, 0x50, 0x20, 0x2E, 0xE4, 0xA1, 0x11, 0x51, 0x4C, 0x50, 0x20, + 0x2E, 0xE4, 0x08, 0xAE, 0x23, 0xA1, 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, + 0x08, 0xAE, 0x50, 0x4C, 0x51, 0x20, 0x39, 0xF0, 0x0D, 0x04, 0xC2, 0xE0, + 0x02, 0xA2, 0x2E, 0xE4, 0x20, 0x04, 0xC0, 0xE0, 0x0E, 0x04, 0xC2, 0xE0, + 0x02, 0x00, 0x22, 0xD0, 0xDA, 0xF7, 0x02, 0xA8, 0x15, 0x4D, 0x15, 0x21, + 0xB0, 0x11, 0x84, 0xE1, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x17, 0x9F, + 0x17, 0x9F, 0x16, 0x4D, 0x16, 0x21, 0xB7, 0x11, 0x2E, 0xE4, 0x0D, 0x04, + 0xC2, 0xE0, 0x00, 0xA2, 0x02, 0xA8, 0x20, 0xAF, 0x44, 0x00, 0xC0, 0xE0, + 0x3E, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0xA4, 0xCC, 0x0D, 0x04, + 0xC3, 0xE0, 0x03, 0xA2, 0x00, 0x05, 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, + 0x03, 0xA8, 0x20, 0x04, 0xC1, 0xE0, 0x9E, 0xE0, 0x24, 0xAF, 0x64, 0x00, + 0xC0, 0xE0, 0xDB, 0xF7, 0x1E, 0xE4, 0xF8, 0x10, 0x1E, 0xE4, 0x02, 0xA8, + 0x1E, 0xA8, 0xE0, 0x11, 0x0B, 0xE4, 0x00, 0x11, 0x56, 0xE0, 0x09, 0xAE, + 0x05, 0x11, 0x1E, 0xE4, 0x09, 0xE0, 0x61, 0x00, 0xC1, 0xE0, 0x20, 0xAE, + 0xC0, 0xE0, 0x17, 0x9F, 0x56, 0xE0, 0xFF, 0x1F, 0x50, 0x20, 0x48, 0xF0, + 0x02, 0xA8, 0x64, 0x00, 0x50, 0x4C, 0x51, 0x20, 0x3E, 0xF0, 0x51, 0x4C, + 0x6A, 0x00, 0xC0, 0xE0, 0x17, 0x9F, 0x08, 0xAE, 0x17, 0x9F, 0x6B, 0x00, + 0xC0, 0xE0, 0x17, 0x9F, 0xC0, 0xE0, 0x17, 0x9F, 0x6C, 0x00, 0xC0, 0xE0, + 0x7B, 0x00, 0xC0, 0xE0, 0x17, 0x9F, 0x7A, 0x00, 0x17, 0x9F, 0x7C, 0x00, + 0xC0, 0xE0, 0x17, 0x9F, 0x2E, 0xE4, 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, + 0x2E, 0xE4, 0x7A, 0x3C, 0x90, 0x01, 0x04, 0xE0, 0x08, 0xAE, 0xDE, 0x4C, + 0x04, 0xAE, 0x02, 0xA2, 0x21, 0xF0, 0x15, 0xA1, 0x50, 0x2A, 0xDC, 0x4C, + 0x63, 0xE1, 0x80, 0x01, 0xC2, 0xE0, 0x06, 0xA9, 0x81, 0x01, 0xC2, 0xE0, + 0x03, 0x29, 0x63, 0x08, 0x28, 0x28, 0x85, 0x01, 0xC2, 0xE0, 0xDD, 0x28, + 0x7A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0xFA, 0xF1, 0x00, 0xA4, 0x1E, 0xA1, + 0x3D, 0x28, 0x01, 0xA2, 0x00, 0xE0, 0x04, 0xAE, 0x03, 0x3C, 0x48, 0xA5, + 0x17, 0x81, 0x17, 0x81, 0x9E, 0xE0, 0x50, 0x02, 0xC2, 0xE0, 0x8A, 0x01, + 0xC2, 0xE0, 0x00, 0xA2, 0x17, 0x81, 0x8C, 0x01, 0xC2, 0xE0, 0x8B, 0x01, + 0x00, 0xA2, 0x88, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0x89, 0x01, + 0xC2, 0xE0, 0x7A, 0x4C, 0x1B, 0xF1, 0x40, 0x2A, 0x7E, 0xA8, 0x35, 0x28, + 0x03, 0xAA, 0x40, 0x2A, 0x6B, 0xF0, 0x7B, 0x2A, 0x7C, 0x2A, 0xAE, 0xF0, + 0x56, 0xE0, 0x11, 0xAE, 0x56, 0xE0, 0x11, 0xAE, 0x05, 0xA2, 0x5B, 0xF0, + 0x56, 0xE0, 0x11, 0xAE, 0x40, 0x2A, 0x4E, 0xF0, 0x06, 0x28, 0x2E, 0xE4, + 0x84, 0x01, 0xC2, 0xE0, 0x00, 0xE0, 0x48, 0xA5, 0x00, 0xA4, 0x1E, 0xA1, + 0xC2, 0xE0, 0x06, 0x29, 0x9C, 0xE0, 0x60, 0x03, 0x05, 0xE0, 0x81, 0x28, + 0x2E, 0xE4, 0x8D, 0x01, 0x81, 0x3E, 0x22, 0xF0, 0x46, 0xE0, 0x0A, 0x00, + 0x05, 0xE0, 0x48, 0xF0, 0x04, 0xA1, 0x15, 0x28, 0xC4, 0x3C, 0x00, 0xA2, + 0x81, 0x3E, 0xD0, 0x07, 0x81, 0x28, 0x8A, 0xF0, 0x08, 0xA1, 0x15, 0x28, + 0x32, 0xF0, 0x46, 0xE0, 0xC8, 0x00, 0x05, 0xE0, 0x78, 0x1B, 0x1E, 0xE4, + 0xC4, 0x3C, 0x02, 0xA2, 0x13, 0x08, 0x64, 0xE1, 0x12, 0x08, 0x63, 0xE1, + 0x16, 0x2C, 0x04, 0x3D, 0x03, 0x35, 0x00, 0xA2, 0xFF, 0xFF, 0x08, 0xE0, + 0x17, 0x7C, 0x10, 0xC7, 0x14, 0x28, 0x88, 0x3C, 0x02, 0xAF, 0x02, 0xA0, + 0x03, 0xA1, 0x14, 0x2A, 0x5B, 0xF0, 0x40, 0x2A, 0x1E, 0xE4, 0x91, 0x3C, + 0x02, 0xAE, 0x27, 0xF0, 0x80, 0x28, 0x49, 0x1A, 0x1E, 0xE4, 0x23, 0x1A, + 0x85, 0x19, 0x1E, 0xE4, 0x39, 0xF0, 0x7F, 0x2A, 0xB5, 0x1B, 0x1E, 0xE4, + 0x04, 0xA0, 0x8A, 0x3C, 0x10, 0x05, 0x63, 0xE1, 0x02, 0xA2, 0xAB, 0x3C, + 0x08, 0x86, 0x08, 0x3E, 0x03, 0xA1, 0x51, 0x2A, 0xC4, 0x28, 0xBA, 0x19, + 0x1E, 0xE4, 0x13, 0x3D, 0x38, 0xF0, 0x90, 0x28, 0xBB, 0x12, 0x18, 0xE4, + 0x63, 0xE1, 0x00, 0xA2, 0x8F, 0x3C, 0x00, 0xA2, 0x63, 0xE1, 0x02, 0xA2, + 0x03, 0x3D, 0x16, 0x08, 0x51, 0x28, 0x2E, 0xE4, 0x03, 0x3D, 0x14, 0x08, + 0x64, 0xE1, 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, 0xC6, 0x3C, 0x00, 0xA2, + 0x04, 0x3D, 0x1E, 0x08, 0x81, 0x84, 0xC8, 0x3C, 0xC7, 0x3C, 0xC5, 0x3C, + 0x02, 0xAE, 0x2B, 0xF0, 0x40, 0x2A, 0x88, 0x28, 0x04, 0x85, 0x18, 0xE0, + 0x3E, 0x1C, 0x1E, 0xE4, 0xE8, 0x03, 0x05, 0xE0, 0x3E, 0x1C, 0x1E, 0xE4, + 0x04, 0x19, 0x49, 0xE0, 0xFC, 0x1B, 0x1E, 0xE4, 0xC6, 0x3E, 0x61, 0xE0, + 0x04, 0xA2, 0x72, 0xF1, 0x08, 0xE0, 0xC6, 0x7C, 0x0F, 0xC7, 0x04, 0x29, + 0xC6, 0x84, 0xC5, 0x3C, 0x02, 0xA0, 0xFF, 0xFF, 0x66, 0xA2, 0x39, 0x3C, + 0x18, 0xE0, 0x50, 0x82, 0x38, 0x3C, 0x37, 0x3C, 0x02, 0xA2, 0x8A, 0x3C, + 0x00, 0xA2, 0x6E, 0xF0, 0x37, 0x06, 0x1E, 0xE4, 0x37, 0x06, 0x1E, 0xE4, + 0x38, 0x3C, 0x37, 0x3C, 0x02, 0xA2, 0x99, 0x3C, 0x98, 0x3C, 0x00, 0xA2, + 0x68, 0x08, 0x64, 0xE1, 0x2E, 0xE4, 0x89, 0x3C, 0xFC, 0x1B, 0x1E, 0xE4, + 0x1F, 0xA2, 0x91, 0x28, 0x14, 0x08, 0x63, 0xE1, 0x8A, 0x28, 0x08, 0x3C, + 0x47, 0x08, 0x63, 0xE1, 0xB9, 0xF0, 0x03, 0x2B, 0xFC, 0x1B, 0x1E, 0xE4, + 0x04, 0x29, 0x03, 0x2B, 0x03, 0x19, 0x69, 0x08, 0x63, 0xE1, 0x08, 0x18, + 0x67, 0xA2, 0x62, 0xE0, 0x19, 0xA2, 0xAE, 0x3C, 0x04, 0x3D, 0x00, 0xA2, + 0xAE, 0x3C, 0x66, 0xE0, 0x51, 0x28, 0x34, 0x1B, 0x1A, 0xE4, 0xC4, 0x28, + 0x63, 0xE1, 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, 0xC6, 0x28, 0x2E, 0xE4, + 0x03, 0x3D, 0x1E, 0x08, 0xBE, 0xF0, 0x9B, 0x4C, 0x9A, 0x24, 0x48, 0xF0, + 0x1E, 0xE4, 0xC6, 0x84, 0x9B, 0x4C, 0x9A, 0x24, 0x04, 0x2B, 0x1E, 0x08, + 0x64, 0xE1, 0x3E, 0x1C, 0x39, 0x08, 0x65, 0xE1, 0xFC, 0x1B, 0x1E, 0xE4, + 0x06, 0x3D, 0x05, 0x35, 0x3A, 0x08, 0x66, 0xE1, 0xA3, 0x3C, 0xA2, 0x3C, + 0x00, 0xA2, 0x2E, 0xE4, 0x9F, 0x3C, 0x9E, 0x3C, 0x95, 0x3C, 0x94, 0x3C, + 0xA9, 0x3C, 0xA8, 0x3C, 0xA7, 0x3C, 0xA6, 0x3C, 0x63, 0xE1, 0x18, 0x08, + 0x62, 0xE1, 0x92, 0x3C, 0x02, 0x3D, 0x48, 0x08, 0x64, 0xE1, 0x19, 0x08, + 0xC2, 0x3C, 0x5F, 0x3C, 0x04, 0x3D, 0x03, 0x3D, 0x05, 0x3D, 0x4A, 0x08, + 0x65, 0xE1, 0xC1, 0x3C, 0x0A, 0x3C, 0x50, 0x28, 0x0B, 0x3C, 0xFE, 0xA2, + 0x3A, 0xF0, 0xC4, 0x28, 0xEE, 0x18, 0x1E, 0xE4, 0xC7, 0x34, 0x00, 0xA2, + 0x23, 0x13, 0x1E, 0xE4, 0x63, 0xE1, 0x3D, 0x08, 0x62, 0xE1, 0xC8, 0x3C, + 0x65, 0xE1, 0x3F, 0x08, 0x64, 0xE1, 0x3E, 0x08, 0x67, 0xE1, 0x42, 0x08, + 0x66, 0xE1, 0x44, 0x08, 0x04, 0x3D, 0x03, 0x3D, 0x02, 0x3D, 0x43, 0x08, + 0xC2, 0xE0, 0x07, 0x3D, 0x06, 0x3D, 0x05, 0x3D, 0x64, 0xE1, 0x76, 0x01, + 0xC2, 0xE0, 0x58, 0x01, 0x04, 0x3D, 0x90, 0x01, 0x04, 0xE0, 0x40, 0x08, + 0x63, 0xE1, 0x28, 0x28, 0x89, 0x01, 0xC2, 0xE0, 0x76, 0x1A, 0x1E, 0xE4, + 0x03, 0x3D, 0x17, 0x08, 0x1E, 0xE4, 0x5A, 0xF0, 0x08, 0xA1, 0x15, 0x28, + 0xC0, 0xE0, 0xAC, 0x13, 0x0E, 0xE4, 0xA4, 0x1A, 0xC0, 0xE0, 0x8E, 0x3C, + 0x8D, 0x34, 0x73, 0x00, 0xC0, 0xE0, 0x99, 0x3C, 0x98, 0x34, 0x72, 0x00, + 0x5C, 0x3C, 0x7E, 0xA8, 0x18, 0xAF, 0x75, 0x00, 0xC0, 0xE0, 0x4A, 0x08, + 0x65, 0xE1, 0x3D, 0x3C, 0xC0, 0xE0, 0x05, 0x31, 0x24, 0xAF, 0x75, 0x00, + 0xC1, 0xE0, 0x7E, 0xA8, 0x28, 0xAF, 0x75, 0x00, 0x11, 0xAE, 0x7F, 0xA8, + 0x35, 0xAF, 0x75, 0x00, 0x18, 0xF0, 0x6B, 0x2A, 0x87, 0x3C, 0x56, 0xE0, + 0x9D, 0x4C, 0x9C, 0x20, 0x7B, 0xF1, 0x6B, 0x2A, 0xB7, 0x3C, 0x13, 0x1C, + 0x1E, 0xE4, 0x54, 0x2A, 0x7E, 0xA8, 0x49, 0xE0, 0x75, 0x00, 0xC0, 0xE0, + 0x7E, 0xA8, 0x0C, 0xAF, 0x4A, 0xE0, 0xB6, 0x3C, 0x3D, 0x3C, 0x5C, 0x28, + 0x4A, 0xE0, 0xB5, 0x3C, 0x6E, 0x3C, 0x03, 0x19, 0x6C, 0x08, 0x63, 0xE1, + 0x9D, 0x0C, 0x9C, 0x04, 0x99, 0x4C, 0x98, 0x24, 0xBA, 0x2A, 0xBA, 0x34, + 0x9B, 0x1C, 0x9A, 0x14, 0xB1, 0x3C, 0xB0, 0x34, 0x00, 0xA2, 0x23, 0xF0, + 0x09, 0xA1, 0x15, 0x2A, 0x8E, 0x4C, 0x8D, 0x24, 0xBA, 0x84, 0xBA, 0x3E, + 0x0F, 0xA2, 0x79, 0xF0, 0xBC, 0x34, 0x06, 0xAF, 0x3E, 0x1C, 0x1E, 0xE4, + 0xBA, 0x34, 0xB1, 0x1C, 0xB0, 0x14, 0xBD, 0x3C, 0xBD, 0x4C, 0xBC, 0x24, + 0x52, 0xF0, 0xBA, 0x28, 0xB9, 0x3C, 0x5C, 0x28, 0xB1, 0x3C, 0xB0, 0x34, + 0x8E, 0x4C, 0x8D, 0x24, 0x9A, 0xF0, 0x6B, 0x28, 0x9F, 0x3C, 0x9E, 0x34, + 0xB1, 0x1C, 0xB0, 0x14, 0x06, 0xA1, 0xAB, 0x28, 0xB9, 0x3C, 0x00, 0xA2, + 0x85, 0x3C, 0x06, 0xA0, 0xAB, 0x28, 0x84, 0x3C, 0x33, 0xF0, 0x45, 0xE0, + 0xAB, 0x2A, 0x8A, 0x28, 0xAB, 0x2A, 0x8A, 0x28, 0x85, 0x3C, 0x06, 0xA0, + 0x84, 0x3C, 0x06, 0xA1, 0x37, 0xF0, 0x45, 0xE0, 0x05, 0x2B, 0x4A, 0x08, + 0x65, 0xE1, 0x5C, 0x28, 0x03, 0x29, 0x14, 0x08, 0x63, 0xE1, 0x2E, 0xE4, + 0x18, 0x08, 0x62, 0xE1, 0x03, 0x3D, 0x00, 0xA2, 0x63, 0x00, 0xC2, 0xE0, + 0x02, 0x4D, 0x12, 0x25, 0x02, 0x3D, 0x12, 0x35, 0x37, 0x08, 0x62, 0xE1, + 0x72, 0x28, 0xF1, 0x19, 0x1B, 0xE4, 0xC4, 0x2A, 0x10, 0xC7, 0xA3, 0x4C, + 0xA2, 0x24, 0xA8, 0xF0, 0x02, 0xA0, 0xFF, 0xFF, 0x08, 0xE0, 0x54, 0x7C, + 0x19, 0xA2, 0xAB, 0x28, 0xAB, 0x3C, 0x02, 0xAF, 0xAB, 0x3C, 0x66, 0xE0, + 0x67, 0xA2, 0x62, 0xE0, 0xAB, 0x08, 0x03, 0x29, 0x68, 0x08, 0x63, 0xE1, + 0xC2, 0xE0, 0x02, 0xAE, 0xAB, 0x28, 0x03, 0x3D, 0x0A, 0xE4, 0xC4, 0x28, + 0x2E, 0xE4, 0x62, 0x00, 0x95, 0x3C, 0x94, 0x3C, 0x00, 0xA2, 0xC4, 0x14, + 0xA5, 0x3C, 0xA4, 0x3C, 0x9F, 0x3C, 0x9E, 0x3C, 0x3C, 0x08, 0x61, 0xE1, + 0xA7, 0x3C, 0xA6, 0x3C, 0x46, 0x08, 0x67, 0xE1, 0x45, 0x08, 0x62, 0xE1, + 0x63, 0xE1, 0x07, 0x3D, 0x02, 0x3D, 0x01, 0x3D, 0xC6, 0x28, 0x03, 0x3D, + 0x14, 0xA2, 0x3B, 0x08, 0xC5, 0x18, 0x02, 0xA0, 0x1A, 0x28, 0x5A, 0xF2, + 0x3A, 0x08, 0x63, 0xE1, 0x39, 0x08, 0x62, 0xE1, 0x1A, 0x84, 0x03, 0x4D, + 0x02, 0x21, 0xB4, 0xF0, 0x9B, 0x4E, 0x9A, 0x22, 0x3E, 0x1C, 0x1E, 0xE4, + 0x98, 0x20, 0x03, 0x3F, 0x02, 0x37, 0x45, 0xE0, 0x8E, 0x4E, 0x8D, 0x22, + 0x7A, 0xF0, 0x99, 0x4C, 0x6E, 0xF0, 0x4A, 0xE0, 0x45, 0xE0, 0x03, 0xAF, + 0x14, 0xE0, 0x08, 0xAF, 0x8E, 0x4C, 0x8D, 0x20, 0x42, 0xE0, 0x03, 0x4F, + 0x02, 0x23, 0x02, 0xA0, 0x49, 0xE0, 0x9D, 0x4C, 0x9C, 0x20, 0x2E, 0xF1, + 0x9B, 0x4E, 0x9A, 0x26, 0x46, 0xE0, 0x09, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, + 0x44, 0xF0, 0x46, 0xE0, 0x49, 0xE0, 0x9D, 0x4C, 0x9C, 0x24, 0x6E, 0xF0, + 0x00, 0xA2, 0x22, 0xF0, 0x46, 0xE0, 0x09, 0xAF, 0xC7, 0x24, 0x01, 0xA2, + 0xC8, 0x3C, 0xC7, 0x34, 0x03, 0xA2, 0x8A, 0xF0, 0x10, 0xAF, 0xC8, 0x4C, + 0x10, 0xAF, 0x13, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x65, 0xE1, 0x93, 0x3E, + 0x23, 0xA2, 0x2A, 0xF0, 0x00, 0xA2, 0x79, 0xF0, 0xC6, 0x2A, 0x1E, 0x08, + 0x08, 0x3C, 0x02, 0xA1, 0x05, 0x29, 0x07, 0x3C, 0x4B, 0xF0, 0x1A, 0x2A, + 0x00, 0xA2, 0xEE, 0xF0, 0x07, 0x3C, 0x18, 0xE0, 0x1A, 0x82, 0xC6, 0x84, + 0x02, 0xA1, 0x66, 0xE0, 0x05, 0x2B, 0xC6, 0x08, 0x10, 0x05, 0x04, 0xE0, + 0x08, 0x3C, 0x07, 0x18, 0x08, 0x86, 0x00, 0xA2, 0x98, 0xE0, 0x07, 0x0C, + 0x01, 0xA2, 0xA5, 0x3C, 0xA4, 0x34, 0x14, 0x0D, 0x8A, 0xF0, 0x10, 0xAF, + 0xA5, 0x4C, 0xA4, 0x20, 0x13, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, + 0xB4, 0x3E, 0x23, 0xA2, 0x2A, 0xF0, 0x10, 0xAF, 0x98, 0x22, 0x2E, 0xE4, + 0x90, 0xE1, 0x90, 0xE1, 0x2B, 0xF0, 0xC6, 0x2A, 0x49, 0xF0, 0x99, 0x4E, + 0x65, 0xE1, 0x39, 0x08, 0x64, 0xE1, 0x7E, 0xF0, 0x98, 0x04, 0x05, 0x1D, + 0x04, 0x15, 0x3A, 0x08, 0xB4, 0xF0, 0x99, 0x3C, 0x98, 0x34, 0x99, 0x0C, + 0x20, 0xF0, 0x46, 0xE0, 0x8E, 0x4E, 0x8D, 0x22, 0x98, 0x36, 0x8E, 0x4E, + 0x8D, 0x22, 0x2E, 0xE4, 0x02, 0xA0, 0x14, 0xE0, 0x2E, 0xE4, 0x99, 0x3E, + 0x09, 0x3C, 0x2F, 0x28, 0x08, 0x3C, 0x07, 0x34, 0x30, 0x3E, 0x19, 0xA2, + 0x2F, 0x3C, 0x00, 0xA2, 0x2F, 0x3C, 0x09, 0x28, 0x74, 0x1F, 0x1E, 0xE4, + 0xD1, 0x19, 0x1E, 0xE4, 0x08, 0x4C, 0x07, 0x24, 0x98, 0x34, 0x10, 0xA2, + 0x9E, 0x1F, 0x1E, 0xE4, 0x98, 0x22, 0x00, 0xA2, 0x2E, 0xE4, 0x99, 0x3C, + 0x41, 0xE0, 0x9A, 0xC8, 0x2B, 0xE4, 0x99, 0x4E, 0x3A, 0x08, 0x65, 0xE1, + 0x39, 0x08, 0x64, 0xE1, 0x23, 0xE4, 0x00, 0xA2, 0x05, 0x1F, 0x04, 0x13, + 0x2E, 0xE4, 0x4A, 0xE0, 0x13, 0xA0, 0x15, 0xE0, 0x63, 0xE1, 0x18, 0x08, + 0x62, 0xE1, 0x9A, 0xC8, 0x02, 0x35, 0x03, 0x0D, 0x02, 0x01, 0x19, 0x08, + 0x9A, 0xC8, 0x4A, 0xF0, 0xC4, 0x28, 0x03, 0x3D, 0x2E, 0xE4, 0x90, 0xE1, + 0xC7, 0x14, 0x1E, 0xE4, 0x3A, 0xF0, 0x28, 0x28, 0xBF, 0x3C, 0x8B, 0x28, + 0x10, 0xAF, 0xBF, 0x28, 0xBF, 0x3C, 0x8C, 0x28, 0x87, 0x2A, 0x62, 0xE0, + 0x07, 0xA1, 0x3D, 0x2A, 0x13, 0xE0, 0x3D, 0x1A, 0x7F, 0xA8, 0x11, 0xAF, + 0x87, 0x28, 0xBE, 0x3C, 0x10, 0xAE, 0x62, 0xE0, 0x09, 0xE0, 0xBF, 0x2A, + 0x3D, 0x08, 0x7E, 0xA8, 0x56, 0xE0, 0xBE, 0x28, 0x65, 0xE0, 0xFF, 0x00, + 0xA0, 0x10, 0x95, 0x4C, 0x94, 0x24, 0xBF, 0x3C, 0x14, 0xF2, 0xA9, 0x3C, + 0xA8, 0x34, 0xA1, 0x1C, 0xBE, 0x3C, 0x3D, 0x18, 0x7E, 0xA8, 0xBF, 0x28, + 0xB1, 0x1E, 0xB0, 0x16, 0x8E, 0x4E, 0x8D, 0x26, 0xEB, 0xF0, 0xBD, 0x3E, + 0xBC, 0x36, 0x0D, 0xAF, 0xBE, 0x84, 0x0C, 0xAF, 0xA9, 0x4C, 0xA8, 0x20, + 0xBD, 0x4E, 0xBC, 0x22, 0x3E, 0x1C, 0x1E, 0xE4, 0xFF, 0xFF, 0x08, 0xE0, + 0x13, 0x1C, 0x1E, 0xE4, 0x42, 0xE0, 0x3D, 0x2A, 0xBE, 0x28, 0x2E, 0xF0, + 0xFE, 0xF1, 0x66, 0xE0, 0x7F, 0xA8, 0xBF, 0x2A, 0x46, 0xE0, 0x3D, 0x28, + 0x11, 0xAF, 0xBF, 0x2A, 0x0D, 0xAF, 0xB1, 0x4E, 0xB0, 0x26, 0xBE, 0x3C, + 0xA8, 0x20, 0xEB, 0xF0, 0xBD, 0x3E, 0xBC, 0x36, 0x0C, 0xAF, 0x02, 0xA0, + 0x14, 0xE0, 0xA9, 0x4C, 0xBC, 0x22, 0x3E, 0x1C, 0x1E, 0xE4, 0xBE, 0x84, + 0x2E, 0xF0, 0x13, 0x1C, 0x1E, 0xE4, 0xBD, 0x4E, 0xBF, 0x28, 0x45, 0xE0, + 0x3D, 0x2A, 0xBE, 0x28, 0x5C, 0x3C, 0xB9, 0x3C, 0x62, 0xE0, 0x10, 0xAF, + 0x0B, 0x28, 0xCA, 0xF0, 0xC6, 0x28, 0x2E, 0xE4, 0x20, 0xAF, 0xC6, 0x7C, + 0x0F, 0xC7, 0xAA, 0xF0, 0x14, 0xA2, 0x3B, 0x08, 0x63, 0xE1, 0x68, 0xF0, + 0xA9, 0x4C, 0xA8, 0x20, 0x2E, 0xE4, 0x03, 0x3D, 0x95, 0x4C, 0x94, 0x24, + 0xBD, 0x3C, 0xBC, 0x34, 0xA9, 0x3C, 0xA8, 0x34, 0xA1, 0x1C, 0xA0, 0x10, + 0xBE, 0x34, 0x06, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, 0x1A, 0x28, 0xAA, 0xF0, + 0xC6, 0x28, 0xBF, 0x3C, 0x5A, 0xF0, 0xC5, 0x18, 0x07, 0x3C, 0x02, 0xA0, + 0x4E, 0xF0, 0x18, 0xE0, 0x07, 0x82, 0xC6, 0x84, 0x0B, 0x18, 0x04, 0x29, + 0x1E, 0x08, 0x64, 0xE1, 0xC7, 0x10, 0xB8, 0x4C, 0xB7, 0x20, 0x07, 0x3C, + 0x30, 0xF0, 0xBF, 0x1C, 0xBE, 0x14, 0xC8, 0x1C, 0xA9, 0x4C, 0xA8, 0x20, + 0xD5, 0x15, 0x0E, 0xE4, 0xB6, 0x4E, 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, + 0x02, 0xA2, 0x44, 0xF0, 0x46, 0xE0, 0x03, 0xAF, 0xA9, 0x4C, 0xA8, 0x20, + 0xB9, 0x3C, 0xB9, 0x08, 0x9F, 0x4E, 0x9E, 0x22, 0xBD, 0x1C, 0xBC, 0x10, + 0x46, 0xE0, 0x03, 0xAE, 0xA1, 0x1E, 0xA0, 0x12, 0x06, 0xA2, 0x3E, 0xF0, + 0x00, 0xA2, 0x30, 0xF0, 0x0E, 0xE4, 0xB9, 0x3C, 0xB9, 0x08, 0x1E, 0xF0, + 0xB7, 0x10, 0xC8, 0x4C, 0xC7, 0x20, 0x18, 0x16, 0x06, 0xE4, 0xBF, 0x1C, + 0xBE, 0x10, 0xB8, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0xA8, 0x20, 0x18, 0x16, + 0x91, 0x28, 0x18, 0x16, 0x02, 0xE4, 0xBD, 0x1C, 0x02, 0xA1, 0x28, 0x28, + 0x4A, 0xF0, 0x02, 0xA1, 0xBC, 0x10, 0xA9, 0x4C, 0xA8, 0x20, 0x88, 0xF2, + 0xA0, 0x12, 0x9F, 0x4E, 0x9E, 0x22, 0xBD, 0x1C, 0x02, 0xE4, 0x46, 0xE0, + 0x03, 0xAF, 0xA1, 0x1E, 0x14, 0x08, 0x63, 0xE1, 0x02, 0xA2, 0x00, 0x16, + 0xB9, 0x2A, 0x02, 0xA0, 0x29, 0xF0, 0x03, 0x2B, 0x18, 0x16, 0x0E, 0xE4, + 0xB9, 0x3E, 0x45, 0xE0, 0x02, 0xA1, 0xB9, 0x28, 0x68, 0xF0, 0x91, 0x28, + 0xB9, 0x28, 0x18, 0x16, 0x0E, 0xE4, 0xB9, 0x3C, 0xD6, 0xF0, 0x46, 0xE0, + 0x0B, 0xA1, 0xAB, 0x2A, 0x9E, 0xF0, 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, + 0x46, 0xE0, 0x0B, 0xA1, 0xAB, 0x2A, 0xB9, 0x28, 0xB9, 0x3C, 0x02, 0xA1, + 0xB9, 0x28, 0x46, 0xF0, 0x38, 0xF0, 0x07, 0x28, 0x3B, 0x08, 0x63, 0xE1, + 0x50, 0x82, 0x07, 0x84, 0x4E, 0xF0, 0x02, 0xA2, 0xC8, 0x4C, 0xC7, 0x24, + 0x08, 0x3C, 0x18, 0xE0, 0x1E, 0xE4, 0x08, 0x2A, 0x95, 0x1C, 0x94, 0x10, + 0x66, 0xE0, 0x17, 0xAE, 0x03, 0xA2, 0xFC, 0x1B, 0x05, 0xAF, 0x8E, 0x4E, + 0x8D, 0x26, 0x03, 0x3D, 0xB9, 0x3C, 0x66, 0xA2, 0x43, 0xF0, 0x41, 0xE0, + 0x06, 0xA0, 0xB9, 0x28, 0x42, 0xF0, 0x5E, 0xF0, 0x0B, 0xA1, 0xAB, 0x2A, + 0xB9, 0x28, 0xB9, 0x3C, 0xB9, 0x3C, 0x66, 0xE0, 0x67, 0xA2, 0x62, 0xE0, + 0xBC, 0x34, 0xA9, 0x4C, 0xA8, 0x20, 0x2E, 0xE4, 0xA0, 0x10, 0x95, 0x4C, + 0x94, 0x24, 0xBD, 0x3C, 0x9C, 0x24, 0xA9, 0x3C, 0xA8, 0x34, 0xA1, 0x1C, + 0xBF, 0x3C, 0xBE, 0x34, 0x06, 0xAF, 0x9D, 0x4C, 0x02, 0x4D, 0x12, 0x25, + 0x37, 0x08, 0x62, 0xE1, 0x9C, 0x26, 0xBB, 0x3C, 0xBA, 0x34, 0x08, 0xAF, + 0x36, 0xF0, 0x46, 0xE0, 0x09, 0xAF, 0x9D, 0x4E, 0x95, 0x4C, 0x94, 0x24, + 0xBB, 0x3E, 0xBA, 0x36, 0x15, 0x28, 0x26, 0xE4, 0xBB, 0x1C, 0xBA, 0x14, + 0x8D, 0x24, 0xC7, 0x16, 0x08, 0xE4, 0x02, 0xA1, 0xBA, 0x34, 0x99, 0x1C, + 0x98, 0x10, 0x8E, 0x4C, 0x9C, 0x14, 0xB8, 0x4C, 0xB7, 0x24, 0xBB, 0x3C, + 0x40, 0xF1, 0xBF, 0x1C, 0xBE, 0x14, 0x9D, 0x1C, 0xB7, 0x14, 0x49, 0xE0, + 0xBB, 0x4C, 0xBA, 0x24, 0x03, 0xAF, 0x9D, 0x1E, 0x9C, 0x16, 0xB8, 0x1C, + 0x8E, 0x4C, 0x8D, 0x24, 0xA4, 0xF0, 0x46, 0xE0, 0xBA, 0x10, 0xB8, 0x0C, + 0xB7, 0x00, 0x0E, 0xAF, 0xA8, 0x20, 0x0E, 0xF1, 0x20, 0xF0, 0xBB, 0x1C, + 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0x04, 0xE4, 0x46, 0xE0, + 0x03, 0xAF, 0xB6, 0x4E, 0xB9, 0x3C, 0x02, 0xA0, 0xB9, 0x28, 0x21, 0x17, + 0x9D, 0x4C, 0x9C, 0x24, 0x21, 0x17, 0x0E, 0xE4, 0xBF, 0x1C, 0xBE, 0x14, + 0xB8, 0x1C, 0xB7, 0x14, 0xA9, 0x4C, 0xA8, 0x20, 0x21, 0x17, 0x06, 0xE4, + 0x21, 0x17, 0x02, 0xE4, 0xBD, 0x1C, 0xBC, 0x10, 0x28, 0x28, 0x4A, 0xF0, + 0x02, 0xA1, 0x91, 0x28, 0x68, 0xF0, 0x91, 0x28, 0x38, 0xF1, 0x02, 0xA1, + 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, 0x0B, 0xA1, 0xAE, 0x2A, + 0xB9, 0x28, 0x21, 0x17, 0xB9, 0x28, 0x21, 0x17, 0x06, 0xE4, 0x46, 0xE0, + 0x21, 0x17, 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA1, 0x46, 0xE0, 0x03, 0xA1, + 0xAB, 0x2A, 0xB9, 0x28, 0x02, 0xA1, 0xB9, 0x28, 0x21, 0x17, 0x06, 0xE4, + 0xB7, 0x24, 0x21, 0x17, 0x0E, 0xE4, 0xB9, 0x3C, 0xBE, 0x14, 0x9D, 0x1C, + 0x9C, 0x14, 0xB8, 0x4C, 0xA9, 0x4C, 0xA8, 0x20, 0xA6, 0xF2, 0xBF, 0x1C, + 0xB6, 0x4E, 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0x21, 0x17, 0x04, 0xE4, + 0x46, 0xE0, 0x03, 0xAF, 0x28, 0x28, 0xAA, 0xF0, 0x02, 0xA1, 0x91, 0x28, + 0x40, 0x28, 0x91, 0x2A, 0x18, 0xF1, 0x02, 0xA1, 0xB1, 0xF0, 0x88, 0x1A, + 0x03, 0xAF, 0x2A, 0xF0, 0x02, 0xE4, 0x08, 0xA1, 0xAB, 0x1C, 0xB9, 0x28, + 0xB9, 0x3C, 0x02, 0xA0, 0xB9, 0x28, 0x21, 0x17, 0xAB, 0x1C, 0xB9, 0x28, + 0x21, 0x17, 0x0E, 0xE4, 0x02, 0xA0, 0xB9, 0x28, 0x02, 0xF3, 0x08, 0xA1, + 0xB7, 0x24, 0x21, 0x17, 0x0E, 0xE4, 0xB9, 0x3C, 0xBE, 0x04, 0x9D, 0x1C, + 0x9C, 0x14, 0xB8, 0x4C, 0xA9, 0x4C, 0xA8, 0x20, 0x42, 0xF2, 0xBF, 0x0C, + 0xB6, 0x4E, 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0x91, 0x28, 0xB2, 0xF1, + 0x42, 0xE0, 0x03, 0xAF, 0x02, 0xA1, 0x28, 0x28, 0x5A, 0xF0, 0x02, 0xA1, + 0xAE, 0x1C, 0xB9, 0x28, 0xDE, 0xF0, 0x2A, 0xF0, 0xAB, 0x1C, 0xB9, 0x28, + 0x06, 0xF1, 0x0E, 0xA0, 0x02, 0xA1, 0xB9, 0x28, 0xC6, 0xF0, 0x08, 0xA0, + 0xAB, 0x1C, 0xB9, 0x28, 0x8E, 0xF0, 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, + 0x46, 0xF0, 0x02, 0xA0, 0x62, 0xE0, 0x84, 0x2A, 0xB9, 0x28, 0xB9, 0x3C, + 0x2E, 0xE4, 0xB9, 0x3C, 0x66, 0xE0, 0x85, 0x2A, 0x0A, 0xF1, 0xC6, 0x28, + 0x3C, 0x08, 0x63, 0xE1, 0xC6, 0x7C, 0x0F, 0xC7, 0xEA, 0xF0, 0x0B, 0x28, + 0x5A, 0xF0, 0x0B, 0x28, 0xA8, 0xF0, 0x20, 0xAF, 0x02, 0x3D, 0x02, 0xA2, + 0x46, 0x08, 0x62, 0xE1, 0x28, 0x28, 0x2E, 0xE4, 0x03, 0x3D, 0x00, 0xA2, + 0x06, 0xAF, 0x8E, 0x4C, 0x8D, 0x24, 0xD8, 0xF0, 0xC7, 0x02, 0x95, 0x1E, + 0x94, 0x12, 0x49, 0xE0, 0x03, 0x3D, 0x04, 0xA2, 0xD3, 0xF0, 0xC8, 0x0E, + 0x04, 0xAF, 0x8E, 0x4C, 0x8D, 0x24, 0x2E, 0xE4, 0xC7, 0x02, 0x95, 0x1E, + 0x94, 0x12, 0x49, 0xE0, 0x03, 0x3D, 0x00, 0xA2, 0x45, 0xF0, 0xC8, 0x0E, + 0x2E, 0xE4, 0x03, 0x3D, 0x06, 0xA2, 0x2E, 0xE4, 0x09, 0x3E, 0x08, 0x3E, + 0x07, 0x3E, 0x01, 0xA2, 0xFF, 0xFF, 0x04, 0xE0, 0xFA, 0xF0, 0x04, 0xA1, + 0x08, 0x3C, 0xFF, 0xFF, 0x00, 0xE0, 0x20, 0xAE, 0x09, 0x3C, 0x04, 0xA2, + 0x07, 0x3C, 0x06, 0xA2, 0x6E, 0xF1, 0x14, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x07, 0x3C, 0x06, 0xA2, 0x08, 0x3C, 0x7A, 0x28, 0xC2, 0xE0, 0x06, 0xA2, + 0x09, 0x3C, 0x04, 0xA2, 0x23, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x14, 0x01, + 0x0A, 0xE0, 0x20, 0xAE, 0x22, 0x22, 0x04, 0xE0, 0xC2, 0xE0, 0x22, 0x01, + 0xC2, 0xE0, 0x22, 0x22, 0x63, 0xE1, 0x3D, 0x08, 0x62, 0xE1, 0x21, 0x01, + 0x04, 0x29, 0x3F, 0x08, 0x64, 0xE1, 0x3E, 0x08, 0x04, 0x3D, 0x03, 0x29, + 0x58, 0x01, 0xC2, 0xE0, 0x02, 0x3D, 0x07, 0x28, 0x03, 0x3D, 0x02, 0x29, + 0xC2, 0xE0, 0x03, 0x29, 0x40, 0x08, 0x63, 0xE1, 0x62, 0xE1, 0x03, 0x3D, + 0x08, 0x28, 0x89, 0x01, 0x03, 0x29, 0x43, 0x08, 0x63, 0xE1, 0x42, 0x08, + 0x03, 0x3D, 0x02, 0x29, 0x76, 0x01, 0xC2, 0xE0, 0x62, 0xE1, 0x2E, 0xE4, + 0x02, 0x3D, 0x09, 0x28, 0x64, 0xE1, 0x3E, 0x08, 0x63, 0xE1, 0x3D, 0x08, + 0x58, 0x01, 0xC2, 0xE0, 0x04, 0x29, 0x3F, 0x08, 0x03, 0x3D, 0x02, 0x29, + 0x04, 0x3D, 0x03, 0x29, 0x42, 0x08, 0x62, 0xE1, 0x02, 0x3D, 0x00, 0xA2, + 0xC2, 0xE0, 0x03, 0x29, 0x43, 0x08, 0x63, 0xE1, 0x00, 0xA2, 0x03, 0x3D, + 0x02, 0x29, 0x76, 0x01, 0x03, 0x29, 0x40, 0x08, 0x63, 0xE1, 0x02, 0x3D, + 0x03, 0x3D, 0x7A, 0x28, 0x89, 0x01, 0xC2, 0xE0, 0x05, 0x29, 0x66, 0x08, + 0x65, 0xE1, 0x2E, 0xE4, 0x15, 0x28, 0xB6, 0x1A, 0x1E, 0xE4, 0x2A, 0xE4, + 0x1C, 0x15, 0x1E, 0xE4, 0x48, 0xF0, 0x08, 0xA1, 0x1E, 0xE4, 0x6A, 0xF0, + 0xC4, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, 0x28, 0x17, 0x1E, 0xE4, 0x81, 0x15, + 0xA8, 0x20, 0x2E, 0xE4, 0x41, 0x16, 0x1E, 0xE4, 0x1E, 0xE4, 0xB6, 0x84, + 0x02, 0xF1, 0xA9, 0x4C, 0xB1, 0x4E, 0xB0, 0x26, 0x12, 0xE0, 0x3E, 0x1C, + 0x13, 0x1C, 0x1E, 0xE4, 0x03, 0xA2, 0x29, 0xF0, 0x62, 0xE0, 0x13, 0xE0, + 0xB6, 0x2A, 0x12, 0xE0, 0x3E, 0x1C, 0x1E, 0xE4, 0xB5, 0x84, 0xCE, 0xF0, + 0x03, 0xA2, 0x29, 0xF0, 0x9F, 0x4E, 0x9E, 0x26, 0x66, 0xE0, 0xB5, 0x2A, + 0x13, 0x1C, 0x1E, 0xE4, 0x92, 0x1C, 0x54, 0x2C, 0x2E, 0xE4, 0xB9, 0x3C, + 0x68, 0xF0, 0x0A, 0x28, 0x10, 0x18, 0x06, 0xE4, 0x18, 0xE4, 0x05, 0x29, + 0x66, 0x08, 0x65, 0xE1, 0x5C, 0x3C, 0xB9, 0x08, 0x5C, 0x28, 0xDB, 0x17, + 0x06, 0x3C, 0x5C, 0x3C, 0xB5, 0x1B, 0x1E, 0xE4, 0xA3, 0x3C, 0xA2, 0x34, + 0xA3, 0x0C, 0xA2, 0x04, 0x2E, 0xE4, 0x92, 0x3C, 0x02, 0xA0, 0x92, 0x2C, + 0x20, 0xAF, 0x90, 0x7C, 0x0F, 0xC7, 0x92, 0x2C, 0x0A, 0x28, 0x03, 0x3D, + 0x48, 0x08, 0x63, 0xE1, 0x29, 0xF0, 0x45, 0xE0, 0x50, 0x2E, 0x02, 0xA0, + 0x0B, 0x28, 0x48, 0xF0, 0x0A, 0x3C, 0x00, 0xA2, 0x92, 0x1C, 0x54, 0x2C, + 0x0B, 0x3C, 0x02, 0xA0, 0x08, 0xA1, 0x15, 0x28, 0x87, 0x18, 0x06, 0xE4, + 0x1A, 0xE4, 0x0A, 0x28, 0x47, 0x18, 0x08, 0xE4, 0x1D, 0x28, 0x5C, 0x3C, + 0xB9, 0x28, 0xC5, 0x17, 0x1E, 0xE4, 0x5C, 0x28, 0x12, 0x1B, 0x18, 0xE4, + 0x27, 0x08, 0x63, 0xE1, 0x5C, 0x3C, 0xB5, 0x1B, 0x03, 0x3D, 0x26, 0x08, + 0x63, 0xE1, 0x03, 0x3D, 0xA2, 0x34, 0xA3, 0x0C, 0xA2, 0x04, 0xB9, 0x28, + 0x7F, 0x28, 0x87, 0x18, 0x0E, 0xE4, 0xA3, 0x3C, 0xC4, 0x28, 0x0A, 0xF3, + 0x28, 0x28, 0x3A, 0xF0, 0xC5, 0x17, 0x1A, 0xE4, 0x0A, 0x28, 0xEA, 0xF0, + 0x3A, 0xF0, 0x02, 0x29, 0x46, 0x08, 0x62, 0xE1, 0x3C, 0x08, 0x63, 0xE1, + 0xA3, 0x17, 0x1E, 0xE4, 0x4A, 0xF0, 0xC4, 0x28, 0xC8, 0xF1, 0x03, 0x29, + 0x63, 0xE1, 0x6E, 0xF0, 0x28, 0xF0, 0xC6, 0x28, 0x77, 0x18, 0x08, 0xE4, + 0x03, 0x29, 0x14, 0x08, 0x1A, 0xE4, 0x0A, 0x28, 0x48, 0xF0, 0xC4, 0x28, + 0x58, 0xF0, 0x06, 0xA1, 0x8F, 0x28, 0xC5, 0x17, 0x88, 0xF0, 0x03, 0x29, + 0x48, 0x08, 0x63, 0xE1, 0x12, 0x1B, 0x1E, 0xE4, 0x4A, 0xF0, 0x1D, 0x28, + 0xC4, 0x28, 0x5C, 0x3C, 0xB9, 0x28, 0x3E, 0xF0, 0xC1, 0x1B, 0x1E, 0xE4, + 0xD8, 0x18, 0x18, 0xE4, 0x5C, 0x3C, 0xB5, 0x1B, 0x1E, 0xE4, 0x5C, 0x28, + 0xA2, 0x04, 0xB9, 0x28, 0xE7, 0x1B, 0x1E, 0xE4, 0x92, 0x2C, 0xA3, 0x3C, + 0xA2, 0x34, 0xA3, 0x0C, 0x2E, 0xE4, 0x03, 0x29, 0x92, 0x3C, 0x02, 0xA0, + 0x05, 0xA1, 0x55, 0x2A, 0xAA, 0xF0, 0x6B, 0x28, 0x5F, 0x08, 0xA9, 0x4C, + 0xA8, 0x20, 0x75, 0xF0, 0x94, 0x24, 0xA9, 0x3C, 0xA8, 0x34, 0xB7, 0x18, + 0x95, 0x3C, 0x94, 0x34, 0x5F, 0x0C, 0x95, 0x4C, 0x92, 0x1C, 0x06, 0xA0, + 0x54, 0x2C, 0x2E, 0xE4, 0x73, 0x01, 0xC0, 0xE0, 0xD7, 0x18, 0x06, 0xE4, + 0x50, 0x18, 0xC1, 0x3C, 0x02, 0xA0, 0xC1, 0x28, 0x66, 0xE1, 0x8A, 0xF1, + 0xC4, 0x28, 0x28, 0xE4, 0x65, 0xE1, 0x88, 0xF0, 0x06, 0x29, 0x45, 0x08, + 0x02, 0xA2, 0x0A, 0xF1, 0x05, 0x29, 0x3C, 0x08, 0x10, 0x05, 0x04, 0xE0, + 0xDE, 0xF0, 0x06, 0x3D, 0x04, 0xE0, 0x96, 0xE0, 0x02, 0xA1, 0xC2, 0x08, + 0x03, 0x29, 0x98, 0xE0, 0xC2, 0x08, 0x10, 0x05, 0x10, 0x05, 0x04, 0xE0, + 0x1E, 0xF1, 0x04, 0x3D, 0x72, 0x01, 0xC0, 0xE0, 0x96, 0xE0, 0xC2, 0x08, + 0x08, 0xE0, 0x10, 0xAF, 0x80, 0x00, 0x00, 0xE0, 0xFC, 0x1B, 0x1E, 0xE4, + 0x50, 0x2A, 0xFF, 0xFF, 0x02, 0xA0, 0xC2, 0x28, 0x03, 0x3D, 0x00, 0xA4, + 0x2E, 0xE4, 0xC1, 0x3E, 0x01, 0xA2, 0xC2, 0x3C, 0x2C, 0x01, 0x03, 0xE0, + 0x5F, 0x2A, 0x5C, 0x28, 0x05, 0x2B, 0x3B, 0x08, 0x65, 0xE1, 0xE7, 0xF0, + 0xB9, 0x28, 0x83, 0xF0, 0x64, 0x00, 0x03, 0xE0, 0xB9, 0x3C, 0x66, 0xE0, + 0x67, 0xA2, 0x02, 0xA0, 0x66, 0xE0, 0x67, 0xA2, 0x0C, 0xA0, 0x5C, 0x28, + 0x08, 0xA1, 0x15, 0x28, 0x2E, 0xE4, 0x5C, 0x3C, 0x9C, 0x34, 0x70, 0x00, + 0xC0, 0xE0, 0x78, 0xF0, 0xC4, 0x28, 0x77, 0x19, 0x0E, 0xE4, 0x9D, 0x3C, + 0x62, 0xE1, 0x68, 0xF0, 0x28, 0x28, 0x88, 0xF0, 0x3E, 0xF0, 0x02, 0x4F, + 0x12, 0x27, 0x10, 0x08, 0xBB, 0x3E, 0xBA, 0x36, 0x9B, 0x4E, 0x9A, 0x26, + 0xC8, 0x00, 0x04, 0xE0, 0x8E, 0x4E, 0x8D, 0x26, 0x03, 0xA0, 0x46, 0xF0, + 0x81, 0x18, 0x02, 0xAE, 0x07, 0xAF, 0x09, 0xA0, 0x3E, 0xF0, 0x03, 0xAF, + 0x89, 0x2A, 0x46, 0xE0, 0x99, 0x4C, 0x98, 0x20, 0xFC, 0x1B, 0x1E, 0xE4, + 0x12, 0xE0, 0x62, 0xF0, 0xFC, 0x1B, 0x1E, 0xE4, 0x1D, 0x19, 0x0E, 0xE4, + 0x42, 0xE0, 0xBB, 0x4E, 0xBA, 0x26, 0x12, 0xE0, 0x65, 0xE1, 0x90, 0xF0, + 0xAB, 0xF0, 0x28, 0x2A, 0x03, 0xA2, 0x59, 0xF0, 0x05, 0x2B, 0x6D, 0x08, + 0x22, 0xF0, 0x05, 0x3F, 0x4A, 0x08, 0x65, 0xE1, 0x28, 0x2A, 0x9D, 0x3C, + 0x9C, 0x34, 0x00, 0xA2, 0x15, 0x2A, 0xC9, 0xF0, 0xC4, 0x2A, 0xD9, 0xF1, + 0x8D, 0x26, 0x89, 0xF0, 0x03, 0xA1, 0x03, 0xA8, 0x66, 0xE0, 0x99, 0x1E, + 0x98, 0x16, 0x8E, 0x4E, 0x4B, 0x08, 0x65, 0xE1, 0x9D, 0x3C, 0x9C, 0x34, + 0x4C, 0x08, 0x66, 0xE1, 0xCB, 0xF0, 0x05, 0x2B, 0x07, 0x4D, 0x06, 0x25, + 0x4D, 0x08, 0x67, 0xE1, 0x9C, 0x34, 0x66, 0xE0, 0x9D, 0x4E, 0x9C, 0x22, + 0x77, 0x19, 0x09, 0xE4, 0xC4, 0x2A, 0x9D, 0x3C, 0x9C, 0x20, 0xB9, 0xF1, + 0x03, 0xA1, 0x15, 0x2A, 0x49, 0xE0, 0x99, 0x0C, 0x98, 0x00, 0x9D, 0x4C, + 0x9A, 0x24, 0x62, 0xF0, 0x9B, 0x1C, 0x9A, 0x14, 0x9E, 0xF0, 0x9D, 0x3C, + 0x9C, 0x34, 0x9B, 0x4C, 0x8E, 0x1E, 0x8D, 0x16, 0x9D, 0x4C, 0x9C, 0x20, + 0x9D, 0x3C, 0x9C, 0x34, 0x46, 0xE0, 0x47, 0xF0, 0x9D, 0x3C, 0x9C, 0x34, + 0x62, 0xE0, 0x03, 0xA2, 0xBA, 0x26, 0x9D, 0x4C, 0x9C, 0x20, 0xBE, 0xF0, + 0x07, 0xAF, 0x66, 0xE0, 0x03, 0xAE, 0xBB, 0x4E, 0x01, 0xA2, 0x9D, 0x3C, + 0x9C, 0x34, 0x62, 0xE0, 0x8A, 0xF0, 0x10, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, + 0x13, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0x93, 0x3E, 0x23, 0xA2, + 0x2A, 0xF0, 0x10, 0xAF, 0x2A, 0xF0, 0x40, 0x28, 0x88, 0x2A, 0x2E, 0xE4, + 0x48, 0xF0, 0x91, 0x28, 0x09, 0x3E, 0x03, 0xAE, 0x09, 0x18, 0xAE, 0xF0, + 0x08, 0x3E, 0x03, 0xA2, 0x5E, 0xF0, 0x08, 0x3E, 0x01, 0xA2, 0x46, 0xF0, + 0x08, 0x3C, 0x91, 0x7C, 0x0F, 0xC7, 0x09, 0x28, 0x03, 0xAF, 0x2A, 0xF0, + 0x40, 0x28, 0x53, 0x2E, 0xFC, 0x1B, 0x1E, 0xE4, 0x83, 0x4C, 0x82, 0x20, + 0xA5, 0xCC, 0x08, 0x1A, 0x09, 0x2A, 0x14, 0xAE, 0x02, 0xAE, 0x42, 0xE0, + 0x19, 0xE0, 0x8D, 0xC7, 0xFC, 0x1B, 0x1E, 0xE4, 0x09, 0x0A, 0x08, 0x2A, + 0x1E, 0xA4, 0x48, 0xA0, 0x12, 0xE0, 0x0A, 0xAF, 0x83, 0x4C, 0x82, 0x24, + 0x2E, 0xE4, 0x46, 0xA5, 0x8D, 0x34, 0x3E, 0x1C, 0x1E, 0xE4, 0x81, 0x84, + 0x83, 0x4C, 0x82, 0x24, 0x2E, 0xE4, 0x8E, 0x3C, 0x8D, 0x34, 0x3E, 0x1C, + 0x1E, 0xE4, 0x81, 0x84, 0xC8, 0x00, 0x04, 0xE0, 0x81, 0x2A, 0x8E, 0x3C, + 0x8E, 0x4C, 0x8D, 0x24, 0x45, 0xE0, 0x02, 0xAE, 0x3E, 0xF0, 0x02, 0xAF, + 0x02, 0xA0, 0x43, 0xF0, 0x99, 0x3C, 0x98, 0x34, 0x06, 0xAF, 0x08, 0xA0, + 0x2A, 0xE4, 0x06, 0xAF, 0x08, 0xA0, 0x2E, 0xE4, 0xBA, 0x34, 0xCE, 0xF0, + 0xBB, 0x3C, 0xBA, 0x34, 0x03, 0xA1, 0xFF, 0xFF, 0x05, 0xE0, 0xBB, 0x3C, + 0x04, 0xE0, 0xE1, 0x19, 0x84, 0xE1, 0x45, 0xCC, 0xBB, 0x4C, 0xBA, 0x24, + 0x8E, 0xBA, 0xFF, 0x00, 0xBA, 0x26, 0x10, 0xF7, 0xFF, 0xFF, 0x02, 0xE0, + 0x84, 0xE1, 0x45, 0xCC, 0x03, 0xA1, 0xBB, 0x4E, 0x8E, 0xBA, 0xFF, 0x00, + 0x04, 0xE0, 0xEF, 0x19, 0x9A, 0x14, 0x99, 0x0C, 0x98, 0x04, 0x2E, 0xE4, + 0x15, 0x2A, 0x99, 0x3C, 0x98, 0x34, 0x9B, 0x1C, 0x63, 0xE1, 0x89, 0xF2, + 0x03, 0xA1, 0x03, 0xA8, 0x98, 0x20, 0x13, 0x08, 0x64, 0xE1, 0x12, 0x08, + 0x03, 0x35, 0x10, 0xE0, 0x72, 0xF0, 0x99, 0x4C, 0x99, 0x3E, 0x98, 0x3E, + 0x01, 0xA2, 0x04, 0x3D, 0x7A, 0xF1, 0x05, 0x29, 0x49, 0x08, 0x65, 0xE1, + 0x2F, 0x28, 0x4A, 0xF1, 0x04, 0x4D, 0x03, 0x25, 0x19, 0xA2, 0x2F, 0x3C, + 0x00, 0xA2, 0x09, 0x3C, 0x09, 0x28, 0x74, 0x1F, 0x1E, 0xE4, 0x30, 0x3E, + 0x1E, 0xE4, 0x04, 0x4D, 0x03, 0x25, 0x2F, 0x3C, 0x00, 0xA2, 0x9E, 0x1F, + 0x1E, 0xE4, 0xD1, 0x19, 0x16, 0x2E, 0x2E, 0xE4, 0x04, 0x3D, 0x03, 0x35, + 0x18, 0xE0, 0x30, 0x75, 0x82, 0xE1, 0x17, 0x84, 0x08, 0x3C, 0x13, 0x1C, + 0x1E, 0xE4, 0x02, 0xAE, 0x09, 0x84, 0x09, 0x3C, 0x10, 0xAF, 0x08, 0x2C, + 0x3E, 0x1C, 0x1E, 0xE4, 0x83, 0x4C, 0x82, 0x24, 0x08, 0xE0, 0x08, 0x2C, + 0x49, 0xE0, 0x10, 0xAE, 0x82, 0x24, 0x09, 0x84, 0x09, 0x3C, 0xFF, 0x00, + 0x42, 0xE0, 0x3E, 0x1C, 0x1E, 0xE4, 0x83, 0x4C, 0x40, 0x2A, 0xFC, 0x1B, + 0x1E, 0xE4, 0x79, 0xA2, 0x9B, 0x3C, 0x9A, 0x34, 0x02, 0xAF, 0x2B, 0xF0, + 0x2A, 0xF0, 0x40, 0x28, 0x88, 0x2A, 0x2E, 0xE4, 0x46, 0xE0, 0xAA, 0xF0, + 0x91, 0x28, 0x03, 0xAE, 0x91, 0x7C, 0x0F, 0xC7, 0x4A, 0xE0, 0x82, 0xF0, + 0x3E, 0xF0, 0x08, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x83, 0x4C, 0x82, 0x24, + 0x08, 0x3C, 0x02, 0xA2, 0xFF, 0xFF, 0x08, 0xE0, 0x08, 0x7C, 0x0F, 0xC7, + 0x63, 0xE1, 0x10, 0x08, 0x62, 0xE1, 0x14, 0xAE, 0x65, 0xE1, 0x03, 0x3D, + 0x02, 0x35, 0x11, 0x08, 0x66, 0xE1, 0x2B, 0xE4, 0x05, 0x2B, 0x4B, 0x08, + 0x06, 0x27, 0x4D, 0x08, 0x67, 0xE1, 0x4C, 0x08, 0x02, 0x37, 0x26, 0xE4, + 0x46, 0xE0, 0x07, 0x4F, 0x63, 0xE1, 0x00, 0xA2, 0x2E, 0xE4, 0x03, 0x3F, + 0x04, 0x2B, 0x1E, 0x08, 0x64, 0xE1, 0x10, 0x05, 0x13, 0x0D, 0x08, 0x86, + 0x08, 0x3E, 0x03, 0xA1, 0x03, 0xAF, 0x04, 0x2B, 0xA5, 0x3C, 0xA4, 0x34, + 0xFC, 0x1B, 0x1E, 0xE4, 0x04, 0x2B, 0x42, 0xE0, 0x02, 0xA2, 0xC8, 0xF0, + 0x28, 0x28, 0xC0, 0x3C, 0x03, 0xA1, 0x04, 0x2B, 0x10, 0x05, 0x63, 0xE1, + 0x04, 0x29, 0x13, 0x3D, 0x08, 0x86, 0x08, 0x3E, 0xA4, 0x20, 0x01, 0xA2, + 0xA5, 0x3C, 0xA4, 0x34, 0x03, 0xA2, 0x8A, 0xF0, 0x10, 0xAF, 0xA5, 0x4C, + 0x10, 0xAF, 0x13, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x2E, 0xE4, 0xB4, 0x3E, + 0x23, 0xA2, 0x2A, 0xF0, 0x14, 0x08, 0x63, 0xE1, 0xD8, 0xF0, 0x28, 0x28, + 0x8E, 0xF0, 0x8A, 0x28, 0x3A, 0xF0, 0x03, 0x29, 0x4E, 0xF0, 0x8A, 0x28, + 0x3B, 0xF0, 0x7F, 0x2A, 0x5C, 0x3C, 0xAB, 0x28, 0x2E, 0xF0, 0xAE, 0x28, + 0x4A, 0xF0, 0xC4, 0x28, 0x2E, 0xE4, 0xB9, 0x3C, 0x9C, 0x24, 0x3E, 0xF0, + 0xC8, 0x4C, 0xC7, 0x24, 0x95, 0x0C, 0x94, 0x04, 0x49, 0xE0, 0x9D, 0x4C, + 0xB8, 0x3C, 0xB7, 0x34, 0x9F, 0x1C, 0x9E, 0x14, 0x9F, 0x4C, 0x9E, 0x24, + 0x09, 0x3E, 0x93, 0x5E, 0x10, 0x05, 0x04, 0xE0, 0xA1, 0x3C, 0xA0, 0x34, + 0x4A, 0xE0, 0x03, 0x2B, 0x96, 0xE0, 0x0B, 0x0C, 0xA7, 0x3E, 0xA6, 0x36, + 0xA7, 0x0E, 0xA6, 0x06, 0x10, 0xAF, 0xA7, 0x4C, 0xA6, 0x24, 0x01, 0xA2, + 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0x8A, 0xF0, 0x23, 0xA2, 0x2A, 0xF0, + 0x10, 0xAF, 0x13, 0xA2, 0xA7, 0x4C, 0xA6, 0x24, 0x09, 0x84, 0x08, 0x3E, + 0x18, 0xE0, 0x09, 0x82, 0x09, 0x3C, 0x08, 0x5C, 0x1E, 0xE4, 0xB4, 0x5E, + 0xA5, 0x4E, 0xA4, 0x26, 0x09, 0x3E, 0x08, 0x1A, 0xB4, 0x2A, 0xFC, 0x1B, + 0x9F, 0x3C, 0x9E, 0x34, 0x93, 0x58, 0x09, 0x5C, 0xB6, 0x3C, 0xB5, 0x34, + 0xA1, 0x1C, 0xA0, 0x14, 0xA4, 0xF0, 0x08, 0xA0, 0x55, 0x2C, 0x2E, 0xE4, + 0x0F, 0xAF, 0x4A, 0xE0, 0x46, 0x01, 0xC1, 0xE0, 0x3F, 0x00, 0x08, 0xE0, + 0xBB, 0xF7, 0x03, 0xA8, 0xBB, 0x3C, 0x24, 0xA1, 0x24, 0xA2, 0x2E, 0xF0, + 0x02, 0xAF, 0x18, 0xE0, 0xAF, 0x82, 0xBB, 0x84, 0x13, 0xE0, 0xAD, 0x2A, + 0x66, 0xE0, 0xAD, 0x2A, 0x33, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x62, 0xE0, + 0xAD, 0x08, 0xB9, 0x28, 0x39, 0xF0, 0xC4, 0x2A, 0xA4, 0xF0, 0x08, 0xA0, + 0x55, 0x2C, 0xBA, 0x3C, 0x0F, 0xAF, 0x4A, 0xE0, 0x46, 0x01, 0xC1, 0xE0, + 0x3F, 0x00, 0x08, 0xE0, 0xBB, 0xF7, 0x03, 0xA8, 0xBB, 0x3C, 0x24, 0xA1, + 0x24, 0xA2, 0x2E, 0xF0, 0x02, 0xAF, 0x18, 0xE0, 0xAF, 0x82, 0xBB, 0x84, + 0x62, 0xE0, 0xAD, 0x1A, 0xB9, 0x2A, 0xB9, 0x08, 0x2E, 0xE4, 0x5C, 0x3C, + 0x66, 0xE0, 0xBA, 0x2A, 0x18, 0xF1, 0x03, 0x29, 0x1A, 0x08, 0x63, 0xE1, + 0x04, 0xAF, 0x49, 0xE0, 0x6A, 0xF0, 0x91, 0x28, 0x40, 0xA2, 0x3E, 0xF0, + 0x89, 0x3C, 0x42, 0xE0, 0x4A, 0xF0, 0x02, 0xA1, 0x15, 0x28, 0x89, 0x3C, + 0x2E, 0xE4, 0x89, 0x3C, 0x80, 0x00, 0x04, 0xE0, 0x89, 0x3C, 0x03, 0x29, + 0x1B, 0x08, 0x63, 0xE1, 0x09, 0xE0, 0x49, 0xE0, 0x8B, 0x28, 0x2E, 0xE4, + 0xFF, 0x00, 0x08, 0xE0, 0x69, 0xF0, 0x00, 0x40, 0x49, 0xE0, 0x56, 0xE0, + 0x00, 0x0C, 0x05, 0xE0, 0x08, 0xE0, 0x59, 0xF0, 0x40, 0x00, 0x09, 0xE0, + 0x08, 0xE0, 0x56, 0xE0, 0x67, 0xA2, 0x00, 0x3F, 0x49, 0xE0, 0x8C, 0x28, + 0x8B, 0x3C, 0x3F, 0x3F, 0x08, 0xE0, 0x69, 0xF0, 0x00, 0x40, 0x09, 0xE0, + 0x56, 0xE0, 0x00, 0x0C, 0x05, 0xE0, 0xFF, 0x00, 0x59, 0xF0, 0x40, 0x00, + 0x09, 0xE0, 0x49, 0xE0, 0x56, 0xE0, 0x67, 0xA2, 0x00, 0x3F, 0x08, 0xE0, + 0x2E, 0xE4, 0x8C, 0x3C, 0x3F, 0x3F, 0x08, 0xE0, 0x00, 0x40, 0x09, 0xE0, + 0x49, 0xE0, 0x8B, 0x28, 0x05, 0xE0, 0xFF, 0x00, 0x08, 0xE0, 0x69, 0xF0, + 0x09, 0xE0, 0x49, 0xE0, 0x56, 0xE0, 0x00, 0x0C, 0x00, 0x3F, 0x08, 0xE0, + 0x59, 0xF0, 0x40, 0x00, 0x3F, 0x3F, 0x08, 0xE0, 0x56, 0xE0, 0x67, 0xA2, + 0x09, 0xE0, 0x49, 0xE0, 0x8C, 0x28, 0x8B, 0x3C, 0xFF, 0x00, 0x08, 0xE0, + 0x69, 0xF0, 0x00, 0x40, 0x49, 0xE0, 0x56, 0xE0, 0x00, 0x0C, 0x05, 0xE0, + 0x08, 0xE0, 0x59, 0xF0, 0x40, 0x00, 0x09, 0xE0, 0x08, 0xE0, 0x56, 0xE0, + 0x67, 0xA2, 0x00, 0x3F, 0x49, 0xE0, 0x87, 0x28, 0x8C, 0x3C, 0x3F, 0x3F, + 0x08, 0xE0, 0x39, 0xF0, 0x00, 0x40, 0x09, 0xE0, 0x40, 0x00, 0x09, 0xE0, + 0x49, 0xE0, 0xFF, 0x00, 0x67, 0xA2, 0x00, 0x3F, 0x08, 0xE0, 0x59, 0xF0, + 0x87, 0x3C, 0x3F, 0x3F, 0x08, 0xE0, 0x56, 0xE0, 0x8B, 0x2A, 0x39, 0xF0, + 0x28, 0x2A, 0x2E, 0xE4, 0x11, 0xAF, 0xBB, 0x3E, 0x8C, 0x2A, 0x2E, 0xF0, + 0x66, 0xE0, 0x7F, 0xA8, 0xBB, 0x2A, 0x62, 0xE0, 0x2A, 0xE4, 0xAA, 0x18, + 0x5C, 0x28, 0x2E, 0xE4, 0x08, 0x3C, 0x10, 0xAF, 0x49, 0xE0, 0x87, 0x28, + 0x5C, 0x28, 0x09, 0x3E, 0x3F, 0x00, 0x09, 0xE0, 0x5C, 0x18, 0xAA, 0x28, + 0xF0, 0xF0, 0xAA, 0x18, 0x45, 0xE0, 0xAA, 0x2A, 0x62, 0xE0, 0x08, 0x2A, + 0x66, 0xE0, 0x09, 0x2A, 0x46, 0xE0, 0xAA, 0x28, 0x2E, 0xE4, 0x5C, 0x3E, + 0x45, 0xE0, 0xAA, 0x2A, 0x42, 0xE0, 0xAA, 0x2A, 0x62, 0xE0, 0x08, 0x2A, + 0xAA, 0x2A, 0x66, 0xE0, 0x09, 0x2A, 0xAA, 0x18, 0x8F, 0x28, 0x2E, 0xE4, + 0x5C, 0x3E, 0x41, 0xE0, 0x03, 0x29, 0x48, 0x08, 0x63, 0xE1, 0xCA, 0xF0, + 0x03, 0x29, 0x26, 0x08, 0x63, 0xE1, 0x8A, 0xF0, 0x2E, 0xE4, 0x03, 0x3D, + 0x27, 0x08, 0x63, 0xE1, 0x03, 0x3D, 0x26, 0x08, 0x63, 0xE1, 0x5C, 0x28, + 0x2E, 0xE4, 0x03, 0x3D, 0x27, 0x08, 0x63, 0xE1, 0x12, 0xE0, 0x32, 0xF0, + 0x01, 0xA2, 0xCA, 0x3E, 0x20, 0xAF, 0xCB, 0x3C, 0xCE, 0x3E, 0x03, 0xA2, + 0x20, 0xAF, 0xCC, 0x3C, 0xCA, 0x7C, 0x0F, 0xC7, 0xCA, 0x7C, 0x0F, 0xC7, + 0xCB, 0x4C, 0x20, 0xAE, 0xCE, 0x2A, 0xCD, 0x4C, 0xCC, 0x20, 0xCD, 0x3C, + 0xCA, 0x36, 0x2E, 0xE4, 0x12, 0xE0, 0x2B, 0xE4, 0xCA, 0x22, 0xCC, 0x3E, + 0x01, 0xA2, 0xCB, 0x3E, 0x61, 0xF0, 0x45, 0xE0, 0xCC, 0x5A, 0xCB, 0x4E, + 0x21, 0xA1, 0xCC, 0x3E, 0x03, 0xA0, 0xCC, 0x2A, 0x00, 0xA2, 0x39, 0xF0, + 0xCC, 0x2A, 0x75, 0xF7, 0x45, 0xCC, 0xCC, 0x3E, 0x03, 0xA1, 0x2E, 0xE4, + 0x3B, 0x1C, 0x84, 0xE1, 0xCD, 0x3E, 0x01, 0xA2, 0xCA, 0x22, 0xCD, 0x3E, + 0x03, 0xAE, 0xCD, 0x2A, 0x61, 0xF0, 0x45, 0xE0, 0xCC, 0x5A, 0xCB, 0x4E, + 0x03, 0xA0, 0xCD, 0x2A, 0x4A, 0xE0, 0x13, 0xE0, 0xCC, 0x3E, 0x03, 0xA1, + 0xCC, 0x2A, 0xCD, 0x3E, 0xCB, 0x34, 0x02, 0xAE, 0x2E, 0xE4, 0xCD, 0x28, + 0xCA, 0x3C, 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0xCA, 0x82, 0x1E, 0xAE, + 0x18, 0xE0, 0xCB, 0x82, 0xCB, 0x34, 0x02, 0xAE, 0x2E, 0xE4, 0x1C, 0xE0, + 0xCA, 0x3C, 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0xCB, 0x82, 0x1E, 0xAF, + 0x18, 0xE0, 0xCA, 0x82, 0xCB, 0x34, 0x02, 0xAE, 0x2E, 0xE4, 0x1C, 0xE0, + 0xCA, 0x3C, 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0xCC, 0x3E, 0x03, 0xA1, + 0x18, 0xE0, 0xCB, 0x82, 0x13, 0xE0, 0x1F, 0xA1, 0xCA, 0x82, 0xCC, 0x58, + 0x42, 0xE0, 0xCC, 0x5E, 0x19, 0xE0, 0xCC, 0x3E, 0x46, 0xE0, 0x55, 0x2A, + 0x54, 0x2C, 0x2E, 0xE4, 0x1E, 0x01, 0xC0, 0xE0, 0xB4, 0xF0, 0x06, 0xA1, + 0x13, 0x21, 0x28, 0x08, 0x63, 0xE1, 0x8A, 0xF0, 0x03, 0x3D, 0x13, 0x35, + 0x02, 0xA0, 0x0B, 0x4D, 0x2A, 0x08, 0x63, 0xE1, 0x8A, 0xF0, 0x84, 0xCB, + 0x13, 0x35, 0x02, 0xA0, 0x0B, 0x4D, 0x13, 0x21, 0x13, 0x21, 0x2C, 0x08, + 0x63, 0xE1, 0x03, 0x3D, 0x03, 0x3D, 0x13, 0x35, 0x5C, 0x08, 0x0B, 0x4D, + 0x17, 0x28, 0x16, 0x3C, 0x17, 0x34, 0x2E, 0xE4, 0x10, 0xC7, 0x16, 0x2C, + 0x17, 0x3C, 0x02, 0xA0, 0x02, 0xA0, 0xFF, 0xFF, 0x08, 0xE0, 0x17, 0x7C, + 0x23, 0x1A, 0x1E, 0xE4, 0x88, 0x3C, 0x02, 0xAF, 0x49, 0x1A, 0x1E, 0xE4, + 0xB2, 0x19, 0x1E, 0xE4, 0x2E, 0xE4, 0xBB, 0x12, 0x18, 0xE4, 0xC4, 0x28, + 0x28, 0xF0, 0x46, 0xE0, 0x14, 0x2A, 0x7E, 0x3C, 0x2A, 0xF0, 0x40, 0x28, + 0x7E, 0x2A, 0x2E, 0xE4, 0x34, 0xF0, 0x46, 0xE0, 0x7D, 0x28, 0x03, 0xAE, + 0x14, 0x3C, 0x7E, 0x28, 0x7D, 0x3C, 0x00, 0xA2, 0x03, 0xA1, 0x14, 0x2A, + 0x5B, 0xF0, 0x40, 0x2A, 0x15, 0x28, 0x91, 0x3C, 0x02, 0xAE, 0x27, 0xF0, + 0x45, 0xE0, 0x7D, 0x28, 0x91, 0x2A, 0x2A, 0xE4, 0x2E, 0xE4, 0x49, 0x1A, + 0x1E, 0xE4, 0x16, 0xF0, 0x83, 0x4E, 0x82, 0x22, 0x2B, 0xE4, 0x15, 0x2A, + 0x83, 0x3C, 0x82, 0x34, 0x2B, 0xE4, 0x45, 0xE0, 0xB2, 0x19, 0x1E, 0xE4, + 0x23, 0x1A, 0x1E, 0xE4, 0x15, 0x2A, 0x2E, 0xE4, 0x49, 0x1A, 0x1E, 0xE4, + 0x7F, 0x3E, 0x01, 0xA2, 0x40, 0xF0, 0x2B, 0xE4, 0x03, 0xA2, 0x8A, 0x3C, + 0x80, 0x3C, 0x2E, 0xE4, 0x4B, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x7F, 0x3E, + 0x50, 0x08, 0x63, 0xE1, 0x4E, 0x3C, 0x4D, 0x3C, 0x4A, 0x3C, 0x02, 0xA2, + 0xEA, 0xF0, 0x03, 0x29, 0x40, 0x2A, 0x51, 0x28, 0x1F, 0x3C, 0x00, 0xA2, + 0x50, 0x82, 0xA4, 0xCC, 0x02, 0xAF, 0x2B, 0xF0, 0x51, 0x2A, 0xCE, 0xF1, + 0x4F, 0x3C, 0x18, 0xE0, 0x50, 0x28, 0x03, 0xAF, 0x2A, 0xF0, 0x40, 0x28, + 0x09, 0x3E, 0x08, 0x3C, 0x07, 0xAF, 0x06, 0xAF, 0x4A, 0x3C, 0x18, 0xE0, + 0x09, 0x82, 0x08, 0x84, 0x4A, 0x3C, 0x04, 0xA2, 0x32, 0xF0, 0x04, 0xA1, + 0x02, 0xAF, 0x51, 0x28, 0x1F, 0x3C, 0x02, 0xA2, 0x50, 0x82, 0xA4, 0xCC, + 0x1B, 0xF0, 0x40, 0x2A, 0x4C, 0x3C, 0x4F, 0x28, 0x4F, 0x3C, 0x18, 0xE0, + 0x1F, 0x3C, 0x00, 0xA2, 0x4B, 0xF0, 0x40, 0x2A, 0x53, 0x08, 0x63, 0xE1, + 0x00, 0xA2, 0x4C, 0x3C, 0x2A, 0xE4, 0x28, 0x28, 0x2E, 0xE4, 0x03, 0x3D, + 0x3B, 0xF1, 0x40, 0x2A, 0x28, 0xE4, 0x72, 0x28, 0xFA, 0xF0, 0x13, 0x29, + 0x52, 0x08, 0x63, 0xE1, 0x00, 0xA2, 0x74, 0xF0, 0x54, 0x1C, 0x03, 0x29, + 0x03, 0x3D, 0x1E, 0x28, 0x4C, 0x3C, 0x4B, 0x3C, 0x4C, 0x3C, 0x4B, 0x3C, + 0x03, 0x29, 0x6E, 0xF0, 0x69, 0xF0, 0x40, 0x2A, 0x03, 0x3D, 0x1E, 0x0C, + 0x2A, 0xF0, 0x03, 0x29, 0x50, 0x08, 0x63, 0xE1, 0x02, 0xA8, 0x02, 0xA0, + 0x1F, 0x28, 0x2E, 0xE4, 0x69, 0x4C, 0x68, 0x28, 0x2E, 0xE4, 0x1F, 0x3C, + 0xF8, 0xF7, 0x28, 0xCA, 0x2A, 0xE4, 0x6A, 0x4C, 0x11, 0xD1, 0x20, 0xCE, + 0x68, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0x0C, 0x00, 0x12, 0xD1, 0xB0, 0x04, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x2A, 0xE4, 0x6A, 0x4C, + 0x69, 0x4C, 0x68, 0x28, 0x68, 0x28, 0x10, 0xC4, 0xB0, 0x04, 0x67, 0xE1, + 0x17, 0x3D, 0x53, 0x2C, 0x17, 0x3D, 0x10, 0xAE, 0x31, 0x2A, 0x12, 0xAE, + 0x69, 0x28, 0x37, 0x81, 0x53, 0x2C, 0x17, 0x3D, 0x56, 0xE0, 0x17, 0xE0, + 0x05, 0xE0, 0x37, 0x81, 0x17, 0x3D, 0x04, 0xAE, 0x6A, 0x28, 0x65, 0xE0, + 0x1A, 0x2C, 0xFF, 0x00, 0x05, 0xE0, 0x17, 0x3D, 0x56, 0xE0, 0x14, 0xAE, + 0x06, 0xAE, 0x66, 0xE0, 0x1A, 0x2C, 0xFF, 0x1F, 0xC0, 0xE0, 0xF8, 0xF7, + 0x28, 0xCA, 0x17, 0x3D, 0xB0, 0x04, 0x11, 0xD1, 0x20, 0xCE, 0x68, 0x00, + 0x02, 0x00, 0x13, 0xD1, 0x0C, 0x00, 0x12, 0xD1, 0x55, 0x28, 0x2E, 0xE4, + 0xF8, 0xF7, 0x28, 0xCA, 0xA0, 0x04, 0x00, 0xE0, 0x02, 0xAE, 0x06, 0xA8, + 0x1B, 0xE0, 0x09, 0xA8, 0x89, 0xCB, 0x9E, 0xE0, 0xE0, 0x28, 0xB9, 0xF0, + 0x00, 0xA2, 0x1F, 0xAE, 0x11, 0x21, 0x92, 0xE0, 0x00, 0x02, 0x00, 0xE0, + 0x09, 0xE0, 0x21, 0xAF, 0x49, 0xE0, 0x11, 0x4D, 0x55, 0x28, 0x17, 0x3D, + 0x17, 0x3F, 0xFF, 0x7F, 0x1A, 0xE4, 0x08, 0x3C, 0x06, 0xA1, 0x06, 0xA8, + 0x5D, 0x28, 0x2A, 0xE4, 0x08, 0x28, 0xAA, 0x1D, 0x54, 0x2C, 0x55, 0x2A, + 0x2A, 0xF0, 0x55, 0x2E, 0x1E, 0xE4, 0x28, 0xE4, 0x02, 0xA1, 0x46, 0xE0, + 0xB8, 0x04, 0x67, 0xE1, 0x2E, 0xE4, 0xAA, 0x1D, 0x05, 0xAF, 0x55, 0x2E, + 0x17, 0x4D, 0x17, 0x21, 0x07, 0xA1, 0x40, 0x2A, 0x42, 0xE0, 0x09, 0xAE, + 0x07, 0xAF, 0x07, 0xA0, 0x54, 0x2E, 0x69, 0xF0, 0x12, 0xD1, 0x20, 0xCE, + 0x42, 0xE0, 0x0B, 0xAE, 0x13, 0xD1, 0xA0, 0x04, 0x11, 0xD1, 0x08, 0x00, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x02, 0x00, 0x02, 0xAF, 0x0E, 0xA8, + 0x02, 0xA1, 0x55, 0x2C, 0x90, 0xCB, 0x9E, 0xE0, 0xA8, 0x04, 0x00, 0xE0, + 0x0D, 0xAE, 0x67, 0x2A, 0x3F, 0x00, 0x08, 0xE0, 0x03, 0xA8, 0x03, 0xA1, + 0x55, 0x2E, 0x56, 0xE0, 0x6E, 0xF0, 0x07, 0x3D, 0x10, 0xAE, 0x49, 0xF0, + 0x56, 0xE0, 0x00, 0xFF, 0x09, 0xE0, 0x07, 0x2B, 0x0E, 0xA8, 0x02, 0xA1, + 0x55, 0x2C, 0x07, 0x3D, 0x2E, 0xE4, 0xE4, 0x1D, 0x1A, 0xE4, 0x0E, 0xA1, + 0x67, 0xE1, 0x0E, 0xA1, 0x02, 0xA1, 0x55, 0x2C, 0x42, 0xE0, 0x17, 0x4F, + 0x17, 0x23, 0xB3, 0x04, 0x54, 0x2E, 0x69, 0xF0, 0x07, 0xA1, 0x40, 0x2A, + 0x42, 0xE0, 0x07, 0xAE, 0x07, 0xAF, 0x0F, 0xA0, 0x12, 0xD1, 0xA8, 0x04, + 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x04, 0x00, + 0xFA, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xF8, 0xF7, 0x44, 0x34, 0x60, 0x00, + 0xC0, 0xE0, 0xFB, 0x3C, 0xC0, 0xE0, 0x79, 0x3C, 0x78, 0x34, 0x45, 0x3C, + 0x47, 0x3C, 0x46, 0x34, 0x04, 0xAE, 0x61, 0x00, 0x30, 0xD0, 0x2E, 0xE4, + 0x1F, 0x1E, 0x1E, 0xE4, 0x33, 0xD0, 0x00, 0x00, 0x34, 0xD0, 0x00, 0x00, + 0x36, 0xD0, 0x00, 0x00, 0x35, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x80, 0x00, + 0x37, 0xD0, 0xFF, 0x00, 0x44, 0x20, 0x70, 0xE4, 0x2E, 0xE4, 0x00, 0x00, + 0x11, 0xAE, 0xFB, 0x4E, 0xFA, 0x26, 0x45, 0x4C, 0x78, 0x34, 0x49, 0x00, + 0xC2, 0xE0, 0x42, 0xE0, 0x2A, 0x24, 0x71, 0xD0, 0x2E, 0xE4, 0x79, 0x3C, + 0xD4, 0x3C, 0xD3, 0x34, 0x00, 0xA2, 0x81, 0xE1, 0xF9, 0x3C, 0xF6, 0x3C, + 0x00, 0x02, 0x04, 0xE0, 0x16, 0x1F, 0x1E, 0xE4, 0xFA, 0x1E, 0x1E, 0xE4, + 0x57, 0x1F, 0x1E, 0xE4, 0x33, 0x1F, 0x1E, 0xE4, 0x29, 0xCA, 0x2E, 0xE4, + 0x62, 0x1F, 0x1E, 0xE4, 0x1E, 0xE4, 0x6D, 0x1E, 0x1E, 0xE4, 0xF9, 0xF7, + 0x02, 0xA8, 0x3C, 0xAF, 0x48, 0xCA, 0x89, 0x1E, 0x3C, 0xAE, 0xF7, 0x3C, + 0x02, 0xA2, 0x5A, 0xF0, 0x02, 0xA8, 0x38, 0xAF, 0x48, 0xCA, 0x48, 0xCE, + 0x1E, 0xE4, 0x5B, 0x1E, 0x1E, 0xE4, 0xAA, 0xF0, 0x48, 0xCE, 0x38, 0xAE, + 0x02, 0xA2, 0x57, 0x1F, 0x78, 0x24, 0x70, 0xE4, 0x62, 0x1F, 0x1E, 0xE4, + 0x46, 0xE0, 0x45, 0x4E, 0x44, 0x26, 0x79, 0x4C, 0x45, 0xE0, 0x11, 0xAE, + 0x47, 0x4E, 0x46, 0x26, 0x43, 0xF0, 0x45, 0xE0, 0xF6, 0x28, 0x25, 0xE4, + 0xF9, 0x3C, 0x2E, 0xE4, 0xF9, 0x3E, 0x41, 0xE0, 0x48, 0xF0, 0xF9, 0x28, + 0x55, 0xCA, 0x2E, 0xE4, 0xD3, 0x20, 0x4E, 0xF0, 0xAA, 0xCE, 0x00, 0xA2, + 0x79, 0x4C, 0x78, 0x24, 0x45, 0xE0, 0xD4, 0x4C, 0xF9, 0x28, 0x79, 0x3C, + 0x78, 0x34, 0x42, 0xE0, 0x42, 0xE0, 0xD4, 0x4C, 0xD3, 0x24, 0x2A, 0xE4, + 0x46, 0xE0, 0xF9, 0x2A, 0xD4, 0x3C, 0xD3, 0x34, 0xD4, 0x3C, 0xD3, 0x34, + 0x00, 0xA2, 0x28, 0xE4, 0x78, 0x24, 0x49, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x46, 0xE0, 0x45, 0x4E, 0x44, 0x26, 0x79, 0x4C, 0xFB, 0x3C, 0xFA, 0x34, + 0x10, 0xAF, 0x49, 0xE0, 0x45, 0xE0, 0x10, 0xAE, 0x47, 0x4C, 0x46, 0x24, + 0x02, 0xA2, 0xFA, 0xF1, 0xD0, 0x28, 0x85, 0xF2, 0x79, 0x4C, 0x78, 0x24, + 0x74, 0x00, 0xC2, 0xE0, 0x6B, 0xF1, 0xD2, 0x2A, 0x49, 0x00, 0xC2, 0xE0, + 0x00, 0x80, 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x0A, 0xE0, 0x5D, 0x00, + 0xC0, 0xE0, 0x1A, 0xF1, 0x02, 0xA2, 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x80, + 0x09, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0x00, 0xCE, 0x04, 0x00, 0xC0, 0xE0, + 0xC9, 0xF7, 0x00, 0x80, 0xFB, 0x3C, 0xFA, 0x34, 0x00, 0xA2, 0x98, 0xF7, + 0x79, 0x3E, 0x78, 0x36, 0x45, 0x4E, 0x44, 0x26, 0x49, 0x00, 0xC3, 0xE0, + 0x79, 0x4E, 0x78, 0x26, 0x00, 0x00, 0x27, 0xD0, 0x28, 0xE4, 0xD0, 0x28, + 0x01, 0x00, 0x27, 0xD0, 0xCD, 0x1E, 0x1E, 0xE4, 0x56, 0x34, 0x48, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0xC1, 0xE0, 0x57, 0x4C, 0x56, 0x24, 0x57, 0x3C, + 0x56, 0x26, 0x57, 0x3E, 0x56, 0x36, 0x49, 0x00, 0x46, 0x26, 0x50, 0xF0, + 0x46, 0xE0, 0x57, 0x4E, 0x05, 0xE0, 0x42, 0xE0, 0x11, 0xAE, 0x47, 0x4E, + 0x49, 0x28, 0x20, 0xE4, 0x46, 0xE0, 0x00, 0x02, 0x08, 0xE0, 0x5C, 0x00, + 0xC0, 0xE0, 0x98, 0xF6, 0x5D, 0x00, 0xC0, 0xE0, 0x4A, 0xF6, 0x00, 0x80, + 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x80, 0x0A, 0xE0, 0xC1, 0xE0, 0x49, 0x3C, + 0x00, 0xCE, 0x02, 0xA2, 0xC9, 0xF7, 0x00, 0x80, 0x09, 0xE0, 0x5D, 0x00, + 0x0D, 0xA2, 0x20, 0xA2, 0x2E, 0xE4, 0x5E, 0xF5, 0x20, 0xAE, 0x56, 0xE0, + 0x03, 0xA2, 0x56, 0xE0, 0x33, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x9E, 0xCC, + 0x35, 0xD0, 0x00, 0x00, 0x34, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0xFF, 0x00, + 0x36, 0xD0, 0x00, 0x00, 0x39, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x80, 0x00, + 0x47, 0xD0, 0x00, 0x00, 0x46, 0xD0, 0x00, 0x00, 0x43, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x00, 0x00, 0x0E, 0xAE, 0x02, 0xA2, 0xD2, 0x30, 0x0C, 0xAF, + 0x09, 0xAE, 0x07, 0xA8, 0x43, 0x00, 0xC1, 0xE0, 0x28, 0xAE, 0x22, 0xA2, + 0x4E, 0xCE, 0x56, 0xE0, 0x4C, 0xCE, 0x56, 0xE0, 0x37, 0xAE, 0x17, 0xA2, + 0x38, 0xAE, 0x06, 0xA2, 0x54, 0xCE, 0x00, 0xA2, 0x4A, 0xCE, 0x56, 0xE0, + 0x03, 0x00, 0x05, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, 0x58, 0xCE, 0x00, 0xA2, + 0x06, 0xA1, 0x4A, 0xF0, 0x10, 0xA1, 0x5B, 0x00, 0x38, 0x00, 0x04, 0xE0, + 0x2E, 0xE4, 0x5A, 0xF0, 0x05, 0xE0, 0x20, 0x00, 0x04, 0xE0, 0x3E, 0xF0, + 0x00, 0x18, 0x05, 0xE0, 0x56, 0xE0, 0x80, 0x00, 0xC8, 0xCE, 0x08, 0xA2, + 0xC0, 0xCE, 0x56, 0xE0, 0x88, 0xCE, 0x9E, 0xCE, 0x92, 0xCE, 0x00, 0xA2, + 0xA4, 0xCE, 0xD6, 0xCE, 0xD0, 0xCE, 0x8A, 0xCE, 0x04, 0xE0, 0x9C, 0xCE, + 0x02, 0xA2, 0xC6, 0xCE, 0x06, 0xA2, 0x2E, 0xE4, 0x96, 0xCE, 0x00, 0x02, + 0x5A, 0xCE, 0x56, 0xE0, 0x11, 0xAE, 0xF9, 0x2A, 0x00, 0xA2, 0x5C, 0xCE, + 0x79, 0x4C, 0x78, 0x24, 0x00, 0x0F, 0x04, 0xE0, 0x2E, 0xE4, 0x5E, 0xCE, + 0x56, 0xE0, 0x03, 0x00, 0x05, 0xE0, 0x20, 0xAE, 0x49, 0xCA, 0x56, 0xE0, + 0x30, 0x00, 0x05, 0xE0, 0x03, 0xA2, 0x4B, 0xF0, 0x03, 0xA8, 0x21, 0xAF, + 0x2E, 0xE4, 0x4A, 0xCE, 0x56, 0xE0, 0x2F, 0xAE, 0x00, 0xA2, 0x72, 0xCC, + 0x50, 0xA0, 0x72, 0xC8, 0x1E, 0xE4, 0x00, 0xA2, 0x93, 0x1F, 0x1E, 0xE4, + 0x93, 0x1F, 0x1E, 0xE4, 0x00, 0xA2, 0x93, 0x1F, 0x00, 0xA2, 0x93, 0x1F, + 0x1E, 0xE4, 0x02, 0xA2, 0x0A, 0xAE, 0x2F, 0x28, 0xAA, 0xCE, 0x96, 0xCE, + 0x1E, 0xE4, 0x93, 0x1F, 0x1E, 0xE4, 0x30, 0x4C, 0x2E, 0xE4, 0x92, 0xCE, + 0x00, 0xA2, 0x0F, 0x1E, 0x1E, 0xE4, 0x2E, 0xE4, 0xF9, 0xF7, 0x9B, 0xCA, + 0x48, 0xCA, 0x2E, 0xE4, 0xC4, 0xCE, 0x90, 0x1F, 0x02, 0xA8, 0x4C, 0xCA, + 0xE8, 0xF7, 0x02, 0xA8, 0x97, 0x1F, 0x1E, 0xE4, 0x2E, 0xE4, 0xEA, 0xF7, + 0xF7, 0x3C, 0x00, 0xA2, 0x90, 0x1F, 0x1E, 0xE4, 0x66, 0xC8, 0x7A, 0xF0, + 0x02, 0xA8, 0xC9, 0x28, 0xD4, 0xCA, 0x38, 0xF0, 0x3F, 0x00, 0x08, 0xE0, + 0x98, 0xCE, 0x30, 0x00, 0x04, 0xE0, 0xD2, 0xCE, 0x82, 0xE0, 0x2E, 0xE4, + 0xFA, 0xF7, 0xF7, 0x28, 0x80, 0xCA, 0x80, 0x01, 0x61, 0xE1, 0x48, 0x3C, + 0x11, 0x35, 0x82, 0xCA, 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, + 0x84, 0xCA, 0x11, 0x3D, 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, 0x86, 0xCA, + 0x11, 0x8B, 0x45, 0x01, 0x11, 0x8B, 0x44, 0x01, 0x11, 0x8B, 0x49, 0x01, + 0x11, 0x8B, 0x48, 0x01, 0x11, 0x8B, 0x4B, 0x01, 0x11, 0x8B, 0x4A, 0x01, + 0x11, 0x8B, 0x4E, 0x01, 0x11, 0x8B, 0x60, 0x01, 0x11, 0x8B, 0x52, 0x01, + 0x11, 0x8B, 0x4F, 0x01, 0x11, 0x8B, 0x55, 0x01, 0x11, 0x8B, 0x53, 0x01, + 0x11, 0x8B, 0x63, 0x01, 0x11, 0x8B, 0x57, 0x01, 0xCC, 0xCA, 0x65, 0x01, + 0x11, 0x8B, 0x64, 0x01, 0x11, 0x35, 0xCE, 0xCA, 0x11, 0x3D, 0x11, 0x35, + 0xD2, 0xCA, 0x68, 0x01, 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, 0xD4, 0xCA, + 0x11, 0x3D, 0x11, 0x35, 0x11, 0x8B, 0x6B, 0x01, 0x11, 0x8B, 0x11, 0x3D, + 0x11, 0x8B, 0x6D, 0x01, 0x11, 0x8B, 0x6C, 0x01, 0x11, 0x3D, 0x11, 0x35, + 0x60, 0xC8, 0x6E, 0x01, 0x64, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x62, 0xC8, + 0x33, 0x00, 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, 0x35, 0x00, 0x11, 0x8B, + 0x34, 0x00, 0x11, 0x8B, 0x37, 0x00, 0x11, 0x8B, 0x36, 0x00, 0x11, 0x8B, + 0x11, 0x35, 0x72, 0xC8, 0x38, 0x00, 0x11, 0x8B, 0x7A, 0xC8, 0x3A, 0x00, + 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, 0x7C, 0xC8, 0x11, 0x3D, 0x11, 0x35, + 0x11, 0x3D, 0x11, 0x35, 0x80, 0xC8, 0x11, 0x3D, 0x84, 0xC8, 0x11, 0x3D, + 0x11, 0x35, 0x82, 0xC8, 0x11, 0x35, 0x86, 0xC8, 0x11, 0x3D, 0x11, 0x35, + 0x11, 0x3D, 0x11, 0x35, 0x88, 0xC8, 0x11, 0x3D, 0x8C, 0xC8, 0x11, 0x3D, + 0x11, 0x35, 0x8A, 0xC8, 0x11, 0x35, 0x90, 0xC8, 0x11, 0x3D, 0x11, 0x35, + 0x11, 0x3D, 0x11, 0x35, 0x92, 0xC8, 0x11, 0x3D, 0x96, 0xC8, 0x11, 0x3D, + 0x11, 0x35, 0x94, 0xC8, 0x11, 0x35, 0x98, 0xC8, 0x11, 0x3D, 0x11, 0x35, + 0x11, 0x3D, 0x11, 0x35, 0x9E, 0xC8, 0x11, 0x3D, 0x82, 0xE0, 0x2E, 0xE4, + 0x92, 0xE0, 0x48, 0x28, 0x11, 0x21, 0x80, 0x01, 0x61, 0xE1, 0x48, 0x3C, + 0x11, 0x4D, 0x11, 0x21, 0x80, 0xCE, 0x11, 0x4D, 0x84, 0xCE, 0x11, 0x4D, + 0x11, 0x21, 0x82, 0xCE, 0x11, 0x89, 0x86, 0xCE, 0x11, 0x4D, 0x11, 0x21, + 0x11, 0x89, 0x45, 0x01, 0x11, 0x89, 0x44, 0x01, 0x11, 0x89, 0x49, 0x01, + 0x11, 0x89, 0x48, 0x01, 0x11, 0x89, 0x4B, 0x01, 0x11, 0x89, 0x4A, 0x01, + 0x11, 0x89, 0x4E, 0x01, 0x11, 0x89, 0x60, 0x01, 0x11, 0x89, 0x52, 0x01, + 0x11, 0x89, 0x4F, 0x01, 0x11, 0x89, 0x55, 0x01, 0x11, 0x89, 0x53, 0x01, + 0x11, 0x89, 0x63, 0x01, 0x11, 0x89, 0x57, 0x01, 0x11, 0x21, 0x65, 0x01, + 0x11, 0x89, 0x64, 0x01, 0x11, 0x4D, 0x11, 0x21, 0xCC, 0xCE, 0x11, 0x4D, + 0x11, 0x21, 0x68, 0x01, 0x11, 0x89, 0xCE, 0xCE, 0x11, 0x4D, 0x11, 0x21, + 0xD2, 0xCE, 0x11, 0x4D, 0x11, 0x89, 0x6B, 0x01, 0x11, 0x89, 0xD4, 0xCE, + 0x11, 0x89, 0x6D, 0x01, 0x11, 0x89, 0x6C, 0x01, 0x60, 0xCC, 0x11, 0x4D, + 0x11, 0x21, 0x6E, 0x01, 0x11, 0x21, 0x62, 0xCC, 0x11, 0x4D, 0x11, 0x21, + 0x33, 0x00, 0x11, 0x89, 0x64, 0xCC, 0x11, 0x4D, 0x35, 0x00, 0x11, 0x89, + 0x34, 0x00, 0x11, 0x89, 0x37, 0x00, 0x11, 0x89, 0x36, 0x00, 0x11, 0x89, + 0x11, 0x4D, 0x11, 0x21, 0x38, 0x00, 0x11, 0x89, 0x11, 0x21, 0x3A, 0x00, + 0x11, 0x89, 0x72, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x7A, 0xCC, 0x11, 0x4D, + 0x80, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x7C, 0xCC, 0x11, 0x21, 0x82, 0xCC, + 0x11, 0x4D, 0x11, 0x21, 0x11, 0x4D, 0x11, 0x21, 0x84, 0xCC, 0x11, 0x4D, + 0x88, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x86, 0xCC, 0x11, 0x21, 0x8A, 0xCC, + 0x11, 0x4D, 0x11, 0x21, 0x11, 0x4D, 0x11, 0x21, 0x8C, 0xCC, 0x11, 0x4D, + 0x92, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x90, 0xCC, 0x11, 0x21, 0x94, 0xCC, + 0x11, 0x4D, 0x11, 0x21, 0x11, 0x4D, 0x11, 0x21, 0x96, 0xCC, 0x11, 0x4D, + 0x05, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x98, 0xCC, 0x9E, 0xCC, 0x56, 0xE0, + 0x21, 0xAE, 0x15, 0x14, 0x92, 0xE0, 0x48, 0x28, 0x02, 0x00, 0x4C, 0xD1, + 0x61, 0xE1, 0x48, 0x3C, 0x82, 0xE0, 0x2E, 0xE4, 0x11, 0x3D, 0x11, 0x35, + 0x72, 0xC8, 0x80, 0x01, 0x7A, 0xF0, 0x11, 0x3D, 0xFC, 0x3C, 0xC6, 0xCA, + 0xCE, 0xCA, 0x11, 0x3D, 0x11, 0x35, 0xCC, 0xCA, 0x92, 0xE0, 0x48, 0x28, + 0x11, 0x3D, 0x11, 0x35, 0x78, 0x24, 0x2B, 0xE4, 0xFC, 0x2A, 0x2E, 0xE4, + 0x79, 0x3C, 0x78, 0x34, 0x46, 0xE0, 0x79, 0x4C, 0x61, 0xE1, 0x48, 0x3C, + 0x82, 0xE0, 0x2E, 0xE4, 0x72, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x80, 0x01, + 0x10, 0xAF, 0x01, 0x29, 0x5B, 0xF1, 0x11, 0x2B, 0x93, 0x1F, 0x1E, 0xE4, + 0xFF, 0x00, 0x08, 0xE0, 0xFC, 0x3C, 0xCA, 0xF0, 0x02, 0xA1, 0xFC, 0x28, + 0x1E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x11, 0x29, 0x3A, 0xF0, 0x02, 0xA1, + 0xFC, 0x28, 0x93, 0x1F, 0x92, 0xE0, 0x48, 0x28, 0xDE, 0xF6, 0xFC, 0x3C, + 0x00, 0x00, 0x21, 0xD1, 0x40, 0xCE, 0x2E, 0xE4, 0x80, 0x00, 0x23, 0xD1, + 0x02, 0x00, 0x22, 0xD1, 0x2E, 0xE4, 0xE8, 0xF7, 0x02, 0xA8, 0x48, 0xCA, + 0x00, 0xA2, 0x9E, 0xCC, 0x22, 0xAE, 0x04, 0xA2, 0x04, 0xE0, 0x8E, 0xCC, + 0x8C, 0xCC, 0x72, 0xCC, 0x22, 0x93, 0x0A, 0xE0, 0x20, 0xAE, 0x10, 0xA8, + 0x90, 0xE1, 0x03, 0x00, 0x6F, 0xD1, 0x4A, 0xCE, 0x00, 0x00, 0x6F, 0xD1, + 0x90, 0xE1, 0x90, 0xE1, 0x50, 0xCA, 0x50, 0xCE, 0x60, 0xA2, 0x2E, 0xE4, + 0x2E, 0xE4, 0x00, 0xC0, 0xEA, 0xF7, 0x02, 0xA8, 0x2E, 0xE4, 0x50, 0xCE, + 0x20, 0x00, 0x04, 0xE0, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x08, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x30, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x30, 0x00, + 0x18, 0x00, 0x08, 0x00, 0x18, 0x00, 0x40, 0x00, 0x18, 0x00, 0x08, 0x00, + 0x18, 0x00, 0x40, 0x00, 0x18, 0x00, 0x10, 0x00, 0x18, 0x00, 0x50, 0x00, + 0x20, 0x00, 0x10, 0x00, 0x18, 0x00, 0x50, 0x00, 0x20, 0x00, 0x18, 0x00, + 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x18, 0x00, 0x20, 0x00, 0x60, 0x00, + 0x28, 0x00, 0x18, 0x00, 0x40, 0x00, 0x80, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0xA0, 0x00, + 0x38, 0x00, 0x20, 0x00, 0x60, 0x00, 0xA0, 0x00, 0x40, 0x00, 0x30, 0x00, + 0x80, 0x00, 0xC0, 0x00, 0x48, 0x00, 0x30, 0x00, 0x80, 0x00, 0xC0, 0x00, + 0x50, 0x00, 0x40, 0x00, 0xC0, 0x00, 0x00, 0x01, 0x58, 0x00, 0x40, 0x00, + 0xC0, 0x00, 0x00, 0x01, 0x68, 0x00, 0x60, 0x00, 0x00, 0x01, 0x40, 0x01, + 0x70, 0x00, 0x60, 0x00, 0x00, 0x01, 0x40, 0x01, 0x80, 0x00, 0x70, 0x00, + 0x40, 0x01, 0x80, 0x01, 0x90, 0x00, 0x70, 0x00, 0x40, 0x01, 0x80, 0x01, + 0xA0, 0x00, 0x80, 0x00, 0x80, 0x01, 0xC0, 0x01, 0xB8, 0x00, 0x80, 0x00, + 0x80, 0x01, 0xC0, 0x01, 0xC8, 0x00, 0xA0, 0x00, 0xC0, 0x01, 0x00, 0x02, + 0xE8, 0x00, 0xA0, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x80, 0x01, 0x80, 0x01, + 0x00, 0x02, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, 0x00, 0x02, 0x00, 0x03, + 0xC0, 0x01, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, 0xE8, 0x01, 0x00, 0x02, + 0x40, 0x02, 0x00, 0x04, 0x98, 0x03, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, + 0xC8, 0x03, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, + 0x40, 0x02, 0x00, 0x04, 0x40, 0x04, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, + 0x88, 0x06, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, 0xD8, 0x06, 0x00, 0x02, + 0x40, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x0A, 0x00, + 0x09, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0D, 0x00, 0x0C, 0x00, + 0x13, 0x00, 0x12, 0x00, 0x11, 0x00, 0x10, 0x00, 0x17, 0x00, 0x16, 0x00, + 0x15, 0x00, 0x14, 0x00, 0x1B, 0x00, 0x1A, 0x00, 0x19, 0x00, 0x18, 0x00, + 0x1E, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1C, 0x00, 0x21, 0x00, 0x20, 0x00, + 0x20, 0x00, 0x1F, 0x00, 0x23, 0x00, 0x23, 0x00, 0x22, 0x00, 0x22, 0x00, + 0x25, 0x00, 0x25, 0x00, 0x24, 0x00, 0x24, 0x00, 0x26, 0x00, 0x26, 0x00, + 0x26, 0x00, 0x25, 0x00, 0x27, 0x00, 0x27, 0x00, 0x27, 0x00, 0x27, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x08, 0x00, + 0x07, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0D, 0x00, 0x0B, 0x00, 0x0A, 0x00, + 0x17, 0x00, 0x14, 0x00, 0x12, 0x00, 0x10, 0x00, 0x24, 0x00, 0x20, 0x00, + 0x1D, 0x00, 0x19, 0x00, 0x39, 0x00, 0x33, 0x00, 0x2D, 0x00, 0x28, 0x00, + 0x5B, 0x00, 0x51, 0x00, 0x48, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x02, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0D, 0x00, 0x0B, 0x00, + 0x0A, 0x00, 0x09, 0x00, 0x14, 0x00, 0x12, 0x00, 0x10, 0x00, 0x0E, 0x00, + 0x20, 0x00, 0x1D, 0x00, 0x19, 0x00, 0x17, 0x00, 0x33, 0x00, 0x2D, 0x00, + 0x28, 0x00, 0x24, 0x00, 0x51, 0x00, 0x48, 0x00, 0x40, 0x00, 0x39, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x1D, 0x02, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, + 0x27, 0xD0, 0x68, 0xE1, 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x04, 0xE0, 0x5A, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, + 0xC2, 0xE0, 0x00, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, + 0x74, 0x01, 0x1E, 0xE4, 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, + 0xEE, 0x28, 0x4E, 0xF0, 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, + 0x00, 0xCE, 0x1A, 0xE0, 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, + 0x96, 0x00, 0x1E, 0xE4, 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, + 0x9E, 0xE0, 0x42, 0x01, 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, + 0x07, 0x9F, 0x02, 0xA2, 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, + 0x6A, 0xE1, 0x1D, 0x02, 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, + 0x7C, 0xE6, 0x00, 0xC0, 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, + 0x11, 0xAE, 0x5E, 0x00, 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, + 0xEF, 0x3C, 0x56, 0xE0, 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, + 0x3E, 0xAE, 0x02, 0xA2, 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, + 0xC0, 0xE0, 0x07, 0x9F, 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, + 0x5D, 0x00, 0xC3, 0xE0, 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, + 0x00, 0xCE, 0x1A, 0xE0, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, + 0x00, 0x00, 0x04, 0xE0, 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, + 0x78, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, + 0x28, 0xCC, 0x04, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, + 0x05, 0xE0, 0x20, 0xAE, 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0x38, 0xD6, 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, + 0x00, 0xA2, 0x71, 0x00, 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, + 0x01, 0x00, 0x27, 0xD0, 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, + 0x2B, 0xF3, 0x03, 0xA1, 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, + 0x7B, 0xF1, 0x03, 0xA1, 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, + 0x3B, 0xF1, 0x05, 0xA1, 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, + 0x9B, 0xF1, 0x03, 0xA1, 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, + 0xAE, 0xF1, 0x2A, 0xA2, 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, + 0xC1, 0xE0, 0x5A, 0xA2, 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, + 0x04, 0xE0, 0xFB, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, + 0xCE, 0xF0, 0x4E, 0x00, 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, + 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, + 0x16, 0xAE, 0x72, 0x00, 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, + 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, 0x0B, 0x15, 0x1E, 0xE4, + 0x2E, 0xE4, 0xE1, 0xE1, 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x98, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, + 0x5B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, + 0xC0, 0xE0, 0x7C, 0xE6, 0x3D, 0x02, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, + 0x10, 0xA8, 0x5B, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, + 0x01, 0xC4, 0x00, 0xA2, 0x7C, 0xE6, 0x3F, 0x02, 0x61, 0xE1, 0x11, 0x3D, + 0xEB, 0x00, 0x88, 0xE1, 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, + 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, + 0x00, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, + 0x1E, 0xE4, 0x13, 0x01, 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0xE8, 0x01, 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, + 0x2E, 0xE4, 0x70, 0x00, 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, + 0x6B, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, + 0x33, 0xAE, 0x09, 0xA8, 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, + 0x6A, 0x00, 0xC0, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, + 0x2E, 0xE4, 0x07, 0x3D, 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, + 0xA0, 0x01, 0x67, 0xE1, 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, + 0xDA, 0xF7, 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, + 0xC2, 0xE0, 0x08, 0xA2, 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, + 0x8A, 0x01, 0x1A, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0x20, 0xA2, 0x2E, 0xE4, 0x4A, 0x00, 0xC2, 0xE0, 0x20, 0xA2, + 0x2E, 0xE4, 0x70, 0x00, 0x72, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x76, 0x00, + 0xFA, 0xA2, 0x77, 0x00, 0xC2, 0xE0, 0xFC, 0xA2, 0x22, 0xD0, 0x2E, 0xE4, + 0x71, 0x00, 0xC2, 0xE0, 0xC0, 0xE0, 0xA4, 0x01, 0x84, 0xE1, 0x0F, 0x27, + 0x1F, 0x04, 0xC0, 0xE0, 0x48, 0xF0, 0x4A, 0x00, 0xEE, 0xA1, 0x3D, 0x04, + 0xC0, 0xE0, 0xE8, 0xF7, 0x1C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, + 0x04, 0xE0, 0x97, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x3C, 0x04, + 0xC2, 0xE0, 0x11, 0x00, 0x3D, 0x04, 0xC0, 0xE0, 0xA9, 0x01, 0x1E, 0xE4, + 0xE0, 0x01, 0x04, 0xE0, 0xD8, 0xF7, 0xEE, 0xA1, 0xC2, 0xE0, 0x00, 0xA2, + 0x09, 0x00, 0xC2, 0xE0, 0xE8, 0xF7, 0x0D, 0x00, 0xC0, 0xE0, 0x09, 0x00, + 0x2E, 0xE4, 0x3C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x0E, 0xA8, 0x04, 0xAF, + 0x45, 0x00, 0xC0, 0xE0, 0xC2, 0xE0, 0x02, 0xA2, 0x28, 0xE4, 0x04, 0xA1, + 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x4A, 0x00, 0xE8, 0xF7, 0x02, 0xA8, + 0x48, 0xCA, 0x8E, 0xF9, 0x3D, 0x04, 0xC0, 0xE0, 0xA9, 0x01, 0x1E, 0xE4, + 0xF8, 0x01, 0x04, 0xE0, 0xD8, 0xF7, 0xEE, 0xA1, 0xC2, 0xE0, 0x00, 0xA2, + 0x09, 0x00, 0xC2, 0xE0, 0xE8, 0xF7, 0x0D, 0x00, 0xC0, 0xE0, 0x09, 0x00, + 0x2E, 0xE4, 0x3C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x01, 0xC0, 0x2E, 0xE4, + 0xF8, 0xF7, 0x28, 0xCA, 0x5E, 0x3C, 0x01, 0xC0, 0x1E, 0xF1, 0x5D, 0x3C, + 0xBE, 0xF0, 0x5E, 0x28, 0x01, 0xC0, 0xEE, 0xF0, 0x01, 0xC0, 0x8E, 0xF0, + 0x5F, 0x3C, 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, 0x5E, 0x1A, 0x5D, 0x2A, + 0x2E, 0xE4, 0x00, 0xC0, 0x5F, 0x2A, 0x01, 0xC0, 0x0B, 0x08, 0xC3, 0xE0, + 0x08, 0x08, 0xC2, 0xE0, 0x12, 0x9F, 0x02, 0xA2, 0x02, 0x08, 0x62, 0xE1, + 0x05, 0xE0, 0x12, 0x9F, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x12, 0x9F, + 0x92, 0x9F, 0x00, 0x02, 0x00, 0xA2, 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, + 0xC2, 0xE0, 0x02, 0xA2, 0x12, 0x81, 0x12, 0x9F, 0xE8, 0xF7, 0x00, 0x08, + 0xC0, 0xE0, 0x00, 0x08, 0x0E, 0xE4, 0x93, 0x13, 0x0E, 0xE4, 0x2E, 0xE4, + 0x0E, 0xE4, 0x45, 0x02, 0x0E, 0xE4, 0x41, 0x02, 0x0E, 0xE4, 0x4F, 0x02, + 0x0E, 0xE4, 0x49, 0x02, 0x0E, 0xE4, 0x57, 0x02, 0x0E, 0xE4, 0x53, 0x02, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x5B, 0x02, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xEA, 0x06, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xD2, 0x02, 0x1E, 0xE4, 0xFB, 0x06, + 0x0E, 0xE4, 0xF6, 0x02, 0x1E, 0xE4, 0x6A, 0x00, 0x1E, 0xE4, 0x02, 0x03, + 0x1E, 0xE4, 0x6A, 0x00, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xB0, 0x01, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xA7, 0x03, 0x1E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0xE6, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x7D, 0x06, + 0xEC, 0x3C, 0x6A, 0x00, 0x0E, 0xE4, 0xA9, 0x06, 0x18, 0x00, 0x05, 0xE0, + 0x41, 0x00, 0xC0, 0xE0, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0xE0, 0x11, 0xAE, + 0xEC, 0x88, 0x00, 0x01, 0x12, 0xD1, 0x00, 0x00, 0x2E, 0xE4, 0xF8, 0xF7, + 0x28, 0xCA, 0x13, 0x01, 0x33, 0x00, 0x17, 0x89, 0x34, 0x00, 0x17, 0x89, + 0x36, 0x00, 0x17, 0x89, 0x35, 0x00, 0x17, 0x89, 0x38, 0x00, 0x17, 0x89, + 0x37, 0x00, 0x17, 0x89, 0x17, 0x4D, 0x17, 0x21, 0x17, 0x81, 0x17, 0x81, + 0x62, 0xCC, 0x17, 0x4D, 0x17, 0x21, 0x60, 0xCC, 0x17, 0x21, 0x64, 0xCC, + 0x17, 0x4D, 0x17, 0x21, 0x17, 0x21, 0x2E, 0xE4, 0x72, 0xCC, 0x17, 0x4D, + 0x17, 0x4D, 0x17, 0x21, 0x72, 0xCC, 0x17, 0x4D, 0x17, 0x29, 0x90, 0xCC, + 0x17, 0x29, 0x8C, 0xCC, 0x17, 0x29, 0x92, 0xCC, 0x17, 0x29, 0x8E, 0xCC, + 0x17, 0x21, 0x98, 0xCC, 0x17, 0x29, 0x96, 0xCC, 0x17, 0x8B, 0x2E, 0xE4, + 0x9E, 0xCC, 0x17, 0x4D, 0x17, 0x8B, 0x33, 0x00, 0x17, 0x8B, 0x34, 0x00, + 0x17, 0x8B, 0x36, 0x00, 0x17, 0x8B, 0x35, 0x00, 0x17, 0x81, 0x38, 0x00, + 0x17, 0x8B, 0x37, 0x00, 0x17, 0x3D, 0x17, 0x35, 0x60, 0xC8, 0x17, 0x81, + 0x64, 0xC8, 0x17, 0x3D, 0x17, 0x35, 0x62, 0xC8, 0x17, 0x35, 0x72, 0xC8, + 0x17, 0x3D, 0x17, 0x35, 0x17, 0x35, 0x72, 0xC8, 0x2E, 0xE4, 0x17, 0x3D, + 0x17, 0x3D, 0x17, 0x35, 0x8C, 0xC8, 0x17, 0x3D, 0x17, 0x3D, 0x8E, 0xC8, + 0x17, 0x3D, 0x90, 0xC8, 0x17, 0x3D, 0x96, 0xC8, 0x17, 0x3D, 0x9E, 0xCA, + 0x15, 0x14, 0x05, 0xE0, 0x17, 0x3D, 0x98, 0xC8, 0x17, 0x35, 0x56, 0xE0, + 0x9E, 0xC8, 0x21, 0xAE, 0x0B, 0x00, 0x30, 0xD1, 0x2E, 0xE4, 0x17, 0x3D, + 0x0B, 0x15, 0x1E, 0xE4, 0x26, 0x01, 0x1E, 0xE4, 0x6A, 0x06, 0x1E, 0xE4, + 0x17, 0x04, 0x1E, 0xE4, 0x50, 0x28, 0x4A, 0xF1, 0x1A, 0x04, 0x1E, 0xE4, + 0x02, 0xA1, 0x51, 0x28, 0x14, 0xF1, 0x0C, 0xA1, 0x1E, 0xE4, 0x7D, 0x0D, + 0x1E, 0xE4, 0xE4, 0xF0, 0xE5, 0x0F, 0x18, 0xE4, 0x3F, 0x28, 0x44, 0x13, + 0xC2, 0xE0, 0x02, 0xA2, 0x89, 0x12, 0x1E, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0x70, 0x00, 0x28, 0xE4, 0xB5, 0x28, 0x2E, 0xE4, 0x70, 0x00, + 0x13, 0x3C, 0x00, 0xA2, 0x6A, 0xF0, 0xB6, 0x28, 0x1E, 0xE4, 0x2E, 0xE4, + 0xA5, 0x14, 0x1E, 0xE4, 0x02, 0xCE, 0x02, 0xA2, 0x2E, 0xE4, 0x48, 0x14, + 0x00, 0xA2, 0xF8, 0xF7, 0x02, 0xA1, 0x40, 0xA2, 0xEA, 0x3C, 0xE9, 0x3C, + 0x4C, 0xCC, 0x4A, 0xCC, 0x74, 0x00, 0xC2, 0xE0, 0x3F, 0x00, 0xC2, 0xE0, + 0x1E, 0xE4, 0xAF, 0x15, 0x1E, 0xE4, 0x2F, 0x3C, 0xB7, 0x28, 0xFA, 0xF0, + 0xB6, 0x28, 0x01, 0x16, 0x10, 0x34, 0x66, 0x00, 0xC0, 0xE0, 0x9A, 0xF0, + 0x04, 0xAE, 0x67, 0x00, 0xC0, 0xE0, 0x11, 0x3C, 0x1E, 0xE4, 0x13, 0x3C, + 0x00, 0xA2, 0x12, 0x3C, 0xB3, 0xD1, 0x0B, 0x00, 0x30, 0xD1, 0xA5, 0x14, + 0x4B, 0xD0, 0x03, 0x00, 0x3A, 0xD0, 0x01, 0x00, 0x08, 0xD0, 0x00, 0x00, + 0x4C, 0xD0, 0x01, 0x00, 0x1E, 0xE4, 0x79, 0x05, 0x1E, 0xE4, 0x00, 0x00, + 0x3B, 0x28, 0x8C, 0x0D, 0x1E, 0xE4, 0xB8, 0x12, 0x30, 0x28, 0x72, 0xCC, + 0x6B, 0x28, 0x38, 0xF0, 0x18, 0xE4, 0x30, 0x28, 0x7F, 0x0B, 0x1A, 0xE4, + 0x3F, 0x28, 0x0A, 0x07, 0x1E, 0xE4, 0xE6, 0x0B, 0x2B, 0x2C, 0x20, 0x2E, + 0x13, 0x11, 0x18, 0xE4, 0x2B, 0x3C, 0x0E, 0xB6, 0x45, 0xE0, 0x21, 0x08, + 0x48, 0x14, 0x1E, 0xE4, 0x6A, 0xF0, 0xB6, 0x28, 0xB5, 0x28, 0x5E, 0xF0, + 0x56, 0x13, 0x1E, 0xE4, 0x3B, 0x2C, 0x72, 0x14, 0x1E, 0xE4, 0x3A, 0xF0, + 0x70, 0x00, 0xC2, 0xE0, 0x3B, 0x3C, 0x02, 0xA0, 0x3B, 0x28, 0x28, 0xF0, + 0xF3, 0x00, 0x02, 0xE0, 0x2E, 0x28, 0x71, 0x00, 0xC2, 0xE0, 0x24, 0x28, + 0x00, 0x00, 0x39, 0xD0, 0x73, 0x00, 0xC2, 0xE0, 0x4A, 0xC8, 0xD5, 0x3C, + 0xD4, 0x3C, 0x00, 0xA2, 0xC2, 0xE0, 0x56, 0xE0, 0x20, 0xAE, 0x4D, 0xC8, + 0x06, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0x53, 0x00, 0x2F, 0x28, 0x81, 0x03, + 0x18, 0xE4, 0x0E, 0xA8, 0x76, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x58, 0xF0, + 0x76, 0x00, 0xC2, 0xE0, 0x08, 0xA2, 0x2E, 0xE4, 0x10, 0xC4, 0xC0, 0x05, + 0x62, 0xE1, 0x2E, 0xE4, 0x52, 0x28, 0x12, 0x3D, 0x10, 0xAE, 0xE2, 0x28, + 0x12, 0xAE, 0xE3, 0x28, 0x32, 0x81, 0x12, 0x3D, 0x04, 0xAE, 0x52, 0x28, + 0x12, 0x3D, 0x2C, 0x4C, 0x14, 0xAE, 0xE4, 0x28, 0x32, 0x81, 0x12, 0x3D, + 0x06, 0xAE, 0x2E, 0x28, 0x12, 0x3D, 0x2E, 0x4C, 0x68, 0x00, 0xC0, 0xE0, + 0x80, 0xE1, 0x12, 0x3D, 0x11, 0xD1, 0x0C, 0x00, 0x12, 0xD1, 0x20, 0xCE, + 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0xC0, 0x05, 0x1E, 0xE4, 0x2E, 0xE4, + 0x81, 0xE1, 0xF8, 0xF7, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, 0x80, 0x0D, + 0x42, 0x00, 0xC0, 0xE0, 0x07, 0x3D, 0xA0, 0x01, 0x12, 0xD1, 0x40, 0x07, + 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, + 0x00, 0xE0, 0x80, 0x01, 0x00, 0xE0, 0xF9, 0xF7, 0x40, 0x0B, 0x11, 0xD1, + 0x20, 0xCE, 0x80, 0x00, 0x03, 0x00, 0x13, 0xD1, 0xC0, 0x00, 0x12, 0xD1, + 0x1E, 0xE4, 0x04, 0xA2, 0xF9, 0xF7, 0x29, 0xCA, 0x70, 0x3C, 0x61, 0x00, + 0xC0, 0xE0, 0x99, 0x15, 0x04, 0xE0, 0x3C, 0x3C, 0x60, 0x00, 0xC0, 0xE0, + 0x62, 0x00, 0xC0, 0xE0, 0x96, 0xE0, 0x00, 0x07, 0x63, 0x00, 0xC0, 0xE0, + 0x13, 0x3D, 0x13, 0x35, 0x04, 0x07, 0x67, 0xE1, 0x13, 0x3D, 0x13, 0x35, + 0x17, 0x3D, 0x17, 0x35, 0x6C, 0x00, 0xC0, 0xE0, 0x1E, 0xE4, 0x17, 0x3D, + 0x6D, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x30, 0x28, 0x2E, 0xE4, 0xAF, 0x15, + 0x9A, 0xF0, 0xB7, 0x28, 0xFA, 0xF0, 0xB6, 0x28, 0x11, 0x3C, 0x10, 0x34, + 0x61, 0x00, 0xC0, 0xE0, 0x12, 0x3C, 0x04, 0xAE, 0x62, 0x00, 0xC0, 0xE0, + 0xA5, 0x14, 0x1E, 0xE4, 0x13, 0x3C, 0x00, 0xA2, 0x02, 0xA1, 0x6A, 0xF0, + 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xAA, 0xF0, 0x02, 0xA1, 0x9A, 0xF0, + 0x0C, 0x0B, 0x1E, 0xE4, 0x07, 0x0B, 0x1E, 0xE4, 0x4E, 0xF0, 0x50, 0x0B, + 0x1E, 0xE4, 0x7E, 0xF0, 0xB6, 0x28, 0x1E, 0xF0, 0x71, 0x0B, 0x1E, 0xE4, + 0x1E, 0xE4, 0x48, 0x14, 0x1E, 0xE4, 0x6A, 0xF0, 0x2A, 0xE4, 0xB5, 0x28, + 0x2E, 0xE4, 0x56, 0x13, 0x00, 0xA2, 0x2E, 0xE4, 0x72, 0x14, 0x1E, 0xE4, + 0x74, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x72, 0xCC, 0x74, 0x00, 0xC0, 0xE0, + 0xD9, 0x3C, 0x06, 0xA8, 0x64, 0x00, 0xC0, 0xE0, 0xDA, 0x3C, 0x04, 0xAF, + 0xC0, 0xE0, 0x71, 0x3C, 0x7B, 0x3C, 0x7A, 0x34, 0x21, 0x28, 0x20, 0x3C, + 0x21, 0x34, 0x65, 0x00, 0x10, 0xC7, 0x20, 0x2C, 0x21, 0x3C, 0x02, 0xA0, + 0x02, 0xA0, 0xFF, 0xFF, 0x08, 0xE0, 0x21, 0x7C, 0x62, 0x00, 0xC0, 0xE0, + 0x3D, 0x3C, 0x02, 0xAF, 0xBB, 0x30, 0x04, 0xAF, 0x3E, 0x30, 0x06, 0xAF, + 0x02, 0xAF, 0xBC, 0x3E, 0x71, 0x00, 0xC1, 0xE0, 0xC0, 0xE0, 0xCB, 0x30, + 0x02, 0xAF, 0xCA, 0x30, 0x16, 0x35, 0x10, 0x05, 0x66, 0xE1, 0x75, 0x00, + 0x08, 0xAF, 0x1E, 0xA0, 0x7A, 0x28, 0x16, 0x3D, 0x08, 0xAF, 0x1E, 0xA0, + 0x7B, 0x28, 0x50, 0x3C, 0x06, 0xAF, 0x63, 0x00, 0xC0, 0xE0, 0x51, 0x3C, + 0x34, 0x3C, 0x00, 0xA2, 0xC8, 0xF1, 0x30, 0x30, 0xC0, 0xE0, 0x37, 0x3C, + 0x36, 0x3C, 0x35, 0x3C, 0x23, 0x30, 0x02, 0xAF, 0x22, 0x30, 0x66, 0x00, + 0x02, 0xAF, 0x23, 0x3E, 0x22, 0x46, 0x23, 0x2A, 0x66, 0x00, 0xC0, 0xE0, + 0x46, 0x3C, 0x0E, 0xA8, 0xC9, 0x30, 0x02, 0xAF, 0x48, 0x30, 0x0A, 0xAF, + 0x0E, 0xE4, 0x23, 0x3C, 0x22, 0x44, 0x23, 0x28, 0x1E, 0xA8, 0x67, 0x00, + 0xC0, 0xE0, 0xEB, 0x04, 0x36, 0x30, 0x02, 0xAF, 0x37, 0x30, 0x55, 0x3C, + 0x34, 0x30, 0x02, 0xAF, 0x35, 0x30, 0x02, 0xAF, 0x3D, 0x28, 0x75, 0x05, + 0x08, 0xE4, 0x34, 0x28, 0x67, 0xE1, 0x75, 0x05, 0x04, 0xE4, 0x1E, 0xA1, + 0x47, 0x3C, 0x02, 0xA2, 0x20, 0xC4, 0x04, 0x02, 0x0A, 0xE4, 0x37, 0x19, + 0x08, 0xAE, 0x50, 0x28, 0x47, 0x3C, 0x02, 0xA0, 0x47, 0x28, 0xC3, 0x04, + 0x02, 0xA2, 0x88, 0x04, 0x08, 0xE4, 0x0A, 0xA1, 0x7B, 0x28, 0x47, 0x3C, + 0x0C, 0xA2, 0x55, 0x3C, 0x02, 0xE0, 0x86, 0xF0, 0x90, 0x01, 0x02, 0xE0, + 0x60, 0x01, 0x02, 0xE0, 0xB6, 0xF0, 0x90, 0x01, 0x32, 0x3C, 0x50, 0x28, + 0x9E, 0xF1, 0x16, 0xF1, 0xD9, 0x04, 0x0E, 0xE4, 0x31, 0x3C, 0x51, 0x28, + 0x51, 0x28, 0x32, 0x3C, 0x02, 0xAE, 0x50, 0x28, 0x0E, 0xE4, 0x31, 0x3C, + 0x02, 0xAF, 0x02, 0xA0, 0x32, 0x3C, 0x04, 0xAE, 0x50, 0x28, 0xD9, 0x04, + 0x31, 0x3C, 0x04, 0xAF, 0x06, 0xA0, 0x51, 0x28, 0x06, 0xAE, 0x50, 0x28, + 0xD9, 0x04, 0x0E, 0xE4, 0x06, 0xAF, 0x0E, 0xA0, 0x51, 0x28, 0x32, 0x3C, + 0x2F, 0x81, 0xD9, 0x04, 0x0E, 0xE4, 0x31, 0x3C, 0x07, 0x19, 0x08, 0xAE, + 0x51, 0x28, 0x17, 0x81, 0x04, 0xAE, 0x47, 0x28, 0x8D, 0x04, 0x08, 0xE4, + 0x17, 0x29, 0x9E, 0xE0, 0x00, 0x02, 0x00, 0xE0, 0x08, 0xAF, 0x17, 0x29, + 0x50, 0x3C, 0x08, 0xAF, 0x07, 0x29, 0x32, 0x3C, 0x17, 0x29, 0x51, 0x3C, + 0x03, 0xE0, 0x20, 0x2A, 0x00, 0xA2, 0x31, 0x3C, 0x03, 0xE0, 0x21, 0x2A, + 0x32, 0xB6, 0x30, 0x75, 0x8A, 0xF0, 0x38, 0x3C, 0x32, 0xB6, 0xE9, 0x03, + 0x02, 0xA1, 0x21, 0x28, 0x68, 0xF0, 0x55, 0x28, 0xC0, 0xE0, 0x38, 0x3C, + 0x75, 0x05, 0x08, 0xE4, 0x08, 0x30, 0x1A, 0xE0, 0x06, 0xA8, 0x69, 0x00, + 0x02, 0xA1, 0x06, 0xA8, 0x69, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x09, 0x3C, + 0x00, 0xA4, 0x02, 0xA5, 0xC0, 0xE0, 0x0A, 0x3C, 0x04, 0xAF, 0x69, 0x00, + 0x77, 0x00, 0xC0, 0xE0, 0x40, 0x3C, 0x6A, 0x00, 0x28, 0xF0, 0x80, 0x3C, + 0x08, 0xAF, 0x3F, 0x30, 0x81, 0x34, 0x6B, 0x00, 0xC0, 0xE0, 0x3F, 0x3C, + 0x81, 0x28, 0xAC, 0x30, 0x1E, 0xAF, 0x81, 0x28, 0xC0, 0xE0, 0x81, 0x3C, + 0xFF, 0x7F, 0x08, 0xE0, 0xC0, 0xE0, 0x83, 0x3C, 0x82, 0x34, 0x6C, 0x00, + 0x41, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x6D, 0x00, 0x63, 0xE1, 0x20, 0xAF, + 0x6D, 0x00, 0xC0, 0xE0, 0x6D, 0x00, 0xC0, 0xE0, 0x13, 0x31, 0x00, 0x08, + 0x51, 0x82, 0x50, 0x84, 0x13, 0x31, 0x22, 0xAF, 0x02, 0xE0, 0x01, 0xA2, + 0x52, 0x3C, 0x18, 0xE0, 0x90, 0x01, 0x02, 0xE0, 0x25, 0xB4, 0xC8, 0x00, + 0xB5, 0x30, 0x02, 0xA2, 0x44, 0x3E, 0x25, 0xB4, 0x02, 0xAF, 0x06, 0xAF, + 0x43, 0x00, 0xC0, 0xE0, 0x02, 0xAF, 0xB7, 0x30, 0x02, 0xAF, 0xB6, 0x30, + 0x06, 0xAF, 0x51, 0x2A, 0x50, 0x28, 0xDE, 0x30, 0x06, 0x84, 0x07, 0x3E, + 0x06, 0x3C, 0x07, 0xAF, 0x04, 0xA1, 0xC6, 0x3C, 0x18, 0xE0, 0x07, 0x82, + 0x51, 0x28, 0xC6, 0x3C, 0x04, 0xA2, 0x32, 0xF0, 0x50, 0x82, 0x06, 0x84, + 0x06, 0x3C, 0x02, 0xAF, 0x02, 0xA2, 0xC7, 0x3C, 0xC2, 0x3C, 0x18, 0xE0, + 0x49, 0xE0, 0x76, 0x00, 0xC0, 0xE0, 0xC5, 0x3C, 0x4A, 0xE0, 0x0D, 0x3C, + 0x10, 0xA5, 0x18, 0xA8, 0x4A, 0xE0, 0x0D, 0x3C, 0x0D, 0x4C, 0x06, 0xA8, + 0x1E, 0xA8, 0x02, 0xAF, 0x0E, 0x30, 0x08, 0xAF, 0x51, 0xF0, 0x15, 0xA1, + 0x50, 0x2A, 0x0F, 0x3C, 0x0D, 0x3C, 0x06, 0xA9, 0x18, 0xA8, 0x0D, 0x28, + 0x00, 0xA2, 0x12, 0xB6, 0x0E, 0x2A, 0x0E, 0xA2, 0x1E, 0xA8, 0xF4, 0xB7, + 0x0F, 0x28, 0x0E, 0x3C, 0x70, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0x0F, 0x3C, + 0x70, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xC0, 0xE0, 0x1F, 0x3C, + 0x00, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x3A, 0xF0, 0x04, 0xA8, 0x65, 0x00, + 0x1A, 0xE0, 0x40, 0x18, 0xB9, 0x28, 0x3B, 0x3C, 0x16, 0xE0, 0x52, 0xE0, + 0x1B, 0xE0, 0xB9, 0x2A, 0x40, 0x2A, 0x52, 0xE0, 0x1B, 0xE0, 0x40, 0x2A, + 0x03, 0xA2, 0x56, 0xE0, 0x17, 0xE0, 0x3B, 0x4E, 0x02, 0xA2, 0x2C, 0x3E, + 0x24, 0x3E, 0x11, 0xB6, 0xC0, 0xE0, 0xB9, 0x3C, 0xB9, 0x08, 0x2B, 0xF0, + 0xBE, 0x05, 0x18, 0xE4, 0x02, 0xA8, 0x65, 0x00, 0x02, 0xA2, 0x27, 0x3C, + 0x63, 0x00, 0xC0, 0xE0, 0x0D, 0x2A, 0x76, 0xB6, 0x05, 0xA8, 0x0D, 0x2A, + 0x07, 0xA1, 0x49, 0xE0, 0x76, 0xB6, 0x19, 0xA8, 0x05, 0xA1, 0x07, 0xA8, + 0x0D, 0x2A, 0x8B, 0xF0, 0x52, 0xB6, 0x09, 0xA8, 0x0D, 0x2A, 0x56, 0xB6, + 0x3F, 0x28, 0x28, 0x3C, 0x32, 0xB6, 0x30, 0x2A, 0xCE, 0x10, 0x1A, 0xE4, + 0x2C, 0x28, 0x2A, 0xE4, 0x19, 0xE4, 0x27, 0x3C, 0xCF, 0x10, 0x1E, 0xE4, + 0x24, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0xBE, 0x05, 0x60, 0x00, 0xC0, 0xE0, + 0x1F, 0x3C, 0x2C, 0x3C, 0xC2, 0xE0, 0x3A, 0x4C, 0x20, 0xAE, 0x20, 0xAF, + 0x0C, 0xAE, 0xE5, 0x28, 0x2E, 0xE4, 0x60, 0x00, 0xF9, 0xF0, 0x03, 0xA8, + 0xE1, 0x2A, 0x5D, 0x4C, 0x03, 0xA1, 0x52, 0x2A, 0xE6, 0x3C, 0x10, 0xAE, + 0x00, 0x06, 0x05, 0xE0, 0x29, 0xE4, 0xE1, 0x1A, 0x1E, 0xE4, 0x02, 0x3D, + 0x95, 0xE0, 0xE7, 0x0A, 0x05, 0xE0, 0xE6, 0x4C, 0x2E, 0xE4, 0xF5, 0x05, + 0x02, 0x3D, 0x95, 0xE0, 0xE7, 0x0A, 0x00, 0x06, 0x02, 0xE0, 0xE7, 0x3C, + 0x02, 0xA0, 0xE7, 0x28, 0xF5, 0x05, 0x1E, 0xE4, 0x68, 0xF0, 0x80, 0x00, + 0x52, 0x28, 0x2E, 0xE4, 0xE7, 0x3C, 0x00, 0xA2, 0xF5, 0x05, 0x1A, 0xE4, + 0xE1, 0x18, 0x02, 0xA1, 0x11, 0xAE, 0x11, 0xAF, 0xE1, 0x2A, 0x2E, 0xE4, + 0x12, 0x4D, 0x12, 0x21, 0xC2, 0x05, 0x62, 0xE1, 0x12, 0xD1, 0x20, 0xCE, + 0x80, 0xE1, 0x42, 0xE0, 0x13, 0xD1, 0x00, 0x06, 0x11, 0xD1, 0x80, 0x00, + 0x81, 0xE1, 0xF8, 0xF7, 0x28, 0xCA, 0x02, 0x00, 0xE8, 0x08, 0x80, 0x06, + 0x04, 0xE0, 0x2E, 0xE4, 0x3E, 0xAE, 0x7A, 0xF0, 0x58, 0x28, 0x94, 0xE0, + 0x24, 0x06, 0x1E, 0xE4, 0x0A, 0x3D, 0x12, 0x35, 0x12, 0x35, 0xB0, 0x03, + 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0x80, 0x09, 0xE0, 0x02, 0x2B, 0x0A, 0x3D, + 0xFF, 0x7F, 0x09, 0xE0, 0x02, 0x2B, 0x5B, 0xF0, 0x2E, 0xE4, 0x24, 0x06, + 0x1E, 0xE4, 0x02, 0x3F, 0x02, 0xE0, 0xE8, 0x3C, 0x04, 0xA0, 0xE8, 0x28, + 0x35, 0x06, 0x1E, 0xE4, 0x68, 0xF0, 0x80, 0x00, 0x52, 0x28, 0x2E, 0xE4, + 0xE8, 0x3C, 0x00, 0xA2, 0x35, 0x06, 0x1A, 0xE4, 0x53, 0x18, 0x02, 0xA1, + 0x11, 0xAE, 0x0D, 0xAF, 0xE1, 0x2A, 0x2E, 0xE4, 0x12, 0x4D, 0x12, 0x21, + 0xC6, 0x05, 0x62, 0xE1, 0x12, 0xD1, 0x20, 0xCE, 0x80, 0xE1, 0x42, 0xE0, + 0x13, 0xD1, 0x80, 0x06, 0x11, 0xD1, 0x80, 0x00, 0x81, 0xE1, 0xF8, 0xF7, + 0x28, 0xCA, 0x02, 0x00, 0x01, 0xA2, 0xD0, 0x05, 0x67, 0xE1, 0x2E, 0xE4, + 0x17, 0x3F, 0x45, 0xE0, 0xE1, 0x2A, 0x17, 0x3F, 0x46, 0xE0, 0xEA, 0x4E, + 0xE9, 0x22, 0x72, 0xC8, 0xE9, 0x34, 0x72, 0xC8, 0x17, 0x3D, 0x17, 0x35, + 0x67, 0xE1, 0x06, 0xAE, 0x2E, 0x28, 0xEA, 0x3C, 0x42, 0xE0, 0x17, 0x4F, + 0x17, 0x23, 0xCA, 0x05, 0x12, 0xD1, 0xD0, 0x05, 0x11, 0xD1, 0x20, 0xCE, + 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x04, 0x00, 0x40, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0xF8, 0xF7, 0x42, 0xE0, 0x17, 0xAE, 0x62, 0x00, 0x05, 0xE0, + 0x42, 0xE0, 0x03, 0xAE, 0x50, 0x16, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x02, + 0x11, 0xD1, 0x20, 0xCE, 0xE1, 0xE1, 0x03, 0x00, 0x13, 0xD1, 0x8C, 0x01, + 0x6A, 0xF0, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xAA, 0xF0, 0x02, 0xA1, + 0x9A, 0xF0, 0x02, 0xA1, 0x1E, 0xE4, 0x07, 0x0B, 0x1E, 0xE4, 0x2E, 0xE4, + 0x50, 0x0B, 0x1E, 0xE4, 0x6E, 0xF0, 0x0C, 0x0B, 0x68, 0xC8, 0x71, 0x0B, + 0x1E, 0xE4, 0x3E, 0xF0, 0x80, 0x00, 0x03, 0xE0, 0x67, 0xC8, 0x06, 0xAF, + 0xC2, 0xE0, 0x06, 0x3C, 0x42, 0xE0, 0x05, 0xAE, 0xC0, 0x00, 0x37, 0xD0, + 0x6E, 0xC8, 0x70, 0x00, 0x42, 0x00, 0xC0, 0xE0, 0x6E, 0xCC, 0xD7, 0xBA, + 0x12, 0xD1, 0x00, 0x01, 0x11, 0xD1, 0x20, 0xCE, 0xE1, 0xE1, 0x12, 0x00, + 0x13, 0xD1, 0x80, 0x00, 0xC0, 0xE0, 0x5B, 0xF0, 0x03, 0xA8, 0x2E, 0xE4, + 0xC1, 0xE0, 0x77, 0x10, 0x1E, 0xE4, 0x61, 0x00, 0xC0, 0xE0, 0x5B, 0xF0, + 0x05, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0xC3, 0x10, 0x1E, 0xE4, 0x62, 0x00, + 0xC0, 0xE0, 0x5B, 0xF0, 0x09, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x9D, 0x10, + 0x1E, 0xE4, 0x63, 0x00, 0xC0, 0xE0, 0x5B, 0xF0, 0x11, 0xA8, 0x60, 0x00, + 0xC1, 0xE0, 0x3E, 0x10, 0x1E, 0xE4, 0x64, 0x00, 0xC0, 0xE0, 0x4B, 0xF0, + 0x21, 0xA8, 0x60, 0x00, 0x60, 0x00, 0xC1, 0xE0, 0x41, 0x3C, 0x65, 0x00, + 0x66, 0x00, 0xC0, 0xE0, 0x1B, 0xF1, 0x41, 0xA8, 0xC0, 0xE0, 0x08, 0x30, + 0x1A, 0xE0, 0x06, 0xA8, 0x02, 0xA5, 0x02, 0xA1, 0x06, 0xA8, 0x66, 0x00, + 0x66, 0x00, 0xC0, 0xE0, 0x09, 0x3C, 0x00, 0xA4, 0x60, 0x00, 0xC1, 0xE0, + 0x0A, 0x3C, 0x04, 0xAF, 0x67, 0x00, 0xC0, 0xE0, 0x4B, 0xF0, 0x81, 0xA8, + 0x1E, 0xE4, 0x06, 0xA2, 0x2E, 0xE4, 0x48, 0x3C, 0x26, 0xA2, 0x0B, 0x15, + 0x1E, 0xE4, 0x31, 0x01, 0x60, 0x01, 0x67, 0xE1, 0x5F, 0x02, 0x1E, 0xE4, + 0x70, 0x01, 0x67, 0xE1, 0x70, 0x02, 0x1E, 0xE4, 0x24, 0xA2, 0x2E, 0xE4, + 0x8B, 0x02, 0x1E, 0xE4, 0x60, 0x01, 0x67, 0xE1, 0x5F, 0x02, 0x1E, 0xE4, + 0x70, 0x01, 0x67, 0xE1, 0x9F, 0x02, 0x1E, 0xE4, 0x1E, 0xE4, 0x04, 0xA2, + 0xBA, 0x02, 0x1E, 0xE4, 0x62, 0x3C, 0x27, 0x28, 0x2E, 0xE4, 0x31, 0x01, + 0xE0, 0x05, 0x61, 0xE1, 0xD3, 0x3C, 0x00, 0xA2, 0x54, 0x3C, 0x11, 0x3D, + 0x05, 0x00, 0x88, 0xE1, 0xE5, 0x3C, 0xE8, 0x3C, 0xE7, 0x3C, 0x53, 0x3C, + 0x01, 0x3C, 0xE0, 0x3C, 0xDF, 0x3C, 0xE1, 0x3C, 0x64, 0xCF, 0x2E, 0x3C, + 0x03, 0x3C, 0x02, 0x3C, 0xC2, 0xE0, 0x13, 0x01, 0xC2, 0xE0, 0x62, 0xCF, + 0x27, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x0D, 0x03, 0x16, 0x3C, 0x16, 0xB6, + 0x22, 0x2A, 0xFE, 0xA2, 0x0C, 0x03, 0xC2, 0xE0, 0x55, 0x00, 0x04, 0xE0, + 0x08, 0xE4, 0x30, 0x44, 0x16, 0xE0, 0x36, 0x28, 0x0A, 0xE4, 0x24, 0x28, + 0x23, 0xA2, 0xAB, 0x07, 0x61, 0x3E, 0x21, 0xA0, 0x28, 0x2A, 0x3B, 0x07, + 0x02, 0xA2, 0x70, 0xCC, 0x0B, 0x3C, 0x00, 0xA2, 0xDA, 0x0C, 0x18, 0xE4, + 0x22, 0x28, 0x0C, 0x3C, 0x1E, 0xE4, 0x10, 0x01, 0xC2, 0xE0, 0x02, 0xA2, + 0x08, 0xE4, 0x34, 0x0A, 0x1E, 0xE4, 0x10, 0x08, 0x0B, 0x28, 0x1A, 0xF2, + 0x02, 0x28, 0x9D, 0x07, 0x58, 0x28, 0x59, 0x08, 0x18, 0xE4, 0x02, 0xA8, + 0x5F, 0x3C, 0x06, 0xB6, 0x26, 0x1A, 0x62, 0x2A, 0x24, 0x28, 0x83, 0x08, + 0x1E, 0xE4, 0x26, 0xCF, 0x18, 0xE4, 0xE2, 0x28, 0xC6, 0x0A, 0x18, 0xE4, + 0x59, 0x4C, 0x04, 0xAE, 0x58, 0x28, 0xCA, 0x05, 0x59, 0x28, 0x6A, 0xF0, + 0x35, 0x28, 0x02, 0xCF, 0x6A, 0xCF, 0x5D, 0x4C, 0x0A, 0xAE, 0x16, 0xE0, + 0x3F, 0x28, 0x1E, 0x02, 0xC2, 0xE0, 0x02, 0xA2, 0x6E, 0x8A, 0x38, 0xF0, + 0x22, 0x4C, 0x16, 0xE0, 0x8B, 0x08, 0x18, 0xE4, 0x02, 0x28, 0x39, 0x00, + 0x63, 0x3E, 0x62, 0x3C, 0xCE, 0x2A, 0x5D, 0x28, 0x72, 0xC8, 0x8A, 0xF1, + 0x22, 0x2A, 0x3F, 0x28, 0x17, 0xA2, 0x40, 0xC4, 0x70, 0xC8, 0xAB, 0xF0, + 0x32, 0x09, 0x95, 0xE0, 0x6A, 0x04, 0x01, 0xE0, 0x08, 0xE0, 0x6E, 0x1C, + 0x06, 0x3C, 0x02, 0x09, 0x06, 0x28, 0x22, 0x2A, 0x6F, 0x3C, 0xFF, 0xFF, + 0x02, 0x2A, 0x5D, 0x28, 0x6E, 0x3C, 0x2B, 0xF0, 0x0A, 0x13, 0x1E, 0xE4, + 0xAD, 0x11, 0x19, 0xE4, 0x0E, 0xE4, 0x62, 0xCF, 0xE0, 0x4C, 0xDF, 0x20, + 0xED, 0x0C, 0x18, 0xE4, 0x22, 0x28, 0x47, 0x07, 0x36, 0x28, 0x7C, 0x08, + 0x1E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x71, 0x0C, 0x1E, 0xE4, 0x48, 0xF0, + 0x02, 0xA2, 0x2E, 0xE4, 0x7B, 0x0C, 0x1E, 0xE4, 0x4A, 0x3C, 0x00, 0xA2, + 0x10, 0x01, 0xC2, 0xE0, 0x08, 0x28, 0xDB, 0x3C, 0x02, 0xA2, 0x1E, 0xF1, + 0xCF, 0xBA, 0x7B, 0x0C, 0x1E, 0xE4, 0xDA, 0xF0, 0xC1, 0xBA, 0x88, 0xBA, + 0x4A, 0x28, 0xE0, 0xBA, 0xB3, 0xD1, 0x88, 0xBA, 0x27, 0x3C, 0x5D, 0x28, + 0x1E, 0xE4, 0x49, 0x3C, 0x00, 0xA2, 0x02, 0x00, 0x6E, 0x8A, 0x0D, 0x08, + 0x08, 0xE4, 0x34, 0x0A, 0x58, 0x28, 0xFA, 0xF1, 0x02, 0x28, 0x39, 0x00, + 0x5F, 0x3C, 0x06, 0xB6, 0x26, 0x1A, 0x62, 0x2A, 0x24, 0x28, 0x83, 0x08, + 0x1E, 0xE4, 0x26, 0xCF, 0x18, 0xE4, 0xE2, 0x28, 0xC6, 0x0A, 0x18, 0xE4, + 0x59, 0x4C, 0x04, 0xAE, 0x58, 0x28, 0xCA, 0x05, 0x59, 0x28, 0x6A, 0xF0, + 0x35, 0x28, 0x02, 0xCF, 0x6A, 0xCF, 0x5D, 0x4C, 0x0A, 0xAE, 0x16, 0xE0, + 0x1E, 0xE4, 0x1E, 0x02, 0xC2, 0xE0, 0x02, 0xA2, 0x62, 0x3C, 0xCE, 0x2A, + 0x5D, 0x28, 0xC0, 0x08, 0x08, 0xE0, 0x6E, 0x1C, 0x72, 0xC8, 0x63, 0x3E, + 0x02, 0x46, 0x3F, 0x2A, 0x6F, 0x3C, 0xFF, 0xFF, 0x1E, 0xE4, 0xAD, 0x11, + 0x19, 0xE4, 0x5D, 0x28, 0x62, 0xCF, 0xE0, 0x4C, 0xDF, 0x20, 0x0A, 0x13, + 0x49, 0x28, 0xC3, 0x07, 0x0A, 0xE4, 0x02, 0x28, 0x08, 0xE4, 0x32, 0x18, + 0x49, 0x3C, 0x02, 0xA0, 0x4A, 0x3C, 0x02, 0xA0, 0x4A, 0x28, 0xC3, 0x07, + 0x0E, 0xE4, 0xB1, 0x07, 0x08, 0xE4, 0x31, 0x18, 0x2E, 0xE4, 0x7B, 0x0C, + 0x1E, 0xE4, 0xC3, 0x07, 0x22, 0x28, 0x2A, 0xE4, 0x09, 0x2A, 0x08, 0x28, + 0x28, 0xF1, 0x2B, 0xE4, 0x02, 0x2A, 0xD9, 0xF2, 0x03, 0xA8, 0x0B, 0x3E, + 0x03, 0xAF, 0x0B, 0x2A, 0x0B, 0x2A, 0xDB, 0x3E, 0x03, 0xA2, 0x3B, 0xF0, + 0x24, 0xE4, 0x0A, 0x1C, 0x70, 0xC8, 0x29, 0xE4, 0x66, 0x3C, 0x02, 0xA2, + 0x0B, 0x3C, 0x20, 0xA2, 0x0B, 0x3E, 0x03, 0xAF, 0x0B, 0x2A, 0x2E, 0xE4, + 0xDB, 0x3E, 0x03, 0xA2, 0x3B, 0xF0, 0x03, 0xA8, 0x40, 0xC4, 0x70, 0xC8, + 0x29, 0xE4, 0x0B, 0x2A, 0x95, 0xE0, 0x6A, 0x04, 0x01, 0xE0, 0x17, 0xA2, + 0x24, 0xE4, 0x0A, 0x1C, 0x02, 0x09, 0x32, 0x09, 0x66, 0x3C, 0x02, 0xA2, + 0x0B, 0x3C, 0x20, 0xA2, 0x0C, 0x28, 0x2B, 0xE4, 0x54, 0x2A, 0x2E, 0xE4, + 0x0C, 0x3E, 0x03, 0xA0, 0x0C, 0x2A, 0x0A, 0x18, 0x03, 0xA8, 0x0B, 0x3E, + 0x03, 0xAF, 0x0B, 0x2A, 0x28, 0xE4, 0xDB, 0x3E, 0x03, 0xA2, 0x3B, 0xF0, + 0x40, 0xA9, 0x0B, 0x28, 0x0C, 0x3C, 0x02, 0xA2, 0x66, 0x3C, 0x04, 0xA9, + 0x66, 0x28, 0x0B, 0x3C, 0xE5, 0x3C, 0x16, 0xE0, 0xE5, 0x28, 0x2E, 0xE4, + 0x00, 0xA2, 0xED, 0x0C, 0x18, 0xE4, 0x22, 0x28, 0x18, 0xE4, 0x22, 0x28, + 0x7C, 0x08, 0x1E, 0xE4, 0x38, 0xD0, 0x38, 0xF0, 0x09, 0x28, 0xDA, 0x0C, + 0x1E, 0xE4, 0x27, 0x3C, 0x62, 0x28, 0x00, 0x00, 0xAA, 0xF0, 0x22, 0x44, + 0x3F, 0x28, 0xB3, 0x0B, 0x01, 0xE0, 0x17, 0xA2, 0x40, 0xC4, 0x70, 0xC8, + 0x02, 0x09, 0x32, 0x09, 0x95, 0xE0, 0x6A, 0x04, 0x2E, 0xE4, 0x02, 0x00, + 0xB3, 0xD1, 0x6E, 0x3C, 0x2E, 0x28, 0x49, 0x06, 0x19, 0xE4, 0xE4, 0x2A, + 0x90, 0xD1, 0x2E, 0xE4, 0x2E, 0x3C, 0x02, 0xA0, 0xE8, 0xF7, 0x04, 0xA8, + 0x20, 0xCB, 0x02, 0x00, 0xE1, 0x28, 0x2E, 0xE4, 0x5E, 0x3C, 0x04, 0xCB, + 0x22, 0x28, 0x36, 0x2A, 0x3F, 0x00, 0xC2, 0xE0, 0x0A, 0xE4, 0x24, 0x2A, + 0xC0, 0x08, 0x09, 0xE4, 0x0E, 0xE4, 0x79, 0x09, 0x0B, 0xE4, 0x99, 0x08, + 0x28, 0xE4, 0x24, 0x70, 0x59, 0x28, 0xA4, 0x09, 0x02, 0xAE, 0x5A, 0x4C, + 0x02, 0xAE, 0x5B, 0x28, 0x24, 0x08, 0x00, 0xA2, 0x4F, 0x3C, 0x58, 0x4C, + 0x06, 0xAE, 0x06, 0xA8, 0x5E, 0x28, 0x00, 0x3C, 0x58, 0x70, 0x5C, 0x28, + 0x00, 0x6C, 0x4F, 0x4C, 0x5E, 0x28, 0x00, 0x3C, 0x58, 0x18, 0x0A, 0xA2, + 0x18, 0xE4, 0x5A, 0x28, 0x00, 0x6C, 0x04, 0xAF, 0xF5, 0x09, 0x1A, 0xE4, + 0x58, 0x28, 0xD6, 0x09, 0x01, 0x00, 0x90, 0xD1, 0x94, 0x01, 0x77, 0x88, + 0x2E, 0xE4, 0xE8, 0xF7, 0x02, 0xA8, 0x20, 0xCB, 0x5B, 0x28, 0x28, 0xE4, + 0x24, 0x70, 0x59, 0x28, 0x58, 0x4C, 0x02, 0xAE, 0x5A, 0x4C, 0x02, 0xAE, + 0x24, 0x08, 0x24, 0x08, 0x00, 0xA2, 0x4F, 0x3C, 0x06, 0xA8, 0x5E, 0x28, + 0x00, 0x3C, 0x24, 0x08, 0x0A, 0xA2, 0x00, 0x6C, 0x4F, 0x4C, 0x06, 0xAE, + 0x04, 0xAF, 0x5E, 0x28, 0x00, 0x3C, 0x58, 0x18, 0xDB, 0x09, 0x18, 0xE4, + 0x5A, 0x28, 0x00, 0x6C, 0x3E, 0xCB, 0xE7, 0x09, 0x1A, 0xE4, 0x58, 0x28, + 0x18, 0xE4, 0x37, 0x44, 0x02, 0xA8, 0x16, 0xE0, 0x34, 0x01, 0xC3, 0xE0, + 0x01, 0xA2, 0x1F, 0x0A, 0x90, 0xD1, 0x94, 0x01, 0x77, 0x88, 0x98, 0xF0, + 0xE8, 0xF7, 0x02, 0xA8, 0x20, 0xCB, 0x01, 0x00, 0x4D, 0x2A, 0x4D, 0x3C, + 0x0C, 0xA2, 0x2E, 0xE4, 0x5F, 0x28, 0x4D, 0x3E, 0x03, 0xA1, 0x27, 0xE4, + 0x4D, 0x5C, 0x5E, 0x28, 0x00, 0x09, 0x18, 0xE4, 0x4E, 0xF7, 0x0F, 0x09, + 0x18, 0xE4, 0x02, 0xA8, 0x3A, 0xCF, 0x0C, 0xAE, 0x46, 0xE0, 0x0A, 0xA2, + 0xFE, 0x00, 0x05, 0xE0, 0x38, 0xCB, 0x3C, 0xCF, 0x80, 0x00, 0x03, 0xE0, + 0x49, 0xE0, 0x66, 0xE0, 0x1E, 0xE4, 0x2E, 0xE4, 0x8E, 0xBA, 0xF6, 0xB7, + 0x2E, 0xE4, 0x44, 0x09, 0x1E, 0xE4, 0x14, 0x09, 0x06, 0xA8, 0x4D, 0x5C, + 0x4D, 0x5C, 0x77, 0x28, 0x05, 0xE0, 0x7A, 0xF0, 0xAC, 0x02, 0x05, 0xE0, + 0x05, 0xE0, 0x3A, 0xF0, 0x06, 0xA1, 0xEC, 0x02, 0x65, 0xE1, 0x17, 0x81, + 0x9F, 0xE0, 0x2C, 0x03, 0x7C, 0xA2, 0xC2, 0x04, 0x66, 0xE1, 0x82, 0x04, + 0x46, 0xE0, 0x4D, 0x2A, 0x0A, 0xA2, 0x44, 0xCC, 0x01, 0xA2, 0x00, 0xA2, + 0x06, 0x3C, 0x0C, 0xAE, 0x06, 0x28, 0x42, 0x09, 0x84, 0xE1, 0xD6, 0x3C, + 0x38, 0xCB, 0x3C, 0xCF, 0x3A, 0xCF, 0x17, 0x4D, 0x7A, 0xF0, 0x35, 0xB4, + 0xFF, 0x0F, 0x08, 0xE0, 0xD6, 0x28, 0x01, 0xA2, 0x16, 0x3D, 0x15, 0x3F, + 0x2E, 0xE4, 0x90, 0xE1, 0xD6, 0x3C, 0x02, 0xA0, 0xC2, 0x04, 0x66, 0xE1, + 0x82, 0x04, 0x65, 0xE1, 0x84, 0xE1, 0x44, 0xCC, 0x04, 0xA1, 0xD6, 0x28, + 0x16, 0x4D, 0x18, 0xAE, 0x15, 0x29, 0x52, 0x09, 0x02, 0xA2, 0x5C, 0x09, + 0x1D, 0xE4, 0x14, 0xB9, 0x16, 0x4D, 0x18, 0xAE, 0x15, 0x4D, 0x0C, 0xAE, + 0x2E, 0xE4, 0x5C, 0x09, 0x1D, 0xE4, 0x14, 0xB9, 0x8D, 0xBA, 0x07, 0xA2, + 0x0E, 0x81, 0x6A, 0xE1, 0x30, 0xAE, 0x06, 0x29, 0x8C, 0xBA, 0x18, 0xAF, + 0x7F, 0x00, 0x02, 0xE0, 0x49, 0xE0, 0x30, 0xAF, 0x45, 0xF0, 0x50, 0xF0, + 0x7F, 0x00, 0x01, 0xE0, 0x04, 0xE0, 0x2E, 0xE4, 0x8E, 0xBA, 0x16, 0x29, + 0x3E, 0xA8, 0x06, 0x29, 0x8E, 0xBA, 0x80, 0x00, 0x8A, 0xBA, 0x0A, 0xAF, + 0x16, 0x29, 0x88, 0xBA, 0x5A, 0x4C, 0x02, 0xAE, 0x5B, 0x28, 0x2E, 0xE4, + 0x5E, 0x28, 0x4F, 0x3C, 0x58, 0x4C, 0x02, 0xAE, 0x00, 0xB9, 0x4F, 0x4C, + 0x06, 0xAE, 0x06, 0xA8, 0x5F, 0x28, 0xD6, 0x09, 0x18, 0xE4, 0x5A, 0x28, + 0x20, 0xCB, 0x01, 0x00, 0x90, 0xD1, 0x6A, 0xF0, 0x1E, 0xE4, 0x03, 0xA2, + 0xE8, 0xF7, 0x02, 0xA8, 0x5E, 0x28, 0x80, 0xBA, 0x5C, 0x28, 0xA8, 0x0C, + 0x1E, 0xE4, 0x05, 0xA2, 0x08, 0xB9, 0x04, 0xAF, 0x90, 0xD1, 0x94, 0x01, + 0x77, 0x88, 0xA8, 0x0C, 0xE8, 0xF7, 0x08, 0xA8, 0x20, 0xCB, 0x04, 0x00, + 0x2E, 0xE4, 0xA8, 0x0C, 0x1E, 0xE4, 0x01, 0xA2, 0x5B, 0x28, 0x28, 0xE4, + 0x80, 0xBA, 0x59, 0x28, 0x58, 0x4C, 0x02, 0xAE, 0x5A, 0x4C, 0x02, 0xAE, + 0x06, 0xAE, 0x06, 0xA8, 0x5E, 0x28, 0x4F, 0x3C, 0x1A, 0xE4, 0x58, 0x28, + 0x02, 0xB9, 0x4F, 0x4C, 0xA8, 0x0C, 0x1E, 0xE4, 0x03, 0xA2, 0xF5, 0x09, + 0x58, 0x18, 0x0A, 0xA2, 0x58, 0x70, 0x5C, 0x28, 0x00, 0x6C, 0x04, 0xAF, + 0x5E, 0x28, 0x00, 0x3C, 0x90, 0xD1, 0xD6, 0x09, 0x18, 0xE4, 0x5A, 0x28, + 0xE8, 0xF7, 0x02, 0xA8, 0x20, 0xCB, 0x01, 0x00, 0x77, 0x88, 0xA8, 0x0C, + 0x1E, 0xE4, 0x05, 0xA2, 0x20, 0xCB, 0x04, 0x00, 0x90, 0xD1, 0x94, 0x01, + 0x1E, 0xE4, 0x01, 0xA2, 0xE8, 0xF7, 0x08, 0xA8, 0x02, 0xA0, 0x6C, 0x28, + 0x2E, 0xE4, 0xA8, 0x0C, 0x37, 0x28, 0x2E, 0xE4, 0x82, 0xBA, 0x28, 0xB6, + 0x40, 0xA1, 0x6C, 0x28, 0xD6, 0x09, 0x0A, 0xE4, 0x2E, 0xE4, 0x82, 0xBA, + 0xE4, 0x09, 0x04, 0xE4, 0x5B, 0x28, 0x2E, 0xE4, 0x8A, 0xBA, 0x6C, 0x28, + 0x00, 0x01, 0x61, 0xE1, 0x44, 0xCC, 0x70, 0xB6, 0x40, 0xA0, 0x11, 0x29, + 0xF3, 0x09, 0x84, 0xE1, 0x0C, 0xB9, 0x40, 0xA0, 0x11, 0x29, 0x0C, 0xB9, + 0x5B, 0x28, 0x00, 0x01, 0x62, 0xE1, 0x2E, 0xE4, 0x02, 0x0A, 0x84, 0xE1, + 0x44, 0xCC, 0x70, 0xB6, 0x12, 0x29, 0x04, 0x0A, 0x1E, 0xE4, 0x12, 0x29, + 0x2E, 0xE4, 0x90, 0xE1, 0x04, 0x0A, 0x1E, 0xE4, 0x11, 0x0A, 0x04, 0xE4, + 0x1C, 0x0A, 0x0A, 0xE4, 0x02, 0xA0, 0x29, 0x5C, 0x49, 0xE0, 0x02, 0xA1, + 0x29, 0x72, 0x2A, 0x46, 0x0C, 0xB9, 0x40, 0xA0, 0x49, 0xE0, 0x12, 0xE0, + 0x02, 0xA0, 0x2E, 0xE4, 0x40, 0xA0, 0x12, 0xE0, 0x02, 0xA0, 0x29, 0x5C, + 0x2E, 0xE4, 0x29, 0x72, 0x2A, 0x46, 0x0C, 0xB9, 0x04, 0xE0, 0x2E, 0xE4, + 0x0C, 0xB9, 0x40, 0xA0, 0xC2, 0xE0, 0x02, 0xA2, 0x44, 0xCC, 0x7F, 0x01, + 0x2F, 0x0A, 0x84, 0xE1, 0x00, 0xA2, 0x34, 0x01, 0xC1, 0xE0, 0x02, 0xA0, + 0x35, 0x01, 0xC2, 0xE0, 0x3B, 0xF0, 0x80, 0xFF, 0x03, 0xE0, 0x36, 0x01, + 0x2E, 0xE4, 0x02, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x28, 0xE4, 0x01, 0x28, + 0xD6, 0x0F, 0x1E, 0xE4, 0x00, 0xA2, 0x10, 0x01, 0xC2, 0xE0, 0x02, 0xA2, + 0x59, 0x3C, 0x77, 0x3C, 0x5C, 0x3C, 0x5B, 0x3C, 0x94, 0x0F, 0x1E, 0xE4, + 0x57, 0x0A, 0x1E, 0xE4, 0x58, 0x28, 0x02, 0x2A, 0x23, 0x13, 0x1E, 0xE4, + 0x55, 0xE0, 0x30, 0x4E, 0x16, 0xE0, 0x17, 0xE0, 0x06, 0xAF, 0x27, 0x01, + 0xC0, 0xE0, 0x99, 0xF0, 0x15, 0xB6, 0x29, 0x01, 0xC1, 0xE0, 0x5C, 0x30, + 0x03, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x77, 0x3E, 0xC0, 0xE0, 0x5A, 0xF0, + 0x24, 0x28, 0x6A, 0xF2, 0x24, 0x28, 0x5B, 0x3C, 0x1A, 0xE0, 0x90, 0x01, + 0x1E, 0x01, 0xC0, 0xE0, 0x18, 0xF1, 0x16, 0xE0, 0x19, 0xE4, 0x41, 0x2A, + 0x58, 0xF0, 0x02, 0xA8, 0x01, 0x08, 0x63, 0xE1, 0x9E, 0xF0, 0xC7, 0x12, + 0x19, 0xE4, 0x41, 0x2A, 0x4B, 0xF0, 0x03, 0x2B, 0x1F, 0x2A, 0x58, 0x3C, + 0x02, 0xA2, 0xC7, 0x12, 0x5B, 0x2A, 0x58, 0x3E, 0x01, 0xA2, 0x3B, 0xF0, + 0xD3, 0x28, 0x4B, 0xF0, 0x5B, 0x3E, 0x11, 0xB6, 0x2C, 0x46, 0x3F, 0x2A, + 0xD3, 0x3C, 0x40, 0xA9, 0x1E, 0xE4, 0xEB, 0xF0, 0x27, 0x28, 0x02, 0x46, + 0xD2, 0x28, 0x2B, 0xF0, 0xD9, 0x2A, 0x47, 0x11, 0x62, 0x28, 0x2B, 0xF0, + 0x03, 0xA8, 0xD3, 0x2A, 0x62, 0x08, 0xFC, 0xA4, 0x04, 0xA5, 0x62, 0x18, + 0x02, 0x46, 0x2C, 0x46, 0x3F, 0x2A, 0x5D, 0x3C, 0xD9, 0x2A, 0x93, 0x28, + 0xDB, 0xF0, 0x27, 0x28, 0x11, 0xA8, 0xD3, 0x2A, 0xC8, 0x28, 0x2B, 0xF0, + 0x04, 0xA5, 0x63, 0x18, 0x63, 0x28, 0x2B, 0xF0, 0x5D, 0x28, 0xCE, 0x3C, + 0x63, 0x08, 0xFC, 0xA4, 0x8A, 0xF1, 0x37, 0x2A, 0x6C, 0x3C, 0x62, 0x18, + 0x2C, 0x02, 0x00, 0xE0, 0x62, 0x28, 0x7B, 0xF1, 0x6C, 0x28, 0x20, 0x00, + 0x60, 0xE1, 0x9E, 0xE0, 0x6C, 0x28, 0xBA, 0x0A, 0x0A, 0xE4, 0x37, 0x19, + 0x5D, 0x28, 0xBD, 0x0A, 0x0A, 0xE4, 0x07, 0x19, 0x0E, 0xE4, 0x44, 0xA2, + 0xBE, 0x0A, 0x0E, 0xE4, 0x6C, 0x28, 0x6C, 0x3C, 0x46, 0xA2, 0xBE, 0x0A, + 0x02, 0xAF, 0xD3, 0x28, 0x5A, 0x3C, 0x1A, 0xE0, 0x00, 0x01, 0x62, 0xE1, + 0x2E, 0xE4, 0xD3, 0x3C, 0x5B, 0x3E, 0x15, 0x2B, 0x9A, 0xE0, 0x69, 0x28, + 0x58, 0x4C, 0x5A, 0x4C, 0x0D, 0x4D, 0x15, 0x29, 0x16, 0xE0, 0x1A, 0xE0, + 0x5E, 0x4C, 0x5B, 0x4C, 0x59, 0x4C, 0x04, 0xAE, 0x58, 0x28, 0x59, 0x3C, + 0x5B, 0x2A, 0x58, 0xF2, 0x58, 0x28, 0x02, 0xCF, 0x4C, 0xCF, 0x15, 0x4D, + 0x15, 0x21, 0x4B, 0xCF, 0x4E, 0xCF, 0x15, 0x4D, 0x15, 0x21, 0xAB, 0xF0, + 0x15, 0x21, 0x50, 0xCF, 0x15, 0x4D, 0x15, 0x21, 0x01, 0x00, 0xA0, 0xD1, + 0x52, 0xCF, 0x15, 0x4D, 0x4C, 0xCB, 0xE8, 0xF7, 0x02, 0xA8, 0x40, 0xCB, + 0x4E, 0xCB, 0xAB, 0xF0, 0x12, 0x3D, 0x12, 0x35, 0x12, 0x35, 0x50, 0xCB, + 0x12, 0x3D, 0x12, 0x35, 0x12, 0x3D, 0x12, 0x35, 0x52, 0xCB, 0x12, 0x3D, + 0xA0, 0xD1, 0x2E, 0xE4, 0x69, 0x3C, 0x8A, 0xE0, 0xE8, 0xF7, 0x02, 0xA8, + 0x40, 0xCB, 0x01, 0x00, 0xCF, 0xBA, 0x2E, 0xE4, 0x5B, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x9E, 0xBA, 0x00, 0x01, 0x04, 0xE0, 0x00, 0x3C, 0x32, 0xB6, + 0xC9, 0x2A, 0x04, 0xA2, 0x9E, 0xBA, 0x20, 0x01, 0x04, 0xE0, 0xCF, 0xBA, + 0x00, 0x28, 0xE0, 0xBA, 0xE7, 0xBA, 0xC0, 0xBA, 0xC0, 0xBA, 0xE3, 0xBA, + 0xE2, 0xBA, 0x86, 0xBA, 0x9E, 0xBA, 0x20, 0x2C, 0xE0, 0xBA, 0xC1, 0xBA, + 0x1A, 0xE0, 0x02, 0xA1, 0x21, 0x28, 0xE0, 0xBA, 0x1E, 0xE4, 0x20, 0x2C, + 0x7A, 0xF0, 0x80, 0xBA, 0x4E, 0x70, 0x21, 0x28, 0x4E, 0x3C, 0x84, 0x0C, + 0x98, 0xBA, 0x7B, 0x2A, 0x7A, 0x28, 0xE0, 0xBA, 0xC0, 0xBA, 0xE0, 0xBA, + 0x99, 0xBA, 0xE0, 0xBA, 0xC0, 0xBA, 0x00, 0x70, 0x00, 0xA2, 0xE0, 0xBA, + 0x2A, 0xF0, 0x02, 0xA1, 0x00, 0x28, 0xC0, 0xBA, 0x22, 0x28, 0xC0, 0xBA, + 0xE0, 0xBA, 0xC0, 0xBA, 0x80, 0xBA, 0x23, 0x28, 0x3A, 0xF0, 0x80, 0xBA, + 0x4A, 0x0B, 0x0A, 0xE4, 0x02, 0xA1, 0x00, 0x28, 0x1E, 0xE4, 0xC0, 0xBA, + 0xC0, 0xBA, 0xC0, 0xBA, 0x2E, 0xE4, 0x6B, 0x3C, 0x72, 0xC8, 0x71, 0x0C, + 0x9E, 0xBA, 0xB0, 0x01, 0x04, 0xE0, 0xCF, 0xBA, 0x51, 0x28, 0x90, 0xF0, + 0x16, 0xA1, 0x50, 0x28, 0x1E, 0xA1, 0x3D, 0x28, 0x60, 0xF0, 0x12, 0xA1, + 0x50, 0x28, 0x1E, 0xF1, 0x02, 0xA2, 0x30, 0xF0, 0x24, 0xA1, 0x51, 0x28, + 0xD0, 0xF0, 0x2C, 0xA1, 0x70, 0xF0, 0x3C, 0xA1, 0x3D, 0x28, 0xA0, 0xF0, + 0x4E, 0xF0, 0x04, 0xA2, 0x30, 0xF0, 0x1E, 0xA0, 0x8E, 0xBA, 0x08, 0xA2, + 0x2E, 0xF0, 0x06, 0xA2, 0xB5, 0x01, 0x04, 0xE0, 0xCF, 0xBA, 0x2E, 0xE4, + 0x86, 0xBA, 0x04, 0xA2, 0xE0, 0xBA, 0x9E, 0xBA, 0xC0, 0xBA, 0xE3, 0xBA, + 0x84, 0xBA, 0x02, 0xA2, 0xCF, 0xBA, 0x2E, 0xE4, 0x71, 0x0C, 0x1E, 0xE4, + 0x24, 0x28, 0x9E, 0xBA, 0xB6, 0x01, 0x04, 0xE0, 0x2B, 0x2C, 0xAA, 0xF0, + 0x3B, 0x2C, 0x82, 0xBA, 0x20, 0x1C, 0x6E, 0xF0, 0xE0, 0xBA, 0x38, 0xF0, + 0xE0, 0xBA, 0x22, 0xF0, 0x21, 0x18, 0x46, 0xF0, 0x1E, 0xE4, 0x20, 0x2C, + 0xE0, 0xBA, 0xC0, 0xBA, 0x4E, 0x70, 0x2B, 0x2C, 0x4E, 0x3C, 0x84, 0x0C, + 0x02, 0xA1, 0x24, 0x28, 0xE0, 0xBA, 0xE0, 0xBA, 0x46, 0x28, 0x80, 0xBA, + 0x25, 0x28, 0x38, 0xF0, 0x9E, 0xE0, 0x20, 0x02, 0x00, 0xE0, 0x84, 0xBA, + 0x88, 0xBA, 0x27, 0x28, 0x26, 0x3C, 0x07, 0x29, 0x84, 0xBA, 0x28, 0x28, + 0x2A, 0xE4, 0x24, 0x28, 0x29, 0x58, 0x02, 0xA2, 0x29, 0x3C, 0x02, 0xA1, + 0x36, 0x28, 0x2E, 0xE4, 0x2A, 0x3C, 0x02, 0xA1, 0x71, 0x0C, 0x1E, 0xE4, + 0x4E, 0x0C, 0x08, 0xE4, 0x4E, 0x3C, 0x20, 0xA1, 0x61, 0x28, 0xCF, 0xBA, + 0x1E, 0xE4, 0x52, 0x28, 0x4E, 0x70, 0x02, 0xA2, 0x4E, 0x70, 0xE1, 0x28, + 0x4E, 0x3C, 0x84, 0x0C, 0x80, 0xBA, 0x48, 0x28, 0x88, 0xBA, 0x27, 0x28, + 0x2B, 0x2C, 0xAA, 0xF0, 0x3B, 0x2C, 0x2A, 0xE4, 0x20, 0x1C, 0x6E, 0xF0, + 0xE0, 0xBA, 0x38, 0xF0, 0xE0, 0xBA, 0x22, 0xF0, 0x21, 0x18, 0x46, 0xF0, + 0x1E, 0xE4, 0x20, 0x2C, 0xE0, 0xBA, 0xC0, 0xBA, 0x4E, 0x70, 0x2B, 0x2C, + 0x4E, 0x3C, 0x84, 0x0C, 0x46, 0x28, 0x82, 0xBA, 0x24, 0x28, 0xE0, 0xBA, + 0x28, 0x28, 0x2A, 0xE4, 0x24, 0x28, 0x84, 0xBA, 0x7B, 0x0C, 0x1E, 0xE4, + 0x2E, 0xE4, 0x84, 0xBA, 0x3B, 0x2C, 0x8A, 0xBA, 0x40, 0xA2, 0xCF, 0xBA, + 0xE0, 0xBA, 0x8E, 0xBA, 0xFF, 0x00, 0x08, 0xE0, 0xC0, 0xBA, 0xC0, 0xBA, + 0xC0, 0xBA, 0xC0, 0xBA, 0x84, 0xBA, 0x47, 0x28, 0xA8, 0xF0, 0x55, 0x28, + 0x27, 0x28, 0xC3, 0xBA, 0x80, 0xBA, 0x24, 0x28, 0x0E, 0xA2, 0xEE, 0xF3, + 0xC0, 0xBA, 0x88, 0xBA, 0x84, 0xBA, 0x47, 0x28, 0xE2, 0xBA, 0x84, 0xBA, + 0x34, 0x28, 0xC2, 0xBA, 0x80, 0xBA, 0x38, 0x28, 0x36, 0x28, 0x80, 0xBA, + 0x35, 0x28, 0x80, 0xBA, 0x80, 0xBA, 0x37, 0x28, 0xC2, 0xBA, 0x80, 0xBA, + 0x84, 0xBA, 0x24, 0x28, 0xC2, 0xBA, 0xE0, 0xBA, 0xE2, 0xBA, 0x80, 0xBA, + 0x25, 0x28, 0xC1, 0xBA, 0xB8, 0xF0, 0x0C, 0xA1, 0x47, 0x28, 0xC0, 0xBA, + 0x04, 0xAF, 0x7A, 0x28, 0x86, 0xBA, 0x04, 0xA2, 0x7B, 0x28, 0xE0, 0xBA, + 0x90, 0xBA, 0x02, 0xA1, 0x0A, 0xF1, 0x38, 0x28, 0x90, 0xBA, 0x04, 0xAF, + 0x16, 0xE0, 0xE9, 0x03, 0x02, 0xE0, 0x21, 0x28, 0x08, 0x07, 0x82, 0xE1, + 0x21, 0x84, 0x80, 0xBA, 0x8C, 0xBA, 0x20, 0x7C, 0x0F, 0xC7, 0x18, 0xE0, + 0x00, 0xA2, 0x82, 0xBA, 0x10, 0xAF, 0x3B, 0x2C, 0x88, 0xBA, 0x27, 0x28, + 0x36, 0x70, 0x36, 0x70, 0x36, 0x28, 0xE1, 0x3C, 0x00, 0xA2, 0xC0, 0xBA, + 0x00, 0xE0, 0x46, 0x28, 0x4E, 0x0C, 0x18, 0xE4, 0x26, 0x3C, 0x07, 0x29, + 0x9E, 0xE0, 0x20, 0x02, 0x29, 0x3C, 0x00, 0xA2, 0x28, 0x3C, 0x02, 0xA2, + 0xBA, 0xF0, 0xE1, 0x28, 0x2E, 0xE4, 0x2A, 0x3C, 0x10, 0xA1, 0x6A, 0xF0, + 0x0E, 0xA8, 0x68, 0xC8, 0x4E, 0x70, 0x00, 0xA2, 0x4E, 0x3C, 0x12, 0xE0, + 0x52, 0x28, 0xE0, 0xBA, 0xE0, 0xBA, 0x9E, 0xBA, 0xE1, 0x2A, 0x4E, 0x3C, + 0x8D, 0x0C, 0x1E, 0xE4, 0x2F, 0x06, 0x02, 0xE0, 0x52, 0x28, 0x4E, 0x72, + 0xE0, 0xBA, 0x2A, 0xF0, 0xE1, 0x28, 0x46, 0xF0, 0x88, 0xBA, 0x27, 0x28, + 0x3A, 0xF0, 0xE1, 0x28, 0xC1, 0xBA, 0x2A, 0xF0, 0xE1, 0x28, 0xE0, 0xBA, + 0x0E, 0xA8, 0x68, 0xC8, 0xC0, 0xBA, 0x2E, 0xE4, 0x4E, 0x3C, 0x12, 0xE0, + 0x10, 0xA1, 0x2A, 0xE4, 0x68, 0xC8, 0x2E, 0xE4, 0x4E, 0x70, 0xFE, 0xA2, + 0x12, 0xE0, 0x10, 0xA1, 0x2A, 0xE4, 0x0E, 0xA8, 0x2E, 0xE4, 0x4E, 0x70, + 0x00, 0xA2, 0x4E, 0x3C, 0x02, 0xAF, 0x5A, 0xF0, 0x01, 0xA2, 0x02, 0xA1, + 0x4A, 0xE0, 0x87, 0x0C, 0x08, 0xE4, 0x03, 0xA0, 0xD6, 0xF0, 0x5E, 0xA1, + 0x02, 0xA1, 0x2E, 0xE4, 0x29, 0x01, 0x02, 0xE0, 0xD6, 0xF0, 0x66, 0xA1, + 0xB6, 0xF0, 0xA4, 0x04, 0x02, 0xE0, 0xC6, 0xF0, 0xBE, 0xF0, 0xA6, 0xF0, + 0x90, 0x12, 0x02, 0xE0, 0x2E, 0xE4, 0x0E, 0xA2, 0x2E, 0xE4, 0x0C, 0xA2, + 0x2E, 0xE4, 0x16, 0xA2, 0x2E, 0xE4, 0x12, 0xA2, 0x2E, 0xE4, 0x1C, 0xA2, + 0x2E, 0xE4, 0x1A, 0xA2, 0x72, 0xCC, 0xD5, 0x4C, 0xD4, 0x20, 0x49, 0xF0, + 0xD4, 0x34, 0x72, 0xC8, 0x48, 0xF0, 0x16, 0x28, 0x00, 0xE0, 0x06, 0xAE, + 0x16, 0x28, 0xD5, 0x3C, 0x11, 0x35, 0x60, 0xC8, 0x92, 0xE0, 0x6A, 0x04, + 0x11, 0x8B, 0x34, 0x00, 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x8B, 0x33, 0x00, + 0x11, 0x8B, 0x38, 0x00, 0x11, 0x8B, 0x37, 0x00, 0x11, 0x8B, 0x35, 0x00, + 0x01, 0xE0, 0x07, 0xAE, 0x16, 0x3E, 0x36, 0x00, 0x11, 0x4D, 0x11, 0x21, + 0x93, 0xE0, 0x6A, 0x04, 0x11, 0x89, 0x34, 0x00, 0x11, 0x89, 0x60, 0xCC, + 0x11, 0x89, 0x33, 0x00, 0x11, 0x89, 0x38, 0x00, 0x11, 0x89, 0x37, 0x00, + 0x11, 0x89, 0x35, 0x00, 0x7A, 0x13, 0x1E, 0xE4, 0x2E, 0xE4, 0x36, 0x00, + 0x04, 0xE0, 0x18, 0x3C, 0x00, 0x00, 0x04, 0xE0, 0x1A, 0x3C, 0x00, 0xA2, + 0x19, 0x3C, 0x00, 0x00, 0x16, 0x3E, 0x01, 0xA2, 0x16, 0x28, 0x1B, 0x3C, + 0xA8, 0x0C, 0x1E, 0xE4, 0x01, 0xA2, 0x24, 0xE4, 0xF6, 0x0C, 0x08, 0xE4, + 0x24, 0x28, 0x2E, 0xE4, 0xEB, 0xBA, 0x8C, 0xBA, 0x6B, 0x00, 0x04, 0xE0, + 0x88, 0xBA, 0x3E, 0xA2, 0xF9, 0x0C, 0x0E, 0xE4, 0x1E, 0xE4, 0xFE, 0x0C, + 0x1E, 0xE4, 0xEB, 0xBA, 0xD4, 0x34, 0x72, 0xC8, 0x2E, 0xE4, 0x31, 0x0D, + 0x21, 0x0D, 0x0A, 0xE4, 0x1A, 0x28, 0xD5, 0x3C, 0x1C, 0x3C, 0x00, 0x00, + 0x02, 0xE0, 0x18, 0x28, 0x00, 0x00, 0x4C, 0xD0, 0x0D, 0x14, 0x1E, 0xE4, + 0x1E, 0xE4, 0x18, 0x3C, 0x00, 0x00, 0x04, 0xE0, 0x1E, 0x3C, 0x00, 0x08, + 0x04, 0xE0, 0xE3, 0x13, 0x62, 0x0D, 0x1E, 0xE4, 0x80, 0x00, 0x61, 0xE1, + 0x1C, 0x28, 0xD5, 0x3C, 0xD4, 0x34, 0x72, 0xC8, 0x1E, 0xE4, 0x18, 0xF7, + 0x1C, 0x3C, 0x02, 0xA1, 0xA8, 0x0C, 0x1E, 0xE4, 0x03, 0xA2, 0xE3, 0x13, + 0x1E, 0x3C, 0xFF, 0x07, 0x08, 0xE0, 0x70, 0xC8, 0x1E, 0xE4, 0xDF, 0xBA, + 0x80, 0x00, 0x61, 0xE1, 0xD5, 0x3C, 0xD4, 0x34, 0x72, 0xC8, 0x62, 0x0D, + 0x52, 0x0D, 0x0A, 0xE4, 0x1B, 0x28, 0x2E, 0xE4, 0x1C, 0x3C, 0x00, 0x00, + 0x02, 0xE0, 0x19, 0x28, 0x00, 0x00, 0x4C, 0xD0, 0x24, 0x14, 0x1E, 0xE4, + 0x1E, 0xE4, 0x19, 0x3C, 0x00, 0x00, 0x04, 0xE0, 0x1E, 0x3C, 0x00, 0x08, + 0x04, 0xE0, 0xF8, 0x13, 0x62, 0x0D, 0x1E, 0xE4, 0xC0, 0x00, 0x61, 0xE1, + 0x1C, 0x28, 0xD5, 0x3C, 0xD4, 0x34, 0x72, 0xC8, 0x3F, 0x0D, 0x08, 0xE4, + 0x1C, 0x3C, 0x02, 0xA1, 0x1E, 0xE4, 0x05, 0xA2, 0xF8, 0x13, 0x1E, 0xE4, + 0xFF, 0x07, 0x08, 0xE0, 0x70, 0xC8, 0xA8, 0x0C, 0xDF, 0xBA, 0xC0, 0x00, + 0x61, 0xE1, 0x1E, 0x3C, 0xD4, 0x34, 0x72, 0xC8, 0x62, 0x0D, 0x1E, 0xE4, + 0x76, 0xCC, 0x82, 0xE0, 0x2E, 0xE4, 0xD5, 0x3C, 0x01, 0xA2, 0xA8, 0x0C, + 0x1E, 0xE4, 0x01, 0xA2, 0x72, 0x0D, 0x0A, 0xE4, 0x0A, 0xAF, 0x1E, 0x28, + 0x71, 0x0D, 0x84, 0xE1, 0x44, 0xCC, 0x02, 0xA1, 0x3E, 0xA8, 0x1E, 0x28, + 0xBE, 0xBA, 0x7A, 0xC8, 0x12, 0xE0, 0x40, 0xA1, 0x1E, 0x3C, 0x2A, 0xE4, + 0x1E, 0x70, 0x1D, 0x5C, 0x7A, 0xC8, 0x1D, 0x3C, 0x2E, 0xE4, 0x39, 0x3C, + 0x00, 0xA2, 0x2E, 0xE4, 0x64, 0x00, 0x66, 0xE1, 0x02, 0x05, 0x67, 0xE1, + 0x8A, 0x0D, 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0x2E, 0xE4, 0x17, 0x3D, + 0x17, 0x35, 0x16, 0x9E, 0x9D, 0x0E, 0x1E, 0xE4, 0xDA, 0x0D, 0x1E, 0xE4, + 0x72, 0x0F, 0x1E, 0xE4, 0x23, 0x0F, 0x1E, 0xE4, 0x13, 0x23, 0x96, 0xE0, + 0x02, 0x07, 0x04, 0xE0, 0x96, 0xE0, 0x00, 0x07, 0x04, 0xE0, 0x13, 0x4F, + 0x13, 0x3D, 0x13, 0x35, 0x13, 0x4D, 0x13, 0x21, 0x13, 0x37, 0x96, 0xE0, + 0x00, 0x07, 0x04, 0xE0, 0x72, 0x00, 0xC2, 0xE0, 0x39, 0x28, 0x13, 0x3F, + 0x3C, 0x18, 0x39, 0x3C, 0x02, 0xA0, 0x3A, 0x3C, 0x00, 0x04, 0x04, 0xE0, + 0x39, 0x3C, 0x28, 0xF0, 0x0D, 0x00, 0x08, 0xD0, 0x69, 0x3C, 0x68, 0x3C, + 0x36, 0x04, 0x0A, 0xD0, 0x00, 0x04, 0x09, 0xD0, 0x06, 0x01, 0xC2, 0xE0, + 0x66, 0x3C, 0x02, 0xA2, 0x39, 0x01, 0xC0, 0xE0, 0x39, 0x01, 0xC2, 0xE0, + 0x65, 0x00, 0xC0, 0xE0, 0xDA, 0xF7, 0x04, 0xA8, 0xE2, 0x30, 0x2A, 0xE4, + 0x0E, 0xA8, 0x06, 0xAF, 0xE4, 0x30, 0x02, 0xAF, 0xE3, 0x30, 0x02, 0xAF, + 0x21, 0xCE, 0x68, 0x00, 0xC1, 0xE0, 0x80, 0xE1, 0xC0, 0x05, 0x11, 0xD1, + 0x0C, 0x00, 0x12, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x50, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x81, 0xE1, 0xCC, 0x3C, 0xFF, 0x00, + 0x08, 0xE0, 0x49, 0xE0, 0xCD, 0x3E, 0xFF, 0x00, 0x09, 0xE0, 0x11, 0xAF, + 0x02, 0xAE, 0x37, 0x28, 0xCC, 0x3E, 0xCC, 0x46, 0x06, 0xAE, 0x35, 0x4C, + 0x02, 0xAE, 0x36, 0x4C, 0xC2, 0xE0, 0x16, 0xA9, 0x08, 0xAE, 0x30, 0x4C, + 0x25, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0x01, 0xC2, 0xE0, 0x08, 0xAE, + 0x51, 0x4C, 0x50, 0x20, 0x34, 0x15, 0x1E, 0xE4, 0x00, 0xA2, 0x01, 0x01, + 0x46, 0x00, 0xC0, 0xE0, 0x02, 0x01, 0xC2, 0xE0, 0x42, 0xE0, 0x11, 0xAE, + 0x00, 0x00, 0x05, 0xE0, 0x67, 0xE1, 0x5B, 0xF0, 0x05, 0xA8, 0xCD, 0x2A, + 0xC2, 0xE0, 0x17, 0x4D, 0x17, 0x21, 0x04, 0x05, 0xC2, 0xE0, 0x06, 0xAE, + 0x2C, 0x28, 0x03, 0x01, 0x05, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x04, 0x01, + 0x1F, 0x2A, 0x75, 0x3C, 0x64, 0x00, 0xC0, 0xE0, 0x08, 0xE0, 0x08, 0xAE, + 0x08, 0xAF, 0x3B, 0xF0, 0xC1, 0xE0, 0x5B, 0xF0, 0x1F, 0x2A, 0xFF, 0xFF, + 0xC1, 0xE0, 0x6E, 0xF0, 0x0F, 0xA8, 0x44, 0x00, 0x27, 0x00, 0x09, 0xE0, + 0x21, 0xAF, 0x64, 0x00, 0x38, 0x01, 0xC2, 0xE0, 0x56, 0xE0, 0x21, 0xAE, + 0x1F, 0x2A, 0x08, 0xAE, 0x51, 0x4C, 0x50, 0x20, 0x4B, 0xF0, 0x03, 0xA8, + 0x75, 0x46, 0x03, 0xAA, 0xC2, 0xE0, 0x08, 0xAE, 0x50, 0x4C, 0x51, 0x20, + 0x7E, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x42, 0x01, 0x69, 0x00, 0xC0, 0xE0, + 0x43, 0x01, 0xC2, 0xE0, 0x11, 0x32, 0x04, 0xE0, 0x7F, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0x00, 0x21, 0x0A, 0xE0, 0x20, 0xAE, 0x20, 0xAE, 0x11, 0x92, + 0x04, 0xE0, 0x55, 0x01, 0x58, 0x01, 0xC2, 0xE0, 0x00, 0x21, 0x0A, 0xE0, + 0x0A, 0xE0, 0x20, 0xAE, 0x00, 0x10, 0x04, 0xE0, 0xC2, 0xE0, 0x56, 0x01, + 0xC2, 0xE0, 0x00, 0x00, 0xC2, 0xE0, 0x04, 0x01, 0x04, 0xE0, 0x59, 0x01, + 0x02, 0xA2, 0x57, 0x01, 0xC2, 0xE0, 0x54, 0x01, 0x04, 0xAE, 0x27, 0x28, + 0x5A, 0x01, 0xC2, 0xE0, 0x02, 0xAE, 0x49, 0xE0, 0x70, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0x04, 0xA0, 0x42, 0xE0, 0x05, 0xAE, 0x03, 0xA8, 0xCC, 0x2A, + 0x00, 0xA2, 0x71, 0x01, 0xCC, 0x2A, 0x02, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, + 0x09, 0x00, 0x0A, 0xE0, 0x3B, 0xF0, 0x05, 0xA8, 0x0A, 0xE0, 0x3B, 0xF0, + 0x09, 0xA8, 0xCC, 0x2A, 0x3B, 0xF0, 0x11, 0xA8, 0xCC, 0x2A, 0x20, 0x00, + 0x0C, 0x04, 0xC2, 0xE0, 0x40, 0x00, 0x0A, 0xE0, 0x39, 0xF0, 0x77, 0x00, + 0x04, 0xE0, 0x2C, 0x2A, 0x78, 0x01, 0xC2, 0xE0, 0x70, 0x00, 0x04, 0xE0, + 0x00, 0xA2, 0x79, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x10, 0x05, 0x66, 0xE1, + 0x13, 0x01, 0xC2, 0xE0, 0x1F, 0x01, 0xC2, 0xE0, 0x16, 0x4D, 0x16, 0x21, + 0x26, 0x01, 0xC2, 0xE0, 0x3F, 0x00, 0x04, 0xE0, 0x20, 0x03, 0xC2, 0xE0, + 0x00, 0xA2, 0x2E, 0xE4, 0xC2, 0xE0, 0x25, 0x4C, 0x02, 0xAE, 0x04, 0xA2, + 0x08, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x03, 0x03, 0xC2, 0xE0, 0x0A, 0x03, + 0xC2, 0xE0, 0x00, 0xA2, 0x04, 0xE0, 0x0D, 0x03, 0xC2, 0xE0, 0x0B, 0x03, + 0x02, 0xA2, 0x0C, 0x03, 0xC2, 0xE0, 0x55, 0x00, 0xC2, 0xE0, 0x3A, 0x28, + 0x02, 0x03, 0xC2, 0xE0, 0x02, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0x80, 0x03, + 0xA0, 0x01, 0x67, 0xE1, 0x0A, 0xF1, 0x2C, 0x28, 0x04, 0xA2, 0x51, 0x01, + 0xC3, 0xE0, 0x07, 0x2B, 0x50, 0x01, 0xC0, 0xE0, 0x50, 0x01, 0xC2, 0xE0, + 0xC2, 0xE0, 0x08, 0xA2, 0xDA, 0xF7, 0x04, 0xA8, 0x36, 0xB6, 0x30, 0x2A, + 0x00, 0xA2, 0x50, 0x01, 0x0E, 0x4C, 0x04, 0xAE, 0x32, 0xB6, 0x35, 0x2A, + 0x15, 0xA1, 0x50, 0x2A, 0x0D, 0x4C, 0x08, 0xAE, 0x80, 0x01, 0xC2, 0xE0, + 0x06, 0xA9, 0x21, 0xF0, 0xC2, 0xE0, 0x8A, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x44, 0x08, 0x02, 0xAF, 0x27, 0x28, 0x8B, 0x01, 0x42, 0xE0, 0x02, 0xAE, + 0x49, 0xE0, 0x1E, 0xA5, 0x0F, 0x29, 0x9E, 0xE0, 0x6E, 0x02, 0x00, 0xE0, + 0x06, 0x3C, 0x06, 0xA2, 0x8C, 0x01, 0xC2, 0xE0, 0x06, 0x7C, 0x0F, 0xC7, + 0x02, 0xAE, 0x07, 0x29, 0x3B, 0xF0, 0x0E, 0x2A, 0xFF, 0xFF, 0x08, 0xE0, + 0x14, 0xAE, 0x07, 0x2B, 0x2E, 0xF0, 0x49, 0xE0, 0xC2, 0xE0, 0x56, 0xE0, + 0x14, 0xAE, 0x56, 0xE0, 0x6C, 0x03, 0x00, 0xE0, 0x27, 0x28, 0x88, 0x01, + 0x00, 0xE0, 0x20, 0xAE, 0x06, 0x29, 0x9C, 0xE0, 0x0A, 0xE0, 0x20, 0xAE, + 0x1A, 0xAF, 0x00, 0x10, 0x27, 0x28, 0x89, 0x01, 0xC2, 0xE0, 0x90, 0x01, + 0x06, 0x29, 0x9C, 0xE0, 0x6C, 0x03, 0x00, 0xE0, 0xC2, 0xE0, 0x3A, 0x28, + 0x8D, 0x01, 0xC2, 0xE0, 0x36, 0xB6, 0x30, 0x2A, 0x00, 0xA2, 0x84, 0x01, + 0x02, 0xA9, 0x06, 0xAE, 0x32, 0xB6, 0x35, 0x2A, 0x16, 0xA2, 0x2E, 0xE4, + 0x85, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x06, 0xAE, 0x24, 0x4C, 0x08, 0xAE, + 0x08, 0xAE, 0x51, 0x4C, 0x50, 0x20, 0x04, 0x02, 0xC2, 0xE0, 0x00, 0xA2, + 0x05, 0x02, 0xC2, 0xE0, 0x32, 0xB6, 0x35, 0x2A, 0x00, 0xA2, 0x08, 0x02, + 0x46, 0x00, 0xC1, 0xE0, 0x10, 0x02, 0xC2, 0xE0, 0x42, 0xE0, 0x10, 0xAE, + 0x40, 0x00, 0x04, 0xE0, 0x67, 0xE1, 0x5B, 0xF0, 0x09, 0xA8, 0xCD, 0x2A, + 0xC2, 0xE0, 0x17, 0x4D, 0x17, 0x21, 0x06, 0x05, 0x04, 0xE0, 0x46, 0x00, + 0xC1, 0xE0, 0x11, 0x02, 0xCD, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x80, 0x00, + 0x08, 0x05, 0x67, 0xE1, 0x5B, 0xF0, 0x11, 0xA8, 0x12, 0x02, 0xC2, 0xE0, + 0x17, 0x4D, 0x17, 0x21, 0x02, 0xA2, 0x15, 0x02, 0xC2, 0xE0, 0x00, 0xA2, + 0x34, 0x15, 0x1E, 0xE4, 0x49, 0xE0, 0x10, 0xAE, 0x39, 0x28, 0x13, 0x02, + 0xC2, 0xE0, 0x56, 0xE0, 0x14, 0x02, 0xC2, 0xE0, 0x0B, 0x02, 0xC2, 0xE0, + 0x04, 0xE0, 0x1C, 0x02, 0xC2, 0xE0, 0x00, 0xA2, 0x13, 0x4D, 0x13, 0x21, + 0x96, 0xE0, 0x00, 0x07, 0xC2, 0xE0, 0x00, 0xA2, 0x1D, 0x02, 0xC2, 0xE0, + 0x06, 0xAE, 0x30, 0x28, 0x2E, 0xE4, 0x1E, 0x02, 0x50, 0x20, 0x00, 0xCF, + 0x02, 0xAE, 0x24, 0x4C, 0x37, 0x28, 0x60, 0xCF, 0x08, 0xAE, 0x51, 0x4C, + 0x23, 0x4C, 0x02, 0xAE, 0x22, 0x28, 0x68, 0xCF, 0x28, 0x28, 0x24, 0xCF, + 0x37, 0x4C, 0x02, 0xAE, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x46, 0xCF, + 0xCD, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0xA0, 0x00, 0x02, 0x05, 0x67, 0xE1, + 0x5B, 0xF0, 0x03, 0xA8, 0x2E, 0xE4, 0x44, 0xCF, 0x17, 0x4D, 0x17, 0x21, + 0x0C, 0xAE, 0xCE, 0x4C, 0x0C, 0xAE, 0xCE, 0x28, 0x66, 0x28, 0x15, 0x01, + 0xC2, 0xE0, 0xCE, 0x4C, 0x66, 0x28, 0x28, 0x01, 0xC2, 0xE0, 0x02, 0xA8, + 0xC2, 0xE0, 0x58, 0x28, 0x66, 0x3C, 0x02, 0xAF, 0x18, 0xE4, 0x03, 0x44, + 0x16, 0xE0, 0x14, 0x01, 0x03, 0x44, 0x2C, 0x44, 0xE3, 0x28, 0xAF, 0x0F, + 0x68, 0x28, 0x2E, 0xE4, 0x09, 0x06, 0x18, 0xE4, 0x62, 0xE1, 0x15, 0x3F, + 0x5B, 0x2A, 0x9A, 0xE0, 0x15, 0x3D, 0x15, 0x35, 0x12, 0x9E, 0x91, 0x01, + 0x15, 0x35, 0x12, 0x9E, 0xDB, 0xF0, 0x4C, 0xCF, 0x15, 0x35, 0x12, 0x9E, + 0x4E, 0xCF, 0x15, 0x3D, 0x15, 0x35, 0x12, 0x9E, 0x50, 0xCF, 0x15, 0x3D, + 0x4A, 0xCF, 0x5B, 0x28, 0x52, 0xCF, 0x15, 0x3D, 0x05, 0xA8, 0x41, 0xCB, + 0x02, 0x00, 0xA0, 0xD1, 0x04, 0xE0, 0x68, 0x3C, 0x8A, 0xE0, 0xE9, 0xF7, + 0xC2, 0xE0, 0x16, 0xB6, 0x5B, 0x2A, 0xDB, 0x06, 0x11, 0x01, 0xC0, 0xE0, + 0x2E, 0xE4, 0x09, 0x03, 0x01, 0x30, 0x18, 0x01, 0xC0, 0xE0, 0xE8, 0xF7, + 0x03, 0x30, 0x02, 0xAF, 0x02, 0x30, 0x02, 0xAF, 0x2E, 0xE4, 0x54, 0x3C, + 0x03, 0x4C, 0x54, 0x28, 0x40, 0xA2, 0xDD, 0x3C, 0x32, 0xA2, 0x2E, 0xE4, + 0x3E, 0xA2, 0x86, 0x3C, 0x04, 0xA2, 0x84, 0x3C, 0x72, 0x00, 0xC0, 0xE0, + 0x3B, 0xF0, 0xCA, 0x2A, 0x04, 0xE0, 0x87, 0x3C, 0x0C, 0xA2, 0x85, 0x3C, + 0x52, 0x2A, 0x40, 0x28, 0x88, 0x3C, 0x9C, 0x02, 0x8B, 0x3C, 0x3D, 0x28, + 0x8F, 0x3E, 0x89, 0x3C, 0xCB, 0x2A, 0x00, 0x60, 0x04, 0xE0, 0xBE, 0x3C, + 0x8C, 0x3C, 0x73, 0x00, 0xC0, 0xE0, 0x3B, 0xF0, 0x6A, 0xF0, 0x8A, 0x3C, + 0x16, 0xE0, 0x89, 0x28, 0x00, 0x10, 0x04, 0xE0, 0x89, 0x3C, 0x8B, 0x28, + 0x30, 0x75, 0x82, 0xE1, 0x21, 0x84, 0x8C, 0x3C, 0x1E, 0xE4, 0x20, 0x2E, + 0x02, 0xAE, 0x18, 0xE0, 0x80, 0x82, 0x98, 0x84, 0x98, 0x3C, 0x46, 0x12, + 0x2F, 0x12, 0x1E, 0xE4, 0x79, 0xA2, 0x18, 0xE0, 0x84, 0x2A, 0x06, 0xAE, + 0x99, 0x3C, 0x98, 0x34, 0x9F, 0x3C, 0x9E, 0x34, 0x2F, 0x12, 0x1E, 0xE4, + 0x44, 0x1A, 0x05, 0xA2, 0x8D, 0x3C, 0x02, 0xA2, 0x8F, 0x2A, 0x94, 0x3E, + 0x11, 0xA0, 0x03, 0xAE, 0xAF, 0x3E, 0xAE, 0x36, 0x13, 0xE0, 0x94, 0x5A, + 0x1E, 0xE4, 0x49, 0xF0, 0xBB, 0x2A, 0xBC, 0x28, 0x04, 0xA0, 0x90, 0x3C, + 0xDD, 0x64, 0xD6, 0x11, 0x1E, 0xE4, 0x91, 0x3C, 0x85, 0x64, 0x86, 0x60, + 0xBF, 0x3C, 0xC0, 0x34, 0x2E, 0xE4, 0xFA, 0x11, 0xBF, 0x2C, 0xC0, 0x3C, + 0x02, 0xA0, 0xC0, 0x28, 0xFF, 0xFF, 0x08, 0xE0, 0xC0, 0x7C, 0x10, 0xC7, + 0xBE, 0x18, 0x8B, 0x3C, 0x02, 0xAF, 0x02, 0xA0, 0xBF, 0x28, 0xBE, 0x3C, + 0x8B, 0x28, 0x2A, 0xE4, 0x00, 0xA2, 0x21, 0x3E, 0x20, 0x3C, 0xC0, 0x2A, + 0x30, 0x75, 0x82, 0xE1, 0x21, 0x84, 0x2B, 0x3C, 0x1E, 0xE4, 0x20, 0x2E, + 0x02, 0xAE, 0x18, 0xE0, 0x80, 0x82, 0x98, 0x84, 0x98, 0x3C, 0x46, 0x12, + 0x2F, 0x12, 0x1E, 0xE4, 0x79, 0xA2, 0x18, 0xE0, 0x84, 0x2A, 0x06, 0xAE, + 0x99, 0x3C, 0x98, 0x34, 0x9F, 0x3C, 0x9E, 0x34, 0x2F, 0x12, 0x1E, 0xE4, + 0xA3, 0x3C, 0xA2, 0x34, 0xB8, 0x3C, 0x00, 0xA2, 0x8A, 0x3C, 0x16, 0xE0, + 0x28, 0xE4, 0x89, 0x28, 0xBA, 0x3C, 0x2E, 0xE4, 0x89, 0x3C, 0x8B, 0x28, + 0x2E, 0xE4, 0x28, 0xF0, 0x46, 0xE0, 0x89, 0x2A, 0x34, 0xF0, 0x46, 0xE0, + 0xBA, 0x2A, 0xB9, 0x28, 0x89, 0x3C, 0xBA, 0x28, 0xB9, 0x3C, 0x00, 0xA2, + 0x89, 0x28, 0x2A, 0xE4, 0x3F, 0x28, 0x40, 0x3C, 0x8B, 0x2A, 0x3A, 0xF0, + 0x8A, 0x3C, 0x16, 0xE0, 0x45, 0xE0, 0xB9, 0x28, 0x89, 0x2A, 0x89, 0x3E, + 0x1E, 0xE4, 0xA7, 0x4C, 0xA6, 0x20, 0xC6, 0xF0, 0xA6, 0x10, 0xAB, 0x3C, + 0xAA, 0x34, 0x2F, 0x12, 0xA9, 0x3C, 0xA8, 0x34, 0x12, 0xE0, 0xA7, 0x1C, + 0x3F, 0x3C, 0x28, 0xF0, 0xBD, 0x3C, 0x2E, 0xE4, 0xBD, 0x2A, 0x80, 0x28, + 0x2A, 0xE4, 0x3F, 0x28, 0x21, 0x84, 0x80, 0x3E, 0x2A, 0xE4, 0x46, 0xE0, + 0x02, 0xAE, 0x18, 0xE0, 0x30, 0x75, 0x82, 0xE1, 0x98, 0x3C, 0x46, 0x12, + 0x1E, 0xE4, 0x20, 0x2E, 0x79, 0xA2, 0x18, 0xE0, 0x80, 0x82, 0x98, 0x84, + 0x99, 0x3C, 0x98, 0x34, 0x2F, 0x12, 0x1E, 0xE4, 0x2F, 0x12, 0x1E, 0xE4, + 0x84, 0x2A, 0x06, 0xAE, 0xB8, 0x3C, 0x00, 0xA2, 0x9F, 0x3C, 0x9E, 0x34, + 0x3F, 0x2A, 0x2E, 0xE4, 0xA3, 0x3C, 0xA2, 0x34, 0xBB, 0x3E, 0x01, 0xA2, + 0x42, 0xF0, 0x2B, 0xE4, 0x03, 0xA2, 0x90, 0x3C, 0xBC, 0x3C, 0x2E, 0xE4, + 0x2C, 0x28, 0x2E, 0xE4, 0x2E, 0xE4, 0xBB, 0x3E, 0x18, 0xE4, 0xAD, 0x3E, + 0x01, 0xA2, 0x8E, 0x3C, 0xA1, 0x3C, 0xA0, 0x3C, 0x00, 0xA2, 0xB8, 0x11, + 0x8D, 0x28, 0x38, 0xF2, 0x8E, 0x28, 0xDC, 0x3C, 0x90, 0x28, 0x8D, 0x3C, + 0x00, 0xA2, 0x5A, 0xF0, 0xCA, 0xF7, 0x02, 0xA1, 0x89, 0x28, 0x1E, 0xF3, + 0xAE, 0xF2, 0x90, 0x28, 0x3B, 0xF0, 0xBB, 0x2A, 0x4A, 0xE0, 0x19, 0xE0, + 0xB8, 0x82, 0x8F, 0x84, 0x1E, 0xE4, 0xA3, 0x0C, 0xA2, 0x00, 0x02, 0xAF, + 0x89, 0x2A, 0x94, 0x3E, 0x1F, 0xA2, 0x46, 0x12, 0xFF, 0xFF, 0x09, 0xE0, + 0x94, 0x7E, 0x0F, 0xC7, 0xDD, 0x64, 0x86, 0x60, 0x46, 0xE0, 0x05, 0xA4, + 0x9D, 0x3C, 0x9C, 0x3C, 0x00, 0xA2, 0x5E, 0xF1, 0x06, 0x54, 0x02, 0xAF, + 0x06, 0x30, 0xD9, 0x28, 0x93, 0x60, 0x04, 0xA1, 0x91, 0x28, 0x8A, 0xF0, + 0x2E, 0xF0, 0x66, 0xE0, 0x05, 0xA0, 0x91, 0x2A, 0x85, 0x28, 0x2B, 0xF0, + 0xAD, 0x2A, 0x91, 0x28, 0x72, 0xC8, 0x2E, 0xE4, 0xAD, 0x2A, 0x93, 0x3C, + 0xEA, 0xF0, 0x8E, 0x28, 0x03, 0x12, 0x1E, 0xE4, 0x8F, 0x7C, 0x10, 0xC7, + 0xA1, 0x4C, 0xA0, 0x20, 0x02, 0xAF, 0x02, 0xA0, 0xFF, 0xFF, 0x08, 0xE0, + 0xA2, 0x00, 0xA1, 0x4C, 0xA0, 0x20, 0x91, 0x3C, 0xB8, 0x28, 0xA3, 0x3C, + 0xA2, 0x34, 0xA3, 0x0C, 0x28, 0xF0, 0x8E, 0x28, 0xB8, 0x3C, 0x02, 0xA0, + 0x89, 0x2A, 0xF8, 0xF0, 0x8E, 0x28, 0xB8, 0x3C, 0x1E, 0xE4, 0xA7, 0x4C, + 0xA6, 0x20, 0x03, 0xA1, 0xA6, 0x10, 0xAB, 0x3C, 0xAA, 0x34, 0x2F, 0x12, + 0xA9, 0x3C, 0xA8, 0x34, 0x12, 0xE0, 0xA7, 0x1C, 0xAA, 0x12, 0xA9, 0x4E, + 0xA8, 0x22, 0xAE, 0xF0, 0x11, 0xB6, 0x06, 0xB6, 0x8A, 0x28, 0xAB, 0x1E, + 0xE1, 0x28, 0x2E, 0xE4, 0xA9, 0x3E, 0xA8, 0x36, 0xE1, 0x2A, 0xD7, 0x3C, + 0x93, 0x28, 0x38, 0xF0, 0xD1, 0x28, 0xB5, 0xF0, 0x07, 0xA0, 0x52, 0x1A, + 0xD0, 0x28, 0x03, 0xA1, 0x2B, 0xE4, 0xD2, 0x3C, 0xD2, 0x3C, 0xCF, 0x28, + 0x2B, 0xE4, 0xD2, 0x3C, 0x9E, 0x20, 0x9D, 0x4E, 0x9C, 0x22, 0x2E, 0xE4, + 0x45, 0xE0, 0xC7, 0xF0, 0x41, 0xE0, 0x9F, 0x4C, 0x9C, 0x36, 0xF5, 0xF0, + 0x93, 0x28, 0x45, 0xE0, 0x85, 0x64, 0x86, 0x60, 0x02, 0xA0, 0x9D, 0x3E, + 0x9D, 0x3E, 0x9C, 0x36, 0x8E, 0xF0, 0x93, 0x3C, 0x85, 0x64, 0x86, 0x60, + 0x02, 0xA1, 0x93, 0x28, 0xDC, 0x3C, 0x02, 0xA0, 0xDC, 0x28, 0x93, 0x3C, + 0xCB, 0xF1, 0x03, 0xA1, 0x8B, 0xF0, 0xD9, 0x2A, 0xAB, 0xF0, 0x03, 0xA1, + 0x7B, 0xF0, 0x03, 0xA1, 0x6E, 0xF1, 0xC8, 0x3C, 0x93, 0x28, 0x9E, 0xF1, + 0xDB, 0x3C, 0x00, 0xA2, 0x2A, 0xF1, 0xDB, 0x28, 0xC4, 0xF0, 0xDA, 0x18, + 0xDC, 0x28, 0x6E, 0xF0, 0x05, 0xA1, 0xD7, 0x2A, 0xDC, 0x3C, 0x00, 0xA2, + 0x66, 0xE0, 0x04, 0xA0, 0xD7, 0x28, 0x93, 0x62, 0xD7, 0x28, 0x3E, 0xF0, + 0xC8, 0x3C, 0x93, 0x3C, 0xE1, 0x28, 0xD7, 0x3C, 0xC8, 0x28, 0xC8, 0x3C, + 0xD0, 0x3C, 0xCF, 0x3C, 0xC8, 0x28, 0x78, 0xF0, 0xD1, 0x28, 0x2E, 0xE4, + 0xD2, 0x3C, 0xD1, 0x3C, 0xC8, 0x3C, 0x29, 0xF0, 0x05, 0xA8, 0xD9, 0x2A, + 0xCF, 0x28, 0xD1, 0x3C, 0xD0, 0x28, 0xD2, 0x3C, 0xC8, 0x28, 0xCF, 0x3C, + 0xD7, 0x28, 0xD0, 0x3C, 0xA0, 0x34, 0xA1, 0x0C, 0xA0, 0x00, 0x2E, 0xE4, + 0x9C, 0x00, 0x92, 0x18, 0x6F, 0x28, 0xA1, 0x3C, 0x2E, 0xE4, 0x9D, 0x3C, + 0x9C, 0x34, 0x9D, 0x0C, 0xA7, 0x1C, 0xA6, 0x10, 0xA9, 0x4C, 0xA8, 0x20, + 0x98, 0x00, 0x7D, 0x12, 0x1E, 0xE4, 0x8C, 0x84, 0x39, 0xF0, 0xAC, 0x2A, + 0x52, 0xF0, 0x99, 0x0C, 0x15, 0x12, 0x1E, 0xE4, 0xAD, 0x3E, 0x03, 0xA2, + 0x62, 0xE0, 0x07, 0xAF, 0x99, 0x4E, 0x98, 0x22, 0x8F, 0x7C, 0x10, 0xC7, + 0x9B, 0x3C, 0x9A, 0x34, 0x02, 0xAF, 0x02, 0xA0, 0xFF, 0xFF, 0x08, 0xE0, + 0x98, 0x20, 0x89, 0x84, 0x2E, 0xE4, 0x92, 0x3C, 0x87, 0x84, 0x71, 0x12, + 0x1E, 0xE4, 0x99, 0x4C, 0x03, 0xA1, 0x89, 0x2A, 0x71, 0x12, 0x1E, 0xE4, + 0x9A, 0x34, 0x2F, 0x12, 0x1E, 0xE4, 0x87, 0x0A, 0x9A, 0x20, 0xB0, 0x3C, + 0x8F, 0x28, 0x9B, 0x3C, 0x9B, 0x0C, 0x9A, 0x00, 0x04, 0xAE, 0x9B, 0x4C, + 0x08, 0xE0, 0xB0, 0x7C, 0x0F, 0xC7, 0x02, 0xAE, 0x08, 0xAF, 0x10, 0xA0, + 0x08, 0xAF, 0xFF, 0xFF, 0x9E, 0xE0, 0x88, 0x08, 0x1E, 0xA5, 0x44, 0x08, + 0x81, 0x82, 0x80, 0x84, 0x2E, 0xE4, 0x07, 0x29, 0x00, 0xA2, 0xA5, 0x3C, + 0xA4, 0x34, 0x18, 0xE0, 0x98, 0x10, 0x2E, 0xE4, 0xA7, 0x3C, 0xA6, 0x34, + 0x7F, 0xA2, 0xA7, 0x0C, 0xA6, 0x00, 0x99, 0x1C, 0xA7, 0x3C, 0xA6, 0x34, + 0x66, 0xE0, 0x31, 0xAE, 0x32, 0xF0, 0x46, 0xE0, 0xAF, 0x4E, 0xAE, 0x22, + 0xA7, 0x28, 0xA6, 0x20, 0xA7, 0x3E, 0xA6, 0x36, 0xA4, 0x22, 0x2B, 0xE4, + 0x81, 0x2A, 0x2E, 0xE4, 0x66, 0xE0, 0xA7, 0x1E, 0xA6, 0x12, 0xA5, 0x4E, + 0x03, 0xA2, 0x39, 0xF0, 0xAC, 0x2A, 0x51, 0xF0, 0x2B, 0xE4, 0x83, 0x4E, + 0x82, 0x22, 0xAD, 0x3E, 0xA7, 0x1E, 0xA6, 0x12, 0xA5, 0x4E, 0xA4, 0x22, + 0x83, 0x1E, 0x82, 0x12, 0x99, 0x0E, 0x98, 0x02, 0xB0, 0x3E, 0x2E, 0xE4, + 0x62, 0xE0, 0x01, 0xA4, 0x03, 0xA2, 0x12, 0xE0, 0x32, 0xF0, 0x01, 0xA2, + 0x0F, 0xC7, 0x20, 0xAF, 0xB1, 0x3C, 0xB4, 0x3E, 0x20, 0xAE, 0x20, 0xAF, + 0xB2, 0x3C, 0xB0, 0x7C, 0xB3, 0x3C, 0xB0, 0x7C, 0x0F, 0xC7, 0xB1, 0x4C, + 0x2B, 0xE4, 0xB4, 0x2A, 0xB3, 0x4C, 0xB2, 0x20, 0xB1, 0x3E, 0xB0, 0x36, + 0x2E, 0xE4, 0x12, 0xE0, 0xB1, 0x4E, 0xB0, 0x22, 0xB2, 0x3E, 0x01, 0xA2, + 0xB2, 0x2A, 0x61, 0xF0, 0x45, 0xE0, 0xB2, 0x5A, 0x75, 0xF7, 0x21, 0xA1, + 0xB2, 0x3E, 0x03, 0xA0, 0x2E, 0xE4, 0x00, 0xA2, 0x39, 0xF0, 0xB2, 0x2A, + 0x01, 0xA2, 0x45, 0xCC, 0xB2, 0x3E, 0x03, 0xA1, 0xB3, 0x2A, 0x6E, 0x12, + 0x84, 0xE1, 0xB3, 0x3E, 0xB1, 0x4E, 0xB0, 0x22, 0xB3, 0x3E, 0x03, 0xAE, + 0x13, 0xE0, 0x61, 0xF0, 0x45, 0xE0, 0xB2, 0x5A, 0xB3, 0x3E, 0x03, 0xA0, + 0xB3, 0x2A, 0x4A, 0xE0, 0xB3, 0x28, 0xB2, 0x3E, 0x03, 0xA1, 0xB2, 0x2A, + 0x08, 0xE0, 0xB1, 0x34, 0x02, 0xAE, 0x2E, 0xE4, 0xB1, 0x82, 0xB0, 0x3C, + 0x02, 0xAF, 0xFF, 0xFF, 0x1C, 0xE0, 0xB0, 0x82, 0x1E, 0xAE, 0x18, 0xE0, + 0x08, 0xE0, 0xB1, 0x34, 0x02, 0xAE, 0x2E, 0xE4, 0xB0, 0x82, 0xB0, 0x3C, + 0x02, 0xAF, 0xFF, 0xFF, 0x1C, 0xE0, 0xB1, 0x82, 0x1E, 0xAF, 0x18, 0xE0, + 0xC3, 0x3C, 0xC1, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x03, 0x29, 0x00, 0x08, + 0x63, 0xE1, 0xC4, 0x3C, 0x00, 0xA2, 0xC6, 0x3C, 0x02, 0xA2, 0xBA, 0xF0, + 0x50, 0x82, 0xA4, 0xCC, 0x51, 0x28, 0xC5, 0x3C, 0x51, 0x2A, 0x7E, 0xF1, + 0xC7, 0x3C, 0x18, 0xE0, 0x06, 0x3C, 0x07, 0xAF, 0x06, 0xAF, 0x50, 0x28, + 0x18, 0xE0, 0x07, 0x82, 0x06, 0x84, 0x07, 0x3E, 0x04, 0xA2, 0x32, 0xF0, + 0x04, 0xA1, 0xC6, 0x3C, 0x51, 0x28, 0xC5, 0x3C, 0x02, 0xA2, 0xC6, 0x3C, + 0x18, 0xE0, 0x50, 0x82, 0xA4, 0xCC, 0x02, 0xAF, 0x00, 0xA2, 0xC2, 0x3C, + 0xC7, 0x28, 0xC7, 0x3C, 0x2E, 0xE4, 0x03, 0x3D, 0x03, 0x08, 0x63, 0xE1, + 0x2A, 0xE4, 0x2C, 0x28, 0x42, 0x3C, 0x00, 0xA2, 0x00, 0x08, 0x63, 0xE1, + 0x28, 0xE4, 0x1F, 0x28, 0x02, 0xA0, 0xC5, 0x28, 0x28, 0xE4, 0x03, 0x29, + 0xC5, 0x28, 0x2E, 0xE4, 0xC5, 0x3C, 0x02, 0xA8, 0xD2, 0xF3, 0x41, 0x18, + 0x42, 0x28, 0xF8, 0xF1, 0xC1, 0x28, 0xA4, 0xF3, 0xC1, 0x18, 0x53, 0x28, + 0xC3, 0x28, 0xB4, 0xF0, 0xC7, 0x18, 0xC6, 0x08, 0x20, 0xAF, 0xC6, 0x7C, + 0x0F, 0xC7, 0x02, 0xA0, 0x42, 0x3C, 0x41, 0x28, 0xC1, 0x3C, 0xC3, 0x3C, + 0x42, 0x3C, 0x02, 0xA0, 0x42, 0x28, 0xAE, 0xF2, 0xC7, 0x7C, 0x0F, 0xC7, + 0xC6, 0x08, 0xC1, 0x28, 0x42, 0x28, 0x0E, 0xF2, 0xC1, 0x3C, 0x20, 0xAF, + 0xC2, 0x18, 0x53, 0x28, 0xF2, 0xF1, 0x41, 0x18, 0x52, 0x18, 0xC6, 0x08, + 0xC2, 0x28, 0xC4, 0xF1, 0x0F, 0xC7, 0x02, 0xA0, 0xC4, 0x28, 0xC4, 0xF0, + 0xC7, 0x08, 0xC4, 0x3C, 0x20, 0xAF, 0xC6, 0x7C, 0xBE, 0xF0, 0x42, 0x3C, + 0x41, 0x28, 0xC2, 0x3C, 0xC2, 0x28, 0x42, 0x3C, 0x02, 0xA0, 0x42, 0x28, + 0x20, 0xAF, 0x52, 0x7C, 0x0F, 0xC7, 0xC6, 0x08, 0x2E, 0xE4, 0x02, 0xA2, + 0x1E, 0xF0, 0xC2, 0x3C, 0x2A, 0xF1, 0x02, 0x28, 0x2E, 0xE4, 0x00, 0xA2, + 0x02, 0xA0, 0xE1, 0x28, 0x01, 0x00, 0x88, 0xD1, 0x02, 0xA0, 0xDF, 0x28, + 0x64, 0xCF, 0xE1, 0x3C, 0xB3, 0xD1, 0x78, 0xF0, 0x50, 0x18, 0xDF, 0x3C, + 0x02, 0xA0, 0xE0, 0x28, 0xDF, 0x3C, 0x04, 0x00, 0x53, 0x28, 0x2A, 0xE4, + 0x03, 0x28, 0xE0, 0x3C, 0x61, 0xE1, 0x2E, 0xE4, 0x53, 0x3C, 0x02, 0xA0, + 0x22, 0xD0, 0xE5, 0x05, 0x62, 0xE1, 0xE4, 0x05, 0x09, 0x29, 0x2C, 0x13, + 0x84, 0xE1, 0x04, 0x00, 0x02, 0xAE, 0x3E, 0xA8, 0x6C, 0x28, 0x0A, 0x3D, + 0x61, 0xE1, 0x58, 0x4C, 0x02, 0xAE, 0x5A, 0x4C, 0x2C, 0x46, 0x3F, 0x2A, + 0x01, 0x3D, 0xE0, 0x05, 0x58, 0x30, 0x01, 0x29, 0xE5, 0x05, 0x61, 0xE1, + 0x02, 0xAF, 0x5A, 0x30, 0x02, 0xAF, 0x29, 0xE4, 0x2E, 0xE4, 0x6C, 0x3C, + 0x3E, 0xAF, 0x3E, 0xAE, 0x60, 0x00, 0xC0, 0xE0, 0x13, 0x3C, 0x00, 0xA2, + 0x61, 0x00, 0xC0, 0xE0, 0x11, 0x3C, 0x10, 0x34, 0x69, 0x13, 0x1E, 0xE4, + 0x12, 0x3C, 0x04, 0xAE, 0x2A, 0x20, 0x71, 0xD0, 0xA5, 0x14, 0x1E, 0xE4, + 0x00, 0x00, 0x30, 0xD0, 0x2E, 0xE4, 0x81, 0xE1, 0x00, 0x00, 0x33, 0xD0, + 0x00, 0x00, 0x34, 0xD0, 0x7F, 0x00, 0x36, 0xD0, 0x00, 0x00, 0x35, 0xD0, + 0x30, 0xA1, 0x72, 0xC8, 0x00, 0x00, 0x37, 0xD0, 0x70, 0xCC, 0x30, 0xA1, + 0x70, 0xC8, 0x72, 0xCC, 0x34, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x2E, 0xE4, + 0x35, 0xD0, 0x00, 0x00, 0x33, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0x7F, 0x00, + 0x36, 0xD0, 0x00, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x38, 0xD0, 0x00, 0x00, + 0x00, 0xE0, 0x10, 0xA2, 0x2E, 0xE4, 0x72, 0x3C, 0x03, 0xC7, 0x00, 0xA2, + 0x94, 0xE0, 0x6A, 0x04, 0x02, 0xC7, 0x80, 0x00, 0x04, 0xE0, 0x12, 0x3D, + 0x12, 0x3D, 0x3F, 0x00, 0x00, 0xE0, 0x12, 0x3D, 0x04, 0xE0, 0x12, 0x3D, + 0x03, 0xC7, 0x00, 0xA2, 0x00, 0xE0, 0x12, 0x3D, 0x02, 0xC7, 0xC0, 0x00, + 0x16, 0x28, 0x2E, 0xE4, 0x12, 0x3D, 0x3F, 0x00, 0x02, 0xA1, 0xBA, 0xF0, + 0x02, 0xA1, 0x6A, 0xF0, 0x80, 0x00, 0x04, 0xE0, 0x70, 0xE4, 0xEA, 0xF0, + 0x00, 0x00, 0x4C, 0xD0, 0xAB, 0x13, 0x1E, 0xE4, 0x4C, 0xD0, 0x0D, 0x14, + 0x1E, 0xE4, 0x70, 0xE4, 0x24, 0x14, 0x1E, 0xE4, 0x70, 0xE4, 0x00, 0x00, + 0x24, 0xCE, 0x70, 0xE4, 0x00, 0x00, 0x4C, 0xD0, 0x14, 0x3C, 0x82, 0xE0, + 0x00, 0x00, 0x11, 0xD1, 0x27, 0xD0, 0x92, 0xE0, 0x48, 0x00, 0x04, 0xE0, + 0x27, 0xD0, 0xB1, 0x14, 0x1E, 0xE4, 0x00, 0x00, 0x13, 0x2E, 0x11, 0x4C, + 0x10, 0x20, 0x01, 0x00, 0x04, 0x20, 0x20, 0xCE, 0x42, 0xE0, 0x11, 0xAE, + 0xC0, 0xE0, 0x01, 0x9F, 0x11, 0x81, 0x05, 0x4C, 0x20, 0xA0, 0x02, 0xAE, + 0x06, 0xA8, 0x43, 0x00, 0x13, 0x2C, 0xF8, 0xF7, 0x28, 0xCA, 0x26, 0xCE, + 0x12, 0x1C, 0x13, 0x3C, 0x02, 0x00, 0x00, 0xE0, 0x03, 0xA2, 0x5B, 0xF0, + 0xB6, 0x2A, 0x84, 0xF0, 0x13, 0x3C, 0x2E, 0xF0, 0x74, 0x00, 0xC3, 0xE0, + 0x11, 0xAE, 0x13, 0x2E, 0x11, 0x4C, 0x10, 0x20, 0x05, 0x3C, 0x04, 0x34, + 0x01, 0x9F, 0x42, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, 0x92, 0xE0, 0x14, 0x28, + 0xA4, 0x00, 0x01, 0xE0, 0x18, 0x2A, 0x46, 0x00, 0x11, 0xD1, 0x20, 0xCE, + 0x42, 0xE0, 0x11, 0xAE, 0x13, 0xD1, 0x40, 0x00, 0x12, 0xD1, 0x80, 0x00, + 0x18, 0x28, 0xF8, 0xF7, 0x28, 0xCA, 0x13, 0x00, 0x2E, 0xE4, 0x18, 0x3C, + 0x01, 0x00, 0x00, 0xE0, 0x17, 0x4D, 0x17, 0x25, 0x04, 0x07, 0x67, 0xE1, + 0x20, 0xCE, 0x42, 0xE0, 0x11, 0xAE, 0x19, 0x2E, 0x40, 0x00, 0x12, 0xD1, + 0xC0, 0x00, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, 0x13, 0x00, 0x13, 0xD1, + 0x19, 0x3C, 0x01, 0x00, 0x00, 0xE0, 0x19, 0x28, 0x18, 0x2A, 0x46, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0xA4, 0x00, 0x01, 0xE0, + 0x12, 0xD1, 0x80, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x12, 0x00, + 0x13, 0xD1, 0x40, 0x00, 0x01, 0x00, 0x00, 0xE0, 0x18, 0x28, 0xF8, 0xF7, + 0x2E, 0xE4, 0x1A, 0x3C, 0x02, 0xA2, 0x18, 0x3C, 0x04, 0x07, 0x67, 0xE1, + 0xE8, 0xF1, 0x2F, 0x28, 0x11, 0xAE, 0x19, 0x2E, 0x17, 0x4D, 0x17, 0x25, + 0xC0, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0xE0, 0x12, 0x00, 0x13, 0xD1, + 0x40, 0x00, 0x12, 0xD1, 0x00, 0xE0, 0x19, 0x28, 0xF8, 0xF7, 0x28, 0xCA, + 0x06, 0x07, 0x67, 0xE1, 0x19, 0x3C, 0x01, 0x00, 0x61, 0xF0, 0x19, 0x1E, + 0x05, 0xAE, 0x07, 0x2F, 0x00, 0xA2, 0x2F, 0x3C, 0x1B, 0x3C, 0x02, 0xA2, + 0x2E, 0xE4, 0x1B, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x03, 0xE0, 0x67, 0xC8, + 0x06, 0xAF, 0x68, 0xC8, 0x4C, 0x3C, 0x42, 0xE0, 0x05, 0xAE, 0x00, 0x00, + 0xD7, 0xBA, 0x80, 0x00, 0x37, 0xD0, 0x6E, 0xC8, 0x1E, 0xE4, 0x80, 0x00, + 0x04, 0xE0, 0x6E, 0xCC, 0x92, 0xE0, 0x49, 0x00, 0x04, 0xE0, 0xAB, 0x13, + 0x45, 0xE0, 0x11, 0x4E, 0x10, 0x22, 0x01, 0x9E, 0x4C, 0x18, 0x00, 0x02, + 0x04, 0xE0, 0xB9, 0xF0, 0x10, 0x20, 0x45, 0xE0, 0x11, 0xAE, 0x12, 0x2A, + 0x4C, 0x08, 0x4E, 0xF0, 0x42, 0xE0, 0x11, 0x4C, 0x04, 0x34, 0x01, 0x9F, + 0x00, 0x02, 0x02, 0xE0, 0x78, 0xCC, 0x66, 0xC8, 0x2E, 0xE4, 0x05, 0x3C, + 0x00, 0x00, 0x11, 0xD1, 0x7A, 0xCC, 0x60, 0xC8, 0x27, 0xD0, 0x92, 0xE0, + 0x48, 0x00, 0x04, 0xE0, 0x27, 0xD0, 0xB1, 0x14, 0x1E, 0xE4, 0x00, 0x00, + 0x13, 0x2E, 0x11, 0x4C, 0x10, 0x20, 0x01, 0x00, 0x04, 0x20, 0x20, 0xCE, + 0x42, 0xE0, 0x11, 0xAE, 0x80, 0x00, 0x12, 0xD1, 0x11, 0x81, 0x05, 0x4C, + 0x02, 0xAE, 0x06, 0xA8, 0x43, 0x00, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, + 0x26, 0xCE, 0x20, 0xA0, 0x03, 0xE0, 0x67, 0xC8, 0x06, 0xAF, 0x68, 0xC8, + 0x10, 0x22, 0x42, 0xE0, 0x05, 0xAE, 0x00, 0x00, 0x11, 0xAE, 0x13, 0x2E, + 0x42, 0xE0, 0x11, 0x4E, 0x05, 0x3C, 0x04, 0x34, 0x01, 0x9F, 0x42, 0xE0, + 0x13, 0x2E, 0x11, 0x4C, 0x10, 0x20, 0x2E, 0xE4, 0x49, 0x00, 0x05, 0xE0, + 0x42, 0xE0, 0x11, 0xAE, 0x05, 0x3C, 0x04, 0x34, 0x01, 0x9F, 0x93, 0xE0, + 0x09, 0xA8, 0x43, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0xB6, 0x2A, 0x15, 0x3C, + 0x00, 0xA2, 0x29, 0xE4, 0x12, 0x2E, 0x10, 0xAE, 0x13, 0x2C, 0xEB, 0xF2, + 0x00, 0x02, 0x03, 0xE0, 0x45, 0xE0, 0x11, 0xAE, 0x74, 0x00, 0xC3, 0xE0, + 0x03, 0xA2, 0x23, 0xE4, 0x49, 0x00, 0xC2, 0xE0, 0x05, 0x4C, 0x04, 0x20, + 0x11, 0x4C, 0x10, 0x20, 0x13, 0x3C, 0x00, 0xA2, 0x2B, 0xE4, 0xDE, 0x2A, + 0x05, 0x3C, 0x04, 0x34, 0x00, 0x80, 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, + 0x0A, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x02, 0xA2, 0x5D, 0x00, + 0xC2, 0xE0, 0x00, 0x80, 0x09, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0x00, 0xCE, + 0x04, 0x00, 0xC0, 0xE0, 0xC9, 0xF7, 0x00, 0x80, 0x05, 0x4C, 0x04, 0x24, + 0x2E, 0xE4, 0x98, 0xF7, 0x2D, 0x26, 0x43, 0x3E, 0x2D, 0x36, 0x81, 0x9E, + 0x12, 0x2C, 0x41, 0xF0, 0x45, 0xE0, 0x43, 0x4E, 0x00, 0x02, 0x03, 0xE0, + 0x41, 0xE0, 0x10, 0xAE, 0xC0, 0xE0, 0x08, 0xF7, 0x15, 0x28, 0x21, 0xE4, + 0xBA, 0xF6, 0x00, 0x80, 0x08, 0xE0, 0x5C, 0x00, 0x00, 0x80, 0x0A, 0xE0, + 0x5D, 0x00, 0xC0, 0xE0, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, 0xC2, 0xE0, + 0x09, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0x15, 0x3C, 0x04, 0xA2, 0xCE, 0xF5, + 0xC9, 0xF7, 0x00, 0x80, 0x72, 0xCC, 0x00, 0xA2, 0x9E, 0xCC, 0x22, 0xAE, + 0x10, 0xA8, 0x04, 0xE0, 0x8E, 0xCC, 0x8C, 0xCC, 0x4A, 0xCE, 0x22, 0x93, + 0x0A, 0xE0, 0x20, 0xAE, 0x90, 0xE1, 0x90, 0xE1, 0x03, 0x00, 0x6F, 0xD1, + 0x2E, 0xE4, 0x00, 0x00, 0x6F, 0xD1, 0x90, 0xE1, 0x02, 0xA8, 0x50, 0xCA, + 0x50, 0xCE, 0x60, 0xA2, 0x04, 0xE0, 0x2E, 0xE4, 0x00, 0xC0, 0xEA, 0xF7, + 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0xCE, 0x20, 0x00, 0x2E, 0xE4, 0x02, 0xA8, + 0x06, 0xAF, 0x44, 0x00, 0x58, 0xF0, 0x80, 0xA8, 0x60, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x0E, 0xA8, 0x44, 0x00, 0xC0, 0xE0, 0x0E, 0xA8, 0x20, 0xAF, + 0x60, 0x00, 0xC0, 0xE0, 0x0D, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, + 0xFF, 0x00, 0x08, 0xE0, 0x56, 0xE0, 0x03, 0xAE, 0x1B, 0xAF, 0x44, 0x00, + 0xC1, 0xE0, 0x2E, 0xE4, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x07, 0xA8, + 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, 0x1B, 0xAF, 0x2E, 0xE4, 0x01, 0xA2, + 0x2E, 0xE4, 0x13, 0xA2, 0x02, 0xA8, 0x20, 0xAF, 0x44, 0x00, 0xC0, 0xE0, + 0x60, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x3E, 0xA8, 0x61, 0x00, + 0xC0, 0xE0, 0x2A, 0xE4, 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, + 0xC2, 0xE0, 0x02, 0xA2, 0x9E, 0xE0, 0x00, 0x05, 0x02, 0xA8, 0x20, 0x04, + 0xC0, 0xE0, 0x0D, 0x04, 0x04, 0xAF, 0x30, 0x15, 0x1E, 0xE4, 0xDA, 0xF7, + 0x45, 0x15, 0x1E, 0xE4, 0x3D, 0x15, 0x1E, 0xE4, 0x1E, 0xE4, 0x1E, 0xA8, + 0x7B, 0x15, 0x0B, 0xE4, 0x20, 0xAE, 0x56, 0xE0, 0x09, 0xAE, 0x4A, 0x15, + 0xFF, 0x1F, 0x09, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, 0xDB, 0x15, 0x1E, 0xE4, + 0x17, 0x9F, 0x56, 0xE0, 0x22, 0xD0, 0x62, 0x00, 0x64, 0xE1, 0x17, 0x9F, + 0x14, 0x9E, 0x8C, 0x15, 0x84, 0xE1, 0x02, 0x00, 0x22, 0xD0, 0x7A, 0x00, + 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x94, 0x15, 0x84, 0xE1, 0x02, 0x00, + 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, 0x41, 0x00, 0xC0, 0xE0, + 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0x20, 0x00, 0x05, 0xE0, + 0x00, 0xE0, 0x5E, 0xF8, 0x40, 0x07, 0x11, 0xD1, 0x20, 0xCE, 0x40, 0x0B, + 0x11, 0xD1, 0x80, 0x01, 0x13, 0x01, 0xEC, 0x88, 0xC0, 0x00, 0x12, 0xD1, + 0x70, 0x28, 0x2E, 0xE4, 0xF9, 0xF7, 0x29, 0xCA, 0x24, 0xE4, 0x02, 0xA1, + 0x3C, 0x28, 0x94, 0xE0, 0x1E, 0xE4, 0x0C, 0xC4, 0x49, 0xE0, 0x92, 0xE0, + 0xA4, 0xCC, 0x8E, 0xF7, 0x82, 0xE0, 0xBB, 0x15, 0x40, 0x07, 0x00, 0xE0, + 0x18, 0xE0, 0x86, 0xC7, 0x9C, 0xE0, 0x00, 0x04, 0x00, 0xE0, 0x9A, 0xE0, + 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, 0x07, 0xAE, 0x1E, 0xE4, 0x04, 0xAF, + 0x34, 0x15, 0x1E, 0xE4, 0x42, 0xE0, 0x85, 0xE0, 0x20, 0xAE, 0x3D, 0x15, + 0x17, 0x9F, 0xD7, 0x15, 0x1E, 0xE4, 0x17, 0x9F, 0x50, 0x20, 0x2E, 0xE4, + 0xE6, 0x15, 0x1E, 0xE4, 0x50, 0x20, 0x2E, 0xE4, 0x08, 0xAE, 0x51, 0x4C, + 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x51, 0x4C, 0x50, 0x4C, 0x51, 0x20, + 0x39, 0xF0, 0x23, 0xA1, 0xC2, 0xE0, 0x02, 0xA2, 0x2E, 0xE4, 0x08, 0xAE, + 0xC0, 0xE0, 0x0E, 0x04, 0xC2, 0xE0, 0x0D, 0x04, 0x22, 0xD0, 0xDA, 0xF7, + 0x02, 0xA8, 0x20, 0x04, 0x15, 0x21, 0xF5, 0x15, 0x84, 0xE1, 0x02, 0x00, + 0x02, 0x00, 0x22, 0xD0, 0x17, 0x9F, 0x15, 0x4D, 0x16, 0x4D, 0x16, 0x21, + 0xFC, 0x15, 0x84, 0xE1, 0x0D, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x17, 0x9F, + 0x20, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, + 0x28, 0xE4, 0x02, 0xA8, 0x0D, 0x04, 0xC3, 0xE0, 0x03, 0xA2, 0x3E, 0xA8, + 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, 0x20, 0x04, 0xC1, 0xE0, + 0x9E, 0xE0, 0x00, 0x05, 0x64, 0x00, 0xC0, 0xE0, 0xDB, 0xF7, 0x03, 0xA8, + 0x3D, 0x15, 0x1E, 0xE4, 0x02, 0xA8, 0x24, 0xAF, 0x25, 0x16, 0x0B, 0xE4, + 0x45, 0x15, 0x1E, 0xE4, 0x09, 0xAE, 0x4A, 0x15, 0x1E, 0xE4, 0x1E, 0xA8, + 0x61, 0x00, 0xC1, 0xE0, 0x20, 0xAE, 0x56, 0xE0, 0x17, 0x9F, 0x56, 0xE0, + 0xFF, 0x1F, 0x09, 0xE0, 0x48, 0xF0, 0x02, 0xA8, 0x64, 0x00, 0xC0, 0xE0, + 0x51, 0x20, 0x3E, 0xF0, 0x51, 0x4C, 0x50, 0x20, 0xC0, 0xE0, 0x17, 0x9F, + 0x08, 0xAE, 0x50, 0x4C, 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x9F, 0x6A, 0x00, + 0x17, 0x9F, 0x6C, 0x00, 0xC0, 0xE0, 0x17, 0x9F, 0xC0, 0xE0, 0x17, 0x9F, + 0x7A, 0x00, 0xC0, 0xE0, 0x7C, 0x00, 0xC0, 0xE0, 0x17, 0x9F, 0x7B, 0x00, + 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x2E, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x08, 0x00, 0x60, 0x00, 0x80, 0x00, 0x09, 0x00, 0x0B, 0x00, + 0x90, 0x00, 0xB0, 0x00, 0x12, 0x00, 0x16, 0x00, 0x20, 0x01, 0x60, 0x01, + 0x12, 0x00, 0x58, 0x00, 0x40, 0x02, 0xC0, 0x02, 0x12, 0x00, 0x60, 0x01, + 0x80, 0x04, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0F, 0x00, + 0x0D, 0x00, 0x63, 0x00, 0x00, 0x00, 0x17, 0x00, 0x15, 0x00, 0x13, 0x00, + 0x02, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, + 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFB, 0xFF, 0x01, 0x00, + 0x02, 0x00, 0x03, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, + 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x80, 0x00, 0x20, 0x00, 0x00, 0x02, + 0x60, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x40, 0x00, 0x40, 0x01, 0x80, 0x00, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x80, 0x01, 0xC0, 0x00, 0x00, 0x02, + 0x40, 0x01, 0x00, 0x02, 0xC0, 0x01, 0x00, 0x01, 0x80, 0x02, 0x80, 0x01, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x03, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00, + 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x0F, 0x00, 0x10, 0x00, + 0x11, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x03, 0x00, + 0x02, 0x00, 0x09, 0x00, 0x19, 0x00, 0x20, 0x00, 0x18, 0x00, 0x11, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x12, 0x00, 0x21, 0x00, 0x1A, 0x00, + 0x13, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x29, 0x00, 0x30, 0x00, 0x28, 0x00, + 0x06, 0x00, 0x0D, 0x00, 0x14, 0x00, 0x1B, 0x00, 0x1C, 0x00, 0x15, 0x00, + 0x0E, 0x00, 0x07, 0x00, 0x38, 0x00, 0x31, 0x00, 0x2A, 0x00, 0x23, 0x00, + 0x24, 0x00, 0x2B, 0x00, 0x32, 0x00, 0x39, 0x00, 0x17, 0x00, 0x0F, 0x00, + 0x16, 0x00, 0x1D, 0x00, 0x33, 0x00, 0x2C, 0x00, 0x25, 0x00, 0x1E, 0x00, + 0x2D, 0x00, 0x34, 0x00, 0x3B, 0x00, 0x3A, 0x00, 0x2E, 0x00, 0x27, 0x00, + 0x1F, 0x00, 0x26, 0x00, 0x36, 0x00, 0x3D, 0x00, 0x3C, 0x00, 0x35, 0x00, + 0x3F, 0x00, 0x3E, 0x00, 0x37, 0x00, 0x2F, 0x00, 0x18, 0x00, 0x10, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, + 0x28, 0x00, 0x20, 0x00, 0x19, 0x00, 0x11, 0x00, 0x31, 0x00, 0x39, 0x00, + 0x38, 0x00, 0x30, 0x00, 0x12, 0x00, 0x1A, 0x00, 0x21, 0x00, 0x29, 0x00, + 0x0C, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x03, 0x00, 0x2A, 0x00, 0x22, 0x00, + 0x1B, 0x00, 0x13, 0x00, 0x2B, 0x00, 0x23, 0x00, 0x3A, 0x00, 0x32, 0x00, + 0x1C, 0x00, 0x14, 0x00, 0x3B, 0x00, 0x33, 0x00, 0x0E, 0x00, 0x06, 0x00, + 0x0D, 0x00, 0x05, 0x00, 0x2C, 0x00, 0x24, 0x00, 0x1D, 0x00, 0x15, 0x00, + 0x2D, 0x00, 0x25, 0x00, 0x3C, 0x00, 0x34, 0x00, 0x1E, 0x00, 0x16, 0x00, + 0x3D, 0x00, 0x35, 0x00, 0x1F, 0x00, 0x17, 0x00, 0x0F, 0x00, 0x07, 0x00, + 0x3E, 0x00, 0x36, 0x00, 0x2E, 0x00, 0x26, 0x00, 0x3F, 0x00, 0x37, 0x00, + 0x2F, 0x00, 0x27, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x10, 0x00, 0x09, 0x00, 0x08, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x0B, 0x00, 0x0A, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x06, 0x00, + 0x12, 0x00, 0x13, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x21, 0x00, 0x20, 0x00, + 0x19, 0x00, 0x18, 0x00, 0x15, 0x00, 0x14, 0x00, 0x1B, 0x00, 0x1A, 0x00, + 0x1D, 0x00, 0x1C, 0x00, 0x17, 0x00, 0x16, 0x00, 0x23, 0x00, 0x22, 0x00, + 0x1F, 0x00, 0x1E, 0x00, 0x31, 0x00, 0x30, 0x00, 0x29, 0x00, 0x28, 0x00, + 0x25, 0x00, 0x24, 0x00, 0x2B, 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x2C, 0x00, + 0x27, 0x00, 0x26, 0x00, 0x33, 0x00, 0x32, 0x00, 0x2F, 0x00, 0x2E, 0x00, + 0x3B, 0x00, 0x3A, 0x00, 0x39, 0x00, 0x38, 0x00, 0x37, 0x00, 0x36, 0x00, + 0x35, 0x00, 0x34, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x3D, 0x00, 0x3C, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, 0x00, + 0x0C, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x1D, 0x02, 0x0E, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x37, 0x02, 0x0E, 0xE4, 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, + 0x27, 0xD0, 0x68, 0xE1, 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x04, 0xE0, 0x5A, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, + 0xC2, 0xE0, 0x00, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, + 0x74, 0x01, 0x1E, 0xE4, 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, + 0xEE, 0x28, 0x4E, 0xF0, 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, + 0x00, 0xCE, 0x1A, 0xE0, 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, + 0x96, 0x00, 0x1E, 0xE4, 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, + 0x9E, 0xE0, 0x42, 0x01, 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, + 0x07, 0x9F, 0x02, 0xA2, 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, + 0x6A, 0xE1, 0x1D, 0x02, 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, + 0x7C, 0xE6, 0x00, 0xC0, 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, + 0x11, 0xAE, 0x5E, 0x00, 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, + 0xEF, 0x3C, 0x56, 0xE0, 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, + 0x3E, 0xAE, 0x02, 0xA2, 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, + 0xC0, 0xE0, 0x07, 0x9F, 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, + 0x5D, 0x00, 0xC3, 0xE0, 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, + 0x00, 0xCE, 0x1A, 0xE0, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, + 0x00, 0x00, 0x04, 0xE0, 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, + 0x78, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, + 0x28, 0xCC, 0x04, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, + 0x05, 0xE0, 0x20, 0xAE, 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0x38, 0xD6, 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, + 0x00, 0xA2, 0x71, 0x00, 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, + 0x01, 0x00, 0x27, 0xD0, 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, + 0x2B, 0xF3, 0x03, 0xA1, 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, + 0x7B, 0xF1, 0x03, 0xA1, 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, + 0x3B, 0xF1, 0x05, 0xA1, 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, + 0x9B, 0xF1, 0x03, 0xA1, 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, + 0xAE, 0xF1, 0x2A, 0xA2, 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, + 0xC1, 0xE0, 0x5A, 0xA2, 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, + 0x04, 0xE0, 0xFB, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, + 0xCE, 0xF0, 0x4E, 0x00, 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, + 0x04, 0xE0, 0x3B, 0xF0, 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, + 0x16, 0xAE, 0x72, 0x00, 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, + 0x0B, 0x00, 0x13, 0xD1, 0x00, 0x28, 0x12, 0xD1, 0x79, 0x22, 0x1E, 0xE4, + 0x2E, 0xE4, 0xE1, 0xE1, 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x98, 0xF0, 0x10, 0xA8, 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, + 0x5B, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, + 0xC0, 0xE0, 0x7C, 0xE6, 0x3D, 0x02, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, + 0x10, 0xA8, 0x5B, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, + 0x01, 0xC4, 0x00, 0xA2, 0x7C, 0xE6, 0x3F, 0x02, 0x61, 0xE1, 0x11, 0x3D, + 0xEB, 0x00, 0x88, 0xE1, 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, + 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, + 0x00, 0x00, 0x05, 0xE0, 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, + 0x1E, 0xE4, 0x13, 0x01, 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, + 0x2E, 0xE4, 0xE8, 0x01, 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, + 0x2E, 0xE4, 0x70, 0x00, 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, + 0x6B, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, + 0x33, 0xAE, 0x09, 0xA8, 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, + 0x6A, 0x00, 0xC0, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, + 0x2E, 0xE4, 0x07, 0x3D, 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, + 0xA0, 0x01, 0x67, 0xE1, 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, + 0xDA, 0xF7, 0x04, 0xA8, 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, + 0xC2, 0xE0, 0x08, 0xA2, 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x06, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, + 0x8A, 0x01, 0x1A, 0xE4, 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, + 0xC2, 0xE0, 0x20, 0xA2, 0x2E, 0xE4, 0x4A, 0x00, 0xC2, 0xE0, 0x20, 0xA2, + 0x2E, 0xE4, 0x70, 0x00, 0x72, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x76, 0x00, + 0xFA, 0xA2, 0x77, 0x00, 0xC2, 0xE0, 0xFC, 0xA2, 0x22, 0xD0, 0x2E, 0xE4, + 0x71, 0x00, 0xC2, 0xE0, 0xC0, 0xE0, 0xA4, 0x01, 0x84, 0xE1, 0x0F, 0x27, + 0x1F, 0x04, 0xC0, 0xE0, 0x48, 0xF0, 0x4A, 0x00, 0xEE, 0xA1, 0x3D, 0x04, + 0xC0, 0xE0, 0xE8, 0xF7, 0x1C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, + 0x04, 0xE0, 0x97, 0x01, 0x1E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x3C, 0x04, + 0xC2, 0xE0, 0x11, 0x00, 0x3D, 0x04, 0xC0, 0xE0, 0xA9, 0x01, 0x1E, 0xE4, + 0xE0, 0x01, 0x04, 0xE0, 0xD8, 0xF7, 0xEE, 0xA1, 0xC2, 0xE0, 0x00, 0xA2, + 0x09, 0x00, 0xC2, 0xE0, 0xE8, 0xF7, 0x0D, 0x00, 0xC0, 0xE0, 0x09, 0x00, + 0x2E, 0xE4, 0x3C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x0E, 0xA8, 0x04, 0xAF, + 0x45, 0x00, 0xC0, 0xE0, 0xC2, 0xE0, 0x02, 0xA2, 0x28, 0xE4, 0x04, 0xA1, + 0xE8, 0xF7, 0x11, 0x01, 0xC0, 0xE0, 0x4A, 0x00, 0xE8, 0xF7, 0x02, 0xA8, + 0x48, 0xCA, 0x8E, 0xF9, 0x3D, 0x04, 0xC0, 0xE0, 0xA9, 0x01, 0x1E, 0xE4, + 0xF8, 0x01, 0x04, 0xE0, 0xD8, 0xF7, 0xEE, 0xA1, 0xC2, 0xE0, 0x00, 0xA2, + 0x09, 0x00, 0xC2, 0xE0, 0xE8, 0xF7, 0x0D, 0x00, 0xC0, 0xE0, 0x09, 0x00, + 0x2E, 0xE4, 0x3C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0x01, 0xC0, 0x2E, 0xE4, + 0xF8, 0xF7, 0x28, 0xCA, 0x5E, 0x3C, 0x01, 0xC0, 0x1E, 0xF1, 0x5D, 0x3C, + 0xBE, 0xF0, 0x5E, 0x28, 0x01, 0xC0, 0xEE, 0xF0, 0x01, 0xC0, 0x8E, 0xF0, + 0x5F, 0x3C, 0x01, 0xC0, 0x3E, 0xF0, 0x1B, 0xE0, 0x5E, 0x1A, 0x5D, 0x2A, + 0x2E, 0xE4, 0x00, 0xC0, 0x5F, 0x2A, 0x01, 0xC0, 0x0B, 0x08, 0xC3, 0xE0, + 0x08, 0x08, 0xC2, 0xE0, 0x12, 0x9F, 0x02, 0xA2, 0x02, 0x08, 0x62, 0xE1, + 0x05, 0xE0, 0x12, 0x9F, 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x12, 0x9F, + 0x92, 0x9F, 0x00, 0x02, 0x00, 0xA2, 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, + 0xC2, 0xE0, 0x02, 0xA2, 0x12, 0x81, 0x12, 0x9F, 0xE8, 0xF7, 0x00, 0x08, + 0xC0, 0xE0, 0x00, 0x08, 0x0E, 0xE4, 0x1A, 0x1F, 0x0E, 0xE4, 0x2E, 0xE4, + 0x0E, 0xE4, 0x45, 0x02, 0x0E, 0xE4, 0x41, 0x02, 0x0E, 0xE4, 0x4F, 0x02, + 0x0E, 0xE4, 0x49, 0x02, 0x0E, 0xE4, 0x57, 0x02, 0x0E, 0xE4, 0x53, 0x02, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x5B, 0x02, 0x0E, 0xE4, 0x5F, 0x02, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x3B, 0x1F, 0x0E, 0xE4, 0xFD, 0x07, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x63, 0x02, 0x1E, 0xE4, 0x29, 0x08, + 0x0E, 0xE4, 0xB9, 0x02, 0x1E, 0xE4, 0x6A, 0x00, 0x1E, 0xE4, 0x20, 0x03, + 0x1E, 0xE4, 0x6A, 0x00, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xB0, 0x01, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xF9, 0x03, 0x1E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x3B, 0x04, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x8E, 0x04, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x89, 0x06, 0x30, 0xD1, 0x6A, 0x00, + 0x0E, 0xE4, 0xC6, 0x02, 0x1E, 0xE4, 0x26, 0x01, 0x1E, 0xE4, 0x08, 0x00, + 0x00, 0xA2, 0xE7, 0x07, 0x1E, 0xE4, 0x79, 0x22, 0x44, 0xCC, 0x72, 0xCC, + 0x33, 0x3C, 0x29, 0x3C, 0x6B, 0x3C, 0x1C, 0x3C, 0x31, 0x3C, 0x7C, 0x3C, + 0x01, 0x3D, 0x60, 0x08, 0x61, 0xE1, 0x6C, 0x3C, 0x11, 0x22, 0x1E, 0xE4, + 0x37, 0x08, 0x1E, 0xE4, 0x2C, 0x05, 0x1E, 0xE4, 0x7B, 0x3C, 0x02, 0xA2, + 0x02, 0xA0, 0x10, 0x3C, 0x0A, 0xA2, 0x5A, 0xF3, 0x7B, 0x28, 0x5B, 0xF0, + 0x40, 0x2A, 0x12, 0x3C, 0x02, 0xA2, 0x2E, 0xF0, 0x04, 0xA2, 0x38, 0xF0, + 0x00, 0xA2, 0x22, 0x3C, 0x02, 0xA1, 0x13, 0x3C, 0x04, 0xA2, 0x27, 0x3C, + 0x20, 0x3C, 0x21, 0x3C, 0x50, 0x28, 0x23, 0x3C, 0x34, 0xA2, 0x11, 0x3C, + 0x51, 0x28, 0xB0, 0xF1, 0x00, 0x01, 0x02, 0xE0, 0x50, 0x28, 0x70, 0xF1, + 0x00, 0x01, 0x02, 0xE0, 0x02, 0xA0, 0x40, 0x28, 0x44, 0xF1, 0x0C, 0xA1, + 0x94, 0x0D, 0x1E, 0xE4, 0x00, 0xF1, 0x51, 0x18, 0x26, 0x1F, 0x1E, 0xE4, + 0xFA, 0x1E, 0x1E, 0xE4, 0x1E, 0xE4, 0x43, 0x13, 0x18, 0xE4, 0x15, 0x28, + 0x70, 0x00, 0xC2, 0xE0, 0x02, 0xA2, 0xC8, 0x1D, 0x70, 0x00, 0xC2, 0xE0, + 0x00, 0xA2, 0x2E, 0xE4, 0xCF, 0x28, 0x08, 0x00, 0x30, 0xD1, 0x2E, 0xE4, + 0x00, 0xA2, 0x7A, 0xF0, 0xD0, 0x28, 0x28, 0xE4, 0x1B, 0x1F, 0x1E, 0xE4, + 0xFB, 0x3C, 0xFA, 0x3C, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, + 0x63, 0xE1, 0x7E, 0xA8, 0x02, 0xAF, 0x6B, 0x30, 0x60, 0x00, 0xC0, 0xE0, + 0x03, 0x3D, 0x6C, 0x08, 0x7E, 0xA8, 0x0E, 0xAF, 0x6E, 0x08, 0x64, 0xE1, + 0x1A, 0x03, 0x0A, 0xE4, 0x6B, 0x28, 0x04, 0x3D, 0x15, 0xA1, 0x49, 0xE0, + 0x61, 0x00, 0xC0, 0xE0, 0x82, 0xE0, 0x6C, 0x3C, 0x1A, 0x03, 0x01, 0xE4, + 0x62, 0xE1, 0x20, 0x07, 0x61, 0xE1, 0x48, 0x3C, 0x84, 0xE1, 0x09, 0x00, + 0x22, 0xD0, 0x62, 0x00, 0x20, 0xAF, 0x49, 0xE0, 0x12, 0x9E, 0xFE, 0x02, + 0x4A, 0xE0, 0x11, 0x3D, 0xFF, 0x00, 0x08, 0xE0, 0x11, 0x3D, 0xFF, 0x00, + 0x08, 0xE0, 0x30, 0xAF, 0x11, 0x3D, 0xFF, 0x00, 0x08, 0xE0, 0x4A, 0xE0, + 0xFF, 0x00, 0x08, 0xE0, 0x10, 0xAF, 0x4A, 0xE0, 0x61, 0xE1, 0x11, 0x3D, + 0x12, 0x9E, 0x11, 0x3D, 0x49, 0xE0, 0x76, 0x00, 0xC0, 0xE0, 0x43, 0x07, + 0x11, 0x3D, 0xFF, 0x00, 0x08, 0xE0, 0x20, 0xAF, 0xFF, 0x00, 0x08, 0xE0, + 0x30, 0xAF, 0x4A, 0xE0, 0xFF, 0x00, 0x08, 0xE0, 0x4A, 0xE0, 0x11, 0x3D, + 0x08, 0xE0, 0x10, 0xAF, 0x4A, 0xE0, 0x11, 0x3D, 0xC2, 0xE0, 0x02, 0xA2, + 0x11, 0x3D, 0xFF, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x4E, 0xF0, 0x76, 0x00, + 0x2E, 0xE4, 0x92, 0xE0, 0x48, 0x28, 0x76, 0x00, 0x4A, 0xCC, 0x00, 0xA2, + 0x08, 0x00, 0x30, 0xD1, 0x74, 0x00, 0xC2, 0xE0, 0x44, 0xCC, 0x4C, 0xCC, + 0x13, 0x3D, 0x28, 0x08, 0x63, 0xE1, 0x00, 0xA2, 0x13, 0x3D, 0x13, 0x3D, + 0x13, 0x3D, 0x13, 0x3D, 0xC0, 0xE0, 0x67, 0x3C, 0x00, 0xA2, 0x13, 0x3D, + 0x07, 0x00, 0x08, 0xE0, 0x06, 0xAF, 0x65, 0x00, 0x02, 0xAF, 0x69, 0x30, + 0x02, 0xAF, 0x68, 0x30, 0x06, 0xA2, 0x36, 0x1E, 0x1E, 0xE4, 0x6A, 0x30, + 0x4B, 0x12, 0x1E, 0xE4, 0x35, 0x12, 0x1E, 0xE4, 0x0A, 0xF1, 0x40, 0x28, + 0x9D, 0x12, 0x1E, 0xE4, 0x1E, 0xE4, 0x54, 0x3C, 0x02, 0xAF, 0x53, 0x2C, + 0x40, 0x3C, 0x04, 0xA2, 0x49, 0xF0, 0x6B, 0x06, 0x6A, 0xF0, 0x06, 0xA1, + 0x40, 0x28, 0x9E, 0xF0, 0x53, 0x2C, 0x3E, 0xF0, 0x40, 0x3C, 0x04, 0xA2, + 0xD1, 0x28, 0x2A, 0xF2, 0xD0, 0x28, 0x54, 0x3C, 0x44, 0x34, 0x66, 0x00, + 0xC0, 0xE0, 0xAA, 0xF0, 0x04, 0xAE, 0x67, 0x00, 0xC0, 0xE0, 0x45, 0x3C, + 0xFA, 0x34, 0x00, 0xA2, 0x47, 0x3C, 0x46, 0x34, 0x1E, 0xE4, 0x1B, 0x1F, + 0x1E, 0xE4, 0xFB, 0x3C, 0xD4, 0x3C, 0xD3, 0x3C, 0x00, 0xA2, 0x79, 0x22, + 0x12, 0x20, 0x1E, 0xE4, 0xF6, 0x1F, 0x1E, 0xE4, 0x57, 0x1F, 0x1E, 0xE4, + 0x2F, 0x20, 0x1E, 0xE4, 0x5E, 0x20, 0x1E, 0xE4, 0x53, 0x20, 0x1E, 0xE4, + 0x00, 0x00, 0xE7, 0xD1, 0x00, 0x00, 0xE0, 0xD1, 0x08, 0x00, 0x30, 0xD1, + 0xB0, 0x03, 0xFF, 0xD1, 0x00, 0x00, 0x3A, 0xD0, 0x24, 0x02, 0x99, 0xD1, + 0x00, 0x00, 0x4C, 0xD0, 0x01, 0x00, 0x4B, 0xD0, 0x45, 0x08, 0x1E, 0xE4, + 0x00, 0x00, 0x08, 0xD0, 0xCF, 0x28, 0x3E, 0xF0, 0x2A, 0xF0, 0xD0, 0x28, + 0x06, 0xA1, 0xDA, 0xF0, 0x40, 0x28, 0x1A, 0xF0, 0x06, 0xA2, 0x1B, 0x3C, + 0x1A, 0x28, 0xBA, 0xF0, 0x09, 0xE4, 0x6B, 0x06, 0x1E, 0xE4, 0x40, 0x3C, + 0x40, 0x28, 0x59, 0x03, 0x0E, 0xE4, 0xE1, 0x03, 0x4A, 0xF0, 0xE3, 0x28, + 0x40, 0x3C, 0x50, 0xB6, 0x33, 0x2C, 0x29, 0x3C, 0x02, 0xA0, 0x29, 0x2C, + 0x70, 0x00, 0xC2, 0xE0, 0x33, 0x3C, 0x02, 0xA0, 0xEC, 0x24, 0x71, 0x00, + 0xC2, 0xE0, 0x28, 0x28, 0x64, 0xE1, 0x6A, 0x00, 0xC2, 0xE0, 0xED, 0x4C, + 0xC2, 0xE0, 0x04, 0x4D, 0x14, 0x21, 0x28, 0x08, 0x14, 0x21, 0x2A, 0x08, + 0x64, 0xE1, 0x77, 0x00, 0x64, 0xE1, 0x78, 0x00, 0xC2, 0xE0, 0x04, 0x4D, + 0xC2, 0xE0, 0x04, 0x4D, 0x14, 0x21, 0x2C, 0x08, 0x6B, 0xF0, 0x1A, 0x28, + 0x40, 0x2A, 0x79, 0x00, 0x1A, 0x28, 0x39, 0xF0, 0x6B, 0x06, 0x1E, 0xE4, + 0x1E, 0xE4, 0x73, 0x00, 0xC2, 0xE0, 0x1B, 0x08, 0x02, 0xA2, 0x14, 0x22, + 0x1E, 0xE4, 0x48, 0x1E, 0xED, 0x03, 0x0E, 0xE4, 0x76, 0x00, 0xC2, 0xE0, + 0x0E, 0xE4, 0x76, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x70, 0x00, 0xC2, 0xE0, + 0x33, 0x2C, 0xED, 0x03, 0x1A, 0x28, 0x71, 0x00, 0xC2, 0xE0, 0x28, 0x28, + 0xC2, 0xE0, 0x06, 0xA2, 0x73, 0x00, 0xC2, 0xE0, 0x6C, 0x3E, 0x6B, 0x3E, + 0x01, 0xA2, 0x76, 0x00, 0x4D, 0xC8, 0x4A, 0xC8, 0x00, 0x00, 0x39, 0xD0, + 0x53, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x20, 0xAE, 0xC0, 0xE0, 0x2F, 0x04, + 0x1E, 0xE4, 0x2E, 0xE4, 0x07, 0x3D, 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, + 0x11, 0xD1, 0x20, 0xCE, 0x42, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0xC0, 0x00, + 0x12, 0xD1, 0xD0, 0x03, 0x00, 0xE0, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, + 0x20, 0xCE, 0x80, 0x00, 0x00, 0xE0, 0x80, 0x01, 0xC0, 0x00, 0x12, 0xD1, + 0x40, 0x0B, 0x11, 0xD1, 0xF9, 0xF7, 0x29, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0xC0, 0xE0, 0x35, 0x12, 0x1E, 0xE4, 0x04, 0xA2, 0x61, 0x00, 0xC0, 0xE0, + 0x32, 0x3C, 0x60, 0x00, 0x96, 0xE0, 0x90, 0x04, 0x04, 0xE0, 0x70, 0x3C, + 0x13, 0x3D, 0x13, 0x35, 0x62, 0x00, 0xC0, 0xE0, 0x13, 0x3D, 0x13, 0x35, + 0x63, 0x00, 0xC0, 0xE0, 0x67, 0xE1, 0x2E, 0xE4, 0x4B, 0x12, 0x1E, 0xE4, + 0x22, 0xD0, 0x64, 0x00, 0x66, 0xE1, 0x94, 0x03, 0x16, 0x9E, 0x39, 0x04, + 0x84, 0xE1, 0x03, 0x00, 0x30, 0xD1, 0x2E, 0xE4, 0x17, 0x3D, 0x17, 0x35, + 0xD1, 0x28, 0x2A, 0xF2, 0xD0, 0x28, 0x08, 0x00, 0x44, 0x34, 0x61, 0x00, + 0xC0, 0xE0, 0xAA, 0xF0, 0x04, 0xAE, 0x62, 0x00, 0xC0, 0xE0, 0x45, 0x3C, + 0xFA, 0x34, 0x00, 0xA2, 0x47, 0x3C, 0x46, 0x34, 0x1E, 0xE4, 0x1B, 0x1F, + 0x1E, 0xE4, 0xFB, 0x3C, 0xD4, 0x3C, 0xD3, 0x3C, 0x00, 0xA2, 0x79, 0x22, + 0x12, 0x20, 0x1E, 0xE4, 0xF6, 0x1F, 0x1E, 0xE4, 0x57, 0x1F, 0x1E, 0xE4, + 0x2F, 0x20, 0x1E, 0xE4, 0x5E, 0x20, 0x1E, 0xE4, 0x53, 0x20, 0x1E, 0xE4, + 0x60, 0x00, 0xC0, 0xE0, 0xE4, 0x3C, 0xE3, 0x28, 0x0A, 0xE4, 0x02, 0xA1, + 0xDA, 0xF0, 0x0E, 0xA8, 0x02, 0xA1, 0x8A, 0xF0, 0x02, 0xA1, 0x77, 0x04, + 0x2A, 0xF0, 0x02, 0xA1, 0x77, 0x04, 0x0A, 0xE4, 0xBE, 0x04, 0x1E, 0xE4, + 0x5E, 0xF1, 0x2E, 0xE4, 0x1E, 0xE4, 0x0E, 0xF1, 0x7E, 0x07, 0x1E, 0xE4, + 0xBE, 0xF0, 0xAF, 0x07, 0x1E, 0xE4, 0x04, 0x05, 0x30, 0x3C, 0x16, 0xA2, + 0x2E, 0xF0, 0x14, 0xA2, 0x70, 0x20, 0x1E, 0xE4, 0x2F, 0x3C, 0x00, 0xA2, + 0x2A, 0xF0, 0xD0, 0x28, 0x9A, 0x20, 0x1E, 0xE4, 0xE4, 0x28, 0x1A, 0xF0, + 0xCF, 0x28, 0x3E, 0xF0, 0x0B, 0x1F, 0x1E, 0xE4, 0x2E, 0xE4, 0xE3, 0x3C, + 0xE4, 0x3C, 0xE3, 0x28, 0x92, 0xCE, 0x00, 0xA2, 0x8A, 0xF0, 0x0E, 0xA8, + 0x60, 0x00, 0xC0, 0xE0, 0x4A, 0xF0, 0x02, 0xA1, 0xBA, 0xF0, 0x02, 0xA1, + 0x1E, 0xE4, 0xAE, 0xF0, 0x7A, 0xF0, 0x02, 0xA1, 0x5E, 0xF0, 0x30, 0x0C, + 0x1E, 0xE4, 0xBE, 0x04, 0xCF, 0x0C, 0x1E, 0xE4, 0x04, 0x05, 0x1E, 0xE4, + 0x06, 0xAF, 0x70, 0xC8, 0xE3, 0x3C, 0xE4, 0x28, 0x80, 0x00, 0x04, 0xE0, + 0x70, 0x00, 0xC2, 0xE0, 0x42, 0x00, 0xC0, 0xE0, 0xDF, 0xBA, 0x6E, 0xCC, + 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x28, 0xCA, 0x12, 0x00, + 0x13, 0xD1, 0x00, 0x01, 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xF8, 0xF7, + 0xC0, 0xE0, 0xE3, 0x3C, 0x1A, 0xE0, 0x04, 0xA8, 0x1F, 0x00, 0x08, 0xE0, + 0x30, 0xAF, 0x60, 0x00, 0x4E, 0xF0, 0x0E, 0x3C, 0x39, 0xF0, 0xE3, 0x2A, + 0x50, 0xA2, 0x01, 0x3D, 0x03, 0x05, 0x61, 0xE1, 0x11, 0xAF, 0x60, 0x00, + 0xC1, 0xE0, 0x42, 0x3C, 0x42, 0x28, 0x67, 0xA5, 0xFF, 0x00, 0x09, 0xE0, + 0x04, 0xE0, 0x42, 0x3C, 0x4A, 0xE0, 0x2B, 0xF0, 0x68, 0x00, 0xC0, 0xE0, + 0x41, 0x3C, 0x02, 0x00, 0x69, 0x00, 0xC0, 0xE0, 0x43, 0x30, 0x16, 0xE0, + 0x69, 0x00, 0xC0, 0xE0, 0x7A, 0xF0, 0x40, 0x30, 0x2E, 0xF0, 0x02, 0xA2, + 0x3A, 0xF0, 0x02, 0xAF, 0xCD, 0x07, 0x1E, 0xE4, 0x7B, 0x3C, 0x00, 0xA2, + 0x60, 0x00, 0xC0, 0xE0, 0xC8, 0x1D, 0x1E, 0xE4, 0x2A, 0xE4, 0x73, 0x30, + 0x02, 0xA8, 0x06, 0xAF, 0x75, 0x3C, 0x74, 0x34, 0x63, 0x00, 0xC0, 0xE0, + 0x77, 0x3E, 0x76, 0x36, 0x64, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x73, 0x3C, + 0x1A, 0xE0, 0x56, 0xE0, 0x1A, 0xE0, 0x04, 0xA8, 0x60, 0x00, 0xC0, 0xE0, + 0x30, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0xE3, 0x3C, 0x39, 0xF0, 0xE3, 0x2A, + 0x1F, 0x00, 0x08, 0xE0, 0x03, 0x05, 0x61, 0xE1, 0x4E, 0xF0, 0x0E, 0x3C, + 0x20, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x01, 0x3D, 0x39, 0xF0, 0xE3, 0x2A, + 0xFF, 0x00, 0x08, 0xE0, 0x04, 0x05, 0x61, 0xE1, 0x4E, 0xF0, 0x0F, 0x3C, + 0x3E, 0x30, 0x65, 0x00, 0xC0, 0xE0, 0x01, 0x3D, 0x2E, 0x3C, 0x06, 0xA8, + 0x66, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3F, 0x30, 0x67, 0x00, 0xC0, 0xE0, + 0x8F, 0x3C, 0x06, 0xA8, 0x74, 0x00, 0xC0, 0xE0, 0x90, 0x3C, 0x04, 0xAF, + 0x74, 0x00, 0xC0, 0xE0, 0xC2, 0x04, 0x66, 0xE1, 0x64, 0x00, 0xC0, 0xE0, + 0xCD, 0x07, 0x1E, 0xE4, 0x16, 0x3D, 0x16, 0x35, 0x02, 0xAE, 0x17, 0x34, + 0x65, 0x00, 0xC0, 0xE0, 0x17, 0x3C, 0x02, 0xA0, 0x17, 0x28, 0x16, 0x3C, + 0xC0, 0xE0, 0x69, 0x06, 0x0A, 0xE4, 0x16, 0x28, 0xC0, 0xE0, 0x19, 0x30, + 0x04, 0xAF, 0x62, 0x00, 0x08, 0xAF, 0xF9, 0x04, 0x61, 0xE1, 0x62, 0x00, + 0x08, 0xAF, 0x05, 0x05, 0x61, 0xE1, 0x11, 0x31, 0x02, 0xAF, 0x02, 0x05, + 0x61, 0xE1, 0x11, 0x31, 0x0A, 0xAF, 0x62, 0x00, 0xC0, 0xE0, 0x11, 0x31, + 0x80, 0x3E, 0x71, 0x00, 0xC1, 0xE0, 0x7F, 0x30, 0x8C, 0x34, 0x8B, 0x3C, + 0x78, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x87, 0x3C, 0x7D, 0x00, 0xC0, 0xE0, + 0x63, 0xE1, 0x02, 0xAF, 0x0C, 0xAF, 0x62, 0x00, 0x73, 0x00, 0xC0, 0xE0, + 0x03, 0x31, 0x1A, 0x08, 0xC0, 0xE0, 0x03, 0x3D, 0x1B, 0x08, 0x63, 0xE1, + 0x7A, 0xF0, 0x40, 0x30, 0x14, 0xAF, 0x62, 0x00, 0x3A, 0xF0, 0x16, 0xAF, + 0x62, 0x00, 0xC0, 0xE0, 0x7B, 0x3C, 0x00, 0xA2, 0x2E, 0xF0, 0x02, 0xA2, + 0x68, 0x00, 0xC0, 0xE0, 0xCD, 0x07, 0x1E, 0xE4, 0x3F, 0xAF, 0x3F, 0xAE, + 0x3F, 0xA8, 0x49, 0xE0, 0x26, 0x32, 0x0B, 0xAF, 0x49, 0xE0, 0x24, 0x3E, + 0x2B, 0x3E, 0x07, 0xA8, 0x0D, 0xAF, 0x49, 0xE0, 0x41, 0xAF, 0x1F, 0xA8, + 0x11, 0xAF, 0x49, 0xE0, 0x49, 0xE0, 0x2C, 0x3E, 0x03, 0xAE, 0x41, 0xAE, + 0x41, 0xAE, 0x41, 0xAF, 0x1F, 0xA8, 0x19, 0xAF, 0x2C, 0x4C, 0x2B, 0x28, + 0x2D, 0x3E, 0x03, 0xAE, 0xC0, 0xE0, 0x25, 0x3C, 0x1A, 0xE0, 0x2D, 0x4C, + 0x37, 0x30, 0x1A, 0xE0, 0x06, 0xA8, 0x69, 0x00, 0x02, 0xA1, 0x06, 0xA8, + 0x69, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x38, 0x3C, 0x00, 0xA4, 0x04, 0xA5, + 0x20, 0xAF, 0x39, 0x3C, 0x04, 0xAF, 0x69, 0x00, 0x1E, 0xE4, 0x3A, 0x3C, + 0xFF, 0x3F, 0x08, 0xE0, 0x08, 0xE0, 0x6A, 0x00, 0xC0, 0xE0, 0x70, 0x06, + 0x77, 0x00, 0xC0, 0xE0, 0x14, 0x3C, 0xFF, 0x03, 0x77, 0x00, 0xC0, 0xE0, + 0x15, 0x3C, 0x1E, 0xA8, 0x06, 0xA8, 0x20, 0xAF, 0x83, 0x3C, 0x08, 0xAF, + 0x2C, 0xAF, 0x77, 0x00, 0xC0, 0xE0, 0x82, 0x3C, 0x03, 0x3D, 0x49, 0x08, + 0x63, 0xE1, 0x02, 0xA8, 0x63, 0xE1, 0x2E, 0xAF, 0x77, 0x00, 0xC0, 0xE0, + 0x1D, 0x30, 0x02, 0xAF, 0x13, 0x31, 0x66, 0x08, 0xC0, 0xE0, 0xAF, 0x3C, + 0x1E, 0xA8, 0x02, 0xAF, 0xAD, 0x3C, 0x1E, 0xA8, 0x81, 0x34, 0x6B, 0x00, + 0x6D, 0x08, 0x65, 0xE1, 0x1E, 0xAF, 0x81, 0x28, 0xFF, 0x7F, 0x08, 0xE0, + 0x81, 0x28, 0x05, 0x31, 0x69, 0x08, 0x63, 0xE1, 0x00, 0xA2, 0x81, 0x3C, + 0xC0, 0xE0, 0x2A, 0xF1, 0x15, 0x28, 0x03, 0x29, 0x09, 0xAF, 0x49, 0xE0, + 0x20, 0xAF, 0x6A, 0x00, 0x07, 0xAF, 0x49, 0xE0, 0xBB, 0xF0, 0x03, 0xA8, + 0x0E, 0xA8, 0x12, 0xE0, 0x5B, 0xF0, 0x03, 0xA8, 0x03, 0x3D, 0x0E, 0xA8, + 0x2E, 0xF0, 0x12, 0xE0, 0x61, 0xE1, 0x2A, 0xAF, 0x6A, 0x00, 0xC0, 0xE0, + 0x63, 0xE1, 0x00, 0xA2, 0x01, 0x3D, 0x61, 0x08, 0x67, 0xE1, 0x4C, 0x08, + 0x66, 0xE1, 0x4B, 0x08, 0x07, 0x3D, 0x06, 0x3D, 0x03, 0x3D, 0x4D, 0x08, + 0x21, 0xAF, 0x49, 0xE0, 0x7C, 0x00, 0xC0, 0xE0, 0xFF, 0xFF, 0x08, 0xE0, + 0x03, 0x33, 0x7B, 0xF0, 0xC0, 0xE0, 0x07, 0x3D, 0x06, 0x35, 0x14, 0xAE, + 0x1E, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x6D, 0x00, 0x63, 0xE1, 0x20, 0xAF, + 0x6D, 0x00, 0xC0, 0xE0, 0x6D, 0x00, 0xC0, 0xE0, 0x13, 0x31, 0x50, 0x08, + 0x6D, 0x00, 0xC0, 0xE0, 0x13, 0x31, 0x22, 0xAF, 0x01, 0xA2, 0x53, 0x2C, + 0x03, 0x31, 0x24, 0xAF, 0x02, 0xE0, 0x25, 0xB4, 0xC8, 0x00, 0x02, 0xE0, + 0xC0, 0xE0, 0x36, 0x3E, 0x25, 0xB4, 0x90, 0x01, 0x16, 0x35, 0xC0, 0x04, + 0x66, 0xE1, 0x75, 0x00, 0x49, 0xE0, 0x76, 0x00, 0xC0, 0xE0, 0x16, 0x3D, + 0x4A, 0xE0, 0xDC, 0x3C, 0x10, 0xA5, 0x18, 0xA8, 0x4A, 0xE0, 0xDC, 0x3C, + 0xDC, 0x4C, 0x06, 0xA8, 0x1E, 0xA8, 0x02, 0xAF, 0xDE, 0x30, 0x08, 0xAF, + 0x06, 0xA8, 0x12, 0xAF, 0x4A, 0xE0, 0xDD, 0x3C, 0xDE, 0x28, 0x03, 0x3D, + 0x63, 0x08, 0x63, 0xE1, 0xDE, 0x4C, 0x02, 0xAE, 0xDE, 0x3C, 0x16, 0xE0, + 0x1E, 0xA2, 0x28, 0xF0, 0xDD, 0x28, 0xDE, 0x3C, 0x06, 0xAF, 0x43, 0x00, + 0xC0, 0xE0, 0xDD, 0x3C, 0x02, 0xAF, 0xD0, 0x30, 0x02, 0xAF, 0xCF, 0x30, + 0x02, 0xA2, 0xD2, 0x30, 0x02, 0xAF, 0xD1, 0x30, 0xC1, 0xE0, 0x2E, 0xE4, + 0x00, 0xA2, 0x2E, 0xE4, 0x2E, 0xE4, 0x03, 0xA8, 0x11, 0xAF, 0x65, 0x00, + 0x04, 0xA1, 0x38, 0x28, 0x7A, 0xF1, 0x37, 0x28, 0xC0, 0xE0, 0xF8, 0xF7, + 0x28, 0xCA, 0x48, 0xF1, 0x00, 0x0A, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0x00, + 0x04, 0xAE, 0x04, 0xAF, 0x08, 0xA0, 0x39, 0x2C, 0x24, 0xCE, 0x66, 0xE0, + 0x00, 0x01, 0x05, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x03, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x61, 0x00, 0xC0, 0xE0, + 0x92, 0x06, 0x0B, 0xE4, 0x60, 0x00, 0xC1, 0xE0, 0x8E, 0x1D, 0x1E, 0xE4, + 0xC0, 0xE0, 0x9B, 0x06, 0x0B, 0xE4, 0x05, 0xA8, 0xC1, 0xE0, 0xBD, 0x1D, + 0x1E, 0xE4, 0x62, 0x00, 0xA4, 0x06, 0x0B, 0xE4, 0x09, 0xA8, 0x60, 0x00, + 0xAE, 0x1D, 0x1E, 0xE4, 0x63, 0x00, 0xC0, 0xE0, 0x0B, 0xE4, 0x11, 0xA8, + 0x60, 0x00, 0xC1, 0xE0, 0x1E, 0xE4, 0x64, 0x00, 0xC0, 0xE0, 0xAD, 0x06, + 0x21, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x76, 0x1D, 0x65, 0x00, 0xC0, 0xE0, + 0xB5, 0x06, 0x0B, 0xE4, 0x41, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x1E, 0x3C, + 0x66, 0x00, 0xC0, 0xE0, 0xD0, 0x06, 0x0B, 0xE4, 0xC0, 0xE0, 0x37, 0x30, + 0x1A, 0xE0, 0x06, 0xA8, 0x04, 0xA5, 0x02, 0xA1, 0x06, 0xA8, 0x66, 0x00, + 0x66, 0x00, 0xC0, 0xE0, 0x38, 0x3C, 0x00, 0xA4, 0x08, 0xE0, 0x20, 0xAF, + 0x39, 0x3C, 0x04, 0xAF, 0x70, 0x06, 0x1E, 0xE4, 0x3A, 0x3C, 0xFF, 0x3F, + 0x40, 0x00, 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, 0x6F, 0x00, 0xC0, 0xE0, + 0xDC, 0x06, 0x0B, 0xE4, 0x3A, 0x1C, 0x1E, 0xE4, 0x8C, 0x34, 0x8B, 0x3C, + 0x80, 0x00, 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, 0x68, 0x00, 0xC0, 0xE0, + 0xE5, 0x06, 0x0B, 0xE4, 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, 0x3E, 0x30, + 0xC0, 0xE0, 0xEF, 0x06, 0x0B, 0xE4, 0x00, 0x01, 0xC1, 0xE0, 0x2E, 0x3C, + 0x06, 0xA8, 0x69, 0x00, 0x0B, 0xE4, 0x00, 0x02, 0x09, 0xE0, 0x60, 0x00, + 0x3F, 0x30, 0x6A, 0x00, 0xC0, 0xE0, 0xF8, 0x06, 0x00, 0x04, 0x09, 0xE0, + 0x60, 0x00, 0xC1, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, 0x02, 0x07, 0x0B, 0xE4, + 0x60, 0x00, 0xC1, 0xE0, 0x43, 0x30, 0x16, 0xE0, 0x12, 0x07, 0x0B, 0xE4, + 0x00, 0x08, 0x09, 0xE0, 0xFF, 0x00, 0x08, 0xE0, 0x6D, 0x00, 0xC0, 0xE0, + 0x61, 0xE1, 0x0F, 0x3C, 0x29, 0xF0, 0xE3, 0x2A, 0x60, 0x00, 0xC1, 0xE0, + 0x01, 0x3D, 0x04, 0x05, 0x28, 0x07, 0x0B, 0xE4, 0x00, 0x10, 0x09, 0xE0, + 0x7A, 0xF0, 0x40, 0x30, 0x6C, 0x00, 0xC0, 0xE0, 0x3A, 0xF0, 0x02, 0xAF, + 0x6C, 0x00, 0xC0, 0xE0, 0x7B, 0x3C, 0x00, 0xA2, 0x2E, 0xF0, 0x02, 0xA2, + 0xC8, 0x1D, 0x1E, 0xE4, 0xCD, 0x07, 0x1E, 0xE4, 0x00, 0x20, 0x09, 0xE0, + 0x60, 0x00, 0xC1, 0xE0, 0x6E, 0x00, 0xC0, 0xE0, 0x31, 0x07, 0x0B, 0xE4, + 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, 0x41, 0x3C, 0xC0, 0xE0, 0x7D, 0x07, + 0x0B, 0xE4, 0x00, 0x40, 0x72, 0x00, 0xC0, 0xE0, 0x87, 0x3C, 0x71, 0x00, + 0x03, 0x31, 0x66, 0x08, 0x63, 0xE1, 0x49, 0xE0, 0x1E, 0xA8, 0x02, 0xAF, + 0x1D, 0x30, 0x02, 0xAF, 0x1E, 0xA8, 0x0C, 0xAF, 0x4A, 0xE0, 0xAF, 0x3C, + 0x69, 0x08, 0x63, 0xE1, 0x00, 0xA2, 0xAD, 0x3C, 0x1A, 0x08, 0x65, 0xE1, + 0x1B, 0x08, 0x64, 0xE1, 0xC0, 0xE0, 0x05, 0x3D, 0x04, 0x3D, 0x03, 0x3D, + 0xFF, 0x7F, 0x08, 0xE0, 0x20, 0xAF, 0x73, 0x00, 0x63, 0xE1, 0xC4, 0x3E, + 0x01, 0xA2, 0x81, 0x3C, 0x03, 0x31, 0x73, 0x00, 0xC0, 0xE0, 0x1A, 0x08, + 0x74, 0x00, 0xC0, 0xE0, 0x6A, 0xF0, 0x03, 0x29, 0x63, 0xE1, 0x04, 0x3D, + 0x1B, 0x08, 0x64, 0xE1, 0x02, 0xAF, 0x73, 0x00, 0xC0, 0xE0, 0x69, 0x08, + 0x03, 0xA8, 0x09, 0xAF, 0x49, 0xE0, 0x3E, 0xA8, 0x03, 0xA8, 0x07, 0xAF, + 0x49, 0xE0, 0xBB, 0xF0, 0x12, 0xE0, 0x0E, 0xA8, 0x12, 0xE0, 0x5B, 0xF0, + 0x1E, 0xE4, 0x03, 0x3D, 0x0E, 0xA8, 0x2E, 0xF0, 0x2F, 0x3C, 0x06, 0xA2, + 0x2E, 0xE4, 0x93, 0x1A, 0x2E, 0xF0, 0x0E, 0xA2, 0x39, 0xF0, 0xE3, 0x2A, + 0x70, 0x20, 0x1E, 0xE4, 0x30, 0x3C, 0x1E, 0xA2, 0x9A, 0x20, 0x1E, 0xE4, + 0x30, 0x0C, 0x1E, 0xE4, 0x2A, 0xE4, 0x3E, 0xAF, 0x60, 0x00, 0xC0, 0xE0, + 0x72, 0xC8, 0x2E, 0xE4, 0x93, 0x07, 0x1E, 0xE4, 0x0D, 0xAE, 0x0D, 0xAF, + 0x7F, 0xA0, 0x49, 0xE0, 0x72, 0xCC, 0x42, 0xE0, 0x2B, 0xE4, 0x45, 0xE0, + 0x84, 0xE1, 0x45, 0xCC, 0x03, 0xA1, 0x07, 0xAF, 0xF9, 0xF7, 0x9B, 0xCA, + 0x00, 0xA2, 0xA4, 0x07, 0xAA, 0xCE, 0x96, 0xCE, 0x00, 0xA2, 0xC4, 0xCE, + 0x92, 0xCE, 0x00, 0xA2, 0x0B, 0x1F, 0x1E, 0xE4, 0x06, 0xA2, 0x2E, 0xE4, + 0x9A, 0x20, 0x1E, 0xE4, 0x1E, 0xE4, 0x30, 0x3C, 0x10, 0xA2, 0x2F, 0x3C, + 0x1E, 0xE4, 0xCF, 0x0C, 0x1E, 0xE4, 0x70, 0x20, 0x3E, 0xAF, 0x60, 0x00, + 0xC0, 0xE0, 0x9A, 0x20, 0x2E, 0xE4, 0x93, 0x07, 0x1E, 0xE4, 0x2A, 0xE4, + 0x30, 0x3C, 0x12, 0xA2, 0x2F, 0x3C, 0x00, 0xA2, 0x84, 0xBA, 0x04, 0xA2, + 0x70, 0x20, 0x1E, 0xE4, 0x9A, 0x20, 0x1E, 0xE4, 0x7F, 0x0D, 0x1E, 0xE4, + 0x16, 0x21, 0xC2, 0x04, 0x66, 0xE1, 0x2E, 0xE4, 0x50, 0x28, 0x51, 0x3C, + 0x50, 0x34, 0x16, 0x4D, 0x51, 0x28, 0x50, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x40, 0x2A, 0x52, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, 0x0A, 0xAF, 0x3E, 0xA0, + 0x51, 0x28, 0x5B, 0xF0, 0x51, 0x82, 0x50, 0x84, 0x51, 0x3C, 0x02, 0xAE, + 0x28, 0xCA, 0x2E, 0xE4, 0x53, 0x3C, 0x18, 0xE0, 0x05, 0xE0, 0x40, 0x00, + 0xC0, 0xE0, 0xF8, 0xF7, 0x05, 0xE0, 0x42, 0xE0, 0x17, 0xAE, 0x58, 0x00, + 0x20, 0xCE, 0x42, 0xE0, 0x03, 0xAE, 0x00, 0x24, 0x40, 0x01, 0x12, 0xD1, + 0x50, 0x02, 0x11, 0xD1, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, + 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, 0x2E, 0xE4, 0xFF, 0xFF, 0x08, 0xE0, + 0x5A, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x79, 0x22, 0x1E, 0xE4, 0xEE, 0x3C, + 0x06, 0xA1, 0x2A, 0xE4, 0x12, 0xA1, 0x59, 0x00, 0xD4, 0x3C, 0xD3, 0x3C, + 0x00, 0xA2, 0x2A, 0xE4, 0x12, 0x20, 0x1E, 0xE4, 0xF6, 0x1F, 0x1E, 0xE4, + 0x59, 0x00, 0xC0, 0xE0, 0x2F, 0x20, 0x1E, 0xE4, 0xE9, 0x21, 0x1E, 0xE4, + 0x3A, 0xF0, 0x0C, 0xA1, 0x53, 0x20, 0x1E, 0xE4, 0x57, 0x1F, 0x1E, 0xE4, + 0x59, 0x00, 0xC0, 0xE0, 0x5E, 0x20, 0x1E, 0xE4, 0xF1, 0x21, 0x1E, 0xE4, + 0x2A, 0xE4, 0x0C, 0xA1, 0x0C, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x06, 0xA1, 0x5A, 0xF0, 0x06, 0xA1, 0x7A, 0xF0, 0x04, 0xA2, 0xD5, 0x21, + 0x1E, 0xE4, 0x3A, 0xF0, 0x00, 0xA2, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, + 0x10, 0xAF, 0x14, 0x04, 0xC0, 0xE0, 0xC9, 0x3C, 0x05, 0x02, 0x05, 0xE0, + 0xFF, 0x0F, 0x08, 0xE0, 0xC9, 0x3C, 0x02, 0xA2, 0x22, 0xE4, 0x46, 0xE0, + 0x1E, 0xE4, 0xAF, 0x08, 0x1E, 0xE4, 0x2E, 0xE4, 0xC0, 0x07, 0x18, 0xE4, + 0x19, 0x28, 0xF6, 0x08, 0x04, 0x09, 0x1E, 0xE4, 0x7C, 0x3C, 0x31, 0x28, + 0x40, 0x2A, 0x72, 0x28, 0x2A, 0x3C, 0x3D, 0x28, 0x1E, 0xE4, 0xAA, 0xF0, + 0x52, 0xE0, 0x17, 0xE0, 0x72, 0x00, 0xC2, 0xE0, 0x35, 0x28, 0xF0, 0x09, + 0x2E, 0xE4, 0xEA, 0x14, 0x18, 0xE4, 0x15, 0x28, 0x0A, 0x3C, 0xFE, 0xA2, + 0x10, 0x1E, 0x1E, 0xE4, 0x1E, 0xE4, 0x9B, 0x0D, 0x1E, 0xE4, 0x0B, 0x3C, + 0x1E, 0xE4, 0x0A, 0x0B, 0x1E, 0xE4, 0x79, 0x11, 0xFE, 0xA2, 0x91, 0x0A, + 0x1E, 0xE4, 0xA2, 0x0B, 0x00, 0xA2, 0x7A, 0x0B, 0x1E, 0xE4, 0x55, 0x3C, + 0x16, 0xE0, 0xE3, 0x28, 0x1A, 0x3C, 0x55, 0x3C, 0x18, 0xE4, 0x01, 0x45, + 0x02, 0x05, 0x61, 0xE1, 0x1A, 0x28, 0x4A, 0xF0, 0xC4, 0x28, 0x2D, 0x22, + 0xA4, 0x09, 0x1E, 0xE4, 0x17, 0x15, 0x18, 0xE4, 0x1E, 0xE4, 0x67, 0x3C, + 0x02, 0xAA, 0x67, 0x28, 0xC2, 0xF1, 0x54, 0x1C, 0x55, 0x2C, 0xED, 0x15, + 0x00, 0x02, 0x08, 0xE0, 0x65, 0x00, 0xC0, 0xE0, 0x08, 0xE0, 0x5C, 0x00, + 0xC0, 0xE0, 0x6A, 0xF1, 0x5D, 0x00, 0xC0, 0xE0, 0x1A, 0xF1, 0x00, 0x08, + 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x08, 0x0A, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, + 0x00, 0xCE, 0x02, 0xA2, 0xC0, 0xE0, 0xC9, 0xF7, 0x00, 0x08, 0x09, 0xE0, + 0x1E, 0xE4, 0x0E, 0xF5, 0x98, 0xF7, 0x04, 0x00, 0x15, 0x28, 0xCB, 0x0F, + 0x1E, 0xE4, 0x9F, 0x11, 0x43, 0x28, 0x2E, 0xE4, 0xEA, 0x14, 0x18, 0xE4, + 0x03, 0xA8, 0x3F, 0x2A, 0x02, 0xAE, 0x16, 0xE0, 0x03, 0xA8, 0x43, 0x2A, + 0x02, 0xAE, 0x56, 0xE0, 0x40, 0x2A, 0x02, 0xAE, 0x56, 0xE0, 0x17, 0xE0, + 0x02, 0xAE, 0x56, 0xE0, 0x03, 0xA8, 0x1B, 0xE0, 0x0A, 0xAE, 0x56, 0xE0, + 0x03, 0xA8, 0x3E, 0x2A, 0x06, 0xAE, 0x56, 0xE0, 0x3F, 0xA8, 0x24, 0x2A, + 0x34, 0x28, 0x68, 0xF0, 0xE3, 0x28, 0x80, 0xCF, 0xAE, 0xF0, 0x01, 0x3D, + 0x00, 0x05, 0x61, 0xE1, 0x01, 0x45, 0xF9, 0x04, 0x61, 0xE1, 0xE2, 0x28, + 0x01, 0x29, 0x00, 0x05, 0x61, 0xE1, 0x5A, 0xF0, 0x35, 0x28, 0x00, 0x00, + 0xF3, 0xD1, 0x35, 0x3C, 0xE8, 0xD1, 0xC0, 0x00, 0xE1, 0xD1, 0xE4, 0xCF, + 0x50, 0x28, 0x00, 0x00, 0xEE, 0xD1, 0x55, 0x00, 0x04, 0xAE, 0x26, 0x4C, + 0x02, 0xAE, 0x02, 0xA1, 0x85, 0xD1, 0x00, 0xCF, 0x02, 0xAE, 0x40, 0x4C, + 0x85, 0xD1, 0x90, 0xE1, 0x90, 0xE1, 0x01, 0x00, 0x40, 0xD0, 0x2A, 0xE4, + 0x3E, 0x28, 0x00, 0x00, 0x64, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x04, 0x00, + 0x64, 0xF0, 0x81, 0x00, 0x02, 0xE0, 0x50, 0x28, 0xB1, 0x0B, 0x1E, 0xE4, + 0x64, 0x3C, 0x50, 0x28, 0x2E, 0xE4, 0xC4, 0x0B, 0x1E, 0xE4, 0x2E, 0xE4, + 0xE3, 0x28, 0xED, 0x3C, 0xEC, 0x34, 0x00, 0xA2, 0x04, 0xA8, 0x65, 0x00, + 0xC0, 0xE0, 0xB8, 0xF3, 0x48, 0xF0, 0x02, 0xA8, 0x40, 0x28, 0x7A, 0xF0, + 0x14, 0x28, 0x7D, 0x3C, 0x29, 0x3C, 0x00, 0xA2, 0x40, 0x28, 0x68, 0xF1, + 0x29, 0x2C, 0x78, 0xF0, 0x02, 0xA1, 0xDE, 0xF0, 0x38, 0xF1, 0x02, 0xA8, + 0x14, 0x2A, 0x9A, 0xF0, 0x7D, 0x28, 0xBA, 0xF0, 0x03, 0xAE, 0x2A, 0xF0, + 0x04, 0xA8, 0x40, 0x28, 0x00, 0xA2, 0x68, 0xF0, 0x46, 0xE0, 0x7D, 0x28, + 0x5E, 0xF0, 0x7D, 0x3C, 0x02, 0xA2, 0x28, 0x3C, 0x7D, 0x3C, 0x7D, 0x08, + 0x28, 0x3C, 0x02, 0xA2, 0x60, 0x08, 0x61, 0xE1, 0xE8, 0xF0, 0x28, 0x28, + 0x02, 0x19, 0x01, 0x29, 0x61, 0x08, 0x62, 0xE1, 0x01, 0x3D, 0x29, 0x3C, + 0x00, 0xA2, 0x48, 0xF0, 0x28, 0x28, 0x01, 0x3D, 0x02, 0xA0, 0x01, 0x29, + 0xE2, 0x28, 0x8E, 0xF0, 0xE2, 0x3C, 0x16, 0xE0, 0x3A, 0xF0, 0x01, 0x45, + 0xF9, 0x04, 0x61, 0xE1, 0xD8, 0xF0, 0x40, 0x28, 0x28, 0x3C, 0x02, 0xA2, + 0x65, 0x00, 0xC0, 0xE0, 0x72, 0x3C, 0x00, 0xA2, 0x63, 0xE1, 0x4B, 0xF0, + 0xE3, 0x2A, 0x02, 0xA8, 0xA0, 0x09, 0x18, 0xE4, 0x03, 0x29, 0x06, 0x05, + 0x15, 0x28, 0x3D, 0x3C, 0x63, 0x00, 0xC0, 0xE0, 0xE3, 0x28, 0x58, 0xF0, + 0x28, 0x28, 0xBA, 0xF1, 0x63, 0xE1, 0xDB, 0x13, 0x1E, 0xE4, 0x38, 0xF0, + 0x1E, 0xE4, 0x03, 0x3D, 0x7D, 0x28, 0x47, 0x08, 0x68, 0xF0, 0x15, 0x28, + 0x3D, 0x3C, 0x1A, 0x14, 0x63, 0x00, 0xC0, 0xE0, 0x48, 0xF0, 0x6B, 0x28, + 0x40, 0x28, 0x58, 0xF0, 0xE3, 0x28, 0x3D, 0x3C, 0xE3, 0x2A, 0xA0, 0x09, + 0x19, 0xE4, 0x38, 0xF0, 0x72, 0x28, 0x06, 0x05, 0x63, 0xE1, 0x59, 0xF0, + 0xC4, 0x28, 0x1A, 0x3C, 0x00, 0xA2, 0x03, 0x3D, 0xA8, 0xF0, 0x29, 0x2C, + 0x17, 0x15, 0x18, 0xE4, 0x02, 0xA2, 0x78, 0xF0, 0x02, 0xA8, 0x40, 0x28, + 0x1C, 0x3E, 0x03, 0xA0, 0x1C, 0x2A, 0x31, 0x3C, 0x04, 0xA0, 0x31, 0x3C, + 0x00, 0xA2, 0x3E, 0xF0, 0x01, 0x29, 0x05, 0x05, 0x61, 0xE1, 0x2F, 0x3C, + 0x1E, 0xE4, 0xE3, 0x28, 0xAA, 0xF0, 0xE2, 0x44, 0xAF, 0x07, 0x1E, 0xE4, + 0xE3, 0x28, 0x7E, 0x07, 0x2E, 0xE4, 0x2F, 0x3C, 0x04, 0xA0, 0x31, 0x28, + 0x2E, 0xE4, 0x72, 0x3C, 0x28, 0x3C, 0x02, 0xA2, 0x0A, 0xA2, 0x31, 0x2A, + 0x01, 0x00, 0x4D, 0xD0, 0x8B, 0xF0, 0xE3, 0x2A, 0x30, 0x3C, 0x36, 0xB6, + 0x70, 0x20, 0x1E, 0xE4, 0x30, 0x3C, 0x28, 0xA2, 0x1E, 0xE4, 0x3E, 0xF0, + 0x38, 0x22, 0x1E, 0xE4, 0x1E, 0xE4, 0x0D, 0x0D, 0x1E, 0xE4, 0x70, 0x20, + 0x7F, 0x0D, 0x1A, 0xE4, 0x3E, 0x28, 0xA2, 0x0A, 0x1E, 0xE4, 0x89, 0x0D, + 0x18, 0xE4, 0x3E, 0x28, 0xC8, 0x09, 0x18, 0xE4, 0x6A, 0x28, 0x9A, 0x20, + 0x2E, 0xE4, 0x1A, 0x3C, 0x02, 0xA0, 0x1A, 0x28, 0x17, 0x3D, 0x00, 0xA2, + 0xAC, 0x04, 0x67, 0xE1, 0x9A, 0xC8, 0x17, 0x3D, 0x02, 0xA1, 0x55, 0x2C, + 0x1A, 0x2C, 0x17, 0x3D, 0x17, 0x35, 0x50, 0xA0, 0x81, 0xF1, 0xFF, 0x1F, + 0x03, 0xE0, 0x49, 0xE0, 0x17, 0x23, 0xBB, 0x04, 0x67, 0xE1, 0x06, 0xAE, + 0xF8, 0xF7, 0x28, 0xCA, 0x41, 0xE0, 0x17, 0x4F, 0x04, 0xE0, 0x48, 0xF0, + 0x06, 0xA1, 0x40, 0x28, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, 0x00, 0x01, + 0x13, 0xD1, 0x04, 0x00, 0x12, 0xD1, 0xAC, 0x04, 0x2E, 0xE4, 0xF8, 0xF7, + 0x28, 0xCA, 0x02, 0x00, 0x0B, 0x3C, 0x0A, 0x3C, 0x55, 0x3C, 0x00, 0xA2, + 0x02, 0xA9, 0x08, 0xA2, 0xCA, 0xF2, 0x3E, 0x28, 0x20, 0xAE, 0xFF, 0xFF, + 0x04, 0xE0, 0xB6, 0xCF, 0x02, 0xA2, 0x9E, 0xCF, 0xFF, 0xFF, 0x0A, 0xE0, + 0xE8, 0xCF, 0xD2, 0xCF, 0x00, 0xA2, 0x84, 0xCF, 0x10, 0xA2, 0xEE, 0xCF, + 0xEC, 0xCF, 0xEA, 0xCF, 0x28, 0x4C, 0x04, 0xAE, 0x2A, 0x28, 0x8A, 0xCF, + 0x82, 0xD1, 0x01, 0x00, 0xCD, 0xD1, 0x82, 0xCF, 0xDC, 0xD1, 0x01, 0x00, + 0xCE, 0xD1, 0x00, 0x00, 0x0A, 0x3C, 0x02, 0xA0, 0x0A, 0x28, 0x01, 0x00, + 0x0A, 0x3C, 0x00, 0xA2, 0x68, 0xF0, 0x50, 0x18, 0xBE, 0xCB, 0x0B, 0x3C, + 0x02, 0xA0, 0x0B, 0x28, 0xE3, 0x2A, 0x30, 0x3C, 0x02, 0xA2, 0xFA, 0xF7, + 0x1E, 0xE4, 0x30, 0x3C, 0x28, 0xA2, 0x8B, 0xF0, 0x3E, 0xF0, 0x38, 0x22, + 0x1E, 0xE4, 0x70, 0x20, 0x0D, 0x0D, 0x1E, 0xE4, 0x70, 0x20, 0x1E, 0xE4, + 0xD9, 0x0A, 0x1E, 0xE4, 0x63, 0x3C, 0x54, 0x2C, 0x66, 0xE0, 0x63, 0x2E, + 0x55, 0x1C, 0x54, 0x2C, 0x50, 0x0A, 0x1A, 0xE4, 0x3E, 0x28, 0x63, 0x3C, + 0x1E, 0xE4, 0x58, 0x0A, 0x18, 0xE4, 0x3E, 0x28, 0x1A, 0x3C, 0x02, 0xA0, + 0x1A, 0x2C, 0x9A, 0x20, 0x3E, 0x28, 0xB8, 0xF5, 0x55, 0x1C, 0x54, 0x2C, + 0x9E, 0xCF, 0xB6, 0xCF, 0x00, 0xA2, 0x2A, 0xE4, 0x2E, 0xE4, 0x00, 0x00, + 0xDC, 0xD1, 0x84, 0xCF, 0x42, 0xE0, 0x55, 0x2E, 0xFC, 0xBB, 0x63, 0x2C, + 0x2E, 0xE4, 0x7F, 0x0D, 0x1E, 0xE4, 0x55, 0x3C, 0x0D, 0x3C, 0x63, 0x0C, + 0x0C, 0x3C, 0x55, 0x2C, 0x55, 0x1E, 0x54, 0x2E, 0x5B, 0x0B, 0x1E, 0xE4, + 0x9A, 0xCF, 0x56, 0xB6, 0x06, 0xA2, 0x03, 0xA1, 0x0B, 0x4C, 0x0A, 0x24, + 0x01, 0x00, 0xDA, 0xD1, 0x0C, 0x1E, 0x55, 0x2E, 0x00, 0xA2, 0x04, 0xCF, + 0x03, 0xA1, 0x55, 0x1E, 0x0D, 0x2E, 0x56, 0xB6, 0x96, 0xB6, 0x03, 0xA1, + 0x12, 0xA2, 0x29, 0xF0, 0x29, 0xF0, 0x03, 0xA1, 0x55, 0x1E, 0x54, 0x2E, + 0x01, 0x00, 0xDC, 0xD1, 0x9C, 0xCF, 0x10, 0xA2, 0x0A, 0x28, 0x55, 0x3C, + 0x02, 0xA0, 0x55, 0x2C, 0x68, 0xF0, 0x50, 0x18, 0x0A, 0x3C, 0x02, 0xA0, + 0x02, 0xA0, 0x0B, 0x28, 0x0A, 0x3C, 0x00, 0xA2, 0x55, 0x2C, 0xFA, 0xF7, + 0xBE, 0xCB, 0x0B, 0x3C, 0x89, 0x0D, 0x1E, 0xE4, 0x18, 0xF5, 0x0D, 0x1C, + 0x2C, 0x2A, 0x0A, 0xAE, 0x2B, 0x28, 0x2E, 0xE4, 0x2D, 0x2A, 0x0A, 0xAE, + 0x56, 0xE0, 0x3F, 0xA8, 0x28, 0x28, 0x30, 0xCF, 0x56, 0xE0, 0x3F, 0xA8, + 0x2A, 0x4C, 0x18, 0xAE, 0x02, 0xA2, 0xC4, 0xCF, 0x24, 0x08, 0x2A, 0x28, + 0x2E, 0xE4, 0x90, 0xCF, 0xF0, 0x02, 0x00, 0xE0, 0x66, 0xA5, 0x00, 0xA4, + 0x06, 0x4D, 0x0C, 0xAE, 0x06, 0x29, 0x9C, 0xE0, 0x28, 0x4C, 0x04, 0xAE, + 0x2A, 0x4C, 0x0C, 0xAE, 0x1E, 0xE4, 0x3B, 0x3C, 0x00, 0xA2, 0x82, 0xCF, + 0x1E, 0xE4, 0x3A, 0xF0, 0x3E, 0x28, 0xD9, 0x0A, 0x1E, 0xE4, 0xDD, 0x0A, + 0x1E, 0xE4, 0x5B, 0x0B, 0x1E, 0xE4, 0x4D, 0x00, 0x5E, 0x8A, 0xA4, 0x0B, + 0x08, 0xE0, 0x5E, 0x1C, 0x9A, 0xC8, 0x7A, 0x0B, 0xA8, 0xF0, 0x6B, 0x28, + 0x5F, 0x3C, 0xFF, 0xFF, 0x66, 0xF0, 0x0B, 0x28, 0x8A, 0xF0, 0x28, 0x28, + 0xAA, 0x28, 0x32, 0xF0, 0x28, 0xA1, 0x5F, 0x28, 0x42, 0xF0, 0x54, 0x1C, + 0x55, 0x2C, 0x5C, 0x3C, 0x02, 0xA2, 0xB9, 0x0A, 0x0A, 0xE4, 0x3B, 0x28, + 0x0E, 0xE4, 0x3C, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x2A, 0xE4, 0x38, 0x2A, + 0x37, 0x28, 0xF4, 0x0A, 0x02, 0xA1, 0x2A, 0xE4, 0xE1, 0x28, 0xA9, 0xF0, + 0x02, 0xA2, 0x28, 0xE4, 0x02, 0xA1, 0xE1, 0x3C, 0x63, 0x1C, 0x3C, 0x2C, + 0x2E, 0xE4, 0x3B, 0x3C, 0x28, 0xE4, 0x3C, 0x3E, 0x03, 0xA0, 0x3C, 0x2E, + 0x2E, 0xE4, 0x3B, 0x3C, 0x3C, 0x3C, 0x02, 0xA2, 0x2A, 0xE4, 0x38, 0x28, + 0x2A, 0xE4, 0x37, 0x28, 0xDE, 0xF0, 0x39, 0x2C, 0x3A, 0xF0, 0x04, 0xA1, + 0x1A, 0x2C, 0x80, 0xF0, 0x39, 0x1C, 0x1A, 0x2C, 0x06, 0x29, 0x9C, 0xE0, + 0x00, 0x0A, 0x00, 0xE0, 0xFF, 0xFF, 0x04, 0xE0, 0x3E, 0xF0, 0x02, 0xA0, + 0xE1, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x63, 0x3C, 0x02, 0xA2, 0xD9, 0x3C, + 0xD7, 0x3C, 0xD8, 0x3C, 0xD6, 0x28, 0x1E, 0xF2, 0xD6, 0x3C, 0xD5, 0x3C, + 0x37, 0x2A, 0xD6, 0x3C, 0x10, 0xB6, 0xD7, 0x3C, 0x01, 0xA2, 0x38, 0xF0, + 0x2B, 0xE4, 0x38, 0x28, 0xD5, 0x3C, 0x02, 0xA0, 0xD5, 0x2C, 0x2E, 0xE4, + 0x28, 0xE4, 0x01, 0xA2, 0xD8, 0x1C, 0x02, 0xA1, 0x03, 0xA2, 0x5A, 0xF0, + 0x04, 0xA1, 0x38, 0x28, 0x03, 0xA2, 0x2E, 0xE4, 0xD5, 0x3E, 0xD6, 0x3E, + 0x02, 0xA0, 0xD9, 0x28, 0xD5, 0x3E, 0xD6, 0x3E, 0x37, 0x28, 0x3B, 0x0B, + 0x0E, 0xE4, 0xD9, 0x3C, 0x04, 0xA1, 0x2A, 0xE4, 0x38, 0x28, 0x2A, 0xE4, + 0xD9, 0x2C, 0xDE, 0xF0, 0x39, 0x28, 0x3A, 0xF0, 0x00, 0xE0, 0xD9, 0x2C, + 0x80, 0xF0, 0x39, 0x1C, 0x02, 0xA0, 0x06, 0x29, 0x9C, 0xE0, 0x00, 0x0A, + 0xD8, 0x3C, 0xFF, 0xFF, 0x04, 0xE0, 0x3E, 0xF0, 0x38, 0x28, 0x37, 0x2A, + 0x2E, 0xE4, 0x03, 0xA2, 0xE1, 0x28, 0x28, 0xE4, 0x2B, 0xE4, 0x5D, 0x4C, + 0x39, 0x4E, 0x3A, 0x26, 0x9A, 0xC8, 0x28, 0xE4, 0xD6, 0x3E, 0x03, 0xA2, + 0x24, 0xE4, 0x46, 0xE0, 0x68, 0xC8, 0x2E, 0xE4, 0xE1, 0x3E, 0x0D, 0xA2, + 0x10, 0xA2, 0x07, 0x3C, 0xDA, 0xF0, 0x0E, 0xA8, 0x44, 0xCC, 0x02, 0xA1, + 0x07, 0x3C, 0x07, 0x18, 0xE0, 0xBA, 0x68, 0x0B, 0x84, 0xE1, 0x02, 0xA2, + 0x3A, 0xF0, 0x28, 0x28, 0x90, 0xE1, 0x90, 0xE1, 0x2A, 0x4C, 0x0C, 0xAE, + 0x2E, 0x08, 0x1A, 0xE0, 0x90, 0xE1, 0x02, 0x00, 0x40, 0xD0, 0x82, 0xCC, + 0x1C, 0xCB, 0x2E, 0xE4, 0xF8, 0xF7, 0x84, 0xC8, 0x18, 0xE4, 0xC9, 0x28, + 0x2E, 0xE4, 0xF8, 0xF7, 0x15, 0x28, 0x01, 0x00, 0xDC, 0xD1, 0xA6, 0x0B, + 0x56, 0x1D, 0x1E, 0xE4, 0x7E, 0x19, 0x18, 0xE4, 0x1E, 0xE4, 0x55, 0x3C, + 0x02, 0xA0, 0x55, 0x2C, 0x1E, 0xE4, 0xF8, 0x10, 0x1E, 0xE4, 0x13, 0x0B, + 0x1E, 0xE4, 0x32, 0x10, 0x1E, 0xE4, 0xEA, 0x10, 0x64, 0x2A, 0xFA, 0xF7, + 0xBE, 0xCB, 0x12, 0x11, 0x19, 0xE4, 0x69, 0x2A, 0xCE, 0x0B, 0x19, 0xE4, + 0xC0, 0x1E, 0x19, 0xE4, 0x68, 0x2A, 0x7B, 0x1E, 0xBE, 0xCB, 0x01, 0x00, + 0xDC, 0xD1, 0x2E, 0xE4, 0x53, 0x0F, 0x0E, 0xE4, 0x2E, 0xE4, 0xFA, 0xF7, + 0x06, 0xA8, 0xC8, 0xCA, 0xB1, 0x0F, 0x0E, 0xE4, 0x09, 0xE0, 0x09, 0xA1, + 0x6F, 0xC8, 0x2A, 0xE4, 0x75, 0xF7, 0x45, 0xE0, 0x66, 0xC8, 0xFF, 0x00, + 0x00, 0xA2, 0x27, 0x0C, 0x1E, 0xE4, 0x2E, 0xE4, 0x06, 0xA0, 0x26, 0xE4, + 0x64, 0x28, 0x65, 0x3C, 0x02, 0xA1, 0x02, 0xAE, 0x64, 0x3C, 0x04, 0xAF, + 0x66, 0xCF, 0x02, 0xA1, 0x64, 0x28, 0x68, 0xCF, 0x2E, 0xE4, 0x6C, 0xCF, + 0x6A, 0xCF, 0x00, 0xA2, 0x02, 0xAF, 0x68, 0xCF, 0x02, 0xA1, 0x50, 0x28, + 0x6C, 0xCF, 0x6A, 0xCF, 0x00, 0xA2, 0x66, 0xCF, 0x8A, 0xF1, 0x1E, 0xCB, + 0x2E, 0xE4, 0x65, 0x3C, 0x02, 0xA1, 0x50, 0x28, 0x66, 0x3C, 0x00, 0xA2, + 0x05, 0xCB, 0x02, 0xA1, 0x51, 0x4C, 0x20, 0xAE, 0x28, 0xE4, 0x66, 0x3C, + 0x16, 0xE0, 0x46, 0xE0, 0x65, 0x28, 0x66, 0x2A, 0x08, 0x0C, 0x1E, 0xE4, + 0xE8, 0x0B, 0x12, 0xE4, 0x39, 0xF0, 0x04, 0xA1, 0x2E, 0xE4, 0x65, 0x3C, + 0x02, 0xA0, 0x65, 0x28, 0xA4, 0xCC, 0x06, 0xA8, 0x04, 0xA0, 0x65, 0x28, + 0xC1, 0xE0, 0x08, 0xAE, 0x18, 0xE0, 0x64, 0x82, 0x00, 0x00, 0x05, 0xE0, + 0x42, 0xE0, 0x46, 0x00, 0xF9, 0xF7, 0x29, 0xCA, 0x42, 0xE0, 0x11, 0xAE, + 0x03, 0xA8, 0x65, 0x2A, 0x64, 0x28, 0x20, 0xCE, 0x64, 0x28, 0x22, 0xCE, + 0x02, 0xAE, 0x16, 0xB6, 0x19, 0x00, 0x13, 0xD1, 0x24, 0xCE, 0x02, 0xAE, + 0x2E, 0xE4, 0x90, 0xE1, 0xF9, 0xF7, 0x29, 0xCA, 0x64, 0x82, 0xA4, 0xCC, + 0x06, 0xA8, 0x65, 0x28, 0x46, 0x00, 0xC1, 0xE0, 0x08, 0xAE, 0x18, 0xE0, + 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, 0x42, 0xE0, 0x20, 0xCE, 0xF9, 0xF7, + 0x29, 0xCA, 0x42, 0xE0, 0x16, 0xB6, 0x03, 0xA8, 0x65, 0x2A, 0x64, 0x28, + 0x02, 0xAE, 0x64, 0x28, 0x22, 0xCE, 0x02, 0xAE, 0x29, 0xCA, 0x18, 0x00, + 0x13, 0xD1, 0x24, 0xCE, 0x00, 0xA2, 0x2E, 0xE4, 0x90, 0xE1, 0xF9, 0xF7, + 0x84, 0xE1, 0x00, 0x02, 0x22, 0xD0, 0x30, 0xCE, 0x2E, 0xE4, 0x32, 0xCE, + 0x90, 0xE1, 0x2E, 0x0C, 0xCA, 0xF0, 0x02, 0xA1, 0x7A, 0xF1, 0x41, 0x28, + 0x3B, 0xF0, 0xE3, 0x2A, 0x64, 0x00, 0x04, 0xE0, 0xC4, 0xBA, 0x8E, 0xBA, + 0x80, 0x00, 0x04, 0xE0, 0x04, 0xE0, 0x4F, 0x0C, 0x0E, 0xE4, 0xC2, 0xBA, + 0xE0, 0xBA, 0xC0, 0xBA, 0x8E, 0xBA, 0x4D, 0x00, 0x4F, 0x0C, 0x0E, 0xE4, + 0xC4, 0xBA, 0xC0, 0xBA, 0xC0, 0xBA, 0x8E, 0xBA, 0x42, 0x00, 0x04, 0xE0, + 0x42, 0x28, 0xC4, 0xBA, 0xC0, 0xBA, 0xE0, 0xBA, 0x0E, 0x28, 0x38, 0xF0, + 0xE3, 0x28, 0x8E, 0xBA, 0x01, 0x29, 0x03, 0x05, 0x61, 0xE1, 0x4E, 0xF0, + 0x88, 0xF0, 0x04, 0xA1, 0x41, 0x28, 0xFC, 0xBB, 0xFC, 0xBB, 0x00, 0xA2, + 0xFC, 0xBB, 0x43, 0x28, 0x10, 0x28, 0xC0, 0xBA, 0xC0, 0xBA, 0xFC, 0xBB, + 0xFC, 0xBB, 0x11, 0x28, 0xFC, 0xBB, 0x08, 0xA1, 0x08, 0xA1, 0x12, 0x28, + 0x48, 0xF0, 0x11, 0x28, 0x90, 0xE1, 0xFC, 0xBB, 0x13, 0x28, 0xFC, 0xBB, + 0xFC, 0xBB, 0x02, 0xA1, 0x50, 0x28, 0xC0, 0xBA, 0x02, 0xAF, 0x2B, 0xF0, + 0x40, 0x2A, 0x51, 0x28, 0x40, 0x28, 0x90, 0xE1, 0xFC, 0xBB, 0x02, 0xA1, + 0x2E, 0xF0, 0xC0, 0xBA, 0xC0, 0xBA, 0x4A, 0xF0, 0x73, 0x28, 0xE0, 0xBA, + 0x90, 0xE1, 0xE0, 0xBA, 0xE0, 0xBA, 0x7E, 0xF1, 0xC0, 0xBA, 0x38, 0xF0, + 0x07, 0x3C, 0x32, 0xB4, 0x43, 0x2A, 0x00, 0xA2, 0x08, 0x3C, 0x32, 0xB4, + 0x40, 0x2A, 0x08, 0x3C, 0x75, 0x28, 0xFC, 0xBB, 0x07, 0x5C, 0x74, 0x28, + 0x08, 0x5C, 0x76, 0x28, 0xFC, 0xBB, 0x07, 0x5C, 0xFC, 0xBB, 0x08, 0x5C, + 0x77, 0x28, 0xFC, 0xBB, 0x6A, 0xF0, 0xE3, 0x28, 0xC0, 0xBA, 0x90, 0xE1, + 0xC0, 0xBA, 0xAC, 0x0C, 0x1E, 0xE4, 0xE0, 0xBA, 0x02, 0xA2, 0x7F, 0x0D, + 0x1E, 0xE4, 0xC0, 0xBA, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, + 0xFC, 0xBB, 0x00, 0xA2, 0xFC, 0xBB, 0x02, 0xA2, 0xF9, 0x04, 0x61, 0xE1, + 0xFC, 0xBB, 0x02, 0xA2, 0xFC, 0xBB, 0x02, 0xA2, 0x6A, 0xF0, 0x11, 0x29, + 0x00, 0xA2, 0x3E, 0xF0, 0xFC, 0xBB, 0x00, 0xA2, 0xFC, 0xBB, 0xFC, 0xBB, + 0x00, 0xA2, 0xFC, 0xBB, 0x8E, 0xBA, 0x42, 0x28, 0xFC, 0xBB, 0xFC, 0xBB, + 0x02, 0xA2, 0xC2, 0xBA, 0xFC, 0xBB, 0x00, 0xA2, 0x02, 0xA2, 0xFC, 0xBB, + 0x00, 0xA2, 0xFC, 0xBB, 0xE3, 0x28, 0x2E, 0xE4, 0xFC, 0xBB, 0xFC, 0xBB, + 0x61, 0xE1, 0x4E, 0xF0, 0x0F, 0x28, 0x38, 0xF0, 0xE3, 0x28, 0xFC, 0xBB, + 0x01, 0x29, 0x04, 0x05, 0x61, 0xE1, 0x4E, 0xF0, 0x0E, 0x28, 0x38, 0xF0, + 0x3E, 0x28, 0xFC, 0xBB, 0x01, 0x29, 0x03, 0x05, 0x21, 0x28, 0x80, 0xBA, + 0x20, 0x28, 0x80, 0xBA, 0x22, 0x28, 0x0A, 0x0D, 0x08, 0xE4, 0xFC, 0xBB, + 0xFC, 0xBB, 0x90, 0xE1, 0x00, 0xA2, 0xFC, 0xBB, 0xC1, 0xBA, 0x90, 0xE1, + 0xC0, 0xBA, 0x90, 0xE1, 0xFE, 0xBB, 0x34, 0xA1, 0x23, 0x28, 0x90, 0xE1, + 0xFE, 0xBB, 0x24, 0x28, 0xFE, 0xBB, 0x00, 0xA2, 0x80, 0xBA, 0x26, 0x28, + 0x80, 0xBA, 0x25, 0x28, 0x04, 0xA1, 0x41, 0x28, 0x80, 0xBA, 0x27, 0x28, + 0xC0, 0xBA, 0x80, 0xBA, 0x3F, 0x28, 0x68, 0xF0, 0x7F, 0x0D, 0x1E, 0xE4, + 0xFE, 0xBB, 0x24, 0x28, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, + 0x28, 0x28, 0xFC, 0xBB, 0x55, 0x2C, 0x2E, 0xE4, 0x1B, 0xE0, 0x49, 0xE0, + 0x02, 0xAE, 0x16, 0xE0, 0xE3, 0x28, 0xFC, 0xBB, 0xB6, 0xB4, 0xE3, 0x46, + 0x61, 0xE1, 0x4E, 0xF0, 0x0F, 0x28, 0x38, 0xF0, 0x40, 0x28, 0xFC, 0xBB, + 0x01, 0x29, 0x04, 0x05, 0x7E, 0xF0, 0x10, 0x70, 0x29, 0x2C, 0x48, 0xF0, + 0x40, 0x2C, 0xE0, 0xBA, 0x10, 0x70, 0x29, 0x2C, 0x3A, 0xF0, 0x31, 0x28, + 0x80, 0xBA, 0x02, 0xA8, 0x98, 0xF0, 0x11, 0x28, 0xFC, 0xBB, 0x00, 0xA2, + 0x20, 0x28, 0x12, 0x70, 0x02, 0xAE, 0x33, 0x2C, 0xFE, 0xBB, 0x00, 0xA2, + 0x38, 0x0D, 0x0A, 0xE4, 0x00, 0xA2, 0x3D, 0x0D, 0x0A, 0xE4, 0x27, 0x28, + 0x13, 0x28, 0xBA, 0xF1, 0x28, 0x28, 0xFC, 0xBB, 0x00, 0xA2, 0xE0, 0xBA, + 0x58, 0xF0, 0x04, 0xA1, 0x90, 0xE1, 0xC0, 0xBA, 0x3E, 0xF0, 0xFC, 0xBB, + 0x61, 0xE1, 0xE2, 0x44, 0x16, 0xE0, 0x31, 0x28, 0x9A, 0xF0, 0xE3, 0x44, + 0x01, 0x45, 0xF9, 0x04, 0x00, 0xA2, 0xFC, 0xBB, 0x0A, 0xA2, 0xE0, 0xBA, + 0x2E, 0xF0, 0xFC, 0xBB, 0x06, 0xA2, 0xFC, 0xBB, 0x65, 0x0D, 0x0A, 0xE4, + 0x2F, 0x28, 0xC0, 0xBA, 0xC0, 0xBA, 0x64, 0x0D, 0x0A, 0xE4, 0x31, 0x28, + 0x65, 0x0D, 0x0E, 0xE4, 0xC0, 0xBA, 0x90, 0xE1, 0x3A, 0xF0, 0x28, 0x44, + 0x3E, 0x28, 0xC0, 0xBA, 0x23, 0x18, 0x2A, 0x28, 0xFC, 0xBB, 0x2E, 0x28, + 0x7B, 0x0D, 0x0A, 0xE4, 0x25, 0x28, 0xFE, 0xBB, 0x0A, 0xE4, 0x02, 0xA1, + 0xFC, 0xBB, 0x2B, 0x28, 0xFE, 0xBB, 0x02, 0xAF, 0x2C, 0x28, 0x7B, 0x0D, + 0x02, 0xA2, 0xFE, 0xBB, 0x02, 0xAF, 0x2D, 0x28, 0xE0, 0xBA, 0x2E, 0xE4, + 0x00, 0xA2, 0x2E, 0xE4, 0x10, 0xA1, 0x2A, 0xE4, 0x0E, 0xA8, 0x68, 0xC8, + 0xFE, 0x70, 0x00, 0xA2, 0xFE, 0x3C, 0x12, 0xE0, 0x8A, 0xF0, 0x0E, 0xA8, + 0x68, 0xC8, 0x2E, 0xE4, 0x07, 0x3C, 0x07, 0x18, 0x10, 0xA2, 0x07, 0x3C, + 0x2E, 0xE4, 0x90, 0xE1, 0x07, 0x70, 0x00, 0xA2, 0xE9, 0x12, 0x1E, 0xE4, + 0x34, 0x3C, 0x00, 0xA2, 0x00, 0xA2, 0x2E, 0xE4, 0xB3, 0x11, 0x1E, 0xE4, + 0x3F, 0x2A, 0x10, 0xA2, 0x25, 0x01, 0xC2, 0xE0, 0x17, 0xE0, 0x3E, 0x2A, + 0x56, 0xE0, 0x17, 0xAE, 0x00, 0x01, 0xC2, 0xE0, 0x56, 0xE0, 0x15, 0xAE, + 0x39, 0xF0, 0x6F, 0x01, 0x04, 0xE0, 0x28, 0x2A, 0x78, 0x01, 0xC2, 0xE0, + 0x68, 0x01, 0x04, 0xE0, 0x00, 0xA2, 0x79, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x3D, 0x01, 0xC2, 0xE0, 0x3C, 0x01, 0xC2, 0xE0, 0x08, 0xE0, 0x49, 0xE0, + 0x50, 0x00, 0xC0, 0xE0, 0x09, 0xE0, 0x11, 0xAF, 0x00, 0x3C, 0x7F, 0x00, + 0x00, 0x3E, 0x00, 0x46, 0x01, 0x3E, 0x7F, 0x00, 0x3B, 0xF0, 0x03, 0xA8, + 0x00, 0x2A, 0x00, 0xA2, 0x05, 0xA8, 0x00, 0x2A, 0x02, 0x00, 0x0A, 0xE0, + 0x09, 0xA8, 0x00, 0x2A, 0x12, 0xA9, 0x2B, 0xF0, 0x11, 0xA8, 0x00, 0x2A, + 0x40, 0xA9, 0x2B, 0xF0, 0x0C, 0x04, 0xC2, 0xE0, 0x80, 0xA9, 0x2B, 0xF0, + 0x00, 0x00, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x03, 0xA8, 0x01, 0x2A, + 0x42, 0xE0, 0x10, 0xAE, 0x11, 0x21, 0x94, 0x03, 0x61, 0xE1, 0x5B, 0xF0, + 0x46, 0x00, 0xC1, 0xE0, 0x0E, 0xCF, 0x11, 0x4D, 0x42, 0xE0, 0x10, 0xAE, + 0x40, 0x00, 0x04, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, 0x05, 0xA8, 0x01, 0x2A, + 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x96, 0x03, 0x08, 0x02, 0xC2, 0xE0, + 0x00, 0xA2, 0x03, 0x01, 0x02, 0xA2, 0x1C, 0x02, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x00, 0xA2, 0x10, 0x02, 0xC2, 0xE0, 0x03, 0xA2, 0xD0, 0x11, + 0x1E, 0xE4, 0x15, 0x02, 0x56, 0xE0, 0x09, 0xAE, 0x01, 0xA9, 0x09, 0xAE, + 0x56, 0xE0, 0x09, 0xAE, 0x17, 0xE0, 0x43, 0x2A, 0xC2, 0xE0, 0x56, 0xE0, + 0x0D, 0xAE, 0x1B, 0xE0, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x13, 0x02, + 0x01, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x70, 0x00, 0x98, 0x03, 0x61, 0xE1, + 0x5B, 0xF0, 0x09, 0xA8, 0x11, 0x02, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0x70, 0x00, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x42, 0xE0, 0x10, 0xAE, + 0x40, 0x00, 0x00, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, 0x11, 0xA8, 0x01, 0x2A, + 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x9A, 0x03, 0x71, 0x3C, 0x64, 0x00, + 0xC0, 0xE0, 0x12, 0x02, 0x08, 0xAE, 0x08, 0xAF, 0x3B, 0xF0, 0x72, 0x2A, + 0x5B, 0xF0, 0x72, 0x2A, 0xFF, 0xFF, 0x08, 0xE0, 0x6E, 0xF0, 0x0F, 0xA8, + 0x44, 0x00, 0xC1, 0xE0, 0x09, 0xE0, 0x21, 0xAF, 0x64, 0x00, 0xC1, 0xE0, + 0x43, 0x2A, 0x56, 0xE0, 0x21, 0xAE, 0x27, 0x00, 0x40, 0x2A, 0x56, 0xE0, + 0x27, 0xAE, 0x17, 0xE0, 0x9B, 0xF0, 0x72, 0x2A, 0xBB, 0xF0, 0x05, 0xA8, + 0x29, 0xF0, 0x7C, 0x2A, 0x49, 0xF0, 0x7B, 0x2A, 0x2E, 0xF0, 0x03, 0xAA, + 0x40, 0x2A, 0x4E, 0xF0, 0x56, 0xE0, 0x2D, 0xAE, 0x0F, 0xA8, 0x40, 0x2A, + 0x51, 0x4C, 0x50, 0x20, 0x38, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x01, 0x01, + 0xC2, 0xE0, 0x08, 0xAE, 0x08, 0xAE, 0x52, 0x4C, 0x50, 0x20, 0x05, 0x02, + 0x03, 0xA8, 0x71, 0x46, 0x03, 0xAA, 0x72, 0x2A, 0x08, 0xAE, 0x50, 0x4C, + 0x52, 0x20, 0x4B, 0xF0, 0x1E, 0xE4, 0x00, 0xA2, 0x42, 0x01, 0xC2, 0xE0, + 0x07, 0xAE, 0x17, 0xE0, 0x43, 0x2A, 0xD0, 0x11, 0x28, 0x28, 0x02, 0x01, + 0xC2, 0xE0, 0x56, 0xE0, 0x04, 0x01, 0xC2, 0xE0, 0x40, 0x4C, 0x06, 0xAE, + 0x06, 0xAE, 0x28, 0x4C, 0x08, 0xAE, 0x10, 0xA2, 0x72, 0x28, 0x04, 0x02, + 0xC2, 0xE0, 0x40, 0x4C, 0x35, 0x28, 0x8B, 0xF0, 0x7B, 0x2A, 0x5A, 0xF0, + 0x7E, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x3E, 0xF0, 0x69, 0x00, 0xC0, 0xE0, + 0x43, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x34, 0x28, 0x7F, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x14, 0x02, 0xC2, 0xE0, 0x0B, 0x02, 0x3B, 0xF0, 0x40, 0x2A, + 0x02, 0x03, 0xC2, 0xE0, 0xC2, 0xE0, 0x35, 0x28, 0xEA, 0xF0, 0x7B, 0x28, + 0xC2, 0xE0, 0x83, 0x03, 0xC2, 0xE0, 0x80, 0x03, 0x1E, 0xE4, 0x89, 0x03, + 0xC2, 0xE0, 0x86, 0x03, 0x00, 0xA2, 0x21, 0x13, 0x1E, 0xE4, 0xC6, 0x11, + 0xC2, 0xE0, 0x34, 0x28, 0x02, 0x03, 0xC2, 0xE0, 0x7B, 0x2A, 0x8B, 0xF0, + 0x40, 0x2A, 0x72, 0x00, 0x31, 0x2A, 0x49, 0xF0, 0x7C, 0x2A, 0x69, 0xF0, + 0x40, 0x2A, 0x35, 0x3C, 0x02, 0xAA, 0x29, 0xF0, 0x02, 0xA0, 0x34, 0x28, + 0x7B, 0xF0, 0x05, 0xA1, 0x34, 0x3C, 0x28, 0xF0, 0x32, 0x18, 0x34, 0x3C, + 0xD8, 0xF1, 0x7B, 0x28, 0xFB, 0xF1, 0x40, 0x2A, 0x3E, 0xF0, 0x35, 0x28, + 0x3A, 0xF0, 0x72, 0x28, 0xC2, 0xE0, 0x7E, 0xA8, 0x60, 0x00, 0xC0, 0xE0, + 0x02, 0x03, 0xC2, 0xE0, 0x02, 0xA2, 0x43, 0x01, 0xC2, 0xE0, 0x80, 0x03, + 0xC2, 0xE0, 0x35, 0x28, 0xC2, 0xE0, 0x86, 0x03, 0xC2, 0xE0, 0x83, 0x03, + 0x1E, 0xE4, 0xC6, 0x11, 0x1E, 0xE4, 0x89, 0x03, 0x02, 0x03, 0xC2, 0xE0, + 0x00, 0xA2, 0x21, 0x13, 0xC2, 0xE0, 0x13, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x02, 0xA8, 0x02, 0xAF, 0x40, 0x28, 0x20, 0x03, 0x02, 0xA8, 0x40, 0x28, + 0x0D, 0x03, 0xC2, 0xE0, 0x2B, 0xF0, 0x7C, 0x2A, 0x39, 0xF0, 0x7B, 0x2A, + 0x0B, 0xAE, 0x55, 0xE0, 0x01, 0xA2, 0x02, 0xAA, 0x0B, 0xAE, 0x55, 0xE0, + 0x0B, 0xAE, 0x55, 0xE0, 0xC3, 0xE0, 0x0A, 0x03, 0xC3, 0xE0, 0x55, 0xE0, + 0xC2, 0xE0, 0x55, 0x00, 0x04, 0xE0, 0x0B, 0x03, 0xC2, 0xE0, 0x3F, 0x00, + 0x04, 0xE0, 0x0C, 0x03, 0x04, 0xE0, 0x6A, 0xF0, 0x72, 0x28, 0x26, 0x01, + 0x7E, 0xF0, 0x1F, 0x01, 0xC2, 0xE0, 0xFF, 0xFF, 0x16, 0x4D, 0x16, 0x21, + 0xC0, 0x04, 0x66, 0xE1, 0xC2, 0xE0, 0x26, 0x28, 0x1F, 0x01, 0xC2, 0xE0, + 0x1E, 0xE4, 0xB4, 0x11, 0x1E, 0xE4, 0x75, 0x01, 0x71, 0x01, 0xC2, 0xE0, + 0x28, 0x28, 0xED, 0x12, 0xC2, 0xE0, 0x06, 0x01, 0xC2, 0xE0, 0x02, 0xA2, + 0x00, 0xA2, 0xDA, 0x3C, 0x14, 0xA2, 0x39, 0x01, 0xDA, 0x2A, 0xDB, 0x3C, + 0x40, 0x01, 0xC2, 0xE0, 0xDB, 0x2A, 0x36, 0xB6, 0x00, 0xA2, 0x05, 0xA8, + 0x0D, 0x01, 0xC2, 0xE0, 0x08, 0xAE, 0x52, 0xB4, 0x10, 0xA2, 0x89, 0xF0, + 0x11, 0xA8, 0xDA, 0x2A, 0x56, 0xE0, 0x15, 0xAE, 0x17, 0xE0, 0x3E, 0x2A, + 0x39, 0x01, 0xC0, 0xE0, 0x00, 0x01, 0xC2, 0xE0, 0x0A, 0x28, 0x2E, 0xE4, + 0xDA, 0xF7, 0x04, 0xA8, 0x29, 0xF0, 0x45, 0xE0, 0x50, 0x2E, 0x02, 0xA0, + 0x0B, 0x28, 0x28, 0xE4, 0x0A, 0x3C, 0x00, 0xA2, 0xF6, 0xA2, 0x2E, 0xE4, + 0x0B, 0x3C, 0x02, 0xA0, 0x3F, 0x00, 0xC2, 0xE0, 0x5D, 0x3C, 0x55, 0x3C, + 0x13, 0x0B, 0x1E, 0xE4, 0x92, 0x3C, 0x00, 0xA2, 0x06, 0x3C, 0x2A, 0x28, + 0xF7, 0x0F, 0x1E, 0xE4, 0x33, 0x11, 0x1E, 0xE4, 0x12, 0x11, 0x1E, 0xE4, + 0xC2, 0xE0, 0x55, 0x28, 0x55, 0x3C, 0xF8, 0xA2, 0x1E, 0xE4, 0xA8, 0xF0, + 0x08, 0xA0, 0x3F, 0x00, 0x1E, 0xE4, 0xEA, 0x10, 0x1E, 0xE4, 0xF8, 0x10, + 0xFE, 0xF2, 0x37, 0x11, 0x1E, 0xE4, 0x12, 0x11, 0xF8, 0x10, 0x1E, 0xE4, + 0xE8, 0xF0, 0x02, 0xA1, 0x12, 0x11, 0x1E, 0xE4, 0xEA, 0x10, 0x1E, 0xE4, + 0x2B, 0x10, 0x1E, 0xE4, 0x37, 0x11, 0x1E, 0xE4, 0xD4, 0xF1, 0x0E, 0xF2, + 0x21, 0x10, 0x1E, 0xE4, 0x18, 0xE4, 0x15, 0x28, 0xEA, 0xF0, 0x02, 0xA1, + 0x8A, 0xF0, 0x1E, 0x01, 0xC0, 0xE0, 0x7E, 0x19, 0x0B, 0x4D, 0x13, 0x21, + 0x28, 0x08, 0x63, 0xE1, 0x1E, 0xE4, 0x03, 0x3D, 0x13, 0x35, 0x02, 0xA0, + 0x1E, 0xE4, 0xF8, 0x10, 0x1E, 0xE4, 0x13, 0x0B, 0x1E, 0xE4, 0x12, 0x11, + 0x1E, 0xE4, 0xEA, 0x10, 0xBE, 0xF0, 0xB8, 0x0F, 0x1E, 0xE4, 0x32, 0x10, + 0x3B, 0x11, 0x1E, 0xE4, 0x37, 0x11, 0x1E, 0xE4, 0xF7, 0x0F, 0x1E, 0xE4, + 0x13, 0x0B, 0x1E, 0xE4, 0x02, 0xA0, 0x55, 0x28, 0x33, 0x11, 0x1E, 0xE4, + 0x5D, 0x3C, 0x66, 0x0F, 0x04, 0xE4, 0x55, 0x3C, 0x3F, 0x00, 0xC2, 0xE0, + 0x55, 0x28, 0x2E, 0xE4, 0x7F, 0x00, 0xC2, 0xE0, 0xFF, 0xFF, 0x08, 0xE0, + 0x19, 0xE4, 0x28, 0x2A, 0x4A, 0x0B, 0x1E, 0xE4, 0xD7, 0x4E, 0x03, 0xAE, + 0xD6, 0x2A, 0x0A, 0x10, 0x8E, 0x01, 0xC3, 0xE0, 0x28, 0x01, 0xC3, 0xE0, + 0xE9, 0xF7, 0x11, 0x01, 0xC1, 0xE0, 0x02, 0xA2, 0x1E, 0xE4, 0x2E, 0xE4, + 0x10, 0x01, 0xC2, 0xE0, 0x54, 0x2E, 0x0A, 0xF1, 0x68, 0x28, 0x37, 0x11, + 0xB3, 0x04, 0x67, 0xE1, 0xDB, 0xF0, 0x0F, 0xA8, 0x0F, 0xA0, 0x54, 0x2E, + 0x17, 0x4D, 0x17, 0x21, 0x42, 0xE0, 0x03, 0xA1, 0x07, 0xAE, 0x07, 0xAF, + 0xBA, 0xF0, 0x69, 0x28, 0xE8, 0x1E, 0x1E, 0xE4, 0x54, 0x2E, 0x06, 0xA1, + 0x06, 0xA8, 0x54, 0x2C, 0x03, 0xA1, 0x05, 0xAE, 0x05, 0xAF, 0x07, 0xA0, + 0xC2, 0xE0, 0x54, 0x2C, 0xA6, 0x1E, 0x18, 0xE4, 0x1E, 0xE4, 0x33, 0x11, + 0x1E, 0xE4, 0x3F, 0x00, 0x18, 0x01, 0xC0, 0xE0, 0x90, 0xE1, 0x37, 0x11, + 0xD6, 0x28, 0x2E, 0xE4, 0x8A, 0xF7, 0x02, 0xA8, 0x28, 0x01, 0xC2, 0xE0, + 0xD7, 0x4C, 0x02, 0xAE, 0x55, 0x28, 0x2E, 0xE4, 0x8E, 0x01, 0xC2, 0xE0, + 0xE0, 0x3C, 0x06, 0xAE, 0x0E, 0xA8, 0x02, 0xA1, 0x06, 0xAE, 0x0E, 0xA8, + 0x55, 0x28, 0x2E, 0xE4, 0x90, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0xDF, 0x3C, + 0xDF, 0x28, 0x09, 0x03, 0xC2, 0xE0, 0x05, 0x3C, 0x62, 0xE1, 0x92, 0xE0, + 0x00, 0x02, 0x00, 0xE0, 0x20, 0xC4, 0xB0, 0x03, 0x63, 0xE1, 0x91, 0x01, + 0x1E, 0x10, 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0x2E, 0xE4, 0x11, 0x3D, + 0x11, 0x35, 0x12, 0x9E, 0x19, 0x01, 0xC2, 0xE0, 0x62, 0x28, 0x2E, 0xE4, + 0x61, 0x28, 0x1A, 0x01, 0xC2, 0xE0, 0x60, 0x28, 0x00, 0xA2, 0x2E, 0xE4, + 0x1B, 0x01, 0xC2, 0xE0, 0x60, 0x3C, 0x22, 0x22, 0x04, 0xE0, 0x62, 0x3C, + 0x55, 0x2C, 0x5D, 0x2A, 0x2E, 0xE4, 0x61, 0x3C, 0x54, 0x1C, 0x0C, 0xA0, + 0x55, 0x28, 0x2B, 0xF0, 0x2E, 0xE4, 0xD6, 0x3C, 0x02, 0xA2, 0x34, 0xF0, + 0x45, 0xE0, 0x50, 0x2E, 0x02, 0xA0, 0x0A, 0x28, 0x48, 0xF0, 0x0A, 0x3C, + 0x00, 0xA2, 0x29, 0xF0, 0x82, 0xE0, 0x0B, 0x3C, 0x02, 0xA0, 0x0B, 0x28, + 0x63, 0xE1, 0x20, 0x07, 0x61, 0xE1, 0x48, 0x3C, 0x6C, 0x28, 0x06, 0x3C, + 0x03, 0x29, 0x6E, 0x08, 0x0B, 0x28, 0x6D, 0x3C, 0xDF, 0x10, 0x0A, 0xE4, + 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x11, 0x2B, 0x56, 0xE0, + 0x11, 0x1B, 0x0A, 0x2A, 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, + 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, 0x06, 0x3E, 0x11, 0x1B, 0x0A, 0x2A, + 0x56, 0xE0, 0x0B, 0x1A, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, + 0x0B, 0x28, 0x06, 0x3E, 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, + 0x11, 0x2B, 0x11, 0x19, 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, + 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, + 0x0B, 0x28, 0x06, 0x3E, 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, + 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x28, 0x06, 0x3E, + 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, 0x11, 0x19, + 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, 0x24, 0xF0, 0x11, 0x2B, + 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, 0x06, 0x3E, + 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, 0x56, 0xE0, 0x0A, 0x1A, + 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x28, 0x06, 0x3E, 0x24, 0xF0, 0x11, 0x2B, + 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x11, 0x2B, 0x56, 0xE0, + 0x11, 0x1B, 0x0A, 0x2A, 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, + 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, 0x06, 0x3E, 0x11, 0x1B, 0x0A, 0x2A, + 0x56, 0xE0, 0x0B, 0x1A, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, + 0x0B, 0x28, 0x06, 0x3E, 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, + 0x11, 0x2B, 0x11, 0x19, 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, + 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, + 0x0B, 0x28, 0x06, 0x3E, 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, + 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, 0x48, 0x28, 0x06, 0x3E, + 0x24, 0xF0, 0x11, 0x2B, 0x01, 0xA2, 0x6E, 0x08, 0x06, 0x28, 0x92, 0xE0, + 0x5C, 0x3C, 0x66, 0xE0, 0x67, 0xA2, 0x62, 0xE0, 0x46, 0x01, 0xC1, 0xE0, + 0x2E, 0xE4, 0x06, 0x3C, 0xBB, 0xF7, 0x03, 0xA8, 0x0F, 0xAF, 0x4A, 0xE0, + 0xED, 0x4E, 0xEC, 0x26, 0x3F, 0x00, 0x08, 0xE0, 0x2E, 0xE4, 0xED, 0x3C, + 0xEC, 0x34, 0x42, 0xE0, 0xA9, 0xF0, 0x15, 0x2A, 0xAA, 0x3C, 0x5C, 0x28, + 0x3C, 0x10, 0x1E, 0xE4, 0x4B, 0xF0, 0x6B, 0x2A, 0x06, 0x3C, 0x5C, 0x3C, + 0x2A, 0x28, 0x2E, 0xE4, 0x6B, 0x2A, 0x6D, 0x19, 0x1E, 0xE4, 0x2E, 0xE4, + 0x1E, 0xE4, 0x3C, 0x10, 0x1E, 0xE4, 0x6B, 0xF0, 0xF5, 0x18, 0x1E, 0xE4, + 0x2E, 0xE4, 0xDB, 0x18, 0x3C, 0x08, 0x65, 0xE1, 0x2E, 0xE4, 0x06, 0x3C, + 0x1E, 0xF0, 0x39, 0x18, 0x18, 0xE4, 0x05, 0x29, 0xBA, 0x3C, 0x06, 0x28, + 0xAE, 0x11, 0x1E, 0xE4, 0x00, 0xE0, 0x66, 0xA5, 0x00, 0xA4, 0x24, 0x08, + 0x0C, 0xAE, 0x06, 0x29, 0x9C, 0xE0, 0xF0, 0x02, 0xC2, 0xE0, 0xBA, 0x4C, + 0x0C, 0xAE, 0x06, 0x4D, 0x71, 0x01, 0xC2, 0xE0, 0x28, 0x28, 0x15, 0x01, + 0x06, 0x00, 0x62, 0xE1, 0x22, 0x08, 0x63, 0xE1, 0x02, 0xA2, 0x2E, 0xE4, + 0x03, 0x3D, 0x02, 0x29, 0xC0, 0xE0, 0x2E, 0xE4, 0x10, 0x01, 0xC2, 0xE0, + 0xC0, 0xE0, 0x2E, 0xE4, 0xE8, 0xF7, 0x11, 0x01, 0x04, 0xE0, 0x2E, 0xE4, + 0xEA, 0xF7, 0x1C, 0x01, 0x00, 0x21, 0x0A, 0xE0, 0x20, 0xAE, 0x10, 0x32, + 0x10, 0x92, 0x04, 0xE0, 0x55, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0x21, + 0x0A, 0xE0, 0x20, 0xAE, 0x20, 0xAE, 0x00, 0x10, 0x04, 0xE0, 0x58, 0x01, + 0x56, 0x01, 0xC2, 0xE0, 0x00, 0x10, 0x0A, 0xE0, 0x04, 0x00, 0x04, 0xE0, + 0x59, 0x01, 0xC2, 0xE0, 0x57, 0x01, 0xC2, 0xE0, 0x54, 0x01, 0xC2, 0xE0, + 0x2E, 0xE4, 0x5A, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x63, 0xE1, 0x49, 0xF0, + 0xAE, 0x11, 0x1E, 0xE4, 0x22, 0x08, 0x63, 0xE1, 0x3E, 0xF0, 0x23, 0x08, + 0x4E, 0xA5, 0x08, 0xB6, 0x18, 0xA1, 0x03, 0x29, 0x06, 0x29, 0x9C, 0xE0, + 0x30, 0x03, 0x00, 0xE0, 0xC2, 0xE0, 0x28, 0x28, 0x70, 0x01, 0xC2, 0xE0, + 0x72, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x01, 0xE2, 0x28, 0x2A, 0xE4, + 0x28, 0x28, 0x2E, 0xE4, 0x02, 0xA2, 0x28, 0xE4, 0x72, 0x28, 0x28, 0xE4, + 0x3B, 0xF0, 0x03, 0x2B, 0x51, 0x08, 0x63, 0xE1, 0x16, 0xB6, 0x1E, 0x2A, + 0x56, 0xE0, 0x09, 0xA2, 0x1E, 0x4C, 0x20, 0xAE, 0x1F, 0x4C, 0x02, 0xAE, + 0x4A, 0x4C, 0x4F, 0x20, 0x08, 0x01, 0xC2, 0xE0, 0x00, 0xA9, 0x54, 0x20, + 0x09, 0x01, 0xC2, 0xE0, 0x4C, 0x4C, 0x4B, 0x20, 0x0A, 0x01, 0xC2, 0xE0, + 0x4E, 0x4C, 0x4D, 0x20, 0x0B, 0x01, 0xC2, 0xE0, 0x28, 0x28, 0x2E, 0xE4, + 0x0C, 0x01, 0xC2, 0xE0, 0x72, 0x28, 0x28, 0xE4, 0xE2, 0x28, 0x2A, 0xE4, + 0x4B, 0x34, 0x0B, 0x01, 0xC0, 0xE0, 0x28, 0xE4, 0x4D, 0x34, 0x0C, 0x01, + 0xC0, 0xE0, 0x4C, 0x3C, 0x00, 0x01, 0xC1, 0xE0, 0x2E, 0xE4, 0x4E, 0x3C, + 0x2E, 0xE4, 0x2E, 0xE4, 0x03, 0xA8, 0x21, 0xAF, 0xA0, 0x01, 0x67, 0xE1, + 0x0A, 0xF1, 0x28, 0x28, 0x04, 0xA2, 0x51, 0x01, 0xC3, 0xE0, 0x07, 0x2B, + 0x50, 0x01, 0xC0, 0xE0, 0x50, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x08, 0xA2, + 0xDA, 0xF7, 0x04, 0xA8, 0xC0, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x50, 0x01, + 0x2E, 0xE4, 0x02, 0xA8, 0x06, 0xAF, 0x44, 0x00, 0x58, 0xF0, 0x80, 0xA8, + 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x44, 0x00, 0xC0, 0xE0, + 0x0E, 0xA8, 0x20, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x0D, 0xAF, 0x44, 0x00, + 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x56, 0xE0, 0x03, 0xAE, + 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x44, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0x07, 0xA8, 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, 0x1B, 0xAF, + 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, 0x02, 0xA8, 0x20, 0xAF, + 0x44, 0x00, 0xC0, 0xE0, 0x60, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, + 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x00, 0xE0, 0x18, 0xE0, + 0x88, 0xC7, 0xA4, 0xCC, 0xC2, 0xE0, 0x02, 0xA2, 0x9E, 0xE0, 0x00, 0x05, + 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x0D, 0x04, 0x04, 0xAF, 0xCC, 0x11, + 0x1E, 0xE4, 0xDA, 0xF7, 0xE1, 0x11, 0x1E, 0xE4, 0xD9, 0x11, 0x1E, 0xE4, + 0x1E, 0xE4, 0x1E, 0xA8, 0x17, 0x12, 0x0B, 0xE4, 0x20, 0xAE, 0x56, 0xE0, + 0x09, 0xAE, 0xE6, 0x11, 0xFF, 0x1F, 0x09, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, + 0x77, 0x12, 0x1E, 0xE4, 0x17, 0x9F, 0x56, 0xE0, 0x22, 0xD0, 0x62, 0x00, + 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x28, 0x12, 0x84, 0xE1, 0x02, 0x00, + 0x22, 0xD0, 0x7A, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x30, 0x12, + 0x84, 0xE1, 0x02, 0x00, 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, + 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, + 0x20, 0x00, 0x05, 0xE0, 0x00, 0xE0, 0x5E, 0xF8, 0xD0, 0x03, 0x11, 0xD1, + 0x20, 0xCE, 0x40, 0x0B, 0x11, 0xD1, 0x80, 0x01, 0x13, 0x01, 0xEC, 0x88, + 0xC0, 0x00, 0x12, 0xD1, 0x70, 0x28, 0x2E, 0xE4, 0xF9, 0xF7, 0x29, 0xCA, + 0x24, 0xE4, 0x02, 0xA1, 0x32, 0x28, 0x94, 0xE0, 0x1E, 0xE4, 0x0C, 0xC4, + 0x49, 0xE0, 0x92, 0xE0, 0xA4, 0xCC, 0x8E, 0xF7, 0x82, 0xE0, 0x57, 0x12, + 0xD0, 0x03, 0x00, 0xE0, 0x18, 0xE0, 0x86, 0xC7, 0x9C, 0xE0, 0x70, 0x07, + 0x00, 0xE0, 0x9A, 0xE0, 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, 0x07, 0xAE, + 0x1E, 0xE4, 0x04, 0xAF, 0xD0, 0x11, 0x1E, 0xE4, 0x42, 0xE0, 0x85, 0xE0, + 0x20, 0xAE, 0xD9, 0x11, 0x17, 0x9F, 0x73, 0x12, 0x1E, 0xE4, 0x17, 0x9F, + 0x50, 0x20, 0x2E, 0xE4, 0x82, 0x12, 0x1E, 0xE4, 0x50, 0x20, 0x2E, 0xE4, + 0x08, 0xAE, 0x51, 0x4C, 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x51, 0x4C, + 0x50, 0x4C, 0x51, 0x20, 0x39, 0xF0, 0x23, 0xA1, 0xC2, 0xE0, 0x02, 0xA2, + 0x2E, 0xE4, 0x08, 0xAE, 0xC0, 0xE0, 0x0E, 0x04, 0xC2, 0xE0, 0x0D, 0x04, + 0x22, 0xD0, 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, 0x15, 0x21, 0x91, 0x12, + 0x84, 0xE1, 0x02, 0x00, 0x02, 0x00, 0x22, 0xD0, 0x17, 0x9F, 0x15, 0x4D, + 0x16, 0x4D, 0x16, 0x21, 0x98, 0x12, 0x84, 0xE1, 0x0D, 0x04, 0xC2, 0xE0, + 0x00, 0xA2, 0x17, 0x9F, 0x20, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x02, 0xA8, 0x0D, 0x04, 0xC3, 0xE0, + 0x03, 0xA2, 0x3E, 0xA8, 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, + 0x20, 0x04, 0xC1, 0xE0, 0x9E, 0xE0, 0x00, 0x05, 0x64, 0x00, 0xC0, 0xE0, + 0xDB, 0xF7, 0x03, 0xA8, 0xD9, 0x11, 0x1E, 0xE4, 0x02, 0xA8, 0x24, 0xAF, + 0xC1, 0x12, 0x0B, 0xE4, 0xE1, 0x11, 0x1E, 0xE4, 0x09, 0xAE, 0xE6, 0x11, + 0x1E, 0xE4, 0x1E, 0xA8, 0x61, 0x00, 0xC1, 0xE0, 0x20, 0xAE, 0x56, 0xE0, + 0x17, 0x9F, 0x56, 0xE0, 0xFF, 0x1F, 0x09, 0xE0, 0x48, 0xF0, 0x02, 0xA8, + 0x64, 0x00, 0xC0, 0xE0, 0x51, 0x20, 0x3E, 0xF0, 0x51, 0x4C, 0x50, 0x20, + 0xC0, 0xE0, 0x17, 0x9F, 0x08, 0xAE, 0x50, 0x4C, 0x6B, 0x00, 0xC0, 0xE0, + 0x17, 0x9F, 0x6A, 0x00, 0x17, 0x9F, 0x6C, 0x00, 0xC0, 0xE0, 0x17, 0x9F, + 0xC0, 0xE0, 0x17, 0x9F, 0x7A, 0x00, 0xC0, 0xE0, 0x7C, 0x00, 0xC0, 0xE0, + 0x17, 0x9F, 0x7B, 0x00, 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, + 0x7A, 0x3C, 0x90, 0x01, 0x04, 0xE0, 0x2E, 0xE4, 0xDE, 0x4C, 0x04, 0xAE, + 0x02, 0xA2, 0x2E, 0xE4, 0x15, 0xA1, 0x50, 0x2A, 0xDC, 0x4C, 0x08, 0xAE, + 0x80, 0x01, 0xC2, 0xE0, 0x06, 0xA9, 0x21, 0xF0, 0xC2, 0xE0, 0x03, 0x29, + 0x63, 0x08, 0x63, 0xE1, 0x85, 0x01, 0xC2, 0xE0, 0xDD, 0x28, 0x81, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0xFA, 0xF1, 0x28, 0x28, 0x1E, 0xA1, 0x3D, 0x28, + 0x01, 0xA2, 0x7A, 0x01, 0x04, 0xAE, 0x03, 0x3C, 0x48, 0xA5, 0x00, 0xA4, + 0x17, 0x81, 0x9E, 0xE0, 0x50, 0x02, 0x00, 0xE0, 0x8A, 0x01, 0xC2, 0xE0, + 0x00, 0xA2, 0x17, 0x81, 0x8C, 0x01, 0xC2, 0xE0, 0x8B, 0x01, 0xC2, 0xE0, + 0x88, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x17, 0x81, 0x89, 0x01, 0xC2, 0xE0, + 0x7A, 0x4C, 0x00, 0xA2, 0x40, 0x2A, 0x7E, 0xA8, 0x35, 0x28, 0x2E, 0xE4, + 0x40, 0x2A, 0x6B, 0xF0, 0x7B, 0x2A, 0x1B, 0xF1, 0xAE, 0xF0, 0x56, 0xE0, + 0x11, 0xAE, 0x03, 0xAA, 0x11, 0xAE, 0x05, 0xA2, 0x5B, 0xF0, 0x7C, 0x2A, + 0x11, 0xAE, 0x40, 0x2A, 0x4E, 0xF0, 0x56, 0xE0, 0x2E, 0xE4, 0x84, 0x01, + 0xC2, 0xE0, 0x56, 0xE0, 0x48, 0xA5, 0x00, 0xA4, 0x1E, 0xA1, 0x06, 0x28, + 0x06, 0x29, 0x9C, 0xE0, 0x60, 0x03, 0x00, 0xE0, 0x81, 0x28, 0x2E, 0xE4, + 0x8D, 0x01, 0xC2, 0xE0, 0x22, 0xF0, 0x46, 0xE0, 0x0A, 0x00, 0x05, 0xE0, + 0x48, 0xF0, 0x04, 0xA1, 0x15, 0x28, 0x81, 0x3E, 0x00, 0xA2, 0x81, 0x3E, + 0xD0, 0x07, 0x05, 0xE0, 0x8A, 0xF0, 0x08, 0xA1, 0x15, 0x28, 0xC4, 0x3C, + 0x46, 0xE0, 0xC8, 0x00, 0x05, 0xE0, 0x81, 0x28, 0x1E, 0xE4, 0xC4, 0x3C, + 0x02, 0xA2, 0x32, 0xF0, 0x64, 0xE1, 0x12, 0x08, 0x63, 0xE1, 0x65, 0x1C, + 0x04, 0x3D, 0x03, 0x35, 0x00, 0xA2, 0x13, 0x08, 0x08, 0xE0, 0x17, 0x7C, + 0x10, 0xC7, 0x16, 0x2C, 0x88, 0x3C, 0x02, 0xAF, 0x02, 0xA0, 0xFF, 0xFF, + 0x14, 0x2A, 0x5B, 0xF0, 0x40, 0x2A, 0x14, 0x28, 0x91, 0x3C, 0x02, 0xAE, + 0x27, 0xF0, 0x03, 0xA1, 0x2A, 0x1B, 0x1E, 0xE4, 0x04, 0x1B, 0x1E, 0xE4, + 0x1E, 0xE4, 0x39, 0xF0, 0x7F, 0x2A, 0x80, 0x28, 0x1E, 0xE4, 0x04, 0xA0, + 0x8A, 0x3C, 0x66, 0x1A, 0x63, 0xE1, 0x02, 0xA2, 0xAB, 0x3C, 0xA2, 0x1C, + 0x08, 0x3E, 0x03, 0xA1, 0x51, 0x2A, 0x10, 0x05, 0x9B, 0x1A, 0x1E, 0xE4, + 0x13, 0x3D, 0x08, 0x86, 0x90, 0x28, 0x9C, 0x13, 0x18, 0xE4, 0xC4, 0x28, + 0x00, 0xA2, 0x8F, 0x3C, 0x00, 0xA2, 0x38, 0xF0, 0x02, 0xA2, 0x03, 0x3D, + 0x16, 0x08, 0x63, 0xE1, 0x2E, 0xE4, 0x03, 0x3D, 0x14, 0x08, 0x63, 0xE1, + 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, 0x51, 0x28, 0x00, 0xA2, 0x04, 0x3D, + 0x1E, 0x08, 0x64, 0xE1, 0xC8, 0x3C, 0xC7, 0x3C, 0xC5, 0x3C, 0xC6, 0x3C, + 0x2B, 0xF0, 0x40, 0x2A, 0x88, 0x28, 0x81, 0x84, 0x18, 0xE0, 0x2B, 0x1D, + 0x1E, 0xE4, 0x02, 0xAE, 0x05, 0xE0, 0x2B, 0x1D, 0x1E, 0xE4, 0x04, 0x85, + 0x49, 0xE0, 0xE9, 0x1C, 0x1E, 0xE4, 0xE8, 0x03, 0x61, 0xE0, 0x04, 0xA2, + 0x72, 0xF1, 0x04, 0x19, 0xC6, 0x7C, 0x0F, 0xC7, 0x04, 0x29, 0xC6, 0x3E, + 0xC5, 0x3C, 0x02, 0xA0, 0xFF, 0xFF, 0x08, 0xE0, 0x39, 0x3C, 0x18, 0xE0, + 0x50, 0x82, 0xC6, 0x84, 0x37, 0x3C, 0x02, 0xA2, 0x8A, 0x3C, 0x66, 0xA2, + 0x6E, 0xF0, 0x70, 0x06, 0x1E, 0xE4, 0x38, 0x3C, 0x1E, 0xE4, 0x38, 0x3C, + 0x37, 0x3C, 0x00, 0xA2, 0x99, 0x3C, 0x98, 0x3C, 0x00, 0xA2, 0x70, 0x06, + 0x64, 0xE1, 0x2E, 0xE4, 0x89, 0x3C, 0x02, 0xA2, 0x1E, 0xE4, 0x1F, 0xA2, + 0x91, 0x28, 0x68, 0x08, 0x63, 0xE1, 0x8A, 0x28, 0x08, 0x3C, 0xE9, 0x1C, + 0x63, 0xE1, 0xB9, 0xF0, 0x03, 0x2B, 0x14, 0x08, 0x1E, 0xE4, 0x04, 0x29, + 0x03, 0x2B, 0x47, 0x08, 0x69, 0x08, 0x63, 0xE1, 0x08, 0x18, 0xE9, 0x1C, + 0x62, 0xE0, 0x19, 0xA2, 0xAE, 0x3C, 0x03, 0x19, 0x00, 0xA2, 0xAE, 0x3C, + 0x66, 0xE0, 0x67, 0xA2, 0x21, 0x1C, 0x1A, 0xE4, 0xC4, 0x28, 0x04, 0x3D, + 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, 0x51, 0x28, 0x2E, 0xE4, 0x03, 0x3D, + 0x1E, 0x08, 0x63, 0xE1, 0x9B, 0x4C, 0x9A, 0x24, 0x48, 0xF0, 0xC6, 0x28, + 0xC6, 0x84, 0x9B, 0x4C, 0x9A, 0x24, 0xBE, 0xF0, 0x1E, 0x08, 0x64, 0xE1, + 0x2B, 0x1D, 0x1E, 0xE4, 0x65, 0xE1, 0xE9, 0x1C, 0x1E, 0xE4, 0x04, 0x2B, + 0x05, 0x35, 0x3A, 0x08, 0x66, 0xE1, 0x39, 0x08, 0xA2, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x06, 0x3D, 0x9E, 0x3C, 0x95, 0x3C, 0x94, 0x3C, 0xA3, 0x3C, + 0xA8, 0x3C, 0xA7, 0x3C, 0xA6, 0x3C, 0x9F, 0x3C, 0x18, 0x08, 0x62, 0xE1, + 0x92, 0x3C, 0xA9, 0x3C, 0x48, 0x08, 0x64, 0xE1, 0x19, 0x08, 0x63, 0xE1, + 0x5F, 0x3C, 0x04, 0x3D, 0x03, 0x3D, 0x02, 0x3D, 0x4A, 0x08, 0x65, 0xE1, + 0xC1, 0x3C, 0xC2, 0x3C, 0x50, 0x28, 0x0B, 0x3C, 0xFE, 0xA2, 0x05, 0x3D, + 0xC4, 0x28, 0xCF, 0x19, 0x1E, 0xE4, 0x0A, 0x3C, 0x00, 0xA2, 0x04, 0x14, + 0x1E, 0xE4, 0x3A, 0xF0, 0x3D, 0x08, 0x62, 0xE1, 0xC8, 0x3C, 0xC7, 0x34, + 0x3F, 0x08, 0x64, 0xE1, 0x3E, 0x08, 0x63, 0xE1, 0x42, 0x08, 0x66, 0xE1, + 0x44, 0x08, 0x65, 0xE1, 0x03, 0x3D, 0x02, 0x3D, 0x43, 0x08, 0x67, 0xE1, + 0x07, 0x3D, 0x06, 0x3D, 0x05, 0x3D, 0x04, 0x3D, 0x76, 0x01, 0xC2, 0xE0, + 0x58, 0x01, 0xC2, 0xE0, 0x90, 0x01, 0x04, 0xE0, 0x40, 0x08, 0x64, 0xE1, + 0x28, 0x28, 0x89, 0x01, 0xC2, 0xE0, 0x04, 0x3D, 0x1E, 0xE4, 0x03, 0x3D, + 0x17, 0x08, 0x63, 0xE1, 0x5A, 0xF0, 0x08, 0xA1, 0x15, 0x28, 0x57, 0x1B, + 0x8D, 0x14, 0x0E, 0xE4, 0x85, 0x1B, 0x1E, 0xE4, 0x8E, 0x3C, 0x8D, 0x34, + 0x73, 0x00, 0xC0, 0xE0, 0x99, 0x3C, 0x98, 0x34, 0x72, 0x00, 0xC0, 0xE0, + 0x7E, 0xA8, 0x18, 0xAF, 0x75, 0x00, 0xC0, 0xE0, 0x4A, 0x08, 0x65, 0xE1, + 0x3D, 0x3C, 0x5C, 0x3C, 0x05, 0x31, 0x24, 0xAF, 0x75, 0x00, 0xC0, 0xE0, + 0x7E, 0xA8, 0x28, 0xAF, 0x75, 0x00, 0xC0, 0xE0, 0x7F, 0xA8, 0x35, 0xAF, + 0x75, 0x00, 0xC1, 0xE0, 0x6B, 0x2A, 0x87, 0x3C, 0x56, 0xE0, 0x11, 0xAE, + 0x9C, 0x20, 0x7B, 0xF1, 0x6B, 0x2A, 0x18, 0xF0, 0x00, 0x1D, 0x1E, 0xE4, + 0x54, 0x2A, 0x9D, 0x4C, 0x49, 0xE0, 0x75, 0x00, 0xC0, 0xE0, 0xB7, 0x3C, + 0x0C, 0xAF, 0x4A, 0xE0, 0xB6, 0x3C, 0x7E, 0xA8, 0x5C, 0x28, 0x4A, 0xE0, + 0xB5, 0x3C, 0x7E, 0xA8, 0x03, 0x19, 0x6C, 0x08, 0x63, 0xE1, 0x3D, 0x3C, + 0x9C, 0x04, 0x99, 0x4C, 0x98, 0x24, 0x6E, 0x3C, 0xBA, 0x34, 0x9B, 0x1C, + 0x9A, 0x14, 0x9D, 0x0C, 0xB0, 0x34, 0x00, 0xA2, 0x23, 0xF0, 0xBA, 0x2A, + 0x15, 0x2A, 0x8E, 0x4C, 0x8D, 0x24, 0xB1, 0x3C, 0xBA, 0x3E, 0x0F, 0xA2, + 0x79, 0xF0, 0x09, 0xA1, 0x06, 0xAF, 0x2B, 0x1D, 0x1E, 0xE4, 0xBA, 0x84, + 0xB1, 0x1C, 0xB0, 0x14, 0xBD, 0x3C, 0xBC, 0x34, 0xBC, 0x24, 0x52, 0xF0, + 0xBA, 0x28, 0xBA, 0x34, 0x5C, 0x28, 0xB1, 0x3C, 0xB0, 0x34, 0xBD, 0x4C, + 0x8D, 0x24, 0x9A, 0xF0, 0x6B, 0x28, 0xB9, 0x3C, 0x9E, 0x34, 0xB1, 0x1C, + 0xB0, 0x14, 0x8E, 0x4C, 0xAB, 0x28, 0xB9, 0x3C, 0x00, 0xA2, 0x9F, 0x3C, + 0x06, 0xA0, 0xAB, 0x28, 0x84, 0x3C, 0x06, 0xA1, 0x45, 0xE0, 0xAB, 0x2A, + 0x8A, 0x28, 0x85, 0x3C, 0x8A, 0x28, 0x85, 0x3C, 0x06, 0xA0, 0x33, 0xF0, + 0x06, 0xA1, 0x37, 0xF0, 0x45, 0xE0, 0xAB, 0x2A, 0x4A, 0x08, 0x65, 0xE1, + 0x5C, 0x28, 0x84, 0x3C, 0x14, 0x08, 0x63, 0xE1, 0x2E, 0xE4, 0x05, 0x2B, + 0x62, 0xE1, 0x03, 0x3D, 0x00, 0xA2, 0x03, 0x29, 0xC2, 0xE0, 0x02, 0x4D, + 0x12, 0x25, 0x18, 0x08, 0x12, 0x35, 0x37, 0x08, 0x62, 0xE1, 0x63, 0x00, + 0xD2, 0x1A, 0x1B, 0xE4, 0xC4, 0x2A, 0x02, 0x3D, 0xA3, 0x4C, 0xA2, 0x24, + 0xA8, 0xF0, 0x72, 0x28, 0xFF, 0xFF, 0x08, 0xE0, 0x54, 0x7C, 0x10, 0xC7, + 0xAB, 0x28, 0xAB, 0x3C, 0x02, 0xAF, 0x02, 0xA0, 0x66, 0xE0, 0x67, 0xA2, + 0x62, 0xE0, 0x19, 0xA2, 0x03, 0x29, 0x68, 0x08, 0x63, 0xE1, 0xAB, 0x3C, + 0x02, 0xAE, 0xAB, 0x28, 0x03, 0x3D, 0xAB, 0x08, 0xC4, 0x28, 0x2E, 0xE4, + 0x62, 0x00, 0xC2, 0xE0, 0x94, 0x3C, 0x00, 0xA2, 0xA5, 0x15, 0x0A, 0xE4, + 0xA4, 0x3C, 0x9F, 0x3C, 0x9E, 0x3C, 0x95, 0x3C, 0x61, 0xE1, 0xA7, 0x3C, + 0xA6, 0x3C, 0xA5, 0x3C, 0x67, 0xE1, 0x45, 0x08, 0x62, 0xE1, 0x3C, 0x08, + 0x07, 0x3D, 0x02, 0x3D, 0x01, 0x3D, 0x46, 0x08, 0x03, 0x3D, 0x14, 0xA2, + 0x3B, 0x08, 0x63, 0xE1, 0x02, 0xA0, 0x1A, 0x28, 0x5A, 0xF2, 0xC6, 0x28, + 0x63, 0xE1, 0x39, 0x08, 0x62, 0xE1, 0xC5, 0x18, 0x03, 0x4D, 0x02, 0x21, + 0xB4, 0xF0, 0x3A, 0x08, 0x9A, 0x22, 0x2B, 0x1D, 0x1E, 0xE4, 0x1A, 0x84, + 0x03, 0x3F, 0x02, 0x37, 0x45, 0xE0, 0x9B, 0x4E, 0x8D, 0x22, 0x7A, 0xF0, + 0x99, 0x4C, 0x98, 0x20, 0x4A, 0xE0, 0x45, 0xE0, 0x03, 0xAF, 0x8E, 0x4E, + 0x08, 0xAF, 0x8E, 0x4C, 0x8D, 0x20, 0x6E, 0xF0, 0x03, 0x4F, 0x02, 0x23, + 0x02, 0xA0, 0x14, 0xE0, 0x9D, 0x4C, 0x9C, 0x20, 0x2E, 0xF1, 0x42, 0xE0, + 0x9A, 0x26, 0x46, 0xE0, 0x09, 0xAF, 0x49, 0xE0, 0x9C, 0x24, 0x44, 0xF0, + 0x46, 0xE0, 0x9B, 0x4E, 0x9D, 0x4C, 0x9C, 0x24, 0x6E, 0xF0, 0x9D, 0x4C, + 0x22, 0xF0, 0x46, 0xE0, 0x09, 0xAF, 0x49, 0xE0, 0x01, 0xA2, 0xC8, 0x3C, + 0xC7, 0x34, 0x00, 0xA2, 0x8A, 0xF0, 0x10, 0xAF, 0xC8, 0x4C, 0xC7, 0x24, + 0x13, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0x93, 0x3E, 0x23, 0xA2, + 0x2A, 0xF0, 0x10, 0xAF, 0x79, 0xF0, 0xC6, 0x2A, 0x1E, 0x08, 0x65, 0xE1, + 0x02, 0xA1, 0x05, 0x29, 0x07, 0x3C, 0x00, 0xA2, 0x1A, 0x2A, 0x00, 0xA2, + 0xEE, 0xF0, 0x08, 0x3C, 0x18, 0xE0, 0x1A, 0x82, 0xC6, 0x84, 0x4B, 0xF0, + 0x66, 0xE0, 0x05, 0x2B, 0xC6, 0x08, 0x07, 0x3C, 0x04, 0xE0, 0x08, 0x3C, + 0x07, 0x18, 0x02, 0xA1, 0x00, 0xA2, 0x98, 0xE0, 0x07, 0x0C, 0x10, 0x05, + 0xA5, 0x3C, 0xA4, 0x34, 0x14, 0x0D, 0x08, 0x86, 0x10, 0xAF, 0xA5, 0x4C, + 0xA4, 0x20, 0x01, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0x8A, 0xF0, + 0x23, 0xA2, 0x2A, 0xF0, 0x10, 0xAF, 0x13, 0xA2, 0x2E, 0xE4, 0x90, 0xE1, + 0x90, 0xE1, 0xB4, 0x3E, 0xC6, 0x2A, 0x49, 0xF0, 0x99, 0x4E, 0x98, 0x22, + 0x39, 0x08, 0x64, 0xE1, 0x7E, 0xF0, 0x2B, 0xF0, 0x05, 0x1D, 0x04, 0x15, + 0x3A, 0x08, 0x65, 0xE1, 0x99, 0x3C, 0x98, 0x34, 0x99, 0x0C, 0x98, 0x04, + 0x46, 0xE0, 0x8E, 0x4E, 0x8D, 0x22, 0xB4, 0xF0, 0x8E, 0x4E, 0x8D, 0x22, + 0x2E, 0xE4, 0x20, 0xF0, 0x14, 0xE0, 0x2E, 0xE4, 0x99, 0x3E, 0x98, 0x36, + 0x2F, 0x28, 0x08, 0x3C, 0x07, 0x34, 0x02, 0xA0, 0x19, 0xA2, 0x2F, 0x3C, + 0x00, 0xA2, 0x09, 0x3C, 0x09, 0x28, 0x70, 0x20, 0x1E, 0xE4, 0x30, 0x3E, + 0x1E, 0xE4, 0x08, 0x4C, 0x07, 0x24, 0x2F, 0x3C, 0x10, 0xA2, 0x9A, 0x20, + 0x1E, 0xE4, 0xB2, 0x1A, 0x00, 0xA2, 0x2E, 0xE4, 0x99, 0x3C, 0x98, 0x34, + 0x9A, 0xC8, 0x2B, 0xE4, 0x99, 0x4E, 0x98, 0x22, 0x65, 0xE1, 0x39, 0x08, + 0x64, 0xE1, 0x41, 0xE0, 0x00, 0xA2, 0x05, 0x1F, 0x04, 0x13, 0x3A, 0x08, + 0x4A, 0xE0, 0x13, 0xA0, 0x15, 0xE0, 0x23, 0xE4, 0x18, 0x08, 0x62, 0xE1, + 0x9A, 0xC8, 0x2E, 0xE4, 0x03, 0x0D, 0x02, 0x01, 0x19, 0x08, 0x63, 0xE1, + 0x4A, 0xF0, 0xC4, 0x28, 0x03, 0x3D, 0x02, 0x35, 0x90, 0xE1, 0xA8, 0x15, + 0x1E, 0xE4, 0x9A, 0xC8, 0x28, 0x28, 0xBF, 0x3C, 0x8B, 0x28, 0x2E, 0xE4, + 0xBF, 0x28, 0xBF, 0x3C, 0x8C, 0x28, 0x3A, 0xF0, 0x62, 0xE0, 0x07, 0xA1, + 0x3D, 0x2A, 0x10, 0xAF, 0x3D, 0x1A, 0x7F, 0xA8, 0x11, 0xAF, 0x87, 0x2A, + 0xBE, 0x3C, 0x10, 0xAE, 0x62, 0xE0, 0x13, 0xE0, 0xBF, 0x2A, 0x3D, 0x08, + 0x7E, 0xA8, 0x87, 0x28, 0xBE, 0x28, 0x65, 0xE0, 0xFF, 0x00, 0x09, 0xE0, + 0x95, 0x4C, 0x94, 0x24, 0xBF, 0x3C, 0x56, 0xE0, 0xA9, 0x3C, 0xA8, 0x34, + 0xA1, 0x1C, 0xA0, 0x10, 0x3D, 0x18, 0x7E, 0xA8, 0xBF, 0x28, 0x14, 0xF2, + 0xB0, 0x16, 0x8E, 0x4E, 0x8D, 0x26, 0xBE, 0x3C, 0xBD, 0x3E, 0xBC, 0x36, + 0x0D, 0xAF, 0xB1, 0x1E, 0x0C, 0xAF, 0xA9, 0x4C, 0xA8, 0x20, 0xEB, 0xF0, + 0xBC, 0x22, 0x2B, 0x1D, 0x1E, 0xE4, 0xBE, 0x84, 0x08, 0xE0, 0x00, 0x1D, + 0x1E, 0xE4, 0xBD, 0x4E, 0x3D, 0x2A, 0xBE, 0x28, 0x2E, 0xF0, 0xFF, 0xFF, + 0x66, 0xE0, 0x7F, 0xA8, 0xBF, 0x2A, 0x42, 0xE0, 0x3D, 0x28, 0x11, 0xAF, + 0xBF, 0x2A, 0xFE, 0xF1, 0xB1, 0x4E, 0xB0, 0x26, 0xBE, 0x3C, 0x46, 0xE0, + 0xEB, 0xF0, 0xBD, 0x3E, 0xBC, 0x36, 0x0D, 0xAF, 0x02, 0xA0, 0x14, 0xE0, + 0xA9, 0x4C, 0xA8, 0x20, 0x2B, 0x1D, 0x1E, 0xE4, 0xBE, 0x84, 0x0C, 0xAF, + 0x00, 0x1D, 0x1E, 0xE4, 0xBD, 0x4E, 0xBC, 0x22, 0x45, 0xE0, 0x3D, 0x2A, + 0xBE, 0x28, 0x2E, 0xF0, 0xB9, 0x3C, 0x62, 0xE0, 0x10, 0xAF, 0xBF, 0x28, + 0xCA, 0xF0, 0xC6, 0x28, 0x2E, 0xE4, 0x5C, 0x3C, 0xC6, 0x7C, 0x0F, 0xC7, + 0xAA, 0xF0, 0x0B, 0x28, 0x3B, 0x08, 0x63, 0xE1, 0x68, 0xF0, 0x20, 0xAF, + 0xA8, 0x20, 0x2E, 0xE4, 0x03, 0x3D, 0x14, 0xA2, 0x94, 0x24, 0xBD, 0x3C, + 0xBC, 0x34, 0xA9, 0x4C, 0xA8, 0x34, 0xA1, 0x1C, 0xA0, 0x10, 0x95, 0x4C, + 0x06, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, 0xA9, 0x3C, 0xAA, 0xF0, 0xC6, 0x28, + 0xBF, 0x3C, 0xBE, 0x34, 0xC5, 0x18, 0x07, 0x3C, 0x02, 0xA0, 0x1A, 0x28, + 0x18, 0xE0, 0x07, 0x82, 0xC6, 0x84, 0x5A, 0xF0, 0x04, 0x29, 0x1E, 0x08, + 0x64, 0xE1, 0x4E, 0xF0, 0xB8, 0x4C, 0xB7, 0x20, 0x07, 0x3C, 0x0B, 0x18, + 0xBF, 0x1C, 0xBE, 0x14, 0xC8, 0x1C, 0xC7, 0x10, 0xA8, 0x20, 0xB6, 0x16, + 0x0E, 0xE4, 0x30, 0xF0, 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, + 0x44, 0xF0, 0x46, 0xE0, 0x03, 0xAF, 0xB6, 0x4E, 0xA8, 0x20, 0xB9, 0x3C, + 0xB9, 0x08, 0x02, 0xA2, 0x9E, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, + 0x03, 0xAE, 0xA1, 0x1E, 0xA0, 0x12, 0x9F, 0x4E, 0x3E, 0xF0, 0x00, 0xA2, + 0x30, 0xF0, 0x46, 0xE0, 0xB9, 0x3C, 0xB9, 0x08, 0x1E, 0xF0, 0x06, 0xA2, + 0xC8, 0x4C, 0xC7, 0x20, 0xF9, 0x16, 0x0E, 0xE4, 0xBF, 0x1C, 0xBE, 0x10, + 0xB8, 0x1C, 0xB7, 0x10, 0xA9, 0x4C, 0xA8, 0x20, 0xF9, 0x16, 0x06, 0xE4, + 0xF9, 0x16, 0x02, 0xE4, 0xBD, 0x1C, 0xBC, 0x10, 0x28, 0x28, 0x4A, 0xF0, + 0x02, 0xA1, 0x91, 0x28, 0xA9, 0x4C, 0xA8, 0x20, 0x88, 0xF2, 0x02, 0xA1, + 0x9F, 0x4E, 0x9E, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0x46, 0xE0, 0x03, 0xAF, + 0xA1, 0x1E, 0xA0, 0x12, 0x63, 0xE1, 0x02, 0xA2, 0xE1, 0x16, 0x02, 0xE4, + 0x02, 0xA0, 0x29, 0xF0, 0x03, 0x2B, 0x14, 0x08, 0x0E, 0xE4, 0xB9, 0x3E, + 0x45, 0xE0, 0xB9, 0x2A, 0xB9, 0x28, 0x68, 0xF0, 0x91, 0x28, 0xF9, 0x16, + 0xF9, 0x16, 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA1, 0x46, 0xE0, 0x0B, 0xA1, + 0xAB, 0x2A, 0xB9, 0x28, 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, 0xD6, 0xF0, + 0x0B, 0xA1, 0xAB, 0x2A, 0xB9, 0x28, 0x9E, 0xF0, 0x02, 0xA1, 0xB9, 0x28, + 0x46, 0xF0, 0x46, 0xE0, 0x07, 0x28, 0x3B, 0x08, 0x63, 0xE1, 0xB9, 0x3C, + 0x07, 0x84, 0x4E, 0xF0, 0x02, 0xA2, 0x38, 0xF0, 0xC7, 0x24, 0x08, 0x3C, + 0x18, 0xE0, 0x50, 0x82, 0x08, 0x2A, 0x95, 0x1C, 0x94, 0x10, 0xC8, 0x4C, + 0x17, 0xAE, 0x03, 0xA2, 0xE9, 0x1C, 0x1E, 0xE4, 0x8E, 0x4E, 0x8D, 0x26, + 0x03, 0x3D, 0x66, 0xE0, 0x66, 0xA2, 0x43, 0xF0, 0x41, 0xE0, 0x05, 0xAF, + 0xB9, 0x28, 0x42, 0xF0, 0x5E, 0xF0, 0xB9, 0x3C, 0xAB, 0x2A, 0xB9, 0x28, + 0xB9, 0x3C, 0x06, 0xA0, 0x66, 0xE0, 0x67, 0xA2, 0x62, 0xE0, 0x0B, 0xA1, + 0xA9, 0x4C, 0xA8, 0x20, 0x2E, 0xE4, 0xB9, 0x3C, 0x95, 0x4C, 0x94, 0x24, + 0xBD, 0x3C, 0xBC, 0x34, 0xA9, 0x3C, 0xA8, 0x34, 0xA1, 0x1C, 0xA0, 0x10, + 0xBE, 0x34, 0x06, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, 0x12, 0x25, 0x37, 0x08, + 0x62, 0xE1, 0xBF, 0x3C, 0xBB, 0x3C, 0xBA, 0x34, 0x08, 0xAF, 0x02, 0x4D, + 0x46, 0xE0, 0x09, 0xAF, 0x9D, 0x4E, 0x9C, 0x26, 0x94, 0x24, 0xBB, 0x3E, + 0xBA, 0x36, 0x36, 0xF0, 0x26, 0xE4, 0xBB, 0x1C, 0xBA, 0x14, 0x95, 0x4C, + 0xA8, 0x17, 0x08, 0xE4, 0x02, 0xA1, 0x15, 0x28, 0x99, 0x1C, 0x98, 0x10, + 0x8E, 0x4C, 0x8D, 0x24, 0xB8, 0x4C, 0xB7, 0x24, 0xBB, 0x3C, 0xBA, 0x34, + 0xBF, 0x1C, 0xBE, 0x14, 0x9D, 0x1C, 0x9C, 0x14, 0x49, 0xE0, 0xBB, 0x4C, + 0xBA, 0x24, 0x40, 0xF1, 0x9D, 0x1E, 0x9C, 0x16, 0xB8, 0x1C, 0xB7, 0x14, + 0x8D, 0x24, 0xA4, 0xF0, 0x46, 0xE0, 0x03, 0xAF, 0xB8, 0x0C, 0xB7, 0x00, + 0x0E, 0xAF, 0x8E, 0x4C, 0x0E, 0xF1, 0x20, 0xF0, 0xBB, 0x1C, 0xBA, 0x10, + 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0xA8, 0x20, 0x46, 0xE0, 0x03, 0xAF, + 0xB6, 0x4E, 0xB5, 0x22, 0x02, 0xA0, 0xB9, 0x28, 0x02, 0x18, 0x04, 0xE4, + 0x9C, 0x24, 0x02, 0x18, 0x0E, 0xE4, 0xB9, 0x3C, 0xBE, 0x14, 0xB8, 0x1C, + 0xB7, 0x14, 0x9D, 0x4C, 0xA8, 0x20, 0x02, 0x18, 0x06, 0xE4, 0xBF, 0x1C, + 0x02, 0xE4, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0x4A, 0xF0, 0x02, 0xA1, + 0x91, 0x28, 0x02, 0x18, 0x91, 0x28, 0x38, 0xF1, 0x02, 0xA1, 0x28, 0x28, + 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, 0x68, 0xF0, 0xAE, 0x2A, 0xB9, 0x28, + 0x02, 0x18, 0x0E, 0xE4, 0x02, 0x18, 0x06, 0xE4, 0x46, 0xE0, 0x0B, 0xA1, + 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, 0x03, 0xA1, 0xAB, 0x2A, + 0xB9, 0x28, 0x02, 0x18, 0xB9, 0x28, 0x02, 0x18, 0x06, 0xE4, 0x46, 0xE0, + 0x02, 0x18, 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA1, 0x9D, 0x1C, 0x9C, 0x14, + 0xB8, 0x4C, 0xB7, 0x24, 0xA8, 0x20, 0xA6, 0xF2, 0xBF, 0x1C, 0xBE, 0x14, + 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0x04, 0xE4, 0x46, 0xE0, + 0x03, 0xAF, 0xB6, 0x4E, 0xAA, 0xF0, 0x02, 0xA1, 0x91, 0x28, 0x02, 0x18, + 0x91, 0x2A, 0x18, 0xF1, 0x02, 0xA1, 0x28, 0x28, 0x88, 0x1A, 0x03, 0xAF, + 0x2A, 0xF0, 0x40, 0x28, 0x08, 0xA1, 0xAB, 0x1C, 0xB9, 0x28, 0xB1, 0xF0, + 0x02, 0xA0, 0xB9, 0x28, 0x02, 0x18, 0x02, 0xE4, 0xB9, 0x28, 0x02, 0x18, + 0x0E, 0xE4, 0xB9, 0x3C, 0xB9, 0x28, 0x02, 0xF3, 0x08, 0xA1, 0xAB, 0x1C, + 0x02, 0x18, 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA0, 0x9D, 0x1C, 0x9C, 0x14, + 0xB8, 0x4C, 0xB7, 0x24, 0xA8, 0x20, 0x42, 0xF2, 0xBF, 0x0C, 0xBE, 0x04, + 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0xB2, 0xF1, 0x42, 0xE0, + 0x03, 0xAF, 0xB6, 0x4E, 0x28, 0x28, 0x5A, 0xF0, 0x02, 0xA1, 0x91, 0x28, + 0xB9, 0x28, 0xDE, 0xF0, 0x2A, 0xF0, 0x02, 0xA1, 0xB9, 0x28, 0x06, 0xF1, + 0x0E, 0xA0, 0xAE, 0x1C, 0xB9, 0x28, 0xC6, 0xF0, 0x08, 0xA0, 0xAB, 0x1C, + 0xB9, 0x28, 0x8E, 0xF0, 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, 0x46, 0xF0, + 0x02, 0xA0, 0xAB, 0x1C, 0x84, 0x2A, 0xB9, 0x28, 0xB9, 0x3C, 0x02, 0xA1, + 0xB9, 0x3C, 0x66, 0xE0, 0x85, 0x2A, 0x62, 0xE0, 0xC6, 0x28, 0x3C, 0x08, + 0x63, 0xE1, 0x2E, 0xE4, 0x0F, 0xC7, 0xEA, 0xF0, 0x0B, 0x28, 0x0A, 0xF1, + 0x0B, 0x28, 0xA8, 0xF0, 0x20, 0xAF, 0xC6, 0x7C, 0x02, 0xA2, 0x46, 0x08, + 0x62, 0xE1, 0x5A, 0xF0, 0x2E, 0xE4, 0x03, 0x3D, 0x00, 0xA2, 0x02, 0x3D, + 0x8E, 0x4C, 0x8D, 0x24, 0xD8, 0xF0, 0x28, 0x28, 0x95, 0x1E, 0x94, 0x12, + 0x49, 0xE0, 0x06, 0xAF, 0x04, 0xA2, 0xD3, 0xF0, 0xC8, 0x0E, 0xC7, 0x02, + 0x8E, 0x4C, 0x8D, 0x24, 0x2E, 0xE4, 0x03, 0x3D, 0x95, 0x1E, 0x94, 0x12, + 0x49, 0xE0, 0x04, 0xAF, 0x00, 0xA2, 0x45, 0xF0, 0xC8, 0x0E, 0xC7, 0x02, + 0x03, 0x3D, 0x06, 0xA2, 0x2E, 0xE4, 0x03, 0x3D, 0x08, 0x3E, 0x07, 0x3E, + 0x01, 0xA2, 0x2E, 0xE4, 0x04, 0xE0, 0xFA, 0xF0, 0x04, 0xA1, 0x09, 0x3E, + 0xFF, 0xFF, 0x00, 0xE0, 0x20, 0xAE, 0xFF, 0xFF, 0x04, 0xA2, 0x07, 0x3C, + 0x06, 0xA2, 0x08, 0x3C, 0x14, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x09, 0x3C, + 0x06, 0xA2, 0x08, 0x3C, 0x7A, 0x28, 0x6E, 0xF1, 0x06, 0xA2, 0x09, 0x3C, + 0x04, 0xA2, 0x07, 0x3C, 0xC2, 0xE0, 0x00, 0xA2, 0x14, 0x01, 0xC2, 0xE0, + 0x20, 0xAE, 0x22, 0x22, 0x04, 0xE0, 0x23, 0x01, 0x22, 0x01, 0xC2, 0xE0, + 0x22, 0x22, 0x0A, 0xE0, 0x3D, 0x08, 0x62, 0xE1, 0x21, 0x01, 0xC2, 0xE0, + 0x3F, 0x08, 0x64, 0xE1, 0x3E, 0x08, 0x63, 0xE1, 0x03, 0x29, 0x58, 0x01, + 0xC2, 0xE0, 0x04, 0x29, 0x07, 0x28, 0x03, 0x3D, 0x02, 0x29, 0x04, 0x3D, + 0x03, 0x29, 0x40, 0x08, 0x63, 0xE1, 0x02, 0x3D, 0x03, 0x3D, 0x08, 0x28, + 0x89, 0x01, 0xC2, 0xE0, 0x43, 0x08, 0x63, 0xE1, 0x42, 0x08, 0x62, 0xE1, + 0x02, 0x29, 0x76, 0x01, 0xC2, 0xE0, 0x03, 0x29, 0x2E, 0xE4, 0x02, 0x3D, + 0x09, 0x28, 0x03, 0x3D, 0x3E, 0x08, 0x63, 0xE1, 0x3D, 0x08, 0x62, 0xE1, + 0xC2, 0xE0, 0x04, 0x29, 0x3F, 0x08, 0x64, 0xE1, 0x02, 0x29, 0x04, 0x3D, + 0x03, 0x29, 0x58, 0x01, 0x62, 0xE1, 0x02, 0x3D, 0x00, 0xA2, 0x03, 0x3D, + 0x03, 0x29, 0x43, 0x08, 0x63, 0xE1, 0x42, 0x08, 0x03, 0x3D, 0x02, 0x29, + 0x76, 0x01, 0xC2, 0xE0, 0x40, 0x08, 0x63, 0xE1, 0x02, 0x3D, 0x00, 0xA2, + 0x7A, 0x28, 0x89, 0x01, 0xC2, 0xE0, 0x03, 0x29, 0x66, 0x08, 0x65, 0xE1, + 0x2E, 0xE4, 0x03, 0x3D, 0xA3, 0x1B, 0x1E, 0xE4, 0x2A, 0xE4, 0x05, 0x29, + 0x1E, 0xE4, 0x48, 0xF0, 0x08, 0xA1, 0x15, 0x28, 0x6A, 0xF0, 0xC4, 0x28, + 0x2E, 0xE4, 0xFD, 0x15, 0x09, 0x18, 0x1E, 0xE4, 0x62, 0x16, 0x1E, 0xE4, + 0x2E, 0xE4, 0x22, 0x17, 0x1E, 0xE4, 0x2E, 0xE4, 0xB6, 0x84, 0x02, 0xF1, + 0xA9, 0x4C, 0xA8, 0x20, 0xB0, 0x26, 0x12, 0xE0, 0x2B, 0x1D, 0x1E, 0xE4, + 0x1E, 0xE4, 0x03, 0xA2, 0x29, 0xF0, 0xB1, 0x4E, 0x13, 0xE0, 0xB6, 0x2A, + 0x12, 0xE0, 0x00, 0x1D, 0x1E, 0xE4, 0xB5, 0x84, 0xCE, 0xF0, 0x62, 0xE0, + 0x29, 0xF0, 0x9F, 0x4E, 0x9E, 0x26, 0x2B, 0x1D, 0xB5, 0x2A, 0x00, 0x1D, + 0x1E, 0xE4, 0x03, 0xA2, 0x54, 0x2C, 0x2E, 0xE4, 0xB9, 0x3C, 0x66, 0xE0, + 0x0A, 0x28, 0xF1, 0x18, 0x06, 0xE4, 0x92, 0x1C, 0x05, 0x29, 0x66, 0x08, + 0x65, 0xE1, 0x68, 0xF0, 0xB9, 0x08, 0x5C, 0x28, 0xBC, 0x18, 0x18, 0xE4, + 0x5C, 0x3C, 0xA2, 0x1C, 0x1E, 0xE4, 0x5C, 0x3C, 0xA2, 0x34, 0xA3, 0x0C, + 0xA2, 0x04, 0x06, 0x3C, 0x92, 0x3C, 0x02, 0xA0, 0x92, 0x2C, 0xA3, 0x3C, + 0x90, 0x7C, 0x0F, 0xC7, 0x92, 0x2C, 0x2E, 0xE4, 0x03, 0x3D, 0x48, 0x08, + 0x63, 0xE1, 0x20, 0xAF, 0x45, 0xE0, 0x50, 0x2E, 0x02, 0xA0, 0x0A, 0x28, + 0x48, 0xF0, 0x0A, 0x3C, 0x00, 0xA2, 0x29, 0xF0, 0x54, 0x2C, 0x0B, 0x3C, + 0x02, 0xA0, 0x0B, 0x28, 0x15, 0x28, 0x68, 0x19, 0x06, 0xE4, 0x92, 0x1C, + 0x0A, 0x28, 0x28, 0x19, 0x08, 0xE4, 0x08, 0xA1, 0x5C, 0x3C, 0xB9, 0x28, + 0xA6, 0x18, 0x1A, 0xE4, 0x5C, 0x28, 0xFF, 0x1B, 0x18, 0xE4, 0x1D, 0x28, + 0x63, 0xE1, 0x5C, 0x3C, 0xA2, 0x1C, 0x1E, 0xE4, 0x26, 0x08, 0x63, 0xE1, + 0x03, 0x3D, 0x27, 0x08, 0xA3, 0x0C, 0xA2, 0x04, 0xB9, 0x28, 0x03, 0x3D, + 0x68, 0x19, 0x0E, 0xE4, 0xA3, 0x3C, 0xA2, 0x34, 0x0A, 0xF3, 0x28, 0x28, + 0x3A, 0xF0, 0x7F, 0x28, 0x1A, 0xE4, 0x0A, 0x28, 0xEA, 0xF0, 0xC4, 0x28, + 0x02, 0x29, 0x46, 0x08, 0x62, 0xE1, 0xA6, 0x18, 0x63, 0xE1, 0x84, 0x18, + 0x1E, 0xE4, 0x3A, 0xF0, 0xC4, 0x28, 0xC8, 0xF1, 0x03, 0x29, 0x3C, 0x08, + 0x6E, 0xF0, 0x28, 0xF0, 0xC6, 0x28, 0x4A, 0xF0, 0x08, 0xE4, 0x03, 0x29, + 0x14, 0x08, 0x63, 0xE1, 0x0A, 0x28, 0x48, 0xF0, 0xC4, 0x28, 0x58, 0x19, + 0x06, 0xA1, 0x8F, 0x28, 0xA6, 0x18, 0x1A, 0xE4, 0x03, 0x29, 0x48, 0x08, + 0x63, 0xE1, 0x58, 0xF0, 0x1E, 0xE4, 0x4A, 0xF0, 0x1D, 0x28, 0x88, 0xF0, + 0x5C, 0x3C, 0xB9, 0x28, 0x3E, 0xF0, 0xFF, 0x1B, 0x1E, 0xE4, 0xB9, 0x19, + 0x18, 0xE4, 0xC4, 0x28, 0xA2, 0x1C, 0x1E, 0xE4, 0x5C, 0x28, 0xAE, 0x1C, + 0xB9, 0x28, 0xD4, 0x1C, 0x1E, 0xE4, 0x5C, 0x3C, 0xA3, 0x3C, 0xA2, 0x34, + 0xA3, 0x0C, 0xA2, 0x04, 0x03, 0x29, 0x92, 0x3C, 0x02, 0xA0, 0x92, 0x2C, + 0x55, 0x2A, 0xAA, 0xF0, 0x6B, 0x28, 0x2E, 0xE4, 0xA9, 0x4C, 0xA8, 0x20, + 0x75, 0xF0, 0x05, 0xA1, 0xA9, 0x3C, 0xA8, 0x34, 0xB7, 0x18, 0x5F, 0x08, + 0x94, 0x34, 0x5F, 0x0C, 0x95, 0x4C, 0x94, 0x24, 0x06, 0xA0, 0x54, 0x2C, + 0x2E, 0xE4, 0x95, 0x3C, 0xC0, 0xE0, 0xB8, 0x19, 0x06, 0xE4, 0x92, 0x1C, + 0xC1, 0x3C, 0x02, 0xA0, 0xC1, 0x28, 0x73, 0x01, 0x8A, 0xF1, 0xC4, 0x28, + 0x28, 0xE4, 0x50, 0x18, 0x88, 0xF0, 0x06, 0x29, 0x45, 0x08, 0x66, 0xE1, + 0x0A, 0xF1, 0x05, 0x29, 0x3C, 0x08, 0x65, 0xE1, 0x04, 0xE0, 0xDE, 0xF0, + 0x06, 0x3D, 0x02, 0xA2, 0x96, 0xE0, 0x02, 0xA1, 0xC2, 0x08, 0x10, 0x05, + 0x98, 0xE0, 0xC2, 0x08, 0x10, 0x05, 0x04, 0xE0, 0x04, 0xE0, 0x1E, 0xF1, + 0x04, 0x3D, 0x03, 0x29, 0xC0, 0xE0, 0x96, 0xE0, 0xC2, 0x08, 0x10, 0x05, + 0x10, 0xAF, 0x80, 0x00, 0x00, 0xE0, 0x72, 0x01, 0x1E, 0xE4, 0x50, 0x2A, + 0xFF, 0xFF, 0x08, 0xE0, 0xC2, 0x28, 0x03, 0x3D, 0x00, 0xA4, 0xE9, 0x1C, + 0xC1, 0x3E, 0x01, 0xA2, 0xC2, 0x3C, 0x02, 0xA0, 0x03, 0xE0, 0x5F, 0x2A, + 0x5C, 0x28, 0x2E, 0xE4, 0x3B, 0x08, 0x65, 0xE1, 0xE7, 0xF0, 0x2C, 0x01, + 0x83, 0xF0, 0x64, 0x00, 0x03, 0xE0, 0x05, 0x2B, 0x66, 0xE0, 0x67, 0xA2, + 0x02, 0xA0, 0xB9, 0x28, 0x67, 0xA2, 0x0C, 0xA0, 0x5C, 0x28, 0xB9, 0x3C, + 0x15, 0x28, 0x2E, 0xE4, 0x5C, 0x3C, 0x66, 0xE0, 0x70, 0x00, 0xC0, 0xE0, + 0x78, 0xF0, 0x08, 0xA1, 0x58, 0x1A, 0x0E, 0xE4, 0x9D, 0x3C, 0x9C, 0x34, + 0x68, 0xF0, 0x28, 0x28, 0x88, 0xF0, 0xC4, 0x28, 0x02, 0x4F, 0x12, 0x27, + 0x10, 0x08, 0x62, 0xE1, 0xBA, 0x36, 0x9B, 0x4E, 0x9A, 0x26, 0x3E, 0xF0, + 0x04, 0xE0, 0x8E, 0x4E, 0x8D, 0x26, 0xBB, 0x3E, 0x46, 0xF0, 0x81, 0x18, + 0x02, 0xAE, 0xC8, 0x00, 0x09, 0xA0, 0x3E, 0xF0, 0x03, 0xAF, 0x03, 0xA0, + 0x46, 0xE0, 0x99, 0x4C, 0x98, 0x20, 0x07, 0xAF, 0x1E, 0xE4, 0x12, 0xE0, + 0x62, 0xF0, 0x89, 0x2A, 0x1E, 0xE4, 0xFE, 0x19, 0x0E, 0xE4, 0xE9, 0x1C, + 0xBB, 0x4E, 0xBA, 0x26, 0x12, 0xE0, 0xE9, 0x1C, 0x90, 0xF0, 0xAB, 0xF0, + 0x28, 0x2A, 0x42, 0xE0, 0x59, 0xF0, 0x05, 0x2B, 0x6D, 0x08, 0x65, 0xE1, + 0x05, 0x3F, 0x4A, 0x08, 0x65, 0xE1, 0x03, 0xA2, 0x9D, 0x3C, 0x9C, 0x34, + 0x00, 0xA2, 0x22, 0xF0, 0xC9, 0xF0, 0xC4, 0x2A, 0xD9, 0xF1, 0x28, 0x2A, + 0x89, 0xF0, 0x03, 0xA1, 0x03, 0xA8, 0x15, 0x2A, 0x99, 0x1E, 0x98, 0x16, + 0x8E, 0x4E, 0x8D, 0x26, 0x65, 0xE1, 0x9D, 0x3C, 0x9C, 0x34, 0x66, 0xE0, + 0x66, 0xE1, 0xCB, 0xF0, 0x05, 0x2B, 0x4B, 0x08, 0x06, 0x25, 0x4D, 0x08, + 0x67, 0xE1, 0x4C, 0x08, 0x66, 0xE0, 0x9D, 0x4E, 0x9C, 0x22, 0x07, 0x4D, + 0x09, 0xE4, 0xC4, 0x2A, 0x9D, 0x3C, 0x9C, 0x34, 0xB9, 0xF1, 0x03, 0xA1, + 0x15, 0x2A, 0x58, 0x1A, 0x99, 0x0C, 0x98, 0x00, 0x9D, 0x4C, 0x9C, 0x20, + 0x62, 0xF0, 0x9B, 0x1C, 0x9A, 0x14, 0x49, 0xE0, 0x9D, 0x3C, 0x9C, 0x34, + 0x9B, 0x4C, 0x9A, 0x24, 0x8D, 0x16, 0x9D, 0x4C, 0x9C, 0x20, 0x9E, 0xF0, + 0x9C, 0x34, 0x46, 0xE0, 0x47, 0xF0, 0x8E, 0x1E, 0x9C, 0x34, 0x62, 0xE0, + 0x03, 0xA2, 0x9D, 0x3C, 0x9D, 0x4C, 0x9C, 0x20, 0xBE, 0xF0, 0x9D, 0x3C, + 0x66, 0xE0, 0x03, 0xAE, 0xBB, 0x4E, 0xBA, 0x26, 0x9D, 0x3C, 0x9C, 0x34, + 0x62, 0xE0, 0x07, 0xAF, 0x10, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, 0x01, 0xA2, + 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0x8A, 0xF0, 0x23, 0xA2, 0x2A, 0xF0, + 0x10, 0xAF, 0x13, 0xA2, 0x40, 0x28, 0x88, 0x2A, 0x2E, 0xE4, 0x93, 0x3E, + 0x91, 0x28, 0x09, 0x3E, 0x03, 0xAE, 0x2A, 0xF0, 0xAE, 0xF0, 0x08, 0x3E, + 0x03, 0xA2, 0x48, 0xF0, 0x08, 0x3E, 0x01, 0xA2, 0x46, 0xF0, 0x09, 0x18, + 0x91, 0x7C, 0x0F, 0xC7, 0x09, 0x28, 0x5E, 0xF0, 0x2A, 0xF0, 0x40, 0x28, + 0x53, 0x2E, 0x08, 0x3C, 0x1E, 0xE4, 0x83, 0x4C, 0x82, 0x20, 0x03, 0xAF, + 0x08, 0x1A, 0x09, 0x2A, 0x14, 0xAE, 0xE9, 0x1C, 0x42, 0xE0, 0x19, 0xE0, + 0x8D, 0xC7, 0xA5, 0xCC, 0x1E, 0xE4, 0x09, 0x0A, 0x08, 0x2A, 0x02, 0xAE, + 0x48, 0xA0, 0x12, 0xE0, 0x0A, 0xAF, 0xE9, 0x1C, 0x82, 0x24, 0x2E, 0xE4, + 0x46, 0xA5, 0x1E, 0xA4, 0x2B, 0x1D, 0x1E, 0xE4, 0x81, 0x84, 0x83, 0x4C, + 0x82, 0x24, 0x2E, 0xE4, 0x8E, 0x3C, 0x8D, 0x34, 0x2B, 0x1D, 0x1E, 0xE4, + 0x81, 0x84, 0x83, 0x4C, 0x04, 0xE0, 0x81, 0x2A, 0x8E, 0x3C, 0x8D, 0x34, + 0x8D, 0x24, 0x45, 0xE0, 0x02, 0xAE, 0xC8, 0x00, 0x02, 0xAF, 0x02, 0xA0, + 0x43, 0xF0, 0x8E, 0x4C, 0x98, 0x34, 0x06, 0xAF, 0x08, 0xA0, 0x3E, 0xF0, + 0x06, 0xAF, 0x08, 0xA0, 0x2E, 0xE4, 0x99, 0x3C, 0xCE, 0xF0, 0xBB, 0x3C, + 0xBA, 0x34, 0x2A, 0xE4, 0xFF, 0xFF, 0x05, 0xE0, 0xBB, 0x3C, 0xBA, 0x34, + 0xC2, 0x1A, 0x84, 0xE1, 0x45, 0xCC, 0x03, 0xA1, 0xBA, 0x24, 0x8E, 0xBA, + 0xFF, 0x00, 0x04, 0xE0, 0x10, 0xF7, 0xFF, 0xFF, 0x02, 0xE0, 0xBB, 0x4C, + 0x45, 0xCC, 0x03, 0xA1, 0xBB, 0x4E, 0xBA, 0x26, 0xFF, 0x00, 0x04, 0xE0, + 0xD0, 0x1A, 0x84, 0xE1, 0x99, 0x0C, 0x98, 0x04, 0x2E, 0xE4, 0x8E, 0xBA, + 0x99, 0x3C, 0x98, 0x34, 0x9B, 0x1C, 0x9A, 0x14, 0x89, 0xF2, 0x03, 0xA1, + 0x03, 0xA8, 0x15, 0x2A, 0x13, 0x08, 0x64, 0xE1, 0x12, 0x08, 0x63, 0xE1, + 0x10, 0xE0, 0x72, 0xF0, 0x99, 0x4C, 0x98, 0x20, 0x98, 0x3E, 0x01, 0xA2, + 0x04, 0x3D, 0x03, 0x35, 0x05, 0x29, 0x49, 0x08, 0x65, 0xE1, 0x99, 0x3E, + 0x4A, 0xF1, 0x04, 0x4D, 0x03, 0x25, 0x7A, 0xF1, 0x2F, 0x3C, 0x00, 0xA2, + 0x09, 0x3C, 0x2F, 0x28, 0x70, 0x20, 0x1E, 0xE4, 0x30, 0x3E, 0x19, 0xA2, + 0x04, 0x4D, 0x03, 0x25, 0x2F, 0x3C, 0x09, 0x28, 0x9A, 0x20, 0x1E, 0xE4, + 0xB2, 0x1A, 0x1E, 0xE4, 0x2E, 0xE4, 0x04, 0x3D, 0x03, 0x35, 0x00, 0xA2, + 0x30, 0x75, 0x82, 0xE1, 0x17, 0x84, 0x16, 0x2E, 0x00, 0x1D, 0x1E, 0xE4, + 0x02, 0xAE, 0x18, 0xE0, 0x09, 0x3C, 0x10, 0xAF, 0x08, 0x2C, 0x08, 0x3C, + 0x1E, 0xE4, 0x83, 0x4C, 0x82, 0x24, 0x09, 0x84, 0x08, 0x2C, 0x49, 0xE0, + 0x10, 0xAE, 0x2B, 0x1D, 0x09, 0x84, 0x09, 0x3C, 0xFF, 0x00, 0x08, 0xE0, + 0x2B, 0x1D, 0x1E, 0xE4, 0x83, 0x4C, 0x82, 0x24, 0xE9, 0x1C, 0x1E, 0xE4, + 0x79, 0xA2, 0x42, 0xE0, 0x9A, 0x34, 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, + 0x40, 0x28, 0x88, 0x2A, 0x2E, 0xE4, 0x9B, 0x3C, 0xAA, 0xF0, 0x91, 0x28, + 0x03, 0xAE, 0x2A, 0xF0, 0x0F, 0xC7, 0x4A, 0xE0, 0x82, 0xF0, 0x46, 0xE0, + 0x08, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x91, 0x7C, 0x82, 0x24, 0x08, 0x3C, + 0x02, 0xA2, 0x3E, 0xF0, 0x08, 0xE0, 0x08, 0x7C, 0x0F, 0xC7, 0x83, 0x4C, + 0x10, 0x08, 0x62, 0xE1, 0x14, 0xAE, 0xFF, 0xFF, 0x03, 0x3D, 0x02, 0x35, + 0x11, 0x08, 0x63, 0xE1, 0x2B, 0xE4, 0x05, 0x2B, 0x4B, 0x08, 0x65, 0xE1, + 0x4D, 0x08, 0x67, 0xE1, 0x4C, 0x08, 0x66, 0xE1, 0x26, 0xE4, 0x46, 0xE0, + 0x07, 0x4F, 0x06, 0x27, 0x00, 0xA2, 0x2E, 0xE4, 0x03, 0x3F, 0x02, 0x37, + 0x1E, 0x08, 0x64, 0xE1, 0x10, 0x05, 0x63, 0xE1, 0x08, 0x86, 0x08, 0x3E, + 0x03, 0xA1, 0x04, 0x2B, 0x04, 0x2B, 0xA5, 0x3C, 0xA4, 0x34, 0x13, 0x0D, + 0x1E, 0xE4, 0x04, 0x2B, 0x42, 0xE0, 0x03, 0xAF, 0xC8, 0xF0, 0x28, 0x28, + 0xC0, 0x3C, 0xE9, 0x1C, 0x04, 0x2B, 0x10, 0x05, 0x63, 0xE1, 0x02, 0xA2, + 0x13, 0x3D, 0x08, 0x86, 0x08, 0x3E, 0x03, 0xA1, 0x01, 0xA2, 0xA5, 0x3C, + 0xA4, 0x34, 0x04, 0x29, 0x8A, 0xF0, 0x10, 0xAF, 0xA5, 0x4C, 0xA4, 0x20, + 0x13, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0xB4, 0x3E, 0x23, 0xA2, + 0x2A, 0xF0, 0x10, 0xAF, 0x63, 0xE1, 0xD8, 0xF0, 0x28, 0x28, 0x2E, 0xE4, + 0x8A, 0x28, 0x3A, 0xF0, 0x03, 0x29, 0x14, 0x08, 0x8A, 0x28, 0x3B, 0xF0, + 0x7F, 0x2A, 0x8E, 0xF0, 0xAB, 0x28, 0x2E, 0xF0, 0xAE, 0x28, 0x4E, 0xF0, + 0xB9, 0xF0, 0x28, 0x2A, 0xB9, 0x3C, 0x5C, 0x3C, 0x01, 0x05, 0x61, 0xE1, + 0x59, 0xF0, 0xE3, 0x2A, 0x01, 0x05, 0x61, 0xE1, 0x5E, 0xF0, 0x11, 0x3D, + 0xC4, 0x28, 0x2E, 0xE4, 0x5C, 0x3C, 0x11, 0x29, 0x3E, 0xF0, 0xC8, 0x4C, + 0xC7, 0x24, 0x4A, 0xF0, 0x94, 0x04, 0x49, 0xE0, 0x9D, 0x4C, 0x9C, 0x24, + 0xB7, 0x34, 0x9F, 0x1C, 0x9E, 0x14, 0x95, 0x0C, 0x9E, 0x24, 0x09, 0x3E, + 0x93, 0x5E, 0xB8, 0x3C, 0x04, 0xE0, 0xA1, 0x3C, 0xA0, 0x34, 0x9F, 0x4C, + 0x03, 0x2B, 0x96, 0xE0, 0x0B, 0x0C, 0x10, 0x05, 0xA6, 0x36, 0xA7, 0x0E, + 0xA6, 0x06, 0x4A, 0xE0, 0xA7, 0x4C, 0xA6, 0x24, 0x01, 0xA2, 0xA7, 0x3E, + 0x10, 0xAF, 0x03, 0xA2, 0x8A, 0xF0, 0x10, 0xAF, 0x2A, 0xF0, 0x10, 0xAF, + 0x13, 0xA2, 0x5A, 0xF0, 0xA6, 0x24, 0x09, 0x84, 0x08, 0x3E, 0x23, 0xA2, + 0x09, 0x82, 0x09, 0x3C, 0x08, 0x5C, 0xA7, 0x4C, 0xB4, 0x5E, 0xA5, 0x4E, + 0xA4, 0x26, 0x18, 0xE0, 0x08, 0x1A, 0xB4, 0x2A, 0xE9, 0x1C, 0x1E, 0xE4, + 0x9E, 0x34, 0x93, 0x58, 0x09, 0x5C, 0x09, 0x3E, 0xB5, 0x34, 0xA1, 0x1C, + 0xA0, 0x14, 0x9F, 0x3C, 0x08, 0xA0, 0x55, 0x2C, 0x2E, 0xE4, 0xB6, 0x3C, + 0x4A, 0xE0, 0x46, 0x01, 0xC1, 0xE0, 0xA4, 0xF0, 0x08, 0xE0, 0xBB, 0xF7, + 0x03, 0xA8, 0x0F, 0xAF, 0x24, 0xA1, 0x24, 0xA2, 0x2E, 0xF0, 0x3F, 0x00, + 0x18, 0xE0, 0xAF, 0x82, 0xBB, 0x84, 0xBB, 0x3C, 0xAD, 0x2A, 0x66, 0xE0, + 0xAD, 0x2A, 0x02, 0xAF, 0x04, 0xE0, 0x2E, 0xE4, 0x62, 0xE0, 0x13, 0xE0, + 0xB9, 0x28, 0x39, 0xF0, 0xC4, 0x2A, 0x33, 0x00, 0x08, 0xA0, 0x55, 0x2C, + 0xBA, 0x3C, 0xAD, 0x08, 0x4A, 0xE0, 0x46, 0x01, 0xC1, 0xE0, 0xA4, 0xF0, + 0x08, 0xE0, 0xBB, 0xF7, 0x03, 0xA8, 0x0F, 0xAF, 0x24, 0xA1, 0x24, 0xA2, + 0x2E, 0xF0, 0x3F, 0x00, 0x18, 0xE0, 0xAF, 0x82, 0xBB, 0x84, 0xBB, 0x3C, + 0xAD, 0x1A, 0xB9, 0x2A, 0xB9, 0x08, 0x02, 0xAF, 0x5C, 0x3C, 0x66, 0xE0, + 0xBA, 0x2A, 0x62, 0xE0, 0x03, 0x29, 0x1A, 0x08, 0x63, 0xE1, 0x2E, 0xE4, + 0x49, 0xE0, 0x6A, 0xF0, 0x91, 0x28, 0x18, 0xF1, 0x3E, 0xF0, 0x89, 0x3C, + 0x42, 0xE0, 0x04, 0xAF, 0x02, 0xA1, 0x15, 0x28, 0x89, 0x3C, 0x40, 0xA2, + 0x89, 0x3C, 0x80, 0x00, 0x04, 0xE0, 0x4A, 0xF0, 0x03, 0x29, 0x1B, 0x08, + 0x63, 0xE1, 0x2E, 0xE4, 0x49, 0xE0, 0x8B, 0x28, 0x2E, 0xE4, 0x89, 0x3C, + 0x08, 0xE0, 0x69, 0xF0, 0x00, 0x40, 0x09, 0xE0, 0x56, 0xE0, 0x00, 0x0C, + 0x05, 0xE0, 0xFF, 0x00, 0x59, 0xF0, 0x40, 0x00, 0x09, 0xE0, 0x49, 0xE0, + 0x56, 0xE0, 0x67, 0xA2, 0x00, 0x3F, 0x08, 0xE0, 0x8C, 0x28, 0x8B, 0x3C, + 0x3F, 0x3F, 0x08, 0xE0, 0x69, 0xF0, 0x00, 0x40, 0x09, 0xE0, 0x49, 0xE0, + 0x00, 0x0C, 0x05, 0xE0, 0xFF, 0x00, 0x08, 0xE0, 0x40, 0x00, 0x09, 0xE0, + 0x49, 0xE0, 0x56, 0xE0, 0x67, 0xA2, 0x00, 0x3F, 0x08, 0xE0, 0x59, 0xF0, + 0x8C, 0x3C, 0x3F, 0x3F, 0x08, 0xE0, 0x56, 0xE0, 0x09, 0xE0, 0x49, 0xE0, + 0x8B, 0x28, 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x69, 0xF0, 0x00, 0x40, + 0x49, 0xE0, 0x56, 0xE0, 0x00, 0x0C, 0x05, 0xE0, 0x08, 0xE0, 0x59, 0xF0, + 0x40, 0x00, 0x09, 0xE0, 0x08, 0xE0, 0x56, 0xE0, 0x67, 0xA2, 0x00, 0x3F, + 0x49, 0xE0, 0x8C, 0x28, 0x8B, 0x3C, 0x3F, 0x3F, 0x08, 0xE0, 0x69, 0xF0, + 0x00, 0x40, 0x09, 0xE0, 0x56, 0xE0, 0x00, 0x0C, 0x05, 0xE0, 0xFF, 0x00, + 0x59, 0xF0, 0x40, 0x00, 0x09, 0xE0, 0x49, 0xE0, 0x56, 0xE0, 0x67, 0xA2, + 0x00, 0x3F, 0x08, 0xE0, 0x87, 0x28, 0x8C, 0x3C, 0x3F, 0x3F, 0x08, 0xE0, + 0x39, 0xF0, 0x00, 0x40, 0x09, 0xE0, 0x49, 0xE0, 0x09, 0xE0, 0x49, 0xE0, + 0xFF, 0x00, 0x08, 0xE0, 0x00, 0x3F, 0x08, 0xE0, 0x59, 0xF0, 0x40, 0x00, + 0x3F, 0x3F, 0x08, 0xE0, 0x56, 0xE0, 0x67, 0xA2, 0x39, 0xF0, 0x28, 0x2A, + 0x2E, 0xE4, 0x87, 0x3C, 0xBB, 0x3E, 0x8C, 0x2A, 0x2E, 0xF0, 0x8B, 0x2A, + 0x7F, 0xA8, 0xBB, 0x2A, 0x62, 0xE0, 0x11, 0xAF, 0xAA, 0x18, 0x5C, 0x28, + 0x2E, 0xE4, 0x66, 0xE0, 0x10, 0xAF, 0x49, 0xE0, 0x87, 0x28, 0x2A, 0xE4, + 0x09, 0x3E, 0x3F, 0x00, 0x09, 0xE0, 0x08, 0x3C, 0xAA, 0x28, 0xF0, 0xF0, + 0xAA, 0x18, 0x5C, 0x28, 0xAA, 0x2A, 0x62, 0xE0, 0x08, 0x2A, 0x5C, 0x18, + 0x09, 0x2A, 0x46, 0xE0, 0xAA, 0x28, 0x45, 0xE0, 0x5C, 0x3E, 0x45, 0xE0, + 0xAA, 0x2A, 0x66, 0xE0, 0xAA, 0x2A, 0x62, 0xE0, 0x08, 0x2A, 0x2E, 0xE4, + 0x66, 0xE0, 0x09, 0x2A, 0xAA, 0x18, 0x42, 0xE0, 0x2E, 0xE4, 0x5C, 0x3E, + 0x41, 0xE0, 0xAA, 0x2A, 0x48, 0x08, 0x63, 0xE1, 0xCA, 0xF0, 0x8F, 0x28, + 0x26, 0x08, 0x63, 0xE1, 0x8A, 0xF0, 0x03, 0x29, 0x03, 0x3D, 0x27, 0x08, + 0x63, 0xE1, 0x03, 0x29, 0x26, 0x08, 0x63, 0xE1, 0x5C, 0x28, 0x2E, 0xE4, + 0x03, 0x3D, 0x27, 0x08, 0x63, 0xE1, 0x03, 0x3D, 0x32, 0xF0, 0x01, 0xA2, + 0xCA, 0x3E, 0x2E, 0xE4, 0xCB, 0x3C, 0xCE, 0x3E, 0x03, 0xA2, 0x12, 0xE0, + 0xCC, 0x3C, 0xCA, 0x7C, 0x0F, 0xC7, 0x20, 0xAF, 0x0F, 0xC7, 0xCB, 0x4C, + 0x20, 0xAE, 0x20, 0xAF, 0xCD, 0x4C, 0xCC, 0x20, 0xCD, 0x3C, 0xCA, 0x7C, + 0x2E, 0xE4, 0x12, 0xE0, 0x2B, 0xE4, 0xCE, 0x2A, 0xCC, 0x3E, 0x01, 0xA2, + 0xCB, 0x3E, 0xCA, 0x36, 0x45, 0xE0, 0xCC, 0x5A, 0xCB, 0x4E, 0xCA, 0x22, + 0xCC, 0x3E, 0x03, 0xA0, 0xCC, 0x2A, 0x61, 0xF0, 0x39, 0xF0, 0xCC, 0x2A, + 0x75, 0xF7, 0x21, 0xA1, 0xCC, 0x3E, 0x03, 0xA1, 0x2E, 0xE4, 0x00, 0xA2, + 0x84, 0xE1, 0xCD, 0x3E, 0x01, 0xA2, 0x45, 0xCC, 0xCD, 0x3E, 0x03, 0xAE, + 0xCD, 0x2A, 0x28, 0x1D, 0x45, 0xE0, 0xCC, 0x5A, 0xCB, 0x4E, 0xCA, 0x22, + 0xCD, 0x2A, 0x4A, 0xE0, 0x13, 0xE0, 0x61, 0xF0, 0x03, 0xA1, 0xCC, 0x2A, + 0xCD, 0x3E, 0x03, 0xA0, 0x02, 0xAE, 0x2E, 0xE4, 0xCD, 0x28, 0xCC, 0x3E, + 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0xCB, 0x34, 0x1E, 0xAE, 0x18, 0xE0, + 0xCB, 0x82, 0xCA, 0x3C, 0x02, 0xAE, 0x2E, 0xE4, 0x1C, 0xE0, 0xCA, 0x82, + 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0xCB, 0x34, 0x1E, 0xAF, 0x18, 0xE0, + 0xCA, 0x82, 0xCA, 0x3C, 0x02, 0xAE, 0x2E, 0xE4, 0x1C, 0xE0, 0xCB, 0x82, + 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0xCB, 0x34, 0x03, 0xA1, 0x18, 0xE0, + 0xCB, 0x82, 0xCA, 0x3C, 0x1F, 0xA1, 0xCA, 0x82, 0xCC, 0x58, 0xCC, 0x3E, + 0xCC, 0x5E, 0x19, 0xE0, 0xCC, 0x3E, 0x13, 0xE0, 0x55, 0x2A, 0x54, 0x2C, + 0x2E, 0xE4, 0x42, 0xE0, 0xC0, 0xE0, 0xB4, 0xF0, 0x06, 0xA1, 0x46, 0xE0, + 0x28, 0x08, 0x63, 0xE1, 0x8A, 0xF0, 0x1E, 0x01, 0x13, 0x35, 0x02, 0xA0, + 0x0B, 0x4D, 0x13, 0x21, 0x63, 0xE1, 0x8A, 0xF0, 0x84, 0xCB, 0x03, 0x3D, + 0x02, 0xA0, 0x0B, 0x4D, 0x13, 0x21, 0x2A, 0x08, 0x2C, 0x08, 0x63, 0xE1, + 0x03, 0x3D, 0x13, 0x35, 0x13, 0x35, 0x5C, 0x08, 0x0B, 0x4D, 0x13, 0x21, + 0x02, 0xAE, 0x17, 0x34, 0x2E, 0xE4, 0x03, 0x3D, 0x17, 0x3C, 0x02, 0xA0, + 0x17, 0x28, 0x16, 0x3C, 0x08, 0xE0, 0x17, 0x7C, 0x10, 0xC7, 0x16, 0x2C, + 0x88, 0x3C, 0x02, 0xAF, 0x02, 0xA0, 0xFF, 0xFF, 0x93, 0x1A, 0x1E, 0xE4, + 0x04, 0x1B, 0x1E, 0xE4, 0x18, 0xE4, 0xC4, 0x28, 0x2A, 0x1B, 0x1E, 0xE4, + 0x14, 0x2A, 0x7E, 0x3C, 0x2E, 0xE4, 0x9C, 0x13, 0x7E, 0x2A, 0x2E, 0xE4, + 0x28, 0xF0, 0x46, 0xE0, 0x7D, 0x28, 0x03, 0xAE, 0x2A, 0xF0, 0x40, 0x28, + 0x7D, 0x3C, 0x00, 0xA2, 0x34, 0xF0, 0x46, 0xE0, 0x5B, 0xF0, 0x40, 0x2A, + 0x14, 0x3C, 0x7E, 0x28, 0x02, 0xAE, 0x27, 0xF0, 0x03, 0xA1, 0x14, 0x2A, + 0x91, 0x2A, 0x2A, 0xE4, 0x15, 0x28, 0x91, 0x3C, 0x1E, 0xE4, 0x16, 0xF0, + 0x45, 0xE0, 0x7D, 0x28, 0x2B, 0xE4, 0x15, 0x2A, 0x2E, 0xE4, 0x2A, 0x1B, + 0x2B, 0xE4, 0x45, 0xE0, 0x83, 0x4E, 0x82, 0x22, 0x04, 0x1B, 0x1E, 0xE4, + 0x83, 0x3C, 0x82, 0x34, 0x2A, 0x1B, 0x1E, 0xE4, 0x93, 0x1A, 0x1E, 0xE4, + 0x40, 0xF0, 0x2B, 0xE4, 0x15, 0x2A, 0x2E, 0xE4, 0x80, 0x3C, 0x2E, 0xE4, + 0x7F, 0x3E, 0x01, 0xA2, 0x2E, 0xE4, 0x7F, 0x3E, 0x03, 0xA2, 0x8A, 0x3C, + 0x11, 0x3D, 0xF5, 0x04, 0x61, 0xE1, 0x00, 0xA2, 0x00, 0xA2, 0x11, 0x3D, + 0x11, 0x3D, 0x11, 0x81, 0x63, 0xE1, 0x4E, 0x3C, 0x4D, 0x3C, 0x4B, 0x3C, + 0x02, 0xA2, 0xEA, 0xF0, 0x03, 0x29, 0x50, 0x08, 0x51, 0x28, 0x1F, 0x3C, + 0x00, 0xA2, 0x4A, 0x3C, 0xA4, 0xCC, 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, + 0xCE, 0xF1, 0x4F, 0x3C, 0x18, 0xE0, 0x50, 0x82, 0x03, 0xAF, 0x2A, 0xF0, + 0x40, 0x28, 0x51, 0x2A, 0x08, 0x3C, 0x07, 0xAF, 0x06, 0xAF, 0x50, 0x28, + 0x18, 0xE0, 0x09, 0x82, 0x08, 0x84, 0x09, 0x3E, 0x04, 0xA2, 0x32, 0xF0, + 0x04, 0xA1, 0x4A, 0x3C, 0x51, 0x28, 0x1F, 0x3C, 0x02, 0xA2, 0x4A, 0x3C, + 0xA4, 0xCC, 0x1B, 0xF0, 0x40, 0x2A, 0x02, 0xAF, 0x4F, 0x28, 0x4F, 0x3C, + 0x18, 0xE0, 0x50, 0x82, 0x00, 0xA2, 0x4B, 0xF0, 0x40, 0x2A, 0x4C, 0x3C, + 0x61, 0xE1, 0x4C, 0x28, 0x4C, 0x3C, 0x1F, 0x3C, 0x00, 0xA2, 0x01, 0x3D, + 0x11, 0x81, 0xF5, 0x04, 0x2E, 0xE4, 0x03, 0x3D, 0x53, 0x08, 0x63, 0xE1, + 0x28, 0xE4, 0x72, 0x28, 0x2A, 0xE4, 0x28, 0x28, 0x3B, 0xF1, 0x40, 0x2A, + 0x28, 0xE4, 0xE3, 0x28, 0xFA, 0xF0, 0x13, 0x29, 0x52, 0x08, 0x63, 0xE1, + 0x00, 0xA2, 0x74, 0xF0, 0x54, 0x1C, 0x03, 0x29, 0x03, 0x3D, 0x1E, 0x28, + 0x4C, 0x3C, 0x4B, 0x3C, 0x4C, 0x3C, 0x4B, 0x3C, 0x03, 0x29, 0x6E, 0xF0, + 0x69, 0xF0, 0x40, 0x2A, 0x03, 0x3D, 0x1E, 0x0C, 0x2A, 0xF0, 0x03, 0x29, + 0x50, 0x08, 0x63, 0xE1, 0x02, 0xA8, 0x02, 0xA0, 0x1F, 0x28, 0x2E, 0xE4, + 0x69, 0x4C, 0x68, 0x28, 0x2E, 0xE4, 0x1F, 0x3C, 0xF8, 0xF7, 0x28, 0xCA, + 0x2A, 0xE4, 0x6A, 0x4C, 0x11, 0xD1, 0x20, 0xCE, 0x68, 0x00, 0xC0, 0xE0, + 0x13, 0xD1, 0x0C, 0x00, 0x12, 0xD1, 0xB0, 0x04, 0x2E, 0xE4, 0xF8, 0xF7, + 0x28, 0xCA, 0x03, 0x00, 0x2A, 0xE4, 0x6A, 0x4C, 0x69, 0x4C, 0x68, 0x28, + 0x68, 0x28, 0x10, 0xC4, 0xB0, 0x04, 0x67, 0xE1, 0x17, 0x3D, 0x53, 0x2C, + 0x17, 0x3D, 0x10, 0xAE, 0x31, 0x2A, 0x12, 0xAE, 0x69, 0x28, 0x37, 0x81, + 0x53, 0x2C, 0x17, 0x3D, 0x56, 0xE0, 0x17, 0xE0, 0x05, 0xE0, 0x37, 0x81, + 0x17, 0x3D, 0x04, 0xAE, 0x6A, 0x28, 0x65, 0xE0, 0x1A, 0x2C, 0xFF, 0x00, + 0x05, 0xE0, 0x17, 0x3D, 0x56, 0xE0, 0x14, 0xAE, 0x06, 0xAE, 0x66, 0xE0, + 0x1A, 0x2C, 0xFF, 0x1F, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x17, 0x3D, + 0xB0, 0x04, 0x11, 0xD1, 0x20, 0xCE, 0x68, 0x00, 0x02, 0x00, 0x13, 0xD1, + 0x0C, 0x00, 0x12, 0xD1, 0x55, 0x28, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, + 0xA0, 0x04, 0x00, 0xE0, 0x02, 0xAE, 0x06, 0xA8, 0x1B, 0xE0, 0x09, 0xA8, + 0x89, 0xCB, 0x9E, 0xE0, 0xE0, 0x28, 0xB9, 0xF0, 0x00, 0xA2, 0x1F, 0xAE, + 0x11, 0x21, 0x92, 0xE0, 0x00, 0x02, 0x00, 0xE0, 0x09, 0xE0, 0x21, 0xAF, + 0x49, 0xE0, 0x11, 0x4D, 0x55, 0x28, 0x17, 0x3D, 0x17, 0x3F, 0xFF, 0x7F, + 0x1A, 0xE4, 0x08, 0x3C, 0x06, 0xA1, 0x06, 0xA8, 0x5D, 0x28, 0x2A, 0xE4, + 0x08, 0x28, 0xA6, 0x1E, 0x54, 0x2C, 0x55, 0x2A, 0x2A, 0xF0, 0x55, 0x2E, + 0x1E, 0xE4, 0x28, 0xE4, 0x02, 0xA1, 0x46, 0xE0, 0xB8, 0x04, 0x67, 0xE1, + 0x2E, 0xE4, 0xA6, 0x1E, 0x05, 0xAF, 0x55, 0x2E, 0x17, 0x4D, 0x17, 0x21, + 0x07, 0xA1, 0x40, 0x2A, 0x42, 0xE0, 0x09, 0xAE, 0x07, 0xAF, 0x07, 0xA0, + 0x54, 0x2E, 0x69, 0xF0, 0x12, 0xD1, 0x20, 0xCE, 0x42, 0xE0, 0x0B, 0xAE, + 0x13, 0xD1, 0xA0, 0x04, 0x11, 0xD1, 0x08, 0x00, 0x2E, 0xE4, 0xF8, 0xF7, + 0x28, 0xCA, 0x02, 0x00, 0x02, 0xAF, 0x0E, 0xA8, 0x02, 0xA1, 0x55, 0x2C, + 0x90, 0xCB, 0x9E, 0xE0, 0xA8, 0x04, 0x00, 0xE0, 0x0D, 0xAE, 0x67, 0x2A, + 0x3F, 0x00, 0x08, 0xE0, 0x03, 0xA8, 0x03, 0xA1, 0x55, 0x2E, 0x56, 0xE0, + 0x6E, 0xF0, 0x07, 0x3D, 0x10, 0xAE, 0x49, 0xF0, 0x56, 0xE0, 0x00, 0xFF, + 0x09, 0xE0, 0x07, 0x2B, 0x0E, 0xA8, 0x02, 0xA1, 0x55, 0x2C, 0x07, 0x3D, + 0x2E, 0xE4, 0xE0, 0x1E, 0x1A, 0xE4, 0x0E, 0xA1, 0x67, 0xE1, 0x0E, 0xA1, + 0x02, 0xA1, 0x55, 0x2C, 0x42, 0xE0, 0x17, 0x4F, 0x17, 0x23, 0xB3, 0x04, + 0x54, 0x2E, 0x69, 0xF0, 0x07, 0xA1, 0x40, 0x2A, 0x42, 0xE0, 0x07, 0xAE, + 0x07, 0xAF, 0x0F, 0xA0, 0x12, 0xD1, 0xA8, 0x04, 0x11, 0xD1, 0x20, 0xCE, + 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x04, 0x00, 0xFA, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0xF8, 0xF7, 0x44, 0x34, 0x60, 0x00, 0xC0, 0xE0, 0xFB, 0x3C, + 0xC0, 0xE0, 0x79, 0x3C, 0x78, 0x34, 0x45, 0x3C, 0x47, 0x3C, 0x46, 0x34, + 0x04, 0xAE, 0x61, 0x00, 0x30, 0xD0, 0x2E, 0xE4, 0x1B, 0x1F, 0x1E, 0xE4, + 0x33, 0xD0, 0x00, 0x00, 0x34, 0xD0, 0x00, 0x00, 0x36, 0xD0, 0x00, 0x00, + 0x35, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x80, 0x00, 0x37, 0xD0, 0xFF, 0x00, + 0x44, 0x20, 0x70, 0xE4, 0x2E, 0xE4, 0x00, 0x00, 0x11, 0xAE, 0xFB, 0x4E, + 0xFA, 0x26, 0x45, 0x4C, 0x78, 0x34, 0x49, 0x00, 0xC2, 0xE0, 0x42, 0xE0, + 0x2A, 0x24, 0x71, 0xD0, 0x2E, 0xE4, 0x79, 0x3C, 0xD4, 0x3C, 0xD3, 0x34, + 0x00, 0xA2, 0x81, 0xE1, 0xF9, 0x3C, 0xF6, 0x3C, 0x00, 0x02, 0x04, 0xE0, + 0x12, 0x20, 0x1E, 0xE4, 0xF6, 0x1F, 0x1E, 0xE4, 0x53, 0x20, 0x1E, 0xE4, + 0x2F, 0x20, 0x1E, 0xE4, 0x29, 0xCA, 0x2E, 0xE4, 0x5E, 0x20, 0x1E, 0xE4, + 0x1E, 0xE4, 0x69, 0x1F, 0x1E, 0xE4, 0xF9, 0xF7, 0x02, 0xA8, 0x3C, 0xAF, + 0x48, 0xCA, 0x85, 0x1F, 0x3C, 0xAE, 0xF7, 0x3C, 0x02, 0xA2, 0x5A, 0xF0, + 0x02, 0xA8, 0x38, 0xAF, 0x48, 0xCA, 0x48, 0xCE, 0x1E, 0xE4, 0x57, 0x1F, + 0x1E, 0xE4, 0xAA, 0xF0, 0x48, 0xCE, 0x38, 0xAE, 0x02, 0xA2, 0x53, 0x20, + 0x78, 0x24, 0x70, 0xE4, 0x5E, 0x20, 0x1E, 0xE4, 0x46, 0xE0, 0x45, 0x4E, + 0x44, 0x26, 0x79, 0x4C, 0x45, 0xE0, 0x11, 0xAE, 0x47, 0x4E, 0x46, 0x26, + 0x43, 0xF0, 0x45, 0xE0, 0xF6, 0x28, 0x25, 0xE4, 0xF9, 0x3C, 0x2E, 0xE4, + 0xF9, 0x3E, 0x41, 0xE0, 0x48, 0xF0, 0xF9, 0x28, 0x55, 0xCA, 0x2E, 0xE4, + 0xD3, 0x20, 0x4E, 0xF0, 0xAA, 0xCE, 0x00, 0xA2, 0x79, 0x4C, 0x78, 0x24, + 0x45, 0xE0, 0xD4, 0x4C, 0xF9, 0x28, 0x79, 0x3C, 0x78, 0x34, 0x42, 0xE0, + 0x42, 0xE0, 0xD4, 0x4C, 0xD3, 0x24, 0x2A, 0xE4, 0x46, 0xE0, 0xF9, 0x2A, + 0xD4, 0x3C, 0xD3, 0x34, 0xD4, 0x3C, 0xD3, 0x34, 0x00, 0xA2, 0x28, 0xE4, + 0x78, 0x24, 0x49, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0x46, 0xE0, 0x45, 0x4E, + 0x44, 0x26, 0x79, 0x4C, 0xFB, 0x3C, 0xFA, 0x34, 0x10, 0xAF, 0x49, 0xE0, + 0x45, 0xE0, 0x10, 0xAE, 0x47, 0x4C, 0x46, 0x24, 0x02, 0xA2, 0xFA, 0xF1, + 0xD0, 0x28, 0x85, 0xF2, 0x79, 0x4C, 0x78, 0x24, 0x74, 0x00, 0xC2, 0xE0, + 0x6B, 0xF1, 0xD2, 0x2A, 0x49, 0x00, 0xC2, 0xE0, 0x00, 0x80, 0x08, 0xE0, + 0x5C, 0x00, 0xC0, 0xE0, 0x0A, 0xE0, 0x5D, 0x00, 0xC0, 0xE0, 0x1A, 0xF1, + 0x02, 0xA2, 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x80, 0x09, 0xE0, 0x5D, 0x00, + 0xC1, 0xE0, 0x00, 0xCE, 0x04, 0x00, 0xC0, 0xE0, 0xC9, 0xF7, 0x00, 0x80, + 0xFB, 0x3C, 0xFA, 0x34, 0x00, 0xA2, 0x98, 0xF7, 0x79, 0x3E, 0x78, 0x36, + 0x45, 0x4E, 0x44, 0x26, 0x49, 0x00, 0xC3, 0xE0, 0x79, 0x4E, 0x78, 0x26, + 0x00, 0x00, 0x27, 0xD0, 0x28, 0xE4, 0xD0, 0x28, 0x01, 0x00, 0x27, 0xD0, + 0xC9, 0x1F, 0x1E, 0xE4, 0x56, 0x34, 0x48, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0xC1, 0xE0, 0x57, 0x4C, 0x56, 0x24, 0x57, 0x3C, 0x56, 0x26, 0x57, 0x3E, + 0x56, 0x36, 0x49, 0x00, 0x46, 0x26, 0x50, 0xF0, 0x46, 0xE0, 0x57, 0x4E, + 0x05, 0xE0, 0x42, 0xE0, 0x11, 0xAE, 0x47, 0x4E, 0x49, 0x28, 0x20, 0xE4, + 0x46, 0xE0, 0x00, 0x02, 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x98, 0xF6, + 0x5D, 0x00, 0xC0, 0xE0, 0x4A, 0xF6, 0x00, 0x80, 0x5D, 0x00, 0xC2, 0xE0, + 0x00, 0x80, 0x0A, 0xE0, 0xC1, 0xE0, 0x49, 0x3C, 0x00, 0xCE, 0x02, 0xA2, + 0xC9, 0xF7, 0x00, 0x80, 0x09, 0xE0, 0x5D, 0x00, 0x0D, 0xA2, 0x20, 0xA2, + 0x2E, 0xE4, 0x5E, 0xF5, 0x20, 0xAE, 0x56, 0xE0, 0x03, 0xA2, 0x56, 0xE0, + 0x33, 0xD0, 0x00, 0x00, 0x30, 0xD0, 0x9E, 0xCC, 0x35, 0xD0, 0x00, 0x00, + 0x34, 0xD0, 0x00, 0x00, 0x37, 0xD0, 0xFF, 0x00, 0x36, 0xD0, 0x00, 0x00, + 0x39, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x80, 0x00, 0x47, 0xD0, 0x00, 0x00, + 0x46, 0xD0, 0x00, 0x00, 0x43, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x00, 0x00, + 0x0E, 0xAE, 0x02, 0xA2, 0xD2, 0x30, 0x0C, 0xAF, 0x09, 0xAE, 0x07, 0xA8, + 0x43, 0x00, 0xC1, 0xE0, 0x28, 0xAE, 0x22, 0xA2, 0x4E, 0xCE, 0x56, 0xE0, + 0x4C, 0xCE, 0x56, 0xE0, 0x37, 0xAE, 0x17, 0xA2, 0x38, 0xAE, 0x06, 0xA2, + 0x54, 0xCE, 0x00, 0xA2, 0x4A, 0xCE, 0x56, 0xE0, 0x03, 0x00, 0x05, 0xE0, + 0xC0, 0xE0, 0x2E, 0xE4, 0x58, 0xCE, 0x00, 0xA2, 0x06, 0xA1, 0x4A, 0xF0, + 0x10, 0xA1, 0x5B, 0x00, 0x38, 0x00, 0x04, 0xE0, 0x2E, 0xE4, 0x5A, 0xF0, + 0x05, 0xE0, 0x20, 0x00, 0x04, 0xE0, 0x3E, 0xF0, 0x00, 0x18, 0x05, 0xE0, + 0x56, 0xE0, 0x80, 0x00, 0xC8, 0xCE, 0x08, 0xA2, 0xC0, 0xCE, 0x56, 0xE0, + 0x88, 0xCE, 0x9E, 0xCE, 0x92, 0xCE, 0x00, 0xA2, 0xA4, 0xCE, 0xD6, 0xCE, + 0xD0, 0xCE, 0x8A, 0xCE, 0x04, 0xE0, 0x9C, 0xCE, 0x02, 0xA2, 0xC6, 0xCE, + 0x06, 0xA2, 0x2E, 0xE4, 0x96, 0xCE, 0x00, 0x02, 0x5A, 0xCE, 0x56, 0xE0, + 0x11, 0xAE, 0xF9, 0x2A, 0x00, 0xA2, 0x5C, 0xCE, 0x79, 0x4C, 0x78, 0x24, + 0x00, 0x0F, 0x04, 0xE0, 0x2E, 0xE4, 0x5E, 0xCE, 0x56, 0xE0, 0x03, 0x00, + 0x05, 0xE0, 0x20, 0xAE, 0x49, 0xCA, 0x56, 0xE0, 0x30, 0x00, 0x05, 0xE0, + 0x03, 0xA2, 0x4B, 0xF0, 0x03, 0xA8, 0x21, 0xAF, 0x2E, 0xE4, 0x4A, 0xCE, + 0x56, 0xE0, 0x2F, 0xAE, 0x00, 0xA2, 0x72, 0xCC, 0x50, 0xA0, 0x72, 0xC8, + 0x1E, 0xE4, 0x00, 0xA2, 0x8F, 0x20, 0x1E, 0xE4, 0x8F, 0x20, 0x1E, 0xE4, + 0x00, 0xA2, 0x8F, 0x20, 0x00, 0xA2, 0x8F, 0x20, 0x1E, 0xE4, 0x02, 0xA2, + 0x0A, 0xAE, 0x2F, 0x28, 0xAA, 0xCE, 0x96, 0xCE, 0x1E, 0xE4, 0x8F, 0x20, + 0x1E, 0xE4, 0x30, 0x4C, 0x2E, 0xE4, 0x92, 0xCE, 0x00, 0xA2, 0x0B, 0x1F, + 0x1E, 0xE4, 0x2E, 0xE4, 0xF9, 0xF7, 0x9B, 0xCA, 0x48, 0xCA, 0x2E, 0xE4, + 0xC4, 0xCE, 0x8C, 0x20, 0x02, 0xA8, 0x4C, 0xCA, 0xE8, 0xF7, 0x02, 0xA8, + 0x93, 0x20, 0x1E, 0xE4, 0x2E, 0xE4, 0xEA, 0xF7, 0xF7, 0x3C, 0x00, 0xA2, + 0x8C, 0x20, 0x1E, 0xE4, 0x66, 0xC8, 0x7A, 0xF0, 0x02, 0xA8, 0xC9, 0x28, + 0xD4, 0xCA, 0x38, 0xF0, 0x3F, 0x00, 0x08, 0xE0, 0x98, 0xCE, 0x30, 0x00, + 0x04, 0xE0, 0xD2, 0xCE, 0x82, 0xE0, 0x2E, 0xE4, 0xFA, 0xF7, 0xF7, 0x28, + 0x80, 0xCA, 0x80, 0x01, 0x61, 0xE1, 0x48, 0x3C, 0x11, 0x35, 0x82, 0xCA, + 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, 0x84, 0xCA, 0x11, 0x3D, + 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, 0x86, 0xCA, 0x11, 0x8B, 0x45, 0x01, + 0x11, 0x8B, 0x44, 0x01, 0x11, 0x8B, 0x49, 0x01, 0x11, 0x8B, 0x48, 0x01, + 0x11, 0x8B, 0x4B, 0x01, 0x11, 0x8B, 0x4A, 0x01, 0x11, 0x8B, 0x4E, 0x01, + 0x11, 0x8B, 0x60, 0x01, 0x11, 0x8B, 0x52, 0x01, 0x11, 0x8B, 0x4F, 0x01, + 0x11, 0x8B, 0x55, 0x01, 0x11, 0x8B, 0x53, 0x01, 0x11, 0x8B, 0x63, 0x01, + 0x11, 0x8B, 0x57, 0x01, 0xCC, 0xCA, 0x65, 0x01, 0x11, 0x8B, 0x64, 0x01, + 0x11, 0x35, 0xCE, 0xCA, 0x11, 0x3D, 0x11, 0x35, 0xD2, 0xCA, 0x68, 0x01, + 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, 0xD4, 0xCA, 0x11, 0x3D, 0x11, 0x35, + 0x11, 0x8B, 0x6B, 0x01, 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x8B, 0x6D, 0x01, + 0x11, 0x8B, 0x6C, 0x01, 0x11, 0x3D, 0x11, 0x35, 0x60, 0xC8, 0x6E, 0x01, + 0x64, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x62, 0xC8, 0x33, 0x00, 0x11, 0x8B, + 0x11, 0x3D, 0x11, 0x35, 0x35, 0x00, 0x11, 0x8B, 0x34, 0x00, 0x11, 0x8B, + 0x37, 0x00, 0x11, 0x8B, 0x36, 0x00, 0x11, 0x8B, 0x11, 0x35, 0x72, 0xC8, + 0x38, 0x00, 0x11, 0x8B, 0x7A, 0xC8, 0x3A, 0x00, 0x11, 0x8B, 0x11, 0x3D, + 0x11, 0x35, 0x7C, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, + 0x80, 0xC8, 0x11, 0x3D, 0x84, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x82, 0xC8, + 0x11, 0x35, 0x86, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, + 0x88, 0xC8, 0x11, 0x3D, 0x8C, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x8A, 0xC8, + 0x11, 0x35, 0x90, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, + 0x92, 0xC8, 0x11, 0x3D, 0x96, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x94, 0xC8, + 0x11, 0x35, 0x98, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, + 0x9E, 0xC8, 0x11, 0x3D, 0x82, 0xE0, 0x2E, 0xE4, 0x92, 0xE0, 0x48, 0x28, + 0x11, 0x21, 0x80, 0x01, 0x61, 0xE1, 0x48, 0x3C, 0x11, 0x4D, 0x11, 0x21, + 0x80, 0xCE, 0x11, 0x4D, 0x84, 0xCE, 0x11, 0x4D, 0x11, 0x21, 0x82, 0xCE, + 0x11, 0x89, 0x86, 0xCE, 0x11, 0x4D, 0x11, 0x21, 0x11, 0x89, 0x45, 0x01, + 0x11, 0x89, 0x44, 0x01, 0x11, 0x89, 0x49, 0x01, 0x11, 0x89, 0x48, 0x01, + 0x11, 0x89, 0x4B, 0x01, 0x11, 0x89, 0x4A, 0x01, 0x11, 0x89, 0x4E, 0x01, + 0x11, 0x89, 0x60, 0x01, 0x11, 0x89, 0x52, 0x01, 0x11, 0x89, 0x4F, 0x01, + 0x11, 0x89, 0x55, 0x01, 0x11, 0x89, 0x53, 0x01, 0x11, 0x89, 0x63, 0x01, + 0x11, 0x89, 0x57, 0x01, 0x11, 0x21, 0x65, 0x01, 0x11, 0x89, 0x64, 0x01, + 0x11, 0x4D, 0x11, 0x21, 0xCC, 0xCE, 0x11, 0x4D, 0x11, 0x21, 0x68, 0x01, + 0x11, 0x89, 0xCE, 0xCE, 0x11, 0x4D, 0x11, 0x21, 0xD2, 0xCE, 0x11, 0x4D, + 0x11, 0x89, 0x6B, 0x01, 0x11, 0x89, 0xD4, 0xCE, 0x11, 0x89, 0x6D, 0x01, + 0x11, 0x89, 0x6C, 0x01, 0x60, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x6E, 0x01, + 0x11, 0x21, 0x62, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x33, 0x00, 0x11, 0x89, + 0x64, 0xCC, 0x11, 0x4D, 0x35, 0x00, 0x11, 0x89, 0x34, 0x00, 0x11, 0x89, + 0x37, 0x00, 0x11, 0x89, 0x36, 0x00, 0x11, 0x89, 0x11, 0x4D, 0x11, 0x21, + 0x38, 0x00, 0x11, 0x89, 0x11, 0x21, 0x3A, 0x00, 0x11, 0x89, 0x72, 0xCC, + 0x11, 0x4D, 0x11, 0x21, 0x7A, 0xCC, 0x11, 0x4D, 0x80, 0xCC, 0x11, 0x4D, + 0x11, 0x21, 0x7C, 0xCC, 0x11, 0x21, 0x82, 0xCC, 0x11, 0x4D, 0x11, 0x21, + 0x11, 0x4D, 0x11, 0x21, 0x84, 0xCC, 0x11, 0x4D, 0x88, 0xCC, 0x11, 0x4D, + 0x11, 0x21, 0x86, 0xCC, 0x11, 0x21, 0x8A, 0xCC, 0x11, 0x4D, 0x11, 0x21, + 0x11, 0x4D, 0x11, 0x21, 0x8C, 0xCC, 0x11, 0x4D, 0x92, 0xCC, 0x11, 0x4D, + 0x11, 0x21, 0x90, 0xCC, 0x11, 0x21, 0x94, 0xCC, 0x11, 0x4D, 0x11, 0x21, + 0x11, 0x4D, 0x11, 0x21, 0x96, 0xCC, 0x11, 0x4D, 0x05, 0xE0, 0x11, 0x4D, + 0x11, 0x21, 0x98, 0xCC, 0x9E, 0xCC, 0x56, 0xE0, 0x21, 0xAE, 0x15, 0x14, + 0x92, 0xE0, 0x48, 0x28, 0x02, 0x00, 0x4C, 0xD1, 0x61, 0xE1, 0x48, 0x3C, + 0x82, 0xE0, 0x2E, 0xE4, 0x11, 0x3D, 0x11, 0x35, 0x72, 0xC8, 0x80, 0x01, + 0x7A, 0xF0, 0x11, 0x3D, 0xFC, 0x3C, 0xC6, 0xCA, 0xCE, 0xCA, 0x11, 0x3D, + 0x11, 0x35, 0xCC, 0xCA, 0x92, 0xE0, 0x48, 0x28, 0x11, 0x3D, 0x11, 0x35, + 0x78, 0x24, 0x2B, 0xE4, 0xFC, 0x2A, 0x2E, 0xE4, 0x79, 0x3C, 0x78, 0x34, + 0x46, 0xE0, 0x79, 0x4C, 0x61, 0xE1, 0x48, 0x3C, 0x82, 0xE0, 0x2E, 0xE4, + 0x72, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x80, 0x01, 0x10, 0xAF, 0x01, 0x29, + 0x5B, 0xF1, 0x11, 0x2B, 0x8F, 0x20, 0x1E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, + 0xFC, 0x3C, 0xCA, 0xF0, 0x02, 0xA1, 0xFC, 0x28, 0x1E, 0xE4, 0xFF, 0x00, + 0x08, 0xE0, 0x11, 0x29, 0x3A, 0xF0, 0x02, 0xA1, 0xFC, 0x28, 0x8F, 0x20, + 0x92, 0xE0, 0x48, 0x28, 0xDE, 0xF6, 0xFC, 0x3C, 0x2E, 0xE4, 0xE3, 0x3C, + 0x00, 0xA2, 0x2E, 0xE4, 0xF0, 0x04, 0x64, 0xE1, 0x35, 0x00, 0x63, 0xE1, + 0x63, 0xE1, 0x65, 0x22, 0x1E, 0xE4, 0x02, 0xA2, 0x08, 0xA2, 0xF1, 0x04, + 0x64, 0xE1, 0x90, 0x04, 0x4B, 0x00, 0x63, 0xE1, 0x65, 0x22, 0x1E, 0xE4, + 0x1E, 0xE4, 0x08, 0xA2, 0xF5, 0x04, 0x64, 0xE1, 0xE3, 0x3C, 0x02, 0xAA, + 0xE3, 0x28, 0x65, 0x22, 0x1C, 0xA2, 0x28, 0xE4, 0xE3, 0x28, 0x2E, 0xE4, + 0x1E, 0xE4, 0x70, 0x20, 0x1E, 0xE4, 0x30, 0x3C, 0x2E, 0xE4, 0x9A, 0x20, + 0x1E, 0xE4, 0x38, 0x22, 0x00, 0xA2, 0x72, 0xCC, 0x30, 0xA0, 0x72, 0xC8, + 0x0C, 0xAE, 0x36, 0xB4, 0x31, 0x2A, 0x02, 0xAE, 0x1D, 0xA1, 0x30, 0x2A, + 0x14, 0xAE, 0x00, 0xA9, 0x02, 0xAE, 0x00, 0xA9, 0x06, 0xAE, 0x32, 0xB4, + 0x17, 0xE0, 0xE3, 0x2A, 0x02, 0xAE, 0xE2, 0x4C, 0x01, 0x47, 0xF9, 0x04, + 0x61, 0xE1, 0xE2, 0x46, 0x07, 0x3C, 0x02, 0xA9, 0x02, 0xAE, 0x32, 0xB4, + 0x1E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x20, 0xAF, 0x08, 0xE0, 0x10, 0xAF, + 0x07, 0x28, 0x8F, 0x20, 0x07, 0x28, 0x8F, 0x20, 0x1E, 0xE4, 0xFF, 0x00, + 0x8F, 0x20, 0x1E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x84, 0xE1, 0x44, 0xCC, + 0x02, 0xA1, 0x2E, 0xE4, 0x14, 0x3D, 0x04, 0x2F, 0x03, 0x2D, 0x6C, 0x22, + 0x21, 0xD1, 0x40, 0xCE, 0x2E, 0xE4, 0x13, 0x3F, 0x23, 0xD1, 0x02, 0x00, + 0x22, 0xD1, 0x00, 0x00, 0xE8, 0xF7, 0x02, 0xA8, 0x48, 0xCA, 0x80, 0x00, + 0x9E, 0xCC, 0x22, 0xAE, 0x04, 0xA2, 0x2E, 0xE4, 0x8E, 0xCC, 0x8C, 0xCC, + 0x72, 0xCC, 0x00, 0xA2, 0x0A, 0xE0, 0x20, 0xAE, 0x10, 0xA8, 0x04, 0xE0, + 0x03, 0x00, 0x6F, 0xD1, 0x4A, 0xCE, 0x22, 0x93, 0x6F, 0xD1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x50, 0xCE, 0x60, 0xA2, 0x2E, 0xE4, 0x00, 0x00, + 0x00, 0xC0, 0xEA, 0xF7, 0x02, 0xA8, 0x50, 0xCA, 0x50, 0xCE, 0x20, 0x00, + 0x04, 0xE0, 0x2E, 0xE4, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x2E, 0xE4, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x70, 0xE4, 0x20, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x1D, 0x02, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x37, 0x02, 0x0E, 0xE4, + 0x78, 0x00, 0x0E, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, + 0x90, 0xE1, 0x70, 0xE4, 0x02, 0xA2, 0x01, 0x00, 0x27, 0xD0, 0x68, 0xE1, + 0x58, 0x00, 0xC2, 0xE0, 0x08, 0x00, 0xC2, 0xE0, 0x04, 0xE0, 0x5A, 0x00, + 0xC2, 0xE0, 0x00, 0xA2, 0xFE, 0xA2, 0x78, 0x01, 0xC2, 0xE0, 0x00, 0x00, + 0xC0, 0xE0, 0xEC, 0x3C, 0xEF, 0x3C, 0xEE, 0x3C, 0x74, 0x01, 0x1E, 0xE4, + 0x9A, 0xF0, 0x4A, 0x00, 0x1B, 0x01, 0x12, 0xE4, 0xEE, 0x28, 0x4E, 0xF0, + 0x00, 0xA2, 0xED, 0x3C, 0x59, 0x00, 0xC0, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x59, 0x00, 0xC2, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x08, 0x00, 0xC2, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xED, 0x5A, 0x03, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0x5D, 0x00, 0xC3, 0xE0, 0xBF, 0x00, 0x1E, 0xE4, 0x96, 0x00, 0x1E, 0xE4, + 0x2A, 0x24, 0x71, 0xD0, 0x06, 0x01, 0x1E, 0xE4, 0x9E, 0xE0, 0x42, 0x01, + 0x1E, 0xE4, 0x81, 0xE1, 0x48, 0x00, 0xC0, 0xE0, 0x07, 0x9F, 0x02, 0xA2, + 0x59, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, 0x6A, 0xE1, 0x1D, 0x02, + 0x00, 0xE0, 0x02, 0xAE, 0x5A, 0x00, 0xC0, 0xE0, 0x7C, 0xE6, 0x00, 0xC0, + 0xC0, 0xE0, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x11, 0xAE, 0x5E, 0x00, + 0xC1, 0xE0, 0x5B, 0x00, 0x39, 0x00, 0x0E, 0xE4, 0xEF, 0x3C, 0x56, 0xE0, + 0x1E, 0xE4, 0x2A, 0xE4, 0x2B, 0x04, 0xC0, 0xE0, 0x3E, 0xAE, 0x02, 0xA2, + 0x9E, 0xE0, 0x42, 0x01, 0xC1, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x07, 0x9F, + 0xED, 0x5A, 0x03, 0xA2, 0xED, 0x3E, 0x59, 0x00, 0x5D, 0x00, 0xC3, 0xE0, + 0x15, 0xB6, 0x52, 0xE0, 0xC2, 0xE0, 0x00, 0xA2, 0x00, 0xCE, 0x1A, 0xE0, + 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, 0x59, 0x00, 0x00, 0x00, 0x04, 0xE0, + 0x0E, 0xF0, 0x08, 0x00, 0x59, 0x00, 0xC0, 0xE0, 0x78, 0x01, 0xC2, 0xE0, + 0x02, 0xA2, 0x98, 0xF1, 0x1E, 0xA1, 0xEA, 0xF7, 0x28, 0xCC, 0x04, 0xE0, + 0x58, 0x00, 0xC2, 0xE0, 0x56, 0xE0, 0x01, 0x30, 0x05, 0xE0, 0x20, 0xAE, + 0x03, 0x00, 0x04, 0xE0, 0x70, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x38, 0xD6, + 0x0A, 0xE0, 0x20, 0xAE, 0x59, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x71, 0x00, + 0x02, 0xA2, 0x4E, 0xF6, 0x58, 0x00, 0xC2, 0xE0, 0x58, 0x00, 0xC2, 0xE0, + 0x08, 0x00, 0xC2, 0xE0, 0xC1, 0xE0, 0x2E, 0xE4, 0x01, 0x00, 0x27, 0xD0, + 0x03, 0xA1, 0x3E, 0xA2, 0x9B, 0xF1, 0x5B, 0x00, 0x2B, 0xF3, 0x03, 0xA1, + 0x4E, 0xA2, 0x5B, 0xF3, 0x3B, 0x00, 0x04, 0xE0, 0x7B, 0xF1, 0x03, 0xA1, + 0x40, 0x00, 0x04, 0xE0, 0xCB, 0xF2, 0x03, 0xA1, 0x3B, 0xF1, 0x05, 0xA1, + 0x8B, 0xF2, 0x03, 0xA1, 0x62, 0x00, 0x04, 0xE0, 0x9B, 0xF1, 0x03, 0xA1, + 0xC1, 0xE0, 0x00, 0xA2, 0x0B, 0xF2, 0x07, 0xA1, 0xAE, 0xF1, 0x2A, 0xA2, + 0xCB, 0xF1, 0x5E, 0x00, 0x6B, 0xF1, 0x5E, 0x00, 0xC1, 0xE0, 0x5A, 0xA2, + 0x46, 0x00, 0x04, 0xE0, 0x4E, 0xF1, 0x10, 0xA0, 0x04, 0xE0, 0xFB, 0xF0, + 0x5E, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x04, 0xE0, 0xCE, 0xF0, 0x4E, 0x00, + 0x04, 0xE0, 0x7B, 0xF0, 0x5E, 0x00, 0xC1, 0xE0, 0x04, 0xE0, 0x3B, 0xF0, + 0x03, 0xA1, 0x68, 0x00, 0x40, 0x00, 0xC1, 0xE0, 0x16, 0xAE, 0x72, 0x00, + 0x00, 0x00, 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, 0x0B, 0x00, 0x13, 0xD1, + 0x00, 0x28, 0x12, 0xD1, 0xD9, 0x21, 0x1E, 0xE4, 0x2E, 0xE4, 0xE1, 0xE1, + 0x2A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x98, 0xF0, 0x10, 0xA8, + 0x5B, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x0C, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x06, 0xA2, 0xC0, 0xE0, 0x7C, 0xE6, + 0x3D, 0x02, 0x04, 0xE0, 0x04, 0xA2, 0x58, 0xF0, 0x10, 0xA8, 0x5B, 0x00, + 0x04, 0xE0, 0x2E, 0xE4, 0x31, 0x01, 0x1E, 0xE4, 0x01, 0xC4, 0x00, 0xA2, + 0x7C, 0xE6, 0x3F, 0x02, 0x61, 0xE1, 0x11, 0x3D, 0xEB, 0x00, 0x88, 0xE1, + 0x11, 0x3D, 0x09, 0x0B, 0x88, 0xE1, 0xF6, 0x00, 0x41, 0x00, 0xC0, 0xE0, + 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, + 0x12, 0xD1, 0x00, 0x00, 0x11, 0xD1, 0x20, 0xCE, 0x1E, 0xE4, 0x13, 0x01, + 0xEC, 0x88, 0x00, 0x0C, 0xC1, 0xE0, 0x00, 0xA2, 0x2E, 0xE4, 0xE8, 0x01, + 0x07, 0xA1, 0xD6, 0xB6, 0x07, 0xA1, 0x59, 0x00, 0x2E, 0xE4, 0x70, 0x00, + 0x00, 0xE0, 0x36, 0xB6, 0xA0, 0x01, 0x67, 0xE1, 0x6B, 0x00, 0xC0, 0xE0, + 0x28, 0xE4, 0x14, 0x04, 0xC0, 0xE0, 0x07, 0x3D, 0x33, 0xAE, 0x09, 0xA8, + 0x44, 0x00, 0xC1, 0xE0, 0xA0, 0x01, 0x67, 0xE1, 0x6A, 0x00, 0xC0, 0xE0, + 0x6B, 0x00, 0xC0, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x2E, 0xE4, 0x07, 0x3D, + 0x17, 0x35, 0x56, 0xE0, 0xC2, 0xE0, 0x07, 0x29, 0xA0, 0x01, 0x67, 0xE1, + 0x50, 0x01, 0xC2, 0xE0, 0x04, 0xA2, 0x51, 0x01, 0xDA, 0xF7, 0x04, 0xA8, + 0x50, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0x50, 0x01, 0xC2, 0xE0, 0x08, 0xA2, + 0x1A, 0xE4, 0x02, 0xA1, 0x59, 0x00, 0xC0, 0xE0, 0x06, 0xA1, 0x59, 0x00, + 0xC0, 0xE0, 0x86, 0x01, 0x47, 0x00, 0xC0, 0xE0, 0x8A, 0x01, 0x1A, 0xE4, + 0xC2, 0xE0, 0x00, 0xA2, 0x48, 0x00, 0xC2, 0xE0, 0xC2, 0xE0, 0x20, 0xA2, + 0x2E, 0xE4, 0x4A, 0x00, 0xC2, 0xE0, 0x20, 0xA2, 0x2E, 0xE4, 0x70, 0x00, + 0x72, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x76, 0x00, 0xFA, 0xA2, 0x77, 0x00, + 0xC2, 0xE0, 0xFC, 0xA2, 0x22, 0xD0, 0x2E, 0xE4, 0x71, 0x00, 0xC2, 0xE0, + 0xC0, 0xE0, 0xA4, 0x01, 0x84, 0xE1, 0x0F, 0x27, 0x1F, 0x04, 0xC0, 0xE0, + 0x48, 0xF0, 0x4A, 0x00, 0xEE, 0xA1, 0x3D, 0x04, 0xC0, 0xE0, 0xE8, 0xF7, + 0x1C, 0x04, 0xC2, 0xE0, 0x00, 0xA2, 0xD8, 0xF7, 0x04, 0xE0, 0x97, 0x01, + 0x1E, 0xE4, 0x2E, 0xE4, 0x2E, 0xE4, 0x3C, 0x04, 0xC2, 0xE0, 0x11, 0x00, + 0x3D, 0x04, 0xC0, 0xE0, 0xA9, 0x01, 0x1E, 0xE4, 0xE0, 0x01, 0x04, 0xE0, + 0xD8, 0xF7, 0xEE, 0xA1, 0xC2, 0xE0, 0x00, 0xA2, 0x09, 0x00, 0xC2, 0xE0, + 0xE8, 0xF7, 0x0D, 0x00, 0xC0, 0xE0, 0x09, 0x00, 0x2E, 0xE4, 0x3C, 0x04, + 0xC2, 0xE0, 0x00, 0xA2, 0x0E, 0xA8, 0x04, 0xAF, 0x45, 0x00, 0xC0, 0xE0, + 0xC2, 0xE0, 0x02, 0xA2, 0x28, 0xE4, 0x04, 0xA1, 0xE8, 0xF7, 0x11, 0x01, + 0xC0, 0xE0, 0x4A, 0x00, 0xE8, 0xF7, 0x02, 0xA8, 0x48, 0xCA, 0x8E, 0xF9, + 0x3D, 0x04, 0xC0, 0xE0, 0xA9, 0x01, 0x1E, 0xE4, 0xF8, 0x01, 0x04, 0xE0, + 0xD8, 0xF7, 0xEE, 0xA1, 0xC2, 0xE0, 0x00, 0xA2, 0x09, 0x00, 0xC2, 0xE0, + 0xE8, 0xF7, 0x0D, 0x00, 0xC0, 0xE0, 0x09, 0x00, 0x2E, 0xE4, 0x3C, 0x04, + 0xC2, 0xE0, 0x00, 0xA2, 0x01, 0xC0, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, + 0x5E, 0x3C, 0x01, 0xC0, 0x1E, 0xF1, 0x5D, 0x3C, 0xBE, 0xF0, 0x5E, 0x28, + 0x01, 0xC0, 0xEE, 0xF0, 0x01, 0xC0, 0x8E, 0xF0, 0x5F, 0x3C, 0x01, 0xC0, + 0x3E, 0xF0, 0x1B, 0xE0, 0x5E, 0x1A, 0x5D, 0x2A, 0x2E, 0xE4, 0x00, 0xC0, + 0x5F, 0x2A, 0x01, 0xC0, 0x0B, 0x08, 0xC3, 0xE0, 0x08, 0x08, 0xC2, 0xE0, + 0x12, 0x9F, 0x02, 0xA2, 0x02, 0x08, 0x62, 0xE1, 0x05, 0xE0, 0x12, 0x9F, + 0x12, 0x9F, 0x00, 0xA2, 0x12, 0x9F, 0x12, 0x9F, 0x92, 0x9F, 0x00, 0x02, + 0x00, 0xA2, 0x12, 0x9F, 0x82, 0xE0, 0x12, 0x81, 0xC2, 0xE0, 0x02, 0xA2, + 0x12, 0x81, 0x12, 0x9F, 0xE8, 0xF7, 0x00, 0x08, 0xC0, 0xE0, 0x00, 0x08, + 0x0E, 0xE4, 0xD7, 0x1E, 0x0E, 0xE4, 0x2E, 0xE4, 0x0E, 0xE4, 0x45, 0x02, + 0x0E, 0xE4, 0x41, 0x02, 0x0E, 0xE4, 0x4F, 0x02, 0x0E, 0xE4, 0x49, 0x02, + 0x0E, 0xE4, 0x57, 0x02, 0x0E, 0xE4, 0x53, 0x02, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x5B, 0x02, + 0x0E, 0xE4, 0x5F, 0x02, 0x0E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0xF8, 0x1E, 0x0E, 0xE4, 0xCF, 0x07, 0x0E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x63, 0x02, 0x1E, 0xE4, 0xFB, 0x07, 0x0E, 0xE4, 0xB7, 0x02, + 0x1E, 0xE4, 0x6A, 0x00, 0x1E, 0xE4, 0x1E, 0x03, 0x1E, 0xE4, 0x6A, 0x00, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0xB0, 0x01, 0x1E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0xF3, 0x03, 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x35, 0x04, + 0x1E, 0xE4, 0x6A, 0x00, 0x0E, 0xE4, 0x86, 0x04, 0x1E, 0xE4, 0x6A, 0x00, + 0x0E, 0xE4, 0x54, 0x06, 0x30, 0xD1, 0x6A, 0x00, 0x0E, 0xE4, 0xC4, 0x02, + 0x1E, 0xE4, 0x26, 0x01, 0x1E, 0xE4, 0x08, 0x00, 0x00, 0xA2, 0xB9, 0x07, + 0x1E, 0xE4, 0xD9, 0x21, 0x44, 0xCC, 0x72, 0xCC, 0x33, 0x3C, 0x29, 0x3C, + 0x6B, 0x3C, 0x1C, 0x3C, 0x31, 0x3C, 0x7C, 0x3C, 0x01, 0x3D, 0x60, 0x08, + 0x61, 0xE1, 0x6C, 0x3C, 0x7B, 0x3C, 0x02, 0xA2, 0x09, 0x08, 0x1E, 0xE4, + 0x08, 0xA2, 0x5A, 0xF3, 0x06, 0x05, 0x1E, 0xE4, 0x40, 0x2A, 0x12, 0x3C, + 0x20, 0xA2, 0x10, 0x3C, 0x04, 0xA2, 0x38, 0xF0, 0x7B, 0x28, 0x5B, 0xF0, + 0x02, 0xA1, 0x13, 0x3C, 0x02, 0xA2, 0x2E, 0xF0, 0x20, 0x3C, 0x21, 0x3C, + 0x00, 0xA2, 0x22, 0x3C, 0x34, 0xA2, 0x11, 0x3C, 0x00, 0xA2, 0x27, 0x3C, + 0x00, 0x01, 0x02, 0xE0, 0x50, 0x28, 0x23, 0x3C, 0x00, 0x01, 0x02, 0xE0, + 0x51, 0x28, 0xB0, 0xF1, 0x44, 0xF1, 0x0C, 0xA1, 0x50, 0x28, 0x70, 0xF1, + 0x00, 0xF1, 0x51, 0x18, 0x02, 0xA0, 0x40, 0x28, 0xB7, 0x1E, 0x1E, 0xE4, + 0x7C, 0x0D, 0x1E, 0xE4, 0x18, 0xE4, 0x15, 0x28, 0xE3, 0x1E, 0x1E, 0xE4, + 0x02, 0xA2, 0x93, 0x1D, 0x1E, 0xE4, 0x1B, 0x13, 0x00, 0xA2, 0x2E, 0xE4, + 0x70, 0x00, 0xC2, 0xE0, 0x30, 0xD1, 0x2E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, + 0xD0, 0x28, 0x28, 0xE4, 0xCF, 0x28, 0x08, 0x00, 0xFB, 0x3C, 0xFA, 0x3C, + 0x00, 0xA2, 0x7A, 0xF0, 0x2E, 0xE4, 0x2E, 0xE4, 0xD8, 0x1E, 0x1E, 0xE4, + 0x02, 0xAF, 0x6B, 0x30, 0x60, 0x00, 0xC0, 0xE0, 0x03, 0x3D, 0x6C, 0x08, + 0x63, 0xE1, 0x7E, 0xA8, 0x6E, 0x08, 0x64, 0xE1, 0x60, 0x00, 0xC0, 0xE0, + 0x6B, 0x28, 0x04, 0x3D, 0x7E, 0xA8, 0x0E, 0xAF, 0x61, 0x00, 0xC0, 0xE0, + 0x18, 0x03, 0x0A, 0xE4, 0x18, 0x03, 0x01, 0xE4, 0x15, 0xA1, 0x49, 0xE0, + 0x61, 0xE1, 0x48, 0x3C, 0x82, 0xE0, 0x6C, 0x3C, 0x22, 0xD0, 0x62, 0x00, + 0x62, 0xE1, 0x20, 0x07, 0x12, 0x9E, 0xFC, 0x02, 0x84, 0xE1, 0x09, 0x00, + 0xFF, 0x00, 0x08, 0xE0, 0x20, 0xAF, 0x49, 0xE0, 0x08, 0xE0, 0x30, 0xAF, + 0x4A, 0xE0, 0x11, 0x3D, 0x08, 0xE0, 0x4A, 0xE0, 0x11, 0x3D, 0xFF, 0x00, + 0x10, 0xAF, 0x4A, 0xE0, 0x11, 0x3D, 0xFF, 0x00, 0x12, 0x9E, 0x11, 0x3D, + 0xFF, 0x00, 0x08, 0xE0, 0xC0, 0xE0, 0x43, 0x07, 0x61, 0xE1, 0x11, 0x3D, + 0x08, 0xE0, 0x20, 0xAF, 0x49, 0xE0, 0x76, 0x00, 0x30, 0xAF, 0x4A, 0xE0, + 0x11, 0x3D, 0xFF, 0x00, 0x4A, 0xE0, 0x11, 0x3D, 0xFF, 0x00, 0x08, 0xE0, + 0x4A, 0xE0, 0x11, 0x3D, 0xFF, 0x00, 0x08, 0xE0, 0x11, 0x3D, 0xFF, 0x00, + 0x08, 0xE0, 0x10, 0xAF, 0x4E, 0xF0, 0x76, 0x00, 0xC2, 0xE0, 0x02, 0xA2, + 0x48, 0x28, 0x76, 0x00, 0xC2, 0xE0, 0x00, 0xA2, 0x08, 0x00, 0x30, 0xD1, + 0x2E, 0xE4, 0x92, 0xE0, 0x44, 0xCC, 0x4C, 0xCC, 0x4A, 0xCC, 0x00, 0xA2, + 0x63, 0xE1, 0x00, 0xA2, 0x74, 0x00, 0xC2, 0xE0, 0x13, 0x3D, 0x13, 0x3D, + 0x13, 0x3D, 0x28, 0x08, 0x00, 0xA2, 0x13, 0x3D, 0x13, 0x3D, 0x13, 0x3D, + 0x06, 0xAF, 0x65, 0x00, 0xC0, 0xE0, 0x67, 0x3C, 0x02, 0xAF, 0x68, 0x30, + 0x07, 0x00, 0x08, 0xE0, 0x1E, 0xE4, 0x6A, 0x30, 0x02, 0xAF, 0x69, 0x30, + 0x0D, 0x12, 0x1E, 0xE4, 0x06, 0xA2, 0xF3, 0x1D, 0x75, 0x12, 0x1E, 0xE4, + 0x23, 0x12, 0x1E, 0xE4, 0x02, 0xAF, 0x53, 0x2C, 0x0A, 0xF1, 0x40, 0x28, + 0x49, 0xF0, 0x36, 0x06, 0x1E, 0xE4, 0x54, 0x3C, 0x40, 0x28, 0x9E, 0xF0, + 0x40, 0x3C, 0x04, 0xA2, 0x40, 0x3C, 0x04, 0xA2, 0x6A, 0xF0, 0x06, 0xA1, + 0xD0, 0x28, 0x54, 0x3C, 0x53, 0x2C, 0x3E, 0xF0, 0xC0, 0xE0, 0xAA, 0xF0, + 0xD1, 0x28, 0x2A, 0xF2, 0xC0, 0xE0, 0x45, 0x3C, 0x44, 0x34, 0x66, 0x00, + 0x47, 0x3C, 0x46, 0x34, 0x04, 0xAE, 0x67, 0x00, 0x1E, 0xE4, 0xFB, 0x3C, + 0xFA, 0x34, 0x00, 0xA2, 0x00, 0xA2, 0xD9, 0x21, 0x1E, 0xE4, 0xD8, 0x1E, + 0xB3, 0x1F, 0x1E, 0xE4, 0xD4, 0x3C, 0xD3, 0x3C, 0xEC, 0x1F, 0x1E, 0xE4, + 0xCF, 0x1F, 0x1E, 0xE4, 0x10, 0x20, 0x1E, 0xE4, 0x14, 0x1F, 0x1E, 0xE4, + 0x00, 0x00, 0xE0, 0xD1, 0x1B, 0x20, 0x1E, 0xE4, 0xB0, 0x03, 0xFF, 0xD1, + 0x00, 0x00, 0xE7, 0xD1, 0x24, 0x02, 0x99, 0xD1, 0x08, 0x00, 0x30, 0xD1, + 0x01, 0x00, 0x4B, 0xD0, 0x00, 0x00, 0x3A, 0xD0, 0x00, 0x00, 0x08, 0xD0, + 0x00, 0x00, 0x4C, 0xD0, 0x2A, 0xF0, 0xD0, 0x28, 0x17, 0x08, 0x1E, 0xE4, + 0x40, 0x28, 0x1A, 0xF0, 0xCF, 0x28, 0x3E, 0xF0, 0x1A, 0x28, 0xBA, 0xF0, + 0x06, 0xA1, 0xDA, 0xF0, 0x1E, 0xE4, 0x40, 0x3C, 0x06, 0xA2, 0x1B, 0x3C, + 0x0E, 0xE4, 0xDB, 0x03, 0x09, 0xE4, 0x36, 0x06, 0x40, 0x3C, 0x50, 0xB6, + 0x40, 0x28, 0x57, 0x03, 0x33, 0x2C, 0x29, 0x3C, 0x02, 0xA0, 0x29, 0x2C, + 0x70, 0x00, 0xC2, 0xE0, 0x33, 0x3C, 0x02, 0xA0, 0xEC, 0x24, 0x71, 0x00, + 0xC2, 0xE0, 0x28, 0x28, 0x64, 0xE1, 0x6A, 0x00, 0xC2, 0xE0, 0xED, 0x4C, + 0xC2, 0xE0, 0x04, 0x4D, 0x14, 0x21, 0x28, 0x08, 0x14, 0x21, 0x2A, 0x08, + 0x64, 0xE1, 0x77, 0x00, 0x64, 0xE1, 0x78, 0x00, 0xC2, 0xE0, 0x04, 0x4D, + 0xC2, 0xE0, 0x04, 0x4D, 0x14, 0x21, 0x2C, 0x08, 0x6B, 0xF0, 0x1A, 0x28, + 0x40, 0x2A, 0x79, 0x00, 0x1A, 0x28, 0x39, 0xF0, 0x36, 0x06, 0x1E, 0xE4, + 0x1E, 0xE4, 0x73, 0x00, 0xC2, 0xE0, 0x1B, 0x08, 0x76, 0x00, 0xC2, 0xE0, + 0x02, 0xA2, 0x05, 0x1E, 0xC2, 0xE0, 0x00, 0xA2, 0xE7, 0x03, 0x0E, 0xE4, + 0x33, 0x2C, 0xE7, 0x03, 0x0E, 0xE4, 0x76, 0x00, 0xC2, 0xE0, 0x28, 0x28, + 0x70, 0x00, 0xC2, 0xE0, 0x73, 0x00, 0xC2, 0xE0, 0x1A, 0x28, 0x71, 0x00, + 0x01, 0xA2, 0x76, 0x00, 0xC2, 0xE0, 0x06, 0xA2, 0x00, 0x00, 0x39, 0xD0, + 0x6C, 0x3E, 0x6B, 0x3E, 0x56, 0xE0, 0x20, 0xAE, 0x4D, 0xC8, 0x4A, 0xC8, + 0x1E, 0xE4, 0x2E, 0xE4, 0x53, 0x00, 0xC2, 0xE0, 0x67, 0xE1, 0x6B, 0x00, + 0xC0, 0xE0, 0x29, 0x04, 0x42, 0x00, 0xC0, 0xE0, 0x07, 0x3D, 0xA0, 0x01, + 0x12, 0xD1, 0xD0, 0x03, 0x11, 0xD1, 0x20, 0xCE, 0x29, 0xCA, 0x03, 0x00, + 0x13, 0xD1, 0xC0, 0x00, 0x00, 0xE0, 0x80, 0x01, 0x00, 0xE0, 0xF9, 0xF7, + 0x40, 0x0B, 0x11, 0xD1, 0x20, 0xCE, 0x80, 0x00, 0x03, 0x00, 0x13, 0xD1, + 0xC0, 0x00, 0x12, 0xD1, 0x1E, 0xE4, 0x04, 0xA2, 0xF9, 0xF7, 0x29, 0xCA, + 0x32, 0x3C, 0x60, 0x00, 0xC0, 0xE0, 0x0D, 0x12, 0x04, 0xE0, 0x70, 0x3C, + 0x61, 0x00, 0xC0, 0xE0, 0x62, 0x00, 0xC0, 0xE0, 0x96, 0xE0, 0x90, 0x04, + 0x63, 0x00, 0xC0, 0xE0, 0x13, 0x3D, 0x13, 0x35, 0x23, 0x12, 0x1E, 0xE4, + 0x13, 0x3D, 0x13, 0x35, 0x66, 0xE1, 0x94, 0x03, 0x67, 0xE1, 0x2E, 0xE4, + 0x84, 0xE1, 0x03, 0x00, 0x22, 0xD0, 0x64, 0x00, 0x17, 0x3D, 0x17, 0x35, + 0x16, 0x9E, 0x33, 0x04, 0xD0, 0x28, 0x08, 0x00, 0x30, 0xD1, 0x2E, 0xE4, + 0xC0, 0xE0, 0xAA, 0xF0, 0xD1, 0x28, 0x2A, 0xF2, 0xC0, 0xE0, 0x45, 0x3C, + 0x44, 0x34, 0x61, 0x00, 0x47, 0x3C, 0x46, 0x34, 0x04, 0xAE, 0x62, 0x00, + 0x1E, 0xE4, 0xFB, 0x3C, 0xFA, 0x34, 0x00, 0xA2, 0x00, 0xA2, 0xD9, 0x21, + 0x1E, 0xE4, 0xD8, 0x1E, 0xB3, 0x1F, 0x1E, 0xE4, 0xD4, 0x3C, 0xD3, 0x3C, + 0xEC, 0x1F, 0x1E, 0xE4, 0xCF, 0x1F, 0x1E, 0xE4, 0x10, 0x20, 0x1E, 0xE4, + 0x14, 0x1F, 0x1E, 0xE4, 0x60, 0x00, 0xC0, 0xE0, 0x1B, 0x20, 0x1E, 0xE4, + 0x0A, 0xE4, 0x02, 0xA1, 0xFA, 0xF0, 0x0E, 0xA8, 0x02, 0xA1, 0xAA, 0xF0, + 0x02, 0xA1, 0x71, 0x04, 0x2A, 0xF0, 0x02, 0xA1, 0x71, 0x04, 0x0A, 0xE4, + 0x5E, 0xF1, 0x44, 0x07, 0x1E, 0xE4, 0x2E, 0xE4, 0x54, 0x07, 0x1E, 0xE4, + 0xB4, 0x04, 0x1E, 0xE4, 0x1E, 0xE4, 0xEF, 0x04, 0x1E, 0xE4, 0x0E, 0xF1, + 0x2E, 0xF0, 0x14, 0xA2, 0xBE, 0xF0, 0x81, 0x07, 0x2F, 0x3C, 0x00, 0xA2, + 0x30, 0x3C, 0x16, 0xA2, 0x57, 0x20, 0x1E, 0xE4, 0x2D, 0x20, 0x1E, 0xE4, + 0xCF, 0x28, 0x3E, 0xF0, 0x2A, 0xF0, 0xD0, 0x28, 0xC8, 0x1E, 0x1E, 0xE4, + 0x2E, 0xE4, 0x1A, 0xF0, 0x60, 0x00, 0xC0, 0xE0, 0x92, 0xCE, 0x00, 0xA2, + 0xDA, 0xF0, 0x02, 0xA1, 0xAA, 0xF0, 0x0E, 0xA8, 0x9A, 0xF0, 0x02, 0xA1, + 0x6A, 0xF0, 0x02, 0xA1, 0x1E, 0xE4, 0xAE, 0xF0, 0x44, 0x07, 0x1E, 0xE4, + 0x5E, 0xF0, 0x30, 0x0C, 0x1E, 0xE4, 0xB4, 0x04, 0xA7, 0x0C, 0x1E, 0xE4, + 0xEF, 0x04, 0x1E, 0xE4, 0x70, 0x00, 0xC2, 0xE0, 0x06, 0xAF, 0x70, 0xC8, + 0xDF, 0xBA, 0x6E, 0xCC, 0x80, 0x00, 0x04, 0xE0, 0x11, 0xD1, 0x20, 0xCE, + 0x42, 0x00, 0xC0, 0xE0, 0x13, 0xD1, 0x00, 0x01, 0x12, 0xD1, 0x00, 0x00, + 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x12, 0x00, 0x08, 0xE0, 0x30, 0xAF, + 0x60, 0x00, 0xC0, 0xE0, 0x42, 0x3C, 0x50, 0xA2, 0x0E, 0x3C, 0x1F, 0x00, + 0x09, 0xE0, 0x11, 0xAF, 0x60, 0x00, 0xC1, 0xE0, 0x2B, 0xF0, 0x42, 0x28, + 0x67, 0xA5, 0xFF, 0x00, 0x6A, 0x00, 0xC0, 0xE0, 0x42, 0x3C, 0x4A, 0xE0, + 0x16, 0xE0, 0x68, 0x00, 0xC0, 0xE0, 0x41, 0x3C, 0x40, 0x30, 0x69, 0x00, + 0xC0, 0xE0, 0x43, 0x30, 0x02, 0xAF, 0x69, 0x00, 0xC0, 0xE0, 0x7A, 0xF0, + 0x00, 0xA2, 0x2E, 0xF0, 0x02, 0xA2, 0x3A, 0xF0, 0x1E, 0xE4, 0x9F, 0x07, + 0x1E, 0xE4, 0x7B, 0x3C, 0x06, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x93, 0x1D, + 0xC0, 0xE0, 0x2A, 0xE4, 0x73, 0x30, 0x02, 0xA8, 0xC1, 0xE0, 0x75, 0x3C, + 0x74, 0x34, 0x63, 0x00, 0x56, 0xE0, 0x77, 0x3E, 0x76, 0x36, 0x64, 0x00, + 0xC0, 0xE0, 0x2E, 0xE4, 0x73, 0x3C, 0x1A, 0xE0, 0x1F, 0x00, 0x08, 0xE0, + 0x30, 0xAF, 0x60, 0x00, 0x20, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x0E, 0x3C, + 0xC0, 0xE0, 0x0F, 0x3C, 0xFF, 0x00, 0x08, 0xE0, 0x66, 0x00, 0xC0, 0xE0, + 0x3E, 0x30, 0x65, 0x00, 0x67, 0x00, 0xC0, 0xE0, 0x2E, 0x3C, 0x06, 0xA8, + 0x74, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x3F, 0x30, 0x74, 0x00, 0xC0, 0xE0, + 0x8F, 0x3C, 0x06, 0xA8, 0x64, 0x00, 0xC0, 0xE0, 0x90, 0x3C, 0x04, 0xAF, + 0x16, 0x3D, 0x16, 0x35, 0xC2, 0x04, 0x66, 0xE1, 0x65, 0x00, 0xC0, 0xE0, + 0x9F, 0x07, 0x1E, 0xE4, 0x02, 0xA0, 0x17, 0x28, 0x16, 0x3C, 0x17, 0x34, + 0x34, 0x06, 0x0A, 0xE4, 0x16, 0x28, 0x17, 0x3C, 0x19, 0x30, 0x04, 0xAF, + 0x62, 0x00, 0xC0, 0xE0, 0x7F, 0x30, 0x0A, 0xAF, 0x62, 0x00, 0xC0, 0xE0, + 0xC0, 0xE0, 0x80, 0x3E, 0x71, 0x00, 0xC1, 0xE0, 0xC0, 0xE0, 0x8C, 0x34, + 0x8B, 0x3C, 0x78, 0x00, 0x62, 0x00, 0xC0, 0xE0, 0x87, 0x3C, 0x7D, 0x00, + 0x1A, 0x08, 0x63, 0xE1, 0x02, 0xAF, 0x0C, 0xAF, 0x63, 0xE1, 0x73, 0x00, + 0xC0, 0xE0, 0x03, 0x31, 0x62, 0x00, 0xC0, 0xE0, 0x03, 0x3D, 0x1B, 0x08, + 0xC0, 0xE0, 0x7A, 0xF0, 0x40, 0x30, 0x14, 0xAF, 0x02, 0xA2, 0x3A, 0xF0, + 0x16, 0xAF, 0x62, 0x00, 0x1E, 0xE4, 0x7B, 0x3C, 0x00, 0xA2, 0x2E, 0xF0, + 0x49, 0xE0, 0x68, 0x00, 0xC0, 0xE0, 0x9F, 0x07, 0x24, 0x3E, 0x3F, 0xAF, + 0x3F, 0xAE, 0x3F, 0xA8, 0x49, 0xE0, 0x26, 0x32, 0x0B, 0xAF, 0x49, 0xE0, + 0x49, 0xE0, 0x2B, 0x3E, 0x07, 0xA8, 0x0D, 0xAF, 0x41, 0xAE, 0x41, 0xAF, + 0x1F, 0xA8, 0x11, 0xAF, 0x19, 0xAF, 0x49, 0xE0, 0x2C, 0x3E, 0x03, 0xAE, + 0x03, 0xAE, 0x41, 0xAE, 0x41, 0xAF, 0x1F, 0xA8, 0x2D, 0x4C, 0x2C, 0x4C, + 0x2B, 0x28, 0x2D, 0x3E, 0x69, 0x00, 0xC0, 0xE0, 0x25, 0x3C, 0x1A, 0xE0, + 0xC0, 0xE0, 0x37, 0x30, 0x1A, 0xE0, 0x06, 0xA8, 0x04, 0xA5, 0x02, 0xA1, + 0x06, 0xA8, 0x69, 0x00, 0x69, 0x00, 0xC0, 0xE0, 0x38, 0x3C, 0x00, 0xA4, + 0x08, 0xE0, 0x20, 0xAF, 0x39, 0x3C, 0x04, 0xAF, 0x3B, 0x06, 0x1E, 0xE4, + 0x3A, 0x3C, 0xFF, 0x3F, 0xFF, 0x03, 0x08, 0xE0, 0x6A, 0x00, 0xC0, 0xE0, + 0x1E, 0xA8, 0x77, 0x00, 0xC0, 0xE0, 0x14, 0x3C, 0x08, 0xAF, 0x77, 0x00, + 0xC0, 0xE0, 0x15, 0x3C, 0x82, 0x3C, 0x06, 0xA8, 0x20, 0xAF, 0x83, 0x3C, + 0x02, 0xA8, 0x2C, 0xAF, 0x77, 0x00, 0xC0, 0xE0, 0xC0, 0xE0, 0x03, 0x3D, + 0x49, 0x08, 0x63, 0xE1, 0x66, 0x08, 0x63, 0xE1, 0x2E, 0xAF, 0x77, 0x00, + 0x02, 0xAF, 0x1D, 0x30, 0x02, 0xAF, 0x13, 0x31, 0x6B, 0x00, 0xC0, 0xE0, + 0xAF, 0x3C, 0x1E, 0xA8, 0x81, 0x28, 0xAD, 0x3C, 0x1E, 0xA8, 0x81, 0x34, + 0x05, 0x31, 0x6D, 0x08, 0x65, 0xE1, 0x1E, 0xAF, 0x81, 0x3C, 0xFF, 0x7F, + 0x08, 0xE0, 0x81, 0x28, 0x03, 0x29, 0x69, 0x08, 0x63, 0xE1, 0x00, 0xA2, + 0x6A, 0x00, 0xC0, 0xE0, 0x2A, 0xF1, 0x15, 0x28, 0x03, 0xA8, 0x09, 0xAF, + 0x49, 0xE0, 0x20, 0xAF, 0x03, 0xA8, 0x07, 0xAF, 0x49, 0xE0, 0xBB, 0xF0, + 0x12, 0xE0, 0x0E, 0xA8, 0x12, 0xE0, 0x5B, 0xF0, 0xC0, 0xE0, 0x03, 0x3D, + 0x0E, 0xA8, 0x2E, 0xF0, 0x61, 0x08, 0x61, 0xE1, 0x2A, 0xAF, 0x6A, 0x00, + 0x4B, 0x08, 0x63, 0xE1, 0x00, 0xA2, 0x01, 0x3D, 0x4D, 0x08, 0x67, 0xE1, + 0x4C, 0x08, 0x66, 0xE1, 0xC0, 0xE0, 0x07, 0x3D, 0x06, 0x3D, 0x03, 0x3D, + 0x7B, 0xF0, 0x21, 0xAF, 0x49, 0xE0, 0x7C, 0x00, 0x14, 0xAE, 0xFF, 0xFF, + 0x08, 0xE0, 0x03, 0x33, 0x6D, 0x00, 0xC0, 0xE0, 0x07, 0x3D, 0x06, 0x35, + 0xC0, 0xE0, 0x1E, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x50, 0x08, 0x63, 0xE1, + 0x20, 0xAF, 0x6D, 0x00, 0x22, 0xAF, 0x6D, 0x00, 0xC0, 0xE0, 0x13, 0x31, + 0x24, 0xAF, 0x6D, 0x00, 0xC0, 0xE0, 0x13, 0x31, 0x02, 0xE0, 0x01, 0xA2, + 0x53, 0x2C, 0x03, 0x31, 0x90, 0x01, 0x02, 0xE0, 0x25, 0xB4, 0xC8, 0x00, + 0x75, 0x00, 0xC0, 0xE0, 0x36, 0x3E, 0x25, 0xB4, 0x16, 0x3D, 0x16, 0x35, + 0xC0, 0x04, 0x66, 0xE1, 0x18, 0xA8, 0x49, 0xE0, 0x76, 0x00, 0xC0, 0xE0, + 0x06, 0xA8, 0x4A, 0xE0, 0xDC, 0x3C, 0x10, 0xA5, 0x08, 0xAF, 0x4A, 0xE0, + 0xDC, 0x3C, 0xDC, 0x4C, 0xDD, 0x3C, 0x1E, 0xA8, 0x02, 0xAF, 0xDE, 0x30, + 0x63, 0xE1, 0x06, 0xA8, 0x12, 0xAF, 0x4A, 0xE0, 0x16, 0xE0, 0xDE, 0x28, + 0x03, 0x3D, 0x63, 0x08, 0xDE, 0x3C, 0xDE, 0x4C, 0x02, 0xAE, 0xDE, 0x3C, + 0xDD, 0x3C, 0x1E, 0xA2, 0x28, 0xF0, 0xDD, 0x28, 0xCF, 0x30, 0x06, 0xAF, + 0x43, 0x00, 0xC0, 0xE0, 0xD1, 0x30, 0x02, 0xAF, 0xD0, 0x30, 0x02, 0xAF, + 0x2E, 0xE4, 0x02, 0xA2, 0xD2, 0x30, 0x02, 0xAF, 0x65, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0x00, 0xA2, 0x37, 0x28, 0x2E, 0xE4, 0x03, 0xA8, 0x11, 0xAF, + 0x48, 0xF1, 0x04, 0xA1, 0x38, 0x28, 0x7A, 0xF1, 0x42, 0x00, 0xC0, 0xE0, + 0xF8, 0xF7, 0x28, 0xCA, 0x39, 0x2C, 0x00, 0x0A, 0x11, 0xD1, 0x20, 0xCE, + 0x05, 0xE0, 0x04, 0xAE, 0x04, 0xAF, 0x08, 0xA0, 0x13, 0xD1, 0x24, 0xCE, + 0x66, 0xE0, 0x00, 0x01, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, + 0x0B, 0xE4, 0x03, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x1E, 0xE4, 0x61, 0x00, + 0xC0, 0xE0, 0x5D, 0x06, 0x05, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x59, 0x1D, + 0x62, 0x00, 0xC0, 0xE0, 0x66, 0x06, 0x0B, 0xE4, 0x60, 0x00, 0xC1, 0xE0, + 0x88, 0x1D, 0x1E, 0xE4, 0xC0, 0xE0, 0x6F, 0x06, 0x0B, 0xE4, 0x09, 0xA8, + 0xC1, 0xE0, 0x79, 0x1D, 0x1E, 0xE4, 0x63, 0x00, 0x78, 0x06, 0x0B, 0xE4, + 0x11, 0xA8, 0x60, 0x00, 0x42, 0x1D, 0x1E, 0xE4, 0x64, 0x00, 0xC0, 0xE0, + 0x0B, 0xE4, 0x21, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x1E, 0x3C, 0x65, 0x00, + 0xC0, 0xE0, 0x80, 0x06, 0x0B, 0xE4, 0x41, 0xA8, 0x60, 0x00, 0xC1, 0xE0, + 0x06, 0xA8, 0x66, 0x00, 0xC0, 0xE0, 0x9B, 0x06, 0x66, 0x00, 0xC0, 0xE0, + 0x37, 0x30, 0x1A, 0xE0, 0x00, 0xA4, 0x04, 0xA5, 0x02, 0xA1, 0x06, 0xA8, + 0x04, 0xAF, 0x66, 0x00, 0xC0, 0xE0, 0x38, 0x3C, 0xFF, 0x3F, 0x08, 0xE0, + 0x20, 0xAF, 0x39, 0x3C, 0xC1, 0xE0, 0x3B, 0x06, 0x1E, 0xE4, 0x3A, 0x3C, + 0x0B, 0xE4, 0x40, 0x00, 0x09, 0xE0, 0x60, 0x00, 0x8B, 0x3C, 0x6F, 0x00, + 0xC0, 0xE0, 0xA7, 0x06, 0xC1, 0xE0, 0x06, 0x1C, 0x1E, 0xE4, 0x8C, 0x34, + 0x0B, 0xE4, 0x80, 0x00, 0x09, 0xE0, 0x60, 0x00, 0x3E, 0x30, 0x68, 0x00, + 0xC0, 0xE0, 0xB0, 0x06, 0x00, 0x01, 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, + 0x69, 0x00, 0xC0, 0xE0, 0xBA, 0x06, 0x0B, 0xE4, 0x60, 0x00, 0xC1, 0xE0, + 0x2E, 0x3C, 0x06, 0xA8, 0xC3, 0x06, 0x0B, 0xE4, 0x00, 0x02, 0x09, 0xE0, + 0xC1, 0xE0, 0x3F, 0x30, 0x6A, 0x00, 0xC0, 0xE0, 0x0B, 0xE4, 0x00, 0x04, + 0x09, 0xE0, 0x60, 0x00, 0x16, 0xE0, 0x6B, 0x00, 0xC0, 0xE0, 0xCD, 0x06, + 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, 0x43, 0x30, 0xC0, 0xE0, 0xD8, 0x06, + 0x0B, 0xE4, 0x00, 0x08, 0x0F, 0x3C, 0xFF, 0x00, 0x08, 0xE0, 0x6D, 0x00, + 0x00, 0x10, 0x09, 0xE0, 0x60, 0x00, 0xC1, 0xE0, 0x6C, 0x00, 0xC0, 0xE0, + 0xEE, 0x06, 0x0B, 0xE4, 0x6C, 0x00, 0xC0, 0xE0, 0x7A, 0xF0, 0x40, 0x30, + 0x2E, 0xF0, 0x02, 0xA2, 0x3A, 0xF0, 0x02, 0xAF, 0x9F, 0x07, 0x1E, 0xE4, + 0x7B, 0x3C, 0x00, 0xA2, 0x60, 0x00, 0xC1, 0xE0, 0x93, 0x1D, 0x1E, 0xE4, + 0xF7, 0x06, 0x0B, 0xE4, 0x00, 0x20, 0x09, 0xE0, 0xC1, 0xE0, 0x41, 0x3C, + 0x6E, 0x00, 0xC0, 0xE0, 0x0B, 0xE4, 0x00, 0x40, 0x09, 0xE0, 0x60, 0x00, + 0x87, 0x3C, 0x71, 0x00, 0xC0, 0xE0, 0x43, 0x07, 0x63, 0xE1, 0x49, 0xE0, + 0x72, 0x00, 0xC0, 0xE0, 0x1D, 0x30, 0x02, 0xAF, 0x03, 0x31, 0x66, 0x08, + 0x4A, 0xE0, 0xAF, 0x3C, 0x1E, 0xA8, 0x02, 0xAF, 0x00, 0xA2, 0xAD, 0x3C, + 0x1E, 0xA8, 0x0C, 0xAF, 0x1B, 0x08, 0x64, 0xE1, 0x69, 0x08, 0x63, 0xE1, + 0x04, 0x3D, 0x03, 0x3D, 0x1A, 0x08, 0x65, 0xE1, 0x20, 0xAF, 0x73, 0x00, + 0xC0, 0xE0, 0x05, 0x3D, 0x01, 0xA2, 0x81, 0x3C, 0xFF, 0x7F, 0x08, 0xE0, + 0xC0, 0xE0, 0x1A, 0x08, 0x63, 0xE1, 0xC4, 0x3E, 0x6A, 0xF0, 0x03, 0x29, + 0x03, 0x31, 0x73, 0x00, 0x1B, 0x08, 0x64, 0xE1, 0x74, 0x00, 0xC0, 0xE0, + 0xC0, 0xE0, 0x69, 0x08, 0x63, 0xE1, 0x04, 0x3D, 0x49, 0xE0, 0x3E, 0xA8, + 0x02, 0xAF, 0x73, 0x00, 0x49, 0xE0, 0xBB, 0xF0, 0x03, 0xA8, 0x09, 0xAF, + 0x12, 0xE0, 0x5B, 0xF0, 0x03, 0xA8, 0x07, 0xAF, 0x0E, 0xA8, 0x2E, 0xF0, + 0x12, 0xE0, 0x0E, 0xA8, 0x2E, 0xE4, 0x6B, 0x1A, 0x1E, 0xE4, 0x03, 0x3D, + 0x2F, 0x3C, 0x00, 0xA2, 0x30, 0x3C, 0x0C, 0xA2, 0x1E, 0xE4, 0x30, 0xA2, + 0x2D, 0x20, 0x1E, 0xE4, 0x1E, 0xE4, 0xDF, 0x0B, 0x1E, 0xE4, 0x4C, 0x20, + 0x2E, 0xE4, 0x57, 0x20, 0x1E, 0xE4, 0x67, 0x0D, 0x30, 0x3C, 0x0E, 0xA2, + 0x2F, 0x3C, 0x06, 0xA2, 0x30, 0x0C, 0x1E, 0xE4, 0x2D, 0x20, 0x1E, 0xE4, + 0x60, 0x00, 0xC0, 0xE0, 0x57, 0x20, 0x1E, 0xE4, 0x65, 0x07, 0x1E, 0xE4, + 0x2A, 0xE4, 0x3E, 0xAF, 0x7F, 0xA0, 0x49, 0xE0, 0x72, 0xC8, 0x2E, 0xE4, + 0x2B, 0xE4, 0x45, 0xE0, 0x0D, 0xAE, 0x0D, 0xAF, 0x03, 0xA1, 0x07, 0xAF, + 0x72, 0xCC, 0x42, 0xE0, 0x00, 0xA2, 0x76, 0x07, 0x84, 0xE1, 0x45, 0xCC, + 0x00, 0xA2, 0xC4, 0xCE, 0xF9, 0xF7, 0x9B, 0xCA, 0xC8, 0x1E, 0x1E, 0xE4, + 0xAA, 0xCE, 0x96, 0xCE, 0x57, 0x20, 0x1E, 0xE4, 0x92, 0xCE, 0x00, 0xA2, + 0x10, 0xA2, 0x2F, 0x3C, 0x06, 0xA2, 0x2E, 0xE4, 0x1E, 0xE4, 0x2D, 0x20, + 0x1E, 0xE4, 0x30, 0x3C, 0xC0, 0xE0, 0x57, 0x20, 0x1E, 0xE4, 0xA7, 0x0C, + 0x1E, 0xE4, 0x2A, 0xE4, 0x3E, 0xAF, 0x60, 0x00, 0x2F, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x65, 0x07, 0x2D, 0x20, 0x1E, 0xE4, 0x30, 0x3C, 0x12, 0xA2, + 0x67, 0x0D, 0x1E, 0xE4, 0x84, 0xBA, 0x04, 0xA2, 0x66, 0xE1, 0x2E, 0xE4, + 0x57, 0x20, 0x1E, 0xE4, 0x50, 0x34, 0x16, 0x4D, 0x16, 0x21, 0xC2, 0x04, + 0x08, 0xAF, 0x1E, 0xA0, 0x50, 0x28, 0x51, 0x3C, 0x08, 0xAF, 0x1E, 0xA0, + 0x51, 0x28, 0x50, 0x3C, 0x51, 0x28, 0x5B, 0xF0, 0x40, 0x2A, 0x52, 0x3C, + 0x51, 0x3C, 0x02, 0xAE, 0x0A, 0xAF, 0x3E, 0xA0, 0x53, 0x3C, 0x18, 0xE0, + 0x51, 0x82, 0x50, 0x84, 0xC0, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, 0x2E, 0xE4, + 0x17, 0xAE, 0x58, 0x00, 0x05, 0xE0, 0x40, 0x00, 0x03, 0xAE, 0x00, 0x24, + 0x05, 0xE0, 0x42, 0xE0, 0x50, 0x02, 0x11, 0xD1, 0x20, 0xCE, 0x42, 0xE0, + 0x03, 0x00, 0x13, 0xD1, 0x40, 0x01, 0x12, 0xD1, 0x06, 0xA2, 0x2E, 0xE4, + 0xF8, 0xF7, 0x28, 0xCA, 0x5A, 0x00, 0xC0, 0xE0, 0x31, 0x01, 0x1E, 0xE4, + 0x1E, 0xE4, 0xEE, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x12, 0xA1, 0x59, 0x00, + 0xC0, 0xE0, 0xD9, 0x21, 0x00, 0xA2, 0x2A, 0xE4, 0x06, 0xA1, 0x2A, 0xE4, + 0xB3, 0x1F, 0x1E, 0xE4, 0xD4, 0x3C, 0xD3, 0x3C, 0xEC, 0x1F, 0x1E, 0xE4, + 0xCF, 0x1F, 0x1E, 0xE4, 0x3A, 0xF0, 0x0C, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0x14, 0x1F, 0x1E, 0xE4, 0xA6, 0x21, 0x1E, 0xE4, 0x1B, 0x20, 0x1E, 0xE4, + 0x10, 0x20, 0x1E, 0xE4, 0x2A, 0xE4, 0x0C, 0xA1, 0x59, 0x00, 0xC0, 0xE0, + 0xC0, 0xE0, 0x2E, 0xE4, 0xAE, 0x21, 0x1E, 0xE4, 0x06, 0xA1, 0x7A, 0xF0, + 0x0C, 0xA1, 0x59, 0x00, 0x1E, 0xE4, 0x3A, 0xF0, 0x06, 0xA1, 0x5A, 0xF0, + 0x31, 0x01, 0x1E, 0xE4, 0x04, 0xA2, 0x92, 0x21, 0xC0, 0xE0, 0xC9, 0x3C, + 0x00, 0xA2, 0x2E, 0xE4, 0xFF, 0x0F, 0x08, 0xE0, 0x10, 0xAF, 0x14, 0x04, + 0x22, 0xE4, 0x46, 0xE0, 0x05, 0x02, 0x05, 0xE0, 0x1E, 0xE4, 0x2E, 0xE4, + 0xC9, 0x3C, 0x02, 0xA2, 0x19, 0x28, 0xB7, 0x08, 0x1E, 0xE4, 0x80, 0x08, + 0x7C, 0x3C, 0x31, 0x28, 0x92, 0x07, 0x18, 0xE4, 0x2A, 0x3C, 0x3D, 0x28, + 0xC5, 0x08, 0x1E, 0xE4, 0x52, 0xE0, 0x17, 0xE0, 0x40, 0x2A, 0x72, 0x28, + 0xD9, 0x0C, 0x19, 0xE4, 0x58, 0x2A, 0xDA, 0xF0, 0xC2, 0xE0, 0x35, 0x28, + 0xA8, 0x09, 0x1E, 0xE4, 0xC2, 0x14, 0x18, 0xE4, 0x15, 0x28, 0x72, 0x00, + 0xFE, 0xA2, 0xCF, 0x1D, 0x1E, 0xE4, 0x2E, 0xE4, 0x83, 0x0D, 0x1E, 0xE4, + 0x0B, 0x3C, 0x0A, 0x3C, 0xB9, 0x0A, 0x1E, 0xE4, 0x55, 0x11, 0x1E, 0xE4, + 0x40, 0x0A, 0x1E, 0xE4, 0x51, 0x0B, 0x1E, 0xE4, 0x29, 0x0B, 0x1E, 0xE4, + 0x55, 0x3C, 0xFE, 0xA2, 0x58, 0x28, 0x1A, 0x3C, 0x55, 0x3C, 0x00, 0xA2, + 0x4A, 0xF0, 0xC4, 0x28, 0xD9, 0x0C, 0x18, 0xE4, 0x1E, 0xE4, 0xEF, 0x14, + 0x18, 0xE4, 0x1A, 0x28, 0x67, 0x3C, 0x02, 0xAA, 0x67, 0x28, 0x65, 0x09, + 0x54, 0x1C, 0x55, 0x2C, 0xC5, 0x15, 0x1E, 0xE4, 0x08, 0xE0, 0x65, 0x00, + 0xC0, 0xE0, 0xC2, 0xF1, 0x5C, 0x00, 0xC0, 0xE0, 0x6A, 0xF1, 0x00, 0x02, + 0xC0, 0xE0, 0x1A, 0xF1, 0x00, 0x08, 0x08, 0xE0, 0xC2, 0xE0, 0x00, 0x08, + 0x0A, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, 0x00, 0xCE, 0x02, 0xA2, 0x5D, 0x00, + 0xC9, 0xF7, 0x00, 0x08, 0x09, 0xE0, 0x5D, 0x00, 0x4E, 0xF5, 0x98, 0xF7, + 0x04, 0x00, 0xC0, 0xE0, 0xA7, 0x0F, 0x1E, 0xE4, 0x79, 0x11, 0x1E, 0xE4, + 0x2E, 0xE4, 0xC2, 0x14, 0x18, 0xE4, 0x15, 0x28, 0x3F, 0x2A, 0x02, 0xAE, + 0x16, 0xE0, 0x43, 0x28, 0x43, 0x2A, 0x02, 0xAE, 0x56, 0xE0, 0x03, 0xA8, + 0x02, 0xAE, 0x56, 0xE0, 0x17, 0xE0, 0x03, 0xA8, 0x56, 0xE0, 0x03, 0xA8, + 0x1B, 0xE0, 0x40, 0x2A, 0x56, 0xE0, 0x03, 0xA8, 0x3E, 0x2A, 0x02, 0xAE, + 0x56, 0xE0, 0x3F, 0xA8, 0x24, 0x2A, 0x0A, 0xAE, 0x00, 0x00, 0xF3, 0xD1, + 0x80, 0xCF, 0x06, 0xAE, 0xC0, 0x00, 0xE1, 0xD1, 0xE4, 0xCF, 0x35, 0x28, + 0x00, 0x00, 0xEE, 0xD1, 0x55, 0x00, 0xE8, 0xD1, 0x26, 0x4C, 0x02, 0xAE, + 0x02, 0xA1, 0x50, 0x28, 0x00, 0xCF, 0x02, 0xAE, 0x40, 0x4C, 0x04, 0xAE, + 0x90, 0xE1, 0x90, 0xE1, 0x01, 0x00, 0x85, 0xD1, 0x2A, 0xE4, 0x3E, 0x28, + 0x00, 0x00, 0x85, 0xD1, 0x00, 0xA2, 0x2E, 0xE4, 0x04, 0x00, 0x40, 0xD0, + 0x81, 0x00, 0x02, 0xE0, 0x50, 0x28, 0x64, 0x3C, 0x1E, 0xE4, 0x64, 0x3C, + 0x50, 0x28, 0x64, 0xF0, 0x73, 0x0B, 0x1E, 0xE4, 0x2E, 0xE4, 0x60, 0x0B, + 0xED, 0x3C, 0xEC, 0x34, 0x00, 0xA2, 0x2E, 0xE4, 0x63, 0xE1, 0x49, 0xE0, + 0x77, 0x00, 0xC0, 0xE0, 0x13, 0x3D, 0x06, 0xA8, 0x0A, 0xAF, 0x70, 0x08, + 0x13, 0x31, 0x0E, 0xAF, 0x4A, 0xE0, 0x2F, 0x3C, 0x4A, 0xE0, 0x13, 0x3D, + 0x1E, 0xA8, 0x02, 0xAF, 0x13, 0x31, 0x02, 0xAF, 0x13, 0x31, 0x18, 0xAF, + 0x0E, 0xA8, 0x02, 0xAF, 0x13, 0x31, 0x02, 0xAF, 0x24, 0xAF, 0x77, 0x00, + 0xC0, 0xE0, 0x13, 0x3D, 0x77, 0x00, 0xC0, 0xE0, 0x13, 0x3D, 0x0E, 0xA8, + 0xC0, 0xE0, 0x59, 0x3C, 0x06, 0xA8, 0x2A, 0xAF, 0x03, 0x3D, 0x1E, 0xA8, + 0x30, 0xAF, 0x77, 0x00, 0x6F, 0x08, 0x63, 0xE1, 0x78, 0x00, 0xC0, 0xE0, + 0x04, 0xA8, 0x65, 0x00, 0xC0, 0xE0, 0x03, 0x3D, 0x48, 0xF0, 0x02, 0xA8, + 0x40, 0x28, 0x7A, 0xF0, 0x14, 0x28, 0x7D, 0x3C, 0x29, 0x3C, 0x00, 0xA2, + 0x40, 0x28, 0x68, 0xF1, 0x29, 0x2C, 0x78, 0xF0, 0x02, 0xA1, 0xDE, 0xF0, + 0x38, 0xF1, 0x02, 0xA8, 0x14, 0x2A, 0x9A, 0xF0, 0x7D, 0x28, 0xBA, 0xF0, + 0x03, 0xAE, 0x2A, 0xF0, 0x04, 0xA8, 0x40, 0x28, 0x00, 0xA2, 0x68, 0xF0, + 0x46, 0xE0, 0x7D, 0x28, 0x5E, 0xF0, 0x7D, 0x3C, 0x02, 0xA2, 0x28, 0x3C, + 0x7D, 0x3C, 0x7D, 0x08, 0x28, 0x3C, 0x02, 0xA2, 0x60, 0x08, 0x61, 0xE1, + 0xE8, 0xF0, 0x28, 0x28, 0x02, 0x19, 0x01, 0x29, 0x61, 0x08, 0x62, 0xE1, + 0x01, 0x3D, 0x29, 0x3C, 0x00, 0xA2, 0x48, 0xF0, 0x40, 0x28, 0x01, 0x3D, + 0x02, 0xA0, 0x01, 0x29, 0xC0, 0xE0, 0x72, 0x3C, 0x00, 0xA2, 0x88, 0xF0, + 0x61, 0x09, 0x18, 0xE4, 0x02, 0xA8, 0x65, 0x00, 0x15, 0x28, 0x3D, 0x3C, + 0x63, 0x00, 0xC0, 0xE0, 0xB3, 0x13, 0x1A, 0xE4, 0x28, 0x28, 0x6A, 0xF1, + 0x03, 0x3D, 0x7D, 0x28, 0x47, 0x08, 0x63, 0xE1, 0x15, 0x28, 0x3D, 0x3C, + 0xF2, 0x13, 0x1E, 0xE4, 0xC0, 0xE0, 0x48, 0xF0, 0x6B, 0x28, 0x68, 0xF0, + 0x38, 0xF0, 0x40, 0x28, 0x3D, 0x3C, 0x63, 0x00, 0x1A, 0x3C, 0x00, 0xA2, + 0x61, 0x09, 0x19, 0xE4, 0x29, 0x2C, 0xEF, 0x14, 0x18, 0xE4, 0xC4, 0x28, + 0x78, 0xF0, 0x02, 0xA8, 0x40, 0x28, 0xA8, 0xF0, 0x03, 0xA0, 0x1C, 0x2A, + 0x31, 0x3C, 0x02, 0xA2, 0x31, 0x3C, 0x00, 0xA2, 0x3E, 0xF0, 0x1C, 0x3E, + 0x72, 0x3C, 0x28, 0x3C, 0x02, 0xA2, 0x2E, 0xE4, 0x31, 0x2A, 0x01, 0x00, + 0x4D, 0xD0, 0x2E, 0xE4, 0x1E, 0xE4, 0x30, 0x3C, 0x36, 0xB6, 0x0A, 0xA2, + 0x1E, 0xE4, 0xFA, 0x0C, 0x1E, 0xE4, 0x2D, 0x20, 0x67, 0x0D, 0x1A, 0xE4, + 0x3E, 0x28, 0x51, 0x0A, 0x1E, 0xE4, 0x71, 0x0D, 0x18, 0xE4, 0x3E, 0x28, + 0x80, 0x09, 0x18, 0xE4, 0x6A, 0x28, 0x57, 0x20, 0x2E, 0xE4, 0x1A, 0x3C, + 0x02, 0xA0, 0x1A, 0x28, 0x17, 0x3D, 0x00, 0xA2, 0xAC, 0x04, 0x67, 0xE1, + 0x9A, 0xC8, 0x17, 0x3D, 0x02, 0xA1, 0x55, 0x2C, 0x1A, 0x2C, 0x17, 0x3D, + 0x17, 0x35, 0x50, 0xA0, 0x81, 0xF1, 0xFF, 0x1F, 0x03, 0xE0, 0x49, 0xE0, + 0x17, 0x23, 0xBB, 0x04, 0x67, 0xE1, 0x06, 0xAE, 0xF8, 0xF7, 0x28, 0xCA, + 0x41, 0xE0, 0x17, 0x4F, 0x04, 0xE0, 0x48, 0xF0, 0x06, 0xA1, 0x40, 0x28, + 0x11, 0xD1, 0x21, 0xCE, 0x41, 0xE0, 0x00, 0x01, 0x13, 0xD1, 0x04, 0x00, + 0x12, 0xD1, 0xAC, 0x04, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x02, 0x00, + 0x0B, 0x3C, 0x0A, 0x3C, 0x55, 0x3C, 0x00, 0xA2, 0x02, 0xA9, 0x08, 0xA2, + 0xCA, 0xF2, 0x3E, 0x28, 0x20, 0xAE, 0xFF, 0xFF, 0x04, 0xE0, 0xB6, 0xCF, + 0x02, 0xA2, 0x9E, 0xCF, 0xFF, 0xFF, 0x0A, 0xE0, 0xE8, 0xCF, 0xD2, 0xCF, + 0x00, 0xA2, 0x84, 0xCF, 0x10, 0xA2, 0xEE, 0xCF, 0xEC, 0xCF, 0xEA, 0xCF, + 0x28, 0x4C, 0x04, 0xAE, 0x2A, 0x28, 0x8A, 0xCF, 0x82, 0xD1, 0x01, 0x00, + 0xCD, 0xD1, 0x82, 0xCF, 0xDC, 0xD1, 0x01, 0x00, 0xCE, 0xD1, 0x00, 0x00, + 0x0A, 0x3C, 0x02, 0xA0, 0x0A, 0x28, 0x01, 0x00, 0x0A, 0x3C, 0x00, 0xA2, + 0x68, 0xF0, 0x50, 0x18, 0xBE, 0xCB, 0x0B, 0x3C, 0x02, 0xA0, 0x0B, 0x28, + 0x1E, 0xE4, 0x30, 0x3C, 0x02, 0xA2, 0xFA, 0xF7, 0x54, 0x2C, 0xFA, 0x0C, + 0x1E, 0xE4, 0x2D, 0x20, 0x54, 0x2C, 0x88, 0x0A, 0x1E, 0xE4, 0x63, 0x3C, + 0x63, 0x3C, 0x66, 0xE0, 0x63, 0x2E, 0x55, 0x1C, 0x3E, 0x28, 0xFF, 0x09, + 0x1A, 0xE4, 0x3E, 0x28, 0x57, 0x20, 0x1E, 0xE4, 0x07, 0x0A, 0x18, 0xE4, + 0x54, 0x2C, 0x1A, 0x3C, 0x02, 0xA0, 0x1A, 0x2C, 0x2A, 0xE4, 0x3E, 0x28, + 0x48, 0xF6, 0x55, 0x1C, 0x84, 0xCF, 0x9E, 0xCF, 0xB6, 0xCF, 0x00, 0xA2, + 0x63, 0x2C, 0x2E, 0xE4, 0x00, 0x00, 0xDC, 0xD1, 0x55, 0x3C, 0x42, 0xE0, + 0x55, 0x2E, 0xFC, 0xBB, 0x55, 0x2C, 0x2E, 0xE4, 0x67, 0x0D, 0x1E, 0xE4, + 0x1E, 0xE4, 0x0D, 0x3C, 0x63, 0x0C, 0x0C, 0x3C, 0x03, 0xA1, 0x55, 0x1E, + 0x54, 0x2E, 0x0A, 0x0B, 0xDA, 0xD1, 0x9A, 0xCF, 0x56, 0xB6, 0x06, 0xA2, + 0x04, 0xCF, 0x0B, 0x4C, 0x0A, 0x24, 0x01, 0x00, 0x56, 0xB6, 0x0C, 0x1E, + 0x55, 0x2E, 0x00, 0xA2, 0x29, 0xF0, 0x03, 0xA1, 0x55, 0x1E, 0x0D, 0x2E, + 0x54, 0x2E, 0x96, 0xB6, 0x03, 0xA1, 0x12, 0xA2, 0x10, 0xA2, 0x29, 0xF0, + 0x03, 0xA1, 0x55, 0x1E, 0x55, 0x2C, 0x01, 0x00, 0xDC, 0xD1, 0x9C, 0xCF, + 0x02, 0xA0, 0x0A, 0x28, 0x55, 0x3C, 0x02, 0xA0, 0x00, 0xA2, 0x68, 0xF0, + 0x50, 0x18, 0x0A, 0x3C, 0x0B, 0x3C, 0x02, 0xA0, 0x0B, 0x28, 0x0A, 0x3C, + 0x0D, 0x1C, 0x55, 0x2C, 0xFA, 0xF7, 0xBE, 0xCB, 0x2E, 0xE4, 0x71, 0x0D, + 0x1E, 0xE4, 0x18, 0xF5, 0x3F, 0xA8, 0x2C, 0x2A, 0x0A, 0xAE, 0x2B, 0x28, + 0x3F, 0xA8, 0x2D, 0x2A, 0x0A, 0xAE, 0x56, 0xE0, 0xC4, 0xCF, 0x28, 0x28, + 0x30, 0xCF, 0x56, 0xE0, 0x90, 0xCF, 0x2A, 0x4C, 0x18, 0xAE, 0x02, 0xA2, + 0x00, 0xA4, 0x24, 0x08, 0x2A, 0x28, 0x2E, 0xE4, 0x9C, 0xE0, 0xF0, 0x02, + 0x00, 0xE0, 0x66, 0xA5, 0x0C, 0xAE, 0x06, 0x4D, 0x0C, 0xAE, 0x06, 0x29, + 0x82, 0xCF, 0x28, 0x4C, 0x04, 0xAE, 0x2A, 0x4C, 0x88, 0x0A, 0x1E, 0xE4, + 0x3B, 0x3C, 0x00, 0xA2, 0x0A, 0x0B, 0x1E, 0xE4, 0x3A, 0xF0, 0x3E, 0x28, + 0x53, 0x0B, 0x1E, 0xE4, 0x8C, 0x0A, 0x1E, 0xE4, 0x29, 0x0B, 0x1E, 0xE4, + 0x4D, 0x00, 0x5E, 0x8A, 0xFF, 0xFF, 0x08, 0xE0, 0x5E, 0x1C, 0x9A, 0xC8, + 0x28, 0x28, 0xA8, 0xF0, 0x6B, 0x28, 0x5F, 0x3C, 0x5F, 0x28, 0x66, 0xF0, + 0x0B, 0x28, 0x8A, 0xF0, 0x5C, 0x3C, 0xAA, 0x28, 0x32, 0xF0, 0x28, 0xA1, + 0x3B, 0x28, 0x42, 0xF0, 0x54, 0x1C, 0x55, 0x2C, 0x2E, 0xE4, 0x02, 0xA2, + 0x68, 0x0A, 0x0A, 0xE4, 0xA3, 0x0A, 0x0E, 0xE4, 0x3C, 0x3C, 0x02, 0xA2, + 0xA9, 0xF0, 0x2A, 0xE4, 0x38, 0x2A, 0x37, 0x28, 0xE1, 0x3C, 0x02, 0xA1, + 0x2A, 0xE4, 0xE1, 0x28, 0x3B, 0x3C, 0x02, 0xA2, 0x28, 0xE4, 0x02, 0xA1, + 0x3C, 0x2E, 0x63, 0x1C, 0x3C, 0x2C, 0x2E, 0xE4, 0x02, 0xA2, 0x28, 0xE4, + 0x3C, 0x3E, 0x03, 0xA0, 0x37, 0x28, 0x2E, 0xE4, 0x3B, 0x3C, 0x3C, 0x3C, + 0x04, 0xA1, 0x2A, 0xE4, 0x38, 0x28, 0x2A, 0xE4, 0x1A, 0x2C, 0xDE, 0xF0, + 0x39, 0x2C, 0x3A, 0xF0, 0x00, 0xE0, 0x1A, 0x2C, 0x80, 0xF0, 0x39, 0x1C, + 0x02, 0xA0, 0x06, 0x29, 0x9C, 0xE0, 0x00, 0x0A, 0x63, 0x3C, 0xFF, 0xFF, + 0x04, 0xE0, 0x3E, 0xF0, 0xD8, 0x3C, 0xE1, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0xD5, 0x3C, 0x02, 0xA2, 0xD9, 0x3C, 0xD7, 0x3C, 0xD7, 0x3C, 0xD6, 0x28, + 0x1E, 0xF2, 0xD6, 0x3C, 0x38, 0x28, 0x37, 0x2A, 0xD6, 0x3C, 0x10, 0xB6, + 0x2E, 0xE4, 0x01, 0xA2, 0x38, 0xF0, 0x2B, 0xE4, 0x02, 0xA1, 0xD5, 0x3C, + 0x02, 0xA0, 0xD5, 0x2C, 0x38, 0x28, 0x28, 0xE4, 0x01, 0xA2, 0xD8, 0x1C, + 0xD6, 0x3E, 0x03, 0xA2, 0x5A, 0xF0, 0x04, 0xA1, 0xD6, 0x3E, 0x03, 0xA2, + 0x2E, 0xE4, 0xD5, 0x3E, 0xD9, 0x3C, 0x02, 0xA0, 0xD9, 0x28, 0xD5, 0x3E, + 0x2A, 0xE4, 0x37, 0x28, 0xEA, 0x0A, 0x0E, 0xE4, 0x3A, 0xF0, 0x04, 0xA1, + 0x2A, 0xE4, 0x38, 0x28, 0x39, 0x1C, 0xD9, 0x2C, 0xDE, 0xF0, 0x39, 0x28, + 0x00, 0x0A, 0x00, 0xE0, 0xD9, 0x2C, 0x80, 0xF0, 0x3E, 0xF0, 0x02, 0xA0, + 0x06, 0x29, 0x9C, 0xE0, 0x03, 0xA2, 0xD8, 0x3C, 0xFF, 0xFF, 0x04, 0xE0, + 0x5D, 0x4C, 0x38, 0x28, 0x37, 0x2A, 0x2E, 0xE4, 0x28, 0xE4, 0xE1, 0x28, + 0x28, 0xE4, 0x2B, 0xE4, 0x46, 0xE0, 0x39, 0x4E, 0x3A, 0x26, 0x9A, 0xC8, + 0x0D, 0xA2, 0xD6, 0x3E, 0x03, 0xA2, 0x24, 0xE4, 0x0E, 0xA8, 0x68, 0xC8, + 0x2E, 0xE4, 0xE1, 0x3E, 0x07, 0x18, 0x10, 0xA2, 0x07, 0x3C, 0xDA, 0xF0, + 0x02, 0xA2, 0x44, 0xCC, 0x02, 0xA1, 0x07, 0x3C, 0x90, 0xE1, 0xE0, 0xBA, + 0x17, 0x0B, 0x84, 0xE1, 0x1A, 0xE0, 0x3A, 0xF0, 0x28, 0x28, 0x90, 0xE1, + 0x82, 0xCC, 0x2A, 0x4C, 0x0C, 0xAE, 0x2E, 0x08, 0x84, 0xC8, 0x90, 0xE1, + 0x02, 0x00, 0x40, 0xD0, 0xF8, 0xF7, 0x1C, 0xCB, 0x2E, 0xE4, 0xF8, 0xF7, + 0x55, 0x0B, 0x18, 0xE4, 0xC9, 0x28, 0x2E, 0xE4, 0x18, 0xE4, 0x15, 0x28, + 0x01, 0x00, 0xDC, 0xD1, 0x55, 0x2C, 0x22, 0x1D, 0x1E, 0xE4, 0x56, 0x19, + 0xC2, 0x0A, 0x1E, 0xE4, 0x55, 0x3C, 0x02, 0xA0, 0xC6, 0x10, 0x1E, 0xE4, + 0xD4, 0x10, 0x1E, 0xE4, 0xEE, 0x10, 0x1E, 0xE4, 0x0E, 0x10, 0x1E, 0xE4, + 0x19, 0xE4, 0x64, 0x2A, 0xFA, 0xF7, 0xBE, 0xCB, 0x38, 0x1E, 0x19, 0xE4, + 0x69, 0x2A, 0x7D, 0x0B, 0x2E, 0xE4, 0x7D, 0x1E, 0x19, 0xE4, 0x68, 0x2A, + 0xFA, 0xF7, 0xBE, 0xCB, 0x01, 0x00, 0xDC, 0xD1, 0x0E, 0xE4, 0x2F, 0x0F, + 0x0E, 0xE4, 0x2E, 0xE4, 0x2A, 0xE4, 0x06, 0xA8, 0xC8, 0xCA, 0x8D, 0x0F, + 0xFF, 0x00, 0x09, 0xE0, 0x09, 0xA1, 0x6F, 0xC8, 0x2E, 0xE4, 0x75, 0xF7, + 0x45, 0xE0, 0x66, 0xC8, 0x65, 0x3C, 0x00, 0xA2, 0xD6, 0x0B, 0x1E, 0xE4, + 0x04, 0xAF, 0x06, 0xA0, 0x26, 0xE4, 0x64, 0x28, 0x68, 0xCF, 0x02, 0xA1, + 0x02, 0xAE, 0x64, 0x3C, 0x00, 0xA2, 0x66, 0xCF, 0x02, 0xA1, 0x64, 0x28, + 0x50, 0x28, 0x2E, 0xE4, 0x6C, 0xCF, 0x6A, 0xCF, 0x66, 0xCF, 0x02, 0xAF, + 0x68, 0xCF, 0x02, 0xA1, 0x65, 0x3C, 0x6C, 0xCF, 0x6A, 0xCF, 0x00, 0xA2, + 0x00, 0xA2, 0x8A, 0xF1, 0x1E, 0xCB, 0x2E, 0xE4, 0x20, 0xAE, 0x02, 0xA1, + 0x50, 0x28, 0x66, 0x3C, 0x46, 0xE0, 0x05, 0xCB, 0x02, 0xA1, 0x51, 0x4C, + 0x1E, 0xE4, 0x28, 0xE4, 0x66, 0x3C, 0x16, 0xE0, 0x04, 0xA1, 0x65, 0x28, + 0x66, 0x2A, 0xB7, 0x0B, 0x65, 0x28, 0x97, 0x0B, 0x12, 0xE4, 0x39, 0xF0, + 0x65, 0x28, 0x2E, 0xE4, 0x65, 0x3C, 0x02, 0xA0, 0x64, 0x82, 0xA4, 0xCC, + 0x06, 0xA8, 0x04, 0xA0, 0x46, 0x00, 0xC1, 0xE0, 0x08, 0xAE, 0x18, 0xE0, + 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, 0x42, 0xE0, 0x20, 0xCE, 0xF9, 0xF7, + 0x29, 0xCA, 0x42, 0xE0, 0x16, 0xB6, 0x03, 0xA8, 0x65, 0x2A, 0x64, 0x28, + 0x02, 0xAE, 0x64, 0x28, 0x22, 0xCE, 0x02, 0xAE, 0x29, 0xCA, 0x19, 0x00, + 0x13, 0xD1, 0x24, 0xCE, 0x65, 0x28, 0x2E, 0xE4, 0x90, 0xE1, 0xF9, 0xF7, + 0x18, 0xE0, 0x64, 0x82, 0xA4, 0xCC, 0x06, 0xA8, 0x42, 0xE0, 0x46, 0x00, + 0xC1, 0xE0, 0x08, 0xAE, 0x42, 0xE0, 0x11, 0xAE, 0x00, 0x00, 0x05, 0xE0, + 0x64, 0x28, 0x20, 0xCE, 0xF9, 0xF7, 0x29, 0xCA, 0x02, 0xAE, 0x16, 0xB6, + 0x03, 0xA8, 0x65, 0x2A, 0x24, 0xCE, 0x02, 0xAE, 0x64, 0x28, 0x22, 0xCE, + 0xF9, 0xF7, 0x29, 0xCA, 0x18, 0x00, 0x13, 0xD1, 0x30, 0xCE, 0x00, 0xA2, + 0x2E, 0xE4, 0x90, 0xE1, 0xDD, 0x0B, 0x84, 0xE1, 0x00, 0x02, 0x22, 0xD0, + 0xC1, 0xE0, 0x2E, 0xE4, 0x32, 0xCE, 0x90, 0xE1, 0xFF, 0xFF, 0x09, 0xE0, + 0x21, 0xAF, 0x6D, 0x00, 0x5B, 0xF0, 0x1C, 0xA2, 0x05, 0xA1, 0x07, 0x3E, + 0x2E, 0xE4, 0x2B, 0xF0, 0x03, 0xA1, 0x2A, 0xA2, 0xC0, 0xBA, 0xC0, 0xBA, + 0xC0, 0xBA, 0x8E, 0xBA, 0x01, 0xA2, 0xFC, 0xBB, 0x02, 0xA1, 0x07, 0x28, + 0x44, 0xCC, 0x02, 0xA1, 0x07, 0x28, 0x08, 0x3E, 0xFC, 0xBB, 0x08, 0x28, + 0x2C, 0x0C, 0x84, 0xE1, 0xC3, 0xBA, 0xC2, 0xBA, 0xE0, 0xBA, 0x8A, 0xBA, + 0xC0, 0xBA, 0xC0, 0xBA, 0x84, 0xBA, 0x08, 0x28, 0xE0, 0xBA, 0xC0, 0xBA, + 0xC0, 0xBA, 0xC0, 0xBA, 0xC0, 0xBA, 0xC0, 0xBA, 0xC0, 0xBA, 0xC0, 0xBA, + 0x04, 0xA2, 0xE0, 0xBA, 0xC0, 0xBA, 0xC0, 0xBA, 0xC0, 0xE0, 0x70, 0xF0, + 0x08, 0x28, 0x82, 0xBA, 0x9E, 0xBA, 0xFF, 0xFF, 0x08, 0xE0, 0x6D, 0x00, + 0xC0, 0xE0, 0x80, 0xF0, 0x02, 0xA1, 0xFE, 0xF0, 0xFF, 0xFF, 0x08, 0xE0, + 0x20, 0xAF, 0x6E, 0x00, 0x6E, 0x00, 0xC0, 0xE0, 0x6E, 0xF0, 0x9E, 0xBA, + 0x00, 0xA2, 0x9E, 0xBA, 0xFF, 0xFF, 0x08, 0xE0, 0x02, 0xA0, 0x08, 0x28, + 0xFC, 0xBB, 0xFC, 0xBB, 0x2E, 0xE4, 0x67, 0x0D, 0x1E, 0xE4, 0x08, 0x3C, + 0xAA, 0xF0, 0x02, 0xA1, 0x5A, 0xF1, 0x41, 0x28, 0xC0, 0xBA, 0x8E, 0xBA, + 0x64, 0x00, 0x04, 0xE0, 0x0E, 0xE4, 0xC4, 0xBA, 0xC0, 0xBA, 0xC0, 0xBA, + 0x8E, 0xBA, 0x4D, 0x00, 0x04, 0xE0, 0x4D, 0x0C, 0xC4, 0xBA, 0xC0, 0xBA, + 0xE0, 0xBA, 0xC0, 0xBA, 0x42, 0x00, 0x04, 0xE0, 0x4D, 0x0C, 0x0E, 0xE4, + 0xC0, 0xBA, 0xE0, 0xBA, 0xC0, 0xBA, 0x8E, 0xBA, 0x0E, 0x28, 0x8E, 0xBA, + 0x42, 0x28, 0xC4, 0xBA, 0x88, 0xF0, 0x04, 0xA1, 0x41, 0x28, 0xFC, 0xBB, + 0xFC, 0xBB, 0x00, 0xA2, 0xFC, 0xBB, 0x43, 0x28, 0x10, 0x28, 0xC0, 0xBA, + 0xC0, 0xBA, 0xFC, 0xBB, 0xFC, 0xBB, 0x11, 0x28, 0xFC, 0xBB, 0x08, 0xA1, + 0x08, 0xA1, 0x12, 0x28, 0x48, 0xF0, 0x11, 0x28, 0x08, 0xE0, 0x6F, 0x00, + 0xC0, 0xE0, 0xFC, 0xBB, 0x6F, 0x00, 0xC1, 0xE0, 0xFC, 0xBB, 0xFF, 0xFF, + 0x02, 0xA2, 0x58, 0x3E, 0x0F, 0xA8, 0x21, 0xAF, 0x50, 0x28, 0x80, 0xBA, + 0x00, 0xA2, 0x21, 0xF0, 0x40, 0x2A, 0x51, 0x28, 0xFC, 0xBB, 0x02, 0xA1, + 0xFC, 0xBB, 0x02, 0xA1, 0x02, 0xAF, 0x2B, 0xF0, 0xC0, 0xBA, 0x4A, 0xF0, + 0x40, 0x28, 0x90, 0xE1, 0x90, 0xE1, 0xE0, 0xBA, 0x2E, 0xF0, 0xC0, 0xBA, + 0xC0, 0xBA, 0x38, 0xF0, 0x73, 0x28, 0xE0, 0xBA, 0x43, 0x2A, 0x00, 0xA2, + 0xE0, 0xBA, 0x7E, 0xF1, 0x40, 0x2A, 0x08, 0x3C, 0x07, 0x3C, 0x32, 0xB4, + 0x07, 0x5C, 0x74, 0x28, 0x08, 0x3C, 0x32, 0xB4, 0xFC, 0xBB, 0x07, 0x5C, + 0x75, 0x28, 0xFC, 0xBB, 0x77, 0x28, 0xFC, 0xBB, 0x08, 0x5C, 0x76, 0x28, + 0xC0, 0xBA, 0x90, 0xE1, 0xFC, 0xBB, 0x08, 0x5C, 0x2E, 0xE4, 0x02, 0xA2, + 0x67, 0x0D, 0x1E, 0xE4, 0x0F, 0x28, 0x2E, 0xE4, 0x00, 0xA2, 0x6A, 0xE1, + 0x3E, 0x28, 0xFC, 0xBB, 0x0E, 0x28, 0xFC, 0xBB, 0x21, 0x28, 0x80, 0xBA, + 0x20, 0x28, 0x80, 0xBA, 0x22, 0x28, 0xD6, 0x0C, 0x08, 0xE4, 0xFC, 0xBB, + 0xFC, 0xBB, 0x90, 0xE1, 0x00, 0xA2, 0xFC, 0xBB, 0xC1, 0xBA, 0x90, 0xE1, + 0xC0, 0xBA, 0x90, 0xE1, 0xFE, 0xBB, 0x34, 0xA1, 0x23, 0x28, 0x90, 0xE1, + 0xFE, 0xBB, 0x24, 0x28, 0xFE, 0xBB, 0x00, 0xA2, 0x80, 0xBA, 0x26, 0x28, + 0x80, 0xBA, 0x25, 0x28, 0x04, 0xA1, 0x41, 0x28, 0x80, 0xBA, 0x27, 0x28, + 0xC0, 0xBA, 0x80, 0xBA, 0x3F, 0x28, 0x68, 0xF0, 0x67, 0x0D, 0x1E, 0xE4, + 0xFE, 0xBB, 0x24, 0x28, 0x00, 0xA2, 0x6A, 0xE1, 0x2E, 0xE4, 0x02, 0xA2, + 0x1E, 0xE4, 0x30, 0x3C, 0x1C, 0xA2, 0x2E, 0xE4, 0x1E, 0xE4, 0xE1, 0x0C, + 0x1E, 0xE4, 0x2D, 0x20, 0x72, 0xCC, 0x30, 0xA0, 0x72, 0xC8, 0x57, 0x20, + 0x59, 0x28, 0x80, 0xBA, 0x31, 0x28, 0xE0, 0xBA, 0xC3, 0xBA, 0xC2, 0xBA, + 0xE0, 0xBA, 0x8A, 0xBA, 0xE0, 0xBA, 0xC0, 0xBA, 0x84, 0xBA, 0x59, 0x28, + 0x2F, 0x28, 0x82, 0xBA, 0x06, 0xA2, 0xE0, 0xBA, 0x1E, 0xE4, 0xC0, 0xBA, + 0xC0, 0xBA, 0x3A, 0xF0, 0xFC, 0xBB, 0x55, 0x2C, 0x2E, 0xE4, 0x67, 0x0D, + 0xFC, 0xBB, 0x02, 0xAE, 0x16, 0xE0, 0x28, 0x28, 0x68, 0xF0, 0x40, 0x28, + 0xFC, 0xBB, 0x0F, 0x28, 0x10, 0x70, 0x03, 0x2D, 0x78, 0x08, 0x63, 0xE1, + 0xE0, 0xBA, 0x10, 0x70, 0x29, 0x2C, 0x7E, 0xF0, 0x31, 0x28, 0x80, 0xBA, + 0x02, 0xA8, 0x40, 0x2C, 0x08, 0xE0, 0x02, 0xA1, 0x1C, 0x28, 0x6A, 0xF0, + 0x6F, 0x08, 0x63, 0xE1, 0xFC, 0xBB, 0xFF, 0xFF, 0x74, 0x08, 0x63, 0xE1, + 0x9E, 0xBA, 0x03, 0x29, 0x6A, 0xF1, 0x28, 0x28, 0x71, 0x08, 0x64, 0xE1, + 0xE0, 0xBA, 0xFC, 0xBB, 0x00, 0xA2, 0xE0, 0xBA, 0xFC, 0xBB, 0x04, 0xA2, + 0x6A, 0xF0, 0x04, 0x29, 0x64, 0xE1, 0x9E, 0xF0, 0xFC, 0xBB, 0x00, 0xA2, + 0x64, 0xE1, 0xFC, 0xBB, 0x04, 0x29, 0x73, 0x08, 0x06, 0xA2, 0xFC, 0xBB, + 0x04, 0x29, 0x72, 0x08, 0x31, 0x28, 0x7A, 0xF1, 0x2F, 0x28, 0xFC, 0xBB, + 0x80, 0xBA, 0x03, 0x29, 0xC0, 0xBA, 0x5A, 0xF0, 0xEA, 0xF0, 0x80, 0xBA, + 0x03, 0x29, 0x1E, 0xF1, 0x5A, 0xF0, 0x04, 0x29, 0x75, 0x08, 0x64, 0xE1, + 0xFC, 0xBB, 0x02, 0xA2, 0xFC, 0xBB, 0x08, 0xA2, 0xFC, 0xBB, 0x00, 0xA2, + 0xFC, 0xBB, 0x0C, 0xA2, 0x3A, 0xF0, 0x28, 0x44, 0x3E, 0x28, 0xFC, 0xBB, + 0x23, 0x18, 0x2A, 0x28, 0xFC, 0xBB, 0x2E, 0x28, 0x63, 0x0D, 0x0A, 0xE4, + 0x25, 0x28, 0xFE, 0xBB, 0x0A, 0xE4, 0x02, 0xA1, 0xFC, 0xBB, 0x2B, 0x28, + 0xFE, 0xBB, 0x02, 0xAF, 0x2C, 0x28, 0x63, 0x0D, 0x02, 0xA2, 0xFE, 0xBB, + 0x02, 0xAF, 0x2D, 0x28, 0xE0, 0xBA, 0x2E, 0xE4, 0x00, 0xA2, 0x2E, 0xE4, + 0x10, 0xA1, 0x2A, 0xE4, 0x0E, 0xA8, 0x68, 0xC8, 0xFE, 0x70, 0x00, 0xA2, + 0xFE, 0x3C, 0x12, 0xE0, 0x8A, 0xF0, 0x0E, 0xA8, 0x68, 0xC8, 0x2E, 0xE4, + 0x07, 0x3C, 0x07, 0x18, 0x10, 0xA2, 0x07, 0x3C, 0x2E, 0xE4, 0x90, 0xE1, + 0x07, 0x70, 0x00, 0xA2, 0xC1, 0x12, 0x1E, 0xE4, 0x34, 0x3C, 0x00, 0xA2, + 0x63, 0xE1, 0x2E, 0xE4, 0x8B, 0x11, 0x1E, 0xE4, 0x63, 0xE1, 0x34, 0x3C, + 0x03, 0x29, 0x77, 0x08, 0x00, 0xA2, 0x35, 0x3C, 0x03, 0x29, 0x76, 0x08, + 0x3F, 0x2A, 0x10, 0xA2, 0x25, 0x01, 0xC2, 0xE0, 0x17, 0xE0, 0x3E, 0x2A, + 0x56, 0xE0, 0x17, 0xAE, 0x00, 0x01, 0xC2, 0xE0, 0x56, 0xE0, 0x15, 0xAE, + 0x39, 0xF0, 0x6F, 0x01, 0x04, 0xE0, 0x28, 0x2A, 0x78, 0x01, 0xC2, 0xE0, + 0x68, 0x01, 0x04, 0xE0, 0x00, 0xA2, 0x79, 0x01, 0xC2, 0xE0, 0x00, 0xA2, + 0x3D, 0x01, 0xC2, 0xE0, 0x3C, 0x01, 0xC2, 0xE0, 0x08, 0xE0, 0x49, 0xE0, + 0x50, 0x00, 0xC0, 0xE0, 0x09, 0xE0, 0x11, 0xAF, 0x00, 0x3C, 0x7F, 0x00, + 0x00, 0x3E, 0x00, 0x46, 0x01, 0x3E, 0x7F, 0x00, 0x3B, 0xF0, 0x03, 0xA8, + 0x00, 0x2A, 0x00, 0xA2, 0x05, 0xA8, 0x00, 0x2A, 0x02, 0x00, 0x0A, 0xE0, + 0x09, 0xA8, 0x00, 0x2A, 0x12, 0xA9, 0x2B, 0xF0, 0x11, 0xA8, 0x00, 0x2A, + 0x40, 0xA9, 0x2B, 0xF0, 0x0C, 0x04, 0xC2, 0xE0, 0x80, 0xA9, 0x2B, 0xF0, + 0x00, 0x00, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x03, 0xA8, 0x01, 0x2A, + 0x42, 0xE0, 0x10, 0xAE, 0x11, 0x21, 0x94, 0x03, 0x61, 0xE1, 0x5B, 0xF0, + 0x46, 0x00, 0xC1, 0xE0, 0x0E, 0xCF, 0x11, 0x4D, 0x42, 0xE0, 0x10, 0xAE, + 0x40, 0x00, 0x04, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, 0x05, 0xA8, 0x01, 0x2A, + 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x96, 0x03, 0x08, 0x02, 0xC2, 0xE0, + 0x00, 0xA2, 0x03, 0x01, 0x02, 0xA2, 0x1C, 0x02, 0xC2, 0xE0, 0x00, 0xA2, + 0xC2, 0xE0, 0x00, 0xA2, 0x10, 0x02, 0xC2, 0xE0, 0x03, 0xA2, 0xA8, 0x11, + 0x1E, 0xE4, 0x15, 0x02, 0x56, 0xE0, 0x09, 0xAE, 0x01, 0xA9, 0x09, 0xAE, + 0x56, 0xE0, 0x09, 0xAE, 0x17, 0xE0, 0x43, 0x2A, 0xC2, 0xE0, 0x56, 0xE0, + 0x0D, 0xAE, 0x1B, 0xE0, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x13, 0x02, + 0x01, 0x2A, 0x42, 0xE0, 0x10, 0xAE, 0x70, 0x00, 0x98, 0x03, 0x61, 0xE1, + 0x5B, 0xF0, 0x09, 0xA8, 0x11, 0x02, 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, + 0x70, 0x00, 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x42, 0xE0, 0x10, 0xAE, + 0x40, 0x00, 0x00, 0xE0, 0x61, 0xE1, 0x5B, 0xF0, 0x11, 0xA8, 0x01, 0x2A, + 0xC2, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x9A, 0x03, 0x71, 0x3C, 0x64, 0x00, + 0xC0, 0xE0, 0x12, 0x02, 0x08, 0xAE, 0x08, 0xAF, 0x3B, 0xF0, 0x72, 0x2A, + 0x5B, 0xF0, 0x72, 0x2A, 0xFF, 0xFF, 0x08, 0xE0, 0x6E, 0xF0, 0x0F, 0xA8, + 0x44, 0x00, 0xC1, 0xE0, 0x09, 0xE0, 0x21, 0xAF, 0x64, 0x00, 0xC1, 0xE0, + 0x43, 0x2A, 0x56, 0xE0, 0x21, 0xAE, 0x27, 0x00, 0x40, 0x2A, 0x56, 0xE0, + 0x27, 0xAE, 0x17, 0xE0, 0x9B, 0xF0, 0x72, 0x2A, 0xBB, 0xF0, 0x05, 0xA8, + 0x29, 0xF0, 0x7C, 0x2A, 0x49, 0xF0, 0x7B, 0x2A, 0x2E, 0xF0, 0x03, 0xAA, + 0x40, 0x2A, 0x4E, 0xF0, 0x56, 0xE0, 0x2D, 0xAE, 0x0F, 0xA8, 0x40, 0x2A, + 0x51, 0x4C, 0x50, 0x20, 0x38, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x01, 0x01, + 0xC2, 0xE0, 0x08, 0xAE, 0x08, 0xAE, 0x52, 0x4C, 0x50, 0x20, 0x05, 0x02, + 0x03, 0xA8, 0x71, 0x46, 0x03, 0xAA, 0x72, 0x2A, 0x08, 0xAE, 0x50, 0x4C, + 0x52, 0x20, 0x4B, 0xF0, 0x1E, 0xE4, 0x00, 0xA2, 0x42, 0x01, 0xC2, 0xE0, + 0x07, 0xAE, 0x17, 0xE0, 0x43, 0x2A, 0xA8, 0x11, 0x28, 0x28, 0x02, 0x01, + 0xC2, 0xE0, 0x56, 0xE0, 0x04, 0x01, 0xC2, 0xE0, 0x40, 0x4C, 0x06, 0xAE, + 0x06, 0xAE, 0x28, 0x4C, 0x08, 0xAE, 0x10, 0xA2, 0xC0, 0xE0, 0x04, 0x02, + 0xC2, 0xE0, 0x40, 0x4C, 0x43, 0x01, 0xC2, 0xE0, 0x7E, 0xA8, 0x60, 0x00, + 0x7F, 0x01, 0xC2, 0xE0, 0x69, 0x00, 0xC0, 0xE0, 0xC2, 0xE0, 0x0B, 0x02, + 0xC2, 0xE0, 0x34, 0x28, 0x02, 0x03, 0xC2, 0xE0, 0x02, 0xA2, 0x14, 0x02, + 0xEA, 0xF0, 0x7B, 0x28, 0x3B, 0xF0, 0x40, 0x2A, 0xC2, 0xE0, 0x80, 0x03, + 0xC2, 0xE0, 0x35, 0x28, 0xC2, 0xE0, 0x86, 0x03, 0xC2, 0xE0, 0x83, 0x03, + 0x1E, 0xE4, 0x9E, 0x11, 0x1E, 0xE4, 0x89, 0x03, 0x02, 0x03, 0xC2, 0xE0, + 0x00, 0xA2, 0xF9, 0x12, 0x40, 0x2A, 0x72, 0x00, 0xC2, 0xE0, 0x34, 0x28, + 0x02, 0xA0, 0x34, 0x28, 0x7B, 0xF0, 0x05, 0xA1, 0x34, 0x3C, 0x28, 0xF0, + 0x32, 0x18, 0x34, 0x3C, 0x98, 0xF1, 0x7B, 0x28, 0xBB, 0xF1, 0x40, 0x2A, + 0xC2, 0xE0, 0x7E, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x02, 0x03, 0xC2, 0xE0, + 0x02, 0xA2, 0x43, 0x01, 0xC2, 0xE0, 0x80, 0x03, 0xC2, 0xE0, 0x35, 0x28, + 0xC2, 0xE0, 0x86, 0x03, 0xC2, 0xE0, 0x83, 0x03, 0x1E, 0xE4, 0x9E, 0x11, + 0x1E, 0xE4, 0x89, 0x03, 0x02, 0x03, 0xC2, 0xE0, 0x00, 0xA2, 0xF9, 0x12, + 0xC2, 0xE0, 0x13, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x02, 0xA8, 0x02, 0xAF, + 0x40, 0x28, 0x20, 0x03, 0x02, 0xA8, 0x40, 0x28, 0x0D, 0x03, 0xC2, 0xE0, + 0x2B, 0xF0, 0x7C, 0x2A, 0x39, 0xF0, 0x7B, 0x2A, 0x0B, 0xAE, 0x55, 0xE0, + 0x01, 0xA2, 0x02, 0xAA, 0x0B, 0xAE, 0x55, 0xE0, 0x0B, 0xAE, 0x55, 0xE0, + 0xC3, 0xE0, 0x0A, 0x03, 0xC3, 0xE0, 0x55, 0xE0, 0xC2, 0xE0, 0x55, 0x00, + 0x04, 0xE0, 0x0B, 0x03, 0xC2, 0xE0, 0x3F, 0x00, 0x04, 0xE0, 0x0C, 0x03, + 0x04, 0xE0, 0x6A, 0xF0, 0x72, 0x28, 0x26, 0x01, 0x7E, 0xF0, 0x1F, 0x01, + 0xC2, 0xE0, 0xFF, 0xFF, 0x16, 0x4D, 0x16, 0x21, 0xC0, 0x04, 0x66, 0xE1, + 0xC2, 0xE0, 0x26, 0x28, 0x1F, 0x01, 0xC2, 0xE0, 0x1E, 0xE4, 0x8C, 0x11, + 0x1E, 0xE4, 0x75, 0x01, 0x71, 0x01, 0xC2, 0xE0, 0x28, 0x28, 0xC5, 0x12, + 0xC2, 0xE0, 0x06, 0x01, 0xC2, 0xE0, 0x02, 0xA2, 0x00, 0xA2, 0xDA, 0x3C, + 0x14, 0xA2, 0x39, 0x01, 0xDA, 0x2A, 0xDB, 0x3C, 0x40, 0x01, 0xC2, 0xE0, + 0xDB, 0x2A, 0x36, 0xB6, 0x00, 0xA2, 0x05, 0xA8, 0x0D, 0x01, 0xC2, 0xE0, + 0x08, 0xAE, 0x52, 0xB4, 0x10, 0xA2, 0x89, 0xF0, 0x11, 0xA8, 0xDA, 0x2A, + 0x56, 0xE0, 0x15, 0xAE, 0x17, 0xE0, 0x3E, 0x2A, 0x39, 0x01, 0xC0, 0xE0, + 0x00, 0x01, 0xC2, 0xE0, 0x0A, 0x28, 0x2E, 0xE4, 0xDA, 0xF7, 0x04, 0xA8, + 0x29, 0xF0, 0x45, 0xE0, 0x50, 0x2E, 0x02, 0xA0, 0x0B, 0x28, 0x28, 0xE4, + 0x0A, 0x3C, 0x00, 0xA2, 0xF6, 0xA2, 0x2E, 0xE4, 0x0B, 0x3C, 0x02, 0xA0, + 0x3F, 0x00, 0xC2, 0xE0, 0x5D, 0x3C, 0x55, 0x3C, 0xC2, 0x0A, 0x1E, 0xE4, + 0x92, 0x3C, 0x00, 0xA2, 0x06, 0x3C, 0x2A, 0x28, 0xD3, 0x0F, 0x1E, 0xE4, + 0x0F, 0x11, 0x1E, 0xE4, 0xEE, 0x10, 0x1E, 0xE4, 0xC2, 0xE0, 0x55, 0x28, + 0x55, 0x3C, 0xF8, 0xA2, 0x1E, 0xE4, 0xA8, 0xF0, 0x08, 0xA0, 0x3F, 0x00, + 0x1E, 0xE4, 0xC6, 0x10, 0x1E, 0xE4, 0xD4, 0x10, 0xFE, 0xF2, 0x13, 0x11, + 0x1E, 0xE4, 0xEE, 0x10, 0xD4, 0x10, 0x1E, 0xE4, 0xE8, 0xF0, 0x02, 0xA1, + 0xEE, 0x10, 0x1E, 0xE4, 0xC6, 0x10, 0x1E, 0xE4, 0x07, 0x10, 0x1E, 0xE4, + 0x13, 0x11, 0x1E, 0xE4, 0xD4, 0xF1, 0x0E, 0xF2, 0xFD, 0x0F, 0x1E, 0xE4, + 0x18, 0xE4, 0x15, 0x28, 0xEA, 0xF0, 0x02, 0xA1, 0x8A, 0xF0, 0x1E, 0x01, + 0xC0, 0xE0, 0x56, 0x19, 0x0B, 0x4D, 0x13, 0x21, 0x28, 0x08, 0x63, 0xE1, + 0x1E, 0xE4, 0x03, 0x3D, 0x13, 0x35, 0x02, 0xA0, 0x1E, 0xE4, 0xD4, 0x10, + 0x1E, 0xE4, 0xC2, 0x0A, 0x1E, 0xE4, 0xEE, 0x10, 0x1E, 0xE4, 0xC6, 0x10, + 0xBE, 0xF0, 0x94, 0x0F, 0x1E, 0xE4, 0x0E, 0x10, 0x17, 0x11, 0x1E, 0xE4, + 0x13, 0x11, 0x1E, 0xE4, 0xD3, 0x0F, 0x1E, 0xE4, 0xC2, 0x0A, 0x1E, 0xE4, + 0x02, 0xA0, 0x55, 0x28, 0x0F, 0x11, 0x1E, 0xE4, 0x5D, 0x3C, 0x42, 0x0F, + 0x04, 0xE4, 0x55, 0x3C, 0x3F, 0x00, 0xC2, 0xE0, 0x55, 0x28, 0x2E, 0xE4, + 0x7F, 0x00, 0xC2, 0xE0, 0xFF, 0xFF, 0x08, 0xE0, 0x19, 0xE4, 0x28, 0x2A, + 0xF9, 0x0A, 0x1E, 0xE4, 0xD7, 0x4E, 0x03, 0xAE, 0xD6, 0x2A, 0xE6, 0x0F, + 0x8E, 0x01, 0xC3, 0xE0, 0x28, 0x01, 0xC3, 0xE0, 0xE9, 0xF7, 0x11, 0x01, + 0xC1, 0xE0, 0x02, 0xA2, 0x1E, 0xE4, 0x2E, 0xE4, 0x10, 0x01, 0xC2, 0xE0, + 0x54, 0x2E, 0x0A, 0xF1, 0x68, 0x28, 0x13, 0x11, 0xB3, 0x04, 0x67, 0xE1, + 0xDB, 0xF0, 0x0F, 0xA8, 0x0F, 0xA0, 0x54, 0x2E, 0x17, 0x4D, 0x17, 0x21, + 0x42, 0xE0, 0x03, 0xA1, 0x07, 0xAE, 0x07, 0xAF, 0xBA, 0xF0, 0x69, 0x28, + 0xA5, 0x1E, 0x1E, 0xE4, 0x54, 0x2E, 0x06, 0xA1, 0x06, 0xA8, 0x54, 0x2C, + 0x03, 0xA1, 0x05, 0xAE, 0x05, 0xAF, 0x07, 0xA0, 0xC2, 0xE0, 0x54, 0x2C, + 0x63, 0x1E, 0x18, 0xE4, 0x1E, 0xE4, 0x0F, 0x11, 0x1E, 0xE4, 0x3F, 0x00, + 0x18, 0x01, 0xC0, 0xE0, 0x90, 0xE1, 0x13, 0x11, 0xD6, 0x28, 0x2E, 0xE4, + 0x8A, 0xF7, 0x02, 0xA8, 0x28, 0x01, 0xC2, 0xE0, 0xD7, 0x4C, 0x02, 0xAE, + 0x55, 0x28, 0x2E, 0xE4, 0x8E, 0x01, 0xC2, 0xE0, 0xE0, 0x3C, 0x06, 0xAE, + 0x0E, 0xA8, 0x02, 0xA1, 0x06, 0xAE, 0x0E, 0xA8, 0x55, 0x28, 0x2E, 0xE4, + 0x90, 0x01, 0xC0, 0xE0, 0x2E, 0xE4, 0xDF, 0x3C, 0xDF, 0x28, 0x09, 0x03, + 0xC2, 0xE0, 0x05, 0x3C, 0x62, 0xE1, 0x92, 0xE0, 0x00, 0x02, 0x00, 0xE0, + 0x20, 0xC4, 0xB0, 0x03, 0x63, 0xE1, 0x91, 0x01, 0xFA, 0x0F, 0x84, 0xE1, + 0x03, 0x00, 0x22, 0xD0, 0x2E, 0xE4, 0x11, 0x3D, 0x11, 0x35, 0x12, 0x9E, + 0x19, 0x01, 0xC2, 0xE0, 0x62, 0x28, 0x2E, 0xE4, 0x61, 0x28, 0x1A, 0x01, + 0xC2, 0xE0, 0x60, 0x28, 0x00, 0xA2, 0x2E, 0xE4, 0x1B, 0x01, 0xC2, 0xE0, + 0x60, 0x3C, 0x22, 0x22, 0x04, 0xE0, 0x62, 0x3C, 0x55, 0x2C, 0x5D, 0x2A, + 0x2E, 0xE4, 0x61, 0x3C, 0x54, 0x1C, 0x0C, 0xA0, 0x55, 0x28, 0x2B, 0xF0, + 0x2E, 0xE4, 0xD6, 0x3C, 0x02, 0xA2, 0x34, 0xF0, 0x45, 0xE0, 0x50, 0x2E, + 0x02, 0xA0, 0x0A, 0x28, 0x48, 0xF0, 0x0A, 0x3C, 0x00, 0xA2, 0x29, 0xF0, + 0x82, 0xE0, 0x0B, 0x3C, 0x02, 0xA0, 0x0B, 0x28, 0x63, 0xE1, 0x20, 0x07, + 0x61, 0xE1, 0x48, 0x3C, 0x6C, 0x28, 0x06, 0x3C, 0x03, 0x29, 0x6E, 0x08, + 0x0B, 0x28, 0x6D, 0x3C, 0xBB, 0x10, 0x0A, 0xE4, 0x56, 0xE0, 0x0B, 0x1A, + 0x11, 0x2B, 0x11, 0x19, 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, + 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, + 0x0B, 0x28, 0x06, 0x3E, 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, + 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x28, 0x06, 0x3E, + 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, 0x11, 0x19, + 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, 0x24, 0xF0, 0x11, 0x2B, + 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, 0x06, 0x3E, + 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, 0x56, 0xE0, 0x0A, 0x1A, + 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x28, 0x06, 0x3E, 0x24, 0xF0, 0x11, 0x2B, + 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x11, 0x2B, 0x56, 0xE0, + 0x11, 0x1B, 0x0A, 0x2A, 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, + 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, 0x06, 0x3E, 0x11, 0x1B, 0x0A, 0x2A, + 0x56, 0xE0, 0x0B, 0x1A, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, + 0x0B, 0x28, 0x06, 0x3E, 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, + 0x11, 0x2B, 0x11, 0x19, 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, + 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, + 0x0B, 0x28, 0x06, 0x3E, 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, + 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x28, 0x06, 0x3E, + 0x24, 0xF0, 0x11, 0x2B, 0x56, 0xE0, 0x0B, 0x1A, 0x11, 0x2B, 0x11, 0x19, + 0x11, 0x2B, 0x56, 0xE0, 0x11, 0x1B, 0x0A, 0x2A, 0x24, 0xF0, 0x11, 0x2B, + 0x56, 0xE0, 0x0A, 0x1A, 0x11, 0x2B, 0x11, 0x19, 0x0B, 0x28, 0x06, 0x3E, + 0x11, 0x1B, 0x0A, 0x2A, 0x56, 0xE0, 0x0B, 0x1A, 0x56, 0xE0, 0x0A, 0x1A, + 0x11, 0x2B, 0x56, 0xE0, 0x48, 0x28, 0x06, 0x3E, 0x24, 0xF0, 0x11, 0x2B, + 0x01, 0xA2, 0x6E, 0x08, 0x06, 0x28, 0x92, 0xE0, 0x5C, 0x3C, 0x66, 0xE0, + 0x67, 0xA2, 0x62, 0xE0, 0x46, 0x01, 0xC1, 0xE0, 0x2E, 0xE4, 0x06, 0x3C, + 0xBB, 0xF7, 0x03, 0xA8, 0x0F, 0xAF, 0x4A, 0xE0, 0xED, 0x4E, 0xEC, 0x26, + 0x3F, 0x00, 0x08, 0xE0, 0x2E, 0xE4, 0xED, 0x3C, 0xEC, 0x34, 0x42, 0xE0, + 0xA9, 0xF0, 0x15, 0x2A, 0xAA, 0x3C, 0x5C, 0x28, 0x18, 0x10, 0x1E, 0xE4, + 0x4B, 0xF0, 0x6B, 0x2A, 0x06, 0x3C, 0x5C, 0x3C, 0x2A, 0x28, 0x2E, 0xE4, + 0x6B, 0x2A, 0x45, 0x19, 0x1E, 0xE4, 0x2E, 0xE4, 0x1E, 0xE4, 0x18, 0x10, + 0x1E, 0xE4, 0x6B, 0xF0, 0xCD, 0x18, 0x1E, 0xE4, 0x2E, 0xE4, 0xB3, 0x18, + 0x3C, 0x08, 0x65, 0xE1, 0x2E, 0xE4, 0x06, 0x3C, 0x1E, 0xF0, 0x11, 0x18, + 0x18, 0xE4, 0x05, 0x29, 0xBA, 0x3C, 0x06, 0x28, 0x86, 0x11, 0x1E, 0xE4, + 0x00, 0xE0, 0x66, 0xA5, 0x00, 0xA4, 0x24, 0x08, 0x0C, 0xAE, 0x06, 0x29, + 0x9C, 0xE0, 0xF0, 0x02, 0xC2, 0xE0, 0xBA, 0x4C, 0x0C, 0xAE, 0x06, 0x4D, + 0x71, 0x01, 0xC2, 0xE0, 0x28, 0x28, 0x15, 0x01, 0x06, 0x00, 0x62, 0xE1, + 0x22, 0x08, 0x63, 0xE1, 0x02, 0xA2, 0x2E, 0xE4, 0x03, 0x3D, 0x02, 0x29, + 0xC0, 0xE0, 0x2E, 0xE4, 0x10, 0x01, 0xC2, 0xE0, 0xC0, 0xE0, 0x2E, 0xE4, + 0xE8, 0xF7, 0x11, 0x01, 0x04, 0xE0, 0x2E, 0xE4, 0xEA, 0xF7, 0x1C, 0x01, + 0x00, 0x21, 0x0A, 0xE0, 0x20, 0xAE, 0x10, 0x32, 0x10, 0x92, 0x04, 0xE0, + 0x55, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x00, 0x21, 0x0A, 0xE0, 0x20, 0xAE, + 0x20, 0xAE, 0x00, 0x10, 0x04, 0xE0, 0x58, 0x01, 0x56, 0x01, 0xC2, 0xE0, + 0x00, 0x10, 0x0A, 0xE0, 0x04, 0x00, 0x04, 0xE0, 0x59, 0x01, 0xC2, 0xE0, + 0x57, 0x01, 0xC2, 0xE0, 0x54, 0x01, 0xC2, 0xE0, 0x2E, 0xE4, 0x5A, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0x63, 0xE1, 0x49, 0xF0, 0x86, 0x11, 0x1E, 0xE4, + 0x22, 0x08, 0x63, 0xE1, 0x3E, 0xF0, 0x23, 0x08, 0x4E, 0xA5, 0x08, 0xB6, + 0x18, 0xA1, 0x03, 0x29, 0x06, 0x29, 0x9C, 0xE0, 0x30, 0x03, 0x00, 0xE0, + 0xC2, 0xE0, 0x28, 0x28, 0x70, 0x01, 0xC2, 0xE0, 0x72, 0x01, 0xC2, 0xE0, + 0x00, 0xA2, 0x71, 0x01, 0x72, 0x28, 0x2A, 0xE4, 0x28, 0x28, 0x2E, 0xE4, + 0x51, 0x08, 0x63, 0xE1, 0x02, 0xA2, 0x28, 0xE4, 0x56, 0xE0, 0x09, 0xA2, + 0x3B, 0xF0, 0x03, 0x2B, 0x1F, 0x4C, 0x02, 0xAE, 0x16, 0xB6, 0x1E, 0x2A, + 0x08, 0x01, 0xC2, 0xE0, 0x1E, 0x4C, 0x20, 0xAE, 0x09, 0x01, 0xC2, 0xE0, + 0x4A, 0x4C, 0x4F, 0x20, 0x0A, 0x01, 0xC2, 0xE0, 0x00, 0xA9, 0x54, 0x20, + 0x0B, 0x01, 0xC2, 0xE0, 0x4C, 0x4C, 0x4B, 0x20, 0x0C, 0x01, 0xC2, 0xE0, + 0x4E, 0x4C, 0x4D, 0x20, 0x72, 0x28, 0x2A, 0xE4, 0x28, 0x28, 0x2E, 0xE4, + 0x4B, 0x34, 0x0B, 0x01, 0xC0, 0xE0, 0x28, 0xE4, 0x4D, 0x34, 0x0C, 0x01, + 0xC0, 0xE0, 0x4C, 0x3C, 0x00, 0x01, 0xC1, 0xE0, 0x2E, 0xE4, 0x4E, 0x3C, + 0x2E, 0xE4, 0x2E, 0xE4, 0x03, 0xA8, 0x21, 0xAF, 0xA0, 0x01, 0x67, 0xE1, + 0x0A, 0xF1, 0x28, 0x28, 0x04, 0xA2, 0x51, 0x01, 0xC3, 0xE0, 0x07, 0x2B, + 0x50, 0x01, 0xC0, 0xE0, 0x50, 0x01, 0xC2, 0xE0, 0xC2, 0xE0, 0x08, 0xA2, + 0xDA, 0xF7, 0x04, 0xA8, 0xC0, 0xE0, 0x2E, 0xE4, 0x2E, 0xE4, 0x50, 0x01, + 0x2E, 0xE4, 0x02, 0xA8, 0x06, 0xAF, 0x44, 0x00, 0x58, 0xF0, 0x80, 0xA8, + 0x60, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0x0E, 0xA8, 0x44, 0x00, 0xC0, 0xE0, + 0x0E, 0xA8, 0x20, 0xAF, 0x60, 0x00, 0xC0, 0xE0, 0x0D, 0xAF, 0x44, 0x00, + 0xC1, 0xE0, 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x56, 0xE0, 0x03, 0xAE, + 0x1B, 0xAF, 0x44, 0x00, 0xC1, 0xE0, 0x2E, 0xE4, 0x44, 0x00, 0xC1, 0xE0, + 0x2E, 0xE4, 0x07, 0xA8, 0x39, 0xF0, 0x05, 0xA1, 0x07, 0xA8, 0x1B, 0xAF, + 0x2E, 0xE4, 0x01, 0xA2, 0x2E, 0xE4, 0x13, 0xA2, 0x02, 0xA8, 0x20, 0xAF, + 0x44, 0x00, 0xC0, 0xE0, 0x60, 0xA8, 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, + 0x3E, 0xA8, 0x61, 0x00, 0xC0, 0xE0, 0x2A, 0xE4, 0x00, 0xE0, 0x18, 0xE0, + 0x88, 0xC7, 0xA4, 0xCC, 0xC2, 0xE0, 0x02, 0xA2, 0x9E, 0xE0, 0x00, 0x05, + 0x02, 0xA8, 0x20, 0x04, 0xC0, 0xE0, 0x0D, 0x04, 0x04, 0xAF, 0xA4, 0x11, + 0x1E, 0xE4, 0xDA, 0xF7, 0xB9, 0x11, 0x1E, 0xE4, 0xB1, 0x11, 0x1E, 0xE4, + 0x1E, 0xE4, 0x1E, 0xA8, 0xEF, 0x11, 0x0B, 0xE4, 0x20, 0xAE, 0x56, 0xE0, + 0x09, 0xAE, 0xBE, 0x11, 0xFF, 0x1F, 0x09, 0xE0, 0x6E, 0x00, 0xC1, 0xE0, + 0x4F, 0x12, 0x1E, 0xE4, 0x17, 0x9F, 0x56, 0xE0, 0x22, 0xD0, 0x62, 0x00, + 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x00, 0x12, 0x84, 0xE1, 0x02, 0x00, + 0x22, 0xD0, 0x7A, 0x00, 0x64, 0xE1, 0x17, 0x9F, 0x14, 0x9E, 0x08, 0x12, + 0x84, 0xE1, 0x02, 0x00, 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, + 0x41, 0x00, 0xC0, 0xE0, 0xEC, 0x3C, 0x2E, 0xE4, 0x42, 0xE0, 0x11, 0xAE, + 0x20, 0x00, 0x05, 0xE0, 0x00, 0xE0, 0x5E, 0xF8, 0xD0, 0x03, 0x11, 0xD1, + 0x20, 0xCE, 0x40, 0x0B, 0x11, 0xD1, 0x80, 0x01, 0x13, 0x01, 0xEC, 0x88, + 0xC0, 0x00, 0x12, 0xD1, 0x70, 0x28, 0x2E, 0xE4, 0xF9, 0xF7, 0x29, 0xCA, + 0x24, 0xE4, 0x02, 0xA1, 0x32, 0x28, 0x94, 0xE0, 0x1E, 0xE4, 0x0C, 0xC4, + 0x49, 0xE0, 0x92, 0xE0, 0xA4, 0xCC, 0x8E, 0xF7, 0x82, 0xE0, 0x2F, 0x12, + 0xD0, 0x03, 0x00, 0xE0, 0x18, 0xE0, 0x86, 0xC7, 0x9C, 0xE0, 0x70, 0x07, + 0x00, 0xE0, 0x9A, 0xE0, 0x9F, 0xE0, 0x00, 0x05, 0x01, 0xE0, 0x07, 0xAE, + 0x1E, 0xE4, 0x04, 0xAF, 0xA8, 0x11, 0x1E, 0xE4, 0x42, 0xE0, 0x85, 0xE0, + 0x20, 0xAE, 0xB1, 0x11, 0x17, 0x9F, 0x4B, 0x12, 0x1E, 0xE4, 0x17, 0x9F, + 0x50, 0x20, 0x2E, 0xE4, 0x5A, 0x12, 0x1E, 0xE4, 0x50, 0x20, 0x2E, 0xE4, + 0x08, 0xAE, 0x51, 0x4C, 0x23, 0xA8, 0x60, 0x00, 0xC1, 0xE0, 0x51, 0x4C, + 0x50, 0x4C, 0x51, 0x20, 0x39, 0xF0, 0x23, 0xA1, 0xC2, 0xE0, 0x02, 0xA2, + 0x2E, 0xE4, 0x08, 0xAE, 0xC0, 0xE0, 0x0E, 0x04, 0xC2, 0xE0, 0x0D, 0x04, + 0x22, 0xD0, 0xDA, 0xF7, 0x02, 0xA8, 0x20, 0x04, 0x15, 0x21, 0x69, 0x12, + 0x84, 0xE1, 0x02, 0x00, 0x02, 0x00, 0x22, 0xD0, 0x17, 0x9F, 0x15, 0x4D, + 0x16, 0x4D, 0x16, 0x21, 0x70, 0x12, 0x84, 0xE1, 0x0D, 0x04, 0xC2, 0xE0, + 0x00, 0xA2, 0x17, 0x9F, 0x20, 0xAF, 0x44, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, + 0x60, 0x00, 0xC0, 0xE0, 0x28, 0xE4, 0x02, 0xA8, 0x0D, 0x04, 0xC3, 0xE0, + 0x03, 0xA2, 0x3E, 0xA8, 0x00, 0xE0, 0x18, 0xE0, 0x88, 0xC7, 0xA4, 0xCC, + 0x20, 0x04, 0xC1, 0xE0, 0x9E, 0xE0, 0x00, 0x05, 0x64, 0x00, 0xC0, 0xE0, + 0xDB, 0xF7, 0x03, 0xA8, 0xB1, 0x11, 0x1E, 0xE4, 0x02, 0xA8, 0x24, 0xAF, + 0x99, 0x12, 0x0B, 0xE4, 0xB9, 0x11, 0x1E, 0xE4, 0x09, 0xAE, 0xBE, 0x11, + 0x1E, 0xE4, 0x1E, 0xA8, 0x61, 0x00, 0xC1, 0xE0, 0x20, 0xAE, 0x56, 0xE0, + 0x17, 0x9F, 0x56, 0xE0, 0xFF, 0x1F, 0x09, 0xE0, 0x48, 0xF0, 0x02, 0xA8, + 0x64, 0x00, 0xC0, 0xE0, 0x51, 0x20, 0x3E, 0xF0, 0x51, 0x4C, 0x50, 0x20, + 0xC0, 0xE0, 0x17, 0x9F, 0x08, 0xAE, 0x50, 0x4C, 0x6B, 0x00, 0xC0, 0xE0, + 0x17, 0x9F, 0x6A, 0x00, 0x17, 0x9F, 0x6C, 0x00, 0xC0, 0xE0, 0x17, 0x9F, + 0xC0, 0xE0, 0x17, 0x9F, 0x7A, 0x00, 0xC0, 0xE0, 0x7C, 0x00, 0xC0, 0xE0, + 0x17, 0x9F, 0x7B, 0x00, 0x0D, 0x04, 0xC3, 0xE0, 0x01, 0xA2, 0x17, 0x9F, + 0x7A, 0x3C, 0x90, 0x01, 0x04, 0xE0, 0x2E, 0xE4, 0xDE, 0x4C, 0x04, 0xAE, + 0x02, 0xA2, 0x2E, 0xE4, 0x15, 0xA1, 0x50, 0x2A, 0xDC, 0x4C, 0x08, 0xAE, + 0x80, 0x01, 0xC2, 0xE0, 0x06, 0xA9, 0x21, 0xF0, 0xC2, 0xE0, 0x03, 0x29, + 0x63, 0x08, 0x63, 0xE1, 0x85, 0x01, 0xC2, 0xE0, 0xDD, 0x28, 0x81, 0x01, + 0xC2, 0xE0, 0x02, 0xA2, 0xFA, 0xF1, 0x28, 0x28, 0x1E, 0xA1, 0x3D, 0x28, + 0x01, 0xA2, 0x7A, 0x01, 0x04, 0xAE, 0x03, 0x3C, 0x48, 0xA5, 0x00, 0xA4, + 0x17, 0x81, 0x9E, 0xE0, 0x50, 0x02, 0x00, 0xE0, 0x8A, 0x01, 0xC2, 0xE0, + 0x00, 0xA2, 0x17, 0x81, 0x8C, 0x01, 0xC2, 0xE0, 0x8B, 0x01, 0xC2, 0xE0, + 0x88, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x17, 0x81, 0x89, 0x01, 0xC2, 0xE0, + 0x7A, 0x4C, 0x00, 0xA2, 0x40, 0x2A, 0x7E, 0xA8, 0x35, 0x28, 0x2E, 0xE4, + 0x40, 0x2A, 0x6B, 0xF0, 0x7B, 0x2A, 0x1B, 0xF1, 0xAE, 0xF0, 0x56, 0xE0, + 0x11, 0xAE, 0x03, 0xAA, 0x11, 0xAE, 0x05, 0xA2, 0x5B, 0xF0, 0x7C, 0x2A, + 0x11, 0xAE, 0x40, 0x2A, 0x4E, 0xF0, 0x56, 0xE0, 0x2E, 0xE4, 0x84, 0x01, + 0xC2, 0xE0, 0x56, 0xE0, 0x48, 0xA5, 0x00, 0xA4, 0x1E, 0xA1, 0x06, 0x28, + 0x06, 0x29, 0x9C, 0xE0, 0x60, 0x03, 0x00, 0xE0, 0x81, 0x28, 0x2E, 0xE4, + 0x8D, 0x01, 0xC2, 0xE0, 0x22, 0xF0, 0x46, 0xE0, 0x0A, 0x00, 0x05, 0xE0, + 0x48, 0xF0, 0x04, 0xA1, 0x15, 0x28, 0x81, 0x3E, 0x00, 0xA2, 0x81, 0x3E, + 0xD0, 0x07, 0x05, 0xE0, 0x8A, 0xF0, 0x08, 0xA1, 0x15, 0x28, 0xC4, 0x3C, + 0x46, 0xE0, 0xC8, 0x00, 0x05, 0xE0, 0x81, 0x28, 0x1E, 0xE4, 0xC4, 0x3C, + 0x02, 0xA2, 0x32, 0xF0, 0x64, 0xE1, 0x12, 0x08, 0x63, 0xE1, 0x31, 0x1C, + 0x04, 0x3D, 0x03, 0x35, 0x00, 0xA2, 0x13, 0x08, 0x08, 0xE0, 0x17, 0x7C, + 0x10, 0xC7, 0x16, 0x2C, 0x88, 0x3C, 0x02, 0xAF, 0x02, 0xA0, 0xFF, 0xFF, + 0x14, 0x2A, 0x5B, 0xF0, 0x40, 0x2A, 0x14, 0x28, 0x91, 0x3C, 0x02, 0xAE, + 0x27, 0xF0, 0x03, 0xA1, 0x02, 0x1B, 0x1E, 0xE4, 0xDC, 0x1A, 0x1E, 0xE4, + 0x1E, 0xE4, 0x39, 0xF0, 0x7F, 0x2A, 0x80, 0x28, 0x1E, 0xE4, 0x04, 0xA0, + 0x8A, 0x3C, 0x3E, 0x1A, 0x63, 0xE1, 0x02, 0xA2, 0xAB, 0x3C, 0x6E, 0x1C, + 0x08, 0x3E, 0x03, 0xA1, 0x51, 0x2A, 0x10, 0x05, 0x73, 0x1A, 0x1E, 0xE4, + 0x13, 0x3D, 0x08, 0x86, 0x90, 0x28, 0x74, 0x13, 0x18, 0xE4, 0xC4, 0x28, + 0x00, 0xA2, 0x8F, 0x3C, 0x00, 0xA2, 0x38, 0xF0, 0x02, 0xA2, 0x03, 0x3D, + 0x16, 0x08, 0x63, 0xE1, 0x2E, 0xE4, 0x03, 0x3D, 0x14, 0x08, 0x63, 0xE1, + 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, 0x51, 0x28, 0x00, 0xA2, 0x04, 0x3D, + 0x1E, 0x08, 0x64, 0xE1, 0xC8, 0x3C, 0xC7, 0x3C, 0xC5, 0x3C, 0xC6, 0x3C, + 0x2B, 0xF0, 0x40, 0x2A, 0x88, 0x28, 0x81, 0x84, 0x18, 0xE0, 0xF7, 0x1C, + 0x1E, 0xE4, 0x02, 0xAE, 0x05, 0xE0, 0xF7, 0x1C, 0x1E, 0xE4, 0x04, 0x85, + 0x49, 0xE0, 0xB5, 0x1C, 0x1E, 0xE4, 0xE8, 0x03, 0x61, 0xE0, 0x04, 0xA2, + 0x72, 0xF1, 0x04, 0x19, 0xC6, 0x7C, 0x0F, 0xC7, 0x04, 0x29, 0xC6, 0x3E, + 0xC5, 0x3C, 0x02, 0xA0, 0xFF, 0xFF, 0x08, 0xE0, 0x39, 0x3C, 0x18, 0xE0, + 0x50, 0x82, 0xC6, 0x84, 0x37, 0x3C, 0x02, 0xA2, 0x8A, 0x3C, 0x66, 0xA2, + 0x6E, 0xF0, 0x3B, 0x06, 0x1E, 0xE4, 0x38, 0x3C, 0x1E, 0xE4, 0x38, 0x3C, + 0x37, 0x3C, 0x00, 0xA2, 0x99, 0x3C, 0x98, 0x3C, 0x00, 0xA2, 0x3B, 0x06, + 0x64, 0xE1, 0x2E, 0xE4, 0x89, 0x3C, 0x02, 0xA2, 0x1E, 0xE4, 0x1F, 0xA2, + 0x91, 0x28, 0x68, 0x08, 0x63, 0xE1, 0x8A, 0x28, 0x08, 0x3C, 0xB5, 0x1C, + 0x63, 0xE1, 0xB9, 0xF0, 0x03, 0x2B, 0x14, 0x08, 0x1E, 0xE4, 0x04, 0x29, + 0x03, 0x2B, 0x47, 0x08, 0x69, 0x08, 0x63, 0xE1, 0x08, 0x18, 0xB5, 0x1C, + 0x62, 0xE0, 0x19, 0xA2, 0xAE, 0x3C, 0x03, 0x19, 0x00, 0xA2, 0xAE, 0x3C, + 0x66, 0xE0, 0x67, 0xA2, 0xED, 0x1B, 0x1A, 0xE4, 0xC4, 0x28, 0x04, 0x3D, + 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, 0x51, 0x28, 0x2E, 0xE4, 0x03, 0x3D, + 0x1E, 0x08, 0x63, 0xE1, 0x9B, 0x4C, 0x9A, 0x24, 0x48, 0xF0, 0xC6, 0x28, + 0xC6, 0x84, 0x9B, 0x4C, 0x9A, 0x24, 0xBE, 0xF0, 0x1E, 0x08, 0x64, 0xE1, + 0xF7, 0x1C, 0x1E, 0xE4, 0x65, 0xE1, 0xB5, 0x1C, 0x1E, 0xE4, 0x04, 0x2B, + 0x05, 0x35, 0x3A, 0x08, 0x66, 0xE1, 0x39, 0x08, 0xA2, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x06, 0x3D, 0x9E, 0x3C, 0x95, 0x3C, 0x94, 0x3C, 0xA3, 0x3C, + 0xA8, 0x3C, 0xA7, 0x3C, 0xA6, 0x3C, 0x9F, 0x3C, 0x18, 0x08, 0x62, 0xE1, + 0x92, 0x3C, 0xA9, 0x3C, 0x48, 0x08, 0x64, 0xE1, 0x19, 0x08, 0x63, 0xE1, + 0x5F, 0x3C, 0x04, 0x3D, 0x03, 0x3D, 0x02, 0x3D, 0x4A, 0x08, 0x65, 0xE1, + 0xC1, 0x3C, 0xC2, 0x3C, 0x50, 0x28, 0x0B, 0x3C, 0xFE, 0xA2, 0x05, 0x3D, + 0xC4, 0x28, 0xA7, 0x19, 0x1E, 0xE4, 0x0A, 0x3C, 0x00, 0xA2, 0xDC, 0x13, + 0x1E, 0xE4, 0x3A, 0xF0, 0x3D, 0x08, 0x62, 0xE1, 0xC8, 0x3C, 0xC7, 0x34, + 0x3F, 0x08, 0x64, 0xE1, 0x3E, 0x08, 0x63, 0xE1, 0x42, 0x08, 0x66, 0xE1, + 0x44, 0x08, 0x65, 0xE1, 0x03, 0x3D, 0x02, 0x3D, 0x43, 0x08, 0x67, 0xE1, + 0x07, 0x3D, 0x06, 0x3D, 0x05, 0x3D, 0x04, 0x3D, 0x76, 0x01, 0xC2, 0xE0, + 0x58, 0x01, 0xC2, 0xE0, 0x90, 0x01, 0x04, 0xE0, 0x40, 0x08, 0x64, 0xE1, + 0x28, 0x28, 0x89, 0x01, 0xC2, 0xE0, 0x04, 0x3D, 0x1E, 0xE4, 0x03, 0x3D, + 0x17, 0x08, 0x63, 0xE1, 0x5A, 0xF0, 0x08, 0xA1, 0x15, 0x28, 0x2F, 0x1B, + 0x65, 0x14, 0x0E, 0xE4, 0x5D, 0x1B, 0x1E, 0xE4, 0x8E, 0x3C, 0x8D, 0x34, + 0x73, 0x00, 0xC0, 0xE0, 0x99, 0x3C, 0x98, 0x34, 0x72, 0x00, 0xC0, 0xE0, + 0x7E, 0xA8, 0x18, 0xAF, 0x75, 0x00, 0xC0, 0xE0, 0x4A, 0x08, 0x65, 0xE1, + 0x3D, 0x3C, 0x5C, 0x3C, 0x05, 0x31, 0x24, 0xAF, 0x75, 0x00, 0xC0, 0xE0, + 0x7E, 0xA8, 0x28, 0xAF, 0x75, 0x00, 0xC0, 0xE0, 0x7F, 0xA8, 0x35, 0xAF, + 0x75, 0x00, 0xC1, 0xE0, 0x6B, 0x2A, 0x87, 0x3C, 0x56, 0xE0, 0x11, 0xAE, + 0x9C, 0x20, 0x7B, 0xF1, 0x6B, 0x2A, 0x18, 0xF0, 0xCC, 0x1C, 0x1E, 0xE4, + 0x54, 0x2A, 0x9D, 0x4C, 0x49, 0xE0, 0x75, 0x00, 0xC0, 0xE0, 0xB7, 0x3C, + 0x0C, 0xAF, 0x4A, 0xE0, 0xB6, 0x3C, 0x7E, 0xA8, 0x5C, 0x28, 0x4A, 0xE0, + 0xB5, 0x3C, 0x7E, 0xA8, 0x03, 0x19, 0x6C, 0x08, 0x63, 0xE1, 0x3D, 0x3C, + 0x9C, 0x04, 0x99, 0x4C, 0x98, 0x24, 0x6E, 0x3C, 0xBA, 0x34, 0x9B, 0x1C, + 0x9A, 0x14, 0x9D, 0x0C, 0xB0, 0x34, 0x00, 0xA2, 0x23, 0xF0, 0xBA, 0x2A, + 0x15, 0x2A, 0x8E, 0x4C, 0x8D, 0x24, 0xB1, 0x3C, 0xBA, 0x3E, 0x0F, 0xA2, + 0x79, 0xF0, 0x09, 0xA1, 0x06, 0xAF, 0xF7, 0x1C, 0x1E, 0xE4, 0xBA, 0x84, + 0xB1, 0x1C, 0xB0, 0x14, 0xBD, 0x3C, 0xBC, 0x34, 0xBC, 0x24, 0x52, 0xF0, + 0xBA, 0x28, 0xBA, 0x34, 0x5C, 0x28, 0xB1, 0x3C, 0xB0, 0x34, 0xBD, 0x4C, + 0x8D, 0x24, 0x9A, 0xF0, 0x6B, 0x28, 0xB9, 0x3C, 0x9E, 0x34, 0xB1, 0x1C, + 0xB0, 0x14, 0x8E, 0x4C, 0xAB, 0x28, 0xB9, 0x3C, 0x00, 0xA2, 0x9F, 0x3C, + 0x06, 0xA0, 0xAB, 0x28, 0x84, 0x3C, 0x06, 0xA1, 0x45, 0xE0, 0xAB, 0x2A, + 0x8A, 0x28, 0x85, 0x3C, 0x8A, 0x28, 0x85, 0x3C, 0x06, 0xA0, 0x33, 0xF0, + 0x06, 0xA1, 0x37, 0xF0, 0x45, 0xE0, 0xAB, 0x2A, 0x4A, 0x08, 0x65, 0xE1, + 0x5C, 0x28, 0x84, 0x3C, 0x14, 0x08, 0x63, 0xE1, 0x2E, 0xE4, 0x05, 0x2B, + 0x62, 0xE1, 0x03, 0x3D, 0x00, 0xA2, 0x03, 0x29, 0xC2, 0xE0, 0x02, 0x4D, + 0x12, 0x25, 0x18, 0x08, 0x12, 0x35, 0x37, 0x08, 0x62, 0xE1, 0x63, 0x00, + 0xAA, 0x1A, 0x1B, 0xE4, 0xC4, 0x2A, 0x02, 0x3D, 0xA3, 0x4C, 0xA2, 0x24, + 0xA8, 0xF0, 0x72, 0x28, 0xFF, 0xFF, 0x08, 0xE0, 0x54, 0x7C, 0x10, 0xC7, + 0xAB, 0x28, 0xAB, 0x3C, 0x02, 0xAF, 0x02, 0xA0, 0x66, 0xE0, 0x67, 0xA2, + 0x62, 0xE0, 0x19, 0xA2, 0x03, 0x29, 0x68, 0x08, 0x63, 0xE1, 0xAB, 0x3C, + 0x02, 0xAE, 0xAB, 0x28, 0x03, 0x3D, 0xAB, 0x08, 0xC4, 0x28, 0x2E, 0xE4, + 0x62, 0x00, 0xC2, 0xE0, 0x94, 0x3C, 0x00, 0xA2, 0x7D, 0x15, 0x0A, 0xE4, + 0xA4, 0x3C, 0x9F, 0x3C, 0x9E, 0x3C, 0x95, 0x3C, 0x61, 0xE1, 0xA7, 0x3C, + 0xA6, 0x3C, 0xA5, 0x3C, 0x67, 0xE1, 0x45, 0x08, 0x62, 0xE1, 0x3C, 0x08, + 0x07, 0x3D, 0x02, 0x3D, 0x01, 0x3D, 0x46, 0x08, 0x03, 0x3D, 0x14, 0xA2, + 0x3B, 0x08, 0x63, 0xE1, 0x02, 0xA0, 0x1A, 0x28, 0x5A, 0xF2, 0xC6, 0x28, + 0x63, 0xE1, 0x39, 0x08, 0x62, 0xE1, 0xC5, 0x18, 0x03, 0x4D, 0x02, 0x21, + 0xB4, 0xF0, 0x3A, 0x08, 0x9A, 0x22, 0xF7, 0x1C, 0x1E, 0xE4, 0x1A, 0x84, + 0x03, 0x3F, 0x02, 0x37, 0x45, 0xE0, 0x9B, 0x4E, 0x8D, 0x22, 0x7A, 0xF0, + 0x99, 0x4C, 0x98, 0x20, 0x4A, 0xE0, 0x45, 0xE0, 0x03, 0xAF, 0x8E, 0x4E, + 0x08, 0xAF, 0x8E, 0x4C, 0x8D, 0x20, 0x6E, 0xF0, 0x03, 0x4F, 0x02, 0x23, + 0x02, 0xA0, 0x14, 0xE0, 0x9D, 0x4C, 0x9C, 0x20, 0x2E, 0xF1, 0x42, 0xE0, + 0x9A, 0x26, 0x46, 0xE0, 0x09, 0xAF, 0x49, 0xE0, 0x9C, 0x24, 0x44, 0xF0, + 0x46, 0xE0, 0x9B, 0x4E, 0x9D, 0x4C, 0x9C, 0x24, 0x6E, 0xF0, 0x9D, 0x4C, + 0x22, 0xF0, 0x46, 0xE0, 0x09, 0xAF, 0x49, 0xE0, 0x01, 0xA2, 0xC8, 0x3C, + 0xC7, 0x34, 0x00, 0xA2, 0x8A, 0xF0, 0x10, 0xAF, 0xC8, 0x4C, 0xC7, 0x24, + 0x13, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0x93, 0x3E, 0x23, 0xA2, + 0x2A, 0xF0, 0x10, 0xAF, 0x79, 0xF0, 0xC6, 0x2A, 0x1E, 0x08, 0x65, 0xE1, + 0x02, 0xA1, 0x05, 0x29, 0x07, 0x3C, 0x00, 0xA2, 0x1A, 0x2A, 0x00, 0xA2, + 0xEE, 0xF0, 0x08, 0x3C, 0x18, 0xE0, 0x1A, 0x82, 0xC6, 0x84, 0x4B, 0xF0, + 0x66, 0xE0, 0x05, 0x2B, 0xC6, 0x08, 0x07, 0x3C, 0x04, 0xE0, 0x08, 0x3C, + 0x07, 0x18, 0x02, 0xA1, 0x00, 0xA2, 0x98, 0xE0, 0x07, 0x0C, 0x10, 0x05, + 0xA5, 0x3C, 0xA4, 0x34, 0x14, 0x0D, 0x08, 0x86, 0x10, 0xAF, 0xA5, 0x4C, + 0xA4, 0x20, 0x01, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0x8A, 0xF0, + 0x23, 0xA2, 0x2A, 0xF0, 0x10, 0xAF, 0x13, 0xA2, 0x2E, 0xE4, 0x90, 0xE1, + 0x90, 0xE1, 0xB4, 0x3E, 0xC6, 0x2A, 0x49, 0xF0, 0x99, 0x4E, 0x98, 0x22, + 0x39, 0x08, 0x64, 0xE1, 0x7E, 0xF0, 0x2B, 0xF0, 0x05, 0x1D, 0x04, 0x15, + 0x3A, 0x08, 0x65, 0xE1, 0x99, 0x3C, 0x98, 0x34, 0x99, 0x0C, 0x98, 0x04, + 0x46, 0xE0, 0x8E, 0x4E, 0x8D, 0x22, 0xB4, 0xF0, 0x8E, 0x4E, 0x8D, 0x22, + 0x2E, 0xE4, 0x20, 0xF0, 0x14, 0xE0, 0x2E, 0xE4, 0x99, 0x3E, 0x98, 0x36, + 0x2F, 0x28, 0x08, 0x3C, 0x07, 0x34, 0x02, 0xA0, 0x19, 0xA2, 0x2F, 0x3C, + 0x00, 0xA2, 0x09, 0x3C, 0x09, 0x28, 0x2D, 0x20, 0x1E, 0xE4, 0x30, 0x3E, + 0x1E, 0xE4, 0x08, 0x4C, 0x07, 0x24, 0x2F, 0x3C, 0x10, 0xA2, 0x57, 0x20, + 0x1E, 0xE4, 0x8A, 0x1A, 0x00, 0xA2, 0x2E, 0xE4, 0x99, 0x3C, 0x98, 0x34, + 0x9A, 0xC8, 0x2B, 0xE4, 0x99, 0x4E, 0x98, 0x22, 0x65, 0xE1, 0x39, 0x08, + 0x64, 0xE1, 0x41, 0xE0, 0x00, 0xA2, 0x05, 0x1F, 0x04, 0x13, 0x3A, 0x08, + 0x4A, 0xE0, 0x13, 0xA0, 0x15, 0xE0, 0x23, 0xE4, 0x18, 0x08, 0x62, 0xE1, + 0x9A, 0xC8, 0x2E, 0xE4, 0x03, 0x0D, 0x02, 0x01, 0x19, 0x08, 0x63, 0xE1, + 0x4A, 0xF0, 0xC4, 0x28, 0x03, 0x3D, 0x02, 0x35, 0x90, 0xE1, 0x80, 0x15, + 0x1E, 0xE4, 0x9A, 0xC8, 0x28, 0x28, 0xBF, 0x3C, 0x8B, 0x28, 0x2E, 0xE4, + 0xBF, 0x28, 0xBF, 0x3C, 0x8C, 0x28, 0x3A, 0xF0, 0x62, 0xE0, 0x07, 0xA1, + 0x3D, 0x2A, 0x10, 0xAF, 0x3D, 0x1A, 0x7F, 0xA8, 0x11, 0xAF, 0x87, 0x2A, + 0xBE, 0x3C, 0x10, 0xAE, 0x62, 0xE0, 0x13, 0xE0, 0xBF, 0x2A, 0x3D, 0x08, + 0x7E, 0xA8, 0x87, 0x28, 0xBE, 0x28, 0x65, 0xE0, 0xFF, 0x00, 0x09, 0xE0, + 0x95, 0x4C, 0x94, 0x24, 0xBF, 0x3C, 0x56, 0xE0, 0xA9, 0x3C, 0xA8, 0x34, + 0xA1, 0x1C, 0xA0, 0x10, 0x3D, 0x18, 0x7E, 0xA8, 0xBF, 0x28, 0x14, 0xF2, + 0xB0, 0x16, 0x8E, 0x4E, 0x8D, 0x26, 0xBE, 0x3C, 0xBD, 0x3E, 0xBC, 0x36, + 0x0D, 0xAF, 0xB1, 0x1E, 0x0C, 0xAF, 0xA9, 0x4C, 0xA8, 0x20, 0xEB, 0xF0, + 0xBC, 0x22, 0xF7, 0x1C, 0x1E, 0xE4, 0xBE, 0x84, 0x08, 0xE0, 0xCC, 0x1C, + 0x1E, 0xE4, 0xBD, 0x4E, 0x3D, 0x2A, 0xBE, 0x28, 0x2E, 0xF0, 0xFF, 0xFF, + 0x66, 0xE0, 0x7F, 0xA8, 0xBF, 0x2A, 0x42, 0xE0, 0x3D, 0x28, 0x11, 0xAF, + 0xBF, 0x2A, 0xFE, 0xF1, 0xB1, 0x4E, 0xB0, 0x26, 0xBE, 0x3C, 0x46, 0xE0, + 0xEB, 0xF0, 0xBD, 0x3E, 0xBC, 0x36, 0x0D, 0xAF, 0x02, 0xA0, 0x14, 0xE0, + 0xA9, 0x4C, 0xA8, 0x20, 0xF7, 0x1C, 0x1E, 0xE4, 0xBE, 0x84, 0x0C, 0xAF, + 0xCC, 0x1C, 0x1E, 0xE4, 0xBD, 0x4E, 0xBC, 0x22, 0x45, 0xE0, 0x3D, 0x2A, + 0xBE, 0x28, 0x2E, 0xF0, 0xB9, 0x3C, 0x62, 0xE0, 0x10, 0xAF, 0xBF, 0x28, + 0xCA, 0xF0, 0xC6, 0x28, 0x2E, 0xE4, 0x5C, 0x3C, 0xC6, 0x7C, 0x0F, 0xC7, + 0xAA, 0xF0, 0x0B, 0x28, 0x3B, 0x08, 0x63, 0xE1, 0x68, 0xF0, 0x20, 0xAF, + 0xA8, 0x20, 0x2E, 0xE4, 0x03, 0x3D, 0x14, 0xA2, 0x94, 0x24, 0xBD, 0x3C, + 0xBC, 0x34, 0xA9, 0x4C, 0xA8, 0x34, 0xA1, 0x1C, 0xA0, 0x10, 0x95, 0x4C, + 0x06, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, 0xA9, 0x3C, 0xAA, 0xF0, 0xC6, 0x28, + 0xBF, 0x3C, 0xBE, 0x34, 0xC5, 0x18, 0x07, 0x3C, 0x02, 0xA0, 0x1A, 0x28, + 0x18, 0xE0, 0x07, 0x82, 0xC6, 0x84, 0x5A, 0xF0, 0x04, 0x29, 0x1E, 0x08, + 0x64, 0xE1, 0x4E, 0xF0, 0xB8, 0x4C, 0xB7, 0x20, 0x07, 0x3C, 0x0B, 0x18, + 0xBF, 0x1C, 0xBE, 0x14, 0xC8, 0x1C, 0xC7, 0x10, 0xA8, 0x20, 0x8E, 0x16, + 0x0E, 0xE4, 0x30, 0xF0, 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, + 0x44, 0xF0, 0x46, 0xE0, 0x03, 0xAF, 0xB6, 0x4E, 0xA8, 0x20, 0xB9, 0x3C, + 0xB9, 0x08, 0x02, 0xA2, 0x9E, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, + 0x03, 0xAE, 0xA1, 0x1E, 0xA0, 0x12, 0x9F, 0x4E, 0x3E, 0xF0, 0x00, 0xA2, + 0x30, 0xF0, 0x46, 0xE0, 0xB9, 0x3C, 0xB9, 0x08, 0x1E, 0xF0, 0x06, 0xA2, + 0xC8, 0x4C, 0xC7, 0x20, 0xD1, 0x16, 0x0E, 0xE4, 0xBF, 0x1C, 0xBE, 0x10, + 0xB8, 0x1C, 0xB7, 0x10, 0xA9, 0x4C, 0xA8, 0x20, 0xD1, 0x16, 0x06, 0xE4, + 0xD1, 0x16, 0x02, 0xE4, 0xBD, 0x1C, 0xBC, 0x10, 0x28, 0x28, 0x4A, 0xF0, + 0x02, 0xA1, 0x91, 0x28, 0xA9, 0x4C, 0xA8, 0x20, 0x88, 0xF2, 0x02, 0xA1, + 0x9F, 0x4E, 0x9E, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0x46, 0xE0, 0x03, 0xAF, + 0xA1, 0x1E, 0xA0, 0x12, 0x63, 0xE1, 0x02, 0xA2, 0xB9, 0x16, 0x02, 0xE4, + 0x02, 0xA0, 0x29, 0xF0, 0x03, 0x2B, 0x14, 0x08, 0x0E, 0xE4, 0xB9, 0x3E, + 0x45, 0xE0, 0xB9, 0x2A, 0xB9, 0x28, 0x68, 0xF0, 0x91, 0x28, 0xD1, 0x16, + 0xD1, 0x16, 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA1, 0x46, 0xE0, 0x0B, 0xA1, + 0xAB, 0x2A, 0xB9, 0x28, 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, 0xD6, 0xF0, + 0x0B, 0xA1, 0xAB, 0x2A, 0xB9, 0x28, 0x9E, 0xF0, 0x02, 0xA1, 0xB9, 0x28, + 0x46, 0xF0, 0x46, 0xE0, 0x07, 0x28, 0x3B, 0x08, 0x63, 0xE1, 0xB9, 0x3C, + 0x07, 0x84, 0x4E, 0xF0, 0x02, 0xA2, 0x38, 0xF0, 0xC7, 0x24, 0x08, 0x3C, + 0x18, 0xE0, 0x50, 0x82, 0x08, 0x2A, 0x95, 0x1C, 0x94, 0x10, 0xC8, 0x4C, + 0x17, 0xAE, 0x03, 0xA2, 0xB5, 0x1C, 0x1E, 0xE4, 0x8E, 0x4E, 0x8D, 0x26, + 0x03, 0x3D, 0x66, 0xE0, 0x66, 0xA2, 0x43, 0xF0, 0x41, 0xE0, 0x05, 0xAF, + 0xB9, 0x28, 0x42, 0xF0, 0x5E, 0xF0, 0xB9, 0x3C, 0xAB, 0x2A, 0xB9, 0x28, + 0xB9, 0x3C, 0x06, 0xA0, 0x66, 0xE0, 0x67, 0xA2, 0x62, 0xE0, 0x0B, 0xA1, + 0xA9, 0x4C, 0xA8, 0x20, 0x2E, 0xE4, 0xB9, 0x3C, 0x95, 0x4C, 0x94, 0x24, + 0xBD, 0x3C, 0xBC, 0x34, 0xA9, 0x3C, 0xA8, 0x34, 0xA1, 0x1C, 0xA0, 0x10, + 0xBE, 0x34, 0x06, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, 0x12, 0x25, 0x37, 0x08, + 0x62, 0xE1, 0xBF, 0x3C, 0xBB, 0x3C, 0xBA, 0x34, 0x08, 0xAF, 0x02, 0x4D, + 0x46, 0xE0, 0x09, 0xAF, 0x9D, 0x4E, 0x9C, 0x26, 0x94, 0x24, 0xBB, 0x3E, + 0xBA, 0x36, 0x36, 0xF0, 0x26, 0xE4, 0xBB, 0x1C, 0xBA, 0x14, 0x95, 0x4C, + 0x80, 0x17, 0x08, 0xE4, 0x02, 0xA1, 0x15, 0x28, 0x99, 0x1C, 0x98, 0x10, + 0x8E, 0x4C, 0x8D, 0x24, 0xB8, 0x4C, 0xB7, 0x24, 0xBB, 0x3C, 0xBA, 0x34, + 0xBF, 0x1C, 0xBE, 0x14, 0x9D, 0x1C, 0x9C, 0x14, 0x49, 0xE0, 0xBB, 0x4C, + 0xBA, 0x24, 0x40, 0xF1, 0x9D, 0x1E, 0x9C, 0x16, 0xB8, 0x1C, 0xB7, 0x14, + 0x8D, 0x24, 0xA4, 0xF0, 0x46, 0xE0, 0x03, 0xAF, 0xB8, 0x0C, 0xB7, 0x00, + 0x0E, 0xAF, 0x8E, 0x4C, 0x0E, 0xF1, 0x20, 0xF0, 0xBB, 0x1C, 0xBA, 0x10, + 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0xA8, 0x20, 0x46, 0xE0, 0x03, 0xAF, + 0xB6, 0x4E, 0xB5, 0x22, 0x02, 0xA0, 0xB9, 0x28, 0xDA, 0x17, 0x04, 0xE4, + 0x9C, 0x24, 0xDA, 0x17, 0x0E, 0xE4, 0xB9, 0x3C, 0xBE, 0x14, 0xB8, 0x1C, + 0xB7, 0x14, 0x9D, 0x4C, 0xA8, 0x20, 0xDA, 0x17, 0x06, 0xE4, 0xBF, 0x1C, + 0x02, 0xE4, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0x4A, 0xF0, 0x02, 0xA1, + 0x91, 0x28, 0xDA, 0x17, 0x91, 0x28, 0x38, 0xF1, 0x02, 0xA1, 0x28, 0x28, + 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, 0x68, 0xF0, 0xAE, 0x2A, 0xB9, 0x28, + 0xDA, 0x17, 0x0E, 0xE4, 0xDA, 0x17, 0x06, 0xE4, 0x46, 0xE0, 0x0B, 0xA1, + 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, 0x03, 0xA1, 0xAB, 0x2A, + 0xB9, 0x28, 0xDA, 0x17, 0xB9, 0x28, 0xDA, 0x17, 0x06, 0xE4, 0x46, 0xE0, + 0xDA, 0x17, 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA1, 0x9D, 0x1C, 0x9C, 0x14, + 0xB8, 0x4C, 0xB7, 0x24, 0xA8, 0x20, 0xA6, 0xF2, 0xBF, 0x1C, 0xBE, 0x14, + 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0x04, 0xE4, 0x46, 0xE0, + 0x03, 0xAF, 0xB6, 0x4E, 0xAA, 0xF0, 0x02, 0xA1, 0x91, 0x28, 0xDA, 0x17, + 0x91, 0x2A, 0x18, 0xF1, 0x02, 0xA1, 0x28, 0x28, 0x88, 0x1A, 0x03, 0xAF, + 0x2A, 0xF0, 0x40, 0x28, 0x08, 0xA1, 0xAB, 0x1C, 0xB9, 0x28, 0xB1, 0xF0, + 0x02, 0xA0, 0xB9, 0x28, 0xDA, 0x17, 0x02, 0xE4, 0xB9, 0x28, 0xDA, 0x17, + 0x0E, 0xE4, 0xB9, 0x3C, 0xB9, 0x28, 0x02, 0xF3, 0x08, 0xA1, 0xAB, 0x1C, + 0xDA, 0x17, 0x0E, 0xE4, 0xB9, 0x3C, 0x02, 0xA0, 0x9D, 0x1C, 0x9C, 0x14, + 0xB8, 0x4C, 0xB7, 0x24, 0xA8, 0x20, 0x42, 0xF2, 0xBF, 0x0C, 0xBE, 0x04, + 0xB5, 0x22, 0xBD, 0x1C, 0xBC, 0x10, 0xA9, 0x4C, 0xB2, 0xF1, 0x42, 0xE0, + 0x03, 0xAF, 0xB6, 0x4E, 0x28, 0x28, 0x5A, 0xF0, 0x02, 0xA1, 0x91, 0x28, + 0xB9, 0x28, 0xDE, 0xF0, 0x2A, 0xF0, 0x02, 0xA1, 0xB9, 0x28, 0x06, 0xF1, + 0x0E, 0xA0, 0xAE, 0x1C, 0xB9, 0x28, 0xC6, 0xF0, 0x08, 0xA0, 0xAB, 0x1C, + 0xB9, 0x28, 0x8E, 0xF0, 0xB9, 0x3C, 0x02, 0xA1, 0xB9, 0x28, 0x46, 0xF0, + 0x02, 0xA0, 0xAB, 0x1C, 0x84, 0x2A, 0xB9, 0x28, 0xB9, 0x3C, 0x02, 0xA1, + 0xB9, 0x3C, 0x66, 0xE0, 0x85, 0x2A, 0x62, 0xE0, 0xC6, 0x28, 0x3C, 0x08, + 0x63, 0xE1, 0x2E, 0xE4, 0x0F, 0xC7, 0xEA, 0xF0, 0x0B, 0x28, 0x0A, 0xF1, + 0x0B, 0x28, 0xA8, 0xF0, 0x20, 0xAF, 0xC6, 0x7C, 0x02, 0xA2, 0x46, 0x08, + 0x62, 0xE1, 0x5A, 0xF0, 0x2E, 0xE4, 0x03, 0x3D, 0x00, 0xA2, 0x02, 0x3D, + 0x8E, 0x4C, 0x8D, 0x24, 0xD8, 0xF0, 0x28, 0x28, 0x95, 0x1E, 0x94, 0x12, + 0x49, 0xE0, 0x06, 0xAF, 0x04, 0xA2, 0xD3, 0xF0, 0xC8, 0x0E, 0xC7, 0x02, + 0x8E, 0x4C, 0x8D, 0x24, 0x2E, 0xE4, 0x03, 0x3D, 0x95, 0x1E, 0x94, 0x12, + 0x49, 0xE0, 0x04, 0xAF, 0x00, 0xA2, 0x45, 0xF0, 0xC8, 0x0E, 0xC7, 0x02, + 0x03, 0x3D, 0x06, 0xA2, 0x2E, 0xE4, 0x03, 0x3D, 0x08, 0x3E, 0x07, 0x3E, + 0x01, 0xA2, 0x2E, 0xE4, 0x04, 0xE0, 0xFA, 0xF0, 0x04, 0xA1, 0x09, 0x3E, + 0xFF, 0xFF, 0x00, 0xE0, 0x20, 0xAE, 0xFF, 0xFF, 0x04, 0xA2, 0x07, 0x3C, + 0x06, 0xA2, 0x08, 0x3C, 0x14, 0x01, 0xC2, 0xE0, 0x00, 0xA2, 0x09, 0x3C, + 0x06, 0xA2, 0x08, 0x3C, 0x7A, 0x28, 0x6E, 0xF1, 0x06, 0xA2, 0x09, 0x3C, + 0x04, 0xA2, 0x07, 0x3C, 0xC2, 0xE0, 0x00, 0xA2, 0x14, 0x01, 0xC2, 0xE0, + 0x20, 0xAE, 0x22, 0x22, 0x04, 0xE0, 0x23, 0x01, 0x22, 0x01, 0xC2, 0xE0, + 0x22, 0x22, 0x0A, 0xE0, 0x3D, 0x08, 0x62, 0xE1, 0x21, 0x01, 0xC2, 0xE0, + 0x3F, 0x08, 0x64, 0xE1, 0x3E, 0x08, 0x63, 0xE1, 0x03, 0x29, 0x58, 0x01, + 0xC2, 0xE0, 0x04, 0x29, 0x07, 0x28, 0x03, 0x3D, 0x02, 0x29, 0x04, 0x3D, + 0x03, 0x29, 0x40, 0x08, 0x63, 0xE1, 0x02, 0x3D, 0x03, 0x3D, 0x08, 0x28, + 0x89, 0x01, 0xC2, 0xE0, 0x43, 0x08, 0x63, 0xE1, 0x42, 0x08, 0x62, 0xE1, + 0x02, 0x29, 0x76, 0x01, 0xC2, 0xE0, 0x03, 0x29, 0x2E, 0xE4, 0x02, 0x3D, + 0x09, 0x28, 0x03, 0x3D, 0x3E, 0x08, 0x63, 0xE1, 0x3D, 0x08, 0x62, 0xE1, + 0xC2, 0xE0, 0x04, 0x29, 0x3F, 0x08, 0x64, 0xE1, 0x02, 0x29, 0x04, 0x3D, + 0x03, 0x29, 0x58, 0x01, 0x62, 0xE1, 0x02, 0x3D, 0x00, 0xA2, 0x03, 0x3D, + 0x03, 0x29, 0x43, 0x08, 0x63, 0xE1, 0x42, 0x08, 0x03, 0x3D, 0x02, 0x29, + 0x76, 0x01, 0xC2, 0xE0, 0x40, 0x08, 0x63, 0xE1, 0x02, 0x3D, 0x00, 0xA2, + 0x7A, 0x28, 0x89, 0x01, 0xC2, 0xE0, 0x03, 0x29, 0x66, 0x08, 0x65, 0xE1, + 0x2E, 0xE4, 0x03, 0x3D, 0x6F, 0x1B, 0x1E, 0xE4, 0x2A, 0xE4, 0x05, 0x29, + 0x1E, 0xE4, 0x48, 0xF0, 0x08, 0xA1, 0x15, 0x28, 0x6A, 0xF0, 0xC4, 0x28, + 0x2E, 0xE4, 0xD5, 0x15, 0xE1, 0x17, 0x1E, 0xE4, 0x3A, 0x16, 0x1E, 0xE4, + 0x2E, 0xE4, 0xFA, 0x16, 0x1E, 0xE4, 0x2E, 0xE4, 0xB6, 0x84, 0x02, 0xF1, + 0xA9, 0x4C, 0xA8, 0x20, 0xB0, 0x26, 0x12, 0xE0, 0xF7, 0x1C, 0x1E, 0xE4, + 0x1E, 0xE4, 0x03, 0xA2, 0x29, 0xF0, 0xB1, 0x4E, 0x13, 0xE0, 0xB6, 0x2A, + 0x12, 0xE0, 0xCC, 0x1C, 0x1E, 0xE4, 0xB5, 0x84, 0xCE, 0xF0, 0x62, 0xE0, + 0x29, 0xF0, 0x9F, 0x4E, 0x9E, 0x26, 0xF7, 0x1C, 0xB5, 0x2A, 0xCC, 0x1C, + 0x1E, 0xE4, 0x03, 0xA2, 0x54, 0x2C, 0x2E, 0xE4, 0xB9, 0x3C, 0x66, 0xE0, + 0x0A, 0x28, 0xC9, 0x18, 0x06, 0xE4, 0x92, 0x1C, 0x05, 0x29, 0x66, 0x08, + 0x65, 0xE1, 0x68, 0xF0, 0xB9, 0x08, 0x5C, 0x28, 0x94, 0x18, 0x18, 0xE4, + 0x5C, 0x3C, 0x6E, 0x1C, 0x1E, 0xE4, 0x5C, 0x3C, 0xA2, 0x34, 0xA3, 0x0C, + 0xA2, 0x04, 0x06, 0x3C, 0x92, 0x3C, 0x02, 0xA0, 0x92, 0x2C, 0xA3, 0x3C, + 0x90, 0x7C, 0x0F, 0xC7, 0x92, 0x2C, 0x2E, 0xE4, 0x03, 0x3D, 0x48, 0x08, + 0x63, 0xE1, 0x20, 0xAF, 0x45, 0xE0, 0x50, 0x2E, 0x02, 0xA0, 0x0A, 0x28, + 0x48, 0xF0, 0x0A, 0x3C, 0x00, 0xA2, 0x29, 0xF0, 0x54, 0x2C, 0x0B, 0x3C, + 0x02, 0xA0, 0x0B, 0x28, 0x15, 0x28, 0x40, 0x19, 0x06, 0xE4, 0x92, 0x1C, + 0x0A, 0x28, 0x00, 0x19, 0x08, 0xE4, 0x08, 0xA1, 0x5C, 0x3C, 0xB9, 0x28, + 0x7E, 0x18, 0x1A, 0xE4, 0x5C, 0x28, 0xCB, 0x1B, 0x18, 0xE4, 0x1D, 0x28, + 0x63, 0xE1, 0x5C, 0x3C, 0x6E, 0x1C, 0x1E, 0xE4, 0x26, 0x08, 0x63, 0xE1, + 0x03, 0x3D, 0x27, 0x08, 0xA3, 0x0C, 0xA2, 0x04, 0xB9, 0x28, 0x03, 0x3D, + 0x40, 0x19, 0x0E, 0xE4, 0xA3, 0x3C, 0xA2, 0x34, 0x0A, 0xF3, 0x28, 0x28, + 0x3A, 0xF0, 0x7F, 0x28, 0x1A, 0xE4, 0x0A, 0x28, 0xEA, 0xF0, 0xC4, 0x28, + 0x02, 0x29, 0x46, 0x08, 0x62, 0xE1, 0x7E, 0x18, 0x63, 0xE1, 0x5C, 0x18, + 0x1E, 0xE4, 0x3A, 0xF0, 0xC4, 0x28, 0xC8, 0xF1, 0x03, 0x29, 0x3C, 0x08, + 0x6E, 0xF0, 0x28, 0xF0, 0xC6, 0x28, 0x4A, 0xF0, 0x08, 0xE4, 0x03, 0x29, + 0x14, 0x08, 0x63, 0xE1, 0x0A, 0x28, 0x48, 0xF0, 0xC4, 0x28, 0x30, 0x19, + 0x06, 0xA1, 0x8F, 0x28, 0x7E, 0x18, 0x1A, 0xE4, 0x03, 0x29, 0x48, 0x08, + 0x63, 0xE1, 0x58, 0xF0, 0x1E, 0xE4, 0x4A, 0xF0, 0x1D, 0x28, 0x88, 0xF0, + 0x5C, 0x3C, 0xB9, 0x28, 0x3E, 0xF0, 0xCB, 0x1B, 0x1E, 0xE4, 0x91, 0x19, + 0x18, 0xE4, 0xC4, 0x28, 0x6E, 0x1C, 0x1E, 0xE4, 0x5C, 0x28, 0x7A, 0x1C, + 0xB9, 0x28, 0xA0, 0x1C, 0x1E, 0xE4, 0x5C, 0x3C, 0xA3, 0x3C, 0xA2, 0x34, + 0xA3, 0x0C, 0xA2, 0x04, 0x03, 0x29, 0x92, 0x3C, 0x02, 0xA0, 0x92, 0x2C, + 0x55, 0x2A, 0xAA, 0xF0, 0x6B, 0x28, 0x2E, 0xE4, 0xA9, 0x4C, 0xA8, 0x20, + 0x75, 0xF0, 0x05, 0xA1, 0xA9, 0x3C, 0xA8, 0x34, 0xB7, 0x18, 0x5F, 0x08, + 0x94, 0x34, 0x5F, 0x0C, 0x95, 0x4C, 0x94, 0x24, 0x06, 0xA0, 0x54, 0x2C, + 0x2E, 0xE4, 0x95, 0x3C, 0xC0, 0xE0, 0x90, 0x19, 0x06, 0xE4, 0x92, 0x1C, + 0xC1, 0x3C, 0x02, 0xA0, 0xC1, 0x28, 0x73, 0x01, 0x8A, 0xF1, 0xC4, 0x28, + 0x28, 0xE4, 0x50, 0x18, 0x88, 0xF0, 0x06, 0x29, 0x45, 0x08, 0x66, 0xE1, + 0x0A, 0xF1, 0x05, 0x29, 0x3C, 0x08, 0x65, 0xE1, 0x04, 0xE0, 0xDE, 0xF0, + 0x06, 0x3D, 0x02, 0xA2, 0x96, 0xE0, 0x02, 0xA1, 0xC2, 0x08, 0x10, 0x05, + 0x98, 0xE0, 0xC2, 0x08, 0x10, 0x05, 0x04, 0xE0, 0x04, 0xE0, 0x1E, 0xF1, + 0x04, 0x3D, 0x03, 0x29, 0xC0, 0xE0, 0x96, 0xE0, 0xC2, 0x08, 0x10, 0x05, + 0x10, 0xAF, 0x80, 0x00, 0x00, 0xE0, 0x72, 0x01, 0x1E, 0xE4, 0x50, 0x2A, + 0xFF, 0xFF, 0x08, 0xE0, 0xC2, 0x28, 0x03, 0x3D, 0x00, 0xA4, 0xB5, 0x1C, + 0xC1, 0x3E, 0x01, 0xA2, 0xC2, 0x3C, 0x02, 0xA0, 0x03, 0xE0, 0x5F, 0x2A, + 0x5C, 0x28, 0x2E, 0xE4, 0x3B, 0x08, 0x65, 0xE1, 0xE7, 0xF0, 0x2C, 0x01, + 0x83, 0xF0, 0x64, 0x00, 0x03, 0xE0, 0x05, 0x2B, 0x66, 0xE0, 0x67, 0xA2, + 0x02, 0xA0, 0xB9, 0x28, 0x67, 0xA2, 0x0C, 0xA0, 0x5C, 0x28, 0xB9, 0x3C, + 0x15, 0x28, 0x2E, 0xE4, 0x5C, 0x3C, 0x66, 0xE0, 0x70, 0x00, 0xC0, 0xE0, + 0x78, 0xF0, 0x08, 0xA1, 0x30, 0x1A, 0x0E, 0xE4, 0x9D, 0x3C, 0x9C, 0x34, + 0x68, 0xF0, 0x28, 0x28, 0x88, 0xF0, 0xC4, 0x28, 0x02, 0x4F, 0x12, 0x27, + 0x10, 0x08, 0x62, 0xE1, 0xBA, 0x36, 0x9B, 0x4E, 0x9A, 0x26, 0x3E, 0xF0, + 0x04, 0xE0, 0x8E, 0x4E, 0x8D, 0x26, 0xBB, 0x3E, 0x46, 0xF0, 0x81, 0x18, + 0x02, 0xAE, 0xC8, 0x00, 0x09, 0xA0, 0x3E, 0xF0, 0x03, 0xAF, 0x03, 0xA0, + 0x46, 0xE0, 0x99, 0x4C, 0x98, 0x20, 0x07, 0xAF, 0x1E, 0xE4, 0x12, 0xE0, + 0x62, 0xF0, 0x89, 0x2A, 0x1E, 0xE4, 0xD6, 0x19, 0x0E, 0xE4, 0xB5, 0x1C, + 0xBB, 0x4E, 0xBA, 0x26, 0x12, 0xE0, 0xB5, 0x1C, 0x90, 0xF0, 0xAB, 0xF0, + 0x28, 0x2A, 0x42, 0xE0, 0x59, 0xF0, 0x05, 0x2B, 0x6D, 0x08, 0x65, 0xE1, + 0x05, 0x3F, 0x4A, 0x08, 0x65, 0xE1, 0x03, 0xA2, 0x9D, 0x3C, 0x9C, 0x34, + 0x00, 0xA2, 0x22, 0xF0, 0xC9, 0xF0, 0xC4, 0x2A, 0xD9, 0xF1, 0x28, 0x2A, + 0x89, 0xF0, 0x03, 0xA1, 0x03, 0xA8, 0x15, 0x2A, 0x99, 0x1E, 0x98, 0x16, + 0x8E, 0x4E, 0x8D, 0x26, 0x65, 0xE1, 0x9D, 0x3C, 0x9C, 0x34, 0x66, 0xE0, + 0x66, 0xE1, 0xCB, 0xF0, 0x05, 0x2B, 0x4B, 0x08, 0x06, 0x25, 0x4D, 0x08, + 0x67, 0xE1, 0x4C, 0x08, 0x66, 0xE0, 0x9D, 0x4E, 0x9C, 0x22, 0x07, 0x4D, + 0x09, 0xE4, 0xC4, 0x2A, 0x9D, 0x3C, 0x9C, 0x34, 0xB9, 0xF1, 0x03, 0xA1, + 0x15, 0x2A, 0x30, 0x1A, 0x99, 0x0C, 0x98, 0x00, 0x9D, 0x4C, 0x9C, 0x20, + 0x62, 0xF0, 0x9B, 0x1C, 0x9A, 0x14, 0x49, 0xE0, 0x9D, 0x3C, 0x9C, 0x34, + 0x9B, 0x4C, 0x9A, 0x24, 0x8D, 0x16, 0x9D, 0x4C, 0x9C, 0x20, 0x9E, 0xF0, + 0x9C, 0x34, 0x46, 0xE0, 0x47, 0xF0, 0x8E, 0x1E, 0x9C, 0x34, 0x62, 0xE0, + 0x03, 0xA2, 0x9D, 0x3C, 0x9D, 0x4C, 0x9C, 0x20, 0xBE, 0xF0, 0x9D, 0x3C, + 0x66, 0xE0, 0x03, 0xAE, 0xBB, 0x4E, 0xBA, 0x26, 0x9D, 0x3C, 0x9C, 0x34, + 0x62, 0xE0, 0x07, 0xAF, 0x10, 0xAF, 0x9D, 0x4C, 0x9C, 0x24, 0x01, 0xA2, + 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0x8A, 0xF0, 0x23, 0xA2, 0x2A, 0xF0, + 0x10, 0xAF, 0x13, 0xA2, 0x40, 0x28, 0x88, 0x2A, 0x2E, 0xE4, 0x93, 0x3E, + 0x91, 0x28, 0x09, 0x3E, 0x03, 0xAE, 0x2A, 0xF0, 0xAE, 0xF0, 0x08, 0x3E, + 0x03, 0xA2, 0x48, 0xF0, 0x08, 0x3E, 0x01, 0xA2, 0x46, 0xF0, 0x09, 0x18, + 0x91, 0x7C, 0x0F, 0xC7, 0x09, 0x28, 0x5E, 0xF0, 0x2A, 0xF0, 0x40, 0x28, + 0x53, 0x2E, 0x08, 0x3C, 0x1E, 0xE4, 0x83, 0x4C, 0x82, 0x20, 0x03, 0xAF, + 0x08, 0x1A, 0x09, 0x2A, 0x14, 0xAE, 0xB5, 0x1C, 0x42, 0xE0, 0x19, 0xE0, + 0x8D, 0xC7, 0xA5, 0xCC, 0x1E, 0xE4, 0x09, 0x0A, 0x08, 0x2A, 0x02, 0xAE, + 0x48, 0xA0, 0x12, 0xE0, 0x0A, 0xAF, 0xB5, 0x1C, 0x82, 0x24, 0x2E, 0xE4, + 0x46, 0xA5, 0x1E, 0xA4, 0xF7, 0x1C, 0x1E, 0xE4, 0x81, 0x84, 0x83, 0x4C, + 0x82, 0x24, 0x2E, 0xE4, 0x8E, 0x3C, 0x8D, 0x34, 0xF7, 0x1C, 0x1E, 0xE4, + 0x81, 0x84, 0x83, 0x4C, 0x04, 0xE0, 0x81, 0x2A, 0x8E, 0x3C, 0x8D, 0x34, + 0x8D, 0x24, 0x45, 0xE0, 0x02, 0xAE, 0xC8, 0x00, 0x02, 0xAF, 0x02, 0xA0, + 0x43, 0xF0, 0x8E, 0x4C, 0x98, 0x34, 0x06, 0xAF, 0x08, 0xA0, 0x3E, 0xF0, + 0x06, 0xAF, 0x08, 0xA0, 0x2E, 0xE4, 0x99, 0x3C, 0xCE, 0xF0, 0xBB, 0x3C, + 0xBA, 0x34, 0x2A, 0xE4, 0xFF, 0xFF, 0x05, 0xE0, 0xBB, 0x3C, 0xBA, 0x34, + 0x9A, 0x1A, 0x84, 0xE1, 0x45, 0xCC, 0x03, 0xA1, 0xBA, 0x24, 0x8E, 0xBA, + 0xFF, 0x00, 0x04, 0xE0, 0x10, 0xF7, 0xFF, 0xFF, 0x02, 0xE0, 0xBB, 0x4C, + 0x45, 0xCC, 0x03, 0xA1, 0xBB, 0x4E, 0xBA, 0x26, 0xFF, 0x00, 0x04, 0xE0, + 0xA8, 0x1A, 0x84, 0xE1, 0x99, 0x0C, 0x98, 0x04, 0x2E, 0xE4, 0x8E, 0xBA, + 0x99, 0x3C, 0x98, 0x34, 0x9B, 0x1C, 0x9A, 0x14, 0x89, 0xF2, 0x03, 0xA1, + 0x03, 0xA8, 0x15, 0x2A, 0x13, 0x08, 0x64, 0xE1, 0x12, 0x08, 0x63, 0xE1, + 0x10, 0xE0, 0x72, 0xF0, 0x99, 0x4C, 0x98, 0x20, 0x98, 0x3E, 0x01, 0xA2, + 0x04, 0x3D, 0x03, 0x35, 0x05, 0x29, 0x49, 0x08, 0x65, 0xE1, 0x99, 0x3E, + 0x4A, 0xF1, 0x04, 0x4D, 0x03, 0x25, 0x7A, 0xF1, 0x2F, 0x3C, 0x00, 0xA2, + 0x09, 0x3C, 0x2F, 0x28, 0x2D, 0x20, 0x1E, 0xE4, 0x30, 0x3E, 0x19, 0xA2, + 0x04, 0x4D, 0x03, 0x25, 0x2F, 0x3C, 0x09, 0x28, 0x57, 0x20, 0x1E, 0xE4, + 0x8A, 0x1A, 0x1E, 0xE4, 0x2E, 0xE4, 0x04, 0x3D, 0x03, 0x35, 0x00, 0xA2, + 0x30, 0x75, 0x82, 0xE1, 0x17, 0x84, 0x16, 0x2E, 0xCC, 0x1C, 0x1E, 0xE4, + 0x02, 0xAE, 0x18, 0xE0, 0x09, 0x3C, 0x10, 0xAF, 0x08, 0x2C, 0x08, 0x3C, + 0x1E, 0xE4, 0x83, 0x4C, 0x82, 0x24, 0x09, 0x84, 0x08, 0x2C, 0x49, 0xE0, + 0x10, 0xAE, 0xF7, 0x1C, 0x09, 0x84, 0x09, 0x3C, 0xFF, 0x00, 0x08, 0xE0, + 0xF7, 0x1C, 0x1E, 0xE4, 0x83, 0x4C, 0x82, 0x24, 0xB5, 0x1C, 0x1E, 0xE4, + 0x79, 0xA2, 0x42, 0xE0, 0x9A, 0x34, 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, + 0x40, 0x28, 0x88, 0x2A, 0x2E, 0xE4, 0x9B, 0x3C, 0xAA, 0xF0, 0x91, 0x28, + 0x03, 0xAE, 0x2A, 0xF0, 0x0F, 0xC7, 0x4A, 0xE0, 0x82, 0xF0, 0x46, 0xE0, + 0x08, 0x3C, 0xFF, 0xFF, 0x08, 0xE0, 0x91, 0x7C, 0x82, 0x24, 0x08, 0x3C, + 0x02, 0xA2, 0x3E, 0xF0, 0x08, 0xE0, 0x08, 0x7C, 0x0F, 0xC7, 0x83, 0x4C, + 0x10, 0x08, 0x62, 0xE1, 0x14, 0xAE, 0xFF, 0xFF, 0x03, 0x3D, 0x02, 0x35, + 0x11, 0x08, 0x63, 0xE1, 0x2B, 0xE4, 0x05, 0x2B, 0x4B, 0x08, 0x65, 0xE1, + 0x4D, 0x08, 0x67, 0xE1, 0x4C, 0x08, 0x66, 0xE1, 0x26, 0xE4, 0x46, 0xE0, + 0x07, 0x4F, 0x06, 0x27, 0x00, 0xA2, 0x2E, 0xE4, 0x03, 0x3F, 0x02, 0x37, + 0x1E, 0x08, 0x64, 0xE1, 0x10, 0x05, 0x63, 0xE1, 0x08, 0x86, 0x08, 0x3E, + 0x03, 0xA1, 0x04, 0x2B, 0x04, 0x2B, 0xA5, 0x3C, 0xA4, 0x34, 0x13, 0x0D, + 0x1E, 0xE4, 0x04, 0x2B, 0x42, 0xE0, 0x03, 0xAF, 0xC8, 0xF0, 0x28, 0x28, + 0xC0, 0x3C, 0xB5, 0x1C, 0x04, 0x2B, 0x10, 0x05, 0x63, 0xE1, 0x02, 0xA2, + 0x13, 0x3D, 0x08, 0x86, 0x08, 0x3E, 0x03, 0xA1, 0x01, 0xA2, 0xA5, 0x3C, + 0xA4, 0x34, 0x04, 0x29, 0x8A, 0xF0, 0x10, 0xAF, 0xA5, 0x4C, 0xA4, 0x20, + 0x13, 0xA2, 0x5A, 0xF0, 0x10, 0xAF, 0x03, 0xA2, 0xB4, 0x3E, 0x23, 0xA2, + 0x2A, 0xF0, 0x10, 0xAF, 0x63, 0xE1, 0xD8, 0xF0, 0x28, 0x28, 0x2E, 0xE4, + 0x8A, 0x28, 0x3A, 0xF0, 0x03, 0x29, 0x14, 0x08, 0x8A, 0x28, 0x3B, 0xF0, + 0x7F, 0x2A, 0x8E, 0xF0, 0xAB, 0x28, 0x2E, 0xF0, 0xAE, 0x28, 0x4E, 0xF0, + 0xC4, 0x28, 0x2E, 0xE4, 0xB9, 0x3C, 0x5C, 0x3C, 0x3E, 0xF0, 0xC8, 0x4C, + 0xC7, 0x24, 0x4A, 0xF0, 0x94, 0x04, 0x49, 0xE0, 0x9D, 0x4C, 0x9C, 0x24, + 0xB7, 0x34, 0x9F, 0x1C, 0x9E, 0x14, 0x95, 0x0C, 0x9E, 0x24, 0x09, 0x3E, + 0x93, 0x5E, 0xB8, 0x3C, 0x04, 0xE0, 0xA1, 0x3C, 0xA0, 0x34, 0x9F, 0x4C, + 0x03, 0x2B, 0x96, 0xE0, 0x0B, 0x0C, 0x10, 0x05, 0xA6, 0x36, 0xA7, 0x0E, + 0xA6, 0x06, 0x4A, 0xE0, 0xA7, 0x4C, 0xA6, 0x24, 0x01, 0xA2, 0xA7, 0x3E, + 0x10, 0xAF, 0x03, 0xA2, 0x8A, 0xF0, 0x10, 0xAF, 0x2A, 0xF0, 0x10, 0xAF, + 0x13, 0xA2, 0x5A, 0xF0, 0xA6, 0x24, 0x09, 0x84, 0x08, 0x3E, 0x23, 0xA2, + 0x09, 0x82, 0x09, 0x3C, 0x08, 0x5C, 0xA7, 0x4C, 0xB4, 0x5E, 0xA5, 0x4E, + 0xA4, 0x26, 0x18, 0xE0, 0x08, 0x1A, 0xB4, 0x2A, 0xB5, 0x1C, 0x1E, 0xE4, + 0x9E, 0x34, 0x93, 0x58, 0x09, 0x5C, 0x09, 0x3E, 0xB5, 0x34, 0xA1, 0x1C, + 0xA0, 0x14, 0x9F, 0x3C, 0x08, 0xA0, 0x55, 0x2C, 0x2E, 0xE4, 0xB6, 0x3C, + 0x4A, 0xE0, 0x46, 0x01, 0xC1, 0xE0, 0xA4, 0xF0, 0x08, 0xE0, 0xBB, 0xF7, + 0x03, 0xA8, 0x0F, 0xAF, 0x24, 0xA1, 0x24, 0xA2, 0x2E, 0xF0, 0x3F, 0x00, + 0x18, 0xE0, 0xAF, 0x82, 0xBB, 0x84, 0xBB, 0x3C, 0xAD, 0x2A, 0x66, 0xE0, + 0xAD, 0x2A, 0x02, 0xAF, 0x04, 0xE0, 0x2E, 0xE4, 0x62, 0xE0, 0x13, 0xE0, + 0xB9, 0x28, 0x39, 0xF0, 0xC4, 0x2A, 0x33, 0x00, 0x08, 0xA0, 0x55, 0x2C, + 0xBA, 0x3C, 0xAD, 0x08, 0x4A, 0xE0, 0x46, 0x01, 0xC1, 0xE0, 0xA4, 0xF0, + 0x08, 0xE0, 0xBB, 0xF7, 0x03, 0xA8, 0x0F, 0xAF, 0x24, 0xA1, 0x24, 0xA2, + 0x2E, 0xF0, 0x3F, 0x00, 0x18, 0xE0, 0xAF, 0x82, 0xBB, 0x84, 0xBB, 0x3C, + 0xAD, 0x1A, 0xB9, 0x2A, 0xB9, 0x08, 0x02, 0xAF, 0x5C, 0x3C, 0x66, 0xE0, + 0xBA, 0x2A, 0x62, 0xE0, 0x03, 0x29, 0x1A, 0x08, 0x63, 0xE1, 0x2E, 0xE4, + 0x49, 0xE0, 0x6A, 0xF0, 0x91, 0x28, 0x18, 0xF1, 0x3E, 0xF0, 0x89, 0x3C, + 0x42, 0xE0, 0x04, 0xAF, 0x02, 0xA1, 0x15, 0x28, 0x89, 0x3C, 0x40, 0xA2, + 0x89, 0x3C, 0x80, 0x00, 0x04, 0xE0, 0x4A, 0xF0, 0x03, 0x29, 0x1B, 0x08, + 0x63, 0xE1, 0x2E, 0xE4, 0x49, 0xE0, 0x8B, 0x28, 0x2E, 0xE4, 0x89, 0x3C, + 0x08, 0xE0, 0x69, 0xF0, 0x00, 0x40, 0x09, 0xE0, 0x56, 0xE0, 0x00, 0x0C, + 0x05, 0xE0, 0xFF, 0x00, 0x59, 0xF0, 0x40, 0x00, 0x09, 0xE0, 0x49, 0xE0, + 0x56, 0xE0, 0x67, 0xA2, 0x00, 0x3F, 0x08, 0xE0, 0x8C, 0x28, 0x8B, 0x3C, + 0x3F, 0x3F, 0x08, 0xE0, 0x69, 0xF0, 0x00, 0x40, 0x09, 0xE0, 0x49, 0xE0, + 0x00, 0x0C, 0x05, 0xE0, 0xFF, 0x00, 0x08, 0xE0, 0x40, 0x00, 0x09, 0xE0, + 0x49, 0xE0, 0x56, 0xE0, 0x67, 0xA2, 0x00, 0x3F, 0x08, 0xE0, 0x59, 0xF0, + 0x8C, 0x3C, 0x3F, 0x3F, 0x08, 0xE0, 0x56, 0xE0, 0x09, 0xE0, 0x49, 0xE0, + 0x8B, 0x28, 0x2E, 0xE4, 0xFF, 0x00, 0x08, 0xE0, 0x69, 0xF0, 0x00, 0x40, + 0x49, 0xE0, 0x56, 0xE0, 0x00, 0x0C, 0x05, 0xE0, 0x08, 0xE0, 0x59, 0xF0, + 0x40, 0x00, 0x09, 0xE0, 0x08, 0xE0, 0x56, 0xE0, 0x67, 0xA2, 0x00, 0x3F, + 0x49, 0xE0, 0x8C, 0x28, 0x8B, 0x3C, 0x3F, 0x3F, 0x08, 0xE0, 0x69, 0xF0, + 0x00, 0x40, 0x09, 0xE0, 0x56, 0xE0, 0x00, 0x0C, 0x05, 0xE0, 0xFF, 0x00, + 0x59, 0xF0, 0x40, 0x00, 0x09, 0xE0, 0x49, 0xE0, 0x56, 0xE0, 0x67, 0xA2, + 0x00, 0x3F, 0x08, 0xE0, 0x87, 0x28, 0x8C, 0x3C, 0x3F, 0x3F, 0x08, 0xE0, + 0x39, 0xF0, 0x00, 0x40, 0x09, 0xE0, 0x49, 0xE0, 0x09, 0xE0, 0x49, 0xE0, + 0xFF, 0x00, 0x08, 0xE0, 0x00, 0x3F, 0x08, 0xE0, 0x59, 0xF0, 0x40, 0x00, + 0x3F, 0x3F, 0x08, 0xE0, 0x56, 0xE0, 0x67, 0xA2, 0x39, 0xF0, 0x28, 0x2A, + 0x2E, 0xE4, 0x87, 0x3C, 0xBB, 0x3E, 0x8C, 0x2A, 0x2E, 0xF0, 0x8B, 0x2A, + 0x7F, 0xA8, 0xBB, 0x2A, 0x62, 0xE0, 0x11, 0xAF, 0xAA, 0x18, 0x5C, 0x28, + 0x2E, 0xE4, 0x66, 0xE0, 0x10, 0xAF, 0x49, 0xE0, 0x87, 0x28, 0x2A, 0xE4, + 0x09, 0x3E, 0x3F, 0x00, 0x09, 0xE0, 0x08, 0x3C, 0xAA, 0x28, 0xF0, 0xF0, + 0xAA, 0x18, 0x5C, 0x28, 0xAA, 0x2A, 0x62, 0xE0, 0x08, 0x2A, 0x5C, 0x18, + 0x09, 0x2A, 0x46, 0xE0, 0xAA, 0x28, 0x45, 0xE0, 0x5C, 0x3E, 0x45, 0xE0, + 0xAA, 0x2A, 0x66, 0xE0, 0xAA, 0x2A, 0x62, 0xE0, 0x08, 0x2A, 0x2E, 0xE4, + 0x66, 0xE0, 0x09, 0x2A, 0xAA, 0x18, 0x42, 0xE0, 0x2E, 0xE4, 0x5C, 0x3E, + 0x41, 0xE0, 0xAA, 0x2A, 0x48, 0x08, 0x63, 0xE1, 0xCA, 0xF0, 0x8F, 0x28, + 0x26, 0x08, 0x63, 0xE1, 0x8A, 0xF0, 0x03, 0x29, 0x03, 0x3D, 0x27, 0x08, + 0x63, 0xE1, 0x03, 0x29, 0x26, 0x08, 0x63, 0xE1, 0x5C, 0x28, 0x2E, 0xE4, + 0x03, 0x3D, 0x27, 0x08, 0x63, 0xE1, 0x03, 0x3D, 0x32, 0xF0, 0x01, 0xA2, + 0xCA, 0x3E, 0x2E, 0xE4, 0xCB, 0x3C, 0xCE, 0x3E, 0x03, 0xA2, 0x12, 0xE0, + 0xCC, 0x3C, 0xCA, 0x7C, 0x0F, 0xC7, 0x20, 0xAF, 0x0F, 0xC7, 0xCB, 0x4C, + 0x20, 0xAE, 0x20, 0xAF, 0xCD, 0x4C, 0xCC, 0x20, 0xCD, 0x3C, 0xCA, 0x7C, + 0x2E, 0xE4, 0x12, 0xE0, 0x2B, 0xE4, 0xCE, 0x2A, 0xCC, 0x3E, 0x01, 0xA2, + 0xCB, 0x3E, 0xCA, 0x36, 0x45, 0xE0, 0xCC, 0x5A, 0xCB, 0x4E, 0xCA, 0x22, + 0xCC, 0x3E, 0x03, 0xA0, 0xCC, 0x2A, 0x61, 0xF0, 0x39, 0xF0, 0xCC, 0x2A, + 0x75, 0xF7, 0x21, 0xA1, 0xCC, 0x3E, 0x03, 0xA1, 0x2E, 0xE4, 0x00, 0xA2, + 0x84, 0xE1, 0xCD, 0x3E, 0x01, 0xA2, 0x45, 0xCC, 0xCD, 0x3E, 0x03, 0xAE, + 0xCD, 0x2A, 0xF4, 0x1C, 0x45, 0xE0, 0xCC, 0x5A, 0xCB, 0x4E, 0xCA, 0x22, + 0xCD, 0x2A, 0x4A, 0xE0, 0x13, 0xE0, 0x61, 0xF0, 0x03, 0xA1, 0xCC, 0x2A, + 0xCD, 0x3E, 0x03, 0xA0, 0x02, 0xAE, 0x2E, 0xE4, 0xCD, 0x28, 0xCC, 0x3E, + 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0xCB, 0x34, 0x1E, 0xAE, 0x18, 0xE0, + 0xCB, 0x82, 0xCA, 0x3C, 0x02, 0xAE, 0x2E, 0xE4, 0x1C, 0xE0, 0xCA, 0x82, + 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0xCB, 0x34, 0x1E, 0xAF, 0x18, 0xE0, + 0xCA, 0x82, 0xCA, 0x3C, 0x02, 0xAE, 0x2E, 0xE4, 0x1C, 0xE0, 0xCB, 0x82, + 0x02, 0xAF, 0xFF, 0xFF, 0x08, 0xE0, 0xCB, 0x34, 0x03, 0xA1, 0x18, 0xE0, + 0xCB, 0x82, 0xCA, 0x3C, 0x1F, 0xA1, 0xCA, 0x82, 0xCC, 0x58, 0xCC, 0x3E, + 0xCC, 0x5E, 0x19, 0xE0, 0xCC, 0x3E, 0x13, 0xE0, 0x55, 0x2A, 0x54, 0x2C, + 0x2E, 0xE4, 0x42, 0xE0, 0xC0, 0xE0, 0xB4, 0xF0, 0x06, 0xA1, 0x46, 0xE0, + 0x28, 0x08, 0x63, 0xE1, 0x8A, 0xF0, 0x1E, 0x01, 0x13, 0x35, 0x02, 0xA0, + 0x0B, 0x4D, 0x13, 0x21, 0x63, 0xE1, 0x8A, 0xF0, 0x84, 0xCB, 0x03, 0x3D, + 0x02, 0xA0, 0x0B, 0x4D, 0x13, 0x21, 0x2A, 0x08, 0x2C, 0x08, 0x63, 0xE1, + 0x03, 0x3D, 0x13, 0x35, 0x13, 0x35, 0x5C, 0x08, 0x0B, 0x4D, 0x13, 0x21, + 0x16, 0x3C, 0x17, 0x34, 0x2E, 0xE4, 0x03, 0x3D, 0x16, 0x2C, 0x17, 0x3C, + 0x02, 0xA0, 0x17, 0x28, 0xFF, 0xFF, 0x08, 0xE0, 0x17, 0x7C, 0x10, 0xC7, + 0x1E, 0xE4, 0x88, 0x3C, 0x02, 0xAF, 0x02, 0xA0, 0x1E, 0xE4, 0x6B, 0x1A, + 0x1E, 0xE4, 0xDC, 0x1A, 0x74, 0x13, 0x18, 0xE4, 0xC4, 0x28, 0x02, 0x1B, + 0x46, 0xE0, 0x14, 0x2A, 0x7E, 0x3C, 0x2E, 0xE4, 0x40, 0x28, 0x7E, 0x2A, + 0x2E, 0xE4, 0x28, 0xF0, 0x46, 0xE0, 0x7D, 0x28, 0x03, 0xAE, 0x2A, 0xF0, + 0x7E, 0x28, 0x7D, 0x3C, 0x00, 0xA2, 0x34, 0xF0, 0x14, 0x2A, 0x5B, 0xF0, + 0x40, 0x2A, 0x14, 0x3C, 0x91, 0x3C, 0x02, 0xAE, 0x27, 0xF0, 0x03, 0xA1, + 0x7D, 0x28, 0x91, 0x2A, 0x2A, 0xE4, 0x15, 0x28, 0x02, 0x1B, 0x1E, 0xE4, + 0x16, 0xF0, 0x45, 0xE0, 0x82, 0x22, 0x2B, 0xE4, 0x15, 0x2A, 0x2E, 0xE4, + 0x82, 0x34, 0x2B, 0xE4, 0x45, 0xE0, 0x83, 0x4E, 0x1E, 0xE4, 0xDC, 0x1A, + 0x1E, 0xE4, 0x83, 0x3C, 0x2E, 0xE4, 0x02, 0x1B, 0x1E, 0xE4, 0x6B, 0x1A, + 0x01, 0xA2, 0x40, 0xF0, 0x2B, 0xE4, 0x15, 0x2A, 0x8A, 0x3C, 0x80, 0x3C, + 0x2E, 0xE4, 0x7F, 0x3E, 0x00, 0xA2, 0x2E, 0xE4, 0x7F, 0x3E, 0x03, 0xA2, + 0x63, 0xE1, 0x4E, 0x3C, 0x4D, 0x3C, 0x4B, 0x3C, 0x02, 0xA2, 0xEA, 0xF0, + 0x03, 0x29, 0x50, 0x08, 0x51, 0x28, 0x1F, 0x3C, 0x00, 0xA2, 0x4A, 0x3C, + 0xA4, 0xCC, 0x02, 0xAF, 0x2B, 0xF0, 0x40, 0x2A, 0xCE, 0xF1, 0x4F, 0x3C, + 0x18, 0xE0, 0x50, 0x82, 0x03, 0xAF, 0x2A, 0xF0, 0x40, 0x28, 0x51, 0x2A, + 0x08, 0x3C, 0x07, 0xAF, 0x06, 0xAF, 0x50, 0x28, 0x18, 0xE0, 0x09, 0x82, + 0x08, 0x84, 0x09, 0x3E, 0x04, 0xA2, 0x32, 0xF0, 0x04, 0xA1, 0x4A, 0x3C, + 0x51, 0x28, 0x1F, 0x3C, 0x02, 0xA2, 0x4A, 0x3C, 0xA4, 0xCC, 0x1B, 0xF0, + 0x40, 0x2A, 0x02, 0xAF, 0x4F, 0x28, 0x4F, 0x3C, 0x18, 0xE0, 0x50, 0x82, + 0x00, 0xA2, 0x4B, 0xF0, 0x40, 0x2A, 0x4C, 0x3C, 0x63, 0xE1, 0x00, 0xA2, + 0x4C, 0x3C, 0x1F, 0x3C, 0x28, 0x28, 0x2E, 0xE4, 0x03, 0x3D, 0x53, 0x08, + 0x40, 0x2A, 0x28, 0xE4, 0x72, 0x28, 0x2A, 0xE4, 0x13, 0x29, 0x52, 0x08, + 0x63, 0xE1, 0x3B, 0xF1, 0x74, 0xF0, 0x54, 0x1C, 0x03, 0x29, 0xFA, 0xF0, + 0x1E, 0x28, 0x4C, 0x3C, 0x4B, 0x3C, 0x00, 0xA2, 0x4B, 0x3C, 0x03, 0x29, + 0x6E, 0xF0, 0x03, 0x3D, 0x40, 0x2A, 0x03, 0x3D, 0x1E, 0x0C, 0x4C, 0x3C, + 0x03, 0x29, 0x50, 0x08, 0x63, 0xE1, 0x69, 0xF0, 0x02, 0xA0, 0x1F, 0x28, + 0x2E, 0xE4, 0x2A, 0xF0, 0x68, 0x28, 0x2E, 0xE4, 0x1F, 0x3C, 0x02, 0xA8, + 0x28, 0xCA, 0x2A, 0xE4, 0x6A, 0x4C, 0x69, 0x4C, 0x20, 0xCE, 0x68, 0x00, + 0xC0, 0xE0, 0xF8, 0xF7, 0x0C, 0x00, 0x12, 0xD1, 0xB0, 0x04, 0x11, 0xD1, + 0xF8, 0xF7, 0x28, 0xCA, 0x03, 0x00, 0x13, 0xD1, 0x6A, 0x4C, 0x69, 0x4C, + 0x68, 0x28, 0x2E, 0xE4, 0x10, 0xC4, 0xB0, 0x04, 0x67, 0xE1, 0x2A, 0xE4, + 0x53, 0x2C, 0x17, 0x3D, 0x10, 0xAE, 0x68, 0x28, 0x12, 0xAE, 0x69, 0x28, + 0x37, 0x81, 0x17, 0x3D, 0x17, 0x3D, 0x56, 0xE0, 0x17, 0xE0, 0x31, 0x2A, + 0x37, 0x81, 0x17, 0x3D, 0x04, 0xAE, 0x53, 0x2C, 0x65, 0xE0, 0x1A, 0x2C, + 0xFF, 0x00, 0x05, 0xE0, 0x17, 0x3D, 0x56, 0xE0, 0x14, 0xAE, 0x6A, 0x28, + 0x66, 0xE0, 0x1A, 0x2C, 0xFF, 0x1F, 0x05, 0xE0, 0xF8, 0xF7, 0x28, 0xCA, + 0x17, 0x3D, 0x06, 0xAE, 0x11, 0xD1, 0x20, 0xCE, 0x68, 0x00, 0xC0, 0xE0, + 0x13, 0xD1, 0x0C, 0x00, 0x12, 0xD1, 0xB0, 0x04, 0x2E, 0xE4, 0xF8, 0xF7, + 0x28, 0xCA, 0x02, 0x00, 0x00, 0xE0, 0x02, 0xAE, 0x06, 0xA8, 0x55, 0x28, + 0x09, 0xA8, 0x89, 0xCB, 0x9E, 0xE0, 0xA0, 0x04, 0xB9, 0xF0, 0x00, 0xA2, + 0x1F, 0xAE, 0x1B, 0xE0, 0x92, 0xE0, 0x00, 0x02, 0x00, 0xE0, 0xE0, 0x28, + 0x21, 0xAF, 0x49, 0xE0, 0x11, 0x4D, 0x11, 0x21, 0x17, 0x3D, 0x17, 0x3F, + 0xFF, 0x7F, 0x09, 0xE0, 0x08, 0x3C, 0x06, 0xA1, 0x06, 0xA8, 0x55, 0x28, + 0x2A, 0xE4, 0x08, 0x28, 0x63, 0x1E, 0x1A, 0xE4, 0x55, 0x2A, 0x2A, 0xF0, + 0x55, 0x2E, 0x5D, 0x28, 0x28, 0xE4, 0x02, 0xA1, 0x46, 0xE0, 0x54, 0x2C, + 0x67, 0xE1, 0x2E, 0xE4, 0x63, 0x1E, 0x1E, 0xE4, 0x55, 0x2E, 0x17, 0x4D, + 0x17, 0x21, 0xB8, 0x04, 0x40, 0x2A, 0x42, 0xE0, 0x09, 0xAE, 0x05, 0xAF, + 0x07, 0xA0, 0x54, 0x2E, 0x69, 0xF0, 0x07, 0xA1, 0x20, 0xCE, 0x42, 0xE0, + 0x0B, 0xAE, 0x07, 0xAF, 0xA0, 0x04, 0x11, 0xD1, 0x08, 0x00, 0x12, 0xD1, + 0xF8, 0xF7, 0x28, 0xCA, 0x02, 0x00, 0x13, 0xD1, 0x0E, 0xA8, 0x02, 0xA1, + 0x55, 0x2C, 0x2E, 0xE4, 0x9E, 0xE0, 0xA8, 0x04, 0x00, 0xE0, 0x02, 0xAF, + 0x67, 0x2A, 0x3F, 0x00, 0x08, 0xE0, 0x90, 0xCB, 0x03, 0xA1, 0x55, 0x2E, + 0x56, 0xE0, 0x0D, 0xAE, 0x07, 0x3D, 0x10, 0xAE, 0x49, 0xF0, 0x03, 0xA8, + 0x00, 0xFF, 0x09, 0xE0, 0x07, 0x2B, 0x6E, 0xF0, 0x02, 0xA1, 0x55, 0x2C, + 0x07, 0x3D, 0x56, 0xE0, 0x9D, 0x1E, 0x1A, 0xE4, 0x0E, 0xA1, 0x0E, 0xA8, + 0x0E, 0xA1, 0x02, 0xA1, 0x55, 0x2C, 0x2E, 0xE4, 0x17, 0x4F, 0x17, 0x23, + 0xB3, 0x04, 0x67, 0xE1, 0x69, 0xF0, 0x07, 0xA1, 0x40, 0x2A, 0x42, 0xE0, + 0x07, 0xAE, 0x07, 0xAF, 0x0F, 0xA0, 0x54, 0x2E, 0xA8, 0x04, 0x11, 0xD1, + 0x20, 0xCE, 0x42, 0xE0, 0x02, 0x00, 0x13, 0xD1, 0x04, 0x00, 0x12, 0xD1, + 0x00, 0xA2, 0x2E, 0xE4, 0xF8, 0xF7, 0x28, 0xCA, 0x60, 0x00, 0xC0, 0xE0, + 0xFB, 0x3C, 0xFA, 0x3C, 0x79, 0x3C, 0x78, 0x34, 0x45, 0x3C, 0x44, 0x34, + 0x46, 0x34, 0x04, 0xAE, 0x61, 0x00, 0xC0, 0xE0, 0x2E, 0xE4, 0xD8, 0x1E, + 0x1E, 0xE4, 0x47, 0x3C, 0x00, 0x00, 0x34, 0xD0, 0x00, 0x00, 0x30, 0xD0, + 0x00, 0x00, 0x35, 0xD0, 0x00, 0x00, 0x33, 0xD0, 0x80, 0x00, 0x37, 0xD0, + 0xFF, 0x00, 0x36, 0xD0, 0x70, 0xE4, 0x2E, 0xE4, 0x00, 0x00, 0x38, 0xD0, + 0xFB, 0x4E, 0xFA, 0x26, 0x45, 0x4C, 0x44, 0x20, 0x49, 0x00, 0xC2, 0xE0, + 0x42, 0xE0, 0x11, 0xAE, 0x71, 0xD0, 0x2E, 0xE4, 0x79, 0x3C, 0x78, 0x34, + 0xD3, 0x34, 0x00, 0xA2, 0x81, 0xE1, 0x2A, 0x24, 0xF6, 0x3C, 0x00, 0x02, + 0x04, 0xE0, 0xD4, 0x3C, 0x1E, 0xE4, 0xB3, 0x1F, 0x1E, 0xE4, 0xF9, 0x3C, + 0x1E, 0xE4, 0xEC, 0x1F, 0x1E, 0xE4, 0xCF, 0x1F, 0x2E, 0xE4, 0x1B, 0x20, + 0x1E, 0xE4, 0x10, 0x20, 0x26, 0x1F, 0x1E, 0xE4, 0xF9, 0xF7, 0x29, 0xCA, + 0x3C, 0xAF, 0x48, 0xCA, 0x42, 0x1F, 0x1E, 0xE4, 0xF7, 0x3C, 0x02, 0xA2, + 0x5A, 0xF0, 0x02, 0xA8, 0x38, 0xAF, 0x48, 0xCA, 0x48, 0xCE, 0x3C, 0xAE, + 0x14, 0x1F, 0x1E, 0xE4, 0xAA, 0xF0, 0x02, 0xA8, 0x38, 0xAE, 0x02, 0xA2, + 0x10, 0x20, 0x1E, 0xE4, 0x70, 0xE4, 0x1B, 0x20, 0x1E, 0xE4, 0x48, 0xCE, + 0x45, 0x4E, 0x44, 0x26, 0x79, 0x4C, 0x78, 0x24, 0x11, 0xAE, 0x47, 0x4E, + 0x46, 0x26, 0x46, 0xE0, 0x45, 0xE0, 0xF6, 0x28, 0x25, 0xE4, 0x45, 0xE0, + 0x2E, 0xE4, 0xF9, 0x3E, 0x41, 0xE0, 0x43, 0xF0, 0xF9, 0x28, 0x55, 0xCA, + 0x2E, 0xE4, 0xF9, 0x3C, 0x4E, 0xF0, 0xAA, 0xCE, 0x00, 0xA2, 0x48, 0xF0, + 0x78, 0x24, 0x45, 0xE0, 0xD4, 0x4C, 0xD3, 0x20, 0x79, 0x3C, 0x78, 0x34, + 0x42, 0xE0, 0x79, 0x4C, 0xD4, 0x4C, 0xD3, 0x24, 0x2A, 0xE4, 0xF9, 0x28, + 0xF9, 0x2A, 0xD4, 0x3C, 0xD3, 0x34, 0x42, 0xE0, 0xD3, 0x34, 0x00, 0xA2, + 0x28, 0xE4, 0x46, 0xE0, 0x49, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, 0xD4, 0x3C, + 0x45, 0x4E, 0x44, 0x26, 0x79, 0x4C, 0x78, 0x24, 0xFA, 0x34, 0x10, 0xAF, + 0x49, 0xE0, 0x46, 0xE0, 0x10, 0xAE, 0x47, 0x4C, 0x46, 0x24, 0xFB, 0x3C, + 0xFA, 0xF1, 0xD0, 0x28, 0x85, 0xF2, 0x45, 0xE0, 0x78, 0x24, 0x74, 0x00, + 0xC2, 0xE0, 0x02, 0xA2, 0xD2, 0x2A, 0x49, 0x00, 0xC2, 0xE0, 0x79, 0x4C, + 0x08, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, 0x6B, 0xF1, 0x5D, 0x00, 0xC0, 0xE0, + 0x1A, 0xF1, 0x00, 0x80, 0x5D, 0x00, 0xC2, 0xE0, 0x00, 0x80, 0x0A, 0xE0, + 0x5D, 0x00, 0xC1, 0xE0, 0x00, 0xCE, 0x02, 0xA2, 0xC0, 0xE0, 0xC9, 0xF7, + 0x00, 0x80, 0x09, 0xE0, 0xFA, 0x34, 0x00, 0xA2, 0x98, 0xF7, 0x04, 0x00, + 0x78, 0x36, 0x45, 0x4E, 0x44, 0x26, 0xFB, 0x3C, 0xC3, 0xE0, 0x79, 0x4E, + 0x78, 0x26, 0x79, 0x3E, 0x27, 0xD0, 0x28, 0xE4, 0xD0, 0x28, 0x49, 0x00, + 0x27, 0xD0, 0x86, 0x1F, 0x1E, 0xE4, 0x00, 0x00, 0x48, 0x00, 0xC0, 0xE0, + 0x2E, 0xE4, 0x01, 0x00, 0x57, 0x4C, 0x56, 0x24, 0x57, 0x3C, 0x56, 0x34, + 0x57, 0x3E, 0x56, 0x36, 0x49, 0x00, 0xC1, 0xE0, 0x50, 0xF0, 0x46, 0xE0, + 0x57, 0x4E, 0x56, 0x26, 0x42, 0xE0, 0x11, 0xAE, 0x47, 0x4E, 0x46, 0x26, + 0x20, 0xE4, 0x46, 0xE0, 0x00, 0x02, 0x05, 0xE0, 0x5C, 0x00, 0xC0, 0xE0, + 0x98, 0xF6, 0x49, 0x28, 0xC0, 0xE0, 0x4A, 0xF6, 0x00, 0x80, 0x08, 0xE0, + 0xC2, 0xE0, 0x00, 0x80, 0x0A, 0xE0, 0x5D, 0x00, 0x49, 0x3C, 0x00, 0xCE, + 0x02, 0xA2, 0x5D, 0x00, 0x00, 0x80, 0x09, 0xE0, 0x5D, 0x00, 0xC1, 0xE0, + 0x20, 0xA2, 0x2E, 0xE4, 0x5E, 0xF5, 0xC9, 0xF7, 0x56, 0xE0, 0x03, 0xA2, + 0x56, 0xE0, 0x0D, 0xA2, 0x00, 0x00, 0x30, 0xD0, 0x9E, 0xCC, 0x20, 0xAE, + 0x00, 0x00, 0x34, 0xD0, 0x00, 0x00, 0x33, 0xD0, 0xFF, 0x00, 0x36, 0xD0, + 0x00, 0x00, 0x35, 0xD0, 0x00, 0x00, 0x38, 0xD0, 0x80, 0x00, 0x37, 0xD0, + 0x00, 0x00, 0x46, 0xD0, 0x00, 0x00, 0x39, 0xD0, 0xC0, 0xE0, 0x2E, 0xE4, + 0x00, 0x00, 0x47, 0xD0, 0x02, 0xA2, 0xD2, 0x30, 0x0C, 0xAF, 0x43, 0x00, + 0x07, 0xA8, 0x43, 0x00, 0xC1, 0xE0, 0x0E, 0xAE, 0x22, 0xA2, 0x4E, 0xCE, + 0x56, 0xE0, 0x09, 0xAE, 0x56, 0xE0, 0x37, 0xAE, 0x17, 0xA2, 0x28, 0xAE, + 0x06, 0xA2, 0x54, 0xCE, 0x00, 0xA2, 0x4C, 0xCE, 0x56, 0xE0, 0x03, 0x00, + 0x05, 0xE0, 0x38, 0xAE, 0x2E, 0xE4, 0x58, 0xCE, 0x00, 0xA2, 0x4A, 0xCE, + 0x4A, 0xF0, 0x10, 0xA1, 0x5B, 0x00, 0xC0, 0xE0, 0x04, 0xE0, 0x2E, 0xE4, + 0x5A, 0xF0, 0x06, 0xA1, 0x20, 0x00, 0x04, 0xE0, 0x3E, 0xF0, 0x38, 0x00, + 0x05, 0xE0, 0x56, 0xE0, 0x80, 0x00, 0x05, 0xE0, 0x08, 0xA2, 0xC0, 0xCE, + 0x56, 0xE0, 0x00, 0x18, 0x9E, 0xCE, 0x92, 0xCE, 0x00, 0xA2, 0xC8, 0xCE, + 0xD6, 0xCE, 0xD0, 0xCE, 0x8A, 0xCE, 0x88, 0xCE, 0x9C, 0xCE, 0x02, 0xA2, + 0xC6, 0xCE, 0xA4, 0xCE, 0x2E, 0xE4, 0x96, 0xCE, 0x00, 0x02, 0x04, 0xE0, + 0x56, 0xE0, 0x11, 0xAE, 0xF9, 0x2A, 0x06, 0xA2, 0x5C, 0xCE, 0x79, 0x4C, + 0x78, 0x24, 0x5A, 0xCE, 0x04, 0xE0, 0x2E, 0xE4, 0x5E, 0xCE, 0x00, 0xA2, + 0x03, 0x00, 0x05, 0xE0, 0x20, 0xAE, 0x00, 0x0F, 0x56, 0xE0, 0x30, 0x00, + 0x05, 0xE0, 0x56, 0xE0, 0x4B, 0xF0, 0x03, 0xA8, 0x21, 0xAF, 0x49, 0xCA, + 0x4A, 0xCE, 0x56, 0xE0, 0x2F, 0xAE, 0x03, 0xA2, 0x72, 0xCC, 0x50, 0xA0, + 0x72, 0xC8, 0x2E, 0xE4, 0x00, 0xA2, 0x4C, 0x20, 0x1E, 0xE4, 0x00, 0xA2, + 0x1E, 0xE4, 0x00, 0xA2, 0x4C, 0x20, 0x1E, 0xE4, 0x4C, 0x20, 0x1E, 0xE4, + 0x02, 0xA2, 0x4C, 0x20, 0x2F, 0x28, 0xAA, 0xCE, 0x96, 0xCE, 0x00, 0xA2, + 0x4C, 0x20, 0x1E, 0xE4, 0x30, 0x4C, 0x0A, 0xAE, 0x92, 0xCE, 0x00, 0xA2, + 0xC8, 0x1E, 0x1E, 0xE4, 0x2E, 0xE4, 0xF9, 0xF7, 0x9B, 0xCA, 0x2E, 0xE4, + 0x2E, 0xE4, 0xC4, 0xCE, 0x49, 0x20, 0x1E, 0xE4, 0x4C, 0xCA, 0xE8, 0xF7, + 0x02, 0xA8, 0x48, 0xCA, 0x1E, 0xE4, 0x2E, 0xE4, 0xEA, 0xF7, 0x02, 0xA8, + 0x00, 0xA2, 0x49, 0x20, 0x1E, 0xE4, 0x50, 0x20, 0x7A, 0xF0, 0x02, 0xA8, + 0xC9, 0x28, 0xF7, 0x3C, 0x38, 0xF0, 0x3F, 0x00, 0x08, 0xE0, 0x66, 0xC8, + 0x30, 0x00, 0x04, 0xE0, 0xD2, 0xCE, 0xD4, 0xCA, 0x2E, 0xE4, 0xFA, 0xF7, + 0xF7, 0x28, 0x98, 0xCE, 0x80, 0x01, 0x61, 0xE1, 0x48, 0x3C, 0x82, 0xE0, + 0x82, 0xCA, 0x11, 0x3D, 0x11, 0x35, 0x80, 0xCA, 0x11, 0x35, 0x84, 0xCA, + 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, 0x86, 0xCA, 0x11, 0x3D, + 0x45, 0x01, 0x11, 0x8B, 0x44, 0x01, 0x11, 0x8B, 0x49, 0x01, 0x11, 0x8B, + 0x48, 0x01, 0x11, 0x8B, 0x4B, 0x01, 0x11, 0x8B, 0x4A, 0x01, 0x11, 0x8B, + 0x4E, 0x01, 0x11, 0x8B, 0x60, 0x01, 0x11, 0x8B, 0x52, 0x01, 0x11, 0x8B, + 0x4F, 0x01, 0x11, 0x8B, 0x55, 0x01, 0x11, 0x8B, 0x53, 0x01, 0x11, 0x8B, + 0x63, 0x01, 0x11, 0x8B, 0x57, 0x01, 0x11, 0x8B, 0x65, 0x01, 0x11, 0x8B, + 0x64, 0x01, 0x11, 0x8B, 0xCE, 0xCA, 0x11, 0x3D, 0x11, 0x35, 0xCC, 0xCA, + 0x68, 0x01, 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, 0xD4, 0xCA, 0x11, 0x3D, + 0x11, 0x35, 0xD2, 0xCA, 0x6B, 0x01, 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, + 0x6D, 0x01, 0x11, 0x8B, 0x6C, 0x01, 0x11, 0x8B, 0x11, 0x35, 0x60, 0xC8, + 0x6E, 0x01, 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, 0x62, 0xC8, 0x11, 0x3D, + 0x11, 0x8B, 0x11, 0x3D, 0x11, 0x35, 0x64, 0xC8, 0x11, 0x8B, 0x34, 0x00, + 0x11, 0x8B, 0x33, 0x00, 0x11, 0x8B, 0x36, 0x00, 0x11, 0x8B, 0x35, 0x00, + 0x72, 0xC8, 0x38, 0x00, 0x11, 0x8B, 0x37, 0x00, 0x3A, 0x00, 0x11, 0x8B, + 0x11, 0x3D, 0x11, 0x35, 0x7C, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x7A, 0xC8, + 0x11, 0x35, 0x80, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, + 0x82, 0xC8, 0x11, 0x3D, 0x86, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x84, 0xC8, + 0x11, 0x35, 0x88, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, + 0x8A, 0xC8, 0x11, 0x3D, 0x90, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x8C, 0xC8, + 0x11, 0x35, 0x92, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x11, 0x3D, 0x11, 0x35, + 0x94, 0xC8, 0x11, 0x3D, 0x98, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x96, 0xC8, + 0x11, 0x35, 0x9E, 0xC8, 0x11, 0x3D, 0x11, 0x35, 0x2E, 0xE4, 0x92, 0xE0, + 0x48, 0x28, 0x11, 0x3D, 0x80, 0x01, 0x61, 0xE1, 0x48, 0x3C, 0x82, 0xE0, + 0x11, 0x21, 0x80, 0xCE, 0x11, 0x4D, 0x11, 0x21, 0x11, 0x4D, 0x11, 0x21, + 0x82, 0xCE, 0x11, 0x4D, 0x86, 0xCE, 0x11, 0x4D, 0x11, 0x21, 0x84, 0xCE, + 0x45, 0x01, 0x11, 0x89, 0x44, 0x01, 0x11, 0x89, 0x49, 0x01, 0x11, 0x89, + 0x48, 0x01, 0x11, 0x89, 0x4B, 0x01, 0x11, 0x89, 0x4A, 0x01, 0x11, 0x89, + 0x4E, 0x01, 0x11, 0x89, 0x60, 0x01, 0x11, 0x89, 0x52, 0x01, 0x11, 0x89, + 0x4F, 0x01, 0x11, 0x89, 0x55, 0x01, 0x11, 0x89, 0x53, 0x01, 0x11, 0x89, + 0x63, 0x01, 0x11, 0x89, 0x57, 0x01, 0x11, 0x89, 0x65, 0x01, 0x11, 0x89, + 0x64, 0x01, 0x11, 0x89, 0x11, 0x21, 0xCC, 0xCE, 0x11, 0x4D, 0x11, 0x21, + 0x68, 0x01, 0x11, 0x89, 0xCE, 0xCE, 0x11, 0x4D, 0x11, 0x21, 0xD2, 0xCE, + 0x11, 0x4D, 0x11, 0x21, 0x6B, 0x01, 0x11, 0x89, 0xD4, 0xCE, 0x11, 0x4D, + 0x6D, 0x01, 0x11, 0x89, 0x6C, 0x01, 0x11, 0x89, 0x11, 0x4D, 0x11, 0x21, + 0x6E, 0x01, 0x11, 0x89, 0x62, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x60, 0xCC, + 0x11, 0x89, 0x64, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x11, 0x89, 0x34, 0x00, + 0x11, 0x89, 0x33, 0x00, 0x11, 0x89, 0x36, 0x00, 0x11, 0x89, 0x35, 0x00, + 0x11, 0x21, 0x38, 0x00, 0x11, 0x89, 0x37, 0x00, 0x3A, 0x00, 0x11, 0x89, + 0x72, 0xCC, 0x11, 0x4D, 0x11, 0x21, 0x7A, 0xCC, 0x11, 0x4D, 0x11, 0x21, + 0x11, 0x4D, 0x11, 0x21, 0x7C, 0xCC, 0x11, 0x4D, 0x82, 0xCC, 0x11, 0x4D, + 0x11, 0x21, 0x80, 0xCC, 0x11, 0x21, 0x84, 0xCC, 0x11, 0x4D, 0x11, 0x21, + 0x11, 0x4D, 0x11, 0x21, 0x86, 0xCC, 0x11, 0x4D, 0x8A, 0xCC, 0x11, 0x4D, + 0x11, 0x21, 0x88, 0xCC, 0x11, 0x21, 0x8C, 0xCC, 0x11, 0x4D, 0x11, 0x21, + 0x11, 0x4D, 0x11, 0x21, 0x90, 0xCC, 0x11, 0x4D, 0x94, 0xCC, 0x11, 0x4D, + 0x11, 0x21, 0x92, 0xCC, 0x11, 0x21, 0x96, 0xCC, 0x11, 0x4D, 0x11, 0x21, + 0x11, 0x4D, 0x11, 0x21, 0x98, 0xCC, 0x11, 0x4D, 0x56, 0xE0, 0x21, 0xAE, + 0x15, 0x14, 0x05, 0xE0, 0x48, 0x28, 0x02, 0x00, 0x4C, 0xD1, 0x9E, 0xCC, + 0x48, 0x3C, 0x82, 0xE0, 0x2E, 0xE4, 0x92, 0xE0, 0x11, 0x35, 0x72, 0xC8, + 0x80, 0x01, 0x61, 0xE1, 0x11, 0x3D, 0xFC, 0x3C, 0xC6, 0xCA, 0x11, 0x3D, + 0x11, 0x3D, 0x11, 0x35, 0xCC, 0xCA, 0x7A, 0xF0, 0x48, 0x28, 0x11, 0x3D, + 0x11, 0x35, 0xCE, 0xCA, 0x2B, 0xE4, 0xFC, 0x2A, 0x2E, 0xE4, 0x92, 0xE0, + 0x78, 0x34, 0x46, 0xE0, 0x79, 0x4C, 0x78, 0x24, 0x48, 0x3C, 0x82, 0xE0, + 0x2E, 0xE4, 0x79, 0x3C, 0x11, 0x4D, 0x11, 0x21, 0x80, 0x01, 0x61, 0xE1, + 0x01, 0x29, 0x5B, 0xF1, 0x11, 0x2B, 0x72, 0xCC, 0x1E, 0xE4, 0xFF, 0x00, + 0x08, 0xE0, 0x10, 0xAF, 0xCA, 0xF0, 0x02, 0xA1, 0xFC, 0x28, 0x4C, 0x20, + 0xFF, 0x00, 0x08, 0xE0, 0x11, 0x29, 0xFC, 0x3C, 0x02, 0xA1, 0xFC, 0x28, + 0x4C, 0x20, 0x1E, 0xE4, 0x48, 0x28, 0xDE, 0xF6, 0xFC, 0x3C, 0x3A, 0xF0, + 0x21, 0xD1, 0x40, 0xCE, 0x2E, 0xE4, 0x92, 0xE0, 0x23, 0xD1, 0x02, 0x00, + 0x22, 0xD1, 0x00, 0x00, 0xE8, 0xF7, 0x02, 0xA8, 0x48, 0xCA, 0x80, 0x00, + 0x9E, 0xCC, 0x22, 0xAE, 0x04, 0xA2, 0x2E, 0xE4, 0x8E, 0xCC, 0x8C, 0xCC, + 0x72, 0xCC, 0x00, 0xA2, 0x0A, 0xE0, 0x20, 0xAE, 0x10, 0xA8, 0x04, 0xE0, + 0x03, 0x00, 0x6F, 0xD1, 0x4A, 0xCE, 0x22, 0x93, 0x6F, 0xD1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x50, 0xCE, 0x60, 0xA2, 0x2E, 0xE4, 0x00, 0x00, + 0x00, 0xC0, 0xEA, 0xF7, 0x02, 0xA8, 0x50, 0xCA, 0x50, 0xCE, 0x20, 0x00, + 0x04, 0xE0, 0x2E, 0xE4, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x2E, 0xE4, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x30, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x10, 0x00, 0x30, 0x00, 0x18, 0x00, 0x08, 0x00, 0x18, 0x00, 0x40, 0x00, + 0x18, 0x00, 0x08, 0x00, 0x18, 0x00, 0x40, 0x00, 0x18, 0x00, 0x10, 0x00, + 0x18, 0x00, 0x50, 0x00, 0x20, 0x00, 0x10, 0x00, 0x18, 0x00, 0x50, 0x00, + 0x20, 0x00, 0x18, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x18, 0x00, + 0x20, 0x00, 0x60, 0x00, 0x28, 0x00, 0x18, 0x00, 0x40, 0x00, 0x80, 0x00, + 0x30, 0x00, 0x18, 0x00, 0x40, 0x00, 0x80, 0x00, 0x30, 0x00, 0x20, 0x00, + 0x60, 0x00, 0xA0, 0x00, 0x38, 0x00, 0x20, 0x00, 0x60, 0x00, 0xA0, 0x00, + 0x40, 0x00, 0x30, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x48, 0x00, 0x30, 0x00, + 0x80, 0x00, 0xC0, 0x00, 0x50, 0x00, 0x40, 0x00, 0xC0, 0x00, 0x00, 0x01, + 0x58, 0x00, 0x40, 0x00, 0xC0, 0x00, 0x00, 0x01, 0x68, 0x00, 0x60, 0x00, + 0x00, 0x01, 0x40, 0x01, 0x70, 0x00, 0x60, 0x00, 0x00, 0x01, 0x40, 0x01, + 0x80, 0x00, 0x70, 0x00, 0x40, 0x01, 0x80, 0x01, 0x90, 0x00, 0x70, 0x00, + 0x40, 0x01, 0x80, 0x01, 0xA0, 0x00, 0x80, 0x00, 0x80, 0x01, 0xC0, 0x01, + 0xB8, 0x00, 0x80, 0x00, 0x80, 0x01, 0xC0, 0x01, 0xC8, 0x00, 0xA0, 0x00, + 0xC0, 0x01, 0x00, 0x02, 0xE8, 0x00, 0xA0, 0x00, 0xC0, 0x01, 0x00, 0x02, + 0x80, 0x01, 0x80, 0x01, 0x00, 0x02, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0x02, 0x00, 0x03, 0xC0, 0x01, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, + 0xE8, 0x01, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, 0x98, 0x03, 0x00, 0x02, + 0x40, 0x02, 0x00, 0x04, 0xC8, 0x03, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, + 0x00, 0x04, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, 0x40, 0x04, 0x00, 0x02, + 0x40, 0x02, 0x00, 0x04, 0x88, 0x06, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, + 0xD8, 0x06, 0x00, 0x02, 0x40, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x0B, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x0E, 0x00, + 0x0D, 0x00, 0x0C, 0x00, 0x13, 0x00, 0x12, 0x00, 0x11, 0x00, 0x10, 0x00, + 0x17, 0x00, 0x16, 0x00, 0x15, 0x00, 0x14, 0x00, 0x1B, 0x00, 0x1A, 0x00, + 0x19, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1C, 0x00, + 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x23, 0x00, 0x23, 0x00, + 0x22, 0x00, 0x22, 0x00, 0x25, 0x00, 0x25, 0x00, 0x24, 0x00, 0x24, 0x00, + 0x26, 0x00, 0x26, 0x00, 0x26, 0x00, 0x25, 0x00, 0x27, 0x00, 0x27, 0x00, + 0x27, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x09, 0x00, 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x0D, 0x00, + 0x0B, 0x00, 0x0A, 0x00, 0x17, 0x00, 0x14, 0x00, 0x12, 0x00, 0x10, 0x00, + 0x24, 0x00, 0x20, 0x00, 0x1D, 0x00, 0x19, 0x00, 0x39, 0x00, 0x33, 0x00, + 0x2D, 0x00, 0x28, 0x00, 0x5B, 0x00, 0x51, 0x00, 0x48, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, + 0x0D, 0x00, 0x0B, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x14, 0x00, 0x12, 0x00, + 0x10, 0x00, 0x0E, 0x00, 0x20, 0x00, 0x1D, 0x00, 0x19, 0x00, 0x17, 0x00, + 0x33, 0x00, 0x2D, 0x00, 0x28, 0x00, 0x24, 0x00, 0x51, 0x00, 0x48, 0x00, + 0x40, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, +}; +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/fw_h265.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/fw_h265.h new file mode 100644 index 0000000000..548d56cc76 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/fw_h265.h @@ -0,0 +1,12270 @@ +#ifdef FIRMWARE_H +uint8_t fw_h265[] = { + 0x40, 0x0C, 0x00, 0x00, 0xDA, 0x10, 0x00, 0x00, 0xE6, 0x10, 0x00, 0x00, + 0x14, 0x11, 0x00, 0x00, 0x38, 0x11, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x66, 0x11, 0x00, 0x00, + 0x74, 0x12, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x8C, 0x12, 0x00, 0x00, + 0x98, 0x12, 0x00, 0x00, 0xC0, 0x12, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x2C, 0x2D, 0x00, 0x00, 0x40, 0x2D, 0x00, 0x00, + 0x5E, 0x2E, 0x00, 0x00, 0x98, 0x2E, 0x00, 0x00, 0x74, 0x15, 0x00, 0x00, + 0x32, 0x3F, 0x00, 0x00, 0x54, 0x35, 0x00, 0x00, 0xA8, 0x35, 0x00, 0x00, + 0x2C, 0x13, 0x00, 0x00, 0x3E, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0xA0, 0x46, 0x00, 0x00, 0xE4, 0x3E, 0x00, 0x00, 0x88, 0x2F, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0xCE, 0x46, 0x00, 0x00, 0x38, 0x15, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x8A, 0x1D, 0x00, 0x00, 0x8A, 0x1D, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x8A, 0x1D, 0x00, 0x00, 0x8A, 0x1D, 0x00, 0x00, + 0x8A, 0x1D, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x8A, 0x1D, 0x00, 0x00, + 0x8A, 0x1D, 0x00, 0x00, 0x8A, 0x1D, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x56, 0x2F, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, + 0x08, 0x13, 0x00, 0x00, 0x5F, 0xB1, 0x00, 0xA4, 0x68, 0xE4, 0x02, 0x40, + 0xE0, 0x4C, 0x64, 0xB8, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x00, 0x0F, 0x40, + 0x36, 0x09, 0x28, 0xE4, 0x02, 0x40, 0xE2, 0x4C, 0x22, 0xB8, 0xE0, 0xC9, + 0x07, 0xD5, 0x01, 0x40, 0xE6, 0x22, 0x04, 0x40, 0x2A, 0xE6, 0x20, 0xB8, + 0x0D, 0x40, 0x28, 0xB8, 0x00, 0xA9, 0x00, 0xA0, 0x02, 0x28, 0x08, 0xBF, + 0x0D, 0xDA, 0x92, 0x83, 0x18, 0xE4, 0x83, 0xE4, 0x80, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x01, 0xD5, 0xC1, 0xC4, 0xC1, 0xC9, 0x09, 0xE4, 0x40, 0xE0, + 0x01, 0xBF, 0xF5, 0xD9, 0x00, 0xA9, 0x00, 0xA0, 0x12, 0x28, 0x08, 0xBF, + 0x0D, 0xDA, 0xA2, 0x82, 0x18, 0xE4, 0x82, 0xE4, 0x80, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x01, 0xD5, 0xC1, 0xC4, 0xC1, 0xC9, 0x09, 0xE4, 0x40, 0xE0, + 0x01, 0xBF, 0xF5, 0xD9, 0x00, 0xA9, 0x00, 0xA0, 0x0F, 0x40, 0x16, 0x02, + 0x02, 0xBF, 0x0D, 0xDA, 0x0F, 0x40, 0x06, 0x01, 0x81, 0xE4, 0x81, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x01, 0xD5, 0xC1, 0xC4, 0xC1, 0xC9, 0x09, 0xE4, + 0x40, 0xE0, 0x02, 0xBF, 0xF5, 0xD9, 0x84, 0xE4, 0x48, 0xE0, 0x5F, 0xB0, + 0xA0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xEC, 0xB6, + 0xC8, 0xE4, 0x02, 0x40, 0xD1, 0x4C, 0x38, 0x0E, 0x68, 0xE4, 0x02, 0x40, + 0xE0, 0x4C, 0x64, 0xB8, 0x5C, 0x40, 0xA4, 0xDF, 0x48, 0xE4, 0xE0, 0xC8, + 0x03, 0x40, 0x8F, 0xD5, 0x56, 0x08, 0x7A, 0xC8, 0x04, 0x01, 0xFF, 0x4F, + 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, 0x04, 0x11, 0x19, 0x40, 0x26, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0x2E, 0xC8, 0x7F, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x04, 0x11, 0x61, 0x41, 0x46, 0x28, 0x00, 0x40, 0x87, 0xBC, 0x3A, 0xC8, + 0xFF, 0x63, 0x1F, 0xBC, 0x18, 0xBD, 0x04, 0x11, 0x1A, 0x40, 0x06, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0x4A, 0xC8, 0xFE, 0x7F, 0xFF, 0x7F, 0x1F, 0xBC, + 0x18, 0xBD, 0x04, 0x11, 0x35, 0x40, 0x16, 0x28, 0x08, 0x40, 0x04, 0x38, + 0x35, 0x40, 0x26, 0x29, 0x01, 0x40, 0x4E, 0x28, 0x98, 0xB8, 0xEC, 0xC9, + 0x01, 0x40, 0xD1, 0xDB, 0x14, 0x00, 0xFF, 0x41, 0xFF, 0x7F, 0x0F, 0xBC, + 0x00, 0x58, 0x00, 0x40, 0x00, 0xBD, 0x14, 0x10, 0x35, 0x40, 0x36, 0x29, + 0x01, 0x40, 0x5E, 0x28, 0x98, 0xB8, 0xEC, 0xC9, 0x01, 0x40, 0xD3, 0xDB, + 0x80, 0xE4, 0x0F, 0x7E, 0xFF, 0x7F, 0x8F, 0xBC, 0xC0, 0x40, 0x00, 0x40, + 0x80, 0xBD, 0x14, 0x18, 0x1F, 0x40, 0x06, 0x89, 0xDF, 0xC9, 0xE0, 0xC9, + 0x01, 0x40, 0xD5, 0xD9, 0x1F, 0x40, 0x16, 0x88, 0xDF, 0xC8, 0xE0, 0xC8, + 0x01, 0x40, 0xD6, 0xD9, 0x00, 0x40, 0x9F, 0xBC, 0x5E, 0xC9, 0x1F, 0x7E, + 0xFF, 0x7F, 0x1F, 0xBC, 0x19, 0xBD, 0x00, 0x40, 0x8F, 0xBC, 0x4E, 0xC8, + 0xE1, 0x7F, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, 0x04, 0x11, 0x1A, 0x40, + 0x16, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x46, 0xC9, 0x81, 0xE4, 0xFF, 0x7F, + 0xFF, 0x5F, 0x8F, 0xBC, 0x89, 0xBD, 0x04, 0x18, 0x02, 0x40, 0xF0, 0x4C, + 0x1C, 0x08, 0xE0, 0xC8, 0x01, 0x40, 0xB9, 0xD4, 0x08, 0xE4, 0x1F, 0x40, + 0x06, 0x88, 0xE0, 0xC8, 0x01, 0x40, 0xEA, 0xDB, 0x30, 0x40, 0xDD, 0xE1, + 0x24, 0xE4, 0x04, 0x40, 0x21, 0xB8, 0x1C, 0xE4, 0x02, 0x40, 0xA2, 0x5A, + 0x14, 0xB8, 0x01, 0x09, 0xC4, 0xC1, 0x8D, 0xE4, 0x80, 0xB8, 0x08, 0x39, + 0x9C, 0xB8, 0x04, 0x40, 0x3F, 0x75, 0x09, 0x28, 0x02, 0x38, 0xC1, 0xC2, + 0xC1, 0xC0, 0x1F, 0x40, 0x06, 0x88, 0x80, 0xBF, 0xF0, 0xD8, 0xEE, 0xC0, + 0x0D, 0xD8, 0x00, 0xA1, 0x90, 0xE4, 0x94, 0xB8, 0x04, 0x40, 0x91, 0xB8, + 0x8D, 0xE4, 0x80, 0xB8, 0x08, 0x31, 0x09, 0x31, 0xC1, 0xC9, 0xC1, 0xC0, + 0xEE, 0xC0, 0xF8, 0xDB, 0x02, 0x40, 0xF1, 0x4C, 0x2C, 0x08, 0xE0, 0xC8, + 0x01, 0x40, 0xC4, 0xD4, 0x08, 0xE4, 0x1F, 0x40, 0x16, 0x88, 0xE0, 0xC8, + 0x1A, 0xDB, 0x34, 0xE4, 0x05, 0x40, 0x31, 0xB8, 0x2D, 0xE4, 0xCF, 0xC2, + 0x1C, 0xE4, 0x02, 0x40, 0xA6, 0x5A, 0x10, 0xB8, 0x01, 0x09, 0xC4, 0xC1, + 0x02, 0x39, 0xC1, 0xC2, 0x9C, 0xB8, 0x04, 0x40, 0x3F, 0x75, 0x09, 0x28, + 0x03, 0x38, 0xC1, 0xC3, 0xC1, 0xC0, 0x1F, 0x40, 0x16, 0x88, 0x80, 0xBF, + 0xF1, 0xD8, 0xEE, 0xC0, 0x0F, 0xD8, 0x00, 0xA1, 0x90, 0xE4, 0x94, 0xB8, + 0x05, 0x40, 0x91, 0xB8, 0x80, 0xE4, 0x8D, 0xB8, 0xCF, 0xC8, 0x08, 0x31, + 0xC1, 0xC8, 0x09, 0x31, 0xC1, 0xC9, 0xC1, 0xC0, 0xEE, 0xC0, 0xF9, 0xDB, + 0x00, 0xAA, 0x24, 0x1A, 0x3A, 0xE4, 0x34, 0x1A, 0x0A, 0xE4, 0x1F, 0x40, + 0x06, 0x88, 0xE0, 0xC8, 0x24, 0xDB, 0x3C, 0xA2, 0x1C, 0xA1, 0x0E, 0xDE, + 0x00, 0x40, 0x9F, 0xBC, 0x86, 0xC9, 0x8A, 0xE4, 0x89, 0xBD, 0xA8, 0xE4, + 0x24, 0x18, 0xC1, 0xC0, 0xDC, 0xC1, 0xDC, 0xC2, 0x1F, 0x40, 0x06, 0x88, + 0x80, 0xBF, 0x13, 0xDB, 0x8D, 0xE4, 0x80, 0xB8, 0x08, 0x89, 0xE7, 0xC0, + 0xED, 0xDB, 0x00, 0x40, 0x9F, 0xBC, 0x8A, 0xC9, 0x83, 0xE4, 0x89, 0xBD, + 0x38, 0xE4, 0x34, 0x18, 0xC1, 0xC0, 0xDC, 0xC1, 0xDC, 0xC2, 0x1F, 0x40, + 0x06, 0x88, 0x80, 0xBF, 0xED, 0xD8, 0x00, 0xAB, 0x44, 0x1B, 0xAB, 0xE4, + 0x54, 0x1B, 0x0B, 0xE4, 0x1F, 0x40, 0x16, 0x88, 0xE0, 0xC8, 0x26, 0xDB, + 0x3C, 0xA3, 0x1C, 0xA2, 0x1D, 0xE4, 0xCF, 0xC1, 0x0E, 0xDE, 0x00, 0x40, + 0x9F, 0xBC, 0x8A, 0xC9, 0x8B, 0xE4, 0x89, 0xBD, 0xB8, 0xE4, 0x44, 0x18, + 0xC1, 0xC0, 0xDC, 0xC2, 0xDC, 0xC3, 0x1F, 0x40, 0x16, 0x88, 0x80, 0xBF, + 0x13, 0xDB, 0x01, 0x88, 0xC1, 0xC1, 0x98, 0xE4, 0xE7, 0xC0, 0xED, 0xDB, + 0x00, 0x40, 0x9F, 0xBC, 0x8E, 0xC9, 0x8A, 0xE4, 0x89, 0xBD, 0xA8, 0xE4, + 0x54, 0x18, 0xC1, 0xC0, 0xDC, 0xC2, 0xDC, 0xC3, 0x1F, 0x40, 0x16, 0x88, + 0x80, 0xBF, 0xED, 0xD8, 0x01, 0xA3, 0x00, 0xA0, 0x04, 0x40, 0xDF, 0x59, + 0x4C, 0x88, 0xE0, 0xC8, 0x12, 0xDB, 0x02, 0x40, 0xAA, 0x5A, 0x3C, 0x01, + 0x98, 0xE4, 0x8D, 0xE4, 0x80, 0xB8, 0x08, 0x88, 0x0A, 0xC8, 0x8C, 0xB8, + 0x02, 0x40, 0x9B, 0x5A, 0x18, 0x08, 0x18, 0xBF, 0x02, 0x40, 0x4E, 0xD9, + 0xC1, 0xC0, 0x90, 0xBF, 0xF2, 0xD8, 0x00, 0xA0, 0x04, 0x40, 0xDF, 0x59, + 0x5C, 0x88, 0xE0, 0xC8, 0x13, 0xDB, 0x02, 0x40, 0xAA, 0x5A, 0x3C, 0x01, + 0x28, 0xE4, 0x9D, 0xE4, 0xCF, 0xC9, 0x09, 0x88, 0xC1, 0xC9, 0x0A, 0xC8, + 0x8C, 0xB8, 0x02, 0x40, 0x9B, 0x5A, 0x18, 0x08, 0x18, 0xBF, 0x02, 0x40, + 0x35, 0xD9, 0xC1, 0xC0, 0x20, 0xBF, 0xF3, 0xD8, 0x36, 0xC3, 0x04, 0x01, + 0xFF, 0x7D, 0x1F, 0xBC, 0x13, 0xBD, 0x04, 0x11, 0x56, 0x08, 0xE1, 0xC8, + 0x05, 0xD5, 0x1A, 0x40, 0x16, 0x08, 0xE0, 0xC8, 0x01, 0x40, 0x1F, 0xD5, + 0x35, 0x40, 0x06, 0x29, 0xD9, 0xB8, 0x0D, 0x89, 0x89, 0xE4, 0x0A, 0xC8, + 0x8C, 0xB8, 0x02, 0x40, 0x9B, 0x5A, 0x18, 0x08, 0xE4, 0x18, 0x9C, 0xB8, + 0x04, 0x40, 0x3F, 0x75, 0x09, 0x28, 0xE0, 0xC8, 0x01, 0x40, 0x18, 0xD9, + 0x03, 0x40, 0xE4, 0x38, 0x19, 0x40, 0x36, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0x6E, 0xC8, 0xFF, 0x7D, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, 0x04, 0x11, + 0x1B, 0x40, 0x26, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x52, 0xC8, 0x14, 0x00, + 0xFB, 0x7F, 0xFF, 0x7F, 0x0F, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x1B, 0x40, + 0x06, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x56, 0xC8, 0xF7, 0x7F, 0xFF, 0x7F, + 0x0F, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x36, 0x40, 0x46, 0x28, 0x3E, 0xC8, + 0x03, 0x40, 0x00, 0x70, 0x80, 0xBC, 0xFC, 0x7F, 0xFF, 0x4F, 0x0F, 0xBC, + 0x08, 0xBD, 0x14, 0x10, 0x36, 0x40, 0x56, 0x28, 0x2E, 0xC8, 0x00, 0x4F, + 0x80, 0xBC, 0xFF, 0x70, 0x0F, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x19, 0x40, + 0x06, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x76, 0xC8, 0xFF, 0x77, 0xFF, 0x7F, + 0x1F, 0xBC, 0x18, 0xBD, 0x04, 0x11, 0x19, 0x40, 0x16, 0x08, 0x00, 0x40, + 0x81, 0xBC, 0x72, 0xC8, 0xFF, 0x7B, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x04, 0x11, 0x56, 0x08, 0xE1, 0xC8, 0x00, 0x40, 0xC7, 0xD5, 0xE0, 0xC8, + 0x00, 0x40, 0x94, 0xD4, 0x02, 0x40, 0x0E, 0x88, 0xE0, 0xC8, 0x00, 0x40, + 0x8F, 0xD5, 0x04, 0x40, 0x00, 0xBD, 0x14, 0x10, 0x00, 0xA3, 0x06, 0x40, + 0x14, 0x13, 0x06, 0x40, 0x24, 0x13, 0x14, 0x08, 0x28, 0xE4, 0x66, 0xC2, + 0x7D, 0xC2, 0xE1, 0xC2, 0x00, 0x40, 0xB7, 0xD5, 0xFC, 0x7F, 0x80, 0xBC, + 0x14, 0x18, 0x0A, 0x40, 0xCB, 0x66, 0x3C, 0x08, 0x3F, 0x40, 0x8F, 0xBC, + 0x91, 0xE4, 0xC0, 0x7F, 0x90, 0xBC, 0x98, 0xBD, 0x04, 0x19, 0x0A, 0x40, + 0xCB, 0x66, 0x3C, 0x08, 0xC1, 0xC8, 0x0A, 0x40, 0xCB, 0x66, 0x3C, 0x18, + 0x84, 0xE4, 0x14, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0xF4, 0xC9, + 0x4F, 0xDA, 0x14, 0x00, 0xFF, 0x41, 0xFF, 0x7F, 0x0F, 0xBC, 0x00, 0x68, + 0x00, 0x40, 0x00, 0xBD, 0x14, 0x10, 0x35, 0x40, 0x36, 0x29, 0x01, 0x40, + 0x5E, 0x28, 0x98, 0xB8, 0xEC, 0xC9, 0xFE, 0x7F, 0x2D, 0xD8, 0xF4, 0xC9, + 0x45, 0xDA, 0x80, 0xE4, 0x0F, 0x7E, 0xFF, 0x7F, 0x8F, 0xBC, 0x40, 0x41, + 0x00, 0x40, 0x80, 0xBD, 0x14, 0x18, 0x1F, 0x40, 0x06, 0x89, 0xDF, 0xC9, + 0xE0, 0xC9, 0xFE, 0x7F, 0x2B, 0xDA, 0x00, 0xA9, 0x1F, 0x40, 0x16, 0x88, + 0xDF, 0xC8, 0xE0, 0xC8, 0xFE, 0x7F, 0x2A, 0xDA, 0x00, 0xA8, 0xFE, 0x7F, + 0x27, 0xDE, 0x00, 0xA0, 0x1F, 0x40, 0x06, 0x88, 0xE0, 0xC8, 0x32, 0xDB, + 0x30, 0x40, 0xDD, 0xE1, 0x24, 0xE4, 0x04, 0x40, 0x21, 0xB8, 0x1C, 0xE4, + 0x02, 0x40, 0xF0, 0x4C, 0x18, 0xB8, 0x01, 0x88, 0xC1, 0xC1, 0x0A, 0xC8, + 0x8C, 0xB8, 0x02, 0x40, 0xA2, 0x5A, 0x18, 0x09, 0x8D, 0xE4, 0x80, 0xB8, + 0x08, 0x39, 0x9C, 0xB8, 0x04, 0x40, 0x3F, 0x75, 0x09, 0x28, 0x02, 0x38, + 0xC1, 0xC2, 0xC1, 0xC0, 0x1F, 0x40, 0x06, 0x88, 0x80, 0xBF, 0xEB, 0xD8, + 0xFE, 0x7F, 0x41, 0xDE, 0x6E, 0xC9, 0x14, 0x00, 0xFF, 0x41, 0xFF, 0x7F, + 0x0F, 0xBC, 0x09, 0xBD, 0xFD, 0x7F, 0xDD, 0xDE, 0x01, 0x40, 0x9F, 0xBC, + 0x5A, 0xC9, 0x80, 0xE4, 0x0F, 0x7E, 0xFF, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, + 0xFD, 0x7F, 0xE3, 0xDE, 0x30, 0x40, 0xDD, 0xE1, 0xFE, 0x7F, 0x2D, 0xDE, + 0xFB, 0x7F, 0x0F, 0xBC, 0xFF, 0x7F, 0x6F, 0xDE, 0x00, 0xA0, 0x1F, 0x40, + 0x16, 0x88, 0xE0, 0xC8, 0xFE, 0x7F, 0x55, 0xDB, 0x34, 0xE4, 0x05, 0x40, + 0x31, 0xB8, 0x2D, 0xE4, 0xCF, 0xC2, 0x1C, 0xE4, 0x02, 0x40, 0xF1, 0x4C, + 0x1C, 0xB8, 0x01, 0x88, 0xC1, 0xC1, 0x0A, 0xC8, 0x8C, 0xB8, 0x02, 0x40, + 0xA6, 0x5A, 0x08, 0x09, 0x02, 0x39, 0xC1, 0xC2, 0x9C, 0xB8, 0x04, 0x40, + 0x3F, 0x75, 0x09, 0x28, 0x03, 0x38, 0xC1, 0xC3, 0xC1, 0xC0, 0x1F, 0x40, + 0x16, 0x88, 0x80, 0xBF, 0xEC, 0xD8, 0xFE, 0x7F, 0x34, 0xDE, 0x35, 0x40, + 0x06, 0x28, 0xD8, 0xB8, 0x01, 0x40, 0x7D, 0x89, 0xFE, 0x7F, 0xDE, 0xDE, + 0x01, 0x40, 0x7E, 0x88, 0xFF, 0x7F, 0x3A, 0xDE, 0x00, 0xA8, 0xFE, 0x7F, + 0xE5, 0xDE, 0x17, 0x40, 0x00, 0xA8, 0x89, 0x98, 0x1C, 0xA8, 0xD7, 0xE1, + 0x87, 0xB8, 0x12, 0x40, 0xCD, 0xDF, 0x85, 0x98, 0x8C, 0xE4, 0x5A, 0x40, + 0x0D, 0xDF, 0x0A, 0x40, 0xCB, 0x66, 0x2C, 0x18, 0xE0, 0xC8, 0x00, 0x40, + 0xEB, 0xD5, 0x38, 0x41, 0x06, 0x28, 0x00, 0x40, 0x87, 0xBC, 0x0E, 0xC8, + 0x14, 0x00, 0xFC, 0x7F, 0x07, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x38, 0x41, + 0x16, 0x29, 0x00, 0x40, 0x97, 0xBC, 0x80, 0xE4, 0xFF, 0x7F, 0x88, 0xBC, + 0x89, 0xBD, 0x14, 0x18, 0xE2, 0xE4, 0x38, 0x41, 0x06, 0x29, 0xA6, 0xCE, + 0xF2, 0xE4, 0x38, 0x41, 0x16, 0x28, 0xA2, 0xCF, 0x03, 0xE4, 0x16, 0xE4, + 0x38, 0x41, 0x21, 0x28, 0xE0, 0xC8, 0x07, 0xD5, 0x92, 0xE4, 0x82, 0xC9, + 0x06, 0x40, 0x14, 0x08, 0x89, 0xBD, 0x06, 0x40, 0x14, 0x18, 0x3A, 0x41, + 0x11, 0x28, 0xE0, 0xC8, 0x0A, 0xD5, 0x80, 0xE4, 0x01, 0x40, 0x80, 0xB8, + 0x92, 0xE4, 0xA2, 0xC9, 0x06, 0x40, 0x14, 0x08, 0x89, 0xBD, 0x06, 0x40, + 0x14, 0x18, 0x3F, 0x41, 0x61, 0x28, 0xE0, 0xC8, 0x07, 0xD5, 0x92, 0xE4, + 0x82, 0xC9, 0x06, 0x40, 0x24, 0x08, 0x89, 0xBD, 0x06, 0x40, 0x24, 0x18, + 0x41, 0x41, 0x51, 0x28, 0xE0, 0xC8, 0x0A, 0xD5, 0x80, 0xE4, 0x01, 0x40, + 0x80, 0xB8, 0x92, 0xE4, 0xA2, 0xC9, 0x06, 0x40, 0x24, 0x08, 0x89, 0xBD, + 0x06, 0x40, 0x24, 0x18, 0xC1, 0xC0, 0xC1, 0xC1, 0xEE, 0xC0, 0xCA, 0xDB, + 0x1F, 0x40, 0x06, 0x8A, 0x00, 0xAB, 0xDB, 0xE4, 0x00, 0xA0, 0x0A, 0xBF, + 0x1F, 0xDA, 0x2D, 0xE4, 0x06, 0xC2, 0x26, 0xB8, 0xAD, 0x40, 0x20, 0xB8, + 0x3D, 0xE4, 0x36, 0xB8, 0x9E, 0x40, 0x30, 0xB8, 0x1D, 0xE4, 0x0A, 0xC1, + 0x05, 0x99, 0x19, 0xB8, 0x03, 0x28, 0xC1, 0xC3, 0x8E, 0xB8, 0x1F, 0x40, + 0x8F, 0xBC, 0x22, 0xC8, 0x01, 0x09, 0x0F, 0x60, 0x9F, 0xBC, 0x98, 0xBD, + 0x01, 0x19, 0x82, 0x28, 0xC2, 0xC2, 0x01, 0x38, 0xC1, 0xC0, 0xC4, 0xC1, + 0x0A, 0xBF, 0xEE, 0xD9, 0x1F, 0x40, 0x16, 0x8A, 0xC1, 0xCB, 0xCF, 0xCD, + 0xE1, 0xCB, 0xD8, 0xDB, 0x00, 0xA8, 0x86, 0x98, 0x84, 0x98, 0x83, 0x98, + 0x00, 0xAB, 0xEB, 0xE4, 0xDB, 0xE4, 0xE0, 0xCB, 0x60, 0xD4, 0x1F, 0x40, + 0x06, 0x8A, 0x00, 0xA0, 0x0A, 0xBF, 0x24, 0xDA, 0x04, 0x98, 0x8E, 0xB8, + 0x28, 0xE4, 0x06, 0xC2, 0x26, 0xB8, 0xA5, 0x40, 0x28, 0xB8, 0x03, 0x91, + 0x1D, 0xB8, 0x0A, 0xC1, 0x05, 0x99, 0x19, 0xB8, 0x07, 0x40, 0x18, 0xB8, + 0x38, 0xE4, 0x36, 0xB8, 0xA1, 0x40, 0x3C, 0xB8, 0x03, 0x28, 0xC1, 0xC3, + 0x8F, 0xB8, 0x1F, 0x40, 0x8F, 0xBC, 0x22, 0xC8, 0x01, 0x09, 0x0F, 0x60, + 0x9F, 0xBC, 0x98, 0xBD, 0x01, 0x19, 0x82, 0x28, 0xC2, 0xC2, 0x01, 0x38, + 0xC1, 0xC0, 0xC4, 0xC1, 0x0A, 0xBF, 0xEE, 0xD9, 0xC1, 0xCB, 0xCF, 0xCD, + 0x01, 0x40, 0xEE, 0xB8, 0xE1, 0xCB, 0xCF, 0xDB, 0x06, 0x98, 0xC1, 0xC8, + 0x86, 0x98, 0x03, 0x99, 0x01, 0x40, 0x9E, 0xB8, 0x83, 0x99, 0x04, 0x98, + 0xCF, 0xC8, 0x84, 0x98, 0x06, 0x99, 0xE1, 0xC9, 0xBF, 0xDB, 0x0A, 0x40, + 0xCB, 0x66, 0x2C, 0x08, 0x87, 0x98, 0x05, 0x98, 0x88, 0x98, 0x17, 0x40, + 0x00, 0xA8, 0x89, 0x98, 0x01, 0xA8, 0x8A, 0x98, 0x00, 0xA8, 0x8B, 0x98, + 0x1C, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, 0x14, 0x40, 0xAB, 0xDF, 0x0A, 0x40, + 0xCB, 0x66, 0x2C, 0x08, 0x06, 0x40, 0x34, 0x18, 0x04, 0x01, 0xFE, 0x7F, + 0x5C, 0xDE, 0x00, 0x40, 0xE8, 0x62, 0x08, 0xA8, 0x1F, 0x40, 0x3B, 0xDF, + 0xFC, 0x7F, 0x6A, 0xDE, 0x00, 0xA3, 0xFD, 0x7F, 0xCB, 0xDE, 0x1F, 0x40, + 0x16, 0x8A, 0x9F, 0xDE, 0x00, 0x40, 0xEA, 0x62, 0x04, 0xA8, 0x1F, 0x40, + 0x2E, 0xDF, 0xFF, 0x7F, 0x0E, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x69, 0xEC, 0xA0, 0xE1, 0x7C, 0xA0, + 0x68, 0xEC, 0xA0, 0xE1, 0x00, 0x70, 0x0F, 0xA0, 0x65, 0xEC, 0xA0, 0xE1, + 0x1E, 0x40, 0x89, 0xDF, 0x1E, 0x40, 0xD8, 0xDF, 0x00, 0x77, 0x00, 0xA0, + 0x00, 0x00, 0x00, 0x40, 0x01, 0xBF, 0x04, 0xD5, 0x80, 0x40, 0x00, 0xBF, + 0x0D, 0xD5, 0xF6, 0xDE, 0x00, 0x40, 0xF0, 0x63, 0x00, 0xA0, 0x00, 0x40, + 0xB3, 0x64, 0x00, 0xA1, 0x00, 0xA2, 0x01, 0xBF, 0x03, 0xD5, 0x00, 0x12, + 0xC4, 0xC0, 0xFB, 0xDE, 0x01, 0x77, 0x0C, 0xA0, 0x00, 0x00, 0xC0, 0xE1, + 0x11, 0x40, 0xE4, 0xDF, 0x01, 0x77, 0x04, 0xA0, 0x0F, 0x40, 0x0F, 0xA1, + 0x00, 0x11, 0xFA, 0xDE, 0x20, 0xB5, 0x5F, 0xB1, 0xFC, 0xB6, 0x68, 0xE4, + 0x00, 0xA3, 0x83, 0x93, 0x0C, 0x40, 0xD4, 0xE1, 0x02, 0x77, 0x00, 0xA0, + 0x00, 0x02, 0x92, 0xE4, 0x51, 0xC9, 0x0F, 0x40, 0x90, 0xBC, 0x82, 0xE4, + 0x3D, 0xC8, 0x10, 0x40, 0x80, 0xBC, 0x07, 0x40, 0x00, 0x70, 0x90, 0xBD, + 0x02, 0xE4, 0x1D, 0xC0, 0x00, 0x4E, 0x00, 0xBC, 0x98, 0xBD, 0x12, 0xE4, + 0x1D, 0xC1, 0x20, 0x40, 0x10, 0xBC, 0x90, 0xBD, 0x82, 0xE4, 0x71, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x08, 0xE4, 0x2E, 0xC0, 0x91, 0xBD, 0x2A, 0xC8, + 0x90, 0xBD, 0x15, 0xC2, 0x00, 0x41, 0x20, 0xBC, 0x98, 0xBD, 0x92, 0xBD, + 0x83, 0x99, 0x00, 0x77, 0x0C, 0xA8, 0x08, 0x02, 0x82, 0xE4, 0x41, 0xC8, + 0x00, 0x40, 0x8F, 0xBC, 0x98, 0xBD, 0x83, 0x99, 0x82, 0xE4, 0x00, 0x40, + 0x88, 0xBC, 0x06, 0xD5, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, + 0x6C, 0x40, 0x08, 0x13, 0x02, 0xE4, 0x00, 0x40, 0x07, 0xBC, 0x08, 0xD5, + 0xE1, 0xC0, 0x2C, 0xD5, 0xE2, 0xC0, 0x27, 0xD5, 0x00, 0xA8, 0x04, 0xB6, + 0x5F, 0xB0, 0x40, 0xB4, 0x84, 0xE4, 0x34, 0xDF, 0x08, 0xE4, 0xE1, 0xC8, + 0xF7, 0xD4, 0x14, 0x40, 0x57, 0xDF, 0x00, 0x77, 0x0C, 0xA9, 0x09, 0x08, + 0x01, 0x40, 0x80, 0xBC, 0x14, 0xD5, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, + 0x08, 0x02, 0x6C, 0x40, 0x02, 0x08, 0x06, 0x18, 0x00, 0xA8, 0x6C, 0x40, + 0x02, 0x18, 0x01, 0x40, 0x51, 0xE8, 0x0D, 0xC1, 0x00, 0x40, 0x11, 0xBC, + 0x0D, 0xD5, 0x04, 0x08, 0x06, 0x09, 0x13, 0x40, 0x1B, 0xDF, 0x01, 0xA8, + 0xDA, 0xDE, 0x01, 0x40, 0x45, 0xDF, 0xDC, 0xDE, 0x84, 0xE4, 0x00, 0x40, + 0xCB, 0xDF, 0xD8, 0xDE, 0x04, 0x84, 0x58, 0x40, 0x12, 0x14, 0x06, 0x08, + 0x59, 0x40, 0x12, 0x18, 0x59, 0x40, 0x22, 0x11, 0x58, 0x40, 0x02, 0x10, + 0x10, 0xA8, 0xC7, 0xDE, 0x20, 0xB5, 0x7C, 0xB3, 0x5F, 0xB1, 0xF8, 0xB6, + 0x28, 0xE4, 0x00, 0xA6, 0x11, 0x40, 0x0A, 0xDF, 0xE8, 0xE4, 0x02, 0x77, + 0x08, 0xA0, 0x00, 0x08, 0x48, 0xE4, 0x21, 0xC4, 0x01, 0x40, 0x4F, 0xBC, + 0xA8, 0xE4, 0x01, 0x40, 0xAF, 0xBC, 0x02, 0x40, 0xA0, 0xBF, 0x03, 0xDC, + 0x02, 0x40, 0x40, 0xBF, 0x05, 0xDD, 0x86, 0xE4, 0x08, 0xB6, 0x5F, 0xB0, + 0x7C, 0xB2, 0x40, 0xB4, 0xDA, 0xE4, 0xD4, 0xBA, 0x02, 0x77, 0x00, 0xA9, + 0x09, 0x08, 0x02, 0x77, 0x04, 0xA0, 0x00, 0x08, 0x06, 0x77, 0x00, 0xA1, + 0x0E, 0x77, 0x00, 0xAC, 0x02, 0x09, 0x89, 0xE4, 0x52, 0xC8, 0x88, 0xB8, + 0x2C, 0xD6, 0x02, 0x77, 0x00, 0xA8, 0x08, 0x00, 0xFF, 0x4F, 0x0F, 0xBC, + 0x5A, 0xC9, 0x99, 0xB8, 0x00, 0x40, 0x79, 0xD6, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA9, 0x09, 0x0B, 0x80, 0xE4, 0x42, 0xC8, 0x80, 0xBD, 0x74, 0x40, + 0x3B, 0x18, 0x24, 0xE4, 0x4A, 0xBF, 0x62, 0xDC, 0x04, 0xE4, 0x00, 0x40, + 0x0C, 0xE6, 0x0B, 0xB8, 0x01, 0x08, 0x40, 0x40, 0x00, 0x18, 0x11, 0x08, + 0x40, 0x40, 0x10, 0x18, 0x21, 0x08, 0x40, 0x40, 0x20, 0x18, 0x06, 0xC6, + 0x00, 0x40, 0x61, 0xBD, 0x01, 0x40, 0x10, 0xB8, 0xC1, 0xC2, 0xCC, 0xC0, + 0x2A, 0xBF, 0xEE, 0xDD, 0x4B, 0xDE, 0x24, 0xE4, 0x4A, 0xBF, 0x5B, 0xDC, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x0B, 0x34, 0xE4, 0x0A, 0xC3, + 0x3B, 0xB8, 0x60, 0x40, 0x30, 0xB8, 0x94, 0xE4, 0x12, 0xC9, 0x9B, 0xB8, + 0x0E, 0xE4, 0x01, 0x08, 0x20, 0x40, 0x29, 0x18, 0x11, 0x08, 0x20, 0x40, + 0x39, 0x18, 0x21, 0x08, 0x20, 0x40, 0x09, 0x18, 0x31, 0x08, 0x20, 0x40, + 0x19, 0x18, 0x01, 0x08, 0x00, 0x18, 0x11, 0x08, 0x10, 0x18, 0x21, 0x08, + 0x20, 0x18, 0x31, 0x08, 0x30, 0x18, 0x0C, 0x08, 0x03, 0x18, 0xC4, 0xC3, + 0x06, 0xC6, 0x00, 0x40, 0x61, 0xBD, 0x01, 0x40, 0x10, 0xB8, 0xC4, 0xCC, + 0x01, 0x40, 0x00, 0xB8, 0xC1, 0xC2, 0x01, 0x40, 0x90, 0xB8, 0x2A, 0xBF, + 0xDC, 0xDD, 0x94, 0xE4, 0x12, 0xC9, 0x9B, 0xB8, 0x12, 0xCD, 0x01, 0x40, + 0xD0, 0xB8, 0x0C, 0x40, 0xD8, 0xE1, 0x08, 0x19, 0x00, 0xA0, 0x84, 0x90, + 0x85, 0x9D, 0x01, 0xA9, 0x86, 0x99, 0x87, 0x90, 0x13, 0x40, 0x30, 0xDF, + 0x13, 0x40, 0x86, 0xDF, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x0B, + 0x92, 0xC6, 0x6C, 0x40, 0x0B, 0x08, 0x86, 0xBD, 0x6C, 0x40, 0x0B, 0x18, + 0x01, 0xA8, 0x08, 0xB6, 0x5F, 0xB0, 0x7C, 0xB2, 0x40, 0xB4, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x0B, 0x80, 0xE4, 0x42, 0xC8, 0x05, 0xC0, + 0x85, 0xDE, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x0B, 0xD1, 0xDE, + 0x20, 0xB5, 0x3C, 0xB3, 0x5F, 0xB1, 0xF8, 0xB6, 0x08, 0xE4, 0x02, 0x77, + 0x08, 0xA8, 0x08, 0x0A, 0x06, 0x77, 0x00, 0xA1, 0x0E, 0x77, 0x00, 0xA4, + 0x10, 0x40, 0x46, 0xDF, 0x38, 0xE4, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, + 0x08, 0x0B, 0x00, 0xA2, 0x00, 0x0C, 0x6C, 0xE4, 0x52, 0xC6, 0x7D, 0xC6, + 0x9B, 0xE4, 0xDB, 0xE4, 0x60, 0x40, 0xD0, 0xB8, 0x18, 0xDE, 0x01, 0x08, + 0x03, 0x18, 0x11, 0x08, 0x13, 0x18, 0x11, 0x08, 0x23, 0x18, 0x21, 0x08, + 0x33, 0x18, 0x31, 0x08, 0x43, 0x18, 0x31, 0x08, 0x53, 0x18, 0x04, 0x08, + 0x0D, 0x18, 0x01, 0x40, 0x10, 0xB8, 0xC4, 0xC4, 0xC1, 0xC2, 0xC4, 0xCD, + 0x01, 0x40, 0x90, 0xB8, 0x01, 0x40, 0x2F, 0xBF, 0x1E, 0xD8, 0x8A, 0xE4, + 0x02, 0xE4, 0x81, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0xF0, 0xD5, 0xE0, 0xC6, + 0xE0, 0xD5, 0x01, 0x08, 0x20, 0x40, 0x29, 0x18, 0x11, 0x08, 0x20, 0x40, + 0x39, 0x18, 0x21, 0x08, 0x20, 0x40, 0x09, 0x18, 0x31, 0x08, 0x20, 0x40, + 0x19, 0x18, 0x01, 0x40, 0x10, 0xB8, 0xC4, 0xC4, 0xC1, 0xC2, 0xC4, 0xCD, + 0x01, 0x40, 0x90, 0xB8, 0x01, 0x40, 0x2F, 0xBF, 0xE2, 0xDB, 0x6C, 0x40, + 0x0B, 0x08, 0x02, 0x77, 0x08, 0xA0, 0x00, 0x09, 0x89, 0xBD, 0x6C, 0x40, + 0x0B, 0x18, 0x0C, 0xE4, 0x52, 0xC0, 0x7D, 0xC0, 0x05, 0xD5, 0x01, 0xA8, + 0x08, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0x20, 0x40, 0xB0, 0xB8, + 0x0C, 0x40, 0xD8, 0xE1, 0x08, 0x1B, 0x84, 0x90, 0x10, 0xA9, 0x85, 0x99, + 0x01, 0xA9, 0x86, 0x99, 0x87, 0x90, 0x12, 0x40, 0xA1, 0xDF, 0x01, 0xA8, + 0x08, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0x01, 0xB1, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x00, 0x02, 0x77, 0x08, 0xA8, 0x08, 0x09, + 0x79, 0xE0, 0x6C, 0x40, 0x00, 0x08, 0x89, 0xBC, 0x6C, 0x40, 0x00, 0x18, + 0x01, 0xA8, 0x01, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x05, 0x77, 0x08, 0xA0, + 0x00, 0x08, 0x05, 0x77, 0x0C, 0xA9, 0x09, 0x01, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA0, 0x00, 0x09, 0x70, 0x40, 0x98, 0xB8, 0x0F, 0xA0, 0x09, 0x18, + 0xC4, 0xC9, 0xDF, 0xC0, 0x81, 0xB8, 0xE0, 0xC0, 0xFA, 0xDA, 0x03, 0xB0, + 0xA0, 0xE0, 0x01, 0xB1, 0x2C, 0xE1, 0x2D, 0xE1, 0x00, 0xA8, 0x01, 0x71, + 0x00, 0xA9, 0x09, 0x18, 0xFF, 0xA8, 0x01, 0x71, 0x08, 0xA9, 0x09, 0x18, + 0x01, 0xA8, 0x01, 0x71, 0x0C, 0xA9, 0x09, 0x18, 0x00, 0xA0, 0x6C, 0xEC, + 0xA0, 0xE1, 0x01, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x08, 0xE4, 0x18, 0xE4, + 0xE0, 0xC9, 0x01, 0xD4, 0x19, 0xE4, 0x28, 0xE1, 0xA0, 0xE1, 0x01, 0x71, + 0x00, 0xA9, 0x09, 0x08, 0x80, 0xBD, 0x09, 0x18, 0x00, 0x71, 0x08, 0xA9, + 0x09, 0x08, 0x81, 0xBD, 0x09, 0x18, 0x01, 0x71, 0x04, 0xA8, 0x08, 0x10, + 0x38, 0xE1, 0xA0, 0xE1, 0x03, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x28, 0xE1, + 0xA0, 0xE1, 0x01, 0x71, 0x00, 0xA1, 0x08, 0xE4, 0x70, 0xE0, 0x01, 0x09, + 0x90, 0xBC, 0x01, 0x19, 0x01, 0x71, 0x08, 0xA9, 0x09, 0x18, 0x38, 0xE1, + 0xA0, 0xE1, 0x03, 0xB0, 0xA0, 0xE0, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, + 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, + 0x01, 0xA0, 0x00, 0x70, 0x0C, 0xA8, 0x08, 0x01, 0x00, 0xA9, 0x05, 0xDE, + 0xC1, 0xC9, 0x06, 0xC0, 0x01, 0x40, 0x9F, 0xBF, 0x06, 0xD8, 0x81, 0xE4, + 0x80, 0xBC, 0xF8, 0xD5, 0x00, 0x70, 0x00, 0xA8, 0x08, 0x39, 0xFF, 0xB0, + 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0xFD, 0xB6, + 0x00, 0x40, 0x65, 0x64, 0x04, 0xA9, 0x09, 0x08, 0x00, 0xA0, 0x09, 0x10, + 0x40, 0x40, 0x00, 0xA9, 0x0E, 0x40, 0xE4, 0xDF, 0x03, 0xB6, 0xFF, 0xB0, + 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0xFD, 0xB6, + 0x00, 0x40, 0x65, 0x64, 0x04, 0xA9, 0x09, 0x08, 0x00, 0xA0, 0x09, 0x10, + 0x20, 0x40, 0x00, 0xA9, 0x0E, 0x40, 0xD2, 0xDF, 0x03, 0xB6, 0xFF, 0xB0, + 0xFF, 0xB2, 0xFF, 0xB4, 0x08, 0xE4, 0x63, 0xEC, 0x74, 0xEC, 0x80, 0xE4, + 0xA0, 0xE0, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0xFD, 0xB6, 0x7F, 0xEC, + 0xA0, 0xE1, 0x20, 0xE4, 0x80, 0x75, 0x04, 0xA8, 0x08, 0x09, 0x89, 0xE4, + 0x08, 0x40, 0x80, 0xBC, 0x0A, 0xD5, 0x00, 0x40, 0x94, 0xBC, 0x52, 0xD5, + 0x01, 0xA8, 0x15, 0x40, 0x2A, 0xDF, 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, + 0xFF, 0xB4, 0x89, 0xE4, 0x00, 0x40, 0x82, 0xBC, 0xF5, 0xD4, 0x08, 0xC2, + 0x00, 0x40, 0x2F, 0xBC, 0x00, 0x40, 0x65, 0x64, 0x04, 0xA9, 0x09, 0x03, + 0x09, 0x18, 0x0C, 0xA1, 0xD7, 0xE1, 0x17, 0xB8, 0x09, 0x77, 0x00, 0xA9, + 0x09, 0x12, 0x08, 0xE4, 0x80, 0xE4, 0x0A, 0xC8, 0x98, 0xE4, 0x09, 0x77, + 0x94, 0xB8, 0x81, 0xB8, 0x08, 0x08, 0x09, 0x18, 0xC1, 0xC0, 0x01, 0x40, + 0x07, 0xBF, 0xF4, 0xDB, 0x00, 0xA8, 0xC2, 0xDF, 0x07, 0x77, 0x0C, 0xA9, + 0x09, 0x18, 0x01, 0xA8, 0xBD, 0xDF, 0x08, 0x77, 0x00, 0xA9, 0x09, 0x18, + 0x02, 0xA8, 0xB8, 0xDF, 0x08, 0x77, 0x04, 0xA9, 0x09, 0x18, 0x60, 0x40, + 0x00, 0xA8, 0xB2, 0xDF, 0x08, 0x77, 0x08, 0xA9, 0x09, 0x18, 0x60, 0x40, + 0x01, 0xA8, 0xAC, 0xDF, 0x08, 0x77, 0x0C, 0xA9, 0x09, 0x18, 0xE7, 0xC2, + 0x06, 0xDC, 0x0A, 0xC2, 0x00, 0x40, 0xC0, 0x5E, 0x2C, 0xB8, 0x02, 0x08, + 0x88, 0xE0, 0x83, 0xE4, 0x10, 0x40, 0x00, 0xA9, 0x0E, 0x40, 0x6A, 0xDF, + 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x14, 0x40, 0xD3, 0xDF, + 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x83, 0xE4, 0x01, 0xA9, + 0x0E, 0x40, 0x5C, 0xDF, 0xF1, 0xDE, 0x83, 0xE4, 0x03, 0xA9, 0x0E, 0x40, + 0x57, 0xDF, 0xEC, 0xDE, 0x83, 0xE4, 0x06, 0xA9, 0x0E, 0x40, 0x52, 0xDF, + 0xE7, 0xDE, 0x83, 0xE4, 0x02, 0xA9, 0x0E, 0x40, 0x4D, 0xDF, 0xE2, 0xDE, + 0x83, 0xE4, 0x04, 0xA9, 0x0E, 0x40, 0x48, 0xDF, 0xDD, 0xDE, 0x83, 0xE4, + 0x05, 0xA9, 0x0E, 0x40, 0x43, 0xDF, 0xD8, 0xDE, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0xD6, 0xE1, 0x5C, 0x40, 0x06, 0xE4, 0x00, 0x01, 0xFF, 0x77, + 0x1F, 0xBC, 0xDF, 0x7F, 0x1F, 0xBC, 0x00, 0x11, 0x00, 0xA0, 0x00, 0x01, + 0x50, 0x40, 0x06, 0xE4, 0x00, 0x11, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0xD6, 0xE1, 0x0F, 0x4E, 0x00, 0xA3, + 0x58, 0x40, 0x06, 0xE4, 0x00, 0x01, 0x51, 0xE4, 0xFF, 0x7F, 0x5C, 0xBC, + 0x05, 0x02, 0x41, 0xE4, 0x00, 0x40, 0x42, 0xBC, 0x04, 0xD5, 0x00, 0x70, + 0x20, 0xBC, 0x41, 0xC2, 0x02, 0xDE, 0xFF, 0x4F, 0x2F, 0xBC, 0x32, 0xBF, + 0x03, 0xD4, 0x00, 0x40, 0x12, 0xB8, 0x00, 0x11, 0x00, 0xA0, 0x00, 0xA1, + 0x00, 0xA2, 0x00, 0xA3, 0x00, 0xA4, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0xFD, 0xB6, 0x00, 0x40, 0x65, 0x64, + 0x04, 0xA9, 0x09, 0x08, 0x00, 0xA0, 0x09, 0x10, 0x10, 0x40, 0x00, 0xA9, + 0x0D, 0x40, 0xEA, 0xDF, 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0x08, 0x29, 0xC1, 0xC9, 0x08, 0x39, + 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, + 0x08, 0x29, 0xDF, 0xC9, 0x08, 0x39, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0xC8, 0xE0, 0xA0, 0xE0, 0xC9, 0xE0, 0xA0, 0xE0, 0x20, 0xB5, 0x04, 0xB3, + 0x5F, 0xB1, 0xF8, 0xB6, 0x28, 0xE4, 0x0C, 0x40, 0xD8, 0xE1, 0x00, 0x40, + 0xF2, 0x63, 0x00, 0xA0, 0x00, 0x09, 0x08, 0x19, 0x00, 0xA3, 0x84, 0x93, + 0x02, 0xE4, 0x0A, 0x40, 0x00, 0xE6, 0x85, 0x90, 0x86, 0x93, 0x87, 0x93, + 0x10, 0x40, 0xE2, 0xDF, 0x00, 0x40, 0xF2, 0x63, 0x09, 0xA4, 0x04, 0x28, + 0xE1, 0xC8, 0x00, 0x40, 0x9C, 0xD5, 0xE0, 0xC2, 0x00, 0x40, 0x8F, 0xD5, + 0x00, 0x40, 0xF3, 0x63, 0x00, 0xA8, 0x08, 0x00, 0x00, 0x40, 0xF0, 0x63, + 0x00, 0xAA, 0x00, 0x40, 0xF0, 0x63, 0x04, 0xA6, 0x00, 0x40, 0xF2, 0x63, + 0x08, 0xA3, 0x00, 0x40, 0xF0, 0x63, 0x0C, 0xA4, 0x08, 0x76, 0x00, 0xA9, + 0x09, 0x08, 0x00, 0x18, 0x00, 0x08, 0x11, 0x40, 0x20, 0xDF, 0x00, 0x18, + 0x08, 0x76, 0x04, 0xA0, 0x00, 0x01, 0x00, 0x40, 0xF3, 0x63, 0x00, 0xA8, + 0x08, 0x09, 0x81, 0xE4, 0x0F, 0x40, 0x8F, 0xBC, 0x29, 0x18, 0x1D, 0xC1, + 0x1F, 0x40, 0x1E, 0xBC, 0x03, 0x40, 0x39, 0x28, 0x00, 0x40, 0x81, 0xBC, + 0x81, 0xBD, 0x03, 0x40, 0x39, 0x38, 0x00, 0x40, 0xF3, 0x63, 0x00, 0xA0, + 0x00, 0x09, 0x00, 0x40, 0xF2, 0x63, 0x00, 0xA0, 0x00, 0x08, 0x89, 0x18, + 0x00, 0x08, 0x0A, 0x40, 0x80, 0xB8, 0x00, 0x18, 0x8A, 0x28, 0x01, 0x40, + 0x89, 0x38, 0x00, 0x40, 0xF2, 0x63, 0x0C, 0xA0, 0x00, 0x08, 0x01, 0x40, + 0x98, 0x28, 0xC1, 0xC8, 0x01, 0x40, 0x99, 0x38, 0x00, 0x40, 0xF3, 0x63, + 0x04, 0xA0, 0x00, 0x08, 0x99, 0x18, 0x03, 0x40, 0x09, 0x28, 0xFC, 0x7F, + 0x8F, 0xBC, 0x01, 0x40, 0x80, 0xBD, 0x03, 0x40, 0x09, 0x38, 0x00, 0x40, + 0xF2, 0x63, 0x0C, 0xA8, 0x08, 0x00, 0x86, 0x28, 0x01, 0x40, 0xA0, 0x38, + 0x01, 0x40, 0x90, 0x28, 0x58, 0xE0, 0x01, 0x40, 0xB0, 0x38, 0x00, 0x40, + 0xF3, 0x63, 0x00, 0xA8, 0x08, 0x09, 0x29, 0x08, 0xC7, 0xC8, 0x0D, 0xC8, + 0x48, 0xE0, 0x09, 0x09, 0x98, 0xB8, 0x10, 0x19, 0x10, 0x08, 0x10, 0x40, + 0xCA, 0xDF, 0x10, 0x18, 0x00, 0x40, 0xF2, 0x63, 0x0C, 0xA9, 0x09, 0x08, + 0x10, 0xA9, 0x38, 0x19, 0x01, 0x40, 0x30, 0xDF, 0x03, 0x28, 0xC1, 0xC8, + 0x03, 0x38, 0x03, 0x28, 0x48, 0xE0, 0x84, 0x89, 0x89, 0xBF, 0x16, 0xDC, + 0x00, 0x40, 0xF3, 0x63, 0x00, 0xA0, 0x00, 0x08, 0x00, 0x40, 0xF2, 0x63, + 0x0C, 0xA9, 0x09, 0x18, 0x02, 0x40, 0x8C, 0xB8, 0x08, 0xE4, 0x00, 0x40, + 0xF3, 0x63, 0x00, 0xA8, 0x08, 0x10, 0xDF, 0xC2, 0x81, 0xD4, 0x00, 0xA8, + 0x08, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0xFF, 0xA8, 0x08, 0xB6, + 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x00, 0x40, 0xF2, 0x63, 0x0C, 0xA8, + 0x08, 0x00, 0x08, 0x76, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x18, 0x08, 0x76, + 0x04, 0xA8, 0x08, 0x01, 0x00, 0x08, 0x10, 0x40, 0x90, 0xDF, 0x00, 0x18, + 0x00, 0x40, 0xF2, 0x63, 0x0C, 0xA0, 0x00, 0x09, 0x81, 0xE4, 0x0F, 0x40, + 0x8F, 0xBC, 0x29, 0x18, 0x1D, 0xC1, 0x1F, 0x40, 0x1E, 0xBC, 0x03, 0x40, + 0x39, 0x28, 0x00, 0x40, 0x81, 0xBC, 0x81, 0xBD, 0x03, 0x40, 0x39, 0x38, + 0x00, 0x09, 0x00, 0x40, 0xF2, 0x63, 0x00, 0xA0, 0x00, 0x08, 0x89, 0x18, + 0x00, 0x08, 0x0A, 0x40, 0x80, 0xB8, 0x00, 0x18, 0x03, 0x40, 0x09, 0x28, + 0xFC, 0x7F, 0x8F, 0xBC, 0x01, 0x40, 0x80, 0xBD, 0x03, 0x40, 0x09, 0x38, + 0x04, 0x33, 0xDF, 0xC2, 0xFF, 0x7F, 0x2D, 0xDE, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0xFD, 0xB6, 0x00, 0x40, 0xF0, 0x63, 0x0A, 0xA0, 0x04, 0xDE, + 0x06, 0xA8, 0xFF, 0x7F, 0x05, 0xDF, 0x00, 0x38, 0x08, 0x76, 0x0C, 0xA9, + 0x09, 0x08, 0xE5, 0xC8, 0xF7, 0xDC, 0x02, 0xA8, 0x05, 0x76, 0x00, 0xA9, + 0x09, 0x18, 0x09, 0x08, 0x2B, 0xA8, 0x00, 0x71, 0x00, 0xA9, 0x09, 0x18, + 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0xFD, 0xB6, 0x08, 0x76, 0x0C, 0xA9, 0x09, 0x08, 0x48, 0xE0, + 0x04, 0xD4, 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0xFE, 0x7F, + 0xE3, 0xDF, 0x00, 0x40, 0xF0, 0x63, 0x0A, 0xA9, 0x09, 0x38, 0x03, 0xB6, + 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x0C, 0xB3, 0x1F, 0xB1, 0x0A, 0x9B, + 0x08, 0x00, 0x00, 0x76, 0x00, 0xA1, 0x01, 0x10, 0x18, 0x00, 0x00, 0x76, + 0x04, 0xA1, 0x01, 0x10, 0x28, 0x00, 0x00, 0x76, 0x08, 0xA1, 0x01, 0x10, + 0x38, 0x00, 0x00, 0x76, 0x0C, 0xA1, 0x01, 0x10, 0x01, 0x40, 0x28, 0x22, + 0x11, 0xC2, 0x00, 0x40, 0x2F, 0xBC, 0x01, 0xAA, 0x4A, 0xE4, 0x8A, 0xC4, + 0x08, 0x00, 0x01, 0x76, 0x00, 0xA1, 0x01, 0x10, 0x00, 0xA3, 0x01, 0x76, + 0x08, 0xA0, 0x00, 0x13, 0x00, 0x40, 0xF0, 0x63, 0x00, 0xA0, 0x80, 0x33, + 0x00, 0x40, 0xF0, 0x63, 0x02, 0xA0, 0x80, 0x33, 0x88, 0x81, 0x14, 0xB8, + 0xDF, 0xC1, 0x88, 0xC1, 0x98, 0x88, 0x84, 0xB8, 0xDF, 0xC8, 0x88, 0xC8, + 0xDF, 0xC1, 0x00, 0x40, 0xF0, 0x63, 0x04, 0xA0, 0x80, 0x31, 0xDF, 0xC8, + 0x00, 0x40, 0xF0, 0x63, 0x06, 0xA0, 0x80, 0x38, 0x09, 0x76, 0x00, 0xA1, + 0x01, 0x13, 0x00, 0x40, 0xF2, 0x63, 0x00, 0xA0, 0x00, 0x19, 0x00, 0x08, + 0xCF, 0xC8, 0xFF, 0x7F, 0x80, 0xBC, 0x00, 0x18, 0x00, 0x40, 0xF2, 0x63, + 0x04, 0xA8, 0x08, 0x1B, 0x20, 0xA8, 0x02, 0x76, 0x04, 0xA9, 0x09, 0x18, + 0x09, 0x76, 0x04, 0xA0, 0x00, 0x1A, 0x1F, 0xB0, 0x0C, 0xB2, 0xA0, 0xE0, + 0x07, 0xB1, 0x08, 0x09, 0x01, 0x76, 0x00, 0xA0, 0x00, 0x19, 0x18, 0x09, + 0x01, 0x76, 0x04, 0xA0, 0x00, 0x19, 0x10, 0xA9, 0x02, 0x76, 0x04, 0xA0, + 0x00, 0x19, 0xA8, 0x80, 0x00, 0x40, 0xF0, 0x63, 0x00, 0xA9, 0x89, 0x30, + 0xB8, 0x81, 0x00, 0x40, 0xF0, 0x63, 0x02, 0xA9, 0x89, 0x31, 0x88, 0x89, + 0x98, 0x82, 0x09, 0xB8, 0xDF, 0xC0, 0x00, 0x40, 0xF0, 0x63, 0x04, 0xA8, + 0x88, 0x30, 0x12, 0xB8, 0xDF, 0xC1, 0x00, 0x40, 0xF0, 0x63, 0x06, 0xA8, + 0x88, 0x31, 0x07, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x00, 0x40, 0xF3, 0x63, + 0x04, 0xA0, 0x00, 0x18, 0x08, 0x09, 0x01, 0x76, 0x0C, 0xA0, 0x00, 0x19, + 0x08, 0x40, 0x08, 0x28, 0x66, 0xC8, 0x02, 0x76, 0x00, 0xA9, 0x09, 0x18, + 0x01, 0xB0, 0xA0, 0xE0, 0x02, 0x76, 0x08, 0xA8, 0x08, 0x09, 0x01, 0xA8, + 0xE0, 0xC9, 0x01, 0xD4, 0x89, 0xE4, 0xA0, 0xE0, 0x00, 0x40, 0xF1, 0x63, + 0x00, 0xA9, 0x09, 0x08, 0xA0, 0xE0, 0x00, 0x40, 0xF1, 0x63, 0x04, 0xA9, + 0x09, 0x08, 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, 0x01, 0x40, 0x88, 0x29, + 0x00, 0x40, 0xF0, 0x63, 0x00, 0xA8, 0x88, 0x28, 0x89, 0xBF, 0x32, 0xD5, + 0x03, 0x40, 0x00, 0x28, 0xFF, 0x7F, 0x8E, 0xBC, 0x03, 0x40, 0x00, 0x38, + 0x01, 0x40, 0x90, 0x29, 0x00, 0x40, 0xF0, 0x63, 0x02, 0xA8, 0x88, 0x28, + 0x89, 0xBF, 0x32, 0xD5, 0x03, 0x40, 0x00, 0x28, 0xFF, 0x7F, 0x8B, 0xBC, + 0x03, 0x40, 0x00, 0x38, 0x01, 0x40, 0xA0, 0x29, 0x00, 0x40, 0xF0, 0x63, + 0x04, 0xA8, 0x88, 0x28, 0x89, 0xBF, 0x32, 0xD5, 0x03, 0x40, 0x00, 0x28, + 0xFF, 0x7F, 0x8D, 0xBC, 0x03, 0x40, 0x00, 0x38, 0x01, 0x40, 0xB0, 0x29, + 0x00, 0x40, 0xF0, 0x63, 0x06, 0xA8, 0x88, 0x28, 0x89, 0xBF, 0x32, 0xD5, + 0x03, 0x40, 0x00, 0x28, 0xFF, 0x7F, 0x87, 0xBC, 0x03, 0x40, 0x00, 0x38, + 0x01, 0xB0, 0xA0, 0xE0, 0x03, 0x40, 0x00, 0x28, 0x00, 0x40, 0x81, 0xBD, + 0x03, 0x40, 0x00, 0x38, 0x01, 0x40, 0x90, 0x29, 0x00, 0x40, 0xF0, 0x63, + 0x02, 0xA8, 0x88, 0x28, 0x89, 0xBF, 0xCE, 0xD4, 0x03, 0x40, 0x00, 0x28, + 0x00, 0x40, 0x84, 0xBD, 0x03, 0x40, 0x00, 0x38, 0x01, 0x40, 0xA0, 0x29, + 0x00, 0x40, 0xF0, 0x63, 0x04, 0xA8, 0x88, 0x28, 0x89, 0xBF, 0xCE, 0xD4, + 0x03, 0x40, 0x00, 0x28, 0x00, 0x40, 0x82, 0xBD, 0x03, 0x40, 0x00, 0x38, + 0x01, 0x40, 0xB0, 0x29, 0x00, 0x40, 0xF0, 0x63, 0x06, 0xA8, 0x88, 0x28, + 0x89, 0xBF, 0xCE, 0xD4, 0x03, 0x40, 0x00, 0x28, 0x00, 0x40, 0x88, 0xBD, + 0x03, 0x40, 0x00, 0x38, 0x01, 0xB0, 0xA0, 0xE0, 0x00, 0xA8, 0x00, 0x40, + 0xF3, 0x63, 0x08, 0xA9, 0x09, 0x18, 0xA0, 0xE0, 0x20, 0xB5, 0x07, 0xB1, + 0xFD, 0xB6, 0x28, 0xE4, 0x19, 0xE4, 0x0A, 0x90, 0x01, 0xA8, 0xEA, 0x40, + 0x11, 0xDF, 0x00, 0x40, 0xF4, 0x63, 0x00, 0xA8, 0x08, 0x10, 0x00, 0x40, + 0xF3, 0x63, 0x0C, 0xA8, 0x08, 0x11, 0x82, 0xE4, 0x00, 0x40, 0xA9, 0xDF, + 0x00, 0xA8, 0xEA, 0x40, 0x03, 0xDF, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x28, 0xE1, 0xA0, 0xE1, 0x00, 0x40, + 0xF3, 0x63, 0x08, 0xA0, 0x00, 0x09, 0xDF, 0xC9, 0x00, 0x19, 0x38, 0xE1, + 0xA0, 0xE1, 0x00, 0x40, 0x94, 0xDF, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0xFD, 0xB6, 0x00, 0xA8, 0x17, 0x40, 0x94, 0xDF, 0x04, 0xDE, + 0xB0, 0xE0, 0xB0, 0xE0, 0xB0, 0xE0, 0xB0, 0xE0, 0x00, 0x40, 0xF3, 0x63, + 0x08, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0xF6, 0xD4, 0x01, 0xA8, 0x03, 0xB6, + 0x40, 0xB4, 0x01, 0xB1, 0x00, 0x40, 0xF3, 0x63, 0x08, 0xA0, 0x00, 0x08, + 0x00, 0xA9, 0x98, 0xBA, 0x98, 0xBD, 0x7D, 0xC9, 0x01, 0xA8, 0x89, 0xBA, + 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x98, 0xE4, + 0x00, 0x40, 0xF4, 0x63, 0x04, 0xA0, 0x00, 0x08, 0xE3, 0xC8, 0x1E, 0xD5, + 0x07, 0xDB, 0xE4, 0xC8, 0x2F, 0xD5, 0xE5, 0xC8, 0x50, 0xD5, 0x03, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0xE1, 0xC8, 0x3A, 0xD5, 0xE2, 0xC8, 0xF9, 0xD4, + 0x28, 0xE1, 0xA0, 0xE1, 0x00, 0x40, 0xF3, 0x63, 0x08, 0xA0, 0x00, 0x08, + 0xC1, 0xC8, 0x00, 0x18, 0x38, 0xE1, 0xA0, 0xE1, 0x89, 0xE4, 0x00, 0x40, + 0xF4, 0x63, 0x08, 0xA0, 0x00, 0x09, 0x05, 0x40, 0x15, 0xDF, 0xE7, 0xDE, + 0x28, 0xE1, 0xA0, 0xE1, 0x00, 0x40, 0xF3, 0x63, 0x08, 0xA0, 0x00, 0x08, + 0xC1, 0xC8, 0x00, 0x18, 0x38, 0xE1, 0xA0, 0xE1, 0x89, 0xE4, 0x00, 0x40, + 0xF4, 0x63, 0x08, 0xA0, 0x00, 0x09, 0x06, 0x40, 0x1D, 0xDF, 0x03, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0x28, 0xE1, 0xA0, 0xE1, 0x00, 0x40, 0xF3, 0x63, + 0x08, 0xA0, 0x00, 0x08, 0xC1, 0xC8, 0x00, 0x18, 0x38, 0xE1, 0xA0, 0xE1, + 0x89, 0xE4, 0x00, 0x40, 0xF4, 0x63, 0x08, 0xA0, 0x00, 0x09, 0x07, 0x40, + 0x7D, 0xDF, 0xC1, 0xDE, 0x28, 0xE1, 0xA0, 0xE1, 0x00, 0x40, 0xF3, 0x63, + 0x08, 0xA9, 0x09, 0x08, 0xC1, 0xC8, 0x09, 0x18, 0x38, 0xE1, 0xA0, 0xE1, + 0x00, 0x40, 0xF4, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x03, 0x40, 0x90, 0xDF, + 0xB0, 0xDE, 0x28, 0xE1, 0xA0, 0xE1, 0x00, 0x40, 0xF3, 0x63, 0x08, 0xA0, + 0x00, 0x08, 0xC1, 0xC8, 0x00, 0x18, 0x38, 0xE1, 0xA0, 0xE1, 0x89, 0xE4, + 0x00, 0x40, 0xF4, 0x63, 0x08, 0xA0, 0x00, 0x09, 0x08, 0x40, 0xDA, 0xDF, + 0x9E, 0xDE, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x00, 0xA8, + 0xE9, 0x40, 0x56, 0xDF, 0x00, 0x40, 0xF3, 0x63, 0x0C, 0xA8, 0x08, 0x00, + 0x81, 0xE4, 0x00, 0x40, 0xF4, 0x63, 0x00, 0xA9, 0x90, 0xE0, 0x08, 0xE4, + 0x01, 0xA8, 0xE9, 0x40, 0x49, 0xDF, 0xE0, 0xC0, 0x03, 0xD4, 0x03, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0xFF, 0x7F, 0x73, 0xDF, 0x03, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFC, 0xB6, 0x00, 0x40, + 0xF6, 0x63, 0x04, 0xA0, 0x00, 0x08, 0xD0, 0xC8, 0x03, 0x77, 0x04, 0xA9, + 0x09, 0x18, 0x02, 0x77, 0x00, 0xA0, 0x00, 0x08, 0x00, 0x49, 0x80, 0xB8, + 0x03, 0x77, 0x00, 0xA0, 0x00, 0x09, 0x98, 0xBF, 0x10, 0xD6, 0x00, 0x48, + 0x00, 0xA8, 0x04, 0x73, 0x0C, 0xA9, 0x09, 0x18, 0x03, 0x73, 0x00, 0xA0, + 0x00, 0x18, 0x03, 0x73, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x48, 0x80, 0xBC, + 0x00, 0x48, 0x80, 0xBF, 0xF8, 0xD5, 0x03, 0x77, 0x00, 0xA0, 0x00, 0x08, + 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA9, 0x09, 0x18, 0x02, 0x77, 0x00, 0xA0, + 0x00, 0x08, 0x00, 0x49, 0x80, 0xB8, 0x09, 0x09, 0x89, 0xBF, 0xF1, 0xDC, + 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0xF6, 0x63, + 0x04, 0xA0, 0x00, 0x09, 0x89, 0xBA, 0xCF, 0xC8, 0xFF, 0x7F, 0x80, 0xBC, + 0x02, 0x77, 0x00, 0xA0, 0x00, 0x09, 0x83, 0x99, 0x00, 0x40, 0xF6, 0x63, + 0x04, 0xA0, 0x00, 0x09, 0x16, 0x40, 0x1B, 0xDF, 0x00, 0x40, 0xF5, 0x63, + 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0xF6, 0x63, 0x00, 0xA0, 0x00, 0x09, + 0x89, 0xBA, 0x03, 0x77, 0x04, 0xA9, 0x09, 0x18, 0x03, 0x77, 0x00, 0xA0, + 0x00, 0x09, 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x98, 0xBF, + 0x0A, 0xDD, 0x00, 0x08, 0x00, 0x40, 0xF6, 0x63, 0x00, 0xA0, 0x00, 0x09, + 0x89, 0xB8, 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA9, 0x09, 0x18, 0x00, 0x40, + 0xF6, 0x63, 0x00, 0xA0, 0x00, 0x08, 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA0, + 0x00, 0x09, 0x89, 0xBA, 0x03, 0x77, 0x00, 0xA0, 0x00, 0x09, 0x89, 0xB8, + 0xFF, 0x48, 0x8F, 0xBF, 0xDD, 0xDD, 0x00, 0x08, 0x00, 0x40, 0xF5, 0x63, + 0x0C, 0xA9, 0x09, 0x18, 0x09, 0x08, 0x02, 0x77, 0x00, 0xA0, 0x00, 0x09, + 0x89, 0xBA, 0x01, 0x40, 0x80, 0xBF, 0x18, 0xDC, 0x00, 0x40, 0xF6, 0x63, + 0x04, 0xA9, 0x09, 0x08, 0xD0, 0xC8, 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA0, + 0x00, 0x18, 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x00, 0x40, + 0xF6, 0x63, 0x00, 0xA0, 0x00, 0x09, 0x89, 0xBA, 0x12, 0x78, 0x00, 0xA9, + 0x09, 0x18, 0x04, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0xF5, 0x63, + 0x0C, 0xA9, 0x09, 0x08, 0xD0, 0xC8, 0x09, 0x18, 0xEA, 0xDE, 0x01, 0xB1, + 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x03, 0x77, 0x04, 0xA9, + 0x09, 0x18, 0x03, 0x77, 0x00, 0xA0, 0x00, 0x09, 0x00, 0x40, 0xF5, 0x63, + 0x08, 0xA0, 0x00, 0x08, 0x98, 0xBF, 0x0A, 0xDD, 0x00, 0x08, 0x00, 0x40, + 0xF6, 0x63, 0x00, 0xA0, 0x00, 0x09, 0x89, 0xB8, 0x00, 0x40, 0xF5, 0x63, + 0x08, 0xA9, 0x09, 0x18, 0x00, 0x40, 0xF6, 0x63, 0x00, 0xA0, 0x00, 0x08, + 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA0, 0x00, 0x09, 0x89, 0xBA, 0x03, 0x77, + 0x00, 0xA0, 0x00, 0x09, 0x89, 0xB8, 0xFF, 0x48, 0x8F, 0xBF, 0x10, 0xDC, + 0x00, 0x48, 0x00, 0xA8, 0x04, 0x73, 0x0C, 0xA9, 0x09, 0x18, 0x03, 0x73, + 0x00, 0xA0, 0x00, 0x18, 0x03, 0x73, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x48, + 0x80, 0xBC, 0x00, 0x48, 0x80, 0xBF, 0xF8, 0xD5, 0x00, 0x40, 0xF6, 0x63, + 0x00, 0xA0, 0x00, 0x08, 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA0, 0x00, 0x09, + 0x89, 0xBA, 0x03, 0x77, 0x00, 0xA0, 0x00, 0x09, 0x89, 0xB8, 0xFF, 0x48, + 0x8F, 0xBF, 0xF0, 0xDD, 0x00, 0x08, 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA9, + 0x09, 0x18, 0x09, 0x08, 0x02, 0x77, 0x00, 0xA0, 0x00, 0x09, 0x89, 0xBA, + 0x01, 0x40, 0x80, 0xBF, 0x0B, 0xDC, 0x00, 0x40, 0xF6, 0x63, 0x04, 0xA9, + 0x09, 0x08, 0xD0, 0xC8, 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA0, 0x00, 0x18, + 0x01, 0xB0, 0xA0, 0xE0, 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA9, 0x09, 0x08, + 0xD0, 0xC8, 0x09, 0x18, 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x01, 0xB1, + 0xFC, 0xB6, 0x02, 0x77, 0x04, 0xA0, 0x00, 0x08, 0x00, 0x40, 0xF6, 0x63, + 0x00, 0xA9, 0x09, 0x18, 0x02, 0x77, 0x00, 0xA0, 0x00, 0x08, 0x02, 0x77, + 0x04, 0xA0, 0x00, 0x09, 0x89, 0xB8, 0x00, 0x40, 0xF6, 0x63, 0x04, 0xA9, + 0x09, 0x18, 0x1E, 0x78, 0x00, 0xA0, 0x00, 0x08, 0x00, 0x40, 0xF5, 0x63, + 0x08, 0xA9, 0x09, 0x18, 0x00, 0x40, 0xF6, 0x63, 0x04, 0xA0, 0x00, 0x08, + 0x03, 0x77, 0x04, 0xA9, 0x09, 0x18, 0x00, 0x48, 0x00, 0xA8, 0x04, 0x73, + 0x0C, 0xA0, 0x00, 0x18, 0x03, 0x73, 0x00, 0xA9, 0x09, 0x18, 0x77, 0xA8, + 0x0E, 0x77, 0x0C, 0xA0, 0x00, 0x18, 0x0E, 0x77, 0x0C, 0xA9, 0x09, 0x08, + 0x07, 0x40, 0x87, 0xBF, 0xFA, 0xD5, 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA0, + 0x00, 0x08, 0x00, 0x40, 0xF6, 0x63, 0x04, 0xA0, 0x00, 0x09, 0x89, 0xBA, + 0xCF, 0xC8, 0xFF, 0x7F, 0x80, 0xBC, 0x02, 0x77, 0x00, 0xA0, 0x00, 0x09, + 0x83, 0x99, 0x00, 0x40, 0xF6, 0x63, 0x04, 0xA0, 0x00, 0x09, 0x15, 0x40, + 0x0A, 0xDF, 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, + 0xF6, 0x63, 0x00, 0xA0, 0x00, 0x09, 0x89, 0xBA, 0x12, 0x78, 0x00, 0xA9, + 0x09, 0x18, 0x04, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, + 0xFD, 0xB6, 0xE0, 0xC8, 0x11, 0xD5, 0x01, 0x77, 0x08, 0xA0, 0x00, 0x08, + 0x00, 0x40, 0xC3, 0x5E, 0x80, 0xB8, 0x00, 0x40, 0xF4, 0x63, 0x0C, 0xA9, + 0x09, 0x18, 0x02, 0x77, 0x00, 0xA0, 0x00, 0x08, 0x00, 0x40, 0xF5, 0x63, + 0x00, 0xA9, 0x09, 0x18, 0x00, 0xA9, 0x01, 0xA2, 0x03, 0x78, 0x00, 0xA0, + 0x00, 0x12, 0x00, 0x40, 0xF4, 0x63, 0x0C, 0xA0, 0x00, 0x08, 0x10, 0x78, + 0x0C, 0xA0, 0x00, 0x18, 0x00, 0x40, 0xF5, 0x63, 0x00, 0xA0, 0x00, 0x08, + 0x11, 0x78, 0x00, 0xA0, 0x00, 0x18, 0x0F, 0x48, 0x0E, 0xA8, 0x01, 0x78, + 0x0C, 0xA0, 0x00, 0x18, 0x1F, 0x78, 0x0C, 0xA8, 0x08, 0x19, 0x00, 0x78, + 0x00, 0xA0, 0x00, 0x19, 0x09, 0xE4, 0x00, 0x40, 0xC3, 0x5E, 0x00, 0xA1, + 0x90, 0xE4, 0x42, 0xC9, 0x81, 0x88, 0xC2, 0xC1, 0x98, 0xBD, 0x00, 0x78, + 0x04, 0xA8, 0x08, 0x19, 0xC1, 0xC0, 0x1F, 0x40, 0x0F, 0xBF, 0xF4, 0xDB, + 0x00, 0x77, 0x08, 0xA9, 0x09, 0x08, 0x41, 0xC8, 0x10, 0x78, 0x04, 0xA9, + 0x09, 0x18, 0x00, 0x78, 0x00, 0xA0, 0x00, 0x12, 0x01, 0xA9, 0x89, 0xE4, + 0x04, 0x40, 0xC1, 0xDF, 0xBB, 0x4F, 0x0B, 0xA8, 0x08, 0x40, 0x00, 0xDF, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0x11, 0xA8, + 0x8F, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x1F, 0xA8, 0xB0, 0xE0, 0xB0, 0xE0, + 0xB0, 0xE0, 0xB0, 0xE0, 0xDF, 0xC8, 0xE0, 0xC8, 0xF9, 0xDA, 0x8F, 0x78, + 0x04, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0xFB, 0xD4, 0x3F, 0x40, 0x0F, 0x70, + 0x0F, 0xA8, 0x05, 0x73, 0x00, 0xA9, 0x09, 0x18, 0x1F, 0xA8, 0xB0, 0xE0, + 0xB0, 0xE0, 0xB0, 0xE0, 0xB0, 0xE0, 0xDF, 0xC8, 0xE0, 0xC8, 0xF9, 0xDA, + 0x00, 0xA8, 0x05, 0x73, 0x00, 0xA9, 0x09, 0x18, 0x8F, 0x78, 0x00, 0xA9, + 0x09, 0x18, 0xBB, 0x4F, 0x0B, 0xA8, 0x07, 0x40, 0xD1, 0xDF, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0x01, 0xA8, 0x58, 0x40, 0x09, 0x18, + 0xFD, 0x7F, 0x26, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x04, 0xA8, 0x10, 0x78, + 0x08, 0xA9, 0x09, 0x18, 0x01, 0xA8, 0x01, 0x78, 0x00, 0xA9, 0x09, 0x18, + 0xA0, 0xE0, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0xFD, 0xB6, 0x01, 0x78, + 0x04, 0xA1, 0x01, 0x00, 0x80, 0xE4, 0x00, 0x40, 0x82, 0xBC, 0x1C, 0xD5, + 0x02, 0xA8, 0x00, 0x78, 0x08, 0xA9, 0x09, 0x18, 0x01, 0xA8, 0x00, 0x78, + 0x0C, 0xA9, 0x09, 0x18, 0x2E, 0xA8, 0x00, 0x71, 0x00, 0xA1, 0x01, 0x18, + 0x10, 0xE4, 0x03, 0x40, 0x1E, 0xBC, 0x1F, 0xD4, 0x00, 0x48, 0x00, 0xBC, + 0x05, 0xD5, 0x1A, 0x78, 0x00, 0xA9, 0x09, 0x08, 0xE1, 0xC8, 0x20, 0xD5, + 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x80, 0xE4, 0x00, 0x40, + 0x84, 0xBC, 0x05, 0xD5, 0x04, 0xA8, 0x00, 0x78, 0x08, 0xA1, 0x01, 0x18, + 0xDF, 0xDE, 0x80, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0x0D, 0xD4, 0x80, 0xE4, + 0x02, 0x40, 0x80, 0xBC, 0x15, 0xD5, 0x20, 0xA8, 0xF2, 0xDE, 0x00, 0xA8, + 0xFC, 0x7F, 0xFE, 0xDF, 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0x10, 0xA8, 0xC9, 0xDE, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, + 0x81, 0xE4, 0x6D, 0x40, 0x19, 0x09, 0x02, 0x40, 0xBC, 0xDF, 0xD6, 0xDE, + 0x80, 0xE4, 0x04, 0x40, 0x80, 0xBC, 0x20, 0xD5, 0x02, 0x77, 0x08, 0xA9, + 0x09, 0x08, 0x11, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x36, 0xD5, 0x1E, 0x78, + 0x00, 0xA1, 0x01, 0x08, 0x00, 0x40, 0xF5, 0x63, 0x08, 0xA9, 0x09, 0x18, + 0x09, 0x09, 0x00, 0x40, 0xF6, 0x63, 0x04, 0xA1, 0x01, 0x08, 0x98, 0xBF, + 0x25, 0xDD, 0xFD, 0x7F, 0x95, 0xDF, 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA9, + 0x09, 0x08, 0x12, 0x78, 0x04, 0xA1, 0x01, 0x18, 0x40, 0xA8, 0x9B, 0xDE, + 0x80, 0xE4, 0x08, 0x40, 0x80, 0xBC, 0x0F, 0xD5, 0x08, 0x40, 0x00, 0xA9, + 0x00, 0x78, 0x08, 0xA1, 0x01, 0x19, 0x1E, 0x78, 0x00, 0xA1, 0x01, 0x08, + 0x03, 0x77, 0x04, 0xA1, 0x01, 0x18, 0x04, 0x73, 0x0C, 0xA8, 0x08, 0x19, + 0x8B, 0xDE, 0x80, 0xE4, 0x00, 0x48, 0x80, 0xBC, 0x0B, 0xD5, 0x00, 0x48, + 0x00, 0xA8, 0x81, 0xDE, 0xFE, 0x7F, 0x15, 0xDF, 0xDA, 0xDE, 0xFE, 0x7F, + 0x7D, 0xDF, 0x40, 0xA8, 0xFF, 0x7F, 0x79, 0xDE, 0x80, 0xE4, 0x00, 0x40, + 0x88, 0xBC, 0x02, 0xD5, 0x08, 0xA8, 0x93, 0xDE, 0x00, 0x78, 0x08, 0xA8, + 0x08, 0x10, 0xFF, 0x7F, 0x71, 0xDE, 0x01, 0x77, 0x08, 0xA9, 0x09, 0x08, + 0x8A, 0x78, 0x0C, 0xA9, 0x09, 0x18, 0x01, 0x77, 0x0C, 0xA9, 0x09, 0x08, + 0x8B, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x02, 0x77, 0x00, 0xA9, 0x09, 0x08, + 0x8B, 0x78, 0x04, 0xA9, 0x09, 0x18, 0x02, 0x77, 0x04, 0xA9, 0x09, 0x08, + 0x8B, 0x78, 0x08, 0xA9, 0x09, 0x18, 0x02, 0x77, 0x08, 0xA9, 0x09, 0x08, + 0x8B, 0x78, 0x0C, 0xA9, 0x09, 0x18, 0x02, 0x77, 0x0C, 0xA9, 0x09, 0x08, + 0x8C, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x03, 0x77, 0x00, 0xA9, 0x09, 0x08, + 0x8C, 0x78, 0x04, 0xA9, 0x09, 0x18, 0x03, 0x77, 0x04, 0xA9, 0x09, 0x08, + 0x8C, 0x78, 0x08, 0xA9, 0x09, 0x18, 0x03, 0x77, 0x08, 0xA9, 0x09, 0x08, + 0x8C, 0x78, 0x0C, 0xA9, 0x09, 0x18, 0x03, 0x77, 0x0C, 0xA9, 0x09, 0x08, + 0x8D, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x04, 0x77, 0x00, 0xA9, 0x09, 0x08, + 0x8D, 0x78, 0x04, 0xA9, 0x09, 0x18, 0x04, 0x77, 0x04, 0xA9, 0x09, 0x08, + 0x8D, 0x78, 0x08, 0xA9, 0x09, 0x18, 0x04, 0x77, 0x08, 0xA9, 0x09, 0x08, + 0x8D, 0x78, 0x0C, 0xA9, 0x09, 0x18, 0x04, 0x77, 0x0C, 0xA9, 0x09, 0x08, + 0x87, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x05, 0x77, 0x00, 0xA9, 0x09, 0x08, + 0x87, 0x78, 0x04, 0xA9, 0x09, 0x18, 0x05, 0x77, 0x04, 0xA9, 0x09, 0x08, + 0x87, 0x78, 0x08, 0xA9, 0x09, 0x18, 0x05, 0x77, 0x08, 0xA9, 0x09, 0x08, + 0x87, 0x78, 0x0C, 0xA9, 0x09, 0x18, 0x05, 0x77, 0x0C, 0xA9, 0x09, 0x08, + 0x88, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x06, 0x77, 0x00, 0xA9, 0x09, 0x08, + 0x88, 0x78, 0x04, 0xA9, 0x09, 0x18, 0x06, 0x77, 0x04, 0xA9, 0x09, 0x08, + 0x88, 0x78, 0x08, 0xA9, 0x09, 0x18, 0x06, 0x77, 0x08, 0xA9, 0x09, 0x08, + 0x88, 0x78, 0x0C, 0xA9, 0x09, 0x18, 0xA0, 0xE0, 0x01, 0xB1, 0x04, 0xDE, + 0xB0, 0xE0, 0xB0, 0xE0, 0xB0, 0xE0, 0xB0, 0xE0, 0x03, 0x78, 0x00, 0xA0, + 0x00, 0x08, 0xE0, 0xC8, 0xF7, 0xD4, 0x01, 0xA8, 0x10, 0x78, 0x08, 0xA0, + 0x00, 0x18, 0x10, 0x78, 0x0C, 0xA0, 0x00, 0x19, 0x1F, 0x78, 0x08, 0xA9, + 0x09, 0x18, 0x00, 0x48, 0x00, 0xA8, 0x1F, 0x78, 0x0C, 0xA0, 0x00, 0x18, + 0x01, 0xB0, 0xA0, 0xE0, 0x04, 0xDE, 0xB0, 0xE0, 0xB0, 0xE0, 0xB0, 0xE0, + 0xB0, 0xE0, 0x03, 0x78, 0x00, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0xF7, 0xD4, + 0x01, 0xA8, 0x1F, 0x78, 0x08, 0xA9, 0x09, 0x18, 0x02, 0xA8, 0x10, 0x78, + 0x08, 0xA9, 0x09, 0x18, 0x00, 0x44, 0x00, 0xA8, 0x1F, 0x78, 0x0C, 0xA9, + 0x09, 0x18, 0x04, 0xDE, 0xB0, 0xE0, 0xB0, 0xE0, 0xB0, 0xE0, 0xB0, 0xE0, + 0x1F, 0x78, 0x08, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0xF7, 0xD4, 0xA0, 0xE0, + 0x20, 0xB5, 0x57, 0xB1, 0xFB, 0xB6, 0x28, 0xE4, 0x88, 0x86, 0x98, 0x88, + 0x06, 0xE4, 0x08, 0xE6, 0x80, 0xE4, 0x14, 0xC8, 0xC4, 0x49, 0x80, 0xBF, + 0x01, 0x40, 0x1B, 0xDD, 0xC4, 0x49, 0x00, 0xA8, 0x00, 0x40, 0x5F, 0x64, + 0x04, 0xA9, 0x09, 0x18, 0x22, 0x09, 0x00, 0x40, 0x9F, 0xBC, 0x01, 0xA8, + 0x01, 0xD4, 0x89, 0xE4, 0x08, 0xE0, 0x96, 0xE4, 0x03, 0x40, 0x0F, 0xDF, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x09, 0x58, 0x40, 0x09, 0x08, + 0xE0, 0xC8, 0x01, 0x40, 0x0E, 0xD4, 0x00, 0xA0, 0x03, 0x78, 0x0C, 0xA8, + 0x08, 0x10, 0x0C, 0x40, 0x42, 0x29, 0x03, 0x40, 0x9F, 0xBC, 0x42, 0xC9, + 0x42, 0x08, 0xF0, 0x7F, 0xFF, 0x4F, 0x8F, 0xBC, 0x89, 0xBD, 0x42, 0x18, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x6C, 0x40, 0x80, 0xB8, + 0xFF, 0xA9, 0x28, 0x19, 0x01, 0xA9, 0x38, 0x19, 0x02, 0x40, 0x08, 0x30, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x74, 0x40, 0x28, 0x08, + 0x19, 0x78, 0x00, 0xA4, 0x04, 0x18, 0x02, 0x77, 0x08, 0xA8, 0x08, 0x01, + 0x02, 0x77, 0x0C, 0xA9, 0x09, 0x08, 0x12, 0xC8, 0x18, 0xBD, 0x02, 0x77, + 0x08, 0xA0, 0x00, 0x08, 0x25, 0xC8, 0x16, 0xC8, 0x18, 0xBD, 0x02, 0x77, + 0x00, 0xA4, 0x04, 0x08, 0x11, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x04, 0x08, + 0x02, 0x77, 0x04, 0xA0, 0x00, 0x09, 0x89, 0xB8, 0x11, 0x78, 0x04, 0xA4, + 0x04, 0x18, 0x11, 0x78, 0x08, 0xA8, 0x08, 0x11, 0x11, 0x78, 0x0C, 0xA0, + 0x92, 0xE4, 0x17, 0xA1, 0x09, 0x08, 0x00, 0x18, 0xC4, 0xC9, 0xC4, 0xC0, + 0xDF, 0xC1, 0xE0, 0xC1, 0xF9, 0xDA, 0x92, 0xE4, 0x01, 0x40, 0x90, 0xB8, + 0x09, 0x01, 0x00, 0x70, 0x1F, 0xBC, 0x09, 0x40, 0x70, 0xDF, 0xE0, 0xC8, + 0x0A, 0xD5, 0x0C, 0x40, 0x12, 0x88, 0xE0, 0xC8, 0x00, 0x40, 0xC5, 0xD4, + 0x0C, 0x40, 0x22, 0x28, 0xE0, 0xC8, 0x00, 0x40, 0xC0, 0xD5, 0x12, 0x78, + 0x0C, 0xA9, 0x09, 0x11, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x09, + 0x6A, 0x40, 0x09, 0x08, 0x17, 0x78, 0x0C, 0xA4, 0x04, 0x18, 0x05, 0x40, + 0xC2, 0x88, 0x0A, 0xC8, 0x89, 0xB8, 0x60, 0x40, 0x08, 0x01, 0x18, 0x78, + 0x00, 0xA8, 0x08, 0x11, 0x6C, 0x40, 0x19, 0x01, 0x12, 0xC1, 0x42, 0x08, + 0x00, 0x40, 0x83, 0xBC, 0xE3, 0xC8, 0x00, 0x40, 0x9E, 0xD5, 0x09, 0x40, + 0x44, 0xDF, 0xE0, 0xC8, 0x08, 0xD5, 0x0C, 0x40, 0x22, 0x28, 0xE0, 0xC8, + 0x04, 0xD5, 0x0C, 0x40, 0x02, 0x88, 0x0E, 0xC8, 0x18, 0xBD, 0x18, 0x78, + 0x08, 0xA9, 0x09, 0x11, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA4, 0x04, 0x00, + 0x01, 0x40, 0x92, 0x28, 0x03, 0x40, 0x8F, 0xBC, 0x00, 0x40, 0x8C, 0xE6, + 0x80, 0xB8, 0x40, 0x40, 0x08, 0x08, 0x19, 0x78, 0x0C, 0xA9, 0x09, 0x18, + 0x01, 0x40, 0x92, 0x28, 0x03, 0x40, 0x8F, 0xBC, 0x00, 0x40, 0x8C, 0xE6, + 0x80, 0xB8, 0x40, 0x40, 0x18, 0x08, 0x1A, 0x78, 0x00, 0xA4, 0x04, 0x18, + 0x01, 0x40, 0x92, 0x28, 0x03, 0x40, 0x8F, 0xBC, 0x00, 0x40, 0x8C, 0xE6, + 0x80, 0xB8, 0x40, 0x40, 0x28, 0x08, 0x1A, 0x78, 0x04, 0xA9, 0x09, 0x18, + 0x74, 0x40, 0x30, 0x08, 0x1A, 0x78, 0x08, 0xA4, 0x04, 0x18, 0x05, 0x40, + 0xC2, 0x88, 0x12, 0xC8, 0x80, 0xB8, 0x20, 0x40, 0x28, 0x08, 0x1A, 0x78, + 0x0C, 0xA9, 0x09, 0x18, 0x05, 0x40, 0xC2, 0x88, 0x12, 0xC8, 0x80, 0xB8, + 0x20, 0x40, 0x38, 0x08, 0x1B, 0x78, 0x00, 0xA4, 0x04, 0x18, 0x05, 0x40, + 0xC2, 0x88, 0x12, 0xC8, 0x80, 0xB8, 0x20, 0x40, 0x08, 0x08, 0x1B, 0x78, + 0x04, 0xA9, 0x09, 0x18, 0x05, 0x40, 0xC2, 0x88, 0x12, 0xC8, 0x80, 0xB8, + 0x20, 0x40, 0x18, 0x08, 0x1B, 0x78, 0x08, 0xA4, 0x04, 0x18, 0x58, 0x40, + 0x20, 0x09, 0x00, 0x40, 0x9F, 0xBC, 0x58, 0x40, 0x10, 0x08, 0x00, 0x40, + 0x8F, 0xBC, 0x22, 0xC8, 0x98, 0xBD, 0x1B, 0x78, 0x0C, 0xA8, 0x08, 0x19, + 0x06, 0xA8, 0x10, 0x78, 0x0C, 0xA9, 0x09, 0x18, 0x0C, 0x40, 0x32, 0x28, + 0x00, 0x40, 0xF5, 0x63, 0x04, 0xA0, 0x00, 0x18, 0x01, 0xA8, 0x03, 0x78, + 0x00, 0xA4, 0x04, 0x18, 0x02, 0xA8, 0x1F, 0x78, 0x0C, 0xA9, 0x09, 0x18, + 0x05, 0xB6, 0x57, 0xB0, 0x40, 0xB4, 0xF9, 0x40, 0x8F, 0xBF, 0xFE, 0x7F, + 0xE3, 0xDC, 0xFA, 0x40, 0x00, 0xA8, 0x00, 0x40, 0x5F, 0x64, 0x04, 0xA4, + 0x04, 0x18, 0xFE, 0x7F, 0xDF, 0xDE, 0x1F, 0xA8, 0x83, 0x98, 0x00, 0xA0, + 0x84, 0x90, 0x89, 0xE4, 0x90, 0xE4, 0x01, 0x40, 0xA6, 0xDF, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA4, 0x04, 0x08, 0x58, 0x40, 0x08, 0x10, 0xFE, 0x7F, + 0xE2, 0xDE, 0x00, 0x44, 0x10, 0xBD, 0xFF, 0x7F, 0x5E, 0xDE, 0x08, 0x40, + 0x7A, 0xDF, 0x18, 0xBD, 0xFF, 0x7F, 0x3B, 0xDE, 0x20, 0xB5, 0x3C, 0xB3, + 0x5F, 0xB1, 0xFD, 0xB6, 0xC8, 0xE4, 0xD9, 0xE4, 0x99, 0x06, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x0A, 0xBC, 0xE4, 0x0A, 0xCB, 0x0B, 0xE4, + 0x0A, 0xB8, 0x6C, 0x40, 0x00, 0xB8, 0x06, 0x09, 0x3F, 0x40, 0x9F, 0xBC, + 0x20, 0x08, 0x89, 0xBF, 0x29, 0xD5, 0x20, 0x19, 0x00, 0xA9, 0x30, 0x08, + 0xE0, 0xC8, 0x2B, 0xD5, 0x30, 0x19, 0x00, 0xA4, 0x36, 0xE4, 0x13, 0xE4, + 0x01, 0x40, 0x18, 0xB8, 0x03, 0xE4, 0x04, 0x40, 0x01, 0xB8, 0x03, 0xA2, + 0x00, 0x29, 0x62, 0xC9, 0x10, 0x88, 0x42, 0xC8, 0x98, 0xBD, 0x20, 0x88, + 0x22, 0xC8, 0x98, 0xBD, 0x30, 0x88, 0x98, 0xBD, 0x01, 0x19, 0xC4, 0xC0, + 0xC4, 0xC1, 0xDF, 0xC2, 0xE0, 0xC2, 0xF0, 0xDA, 0xC1, 0xC4, 0x01, 0x40, + 0x30, 0xB8, 0xE1, 0xC4, 0xE4, 0xDD, 0x46, 0x28, 0x19, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x09, 0xD4, 0x8C, 0xE4, 0x9D, 0xE4, 0x1C, 0xDF, 0x03, 0xB6, + 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0x01, 0xA9, 0xD3, 0xDE, 0xAB, 0xB8, + 0x8C, 0xE4, 0x6C, 0x40, 0x3A, 0x09, 0xFE, 0x7F, 0x25, 0xDF, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x9B, 0xE4, 0x98, 0xB8, 0x6D, 0x40, + 0x19, 0x1D, 0x8C, 0xB8, 0x01, 0xA9, 0xDA, 0x40, 0x08, 0x39, 0x03, 0xB6, + 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, + 0xF8, 0xB6, 0xE8, 0xE4, 0xF9, 0xE4, 0x99, 0x0A, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA0, 0x00, 0x03, 0x83, 0xB8, 0xDA, 0x40, 0x08, 0x88, 0x6E, 0xE4, + 0x0A, 0xC6, 0xE0, 0xC8, 0x5A, 0xD4, 0x63, 0xB8, 0x6C, 0x40, 0x36, 0x09, + 0x00, 0x40, 0x91, 0xBC, 0x2A, 0xC9, 0x0A, 0x08, 0xBF, 0x7F, 0x8F, 0xBC, + 0x89, 0xBD, 0x0A, 0x18, 0x79, 0xC8, 0xE2, 0xC8, 0x00, 0x40, 0x8F, 0xD5, + 0x9F, 0xE4, 0x10, 0x78, 0x0C, 0xA1, 0x08, 0xA0, 0x09, 0x08, 0x01, 0x18, + 0xC4, 0xC9, 0xC4, 0xC1, 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xDA, 0x13, 0x78, + 0x00, 0xA1, 0x9A, 0xE4, 0x10, 0xA0, 0x09, 0x08, 0x01, 0x18, 0xC4, 0xC9, + 0xC4, 0xC1, 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xDA, 0x06, 0x40, 0x1A, 0x08, + 0x19, 0x78, 0x04, 0xA0, 0x00, 0x18, 0x06, 0x40, 0x2A, 0x08, 0x19, 0x78, + 0x08, 0xA9, 0x09, 0x18, 0x9E, 0xE4, 0x16, 0xC9, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA0, 0x00, 0x03, 0x93, 0xB8, 0x68, 0x40, 0x90, 0xB8, 0x17, 0x78, + 0x04, 0xA1, 0x07, 0xA0, 0x09, 0x08, 0x01, 0x18, 0xC4, 0xC9, 0xC4, 0xC1, + 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xDA, 0x03, 0x40, 0xEA, 0x28, 0x00, 0xA9, + 0xE0, 0xC8, 0x04, 0xD9, 0x0A, 0xC8, 0x83, 0xB8, 0x60, 0x40, 0x08, 0x09, + 0x16, 0x78, 0x0C, 0xA8, 0x08, 0x19, 0x01, 0xA8, 0x03, 0x78, 0x00, 0xA9, + 0x09, 0x18, 0x04, 0xA8, 0x1F, 0x78, 0x0C, 0xA0, 0x00, 0x18, 0x08, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x0C, 0x40, 0xD8, 0xE1, 0x06, 0x40, + 0x3A, 0x09, 0x08, 0x19, 0x80, 0x40, 0x00, 0xA9, 0x84, 0x99, 0x17, 0x40, + 0x00, 0xA9, 0x85, 0x99, 0x01, 0xA9, 0x86, 0x99, 0x00, 0xA9, 0x87, 0x99, + 0x08, 0x40, 0x84, 0xDF, 0x05, 0x40, 0x9A, 0xDF, 0xD8, 0xE4, 0x80, 0x40, + 0xD0, 0xB8, 0x00, 0x03, 0x6E, 0xE4, 0x0A, 0xC6, 0x86, 0xE4, 0x83, 0xB8, + 0x6C, 0x40, 0x38, 0x08, 0x40, 0x78, 0x00, 0xA1, 0xE0, 0xC8, 0x2B, 0xD4, + 0x00, 0xAB, 0xCB, 0xE4, 0x00, 0xA4, 0x2C, 0xE4, 0x2D, 0xB8, 0x92, 0xE4, + 0x0E, 0xA0, 0x09, 0x08, 0x01, 0x18, 0xC4, 0xC1, 0xDF, 0xC0, 0xC4, 0xC9, + 0xE0, 0xC0, 0xF9, 0xDA, 0xC4, 0xC1, 0xC1, 0xC4, 0x03, 0x40, 0x2C, 0xB8, + 0xE1, 0xC4, 0xF1, 0xDD, 0xC1, 0xCB, 0x07, 0x40, 0xC8, 0xB8, 0xE2, 0xCB, + 0xE9, 0xDD, 0x3E, 0xB8, 0x00, 0xA8, 0xDA, 0x40, 0x03, 0x38, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x03, 0xFF, 0x7F, 0x62, 0xDE, 0x00, 0x40, + 0xF5, 0x63, 0x04, 0xA9, 0x09, 0x08, 0x03, 0x40, 0xEA, 0x38, 0xFF, 0x7F, + 0x69, 0xDE, 0x58, 0x78, 0x00, 0xA1, 0xD2, 0xDE, 0x04, 0xB3, 0x5F, 0xB1, + 0xA8, 0xE4, 0x69, 0xE4, 0x99, 0x03, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, + 0x00, 0x02, 0x48, 0xE4, 0x0A, 0xC4, 0x04, 0xE4, 0x02, 0xB8, 0x6C, 0x40, + 0x00, 0xB8, 0x03, 0x01, 0x81, 0xE4, 0x3F, 0x40, 0x8F, 0xBC, 0x20, 0x09, + 0x98, 0xBF, 0x0C, 0xD5, 0x3F, 0x40, 0x9F, 0xBC, 0x81, 0xE4, 0xC0, 0x7F, + 0x80, 0xBC, 0x89, 0xBD, 0x03, 0x18, 0x00, 0xA9, 0x30, 0x08, 0xE0, 0xC8, + 0x53, 0xD5, 0x30, 0x19, 0x24, 0xB8, 0x6C, 0x40, 0x32, 0x08, 0x00, 0x40, + 0x81, 0xBC, 0x2A, 0xC8, 0x03, 0x09, 0xBF, 0x7F, 0x9F, 0xBC, 0x98, 0xBD, + 0x03, 0x19, 0x00, 0x40, 0xF5, 0x63, 0x04, 0xA9, 0x09, 0x08, 0x03, 0x40, + 0xE3, 0x38, 0x96, 0xE4, 0x11, 0x78, 0x0C, 0xA1, 0x02, 0xA0, 0x49, 0x08, + 0x01, 0x18, 0xC4, 0xC9, 0xC4, 0xC1, 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xDA, + 0x03, 0x08, 0x79, 0xC8, 0xE2, 0xC8, 0x34, 0xD5, 0x02, 0xA8, 0x12, 0x78, + 0x08, 0xA0, 0x00, 0x18, 0x03, 0x08, 0x13, 0x78, 0x00, 0xA9, 0x09, 0x18, + 0x9A, 0xE4, 0x16, 0xC9, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x02, + 0x92, 0xB8, 0x68, 0x40, 0x90, 0xB8, 0x17, 0x78, 0x04, 0xA1, 0x07, 0xA0, + 0x09, 0x08, 0x01, 0x18, 0xC4, 0xC9, 0xC4, 0xC1, 0xDF, 0xC0, 0xE0, 0xC0, + 0xF9, 0xDA, 0x03, 0x40, 0xE3, 0x28, 0x00, 0xA9, 0xE0, 0xC8, 0x04, 0xD9, + 0x0A, 0xC8, 0x82, 0xB8, 0x60, 0x40, 0x08, 0x09, 0x16, 0x78, 0x0C, 0xA8, + 0x08, 0x19, 0x01, 0xA8, 0x03, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x08, 0xA8, + 0x1F, 0x78, 0x0C, 0xA0, 0x00, 0x18, 0x5F, 0xB0, 0x04, 0xB2, 0xA0, 0xE0, + 0x01, 0xA9, 0xAB, 0xDE, 0x01, 0xA8, 0x12, 0x78, 0x08, 0xA9, 0x09, 0x18, + 0xCB, 0xDE, 0x20, 0xB5, 0x04, 0xB3, 0x1F, 0xB1, 0xFD, 0xB6, 0x0D, 0x9A, + 0x0E, 0x94, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, 0x01, 0x00, 0x58, 0x40, + 0x10, 0x01, 0x00, 0x40, 0x1F, 0xBC, 0x58, 0x40, 0x20, 0x03, 0x00, 0x40, + 0x3F, 0xBC, 0x01, 0xE4, 0x62, 0xC0, 0x21, 0xE4, 0x52, 0xC2, 0x02, 0xBD, + 0x21, 0xE4, 0x42, 0xC2, 0x02, 0xBD, 0x32, 0xC1, 0x01, 0xBD, 0x22, 0xC4, + 0x04, 0xBD, 0x12, 0xC3, 0x03, 0xBD, 0x10, 0x78, 0x0C, 0xA1, 0x01, 0x18, + 0x11, 0x78, 0x08, 0xA8, 0x08, 0x10, 0x00, 0xA8, 0x11, 0x78, 0x0C, 0xA0, + 0x00, 0x18, 0x11, 0x78, 0x00, 0xA1, 0x01, 0x19, 0x11, 0x78, 0x04, 0xA8, + 0x08, 0x1A, 0x01, 0xA8, 0x03, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x1F, 0x78, + 0x0C, 0xA0, 0x00, 0x18, 0x04, 0xDF, 0x03, 0xB6, 0x1F, 0xB0, 0x04, 0xB2, + 0x40, 0xB4, 0x00, 0x40, 0x81, 0xBC, 0x0A, 0xD5, 0x04, 0xDE, 0xB0, 0xE0, + 0xB0, 0xE0, 0xB0, 0xE0, 0xB0, 0xE0, 0x03, 0x78, 0x00, 0xA9, 0x09, 0x08, + 0xE0, 0xC8, 0xF7, 0xD4, 0xA0, 0xE0, 0x1C, 0xB3, 0x5F, 0xB1, 0xB8, 0xE4, + 0xC9, 0xE4, 0x04, 0x77, 0x04, 0xA0, 0x00, 0x01, 0x05, 0x77, 0x00, 0xA8, + 0x08, 0x03, 0x05, 0x77, 0x08, 0xA9, 0x09, 0x08, 0x98, 0xE4, 0x25, 0xC9, + 0x69, 0xE4, 0x00, 0x40, 0x61, 0xBC, 0x98, 0xE4, 0x3D, 0xC9, 0xA9, 0xE4, + 0x00, 0x40, 0xA1, 0xBC, 0x48, 0xE4, 0x00, 0x40, 0x41, 0xBC, 0x2C, 0xD5, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0x68, 0x40, 0x19, 0x13, + 0x2C, 0xE4, 0x03, 0x40, 0x2F, 0xB8, 0x82, 0xE4, 0xFC, 0x7F, 0x80, 0xBC, + 0x0A, 0xC8, 0x38, 0xB8, 0x46, 0xE0, 0x2C, 0xD5, 0x68, 0x40, 0x39, 0x13, + 0xCF, 0xCC, 0xFF, 0x7F, 0xC0, 0xBC, 0x00, 0x40, 0xCA, 0xE6, 0x07, 0x40, + 0xCF, 0xB8, 0xF8, 0x7F, 0xC0, 0xBC, 0x08, 0xCC, 0x3C, 0xB8, 0x0A, 0xE4, + 0x40, 0xE0, 0x2C, 0xD5, 0x69, 0x40, 0x19, 0x13, 0xE0, 0xCB, 0x6B, 0xD4, + 0xFC, 0x7F, 0x20, 0xBC, 0x00, 0x40, 0x25, 0xE6, 0x32, 0xB8, 0x69, 0x40, + 0x39, 0x13, 0x39, 0xDE, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x09, + 0x2C, 0xE4, 0x03, 0x40, 0x2F, 0xB8, 0x82, 0xE4, 0xFC, 0x7F, 0x80, 0xBC, + 0x0A, 0xC8, 0x68, 0x40, 0x19, 0x11, 0x18, 0xB8, 0x46, 0xE0, 0xD4, 0xD4, + 0xCF, 0xCC, 0xFF, 0x7F, 0xC0, 0xBC, 0x00, 0x40, 0xCA, 0xE6, 0x07, 0x40, + 0xCF, 0xB8, 0xF8, 0x7F, 0xC0, 0xBC, 0x08, 0xCC, 0x68, 0x40, 0x39, 0x11, + 0x1C, 0xB8, 0x0A, 0xE4, 0x40, 0xE0, 0xD4, 0xD4, 0x82, 0xE4, 0xFC, 0x7F, + 0x80, 0xBC, 0xA8, 0xE4, 0x00, 0x40, 0xA7, 0xE6, 0x00, 0x40, 0x85, 0xE6, + 0x69, 0x40, 0x19, 0x11, 0xE0, 0xCB, 0x29, 0xD4, 0x18, 0xB8, 0x82, 0xE4, + 0xFC, 0x7F, 0x80, 0xBC, 0x28, 0xE4, 0x0A, 0xC2, 0x00, 0x40, 0x83, 0xE6, + 0x69, 0x40, 0x39, 0x11, 0xE0, 0xCB, 0x29, 0xD5, 0x12, 0xB8, 0x68, 0x40, + 0x19, 0x08, 0x68, 0x40, 0x09, 0x18, 0x68, 0x40, 0x39, 0x08, 0x68, 0x40, + 0x29, 0x18, 0x69, 0x40, 0x19, 0x08, 0x69, 0x40, 0x09, 0x18, 0x69, 0x40, + 0x39, 0x08, 0x69, 0x40, 0x29, 0x18, 0x6A, 0x40, 0x09, 0x11, 0x2A, 0xC6, + 0x46, 0xBD, 0x0E, 0xC0, 0x40, 0xBD, 0x18, 0x78, 0x04, 0xA8, 0x08, 0x14, + 0x5F, 0xB0, 0x1C, 0xB2, 0xA0, 0xE0, 0x1A, 0xB8, 0x82, 0xE4, 0xFC, 0x7F, + 0x80, 0xBC, 0x28, 0xE4, 0x0A, 0xC2, 0x00, 0x40, 0x83, 0xE6, 0x69, 0x40, + 0x39, 0x11, 0xE0, 0xCB, 0xD7, 0xD4, 0x18, 0xB8, 0xD6, 0xDE, 0xFC, 0x7F, + 0x20, 0xBC, 0x00, 0x40, 0x27, 0xE6, 0x94, 0xDE, 0x20, 0xB5, 0x0C, 0xB3, + 0x5F, 0xB1, 0xFD, 0xB6, 0x69, 0xE4, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, + 0x00, 0x04, 0x00, 0xA8, 0x58, 0x40, 0x04, 0x18, 0x01, 0xAA, 0x03, 0x78, + 0x0C, 0xA1, 0x01, 0x1A, 0x0C, 0x40, 0xC9, 0x2B, 0x06, 0x40, 0x99, 0x88, + 0x06, 0x40, 0x89, 0x80, 0x1C, 0x40, 0x49, 0x82, 0x1C, 0x40, 0x59, 0x83, + 0x1D, 0x40, 0x09, 0x81, 0x00, 0x40, 0x5F, 0x64, 0x0C, 0xA9, 0x0A, 0xC8, + 0x84, 0xB8, 0x60, 0x40, 0x08, 0x08, 0x89, 0x18, 0x0A, 0xC0, 0x04, 0xB8, + 0x60, 0x40, 0x00, 0x08, 0x99, 0x18, 0x0A, 0xC2, 0x82, 0xE4, 0x84, 0xB8, + 0x70, 0x40, 0x28, 0x08, 0xB9, 0x18, 0x0A, 0xC3, 0x34, 0xB8, 0x70, 0x40, + 0x23, 0x08, 0xC9, 0x18, 0x0A, 0xC1, 0x81, 0xE4, 0x84, 0xB8, 0x70, 0x40, + 0x28, 0x08, 0xD9, 0x18, 0x74, 0x40, 0x24, 0x08, 0x02, 0x40, 0xC9, 0x38, + 0x41, 0xC8, 0x02, 0x40, 0xD9, 0x38, 0x0A, 0xC1, 0x14, 0xB8, 0x20, 0x40, + 0x01, 0x08, 0xE9, 0x18, 0x20, 0x40, 0x11, 0x08, 0xF9, 0x18, 0x20, 0x40, + 0x21, 0x08, 0x04, 0x40, 0x09, 0x18, 0x20, 0x40, 0x31, 0x08, 0x04, 0x40, + 0x19, 0x18, 0x0A, 0xC2, 0x24, 0xB8, 0x20, 0x40, 0x02, 0x08, 0x04, 0x40, + 0x29, 0x18, 0x20, 0x40, 0x12, 0x08, 0x04, 0x40, 0x39, 0x18, 0x20, 0x40, + 0x22, 0x08, 0x05, 0x40, 0x09, 0x18, 0x20, 0x40, 0x32, 0x08, 0x05, 0x40, + 0x19, 0x18, 0x19, 0x40, 0x46, 0x29, 0x09, 0xC9, 0x00, 0x40, 0x93, 0xBC, + 0x8A, 0xE4, 0x01, 0xD4, 0x89, 0xE4, 0x9B, 0xE4, 0x59, 0xE0, 0x01, 0x40, + 0x58, 0xDF, 0x00, 0x77, 0x08, 0xA1, 0x01, 0x08, 0x41, 0xC8, 0x10, 0x78, + 0x04, 0xA1, 0x01, 0x18, 0x05, 0x77, 0x08, 0xA9, 0x09, 0x08, 0x31, 0xC8, + 0x09, 0x09, 0x0D, 0xC9, 0x00, 0x40, 0x88, 0xBC, 0x10, 0x40, 0x90, 0xBC, + 0x89, 0xBD, 0x10, 0x78, 0x08, 0xA0, 0x00, 0x18, 0x00, 0x40, 0xF4, 0x63, + 0x0C, 0xA1, 0x01, 0x08, 0x10, 0x78, 0x0C, 0xA9, 0x09, 0x18, 0x10, 0xA8, + 0x11, 0x78, 0x00, 0xA0, 0x00, 0x18, 0x02, 0x77, 0x00, 0xA1, 0x01, 0x08, + 0x11, 0x78, 0x04, 0xA9, 0x09, 0x18, 0x01, 0x08, 0x02, 0x77, 0x04, 0xA0, + 0x00, 0x09, 0x89, 0xB8, 0x11, 0x78, 0x08, 0xA1, 0x01, 0x18, 0x02, 0x77, + 0x08, 0xA9, 0x09, 0x08, 0x11, 0x78, 0x0C, 0xA0, 0x00, 0x18, 0x0E, 0x40, + 0x47, 0xDF, 0x08, 0xE4, 0x1D, 0x40, 0x46, 0x28, 0x11, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0xE1, 0xC8, 0x00, 0x40, 0xBD, 0xD5, 0x12, 0x78, 0x00, 0xA1, + 0x01, 0x10, 0x02, 0x77, 0x04, 0xA9, 0x09, 0x08, 0x00, 0x40, 0xF6, 0x63, + 0x00, 0xA1, 0x01, 0x18, 0x02, 0x77, 0x00, 0xA9, 0x09, 0x08, 0x01, 0x09, + 0x89, 0xB8, 0x00, 0x40, 0xF6, 0x63, 0x04, 0xA1, 0x01, 0x18, 0x02, 0x77, + 0x08, 0xA9, 0x09, 0x08, 0x01, 0x40, 0x80, 0xBC, 0x45, 0xD5, 0x02, 0x77, + 0x04, 0xA1, 0x01, 0x08, 0x00, 0x40, 0xF6, 0x63, 0x00, 0xA9, 0x09, 0x18, + 0x02, 0x77, 0x00, 0xA1, 0x01, 0x08, 0x09, 0x09, 0x89, 0xB8, 0x00, 0x40, + 0xF6, 0x63, 0x04, 0xA9, 0x09, 0x18, 0x03, 0x77, 0x00, 0xA1, 0x01, 0x08, + 0x80, 0xBF, 0x05, 0xDD, 0x00, 0x40, 0xF6, 0x63, 0x00, 0xA9, 0x09, 0x08, + 0x08, 0xB8, 0x00, 0x40, 0xF6, 0x63, 0x00, 0xA1, 0x01, 0x08, 0x80, 0xBA, + 0x03, 0x77, 0x00, 0xA1, 0x01, 0x09, 0x89, 0xB8, 0xFF, 0x48, 0x8F, 0xBF, + 0xEA, 0xDD, 0x01, 0x08, 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA9, 0x09, 0x18, + 0x09, 0x08, 0x02, 0x77, 0x00, 0xA0, 0x00, 0x09, 0x89, 0xBA, 0x01, 0x40, + 0x80, 0xBF, 0x00, 0x40, 0x7E, 0xDC, 0x00, 0x40, 0xF6, 0x63, 0x04, 0xA1, + 0x01, 0x08, 0xD0, 0xC8, 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA9, 0x09, 0x18, + 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA1, 0x01, 0x08, 0x12, 0x78, 0x04, 0xA9, + 0x09, 0x18, 0x06, 0xDE, 0x03, 0x77, 0x00, 0xA0, 0x00, 0x08, 0x12, 0x78, + 0x04, 0xA1, 0x01, 0x18, 0x12, 0x78, 0x08, 0xA1, 0x00, 0x40, 0x5F, 0x64, + 0x0C, 0xA0, 0x0D, 0xA9, 0x00, 0x08, 0x01, 0x18, 0xC4, 0xC0, 0xC4, 0xC1, + 0xDF, 0xC9, 0xE0, 0xC9, 0xF9, 0xDA, 0x16, 0x78, 0x00, 0xA1, 0x13, 0x40, + 0x16, 0x08, 0xE0, 0xC8, 0x07, 0xD4, 0x04, 0x77, 0x04, 0xA9, 0x09, 0x08, + 0x80, 0x40, 0x80, 0xB8, 0x13, 0x40, 0x16, 0x18, 0x06, 0xE4, 0x0C, 0x40, + 0x04, 0xB8, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x58, 0x40, + 0x18, 0x09, 0x00, 0x40, 0x9F, 0xBC, 0x22, 0xC9, 0x00, 0x08, 0x89, 0xBD, + 0x16, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x1C, 0xA9, 0xC4, 0xC0, 0xC4, 0xC1, + 0x00, 0x08, 0x01, 0x18, 0xDF, 0xC9, 0xE0, 0xC9, 0xF9, 0xDA, 0x09, 0x77, + 0x0C, 0xA0, 0x00, 0x08, 0x1D, 0x78, 0x0C, 0xA1, 0x01, 0x18, 0x04, 0x77, + 0x04, 0xA9, 0x09, 0x08, 0x1E, 0x78, 0x00, 0xA0, 0x00, 0x18, 0x03, 0x77, + 0x08, 0xA1, 0x01, 0x08, 0x03, 0x77, 0x0C, 0xA0, 0x00, 0x09, 0x89, 0xB8, + 0x40, 0x7F, 0x80, 0xB8, 0xFC, 0x7F, 0x80, 0xBC, 0x1E, 0x78, 0x04, 0xA1, + 0x01, 0x18, 0x01, 0xA8, 0x03, 0x78, 0x00, 0xA9, 0x09, 0x18, 0x10, 0xA8, + 0x1F, 0x78, 0x0C, 0xA0, 0x00, 0x18, 0x03, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, + 0x40, 0xB4, 0x00, 0x40, 0x5F, 0x64, 0x00, 0xA1, 0x01, 0x10, 0x80, 0xE4, + 0x20, 0x40, 0x8F, 0xB8, 0xFF, 0x7F, 0x80, 0xBC, 0x12, 0x78, 0x00, 0xA9, + 0x09, 0x18, 0xFF, 0x7F, 0x38, 0xDE, 0x00, 0x40, 0xF5, 0x63, 0x0C, 0xA0, + 0x00, 0x08, 0xD0, 0xC8, 0x00, 0x18, 0x84, 0xDE, 0x07, 0xB1, 0x29, 0xE4, + 0x00, 0x77, 0x08, 0xA0, 0x00, 0x08, 0x41, 0xC8, 0x10, 0x78, 0x04, 0xA9, + 0x09, 0x18, 0x11, 0x78, 0x00, 0xA1, 0x92, 0xE4, 0x01, 0x40, 0x90, 0xB8, + 0x1A, 0xA0, 0x09, 0x08, 0x01, 0x18, 0xC4, 0xC9, 0xC4, 0xC1, 0xDF, 0xC0, + 0xE0, 0xC0, 0xF9, 0xDA, 0x00, 0x40, 0x63, 0x64, 0x04, 0xA9, 0x15, 0x78, + 0x0C, 0xA1, 0x03, 0xA0, 0x09, 0x08, 0x01, 0x18, 0xC4, 0xC9, 0xC4, 0xC1, + 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xDA, 0x16, 0x78, 0x0C, 0xA1, 0x00, 0x40, + 0x64, 0x64, 0x04, 0xA9, 0x03, 0xA0, 0x09, 0x08, 0x01, 0x18, 0xC4, 0xC9, + 0xC4, 0xC1, 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xDA, 0x17, 0x78, 0x0C, 0xA1, + 0x92, 0xE4, 0x07, 0x40, 0x9C, 0xB8, 0x02, 0xA0, 0x09, 0x08, 0x01, 0x18, + 0xC4, 0xC9, 0xC4, 0xC1, 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xDA, 0x01, 0xA8, + 0x03, 0x78, 0x00, 0xA0, 0x00, 0x18, 0x20, 0xA8, 0x1F, 0x78, 0x0C, 0xA9, + 0x09, 0x18, 0x07, 0xB0, 0xA0, 0xE0, 0x5F, 0xB1, 0x48, 0xE4, 0x09, 0xE4, + 0x04, 0x77, 0x04, 0xA8, 0x08, 0x09, 0x05, 0x77, 0x00, 0xA8, 0x08, 0x01, + 0x05, 0x77, 0x08, 0xA8, 0x08, 0x02, 0x00, 0x41, 0x90, 0xB8, 0x82, 0xE4, + 0x80, 0x40, 0x80, 0xBC, 0x25, 0xD5, 0x00, 0x40, 0x5F, 0x64, 0x0C, 0xA3, + 0x63, 0x11, 0x73, 0x11, 0x60, 0xE4, 0x56, 0xE0, 0x86, 0xE4, 0x03, 0x40, + 0x8F, 0xB8, 0x19, 0xC8, 0x22, 0xC8, 0x18, 0xB8, 0x00, 0x48, 0x20, 0xBC, + 0x25, 0xD5, 0xE0, 0xC4, 0x41, 0xD4, 0x23, 0x11, 0x33, 0x11, 0x03, 0x40, + 0x6F, 0xB8, 0xFC, 0x7F, 0x60, 0xBC, 0x00, 0x40, 0x65, 0xE6, 0x16, 0xB8, + 0x43, 0x11, 0x53, 0x11, 0x04, 0x77, 0x04, 0xA9, 0x09, 0x08, 0x1E, 0x78, + 0x00, 0xA0, 0x00, 0x18, 0x5F, 0xB0, 0xA0, 0xE0, 0x00, 0x40, 0x5F, 0x64, + 0x0C, 0xA3, 0x63, 0x19, 0x73, 0x19, 0x60, 0xE4, 0x56, 0xE0, 0x86, 0xE4, + 0x03, 0x40, 0x8F, 0xB8, 0x19, 0xC8, 0x22, 0xC8, 0x98, 0xB8, 0x00, 0x48, + 0x20, 0xBC, 0xDB, 0xD4, 0xE0, 0xC4, 0x13, 0xD4, 0x23, 0x19, 0x33, 0x19, + 0x03, 0x40, 0x6F, 0xB8, 0xFC, 0x7F, 0x60, 0xBC, 0x00, 0x40, 0x65, 0xE6, + 0x96, 0xB8, 0x43, 0x19, 0x53, 0x19, 0x04, 0x77, 0x04, 0xA9, 0x09, 0x08, + 0x1E, 0x78, 0x00, 0xA0, 0x00, 0x18, 0x5F, 0xB0, 0xA0, 0xE0, 0x23, 0x19, + 0x33, 0x19, 0x03, 0x40, 0x6F, 0xB8, 0xFC, 0x7F, 0x60, 0xBC, 0x00, 0x40, + 0x67, 0xE6, 0xEC, 0xDE, 0x23, 0x11, 0x33, 0x11, 0x03, 0x40, 0x6F, 0xB8, + 0xFC, 0x7F, 0x60, 0xBC, 0x00, 0x40, 0x67, 0xE6, 0xBE, 0xDE, 0x01, 0xB1, + 0x1D, 0x78, 0x04, 0xA0, 0x00, 0x09, 0x08, 0x19, 0x1D, 0x78, 0x08, 0xA0, + 0x00, 0x09, 0x18, 0x19, 0x1D, 0x78, 0x0C, 0xA0, 0x00, 0x09, 0x28, 0x19, + 0x1E, 0x78, 0x04, 0xA0, 0x00, 0x09, 0x38, 0x19, 0x1C, 0x78, 0x00, 0xA0, + 0x00, 0x09, 0x22, 0x40, 0x08, 0x19, 0x1B, 0x78, 0x04, 0xA0, 0x00, 0x09, + 0x21, 0x40, 0x28, 0x19, 0x1B, 0x78, 0x0C, 0xA0, 0x00, 0x09, 0x21, 0x40, + 0x38, 0x19, 0x1B, 0x78, 0x00, 0xA0, 0x00, 0x09, 0x21, 0x40, 0x18, 0x19, + 0x1E, 0x78, 0x00, 0xA0, 0x00, 0x09, 0x48, 0x19, 0x01, 0xB0, 0xA0, 0xE0, + 0x01, 0xB1, 0x01, 0xA8, 0x03, 0x78, 0x00, 0xA0, 0x00, 0x18, 0x00, 0x77, + 0x08, 0xA9, 0x09, 0x08, 0x41, 0xC8, 0x10, 0x78, 0x04, 0xA9, 0x09, 0x18, + 0x00, 0x40, 0xF4, 0x63, 0x0C, 0xA0, 0x00, 0x08, 0x10, 0x78, 0x0C, 0xA9, + 0x09, 0x18, 0x00, 0x40, 0xF5, 0x63, 0x00, 0xA0, 0x00, 0x08, 0x11, 0x78, + 0x00, 0xA9, 0x09, 0x18, 0x10, 0x40, 0x00, 0xA8, 0x1F, 0x78, 0x0C, 0xA0, + 0x00, 0x18, 0x03, 0x78, 0x00, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0xFB, 0xD4, + 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x01, 0xA9, 0x03, 0x78, 0x00, 0xA0, + 0x00, 0x19, 0x1D, 0x78, 0x08, 0xA9, 0x09, 0x18, 0x00, 0x41, 0x00, 0xA8, + 0x1F, 0x78, 0x0C, 0xA0, 0x00, 0x18, 0x03, 0x78, 0x00, 0xA9, 0x09, 0x08, + 0xE0, 0xC8, 0xFB, 0xD4, 0x01, 0xB0, 0xA0, 0xE0, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0x17, 0x98, 0xFF, 0x77, 0x8F, 0xBC, 0x97, 0x98, 0xFF, 0xB0, + 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0x17, 0x98, + 0x00, 0x48, 0x80, 0xBD, 0x97, 0x98, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0x20, 0xB5, 0x01, 0xB1, 0xFC, 0xB6, 0x02, 0x77, 0x04, 0xA0, 0x00, 0x08, + 0x41, 0xC8, 0x00, 0x40, 0xFE, 0x63, 0x00, 0xA9, 0x09, 0x18, 0x60, 0x49, + 0x00, 0xA9, 0x0D, 0x40, 0x02, 0xDF, 0xF1, 0x7F, 0x74, 0xDF, 0x00, 0x44, + 0x0A, 0xA8, 0x01, 0xA9, 0xF1, 0x7F, 0x83, 0xDF, 0x80, 0x40, 0xC0, 0x40, + 0x04, 0xA8, 0x00, 0xA9, 0xF1, 0x7F, 0x7D, 0xDF, 0x00, 0x6F, 0x00, 0xA8, + 0x02, 0x40, 0x45, 0xDF, 0x0F, 0xA0, 0x83, 0x90, 0x00, 0x6F, 0x00, 0xA8, + 0x05, 0xA9, 0x00, 0x40, 0xCE, 0xDF, 0x83, 0x90, 0x7F, 0xA8, 0x00, 0xA9, + 0x00, 0x40, 0xC9, 0xDF, 0x03, 0x77, 0x04, 0xA0, 0x00, 0x08, 0x00, 0x40, + 0xFD, 0x63, 0x08, 0xA9, 0x09, 0x18, 0xF5, 0x7F, 0x01, 0xDF, 0x04, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0x01, 0xB1, 0x00, 0x40, 0x28, 0x7D, 0x09, 0xA8, + 0x01, 0x77, 0x08, 0xA0, 0x00, 0x18, 0x09, 0x73, 0x00, 0xA9, 0x09, 0x08, + 0x01, 0x77, 0x0C, 0xA0, 0x00, 0x18, 0x09, 0x73, 0x04, 0xA9, 0x09, 0x08, + 0x02, 0x77, 0x00, 0xA0, 0x00, 0x18, 0x09, 0x73, 0x08, 0xA9, 0x09, 0x08, + 0x02, 0x77, 0x04, 0xA0, 0x00, 0x18, 0x09, 0x73, 0x0C, 0xA9, 0x09, 0x08, + 0x02, 0x77, 0x08, 0xA0, 0x00, 0x18, 0x0A, 0x73, 0x00, 0xA9, 0x09, 0x08, + 0x02, 0x77, 0x0C, 0xA0, 0x00, 0x18, 0x0A, 0x73, 0x04, 0xA9, 0x09, 0x08, + 0x03, 0x77, 0x00, 0xA0, 0x00, 0x18, 0x0A, 0x73, 0x08, 0xA9, 0x09, 0x08, + 0x03, 0x77, 0x04, 0xA0, 0x00, 0x18, 0x0A, 0x73, 0x0C, 0xA9, 0x09, 0x08, + 0x03, 0x77, 0x08, 0xA0, 0x00, 0x18, 0xF0, 0x70, 0x00, 0xA9, 0x09, 0x08, + 0x41, 0xC8, 0x03, 0x77, 0x0C, 0xA0, 0x00, 0x18, 0x09, 0x08, 0xFF, 0x4F, + 0x8F, 0xBC, 0x04, 0x77, 0x00, 0xA9, 0x09, 0x18, 0x01, 0xB0, 0xA0, 0xE0, + 0x20, 0xB5, 0xFD, 0xB6, 0x0D, 0x40, 0xEF, 0xDF, 0x01, 0xA8, 0x03, 0xB6, + 0x40, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0xD1, 0xE1, 0x00, 0xA0, + 0x00, 0x40, 0xF6, 0x63, 0x0C, 0xA2, 0x80, 0xE4, 0x0A, 0xC8, 0x98, 0xE4, + 0x00, 0x40, 0xF6, 0x63, 0x9C, 0xB8, 0x81, 0xB8, 0x08, 0x08, 0x09, 0x18, + 0xC1, 0xC0, 0x01, 0x40, 0x07, 0xBF, 0xF3, 0xDB, 0x06, 0x40, 0x02, 0x11, + 0xD8, 0xE1, 0x06, 0x40, 0x12, 0x18, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0x00, 0x40, 0xFC, 0x63, 0x0C, 0xA8, + 0x08, 0x01, 0xE0, 0xC1, 0x13, 0xD5, 0x00, 0xA0, 0x80, 0xE4, 0x0A, 0xC8, + 0x98, 0xE4, 0x91, 0xB8, 0x00, 0x40, 0xF6, 0x63, 0x8C, 0xB8, 0x08, 0x08, + 0x09, 0x18, 0xC1, 0xC0, 0x01, 0x40, 0x07, 0xBF, 0xF3, 0xDB, 0x00, 0x40, + 0xFD, 0x63, 0x00, 0xA9, 0x09, 0x08, 0xC8, 0xE1, 0xFF, 0xB0, 0xFF, 0xB2, + 0xFF, 0xB4, 0x02, 0xB1, 0x18, 0xE4, 0x00, 0xA9, 0x81, 0xE4, 0xA4, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x05, 0xD4, 0xC1, 0xC9, 0xEF, 0xC9, 0xF8, 0xDB, + 0x02, 0xB0, 0xA0, 0xE0, 0x01, 0xA8, 0xA6, 0xC8, 0x02, 0xB0, 0xA0, 0xE0, + 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x09, 0xE4, 0xF7, 0x7F, + 0x39, 0xDF, 0x01, 0x77, 0x04, 0xA8, 0x08, 0x10, 0x00, 0xA9, 0x01, 0x77, + 0x00, 0xA0, 0x00, 0x19, 0x04, 0x73, 0x08, 0xA0, 0x00, 0x08, 0x81, 0xBC, + 0x03, 0xD5, 0x04, 0x73, 0x0C, 0xA8, 0x08, 0x11, 0x07, 0x73, 0x00, 0xA0, + 0x00, 0x19, 0xC3, 0xE0, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0xFD, 0xB6, 0x0D, 0x40, 0x96, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x01, 0xB1, + 0x04, 0x90, 0x12, 0xC9, 0x90, 0xBD, 0x09, 0xE4, 0x68, 0xEC, 0xA0, 0xE1, + 0x08, 0xE4, 0x65, 0xEC, 0xA0, 0xE1, 0x01, 0xB0, 0xA0, 0xE0, 0x3F, 0xB5, + 0xFF, 0xB3, 0xFF, 0xB1, 0xFD, 0xB6, 0x01, 0xA8, 0x94, 0x78, 0x08, 0xA9, + 0x09, 0x18, 0x39, 0xA8, 0x00, 0x71, 0x00, 0xA9, 0x09, 0x18, 0x00, 0x40, + 0x65, 0x64, 0x04, 0xA0, 0x00, 0x08, 0x00, 0xA9, 0x00, 0x19, 0x00, 0x41, + 0x00, 0xA9, 0xBC, 0xDF, 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, 0xFD, 0xB6, 0x01, 0xA8, 0x04, 0x73, + 0x00, 0xA9, 0x09, 0x18, 0x23, 0xA8, 0x00, 0x71, 0x00, 0xA9, 0x09, 0x18, + 0x00, 0x77, 0x00, 0xA9, 0x09, 0x08, 0x97, 0xDF, 0x00, 0x48, 0x80, 0xBF, + 0x0B, 0xD5, 0x00, 0x40, 0x65, 0x64, 0x04, 0xA9, 0x09, 0x18, 0xE0, 0xC8, + 0x01, 0xD5, 0xC3, 0xE0, 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0x01, 0x40, 0xC8, 0xDF, 0xC3, 0xE0, 0xF8, 0xDE, 0x20, 0xB5, 0xFD, 0xB6, + 0x03, 0x40, 0x12, 0xDF, 0x00, 0x40, 0xFD, 0x63, 0x04, 0xA9, 0x09, 0x08, + 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0x5F, 0xB1, 0xF8, 0xB6, 0x68, 0xE4, + 0x49, 0xE4, 0x12, 0x90, 0xC3, 0xC0, 0x08, 0xC0, 0x30, 0xE4, 0x0A, 0xC3, + 0x83, 0xB8, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, 0x01, 0x09, 0x6A, 0x40, + 0x29, 0x09, 0x00, 0xA1, 0x89, 0xBF, 0x04, 0xDD, 0x81, 0xE4, 0x08, 0xB6, + 0x5F, 0xB0, 0x40, 0xB4, 0xDD, 0xDF, 0x28, 0xE4, 0x08, 0xDE, 0x81, 0xE4, + 0x0A, 0xC8, 0x98, 0xE4, 0x92, 0xB8, 0x84, 0xB8, 0x08, 0x08, 0x09, 0x18, + 0xC1, 0xC1, 0x10, 0xBF, 0xF6, 0xD9, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, + 0x09, 0x08, 0x6A, 0x40, 0x18, 0x09, 0x96, 0xB8, 0x6A, 0x40, 0x38, 0x00, + 0x0C, 0x40, 0xD8, 0xE1, 0x08, 0x19, 0x00, 0xA9, 0x84, 0x99, 0x85, 0x93, + 0x01, 0xA9, 0x86, 0x99, 0x87, 0x90, 0x02, 0x40, 0x7B, 0xDF, 0x13, 0xE4, + 0x81, 0xE4, 0x08, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, + 0xFC, 0xB6, 0x00, 0x77, 0x00, 0xA1, 0x01, 0x08, 0xFF, 0x7F, 0x35, 0xDF, + 0x00, 0x40, 0x65, 0x64, 0x04, 0xA9, 0x09, 0x18, 0x01, 0xA8, 0xF5, 0x7F, + 0xEF, 0xDF, 0xFE, 0x7F, 0x6B, 0xDF, 0x01, 0xA8, 0x01, 0x77, 0x00, 0xA1, + 0x01, 0x18, 0x00, 0xA8, 0x00, 0x77, 0x00, 0xA9, 0x09, 0x18, 0xC2, 0xE0, + 0x08, 0xE4, 0x00, 0x78, 0x00, 0xA1, 0x01, 0x08, 0xE1, 0xC8, 0x03, 0xD5, + 0x00, 0xA8, 0xF5, 0x7F, 0xDB, 0xDF, 0x00, 0x40, 0x65, 0x64, 0x04, 0xA9, + 0x09, 0x08, 0xE0, 0xC8, 0x4A, 0xD5, 0x01, 0xA8, 0x83, 0x98, 0x00, 0x40, + 0xFD, 0x63, 0x08, 0xA1, 0x01, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0x6C, 0xD4, + 0x00, 0x40, 0x65, 0x64, 0x04, 0xA9, 0x09, 0x08, 0x40, 0x40, 0x80, 0xBF, + 0x00, 0x40, 0x6F, 0xD5, 0x40, 0x40, 0x80, 0xBF, 0x3B, 0xD8, 0x10, 0x40, + 0x80, 0xBF, 0x00, 0x40, 0x6B, 0xD5, 0x51, 0xD8, 0xE1, 0xC8, 0x0C, 0xD5, + 0xFD, 0x7F, 0xE8, 0xDF, 0x00, 0x40, 0xBB, 0xDF, 0x98, 0xE4, 0x00, 0x40, + 0x65, 0x64, 0x04, 0xA1, 0x01, 0x08, 0x00, 0x40, 0x6B, 0xDF, 0x83, 0x98, + 0x00, 0x40, 0x65, 0x64, 0x04, 0xA9, 0x09, 0x08, 0xE4, 0xC8, 0x2F, 0xD5, + 0x01, 0x40, 0x1F, 0xDF, 0x03, 0x98, 0xE1, 0xC8, 0x31, 0xD5, 0x01, 0xA8, + 0x01, 0x77, 0x04, 0xA1, 0x01, 0x18, 0x01, 0x77, 0x00, 0xA8, 0x08, 0x10, + 0x04, 0x73, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x65, 0x64, 0x04, 0xA1, + 0x01, 0x09, 0x89, 0xBC, 0x04, 0xD5, 0x01, 0x08, 0x04, 0x73, 0x0C, 0xA9, + 0x09, 0x18, 0x00, 0x40, 0x65, 0x64, 0x04, 0xA1, 0x01, 0x10, 0x07, 0x73, + 0x00, 0xA8, 0x08, 0x10, 0xE1, 0xE0, 0xA3, 0xDE, 0x00, 0x41, 0x80, 0xBF, + 0xD5, 0xD5, 0x1B, 0xD8, 0x80, 0x40, 0x80, 0xBF, 0xC5, 0xD4, 0x00, 0x40, + 0x65, 0x64, 0x04, 0xA9, 0x09, 0x08, 0xE4, 0xC8, 0xD1, 0xD4, 0x0C, 0x40, + 0x7E, 0xDF, 0x00, 0x40, 0xEE, 0xDF, 0x03, 0x98, 0xE1, 0xC8, 0xCF, 0xD4, + 0x01, 0x77, 0x00, 0xA9, 0x09, 0x18, 0x01, 0x77, 0x04, 0xA1, 0x01, 0x10, + 0xCF, 0xDE, 0x20, 0x40, 0x80, 0xBF, 0xAE, 0xD4, 0xB9, 0xDE, 0x00, 0x42, + 0x80, 0xBF, 0x15, 0xD5, 0x00, 0x48, 0x80, 0xBF, 0xA7, 0xD4, 0xB2, 0xDE, + 0x30, 0x43, 0x0E, 0xA9, 0x00, 0x40, 0xC7, 0xDF, 0x00, 0x40, 0x65, 0x64, + 0x04, 0xA9, 0x09, 0x08, 0x40, 0x40, 0x80, 0xBF, 0x91, 0xD4, 0xFE, 0x7F, + 0x4F, 0xDF, 0xA3, 0xDE, 0xFE, 0x7F, 0x06, 0xDF, 0xA1, 0xDE, 0x00, 0xA8, + 0xF6, 0x7F, 0x83, 0xDF, 0x9D, 0xDE, 0x01, 0xB1, 0x00, 0x77, 0x08, 0xA0, + 0x00, 0x08, 0x41, 0xC8, 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x0F, 0xB1, + 0xFD, 0xB6, 0x28, 0xE4, 0x39, 0xE4, 0xF3, 0xDF, 0x08, 0xE4, 0x00, 0xA8, + 0xDD, 0x40, 0x0E, 0xDF, 0xE0, 0xC0, 0x09, 0xD5, 0xE1, 0xC0, 0x13, 0xD5, + 0x01, 0xA8, 0xDD, 0x40, 0x07, 0xDF, 0x81, 0xE4, 0x03, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x82, 0xE4, 0x93, 0xE4, 0x0E, 0x40, 0x21, 0xDF, 0x18, 0xE4, + 0x01, 0xA8, 0xDC, 0x40, 0xFB, 0xDF, 0x81, 0xE4, 0x03, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x82, 0xE4, 0x93, 0xE4, 0x54, 0x40, 0xD3, 0xDF, 0x18, 0xE4, + 0xF3, 0xDE, 0x01, 0xB1, 0x01, 0x40, 0x8F, 0xB8, 0xFE, 0x7F, 0x80, 0xBC, + 0x00, 0x40, 0xFD, 0x63, 0x04, 0xA9, 0x09, 0x18, 0x98, 0xE4, 0x00, 0x41, + 0x90, 0xB8, 0x70, 0x40, 0x00, 0xA0, 0x63, 0xEC, 0x01, 0xA0, 0x64, 0xEC, + 0x70, 0x40, 0x02, 0xA0, 0x63, 0xEC, 0x08, 0xE4, 0x64, 0xEC, 0x70, 0x40, + 0x03, 0xA0, 0x63, 0xEC, 0x09, 0xE4, 0x64, 0xEC, 0x70, 0x40, 0x01, 0xA0, + 0x63, 0xEC, 0x11, 0xA0, 0x64, 0xEC, 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, + 0x1F, 0xB1, 0xFC, 0xB6, 0xAC, 0xDF, 0x48, 0xE4, 0x03, 0x77, 0x08, 0xA8, + 0x08, 0x01, 0x03, 0x77, 0x0C, 0xA9, 0x09, 0x02, 0x01, 0xE4, 0xC0, 0x7F, + 0x00, 0x40, 0x00, 0xBC, 0x80, 0xE4, 0xFF, 0x40, 0x8F, 0xBD, 0x0F, 0xA3, + 0x83, 0x93, 0x03, 0xA9, 0xFE, 0x7F, 0x57, 0xDF, 0x81, 0xE4, 0x80, 0xBA, + 0x82, 0xB8, 0x40, 0x40, 0x00, 0x40, 0x80, 0xBF, 0x2D, 0xDC, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x00, 0x81, 0xE4, 0x82, 0xB8, 0x40, 0x7F, + 0x80, 0xB8, 0xFC, 0x7F, 0x80, 0xBC, 0x00, 0x40, 0xFD, 0x63, 0x0C, 0xA9, + 0x09, 0x18, 0x98, 0xE4, 0x3C, 0x7F, 0x90, 0xB8, 0x19, 0xE4, 0xF5, 0x7F, + 0x1C, 0x59, 0x10, 0xB8, 0xE0, 0xC4, 0x03, 0xD5, 0x0A, 0x40, 0xE4, 0x52, + 0x10, 0xB8, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x19, 0x09, 0xBF, + 0x03, 0xD5, 0x01, 0xA8, 0x58, 0x40, 0x09, 0x18, 0x81, 0xE4, 0xFE, 0x7F, + 0x80, 0xB8, 0x08, 0xE4, 0x6D, 0xEC, 0xA0, 0xE1, 0x81, 0xE4, 0x04, 0xB6, + 0x1F, 0xB0, 0x40, 0xB4, 0x40, 0x40, 0x00, 0x40, 0x00, 0xB8, 0xFF, 0x40, + 0x0F, 0xBD, 0x83, 0x93, 0x80, 0xE4, 0x04, 0xA9, 0xFE, 0x7F, 0x19, 0xDF, + 0xC8, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x00, 0x40, 0x65, 0x64, + 0x04, 0xA9, 0x09, 0x08, 0x00, 0xA0, 0x09, 0x10, 0x00, 0x48, 0x00, 0xA9, + 0xFD, 0x7F, 0xE8, 0xDF, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x01, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, 0x07, 0xA8, 0x83, 0x98, 0x84, 0x99, + 0x00, 0xA8, 0x90, 0xE4, 0x09, 0x40, 0xEE, 0xDF, 0x05, 0xB6, 0x01, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0x00, 0xA8, 0x0A, 0x40, 0x05, 0xDF, + 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0x00, 0xA8, 0x07, 0xA9, + 0x0A, 0x40, 0x02, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, + 0x00, 0xA8, 0x09, 0x40, 0xF2, 0xDF, 0x3E, 0xC8, 0x03, 0xB6, 0x40, 0xB4, + 0x01, 0xB1, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0x00, 0xA8, + 0x58, 0x40, 0x39, 0x18, 0x59, 0x40, 0x09, 0x18, 0x59, 0x40, 0x39, 0x18, + 0x58, 0x40, 0x29, 0x18, 0x08, 0xE4, 0x04, 0xDE, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA8, 0x08, 0x09, 0x90, 0xB8, 0xFF, 0xA8, 0xB4, 0x40, 0x09, 0x38, + 0xC1, 0xC0, 0x01, 0x40, 0x0F, 0xBF, 0xF4, 0xDB, 0x01, 0xB0, 0xA0, 0xE0, + 0x03, 0xB1, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, 0x01, 0x00, 0x58, 0x40, + 0x20, 0x18, 0x58, 0x40, 0x30, 0x19, 0x03, 0xB0, 0xA0, 0xE0, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x58, 0x40, 0x28, 0x08, 0xF0, 0x7F, + 0x80, 0xBC, 0xA0, 0xE0, 0x01, 0xB1, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, + 0x00, 0x09, 0x59, 0x40, 0x09, 0x18, 0x01, 0xB0, 0xA0, 0xE0, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x59, 0x40, 0x08, 0x08, 0xA0, 0xE0, + 0x20, 0xB5, 0xFD, 0xB6, 0x42, 0xDF, 0xFF, 0xA9, 0xE0, 0xC8, 0x06, 0xD5, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x59, 0x40, 0x38, 0x09, + 0x89, 0xE4, 0x03, 0xB6, 0x40, 0xB4, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, + 0x09, 0x08, 0x58, 0x40, 0x38, 0x08, 0xE0, 0xC8, 0x01, 0xD5, 0x01, 0xA8, + 0xA0, 0xE0, 0x01, 0xB1, 0x98, 0xE4, 0xE0, 0xC9, 0x07, 0xD9, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x89, 0xB8, 0xB4, 0x40, 0x08, 0x28, + 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0xE0, 0xC8, 0x0B, 0xD9, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x00, 0x01, 0xA9, 0xA2, 0xC9, 0x59, 0x40, + 0x30, 0x08, 0x89, 0xBD, 0x59, 0x40, 0x30, 0x18, 0x01, 0xB0, 0xA0, 0xE0, + 0x01, 0xB1, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x00, 0x01, 0xA9, + 0xA2, 0xC9, 0x79, 0xE0, 0x59, 0x40, 0x30, 0x08, 0x89, 0xBC, 0x59, 0x40, + 0x30, 0x18, 0x01, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x00, 0xA1, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0x59, 0x40, 0x09, 0x08, 0x78, 0xE0, + 0x58, 0x40, 0x39, 0x09, 0x98, 0xBC, 0x01, 0xE4, 0x04, 0xDE, 0xC1, 0xC0, + 0x01, 0x40, 0x0F, 0xBF, 0x0B, 0xD8, 0x89, 0xE4, 0x81, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x01, 0xD5, 0xC1, 0xC1, 0xE1, 0xC1, 0xF4, 0xDB, 0x01, 0xA8, + 0x03, 0xB0, 0xA0, 0xE0, 0x00, 0xA8, 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, + 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x1A, 0xDF, 0x98, 0xE4, 0xFF, 0xA8, + 0xE0, 0xC9, 0x08, 0xD9, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, 0x01, 0x08, + 0x80, 0xB8, 0xB4, 0x40, 0x08, 0x39, 0x89, 0xE4, 0x03, 0xB6, 0x03, 0xB0, + 0x40, 0xB4, 0x01, 0xB1, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x09, + 0x98, 0xB8, 0xFE, 0xA8, 0xB4, 0x40, 0x09, 0x38, 0x01, 0xB0, 0xA0, 0xE0, + 0x0F, 0xB1, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x03, 0x59, 0x40, + 0x03, 0x08, 0x78, 0xE0, 0x58, 0x40, 0x33, 0x01, 0x18, 0xBC, 0x00, 0xA0, + 0x01, 0xA2, 0x04, 0xDE, 0xC1, 0xC0, 0x01, 0x40, 0x0F, 0xBF, 0x0D, 0xD8, + 0x92, 0xE4, 0x82, 0xC9, 0x89, 0xE4, 0x81, 0xBC, 0xF7, 0xD5, 0x59, 0x40, + 0x03, 0x08, 0x89, 0xBD, 0x59, 0x40, 0x03, 0x18, 0x80, 0xE4, 0x0F, 0xB0, + 0xA0, 0xE0, 0xFF, 0xA8, 0x0F, 0xB0, 0xA0, 0xE0, 0x28, 0x09, 0xCF, 0xC9, + 0x11, 0xC9, 0x28, 0x19, 0xC6, 0xE0, 0xA0, 0xE0, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0x98, 0xE4, 0x01, 0x72, 0x04, 0xA0, 0x00, 0x08, 0x00, 0x40, + 0x81, 0xBC, 0xFA, 0xD4, 0x19, 0x08, 0x00, 0x72, 0x04, 0xA0, 0x00, 0x18, + 0x09, 0x08, 0x00, 0x72, 0x08, 0xA0, 0x00, 0x18, 0x29, 0x08, 0x00, 0x72, + 0x0C, 0xA0, 0x00, 0x18, 0x49, 0x08, 0x01, 0x72, 0x00, 0xA0, 0x00, 0x18, + 0x39, 0x08, 0x22, 0xC8, 0x00, 0x40, 0x81, 0xBD, 0x00, 0x72, 0x00, 0xA9, + 0x09, 0x18, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x28, 0x09, 0xCF, 0xC9, + 0x11, 0xC9, 0x28, 0x19, 0xC7, 0xE0, 0xA0, 0xE0, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0x98, 0xE4, 0x01, 0x72, 0x04, 0xA0, 0x00, 0x08, 0x00, 0x40, + 0x81, 0xBC, 0xFA, 0xD4, 0x19, 0x08, 0x00, 0x72, 0x04, 0xA0, 0x00, 0x18, + 0x09, 0x08, 0x00, 0x72, 0x08, 0xA0, 0x00, 0x18, 0x29, 0x08, 0x00, 0x72, + 0x0C, 0xA0, 0x00, 0x18, 0x49, 0x08, 0x01, 0x72, 0x00, 0xA0, 0x00, 0x18, + 0x39, 0x08, 0x22, 0xC8, 0x00, 0x72, 0x00, 0xA9, 0x09, 0x18, 0x01, 0x72, + 0x04, 0xA0, 0x00, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0xFF, 0xB0, + 0xFF, 0xB2, 0xFF, 0xB4, 0x01, 0x72, 0x04, 0xA9, 0x09, 0x08, 0x00, 0x40, + 0x81, 0xBC, 0xFA, 0xD4, 0xA0, 0xE0, 0x03, 0xB1, 0x08, 0xE4, 0x00, 0x40, + 0x00, 0x64, 0x00, 0xA1, 0x01, 0x09, 0x89, 0xBF, 0x06, 0xD7, 0x00, 0x40, + 0xFF, 0x63, 0x0C, 0xA1, 0x01, 0x08, 0x98, 0xBA, 0x09, 0xBA, 0x80, 0xE4, + 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x1F, 0xB1, 0xFB, 0xB6, 0x00, 0xA2, + 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA0, 0x00, 0x12, 0x00, 0x40, 0xFE, 0x63, + 0x08, 0xA4, 0x04, 0x12, 0x01, 0xA8, 0x00, 0x40, 0x58, 0x63, 0x00, 0xA9, + 0x09, 0x18, 0x00, 0x40, 0x00, 0x64, 0x08, 0xA0, 0x00, 0x12, 0x00, 0x40, + 0x58, 0x63, 0x04, 0xA4, 0x04, 0x18, 0x02, 0x77, 0x00, 0xA9, 0x09, 0x08, + 0x00, 0x40, 0xFF, 0x63, 0x0C, 0xA0, 0x00, 0x18, 0x02, 0x77, 0x04, 0xA4, + 0x04, 0x09, 0x98, 0xB8, 0x00, 0x40, 0x00, 0x64, 0x00, 0xA8, 0x08, 0x19, + 0x02, 0x77, 0x0C, 0xA0, 0x00, 0x03, 0x03, 0x77, 0x00, 0xA4, 0x04, 0x01, + 0x03, 0x77, 0x04, 0xA8, 0x08, 0x00, 0x02, 0x77, 0x08, 0xA4, 0x04, 0x08, + 0x00, 0x40, 0x8F, 0xBC, 0x01, 0xBF, 0x02, 0xD6, 0x09, 0xE4, 0x32, 0xE4, + 0x10, 0x75, 0x00, 0xA9, 0x09, 0x12, 0x83, 0x98, 0x84, 0x93, 0x81, 0xE4, + 0x90, 0xE4, 0x03, 0x40, 0xA8, 0xDF, 0x00, 0x40, 0x00, 0x64, 0x08, 0xA0, + 0x00, 0x08, 0xE0, 0xC8, 0x03, 0xD5, 0x05, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, + 0x03, 0x40, 0xFC, 0xDF, 0x05, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x01, 0xB1, + 0x00, 0xA8, 0x00, 0x40, 0xFE, 0x63, 0x08, 0xA0, 0x00, 0x18, 0x00, 0x40, + 0xFE, 0x63, 0x04, 0xA9, 0x09, 0x18, 0x00, 0x40, 0x00, 0x64, 0x08, 0xA0, + 0x00, 0x09, 0xE0, 0xC9, 0x62, 0xD4, 0x01, 0x75, 0x08, 0xA9, 0x09, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0x00, 0x75, 0x04, 0xA0, 0x00, 0x18, + 0x01, 0xA8, 0x00, 0x40, 0xFE, 0x63, 0x0C, 0xA9, 0x09, 0x18, 0x43, 0x75, + 0x08, 0xA0, 0x00, 0x18, 0x40, 0x75, 0x04, 0xA9, 0x09, 0x18, 0x40, 0x75, + 0x0C, 0xA0, 0x00, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x06, 0xD5, 0x00, 0x40, + 0xFE, 0x63, 0x0C, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0xF4, 0xD4, 0x00, 0x40, + 0xFE, 0x63, 0x0C, 0xA0, 0x00, 0x08, 0xE0, 0xC8, 0x2C, 0xD4, 0x01, 0x75, + 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x89, 0xBC, 0x06, 0xD5, 0x00, 0x40, + 0x58, 0x63, 0x00, 0xA0, 0x00, 0x08, 0xE0, 0xC8, 0xF4, 0xD4, 0x01, 0x75, + 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x82, 0xBC, 0x1A, 0xD5, 0x01, 0xA8, + 0x40, 0x75, 0x00, 0xA0, 0x00, 0x18, 0x40, 0x75, 0x00, 0xA9, 0x09, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0x01, 0xA8, 0x00, 0x75, 0x04, 0xA0, + 0x00, 0x18, 0x43, 0x75, 0x08, 0xA9, 0x09, 0x18, 0x40, 0x75, 0x04, 0xA0, + 0x00, 0x18, 0x40, 0x75, 0x0C, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0xFA, 0xD4, 0x00, 0xA8, 0x43, 0x75, 0x08, 0xA0, 0x00, 0x18, 0x40, 0x75, + 0x0C, 0xA8, 0x08, 0x09, 0x00, 0x40, 0x94, 0xBC, 0x01, 0xA8, 0x05, 0xD4, + 0x00, 0x40, 0x00, 0x64, 0x08, 0xA0, 0x00, 0x18, 0x89, 0xE4, 0x01, 0xB0, + 0xA0, 0xE0, 0x03, 0xB1, 0x98, 0xE4, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA1, + 0x01, 0x00, 0x00, 0xA8, 0xE0, 0xC0, 0x0B, 0xD4, 0x47, 0x75, 0x08, 0xA1, + 0x01, 0x08, 0x89, 0xBF, 0x08, 0xD6, 0x01, 0xA8, 0x00, 0x40, 0xFE, 0x63, + 0x04, 0xA9, 0x09, 0x18, 0x80, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, 0xE4, 0xC9, + 0x07, 0xDD, 0x01, 0xA8, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA1, 0x01, 0x18, + 0x80, 0xE4, 0xF5, 0xDE, 0x0A, 0xC9, 0x41, 0x75, 0x90, 0xB8, 0x09, 0x08, + 0x03, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x18, 0xE4, 0x00, 0x40, 0xFE, 0x63, + 0x04, 0xA0, 0x00, 0x09, 0x00, 0xA8, 0xE0, 0xC9, 0x05, 0xD4, 0xE4, 0xC1, + 0x05, 0xDD, 0x01, 0xA8, 0x00, 0x18, 0x89, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, + 0x04, 0xA0, 0x01, 0xBA, 0x0E, 0xC0, 0x43, 0x75, 0x00, 0xA9, 0x09, 0x08, + 0x81, 0xC8, 0x03, 0xB0, 0xA0, 0xE0, 0x5F, 0xB1, 0x68, 0xE4, 0x00, 0x40, + 0xFE, 0x63, 0x04, 0xA2, 0x02, 0x04, 0x00, 0xA8, 0x00, 0xA9, 0xE0, 0xC4, + 0x06, 0xD4, 0xE8, 0xC6, 0x06, 0xDD, 0x01, 0xA8, 0x02, 0x18, 0x00, 0xA8, + 0x00, 0xA9, 0x5F, 0xB0, 0xA0, 0xE0, 0x43, 0x75, 0x04, 0xA8, 0x08, 0x02, + 0x12, 0xE4, 0x04, 0xE4, 0x43, 0x75, 0x00, 0xA2, 0x02, 0x08, 0x24, 0xE4, + 0x28, 0xBD, 0x31, 0xE4, 0x34, 0xBD, 0x82, 0xE4, 0x93, 0xE4, 0xE8, 0xC6, + 0xEE, 0xD5, 0xDF, 0xC6, 0x0E, 0xC6, 0x01, 0xA8, 0x9A, 0xC8, 0xDF, 0xC8, + 0x08, 0xE4, 0x18, 0xE4, 0x7C, 0xC1, 0x82, 0xBC, 0x91, 0xE4, 0x93, 0xBC, + 0x5F, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x01, 0xA0, 0x00, 0x40, 0xFE, 0x63, + 0x08, 0xA1, 0x01, 0x10, 0x00, 0xA9, 0x00, 0x40, 0x00, 0x64, 0x0C, 0xA8, + 0x08, 0x19, 0x40, 0x75, 0x08, 0xA1, 0x01, 0x08, 0x00, 0x40, 0x00, 0x64, + 0x04, 0xA1, 0x01, 0x18, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA8, 0x08, 0x19, + 0x80, 0x75, 0x00, 0xA9, 0x09, 0x10, 0x80, 0x75, 0x04, 0xA1, 0x01, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0x03, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, + 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA1, 0x01, 0x00, 0x00, 0xA9, 0xE0, 0xC0, + 0x0B, 0xD4, 0x00, 0x40, 0xFE, 0x63, 0x08, 0xA1, 0x01, 0x09, 0xE0, 0xC9, + 0x08, 0xD4, 0x01, 0xA8, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA0, 0x00, 0x18, + 0x89, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, 0x02, 0x40, 0x80, 0xBF, 0x09, 0xDD, + 0x01, 0xA8, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA1, 0x01, 0x18, 0x90, 0xE4, + 0x89, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, 0x0A, 0xC8, 0x90, 0x75, 0x80, 0xB8, + 0x08, 0x09, 0x89, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x00, 0x40, + 0xFE, 0x63, 0x04, 0xA1, 0x01, 0x00, 0x00, 0xA9, 0xE0, 0xC0, 0x0B, 0xD4, + 0x00, 0x40, 0xFE, 0x63, 0x08, 0xA1, 0x01, 0x09, 0xE0, 0xC9, 0x08, 0xD4, + 0x01, 0xA8, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA0, 0x00, 0x18, 0x89, 0xE4, + 0x03, 0xB0, 0xA0, 0xE0, 0x18, 0xE4, 0x0A, 0xC1, 0x02, 0x40, 0x80, 0xBF, + 0x15, 0xDC, 0x81, 0xE4, 0xB0, 0x75, 0x80, 0xB8, 0x08, 0x09, 0x00, 0x40, + 0x00, 0x64, 0x0C, 0xA0, 0x00, 0x08, 0xE0, 0xC8, 0xEE, 0xD5, 0x0F, 0xA8, + 0xB0, 0xE0, 0xDF, 0xC8, 0xE0, 0xC8, 0xFC, 0xDA, 0x00, 0xA8, 0x00, 0x40, + 0x00, 0x64, 0x0C, 0xA9, 0x09, 0x18, 0xEB, 0xDE, 0x01, 0xA8, 0x00, 0x40, + 0xFE, 0x63, 0x04, 0xA1, 0x01, 0x18, 0x90, 0xE4, 0x89, 0xE4, 0x03, 0xB0, + 0xA0, 0xE0, 0x80, 0x75, 0x08, 0xA9, 0x09, 0x08, 0xA0, 0xE0, 0x07, 0xB1, + 0x18, 0xE4, 0x09, 0xE4, 0x89, 0xBF, 0x0A, 0xDD, 0x00, 0x40, 0x00, 0x64, + 0x00, 0xA2, 0x02, 0x08, 0x00, 0x40, 0xFF, 0x63, 0x0C, 0xA2, 0x02, 0x09, + 0x89, 0xBA, 0x08, 0xB8, 0x01, 0xBA, 0x80, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, + 0x03, 0xB1, 0x00, 0x40, 0x58, 0x63, 0x04, 0xA0, 0x00, 0x08, 0xE0, 0xC8, + 0x1B, 0xD5, 0x03, 0x77, 0x00, 0xA1, 0x01, 0x09, 0x00, 0x40, 0x00, 0x64, + 0x00, 0xA8, 0x08, 0x00, 0x90, 0xBF, 0x0D, 0xD7, 0x00, 0x40, 0xFF, 0x63, + 0x0C, 0xA1, 0x01, 0x08, 0x98, 0xB8, 0x90, 0xBA, 0x98, 0xBF, 0x02, 0xD6, + 0x98, 0xBA, 0x90, 0xB8, 0x89, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, 0x00, 0x40, + 0xFF, 0x63, 0x0C, 0xA1, 0x01, 0x08, 0xF4, 0xDE, 0x00, 0x40, 0x00, 0x64, + 0x08, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0x04, 0xD5, 0x01, 0x75, 0x0C, 0xA0, + 0x00, 0x09, 0xDE, 0xDE, 0x00, 0x40, 0xFE, 0x63, 0x08, 0xA1, 0x01, 0x08, + 0xE0, 0xC8, 0x04, 0xD5, 0x80, 0x75, 0x0C, 0xA8, 0x08, 0x09, 0xD4, 0xDE, + 0x02, 0x75, 0x00, 0xA0, 0x00, 0x09, 0x40, 0x75, 0x08, 0xA1, 0x01, 0x08, + 0x98, 0xB8, 0xCC, 0xDE, 0x03, 0xB1, 0x18, 0xE4, 0x00, 0x40, 0xFE, 0x63, + 0x04, 0xA8, 0x08, 0x00, 0x00, 0xA8, 0xE0, 0xC0, 0x0C, 0xD4, 0x00, 0x40, + 0xFE, 0x63, 0x08, 0xA8, 0x08, 0x09, 0xE0, 0xC9, 0x08, 0xD4, 0x01, 0xA8, + 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA0, 0x00, 0x18, 0x89, 0xE4, 0x03, 0xB0, + 0xA0, 0xE0, 0xC0, 0x75, 0x00, 0xA9, 0x09, 0x08, 0x81, 0xBF, 0xF9, 0xDD, + 0x01, 0xA8, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA9, 0x09, 0x18, 0x80, 0xE4, + 0x03, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA0, + 0x00, 0x08, 0x00, 0xA9, 0xE0, 0xC8, 0x08, 0xD4, 0x00, 0x40, 0xFE, 0x63, + 0x08, 0xA8, 0x08, 0x09, 0xE0, 0xC9, 0x05, 0xD4, 0x01, 0xA8, 0x00, 0x18, + 0x89, 0xE4, 0x01, 0xB0, 0xA0, 0xE0, 0xC0, 0x75, 0x00, 0xA0, 0x00, 0x09, + 0x89, 0xE4, 0x01, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, 0x18, 0xE4, 0x29, 0xE4, + 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA8, 0x08, 0x00, 0x00, 0xA8, 0xE0, 0xC0, + 0x0C, 0xD4, 0x00, 0x40, 0xFE, 0x63, 0x08, 0xA8, 0x08, 0x09, 0xE0, 0xC9, + 0x08, 0xD4, 0x01, 0xA8, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA0, 0x00, 0x18, + 0x89, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, 0xC0, 0x75, 0x04, 0xA9, 0x09, 0x08, + 0x81, 0xBF, 0x02, 0xD9, 0x82, 0xBF, 0xF7, 0xDB, 0x01, 0xA8, 0x00, 0x40, + 0xFE, 0x63, 0x04, 0xA9, 0x09, 0x18, 0x80, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, + 0x01, 0xB1, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA0, 0x00, 0x08, 0x00, 0xA9, + 0xE0, 0xC8, 0x08, 0xD4, 0x00, 0x40, 0xFE, 0x63, 0x08, 0xA8, 0x08, 0x09, + 0xE0, 0xC9, 0x05, 0xD4, 0x01, 0xA8, 0x00, 0x18, 0x89, 0xE4, 0x01, 0xB0, + 0xA0, 0xE0, 0xC0, 0x75, 0x04, 0xA0, 0x00, 0x09, 0x89, 0xE4, 0x01, 0xB0, + 0xA0, 0xE0, 0xC3, 0x75, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x87, 0xBC, + 0x00, 0xA9, 0x01, 0xD4, 0x01, 0xA9, 0x89, 0xE4, 0xA0, 0xE0, 0x20, 0xB5, + 0xFD, 0xB6, 0x01, 0xA8, 0xFE, 0x7F, 0xBD, 0xDF, 0x98, 0xE4, 0xE0, 0xC8, + 0x07, 0xD5, 0xC3, 0x75, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x87, 0xBC, + 0x04, 0xD4, 0x01, 0xA9, 0x89, 0xE4, 0x03, 0xB6, 0x40, 0xB4, 0xFE, 0x7F, + 0xAE, 0xDF, 0x00, 0xA9, 0xE0, 0xC8, 0xF8, 0xD4, 0x01, 0xA9, 0xF6, 0xDE, + 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0xC3, 0x75, 0x08, 0xA0, 0x00, 0x08, + 0xE8, 0xC8, 0x06, 0xDC, 0x80, 0x75, 0x04, 0xA9, 0x09, 0x08, 0x00, 0x40, + 0x84, 0xBC, 0xF5, 0xD5, 0xC3, 0x75, 0x08, 0xA0, 0x00, 0x09, 0x01, 0xA1, + 0xE8, 0xC9, 0x04, 0xDB, 0x81, 0xE4, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, + 0x89, 0xE4, 0xDF, 0xC8, 0x01, 0xE4, 0xA2, 0xC0, 0x89, 0xE4, 0xFE, 0x7F, + 0xB3, 0xDF, 0x80, 0xBE, 0x00, 0xA1, 0x18, 0xBA, 0x18, 0xBD, 0x7D, 0xC1, + 0x81, 0xE4, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0xFE, 0x63, + 0x04, 0xA9, 0x09, 0x08, 0xA0, 0xE0, 0x01, 0xA8, 0x00, 0x40, 0x00, 0x64, + 0x0C, 0xA9, 0x09, 0x18, 0xA0, 0xE0, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA9, + 0x09, 0x18, 0xA0, 0xE0, 0x00, 0x40, 0x00, 0x64, 0x08, 0xA9, 0x09, 0x08, + 0xE0, 0xC8, 0x07, 0xD5, 0x02, 0x77, 0x0C, 0xA9, 0x09, 0x08, 0x00, 0x40, + 0x82, 0xBC, 0x01, 0xA9, 0x01, 0xD4, 0x00, 0xA9, 0x89, 0xE4, 0xA0, 0xE0, + 0x80, 0x75, 0x04, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x84, 0xBC, 0x07, 0xD5, + 0x00, 0x40, 0x58, 0x63, 0x00, 0xA9, 0x09, 0x08, 0x01, 0xA9, 0xE0, 0xC8, + 0x01, 0xD5, 0x00, 0xA9, 0x89, 0xE4, 0xA0, 0xE0, 0x20, 0xB5, 0x07, 0xB1, + 0xFD, 0xB6, 0x02, 0x77, 0x0C, 0xA2, 0x02, 0x00, 0x00, 0x40, 0x01, 0xBC, + 0x03, 0x77, 0x04, 0xA8, 0x08, 0x01, 0x01, 0x75, 0x0C, 0xA2, 0x02, 0x09, + 0x00, 0x75, 0x0C, 0xA2, 0x02, 0x08, 0x98, 0xBF, 0x08, 0xD6, 0x7F, 0xA8, + 0xB0, 0xE0, 0xDF, 0xC8, 0xE0, 0xC8, 0xFC, 0xDA, 0x03, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0xE0, 0xC0, 0x2C, 0xD4, 0x01, 0x75, 0x0C, 0xA9, 0x09, 0x08, + 0x81, 0xBF, 0x3C, 0xD5, 0x09, 0x09, 0x00, 0x40, 0x00, 0x64, 0x00, 0xA0, + 0x00, 0x08, 0x98, 0xBF, 0x2F, 0xD5, 0x02, 0x77, 0x0C, 0xA9, 0x09, 0x08, + 0x00, 0x40, 0x81, 0xBE, 0x00, 0x40, 0x81, 0xBC, 0x08, 0xD4, 0x01, 0x75, + 0x0C, 0xA0, 0x00, 0x09, 0x03, 0x77, 0x04, 0xA2, 0x02, 0x08, 0x98, 0xBF, + 0x01, 0xD5, 0x27, 0xDF, 0x40, 0x75, 0x0C, 0xA8, 0x08, 0x09, 0x09, 0xC9, + 0x00, 0x40, 0x91, 0xBC, 0x00, 0x40, 0xFE, 0x63, 0x0C, 0xA0, 0x00, 0x08, + 0x89, 0xBC, 0x00, 0x18, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x01, 0x75, + 0x0C, 0xA9, 0x09, 0x08, 0x81, 0xBF, 0xCF, 0xD4, 0x04, 0xA0, 0x01, 0x75, + 0x08, 0xA2, 0x02, 0x10, 0x00, 0x40, 0x72, 0xDF, 0x80, 0xE4, 0xE9, 0x7F, + 0xEF, 0xDF, 0xD1, 0xDE, 0x00, 0x40, 0xFF, 0x63, 0x0C, 0xA2, 0x02, 0x08, + 0x81, 0xBF, 0xCB, 0xD4, 0x81, 0xE4, 0x6C, 0xDF, 0xC8, 0xDE, 0x1F, 0xB1, + 0x00, 0xA3, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA2, 0x02, 0x13, 0x00, 0x75, + 0x04, 0xA4, 0x04, 0x13, 0x00, 0x40, 0xFE, 0x63, 0x0C, 0xA9, 0x09, 0x08, + 0xE0, 0xC8, 0x33, 0xD5, 0x40, 0x75, 0x0C, 0xA2, 0x02, 0x00, 0x09, 0xC0, + 0x00, 0x40, 0x01, 0xBC, 0x02, 0x77, 0x0C, 0xA8, 0x08, 0x01, 0x03, 0x77, + 0x04, 0xA2, 0x02, 0x09, 0x00, 0x40, 0xFF, 0x63, 0x08, 0xA4, 0x04, 0x08, + 0x89, 0xBF, 0x26, 0xD6, 0x89, 0xE4, 0x04, 0x19, 0x00, 0x75, 0x0C, 0xA2, + 0x02, 0x18, 0x01, 0x75, 0x08, 0xA4, 0x04, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0xFA, 0xD4, 0x00, 0x40, 0x11, 0xBC, 0x0A, 0xC1, 0x04, 0x11, 0x93, 0xE4, + 0x16, 0xC9, 0x89, 0xE4, 0x01, 0x40, 0x84, 0xBD, 0xE0, 0xC0, 0x03, 0xD5, + 0x89, 0xE4, 0x00, 0x40, 0x84, 0xBD, 0x00, 0x75, 0x00, 0xA9, 0x09, 0x18, + 0x00, 0x75, 0x04, 0xA2, 0x02, 0x10, 0x1F, 0xB0, 0xA0, 0xE0, 0x01, 0x75, + 0x08, 0xA4, 0x04, 0x00, 0x05, 0xC0, 0xCC, 0xDE, 0x00, 0x40, 0x00, 0x64, + 0x00, 0xA4, 0x04, 0x02, 0x82, 0xBF, 0x07, 0xD5, 0x82, 0xE4, 0x00, 0x40, + 0xFF, 0x63, 0x08, 0xA9, 0x09, 0x12, 0x00, 0xA1, 0xCF, 0xDE, 0x00, 0x40, + 0xFF, 0x63, 0x0C, 0xA2, 0x02, 0x08, 0x00, 0x75, 0x08, 0xA4, 0x04, 0x18, + 0x01, 0x75, 0x0C, 0xA2, 0x02, 0x18, 0x89, 0xE4, 0x00, 0x40, 0xFF, 0x63, + 0x08, 0xA4, 0x04, 0x19, 0x01, 0xA3, 0xBE, 0xDE, 0x00, 0xA8, 0x00, 0x40, + 0x58, 0x63, 0x00, 0xA9, 0x09, 0x18, 0xA0, 0xE0, 0x01, 0xB1, 0x98, 0xE4, + 0x00, 0x48, 0x00, 0xA8, 0x04, 0x73, 0x0C, 0xA0, 0x00, 0x18, 0x03, 0x77, + 0x04, 0xA0, 0x00, 0x08, 0x89, 0xBF, 0x0F, 0xD4, 0x02, 0x77, 0x0C, 0xA0, + 0x00, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xF5, 0xD5, 0x03, 0x77, 0x04, 0xA0, + 0x00, 0x08, 0x89, 0xBF, 0xF0, 0xD4, 0x04, 0xA8, 0x01, 0x75, 0x08, 0xA9, + 0x09, 0x18, 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, + 0x28, 0xE4, 0x19, 0xE4, 0x0B, 0x93, 0x0C, 0x90, 0x00, 0xA9, 0x00, 0x40, + 0xFE, 0x63, 0x04, 0xA8, 0x08, 0x19, 0x21, 0xBF, 0x3A, 0xD5, 0x00, 0x40, + 0xFF, 0x63, 0x08, 0xA9, 0x09, 0x11, 0x00, 0xA9, 0x00, 0x40, 0x58, 0x63, + 0x04, 0xA8, 0x08, 0x19, 0x01, 0x75, 0x04, 0xA8, 0x08, 0x19, 0x00, 0x75, + 0x04, 0xA8, 0x08, 0x19, 0x00, 0x75, 0x08, 0xA8, 0x08, 0x12, 0x01, 0x75, + 0x0C, 0xA8, 0x08, 0x12, 0x00, 0x75, 0x0C, 0xA8, 0x08, 0x11, 0x01, 0x75, + 0x00, 0xA8, 0x08, 0x13, 0x04, 0xA8, 0xE9, 0x7F, 0x18, 0xDF, 0x01, 0x75, + 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0x00, 0x40, + 0x01, 0xBC, 0x0A, 0xC0, 0x09, 0x10, 0x74, 0xA8, 0x00, 0x75, 0x00, 0xA0, + 0x00, 0x18, 0x01, 0x75, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0xFA, 0xD4, 0x09, 0x09, 0x05, 0xC9, 0x00, 0x40, 0x91, 0xBC, 0x89, 0xE4, + 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0xE0, 0xC0, 0x09, 0xD5, 0x01, 0xA8, + 0x00, 0x40, 0x00, 0x64, 0x08, 0xA0, 0x00, 0x18, 0x89, 0xE4, 0x03, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0x8E, 0xDF, 0x03, 0x77, 0x04, 0xA9, + 0x09, 0x08, 0x90, 0xE4, 0x81, 0xBF, 0xF4, 0xDD, 0x03, 0x77, 0x04, 0xA8, + 0x08, 0x01, 0xAF, 0xDE, 0x01, 0xA8, 0x40, 0x75, 0x00, 0xA9, 0x09, 0x18, + 0x40, 0x75, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, + 0x01, 0xA8, 0x00, 0x75, 0x04, 0xA9, 0x09, 0x18, 0xA0, 0xE0, 0x02, 0xA8, + 0x40, 0x75, 0x00, 0xA9, 0x09, 0x18, 0xA0, 0xE0, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0xFD, 0xB6, 0x00, 0xA8, 0xEC, 0x7F, 0xAC, 0xDF, 0x08, 0xE4, + 0xE0, 0xC8, 0x14, 0xD4, 0x00, 0xA8, 0x00, 0x75, 0x04, 0xA9, 0x09, 0x18, + 0x01, 0xA8, 0x01, 0x75, 0x04, 0xA9, 0x09, 0x18, 0x22, 0xA8, 0x00, 0x71, + 0x00, 0xA9, 0x09, 0x18, 0xFE, 0x7F, 0x8C, 0xDF, 0xE0, 0xC0, 0x07, 0xD4, + 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0xFA, 0x7F, 0x13, 0xDF, + 0xE9, 0xDE, 0xFA, 0x7F, 0x17, 0xDF, 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, + 0xFF, 0xB4, 0x3F, 0xB5, 0xD2, 0x75, 0x00, 0xA0, 0x00, 0x08, 0x21, 0xC8, + 0x01, 0x40, 0x8F, 0xBC, 0xC1, 0xC8, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA9, + 0x09, 0x18, 0xFF, 0xB4, 0xFC, 0xB3, 0x5F, 0xB1, 0xFF, 0xB6, 0x19, 0xE4, + 0x10, 0x9B, 0x28, 0xE4, 0x00, 0xAA, 0x80, 0x9A, 0x6A, 0xE4, 0xEA, 0xE4, + 0x4A, 0xE4, 0xDA, 0xE4, 0x3A, 0xE4, 0xCA, 0xE4, 0x00, 0x40, 0xFE, 0x63, + 0x04, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0x37, 0xD4, 0x0A, 0xE4, 0x10, 0xA8, + 0x01, 0x40, 0x10, 0xBF, 0x01, 0xD8, 0x81, 0xE4, 0x98, 0xE4, 0x09, 0xE0, + 0x06, 0xD5, 0x89, 0xE4, 0x22, 0xC8, 0x8B, 0xBD, 0xC0, 0x75, 0x0C, 0xAF, + 0x0F, 0x18, 0xE0, 0xC0, 0x0A, 0xD5, 0xE8, 0xC0, 0x06, 0xDC, 0x0A, 0xC0, + 0x00, 0x40, 0xC4, 0x61, 0x00, 0xB8, 0x00, 0x08, 0x88, 0xE0, 0x02, 0x40, + 0x20, 0xB8, 0x89, 0xE4, 0xC1, 0xC8, 0x08, 0xE4, 0x05, 0xC0, 0x19, 0xBA, + 0xD2, 0x75, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x83, 0xBC, 0xFC, 0xD5, + 0x00, 0x40, 0x82, 0xBC, 0x26, 0xD4, 0xD0, 0x75, 0x00, 0xA9, 0x00, 0xE0, + 0xE8, 0xC0, 0x07, 0xDC, 0x80, 0xE4, 0x0A, 0xC8, 0x00, 0x40, 0xC6, 0x61, + 0x84, 0xB8, 0x08, 0x08, 0x88, 0xE0, 0xE0, 0xC0, 0xCA, 0xD4, 0x01, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0xA0, 0xE0, 0x00, 0x98, 0x72, 0x18, 0x62, 0x1A, + 0x52, 0x1E, 0x42, 0x16, 0x32, 0x1D, 0x22, 0x14, 0x12, 0x1C, 0x02, 0x13, + 0xD4, 0xDE, 0x79, 0x0F, 0x80, 0x9F, 0x69, 0x0A, 0x59, 0x0E, 0x49, 0x06, + 0x39, 0x0D, 0x29, 0x04, 0x19, 0x0C, 0x09, 0x03, 0xE6, 0xDE, 0xC5, 0xE0, + 0x01, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0xA0, 0xE0, 0xFC, 0xB3, 0x5F, 0xB1, + 0x29, 0xE4, 0x08, 0xE4, 0x00, 0xAA, 0xFA, 0xE4, 0x6A, 0xE4, 0xEA, 0xE4, + 0x4A, 0xE4, 0xDA, 0xE4, 0x3A, 0xE4, 0xBA, 0xE4, 0x00, 0x40, 0xFE, 0x63, + 0x04, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0x38, 0xD4, 0x1A, 0xE4, 0x10, 0xA8, + 0x01, 0x40, 0x20, 0xBF, 0x01, 0xD8, 0x82, 0xE4, 0x98, 0xE4, 0x09, 0xE0, + 0x07, 0xD5, 0x89, 0xE4, 0x22, 0xC8, 0x0F, 0x9C, 0x8C, 0xBD, 0xC0, 0x75, + 0x0C, 0xAC, 0x0C, 0x18, 0xE0, 0xC1, 0x0A, 0xD5, 0x70, 0x1F, 0x60, 0x1A, + 0x50, 0x1E, 0x40, 0x16, 0x30, 0x1D, 0x20, 0x14, 0x10, 0x1B, 0x00, 0x13, + 0x02, 0x40, 0x00, 0xB8, 0x89, 0xE4, 0xC1, 0xC8, 0x18, 0xE4, 0x05, 0xC1, + 0x29, 0xBA, 0xD2, 0x75, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x83, 0xBC, + 0xFC, 0xD5, 0x00, 0x40, 0x82, 0xBC, 0x11, 0xD4, 0x01, 0xE0, 0x0A, 0xD5, + 0xD0, 0x75, 0x00, 0xA9, 0x79, 0x0F, 0x69, 0x0A, 0x59, 0x0E, 0x49, 0x06, + 0x39, 0x0D, 0x29, 0x04, 0x19, 0x0B, 0x09, 0x03, 0xE0, 0xC1, 0xC9, 0xD4, + 0x5F, 0xB0, 0xFC, 0xB2, 0xA0, 0xE0, 0xC5, 0xE0, 0x5F, 0xB0, 0xFC, 0xB2, + 0xA0, 0xE0, 0xFC, 0xB3, 0x5F, 0xB1, 0x29, 0xE4, 0x08, 0xE4, 0x00, 0xAA, + 0xEA, 0xE4, 0x6A, 0xE4, 0xDA, 0xE4, 0x4A, 0xE4, 0xCA, 0xE4, 0x3A, 0xE4, + 0xBA, 0xE4, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA9, 0x09, 0x08, 0xE0, 0xC8, + 0x36, 0xD4, 0x1A, 0xE4, 0x10, 0xA8, 0x01, 0x40, 0x20, 0xBF, 0x01, 0xD8, + 0x82, 0xE4, 0x98, 0xE4, 0x09, 0xE0, 0x05, 0xD5, 0x89, 0xE4, 0x22, 0xC8, + 0xC0, 0x75, 0x0C, 0xAF, 0x0F, 0x18, 0xE0, 0xC1, 0x0A, 0xD5, 0x70, 0x1E, + 0x60, 0x1A, 0x50, 0x1D, 0x40, 0x16, 0x30, 0x1C, 0x20, 0x14, 0x10, 0x1B, + 0x00, 0x13, 0x02, 0x40, 0x00, 0xB8, 0x89, 0xE4, 0xC1, 0xC8, 0x18, 0xE4, + 0x05, 0xC1, 0x29, 0xBA, 0xD2, 0x75, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x40, + 0x83, 0xBC, 0xFC, 0xD5, 0x00, 0x40, 0x82, 0xBC, 0x11, 0xD4, 0x01, 0xE0, + 0x0A, 0xD5, 0xD0, 0x75, 0x00, 0xA9, 0x79, 0x0E, 0x69, 0x0A, 0x59, 0x0D, + 0x49, 0x06, 0x39, 0x0C, 0x29, 0x04, 0x19, 0x0B, 0x09, 0x03, 0xE0, 0xC1, + 0xCB, 0xD4, 0x5F, 0xB0, 0xFC, 0xB2, 0xA0, 0xE0, 0xC5, 0xE0, 0x5F, 0xB0, + 0xFC, 0xB2, 0xA0, 0xE0, 0xFC, 0xB3, 0x5F, 0xB1, 0x29, 0xE4, 0x08, 0xE4, + 0x00, 0xAA, 0xEA, 0xE4, 0x6A, 0xE4, 0xDA, 0xE4, 0x4A, 0xE4, 0xCA, 0xE4, + 0x3A, 0xE4, 0xBA, 0xE4, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA9, 0x09, 0x08, + 0xE0, 0xC8, 0x38, 0xD4, 0x1A, 0xE4, 0x10, 0xA8, 0x01, 0x40, 0x20, 0xBF, + 0x01, 0xD8, 0x82, 0xE4, 0x98, 0xE4, 0x09, 0xE0, 0x07, 0xD5, 0x89, 0xE4, + 0x22, 0xC8, 0x00, 0x40, 0x81, 0xBD, 0xC0, 0x75, 0x0C, 0xAF, 0x0F, 0x18, + 0xE0, 0xC1, 0x0A, 0xD5, 0x70, 0x1E, 0x60, 0x1A, 0x50, 0x1D, 0x40, 0x16, + 0x30, 0x1C, 0x20, 0x14, 0x10, 0x1B, 0x00, 0x13, 0x02, 0x40, 0x00, 0xB8, + 0x89, 0xE4, 0xC1, 0xC8, 0x18, 0xE4, 0x05, 0xC1, 0x29, 0xBA, 0xD2, 0x75, + 0x00, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x83, 0xBC, 0xFC, 0xD5, 0x00, 0x40, + 0x82, 0xBC, 0x11, 0xD4, 0x01, 0xE0, 0x0A, 0xD5, 0xD0, 0x75, 0x00, 0xA9, + 0x79, 0x0E, 0x69, 0x0A, 0x59, 0x0D, 0x49, 0x06, 0x39, 0x0C, 0x29, 0x04, + 0x19, 0x0B, 0x09, 0x03, 0xE0, 0xC1, 0xC9, 0xD4, 0x5F, 0xB0, 0xFC, 0xB2, + 0xA0, 0xE0, 0xC5, 0xE0, 0x5F, 0xB0, 0xFC, 0xB2, 0xA0, 0xE0, 0xFC, 0xB3, + 0x5F, 0xB1, 0x29, 0xE4, 0x08, 0xE4, 0x00, 0xAA, 0xEA, 0xE4, 0x6A, 0xE4, + 0xDA, 0xE4, 0x4A, 0xE4, 0xCA, 0xE4, 0x3A, 0xE4, 0xBA, 0xE4, 0x00, 0x40, + 0xFE, 0x63, 0x04, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0x38, 0xD4, 0x1A, 0xE4, + 0x10, 0xA8, 0x01, 0x40, 0x20, 0xBF, 0x01, 0xD8, 0x82, 0xE4, 0x98, 0xE4, + 0x09, 0xE0, 0x07, 0xD5, 0x89, 0xE4, 0x22, 0xC8, 0x00, 0x40, 0x82, 0xBD, + 0xC0, 0x75, 0x0C, 0xAF, 0x0F, 0x18, 0xE0, 0xC1, 0x0A, 0xD5, 0x70, 0x1E, + 0x60, 0x1A, 0x50, 0x1D, 0x40, 0x16, 0x30, 0x1C, 0x20, 0x14, 0x10, 0x1B, + 0x00, 0x13, 0x02, 0x40, 0x00, 0xB8, 0x89, 0xE4, 0xC1, 0xC8, 0x18, 0xE4, + 0x05, 0xC1, 0x29, 0xBA, 0xD2, 0x75, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x40, + 0x83, 0xBC, 0xFC, 0xD5, 0x00, 0x40, 0x82, 0xBC, 0x11, 0xD4, 0x01, 0xE0, + 0x0A, 0xD5, 0xD0, 0x75, 0x00, 0xA9, 0x79, 0x0E, 0x69, 0x0A, 0x59, 0x0D, + 0x49, 0x06, 0x39, 0x0C, 0x29, 0x04, 0x19, 0x0B, 0x09, 0x03, 0xE0, 0xC1, + 0xC9, 0xD4, 0x5F, 0xB0, 0xFC, 0xB2, 0xA0, 0xE0, 0xC5, 0xE0, 0x5F, 0xB0, + 0xFC, 0xB2, 0xA0, 0xE0, 0xFC, 0xB3, 0x5F, 0xB1, 0x29, 0xE4, 0x08, 0xE4, + 0x00, 0xAA, 0xEA, 0xE4, 0x6A, 0xE4, 0xDA, 0xE4, 0x4A, 0xE4, 0xCA, 0xE4, + 0x3A, 0xE4, 0xBA, 0xE4, 0x00, 0x40, 0xFE, 0x63, 0x04, 0xA9, 0x09, 0x08, + 0xE0, 0xC8, 0x38, 0xD4, 0x1A, 0xE4, 0x10, 0xA8, 0x01, 0x40, 0x20, 0xBF, + 0x01, 0xD8, 0x82, 0xE4, 0x98, 0xE4, 0x09, 0xE0, 0x07, 0xD5, 0x89, 0xE4, + 0x22, 0xC8, 0x00, 0x40, 0x83, 0xBD, 0xC0, 0x75, 0x0C, 0xAF, 0x0F, 0x18, + 0xE0, 0xC1, 0x0A, 0xD5, 0x70, 0x1E, 0x60, 0x1A, 0x50, 0x1D, 0x40, 0x16, + 0x30, 0x1C, 0x20, 0x14, 0x10, 0x1B, 0x00, 0x13, 0x02, 0x40, 0x00, 0xB8, + 0x89, 0xE4, 0xC1, 0xC8, 0x18, 0xE4, 0x05, 0xC1, 0x29, 0xBA, 0xD2, 0x75, + 0x00, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x83, 0xBC, 0xFC, 0xD5, 0x00, 0x40, + 0x82, 0xBC, 0x11, 0xD4, 0x01, 0xE0, 0x0A, 0xD5, 0xD0, 0x75, 0x00, 0xA9, + 0x79, 0x0E, 0x69, 0x0A, 0x59, 0x0D, 0x49, 0x06, 0x39, 0x0C, 0x29, 0x04, + 0x19, 0x0B, 0x09, 0x03, 0xE0, 0xC1, 0xC9, 0xD4, 0x5F, 0xB0, 0xFC, 0xB2, + 0xA0, 0xE0, 0xC5, 0xE0, 0x5F, 0xB0, 0xFC, 0xB2, 0xA0, 0xE0, 0x01, 0xB1, + 0x05, 0xDE, 0x98, 0x75, 0x00, 0xA0, 0x00, 0x09, 0xFE, 0x7F, 0x80, 0xB8, + 0x02, 0x40, 0x80, 0xBF, 0xF8, 0xD8, 0x0A, 0xC8, 0x90, 0x75, 0x80, 0xB8, + 0x08, 0x09, 0x01, 0xB0, 0xA0, 0xE0, 0x0F, 0xB1, 0x02, 0x77, 0x00, 0xA2, + 0x02, 0x00, 0x00, 0x40, 0xFF, 0x63, 0x0C, 0xA3, 0x03, 0x10, 0x02, 0x77, + 0x04, 0xA8, 0x08, 0x09, 0x90, 0xB8, 0x00, 0x40, 0x00, 0x64, 0x00, 0xA2, + 0x02, 0x19, 0x02, 0x77, 0x08, 0xA3, 0x03, 0x01, 0x00, 0x40, 0x1F, 0xBC, + 0x03, 0x77, 0x00, 0xA2, 0x02, 0x08, 0x00, 0x40, 0xFF, 0x63, 0x08, 0xA3, + 0x03, 0x18, 0x03, 0x77, 0x04, 0xA8, 0x08, 0x02, 0x00, 0x40, 0xFF, 0x63, + 0x04, 0xA3, 0x03, 0x12, 0x01, 0xA8, 0x10, 0x75, 0x00, 0xA3, 0x03, 0x18, + 0x04, 0x75, 0x08, 0xA3, 0x03, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, + 0x03, 0x75, 0x00, 0xA3, 0x03, 0x18, 0x01, 0xA8, 0x02, 0x75, 0x04, 0xA3, + 0x03, 0x18, 0x02, 0x75, 0x08, 0xA3, 0x03, 0x18, 0x04, 0x75, 0x08, 0xA3, + 0x03, 0x08, 0x00, 0x40, 0x82, 0xBC, 0xFA, 0xD4, 0x03, 0x75, 0x04, 0xA8, + 0x08, 0x10, 0x04, 0x75, 0x00, 0xA3, 0x03, 0x19, 0x03, 0x75, 0x08, 0xA8, + 0x08, 0x12, 0x00, 0x48, 0x90, 0xB8, 0x03, 0x75, 0x0C, 0xA2, 0x02, 0x19, + 0x04, 0x75, 0x04, 0xA3, 0x03, 0x11, 0x01, 0xA8, 0x48, 0x75, 0x00, 0xA9, + 0x09, 0x18, 0x82, 0x75, 0x00, 0xA2, 0x02, 0x18, 0x82, 0x75, 0x04, 0xA3, + 0x03, 0x18, 0x03, 0x75, 0x00, 0xA9, 0x09, 0x18, 0x0F, 0xB0, 0xA0, 0xE0, + 0x0A, 0xC9, 0x48, 0x75, 0x98, 0xB8, 0x09, 0x18, 0xA0, 0xE0, 0x0A, 0xC9, + 0x90, 0x75, 0x90, 0xB8, 0x09, 0x18, 0xA0, 0xE0, 0x03, 0xB1, 0x98, 0xE4, + 0x41, 0xC8, 0x05, 0xD4, 0xC2, 0x75, 0x08, 0xA8, 0x08, 0x19, 0x03, 0xB0, + 0xA0, 0xE0, 0x0F, 0xA8, 0x19, 0xE4, 0xC1, 0xC1, 0x91, 0xE4, 0x41, 0xC9, + 0x02, 0xDE, 0x05, 0xC9, 0xC1, 0xC8, 0xE0, 0xC9, 0xFC, 0xD4, 0x0A, 0xC8, + 0x90, 0x75, 0x80, 0xB8, 0x00, 0xA9, 0x08, 0x19, 0xC4, 0xC8, 0x08, 0x11, + 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x98, 0xE4, + 0x40, 0xC8, 0x06, 0xD4, 0xC2, 0x75, 0x0C, 0xA8, 0x08, 0x19, 0x03, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0xE0, 0xC9, 0x07, 0xDB, 0x89, 0xE4, 0x06, 0xC8, + 0xDF, 0xC8, 0xD2, 0xDF, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x00, 0xA8, + 0x89, 0xBA, 0x06, 0xC8, 0xCB, 0xDF, 0xF8, 0xDE, 0xE0, 0xC8, 0x04, 0xD5, + 0x01, 0xA8, 0x90, 0x75, 0x04, 0xA9, 0x09, 0x18, 0xC4, 0x75, 0x04, 0xA9, + 0x09, 0x08, 0x00, 0x40, 0x87, 0xBC, 0x08, 0xA9, 0x98, 0xBA, 0xE8, 0xC9, + 0x03, 0xD5, 0x8F, 0x75, 0x08, 0xA8, 0x08, 0x19, 0xA0, 0xE0, 0x20, 0xB5, + 0xFD, 0xB6, 0x05, 0x75, 0x00, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0x13, 0xD4, + 0x04, 0x75, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, + 0x03, 0x75, 0x00, 0xA9, 0x09, 0x18, 0x01, 0xA8, 0x02, 0x75, 0x0C, 0xA9, + 0x09, 0x18, 0x04, 0x75, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0xFA, 0xD4, 0x00, 0xA8, 0xD1, 0xDF, 0x01, 0xA8, 0x82, 0x75, 0x0C, 0xA9, + 0x09, 0x18, 0x48, 0x75, 0x04, 0xA9, 0x09, 0x18, 0x04, 0x75, 0x08, 0xA9, + 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0x03, 0x75, 0x00, 0xA9, + 0x09, 0x18, 0x01, 0xA8, 0x02, 0x75, 0x0C, 0xA9, 0x09, 0x18, 0x04, 0x75, + 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0x03, 0xB6, + 0x40, 0xB4, 0x05, 0x75, 0x00, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0x13, 0xD4, + 0x04, 0x75, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, + 0x03, 0x75, 0x00, 0xA9, 0x09, 0x18, 0x01, 0xA8, 0x02, 0x75, 0x0C, 0xA9, + 0x09, 0x18, 0x04, 0x75, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0xFA, 0xD4, 0x01, 0xA8, 0x48, 0x75, 0x04, 0xA9, 0x09, 0x18, 0x04, 0x75, + 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0x03, 0x75, + 0x00, 0xA9, 0x09, 0x18, 0x01, 0xA8, 0x02, 0x75, 0x0C, 0xA9, 0x09, 0x18, + 0x04, 0x75, 0x08, 0xA9, 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, + 0xA0, 0xE0, 0x01, 0xA8, 0x82, 0x75, 0x00, 0xA9, 0x09, 0x18, 0xA0, 0xE0, + 0x20, 0xB5, 0xFD, 0xB6, 0x00, 0xA8, 0xFF, 0x7F, 0x7B, 0xDF, 0x01, 0xA8, + 0x82, 0x75, 0x0C, 0xA9, 0x09, 0x18, 0x82, 0x75, 0x00, 0xA9, 0x09, 0x18, + 0x03, 0xB6, 0x40, 0xB4, 0x4A, 0x75, 0x0C, 0xA9, 0x09, 0x08, 0xA0, 0xE0, + 0xC5, 0x75, 0x00, 0xA9, 0x09, 0x08, 0xA0, 0xE0, 0xC3, 0x75, 0x0C, 0xA9, + 0x09, 0x08, 0xA0, 0xE0, 0x04, 0x75, 0x0C, 0xA9, 0x09, 0x08, 0xA0, 0xE0, + 0x03, 0xB1, 0x08, 0xE4, 0x02, 0x77, 0x00, 0xA1, 0x01, 0x08, 0x02, 0x77, + 0x04, 0xA1, 0x01, 0x09, 0x08, 0xDE, 0x02, 0x77, 0x04, 0xA9, 0x09, 0x08, + 0x08, 0xBA, 0x02, 0x77, 0x00, 0xA1, 0x01, 0x08, 0x09, 0x09, 0x89, 0xB8, + 0x80, 0xBF, 0xF5, 0xDD, 0x03, 0x75, 0x08, 0xA8, 0x08, 0x10, 0x03, 0xB0, + 0xA0, 0xE0, 0x01, 0xB1, 0x01, 0xA8, 0x02, 0x75, 0x08, 0xA0, 0x00, 0x18, + 0x03, 0x75, 0x0C, 0xA8, 0x08, 0x09, 0x03, 0x77, 0x00, 0xA0, 0x00, 0x08, + 0x89, 0xBF, 0xFB, 0xD5, 0x00, 0x08, 0x00, 0x40, 0xFF, 0x63, 0x08, 0xA9, + 0x09, 0x18, 0x03, 0x75, 0x0C, 0xA0, 0x00, 0x18, 0x01, 0xB0, 0xA0, 0xE0, + 0x02, 0xA8, 0x82, 0x75, 0x04, 0xA9, 0x09, 0x18, 0x82, 0x75, 0x08, 0xA9, + 0x09, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0xA0, 0xE0, 0x0F, 0xB1, + 0x18, 0xE4, 0x29, 0xE4, 0x07, 0x90, 0x02, 0x77, 0x08, 0xA3, 0x03, 0x09, + 0x00, 0x40, 0x9F, 0xBC, 0xE0, 0xC8, 0x1C, 0xD5, 0x10, 0x72, 0x00, 0xA3, + 0x03, 0x08, 0x00, 0x40, 0x81, 0xBC, 0xFA, 0xD4, 0x10, 0x72, 0x04, 0xA8, + 0x08, 0x19, 0x10, 0x72, 0x08, 0xA9, 0x09, 0x12, 0x10, 0x72, 0x0C, 0xA3, + 0x03, 0x10, 0x11, 0x72, 0x00, 0xA8, 0x08, 0x11, 0x03, 0xA8, 0x10, 0x72, + 0x00, 0xA9, 0x09, 0x18, 0x10, 0x72, 0x00, 0xA3, 0x03, 0x08, 0x00, 0x40, + 0x81, 0xBC, 0xFA, 0xD4, 0x0F, 0xB0, 0xA0, 0xE0, 0x3F, 0xB5, 0xFF, 0xB3, + 0xFF, 0xB1, 0xFD, 0xB6, 0x21, 0xA8, 0x00, 0x71, 0x00, 0xA9, 0x09, 0x18, + 0x00, 0x40, 0x01, 0x64, 0x00, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0x04, 0xD4, + 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x98, 0xE0, 0x03, 0xB6, + 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, 0x3F, 0xB5, 0xFF, 0xB3, 0xFF, 0xB1, + 0xFD, 0xB6, 0x10, 0x70, 0x00, 0xA8, 0x08, 0x01, 0x00, 0xA0, 0x01, 0xA2, + 0x92, 0xE4, 0x82, 0xC9, 0x89, 0xE4, 0x81, 0xBC, 0x03, 0xD5, 0x10, 0x70, + 0x04, 0xA8, 0x08, 0x19, 0xC1, 0xC0, 0xE3, 0xC0, 0xF5, 0xDB, 0x2A, 0xA8, + 0x00, 0x71, 0x00, 0xA9, 0x09, 0x18, 0x00, 0x40, 0x01, 0x64, 0x04, 0xA1, + 0x03, 0xA0, 0x01, 0x08, 0xC4, 0xC1, 0xE0, 0xC8, 0x07, 0xD4, 0xDF, 0xC0, + 0xE0, 0xC0, 0xF9, 0xDA, 0x03, 0xB6, 0xFF, 0xB0, 0xFF, 0xB2, 0xFF, 0xB4, + 0x98, 0xE0, 0xF7, 0xDE, 0x0F, 0xB1, 0x07, 0x91, 0x08, 0x93, 0x28, 0xE4, + 0x12, 0xC2, 0x02, 0xA0, 0xFF, 0x7F, 0x00, 0x60, 0x02, 0x30, 0x00, 0xA0, + 0xFF, 0x7F, 0x00, 0x60, 0x02, 0x30, 0x0A, 0xC8, 0x00, 0x40, 0x01, 0x64, + 0x80, 0xB8, 0x08, 0x13, 0x00, 0x70, 0x22, 0x19, 0x06, 0xC1, 0x00, 0x40, + 0x11, 0xBD, 0x00, 0x70, 0x12, 0x11, 0x0F, 0xB0, 0xA0, 0xE0, 0x12, 0xC8, + 0x00, 0x70, 0x28, 0x08, 0xA0, 0xE0, 0x12, 0xC8, 0x00, 0xA9, 0x00, 0x70, + 0x18, 0x19, 0xA0, 0xE0, 0x12, 0xC8, 0x06, 0xC9, 0x00, 0x40, 0x91, 0xBD, + 0x00, 0x70, 0x18, 0x19, 0xA0, 0xE0, 0x07, 0xB1, 0x00, 0x74, 0x0C, 0xA2, + 0x00, 0xA9, 0x02, 0x39, 0xC0, 0xA0, 0x00, 0x74, 0x08, 0xA9, 0x09, 0x30, + 0x83, 0xA9, 0x02, 0x39, 0x18, 0xE4, 0x21, 0xC1, 0x00, 0x74, 0x04, 0xA9, + 0x09, 0x31, 0x00, 0x74, 0x00, 0xA9, 0x09, 0x38, 0x03, 0xA8, 0x02, 0x38, + 0x07, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, 0x01, 0x74, 0x04, 0xA9, + 0x09, 0x28, 0x02, 0x40, 0x80, 0xBC, 0xFC, 0xD5, 0x00, 0x74, 0x00, 0xA8, + 0x08, 0x30, 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, + 0x08, 0xE4, 0x02, 0xDE, 0xC1, 0xC0, 0xEC, 0xDF, 0x00, 0x28, 0xE0, 0xC8, + 0xFB, 0xD4, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x10, 0x74, 0x00, 0xA9, + 0x09, 0x38, 0xA0, 0xE0, 0x10, 0x74, 0x00, 0xA9, 0x89, 0x38, 0xA0, 0xE0, + 0x10, 0x74, 0x00, 0xA9, 0x09, 0x18, 0xA0, 0xE0, 0x20, 0xB5, 0xFB, 0xB6, + 0x87, 0x98, 0x88, 0x99, 0x83, 0x98, 0x20, 0x40, 0xD8, 0xE1, 0x84, 0x98, + 0x00, 0x40, 0x02, 0x64, 0x04, 0xA8, 0x1F, 0x40, 0x0F, 0xA9, 0xAA, 0x40, + 0x66, 0xDF, 0x00, 0x40, 0x02, 0x64, 0x04, 0xA8, 0xD4, 0xDF, 0x05, 0xB6, + 0x40, 0xB4, 0x20, 0xB5, 0x1F, 0xB1, 0xFD, 0xB6, 0x48, 0xE4, 0x29, 0xE4, + 0x0C, 0x93, 0x98, 0xE4, 0x93, 0xB8, 0x00, 0xA8, 0x09, 0x38, 0x00, 0xA1, + 0x13, 0xBF, 0x12, 0xDA, 0x09, 0xE4, 0xDF, 0xC0, 0x82, 0xE4, 0x0A, 0xA9, + 0x9D, 0x40, 0x51, 0xDF, 0x03, 0x40, 0x80, 0xB8, 0x00, 0x38, 0xDF, 0xC0, + 0x82, 0xE4, 0x0A, 0xA9, 0x9C, 0x40, 0xAB, 0xDF, 0x28, 0xE4, 0xC1, 0xC1, + 0x13, 0xBF, 0xF0, 0xD9, 0x00, 0xA1, 0x93, 0xE4, 0xDF, 0xC9, 0xE0, 0xC9, + 0x0B, 0xDB, 0x20, 0xA0, 0x84, 0xE4, 0x81, 0xB8, 0x08, 0x22, 0x03, 0x40, + 0x20, 0xBF, 0x04, 0xD4, 0x08, 0x30, 0xC1, 0xC1, 0x91, 0xBF, 0xF6, 0xD8, + 0x03, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x0F, 0xB1, 0x28, 0xE4, 0x09, 0xE4, + 0x07, 0x93, 0x23, 0xB8, 0x00, 0xA8, 0x02, 0x38, 0x00, 0xA1, 0x13, 0xBF, + 0x18, 0xDA, 0x92, 0xE4, 0xDF, 0xC9, 0x08, 0xDE, 0x03, 0x40, 0x87, 0xB8, + 0x09, 0x38, 0x11, 0xC0, 0xC1, 0xC1, 0xDF, 0xC9, 0x13, 0xBF, 0x0D, 0xDA, + 0x80, 0xE4, 0x00, 0x40, 0x8F, 0xBC, 0xE9, 0xC8, 0xF3, 0xDC, 0x03, 0x40, + 0x80, 0xB8, 0x09, 0x38, 0x11, 0xC0, 0xC1, 0xC1, 0xDF, 0xC9, 0x13, 0xBF, + 0xF3, 0xD9, 0x0F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x07, 0xB1, 0xF9, 0xB6, + 0x29, 0xE4, 0x0E, 0x99, 0x0F, 0x98, 0x10, 0x90, 0x10, 0x40, 0xD1, 0xE1, + 0x83, 0x98, 0x81, 0xE4, 0x9E, 0xDF, 0xE0, 0xC2, 0x03, 0xD5, 0x82, 0xE4, + 0xFF, 0x7F, 0x6B, 0xDF, 0x81, 0xE4, 0xFF, 0x7F, 0x68, 0xDF, 0xE0, 0xC0, + 0x03, 0xD5, 0x80, 0xE4, 0xFF, 0x7F, 0x63, 0xDF, 0x07, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, 0xF9, 0xB6, 0x29, 0xE4, 0x0E, 0x99, + 0x0F, 0x98, 0x10, 0x90, 0x10, 0x40, 0xD1, 0xE1, 0x83, 0x98, 0x81, 0xE4, + 0xB4, 0xDF, 0xE0, 0xC2, 0x03, 0xD5, 0x82, 0xE4, 0xFF, 0x7F, 0x4F, 0xDF, + 0x81, 0xE4, 0xFF, 0x7F, 0x4C, 0xDF, 0xE0, 0xC0, 0x03, 0xD5, 0x80, 0xE4, + 0xFF, 0x7F, 0x47, 0xDF, 0x07, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x01, 0xA9, + 0x00, 0x74, 0x04, 0xA8, 0x08, 0x39, 0x02, 0x74, 0x04, 0xA8, 0x08, 0x39, + 0x04, 0x74, 0x04, 0xA8, 0x08, 0x39, 0x06, 0x74, 0x04, 0xA8, 0x08, 0x39, + 0x3D, 0xE1, 0x2C, 0xE1, 0x11, 0x41, 0x00, 0x44, 0x00, 0xA8, 0x01, 0x71, + 0x00, 0xA9, 0x09, 0x18, 0x01, 0x71, 0x04, 0xA9, 0x09, 0x18, 0x2D, 0xE1, + 0xA0, 0xE0, 0x28, 0xE1, 0x08, 0xA8, 0x08, 0xE4, 0x6B, 0xEC, 0x18, 0xA8, + 0x08, 0xE4, 0x6B, 0xEC, 0x09, 0xA8, 0x08, 0xE4, 0x6B, 0xEC, 0xA0, 0xE1, + 0x19, 0xA8, 0x08, 0xE4, 0x6B, 0xEC, 0xA0, 0xE1, 0x38, 0xE1, 0xA0, 0xE0, + 0x01, 0xB1, 0x12, 0xC8, 0xC8, 0xC8, 0x28, 0xE1, 0x08, 0xE4, 0x6B, 0xEC, + 0xA0, 0xE1, 0x38, 0xE1, 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x12, 0xC8, + 0xC9, 0xC8, 0x28, 0xE1, 0x08, 0xE4, 0x6B, 0xEC, 0xA0, 0xE1, 0x38, 0xE1, + 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x12, 0xC8, 0xCD, 0xC8, 0x28, 0xE1, + 0x08, 0xE4, 0x6B, 0xEC, 0xA0, 0xE1, 0x38, 0xE1, 0x01, 0xB0, 0xA0, 0xE0, + 0x01, 0xB1, 0xFF, 0x7F, 0x80, 0xBC, 0x28, 0xE1, 0x08, 0xE4, 0x6B, 0xEC, + 0xA0, 0xE1, 0x38, 0xE1, 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0xFF, 0x7F, + 0x80, 0xBC, 0x00, 0x40, 0x81, 0xBD, 0x28, 0xE1, 0x08, 0xE4, 0x6B, 0xEC, + 0xA0, 0xE1, 0x38, 0xE1, 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0xFF, 0x7F, + 0x80, 0xBC, 0x00, 0x40, 0x85, 0xBD, 0x28, 0xE1, 0x08, 0xE4, 0x6B, 0xEC, + 0xA0, 0xE1, 0x38, 0xE1, 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x28, 0xE1, + 0x00, 0xA0, 0x69, 0xEC, 0xA0, 0xE1, 0x0D, 0xA8, 0x08, 0xE4, 0x6B, 0xEC, + 0xA0, 0xE1, 0x1D, 0xA8, 0x08, 0xE4, 0x6B, 0xEC, 0xA0, 0xE1, 0xCC, 0x40, + 0x33, 0x73, 0x03, 0xA0, 0x69, 0xEC, 0xA0, 0xE1, 0x38, 0xE1, 0x01, 0xB0, + 0xA0, 0xE0, 0x01, 0xB1, 0x28, 0xE1, 0x00, 0xA0, 0x69, 0xEC, 0xA0, 0xE1, + 0x0D, 0xA8, 0x08, 0xE4, 0x6B, 0xEC, 0xA0, 0xE1, 0x1D, 0xA8, 0x08, 0xE4, + 0x6B, 0xEC, 0xA0, 0xE1, 0x38, 0xE1, 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, + 0x28, 0xE1, 0x00, 0xA0, 0x69, 0xEC, 0xA0, 0xE1, 0x38, 0xE1, 0x01, 0xB0, + 0xA0, 0xE0, 0x01, 0xB1, 0x28, 0xE1, 0x0D, 0xA8, 0x08, 0xE4, 0x6B, 0xEC, + 0xA0, 0xE1, 0x1D, 0xA8, 0x08, 0xE4, 0x6B, 0xEC, 0xA0, 0xE1, 0x38, 0xE1, + 0x01, 0xB0, 0xA0, 0xE0, 0xA0, 0xE0, 0x20, 0xB5, 0xFD, 0xB6, 0xFE, 0x7F, + 0x9A, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0xE0, 0xC8, + 0x06, 0xD9, 0x89, 0xB8, 0xDF, 0xC8, 0x9B, 0x40, 0xC6, 0xDF, 0x03, 0xB6, + 0x40, 0xB4, 0x68, 0xE0, 0x9B, 0x40, 0xC1, 0xDF, 0x68, 0xE0, 0x03, 0xB6, + 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0xE0, 0xC8, 0x05, 0xD9, + 0x9B, 0x40, 0xB7, 0xDF, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x09, 0xE4, + 0x08, 0xBA, 0x80, 0xE4, 0xDF, 0xC8, 0x9B, 0x40, 0xAE, 0xDF, 0x68, 0xE0, + 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x01, 0xB1, 0x08, 0xE4, 0xE0, 0xC9, + 0x04, 0xD9, 0x26, 0x40, 0x38, 0x08, 0x89, 0xBF, 0x03, 0xD8, 0x00, 0xA8, + 0x01, 0xB0, 0xA0, 0xE0, 0x0A, 0xC9, 0x90, 0xB8, 0x09, 0x08, 0x01, 0xB0, + 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, 0xE0, 0xC9, 0x04, 0xD9, 0x26, 0x40, + 0x38, 0x08, 0x89, 0xBF, 0x03, 0xD8, 0x00, 0xA8, 0x01, 0xB0, 0xA0, 0xE0, + 0x0A, 0xC9, 0x90, 0xB8, 0x07, 0x40, 0x39, 0x08, 0x01, 0xB0, 0xA0, 0xE0, + 0x01, 0xB1, 0x08, 0xE4, 0xE0, 0xC9, 0x04, 0xD9, 0x26, 0x40, 0x38, 0x08, + 0x89, 0xBF, 0x03, 0xD8, 0x00, 0xA8, 0x01, 0xB0, 0xA0, 0xE0, 0x0A, 0xC9, + 0x90, 0xB8, 0x0F, 0x40, 0x29, 0x08, 0x01, 0xB0, 0xA0, 0xE0, 0x1C, 0xB3, + 0x5F, 0xB1, 0x38, 0xE4, 0xB9, 0xE4, 0x0C, 0x96, 0x0D, 0x94, 0x0E, 0x9C, + 0x0F, 0x92, 0x00, 0xA1, 0x12, 0xBF, 0x18, 0xDA, 0xA1, 0xE4, 0x81, 0xE4, + 0x0A, 0xC8, 0x08, 0xE4, 0x03, 0xB8, 0x98, 0xE4, 0x9B, 0xB8, 0x09, 0x09, + 0x00, 0x19, 0x98, 0xE4, 0x96, 0xB8, 0x09, 0x09, 0x07, 0x40, 0x30, 0x19, + 0x84, 0xB8, 0x08, 0x08, 0x0F, 0x40, 0x20, 0x18, 0x1F, 0x40, 0x00, 0xB8, + 0x00, 0x1A, 0xC1, 0xC1, 0x12, 0xBF, 0xE9, 0xD9, 0x26, 0x40, 0x33, 0x12, + 0x27, 0x40, 0x03, 0x1C, 0xFF, 0xA8, 0x27, 0x40, 0x13, 0x18, 0x5F, 0xB0, + 0x1C, 0xB2, 0xA0, 0xE0, 0x1F, 0xB1, 0x48, 0xE4, 0x29, 0xE4, 0x00, 0xA1, + 0x01, 0xE4, 0x31, 0xE4, 0x98, 0xE4, 0x1F, 0x40, 0x90, 0xB8, 0x82, 0xE4, + 0x80, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x02, 0xD5, 0x09, 0x13, 0xC1, 0xC1, + 0xC1, 0xC0, 0xC4, 0xC9, 0x01, 0x40, 0x0E, 0xBF, 0xF4, 0xDB, 0x27, 0x40, + 0x24, 0x12, 0x26, 0x40, 0x34, 0x11, 0xFF, 0xA8, 0x27, 0x40, 0x14, 0x18, + 0x1F, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, 0xE0, 0xC9, 0x04, 0xD9, + 0x26, 0x40, 0x38, 0x08, 0x89, 0xBF, 0x03, 0xD8, 0x00, 0xA8, 0x01, 0xB0, + 0xA0, 0xE0, 0x0A, 0xC9, 0x90, 0xB8, 0x17, 0x40, 0x19, 0x08, 0x01, 0xB0, + 0xA0, 0xE0, 0x07, 0xB1, 0x06, 0x92, 0x00, 0xA1, 0x12, 0xBF, 0x0A, 0xDA, + 0x08, 0xE4, 0x17, 0x40, 0x04, 0xB8, 0x09, 0x08, 0xC4, 0xC9, 0x00, 0x18, + 0xC4, 0xC0, 0xC1, 0xC1, 0x12, 0xBF, 0xF9, 0xD9, 0x07, 0xB0, 0xA0, 0xE0, + 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, 0x00, 0xA1, 0x27, 0x40, + 0x18, 0x00, 0xC1, 0xC0, 0x80, 0xE4, 0x1F, 0xA9, 0x9B, 0x40, 0xA7, 0xDF, + 0x08, 0xE4, 0x98, 0xE4, 0x0A, 0xC9, 0x92, 0xB8, 0x1F, 0x40, 0x90, 0xB8, + 0x09, 0x08, 0xE0, 0xC8, 0x06, 0xD4, 0x27, 0x40, 0x22, 0x08, 0x80, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x08, 0xD4, 0xC1, 0xC1, 0x01, 0x40, 0x1E, 0xBF, + 0xE8, 0xDB, 0xFF, 0xA8, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x07, 0xA8, + 0x09, 0x18, 0x27, 0x40, 0x12, 0x10, 0x80, 0xE4, 0x03, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0x01, 0xB1, 0x08, 0xE4, 0xE0, 0xC9, 0x0C, 0xD9, 0x26, 0x40, + 0x38, 0x08, 0x89, 0xBF, 0x08, 0xDB, 0x0A, 0xC9, 0x90, 0xB8, 0x1F, 0x40, + 0x90, 0xB8, 0x09, 0x08, 0xFF, 0x7F, 0x8E, 0xBC, 0x09, 0x18, 0x01, 0xB0, + 0xA0, 0xE0, 0x03, 0xB1, 0x00, 0xA0, 0x26, 0x40, 0x38, 0x01, 0xE0, 0xC1, + 0x0B, 0xDB, 0x98, 0xE4, 0x1F, 0x40, 0x90, 0xB8, 0x09, 0x08, 0xFF, 0x7F, + 0x8E, 0xBC, 0x09, 0x18, 0xC1, 0xC0, 0xC4, 0xC9, 0x10, 0xBF, 0xF8, 0xD8, + 0x03, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, 0xE0, 0xC9, 0x0C, 0xD9, + 0x26, 0x40, 0x38, 0x08, 0x89, 0xBF, 0x08, 0xDB, 0x0A, 0xC9, 0x90, 0xB8, + 0x1F, 0x40, 0x90, 0xB8, 0x09, 0x08, 0xFF, 0x7F, 0x8D, 0xBC, 0x09, 0x18, + 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, 0xE0, 0xC9, 0x0C, 0xD9, + 0x26, 0x40, 0x38, 0x08, 0x89, 0xBF, 0x08, 0xDB, 0x0A, 0xC9, 0x90, 0xB8, + 0x1F, 0x40, 0x90, 0xB8, 0x09, 0x08, 0xFF, 0x7F, 0x8B, 0xBC, 0x09, 0x18, + 0x01, 0xB0, 0xA0, 0xE0, 0x0F, 0xB1, 0x39, 0xE4, 0x00, 0xA0, 0x26, 0x40, + 0x38, 0x01, 0xE0, 0xC1, 0x19, 0xDB, 0x01, 0xA2, 0x98, 0xE4, 0x1F, 0x40, + 0x90, 0xB8, 0x08, 0xDE, 0x09, 0x08, 0x00, 0x40, 0x84, 0xBD, 0x09, 0x18, + 0xC1, 0xC0, 0xC4, 0xC9, 0x10, 0xBF, 0x0C, 0xDB, 0x82, 0xE4, 0x82, 0xC8, + 0x83, 0xBC, 0xF4, 0xD4, 0x09, 0x08, 0xFF, 0x7F, 0x8B, 0xBC, 0x09, 0x18, + 0xC1, 0xC0, 0xC4, 0xC9, 0x10, 0xBF, 0xF4, 0xD8, 0x0F, 0xB0, 0xA0, 0xE0, + 0x0F, 0xB1, 0x00, 0xA2, 0x02, 0xE4, 0x26, 0x40, 0x38, 0x01, 0xE0, 0xC1, + 0x0F, 0xDB, 0x01, 0xA3, 0x98, 0xE4, 0x1F, 0x40, 0x90, 0xB8, 0x09, 0x08, + 0xC4, 0xC9, 0x00, 0x40, 0x84, 0xBC, 0x03, 0xD5, 0x83, 0xE4, 0x82, 0xC8, + 0x28, 0xBD, 0xC1, 0xC0, 0x10, 0xBF, 0xF5, 0xD8, 0x82, 0xE4, 0x0F, 0xB0, + 0xA0, 0xE0, 0x07, 0xB1, 0x00, 0xA2, 0x02, 0xE4, 0x26, 0x40, 0x38, 0x01, + 0xE0, 0xC1, 0x0C, 0xDB, 0x98, 0xE4, 0x1F, 0x40, 0x90, 0xB8, 0x09, 0x08, + 0xC4, 0xC9, 0x00, 0x40, 0x82, 0xBC, 0x01, 0xD5, 0xC1, 0xC2, 0xC1, 0xC0, + 0x10, 0xBF, 0xF7, 0xD8, 0x82, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, + 0x00, 0xA2, 0x02, 0xE4, 0x26, 0x40, 0x38, 0x01, 0xE0, 0xC1, 0x0C, 0xDB, + 0x98, 0xE4, 0x1F, 0x40, 0x90, 0xB8, 0x09, 0x08, 0xC4, 0xC9, 0x00, 0x40, + 0x83, 0xBC, 0x01, 0xD5, 0xC1, 0xC2, 0xC1, 0xC0, 0x10, 0xBF, 0xF7, 0xD8, + 0x82, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, 0x00, 0xA2, 0x02, 0xE4, + 0x26, 0x40, 0x38, 0x01, 0xE0, 0xC1, 0x0F, 0xDB, 0x98, 0xE4, 0x1F, 0x40, + 0x90, 0xB8, 0x03, 0xDE, 0xC1, 0xC0, 0x10, 0xBF, 0x08, 0xDB, 0x09, 0x08, + 0xC4, 0xC9, 0xE4, 0xC8, 0xF9, 0xD4, 0xC1, 0xC2, 0xC1, 0xC0, 0x10, 0xBF, + 0xF8, 0xD8, 0x82, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, 0x0A, 0xC9, 0x98, 0xB8, + 0x1F, 0x40, 0x09, 0x09, 0x00, 0x40, 0x92, 0xBC, 0x01, 0xA8, 0x01, 0xD4, + 0x89, 0xE4, 0xA0, 0xE0, 0x0A, 0xC9, 0x98, 0xB8, 0x1F, 0x40, 0x09, 0x09, + 0x00, 0x40, 0x91, 0xBC, 0x01, 0xA8, 0x01, 0xD4, 0x89, 0xE4, 0xA0, 0xE0, + 0x03, 0xB1, 0x00, 0xA9, 0x26, 0x40, 0x38, 0x00, 0xE0, 0xC0, 0x08, 0xDB, + 0x19, 0xE4, 0x1F, 0x40, 0x80, 0xB8, 0x08, 0x11, 0xC4, 0xC8, 0xC1, 0xC9, + 0x09, 0xBF, 0xFB, 0xD8, 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0xFD, 0xB6, + 0xE8, 0xC8, 0x13, 0xD5, 0x07, 0xD8, 0xE2, 0xC8, 0x10, 0xD5, 0xE4, 0xC8, + 0x1C, 0xD5, 0x00, 0xA8, 0x03, 0xB6, 0x40, 0xB4, 0x02, 0x40, 0x80, 0xBF, + 0x12, 0xD5, 0x0B, 0xD8, 0x01, 0x40, 0x80, 0xBF, 0xF6, 0xD4, 0x89, 0xE4, + 0x04, 0x40, 0x0E, 0xDF, 0xF3, 0xDE, 0x89, 0xE4, 0x2F, 0xDF, 0x03, 0xB6, + 0x40, 0xB4, 0x00, 0x44, 0x80, 0xBF, 0xEB, 0xD4, 0x89, 0xE4, 0x08, 0xDF, + 0xE9, 0xDE, 0x89, 0xE4, 0x04, 0x40, 0x2B, 0xDF, 0xE5, 0xDE, 0x89, 0xE4, + 0x1F, 0xDF, 0xE2, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, + 0xF2, 0x7F, 0x6C, 0xDF, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x09, + 0x01, 0xA1, 0x58, 0x40, 0x09, 0x11, 0x00, 0xA8, 0xDF, 0x40, 0x29, 0x38, + 0x00, 0x09, 0xFF, 0xA8, 0x70, 0x40, 0x09, 0x18, 0x00, 0xA8, 0x70, 0x40, + 0x19, 0x18, 0x82, 0xE4, 0x07, 0x40, 0xBA, 0xDF, 0x81, 0xE4, 0x03, 0xB6, + 0x07, 0xB0, 0x40, 0xB4, 0x01, 0xA8, 0xA0, 0xE0, 0x20, 0xB5, 0xFC, 0xB3, + 0x5F, 0xB1, 0xF8, 0xB6, 0xA8, 0xE4, 0x01, 0xAE, 0xFE, 0xAF, 0x86, 0x9F, + 0x00, 0xA0, 0x0A, 0x40, 0xE2, 0x66, 0x18, 0x10, 0x00, 0x40, 0x65, 0x64, + 0x0C, 0xA8, 0x04, 0x40, 0x81, 0xDF, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, + 0x01, 0x09, 0x6B, 0x40, 0x19, 0x10, 0x6B, 0x40, 0x09, 0x10, 0x6B, 0x40, + 0x29, 0x10, 0x70, 0x40, 0x19, 0x08, 0xE1, 0xC8, 0x01, 0x40, 0x80, 0xD5, + 0x00, 0x40, 0x65, 0x64, 0x08, 0xAC, 0x01, 0x40, 0x1C, 0x28, 0xE0, 0xC8, + 0x01, 0x40, 0x49, 0xD5, 0x6F, 0x40, 0x39, 0x08, 0xE0, 0xC8, 0x05, 0xD5, + 0x01, 0x40, 0x0C, 0x20, 0xE1, 0xC0, 0x01, 0x40, 0x82, 0xD4, 0x00, 0x40, + 0x65, 0x64, 0x0C, 0xA8, 0x83, 0x98, 0x8A, 0xE4, 0x00, 0x40, 0x67, 0x64, + 0x04, 0xA9, 0x09, 0x40, 0x1E, 0xDF, 0xE8, 0xE4, 0x01, 0x40, 0x0C, 0x2D, + 0xE1, 0xCD, 0x01, 0x40, 0x47, 0xD5, 0x01, 0x40, 0x1C, 0x21, 0xE0, 0xC1, + 0x09, 0xD5, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x70, 0x40, + 0x08, 0x08, 0xE0, 0xC8, 0x01, 0x40, 0x8E, 0xD5, 0x0A, 0x40, 0xCC, 0x66, + 0x2A, 0x00, 0x60, 0xE4, 0x11, 0x40, 0x64, 0xE6, 0x6A, 0xB8, 0x03, 0x40, + 0xA1, 0x68, 0x64, 0xB8, 0x86, 0xE4, 0x05, 0x40, 0xE6, 0xDF, 0x86, 0xE4, + 0x06, 0x40, 0x3F, 0xDF, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, 0x01, 0x00, + 0x00, 0xA1, 0x06, 0x40, 0xB5, 0xDF, 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xA1, + 0x6F, 0x40, 0x30, 0x11, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, + 0x6F, 0x40, 0x39, 0x08, 0xE0, 0xC8, 0x01, 0x40, 0x5D, 0xD5, 0x6F, 0x40, + 0x39, 0x01, 0xE0, 0xC1, 0x01, 0x40, 0x50, 0xD4, 0x01, 0xA9, 0x92, 0xC9, + 0x0A, 0x40, 0xCC, 0x66, 0x1A, 0x08, 0x89, 0xBC, 0x01, 0x40, 0xB4, 0xD4, + 0x02, 0x40, 0xDC, 0x4C, 0x2A, 0x08, 0xE1, 0xC8, 0x02, 0x40, 0x90, 0xD5, + 0x02, 0x40, 0xDB, 0x4C, 0x2A, 0x08, 0xE2, 0xC8, 0x01, 0x40, 0x09, 0xD5, + 0x01, 0x40, 0x1C, 0x28, 0xE0, 0xC8, 0x25, 0xD4, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA9, 0x09, 0x08, 0x6F, 0x40, 0x38, 0x08, 0xE0, 0xC8, 0x01, 0x40, + 0x8B, 0xD5, 0x01, 0x40, 0x0C, 0x2D, 0xE1, 0xCD, 0x01, 0x40, 0x86, 0xD5, + 0x03, 0x77, 0x00, 0xA0, 0x00, 0x08, 0x02, 0x40, 0xAB, 0x5A, 0x2A, 0x18, + 0x01, 0xA8, 0x83, 0x98, 0x02, 0xA8, 0x84, 0x98, 0x8A, 0xE4, 0x00, 0x40, + 0x67, 0x64, 0x04, 0xA9, 0x31, 0x40, 0xF3, 0xDF, 0xE8, 0xE4, 0xFF, 0xA9, + 0x00, 0x40, 0x65, 0x64, 0x08, 0xA8, 0x11, 0x40, 0x08, 0x39, 0x00, 0x40, + 0x65, 0x64, 0x08, 0xA0, 0x01, 0x40, 0x0C, 0x21, 0xE1, 0xC1, 0x08, 0xD5, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x01, 0x40, 0x1C, 0x2D, + 0x70, 0x40, 0x08, 0x1D, 0x02, 0x40, 0xDB, 0x4C, 0x1A, 0x08, 0x02, 0x40, + 0xDB, 0x4C, 0x2A, 0x18, 0xF1, 0x7F, 0xD7, 0xDF, 0xE0, 0xC8, 0x00, 0x40, + 0x88, 0xD5, 0x06, 0x91, 0x03, 0x40, 0x40, 0x31, 0xFD, 0xA8, 0x03, 0x40, + 0x5C, 0x38, 0x02, 0x40, 0xD2, 0x4C, 0x3A, 0x08, 0xE0, 0xC8, 0x35, 0xD5, + 0x0A, 0x40, 0xCC, 0x66, 0x1A, 0x08, 0xE0, 0xC8, 0x30, 0xD4, 0x0A, 0x40, + 0xCC, 0x66, 0x2A, 0x06, 0x11, 0x40, 0x64, 0xE6, 0x6A, 0xB8, 0x03, 0x40, + 0xA1, 0x68, 0x64, 0xB8, 0x10, 0x40, 0x16, 0x09, 0xE0, 0xC9, 0x15, 0xD9, + 0x0A, 0x40, 0xE1, 0x66, 0x0A, 0x08, 0x98, 0xBF, 0x10, 0xD5, 0xF1, 0x7F, + 0xB0, 0xDF, 0xE0, 0xC8, 0x02, 0x40, 0x4A, 0xD5, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA9, 0x09, 0x08, 0x10, 0x40, 0x16, 0x09, 0x98, 0xB8, 0xBC, 0x40, + 0x09, 0x28, 0x05, 0x40, 0xED, 0xDF, 0xFD, 0xA8, 0x10, 0x40, 0x16, 0x18, + 0x0A, 0x40, 0xCC, 0x66, 0x2A, 0x08, 0x11, 0x40, 0x84, 0xE6, 0x8A, 0xB8, + 0x03, 0x40, 0xA1, 0x68, 0x84, 0xB8, 0x05, 0x40, 0x8E, 0xDF, 0x02, 0x40, + 0xD3, 0x4C, 0x1A, 0x08, 0xE0, 0xC8, 0x58, 0xD5, 0x02, 0x40, 0xD2, 0x4C, + 0x3A, 0x08, 0xE0, 0xC8, 0x05, 0xD5, 0x03, 0x40, 0x5C, 0x28, 0x88, 0xB8, + 0x01, 0x40, 0xE4, 0xD7, 0xF1, 0x7F, 0x83, 0xDF, 0xE0, 0xC8, 0x2E, 0xD5, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x59, 0x40, 0x08, 0x08, + 0x04, 0x40, 0x2C, 0x18, 0xF6, 0x7F, 0xD7, 0xDF, 0xF2, 0x7F, 0x64, 0xDF, + 0x03, 0x40, 0x4C, 0x28, 0x88, 0xB8, 0x12, 0xD7, 0xE3, 0x7F, 0x74, 0xDF, + 0x08, 0xE4, 0xE0, 0xC8, 0x24, 0xD4, 0xE5, 0x7F, 0xE2, 0xDF, 0x00, 0x40, + 0x6D, 0x64, 0x04, 0xA9, 0x09, 0x08, 0xE0, 0xC8, 0x04, 0xD4, 0x80, 0x48, + 0x00, 0xA8, 0x07, 0x40, 0x3C, 0x18, 0xE0, 0xE4, 0x00, 0x40, 0x67, 0x64, + 0x04, 0xA8, 0x03, 0x40, 0xB3, 0xDF, 0x00, 0xA8, 0xE1, 0xCE, 0x1B, 0xD5, + 0x08, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA1, 0x01, 0x08, 0x59, 0x40, 0x38, 0x08, 0xD1, 0xDE, 0x03, 0x40, + 0x40, 0x3F, 0xFF, 0x7F, 0x77, 0xDE, 0xE7, 0x7F, 0x37, 0xDF, 0xE5, 0x7F, + 0xBC, 0xDF, 0x00, 0x40, 0x67, 0x64, 0x04, 0xA8, 0x03, 0x40, 0x98, 0xDF, + 0x00, 0xA8, 0xE1, 0xCE, 0xE5, 0xD4, 0x8E, 0xE4, 0x08, 0xB6, 0x5F, 0xB0, + 0xFC, 0xB2, 0x40, 0xB4, 0x05, 0x40, 0x5E, 0xDF, 0x03, 0x40, 0x5C, 0x38, + 0xA3, 0xDE, 0x03, 0x77, 0x00, 0xA9, 0x09, 0x08, 0x02, 0x40, 0xAB, 0x5A, + 0x2A, 0x18, 0x83, 0x9E, 0x02, 0xA8, 0x84, 0x98, 0x8A, 0xE4, 0x00, 0x40, + 0x67, 0x64, 0x04, 0xA9, 0x31, 0x40, 0x21, 0xDF, 0xE8, 0xE4, 0x11, 0x40, + 0x0C, 0x3F, 0x01, 0x40, 0x0C, 0x2D, 0xE1, 0xCD, 0xFE, 0x7F, 0xB9, 0xD4, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, 0x01, 0x09, 0x00, 0xA8, 0x6F, 0x40, + 0x39, 0x18, 0x02, 0x40, 0xDB, 0x4C, 0x2A, 0x08, 0xE2, 0xC8, 0xFE, 0x7F, + 0xF7, 0xD4, 0x01, 0x40, 0x1C, 0x28, 0xE0, 0xC8, 0xFE, 0x7F, 0xF2, 0xD4, + 0x01, 0xA8, 0x0A, 0x40, 0xE1, 0x66, 0x1A, 0x18, 0xFE, 0x7F, 0xEC, 0xDE, + 0x03, 0x77, 0x00, 0xAD, 0x0D, 0x08, 0x02, 0x40, 0xDD, 0x4C, 0x1A, 0x18, + 0x02, 0x40, 0xDD, 0x4C, 0x2A, 0x18, 0x02, 0x40, 0xD8, 0x4C, 0x0A, 0x18, + 0x02, 0x40, 0xD8, 0x4C, 0x1A, 0x18, 0x70, 0x40, 0x19, 0x10, 0xFE, 0x7F, + 0x6D, 0xDE, 0x03, 0x77, 0x00, 0xA1, 0x01, 0x08, 0x02, 0x40, 0xAB, 0x5A, + 0x2A, 0x18, 0x83, 0x9E, 0x03, 0xA8, 0x84, 0x98, 0x8A, 0xE4, 0x00, 0x40, + 0x67, 0x64, 0x04, 0xA9, 0x30, 0x40, 0xDF, 0xDF, 0xE8, 0xE4, 0xFF, 0xA8, + 0x11, 0x40, 0x0C, 0x38, 0xFE, 0x7F, 0x74, 0xDE, 0xF0, 0x7F, 0xD9, 0xDF, + 0xE0, 0xC8, 0x65, 0xD5, 0xFF, 0xA0, 0x86, 0x90, 0xFE, 0x7F, 0xB6, 0xDE, + 0x8A, 0xE4, 0x04, 0x40, 0x62, 0xDF, 0x0A, 0x40, 0xCC, 0x66, 0x3A, 0x04, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xAD, 0x0D, 0x09, 0xFE, 0x7F, 0x97, 0xDE, + 0x0A, 0x40, 0xCC, 0x66, 0x2A, 0x00, 0x01, 0xA9, 0x82, 0xC9, 0x0A, 0x40, + 0xCC, 0x66, 0x1A, 0x08, 0x89, 0xBC, 0xFE, 0x7F, 0x6A, 0xD5, 0x4C, 0x20, + 0xE0, 0xC0, 0x0C, 0xD4, 0xE2, 0xC1, 0x01, 0x40, 0xE0, 0xD5, 0x01, 0x40, + 0xC3, 0xD8, 0x02, 0xA8, 0xE1, 0xC1, 0x01, 0xD5, 0x00, 0xA8, 0x02, 0x40, + 0xDB, 0x4C, 0x1A, 0x18, 0x8A, 0xE4, 0x0B, 0x40, 0x3B, 0xDF, 0x02, 0x40, + 0xDC, 0x4C, 0x2A, 0x18, 0xE0, 0xC8, 0x01, 0x40, 0x67, 0xD5, 0x01, 0xA9, + 0x0A, 0x40, 0xE0, 0x66, 0x1A, 0x19, 0x0A, 0x40, 0xCC, 0x66, 0x2A, 0x00, + 0x82, 0xC9, 0x79, 0xE0, 0x0A, 0x40, 0xCC, 0x66, 0x1A, 0x08, 0x89, 0xBC, + 0x0A, 0x40, 0xCC, 0x66, 0x1A, 0x18, 0x80, 0xE4, 0x07, 0x40, 0x80, 0xE6, + 0x8A, 0xB8, 0x03, 0x40, 0x45, 0x62, 0xE8, 0x88, 0x0A, 0x40, 0xE1, 0x66, + 0x0A, 0x18, 0x02, 0x40, 0xAA, 0x5A, 0x3A, 0x08, 0x0A, 0x40, 0xE0, 0x66, + 0x2A, 0x18, 0x0A, 0x40, 0xE0, 0x66, 0x3A, 0x18, 0xFE, 0x7F, 0x2D, 0xDE, + 0x00, 0x40, 0x65, 0x64, 0x0C, 0xA8, 0x83, 0x98, 0x8A, 0xE4, 0x00, 0x40, + 0x67, 0x64, 0x04, 0xA9, 0x07, 0x40, 0x2B, 0xDF, 0xE8, 0xE4, 0xFE, 0x7F, + 0x84, 0xDE, 0xFF, 0xAF, 0xFE, 0x7F, 0x52, 0xDE, 0x04, 0xE4, 0x07, 0x40, + 0x00, 0xE6, 0x0A, 0xB8, 0x20, 0xE4, 0x03, 0x40, 0x45, 0x62, 0x2C, 0xB8, + 0x82, 0x88, 0x87, 0x98, 0x04, 0x40, 0xFF, 0xDF, 0xF8, 0xE4, 0xF0, 0x7F, + 0x60, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0x17, 0xD4, 0x82, 0x3F, 0x80, 0xE4, + 0x03, 0x40, 0x46, 0x62, 0x84, 0xB8, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xAD, + 0x0D, 0x09, 0x38, 0x20, 0x90, 0xB8, 0xB8, 0x40, 0x09, 0x29, 0x38, 0x39, + 0x06, 0x08, 0x85, 0x98, 0xB1, 0xE4, 0x18, 0xBF, 0x38, 0xDA, 0x00, 0x40, + 0x68, 0x50, 0x40, 0xE6, 0x4A, 0xB8, 0x34, 0xE4, 0x03, 0x40, 0x3C, 0xB8, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x83, 0x2D, 0x8D, 0xB8, + 0xB8, 0x40, 0x08, 0x28, 0x83, 0x38, 0x00, 0xA2, 0x02, 0xE4, 0x04, 0xB8, + 0x10, 0xE4, 0x04, 0x40, 0x10, 0xB8, 0x11, 0x28, 0x0F, 0x40, 0x8F, 0xBC, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xAD, 0x0D, 0x09, 0x18, 0xE0, 0x89, 0xB8, + 0xB8, 0x40, 0x08, 0x28, 0x11, 0x38, 0x05, 0x40, 0x00, 0xB8, 0x10, 0x28, + 0x0F, 0x40, 0x8F, 0xBC, 0x0D, 0x09, 0x18, 0xE0, 0x89, 0xB8, 0xB8, 0x40, + 0x08, 0x28, 0x10, 0x38, 0xC1, 0xC2, 0xEE, 0xC2, 0xE1, 0xDB, 0xC1, 0xCB, + 0x07, 0x40, 0x40, 0xB8, 0x07, 0x40, 0x30, 0xB8, 0x05, 0x90, 0xB0, 0xBF, + 0xCF, 0xD9, 0xAA, 0x4F, 0x0A, 0xA8, 0xEC, 0x7F, 0x83, 0xDF, 0x8A, 0xE4, + 0x26, 0x40, 0x2F, 0xDF, 0x0A, 0x40, 0xCC, 0x66, 0x3A, 0x00, 0x01, 0xA1, + 0x91, 0xE4, 0x82, 0xC9, 0x0F, 0x40, 0x9F, 0xBE, 0x0A, 0x40, 0xCC, 0x66, + 0x1A, 0x08, 0x89, 0xBC, 0x0A, 0x40, 0xCC, 0x66, 0x1A, 0x18, 0x02, 0x40, + 0xDC, 0x4C, 0x3A, 0x08, 0x81, 0xB8, 0x02, 0x40, 0xDC, 0x4C, 0x3A, 0x18, + 0x07, 0x40, 0x00, 0xE6, 0x0A, 0xB8, 0x07, 0x40, 0x8E, 0x44, 0x00, 0x29, + 0x8A, 0xE4, 0x20, 0x40, 0x64, 0xDF, 0x0A, 0x40, 0xE1, 0x66, 0x2A, 0x08, + 0xE0, 0xC8, 0x06, 0xD5, 0x02, 0x40, 0xDB, 0x4C, 0x1A, 0x08, 0xE2, 0xC8, + 0x00, 0x40, 0xB8, 0xD5, 0x10, 0x40, 0x16, 0x08, 0x88, 0xB8, 0x13, 0xD7, + 0xEF, 0x7F, 0xDB, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0x82, 0xD4, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x10, 0x40, 0x16, 0x09, 0x98, 0xB8, + 0xB8, 0x40, 0x09, 0x28, 0x04, 0x40, 0x18, 0xDF, 0xFD, 0xA8, 0x10, 0x40, + 0x16, 0x18, 0x10, 0x40, 0x36, 0x08, 0xE0, 0xC8, 0x0C, 0xD4, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xAD, 0x0D, 0x00, 0x01, 0xA9, 0xBE, 0xC9, 0x79, 0xE0, + 0x59, 0x40, 0x20, 0x08, 0x89, 0xBC, 0x59, 0x40, 0x20, 0x18, 0x11, 0x40, + 0x06, 0x08, 0xE0, 0xC8, 0xFD, 0x7F, 0x98, 0xD4, 0xEF, 0x7F, 0xB3, 0xDF, + 0xE0, 0xC8, 0x00, 0x40, 0x79, 0xD5, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, + 0x01, 0x00, 0x01, 0xA9, 0x06, 0x98, 0xA2, 0xC9, 0x79, 0xE0, 0x59, 0x40, + 0x00, 0x08, 0x89, 0xBC, 0x59, 0x40, 0x00, 0x18, 0xFD, 0x7F, 0x84, 0xDE, + 0x0A, 0x40, 0xCC, 0x66, 0x1A, 0x08, 0xE0, 0xC8, 0xFE, 0x7F, 0x16, 0xD4, + 0x02, 0x40, 0xDB, 0x4C, 0x1A, 0x08, 0xE0, 0xC8, 0x4B, 0xD5, 0x03, 0x40, + 0x4C, 0x28, 0x88, 0xB8, 0x47, 0xD7, 0xFD, 0xA8, 0x03, 0x40, 0x5C, 0x38, + 0xFE, 0x7F, 0x08, 0xDE, 0x10, 0x40, 0x16, 0x09, 0xE0, 0xC9, 0x15, 0xD9, + 0x0A, 0x40, 0xE1, 0x66, 0x0A, 0x08, 0x98, 0xBF, 0x10, 0xD5, 0xEF, 0x7F, + 0x82, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0x81, 0xD5, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xAD, 0x0D, 0x08, 0x10, 0x40, 0x16, 0x09, 0x98, 0xB8, 0xBC, 0x40, + 0x09, 0x28, 0x03, 0x40, 0xBF, 0xDF, 0xFD, 0xA8, 0x10, 0x40, 0x16, 0x18, + 0x0A, 0x40, 0xCC, 0x66, 0x3A, 0x08, 0x07, 0x40, 0x80, 0xE6, 0x8A, 0xB8, + 0x07, 0x40, 0x8E, 0x44, 0x08, 0x29, 0x8A, 0xE4, 0x1F, 0x40, 0xDD, 0xDF, + 0xFD, 0x7F, 0x46, 0xDE, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xAD, 0x0D, 0x08, + 0x10, 0x40, 0x16, 0x09, 0x98, 0xB8, 0xB8, 0x40, 0x09, 0x28, 0x03, 0x40, + 0xA3, 0xDF, 0xFD, 0x7F, 0xB4, 0xDE, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, + 0x01, 0x08, 0x10, 0x40, 0x16, 0x09, 0x98, 0xB8, 0xBC, 0x40, 0x09, 0x28, + 0xFF, 0x7F, 0x7C, 0xDE, 0xFF, 0xA8, 0x03, 0x40, 0x5C, 0x38, 0xFD, 0x7F, + 0xC1, 0xDE, 0x07, 0x98, 0x04, 0x40, 0x2C, 0xDF, 0x86, 0x98, 0x07, 0x40, + 0x8D, 0x44, 0x00, 0x38, 0xFE, 0x7F, 0xE0, 0xDE, 0x01, 0xA8, 0x0A, 0x40, + 0xE1, 0x66, 0x2A, 0x18, 0xFC, 0x7F, 0xE2, 0xDE, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA9, 0x09, 0x00, 0x01, 0xA9, 0xBE, 0xC9, 0x79, 0xE0, 0x59, 0x40, + 0x30, 0x08, 0x89, 0xBC, 0x59, 0x40, 0x30, 0x18, 0xFD, 0x7F, 0x0C, 0xDE, + 0x02, 0x40, 0xDB, 0x4C, 0x2A, 0x00, 0xE0, 0xC0, 0xFF, 0x7F, 0x42, 0xD4, + 0x02, 0x40, 0xDF, 0x4C, 0x3A, 0x08, 0xE0, 0xC8, 0x06, 0xD4, 0x02, 0x40, + 0xAC, 0x5A, 0x3A, 0x08, 0xE0, 0xC8, 0xFF, 0x7F, 0x37, 0xD5, 0x8A, 0xE4, + 0x07, 0x99, 0x40, 0x40, 0xAC, 0xDF, 0x8A, 0xE4, 0x91, 0xE4, 0x41, 0x40, + 0x54, 0xDF, 0x0A, 0x40, 0xCC, 0x66, 0x2A, 0x08, 0x11, 0x40, 0x84, 0xE6, + 0x8A, 0xB8, 0x03, 0x40, 0xB1, 0x68, 0x28, 0x08, 0xE0, 0xC8, 0x02, 0xD5, + 0x10, 0x40, 0x16, 0x18, 0x0A, 0x40, 0xE1, 0x66, 0x2A, 0x10, 0xFF, 0x7F, + 0x1D, 0xDE, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x10, 0x40, + 0x16, 0x09, 0x98, 0xB8, 0xB8, 0x40, 0x09, 0x28, 0x03, 0x40, 0x3E, 0xDF, + 0xFF, 0x7F, 0x7D, 0xDE, 0xE3, 0xC1, 0x1F, 0xD5, 0xE4, 0xC1, 0xFE, 0x7F, + 0x3B, 0xD4, 0x06, 0xA1, 0x02, 0x40, 0xDB, 0x4C, 0x1A, 0x11, 0x00, 0x40, + 0x65, 0x64, 0x08, 0xA8, 0x58, 0x28, 0xFF, 0xA9, 0xE0, 0xC8, 0x05, 0xD5, + 0x98, 0xE4, 0xDF, 0xC9, 0xE6, 0xC9, 0x12, 0xDB, 0x91, 0xE4, 0x09, 0xE0, + 0x02, 0x40, 0xDB, 0x4C, 0x3A, 0x19, 0xFE, 0x7F, 0x29, 0xDE, 0x04, 0xA8, + 0x02, 0x40, 0xDB, 0x4C, 0x1A, 0x18, 0xFE, 0x7F, 0x23, 0xDE, 0x02, 0x40, + 0xDB, 0x4C, 0x1A, 0x11, 0xFE, 0x7F, 0x1E, 0xDE, 0xE0, 0xC9, 0xED, 0xDA, + 0x90, 0xE4, 0xEB, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x09, 0x00, 0x77, 0x0C, 0xA1, + 0x01, 0x08, 0x51, 0xC8, 0x03, 0x40, 0x8F, 0xBC, 0x6C, 0x40, 0x19, 0x18, + 0x05, 0x77, 0x04, 0xA1, 0x01, 0x08, 0x74, 0x40, 0x29, 0x18, 0x00, 0x40, + 0x65, 0x64, 0x08, 0xA8, 0xDA, 0x7F, 0xF0, 0xDF, 0x01, 0x40, 0x80, 0xBF, + 0x04, 0xD5, 0x01, 0xA8, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x82, 0xE4, + 0x00, 0x40, 0x65, 0x64, 0x08, 0xA9, 0x05, 0x40, 0x4C, 0xDF, 0x01, 0xA8, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, + 0x18, 0xE4, 0x00, 0x77, 0x0C, 0xA0, 0x00, 0x09, 0xE1, 0xC9, 0x5F, 0xD5, + 0x00, 0x40, 0x6E, 0x64, 0x0C, 0xA9, 0x04, 0x40, 0x89, 0xDF, 0x0A, 0x40, + 0xCC, 0x66, 0x21, 0x00, 0x11, 0x40, 0x04, 0xE6, 0x01, 0xB8, 0x03, 0x40, + 0xA1, 0x68, 0x04, 0xB8, 0x10, 0x40, 0x10, 0x08, 0x88, 0xB8, 0x12, 0xD7, + 0xEE, 0x7F, 0x7F, 0xDF, 0xE0, 0xC8, 0x5A, 0xD4, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA9, 0x09, 0x08, 0x10, 0x40, 0x10, 0x09, 0x98, 0xB8, 0xB8, 0x40, + 0x09, 0x28, 0x02, 0x40, 0xBD, 0xDF, 0xFD, 0xA8, 0x10, 0x40, 0x10, 0x18, + 0x80, 0xE4, 0x02, 0x40, 0x66, 0xDF, 0x00, 0x40, 0x6E, 0x64, 0x0C, 0xA1, + 0x0F, 0xA0, 0x02, 0x40, 0x8F, 0xDF, 0x81, 0x38, 0x91, 0x38, 0xDF, 0xC0, + 0xC4, 0xC1, 0xE0, 0xC0, 0xF8, 0xDA, 0x09, 0x77, 0x00, 0xA8, 0x08, 0x00, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x00, 0xA9, 0x59, 0x40, + 0x28, 0x19, 0xEE, 0x7F, 0x54, 0xDF, 0xE0, 0xC8, 0x39, 0xD4, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0x59, 0x40, 0x39, 0x10, 0x09, 0x77, + 0x00, 0xA8, 0x08, 0x10, 0x00, 0xA8, 0x6F, 0x40, 0x39, 0x18, 0x08, 0xE4, + 0x80, 0xE4, 0x0A, 0xC8, 0x98, 0xE4, 0x09, 0x77, 0x98, 0xB8, 0x00, 0x40, + 0x6E, 0x64, 0x8C, 0xB8, 0x08, 0x08, 0x09, 0x18, 0xC1, 0xC0, 0xEF, 0xC0, + 0xF3, 0xDB, 0x01, 0xA8, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x00, 0xA8, + 0x0A, 0x40, 0xCC, 0x66, 0x11, 0x18, 0x02, 0x40, 0xDB, 0x4C, 0x01, 0x18, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x08, 0x70, 0x40, 0x18, 0x19, + 0x01, 0xA8, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA9, 0x09, 0x08, 0x10, 0x40, 0x10, 0x09, 0x98, 0xB8, 0xBC, 0x40, + 0x09, 0x28, 0xA5, 0xDE, 0x80, 0xE4, 0xED, 0x7F, 0xF7, 0xDF, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0xC5, 0xDE, 0x20, 0xB5, 0x07, 0xB1, + 0xFD, 0xB6, 0x18, 0xE4, 0x08, 0x77, 0x0C, 0xA0, 0x00, 0x08, 0x11, 0x38, + 0x08, 0x77, 0x08, 0xA2, 0x02, 0x08, 0x21, 0x38, 0x00, 0x77, 0x0C, 0xA8, + 0x08, 0x09, 0x89, 0xE4, 0x7D, 0xC8, 0x31, 0x38, 0x00, 0xA0, 0x01, 0x30, + 0x51, 0x30, 0x89, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0x2C, 0xD4, 0x00, 0x40, + 0x9F, 0xBC, 0x41, 0x39, 0x04, 0x77, 0x04, 0xA9, 0x09, 0x08, 0x21, 0x18, + 0x09, 0x77, 0x00, 0xA2, 0x02, 0x00, 0xED, 0x7F, 0xEC, 0xDF, 0xE0, 0xC8, + 0x35, 0xD4, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA2, 0x02, 0x09, 0x59, 0x40, + 0x39, 0x10, 0x07, 0x77, 0x04, 0xA0, 0x00, 0x08, 0x41, 0x18, 0x06, 0x77, + 0x08, 0xA2, 0x02, 0x08, 0x6A, 0x40, 0x19, 0x18, 0x06, 0x77, 0x0C, 0xA0, + 0x00, 0x08, 0x6A, 0x40, 0x29, 0x18, 0x07, 0x77, 0x00, 0xA2, 0x02, 0x08, + 0x00, 0x40, 0x8F, 0xBC, 0x6A, 0x40, 0x39, 0x18, 0x03, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0x00, 0x77, 0x00, 0xA2, 0x02, 0x08, 0xE2, 0xC8, 0x1C, 0xD5, + 0x41, 0x30, 0x89, 0xE4, 0x00, 0x40, 0x8F, 0xBC, 0x15, 0xD4, 0x01, 0xA8, + 0x01, 0x38, 0x04, 0x77, 0x04, 0xA9, 0x09, 0x08, 0x21, 0x18, 0x09, 0x77, + 0x00, 0xA2, 0x02, 0x00, 0xED, 0x7F, 0xB7, 0xDF, 0xE0, 0xC8, 0xCB, 0xD5, + 0x80, 0xE4, 0xED, 0x7F, 0x93, 0xDF, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, + 0x08, 0x09, 0xC9, 0xDE, 0x51, 0x38, 0xB6, 0xDE, 0x01, 0xA8, 0x41, 0x38, + 0x01, 0x38, 0xE7, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, + 0xED, 0x7F, 0xA1, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0x12, 0xD4, 0x00, 0x29, + 0x00, 0x70, 0x90, 0xBD, 0x0E, 0x77, 0x00, 0xA8, 0x08, 0x19, 0x10, 0x29, + 0x00, 0x70, 0x90, 0xBD, 0x0E, 0x77, 0x04, 0xA8, 0x08, 0x19, 0xB0, 0x08, + 0x09, 0x77, 0x00, 0xA9, 0x09, 0x18, 0x40, 0x88, 0x0C, 0x77, 0x00, 0xA9, + 0x09, 0x18, 0x30, 0x88, 0x08, 0x77, 0x08, 0xA9, 0x09, 0x18, 0x02, 0x40, + 0x90, 0x28, 0x42, 0xC8, 0x02, 0x40, 0xA0, 0x89, 0x89, 0xBD, 0x0B, 0x77, + 0x0C, 0xA9, 0x09, 0x18, 0x00, 0x28, 0x88, 0xB8, 0x01, 0x40, 0x03, 0xD7, + 0x02, 0x40, 0xC0, 0x28, 0x42, 0xC8, 0x02, 0x40, 0xB0, 0x89, 0x89, 0xBD, + 0x0F, 0x77, 0x00, 0xA9, 0x09, 0x18, 0x06, 0x40, 0x00, 0x08, 0x0F, 0x77, + 0x04, 0xA9, 0x09, 0x18, 0x06, 0x40, 0x10, 0x08, 0x0D, 0x77, 0x08, 0xA9, + 0x09, 0x18, 0x04, 0x40, 0x20, 0x08, 0x0F, 0x77, 0x08, 0xA9, 0x09, 0x18, + 0x04, 0x40, 0x30, 0x08, 0x0F, 0x77, 0x0C, 0xA9, 0x09, 0x18, 0xE0, 0x08, + 0x0C, 0x77, 0x04, 0xA9, 0x09, 0x18, 0x0D, 0x40, 0x40, 0x28, 0x0D, 0x77, + 0x0C, 0xA9, 0x09, 0x18, 0x04, 0x40, 0x10, 0x08, 0x03, 0x77, 0x00, 0xA9, + 0x09, 0x18, 0x03, 0x40, 0xE0, 0x29, 0x42, 0xC9, 0x03, 0x40, 0xF0, 0x88, + 0x98, 0xBD, 0x0B, 0x77, 0x04, 0xA8, 0x08, 0x19, 0x04, 0x40, 0x80, 0x29, + 0x42, 0xC9, 0x04, 0x40, 0x90, 0x88, 0x98, 0xBD, 0x0B, 0x77, 0x08, 0xA8, + 0x08, 0x19, 0x70, 0x08, 0x0A, 0x77, 0x08, 0xA9, 0x09, 0x18, 0x01, 0x40, + 0x60, 0x89, 0x42, 0xC9, 0x04, 0x40, 0x10, 0x28, 0x00, 0x40, 0x8F, 0xBC, + 0x12, 0xC8, 0x98, 0xBD, 0x04, 0x40, 0x00, 0x28, 0x00, 0x40, 0x8F, 0xBC, + 0x98, 0xBD, 0x0A, 0x77, 0x00, 0xA8, 0x08, 0x19, 0x0A, 0x40, 0x00, 0x29, + 0x00, 0x40, 0x9F, 0xBC, 0x0B, 0x40, 0x00, 0x28, 0x03, 0x40, 0x8F, 0xBC, + 0x12, 0xC8, 0x98, 0xBD, 0x05, 0x40, 0xD0, 0x28, 0x00, 0x40, 0x83, 0xBC, + 0x2A, 0xC8, 0x98, 0xBD, 0x0D, 0x40, 0x30, 0x28, 0x7E, 0xC8, 0x98, 0xBD, + 0x0E, 0x77, 0x08, 0xA8, 0x08, 0x19, 0x05, 0x40, 0x10, 0x08, 0x0E, 0x77, + 0x0C, 0xA9, 0x09, 0x18, 0x04, 0x40, 0x00, 0x29, 0x00, 0x40, 0x9F, 0xBC, + 0x04, 0x40, 0x10, 0x28, 0x00, 0x40, 0x8F, 0xBC, 0x12, 0xC8, 0x98, 0xBD, + 0x20, 0x28, 0x00, 0x40, 0x8F, 0xBC, 0x22, 0xC8, 0x98, 0xBD, 0x01, 0x40, + 0x60, 0x88, 0x42, 0xC8, 0x98, 0xBD, 0x0A, 0x77, 0x00, 0xA8, 0x08, 0x19, + 0x01, 0x40, 0x80, 0x29, 0x42, 0xC9, 0x01, 0x40, 0x90, 0x88, 0x98, 0xBD, + 0x0A, 0x77, 0x04, 0xA8, 0x08, 0x19, 0x70, 0x89, 0x01, 0x40, 0x50, 0x28, + 0x00, 0x40, 0x81, 0xBC, 0x22, 0xC8, 0x98, 0xBD, 0x01, 0x40, 0x40, 0x28, + 0x00, 0x40, 0x81, 0xBC, 0x26, 0xC8, 0x98, 0xBD, 0x01, 0x40, 0x30, 0x28, + 0x00, 0x40, 0x81, 0xBC, 0x2A, 0xC8, 0x98, 0xBD, 0x01, 0x40, 0x20, 0x28, + 0x00, 0x40, 0x81, 0xBC, 0x2E, 0xC8, 0x98, 0xBD, 0x01, 0x40, 0x10, 0x88, + 0x32, 0xC8, 0x98, 0xBD, 0x0D, 0x40, 0x10, 0x28, 0x00, 0x40, 0x87, 0xBC, + 0x56, 0xC8, 0x98, 0xBD, 0x60, 0x28, 0x01, 0x40, 0x8F, 0xBC, 0x62, 0xC8, + 0x98, 0xBD, 0x01, 0x40, 0x00, 0x28, 0x00, 0x40, 0x81, 0xBC, 0x76, 0xC8, + 0x98, 0xBD, 0x50, 0x28, 0x7A, 0xC8, 0x98, 0xBD, 0x09, 0x77, 0x08, 0xA8, + 0x08, 0x19, 0x60, 0x08, 0x0A, 0x77, 0x0C, 0xA9, 0x09, 0x18, 0x50, 0x08, + 0x0B, 0x77, 0x00, 0xA9, 0x09, 0x18, 0x0D, 0x40, 0x10, 0x89, 0x22, 0xC9, + 0x0B, 0x40, 0x10, 0x88, 0x98, 0xBD, 0x0D, 0x77, 0x00, 0xA8, 0x08, 0x19, + 0x05, 0x40, 0x30, 0x08, 0x07, 0x77, 0x04, 0xA9, 0x09, 0x18, 0x07, 0x40, + 0x10, 0x08, 0x0C, 0x77, 0x08, 0xA9, 0x09, 0x18, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA9, 0x09, 0x08, 0x6B, 0x40, 0x38, 0x08, 0x0C, 0x77, 0x0C, 0xA9, + 0x09, 0x18, 0xEC, 0x7F, 0x39, 0xDF, 0x0D, 0x77, 0x04, 0xA9, 0x09, 0x18, + 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x00, 0x28, 0xFF, 0x4F, 0x8F, 0xBC, + 0x98, 0xE4, 0x42, 0xC9, 0x98, 0xBD, 0x0E, 0x77, 0x00, 0xA8, 0x08, 0x19, + 0x10, 0x28, 0xFF, 0x4F, 0x8F, 0xBC, 0x98, 0xE4, 0x42, 0xC9, 0x98, 0xBD, + 0x0E, 0x77, 0x04, 0xA8, 0x08, 0x19, 0xEC, 0x7F, 0x62, 0xDF, 0xFE, 0x7F, + 0xE5, 0xDE, 0x00, 0xA8, 0x02, 0x40, 0xC0, 0x38, 0x02, 0x40, 0xB0, 0x38, + 0x00, 0xA8, 0xFE, 0x7F, 0xFB, 0xDE, 0x0A, 0x40, 0xCC, 0x66, 0x28, 0x09, + 0x0A, 0x40, 0xCC, 0x66, 0x38, 0x19, 0x00, 0x40, 0x91, 0xBE, 0x0A, 0x40, + 0xCC, 0x66, 0x28, 0x19, 0xA0, 0xE0, 0x20, 0xB5, 0x1F, 0xB1, 0xFD, 0xB6, + 0x48, 0xE4, 0x00, 0xA1, 0x01, 0xA3, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, + 0x08, 0x02, 0x02, 0xE4, 0x5C, 0x40, 0x00, 0xB8, 0x93, 0xE4, 0x86, 0xC9, + 0x14, 0x08, 0x89, 0xBC, 0x09, 0xD5, 0x93, 0xE4, 0x00, 0x28, 0xA2, 0xC9, + 0x79, 0xE0, 0x59, 0x40, 0x22, 0x08, 0x89, 0xBC, 0x59, 0x40, 0x22, 0x18, + 0xC1, 0xC1, 0xC1, 0xC0, 0x01, 0x40, 0x1E, 0xBF, 0xED, 0xDB, 0x00, 0xA8, + 0x14, 0x18, 0x18, 0xE4, 0x01, 0xA2, 0x04, 0xDE, 0xC1, 0xC1, 0x01, 0x40, + 0x1E, 0xBF, 0x1D, 0xD8, 0x92, 0xE4, 0x86, 0xC9, 0x24, 0x08, 0x89, 0xBC, + 0xF7, 0xD5, 0xEC, 0x7F, 0x32, 0xDF, 0xE0, 0xC8, 0x19, 0xD5, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x00, 0x81, 0xE4, 0x80, 0xB8, 0x92, 0xE4, + 0xBC, 0x40, 0x08, 0x28, 0xA2, 0xC9, 0x79, 0xE0, 0x59, 0x40, 0x00, 0x08, + 0x89, 0xBC, 0x59, 0x40, 0x00, 0x18, 0xC1, 0xC1, 0x01, 0x40, 0x1E, 0xBF, + 0xE3, 0xDB, 0x00, 0xA8, 0x24, 0x18, 0x03, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x00, 0x81, 0xE4, 0x80, 0xB8, + 0x92, 0xE4, 0xB8, 0x40, 0x08, 0x28, 0xA2, 0xC9, 0x79, 0xE0, 0x59, 0x40, + 0x30, 0x08, 0x89, 0xBC, 0x59, 0x40, 0x30, 0x18, 0xC9, 0xDE, 0x20, 0xB5, + 0x07, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x00, 0xA2, 0xCC, 0xC1, 0x0F, 0xDE, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x08, 0x08, 0xB8, 0xBC, 0x40, + 0x00, 0x28, 0x42, 0xDF, 0xFD, 0xA8, 0x01, 0x18, 0xC1, 0xC2, 0xC4, 0xC1, + 0x01, 0x40, 0x2E, 0xBF, 0x16, 0xD8, 0x01, 0x00, 0xE0, 0xC0, 0x13, 0xD9, + 0xEB, 0x7F, 0xEB, 0xDF, 0xE0, 0xC8, 0xEA, 0xD4, 0x00, 0x40, 0xF6, 0x63, + 0x08, 0xA9, 0x09, 0x08, 0x08, 0xB8, 0xB8, 0x40, 0x00, 0x28, 0x2C, 0xDF, + 0xFD, 0xA8, 0x01, 0x18, 0xC1, 0xC2, 0xC4, 0xC1, 0x01, 0x40, 0x2E, 0xBF, + 0xEA, 0xDB, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x1F, 0xB1, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x01, 0x6D, 0x40, 0x18, 0xB8, 0x04, 0x40, + 0x21, 0x23, 0x93, 0xE4, 0x09, 0xE0, 0xFD, 0xA8, 0x13, 0xD5, 0x01, 0x24, + 0x00, 0xA0, 0x89, 0xE4, 0xDF, 0xC8, 0xE0, 0xC8, 0x08, 0xDB, 0x28, 0xE4, + 0x91, 0xE4, 0x90, 0xB8, 0x19, 0x28, 0x09, 0x38, 0xC1, 0xC0, 0x20, 0xBF, + 0xF9, 0xD8, 0x83, 0xE4, 0xDF, 0xC8, 0x04, 0x40, 0x21, 0x38, 0x84, 0xE4, + 0x1F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x00, 0x6D, 0x40, 0x08, 0xB8, + 0x04, 0x40, 0x20, 0x29, 0x02, 0x40, 0x91, 0xBF, 0x0B, 0xD8, 0x89, 0xE4, + 0x08, 0xE0, 0x80, 0xB8, 0x08, 0x31, 0x89, 0xE4, 0xC1, 0xC8, 0x04, 0x40, + 0x20, 0x38, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0xD0, 0x62, + 0x00, 0xA8, 0xF6, 0x7F, 0xCA, 0xDF, 0x04, 0x40, 0x20, 0x29, 0x89, 0xE4, + 0x08, 0xE0, 0x80, 0xB8, 0x08, 0x31, 0x89, 0xE4, 0xC1, 0xC8, 0x04, 0x40, + 0x20, 0x38, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, + 0xFD, 0xB6, 0xEB, 0x7F, 0x84, 0xDF, 0xE0, 0xC8, 0x10, 0xD5, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0x59, 0x40, 0x09, 0x08, 0x78, 0xE0, + 0x58, 0x40, 0x39, 0x00, 0x08, 0xBC, 0x01, 0xA8, 0x01, 0xD4, 0x80, 0xE4, + 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, + 0x08, 0x09, 0x59, 0x40, 0x39, 0x08, 0x78, 0xE0, 0x59, 0x40, 0x19, 0x00, + 0x08, 0xBC, 0x59, 0x40, 0x29, 0x08, 0x78, 0xE0, 0xEB, 0xDE, 0x20, 0xB5, + 0x0F, 0xB1, 0xFD, 0xB6, 0x38, 0xE4, 0xEB, 0x7F, 0x5E, 0xDF, 0xE0, 0xC8, + 0x2E, 0xD5, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0x59, 0x40, + 0x29, 0x08, 0x78, 0xE0, 0x59, 0x40, 0x19, 0x01, 0x18, 0xBC, 0x00, 0xA2, + 0x04, 0xDE, 0xC1, 0xC2, 0x01, 0x40, 0x2E, 0xBF, 0x2C, 0xDC, 0x01, 0xA0, + 0x8A, 0xC0, 0x80, 0xE4, 0x81, 0xBC, 0xF7, 0xD5, 0xEB, 0x7F, 0x45, 0xDF, + 0xE0, 0xC8, 0x27, 0xD4, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, + 0x59, 0x40, 0x39, 0x08, 0x80, 0xBD, 0x59, 0x40, 0x39, 0x18, 0x59, 0x40, + 0x29, 0x08, 0x80, 0xBD, 0x59, 0x40, 0x29, 0x18, 0x93, 0xB8, 0xB8, 0x40, + 0x09, 0x32, 0x82, 0xE4, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0x59, 0x40, 0x39, 0x08, 0x78, 0xE0, + 0x59, 0x40, 0x19, 0x01, 0x18, 0xBC, 0x59, 0x40, 0x29, 0x08, 0x78, 0xE0, + 0xCD, 0xDE, 0xFF, 0xA8, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x00, 0x40, + 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x09, 0xDD, 0xDE, 0x1F, 0xB1, 0x48, 0xE4, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x03, 0x59, 0x40, 0x03, 0x08, + 0x78, 0xE0, 0x58, 0x40, 0x33, 0x01, 0x18, 0xBC, 0x00, 0xA0, 0x01, 0xA2, + 0x43, 0xB8, 0x5C, 0x40, 0x40, 0xB8, 0x04, 0xDE, 0xC1, 0xC0, 0x01, 0x40, + 0x0E, 0xBF, 0x0F, 0xDC, 0x92, 0xE4, 0x82, 0xC9, 0x89, 0xE4, 0x81, 0xBC, + 0xF7, 0xD5, 0x59, 0x40, 0x03, 0x08, 0x89, 0xBD, 0x59, 0x40, 0x03, 0x18, + 0x04, 0x40, 0x04, 0x30, 0x80, 0xE4, 0x1F, 0xB0, 0xA0, 0xE0, 0xFF, 0xA8, + 0x1F, 0xB0, 0xA0, 0xE0, 0x5F, 0xB1, 0x48, 0xE4, 0x68, 0xE4, 0x02, 0x40, + 0x9C, 0x70, 0x60, 0xB8, 0x00, 0xA1, 0x04, 0x40, 0xA2, 0x59, 0x78, 0x31, + 0x04, 0x40, 0x35, 0x75, 0x08, 0x31, 0x00, 0xA9, 0x02, 0x40, 0xD2, 0x4C, + 0x38, 0x19, 0x02, 0x40, 0xDC, 0x4C, 0x38, 0x19, 0x01, 0xA8, 0x03, 0x40, + 0x3C, 0x62, 0x34, 0x18, 0xFF, 0xA0, 0x02, 0x40, 0xC7, 0x4C, 0x14, 0x10, + 0x02, 0x40, 0xDD, 0x4C, 0x34, 0x19, 0x02, 0x40, 0xDE, 0x4C, 0x04, 0x19, + 0x02, 0x40, 0xDE, 0x4C, 0x24, 0x19, 0x02, 0x40, 0xDE, 0x4C, 0x14, 0x19, + 0x02, 0x40, 0x9A, 0x5A, 0x34, 0x19, 0x02, 0x40, 0x9B, 0x5A, 0x84, 0x39, + 0x02, 0x40, 0xAE, 0x5A, 0x04, 0x19, 0x02, 0x40, 0xAD, 0x5A, 0x04, 0x19, + 0x03, 0x40, 0x3C, 0x62, 0x04, 0x19, 0x03, 0x40, 0x3C, 0x62, 0x14, 0x19, + 0x02, 0x40, 0xAD, 0x5A, 0x14, 0x10, 0x02, 0x40, 0xAD, 0x5A, 0x24, 0x10, + 0x00, 0x60, 0x00, 0x40, 0x00, 0xA8, 0x02, 0x40, 0xAB, 0x5A, 0x04, 0x18, + 0x0A, 0x40, 0xE0, 0x66, 0x24, 0x18, 0x0A, 0x40, 0xE0, 0x66, 0x34, 0x18, + 0x0A, 0x40, 0xE1, 0x66, 0x14, 0x19, 0xFE, 0xA8, 0x0A, 0x40, 0xE1, 0x66, + 0x04, 0x18, 0x0A, 0x40, 0xE1, 0x66, 0x24, 0x19, 0x04, 0x40, 0x41, 0x75, + 0x14, 0x39, 0x02, 0x40, 0xC6, 0x4C, 0x34, 0x10, 0x02, 0x40, 0xE0, 0x4C, + 0x14, 0x19, 0x06, 0xA8, 0x02, 0x40, 0xDB, 0x4C, 0x34, 0x18, 0x02, 0x40, + 0xDC, 0x4C, 0x04, 0x18, 0x02, 0x40, 0xDC, 0x4C, 0x14, 0x19, 0x02, 0x40, + 0xDB, 0x4C, 0x24, 0x19, 0x0A, 0x40, 0xE0, 0x66, 0x14, 0x19, 0x03, 0x40, + 0x3D, 0x62, 0x34, 0x19, 0x07, 0x40, 0x7C, 0x44, 0x04, 0x31, 0x07, 0x40, + 0x7C, 0x44, 0x44, 0x31, 0x02, 0x40, 0x9B, 0x70, 0x24, 0x10, 0x02, 0x40, + 0xDF, 0x4C, 0x04, 0x19, 0x02, 0x40, 0xAC, 0x5A, 0x34, 0x19, 0x19, 0xE4, + 0x94, 0xE4, 0x02, 0x40, 0xB0, 0x5A, 0x90, 0xB8, 0x84, 0xE4, 0x56, 0xA0, + 0x02, 0x40, 0x70, 0x70, 0x08, 0x19, 0x02, 0x40, 0x85, 0x70, 0x38, 0x11, + 0xDF, 0xC0, 0xC4, 0xC8, 0x40, 0x40, 0x90, 0xB8, 0xE0, 0xC0, 0xF4, 0xDA, + 0xFF, 0xA1, 0x01, 0xA3, 0x00, 0xA2, 0x96, 0xE4, 0x3A, 0x41, 0x9B, 0xB8, + 0x86, 0xE4, 0x11, 0xA0, 0x00, 0x40, 0x43, 0x6C, 0x08, 0x31, 0x01, 0x40, + 0x38, 0x63, 0x48, 0x31, 0x00, 0x40, 0x45, 0x6C, 0x28, 0x33, 0x01, 0x40, + 0x3A, 0x63, 0x68, 0x33, 0x00, 0x40, 0x47, 0x6C, 0x48, 0x32, 0x00, 0x40, + 0x49, 0x6C, 0x68, 0x32, 0x09, 0x31, 0x3A, 0x41, 0x9C, 0xB8, 0xDF, 0xC0, + 0xC1, 0xC8, 0xE0, 0xC0, 0xE7, 0xDA, 0x21, 0xE4, 0x00, 0xA1, 0x96, 0xE4, + 0x3C, 0x56, 0x9B, 0xB8, 0x86, 0xE4, 0x40, 0xA0, 0x00, 0x40, 0x7C, 0x78, + 0x08, 0x32, 0x00, 0x40, 0x84, 0x78, 0x18, 0x33, 0x00, 0x40, 0x8C, 0x78, + 0x28, 0x31, 0x00, 0x40, 0x94, 0x78, 0x38, 0x31, 0x09, 0x32, 0x18, 0x40, + 0x90, 0xB8, 0xDF, 0xC0, 0xC1, 0xC8, 0xE0, 0xC0, 0xED, 0xDA, 0x01, 0x40, + 0x3D, 0x63, 0x06, 0x31, 0x01, 0x40, 0x3D, 0x63, 0x16, 0x31, 0x01, 0x40, + 0x3D, 0x63, 0x26, 0x31, 0x01, 0x40, 0x3D, 0x63, 0x36, 0x31, 0x01, 0x40, + 0x3D, 0x63, 0x46, 0x31, 0x01, 0x40, 0x3D, 0x63, 0x56, 0x31, 0x00, 0xA8, + 0x02, 0x40, 0xD1, 0x4C, 0x24, 0x18, 0x02, 0x40, 0xD2, 0x4C, 0x04, 0x18, + 0x5F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, + 0x68, 0xE4, 0x0A, 0x40, 0xCC, 0x66, 0x28, 0x02, 0x11, 0x40, 0x24, 0xE6, + 0x28, 0xB8, 0x03, 0x40, 0xA1, 0x68, 0x24, 0xB8, 0x04, 0x40, 0x35, 0x75, + 0x08, 0x23, 0x00, 0xA9, 0x93, 0xBF, 0x11, 0xDA, 0x12, 0x01, 0x01, 0xA4, + 0x08, 0xE4, 0x02, 0x40, 0x98, 0x5A, 0x08, 0xB8, 0x00, 0x28, 0xC1, 0xC0, + 0xA4, 0xE4, 0xA2, 0xCA, 0x8A, 0xE4, 0x81, 0xBD, 0x18, 0xE4, 0x12, 0x18, + 0xC1, 0xC9, 0x93, 0xBF, 0xF5, 0xD9, 0xFD, 0xA0, 0x82, 0xE4, 0xCC, 0xC8, + 0x1E, 0xA9, 0x08, 0x10, 0xC4, 0xC8, 0xDF, 0xC9, 0xE0, 0xC9, 0xFB, 0xDA, + 0x03, 0x40, 0x3D, 0x62, 0x06, 0x08, 0xE0, 0xC8, 0x06, 0xD5, 0x02, 0x40, + 0xDE, 0x4C, 0x36, 0x08, 0x08, 0x40, 0x80, 0xBC, 0x06, 0xD4, 0x0A, 0x40, + 0xCD, 0x66, 0xC6, 0x28, 0xE1, 0xC8, 0x00, 0x40, 0x6A, 0xD4, 0x04, 0x40, + 0xA2, 0x59, 0x76, 0x23, 0x00, 0xA9, 0x93, 0xBF, 0x11, 0xDA, 0x22, 0x01, + 0x01, 0xA4, 0x06, 0xE4, 0x02, 0x40, 0xCF, 0x4C, 0x08, 0xB8, 0x00, 0x28, + 0xC1, 0xC0, 0xA4, 0xE4, 0xA2, 0xCA, 0x8A, 0xE4, 0x81, 0xBD, 0x18, 0xE4, + 0x22, 0x18, 0xC1, 0xC9, 0x93, 0xBF, 0xF5, 0xD9, 0x02, 0x40, 0xD3, 0x4C, + 0x16, 0x08, 0xE0, 0xC8, 0x2F, 0xD4, 0x98, 0xE4, 0x02, 0x40, 0xAA, 0x5A, + 0x36, 0x03, 0x04, 0xDE, 0xC1, 0xC9, 0x01, 0x40, 0x9E, 0xBF, 0x29, 0xD8, + 0x09, 0xE4, 0x0A, 0xC0, 0x10, 0xE4, 0x12, 0xB8, 0x31, 0x08, 0x88, 0xB8, + 0x22, 0xD7, 0x08, 0x40, 0x21, 0x08, 0x83, 0xBF, 0xF1, 0xD4, 0x02, 0x40, + 0xDB, 0x4C, 0x26, 0x08, 0xE0, 0xC8, 0x19, 0xD4, 0x01, 0x40, 0x9D, 0xBF, + 0x09, 0xDB, 0xE8, 0xDE, 0x40, 0x08, 0x01, 0x18, 0xC1, 0xC9, 0x01, 0x40, + 0x9D, 0xBF, 0x08, 0xD8, 0x09, 0xE4, 0x0A, 0xC0, 0x02, 0xB8, 0x10, 0xE4, + 0xCC, 0xC1, 0x01, 0x08, 0x88, 0xB8, 0xF2, 0xD6, 0x02, 0x40, 0xAA, 0x5A, + 0x36, 0x03, 0xD6, 0xDE, 0x02, 0x40, 0xAA, 0x5A, 0x36, 0x03, 0x10, 0x40, + 0x22, 0x08, 0x83, 0xBF, 0x1C, 0xD5, 0x86, 0xE4, 0x3A, 0x40, 0xE5, 0xDF, + 0x02, 0x40, 0xDE, 0x4C, 0x36, 0x08, 0x0E, 0x40, 0x80, 0xBC, 0x04, 0xD4, + 0x01, 0xA8, 0x03, 0x40, 0x3C, 0x62, 0x36, 0x18, 0x00, 0xA8, 0x02, 0x40, + 0x9A, 0x5A, 0x36, 0x18, 0x02, 0x40, 0x9B, 0x5A, 0x86, 0x38, 0x03, 0xB6, + 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x86, 0xE4, 0x3A, 0x40, 0xDD, 0xDF, + 0xA9, 0xDE, 0xFD, 0xA8, 0x10, 0x40, 0x12, 0x18, 0xE0, 0xDE, 0x20, 0xB5, + 0xFD, 0xB6, 0x02, 0x40, 0xA0, 0x4C, 0x80, 0xB8, 0x09, 0x09, 0xF5, 0x7F, + 0x09, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, 0xFB, 0xB6, + 0x18, 0xE4, 0x39, 0xE4, 0x0D, 0x90, 0x90, 0xE4, 0x02, 0x40, 0x2B, 0xDF, + 0xEA, 0x7F, 0x46, 0xDF, 0x01, 0xA8, 0x0A, 0x40, 0xE2, 0x66, 0x11, 0x18, + 0x00, 0xA9, 0x03, 0x40, 0x3C, 0x62, 0x21, 0x19, 0x40, 0x28, 0xE1, 0xC8, + 0x38, 0xD5, 0x29, 0xE4, 0x81, 0xE4, 0x90, 0xE4, 0x39, 0xDF, 0x08, 0xE4, + 0x03, 0x40, 0x3C, 0x62, 0x21, 0x08, 0xE0, 0xC8, 0x05, 0xD4, 0x02, 0x40, + 0xD3, 0x4C, 0x11, 0x09, 0xE0, 0xC9, 0x1A, 0xD5, 0x01, 0xA8, 0x03, 0x40, + 0x3C, 0x62, 0x31, 0x18, 0x02, 0x40, 0xAE, 0x5A, 0x01, 0x08, 0xC1, 0xC8, + 0x02, 0x40, 0xAE, 0x5A, 0x01, 0x18, 0x81, 0xE4, 0x32, 0x40, 0xB2, 0xDF, + 0x0A, 0x40, 0xE2, 0x66, 0x21, 0x18, 0x83, 0x90, 0x84, 0x92, 0x81, 0xE4, + 0x93, 0xE4, 0x29, 0x40, 0x0C, 0xDF, 0x05, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x08, 0x0E, 0x40, 0x80, 0xBC, 0xE4, 0xD5, + 0x02, 0x40, 0xAA, 0x5A, 0x01, 0x08, 0x88, 0xB8, 0xDF, 0xD7, 0x03, 0x40, + 0x3C, 0x62, 0x31, 0x19, 0xDB, 0xDE, 0x28, 0xE4, 0x81, 0xE4, 0x2F, 0x40, + 0xCE, 0xDF, 0xC7, 0xDE, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, + 0x18, 0xE4, 0x69, 0xE4, 0x00, 0xAA, 0x48, 0xE4, 0x02, 0x40, 0xAE, 0x5A, + 0x44, 0xB8, 0x00, 0xA0, 0x04, 0x10, 0x02, 0x40, 0xAB, 0x5A, 0x18, 0x10, + 0x02, 0x40, 0xD3, 0x4C, 0x18, 0x10, 0x02, 0x40, 0xE0, 0x4C, 0x18, 0x10, + 0x0A, 0x40, 0xE0, 0x66, 0x18, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0xFC, 0xD4, + 0x31, 0xE4, 0x02, 0x40, 0x9C, 0x70, 0x30, 0xB8, 0x81, 0xE4, 0x30, 0x40, + 0x9C, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, 0x01, 0x40, 0x59, 0xD5, 0x81, 0xE4, + 0x19, 0x40, 0x69, 0xDF, 0x08, 0xE4, 0x0A, 0x40, 0xE1, 0x66, 0x31, 0x08, + 0x02, 0x40, 0xAD, 0x5A, 0x11, 0x09, 0x89, 0xBF, 0x35, 0xD5, 0x0A, 0x40, + 0xCD, 0x66, 0x31, 0x08, 0x00, 0x40, 0x84, 0xBC, 0x2F, 0xD5, 0x02, 0x40, + 0xD1, 0x4C, 0x21, 0x08, 0x75, 0x42, 0x28, 0x88, 0xE0, 0xC8, 0x28, 0xD5, + 0x01, 0x40, 0x3D, 0x63, 0x23, 0x28, 0xE0, 0xC8, 0x00, 0x40, 0xF5, 0xD5, + 0x01, 0x40, 0x3D, 0x63, 0x73, 0x22, 0x2F, 0x41, 0x20, 0xE6, 0x23, 0xB8, + 0x4E, 0x5C, 0x24, 0xB8, 0x2F, 0x41, 0x00, 0xA9, 0x0A, 0x40, 0xCF, 0x66, + 0x31, 0x08, 0x0A, 0x40, 0xD1, 0x66, 0x01, 0x18, 0x0A, 0x40, 0xD1, 0x66, + 0x11, 0x19, 0x83, 0x99, 0x92, 0xE4, 0xE6, 0x7F, 0x7D, 0xDF, 0x98, 0xE4, + 0x2F, 0x41, 0x80, 0xBF, 0x00, 0x40, 0xDF, 0xD5, 0x02, 0x40, 0xAD, 0x5A, + 0x11, 0x08, 0x0A, 0x40, 0xE1, 0x66, 0x31, 0x18, 0xE4, 0xC0, 0x00, 0x40, + 0xE7, 0xD5, 0xE2, 0xC0, 0x01, 0x40, 0x2D, 0xD5, 0x02, 0x40, 0xD3, 0x4C, + 0x11, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0xE2, 0xD4, 0xE0, 0xC0, 0xAA, 0xD4, + 0x81, 0xE4, 0x96, 0xE4, 0x1D, 0x40, 0xD3, 0xDF, 0x04, 0x40, 0x41, 0x75, + 0x11, 0x28, 0xE0, 0xC8, 0x18, 0xDB, 0x28, 0xE4, 0x91, 0xE4, 0x02, 0x40, + 0xA0, 0x5A, 0x9A, 0xB8, 0x03, 0xDE, 0xC1, 0xC0, 0x20, 0xBF, 0x0F, 0xDB, + 0x09, 0x28, 0xC1, 0xC9, 0xFF, 0xC8, 0xF9, 0xD4, 0x0A, 0x40, 0xCE, 0x66, + 0x21, 0x08, 0x00, 0x40, 0x82, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x21, 0x18, + 0xC1, 0xC0, 0x20, 0xBF, 0xF1, 0xD8, 0x81, 0xE4, 0x3A, 0x40, 0x53, 0xDF, + 0x81, 0xE4, 0x02, 0x40, 0xEB, 0xDF, 0x08, 0xE0, 0x02, 0x40, 0xDC, 0x4C, + 0x21, 0x18, 0x06, 0xD4, 0x02, 0x40, 0xD2, 0x4C, 0x31, 0x08, 0xE0, 0xC8, + 0x00, 0x40, 0xFA, 0xD5, 0x4A, 0xE4, 0x04, 0xE0, 0x05, 0xD4, 0x02, 0x40, + 0xDC, 0x4C, 0x21, 0x08, 0xE0, 0xC8, 0x63, 0xD5, 0x0A, 0x40, 0xCC, 0x66, + 0x21, 0x02, 0x11, 0x40, 0x24, 0xE6, 0x21, 0xB8, 0x03, 0x40, 0xA1, 0x68, + 0x24, 0xB8, 0x02, 0x40, 0xD2, 0x4C, 0x31, 0x08, 0xE0, 0xC8, 0x00, 0x40, + 0xA6, 0xD5, 0x02, 0x40, 0xE0, 0x4C, 0x01, 0x03, 0xE0, 0xC3, 0x1E, 0xD4, + 0x02, 0x40, 0xDF, 0x4C, 0x11, 0x08, 0xE0, 0xC8, 0x19, 0xD4, 0x02, 0x40, + 0xDE, 0x4C, 0x31, 0x08, 0xFE, 0x7F, 0x87, 0xBC, 0x13, 0xD5, 0x02, 0x40, + 0xD1, 0x4C, 0x21, 0x00, 0x02, 0x40, 0xAA, 0x5A, 0x31, 0x09, 0x01, 0xA8, + 0x60, 0x20, 0x82, 0xC8, 0xDF, 0xC8, 0x89, 0xBC, 0x02, 0x40, 0x9B, 0x5A, + 0x81, 0x38, 0x18, 0xE0, 0x98, 0xBA, 0x02, 0x40, 0x9A, 0x5A, 0x31, 0x19, + 0xE0, 0xC4, 0x2F, 0xD5, 0x02, 0x40, 0xDB, 0x4C, 0x31, 0x08, 0x38, 0xBF, + 0x06, 0xD7, 0x02, 0x40, 0xDF, 0x4C, 0x11, 0x08, 0xE0, 0xC8, 0x00, 0x40, + 0xCA, 0xD4, 0x02, 0x40, 0xAA, 0x5A, 0x31, 0x08, 0x83, 0x98, 0x81, 0xE4, + 0x02, 0x40, 0xAA, 0x5A, 0x01, 0x09, 0x25, 0x40, 0x36, 0xDF, 0x02, 0x40, + 0xDF, 0x4C, 0x31, 0x08, 0xE0, 0xC8, 0x0F, 0xD4, 0x02, 0x40, 0xAC, 0x5A, + 0x31, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0xC3, 0xD5, 0x02, 0x40, 0xAA, 0x5A, + 0x31, 0x09, 0x02, 0x40, 0xAB, 0x5A, 0x01, 0x08, 0x98, 0xBF, 0x00, 0x40, + 0xBA, 0xD9, 0x81, 0xE4, 0x02, 0x40, 0xAA, 0x5A, 0x01, 0x09, 0x39, 0x40, + 0x7C, 0xDF, 0x00, 0xA8, 0x04, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, + 0x21, 0xE4, 0x02, 0x40, 0xA0, 0x4C, 0x20, 0xB8, 0x82, 0xE4, 0x0A, 0x40, + 0xE1, 0x66, 0x01, 0x09, 0xF4, 0x7F, 0xC6, 0xDF, 0xE0, 0xC8, 0x3A, 0xD5, + 0x82, 0xE4, 0x0A, 0x40, 0xE1, 0x66, 0x01, 0x09, 0xF4, 0x7F, 0xC8, 0xDF, + 0xE0, 0xC8, 0x06, 0xD4, 0x00, 0x60, 0x00, 0x40, 0x00, 0xA8, 0x0A, 0x40, + 0xE0, 0x66, 0x31, 0x18, 0xFE, 0xA8, 0x0A, 0x40, 0xE1, 0x66, 0x01, 0x18, + 0x0A, 0x40, 0xE0, 0x66, 0x11, 0x10, 0xFE, 0x7F, 0xE1, 0xDE, 0x83, 0xE4, + 0x23, 0x40, 0x3A, 0xDF, 0x28, 0xE4, 0xFF, 0x7F, 0x0D, 0xDE, 0x0A, 0x40, + 0xCF, 0x66, 0x31, 0x08, 0x89, 0xB8, 0x0A, 0x40, 0xCF, 0x66, 0x31, 0x18, + 0x0A, 0x40, 0xCE, 0x66, 0x01, 0x08, 0x00, 0x40, 0x84, 0xBD, 0x0A, 0x40, + 0xCE, 0x66, 0x01, 0x18, 0xFF, 0x7F, 0x10, 0xDE, 0xFF, 0xA8, 0x0A, 0x40, + 0xE1, 0x66, 0x31, 0x18, 0x81, 0xE4, 0x31, 0x40, 0x54, 0xDF, 0x03, 0xA8, + 0x04, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x00, 0x60, 0x00, 0x40, + 0x00, 0xA8, 0x0A, 0x40, 0xE0, 0x66, 0x21, 0x18, 0xBF, 0xDE, 0x81, 0xE4, + 0x18, 0x40, 0xAB, 0xDF, 0x02, 0x40, 0xDC, 0x4C, 0x21, 0x08, 0xE0, 0xC8, + 0xFF, 0x7F, 0x51, 0xD4, 0x0A, 0x40, 0xCC, 0x66, 0x21, 0x08, 0x01, 0xA9, + 0xA2, 0xC9, 0x0A, 0x40, 0xCC, 0x66, 0x11, 0x08, 0x89, 0xBD, 0x0A, 0x40, + 0xCC, 0x66, 0x11, 0x18, 0x0A, 0x40, 0xCF, 0x66, 0x11, 0x08, 0x02, 0x18, + 0xFF, 0x7F, 0x3F, 0xDE, 0x02, 0x40, 0xD2, 0x4C, 0x31, 0x08, 0xE0, 0xC8, + 0x51, 0xD4, 0x04, 0x08, 0x00, 0x40, 0x81, 0xBD, 0x04, 0x18, 0x24, 0x08, + 0x00, 0x40, 0x81, 0xBD, 0x24, 0x18, 0x0A, 0x40, 0xCE, 0x66, 0x11, 0x08, + 0x80, 0x40, 0x00, 0x40, 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x11, 0x18, + 0x01, 0xA8, 0x04, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x0A, 0x40, + 0xCE, 0x66, 0x11, 0x08, 0x00, 0x42, 0x00, 0x40, 0x80, 0xBD, 0xF1, 0xDE, + 0x01, 0xE4, 0x02, 0x40, 0xA0, 0x4C, 0x00, 0xB8, 0x80, 0xE4, 0xF3, 0x7F, + 0x4B, 0xDF, 0x98, 0xE4, 0x09, 0xE0, 0x02, 0x40, 0xAA, 0x5A, 0x01, 0x19, + 0x80, 0xE4, 0xF3, 0x7F, 0xA5, 0xDF, 0x02, 0x40, 0xAA, 0x5A, 0x01, 0x08, + 0x88, 0xB8, 0x26, 0xD7, 0x01, 0xAA, 0xFE, 0x7F, 0xEF, 0xDE, 0x81, 0xE4, + 0x02, 0x40, 0xA0, 0x4C, 0x80, 0xB8, 0x02, 0x40, 0xAA, 0x5A, 0x01, 0x09, + 0xF3, 0x7F, 0x5D, 0xDF, 0x00, 0xA8, 0x10, 0x40, 0x32, 0x18, 0xFF, 0x7F, + 0x32, 0xDE, 0x81, 0xE4, 0x02, 0x40, 0xA0, 0x4C, 0x80, 0xB8, 0x02, 0x40, + 0xAA, 0x5A, 0x01, 0x09, 0xF3, 0x7F, 0x74, 0xDF, 0x00, 0xA8, 0x11, 0x40, + 0x02, 0x18, 0x00, 0xA8, 0xFF, 0x7F, 0x3E, 0xDE, 0x81, 0xE4, 0x38, 0x40, + 0xA2, 0xDF, 0x80, 0xE4, 0xFF, 0x7F, 0x7E, 0xDE, 0x81, 0xE4, 0x30, 0x40, + 0xCE, 0xDF, 0xFE, 0x7F, 0xC7, 0xDE, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, + 0xFD, 0xB6, 0x28, 0xE4, 0x69, 0xE4, 0xA8, 0xE4, 0x02, 0x40, 0xAE, 0x5A, + 0xA4, 0xB8, 0x49, 0x29, 0xE1, 0xC9, 0x0E, 0xD5, 0x02, 0x40, 0xDB, 0x4C, + 0x18, 0x08, 0xE1, 0xC8, 0x69, 0xD5, 0x56, 0x28, 0xE2, 0xC8, 0x01, 0x40, + 0x89, 0xD5, 0x54, 0xD8, 0xE1, 0xC8, 0x57, 0xD4, 0x02, 0xA8, 0x56, 0xDE, + 0x06, 0x28, 0xE0, 0xC8, 0x01, 0x40, 0x83, 0xD5, 0x02, 0x40, 0xDB, 0x4C, + 0x12, 0x19, 0x01, 0xA8, 0x0A, 0x40, 0xCC, 0x66, 0x32, 0x18, 0x00, 0xA4, + 0x0A, 0x40, 0xCC, 0x66, 0x22, 0x14, 0x0A, 0x40, 0xCC, 0x66, 0x12, 0x14, + 0x00, 0x60, 0x00, 0x40, 0x00, 0xA8, 0x02, 0x40, 0xDE, 0x4C, 0x32, 0x18, + 0xFE, 0xA8, 0x03, 0x40, 0x45, 0x62, 0xE2, 0x38, 0x03, 0x40, 0x4C, 0x62, + 0xE2, 0x38, 0x02, 0x40, 0xD7, 0x4C, 0x02, 0x14, 0xFF, 0xA8, 0x02, 0x40, + 0xAA, 0x5A, 0x02, 0x18, 0x0A, 0x40, 0xCF, 0x66, 0x02, 0x14, 0x02, 0x40, + 0xAD, 0x5A, 0x12, 0x18, 0x0A, 0x40, 0xE1, 0x66, 0x32, 0x18, 0x02, 0x40, + 0xD3, 0x4C, 0x12, 0x14, 0x02, 0xE4, 0x03, 0x40, 0xB2, 0x68, 0x08, 0xB8, + 0xFD, 0xA1, 0x82, 0xE4, 0x03, 0x40, 0xB3, 0x68, 0x84, 0xB8, 0x1E, 0xA9, + 0x08, 0x11, 0xC4, 0xC8, 0xDF, 0xC9, 0xE0, 0xC9, 0xFB, 0xDA, 0x10, 0x40, + 0x10, 0x11, 0x0A, 0x40, 0xCC, 0x66, 0x22, 0x00, 0x11, 0x40, 0x04, 0xE6, + 0x02, 0xB8, 0x03, 0x40, 0xA1, 0x68, 0x04, 0xB8, 0x10, 0x40, 0x10, 0x11, + 0x00, 0x40, 0x7B, 0xDE, 0xE3, 0xC8, 0x04, 0xD5, 0xE4, 0xC8, 0x01, 0x40, + 0x26, 0xD5, 0x00, 0xA8, 0x02, 0x40, 0xDB, 0x4C, 0x12, 0x18, 0x46, 0x28, + 0x04, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x02, 0x40, 0xDF, 0x4C, 0x02, 0x18, + 0x16, 0x28, 0xFF, 0xA9, 0xE0, 0xC8, 0x06, 0xD5, 0x98, 0xE4, 0xDF, 0xC9, + 0xE6, 0xC9, 0x01, 0x40, 0x15, 0xDB, 0x06, 0xA9, 0x09, 0xE0, 0x02, 0x40, + 0xDB, 0x4C, 0x32, 0x19, 0x26, 0x08, 0x02, 0x40, 0xAC, 0x5A, 0x22, 0x18, + 0x00, 0xA3, 0x0A, 0x40, 0xCB, 0x66, 0x32, 0x13, 0x0A, 0x40, 0xCC, 0x66, + 0x22, 0x04, 0x84, 0xE4, 0x02, 0x40, 0x00, 0x6A, 0x80, 0xE6, 0x82, 0xB8, + 0x05, 0x40, 0xCB, 0x52, 0x80, 0xB8, 0x0A, 0x40, 0xCB, 0x66, 0x02, 0x18, + 0x04, 0xE4, 0x00, 0x40, 0x03, 0x75, 0x04, 0xE6, 0x02, 0xB8, 0x03, 0x40, + 0xC4, 0x68, 0x00, 0xB8, 0x0A, 0x40, 0xCB, 0x66, 0x12, 0x10, 0x84, 0xE4, + 0x29, 0x43, 0x84, 0xE6, 0x82, 0xB8, 0x98, 0xE4, 0x03, 0x40, 0x77, 0x65, + 0x98, 0xB8, 0x99, 0x33, 0x03, 0x40, 0x77, 0x65, 0x38, 0x10, 0x34, 0x41, + 0x07, 0xA8, 0x0A, 0x40, 0xCC, 0x66, 0x02, 0x18, 0x0A, 0x40, 0xCC, 0x66, + 0x12, 0x08, 0x78, 0xE0, 0x01, 0xA1, 0x91, 0xE4, 0x92, 0xC9, 0x89, 0xBC, + 0x0A, 0xD5, 0x07, 0x40, 0x40, 0xE6, 0x42, 0xB8, 0xFE, 0xA8, 0x03, 0x40, + 0x45, 0x62, 0xE4, 0x38, 0x0A, 0x40, 0xCC, 0x66, 0x22, 0x04, 0x04, 0xE4, + 0x11, 0x40, 0x04, 0xE6, 0x02, 0xB8, 0x03, 0x40, 0xA1, 0x68, 0x04, 0xB8, + 0x10, 0x13, 0x20, 0x13, 0x10, 0x40, 0x30, 0x11, 0xFD, 0xA8, 0x10, 0x40, + 0x10, 0x18, 0x11, 0x40, 0x00, 0x11, 0x00, 0x13, 0xFE, 0xA8, 0x02, 0x40, + 0xAA, 0x5A, 0x02, 0x18, 0x0A, 0x40, 0xCF, 0x66, 0x12, 0x13, 0xFD, 0xA8, + 0xCC, 0xC0, 0x1E, 0xA9, 0x00, 0x18, 0xC4, 0xC0, 0xDF, 0xC9, 0xE0, 0xC9, + 0xFB, 0xDA, 0x00, 0xA0, 0x02, 0x40, 0xAB, 0x5A, 0x12, 0x10, 0xFF, 0xA1, + 0x02, 0x40, 0x94, 0x4D, 0x92, 0x31, 0x26, 0x28, 0x03, 0x40, 0x3E, 0x62, + 0x22, 0x18, 0x02, 0x40, 0xAD, 0x5A, 0x32, 0x10, 0x02, 0x40, 0xD2, 0x4C, + 0x12, 0x10, 0x02, 0x40, 0xD2, 0x4C, 0x22, 0x10, 0x8A, 0xE4, 0x01, 0x40, + 0x9D, 0xDF, 0x36, 0x28, 0x0A, 0x40, 0xCF, 0x66, 0x22, 0x18, 0x07, 0x40, + 0x7C, 0x44, 0x42, 0x29, 0xE1, 0xC9, 0x1B, 0xD4, 0x07, 0x40, 0x7C, 0x44, + 0x52, 0x28, 0x07, 0x40, 0x7C, 0x44, 0x12, 0x38, 0x07, 0x40, 0x7C, 0x44, + 0x62, 0x28, 0x07, 0x40, 0x7C, 0x44, 0x22, 0x38, 0x07, 0x40, 0x7C, 0x44, + 0x72, 0x28, 0x07, 0x40, 0x7C, 0x44, 0x32, 0x38, 0x07, 0x40, 0x7C, 0x44, + 0x02, 0x39, 0x07, 0x40, 0x7C, 0x44, 0x42, 0x30, 0x03, 0x40, 0x3D, 0x62, + 0x32, 0x10, 0x56, 0x08, 0x02, 0x40, 0xD3, 0x4C, 0x02, 0x18, 0x0A, 0x40, + 0xCD, 0x66, 0xA2, 0x31, 0x0A, 0x40, 0xCC, 0x66, 0x22, 0x04, 0x84, 0xE4, + 0x29, 0x43, 0x84, 0xE6, 0x82, 0xB8, 0x01, 0xE4, 0x03, 0x40, 0x4E, 0x62, + 0x8C, 0xB8, 0x1F, 0x40, 0x0F, 0xA9, 0x88, 0x30, 0xC2, 0xC8, 0xDF, 0xC9, + 0xE0, 0xC9, 0xFB, 0xDA, 0x84, 0xE4, 0x29, 0x43, 0x84, 0xE6, 0x82, 0xB8, + 0x03, 0x40, 0x8E, 0x62, 0x8C, 0xB8, 0x34, 0x41, 0x06, 0xA9, 0x88, 0x30, + 0xC2, 0xC8, 0xDF, 0xC9, 0xE0, 0xC9, 0xFB, 0xDA, 0x84, 0xE4, 0x29, 0x43, + 0x84, 0xE6, 0x82, 0xB8, 0x10, 0xE4, 0x03, 0x40, 0xF7, 0x64, 0x8A, 0xB8, + 0x1F, 0x40, 0x0F, 0xA9, 0x88, 0x31, 0xC2, 0xC8, 0xDF, 0xC9, 0xE0, 0xC9, + 0xFB, 0xDA, 0x04, 0xE4, 0x29, 0x43, 0x04, 0xE6, 0x02, 0xB8, 0x81, 0xE4, + 0x03, 0x40, 0x37, 0x65, 0x0A, 0xB8, 0x1F, 0x40, 0x0F, 0xA9, 0x80, 0x38, + 0xC2, 0xC0, 0xDF, 0xC9, 0xE0, 0xC9, 0xFB, 0xDA, 0x00, 0xA8, 0x0A, 0x40, + 0xCD, 0x66, 0xD2, 0x38, 0x46, 0x08, 0x0A, 0x40, 0xCD, 0x66, 0x32, 0x18, + 0x00, 0xA8, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x18, 0x0A, 0x40, 0xCE, 0x66, + 0x12, 0x18, 0x0A, 0x40, 0xCE, 0x66, 0x22, 0x18, 0x0A, 0x40, 0xCD, 0x66, + 0x02, 0x18, 0x0A, 0x40, 0xCE, 0x66, 0x32, 0x18, 0x10, 0x40, 0x00, 0xA9, + 0x0A, 0x40, 0xCF, 0x66, 0x32, 0x19, 0x0A, 0x40, 0xE0, 0x66, 0x02, 0x18, + 0x0A, 0x40, 0xE2, 0x66, 0x02, 0x18, 0x03, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, + 0x40, 0xB4, 0x06, 0xA8, 0xFE, 0x7F, 0xD8, 0xDE, 0xE0, 0xC9, 0xFE, 0x7F, + 0xE9, 0xDA, 0x00, 0xA9, 0xFE, 0x7F, 0xE6, 0xDE, 0x04, 0xA8, 0xFE, 0x7F, + 0xCF, 0xDE, 0x02, 0x40, 0xDB, 0x4C, 0x12, 0x18, 0xFE, 0x7F, 0x7B, 0xDE, + 0x04, 0xB3, 0x5F, 0xB1, 0x08, 0xE4, 0x00, 0xAA, 0x02, 0x40, 0xDC, 0x4C, + 0x08, 0x03, 0x02, 0x40, 0xDB, 0x4C, 0x38, 0x09, 0xE0, 0xC9, 0x00, 0x40, + 0x92, 0xD9, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x06, 0x06, 0x40, 0x16, 0x88, + 0xDF, 0xC8, 0x89, 0xBF, 0x48, 0xD8, 0x28, 0xE4, 0x02, 0x40, 0xDB, 0x4C, + 0x30, 0x12, 0x06, 0x40, 0x16, 0x88, 0xDF, 0xC8, 0x02, 0x40, 0xE0, 0x4C, + 0x00, 0x04, 0x48, 0xBF, 0x0C, 0xDD, 0xC1, 0xC2, 0x02, 0x40, 0xDB, 0x4C, + 0x30, 0x12, 0x0A, 0x40, 0xCE, 0x66, 0x20, 0x08, 0x00, 0x48, 0x80, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x20, 0x18, 0x03, 0x40, 0x3C, 0x62, 0x30, 0x08, + 0xE0, 0xC8, 0x04, 0xD5, 0x00, 0xA8, 0x02, 0x40, 0xDC, 0x4C, 0x10, 0x18, + 0x02, 0x40, 0xDE, 0x4C, 0x30, 0x09, 0x89, 0xE4, 0x0E, 0x40, 0x80, 0xBC, + 0x08, 0xD4, 0x89, 0xE4, 0x00, 0x40, 0x82, 0xBC, 0x52, 0xD5, 0x84, 0xE4, + 0xDF, 0xC8, 0x38, 0xBF, 0x4E, 0xD7, 0x06, 0xA3, 0x03, 0x40, 0x3D, 0x62, + 0x00, 0x08, 0xE0, 0xC8, 0x04, 0xD5, 0x89, 0xE4, 0x01, 0x40, 0x80, 0xBC, + 0x09, 0xD4, 0x0A, 0x40, 0xE1, 0x66, 0x10, 0x08, 0xE0, 0xC8, 0x0B, 0xD5, + 0x89, 0xE4, 0x00, 0x40, 0x88, 0xBC, 0x07, 0xD5, 0x01, 0xAA, 0x8A, 0xE4, + 0x5F, 0xB0, 0x04, 0xB2, 0xA0, 0xE0, 0x89, 0xE4, 0xB6, 0xDE, 0x02, 0x40, + 0xDB, 0x4C, 0x10, 0x01, 0xE3, 0xC1, 0x50, 0xD5, 0x42, 0xDB, 0xE5, 0xC1, + 0x45, 0xD5, 0x34, 0xBF, 0x01, 0xD6, 0x01, 0xAA, 0xE0, 0xC1, 0x0A, 0xD4, + 0x08, 0x40, 0x06, 0x88, 0xE0, 0xC8, 0x06, 0xD5, 0x02, 0x40, 0xDC, 0x4C, + 0x10, 0x08, 0xE0, 0xC8, 0x01, 0xD4, 0xA8, 0xE4, 0x42, 0xBF, 0x36, 0xDD, + 0x01, 0xAA, 0x02, 0x40, 0xDF, 0x4C, 0x10, 0x08, 0xE0, 0xC8, 0x02, 0xD5, + 0xE6, 0xC4, 0x45, 0xD5, 0x84, 0xE4, 0xDF, 0xC8, 0x38, 0xBF, 0x01, 0xDD, + 0x38, 0xE4, 0xE0, 0xC3, 0x3C, 0xD9, 0x01, 0xA8, 0x02, 0x40, 0xDC, 0x4C, + 0x10, 0x18, 0x03, 0xE0, 0x02, 0x40, 0xDC, 0x4C, 0x00, 0x13, 0x8A, 0xE4, + 0x5F, 0xB0, 0x04, 0xB2, 0xA0, 0xE0, 0x89, 0xE4, 0x00, 0x40, 0x84, 0xBC, + 0xAF, 0xD5, 0x84, 0xE4, 0xDF, 0xC8, 0x38, 0xBF, 0xAB, 0xD7, 0x34, 0xBF, + 0xA9, 0xD6, 0x34, 0xE4, 0xA7, 0xDE, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x06, + 0x06, 0x40, 0x16, 0x82, 0xDF, 0xC2, 0xFF, 0x7F, 0x6F, 0xDE, 0xE1, 0xC1, + 0xBE, 0xD9, 0x0E, 0x40, 0x90, 0xBC, 0xBB, 0xD4, 0x01, 0xAA, 0xB9, 0xDE, + 0xE0, 0xCA, 0xC9, 0xD4, 0x34, 0xBF, 0xD9, 0xD6, 0x34, 0xE4, 0xD7, 0xDE, + 0x02, 0x40, 0xA9, 0x5A, 0x30, 0x08, 0x00, 0x40, 0x81, 0xBE, 0x00, 0x40, + 0x81, 0xBC, 0xAB, 0xD5, 0x0E, 0x40, 0x90, 0xBC, 0xA8, 0xD4, 0x42, 0xBF, + 0xA6, 0xD7, 0x01, 0xAA, 0xA4, 0xDE, 0x00, 0xA3, 0xC2, 0xDE, 0x34, 0xBF, + 0xBE, 0xDD, 0x34, 0xE4, 0xBE, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, + 0x38, 0xE4, 0x0A, 0x40, 0xCC, 0x66, 0x28, 0x02, 0x11, 0x40, 0x24, 0xE6, + 0x28, 0xB8, 0x03, 0x40, 0xA1, 0x68, 0x24, 0xB8, 0x02, 0x40, 0xDB, 0x4C, + 0x18, 0x08, 0xE4, 0xC8, 0x04, 0xD5, 0x00, 0xA8, 0x03, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x02, 0x40, 0xAD, 0x5A, 0x03, 0x08, 0x00, 0x40, 0x83, 0xBC, + 0xF6, 0xD5, 0x13, 0xE4, 0x02, 0x40, 0xA0, 0x4C, 0x10, 0xB8, 0x81, 0xE4, + 0x02, 0x40, 0xAA, 0x5A, 0x03, 0x09, 0xF0, 0x7F, 0xA8, 0xDF, 0x00, 0xA0, + 0x10, 0x40, 0x32, 0x10, 0x81, 0xE4, 0x02, 0x40, 0xAA, 0x5A, 0x03, 0x09, + 0xF0, 0x7F, 0xC4, 0xDF, 0x11, 0x40, 0x02, 0x10, 0x01, 0xA8, 0xE0, 0xDE, + 0x00, 0xA9, 0x18, 0x19, 0x28, 0x19, 0x08, 0x19, 0xA0, 0xE0, 0x01, 0xA8, + 0xA0, 0xE0, 0x20, 0xB5, 0x7C, 0xB3, 0x5F, 0xB1, 0xD1, 0xB6, 0xD8, 0xE4, + 0xE9, 0xE4, 0x3E, 0x94, 0x00, 0xA3, 0xA8, 0x40, 0xDC, 0xE1, 0x0C, 0x33, + 0x15, 0x40, 0x13, 0xEA, 0x10, 0xA8, 0xE6, 0x7F, 0xB6, 0xDF, 0x28, 0xE4, + 0x30, 0xC8, 0x00, 0x40, 0x8F, 0xBC, 0x04, 0x38, 0x62, 0xE4, 0x24, 0xC6, + 0x00, 0x40, 0x67, 0xBC, 0x86, 0xE4, 0xC1, 0xC8, 0x06, 0x40, 0x14, 0x38, + 0xE7, 0xC8, 0x06, 0xDD, 0x15, 0x40, 0x18, 0xE8, 0x00, 0x40, 0x81, 0xBD, + 0x15, 0x40, 0x18, 0xEA, 0x82, 0xE4, 0x20, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x08, 0x40, 0x04, 0x38, 0x82, 0xE4, 0x18, 0xC8, 0x00, 0x40, 0x83, 0xBC, + 0x06, 0x40, 0x24, 0x38, 0x82, 0xE4, 0x14, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x06, 0x40, 0x54, 0x38, 0x01, 0x40, 0x2F, 0xBC, 0x06, 0x40, 0x34, 0x32, + 0x20, 0xA8, 0xE6, 0x7F, 0x88, 0xDF, 0x28, 0xE4, 0x06, 0x40, 0x64, 0x33, + 0x1F, 0xA1, 0x01, 0xA0, 0x06, 0x40, 0x64, 0x89, 0x81, 0xE4, 0x83, 0xBA, + 0xA0, 0xE4, 0xA2, 0xCA, 0x8A, 0xE4, 0x82, 0xBC, 0x03, 0xD5, 0x80, 0xE4, + 0x8E, 0xC8, 0x98, 0xBD, 0x06, 0x40, 0x64, 0x39, 0xC1, 0xC3, 0xE7, 0xC3, + 0xEF, 0xDB, 0x04, 0xA8, 0xE6, 0x7F, 0x6F, 0xDF, 0x28, 0xE4, 0x0C, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x07, 0x40, 0x44, 0x38, 0x82, 0xE4, 0x08, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x07, 0x40, 0x54, 0x38, 0x82, 0xE4, 0x04, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x07, 0x40, 0x64, 0x38, 0x00, 0x40, 0x21, 0xBC, + 0x07, 0x40, 0x74, 0x32, 0x20, 0xA8, 0xE6, 0x7F, 0x56, 0xDF, 0xE0, 0xC8, + 0x06, 0xD5, 0x15, 0x40, 0x18, 0xE8, 0x00, 0x40, 0x82, 0xBD, 0x15, 0x40, + 0x18, 0xEA, 0x0C, 0xA8, 0xE6, 0x7F, 0x4B, 0xDF, 0xE0, 0xC8, 0x06, 0xD5, + 0x15, 0x40, 0x18, 0xE8, 0x00, 0x40, 0x82, 0xBD, 0x15, 0x40, 0x18, 0xEA, + 0x06, 0xE4, 0x06, 0xC0, 0x80, 0xE4, 0xC8, 0xC8, 0xE6, 0x7F, 0x3D, 0xDF, + 0x28, 0xE4, 0x80, 0xC8, 0x06, 0x40, 0x44, 0x38, 0x00, 0xA3, 0x36, 0xBF, + 0x17, 0xDA, 0xB4, 0x40, 0xDB, 0xE1, 0xAC, 0x40, 0xDA, 0xE1, 0xDF, 0xC0, + 0x12, 0xE4, 0x80, 0xC1, 0x00, 0x40, 0x11, 0xBC, 0xDF, 0xC0, 0x92, 0xE4, + 0x80, 0xC9, 0x00, 0x40, 0x91, 0xBC, 0x8B, 0xE4, 0x83, 0xB8, 0x08, 0x31, + 0x8A, 0xE4, 0x83, 0xB8, 0x08, 0x39, 0xC1, 0xC3, 0x36, 0xBF, 0xED, 0xD9, + 0xE0, 0xC6, 0x0F, 0xDB, 0x08, 0xA8, 0x86, 0xBA, 0x06, 0xC8, 0xEB, 0x7F, + 0x52, 0xDF, 0xE7, 0x7F, 0x95, 0xDF, 0xE0, 0xC8, 0x06, 0xD5, 0x15, 0x40, + 0x18, 0xE8, 0x00, 0x40, 0x82, 0xBD, 0x15, 0x40, 0x18, 0xEA, 0x00, 0xA3, + 0x36, 0xBF, 0x38, 0xDA, 0xB4, 0x40, 0xDB, 0xE1, 0xAC, 0x40, 0xDA, 0xE1, + 0x06, 0xDE, 0x80, 0xE4, 0x08, 0xE0, 0x2A, 0xD4, 0xC1, 0xC3, 0x36, 0xBF, + 0x2D, 0xDA, 0x8B, 0xE4, 0x83, 0xB8, 0x9A, 0xE4, 0x93, 0xB8, 0x09, 0x20, + 0x08, 0x28, 0xE0, 0xC8, 0xF2, 0xD5, 0x20, 0xA8, 0xEB, 0x7F, 0x2F, 0xDF, + 0x0C, 0xA8, 0xEB, 0x7F, 0x2C, 0xDF, 0x20, 0xA8, 0xE5, 0x7F, 0xEF, 0xDF, + 0xE0, 0xC8, 0x06, 0xD5, 0x15, 0x40, 0x18, 0xE8, 0x00, 0x40, 0x82, 0xBD, + 0x15, 0x40, 0x18, 0xEA, 0x0C, 0xA8, 0xE5, 0x7F, 0xE4, 0xDF, 0xE0, 0xC8, + 0xDC, 0xD5, 0x15, 0x40, 0x18, 0xE8, 0x00, 0x40, 0x82, 0xBD, 0x15, 0x40, + 0x18, 0xEA, 0x80, 0xE4, 0x08, 0xE0, 0xD6, 0xD5, 0x08, 0xA8, 0xEB, 0x7F, + 0x10, 0xDF, 0xC1, 0xC3, 0x36, 0xBF, 0xD3, 0xD9, 0x0F, 0xA8, 0xE6, 0x7F, + 0x87, 0xDF, 0xA8, 0xE4, 0x14, 0x38, 0xE7, 0x7F, 0x4B, 0xDF, 0xE0, 0xC8, + 0x04, 0xD5, 0x0C, 0x28, 0x00, 0x40, 0x81, 0xBD, 0x0C, 0x38, 0x03, 0xA8, + 0xE6, 0x7F, 0x7A, 0xDF, 0x07, 0x40, 0x14, 0x38, 0xE7, 0x7F, 0x3E, 0xDF, + 0xE0, 0xC8, 0x04, 0xD5, 0x0C, 0x28, 0x00, 0x40, 0x82, 0xBD, 0x0C, 0x38, + 0x07, 0x40, 0x14, 0x20, 0x00, 0xA8, 0xE3, 0xC0, 0x27, 0xD5, 0x07, 0x40, + 0x24, 0x38, 0xE6, 0x7F, 0x8B, 0xDF, 0x94, 0x38, 0xE7, 0x7F, 0x2C, 0xDF, + 0xE1, 0xC8, 0x03, 0xD5, 0x94, 0x88, 0xE0, 0xC8, 0x0D, 0xD4, 0x0C, 0x28, + 0x00, 0x40, 0x83, 0xBD, 0x0C, 0x38, 0x0D, 0x38, 0x15, 0x40, 0x18, 0xE8, + 0x1D, 0x38, 0x8D, 0xE4, 0x2F, 0xB6, 0x5F, 0xB0, 0x7C, 0xB2, 0x40, 0xB4, + 0xE6, 0x7F, 0x74, 0xDF, 0xA4, 0x38, 0xE7, 0x7F, 0x15, 0xDF, 0xE1, 0xC8, + 0x03, 0xD5, 0xA4, 0x88, 0xE0, 0xC8, 0x08, 0xD4, 0x0C, 0x28, 0x00, 0x40, + 0x84, 0xBD, 0xE8, 0xDE, 0x01, 0xA8, 0xE5, 0x7F, 0x8A, 0xDF, 0xD5, 0xDE, + 0x01, 0xA8, 0xE5, 0x7F, 0x86, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0x3D, 0xD4, + 0x3A, 0x41, 0x94, 0x38, 0x3A, 0x41, 0xA4, 0x38, 0x3A, 0x41, 0xB4, 0x38, + 0x3A, 0x41, 0xC4, 0x38, 0x28, 0x40, 0xDB, 0xE1, 0x8B, 0xE4, 0x03, 0xA9, + 0xE9, 0x7F, 0x6D, 0xDF, 0xE6, 0x7F, 0xF2, 0xDF, 0xE0, 0xC8, 0x00, 0x40, + 0xFE, 0xD5, 0xE2, 0xC8, 0x01, 0x40, 0x3C, 0xD5, 0x01, 0x40, 0x67, 0xDC, + 0xE1, 0xC8, 0x00, 0x40, 0xFD, 0xD5, 0x00, 0xA9, 0x84, 0xE4, 0x06, 0xA3, + 0x02, 0x40, 0x18, 0x39, 0x01, 0x40, 0x18, 0x39, 0x03, 0x40, 0x18, 0x39, + 0xDF, 0xC3, 0xC1, 0xC8, 0xE0, 0xC3, 0xF6, 0xDA, 0x01, 0xA8, 0xE5, 0x7F, + 0x58, 0xDF, 0x18, 0xE4, 0x00, 0xA3, 0xE0, 0xC8, 0x01, 0xD4, 0x36, 0xE4, + 0x06, 0x40, 0x44, 0x88, 0x94, 0x80, 0xA4, 0x89, 0x09, 0xE6, 0x90, 0xE4, + 0x12, 0x40, 0xD9, 0xDF, 0x03, 0x40, 0x3D, 0x62, 0x2E, 0x18, 0xE0, 0xC8, + 0x06, 0xD4, 0x15, 0x40, 0x18, 0xE8, 0x00, 0x40, 0x84, 0xBD, 0x15, 0x40, + 0x18, 0xEA, 0x06, 0x40, 0x14, 0x29, 0x89, 0xE4, 0x48, 0xE0, 0x83, 0xBF, + 0x22, 0xDB, 0x8B, 0xE4, 0x02, 0xA9, 0xE9, 0x7F, 0x2E, 0xDF, 0xE6, 0x7F, + 0xB3, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0xCB, 0xD5, 0xE1, 0xC8, 0x02, 0x40, + 0x17, 0xD5, 0xE2, 0xC8, 0x00, 0x40, 0xE0, 0xD5, 0x03, 0xE4, 0x04, 0xB8, + 0x01, 0x40, 0x08, 0xB8, 0xE6, 0x7F, 0x00, 0xDF, 0x10, 0x38, 0xE6, 0x7F, + 0xA1, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0xBF, 0xD4, 0xC1, 0xC3, 0x06, 0x40, + 0x14, 0x29, 0x89, 0xE4, 0x48, 0xE0, 0x83, 0xBF, 0xDE, 0xD8, 0xE0, 0xC1, + 0x17, 0xD4, 0x39, 0xE4, 0x43, 0xE0, 0xDE, 0xC3, 0xE0, 0xC3, 0x12, 0xD9, + 0x93, 0xE4, 0x94, 0xB8, 0x02, 0x40, 0x29, 0x28, 0x02, 0x40, 0x19, 0x38, + 0x01, 0x40, 0x29, 0x28, 0x01, 0x40, 0x19, 0x38, 0x03, 0x40, 0x29, 0x28, + 0x03, 0x40, 0x19, 0x38, 0xDF, 0xC3, 0xDF, 0xC9, 0xE0, 0xC3, 0xF0, 0xDA, + 0x8B, 0xE4, 0x06, 0xA9, 0xE8, 0x7F, 0xF3, 0xDF, 0xE6, 0x7F, 0x78, 0xDF, + 0xE0, 0xC8, 0x00, 0x40, 0xF6, 0xD5, 0xE6, 0xC8, 0x06, 0xDC, 0x0A, 0xC8, + 0x00, 0x40, 0xD5, 0x61, 0x88, 0xB8, 0x08, 0x08, 0x88, 0xE0, 0x01, 0xA8, + 0xE4, 0x7F, 0xEB, 0xDF, 0x04, 0x40, 0x54, 0x38, 0x48, 0xE0, 0x01, 0x40, + 0x6B, 0xD4, 0x04, 0x40, 0x64, 0x38, 0x03, 0xA8, 0xE4, 0x7F, 0xE1, 0xDF, + 0x28, 0xE4, 0x08, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x04, 0x40, 0x74, 0x38, + 0x82, 0xE4, 0x04, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x05, 0x40, 0x04, 0x38, + 0x82, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x05, 0x40, 0x14, 0x38, 0x01, 0x40, + 0x24, 0xD4, 0x05, 0x40, 0x24, 0x38, 0x05, 0x40, 0x34, 0x38, 0x05, 0x40, + 0x44, 0x38, 0x05, 0x40, 0x54, 0x38, 0x05, 0x40, 0x64, 0x38, 0x40, 0xA8, + 0xE5, 0x7F, 0x78, 0xDF, 0x04, 0x40, 0x14, 0x18, 0xE6, 0x7F, 0x3C, 0xDF, + 0xE0, 0xC8, 0x01, 0x40, 0x0B, 0xD4, 0x38, 0xE4, 0x04, 0x40, 0x14, 0x08, + 0x38, 0xBF, 0x13, 0xD6, 0x04, 0xE4, 0x0D, 0x40, 0x08, 0xB8, 0x83, 0x90, + 0x84, 0x93, 0x8E, 0xE4, 0x94, 0xE4, 0x0D, 0x40, 0x1A, 0xDF, 0xE0, 0xC8, + 0x00, 0x40, 0xFA, 0xD5, 0xC1, 0xC3, 0x04, 0x40, 0x0A, 0xB8, 0x04, 0x40, + 0x14, 0x08, 0x38, 0xBF, 0xF0, 0xD7, 0x01, 0xA8, 0xE4, 0x7F, 0x9F, 0xDF, + 0x07, 0x40, 0x34, 0x38, 0x48, 0xE0, 0x01, 0x40, 0xBC, 0xD4, 0x0D, 0x40, + 0x14, 0x18, 0x03, 0xA8, 0xE4, 0x7F, 0x95, 0xDF, 0x28, 0xE4, 0x08, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x05, 0x40, 0x74, 0x38, 0x82, 0xE4, 0x04, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x06, 0x40, 0x04, 0x38, 0x82, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0x75, 0x42, 0x24, 0x38, 0x01, 0x40, 0x82, 0xD4, 0x01, 0xA8, + 0xE4, 0x7F, 0x7F, 0xDF, 0xE5, 0x7F, 0xBB, 0xDF, 0xE0, 0xC8, 0x06, 0xD4, + 0x15, 0x40, 0x18, 0xE8, 0x01, 0x40, 0x80, 0xBD, 0x15, 0x40, 0x18, 0xEA, + 0x0C, 0x28, 0xFE, 0x7F, 0xCE, 0xDE, 0x0B, 0x28, 0xC8, 0xC8, 0x06, 0x40, + 0x74, 0x38, 0x48, 0xE0, 0xEA, 0xC8, 0x3F, 0xDD, 0x0C, 0x28, 0x00, 0x40, + 0x89, 0xBD, 0xFE, 0x7F, 0xC1, 0xDE, 0x03, 0xE4, 0x04, 0xB8, 0x0B, 0x28, + 0xC1, 0xC8, 0x02, 0x40, 0x10, 0x38, 0x48, 0xE0, 0x03, 0x40, 0x3D, 0x62, + 0x2E, 0x09, 0x89, 0xBF, 0x06, 0xDB, 0x15, 0x40, 0x18, 0xE8, 0x00, 0x40, + 0x88, 0xBD, 0x15, 0x40, 0x18, 0xEA, 0x02, 0x40, 0xD8, 0xE8, 0x01, 0x40, + 0x10, 0x38, 0x48, 0xE0, 0x01, 0x40, 0x81, 0xBF, 0xFF, 0x7F, 0x22, 0xDD, + 0x0C, 0x28, 0x00, 0x40, 0x8D, 0xBD, 0xFE, 0x7F, 0xA1, 0xDE, 0x28, 0x40, + 0xDB, 0xE1, 0x8B, 0xE4, 0x04, 0xA9, 0xE8, 0x7F, 0x38, 0xDF, 0xE5, 0x7F, + 0xBD, 0xDF, 0xE0, 0xC8, 0x26, 0xD5, 0xE2, 0xC8, 0x31, 0xD5, 0x58, 0xDC, + 0xE1, 0xC8, 0xFE, 0x7F, 0xBD, 0xD4, 0x0C, 0x28, 0x00, 0x40, 0x85, 0xBD, + 0xFE, 0x7F, 0x8C, 0xDE, 0x0C, 0x28, 0x00, 0x40, 0x8A, 0xBD, 0xFE, 0x7F, + 0x87, 0xDE, 0x05, 0x40, 0x28, 0xE8, 0xC8, 0xC8, 0x07, 0x40, 0x04, 0x38, + 0x48, 0xE0, 0xEA, 0xC8, 0xF3, 0xDC, 0x05, 0x40, 0x48, 0xE8, 0xC4, 0xC8, + 0x64, 0x38, 0x48, 0xE0, 0x01, 0x40, 0x80, 0xBF, 0xFE, 0x7F, 0xB3, 0xDD, + 0x0C, 0x28, 0x00, 0x40, 0x8B, 0xBD, 0xFE, 0x7F, 0x71, 0xDE, 0x8B, 0x28, + 0x3A, 0x41, 0x94, 0x38, 0x00, 0x42, 0x80, 0xBF, 0xDA, 0xD8, 0x02, 0x40, + 0xD8, 0xE8, 0x3A, 0x41, 0xA4, 0x38, 0x00, 0x42, 0x80, 0xBF, 0x32, 0xDB, + 0x0C, 0x28, 0x00, 0x40, 0x86, 0xBD, 0xFE, 0x7F, 0x5F, 0xDE, 0xE3, 0xC8, + 0xFE, 0x7F, 0x99, 0xD4, 0xE5, 0xDE, 0x0B, 0x29, 0xC3, 0xC9, 0x74, 0x39, + 0x89, 0xE4, 0x48, 0xE0, 0xE6, 0xC8, 0x05, 0xDD, 0x0C, 0x28, 0x00, 0x40, + 0x8F, 0xBD, 0xFE, 0x7F, 0x4F, 0xDE, 0x05, 0x40, 0x28, 0xE8, 0x98, 0xB8, + 0x01, 0x40, 0x04, 0x39, 0x05, 0x40, 0x48, 0xE8, 0xC2, 0xC8, 0x04, 0x40, + 0x14, 0x38, 0x98, 0xE4, 0x49, 0xE0, 0xE5, 0xC9, 0x21, 0xDD, 0x0C, 0x28, + 0x01, 0x40, 0x81, 0xBD, 0xFE, 0x7F, 0x3C, 0xDE, 0xE3, 0xC8, 0x10, 0xD5, + 0xE4, 0xC8, 0xFE, 0x7F, 0x63, 0xD4, 0x0C, 0x28, 0x00, 0x40, 0x88, 0xBD, + 0xFE, 0x7F, 0x32, 0xDE, 0x02, 0x40, 0xE8, 0xE8, 0x3A, 0x41, 0xB4, 0x38, + 0x00, 0x42, 0x80, 0xBF, 0x00, 0x40, 0x81, 0xDB, 0x0C, 0x28, 0x00, 0x40, + 0x87, 0xBD, 0xFE, 0x7F, 0x25, 0xDE, 0x0C, 0x28, 0x01, 0x40, 0x82, 0xBD, + 0xFE, 0x7F, 0x20, 0xDE, 0x05, 0x40, 0x60, 0xE8, 0x80, 0xB8, 0x04, 0x40, + 0x24, 0x38, 0x48, 0xE0, 0x89, 0xBA, 0xE3, 0xC8, 0xF2, 0xD8, 0x03, 0x40, + 0x88, 0xE8, 0x04, 0x40, 0x34, 0x38, 0x48, 0xE0, 0xE4, 0xC8, 0x00, 0x40, + 0xA2, 0xDD, 0x0C, 0x28, 0x01, 0x40, 0x83, 0xBD, 0xFE, 0x7F, 0x0A, 0xDE, + 0x0C, 0x28, 0x01, 0x40, 0x88, 0xBD, 0xFE, 0x7F, 0x05, 0xDE, 0x08, 0xA8, + 0xE3, 0x7F, 0xA7, 0xDF, 0x28, 0xE4, 0x10, 0xC8, 0x00, 0x40, 0x8F, 0xBC, + 0xC1, 0xC8, 0x05, 0x40, 0x24, 0x38, 0x00, 0x40, 0x2F, 0xBC, 0xC1, 0xC2, + 0x05, 0x40, 0x34, 0x32, 0x8B, 0xE4, 0x02, 0xA9, 0xE7, 0x7F, 0x8F, 0xDF, + 0xE5, 0x7F, 0x14, 0xDF, 0xE0, 0xC8, 0x38, 0xD5, 0xE1, 0xC8, 0x3E, 0xD5, + 0xE2, 0xC8, 0x00, 0x40, 0x72, 0xD5, 0x01, 0xA8, 0xE3, 0x7F, 0x8B, 0xDF, + 0x05, 0x40, 0x64, 0x38, 0x01, 0x40, 0x04, 0x28, 0x05, 0x40, 0x54, 0x29, + 0x89, 0xBF, 0xFE, 0x7F, 0xBE, 0xD6, 0x00, 0x40, 0xD1, 0x62, 0x07, 0xA8, + 0xEC, 0x7F, 0x57, 0xDF, 0xFE, 0x7F, 0xB7, 0xDE, 0x14, 0x40, 0xD1, 0xE1, + 0x3F, 0x40, 0x00, 0xA8, 0x87, 0x98, 0x81, 0xE4, 0xDE, 0x7F, 0xF2, 0xDF, + 0x08, 0xE4, 0x01, 0xA8, 0xE3, 0x7F, 0x6F, 0xDF, 0x04, 0x40, 0x64, 0x38, + 0x48, 0xE0, 0x27, 0xD5, 0x8E, 0xE4, 0x90, 0xE4, 0x0C, 0x40, 0x70, 0xDF, + 0xE0, 0xC8, 0x25, 0xD4, 0x0C, 0x28, 0x01, 0x40, 0x85, 0xBD, 0xFD, 0x7F, + 0xBB, 0xDE, 0x0C, 0x28, 0x00, 0x40, 0x8E, 0xBD, 0xFD, 0x7F, 0xB6, 0xDE, + 0x0B, 0x28, 0xC3, 0xC8, 0x05, 0x40, 0x44, 0x38, 0x98, 0xE4, 0x49, 0xE0, + 0xE6, 0xC9, 0x2E, 0xDD, 0x0C, 0x28, 0x01, 0x40, 0x86, 0xBD, 0xFD, 0x7F, + 0xA9, 0xDE, 0x02, 0x40, 0xF8, 0xE8, 0x3A, 0x41, 0xC4, 0x38, 0x00, 0x42, + 0x80, 0xBF, 0xFD, 0x7F, 0xCD, 0xDB, 0xFF, 0x7F, 0x68, 0xDE, 0x8E, 0xE4, + 0x90, 0xE4, 0x10, 0x40, 0x15, 0xDF, 0x80, 0xE4, 0x11, 0x40, 0x06, 0xDF, + 0x8E, 0xE4, 0x11, 0x40, 0x10, 0xDF, 0x75, 0x42, 0x34, 0x38, 0x08, 0xE0, + 0x0A, 0xC8, 0x8E, 0xB8, 0x02, 0x40, 0x70, 0x70, 0x08, 0x08, 0x01, 0x18, + 0x86, 0x90, 0x3F, 0x40, 0x00, 0xA8, 0x87, 0x98, 0x01, 0xA8, 0x88, 0x98, + 0x89, 0x98, 0x81, 0xE4, 0xE1, 0x7F, 0x64, 0xDF, 0xFE, 0x7F, 0x41, 0xDE, + 0x05, 0x40, 0x20, 0xE8, 0x80, 0xB8, 0x05, 0x40, 0x54, 0x38, 0x48, 0xE0, + 0x89, 0xBA, 0xE3, 0xC8, 0x8E, 0xDB, 0x0C, 0x28, 0x01, 0x40, 0x87, 0xBD, + 0xFD, 0x7F, 0x72, 0xDE, 0x0C, 0x28, 0x00, 0x40, 0x8C, 0xBD, 0xFD, 0x7F, + 0x6D, 0xDE, 0x03, 0x40, 0x98, 0xE8, 0x04, 0x40, 0x44, 0x38, 0x48, 0xE0, + 0xE4, 0xC8, 0xFE, 0x7F, 0x1C, 0xDD, 0x0C, 0x28, 0x01, 0x40, 0x84, 0xBD, + 0xFD, 0x7F, 0x60, 0xDE, 0x0C, 0x28, 0x01, 0x40, 0x80, 0xBD, 0xFD, 0x7F, + 0x5B, 0xDE, 0x1E, 0xE4, 0x02, 0x40, 0x9C, 0x70, 0x10, 0xB8, 0x81, 0xE4, + 0x1B, 0x40, 0xE3, 0xDF, 0x38, 0xE4, 0x83, 0x98, 0x8E, 0xE4, 0x94, 0xE4, + 0x0C, 0x40, 0xAD, 0xDF, 0xE0, 0xC8, 0x21, 0xD4, 0x01, 0x40, 0x3D, 0x63, + 0x51, 0x29, 0x91, 0xB8, 0x01, 0xA8, 0x01, 0x40, 0x3A, 0x63, 0x69, 0x38, + 0x9A, 0xE4, 0x09, 0xE0, 0x04, 0x40, 0x5A, 0x75, 0x4E, 0x2E, 0x83, 0x9E, + 0x81, 0xE4, 0x1C, 0x40, 0x78, 0xDF, 0xFE, 0x7F, 0x5C, 0xDE, 0x20, 0xA8, + 0xE3, 0x7F, 0x92, 0xDF, 0x0D, 0x40, 0x14, 0x18, 0xE4, 0x7F, 0x56, 0xDF, + 0xE0, 0xC8, 0x0B, 0xD5, 0x0C, 0x28, 0x01, 0x40, 0x89, 0xBD, 0xFD, 0x7F, + 0x2B, 0xDE, 0x01, 0x40, 0x3D, 0x63, 0x51, 0x29, 0x91, 0xB8, 0x00, 0xA8, + 0xDE, 0xDE, 0x0D, 0x40, 0x04, 0x18, 0x38, 0xE4, 0x0D, 0x40, 0x14, 0x08, + 0xE0, 0xC8, 0xFE, 0x7F, 0x2A, 0xDB, 0x64, 0x20, 0x14, 0xE4, 0x04, 0x40, + 0x18, 0xB8, 0x80, 0xE4, 0x48, 0xE0, 0xC1, 0xC8, 0xE2, 0x7F, 0xB9, 0xDF, + 0x28, 0xE4, 0x98, 0xE4, 0x04, 0xC9, 0x64, 0x20, 0x01, 0xA8, 0x82, 0xC8, + 0xDF, 0xC8, 0x98, 0xBC, 0x01, 0x19, 0xC4, 0xC1, 0x00, 0x40, 0x21, 0xBC, + 0x8E, 0xC2, 0x0D, 0x40, 0x04, 0x08, 0x82, 0xBD, 0x0D, 0x40, 0x04, 0x18, + 0xC1, 0xC3, 0x0D, 0x40, 0x14, 0x08, 0x83, 0xBF, 0xE4, 0xD8, 0xFE, 0x7F, + 0x08, 0xDE, 0x20, 0xB5, 0x1C, 0xB3, 0x5F, 0xB1, 0xDD, 0x7F, 0x03, 0xB6, + 0x38, 0xE4, 0x49, 0xE4, 0x25, 0x40, 0x02, 0x9C, 0x00, 0xA8, 0x20, 0x42, + 0xD1, 0xE1, 0x01, 0x38, 0x44, 0x40, 0x18, 0xEA, 0x20, 0x41, 0xD2, 0xE1, + 0x82, 0xE4, 0x02, 0xA9, 0xE6, 0x7F, 0x83, 0xDF, 0xE4, 0x7F, 0x08, 0xDF, + 0xE0, 0xC8, 0x45, 0xD5, 0xE1, 0xC8, 0x47, 0xD5, 0xE2, 0xC8, 0x4E, 0xD5, + 0x07, 0xA8, 0xE2, 0x7F, 0x80, 0xDF, 0x98, 0xE4, 0x18, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x2C, 0x38, 0x89, 0xE4, 0x14, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x02, 0x40, 0x1C, 0x38, 0x89, 0xE4, 0x08, 0xC8, 0x00, 0x40, 0x87, 0xBC, + 0x01, 0x40, 0x9C, 0x38, 0x89, 0xE4, 0x04, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x3C, 0x38, 0x00, 0x40, 0x91, 0xBC, 0x4C, 0x39, 0x82, 0xE4, 0x02, 0xA9, + 0xE6, 0x7F, 0x5B, 0xDF, 0xE3, 0x7F, 0xE0, 0xDF, 0xE0, 0xC8, 0x2E, 0xD5, + 0xE1, 0xC8, 0x33, 0xD5, 0xE2, 0xC8, 0x3F, 0xD5, 0xDA, 0xA8, 0x19, 0xA9, + 0xE3, 0x7F, 0x4B, 0xDF, 0x01, 0x40, 0x8A, 0xB8, 0x7C, 0x38, 0xE3, 0x7F, + 0xD1, 0xDF, 0xE1, 0xC8, 0x38, 0xD4, 0x01, 0x28, 0x00, 0x40, 0x85, 0xBD, + 0x01, 0x38, 0x03, 0x38, 0x44, 0x40, 0x18, 0xE8, 0x13, 0x38, 0x83, 0xE4, + 0x22, 0x40, 0x01, 0xB6, 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0x82, 0x88, + 0x03, 0x40, 0x8F, 0xBF, 0x04, 0xDB, 0x01, 0x28, 0x00, 0x40, 0x81, 0xBD, + 0xED, 0xDE, 0x1C, 0x38, 0x12, 0x40, 0x98, 0xE9, 0xEF, 0xC8, 0x0F, 0xDB, + 0x01, 0x28, 0x00, 0x40, 0x82, 0xBD, 0xE4, 0xDE, 0x02, 0x28, 0xC1, 0xC8, + 0x5C, 0x38, 0x48, 0xE0, 0x01, 0x40, 0x80, 0xBF, 0x06, 0xDD, 0x01, 0x28, + 0x00, 0x40, 0x83, 0xBD, 0xD9, 0xDE, 0x0C, 0x38, 0xA1, 0xDE, 0x24, 0x40, + 0x28, 0xE8, 0xC1, 0xC8, 0x6C, 0x38, 0x48, 0xE0, 0x01, 0x40, 0x80, 0xBF, + 0xC1, 0xDD, 0x01, 0x28, 0x00, 0x40, 0x84, 0xBD, 0xCB, 0xDE, 0x03, 0xA8, + 0xE2, 0x7F, 0x15, 0xDF, 0x98, 0xE4, 0x08, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x01, 0x40, 0x0C, 0x38, 0x89, 0xE4, 0x04, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x01, 0x40, 0x1C, 0x38, 0x89, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x01, 0x40, + 0x2C, 0x38, 0x00, 0x40, 0x92, 0xD4, 0x00, 0xA8, 0x01, 0x40, 0x3C, 0x38, + 0x20, 0x40, 0xD6, 0xE1, 0x86, 0xE4, 0x02, 0xA9, 0xE6, 0x7F, 0x40, 0xDF, + 0xE3, 0x7F, 0x76, 0xDF, 0xE0, 0xC8, 0x6A, 0xD5, 0xE1, 0xC8, 0x00, 0x40, + 0x6F, 0xD5, 0xE2, 0xC8, 0x00, 0x40, 0x7A, 0xD5, 0x06, 0xA8, 0xE1, 0x7F, + 0xEC, 0xDF, 0x98, 0xE4, 0x14, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x01, 0x40, + 0x6C, 0x38, 0x89, 0xE4, 0x10, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x01, 0x40, + 0x7C, 0x38, 0x89, 0xE4, 0x0C, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x02, 0x40, + 0x0C, 0x38, 0x89, 0xE4, 0x08, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x02, 0x40, + 0x4C, 0x38, 0x89, 0xE4, 0x04, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x02, 0x40, + 0x5C, 0x38, 0x00, 0x40, 0x91, 0xBC, 0x02, 0x40, 0x6C, 0x39, 0xE0, 0xC8, + 0x00, 0x40, 0xA1, 0xD4, 0x01, 0xA8, 0x02, 0x40, 0x7C, 0x38, 0x03, 0x40, + 0x0C, 0x38, 0x00, 0xA8, 0x03, 0x40, 0x1C, 0x38, 0x2C, 0x40, 0x0C, 0x38, + 0x02, 0xA8, 0xE1, 0x7F, 0xBA, 0xDF, 0x98, 0xE4, 0x04, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x2C, 0x40, 0x1C, 0x38, 0x89, 0xE4, 0x00, 0x40, 0x81, 0xBC, + 0x2C, 0x40, 0x2C, 0x38, 0x00, 0x40, 0xB0, 0xD4, 0x00, 0xA8, 0x2C, 0x40, + 0x3C, 0x38, 0x2C, 0x40, 0x4C, 0x38, 0x01, 0xA8, 0xE1, 0x7F, 0xA5, 0xDF, + 0x2C, 0x40, 0x7C, 0x38, 0x28, 0xE4, 0x42, 0xE0, 0xE1, 0xC2, 0x58, 0xD5, + 0x01, 0xA8, 0xE1, 0x7F, 0x9C, 0xDF, 0x2D, 0x40, 0x0C, 0x38, 0x07, 0xA8, + 0xE2, 0x7F, 0x4E, 0xDF, 0xC2, 0xC8, 0x2D, 0x40, 0x1C, 0x38, 0xE3, 0x7F, + 0x11, 0xDF, 0xE1, 0xC8, 0x2F, 0xD4, 0x01, 0x28, 0x01, 0x40, 0x80, 0xBD, + 0xFF, 0x7F, 0x3E, 0xDE, 0x86, 0x28, 0x01, 0x40, 0x4C, 0x38, 0xCC, 0xC8, + 0x48, 0xE0, 0x01, 0x40, 0x88, 0xBF, 0x05, 0xDD, 0x01, 0x28, 0x00, 0x40, + 0x87, 0xBD, 0xFF, 0x7F, 0x31, 0xDE, 0x02, 0x40, 0x98, 0xE8, 0x01, 0x40, + 0x5C, 0x38, 0xCC, 0xC8, 0x48, 0xE0, 0x01, 0x40, 0x88, 0xBF, 0x86, 0xDD, + 0x01, 0x28, 0x00, 0x40, 0x88, 0xBD, 0xFF, 0x7F, 0x23, 0xDE, 0x03, 0xA8, + 0xE2, 0x7F, 0x24, 0xDF, 0x01, 0x40, 0x3C, 0x38, 0xE2, 0x7F, 0xE8, 0xDF, + 0xE1, 0xC8, 0xFF, 0x7F, 0x67, 0xD4, 0x01, 0x28, 0x00, 0x40, 0x86, 0xBD, + 0xFF, 0x7F, 0x14, 0xDE, 0x01, 0xA8, 0xE1, 0x7F, 0x5E, 0xDF, 0x2D, 0x40, + 0x2C, 0x38, 0x01, 0xA8, 0xE1, 0x7F, 0x59, 0xDF, 0xE0, 0xC8, 0x24, 0xD5, + 0xE2, 0x7F, 0xAC, 0xDF, 0xE0, 0xC8, 0x20, 0xD5, 0x01, 0xA8, 0xE6, 0x7F, + 0x8A, 0xDF, 0xE2, 0x7F, 0xCD, 0xDF, 0xE0, 0xC8, 0xF5, 0xD5, 0x01, 0x28, + 0x01, 0x40, 0x83, 0xBD, 0xFE, 0x7F, 0xFA, 0xDE, 0x0C, 0x40, 0xDA, 0xE1, + 0x3F, 0x40, 0x00, 0xAB, 0x85, 0x9B, 0x8A, 0xE4, 0xDC, 0x7F, 0xBE, 0xDF, + 0x68, 0xE4, 0x84, 0xE4, 0x96, 0xE4, 0x0A, 0x40, 0x43, 0xDF, 0xE0, 0xC8, + 0x51, 0xD4, 0x01, 0x28, 0x00, 0x40, 0x8F, 0xBD, 0xFE, 0x7F, 0xE6, 0xDE, + 0xE2, 0x7F, 0x6F, 0xDF, 0xE0, 0xC8, 0x06, 0xD4, 0x44, 0x40, 0x18, 0xE8, + 0x00, 0x40, 0x84, 0xBD, 0x44, 0x40, 0x18, 0xEA, 0x01, 0x28, 0xFE, 0x7F, + 0xDA, 0xDE, 0x82, 0xE4, 0x02, 0xA9, 0xE5, 0x7F, 0x1A, 0xDF, 0xE2, 0x7F, + 0x9F, 0xDF, 0xE0, 0xC8, 0x4F, 0xD5, 0xE1, 0xC8, 0x00, 0x40, 0x90, 0xD5, + 0xE2, 0xC8, 0x00, 0x40, 0xA0, 0xD5, 0x01, 0xA8, 0xE1, 0x7F, 0x15, 0xDF, + 0x03, 0x40, 0x1C, 0x38, 0x28, 0xE4, 0x42, 0xE0, 0x00, 0x40, 0x7F, 0xD4, + 0x8C, 0xE4, 0x02, 0x40, 0x80, 0xB8, 0x02, 0x40, 0x7C, 0x89, 0xDF, 0xC9, + 0xE4, 0x7F, 0xFF, 0xDF, 0xE2, 0x7F, 0x84, 0xDF, 0xE0, 0xC8, 0x00, 0x40, + 0x9B, 0xD5, 0x01, 0x28, 0x00, 0x40, 0x8B, 0xBD, 0xFE, 0x7F, 0xB0, 0xDE, + 0x02, 0xA8, 0xE0, 0x7F, 0xFA, 0xDF, 0x98, 0xE4, 0x04, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x2C, 0x40, 0x3C, 0x38, 0x89, 0xE4, 0x00, 0x40, 0x81, 0xBC, + 0x2C, 0x40, 0x4C, 0x38, 0x2C, 0xD5, 0x00, 0xA8, 0x2C, 0x40, 0x5C, 0x38, + 0x2C, 0x40, 0x6C, 0x38, 0xFF, 0x7F, 0x3F, 0xDE, 0x86, 0xE4, 0x0E, 0x40, + 0xAD, 0xDF, 0x84, 0xE4, 0x0E, 0x40, 0xB7, 0xDF, 0x2D, 0x40, 0x3C, 0x38, + 0x08, 0xE0, 0x0A, 0xC8, 0x84, 0xB8, 0x02, 0x40, 0x70, 0x70, 0x08, 0x08, + 0x0A, 0x18, 0x84, 0x96, 0x85, 0x9B, 0x86, 0x92, 0x87, 0x92, 0x8A, 0xE4, + 0xDF, 0x7F, 0x0E, 0xDF, 0xFF, 0x7F, 0x30, 0xDE, 0x02, 0x28, 0xC1, 0xC8, + 0x02, 0x40, 0x7C, 0x38, 0x48, 0xE0, 0x02, 0x40, 0x80, 0xBF, 0x17, 0xDD, + 0x01, 0x28, 0x01, 0x40, 0x81, 0xBD, 0xFE, 0x7F, 0x75, 0xDE, 0x86, 0xE4, + 0x02, 0xA9, 0xE5, 0x7F, 0x05, 0xDF, 0xE2, 0x7F, 0x3B, 0xDF, 0xE0, 0xC8, + 0x34, 0xD5, 0xE1, 0xC8, 0x3B, 0xD5, 0xE2, 0xC8, 0xFF, 0x7F, 0x0D, 0xD4, + 0x01, 0x28, 0x00, 0x40, 0x8E, 0xBD, 0xFE, 0x7F, 0x63, 0xDE, 0x24, 0x40, + 0x28, 0xE8, 0xC1, 0xC8, 0x03, 0x40, 0x0C, 0x38, 0x48, 0xE0, 0x08, 0x40, + 0x80, 0xBF, 0x8F, 0xDD, 0x01, 0x28, 0x01, 0x40, 0x82, 0xBD, 0xFE, 0x7F, + 0x55, 0xDE, 0x00, 0xAA, 0x00, 0xA8, 0x03, 0x40, 0x0C, 0x89, 0xDF, 0xC9, + 0x0A, 0xDE, 0x06, 0xC8, 0x8C, 0xB8, 0x06, 0x40, 0x88, 0x28, 0x20, 0x40, + 0x80, 0xBF, 0x4E, 0xDC, 0xC1, 0xCA, 0x8A, 0xE4, 0x18, 0xE0, 0x89, 0xBF, + 0xF4, 0xD9, 0x01, 0xA8, 0xE0, 0x7F, 0x8D, 0xDF, 0xFE, 0x7F, 0xCC, 0xDE, + 0x01, 0x28, 0x00, 0x40, 0x89, 0xBD, 0xFE, 0x7F, 0x39, 0xDE, 0x86, 0x28, + 0x06, 0xC8, 0x2C, 0x40, 0x5C, 0x38, 0xCC, 0xC8, 0x48, 0xE0, 0x01, 0x40, + 0x88, 0xBF, 0x0A, 0xDD, 0x01, 0x28, 0x00, 0x40, 0x8D, 0xBD, 0xFE, 0x7F, + 0x2B, 0xDE, 0x01, 0x28, 0x00, 0x40, 0x8A, 0xBD, 0xFE, 0x7F, 0x26, 0xDE, + 0x02, 0x40, 0x98, 0xE8, 0x06, 0xC8, 0x2C, 0x40, 0x6C, 0x38, 0xCC, 0xC8, + 0x48, 0xE0, 0x01, 0x40, 0x88, 0xBF, 0xFE, 0x7F, 0xC0, 0xDD, 0xB2, 0xDE, + 0xA2, 0xE4, 0x02, 0x40, 0x7C, 0x89, 0xDF, 0xC9, 0x29, 0xBF, 0x0E, 0xDA, + 0x82, 0xE4, 0x06, 0xC8, 0x8C, 0xB8, 0x02, 0x40, 0x88, 0x28, 0x20, 0x40, + 0x80, 0xBF, 0xFF, 0x7F, 0x56, 0xDC, 0xC1, 0xCA, 0x8A, 0xE4, 0x18, 0xE0, + 0x89, 0xBF, 0xF3, 0xD9, 0x8C, 0xE4, 0x06, 0x40, 0x80, 0xB8, 0x03, 0x40, + 0x0C, 0x89, 0xDF, 0xC9, 0xE4, 0x7F, 0x43, 0xDF, 0xE1, 0x7F, 0xC8, 0xDF, + 0xE0, 0xC8, 0xA5, 0xD5, 0x01, 0x28, 0x00, 0x40, 0x8C, 0xBD, 0xFD, 0x7F, + 0xF5, 0xDE, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xDB, 0xB6, 0x68, 0xE4, + 0xB9, 0xE4, 0x28, 0xE4, 0x02, 0x40, 0xE0, 0x4C, 0x24, 0xB8, 0x38, 0xE4, + 0x02, 0x40, 0x9C, 0x70, 0x30, 0xB8, 0xC8, 0xE4, 0x02, 0x40, 0x93, 0x4D, + 0xCC, 0xB8, 0x00, 0xAE, 0x66, 0x41, 0x02, 0x3E, 0x66, 0x41, 0x12, 0x3E, + 0x02, 0x40, 0xAD, 0x5A, 0x18, 0x08, 0x88, 0xB8, 0x00, 0x40, 0xF7, 0xD7, + 0xE0, 0xC9, 0x00, 0x40, 0xC8, 0xD5, 0x01, 0xA8, 0xE0, 0x7F, 0x1F, 0xDF, + 0x98, 0xE4, 0x02, 0x18, 0xE0, 0xC8, 0x00, 0x40, 0xF5, 0xD4, 0xE0, 0xC9, + 0x00, 0x40, 0xFB, 0xD4, 0x66, 0x41, 0x12, 0x28, 0x00, 0x40, 0x81, 0xBD, + 0x66, 0x41, 0x12, 0x38, 0x02, 0x40, 0xDE, 0x4C, 0x36, 0x08, 0x0E, 0x40, + 0x80, 0xBC, 0x00, 0x40, 0xF9, 0xD4, 0x98, 0xE4, 0x12, 0x18, 0x02, 0x40, + 0xDE, 0x4C, 0x36, 0x08, 0x08, 0x40, 0x80, 0xBC, 0x00, 0x40, 0xFC, 0xD5, + 0x03, 0x40, 0x3D, 0x62, 0x06, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0xF6, 0xD4, + 0x0A, 0x40, 0xCD, 0x66, 0xC6, 0x38, 0x3F, 0xA8, 0xE0, 0x7F, 0xAC, 0xDF, + 0xF8, 0xE4, 0xE1, 0x7F, 0x71, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, 0x00, 0x40, + 0xF6, 0xD5, 0x02, 0x40, 0xAD, 0x5A, 0x26, 0x08, 0x8F, 0xBF, 0x01, 0x40, + 0x0E, 0xD4, 0x01, 0x40, 0x3D, 0x63, 0x13, 0x20, 0xE1, 0xC0, 0x01, 0x40, + 0x08, 0xD5, 0x01, 0x40, 0x3D, 0x63, 0x03, 0x28, 0xE1, 0xC8, 0x01, 0x40, + 0x02, 0xD5, 0x03, 0x40, 0x3D, 0x62, 0x36, 0x08, 0x0A, 0xC8, 0x86, 0xB8, + 0x03, 0x40, 0x3E, 0x62, 0x80, 0xB8, 0x02, 0x40, 0xD2, 0x4C, 0x06, 0x09, + 0x83, 0x99, 0x02, 0x40, 0xD1, 0x4C, 0x26, 0x09, 0x29, 0x40, 0x6A, 0xDF, + 0x83, 0xE4, 0x02, 0x40, 0xAD, 0x5A, 0x16, 0x09, 0x18, 0x40, 0xCC, 0xDF, + 0xA8, 0xE4, 0x83, 0xE4, 0x02, 0x40, 0xAD, 0x5A, 0x26, 0x09, 0x18, 0x40, + 0xD4, 0xDF, 0xD8, 0xE4, 0x01, 0x40, 0x0A, 0x81, 0x01, 0xA3, 0x03, 0xE4, + 0x86, 0xC0, 0x9A, 0x89, 0x50, 0xE0, 0x90, 0xB8, 0xDF, 0xC9, 0x84, 0xC9, + 0xAA, 0x88, 0x80, 0xB8, 0xDF, 0xC8, 0x84, 0xC8, 0x49, 0xE4, 0x54, 0xE0, + 0x58, 0xE0, 0x04, 0xE4, 0x08, 0xE6, 0x02, 0x08, 0xE0, 0xC8, 0x00, 0x40, + 0xEC, 0xD4, 0x2D, 0x88, 0xE0, 0xC8, 0x02, 0x40, 0x4F, 0xD4, 0x22, 0x18, + 0x80, 0xE4, 0xDF, 0xC8, 0x00, 0xAE, 0xE0, 0xC8, 0x03, 0xDB, 0x08, 0xE1, + 0x20, 0xAE, 0xE0, 0xBA, 0x8E, 0xE4, 0xDF, 0x7F, 0x96, 0xDF, 0x18, 0xE4, + 0x42, 0x18, 0xE0, 0xCB, 0x04, 0xD5, 0x22, 0x08, 0xE0, 0xC8, 0x01, 0x40, + 0xFC, 0xD4, 0xE0, 0xCB, 0x00, 0x40, 0xDF, 0xD5, 0x22, 0x08, 0xE0, 0xC8, + 0x00, 0x40, 0xFB, 0xD5, 0x00, 0xA8, 0x1B, 0x40, 0xE2, 0x38, 0x5D, 0x08, + 0x3F, 0x40, 0xF0, 0x7F, 0x80, 0xBC, 0x02, 0x40, 0x06, 0xD4, 0x2D, 0x40, + 0x2D, 0x88, 0xE0, 0xC8, 0x14, 0xD5, 0x10, 0x40, 0x00, 0xA8, 0xE0, 0x7F, + 0x2D, 0xDF, 0x08, 0xE4, 0xE0, 0x7F, 0xF2, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, + 0x01, 0x40, 0xE4, 0xD5, 0x00, 0xA1, 0xE0, 0xC0, 0x06, 0xDB, 0x08, 0xA8, + 0xE4, 0x7F, 0xA3, 0xDF, 0xC1, 0xC1, 0x01, 0xBF, 0xFA, 0xD8, 0xE0, 0x7F, + 0xA2, 0xDF, 0x01, 0xA8, 0x0A, 0x40, 0xCD, 0x66, 0x06, 0x18, 0x00, 0xA1, + 0x81, 0xE4, 0x25, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x01, 0xA8, + 0xDF, 0x7F, 0x57, 0xDF, 0x02, 0x18, 0xE0, 0xC8, 0x68, 0xD4, 0x02, 0x40, + 0xDE, 0x4C, 0x36, 0x08, 0x0E, 0x40, 0x80, 0xBC, 0x98, 0xE4, 0x00, 0x40, + 0x6D, 0xD4, 0x12, 0x08, 0x89, 0xBF, 0x06, 0xD5, 0x66, 0x41, 0x12, 0x28, + 0x00, 0x40, 0x82, 0xBD, 0x66, 0x41, 0x12, 0x38, 0x3F, 0xA8, 0xDF, 0x7F, + 0xF7, 0xDF, 0xF8, 0xE4, 0xE0, 0x7F, 0xBC, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, + 0x42, 0xD5, 0x02, 0x40, 0xAD, 0x5A, 0x26, 0x08, 0x01, 0xA1, 0x8F, 0xBF, + 0xFF, 0x7F, 0x68, 0xD5, 0x81, 0xE4, 0x25, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, + 0x40, 0xB4, 0x01, 0xA8, 0x66, 0x41, 0x02, 0x38, 0x18, 0xE4, 0x81, 0xE4, + 0x25, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x0A, 0x40, 0xCD, 0x66, + 0x06, 0x08, 0x02, 0xA1, 0xE0, 0xC8, 0xF5, 0xD4, 0xE0, 0xC9, 0xFF, 0x7F, + 0x05, 0xD5, 0x01, 0xA8, 0x0A, 0x40, 0xCD, 0x66, 0x06, 0x18, 0x02, 0x40, + 0xDE, 0x4C, 0x36, 0x08, 0x0E, 0x40, 0x80, 0xBC, 0xFF, 0x7F, 0x07, 0xD5, + 0x01, 0xA8, 0xDF, 0x7F, 0x0E, 0xDF, 0x98, 0xE4, 0x12, 0x18, 0x02, 0x40, + 0xDE, 0x4C, 0x36, 0x08, 0x08, 0x40, 0x80, 0xBC, 0xFF, 0x7F, 0x04, 0xD4, + 0x0A, 0x40, 0xCD, 0x66, 0xC6, 0x39, 0x3F, 0xA8, 0xDF, 0x7F, 0xB6, 0xDF, + 0xF8, 0xE4, 0xE0, 0x7F, 0x7B, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, 0xFF, 0x7F, + 0x0A, 0xD4, 0x66, 0x41, 0x02, 0x28, 0x00, 0x40, 0x81, 0xBD, 0x66, 0x41, + 0x02, 0x38, 0x19, 0xE4, 0x81, 0xE4, 0x25, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, + 0x40, 0xB4, 0x0A, 0x40, 0xCD, 0x66, 0x06, 0x08, 0x02, 0xA1, 0xE0, 0xC8, + 0xBC, 0xD4, 0x02, 0x40, 0xDE, 0x4C, 0x36, 0x08, 0x0E, 0x40, 0x80, 0xBC, + 0x98, 0xE4, 0x93, 0xD5, 0x01, 0xA8, 0xDE, 0x7F, 0xDC, 0xDF, 0x98, 0xE4, + 0x8E, 0xDE, 0x00, 0xA8, 0x01, 0x40, 0x3D, 0x63, 0x13, 0x38, 0x86, 0xE4, + 0x9F, 0xE4, 0x17, 0x40, 0x25, 0xDF, 0x98, 0xE4, 0x00, 0x40, 0x81, 0xBC, + 0x19, 0xD5, 0x20, 0x40, 0x91, 0xBF, 0x01, 0x40, 0x4B, 0xD5, 0x01, 0x40, + 0x2B, 0xDB, 0x80, 0x40, 0x91, 0xBF, 0x01, 0x40, 0x2B, 0xD5, 0x00, 0x41, + 0x91, 0xBF, 0x01, 0x40, 0x41, 0xD5, 0x01, 0xA1, 0x81, 0xE4, 0x25, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x00, 0xA1, 0x42, 0x11, 0x22, 0x11, + 0xFF, 0x7F, 0x27, 0xDE, 0x02, 0x40, 0xAD, 0x5A, 0x26, 0x1F, 0x00, 0x40, + 0x92, 0xBC, 0x04, 0xA1, 0xFE, 0x7F, 0xD1, 0xD5, 0x82, 0xDE, 0xBC, 0x23, + 0x81, 0xE4, 0x94, 0xE4, 0x83, 0x40, 0xFD, 0xDF, 0x08, 0xE4, 0x81, 0xE4, + 0x94, 0xE4, 0x83, 0x40, 0x50, 0xDF, 0x83, 0x98, 0x8C, 0xE4, 0x90, 0xE4, + 0x2D, 0x40, 0x8F, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0x7E, 0xD9, 0x38, 0xBF, + 0xFF, 0x7F, 0x0C, 0xD4, 0x02, 0x40, 0xAC, 0x5A, 0x06, 0x09, 0x42, 0x08, + 0x98, 0xBF, 0xFF, 0x7F, 0x05, 0xD9, 0x42, 0x19, 0x02, 0xA1, 0xFF, 0x7F, + 0x62, 0xDE, 0x01, 0x40, 0x9D, 0x88, 0xE3, 0x7F, 0xC2, 0xDF, 0x02, 0xA8, + 0xDF, 0x7F, 0x3C, 0xDF, 0x08, 0xE4, 0x52, 0x18, 0xE0, 0x7F, 0x00, 0xDF, + 0x98, 0xE4, 0xE1, 0xC8, 0x00, 0x40, 0xF8, 0xD5, 0x02, 0x40, 0x1D, 0x88, + 0x01, 0xA9, 0xE0, 0xC8, 0x02, 0x40, 0x13, 0xD4, 0xE0, 0xCB, 0x01, 0x40, + 0x26, 0xD5, 0x32, 0x19, 0x07, 0x40, 0x2A, 0x29, 0xE1, 0xC9, 0x02, 0x40, + 0x8D, 0xD5, 0x02, 0x40, 0xDE, 0x4C, 0x36, 0x09, 0x89, 0xE4, 0x04, 0x40, + 0x80, 0xBC, 0x01, 0x40, 0x51, 0xD5, 0x04, 0x40, 0x90, 0xBC, 0x00, 0xA8, + 0x05, 0xD4, 0x05, 0x40, 0x7A, 0x88, 0xE0, 0xC8, 0x02, 0x40, 0xA6, 0xD4, + 0x19, 0x40, 0x32, 0x18, 0x05, 0x40, 0x0A, 0x88, 0xE0, 0xC8, 0x01, 0x40, + 0x14, 0xD5, 0x07, 0x40, 0x1A, 0x88, 0xE0, 0xC8, 0x02, 0x40, 0x5B, 0xD5, + 0x02, 0xA8, 0xDE, 0x7F, 0x4E, 0xDF, 0xF8, 0xE4, 0x8F, 0xE4, 0x04, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x19, 0x40, 0x02, 0x18, 0x00, 0x40, 0xF1, 0xBC, + 0x19, 0x40, 0x12, 0x1F, 0x00, 0xA9, 0x19, 0x40, 0x22, 0x19, 0x1F, 0x40, + 0x02, 0x39, 0x1F, 0x40, 0x12, 0x39, 0x01, 0xA0, 0x1A, 0x40, 0x12, 0x10, + 0x35, 0x40, 0x02, 0x39, 0x52, 0x08, 0xE2, 0xC8, 0x00, 0x40, 0xF7, 0xD5, + 0x80, 0xE4, 0xDE, 0x7F, 0x30, 0xDF, 0xE0, 0xC8, 0x02, 0x40, 0x53, 0xD4, + 0x5D, 0x28, 0x1F, 0x40, 0x02, 0x38, 0x52, 0x08, 0xE0, 0xC8, 0x03, 0xD4, + 0x6D, 0x28, 0x1F, 0x40, 0x12, 0x38, 0x86, 0xE4, 0xC3, 0x7F, 0xBA, 0xDF, + 0x98, 0xE4, 0x2D, 0x40, 0x0D, 0x88, 0xE0, 0xC8, 0x01, 0x40, 0xD0, 0xD5, + 0xE1, 0xC9, 0x01, 0x40, 0xCD, 0xDB, 0x89, 0xE4, 0xDF, 0xC8, 0x00, 0xAE, + 0xE0, 0xC8, 0x03, 0xDB, 0x08, 0xE1, 0x20, 0xAE, 0xE0, 0xBA, 0x01, 0xA8, + 0xDE, 0x7F, 0x0D, 0xDF, 0x10, 0x40, 0x02, 0x18, 0xE0, 0xC8, 0x1E, 0xD5, + 0x00, 0xA1, 0x1F, 0x40, 0x02, 0x88, 0xE0, 0xC8, 0x0F, 0xDB, 0x02, 0xE4, + 0x10, 0x40, 0x04, 0xB8, 0x8E, 0xE4, 0xDD, 0x7F, 0xFE, 0xDF, 0x00, 0x38, + 0xC1, 0xC0, 0xC1, 0xC1, 0x1F, 0x40, 0x02, 0x88, 0x81, 0xBF, 0xF6, 0xD8, + 0xEE, 0xC1, 0x0A, 0xD8, 0x0F, 0xA9, 0x81, 0xE4, 0x82, 0xB8, 0x10, 0x40, + 0x84, 0xB8, 0x08, 0x39, 0xC1, 0xC8, 0xC1, 0xC1, 0xEE, 0xC1, 0xFB, 0xDB, + 0x52, 0x00, 0xE0, 0xC0, 0x02, 0x40, 0xD8, 0xD5, 0x00, 0xA8, 0x11, 0x40, + 0x12, 0x18, 0xE0, 0xC0, 0x02, 0x40, 0x2F, 0xD5, 0x4D, 0x88, 0xE0, 0xC8, + 0x02, 0x40, 0x32, 0xD4, 0x19, 0x40, 0x32, 0x08, 0xE0, 0xC8, 0x1D, 0xD5, + 0x52, 0x08, 0xE0, 0xC8, 0x02, 0x40, 0x5D, 0xD5, 0x1A, 0x40, 0x12, 0x08, + 0xE0, 0xC8, 0x04, 0xD5, 0x1F, 0x40, 0x02, 0x29, 0xE1, 0xC9, 0x06, 0xDC, + 0xE0, 0xC8, 0x0F, 0xD4, 0x1F, 0x40, 0x12, 0x20, 0xE1, 0xC0, 0x0B, 0xDD, + 0x0F, 0xA8, 0xDE, 0x7F, 0x7B, 0xDF, 0x35, 0x40, 0x02, 0x38, 0xDF, 0x7F, + 0x3F, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, 0x02, 0x40, 0xFF, 0xD5, 0x01, 0x40, + 0x7D, 0x88, 0xE0, 0xC8, 0x03, 0xD5, 0x52, 0x08, 0xE1, 0xC8, 0x09, 0xD5, + 0x02, 0x40, 0x0D, 0x88, 0xE0, 0xC8, 0x01, 0x40, 0x52, 0xD5, 0x52, 0x08, + 0xE0, 0xC8, 0x01, 0x40, 0x4E, 0xD4, 0x86, 0xE4, 0x03, 0x40, 0x4E, 0xDF, + 0xE0, 0xC8, 0x01, 0x40, 0x48, 0xD4, 0x66, 0x41, 0x02, 0x28, 0x01, 0x40, + 0x80, 0xBD, 0x66, 0x41, 0x02, 0x38, 0x01, 0xA1, 0xFE, 0x7F, 0xDE, 0xDE, + 0x10, 0x40, 0x91, 0xBF, 0xFE, 0x7F, 0xD9, 0xD4, 0x66, 0x41, 0x02, 0x28, + 0x00, 0x40, 0x82, 0xBD, 0x66, 0x41, 0x02, 0x38, 0xF2, 0xDE, 0x66, 0x41, + 0x02, 0x28, 0x00, 0x40, 0x85, 0xBD, 0x66, 0x41, 0x02, 0x38, 0xEB, 0xDE, + 0x66, 0x41, 0x02, 0x28, 0x01, 0x40, 0x8A, 0xBD, 0xFE, 0x7F, 0x91, 0xDE, + 0x66, 0x41, 0x02, 0x28, 0x00, 0x40, 0x84, 0xBD, 0xFE, 0x7F, 0x8B, 0xDE, + 0x66, 0x41, 0x02, 0x28, 0x00, 0x40, 0x83, 0xBD, 0x66, 0x41, 0x02, 0x38, + 0xD8, 0xDE, 0x20, 0x40, 0x00, 0xA8, 0xDE, 0x7F, 0x2B, 0xDF, 0x1B, 0x40, + 0xE2, 0x38, 0xDE, 0x7F, 0xEF, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, 0x01, 0x40, + 0x02, 0xD5, 0x1B, 0x40, 0xE2, 0x28, 0xE0, 0xC8, 0x01, 0x40, 0x24, 0xD4, + 0x38, 0xE4, 0x53, 0xE0, 0x00, 0xA1, 0x13, 0xBF, 0xFD, 0x7F, 0xE3, 0xDA, + 0x02, 0xE4, 0x1C, 0x40, 0x00, 0xB8, 0x8E, 0xE4, 0xDD, 0x7F, 0x5B, 0xDF, + 0xC1, 0xC8, 0x00, 0x18, 0xC4, 0xC0, 0xC1, 0xC1, 0x13, 0xBF, 0xF7, 0xD9, + 0xFD, 0x7F, 0xD5, 0xDE, 0x83, 0xE4, 0xDD, 0x7F, 0x50, 0xDF, 0xFD, 0x7F, + 0xAC, 0xDE, 0x32, 0x08, 0x89, 0xBF, 0xFE, 0x7F, 0xD7, 0xD5, 0x66, 0x41, + 0x12, 0x28, 0x00, 0x40, 0x84, 0xBD, 0x66, 0x41, 0x12, 0x38, 0xFE, 0x7F, + 0xCF, 0xDE, 0x19, 0x40, 0x02, 0x18, 0x19, 0x40, 0x12, 0x18, 0xFE, 0x7F, + 0xF9, 0xDE, 0x61, 0x41, 0x42, 0x30, 0x1A, 0x40, 0x02, 0x19, 0xC1, 0xA8, + 0x3F, 0xA9, 0xDE, 0x7F, 0x28, 0xDF, 0x7D, 0x23, 0x83, 0xB8, 0x35, 0x40, + 0x12, 0x38, 0xDE, 0x7F, 0xAD, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, 0x01, 0x40, + 0x3B, 0xD5, 0x35, 0x40, 0x12, 0x28, 0x03, 0x40, 0x83, 0xBF, 0x00, 0x40, + 0xEF, 0xDB, 0x66, 0x41, 0x02, 0x28, 0x01, 0x40, 0x83, 0xBD, 0x66, 0x41, + 0x02, 0x38, 0xFF, 0x7F, 0x7C, 0xDE, 0x02, 0x40, 0xAC, 0x5A, 0x06, 0x01, + 0x42, 0x11, 0x01, 0xA1, 0xFE, 0x7F, 0x56, 0xDE, 0x6A, 0x88, 0xDD, 0x7F, + 0x12, 0xDF, 0x98, 0xE4, 0xE0, 0xCB, 0x01, 0x40, 0x25, 0xD5, 0x01, 0x40, + 0xD2, 0x38, 0x01, 0xA8, 0xDD, 0x7F, 0x09, 0xDF, 0xE0, 0xCB, 0x01, 0x40, + 0x62, 0xD5, 0x98, 0xE4, 0x0F, 0x40, 0x32, 0x18, 0xE0, 0xC9, 0x01, 0x40, + 0x9F, 0xD5, 0x04, 0x40, 0x1A, 0x08, 0xDF, 0xC8, 0x00, 0xAE, 0xE0, 0xC8, + 0x01, 0x40, 0x88, 0xDB, 0x08, 0xE1, 0x20, 0xAE, 0xE0, 0xBA, 0xE0, 0xCE, + 0x01, 0x40, 0x82, 0xDB, 0x8E, 0xE4, 0xDC, 0x7F, 0xF0, 0xDF, 0xE0, 0xCB, + 0x01, 0x40, 0x7F, 0xD5, 0x01, 0x40, 0xE2, 0x38, 0x07, 0x40, 0x3A, 0x88, + 0xE0, 0xC8, 0x01, 0x40, 0x9B, 0xD5, 0x0D, 0x40, 0x1A, 0x08, 0xE0, 0xC8, + 0x02, 0x40, 0x43, 0xDB, 0x10, 0xA8, 0xDD, 0x7F, 0x95, 0xDF, 0x08, 0xE4, + 0x0F, 0x40, 0x12, 0x18, 0xDE, 0x7F, 0x58, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, + 0x02, 0x40, 0x49, 0xD5, 0x0D, 0x40, 0x1A, 0x08, 0xDF, 0xC8, 0x00, 0xAE, + 0xE0, 0xC8, 0x03, 0xDB, 0x08, 0xE1, 0x20, 0xAE, 0xE0, 0xBA, 0x10, 0xA8, + 0xDD, 0x7F, 0x80, 0xDF, 0x08, 0xE4, 0xDE, 0x7F, 0x45, 0xDF, 0x98, 0xE4, + 0xE1, 0xC8, 0x02, 0x40, 0x2A, 0xD5, 0x00, 0xA8, 0x0F, 0x40, 0x02, 0x18, + 0xB0, 0xE4, 0x0B, 0xE0, 0x0F, 0x40, 0x12, 0x00, 0xC0, 0xE4, 0xCB, 0xB8, + 0x18, 0xE4, 0x8C, 0xBF, 0x01, 0x40, 0xFE, 0xDA, 0x42, 0xE4, 0x12, 0xDE, + 0x0F, 0x40, 0x12, 0x00, 0x01, 0xBF, 0x09, 0xD5, 0x83, 0xE4, 0x82, 0xB8, + 0x16, 0x40, 0xE8, 0x29, 0x16, 0x40, 0xD8, 0x23, 0x93, 0xB8, 0x16, 0x40, + 0xE8, 0x39, 0xC1, 0xC1, 0xC4, 0xC4, 0x1C, 0xBF, 0x01, 0x40, 0xEA, 0xDA, + 0x01, 0xBF, 0x01, 0x40, 0x74, 0xDB, 0x00, 0xA8, 0xE0, 0xCE, 0x03, 0xDB, + 0x8E, 0xE4, 0xDC, 0x7F, 0x98, 0xDF, 0x38, 0xE4, 0x03, 0xE0, 0x0D, 0x40, + 0x1A, 0x08, 0x38, 0xBF, 0x02, 0x40, 0x0B, 0xDA, 0x83, 0xE4, 0x0A, 0xC8, + 0x8A, 0xB8, 0x04, 0x40, 0x28, 0x0F, 0x0D, 0x40, 0x0A, 0x09, 0x03, 0xE4, + 0x81, 0xC9, 0x00, 0x40, 0x91, 0xBC, 0x06, 0x40, 0x24, 0x1F, 0x86, 0xC9, + 0x0F, 0x40, 0x02, 0x08, 0x89, 0xBD, 0x0F, 0x40, 0x02, 0x18, 0x01, 0xA8, + 0xDC, 0x7F, 0x7B, 0xDF, 0x98, 0xE4, 0x12, 0x40, 0x24, 0x18, 0xE0, 0xC8, + 0x01, 0x40, 0x36, 0xD4, 0x31, 0xE4, 0x06, 0xC3, 0x83, 0xE4, 0x82, 0xB8, + 0x16, 0x40, 0xE8, 0x39, 0xE0, 0xC1, 0xBA, 0xD4, 0x0F, 0x40, 0x12, 0x00, + 0xC4, 0xDE, 0x66, 0x41, 0x02, 0x28, 0x01, 0x40, 0x88, 0xBD, 0xFD, 0x7F, + 0x70, 0xDE, 0x89, 0xE4, 0xDC, 0x7F, 0x61, 0xDF, 0x98, 0xE4, 0xFD, 0x7F, + 0xE7, 0xDE, 0x04, 0xA8, 0xDD, 0x7F, 0x12, 0xDF, 0x05, 0xA9, 0x98, 0xBA, + 0x61, 0x41, 0x42, 0x39, 0xDD, 0x7F, 0xD4, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, + 0xFF, 0x7F, 0x19, 0xD4, 0x66, 0x41, 0x02, 0x28, 0x01, 0x40, 0x81, 0xBD, + 0xFD, 0x7F, 0x57, 0xDE, 0x00, 0xA8, 0x10, 0x40, 0x02, 0x18, 0x11, 0x40, + 0x12, 0x18, 0x52, 0x00, 0xFE, 0x7F, 0x5F, 0xDE, 0xDD, 0x7F, 0x1C, 0xDF, + 0xE8, 0xE4, 0xC1, 0xCE, 0xDD, 0x7F, 0xBC, 0xDF, 0x98, 0xE4, 0xE1, 0xC8, + 0x00, 0x40, 0xA2, 0xD5, 0x1B, 0x40, 0xE2, 0x28, 0xFE, 0x7F, 0xCE, 0xDE, + 0x01, 0x40, 0x6D, 0x88, 0xE0, 0xC8, 0x00, 0x40, 0x9F, 0xD4, 0x35, 0x40, + 0x22, 0x38, 0x35, 0x40, 0x32, 0x38, 0x00, 0xA8, 0x1B, 0x40, 0x02, 0x18, + 0x36, 0x40, 0x42, 0x38, 0x36, 0x40, 0x52, 0x38, 0x2C, 0x40, 0x2D, 0x88, + 0xE0, 0xC8, 0x13, 0xD5, 0x2C, 0x40, 0x3D, 0x88, 0xE0, 0xC8, 0x01, 0x40, + 0x37, 0xD4, 0x1A, 0x40, 0x32, 0x18, 0x2C, 0x40, 0x4D, 0x89, 0x1B, 0x40, + 0x02, 0x19, 0x2C, 0x40, 0x5D, 0x28, 0x36, 0x40, 0x42, 0x38, 0x2C, 0x40, + 0x6D, 0x28, 0x36, 0x40, 0x52, 0x38, 0x2C, 0x40, 0x1D, 0x88, 0xE0, 0xC8, + 0x10, 0xD5, 0x19, 0x40, 0x02, 0x08, 0xE0, 0xC8, 0x09, 0xD4, 0x19, 0x40, + 0x12, 0x08, 0xE0, 0xC8, 0x05, 0xD4, 0x1B, 0x40, 0x02, 0x08, 0xE0, 0xC8, + 0x01, 0x40, 0x4E, 0xD4, 0x01, 0xA8, 0xDB, 0x7F, 0xFA, 0xDF, 0x1B, 0x40, + 0x22, 0x18, 0xFC, 0x7F, 0x6F, 0xDE, 0x01, 0xA8, 0xDB, 0x7F, 0xF3, 0xDF, + 0xF8, 0xE4, 0x06, 0xCF, 0xFD, 0x7F, 0xA2, 0xDE, 0x66, 0x41, 0x02, 0x28, + 0x01, 0x40, 0x82, 0xBD, 0xFC, 0x7F, 0xF5, 0xDE, 0x01, 0x40, 0xD2, 0x88, + 0x01, 0xA1, 0x89, 0xBF, 0xFC, 0x7F, 0xB9, 0xD4, 0xFE, 0x7F, 0xD5, 0xDE, + 0x02, 0xA8, 0xDB, 0x7F, 0xDE, 0xDF, 0x01, 0x40, 0xC2, 0x38, 0xFD, 0x7F, + 0x6C, 0xDE, 0x0F, 0xA8, 0xDC, 0x7F, 0x8E, 0xDF, 0x80, 0xB8, 0x1F, 0x40, + 0x02, 0x38, 0xDD, 0x7F, 0x51, 0xDF, 0xE1, 0xC8, 0x00, 0x40, 0x8B, 0xD5, + 0x52, 0x08, 0xE0, 0xC8, 0xFD, 0x7F, 0xA7, 0xD4, 0x0F, 0xA8, 0xDC, 0x7F, + 0x7F, 0xDF, 0xC1, 0xC8, 0x1F, 0x40, 0x12, 0x38, 0xDD, 0x7F, 0x42, 0xDF, + 0xE1, 0xC8, 0xFD, 0x7F, 0x9C, 0xD4, 0x66, 0x41, 0x02, 0x28, 0x00, 0x40, + 0x8E, 0xBD, 0x66, 0x41, 0x02, 0x38, 0x10, 0xE4, 0xFC, 0x7F, 0x8D, 0xDE, + 0x01, 0xA8, 0xDB, 0x7F, 0xB4, 0xDF, 0xFD, 0x7F, 0x55, 0xDE, 0x01, 0xA8, + 0xDB, 0x7F, 0xAF, 0xDF, 0x1A, 0x40, 0x02, 0x18, 0xFD, 0x7F, 0xCA, 0xDE, + 0x01, 0xA8, 0xDB, 0x7F, 0xA8, 0xDF, 0x19, 0x40, 0x22, 0x18, 0xFD, 0x7F, + 0xC7, 0xDE, 0x0F, 0x40, 0x32, 0x09, 0x98, 0xBF, 0xFE, 0x7F, 0x9C, 0xD5, + 0x66, 0x41, 0x02, 0x28, 0x00, 0x40, 0x86, 0xBD, 0x66, 0x41, 0x02, 0x38, + 0xFD, 0x7F, 0xF7, 0xDE, 0x66, 0x41, 0x02, 0x28, 0x01, 0x40, 0x89, 0xBD, + 0xFC, 0x7F, 0x9D, 0xDE, 0x14, 0x40, 0xD0, 0xE1, 0x80, 0xE4, 0x02, 0xA9, + 0xDF, 0x7F, 0xD2, 0xDF, 0xDD, 0x7F, 0x08, 0xDF, 0x98, 0xE4, 0xE0, 0xC8, + 0x66, 0xD5, 0xE1, 0xC8, 0x00, 0x40, 0xF1, 0xD5, 0xE2, 0xC8, 0xFF, 0x7F, + 0x54, 0xD4, 0x66, 0x41, 0x02, 0x28, 0x01, 0x40, 0x85, 0xBD, 0x66, 0x41, + 0x02, 0x38, 0xFD, 0x7F, 0xD8, 0xDE, 0x01, 0xA8, 0xDB, 0x7F, 0x75, 0xDF, + 0x1A, 0x40, 0x12, 0x18, 0xFD, 0x7F, 0x9E, 0xDE, 0x00, 0xA8, 0xFE, 0x7F, + 0x7E, 0xDE, 0x01, 0x40, 0xE2, 0x20, 0x80, 0xBF, 0xFE, 0x7F, 0x7E, 0xD5, + 0x66, 0x41, 0x02, 0x28, 0x00, 0x40, 0x88, 0xBD, 0x66, 0x41, 0x02, 0x38, + 0xFD, 0x7F, 0xC1, 0xDE, 0x82, 0xE4, 0x01, 0x40, 0x8E, 0xB8, 0x83, 0x98, + 0x04, 0x40, 0x1A, 0x08, 0x84, 0x98, 0x86, 0xE4, 0x9A, 0xE4, 0x03, 0x40, + 0xC4, 0xDF, 0xE0, 0xC8, 0xFE, 0x7F, 0x68, 0xD4, 0x66, 0x41, 0x02, 0x28, + 0x00, 0x40, 0x87, 0xBD, 0x66, 0x41, 0x02, 0x38, 0xFD, 0x7F, 0xAB, 0xDE, + 0x0F, 0x40, 0x12, 0x18, 0x02, 0x40, 0xDE, 0x4C, 0x36, 0x09, 0xFC, 0x7F, + 0xDE, 0xDE, 0x66, 0x41, 0x02, 0x28, 0x00, 0x40, 0x8D, 0xBD, 0x83, 0xDE, + 0x31, 0xE4, 0x06, 0xC3, 0x03, 0xE4, 0x02, 0xB8, 0x16, 0x40, 0x0C, 0xB8, + 0xDC, 0x7F, 0x12, 0xDF, 0x80, 0x38, 0xDC, 0x7F, 0xB3, 0xDF, 0x98, 0xE4, + 0xE1, 0xC8, 0xFE, 0x7F, 0xC1, 0xD4, 0x66, 0x41, 0x02, 0x28, 0x00, 0x40, + 0x8C, 0xBD, 0xFC, 0x7F, 0x36, 0xDE, 0x6A, 0x88, 0xDB, 0x7F, 0x27, 0xDF, + 0xF8, 0xE4, 0x01, 0xA8, 0xDB, 0x7F, 0x23, 0xDF, 0x98, 0xE4, 0xFE, 0x7F, + 0x9A, 0xDE, 0x80, 0x28, 0x35, 0x40, 0x22, 0x38, 0xCC, 0xC8, 0x48, 0xE0, + 0x01, 0x40, 0x88, 0xBF, 0x00, 0x40, 0x6D, 0xDD, 0x66, 0x41, 0x02, 0x28, + 0x01, 0x40, 0x84, 0xBD, 0x66, 0x41, 0x02, 0x38, 0xFD, 0x7F, 0x6F, 0xDE, + 0x01, 0xA8, 0xDB, 0x7F, 0x0C, 0xDF, 0x11, 0x40, 0x12, 0x18, 0xE0, 0xC8, + 0xFE, 0x7F, 0xC1, 0xD5, 0x10, 0xE4, 0x1F, 0x40, 0x12, 0x88, 0xE0, 0xC8, + 0x10, 0xDB, 0x02, 0xE4, 0x11, 0x40, 0x08, 0xB8, 0x8E, 0xE4, 0xDA, 0x7F, + 0xFC, 0xDF, 0x00, 0x38, 0xC1, 0xC0, 0xC1, 0xC1, 0x1F, 0x40, 0x12, 0x88, + 0x81, 0xBF, 0xF6, 0xD8, 0xEE, 0xC1, 0xFE, 0x7F, 0xAC, 0xD8, 0x0F, 0xA9, + 0x81, 0xE4, 0x82, 0xB8, 0x11, 0x40, 0x88, 0xB8, 0x08, 0x39, 0xC1, 0xC8, + 0xC1, 0xC1, 0xEE, 0xC1, 0xFB, 0xDB, 0x52, 0x00, 0xFD, 0x7F, 0x01, 0xDE, + 0x01, 0xA8, 0xDA, 0x7F, 0xE2, 0xDF, 0x1A, 0x40, 0x32, 0x18, 0xE0, 0xC8, + 0xFE, 0x7F, 0xC3, 0xD5, 0x01, 0xA8, 0xDA, 0x7F, 0xDA, 0xDF, 0x1B, 0x40, + 0x02, 0x18, 0xE0, 0xC8, 0xFE, 0x7F, 0xC7, 0xD4, 0x14, 0x40, 0xD0, 0xE1, + 0x80, 0xE4, 0x02, 0xA9, 0xDF, 0x7F, 0x16, 0xDF, 0xDC, 0x7F, 0x4C, 0xDF, + 0x98, 0xE4, 0xE0, 0xC8, 0x52, 0xD5, 0xE1, 0xC8, 0x4A, 0xD5, 0xE2, 0xC8, + 0xFE, 0x7F, 0xB7, 0xD4, 0x66, 0x41, 0x02, 0x28, 0x01, 0x40, 0x87, 0xBD, + 0x66, 0x41, 0x02, 0x38, 0xFD, 0x7F, 0x1D, 0xDE, 0x66, 0x41, 0x02, 0x28, + 0x00, 0x40, 0x8F, 0xBD, 0xFB, 0x7F, 0xC3, 0xDE, 0xB0, 0xB8, 0x0F, 0x40, + 0x12, 0x1B, 0x02, 0x40, 0xDE, 0x4C, 0x36, 0x09, 0xFC, 0x7F, 0x49, 0xDE, + 0x01, 0xA8, 0x1B, 0x40, 0x22, 0x18, 0xFB, 0x7F, 0x23, 0xDE, 0x01, 0x40, + 0xB8, 0xE8, 0x35, 0x40, 0x32, 0x38, 0xCC, 0xC8, 0x48, 0xE0, 0x01, 0x40, + 0x88, 0xBF, 0xFE, 0x7F, 0x74, 0xDD, 0xFF, 0x7F, 0x1E, 0xDE, 0x00, 0xA0, + 0x0F, 0x40, 0x12, 0x10, 0xE0, 0xE4, 0xFD, 0x7F, 0xCC, 0xDE, 0x66, 0x41, + 0x02, 0x28, 0x00, 0x40, 0x8A, 0xBD, 0xFB, 0x7F, 0x9E, 0xDE, 0x66, 0x41, + 0x02, 0x28, 0x01, 0x40, 0x84, 0xBD, 0xFB, 0x7F, 0x98, 0xDE, 0x66, 0x41, + 0x02, 0x28, 0x00, 0x40, 0x89, 0xBD, 0xFB, 0x7F, 0x92, 0xDE, 0x66, 0x41, + 0x02, 0x28, 0x00, 0x40, 0x8B, 0xBD, 0x66, 0x41, 0x02, 0x38, 0xFC, 0x7F, + 0xDE, 0xDE, 0x66, 0x41, 0x02, 0x28, 0x01, 0x40, 0x86, 0xBD, 0xFB, 0x7F, + 0x84, 0xDE, 0x80, 0x28, 0x06, 0xC8, 0x36, 0x40, 0x42, 0x38, 0xCC, 0xC8, + 0x48, 0xE0, 0x01, 0x40, 0x88, 0xBF, 0x08, 0xDD, 0x66, 0x41, 0x02, 0x28, + 0x01, 0x40, 0x86, 0xBD, 0x66, 0x41, 0x02, 0x38, 0xFC, 0x7F, 0xC7, 0xDE, + 0x01, 0x40, 0xB8, 0xE8, 0x06, 0xC8, 0x36, 0x40, 0x52, 0x38, 0xCC, 0xC8, + 0x48, 0xE0, 0x01, 0x40, 0x88, 0xBF, 0xFE, 0x7F, 0x4E, 0xDD, 0x96, 0xDE, + 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xD8, 0xB6, 0x02, 0x40, 0xD1, 0x4C, + 0x28, 0x04, 0x86, 0x94, 0x98, 0xE4, 0x02, 0x40, 0xE0, 0x4C, 0x94, 0xB8, + 0x85, 0x99, 0xA8, 0xE4, 0x02, 0x40, 0x7C, 0x4D, 0xA4, 0xB8, 0x9C, 0x40, + 0xD0, 0xE1, 0x1F, 0x40, 0x09, 0x28, 0x00, 0x38, 0x1F, 0x40, 0x19, 0x28, + 0x13, 0x40, 0x58, 0xEA, 0x07, 0xA8, 0xDA, 0x7F, 0xF5, 0xDF, 0x28, 0xE4, + 0xDB, 0x7F, 0xBA, 0xDF, 0x00, 0xA9, 0xE1, 0xC8, 0x00, 0x40, 0x93, 0xD5, + 0x0A, 0x32, 0x07, 0x40, 0x14, 0x88, 0xE0, 0xC8, 0x00, 0x40, 0x92, 0xD4, + 0x00, 0xA8, 0x84, 0x98, 0x60, 0xE4, 0x83, 0x98, 0x06, 0x28, 0xDA, 0x7F, + 0x2A, 0xDF, 0x28, 0xE4, 0x00, 0xA1, 0x06, 0x28, 0xE0, 0xC8, 0x15, 0xDB, + 0x04, 0x90, 0x00, 0x40, 0x0F, 0xE6, 0x0A, 0xB8, 0xC2, 0xC0, 0x06, 0x28, + 0x81, 0xBA, 0xDF, 0xC8, 0x92, 0xE4, 0xA0, 0xC9, 0x89, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0x00, 0x38, 0xC1, 0xC0, 0xC1, 0xC1, 0x06, 0x24, 0x14, 0xBF, + 0xF2, 0xD9, 0xEE, 0xC1, 0x0C, 0xD8, 0x04, 0x98, 0x00, 0x40, 0x8F, 0xE6, + 0x00, 0xA9, 0x8A, 0xB8, 0x81, 0xB8, 0xC2, 0xC8, 0x08, 0x39, 0xC1, 0xC8, + 0xC1, 0xC1, 0xEE, 0xC1, 0xFB, 0xDB, 0x06, 0x98, 0x07, 0x40, 0x18, 0x89, + 0xE0, 0xC9, 0x00, 0x40, 0x6E, 0xD4, 0x04, 0x98, 0x00, 0x40, 0x8F, 0xE6, + 0x8A, 0xB8, 0x03, 0x40, 0x8E, 0xB8, 0x0E, 0xA1, 0x08, 0x39, 0xC1, 0xC8, + 0xDF, 0xC1, 0xE0, 0xC1, 0xFB, 0xDA, 0x00, 0xA1, 0x06, 0x28, 0xE0, 0xC8, + 0x00, 0x40, 0x8E, 0xDB, 0x04, 0x9C, 0x00, 0x40, 0xCF, 0xE6, 0xB1, 0xE4, + 0x2C, 0xE4, 0x06, 0xC2, 0x2A, 0xB8, 0x11, 0x40, 0x20, 0xB8, 0x23, 0xDE, + 0x03, 0x99, 0x9A, 0xB8, 0x91, 0xB8, 0x49, 0xE4, 0x05, 0x40, 0x4C, 0xB8, + 0x00, 0xA8, 0x04, 0x38, 0x03, 0x98, 0x81, 0xB8, 0x06, 0xC8, 0x8A, 0xB8, + 0x08, 0xE4, 0x09, 0x40, 0x08, 0xB8, 0x80, 0x3B, 0x06, 0x40, 0x9B, 0xB8, + 0x09, 0x3B, 0x0B, 0x40, 0x86, 0xB8, 0x88, 0x3B, 0x8C, 0xE4, 0x8A, 0xB8, + 0x81, 0xB8, 0x07, 0x40, 0x68, 0x28, 0xE0, 0xC8, 0x00, 0x40, 0x7B, 0xD4, + 0xC1, 0xC1, 0xC2, 0xC2, 0x06, 0x28, 0x18, 0xBF, 0x61, 0xDA, 0x8C, 0xE4, + 0x8A, 0xB8, 0x81, 0xB8, 0x08, 0xE4, 0x02, 0x40, 0x00, 0xB8, 0x00, 0xA9, + 0x00, 0x39, 0x82, 0x3B, 0x28, 0x28, 0xE0, 0xC8, 0xD1, 0xD5, 0x1C, 0xA8, + 0xD7, 0xE1, 0x87, 0xB8, 0x02, 0xA9, 0xDD, 0x7F, 0xF5, 0xDF, 0xDB, 0x7F, + 0x2B, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0x71, 0xD5, 0xE1, 0xC8, 0x02, 0xD5, + 0xE2, 0xC8, 0xC2, 0xD4, 0x00, 0xA9, 0x89, 0xE4, 0x28, 0xB6, 0x5F, 0xB0, + 0xFC, 0xB2, 0x40, 0xB4, 0xF9, 0xA8, 0x07, 0xA9, 0xDA, 0x7F, 0x8F, 0xDF, + 0x28, 0xE4, 0xDB, 0x7F, 0x17, 0xDF, 0x00, 0xA9, 0xE1, 0xC8, 0xF1, 0xD5, + 0x0A, 0x24, 0x24, 0xB8, 0x1A, 0x32, 0xFF, 0x7F, 0x5F, 0xDE, 0x06, 0x28, + 0xD9, 0x7F, 0x8D, 0xDF, 0x28, 0xE4, 0x00, 0xA1, 0x06, 0x28, 0xE0, 0xC8, + 0x17, 0xDB, 0x04, 0x90, 0x00, 0x40, 0x0F, 0xE6, 0x0A, 0xB8, 0x03, 0x40, + 0x0E, 0xB8, 0x06, 0x28, 0x81, 0xBA, 0xDF, 0xC8, 0x92, 0xE4, 0xA0, 0xC9, + 0x89, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x00, 0x38, 0xC1, 0xC0, 0xC1, 0xC1, + 0x06, 0x24, 0x14, 0xBF, 0xF2, 0xD9, 0xEE, 0xC1, 0xFF, 0x7F, 0x7F, 0xD8, + 0x04, 0x98, 0x00, 0x40, 0x8F, 0xE6, 0x00, 0xA9, 0x8A, 0xB8, 0x81, 0xB8, + 0x03, 0x40, 0x8E, 0xB8, 0x08, 0x39, 0xC1, 0xC8, 0xC1, 0xC1, 0xEE, 0xC1, + 0xFB, 0xDB, 0x00, 0xA1, 0x06, 0x28, 0xE0, 0xC8, 0xFF, 0x7F, 0x72, 0xD8, + 0x05, 0x99, 0x59, 0x08, 0xE0, 0xC8, 0x0B, 0xD4, 0x04, 0x94, 0xC1, 0xC4, + 0x84, 0x94, 0x03, 0x98, 0x01, 0x40, 0x8E, 0xB8, 0x83, 0x98, 0xC1, 0xC6, + 0xE1, 0xC4, 0xFF, 0x7F, 0x23, 0xDB, 0x01, 0xA9, 0x89, 0xE4, 0x28, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x1C, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, + 0x04, 0xA9, 0xDD, 0x7F, 0x8B, 0xDF, 0xDA, 0x7F, 0xC1, 0xDF, 0xE0, 0xC8, + 0x10, 0xD5, 0xE2, 0xC8, 0x99, 0xD5, 0x35, 0xDC, 0xE1, 0xC8, 0xFF, 0x7F, + 0x75, 0xD4, 0x00, 0xA9, 0x94, 0xDE, 0x01, 0x40, 0xE8, 0xE8, 0x00, 0x38, + 0x01, 0x40, 0xF8, 0xE8, 0x82, 0x38, 0xFF, 0x7F, 0x4D, 0xDE, 0xD8, 0xE4, + 0x1A, 0x2F, 0x01, 0xAE, 0xBE, 0xCE, 0x30, 0xE4, 0x94, 0xE4, 0x1C, 0xA0, + 0xD7, 0xE1, 0x07, 0xB8, 0x80, 0x28, 0x09, 0x38, 0xCF, 0xC9, 0x80, 0x28, + 0x8E, 0xB8, 0xC2, 0xC0, 0x1E, 0xC8, 0xBC, 0xC8, 0x80, 0x24, 0x48, 0xBA, + 0x84, 0xE4, 0x08, 0x40, 0x80, 0xB8, 0xC2, 0xC0, 0x7F, 0xA4, 0x07, 0x40, + 0x8F, 0xBF, 0x05, 0xD8, 0xF8, 0x7F, 0x80, 0xBF, 0x01, 0xDA, 0x80, 0xA8, + 0x48, 0xE4, 0x83, 0x34, 0x01, 0x40, 0x3E, 0xB8, 0xC1, 0xCD, 0xE1, 0xCD, + 0xE3, 0xDB, 0xFF, 0x7F, 0x43, 0xDE, 0xE3, 0xC8, 0xFF, 0x7F, 0x60, 0xD5, + 0xE4, 0xC8, 0xFF, 0x7F, 0x3D, 0xD4, 0x00, 0xA9, 0xFF, 0x7F, 0x5B, 0xDE, + 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xDD, 0xB6, 0x39, 0xE4, 0x33, 0x9A, + 0x34, 0x90, 0x04, 0x40, 0x19, 0x08, 0x20, 0xE4, 0xDF, 0xC2, 0x08, 0xBF, + 0x01, 0x40, 0x33, 0xD5, 0x01, 0xA8, 0xD8, 0x7F, 0xEE, 0xDF, 0x18, 0xE4, + 0xD9, 0x7F, 0xC6, 0xDF, 0x68, 0xE4, 0xC1, 0xC6, 0xDA, 0x7F, 0x66, 0xDF, + 0x00, 0xA9, 0xE1, 0xC8, 0x01, 0x40, 0x1D, 0xD5, 0xE1, 0xC1, 0x01, 0x40, + 0x1F, 0xD5, 0xC2, 0xE4, 0x04, 0x40, 0xCA, 0xE6, 0xC3, 0xB8, 0x0D, 0x40, + 0xC8, 0xB8, 0x0C, 0x2B, 0x1C, 0x2E, 0xDE, 0xE4, 0xDB, 0xB8, 0xEF, 0xCD, + 0x01, 0xDB, 0x0F, 0xAD, 0x00, 0xA4, 0x4D, 0xBF, 0x20, 0xD8, 0x4C, 0x40, + 0xDB, 0xE1, 0x0C, 0x40, 0xD3, 0xE1, 0x01, 0xA2, 0x03, 0xDE, 0xC1, 0xC4, + 0x4D, 0xBF, 0x15, 0xD8, 0x01, 0xA8, 0xD8, 0x7F, 0xC4, 0xDF, 0x18, 0xE4, + 0x94, 0xE4, 0x0A, 0xC9, 0x89, 0xE4, 0x8B, 0xB8, 0x08, 0x11, 0x09, 0xE4, + 0x03, 0xB8, 0x00, 0x12, 0xE0, 0xC1, 0xEF, 0xD4, 0x82, 0xE4, 0xD8, 0x7F, + 0xB6, 0xDF, 0x00, 0x18, 0xC1, 0xC4, 0x4D, 0xBF, 0xEB, 0xDB, 0x0C, 0x2B, + 0x1C, 0x2E, 0x00, 0xA4, 0x1E, 0xE4, 0x01, 0xE0, 0xDF, 0xC1, 0xE0, 0xC1, + 0x2F, 0xD9, 0x91, 0xE4, 0x06, 0xC9, 0x9C, 0xB8, 0x02, 0x40, 0x98, 0xB8, + 0x3A, 0xE4, 0xC6, 0xC3, 0x2B, 0xE4, 0x02, 0xE0, 0x21, 0xB8, 0x0A, 0xC2, + 0x04, 0xDE, 0xDF, 0xC1, 0xDC, 0xC2, 0xE0, 0xC1, 0x1F, 0xD9, 0x89, 0x28, + 0xDE, 0xC9, 0x08, 0xE4, 0x06, 0xB8, 0xE0, 0xC0, 0xF6, 0xDA, 0x0C, 0xA8, + 0xD7, 0xE1, 0x87, 0xB8, 0x82, 0xB8, 0x08, 0x08, 0xE0, 0xC8, 0xEF, 0xD5, + 0x08, 0x40, 0x0C, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, 0x82, 0xB8, 0xFC, 0x7F, + 0x08, 0x08, 0x92, 0xC8, 0x9A, 0x2F, 0x8F, 0xBD, 0x9A, 0x38, 0x83, 0x30, + 0xC1, 0xC4, 0xC2, 0xC3, 0xDF, 0xC1, 0xDC, 0xC2, 0xE0, 0xC1, 0xE1, 0xDA, + 0xE0, 0xC6, 0x00, 0x40, 0xC7, 0xD9, 0x00, 0xA1, 0x8B, 0xE4, 0x08, 0xE0, + 0xE0, 0xC8, 0x2D, 0xDB, 0x0C, 0x40, 0xDF, 0xE1, 0x9C, 0xE4, 0xC6, 0xC9, + 0x34, 0xE4, 0x06, 0xC3, 0x3A, 0xB8, 0xC6, 0xC3, 0x05, 0xDE, 0xC1, 0xC1, + 0x8B, 0xE4, 0x08, 0xE0, 0x81, 0xBF, 0x1F, 0xDB, 0x89, 0x28, 0xC2, 0xC9, + 0x08, 0xE4, 0x06, 0xB8, 0xE0, 0xC0, 0xF5, 0xDA, 0x21, 0xE4, 0x0A, 0xC2, + 0x82, 0xE4, 0x8F, 0xB8, 0x08, 0x08, 0xE0, 0xC8, 0xEE, 0xD5, 0x82, 0xE4, + 0x4C, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0x82, 0xB8, 0x08, 0x08, 0x92, 0xC8, + 0x9A, 0x22, 0x82, 0xBD, 0x9A, 0x38, 0x83, 0x30, 0xC1, 0xC4, 0xC2, 0xC3, + 0xC1, 0xC1, 0x8B, 0xE4, 0x08, 0xE0, 0x81, 0xBF, 0xE1, 0xD8, 0x0A, 0x34, + 0x00, 0xA4, 0x0C, 0x2B, 0x1B, 0xE4, 0xDF, 0xC1, 0xE0, 0xC1, 0x26, 0xD9, + 0x0C, 0x40, 0xDF, 0xE1, 0x91, 0xE4, 0x06, 0xC9, 0x9C, 0xB8, 0xC6, 0xC9, + 0x3A, 0xE4, 0x02, 0x40, 0x38, 0xB8, 0x89, 0x28, 0xDE, 0xC9, 0x08, 0xE4, + 0x06, 0xB8, 0xE0, 0xC0, 0x14, 0xDB, 0x21, 0xE4, 0x0A, 0xC2, 0x82, 0xE4, + 0x8F, 0xB8, 0x08, 0x08, 0xE0, 0xC8, 0x0D, 0xD5, 0x82, 0xE4, 0x4C, 0xA2, + 0xD7, 0xE1, 0x27, 0xB8, 0x82, 0xB8, 0x08, 0x08, 0x92, 0xC8, 0xAA, 0x22, + 0x82, 0xBD, 0xAA, 0x38, 0x83, 0x30, 0xC1, 0xC4, 0xC2, 0xC3, 0xDF, 0xC1, + 0xE0, 0xC1, 0xE3, 0xDA, 0xE0, 0xC6, 0x1D, 0xDB, 0x9D, 0xE4, 0x0A, 0xC9, + 0x08, 0x40, 0x0C, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, 0x89, 0xB8, 0xF8, 0x7F, + 0x08, 0x08, 0xE0, 0xC8, 0x12, 0xD5, 0x89, 0xE4, 0x08, 0x40, 0x0C, 0xA9, + 0xD7, 0xE1, 0x97, 0xB8, 0x89, 0xB8, 0xFC, 0x7F, 0x08, 0x08, 0x92, 0xC8, + 0xAA, 0x2F, 0x8F, 0xBD, 0xAA, 0x38, 0x84, 0xE4, 0x06, 0xC8, 0x8A, 0xB8, + 0x02, 0x40, 0xC8, 0x36, 0xC1, 0xC4, 0x00, 0xA1, 0x8E, 0xE4, 0x08, 0xE0, + 0xE0, 0xC8, 0x2D, 0xDB, 0x0C, 0x40, 0xDD, 0xE1, 0x2C, 0xE4, 0x02, 0x40, + 0x28, 0xB8, 0x34, 0xE4, 0x06, 0xC3, 0x3A, 0xB8, 0x02, 0x40, 0x38, 0xB8, + 0x82, 0x28, 0xC2, 0xC2, 0x08, 0xE4, 0x06, 0xB8, 0xE0, 0xC0, 0x18, 0xDB, + 0x9B, 0xE4, 0x09, 0xE0, 0x91, 0xB8, 0x0A, 0xC9, 0x89, 0xE4, 0x8D, 0xB8, + 0x08, 0x08, 0xE0, 0xC8, 0x0F, 0xD5, 0x89, 0xE4, 0x08, 0x40, 0x0C, 0xA9, + 0xD7, 0xE1, 0x97, 0xB8, 0x89, 0xB8, 0xFC, 0x7F, 0x08, 0x08, 0x92, 0xC8, + 0xAA, 0x2F, 0x8F, 0xBD, 0xAA, 0x38, 0x83, 0x30, 0xC1, 0xC4, 0xC2, 0xC3, + 0xC1, 0xC1, 0x8E, 0xE4, 0x08, 0xE0, 0x81, 0xBF, 0xDD, 0xD8, 0x1A, 0x34, + 0x01, 0xA9, 0x89, 0xE4, 0x23, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, + 0x66, 0xE0, 0xFE, 0x7F, 0xDE, 0xDE, 0x40, 0xA8, 0xD8, 0x7F, 0x72, 0xDF, + 0x20, 0xE4, 0x28, 0xBA, 0xDF, 0xC2, 0xD9, 0x7F, 0x35, 0xDF, 0x00, 0xA9, + 0xE1, 0xC8, 0xFE, 0x7F, 0xC1, 0xD4, 0xEB, 0xDE, 0x9D, 0xE4, 0x0A, 0xC9, + 0x08, 0x40, 0x0C, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, 0x89, 0xB8, 0xF8, 0x7F, + 0x08, 0x08, 0xE0, 0xC8, 0xFF, 0x7F, 0x2D, 0xD5, 0x89, 0xE4, 0x08, 0x40, + 0x0C, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0x82, 0xB8, 0xFC, 0x7F, 0x08, 0x08, + 0x92, 0xC8, 0x9A, 0x29, 0x89, 0xBD, 0x9A, 0x38, 0x84, 0xE4, 0x06, 0xC8, + 0x8A, 0xB8, 0xB8, 0x36, 0xC1, 0xC4, 0xFF, 0x7F, 0x1A, 0xDE, 0x20, 0xB5, + 0x04, 0xB3, 0x5F, 0xB1, 0xDB, 0xB6, 0x28, 0xE4, 0x39, 0xE4, 0x30, 0x91, + 0x31, 0x90, 0x00, 0xA9, 0x01, 0x39, 0x11, 0x39, 0x91, 0x39, 0xA1, 0x39, + 0xE0, 0xC0, 0x05, 0xD5, 0x01, 0xA8, 0xD7, 0x7F, 0x80, 0xDF, 0xE0, 0xC8, + 0x38, 0xD4, 0x14, 0x40, 0xDA, 0xE1, 0x8A, 0xE4, 0x02, 0xA9, 0xDB, 0x7F, + 0x70, 0xDF, 0xD8, 0x7F, 0xF5, 0xDF, 0x98, 0xE4, 0xE0, 0xC8, 0x1A, 0xD5, + 0x00, 0xA0, 0xE1, 0xC8, 0x12, 0xD5, 0xE2, 0xC8, 0x10, 0xD5, 0x00, 0xA8, + 0x91, 0x38, 0x11, 0x29, 0x01, 0x28, 0x98, 0xB8, 0x06, 0xC9, 0x8A, 0xE4, + 0xDB, 0x7F, 0xFD, 0xDF, 0xD8, 0x7F, 0xE2, 0xDF, 0x98, 0xE4, 0xDF, 0xC9, + 0x00, 0xA0, 0xFF, 0xC9, 0x24, 0xD5, 0x80, 0xE4, 0x25, 0xB6, 0x5F, 0xB0, + 0x04, 0xB2, 0x40, 0xB4, 0x8A, 0x28, 0x01, 0x38, 0x08, 0xE0, 0x09, 0xE4, + 0x01, 0x40, 0x80, 0xBF, 0xF4, 0xD8, 0x01, 0x40, 0xB8, 0xE8, 0x11, 0x38, + 0x08, 0xE0, 0x01, 0x40, 0x80, 0xBF, 0xDD, 0xDB, 0x80, 0xE4, 0x25, 0xB6, + 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x83, 0x91, 0x84, 0x90, 0x82, 0xE4, + 0x93, 0xE4, 0xFE, 0x7F, 0x41, 0xDF, 0x08, 0xE4, 0x80, 0xE4, 0x25, 0xB6, + 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x00, 0xA4, 0x34, 0xE4, 0x01, 0x28, + 0xE0, 0xC8, 0x1B, 0xDB, 0x68, 0xE4, 0x0A, 0xE4, 0x80, 0x89, 0xC1, 0xC4, + 0xC2, 0xC0, 0x83, 0xE4, 0x06, 0xC8, 0x81, 0xB8, 0x28, 0xE4, 0xC6, 0xC2, + 0x79, 0xE0, 0x82, 0x39, 0xE0, 0xC3, 0x03, 0xD5, 0xA8, 0x28, 0x98, 0xB8, + 0x82, 0x39, 0x80, 0x88, 0xC1, 0xC4, 0xC2, 0xC0, 0x8E, 0xC8, 0x91, 0x29, + 0x89, 0xBD, 0x91, 0x38, 0xC1, 0xC3, 0x63, 0xBF, 0xE7, 0xD8, 0x00, 0xA3, + 0x11, 0x28, 0xE0, 0xC8, 0x1D, 0xDB, 0x68, 0xE4, 0x04, 0xE4, 0x06, 0xC0, + 0x0A, 0xB8, 0x80, 0x88, 0xC1, 0xC8, 0xC2, 0xC0, 0x93, 0xE4, 0x06, 0xC9, + 0x91, 0xB8, 0x29, 0xE4, 0x02, 0x40, 0x28, 0xB8, 0x82, 0x38, 0xE0, 0xC3, + 0x04, 0xD5, 0x02, 0x40, 0xB9, 0x29, 0x89, 0xB8, 0x82, 0x38, 0x80, 0x88, + 0xC2, 0xC0, 0x8E, 0xC8, 0xA1, 0x29, 0x89, 0xBD, 0xA1, 0x38, 0xC1, 0xC3, + 0x63, 0xBF, 0xE7, 0xD8, 0x01, 0xA0, 0x99, 0xDE, 0x20, 0xB5, 0xFC, 0xB3, + 0x5F, 0xB1, 0xD8, 0xB6, 0xC9, 0xE4, 0x00, 0xA8, 0x09, 0x40, 0xC8, 0xEA, + 0x60, 0xA8, 0x09, 0x40, 0xD8, 0xEA, 0x1E, 0x40, 0x00, 0xA8, 0x09, 0x40, + 0xE8, 0xEA, 0x36, 0x40, 0x00, 0xA8, 0x09, 0x40, 0xF8, 0xEA, 0x00, 0xAA, + 0xF9, 0xE4, 0x18, 0x40, 0xDE, 0xE1, 0xDA, 0xE4, 0x00, 0xAB, 0xE3, 0xCA, + 0x5D, 0xD5, 0xE5, 0xCB, 0x5D, 0xD8, 0x8D, 0xE4, 0xC4, 0xC8, 0x01, 0xA9, + 0x29, 0xE4, 0xA2, 0xC2, 0x04, 0x40, 0x20, 0xBF, 0x01, 0xDB, 0x40, 0xA2, + 0x89, 0xE4, 0xD6, 0x7F, 0xCE, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, 0x5B, 0xD5, + 0x08, 0xA6, 0xE1, 0xCA, 0x00, 0x40, 0x6D, 0xD8, 0x09, 0x40, 0x08, 0xA8, + 0xD7, 0xE1, 0x87, 0xB8, 0x8D, 0xB8, 0x42, 0xE4, 0x4B, 0xE6, 0x88, 0x28, + 0x48, 0xB8, 0x8E, 0xE4, 0x92, 0xE4, 0xDB, 0x7F, 0x01, 0xDF, 0xD8, 0x7F, + 0x37, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0x6A, 0xD4, 0x00, 0xA3, 0x00, 0xA8, + 0x82, 0xBF, 0x2F, 0xDA, 0x08, 0xE4, 0x0D, 0xDE, 0x00, 0x40, 0xC8, 0x61, + 0x08, 0xB8, 0x00, 0x88, 0x8C, 0xB8, 0x84, 0xB8, 0x01, 0x40, 0x08, 0x31, + 0xC1, 0xC3, 0x03, 0xE4, 0x10, 0xE0, 0x02, 0xBF, 0x20, 0xDA, 0x80, 0xE4, + 0x06, 0xC8, 0x8E, 0xB8, 0x88, 0x29, 0x89, 0xE4, 0x08, 0x40, 0x80, 0xB8, + 0x58, 0xE0, 0x0F, 0x40, 0x8F, 0xBF, 0x4C, 0xDC, 0x16, 0xE4, 0x19, 0xB8, + 0x61, 0xE4, 0x81, 0xE4, 0x48, 0xE0, 0x1B, 0xD5, 0xE0, 0xCA, 0xE0, 0xD5, + 0x00, 0x40, 0xC9, 0x61, 0x08, 0xB8, 0x00, 0x88, 0x8C, 0xB8, 0x84, 0xB8, + 0x01, 0x40, 0x08, 0x31, 0xC1, 0xC3, 0x03, 0xE4, 0x10, 0xE0, 0x02, 0xBF, + 0xE0, 0xD9, 0xC1, 0xCB, 0xE3, 0xCA, 0xA3, 0xD4, 0xE1, 0xCB, 0xA3, 0xDB, + 0xC1, 0xCA, 0xC2, 0xCD, 0xC6, 0xCF, 0xE3, 0xCA, 0x99, 0xDB, 0x01, 0xA8, + 0x2C, 0xDE, 0x00, 0x40, 0xD4, 0x62, 0x0A, 0xA8, 0xDF, 0x7F, 0x4B, 0xDF, + 0xDF, 0xDE, 0x06, 0xA8, 0xD7, 0x7F, 0x24, 0xDF, 0x08, 0xE4, 0xD7, 0x7F, + 0xE9, 0xDF, 0xE1, 0xC8, 0x1D, 0xD5, 0x8B, 0xE4, 0x80, 0xBA, 0x18, 0xE0, + 0xE0, 0xC8, 0x18, 0xD9, 0x83, 0x92, 0x84, 0x9B, 0x85, 0x98, 0x8C, 0xE4, + 0x9A, 0xE4, 0x03, 0x40, 0x54, 0xDF, 0xC1, 0xCB, 0xD9, 0xDE, 0xF9, 0xA8, + 0x0F, 0x40, 0x07, 0xA9, 0xD7, 0x7F, 0x49, 0xDF, 0xC8, 0xC8, 0x68, 0xE4, + 0x9F, 0xE4, 0x9B, 0xB8, 0xFE, 0x7F, 0x49, 0x38, 0xD7, 0x7F, 0xCC, 0xDF, + 0xE1, 0xC8, 0x84, 0xD4, 0x00, 0xA8, 0x28, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, + 0x40, 0xB4, 0x20, 0xB5, 0x1F, 0xB1, 0xDB, 0xB6, 0x28, 0xE4, 0x39, 0xE4, + 0x2E, 0x94, 0x00, 0xA9, 0x40, 0x40, 0x00, 0xA8, 0x83, 0x98, 0x00, 0x40, + 0x73, 0x64, 0x00, 0xA8, 0x82, 0x40, 0xF7, 0xDF, 0x01, 0xA8, 0xD6, 0x7F, + 0x34, 0xDF, 0x04, 0x38, 0x48, 0xE0, 0x00, 0x40, 0xD7, 0xD4, 0x01, 0xA8, + 0xD6, 0x7F, 0x2D, 0xDF, 0x24, 0x38, 0x48, 0xE0, 0x00, 0x40, 0xCA, 0xD4, + 0x01, 0xA8, 0xD6, 0x7F, 0x26, 0xDF, 0x44, 0x38, 0x48, 0xE0, 0x00, 0x40, + 0xA1, 0xD4, 0x01, 0xA8, 0xD6, 0x7F, 0x1F, 0xDF, 0x01, 0x40, 0x74, 0x38, + 0x48, 0xE0, 0x11, 0xD5, 0x14, 0x40, 0xD1, 0xE1, 0x81, 0xE4, 0x02, 0xA9, + 0xDA, 0x7F, 0x0D, 0xDF, 0xD7, 0x7F, 0x92, 0xDF, 0x98, 0xE4, 0xE0, 0xC8, + 0x00, 0x40, 0x6A, 0xD5, 0x00, 0xA1, 0xE1, 0xC8, 0x63, 0xD5, 0xE2, 0xC8, + 0x61, 0xD5, 0x04, 0xA8, 0xD6, 0x7F, 0x07, 0xDF, 0x98, 0xE4, 0x0C, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x02, 0x40, 0x24, 0x38, 0x89, 0xE4, 0x08, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x02, 0x40, 0x34, 0x38, 0x89, 0xE4, 0x04, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x02, 0x40, 0x44, 0x38, 0x89, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0x02, 0x40, 0x54, 0x38, 0x59, 0xD4, 0x02, 0x40, 0xE4, 0x38, + 0x02, 0x40, 0xF4, 0x38, 0x03, 0x40, 0x84, 0x38, 0x03, 0x40, 0x94, 0x38, + 0x01, 0xA8, 0xD5, 0x7F, 0xE4, 0xDF, 0x02, 0x40, 0x64, 0x38, 0x48, 0xE0, + 0x29, 0xD5, 0x20, 0xA8, 0xD5, 0x7F, 0xDD, 0xDF, 0x64, 0x18, 0x20, 0xA8, + 0xD5, 0x7F, 0xD9, 0xDF, 0x74, 0x18, 0x01, 0xA8, 0xD5, 0x7F, 0xD5, 0xDF, + 0x02, 0x40, 0x74, 0x38, 0x48, 0xE0, 0x00, 0x40, 0xC3, 0xD4, 0xD7, 0x7F, + 0x4D, 0xDF, 0x00, 0xA1, 0xE1, 0xC8, 0x22, 0xD5, 0x01, 0xA8, 0xD5, 0x7F, + 0xC8, 0xDF, 0x04, 0x40, 0x04, 0x38, 0x18, 0xE4, 0x41, 0xE0, 0x00, 0x40, + 0xBB, 0xD5, 0x94, 0xE4, 0x03, 0x40, 0x94, 0xB8, 0x06, 0x40, 0x13, 0x83, + 0x83, 0x93, 0x01, 0xA8, 0x84, 0x98, 0x82, 0xE4, 0x01, 0x40, 0xAB, 0xDF, + 0x01, 0xA8, 0xD5, 0x7F, 0xB4, 0xDF, 0x04, 0x40, 0x14, 0x38, 0x48, 0xE0, + 0x00, 0x40, 0x77, 0xD4, 0x0F, 0xA8, 0x05, 0x40, 0x24, 0x38, 0x05, 0x40, + 0x34, 0x38, 0x01, 0xA1, 0x81, 0xE4, 0x25, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, + 0x81, 0x28, 0x02, 0x40, 0x04, 0x38, 0x08, 0xE0, 0x19, 0xE4, 0xE5, 0xC8, + 0xF5, 0xD8, 0x01, 0x40, 0xB8, 0xE8, 0x02, 0x40, 0x14, 0x38, 0x08, 0xE0, + 0xE5, 0xC8, 0xEE, 0xD8, 0x8C, 0xDE, 0x14, 0x40, 0xD1, 0xE1, 0x81, 0xE4, + 0x04, 0xA9, 0xD9, 0x7F, 0x88, 0xDF, 0xD7, 0x7F, 0x0D, 0xDF, 0xE0, 0xC8, + 0x45, 0xD5, 0x00, 0xA1, 0xE2, 0xC8, 0xE0, 0xD5, 0x00, 0x40, 0xB9, 0xDD, + 0x00, 0xA1, 0xE3, 0xC8, 0xDB, 0xD5, 0xE4, 0xC8, 0x9B, 0xD4, 0xD8, 0xDE, + 0x05, 0xA8, 0xD5, 0x7F, 0x7E, 0xDF, 0x98, 0xE4, 0x08, 0xC8, 0x00, 0x40, + 0x87, 0xBC, 0x54, 0x38, 0x89, 0xE4, 0x04, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x64, 0x38, 0x89, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x74, 0x38, 0xFF, 0x7F, + 0x4C, 0xD5, 0x18, 0xA8, 0xD5, 0x7F, 0x6B, 0xDF, 0x98, 0xE4, 0x40, 0xC8, + 0x01, 0x40, 0x44, 0x38, 0x89, 0xE4, 0x20, 0xC8, 0x01, 0x40, 0x54, 0x38, + 0x01, 0x40, 0x64, 0x39, 0xFF, 0x7F, 0x3D, 0xDE, 0x01, 0xA8, 0xD5, 0x7F, + 0x5C, 0xDF, 0x34, 0x38, 0xFF, 0x7F, 0x30, 0xDE, 0x08, 0xA8, 0xD5, 0x7F, + 0x56, 0xDF, 0x14, 0x38, 0x48, 0xE0, 0x0F, 0x40, 0x8F, 0xBF, 0xFF, 0x7F, + 0x20, 0xD4, 0x20, 0xA8, 0xD5, 0x7F, 0x4D, 0xDF, 0x98, 0xE4, 0x40, 0xC8, + 0xC4, 0x38, 0xD4, 0x39, 0xFF, 0x7F, 0x17, 0xDE, 0x81, 0x28, 0x02, 0x40, + 0xE4, 0x38, 0x01, 0x40, 0xB8, 0xE8, 0x02, 0x40, 0xF4, 0x38, 0x01, 0x40, + 0xC8, 0xE8, 0x03, 0x40, 0x84, 0x38, 0x01, 0x40, 0xD8, 0xE8, 0xFF, 0x7F, + 0x4F, 0xDE, 0x03, 0xA8, 0xD5, 0x7F, 0x35, 0xDF, 0x98, 0xE4, 0x08, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x04, 0x40, 0x24, 0x38, 0x89, 0xE4, 0x04, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x04, 0x40, 0x34, 0x38, 0x00, 0x40, 0x91, 0xBC, + 0x04, 0x40, 0x44, 0x39, 0x14, 0x40, 0xD1, 0xE1, 0x81, 0xE4, 0x05, 0xA9, + 0xD9, 0x7F, 0x17, 0xDF, 0xD6, 0x7F, 0x9C, 0xDF, 0x98, 0xE4, 0xE0, 0xC8, + 0x1E, 0xD5, 0x00, 0xA1, 0xE3, 0xC8, 0xFF, 0x7F, 0x6D, 0xD5, 0x4C, 0xDC, + 0xE1, 0xC8, 0xFF, 0x7F, 0x69, 0xD5, 0xE2, 0xC8, 0xFF, 0x7F, 0x65, 0xD4, + 0xFF, 0x7F, 0x64, 0xDE, 0xD5, 0x7F, 0xE6, 0xDF, 0x02, 0x40, 0xC4, 0x38, + 0xFF, 0x7F, 0x37, 0xDE, 0x84, 0xE4, 0x03, 0x40, 0x84, 0xB8, 0x2B, 0x41, + 0x0C, 0xA9, 0x83, 0x99, 0x91, 0xE4, 0x81, 0x40, 0xBE, 0xDF, 0xFF, 0x7F, + 0x45, 0xDE, 0x81, 0x28, 0x04, 0x40, 0x54, 0x38, 0x08, 0xE0, 0x19, 0xE4, + 0x01, 0x40, 0x80, 0xBF, 0xFF, 0x7F, 0x4A, 0xD8, 0x01, 0x40, 0xB8, 0xE8, + 0x04, 0x40, 0x64, 0x38, 0x08, 0xE0, 0x01, 0x40, 0x80, 0xBF, 0xFF, 0x7F, + 0x41, 0xD8, 0x01, 0x40, 0xC8, 0xE8, 0x04, 0x40, 0x74, 0x38, 0x08, 0xE0, + 0x01, 0x40, 0x80, 0xBF, 0xFF, 0x7F, 0x38, 0xD8, 0x01, 0x40, 0xD8, 0xE8, + 0x05, 0x40, 0x24, 0x38, 0x08, 0xE0, 0x01, 0x40, 0x80, 0xBF, 0xFF, 0x7F, + 0x2F, 0xD8, 0x01, 0x40, 0xE8, 0xE8, 0x05, 0x40, 0x34, 0x38, 0x08, 0xE0, + 0xEF, 0xC8, 0xFF, 0x7F, 0x27, 0xD8, 0xFF, 0x7F, 0x24, 0xDE, 0xE1, 0xC8, + 0xFE, 0x7F, 0xE4, 0xD4, 0xFF, 0x7F, 0x20, 0xDE, 0x00, 0xA1, 0xE4, 0xC8, + 0xFF, 0x7F, 0x1C, 0xD5, 0xE5, 0xC8, 0xFF, 0x7F, 0x18, 0xD4, 0xFF, 0x7F, + 0x17, 0xDE, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0x39, 0xE4, + 0x0E, 0x90, 0x00, 0xA4, 0xA0, 0xE4, 0xA9, 0xB8, 0x04, 0x40, 0x4A, 0x28, + 0x88, 0xB8, 0x43, 0xD7, 0x00, 0xA2, 0x60, 0xE4, 0x16, 0xC6, 0x16, 0xE4, + 0x12, 0xB8, 0x0A, 0xC1, 0x13, 0xB8, 0x01, 0xE4, 0x03, 0x40, 0x0C, 0xB8, + 0xD5, 0x7F, 0x82, 0xDF, 0x00, 0x18, 0xD6, 0x7F, 0x23, 0xDF, 0xE1, 0xC8, + 0x37, 0xD5, 0x43, 0x40, 0x1C, 0xB8, 0xD5, 0x7F, 0x79, 0xDF, 0x01, 0x18, + 0xD6, 0x7F, 0x1A, 0xDF, 0xE1, 0xC8, 0x2E, 0xD5, 0x23, 0x88, 0xE0, 0xC8, + 0x16, 0xD5, 0x12, 0xE4, 0x0A, 0xC1, 0x13, 0xB8, 0x01, 0xE4, 0x83, 0x40, + 0x0C, 0xB8, 0xD5, 0x7F, 0x69, 0xDF, 0x00, 0x18, 0xD6, 0x7F, 0x0A, 0xDF, + 0xE1, 0xC8, 0x1E, 0xD5, 0x85, 0x40, 0x1C, 0xB8, 0xD5, 0x7F, 0x60, 0xDF, + 0x01, 0x18, 0xD6, 0x7F, 0x01, 0xDF, 0xE1, 0xC8, 0x15, 0xD5, 0x06, 0xE4, + 0x03, 0xB8, 0x02, 0xB8, 0x87, 0x40, 0x0C, 0xB8, 0x01, 0xA8, 0xD4, 0x7F, + 0x78, 0xDF, 0x00, 0x38, 0xC1, 0xC4, 0x24, 0xE4, 0x02, 0xE0, 0x04, 0x40, + 0x4A, 0x28, 0x28, 0xBF, 0xC0, 0xDB, 0x01, 0xA8, 0x03, 0xB6, 0x5F, 0xB0, + 0x04, 0xB2, 0x40, 0xB4, 0x00, 0xA8, 0x03, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, + 0x40, 0xB4, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0x39, 0xE4, + 0x0E, 0x90, 0x00, 0xA4, 0xA0, 0xE4, 0xA9, 0xB8, 0x04, 0x40, 0x4A, 0x28, + 0x88, 0xB8, 0x43, 0xD7, 0x00, 0xA2, 0x60, 0xE4, 0x16, 0xC6, 0x16, 0xE4, + 0x12, 0xB8, 0x0A, 0xC1, 0x13, 0xB8, 0x01, 0xE4, 0x97, 0x40, 0x0C, 0xB8, + 0xD5, 0x7F, 0x28, 0xDF, 0x00, 0x18, 0xD5, 0x7F, 0xC9, 0xDF, 0xE1, 0xC8, + 0x37, 0xD5, 0xD7, 0x40, 0x1C, 0xB8, 0xD5, 0x7F, 0x1F, 0xDF, 0x01, 0x18, + 0xD5, 0x7F, 0xC0, 0xDF, 0xE1, 0xC8, 0x2E, 0xD5, 0x23, 0x88, 0xE0, 0xC8, + 0x16, 0xD5, 0x12, 0xE4, 0x0A, 0xC1, 0x13, 0xB8, 0x01, 0xE4, 0x17, 0x41, + 0x0C, 0xB8, 0xD5, 0x7F, 0x0F, 0xDF, 0x00, 0x18, 0xD5, 0x7F, 0xB0, 0xDF, + 0xE1, 0xC8, 0x1E, 0xD5, 0x19, 0x41, 0x1C, 0xB8, 0xD5, 0x7F, 0x06, 0xDF, + 0x01, 0x18, 0xD5, 0x7F, 0xA7, 0xDF, 0xE1, 0xC8, 0x15, 0xD5, 0x06, 0xE4, + 0x03, 0xB8, 0x02, 0xB8, 0x1B, 0x41, 0x0C, 0xB8, 0x01, 0xA8, 0xD4, 0x7F, + 0x1E, 0xDF, 0x00, 0x38, 0xC1, 0xC4, 0x24, 0xE4, 0x02, 0xE0, 0x04, 0x40, + 0x4A, 0x28, 0x28, 0xBF, 0xC0, 0xDB, 0x01, 0xA8, 0x03, 0xB6, 0x5F, 0xB0, + 0x04, 0xB2, 0x40, 0xB4, 0x00, 0xA8, 0x03, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, + 0x40, 0xB4, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0xB8, 0xE4, + 0x39, 0xE4, 0x10, 0x96, 0x11, 0x98, 0x00, 0xA4, 0xE0, 0xC8, 0x00, 0x40, + 0x80, 0xD4, 0x09, 0x34, 0x19, 0x34, 0x29, 0x34, 0x49, 0x34, 0x17, 0xA8, + 0x01, 0x40, 0x19, 0x38, 0x01, 0x40, 0x29, 0x38, 0x01, 0x40, 0x39, 0x38, + 0x00, 0xA4, 0x00, 0xA0, 0x06, 0xBF, 0x00, 0x40, 0x65, 0xDA, 0x20, 0xE4, + 0x01, 0xAA, 0x21, 0xDE, 0x00, 0x39, 0x12, 0xE4, 0x13, 0xB8, 0x02, 0x40, + 0x41, 0x28, 0xE1, 0xC8, 0x30, 0xD5, 0x01, 0x40, 0x1C, 0xB8, 0x01, 0xA8, + 0xD3, 0x7F, 0xE1, 0xDF, 0x01, 0x38, 0x02, 0xE4, 0x03, 0xB8, 0x03, 0x40, + 0x40, 0x81, 0xE0, 0xC1, 0x39, 0xD5, 0x00, 0xA8, 0x04, 0x40, 0x40, 0x38, + 0x03, 0x88, 0xE0, 0xC8, 0x4E, 0xD4, 0x13, 0x88, 0xE0, 0xC8, 0x3C, 0xD4, + 0xC1, 0xC4, 0x24, 0xE4, 0x12, 0xE0, 0x26, 0xBF, 0x41, 0xDA, 0x02, 0xE4, + 0x03, 0xB8, 0xCC, 0xC0, 0x01, 0xA8, 0xD3, 0x7F, 0xC6, 0xDF, 0x98, 0xE4, + 0x00, 0x38, 0xC8, 0xC0, 0x48, 0xE0, 0xD4, 0xD4, 0x00, 0x3A, 0x01, 0xA8, + 0xD3, 0x7F, 0xBD, 0xDF, 0x00, 0x38, 0x12, 0xE4, 0x13, 0xB8, 0x02, 0x40, + 0x41, 0x28, 0xE1, 0xC8, 0xD0, 0xD4, 0x02, 0xE4, 0x06, 0xC0, 0x03, 0xB8, + 0x02, 0x40, 0x0C, 0xB8, 0xD4, 0x7F, 0x8A, 0xDF, 0x80, 0x38, 0xD5, 0x7F, + 0x2B, 0xDF, 0xE1, 0xC8, 0x63, 0xD5, 0x00, 0xA8, 0x03, 0x40, 0x41, 0x38, + 0x02, 0xE4, 0x03, 0xB8, 0x03, 0x40, 0x40, 0x81, 0xE0, 0xC1, 0xC7, 0xD4, + 0x02, 0x40, 0x04, 0xB8, 0x1F, 0xA8, 0xD4, 0x7F, 0x53, 0xDF, 0x00, 0x38, + 0xD5, 0x7F, 0x18, 0xDF, 0xE1, 0xC8, 0xC0, 0xD4, 0x81, 0xE4, 0x0B, 0xDE, + 0x83, 0x92, 0x8B, 0xE4, 0x93, 0xE4, 0xFF, 0x7F, 0x2A, 0xDF, 0xC1, 0xC4, + 0x24, 0xE4, 0x12, 0xE0, 0x26, 0xBF, 0xBF, 0xD9, 0x01, 0xA8, 0x04, 0xB6, + 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x83, 0x92, 0x8B, 0xE4, 0x93, 0xE4, + 0xFE, 0x7F, 0xC1, 0xDF, 0xAC, 0xDE, 0x02, 0xA8, 0xD3, 0x7F, 0x7D, 0xDF, + 0x98, 0xE4, 0x04, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x03, 0x38, 0x00, 0x40, + 0x91, 0xBC, 0x13, 0x39, 0x83, 0x88, 0xE0, 0xC8, 0xFF, 0x7F, 0x7C, 0xD5, + 0x01, 0xA8, 0xD3, 0x7F, 0x6E, 0xDF, 0x23, 0x38, 0x48, 0xE0, 0x2C, 0xD4, + 0x08, 0xA8, 0xD3, 0x7F, 0x68, 0xDF, 0x98, 0xE4, 0x10, 0xC8, 0x00, 0x40, + 0x8F, 0xBC, 0x73, 0x38, 0x00, 0x40, 0x9F, 0xBC, 0x01, 0x40, 0x03, 0x39, + 0x23, 0x88, 0xE0, 0xC8, 0x17, 0xD4, 0x0F, 0xA8, 0xD3, 0x7F, 0x59, 0xDF, + 0x98, 0xE4, 0x28, 0xC8, 0x01, 0x40, 0x8F, 0xBC, 0x01, 0x40, 0x13, 0x38, + 0x89, 0xE4, 0x14, 0xC8, 0x01, 0x40, 0x8F, 0xBC, 0x01, 0x40, 0x23, 0x38, + 0x01, 0x40, 0x9F, 0xBC, 0x01, 0x40, 0x33, 0x39, 0xFF, 0x7F, 0x52, 0xDE, + 0x00, 0xA8, 0xBB, 0xDE, 0x04, 0xA8, 0xD3, 0x7F, 0x42, 0xDF, 0x01, 0x40, + 0x03, 0x38, 0xE3, 0xDE, 0x13, 0xA8, 0xD3, 0x7F, 0x3C, 0xDF, 0x98, 0xE4, + 0x2C, 0xC8, 0x33, 0x38, 0x89, 0xE4, 0x18, 0xC8, 0x01, 0x40, 0x8F, 0xBC, + 0x43, 0x38, 0x89, 0xE4, 0x14, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x53, 0x38, + 0x01, 0x40, 0x9F, 0xBC, 0x63, 0x39, 0xC0, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, + 0xFA, 0xB6, 0x39, 0xE4, 0x00, 0xA1, 0x04, 0xA2, 0x00, 0xA0, 0x0F, 0xDE, + 0xE5, 0xC0, 0x11, 0xD8, 0x01, 0xA8, 0x8A, 0xC8, 0x04, 0x40, 0x80, 0xBF, + 0x01, 0xDB, 0x40, 0xA8, 0x83, 0x98, 0x84, 0x90, 0x85, 0x90, 0x83, 0xE4, + 0x91, 0xE4, 0x0D, 0xDF, 0xC1, 0xC0, 0xE3, 0xC1, 0xEF, 0xD4, 0xE1, 0xC0, + 0xEF, 0xDB, 0xC1, 0xC1, 0xC2, 0xC2, 0xE3, 0xC1, 0xE7, 0xDB, 0x01, 0xA8, + 0x06, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x3C, 0xB3, 0x5F, 0xB1, 0xFE, 0xB6, + 0xA8, 0xE4, 0x29, 0xE4, 0x0F, 0x94, 0x10, 0x96, 0x11, 0x93, 0xDB, 0xE1, + 0x00, 0xA8, 0x88, 0xEA, 0x60, 0xA8, 0x98, 0xEA, 0x1E, 0x40, 0x00, 0xA8, + 0xA8, 0xEA, 0x36, 0x40, 0x00, 0xA8, 0xB8, 0xEA, 0xE0, 0xC9, 0x18, 0xD4, + 0x63, 0xBF, 0x45, 0xD5, 0x19, 0xE4, 0x94, 0xBF, 0x0F, 0xDA, 0x24, 0xE4, + 0x26, 0xE6, 0x04, 0xE4, 0x03, 0xE6, 0x2A, 0xB8, 0xC8, 0xC2, 0x0A, 0xB8, + 0xC8, 0xC0, 0x00, 0x28, 0xC1, 0xC0, 0x02, 0x38, 0xC1, 0xC2, 0xC1, 0xC1, + 0x14, 0xBF, 0xF9, 0xD9, 0x02, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, 0xA0, 0xE0, + 0xD9, 0xE4, 0x06, 0xCD, 0x8D, 0xE4, 0xD7, 0xE1, 0x87, 0xB8, 0x88, 0x29, + 0x04, 0xE4, 0x06, 0xE6, 0xC9, 0xE4, 0xC0, 0xB8, 0x63, 0xBF, 0x31, 0xD5, + 0x84, 0xE4, 0x83, 0xE6, 0x89, 0xB8, 0x00, 0xA1, 0x14, 0xBF, 0x0D, 0xDA, + 0x0C, 0xE4, 0x0A, 0xB8, 0x98, 0xE4, 0x9A, 0xB8, 0xC8, 0xC0, 0xC8, 0xC9, + 0x09, 0x28, 0xC1, 0xC9, 0x00, 0x38, 0xC1, 0xC0, 0xC1, 0xC1, 0x14, 0xBF, + 0xF9, 0xD9, 0xE1, 0xC2, 0xDB, 0xDB, 0x82, 0xE4, 0x00, 0x40, 0x86, 0xE6, + 0x8A, 0xB8, 0x68, 0xB8, 0x83, 0xB8, 0xFE, 0x7F, 0x48, 0x28, 0xFE, 0x7F, + 0x46, 0x38, 0x02, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, 0xA0, 0xE0, 0x19, 0xE4, + 0x94, 0xBF, 0xCA, 0xDA, 0x84, 0xE4, 0x83, 0xE6, 0x10, 0xA9, 0x8A, 0xB8, + 0xC8, 0xC8, 0x08, 0x39, 0xC1, 0xC8, 0xC1, 0xC1, 0x14, 0xBF, 0xFB, 0xD9, + 0xBF, 0xDE, 0xE0, 0xC3, 0x02, 0xD4, 0xE3, 0xC2, 0x24, 0xD5, 0xE3, 0xC2, + 0x02, 0xD5, 0xE2, 0xC3, 0x20, 0xDB, 0x00, 0x40, 0xD1, 0x61, 0x08, 0xA3, + 0x00, 0xA1, 0x14, 0xBF, 0x0B, 0xDA, 0x9C, 0xE4, 0x9A, 0xB8, 0xC8, 0xC9, + 0x83, 0xE4, 0x81, 0xB8, 0x08, 0x28, 0x09, 0x38, 0xC1, 0xC9, 0xC1, 0xC1, + 0x14, 0xBF, 0xF8, 0xD9, 0xE1, 0xC2, 0xA4, 0xDB, 0x00, 0x40, 0x26, 0xE6, + 0x2A, 0xB8, 0x62, 0xB8, 0xBD, 0xB8, 0x8B, 0x2B, 0xAB, 0xB8, 0x0A, 0xB8, + 0x01, 0x40, 0x00, 0x28, 0xFE, 0x7F, 0x46, 0x38, 0xC6, 0xDE, 0x00, 0x40, + 0xCD, 0x61, 0x08, 0xA3, 0xDF, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, + 0x08, 0xE4, 0x19, 0xE4, 0x40, 0xE0, 0x80, 0xE4, 0x1E, 0xA9, 0x76, 0x40, + 0xD4, 0xDF, 0x28, 0xE4, 0x42, 0xE0, 0x80, 0xE4, 0x1E, 0xA9, 0x77, 0x40, + 0x6C, 0xDF, 0x48, 0xE0, 0x03, 0xA9, 0x76, 0x40, 0xCA, 0xDF, 0x48, 0xE0, + 0xE6, 0xC2, 0x1F, 0xD8, 0xE2, 0xC8, 0x1D, 0xD8, 0x00, 0x40, 0x23, 0xE6, + 0x28, 0xB8, 0x0A, 0xC2, 0x00, 0x40, 0x58, 0x63, 0x28, 0xB8, 0x02, 0x00, + 0x80, 0xE4, 0x09, 0xC8, 0x10, 0xA9, 0x81, 0xBF, 0x11, 0xD6, 0x80, 0xE4, + 0x05, 0xC8, 0x0C, 0xA9, 0x81, 0xBF, 0x0C, 0xD6, 0x00, 0x40, 0x03, 0xE6, + 0x09, 0xC0, 0x08, 0xA9, 0x01, 0xBF, 0x06, 0xD6, 0x06, 0xA9, 0x89, 0xE4, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x00, 0xA9, 0x89, 0xE4, 0x03, 0xB6, + 0x07, 0xB0, 0x40, 0xB4, 0x07, 0xB1, 0xFF, 0xB6, 0x38, 0x20, 0x48, 0x21, + 0x58, 0x22, 0x68, 0x29, 0x38, 0x39, 0x48, 0x30, 0x58, 0x31, 0x68, 0x32, + 0x01, 0xB6, 0x07, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, 0x28, 0xE4, 0x02, 0x40, + 0x9B, 0x70, 0x28, 0x00, 0xE0, 0xC0, 0x11, 0xD9, 0x00, 0xA8, 0x05, 0x40, + 0x06, 0xBF, 0x23, 0xD8, 0x90, 0xE4, 0x0A, 0xC9, 0x92, 0xB8, 0x02, 0x40, + 0x85, 0x70, 0x9C, 0xB8, 0x09, 0x01, 0xE0, 0xC1, 0x0E, 0xD5, 0xC1, 0xC0, + 0x05, 0x40, 0x06, 0xBF, 0xF3, 0xDB, 0x00, 0xA0, 0x90, 0xE4, 0x0A, 0xC9, + 0x92, 0xB8, 0x02, 0x40, 0x85, 0x70, 0x9C, 0xB8, 0x09, 0x01, 0xE0, 0xC1, + 0xF2, 0xD4, 0x01, 0xA8, 0x09, 0x18, 0x05, 0x40, 0x06, 0xBF, 0x09, 0xD5, + 0x80, 0xE4, 0xC1, 0xC8, 0x02, 0x40, 0x9B, 0x70, 0x22, 0x18, 0x80, 0xE4, + 0x48, 0xE0, 0x07, 0xB0, 0xA0, 0xE0, 0x02, 0x40, 0x9B, 0x70, 0x22, 0x11, + 0x80, 0xE4, 0x48, 0xE0, 0xF8, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, + 0x09, 0xE4, 0x0A, 0xC0, 0x08, 0xB8, 0x80, 0xE4, 0x02, 0x40, 0x85, 0x70, + 0x8C, 0xB8, 0xBF, 0x7F, 0x29, 0xDF, 0x02, 0x40, 0x70, 0x70, 0x00, 0x08, + 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, + 0x08, 0xE4, 0x89, 0xE4, 0x99, 0xB8, 0x07, 0xD7, 0x0A, 0xC8, 0x80, 0xB8, + 0x02, 0x40, 0x85, 0x70, 0x8C, 0xB8, 0xBF, 0x7F, 0x17, 0xDF, 0x03, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0xE0, 0xC9, 0x08, 0xD9, + 0x0A, 0xC9, 0x98, 0xB8, 0x02, 0x40, 0x85, 0x70, 0x9C, 0xB8, 0x09, 0x08, + 0xE0, 0xC8, 0x02, 0xD4, 0x03, 0xB6, 0x40, 0xB4, 0x89, 0xE4, 0xBF, 0x7F, + 0x03, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, + 0x08, 0xE4, 0x01, 0xA1, 0x02, 0x40, 0xAB, 0x5A, 0x38, 0x11, 0x00, 0xA2, + 0x0A, 0x40, 0xCB, 0x66, 0x38, 0x12, 0x91, 0xE4, 0xF1, 0x7F, 0x6D, 0xDF, + 0x38, 0xE4, 0xE1, 0xC8, 0x3C, 0xD5, 0xE2, 0xC8, 0x5C, 0xD5, 0x02, 0x40, + 0xE1, 0x4C, 0x20, 0x08, 0xA2, 0xC1, 0x02, 0x40, 0xAD, 0x5A, 0x00, 0x11, + 0x02, 0x40, 0xDE, 0x4C, 0x30, 0x08, 0x04, 0x40, 0x80, 0xBC, 0x1B, 0xD5, + 0x02, 0x40, 0xAA, 0x5A, 0x30, 0x12, 0x00, 0x60, 0x00, 0x40, 0x00, 0xA9, + 0x02, 0x40, 0xAB, 0x5A, 0x00, 0x19, 0x02, 0x40, 0xDB, 0x4C, 0x10, 0x08, + 0xE2, 0xC8, 0x14, 0xD5, 0x00, 0x60, 0x00, 0x40, 0x00, 0xA8, 0x0A, 0x40, + 0xE0, 0x66, 0x30, 0x18, 0x80, 0xE4, 0x05, 0x40, 0xBA, 0xDF, 0x83, 0xE4, + 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x80, 0xE4, 0x03, 0x40, 0xD7, 0xDF, + 0x02, 0x40, 0xAA, 0x5A, 0x30, 0x18, 0xF2, 0xDE, 0x0A, 0x40, 0xE0, 0x66, + 0x20, 0x08, 0x00, 0x60, 0x00, 0x40, 0x80, 0xBF, 0xE5, 0xD5, 0x0A, 0x40, + 0xE0, 0x66, 0x20, 0x19, 0xE1, 0xDE, 0x82, 0xE4, 0xD2, 0x7F, 0xF7, 0xDF, + 0x0A, 0x40, 0xCE, 0x66, 0x20, 0x09, 0x89, 0xE4, 0xC0, 0x41, 0x80, 0xBC, + 0x08, 0xD4, 0x04, 0x40, 0x26, 0x5B, 0x50, 0x88, 0x2A, 0xC8, 0x98, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x20, 0x19, 0x0A, 0x40, 0xCE, 0x66, 0x10, 0x09, + 0x89, 0xE4, 0xC0, 0x4F, 0x80, 0xBC, 0xD1, 0xD4, 0x04, 0x40, 0x26, 0x5B, + 0x40, 0x88, 0x2A, 0xC8, 0x98, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x10, 0x19, + 0xC8, 0xDE, 0x82, 0xE4, 0xD2, 0x7F, 0xD5, 0xDF, 0x0A, 0x40, 0xCE, 0x66, + 0x10, 0x08, 0x00, 0x42, 0x00, 0x40, 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, + 0x10, 0x18, 0x83, 0xE4, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x1C, 0xB3, 0x5F, 0xB1, 0xF8, 0xB6, 0x18, 0xE4, 0x00, 0xA4, 0x28, 0xE4, + 0x02, 0x40, 0xAD, 0x5A, 0x2C, 0xB8, 0xC8, 0xE4, 0x02, 0x40, 0xAE, 0x5A, + 0xC4, 0xB8, 0x34, 0xE4, 0xA4, 0xE4, 0x0C, 0x14, 0x02, 0x14, 0x1C, 0x14, + 0x01, 0xA6, 0x81, 0xE4, 0xEA, 0x7F, 0x27, 0xDF, 0xE1, 0xC8, 0x00, 0x40, + 0xC9, 0xD5, 0x02, 0x40, 0xAB, 0x5A, 0x31, 0x08, 0xE1, 0xC8, 0x00, 0x40, + 0xE3, 0xD5, 0xE0, 0xC3, 0x0F, 0xD4, 0x02, 0x08, 0xE0, 0xC8, 0x05, 0xD5, + 0x02, 0x40, 0xE0, 0x4C, 0x31, 0x08, 0xE0, 0xC8, 0x07, 0xD4, 0x02, 0x40, + 0xDC, 0x4C, 0x21, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0xB8, 0xD5, 0x02, 0x13, + 0x02, 0x40, 0xD2, 0x4C, 0x21, 0x1A, 0x00, 0xA8, 0x02, 0x40, 0xAB, 0x5A, + 0x31, 0x18, 0x81, 0xE4, 0x17, 0x40, 0x73, 0xDF, 0xE0, 0xC8, 0x1F, 0xD5, + 0x81, 0xE4, 0x02, 0x40, 0xAB, 0x5A, 0x31, 0x09, 0xF0, 0x7F, 0xB9, 0xDF, + 0x08, 0xE4, 0xE2, 0xC8, 0x00, 0x40, 0xB3, 0xD5, 0x02, 0x40, 0xE1, 0x4C, + 0x21, 0x08, 0x96, 0xE4, 0xA2, 0xC9, 0x02, 0x40, 0xAD, 0x5A, 0x01, 0x08, + 0x89, 0xBD, 0x02, 0x40, 0xAD, 0x5A, 0x01, 0x18, 0x81, 0xE4, 0x18, 0x40, + 0x8A, 0xDF, 0x00, 0x40, 0x01, 0xBC, 0x00, 0x40, 0x97, 0xD4, 0xE0, 0xC3, + 0xB8, 0xD5, 0xFF, 0xA8, 0x0C, 0x40, 0x34, 0x38, 0x02, 0x40, 0xDE, 0x4C, + 0x31, 0x08, 0x0E, 0x40, 0x80, 0xBC, 0x17, 0xD4, 0x98, 0xE4, 0x0A, 0x40, + 0xCB, 0x66, 0x31, 0x02, 0xE0, 0xC2, 0x11, 0xDB, 0x0A, 0x40, 0xCC, 0x66, + 0x21, 0x06, 0x00, 0x40, 0x68, 0x50, 0x60, 0xE6, 0x61, 0xB8, 0x06, 0x08, + 0x79, 0xC8, 0xE2, 0xC8, 0x00, 0x40, 0xD6, 0xD4, 0xC1, 0xC9, 0x07, 0x40, + 0x60, 0xB8, 0x29, 0xBF, 0xF6, 0xD8, 0x02, 0x40, 0xD2, 0x4C, 0x21, 0x08, + 0x88, 0xB8, 0x00, 0x40, 0xC5, 0xD7, 0x44, 0x29, 0x05, 0xC9, 0x00, 0x40, + 0x91, 0xBC, 0xE1, 0xC9, 0x00, 0x40, 0x98, 0xD5, 0xE0, 0xCA, 0x55, 0xD5, + 0x01, 0x40, 0x24, 0x28, 0x11, 0xC8, 0x00, 0x40, 0x8F, 0xBC, 0x01, 0xA0, + 0xA2, 0xC0, 0x84, 0x88, 0x80, 0xB8, 0xDF, 0xC8, 0x90, 0xE4, 0x75, 0x40, + 0x54, 0xDF, 0x68, 0xE4, 0xDF, 0xC6, 0x94, 0x88, 0x80, 0xB8, 0xDF, 0xC8, + 0x90, 0xE4, 0x75, 0x40, 0x4C, 0xDF, 0x48, 0xE4, 0xDF, 0xC4, 0x0A, 0x40, + 0xCC, 0x66, 0x21, 0x08, 0x29, 0x43, 0x84, 0xE6, 0x81, 0xB8, 0xA8, 0xE4, + 0x03, 0x40, 0x4E, 0x62, 0xAC, 0xB8, 0xB8, 0xE4, 0x03, 0x40, 0x37, 0x65, + 0xBA, 0xB8, 0x28, 0x43, 0xFA, 0x23, 0x00, 0xA2, 0x24, 0xBF, 0x2B, 0xD8, + 0x02, 0xE4, 0x06, 0xC0, 0x90, 0xE4, 0x9B, 0xB8, 0x89, 0x28, 0x68, 0xBF, + 0x21, 0xD5, 0x0A, 0x40, 0xCB, 0x66, 0x11, 0x08, 0x83, 0x98, 0x82, 0xE4, + 0x58, 0xE0, 0x84, 0x98, 0x89, 0x28, 0xC1, 0xC8, 0x58, 0xE0, 0x85, 0x98, + 0x86, 0xE4, 0x58, 0xE0, 0x86, 0x98, 0x87, 0x93, 0x81, 0xE4, 0x9A, 0xE4, + 0x14, 0x40, 0x7A, 0xDF, 0x90, 0xE4, 0x9A, 0xB8, 0x89, 0x28, 0x88, 0xB8, + 0x4B, 0xD7, 0x0A, 0x40, 0xCB, 0x66, 0x11, 0x08, 0x02, 0x40, 0x8C, 0xB8, + 0x0A, 0x40, 0xCB, 0x66, 0x11, 0x18, 0xC1, 0xC3, 0xC1, 0xC2, 0x24, 0xBF, + 0xD5, 0xDB, 0x0C, 0x08, 0x02, 0x40, 0xF9, 0xDF, 0x01, 0xA8, 0x08, 0xB6, + 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0x81, 0xE4, 0x02, 0x40, 0xE1, 0x4C, + 0x11, 0x09, 0x10, 0x40, 0xF2, 0xDF, 0xA8, 0xBA, 0xFF, 0x7F, 0x3F, 0xDE, + 0x00, 0xA8, 0xD1, 0x7F, 0xD4, 0xDF, 0x02, 0x40, 0xE0, 0x4C, 0x31, 0x16, + 0x02, 0x16, 0xFF, 0x7F, 0x60, 0xDE, 0x01, 0xA3, 0x81, 0xE4, 0x17, 0x40, + 0x9C, 0xDF, 0x81, 0xE4, 0x17, 0x40, 0xB8, 0xDF, 0xFF, 0x7F, 0x53, 0xDE, + 0x81, 0xE4, 0x4E, 0xDF, 0x48, 0xE4, 0x02, 0x40, 0xDC, 0x4C, 0x21, 0x08, + 0xE0, 0xC8, 0x06, 0xD5, 0x00, 0xA8, 0x02, 0x40, 0xAC, 0x5A, 0x01, 0x18, + 0xFF, 0x7F, 0x0F, 0xDE, 0x02, 0x40, 0xD2, 0x4C, 0x11, 0x0A, 0x02, 0x40, + 0x00, 0x6A, 0x00, 0xA8, 0x83, 0x98, 0x84, 0xE4, 0x0A, 0x40, 0xCB, 0x66, + 0x01, 0x09, 0xBE, 0x7F, 0x8A, 0xDF, 0xEC, 0xDE, 0x89, 0x33, 0xB3, 0xDE, + 0x01, 0x40, 0x24, 0x28, 0x11, 0xC8, 0x00, 0x40, 0x8F, 0xBC, 0xA2, 0xC9, + 0x84, 0x88, 0x89, 0xB8, 0xDF, 0xC8, 0x74, 0x40, 0xC0, 0xDF, 0x0A, 0x40, + 0xCC, 0x66, 0x21, 0x02, 0x29, 0x43, 0x24, 0xE6, 0x21, 0xB8, 0x0A, 0x40, + 0xCB, 0x66, 0x11, 0x00, 0xFD, 0x7F, 0x04, 0xB8, 0xDF, 0xC8, 0x01, 0x40, + 0xA0, 0x38, 0x60, 0x09, 0x00, 0x40, 0x92, 0xBD, 0x60, 0x19, 0x01, 0x40, + 0x90, 0x89, 0x06, 0xC9, 0x29, 0xB8, 0x03, 0x40, 0x37, 0x65, 0xD2, 0x38, + 0xFF, 0x7F, 0x42, 0xDE, 0x00, 0xA8, 0x02, 0x40, 0xD2, 0x4C, 0x21, 0x18, + 0xFF, 0x7F, 0x35, 0xDE, 0x03, 0x40, 0xE6, 0x28, 0x0C, 0x40, 0x34, 0x38, + 0xFF, 0x7F, 0x29, 0xDE, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, + 0xD8, 0xE4, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x0A, 0x02, 0x40, 0xD1, 0x4C, + 0x38, 0x0C, 0x02, 0x40, 0xD2, 0x4C, 0x08, 0x0E, 0x38, 0xE4, 0x02, 0x40, + 0xE0, 0x4C, 0x34, 0xB8, 0x0A, 0x40, 0xCC, 0x66, 0x28, 0x04, 0x07, 0x40, + 0x40, 0xE6, 0x48, 0xB8, 0x03, 0x40, 0x40, 0x62, 0x44, 0xB8, 0x01, 0xA0, + 0x01, 0x40, 0x0A, 0x28, 0xA2, 0xC0, 0x9A, 0x21, 0x81, 0xE4, 0x58, 0xE0, + 0x80, 0xB8, 0xDF, 0xC8, 0x90, 0xE4, 0x74, 0x40, 0x72, 0xDF, 0x28, 0xE4, + 0xAA, 0x88, 0x80, 0xB8, 0xDF, 0xC8, 0x90, 0xE4, 0x74, 0x40, 0x6B, 0xDF, + 0x28, 0xE6, 0x02, 0x40, 0xD2, 0x4C, 0x1D, 0x12, 0x33, 0x08, 0x02, 0x40, + 0xDF, 0x4C, 0x3D, 0x18, 0x84, 0x31, 0xAA, 0x28, 0x94, 0x38, 0x06, 0x40, + 0x7A, 0x28, 0x00, 0x40, 0x83, 0xBC, 0x0A, 0xC8, 0x24, 0x01, 0xFF, 0x7F, + 0x13, 0xBC, 0x18, 0xBD, 0x24, 0x11, 0x07, 0x40, 0x0A, 0x28, 0x00, 0x40, + 0x83, 0xBC, 0xFF, 0x7F, 0x1C, 0xBC, 0x18, 0xBD, 0x24, 0x11, 0x01, 0x40, + 0x0A, 0x28, 0x00, 0x40, 0x8F, 0xBC, 0x52, 0xC8, 0xC3, 0x7F, 0xFF, 0x7F, + 0x1F, 0xBC, 0x18, 0xBD, 0x24, 0x11, 0x05, 0x40, 0x5A, 0x28, 0x00, 0x40, + 0x8F, 0xBC, 0x22, 0xC8, 0x34, 0x09, 0x0F, 0x7F, 0x9F, 0xBC, 0x98, 0xBD, + 0x34, 0x19, 0x04, 0x40, 0x2A, 0x28, 0x00, 0x40, 0x8F, 0xBC, 0x32, 0xC8, + 0xFF, 0x70, 0x1F, 0xBC, 0x18, 0xBD, 0x24, 0x11, 0x7A, 0x28, 0x00, 0x40, + 0x8F, 0xBC, 0x62, 0xC8, 0x3F, 0x7C, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x24, 0x11, 0x05, 0x40, 0x4A, 0x28, 0x00, 0x40, 0x87, 0xBC, 0x32, 0xC8, + 0x09, 0xE4, 0xFF, 0x78, 0x0F, 0xBC, 0x08, 0xBD, 0x34, 0x10, 0x04, 0x40, + 0x1A, 0x28, 0x00, 0x40, 0x8F, 0xBC, 0x42, 0xC8, 0xFC, 0x7F, 0xFF, 0x4F, + 0x1F, 0xBC, 0x18, 0xBD, 0x24, 0x11, 0x04, 0x40, 0x3A, 0x28, 0x00, 0x40, + 0x8F, 0xBC, 0x22, 0xC8, 0x0F, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, 0x24, 0x11, + 0x04, 0x40, 0x4A, 0x28, 0x00, 0x40, 0x8F, 0xBC, 0x12, 0xC8, 0xF0, 0x7F, + 0x1F, 0xBC, 0x18, 0xBD, 0xFF, 0x77, 0xFF, 0x7F, 0x1F, 0xBC, 0x24, 0x11, + 0x05, 0x40, 0x1A, 0x29, 0xE0, 0xC9, 0x0A, 0xD5, 0x05, 0x40, 0x2A, 0x28, + 0xE8, 0xC8, 0x01, 0x40, 0x59, 0xDC, 0x05, 0x40, 0x3A, 0x28, 0xE8, 0xC8, + 0x01, 0x40, 0x54, 0xDC, 0x00, 0x40, 0x91, 0xBC, 0x3E, 0xC9, 0x80, 0xE4, + 0xFF, 0x77, 0x8F, 0xBC, 0x89, 0xBD, 0x34, 0x18, 0x05, 0x40, 0x2A, 0x29, + 0x00, 0x40, 0x9F, 0xBC, 0x12, 0xC9, 0xF0, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, + 0x34, 0x18, 0x05, 0x40, 0x3A, 0x29, 0x00, 0x40, 0x9F, 0xBC, 0xFF, 0x7F, + 0x80, 0xBC, 0x89, 0xBD, 0x34, 0x18, 0x05, 0x40, 0x6A, 0x28, 0x00, 0x40, + 0x81, 0xBC, 0x0E, 0xC8, 0x44, 0x09, 0xFF, 0x7F, 0x97, 0xBC, 0x98, 0xBD, + 0x44, 0x19, 0x01, 0x40, 0x0C, 0x28, 0x00, 0x40, 0x81, 0xBC, 0x14, 0x00, + 0xFF, 0x7F, 0x0E, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x01, 0x40, 0x2C, 0x28, + 0x00, 0x40, 0x81, 0xBC, 0x32, 0xC8, 0xFF, 0x7E, 0x0F, 0xBC, 0x08, 0xBD, + 0x14, 0x10, 0x01, 0x40, 0x3C, 0x28, 0x00, 0x40, 0x83, 0xBC, 0x2A, 0xC8, + 0x3F, 0x7F, 0x0F, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x2D, 0x40, 0x1C, 0x28, + 0x00, 0x40, 0x8F, 0xBC, 0x12, 0xC8, 0xF0, 0x7F, 0x0F, 0xBC, 0x08, 0xBD, + 0x14, 0x10, 0x06, 0x40, 0x0A, 0x28, 0x00, 0x40, 0x81, 0xBC, 0x66, 0xC8, + 0x7F, 0x7F, 0xFF, 0x7F, 0x0F, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x2C, 0x40, + 0x0C, 0x28, 0x00, 0x40, 0x81, 0xBC, 0x0A, 0xC8, 0xFF, 0x7F, 0x9B, 0xBC, + 0x98, 0xBD, 0x44, 0x19, 0x00, 0xA2, 0x05, 0x40, 0x0A, 0x88, 0xE0, 0xC8, + 0x01, 0xD4, 0x01, 0xA2, 0x06, 0xC2, 0xFF, 0x7F, 0x9D, 0xBC, 0x92, 0xBD, + 0x44, 0x19, 0x00, 0xA2, 0x2C, 0x40, 0x3C, 0x88, 0xE0, 0xC8, 0x05, 0xD4, + 0x2C, 0x40, 0x4C, 0x88, 0xE0, 0xC8, 0x00, 0x40, 0xED, 0xD4, 0x89, 0xE4, + 0xFF, 0x7F, 0x8E, 0xBC, 0x82, 0xBD, 0x44, 0x18, 0x01, 0x40, 0x4C, 0x29, + 0x6E, 0xC9, 0xFF, 0x41, 0xFF, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, 0x44, 0x18, + 0x01, 0x40, 0x5C, 0x29, 0x01, 0x40, 0x9F, 0xBC, 0x5A, 0xC9, 0x0F, 0x7E, + 0xFF, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, 0x44, 0x18, 0x3C, 0x28, 0x00, 0x40, + 0x81, 0xBC, 0x0E, 0xC8, 0xFF, 0x7F, 0x07, 0xBC, 0x08, 0xBD, 0x14, 0x10, + 0x01, 0x40, 0x1C, 0x28, 0x00, 0x40, 0x81, 0xBC, 0x26, 0xC8, 0xDF, 0x7F, + 0x0F, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x02, 0x40, 0x4C, 0x28, 0x00, 0x40, + 0x81, 0xBC, 0x22, 0xC8, 0xEF, 0x7F, 0x0F, 0xBC, 0x08, 0xBD, 0x14, 0x10, + 0x04, 0x40, 0x7A, 0x29, 0x00, 0x40, 0x91, 0xBC, 0x72, 0xC9, 0x81, 0xE4, + 0xFF, 0x7B, 0xFF, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, 0x24, 0x18, 0x02, 0x40, + 0x5C, 0x28, 0x00, 0x40, 0x81, 0xBC, 0x0A, 0xC8, 0xFF, 0x7F, 0x0B, 0xBC, + 0x08, 0xBD, 0x14, 0x10, 0x02, 0x40, 0x6C, 0x29, 0x00, 0x40, 0x91, 0xBC, + 0x06, 0xC9, 0x80, 0xE4, 0xFF, 0x7F, 0x8D, 0xBC, 0x89, 0xBD, 0x14, 0x18, + 0x00, 0x48, 0x00, 0xA3, 0x00, 0xA6, 0xB6, 0xE4, 0x26, 0xE4, 0x04, 0x40, + 0x41, 0x75, 0x1D, 0x28, 0xE0, 0xC8, 0x24, 0xDB, 0x1D, 0xE4, 0x02, 0x40, + 0xA0, 0x5A, 0x1A, 0xB8, 0xF4, 0xE4, 0x01, 0x40, 0xF8, 0xB8, 0x9D, 0xE4, + 0x02, 0x40, 0x9B, 0x5A, 0x94, 0xB8, 0x09, 0x08, 0xC4, 0xC9, 0x0F, 0x18, + 0xC4, 0xCF, 0x02, 0x40, 0xA2, 0x5A, 0x0D, 0x08, 0x02, 0xE4, 0x81, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x01, 0xD5, 0xB3, 0xBD, 0x01, 0x28, 0xE0, 0xC8, + 0x01, 0xD5, 0x63, 0xBD, 0x05, 0xC3, 0xC1, 0xC2, 0xC1, 0xC1, 0x04, 0x40, + 0x41, 0x75, 0x1D, 0x28, 0x28, 0xBF, 0xE7, 0xD9, 0x01, 0x40, 0xA4, 0x3B, + 0x01, 0x40, 0xB4, 0x36, 0xEE, 0xC2, 0x0B, 0xD8, 0x00, 0xA9, 0x82, 0xE4, + 0x0A, 0xC8, 0x84, 0xB8, 0x01, 0x40, 0x88, 0xB8, 0x08, 0x19, 0xC4, 0xC8, + 0xC1, 0xC2, 0xEE, 0xC2, 0xFB, 0xDB, 0x02, 0x40, 0xAA, 0x5A, 0x0D, 0x08, + 0x05, 0x40, 0xC4, 0x38, 0x02, 0x40, 0xAA, 0x5A, 0x3D, 0x08, 0x05, 0x40, + 0x14, 0x18, 0x02, 0x40, 0xD2, 0x4C, 0x0D, 0x08, 0xE0, 0xC8, 0x66, 0xD5, + 0x05, 0x40, 0x2E, 0x28, 0x01, 0x40, 0x8F, 0xBC, 0x52, 0xC8, 0x14, 0x00, + 0x83, 0x7F, 0xFF, 0x7F, 0x0F, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x05, 0x40, + 0x3E, 0x28, 0x00, 0x40, 0x8F, 0xBC, 0x42, 0xC8, 0xFC, 0x7F, 0xFF, 0x4F, + 0x0F, 0xBC, 0x08, 0xBD, 0x14, 0x10, 0x04, 0x40, 0x5A, 0x88, 0xE0, 0xC8, + 0x3A, 0xD4, 0xFF, 0x7E, 0xFF, 0x7F, 0x0F, 0xBC, 0x14, 0x10, 0x05, 0x40, + 0x34, 0x18, 0x02, 0x40, 0xE0, 0x4C, 0x0D, 0x09, 0x02, 0x40, 0xDB, 0x4C, + 0x3D, 0x08, 0x98, 0xBF, 0x1A, 0xD5, 0x00, 0xA8, 0x0C, 0x40, 0x04, 0x38, + 0x02, 0x40, 0xDF, 0x4C, 0x3D, 0x08, 0xE0, 0xC8, 0x05, 0xD4, 0x02, 0x40, + 0xAC, 0x5A, 0x3D, 0x08, 0xE0, 0xC8, 0x01, 0xD5, 0x01, 0xA8, 0x0C, 0x40, + 0x14, 0x38, 0x0A, 0x40, 0xCF, 0x66, 0x2D, 0x08, 0x0C, 0x40, 0x24, 0x38, + 0x84, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x02, 0x40, + 0xDF, 0x4C, 0x1D, 0x08, 0xE0, 0xC8, 0xE1, 0xD5, 0x01, 0xA8, 0xE0, 0xDE, + 0x00, 0x48, 0x00, 0x40, 0x10, 0xBD, 0x24, 0x11, 0x05, 0x40, 0x1A, 0x29, + 0xFE, 0x7F, 0xA4, 0xDE, 0x01, 0xA2, 0xFF, 0x7F, 0x10, 0xDE, 0x2C, 0x40, + 0x7C, 0x88, 0xE0, 0xC8, 0x17, 0xD4, 0x9A, 0x08, 0x3F, 0x40, 0xF0, 0x7F, + 0x80, 0xBC, 0x22, 0xD4, 0x05, 0x40, 0x34, 0x18, 0xFF, 0x7E, 0xFF, 0x7F, + 0x0F, 0xBC, 0x14, 0x10, 0xFF, 0xA8, 0x0D, 0x40, 0x44, 0x38, 0xB9, 0xDE, + 0x14, 0x00, 0x83, 0x7F, 0xFF, 0x7F, 0x0F, 0xBC, 0x3F, 0x40, 0x00, 0x70, + 0x00, 0xBD, 0xA6, 0xDE, 0x00, 0x41, 0x00, 0x40, 0x00, 0xBD, 0x14, 0x10, + 0x2D, 0x40, 0x3C, 0x29, 0x8D, 0xE4, 0xFB, 0x7F, 0xCC, 0xDF, 0x05, 0x40, + 0x34, 0x18, 0x2D, 0x40, 0x3C, 0x28, 0x0D, 0x40, 0x44, 0x38, 0xA1, 0xDE, + 0x75, 0x42, 0x3A, 0x29, 0x8D, 0xE4, 0xFB, 0x7F, 0xC0, 0xDF, 0x05, 0x40, + 0x34, 0x18, 0x14, 0x08, 0x00, 0x41, 0x00, 0x40, 0x80, 0xBD, 0x14, 0x18, + 0x75, 0x42, 0x3A, 0x28, 0x0D, 0x40, 0x44, 0x38, 0x90, 0xDE, 0x5F, 0xB1, + 0x68, 0xE4, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x08, 0x02, 0x40, 0x9A, 0x5A, + 0x36, 0x04, 0x02, 0x40, 0x9B, 0x5A, 0x86, 0x21, 0x02, 0x40, 0xE1, 0x4C, + 0xF6, 0x80, 0x01, 0xA2, 0x68, 0x28, 0xA2, 0xC2, 0x01, 0xBF, 0x08, 0xDA, + 0x91, 0xE4, 0x90, 0xBA, 0x82, 0xE4, 0x04, 0xC8, 0x34, 0xE4, 0x32, 0xB8, + 0x98, 0xBF, 0x03, 0xDA, 0x01, 0xBF, 0x0D, 0xD8, 0x34, 0xE4, 0x02, 0x40, + 0xDE, 0x4C, 0x36, 0x09, 0x19, 0xE4, 0x02, 0x40, 0x10, 0xBC, 0x14, 0xD5, + 0x00, 0xA3, 0x03, 0xB8, 0x80, 0xE4, 0x5F, 0xB0, 0xA0, 0xE0, 0x90, 0xE4, + 0x91, 0xBA, 0x82, 0xE4, 0x04, 0xC8, 0x34, 0xE4, 0x32, 0xBA, 0x98, 0xBF, + 0xEB, 0xDB, 0x02, 0x40, 0xDE, 0x4C, 0x36, 0x09, 0x19, 0xE4, 0x02, 0x40, + 0x10, 0xBC, 0xEC, 0xD4, 0x03, 0x40, 0x3D, 0x62, 0x06, 0x08, 0xE0, 0xC8, + 0xE8, 0xD5, 0x08, 0x40, 0x90, 0xBC, 0xE5, 0xD5, 0x31, 0xE4, 0x03, 0xB8, + 0x80, 0xE4, 0x5F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, + 0x08, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x1A, 0xD4, 0x80, 0xE4, 0x00, 0x40, + 0x82, 0xBC, 0x1F, 0xD4, 0x80, 0xE4, 0x00, 0x40, 0x84, 0xBC, 0x24, 0xD4, + 0x80, 0xE4, 0x00, 0x40, 0x88, 0xBC, 0x29, 0xD4, 0x80, 0xE4, 0x01, 0x40, + 0x80, 0xBC, 0x2E, 0xD4, 0x80, 0xE4, 0x02, 0x40, 0x80, 0xBC, 0x33, 0xD4, + 0x04, 0x40, 0x00, 0xBC, 0x38, 0xD4, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, + 0x00, 0x40, 0xD7, 0x62, 0x06, 0xA8, 0xD6, 0x7F, 0x16, 0xDF, 0x80, 0xE4, + 0x00, 0x40, 0x82, 0xBC, 0xE1, 0xD5, 0x00, 0x40, 0xD8, 0x62, 0x0A, 0xA8, + 0xD6, 0x7F, 0x0D, 0xDF, 0x80, 0xE4, 0x00, 0x40, 0x84, 0xBC, 0xDC, 0xD5, + 0x00, 0x40, 0xD9, 0x62, 0x0D, 0xA8, 0xD6, 0x7F, 0x04, 0xDF, 0x80, 0xE4, + 0x00, 0x40, 0x88, 0xBC, 0xD7, 0xD5, 0x00, 0x40, 0xDB, 0x62, 0x04, 0xA8, + 0xD5, 0x7F, 0xFB, 0xDF, 0x80, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0xD2, 0xD5, + 0x00, 0x40, 0xDC, 0x62, 0x09, 0xA8, 0xD5, 0x7F, 0xF2, 0xDF, 0x80, 0xE4, + 0x02, 0x40, 0x80, 0xBC, 0xCD, 0xD5, 0x00, 0x40, 0xDE, 0x62, 0x02, 0xA8, + 0xD5, 0x7F, 0xE9, 0xDF, 0x04, 0x40, 0x00, 0xBC, 0xC8, 0xD5, 0x00, 0x40, + 0xE0, 0x62, 0x03, 0xA8, 0xD5, 0x7F, 0xE1, 0xDF, 0x03, 0xB6, 0x01, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0x38, 0xE4, + 0x02, 0x40, 0xDB, 0x4C, 0x18, 0x08, 0xE1, 0xC8, 0x5D, 0xD5, 0x03, 0x40, + 0x3D, 0x62, 0x03, 0x08, 0xE0, 0xC8, 0x4D, 0xD5, 0x02, 0x40, 0xDE, 0x4C, + 0x33, 0x08, 0x08, 0x40, 0x80, 0xBC, 0x47, 0xD5, 0x63, 0xE4, 0x02, 0x40, + 0xC7, 0x4C, 0x6C, 0xB8, 0x43, 0xE4, 0x02, 0x40, 0x94, 0x5A, 0x48, 0xB8, + 0x0A, 0x40, 0xCC, 0x66, 0x23, 0x02, 0x11, 0x40, 0x24, 0xE6, 0x23, 0xB8, + 0x03, 0x40, 0xA1, 0x68, 0x24, 0xB8, 0x00, 0xA1, 0x13, 0x40, 0x36, 0x28, + 0xE0, 0xC8, 0x13, 0xDB, 0x22, 0x00, 0x01, 0xAA, 0x93, 0xE4, 0x02, 0x40, + 0xCF, 0x4C, 0x98, 0xB8, 0x09, 0x28, 0xC1, 0xC9, 0xBA, 0xE4, 0xA2, 0xCB, + 0x8B, 0xE4, 0x80, 0xBD, 0x08, 0xE4, 0x22, 0x18, 0xC1, 0xC1, 0x13, 0x40, + 0x36, 0x28, 0x18, 0xBF, 0xF3, 0xD9, 0x00, 0xA1, 0x0C, 0x40, 0x04, 0x28, + 0xE0, 0xC8, 0x12, 0xDB, 0x12, 0x00, 0x01, 0xA6, 0x94, 0xE4, 0x04, 0x40, + 0x90, 0xB8, 0x09, 0x28, 0xC1, 0xC9, 0xA6, 0xE4, 0xA2, 0xCA, 0x8A, 0xE4, + 0x80, 0xBD, 0x08, 0xE4, 0x12, 0x18, 0xC1, 0xC1, 0x0C, 0x40, 0x04, 0x2B, + 0x1B, 0xBF, 0xF3, 0xD9, 0x83, 0xE4, 0x1B, 0x40, 0xC6, 0xDF, 0x03, 0xB6, + 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x0A, 0x40, 0xCD, 0x66, 0xC3, 0x28, + 0xE1, 0xC8, 0xB4, 0xD5, 0x02, 0x40, 0xDE, 0x4C, 0x33, 0x08, 0x06, 0x40, + 0x80, 0xBC, 0x0A, 0xD5, 0x83, 0xE4, 0x1B, 0x40, 0xC4, 0xDF, 0x83, 0xE4, + 0x08, 0x40, 0x0A, 0xDF, 0x03, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, + 0x83, 0xE4, 0x06, 0x40, 0x64, 0xDF, 0x83, 0xE4, 0x07, 0x40, 0xA1, 0xDF, + 0x83, 0xE4, 0x08, 0x40, 0x3D, 0xDF, 0x03, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, + 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, 0xFA, 0xB6, 0x39, 0xE4, 0x09, 0x01, + 0x31, 0x02, 0x00, 0xA8, 0x01, 0x40, 0xB8, 0xEA, 0x01, 0x09, 0x21, 0x08, + 0x00, 0xA0, 0x98, 0xBF, 0x1E, 0xD5, 0x99, 0xB8, 0x20, 0xD7, 0x02, 0xA8, + 0x13, 0x18, 0x11, 0x08, 0x83, 0x98, 0x16, 0x40, 0xD8, 0xE1, 0x84, 0x98, + 0x81, 0xE4, 0x01, 0x09, 0x66, 0xDF, 0x08, 0xE4, 0x23, 0x18, 0xE0, 0xC8, + 0x23, 0xD5, 0x01, 0x40, 0xE8, 0x28, 0xE0, 0xC8, 0x02, 0xDB, 0x03, 0xA8, + 0x13, 0x18, 0x11, 0x09, 0xC1, 0xC9, 0x01, 0x40, 0xB8, 0xE8, 0x88, 0xB8, + 0x20, 0xD7, 0x11, 0x19, 0x01, 0xA0, 0x80, 0xE4, 0x06, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x01, 0xA8, 0x13, 0x18, 0x23, 0x12, 0x01, 0x10, 0x11, 0x10, + 0x92, 0x80, 0x01, 0x40, 0x22, 0x29, 0x11, 0xC9, 0x00, 0x40, 0x9F, 0xBC, + 0xA6, 0xC8, 0x80, 0xB8, 0xDF, 0xC8, 0xA4, 0xC8, 0x21, 0x18, 0xEA, 0xDE, + 0x00, 0x40, 0xE1, 0x62, 0x09, 0xA8, 0xD5, 0x7F, 0x1A, 0xDF, 0x80, 0xE4, + 0x06, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x01, 0x08, 0xC1, 0xC8, 0x01, 0x18, + 0x00, 0xA8, 0x11, 0x18, 0xDB, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFC, 0xB6, + 0x18, 0xE4, 0x03, 0x40, 0x3E, 0x62, 0x1C, 0xB8, 0xFF, 0xA9, 0x01, 0x19, + 0x00, 0xA9, 0x21, 0x19, 0x0A, 0x40, 0xCC, 0x66, 0x38, 0x02, 0x02, 0xE4, + 0x07, 0x40, 0x00, 0xE6, 0x08, 0xB8, 0x03, 0x40, 0x40, 0x62, 0x04, 0xB8, + 0x31, 0x10, 0x02, 0xE4, 0x00, 0x40, 0x03, 0x75, 0x04, 0xE6, 0x08, 0xB8, + 0x03, 0x40, 0xC4, 0x68, 0x00, 0xB8, 0x41, 0x10, 0x29, 0x43, 0x24, 0xE6, + 0x28, 0xB8, 0x03, 0x40, 0x4E, 0x62, 0x2C, 0xB8, 0x51, 0x12, 0x83, 0x91, + 0x89, 0xE4, 0xFC, 0x49, 0x02, 0xA9, 0xBB, 0x7F, 0x89, 0xDF, 0x01, 0xA8, + 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x1F, 0xB1, 0xFD, 0xB6, + 0x29, 0xE4, 0x0C, 0x99, 0x0D, 0x94, 0x48, 0x03, 0x58, 0x08, 0x18, 0xE4, + 0x40, 0x40, 0x10, 0xB8, 0x08, 0xE4, 0xA8, 0x42, 0x0E, 0xB8, 0xE0, 0xC9, + 0x14, 0xD4, 0x92, 0xE4, 0x06, 0xC9, 0x89, 0xB8, 0x88, 0x28, 0x90, 0xB8, + 0x89, 0x38, 0xE0, 0xC8, 0x18, 0xD9, 0x08, 0xE4, 0x02, 0x40, 0x0C, 0xE6, + 0x03, 0xB8, 0x06, 0xC8, 0x81, 0xB8, 0x88, 0x28, 0x84, 0x38, 0x80, 0xE4, + 0x03, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x92, 0xE4, 0x06, 0xC9, 0x89, 0xE4, + 0x80, 0xB8, 0x88, 0x28, 0x06, 0xC8, 0x81, 0xB8, 0x88, 0x28, 0x90, 0xB8, + 0x89, 0x38, 0xE0, 0xC8, 0xE8, 0xDA, 0x00, 0xA0, 0x00, 0x40, 0xE2, 0x62, + 0x0C, 0xA8, 0xD4, 0x7F, 0xAA, 0xDF, 0x80, 0xE4, 0x03, 0xB6, 0x1F, 0xB0, + 0x40, 0xB4, 0x1C, 0xB3, 0x5F, 0xB1, 0x68, 0xE4, 0x02, 0x40, 0xAA, 0x5A, + 0x38, 0x02, 0xE0, 0xC2, 0x03, 0xD4, 0xFF, 0x5F, 0xFF, 0x7F, 0x0F, 0xA2, + 0x00, 0x60, 0x00, 0x40, 0x00, 0xA4, 0xFF, 0x5F, 0xFF, 0x7F, 0x0F, 0xAB, + 0xFF, 0xAA, 0xCA, 0xE4, 0x00, 0xA1, 0x04, 0x40, 0xA2, 0x59, 0x76, 0x29, + 0xE0, 0xC9, 0x1F, 0xDB, 0x39, 0xE4, 0x06, 0xE4, 0x02, 0x40, 0xCF, 0x4C, + 0x08, 0xB8, 0x86, 0xE4, 0x02, 0x40, 0xC7, 0x4C, 0x8C, 0xB8, 0x08, 0xDE, + 0x94, 0xBF, 0x02, 0xDB, 0x49, 0xE4, 0x00, 0x2A, 0xC1, 0xC1, 0xC1, 0xC0, + 0x31, 0xBF, 0x0D, 0xDB, 0x08, 0x09, 0xC4, 0xC8, 0x92, 0xBF, 0xF4, 0xD9, + 0xF7, 0xDB, 0x9B, 0xBF, 0xF5, 0xDA, 0xB9, 0xE4, 0x00, 0x2C, 0xC1, 0xC1, + 0xC1, 0xC0, 0x31, 0xBF, 0xF3, 0xD8, 0x00, 0xA1, 0x04, 0x40, 0x35, 0x75, + 0x06, 0x29, 0xE0, 0xC9, 0x1F, 0xDB, 0x39, 0xE4, 0x06, 0xE4, 0x02, 0x40, + 0x98, 0x5A, 0x08, 0xB8, 0x86, 0xE4, 0x02, 0x40, 0x94, 0x5A, 0x88, 0xB8, + 0x08, 0xDE, 0x94, 0xBF, 0x02, 0xDB, 0x49, 0xE4, 0x00, 0x2A, 0xC1, 0xC1, + 0xC1, 0xC0, 0x31, 0xBF, 0x0D, 0xDB, 0x08, 0x09, 0xC4, 0xC8, 0x92, 0xBF, + 0xF4, 0xD9, 0xF7, 0xDB, 0x9B, 0xBF, 0xF5, 0xDA, 0xB9, 0xE4, 0x00, 0x2C, + 0xC1, 0xC1, 0xC1, 0xC0, 0x31, 0xBF, 0xF3, 0xD8, 0x0A, 0xE4, 0x00, 0xE0, + 0xE0, 0xC0, 0x0D, 0xD9, 0x9C, 0xE4, 0x09, 0xE0, 0xE0, 0xC9, 0x10, 0xD9, + 0x02, 0x40, 0xAA, 0x5A, 0x16, 0x10, 0x02, 0x40, 0xAA, 0x5A, 0x26, 0x19, + 0x5F, 0xB0, 0x1C, 0xB2, 0xA0, 0xE0, 0xAC, 0xE4, 0x0C, 0xE4, 0x00, 0xE0, + 0x9C, 0xE4, 0x09, 0xE0, 0xE0, 0xC9, 0xF0, 0xDA, 0x9A, 0xE4, 0x09, 0xE0, + 0x02, 0x40, 0xAA, 0x5A, 0x16, 0x10, 0x02, 0x40, 0xAA, 0x5A, 0x26, 0x19, + 0x5F, 0xB0, 0x1C, 0xB2, 0xA0, 0xE0, 0x1C, 0xB3, 0x5F, 0xB1, 0x38, 0xE4, + 0xA9, 0xE4, 0x0C, 0x92, 0x0D, 0x96, 0x0E, 0x94, 0x00, 0xA1, 0x02, 0x28, + 0x03, 0x29, 0x89, 0xBF, 0x03, 0xD5, 0x14, 0xE4, 0x00, 0x40, 0x11, 0xBC, + 0x06, 0x40, 0x12, 0x2B, 0x06, 0x40, 0x13, 0x2C, 0xBC, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x00, 0x40, 0x82, 0xBC, 0xFF, 0x7F, 0x1D, 0xBC, 0x18, 0xBD, + 0x08, 0x40, 0x02, 0x28, 0x08, 0x40, 0x03, 0x29, 0x89, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x00, 0x40, 0x84, 0xBC, 0xFF, 0x7F, 0x1B, 0xBC, 0x18, 0xBD, + 0x06, 0x40, 0x22, 0x2B, 0x06, 0x40, 0x23, 0x2C, 0xBC, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x00, 0x40, 0x88, 0xBC, 0xFF, 0x7F, 0x17, 0xBC, 0x18, 0xBD, + 0x06, 0x40, 0x52, 0x28, 0x06, 0x40, 0x53, 0x29, 0x89, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0xFE, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x06, 0x40, 0x32, 0x2B, 0x06, 0x40, 0x33, 0x2C, 0xBC, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x02, 0x40, 0x80, 0xBC, 0xFD, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x06, 0x40, 0x62, 0x28, 0x06, 0x40, 0x63, 0x29, 0x89, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x04, 0x40, 0x80, 0xBC, 0xFB, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x07, 0x40, 0x42, 0x2B, 0x07, 0x40, 0x43, 0x2C, 0xBC, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x08, 0x40, 0x80, 0xBC, 0xF7, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x07, 0x40, 0x52, 0x28, 0x07, 0x40, 0x53, 0x29, 0x89, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x10, 0x40, 0x80, 0xBC, 0xEF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x07, 0x40, 0x62, 0x2B, 0x07, 0x40, 0x63, 0x2C, 0xBC, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x20, 0x40, 0x80, 0xBC, 0xDF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x07, 0x40, 0x72, 0x28, 0x07, 0x40, 0x73, 0x29, 0x89, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x40, 0x40, 0x80, 0xBC, 0xBF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x06, 0x40, 0x42, 0x2B, 0x06, 0x40, 0x43, 0x2C, 0xBC, 0xBF, 0x06, 0xD5, + 0x84, 0xE4, 0x00, 0x41, 0x80, 0xBC, 0xFF, 0x7E, 0x1F, 0xBC, 0x18, 0xBD, + 0x12, 0x28, 0x13, 0x29, 0x89, 0xBF, 0x06, 0xD5, 0x84, 0xE4, 0x00, 0x44, + 0x80, 0xBC, 0xFF, 0x7B, 0x1F, 0xBC, 0x18, 0xBD, 0x07, 0x40, 0x12, 0x2B, + 0x07, 0x40, 0x13, 0x2C, 0xBC, 0xBF, 0x06, 0xD5, 0x84, 0xE4, 0x00, 0x48, + 0x80, 0xBC, 0xFF, 0x77, 0x1F, 0xBC, 0x18, 0xBD, 0x92, 0x28, 0x93, 0x29, + 0x89, 0xBF, 0x00, 0x40, 0xDB, 0xD5, 0x00, 0x50, 0x10, 0xBD, 0x3A, 0x41, + 0x92, 0x28, 0x3A, 0x41, 0x93, 0x29, 0x89, 0xBF, 0x00, 0x40, 0xE2, 0xD5, + 0x84, 0xE4, 0x00, 0x40, 0x00, 0x60, 0x80, 0xBC, 0xFF, 0x7F, 0xFF, 0x5F, + 0x1F, 0xBC, 0x18, 0xBD, 0x06, 0x40, 0x72, 0x28, 0x06, 0x40, 0x73, 0x29, + 0x89, 0xBF, 0x00, 0x40, 0xCA, 0xD5, 0x01, 0x40, 0x00, 0x40, 0x10, 0xBD, + 0x92, 0xE4, 0x83, 0xE4, 0x06, 0xA0, 0x02, 0x40, 0x19, 0x2B, 0x02, 0x40, + 0x18, 0x2C, 0xBC, 0xBF, 0x00, 0x40, 0xA6, 0xD5, 0x02, 0x40, 0x00, 0x40, + 0x10, 0xBD, 0xDF, 0xC0, 0xC1, 0xC8, 0xC1, 0xC9, 0xE0, 0xC0, 0xF1, 0xDA, + 0xA3, 0x09, 0x00, 0x70, 0x90, 0xBC, 0xA2, 0x08, 0x00, 0x70, 0x80, 0xBC, + 0x98, 0xBF, 0x08, 0xD5, 0x84, 0xE4, 0x04, 0x40, 0x00, 0x40, 0x80, 0xBC, + 0xFB, 0x7F, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, 0x75, 0x42, 0x23, 0x88, + 0xE0, 0xC8, 0x00, 0x40, 0x85, 0xD5, 0x75, 0x42, 0x22, 0x88, 0xE0, 0xC8, + 0x00, 0x40, 0x80, 0xD5, 0x2A, 0x09, 0x26, 0x08, 0x98, 0xBF, 0x08, 0xD5, + 0x84, 0xE4, 0x08, 0x40, 0x00, 0x40, 0x80, 0xBC, 0xF7, 0x7F, 0xFF, 0x7F, + 0x1F, 0xBC, 0x18, 0xBD, 0x0A, 0x09, 0x00, 0x70, 0x90, 0xBC, 0x06, 0x08, + 0x00, 0x70, 0x80, 0xBC, 0x98, 0xBF, 0x08, 0xD5, 0x84, 0xE4, 0x10, 0x40, + 0x00, 0x40, 0x80, 0xBC, 0xEF, 0x7F, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x1A, 0x09, 0x0F, 0x70, 0x9F, 0xBC, 0x16, 0x08, 0x0F, 0x70, 0x8F, 0xBC, + 0x98, 0xBF, 0x00, 0x40, 0x98, 0xD5, 0x84, 0xE4, 0x20, 0x40, 0x00, 0x40, + 0x80, 0xBC, 0xDF, 0x7F, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, 0x01, 0x40, + 0x76, 0x28, 0x01, 0x40, 0x7A, 0x29, 0x89, 0xBF, 0x00, 0x40, 0x80, 0xD5, + 0x84, 0xE4, 0x40, 0x40, 0x00, 0x40, 0x80, 0xBC, 0xBF, 0x7F, 0xFF, 0x7F, + 0x1F, 0xBC, 0x18, 0xBD, 0x02, 0x40, 0x26, 0x28, 0x02, 0x40, 0x2A, 0x29, + 0x89, 0xBF, 0x08, 0xD5, 0x84, 0xE4, 0x80, 0x40, 0x00, 0x40, 0x80, 0xBC, + 0x7F, 0x7F, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, 0x02, 0x40, 0x36, 0x2B, + 0x02, 0x40, 0x3A, 0x2C, 0xBC, 0xBF, 0x08, 0xD5, 0x84, 0xE4, 0x00, 0x41, + 0x00, 0x40, 0x80, 0xBC, 0xFF, 0x7E, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, + 0x02, 0x40, 0x46, 0x28, 0x02, 0x40, 0x4A, 0x29, 0x89, 0xBF, 0x08, 0xD5, + 0x84, 0xE4, 0x00, 0x42, 0x00, 0x40, 0x80, 0xBC, 0xFF, 0x7D, 0xFF, 0x7F, + 0x1F, 0xBC, 0x18, 0xBD, 0xBA, 0x09, 0xB6, 0x08, 0x98, 0xBF, 0x00, 0x40, + 0x74, 0xD5, 0x84, 0xE4, 0x00, 0x44, 0x00, 0x40, 0x80, 0xBC, 0xFF, 0x7B, + 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, 0x02, 0x40, 0x66, 0x2B, 0x02, 0x40, + 0x6A, 0x2C, 0xBC, 0xBF, 0x51, 0xD5, 0x00, 0x48, 0x00, 0x40, 0x40, 0xBC, + 0xFF, 0x77, 0xFF, 0x7F, 0x1F, 0xBC, 0x14, 0xBD, 0x81, 0xE4, 0x5F, 0xB0, + 0x1C, 0xB2, 0xA0, 0xE0, 0x01, 0x40, 0x19, 0x2B, 0x01, 0x40, 0x18, 0x2C, + 0xBC, 0xBF, 0xFF, 0x7F, 0x53, 0xD4, 0x03, 0x40, 0x19, 0x2B, 0x03, 0x40, + 0x18, 0x2C, 0xBC, 0xBF, 0xFF, 0x7F, 0x4C, 0xD4, 0xFF, 0x7F, 0x4D, 0xDE, + 0xA2, 0x2B, 0xA3, 0x2C, 0xBC, 0xBF, 0xFF, 0x7F, 0x20, 0xD4, 0xFF, 0x7F, + 0x20, 0xDE, 0x07, 0x40, 0x02, 0x2B, 0x07, 0x40, 0x03, 0x2C, 0xBC, 0xBF, + 0xFF, 0x7F, 0x2F, 0xD4, 0xFF, 0x7F, 0x30, 0xDE, 0x3A, 0x41, 0x13, 0x09, + 0x3A, 0x41, 0x12, 0x08, 0x98, 0xBF, 0xFF, 0x7F, 0x17, 0xD4, 0x3A, 0x41, + 0xC2, 0x2B, 0x3A, 0x41, 0xC3, 0x2C, 0xBC, 0xBF, 0xFF, 0x7F, 0x10, 0xD4, + 0xFF, 0x7F, 0x16, 0xDE, 0x01, 0x40, 0x86, 0x2B, 0x01, 0x40, 0x8A, 0x2C, + 0xBC, 0xBF, 0xFF, 0x7F, 0x79, 0xD4, 0xFF, 0x7F, 0x7F, 0xDE, 0x3A, 0x09, + 0x3F, 0x40, 0xFF, 0x7F, 0x9F, 0xBC, 0x36, 0x08, 0x3F, 0x40, 0xFF, 0x7F, + 0x8F, 0xBC, 0x98, 0xBF, 0xFF, 0x7F, 0x5D, 0xD4, 0xFF, 0x7F, 0x63, 0xDE, + 0x6A, 0x09, 0x66, 0x08, 0x98, 0xBF, 0xAB, 0xD4, 0x7A, 0x09, 0x76, 0x08, + 0x98, 0xBF, 0xA7, 0xD4, 0x02, 0x40, 0x76, 0x28, 0x02, 0x40, 0x7A, 0x29, + 0x89, 0xBF, 0xA1, 0xD4, 0x02, 0x40, 0xC6, 0x26, 0x02, 0x40, 0xCA, 0x2A, + 0x6A, 0xBF, 0x9B, 0xD4, 0xA1, 0xDE, 0xCA, 0x09, 0xC6, 0x08, 0x98, 0xBF, + 0x88, 0xD4, 0x8F, 0xDE, 0x01, 0xA8, 0xA0, 0xE0, 0x20, 0xB5, 0x1C, 0xB3, + 0x5F, 0xB1, 0xFB, 0xB6, 0x68, 0xE4, 0x49, 0xE4, 0x12, 0x9C, 0x09, 0xE4, + 0x02, 0x40, 0x9C, 0x70, 0x00, 0xB8, 0x80, 0xE4, 0x02, 0x40, 0x16, 0xDF, + 0x18, 0xE4, 0xE0, 0xC8, 0x00, 0x40, 0x72, 0xD5, 0x10, 0x40, 0xDA, 0xE1, + 0x83, 0x98, 0x8A, 0xE4, 0x94, 0xE4, 0xE2, 0x7F, 0x92, 0xDF, 0xFF, 0xAB, + 0x0A, 0x40, 0xE1, 0x66, 0x34, 0x1B, 0x11, 0x83, 0x0A, 0x22, 0x92, 0xE4, + 0x49, 0xE0, 0x21, 0xD5, 0x93, 0xE4, 0x90, 0xB8, 0x00, 0x40, 0x43, 0x6C, + 0x09, 0x28, 0x88, 0xB8, 0x4D, 0xD7, 0x00, 0x40, 0x49, 0x6C, 0x69, 0x28, + 0x02, 0x40, 0x80, 0xBD, 0x00, 0x40, 0x49, 0x6C, 0x69, 0x38, 0x01, 0x40, + 0x3D, 0x63, 0x30, 0x22, 0x02, 0xB8, 0x01, 0xA8, 0x00, 0x40, 0x45, 0x6C, + 0x20, 0x38, 0x0A, 0x28, 0x06, 0x38, 0x02, 0x40, 0x18, 0xE8, 0x16, 0x38, + 0x86, 0xE4, 0x05, 0xB6, 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0x01, 0x40, + 0x3D, 0x63, 0x30, 0x28, 0x80, 0xB8, 0x00, 0x40, 0x45, 0x6C, 0x28, 0x39, + 0x83, 0xE4, 0x80, 0xB8, 0x00, 0x40, 0x47, 0x6C, 0x48, 0x39, 0x00, 0x40, + 0x49, 0x6C, 0x68, 0x29, 0x02, 0x40, 0x12, 0xE8, 0x92, 0xBD, 0x00, 0x40, + 0x49, 0x6C, 0x68, 0x39, 0x80, 0xE4, 0x93, 0xE4, 0x02, 0x40, 0x1C, 0xDF, + 0x28, 0xE4, 0xE0, 0xC8, 0x07, 0xD5, 0x75, 0x42, 0x38, 0x29, 0x84, 0xE4, + 0xF7, 0x7F, 0x3C, 0xDF, 0x75, 0x42, 0x32, 0x3B, 0x23, 0xE4, 0x02, 0xE0, + 0x04, 0x40, 0x5A, 0x75, 0x44, 0x28, 0x83, 0x98, 0x80, 0xE4, 0x92, 0xE4, + 0x02, 0x40, 0x39, 0xDF, 0x75, 0x42, 0x21, 0x88, 0xE0, 0xC8, 0x06, 0xD4, + 0x0C, 0x13, 0xC3, 0xDE, 0x00, 0x40, 0x47, 0x6C, 0x49, 0x32, 0xB7, 0xDE, + 0x04, 0x40, 0x5A, 0x75, 0x44, 0x24, 0x83, 0x94, 0x80, 0xE4, 0x92, 0xE4, + 0x02, 0x40, 0x87, 0xDF, 0x0C, 0x13, 0xB5, 0xDE, 0x00, 0x40, 0xE4, 0x62, + 0x07, 0xA8, 0xD1, 0x7F, 0xC2, 0xDF, 0xFF, 0xA8, 0x02, 0x40, 0x08, 0xEA, + 0x06, 0x38, 0x02, 0x40, 0x18, 0xE8, 0x16, 0x38, 0x86, 0xE4, 0x05, 0xB6, + 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0x20, 0xB5, 0x5F, 0xB1, 0xFA, 0xB6, + 0x38, 0xE4, 0x69, 0xE4, 0x18, 0xE4, 0x02, 0x40, 0x9C, 0x70, 0x10, 0xB8, + 0x91, 0xB8, 0x00, 0x40, 0x49, 0x6C, 0x69, 0x80, 0xE0, 0xC0, 0x07, 0xD5, + 0x0A, 0x40, 0xCE, 0x66, 0x28, 0x08, 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, + 0x23, 0x18, 0x00, 0x40, 0x47, 0x6C, 0x49, 0x80, 0xE0, 0xC0, 0x00, 0x40, + 0x85, 0xD4, 0x00, 0x40, 0x43, 0x6C, 0x09, 0x28, 0x81, 0xB8, 0x00, 0x40, + 0x45, 0x6C, 0x28, 0x28, 0x20, 0x40, 0x01, 0xA9, 0xE0, 0xC8, 0x65, 0xD4, + 0x02, 0x40, 0xAD, 0x5A, 0x13, 0x09, 0xE0, 0xC9, 0x2E, 0xD9, 0x01, 0x40, + 0x3D, 0x63, 0x01, 0x28, 0xE0, 0xC8, 0x5F, 0xD5, 0x01, 0x40, 0x3D, 0x63, + 0x61, 0x24, 0x3A, 0x41, 0x4C, 0xE6, 0x41, 0xB8, 0x01, 0x40, 0x3D, 0x63, + 0x21, 0x28, 0xE0, 0xC8, 0x5D, 0xD5, 0x01, 0x40, 0x3D, 0x63, 0x71, 0x22, + 0x2F, 0x41, 0x20, 0xE6, 0x21, 0xB8, 0x4E, 0x5C, 0x24, 0xB8, 0x81, 0xE4, + 0x96, 0xE4, 0x01, 0x40, 0x9B, 0xDF, 0x08, 0xE4, 0x81, 0xE4, 0x96, 0xE4, + 0x01, 0x40, 0xB6, 0xDF, 0x98, 0xE4, 0x83, 0x94, 0x84, 0x92, 0x02, 0x40, + 0xD3, 0x4C, 0x03, 0x08, 0x85, 0x98, 0x80, 0xE4, 0xFD, 0x7F, 0x39, 0xDF, + 0x02, 0x40, 0xD3, 0x4C, 0x13, 0x18, 0x01, 0x40, 0x3D, 0x63, 0x01, 0x28, + 0xE0, 0xC8, 0x08, 0xD5, 0x01, 0x40, 0x3D, 0x63, 0x61, 0x29, 0x91, 0xB8, + 0x01, 0xA8, 0x00, 0x40, 0x45, 0x6C, 0x29, 0x38, 0x01, 0x40, 0x3D, 0x63, + 0x21, 0x28, 0xE0, 0xC8, 0x08, 0xD5, 0x01, 0x40, 0x3D, 0x63, 0x71, 0x29, + 0x91, 0xB8, 0x01, 0xA8, 0x01, 0x40, 0x3A, 0x63, 0x69, 0x38, 0x02, 0x40, + 0xAD, 0x5A, 0x13, 0x16, 0x81, 0xE4, 0x96, 0xE4, 0x01, 0x40, 0x68, 0xDF, + 0x02, 0x40, 0xD1, 0x4C, 0x23, 0x18, 0x81, 0xE4, 0x96, 0xE4, 0x01, 0x40, + 0x81, 0xDF, 0x02, 0x40, 0xD2, 0x4C, 0x03, 0x18, 0x02, 0x40, 0xD3, 0x4C, + 0x13, 0x08, 0x02, 0xA9, 0xE0, 0xC8, 0x01, 0xD4, 0x98, 0xE4, 0x89, 0xE4, + 0x06, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0x01, 0x40, 0x50, 0xDF, + 0x48, 0xE4, 0x01, 0x40, 0x3D, 0x63, 0x21, 0x28, 0xE0, 0xC8, 0xA3, 0xD4, + 0x81, 0xE4, 0x02, 0x40, 0xAD, 0x5A, 0x13, 0x09, 0x01, 0x40, 0x64, 0xDF, + 0x28, 0xE4, 0xA3, 0xDE, 0x0A, 0x40, 0xCE, 0x66, 0x13, 0x08, 0x80, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x13, 0x18, 0x00, 0x41, 0x01, 0xA9, 0xE1, 0xDE, + 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, 0xFB, 0xB6, 0x68, 0xE4, 0x49, 0xE4, + 0x19, 0xE4, 0x02, 0x40, 0x9C, 0x70, 0x10, 0xB8, 0x81, 0xE4, 0x00, 0x40, + 0xF1, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, 0x63, 0xD5, 0x10, 0x40, 0xDA, 0xE1, + 0x83, 0x98, 0x8A, 0xE4, 0x94, 0xE4, 0xE5, 0x7F, 0x7A, 0xDF, 0x10, 0x23, + 0x0A, 0x22, 0x92, 0xE4, 0x49, 0xE0, 0x21, 0xD5, 0x93, 0xE4, 0x91, 0xB8, + 0x00, 0x40, 0x7C, 0x78, 0x09, 0x28, 0x88, 0xB8, 0x48, 0xD7, 0x00, 0x40, + 0x94, 0x78, 0x39, 0x28, 0x00, 0x40, 0x88, 0xBD, 0x00, 0x40, 0x94, 0x78, + 0x39, 0x38, 0x01, 0x40, 0x3D, 0x63, 0x41, 0x28, 0x18, 0xB8, 0x01, 0xA8, + 0x00, 0x40, 0x84, 0x78, 0x11, 0x38, 0x0A, 0x28, 0x06, 0x38, 0x02, 0x40, + 0x18, 0xE8, 0x16, 0x38, 0x86, 0xE4, 0x05, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, + 0x40, 0xB4, 0x01, 0x40, 0x3D, 0x63, 0x41, 0x28, 0x81, 0xB8, 0x00, 0x40, + 0x84, 0x78, 0x18, 0x39, 0x23, 0xE4, 0x21, 0xB8, 0x00, 0x40, 0x8C, 0x78, + 0x22, 0x39, 0x10, 0x29, 0x81, 0xE4, 0x00, 0x40, 0xFA, 0xDF, 0x08, 0xE4, + 0xE0, 0xC8, 0x08, 0xD5, 0x2D, 0x40, 0x38, 0x29, 0x84, 0xE4, 0xF6, 0x7F, + 0x0B, 0xDF, 0xFF, 0xA8, 0x2D, 0x40, 0x30, 0x38, 0x00, 0x40, 0x94, 0x78, + 0x32, 0x28, 0x02, 0x40, 0x19, 0xE8, 0x89, 0xBD, 0x00, 0x40, 0x94, 0x78, + 0x32, 0x38, 0x93, 0xE4, 0x09, 0xE0, 0x04, 0x40, 0x5B, 0x75, 0x04, 0x24, + 0x83, 0x94, 0x81, 0xE4, 0x01, 0x40, 0x3B, 0xDF, 0xC8, 0xDE, 0x00, 0x40, + 0x8C, 0x78, 0x29, 0x28, 0x82, 0xBD, 0x00, 0x40, 0x8C, 0x78, 0x29, 0x38, + 0xB8, 0xDE, 0x00, 0x40, 0xE5, 0x62, 0x07, 0xA8, 0xD0, 0x7F, 0x93, 0xDF, + 0xFF, 0xA8, 0x02, 0x40, 0x08, 0xEA, 0x06, 0x38, 0x02, 0x40, 0x18, 0xE8, + 0x16, 0x38, 0x86, 0xE4, 0x05, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, + 0x20, 0xB5, 0x1F, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, 0x39, 0xE4, 0x00, 0xA4, + 0x18, 0xE4, 0x02, 0x40, 0x9C, 0x70, 0x10, 0xB8, 0x09, 0xE4, 0x01, 0xB8, + 0x00, 0x40, 0x94, 0x78, 0x30, 0x89, 0xE0, 0xC9, 0x08, 0xD5, 0x1A, 0xC9, + 0x0A, 0x40, 0xCE, 0x66, 0x28, 0x08, 0x89, 0xBD, 0x0A, 0x40, 0xCE, 0x66, + 0x22, 0x18, 0x00, 0x40, 0x8C, 0x78, 0x20, 0x89, 0xE0, 0xC9, 0x37, 0xD4, + 0x00, 0x40, 0x7C, 0x78, 0x00, 0x28, 0x81, 0xB8, 0x00, 0x40, 0x84, 0x78, + 0x18, 0x20, 0x10, 0x40, 0x01, 0xA9, 0xE0, 0xC0, 0x22, 0xD4, 0x81, 0xE4, + 0x93, 0xE4, 0x00, 0x40, 0x96, 0xDF, 0x02, 0x40, 0xD1, 0x4C, 0x32, 0x18, + 0x02, 0x40, 0xAD, 0x5A, 0x22, 0x13, 0x08, 0x29, 0x02, 0x40, 0xAD, 0x5A, + 0x12, 0x08, 0x89, 0xBF, 0x16, 0xD5, 0x82, 0xE4, 0xFE, 0x7F, 0x95, 0xDF, + 0x48, 0xE4, 0x01, 0x40, 0x3D, 0x63, 0x01, 0x30, 0x01, 0x40, 0x3D, 0x63, + 0x21, 0x30, 0x00, 0x40, 0x81, 0xBC, 0x94, 0xE4, 0x04, 0xD4, 0x82, 0xE4, + 0x14, 0x40, 0xCD, 0xDF, 0x94, 0xE4, 0x89, 0xE4, 0x03, 0xB6, 0x1F, 0xB0, + 0x40, 0xB4, 0x01, 0x40, 0x3D, 0x63, 0x01, 0x28, 0xE1, 0xC8, 0xF3, 0xD4, + 0xE4, 0xDE, 0x16, 0xC9, 0x0A, 0x40, 0xCE, 0x66, 0x12, 0x08, 0x89, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x12, 0x18, 0x80, 0x40, 0x01, 0xA9, 0xEB, 0xDE, + 0x07, 0xB1, 0x28, 0xE4, 0x00, 0xA1, 0x08, 0xE4, 0x98, 0xE4, 0x22, 0x56, + 0x9A, 0xB8, 0x09, 0x28, 0xC1, 0xC9, 0xE1, 0xC8, 0x09, 0xD5, 0xC1, 0xC1, + 0x3A, 0x41, 0x0C, 0xB8, 0x01, 0x40, 0x11, 0xBF, 0xF6, 0xDB, 0x00, 0xA8, + 0x07, 0xB0, 0xA0, 0xE0, 0x01, 0x40, 0x3D, 0x63, 0x32, 0x31, 0x80, 0xE4, + 0x07, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, 0x28, 0xE4, 0x00, 0xA1, 0x08, 0xE4, + 0x26, 0x56, 0x00, 0xB8, 0x98, 0xE4, 0x42, 0x5C, 0x91, 0xB8, 0x06, 0xDE, + 0xC1, 0xC1, 0x18, 0x40, 0x00, 0xB8, 0x04, 0x40, 0x10, 0xBF, 0x0A, 0xD8, + 0x09, 0x28, 0xC1, 0xC9, 0xE1, 0xC8, 0xF6, 0xD4, 0x01, 0x40, 0x3D, 0x63, + 0x42, 0x31, 0x80, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, 0x00, 0xA8, 0x07, 0xB0, + 0xA0, 0xE0, 0x07, 0xB1, 0x28, 0xE4, 0x00, 0xA1, 0x08, 0xE4, 0x4E, 0x5C, + 0x04, 0xB8, 0x98, 0xE4, 0x00, 0x40, 0x9D, 0x71, 0x96, 0xB8, 0x09, 0x28, + 0xC1, 0xC9, 0xE1, 0xC8, 0x09, 0xD5, 0xC1, 0xC1, 0x2F, 0x41, 0x00, 0xB8, + 0x01, 0x40, 0x11, 0xBF, 0xF6, 0xDB, 0x00, 0xA8, 0x07, 0xB0, 0xA0, 0xE0, + 0x01, 0x40, 0x3D, 0x63, 0x52, 0x31, 0x80, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, + 0x03, 0xB1, 0x18, 0xE4, 0x98, 0xB8, 0x00, 0x40, 0x43, 0x6C, 0x09, 0x20, + 0x00, 0xA8, 0xE0, 0xC0, 0x04, 0xD9, 0x80, 0xE4, 0x3A, 0x41, 0x8C, 0xE6, + 0x81, 0xB8, 0x03, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x18, 0xE4, 0x98, 0xB8, + 0x00, 0x40, 0x7C, 0x78, 0x09, 0x20, 0x00, 0xA8, 0xE0, 0xC0, 0x06, 0xD9, + 0x80, 0xE4, 0x18, 0x40, 0x80, 0xE6, 0x81, 0xB8, 0x26, 0x56, 0x80, 0xB8, + 0x03, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x18, 0xE4, 0x98, 0xB8, 0x01, 0x40, + 0x38, 0x63, 0x49, 0x20, 0x00, 0xA8, 0xE0, 0xC0, 0x06, 0xD9, 0x80, 0xE4, + 0x2F, 0x41, 0x80, 0xE6, 0x81, 0xB8, 0x4E, 0x5C, 0x84, 0xB8, 0x03, 0xB0, + 0xA0, 0xE0, 0x0F, 0xB1, 0x18, 0xE4, 0x03, 0x40, 0x42, 0xE8, 0x09, 0xE4, + 0x00, 0xE0, 0x80, 0xE4, 0x81, 0xB8, 0x00, 0x40, 0x43, 0x6C, 0x08, 0x23, + 0x93, 0xE4, 0x09, 0xE0, 0xE0, 0xC9, 0x09, 0xD9, 0x82, 0xE4, 0x08, 0xE0, + 0x80, 0xBF, 0x0E, 0xD5, 0x91, 0xB8, 0x01, 0xA8, 0x00, 0x40, 0x45, 0x6C, + 0x29, 0x38, 0x01, 0xB8, 0x01, 0x40, 0x3D, 0x63, 0x31, 0x28, 0x00, 0x40, + 0x43, 0x6C, 0x00, 0x38, 0x0F, 0xB0, 0xA0, 0xE0, 0x01, 0x40, 0x3D, 0x63, + 0x01, 0x28, 0xE0, 0xC8, 0x12, 0xD5, 0x91, 0xB8, 0x01, 0xA8, 0x00, 0x40, + 0x45, 0x6C, 0x29, 0x38, 0x01, 0xA8, 0x01, 0x40, 0x3D, 0x63, 0x01, 0x38, + 0x01, 0xB8, 0x01, 0x40, 0x3D, 0x63, 0x31, 0x28, 0x00, 0x40, 0x43, 0x6C, + 0x00, 0x38, 0x0F, 0xB0, 0xA0, 0xE0, 0x01, 0x40, 0x3D, 0x63, 0x61, 0x33, + 0xEF, 0xDE, 0x07, 0xB1, 0x18, 0xE4, 0x03, 0x40, 0x02, 0xE8, 0x09, 0xE4, + 0x00, 0xE0, 0x80, 0xE4, 0x81, 0xB8, 0x00, 0x40, 0x7C, 0x78, 0x08, 0x29, + 0xE0, 0xC9, 0x09, 0xD9, 0x82, 0xE4, 0x08, 0xE0, 0x80, 0xBF, 0x0E, 0xD5, + 0x91, 0xB8, 0x01, 0xA8, 0x00, 0x40, 0x84, 0x78, 0x19, 0x38, 0x01, 0xB8, + 0x01, 0x40, 0x3D, 0x63, 0x41, 0x28, 0x00, 0x40, 0x7C, 0x78, 0x00, 0x38, + 0x07, 0xB0, 0xA0, 0xE0, 0x01, 0xA8, 0x01, 0x40, 0x3D, 0x63, 0x11, 0x38, + 0xED, 0xDE, 0x0F, 0xB1, 0x18, 0xE4, 0x03, 0x40, 0x42, 0xE8, 0x09, 0xE4, + 0x00, 0xE0, 0x80, 0xE4, 0x81, 0xB8, 0x01, 0x40, 0x38, 0x63, 0x48, 0x23, + 0x93, 0xE4, 0x09, 0xE0, 0xE0, 0xC9, 0x09, 0xD9, 0x82, 0xE4, 0x08, 0xE0, + 0x80, 0xBF, 0x0E, 0xD5, 0x91, 0xB8, 0x01, 0xA8, 0x01, 0x40, 0x3A, 0x63, + 0x69, 0x38, 0x01, 0xB8, 0x01, 0x40, 0x3D, 0x63, 0x51, 0x28, 0x01, 0x40, + 0x38, 0x63, 0x40, 0x38, 0x0F, 0xB0, 0xA0, 0xE0, 0x01, 0x40, 0x3D, 0x63, + 0x21, 0x28, 0xE0, 0xC8, 0x12, 0xD5, 0x91, 0xB8, 0x01, 0xA8, 0x01, 0x40, + 0x3A, 0x63, 0x69, 0x38, 0x01, 0xA8, 0x01, 0x40, 0x3D, 0x63, 0x21, 0x38, + 0x01, 0xB8, 0x01, 0x40, 0x3D, 0x63, 0x51, 0x28, 0x01, 0x40, 0x38, 0x63, + 0x40, 0x38, 0x0F, 0xB0, 0xA0, 0xE0, 0x01, 0x40, 0x3D, 0x63, 0x71, 0x33, + 0xEF, 0xDE, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xF9, 0xB6, 0xD8, 0xE4, + 0x48, 0xE4, 0x02, 0x40, 0x9B, 0x5A, 0x44, 0xB8, 0x08, 0xE4, 0x02, 0x40, + 0xE0, 0x4C, 0x04, 0xB8, 0x86, 0x90, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x08, + 0x85, 0x98, 0x02, 0x40, 0xF0, 0x4C, 0x0D, 0x08, 0x6D, 0xE4, 0x02, 0x40, + 0xE2, 0x4C, 0x62, 0xB8, 0xE0, 0xC8, 0x09, 0xD5, 0x02, 0x40, 0xE2, 0x4C, + 0x8D, 0x26, 0x04, 0x40, 0x6A, 0xE6, 0x05, 0x9F, 0x6F, 0xB8, 0x0D, 0x40, + 0x68, 0xB8, 0x00, 0xA9, 0x89, 0xE4, 0x06, 0x40, 0x34, 0x19, 0x96, 0x89, + 0x06, 0x40, 0x24, 0x19, 0x38, 0xE4, 0x06, 0x28, 0xE0, 0xC8, 0x1C, 0xDB, + 0x24, 0xE4, 0x04, 0x40, 0x24, 0xB8, 0x14, 0xE4, 0x06, 0xE4, 0xC6, 0xC0, + 0x01, 0x40, 0x30, 0xBF, 0x11, 0xD8, 0x80, 0x28, 0xC2, 0xC0, 0x02, 0x40, + 0xAA, 0x5A, 0x3D, 0x09, 0x98, 0xB8, 0x01, 0x19, 0xC4, 0xC1, 0x8D, 0xE4, + 0x02, 0x40, 0xE5, 0xDF, 0x02, 0x38, 0xC1, 0xC2, 0xC1, 0xC3, 0x06, 0x28, + 0x38, 0xBF, 0xEC, 0xD9, 0x06, 0x40, 0x24, 0x09, 0xA6, 0x88, 0x8E, 0xC8, + 0x98, 0xBD, 0x06, 0x40, 0x24, 0x19, 0x00, 0xAC, 0x16, 0x28, 0xE0, 0xC8, + 0x21, 0xDB, 0x26, 0xE4, 0x02, 0x40, 0x28, 0xB8, 0x13, 0xE4, 0x14, 0xB8, + 0x04, 0x40, 0x14, 0xB8, 0x03, 0xE4, 0x0A, 0xC0, 0x04, 0xB8, 0x01, 0x40, + 0x30, 0xBF, 0x12, 0xD8, 0x82, 0x28, 0xC2, 0xC2, 0x02, 0x40, 0xAA, 0x5A, + 0x3D, 0x09, 0x98, 0xB8, 0x00, 0x19, 0xC4, 0xC0, 0x8D, 0xE4, 0x02, 0x40, + 0xBC, 0xDF, 0x01, 0x38, 0xC1, 0xC1, 0xC1, 0xC3, 0xC1, 0xCC, 0x16, 0x2F, + 0xCF, 0xBF, 0xEB, 0xD9, 0x06, 0x40, 0x24, 0x09, 0xED, 0xE4, 0x02, 0x40, + 0xE6, 0x4C, 0xEC, 0xB8, 0xFF, 0xA8, 0x05, 0x90, 0x60, 0x20, 0x82, 0xC8, + 0x02, 0x40, 0xAA, 0x5A, 0x3D, 0x0F, 0xF8, 0xBC, 0x84, 0x9F, 0x08, 0x40, + 0x2E, 0x08, 0x8E, 0xC8, 0x98, 0xBD, 0x06, 0x40, 0x24, 0x19, 0x00, 0xAC, + 0x08, 0x40, 0x3E, 0x08, 0xE0, 0xC8, 0x41, 0xDB, 0xAE, 0xE4, 0x06, 0x9B, + 0x16, 0x40, 0xBC, 0xB8, 0x06, 0x96, 0x12, 0x40, 0x68, 0xB8, 0x23, 0xE4, + 0x24, 0xB8, 0x04, 0x40, 0x24, 0xB8, 0x24, 0xDE, 0x13, 0xE4, 0x0A, 0xC1, + 0x01, 0xE4, 0x04, 0xB8, 0x0A, 0x09, 0x04, 0x98, 0x98, 0xB8, 0x00, 0x19, + 0x8B, 0x88, 0x05, 0x9F, 0x6F, 0x2F, 0xBE, 0xC8, 0x98, 0xBA, 0x00, 0x19, + 0x14, 0xB8, 0x8D, 0xE4, 0x01, 0x09, 0x02, 0x40, 0x7C, 0xDF, 0x02, 0x38, + 0xC1, 0xC2, 0x01, 0xA9, 0x8E, 0xC9, 0x06, 0x40, 0x34, 0x08, 0x89, 0xBD, + 0x06, 0x40, 0x34, 0x18, 0xC1, 0xC3, 0xC1, 0xCC, 0xC2, 0xCB, 0xC4, 0xCA, + 0x08, 0x40, 0x3E, 0x08, 0x8C, 0xBF, 0x11, 0xDB, 0x01, 0x40, 0x30, 0xBF, + 0x0E, 0xD8, 0x06, 0x08, 0xC4, 0xC6, 0xE0, 0xC8, 0xD5, 0xD4, 0x13, 0xE4, + 0x0A, 0xC1, 0x01, 0xE4, 0x04, 0xB8, 0x8D, 0xE4, 0x0A, 0x09, 0x02, 0x40, + 0x7C, 0xDF, 0x00, 0x18, 0xD9, 0xDE, 0x0A, 0x40, 0x54, 0x33, 0x00, 0xA3, + 0x0A, 0x40, 0x54, 0x29, 0xE0, 0xC9, 0x1D, 0xDB, 0x14, 0xE4, 0x05, 0x40, + 0x16, 0xB8, 0x07, 0xDE, 0x01, 0x32, 0xC1, 0xC3, 0xC1, 0xC1, 0x89, 0xE4, + 0x08, 0xE0, 0x83, 0xBF, 0x12, 0xDB, 0xFD, 0x7F, 0x61, 0x28, 0x88, 0xB8, + 0x12, 0xD7, 0x01, 0xA2, 0x82, 0xE4, 0x8E, 0xC8, 0x06, 0x40, 0x24, 0x00, + 0x08, 0xBC, 0xEE, 0xD4, 0x01, 0x30, 0xC1, 0xC3, 0xC1, 0xC1, 0x89, 0xE4, + 0x08, 0xE0, 0x83, 0xBF, 0xEE, 0xD8, 0x07, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, + 0x40, 0xB4, 0x01, 0xA8, 0x8E, 0xC8, 0x06, 0x40, 0x24, 0x00, 0x08, 0xBC, + 0x0C, 0xD5, 0xFF, 0xA8, 0x01, 0x38, 0x09, 0xE0, 0x83, 0x93, 0x8D, 0xE4, + 0x02, 0x40, 0x6B, 0xDF, 0xFD, 0x7F, 0x61, 0x38, 0x0A, 0x40, 0x54, 0x29, + 0xD2, 0xDE, 0x01, 0x30, 0xF4, 0xDE, 0x20, 0xB5, 0x1F, 0xB1, 0xFD, 0xB6, + 0x38, 0xE4, 0x49, 0xE4, 0x0C, 0x91, 0x08, 0xE4, 0x02, 0x40, 0x94, 0x5A, + 0x08, 0xB8, 0x0C, 0x40, 0x00, 0x22, 0x92, 0xE4, 0x09, 0xE0, 0x01, 0x40, + 0x91, 0xBF, 0x1C, 0xD8, 0x89, 0xE4, 0x0A, 0xC8, 0x80, 0xB8, 0x08, 0x11, + 0x89, 0xE4, 0x80, 0xB8, 0x08, 0x40, 0x08, 0x34, 0x98, 0xE4, 0x05, 0x40, + 0x90, 0xB8, 0x00, 0xA1, 0x0A, 0x40, 0xCE, 0x66, 0x13, 0x08, 0xE0, 0xC8, + 0x09, 0xD4, 0x09, 0x31, 0x82, 0xE4, 0xC1, 0xC8, 0x0C, 0x40, 0x00, 0x38, + 0x01, 0xA8, 0x03, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x01, 0xA1, 0xF5, 0xDE, + 0x00, 0x40, 0xE6, 0x62, 0x07, 0xA8, 0xCD, 0x7F, 0xCA, 0xDF, 0x00, 0xA8, + 0x03, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, + 0xEC, 0xB6, 0xE8, 0xE4, 0xC8, 0xE4, 0x02, 0x40, 0x94, 0x5A, 0xC8, 0xB8, + 0xB8, 0xE4, 0x02, 0x40, 0x9B, 0x5A, 0xB4, 0xB8, 0x00, 0xA4, 0xD4, 0xE4, + 0x0C, 0x40, 0x0C, 0x28, 0xE0, 0xC8, 0x24, 0xDB, 0x0C, 0x40, 0xDF, 0xE1, + 0xAC, 0xE4, 0x6E, 0xE4, 0x02, 0x40, 0x99, 0x5A, 0x68, 0xB8, 0x3C, 0xE4, + 0x00, 0xA2, 0x0A, 0x40, 0x5B, 0x21, 0xE0, 0xC1, 0x0B, 0xDB, 0x0B, 0xE4, + 0x00, 0x09, 0xC4, 0xC0, 0x03, 0x08, 0x98, 0xBF, 0x2A, 0xD5, 0xC1, 0xC2, + 0x81, 0xE4, 0x08, 0xE0, 0x82, 0xBF, 0xF6, 0xD8, 0x81, 0xE4, 0x08, 0xE0, + 0x82, 0xBF, 0x1A, 0xD5, 0xC1, 0xC4, 0xC4, 0xC3, 0xC1, 0xC6, 0xC4, 0xCA, + 0x0C, 0x40, 0x0C, 0x28, 0x48, 0xBF, 0xE4, 0xD9, 0x00, 0xA4, 0x4D, 0xBF, + 0x0A, 0xDA, 0x0C, 0x40, 0xD0, 0xE1, 0x8E, 0xE4, 0x00, 0x09, 0xC4, 0xC0, + 0x01, 0x40, 0x49, 0xDF, 0xC1, 0xC4, 0x4D, 0xBF, 0xF8, 0xD9, 0x01, 0xA8, + 0x14, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x8D, 0xE4, 0x0A, 0xC8, + 0x8F, 0xB8, 0x0A, 0x09, 0x08, 0x19, 0xC1, 0xCD, 0xDF, 0xDE, 0x06, 0x28, + 0xE1, 0xC8, 0xD8, 0xD4, 0x0A, 0x40, 0xCE, 0x66, 0x2E, 0x08, 0x00, 0x40, + 0x00, 0x60, 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x2E, 0x18, 0x0A, 0x40, + 0x5B, 0x21, 0xCC, 0xDE, 0x20, 0xB5, 0x5F, 0xB1, 0xFD, 0xB6, 0x68, 0xE4, + 0x38, 0xE4, 0x02, 0x40, 0x94, 0x5A, 0x38, 0xB8, 0x0A, 0x40, 0xCC, 0x66, + 0x28, 0x02, 0x11, 0x40, 0x24, 0xE6, 0x28, 0xB8, 0x03, 0x40, 0xA1, 0x68, + 0x28, 0xB8, 0x00, 0xA1, 0x0C, 0x40, 0x03, 0x28, 0xE0, 0xC8, 0x18, 0xDB, + 0x46, 0xE4, 0x02, 0x40, 0xA0, 0x4C, 0x40, 0xB8, 0x06, 0xE4, 0x02, 0x40, + 0x98, 0x5A, 0x08, 0xB8, 0x00, 0x29, 0x84, 0xE4, 0xCE, 0x7F, 0x39, 0xDF, + 0x01, 0xA9, 0x00, 0x28, 0xA2, 0xC9, 0x02, 0x08, 0x89, 0xBD, 0x02, 0x18, + 0xC1, 0xC1, 0xC1, 0xC0, 0x0C, 0x40, 0x03, 0x28, 0x18, 0xBF, 0xF0, 0xD9, + 0x00, 0xA8, 0x0C, 0x40, 0x03, 0x38, 0x98, 0xE4, 0x86, 0xE4, 0x02, 0x40, + 0xA0, 0x5A, 0x8A, 0xB8, 0x10, 0xA1, 0x08, 0x39, 0xC1, 0xC8, 0xDF, 0xC1, + 0xE0, 0xC1, 0xFB, 0xDA, 0x01, 0xA8, 0x03, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, + 0x0C, 0xB3, 0x5F, 0xB1, 0xF1, 0xB6, 0xB8, 0xE4, 0x02, 0x40, 0xD1, 0x4C, + 0x28, 0x09, 0x02, 0x40, 0xF0, 0x4C, 0x08, 0x08, 0x2B, 0xE4, 0x02, 0x40, + 0xE2, 0x4C, 0x22, 0xB8, 0xE0, 0xC8, 0x08, 0xD5, 0x02, 0x40, 0xE2, 0x4C, + 0x8B, 0x22, 0x04, 0x40, 0x2A, 0xE6, 0x29, 0xB8, 0x0D, 0x40, 0x28, 0xB8, + 0x00, 0xA0, 0x10, 0xE4, 0x40, 0xE4, 0x02, 0x29, 0xE0, 0xC9, 0x12, 0xDB, + 0x28, 0x40, 0xD3, 0xE1, 0x92, 0x88, 0x80, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x05, 0xD5, 0x84, 0xE4, 0x83, 0xB8, 0x08, 0x31, 0xC1, 0xC4, 0x02, 0x29, + 0xC1, 0xC1, 0xC1, 0xC0, 0x89, 0xE4, 0x08, 0xE0, 0x80, 0xBF, 0xF0, 0xD8, + 0x00, 0xA0, 0x30, 0xE4, 0x12, 0x29, 0xE0, 0xC9, 0x14, 0xDB, 0x14, 0x40, + 0xD6, 0xE1, 0xEE, 0xC1, 0x10, 0xD8, 0xA2, 0x88, 0x80, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x05, 0xD5, 0x83, 0xE4, 0x86, 0xB8, 0x08, 0x31, 0xC1, 0xC3, + 0x12, 0x29, 0xC1, 0xC1, 0xC1, 0xC0, 0x89, 0xE4, 0x08, 0xE0, 0x80, 0xBF, + 0xEE, 0xD8, 0x2B, 0xE4, 0x02, 0x40, 0xE6, 0x4C, 0x2C, 0xB8, 0x00, 0xA0, + 0x60, 0xE4, 0x08, 0x40, 0x32, 0x09, 0xE0, 0xC9, 0x11, 0xDB, 0xDA, 0xE1, + 0x08, 0x40, 0x22, 0x08, 0x81, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x06, 0xD5, + 0x86, 0xE4, 0x8A, 0xB8, 0x08, 0x31, 0xC1, 0xC6, 0x08, 0x40, 0x32, 0x09, + 0xC1, 0xC1, 0xC1, 0xC0, 0x90, 0xBF, 0xF0, 0xD8, 0x00, 0xA9, 0x8B, 0xE4, + 0x0E, 0xA0, 0x02, 0x40, 0xA2, 0x5A, 0x18, 0x19, 0x02, 0x40, 0xA6, 0x5A, + 0x08, 0x19, 0xDF, 0xC0, 0xC4, 0xC8, 0xE0, 0xC0, 0xF6, 0xDA, 0x09, 0xE4, + 0x94, 0xBF, 0x17, 0xDA, 0x28, 0x40, 0xD2, 0xE1, 0x93, 0xE4, 0x0A, 0xC9, + 0x9B, 0xB8, 0x02, 0x40, 0xA6, 0x5A, 0x90, 0xB8, 0x1B, 0xE4, 0x02, 0x40, + 0xA2, 0x5A, 0x14, 0xB8, 0x82, 0xE4, 0x80, 0xB8, 0x08, 0x2A, 0x01, 0x1A, + 0xC4, 0xC1, 0x08, 0x28, 0x09, 0x18, 0xC4, 0xC9, 0xC1, 0xC0, 0x04, 0xBF, + 0xF5, 0xD9, 0x00, 0xA0, 0x03, 0xBF, 0x17, 0xDA, 0x14, 0x40, 0xD2, 0xE1, + 0x1B, 0xE4, 0x02, 0x40, 0xA6, 0x5A, 0x10, 0xB8, 0x94, 0xE4, 0x0A, 0xC9, + 0x9B, 0xB8, 0x02, 0x40, 0xA2, 0x5A, 0x94, 0xB8, 0x82, 0xE4, 0x80, 0xB8, + 0x08, 0x2A, 0x09, 0x1A, 0xC4, 0xC9, 0x08, 0x28, 0x01, 0x18, 0xC4, 0xC1, + 0xC1, 0xC0, 0x03, 0xBF, 0xF5, 0xD9, 0x24, 0xE4, 0x23, 0xB8, 0x00, 0xA0, + 0x06, 0xBF, 0x12, 0xDA, 0xD1, 0xE1, 0x92, 0xE4, 0x0A, 0xC9, 0x9B, 0xB8, + 0x81, 0xE4, 0x80, 0xB8, 0x08, 0x23, 0x02, 0x40, 0xA2, 0x5A, 0x19, 0x13, + 0x08, 0x28, 0x02, 0x40, 0xA6, 0x5A, 0x09, 0x18, 0xC1, 0xC0, 0xC4, 0xC9, + 0x06, 0xBF, 0xF2, 0xD9, 0x26, 0xB8, 0xE0, 0xC2, 0x28, 0xDB, 0x12, 0xE4, + 0xEE, 0xC2, 0x11, 0xD8, 0x92, 0xE4, 0x0A, 0xC9, 0x9B, 0xB8, 0x02, 0x40, + 0xA2, 0x5A, 0x94, 0xB8, 0x0B, 0xE4, 0x02, 0x40, 0xA2, 0x5A, 0x04, 0xB8, + 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0xC1, 0xC1, 0xEE, 0xC1, + 0xF9, 0xDB, 0x12, 0xE4, 0xEE, 0xC2, 0x11, 0xD8, 0x92, 0xE4, 0x0A, 0xC9, + 0x9B, 0xB8, 0x02, 0x40, 0xA6, 0x5A, 0x90, 0xB8, 0x0B, 0xE4, 0x02, 0x40, + 0xA6, 0x5A, 0x00, 0xB8, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, + 0xC1, 0xC1, 0xEE, 0xC1, 0xF9, 0xDB, 0x0F, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, + 0xA0, 0xE0, 0x20, 0xB5, 0x5F, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x69, 0xE4, + 0x48, 0xE4, 0x02, 0x40, 0x94, 0x5A, 0x48, 0xB8, 0x00, 0xA3, 0x0C, 0x40, + 0x04, 0x22, 0xE0, 0xC2, 0x0F, 0xDB, 0x18, 0xE4, 0x02, 0x40, 0x98, 0x5A, + 0x18, 0xB8, 0x94, 0xE4, 0x09, 0x08, 0xC4, 0xC9, 0x86, 0xBF, 0x09, 0xD5, + 0xC1, 0xC3, 0xC1, 0xC1, 0x82, 0xE4, 0x08, 0xE0, 0x83, 0xBF, 0xF6, 0xD8, + 0x03, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x01, 0x29, 0x80, 0xE4, 0x02, 0x40, + 0xA0, 0x4C, 0x80, 0xB8, 0xCD, 0x7F, 0x09, 0xDF, 0x0A, 0x40, 0xE0, 0x66, + 0x30, 0x08, 0x86, 0xBF, 0x0F, 0xD5, 0x0A, 0x40, 0xCC, 0x66, 0x20, 0x08, + 0x11, 0x40, 0x84, 0xE6, 0x80, 0xB8, 0x03, 0x40, 0xA1, 0x68, 0x88, 0xB8, + 0x01, 0xA0, 0x01, 0x21, 0x86, 0xC0, 0x08, 0x09, 0x90, 0xBD, 0x08, 0x19, + 0x13, 0xE4, 0xC1, 0xC1, 0x0C, 0x40, 0x04, 0x22, 0x32, 0xE4, 0x03, 0xE0, + 0x31, 0xBF, 0x14, 0xDB, 0x01, 0xE4, 0x0A, 0xC0, 0x04, 0xB8, 0x00, 0x08, + 0xFF, 0x7F, 0x30, 0x18, 0x81, 0xE4, 0x84, 0xB8, 0x08, 0x40, 0x08, 0x29, + 0x07, 0x40, 0x78, 0x39, 0x0A, 0x40, 0x08, 0x29, 0x09, 0x40, 0x78, 0x39, + 0xC1, 0xC1, 0xC4, 0xC0, 0x31, 0xBF, 0xEF, 0xD8, 0x82, 0xE4, 0xDF, 0xC8, + 0x0C, 0x40, 0x04, 0x38, 0x03, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x0F, 0xB1, + 0x28, 0xE4, 0x39, 0xE4, 0x02, 0x40, 0x94, 0x5A, 0x28, 0xB8, 0x0C, 0x40, + 0x02, 0x28, 0xFF, 0xA0, 0xE0, 0xC8, 0x0C, 0xD9, 0x00, 0xA0, 0x09, 0xDB, + 0x18, 0xE4, 0x92, 0xE4, 0x09, 0x08, 0xC4, 0xC9, 0x83, 0xBF, 0x07, 0xD5, + 0xC1, 0xC0, 0x10, 0xBF, 0xF9, 0xD8, 0xFF, 0xA0, 0x80, 0xE4, 0x0F, 0xB0, + 0xA0, 0xE0, 0x02, 0xB8, 0x08, 0x40, 0x00, 0x20, 0x80, 0xE4, 0x0F, 0xB0, + 0xA0, 0xE0, 0x5F, 0xB1, 0x49, 0xE4, 0x68, 0xE4, 0x02, 0x40, 0x94, 0x5A, + 0x68, 0xB8, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x09, 0x0C, 0x40, 0x06, 0x20, + 0x84, 0xE4, 0xE0, 0xC0, 0x13, 0xD9, 0x01, 0xA3, 0x69, 0x29, 0xA6, 0xC3, + 0xDF, 0xC3, 0x00, 0xA1, 0xE0, 0xC0, 0x0B, 0xDB, 0x20, 0xE4, 0x96, 0xE4, + 0x09, 0x00, 0xC4, 0xC9, 0x80, 0xE4, 0x83, 0xBC, 0x84, 0xBF, 0x06, 0xD5, + 0xC1, 0xC1, 0x21, 0xBF, 0xF7, 0xD8, 0x84, 0xE4, 0x5F, 0xB0, 0xA0, 0xE0, + 0x80, 0xE4, 0x5F, 0xB0, 0xA0, 0xE0, 0x3C, 0xB3, 0x5F, 0xB1, 0xD8, 0xE4, + 0x0D, 0x98, 0x0A, 0xC8, 0x8D, 0xB8, 0x02, 0x40, 0x9B, 0x5A, 0x84, 0xB8, + 0x08, 0x01, 0x02, 0x40, 0x9B, 0x5A, 0x1D, 0x00, 0x31, 0xE4, 0x30, 0xBA, + 0xE0, 0xC3, 0x4E, 0xDB, 0x00, 0xAC, 0x01, 0xA4, 0xB9, 0xE4, 0x0B, 0xE0, + 0xE1, 0xCB, 0x2B, 0xDB, 0xA8, 0xE4, 0x2D, 0xE4, 0x02, 0x40, 0x9B, 0x5A, + 0x28, 0xB8, 0x1D, 0xE4, 0x02, 0x40, 0x9F, 0x5A, 0x19, 0xB8, 0x04, 0xDE, + 0xC1, 0xC4, 0xC4, 0xC2, 0xB4, 0xBF, 0x1D, 0xDB, 0x01, 0x28, 0xC1, 0xC1, + 0x88, 0xB8, 0xF8, 0xD7, 0x64, 0xE4, 0x0A, 0xC6, 0x0A, 0x00, 0x02, 0x08, + 0x90, 0xE4, 0x98, 0xBA, 0xE0, 0xC9, 0x20, 0xDB, 0x93, 0xBF, 0xEE, 0xDA, + 0x86, 0xE4, 0x8D, 0xB8, 0x0A, 0x00, 0x02, 0x40, 0x9B, 0x5A, 0x18, 0x08, + 0x30, 0xE4, 0x38, 0xBA, 0xE0, 0xC3, 0x10, 0xDB, 0xC4, 0xE4, 0xC1, 0xC4, + 0xC4, 0xC2, 0xB4, 0xBF, 0xE3, 0xD8, 0xCD, 0xB8, 0x04, 0x40, 0x31, 0x75, + 0x0C, 0x29, 0x00, 0xA8, 0xE0, 0xC9, 0x01, 0xD9, 0x89, 0xE4, 0x5F, 0xB0, + 0x3C, 0xB2, 0xA0, 0xE0, 0x38, 0xE4, 0x30, 0xBA, 0xC4, 0xE4, 0xED, 0xDE, + 0x80, 0xBA, 0x83, 0xBF, 0xCD, 0xDA, 0x86, 0xE4, 0x8D, 0xB8, 0x0A, 0x00, + 0x02, 0x40, 0x9B, 0x5A, 0x18, 0x08, 0x30, 0xE4, 0x38, 0xBA, 0xE0, 0xC3, + 0xDF, 0xD8, 0xEE, 0xDE, 0x30, 0xE4, 0x31, 0xBA, 0xAF, 0xDE, 0x20, 0xB5, + 0xFC, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0x28, 0xE4, 0x69, 0xE4, 0x15, 0x9B, + 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x03, 0x00, 0xAA, 0x02, 0x40, 0xD2, 0x4C, + 0x08, 0x04, 0xCA, 0xE4, 0xEA, 0xE4, 0x08, 0xE4, 0x02, 0x40, 0xD3, 0x4C, + 0x08, 0xB8, 0xE0, 0xCB, 0x01, 0x40, 0xED, 0xD5, 0x16, 0xE4, 0x03, 0x40, + 0x1C, 0xB8, 0xDA, 0xE4, 0xFA, 0xE4, 0x02, 0x40, 0xAD, 0x5A, 0x12, 0x08, + 0x88, 0xB8, 0x00, 0x40, 0xA1, 0xD7, 0xA3, 0xE4, 0x3A, 0x41, 0xA2, 0xB8, + 0x93, 0x28, 0x02, 0x40, 0x96, 0x38, 0xA3, 0x28, 0x02, 0x40, 0xA6, 0x38, + 0x07, 0x40, 0x13, 0x28, 0x26, 0x38, 0x01, 0xAD, 0xFD, 0xE4, 0x8A, 0x28, + 0x06, 0xC8, 0xA1, 0x38, 0x9A, 0x28, 0x06, 0xC8, 0xB1, 0x38, 0xAA, 0x28, + 0x06, 0xC8, 0x81, 0x38, 0xBA, 0x28, 0x06, 0xC8, 0x91, 0x38, 0x06, 0x40, + 0x13, 0x88, 0x83, 0xB8, 0x01, 0x40, 0x08, 0x2C, 0x02, 0x40, 0x08, 0x2E, + 0x36, 0x3C, 0x02, 0x40, 0xDB, 0x4C, 0x12, 0x08, 0x98, 0xE4, 0xE1, 0xC8, + 0x08, 0xD5, 0x8E, 0xE4, 0x08, 0xE0, 0xC1, 0xC8, 0x01, 0x40, 0x81, 0xBF, + 0x01, 0x40, 0x77, 0xD8, 0x98, 0xE4, 0x46, 0x39, 0x06, 0x40, 0x63, 0x28, + 0x01, 0x40, 0x10, 0x38, 0x06, 0x40, 0x23, 0x28, 0x50, 0x38, 0x06, 0x40, + 0x33, 0x28, 0x60, 0x38, 0x06, 0x40, 0x43, 0x28, 0x70, 0x38, 0x06, 0x40, + 0x53, 0x28, 0x01, 0x40, 0x00, 0x38, 0x06, 0x40, 0x73, 0x28, 0x04, 0x40, + 0x06, 0x38, 0x07, 0x40, 0x03, 0x28, 0x04, 0x40, 0x16, 0x38, 0x07, 0x40, + 0x43, 0x28, 0x01, 0x40, 0x20, 0x38, 0x07, 0x40, 0x53, 0x28, 0x01, 0x40, + 0x30, 0x38, 0x07, 0x40, 0x63, 0x28, 0x01, 0x40, 0x40, 0x38, 0x07, 0x40, + 0x73, 0x28, 0x01, 0x40, 0x50, 0x38, 0x06, 0x40, 0x13, 0x28, 0x0D, 0x40, + 0x10, 0x38, 0x02, 0x40, 0xD2, 0x4C, 0x12, 0x08, 0x02, 0x40, 0xB0, 0x38, + 0x02, 0x40, 0xD2, 0x4C, 0x22, 0x08, 0x02, 0x40, 0xC0, 0x38, 0xE0, 0xC4, + 0x01, 0x40, 0xC1, 0xD5, 0x14, 0x28, 0x01, 0x40, 0x60, 0x38, 0xC4, 0x28, + 0x01, 0x40, 0x80, 0x38, 0xD4, 0x28, 0x01, 0x40, 0x90, 0x38, 0x75, 0x42, + 0x23, 0x88, 0xE0, 0xC8, 0x05, 0xD5, 0x02, 0x40, 0x64, 0x88, 0xE0, 0xC8, + 0x01, 0x40, 0xA0, 0xD4, 0xFF, 0xA8, 0x50, 0x18, 0x75, 0x42, 0x23, 0x88, + 0xE0, 0xC8, 0x05, 0xD5, 0x02, 0x40, 0x64, 0x88, 0xE0, 0xC8, 0x01, 0x40, + 0x8B, 0xD4, 0xFF, 0xA8, 0x60, 0x18, 0x06, 0x40, 0x44, 0x28, 0xE1, 0xC8, + 0x01, 0x40, 0x8B, 0xD5, 0x00, 0xA9, 0x06, 0x40, 0x54, 0x28, 0xE1, 0xC8, + 0x01, 0x40, 0x8E, 0xD5, 0x70, 0x19, 0x01, 0x40, 0x03, 0x88, 0xDC, 0xC8, + 0x05, 0x40, 0xD0, 0x38, 0x82, 0xE4, 0x12, 0x40, 0x16, 0xDF, 0x82, 0xE4, + 0x12, 0x40, 0x73, 0xDF, 0x0A, 0x40, 0xCE, 0x66, 0x32, 0x08, 0x0D, 0x40, + 0x20, 0x38, 0x02, 0x40, 0xA9, 0x5A, 0x32, 0x08, 0x0B, 0x40, 0x00, 0x38, + 0x02, 0x40, 0xDB, 0x4C, 0x22, 0x08, 0xE0, 0xC8, 0x03, 0xD5, 0xFF, 0xA8, + 0x0B, 0x40, 0x06, 0x38, 0x02, 0x40, 0xAD, 0x5A, 0x02, 0x08, 0x00, 0x40, + 0x84, 0xBC, 0x01, 0xD5, 0x01, 0xA8, 0x0A, 0x40, 0x00, 0x38, 0x02, 0x40, + 0xAD, 0x5A, 0x02, 0x09, 0x89, 0xE4, 0x00, 0x40, 0x82, 0xBC, 0x09, 0xD5, + 0x0A, 0x40, 0x00, 0x28, 0x00, 0x40, 0x82, 0xBD, 0x0A, 0x40, 0x00, 0x38, + 0x02, 0x40, 0xAD, 0x5A, 0x02, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x06, 0xD5, + 0x0A, 0x40, 0x00, 0x28, 0x00, 0x40, 0x84, 0xBD, 0x0A, 0x40, 0x00, 0x38, + 0x02, 0x40, 0xDF, 0x4C, 0x32, 0x08, 0x0D, 0x40, 0x30, 0x38, 0x02, 0x40, + 0xE0, 0x4C, 0x02, 0x08, 0x0B, 0x40, 0x10, 0x38, 0x02, 0x40, 0xAA, 0x5A, + 0x02, 0x08, 0x88, 0xB8, 0x01, 0x40, 0x15, 0xD7, 0x02, 0x40, 0xDC, 0x4C, + 0x22, 0x08, 0xE1, 0xC8, 0x00, 0x40, 0xFD, 0xD5, 0x0A, 0x40, 0xCE, 0x66, + 0x02, 0x08, 0x05, 0x40, 0x36, 0x18, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x08, + 0xE0, 0xC8, 0x00, 0x40, 0xD8, 0xD4, 0x02, 0x40, 0xD2, 0x4C, 0x32, 0x08, + 0xE1, 0xC8, 0x00, 0x40, 0xDB, 0xD5, 0x82, 0xE4, 0x08, 0x40, 0x7C, 0xDF, + 0x04, 0x40, 0x16, 0x18, 0x02, 0x40, 0xAA, 0x5A, 0x02, 0x08, 0x0D, 0x40, + 0x46, 0x38, 0x02, 0x40, 0xDD, 0x4C, 0x12, 0x09, 0x04, 0x40, 0x20, 0x19, + 0x02, 0x40, 0xDD, 0x4C, 0x22, 0x08, 0x04, 0x40, 0x30, 0x18, 0xE3, 0xCB, + 0x00, 0x40, 0xE1, 0xD5, 0xE0, 0xCB, 0x07, 0xD4, 0x02, 0x40, 0xDB, 0x4C, + 0x12, 0x08, 0xDE, 0xC8, 0xE1, 0xC8, 0x00, 0x40, 0xEB, 0xDD, 0x02, 0x40, + 0xD3, 0x4C, 0x12, 0x08, 0x07, 0x40, 0x06, 0x18, 0x02, 0x40, 0xD3, 0x4C, + 0x12, 0x08, 0xE6, 0x18, 0x07, 0x40, 0x7C, 0x44, 0x02, 0x28, 0xE0, 0xC8, + 0x00, 0x40, 0x8A, 0xD4, 0x0D, 0x40, 0x50, 0x38, 0x02, 0x40, 0xDB, 0x4C, + 0x12, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0x78, 0xD5, 0x02, 0x40, 0xAA, 0x5A, + 0x02, 0x08, 0x06, 0x38, 0x0B, 0x40, 0x00, 0x28, 0x0B, 0x40, 0x06, 0x38, + 0x0A, 0x40, 0x00, 0x28, 0x0A, 0x40, 0x06, 0x38, 0x02, 0x40, 0xAA, 0x5A, + 0x32, 0x08, 0x05, 0x40, 0x16, 0x18, 0x02, 0x40, 0xD2, 0x4C, 0x22, 0x08, + 0x02, 0x40, 0xC6, 0x38, 0x0A, 0x40, 0xE0, 0x66, 0x02, 0x08, 0x07, 0x40, + 0x16, 0x18, 0x0A, 0x40, 0xCE, 0x66, 0x12, 0x08, 0x06, 0x40, 0x00, 0x18, + 0x0A, 0x40, 0xCE, 0x66, 0x22, 0x09, 0x06, 0x40, 0x10, 0x19, 0x0A, 0x40, + 0xE0, 0x66, 0x02, 0x09, 0x07, 0x40, 0x10, 0x19, 0xE0, 0xC8, 0x4A, 0xD5, + 0x00, 0xA8, 0x0D, 0x40, 0x00, 0x38, 0xE0, 0xCB, 0x3D, 0xD5, 0x02, 0x40, + 0xAD, 0x5A, 0x12, 0x08, 0x88, 0xB8, 0x31, 0xD7, 0x93, 0x28, 0x02, 0x40, + 0x90, 0x38, 0xA3, 0x28, 0x02, 0x40, 0xA0, 0x38, 0x02, 0x40, 0xDB, 0x4C, + 0x12, 0x08, 0x98, 0xE4, 0xE1, 0xC8, 0x08, 0xD5, 0x8E, 0xE4, 0x08, 0xE0, + 0xC1, 0xC8, 0x01, 0x40, 0x81, 0xBF, 0x00, 0x40, 0xA4, 0xD8, 0x98, 0xE4, + 0x40, 0x39, 0x30, 0x3C, 0x06, 0x40, 0x73, 0x28, 0x04, 0x40, 0x00, 0x38, + 0x07, 0x40, 0x03, 0x28, 0x04, 0x40, 0x10, 0x38, 0x10, 0xE4, 0x03, 0x40, + 0x1C, 0xB8, 0x9F, 0xE4, 0x09, 0xE0, 0x8A, 0x28, 0xA6, 0xC8, 0xA1, 0x38, + 0x9A, 0x28, 0xA6, 0xC8, 0xB1, 0x38, 0x9D, 0xE4, 0x09, 0xE0, 0xAA, 0x28, + 0xA6, 0xC8, 0x81, 0x38, 0xBA, 0x28, 0xA6, 0xC8, 0x91, 0x38, 0x83, 0x9B, + 0x86, 0xE4, 0x90, 0xE4, 0x00, 0x40, 0x98, 0xDF, 0x0D, 0x40, 0x00, 0x28, + 0x08, 0xE0, 0x04, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x11, 0xA8, + 0xFE, 0x7F, 0x86, 0xDE, 0x01, 0xA8, 0xB5, 0xDE, 0x02, 0x40, 0xAA, 0x5A, + 0x02, 0x08, 0x00, 0x38, 0x02, 0x40, 0xAA, 0x5A, 0x32, 0x08, 0x05, 0x40, + 0x10, 0x18, 0x99, 0xDE, 0x07, 0x40, 0x7C, 0x44, 0x12, 0x29, 0x0D, 0x40, + 0x50, 0x39, 0x07, 0x40, 0x7C, 0x44, 0x22, 0x28, 0x12, 0xC8, 0x89, 0xBD, + 0x0D, 0x40, 0x50, 0x38, 0x07, 0x40, 0x7C, 0x44, 0x32, 0x29, 0x0A, 0xC9, + 0x89, 0xBD, 0x0D, 0x40, 0x50, 0x38, 0x00, 0xA8, 0x07, 0x40, 0x7C, 0x44, + 0x12, 0x38, 0xFF, 0x7F, 0x5F, 0xDE, 0x82, 0xE4, 0x08, 0x40, 0x19, 0xDF, + 0x02, 0x40, 0xD2, 0x4C, 0x32, 0x08, 0xE1, 0xC8, 0xFF, 0x7F, 0x25, 0xD4, + 0x0A, 0x40, 0xCC, 0x66, 0x12, 0x08, 0xE0, 0xC8, 0xFF, 0x7F, 0x1F, 0xD4, + 0x82, 0xE4, 0x0F, 0x40, 0x84, 0xDF, 0xFF, 0x7F, 0x1A, 0xDE, 0x83, 0x9B, + 0x89, 0xE4, 0x90, 0xE4, 0x51, 0xDF, 0xFE, 0x7F, 0x0D, 0xDE, 0x02, 0x40, + 0xA9, 0x5A, 0x32, 0x08, 0x0B, 0x40, 0x00, 0x38, 0x02, 0x40, 0xE0, 0x4C, + 0x02, 0x08, 0x0B, 0x40, 0x10, 0x38, 0xFE, 0x7F, 0xF7, 0xDE, 0x04, 0x40, + 0x26, 0x19, 0x04, 0x40, 0x36, 0x18, 0xFF, 0x7F, 0x22, 0xDE, 0xFF, 0xA8, + 0x0B, 0x40, 0x00, 0x38, 0x00, 0xA8, 0x0A, 0x40, 0x00, 0x38, 0x00, 0xA8, + 0x05, 0x40, 0x10, 0x18, 0x0B, 0x40, 0x10, 0x38, 0xFE, 0x7F, 0xDE, 0xDE, + 0x02, 0x40, 0xDD, 0x4C, 0x12, 0x08, 0x04, 0x40, 0x26, 0x18, 0x02, 0x40, + 0xDD, 0x4C, 0x22, 0x08, 0x04, 0x40, 0x36, 0x18, 0xFF, 0x7F, 0x09, 0xDE, + 0x74, 0x08, 0x60, 0x18, 0x06, 0x40, 0x44, 0x28, 0xE1, 0xC8, 0xFE, 0x7F, + 0x75, 0xD4, 0x07, 0x40, 0x04, 0x09, 0x08, 0xDE, 0x64, 0x08, 0xFE, 0x7F, + 0x5E, 0xDE, 0x11, 0xA8, 0xFF, 0x7F, 0x59, 0xDE, 0x9B, 0x40, 0x04, 0x09, + 0xC1, 0xC9, 0x07, 0x40, 0x34, 0x28, 0xC6, 0xC8, 0xA2, 0xC9, 0xFE, 0x7F, + 0x69, 0xDE, 0x01, 0x40, 0x60, 0x34, 0x01, 0x40, 0x80, 0x34, 0x01, 0x40, + 0x90, 0x34, 0x50, 0x14, 0x60, 0x14, 0x70, 0x14, 0xFE, 0x7F, 0x5F, 0xDE, + 0x03, 0xB1, 0x18, 0xE4, 0x09, 0xE4, 0x05, 0x99, 0xD0, 0x08, 0xD1, 0x18, + 0x30, 0x28, 0x31, 0x38, 0x40, 0x28, 0x41, 0x38, 0x50, 0x28, 0x51, 0x38, + 0x60, 0x28, 0x61, 0x38, 0x70, 0x28, 0x71, 0x38, 0x01, 0x40, 0x00, 0x28, + 0x01, 0x40, 0x01, 0x38, 0x01, 0x40, 0x10, 0x28, 0x01, 0x40, 0x11, 0x38, + 0x01, 0x40, 0x20, 0x28, 0x01, 0x40, 0x21, 0x38, 0x01, 0x40, 0x30, 0x28, + 0x01, 0x40, 0x31, 0x38, 0x01, 0x40, 0x40, 0x28, 0x01, 0x40, 0x41, 0x38, + 0x01, 0x40, 0x50, 0x28, 0x01, 0x40, 0x51, 0x38, 0x01, 0x40, 0x60, 0x28, + 0x01, 0x40, 0x61, 0x38, 0x01, 0x40, 0x80, 0x28, 0x01, 0x40, 0x81, 0x38, + 0x01, 0x40, 0x90, 0x28, 0x01, 0x40, 0x91, 0x38, 0x50, 0x08, 0x51, 0x18, + 0x60, 0x08, 0x61, 0x18, 0x70, 0x08, 0x71, 0x18, 0x04, 0x40, 0x00, 0x28, + 0x04, 0x40, 0x01, 0x38, 0x04, 0x40, 0x10, 0x28, 0x04, 0x40, 0x11, 0x38, + 0x02, 0x40, 0x90, 0x28, 0x02, 0x40, 0x91, 0x38, 0x02, 0x40, 0xA0, 0x28, + 0x02, 0x40, 0xA1, 0x38, 0x02, 0x40, 0xB0, 0x28, 0x02, 0x40, 0xB1, 0x38, + 0x02, 0x40, 0xC0, 0x28, 0x02, 0x40, 0xC1, 0x38, 0xE0, 0x08, 0xE1, 0x18, + 0x03, 0x40, 0xF0, 0x28, 0x03, 0x40, 0xF1, 0x38, 0x04, 0x40, 0x80, 0x28, + 0x04, 0x40, 0x81, 0x38, 0x04, 0x40, 0x90, 0x28, 0x04, 0x40, 0x91, 0x38, + 0x03, 0x40, 0xE0, 0x28, 0x03, 0x40, 0xE1, 0x38, 0xDE, 0xC9, 0xE1, 0xC9, + 0x08, 0xDD, 0x04, 0x40, 0x20, 0x08, 0x04, 0x40, 0x21, 0x18, 0x04, 0x40, + 0x30, 0x08, 0x04, 0x40, 0x31, 0x18, 0x06, 0x40, 0x00, 0x08, 0x06, 0x40, + 0x01, 0x18, 0x06, 0x40, 0x10, 0x08, 0x06, 0x40, 0x11, 0x18, 0x0D, 0x40, + 0x00, 0x28, 0x0D, 0x40, 0x01, 0x38, 0x0B, 0x40, 0x00, 0x28, 0x0B, 0x40, + 0x01, 0x38, 0x05, 0x40, 0xD0, 0x28, 0x05, 0x40, 0xD1, 0x38, 0x0B, 0x40, + 0x10, 0x28, 0x0B, 0x40, 0x11, 0x38, 0x0D, 0x40, 0x10, 0x28, 0x0D, 0x40, + 0x11, 0x38, 0x0D, 0x40, 0x30, 0x28, 0x0D, 0x40, 0x31, 0x38, 0x05, 0x40, + 0x10, 0x08, 0x05, 0x40, 0x11, 0x18, 0x0A, 0x40, 0x00, 0x28, 0x0A, 0x40, + 0x01, 0x38, 0x0D, 0x40, 0x50, 0x28, 0x0D, 0x40, 0x51, 0x38, 0x07, 0x40, + 0x00, 0x08, 0x07, 0x40, 0x01, 0x18, 0x07, 0x40, 0x10, 0x08, 0x07, 0x40, + 0x11, 0x18, 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, + 0xF0, 0xB6, 0x38, 0xE4, 0x69, 0xE4, 0x00, 0xA4, 0x02, 0x40, 0xD1, 0x4C, + 0x28, 0x08, 0x02, 0x40, 0xD1, 0x4C, 0x33, 0x0B, 0xD3, 0xE4, 0x02, 0x40, + 0xE0, 0x4C, 0xD4, 0xB8, 0x03, 0xE4, 0x02, 0x40, 0x93, 0x4D, 0x0C, 0xB8, + 0x89, 0x90, 0x01, 0xA9, 0x01, 0x40, 0x08, 0x22, 0x8A, 0xC9, 0x98, 0x88, + 0x89, 0xB8, 0xDF, 0xC8, 0x63, 0x40, 0xED, 0xDF, 0xC8, 0xE4, 0x00, 0x40, + 0x72, 0x64, 0x0C, 0xA8, 0x08, 0x14, 0x2D, 0x08, 0xE0, 0xC8, 0x01, 0x40, + 0x30, 0xD5, 0xF4, 0xE4, 0xE3, 0xE4, 0x02, 0x40, 0xFC, 0x4C, 0xE4, 0xB8, + 0x02, 0x40, 0xD2, 0x4C, 0x13, 0x08, 0x86, 0xBF, 0x00, 0x40, 0xFA, 0xD9, + 0x86, 0xE4, 0x9C, 0xE4, 0x64, 0x40, 0x7D, 0xDF, 0x08, 0xE4, 0x86, 0xE4, + 0x9C, 0xE4, 0x63, 0x40, 0xD0, 0xDF, 0x83, 0x98, 0x09, 0x98, 0x90, 0xE4, + 0x0E, 0x40, 0x0F, 0xDF, 0xA8, 0xE4, 0x00, 0xA0, 0x09, 0x92, 0xB2, 0x22, + 0x82, 0xBF, 0x09, 0xD5, 0x83, 0xE4, 0x9A, 0xE4, 0x0E, 0x40, 0x13, 0xDF, + 0x09, 0x99, 0xB9, 0x3A, 0x01, 0xA0, 0xAD, 0x7F, 0xCF, 0xDF, 0x2D, 0x08, + 0x83, 0x98, 0x02, 0x40, 0x5B, 0x82, 0x84, 0x92, 0x85, 0x96, 0x86, 0x90, + 0x28, 0x40, 0xD8, 0xE1, 0x9F, 0xE4, 0x01, 0x40, 0xE0, 0xDF, 0x0A, 0x99, + 0x89, 0xE4, 0x72, 0xC8, 0x88, 0xB8, 0x00, 0x40, 0xD6, 0xD7, 0x6E, 0xC9, + 0x99, 0xB8, 0x00, 0x40, 0xD2, 0xD7, 0x83, 0xE4, 0x02, 0x40, 0x92, 0x4D, + 0x88, 0xB8, 0xD8, 0x7F, 0x25, 0xDF, 0x86, 0xE4, 0x9C, 0xE4, 0x64, 0x40, + 0x44, 0xDF, 0x08, 0xE4, 0x86, 0xE4, 0x9C, 0xE4, 0x63, 0x40, 0x97, 0xDF, + 0x18, 0xE4, 0x0A, 0x98, 0x98, 0xE4, 0xFB, 0x7F, 0x9F, 0xBC, 0x8A, 0x99, + 0x02, 0x40, 0x6B, 0x22, 0xE1, 0xC2, 0x00, 0x40, 0xC5, 0xD5, 0x00, 0x40, + 0x22, 0x64, 0x04, 0xA9, 0x09, 0x08, 0x83, 0x98, 0x0A, 0x40, 0xCB, 0x66, + 0x23, 0x08, 0x84, 0x98, 0x0A, 0x40, 0xCC, 0x66, 0x03, 0x08, 0x85, 0x98, + 0x28, 0x40, 0xD8, 0xE1, 0x86, 0x98, 0x87, 0x90, 0x88, 0x91, 0x2C, 0xA8, + 0xD7, 0xE1, 0x87, 0xB8, 0x0A, 0x40, 0xCB, 0x66, 0x13, 0x09, 0x96, 0x40, + 0xC8, 0xDF, 0x0B, 0x92, 0x1B, 0x40, 0xED, 0x88, 0x8F, 0xBF, 0x0F, 0xD5, + 0x2C, 0xA0, 0xD7, 0xE1, 0x07, 0xB8, 0x83, 0x90, 0x83, 0xE4, 0x0E, 0x09, + 0x03, 0x40, 0x12, 0xDF, 0x0A, 0x40, 0xCD, 0x66, 0xD3, 0x29, 0x89, 0xBD, + 0x0A, 0x40, 0xCD, 0x66, 0xD3, 0x38, 0x00, 0xA1, 0x12, 0xBF, 0x12, 0xDA, + 0x0A, 0x40, 0xCB, 0x66, 0x13, 0x00, 0x01, 0x40, 0xA0, 0x88, 0x01, 0x40, + 0x80, 0x89, 0x89, 0xBA, 0x48, 0xB8, 0xC1, 0xC4, 0x02, 0x40, 0x0C, 0xB8, + 0x0A, 0x40, 0xCB, 0x66, 0x13, 0x10, 0xC1, 0xC1, 0x12, 0xBF, 0xF1, 0xD9, + 0x0A, 0x40, 0xCC, 0x66, 0x03, 0x08, 0x82, 0xBA, 0x0A, 0x40, 0xCC, 0x66, + 0x03, 0x18, 0x02, 0x40, 0xAE, 0x5A, 0x33, 0x08, 0x02, 0x40, 0x93, 0x4D, + 0x03, 0x09, 0x89, 0xBD, 0x02, 0x40, 0xAE, 0x5A, 0x33, 0x18, 0x02, 0x40, + 0xAE, 0x5A, 0x13, 0x08, 0x02, 0x40, 0x92, 0x4D, 0x23, 0x09, 0x89, 0xBD, + 0x02, 0x40, 0xAE, 0x5A, 0x13, 0x18, 0xE0, 0xC2, 0x60, 0xDB, 0x0A, 0x40, + 0xCC, 0x66, 0x23, 0x00, 0x29, 0x43, 0x04, 0xE6, 0x03, 0xB8, 0x03, 0x40, + 0x4E, 0x62, 0x0C, 0xB8, 0x83, 0x92, 0x02, 0x40, 0x6B, 0x82, 0x84, 0x92, + 0x85, 0x9C, 0x0A, 0x40, 0xCB, 0x66, 0x13, 0x08, 0x86, 0x98, 0x83, 0xE4, + 0x90, 0xE4, 0x01, 0x40, 0x76, 0xDF, 0x02, 0x40, 0x8C, 0xE6, 0x0A, 0x40, + 0xCB, 0x66, 0x13, 0x09, 0x98, 0xB8, 0x0A, 0x40, 0xCB, 0x66, 0x13, 0x19, + 0x02, 0x40, 0xAC, 0x5A, 0x03, 0x16, 0x0F, 0x98, 0xE1, 0xC8, 0x28, 0xD5, + 0x02, 0x40, 0x5B, 0x88, 0xE0, 0xC8, 0x29, 0xD5, 0xC1, 0xCA, 0x02, 0x40, + 0x93, 0x4D, 0xE3, 0x28, 0xA8, 0xBF, 0x1E, 0xD5, 0x8A, 0xE4, 0x06, 0xC8, + 0x83, 0xB8, 0x6C, 0xE4, 0x02, 0x40, 0x94, 0x4F, 0xB8, 0x29, 0x69, 0xE6, + 0x02, 0x40, 0x94, 0x4D, 0xB8, 0x28, 0x68, 0xB8, 0x1B, 0x40, 0xED, 0x88, + 0x8F, 0xBF, 0x06, 0xD8, 0x00, 0x40, 0x72, 0x64, 0x0C, 0xA0, 0x00, 0x08, + 0xE0, 0xC8, 0x08, 0xD5, 0xC1, 0xCF, 0xC4, 0xCE, 0x02, 0x40, 0xD2, 0x4C, + 0x13, 0x08, 0x86, 0xBF, 0xFF, 0x7F, 0x06, 0xDA, 0x84, 0xE4, 0x10, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x02, 0x40, 0x6B, 0x88, 0xE0, 0xC8, + 0xE5, 0xD5, 0x6C, 0xB8, 0xE3, 0xDE, 0x00, 0x40, 0x22, 0x64, 0x04, 0xA9, + 0x09, 0x08, 0xAD, 0x7F, 0x08, 0xDF, 0xFF, 0x7F, 0x26, 0xDE, 0x02, 0x40, + 0xAC, 0x5A, 0x03, 0x08, 0x4D, 0x18, 0xBA, 0xDE, 0xE0, 0xC0, 0xFF, 0x7F, + 0x38, 0xD4, 0x00, 0x40, 0x8C, 0xBC, 0xFF, 0x7F, 0x34, 0xD4, 0xE1, 0xCC, + 0x05, 0xDB, 0x04, 0x40, 0x90, 0xBD, 0x8A, 0x99, 0xFF, 0x7F, 0x2D, 0xDE, + 0x00, 0x40, 0x94, 0xBD, 0x8A, 0x99, 0xFF, 0x7F, 0x28, 0xDE, 0x83, 0xE4, + 0xA3, 0x7F, 0xFC, 0xDF, 0x00, 0x40, 0x22, 0x64, 0x04, 0xA9, 0x09, 0x18, + 0x0A, 0x40, 0xCF, 0x66, 0x13, 0x08, 0xC1, 0xC8, 0x0A, 0x40, 0xCF, 0x66, + 0x13, 0x18, 0xFE, 0x7F, 0xC0, 0xDE, 0x20, 0xB5, 0x1F, 0xB1, 0xF5, 0xB6, + 0x48, 0xE4, 0x00, 0x40, 0x9B, 0xDF, 0x28, 0xE4, 0xE0, 0xC8, 0x00, 0x40, + 0x90, 0xD5, 0x02, 0x40, 0xDC, 0x4C, 0x34, 0x08, 0xE0, 0xC8, 0x00, 0x40, + 0x81, 0xD4, 0x02, 0x01, 0xFF, 0x4F, 0xFF, 0x7F, 0x1F, 0xBC, 0x00, 0x60, + 0x00, 0x40, 0x10, 0xBD, 0x91, 0xE4, 0x7F, 0x63, 0x9F, 0xBC, 0x00, 0x44, + 0x90, 0xBD, 0x00, 0xA0, 0x08, 0x40, 0x02, 0x30, 0x12, 0x08, 0x0F, 0x40, + 0xFF, 0x7F, 0x8F, 0xBC, 0x12, 0x18, 0x00, 0x7E, 0xFF, 0x5F, 0x9F, 0xBC, + 0x02, 0x19, 0x02, 0x40, 0xA2, 0x5A, 0x14, 0x08, 0x0C, 0x40, 0xD3, 0xE1, + 0x03, 0x38, 0x84, 0xB8, 0x04, 0x40, 0x3F, 0x75, 0x08, 0x28, 0x08, 0x40, + 0x12, 0x38, 0x01, 0xA1, 0x92, 0xE4, 0x04, 0x40, 0x92, 0xB8, 0x83, 0xE4, + 0x81, 0xB8, 0x08, 0x30, 0x09, 0x30, 0xC1, 0xC9, 0xC1, 0xC1, 0xEE, 0xC1, + 0xF8, 0xDB, 0x02, 0x40, 0xA6, 0x5A, 0x04, 0x08, 0x03, 0x40, 0x38, 0xEA, + 0x84, 0xB8, 0x04, 0x40, 0x3F, 0x75, 0x08, 0x28, 0x0A, 0x40, 0x12, 0x38, + 0x92, 0xE4, 0x05, 0x40, 0x92, 0xB8, 0x83, 0xE4, 0x01, 0x40, 0x80, 0xB8, + 0x0D, 0xA1, 0x08, 0x30, 0xC1, 0xC8, 0x09, 0x30, 0xC1, 0xC9, 0xDF, 0xC1, + 0xE0, 0xC1, 0xF9, 0xDA, 0x00, 0xA0, 0x22, 0x10, 0x32, 0x10, 0x03, 0x28, + 0x72, 0xC8, 0x22, 0x18, 0x42, 0x10, 0x52, 0x10, 0x03, 0x40, 0x63, 0x28, + 0x72, 0xC8, 0x42, 0x18, 0x02, 0x09, 0x00, 0x42, 0x90, 0xBD, 0xE2, 0x10, + 0x03, 0x40, 0xE2, 0x30, 0x12, 0x08, 0x08, 0x40, 0x00, 0x40, 0x80, 0xBD, + 0x19, 0xE4, 0xFF, 0x71, 0xFF, 0x7F, 0x1F, 0xBC, 0x02, 0x11, 0x06, 0x40, + 0x12, 0x10, 0x06, 0x40, 0x22, 0x10, 0xF8, 0x7F, 0xF8, 0x40, 0x80, 0xBC, + 0x12, 0x18, 0x0A, 0x40, 0xCB, 0x66, 0x34, 0x08, 0x3F, 0x40, 0x8F, 0xBC, + 0xFF, 0x71, 0xC0, 0x7F, 0x90, 0xBC, 0x98, 0xBD, 0x02, 0x19, 0x0A, 0x40, + 0xCB, 0x66, 0x34, 0x08, 0xC1, 0xC8, 0x0A, 0x40, 0xCB, 0x66, 0x34, 0x18, + 0x82, 0xE4, 0x0B, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x02, 0x01, 0xFF, 0x4F, + 0xFF, 0x7F, 0x1F, 0xBC, 0x00, 0x50, 0x00, 0x40, 0x10, 0xBD, 0xFF, 0x7F, + 0x7D, 0xDE, 0x00, 0x40, 0xE8, 0x62, 0x08, 0xA8, 0xC6, 0x7F, 0x31, 0xDF, + 0xFF, 0x7F, 0x69, 0xDE, 0x01, 0xB1, 0x98, 0xE4, 0x0A, 0x40, 0xCC, 0x66, + 0x18, 0x08, 0x00, 0xA0, 0xE3, 0xC8, 0x0D, 0xD5, 0x0A, 0x40, 0xCC, 0x66, + 0x29, 0x00, 0x00, 0x40, 0x68, 0x50, 0x00, 0xE6, 0x0A, 0x40, 0xCB, 0x66, + 0x39, 0x08, 0x07, 0x40, 0x80, 0xE6, 0x08, 0xB8, 0x09, 0xB8, 0x80, 0xE4, + 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x98, 0xE4, 0x0A, 0x40, 0xCC, 0x66, + 0x18, 0x08, 0x00, 0xA0, 0xE3, 0xC8, 0x10, 0xD5, 0x0A, 0x40, 0xCC, 0x66, + 0x29, 0x00, 0x00, 0x40, 0xE8, 0x75, 0x00, 0xE6, 0x09, 0xB8, 0x0A, 0x40, + 0xCB, 0x66, 0x39, 0x08, 0x17, 0x40, 0x80, 0xE6, 0x08, 0xB8, 0x00, 0x40, + 0xD0, 0x60, 0x00, 0xB8, 0x80, 0xE4, 0x01, 0xB0, 0xA0, 0xE0, 0x1F, 0xB1, + 0x28, 0xE4, 0x08, 0x91, 0x09, 0x94, 0x0A, 0x93, 0x0B, 0x98, 0x02, 0x00, + 0x00, 0x40, 0x03, 0xBD, 0x00, 0x40, 0x81, 0xBC, 0x12, 0xC8, 0xFE, 0x7F, + 0x0F, 0xBC, 0x08, 0xBD, 0x80, 0xE4, 0xE0, 0xC9, 0x02, 0xD4, 0xE0, 0xC1, + 0x11, 0xD5, 0xFD, 0x7F, 0x83, 0xBC, 0x02, 0x18, 0xE1, 0xC4, 0x02, 0xD5, + 0x1F, 0xB0, 0xA0, 0xE0, 0x02, 0x09, 0x89, 0xE4, 0x6E, 0xC8, 0x88, 0xB8, + 0xF9, 0xD6, 0x00, 0x40, 0x94, 0xBD, 0x02, 0x19, 0x1F, 0xB0, 0xA0, 0xE0, + 0xE0, 0xC3, 0x06, 0xD5, 0xFD, 0x7F, 0x0F, 0xBC, 0x00, 0x40, 0x0C, 0xBD, + 0x02, 0x10, 0xEA, 0xDE, 0x02, 0x40, 0x00, 0xBD, 0xF9, 0xDE, 0x20, 0xB5, + 0xFC, 0xB3, 0x5F, 0xB1, 0xF2, 0xB6, 0x9C, 0x98, 0x9D, 0x99, 0x21, 0x99, + 0x1E, 0x98, 0x02, 0x40, 0x8C, 0xE6, 0x39, 0xE4, 0x38, 0xBA, 0x8D, 0x99, + 0x1D, 0x90, 0x29, 0x43, 0x00, 0x00, 0x8C, 0x90, 0x1D, 0x9D, 0x40, 0x40, + 0xD0, 0xB8, 0x1D, 0x9E, 0xA8, 0x42, 0xEE, 0xB8, 0x1D, 0x98, 0xE8, 0x42, + 0x8E, 0xB8, 0x8B, 0x98, 0x00, 0xA9, 0x02, 0x40, 0x89, 0xEA, 0x1D, 0x90, + 0x28, 0x43, 0xF0, 0x24, 0x1E, 0x98, 0x84, 0xB8, 0x02, 0x40, 0xC8, 0xEA, + 0x02, 0x40, 0x8F, 0xE8, 0x1E, 0x90, 0xE0, 0xC0, 0x0C, 0xD8, 0x00, 0x40, + 0x7A, 0xDE, 0xC1, 0xC4, 0x02, 0x40, 0x3C, 0xB8, 0xC1, 0xCF, 0x8F, 0xE4, + 0x18, 0xE0, 0x1E, 0x90, 0x80, 0xBF, 0x00, 0x40, 0x70, 0xDA, 0x01, 0x40, + 0xA3, 0x88, 0x20, 0x99, 0x89, 0xBF, 0xF1, 0xDA, 0x01, 0x40, 0x83, 0x2A, + 0x0A, 0xE4, 0x50, 0xE0, 0x02, 0x40, 0xA0, 0xEA, 0x01, 0x40, 0x93, 0x22, + 0xB2, 0xE4, 0x1B, 0xE0, 0x6B, 0xE4, 0x06, 0xC6, 0x0B, 0x98, 0x86, 0xB8, + 0x88, 0x28, 0x00, 0xAC, 0x01, 0x40, 0xE3, 0x3C, 0x02, 0x40, 0xA1, 0xE8, + 0x98, 0xE4, 0x19, 0xE0, 0xC1, 0xC9, 0x19, 0xBF, 0x65, 0xD8, 0x31, 0xDA, + 0x1D, 0x98, 0x86, 0xB8, 0x88, 0x29, 0x09, 0xE4, 0x10, 0xE0, 0x20, 0xE4, + 0x02, 0x40, 0x2C, 0xE6, 0x0C, 0x98, 0x28, 0xB8, 0x86, 0xE4, 0x8E, 0xB8, + 0x88, 0x26, 0x15, 0xDE, 0x01, 0x40, 0xA2, 0x88, 0xC1, 0xC8, 0x18, 0xBF, + 0x18, 0xD5, 0x18, 0xBF, 0x00, 0x40, 0x88, 0xD9, 0x06, 0xC0, 0x0D, 0xB8, + 0x80, 0x29, 0x09, 0xE4, 0x10, 0xE0, 0x20, 0xE4, 0x02, 0x40, 0x2C, 0xE6, + 0x0C, 0x98, 0x28, 0xB8, 0x8C, 0xE4, 0x18, 0xE0, 0x0E, 0xD4, 0x06, 0xBF, + 0xE9, 0xD4, 0x01, 0xAC, 0x01, 0x40, 0xA2, 0x88, 0xC1, 0xC8, 0x18, 0xBF, + 0xE8, 0xD4, 0x8B, 0xE4, 0x06, 0xC8, 0x8E, 0xB8, 0x88, 0x39, 0x01, 0x40, + 0x83, 0x2A, 0x8A, 0xE4, 0x58, 0xE0, 0x29, 0xD4, 0x8B, 0xE4, 0x06, 0xC8, + 0x1D, 0x99, 0x89, 0xB8, 0x88, 0x34, 0x84, 0xE4, 0x18, 0xE0, 0x06, 0xC8, + 0x8D, 0xB8, 0xFF, 0xA9, 0x88, 0x39, 0x8B, 0xE4, 0x06, 0xC8, 0x0B, 0x90, + 0x08, 0xB8, 0x01, 0x40, 0xA3, 0x89, 0x80, 0x39, 0x8E, 0xB8, 0x88, 0x34, + 0xC1, 0xC4, 0x02, 0x40, 0x3C, 0xB8, 0xC1, 0xCF, 0x8F, 0xE4, 0x18, 0xE0, + 0x1E, 0x90, 0x80, 0xBF, 0x90, 0xD9, 0x02, 0x40, 0x88, 0xE8, 0x84, 0xB8, + 0x1D, 0x99, 0x28, 0x43, 0xF9, 0x38, 0x02, 0x40, 0x88, 0xE8, 0x0E, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x8B, 0xE4, 0x06, 0xC8, 0x8E, 0xB8, + 0x88, 0x28, 0x06, 0xC8, 0x8D, 0xB8, 0xD4, 0xDE, 0x0D, 0x99, 0x83, 0x99, + 0x52, 0xE0, 0x84, 0x92, 0xC1, 0xC8, 0x58, 0xE0, 0x85, 0x98, 0xDF, 0xC0, + 0x50, 0xE0, 0x86, 0x90, 0x02, 0x40, 0xC0, 0xE8, 0x87, 0x90, 0x1C, 0x98, + 0x1D, 0x99, 0x34, 0xDF, 0x0D, 0x99, 0x01, 0x40, 0x89, 0x88, 0xE0, 0xC8, + 0x1F, 0xD4, 0x86, 0xE4, 0x1D, 0x99, 0x89, 0xB8, 0x02, 0x40, 0xC9, 0xE8, + 0x88, 0x39, 0x06, 0xC0, 0x0D, 0xB8, 0xFF, 0xA8, 0x80, 0x38, 0x8B, 0xE4, + 0x06, 0xC8, 0x8E, 0xB8, 0x02, 0x40, 0xC0, 0xE8, 0x88, 0x30, 0x0D, 0x98, + 0x02, 0x40, 0x8C, 0xB8, 0x8D, 0x98, 0x02, 0x40, 0x89, 0xE8, 0xC1, 0xC9, + 0x02, 0x40, 0x89, 0xEA, 0xC1, 0xC0, 0x02, 0x40, 0xC0, 0xEA, 0x01, 0x40, + 0x83, 0x2A, 0x99, 0xDE, 0x86, 0xE4, 0x8E, 0xB8, 0x88, 0x28, 0x06, 0xC8, + 0x8D, 0xB8, 0xDE, 0xDE, 0x02, 0x40, 0xA8, 0xE8, 0xDF, 0xC8, 0x01, 0x40, + 0xA2, 0x38, 0x8B, 0xE4, 0x06, 0xC8, 0x8E, 0xB8, 0x88, 0x39, 0x87, 0xDE, + 0x20, 0xB5, 0x3C, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x11, 0x94, + 0x12, 0x91, 0x13, 0x92, 0x14, 0x93, 0x15, 0x96, 0xC1, 0xE4, 0xB9, 0xE4, + 0x40, 0x40, 0xB0, 0xB8, 0xD9, 0xE4, 0xA8, 0x42, 0xDE, 0xB8, 0xA9, 0xE4, + 0xE8, 0x42, 0xAE, 0xB8, 0xFD, 0x7F, 0xE9, 0xDF, 0x98, 0xE4, 0x0A, 0x40, + 0xCF, 0x66, 0x10, 0x08, 0xC1, 0xC8, 0x0A, 0x40, 0xCF, 0x66, 0x10, 0x18, + 0x01, 0x40, 0x84, 0x32, 0x01, 0x40, 0xA4, 0x33, 0x01, 0x40, 0x94, 0x31, + 0x01, 0x40, 0xB4, 0x31, 0x09, 0x08, 0x79, 0xC8, 0xE2, 0xC8, 0x24, 0xD5, + 0x02, 0xA8, 0x01, 0x40, 0xE4, 0x38, 0x64, 0x08, 0x7F, 0x40, 0xFF, 0x7F, + 0x8A, 0xBC, 0x64, 0x18, 0x00, 0xA8, 0x04, 0x18, 0x14, 0x18, 0x84, 0x18, + 0x94, 0x19, 0x0C, 0xE4, 0x50, 0xE0, 0x06, 0xC0, 0x10, 0xE4, 0x1D, 0xB8, + 0x81, 0x28, 0x06, 0xC8, 0x8B, 0xB8, 0x88, 0x36, 0x86, 0xE4, 0x06, 0xC8, + 0x8B, 0xB8, 0xFF, 0xA9, 0x88, 0x39, 0x81, 0x36, 0xA0, 0xB8, 0x01, 0x40, + 0xA4, 0x88, 0x8A, 0x38, 0x03, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, + 0x01, 0xA8, 0xDB, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, 0x09, 0xE4, + 0x0B, 0x98, 0x18, 0x09, 0x28, 0x01, 0x38, 0x03, 0x00, 0xA2, 0x82, 0xE4, + 0x90, 0xBF, 0x08, 0xD5, 0x91, 0xBF, 0x09, 0xDC, 0x90, 0xBF, 0x02, 0xD6, + 0xE0, 0xC3, 0x09, 0xD4, 0x82, 0xE4, 0x58, 0xE0, 0x03, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x10, 0xBF, 0xF5, 0xD4, 0x01, 0xA2, 0xF7, 0xDE, 0x09, 0xBA, + 0x80, 0xE4, 0xBA, 0x7F, 0xF8, 0xDF, 0x02, 0xA2, 0xF1, 0xDE, 0x20, 0xB5, + 0x0F, 0xB1, 0xF9, 0xB6, 0x18, 0xE4, 0x00, 0xA3, 0x23, 0xE4, 0x03, 0x40, + 0x27, 0xDF, 0x07, 0xDE, 0x02, 0x40, 0xD2, 0x4C, 0x31, 0x08, 0xE0, 0xC8, + 0x2B, 0xD4, 0xE0, 0xC2, 0x29, 0xD4, 0x81, 0xE4, 0x02, 0x40, 0x6D, 0xDF, + 0xE0, 0xC8, 0x00, 0x40, 0xBE, 0xD5, 0x14, 0x40, 0xD0, 0xE1, 0x81, 0xE4, + 0x90, 0xE4, 0x02, 0x40, 0x7A, 0xDF, 0xE0, 0xC8, 0xEB, 0xD5, 0x00, 0x28, + 0x04, 0x40, 0x22, 0x5B, 0x11, 0x38, 0x02, 0x40, 0x88, 0xBF, 0x06, 0xDC, + 0x0A, 0xC8, 0x00, 0x40, 0xD7, 0x61, 0x84, 0xB8, 0x08, 0x08, 0x88, 0xE0, + 0xE0, 0xC2, 0xDC, 0xD5, 0x81, 0xE4, 0x01, 0xA9, 0xDB, 0x7F, 0x11, 0xDF, + 0xE1, 0xC8, 0x1D, 0xD4, 0x00, 0xA2, 0x02, 0x40, 0xD2, 0x4C, 0x31, 0x08, + 0xE0, 0xC8, 0xD5, 0xD5, 0x81, 0xE4, 0x02, 0x40, 0xAF, 0xDF, 0xE0, 0xC2, + 0x09, 0xD4, 0x0A, 0x40, 0xCE, 0x66, 0x21, 0x08, 0x00, 0x42, 0x80, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x21, 0x18, 0x02, 0xA3, 0x02, 0x40, 0xAD, 0x5A, + 0x11, 0x08, 0x88, 0xB8, 0x08, 0xD7, 0x83, 0xE4, 0x07, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x81, 0xE4, 0x02, 0x40, 0x8D, 0xDF, 0xB5, 0xDE, 0x0A, 0x40, + 0xCE, 0x66, 0x11, 0x08, 0x40, 0x40, 0x00, 0x40, 0x80, 0xBD, 0x0A, 0x40, + 0xCE, 0x66, 0x11, 0x18, 0x01, 0xA3, 0x83, 0xE4, 0x07, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x81, 0xE4, 0x02, 0x40, 0x86, 0xDF, 0x81, 0xE4, 0x01, 0xA9, + 0x02, 0x40, 0xD9, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0x64, 0xD4, 0xBC, 0x7F, + 0xA0, 0xDF, 0xBC, 0xDE, 0x01, 0xA8, 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x18, + 0x28, 0xE4, 0xB8, 0xDE, 0x02, 0xA8, 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x18, + 0x01, 0xA2, 0xB2, 0xDE, 0x04, 0xA8, 0xF9, 0xDE, 0x08, 0xA8, 0xF7, 0xDE, + 0x10, 0xA8, 0xF5, 0xDE, 0x20, 0xA8, 0xF3, 0xDE, 0x40, 0xA8, 0xF1, 0xDE, + 0x08, 0x40, 0x00, 0xA8, 0xEE, 0xDE, 0x81, 0xE4, 0x02, 0x40, 0x60, 0xDF, + 0x81, 0xE4, 0xF1, 0x7F, 0x83, 0xDF, 0xE0, 0xC8, 0x9B, 0xD4, 0xBC, 0x7F, + 0x7C, 0xDF, 0xBC, 0x7F, 0x8F, 0xDF, 0xE0, 0xC8, 0x95, 0xD5, 0x81, 0xE4, + 0x02, 0x40, 0x47, 0xDF, 0x9F, 0xDE, 0x81, 0xE4, 0x02, 0x40, 0x4E, 0xDF, + 0x18, 0x40, 0xD0, 0xE1, 0x10, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x80, 0xE4, + 0x91, 0xE4, 0xF1, 0x7F, 0x6D, 0xDF, 0x00, 0x89, 0xE0, 0xC9, 0x32, 0xD4, + 0x02, 0x40, 0xAD, 0x5A, 0x11, 0x08, 0x88, 0xB8, 0xFF, 0x7F, 0x7C, 0xD6, + 0x0A, 0x40, 0xCE, 0x66, 0x11, 0x19, 0x0A, 0x40, 0xCE, 0x66, 0x21, 0x19, + 0x81, 0xE4, 0x04, 0x99, 0xF1, 0x7F, 0xEF, 0xDF, 0xFF, 0x7F, 0x70, 0xDE, + 0x81, 0xE4, 0x02, 0x40, 0x2D, 0xDF, 0x18, 0x40, 0xD0, 0xE1, 0x80, 0xE4, + 0x91, 0xE4, 0xF2, 0x7F, 0x8F, 0xDF, 0x00, 0x88, 0xE0, 0xC8, 0xFF, 0x7F, + 0x63, 0xD5, 0x00, 0xA8, 0xC6, 0xDE, 0x81, 0xE4, 0x02, 0x40, 0x1E, 0xDF, + 0x03, 0xA8, 0xBA, 0x7F, 0xB4, 0xDF, 0xBB, 0x7F, 0xF0, 0xDF, 0xFF, 0x7F, + 0x57, 0xDE, 0xBC, 0x7F, 0x3D, 0xDF, 0x02, 0x40, 0xD2, 0x4C, 0x31, 0x18, + 0xFF, 0x7F, 0x5E, 0xDE, 0x00, 0xA8, 0xBC, 0x7F, 0x30, 0xDF, 0x0A, 0x40, + 0xCE, 0x66, 0x11, 0x08, 0xE0, 0xC8, 0x04, 0xD4, 0x00, 0x80, 0x0A, 0x40, + 0xCE, 0x66, 0x11, 0x10, 0x0A, 0x40, 0xCE, 0x66, 0x21, 0x08, 0xE0, 0xC8, + 0xA6, 0xD4, 0x03, 0x40, 0x18, 0xE9, 0x0A, 0x40, 0xCE, 0x66, 0x21, 0x18, + 0xA0, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xF9, 0xB6, 0x18, 0xE4, 0x00, 0xA2, + 0x00, 0x60, 0x00, 0x40, 0x00, 0xA8, 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x18, + 0x02, 0x40, 0xAC, 0x5A, 0x11, 0x12, 0x81, 0xE4, 0x02, 0x40, 0x12, 0xDF, + 0x81, 0xE4, 0x01, 0x40, 0x7A, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, 0x00, 0x40, + 0xDF, 0xD5, 0x00, 0xA8, 0x02, 0x40, 0xD2, 0x4C, 0x31, 0x18, 0x18, 0x40, + 0xD0, 0xE1, 0x81, 0xE4, 0x90, 0xE4, 0x01, 0x40, 0x82, 0xDF, 0xE0, 0xC8, + 0x31, 0xD4, 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x08, 0x88, 0xB8, 0xE8, 0xD7, + 0x81, 0xE4, 0x01, 0x40, 0xCD, 0xDF, 0x02, 0x40, 0xA9, 0x5A, 0x31, 0x12, + 0x03, 0x40, 0x18, 0xE9, 0x02, 0x40, 0xE0, 0x4C, 0x01, 0x18, 0xE0, 0xC2, + 0x2E, 0xD5, 0xE2, 0xC2, 0x2C, 0xD5, 0xE4, 0xC2, 0x2A, 0xD5, 0xE6, 0xC2, + 0x28, 0xD5, 0xE8, 0xC2, 0x26, 0xD5, 0xEA, 0xC2, 0x24, 0xD5, 0xEC, 0xC2, + 0x22, 0xD5, 0xEE, 0xC2, 0x20, 0xD5, 0x00, 0xA8, 0x02, 0x40, 0xDF, 0x4C, + 0x11, 0x18, 0xE7, 0xC2, 0x03, 0xD5, 0x01, 0xA8, 0xE9, 0xC2, 0x01, 0xD4, + 0x00, 0xA8, 0x02, 0x40, 0xDF, 0x4C, 0x21, 0x18, 0x01, 0xA8, 0x07, 0xB6, + 0x07, 0xB0, 0x40, 0xB4, 0x00, 0x28, 0x04, 0x40, 0x22, 0x5B, 0x11, 0x38, + 0x28, 0xE4, 0x02, 0x40, 0x88, 0xBF, 0xC7, 0xDC, 0x0A, 0xC8, 0x00, 0x40, + 0xE1, 0x61, 0x88, 0xB8, 0x08, 0x08, 0x88, 0xE0, 0xC0, 0xDE, 0x01, 0xA8, + 0x02, 0x40, 0xDF, 0x4C, 0x11, 0x18, 0xE4, 0xDE, 0x81, 0xE4, 0x01, 0x40, + 0x8D, 0xDF, 0x81, 0xE4, 0x01, 0xA9, 0x01, 0x40, 0xE0, 0xDF, 0xE0, 0xC8, + 0x09, 0xD4, 0xBB, 0x7F, 0xA8, 0xDF, 0xAF, 0xDE, 0x81, 0xE4, 0x01, 0x40, + 0x81, 0xDF, 0x03, 0xA8, 0xBA, 0x7F, 0x17, 0xDF, 0xBB, 0x7F, 0x53, 0xDF, + 0xA6, 0xDE, 0x01, 0xA8, 0x03, 0x40, 0x3C, 0x62, 0x31, 0x18, 0xA1, 0xDE, + 0x02, 0x40, 0xDF, 0x4C, 0x01, 0x09, 0xE1, 0xC9, 0x00, 0x40, 0x65, 0xD5, + 0x08, 0x40, 0x00, 0xA8, 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x18, 0x03, 0x40, + 0x3C, 0x62, 0x31, 0x09, 0xE0, 0xC9, 0x53, 0xD4, 0x02, 0x40, 0xDB, 0x4C, + 0x11, 0x08, 0xE2, 0xC8, 0x4E, 0xD5, 0x03, 0x40, 0x3D, 0x62, 0x01, 0x19, + 0x8D, 0xDE, 0x81, 0xE4, 0x01, 0x40, 0x5A, 0xDF, 0x81, 0xE4, 0xF0, 0x7F, + 0x7D, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, 0x7F, 0xD4, 0xBB, 0x7F, 0x75, 0xDF, + 0xFF, 0x7F, 0x7B, 0xDE, 0x81, 0xE4, 0x01, 0x40, 0x4D, 0xDF, 0x14, 0x40, + 0xD0, 0xE1, 0x10, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x80, 0xE4, 0x91, 0xE4, + 0xF0, 0x7F, 0x6C, 0xDF, 0x00, 0x88, 0xE0, 0xC8, 0xFF, 0x7F, 0x6B, 0xD5, + 0x00, 0xA8, 0xBB, 0x7F, 0x60, 0xDF, 0xFF, 0x7F, 0x66, 0xDE, 0x81, 0xE4, + 0x01, 0x40, 0x38, 0xDF, 0x14, 0x40, 0xD0, 0xE1, 0x80, 0xE4, 0x91, 0xE4, + 0xF1, 0x7F, 0x9A, 0xDF, 0xED, 0xDE, 0x01, 0xA8, 0x02, 0x40, 0xDE, 0x4C, + 0x31, 0x18, 0x00, 0xA8, 0x0A, 0x40, 0xE1, 0x66, 0x11, 0x18, 0xFF, 0x7F, + 0x57, 0xDE, 0x02, 0xA8, 0xF5, 0xDE, 0x04, 0xA8, 0xF3, 0xDE, 0x08, 0xA8, + 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x18, 0xFF, 0x7F, 0x4D, 0xDE, 0x10, 0xA8, + 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x18, 0xFF, 0x7F, 0x47, 0xDE, 0x20, 0xA8, + 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x18, 0x01, 0xA8, 0x03, 0x40, 0x3D, 0x62, + 0x01, 0x18, 0xFF, 0x7F, 0x3D, 0xDE, 0x40, 0xA8, 0xF5, 0xDE, 0x20, 0xA8, + 0x02, 0x40, 0xDE, 0x4C, 0x31, 0x18, 0x03, 0x40, 0x3D, 0x62, 0x01, 0x19, + 0xFF, 0x7F, 0x32, 0xDE, 0xBB, 0x7F, 0x28, 0xDF, 0x02, 0x40, 0xD2, 0x4C, + 0x31, 0x18, 0x81, 0xE4, 0x01, 0x40, 0x0E, 0xDF, 0x80, 0xE4, 0xFF, 0x7F, + 0x50, 0xDE, 0x20, 0xB5, 0x1F, 0xB1, 0xF9, 0xB6, 0x18, 0xE4, 0x00, 0xA2, + 0x02, 0x40, 0xA9, 0x5A, 0x38, 0x03, 0x02, 0x40, 0xE0, 0x4C, 0x08, 0x04, + 0x01, 0xA8, 0x02, 0x40, 0xAC, 0x5A, 0x11, 0x18, 0x02, 0xDE, 0xE0, 0xC2, + 0x1E, 0xD4, 0x81, 0xE4, 0x00, 0x40, 0x77, 0xDF, 0xE0, 0xC8, 0x00, 0x40, + 0x6E, 0xD5, 0x14, 0x40, 0xD0, 0xE1, 0x81, 0xE4, 0x90, 0xE4, 0x00, 0x40, + 0x84, 0xDF, 0xE0, 0xC8, 0xF0, 0xD5, 0x00, 0x28, 0x04, 0x40, 0x22, 0x5B, + 0x11, 0x38, 0x98, 0xE4, 0x02, 0x40, 0x88, 0xBF, 0xE8, 0xDC, 0x0A, 0xC8, + 0x00, 0x40, 0xEB, 0x61, 0x8C, 0xB8, 0x08, 0x08, 0x88, 0xE0, 0xE0, 0xC2, + 0xE2, 0xD5, 0x01, 0xA8, 0xE0, 0xC2, 0x07, 0xD5, 0x81, 0xE4, 0x00, 0x40, + 0xB6, 0xDF, 0x81, 0xE4, 0x00, 0x40, 0xD2, 0xDF, 0x00, 0xA8, 0x07, 0xB6, + 0x1F, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0x00, 0x40, 0xCB, 0xDF, 0x81, 0xE4, + 0x00, 0xA9, 0x01, 0x40, 0x0A, 0xDF, 0xE0, 0xC8, 0x3D, 0xD4, 0xBA, 0x7F, + 0xD2, 0xDF, 0xC7, 0xDE, 0x93, 0xBF, 0xE8, 0xD4, 0x02, 0x40, 0x58, 0xE9, + 0x84, 0xBF, 0xE4, 0xD4, 0xE0, 0xDE, 0x81, 0xE4, 0x00, 0x40, 0xB8, 0xDF, + 0x81, 0xE4, 0xEF, 0x7F, 0xC7, 0xDF, 0xE0, 0xC8, 0xB8, 0xD4, 0xBA, 0x7F, + 0xC0, 0xDF, 0xB5, 0xDE, 0x81, 0xE4, 0x00, 0x40, 0xAD, 0xDF, 0x18, 0x40, + 0xD0, 0xE1, 0x10, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x80, 0xE4, 0x91, 0xE4, + 0xEF, 0x7F, 0xB8, 0xDF, 0x00, 0x88, 0xE0, 0xC8, 0xA6, 0xD5, 0x00, 0xA8, + 0xBA, 0x7F, 0xAD, 0xDF, 0xA2, 0xDE, 0x81, 0xE4, 0x00, 0x40, 0x9A, 0xDF, + 0x18, 0x40, 0xD0, 0xE1, 0x80, 0xE4, 0x91, 0xE4, 0xF0, 0x7F, 0xE8, 0xDF, + 0xEF, 0xDE, 0x03, 0xA8, 0xB9, 0x7F, 0x15, 0xDF, 0xBA, 0x7F, 0x51, 0xDF, + 0xB5, 0xDE, 0x01, 0xA8, 0x03, 0x40, 0x3C, 0x62, 0x21, 0x18, 0xB0, 0xDE, + 0xBA, 0x7F, 0x49, 0xDF, 0x8A, 0xDE, 0xBA, 0x7F, 0x97, 0xDF, 0x02, 0x40, + 0xD2, 0x4C, 0x31, 0x18, 0xA7, 0xDE, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, + 0x18, 0xE4, 0x00, 0xA0, 0xB7, 0x7F, 0xFB, 0xDF, 0xE0, 0xC8, 0x01, 0xD4, + 0x01, 0xA0, 0xB9, 0x7F, 0x71, 0xDF, 0x02, 0x40, 0xDD, 0x4C, 0x01, 0x18, + 0x00, 0xA8, 0xE0, 0xC0, 0x01, 0xD4, 0x01, 0xA8, 0x03, 0xB6, 0x03, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x19, 0xE4, 0x04, 0xA8, + 0xB8, 0x7F, 0x7E, 0xDF, 0xE1, 0xC8, 0x14, 0xD5, 0x03, 0xA8, 0xB8, 0x7F, + 0x54, 0xDF, 0x02, 0xA8, 0xB8, 0x7F, 0x76, 0xDF, 0x98, 0xE4, 0x00, 0x48, + 0x80, 0xBC, 0x00, 0xA0, 0x05, 0xD4, 0x89, 0xE4, 0x00, 0x40, 0x87, 0xBC, + 0x08, 0xE4, 0x06, 0xD4, 0x80, 0xE4, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, + 0x04, 0xA8, 0xEB, 0xDE, 0x24, 0xC9, 0x03, 0x40, 0x9F, 0xBC, 0x01, 0x39, + 0xDF, 0xC8, 0x11, 0x38, 0x02, 0xA8, 0xB8, 0x7F, 0x38, 0xDF, 0xB8, 0x7F, + 0xA3, 0xDF, 0x01, 0xA0, 0x80, 0xE4, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0xFD, 0xB6, 0x98, 0xE4, 0x0A, 0x40, 0xE2, 0x66, 0x18, 0x08, + 0xE0, 0xC8, 0x0A, 0xD5, 0x02, 0x40, 0xAB, 0x5A, 0x19, 0x08, 0xE0, 0xC8, + 0x0A, 0xD5, 0x02, 0x40, 0xAB, 0x5A, 0x29, 0x08, 0x03, 0xB6, 0x40, 0xB4, + 0x0A, 0x40, 0xE2, 0x66, 0x29, 0x08, 0x03, 0xB6, 0x40, 0xB4, 0xB9, 0x7F, + 0x1F, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x01, 0xA9, 0x02, 0x40, 0xAB, 0x5A, + 0x18, 0x19, 0x02, 0x40, 0xDD, 0x4C, 0x08, 0x09, 0x02, 0x40, 0xAB, 0x5A, + 0x28, 0x19, 0xA0, 0xE0, 0x98, 0xE4, 0x02, 0x40, 0xDB, 0x4C, 0x08, 0x08, + 0xE0, 0xC8, 0x0D, 0xD4, 0x02, 0x40, 0xDD, 0x4C, 0x09, 0x08, 0x02, 0x40, + 0xDD, 0x4C, 0x19, 0x18, 0x02, 0x40, 0xDD, 0x4C, 0x29, 0x18, 0x01, 0xA8, + 0x02, 0x40, 0xDB, 0x4C, 0x09, 0x18, 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, + 0x02, 0x40, 0xDB, 0x4C, 0x08, 0x09, 0x89, 0xE4, 0x00, 0x40, 0x82, 0xBC, + 0x0B, 0xD4, 0x02, 0x40, 0xDD, 0x4C, 0x00, 0x08, 0x02, 0x40, 0xDD, 0x4C, + 0x20, 0x18, 0x00, 0x40, 0x92, 0xBD, 0x02, 0x40, 0xDB, 0x4C, 0x00, 0x19, + 0x01, 0xB0, 0xA0, 0xE0, 0x98, 0xE4, 0x02, 0x40, 0xDB, 0x4C, 0x08, 0x08, + 0xE0, 0xC8, 0x0A, 0xD5, 0x02, 0x40, 0xDD, 0x4C, 0x29, 0x08, 0x02, 0x40, + 0xDD, 0x4C, 0x19, 0x18, 0x01, 0xA8, 0x02, 0x40, 0xDB, 0x4C, 0x09, 0x18, + 0xA0, 0xE0, 0x02, 0x40, 0xDB, 0x4C, 0x08, 0x09, 0x00, 0x40, 0x91, 0xBC, + 0x02, 0x40, 0xDB, 0x4C, 0x08, 0x19, 0xA0, 0xE0, 0x00, 0xA9, 0x02, 0x40, + 0xDB, 0x4C, 0x08, 0x19, 0xA0, 0xE0, 0x20, 0xB5, 0xFC, 0xB6, 0x98, 0xE4, + 0x0A, 0x40, 0xD0, 0x66, 0x90, 0xB8, 0x10, 0x40, 0x00, 0xA8, 0x83, 0x98, + 0x00, 0xA8, 0xB3, 0x7F, 0xCD, 0xDF, 0x04, 0xB6, 0x40, 0xB4, 0x20, 0xB5, + 0x1F, 0xB1, 0xFB, 0xB6, 0x48, 0xE4, 0x39, 0xE4, 0x00, 0xA2, 0x08, 0xA8, + 0xB8, 0x7F, 0x39, 0xDF, 0x08, 0xE4, 0xB9, 0x7F, 0xB5, 0xDF, 0xE0, 0xC8, + 0x20, 0xD4, 0x20, 0xB8, 0x0F, 0x40, 0x0F, 0xBF, 0xF4, 0xD5, 0x18, 0xE4, + 0x08, 0xA8, 0xB8, 0x7F, 0x2C, 0xDF, 0x08, 0xE4, 0xB9, 0x7F, 0xA8, 0xDF, + 0xE0, 0xC8, 0x13, 0xD4, 0x10, 0xB8, 0x0F, 0x40, 0x0F, 0xBF, 0xF4, 0xD5, + 0xE0, 0xC1, 0x0E, 0xDB, 0x83, 0x91, 0x84, 0x93, 0x84, 0xE4, 0x92, 0xE4, + 0x0C, 0xDF, 0xE0, 0xC8, 0x07, 0xD5, 0xB9, 0x7F, 0x6F, 0xDF, 0xE0, 0xC8, + 0xD9, 0xD4, 0x01, 0xA8, 0x01, 0xDE, 0x00, 0xA8, 0x05, 0xB6, 0x1F, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x5F, 0xB1, 0xFC, 0xB6, 0x28, 0xE4, 0x19, 0xE4, + 0x0E, 0x93, 0x04, 0x40, 0x22, 0x5B, 0x18, 0x80, 0xB8, 0x7F, 0x67, 0xDF, + 0x68, 0xE4, 0x0A, 0x40, 0xCF, 0x66, 0x32, 0x04, 0x02, 0x40, 0x07, 0xBF, + 0x46, 0xD5, 0xE5, 0xC1, 0x00, 0x40, 0x7A, 0xD5, 0x0F, 0xD8, 0xE4, 0xC1, + 0x00, 0x40, 0xBA, 0xD5, 0x82, 0xE4, 0x93, 0xE4, 0x04, 0x40, 0xED, 0xDF, + 0x08, 0xE4, 0x90, 0xE4, 0xE0, 0xC0, 0x27, 0xD4, 0x89, 0xE4, 0x04, 0xB6, + 0x5F, 0xB0, 0x40, 0xB4, 0x08, 0x40, 0x14, 0xBF, 0xF1, 0xD4, 0x0A, 0x40, + 0xCD, 0x66, 0x32, 0x08, 0x00, 0x50, 0x00, 0x40, 0x80, 0xBC, 0xEA, 0xD5, + 0x82, 0xE4, 0x93, 0xE4, 0x04, 0x40, 0x66, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, + 0xE8, 0xD5, 0x0A, 0x40, 0xDF, 0x66, 0x02, 0x14, 0x0A, 0x40, 0xDF, 0x66, + 0x12, 0x18, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x08, 0x00, 0x50, 0x00, 0x40, + 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x18, 0x90, 0xE4, 0xE0, 0xC0, + 0xD9, 0xD5, 0xB8, 0x7F, 0x28, 0xDF, 0x86, 0xBA, 0x68, 0xE4, 0x83, 0xE4, + 0x96, 0xE4, 0x04, 0x40, 0xD9, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0x9F, 0xD4, + 0x90, 0xE4, 0x89, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0xE5, 0xC1, + 0x00, 0x40, 0xAC, 0xD5, 0x4F, 0xD8, 0xE1, 0xC1, 0x00, 0x40, 0xD7, 0xD5, + 0xE4, 0xC1, 0xB8, 0xD4, 0x0A, 0x40, 0xCD, 0x66, 0x32, 0x08, 0x02, 0x40, + 0x80, 0xBC, 0xB2, 0xD5, 0x82, 0xE4, 0x93, 0xE4, 0x01, 0x40, 0x6D, 0xDF, + 0x08, 0xE4, 0xE0, 0xC8, 0xB0, 0xD5, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x09, + 0x89, 0xE4, 0x02, 0x40, 0x80, 0xBC, 0x05, 0xA1, 0x06, 0xD5, 0x19, 0xE4, + 0x71, 0xC1, 0x00, 0x40, 0x11, 0xBC, 0x01, 0x40, 0x1C, 0xB8, 0x81, 0xE4, + 0x0E, 0xC8, 0x82, 0xB8, 0x0A, 0x40, 0xD0, 0x66, 0x08, 0x14, 0x0A, 0x40, + 0xD0, 0x66, 0x18, 0x10, 0x01, 0xA9, 0x86, 0xC9, 0x0A, 0x40, 0xCE, 0x66, + 0x02, 0x08, 0x89, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x18, 0xB6, 0xDE, + 0x0A, 0x40, 0xCD, 0x66, 0x32, 0x08, 0x10, 0x40, 0x80, 0xBC, 0x84, 0xD5, + 0x82, 0xE4, 0x93, 0xE4, 0x01, 0x40, 0x83, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, + 0x82, 0xD5, 0x0A, 0x40, 0xD4, 0x66, 0x02, 0x14, 0x0A, 0x40, 0xD4, 0x66, + 0x12, 0x18, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x08, 0x10, 0x40, 0x80, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x18, 0x9A, 0xDE, 0x08, 0x40, 0x19, 0xBF, + 0x00, 0x40, 0x9F, 0xD5, 0x00, 0x40, 0x75, 0xDB, 0x08, 0x40, 0x1E, 0xBF, + 0xFF, 0x7F, 0x64, 0xD4, 0x0A, 0x40, 0xCD, 0x66, 0x32, 0x08, 0x00, 0x50, + 0x80, 0xBC, 0xFF, 0x7F, 0x5D, 0xD5, 0x82, 0xE4, 0x02, 0x40, 0xE6, 0xDF, + 0x08, 0xE4, 0xE0, 0xC8, 0xFF, 0x7F, 0x5B, 0xD5, 0x0A, 0x40, 0xD8, 0x66, + 0x02, 0x14, 0x0A, 0x40, 0xD8, 0x66, 0x12, 0x18, 0x0A, 0x40, 0xCE, 0x66, + 0x02, 0x08, 0x00, 0x50, 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x18, + 0xFF, 0x7F, 0x72, 0xDE, 0x0A, 0x40, 0xCD, 0x66, 0x32, 0x08, 0x08, 0x40, + 0x80, 0xBC, 0xFF, 0x7F, 0x3F, 0xD5, 0x82, 0xE4, 0x93, 0xE4, 0x00, 0x40, + 0xFA, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, 0xFF, 0x7F, 0x3C, 0xD5, 0x0A, 0x40, + 0xD3, 0x66, 0x22, 0x14, 0x0A, 0x40, 0xD3, 0x66, 0x32, 0x18, 0x0A, 0x40, + 0xCE, 0x66, 0x02, 0x08, 0x08, 0x40, 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, + 0x02, 0x18, 0xFF, 0x7F, 0x53, 0xDE, 0x01, 0xA8, 0xB7, 0x7F, 0x44, 0xDF, + 0xE0, 0xC8, 0x00, 0x40, 0x75, 0xD5, 0xB8, 0x7F, 0x54, 0xDF, 0x98, 0xE4, + 0xE0, 0xC8, 0xFF, 0x7F, 0x23, 0xD5, 0xB8, 0x7F, 0x8F, 0xDF, 0x00, 0xA9, + 0xE0, 0xC8, 0xFF, 0x7F, 0x1D, 0xD4, 0x90, 0xE4, 0xFF, 0x7F, 0x4D, 0xDE, + 0x0A, 0x40, 0xCD, 0x66, 0x32, 0x08, 0x04, 0x40, 0x80, 0xBC, 0xFF, 0x7F, + 0x0B, 0xD5, 0x82, 0xE4, 0x93, 0xE4, 0x01, 0x40, 0x0A, 0xDF, 0x08, 0xE4, + 0xE0, 0xC8, 0xFF, 0x7F, 0x08, 0xD5, 0x0A, 0x40, 0xD3, 0x66, 0x02, 0x14, + 0x0A, 0x40, 0xD3, 0x66, 0x12, 0x18, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x08, + 0x04, 0x40, 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x18, 0xFF, 0x7F, + 0x1F, 0xDE, 0xE6, 0xC1, 0xFE, 0x7F, 0xF0, 0xD4, 0x0A, 0x40, 0xCD, 0x66, + 0x32, 0x08, 0x20, 0x40, 0x80, 0xBC, 0xFE, 0x7F, 0xE9, 0xD5, 0x82, 0xE4, + 0x93, 0xE4, 0x01, 0x40, 0xFB, 0xDF, 0xFE, 0x7F, 0xE7, 0xDE, 0x0A, 0x40, + 0xCD, 0x66, 0x32, 0x08, 0x01, 0x40, 0x80, 0xBC, 0xFE, 0x7F, 0xDC, 0xD5, + 0x82, 0xE4, 0x93, 0xE4, 0x34, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, 0xFE, 0x7F, + 0xDA, 0xD5, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x08, 0x01, 0x40, 0x80, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x18, 0xFE, 0x7F, 0xF7, 0xDE, 0x0A, 0x40, + 0xCD, 0x66, 0x32, 0x08, 0x40, 0x40, 0x80, 0xBC, 0xFE, 0x7F, 0xC4, 0xD5, + 0x82, 0xE4, 0x93, 0xE4, 0x02, 0x40, 0x04, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, + 0xFE, 0x7F, 0xC1, 0xD5, 0x0A, 0x40, 0xD5, 0x66, 0x02, 0x14, 0x0A, 0x40, + 0xD5, 0x66, 0x12, 0x18, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x08, 0x40, 0x40, + 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x02, 0x18, 0xFE, 0x7F, 0xD8, 0xDE, + 0x83, 0x96, 0x82, 0xE4, 0x93, 0xE4, 0x03, 0x40, 0xC0, 0xDF, 0x08, 0xE4, + 0x84, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, 0x39, 0xE4, + 0x02, 0x40, 0xAC, 0x5A, 0x18, 0x08, 0xE0, 0xC8, 0x01, 0xD5, 0x01, 0xA8, + 0x03, 0x40, 0x3D, 0x62, 0x32, 0x18, 0x08, 0xE4, 0x0A, 0xC0, 0x02, 0xB8, + 0x03, 0x40, 0x3E, 0x62, 0x00, 0xB8, 0x08, 0xA8, 0xB6, 0x7F, 0x85, 0xDF, + 0x18, 0xE4, 0xB8, 0x7F, 0x01, 0xDF, 0x00, 0xA9, 0xE0, 0xC8, 0x04, 0xD5, + 0x89, 0xE4, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0x11, 0xC8, + 0x00, 0x40, 0x8F, 0xBC, 0x10, 0x38, 0x81, 0xE4, 0x09, 0xC8, 0x00, 0x40, + 0x83, 0xBC, 0x20, 0x38, 0x05, 0xC1, 0x00, 0x40, 0x11, 0xBC, 0x30, 0x31, + 0x01, 0xA8, 0x00, 0x38, 0xDF, 0xC3, 0x82, 0xE4, 0x93, 0xE4, 0x03, 0x40, + 0x60, 0xDF, 0x98, 0xE4, 0x89, 0xE4, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x03, 0xB1, 0x08, 0xE4, 0x05, 0x98, 0xE0, 0xC9, 0x14, 0xD5, 0xE0, 0xC8, + 0x14, 0xD5, 0x02, 0x40, 0x48, 0x88, 0xE0, 0xC8, 0x15, 0xD4, 0x10, 0x38, + 0x03, 0x40, 0xE9, 0x89, 0x10, 0x40, 0x90, 0xBF, 0x05, 0xD5, 0xE1, 0xC9, + 0x14, 0xD5, 0xE0, 0xC9, 0x02, 0xD4, 0x02, 0xA8, 0x20, 0x38, 0x00, 0xA8, + 0x30, 0x38, 0x03, 0xB0, 0xA0, 0xE0, 0x03, 0x40, 0xE9, 0x21, 0x10, 0x40, + 0x11, 0xBF, 0xEB, 0xD4, 0x20, 0x28, 0xE3, 0xC8, 0xF6, 0xD4, 0x02, 0xA8, + 0x20, 0x38, 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0x39, 0xEE, 0xDE, 0x20, 0xB5, + 0x0C, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0xB8, 0xE4, 0x69, 0xE4, 0x49, 0xE4, + 0x3F, 0x40, 0x4F, 0xB8, 0x28, 0xC4, 0x00, 0xA8, 0xE0, 0xC9, 0x2A, 0xDB, + 0x00, 0xAA, 0xA4, 0xBF, 0x26, 0xDA, 0x3F, 0x40, 0x6F, 0xBF, 0x28, 0xD8, + 0x26, 0xE4, 0x36, 0xE4, 0xCF, 0xC3, 0xFF, 0x7F, 0x30, 0xBC, 0x00, 0xA1, + 0x12, 0xBF, 0x0F, 0xDA, 0x01, 0xE4, 0x00, 0x40, 0x73, 0x64, 0x00, 0xB8, + 0x08, 0xA8, 0xB6, 0x7F, 0x16, 0xDF, 0x00, 0x38, 0xB7, 0x7F, 0x92, 0xDF, + 0xE0, 0xC8, 0x18, 0xD4, 0xC1, 0xC1, 0x12, 0xBF, 0xF1, 0xD9, 0x83, 0x93, + 0x8B, 0xE4, 0x0A, 0x40, 0xCF, 0x66, 0x3B, 0x09, 0x03, 0x40, 0x59, 0xDF, + 0xE0, 0xC8, 0x04, 0xD5, 0xC1, 0xCA, 0xA4, 0xBF, 0xDA, 0xD9, 0x86, 0xE4, + 0x04, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x40, 0x40, 0x00, 0xA3, + 0x23, 0xE4, 0xD9, 0xDE, 0x00, 0xA8, 0x04, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, + 0x40, 0xB4, 0x20, 0xB5, 0x5F, 0xB1, 0xFC, 0xB6, 0x68, 0xE4, 0x29, 0xE4, + 0x00, 0x40, 0x73, 0x64, 0x00, 0xA0, 0x49, 0xE4, 0x20, 0xA8, 0xB5, 0x7F, + 0xE8, 0xDF, 0x98, 0xE4, 0x62, 0xC8, 0x3F, 0x40, 0xFF, 0x7F, 0x1F, 0xBC, + 0x18, 0xBD, 0x89, 0xE4, 0x22, 0xC8, 0x3F, 0x40, 0x00, 0x70, 0x80, 0xBC, + 0xC0, 0x7F, 0xFF, 0x4F, 0x1F, 0xBC, 0x18, 0xBD, 0x21, 0xC9, 0x89, 0xE4, + 0xF0, 0x4F, 0x80, 0xBC, 0x0F, 0x70, 0x1F, 0xBC, 0x18, 0xBD, 0x41, 0xC9, + 0xF0, 0x7F, 0x10, 0xBC, 0x19, 0xBD, 0x00, 0x11, 0x20, 0xA8, 0xB5, 0x7F, + 0xCA, 0xDF, 0x98, 0xE4, 0x62, 0xC8, 0x3F, 0x40, 0xFF, 0x7F, 0x1F, 0xBC, + 0x18, 0xBD, 0x89, 0xE4, 0x22, 0xC8, 0x3F, 0x40, 0x00, 0x70, 0x80, 0xBC, + 0xC0, 0x7F, 0xFF, 0x4F, 0x1F, 0xBC, 0x18, 0xBD, 0x21, 0xC9, 0x89, 0xE4, + 0xF0, 0x4F, 0x80, 0xBC, 0x0F, 0x70, 0x1F, 0xBC, 0x18, 0xBD, 0x41, 0xC9, + 0xF0, 0x7F, 0x10, 0xBC, 0x19, 0xBD, 0x10, 0x11, 0x20, 0xA8, 0xB5, 0x7F, + 0xAC, 0xDF, 0x98, 0xE4, 0x62, 0xC8, 0x3F, 0x40, 0xFF, 0x7F, 0x1F, 0xBC, + 0x18, 0xBD, 0x89, 0xE4, 0x22, 0xC8, 0x3F, 0x40, 0x00, 0x70, 0x80, 0xBC, + 0xC0, 0x7F, 0xFF, 0x4F, 0x1F, 0xBC, 0x18, 0xBD, 0x21, 0xC9, 0x89, 0xE4, + 0xF0, 0x4F, 0x80, 0xBC, 0x0F, 0x70, 0x1F, 0xBC, 0x18, 0xBD, 0x41, 0xC9, + 0xF0, 0x7F, 0x10, 0xBC, 0x19, 0xBD, 0x20, 0x11, 0x20, 0xA8, 0xB5, 0x7F, + 0x8E, 0xDF, 0x98, 0xE4, 0x62, 0xC8, 0x3F, 0x40, 0xFF, 0x7F, 0x1F, 0xBC, + 0x18, 0xBD, 0x89, 0xE4, 0x22, 0xC8, 0x3F, 0x40, 0x00, 0x70, 0x80, 0xBC, + 0xC0, 0x7F, 0xFF, 0x4F, 0x1F, 0xBC, 0x18, 0xBD, 0x21, 0xC9, 0x89, 0xE4, + 0xF0, 0x4F, 0x80, 0xBC, 0x0F, 0x70, 0x1F, 0xBC, 0x18, 0xBD, 0x41, 0xC9, + 0xF0, 0x7F, 0x10, 0xBC, 0x19, 0xBD, 0x30, 0x11, 0xD0, 0xC2, 0xE0, 0xC2, + 0x60, 0xD9, 0xB6, 0x7F, 0xED, 0xDF, 0xE0, 0xC8, 0x5C, 0xD4, 0x04, 0xA3, + 0xE3, 0xC2, 0x2F, 0xDB, 0x20, 0xA8, 0xB5, 0x7F, 0x66, 0xDF, 0x98, 0xE4, + 0x62, 0xC8, 0x3F, 0x40, 0xFF, 0x7F, 0x1F, 0xBC, 0x18, 0xBD, 0x89, 0xE4, + 0x22, 0xC8, 0x3F, 0x40, 0x00, 0x70, 0x80, 0xBC, 0xC0, 0x7F, 0xFF, 0x4F, + 0x1F, 0xBC, 0x18, 0xBD, 0x21, 0xC9, 0x89, 0xE4, 0xF0, 0x4F, 0x80, 0xBC, + 0x0F, 0x70, 0x1F, 0xBC, 0x18, 0xBD, 0x41, 0xC9, 0xF0, 0x7F, 0x10, 0xBC, + 0x19, 0xBD, 0x83, 0xE4, 0x0A, 0xC8, 0x00, 0x40, 0x73, 0x64, 0x80, 0xB8, + 0x08, 0x11, 0xB6, 0x7F, 0xC3, 0xDF, 0x08, 0xE4, 0xE0, 0xC8, 0x31, 0xD4, + 0x0F, 0x40, 0x3F, 0xBF, 0x33, 0xD5, 0xC1, 0xC3, 0xDC, 0xC2, 0xE3, 0xC2, + 0xD1, 0xD8, 0xE0, 0xC2, 0x16, 0xDB, 0x82, 0xE4, 0x0E, 0xC8, 0xB5, 0x7F, + 0x34, 0xDF, 0x98, 0xE4, 0xE2, 0xC2, 0x48, 0xD5, 0x33, 0xD8, 0xE1, 0xC2, + 0x43, 0xD5, 0x83, 0xE4, 0x0A, 0xC8, 0x00, 0x40, 0x73, 0x64, 0x80, 0xB8, + 0x08, 0x11, 0xB6, 0x7F, 0xA5, 0xDF, 0x00, 0xA9, 0xE0, 0xC8, 0x14, 0xD4, + 0xC1, 0xC3, 0xE0, 0xC3, 0x0B, 0xDB, 0x0A, 0xC3, 0x83, 0x93, 0x86, 0xE4, + 0x0A, 0x40, 0xCF, 0x66, 0x36, 0x09, 0x02, 0x40, 0x6A, 0xDF, 0x98, 0xE4, + 0xE0, 0xC8, 0x06, 0xD5, 0x94, 0xE4, 0x89, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, + 0x40, 0xB4, 0x00, 0xA9, 0x89, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, + 0x40, 0x40, 0x00, 0xA8, 0x83, 0x98, 0x86, 0xE4, 0x0A, 0x40, 0xCF, 0x66, + 0x36, 0x09, 0x02, 0x40, 0x54, 0xDF, 0xE0, 0xC8, 0x1D, 0xD5, 0x30, 0xE4, + 0xDC, 0xC2, 0xC1, 0xDE, 0xE3, 0xC2, 0xCD, 0xD4, 0x48, 0xE0, 0x42, 0xC8, + 0x51, 0xE0, 0x18, 0xBD, 0x89, 0xE4, 0xF0, 0x4F, 0x80, 0xBC, 0x0F, 0x70, + 0x1F, 0xBC, 0x18, 0xBD, 0x22, 0xC9, 0x61, 0xC9, 0xF0, 0x7F, 0x10, 0xBC, + 0x19, 0xBD, 0xBD, 0xDE, 0x18, 0xE4, 0xBB, 0xDE, 0x48, 0xE0, 0x22, 0xC8, + 0x41, 0xE0, 0x18, 0xBD, 0x42, 0xC9, 0xF3, 0xDE, 0x98, 0xE4, 0xD2, 0xDE, + 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x0A, 0x40, 0xE0, 0x66, + 0x00, 0xB8, 0xB5, 0x7F, 0xF3, 0xDF, 0x80, 0x38, 0xB6, 0x7F, 0x54, 0xDF, + 0x00, 0xA9, 0xE1, 0xC8, 0x1B, 0xD5, 0x01, 0xA8, 0xB4, 0x7F, 0xCF, 0xDF, + 0x00, 0x40, 0x81, 0xBC, 0x42, 0xC8, 0x00, 0x09, 0xFF, 0x6F, 0x9F, 0xBC, + 0x98, 0xBD, 0x00, 0x19, 0x01, 0xA8, 0xB4, 0x7F, 0xC4, 0xDF, 0x00, 0x40, + 0x81, 0xBC, 0x46, 0xC8, 0x00, 0x09, 0xFF, 0x7F, 0xFF, 0x5F, 0x9F, 0xBC, + 0x98, 0xBD, 0x01, 0x40, 0x00, 0x40, 0x90, 0xBD, 0x00, 0x19, 0x01, 0xA9, + 0x89, 0xE4, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, + 0xFC, 0xB6, 0x38, 0xE4, 0x00, 0x40, 0x73, 0x64, 0x00, 0xA2, 0x00, 0xA1, + 0x02, 0xE4, 0x10, 0xA8, 0xB4, 0x7F, 0xA7, 0xDF, 0x00, 0x18, 0x35, 0x4C, + 0x80, 0xBF, 0x33, 0xDC, 0x10, 0xA8, 0xB4, 0x7F, 0xA0, 0xDF, 0x30, 0x18, + 0x35, 0x4C, 0x80, 0xBF, 0x2C, 0xDC, 0xC1, 0xC1, 0xC4, 0xC0, 0xE2, 0xC1, + 0xEE, 0xDB, 0x10, 0xA8, 0xB4, 0x7F, 0x95, 0xDF, 0x01, 0x40, 0xC2, 0x38, + 0x58, 0xE0, 0x00, 0xA0, 0x35, 0x4C, 0x80, 0xBF, 0x04, 0xDB, 0x80, 0xE4, + 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x10, 0xA8, 0xB4, 0x7F, 0x87, 0xDF, + 0x01, 0x40, 0xD2, 0x38, 0x58, 0xE0, 0x35, 0x4C, 0x80, 0xBF, 0xF3, 0xD8, + 0x20, 0xA8, 0xB4, 0x7F, 0x7E, 0xDF, 0x72, 0x18, 0x20, 0xA8, 0xB4, 0x7F, + 0x7A, 0xDF, 0x82, 0x18, 0x30, 0xA0, 0x83, 0x90, 0x83, 0xE4, 0x0A, 0x40, + 0xCF, 0x66, 0x33, 0x09, 0x01, 0x40, 0xC3, 0xDF, 0xE2, 0xDE, 0x00, 0xA0, + 0x80, 0xE4, 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x1C, 0xB3, + 0x5F, 0xB1, 0xFC, 0xB6, 0xC8, 0xE4, 0x00, 0x40, 0x73, 0x64, 0x00, 0xAB, + 0x33, 0x40, 0x08, 0xA8, 0x83, 0x98, 0x8B, 0xE4, 0x00, 0xA9, 0x61, 0x40, + 0x1C, 0xDF, 0xB5, 0x7F, 0x35, 0xDF, 0x0B, 0x18, 0x01, 0xA8, 0xB4, 0x7F, + 0x56, 0xDF, 0x4B, 0x38, 0x08, 0xE4, 0x40, 0xE0, 0x00, 0x40, 0x7B, 0xD4, + 0x01, 0xA8, 0xB4, 0x7F, 0x4E, 0xDF, 0x5B, 0x38, 0x01, 0xA8, 0xB4, 0x7F, + 0x4A, 0xDF, 0x6B, 0x38, 0x48, 0xE0, 0x00, 0x40, 0x7E, 0xD4, 0x08, 0xA8, + 0xB4, 0x7F, 0x43, 0xDF, 0x01, 0x40, 0x3B, 0x38, 0x48, 0xE4, 0x44, 0xE0, + 0xC7, 0xC4, 0x1F, 0x40, 0x48, 0xBC, 0x08, 0xA8, 0xB4, 0x7F, 0x39, 0xDF, + 0x01, 0x40, 0x4B, 0x38, 0x38, 0xE4, 0x43, 0xE0, 0xC7, 0xC3, 0x1F, 0x40, + 0x38, 0xBC, 0x60, 0xE4, 0xA0, 0xE4, 0x00, 0x40, 0x73, 0x64, 0x0D, 0xA2, + 0x08, 0xA8, 0xB4, 0x7F, 0x2A, 0xDF, 0x02, 0x38, 0x48, 0xE0, 0x02, 0x40, + 0x81, 0xBF, 0x00, 0x40, 0x89, 0xDC, 0xE0, 0xC8, 0x15, 0xD5, 0x00, 0xA1, + 0x0A, 0xE4, 0x06, 0xC0, 0x00, 0x40, 0x73, 0x64, 0x00, 0xB8, 0x84, 0xE4, + 0xB4, 0x7F, 0x19, 0xDF, 0x01, 0x40, 0x80, 0x38, 0x83, 0xE4, 0xB4, 0x7F, + 0x14, 0xDF, 0x0D, 0x40, 0xB0, 0x38, 0xC1, 0xC1, 0xC2, 0xC0, 0x02, 0x88, + 0x81, 0xBF, 0xF1, 0xDA, 0xC1, 0xC6, 0xC1, 0xC2, 0x02, 0x40, 0xA1, 0xB8, + 0xE2, 0xC6, 0xDA, 0xDB, 0x01, 0xA8, 0xB4, 0x7F, 0x04, 0xDF, 0x33, 0x40, + 0x4B, 0x38, 0x48, 0xE0, 0x4D, 0xD4, 0x00, 0xA6, 0xA6, 0xE4, 0x00, 0x40, + 0x8D, 0x64, 0x07, 0xA2, 0x08, 0xA8, 0xB3, 0x7F, 0xF8, 0xDF, 0x02, 0x38, + 0x48, 0xE0, 0x02, 0x40, 0x81, 0xBF, 0x58, 0xDC, 0xE0, 0xC8, 0x15, 0xD5, + 0x00, 0xA1, 0x0A, 0xE4, 0x06, 0xC0, 0x00, 0x40, 0x73, 0x64, 0x00, 0xB8, + 0x84, 0xE4, 0xB3, 0x7F, 0xE8, 0xDF, 0x1A, 0x40, 0xD0, 0x38, 0x83, 0xE4, + 0xB3, 0x7F, 0xE3, 0xDF, 0x27, 0x40, 0x80, 0x38, 0xC1, 0xC1, 0xC2, 0xC0, + 0x02, 0x88, 0x81, 0xBF, 0xF1, 0xDA, 0xC1, 0xC6, 0xC1, 0xC2, 0x02, 0x40, + 0xA1, 0xB8, 0xE2, 0xC6, 0xDB, 0xDB, 0x34, 0x40, 0x00, 0xA0, 0x83, 0x90, + 0x8C, 0xE4, 0x0A, 0x40, 0xCF, 0x66, 0x3C, 0x09, 0x01, 0x40, 0x1F, 0xDF, + 0x80, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0x01, 0xA8, + 0xB3, 0x7F, 0xC5, 0xDF, 0x7B, 0x38, 0x08, 0xA8, 0xB3, 0x7F, 0xC1, 0xDF, + 0x01, 0x40, 0x0B, 0x38, 0x08, 0xA8, 0xB3, 0x7F, 0xBC, 0xDF, 0x01, 0x40, + 0x1B, 0x38, 0x08, 0xA8, 0xB3, 0x7F, 0xB7, 0xDF, 0x01, 0x40, 0x2B, 0x38, + 0xFF, 0x7F, 0x6D, 0xDE, 0x04, 0xA8, 0xB3, 0x7F, 0xB0, 0xDF, 0x33, 0x40, + 0x5B, 0x38, 0x00, 0xA6, 0x26, 0xE4, 0x02, 0xE4, 0x00, 0x40, 0x8C, 0x64, + 0x0E, 0xB8, 0x02, 0xA1, 0xB4, 0x7F, 0xC0, 0xDF, 0x00, 0x38, 0xC1, 0xC0, + 0xDF, 0xC1, 0xE0, 0xC1, 0xF9, 0xDA, 0xC1, 0xC6, 0xC3, 0xC2, 0xE2, 0xC6, + 0xF0, 0xDB, 0x9B, 0xDE, 0x00, 0xA0, 0x80, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, + 0x1C, 0xB2, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, 0xFC, 0xB6, 0x18, 0xE4, + 0x00, 0x40, 0x73, 0x64, 0x00, 0xA0, 0x00, 0xA8, 0x80, 0x38, 0x90, 0x38, + 0x10, 0xA8, 0xB3, 0x7F, 0x88, 0xDF, 0x80, 0x38, 0x10, 0xA8, 0xB3, 0x7F, + 0x84, 0xDF, 0x90, 0x38, 0x10, 0xA0, 0x83, 0x90, 0x81, 0xE4, 0x0A, 0x40, + 0xCF, 0x66, 0x31, 0x09, 0x00, 0x40, 0xCD, 0xDF, 0x80, 0xE4, 0x04, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, + 0xA8, 0xE4, 0x19, 0xE4, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x08, 0xE0, 0xC8, + 0x04, 0xD4, 0x04, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x08, 0xA8, + 0xB3, 0x7F, 0x65, 0xDF, 0x08, 0xE4, 0x00, 0x40, 0x73, 0x64, 0x00, 0xA8, + 0x08, 0x10, 0xDF, 0xC1, 0x02, 0x40, 0xD1, 0x4C, 0x2A, 0x08, 0x07, 0x40, + 0x18, 0x88, 0x01, 0xA6, 0xE0, 0xC8, 0x33, 0xD4, 0x00, 0xA3, 0x01, 0xA4, + 0x36, 0xBF, 0x24, 0xDA, 0x00, 0x40, 0x73, 0x64, 0x04, 0xA2, 0x07, 0xDE, + 0xE1, 0xC0, 0x2B, 0xD5, 0xE2, 0xC0, 0x31, 0xD5, 0xC1, 0xC3, 0x36, 0xBF, + 0x19, 0xDA, 0xE0, 0xC0, 0xF7, 0xD4, 0x20, 0xA8, 0xB3, 0x7F, 0x43, 0xDF, + 0x02, 0x18, 0x20, 0xA8, 0xB3, 0x7F, 0x3F, 0xDF, 0x12, 0x18, 0x20, 0xA8, + 0xB3, 0x7F, 0x3B, 0xDF, 0x22, 0x18, 0x20, 0xA8, 0xB3, 0x7F, 0x37, 0xDF, + 0x32, 0x18, 0xC4, 0xC4, 0x01, 0x40, 0x20, 0xB8, 0xD0, 0xC1, 0xC1, 0xC3, + 0x36, 0xBF, 0xE7, 0xD9, 0xB4, 0x7F, 0xAC, 0xDF, 0xE0, 0xC8, 0x02, 0xD4, + 0xE0, 0xC1, 0x17, 0xD5, 0x00, 0xA8, 0x04, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, + 0x40, 0xB4, 0x03, 0xA6, 0xCB, 0xDE, 0x10, 0xA8, 0xB3, 0x7F, 0x1F, 0xDF, + 0x02, 0x18, 0xC1, 0xC4, 0xC4, 0xC2, 0xDE, 0xC1, 0xCF, 0xDE, 0x20, 0xA8, + 0xB3, 0x7F, 0x17, 0xDF, 0x02, 0x18, 0xC1, 0xC4, 0xC4, 0xC2, 0xDC, 0xC1, + 0xC7, 0xDE, 0x04, 0xE4, 0x0A, 0xC0, 0x83, 0x90, 0x8A, 0xE4, 0x0A, 0x40, + 0xCF, 0x66, 0x3A, 0x09, 0x5C, 0xDF, 0xE0, 0xC8, 0x9C, 0xD5, 0x80, 0xE4, + 0x9A, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x09, 0xE4, 0xE3, 0xC0, + 0x0C, 0xDB, 0x20, 0xA8, 0xB2, 0x7F, 0xFD, 0xDF, 0xDC, 0xC0, 0xE3, 0xC0, + 0xFA, 0xD8, 0xE0, 0xC0, 0x06, 0xDB, 0x08, 0xA8, 0xB2, 0x7F, 0xF5, 0xDF, + 0xDF, 0xC0, 0xE0, 0xC0, 0xFA, 0xD8, 0xB4, 0x7F, 0x6F, 0xDF, 0x00, 0xA9, + 0x98, 0xBA, 0x98, 0xBD, 0x7D, 0xC9, 0x01, 0xA8, 0x89, 0xBA, 0x03, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0x01, 0xB1, 0x0E, 0xC8, 0x00, 0xA0, 0x89, 0xBF, + 0x01, 0xDB, 0x01, 0xA0, 0x80, 0xE4, 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, + 0x07, 0xB1, 0xFD, 0xB6, 0x09, 0xE4, 0x0A, 0x98, 0x0E, 0xC0, 0x08, 0xBA, + 0x00, 0xA1, 0x23, 0xD5, 0xE9, 0xC0, 0x06, 0xDB, 0x01, 0xA8, 0xB2, 0x7F, + 0xD0, 0xDF, 0xDF, 0xC0, 0xE9, 0xC0, 0xFA, 0xD8, 0x80, 0xE4, 0xB2, 0x7F, + 0xF3, 0xDF, 0x98, 0xE4, 0x0F, 0x40, 0x0F, 0xA2, 0x82, 0xBC, 0x05, 0xD5, + 0xC1, 0xC1, 0x82, 0xE4, 0x84, 0xC8, 0x89, 0xBC, 0xFB, 0xD4, 0x09, 0xA9, + 0x89, 0xE4, 0x81, 0xBA, 0x80, 0xBF, 0x09, 0xDA, 0x29, 0xE4, 0x01, 0xA8, + 0xB2, 0x7F, 0xB7, 0xDF, 0xDF, 0xC1, 0x82, 0xE4, 0x81, 0xBA, 0x80, 0xBF, + 0xF8, 0xD9, 0x01, 0xA8, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x01, 0xB1, 0xFC, 0xB6, 0x08, 0xE4, 0x89, 0xE4, 0x09, 0x99, 0x83, 0x99, + 0x00, 0x40, 0x73, 0x64, 0x00, 0xA9, 0xAE, 0x7F, 0x2B, 0xDF, 0x98, 0xE4, + 0x0A, 0x40, 0xCF, 0x66, 0x30, 0x08, 0x89, 0xB8, 0x0A, 0x40, 0xCF, 0x66, + 0x30, 0x18, 0x89, 0xE4, 0x04, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0xFC, 0xB3, 0x5F, 0xB1, 0xF8, 0xB6, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x00, + 0x02, 0x40, 0xD1, 0x4C, 0x38, 0x0A, 0xC8, 0xE4, 0x02, 0x40, 0x93, 0x4D, + 0xCC, 0xB8, 0x02, 0x40, 0xAE, 0x5A, 0x84, 0xB8, 0x83, 0x98, 0x01, 0xA8, + 0x84, 0x98, 0x01, 0x40, 0x00, 0x29, 0xA6, 0xC8, 0x85, 0x98, 0x90, 0x88, + 0x05, 0x99, 0x89, 0xB8, 0xDF, 0xC8, 0x57, 0x40, 0x26, 0xDF, 0xE8, 0xE4, + 0xA0, 0x88, 0x05, 0x99, 0x89, 0xB8, 0xDF, 0xC8, 0x57, 0x40, 0x1F, 0xDF, + 0x86, 0x98, 0x02, 0x40, 0x5A, 0x88, 0xE0, 0xC8, 0x00, 0x40, 0xE8, 0xD5, + 0x00, 0xAF, 0x87, 0x9F, 0x03, 0x40, 0x1A, 0x88, 0xE0, 0xC8, 0x01, 0x40, + 0x0E, 0xD4, 0x02, 0x40, 0x7A, 0x24, 0x00, 0xA3, 0x03, 0xE4, 0x14, 0xE4, + 0x41, 0xE0, 0xDF, 0xC1, 0xE0, 0xC1, 0x0A, 0xDB, 0x9A, 0xE4, 0x02, 0x40, + 0x90, 0xB8, 0x89, 0x88, 0xC2, 0xC9, 0x08, 0xB8, 0xC1, 0xC0, 0xC1, 0xC3, + 0x13, 0xBF, 0xF9, 0xD8, 0x1E, 0xE4, 0x10, 0xBA, 0x00, 0xA8, 0xE0, 0xC1, + 0x00, 0x40, 0xC4, 0xDB, 0x84, 0xE4, 0x48, 0xE0, 0x06, 0xC8, 0x8A, 0xB8, + 0xDF, 0xC1, 0x01, 0x40, 0xF8, 0x31, 0x00, 0xA3, 0x03, 0xE4, 0x03, 0x40, + 0x0A, 0x26, 0x16, 0xE4, 0x41, 0xE0, 0xDF, 0xC1, 0xE0, 0xC1, 0x0A, 0xDB, + 0x9A, 0xE4, 0x06, 0x40, 0x90, 0xB8, 0x89, 0x88, 0xC2, 0xC9, 0x08, 0xB8, + 0xC1, 0xC0, 0xC1, 0xC3, 0x13, 0xBF, 0xF9, 0xD8, 0x06, 0x91, 0x10, 0xBA, + 0xE0, 0xC1, 0x01, 0x40, 0x1A, 0xDB, 0x96, 0xE4, 0x49, 0xE0, 0x89, 0xE4, + 0x06, 0xC8, 0x8A, 0xB8, 0xDF, 0xC1, 0x05, 0x40, 0xF8, 0x31, 0x00, 0xA1, + 0xE0, 0xC9, 0x42, 0xDB, 0x04, 0x98, 0xE1, 0xC8, 0x3F, 0xD4, 0x00, 0xA3, + 0xB3, 0xE4, 0x84, 0xE4, 0x48, 0xE0, 0xE1, 0xE4, 0x06, 0xCE, 0xE0, 0xC8, + 0x2B, 0xDB, 0xE1, 0xE4, 0x06, 0xCE, 0xDE, 0xE4, 0xDA, 0xB8, 0x06, 0x40, + 0xD0, 0xB8, 0x6A, 0xE4, 0x02, 0x40, 0x60, 0xB8, 0x2F, 0xE4, 0x0A, 0xC2, + 0x2C, 0xB8, 0x0F, 0xE4, 0x06, 0xC0, 0x0C, 0xB8, 0xD0, 0x3B, 0x07, 0x99, + 0x00, 0x42, 0xD0, 0x39, 0x86, 0x89, 0xC2, 0xC6, 0x89, 0xE4, 0xC1, 0xC8, + 0x00, 0x44, 0x32, 0x18, 0x8D, 0x88, 0xC1, 0xC8, 0x00, 0x48, 0x32, 0x18, + 0xB9, 0xB8, 0xC1, 0xCB, 0xC1, 0xCF, 0xC2, 0xC0, 0xC4, 0xC2, 0xC1, 0xC3, + 0x02, 0x40, 0x7A, 0x24, 0x84, 0xE4, 0x48, 0xE0, 0x83, 0xBF, 0xE6, 0xD8, + 0x03, 0x40, 0x0A, 0x26, 0xEA, 0xB8, 0x06, 0x40, 0x8E, 0x88, 0x07, 0x99, + 0x98, 0xB8, 0xC1, 0xC9, 0x87, 0x99, 0xC1, 0xC1, 0x86, 0xE4, 0x48, 0xE0, + 0x81, 0xBF, 0xBE, 0xD8, 0x8C, 0x3F, 0x02, 0x40, 0x7A, 0x88, 0x9C, 0x38, + 0x03, 0x40, 0x0A, 0x88, 0xAC, 0x38, 0x05, 0x99, 0xCC, 0x39, 0x00, 0xA3, + 0x02, 0x40, 0x7A, 0x24, 0xE0, 0xC4, 0x61, 0xD4, 0x00, 0xA3, 0x03, 0x40, + 0x0A, 0x26, 0xE0, 0xC6, 0x27, 0xD5, 0x2C, 0xE4, 0x00, 0xA1, 0x04, 0xE4, + 0x40, 0xE0, 0x80, 0xE4, 0x83, 0xE6, 0x0A, 0xC8, 0x8C, 0xB8, 0x00, 0x48, + 0x38, 0x08, 0x18, 0xBF, 0x16, 0xD6, 0x92, 0xE4, 0x80, 0x4C, 0x9C, 0xB8, + 0x03, 0xE6, 0x09, 0x10, 0xC4, 0xC9, 0xC1, 0xC1, 0xC4, 0xC2, 0x02, 0x40, + 0x7A, 0x24, 0x04, 0xE4, 0x40, 0xE0, 0x80, 0xE4, 0x83, 0xE6, 0x0A, 0xC8, + 0x8C, 0xB8, 0x00, 0x48, 0x38, 0x08, 0x18, 0xBF, 0xEF, 0xD7, 0x03, 0x40, + 0x0A, 0x26, 0xC1, 0xC3, 0x86, 0xE4, 0x48, 0xE0, 0x83, 0xBF, 0xDA, 0xD8, + 0x04, 0x98, 0xE0, 0xC8, 0x09, 0xD4, 0x03, 0x99, 0x29, 0x08, 0x00, 0x40, + 0x81, 0xBD, 0x29, 0x18, 0x09, 0x08, 0x10, 0x40, 0x80, 0xBD, 0x09, 0x18, + 0xAC, 0x28, 0x9C, 0x29, 0x89, 0xE6, 0x00, 0x41, 0x80, 0xBF, 0x0B, 0xDB, + 0x00, 0xA8, 0x84, 0x98, 0x03, 0x99, 0x29, 0x08, 0x00, 0x40, 0x81, 0xBD, + 0x29, 0x18, 0x09, 0x08, 0x20, 0x40, 0x80, 0xBD, 0x09, 0x18, 0x04, 0x98, + 0x08, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x04, 0x99, 0x8C, 0x39, + 0xDC, 0x38, 0x00, 0x42, 0xDC, 0x38, 0x00, 0x44, 0x3C, 0x1E, 0x06, 0x98, + 0x00, 0x48, 0x3C, 0x18, 0x9C, 0x39, 0xAC, 0x39, 0x05, 0x99, 0xCC, 0x39, + 0x00, 0xA3, 0x02, 0x40, 0x7A, 0x24, 0xE0, 0xC4, 0x9F, 0xD5, 0x2C, 0xE4, + 0x00, 0x44, 0x2C, 0xB8, 0x9C, 0xE4, 0x00, 0xA1, 0x02, 0x00, 0xC4, 0xC2, + 0x10, 0xBF, 0x0B, 0xD6, 0x89, 0xE4, 0x00, 0x4C, 0x8C, 0xB8, 0x08, 0x13, + 0xC4, 0xC8, 0xC1, 0xC1, 0xC4, 0xC9, 0x10, 0xBF, 0xFA, 0xD7, 0x02, 0x40, + 0x7A, 0x24, 0xC1, 0xC3, 0x84, 0xE4, 0x48, 0xE0, 0x83, 0xBF, 0xEB, 0xD8, + 0x85, 0xDE, 0x3F, 0xE4, 0x02, 0x40, 0x7A, 0x24, 0x94, 0xE4, 0x49, 0xE0, + 0xE0, 0xC9, 0x1A, 0xDB, 0x69, 0xE4, 0xBA, 0xE4, 0x02, 0x40, 0xB0, 0xB8, + 0xDF, 0xE4, 0x2E, 0xE4, 0x13, 0xE4, 0xC1, 0xC1, 0x82, 0xE4, 0x96, 0xE4, + 0x55, 0x40, 0xF1, 0xDF, 0x08, 0xE4, 0x8D, 0xE4, 0x96, 0xE4, 0x55, 0x40, + 0xEC, 0xDF, 0x08, 0xBA, 0xDF, 0xC0, 0x8B, 0x30, 0xC2, 0xCB, 0x31, 0xE4, + 0x2E, 0xB8, 0xDE, 0xB8, 0x61, 0xBF, 0xEC, 0xD8, 0x00, 0xA3, 0x03, 0x40, + 0x0A, 0x89, 0xE0, 0xC9, 0xFE, 0x7F, 0xCD, 0xDB, 0x69, 0xE4, 0xBA, 0xE4, + 0x06, 0x40, 0xB0, 0xB8, 0xD3, 0xE4, 0x06, 0x92, 0x13, 0xE4, 0xC1, 0xC1, + 0x82, 0xE4, 0x96, 0xE4, 0x55, 0x40, 0xD1, 0xDF, 0x08, 0xE4, 0x8D, 0xE4, + 0x96, 0xE4, 0x55, 0x40, 0xCC, 0xDF, 0x08, 0xBA, 0xDF, 0xC0, 0x8B, 0x30, + 0xC2, 0xCB, 0x31, 0xE4, 0x06, 0x98, 0x28, 0xB8, 0xD8, 0xB8, 0x61, 0xBF, + 0xEB, 0xD8, 0xFE, 0x7F, 0xB0, 0xDE, 0x00, 0xA9, 0x84, 0x99, 0xFE, 0x7F, + 0xE2, 0xDE, 0x03, 0xB1, 0x18, 0xE4, 0x05, 0x90, 0x0A, 0xC9, 0x98, 0xB8, + 0x00, 0x4C, 0x39, 0x08, 0x0A, 0xC0, 0x01, 0xB8, 0x80, 0x4C, 0x30, 0x09, + 0x89, 0xB8, 0x03, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, 0x28, 0xE4, 0x02, 0x40, + 0x93, 0x4D, 0x2C, 0xB8, 0x03, 0x40, 0x4E, 0x62, 0x84, 0xB8, 0x06, 0xC9, + 0x19, 0xE4, 0x12, 0xB8, 0xD1, 0x20, 0xA8, 0x30, 0x00, 0x42, 0xD1, 0x20, + 0xB8, 0x30, 0x06, 0xC9, 0x92, 0xB8, 0x00, 0x44, 0x39, 0x00, 0x88, 0x30, + 0x00, 0x48, 0x39, 0x09, 0x98, 0x39, 0x07, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, + 0xFD, 0xB6, 0x00, 0xA9, 0x04, 0x40, 0xA2, 0x59, 0x78, 0x39, 0x04, 0x40, + 0x35, 0x75, 0x08, 0x39, 0x02, 0x40, 0xA0, 0x4C, 0x80, 0xB8, 0xBB, 0x7F, + 0x83, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, + 0x18, 0xE4, 0x08, 0xE4, 0x02, 0x40, 0xC7, 0x4C, 0x0C, 0xB8, 0x04, 0xDE, + 0x81, 0xE4, 0x00, 0xA9, 0x00, 0x40, 0xB3, 0xDF, 0x13, 0x40, 0x30, 0x28, + 0xE0, 0xC8, 0xF8, 0xD8, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x5F, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, 0x69, 0xE4, 0x02, 0x40, 0xD1, 0x4C, + 0x28, 0x09, 0x38, 0xE4, 0x02, 0x40, 0xC7, 0x4C, 0x3C, 0xB8, 0x06, 0x40, + 0x19, 0x88, 0x89, 0xB8, 0x01, 0x40, 0x08, 0x24, 0x02, 0x40, 0x08, 0x29, + 0x02, 0x40, 0xDB, 0x4C, 0x12, 0x08, 0xDF, 0xC8, 0xE1, 0xC8, 0x05, 0xDD, + 0x02, 0x40, 0xAC, 0x5A, 0x32, 0x08, 0xE0, 0xC8, 0x2B, 0xD5, 0x00, 0xA4, + 0x13, 0x40, 0x33, 0x21, 0x89, 0xE4, 0x08, 0xE0, 0x81, 0xBF, 0x31, 0xD9, + 0x01, 0xE4, 0x00, 0xE0, 0x80, 0xE4, 0x0A, 0xC8, 0x83, 0xB8, 0x02, 0x40, + 0xAA, 0x5A, 0x32, 0x09, 0x08, 0x19, 0x03, 0xB8, 0x0F, 0x40, 0x40, 0x36, + 0x81, 0xE4, 0xC1, 0xC8, 0x13, 0x40, 0x33, 0x38, 0x12, 0xE4, 0x02, 0x40, + 0xA0, 0x4C, 0x10, 0xB8, 0x04, 0xE4, 0x00, 0xE0, 0x81, 0xE4, 0xBA, 0x7F, + 0xD6, 0xDF, 0x80, 0xBF, 0x06, 0xDB, 0x82, 0xE4, 0x01, 0xA9, 0x00, 0x40, + 0x68, 0xDF, 0xE0, 0xC8, 0xF5, 0xD4, 0x03, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, + 0x03, 0x40, 0x3E, 0x62, 0x22, 0x08, 0xE0, 0xC8, 0xD1, 0xDB, 0x48, 0xE4, + 0xDF, 0xC4, 0x13, 0x40, 0x33, 0x21, 0x89, 0xE4, 0x08, 0xE0, 0x81, 0xBF, + 0xCF, 0xDA, 0x00, 0x40, 0xED, 0x62, 0x04, 0xA8, 0xB9, 0x7F, 0x41, 0xDF, + 0x13, 0x40, 0x33, 0x21, 0xC7, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, + 0x28, 0xE4, 0x02, 0x40, 0xD1, 0x4C, 0x28, 0x09, 0x08, 0xE4, 0x02, 0x40, + 0xC7, 0x4C, 0x0C, 0xB8, 0x06, 0x40, 0x19, 0x88, 0x89, 0xB8, 0x01, 0x40, + 0x08, 0x21, 0x02, 0x40, 0x08, 0x29, 0x02, 0x40, 0xDB, 0x4C, 0x12, 0x08, + 0xDF, 0xC8, 0xE1, 0xC8, 0x18, 0xDD, 0x02, 0x40, 0xAC, 0x5A, 0x32, 0x08, + 0xE1, 0xC8, 0x13, 0xD5, 0x03, 0x40, 0x3E, 0x62, 0x22, 0x08, 0xE0, 0xC8, + 0x0F, 0xDB, 0x18, 0xE4, 0xDF, 0xC1, 0x39, 0xE4, 0x03, 0xE0, 0x13, 0x40, + 0x30, 0x20, 0x30, 0xBF, 0x0D, 0xDA, 0x00, 0x40, 0xED, 0x62, 0x04, 0xA8, + 0xB9, 0x7F, 0x0F, 0xDF, 0x07, 0xDE, 0x00, 0xA1, 0x39, 0xE4, 0x03, 0xE0, + 0x13, 0x40, 0x30, 0x20, 0x30, 0xBF, 0xF3, 0xD9, 0x02, 0xE4, 0x02, 0x40, + 0xA0, 0x4C, 0x00, 0xB8, 0x01, 0xE0, 0x80, 0xE4, 0xBA, 0x7F, 0x77, 0xDF, + 0x81, 0xBF, 0x05, 0xD8, 0x80, 0xE4, 0xBA, 0x7F, 0x88, 0xDF, 0x83, 0xBF, + 0x05, 0xDB, 0x82, 0xE4, 0x00, 0xA9, 0x05, 0xDF, 0xE0, 0xC8, 0xF1, 0xD4, + 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x1C, 0xB3, 0x5F, 0xB1, + 0xFD, 0xB6, 0xA8, 0xE4, 0xC9, 0xE4, 0x28, 0xE4, 0x02, 0x40, 0xC7, 0x4C, + 0x2C, 0xB8, 0x0A, 0x40, 0xCC, 0x66, 0x28, 0x04, 0x11, 0x40, 0x44, 0xE6, + 0x48, 0xB8, 0x03, 0x40, 0xA1, 0x68, 0x44, 0xB8, 0x13, 0x40, 0x32, 0x29, + 0x00, 0xA8, 0xE0, 0xC9, 0x5B, 0xDB, 0x00, 0xA6, 0x02, 0x03, 0x01, 0xA1, + 0xE1, 0xC9, 0x0D, 0xDB, 0x01, 0xA0, 0x0A, 0xC0, 0x02, 0xB8, 0x00, 0x08, + 0x83, 0xBF, 0x02, 0xDA, 0x38, 0xE4, 0x61, 0xE4, 0xC1, 0xC1, 0x01, 0xE4, + 0x00, 0xE0, 0x90, 0xBF, 0xF4, 0xD8, 0x06, 0xE4, 0x00, 0xE0, 0x80, 0xE4, + 0x0A, 0xC8, 0x82, 0xB8, 0x08, 0x08, 0x02, 0x40, 0xAB, 0x5A, 0x0A, 0x18, + 0x90, 0xE4, 0x92, 0xB8, 0x8A, 0xE4, 0x02, 0x40, 0xA0, 0x4C, 0x80, 0xB8, + 0x0F, 0x40, 0x49, 0x2B, 0x9B, 0xE4, 0xB9, 0x7F, 0xCB, 0xDF, 0x16, 0xE4, + 0x13, 0x40, 0x32, 0x26, 0x36, 0xE4, 0xDF, 0xC3, 0x0E, 0xDE, 0x80, 0xE4, + 0x0A, 0xC8, 0x82, 0xB8, 0x18, 0x09, 0x08, 0x19, 0x90, 0xE4, 0x92, 0xB8, + 0x0F, 0x40, 0x59, 0x28, 0x0F, 0x40, 0x49, 0x38, 0xC1, 0xC1, 0x01, 0xE4, + 0x00, 0xE0, 0x03, 0xBF, 0xF0, 0xD9, 0x86, 0xE4, 0xDF, 0xC8, 0x13, 0x40, + 0x32, 0x38, 0x02, 0x40, 0xAB, 0x5A, 0x0A, 0x09, 0x0A, 0x40, 0xE0, 0x66, + 0x2A, 0x08, 0x98, 0xBF, 0x20, 0xD5, 0xE0, 0xCC, 0x15, 0xD4, 0x1C, 0xE4, + 0x0C, 0xE4, 0x90, 0xE4, 0x0A, 0xC9, 0x94, 0xB8, 0x09, 0xE4, 0xCC, 0xC0, + 0x00, 0x08, 0x88, 0xB8, 0x1C, 0xD7, 0xC1, 0xC1, 0x01, 0xE4, 0x00, 0xE0, + 0x01, 0x40, 0x0E, 0xBF, 0xF2, 0xDB, 0x01, 0xA8, 0x03, 0xB6, 0x5F, 0xB0, + 0x1C, 0xB2, 0x40, 0xB4, 0x10, 0x40, 0x14, 0x1B, 0x02, 0x40, 0xAB, 0x5A, + 0x0A, 0x08, 0x10, 0x40, 0x24, 0x18, 0x01, 0xA8, 0xF3, 0xDE, 0x00, 0x60, + 0x00, 0x40, 0x00, 0xA8, 0x0A, 0x40, 0xE0, 0x66, 0x2A, 0x18, 0x01, 0xA8, + 0xEB, 0xDE, 0x00, 0x1B, 0x02, 0x40, 0xAB, 0x5A, 0x0A, 0x08, 0x08, 0x40, + 0x29, 0x18, 0x01, 0xA8, 0xE3, 0xDE, 0x01, 0xB1, 0x08, 0xE4, 0x02, 0x40, + 0xD1, 0x4C, 0x28, 0x09, 0x99, 0x28, 0x00, 0x42, 0x80, 0xBF, 0x08, 0xDD, + 0x0A, 0x40, 0xCE, 0x66, 0x10, 0x08, 0x00, 0x50, 0x80, 0xBD, 0x0A, 0x40, + 0xCE, 0x66, 0x10, 0x18, 0xA9, 0x28, 0x00, 0x42, 0x80, 0xBF, 0x09, 0xDD, + 0x0A, 0x40, 0xCE, 0x66, 0x10, 0x08, 0x00, 0x40, 0x00, 0x60, 0x80, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x10, 0x18, 0x07, 0x40, 0x19, 0x28, 0xE1, 0xC8, + 0x09, 0xD5, 0x0A, 0x40, 0xCE, 0x66, 0x10, 0x08, 0x01, 0x40, 0x00, 0x40, + 0x80, 0xBD, 0x0A, 0x40, 0xCE, 0x66, 0x10, 0x18, 0x06, 0x40, 0x79, 0x28, + 0xEA, 0xC8, 0x04, 0xDC, 0x07, 0x40, 0x09, 0x28, 0xEA, 0xC8, 0x09, 0xDD, + 0x0A, 0x40, 0xCE, 0x66, 0x10, 0x08, 0x02, 0x40, 0x00, 0x40, 0x80, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x10, 0x18, 0x06, 0x40, 0x39, 0x28, 0xDF, 0xC8, + 0x48, 0xE0, 0xE1, 0xC8, 0x05, 0xDD, 0x06, 0x40, 0x69, 0x28, 0x00, 0x40, + 0x83, 0xBC, 0x10, 0xD5, 0x06, 0x40, 0x49, 0x29, 0xFB, 0x7F, 0x9A, 0xBF, + 0x08, 0xDD, 0x0A, 0x40, 0xCE, 0x66, 0x20, 0x08, 0x00, 0x50, 0x80, 0xBD, + 0x0A, 0x40, 0xCE, 0x66, 0x20, 0x18, 0x00, 0xA8, 0x01, 0xB0, 0xA0, 0xE0, + 0x0A, 0x40, 0xCE, 0x66, 0x20, 0x08, 0x00, 0x48, 0x80, 0xBD, 0x0A, 0x40, + 0xCE, 0x66, 0x20, 0x18, 0xE7, 0xDE, 0x00, 0xA8, 0xA0, 0xE0, 0x20, 0xB5, + 0x07, 0xB1, 0xFD, 0xB6, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA1, 0x01, 0x09, + 0x01, 0xA2, 0x58, 0x40, 0x09, 0x12, 0x00, 0xA0, 0x82, 0x41, 0x09, 0x30, + 0x01, 0x09, 0x82, 0x41, 0x19, 0x30, 0x04, 0x40, 0x7D, 0xDF, 0x82, 0xE4, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x01, 0xA8, 0xA0, 0xE0, 0x20, 0xB5, + 0x03, 0xB1, 0xFC, 0xB6, 0x08, 0xE4, 0x00, 0x40, 0xA6, 0xDF, 0x18, 0xE4, + 0x00, 0x40, 0x2A, 0x64, 0x00, 0xA8, 0x83, 0x98, 0x80, 0xE4, 0x00, 0x40, + 0x22, 0x64, 0x0C, 0xA9, 0x04, 0x40, 0xB3, 0xDF, 0x08, 0xE4, 0xE1, 0xC1, + 0x04, 0xDD, 0x80, 0xE4, 0x04, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x00, 0x40, + 0xB1, 0xDF, 0x80, 0xE4, 0x04, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x03, 0xB1, 0xFB, 0xB6, 0x18, 0xE4, 0xB4, 0x7F, 0x32, 0xDF, 0x00, 0x40, + 0xBD, 0xDF, 0x00, 0x40, 0x22, 0x64, 0x08, 0xA8, 0x83, 0x98, 0x81, 0xE4, + 0x00, 0x40, 0x2A, 0x64, 0x0C, 0xA9, 0x05, 0x40, 0xA7, 0xDF, 0x08, 0xE4, + 0x9E, 0x7F, 0x84, 0xDF, 0x00, 0x40, 0x22, 0x64, 0x08, 0xA9, 0x09, 0x08, + 0xE0, 0xC8, 0x18, 0xD4, 0x00, 0x40, 0x36, 0x64, 0x00, 0xA8, 0x83, 0x98, + 0x00, 0x40, 0x30, 0x64, 0x08, 0xA8, 0x84, 0x98, 0x81, 0xE4, 0x00, 0x40, + 0x2B, 0x64, 0x08, 0xA1, 0x01, 0x09, 0x06, 0x40, 0x37, 0xDF, 0x08, 0xBD, + 0x00, 0x40, 0xE5, 0xDF, 0x00, 0xA8, 0xE1, 0xC0, 0x0D, 0xD5, 0x05, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0xA2, 0x7F, 0x50, 0xDF, 0x00, 0x40, 0x36, 0x64, + 0x00, 0xA8, 0xA8, 0x7F, 0x7E, 0xDF, 0xA0, 0x7F, 0xD0, 0xDF, 0xDE, 0xDE, + 0x80, 0xE4, 0x05, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, + 0xFD, 0xB6, 0x18, 0xE4, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x08, + 0x05, 0x77, 0x04, 0xA0, 0x00, 0x09, 0x74, 0x40, 0x28, 0x19, 0x00, 0x40, + 0x35, 0x64, 0x08, 0xA8, 0x98, 0x7F, 0x84, 0xDF, 0x08, 0xE4, 0x9A, 0x7F, + 0x4A, 0xDF, 0x01, 0x40, 0x00, 0xBF, 0x04, 0xD5, 0x01, 0xA8, 0x03, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0x00, 0x40, 0x35, 0x64, 0x08, 0xA9, + 0x06, 0x40, 0x88, 0xDF, 0x01, 0xA8, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0xFD, 0xB6, 0xE8, 0xC8, 0x17, 0xD5, 0x07, 0xD8, 0xE2, 0xC8, + 0x19, 0xD5, 0xE4, 0xC8, 0x0D, 0xD5, 0x00, 0xA8, 0x03, 0xB6, 0x40, 0xB4, + 0x01, 0x40, 0x80, 0xBF, 0x15, 0xD5, 0x00, 0x44, 0x80, 0xBF, 0xF7, 0xD4, + 0x89, 0xE4, 0xFF, 0x7F, 0x4E, 0xDF, 0xF4, 0xDE, 0x89, 0xE4, 0xFF, 0x7F, + 0x60, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x89, 0xE4, 0xFF, 0x7F, 0x7B, 0xDF, + 0x03, 0xB6, 0x40, 0xB4, 0x89, 0xE4, 0xFF, 0x7F, 0x58, 0xDF, 0xE6, 0xDE, + 0x89, 0xE4, 0xB4, 0xDF, 0xE3, 0xDE, 0x0F, 0xB1, 0x05, 0x77, 0x0C, 0xA1, + 0x00, 0x77, 0x0C, 0xA8, 0x08, 0x03, 0x83, 0xE4, 0x0A, 0xC8, 0x00, 0x40, + 0x60, 0x63, 0x88, 0xB8, 0x08, 0x02, 0x00, 0x40, 0x22, 0x64, 0x0C, 0xA8, + 0x08, 0x13, 0x00, 0x40, 0x23, 0x64, 0x00, 0xA0, 0x00, 0xA9, 0x05, 0xDE, + 0x01, 0x08, 0x00, 0x18, 0xC4, 0xC1, 0xC4, 0xC0, 0xC1, 0xC9, 0x92, 0xBF, + 0xF9, 0xD7, 0x83, 0xE4, 0x0F, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x00, 0x40, + 0x2A, 0x64, 0x00, 0xA9, 0x09, 0x08, 0x0C, 0x77, 0x0C, 0xA0, 0x00, 0x18, + 0x19, 0x08, 0x0D, 0x77, 0x00, 0xA0, 0x00, 0x18, 0x29, 0x09, 0x0D, 0x77, + 0x08, 0xA8, 0x08, 0x19, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA0, 0x00, 0x08, + 0x82, 0x41, 0x18, 0x39, 0x01, 0xB0, 0xA0, 0xE0, 0x0F, 0xB1, 0x05, 0x77, + 0x0C, 0xA1, 0x00, 0x40, 0x2A, 0x64, 0x0C, 0xA3, 0x03, 0xE4, 0x05, 0xA9, + 0x01, 0x08, 0x00, 0x18, 0xC4, 0xC1, 0xC4, 0xC0, 0xDF, 0xC9, 0xE0, 0xC9, + 0xF9, 0xDA, 0x07, 0x77, 0x04, 0xA1, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, + 0x08, 0x02, 0x82, 0x41, 0x02, 0x80, 0x04, 0x40, 0x0C, 0xE6, 0x02, 0xB8, + 0x75, 0x40, 0x00, 0xB8, 0x12, 0xA9, 0x01, 0x08, 0x00, 0x18, 0xC4, 0xC1, + 0xC4, 0xC0, 0xDF, 0xC9, 0xE0, 0xC9, 0xF9, 0xDA, 0x82, 0x41, 0x02, 0x89, + 0x63, 0x19, 0x82, 0x41, 0x02, 0x28, 0xC1, 0xC8, 0x82, 0x41, 0x02, 0x38, + 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA8, 0x08, 0x02, 0x82, 0x41, 0x12, 0x29, + 0x82, 0x41, 0x02, 0x28, 0x98, 0xBF, 0x07, 0xDC, 0x00, 0xA8, 0x82, 0x41, + 0x02, 0x38, 0x00, 0x40, 0xF6, 0x63, 0x08, 0xA9, 0x09, 0x02, 0x00, 0x40, + 0x2C, 0x64, 0x08, 0xA0, 0x82, 0xE4, 0x75, 0x40, 0x80, 0xB8, 0x0F, 0xA9, + 0x00, 0x18, 0xC4, 0xC0, 0xDF, 0xC9, 0x04, 0x40, 0x8C, 0xB8, 0xE0, 0xC9, + 0xF9, 0xDA, 0x0F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, + 0x00, 0x40, 0x30, 0x64, 0x08, 0xA8, 0x08, 0x09, 0x0A, 0x77, 0x08, 0xA0, + 0x00, 0x19, 0x18, 0x09, 0x0A, 0x77, 0x0C, 0xA0, 0x00, 0x19, 0x28, 0x09, + 0x0B, 0x77, 0x00, 0xA0, 0x00, 0x19, 0x38, 0x09, 0x0B, 0x77, 0x04, 0xA0, + 0x00, 0x19, 0x48, 0x09, 0x0B, 0x77, 0x08, 0xA0, 0x00, 0x19, 0x04, 0x40, + 0x08, 0x09, 0x0E, 0x77, 0x08, 0xA0, 0x00, 0x19, 0x58, 0x09, 0x0B, 0x77, + 0x0C, 0xA0, 0x00, 0x19, 0x68, 0x09, 0x0C, 0x77, 0x00, 0xA0, 0x00, 0x19, + 0x78, 0x09, 0x0C, 0x77, 0x04, 0xA0, 0x00, 0x19, 0x98, 0x09, 0x0C, 0x77, + 0x0C, 0xA0, 0x00, 0x19, 0xA8, 0x09, 0x0D, 0x77, 0x00, 0xA0, 0x00, 0x19, + 0xC8, 0x09, 0x0D, 0x77, 0x08, 0xA0, 0x00, 0x19, 0xD8, 0x09, 0x0D, 0x77, + 0x0C, 0xA0, 0x00, 0x19, 0xE8, 0x09, 0x0E, 0x77, 0x00, 0xA0, 0x00, 0x19, + 0x88, 0x09, 0x0C, 0x77, 0x08, 0xA0, 0x00, 0x19, 0x04, 0x40, 0x18, 0x08, + 0x03, 0x77, 0x04, 0xA9, 0x09, 0x18, 0xAA, 0x7F, 0xDF, 0xDF, 0x0D, 0x77, + 0x04, 0xA0, 0x00, 0x18, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x07, 0xB1, 0xF8, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0x0C, 0x40, 0xD8, 0xE1, + 0x04, 0x77, 0x04, 0xA0, 0x00, 0x09, 0x08, 0x19, 0x00, 0xA0, 0x84, 0x90, + 0x92, 0xE4, 0x0A, 0xC9, 0x85, 0x99, 0x01, 0xA9, 0x86, 0x99, 0x87, 0x90, + 0xAB, 0x7F, 0xDE, 0xDF, 0x00, 0x6F, 0x00, 0xA9, 0x05, 0xDE, 0x09, 0x08, + 0x01, 0x18, 0xC4, 0xC9, 0xC4, 0xC1, 0xC1, 0xC0, 0x02, 0xBF, 0xF9, 0xD7, + 0x08, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, 0xF8, 0xB6, + 0x00, 0x6F, 0x00, 0xA3, 0x18, 0xE4, 0x09, 0xE4, 0x00, 0xA2, 0x82, 0xE4, + 0x56, 0xC8, 0x00, 0x09, 0xFF, 0x43, 0x9F, 0xBC, 0x1E, 0xC9, 0x89, 0xBD, + 0x01, 0x09, 0x07, 0x40, 0x9F, 0xBC, 0x89, 0xBD, 0x03, 0x18, 0xC4, 0xC1, + 0xC4, 0xC0, 0xC4, 0xC3, 0xC1, 0xC2, 0x03, 0x40, 0x23, 0xBF, 0xED, 0xDB, + 0x0C, 0x40, 0xD8, 0xE1, 0x00, 0xA0, 0x84, 0x90, 0x0D, 0x40, 0x00, 0xA9, + 0x85, 0x99, 0x01, 0xA9, 0x86, 0x99, 0x87, 0x90, 0x04, 0x77, 0x04, 0xA0, + 0x00, 0x09, 0x40, 0x40, 0x90, 0xB8, 0x08, 0x19, 0xAB, 0x7F, 0x7A, 0xDF, + 0x08, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, 0xF8, 0xB6, + 0x18, 0xE4, 0x0C, 0x40, 0xD8, 0xE1, 0x00, 0xA0, 0x84, 0x90, 0x85, 0x99, + 0x01, 0xA9, 0x86, 0x99, 0x87, 0x90, 0x08, 0x11, 0xAB, 0x7F, 0x92, 0xDF, + 0x00, 0x6F, 0x00, 0xA8, 0x08, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x01, 0xB1, + 0x00, 0x48, 0x00, 0xA9, 0x04, 0x73, 0x08, 0xA0, 0x00, 0x08, 0x89, 0xBC, + 0x03, 0xD5, 0x04, 0x73, 0x0C, 0xA8, 0x08, 0x19, 0x03, 0x73, 0x00, 0xA0, + 0x00, 0x19, 0x03, 0x73, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x48, 0x80, 0xBC, + 0x00, 0x48, 0x80, 0xBF, 0xF8, 0xD5, 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, + 0x5F, 0xB1, 0xFC, 0xB6, 0x48, 0xE4, 0x69, 0xE4, 0x0E, 0x91, 0x02, 0x77, + 0x00, 0xA8, 0x08, 0x02, 0x02, 0x77, 0x04, 0xA9, 0x09, 0x08, 0x28, 0xB8, + 0x12, 0xBF, 0x34, 0xDC, 0x01, 0xE4, 0x04, 0xB8, 0x02, 0xBF, 0x26, 0xDD, + 0x02, 0xE4, 0x01, 0xBA, 0x30, 0xE4, 0xCF, 0xC3, 0xFF, 0x7F, 0x30, 0xBC, + 0x83, 0x91, 0x83, 0xE4, 0x96, 0xE4, 0xB3, 0x7F, 0xB0, 0xDF, 0x03, 0x77, + 0x04, 0xA8, 0x08, 0x12, 0xC6, 0xDF, 0x93, 0xE4, 0x90, 0xBA, 0x09, 0xE4, + 0x33, 0xD4, 0x02, 0x77, 0x00, 0xA8, 0x08, 0x01, 0x10, 0xB8, 0x43, 0xBF, + 0x13, 0xDD, 0x04, 0xE4, 0x03, 0xBA, 0x36, 0xB8, 0x83, 0x91, 0x80, 0xE4, + 0x93, 0xE4, 0xB3, 0x7F, 0x9A, 0xDF, 0x10, 0xB8, 0x81, 0xE4, 0x04, 0xB6, + 0x5F, 0xB0, 0x40, 0xB4, 0x83, 0x91, 0x84, 0xE4, 0x96, 0xE4, 0xB3, 0x7F, + 0x90, 0xDF, 0x10, 0xE4, 0x81, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, + 0x03, 0x77, 0x04, 0xA8, 0x08, 0x12, 0xA1, 0xDF, 0x01, 0xE4, 0x02, 0xBA, + 0xCF, 0xC0, 0xFF, 0x7F, 0x00, 0xBC, 0x02, 0x77, 0x00, 0xA9, 0x09, 0x08, + 0x83, 0x98, 0x80, 0xE4, 0x92, 0xE4, 0xB3, 0x7F, 0x7A, 0xDF, 0x02, 0x77, + 0x04, 0xA9, 0x09, 0x08, 0x18, 0xBA, 0xB6, 0xDE, 0x02, 0x77, 0x00, 0xA9, + 0x09, 0x08, 0x83, 0x98, 0x80, 0xE4, 0x92, 0xE4, 0xB3, 0x7F, 0x6D, 0xDF, + 0x02, 0x77, 0x00, 0xA8, 0x08, 0x01, 0x10, 0xB8, 0x43, 0xBF, 0xD8, 0xDD, + 0xC4, 0xDE, 0x20, 0xB5, 0x5F, 0xB1, 0xFC, 0xB6, 0x48, 0xE4, 0x69, 0xE4, + 0x0E, 0x91, 0x02, 0x77, 0x00, 0xA8, 0x08, 0x03, 0x02, 0x77, 0x04, 0xA9, + 0x09, 0x08, 0x38, 0xB8, 0x09, 0x02, 0x13, 0xBF, 0x4D, 0xDC, 0x03, 0x77, + 0x04, 0xA8, 0x08, 0x11, 0x02, 0xE4, 0x01, 0xBA, 0x03, 0x77, 0x00, 0xA9, + 0x09, 0x08, 0x80, 0xB8, 0x84, 0xBF, 0x3F, 0xD7, 0x03, 0x77, 0x00, 0xA9, + 0x09, 0x08, 0x81, 0xBF, 0x23, 0xDD, 0x03, 0x77, 0x00, 0xA9, 0x09, 0x08, + 0x81, 0xBA, 0x84, 0xBF, 0xFA, 0xD7, 0x01, 0xE4, 0x04, 0xB8, 0x03, 0xBF, + 0x26, 0xDD, 0x03, 0xE4, 0x01, 0xBA, 0x20, 0xE4, 0xCF, 0xC2, 0xFF, 0x7F, + 0x20, 0xBC, 0x83, 0x91, 0x82, 0xE4, 0x96, 0xE4, 0xB3, 0x7F, 0x31, 0xDF, + 0x82, 0xE4, 0x80, 0xBA, 0x08, 0xE4, 0x36, 0xD4, 0x02, 0x77, 0x00, 0xA8, + 0x08, 0x01, 0x10, 0xB8, 0x42, 0xBF, 0x3E, 0xDC, 0x81, 0xE4, 0x04, 0xB6, + 0x5F, 0xB0, 0x40, 0xB4, 0x03, 0x77, 0x00, 0xA9, 0x09, 0x08, 0x80, 0xB8, + 0x84, 0xBF, 0xDD, 0xD6, 0x03, 0x77, 0x00, 0xA9, 0x09, 0x08, 0x80, 0xB8, + 0x84, 0xBF, 0xF4, 0xD7, 0xD6, 0xDE, 0x83, 0x91, 0x84, 0xE4, 0x96, 0xE4, + 0xB3, 0x7F, 0x11, 0xDF, 0x10, 0xE4, 0x81, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, + 0x40, 0xB4, 0xFF, 0x7F, 0x24, 0xDF, 0xBE, 0xDE, 0x01, 0xE4, 0x03, 0xBA, + 0xCF, 0xC0, 0xFF, 0x7F, 0x00, 0xBC, 0x02, 0x77, 0x00, 0xA9, 0x09, 0x08, + 0x83, 0x98, 0x80, 0xE4, 0x93, 0xE4, 0xB2, 0x7F, 0xFC, 0xDF, 0x02, 0x77, + 0x04, 0xA9, 0x09, 0x08, 0x18, 0xBA, 0xA1, 0xDE, 0x02, 0x77, 0x00, 0xA9, + 0x09, 0x08, 0x83, 0x98, 0x80, 0xE4, 0x93, 0xE4, 0xB2, 0x7F, 0xEF, 0xDF, + 0x02, 0x77, 0x00, 0xA8, 0x08, 0x01, 0x10, 0xB8, 0x42, 0xBF, 0xC2, 0xDD, + 0x04, 0xE4, 0x02, 0xBA, 0x26, 0xB8, 0x83, 0x91, 0x80, 0xE4, 0x92, 0xE4, + 0xB2, 0x7F, 0xE1, 0xDF, 0x10, 0xB8, 0x81, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, 0xFC, 0xB6, 0x08, 0xE4, 0x19, 0xE4, + 0x0B, 0x99, 0x02, 0x77, 0x08, 0xA2, 0x02, 0x08, 0x11, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x08, 0xD5, 0x83, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0xFF, 0x7F, + 0x64, 0xDF, 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x83, 0x99, 0x80, 0xE4, + 0x91, 0xE4, 0xFE, 0x7F, 0xF4, 0xDF, 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0x0F, 0xB1, 0xFC, 0xB6, 0x28, 0xE4, 0x39, 0xE4, 0x0C, 0x90, + 0xB2, 0x7F, 0x78, 0xDF, 0x18, 0xE4, 0xE0, 0xC2, 0x05, 0xD5, 0xE1, 0xC2, + 0x18, 0xD5, 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x80, 0xE4, 0x01, 0x40, + 0x80, 0xB8, 0x00, 0x40, 0x5F, 0x64, 0x00, 0xA2, 0x02, 0x09, 0x20, 0x40, + 0x9F, 0xB8, 0xFF, 0x7F, 0x90, 0xBC, 0x83, 0x91, 0xB2, 0x7F, 0xA1, 0xDF, + 0x01, 0xB8, 0x80, 0xE4, 0xB2, 0x7F, 0x62, 0xDF, 0x04, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x83, 0x98, 0x80, 0xE4, 0x93, 0xE4, 0xBA, 0xDF, 0x18, 0xE4, + 0xB2, 0x7F, 0x58, 0xDF, 0xF5, 0xDE, 0x5F, 0xB1, 0x68, 0xE4, 0x39, 0xE4, + 0x00, 0xA1, 0x01, 0xE4, 0x01, 0xA2, 0x41, 0xE4, 0x98, 0xE4, 0x82, 0xE4, + 0x82, 0xC8, 0x83, 0xBC, 0x02, 0xD5, 0x09, 0x14, 0xC1, 0xC1, 0xC1, 0xC0, + 0xC4, 0xC9, 0xEF, 0xC0, 0xF6, 0xDB, 0x04, 0x40, 0x26, 0x13, 0x04, 0x40, + 0x06, 0x11, 0xFF, 0xA8, 0x04, 0x40, 0x16, 0x18, 0x5F, 0xB0, 0xA0, 0xE0, + 0x1F, 0xB1, 0x48, 0xE4, 0x00, 0xA1, 0x04, 0x40, 0x08, 0x03, 0xE0, 0xC3, + 0x0F, 0xDB, 0x08, 0xE4, 0x00, 0x08, 0xE0, 0xC8, 0x07, 0xD4, 0x01, 0xA2, + 0x92, 0xE4, 0x86, 0xC9, 0x04, 0x40, 0x24, 0x08, 0x89, 0xBC, 0x07, 0xD4, + 0xC1, 0xC1, 0xC4, 0xC0, 0x31, 0xBF, 0xF2, 0xD8, 0xFF, 0xA8, 0x1F, 0xB0, + 0xA0, 0xE0, 0x00, 0x12, 0x04, 0x40, 0x14, 0x11, 0x81, 0xE4, 0x1F, 0xB0, + 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, 0xE0, 0xC9, 0x08, 0xD9, 0x04, 0x40, + 0x08, 0x08, 0x89, 0xBF, 0x04, 0xDB, 0x0A, 0xC9, 0x90, 0xB8, 0x00, 0xA8, + 0x09, 0x18, 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, 0xE0, 0xC9, + 0x0A, 0xD9, 0x04, 0x40, 0x08, 0x08, 0x89, 0xBF, 0x06, 0xDB, 0x0A, 0xC9, + 0x90, 0xB8, 0x09, 0x08, 0xFF, 0x7F, 0x8D, 0xBC, 0x09, 0x18, 0x01, 0xB0, + 0xA0, 0xE0, 0x07, 0xB1, 0x00, 0xA2, 0x02, 0xE4, 0x04, 0x40, 0x08, 0x01, + 0xE0, 0xC1, 0x0A, 0xDB, 0x98, 0xE4, 0x09, 0x08, 0xC4, 0xC9, 0x00, 0x40, + 0x82, 0xBC, 0x01, 0xD5, 0xC1, 0xC2, 0xC1, 0xC0, 0x10, 0xBF, 0xF7, 0xD8, + 0x82, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x00, 0xA9, 0x04, 0x40, + 0x08, 0x00, 0xE0, 0xC0, 0x06, 0xDB, 0x19, 0xE4, 0x08, 0x11, 0xC4, 0xC8, + 0xC1, 0xC9, 0x09, 0xBF, 0xFB, 0xD8, 0x03, 0xB0, 0xA0, 0xE0, 0xE0, 0xC8, + 0x01, 0xD9, 0xA0, 0xE0, 0x68, 0xE0, 0xA0, 0xE0, 0x01, 0xB1, 0x08, 0xE4, + 0x89, 0xE4, 0x90, 0xBF, 0x01, 0xDB, 0x80, 0xE4, 0x01, 0xB0, 0xA0, 0xE0, + 0x01, 0xB1, 0x08, 0xE4, 0x89, 0xE4, 0x90, 0xBF, 0x01, 0xDA, 0x80, 0xE4, + 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x09, 0xE4, 0x04, 0x99, 0x98, 0xBF, + 0x04, 0xD9, 0x80, 0xE4, 0x90, 0xBF, 0x01, 0xD8, 0x89, 0xE4, 0x01, 0xB0, + 0xA0, 0xE0, 0x20, 0xB5, 0x0F, 0xB1, 0xFB, 0xB6, 0x28, 0xE4, 0x39, 0xE4, + 0x0F, 0x90, 0x10, 0x91, 0x83, 0x98, 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, + 0x51, 0x40, 0xC8, 0xDF, 0x88, 0xB8, 0x05, 0xD6, 0x82, 0xE4, 0x93, 0xE4, + 0x05, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x0D, 0x98, 0x0E, 0x99, 0x83, 0x98, + 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0x51, 0x40, 0x5A, 0xDF, 0xE0, 0xC8, + 0x05, 0xDB, 0x0D, 0x98, 0x0E, 0x99, 0x05, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x80, 0xE4, 0x91, 0xE4, 0x05, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x03, 0xB1, 0xFC, 0xB6, 0x08, 0xE4, 0x19, 0xE4, 0x88, 0xB8, 0x0B, 0xD7, + 0xE0, 0xC1, 0x15, 0xDB, 0x01, 0xB8, 0xDF, 0xC0, 0x80, 0xE4, 0x91, 0xE4, + 0x4F, 0x40, 0xAF, 0xDF, 0x04, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x00, 0x40, + 0xEE, 0x62, 0x0A, 0xA8, 0x83, 0x98, 0x00, 0x40, 0xEE, 0x62, 0x0F, 0xA8, + 0x5B, 0xA9, 0x57, 0x40, 0x46, 0xDF, 0xE0, 0xC1, 0xEB, 0xD8, 0x00, 0x40, + 0xF2, 0x62, 0x04, 0xA8, 0x83, 0x98, 0x00, 0x40, 0xEE, 0x62, 0x0F, 0xA8, + 0x5C, 0xA9, 0x57, 0x40, 0x3A, 0xDF, 0x01, 0xB8, 0xDF, 0xC0, 0x80, 0xE4, + 0x91, 0xE4, 0x4F, 0x40, 0x90, 0xDF, 0x04, 0xB6, 0x03, 0xB0, 0x40, 0xB4, + 0x03, 0xB1, 0x08, 0xE4, 0x00, 0xA1, 0x00, 0x50, 0x00, 0x40, 0x00, 0xA9, + 0x98, 0xBF, 0x05, 0xDD, 0x09, 0xC9, 0x98, 0xBF, 0xFD, 0xDC, 0xE0, 0xC9, + 0x0B, 0xD5, 0x81, 0xE4, 0x89, 0xB8, 0x80, 0xBF, 0x04, 0xDC, 0x08, 0xBA, + 0x89, 0xE4, 0x06, 0xC8, 0x18, 0xB8, 0x05, 0xC1, 0x09, 0xC9, 0xF5, 0xD4, + 0x81, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, 0x08, 0xE4, 0x19, 0xE4, + 0x00, 0xA2, 0xDF, 0xC0, 0xE0, 0xC0, 0x08, 0xD9, 0x01, 0xA9, 0x89, 0xE4, + 0x82, 0xC8, 0x81, 0xBC, 0x06, 0xD4, 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xDA, + 0x82, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, 0x20, 0xE4, 0x82, 0xE4, 0x07, 0xB0, + 0xA0, 0xE0, 0x01, 0xA9, 0xDF, 0xC8, 0x01, 0xDE, 0xC1, 0xC9, 0x05, 0xC8, + 0xFD, 0xD4, 0x89, 0xE4, 0xA0, 0xE0, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, + 0x09, 0xE4, 0x4F, 0x40, 0x4E, 0xDF, 0x80, 0xE6, 0x03, 0xB6, 0x01, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0x89, 0xB8, 0xDF, 0xC8, 0xF1, 0xDF, + 0x03, 0xB6, 0x40, 0xB4, 0x03, 0xB1, 0x18, 0xE4, 0x01, 0xA0, 0xB1, 0x44, + 0x28, 0x10, 0x00, 0xA8, 0x61, 0x18, 0xFF, 0xA9, 0x51, 0x19, 0xB0, 0x44, + 0x21, 0x18, 0xB0, 0x44, 0x01, 0x18, 0xB1, 0x44, 0x31, 0x18, 0xB2, 0x44, + 0x11, 0x18, 0xFE, 0xA9, 0x11, 0x19, 0xB2, 0x44, 0x21, 0x18, 0xB2, 0x44, + 0x31, 0x18, 0x81, 0x18, 0x71, 0x18, 0xB2, 0x44, 0x01, 0x18, 0x2B, 0x40, + 0x31, 0x18, 0x12, 0x45, 0x31, 0x18, 0x7B, 0x47, 0x01, 0x10, 0x08, 0xE4, + 0x81, 0xE4, 0xA5, 0x44, 0x84, 0xB8, 0x10, 0xA9, 0x08, 0x10, 0xC4, 0xC8, + 0xDF, 0xC9, 0xE0, 0xC9, 0xFB, 0xDA, 0x81, 0xE4, 0xA9, 0x44, 0x88, 0xB8, + 0x10, 0xA9, 0x08, 0x10, 0xC4, 0xC8, 0xDF, 0xC9, 0xE0, 0xC9, 0xFB, 0xDA, + 0x0F, 0x40, 0x41, 0x30, 0x39, 0x40, 0x11, 0x10, 0x81, 0xE4, 0x52, 0x40, + 0x88, 0xB8, 0xAC, 0x41, 0x01, 0x18, 0xB2, 0x41, 0x31, 0x10, 0xAA, 0x41, + 0x11, 0x10, 0xAA, 0x41, 0x21, 0x10, 0xAA, 0x41, 0x01, 0x10, 0xFF, 0xA8, + 0xB4, 0x41, 0x11, 0x18, 0x01, 0xA8, 0x03, 0xB0, 0xA0, 0xE0, 0x01, 0xA8, + 0xA0, 0xE0, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xED, 0xB6, 0x38, 0xE4, + 0x09, 0xE4, 0x1F, 0x9B, 0x89, 0xE4, 0x02, 0xA9, 0x0E, 0x40, 0xBB, 0xDF, + 0xE0, 0xC8, 0x00, 0x40, 0xDC, 0xD5, 0x2B, 0x40, 0x33, 0x09, 0x89, 0xE4, + 0x00, 0x40, 0x81, 0xBE, 0x00, 0x40, 0x81, 0xBC, 0x00, 0x40, 0xD7, 0xD5, + 0xA3, 0xE4, 0x2C, 0x40, 0xA0, 0xB8, 0x9A, 0xE4, 0x02, 0xA8, 0x83, 0x98, + 0x84, 0x9A, 0x89, 0xE4, 0x90, 0xE4, 0x06, 0x40, 0x90, 0xDF, 0x2B, 0x40, + 0x33, 0x02, 0x82, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x17, 0xD5, 0x82, 0xE4, + 0x00, 0x40, 0x82, 0xBC, 0x13, 0xD5, 0x00, 0x08, 0xE3, 0xC8, 0x10, 0xD5, + 0xE2, 0xC8, 0x0E, 0xD5, 0x93, 0xE4, 0xB6, 0x41, 0x90, 0xB8, 0x31, 0x43, + 0x13, 0x08, 0x83, 0x98, 0x8A, 0xE4, 0x02, 0x40, 0x8E, 0xDF, 0xB1, 0x44, + 0x13, 0x18, 0x2B, 0x40, 0x33, 0x02, 0x10, 0xDE, 0x1C, 0xA8, 0xB1, 0x44, + 0x13, 0x18, 0xA7, 0x41, 0x13, 0x09, 0x01, 0xA8, 0xA6, 0xC8, 0x28, 0xBD, + 0x30, 0x40, 0x23, 0x08, 0xE0, 0xC8, 0x02, 0xD5, 0x00, 0x40, 0x22, 0xBD, + 0x2B, 0x40, 0x33, 0x12, 0x2C, 0x40, 0x33, 0x06, 0x96, 0xE4, 0x03, 0x40, + 0x9F, 0xB8, 0x19, 0xC9, 0x23, 0x19, 0x2C, 0x40, 0x23, 0x04, 0x84, 0xE4, + 0x03, 0x40, 0x8F, 0xB8, 0x19, 0xC8, 0x33, 0x18, 0x09, 0xE4, 0x08, 0xE6, + 0x43, 0x10, 0x00, 0xA9, 0x01, 0xA1, 0x10, 0xBF, 0x05, 0xD6, 0xC1, 0xC9, + 0x81, 0xE4, 0xA6, 0xC8, 0x80, 0xBF, 0xFB, 0xD7, 0x93, 0x19, 0x00, 0x40, + 0x22, 0xBC, 0x00, 0x40, 0x6D, 0xD5, 0x93, 0xE4, 0x42, 0x40, 0x98, 0xB8, + 0x30, 0x40, 0x03, 0x08, 0x0E, 0x40, 0x15, 0xDF, 0xAD, 0x44, 0x33, 0x18, + 0x0D, 0x40, 0x1A, 0x08, 0xE0, 0xC8, 0x57, 0xD5, 0x0A, 0x09, 0x89, 0xE4, + 0x00, 0x41, 0x80, 0xBC, 0x19, 0xD4, 0x89, 0xE4, 0x00, 0x42, 0x80, 0xBC, + 0x15, 0xD4, 0x89, 0xE4, 0x00, 0x44, 0x80, 0xBC, 0x11, 0xD4, 0x89, 0xE4, + 0x00, 0x48, 0x80, 0xBC, 0x0D, 0xD4, 0x89, 0xE4, 0x08, 0x40, 0x00, 0x40, + 0x80, 0xBC, 0x08, 0xD4, 0x89, 0xE4, 0x10, 0x40, 0x00, 0x40, 0x80, 0xBC, + 0x03, 0xD4, 0x04, 0x40, 0x90, 0xBC, 0x39, 0xD5, 0xB1, 0x44, 0x33, 0x08, + 0x03, 0xE4, 0x15, 0x45, 0x08, 0xB8, 0xE0, 0xC8, 0x6F, 0xD5, 0x12, 0x40, + 0x1A, 0x08, 0x83, 0x98, 0x0E, 0x40, 0x2A, 0x08, 0x84, 0x98, 0x0E, 0x40, + 0x3A, 0x08, 0x85, 0x98, 0x06, 0x40, 0x2A, 0x08, 0x86, 0x98, 0x0F, 0x40, + 0x0A, 0x08, 0x87, 0x98, 0x8A, 0xE4, 0x0F, 0x40, 0x84, 0xB8, 0x88, 0x98, + 0x04, 0x40, 0x0A, 0x08, 0x89, 0x98, 0x8A, 0xE4, 0x16, 0x40, 0x88, 0xB8, + 0x8A, 0x98, 0x2A, 0x08, 0x8B, 0x98, 0x3A, 0x08, 0x8C, 0x98, 0x05, 0x40, + 0x0A, 0x08, 0x8D, 0x98, 0x11, 0x40, 0x2A, 0x08, 0x8E, 0x98, 0x11, 0x40, + 0x3A, 0x08, 0x8F, 0x98, 0x11, 0x40, 0x1A, 0x08, 0x90, 0x98, 0x48, 0x40, + 0xD8, 0xE1, 0x91, 0x98, 0x80, 0xE4, 0x12, 0x40, 0x2A, 0x09, 0x38, 0x40, + 0x86, 0xDF, 0x83, 0xE4, 0x0B, 0x40, 0xA5, 0xDF, 0xE0, 0xC8, 0x13, 0xD5, + 0x2C, 0x40, 0x33, 0x06, 0x2C, 0x40, 0x23, 0x04, 0x46, 0xE6, 0x09, 0x40, + 0x06, 0xA8, 0x94, 0xE4, 0x2F, 0x40, 0xA5, 0xDF, 0x0B, 0x18, 0x2B, 0x40, + 0x33, 0x08, 0x00, 0x40, 0x82, 0xBC, 0x1A, 0xD4, 0x2B, 0x18, 0x0B, 0x18, + 0x01, 0xA8, 0x13, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x00, 0x40, + 0x92, 0xBC, 0xFF, 0x7F, 0x25, 0xD5, 0x00, 0x08, 0xE3, 0xC8, 0xFF, 0x7F, + 0x21, 0xD5, 0xE2, 0xC8, 0xFF, 0x7F, 0x1E, 0xD5, 0x93, 0xE4, 0xB6, 0x41, + 0x90, 0xB8, 0xA3, 0xE4, 0x2C, 0x40, 0xA0, 0xB8, 0xFF, 0x7F, 0x1A, 0xDE, + 0x93, 0xE4, 0x42, 0x40, 0x98, 0xB8, 0xAD, 0x44, 0x33, 0x08, 0x83, 0x98, + 0x30, 0x40, 0x03, 0x08, 0x0D, 0x40, 0x9A, 0xDF, 0x2B, 0x18, 0x34, 0x40, + 0x13, 0x08, 0xD9, 0xDE, 0x80, 0xE4, 0x38, 0x40, 0x23, 0xDF, 0x8D, 0xDE, + 0x20, 0xB5, 0x3C, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0x18, 0xE4, 0xA9, 0xE4, + 0x12, 0x9D, 0x01, 0xAC, 0x39, 0x00, 0x00, 0xA3, 0xB8, 0xE4, 0x2C, 0x40, + 0xB0, 0xB8, 0x63, 0xE4, 0x80, 0xE4, 0x00, 0x40, 0x84, 0xBC, 0x04, 0xD4, + 0x80, 0xE4, 0x00, 0x40, 0x88, 0xBC, 0x51, 0xD5, 0x01, 0xA6, 0x00, 0xA4, + 0x20, 0xE4, 0x00, 0x40, 0x21, 0xBC, 0x0D, 0xD5, 0xB1, 0x44, 0x11, 0x09, + 0x89, 0xE4, 0x00, 0x40, 0x84, 0xBC, 0x43, 0xD4, 0x89, 0xE4, 0x00, 0x40, + 0x88, 0xBC, 0x3F, 0xD4, 0x01, 0x40, 0x90, 0xBC, 0x3C, 0xD4, 0x64, 0xBD, + 0x81, 0xE4, 0x15, 0x40, 0x01, 0xDF, 0xE0, 0xC6, 0x04, 0xD5, 0x80, 0xE4, + 0x00, 0x40, 0x82, 0xBC, 0x23, 0xD5, 0x81, 0xE4, 0x5A, 0x09, 0x0C, 0x40, + 0x40, 0xDF, 0x91, 0xE4, 0x2C, 0x40, 0x90, 0xB8, 0x83, 0x9A, 0x0A, 0x40, + 0xCD, 0xDF, 0x7A, 0x41, 0x2B, 0x08, 0xB2, 0x44, 0x11, 0x09, 0x89, 0xBF, + 0x29, 0xDD, 0xAD, 0x44, 0x31, 0x08, 0xE1, 0xC8, 0x25, 0xD5, 0x04, 0xA3, + 0xC1, 0xC9, 0xB2, 0x44, 0x11, 0x19, 0x15, 0x45, 0x11, 0x13, 0x00, 0x40, + 0x32, 0xBC, 0x0D, 0x13, 0x9C, 0xE4, 0x89, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, + 0x3C, 0xB2, 0x40, 0xB4, 0x42, 0xE4, 0xE0, 0xC2, 0xDA, 0xD4, 0x01, 0xA3, + 0x83, 0x93, 0x81, 0xE4, 0x90, 0xE4, 0x00, 0x40, 0xE4, 0xDF, 0x92, 0xE4, + 0xE0, 0xC8, 0xEF, 0xD5, 0x7B, 0x47, 0x01, 0x12, 0xE6, 0xDE, 0x01, 0xA4, + 0xC2, 0xDE, 0x80, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0xAC, 0xD5, 0xAA, 0xDE, + 0x81, 0xE4, 0x0C, 0x40, 0x8B, 0xDF, 0x98, 0xE4, 0xA5, 0x44, 0x01, 0x18, + 0xE0, 0xC8, 0xD7, 0xD5, 0x8A, 0xE4, 0x0F, 0x40, 0xC0, 0xDF, 0x20, 0xE4, + 0x00, 0x40, 0x22, 0xBC, 0x17, 0xD4, 0xE0, 0xC6, 0x1E, 0xD4, 0xE0, 0xC2, + 0xCC, 0xD5, 0x81, 0xE4, 0x9A, 0xE4, 0x15, 0x40, 0x16, 0xDF, 0xC8, 0xE4, + 0x51, 0x09, 0xE0, 0xC9, 0x03, 0xD9, 0x61, 0x08, 0xC1, 0xC8, 0x61, 0x18, + 0x01, 0xA8, 0x7B, 0x47, 0x01, 0x18, 0x98, 0xB8, 0x51, 0x19, 0x00, 0x40, + 0x32, 0xBD, 0xB9, 0xDE, 0x81, 0xE4, 0x9A, 0xE4, 0x14, 0x40, 0xE4, 0xDF, + 0xC8, 0xE4, 0x00, 0xA9, 0xE1, 0xC8, 0xB7, 0xD4, 0xE0, 0xDE, 0x00, 0xA4, + 0x83, 0x94, 0x81, 0xE4, 0x90, 0xE4, 0x00, 0x40, 0xA2, 0xDF, 0x94, 0xE4, + 0xE0, 0xC8, 0xAD, 0xD5, 0x01, 0xA3, 0x7B, 0x47, 0x01, 0x14, 0xD5, 0xDE, + 0x20, 0xB5, 0x1C, 0xB3, 0x5F, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, 0x29, 0xE4, + 0x12, 0x91, 0x13, 0x9B, 0xA8, 0xE4, 0x2C, 0x40, 0xA0, 0xB8, 0xA5, 0x44, + 0x08, 0x0C, 0x00, 0xA3, 0x15, 0x45, 0x18, 0x06, 0x46, 0xE4, 0x00, 0x40, + 0x42, 0xBC, 0x1D, 0xD5, 0x7A, 0x47, 0x38, 0x08, 0x31, 0x09, 0x89, 0xB8, + 0x7A, 0x47, 0x30, 0x18, 0x09, 0x40, 0x2A, 0x08, 0xE0, 0xC8, 0x2D, 0xD4, + 0x41, 0x08, 0xAE, 0x7F, 0xF1, 0xDF, 0x80, 0xE4, 0x01, 0xA9, 0x14, 0x40, + 0xFF, 0xDF, 0x7A, 0x47, 0x30, 0x09, 0x98, 0xB8, 0x7A, 0x47, 0x30, 0x19, + 0x82, 0xE4, 0x04, 0x40, 0x80, 0xBC, 0x53, 0xD4, 0x08, 0x40, 0x20, 0xBC, + 0x33, 0xD4, 0xAE, 0x7F, 0xCF, 0xDF, 0x38, 0xE4, 0x7A, 0x47, 0x30, 0x09, + 0x98, 0xB8, 0x7A, 0x47, 0x30, 0x19, 0xE0, 0xC4, 0x04, 0xD5, 0x0D, 0x40, + 0x1A, 0x08, 0xE0, 0xC8, 0x2E, 0xD4, 0xE1, 0xC6, 0x17, 0xD5, 0x83, 0x9B, + 0x80, 0xE4, 0x91, 0xE4, 0x29, 0x40, 0xBE, 0xDF, 0x01, 0xA8, 0x05, 0xB6, + 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0x91, 0xE4, 0x01, 0x40, 0x94, 0xB8, + 0x80, 0xE4, 0x0D, 0x40, 0x62, 0xDF, 0x31, 0x08, 0x83, 0x98, 0x83, 0xE4, + 0x93, 0xE4, 0xFC, 0x7F, 0x37, 0xDF, 0xC9, 0xDE, 0x12, 0x45, 0x30, 0x13, + 0x83, 0x9B, 0x80, 0xE4, 0x91, 0xE4, 0x29, 0x40, 0xA5, 0xDF, 0x01, 0xA8, + 0x05, 0xB6, 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0x01, 0xA8, 0x83, 0x98, + 0x25, 0xA8, 0x00, 0xA9, 0x24, 0x40, 0x36, 0xDF, 0xAE, 0x7F, 0x53, 0xDF, + 0xC4, 0xDE, 0x12, 0x45, 0x30, 0x08, 0x98, 0xB8, 0x80, 0xE4, 0x15, 0x45, + 0x88, 0xB8, 0x0E, 0xC9, 0x83, 0x99, 0x2C, 0x09, 0x84, 0x99, 0x21, 0x09, + 0x39, 0x40, 0x1B, 0xDF, 0x11, 0x08, 0xB2, 0x44, 0x00, 0x18, 0x00, 0xA8, + 0x12, 0x45, 0x30, 0x18, 0xBE, 0xDE, 0x01, 0xA8, 0x83, 0x98, 0x24, 0xA8, + 0x00, 0xA9, 0x24, 0x40, 0x19, 0xDF, 0xAE, 0x7F, 0x36, 0xDF, 0xA4, 0xDE, + 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x09, 0xE4, 0x22, 0x40, + 0x84, 0xB8, 0x09, 0x09, 0xFC, 0x7F, 0x27, 0xDF, 0x10, 0x08, 0x15, 0x45, + 0x01, 0x18, 0x01, 0xA8, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x1F, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x09, 0xE4, 0x0C, 0x94, 0x29, 0xE4, + 0x00, 0x40, 0x21, 0xBC, 0x00, 0xA3, 0xA5, 0x44, 0x08, 0x08, 0xE0, 0xC4, + 0x07, 0xD4, 0xE0, 0xC8, 0x05, 0xD5, 0x18, 0x08, 0xDF, 0xC8, 0xE1, 0xC8, + 0x01, 0xDC, 0x01, 0xA3, 0x80, 0xE4, 0x00, 0x40, 0x84, 0xBC, 0x34, 0xD4, + 0xE0, 0xC3, 0x2B, 0xD4, 0x80, 0xE4, 0x00, 0x40, 0x88, 0xBC, 0x3F, 0xD4, + 0xE0, 0xC3, 0x02, 0xD5, 0xE0, 0xC2, 0x49, 0xD4, 0x01, 0x40, 0x00, 0xBC, + 0x07, 0xD4, 0xE0, 0xC2, 0x12, 0xD5, 0xB1, 0x44, 0x11, 0x08, 0x01, 0x40, + 0x80, 0xBC, 0x0D, 0xD5, 0x81, 0xE4, 0x23, 0x40, 0x22, 0xDF, 0xB1, 0x44, + 0x11, 0x09, 0x89, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0x04, 0xD5, 0x01, 0x40, + 0x90, 0xBE, 0xB1, 0x44, 0x11, 0x19, 0x35, 0x40, 0x21, 0x08, 0xE0, 0xC8, + 0x02, 0xD5, 0xE0, 0xC4, 0x02, 0xD5, 0xAD, 0x7F, 0xAA, 0xDF, 0x01, 0xA8, + 0x03, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0xE0, 0xC2, 0xD3, 0xD5, 0xB1, 0x44, + 0x11, 0x08, 0x00, 0x40, 0x84, 0xBC, 0xCE, 0xD5, 0x81, 0xE4, 0x21, 0x40, + 0x40, 0xDF, 0xB1, 0x44, 0x11, 0x09, 0x89, 0xE4, 0x00, 0x40, 0x84, 0xBC, + 0xC5, 0xD5, 0x00, 0x40, 0x94, 0xBE, 0xB1, 0x44, 0x11, 0x19, 0x80, 0xE4, + 0x00, 0x40, 0x88, 0xBC, 0xC1, 0xD5, 0x81, 0xE4, 0x21, 0x40, 0xDA, 0xDF, + 0xB1, 0x44, 0x11, 0x09, 0x89, 0xE4, 0x00, 0x40, 0x88, 0xBC, 0xBC, 0xD5, + 0x00, 0x40, 0x98, 0xBE, 0xB1, 0x44, 0x11, 0x19, 0xB7, 0xDE, 0xB1, 0x44, + 0x11, 0x08, 0x00, 0x40, 0x88, 0xBC, 0xB2, 0xD5, 0xEC, 0xDE, 0x20, 0xB5, + 0xFC, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0x38, 0xE4, 0x69, 0xE4, 0x14, 0x9A, + 0x00, 0xAD, 0xE0, 0xCA, 0x01, 0x40, 0x53, 0xD4, 0x09, 0x09, 0x08, 0x19, + 0x89, 0xE4, 0x00, 0x40, 0x82, 0xBC, 0x01, 0x40, 0x9C, 0xD4, 0x89, 0xE4, + 0x00, 0x40, 0x84, 0xBC, 0x01, 0x40, 0xF9, 0xD4, 0x89, 0xE4, 0x00, 0x40, + 0x88, 0xBC, 0x0C, 0xD5, 0x04, 0x40, 0x36, 0x08, 0x04, 0x40, 0x33, 0x18, + 0x05, 0x40, 0x06, 0x08, 0x05, 0x40, 0x03, 0x18, 0x05, 0x40, 0x16, 0x08, + 0x05, 0x40, 0x13, 0x18, 0x89, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0x03, 0x40, + 0x28, 0xD4, 0x89, 0xE4, 0x02, 0x40, 0x80, 0xBC, 0x03, 0x40, 0x0D, 0xD4, + 0x89, 0xE4, 0x04, 0x40, 0x80, 0xBC, 0x04, 0xD5, 0x06, 0x40, 0x26, 0x08, + 0x06, 0x40, 0x23, 0x18, 0x89, 0xE4, 0x08, 0x40, 0x80, 0xBC, 0x08, 0xD5, + 0x06, 0x40, 0x36, 0x08, 0x06, 0x40, 0x33, 0x18, 0x07, 0x40, 0x16, 0x08, + 0x07, 0x40, 0x13, 0x18, 0x89, 0xE4, 0x10, 0x40, 0x80, 0xBC, 0x08, 0xD5, + 0x07, 0x40, 0x06, 0x08, 0x07, 0x40, 0x03, 0x18, 0x07, 0x40, 0x26, 0x08, + 0x07, 0x40, 0x23, 0x18, 0x89, 0xE4, 0x20, 0x40, 0x80, 0xBC, 0x08, 0xD5, + 0x07, 0x40, 0x36, 0x08, 0x07, 0x40, 0x33, 0x18, 0x08, 0x40, 0x06, 0x08, + 0x08, 0x40, 0x03, 0x18, 0x89, 0xE4, 0x40, 0x40, 0x80, 0xBC, 0x02, 0x40, + 0x50, 0xD4, 0x89, 0xE4, 0x00, 0x41, 0x80, 0xBC, 0x1B, 0xD5, 0x0D, 0x40, + 0x16, 0x08, 0x0D, 0x40, 0x13, 0x18, 0xE0, 0xC8, 0x01, 0x40, 0xF1, 0xD4, + 0x0D, 0x40, 0x23, 0x18, 0x0F, 0x40, 0x03, 0x18, 0x0D, 0x40, 0x33, 0x18, + 0x0E, 0x40, 0x03, 0x18, 0x0E, 0x40, 0x13, 0x18, 0xBB, 0x40, 0x08, 0xA8, + 0x0E, 0x40, 0x23, 0x18, 0x01, 0xA8, 0x0E, 0x40, 0x33, 0x18, 0x3F, 0xA8, + 0x7F, 0x41, 0x33, 0x18, 0x89, 0xE4, 0x00, 0x42, 0x80, 0xBC, 0x15, 0xD5, + 0x0D, 0x40, 0x13, 0x00, 0xE0, 0xC0, 0x01, 0x40, 0xC7, 0xD5, 0x11, 0x40, + 0x26, 0x08, 0x11, 0x40, 0x23, 0x18, 0x11, 0x40, 0x36, 0x08, 0x11, 0x40, + 0x33, 0x18, 0x12, 0x40, 0x06, 0x08, 0x12, 0x40, 0x03, 0x18, 0x11, 0x40, + 0x16, 0x08, 0x11, 0x40, 0x13, 0x18, 0x89, 0xE4, 0x10, 0x40, 0x00, 0x40, + 0x80, 0xBC, 0x08, 0xD5, 0x0D, 0x40, 0x13, 0x08, 0xE0, 0xC8, 0x02, 0xD5, + 0x12, 0x40, 0x26, 0x08, 0x12, 0x40, 0x23, 0x18, 0x89, 0xE4, 0x00, 0x44, + 0x80, 0xBC, 0x0F, 0xD5, 0x0D, 0x40, 0x13, 0x08, 0xE1, 0xC8, 0x01, 0x40, + 0xED, 0xD5, 0x00, 0xA0, 0x83, 0xE4, 0x0F, 0x40, 0x84, 0xB8, 0x03, 0xA2, + 0x08, 0x10, 0xC4, 0xC8, 0xDF, 0xC2, 0xE0, 0xC2, 0xFB, 0xDA, 0x89, 0xE4, + 0x80, 0x40, 0x00, 0x40, 0x80, 0xBC, 0x1C, 0xD5, 0x12, 0x40, 0x36, 0x08, + 0x12, 0x40, 0x33, 0x18, 0x13, 0x40, 0x06, 0x08, 0x13, 0x40, 0x03, 0x18, + 0x13, 0x40, 0x16, 0x08, 0x13, 0x40, 0x13, 0x18, 0x13, 0x40, 0x26, 0x08, + 0x13, 0x40, 0x23, 0x18, 0x13, 0x40, 0x36, 0x08, 0x13, 0x40, 0x33, 0x18, + 0x14, 0x40, 0x06, 0x08, 0x14, 0x40, 0x03, 0x18, 0x14, 0x40, 0x16, 0x08, + 0x14, 0x40, 0x13, 0x18, 0x89, 0xE4, 0x00, 0x41, 0x00, 0x40, 0x80, 0xBC, + 0x18, 0xD5, 0x14, 0x40, 0x26, 0x08, 0x14, 0x40, 0x23, 0x18, 0x14, 0x40, + 0x36, 0x08, 0x14, 0x40, 0x33, 0x18, 0x15, 0x40, 0x06, 0x08, 0x15, 0x40, + 0x03, 0x18, 0x15, 0x40, 0x16, 0x08, 0x15, 0x40, 0x13, 0x18, 0x15, 0x40, + 0x26, 0x08, 0x15, 0x40, 0x23, 0x18, 0x15, 0x40, 0x36, 0x08, 0x15, 0x40, + 0x33, 0x18, 0x89, 0xE4, 0x00, 0x48, 0x80, 0xBC, 0x0F, 0xD5, 0x0D, 0x40, + 0x13, 0x08, 0xE1, 0xC8, 0x01, 0x40, 0x87, 0xD5, 0x00, 0xA0, 0x83, 0xE4, + 0x10, 0x40, 0x84, 0xB8, 0x03, 0xA2, 0x08, 0x10, 0xC4, 0xC8, 0xDF, 0xC2, + 0xE0, 0xC2, 0xFB, 0xDA, 0x89, 0xE4, 0x08, 0x40, 0x00, 0x40, 0x80, 0xBC, + 0x08, 0xD5, 0x0D, 0x40, 0x13, 0x08, 0xE0, 0xC8, 0x02, 0xD5, 0x12, 0x40, + 0x16, 0x08, 0x12, 0x40, 0x13, 0x18, 0x89, 0xE4, 0x20, 0x40, 0x00, 0x40, + 0x80, 0xBC, 0x04, 0xD5, 0x7B, 0x41, 0x26, 0x08, 0x7B, 0x41, 0x23, 0x18, + 0x87, 0x41, 0x26, 0x00, 0xE0, 0xC0, 0x18, 0xD5, 0x01, 0x40, 0x00, 0x40, + 0x90, 0xBC, 0x14, 0xD5, 0x13, 0xE4, 0x80, 0x41, 0x14, 0xB8, 0x87, 0x41, + 0x13, 0x08, 0xE1, 0xC8, 0x02, 0x40, 0x49, 0xD5, 0x87, 0x41, 0x23, 0x10, + 0x00, 0x40, 0xD4, 0xBD, 0x01, 0xA8, 0x87, 0x41, 0x13, 0x18, 0x83, 0xE4, + 0x87, 0x41, 0x84, 0xB8, 0x06, 0x40, 0x31, 0x18, 0x87, 0x41, 0x36, 0x09, + 0xE0, 0xC9, 0x18, 0xD5, 0x03, 0x08, 0x02, 0x40, 0x00, 0x40, 0x80, 0xBC, + 0x13, 0xD5, 0x03, 0xE4, 0x80, 0x41, 0x04, 0xB8, 0x87, 0x41, 0x13, 0x08, + 0xE1, 0xC8, 0x02, 0x40, 0x38, 0xD5, 0x87, 0x41, 0x33, 0x19, 0x00, 0x40, + 0xD4, 0xBD, 0x01, 0xA8, 0x87, 0x41, 0x13, 0x18, 0x87, 0x41, 0x34, 0xB8, + 0x06, 0x40, 0x30, 0x13, 0x8D, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, + 0x40, 0xB4, 0x8D, 0xE4, 0xE1, 0xCA, 0xF9, 0xD4, 0x19, 0x04, 0x13, 0x14, + 0x84, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x02, 0x40, 0x02, 0xD4, 0x00, 0xA2, + 0xEA, 0xE4, 0x08, 0xAF, 0x0C, 0xDE, 0xCA, 0xC2, 0x8E, 0xE4, 0x8A, 0xC8, + 0x84, 0xBC, 0x04, 0xD5, 0x3B, 0x08, 0x4B, 0x09, 0x3A, 0x18, 0x4A, 0x19, + 0x2C, 0xE4, 0xE7, 0xCC, 0xE1, 0xDC, 0x82, 0xE4, 0x16, 0xC8, 0x08, 0xE4, + 0x06, 0xB8, 0xB0, 0xE4, 0x16, 0x40, 0xB8, 0xB8, 0x18, 0xE4, 0x13, 0xB8, + 0xA1, 0xE4, 0x16, 0x40, 0xA8, 0xB8, 0xC2, 0xE4, 0xC1, 0xCC, 0x8E, 0xE4, + 0xB2, 0xC8, 0x84, 0xBC, 0xE2, 0xD5, 0x0B, 0x08, 0x0A, 0x18, 0x2B, 0x08, + 0x2A, 0x18, 0x5B, 0x08, 0x5A, 0x18, 0x16, 0x40, 0x1C, 0xB8, 0x16, 0x40, + 0x0C, 0xB8, 0x83, 0x9F, 0x81, 0xE4, 0x90, 0xE4, 0x02, 0x40, 0x06, 0xDF, + 0xD8, 0xBD, 0x01, 0x40, 0x14, 0xB8, 0x01, 0x40, 0x04, 0xB8, 0x83, 0x9F, + 0x81, 0xE4, 0x90, 0xE4, 0x01, 0x40, 0xFC, 0xDF, 0xD8, 0xBD, 0xC4, 0xC1, + 0xC4, 0xC0, 0x83, 0x9F, 0x81, 0xE4, 0x90, 0xE4, 0x01, 0x40, 0xF4, 0xDF, + 0xD8, 0xBD, 0x13, 0x04, 0xBE, 0xDE, 0x83, 0xE4, 0x01, 0x40, 0x88, 0xB8, + 0x96, 0xE4, 0x01, 0x40, 0x98, 0xB8, 0x08, 0xA0, 0x83, 0x90, 0x01, 0x40, + 0xDA, 0xDF, 0xD8, 0xE4, 0x83, 0xE4, 0x01, 0x40, 0x8C, 0xB8, 0x96, 0xE4, + 0x01, 0x40, 0x9C, 0xB8, 0x83, 0x90, 0x01, 0x40, 0xD0, 0xDF, 0xD8, 0xBD, + 0x83, 0xE4, 0x02, 0x40, 0x80, 0xB8, 0x96, 0xE4, 0x02, 0x40, 0x90, 0xB8, + 0x83, 0x90, 0x01, 0x40, 0xC6, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, 0x02, 0x40, + 0x84, 0xB8, 0x96, 0xE4, 0x02, 0x40, 0x94, 0xB8, 0x83, 0x90, 0x01, 0x40, + 0xBC, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, 0x02, 0x40, 0x88, 0xB8, 0x96, 0xE4, + 0x02, 0x40, 0x98, 0xB8, 0x83, 0x90, 0x01, 0x40, 0xB2, 0xDF, 0xD8, 0xBD, + 0x83, 0xE4, 0x02, 0x40, 0x8C, 0xB8, 0x96, 0xE4, 0x02, 0x40, 0x9C, 0xB8, + 0x10, 0xA0, 0x83, 0x90, 0x01, 0x40, 0xA7, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, + 0x03, 0x40, 0x80, 0xB8, 0x96, 0xE4, 0x03, 0x40, 0x90, 0xB8, 0x83, 0x90, + 0x01, 0x40, 0x9D, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, 0x03, 0x40, 0x84, 0xB8, + 0x96, 0xE4, 0x03, 0x40, 0x94, 0xB8, 0x83, 0x90, 0x01, 0x40, 0xA0, 0xDF, + 0xD8, 0xBD, 0x83, 0xE4, 0x03, 0x40, 0x88, 0xB8, 0x96, 0xE4, 0x03, 0x40, + 0x98, 0xB8, 0x83, 0x90, 0x01, 0x40, 0x96, 0xDF, 0xD8, 0xBD, 0x03, 0x09, + 0x89, 0xE4, 0x00, 0x40, 0x84, 0xBC, 0xFE, 0x7F, 0x07, 0xD5, 0x13, 0xE4, + 0x04, 0x40, 0x18, 0xB8, 0x06, 0xE4, 0x04, 0x40, 0x08, 0xB8, 0x08, 0xA8, + 0x83, 0x98, 0x81, 0xE4, 0x90, 0xE4, 0x01, 0x40, 0x76, 0xDF, 0xD8, 0xBD, + 0x00, 0x08, 0x01, 0x18, 0x2A, 0xE4, 0x04, 0x40, 0x06, 0x08, 0xE0, 0xC8, + 0x2A, 0xD5, 0x02, 0xE4, 0x16, 0xC0, 0x10, 0xE4, 0x13, 0xB8, 0x06, 0xB8, + 0x16, 0x40, 0x30, 0x08, 0x16, 0x40, 0x31, 0x18, 0x17, 0x40, 0x10, 0x08, + 0x17, 0x40, 0x20, 0x09, 0x17, 0x40, 0x11, 0x18, 0x17, 0x40, 0x21, 0x19, + 0x16, 0x40, 0x20, 0x08, 0x16, 0x40, 0x21, 0x18, 0x17, 0x40, 0x00, 0x08, + 0x17, 0x40, 0x01, 0x18, 0x18, 0x40, 0x00, 0x08, 0x18, 0x40, 0x01, 0x18, + 0x18, 0x40, 0x10, 0x08, 0x18, 0x40, 0x11, 0x18, 0x17, 0x40, 0x30, 0x08, + 0x17, 0x40, 0x31, 0x18, 0xC1, 0xC2, 0x04, 0x40, 0x06, 0x08, 0x82, 0xBF, + 0xD6, 0xDC, 0x03, 0x09, 0xFD, 0x7F, 0xC6, 0xDE, 0x08, 0xA8, 0x11, 0x40, + 0x23, 0x18, 0x33, 0xA8, 0x11, 0x40, 0x33, 0x18, 0x0A, 0xA8, 0x12, 0x40, + 0x03, 0x18, 0x11, 0x40, 0x13, 0x10, 0xFE, 0x7F, 0x3C, 0xDE, 0x83, 0xE4, + 0x0D, 0x40, 0x88, 0xB8, 0x96, 0xE4, 0x0D, 0x40, 0x98, 0xB8, 0x10, 0xA0, + 0x83, 0x90, 0x01, 0x40, 0x2A, 0xDF, 0xD8, 0xBD, 0x0F, 0x40, 0x06, 0x08, + 0x0F, 0x40, 0x03, 0x18, 0x0D, 0x40, 0x36, 0x08, 0x0D, 0x40, 0x33, 0x18, + 0x0E, 0x40, 0x06, 0x08, 0x0E, 0x40, 0x03, 0x18, 0x0E, 0x40, 0x16, 0x08, + 0x0E, 0x40, 0x13, 0x18, 0x0E, 0x40, 0x26, 0x08, 0x0E, 0x40, 0x23, 0x18, + 0x0E, 0x40, 0x36, 0x08, 0x0E, 0x40, 0x33, 0x18, 0x7F, 0x41, 0x36, 0x08, + 0x7F, 0x41, 0x33, 0x18, 0x03, 0x09, 0xFD, 0x7F, 0xF9, 0xDE, 0x0F, 0x40, + 0x03, 0x08, 0xE2, 0xC8, 0xFE, 0x7F, 0x74, 0xD4, 0x13, 0xE4, 0x10, 0x40, + 0x14, 0xB8, 0x06, 0xE4, 0x10, 0x40, 0x04, 0xB8, 0x03, 0xA2, 0x00, 0x08, + 0xC4, 0xC0, 0x01, 0x18, 0xC4, 0xC1, 0xDF, 0xC2, 0xE0, 0xC2, 0xF9, 0xDA, + 0xFE, 0x7F, 0x6E, 0xDE, 0x0F, 0x40, 0x03, 0x08, 0xE2, 0xC8, 0xFE, 0x7F, + 0x0E, 0xD4, 0x13, 0xE4, 0x0F, 0x40, 0x14, 0xB8, 0x06, 0xE4, 0x0F, 0x40, + 0x04, 0xB8, 0x03, 0xA2, 0x00, 0x08, 0xC4, 0xC0, 0x01, 0x18, 0xC4, 0xC1, + 0xDF, 0xC2, 0xE0, 0xC2, 0xF9, 0xDA, 0xFE, 0x7F, 0x08, 0xDE, 0x83, 0xE4, + 0x08, 0x40, 0x88, 0xB8, 0x96, 0xE4, 0x08, 0x40, 0x98, 0xB8, 0x08, 0xA1, + 0x83, 0x91, 0x00, 0x40, 0xD6, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, 0x08, 0x40, + 0x8C, 0xB8, 0x96, 0xE4, 0x08, 0x40, 0x9C, 0xB8, 0x83, 0x91, 0x00, 0x40, + 0xCC, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, 0x09, 0x40, 0x84, 0xB8, 0x96, 0xE4, + 0x09, 0x40, 0x94, 0xB8, 0x83, 0x91, 0x00, 0x40, 0xC2, 0xDF, 0xD8, 0xBD, + 0x83, 0xE4, 0x09, 0x40, 0x88, 0xB8, 0x96, 0xE4, 0x09, 0x40, 0x98, 0xB8, + 0x10, 0xA0, 0x83, 0x90, 0x00, 0x40, 0xB7, 0xDF, 0xD8, 0xBD, 0x09, 0x40, + 0x36, 0x08, 0x09, 0x40, 0x33, 0x18, 0x0A, 0x40, 0x06, 0x08, 0x0A, 0x40, + 0x03, 0x18, 0x0A, 0x40, 0x16, 0x08, 0x0A, 0x40, 0x13, 0x18, 0x0A, 0x40, + 0x26, 0x08, 0x0A, 0x40, 0x23, 0x18, 0x0A, 0x40, 0x36, 0x08, 0x0A, 0x40, + 0x33, 0x18, 0x0B, 0x40, 0x06, 0x08, 0x0B, 0x40, 0x03, 0x18, 0x83, 0xE4, + 0x0B, 0x40, 0x84, 0xB8, 0x96, 0xE4, 0x0B, 0x40, 0x94, 0xB8, 0x83, 0x90, + 0x00, 0x40, 0x95, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, 0x0B, 0x40, 0x88, 0xB8, + 0x96, 0xE4, 0x0B, 0x40, 0x98, 0xB8, 0x83, 0x90, 0x00, 0x40, 0x8B, 0xDF, + 0xD8, 0xBD, 0x83, 0xE4, 0x0B, 0x40, 0x8C, 0xB8, 0x96, 0xE4, 0x0B, 0x40, + 0x9C, 0xB8, 0x83, 0x90, 0x00, 0x40, 0x8E, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, + 0x0C, 0x40, 0x80, 0xB8, 0x96, 0xE4, 0x0C, 0x40, 0x90, 0xB8, 0x83, 0x90, + 0x00, 0x40, 0x84, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, 0x0C, 0x40, 0x84, 0xB8, + 0x96, 0xE4, 0x0C, 0x40, 0x94, 0xB8, 0x83, 0x90, 0x00, 0x40, 0x6D, 0xDF, + 0xD8, 0xBD, 0x83, 0xE4, 0x0C, 0x40, 0x88, 0xB8, 0x96, 0xE4, 0x0C, 0x40, + 0x98, 0xB8, 0x83, 0x91, 0x64, 0xDF, 0xD8, 0xBD, 0x0C, 0x40, 0x36, 0x08, + 0x0C, 0x40, 0x33, 0x18, 0x0D, 0x40, 0x06, 0x08, 0x0D, 0x40, 0x03, 0x18, + 0x89, 0x41, 0x36, 0x08, 0x89, 0x41, 0x33, 0x18, 0x03, 0x09, 0xFD, 0x7F, + 0x24, 0xDE, 0x83, 0xE4, 0x06, 0x40, 0x80, 0xB8, 0x96, 0xE4, 0x06, 0x40, + 0x90, 0xB8, 0x08, 0xA0, 0x83, 0x90, 0x4B, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, + 0x06, 0x40, 0x84, 0xB8, 0x96, 0xE4, 0x06, 0x40, 0x94, 0xB8, 0x83, 0x90, + 0x42, 0xDF, 0xD8, 0xBD, 0x03, 0x09, 0xFC, 0x7F, 0xDD, 0xDE, 0x83, 0xE4, + 0x05, 0x40, 0x88, 0xB8, 0x96, 0xE4, 0x05, 0x40, 0x98, 0xB8, 0x08, 0xA0, + 0x83, 0x90, 0x35, 0xDF, 0xD8, 0xBD, 0x83, 0xE4, 0x05, 0x40, 0x8C, 0xB8, + 0x96, 0xE4, 0x05, 0x40, 0x9C, 0xB8, 0x83, 0x90, 0x2C, 0xDF, 0xD8, 0xBD, + 0x03, 0x09, 0xFC, 0x7F, 0xC2, 0xDE, 0x83, 0xE4, 0x04, 0x40, 0x80, 0xB8, + 0x04, 0x40, 0x90, 0xB8, 0x08, 0xA0, 0x83, 0x90, 0x20, 0xDF, 0xD8, 0xE4, + 0x16, 0x40, 0x16, 0x08, 0x16, 0x40, 0x13, 0x18, 0x13, 0x04, 0xFD, 0x7F, + 0xEE, 0xDE, 0x83, 0xE4, 0x87, 0x41, 0x88, 0xB8, 0x96, 0xE4, 0x87, 0x41, + 0x98, 0xB8, 0x04, 0xA0, 0x83, 0x90, 0x0F, 0xDF, 0xD8, 0xBD, 0xFD, 0x7F, + 0xAF, 0xDE, 0x83, 0xE4, 0x87, 0x41, 0x8C, 0xB8, 0x87, 0x41, 0x6C, 0xB8, + 0x04, 0xA9, 0x83, 0x99, 0x96, 0xE4, 0x03, 0xDF, 0xD8, 0xBD, 0xFD, 0x7F, + 0xC0, 0xDE, 0x07, 0xB1, 0x28, 0xE4, 0x06, 0x90, 0x08, 0x08, 0x09, 0x09, + 0x00, 0xA1, 0x89, 0xBF, 0x02, 0xD5, 0x02, 0x19, 0x10, 0xE4, 0x81, 0xE4, + 0x07, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, 0x28, 0xE4, 0x06, 0x90, 0x08, 0x08, + 0x09, 0x09, 0x00, 0xA1, 0x89, 0xBF, 0x02, 0xD5, 0x02, 0x19, 0x10, 0xE4, + 0x81, 0xE4, 0x07, 0xB0, 0xA0, 0xE0, 0x1F, 0xB1, 0x38, 0xE4, 0x49, 0xE4, + 0x04, 0x40, 0x28, 0x08, 0x0A, 0xC8, 0x98, 0xE4, 0x00, 0x40, 0x61, 0x63, + 0x98, 0xB8, 0x09, 0x00, 0x00, 0x40, 0xF6, 0x61, 0x80, 0xB8, 0x08, 0x09, + 0x04, 0x40, 0x03, 0x19, 0x01, 0xA8, 0x04, 0x40, 0x13, 0x18, 0x00, 0xA2, + 0x29, 0xBF, 0x25, 0xD6, 0x13, 0xE4, 0x16, 0x40, 0x18, 0xB8, 0xC4, 0xC0, + 0xFF, 0x7F, 0x30, 0x08, 0x01, 0x18, 0xC4, 0xC0, 0xFF, 0x7F, 0x30, 0x08, + 0x11, 0x18, 0x00, 0x08, 0x84, 0xB8, 0x21, 0x18, 0xC8, 0xC0, 0xFF, 0x7F, + 0x30, 0x08, 0x51, 0x18, 0x00, 0xA8, 0x98, 0xE4, 0x31, 0x18, 0x41, 0x19, + 0xC4, 0xC0, 0xFF, 0x7F, 0x30, 0x08, 0x61, 0x18, 0xC4, 0xC0, 0xFF, 0x7F, + 0x30, 0x08, 0x71, 0x18, 0xC1, 0xC2, 0x02, 0x40, 0x10, 0xB8, 0x04, 0x40, + 0x03, 0x08, 0x28, 0xBF, 0xDE, 0xD7, 0x1F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, + 0x1C, 0xB3, 0x5F, 0xB1, 0xF4, 0xB6, 0x38, 0xE4, 0x49, 0xE4, 0x19, 0x98, + 0x1A, 0x9C, 0xE2, 0xC8, 0x0F, 0xD5, 0x00, 0x40, 0x44, 0x63, 0x04, 0xA8, + 0x83, 0x98, 0x00, 0x40, 0xF2, 0x62, 0x0E, 0xA8, 0x6E, 0x40, 0x01, 0xA9, + 0x4F, 0x40, 0xD3, 0xDF, 0x0C, 0xB6, 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, + 0x09, 0x08, 0x7B, 0x41, 0x13, 0x18, 0x09, 0x09, 0xE0, 0xC9, 0x02, 0x40, + 0x96, 0xD4, 0x14, 0x0B, 0x03, 0x1B, 0x8B, 0xE4, 0x00, 0x40, 0x81, 0xBC, + 0x02, 0x40, 0x9B, 0xD4, 0x8B, 0xE4, 0x00, 0x40, 0x82, 0xBC, 0x2F, 0xD5, + 0x54, 0x08, 0x00, 0x40, 0x87, 0xBC, 0x63, 0x18, 0x54, 0x08, 0x52, 0xC8, + 0x5D, 0xC8, 0x73, 0x18, 0x02, 0x40, 0x54, 0x28, 0x11, 0xC8, 0x00, 0x40, + 0x83, 0xBC, 0x83, 0x18, 0x54, 0x08, 0x3A, 0xC8, 0x71, 0xC8, 0x93, 0x18, + 0x02, 0x40, 0x64, 0x28, 0x09, 0xC8, 0x00, 0x40, 0x83, 0xBC, 0xA3, 0x18, + 0x02, 0x40, 0x64, 0x28, 0x11, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0xB3, 0x18, + 0x02, 0x40, 0x64, 0x28, 0x15, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0xC3, 0x18, + 0x54, 0x08, 0x16, 0xC8, 0x6C, 0xC8, 0xD3, 0x18, 0x54, 0x08, 0x6C, 0xC8, + 0xE3, 0x18, 0xF3, 0x19, 0xFF, 0xA8, 0x88, 0x41, 0x13, 0x18, 0x8B, 0xE4, + 0x00, 0x40, 0x84, 0xBC, 0x02, 0x40, 0xE2, 0xD4, 0x8B, 0xE4, 0x00, 0x40, + 0x88, 0xBC, 0x20, 0xD5, 0x04, 0x40, 0x2C, 0x08, 0x0A, 0xC8, 0x00, 0x40, + 0x61, 0x63, 0x88, 0xB8, 0x08, 0x06, 0x74, 0x08, 0x00, 0x40, 0x87, 0xBC, + 0x04, 0x40, 0x33, 0x18, 0x01, 0x40, 0xF4, 0x20, 0x05, 0x40, 0x03, 0x10, + 0x74, 0x00, 0x5E, 0xC0, 0x69, 0xC0, 0x05, 0x40, 0x13, 0x10, 0x88, 0x41, + 0x23, 0x08, 0xE0, 0xC8, 0x02, 0x40, 0xAF, 0xD5, 0x04, 0x40, 0x23, 0x08, + 0xD0, 0xC8, 0xE4, 0xC8, 0x02, 0x40, 0xA9, 0xDC, 0x8B, 0xE4, 0x01, 0x40, + 0x80, 0xBC, 0x08, 0xD5, 0x02, 0x40, 0x84, 0x88, 0x05, 0x40, 0x23, 0x18, + 0x02, 0x40, 0x94, 0x80, 0x05, 0x40, 0x33, 0x10, 0x8B, 0xE4, 0x02, 0x40, + 0x80, 0xBC, 0x08, 0xD5, 0x02, 0x40, 0xA4, 0x88, 0x06, 0x40, 0x03, 0x18, + 0x02, 0x40, 0xB4, 0x80, 0x06, 0x40, 0x13, 0x10, 0x8B, 0xE4, 0x04, 0x40, + 0x80, 0xBC, 0x03, 0xD5, 0xA4, 0x08, 0x06, 0x40, 0x23, 0x18, 0x8B, 0xE4, + 0x08, 0x40, 0x80, 0xBC, 0x09, 0xD5, 0xB4, 0x08, 0x00, 0x40, 0x87, 0xBC, + 0x06, 0x40, 0x33, 0x18, 0x02, 0x40, 0xF4, 0x88, 0x07, 0x40, 0x13, 0x18, + 0x8B, 0xE4, 0x10, 0x40, 0x80, 0xBC, 0x09, 0xD5, 0xC4, 0x08, 0x00, 0x40, + 0x87, 0xBC, 0x07, 0x40, 0x03, 0x18, 0x03, 0x40, 0x94, 0x80, 0x07, 0x40, + 0x23, 0x10, 0x8B, 0xE4, 0x20, 0x40, 0x80, 0xBC, 0x09, 0xD5, 0xD4, 0x08, + 0x00, 0x40, 0x87, 0xBC, 0x07, 0x40, 0x33, 0x18, 0x03, 0x40, 0xB4, 0x88, + 0x08, 0x40, 0x03, 0x18, 0x8B, 0xE4, 0x40, 0x40, 0x80, 0xBC, 0x7A, 0xD5, + 0xE4, 0x08, 0x00, 0x40, 0x83, 0xBC, 0x08, 0x40, 0x23, 0x18, 0x07, 0x40, + 0x04, 0x28, 0x09, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x7C, 0x41, 0x33, 0x18, + 0x07, 0x40, 0x34, 0x28, 0x15, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x89, 0x41, + 0x33, 0x18, 0xE4, 0x08, 0x18, 0xE4, 0x00, 0x40, 0x13, 0xBC, 0x02, 0x40, + 0xAF, 0xD4, 0x72, 0xC8, 0x7D, 0xC8, 0x08, 0x40, 0x33, 0x18, 0x07, 0x40, + 0x04, 0x28, 0x11, 0xC8, 0x00, 0x40, 0x83, 0xBC, 0x09, 0x40, 0x03, 0x18, + 0x07, 0x40, 0x04, 0x28, 0x7D, 0xC8, 0x09, 0x40, 0x13, 0x18, 0x09, 0x40, + 0x23, 0x11, 0x07, 0x40, 0x14, 0x28, 0x05, 0xC8, 0x00, 0x40, 0x87, 0xBC, + 0x09, 0x40, 0x33, 0x18, 0x07, 0x40, 0x14, 0x28, 0x05, 0xC8, 0x00, 0x40, + 0x87, 0xBC, 0x0A, 0x40, 0x03, 0x18, 0x07, 0x40, 0x14, 0x28, 0x05, 0xC8, + 0x00, 0x40, 0x87, 0xBC, 0x0A, 0x40, 0x13, 0x18, 0x07, 0x40, 0x14, 0x28, + 0x11, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x0A, 0x40, 0x23, 0x18, 0x07, 0x40, + 0x14, 0x28, 0x15, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x0A, 0x40, 0x33, 0x18, + 0x07, 0x40, 0x14, 0x28, 0x19, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x0B, 0x40, + 0x03, 0x18, 0x07, 0x40, 0x14, 0x28, 0x7D, 0xC8, 0x0B, 0x40, 0x13, 0x18, + 0x03, 0x40, 0xD4, 0x28, 0x00, 0x40, 0x81, 0xBC, 0x0B, 0x40, 0x23, 0x18, + 0x07, 0x40, 0x24, 0x28, 0x6E, 0xC8, 0x70, 0xC8, 0x0B, 0x40, 0x33, 0x18, + 0xE4, 0x08, 0x1E, 0xC8, 0x70, 0xC8, 0x0C, 0x40, 0x03, 0x18, 0x0C, 0x40, + 0x13, 0x11, 0x0C, 0x40, 0x23, 0x11, 0x07, 0x40, 0x34, 0x28, 0x0D, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x0C, 0x40, 0x33, 0x18, 0x0D, 0x40, 0x03, 0x11, + 0x16, 0x40, 0x03, 0x11, 0x8B, 0xE4, 0x80, 0x40, 0x80, 0xBC, 0x04, 0xD5, + 0x07, 0x40, 0x64, 0x88, 0x88, 0x41, 0x33, 0x18, 0x8B, 0xE4, 0x00, 0x41, + 0x80, 0xBC, 0x01, 0x40, 0xE7, 0xD5, 0x04, 0x40, 0x04, 0x09, 0x00, 0x40, + 0x91, 0xBC, 0x0D, 0x40, 0x13, 0x19, 0x02, 0x40, 0x23, 0xD5, 0x08, 0x40, + 0x04, 0x28, 0x05, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x0D, 0x40, 0x23, 0x18, + 0x08, 0x40, 0x04, 0x28, 0x09, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x0D, 0x40, + 0x33, 0x18, 0x08, 0x40, 0x04, 0x28, 0x0D, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x0E, 0x40, 0x03, 0x18, 0x08, 0x40, 0x04, 0x28, 0x11, 0xC8, 0x00, 0x40, + 0x87, 0xBC, 0x0E, 0x40, 0x13, 0x18, 0x04, 0x40, 0x04, 0x08, 0x5E, 0xC8, + 0x79, 0xC8, 0x0F, 0x40, 0x03, 0x18, 0x04, 0x40, 0x04, 0x08, 0x51, 0xC8, + 0x0E, 0x40, 0x23, 0x18, 0x08, 0x40, 0x14, 0x28, 0x05, 0xC8, 0x00, 0x40, + 0x8F, 0xBC, 0x0E, 0x40, 0x33, 0x18, 0x08, 0x40, 0x14, 0x28, 0x15, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x7D, 0x41, 0x03, 0x18, 0x04, 0x40, 0x04, 0x08, + 0x32, 0xC8, 0x69, 0xC8, 0x7F, 0x41, 0x33, 0x18, 0x8B, 0xE4, 0x00, 0x42, + 0x80, 0xBC, 0x1A, 0xD5, 0xE0, 0xC9, 0x01, 0x40, 0xD0, 0xD5, 0x04, 0x40, + 0x14, 0x08, 0x03, 0x40, 0x8F, 0xBC, 0x11, 0x40, 0x23, 0x18, 0x04, 0x40, + 0x14, 0x08, 0x52, 0xC8, 0x69, 0xC8, 0x11, 0x40, 0x33, 0x18, 0x04, 0x40, + 0x14, 0x08, 0x3A, 0xC8, 0x69, 0xC8, 0x12, 0x40, 0x03, 0x18, 0x04, 0x40, + 0x14, 0x08, 0x48, 0xC8, 0x11, 0x40, 0x13, 0x18, 0x8B, 0xE4, 0x10, 0x40, + 0x00, 0x40, 0x80, 0xBC, 0x07, 0xD5, 0xE0, 0xC9, 0x01, 0x40, 0xBE, 0xD5, + 0x06, 0x40, 0x24, 0x08, 0x12, 0x40, 0x23, 0x18, 0x8B, 0xE4, 0x00, 0x44, + 0x80, 0xBC, 0x0C, 0xD5, 0xE1, 0xC9, 0x03, 0x40, 0x39, 0xD5, 0x00, 0xA8, + 0x0F, 0x40, 0x13, 0x18, 0x0F, 0x40, 0x23, 0x18, 0x0F, 0x40, 0x33, 0x18, + 0x10, 0x40, 0x03, 0x18, 0x8B, 0xE4, 0x00, 0x48, 0x80, 0xBC, 0x0C, 0xD5, + 0xE1, 0xC9, 0x03, 0x40, 0x12, 0xD5, 0x00, 0xA8, 0x10, 0x40, 0x13, 0x18, + 0x10, 0x40, 0x23, 0x18, 0x10, 0x40, 0x33, 0x18, 0x11, 0x40, 0x03, 0x18, + 0x8B, 0xE4, 0x80, 0x40, 0x00, 0x40, 0x80, 0xBC, 0x2F, 0xD5, 0x05, 0x40, + 0x04, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x12, 0x40, 0x33, 0x18, 0x0A, 0x40, + 0x04, 0x28, 0x05, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x13, 0x40, 0x03, 0x18, + 0x0A, 0x40, 0x04, 0x28, 0x09, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x13, 0x40, + 0x13, 0x18, 0x0A, 0x40, 0x04, 0x28, 0x0D, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x13, 0x40, 0x23, 0x18, 0x01, 0x40, 0xCA, 0xD4, 0x05, 0x40, 0x04, 0x08, + 0x52, 0xC8, 0x61, 0xC8, 0x13, 0x40, 0x33, 0x18, 0x05, 0x40, 0x04, 0x08, + 0x32, 0xC8, 0x61, 0xC8, 0x14, 0x40, 0x03, 0x18, 0x05, 0x40, 0x04, 0x08, + 0x12, 0xC8, 0x61, 0xC8, 0x14, 0x40, 0x13, 0x18, 0x8B, 0xE4, 0x00, 0x41, + 0x00, 0x40, 0x80, 0xBC, 0x26, 0xD5, 0x05, 0x40, 0x14, 0x08, 0x01, 0x40, + 0x8F, 0xBC, 0x14, 0x40, 0x23, 0x18, 0x05, 0x40, 0x14, 0x08, 0x5A, 0xC8, + 0x6D, 0xC8, 0x14, 0x40, 0x33, 0x18, 0x0A, 0x40, 0x54, 0x28, 0x09, 0xC8, + 0x01, 0x40, 0x8F, 0xBC, 0x15, 0x40, 0x03, 0x18, 0x05, 0x40, 0x14, 0x08, + 0x32, 0xC8, 0x6D, 0xC8, 0x15, 0x40, 0x13, 0x18, 0x05, 0x40, 0x14, 0x08, + 0x1E, 0xC8, 0x6D, 0xC8, 0x15, 0x40, 0x23, 0x18, 0x0A, 0x40, 0x74, 0x28, + 0x05, 0xC8, 0x01, 0x40, 0x8F, 0xBC, 0x15, 0x40, 0x33, 0x18, 0x8B, 0xE4, + 0x01, 0x40, 0x00, 0x40, 0x80, 0xBC, 0x10, 0xD5, 0x8B, 0xE4, 0x02, 0x40, + 0x00, 0x40, 0x80, 0xBC, 0x0B, 0xD5, 0x05, 0x40, 0x24, 0x08, 0x87, 0x41, + 0x23, 0x18, 0x05, 0x40, 0x34, 0x09, 0x87, 0x41, 0x33, 0x19, 0xE0, 0xC8, + 0x02, 0x40, 0x2F, 0xD4, 0x00, 0xA8, 0x87, 0x41, 0x13, 0x18, 0x8B, 0xE4, + 0x04, 0x40, 0x00, 0x40, 0x80, 0xBC, 0x04, 0xD5, 0x06, 0x40, 0x04, 0x08, + 0x88, 0x41, 0x03, 0x18, 0x8B, 0xE4, 0x08, 0x40, 0x00, 0x40, 0x80, 0xBC, + 0x08, 0xD5, 0x0D, 0x40, 0x13, 0x08, 0xE0, 0xC8, 0x02, 0xD5, 0x06, 0x40, + 0x14, 0x08, 0x12, 0x40, 0x13, 0x18, 0x20, 0x40, 0x00, 0x40, 0xB0, 0xBC, + 0x13, 0xD5, 0x0D, 0x40, 0x44, 0x28, 0x05, 0xC8, 0x00, 0x40, 0x8F, 0xBC, + 0xE8, 0xC8, 0x02, 0x40, 0x9E, 0xD5, 0xEA, 0xC8, 0x02, 0x40, 0xA0, 0xD5, + 0xEC, 0xC8, 0x02, 0x40, 0x24, 0xD5, 0xEE, 0xC8, 0x02, 0x40, 0x4D, 0xD5, + 0x7B, 0x41, 0x23, 0x18, 0x00, 0xA9, 0x0D, 0x40, 0x23, 0x08, 0xE0, 0xC8, + 0x09, 0xD4, 0x0D, 0x40, 0x33, 0x08, 0xE0, 0xC8, 0x05, 0xD4, 0x7D, 0x41, + 0x03, 0x08, 0xE0, 0xC8, 0x01, 0x40, 0xEA, 0xD5, 0x01, 0xA9, 0x7C, 0x41, + 0x03, 0x19, 0x00, 0xA0, 0x89, 0x90, 0x88, 0x90, 0x33, 0x08, 0x83, 0x98, + 0x2C, 0x40, 0xD8, 0xE1, 0x84, 0x98, 0xDC, 0xC8, 0x85, 0x98, 0xDC, 0xC8, + 0x86, 0x98, 0xDC, 0xC8, 0x87, 0x98, 0x7B, 0x41, 0x23, 0x08, 0x23, 0x09, + 0x05, 0x40, 0xA9, 0xDF, 0x0B, 0x98, 0x23, 0x18, 0x0A, 0x98, 0x33, 0x18, + 0xC4, 0x88, 0x7C, 0x41, 0x13, 0x18, 0xD4, 0x84, 0x7C, 0x41, 0x23, 0x14, + 0x80, 0x41, 0x13, 0x10, 0x05, 0xDE, 0xE1, 0xC9, 0x10, 0xD5, 0xE3, 0xC9, + 0x01, 0x40, 0x19, 0xD5, 0x00, 0xA8, 0x7B, 0x41, 0x33, 0x18, 0x0C, 0xB6, + 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0xC4, 0x80, 0x23, 0x10, 0xD4, 0x88, + 0x33, 0x18, 0xFD, 0x7F, 0x5F, 0xDE, 0x14, 0x01, 0x13, 0x11, 0x81, 0xE4, + 0x00, 0x40, 0x81, 0xBC, 0x01, 0x40, 0xA0, 0xD4, 0x00, 0xAA, 0x6A, 0xE4, + 0x0A, 0xC6, 0x06, 0xE4, 0x04, 0xB8, 0xCC, 0xC0, 0x2A, 0xE4, 0x16, 0xC2, + 0x23, 0xB8, 0x16, 0x40, 0x28, 0xB8, 0xCA, 0xE4, 0xC1, 0xCC, 0x01, 0xA8, + 0xB2, 0xC8, 0x81, 0xBC, 0x23, 0xD5, 0x00, 0x01, 0x81, 0xE4, 0x00, 0x40, + 0x83, 0xBC, 0x02, 0xA9, 0x04, 0xD5, 0x00, 0xA9, 0xE1, 0xC8, 0x01, 0x40, + 0xFD, 0xD5, 0x02, 0x19, 0x81, 0xE4, 0x6A, 0xC8, 0x71, 0xC8, 0x12, 0x18, + 0xB1, 0xE4, 0x52, 0xCB, 0x69, 0xCB, 0x22, 0x1B, 0x91, 0xE4, 0x12, 0xC9, + 0x71, 0xC9, 0x52, 0x19, 0x81, 0xE4, 0x36, 0xC8, 0x6C, 0xC8, 0x62, 0x18, + 0x22, 0xC1, 0x6C, 0xC1, 0x72, 0x11, 0x0A, 0xC9, 0x93, 0xB8, 0x89, 0x41, + 0x09, 0x1B, 0x13, 0x01, 0x05, 0x40, 0x13, 0x08, 0x89, 0x41, 0x03, 0x18, + 0xCA, 0xCA, 0x01, 0xA8, 0xAA, 0xC8, 0x81, 0xBC, 0x1C, 0xD5, 0x16, 0x40, + 0x13, 0x08, 0xE1, 0xC8, 0x01, 0x40, 0xC4, 0xD5, 0x86, 0xE4, 0x84, 0xB8, + 0xC8, 0x00, 0x80, 0xE4, 0x49, 0x40, 0x8F, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, + 0xE0, 0xC0, 0x01, 0x40, 0xBD, 0xD9, 0x00, 0xA8, 0x3E, 0x50, 0xA0, 0x46, + 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x8A, 0xE4, 0x9B, 0xE4, 0x4B, 0x40, + 0x09, 0xDF, 0x32, 0x18, 0x42, 0x19, 0xAC, 0xE4, 0xE7, 0xCC, 0xA5, 0xDB, + 0x8F, 0xDE, 0xE0, 0xC6, 0x01, 0x40, 0xF3, 0xD5, 0x00, 0xA2, 0x12, 0xE4, + 0x04, 0x40, 0x0C, 0x0A, 0x9C, 0xE4, 0x17, 0x40, 0x90, 0xB8, 0x2A, 0xBF, + 0x01, 0x40, 0x08, 0xD7, 0x01, 0x40, 0x18, 0xDE, 0x0D, 0x40, 0x1C, 0x09, + 0x0D, 0x40, 0x13, 0x19, 0xFE, 0x7F, 0x56, 0xDE, 0x03, 0x40, 0x04, 0x88, + 0x04, 0x40, 0x23, 0x18, 0x01, 0xA0, 0x16, 0x40, 0x13, 0x10, 0x83, 0xE4, + 0x05, 0x40, 0x1C, 0x09, 0xFC, 0x7F, 0x75, 0xDF, 0x04, 0x40, 0x23, 0x08, + 0xFE, 0x7F, 0x8F, 0xB8, 0xE3, 0xC8, 0x01, 0xDC, 0xF3, 0x10, 0x03, 0x40, + 0x14, 0x28, 0x00, 0x40, 0x81, 0xBC, 0x88, 0x41, 0x23, 0x18, 0x03, 0x40, + 0x14, 0x28, 0x05, 0xC8, 0x03, 0x40, 0x8F, 0xBC, 0x89, 0x41, 0x03, 0x18, + 0x64, 0x08, 0x2E, 0xC8, 0x69, 0xC8, 0x89, 0x41, 0x13, 0x18, 0x64, 0x08, + 0x16, 0xC8, 0x69, 0xC8, 0x89, 0x41, 0x23, 0x18, 0x03, 0x0B, 0xFC, 0x7F, + 0xF1, 0xDE, 0x08, 0xA8, 0x11, 0x40, 0x23, 0x18, 0x33, 0xA8, 0x11, 0x40, + 0x33, 0x18, 0x0A, 0xA8, 0x12, 0x40, 0x03, 0x18, 0x11, 0x40, 0x13, 0x19, + 0xFE, 0x7F, 0x3A, 0xDE, 0x12, 0x40, 0x23, 0x19, 0xFE, 0x7F, 0x42, 0xDE, + 0x0D, 0x40, 0x23, 0x19, 0x0D, 0x40, 0x33, 0x19, 0x0E, 0x40, 0x03, 0x19, + 0x0E, 0x40, 0x13, 0x19, 0x0F, 0x40, 0x03, 0x19, 0xBB, 0x40, 0x08, 0xA8, + 0x0E, 0x40, 0x23, 0x18, 0x01, 0xA8, 0x0E, 0x40, 0x33, 0x18, 0x7D, 0x41, + 0x03, 0x19, 0x3F, 0xA8, 0xFE, 0x7F, 0x00, 0xDE, 0xE1, 0xC1, 0x01, 0x40, + 0x11, 0xD5, 0xE2, 0xC1, 0x01, 0x40, 0xA3, 0xD5, 0xE3, 0xC1, 0xFD, 0x7F, + 0xA9, 0xD4, 0x00, 0xA8, 0x08, 0x40, 0x33, 0x18, 0x07, 0x40, 0x04, 0x29, + 0x11, 0xC9, 0x00, 0x40, 0x93, 0xBC, 0x09, 0x40, 0x03, 0x19, 0x01, 0xA9, + 0x09, 0x40, 0x13, 0x19, 0x09, 0x40, 0x23, 0x18, 0x09, 0x40, 0x33, 0x19, + 0x0A, 0x40, 0x03, 0x19, 0x0A, 0x40, 0x13, 0x19, 0x0A, 0x40, 0x23, 0x19, + 0x0A, 0x40, 0x33, 0x19, 0x0B, 0x40, 0x03, 0x19, 0x0B, 0x40, 0x13, 0x18, + 0x0B, 0x40, 0x23, 0x19, 0x0B, 0x40, 0x33, 0x18, 0x0C, 0x40, 0x03, 0x18, + 0x0C, 0x40, 0x13, 0x19, 0x0C, 0x40, 0x23, 0x19, 0x0C, 0x40, 0x33, 0x19, + 0x0D, 0x40, 0x03, 0x19, 0x16, 0x40, 0x03, 0x19, 0xFD, 0x7F, 0x7A, 0xDE, + 0x00, 0xA8, 0x13, 0x40, 0x33, 0x18, 0x14, 0x40, 0x03, 0x18, 0xFE, 0x7F, + 0x3F, 0xDE, 0x93, 0xE4, 0x80, 0x41, 0x94, 0xB8, 0x01, 0xA0, 0x09, 0x10, + 0x14, 0x08, 0x80, 0xBC, 0x19, 0x18, 0x00, 0xA8, 0x29, 0x18, 0x39, 0x18, + 0x44, 0x28, 0x0D, 0xC8, 0x80, 0xBC, 0x49, 0x18, 0x44, 0x28, 0x11, 0xC8, + 0x80, 0xBC, 0x59, 0x18, 0x44, 0x28, 0x15, 0xC8, 0x80, 0xBC, 0x69, 0x18, + 0x44, 0x28, 0x19, 0xC8, 0x80, 0xBC, 0x79, 0x18, 0x44, 0x28, 0x7D, 0xC8, + 0x89, 0x18, 0x54, 0x28, 0x80, 0xBC, 0x99, 0x18, 0x54, 0x28, 0x05, 0xC8, + 0x80, 0xBC, 0xA9, 0x18, 0x24, 0x08, 0xB9, 0x18, 0xE4, 0x88, 0xC9, 0x18, + 0xF4, 0x88, 0xD9, 0x18, 0x44, 0x08, 0xE9, 0x18, 0x54, 0x08, 0x00, 0x40, + 0x87, 0xBC, 0xF9, 0x18, 0x02, 0x40, 0x44, 0x28, 0x0D, 0xC8, 0x80, 0xBC, + 0x04, 0x40, 0x09, 0x18, 0x54, 0x08, 0x52, 0xC8, 0x61, 0xC8, 0x04, 0x40, + 0x19, 0x18, 0x54, 0x08, 0x32, 0xC8, 0x61, 0xC8, 0x04, 0x40, 0x29, 0x18, + 0x54, 0x08, 0x12, 0xC8, 0x61, 0xC8, 0x04, 0x40, 0x39, 0x18, 0x01, 0x40, + 0xC4, 0x88, 0x05, 0x40, 0x09, 0x18, 0x01, 0x40, 0xD4, 0x88, 0x05, 0x40, + 0x19, 0x18, 0x01, 0x40, 0xE4, 0x88, 0x05, 0x40, 0x29, 0x18, 0x01, 0x40, + 0xF4, 0x88, 0x05, 0x40, 0x39, 0x18, 0x02, 0x40, 0x84, 0x88, 0x06, 0x40, + 0x09, 0x18, 0x02, 0x40, 0x94, 0x84, 0x06, 0x40, 0x19, 0x14, 0x83, 0xE4, + 0x87, 0x41, 0x84, 0xB8, 0x06, 0x40, 0x39, 0x18, 0x7E, 0x41, 0x23, 0x08, + 0xE0, 0xC8, 0x65, 0xD5, 0x06, 0x40, 0x29, 0x10, 0xFE, 0x7F, 0x7C, 0xDE, + 0x05, 0x40, 0x13, 0x00, 0xC2, 0xC1, 0x81, 0xE4, 0x0A, 0xC8, 0x86, 0xB8, + 0x08, 0x08, 0x80, 0xB8, 0x09, 0x18, 0x02, 0x40, 0x90, 0xB8, 0xC4, 0xC1, + 0xC1, 0xC2, 0x04, 0x40, 0x0C, 0x0A, 0x2A, 0xBF, 0xEF, 0xD7, 0x03, 0x0B, + 0x05, 0x40, 0x13, 0x00, 0x89, 0x41, 0x03, 0x10, 0x04, 0x40, 0x23, 0x08, + 0x01, 0x40, 0x80, 0xBF, 0xFC, 0x7F, 0x28, 0xD5, 0x00, 0xA2, 0x2A, 0xBF, + 0xFC, 0x7F, 0x24, 0xD6, 0x0C, 0xE4, 0x17, 0x40, 0x30, 0x08, 0x0A, 0xC8, + 0x83, 0xB8, 0x17, 0x40, 0x00, 0x09, 0x89, 0x41, 0x08, 0x19, 0xC1, 0xC2, + 0x02, 0x40, 0x00, 0xB8, 0x2A, 0xBF, 0xF3, 0xD7, 0xFC, 0x7F, 0x14, 0xDE, + 0x24, 0x08, 0x00, 0x40, 0x8F, 0xBC, 0x04, 0x40, 0x03, 0x18, 0x01, 0x40, + 0x04, 0x28, 0x11, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x16, 0x40, 0x13, 0x18, + 0xFE, 0x7F, 0x52, 0xDE, 0x7C, 0x41, 0x33, 0x08, 0xE0, 0xC8, 0xFE, 0x7F, + 0x12, 0xD5, 0xFE, 0x7F, 0x0F, 0xDE, 0xE0, 0xC9, 0xFD, 0x7F, 0xCE, 0xD5, + 0x93, 0xE4, 0x80, 0x41, 0x94, 0xB8, 0x01, 0xA8, 0x87, 0x41, 0x13, 0x18, + 0x00, 0xA8, 0x19, 0x18, 0x29, 0x18, 0x39, 0x18, 0x49, 0x18, 0x59, 0x18, + 0x69, 0x18, 0x79, 0x18, 0x89, 0x18, 0x99, 0x18, 0xA9, 0x18, 0x83, 0xE4, + 0x87, 0x41, 0x84, 0xB8, 0x06, 0x40, 0x39, 0x18, 0x03, 0x0B, 0xFD, 0x7F, + 0xB8, 0xDE, 0x06, 0x40, 0x29, 0x18, 0xFE, 0x7F, 0x17, 0xDE, 0x02, 0xA8, + 0x7B, 0x41, 0x23, 0x18, 0xFD, 0x7F, 0xDC, 0xDE, 0x00, 0xA9, 0x08, 0x40, + 0x33, 0x19, 0x03, 0xA8, 0x09, 0x40, 0x03, 0x18, 0x09, 0x40, 0x13, 0x11, + 0x09, 0x40, 0x23, 0x19, 0x02, 0xA8, 0x09, 0x40, 0x33, 0x18, 0x0A, 0x40, + 0x03, 0x18, 0x0A, 0x40, 0x13, 0x18, 0x0A, 0x40, 0x23, 0x11, 0x0A, 0x40, + 0x33, 0x11, 0x0B, 0x40, 0x03, 0x11, 0x0B, 0x40, 0x13, 0x19, 0x0B, 0x40, + 0x23, 0x11, 0x0B, 0x40, 0x33, 0x19, 0x0C, 0x40, 0x03, 0x19, 0x0C, 0x40, + 0x13, 0x19, 0x0C, 0x40, 0x23, 0x19, 0x0C, 0x40, 0x33, 0x11, 0xFE, 0x7F, + 0xF7, 0xDE, 0x00, 0xA8, 0x7B, 0x41, 0x23, 0x18, 0xFD, 0x7F, 0xB0, 0xDE, + 0x00, 0xA8, 0x98, 0xE4, 0xFE, 0x7F, 0x4D, 0xDE, 0x00, 0xA8, 0x7C, 0x50, + 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x8A, 0xE4, 0x9B, 0xE4, + 0x45, 0x40, 0xEC, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, 0xFE, 0x7F, 0x35, 0xDE, + 0x98, 0xE4, 0xFE, 0x7F, 0x00, 0xDE, 0x0F, 0x40, 0x03, 0x08, 0xE2, 0xC8, + 0xFC, 0x7F, 0xE9, 0xD4, 0x09, 0x40, 0x44, 0x88, 0x10, 0x40, 0x13, 0x18, + 0x09, 0x40, 0x54, 0x80, 0x10, 0x40, 0x23, 0x10, 0x09, 0x40, 0x64, 0x88, + 0x10, 0x40, 0x33, 0x18, 0x09, 0x40, 0x74, 0x80, 0x11, 0x40, 0x03, 0x10, + 0xFC, 0x7F, 0xE0, 0xDE, 0x0F, 0x40, 0x03, 0x08, 0xE2, 0xC8, 0xFC, 0x7F, + 0xC2, 0xD4, 0x09, 0x40, 0x04, 0x88, 0x0F, 0x40, 0x13, 0x18, 0x09, 0x40, + 0x14, 0x80, 0x0F, 0x40, 0x23, 0x10, 0x09, 0x40, 0x24, 0x88, 0x0F, 0x40, + 0x33, 0x18, 0x09, 0x40, 0x34, 0x80, 0x10, 0x40, 0x03, 0x10, 0xFC, 0x7F, + 0xB9, 0xDE, 0x06, 0xA8, 0x7B, 0x41, 0x23, 0x18, 0xFD, 0x7F, 0x68, 0xDE, + 0x04, 0xA8, 0x7B, 0x41, 0x23, 0x18, 0xFD, 0x7F, 0x63, 0xDE, 0x26, 0xE4, + 0x04, 0x40, 0x0C, 0x08, 0x1C, 0xE4, 0x17, 0x40, 0x10, 0xB8, 0x68, 0xBF, + 0x04, 0xD7, 0xFB, 0x7F, 0x57, 0xDE, 0x05, 0x40, 0x13, 0x00, 0x01, 0x08, + 0x05, 0x40, 0x1C, 0x09, 0x89, 0xBA, 0x08, 0xB8, 0x01, 0x10, 0xC1, 0xC2, + 0x02, 0x40, 0x10, 0xB8, 0x04, 0x40, 0x0C, 0x08, 0x28, 0xBF, 0xF1, 0xD7, + 0x03, 0x0B, 0xFB, 0x7F, 0x45, 0xDE, 0x00, 0xA8, 0x08, 0x40, 0x33, 0x18, + 0x07, 0x40, 0x04, 0x29, 0x11, 0xC9, 0x00, 0x40, 0x93, 0xBC, 0x09, 0x40, + 0x03, 0x19, 0x01, 0xA9, 0x09, 0x40, 0x13, 0x19, 0x09, 0x40, 0x23, 0x18, + 0x09, 0x40, 0x33, 0x11, 0x0A, 0x40, 0x03, 0x11, 0x0A, 0x40, 0x13, 0x11, + 0x0A, 0x40, 0x23, 0x19, 0x0A, 0x40, 0x33, 0x19, 0x0B, 0x40, 0x03, 0x19, + 0x0B, 0x40, 0x13, 0x18, 0x0B, 0x40, 0x23, 0x19, 0x0B, 0x40, 0x33, 0x18, + 0x0C, 0x40, 0x03, 0x18, 0x0C, 0x40, 0x13, 0x18, 0x0C, 0x40, 0x23, 0x18, + 0x0C, 0x40, 0x33, 0x19, 0x0D, 0x40, 0x03, 0x18, 0xFB, 0x7F, 0xDA, 0xDE, + 0x0F, 0xB1, 0x18, 0xE4, 0x29, 0xE4, 0x07, 0x93, 0x43, 0x09, 0x89, 0xE4, + 0x04, 0x50, 0x00, 0x40, 0x80, 0xBC, 0x04, 0x50, 0x00, 0x40, 0x80, 0xBF, + 0x1B, 0xD5, 0x89, 0xE4, 0x00, 0x48, 0x00, 0x40, 0x82, 0xBC, 0x00, 0x48, + 0x00, 0x40, 0x82, 0xBF, 0x2A, 0xD5, 0x43, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0x21, 0x18, 0x53, 0x08, 0xB1, 0x18, 0x63, 0x08, 0x0A, 0xC8, 0x83, 0xB8, + 0x78, 0x08, 0x07, 0x40, 0x01, 0x18, 0x00, 0xA8, 0x0A, 0x40, 0x01, 0x18, + 0x0A, 0x40, 0x11, 0x18, 0x0F, 0xB0, 0xA0, 0xE0, 0x89, 0xE4, 0x22, 0xC8, + 0x75, 0xC8, 0xE2, 0xC8, 0x1B, 0xD8, 0x02, 0xA9, 0xE0, 0xC8, 0x03, 0xD5, + 0x00, 0xA9, 0xE1, 0xC8, 0x28, 0xD5, 0x31, 0x19, 0x00, 0xA8, 0x11, 0x18, + 0x43, 0x09, 0x89, 0xE4, 0x00, 0x48, 0x00, 0x40, 0x82, 0xBC, 0x00, 0x48, + 0x00, 0x40, 0x82, 0xBF, 0xD6, 0xD4, 0x31, 0x08, 0xE2, 0xC8, 0x17, 0xD5, + 0xE1, 0xC8, 0x13, 0xD5, 0x32, 0xC9, 0x69, 0xC9, 0x41, 0x19, 0xCD, 0xDE, + 0x02, 0xA9, 0x31, 0x19, 0x02, 0x40, 0x23, 0x28, 0x15, 0xC8, 0x00, 0x40, + 0x87, 0xBC, 0x00, 0x40, 0x83, 0xBE, 0x68, 0xE0, 0x7D, 0xC8, 0x98, 0xBA, + 0x11, 0x19, 0x43, 0x09, 0xE0, 0xDE, 0x4A, 0xC9, 0xEC, 0xDE, 0x62, 0xC9, + 0xEA, 0xDE, 0x98, 0xE4, 0xD6, 0xDE, 0x20, 0xB5, 0x1F, 0xB1, 0xFB, 0xB6, + 0x18, 0xE4, 0x00, 0xA4, 0x28, 0xE4, 0x2C, 0x40, 0x20, 0xB8, 0x80, 0x41, + 0x02, 0x08, 0x22, 0x40, 0x9E, 0xDF, 0x01, 0xE4, 0x42, 0x40, 0x08, 0xB8, + 0x83, 0x90, 0x80, 0x41, 0x02, 0x08, 0x04, 0x40, 0x02, 0x09, 0x06, 0x40, + 0x6D, 0xDF, 0x80, 0x41, 0x02, 0x08, 0x00, 0x41, 0x84, 0xB8, 0x83, 0x98, + 0x04, 0x40, 0x02, 0x08, 0x90, 0xE4, 0x5D, 0xDF, 0x80, 0x41, 0x02, 0x08, + 0x20, 0x40, 0x47, 0xDF, 0x74, 0x41, 0x22, 0x18, 0x94, 0xE4, 0xE0, 0xC8, + 0x50, 0xD9, 0x04, 0x40, 0x02, 0x03, 0x38, 0xB8, 0x80, 0x41, 0x02, 0x08, + 0x93, 0xE4, 0x21, 0x40, 0x95, 0xDF, 0x82, 0xE4, 0xAD, 0x44, 0x31, 0x09, + 0x22, 0x40, 0x88, 0xDF, 0x48, 0xE4, 0x60, 0x41, 0x04, 0xB8, 0x06, 0xA1, + 0x03, 0xDE, 0xDF, 0xC1, 0xE0, 0xC1, 0x0C, 0xD9, 0x00, 0x08, 0xC4, 0xC0, + 0x84, 0xBF, 0xF9, 0xDB, 0x00, 0x40, 0xF6, 0x62, 0x04, 0xA8, 0xA6, 0x7F, + 0x62, 0xDF, 0xDF, 0xC1, 0xE0, 0xC1, 0xF4, 0xDA, 0x83, 0xE4, 0xC1, 0xC8, + 0x7A, 0x41, 0x32, 0x18, 0x00, 0xA1, 0x28, 0xD5, 0x02, 0xE4, 0x11, 0xDE, + 0x82, 0xE4, 0x2A, 0x41, 0x80, 0xB8, 0x83, 0x98, 0x84, 0x91, 0x80, 0x41, + 0x02, 0x08, 0x91, 0xE4, 0x23, 0x40, 0xEC, 0xDF, 0xC1, 0xC1, 0x04, 0x40, + 0x06, 0xB8, 0x7A, 0x41, 0x32, 0x08, 0x81, 0xBF, 0x15, 0xDD, 0xE0, 0xC1, + 0xED, 0xD5, 0x90, 0xE4, 0x25, 0x41, 0x9A, 0xB8, 0x80, 0xE4, 0x2A, 0x41, + 0x80, 0xB8, 0x83, 0x98, 0x84, 0x91, 0x80, 0x41, 0x02, 0x08, 0x23, 0x40, + 0xD7, 0xDF, 0xC1, 0xC1, 0x04, 0x40, 0x06, 0xB8, 0x7A, 0x41, 0x32, 0x08, + 0x81, 0xBF, 0xEB, 0xDC, 0x01, 0xA9, 0x89, 0xE4, 0x05, 0xB6, 0x1F, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0xA8, 0xE4, + 0x93, 0x99, 0x14, 0x98, 0x00, 0xAE, 0xEA, 0xBF, 0x53, 0xD6, 0xD8, 0xE4, + 0x69, 0xE4, 0xFF, 0xA4, 0x01, 0xA3, 0x00, 0xAC, 0x83, 0x9C, 0xF3, 0xE4, + 0x06, 0x0B, 0x1C, 0xE4, 0xE2, 0xCB, 0x08, 0xD5, 0x8B, 0xE4, 0x00, 0x40, + 0x81, 0xBE, 0x00, 0xA1, 0x18, 0xBA, 0x18, 0xBD, 0x7D, 0xC1, 0x13, 0xB8, + 0x00, 0xA2, 0x21, 0xBF, 0x25, 0xDA, 0x16, 0x00, 0x96, 0xE4, 0x01, 0x40, + 0x98, 0xB8, 0x07, 0xDE, 0xFF, 0xC4, 0x0C, 0xD5, 0xE0, 0xC8, 0x38, 0xD9, + 0xC1, 0xC2, 0x21, 0xBF, 0x0B, 0xDA, 0x09, 0x08, 0xC4, 0xC9, 0x80, 0xBA, + 0xE0, 0xC8, 0xF6, 0xDB, 0x84, 0xBF, 0xF2, 0xDA, 0x48, 0xE4, 0xC1, 0xC2, + 0x21, 0xBF, 0xF5, 0xD9, 0xFF, 0xC4, 0x03, 0xDB, 0x16, 0x08, 0x48, 0xB8, + 0xDF, 0xC4, 0xE0, 0xC3, 0x07, 0xD8, 0x16, 0x08, 0x38, 0xB8, 0xDF, 0xC3, + 0x01, 0xDE, 0x3A, 0xB8, 0xE0, 0xC3, 0xFD, 0xD9, 0x00, 0xA2, 0x2A, 0xBF, + 0x21, 0xD7, 0xFF, 0xC4, 0x04, 0xDB, 0x03, 0x90, 0x0C, 0xBF, 0x01, 0xDA, + 0x00, 0xAF, 0xE0, 0xCB, 0x17, 0xD4, 0x66, 0x09, 0x76, 0x08, 0x98, 0xBF, + 0x39, 0xD5, 0x01, 0xA8, 0x8F, 0xBA, 0x0D, 0x18, 0xC1, 0xCE, 0x02, 0x40, + 0x60, 0xB8, 0xC4, 0xCD, 0xEA, 0xBF, 0xAF, 0xD7, 0x04, 0xB6, 0x5F, 0xB0, + 0xFC, 0xB2, 0x40, 0xB4, 0x83, 0xBF, 0x02, 0xD8, 0xE1, 0xC3, 0xC4, 0xD4, + 0x38, 0xE4, 0xC2, 0xDE, 0x0D, 0x1F, 0xEE, 0xDE, 0x83, 0xE4, 0x9A, 0xE4, + 0x41, 0x40, 0xEF, 0xDF, 0x38, 0xE4, 0xC1, 0xC3, 0x13, 0x90, 0xC8, 0xC0, + 0x0C, 0xDE, 0x84, 0xE4, 0x9A, 0xE4, 0x42, 0x40, 0x32, 0xDF, 0xC1, 0xC8, + 0x18, 0xBF, 0x11, 0xD5, 0xC1, 0xC2, 0x02, 0x40, 0x00, 0xB8, 0x2A, 0xBF, + 0xCA, 0xD6, 0xFF, 0x7F, 0x30, 0x01, 0x13, 0xBF, 0xF0, 0xD4, 0x00, 0x0C, + 0x84, 0xE4, 0x9A, 0xE4, 0x42, 0x40, 0x21, 0xDF, 0xC1, 0xC8, 0x18, 0xBF, + 0xEF, 0xD4, 0x00, 0x08, 0x83, 0x98, 0xEC, 0xDE, 0x16, 0x08, 0x89, 0xBF, + 0x02, 0xDB, 0x01, 0xA8, 0xC4, 0xDE, 0x0D, 0x1B, 0xC3, 0xDE, 0x20, 0xB5, + 0x04, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0xA9, 0xE4, 0x08, 0xE4, + 0x2C, 0x40, 0x00, 0xB8, 0x00, 0xA4, 0xB1, 0x44, 0x28, 0x08, 0xE1, 0xC8, + 0x5E, 0xD5, 0x71, 0x03, 0x64, 0xE4, 0xE0, 0xC3, 0x38, 0xD5, 0xAD, 0x44, + 0x31, 0x02, 0xE0, 0xC2, 0x46, 0xD4, 0xE0, 0xC4, 0x05, 0xD4, 0x81, 0x09, + 0x04, 0x40, 0x00, 0x08, 0x98, 0xBF, 0x58, 0xDD, 0xB2, 0x44, 0x21, 0x00, + 0x00, 0x40, 0x01, 0xBE, 0xB2, 0x44, 0x21, 0x10, 0x92, 0xE4, 0xE0, 0xC4, + 0x4B, 0xD5, 0x81, 0x19, 0xE0, 0xCA, 0x50, 0xD9, 0x80, 0xE4, 0x01, 0x40, + 0x81, 0xE6, 0x89, 0xB8, 0x0A, 0xC8, 0x81, 0xB8, 0x01, 0xA9, 0xA5, 0x44, + 0x18, 0x19, 0x40, 0xE4, 0xB2, 0x40, 0x48, 0xE6, 0x41, 0xB8, 0x81, 0xE4, + 0x02, 0x40, 0x80, 0xB8, 0x08, 0x00, 0x20, 0xE4, 0x0A, 0x40, 0x28, 0xE6, + 0x42, 0xB8, 0x40, 0x43, 0x40, 0xB8, 0xC1, 0xC0, 0x08, 0x10, 0xC1, 0xC3, + 0x71, 0x13, 0x14, 0x16, 0x84, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, + 0x40, 0xB4, 0x04, 0x40, 0x30, 0x06, 0xE0, 0xC6, 0x25, 0xD5, 0x05, 0x40, + 0x00, 0x08, 0x04, 0x40, 0x00, 0x09, 0x41, 0x40, 0x74, 0xDF, 0xE0, 0xC8, + 0x01, 0xD5, 0x01, 0xA8, 0x48, 0xE4, 0xAD, 0x44, 0x31, 0x02, 0xE0, 0xC2, + 0xBA, 0xD5, 0x01, 0xA8, 0xE0, 0xCA, 0x22, 0xD9, 0xA5, 0x44, 0x11, 0x18, + 0x41, 0xE4, 0x40, 0x43, 0x40, 0xB8, 0xC1, 0xC3, 0x71, 0x13, 0x14, 0x16, + 0x84, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x02, 0xA6, + 0xB1, 0x44, 0x21, 0x14, 0x71, 0x03, 0xA1, 0xDE, 0x01, 0xA9, 0xB3, 0xDE, + 0x03, 0xA6, 0xD9, 0xDE, 0xB2, 0x44, 0x21, 0x00, 0xE0, 0xCA, 0xB0, 0xDA, + 0x80, 0xE4, 0x01, 0x40, 0x81, 0xE6, 0x89, 0xB8, 0x0A, 0xC8, 0x81, 0xB8, + 0x00, 0xA9, 0xAF, 0xDE, 0x00, 0xA8, 0xDC, 0xDE, 0x5F, 0xB1, 0x18, 0xE4, + 0x38, 0xE4, 0x2C, 0x40, 0x30, 0xB8, 0x00, 0xA0, 0xAD, 0x44, 0x38, 0x08, + 0xE1, 0xC8, 0x4E, 0xD5, 0x51, 0x02, 0x60, 0xE4, 0xE0, 0xC2, 0x05, 0xD9, + 0x82, 0xE4, 0x16, 0xC8, 0x83, 0xB8, 0x16, 0x40, 0x38, 0x06, 0xB2, 0x44, + 0x31, 0x04, 0x84, 0xE4, 0x01, 0x40, 0x81, 0xE6, 0x86, 0xB8, 0x0A, 0xC8, + 0x81, 0xB8, 0xA5, 0x44, 0x18, 0x08, 0xE0, 0xC8, 0x18, 0xD4, 0x00, 0xA2, + 0x04, 0x40, 0x03, 0x08, 0xC1, 0xC8, 0x0E, 0xD5, 0x98, 0xE4, 0x04, 0xE4, + 0x04, 0x40, 0x04, 0xE6, 0x01, 0xB8, 0xA5, 0x44, 0x04, 0xB8, 0x00, 0x08, + 0xC4, 0xC0, 0xE0, 0xC8, 0x38, 0xD4, 0xC1, 0xC2, 0x92, 0xBF, 0xF9, 0xDC, + 0xFF, 0xA8, 0x11, 0x18, 0x00, 0xA8, 0x5F, 0xB0, 0xA0, 0xE0, 0x7B, 0x41, + 0x33, 0x08, 0xE0, 0xC8, 0xE4, 0xD4, 0x04, 0xE4, 0xB2, 0x40, 0x08, 0xE6, + 0x01, 0xB8, 0x86, 0xE4, 0x0A, 0x40, 0x88, 0xE6, 0x08, 0xB8, 0x40, 0x43, + 0x00, 0xB8, 0x84, 0xE4, 0x01, 0x40, 0x81, 0xE6, 0x86, 0xB8, 0x0A, 0xC8, + 0x81, 0xB8, 0x00, 0xA9, 0xA5, 0x44, 0x18, 0x19, 0x04, 0x40, 0x03, 0x08, + 0xDF, 0xC8, 0x28, 0xBF, 0x0F, 0xD4, 0x00, 0x40, 0x41, 0xBE, 0xB2, 0x44, + 0x31, 0x14, 0x0A, 0xDE, 0xA5, 0x44, 0x11, 0x08, 0xE0, 0xC8, 0x1D, 0xD5, + 0x01, 0xE4, 0x40, 0x43, 0x00, 0xB8, 0x00, 0xA8, 0xA5, 0x44, 0x11, 0x18, + 0xB0, 0x08, 0xA1, 0x18, 0x80, 0xE4, 0x5F, 0xB0, 0xA0, 0xE0, 0x04, 0xE4, + 0xB2, 0x40, 0x08, 0xE6, 0x01, 0xB8, 0x82, 0xE4, 0x0A, 0x40, 0x88, 0xE6, + 0x08, 0xB8, 0x40, 0x43, 0x00, 0xB8, 0x62, 0xE4, 0x01, 0xA8, 0x7B, 0x41, + 0x33, 0x18, 0x51, 0x02, 0xB2, 0x44, 0x31, 0x04, 0xCC, 0xDE, 0xFF, 0xA8, + 0x11, 0x18, 0x80, 0xE4, 0xE8, 0xDE, 0x0F, 0xB1, 0x28, 0xE4, 0x01, 0xA3, + 0xE1, 0xC8, 0x0F, 0xDD, 0x19, 0x01, 0x03, 0xE4, 0x38, 0xBF, 0x0B, 0xD6, + 0x02, 0x40, 0x94, 0xB8, 0x09, 0x08, 0x02, 0x40, 0x90, 0xB8, 0x81, 0xBF, + 0x07, 0xD9, 0x18, 0xE4, 0xC1, 0xC0, 0x02, 0xBF, 0xF7, 0xD7, 0x83, 0xE4, + 0x0F, 0xB0, 0xA0, 0xE0, 0x00, 0xA3, 0x83, 0xE4, 0x0F, 0xB0, 0xA0, 0xE0, + 0x5F, 0xB1, 0x48, 0xE4, 0x09, 0x96, 0x00, 0xA2, 0x02, 0xE4, 0x38, 0xE4, + 0xC1, 0xC3, 0x23, 0xBF, 0x11, 0xD6, 0xFE, 0x7F, 0x94, 0xB8, 0x10, 0xE4, + 0xE0, 0xC0, 0x01, 0xD5, 0x09, 0x01, 0x80, 0xE4, 0x84, 0xB8, 0x81, 0xBA, + 0x82, 0xBF, 0x01, 0xDD, 0x28, 0xE4, 0xC1, 0xC0, 0x02, 0x40, 0x90, 0xB8, + 0x03, 0xBF, 0xF1, 0xD7, 0xE0, 0xC6, 0x01, 0xD5, 0x00, 0xA2, 0xC1, 0xC2, + 0x82, 0xE4, 0x5F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, + 0x08, 0xE4, 0xE2, 0xC9, 0x04, 0xD5, 0x01, 0xA8, 0x03, 0xB6, 0x03, 0xB0, + 0x40, 0xB4, 0x08, 0x01, 0xE0, 0xC1, 0xF9, 0xD4, 0x18, 0x09, 0x89, 0xE4, + 0x00, 0x40, 0x81, 0xBC, 0x0F, 0xD5, 0xC0, 0x88, 0x0F, 0x40, 0x8F, 0xBF, + 0x04, 0xDB, 0xD0, 0x88, 0x07, 0x40, 0x8F, 0xBF, 0x07, 0xD8, 0x00, 0x40, + 0xF9, 0x62, 0x0A, 0xA8, 0xA4, 0x7F, 0x3D, 0xDF, 0x81, 0xE4, 0xE6, 0xDE, + 0x89, 0xE4, 0x20, 0x40, 0x00, 0x40, 0x80, 0xBC, 0xE0, 0xD5, 0x00, 0x40, + 0x91, 0xBC, 0xDD, 0xD5, 0x06, 0x40, 0x30, 0x08, 0x00, 0x40, 0x83, 0xBC, + 0xE3, 0xC8, 0xD7, 0xD4, 0xC0, 0x88, 0x07, 0x40, 0x8F, 0xBF, 0x04, 0xDB, + 0xD0, 0x88, 0x0E, 0x40, 0x80, 0xBF, 0xCF, 0xD8, 0x00, 0x40, 0xFD, 0x62, + 0x01, 0xA8, 0xA4, 0x7F, 0x20, 0xDF, 0x00, 0xA8, 0xC9, 0xDE, 0x20, 0xB5, + 0x04, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x0F, 0x96, 0x10, 0x9A, + 0x11, 0x94, 0x12, 0x93, 0x29, 0xE4, 0x0E, 0x91, 0x00, 0xA8, 0x04, 0x18, + 0x03, 0x18, 0xE0, 0xC0, 0x0F, 0xD4, 0x00, 0x40, 0x01, 0xBC, 0x06, 0xD5, + 0x06, 0x11, 0x0A, 0x12, 0x03, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, + 0x06, 0x12, 0x0A, 0x11, 0x03, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, + 0x89, 0xE4, 0x20, 0xA9, 0xF0, 0x7F, 0x85, 0xDF, 0x82, 0xBA, 0x03, 0x18, + 0x28, 0xB8, 0x81, 0xE4, 0x20, 0xA9, 0xF0, 0x7F, 0x7E, 0xDF, 0x81, 0xBA, + 0x04, 0x18, 0x18, 0xB8, 0xE2, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, + 0x28, 0xE4, 0x08, 0x28, 0x01, 0xA9, 0xA0, 0x7F, 0xBA, 0xDF, 0x12, 0x28, + 0xA0, 0x7F, 0xBC, 0xDF, 0x22, 0x28, 0xA0, 0x7F, 0xB9, 0xDF, 0x00, 0xA1, + 0x12, 0x28, 0xE0, 0xC8, 0x11, 0xDB, 0x02, 0xE4, 0xC8, 0xC0, 0x80, 0x28, + 0xC2, 0xC0, 0xA0, 0x7F, 0xAF, 0xDF, 0xA2, 0x88, 0x84, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x01, 0xA9, 0xA0, 0x7F, 0xA3, 0xDF, 0xC1, 0xC1, 0x12, 0x28, + 0x18, 0xBF, 0xF1, 0xD9, 0x00, 0xA1, 0x22, 0x28, 0xE0, 0xC8, 0x12, 0xDB, + 0x02, 0xE4, 0x01, 0x40, 0x08, 0xB8, 0x80, 0x28, 0xC2, 0xC0, 0xA0, 0x7F, + 0x99, 0xDF, 0xB2, 0x88, 0x84, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x01, 0xA9, + 0xA0, 0x7F, 0x8D, 0xDF, 0xC1, 0xC1, 0x22, 0x28, 0x18, 0xBF, 0xF1, 0xD9, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, + 0xF3, 0xB6, 0xB9, 0xE4, 0x00, 0xAA, 0x18, 0xE4, 0xE3, 0x44, 0x14, 0xB8, + 0xA5, 0x44, 0x08, 0x04, 0x68, 0xE4, 0x2C, 0x40, 0x60, 0xB8, 0x02, 0x40, + 0x11, 0x20, 0x05, 0xC0, 0x03, 0x40, 0x0F, 0xBC, 0x34, 0x03, 0x91, 0x08, + 0xE1, 0xC8, 0x00, 0x40, 0xB2, 0xD5, 0xA1, 0x7F, 0x22, 0xDF, 0x01, 0xA8, + 0x04, 0xA9, 0xA0, 0x7F, 0x63, 0xDF, 0x41, 0x08, 0x02, 0xA9, 0xA0, 0x7F, + 0x5F, 0xDF, 0x01, 0xA8, 0x98, 0xE4, 0xA0, 0x7F, 0x60, 0xDF, 0x01, 0x40, + 0x03, 0xBF, 0x5A, 0xD5, 0x01, 0x40, 0x05, 0xBF, 0x57, 0xD5, 0x51, 0x08, + 0x03, 0x40, 0x8F, 0xBC, 0xA0, 0x7F, 0x5A, 0xDF, 0x83, 0xE4, 0xA0, 0x7F, + 0x57, 0xDF, 0x01, 0x40, 0x03, 0xBF, 0x25, 0xD5, 0x01, 0x40, 0xE1, 0x88, + 0x01, 0x40, 0xF1, 0x89, 0xA0, 0x7F, 0x49, 0xDF, 0x04, 0x40, 0x11, 0x28, + 0x09, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x01, 0xA9, 0xA0, 0x7F, 0x41, 0xDF, + 0x81, 0x09, 0x09, 0xE4, 0x56, 0xC0, 0x7D, 0xC0, 0x00, 0x40, 0x97, 0xD5, + 0x89, 0xE4, 0x01, 0x40, 0x8F, 0xBC, 0xE1, 0xC8, 0x01, 0x40, 0x66, 0xD8, + 0x07, 0x40, 0x31, 0x09, 0x89, 0xE4, 0x26, 0xC8, 0x88, 0xB8, 0x00, 0x40, + 0xE9, 0xD7, 0x91, 0x09, 0xE1, 0xC9, 0x01, 0x40, 0x64, 0xD5, 0xA1, 0x08, + 0xE1, 0xC8, 0x00, 0x40, 0x72, 0xD5, 0xE1, 0xC3, 0x42, 0xDD, 0x44, 0x08, + 0xFE, 0x7F, 0x86, 0xB8, 0xA0, 0x7F, 0x40, 0xDF, 0xC1, 0x08, 0x98, 0xE4, + 0x00, 0x40, 0x91, 0xBC, 0xE1, 0xC9, 0x58, 0xD5, 0x36, 0x01, 0x03, 0x40, + 0x1F, 0xB8, 0x19, 0xC1, 0xDF, 0xC1, 0x81, 0xE4, 0xA0, 0x7F, 0x16, 0xDF, + 0xE0, 0xC1, 0x11, 0xD4, 0x01, 0xA8, 0xA0, 0x7F, 0x47, 0xDF, 0xA0, 0x7F, + 0x58, 0xDF, 0xA0, 0x7F, 0xBE, 0xDF, 0x00, 0xA8, 0x0D, 0xB6, 0x5F, 0xB0, + 0x0C, 0xB2, 0x40, 0xB4, 0x00, 0xA8, 0x01, 0xA9, 0x9F, 0x7F, 0xFF, 0xDF, + 0xA4, 0xDE, 0x0F, 0xA8, 0xA0, 0x7F, 0x00, 0xDF, 0x00, 0xA2, 0x21, 0xBF, + 0xE9, 0xD6, 0x0B, 0xE4, 0x00, 0x08, 0xC4, 0xC0, 0xDF, 0xC8, 0x10, 0xA9, + 0x9F, 0x7F, 0xF1, 0xDF, 0xC1, 0xC2, 0x21, 0xBF, 0xF7, 0xD7, 0x01, 0xA8, + 0xA0, 0x7F, 0x26, 0xDF, 0xA0, 0x7F, 0x37, 0xDF, 0xA0, 0x7F, 0x9D, 0xDF, + 0x00, 0xA8, 0x0D, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x00, 0xA8, + 0x01, 0xA9, 0x9F, 0x7F, 0xDE, 0xDF, 0xD1, 0x08, 0x28, 0xE4, 0x00, 0x40, + 0x21, 0xBC, 0xE1, 0xC2, 0x00, 0x40, 0xE3, 0xD5, 0xE0, 0xC3, 0x00, 0x40, + 0xFF, 0xD5, 0xE0, 0xCA, 0x03, 0xD5, 0xE0, 0xC3, 0x01, 0x40, 0x0E, 0xD5, + 0x03, 0xA8, 0x9F, 0x7F, 0xD1, 0xDF, 0x44, 0x08, 0xFE, 0x7F, 0x86, 0xB8, + 0x9F, 0x7F, 0xE8, 0xDF, 0xC1, 0x08, 0x98, 0xE4, 0x00, 0x40, 0x91, 0xBC, + 0xE1, 0xC9, 0xA8, 0xD4, 0x7A, 0xC8, 0x7D, 0xC8, 0x9F, 0x7F, 0xBD, 0xDF, + 0xA3, 0xDE, 0x24, 0x08, 0xE1, 0xC8, 0xFF, 0x7F, 0x4A, 0xD5, 0x09, 0x40, + 0x16, 0x0A, 0xFF, 0x7F, 0x46, 0xDE, 0x24, 0x08, 0x00, 0xA0, 0xE1, 0xC8, + 0x02, 0xD5, 0x0C, 0x40, 0x26, 0x00, 0x80, 0xE4, 0x01, 0xA9, 0x9F, 0x7F, + 0xAA, 0xDF, 0x80, 0xE4, 0x01, 0xA9, 0x9F, 0x7F, 0xA6, 0xDF, 0xFF, 0x7F, + 0x7E, 0xDE, 0x0C, 0x40, 0xD8, 0xE1, 0x08, 0x30, 0x04, 0x40, 0x21, 0x09, + 0x09, 0xE4, 0x00, 0x40, 0x0F, 0xBC, 0x01, 0x40, 0x50, 0xEA, 0x62, 0xC9, + 0x71, 0xC9, 0x01, 0x40, 0x69, 0xEA, 0x09, 0x40, 0x41, 0x89, 0x01, 0x40, + 0xA9, 0xEA, 0x09, 0x40, 0x51, 0x89, 0x01, 0x40, 0xB9, 0xEA, 0x09, 0x40, + 0x61, 0x89, 0x01, 0x40, 0xC9, 0xEA, 0x09, 0x40, 0x71, 0x89, 0x01, 0x40, + 0xD9, 0xEA, 0x0A, 0x40, 0x01, 0x89, 0x01, 0x40, 0xE9, 0xEA, 0x0A, 0x40, + 0x11, 0x89, 0x01, 0x40, 0xF9, 0xEA, 0x0A, 0x40, 0x21, 0x89, 0x02, 0x40, + 0x89, 0xEA, 0x0A, 0x40, 0x31, 0x89, 0x02, 0x40, 0x99, 0xEA, 0x0A, 0x40, + 0x41, 0x89, 0x02, 0x40, 0xA9, 0xEA, 0x0A, 0x40, 0x51, 0x89, 0x02, 0x40, + 0xB9, 0xEA, 0x0A, 0x40, 0x61, 0x89, 0x02, 0x40, 0xC9, 0xEA, 0x0A, 0x40, + 0x71, 0x89, 0x02, 0x40, 0xD9, 0xEA, 0x0B, 0x40, 0x01, 0x89, 0x02, 0x40, + 0xE9, 0xEA, 0x0B, 0x40, 0x11, 0x89, 0x02, 0x40, 0xF9, 0xEA, 0x0B, 0x40, + 0x21, 0x89, 0x03, 0x40, 0x89, 0xEA, 0x0B, 0x40, 0x31, 0x89, 0x03, 0x40, + 0x99, 0xEA, 0x09, 0x40, 0x21, 0x89, 0x01, 0x40, 0x89, 0xEA, 0x09, 0x40, + 0x31, 0x89, 0x01, 0x40, 0x99, 0xEA, 0xFE, 0x7F, 0x8A, 0xDF, 0x07, 0x40, + 0x31, 0x09, 0x89, 0xE4, 0x26, 0xC8, 0x88, 0xB8, 0xFF, 0x7F, 0x17, 0xD6, + 0x09, 0xE4, 0x00, 0x40, 0x03, 0xBC, 0x80, 0xE4, 0x9F, 0x7F, 0x44, 0xDF, + 0xE0, 0xC0, 0x1E, 0xDB, 0x07, 0x40, 0x31, 0x08, 0x5A, 0xC8, 0x61, 0xC8, + 0x01, 0x40, 0xF1, 0x89, 0x9F, 0x7F, 0x35, 0xDF, 0x0F, 0x40, 0x61, 0x28, + 0x09, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x01, 0xA9, 0x9F, 0x7F, 0x2D, 0xDF, + 0x0F, 0x40, 0x61, 0x28, 0x11, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x01, 0xA9, + 0x9F, 0x7F, 0x25, 0xDF, 0x0F, 0x40, 0x61, 0x28, 0x11, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x64, 0xD4, 0xE1, 0xC0, 0xFE, 0x7F, 0xEE, 0xDB, 0x07, 0x40, + 0x31, 0x08, 0x3A, 0xC8, 0x61, 0xC8, 0x01, 0x40, 0xF1, 0x89, 0x9F, 0x7F, + 0x14, 0xDF, 0x0F, 0x40, 0x61, 0x28, 0x0D, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0x01, 0xA9, 0x9F, 0x7F, 0x0C, 0xDF, 0x0F, 0x40, 0x61, 0x28, 0x15, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x01, 0xA9, 0x9F, 0x7F, 0x04, 0xDF, 0x0F, 0x40, + 0x61, 0x28, 0x15, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0xFE, 0x7F, 0xCF, 0xD5, + 0x08, 0x40, 0x11, 0x08, 0x3F, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x9E, 0x7F, + 0xFB, 0xDF, 0xFE, 0x7F, 0xC6, 0xDE, 0x08, 0xE4, 0x7A, 0xC0, 0x7D, 0xC0, + 0x80, 0xE4, 0x92, 0xE4, 0x9E, 0x7F, 0xED, 0xDF, 0xE0, 0xC0, 0x38, 0xD4, + 0xE0, 0xC3, 0xFF, 0x7F, 0x11, 0xD4, 0x06, 0x40, 0x41, 0x20, 0x09, 0xC0, + 0x00, 0x40, 0x01, 0xBC, 0x80, 0xE4, 0x92, 0xE4, 0x9E, 0x7F, 0xDF, 0xDF, + 0xE0, 0xC0, 0x08, 0xD5, 0xD1, 0x09, 0x22, 0xC9, 0x89, 0xE4, 0x71, 0xC8, + 0x46, 0xC9, 0x71, 0xC9, 0x9E, 0x7F, 0xD5, 0xDF, 0x83, 0xE4, 0x01, 0xA9, + 0x9E, 0x7F, 0xD1, 0xDF, 0xFE, 0x7F, 0xFB, 0xDE, 0x89, 0xE4, 0x5A, 0xC8, + 0x6D, 0xC8, 0x2E, 0xC9, 0x6D, 0xC9, 0x9E, 0x7F, 0xC8, 0xDF, 0xFE, 0x7F, + 0x91, 0xDE, 0x8A, 0xE4, 0x9E, 0x7F, 0xC3, 0xDF, 0xFE, 0x7F, 0x97, 0xDE, + 0xB1, 0x08, 0x01, 0xA9, 0x9E, 0x7F, 0xBD, 0xDF, 0xFE, 0x7F, 0xEC, 0xDE, + 0x08, 0x40, 0x01, 0x08, 0x3F, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x9E, 0x7F, + 0xB9, 0xDF, 0x94, 0xDE, 0xD1, 0x09, 0x52, 0xC9, 0x89, 0xE4, 0x71, 0xC8, + 0x16, 0xC9, 0x71, 0xC9, 0x9E, 0x7F, 0xAB, 0xDF, 0xBF, 0xDE, 0x0F, 0xB1, + 0x38, 0xE4, 0x29, 0xE4, 0x68, 0x08, 0x0A, 0xC8, 0x83, 0xB8, 0x78, 0x01, + 0x03, 0x40, 0x01, 0x28, 0x05, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0xE1, 0xC8, + 0x25, 0xD5, 0x07, 0x40, 0x09, 0x09, 0x02, 0xE4, 0x07, 0x40, 0x04, 0xB8, + 0x01, 0x40, 0xD9, 0x88, 0x20, 0x18, 0x59, 0x08, 0x10, 0x18, 0x69, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0x00, 0x18, 0x04, 0x40, 0x01, 0x28, 0x05, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0xE1, 0xC8, 0x22, 0xD5, 0x07, 0x40, 0x02, 0x09, + 0x02, 0xE4, 0x08, 0x40, 0x00, 0xB8, 0x02, 0x40, 0x99, 0x88, 0x20, 0x18, + 0x79, 0x08, 0x10, 0x18, 0x89, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x00, 0x18, + 0x0F, 0xB0, 0xA0, 0xE0, 0x07, 0x40, 0x94, 0xB8, 0x01, 0x40, 0xD1, 0x88, + 0x29, 0x18, 0x51, 0x08, 0x19, 0x18, 0x61, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0x09, 0x18, 0x04, 0x40, 0x01, 0x28, 0x05, 0xC8, 0x00, 0x40, 0x81, 0xBC, + 0xE1, 0xC8, 0xDE, 0xD4, 0x63, 0x08, 0x0A, 0xC8, 0x83, 0xB8, 0x78, 0x09, + 0xDB, 0xDE, 0x20, 0xB5, 0xDC, 0xB3, 0x5F, 0xB1, 0xFB, 0xB6, 0x18, 0xE4, + 0x09, 0xE4, 0x14, 0x9C, 0x00, 0xAE, 0xFE, 0xE4, 0x08, 0x02, 0xE0, 0xCC, + 0x00, 0x40, 0x82, 0xD9, 0xE2, 0xC0, 0x00, 0x40, 0x7A, 0xD5, 0x00, 0xAB, + 0xB2, 0xBF, 0x4C, 0xDA, 0x31, 0xE4, 0xC4, 0xC3, 0x22, 0xDE, 0xE0, 0xC8, + 0x1B, 0xD4, 0x62, 0xE4, 0xFF, 0x7F, 0x6E, 0xE6, 0x42, 0xE4, 0x06, 0xC4, + 0x13, 0xE4, 0x01, 0x40, 0x18, 0xB8, 0x01, 0xAA, 0x01, 0x08, 0x86, 0xBF, + 0x41, 0xD9, 0x84, 0xB8, 0x92, 0xE4, 0x3D, 0x40, 0xE2, 0xDF, 0x08, 0xE4, + 0x8C, 0xE4, 0x92, 0xE4, 0x3D, 0x40, 0xDD, 0xDF, 0x08, 0xBF, 0x42, 0xD5, + 0xDF, 0xCA, 0xC4, 0xC1, 0xE0, 0xCA, 0xEE, 0xDA, 0xC1, 0xCB, 0x02, 0x40, + 0x30, 0xB8, 0xB2, 0xBF, 0x27, 0xDA, 0x03, 0x08, 0xE1, 0xC8, 0xDB, 0xD4, + 0x62, 0xE4, 0xFF, 0x7F, 0x6E, 0xE6, 0x63, 0x08, 0x86, 0xBF, 0x3D, 0xD9, + 0x42, 0xE4, 0x06, 0xC4, 0x84, 0xB8, 0x92, 0xE4, 0x3D, 0x40, 0xC3, 0xDF, + 0x08, 0xE4, 0x8C, 0xE4, 0x92, 0xE4, 0x3D, 0x40, 0xBE, 0xDF, 0x08, 0xBF, + 0xE5, 0xD4, 0x00, 0xA8, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, + 0x84, 0x99, 0x8E, 0xE4, 0x9F, 0xE4, 0x3F, 0x40, 0x95, 0xDF, 0xE8, 0xE4, + 0xF9, 0xE4, 0xC1, 0xCB, 0x02, 0x40, 0x30, 0xB8, 0xB2, 0xBF, 0xD9, 0xD9, + 0x8E, 0xE4, 0x9F, 0xE4, 0x05, 0xB6, 0x5F, 0xB0, 0xDC, 0xB2, 0x40, 0xB4, + 0x00, 0x40, 0x02, 0x63, 0x00, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x04, 0x63, + 0x04, 0xA8, 0x6A, 0xA9, 0x44, 0x40, 0x97, 0xDF, 0x01, 0x08, 0xB3, 0xDE, + 0x00, 0xA8, 0xF8, 0x4F, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, + 0x8E, 0xE4, 0x9F, 0xE4, 0x3F, 0x40, 0x72, 0xDF, 0xE8, 0xE4, 0xF9, 0xE4, + 0xB1, 0xDE, 0x00, 0x40, 0x08, 0x63, 0x02, 0xA8, 0x83, 0x98, 0x00, 0x40, + 0x04, 0x63, 0x04, 0xA8, 0x60, 0xA9, 0x44, 0x40, 0x7E, 0xDF, 0x63, 0x08, + 0xB7, 0xDE, 0x00, 0xAE, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xAF, 0x81, 0xDE, + 0x00, 0x40, 0x0A, 0x63, 0x03, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x04, 0x63, + 0x04, 0xA8, 0x55, 0xA9, 0x44, 0x40, 0x6D, 0xDF, 0xFF, 0x7F, 0x72, 0xDE, + 0x20, 0xB5, 0x5F, 0xB1, 0xFC, 0xB6, 0x68, 0xE4, 0x29, 0xE4, 0x0E, 0x94, + 0x0F, 0x93, 0x03, 0x00, 0xE0, 0xC0, 0x23, 0xD9, 0x00, 0xA1, 0xE0, 0xC0, + 0x09, 0xDB, 0x94, 0xE4, 0x09, 0x08, 0xC4, 0xC9, 0x82, 0xBF, 0x04, 0xD8, + 0x17, 0xD5, 0xC1, 0xC1, 0x01, 0xBF, 0xF8, 0xD8, 0xEF, 0xC0, 0x22, 0xD8, + 0xDF, 0xC0, 0x01, 0xBF, 0x09, 0xD9, 0x90, 0xE4, 0x0A, 0xC9, 0x94, 0xB8, + 0x09, 0x08, 0x19, 0x18, 0xDF, 0xC0, 0xDC, 0xC9, 0x01, 0xBF, 0xFA, 0xDA, + 0x0A, 0xC1, 0x14, 0xB8, 0x01, 0x12, 0x03, 0x08, 0xC1, 0xC8, 0x03, 0x18, + 0x04, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0x0B, 0x63, 0x01, 0xA8, + 0x83, 0x98, 0x00, 0x40, 0x04, 0x63, 0x04, 0xA8, 0x0A, 0x40, 0x04, 0xA9, + 0x44, 0x40, 0x33, 0xDF, 0x03, 0x00, 0xD0, 0xDE, 0xC1, 0xC6, 0x10, 0xA8, + 0x83, 0x98, 0x00, 0x40, 0x0C, 0x63, 0x00, 0xA8, 0x96, 0xE4, 0xA0, 0x7F, + 0xAF, 0xDF, 0x00, 0xA8, 0x44, 0x40, 0x3C, 0xDF, 0x20, 0xB5, 0x7C, 0xB3, + 0x5F, 0xB1, 0xFB, 0xB6, 0xE8, 0xE4, 0x49, 0xE4, 0x14, 0x93, 0x15, 0x96, + 0x16, 0x9B, 0x17, 0x9C, 0xE8, 0xC9, 0x5D, 0xDC, 0xE7, 0xC3, 0x4F, 0xDC, + 0x83, 0xE4, 0x16, 0xC8, 0x8E, 0xB8, 0x18, 0x09, 0x58, 0x0D, 0x69, 0xBF, + 0x00, 0x40, 0x6A, 0xD5, 0x00, 0xA2, 0xA4, 0xE4, 0x06, 0xCA, 0xE0, 0xCA, + 0x0E, 0xD8, 0x59, 0xDE, 0x80, 0xE4, 0x1A, 0xC8, 0x8B, 0xB8, 0x83, 0x98, + 0x0A, 0xC0, 0x0C, 0xB8, 0x84, 0x90, 0x83, 0xE4, 0x91, 0xE4, 0x94, 0xDF, + 0xC1, 0xC2, 0xA2, 0xBF, 0x4C, 0xDB, 0x83, 0xE4, 0x82, 0xBA, 0x08, 0xE4, + 0xDF, 0xC0, 0x84, 0xBA, 0x94, 0xE4, 0x3C, 0x40, 0x50, 0xDF, 0x84, 0xE6, + 0x16, 0xE4, 0x18, 0xBA, 0x08, 0xBA, 0xE0, 0xC0, 0x02, 0xD9, 0x04, 0xBF, + 0x0B, 0xD9, 0x00, 0x40, 0x0F, 0x63, 0x0F, 0xA8, 0x83, 0x98, 0x00, 0x40, + 0x04, 0x63, 0x04, 0xA8, 0x0E, 0x40, 0x01, 0xA9, 0x43, 0x40, 0xE1, 0xDF, + 0x80, 0xE4, 0x16, 0xC8, 0x8E, 0xB8, 0x18, 0x09, 0x58, 0x08, 0x91, 0xBF, + 0xD1, 0xD4, 0x8D, 0xBF, 0xCF, 0xD8, 0x83, 0xE4, 0x1A, 0xC8, 0x8B, 0xB8, + 0x83, 0x98, 0x83, 0xE4, 0x0A, 0xC8, 0x8C, 0xB8, 0x84, 0x98, 0x83, 0xE4, + 0x96, 0xE4, 0xFF, 0x7F, 0x61, 0xDF, 0x05, 0xB6, 0x5F, 0xB0, 0x7C, 0xB2, + 0x40, 0xB4, 0x00, 0x40, 0x12, 0x63, 0x08, 0xA8, 0x83, 0x98, 0x00, 0x40, + 0x04, 0x63, 0x04, 0xA8, 0x0C, 0x40, 0x0E, 0xA9, 0x43, 0x40, 0xBD, 0xDF, + 0xA5, 0xDE, 0x00, 0x40, 0x15, 0x63, 0x05, 0xA8, 0x83, 0x98, 0x00, 0x40, + 0x04, 0x63, 0x04, 0xA8, 0x0C, 0x40, 0x0D, 0xA9, 0x43, 0x40, 0xB1, 0xDF, + 0x97, 0xDE, 0xC1, 0xC3, 0x83, 0x96, 0x00, 0x40, 0x17, 0x63, 0x0B, 0xA8, + 0x93, 0xE4, 0xA0, 0x7F, 0x2F, 0xDF, 0x00, 0xA8, 0x43, 0x40, 0xBC, 0xDF, + 0xC1, 0xC3, 0x00, 0x40, 0x1B, 0x63, 0x01, 0xA8, 0x93, 0xE4, 0xA0, 0x7F, + 0x25, 0xDF, 0xF5, 0xDE, 0x20, 0xB5, 0x7C, 0xB3, 0x5F, 0xB1, 0xDE, 0x7F, + 0x01, 0xB6, 0xE8, 0xE4, 0xD9, 0xE4, 0x25, 0x40, 0x02, 0x93, 0xE8, 0xC9, + 0x00, 0x40, 0xA6, 0xD8, 0x0E, 0x1D, 0x00, 0xA6, 0x6D, 0xBF, 0x10, 0xDA, + 0x20, 0xA2, 0x1E, 0xE4, 0xC4, 0xC1, 0x03, 0xE4, 0x83, 0x92, 0x81, 0xE4, + 0x90, 0xE4, 0x43, 0x40, 0xBB, 0xDF, 0xC1, 0xC6, 0x02, 0x40, 0x00, 0xB8, + 0x02, 0x40, 0x10, 0xB8, 0x6D, 0xBF, 0xF4, 0xD9, 0x00, 0xA6, 0x6D, 0xBF, + 0x2D, 0xDA, 0x1E, 0xE4, 0x60, 0x40, 0x14, 0xB8, 0x03, 0xE4, 0x07, 0xDE, + 0xE0, 0xC8, 0x16, 0xD5, 0xC1, 0xC6, 0x02, 0x40, 0x00, 0xB8, 0x6D, 0xBF, + 0x21, 0xDA, 0x00, 0x08, 0xE1, 0xC8, 0xF6, 0xDC, 0x60, 0x08, 0x83, 0x96, + 0x84, 0x98, 0x1C, 0x40, 0xD8, 0xE1, 0x85, 0x98, 0x86, 0x91, 0x83, 0xE4, + 0x9D, 0xE4, 0xFF, 0x7F, 0x3B, 0xDF, 0x00, 0x08, 0xE0, 0xC8, 0xEA, 0xD4, + 0x70, 0x08, 0x83, 0x96, 0x84, 0x98, 0x1C, 0x40, 0xD8, 0xE1, 0x85, 0x98, + 0x86, 0x91, 0x83, 0xE4, 0x9D, 0xE4, 0xFF, 0x7F, 0x2D, 0xDF, 0xC1, 0xC6, + 0x02, 0x40, 0x00, 0xB8, 0x6D, 0xBF, 0xDF, 0xD9, 0x00, 0xA6, 0x6D, 0xBF, + 0x5A, 0xDA, 0xCE, 0xE4, 0xA8, 0x40, 0xC4, 0xB8, 0xAE, 0xE4, 0x60, 0x40, + 0xA4, 0xB8, 0xB3, 0xE4, 0xC4, 0xCB, 0x0B, 0x02, 0x02, 0x40, 0xB0, 0xB8, + 0x00, 0xA3, 0x0A, 0x00, 0xE0, 0xC0, 0x0C, 0xDB, 0x1C, 0x40, 0xD8, 0xE1, + 0x96, 0xE4, 0x1A, 0xC9, 0x98, 0xB8, 0x09, 0x08, 0xC4, 0xC9, 0x82, 0xBF, + 0x03, 0xD8, 0xC1, 0xC3, 0x03, 0xBF, 0xF9, 0xD8, 0x00, 0xA4, 0x13, 0xE4, + 0xDF, 0xC1, 0xE0, 0xC1, 0x15, 0xD9, 0x1C, 0x40, 0xD8, 0xE1, 0x06, 0xE4, + 0x12, 0xC0, 0x01, 0xB8, 0x0A, 0xC0, 0x08, 0xB8, 0x96, 0xE4, 0x1A, 0xC9, + 0x9E, 0xB8, 0x20, 0x40, 0x94, 0xB8, 0x00, 0x08, 0xDC, 0xC0, 0x82, 0xBA, + 0x09, 0x18, 0xC4, 0xC9, 0xC1, 0xC4, 0xDF, 0xC1, 0xE0, 0xC1, 0xF7, 0xDA, + 0x13, 0xE4, 0x0A, 0x03, 0x31, 0xBF, 0x17, 0xDB, 0x1C, 0x40, 0xD8, 0xE1, + 0x06, 0xE4, 0x12, 0xC0, 0x01, 0xB8, 0x0A, 0xC0, 0x08, 0xB8, 0x94, 0xE4, + 0x0A, 0xC9, 0x86, 0xE4, 0x1A, 0xC8, 0x8E, 0xB8, 0x98, 0xB8, 0x20, 0x40, + 0x94, 0xB8, 0x00, 0x08, 0xC4, 0xC0, 0x82, 0xBA, 0x09, 0x18, 0xC4, 0xC9, + 0xC1, 0xC1, 0x31, 0xBF, 0xF8, 0xD8, 0x00, 0xA8, 0x86, 0xBA, 0x86, 0xBD, + 0x7D, 0xC8, 0x0C, 0x18, 0xC1, 0xC6, 0xC4, 0xCA, 0xC4, 0xCC, 0x6D, 0xBF, + 0xAE, 0xD9, 0x21, 0x40, 0x03, 0xB6, 0x5F, 0xB0, 0x7C, 0xB2, 0x40, 0xB4, + 0x00, 0x40, 0x3B, 0x63, 0x0D, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x04, 0x63, + 0x04, 0xA8, 0x10, 0x40, 0x00, 0xA9, 0x42, 0x40, 0xE0, 0xDF, 0xFF, 0x7F, + 0x4D, 0xDE, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0x48, 0xE4, + 0xA9, 0xE4, 0x0F, 0x96, 0x99, 0xB8, 0x49, 0xD7, 0x00, 0xA1, 0x04, 0x00, + 0x21, 0xE4, 0xE0, 0xC0, 0x14, 0xDB, 0x8A, 0xE4, 0x90, 0xE4, 0x3B, 0x40, + 0xD0, 0xDF, 0x38, 0xE4, 0x21, 0xE4, 0x16, 0xC2, 0x82, 0xE4, 0x84, 0xB8, + 0x28, 0x08, 0x90, 0xE4, 0x3B, 0x40, 0xC7, 0xDF, 0x83, 0xBF, 0x05, 0xD5, + 0xC1, 0xC1, 0x01, 0xBF, 0xF3, 0xD8, 0x21, 0xE4, 0x16, 0xC2, 0x01, 0xBF, + 0x22, 0xD5, 0x02, 0xE4, 0x04, 0xB8, 0xC4, 0xC0, 0x00, 0x08, 0xE1, 0xC8, + 0x11, 0xDC, 0x60, 0x08, 0x8A, 0xB8, 0x10, 0x09, 0x89, 0xBA, 0x06, 0x18, + 0x00, 0x08, 0xE0, 0xC8, 0x0E, 0xD4, 0x70, 0x08, 0x8A, 0xB8, 0x10, 0x09, + 0x89, 0xBA, 0x16, 0x18, 0x04, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, + 0xFF, 0xA8, 0x06, 0x18, 0x00, 0x08, 0xE0, 0xC8, 0xF2, 0xD5, 0xFF, 0xA8, + 0x16, 0x18, 0x04, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x00, 0x40, + 0x1F, 0x63, 0x0C, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x04, 0x63, 0x04, 0xA8, + 0x14, 0x40, 0x05, 0xA9, 0x42, 0x40, 0x8D, 0xDF, 0xD2, 0xDE, 0x00, 0x40, + 0x21, 0x63, 0x05, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x04, 0x63, 0x04, 0xA8, + 0x13, 0x40, 0x0E, 0xA9, 0x42, 0x40, 0x81, 0xDF, 0xAB, 0xDE, 0x20, 0xB5, + 0x1F, 0xB1, 0xFD, 0xB6, 0x09, 0xE4, 0x0C, 0x91, 0x0D, 0x93, 0x0E, 0x92, + 0x40, 0xA9, 0xEB, 0x7F, 0x14, 0xDF, 0x48, 0xE4, 0x80, 0xE4, 0x40, 0xA9, + 0xEB, 0x7F, 0x0F, 0xDF, 0x02, 0x11, 0x12, 0x13, 0xE2, 0xC1, 0x07, 0xD5, + 0xE1, 0xC1, 0x0A, 0xD5, 0xE3, 0xC1, 0x0D, 0xD5, 0x03, 0xB6, 0x1F, 0xB0, + 0x40, 0xB4, 0xDF, 0xC4, 0x22, 0x14, 0x03, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, + 0xDF, 0xC8, 0x32, 0x18, 0x03, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x48, 0xE6, + 0x84, 0xE4, 0x93, 0xE4, 0x3A, 0x40, 0xB3, 0xDF, 0x98, 0xE4, 0x01, 0xA8, + 0xEA, 0x7F, 0xB6, 0xDF, 0x52, 0x18, 0xDF, 0xC8, 0x42, 0x18, 0xE6, 0xDE, + 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xFA, 0xB6, 0xA8, 0xE4, 0xB9, 0xE4, + 0x12, 0x93, 0x13, 0x94, 0x14, 0x91, 0x15, 0x90, 0x16, 0x92, 0x40, 0xA9, + 0xEA, 0x7F, 0xDF, 0xDF, 0x68, 0xE4, 0x8B, 0xE4, 0x40, 0xA9, 0xEA, 0x7F, + 0xDA, 0xDF, 0x98, 0xE4, 0xE0, 0xC1, 0x0C, 0xD5, 0xE0, 0xC0, 0x11, 0xD4, + 0x83, 0x93, 0x84, 0x94, 0x85, 0x92, 0x8A, 0xE4, 0x9B, 0xE4, 0xB1, 0xDF, + 0x06, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0xE0, 0xC0, 0x17, 0xDB, + 0x02, 0x11, 0x06, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x00, 0x40, + 0x22, 0x63, 0x01, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x04, 0x63, 0x04, 0xA8, + 0x18, 0x40, 0x02, 0xA9, 0x42, 0x40, 0x1B, 0xDF, 0x83, 0x93, 0x84, 0x94, + 0x85, 0x92, 0x8A, 0xE4, 0x9B, 0xE4, 0x95, 0xDF, 0xE3, 0xDE, 0xE0, 0xC0, + 0xE8, 0xD4, 0x02, 0x13, 0x12, 0x14, 0xE2, 0xC3, 0x0B, 0xD5, 0xE1, 0xC3, + 0x10, 0xD5, 0xE3, 0xC3, 0xE0, 0xD4, 0x42, 0x08, 0xC1, 0xC8, 0x52, 0x09, + 0x3B, 0x40, 0x09, 0xDF, 0x42, 0x18, 0xD9, 0xDE, 0x22, 0x08, 0xC1, 0xC8, + 0x96, 0xE4, 0x3B, 0x40, 0x02, 0xDF, 0x22, 0x18, 0xD2, 0xDE, 0x32, 0x08, + 0xC1, 0xC8, 0x3A, 0x40, 0xFC, 0xDF, 0x32, 0x18, 0xCC, 0xDE, 0x20, 0xB5, + 0xFC, 0xB3, 0x5F, 0xB1, 0xF9, 0xB6, 0x68, 0xE4, 0x49, 0xE4, 0x19, 0x9E, + 0x08, 0x08, 0xDF, 0xC8, 0x00, 0xA0, 0xF8, 0x4F, 0x00, 0x40, 0x00, 0xA1, + 0x83, 0x90, 0x84, 0x91, 0x3E, 0x40, 0xA3, 0xDF, 0x03, 0x92, 0x04, 0x93, + 0x66, 0x66, 0x99, 0x59, 0x0A, 0xA0, 0xEA, 0x4F, 0x99, 0x59, 0x09, 0xA1, + 0x83, 0x90, 0x84, 0x91, 0x3E, 0x40, 0xAB, 0xDF, 0x83, 0x92, 0x84, 0x93, + 0x85, 0x98, 0x86, 0x99, 0x00, 0xA8, 0x98, 0xE4, 0xEA, 0x7F, 0x47, 0xDF, + 0x83, 0x98, 0x84, 0x99, 0x00, 0xA8, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA9, + 0x3E, 0x40, 0x6F, 0xDF, 0xF5, 0x68, 0xA3, 0x70, 0x0D, 0xA0, 0xF8, 0x4F, + 0xD7, 0x63, 0x00, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x3E, 0x40, 0x91, 0xDF, + 0x28, 0xE4, 0x39, 0xE4, 0xC8, 0xE4, 0xD9, 0xE4, 0xE2, 0xC4, 0x54, 0xD5, + 0x18, 0x90, 0xE0, 0xC0, 0x27, 0xD4, 0x18, 0x91, 0x06, 0x00, 0x00, 0xA2, + 0xE0, 0xC0, 0x14, 0xDB, 0x17, 0x98, 0x90, 0xE4, 0x3A, 0x40, 0xB1, 0xDF, + 0x38, 0xE4, 0x21, 0xE4, 0x16, 0xC2, 0x82, 0xE4, 0x86, 0xB8, 0x28, 0x08, + 0x90, 0xE4, 0x3A, 0x40, 0xA8, 0xDF, 0x38, 0xBF, 0x05, 0xD5, 0xC1, 0xC1, + 0x01, 0xBF, 0xF3, 0xD8, 0x21, 0xE4, 0x16, 0xC2, 0x01, 0xBF, 0x00, 0x40, + 0xBD, 0xDB, 0x26, 0xB8, 0x42, 0x0C, 0x52, 0x0D, 0x4E, 0xE4, 0x1A, 0x98, + 0xE8, 0xBF, 0x32, 0xDB, 0x07, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, + 0x17, 0x91, 0x83, 0x91, 0x86, 0xE4, 0x94, 0xE4, 0xFC, 0x7F, 0x83, 0xDF, + 0xA8, 0xE4, 0xB9, 0xE4, 0x00, 0xA8, 0x83, 0x98, 0x86, 0xE4, 0x02, 0xA9, + 0xFC, 0x7F, 0x7B, 0xDF, 0x00, 0xA0, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA1, + 0x83, 0x90, 0x84, 0x91, 0x3C, 0x40, 0x60, 0xDF, 0x83, 0x92, 0x84, 0x93, + 0x3E, 0x40, 0x47, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x83, 0x90, 0x84, 0x91, + 0x8A, 0xE4, 0x9B, 0xE4, 0x3C, 0x40, 0x54, 0xDF, 0x83, 0x98, 0x84, 0x99, + 0x82, 0xE4, 0x93, 0xE4, 0x3F, 0x40, 0xAE, 0xDF, 0xC8, 0xE4, 0xD9, 0xE4, + 0x4E, 0xE4, 0x1A, 0x98, 0xE8, 0xBF, 0xCE, 0xD8, 0x00, 0xAE, 0xF8, 0x4F, + 0x00, 0x40, 0x00, 0xAF, 0x2C, 0xDE, 0x82, 0xE4, 0x93, 0xE4, 0x30, 0x40, + 0xED, 0xDF, 0x83, 0x9E, 0x84, 0x9F, 0x3C, 0x40, 0x3B, 0xDF, 0x2E, 0x40, + 0xA6, 0xDF, 0x41, 0x40, 0x0C, 0xDF, 0x98, 0xE4, 0x7F, 0xA8, 0xE9, 0x7F, + 0xA7, 0xDF, 0x18, 0xE4, 0x83, 0x9E, 0x84, 0x9F, 0x82, 0xE4, 0x93, 0xE4, + 0x3C, 0x40, 0x2C, 0xDF, 0x2E, 0x40, 0x97, 0xDF, 0x40, 0x40, 0xFD, 0xDF, + 0x98, 0xE4, 0xFF, 0x43, 0x0F, 0xA8, 0xE9, 0x7F, 0x97, 0xDF, 0x94, 0xE4, + 0x0A, 0xC9, 0x1B, 0x90, 0x09, 0xB8, 0x00, 0x11, 0x1C, 0x90, 0x90, 0xB8, + 0x09, 0x18, 0xC1, 0xC4, 0x1A, 0x91, 0x41, 0xBF, 0x9D, 0xD8, 0x84, 0xE4, + 0x3D, 0x40, 0xEB, 0xDF, 0x00, 0xA0, 0x0A, 0x50, 0x00, 0x40, 0x00, 0xA1, + 0x83, 0x90, 0x84, 0x91, 0x3D, 0x40, 0xCB, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, + 0x00, 0xA8, 0x02, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, + 0x8A, 0xE4, 0x9B, 0xE4, 0x3F, 0x40, 0x60, 0xDF, 0x83, 0x98, 0x84, 0x99, + 0x00, 0xA8, 0x00, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x2F, 0x40, 0x15, 0xDF, + 0x83, 0x9C, 0x84, 0x9D, 0x3D, 0x40, 0xDF, 0xDF, 0x28, 0xE4, 0x39, 0xE4, + 0x06, 0x09, 0x17, 0x98, 0x3A, 0x40, 0x0B, 0xDF, 0xE0, 0xC8, 0xA9, 0xD5, + 0x18, 0x91, 0xE0, 0xC1, 0xA6, 0xD4, 0x00, 0xA8, 0x04, 0x50, 0x00, 0x40, + 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x03, 0x90, 0x04, 0x91, 0x00, 0xA8, + 0x06, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x8A, 0xE4, + 0x9B, 0xE4, 0x3F, 0x40, 0x37, 0xDF, 0x83, 0x90, 0x84, 0x91, 0x85, 0x98, + 0x86, 0x99, 0x00, 0xA8, 0x00, 0x50, 0x00, 0x40, 0x00, 0xA9, 0xE9, 0x7F, + 0x5C, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, 0x3D, 0x40, + 0xB2, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x81, 0xDE, 0x00, 0x40, 0x23, 0x63, + 0x02, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x04, 0x63, 0x04, 0xA8, 0x1D, 0x40, + 0x03, 0xA9, 0x40, 0x40, 0xD2, 0xDF, 0xFF, 0x7F, 0x36, 0xDE, 0x20, 0xB5, + 0x07, 0xB1, 0xFC, 0xB6, 0x28, 0xE4, 0x19, 0xE4, 0x89, 0xE4, 0xE0, 0xC9, + 0x18, 0xD5, 0x10, 0x40, 0x00, 0xA8, 0x29, 0xBF, 0x14, 0xD5, 0x89, 0xE4, + 0xE9, 0x7F, 0x17, 0xDF, 0x04, 0xC8, 0x00, 0x44, 0x80, 0xB8, 0x91, 0xE4, + 0x39, 0x40, 0x17, 0xDF, 0x28, 0xE6, 0x02, 0x40, 0x20, 0xB8, 0x18, 0xC2, + 0x83, 0x92, 0x00, 0x7F, 0x00, 0xA8, 0xFF, 0x40, 0x0F, 0xA9, 0xE9, 0x7F, + 0x1B, 0xDF, 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x3C, 0xB3, + 0x5F, 0xB1, 0xFC, 0xB6, 0xA8, 0xE4, 0xD9, 0xE4, 0x12, 0x93, 0x13, 0x9C, + 0x14, 0x94, 0x15, 0x9B, 0x00, 0xA6, 0x23, 0xE4, 0xC4, 0xC2, 0x06, 0xE4, + 0x0A, 0xC0, 0x80, 0xE4, 0x83, 0xB8, 0x08, 0x08, 0x9A, 0xE4, 0x98, 0xBA, + 0x83, 0x99, 0x80, 0xA8, 0x7F, 0xA9, 0xE8, 0x7F, 0xFF, 0xDF, 0x18, 0xE4, + 0x02, 0x08, 0xDC, 0xC2, 0x9A, 0xE4, 0x98, 0xBA, 0x83, 0x99, 0x80, 0xA8, + 0x7F, 0xA9, 0xE8, 0x7F, 0xF5, 0xDF, 0x98, 0xE4, 0x81, 0xE4, 0xB7, 0xDF, + 0x04, 0xB8, 0x00, 0x18, 0xC1, 0xC6, 0xE1, 0xC6, 0xE2, 0xDB, 0x00, 0xA6, + 0x43, 0xE4, 0x16, 0xE4, 0x0E, 0xC1, 0x1B, 0xB8, 0x2C, 0xE4, 0x01, 0xA3, + 0x04, 0x08, 0x9A, 0xE4, 0x98, 0xBA, 0x83, 0x99, 0x80, 0xA8, 0x7F, 0xA9, + 0xE8, 0x7F, 0xDE, 0xDF, 0x08, 0xE4, 0x02, 0x08, 0xC4, 0xC2, 0x9D, 0xE4, + 0x98, 0xBA, 0x83, 0x99, 0x80, 0xA8, 0x7F, 0xA9, 0xE8, 0x7F, 0xD4, 0xDF, + 0x98, 0xE4, 0x80, 0xE4, 0x96, 0xDF, 0x01, 0x18, 0xC4, 0xC1, 0xDF, 0xC3, + 0xE0, 0xC3, 0xE6, 0xDA, 0xC1, 0xC6, 0xC4, 0xC4, 0xE1, 0xC6, 0xDD, 0xDB, + 0x04, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, + 0xFD, 0xB6, 0x28, 0xE4, 0x38, 0xE4, 0x2C, 0x40, 0x30, 0xB8, 0x00, 0xA8, + 0x02, 0x18, 0x7A, 0x47, 0x32, 0x18, 0x08, 0xE4, 0x82, 0xE4, 0x0E, 0xA9, + 0x08, 0x40, 0x08, 0x10, 0x0B, 0x40, 0x38, 0x10, 0xDF, 0xC9, 0xC4, 0xC8, + 0xE0, 0xC9, 0xF8, 0xDA, 0x05, 0x40, 0x03, 0x00, 0x04, 0x40, 0x03, 0x01, + 0x80, 0xE4, 0x91, 0xE4, 0x38, 0x40, 0xF3, 0xDF, 0xE0, 0xC8, 0x0E, 0xD5, + 0xDF, 0xC0, 0x62, 0x08, 0x80, 0xBF, 0x0A, 0xD7, 0x04, 0x40, 0x33, 0x08, + 0xE0, 0xC8, 0x21, 0xD4, 0x52, 0x09, 0x00, 0xA8, 0x62, 0x18, 0x04, 0x40, + 0x03, 0x01, 0x01, 0xDE, 0x52, 0x09, 0xC1, 0xC9, 0x91, 0xBF, 0x02, 0xDB, + 0x00, 0xA8, 0x52, 0x18, 0x05, 0x40, 0x03, 0x09, 0xE0, 0xC9, 0x07, 0xDB, + 0x72, 0x08, 0x89, 0xBF, 0x04, 0xD7, 0x00, 0xA8, 0x72, 0x18, 0x05, 0x40, + 0x03, 0x09, 0xE0, 0xC9, 0x05, 0xDB, 0x62, 0x08, 0x89, 0xBF, 0x02, 0xD7, + 0x00, 0xA8, 0x62, 0x18, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0xFF, 0xA9, + 0x52, 0x19, 0xDD, 0xDE, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, + 0x19, 0xE4, 0x0C, 0x40, 0xBD, 0xDF, 0x80, 0xE4, 0x0A, 0x40, 0x68, 0xDF, + 0x80, 0xE4, 0x0B, 0x40, 0x4E, 0xDF, 0x80, 0xE4, 0x91, 0xE4, 0x09, 0x40, + 0x2A, 0xDF, 0x80, 0xE4, 0x1B, 0x40, 0xC8, 0xDF, 0x80, 0xE4, 0x22, 0x40, + 0x84, 0xB8, 0xE7, 0x7F, 0xEB, 0xDF, 0x10, 0x18, 0x78, 0xE0, 0x7D, 0xC8, + 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, 0xFC, 0xB6, + 0x08, 0xE4, 0xA5, 0x44, 0x08, 0x01, 0x39, 0x08, 0x02, 0x40, 0x80, 0xBC, + 0x04, 0xD5, 0x7B, 0x47, 0x00, 0x08, 0xE0, 0xC8, 0x1F, 0xD4, 0x80, 0xE4, + 0x00, 0xA9, 0x22, 0xDF, 0x7A, 0x47, 0x30, 0x09, 0x98, 0xB8, 0x7A, 0x47, + 0x30, 0x19, 0x80, 0xE4, 0x5F, 0xDF, 0x28, 0xE4, 0x10, 0x09, 0xE0, 0xC9, + 0x05, 0xD9, 0x51, 0x08, 0x83, 0x98, 0x80, 0xE4, 0x12, 0x40, 0xA5, 0xDF, + 0x80, 0xE4, 0x0A, 0x40, 0xEC, 0xDF, 0xB1, 0x44, 0x30, 0x08, 0xC1, 0xC8, + 0xB1, 0x44, 0x30, 0x18, 0x82, 0xE4, 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, + 0xF1, 0x09, 0xC1, 0xC9, 0x31, 0x08, 0x0C, 0x40, 0xCB, 0xDF, 0xDB, 0xDE, + 0x20, 0xB5, 0x03, 0xB1, 0xFC, 0xB6, 0x19, 0xE4, 0xA5, 0x44, 0x08, 0x00, + 0x00, 0xA9, 0x89, 0xE4, 0xE0, 0xC0, 0x07, 0xD5, 0xE0, 0xC1, 0x08, 0xD4, + 0x07, 0x40, 0x10, 0x08, 0xE0, 0xC8, 0x10, 0xD4, 0x89, 0xE4, 0x04, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0xE1, 0xC1, 0xFA, 0xD4, 0x08, 0x40, 0x00, 0x08, + 0xE0, 0xC8, 0xF6, 0xD5, 0x08, 0x40, 0x00, 0xB8, 0x20, 0x08, 0x83, 0x98, + 0x81, 0xE4, 0x05, 0xDE, 0x07, 0x40, 0x04, 0xB8, 0x20, 0x08, 0x83, 0x98, + 0x01, 0xA8, 0x10, 0x09, 0xE7, 0x7F, 0x42, 0xDF, 0x20, 0x09, 0xE6, 0xDE, + 0x0F, 0xB1, 0x19, 0xE4, 0x09, 0x09, 0x19, 0x02, 0x29, 0x03, 0x09, 0x00, + 0xE0, 0xC0, 0x07, 0xD4, 0x04, 0xA8, 0x11, 0x18, 0x21, 0x12, 0x01, 0xA8, + 0x09, 0x18, 0x0F, 0xB0, 0xA0, 0xE0, 0x00, 0xA8, 0xE1, 0xC0, 0xFB, 0xD4, + 0x05, 0xA8, 0x11, 0x18, 0x21, 0x13, 0x02, 0xA8, 0x09, 0x18, 0x80, 0xE4, + 0x0F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x03, 0xB1, 0xFC, 0xB6, 0x08, 0xE4, + 0x18, 0xE4, 0xB3, 0x44, 0x10, 0xB8, 0x11, 0xDF, 0x11, 0x18, 0x80, 0xE4, + 0x06, 0x40, 0x46, 0xDF, 0x21, 0x18, 0x00, 0xA8, 0x01, 0x18, 0x83, 0x91, + 0x00, 0x40, 0x25, 0x51, 0x00, 0xA9, 0x82, 0x7F, 0x8F, 0xDF, 0x01, 0xA8, + 0x04, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, + 0xDD, 0x7F, 0x02, 0xB6, 0x00, 0xAA, 0x00, 0xAB, 0xE8, 0xE4, 0x00, 0xA1, + 0x38, 0xE4, 0x2C, 0x40, 0x30, 0xB8, 0xA5, 0x44, 0x08, 0x06, 0xD8, 0xE4, + 0x0F, 0x40, 0xD8, 0xB8, 0x08, 0xE4, 0x13, 0x45, 0x08, 0xB8, 0x96, 0x90, + 0x48, 0xE4, 0x15, 0x45, 0x48, 0xB8, 0x95, 0x94, 0x41, 0xE4, 0x07, 0x40, + 0x06, 0x0C, 0x11, 0x40, 0x23, 0x08, 0x93, 0x98, 0x11, 0x40, 0x33, 0x09, + 0x92, 0x99, 0x2E, 0xE4, 0xB3, 0x44, 0x2C, 0xB8, 0x0D, 0x40, 0x13, 0x09, + 0xE0, 0xC9, 0x57, 0xD5, 0xBC, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x05, 0x40, + 0xE0, 0xD4, 0x91, 0xE4, 0x36, 0x08, 0xE2, 0xC8, 0x05, 0x40, 0xE5, 0xD5, + 0x5E, 0x08, 0x83, 0x98, 0xBC, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x84, 0x98, + 0x7F, 0x41, 0x33, 0x08, 0x85, 0x98, 0xCC, 0x08, 0x86, 0x98, 0x05, 0x40, + 0x4C, 0x28, 0x05, 0xC8, 0x07, 0x40, 0x8F, 0xBC, 0x87, 0x98, 0x89, 0x41, + 0x33, 0x08, 0x88, 0x98, 0x04, 0x40, 0x1C, 0x08, 0x89, 0x98, 0x04, 0x40, + 0x2C, 0x08, 0x8A, 0x98, 0x06, 0xE4, 0x01, 0x40, 0x00, 0xB8, 0x8B, 0x90, + 0x86, 0xE4, 0x05, 0x40, 0x8C, 0xB8, 0x8C, 0x98, 0xC4, 0xC8, 0x8D, 0x98, + 0x14, 0x40, 0x08, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, 0x8E, 0x98, 0x78, 0x40, + 0xDF, 0xE1, 0x8F, 0x9F, 0x90, 0x94, 0x91, 0x91, 0x15, 0x98, 0x22, 0x40, + 0xE3, 0xDF, 0xF6, 0x08, 0xE0, 0xC8, 0x40, 0xD4, 0x04, 0x40, 0x23, 0x08, + 0xD0, 0xC8, 0xE4, 0xC8, 0x3B, 0xDC, 0x36, 0x08, 0xE2, 0xC8, 0x38, 0xD5, + 0x89, 0x41, 0x13, 0x09, 0x89, 0x41, 0x03, 0x08, 0x98, 0xBA, 0x00, 0x08, + 0x89, 0xBA, 0x83, 0x98, 0x15, 0x99, 0x0F, 0x40, 0x39, 0x08, 0x10, 0x40, + 0x09, 0x09, 0xE7, 0x7F, 0x4B, 0xDF, 0x00, 0x18, 0x27, 0xDE, 0x05, 0x40, + 0x5C, 0x28, 0x05, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x04, 0x40, 0x80, 0xD4, + 0x06, 0x40, 0x16, 0x08, 0x18, 0x08, 0x83, 0x98, 0x16, 0x40, 0x13, 0x08, + 0x84, 0x98, 0x46, 0x08, 0x85, 0x98, 0x46, 0x08, 0x86, 0x98, 0x14, 0x40, + 0x08, 0xA1, 0xD7, 0xE1, 0x17, 0xB8, 0x87, 0x91, 0x78, 0x40, 0xDF, 0xE1, + 0x88, 0x9F, 0x80, 0x41, 0x03, 0x08, 0x36, 0x09, 0xFC, 0x7F, 0xC9, 0xDF, + 0x00, 0xA8, 0x15, 0x94, 0x13, 0x40, 0x14, 0x18, 0xBC, 0x08, 0xFF, 0x7F, + 0x8E, 0xBC, 0xBC, 0x18, 0x14, 0x40, 0x08, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, + 0x9F, 0xE4, 0xE4, 0x7F, 0xF4, 0xDF, 0x36, 0x08, 0xE2, 0xC8, 0x05, 0x40, + 0x03, 0xD5, 0x00, 0xA0, 0x08, 0x40, 0x0E, 0x0A, 0x0B, 0x40, 0x3E, 0x09, + 0xB9, 0xE4, 0x8A, 0xE4, 0x0A, 0xC8, 0x8E, 0xB8, 0x0F, 0x40, 0x28, 0x04, + 0x9C, 0x94, 0x0A, 0xC9, 0x9E, 0xB8, 0x0F, 0x40, 0x29, 0x09, 0x9D, 0x99, + 0x36, 0x01, 0x01, 0xA8, 0x97, 0x98, 0xE0, 0xC1, 0x07, 0xD4, 0x56, 0x08, + 0x48, 0xBF, 0x05, 0x40, 0x31, 0xD8, 0x98, 0xBF, 0x05, 0x40, 0x2E, 0xD8, + 0x01, 0xA8, 0xA6, 0x18, 0xE0, 0xC1, 0x04, 0x40, 0x47, 0xD4, 0xA6, 0x08, + 0x0B, 0xE4, 0xE1, 0xC8, 0x04, 0x40, 0x42, 0xD5, 0x80, 0xE4, 0x0A, 0xC8, + 0x8E, 0xB8, 0x0F, 0x40, 0x28, 0x09, 0x0D, 0xB8, 0x08, 0x40, 0x00, 0x20, + 0x00, 0x40, 0x0C, 0xE6, 0x0E, 0xB8, 0x16, 0x40, 0x04, 0xB8, 0x00, 0x08, + 0x9A, 0x98, 0x10, 0x08, 0x9B, 0x98, 0x20, 0x00, 0x94, 0x90, 0x70, 0x40, + 0xD8, 0xE1, 0x83, 0x98, 0xD8, 0xC8, 0x84, 0x98, 0x60, 0xA8, 0xD7, 0xE1, + 0x87, 0xB8, 0x85, 0x98, 0x21, 0x40, 0x08, 0xA0, 0xD7, 0xE1, 0x07, 0xB8, + 0x86, 0x90, 0x56, 0x08, 0xFD, 0x7F, 0xB4, 0xDF, 0x8D, 0xE4, 0x8A, 0xB8, + 0x08, 0x40, 0x08, 0x2F, 0xDB, 0xB8, 0x08, 0x40, 0x0D, 0x2A, 0x36, 0x08, + 0xE0, 0xC8, 0x06, 0xD4, 0xE0, 0xCF, 0x05, 0x40, 0x2C, 0xD9, 0xE0, 0xCA, + 0x05, 0x40, 0x26, 0xD9, 0xEF, 0xCF, 0x04, 0x40, 0xE0, 0xDC, 0xEF, 0xCA, + 0x04, 0x40, 0xD0, 0xDC, 0x00, 0xA0, 0x16, 0x94, 0x04, 0x10, 0x07, 0x40, + 0x33, 0x08, 0xE0, 0xC8, 0x13, 0xD5, 0x83, 0x98, 0x08, 0x40, 0x03, 0x08, + 0x84, 0x98, 0x90, 0xE4, 0xE6, 0x08, 0xFE, 0x7F, 0x8D, 0xB8, 0xE2, 0xC8, + 0x01, 0xDC, 0x01, 0xA9, 0x85, 0x99, 0x86, 0x90, 0x16, 0x98, 0x87, 0x98, + 0x23, 0x08, 0x33, 0x09, 0xFB, 0x7F, 0xE2, 0xDF, 0x4C, 0x08, 0x00, 0x40, + 0x87, 0xBC, 0x0C, 0x40, 0x12, 0x09, 0xFF, 0x7F, 0x98, 0xBC, 0x98, 0xBD, + 0x0C, 0x40, 0x12, 0x19, 0x02, 0x40, 0x0C, 0x28, 0x06, 0xC8, 0x07, 0x40, + 0x80, 0xBC, 0xF8, 0x7F, 0x9F, 0xBC, 0x98, 0xBD, 0x0C, 0x40, 0x12, 0x19, + 0x4C, 0x00, 0x80, 0xE4, 0x6A, 0xC8, 0x75, 0xC8, 0x18, 0xE4, 0x00, 0x40, + 0x13, 0xBC, 0xE2, 0xC1, 0x0B, 0xD5, 0x78, 0xE0, 0x00, 0x40, 0x84, 0xBC, + 0x18, 0xBD, 0x12, 0xC1, 0xF8, 0x7F, 0x9F, 0xBC, 0x91, 0xBD, 0x0C, 0x40, + 0x12, 0x19, 0x4C, 0x00, 0x1A, 0xC0, 0x00, 0x4F, 0x00, 0xBC, 0xFF, 0x70, + 0x9F, 0xBC, 0x90, 0xBD, 0x0C, 0x40, 0x12, 0x19, 0x7B, 0x41, 0x23, 0x08, + 0x00, 0x40, 0x8F, 0xBC, 0x22, 0xC8, 0x07, 0x5F, 0x97, 0xBC, 0x98, 0xBD, + 0x0C, 0x40, 0x12, 0x19, 0x23, 0x08, 0x0C, 0x40, 0xC2, 0x38, 0x33, 0x08, + 0x0C, 0x40, 0xD2, 0x38, 0x93, 0x09, 0x00, 0x40, 0x93, 0xBC, 0x0A, 0xC9, + 0x0C, 0x40, 0x32, 0x08, 0xFF, 0x7F, 0x83, 0xBC, 0x89, 0xBD, 0x0C, 0x40, + 0x32, 0x18, 0x36, 0x09, 0x00, 0x40, 0x93, 0xBC, 0x00, 0x40, 0x8C, 0xBC, + 0x89, 0xBD, 0x0C, 0x40, 0x32, 0x18, 0x7C, 0x41, 0x13, 0x08, 0x0D, 0x40, + 0x82, 0x38, 0x7C, 0x41, 0x23, 0x08, 0x0D, 0x40, 0x92, 0x38, 0xFC, 0x88, + 0x0D, 0x40, 0xB2, 0x38, 0xEC, 0x88, 0x0D, 0x40, 0xA2, 0x38, 0x0C, 0x08, + 0x0D, 0x40, 0x22, 0x18, 0x1C, 0x08, 0x0D, 0x40, 0x32, 0x18, 0x2C, 0x08, + 0x0E, 0x40, 0x02, 0x18, 0x1C, 0x40, 0x52, 0x3A, 0x1C, 0x40, 0x42, 0x3F, + 0x00, 0xA8, 0x0E, 0x40, 0xB2, 0x38, 0x1E, 0x08, 0x1D, 0x40, 0x02, 0x38, + 0x1D, 0x40, 0x02, 0x89, 0x0E, 0x40, 0x22, 0x19, 0x10, 0x40, 0x12, 0x04, + 0x20, 0x40, 0x40, 0xBD, 0x10, 0x40, 0x12, 0x14, 0x84, 0xE4, 0x5A, 0xC8, + 0x88, 0xB8, 0x03, 0x40, 0xF6, 0xD6, 0x0E, 0x40, 0x32, 0x09, 0x00, 0x40, + 0x9F, 0xBD, 0x0E, 0x40, 0x32, 0x19, 0x09, 0x40, 0x23, 0x08, 0x00, 0x40, + 0x81, 0xBC, 0x12, 0xC8, 0x7F, 0x40, 0x00, 0x7C, 0x9F, 0xBC, 0x98, 0xBD, + 0x0E, 0x40, 0x32, 0x19, 0x0D, 0x40, 0x13, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0x0F, 0x40, 0x02, 0x00, 0xFF, 0x7F, 0x0E, 0xBC, 0x08, 0xBD, 0x0F, 0x40, + 0x02, 0x10, 0x0D, 0x40, 0x13, 0x08, 0xE0, 0xC8, 0x03, 0x40, 0xCC, 0xD5, + 0x7C, 0x41, 0x03, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x06, 0xC8, 0xFF, 0x7F, + 0x0D, 0xBC, 0x08, 0xBD, 0x0F, 0x40, 0x02, 0x10, 0xB1, 0x44, 0x3E, 0x08, + 0xE0, 0xC8, 0x02, 0xD5, 0x0D, 0x40, 0x33, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0x0A, 0xC8, 0xFF, 0x7F, 0x0B, 0xBC, 0x08, 0xBD, 0x0F, 0x40, 0x02, 0x10, + 0x7D, 0x41, 0x03, 0x08, 0x00, 0xA9, 0xE0, 0xC8, 0x02, 0xD4, 0x0D, 0x40, + 0x23, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x12, 0xC9, 0xFE, 0x7F, 0x0F, 0xBC, + 0x09, 0xBD, 0x0F, 0x40, 0x02, 0x10, 0x00, 0xA9, 0xB1, 0x44, 0x3E, 0x08, + 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xA9, 0x0E, 0xC9, 0xFF, 0x7F, 0x07, 0xBC, + 0x09, 0xBD, 0x0F, 0x40, 0x02, 0x10, 0x00, 0xA9, 0x05, 0x40, 0x5C, 0x28, + 0x00, 0x40, 0x81, 0xBC, 0x04, 0xD5, 0x36, 0x08, 0xE2, 0xC8, 0x01, 0xD5, + 0x01, 0xA9, 0x16, 0xC9, 0xFD, 0x7F, 0x0F, 0xBC, 0x09, 0xBD, 0x0F, 0x40, + 0x02, 0x10, 0x05, 0x40, 0x5C, 0x29, 0x16, 0xC9, 0x04, 0x40, 0x90, 0xBC, + 0x80, 0xE4, 0xFB, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, 0x07, 0x40, 0x8F, 0xBC, + 0x0F, 0x40, 0x02, 0x18, 0x13, 0x90, 0x03, 0x40, 0x0F, 0xBC, 0x0F, 0x40, + 0x12, 0x08, 0x0C, 0x7C, 0x80, 0xBC, 0x12, 0x91, 0x03, 0x40, 0x1F, 0xBC, + 0x92, 0x91, 0x22, 0xC1, 0x80, 0xBD, 0x81, 0xBD, 0x0F, 0x40, 0x12, 0x18, + 0x12, 0x40, 0x03, 0x09, 0x03, 0x40, 0x9F, 0xBC, 0x42, 0xC9, 0xF0, 0x7F, + 0xFF, 0x4F, 0x8F, 0xBC, 0x89, 0xBD, 0x0F, 0x40, 0x12, 0x18, 0x0E, 0x40, + 0x13, 0x09, 0x00, 0x40, 0x97, 0xBC, 0x62, 0xC9, 0x0F, 0x40, 0xF3, 0x73, + 0x8F, 0xBC, 0x89, 0xBD, 0x0F, 0x40, 0x12, 0x18, 0x26, 0x08, 0x00, 0x40, + 0x81, 0xBC, 0x0F, 0x40, 0x22, 0x09, 0xFF, 0x7F, 0x9E, 0xBC, 0x98, 0xBD, + 0x0F, 0x40, 0x22, 0x19, 0x46, 0x08, 0x03, 0x40, 0x8F, 0xBC, 0x22, 0xC8, + 0x0F, 0x7C, 0x9F, 0xBC, 0x98, 0xBD, 0x0F, 0x40, 0x22, 0x19, 0xB2, 0x44, + 0x0E, 0x08, 0x03, 0x40, 0x8F, 0xBC, 0x42, 0xC8, 0xF0, 0x7F, 0xFF, 0x4F, + 0x9F, 0xBC, 0x98, 0xBD, 0x0F, 0x40, 0x22, 0x19, 0x46, 0x08, 0x0A, 0xC8, + 0x14, 0x40, 0x08, 0xA0, 0xD7, 0xE1, 0x07, 0xB8, 0x80, 0xB8, 0x08, 0x08, + 0x07, 0x40, 0x8F, 0xBC, 0x62, 0xC8, 0x0F, 0x40, 0xF0, 0x73, 0x91, 0xBC, + 0x98, 0xBD, 0x0F, 0x40, 0x22, 0x19, 0xBC, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0x0F, 0x40, 0x32, 0x09, 0xFF, 0x7F, 0x9E, 0xBC, 0x98, 0xBD, 0x89, 0xE4, + 0x00, 0x40, 0x81, 0xBC, 0x03, 0x40, 0x15, 0xD5, 0x0F, 0x40, 0x32, 0x19, + 0x15, 0x91, 0x13, 0x41, 0x31, 0x08, 0xFF, 0x47, 0x8F, 0xBC, 0x06, 0xC8, + 0x00, 0x70, 0x91, 0xBC, 0x98, 0xBD, 0x0F, 0x40, 0x32, 0x19, 0x05, 0x40, + 0x4C, 0x28, 0x56, 0xC8, 0xF0, 0x43, 0x00, 0x40, 0x80, 0xBC, 0x0F, 0x7C, + 0xFF, 0x7F, 0x9F, 0xBC, 0x98, 0xBD, 0xF0, 0x43, 0xFF, 0x4F, 0x9F, 0xBC, + 0x0F, 0x40, 0x32, 0x19, 0xD3, 0x09, 0x01, 0x40, 0x9F, 0xBC, 0x10, 0x40, + 0x02, 0x08, 0xFE, 0x7F, 0x80, 0xBC, 0x89, 0xBD, 0x10, 0x40, 0x02, 0x18, + 0xE3, 0x09, 0x01, 0x40, 0x9F, 0xBC, 0x16, 0xC9, 0xC1, 0x7F, 0x8F, 0xBC, + 0x89, 0xBD, 0x10, 0x40, 0x02, 0x18, 0x0C, 0x40, 0x03, 0x09, 0x01, 0x40, + 0x9F, 0xBC, 0x2A, 0xC9, 0x3F, 0x78, 0x8F, 0xBC, 0x89, 0xBD, 0x10, 0x40, + 0x02, 0x18, 0x0B, 0x40, 0x33, 0x09, 0x01, 0x40, 0x9F, 0xBC, 0x3E, 0xC9, + 0xFC, 0x7F, 0xFF, 0x47, 0x8F, 0xBC, 0x89, 0xBD, 0x10, 0x40, 0x02, 0x18, + 0x0B, 0x40, 0x23, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x52, 0xC9, 0x18, 0xE4, + 0xFB, 0x7F, 0xFF, 0x7F, 0x1F, 0xBC, 0x19, 0xBD, 0x10, 0x40, 0x02, 0x11, + 0x00, 0xA0, 0x0C, 0x40, 0x23, 0x08, 0xE0, 0xC8, 0x04, 0xD5, 0x26, 0x08, + 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xA0, 0x56, 0xC0, 0x91, 0xE4, 0xF7, 0x7F, + 0xFF, 0x7F, 0x9F, 0xBC, 0x90, 0xBD, 0x10, 0x40, 0x02, 0x19, 0x00, 0xA1, + 0x0B, 0x40, 0x13, 0x08, 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xA1, 0x5A, 0xC1, + 0x0F, 0x40, 0xFF, 0x7F, 0x9F, 0xBC, 0x91, 0xBD, 0x10, 0x40, 0x02, 0x19, + 0x0A, 0x40, 0x33, 0x08, 0x06, 0xC8, 0x0A, 0x40, 0x23, 0x09, 0x98, 0xBD, + 0x0B, 0x40, 0x03, 0x08, 0x0A, 0xC8, 0x98, 0xBD, 0x00, 0x40, 0x97, 0xBC, + 0x04, 0xE4, 0xFE, 0x7F, 0x00, 0xBC, 0x14, 0x94, 0x00, 0x40, 0x43, 0xBC, + 0x94, 0x94, 0x0E, 0xC4, 0x09, 0xBD, 0x04, 0xBD, 0x10, 0x40, 0x12, 0x10, + 0x2C, 0x40, 0x1E, 0x28, 0x06, 0xC8, 0x2C, 0x40, 0x0E, 0x29, 0x89, 0xBD, + 0x00, 0x40, 0x83, 0xBC, 0x16, 0xC8, 0xF9, 0x7F, 0x0F, 0xBC, 0x08, 0xBD, + 0x10, 0x40, 0x12, 0x10, 0xA6, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x1E, 0xC9, + 0xE7, 0x7F, 0x0F, 0xBC, 0x17, 0x98, 0x00, 0x40, 0x81, 0xBC, 0x22, 0xC8, + 0x09, 0xBD, 0x08, 0xBD, 0x10, 0x40, 0x12, 0x10, 0x36, 0x08, 0xE0, 0xC8, + 0x03, 0xD4, 0x01, 0xA8, 0xFA, 0xBF, 0x01, 0xD5, 0x00, 0xA8, 0x2A, 0xC8, + 0xBF, 0x7F, 0x0F, 0xBC, 0x08, 0xBD, 0x10, 0x40, 0x12, 0x10, 0x00, 0xA9, + 0x09, 0x40, 0x13, 0x08, 0xE0, 0xC8, 0x04, 0xD5, 0x26, 0x08, 0xE0, 0xC8, + 0x01, 0xD4, 0x01, 0xA9, 0x2E, 0xC9, 0x7F, 0x7F, 0x0F, 0xBC, 0x09, 0xBD, + 0x00, 0x41, 0x00, 0xBD, 0x10, 0x40, 0x12, 0x10, 0x00, 0xA9, 0x0C, 0x40, + 0x13, 0x08, 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xA9, 0x36, 0xC9, 0xFF, 0x7D, + 0x0F, 0xBC, 0x09, 0xBD, 0x10, 0x40, 0x12, 0x10, 0x00, 0xA9, 0x0D, 0x40, + 0x03, 0x08, 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xA9, 0x3A, 0xC9, 0x80, 0xE4, + 0xFF, 0x7B, 0x8F, 0xBC, 0x89, 0xBD, 0x98, 0xE4, 0xFF, 0x77, 0x9F, 0xBC, + 0x10, 0x40, 0x12, 0x19, 0xC3, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x42, 0xC9, + 0xFF, 0x67, 0x8F, 0xBC, 0x89, 0xBD, 0x10, 0x40, 0x12, 0x18, 0xB3, 0x09, + 0x00, 0x40, 0x91, 0xBC, 0x46, 0xC9, 0xFF, 0x7F, 0xFF, 0x5F, 0x8F, 0xBC, + 0x89, 0xBD, 0x10, 0x40, 0x12, 0x18, 0x08, 0x40, 0x33, 0x09, 0x00, 0x40, + 0x91, 0xBC, 0x4A, 0xC9, 0xFE, 0x7F, 0xFF, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, + 0x10, 0x40, 0x12, 0x18, 0x0C, 0x40, 0x33, 0x09, 0x00, 0x40, 0x91, 0xBC, + 0x4E, 0xC9, 0x05, 0x40, 0xFF, 0x77, 0x8F, 0xBC, 0x89, 0xBD, 0x10, 0x40, + 0x12, 0x18, 0x09, 0x40, 0x03, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x10, 0x40, + 0x22, 0x09, 0xFF, 0x7F, 0x9E, 0xBC, 0x98, 0xBD, 0x10, 0x40, 0x22, 0x19, + 0x12, 0x40, 0x03, 0x28, 0x00, 0x40, 0x82, 0xBC, 0xFF, 0x7F, 0x9D, 0xBC, + 0x98, 0xBD, 0x10, 0x40, 0x22, 0x19, 0x12, 0x40, 0x03, 0x28, 0x00, 0x40, + 0x84, 0xBC, 0xFF, 0x7F, 0x9B, 0xBC, 0x98, 0xBD, 0x10, 0x40, 0x22, 0x19, + 0x26, 0x08, 0xE0, 0xC8, 0x01, 0x40, 0xBC, 0xD5, 0xEA, 0x7F, 0x97, 0xBC, + 0x0A, 0x40, 0x98, 0xBD, 0xFF, 0x77, 0x9F, 0xBC, 0xE0, 0x57, 0x90, 0xBD, + 0x10, 0x40, 0x22, 0x19, 0x16, 0x40, 0x03, 0x08, 0xE2, 0xC8, 0x01, 0x40, + 0xD4, 0xD5, 0xE0, 0xC8, 0x03, 0xD5, 0xE1, 0xC8, 0x02, 0x40, 0x5E, 0xD5, + 0xFF, 0x7F, 0xFF, 0x5F, 0x9F, 0xBC, 0x00, 0x40, 0xFF, 0x7F, 0x9F, 0xBC, + 0x10, 0x40, 0x22, 0x19, 0x18, 0x98, 0x10, 0x40, 0xF2, 0x38, 0x19, 0x98, + 0x10, 0x40, 0xE2, 0x38, 0x21, 0x40, 0x02, 0x98, 0x11, 0x40, 0x92, 0x38, + 0x21, 0x40, 0x03, 0x98, 0x11, 0x40, 0x82, 0x38, 0x22, 0x40, 0x00, 0x98, + 0x11, 0x40, 0xB2, 0x38, 0x22, 0x40, 0x01, 0x98, 0x11, 0x40, 0xA2, 0x38, + 0x09, 0x40, 0x23, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x11, 0x40, 0x22, 0x09, + 0xFF, 0x7F, 0x9E, 0xBC, 0x98, 0xBD, 0x11, 0x40, 0x22, 0x19, 0xB3, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0x06, 0xC8, 0xFF, 0x7F, 0x9D, 0xBC, 0x98, 0xBD, + 0x11, 0x40, 0x22, 0x19, 0x00, 0xA0, 0x7C, 0x41, 0x03, 0x08, 0xE0, 0xC8, + 0x01, 0x40, 0x23, 0xD4, 0x05, 0x40, 0x5C, 0x28, 0x05, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x01, 0x40, 0x1C, 0xD4, 0x0A, 0xC0, 0x89, 0xE4, 0xFF, 0x7F, + 0x8B, 0xBC, 0x80, 0xBD, 0x11, 0x40, 0x22, 0x18, 0x0C, 0x40, 0x13, 0x09, + 0x00, 0x40, 0x91, 0xBC, 0x0E, 0xC9, 0x08, 0xE4, 0xFF, 0x7F, 0x07, 0xBC, + 0x09, 0xBD, 0x11, 0x40, 0x22, 0x10, 0x00, 0xA9, 0x0C, 0x40, 0x23, 0x08, + 0xE0, 0xC8, 0x04, 0xD5, 0x26, 0x08, 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xA9, + 0x16, 0xC9, 0x80, 0xE4, 0xF1, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, 0x08, 0x40, + 0x80, 0xBD, 0x11, 0x40, 0x22, 0x18, 0x46, 0x09, 0x07, 0x40, 0x9F, 0xBC, + 0x22, 0xC9, 0x0F, 0x78, 0x8F, 0xBC, 0x89, 0xBD, 0x11, 0x40, 0x22, 0x18, + 0x07, 0x40, 0x03, 0x08, 0x00, 0xA9, 0xE2, 0xC8, 0x01, 0x40, 0xB0, 0xD5, + 0x11, 0x40, 0xD2, 0x39, 0x11, 0x40, 0x22, 0x08, 0xFE, 0x77, 0x8F, 0xBC, + 0x11, 0x40, 0x22, 0x18, 0x23, 0x01, 0x03, 0x40, 0x1F, 0xB8, 0x19, 0xC1, + 0x11, 0x40, 0xE2, 0x31, 0x33, 0x08, 0x03, 0x40, 0x8F, 0xB8, 0x19, 0xC8, + 0x11, 0x40, 0xF2, 0x38, 0x16, 0x94, 0x04, 0x09, 0x00, 0x40, 0x97, 0xBC, + 0x62, 0xC9, 0x12, 0x40, 0x02, 0x08, 0x3F, 0x7E, 0xFF, 0x7F, 0x8F, 0xBC, + 0x89, 0xBD, 0x12, 0x40, 0x02, 0x18, 0x04, 0x08, 0xE0, 0xC8, 0x00, 0x40, + 0xCA, 0xD4, 0x24, 0x40, 0x22, 0x38, 0x24, 0x40, 0x12, 0x38, 0x24, 0x40, + 0x02, 0x38, 0x12, 0x40, 0x02, 0x08, 0xFF, 0x41, 0xFF, 0x7F, 0x8F, 0xBC, + 0x12, 0x40, 0x02, 0x18, 0x07, 0x40, 0x03, 0x08, 0x00, 0xA9, 0xE2, 0xC8, + 0x00, 0x40, 0xD1, 0xD5, 0x12, 0x40, 0xB2, 0x39, 0x06, 0x40, 0x33, 0x08, + 0x00, 0xA9, 0xE2, 0xC8, 0x00, 0x40, 0xD3, 0xD5, 0x12, 0x40, 0xA2, 0x39, + 0x07, 0x40, 0x03, 0x08, 0xE1, 0xC8, 0x00, 0x40, 0xD5, 0xD5, 0x11, 0x40, + 0xE2, 0x28, 0x11, 0x40, 0xF2, 0x24, 0x84, 0xE6, 0x12, 0x40, 0xD2, 0x38, + 0x06, 0x40, 0x33, 0x08, 0xE1, 0xC8, 0x00, 0x40, 0xD2, 0xD5, 0x11, 0x40, + 0xE2, 0x28, 0x11, 0x40, 0xF2, 0x29, 0x89, 0xE6, 0x12, 0x40, 0xC2, 0x38, + 0xBC, 0x09, 0x89, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x00, 0x40, 0xCF, 0xD5, + 0xCC, 0x08, 0x13, 0x40, 0x12, 0x18, 0xDC, 0x08, 0x13, 0x40, 0x22, 0x18, + 0x12, 0x40, 0x33, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x12, 0x40, 0x32, 0x08, + 0xFF, 0x7F, 0x8E, 0xBC, 0x89, 0xBD, 0x12, 0x40, 0x32, 0x18, 0x13, 0x40, + 0x03, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x06, 0xC9, 0xFF, 0x7F, 0x8D, 0xBC, + 0x89, 0xBD, 0x12, 0x40, 0x32, 0x18, 0x13, 0x40, 0x13, 0x09, 0x00, 0x40, + 0x91, 0xBC, 0x0A, 0xC9, 0xFF, 0x7F, 0x8B, 0xBC, 0x89, 0xBD, 0x12, 0x40, + 0x32, 0x18, 0x13, 0x40, 0x23, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x0E, 0xC9, + 0x08, 0xE4, 0xFF, 0x7F, 0x07, 0xBC, 0x09, 0xBD, 0x12, 0x40, 0x32, 0x10, + 0x36, 0x08, 0xE2, 0xC8, 0x01, 0x40, 0x03, 0xD5, 0x15, 0x40, 0x13, 0x08, + 0x01, 0x40, 0x8F, 0xBC, 0x12, 0xC8, 0x90, 0xE4, 0xE0, 0x7F, 0x9F, 0xBC, + 0x98, 0xBD, 0x12, 0x40, 0x32, 0x19, 0x15, 0x40, 0x23, 0x08, 0x01, 0x40, + 0x8F, 0xBC, 0x26, 0xC8, 0x1F, 0x7C, 0x9F, 0xBC, 0x98, 0xBD, 0x12, 0x40, + 0x32, 0x19, 0x15, 0x40, 0x33, 0x08, 0x01, 0x40, 0x8F, 0xBC, 0x3A, 0xC8, + 0xFE, 0x7F, 0xFF, 0x43, 0x9F, 0xBC, 0x98, 0xBD, 0x12, 0x40, 0x32, 0x19, + 0x13, 0x40, 0x33, 0x08, 0x26, 0x40, 0x02, 0x38, 0x14, 0x40, 0x03, 0x08, + 0x26, 0x40, 0x12, 0x38, 0x14, 0x40, 0x13, 0x08, 0x26, 0x40, 0x22, 0x38, + 0x1E, 0x08, 0x06, 0x40, 0x92, 0x38, 0x0C, 0x40, 0x32, 0x08, 0x00, 0x40, + 0x83, 0xBC, 0xE1, 0xC8, 0x07, 0xD5, 0xE0, 0xC8, 0x00, 0x40, 0xB1, 0xD4, + 0x17, 0x90, 0xE0, 0xC0, 0x01, 0x40, 0x01, 0xD5, 0x06, 0x40, 0x82, 0x3F, + 0x82, 0xE4, 0x22, 0x40, 0x02, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, + 0x06, 0x40, 0x16, 0x08, 0x18, 0x08, 0x83, 0x98, 0x16, 0x40, 0x13, 0x08, + 0x84, 0x98, 0x85, 0x99, 0x33, 0xA8, 0x86, 0x98, 0x14, 0x40, 0x08, 0xA0, + 0xD7, 0xE1, 0x07, 0xB8, 0x87, 0x90, 0xFB, 0x7F, 0x7F, 0xDE, 0x01, 0xA0, + 0xFE, 0x7F, 0xE1, 0xDE, 0x0A, 0xE4, 0xFB, 0x7F, 0xBB, 0xDE, 0xE3, 0xC8, + 0x00, 0x40, 0xFF, 0xD5, 0x16, 0x99, 0x19, 0x08, 0x24, 0x40, 0x22, 0x38, + 0x39, 0x08, 0x24, 0x40, 0x12, 0x38, 0x29, 0x08, 0x24, 0x40, 0x02, 0x38, + 0x12, 0x40, 0x02, 0x08, 0xFF, 0x41, 0xFF, 0x7F, 0x8F, 0xBC, 0x12, 0x40, + 0x02, 0x18, 0x07, 0x40, 0x03, 0x08, 0x00, 0xA9, 0xE2, 0xC8, 0xFF, 0x7F, + 0x2F, 0xD4, 0x07, 0x40, 0xC3, 0x29, 0x12, 0x40, 0xB2, 0x39, 0x06, 0x40, + 0x33, 0x08, 0x00, 0xA9, 0xE2, 0xC8, 0xFF, 0x7F, 0x2D, 0xD4, 0x07, 0x40, + 0xA3, 0x29, 0x12, 0x40, 0xA2, 0x39, 0x07, 0x40, 0x03, 0x08, 0xE1, 0xC8, + 0xFF, 0x7F, 0x2B, 0xD4, 0x07, 0x40, 0xC3, 0x28, 0x12, 0x40, 0xD2, 0x38, + 0x06, 0x40, 0x33, 0x08, 0xE1, 0xC8, 0xFF, 0x7F, 0x2E, 0xD4, 0x07, 0x40, + 0xA3, 0x28, 0x12, 0x40, 0xC2, 0x38, 0xBC, 0x09, 0x89, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0xFF, 0x7F, 0x31, 0xD4, 0x5A, 0xC9, 0x99, 0xB8, 0xFF, 0x7F, + 0x30, 0xD6, 0xEC, 0x08, 0xFF, 0x7F, 0x2B, 0xDE, 0x09, 0x40, 0x33, 0x08, + 0x00, 0x40, 0x83, 0xBC, 0x0E, 0xC8, 0xFE, 0x7F, 0x97, 0xBC, 0x98, 0xBD, + 0x10, 0x40, 0x22, 0x19, 0x0A, 0x40, 0x03, 0x08, 0x00, 0x40, 0x83, 0xBC, + 0x16, 0xC8, 0xF9, 0x7F, 0x9F, 0xBC, 0x98, 0xBD, 0x10, 0x40, 0x22, 0x19, + 0x0A, 0x40, 0x13, 0x08, 0x00, 0x40, 0x83, 0xBC, 0x1E, 0xC8, 0xE7, 0x7F, + 0x9F, 0xBC, 0x98, 0xBD, 0xFF, 0x77, 0x9F, 0xBC, 0xE0, 0x57, 0x90, 0xBD, + 0x10, 0x40, 0x22, 0x19, 0x16, 0x40, 0x03, 0x08, 0xE2, 0xC8, 0xFE, 0x7F, + 0x2C, 0xD4, 0x00, 0xA0, 0x36, 0x08, 0xE2, 0xC8, 0x01, 0xD5, 0x01, 0xA0, + 0x46, 0xC0, 0xFF, 0x7F, 0xFF, 0x5F, 0x9F, 0xBC, 0x90, 0xBD, 0xFE, 0x7F, + 0x28, 0xDE, 0x0F, 0x7C, 0x00, 0x70, 0x91, 0xBC, 0xFC, 0x7F, 0xFD, 0xDE, + 0x05, 0x40, 0x5C, 0x28, 0x00, 0x40, 0x82, 0xBC, 0xFE, 0x7F, 0x09, 0xBC, + 0x08, 0xBD, 0xFC, 0x7F, 0x50, 0xDE, 0x0E, 0x40, 0x32, 0x09, 0xFF, 0x7F, + 0x90, 0xBC, 0xFC, 0x7F, 0x08, 0xDE, 0x00, 0xA8, 0x06, 0x40, 0x82, 0x38, + 0x82, 0xE4, 0x22, 0x40, 0x02, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, + 0x00, 0xAF, 0xAF, 0xE4, 0x98, 0x9F, 0x99, 0x9F, 0x21, 0x40, 0x82, 0x9F, + 0x21, 0x40, 0x83, 0x9F, 0x22, 0x40, 0x80, 0x9F, 0x22, 0x40, 0x81, 0x9F, + 0x94, 0x9F, 0x01, 0xA1, 0x97, 0x91, 0xFB, 0x7F, 0x4D, 0xDE, 0x14, 0x40, + 0x23, 0x08, 0x01, 0x40, 0x8F, 0xBC, 0x12, 0xC8, 0x90, 0xE4, 0xE0, 0x7F, + 0x9F, 0xBC, 0x98, 0xBD, 0x12, 0x40, 0x32, 0x19, 0x14, 0x40, 0x33, 0x08, + 0x01, 0x40, 0x8F, 0xBC, 0x26, 0xC8, 0x1F, 0x7C, 0x9F, 0xBC, 0x98, 0xBD, + 0x12, 0x40, 0x32, 0x19, 0x15, 0x40, 0x03, 0x08, 0xFE, 0x7F, 0xFB, 0xDE, + 0x07, 0x40, 0xC3, 0x29, 0xFE, 0x7F, 0x4C, 0xDE, 0x00, 0x40, 0x24, 0x63, + 0x04, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x27, 0x63, 0x0D, 0xA8, 0x1A, 0x40, + 0x0C, 0xA9, 0x39, 0x40, 0x70, 0xDF, 0xFB, 0x7F, 0x23, 0xDE, 0x00, 0x40, + 0x2B, 0x63, 0x07, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x27, 0x63, 0x0D, 0xA8, + 0x1A, 0x40, 0x0B, 0xA9, 0x39, 0x40, 0x63, 0xDF, 0xFB, 0x7F, 0x13, 0xDE, + 0x97, 0x90, 0xFA, 0x7F, 0xD4, 0xDE, 0x20, 0x40, 0x42, 0x28, 0x7D, 0xC8, + 0x9A, 0xE4, 0x01, 0xD5, 0x9F, 0xE4, 0x06, 0x40, 0x82, 0x39, 0x82, 0xE4, + 0x22, 0x40, 0x02, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0xCC, 0x08, + 0x4E, 0x09, 0xDF, 0x7F, 0xC0, 0xDF, 0x48, 0xE4, 0x91, 0xE4, 0x36, 0x08, + 0xE2, 0xC8, 0xFA, 0x7F, 0x1B, 0xD4, 0x01, 0xA9, 0xFA, 0x7F, 0x18, 0xDE, + 0x00, 0x40, 0x00, 0x60, 0x90, 0xBD, 0xFD, 0x7F, 0xA0, 0xDE, 0x16, 0x90, + 0x50, 0x08, 0x24, 0x40, 0x22, 0x38, 0x01, 0xE4, 0x50, 0xE0, 0x16, 0x91, + 0x41, 0x08, 0x90, 0xE4, 0x31, 0x40, 0x8F, 0xDF, 0x24, 0x40, 0x12, 0x38, + 0x41, 0x08, 0x90, 0xE4, 0x32, 0x40, 0x31, 0xDF, 0xFE, 0x7F, 0x25, 0xDE, + 0xAF, 0xE4, 0xFA, 0x7F, 0xD7, 0xDE, 0xFA, 0xE4, 0xFA, 0x7F, 0xD1, 0xDE, + 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0xB8, 0xE4, 0x48, 0xE4, + 0x2C, 0x40, 0x40, 0xB8, 0xA5, 0x44, 0x08, 0x06, 0x00, 0xAA, 0x7A, 0x41, + 0x34, 0x08, 0xE2, 0x7F, 0x16, 0xDF, 0x18, 0xE4, 0x7B, 0x41, 0x04, 0x08, + 0xE0, 0xC8, 0x01, 0x40, 0xAA, 0xD4, 0x2B, 0xE4, 0xE3, 0x44, 0x24, 0xB8, + 0xF6, 0x09, 0xC1, 0xC9, 0x00, 0x40, 0x97, 0xBC, 0x42, 0x08, 0xFF, 0x7F, + 0x88, 0xBC, 0x89, 0xBD, 0x98, 0xE4, 0xE0, 0x7F, 0x97, 0xBC, 0x42, 0x19, + 0xE6, 0x09, 0x03, 0x40, 0x9F, 0xBC, 0x26, 0xC9, 0x00, 0x40, 0x87, 0xBC, + 0x89, 0xBD, 0x42, 0x18, 0x00, 0xA3, 0x52, 0x13, 0x9B, 0x08, 0x03, 0x40, + 0x8F, 0xBC, 0x62, 0x18, 0x66, 0x08, 0x01, 0x40, 0xE2, 0x38, 0x08, 0xA8, + 0x01, 0x40, 0xF2, 0x38, 0x7A, 0x41, 0x34, 0x08, 0x01, 0x40, 0x8F, 0xBC, + 0x82, 0x09, 0xFE, 0x7F, 0x90, 0xBC, 0x98, 0xBD, 0x82, 0x19, 0x96, 0x08, + 0x01, 0x40, 0x8F, 0xBC, 0x16, 0xC8, 0xC1, 0x7F, 0x9F, 0xBC, 0x98, 0xBD, + 0x82, 0x19, 0x03, 0xE4, 0x05, 0x40, 0x26, 0x08, 0xE0, 0xC8, 0x01, 0xD4, + 0x01, 0xA0, 0x2A, 0xC0, 0x89, 0xE4, 0xF8, 0x7F, 0xBF, 0x4F, 0x8F, 0xBC, + 0x01, 0x40, 0x1F, 0xBC, 0x42, 0xC1, 0x80, 0xBD, 0x81, 0xBD, 0x07, 0x40, + 0x7F, 0x70, 0x8F, 0xBC, 0x82, 0x18, 0x09, 0x40, 0x14, 0x08, 0x92, 0x18, + 0x0C, 0x40, 0x24, 0x08, 0xA2, 0x18, 0xA6, 0x08, 0xB2, 0x18, 0x93, 0xE4, + 0x0B, 0x40, 0x24, 0x08, 0xE0, 0xC8, 0x0A, 0xD5, 0x0C, 0x40, 0x24, 0x08, + 0xE0, 0xC8, 0x01, 0x40, 0x30, 0xD4, 0x0B, 0x40, 0x14, 0x08, 0xE0, 0xC8, + 0x01, 0x40, 0x2B, 0xD5, 0xC2, 0x08, 0xFF, 0x7F, 0x8E, 0xBC, 0x89, 0xBD, + 0xC2, 0x18, 0x0B, 0x40, 0x24, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x06, 0xC9, + 0x00, 0x40, 0x81, 0xBC, 0x89, 0xBD, 0xC2, 0x18, 0x00, 0xA9, 0x7B, 0x41, + 0x04, 0x08, 0xE1, 0xC8, 0x01, 0xDD, 0x01, 0xA9, 0xD2, 0x08, 0xF8, 0x7F, + 0x86, 0xBC, 0x00, 0x40, 0xAF, 0xBC, 0x0E, 0xCA, 0x89, 0xBD, 0x8A, 0xBD, + 0xD2, 0x18, 0x04, 0x40, 0x06, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x06, 0xC9, + 0xFF, 0x7F, 0x8D, 0xBC, 0x89, 0xBD, 0xD2, 0x18, 0x04, 0x40, 0x26, 0x09, + 0x00, 0x40, 0x9F, 0xBC, 0x22, 0xC9, 0x0F, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, + 0xD2, 0x18, 0x04, 0x40, 0x16, 0x09, 0x00, 0x40, 0x91, 0xBC, 0x0A, 0xC9, + 0xFF, 0x7F, 0x8B, 0xBC, 0x89, 0xBD, 0xD2, 0x18, 0x04, 0x40, 0x36, 0x09, + 0x00, 0x40, 0x9F, 0xBC, 0x52, 0xC9, 0xC0, 0x7F, 0xF7, 0x40, 0x8F, 0xBC, + 0x89, 0xBD, 0xD2, 0x18, 0x00, 0xAA, 0x06, 0x40, 0x72, 0x3A, 0xF4, 0x08, + 0xE1, 0xC8, 0x01, 0x40, 0x07, 0xD5, 0x07, 0x40, 0x32, 0x03, 0xFF, 0x7F, + 0x3C, 0xBC, 0x07, 0x40, 0x32, 0x13, 0x00, 0xA8, 0xE2, 0x18, 0xF4, 0x09, + 0x00, 0x40, 0x91, 0xBC, 0x5A, 0xC9, 0x83, 0xE4, 0xEF, 0x7F, 0xFF, 0x7F, + 0x8F, 0xBC, 0x89, 0xBD, 0x07, 0x40, 0x32, 0x18, 0x0D, 0x40, 0x14, 0x08, + 0xE0, 0xC8, 0x00, 0x40, 0x6A, 0xD5, 0x05, 0x40, 0x36, 0x08, 0xF2, 0x18, + 0x15, 0x45, 0x3B, 0x08, 0x04, 0x40, 0x02, 0x18, 0x06, 0x40, 0x06, 0x08, + 0x04, 0x40, 0x12, 0x18, 0x05, 0x40, 0x26, 0x09, 0xE0, 0xC9, 0x64, 0xD5, + 0x06, 0x40, 0x26, 0x04, 0x04, 0x29, 0x00, 0x40, 0x9F, 0xBC, 0x04, 0x40, + 0x22, 0x08, 0xFF, 0x7F, 0x80, 0xBC, 0x89, 0xBD, 0x04, 0x40, 0x22, 0x18, + 0x14, 0x29, 0x00, 0x40, 0x9F, 0xBC, 0x12, 0xC9, 0xF0, 0x7F, 0x8F, 0xBC, + 0x89, 0xBD, 0x04, 0x40, 0x22, 0x18, 0x94, 0x28, 0x09, 0x40, 0x22, 0x38, + 0xA4, 0x28, 0x09, 0x40, 0x32, 0x38, 0x00, 0xA8, 0x09, 0x40, 0x12, 0x38, + 0x86, 0x09, 0x09, 0xE4, 0x00, 0xA1, 0x04, 0x28, 0x34, 0xE4, 0xC6, 0xC3, + 0xE0, 0xC8, 0x00, 0x40, 0x77, 0xD8, 0x90, 0xE4, 0x00, 0xA1, 0x14, 0x28, + 0x34, 0xE4, 0x02, 0x40, 0x36, 0xB8, 0xE0, 0xC8, 0x0A, 0xD8, 0x60, 0xDE, + 0x0A, 0x40, 0x42, 0x38, 0x90, 0xE4, 0xC1, 0xC1, 0xC2, 0xC3, 0x14, 0x28, + 0x18, 0xBF, 0x58, 0xDA, 0x86, 0x00, 0x83, 0x28, 0x08, 0xB8, 0x80, 0xE4, + 0x89, 0xBA, 0x98, 0xE4, 0xDF, 0xC9, 0x00, 0xA8, 0xE0, 0x7F, 0x62, 0xDF, + 0xE0, 0xC1, 0xEC, 0xD5, 0xE1, 0xC1, 0x00, 0x40, 0x82, 0xD5, 0xE2, 0xC1, + 0x00, 0x40, 0x86, 0xD5, 0xE3, 0xC1, 0x00, 0x40, 0x87, 0xD5, 0xE4, 0xC1, + 0x01, 0x40, 0x07, 0xD5, 0xE5, 0xC1, 0x01, 0x40, 0x10, 0xD5, 0xE6, 0xC1, + 0x01, 0x40, 0x15, 0xD5, 0xE7, 0xC1, 0xDA, 0xD4, 0x0B, 0x40, 0x32, 0x38, + 0xD7, 0xDE, 0xF2, 0x18, 0x04, 0x40, 0x02, 0x18, 0x04, 0x40, 0x12, 0x18, + 0x05, 0x40, 0x26, 0x09, 0xE0, 0xC9, 0x9C, 0xD4, 0x04, 0x40, 0x22, 0x08, + 0xF0, 0x7F, 0x80, 0xBC, 0x04, 0x40, 0x22, 0x18, 0x09, 0x40, 0x12, 0x39, + 0x09, 0x40, 0x22, 0x39, 0x09, 0x40, 0x32, 0x39, 0x09, 0x40, 0x42, 0x39, + 0x09, 0x40, 0x52, 0x39, 0x09, 0x40, 0x62, 0x39, 0x09, 0x40, 0x72, 0x39, + 0x0A, 0x40, 0x02, 0x39, 0x0A, 0x40, 0x12, 0x39, 0x0A, 0x40, 0x22, 0x39, + 0x0A, 0x40, 0x32, 0x39, 0x0A, 0x40, 0x42, 0x39, 0x0A, 0x40, 0x52, 0x39, + 0x0A, 0x40, 0x62, 0x39, 0x0A, 0x40, 0x72, 0x39, 0x0B, 0x40, 0x02, 0x39, + 0x0B, 0x40, 0x12, 0x39, 0x0B, 0x40, 0x22, 0x39, 0x0B, 0x40, 0x32, 0x39, + 0x82, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x09, 0x40, + 0x42, 0x38, 0x90, 0xE4, 0xC1, 0xC1, 0xC2, 0xC3, 0x04, 0x28, 0x18, 0xBF, + 0x29, 0xDA, 0x86, 0x00, 0x83, 0x28, 0x08, 0xB8, 0x90, 0xBA, 0xDF, 0xC9, + 0x00, 0xA8, 0xDF, 0x7F, 0xFF, 0xDF, 0xE0, 0xC1, 0xEE, 0xD5, 0xE1, 0xC1, + 0x15, 0xD5, 0xE2, 0xC1, 0x22, 0xD5, 0xE3, 0xC1, 0x2B, 0xD5, 0xE4, 0xC1, + 0x00, 0x40, 0xAB, 0xD5, 0xE5, 0xC1, 0x00, 0x40, 0xAC, 0xD5, 0xE6, 0xC1, + 0x00, 0x40, 0xB1, 0xD5, 0xE7, 0xC1, 0xDF, 0xD4, 0x0A, 0x40, 0x32, 0x38, + 0xDC, 0xDE, 0x01, 0xA9, 0xFE, 0x7F, 0xD2, 0xDE, 0x09, 0x40, 0x52, 0x38, + 0x90, 0xE4, 0xC1, 0xC1, 0xC2, 0xC3, 0x04, 0x28, 0x18, 0xBF, 0xD7, 0xD9, + 0x86, 0x00, 0xFF, 0x7F, 0x5E, 0xDE, 0x0A, 0x40, 0x52, 0x38, 0xFF, 0x7F, + 0x65, 0xDE, 0x09, 0x40, 0x62, 0x38, 0xC7, 0xDE, 0x0A, 0x40, 0x62, 0x38, + 0xFF, 0x7F, 0x5E, 0xDE, 0x0A, 0x40, 0x72, 0x38, 0xFF, 0x7F, 0x5A, 0xDE, + 0x09, 0x40, 0x72, 0x38, 0xBC, 0xDE, 0xE0, 0x7F, 0x64, 0xDF, 0xA8, 0xE4, + 0xFE, 0x7F, 0x51, 0xDE, 0x16, 0xE4, 0x08, 0x40, 0x1C, 0xB8, 0x41, 0x08, + 0x00, 0x40, 0x83, 0xBC, 0x07, 0x40, 0x32, 0x03, 0xFF, 0x7F, 0x3C, 0xBC, + 0x38, 0xBD, 0x07, 0x40, 0x32, 0x13, 0x01, 0x88, 0x0A, 0xC8, 0xC0, 0x7F, + 0x33, 0xBC, 0x38, 0xBD, 0x07, 0x40, 0x32, 0x13, 0x41, 0x88, 0x2A, 0xC8, + 0xFF, 0x7F, 0x3F, 0x40, 0x3F, 0xBC, 0x38, 0xBD, 0x07, 0x40, 0x32, 0x13, + 0x21, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x4A, 0xC8, 0xFE, 0x7F, 0xFF, 0x7F, + 0x3F, 0xBC, 0x38, 0xBD, 0x07, 0x40, 0x32, 0x13, 0x01, 0x40, 0x01, 0x28, + 0x4A, 0xC8, 0x02, 0x40, 0x00, 0x40, 0x80, 0xBC, 0xFD, 0x7F, 0xFF, 0x7F, + 0x3F, 0xBC, 0x38, 0xBD, 0x93, 0xE4, 0x1F, 0x40, 0xFF, 0x7F, 0x3F, 0xBC, + 0x07, 0x40, 0x32, 0x13, 0x01, 0x00, 0x21, 0xC0, 0x01, 0x40, 0x41, 0x28, + 0x00, 0x40, 0x81, 0xBC, 0x52, 0xC8, 0x39, 0xE4, 0x1B, 0x40, 0xFF, 0x7F, + 0x3F, 0xBC, 0x38, 0xBD, 0x07, 0x40, 0x32, 0x13, 0x76, 0x09, 0x90, 0xBA, + 0x3F, 0x40, 0xFF, 0x7F, 0x9F, 0xBC, 0x08, 0x40, 0x02, 0x08, 0xC0, 0x7F, + 0x00, 0x40, 0x80, 0xBC, 0x89, 0xBD, 0x08, 0x40, 0x02, 0x18, 0x10, 0x40, + 0x32, 0x3A, 0x11, 0x00, 0x21, 0xC0, 0x01, 0x40, 0x51, 0x28, 0x00, 0x40, + 0x81, 0xBC, 0x56, 0xC8, 0xF7, 0x7F, 0xFF, 0x7F, 0x3F, 0xBC, 0x38, 0xBD, + 0x07, 0x40, 0x32, 0x13, 0x76, 0x09, 0x90, 0xBA, 0x08, 0x40, 0x02, 0x08, + 0x3F, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x98, 0xBA, 0x3F, 0x40, 0xFF, 0x7F, + 0x9F, 0xBC, 0x08, 0x40, 0x12, 0x08, 0xC0, 0x7F, 0x00, 0x40, 0x80, 0xBC, + 0x89, 0xBD, 0x08, 0x40, 0x12, 0x18, 0x10, 0x40, 0x72, 0x3A, 0xFE, 0x7F, + 0x88, 0xDE, 0x0B, 0x40, 0x02, 0x38, 0xFE, 0x7F, 0xD7, 0xDE, 0x0A, 0x40, + 0x02, 0x38, 0xFF, 0x7F, 0x38, 0xDE, 0x0A, 0x40, 0x12, 0x38, 0xFF, 0x7F, + 0x34, 0xDE, 0x0B, 0x40, 0x12, 0x38, 0xFE, 0x7F, 0xCB, 0xDE, 0x0A, 0x40, + 0x22, 0x38, 0xFF, 0x7F, 0x2C, 0xDE, 0x0B, 0x40, 0x22, 0x38, 0xFE, 0x7F, + 0xC3, 0xDE, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0x38, 0xE4, + 0xA9, 0xE4, 0x48, 0xE4, 0x2C, 0x40, 0x40, 0xB8, 0xA5, 0x44, 0x08, 0x01, + 0x12, 0x40, 0xE2, 0xDF, 0x91, 0x18, 0x00, 0xA8, 0x53, 0x09, 0xDF, 0x7F, + 0x23, 0xDF, 0x08, 0xE4, 0x06, 0x40, 0x31, 0x09, 0xE0, 0xC9, 0x00, 0x40, + 0xA9, 0xD5, 0x01, 0xA8, 0x05, 0x40, 0x21, 0x18, 0x91, 0x08, 0x04, 0x40, + 0x86, 0xE6, 0x83, 0xB8, 0x29, 0x46, 0x8C, 0xB8, 0x06, 0x40, 0x21, 0x18, + 0x20, 0xE4, 0x16, 0xC2, 0x23, 0xB8, 0x78, 0x46, 0x2C, 0xB8, 0x06, 0x40, + 0x11, 0x12, 0x0A, 0xC0, 0x03, 0xB8, 0x78, 0x47, 0x30, 0x08, 0xA1, 0x18, + 0x11, 0x09, 0xE3, 0xC9, 0x00, 0x40, 0xAE, 0xD5, 0x02, 0x40, 0x2A, 0x28, + 0x11, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x07, 0xD4, 0x02, 0xA8, 0xE0, 0xC9, + 0x01, 0xD4, 0x02, 0x08, 0x68, 0xE4, 0x31, 0x18, 0x01, 0xDE, 0x31, 0x06, + 0x00, 0xA8, 0xE0, 0xC9, 0x01, 0xD4, 0x52, 0x08, 0xF1, 0x18, 0xE2, 0xC6, + 0x00, 0x40, 0x72, 0xD5, 0x53, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0x6E, 0xDB, + 0xAD, 0x44, 0x33, 0x08, 0xE0, 0xC8, 0x0B, 0xD4, 0xB0, 0x44, 0x13, 0x08, + 0xDF, 0xC8, 0xE1, 0xC8, 0x06, 0xDC, 0x51, 0x09, 0xB0, 0x44, 0x03, 0x08, + 0x98, 0xBF, 0x00, 0x40, 0xAE, 0xD9, 0x00, 0xA8, 0x05, 0x40, 0x11, 0x18, + 0xE0, 0xC6, 0x02, 0xD5, 0x01, 0xA8, 0xA1, 0x18, 0x04, 0x40, 0x24, 0x00, + 0x80, 0xE4, 0xFE, 0x7F, 0x8F, 0xB8, 0xE3, 0xC8, 0x2C, 0xDC, 0x51, 0x03, + 0x88, 0x41, 0x34, 0x09, 0x83, 0xE4, 0x2F, 0x40, 0x1A, 0xDF, 0x98, 0xE4, + 0xE0, 0xC8, 0x08, 0xD4, 0x01, 0xA8, 0x0A, 0x40, 0x11, 0x18, 0x0A, 0x40, + 0x01, 0x18, 0xF1, 0x19, 0x04, 0x40, 0x24, 0x00, 0x01, 0x40, 0x01, 0xBF, + 0x00, 0x40, 0xA1, 0xD5, 0x01, 0x40, 0x02, 0xBF, 0x00, 0x40, 0xA6, 0xD5, + 0x01, 0x40, 0x03, 0xBF, 0x00, 0x40, 0x8A, 0xD5, 0x01, 0x40, 0x04, 0xBF, + 0x0C, 0xD4, 0x88, 0x41, 0x34, 0x09, 0x83, 0xE4, 0x2E, 0x40, 0xFB, 0xDF, + 0xE1, 0xC8, 0x00, 0x40, 0x87, 0xD5, 0xF1, 0x08, 0xE1, 0xC8, 0x00, 0x40, + 0x83, 0xD5, 0xD0, 0xC0, 0xE4, 0xC0, 0x26, 0xDC, 0xF1, 0x08, 0x0A, 0xC8, + 0x84, 0xB8, 0x89, 0x41, 0x08, 0x00, 0x88, 0x41, 0x24, 0x08, 0xE0, 0xC8, + 0x05, 0xD4, 0x11, 0x08, 0xE0, 0xC8, 0x02, 0xD5, 0x05, 0x40, 0x14, 0x00, + 0x4A, 0x09, 0x89, 0xE4, 0x7A, 0xC8, 0x88, 0xB8, 0x05, 0xD6, 0x89, 0xE4, + 0x0A, 0xC8, 0x88, 0xB8, 0x51, 0xD6, 0x41, 0x00, 0x80, 0xE4, 0x03, 0x40, + 0x03, 0xBF, 0x01, 0xDB, 0x33, 0xA8, 0x41, 0x18, 0x03, 0xB6, 0x5F, 0xB0, + 0x04, 0xB2, 0x40, 0xB4, 0xB0, 0x44, 0x13, 0x19, 0x31, 0x06, 0x8E, 0xDE, + 0x22, 0x00, 0xDD, 0xDE, 0x05, 0x40, 0x21, 0x19, 0x91, 0x08, 0x04, 0x40, + 0x86, 0xE6, 0x84, 0xB8, 0x2A, 0x41, 0x80, 0xB8, 0x06, 0x40, 0x21, 0x18, + 0x89, 0xE4, 0x90, 0xE4, 0xDE, 0x7F, 0x66, 0xDF, 0x28, 0xE4, 0x16, 0xC2, + 0x24, 0xB8, 0x16, 0x40, 0x28, 0xB8, 0x06, 0x40, 0x11, 0x12, 0x80, 0x41, + 0x04, 0x08, 0x0A, 0xC0, 0x80, 0xB8, 0x00, 0x41, 0x18, 0x08, 0xA1, 0x18, + 0x11, 0x09, 0xE3, 0xC9, 0xFF, 0x7F, 0x52, 0xD4, 0x53, 0x08, 0xE0, 0xC8, + 0xFF, 0x7F, 0x4E, 0xDB, 0x03, 0xE4, 0x74, 0x46, 0x02, 0xB8, 0x80, 0xE4, + 0x06, 0x40, 0x21, 0x09, 0x02, 0x40, 0xC6, 0xDF, 0x90, 0x88, 0xE0, 0xC8, + 0x02, 0xD5, 0x00, 0xA8, 0x90, 0x38, 0xA0, 0x88, 0xE0, 0xC8, 0x02, 0xD5, + 0x00, 0xA8, 0xA0, 0x38, 0x06, 0x40, 0x21, 0x10, 0x01, 0xA8, 0x05, 0x40, + 0x21, 0x18, 0x06, 0x40, 0x11, 0x02, 0x11, 0x09, 0xFF, 0x7F, 0x32, 0xDE, + 0x11, 0x08, 0xE0, 0xC8, 0x09, 0xD4, 0xE1, 0xC6, 0x2C, 0xD5, 0x09, 0xE4, + 0x32, 0xC0, 0x69, 0xC0, 0xA7, 0xDE, 0x01, 0xA8, 0xFF, 0x7F, 0x50, 0xDE, + 0x09, 0xE4, 0x62, 0xC0, 0x69, 0xC0, 0xA0, 0xDE, 0x88, 0x41, 0x34, 0x09, + 0x83, 0xE4, 0x2E, 0x40, 0x74, 0xDF, 0xE2, 0xC8, 0xFF, 0x7F, 0x7D, 0xDC, + 0x01, 0xA8, 0x0A, 0x40, 0x01, 0x18, 0x04, 0x40, 0x24, 0x00, 0xFF, 0x7F, + 0x76, 0xDE, 0x88, 0x41, 0x34, 0x09, 0x83, 0xE4, 0x2E, 0x40, 0x65, 0xDF, + 0xE1, 0xC8, 0xFF, 0x7F, 0x6E, 0xD4, 0xF1, 0xDE, 0x88, 0x41, 0x34, 0x09, + 0x83, 0xE4, 0x2E, 0x40, 0x5C, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, 0x65, 0xD5, + 0xE7, 0xDE, 0x09, 0xE4, 0x4A, 0xC0, 0x69, 0xC0, 0xFF, 0x7F, 0x7A, 0xDE, + 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, 0x38, 0xE4, 0x2C, 0x40, + 0x30, 0xB8, 0xA5, 0x44, 0x08, 0x01, 0x58, 0x08, 0xE0, 0xC8, 0x04, 0xD4, + 0xB0, 0x44, 0x02, 0x08, 0xB0, 0x44, 0x22, 0x18, 0x7B, 0x41, 0x33, 0x00, + 0xE0, 0xC0, 0x4F, 0xD4, 0x81, 0x10, 0x11, 0x08, 0x90, 0xE4, 0xE2, 0xC8, + 0x2F, 0xD5, 0xAD, 0x44, 0x32, 0x09, 0xE0, 0xC9, 0x3F, 0xD4, 0x05, 0x40, + 0x03, 0x08, 0xE1, 0xC8, 0x3B, 0xD5, 0x52, 0x00, 0xE0, 0xC0, 0x1F, 0xD9, + 0x89, 0xE4, 0x90, 0xE4, 0xDD, 0x7F, 0xD6, 0xDF, 0x98, 0xE4, 0x16, 0xC9, + 0x92, 0xB8, 0x42, 0x40, 0x98, 0xB8, 0x05, 0x40, 0x03, 0x00, 0xE0, 0xC0, + 0x3F, 0xD5, 0x62, 0x08, 0x08, 0xBA, 0x04, 0x40, 0x03, 0x03, 0x03, 0xBF, + 0x39, 0xD6, 0xB0, 0x44, 0x12, 0x08, 0xDF, 0xC8, 0xE1, 0xC8, 0x34, 0xDC, + 0x19, 0x00, 0x90, 0xE4, 0x93, 0xBA, 0xB0, 0x44, 0x22, 0x08, 0x98, 0xB8, + 0x31, 0xDE, 0x60, 0x49, 0x02, 0x28, 0xC1, 0xC8, 0x98, 0xE4, 0x49, 0xE0, + 0xB0, 0x44, 0x02, 0x19, 0xB0, 0x44, 0x22, 0x19, 0x51, 0x19, 0x89, 0xE4, + 0x48, 0xE0, 0x61, 0x18, 0x89, 0xE4, 0x21, 0xC8, 0x71, 0x18, 0xB0, 0x44, + 0x02, 0x08, 0x98, 0xBF, 0x02, 0xDB, 0xB0, 0x44, 0x02, 0x19, 0x03, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0xB0, 0x44, 0x02, 0x09, 0xC1, 0xC9, 0xB0, 0x44, + 0x02, 0x19, 0x81, 0x10, 0xE9, 0xDE, 0x00, 0xA8, 0x52, 0x09, 0xDD, 0x7F, + 0x97, 0xDF, 0xB0, 0x44, 0x02, 0x09, 0xC1, 0xC9, 0xB0, 0x44, 0x22, 0x08, + 0x09, 0xE4, 0x08, 0xBA, 0x81, 0x10, 0xDC, 0xDE, 0x19, 0x00, 0xB0, 0x44, + 0x22, 0x09, 0x90, 0xB8, 0x81, 0x10, 0x11, 0x08, 0xE1, 0xC8, 0xD4, 0xD4, + 0xCF, 0xDE, 0x0F, 0xB1, 0x38, 0xE4, 0xA5, 0x44, 0x08, 0x01, 0x58, 0x08, + 0xAC, 0x41, 0x03, 0x02, 0x11, 0x09, 0x13, 0xA0, 0xE2, 0xC9, 0x1E, 0xD5, + 0x15, 0xA0, 0xE1, 0xC9, 0x1B, 0xD5, 0x01, 0xA0, 0xE0, 0xC8, 0x18, 0xD9, + 0x00, 0xA9, 0x0A, 0xC8, 0x82, 0xB8, 0x64, 0x40, 0x18, 0x08, 0xE0, 0xC8, + 0x14, 0xD5, 0x01, 0xA9, 0x02, 0x08, 0xE1, 0xC8, 0x17, 0xD5, 0xE0, 0xC9, + 0x18, 0xD4, 0x05, 0x40, 0x11, 0x08, 0x08, 0xE4, 0xE0, 0xC8, 0x06, 0xD5, + 0xB0, 0x44, 0x13, 0x08, 0x08, 0xA0, 0xE1, 0xC8, 0x01, 0xD5, 0x06, 0xA0, + 0x80, 0xE4, 0x0F, 0xB0, 0xA0, 0xE0, 0x0A, 0x40, 0x11, 0x08, 0xE0, 0xC8, + 0xE8, 0xD4, 0x02, 0x08, 0xE1, 0xC8, 0xE9, 0xD4, 0x31, 0x08, 0xE2, 0xC8, + 0xE6, 0xD4, 0x05, 0x40, 0x11, 0x08, 0x01, 0xA0, 0xE0, 0xC8, 0xEE, 0xD5, + 0xB0, 0x44, 0x13, 0x08, 0x09, 0xA0, 0xE1, 0xC8, 0xE9, 0xD5, 0x07, 0xA0, + 0x80, 0xE4, 0x0F, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x98, 0xE4, 0xA5, 0x44, + 0x08, 0x08, 0x19, 0xE4, 0x0F, 0x40, 0x18, 0xB8, 0x19, 0x00, 0x00, 0x40, + 0x0C, 0xE6, 0x09, 0xB8, 0x16, 0x40, 0x04, 0xB8, 0xE8, 0x08, 0x01, 0x40, + 0x83, 0xBF, 0x15, 0xD5, 0x08, 0x40, 0x09, 0x08, 0x0A, 0xC8, 0x81, 0xB8, + 0x08, 0x08, 0x00, 0x18, 0x0B, 0x40, 0x39, 0x08, 0x0A, 0xC8, 0x81, 0xB8, + 0x08, 0x08, 0x10, 0x18, 0x0D, 0x40, 0x11, 0x28, 0x06, 0xC8, 0x0D, 0x40, + 0x01, 0x21, 0x81, 0xBD, 0x20, 0x18, 0x03, 0xB0, 0xA0, 0xE0, 0x00, 0xA8, + 0x00, 0x18, 0x10, 0x18, 0x20, 0x18, 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, + 0x0F, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, 0xA5, 0x44, 0x08, 0x09, 0x28, 0xE4, + 0x2C, 0x40, 0x20, 0xB8, 0x00, 0xA3, 0x06, 0x40, 0x39, 0x13, 0xB1, 0x44, + 0x28, 0x08, 0xE0, 0xC8, 0x04, 0xD4, 0x7B, 0x41, 0x32, 0x08, 0xE0, 0xC8, + 0x0E, 0xD4, 0x04, 0x40, 0x32, 0x01, 0xE2, 0xC1, 0x24, 0xD5, 0x13, 0xE4, + 0x06, 0x40, 0x39, 0x13, 0x52, 0x40, 0x08, 0xB8, 0x80, 0x41, 0x02, 0x10, + 0x05, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x01, 0xA1, 0x06, 0x40, 0x39, 0x11, + 0x80, 0xE4, 0x78, 0x46, 0x88, 0xB8, 0x80, 0x41, 0x02, 0x18, 0x50, 0x08, + 0xE0, 0xC8, 0xF2, 0xD4, 0x80, 0xE4, 0x78, 0x46, 0x88, 0xB8, 0x83, 0x98, + 0x84, 0x91, 0x80, 0xE4, 0x04, 0x40, 0x02, 0x09, 0x15, 0xDF, 0x80, 0xE4, + 0x00, 0x40, 0xEC, 0xDF, 0x05, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x59, 0x08, + 0x88, 0xB8, 0xD9, 0xD6, 0x01, 0xA8, 0x06, 0x40, 0x39, 0x18, 0x80, 0xE4, + 0x78, 0x46, 0x88, 0xB8, 0x80, 0x41, 0x02, 0x18, 0x50, 0x08, 0xE1, 0xC8, + 0xD5, 0xD4, 0xE2, 0xDE, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xE5, 0xB6, + 0xA8, 0xE4, 0xAA, 0x99, 0x2B, 0x90, 0x2C, 0x99, 0xE1, 0xC9, 0x00, 0x40, + 0x8D, 0xD5, 0xE2, 0xC9, 0x04, 0xD5, 0x1B, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, + 0x40, 0xB4, 0x00, 0xA8, 0x0D, 0x40, 0x08, 0xEA, 0x00, 0xAF, 0x2A, 0x98, + 0xF8, 0xBF, 0xF5, 0xD6, 0xD0, 0xE4, 0xC4, 0xCD, 0xCA, 0xE4, 0x42, 0x40, + 0xC8, 0xB8, 0x00, 0xA8, 0x85, 0x98, 0x84, 0x98, 0xE8, 0xE4, 0x6C, 0xE4, + 0x01, 0x40, 0x68, 0xB8, 0x4D, 0xE4, 0x01, 0x40, 0x48, 0xB8, 0xB6, 0xE4, + 0xA4, 0xE4, 0x9E, 0xE4, 0x0A, 0xC9, 0xFF, 0xA8, 0x0A, 0x18, 0xC4, 0xCA, + 0x0B, 0x03, 0xC4, 0xCB, 0x00, 0xA1, 0x0D, 0x40, 0x00, 0xE8, 0xE0, 0xC0, + 0x1E, 0xDB, 0x29, 0xE4, 0x10, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0x29, 0xB8, + 0x18, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0x05, 0xDE, 0xC1, 0xC1, 0x80, 0xE4, + 0x08, 0xE0, 0x81, 0xBF, 0x10, 0xDB, 0x09, 0x08, 0xC4, 0xC9, 0x83, 0xBF, + 0xF7, 0xD4, 0x06, 0x08, 0x04, 0x18, 0x02, 0x08, 0xC1, 0xC8, 0x02, 0x18, + 0x0D, 0x40, 0x00, 0xE8, 0xC1, 0xC1, 0x80, 0xE4, 0x08, 0xE0, 0x81, 0xBF, + 0xF0, 0xD8, 0xC1, 0xCE, 0xC4, 0xC4, 0xC4, 0xC6, 0xE1, 0xCE, 0xD1, 0xDB, + 0x0C, 0x08, 0x0D, 0x18, 0x0C, 0x08, 0xE0, 0xC8, 0x2B, 0xD4, 0x04, 0x98, + 0xE0, 0xC8, 0x32, 0xD4, 0x05, 0x98, 0xE0, 0xC8, 0x2D, 0xD4, 0x02, 0xA8, + 0x0D, 0x18, 0x1C, 0x08, 0x1D, 0x18, 0x5C, 0x08, 0x5D, 0x18, 0x2C, 0x08, + 0x2D, 0x18, 0x3C, 0x08, 0x4C, 0x09, 0x3D, 0x18, 0x4D, 0x19, 0x0D, 0x40, + 0x08, 0xE8, 0x98, 0xE4, 0xC1, 0xC9, 0x0D, 0x40, 0x09, 0xEA, 0x0A, 0xC8, + 0x18, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0x89, 0xB8, 0x1C, 0x09, 0x08, 0x19, + 0xC1, 0xCF, 0x02, 0x40, 0xC0, 0xB8, 0x02, 0x40, 0xD0, 0xB8, 0x2A, 0x98, + 0xF8, 0xBF, 0x99, 0xD7, 0x1B, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, + 0xE1, 0xC8, 0xDB, 0xD4, 0x04, 0x98, 0xE0, 0xC8, 0xD8, 0xD4, 0x02, 0xA9, + 0x0D, 0x19, 0xD5, 0xDE, 0x7D, 0x08, 0x6D, 0x18, 0x05, 0x98, 0xE0, 0xC8, + 0xD0, 0xD4, 0x6D, 0x08, 0x7D, 0x18, 0xCD, 0xDE, 0x78, 0x46, 0x8C, 0xB8, + 0x30, 0x40, 0x0A, 0x00, 0x16, 0xC0, 0x9A, 0xE4, 0x42, 0x40, 0x98, 0xB8, + 0x83, 0x90, 0x33, 0x40, 0xFB, 0xDF, 0x00, 0xAF, 0x30, 0x40, 0x0A, 0x09, + 0xF9, 0xBF, 0xFF, 0x7F, 0x64, 0xD6, 0x3F, 0xE4, 0x16, 0xC3, 0x3A, 0xB8, + 0x78, 0x46, 0x3C, 0xB8, 0x00, 0xA1, 0x4F, 0xE4, 0xC1, 0xC4, 0x19, 0xBF, + 0x25, 0xD6, 0x2A, 0xE4, 0x05, 0xDE, 0xC1, 0xC1, 0x02, 0x40, 0x20, 0xB8, + 0x19, 0xBF, 0x1E, 0xD6, 0x02, 0xE4, 0x42, 0x40, 0x08, 0xB8, 0x42, 0x40, + 0x32, 0x08, 0x84, 0xBF, 0xF4, 0xD4, 0x20, 0x08, 0x23, 0x18, 0x30, 0x08, + 0x40, 0x09, 0x33, 0x18, 0x43, 0x19, 0x10, 0x08, 0x13, 0x18, 0x00, 0x08, + 0x03, 0x18, 0x60, 0x08, 0x63, 0x18, 0x60, 0x08, 0x73, 0x18, 0x50, 0x08, + 0x53, 0x18, 0x30, 0x40, 0x0A, 0x09, 0xC1, 0xC1, 0x02, 0x40, 0x20, 0xB8, + 0x19, 0xBF, 0xE2, 0xD7, 0xF4, 0xE4, 0xCC, 0xDE, 0x20, 0xB5, 0x04, 0xB3, + 0x5F, 0xB1, 0xFB, 0xB6, 0x48, 0xE4, 0x30, 0x40, 0x08, 0x01, 0xA8, 0xE4, + 0x29, 0x46, 0xAC, 0xB8, 0x38, 0xE4, 0x78, 0x46, 0x38, 0xB8, 0x83, 0xE4, + 0x0C, 0x40, 0x07, 0xDF, 0x04, 0xE4, 0x78, 0x46, 0x0C, 0xB8, 0x83, 0x90, + 0x83, 0xE4, 0x91, 0xE4, 0xEF, 0x7F, 0xD8, 0xDF, 0x84, 0xE4, 0x78, 0x47, + 0x8C, 0xB8, 0x83, 0x98, 0x81, 0xE4, 0x90, 0xE4, 0xE9, 0x7F, 0xC9, 0xDF, + 0x83, 0xE4, 0x09, 0x40, 0xB4, 0xDF, 0x08, 0xE4, 0x01, 0xB8, 0x83, 0xE4, + 0x90, 0xE4, 0x0B, 0x40, 0x09, 0xDF, 0x00, 0xA2, 0x80, 0xE4, 0xC1, 0xC8, + 0x13, 0xD5, 0x62, 0xE4, 0x1A, 0xE4, 0x04, 0xE4, 0x20, 0x47, 0x0C, 0xB8, + 0x48, 0xE4, 0x00, 0x16, 0xC4, 0xC0, 0x83, 0x91, 0x84, 0x92, 0x83, 0xE4, + 0x96, 0xE4, 0x0D, 0x40, 0x79, 0xDF, 0xC1, 0xC2, 0x04, 0x40, 0x16, 0xB8, + 0x42, 0xBF, 0xF3, 0xDC, 0x05, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, + 0x03, 0xB1, 0xA5, 0x44, 0x08, 0x01, 0x49, 0x09, 0x89, 0xE4, 0x04, 0x50, + 0x00, 0x40, 0x80, 0xBC, 0x04, 0x40, 0x00, 0x40, 0x80, 0xBF, 0x02, 0xD5, + 0x03, 0xB0, 0xA0, 0xE0, 0x89, 0xE4, 0x22, 0xC8, 0x75, 0xC8, 0xE2, 0xC8, + 0x0B, 0xDC, 0x02, 0xA9, 0xE0, 0xC8, 0x03, 0xD5, 0x00, 0xA9, 0xE1, 0xC8, + 0x0F, 0xD5, 0x31, 0x19, 0x00, 0xA8, 0x11, 0x18, 0x03, 0xB0, 0xA0, 0xE0, + 0x02, 0xA9, 0x31, 0x19, 0x00, 0x40, 0x83, 0xBE, 0x68, 0xE0, 0x7D, 0xC8, + 0x98, 0xBA, 0x11, 0x19, 0x03, 0xB0, 0xA0, 0xE0, 0x98, 0xE4, 0xEF, 0xDE, + 0x5F, 0xB1, 0x38, 0xE4, 0x49, 0xE4, 0x09, 0x28, 0x03, 0x38, 0x19, 0x26, + 0x13, 0x36, 0x99, 0x29, 0x93, 0x39, 0xA4, 0x29, 0xA3, 0x39, 0x00, 0xA1, + 0x28, 0xE4, 0xE0, 0xC8, 0x0B, 0xDB, 0x03, 0xE4, 0xC6, 0xC0, 0x94, 0xE4, + 0xC6, 0xC9, 0x89, 0x28, 0xC2, 0xC9, 0x80, 0x38, 0xC2, 0xC0, 0xC1, 0xC1, + 0x21, 0xBF, 0xF9, 0xD8, 0x00, 0xA1, 0x26, 0xE4, 0x02, 0xE0, 0xE0, 0xC2, + 0x0D, 0xDB, 0x03, 0xE4, 0x02, 0x40, 0x06, 0xB8, 0x94, 0xE4, 0x02, 0x40, + 0x96, 0xB8, 0x89, 0x28, 0xC2, 0xC9, 0x80, 0x38, 0xC2, 0xC0, 0xC1, 0xC1, + 0x21, 0xBF, 0xF9, 0xD8, 0x5F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x1F, 0xB1, + 0xF9, 0xB6, 0x08, 0xE4, 0x39, 0xE4, 0x10, 0x40, 0xD1, 0xE1, 0x02, 0xA8, + 0x01, 0x18, 0x01, 0xA4, 0x85, 0x94, 0x00, 0xA2, 0x86, 0x92, 0xE2, 0xC0, + 0x15, 0xDC, 0xE0, 0xC3, 0x20, 0xD5, 0x83, 0x93, 0x23, 0xA8, 0x92, 0xE4, + 0x02, 0x40, 0x9C, 0xDF, 0x0A, 0xC0, 0x10, 0xB8, 0x01, 0x08, 0x03, 0xA9, + 0x8C, 0x7F, 0x2F, 0xDF, 0x84, 0xE4, 0x8C, 0x7F, 0x67, 0xDF, 0x8C, 0x7F, + 0x78, 0xDF, 0x07, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0x2F, 0x63, + 0x00, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x27, 0x63, 0x0D, 0xA8, 0x61, 0x40, + 0x09, 0xA9, 0x32, 0x40, 0xC2, 0xDF, 0xE0, 0xC3, 0xE0, 0xD4, 0x00, 0x40, + 0x30, 0x63, 0x0E, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x27, 0x63, 0x0D, 0xA8, + 0x61, 0x40, 0x0A, 0xA9, 0x32, 0x40, 0xB5, 0xDF, 0xD4, 0xDE, 0x20, 0xB5, + 0x0F, 0xB1, 0xFC, 0xB6, 0x28, 0xE4, 0x2C, 0x40, 0x20, 0xB8, 0x38, 0xE4, + 0xB3, 0x41, 0x34, 0xB8, 0x01, 0xA0, 0x83, 0x90, 0x20, 0xA8, 0x00, 0xA9, + 0x02, 0x40, 0x66, 0xDF, 0x00, 0xA8, 0x04, 0xA9, 0x8B, 0x7F, 0xFB, 0xDF, + 0x03, 0xA8, 0x02, 0xA9, 0x8B, 0x7F, 0xF7, 0xDF, 0x00, 0xA8, 0x06, 0xA9, + 0x8B, 0x7F, 0xF3, 0xDF, 0x04, 0x40, 0x12, 0x08, 0xDF, 0xC8, 0x03, 0xA9, + 0x8B, 0x7F, 0xED, 0xDF, 0x00, 0xA8, 0x04, 0x40, 0x12, 0x09, 0xE1, 0xC9, + 0x00, 0x40, 0x64, 0xD5, 0x90, 0xE4, 0x8B, 0x7F, 0xE4, 0xDF, 0xFF, 0x4F, + 0x0F, 0xA8, 0x10, 0xA9, 0x8B, 0x7F, 0xDF, 0xDF, 0x82, 0xE4, 0x04, 0x40, + 0x12, 0x09, 0x02, 0x40, 0x57, 0xDF, 0x80, 0xE4, 0x90, 0xE4, 0x8B, 0x7F, + 0xD6, 0xDF, 0x00, 0xA1, 0x02, 0xE4, 0x76, 0x41, 0x30, 0x08, 0xDF, 0xC8, + 0x8B, 0x7F, 0xD4, 0xDF, 0x74, 0x41, 0x30, 0x08, 0x8B, 0x7F, 0xD0, 0xDF, + 0x00, 0xA8, 0x8B, 0x7F, 0xCD, 0xDF, 0xC1, 0xC1, 0xC4, 0xC0, 0x04, 0x40, + 0x12, 0x08, 0xDF, 0xC8, 0x18, 0xBF, 0xED, 0xDD, 0x00, 0xA8, 0x06, 0xA9, + 0x8B, 0x7F, 0xBD, 0xDF, 0x00, 0xA8, 0x8B, 0x7F, 0xBF, 0xDF, 0x03, 0x00, + 0x7E, 0x41, 0x12, 0x08, 0xE0, 0xC8, 0x02, 0xD5, 0x00, 0x40, 0x01, 0xBD, + 0x80, 0xE4, 0x01, 0xA9, 0x8B, 0x7F, 0xAF, 0xDF, 0xE0, 0xC0, 0x20, 0xD5, + 0x00, 0xA0, 0x33, 0x08, 0xE0, 0xC8, 0x01, 0xD5, 0x01, 0xA0, 0x13, 0x08, + 0x20, 0xA9, 0x8B, 0x7F, 0xA4, 0xDF, 0x23, 0x08, 0x20, 0xA9, 0x8B, 0x7F, + 0xA0, 0xDF, 0x40, 0xE0, 0x80, 0xE4, 0x01, 0xA9, 0x8B, 0x7F, 0x9B, 0xDF, + 0xE0, 0xC0, 0x18, 0xD4, 0x7E, 0x41, 0x12, 0x08, 0x8B, 0x7F, 0x9A, 0xDF, + 0x00, 0xA1, 0x81, 0xE4, 0x8B, 0x7F, 0x96, 0xDF, 0x7E, 0x41, 0x12, 0x08, + 0xE0, 0xC8, 0x1C, 0xD4, 0x00, 0xA8, 0x01, 0xA9, 0x8B, 0x7F, 0x89, 0xDF, + 0x04, 0x40, 0x1A, 0xDF, 0x01, 0xA8, 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x89, 0xE4, 0x9A, 0xDE, 0x33, 0x08, 0xDF, 0xC8, 0x8B, 0x7F, 0x82, 0xDF, + 0x7E, 0x41, 0x12, 0x08, 0x8B, 0x7F, 0x7E, 0xDF, 0x00, 0xA1, 0x81, 0xE4, + 0x8B, 0x7F, 0x7A, 0xDF, 0x7E, 0x41, 0x12, 0x08, 0xE0, 0xC8, 0xE4, 0xD5, + 0x82, 0xE4, 0x91, 0xE4, 0x02, 0x40, 0xD2, 0xDF, 0x00, 0xA8, 0x01, 0xA9, + 0x8B, 0x7F, 0x69, 0xDF, 0x03, 0x40, 0xFA, 0xDF, 0x01, 0xA8, 0x04, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, 0xFC, 0xB6, 0x28, 0xE4, + 0x2C, 0x40, 0x20, 0xB8, 0x01, 0xA0, 0x83, 0x90, 0x21, 0xA8, 0x00, 0xA9, + 0x01, 0x40, 0xBE, 0xDF, 0x00, 0xA8, 0x04, 0xA9, 0x8B, 0x7F, 0x53, 0xDF, + 0x04, 0x40, 0x12, 0x08, 0xDF, 0xC8, 0x03, 0xA9, 0x8B, 0x7F, 0x4D, 0xDF, + 0x00, 0xA8, 0x04, 0x40, 0x12, 0x09, 0xE1, 0xC9, 0x00, 0x40, 0xEA, 0xD5, + 0x90, 0xE4, 0x8B, 0x7F, 0x44, 0xDF, 0x82, 0xE4, 0x04, 0x40, 0x12, 0x09, + 0x01, 0x40, 0xBC, 0xDF, 0x00, 0xA8, 0x8B, 0x7F, 0x41, 0xDF, 0x80, 0xE4, + 0x8B, 0x7F, 0x3E, 0xDF, 0x22, 0x08, 0x8B, 0x7F, 0x3B, 0xDF, 0x32, 0x08, + 0x8B, 0x7F, 0x38, 0xDF, 0x05, 0x40, 0x22, 0x08, 0xE0, 0xC8, 0x05, 0xD4, + 0x05, 0x40, 0x32, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0xA3, 0xD5, 0x01, 0xA0, + 0x80, 0xE4, 0x01, 0xA9, 0x8B, 0x7F, 0x25, 0xDF, 0xE0, 0xC0, 0x00, 0x40, + 0xAF, 0xD4, 0x92, 0x08, 0xD8, 0xC8, 0x8B, 0x7F, 0x23, 0xDF, 0x92, 0x08, + 0xD8, 0xC8, 0x8B, 0x7F, 0x1F, 0xDF, 0x04, 0xA8, 0x8B, 0x7F, 0x1C, 0xDF, + 0x01, 0xA8, 0x98, 0xE4, 0x8B, 0x7F, 0x13, 0xDF, 0x00, 0xA1, 0x02, 0xE4, + 0x76, 0x41, 0x30, 0x08, 0xDF, 0xC8, 0x8B, 0x7F, 0x11, 0xDF, 0x74, 0x41, + 0x30, 0x08, 0x8B, 0x7F, 0x0D, 0xDF, 0x00, 0xA8, 0x8B, 0x7F, 0x0A, 0xDF, + 0xC1, 0xC1, 0xC4, 0xC0, 0x04, 0x40, 0x12, 0x08, 0xDF, 0xC8, 0x81, 0xBF, + 0xED, 0xD6, 0x00, 0xA8, 0x8B, 0x7F, 0x00, 0xDF, 0x03, 0xA8, 0x8A, 0x7F, + 0xFD, 0xDF, 0x00, 0xA8, 0x8A, 0x7F, 0xFA, 0xDF, 0x03, 0xA8, 0x8A, 0x7F, + 0xF7, 0xDF, 0x00, 0xA8, 0x8A, 0x7F, 0xF4, 0xDF, 0x00, 0xA8, 0x8A, 0x7F, + 0xF1, 0xDF, 0x08, 0x40, 0x32, 0x08, 0x01, 0xA9, 0x8A, 0x7F, 0xE7, 0xDF, + 0x08, 0x40, 0x32, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0x68, 0xD4, 0x00, 0xA8, + 0x01, 0xA9, 0x8A, 0x7F, 0xDE, 0xDF, 0x0C, 0x40, 0x22, 0x08, 0x01, 0xA9, + 0x8A, 0x7F, 0xD9, 0xDF, 0x00, 0xA8, 0x01, 0xA9, 0x8A, 0x7F, 0xD5, 0xDF, + 0x7A, 0x41, 0x32, 0x08, 0x8A, 0x7F, 0xD6, 0xDF, 0x00, 0xA1, 0x7A, 0x41, + 0x32, 0x08, 0xE0, 0xC8, 0x2A, 0xD4, 0xF2, 0x08, 0x01, 0xA9, 0x8A, 0x7F, + 0xC8, 0xDF, 0xF2, 0x08, 0xE0, 0xC8, 0x3A, 0xD4, 0x09, 0x40, 0x12, 0x08, + 0x01, 0xA9, 0x8A, 0x7F, 0xC0, 0xDF, 0x01, 0xA8, 0x98, 0xE4, 0x8A, 0x7F, + 0xBC, 0xDF, 0x80, 0x41, 0x12, 0x08, 0x01, 0xA9, 0x8A, 0x7F, 0xB7, 0xDF, + 0x80, 0x41, 0x12, 0x08, 0xE0, 0xC8, 0x07, 0xD5, 0x7E, 0x41, 0x02, 0x08, + 0xE0, 0xC8, 0x55, 0xD4, 0x82, 0xE4, 0x02, 0x40, 0x4B, 0xDF, 0x00, 0xA8, + 0x01, 0xA9, 0x8A, 0x7F, 0xA8, 0xDF, 0x03, 0x40, 0x39, 0xDF, 0x01, 0xA8, + 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x83, 0x91, 0x80, 0x41, 0x02, 0x08, + 0x00, 0xA9, 0x06, 0x40, 0xE2, 0xDF, 0xC1, 0xC1, 0x7A, 0x41, 0x32, 0x08, + 0x81, 0xBF, 0xCB, 0xDD, 0x83, 0x91, 0x80, 0x41, 0x02, 0x08, 0x00, 0xA9, + 0x06, 0x40, 0xD7, 0xDF, 0xC1, 0xC1, 0x7A, 0x41, 0x32, 0x08, 0x81, 0xBF, + 0xEA, 0xDC, 0xBF, 0xDE, 0x00, 0xA8, 0x8A, 0x7F, 0x8D, 0xDF, 0xC2, 0xDE, + 0x06, 0x40, 0x12, 0x08, 0xE0, 0xC8, 0xFF, 0x7F, 0x58, 0xD4, 0x06, 0x40, + 0x02, 0x08, 0x08, 0xE4, 0xE0, 0xC8, 0xFF, 0x7F, 0x53, 0xD5, 0xFF, 0x7F, + 0x50, 0xDE, 0x01, 0xA8, 0x98, 0xE4, 0x8A, 0x7F, 0x76, 0xDF, 0x01, 0x40, + 0x7D, 0xDF, 0x91, 0xDE, 0x06, 0x40, 0x02, 0x08, 0x05, 0xC8, 0x8A, 0x7F, + 0x73, 0xDF, 0x06, 0x40, 0x12, 0x08, 0x05, 0xC8, 0x8A, 0x7F, 0x6E, 0xDF, + 0x05, 0x40, 0x22, 0x08, 0x05, 0xC8, 0x8A, 0x7F, 0x69, 0xDF, 0x05, 0x40, + 0x32, 0x08, 0x05, 0xC8, 0x8A, 0x7F, 0x64, 0xDF, 0xFF, 0x7F, 0x3B, 0xDE, + 0x89, 0xE4, 0xFF, 0x7F, 0x13, 0xDE, 0x82, 0xE4, 0x01, 0xA9, 0x01, 0x40, + 0xBB, 0xDF, 0x00, 0xA8, 0x01, 0xA9, 0x8A, 0x7F, 0x52, 0xDF, 0x02, 0x40, + 0xE3, 0xDF, 0x01, 0xA8, 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x03, 0xB1, 0xFC, 0xB6, 0x08, 0xE4, 0x2C, 0x40, 0x00, 0xB8, 0x01, 0xA1, + 0x83, 0x91, 0x22, 0xA8, 0x00, 0xA9, 0x00, 0x40, 0xA7, 0xDF, 0x00, 0xA8, + 0x8A, 0x7F, 0x42, 0xDF, 0x00, 0xA8, 0x8A, 0x7F, 0x3F, 0xDF, 0x81, 0xE4, + 0x91, 0xE4, 0x8A, 0x7F, 0x36, 0xDF, 0x00, 0xA8, 0x91, 0xE4, 0x8A, 0x7F, + 0x32, 0xDF, 0x00, 0xA8, 0x03, 0xA9, 0x8A, 0x7F, 0x2E, 0xDF, 0x00, 0xA8, + 0x91, 0xE4, 0x8A, 0x7F, 0x2A, 0xDF, 0x00, 0xA8, 0x91, 0xE4, 0x8A, 0x7F, + 0x26, 0xDF, 0x00, 0xA8, 0x8A, 0x7F, 0x28, 0xDF, 0x00, 0xA8, 0x8A, 0x7F, + 0x25, 0xDF, 0x00, 0xA8, 0x8A, 0x7F, 0x3E, 0xDF, 0xC0, 0x08, 0x91, 0xE4, + 0x8A, 0x7F, 0x19, 0xDF, 0x0C, 0x40, 0x10, 0x08, 0x91, 0xE4, 0x8A, 0x7F, + 0x14, 0xDF, 0x7C, 0x41, 0x00, 0x08, 0x91, 0xE4, 0x8A, 0x7F, 0x0F, 0xDF, + 0x7C, 0x41, 0x00, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0x6D, 0xD4, 0xD0, 0x08, + 0x8A, 0x7F, 0x28, 0xDF, 0xE0, 0x08, 0x8A, 0x7F, 0x25, 0xDF, 0x00, 0xA8, + 0x91, 0xE4, 0x8A, 0x7F, 0x00, 0xDF, 0x00, 0xA8, 0x91, 0xE4, 0x89, 0x7F, + 0xFC, 0xDF, 0x00, 0xA8, 0x91, 0xE4, 0x89, 0x7F, 0xF8, 0xDF, 0xB0, 0x08, + 0x91, 0xE4, 0x89, 0x7F, 0xF4, 0xDF, 0x00, 0xA8, 0x91, 0xE4, 0x89, 0x7F, + 0xF0, 0xDF, 0x09, 0x40, 0x20, 0x08, 0x91, 0xE4, 0x89, 0x7F, 0xEB, 0xDF, + 0x0B, 0x40, 0x20, 0x08, 0x91, 0xE4, 0x89, 0x7F, 0xE6, 0xDF, 0x00, 0xA1, + 0x0B, 0x40, 0x10, 0x08, 0xE0, 0xC8, 0x04, 0xD4, 0x0B, 0x40, 0x30, 0x08, + 0xE0, 0xC8, 0x20, 0xD5, 0x01, 0xA1, 0x81, 0xE4, 0x01, 0xA9, 0x89, 0x7F, + 0xD8, 0xDF, 0xE0, 0xC1, 0x23, 0xD4, 0x00, 0xA8, 0x01, 0xA9, 0x89, 0x7F, + 0xD2, 0xDF, 0x01, 0xA8, 0x98, 0xE4, 0x89, 0x7F, 0xCE, 0xDF, 0x00, 0xA8, + 0x89, 0x7F, 0xD0, 0xDF, 0x00, 0xA8, 0x01, 0xA9, 0x89, 0x7F, 0xC7, 0xDF, + 0x00, 0xA8, 0x01, 0xA9, 0x89, 0x7F, 0xC3, 0xDF, 0x02, 0x40, 0x54, 0xDF, + 0x01, 0xA8, 0x04, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x0C, 0x40, 0x00, 0x08, + 0xE0, 0xC8, 0xDC, 0xD4, 0x81, 0xE4, 0x01, 0xA9, 0x89, 0x7F, 0xB5, 0xDF, + 0xE0, 0xC1, 0xDD, 0xD5, 0x00, 0xA8, 0x01, 0xA9, 0x89, 0x7F, 0xAF, 0xDF, + 0x0B, 0x40, 0x10, 0x08, 0x01, 0xA9, 0x89, 0x7F, 0xAA, 0xDF, 0x0B, 0x40, + 0x10, 0x08, 0xE0, 0xC8, 0xD0, 0xD4, 0x0B, 0x40, 0x30, 0x08, 0x89, 0x7F, + 0xC3, 0xDF, 0x0C, 0x40, 0x00, 0x08, 0x89, 0x7F, 0xBF, 0xDF, 0xC7, 0xDE, + 0x81, 0xE4, 0x89, 0x7F, 0x9F, 0xDF, 0x8F, 0xDE, 0x20, 0xB5, 0x07, 0xB1, + 0xFD, 0xB6, 0x08, 0xE4, 0x19, 0xE4, 0x0A, 0x92, 0x01, 0xA8, 0x04, 0xA9, + 0x89, 0x7F, 0x8A, 0xDF, 0x26, 0xC0, 0x0E, 0xC1, 0x01, 0xBD, 0x02, 0xBD, + 0x80, 0xE4, 0x02, 0xA9, 0x89, 0x7F, 0x82, 0xDF, 0x01, 0xA8, 0x03, 0xB6, + 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, + 0x29, 0xE4, 0x33, 0xDF, 0x70, 0x08, 0xE0, 0xC8, 0x05, 0xD5, 0x00, 0x40, + 0x83, 0xE6, 0x09, 0x40, 0x86, 0xBF, 0x02, 0xDD, 0x09, 0x40, 0x06, 0xA8, + 0x08, 0xA9, 0x89, 0x7F, 0x70, 0xDF, 0x00, 0xA0, 0x12, 0xE4, 0xDF, 0xC1, + 0xE0, 0xC1, 0x0B, 0xDB, 0x00, 0xA8, 0x01, 0xA9, 0x89, 0x7F, 0x67, 0xDF, + 0x00, 0xA8, 0x01, 0xA9, 0x89, 0x7F, 0x63, 0xDF, 0xC1, 0xC0, 0x10, 0xBF, + 0xF5, 0xD8, 0xE1, 0xC2, 0x0A, 0xDB, 0x01, 0xE4, 0xE7, 0xC0, 0x07, 0xD8, + 0x00, 0xA8, 0x02, 0xA9, 0x89, 0x7F, 0x57, 0xDF, 0xC1, 0xC0, 0xE7, 0xC0, + 0xF9, 0xDB, 0x00, 0xA0, 0xE0, 0xC1, 0x03, 0xDB, 0xC1, 0xC0, 0x10, 0xBF, + 0xFD, 0xD8, 0x01, 0xA8, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x07, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, 0x00, 0xA8, 0x02, 0xA9, 0x89, 0x7F, + 0x42, 0xDF, 0x00, 0xA1, 0x82, 0x11, 0x81, 0xE4, 0x01, 0xA9, 0x89, 0x7F, + 0x3C, 0xDF, 0x92, 0x09, 0x00, 0x40, 0x98, 0xBE, 0x00, 0xA8, 0x89, 0xBA, + 0x89, 0xBD, 0x7D, 0xC8, 0xC1, 0xC8, 0x05, 0xA9, 0x89, 0x7F, 0x31, 0xDF, + 0x81, 0xE4, 0x01, 0xA9, 0x89, 0x7F, 0x2D, 0xDF, 0x92, 0x08, 0xE8, 0xC8, + 0x30, 0xD5, 0x81, 0xE4, 0x01, 0xA9, 0x89, 0x7F, 0x26, 0xDF, 0x01, 0xA8, + 0x98, 0xE4, 0x89, 0x7F, 0x22, 0xDF, 0x1C, 0xA0, 0x00, 0xA8, 0x01, 0xA9, + 0x89, 0x7F, 0x1D, 0xDF, 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xDA, 0x00, 0xA8, + 0x01, 0xA9, 0x89, 0x7F, 0x16, 0xDF, 0x00, 0xA8, 0x01, 0xA9, 0x89, 0x7F, + 0x12, 0xDF, 0x00, 0xA8, 0x01, 0xA9, 0x89, 0x7F, 0x0E, 0xDF, 0x00, 0xA8, + 0x01, 0xA9, 0x89, 0x7F, 0x0A, 0xDF, 0x00, 0xA8, 0x10, 0xA9, 0x89, 0x7F, + 0x06, 0xDF, 0x00, 0xA8, 0x10, 0xA9, 0x89, 0x7F, 0x02, 0xDF, 0x00, 0xA8, + 0x0C, 0xA9, 0x88, 0x7F, 0xFE, 0xDF, 0x01, 0xA8, 0x03, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0x01, 0xA8, 0x98, 0xE4, 0xCF, 0xDE, 0x20, 0xB5, 0x5F, 0xB1, + 0xFD, 0xB6, 0x00, 0xA3, 0x04, 0xA6, 0x00, 0xA4, 0xE3, 0xC3, 0x45, 0xD5, + 0xE5, 0xC4, 0x45, 0xD8, 0x01, 0xA8, 0x98, 0xE4, 0x88, 0x7F, 0xE9, 0xDF, + 0x08, 0xA1, 0xE1, 0xC3, 0x46, 0xD8, 0x40, 0xA8, 0x01, 0xA9, 0x9A, 0xC9, + 0xD7, 0x7F, 0xE2, 0xDF, 0x28, 0xE4, 0x00, 0xA0, 0x1F, 0xDE, 0x80, 0xE4, + 0x00, 0x40, 0x3F, 0x62, 0x84, 0xB8, 0x08, 0x89, 0x02, 0x40, 0x08, 0x88, + 0x0A, 0xC8, 0x89, 0xB8, 0x0A, 0xC8, 0x00, 0x40, 0x2B, 0x62, 0x84, 0xB8, + 0x08, 0x08, 0x98, 0xE4, 0x91, 0xBA, 0x18, 0xE4, 0x07, 0x40, 0x9F, 0xBF, + 0x02, 0xDB, 0xF0, 0x7F, 0x90, 0xB8, 0xF8, 0x7F, 0x90, 0xBF, 0x02, 0xDA, + 0x10, 0x40, 0x90, 0xB8, 0x89, 0xE4, 0x88, 0x7F, 0xE1, 0xDF, 0xC1, 0xC0, + 0x02, 0xBF, 0x10, 0xDA, 0xE0, 0xC3, 0xDD, 0xD5, 0x80, 0xE4, 0x00, 0x40, + 0x41, 0x62, 0x84, 0xB8, 0x08, 0x89, 0x08, 0x40, 0x08, 0x88, 0x0E, 0xC8, + 0x89, 0xB8, 0x0A, 0xC8, 0x00, 0x40, 0x2F, 0x62, 0x84, 0xB8, 0xDC, 0xDE, + 0xC1, 0xC4, 0xE3, 0xC3, 0xBB, 0xD4, 0xE1, 0xC4, 0xBB, 0xDB, 0xC1, 0xC3, + 0xC2, 0xC6, 0xE3, 0xC3, 0xB2, 0xDB, 0x01, 0xA8, 0x03, 0xB6, 0x5F, 0xB0, + 0x40, 0xB4, 0xFE, 0xA8, 0x88, 0x7F, 0xBE, 0xDF, 0x06, 0xA1, 0xB5, 0xDE, + 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, 0xE1, 0xC9, 0x30, 0xD5, 0x7E, 0x41, + 0x38, 0x00, 0x7F, 0x41, 0x08, 0x08, 0x18, 0xE4, 0x0D, 0xC1, 0x28, 0xE4, + 0x00, 0x40, 0x27, 0xBC, 0x91, 0xE4, 0x01, 0xD5, 0xC1, 0xC9, 0x80, 0xE4, + 0xD5, 0x7F, 0xA1, 0xDF, 0x38, 0xE4, 0x00, 0xA0, 0x01, 0xBF, 0x09, 0xD6, + 0x83, 0xE4, 0x80, 0xB8, 0x08, 0x88, 0x08, 0xA9, 0x88, 0x7F, 0x7D, 0xDF, + 0xC1, 0xC0, 0x01, 0xBF, 0xF7, 0xD7, 0x00, 0xA0, 0x02, 0xBF, 0x0E, 0xD6, + 0x13, 0xB8, 0x07, 0xA3, 0x01, 0x88, 0x93, 0xE4, 0x90, 0xBA, 0xA4, 0xC8, + 0x00, 0x40, 0x81, 0xBC, 0x01, 0xA9, 0x88, 0x7F, 0x6C, 0xDF, 0xC1, 0xC0, + 0x02, 0xBF, 0xF4, 0xD7, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x7F, 0x41, + 0x18, 0x00, 0x7F, 0x41, 0x28, 0x08, 0xCF, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, + 0xFD, 0xB6, 0x38, 0xE4, 0x18, 0xE4, 0x80, 0x41, 0x14, 0xB8, 0x87, 0x41, + 0x08, 0x02, 0x41, 0x08, 0x01, 0xA9, 0x88, 0x7F, 0x54, 0xDF, 0x41, 0x08, + 0xE0, 0xC8, 0x00, 0x40, 0xA5, 0xD4, 0x51, 0x08, 0x01, 0xA9, 0x88, 0x7F, + 0x4C, 0xDF, 0x51, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0x97, 0xD4, 0x61, 0x08, + 0x01, 0xA9, 0x88, 0x7F, 0x44, 0xDF, 0x61, 0x08, 0xE0, 0xC8, 0x00, 0x40, + 0x6E, 0xD4, 0x81, 0x08, 0x01, 0xA9, 0x88, 0x7F, 0x3C, 0xDF, 0x81, 0x08, + 0xE0, 0xC8, 0x5E, 0xD4, 0x11, 0x08, 0x01, 0xA9, 0x88, 0x7F, 0x35, 0xDF, + 0x21, 0x08, 0x01, 0xA9, 0x88, 0x7F, 0x31, 0xDF, 0x31, 0x08, 0x01, 0xA9, + 0x88, 0x7F, 0x2D, 0xDF, 0x91, 0x08, 0x01, 0xA9, 0x88, 0x7F, 0x29, 0xDF, + 0x91, 0x08, 0xE0, 0xC8, 0x3A, 0xD4, 0x02, 0x00, 0x06, 0x40, 0x21, 0x08, + 0x08, 0xBD, 0x80, 0xE4, 0x01, 0xA9, 0x88, 0x7F, 0x1E, 0xDF, 0xE0, 0xC0, + 0x23, 0xD5, 0x00, 0xA0, 0x32, 0x08, 0xE0, 0xC8, 0x2A, 0xD4, 0x12, 0x08, + 0x20, 0xA9, 0x88, 0x7F, 0x14, 0xDF, 0x22, 0x08, 0x20, 0xA9, 0x88, 0x7F, + 0x10, 0xDF, 0x00, 0xA9, 0x32, 0x08, 0xE0, 0xC8, 0x01, 0xD5, 0x01, 0xA9, + 0x89, 0xE4, 0x01, 0xA9, 0x88, 0x7F, 0x07, 0xDF, 0x80, 0xE4, 0x48, 0xE0, + 0x00, 0x40, 0x90, 0xD4, 0x06, 0x40, 0x21, 0x08, 0x01, 0xA9, 0x87, 0x7F, + 0xFE, 0xDF, 0x06, 0x40, 0x21, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0x80, 0xD4, + 0xA1, 0x08, 0x01, 0xA9, 0x87, 0x7F, 0xF5, 0xDF, 0xA1, 0x08, 0xE0, 0xC8, + 0x5A, 0xD4, 0x01, 0xA8, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x01, 0xA0, + 0xD4, 0xDE, 0x05, 0x40, 0x21, 0x08, 0x87, 0x7F, 0xED, 0xDF, 0x05, 0x40, + 0x31, 0x08, 0x87, 0x7F, 0xE9, 0xDF, 0x06, 0x40, 0x01, 0x08, 0x87, 0x7F, + 0xE5, 0xDF, 0x06, 0x40, 0x11, 0x08, 0x87, 0x7F, 0xE1, 0xDF, 0xB5, 0xDE, + 0x05, 0x40, 0x01, 0x08, 0x87, 0x7F, 0xDC, 0xDF, 0x05, 0x40, 0x11, 0x08, + 0x87, 0x7F, 0xD8, 0xDF, 0x99, 0xDE, 0xF1, 0x08, 0x03, 0xA9, 0x87, 0x7F, + 0xCE, 0xDF, 0x04, 0x40, 0x01, 0x08, 0x01, 0xA9, 0x87, 0x7F, 0xC9, 0xDF, + 0x71, 0x08, 0x01, 0xA9, 0x87, 0x7F, 0xC5, 0xDF, 0x71, 0x08, 0xE0, 0xC8, + 0x82, 0xD5, 0x04, 0x40, 0x11, 0x08, 0x08, 0xA9, 0x87, 0x7F, 0xBD, 0xDF, + 0x04, 0x40, 0x21, 0x08, 0x08, 0xA9, 0x87, 0x7F, 0xB8, 0xDF, 0x04, 0x40, + 0x31, 0x08, 0x08, 0xA9, 0x87, 0x7F, 0xB3, 0xDF, 0xFF, 0x7F, 0x71, 0xDE, + 0xE1, 0x08, 0x01, 0xA9, 0x87, 0x7F, 0xAD, 0xDF, 0xFF, 0x7F, 0x63, 0xDE, + 0xB1, 0x08, 0x08, 0xA9, 0x87, 0x7F, 0xA7, 0xDF, 0xB1, 0x08, 0x0F, 0x40, + 0x8F, 0xBF, 0xFF, 0x7F, 0x52, 0xD4, 0xC1, 0x08, 0x10, 0xA9, 0x87, 0x7F, + 0x9E, 0xDF, 0xD1, 0x08, 0x10, 0xA9, 0x87, 0x7F, 0x9A, 0xDF, 0xFF, 0x7F, + 0x48, 0xDE, 0x00, 0xA8, 0x01, 0xA9, 0x87, 0x7F, 0x94, 0xDF, 0x00, 0xA8, + 0x01, 0xA9, 0x87, 0x7F, 0x90, 0xDF, 0x01, 0xA8, 0x98, 0xE4, 0x87, 0x7F, + 0x8C, 0xDF, 0x00, 0xA8, 0x87, 0x7F, 0x8E, 0xDF, 0x00, 0xA8, 0x87, 0x7F, + 0x8B, 0xDF, 0x00, 0xA8, 0x87, 0x7F, 0x88, 0xDF, 0x10, 0xA8, 0x87, 0x7F, + 0x85, 0xDF, 0x0F, 0xA8, 0x87, 0x7F, 0x82, 0xDF, 0x01, 0xA8, 0x03, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x83, 0xE4, 0x00, 0xA9, 0xFE, 0x7F, 0xDA, 0xDF, + 0xFF, 0x7F, 0x7A, 0xDE, 0x32, 0x08, 0xDF, 0xC8, 0x87, 0x7F, 0x74, 0xDF, + 0xFF, 0x7F, 0x6A, 0xDE, 0x20, 0xB5, 0xFD, 0xB6, 0x01, 0xA8, 0x87, 0x7F, + 0xA3, 0xDF, 0x88, 0x7F, 0x21, 0xDF, 0x01, 0xA8, 0x03, 0xB6, 0x40, 0xB4, + 0x20, 0xB5, 0x7C, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0xC8, 0xE4, 0x68, 0xE4, + 0x0F, 0x40, 0x68, 0xB8, 0xE8, 0xE4, 0x2C, 0x40, 0xE0, 0xB8, 0xA5, 0x44, + 0x08, 0x0D, 0x5D, 0x0B, 0x06, 0x40, 0x2D, 0x03, 0x00, 0xA9, 0x06, 0x40, + 0x16, 0x19, 0x0D, 0x40, 0x06, 0x39, 0x0D, 0x40, 0x16, 0x39, 0xA9, 0xE4, + 0x03, 0x28, 0xE0, 0xC8, 0x1A, 0xDB, 0x2C, 0xE4, 0x13, 0x40, 0x28, 0xB8, + 0x16, 0xE4, 0x03, 0xE4, 0xC6, 0xC0, 0x80, 0x29, 0xC2, 0xC0, 0x9B, 0xB8, + 0x01, 0x19, 0xC4, 0xC1, 0x8C, 0xE4, 0x02, 0x40, 0xB8, 0xDF, 0x02, 0x38, + 0xC1, 0xC2, 0x93, 0x88, 0x06, 0x40, 0x16, 0x09, 0x98, 0xBD, 0x06, 0x40, + 0x16, 0x19, 0xC1, 0xCA, 0x03, 0x28, 0xA8, 0xBF, 0xEC, 0xD9, 0xA3, 0x88, + 0xAA, 0xC8, 0x98, 0xBD, 0x06, 0x40, 0x16, 0x19, 0x00, 0xA4, 0x13, 0x28, + 0xE0, 0xC8, 0x19, 0xDB, 0x23, 0xE4, 0x02, 0x40, 0x26, 0xB8, 0x1A, 0xE4, + 0x16, 0xB8, 0x04, 0x40, 0x10, 0xB8, 0x0A, 0xE4, 0x0A, 0xC0, 0x06, 0xB8, + 0x82, 0x29, 0xC2, 0xC2, 0x9B, 0xB8, 0x00, 0x19, 0xC4, 0xC0, 0x8C, 0xE4, + 0x02, 0x40, 0x91, 0xDF, 0x01, 0x38, 0xC1, 0xC1, 0xC1, 0xCA, 0xC1, 0xC4, + 0x13, 0x28, 0x48, 0xBF, 0xF1, 0xD9, 0xBA, 0xE4, 0xFE, 0x08, 0xE0, 0xC8, + 0x54, 0xD5, 0x3D, 0xE4, 0x08, 0x40, 0x3C, 0xB8, 0x01, 0xA1, 0x88, 0x41, + 0x1E, 0x00, 0x00, 0xA4, 0x4A, 0xBF, 0x0D, 0xD6, 0x96, 0xE4, 0x03, 0xDE, + 0xC1, 0xC4, 0x4A, 0xBF, 0x08, 0xD6, 0x09, 0x08, 0xC4, 0xC9, 0x80, 0xBF, + 0xF9, 0xD4, 0x00, 0xA1, 0xC1, 0xC4, 0x4A, 0xBF, 0xF8, 0xD7, 0xE0, 0xC1, + 0x42, 0xD5, 0xFF, 0xC0, 0x40, 0xD5, 0x01, 0xA8, 0x43, 0x18, 0x0A, 0x40, + 0x0D, 0x08, 0xE1, 0xC8, 0x42, 0xD5, 0x03, 0x10, 0x01, 0xA8, 0x01, 0x40, + 0x43, 0x38, 0x00, 0xA9, 0x13, 0x19, 0x01, 0x40, 0x53, 0x39, 0x0A, 0x40, + 0x0D, 0x08, 0x23, 0x18, 0x06, 0x40, 0x16, 0x19, 0x23, 0x08, 0xAA, 0xC8, + 0x06, 0x40, 0x16, 0x18, 0x49, 0xE4, 0x43, 0x08, 0xE0, 0xC8, 0x15, 0xDB, + 0x23, 0xE4, 0x1A, 0xE4, 0x16, 0xB8, 0x04, 0x40, 0x10, 0xB8, 0x0A, 0xE4, + 0x0A, 0xC0, 0x06, 0xB8, 0x02, 0x09, 0xC4, 0xC2, 0x00, 0x19, 0xC4, 0xC0, + 0x8C, 0xE4, 0x02, 0x40, 0x42, 0xDF, 0x01, 0x38, 0xC1, 0xC1, 0xC1, 0xC4, + 0x43, 0x08, 0x84, 0xBF, 0xF3, 0xD8, 0xC1, 0xCB, 0x23, 0x08, 0xE0, 0xC8, + 0x06, 0xD5, 0x3D, 0x08, 0xE1, 0xC8, 0x27, 0xD5, 0x01, 0xA8, 0x0D, 0x40, + 0x16, 0x38, 0x0A, 0x40, 0x06, 0x3B, 0x03, 0xB6, 0x5F, 0xB0, 0x7C, 0xB2, + 0x40, 0xB4, 0x00, 0xA8, 0x43, 0x18, 0x0A, 0x40, 0x06, 0x3B, 0x03, 0xB6, + 0x5F, 0xB0, 0x7C, 0xB2, 0x40, 0xB4, 0x88, 0x41, 0x1E, 0x09, 0x5D, 0x08, + 0x98, 0xBF, 0xB9, 0xDA, 0x1C, 0xE4, 0x74, 0x46, 0x12, 0xB8, 0x81, 0xE4, + 0x06, 0x40, 0x2D, 0x09, 0x02, 0x40, 0x36, 0xDF, 0x3D, 0x08, 0xE1, 0xC8, + 0x09, 0xD5, 0x06, 0x40, 0x2D, 0x11, 0x01, 0xA8, 0x05, 0x40, 0x2D, 0x18, + 0xA8, 0xDE, 0x0D, 0x40, 0x06, 0x38, 0xD9, 0xDE, 0x91, 0x88, 0xE0, 0xC8, + 0x02, 0xD5, 0x00, 0xA8, 0x91, 0x38, 0xA1, 0x88, 0xE0, 0xC8, 0xEF, 0xD5, + 0x00, 0xA8, 0xA1, 0x38, 0xEC, 0xDE, 0x0F, 0xB1, 0x07, 0x93, 0x02, 0x40, + 0x8C, 0xB8, 0x0A, 0x40, 0x08, 0x22, 0x12, 0xE4, 0x01, 0xE0, 0x01, 0xE4, + 0x0A, 0xC0, 0x08, 0xB8, 0x00, 0x13, 0x18, 0xB8, 0x08, 0x40, 0x01, 0x39, + 0xC1, 0xC2, 0x0A, 0x40, 0x08, 0x32, 0x01, 0xA8, 0x0F, 0xB0, 0xA0, 0xE0, + 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xED, 0xB6, 0xE8, 0xE4, 0xD8, 0xE4, + 0x02, 0x40, 0xDC, 0xB8, 0xB8, 0xE4, 0x0F, 0x40, 0xB8, 0xB8, 0x00, 0xA6, + 0xC6, 0xE4, 0x0A, 0x40, 0x0D, 0x2A, 0xE0, 0xCA, 0x1D, 0xDB, 0x0C, 0x40, + 0xDF, 0xE1, 0x3D, 0xE4, 0x00, 0xA0, 0x0A, 0x40, 0x0B, 0x24, 0x24, 0xE4, + 0x02, 0xE0, 0xE0, 0xC2, 0x09, 0xDB, 0x03, 0x01, 0x9B, 0xE4, 0x09, 0x08, + 0xC4, 0xC9, 0x81, 0xBF, 0x03, 0xD5, 0xC1, 0xC0, 0x20, 0xBF, 0xF9, 0xD8, + 0x84, 0xE4, 0x08, 0xE0, 0x80, 0xBF, 0x18, 0xD5, 0xC1, 0xC6, 0xC4, 0xC3, + 0x8A, 0xE4, 0x08, 0xE0, 0x86, 0xBF, 0xE6, 0xD8, 0x00, 0xA6, 0x6C, 0xBF, + 0x0A, 0xDA, 0x0C, 0x40, 0xD0, 0xE1, 0x8E, 0xE4, 0x00, 0x09, 0xC4, 0xC0, + 0x01, 0x40, 0x71, 0xDF, 0xC1, 0xC6, 0x6C, 0xBF, 0xF8, 0xD9, 0x01, 0xA8, + 0x13, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x8C, 0xE4, 0x0A, 0xC8, + 0x8F, 0xB8, 0x03, 0x09, 0x08, 0x19, 0xC1, 0xCC, 0x0A, 0x40, 0x0D, 0x2A, + 0xDF, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, 0x98, 0xE4, 0x28, 0xE4, + 0x02, 0x40, 0x2C, 0xB8, 0x00, 0xA1, 0x0A, 0x40, 0x02, 0x28, 0xE0, 0xC8, + 0x10, 0xDB, 0x39, 0xE4, 0x22, 0x40, 0x34, 0xB8, 0x09, 0xE4, 0x06, 0x40, + 0x0C, 0xB8, 0x00, 0x29, 0xC1, 0xC0, 0x83, 0xE4, 0xD4, 0x7F, 0xC9, 0xDF, + 0xC1, 0xC1, 0x0A, 0x40, 0x02, 0x28, 0x18, 0xBF, 0xF6, 0xD9, 0x00, 0xA8, + 0x0A, 0x40, 0x02, 0x38, 0x01, 0xA8, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xEE, 0xB6, 0xD8, 0xE4, 0xA5, 0x44, + 0x08, 0x0B, 0xE8, 0xE4, 0x2C, 0x40, 0xE0, 0xB8, 0xCB, 0xE4, 0x08, 0x40, + 0xCC, 0xB8, 0x00, 0xAA, 0x06, 0x40, 0x2B, 0x02, 0x1A, 0xE4, 0x0A, 0xE4, + 0x4A, 0xE4, 0x02, 0x29, 0xE0, 0xC9, 0x13, 0xDB, 0x38, 0x40, 0xD3, 0xE1, + 0x92, 0x88, 0x80, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x06, 0xD5, 0x84, 0xE4, + 0x83, 0xB8, 0x08, 0x31, 0xC1, 0xC4, 0xC1, 0xCA, 0x02, 0x29, 0xC1, 0xC1, + 0xC1, 0xC0, 0x89, 0xE4, 0x08, 0xE0, 0x80, 0xBF, 0xEF, 0xD8, 0x00, 0xA0, + 0x30, 0xE4, 0x12, 0x29, 0xE0, 0xC9, 0x13, 0xDB, 0x28, 0x40, 0xD6, 0xE1, + 0xA2, 0x88, 0x80, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x06, 0xD5, 0x83, 0xE4, + 0x86, 0xB8, 0x08, 0x31, 0xC1, 0xC3, 0xC1, 0xCA, 0x12, 0x29, 0xC1, 0xC1, + 0xC1, 0xC0, 0x89, 0xE4, 0x08, 0xE0, 0x80, 0xBF, 0xEF, 0xD8, 0x00, 0xA0, + 0x20, 0xE4, 0x4C, 0x09, 0xE0, 0xC9, 0x11, 0xDB, 0x18, 0x40, 0xD6, 0xE1, + 0x2C, 0x08, 0x81, 0xC8, 0x00, 0x40, 0x81, 0xBC, 0x06, 0xD5, 0x82, 0xE4, + 0x86, 0xB8, 0x08, 0x31, 0xC1, 0xC2, 0xC1, 0xCA, 0x4C, 0x09, 0xC1, 0xC1, + 0xC1, 0xC0, 0x90, 0xBF, 0xF1, 0xD8, 0x00, 0xA9, 0x8D, 0xE4, 0x0E, 0xA0, + 0x08, 0x40, 0x08, 0x19, 0x0B, 0x40, 0x38, 0x19, 0xDF, 0xC0, 0xC4, 0xC8, + 0xE0, 0xC0, 0xF8, 0xDA, 0x09, 0xE4, 0x94, 0xBF, 0x15, 0xDA, 0x38, 0x40, + 0xD6, 0xE1, 0x93, 0xE4, 0x0A, 0xC9, 0x9D, 0xB8, 0x0B, 0x40, 0x9C, 0xB8, + 0x1D, 0xE4, 0x08, 0x40, 0x10, 0xB8, 0x86, 0xE4, 0x80, 0xB8, 0x08, 0x2F, + 0x01, 0x1F, 0xC4, 0xC1, 0x08, 0x28, 0x09, 0x18, 0xC4, 0xC9, 0xC1, 0xC0, + 0x04, 0xBF, 0xF5, 0xD9, 0x00, 0xA0, 0x03, 0xBF, 0x15, 0xDA, 0x28, 0x40, + 0xD6, 0xE1, 0x1D, 0xE4, 0x0B, 0x40, 0x1C, 0xB8, 0x94, 0xE4, 0x0A, 0xC9, + 0x9D, 0xB8, 0x08, 0x40, 0x90, 0xB8, 0x86, 0xE4, 0x80, 0xB8, 0x08, 0x2F, + 0x09, 0x1F, 0xC4, 0xC9, 0x08, 0x28, 0x01, 0x18, 0xC4, 0xC1, 0xC1, 0xC0, + 0x03, 0xBF, 0xF5, 0xD9, 0x34, 0xB8, 0x00, 0xA0, 0x02, 0xBF, 0x11, 0xDA, + 0x18, 0x40, 0xD1, 0xE1, 0x93, 0xE4, 0x0A, 0xC9, 0x9D, 0xB8, 0x81, 0xE4, + 0x80, 0xB8, 0x08, 0x24, 0x08, 0x40, 0x09, 0x14, 0x08, 0x28, 0x0B, 0x40, + 0x39, 0x18, 0xC1, 0xC0, 0xC4, 0xC9, 0x02, 0xBF, 0xF4, 0xD9, 0x23, 0xB8, + 0xE0, 0xC2, 0x24, 0xDB, 0x12, 0xE4, 0xEE, 0xC2, 0x0F, 0xD8, 0x92, 0xE4, + 0x0A, 0xC9, 0x9D, 0xB8, 0x08, 0x40, 0x90, 0xB8, 0x0D, 0xE4, 0x08, 0x40, + 0x00, 0xB8, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0xC1, 0xC1, + 0xEE, 0xC1, 0xF9, 0xDB, 0x12, 0xE4, 0xEE, 0xC2, 0x0F, 0xD8, 0x92, 0xE4, + 0x0A, 0xC9, 0x9D, 0xB8, 0x0B, 0x40, 0x9C, 0xB8, 0x0D, 0xE4, 0x0B, 0x40, + 0x0C, 0xB8, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0xC1, 0xC1, + 0xEE, 0xC1, 0xF9, 0xDB, 0x00, 0xA8, 0x04, 0x40, 0x0B, 0x18, 0x04, 0x40, + 0x1B, 0x18, 0x04, 0x40, 0x2B, 0x18, 0x04, 0x40, 0x3B, 0x18, 0x5B, 0x08, + 0xE0, 0xC8, 0x04, 0xDB, 0x04, 0x40, 0x0E, 0x08, 0xE0, 0xC8, 0x06, 0xD4, + 0x7B, 0x41, 0x0E, 0x1A, 0x12, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, + 0x3B, 0x04, 0x6D, 0xE4, 0x0F, 0x40, 0x68, 0xB8, 0x8E, 0xE4, 0x26, 0x40, + 0x88, 0xB8, 0x10, 0x40, 0xDF, 0xE1, 0x83, 0x9F, 0x5B, 0x09, 0xE8, 0x7F, + 0xD8, 0xDF, 0xE1, 0xC4, 0x12, 0xDC, 0x01, 0xA1, 0x1A, 0xBF, 0x0F, 0xDA, + 0x04, 0x92, 0x9D, 0xE4, 0x08, 0x40, 0x94, 0xB8, 0x09, 0x00, 0xC4, 0xC9, + 0x80, 0xE4, 0x0A, 0xC8, 0x86, 0xB8, 0x08, 0x08, 0x82, 0xBF, 0x33, 0xD5, + 0xC1, 0xC1, 0x1A, 0xBF, 0xF5, 0xD9, 0xE0, 0xC4, 0xD7, 0xD4, 0x0A, 0x40, + 0x0B, 0x08, 0xE0, 0xC8, 0x0F, 0xD5, 0x4C, 0x08, 0xE0, 0xC8, 0x0C, 0xDB, + 0x01, 0xA8, 0x04, 0x40, 0x1B, 0x18, 0x04, 0x40, 0x3B, 0x13, 0x0A, 0xC3, + 0x3D, 0xB8, 0x0B, 0x40, 0x33, 0x08, 0x0B, 0x40, 0x3D, 0x18, 0xC4, 0xDE, + 0x01, 0xA1, 0x1A, 0xBF, 0xC1, 0xDA, 0x1F, 0x02, 0x9D, 0xE4, 0x0C, 0x40, + 0x90, 0xB8, 0x03, 0xDE, 0xC1, 0xC1, 0x1A, 0xBF, 0xB9, 0xDA, 0x09, 0x00, + 0xC4, 0xC9, 0x80, 0xE4, 0x0A, 0xC8, 0x86, 0xB8, 0x08, 0x08, 0x82, 0xBF, + 0xF5, 0xD4, 0x01, 0xA8, 0x04, 0x40, 0x1B, 0x18, 0x04, 0x40, 0x3B, 0x11, + 0x0B, 0x40, 0x3D, 0x10, 0xA9, 0xDE, 0x01, 0xA8, 0x04, 0x40, 0x0B, 0x18, + 0x04, 0x40, 0x2B, 0x11, 0x08, 0x40, 0x0D, 0x10, 0xC8, 0xDE, 0x20, 0xB5, + 0x5F, 0xB1, 0xFD, 0xB6, 0x48, 0xE4, 0x69, 0xE4, 0x38, 0xE4, 0x02, 0x40, + 0x3C, 0xB8, 0x00, 0xA1, 0x0A, 0x40, 0x03, 0x22, 0xE0, 0xC2, 0x0E, 0xDB, + 0x08, 0xE4, 0x06, 0x40, 0x0C, 0xB8, 0x93, 0xE4, 0x09, 0x08, 0xC4, 0xC9, + 0x86, 0xBF, 0x09, 0xD5, 0xC1, 0xC1, 0xC1, 0xC0, 0x82, 0xE4, 0x08, 0xE0, + 0x81, 0xBF, 0xF6, 0xD8, 0x03, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x00, 0x29, + 0x84, 0xE4, 0x22, 0x40, 0x84, 0xB8, 0xD3, 0x7F, 0x5C, 0xDF, 0xC1, 0xC1, + 0x0A, 0x40, 0x03, 0x22, 0x42, 0xE4, 0x04, 0xE0, 0x41, 0xBF, 0x10, 0xDB, + 0x01, 0xE4, 0x0A, 0xC0, 0x03, 0xB8, 0x00, 0x08, 0xFF, 0x7F, 0x30, 0x18, + 0x91, 0xE4, 0x93, 0xB8, 0x08, 0x40, 0x09, 0x28, 0x07, 0x40, 0x79, 0x38, + 0xC1, 0xC1, 0xC4, 0xC0, 0x41, 0xBF, 0xF3, 0xD8, 0x82, 0xE4, 0xDF, 0xC8, + 0x0A, 0x40, 0x03, 0x38, 0x03, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x0F, 0xB1, + 0x28, 0xE4, 0x39, 0xE4, 0x02, 0x40, 0x2C, 0xB8, 0x0A, 0x40, 0x02, 0x28, + 0xFF, 0xA0, 0xE0, 0xC8, 0x0C, 0xD9, 0x00, 0xA0, 0x09, 0xDB, 0x18, 0xE4, + 0x92, 0xE4, 0x09, 0x08, 0xC4, 0xC9, 0x83, 0xBF, 0x07, 0xD5, 0xC1, 0xC0, + 0x10, 0xBF, 0xF9, 0xD8, 0xFF, 0xA0, 0x80, 0xE4, 0x0F, 0xB0, 0xA0, 0xE0, + 0x02, 0xB8, 0x08, 0x40, 0x00, 0x20, 0x80, 0xE4, 0x0F, 0xB0, 0xA0, 0xE0, + 0x5F, 0xB1, 0x38, 0xE4, 0x49, 0xE4, 0x09, 0x28, 0x03, 0x38, 0x19, 0x26, + 0x13, 0x36, 0x99, 0x29, 0x93, 0x39, 0xA4, 0x29, 0xA3, 0x39, 0x00, 0xA1, + 0x28, 0xE4, 0xE0, 0xC8, 0x0B, 0xDB, 0x03, 0xE4, 0xC6, 0xC0, 0x94, 0xE4, + 0xC6, 0xC9, 0x89, 0x28, 0xC2, 0xC9, 0x80, 0x38, 0xC2, 0xC0, 0xC1, 0xC1, + 0x21, 0xBF, 0xF9, 0xD8, 0x00, 0xA1, 0x26, 0xE4, 0x02, 0xE0, 0xE0, 0xC2, + 0x0D, 0xDB, 0x03, 0xE4, 0x02, 0x40, 0x06, 0xB8, 0x94, 0xE4, 0x02, 0x40, + 0x96, 0xB8, 0x89, 0x28, 0xC2, 0xC9, 0x80, 0x38, 0xC2, 0xC0, 0xC1, 0xC1, + 0x21, 0xBF, 0xF9, 0xD8, 0x5F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x0F, 0xB1, + 0xFD, 0xB6, 0x18, 0xE4, 0x39, 0xE4, 0x0B, 0x90, 0x15, 0x45, 0x18, 0x09, + 0xE0, 0xC9, 0x04, 0xD5, 0x89, 0xE4, 0x00, 0x40, 0x84, 0xBC, 0x27, 0xD5, + 0x00, 0xA8, 0xE0, 0x18, 0xF0, 0x18, 0xFF, 0xA8, 0xE0, 0xC9, 0x01, 0xD5, + 0xFE, 0xA8, 0x00, 0x18, 0x00, 0xA8, 0xA0, 0x18, 0xFE, 0xA9, 0xC0, 0x19, + 0xFF, 0xA9, 0x90, 0x19, 0x70, 0x18, 0x10, 0x18, 0x20, 0x18, 0x30, 0x18, + 0x40, 0x18, 0x60, 0x18, 0x04, 0x40, 0x20, 0x18, 0x80, 0x18, 0x04, 0x40, + 0x00, 0x18, 0xB1, 0x44, 0x31, 0x08, 0xD0, 0x18, 0x84, 0x7F, 0xDE, 0xDF, + 0x04, 0x40, 0x10, 0x18, 0x21, 0x08, 0x04, 0x40, 0x30, 0x18, 0x01, 0xA8, + 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0x92, 0xBC, 0x2D, 0xD5, + 0xA5, 0x44, 0x01, 0x02, 0x32, 0x09, 0xE2, 0xC9, 0x04, 0xD5, 0x89, 0xE4, + 0xE1, 0xC9, 0x01, 0xD5, 0x02, 0xA8, 0xE0, 0x18, 0xE2, 0x08, 0xF0, 0x18, + 0x11, 0x08, 0x00, 0x18, 0x52, 0x08, 0xA0, 0x18, 0xA1, 0x08, 0xC0, 0x18, + 0x51, 0x08, 0x90, 0x18, 0x23, 0x08, 0x70, 0x18, 0x21, 0x40, 0x13, 0x08, + 0x10, 0x18, 0x22, 0x08, 0x20, 0x18, 0x22, 0x40, 0x03, 0x08, 0x30, 0x18, + 0x21, 0x40, 0x33, 0x08, 0x40, 0x18, 0x21, 0x40, 0x23, 0x08, 0x60, 0x18, + 0x35, 0x40, 0x21, 0x08, 0x04, 0x40, 0x20, 0x18, 0x7A, 0x47, 0x31, 0x08, + 0x80, 0x18, 0x03, 0x08, 0xC0, 0xDE, 0xE0, 0x19, 0xF0, 0x19, 0xFD, 0xA8, + 0x00, 0x18, 0xA0, 0x19, 0xC0, 0x18, 0xFF, 0xA8, 0x90, 0x18, 0x70, 0x19, + 0x10, 0x19, 0x20, 0x19, 0x30, 0x19, 0x40, 0x19, 0x60, 0x19, 0x04, 0x40, + 0x20, 0x19, 0x7A, 0x47, 0x31, 0x08, 0x80, 0x18, 0x04, 0x40, 0x00, 0x19, + 0xAC, 0xDE, 0x20, 0xB5, 0x14, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0xA8, 0xE4, + 0x09, 0xE4, 0x0F, 0x9C, 0x6C, 0xE4, 0x0A, 0xC6, 0xE0, 0xCC, 0x09, 0xDB, + 0x6C, 0xE4, 0x0A, 0xC6, 0x86, 0xE4, 0x8A, 0xB8, 0xA8, 0x40, 0x18, 0x08, + 0x01, 0xA9, 0x83, 0x7F, 0xA6, 0xDF, 0x26, 0xE4, 0x2A, 0xB8, 0xA8, 0x40, + 0x12, 0x01, 0xE0, 0xC1, 0x39, 0xD5, 0xE0, 0xC0, 0x33, 0xD4, 0xB4, 0x40, + 0x12, 0x01, 0x81, 0xE4, 0x7D, 0xC8, 0x01, 0xA9, 0x83, 0x7F, 0x97, 0xDF, + 0x81, 0xE4, 0xD2, 0x7F, 0x90, 0xDF, 0xDF, 0xC8, 0x83, 0x7F, 0x96, 0xDF, + 0x00, 0xA3, 0xB8, 0x40, 0x12, 0x08, 0xE0, 0xC8, 0x00, 0x40, 0x76, 0xDB, + 0x0C, 0xE4, 0x01, 0x40, 0x01, 0xE6, 0x0A, 0xC0, 0x0A, 0xB8, 0xBC, 0x40, + 0x04, 0xB8, 0x11, 0xDE, 0x01, 0xA9, 0x83, 0x7F, 0x80, 0xDF, 0xE1, 0xC1, + 0x05, 0xD5, 0x04, 0xC1, 0x81, 0xE4, 0x01, 0xA9, 0x83, 0x7F, 0x79, 0xDF, + 0xC1, 0xC3, 0x86, 0xE4, 0x8A, 0xB8, 0xB8, 0x40, 0x18, 0x08, 0x83, 0xBF, + 0x5D, 0xDB, 0x00, 0x01, 0xC4, 0xC0, 0x00, 0xA8, 0xE1, 0xC1, 0xEA, 0xD4, + 0x81, 0xE4, 0xE8, 0xDE, 0x00, 0xA8, 0x83, 0x7F, 0x6D, 0xDF, 0xC9, 0xDE, + 0x02, 0xE4, 0xB0, 0x40, 0x04, 0xB8, 0x00, 0x08, 0x83, 0x7F, 0x66, 0xDF, + 0xAC, 0x40, 0x12, 0x08, 0x83, 0x7F, 0x62, 0xDF, 0x31, 0xE4, 0x41, 0xE4, + 0x00, 0x08, 0xE0, 0xC8, 0x1B, 0xDB, 0x2C, 0xE4, 0x1A, 0xC2, 0x12, 0xE4, + 0x1A, 0xB8, 0x01, 0xE4, 0x20, 0x40, 0x04, 0xB8, 0x00, 0x08, 0x48, 0xBA, + 0xDF, 0xC4, 0x84, 0xE4, 0x83, 0x7F, 0x50, 0xDF, 0x00, 0x04, 0x68, 0x40, + 0x11, 0x08, 0x01, 0xA9, 0x83, 0x7F, 0x45, 0xDF, 0xC1, 0xC3, 0xC4, 0xC2, + 0x86, 0xE4, 0x8A, 0xB8, 0xB0, 0x40, 0x18, 0x08, 0x83, 0xBF, 0xE7, 0xD8, + 0x00, 0xA4, 0x96, 0xE4, 0x9A, 0xB8, 0xB0, 0x40, 0x19, 0x03, 0xAC, 0x40, + 0x19, 0x08, 0x83, 0xB8, 0x83, 0xBF, 0x1E, 0xDB, 0x2C, 0xE4, 0x12, 0xC2, + 0x69, 0xE4, 0x23, 0xB8, 0x0A, 0xC2, 0x12, 0xE4, 0x1A, 0xB8, 0x01, 0xE4, + 0x20, 0x40, 0x04, 0xB8, 0x00, 0x08, 0x84, 0xBA, 0xDF, 0xC8, 0x83, 0x7F, + 0x29, 0xDF, 0x00, 0x04, 0x68, 0x40, 0x11, 0x08, 0x01, 0xA9, 0x83, 0x7F, + 0x1E, 0xDF, 0xC1, 0xC3, 0xC4, 0xC2, 0xB0, 0x40, 0x16, 0x08, 0xAC, 0x40, + 0x16, 0x09, 0x89, 0xB8, 0x83, 0xBF, 0xE7, 0xD8, 0x01, 0xA8, 0x03, 0xB6, + 0x5F, 0xB0, 0x14, 0xB2, 0x40, 0xB4, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, + 0xCC, 0xB6, 0xD8, 0xE4, 0x00, 0xA0, 0x91, 0x90, 0x92, 0x90, 0x01, 0xA8, + 0x8E, 0x98, 0x8B, 0x90, 0x8A, 0x98, 0x89, 0x90, 0xC0, 0xE4, 0x8D, 0xE4, + 0x64, 0x40, 0x84, 0xB8, 0x09, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, + 0x09, 0x10, 0xC4, 0xC9, 0x08, 0x10, 0xC4, 0xC8, 0xC1, 0xCC, 0xEF, 0xCC, + 0xF9, 0xDB, 0x93, 0x90, 0x0E, 0x90, 0xDF, 0xC0, 0x0D, 0x04, 0x80, 0xE4, + 0x94, 0xE4, 0x22, 0x40, 0x96, 0xDF, 0x90, 0x98, 0x80, 0xE4, 0x94, 0xE4, + 0x21, 0x40, 0xE9, 0xDF, 0x84, 0xE6, 0x8F, 0x98, 0x10, 0x99, 0x16, 0xC9, + 0x87, 0x99, 0x9D, 0xB8, 0x29, 0x08, 0x0F, 0x90, 0x08, 0xB8, 0x8F, 0x90, + 0x88, 0xB8, 0x00, 0x40, 0xC8, 0xD7, 0x00, 0xAC, 0x8D, 0x9C, 0x10, 0x90, + 0x0A, 0xC0, 0x88, 0x90, 0x80, 0xE4, 0x8D, 0xB8, 0x60, 0x40, 0x18, 0x08, + 0xE0, 0xC8, 0x00, 0x40, 0x67, 0xDB, 0x10, 0x98, 0x1A, 0xC8, 0x8D, 0xB8, + 0xE8, 0xE4, 0x20, 0x40, 0xE4, 0xB8, 0x85, 0x99, 0x84, 0x98, 0x0E, 0x03, + 0xC4, 0xCE, 0x0F, 0x98, 0x38, 0xB8, 0xE0, 0xC3, 0x00, 0x40, 0xAA, 0xD9, + 0x00, 0xA0, 0x8C, 0x90, 0xB0, 0xE4, 0x0A, 0x98, 0x08, 0xBF, 0x43, 0xDA, + 0x4C, 0xA6, 0xD7, 0xE1, 0x67, 0xB8, 0x05, 0x9F, 0x01, 0x40, 0xF8, 0xB8, + 0x04, 0x99, 0x68, 0x40, 0x94, 0xB8, 0x86, 0x99, 0x04, 0xDE, 0xC1, 0xCB, + 0x0A, 0x99, 0xB9, 0xBF, 0x31, 0xDA, 0x06, 0x08, 0xC4, 0xC6, 0x83, 0xBF, + 0xF8, 0xD4, 0x01, 0xA0, 0x8C, 0x90, 0x00, 0xA2, 0xE0, 0xC4, 0xF3, 0xDB, + 0x83, 0xE4, 0x94, 0xE4, 0x22, 0x40, 0x47, 0xDF, 0xA8, 0xE4, 0x1D, 0xE4, + 0x64, 0x40, 0x14, 0xB8, 0x04, 0xDE, 0xC1, 0xC2, 0xC4, 0xC1, 0x42, 0xBF, + 0xE6, 0xDB, 0x02, 0xE4, 0x16, 0xC0, 0x0D, 0xB8, 0x20, 0x08, 0x94, 0xE4, + 0x22, 0x40, 0x37, 0xDF, 0xA8, 0xBF, 0xF3, 0xD4, 0x01, 0x40, 0x08, 0xB8, + 0x00, 0x09, 0x0F, 0x08, 0x98, 0xBF, 0x07, 0xD5, 0x00, 0xA0, 0x98, 0xBF, + 0x01, 0xD8, 0x01, 0xA0, 0x06, 0x98, 0x08, 0x10, 0xE6, 0xDE, 0x01, 0xA8, + 0x01, 0x18, 0x00, 0x09, 0x0F, 0x08, 0xF4, 0xDE, 0x0C, 0x90, 0xE0, 0xC0, + 0x02, 0xD4, 0x01, 0xA8, 0x91, 0x98, 0xC1, 0xCC, 0x04, 0x99, 0xC4, 0xC9, + 0x84, 0x99, 0x08, 0x98, 0x8D, 0xB8, 0x60, 0x40, 0x18, 0x08, 0x8C, 0xBF, + 0xA4, 0xD8, 0x0D, 0x90, 0xE0, 0xC0, 0x62, 0xD4, 0x11, 0x98, 0xE0, 0xC8, + 0x5F, 0xD4, 0x08, 0x99, 0x09, 0x40, 0x00, 0xA0, 0xD7, 0xE1, 0x07, 0xB8, + 0x90, 0xB8, 0x09, 0x08, 0xE0, 0xC8, 0x0A, 0xD4, 0x09, 0x98, 0xC1, 0xC8, + 0x89, 0x98, 0x01, 0xA0, 0x09, 0x10, 0x0D, 0x08, 0x09, 0x99, 0x89, 0xBF, + 0x00, 0x40, 0x99, 0xD5, 0x00, 0xA8, 0x8A, 0x98, 0xC8, 0xE4, 0x08, 0x99, + 0x9D, 0xB8, 0x60, 0x40, 0x94, 0xB8, 0x09, 0x08, 0xE0, 0xC8, 0x18, 0xDB, + 0x19, 0xE4, 0x10, 0x99, 0x1A, 0xC9, 0x9D, 0xB8, 0x20, 0x40, 0x94, 0xB8, + 0x4C, 0xA0, 0xD7, 0xE1, 0x07, 0xB8, 0x09, 0x03, 0xC4, 0xC9, 0x0F, 0x98, + 0x38, 0xB8, 0xE0, 0xC3, 0x05, 0xD9, 0x00, 0x13, 0x0A, 0x98, 0xC1, 0xC8, + 0x8A, 0x98, 0xC4, 0xC0, 0xC1, 0xCC, 0x01, 0x08, 0x8C, 0xBF, 0xF1, 0xD8, + 0x0A, 0x98, 0x0A, 0xC8, 0x4C, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0x89, 0xB8, + 0x0F, 0x90, 0x08, 0x10, 0x0A, 0x98, 0xC1, 0xC8, 0x8A, 0x98, 0x0E, 0x99, + 0xC1, 0xC9, 0x8E, 0x99, 0x12, 0x90, 0xE0, 0xC0, 0x14, 0xD5, 0xFF, 0xA8, + 0x11, 0x99, 0xE0, 0xC9, 0x01, 0xD4, 0x0B, 0x98, 0x34, 0xB6, 0x5F, 0xB0, + 0xFC, 0xB2, 0x40, 0xB4, 0x01, 0xA9, 0x8D, 0x99, 0x9E, 0xDE, 0x01, 0xA8, + 0x91, 0x98, 0x0E, 0x99, 0xC1, 0xC9, 0x8E, 0x99, 0x12, 0x90, 0xE0, 0xC0, + 0xEC, 0xD4, 0x11, 0x98, 0xE0, 0xC8, 0xFF, 0x7F, 0x13, 0xD5, 0xE7, 0xDE, + 0x0B, 0x90, 0x40, 0xB8, 0x16, 0xC4, 0x4D, 0xB8, 0xC4, 0xC4, 0x07, 0x99, + 0x9D, 0xB8, 0xC4, 0xC9, 0x20, 0xA8, 0x83, 0x98, 0x84, 0xE4, 0x28, 0x40, + 0xD5, 0xDF, 0x00, 0xAC, 0x1C, 0xE4, 0x08, 0x98, 0x8D, 0xB8, 0x60, 0x40, + 0x18, 0x08, 0xE0, 0xC8, 0x36, 0xDB, 0x0D, 0x04, 0x28, 0xE4, 0x10, 0x90, + 0x1A, 0xC0, 0x0D, 0xB8, 0x0B, 0x99, 0x94, 0xB8, 0x1A, 0xC9, 0x9D, 0xB8, + 0x20, 0x40, 0x10, 0x08, 0x0F, 0x93, 0x38, 0xB8, 0xE0, 0xC3, 0x08, 0xD9, + 0x20, 0x40, 0x19, 0x18, 0x68, 0x40, 0x10, 0x08, 0x68, 0x40, 0x19, 0x18, + 0xC1, 0xC1, 0xC4, 0xC9, 0xC1, 0xCC, 0xC4, 0xC0, 0x2C, 0xBF, 0xEE, 0xD8, + 0x0B, 0x98, 0x84, 0xB8, 0x0A, 0xC8, 0x98, 0xE4, 0x9D, 0xB8, 0x60, 0x40, + 0x19, 0x11, 0x0E, 0xC8, 0x8D, 0xB8, 0x0F, 0x90, 0x28, 0x10, 0x0B, 0x98, + 0xE0, 0xC8, 0x08, 0xD4, 0x0D, 0x08, 0x0A, 0xC8, 0x8D, 0xB8, 0x0B, 0x99, + 0xA8, 0x40, 0x18, 0x19, 0xB8, 0x40, 0x18, 0x19, 0x0B, 0x90, 0xC1, 0xC0, + 0x8B, 0x90, 0xFF, 0x7F, 0x69, 0xDE, 0x0D, 0x04, 0xE3, 0xDE, 0x92, 0x90, + 0xFF, 0x7F, 0x64, 0xDE, 0xFC, 0xB3, 0x5F, 0xB1, 0xFA, 0xB6, 0xE8, 0xE4, + 0x94, 0x99, 0x00, 0xAF, 0xF9, 0xBF, 0x00, 0x40, 0xA9, 0xD6, 0xDF, 0xE4, + 0x84, 0x98, 0x08, 0xE4, 0x60, 0x40, 0x04, 0xB8, 0x83, 0x90, 0x82, 0x9F, + 0x81, 0x98, 0xB0, 0x40, 0x84, 0xB8, 0x80, 0x98, 0xBE, 0xE4, 0xA8, 0x40, + 0xB4, 0xB8, 0x2F, 0xE4, 0x0A, 0xC2, 0x92, 0xE4, 0x9E, 0xB8, 0x89, 0xE4, + 0xB8, 0x40, 0x84, 0xB8, 0x08, 0x1D, 0xF4, 0x7F, 0x80, 0xB8, 0x08, 0x1D, + 0x04, 0x40, 0x80, 0xB8, 0x08, 0x1D, 0x3D, 0xE4, 0x60, 0x40, 0x19, 0x08, + 0xE0, 0xC8, 0x20, 0xDB, 0x19, 0xE4, 0x0F, 0xE4, 0x1A, 0xC0, 0x0E, 0xB8, + 0x20, 0x40, 0x04, 0xB8, 0x09, 0xDE, 0x09, 0x08, 0xC1, 0xC8, 0x09, 0x18, + 0xC1, 0xC3, 0x91, 0xE4, 0x60, 0x40, 0x11, 0x08, 0x83, 0xBF, 0x10, 0xDB, + 0x00, 0x08, 0xC4, 0xC0, 0xAC, 0x40, 0x94, 0xB8, 0xE0, 0xC8, 0xF1, 0xD8, + 0x00, 0x99, 0x09, 0x08, 0xC1, 0xC8, 0x09, 0x18, 0xC1, 0xC3, 0x91, 0xE4, + 0x60, 0x40, 0x11, 0x08, 0x83, 0xBF, 0xF0, 0xD8, 0x0B, 0x08, 0xE0, 0xC8, + 0x4E, 0xD5, 0x01, 0x90, 0xFE, 0x7F, 0x20, 0x08, 0x20, 0x09, 0x89, 0xBA, + 0x0C, 0x40, 0x0B, 0x18, 0xB7, 0x7F, 0x3B, 0x09, 0x89, 0xE4, 0xC1, 0xC8, + 0x10, 0x40, 0x0B, 0x18, 0x00, 0xA8, 0x85, 0x98, 0x38, 0xE4, 0x99, 0xB8, + 0x36, 0xD7, 0x04, 0x99, 0xA2, 0xE4, 0xAE, 0xB8, 0x02, 0x96, 0x0A, 0xC6, + 0x6E, 0xB8, 0x46, 0xE4, 0xBC, 0x40, 0x44, 0xB8, 0x60, 0x40, 0x09, 0x08, + 0x00, 0xA9, 0x83, 0xBF, 0x07, 0xDB, 0x8F, 0xE4, 0x12, 0xC8, 0x83, 0xB8, + 0x0A, 0xC8, 0x8E, 0xB8, 0x1C, 0x40, 0x18, 0x09, 0x04, 0x1D, 0x1D, 0xE4, + 0x03, 0x90, 0x00, 0x08, 0xE0, 0xC8, 0x13, 0xDB, 0x0C, 0x40, 0x0B, 0x00, + 0x09, 0xB8, 0xC6, 0xE4, 0xBC, 0x40, 0xC4, 0xB8, 0xB8, 0x7F, 0x0B, 0x02, + 0x9F, 0xE4, 0x1A, 0xC9, 0x9E, 0xB8, 0x20, 0x40, 0x19, 0x08, 0x80, 0xBF, + 0x51, 0xD5, 0xC1, 0xC1, 0xC4, 0xC9, 0x21, 0xBF, 0xF8, 0xD8, 0xC1, 0xC3, + 0xC4, 0xC4, 0xC4, 0xC6, 0x9A, 0xE4, 0x60, 0x40, 0x0A, 0x08, 0x83, 0xBF, + 0xD3, 0xDA, 0xB8, 0x7F, 0x0B, 0x08, 0x05, 0x99, 0x89, 0xBF, 0x01, 0xD5, + 0x0B, 0x1D, 0xC1, 0xCF, 0x00, 0x90, 0xC4, 0xC0, 0x80, 0x90, 0x01, 0x98, + 0x02, 0x40, 0x80, 0xB8, 0x81, 0x98, 0x02, 0x99, 0x01, 0x40, 0x91, 0xB8, + 0x82, 0x99, 0x03, 0x90, 0xC4, 0xC0, 0x83, 0x90, 0x04, 0x98, 0xC4, 0xC8, + 0x84, 0x98, 0xC4, 0xCB, 0x14, 0x99, 0xF9, 0xBF, 0xFF, 0x7F, 0x65, 0xD7, + 0x0A, 0xCF, 0x9F, 0xE4, 0x9E, 0xB8, 0xB8, 0x40, 0x1E, 0x08, 0xB8, 0x40, + 0x19, 0x18, 0xAC, 0x40, 0x1E, 0x08, 0xAC, 0x40, 0x19, 0x18, 0xB0, 0x40, + 0x1E, 0x08, 0xB0, 0x40, 0x19, 0x18, 0x00, 0xA8, 0xA8, 0x40, 0x19, 0x18, + 0x28, 0xE4, 0x0E, 0xE4, 0x20, 0x40, 0x04, 0xB8, 0x9F, 0xE4, 0x12, 0xC9, + 0x9E, 0xB8, 0x0F, 0xA1, 0x00, 0x08, 0xC4, 0xC0, 0x20, 0x40, 0x19, 0x18, + 0x68, 0x40, 0x19, 0x12, 0xDF, 0xC1, 0xC4, 0xC9, 0xE0, 0xC1, 0xF6, 0xDA, + 0x06, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0xA0, 0xE0, 0x00, 0xA0, 0x68, 0x40, + 0x19, 0x08, 0xE0, 0xC8, 0x01, 0xD5, 0x01, 0xA0, 0x0C, 0x10, 0x05, 0x98, + 0xC1, 0xC8, 0x85, 0x98, 0xA8, 0xDE, 0x01, 0xB1, 0x00, 0xA9, 0x0F, 0xA0, + 0xA8, 0x40, 0x18, 0x19, 0xAC, 0x40, 0x18, 0x19, 0xB0, 0x40, 0x18, 0x19, + 0x60, 0x40, 0x18, 0x19, 0xB8, 0x40, 0x18, 0x19, 0xDF, 0xC0, 0xC4, 0xC8, + 0xE0, 0xC0, 0xF2, 0xDA, 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0xFC, 0xB3, + 0x5F, 0xB1, 0xF9, 0xB6, 0xE8, 0xE4, 0x01, 0xA8, 0x86, 0x98, 0x80, 0x41, + 0x0E, 0x00, 0x85, 0x90, 0x00, 0xAB, 0x04, 0x40, 0x0E, 0x06, 0xE0, 0xC6, + 0x0D, 0xDB, 0x0E, 0xE4, 0x17, 0x40, 0x0C, 0xB8, 0x00, 0x01, 0x02, 0x40, + 0x00, 0xB8, 0x18, 0xBF, 0x02, 0xD9, 0x81, 0xE4, 0xC1, 0xC8, 0xC1, 0xCB, + 0x6B, 0xBF, 0xF6, 0xD8, 0x04, 0x40, 0x1E, 0x18, 0x00, 0xA0, 0x01, 0xA1, + 0x8E, 0xE4, 0x07, 0xAB, 0x74, 0x41, 0x38, 0x10, 0x76, 0x41, 0x38, 0x11, + 0x78, 0x41, 0x38, 0x10, 0xDF, 0xCB, 0xC4, 0xC8, 0xE0, 0xCB, 0xF6, 0xDA, + 0xE0, 0xC9, 0x00, 0x40, 0xB2, 0xD5, 0xB0, 0xE4, 0x06, 0xBF, 0x1F, 0xD6, + 0xFE, 0x03, 0x2E, 0xE4, 0x17, 0x40, 0x2C, 0xB8, 0x05, 0x91, 0x60, 0x40, + 0x14, 0xB8, 0x01, 0x00, 0xC4, 0xC1, 0xC1, 0xC0, 0xE0, 0xC3, 0x01, 0xD5, + 0xC1, 0xC0, 0x02, 0x09, 0x0A, 0xC9, 0x9E, 0xB8, 0x76, 0x41, 0x9C, 0xB8, + 0x09, 0x08, 0x80, 0xBF, 0x01, 0xDA, 0x09, 0x10, 0x06, 0x98, 0x08, 0xBF, + 0x01, 0xDB, 0x86, 0x90, 0xC1, 0xCB, 0x02, 0x40, 0x20, 0xB8, 0xB6, 0xBF, + 0xE8, 0xD7, 0x06, 0x98, 0x08, 0x40, 0x1E, 0x18, 0x00, 0xAB, 0xE0, 0xC6, + 0x46, 0xDB, 0x00, 0xAA, 0x4A, 0xE4, 0x2B, 0xE4, 0x16, 0xC2, 0x2E, 0xB8, + 0x16, 0x40, 0x28, 0xB8, 0x1A, 0xE4, 0xE0, 0xC6, 0x0D, 0xDB, 0x12, 0x00, + 0x9E, 0xE4, 0x16, 0x40, 0x9C, 0xB8, 0x09, 0x08, 0x02, 0x40, 0x90, 0xB8, + 0x80, 0xBF, 0x01, 0xD8, 0x41, 0xE4, 0xC1, 0xC1, 0x61, 0xBF, 0xF7, 0xD8, + 0x00, 0xA1, 0x14, 0xBF, 0x00, 0x40, 0x6D, 0xDA, 0x52, 0x03, 0x0E, 0xE4, + 0x16, 0x40, 0x08, 0xB8, 0x50, 0x08, 0x83, 0xBF, 0x05, 0xD8, 0x10, 0x09, + 0x12, 0x08, 0x98, 0xBF, 0x01, 0xDB, 0xC1, 0xCA, 0xC1, 0xC1, 0x02, 0x40, + 0x00, 0xB8, 0x14, 0xBF, 0xF3, 0xD9, 0x93, 0xE4, 0x0A, 0xC9, 0x9E, 0xB8, + 0x74, 0x41, 0x9C, 0xB8, 0x09, 0x08, 0x8A, 0xBF, 0x02, 0xDA, 0x09, 0x1A, + 0x52, 0x03, 0x1B, 0xE4, 0xC1, 0xC1, 0x12, 0x00, 0x01, 0xBA, 0x93, 0xE4, + 0x0A, 0xC9, 0x9E, 0xB8, 0x78, 0x41, 0x9C, 0xB8, 0x09, 0x08, 0x80, 0xBF, + 0x01, 0xDA, 0x09, 0x10, 0xB1, 0xE4, 0x61, 0xBF, 0xBA, 0xD8, 0x00, 0xAB, + 0x6E, 0xE4, 0x74, 0x41, 0x6C, 0xB8, 0x4E, 0xE4, 0x76, 0x41, 0x4C, 0xB8, + 0x3E, 0xE4, 0x78, 0x41, 0x3C, 0xB8, 0x2B, 0xE4, 0x0A, 0xC2, 0x92, 0xE4, + 0x96, 0xB8, 0x19, 0xE4, 0xC4, 0xC1, 0x01, 0x08, 0x09, 0x00, 0x80, 0xBF, + 0x02, 0xDA, 0x01, 0x10, 0x09, 0x00, 0x92, 0xE4, 0x94, 0xB8, 0x09, 0x01, + 0x81, 0xE4, 0xDF, 0xC8, 0x08, 0xBF, 0x03, 0xDB, 0x10, 0xE4, 0xC1, 0xC1, + 0x09, 0x11, 0xC4, 0xC9, 0x09, 0x08, 0x81, 0xBF, 0x01, 0xDA, 0x09, 0x11, + 0x82, 0xE4, 0x83, 0xB8, 0x08, 0x09, 0x18, 0x19, 0xC1, 0xCB, 0xE6, 0xCB, + 0xDE, 0xDB, 0x78, 0x41, 0x2E, 0x08, 0xDF, 0xC8, 0x76, 0x41, 0x2E, 0x09, + 0x98, 0xBF, 0x03, 0xDB, 0xC1, 0xC9, 0x78, 0x41, 0x2E, 0x19, 0x2E, 0x00, + 0x3E, 0x0E, 0x0E, 0xE6, 0x09, 0x40, 0x06, 0xA8, 0x90, 0xE4, 0x00, 0x40, + 0x74, 0xDF, 0x07, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x52, 0x03, + 0xA2, 0xDE, 0xB9, 0xE4, 0x96, 0xBF, 0xFF, 0x7F, 0x6C, 0xD6, 0x05, 0x90, + 0x60, 0x40, 0x04, 0xB8, 0x84, 0x90, 0x05, 0x98, 0x20, 0x40, 0x84, 0xB8, + 0x83, 0x98, 0xFE, 0xE4, 0x16, 0x40, 0xF8, 0xB8, 0x96, 0xE4, 0xDF, 0xC9, + 0xE0, 0xCB, 0x02, 0xD5, 0x9B, 0xE4, 0xDF, 0xC9, 0x89, 0xE4, 0x16, 0xC8, + 0x8E, 0xB8, 0x1F, 0x06, 0x16, 0x40, 0x38, 0x0C, 0xE0, 0xCB, 0x01, 0xD4, + 0xC6, 0xBA, 0x09, 0xE4, 0x1A, 0xC0, 0x05, 0x98, 0x08, 0xB8, 0x20, 0x40, + 0x04, 0xB8, 0x0A, 0xC9, 0x98, 0xB8, 0x60, 0x40, 0x19, 0x0A, 0xC1, 0xCA, + 0x04, 0x98, 0x08, 0x04, 0x00, 0xAD, 0x8A, 0xE4, 0x0A, 0xC8, 0x80, 0xB8, + 0xDC, 0xC8, 0x08, 0x1D, 0x1D, 0xE4, 0xDA, 0xBF, 0x16, 0xDA, 0x30, 0xE4, + 0x03, 0x00, 0xC4, 0xC3, 0x0C, 0xB8, 0x60, 0xBF, 0x0D, 0xDA, 0x00, 0xA2, + 0x24, 0xBF, 0x09, 0xDA, 0x03, 0x99, 0x09, 0x08, 0xC4, 0xC9, 0x86, 0xB8, + 0x80, 0xBF, 0x04, 0xD5, 0xC1, 0xC2, 0x24, 0xBF, 0xF8, 0xD9, 0xC1, 0xCD, + 0xC1, 0xC1, 0x1A, 0xBF, 0xEB, 0xD9, 0xC1, 0xC4, 0xFE, 0x08, 0xE0, 0xC8, + 0x01, 0xD5, 0xC1, 0xC4, 0x04, 0xE4, 0x0D, 0xB8, 0x5F, 0x09, 0x0A, 0xC9, + 0x9E, 0xB8, 0x76, 0x41, 0x9C, 0xB8, 0x09, 0x08, 0x08, 0xBF, 0x01, 0xDB, + 0x09, 0x10, 0x06, 0x90, 0x40, 0xBF, 0x01, 0xDB, 0x86, 0x94, 0xC1, 0xCB, + 0x02, 0x40, 0xF0, 0xB8, 0x03, 0x98, 0x04, 0x40, 0x80, 0xB8, 0x83, 0x98, + 0x04, 0x90, 0xC4, 0xC0, 0x84, 0x90, 0x04, 0x40, 0x0E, 0x06, 0xB6, 0xBF, + 0xA3, 0xD7, 0xFF, 0x7F, 0x02, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, + 0x08, 0xE4, 0x19, 0xE4, 0x40, 0xE0, 0x80, 0xE4, 0x1E, 0xA9, 0x1E, 0x40, + 0x24, 0xDF, 0x28, 0xE4, 0x42, 0xE0, 0x80, 0xE4, 0x1E, 0xA9, 0x1E, 0x40, + 0xBC, 0xDF, 0x48, 0xE0, 0x03, 0xA9, 0x1E, 0x40, 0x1A, 0xDF, 0x48, 0xE0, + 0xE6, 0xC2, 0x1F, 0xD8, 0xE2, 0xC8, 0x1D, 0xD8, 0x00, 0x40, 0x23, 0xE6, + 0x28, 0xB8, 0x0A, 0xC2, 0x00, 0x40, 0x66, 0x63, 0x2C, 0xB8, 0x02, 0x00, + 0x80, 0xE4, 0x09, 0xC8, 0x10, 0xA9, 0x81, 0xBF, 0x11, 0xD6, 0x80, 0xE4, + 0x05, 0xC8, 0x0C, 0xA9, 0x81, 0xBF, 0x0C, 0xD6, 0x00, 0x40, 0x03, 0xE6, + 0x09, 0xC0, 0x08, 0xA9, 0x01, 0xBF, 0x06, 0xD6, 0x06, 0xA9, 0x89, 0xE4, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x00, 0xA9, 0x89, 0xE4, 0x03, 0xB6, + 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xFB, 0xB6, + 0xB8, 0xE4, 0x11, 0x91, 0x12, 0x96, 0x00, 0xA8, 0x01, 0x38, 0x11, 0x38, + 0x00, 0xA8, 0x91, 0x38, 0xA1, 0x38, 0xE0, 0xC9, 0x56, 0xD5, 0x06, 0xE4, + 0x0A, 0xC0, 0x80, 0xE4, 0x8B, 0xB8, 0xA8, 0x40, 0x18, 0x08, 0xE0, 0xC8, + 0x46, 0xD4, 0x80, 0xE4, 0x8B, 0xB8, 0xB0, 0x40, 0x18, 0x09, 0x01, 0x39, + 0xAC, 0x40, 0x18, 0x08, 0x11, 0x38, 0x00, 0xA2, 0x89, 0xE4, 0x08, 0xE0, + 0xE0, 0xC8, 0x44, 0xDB, 0xA9, 0xE4, 0x38, 0xE4, 0x01, 0xE4, 0xC6, 0xC0, + 0x96, 0xE4, 0x1A, 0xC9, 0x9B, 0xB8, 0x20, 0x40, 0x19, 0x08, 0x80, 0x38, + 0xC2, 0xC0, 0x68, 0x40, 0x19, 0x08, 0x8A, 0xC8, 0x91, 0x24, 0x84, 0xBD, + 0x91, 0x38, 0xC1, 0xC2, 0xC4, 0xC9, 0x32, 0xBF, 0xF2, 0xD8, 0x00, 0xA4, + 0x3A, 0xE4, 0x03, 0xE0, 0x11, 0x28, 0x38, 0xB8, 0x32, 0xBF, 0x18, 0xDB, + 0x96, 0xE4, 0x12, 0xC9, 0xA1, 0x26, 0x01, 0xE4, 0x02, 0x40, 0x06, 0xB8, + 0x92, 0xB8, 0x0A, 0xC9, 0x9B, 0xB8, 0x20, 0x40, 0x19, 0x08, 0x80, 0x38, + 0xC2, 0xC0, 0x68, 0x40, 0x19, 0x08, 0x92, 0xC8, 0x86, 0xBD, 0x68, 0xE4, + 0xC1, 0xC2, 0xC4, 0xC9, 0xC1, 0xC4, 0x32, 0xBF, 0xF2, 0xD8, 0xA1, 0x38, + 0x01, 0xA8, 0x05, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x83, 0x91, + 0x84, 0x96, 0x8B, 0xE4, 0x09, 0xDF, 0x05, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, + 0x40, 0xB4, 0x06, 0xE4, 0x0A, 0xC0, 0xAF, 0xDE, 0x01, 0x2A, 0xCF, 0xDE, + 0xFC, 0xB3, 0x5F, 0xB1, 0xE0, 0xB6, 0x18, 0xE4, 0xE9, 0xE4, 0x2F, 0x9A, + 0x30, 0x90, 0x80, 0xE4, 0x0A, 0xC8, 0x81, 0xB8, 0xB4, 0x40, 0x18, 0x06, + 0x09, 0x2B, 0x19, 0x2C, 0xDC, 0xE4, 0xDB, 0xB8, 0x00, 0xA4, 0x4D, 0xBF, + 0x21, 0xD8, 0x20, 0xE4, 0x01, 0x40, 0x21, 0xE6, 0x40, 0x40, 0xDB, 0xE1, + 0xD3, 0xE1, 0x0A, 0xC2, 0x21, 0xB8, 0xBC, 0x40, 0x24, 0xB8, 0x09, 0xDE, + 0x01, 0x19, 0x83, 0xB8, 0xE1, 0xC0, 0x01, 0xD5, 0x04, 0xC0, 0x08, 0x10, + 0xC1, 0xC4, 0x4D, 0xBF, 0x0B, 0xD8, 0x02, 0x00, 0xC4, 0xC2, 0x84, 0xE4, + 0x0A, 0xC8, 0x18, 0xE4, 0x1B, 0xB8, 0x00, 0xA9, 0xE1, 0xC0, 0xEE, 0xD4, + 0x90, 0xE4, 0xEC, 0xDE, 0x0E, 0x2B, 0x1E, 0x2C, 0x00, 0xA4, 0x1C, 0xE4, + 0x01, 0xE0, 0xDF, 0xC1, 0xE0, 0xC1, 0x2F, 0xD9, 0x21, 0xE4, 0x06, 0xC2, + 0x2E, 0xB8, 0x02, 0x40, 0x26, 0xB8, 0x3A, 0xE4, 0xC6, 0xC3, 0x9B, 0xE4, + 0x09, 0xE0, 0x91, 0xB8, 0x0A, 0xC9, 0x04, 0xDE, 0xDF, 0xC1, 0xDC, 0xC9, + 0xE0, 0xC1, 0x1F, 0xD9, 0x82, 0x28, 0xDE, 0xC2, 0x08, 0xE4, 0x06, 0xB8, + 0xE0, 0xC0, 0xF6, 0xDA, 0x00, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, 0x89, 0xB8, + 0x08, 0x08, 0xE0, 0xC8, 0xEF, 0xD5, 0x08, 0x40, 0x00, 0xA8, 0xD7, 0xE1, + 0x87, 0xB8, 0x89, 0xB8, 0xFC, 0x7F, 0x08, 0x08, 0x92, 0xC8, 0x9A, 0x2F, + 0x8F, 0xBD, 0x9A, 0x38, 0x83, 0x30, 0xC1, 0xC4, 0xC2, 0xC3, 0xDF, 0xC1, + 0xDC, 0xC9, 0xE0, 0xC1, 0xE1, 0xDA, 0xE0, 0xC6, 0x00, 0x40, 0xB3, 0xD9, + 0x00, 0xA1, 0x8B, 0xE4, 0x08, 0xE0, 0xE0, 0xC8, 0x2C, 0xDB, 0xDF, 0xE1, + 0x2E, 0xE4, 0xC6, 0xC2, 0x94, 0xE4, 0x06, 0xC9, 0x9A, 0xB8, 0xC6, 0xC9, + 0x05, 0xDE, 0xC1, 0xC1, 0x8B, 0xE4, 0x08, 0xE0, 0x81, 0xBF, 0x1F, 0xDB, + 0x82, 0x28, 0xC2, 0xC2, 0x08, 0xE4, 0x06, 0xB8, 0xE0, 0xC0, 0xF5, 0xDA, + 0x31, 0xE4, 0x0A, 0xC3, 0x83, 0xE4, 0x8F, 0xB8, 0x08, 0x08, 0xE0, 0xC8, + 0xEE, 0xD5, 0x83, 0xE4, 0x40, 0xA3, 0xD7, 0xE1, 0x37, 0xB8, 0x83, 0xB8, + 0x08, 0x08, 0x92, 0xC8, 0x9A, 0x23, 0x83, 0xBD, 0x9A, 0x38, 0x89, 0x30, + 0xC1, 0xC4, 0xC2, 0xC9, 0xC1, 0xC1, 0x8B, 0xE4, 0x08, 0xE0, 0x81, 0xBF, + 0xE1, 0xD8, 0x0A, 0x34, 0x00, 0xA4, 0x0E, 0x2B, 0x1B, 0xE4, 0xDF, 0xC1, + 0xE0, 0xC1, 0x25, 0xD9, 0xDF, 0xE1, 0x21, 0xE4, 0x06, 0xC2, 0x2E, 0xB8, + 0xC6, 0xC2, 0x3A, 0xE4, 0x02, 0x40, 0x36, 0xB8, 0x82, 0x28, 0xDE, 0xC2, + 0x08, 0xE4, 0x06, 0xB8, 0xE0, 0xC0, 0x14, 0xDB, 0x91, 0xE4, 0x0A, 0xC9, + 0x89, 0xE4, 0x8F, 0xB8, 0x08, 0x08, 0xE0, 0xC8, 0x0D, 0xD5, 0x89, 0xE4, + 0x40, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0x89, 0xB8, 0x08, 0x08, 0x92, 0xC8, + 0xAA, 0x29, 0x89, 0xBD, 0xAA, 0x38, 0x83, 0x30, 0xC1, 0xC4, 0xC2, 0xC3, + 0xDF, 0xC1, 0xE0, 0xC1, 0xE3, 0xDA, 0xE0, 0xC6, 0x1D, 0xDB, 0x0D, 0xE4, + 0x0A, 0xC0, 0x08, 0x40, 0x00, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, 0x80, 0xB8, + 0xF8, 0x7F, 0x08, 0x08, 0xE0, 0xC8, 0x12, 0xD5, 0x80, 0xE4, 0x08, 0x40, + 0x00, 0xAF, 0xD7, 0xE1, 0xF7, 0xB8, 0x8F, 0xB8, 0xFC, 0x7F, 0x08, 0x08, + 0x92, 0xC8, 0xAA, 0x23, 0x83, 0xBD, 0xAA, 0x38, 0x84, 0xE4, 0x06, 0xC8, + 0x8A, 0xB8, 0x02, 0x40, 0xB8, 0x36, 0xC1, 0xC4, 0x00, 0xA1, 0x8C, 0xE4, + 0x08, 0xE0, 0xE0, 0xC8, 0x2C, 0xDB, 0xDD, 0xE1, 0x2E, 0xE4, 0x02, 0x40, + 0x26, 0xB8, 0x34, 0xE4, 0x06, 0xC3, 0x3A, 0xB8, 0x02, 0x40, 0x36, 0xB8, + 0x82, 0x28, 0xC2, 0xC2, 0x08, 0xE4, 0x06, 0xB8, 0xE0, 0xC0, 0x18, 0xDB, + 0x9B, 0xE4, 0x09, 0xE0, 0x91, 0xB8, 0x0A, 0xC9, 0x89, 0xE4, 0x8D, 0xB8, + 0x08, 0x08, 0xE0, 0xC8, 0x0F, 0xD5, 0x89, 0xE4, 0x08, 0x40, 0x00, 0xA9, + 0xD7, 0xE1, 0x97, 0xB8, 0x89, 0xB8, 0xFC, 0x7F, 0x08, 0x08, 0x92, 0xC8, + 0xAA, 0x2F, 0x8F, 0xBD, 0xAA, 0x38, 0x83, 0x30, 0xC1, 0xC4, 0xC2, 0xC3, + 0xC1, 0xC1, 0x8C, 0xE4, 0x08, 0xE0, 0x81, 0xBF, 0xDD, 0xD8, 0x1A, 0x34, + 0x01, 0xA8, 0x20, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0xA0, 0xE0, 0x9D, 0xE4, + 0x0A, 0xC9, 0x08, 0x40, 0x00, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, 0x89, 0xB8, + 0xF8, 0x7F, 0x08, 0x08, 0xE0, 0xC8, 0xFF, 0x7F, 0x41, 0xD5, 0x89, 0xE4, + 0x08, 0x40, 0x00, 0xA3, 0xD7, 0xE1, 0x37, 0xB8, 0x83, 0xB8, 0xFC, 0x7F, + 0x08, 0x08, 0x92, 0xC8, 0x9A, 0x29, 0x89, 0xBD, 0x9A, 0x38, 0x84, 0xE4, + 0x06, 0xC8, 0x8A, 0xB8, 0xB8, 0x36, 0xC1, 0xC4, 0xFF, 0x7F, 0x2E, 0xDE, + 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x28, 0xE4, 0x2C, 0x40, + 0x20, 0xB8, 0xA5, 0x44, 0x08, 0x01, 0xEF, 0x7F, 0x04, 0xDF, 0x38, 0xE4, + 0xF2, 0x08, 0xE0, 0xC8, 0x0B, 0xD5, 0x11, 0x08, 0xDF, 0xC8, 0xE1, 0xC8, + 0x1E, 0xDC, 0xB4, 0x41, 0x10, 0x08, 0xFF, 0xC8, 0x03, 0xD5, 0xFF, 0xA8, + 0x88, 0x41, 0x12, 0x18, 0x01, 0x40, 0x33, 0xBF, 0x1B, 0xD5, 0x80, 0xE4, + 0xF6, 0x7F, 0x08, 0xDF, 0x80, 0xE4, 0xF6, 0x7F, 0xFB, 0xDF, 0x80, 0xE4, + 0xF7, 0x7F, 0x64, 0xDF, 0xF2, 0x08, 0xE0, 0xC8, 0x04, 0xD5, 0x0A, 0x40, + 0x11, 0x08, 0xE1, 0xC8, 0x1A, 0xD5, 0xE1, 0x13, 0x03, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x05, 0x40, 0x11, 0x08, 0xE0, 0xC8, 0xDE, 0xD4, 0x01, 0x40, + 0x33, 0xBF, 0xE5, 0xD4, 0x80, 0xE4, 0xF7, 0x7F, 0x2C, 0xDF, 0x00, 0xA8, + 0xA7, 0x41, 0x00, 0x18, 0x04, 0x40, 0x01, 0x18, 0x04, 0x40, 0x21, 0x18, + 0x04, 0x40, 0x11, 0x18, 0x04, 0x40, 0x31, 0x18, 0xDF, 0xDE, 0x51, 0x08, + 0x88, 0x41, 0x12, 0x18, 0xE1, 0x13, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0x1C, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0xC8, 0xE4, 0x48, 0xE4, + 0x2C, 0x40, 0x40, 0xB8, 0xA5, 0x44, 0x08, 0x08, 0x04, 0x40, 0x04, 0x06, + 0x80, 0x41, 0x04, 0x02, 0xC4, 0xC2, 0x58, 0x0A, 0x18, 0x08, 0xE1, 0xC8, + 0x48, 0xD5, 0x00, 0xA9, 0xE2, 0xC8, 0x2C, 0xD5, 0x16, 0xE4, 0x74, 0x41, + 0x24, 0x0B, 0x8B, 0xE4, 0x86, 0xB8, 0x86, 0xBF, 0x2A, 0xDB, 0x05, 0x40, + 0x04, 0x03, 0x06, 0xE4, 0x16, 0xC0, 0x02, 0xB8, 0xC4, 0xC0, 0x12, 0xDE, + 0x8A, 0xE4, 0x93, 0xE4, 0x1C, 0x40, 0xBF, 0xDF, 0x98, 0xE4, 0xE0, 0xC8, + 0x01, 0xD4, 0x93, 0xE4, 0x00, 0x08, 0x89, 0xBF, 0x12, 0xD5, 0xC1, 0xC1, + 0x02, 0x40, 0x00, 0xB8, 0x8B, 0xE4, 0x86, 0xB8, 0x81, 0xBF, 0x11, 0xDB, + 0xE0, 0xC3, 0x04, 0xDB, 0x04, 0x40, 0x34, 0x08, 0xE0, 0xC8, 0xE8, 0xD4, + 0xA6, 0xBF, 0xF1, 0xD8, 0x00, 0x08, 0x8A, 0xBF, 0xEE, 0xD4, 0x91, 0xE4, + 0x89, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0xAD, 0x44, + 0x3C, 0x08, 0xE0, 0xC8, 0x06, 0xD5, 0xB0, 0x44, 0x1C, 0x08, 0xDF, 0xC8, + 0x9B, 0xE4, 0xE1, 0xC8, 0xF1, 0xDD, 0x00, 0xA8, 0x5C, 0x09, 0xCB, 0x7F, + 0xF1, 0xDF, 0x98, 0xE4, 0x89, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0x1C, 0xB2, + 0x40, 0xB4, 0x74, 0x41, 0x24, 0x09, 0x96, 0xB8, 0x89, 0xE4, 0x03, 0xB6, + 0x5F, 0xB0, 0x1C, 0xB2, 0x40, 0xB4, 0xA0, 0xE0, 0x20, 0xB5, 0xFD, 0xB6, + 0x0A, 0x40, 0xB0, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, + 0x0B, 0x40, 0x45, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, + 0x0A, 0x40, 0xC7, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, + 0x0D, 0x40, 0x65, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, + 0x0D, 0x40, 0x7E, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, + 0x0D, 0x40, 0x97, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, + 0x0E, 0x40, 0x43, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, + 0x0F, 0x40, 0x17, 0xDF, 0x08, 0xE0, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, + 0xFD, 0xB6, 0x0F, 0x40, 0x8E, 0xDF, 0x08, 0xE0, 0x03, 0xB6, 0x40, 0xB4, + 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x89, 0xE4, 0x90, 0xE4, + 0xF2, 0xDF, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x01, 0xB1, 0x08, 0xE4, + 0x89, 0xE4, 0x90, 0xBF, 0x01, 0xDB, 0x80, 0xE4, 0x01, 0xB0, 0xA0, 0xE0, + 0x01, 0xB1, 0x08, 0xE4, 0x89, 0xE4, 0x90, 0xBF, 0x01, 0xDA, 0x80, 0xE4, + 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x09, 0xE4, 0x04, 0x99, 0x98, 0xBF, + 0x04, 0xD9, 0x80, 0xE4, 0x90, 0xBF, 0x01, 0xD8, 0x89, 0xE4, 0x01, 0xB0, + 0xA0, 0xE0, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x19, 0xE4, + 0xCE, 0xDF, 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xE4, 0x80, 0xE4, 0x03, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, + 0x19, 0xE4, 0xC8, 0xDF, 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xE4, 0x80, 0xE4, + 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, + 0x08, 0xE4, 0x29, 0xE4, 0x0A, 0x91, 0x81, 0xE4, 0x90, 0xE4, 0xB1, 0xDF, + 0xE0, 0xC8, 0x04, 0xD5, 0x80, 0xE4, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, + 0x81, 0xE4, 0x92, 0xE4, 0xAF, 0xDF, 0x02, 0xE4, 0xE0, 0xC8, 0xF6, 0xD4, + 0x01, 0xE4, 0x80, 0xE4, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x01, 0xB1, 0xFD, 0xB6, 0x09, 0xE4, 0x40, 0xC8, 0x08, 0x7C, 0x87, 0xB8, + 0xFF, 0x7F, 0x66, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0x81, 0xDF, 0xFF, 0x7F, + 0x67, 0xDF, 0xF7, 0x43, 0x89, 0xB8, 0x42, 0xC8, 0x03, 0xB6, 0x01, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x40, 0xC8, 0x08, 0x7C, + 0x87, 0xB8, 0xFF, 0x7F, 0x53, 0xDF, 0x08, 0xE4, 0x0B, 0x40, 0x08, 0xA8, + 0xFF, 0x7F, 0x4E, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFF, 0x7F, 0x6E, 0xDF, + 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, + 0xFC, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0x0F, 0x9A, 0x10, 0x93, 0x11, 0x94, + 0x12, 0x96, 0xE0, 0xCA, 0x02, 0xD5, 0xA9, 0xBF, 0x2F, 0xD9, 0x23, 0xBF, + 0x21, 0xDB, 0x00, 0xA9, 0x9A, 0xBA, 0x9A, 0xBD, 0x7D, 0xC9, 0x01, 0xA8, + 0x89, 0xBA, 0x01, 0x18, 0x01, 0xD5, 0xA2, 0xE4, 0x8A, 0xE4, 0x3E, 0x40, + 0x08, 0xA9, 0x1B, 0x40, 0x04, 0xDF, 0x08, 0xE4, 0x04, 0xE6, 0x11, 0x10, + 0x82, 0xE4, 0x93, 0xE4, 0x1A, 0x40, 0xFD, 0xDF, 0x21, 0x18, 0x0D, 0xC0, + 0x06, 0xE6, 0x31, 0x10, 0x41, 0x10, 0x00, 0xA8, 0x51, 0x18, 0x61, 0x18, + 0x04, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x00, 0x40, 0x31, 0x63, + 0x0D, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x33, 0x63, 0x05, 0xA8, 0x0D, 0x40, + 0x0B, 0xA9, 0x22, 0x40, 0x8A, 0xDF, 0xD3, 0xDE, 0x00, 0x40, 0x36, 0x63, + 0x0E, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x33, 0x63, 0x05, 0xA8, 0x0D, 0x40, + 0x0A, 0xA9, 0x22, 0x40, 0x7E, 0xDF, 0xC5, 0xDE, 0x20, 0xB5, 0x07, 0xB1, + 0xFC, 0xB6, 0x28, 0xE4, 0x28, 0x01, 0x91, 0xBA, 0x48, 0x00, 0x09, 0xB8, + 0x48, 0x10, 0x08, 0x08, 0xE0, 0xC8, 0x0E, 0xD5, 0x83, 0x90, 0x00, 0x70, + 0x00, 0x40, 0x00, 0xA8, 0xFF, 0x4F, 0xFF, 0x7F, 0x0F, 0xA9, 0xFF, 0x7F, + 0x3B, 0xDF, 0x08, 0xE4, 0x42, 0x18, 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, + 0xE0, 0xC0, 0x11, 0xD9, 0x10, 0xB8, 0x12, 0x08, 0x18, 0xBF, 0x03, 0xDD, + 0x52, 0x08, 0xC1, 0xC8, 0x52, 0x18, 0x83, 0x90, 0x00, 0xA8, 0x12, 0x09, + 0xFF, 0x7F, 0x28, 0xDF, 0x08, 0xE4, 0x42, 0x18, 0x04, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0x62, 0x08, 0xC1, 0xC8, 0x62, 0x18, 0x83, 0x90, 0x00, 0xA8, + 0x12, 0x09, 0xF2, 0xDE, 0x20, 0xB5, 0x14, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, + 0x39, 0xE4, 0x0F, 0x90, 0x10, 0x96, 0x11, 0x99, 0x12, 0x9A, 0x00, 0xA2, + 0xE1, 0xC8, 0x27, 0xD5, 0x80, 0xE4, 0x00, 0x40, 0x86, 0xE6, 0x09, 0x18, + 0x12, 0xE4, 0x23, 0xBF, 0x07, 0xDA, 0x96, 0xE4, 0x09, 0x08, 0xC4, 0xC9, + 0x28, 0xB8, 0xC1, 0xC1, 0x13, 0xBF, 0xFA, 0xD9, 0x00, 0xA1, 0x13, 0xBF, + 0x17, 0xDA, 0x40, 0xE4, 0x43, 0xE6, 0x81, 0xE4, 0x0A, 0xC8, 0x08, 0xE4, + 0x0A, 0xB8, 0x86, 0xB8, 0xC4, 0xE4, 0x08, 0x09, 0xC9, 0xE6, 0x8C, 0xE4, + 0x92, 0xE4, 0x1A, 0x40, 0x7A, 0xDF, 0x00, 0x18, 0xC1, 0xC1, 0x13, 0xBF, + 0xF0, 0xD9, 0x03, 0xB6, 0x5F, 0xB0, 0x14, 0xB2, 0x40, 0xB4, 0x09, 0x10, + 0x03, 0xB6, 0x5F, 0xB0, 0x14, 0xB2, 0x40, 0xB4, 0x20, 0xB5, 0xFC, 0xB3, + 0x5F, 0xB1, 0xF3, 0xB6, 0x9B, 0x98, 0xD9, 0xE4, 0x1D, 0x92, 0x1E, 0x9F, + 0x1F, 0x93, 0x20, 0x9B, 0x21, 0x91, 0x23, 0x98, 0x1B, 0x99, 0xE1, 0xC9, + 0x00, 0x40, 0xCD, 0xD5, 0x06, 0xC8, 0x03, 0xA9, 0x1A, 0x40, 0x17, 0xDF, + 0xE8, 0xE4, 0xEF, 0xB8, 0x8F, 0xE4, 0xFE, 0x7F, 0x79, 0xDF, 0x08, 0xE4, + 0x82, 0xE4, 0xFE, 0x7F, 0x75, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFE, 0x7F, + 0x95, 0xDF, 0x08, 0xE4, 0x00, 0xA8, 0xFE, 0x7F, 0x6C, 0xDF, 0x98, 0xE4, + 0x2B, 0x08, 0xFE, 0x7F, 0x9A, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0xB7, 0xD4, + 0x2B, 0x0C, 0xA0, 0x4F, 0x00, 0x40, 0x00, 0xA8, 0xFE, 0x7F, 0x5F, 0xDF, + 0x08, 0xE4, 0x9C, 0xE4, 0xFE, 0x7F, 0xC6, 0xDF, 0xC8, 0xE4, 0x31, 0x09, + 0xFE, 0x7F, 0x76, 0xDF, 0x3B, 0x09, 0xFE, 0x7F, 0x79, 0xDF, 0x98, 0xE4, + 0x80, 0xE4, 0xFE, 0x7F, 0xBB, 0xDF, 0x01, 0x09, 0xFE, 0x7F, 0x72, 0xDF, + 0x08, 0xE4, 0xE0, 0x4F, 0x00, 0x40, 0x00, 0xA8, 0xFE, 0x7F, 0x47, 0xDF, + 0x11, 0x09, 0xFE, 0x7F, 0x69, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFE, 0x7F, + 0xD2, 0xDF, 0x84, 0x98, 0x1B, 0x99, 0xE0, 0xC9, 0x00, 0x40, 0x98, 0xD4, + 0x89, 0xE4, 0xFE, 0x7F, 0x38, 0xDF, 0x68, 0xE4, 0x00, 0xA2, 0x2D, 0xBF, + 0x4C, 0xDA, 0x14, 0x40, 0xDA, 0xE1, 0x09, 0xDE, 0x86, 0xE4, 0x0A, 0x09, + 0xFE, 0x7F, 0x40, 0xDF, 0x68, 0xE4, 0xC1, 0xC2, 0xC4, 0xCA, 0x2D, 0xBF, + 0x40, 0xDA, 0x03, 0x00, 0xC4, 0xC3, 0x12, 0xC0, 0x22, 0x98, 0x08, 0xB8, + 0x30, 0x08, 0x3B, 0x09, 0xFE, 0x7F, 0x44, 0xDF, 0x98, 0xE4, 0x8C, 0xE4, + 0xFE, 0x7F, 0x3A, 0xDF, 0x00, 0x09, 0xFE, 0x7F, 0x3D, 0xDF, 0x18, 0xE4, + 0xE0, 0x4F, 0x00, 0x40, 0x00, 0xA8, 0xFE, 0x7F, 0x12, 0xDF, 0x48, 0xE4, + 0x10, 0x09, 0xFE, 0x7F, 0x33, 0xDF, 0x98, 0xE4, 0x81, 0xE4, 0xFE, 0x7F, + 0x9C, 0xDF, 0x0A, 0x18, 0x0B, 0xBF, 0xD6, 0xD4, 0x1B, 0x99, 0xE0, 0xC9, + 0xD3, 0xD5, 0x8D, 0xE4, 0xFE, 0x7F, 0x02, 0xDF, 0x08, 0xE4, 0x1B, 0x98, + 0xFD, 0x7F, 0xFE, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFE, 0x7F, 0x1E, 0xDF, + 0x98, 0xE4, 0x84, 0xE4, 0xFE, 0x7F, 0x0E, 0xDF, 0x98, 0xE4, 0x0A, 0x08, + 0xFE, 0x7F, 0x10, 0xDF, 0x98, 0xE4, 0x86, 0xE4, 0xFE, 0x7F, 0x00, 0xDF, + 0x68, 0xE4, 0xC1, 0xC2, 0xC4, 0xCA, 0x2D, 0xBF, 0xC0, 0xD9, 0x8F, 0xE4, + 0x8D, 0xE6, 0xF8, 0xE4, 0xFD, 0x7F, 0xE4, 0xDF, 0x96, 0xE4, 0xFE, 0x7F, + 0x05, 0xDF, 0x18, 0xE4, 0x04, 0x98, 0x91, 0xE4, 0xFD, 0x7F, 0xFA, 0xDF, + 0xFD, 0x7F, 0xE0, 0xDF, 0x83, 0x98, 0x01, 0xA8, 0x9E, 0xE4, 0xFE, 0x7F, + 0x27, 0xDF, 0x24, 0x99, 0x09, 0x18, 0x00, 0xA2, 0x2D, 0xBF, 0x1D, 0xDA, + 0x14, 0x40, 0xD3, 0xE1, 0x02, 0xE4, 0x0A, 0xC0, 0x80, 0xE4, 0x83, 0xB8, + 0x08, 0x08, 0x91, 0xE4, 0xFD, 0x7F, 0xE4, 0xDF, 0xFD, 0x7F, 0xCA, 0xDF, + 0x83, 0x98, 0x01, 0xA8, 0x9E, 0xE4, 0xFE, 0x7F, 0x11, 0xDF, 0x25, 0x99, + 0x09, 0xB8, 0x00, 0x18, 0xC1, 0xC2, 0x2D, 0xBF, 0xEB, 0xD9, 0x0D, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x24, 0x98, 0x08, 0x1F, 0x0D, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x80, 0xE4, 0x1B, 0x09, 0xFE, 0x7F, + 0x3C, 0xDF, 0x98, 0xE4, 0x0B, 0x08, 0xFD, 0x7F, 0xC5, 0xDF, 0xC8, 0xE4, + 0xFF, 0x7F, 0x3F, 0xDE, 0x8D, 0xE4, 0xFD, 0x7F, 0xA1, 0xDF, 0x98, 0xE4, + 0x04, 0x98, 0xFD, 0x7F, 0xBB, 0xDF, 0x08, 0xE4, 0x1B, 0x98, 0xFD, 0x7F, + 0x99, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFD, 0x7F, 0xB9, 0xDF, 0xFF, 0x7F, + 0x5A, 0xDE, 0x20, 0xB5, 0x7C, 0xB3, 0x5F, 0xB1, 0xF3, 0xB6, 0x38, 0xE4, + 0xC9, 0xE4, 0x1C, 0x9D, 0x1D, 0x9E, 0xDF, 0xC8, 0xE7, 0xC8, 0x00, 0x40, + 0x86, 0xDC, 0x00, 0xA6, 0x63, 0xBF, 0x08, 0xDA, 0x02, 0xA9, 0x14, 0x40, + 0xD8, 0xE1, 0x08, 0x19, 0xC4, 0xC8, 0xC1, 0xC6, 0x63, 0xBF, 0xFB, 0xD9, + 0x00, 0xA6, 0x63, 0xBF, 0x34, 0xDA, 0x10, 0x40, 0xDB, 0xE1, 0x4C, 0xE4, + 0x96, 0xE4, 0x16, 0xC9, 0x04, 0x08, 0x02, 0xAA, 0xE0, 0xC8, 0x03, 0xD5, + 0x00, 0xAA, 0xE1, 0xC8, 0x42, 0xD5, 0x00, 0xA2, 0x2A, 0xBF, 0x20, 0xDA, + 0x19, 0xE4, 0x1C, 0xB8, 0x01, 0x40, 0x18, 0xB8, 0x09, 0xDE, 0x90, 0xE4, + 0x0A, 0xC9, 0x9B, 0xB8, 0x09, 0x08, 0xC1, 0xC8, 0x09, 0x18, 0xC1, 0xC2, + 0x2A, 0xBF, 0x12, 0xDA, 0x01, 0x00, 0xC4, 0xC1, 0x03, 0xBF, 0x21, 0xD8, + 0xE0, 0xC0, 0x18, 0xDB, 0x04, 0x08, 0xE0, 0xC8, 0xEE, 0xD5, 0x90, 0xE4, + 0x0A, 0xC9, 0x9B, 0xB8, 0x09, 0x08, 0xC2, 0xC8, 0x09, 0x18, 0xC1, 0xC2, + 0x2A, 0xBF, 0xEE, 0xD9, 0xC1, 0xC6, 0x02, 0x40, 0x40, 0xB8, 0x63, 0xBF, + 0xCF, 0xD9, 0x00, 0xA6, 0x63, 0xBF, 0x19, 0xD9, 0x0D, 0xB6, 0x5F, 0xB0, + 0x7C, 0xB2, 0x40, 0xB4, 0x03, 0xB8, 0xE0, 0xC0, 0xE5, 0xD8, 0x03, 0xB8, + 0xE0, 0xC0, 0xFA, 0xDB, 0xE1, 0xDE, 0x00, 0x40, 0x39, 0x63, 0x08, 0xA8, + 0x83, 0x98, 0x00, 0x40, 0x33, 0x63, 0x05, 0xA8, 0x19, 0x40, 0x01, 0xA9, + 0x20, 0x40, 0xAB, 0xDF, 0xD3, 0xDE, 0xA8, 0xE4, 0xBC, 0xDE, 0x10, 0x40, + 0xDA, 0xE1, 0xE0, 0x4F, 0x00, 0x40, 0x00, 0xA8, 0xFD, 0x7F, 0x21, 0xDF, + 0x48, 0xE4, 0x1E, 0xE4, 0x0C, 0xE4, 0xC4, 0xC0, 0x00, 0x08, 0x0A, 0xC8, + 0x8A, 0xB8, 0x08, 0x08, 0xFD, 0x7F, 0x18, 0xDF, 0x98, 0xE4, 0x84, 0xE4, + 0xFD, 0x7F, 0x38, 0xDF, 0x28, 0xE4, 0x01, 0x18, 0xC4, 0xC1, 0x00, 0x08, + 0x93, 0xE4, 0x19, 0x40, 0x90, 0xDF, 0xE0, 0xC8, 0x01, 0xD4, 0x0D, 0x12, + 0xC1, 0xC6, 0x02, 0x40, 0x00, 0xB8, 0x63, 0xBF, 0xE7, 0xD9, 0x0D, 0xB6, + 0x5F, 0xB0, 0x7C, 0xB2, 0x40, 0xB4, 0x00, 0x40, 0x3A, 0x63, 0x0C, 0xA8, + 0x83, 0x98, 0x00, 0x40, 0x33, 0x63, 0x05, 0xA8, 0x18, 0x40, 0x04, 0xA9, + 0x20, 0x40, 0x75, 0xDF, 0xFF, 0x7F, 0x6D, 0xDE, 0x20, 0xB5, 0x5F, 0xB1, + 0xFC, 0xB6, 0x38, 0xE4, 0x69, 0xE4, 0x0E, 0x90, 0x0F, 0x98, 0x10, 0x91, + 0x11, 0x94, 0xE0, 0xC0, 0x4C, 0xD9, 0x08, 0xBF, 0x4A, 0xDA, 0x21, 0xE4, + 0xE0, 0xC6, 0x03, 0xD4, 0x0A, 0xC0, 0x04, 0xB8, 0x00, 0x02, 0xE0, 0xC2, + 0x4E, 0xD9, 0xE0, 0x4F, 0x00, 0x40, 0x00, 0xA8, 0xFC, 0x7F, 0xD9, 0xDF, + 0x18, 0xE4, 0x33, 0x08, 0x43, 0x09, 0x89, 0xBA, 0xFC, 0x7F, 0xD4, 0xDF, + 0x08, 0xE4, 0x13, 0x08, 0xFC, 0x7F, 0xD0, 0xDF, 0x98, 0xE4, 0x80, 0xE4, + 0xFC, 0x7F, 0xF0, 0xDF, 0x98, 0xE4, 0x81, 0xE4, 0xFC, 0x7F, 0xDA, 0xDF, + 0x08, 0xE4, 0x10, 0x50, 0x00, 0x40, 0x00, 0xA8, 0xFC, 0x7F, 0xC1, 0xDF, + 0x90, 0xE4, 0xFD, 0x7F, 0x1C, 0xDF, 0x08, 0xE4, 0x82, 0xE4, 0xFC, 0x7F, + 0xBB, 0xDF, 0x90, 0xE4, 0xFC, 0x7F, 0xD6, 0xDF, 0xFC, 0x7F, 0xBC, 0xDF, + 0x28, 0xE4, 0x03, 0x08, 0xE0, 0xC8, 0x0D, 0xD4, 0x13, 0x08, 0x43, 0x00, + 0x80, 0xBA, 0x92, 0xE4, 0xFC, 0x7F, 0xEE, 0xDF, 0x28, 0xE4, 0x23, 0x08, + 0x80, 0xBA, 0x92, 0xE4, 0xFC, 0x7F, 0xF0, 0xDF, 0x28, 0xE4, 0x01, 0xA8, + 0x92, 0xE4, 0xFC, 0x7F, 0xEB, 0xDF, 0x28, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, + 0x40, 0xB4, 0x00, 0x40, 0x3D, 0x63, 0x06, 0xA8, 0x83, 0x98, 0x00, 0x40, + 0x33, 0x63, 0x05, 0xA8, 0x1B, 0x40, 0x03, 0xA9, 0x20, 0x40, 0x11, 0xDF, + 0xAA, 0xDE, 0x00, 0x40, 0x40, 0x63, 0x0B, 0xA8, 0x83, 0x98, 0x00, 0x40, + 0x33, 0x63, 0x05, 0xA8, 0x1B, 0x40, 0x0A, 0xA9, 0x20, 0x40, 0x05, 0xDF, + 0xA6, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x39, 0xE4, + 0x0B, 0x91, 0x68, 0x4F, 0x70, 0x7D, 0x0A, 0xA8, 0xFC, 0x7F, 0x79, 0xDF, + 0x98, 0xE4, 0x80, 0xE4, 0xFC, 0x7F, 0xA7, 0xDF, 0xE0, 0xC8, 0x0F, 0xD5, + 0x53, 0x4F, 0xCC, 0x4C, 0x0D, 0xA8, 0xFC, 0x7F, 0x6E, 0xDF, 0x03, 0x18, + 0x33, 0x4F, 0xCC, 0x4C, 0x0D, 0xA8, 0xFC, 0x7F, 0x68, 0xDF, 0x01, 0x18, + 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x93, 0x4F, 0xCC, 0x4C, 0x0D, 0xA8, + 0xFC, 0x7F, 0x5F, 0xDF, 0x28, 0xE4, 0x80, 0xE4, 0x92, 0xE4, 0xFC, 0x7F, + 0x8C, 0xDF, 0xE0, 0xC8, 0x0A, 0xD5, 0x73, 0x4F, 0xCC, 0x4C, 0x0D, 0xA8, + 0xFC, 0x7F, 0x53, 0xDF, 0x03, 0x18, 0x53, 0x4F, 0xCC, 0x4C, 0x0D, 0xA8, + 0xE4, 0xDE, 0xC0, 0x4F, 0x00, 0x40, 0x00, 0xA8, 0xFC, 0x7F, 0x49, 0xDF, + 0x98, 0xE4, 0x80, 0xE4, 0xFC, 0x7F, 0x77, 0xDF, 0xE0, 0xC8, 0x05, 0xD5, + 0x03, 0x12, 0x73, 0x4F, 0xCC, 0x4C, 0x0D, 0xA8, 0xD4, 0xDE, 0xB3, 0x4F, + 0xCC, 0x4C, 0x0D, 0xA8, 0xFC, 0x7F, 0x39, 0xDF, 0x03, 0x18, 0x01, 0x12, + 0xCF, 0xDE, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x19, 0xE4, + 0xE0, 0x6F, 0x00, 0x40, 0x00, 0xA8, 0xFC, 0x7F, 0x2C, 0xDF, 0x20, 0x18, + 0x30, 0x11, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x5F, 0xB1, + 0xFC, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0x0E, 0x90, 0x0F, 0x94, 0x10, 0x96, + 0xE0, 0xC0, 0x32, 0xD5, 0x80, 0xE4, 0x11, 0x09, 0xFC, 0x7F, 0xAB, 0xDF, + 0x98, 0xE4, 0x01, 0x08, 0xFC, 0x7F, 0x34, 0xDF, 0x38, 0xE4, 0xE0, 0xC2, + 0x1E, 0xD5, 0x31, 0x08, 0x32, 0x09, 0xFC, 0x7F, 0x33, 0xDF, 0x98, 0xE4, + 0x22, 0x08, 0xFC, 0x7F, 0x29, 0xDF, 0x18, 0xE4, 0x00, 0x50, 0x00, 0x40, + 0x00, 0xA8, 0xFC, 0x7F, 0x04, 0xDF, 0x08, 0xE4, 0x81, 0xE4, 0x90, 0xE4, + 0xFC, 0x7F, 0x24, 0xDF, 0x28, 0xE4, 0x81, 0xE4, 0x90, 0xE4, 0xFC, 0x7F, + 0x19, 0xDF, 0x98, 0xE4, 0x83, 0x93, 0x82, 0xE4, 0xFC, 0x7F, 0x6D, 0xDF, + 0x38, 0xE4, 0x83, 0x93, 0x84, 0xE4, 0x96, 0xE4, 0xFC, 0x7F, 0x67, 0xDF, + 0x38, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0x41, 0x63, + 0x08, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x33, 0x63, 0x05, 0xA8, 0x20, 0x40, + 0x00, 0xA9, 0x1F, 0x40, 0x60, 0xDF, 0xC2, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, + 0xFC, 0xB6, 0x19, 0xE4, 0x0C, 0x92, 0x0D, 0x93, 0x21, 0x50, 0xA7, 0x66, + 0x0F, 0xA8, 0xFB, 0x7F, 0xD4, 0xDF, 0x08, 0xE4, 0x81, 0xE4, 0xFC, 0x7F, + 0x76, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFB, 0x7F, 0xEB, 0xDF, 0x08, 0xE4, + 0x56, 0x50, 0x52, 0x76, 0x0C, 0xA8, 0xFB, 0x7F, 0xC6, 0xDF, 0x98, 0xE4, + 0x80, 0xE4, 0xFB, 0x7F, 0xD5, 0xDF, 0xFB, 0x7F, 0xCD, 0xDF, 0x83, 0x98, + 0x82, 0xE4, 0x93, 0xE4, 0xFC, 0x7F, 0x0E, 0xDF, 0x04, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0x18, 0xE4, + 0x49, 0xE4, 0x10, 0x93, 0x11, 0x9A, 0x12, 0x9B, 0x89, 0xE4, 0x11, 0x09, + 0xFC, 0x7F, 0x3D, 0xDF, 0x98, 0xE4, 0x01, 0x08, 0xFB, 0x7F, 0xC6, 0xDF, + 0x68, 0xE4, 0x48, 0x50, 0x00, 0x40, 0x00, 0xA8, 0xFB, 0x7F, 0xA1, 0xDF, + 0x08, 0xE4, 0x83, 0xE4, 0x90, 0xE4, 0xFB, 0x7F, 0xC1, 0xDF, 0x28, 0xE4, + 0x83, 0xE4, 0x90, 0xE4, 0xFB, 0x7F, 0xB6, 0xDF, 0x98, 0xE4, 0x83, 0x96, + 0x82, 0xE4, 0xFC, 0x7F, 0x0A, 0xDF, 0x68, 0xE4, 0x28, 0x70, 0x00, 0x40, + 0x00, 0xA8, 0xFB, 0x7F, 0x8C, 0xDF, 0x28, 0xE4, 0x73, 0x6F, 0xCC, 0x4C, + 0x0D, 0xA8, 0xFB, 0x7F, 0x86, 0xDF, 0x08, 0xE4, 0x84, 0xE4, 0xFC, 0x7F, + 0x28, 0xDF, 0x83, 0x98, 0x82, 0xE4, 0x90, 0xE4, 0xFB, 0x7F, 0xF5, 0xDF, + 0x28, 0xE4, 0x83, 0xE4, 0xFC, 0x7F, 0x1F, 0xDF, 0x08, 0xE4, 0x86, 0xE4, + 0xFC, 0x7F, 0x1B, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFB, 0x7F, 0x8A, 0xDF, + 0x08, 0xE4, 0x01, 0x09, 0xFB, 0x7F, 0x8C, 0xDF, 0x98, 0xE4, 0x8A, 0xE4, + 0xFB, 0x7F, 0x88, 0xDF, 0x98, 0xE4, 0x01, 0x08, 0xFB, 0x7F, 0x78, 0xDF, + 0x01, 0x18, 0x80, 0xE4, 0x92, 0xE4, 0xFB, 0x7F, 0x7F, 0xDF, 0x98, 0xE4, + 0x8B, 0xE4, 0xFB, 0x7F, 0x7B, 0xDF, 0x98, 0xE4, 0x11, 0x08, 0xFB, 0x7F, + 0x6B, 0xDF, 0x11, 0x18, 0x73, 0x4F, 0xCC, 0x4C, 0x0D, 0xA8, 0xFB, 0x7F, + 0x52, 0xDF, 0x08, 0xE4, 0xFE, 0x50, 0x00, 0x60, 0x00, 0xA8, 0xFB, 0x7F, + 0x4C, 0xDF, 0x98, 0xE4, 0x01, 0x08, 0x83, 0x98, 0x80, 0xE4, 0xFB, 0x7F, + 0xBE, 0xDF, 0x01, 0x18, 0x10, 0x70, 0x00, 0x40, 0x00, 0xA8, 0xFB, 0x7F, + 0x40, 0xDF, 0x08, 0xE4, 0xE0, 0x6F, 0x00, 0x40, 0x00, 0xA8, 0xFB, 0x7F, + 0x3A, 0xDF, 0x98, 0xE4, 0x11, 0x08, 0x83, 0x98, 0x80, 0xE4, 0xFB, 0x7F, + 0xAC, 0xDF, 0x11, 0x18, 0x04, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, + 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0xE8, 0xE4, 0xC9, 0xE4, + 0x13, 0x9F, 0x14, 0x9A, 0x00, 0xAB, 0x0A, 0x1B, 0x01, 0xAB, 0x4B, 0xE4, + 0xB8, 0xBF, 0x1F, 0xDA, 0x3A, 0xE4, 0xC4, 0xC3, 0x04, 0xA6, 0x04, 0xE4, + 0xDF, 0xC0, 0xE0, 0xC0, 0x11, 0xD9, 0x26, 0xE4, 0x2C, 0xB8, 0xD6, 0xE4, + 0xDA, 0xB8, 0x10, 0xE4, 0x0A, 0xC1, 0x91, 0xE4, 0x9C, 0xB8, 0x02, 0x08, + 0x09, 0x09, 0xFB, 0x7F, 0x39, 0xDF, 0xE0, 0xC8, 0x13, 0xD4, 0xDF, 0xC0, + 0xE0, 0xC0, 0xF3, 0xDA, 0xE0, 0xC0, 0x0A, 0xD9, 0xC1, 0xC4, 0xC4, 0xC6, + 0xC4, 0xC3, 0x4E, 0xBF, 0xE4, 0xD9, 0x0F, 0x1B, 0x03, 0xB6, 0x5F, 0xB0, + 0xFC, 0xB2, 0x40, 0xB4, 0x8B, 0xE4, 0xC1, 0xCB, 0x03, 0x18, 0xF2, 0xDE, + 0x81, 0xE4, 0x8A, 0xB8, 0x08, 0x08, 0x0D, 0x18, 0xEB, 0xDE, 0x20, 0xB5, + 0x0F, 0xB1, 0xF4, 0xB6, 0x28, 0xE4, 0x0F, 0x40, 0x28, 0x08, 0xE2, 0xC8, + 0x24, 0xD5, 0x0E, 0x40, 0x32, 0x08, 0x83, 0x98, 0x22, 0x08, 0x84, 0x98, + 0x82, 0xE4, 0x0C, 0x40, 0x84, 0xB8, 0x85, 0x98, 0x0B, 0x40, 0x12, 0x08, + 0x86, 0x98, 0x82, 0xE4, 0x02, 0x40, 0x84, 0xB8, 0x87, 0x98, 0x01, 0x40, + 0x80, 0xB8, 0x88, 0x98, 0x12, 0x08, 0x89, 0x98, 0x82, 0xE4, 0x11, 0x40, + 0x80, 0xB8, 0x8A, 0x98, 0xC4, 0xC8, 0x8B, 0x98, 0x0F, 0x40, 0x02, 0x08, + 0x0F, 0x40, 0x12, 0x09, 0xFC, 0x7F, 0x3A, 0xDF, 0x0C, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x0F, 0x40, 0x02, 0x08, 0xE1, 0xC8, 0xF9, 0xD5, 0x00, 0xA3, + 0x0F, 0x40, 0x12, 0x08, 0xE0, 0xC8, 0x22, 0xDB, 0x12, 0xE4, 0x11, 0x40, + 0x11, 0x08, 0xFA, 0x7F, 0xBB, 0xDF, 0x08, 0xE4, 0x0E, 0x40, 0x32, 0x08, + 0xFA, 0x7F, 0xB6, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFA, 0x7F, 0xD6, 0xDF, + 0x0C, 0x40, 0x11, 0x00, 0x12, 0xC0, 0x02, 0xB8, 0x03, 0x40, 0x04, 0xB8, + 0x10, 0x09, 0xFB, 0x7F, 0x3A, 0xDF, 0x98, 0xE4, 0x00, 0x08, 0xFA, 0x7F, + 0xC3, 0xDF, 0x30, 0x18, 0xC1, 0xC3, 0xC4, 0xC1, 0x0F, 0x40, 0x12, 0x08, + 0x83, 0xBF, 0xDF, 0xD8, 0x0B, 0x40, 0x12, 0x08, 0x38, 0x08, 0xC2, 0x18, + 0x0B, 0x50, 0x3B, 0x5F, 0x06, 0xA8, 0xFA, 0x7F, 0x94, 0xDF, 0x18, 0xE4, + 0x10, 0x40, 0x32, 0x08, 0xFA, 0x7F, 0x90, 0xDF, 0x08, 0xE4, 0x21, 0x50, + 0xA7, 0x66, 0x0F, 0xA8, 0xFA, 0x7F, 0x89, 0xDF, 0x98, 0xE4, 0x80, 0xE4, + 0xFA, 0x7F, 0xAA, 0xDF, 0x98, 0xE4, 0x81, 0xE4, 0xFB, 0x7F, 0x13, 0xDF, + 0x98, 0xE4, 0xC2, 0x08, 0xFA, 0x7F, 0x9C, 0xDF, 0xC2, 0x18, 0x92, 0x09, + 0xFA, 0x7F, 0x9E, 0xDF, 0x08, 0xE4, 0xE0, 0x4F, 0x00, 0x40, 0x00, 0xA8, + 0xFA, 0x7F, 0x73, 0xDF, 0xA2, 0x09, 0xFA, 0x7F, 0x95, 0xDF, 0x98, 0xE4, + 0x80, 0xE4, 0xFA, 0x7F, 0xFE, 0xDF, 0x08, 0xE4, 0x0E, 0x40, 0x32, 0x08, + 0xFA, 0x7F, 0x68, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFA, 0x7F, 0x82, 0xDF, + 0xFA, 0x7F, 0x68, 0xDF, 0x11, 0x40, 0x02, 0x18, 0x0C, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x7C, 0xB3, 0x5F, 0xB1, 0xF3, 0xB6, 0x1C, 0x9C, + 0x1D, 0x9A, 0x1F, 0x94, 0x20, 0x9D, 0x23, 0x91, 0x24, 0x9E, 0x1E, 0x98, + 0xA8, 0xE6, 0x10, 0x40, 0xD3, 0xE1, 0x00, 0xA9, 0x83, 0xE4, 0x08, 0xA2, + 0x08, 0x19, 0xC4, 0xC8, 0xDF, 0xC2, 0xE0, 0xC2, 0xFB, 0xDA, 0x09, 0xE4, + 0x09, 0xDE, 0x81, 0xE4, 0x80, 0xB8, 0x08, 0x89, 0x0A, 0xC9, 0x93, 0xB8, + 0x09, 0x08, 0xC1, 0xC8, 0x09, 0x18, 0xC1, 0xC0, 0x0A, 0xBF, 0xF5, 0xD9, + 0x00, 0xA8, 0xFA, 0x7F, 0x36, 0xDF, 0x68, 0xE4, 0x21, 0x50, 0xA7, 0x66, + 0x0F, 0xA8, 0xFA, 0x7F, 0x30, 0xDF, 0x94, 0xE4, 0xFA, 0x7F, 0x4C, 0xDF, + 0xB8, 0xE4, 0x00, 0xA4, 0x08, 0xA2, 0x03, 0x08, 0xC4, 0xC3, 0xE0, 0xC8, + 0x1C, 0xDB, 0xFA, 0x7F, 0x25, 0xDF, 0x18, 0xE4, 0x0B, 0x50, 0x3B, 0x5F, + 0x06, 0xA8, 0xFA, 0x7F, 0x1E, 0xDF, 0x08, 0xE4, 0x84, 0xE4, 0xFA, 0x7F, + 0x1B, 0xDF, 0x9B, 0xE4, 0xFA, 0x7F, 0x3C, 0xDF, 0x98, 0xE4, 0x80, 0xE4, + 0xFA, 0x7F, 0xA5, 0xDF, 0x98, 0xE4, 0x81, 0xE4, 0xFA, 0x7F, 0x2E, 0xDF, + 0x98, 0xE4, 0x86, 0xE4, 0xFA, 0x7F, 0x1E, 0xDF, 0x68, 0xE4, 0xDF, 0xC2, + 0x4C, 0xBA, 0xE0, 0xC2, 0xDC, 0xDA, 0x8D, 0xE4, 0xFA, 0x7F, 0x04, 0xDF, + 0x08, 0xE4, 0x8A, 0xE4, 0xFA, 0x7F, 0x00, 0xDF, 0x96, 0xE4, 0xFA, 0x7F, + 0x21, 0xDF, 0xFA, 0x7F, 0xA0, 0xDF, 0x98, 0xE4, 0x8B, 0xE4, 0xFA, 0x7F, + 0x15, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xFA, 0x7F, 0x05, 0xDF, 0xF9, 0x7F, + 0xFD, 0xDF, 0x83, 0x98, 0x00, 0xA8, 0xFF, 0x47, 0x0F, 0xA9, 0xFA, 0x7F, + 0x3D, 0xDF, 0x0E, 0x18, 0x0D, 0xB6, 0x5F, 0xB0, 0x7C, 0xB2, 0x40, 0xB4, + 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x00, 0xA8, 0x13, 0x40, + 0x20, 0x18, 0x66, 0x50, 0xC2, 0x55, 0x09, 0xA8, 0xF9, 0x7F, 0xD9, 0xDF, + 0x90, 0x18, 0xF9, 0x6F, 0xBA, 0x49, 0x06, 0xA8, 0xF9, 0x7F, 0xD3, 0xDF, + 0xA0, 0x18, 0x13, 0x50, 0x1B, 0x4D, 0x07, 0xA8, 0xF9, 0x7F, 0xCD, 0xDF, + 0x07, 0xA9, 0xD0, 0x18, 0xE0, 0x18, 0xDF, 0xC9, 0x01, 0x40, 0x00, 0xB8, + 0xE0, 0xC9, 0xF9, 0xDA, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0xFC, 0xB3, 0x5F, 0xB1, 0xE7, 0xB6, 0xA8, 0xE4, 0xA8, 0x99, 0x2C, 0x9F, + 0x2D, 0x9C, 0x2F, 0x93, 0x31, 0x91, 0x32, 0x92, 0x33, 0x9B, 0x34, 0x94, + 0x35, 0x96, 0x36, 0x9E, 0x00, 0xAD, 0x87, 0x9D, 0xE0, 0x4F, 0x00, 0x40, + 0x00, 0xA8, 0xF9, 0x7F, 0xAC, 0xDF, 0x88, 0x98, 0xFF, 0xCB, 0x01, 0x40, + 0x03, 0xDB, 0x0F, 0x40, 0x1A, 0x13, 0x81, 0xE4, 0x82, 0xE6, 0x0E, 0x40, + 0x3A, 0x18, 0x03, 0x40, 0x1F, 0xB8, 0x18, 0xC1, 0x0E, 0x40, 0x1A, 0x11, + 0x03, 0x40, 0x2F, 0xB8, 0x18, 0xC2, 0x0E, 0x40, 0x2A, 0x12, 0x0F, 0x40, + 0x2A, 0x1C, 0x0F, 0x40, 0x0A, 0x1B, 0x0B, 0x40, 0x2A, 0x1D, 0x0B, 0x40, + 0x3A, 0x1D, 0x0F, 0x40, 0x3A, 0x14, 0x10, 0x40, 0x0A, 0x16, 0xA0, 0x4F, + 0x00, 0x40, 0x00, 0xA8, 0xF9, 0x7F, 0x87, 0xDF, 0x08, 0xE4, 0x0A, 0xC4, + 0x00, 0x40, 0x49, 0x62, 0x44, 0xB8, 0x04, 0x08, 0xF9, 0x7F, 0x80, 0xDF, + 0x98, 0xE4, 0x80, 0xE4, 0xF9, 0x7F, 0xE6, 0xDF, 0x10, 0x40, 0x1A, 0x18, + 0x0A, 0xC6, 0x00, 0x40, 0x49, 0x62, 0x64, 0xB8, 0x06, 0x08, 0xF9, 0x7F, + 0x73, 0xDF, 0x10, 0x40, 0x2A, 0x18, 0x10, 0x40, 0x3A, 0x1E, 0x29, 0x98, + 0x83, 0x98, 0x84, 0x9F, 0x2A, 0x99, 0x85, 0x99, 0x2B, 0x90, 0x86, 0x90, + 0x8A, 0xE4, 0x28, 0x99, 0xFA, 0x7F, 0x1D, 0xDF, 0x2A, 0x08, 0xF9, 0x7F, + 0x61, 0xDF, 0x08, 0xE4, 0x0E, 0x40, 0x3A, 0x08, 0xF9, 0x7F, 0x5C, 0xDF, + 0x98, 0xE4, 0x80, 0xE4, 0xF9, 0x7F, 0x7C, 0xDF, 0x48, 0xE4, 0xE2, 0xCC, + 0x00, 0x40, 0x9E, 0xD5, 0xE1, 0xCB, 0x18, 0xD5, 0x20, 0x40, 0xD8, 0xE1, + 0x83, 0x98, 0x44, 0x40, 0xD1, 0xE1, 0x84, 0x91, 0x83, 0xE4, 0x30, 0x99, + 0xFB, 0x7F, 0xB5, 0xDF, 0x1C, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x8A, 0xE4, + 0x0C, 0x40, 0x84, 0xB8, 0x84, 0x98, 0x24, 0x40, 0xD8, 0xE1, 0x85, 0x98, + 0x83, 0xE4, 0x91, 0xE4, 0xFE, 0x7F, 0x0A, 0xDF, 0x2D, 0xE4, 0xD3, 0xBF, + 0x1A, 0xDA, 0x0A, 0xE4, 0x0C, 0x40, 0x04, 0xB8, 0x30, 0x99, 0xC4, 0xC9, + 0x04, 0xDE, 0xC1, 0xC2, 0xC4, 0xC0, 0x23, 0xBF, 0x10, 0xDA, 0x09, 0x08, + 0x02, 0x40, 0x90, 0xB8, 0x83, 0xBF, 0xF7, 0xD4, 0x00, 0x08, 0x12, 0xC8, + 0x8A, 0xB8, 0x03, 0x40, 0x84, 0xB8, 0x0B, 0x40, 0x1A, 0x18, 0xC1, 0xC2, + 0xC4, 0xC0, 0x23, 0xBF, 0xF0, 0xD9, 0xE1, 0xCC, 0x4A, 0xD5, 0xE0, 0xCE, + 0x2B, 0xD4, 0x8A, 0xE4, 0x02, 0x40, 0x84, 0xB8, 0x08, 0x99, 0xFC, 0x7F, + 0xDC, 0xDF, 0x00, 0xA2, 0x07, 0x98, 0x28, 0xBF, 0x10, 0xDA, 0x44, 0x40, + 0xD1, 0xE1, 0x0A, 0xE4, 0x03, 0x40, 0x04, 0xB8, 0x80, 0xE4, 0x01, 0x09, + 0xC4, 0xC1, 0xFC, 0x7F, 0xCE, 0xDF, 0xC1, 0xC2, 0x01, 0x40, 0x00, 0xB8, + 0x07, 0x98, 0x28, 0xBF, 0xF5, 0xD9, 0x9A, 0xE4, 0x01, 0x40, 0x9C, 0xB8, + 0x8A, 0xE4, 0x02, 0x40, 0x80, 0xB8, 0x83, 0x98, 0x84, 0xE4, 0xFC, 0x7F, + 0x70, 0xDF, 0x1A, 0x08, 0x37, 0x99, 0x09, 0x18, 0x19, 0xB6, 0x5F, 0xB0, + 0xFC, 0xB2, 0x40, 0xB4, 0x0B, 0x50, 0x3B, 0x5F, 0x06, 0xA8, 0xF8, 0x7F, + 0xE8, 0xDF, 0x18, 0xE4, 0x8E, 0xE4, 0xF8, 0x7F, 0xE5, 0xDF, 0x08, 0xE4, + 0x21, 0x50, 0xA7, 0x66, 0x0F, 0xA8, 0xF8, 0x7F, 0xDE, 0xDF, 0x98, 0xE4, + 0x80, 0xE4, 0xF8, 0x7F, 0xFF, 0xDF, 0x98, 0xE4, 0x81, 0xE4, 0xF9, 0x7F, + 0x68, 0xDF, 0x98, 0xE4, 0x08, 0x98, 0xF8, 0x7F, 0xF1, 0xDF, 0x88, 0x98, + 0xB8, 0xDE, 0xE0, 0x4F, 0x00, 0x40, 0x00, 0xA8, 0xF8, 0x7F, 0xCB, 0xDF, + 0x08, 0xE4, 0x88, 0x98, 0x00, 0xA2, 0x07, 0x98, 0x28, 0xBF, 0xAB, 0xDA, + 0x44, 0x40, 0xD1, 0xE1, 0xE0, 0x4F, 0x00, 0x40, 0x00, 0xA8, 0xF8, 0x7F, + 0xBE, 0xDF, 0x80, 0xE4, 0x07, 0x90, 0x91, 0xE4, 0x09, 0x18, 0xC4, 0xC9, + 0xC1, 0xC2, 0x20, 0xBF, 0xFB, 0xD9, 0x9B, 0xDE, 0x2A, 0x08, 0x83, 0x98, + 0x2E, 0x98, 0x84, 0x98, 0x8A, 0xE4, 0x11, 0x40, 0x80, 0xB8, 0x85, 0x98, + 0xC4, 0xC8, 0x86, 0x98, 0x8B, 0xE4, 0x93, 0xE4, 0xF9, 0x7F, 0xDE, 0xDF, + 0xFF, 0x7F, 0x52, 0xDE, 0x00, 0x40, 0x42, 0x63, 0x00, 0xA8, 0x83, 0x98, + 0x00, 0x40, 0x33, 0x63, 0x05, 0xA8, 0x34, 0x40, 0x00, 0xA9, 0x1C, 0x40, + 0x1A, 0xDF, 0xFE, 0x7F, 0xF0, 0xDE, 0xA0, 0xE0, 0x20, 0xB5, 0xFC, 0xB3, + 0x5F, 0xB1, 0xF2, 0xB6, 0x28, 0xE4, 0xC9, 0xE4, 0x1E, 0x90, 0x1F, 0x96, + 0x20, 0x9F, 0x23, 0x9A, 0x25, 0x91, 0x26, 0x9B, 0x27, 0x9D, 0x28, 0x9E, + 0x29, 0x94, 0x2A, 0x93, 0x0F, 0x40, 0x38, 0x08, 0x8D, 0x98, 0x10, 0x40, + 0x02, 0x08, 0x8C, 0x98, 0xE0, 0xC0, 0x00, 0x40, 0x87, 0xD9, 0x0F, 0x40, + 0x12, 0x08, 0x80, 0xBF, 0x54, 0xDB, 0x13, 0x40, 0x22, 0x08, 0xE0, 0xC8, + 0x02, 0xD5, 0xE0, 0xC0, 0x03, 0xD4, 0x82, 0xE4, 0xFD, 0x7F, 0x7D, 0xDF, + 0xE0, 0xCA, 0x67, 0xD5, 0xE0, 0xCC, 0x5C, 0xD5, 0x82, 0xE4, 0x02, 0x40, + 0x84, 0xB8, 0x0B, 0x40, 0x22, 0x18, 0x81, 0xE4, 0xF8, 0x7F, 0x66, 0xDF, + 0x08, 0xE4, 0x0E, 0x40, 0x32, 0x08, 0xF8, 0x7F, 0x61, 0xDF, 0x98, 0xE4, + 0x80, 0xE4, 0xF8, 0x7F, 0x81, 0xDF, 0x83, 0x98, 0x10, 0x40, 0x12, 0x08, + 0x84, 0x98, 0x10, 0x40, 0x22, 0x08, 0x85, 0x98, 0x0B, 0x40, 0x22, 0x08, + 0x0B, 0x40, 0x32, 0x09, 0xFC, 0x7F, 0x28, 0xDF, 0x98, 0xE4, 0x0B, 0x40, + 0x22, 0x08, 0x28, 0x19, 0xE0, 0xCA, 0x2F, 0xD5, 0x24, 0x98, 0x0B, 0x18, + 0x0D, 0x11, 0x42, 0x08, 0x0E, 0x18, 0x00, 0xA1, 0x81, 0xE4, 0x0A, 0xC8, + 0x08, 0xE4, 0x03, 0xB8, 0x98, 0xE4, 0x00, 0x40, 0x49, 0x62, 0x94, 0xB8, + 0x09, 0x09, 0x00, 0x19, 0x98, 0xE4, 0x94, 0xB8, 0x00, 0x40, 0x56, 0x62, + 0x84, 0xB8, 0x08, 0x08, 0x09, 0x18, 0xC1, 0xC1, 0x03, 0x40, 0x13, 0xBF, + 0xEB, 0xDB, 0x13, 0x40, 0x12, 0x16, 0xE0, 0xC6, 0x41, 0xD4, 0x0E, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x00, 0x40, 0x44, 0x63, 0x06, 0xA8, + 0x83, 0x98, 0x00, 0x40, 0x33, 0x63, 0x05, 0xA8, 0x3D, 0x40, 0x0D, 0xA9, + 0x1B, 0x40, 0x9B, 0xDF, 0xA0, 0xDE, 0x03, 0x40, 0xF3, 0xBF, 0x23, 0xD8, + 0x13, 0x40, 0x22, 0x08, 0xE0, 0xC8, 0x1F, 0xD4, 0x0B, 0x1F, 0xCA, 0xDE, + 0x0A, 0xC0, 0x02, 0xB8, 0x0C, 0x40, 0x10, 0x08, 0x12, 0xC8, 0x82, 0xB8, + 0x03, 0x40, 0x84, 0xB8, 0x9E, 0xDE, 0x83, 0x90, 0x0F, 0x40, 0x12, 0x08, + 0x84, 0x98, 0x11, 0x40, 0x02, 0x08, 0x85, 0x98, 0x82, 0xE4, 0x11, 0x40, + 0x84, 0xB8, 0x86, 0x98, 0x82, 0xE4, 0x9C, 0xE4, 0xFB, 0x7F, 0x06, 0xDF, + 0x18, 0xE4, 0x88, 0xDE, 0x00, 0xA0, 0xFF, 0x7F, 0x76, 0xDE, 0x0F, 0x40, + 0x32, 0x08, 0x83, 0x98, 0x10, 0x40, 0x02, 0x08, 0x84, 0x98, 0x0B, 0x40, + 0x22, 0x08, 0xFC, 0x7F, 0x0B, 0xDF, 0xA1, 0xDE, 0x22, 0x98, 0x83, 0x98, + 0x0E, 0x40, 0x12, 0x08, 0x84, 0x98, 0x0E, 0x40, 0x22, 0x08, 0x85, 0x98, + 0x0B, 0x40, 0x22, 0x08, 0x18, 0x08, 0x86, 0x98, 0x0B, 0x08, 0x87, 0x98, + 0x0D, 0x98, 0x88, 0x98, 0x0C, 0x98, 0x89, 0x98, 0x2B, 0x98, 0x8A, 0x98, + 0x13, 0x41, 0x2C, 0xB8, 0x8B, 0x92, 0x86, 0xE4, 0x21, 0x99, 0xFD, 0x7F, + 0x72, 0xDF, 0x0E, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x20, 0xB5, + 0x0F, 0xB1, 0xFA, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0x0E, 0x93, 0x0F, 0x90, + 0x03, 0x40, 0x93, 0xBF, 0x2D, 0xDC, 0x81, 0xE4, 0x93, 0xE4, 0xF8, 0x7F, + 0xBF, 0xDF, 0xE0, 0xC0, 0x1B, 0xD4, 0x13, 0x40, 0x11, 0x08, 0xE0, 0xC8, + 0x2F, 0xD5, 0x83, 0xE4, 0xF7, 0x7F, 0xB4, 0xDF, 0x08, 0xE4, 0x0E, 0x40, + 0x31, 0x08, 0xF7, 0x7F, 0xAF, 0xDF, 0x98, 0xE4, 0x80, 0xE4, 0xF7, 0x7F, + 0xCF, 0xDF, 0x98, 0xE4, 0x0B, 0x40, 0x21, 0x08, 0x28, 0x00, 0x83, 0x90, + 0x71, 0x00, 0x84, 0x90, 0x81, 0x00, 0x85, 0x90, 0xFB, 0x7F, 0xE7, 0xDF, + 0x0B, 0x40, 0x21, 0x08, 0x0B, 0x40, 0x31, 0x18, 0x13, 0x40, 0x21, 0x08, + 0xC1, 0xC8, 0x13, 0x40, 0x21, 0x18, 0x06, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x00, 0x40, 0x47, 0x63, 0x0F, 0xA8, 0x83, 0x98, 0x00, 0x40, 0x33, 0x63, + 0x05, 0xA8, 0x45, 0x40, 0x06, 0xA9, 0x1B, 0x40, 0x08, 0xDF, 0xC7, 0xDE, + 0x0B, 0x40, 0x21, 0x00, 0x0A, 0xC2, 0x00, 0x40, 0x49, 0x62, 0x24, 0xB8, + 0x02, 0x08, 0xF7, 0x7F, 0x7F, 0xDF, 0x83, 0x98, 0x10, 0x40, 0x11, 0x08, + 0x10, 0x40, 0x21, 0x09, 0xF7, 0x7F, 0xEF, 0xDF, 0x20, 0x18, 0xBF, 0xDE, + 0x0F, 0xB1, 0x38, 0xE4, 0x29, 0xE4, 0x00, 0xA1, 0x81, 0xE4, 0x0A, 0xC8, + 0x08, 0xE4, 0x03, 0xB8, 0x98, 0xE4, 0x00, 0x40, 0x49, 0x62, 0x94, 0xB8, + 0x09, 0x09, 0x00, 0x19, 0x98, 0xE4, 0x92, 0xB8, 0x00, 0x40, 0x56, 0x62, + 0x84, 0xB8, 0x08, 0x08, 0x09, 0x18, 0xC1, 0xC1, 0x03, 0x40, 0x13, 0xBF, + 0xEB, 0xDD, 0x0F, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, 0x18, 0xE4, 0x09, 0xE4, + 0x06, 0x92, 0x98, 0xE4, 0xE0, 0xC0, 0x0C, 0xD5, 0x01, 0x40, 0x0F, 0xBF, + 0x0C, 0xD8, 0x81, 0xC9, 0x00, 0xA8, 0x80, 0xBA, 0x01, 0x40, 0x8F, 0xBC, + 0xA2, 0xC1, 0x02, 0xD5, 0x00, 0x40, 0x91, 0xBD, 0x02, 0x19, 0x07, 0xB0, + 0xA0, 0xE0, 0xE0, 0xC8, 0x01, 0xD5, 0x01, 0xA8, 0x98, 0xE4, 0x02, 0x19, + 0x07, 0xB0, 0xA0, 0xE0, 0x0F, 0xB1, 0x28, 0xE4, 0x07, 0x91, 0x08, 0x98, + 0x09, 0x93, 0x0A, 0x90, 0x89, 0xB8, 0x00, 0x18, 0x21, 0xB8, 0x89, 0xBF, + 0x01, 0xD6, 0xC1, 0xC2, 0x03, 0x12, 0x0F, 0xB0, 0xA0, 0xE0, 0x1F, 0xB1, + 0x38, 0xE4, 0x08, 0x92, 0x09, 0x91, 0x0A, 0x94, 0x0B, 0x90, 0x89, 0xE4, + 0x81, 0xBA, 0x00, 0x18, 0x32, 0xBA, 0x91, 0xBF, 0x01, 0xD6, 0xDF, 0xC3, + 0x04, 0x13, 0x1F, 0xB0, 0xA0, 0xE0, 0x14, 0xB3, 0x5F, 0xB1, 0x0B, 0x9A, + 0x0C, 0x93, 0x08, 0xE4, 0x50, 0xE0, 0x19, 0xE4, 0x51, 0xE0, 0x60, 0xE4, + 0x61, 0xE6, 0x41, 0xC9, 0x20, 0xE4, 0x29, 0xE6, 0x41, 0xC8, 0xC8, 0xE4, + 0xC1, 0xE6, 0x48, 0xE4, 0x49, 0xE6, 0x2C, 0xB8, 0x82, 0xE4, 0x41, 0xC8, + 0x48, 0xB8, 0x2C, 0xBF, 0x02, 0xD6, 0x00, 0x50, 0x40, 0xB8, 0x42, 0xC2, + 0x62, 0xB8, 0x62, 0xBF, 0x01, 0xD6, 0xC1, 0xC4, 0x03, 0x16, 0x0A, 0x14, + 0x5F, 0xB0, 0x14, 0xB2, 0xA0, 0xE0, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, + 0xF5, 0xB6, 0x18, 0xE4, 0xB9, 0xE4, 0x17, 0x94, 0xFF, 0xA8, 0x41, 0xBF, + 0x2E, 0xDD, 0x24, 0xE4, 0x41, 0xC2, 0xA2, 0xE4, 0x42, 0xCA, 0x00, 0x70, + 0x00, 0xA0, 0xA1, 0xBF, 0x2A, 0xDC, 0x28, 0x40, 0xD8, 0xE1, 0x83, 0x98, + 0xDC, 0xC8, 0x84, 0x98, 0x84, 0xE4, 0x90, 0xE4, 0xC2, 0xDF, 0x0A, 0x98, + 0x83, 0x98, 0x09, 0x98, 0x84, 0x98, 0x20, 0x40, 0xD6, 0xE1, 0x85, 0x96, + 0x1C, 0x40, 0xD3, 0xE1, 0x86, 0x93, 0x81, 0xE4, 0x9B, 0xE4, 0xA5, 0xDF, + 0x08, 0x98, 0xE0, 0xC8, 0x1C, 0xD9, 0x98, 0xE4, 0x42, 0xC9, 0x01, 0x40, + 0xF8, 0xE9, 0x98, 0xBD, 0x88, 0x99, 0xA9, 0xBF, 0x11, 0xDD, 0x89, 0xE4, + 0x92, 0xE4, 0x12, 0x40, 0x5E, 0xDF, 0x08, 0xBD, 0x80, 0xE4, 0x0B, 0xB6, + 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x81, 0xE4, 0x92, 0xE4, 0x12, 0x40, + 0x54, 0xDF, 0x08, 0xE4, 0x42, 0xC0, 0xCF, 0xDE, 0xFF, 0x4F, 0x0F, 0xBD, + 0xF1, 0xDE, 0x14, 0xE4, 0x42, 0xC1, 0x00, 0x70, 0x00, 0xB8, 0x83, 0x92, + 0x84, 0x91, 0x85, 0x96, 0x86, 0x93, 0x07, 0x99, 0xFF, 0x7F, 0x6C, 0xDF, + 0x08, 0x98, 0xE0, 0xC8, 0xF4, 0xD9, 0xD5, 0xDE, 0x01, 0xB1, 0x00, 0xA9, + 0xFF, 0x4F, 0x8F, 0xBF, 0x02, 0xDC, 0x10, 0xA9, 0x42, 0xC8, 0x3F, 0x40, + 0xFF, 0x7F, 0x8F, 0xBF, 0x02, 0xDC, 0xC8, 0xC9, 0x22, 0xC8, 0x61, 0xC8, + 0x00, 0x40, 0x63, 0x62, 0x84, 0xB8, 0x08, 0x28, 0x98, 0xB8, 0x89, 0xE4, + 0x08, 0xE0, 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x00, 0x40, 0x58, 0x64, + 0x09, 0xA9, 0x09, 0x20, 0x80, 0xBD, 0x09, 0x38, 0x01, 0xB0, 0xA0, 0xE0, + 0x00, 0xA9, 0x06, 0xC8, 0xC0, 0x7F, 0x00, 0x40, 0x80, 0xBF, 0x01, 0xDD, + 0x01, 0xA9, 0x89, 0xE4, 0xA0, 0xE0, 0x03, 0xB1, 0x98, 0xE4, 0x00, 0xA1, + 0x59, 0xC8, 0x1F, 0x40, 0x8F, 0xBC, 0x1F, 0x40, 0x8E, 0xBF, 0x03, 0xD5, + 0x81, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, 0x0F, 0x40, 0xFF, 0x7F, 0x9F, 0xBC, + 0xF9, 0xD5, 0x01, 0xA1, 0x81, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, + 0x5F, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, 0x09, 0xE4, 0xDD, 0xDF, 0x48, 0xE4, + 0x82, 0xE4, 0xE3, 0xDF, 0x38, 0xE4, 0x80, 0xE4, 0xD7, 0xDF, 0x68, 0xE4, + 0x80, 0xE4, 0xDD, 0xDF, 0x18, 0xE4, 0x10, 0x40, 0x00, 0x40, 0x20, 0xBD, + 0x10, 0x40, 0x00, 0x40, 0x00, 0xBD, 0x83, 0xE4, 0x81, 0xBD, 0x08, 0xE0, + 0x2A, 0xD4, 0x83, 0xE4, 0x08, 0xE0, 0x0C, 0xD5, 0x81, 0xE4, 0x08, 0xE0, + 0x14, 0xD4, 0x86, 0xE4, 0x08, 0xE0, 0x90, 0xE4, 0x01, 0xD4, 0x92, 0xE4, + 0x89, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x84, 0xE4, 0x08, 0xE0, + 0x90, 0xE4, 0xF8, 0xD5, 0x91, 0xE4, 0x09, 0xE0, 0x86, 0xE4, 0x08, 0xE0, + 0xF2, 0xD5, 0xE0, 0xC9, 0xF0, 0xD4, 0x12, 0xE4, 0x06, 0xC1, 0x80, 0xE4, + 0x06, 0xC8, 0x90, 0xE4, 0x18, 0xBF, 0xEA, 0xD7, 0x92, 0xE4, 0x81, 0xBF, + 0xE7, 0xD7, 0x80, 0xE4, 0x02, 0xBF, 0x01, 0xDD, 0x82, 0xE4, 0x98, 0xE4, + 0xE1, 0xDE, 0x01, 0xA8, 0x94, 0xDF, 0xD3, 0xDE, 0x1F, 0x40, 0xFF, 0x7F, + 0x8F, 0xBC, 0xA0, 0xE0, 0x01, 0xB1, 0x5D, 0xC8, 0x0F, 0x40, 0x8F, 0xBC, + 0x01, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x7D, 0xC8, 0x08, 0xE0, 0x01, 0xB0, + 0xA0, 0xE0, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x29, 0xE4, + 0x0A, 0x91, 0xFF, 0x7F, 0x65, 0xDF, 0xD8, 0xC8, 0x08, 0xE0, 0xA2, 0xC0, + 0x01, 0x10, 0x01, 0xA9, 0x98, 0xBA, 0x02, 0x19, 0x03, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0x01, 0xB1, 0x04, 0x90, 0x7E, 0xC8, 0x5E, 0xC9, 0x89, 0xB8, + 0x08, 0xB8, 0x80, 0xE4, 0x01, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x0C, 0xB3, + 0x5F, 0xB1, 0xFC, 0xB6, 0x39, 0xE4, 0x98, 0xE4, 0x00, 0xA0, 0x00, 0x40, + 0x58, 0x64, 0x08, 0xA8, 0x08, 0x28, 0xE0, 0xC8, 0x01, 0xD4, 0x01, 0xA0, + 0x40, 0xA2, 0xB0, 0xE4, 0x0B, 0xE0, 0xA9, 0xE4, 0x0A, 0xE0, 0xE0, 0xCB, + 0x09, 0xD4, 0xE3, 0xC8, 0x55, 0xD5, 0x7F, 0xA2, 0xA9, 0xE4, 0x0A, 0xE0, + 0x4F, 0xD4, 0xE1, 0xC8, 0x01, 0xD4, 0x2A, 0xE4, 0x10, 0x91, 0x41, 0xE4, + 0x07, 0x40, 0x4F, 0xBC, 0x83, 0xE4, 0x58, 0xE0, 0x62, 0xE4, 0x06, 0xE0, + 0x0F, 0x40, 0x8C, 0xBF, 0x0A, 0xDD, 0x62, 0xE4, 0x06, 0xE0, 0x0F, 0x40, + 0x3D, 0xBF, 0x2C, 0xD8, 0x27, 0xD5, 0x62, 0xE4, 0x06, 0xE0, 0xE0, 0xC3, + 0x3B, 0xD9, 0x04, 0xE4, 0x00, 0xE0, 0xE0, 0xC0, 0x17, 0xD4, 0x16, 0xB8, + 0x1D, 0xC1, 0x84, 0xE4, 0x04, 0x40, 0x80, 0xBE, 0x08, 0xE0, 0x91, 0xE4, + 0x03, 0xD4, 0x9B, 0xE4, 0x79, 0xE0, 0x91, 0xBC, 0x90, 0x99, 0xE0, 0xC9, + 0x01, 0xD4, 0x39, 0xE4, 0x83, 0x99, 0x8A, 0xE4, 0x93, 0xE4, 0xAD, 0xDF, + 0x04, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x00, 0x40, 0x58, 0x64, + 0x09, 0xA9, 0x09, 0x28, 0x02, 0x40, 0x80, 0xBD, 0x09, 0x38, 0xE1, 0xDE, + 0x86, 0xE4, 0x81, 0xB8, 0x88, 0xB8, 0xD9, 0xD6, 0x28, 0xA8, 0xFF, 0x7F, + 0x0C, 0xDF, 0x00, 0xA8, 0x83, 0x98, 0x8A, 0xE4, 0x0F, 0x40, 0x0F, 0xA9, + 0x94, 0xDF, 0xE0, 0xC6, 0xE5, 0xD4, 0xDF, 0xC8, 0x04, 0xB6, 0x5F, 0xB0, + 0x0C, 0xB2, 0x40, 0xB4, 0xE2, 0xC8, 0xB2, 0xD4, 0x2B, 0xE4, 0xB0, 0xDE, + 0x00, 0xA0, 0x00, 0x40, 0x58, 0x64, 0x0A, 0xA8, 0x08, 0x28, 0xE1, 0xC8, + 0x1F, 0xD5, 0xFF, 0xC3, 0x1D, 0xD9, 0x16, 0xB8, 0x11, 0xB8, 0x1A, 0xD6, + 0x00, 0xA9, 0x93, 0xBA, 0x40, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x10, 0x98, + 0xFE, 0x7F, 0x1B, 0xDF, 0x00, 0xA3, 0x10, 0x91, 0x41, 0xE4, 0x07, 0x40, + 0x4F, 0xBC, 0x80, 0xE4, 0x08, 0xE0, 0x04, 0xE4, 0x00, 0xE0, 0xE0, 0xC8, + 0xA8, 0xD5, 0xE0, 0xC0, 0xA6, 0xD5, 0x10, 0xA8, 0xFE, 0x7F, 0xD7, 0xDF, + 0x10, 0x91, 0xA1, 0xDE, 0x01, 0xA0, 0xE4, 0xDE, 0x20, 0xB5, 0x07, 0xB1, + 0xFC, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0x0B, 0x90, 0x80, 0xE4, 0xFE, 0x7F, + 0xB3, 0xDF, 0xDF, 0xC8, 0x01, 0xE0, 0x08, 0xE0, 0x28, 0xBA, 0xA2, 0xC0, + 0x83, 0x90, 0x81, 0xE4, 0x92, 0xE4, 0xFF, 0x7F, 0x57, 0xDF, 0x04, 0xB6, + 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFC, 0xB6, 0x98, 0xE4, + 0xE0, 0xC9, 0x10, 0xD5, 0x00, 0x60, 0x00, 0x40, 0x90, 0xBF, 0x0F, 0xD5, + 0x89, 0xE4, 0x7D, 0xC8, 0x08, 0xE4, 0x00, 0xE0, 0x89, 0xE4, 0x01, 0xD5, + 0x68, 0xE0, 0x83, 0x98, 0x80, 0xE4, 0x09, 0x40, 0x0C, 0xA9, 0xD4, 0xDF, + 0x04, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x00, 0xA8, 0x83, 0x98, 0x01, 0xA8, + 0x09, 0x40, 0x0E, 0xA9, 0xFF, 0x7F, 0x2B, 0xDF, 0x04, 0xB6, 0x01, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x1F, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, 0xFF, 0x7F, + 0x01, 0xDF, 0x38, 0xE4, 0x82, 0xE4, 0xFF, 0x7F, 0x01, 0xDF, 0x18, 0xE4, + 0x82, 0xE4, 0xFF, 0x7F, 0x03, 0xDF, 0x48, 0xE4, 0x01, 0xE4, 0xF6, 0x7F, + 0x0A, 0xB8, 0xE0, 0xC0, 0x2F, 0xD9, 0x09, 0x40, 0x1D, 0xBF, 0x13, 0xDB, + 0xC0, 0x73, 0x00, 0x40, 0x20, 0xBF, 0x09, 0xD5, 0x01, 0xA8, 0xFE, 0x7F, + 0x7C, 0xDF, 0x84, 0xE4, 0x08, 0xE0, 0x4D, 0xD5, 0x0F, 0x40, 0x1F, 0xBF, + 0x48, 0xD5, 0x00, 0x60, 0x00, 0x40, 0x00, 0xA8, 0x03, 0xB6, 0x1F, 0xB0, + 0x40, 0xB4, 0x13, 0xE4, 0x20, 0x40, 0x00, 0x40, 0x10, 0xBD, 0x82, 0xC1, + 0x84, 0xE4, 0x08, 0xE0, 0x0F, 0xD4, 0x81, 0xE4, 0x03, 0xB6, 0x1F, 0xB0, + 0x40, 0xB4, 0xE0, 0xC2, 0x01, 0xD5, 0x01, 0xA2, 0x84, 0xE4, 0x08, 0xE0, + 0x36, 0xD5, 0xE1, 0xC9, 0x03, 0xD4, 0x00, 0x40, 0x21, 0xBC, 0x12, 0xB8, + 0x61, 0xE0, 0xEF, 0xDE, 0x07, 0x40, 0x1D, 0xBF, 0x22, 0xDB, 0x20, 0x40, + 0x00, 0x40, 0x30, 0xBD, 0x80, 0xE4, 0x01, 0x40, 0x8F, 0xBC, 0x23, 0xE4, + 0xA2, 0xC2, 0x60, 0xE0, 0x13, 0xE4, 0x81, 0xC1, 0xE0, 0xC2, 0x07, 0xD5, + 0x00, 0x40, 0x58, 0x64, 0x09, 0xA9, 0x09, 0x28, 0x02, 0x40, 0x80, 0xBD, + 0x09, 0x38, 0x00, 0x40, 0x58, 0x64, 0x08, 0xA8, 0x08, 0x29, 0xE0, 0xC9, + 0xD6, 0xD4, 0xE0, 0xC2, 0xCD, 0xDA, 0xC1, 0xC1, 0x06, 0xC2, 0xCA, 0xD4, + 0xFF, 0x7F, 0x1E, 0xBC, 0xC7, 0xDE, 0x21, 0xE4, 0x23, 0xBD, 0x00, 0xA1, + 0xE5, 0xDE, 0xE0, 0xC3, 0xB6, 0xD5, 0xFF, 0x5F, 0xFF, 0x7F, 0x0F, 0xA8, + 0xC1, 0xDE, 0xE2, 0xC9, 0xBE, 0xD4, 0x00, 0x40, 0x21, 0xBC, 0x12, 0xB8, + 0xBA, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0xFE, 0x7F, + 0x89, 0xDF, 0x28, 0xE4, 0x80, 0xE4, 0xFE, 0x7F, 0x89, 0xDF, 0x18, 0xE4, + 0x80, 0xE4, 0xFE, 0x7F, 0x8B, 0xDF, 0x38, 0xE4, 0x81, 0xE4, 0xF6, 0x7F, + 0x82, 0xB8, 0xE0, 0xC8, 0x1B, 0xD9, 0xC0, 0x73, 0x00, 0x40, 0x00, 0xBF, + 0x09, 0xD5, 0x01, 0xA8, 0xFE, 0x7F, 0x07, 0xDF, 0x83, 0xE4, 0x08, 0xE0, + 0x0B, 0xD5, 0x0F, 0x40, 0x1F, 0xBF, 0x06, 0xD5, 0x00, 0x60, 0x00, 0x40, + 0x00, 0xA8, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0xE0, 0xC2, 0xF8, 0xD5, + 0xFF, 0x5F, 0xFF, 0x7F, 0x0F, 0xA8, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x07, 0x40, 0x1E, 0xBF, 0x1B, 0xDB, 0x20, 0x40, 0x00, 0x40, 0x20, 0xBD, + 0x22, 0xC2, 0x00, 0xA0, 0x08, 0xBA, 0x12, 0xE4, 0x81, 0xC1, 0x01, 0x40, + 0x8F, 0xBC, 0xA2, 0xC2, 0x07, 0xD5, 0x00, 0x40, 0x58, 0x64, 0x09, 0xA9, + 0x09, 0x28, 0x02, 0x40, 0x80, 0xBD, 0x09, 0x38, 0x83, 0xE4, 0x08, 0xE0, + 0x01, 0xD5, 0x61, 0xE0, 0x81, 0xE4, 0x03, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x81, 0xE4, 0x82, 0xBD, 0x07, 0xD5, 0x00, 0x40, 0x58, 0x64, 0x09, 0xA9, + 0x09, 0x28, 0x02, 0x40, 0x80, 0xBD, 0x09, 0x38, 0x00, 0xA8, 0x03, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, 0xFC, 0xB6, 0x28, 0xE4, + 0xFE, 0x7F, 0x32, 0xDF, 0x08, 0xE4, 0x09, 0x40, 0x85, 0xBF, 0x08, 0xDB, + 0x0F, 0x40, 0x8F, 0xBF, 0x52, 0xD5, 0x92, 0xE4, 0x89, 0xE4, 0x04, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x07, 0x40, 0x8E, 0xBF, 0x24, 0xD8, 0x82, 0xE4, + 0x06, 0xC8, 0x92, 0xE4, 0xF5, 0xD5, 0x00, 0x40, 0x58, 0x64, 0x09, 0xA8, + 0x08, 0x29, 0x02, 0x40, 0x90, 0xBD, 0x08, 0x39, 0x82, 0xE4, 0xFE, 0x7F, + 0x1B, 0xDF, 0x38, 0xE4, 0x00, 0x40, 0x58, 0x64, 0x08, 0xA8, 0x08, 0x21, + 0xE1, 0xC1, 0x57, 0xD5, 0x00, 0x40, 0x60, 0xDB, 0xE2, 0xC1, 0x49, 0xD5, + 0x83, 0xE4, 0x08, 0xE0, 0x00, 0xA9, 0x83, 0x99, 0xFE, 0x7F, 0x21, 0xDF, + 0x98, 0xE4, 0x89, 0xE4, 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x01, 0xA9, + 0x09, 0x40, 0x06, 0xA8, 0x80, 0xBA, 0xA2, 0xC9, 0x39, 0xE4, 0xDF, 0xC3, + 0x02, 0xE4, 0x00, 0x40, 0x58, 0x64, 0x08, 0xA8, 0x08, 0x21, 0xE0, 0xC1, + 0x23, 0xD4, 0x89, 0xE4, 0x05, 0xC8, 0x08, 0xB8, 0x80, 0xE4, 0x83, 0xBC, + 0x02, 0xD4, 0x79, 0xE0, 0x09, 0xBC, 0x73, 0xE0, 0x03, 0xBC, 0x02, 0xBF, + 0x07, 0xD5, 0x00, 0x40, 0x58, 0x64, 0x09, 0xA9, 0x09, 0x28, 0x02, 0x40, + 0x80, 0xBD, 0x09, 0x38, 0x90, 0xE4, 0x89, 0xE4, 0x04, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x82, 0xE4, 0xFD, 0x7F, 0xD2, 0xDF, 0xE0, 0xC8, 0xA9, 0xD5, + 0x82, 0xE4, 0x92, 0xE4, 0xFD, 0x7F, 0x85, 0xDF, 0x98, 0xE4, 0xCB, 0xDE, + 0xE3, 0xC1, 0xE3, 0xD5, 0x82, 0xE4, 0xFD, 0x7F, 0xCF, 0xDF, 0x08, 0xE0, + 0xE2, 0xC1, 0x17, 0xD5, 0xE0, 0xC8, 0xDB, 0xD5, 0x02, 0xE4, 0x03, 0xB8, + 0xD8, 0xDE, 0x83, 0xE4, 0x08, 0xE0, 0x00, 0x60, 0x00, 0x40, 0x00, 0xA9, + 0x91, 0xD4, 0xE0, 0x4F, 0x00, 0x40, 0x00, 0xA9, 0x8D, 0xDE, 0x83, 0xE4, + 0x08, 0xE0, 0xE0, 0x6F, 0x00, 0x40, 0x00, 0xA9, 0x87, 0xD4, 0x98, 0xE4, + 0xAC, 0xDE, 0xE1, 0xC8, 0xE9, 0xD4, 0xC3, 0xDE, 0xE0, 0xC1, 0xA0, 0xD4, + 0x07, 0x40, 0x0E, 0xBF, 0x9D, 0xD4, 0x82, 0xE4, 0xFD, 0x7F, 0xA0, 0xDF, + 0xE0, 0xC8, 0x98, 0xD5, 0x83, 0xE4, 0x08, 0xE0, 0x83, 0x91, 0x7F, 0xA9, + 0xFD, 0x7F, 0xB9, 0xDF, 0x97, 0xDE, 0x20, 0xB5, 0x04, 0xB3, 0x5F, 0xB1, + 0xFA, 0xB6, 0x48, 0xE4, 0x69, 0xE4, 0x08, 0x40, 0x4A, 0xE8, 0xFD, 0x7F, + 0x8D, 0xDF, 0x18, 0xE4, 0x84, 0x98, 0x84, 0xE4, 0xFD, 0x7F, 0x8C, 0xDF, + 0x28, 0xE4, 0x86, 0xE4, 0xFD, 0x7F, 0x84, 0xDF, 0x08, 0xE4, 0x85, 0x98, + 0x86, 0xE4, 0xFD, 0x7F, 0x83, 0xDF, 0x38, 0xE4, 0x92, 0xE4, 0x98, 0xBA, + 0x1A, 0xC1, 0x1A, 0xC0, 0xE0, 0xC9, 0x32, 0xDB, 0x84, 0x91, 0x0F, 0x40, + 0x2F, 0xBF, 0x26, 0xD5, 0xE0, 0xC8, 0x21, 0xD5, 0x00, 0x48, 0x00, 0x40, + 0x00, 0xBD, 0x85, 0x90, 0x14, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x05, 0x98, + 0xFC, 0x7F, 0x2F, 0xDF, 0x12, 0xE4, 0x04, 0x98, 0x00, 0x48, 0x00, 0x40, + 0x80, 0xBD, 0x84, 0x98, 0x05, 0x99, 0x98, 0xB8, 0x09, 0xE4, 0x06, 0xC0, + 0xDF, 0xC1, 0xE0, 0xC0, 0x27, 0xD9, 0x8A, 0xE4, 0x08, 0xE0, 0x83, 0x90, + 0x91, 0xE4, 0xFD, 0x7F, 0x7F, 0xDF, 0x06, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, + 0x40, 0xB4, 0x85, 0x90, 0xDF, 0xC9, 0xE0, 0xDE, 0x85, 0x90, 0x84, 0xE4, + 0xE0, 0xC1, 0xF5, 0xD5, 0x96, 0xE4, 0xFD, 0x7F, 0x00, 0xDF, 0xF1, 0xDE, + 0x85, 0x90, 0xE0, 0xC9, 0x12, 0xD9, 0x84, 0x91, 0x0F, 0x40, 0x2F, 0xBF, + 0x1E, 0xD5, 0xE0, 0xC2, 0x1E, 0xD4, 0x8A, 0xE4, 0x08, 0xE0, 0x10, 0xB8, + 0x19, 0xC1, 0x83, 0x91, 0x92, 0xE4, 0xFD, 0x7F, 0x56, 0xDF, 0xDF, 0xDE, + 0x09, 0xE4, 0xC1, 0xC1, 0xD6, 0xDE, 0x0F, 0x40, 0x8F, 0xBF, 0x1A, 0xD5, + 0xE0, 0xC2, 0x13, 0xD4, 0x84, 0x91, 0xC1, 0xC9, 0x69, 0xE0, 0x10, 0x40, + 0xD8, 0xE1, 0x83, 0x98, 0x04, 0x98, 0xFB, 0x7F, 0xEA, 0xDF, 0x13, 0xE4, + 0xBA, 0xDE, 0x10, 0xBD, 0xD2, 0xDE, 0x01, 0xB8, 0x00, 0x50, 0x00, 0x40, + 0x00, 0xB8, 0x12, 0xE4, 0xBE, 0xDE, 0x00, 0x48, 0x00, 0x40, 0x10, 0xBD, + 0x84, 0x91, 0xEA, 0xDE, 0x84, 0x91, 0x84, 0xE4, 0xE0, 0xC0, 0xC6, 0xD4, + 0x8A, 0xE4, 0x08, 0xE0, 0x83, 0x90, 0x93, 0xE4, 0xFD, 0x7F, 0x2B, 0xDF, + 0xB4, 0xDE, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xFA, 0xB6, 0x68, 0xE4, + 0xA9, 0xE4, 0x12, 0x93, 0xB3, 0xE4, 0xFC, 0x7F, 0xFF, 0xDF, 0x18, 0xE4, + 0x85, 0x98, 0x86, 0xE4, 0xFC, 0x7F, 0xFE, 0xDF, 0x28, 0xE4, 0x8A, 0xE4, + 0xFC, 0x7F, 0xF6, 0xDF, 0x08, 0xE4, 0x84, 0x98, 0x8A, 0xE4, 0xFC, 0x7F, + 0xF5, 0xDF, 0x48, 0xE4, 0x92, 0xE4, 0x98, 0xBA, 0x1E, 0xC1, 0x1E, 0xC0, + 0xE0, 0xC9, 0x40, 0xD8, 0x84, 0x90, 0x1C, 0xD9, 0x85, 0x91, 0x0F, 0x40, + 0x2F, 0xBF, 0x00, 0x40, 0x63, 0xD5, 0xE0, 0xC2, 0x4F, 0xD5, 0x01, 0xBF, + 0x49, 0xD7, 0x10, 0xBF, 0x25, 0xD7, 0x00, 0xA0, 0x00, 0x40, 0x58, 0x64, + 0x08, 0xA8, 0x08, 0x28, 0xE1, 0xC8, 0x00, 0x40, 0x70, 0xD5, 0x00, 0xA9, + 0x83, 0x99, 0x80, 0xE4, 0xFC, 0x7F, 0xF1, 0xDF, 0x06, 0xB6, 0x5F, 0xB0, + 0x0C, 0xB2, 0x40, 0xB4, 0x0F, 0x40, 0x8F, 0xBF, 0x3F, 0xD5, 0xE0, 0xC2, + 0x56, 0xD4, 0x85, 0x91, 0xC1, 0xC9, 0x69, 0xE0, 0x14, 0x40, 0xD8, 0xE1, + 0x83, 0x98, 0x05, 0x98, 0xFB, 0x7F, 0x85, 0xDF, 0x04, 0x90, 0x00, 0x50, + 0x00, 0x40, 0x00, 0xBD, 0x84, 0x90, 0x05, 0x91, 0x01, 0xBA, 0x94, 0xE4, + 0x00, 0x40, 0xB1, 0xBE, 0xDF, 0xC9, 0x8B, 0xE4, 0x08, 0xE0, 0x83, 0x90, + 0xFD, 0x7F, 0x6E, 0xDF, 0x06, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, + 0x85, 0x91, 0x0F, 0x40, 0x2F, 0xBF, 0x30, 0xD5, 0xE0, 0xC8, 0x15, 0xD4, + 0x84, 0x90, 0xDF, 0xC9, 0x10, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x04, 0x98, + 0xFB, 0x7F, 0x63, 0xDF, 0x05, 0x91, 0x00, 0x50, 0x00, 0x40, 0x10, 0xBD, + 0x85, 0x91, 0x04, 0x90, 0x10, 0xBA, 0x01, 0xE4, 0x92, 0xE4, 0xDE, 0xDE, + 0x01, 0xA2, 0x42, 0xE4, 0xAE, 0xDE, 0x00, 0x50, 0x00, 0x40, 0x00, 0xBD, + 0x84, 0x90, 0xE8, 0xDE, 0x85, 0x91, 0xE0, 0xC0, 0x09, 0xD4, 0x00, 0x40, + 0x31, 0xBE, 0x83, 0xE4, 0x08, 0xE0, 0x83, 0x90, 0x94, 0xE4, 0xAE, 0xDE, + 0x10, 0xBD, 0x12, 0xD5, 0x86, 0xE4, 0x9A, 0xE4, 0xFC, 0x7F, 0x33, 0xDF, + 0x06, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x84, 0x90, 0x86, 0xE4, + 0xE0, 0xC1, 0xA2, 0xD5, 0xF4, 0xDE, 0x00, 0x50, 0x00, 0x40, 0x10, 0xBD, + 0x85, 0x91, 0xA7, 0xDE, 0x01, 0xA8, 0xFB, 0x7F, 0xFC, 0xDF, 0xF0, 0x7F, + 0x00, 0x40, 0x00, 0xA8, 0x95, 0xDE, 0x08, 0xE4, 0x8E, 0xDE, 0x20, 0xB5, + 0x07, 0xB1, 0xFC, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0xFC, 0x7F, 0x66, 0xDF, + 0x08, 0xE4, 0x82, 0xE4, 0xFC, 0x7F, 0x62, 0xDF, 0x00, 0xE0, 0x08, 0xE0, + 0x08, 0xBF, 0x08, 0xD5, 0x83, 0x90, 0x81, 0xE4, 0x92, 0xE4, 0xFF, 0x7F, + 0x46, 0xDF, 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x83, 0x90, 0x81, 0xE4, + 0x92, 0xE4, 0xFE, 0x7F, 0xB0, 0xDF, 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0x07, 0xB1, 0xFC, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0xFC, 0x7F, + 0x47, 0xDF, 0x08, 0xE4, 0x82, 0xE4, 0xFC, 0x7F, 0x43, 0xDF, 0x00, 0xE0, + 0x08, 0xE0, 0x08, 0xBF, 0x08, 0xD5, 0x83, 0x90, 0x81, 0xE4, 0x92, 0xE4, + 0xFE, 0x7F, 0x99, 0xDF, 0x04, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x83, 0x90, + 0x81, 0xE4, 0x92, 0xE4, 0xFF, 0x7F, 0x1F, 0xDF, 0x04, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xF5, 0xB6, 0x68, 0xE4, + 0xA9, 0xE4, 0xFC, 0x7F, 0x1D, 0xDF, 0x38, 0xE4, 0x8A, 0x98, 0x86, 0xE4, + 0xFC, 0x7F, 0x1C, 0xDF, 0x28, 0xE4, 0x89, 0x98, 0x86, 0xE4, 0xFC, 0x7F, + 0x1D, 0xDF, 0x08, 0xE4, 0x8A, 0xE4, 0xFC, 0x7F, 0x0F, 0xDF, 0x48, 0xE4, + 0x88, 0x98, 0x8A, 0xE4, 0xFC, 0x7F, 0x0E, 0xDF, 0x18, 0xE4, 0x87, 0x98, + 0x8A, 0xE4, 0xFC, 0x7F, 0x0F, 0xDF, 0xB0, 0xE4, 0xB8, 0xBE, 0x0F, 0x40, + 0x2F, 0xBF, 0x1A, 0xD5, 0x0F, 0x40, 0x1F, 0xBF, 0x25, 0xD5, 0xE0, 0xC2, + 0x0E, 0xD5, 0xE0, 0xC1, 0x40, 0xD4, 0xE0, 0xC4, 0x34, 0xD4, 0x8B, 0xE4, + 0x08, 0xE0, 0x83, 0x94, 0x94, 0xE4, 0xFC, 0x7F, 0x12, 0xDF, 0x0B, 0xB6, + 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0xE0, 0xC3, 0x1D, 0xD4, 0x8B, 0xE4, + 0x08, 0xE0, 0x83, 0x93, 0x93, 0xE4, 0xF3, 0xDE, 0xE0, 0xC3, 0x60, 0xD4, + 0x0F, 0x40, 0x1F, 0xBF, 0x5B, 0xD5, 0x14, 0xBD, 0x65, 0xD5, 0x8B, 0xE4, + 0x08, 0xE0, 0x00, 0xA9, 0x83, 0x99, 0x0F, 0x40, 0x0F, 0xA9, 0xE5, 0xDE, + 0xE0, 0xC4, 0x52, 0xD4, 0x82, 0xE4, 0x83, 0xBD, 0x59, 0xD5, 0x8B, 0xE4, + 0x08, 0xE0, 0x83, 0x94, 0x91, 0xE4, 0xDB, 0xDE, 0x28, 0x40, 0xD8, 0xE1, + 0x83, 0x98, 0x83, 0xE4, 0x24, 0x40, 0xD9, 0xE1, 0xFB, 0x7F, 0xD5, 0xDF, + 0x08, 0x94, 0x07, 0x91, 0xC8, 0xDE, 0x20, 0x40, 0xD8, 0xE1, 0x83, 0x98, + 0x84, 0xE4, 0x1C, 0x40, 0xD9, 0xE1, 0xFB, 0x7F, 0xCA, 0xDF, 0x08, 0x94, + 0x07, 0x91, 0x09, 0x92, 0x21, 0xB8, 0x12, 0xE4, 0xF8, 0x7F, 0x11, 0xB8, + 0x0A, 0x98, 0x20, 0x40, 0x00, 0x40, 0x80, 0xBD, 0x1E, 0xC8, 0x8A, 0x98, + 0x94, 0xE4, 0x20, 0x40, 0x00, 0x40, 0x90, 0xBD, 0x22, 0xC9, 0x88, 0x99, + 0x18, 0x40, 0xD0, 0xE1, 0x83, 0x90, 0xDC, 0xC0, 0x84, 0x90, 0xFA, 0x7F, + 0xA4, 0xDF, 0x06, 0x99, 0x09, 0xE4, 0x05, 0x98, 0xE0, 0xC8, 0x02, 0xD5, + 0x00, 0x40, 0x01, 0xBD, 0x90, 0xE4, 0x80, 0xE4, 0x06, 0xC8, 0xE0, 0xC8, + 0x19, 0xD9, 0x98, 0xE4, 0x86, 0x98, 0x12, 0xE4, 0xF8, 0x7F, 0x10, 0xB8, + 0x8B, 0xE4, 0x08, 0xE0, 0x83, 0x99, 0x91, 0xE4, 0xFB, 0x7F, 0xB4, 0xDF, + 0x0B, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0xE0, 0xC4, 0xA3, 0xD5, + 0x86, 0xE4, 0x9A, 0xE4, 0xFB, 0x7F, 0x39, 0xDF, 0x0B, 0xB6, 0x5F, 0xB0, + 0x0C, 0xB2, 0x40, 0xB4, 0x86, 0x90, 0xEA, 0xDE, 0x01, 0xA8, 0xFB, 0x7F, + 0x0A, 0xDF, 0xF0, 0x7F, 0x00, 0x40, 0x00, 0xA8, 0x82, 0xDE, 0x20, 0xB5, + 0x04, 0xB3, 0x5F, 0xB1, 0xF1, 0xB6, 0x68, 0xE4, 0xA9, 0xE4, 0xFB, 0x7F, + 0x6B, 0xDF, 0x38, 0xE4, 0x8C, 0x98, 0x86, 0xE4, 0xFB, 0x7F, 0x6A, 0xDF, + 0x28, 0xE4, 0x8B, 0x98, 0x86, 0xE4, 0xFB, 0x7F, 0x6B, 0xDF, 0x08, 0xE4, + 0x8A, 0xE4, 0xFB, 0x7F, 0x5D, 0xDF, 0x48, 0xE4, 0x8E, 0x98, 0x8A, 0xE4, + 0xFB, 0x7F, 0x5C, 0xDF, 0x18, 0xE4, 0x8D, 0x98, 0x8A, 0xE4, 0xFB, 0x7F, + 0x5D, 0xDF, 0x08, 0xBE, 0x0F, 0x40, 0x2F, 0xBF, 0x51, 0xD5, 0x0F, 0x40, + 0x1F, 0xBF, 0x58, 0xD5, 0xE0, 0xC1, 0x1D, 0xD4, 0xE0, 0xC4, 0x11, 0xD4, + 0x23, 0xBD, 0x00, 0x40, 0x98, 0xD5, 0x04, 0xA8, 0xFA, 0x7F, 0xD5, 0xDF, + 0x80, 0xE4, 0x08, 0xE0, 0x83, 0x94, 0x0F, 0x40, 0x0F, 0xA9, 0xFB, 0x7F, + 0x5C, 0xDF, 0x0F, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, 0x38, 0x40, + 0xD8, 0xE1, 0x83, 0x98, 0x84, 0xE4, 0x34, 0x40, 0xD9, 0xE1, 0xFB, 0x7F, + 0x3E, 0xDF, 0x0C, 0x93, 0x0B, 0x92, 0xE0, 0xC2, 0x3E, 0xD5, 0x0D, 0x98, + 0x92, 0xE4, 0x98, 0xBA, 0x29, 0xE4, 0x07, 0x40, 0x2D, 0xB8, 0x83, 0xE4, + 0x20, 0x40, 0x00, 0x40, 0x80, 0xBD, 0x38, 0xE4, 0x1E, 0xC3, 0x8C, 0x93, + 0x0E, 0x91, 0x20, 0x40, 0x00, 0x40, 0x10, 0xBD, 0x22, 0xC1, 0x8E, 0x91, + 0x22, 0xC8, 0x81, 0xBF, 0x03, 0xD7, 0x05, 0xC3, 0x8C, 0x93, 0xC1, 0xC2, + 0x83, 0x91, 0x0C, 0x98, 0x00, 0xA9, 0xFA, 0x7F, 0x34, 0xDF, 0x18, 0xE4, + 0x03, 0x40, 0x8F, 0xBC, 0xE2, 0xC8, 0x2C, 0xDD, 0x80, 0xE4, 0x08, 0xE0, + 0x83, 0x91, 0x92, 0xE4, 0xFB, 0x7F, 0x2C, 0xDF, 0x0F, 0xB6, 0x5F, 0xB0, + 0x04, 0xB2, 0x40, 0xB4, 0xE0, 0xC3, 0x18, 0xD4, 0x0F, 0x40, 0x1F, 0xBF, + 0x13, 0xD5, 0x80, 0xE4, 0x08, 0xE0, 0x83, 0x93, 0x92, 0xE4, 0xB7, 0xDE, + 0xE0, 0xC4, 0x0E, 0xD4, 0x80, 0xE4, 0x08, 0xE0, 0x83, 0x94, 0x94, 0xE4, + 0xB0, 0xDE, 0xE0, 0xC3, 0x46, 0xD4, 0x80, 0xE4, 0x08, 0xE0, 0x83, 0x93, + 0x93, 0xE4, 0xA9, 0xDE, 0xE0, 0xC4, 0x37, 0xD5, 0x86, 0xE4, 0x9A, 0xE4, + 0xFA, 0x7F, 0x99, 0xDF, 0x0F, 0xB6, 0x5F, 0xB0, 0x04, 0xB2, 0x40, 0xB4, + 0x28, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0xDC, 0xC8, 0x84, 0x98, 0x0E, 0x98, + 0x91, 0xE4, 0xF9, 0x7F, 0xD6, 0xDF, 0x0A, 0x98, 0x83, 0x98, 0x09, 0x98, + 0x84, 0x98, 0x20, 0x40, 0xD6, 0xE1, 0x85, 0x96, 0x1C, 0x40, 0xD4, 0xE1, + 0x86, 0x94, 0x0C, 0x98, 0x00, 0xA9, 0xF9, 0x7F, 0xB8, 0xDF, 0x08, 0x99, + 0xE0, 0xC9, 0x06, 0xD9, 0x07, 0x98, 0xE0, 0xC8, 0xB7, 0xD5, 0x00, 0x40, + 0x11, 0xBD, 0xB4, 0xDE, 0x00, 0xA3, 0xDF, 0xC1, 0x83, 0x93, 0x0E, 0x98, + 0x84, 0x98, 0x85, 0x96, 0x86, 0x94, 0x89, 0xE4, 0x07, 0x99, 0xF9, 0x7F, + 0x95, 0xDF, 0x08, 0x99, 0xE0, 0xC9, 0xF3, 0xD9, 0xEB, 0xDE, 0x01, 0xA8, + 0xFA, 0x7F, 0x3D, 0xDF, 0xF0, 0x7F, 0x00, 0x40, 0x00, 0xA8, 0xFF, 0x7F, + 0x6A, 0xDE, 0x30, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x83, 0xE4, 0x2C, 0x40, + 0xD9, 0xE1, 0xFA, 0x7F, 0xAC, 0xDF, 0x0C, 0x93, 0x0B, 0x92, 0xFF, 0x7F, + 0x6E, 0xDE, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x19, 0xE4, + 0xFA, 0x7F, 0x96, 0xDF, 0x0F, 0x40, 0x8F, 0xBF, 0x10, 0xD5, 0x81, 0xE4, + 0xFA, 0x7F, 0x90, 0xDF, 0x0F, 0x40, 0x8F, 0xBF, 0x20, 0xD5, 0x00, 0xA8, + 0x01, 0xBF, 0x03, 0xD5, 0x01, 0xBD, 0x06, 0xC0, 0x01, 0xD4, 0x01, 0xA8, + 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x80, 0xE4, 0xFA, 0x7F, 0x7C, 0xDF, + 0xE0, 0xC8, 0xEB, 0xD5, 0x80, 0xE4, 0xFA, 0x7F, 0x1C, 0xDF, 0x08, 0xE0, + 0x05, 0xD4, 0x81, 0xE4, 0xFA, 0x7F, 0x17, 0xDF, 0x08, 0xE0, 0x03, 0xD5, + 0x01, 0xA8, 0xFA, 0x7F, 0x00, 0xDF, 0x00, 0xA8, 0x03, 0xB6, 0x03, 0xB0, + 0x40, 0xB4, 0x81, 0xE4, 0xFA, 0x7F, 0x66, 0xDF, 0xE0, 0xC8, 0xDB, 0xD5, + 0xE9, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x29, 0xE4, + 0xFA, 0x7F, 0x60, 0xDF, 0x0F, 0x40, 0x8F, 0xBF, 0x1E, 0xD5, 0x82, 0xE4, + 0xFA, 0x7F, 0x5A, 0xDF, 0x0F, 0x40, 0x8F, 0xBF, 0x24, 0xD5, 0x81, 0xE4, + 0xFA, 0x7F, 0x5A, 0xDF, 0x08, 0xE4, 0x82, 0xE4, 0xFA, 0x7F, 0x56, 0xDF, + 0x00, 0xE0, 0x08, 0xE0, 0x08, 0xBF, 0x23, 0xD5, 0x00, 0xA8, 0xE0, 0xC0, + 0x04, 0xD5, 0x01, 0xA8, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x12, 0xBD, + 0x06, 0xC1, 0xF9, 0xD5, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x81, 0xE4, + 0xFA, 0x7F, 0x38, 0xDF, 0xE0, 0xC8, 0xDD, 0xD5, 0x01, 0xA8, 0xF9, 0x7F, + 0xC6, 0xDF, 0x00, 0xA8, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x82, 0xE4, + 0xFA, 0x7F, 0x2C, 0xDF, 0xE0, 0xC8, 0xD7, 0xD5, 0x01, 0xA8, 0xF9, 0x7F, + 0xBA, 0xDF, 0x00, 0xA8, 0xF3, 0xDE, 0x00, 0xA8, 0x12, 0xBF, 0xDD, 0xD5, + 0x03, 0xD6, 0xE1, 0xC0, 0xDA, 0xD4, 0xDA, 0xDE, 0xE0, 0xC0, 0xD8, 0xD5, + 0xD6, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x29, 0xE4, + 0xFA, 0x7F, 0x18, 0xDF, 0x0F, 0x40, 0x8F, 0xBF, 0x1B, 0xD5, 0x82, 0xE4, + 0xFA, 0x7F, 0x12, 0xDF, 0x0F, 0x40, 0x8F, 0xBF, 0x21, 0xD5, 0x81, 0xE4, + 0xFA, 0x7F, 0x12, 0xDF, 0x08, 0xE4, 0x82, 0xE4, 0xFA, 0x7F, 0x0E, 0xDF, + 0x00, 0xE0, 0x08, 0xE0, 0x08, 0xBF, 0x20, 0xD5, 0x00, 0xA8, 0xE0, 0xC0, + 0x04, 0xD5, 0x12, 0xBD, 0x06, 0xC1, 0x01, 0xD5, 0x01, 0xA8, 0x03, 0xB6, + 0x07, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0xF9, 0x7F, 0xF3, 0xDF, 0xE0, 0xC8, + 0xE0, 0xD5, 0x01, 0xA8, 0xF9, 0x7F, 0x81, 0xDF, 0x00, 0xA8, 0x03, 0xB6, + 0x07, 0xB0, 0x40, 0xB4, 0x82, 0xE4, 0xF9, 0x7F, 0xE7, 0xDF, 0xE0, 0xC8, + 0xDA, 0xD5, 0x01, 0xA8, 0xF9, 0x7F, 0x75, 0xDF, 0x00, 0xA8, 0xF3, 0xDE, + 0x00, 0xA8, 0x12, 0xBF, 0xE4, 0xD5, 0x03, 0xD6, 0xE1, 0xC0, 0xE0, 0xD4, + 0xE0, 0xDE, 0xE0, 0xC0, 0xDE, 0xD5, 0x01, 0xA8, 0xDC, 0xDE, 0x20, 0xB5, + 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x19, 0xE4, 0xF9, 0x7F, 0xD2, 0xDF, + 0x0F, 0x40, 0x8F, 0xBF, 0x10, 0xD5, 0x81, 0xE4, 0xF9, 0x7F, 0xCC, 0xDF, + 0x0F, 0x40, 0x8F, 0xBF, 0x16, 0xD5, 0x00, 0xA8, 0x01, 0xBF, 0x03, 0xD5, + 0x01, 0xBD, 0x06, 0xC0, 0x01, 0xD4, 0x01, 0xA8, 0x03, 0xB6, 0x03, 0xB0, + 0x40, 0xB4, 0x80, 0xE4, 0xF9, 0x7F, 0xB8, 0xDF, 0xE0, 0xC8, 0xEB, 0xD5, + 0x01, 0xA8, 0xF9, 0x7F, 0x46, 0xDF, 0x00, 0xA8, 0x03, 0xB6, 0x03, 0xB0, + 0x40, 0xB4, 0x81, 0xE4, 0xF9, 0x7F, 0xAC, 0xDF, 0xE0, 0xC8, 0xE5, 0xD5, + 0x01, 0xA8, 0xF9, 0x7F, 0x3A, 0xDF, 0x00, 0xA8, 0xF3, 0xDE, 0x20, 0xB5, + 0x07, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0xF9, 0x7F, 0xA2, 0xDF, + 0x0F, 0x40, 0x8F, 0xBF, 0x1E, 0xD5, 0x82, 0xE4, 0xF9, 0x7F, 0x9C, 0xDF, + 0x0F, 0x40, 0x8F, 0xBF, 0x2E, 0xD5, 0x81, 0xE4, 0xF9, 0x7F, 0x9C, 0xDF, + 0x08, 0xE4, 0x82, 0xE4, 0xF9, 0x7F, 0x98, 0xDF, 0x00, 0xE0, 0x08, 0xE0, + 0x08, 0xBF, 0x29, 0xD5, 0x00, 0xA8, 0xE0, 0xC0, 0x04, 0xD5, 0x01, 0xA8, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x12, 0xBD, 0x06, 0xC1, 0xF9, 0xD5, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0xF9, 0x7F, 0x7A, 0xDF, + 0xE0, 0xC8, 0xDD, 0xD5, 0x81, 0xE4, 0xF9, 0x7F, 0x1A, 0xDF, 0x08, 0xE0, + 0x05, 0xD4, 0x82, 0xE4, 0xF9, 0x7F, 0x15, 0xDF, 0x08, 0xE0, 0x03, 0xD5, + 0x01, 0xA8, 0xF8, 0x7F, 0xFE, 0xDF, 0x00, 0xA8, 0x03, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0x82, 0xE4, 0xF9, 0x7F, 0x64, 0xDF, 0xE0, 0xC8, 0xCD, 0xD5, + 0xE9, 0xDE, 0x00, 0xA8, 0x12, 0xBF, 0xD7, 0xD5, 0x03, 0xD6, 0xE1, 0xC0, + 0xD4, 0xD4, 0xD4, 0xDE, 0xE0, 0xC0, 0xD2, 0xD5, 0xD0, 0xDE, 0x20, 0xB5, + 0x07, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0xF9, 0x7F, 0x54, 0xDF, + 0x0F, 0x40, 0x8F, 0xBF, 0x1B, 0xD5, 0x82, 0xE4, 0xF9, 0x7F, 0x4E, 0xDF, + 0x0F, 0x40, 0x8F, 0xBF, 0x2B, 0xD5, 0x81, 0xE4, 0xF9, 0x7F, 0x4E, 0xDF, + 0x08, 0xE4, 0x82, 0xE4, 0xF9, 0x7F, 0x4A, 0xDF, 0x00, 0xE0, 0x08, 0xE0, + 0x08, 0xBF, 0x26, 0xD5, 0x00, 0xA8, 0xE0, 0xC0, 0x04, 0xD5, 0x12, 0xBD, + 0x06, 0xC1, 0x01, 0xD5, 0x01, 0xA8, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, + 0x81, 0xE4, 0xF9, 0x7F, 0x2F, 0xDF, 0xE0, 0xC8, 0xE0, 0xD5, 0x81, 0xE4, + 0xF8, 0x7F, 0xCF, 0xDF, 0x08, 0xE0, 0x05, 0xD4, 0x82, 0xE4, 0xF8, 0x7F, + 0xCA, 0xDF, 0x08, 0xE0, 0x03, 0xD5, 0x01, 0xA8, 0xF8, 0x7F, 0xB3, 0xDF, + 0x00, 0xA8, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x82, 0xE4, 0xF9, 0x7F, + 0x19, 0xDF, 0xE0, 0xC8, 0xD0, 0xD5, 0xE9, 0xDE, 0x00, 0xA8, 0x12, 0xBF, + 0xDE, 0xD5, 0x03, 0xD6, 0xE1, 0xC0, 0xDA, 0xD4, 0xDA, 0xDE, 0xE0, 0xC0, + 0xD8, 0xD5, 0x01, 0xA8, 0xD6, 0xDE, 0x20, 0xB5, 0x3C, 0xB3, 0x5F, 0xB1, + 0xFB, 0xB6, 0x00, 0xAC, 0x00, 0xAD, 0x28, 0xE4, 0x39, 0xE4, 0x69, 0xE4, + 0xA8, 0xE4, 0x89, 0xE4, 0x50, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x48, 0xE4, + 0xC0, 0x7F, 0x41, 0xB8, 0x01, 0x40, 0x43, 0xBF, 0x30, 0xD8, 0xE0, 0xC4, + 0x62, 0xD9, 0x03, 0x40, 0xFF, 0x7F, 0x0F, 0xAB, 0x90, 0xCB, 0x89, 0xE4, + 0x8B, 0xBC, 0x8A, 0xBD, 0x02, 0xE4, 0x13, 0xE4, 0x1E, 0xD5, 0x00, 0x62, + 0x59, 0x47, 0x0C, 0xA8, 0x8D, 0x5F, 0x43, 0x7E, 0x0C, 0xA9, 0x83, 0x98, + 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, 0x0D, 0x40, 0x67, 0xDF, 0x00, 0xA0, + 0x10, 0xE4, 0x83, 0x90, 0x84, 0x91, 0x0C, 0x40, 0x66, 0xDF, 0xE0, 0xC8, + 0x06, 0xDB, 0xE0, 0xC6, 0x00, 0x40, 0x71, 0xD9, 0x7B, 0xE0, 0x6B, 0xBC, + 0x00, 0xAA, 0xD6, 0xE4, 0xCA, 0xE4, 0x0C, 0xE4, 0x1D, 0xE4, 0x80, 0xE4, + 0x91, 0xE4, 0x05, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0x03, 0x40, + 0x43, 0xBF, 0x0E, 0xDB, 0x02, 0xE4, 0x13, 0xE4, 0x40, 0x40, 0x40, 0xBF, + 0xF2, 0xD4, 0x83, 0x92, 0x84, 0x93, 0x82, 0xE4, 0x93, 0xE4, 0x0D, 0x40, + 0x41, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0xE9, 0xDE, 0xBE, 0x7F, 0x8D, 0xB8, + 0xFF, 0xAB, 0x08, 0xE4, 0x81, 0xCB, 0x8A, 0xE4, 0x8B, 0xBC, 0x02, 0xE4, + 0x13, 0xE4, 0xDF, 0xD5, 0x00, 0x62, 0x59, 0x47, 0x0C, 0xA8, 0x8D, 0x5F, + 0x43, 0x7E, 0x0C, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, + 0x0D, 0x40, 0x28, 0xDF, 0x00, 0xA0, 0x10, 0xE4, 0x83, 0x90, 0x84, 0x91, + 0x0C, 0x40, 0x27, 0xDF, 0xE0, 0xC8, 0xC7, 0xDB, 0xE0, 0xC6, 0x1C, 0xD9, + 0x7B, 0xE0, 0xAB, 0xBC, 0xC2, 0xDE, 0x00, 0x62, 0x59, 0x47, 0x0C, 0xA8, + 0x8D, 0x5F, 0x43, 0x7E, 0x0C, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, + 0x93, 0xE4, 0x0D, 0x40, 0x0F, 0xDF, 0x00, 0xA0, 0x10, 0xE4, 0x83, 0x90, + 0x84, 0x91, 0x0C, 0x40, 0x0E, 0xDF, 0xE0, 0xC8, 0xAE, 0xDB, 0xE0, 0xC6, + 0x10, 0xD9, 0x00, 0xAA, 0x6A, 0xE4, 0xA9, 0xDE, 0x01, 0x40, 0x44, 0xBF, + 0x1A, 0xD5, 0x34, 0xA8, 0x84, 0xBA, 0x01, 0xA9, 0xA2, 0xC9, 0x9A, 0xB8, + 0xA9, 0xBF, 0x01, 0xDD, 0xC1, 0xC6, 0xA9, 0xE4, 0xD7, 0xDE, 0x86, 0xE4, + 0xFF, 0x5F, 0xFF, 0x7F, 0x8F, 0xBC, 0x8A, 0xBD, 0x96, 0xD5, 0xFC, 0x6F, + 0x00, 0x40, 0x00, 0xA6, 0x91, 0xDE, 0x04, 0x40, 0x00, 0x40, 0x00, 0xA8, + 0x90, 0xC8, 0x68, 0xB8, 0x89, 0xDE, 0xC1, 0xC6, 0xC5, 0xDE, 0x20, 0xB5, + 0xDC, 0xB3, 0x5F, 0xB1, 0xF2, 0xB6, 0xA8, 0xE4, 0xB9, 0xE4, 0x1D, 0x92, + 0x1E, 0x93, 0x83, 0x92, 0x84, 0x93, 0x01, 0x40, 0xE6, 0xDF, 0x08, 0xE4, + 0x19, 0xE4, 0x00, 0x40, 0x85, 0x62, 0x04, 0xA8, 0x08, 0x06, 0xFF, 0xC6, + 0x07, 0xD5, 0x82, 0xE4, 0x93, 0xE4, 0x08, 0x40, 0x8B, 0xDF, 0x48, 0xE4, + 0xE0, 0xC8, 0x06, 0xD5, 0x80, 0xE4, 0x91, 0xE4, 0x0E, 0xB6, 0x5F, 0xB0, + 0xDC, 0xB2, 0x40, 0xB4, 0x8A, 0xE4, 0x9B, 0xE4, 0x08, 0x40, 0x7E, 0xDF, + 0xC8, 0xE4, 0xE0, 0xC8, 0x2B, 0xD5, 0x00, 0xA8, 0x98, 0xE4, 0x83, 0x98, + 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, 0x0C, 0x40, 0x78, 0xDF, 0xE0, 0xC8, + 0xE9, 0xD4, 0x14, 0x40, 0xD9, 0xE1, 0x01, 0xA8, 0x09, 0x18, 0x00, 0x40, + 0x49, 0x63, 0x07, 0xA8, 0x86, 0x98, 0x8D, 0x94, 0x87, 0x9A, 0x88, 0x9B, + 0x89, 0x92, 0x8A, 0x93, 0xE2, 0xC6, 0x34, 0xD5, 0x8B, 0x9A, 0x8C, 0x9B, + 0x89, 0xE4, 0x08, 0x40, 0x6E, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0xA5, 0xD5, + 0x0D, 0x98, 0xE0, 0xC8, 0x04, 0xD5, 0x11, 0x40, 0xC0, 0xDF, 0x0D, 0x99, + 0x08, 0x19, 0x0B, 0x90, 0x0C, 0x91, 0xC8, 0xDE, 0x00, 0xAE, 0xFE, 0xE4, + 0x83, 0x9E, 0x84, 0x9F, 0x8A, 0xE4, 0x9B, 0xE4, 0x0C, 0x40, 0x4D, 0xDF, + 0xE0, 0xC8, 0x4F, 0xD4, 0x83, 0x9E, 0x84, 0x9F, 0x82, 0xE4, 0x93, 0xE4, + 0x0C, 0x40, 0x45, 0xDF, 0xE0, 0xC8, 0x19, 0xD4, 0x14, 0x40, 0xD9, 0xE1, + 0x01, 0xA8, 0x09, 0x18, 0x00, 0x40, 0x49, 0x63, 0x07, 0xA8, 0x86, 0x98, + 0x8D, 0x9C, 0x87, 0x9A, 0x88, 0x9B, 0x89, 0x92, 0x8A, 0x93, 0xE0, 0xC6, + 0x00, 0x40, 0x7F, 0xD5, 0x00, 0xA8, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA9, + 0x8B, 0x98, 0x8C, 0x99, 0x0B, 0x90, 0x0C, 0x91, 0x9D, 0xDE, 0x82, 0xE4, + 0x93, 0xE4, 0x08, 0x40, 0x16, 0xDF, 0xE0, 0xC8, 0x97, 0xD5, 0x83, 0x9E, + 0x84, 0x9F, 0x82, 0xE4, 0x93, 0xE4, 0x0B, 0x40, 0xBD, 0xDF, 0x88, 0xB8, + 0x8F, 0xD6, 0x14, 0x40, 0xD0, 0xE1, 0x01, 0xA8, 0x00, 0x18, 0x00, 0x40, + 0x49, 0x63, 0x07, 0xA8, 0x86, 0x98, 0x8D, 0x9C, 0x87, 0x9A, 0x88, 0x9B, + 0x89, 0x92, 0x8A, 0x93, 0x00, 0xA8, 0xFC, 0x7F, 0x00, 0x40, 0x00, 0xA9, + 0xE0, 0xC6, 0x0A, 0xD5, 0x8B, 0x98, 0x8C, 0x99, 0x00, 0x40, 0x85, 0x62, + 0x04, 0xA9, 0x09, 0x08, 0xE2, 0xC8, 0x47, 0xD5, 0x80, 0xE4, 0x9B, 0xDE, + 0x8B, 0x9E, 0x8C, 0x9F, 0xF5, 0xDE, 0x80, 0xE4, 0x91, 0xE4, 0x07, 0x40, + 0xE8, 0xDF, 0x48, 0xE4, 0xE0, 0xC8, 0x45, 0xD5, 0x00, 0xAE, 0xFE, 0xE4, + 0x83, 0x9E, 0x84, 0x9F, 0x80, 0xE4, 0x91, 0xE4, 0x0B, 0x40, 0xED, 0xDF, + 0xE0, 0xC8, 0xFF, 0x7F, 0x5D, 0xD4, 0x8A, 0xE4, 0x9B, 0xE4, 0x07, 0x40, + 0xD6, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, 0x56, 0xD5, 0x82, 0xE4, 0x93, 0xE4, + 0x07, 0x40, 0xCF, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, 0x4F, 0xD5, 0x14, 0x40, + 0xD9, 0xE1, 0x04, 0xA8, 0x09, 0x18, 0x00, 0x40, 0x49, 0x63, 0x07, 0xA8, + 0x86, 0x98, 0x00, 0xA8, 0x8D, 0x98, 0x87, 0x9A, 0x88, 0x9B, 0x89, 0x92, + 0x8A, 0x93, 0x8B, 0x9E, 0x8C, 0x9F, 0x00, 0x40, 0x85, 0x62, 0x04, 0xA0, + 0x00, 0x08, 0xE2, 0xC8, 0x06, 0xD5, 0x89, 0xE4, 0x07, 0x40, 0xCF, 0xDF, + 0xE0, 0xC8, 0xFF, 0x7F, 0x61, 0xD4, 0x11, 0x40, 0x24, 0xDF, 0x22, 0xA9, + 0x08, 0x19, 0xFF, 0x7F, 0x5B, 0xDE, 0x11, 0x40, 0x1E, 0xDF, 0x21, 0xA9, + 0x08, 0x19, 0xFF, 0x7F, 0x55, 0xDE, 0x8B, 0x9E, 0x8C, 0x9F, 0xFF, 0x7F, + 0x4B, 0xDE, 0x8A, 0xE4, 0x9B, 0xE4, 0x07, 0x40, 0x9C, 0xDF, 0xE0, 0xC8, + 0xB5, 0xD5, 0x82, 0xE4, 0x93, 0xE4, 0x07, 0x40, 0x96, 0xDF, 0xE0, 0xC8, + 0xAF, 0xD5, 0x80, 0xE4, 0x91, 0xE4, 0x07, 0x40, 0x9B, 0xDF, 0x98, 0xE4, + 0xE0, 0xC8, 0x17, 0xD5, 0x14, 0x40, 0xD0, 0xE1, 0x01, 0xA8, 0x00, 0x18, + 0x00, 0x40, 0x49, 0x63, 0x07, 0xA8, 0x86, 0x98, 0x8D, 0x94, 0x87, 0x9A, + 0x88, 0x9B, 0x89, 0x92, 0x8A, 0x93, 0xE0, 0xC6, 0x8F, 0xD5, 0x83, 0x9E, + 0x84, 0x9F, 0x8E, 0xE4, 0x9F, 0xE4, 0x0F, 0x40, 0x23, 0xDF, 0xFF, 0x7F, + 0x7D, 0xDE, 0x14, 0x40, 0xD0, 0xE1, 0x03, 0xA8, 0x00, 0x18, 0x00, 0x40, + 0x49, 0x63, 0x07, 0xA8, 0x86, 0x98, 0x8D, 0x99, 0x87, 0x9A, 0x88, 0x9B, + 0x89, 0x92, 0x8A, 0x93, 0xE0, 0xC6, 0x24, 0xD4, 0x00, 0x78, 0x00, 0x40, + 0x00, 0xA8, 0xFB, 0x51, 0xFF, 0x7F, 0x0F, 0xA9, 0x8B, 0x98, 0x8C, 0x99, + 0x00, 0xA8, 0xF8, 0x4F, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, + 0x82, 0xE4, 0x93, 0xE4, 0x0D, 0x40, 0x8B, 0xDF, 0x28, 0xE4, 0x39, 0xE4, + 0x83, 0x9E, 0x84, 0x9F, 0x8A, 0xE4, 0x9B, 0xE4, 0x0A, 0x40, 0xFC, 0xDF, + 0x88, 0xB8, 0x33, 0xD7, 0x00, 0x40, 0x85, 0x62, 0x04, 0xA9, 0x09, 0x08, + 0xE2, 0xC8, 0x95, 0xD5, 0x80, 0xE4, 0x8E, 0xDE, 0x00, 0xA8, 0xFC, 0x5F, + 0x00, 0x40, 0x00, 0xA9, 0x8B, 0x98, 0x8C, 0x99, 0x00, 0xA8, 0xF8, 0x4F, + 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, + 0x0D, 0x40, 0x69, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x83, 0x9E, 0x84, 0x9F, + 0x8A, 0xE4, 0x9B, 0xE4, 0x0A, 0x40, 0xDA, 0xDF, 0x88, 0xB8, 0xDE, 0xD6, + 0x82, 0xE4, 0x93, 0xE4, 0x07, 0x40, 0x45, 0xDF, 0x83, 0x92, 0x84, 0x93, + 0x09, 0x40, 0xE0, 0xDF, 0xE0, 0xC8, 0xD4, 0xD5, 0x00, 0xA8, 0xFC, 0x7F, + 0x00, 0x40, 0x00, 0xA9, 0x8B, 0x98, 0x8C, 0x99, 0xCD, 0xDE, 0x82, 0xE4, + 0x93, 0xE4, 0x07, 0x40, 0x34, 0xDF, 0x83, 0x92, 0x84, 0x93, 0x09, 0x40, + 0xCF, 0xDF, 0xE0, 0xC8, 0xC3, 0xD5, 0x00, 0x78, 0x00, 0x40, 0x00, 0xA8, + 0xFB, 0x71, 0xFF, 0x7F, 0x0F, 0xA9, 0xEC, 0xDE, 0x20, 0xB5, 0x0C, 0xB3, + 0x5F, 0xB1, 0xF2, 0xB6, 0x08, 0xE4, 0x19, 0xE4, 0x06, 0x40, 0x1E, 0xDF, + 0x28, 0xE4, 0x39, 0xE4, 0x00, 0x40, 0x85, 0x62, 0x04, 0xA8, 0x08, 0x04, + 0xFF, 0xC4, 0x07, 0xD5, 0x80, 0xE4, 0x91, 0xE4, 0x06, 0x40, 0xFE, 0xDF, + 0x68, 0xE4, 0xE0, 0xC8, 0x06, 0xD5, 0x82, 0xE4, 0x93, 0xE4, 0x0E, 0xB6, + 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x00, 0xAA, 0xBA, 0xE4, 0x83, 0x9A, + 0x84, 0x9B, 0x80, 0xE4, 0x91, 0xE4, 0x0A, 0x40, 0x91, 0xDF, 0x88, 0xB8, + 0xF0, 0xD6, 0x14, 0x40, 0xD2, 0xE1, 0x01, 0xA8, 0x02, 0x18, 0x00, 0x40, + 0x49, 0x63, 0x0B, 0xA8, 0x86, 0x98, 0x8D, 0x96, 0x89, 0x90, 0x8A, 0x91, + 0x87, 0x90, 0x88, 0x91, 0xE0, 0xC4, 0x16, 0xD4, 0x8B, 0x9A, 0x8C, 0x9B, + 0x00, 0x40, 0x85, 0x62, 0x04, 0xA9, 0x09, 0x08, 0xE2, 0xC8, 0x1E, 0xD5, + 0x82, 0xE4, 0x06, 0x40, 0xE2, 0xDF, 0xE0, 0xC8, 0x19, 0xD5, 0x0D, 0x98, + 0xE0, 0xC8, 0x0F, 0xD4, 0x0B, 0x98, 0x0C, 0x99, 0x0E, 0xB6, 0x5F, 0xB0, + 0x0C, 0xB2, 0x40, 0xB4, 0x83, 0x9A, 0x84, 0x9B, 0x8A, 0xE4, 0x9B, 0xE4, + 0x0E, 0x40, 0x60, 0xDF, 0x8B, 0x98, 0x8C, 0x99, 0xE3, 0xDE, 0x10, 0x40, + 0x26, 0xDF, 0x0D, 0x99, 0x08, 0x19, 0x0B, 0x98, 0x0C, 0x99, 0xEC, 0xDE, + 0x10, 0x40, 0x1F, 0xDF, 0x21, 0xA9, 0x08, 0x19, 0xE2, 0xDE, 0x20, 0xB5, + 0xFC, 0xB3, 0x5F, 0xB1, 0xE9, 0xB6, 0xC8, 0xE4, 0xD9, 0xE4, 0x08, 0xE4, + 0x19, 0xE4, 0xF1, 0xE4, 0x88, 0x98, 0x27, 0x92, 0x28, 0x93, 0x63, 0xE4, + 0x92, 0xE4, 0xE1, 0xE4, 0xFF, 0x5F, 0xFF, 0x7F, 0xEF, 0xBC, 0x43, 0xE4, + 0xFF, 0x5F, 0xFF, 0x7F, 0x4F, 0xBC, 0x84, 0xE4, 0x82, 0xBD, 0x00, 0xAA, + 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xAB, 0x2C, 0xD5, 0xFC, 0x5F, 0x00, 0x40, + 0xE0, 0xBF, 0x30, 0xD8, 0x38, 0xD5, 0xFC, 0x5F, 0x00, 0x40, 0x40, 0xBF, + 0x2B, 0xD8, 0x28, 0xD5, 0x00, 0xA1, 0x89, 0x91, 0xE0, 0xCF, 0x00, 0x40, + 0x99, 0xD9, 0xE0, 0xC9, 0x2F, 0xD4, 0xFC, 0x5F, 0x00, 0x40, 0x40, 0xBF, + 0x00, 0x40, 0x9A, 0xD5, 0xFC, 0x4F, 0x00, 0x40, 0x40, 0xBF, 0x00, 0x40, + 0x6A, 0xD5, 0x00, 0x50, 0x00, 0x40, 0x60, 0xBF, 0x04, 0x40, 0x69, 0xD5, + 0xF8, 0x4F, 0x00, 0x40, 0x60, 0xBF, 0x1C, 0xD4, 0xE0, 0xCF, 0x1A, 0xD9, + 0x8C, 0xE4, 0x9D, 0xE4, 0x05, 0x40, 0x7E, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, + 0x8A, 0xE4, 0x9B, 0xE4, 0x17, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, + 0xE0, 0xC2, 0xD6, 0xD5, 0x27, 0x90, 0x28, 0x91, 0x83, 0x90, 0x84, 0x91, + 0x8C, 0xE4, 0x9D, 0xE4, 0x0A, 0x40, 0x98, 0xDF, 0xED, 0xDE, 0xE0, 0xCC, + 0xF5, 0xD4, 0xC5, 0xDE, 0x8C, 0xE4, 0x9D, 0xE4, 0x06, 0x40, 0x3C, 0xDF, + 0x28, 0xE4, 0x39, 0xE4, 0x08, 0x98, 0xE0, 0xC8, 0x12, 0xD4, 0xFC, 0x5F, + 0x00, 0x40, 0xE0, 0xBF, 0x06, 0xD5, 0xE0, 0xCE, 0x04, 0xD5, 0xFC, 0x4F, + 0x00, 0x40, 0xE0, 0xBF, 0x08, 0xD4, 0xE0, 0xC6, 0x04, 0x40, 0x74, 0xD9, + 0xE0, 0xCF, 0x3A, 0xD9, 0xA2, 0xE4, 0xB3, 0xE4, 0xD1, 0xDE, 0x7D, 0xCF, + 0x85, 0x9F, 0x8F, 0xE4, 0xDF, 0xC8, 0x09, 0x91, 0x81, 0xBD, 0x18, 0xD5, + 0x78, 0x50, 0x00, 0x40, 0x40, 0xBF, 0x00, 0x40, 0x79, 0xDB, 0xFC, 0x50, + 0x00, 0x40, 0x40, 0xBF, 0x04, 0x40, 0x6A, 0xDB, 0xFB, 0x4F, 0xFF, 0x7F, + 0xEF, 0xBF, 0x04, 0x40, 0x6E, 0xD8, 0x00, 0xA8, 0xFC, 0x5F, 0x00, 0x40, + 0x00, 0xA9, 0xE0, 0xC6, 0xB3, 0xD9, 0x00, 0xA8, 0x98, 0xE4, 0xB0, 0xDE, + 0x83, 0x9C, 0x84, 0x9D, 0x8C, 0xE4, 0x9D, 0xE4, 0x0C, 0x40, 0x13, 0xDF, + 0x83, 0x98, 0x84, 0x99, 0x0D, 0x40, 0xB0, 0xDF, 0xA5, 0xDE, 0xAC, 0xE4, + 0xBD, 0xE4, 0xE0, 0xC6, 0xA3, 0xDA, 0x83, 0x9C, 0x84, 0x9D, 0x00, 0xA8, + 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA9, 0x0D, 0x40, 0xA3, 0xDF, 0x98, 0xDE, + 0x04, 0x70, 0x00, 0x40, 0xE0, 0xB8, 0x09, 0x99, 0xE9, 0xBD, 0x04, 0x40, + 0x73, 0xD4, 0x83, 0x92, 0x84, 0x93, 0x82, 0xE4, 0x93, 0xE4, 0x0B, 0x40, + 0xF4, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x0D, 0x40, 0x91, 0xDF, 0x28, 0xE4, + 0x39, 0xE4, 0xA2, 0xE4, 0xB3, 0xE4, 0x84, 0xDE, 0xCF, 0x50, 0xFF, 0x7F, + 0x4F, 0xBF, 0x16, 0xDB, 0x02, 0xA2, 0x89, 0x92, 0xFF, 0x7F, 0x5F, 0xDE, + 0x8E, 0xE4, 0x04, 0x70, 0x00, 0x40, 0x80, 0xB8, 0x08, 0x91, 0x81, 0xBD, + 0x03, 0x40, 0xD9, 0xD4, 0x27, 0x92, 0x28, 0x93, 0x83, 0x92, 0x84, 0x93, + 0x82, 0xE4, 0x93, 0xE4, 0x0B, 0x40, 0xD3, 0xDF, 0xFF, 0x7F, 0x68, 0xDE, + 0xFB, 0x4F, 0xFF, 0x7F, 0x4F, 0xBF, 0xFF, 0x7F, 0x48, 0xDB, 0x14, 0xE4, + 0x50, 0xC1, 0xC0, 0x7F, 0x11, 0xB8, 0x8A, 0x91, 0x01, 0x40, 0x14, 0xBF, + 0x04, 0x40, 0x28, 0xDB, 0x34, 0xA0, 0x01, 0xBA, 0xA9, 0xE4, 0x81, 0xCA, + 0x8A, 0xE4, 0x82, 0xC8, 0x89, 0xBF, 0xFF, 0x7F, 0x36, 0xD4, 0x00, 0x40, + 0xA1, 0xBC, 0x02, 0xA2, 0x2A, 0xBA, 0x89, 0x92, 0xFF, 0x7F, 0x2F, 0xDE, + 0x00, 0xA6, 0x03, 0x40, 0xFF, 0x7F, 0xEF, 0xBF, 0x0E, 0xD8, 0x00, 0xA8, + 0xD0, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, + 0x93, 0xE4, 0x0B, 0x40, 0xD0, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0xCB, 0xA6, + 0xE9, 0xE4, 0x8E, 0xE4, 0x50, 0xC8, 0x86, 0xB8, 0x68, 0xE4, 0xC0, 0x7F, + 0x61, 0xB8, 0xAE, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0xAF, 0xBC, 0xEA, 0xE4, + 0xFC, 0x4F, 0x00, 0x40, 0xE0, 0xBD, 0x00, 0xA1, 0x8A, 0x91, 0x00, 0x40, + 0x88, 0x79, 0xAE, 0xBF, 0x0B, 0xDB, 0x01, 0xA9, 0x8A, 0x99, 0x02, 0x40, + 0x67, 0x7B, 0xA9, 0xBF, 0x05, 0xDB, 0x8A, 0x91, 0x69, 0xB8, 0xFC, 0x7F, + 0x00, 0x40, 0xE0, 0xB8, 0x82, 0xE4, 0x93, 0xE4, 0x9E, 0xE4, 0x28, 0xE4, + 0x39, 0xE4, 0x0A, 0x94, 0x0E, 0xC4, 0x84, 0xE4, 0x00, 0x40, 0x73, 0x62, + 0x8C, 0xB8, 0x08, 0x00, 0x18, 0x01, 0x83, 0x90, 0x84, 0x91, 0x82, 0xE4, + 0x93, 0xE4, 0x0B, 0x40, 0x6E, 0xDF, 0x8D, 0x98, 0x8E, 0x99, 0x83, 0x92, + 0x84, 0x93, 0x80, 0xE4, 0x91, 0xE4, 0x09, 0x40, 0xA7, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x00, 0xA8, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA9, 0x0C, 0x40, + 0xFF, 0xDF, 0x8B, 0x98, 0x8C, 0x99, 0x83, 0x98, 0x84, 0x99, 0x0D, 0x98, + 0x0E, 0x99, 0x0B, 0x40, 0x82, 0xDF, 0x91, 0x98, 0x92, 0x99, 0xC8, 0xE4, + 0xD9, 0xE4, 0x00, 0xAC, 0xAC, 0xE4, 0xBD, 0xE4, 0x00, 0xA8, 0x98, 0xE4, + 0x04, 0xCE, 0x00, 0x48, 0x00, 0x40, 0xE0, 0xBD, 0x0A, 0x9F, 0x4A, 0xCF, + 0xEF, 0xB8, 0x9E, 0xE4, 0x02, 0x40, 0x00, 0x40, 0x90, 0xB8, 0xE8, 0xE4, + 0xF9, 0xE4, 0x83, 0x90, 0x84, 0x91, 0x0B, 0x40, 0x3C, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, 0x0B, 0x40, 0x36, 0xDF, 0x28, 0xE4, + 0x39, 0xE4, 0x83, 0x9E, 0x84, 0x9F, 0x8A, 0xE4, 0x9B, 0xE4, 0x0B, 0x40, + 0x5A, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x0D, 0x98, 0x0E, 0x99, 0x0B, 0x40, + 0x28, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0x83, 0x92, 0x84, 0x93, 0x8A, 0xE4, + 0x9B, 0xE4, 0x0B, 0x40, 0x4C, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x80, 0xE4, + 0x91, 0xE4, 0x0B, 0x40, 0x1A, 0xDF, 0x0B, 0x90, 0x0C, 0x91, 0x83, 0x90, + 0x84, 0x91, 0x0B, 0x40, 0x40, 0xDF, 0x86, 0x98, 0x87, 0x99, 0x11, 0x92, + 0x12, 0x93, 0x83, 0x92, 0x84, 0x93, 0x82, 0xE4, 0x93, 0xE4, 0x0B, 0x40, + 0x36, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x83, 0x98, 0x84, 0x99, 0x0B, 0x40, + 0x30, 0xDF, 0xE8, 0xE4, 0xF9, 0xE4, 0x91, 0x52, 0xEE, 0x54, 0x0F, 0xA8, + 0xF2, 0x4F, 0xE2, 0x67, 0x08, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, + 0x93, 0xE4, 0x0B, 0x40, 0x22, 0xDF, 0xF2, 0x64, 0xB6, 0x5D, 0x05, 0xA0, + 0xF3, 0x4F, 0x64, 0x58, 0x0A, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x09, 0x40, + 0x2D, 0xDF, 0x83, 0x92, 0x84, 0x93, 0x0B, 0x40, 0x14, 0xDF, 0x47, 0x6A, + 0x10, 0x54, 0x01, 0xA0, 0xF4, 0x4F, 0x46, 0x57, 0x00, 0xA1, 0x83, 0x90, + 0x84, 0x91, 0x09, 0x40, 0x1F, 0xDF, 0x83, 0x92, 0x84, 0x93, 0x0B, 0x40, + 0x06, 0xDF, 0x63, 0x54, 0x64, 0x72, 0x0D, 0xA0, 0xF5, 0x4F, 0x55, 0x55, + 0x05, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x09, 0x40, 0x11, 0xDF, 0x83, 0x92, + 0x84, 0x93, 0x0A, 0x40, 0xF8, 0xDF, 0xDB, 0x76, 0xBF, 0x7A, 0x0F, 0xA0, + 0xF6, 0x4F, 0xDB, 0x76, 0x06, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x09, 0x40, + 0x03, 0xDF, 0x83, 0x92, 0x84, 0x93, 0x0A, 0x40, 0xEA, 0xDF, 0xCC, 0x4C, + 0x30, 0x73, 0x03, 0xA0, 0xF8, 0x4F, 0x33, 0x73, 0x03, 0xA1, 0x83, 0x90, + 0x84, 0x91, 0x08, 0x40, 0xF5, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x8E, 0xE4, + 0x9F, 0xE4, 0x0A, 0x40, 0xDA, 0xDF, 0x93, 0x98, 0x94, 0x99, 0x11, 0x98, + 0x12, 0x99, 0x83, 0x98, 0x84, 0x99, 0x8A, 0xE4, 0x9B, 0xE4, 0x08, 0x40, + 0xE5, 0xDF, 0x06, 0x9E, 0x07, 0x9F, 0x83, 0x9E, 0x84, 0x9F, 0x0A, 0x40, + 0xCA, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x13, 0x98, 0x14, 0x99, 0x08, 0x40, + 0xD9, 0xDF, 0x93, 0x98, 0x94, 0x99, 0x83, 0x9A, 0x84, 0x9B, 0x8A, 0xE4, + 0x9B, 0xE4, 0x0A, 0x40, 0xBC, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x00, 0xA0, + 0x02, 0x50, 0x00, 0x40, 0x00, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x08, 0x40, + 0xC7, 0xDF, 0x13, 0x9E, 0x14, 0x9F, 0x83, 0x9E, 0x84, 0x9F, 0x08, 0x40, + 0xC1, 0xDF, 0x8C, 0xE4, 0xE8, 0xE4, 0xF9, 0xE4, 0x83, 0x90, 0x84, 0x91, + 0x8E, 0xE4, 0x9F, 0xE4, 0x0A, 0x40, 0x77, 0xDF, 0x83, 0x92, 0x84, 0x93, + 0x0A, 0x40, 0x73, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x13, 0x98, 0x14, 0x99, + 0x0A, 0x40, 0x6D, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x83, 0x9E, 0x84, 0x9F, + 0x8A, 0xE4, 0x9B, 0xE4, 0x0A, 0x40, 0x91, 0xDF, 0x8D, 0x98, 0x8E, 0x99, + 0x83, 0x9E, 0x84, 0x9F, 0x06, 0x98, 0x07, 0x99, 0x0A, 0x40, 0x89, 0xDF, + 0x08, 0xE4, 0x19, 0xE4, 0x11, 0x98, 0x12, 0x99, 0x83, 0x98, 0x84, 0x99, + 0x82, 0xE4, 0x93, 0xE4, 0x0A, 0x40, 0x7F, 0xDF, 0x83, 0x98, 0x84, 0x99, + 0x80, 0xE4, 0x91, 0xE4, 0x08, 0x40, 0x8E, 0xDF, 0x8B, 0x98, 0x8C, 0x99, + 0x83, 0x98, 0x84, 0x99, 0x0D, 0x98, 0x0E, 0x99, 0x08, 0x40, 0x86, 0xDF, + 0x8C, 0xE4, 0xE8, 0xE4, 0xF9, 0xE4, 0x0D, 0x90, 0x0E, 0x91, 0x83, 0x90, + 0x84, 0x91, 0x8E, 0xE4, 0x9F, 0xE4, 0x0A, 0x40, 0x3A, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x0B, 0x98, 0x0C, 0x99, 0x0A, 0x40, 0x34, 0xDF, 0x95, 0x98, + 0x96, 0x99, 0x00, 0x78, 0x00, 0x40, 0x00, 0xA8, 0xFB, 0x4F, 0x70, 0x6C, + 0x09, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x8E, 0xE4, 0x9F, 0xE4, 0x0A, 0x40, + 0x52, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, 0x16, 0x45, 0x1F, 0x70, 0x05, 0xA8, + 0x8F, 0x6F, 0xFE, 0x62, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x8E, 0xE4, + 0x9F, 0xE4, 0x0A, 0x40, 0x44, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0x0E, 0x77, + 0x3F, 0x60, 0x0D, 0xA8, 0xFB, 0x4F, 0x70, 0x6C, 0x09, 0xA9, 0x83, 0x98, + 0x84, 0x99, 0x15, 0x98, 0x16, 0x99, 0x0A, 0x40, 0x36, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0x08, 0x40, 0x45, 0xDF, 0x04, 0xE4, + 0x00, 0x40, 0x75, 0x62, 0x0C, 0xB8, 0x10, 0x01, 0x00, 0x00, 0x83, 0x90, + 0x84, 0x91, 0x08, 0x40, 0x3B, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x86, 0xE4, + 0x0A, 0x40, 0x0D, 0xDF, 0x8F, 0x98, 0x90, 0x99, 0x83, 0x92, 0x84, 0x93, + 0x8A, 0xE4, 0x9B, 0xE4, 0x08, 0x40, 0x2E, 0xDF, 0x00, 0x40, 0x74, 0x62, + 0x4C, 0xB8, 0x04, 0x00, 0x14, 0x01, 0x83, 0x90, 0x84, 0x91, 0x08, 0x40, + 0x25, 0xDF, 0x0F, 0x9E, 0x10, 0x9F, 0x83, 0x9E, 0x84, 0x9F, 0x08, 0x40, + 0x1F, 0xDF, 0x8C, 0xE4, 0xE8, 0xE4, 0xF9, 0xE4, 0x0F, 0x98, 0x10, 0x99, + 0x83, 0x98, 0x84, 0x99, 0x8E, 0xE4, 0x9F, 0xE4, 0x09, 0x40, 0xD3, 0xDF, + 0x83, 0x90, 0x84, 0x91, 0x09, 0x40, 0xCF, 0xDF, 0x83, 0x9A, 0x84, 0x9B, + 0x09, 0x40, 0xCB, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, + 0x09, 0x40, 0xC5, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, 0x00, 0xA0, 0xFC, 0x4F, + 0x00, 0x40, 0x00, 0xA1, 0x91, 0x90, 0x92, 0x91, 0x05, 0x98, 0xDF, 0xC8, + 0x09, 0x91, 0xDF, 0xC1, 0x81, 0xBD, 0x06, 0xD4, 0x00, 0xA2, 0xFC, 0x6F, + 0x00, 0x40, 0x00, 0xA3, 0x91, 0x92, 0x92, 0x93, 0x27, 0x98, 0x28, 0x99, + 0x00, 0xA8, 0x28, 0xE4, 0x39, 0xE4, 0x83, 0x92, 0x84, 0x93, 0x27, 0x98, + 0x28, 0x99, 0x09, 0x40, 0xA6, 0xDF, 0x83, 0x9E, 0x84, 0x9F, 0x09, 0x40, + 0xCE, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0x83, 0x9A, 0x84, 0x9B, 0x27, 0x98, + 0x28, 0x99, 0x09, 0x40, 0xC6, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x80, 0xE4, + 0x91, 0xE4, 0x07, 0x40, 0xD5, 0xDF, 0x95, 0x98, 0x96, 0x99, 0x83, 0x9E, + 0x84, 0x9F, 0x82, 0xE4, 0x93, 0xE4, 0x09, 0x40, 0xB8, 0xDF, 0xE8, 0xE4, + 0xF9, 0xE4, 0x83, 0x98, 0x84, 0x99, 0x15, 0x98, 0x16, 0x99, 0x07, 0x40, + 0xC5, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0xA9, 0xE4, 0x98, 0xE4, 0x23, 0x50, + 0xFF, 0x7F, 0xAF, 0xBF, 0x01, 0x40, 0x86, 0xDB, 0x8A, 0xE4, 0xDC, 0x6F, + 0x00, 0x40, 0x80, 0xB8, 0x89, 0xBD, 0x01, 0x40, 0x58, 0xD4, 0x4A, 0x59, + 0x2F, 0x78, 0x0E, 0xA8, 0x25, 0x4F, 0x54, 0x71, 0x07, 0xA9, 0x83, 0x98, + 0x84, 0x99, 0x15, 0x98, 0x16, 0x99, 0x07, 0x40, 0xA9, 0xDF, 0x08, 0xE4, + 0x19, 0xE4, 0x83, 0x9E, 0x84, 0x9F, 0x82, 0xE4, 0x93, 0xE4, 0x09, 0x40, + 0x60, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0x06, 0x40, + 0xA0, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0x3B, 0xD8, 0x1A, 0xE4, 0xFF, 0x5F, + 0xFF, 0x7F, 0x1F, 0xBC, 0x81, 0xE4, 0x50, 0xC8, 0x00, 0xA6, 0xF8, 0x4F, + 0x00, 0x40, 0x10, 0xBF, 0x31, 0xDB, 0xC0, 0x7F, 0x82, 0xB8, 0x04, 0x40, + 0x00, 0x40, 0x00, 0xA6, 0xA0, 0xC6, 0x6A, 0xB8, 0x16, 0xE4, 0xFF, 0x5F, + 0xFF, 0x7F, 0x1F, 0xBC, 0x50, 0xC1, 0xC0, 0x7F, 0x11, 0xB8, 0x8A, 0x91, + 0x00, 0xA0, 0x10, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x0F, 0xA8, 0x0A, 0x92, + 0x88, 0xC8, 0x78, 0xE0, 0x18, 0xE4, 0x16, 0xBC, 0x8F, 0x90, 0x90, 0x91, + 0x03, 0x40, 0xFF, 0x7F, 0x6F, 0xBC, 0x04, 0x40, 0x00, 0x40, 0x60, 0xBD, + 0x14, 0xA8, 0x82, 0xBA, 0xA0, 0xC6, 0xAA, 0xB8, 0x02, 0x40, 0x30, 0xD7, + 0x0F, 0x98, 0x10, 0x99, 0x83, 0x98, 0x84, 0x99, 0x8E, 0xE4, 0x9F, 0xE4, + 0x09, 0x40, 0x1D, 0xDF, 0xE8, 0xE4, 0xF9, 0xE4, 0x83, 0x9E, 0x84, 0x9F, + 0x15, 0x98, 0x16, 0x99, 0x07, 0x40, 0x56, 0xDF, 0x00, 0xA8, 0x8F, 0x98, + 0x90, 0x99, 0x00, 0xA8, 0xF9, 0x4F, 0xE4, 0x62, 0x03, 0xA9, 0x83, 0x98, + 0x84, 0x99, 0x0F, 0x98, 0x10, 0x99, 0x09, 0x40, 0x34, 0xDF, 0x8D, 0x98, + 0x8E, 0x99, 0x83, 0x9E, 0x84, 0x9F, 0x0F, 0x98, 0x10, 0x99, 0x09, 0x40, + 0x00, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x15, 0x98, 0x16, 0x99, 0x08, 0x40, + 0xFA, 0xDF, 0xBE, 0x7F, 0x9E, 0x63, 0x0F, 0xA0, 0xF9, 0x4F, 0xE4, 0x62, + 0x02, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x09, 0x40, 0x1C, 0xDF, 0x08, 0xE4, + 0x19, 0xE4, 0x2A, 0x43, 0xC3, 0x46, 0x09, 0xA8, 0x88, 0x6F, 0xC6, 0x45, + 0x01, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x0F, 0x98, 0x10, 0x99, 0x09, 0x40, + 0x0E, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0x07, 0x40, + 0x1D, 0xDF, 0x8B, 0x98, 0x8C, 0x99, 0x83, 0x98, 0x84, 0x99, 0x0D, 0x98, + 0x0E, 0x99, 0x07, 0x40, 0x15, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x0D, 0x9E, + 0x0E, 0x9F, 0x83, 0x9E, 0x84, 0x9F, 0x08, 0x40, 0xCC, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x0B, 0x98, 0x0C, 0x99, 0x08, 0x40, 0xC6, 0xDF, 0xA8, 0xE4, + 0xB9, 0xE4, 0x83, 0x92, 0x84, 0x93, 0x82, 0xE4, 0x93, 0xE4, 0x08, 0x40, + 0xEA, 0xDF, 0x8F, 0x98, 0x90, 0x99, 0xAF, 0x5C, 0x4D, 0x6A, 0x00, 0xA8, + 0x99, 0x4F, 0x76, 0x63, 0x09, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x0F, 0x98, + 0x10, 0x99, 0x08, 0x40, 0xDC, 0xDF, 0x74, 0x71, 0xBF, 0x66, 0x01, 0xA0, + 0xAE, 0x6F, 0xD4, 0x7B, 0x01, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x06, 0x40, + 0xE7, 0xDF, 0x0F, 0x90, 0x10, 0x91, 0x83, 0x90, 0x84, 0x91, 0x08, 0x40, + 0xCC, 0xDF, 0xC9, 0x6B, 0xE2, 0x5D, 0x0C, 0xA0, 0xC4, 0x4F, 0x66, 0x55, + 0x0A, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x06, 0x40, 0xD7, 0xDF, 0x0F, 0x9E, + 0x10, 0x9F, 0x83, 0x9E, 0x84, 0x9F, 0x08, 0x40, 0xBC, 0xDF, 0xAF, 0x45, + 0xD9, 0x6B, 0x03, 0xA0, 0xD9, 0x6F, 0x16, 0x6C, 0x0C, 0xA1, 0x83, 0x90, + 0x84, 0x91, 0x06, 0x40, 0xC7, 0xDF, 0x83, 0x9E, 0x84, 0x9F, 0x08, 0x40, + 0xAE, 0xDF, 0x55, 0x55, 0x53, 0x55, 0x0E, 0xA0, 0xF1, 0x4F, 0x55, 0x55, + 0x05, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x06, 0x40, 0xB9, 0xDF, 0x83, 0x9E, + 0x84, 0x9F, 0x08, 0x40, 0xA0, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, + 0x93, 0xE4, 0x08, 0x40, 0x6E, 0xDF, 0xE8, 0xE4, 0xF9, 0xE4, 0x83, 0x98, + 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, 0x08, 0x40, 0x92, 0xDF, 0x08, 0xE4, + 0x19, 0xE4, 0x00, 0xA8, 0x00, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, + 0x84, 0x99, 0x8E, 0xE4, 0x9F, 0xE4, 0x08, 0x40, 0x5A, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0x09, 0x40, 0xF5, 0xDF, 0x08, 0xE4, + 0x19, 0xE4, 0x83, 0x9A, 0x84, 0x9B, 0x82, 0xE4, 0x93, 0xE4, 0x08, 0x40, + 0x78, 0xDF, 0x83, 0x9A, 0x84, 0x9B, 0x06, 0x40, 0x89, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0x08, 0x40, 0x42, 0xDF, 0x93, 0x98, + 0x94, 0x99, 0x83, 0x92, 0x84, 0x93, 0x08, 0x40, 0x3C, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x00, 0xA8, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA9, 0x08, 0x40, + 0x34, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0xA9, 0xE4, 0x86, 0xE4, 0x52, 0xC8, + 0xA8, 0xB8, 0x8A, 0xE4, 0x50, 0xC8, 0xE0, 0xC8, 0x01, 0x40, 0x37, 0xDB, + 0x82, 0xE4, 0x93, 0xE4, 0x9A, 0xE4, 0x28, 0xE4, 0x39, 0xE4, 0x83, 0x98, + 0x84, 0x99, 0x11, 0x98, 0x12, 0x99, 0x08, 0x40, 0x4A, 0xDF, 0xFB, 0x7F, + 0xB3, 0xDE, 0x00, 0x62, 0x59, 0x47, 0x0C, 0xA0, 0x8D, 0x5F, 0x43, 0x7E, + 0x0C, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x11, 0x98, 0x12, 0x99, 0x08, 0x40, + 0x3C, 0xDF, 0x83, 0x90, 0x84, 0x91, 0x08, 0x40, 0x38, 0xDF, 0xFB, 0x7F, + 0xA1, 0xDE, 0x83, 0x9C, 0x84, 0x9D, 0x8C, 0xE4, 0x9D, 0xE4, 0x08, 0x40, + 0x30, 0xDF, 0xFB, 0x7F, 0x99, 0xDE, 0xFB, 0x4F, 0xFF, 0x7F, 0xEF, 0xBF, + 0x55, 0xDB, 0x27, 0x98, 0x28, 0x99, 0xE0, 0xC6, 0xFB, 0x7F, 0x90, 0xDA, + 0x00, 0xA8, 0x98, 0xE4, 0xFB, 0x7F, 0x8C, 0xDE, 0x1A, 0xE4, 0xFF, 0x5F, + 0xFF, 0x7F, 0x1F, 0xBC, 0x24, 0x50, 0xBF, 0x4C, 0x1F, 0xBF, 0xFE, 0x7F, + 0x99, 0xDB, 0x8A, 0xE4, 0xDB, 0x4F, 0x40, 0x73, 0x80, 0xB8, 0x89, 0xBD, + 0x07, 0xD5, 0xBE, 0x70, 0x35, 0x4F, 0x09, 0xA0, 0x69, 0x40, 0xE1, 0x56, + 0x0F, 0xA1, 0xC9, 0xDE, 0x83, 0x9E, 0x84, 0x9F, 0x82, 0xE4, 0x93, 0xE4, + 0x07, 0x40, 0xD9, 0xDF, 0x15, 0x92, 0x16, 0x93, 0x83, 0x92, 0x84, 0x93, + 0x04, 0x40, 0xC0, 0xDF, 0x88, 0xB8, 0xFE, 0x7F, 0x7D, 0xD7, 0xBE, 0x70, + 0x35, 0x4F, 0x09, 0xA0, 0x69, 0x40, 0xE1, 0x56, 0x0F, 0xA1, 0xB3, 0xDE, + 0x83, 0x92, 0x84, 0x93, 0x00, 0xA8, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA9, + 0x09, 0x40, 0x62, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0xFB, 0x7F, 0x80, 0xDE, + 0xFB, 0x4F, 0xFF, 0x7F, 0xEE, 0xBF, 0xFB, 0x7F, 0x96, 0xDB, 0xFC, 0x4F, + 0x00, 0x40, 0xE0, 0xBF, 0x3C, 0xDB, 0x00, 0xA8, 0xFC, 0x5F, 0x00, 0x40, + 0x00, 0xA9, 0xE0, 0xC6, 0xFB, 0x7F, 0x44, 0xD8, 0x00, 0xA8, 0x98, 0xE4, + 0xFB, 0x7F, 0x40, 0xDE, 0x00, 0xA8, 0x98, 0xE4, 0xE0, 0xC6, 0xFB, 0x7F, + 0x3B, 0xDA, 0x27, 0x98, 0x00, 0x40, 0x80, 0xBE, 0x28, 0x99, 0x00, 0x60, + 0x00, 0x40, 0x90, 0xBE, 0xFB, 0x7F, 0x32, 0xDE, 0xE0, 0xC9, 0xFB, 0x7F, + 0x14, 0xD4, 0x14, 0xA8, 0x0A, 0x93, 0x83, 0xBA, 0xA4, 0xE4, 0xA0, 0xCA, + 0x9A, 0xE4, 0xA2, 0xC9, 0x94, 0xBF, 0xFB, 0x7F, 0x0C, 0xD4, 0x00, 0x40, + 0xA1, 0xBC, 0x02, 0xA0, 0x0A, 0xBA, 0x89, 0x90, 0xFB, 0x7F, 0x05, 0xDE, + 0x09, 0x9E, 0xE1, 0xCE, 0xFB, 0x7F, 0x48, 0xD4, 0x82, 0xE4, 0x00, 0x40, + 0x80, 0xBE, 0x93, 0xE4, 0x00, 0x60, 0x00, 0x40, 0x90, 0xBE, 0x28, 0xE4, + 0x39, 0xE4, 0xFB, 0x7F, 0x8A, 0xDE, 0x00, 0xA8, 0xFC, 0x4F, 0x00, 0x40, + 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, 0x07, 0x40, + 0x6E, 0xDF, 0x8F, 0x98, 0x90, 0x99, 0x83, 0x98, 0x84, 0x99, 0x07, 0x40, + 0x94, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0x00, 0xA8, 0xF4, 0x4F, 0x00, 0x40, + 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x0F, 0x98, 0x10, 0x99, 0x07, 0x40, + 0x88, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x55, 0x55, 0x55, 0x55, 0x05, 0xA8, + 0xF5, 0x4F, 0x55, 0x55, 0x05, 0xA9, 0x07, 0x40, 0x52, 0xDF, 0x0F, 0x92, + 0x10, 0x93, 0x83, 0x92, 0x84, 0x93, 0x07, 0x40, 0x78, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x00, 0xA8, 0xF8, 0x4F, 0x00, 0x40, 0x00, 0xA9, 0x07, 0x40, + 0x44, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0x07, 0x40, + 0x6A, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, 0x00, 0x58, 0x00, 0x40, 0x00, 0xA8, + 0xFD, 0x4F, 0x54, 0x71, 0x07, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x0F, 0x98, + 0x10, 0x99, 0x07, 0x40, 0x5C, 0xDF, 0x8D, 0x98, 0x8E, 0x99, 0x17, 0x7E, + 0xF4, 0x5D, 0x04, 0xA8, 0x95, 0x4F, 0xE0, 0x4A, 0x0B, 0xA9, 0x83, 0x98, + 0x84, 0x99, 0x0F, 0x98, 0x10, 0x99, 0x07, 0x40, 0x4E, 0xDF, 0x08, 0xE4, + 0x19, 0xE4, 0x4A, 0x59, 0x2F, 0x78, 0x0E, 0xA8, 0xFD, 0x4F, 0x54, 0x71, + 0x07, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x8A, 0xE4, 0x9B, 0xE4, 0x07, 0x40, + 0x40, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0x07, 0x40, + 0x0E, 0xDF, 0x8B, 0x98, 0x8C, 0x99, 0x83, 0x98, 0x84, 0x99, 0x0D, 0x98, + 0x0E, 0x99, 0x05, 0x40, 0x47, 0xDF, 0x00, 0xA8, 0xE8, 0xE4, 0xF9, 0xE4, + 0x0D, 0x98, 0x0E, 0x99, 0x83, 0x98, 0x84, 0x99, 0x8E, 0xE4, 0x9F, 0xE4, + 0x06, 0x40, 0xFB, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x0B, 0x98, 0x0C, 0x99, + 0xFD, 0x7F, 0x2E, 0xDE, 0x66, 0xE0, 0xFD, 0x7F, 0xCD, 0xDE, 0x83, 0x96, + 0x82, 0xE4, 0x93, 0xE4, 0x01, 0x40, 0xBF, 0xDF, 0xFE, 0x7F, 0xC5, 0xDE, + 0x20, 0xB5, 0x3C, 0xB3, 0x5F, 0xB1, 0xFB, 0xB6, 0x00, 0xAC, 0x00, 0xAD, + 0xA8, 0xE4, 0xB9, 0xE4, 0x19, 0xE4, 0x98, 0xE4, 0x81, 0xE4, 0xFC, 0x5F, + 0x00, 0x40, 0x80, 0xBC, 0xFC, 0x5F, 0x00, 0x40, 0x80, 0xBF, 0x00, 0x40, + 0x92, 0xD5, 0xE0, 0xC1, 0x00, 0x40, 0xA9, 0xDB, 0x31, 0xE4, 0x50, 0xC3, + 0x1B, 0xD4, 0xE0, 0xC1, 0x08, 0xD4, 0xFE, 0x7F, 0x3B, 0xB8, 0x89, 0xE4, + 0x2D, 0xC8, 0x18, 0xBD, 0x56, 0xC9, 0xE0, 0xC1, 0xF8, 0xD5, 0x00, 0xA2, + 0x02, 0xDE, 0x06, 0xC1, 0xC1, 0xC2, 0x81, 0xE4, 0x04, 0x40, 0x00, 0x40, + 0x80, 0xBC, 0xF9, 0xD5, 0x32, 0xBA, 0xC1, 0xC3, 0x00, 0xA0, 0x02, 0xBA, + 0x89, 0xE4, 0x81, 0xC8, 0x18, 0xBD, 0x8A, 0xC9, 0xC0, 0x7F, 0x31, 0xB8, + 0x03, 0x40, 0xFF, 0x7F, 0x1F, 0xBC, 0x04, 0x40, 0x00, 0x40, 0x10, 0xBD, + 0x83, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x05, 0xD5, 0x89, 0xE4, 0x7D, 0xC8, + 0x81, 0xB8, 0x18, 0xB8, 0x06, 0xC9, 0x04, 0xC3, 0x89, 0xE4, 0x7D, 0xC8, + 0x81, 0xB8, 0x18, 0xB8, 0x06, 0xC9, 0x00, 0xAA, 0xBA, 0xE4, 0x4A, 0xE4, + 0x6A, 0xE4, 0x08, 0x40, 0x00, 0x40, 0x00, 0xA2, 0x8A, 0xE4, 0x82, 0xB8, + 0x81, 0xBF, 0x04, 0xD8, 0xA8, 0xE4, 0xA2, 0xB8, 0x18, 0xBA, 0x42, 0xB8, + 0x89, 0xE4, 0x7D, 0xC8, 0x81, 0xB8, 0x18, 0xB8, 0x06, 0xC9, 0x05, 0xC2, + 0xF1, 0xD4, 0x00, 0x60, 0x00, 0x40, 0x00, 0xA2, 0x09, 0xDE, 0xA1, 0xBF, + 0x55, 0xD5, 0x89, 0xE4, 0x7D, 0xC8, 0x81, 0xB8, 0x18, 0xB8, 0x06, 0xC9, + 0x05, 0xC2, 0x16, 0xD5, 0x0B, 0xE4, 0x02, 0xB8, 0x8A, 0xE4, 0xA1, 0xBF, + 0xF2, 0xDA, 0xB0, 0xE4, 0xB2, 0xB8, 0xE0, 0xC0, 0x40, 0xD9, 0x18, 0xBA, + 0x90, 0xBF, 0x01, 0xD6, 0xDF, 0xC1, 0x90, 0xBA, 0x62, 0xB8, 0x89, 0xE4, + 0x7D, 0xC8, 0x81, 0xB8, 0x18, 0xB8, 0x06, 0xC9, 0x05, 0xC2, 0xEA, 0xD4, + 0x19, 0xBD, 0x06, 0xD5, 0xFF, 0xC6, 0x4D, 0xD5, 0x86, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0x68, 0xB8, 0x14, 0xE4, 0x04, 0xC1, 0xF8, 0x4F, 0x00, 0x40, + 0x10, 0xB8, 0x96, 0xE4, 0x05, 0xC9, 0x00, 0x40, 0x41, 0xBC, 0x03, 0xD5, + 0x00, 0x60, 0x00, 0x40, 0x90, 0xBD, 0x52, 0xC3, 0xD1, 0xE4, 0xD3, 0xB8, + 0xC9, 0xE4, 0x2C, 0xE4, 0x3D, 0xE4, 0x82, 0xE4, 0x93, 0xE4, 0x05, 0xB6, + 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0x83, 0x9A, 0x84, 0x9B, 0x8A, 0xE4, + 0x9B, 0xE4, 0x06, 0x40, 0x6C, 0xDF, 0x83, 0x9A, 0x84, 0x9B, 0x04, 0x40, + 0x7D, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x82, 0xE4, 0x93, 0xE4, 0x05, 0xB6, + 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0xE0, 0xCB, 0xBE, 0xD9, 0xA8, 0xE4, + 0xC1, 0xCA, 0xBB, 0xDE, 0x09, 0xBF, 0xA9, 0xDC, 0xB4, 0xDE, 0x81, 0xE4, + 0xFF, 0x5F, 0xFF, 0x7F, 0x8F, 0xBC, 0x89, 0xBD, 0x2A, 0xE4, 0x3B, 0xE4, + 0xEA, 0xD5, 0xE0, 0xC1, 0xFF, 0x7F, 0x4C, 0xDA, 0x83, 0x9A, 0x84, 0x9B, + 0x8A, 0xE4, 0x9B, 0xE4, 0x06, 0x40, 0x1B, 0xDF, 0x83, 0x98, 0x84, 0x99, + 0x07, 0x40, 0xB8, 0xDF, 0xDA, 0xDE, 0x62, 0xE4, 0xC1, 0xC4, 0xB4, 0xDE, + 0x0D, 0xB1, 0x09, 0xE4, 0xFF, 0x5F, 0xFF, 0x7F, 0x9F, 0xBC, 0x28, 0xE4, + 0x39, 0xE4, 0x0D, 0xB0, 0xA0, 0xE0, 0x01, 0xB1, 0x89, 0xE4, 0xFF, 0x5F, + 0xFF, 0x7F, 0x8F, 0xBC, 0x04, 0x60, 0x00, 0x40, 0x80, 0xB8, 0x7D, 0xC8, + 0x01, 0xB0, 0xA0, 0xE0, 0x03, 0xB1, 0x19, 0xE4, 0x98, 0xE4, 0xFF, 0x5F, + 0xFF, 0x7F, 0x1F, 0xBC, 0x68, 0xE0, 0x89, 0xBD, 0x7D, 0xC8, 0x18, 0xBD, + 0xFC, 0x5F, 0x00, 0x40, 0x00, 0xA8, 0x81, 0xBA, 0x7D, 0xC8, 0x03, 0xB0, + 0xA0, 0xE0, 0xFB, 0xB6, 0x00, 0xA8, 0x05, 0xB6, 0xA0, 0xE0, 0x20, 0xB5, + 0x3C, 0xB3, 0x5F, 0xB1, 0xF9, 0xB6, 0x00, 0xAC, 0x00, 0xAD, 0x28, 0xE4, + 0x39, 0xE4, 0x49, 0xE4, 0xA8, 0xE4, 0xB9, 0xE4, 0x7D, 0xCB, 0x89, 0xE4, + 0x50, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x98, 0xE4, 0xC0, 0x7F, 0x91, 0xB8, + 0x01, 0x40, 0x93, 0xBF, 0x3C, 0xD8, 0xE0, 0xC9, 0x62, 0xD9, 0x03, 0x40, + 0xFF, 0x7F, 0x0F, 0xA6, 0xA4, 0xC6, 0x84, 0xE4, 0x86, 0xBC, 0x8A, 0xBD, + 0x02, 0xE4, 0x13, 0xE4, 0x2A, 0xD5, 0x05, 0xC6, 0x84, 0xE4, 0x86, 0xBC, + 0x8A, 0xBD, 0x0B, 0xD5, 0x01, 0x40, 0x93, 0xBF, 0x00, 0x40, 0x8C, 0xD5, + 0x76, 0xE0, 0x46, 0xBC, 0x00, 0x40, 0x00, 0x60, 0x00, 0xA8, 0xA4, 0xC8, + 0x48, 0xBD, 0xD4, 0xE4, 0xCA, 0xE4, 0x2C, 0xE4, 0x3D, 0xE4, 0x0E, 0xCB, + 0x00, 0x40, 0x85, 0x62, 0xB8, 0xB8, 0x0B, 0x00, 0x1B, 0x01, 0x83, 0x92, + 0x84, 0x93, 0x80, 0xE4, 0x91, 0xE4, 0x03, 0x40, 0xE9, 0xDF, 0x85, 0x98, + 0x86, 0x99, 0x05, 0x98, 0x06, 0x99, 0x83, 0x90, 0x84, 0x91, 0x05, 0x40, + 0xA0, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0x80, 0xE4, 0x91, 0xE4, 0x07, 0xB6, + 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0x03, 0x40, 0x93, 0xBF, 0x0E, 0xDB, + 0x02, 0xE4, 0x13, 0xE4, 0x40, 0x40, 0x90, 0xBF, 0xF2, 0xD4, 0x83, 0x92, + 0x84, 0x93, 0x82, 0xE4, 0x93, 0xE4, 0x03, 0x40, 0xCB, 0xDF, 0x08, 0xE4, + 0x19, 0xE4, 0xE9, 0xDE, 0x98, 0xE4, 0xBE, 0x7F, 0x9D, 0xB8, 0xFF, 0xA6, + 0x09, 0xE4, 0x81, 0xC6, 0x8A, 0xE4, 0x86, 0xBC, 0x02, 0xE4, 0x13, 0xE4, + 0xDE, 0xD5, 0x05, 0xC6, 0x8A, 0xE4, 0x86, 0xBC, 0xC0, 0xD5, 0x76, 0xE0, + 0xA6, 0xBC, 0x00, 0x50, 0x00, 0x40, 0x00, 0xA8, 0xA4, 0xC8, 0xA8, 0xBD, + 0xB8, 0xDE, 0x84, 0xE4, 0xFF, 0x5F, 0xFF, 0x7F, 0x8F, 0xBC, 0x8A, 0xBD, + 0x02, 0xE4, 0x13, 0xE4, 0xCA, 0xD5, 0x84, 0xE4, 0x03, 0x40, 0xFF, 0x7F, + 0x8F, 0xBC, 0xA8, 0xBD, 0x00, 0x60, 0x40, 0xBC, 0x00, 0xA1, 0x1A, 0xBA, + 0x1A, 0xBD, 0x31, 0xC1, 0x02, 0x40, 0x00, 0x40, 0x10, 0xBC, 0x82, 0xE4, + 0x93, 0xE4, 0x94, 0xE4, 0x91, 0xBD, 0x28, 0xE4, 0x39, 0xE4, 0x0E, 0xCB, + 0x8B, 0xE4, 0x00, 0x40, 0x85, 0x62, 0x88, 0xB8, 0x08, 0x00, 0x18, 0x01, + 0x83, 0x92, 0x84, 0x93, 0x80, 0xE4, 0x91, 0xE4, 0x03, 0x40, 0x88, 0xDF, + 0x85, 0x98, 0x86, 0x99, 0x05, 0x98, 0x06, 0x99, 0x83, 0x90, 0x84, 0x91, + 0x05, 0x40, 0x3F, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0x41, 0xE4, 0xFF, 0x5F, + 0xFF, 0x7F, 0x4F, 0xBC, 0x72, 0xCB, 0x94, 0xE4, 0x9B, 0xBD, 0x08, 0xE4, + 0x19, 0xE4, 0x95, 0xDE, 0x00, 0x50, 0x00, 0x40, 0x00, 0xAA, 0xFF, 0x7F, + 0x76, 0xDE, 0x20, 0xB5, 0x5F, 0xB1, 0xFB, 0xB6, 0x28, 0xE4, 0x39, 0xE4, + 0x0F, 0x94, 0x69, 0xE4, 0x19, 0xE4, 0xFC, 0x5F, 0x00, 0x40, 0x10, 0xBC, + 0x50, 0xC1, 0x24, 0xD4, 0xFF, 0x5F, 0xFF, 0x7F, 0x6F, 0xBC, 0x68, 0xBD, + 0x82, 0xE4, 0x93, 0xE4, 0x2E, 0xD5, 0x00, 0xA8, 0xD4, 0x50, 0x00, 0x40, + 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, 0x05, 0x40, + 0x3C, 0xDF, 0x28, 0xE4, 0x39, 0xE4, 0x69, 0xE4, 0x19, 0xE4, 0xFC, 0x5F, + 0x00, 0x40, 0x10, 0xBC, 0x50, 0xC1, 0xFC, 0x7F, 0x1A, 0xB8, 0xBE, 0x70, + 0x35, 0x4F, 0x09, 0xA8, 0x69, 0x40, 0xE1, 0x56, 0x0F, 0xA9, 0xCB, 0x73, + 0x40, 0xBF, 0x30, 0xD9, 0x7F, 0x40, 0x1F, 0xBF, 0x11, 0xD5, 0x14, 0xB8, + 0x7F, 0x40, 0x1E, 0xBF, 0x32, 0xD8, 0xE0, 0xC1, 0x14, 0xDB, 0x82, 0xE4, + 0x93, 0xE4, 0x03, 0x60, 0xFF, 0x7F, 0x6F, 0xBC, 0x52, 0xC1, 0x96, 0xE4, + 0x91, 0xBD, 0x05, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x83, 0x92, 0x84, 0x93, + 0x82, 0xE4, 0x93, 0xE4, 0x03, 0x40, 0x24, 0xDF, 0x05, 0xB6, 0x5F, 0xB0, + 0x40, 0xB4, 0xFC, 0x7F, 0x1A, 0xBF, 0x2D, 0xDB, 0x03, 0x40, 0x16, 0xB8, + 0x82, 0xE4, 0x93, 0xE4, 0x03, 0x60, 0xFF, 0x7F, 0x6F, 0xBC, 0x52, 0xC1, + 0x96, 0xE4, 0x91, 0xBD, 0x28, 0xE4, 0x39, 0xE4, 0x00, 0xA8, 0x24, 0x4F, + 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, + 0x04, 0x40, 0xF3, 0xDF, 0x05, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x83, 0x92, + 0x84, 0x93, 0x00, 0x62, 0x59, 0x47, 0x0C, 0xA8, 0x8D, 0x5F, 0x43, 0x7E, + 0x0C, 0xA9, 0x20, 0xDF, 0x00, 0x62, 0x59, 0x47, 0x0C, 0xA0, 0x8D, 0x5F, + 0x43, 0x7E, 0x0C, 0xA1, 0x83, 0x90, 0x84, 0x91, 0x04, 0x40, 0xDD, 0xDF, + 0xE9, 0xDE, 0x35, 0x4C, 0x40, 0xBF, 0xE9, 0xD8, 0x83, 0x92, 0x84, 0x93, + 0xBE, 0x70, 0x35, 0x4F, 0x09, 0xA8, 0x69, 0x40, 0xE1, 0x56, 0x0F, 0xA9, + 0x09, 0xDF, 0xBE, 0x70, 0x35, 0x4F, 0x09, 0xA0, 0x69, 0x40, 0xE1, 0x56, + 0x0F, 0xA1, 0x83, 0x90, 0x84, 0x91, 0xE8, 0xDE, 0x0F, 0xB1, 0x19, 0xE4, + 0x08, 0x90, 0xFF, 0x5F, 0xFF, 0x7F, 0x1F, 0xBC, 0x00, 0x60, 0x00, 0x40, + 0x00, 0xBC, 0x91, 0xE4, 0x90, 0xBD, 0x28, 0xE4, 0x39, 0xE4, 0x0F, 0xB0, + 0xA0, 0xE0, 0x20, 0xB5, 0x1F, 0xB1, 0x29, 0xE4, 0x00, 0x40, 0x21, 0xBA, + 0x38, 0xD5, 0x39, 0xD7, 0x89, 0xBF, 0x2C, 0xDD, 0x92, 0xE3, 0x2F, 0xD5, + 0x09, 0xE1, 0x30, 0xE4, 0x08, 0xE1, 0x23, 0xE4, 0x20, 0xBA, 0x01, 0xA3, + 0x8A, 0xC9, 0x8A, 0xC3, 0x00, 0xA2, 0x09, 0xE4, 0x43, 0xE4, 0x80, 0xBF, + 0x02, 0xD7, 0x80, 0xBA, 0x24, 0xBD, 0x05, 0xC0, 0x05, 0xC4, 0x80, 0xBF, + 0x02, 0xD7, 0x80, 0xBA, 0x24, 0xBD, 0x05, 0xC0, 0x05, 0xC4, 0x80, 0xBF, + 0x02, 0xD7, 0x80, 0xBA, 0x24, 0xBD, 0x05, 0xC0, 0x05, 0xC4, 0x80, 0xBF, + 0x02, 0xD7, 0x80, 0xBA, 0x24, 0xBD, 0x00, 0x40, 0x80, 0xBF, 0x04, 0xD5, + 0x11, 0xC3, 0x02, 0xD5, 0x11, 0xC9, 0xE1, 0xDE, 0x82, 0xE4, 0x09, 0xDE, + 0x02, 0xD5, 0x00, 0xA8, 0x06, 0xDE, 0x01, 0xA8, 0x04, 0xDE, 0x09, 0xE1, + 0x1F, 0xA2, 0x20, 0xBA, 0x89, 0xC8, 0x1F, 0xB0, 0x40, 0xB4, 0x00, 0xA8, + 0xFC, 0xDE, 0x20, 0xB5, 0x1F, 0xB1, 0x18, 0xE4, 0x19, 0xBE, 0x00, 0x40, + 0x90, 0xBF, 0x53, 0xD5, 0x01, 0xD2, 0x69, 0xE0, 0x29, 0xE4, 0x00, 0x40, + 0x21, 0xBA, 0x36, 0xD5, 0x38, 0xE4, 0x00, 0x40, 0x30, 0xB8, 0x01, 0xD2, + 0x63, 0xE0, 0x39, 0xBF, 0x33, 0xDD, 0x92, 0xE3, 0x39, 0xD5, 0x09, 0xE1, + 0x20, 0xE4, 0x03, 0xE1, 0x82, 0xE4, 0x80, 0xBA, 0x01, 0xA2, 0xA2, 0xC9, + 0xA2, 0xC2, 0x00, 0xA8, 0x09, 0xE4, 0x42, 0xE4, 0x30, 0xBF, 0x02, 0xD7, + 0x30, 0xBA, 0x84, 0xBD, 0x05, 0xC0, 0x05, 0xC4, 0x30, 0xBF, 0x02, 0xD7, + 0x30, 0xBA, 0x84, 0xBD, 0x05, 0xC0, 0x05, 0xC4, 0x30, 0xBF, 0x02, 0xD7, + 0x30, 0xBA, 0x84, 0xBD, 0x05, 0xC0, 0x05, 0xC4, 0x30, 0xBF, 0x02, 0xD7, + 0x30, 0xBA, 0x84, 0xBD, 0x00, 0x40, 0x30, 0xBF, 0x04, 0xD5, 0x11, 0xC2, + 0x02, 0xD5, 0x11, 0xC9, 0xE1, 0xDE, 0x00, 0x40, 0x10, 0xBF, 0x17, 0xD2, + 0x68, 0xE0, 0x15, 0xDE, 0x18, 0xBE, 0x13, 0xD2, 0x68, 0xE0, 0x11, 0xDE, + 0x02, 0xD6, 0x00, 0xA8, 0x0E, 0xDE, 0x81, 0xE4, 0x7C, 0xC8, 0x00, 0x40, + 0x81, 0xBD, 0x09, 0xDE, 0x09, 0xE1, 0x1F, 0xA2, 0x20, 0xBA, 0x83, 0xE4, + 0x89, 0xC8, 0x00, 0x40, 0x10, 0xBF, 0x01, 0xD2, 0x68, 0xE0, 0x1F, 0xB0, + 0x40, 0xB4, 0x00, 0xA8, 0xFC, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0x00, 0x40, + 0x90, 0xBF, 0x44, 0xD5, 0x29, 0xE4, 0x00, 0x40, 0x21, 0xBA, 0x3E, 0xD5, + 0x89, 0xBF, 0x3C, 0xD5, 0x39, 0xD7, 0x92, 0xE3, 0x03, 0xD2, 0x36, 0xD7, + 0x82, 0xBC, 0x34, 0xDE, 0x09, 0xE1, 0x20, 0xE4, 0x08, 0xE1, 0x30, 0xE4, + 0x23, 0xBA, 0x8A, 0xC9, 0x00, 0x40, 0x23, 0xBA, 0x1C, 0xD9, 0x89, 0xBF, + 0x01, 0xD7, 0x89, 0xBA, 0x05, 0xC9, 0x89, 0xBF, 0x01, 0xD7, 0x89, 0xBA, + 0x05, 0xC9, 0x89, 0xBF, 0x01, 0xD7, 0x89, 0xBA, 0x05, 0xC9, 0x89, 0xBF, + 0x01, 0xD7, 0x89, 0xBA, 0x05, 0xC9, 0x00, 0x40, 0x81, 0xBF, 0x03, 0xD9, + 0x00, 0x40, 0x24, 0xBA, 0xEA, 0xDA, 0x00, 0x40, 0x23, 0xE3, 0x12, 0xD5, + 0x00, 0x40, 0x80, 0xBF, 0x0F, 0xD5, 0xFF, 0x7F, 0x2E, 0xBF, 0x09, 0xD9, + 0x04, 0xD5, 0x89, 0xBF, 0x01, 0xD7, 0x89, 0xBA, 0x05, 0xC9, 0x89, 0xBF, + 0x01, 0xD7, 0x89, 0xBA, 0x05, 0xC9, 0x89, 0xBF, 0x01, 0xD7, 0x89, 0xBA, + 0x0F, 0xB0, 0x40, 0xB4, 0x00, 0xA8, 0xFC, 0xDE, 0x00, 0xA8, 0x0F, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, 0x00, 0x40, 0x90, 0xBF, 0x4D, 0xD5, + 0x01, 0xD2, 0x69, 0xE0, 0x18, 0xE4, 0x00, 0x40, 0x80, 0xB8, 0x01, 0xD2, + 0x68, 0xE0, 0x29, 0xE4, 0x00, 0x40, 0x21, 0xBA, 0x45, 0xD5, 0x89, 0xBF, + 0x43, 0xD5, 0x39, 0xD7, 0x92, 0xE3, 0x03, 0xD2, 0x01, 0xD7, 0x82, 0xBC, + 0x34, 0xDE, 0x09, 0xE1, 0x20, 0xE4, 0x08, 0xE1, 0x30, 0xE4, 0x23, 0xBA, + 0x8A, 0xC9, 0x00, 0x40, 0x23, 0xBA, 0x1C, 0xD9, 0x89, 0xBF, 0x01, 0xD7, + 0x89, 0xBA, 0x05, 0xC9, 0x89, 0xBF, 0x01, 0xD7, 0x89, 0xBA, 0x05, 0xC9, + 0x89, 0xBF, 0x01, 0xD7, 0x89, 0xBA, 0x05, 0xC9, 0x89, 0xBF, 0x01, 0xD7, + 0x89, 0xBA, 0x05, 0xC9, 0x00, 0x40, 0x81, 0xBF, 0x03, 0xD9, 0x00, 0x40, + 0x24, 0xBA, 0xEA, 0xDA, 0x00, 0x40, 0x23, 0xE3, 0x12, 0xD5, 0x00, 0x40, + 0x80, 0xBF, 0x0F, 0xD5, 0xFF, 0x7F, 0x2E, 0xBF, 0x09, 0xD9, 0x04, 0xD5, + 0x89, 0xBF, 0x01, 0xD7, 0x89, 0xBA, 0x05, 0xC9, 0x89, 0xBF, 0x01, 0xD7, + 0x89, 0xBA, 0x05, 0xC9, 0x89, 0xBF, 0x01, 0xD7, 0x89, 0xBA, 0x00, 0x40, + 0x10, 0xBF, 0x01, 0xD2, 0x68, 0xE0, 0x0F, 0xB0, 0x40, 0xB4, 0x00, 0xA8, + 0x0F, 0xB0, 0x40, 0xB4, 0x00, 0xA8, 0xF5, 0xDE, 0x0F, 0xB1, 0x0C, 0xB3, + 0x28, 0xE4, 0x39, 0xE4, 0x09, 0x9A, 0x0A, 0x9B, 0x83, 0xE4, 0x51, 0xC8, + 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, 0x19, 0xD5, 0x8B, 0xE4, + 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, 0x1C, 0xD5, + 0x00, 0xA9, 0x2A, 0xBF, 0x05, 0xD5, 0x01, 0xA9, 0x89, 0xE4, 0x0C, 0xB2, + 0x0F, 0xB0, 0xA0, 0xE0, 0x3B, 0xBF, 0xFA, 0xD5, 0xE0, 0xC2, 0xF7, 0xD4, + 0x83, 0xE4, 0x8B, 0xBD, 0x06, 0xC8, 0xF4, 0xD5, 0x01, 0xA9, 0xF2, 0xDE, + 0x83, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x82, 0xBD, 0xE1, 0xD5, + 0x01, 0xA8, 0x0C, 0xB2, 0x0F, 0xB0, 0xA0, 0xE0, 0x8B, 0xE4, 0x03, 0x40, + 0xFF, 0x7F, 0x8F, 0xBC, 0x8A, 0xBD, 0xDE, 0xD5, 0x01, 0xA8, 0xF5, 0xDE, + 0x1F, 0xB1, 0x0C, 0xB3, 0x28, 0xE4, 0x39, 0xE4, 0x0A, 0x9A, 0x0B, 0x9B, + 0x83, 0xE4, 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, + 0x1E, 0xD5, 0x8B, 0xE4, 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, + 0x8F, 0xBF, 0x22, 0xD5, 0x93, 0xE4, 0x7D, 0xC9, 0x8B, 0xE4, 0x7D, 0xC8, + 0x09, 0xE0, 0x08, 0xE0, 0x98, 0xBF, 0x22, 0xD5, 0xE0, 0xC9, 0x05, 0xD4, + 0x01, 0xA0, 0x80, 0xE4, 0x0C, 0xB2, 0x1F, 0xB0, 0xA0, 0xE0, 0x83, 0xE4, + 0x8B, 0xBD, 0x06, 0xC8, 0x82, 0xBD, 0x8A, 0xBD, 0xFF, 0xA0, 0xF4, 0xD5, + 0xF4, 0xDE, 0x83, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x82, 0xBD, + 0xDC, 0xD5, 0xFF, 0xA0, 0x80, 0xE4, 0x0C, 0xB2, 0x1F, 0xB0, 0xA0, 0xE0, + 0x8B, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x8A, 0xBD, 0xD8, 0xD5, + 0xFF, 0xA0, 0xF4, 0xDE, 0xE0, 0xC9, 0x0C, 0xD5, 0x4A, 0xE4, 0x00, 0xA1, + 0xB3, 0xBF, 0x03, 0xD7, 0x03, 0xD4, 0xA2, 0xBF, 0x01, 0xD6, 0x01, 0xA1, + 0xFF, 0xA0, 0xE0, 0xC1, 0xD3, 0xD5, 0xD3, 0xDE, 0x83, 0xE4, 0x32, 0xE4, + 0x2B, 0xE4, 0x8B, 0xBF, 0x03, 0xD7, 0x03, 0xD4, 0x3A, 0xBF, 0x01, 0xD6, + 0x01, 0xA9, 0xFF, 0xA0, 0xE0, 0xC9, 0xC6, 0xD5, 0xC6, 0xDE, 0x1F, 0xB1, + 0x0C, 0xB3, 0x28, 0xE4, 0x39, 0xE4, 0x0A, 0x9A, 0x0B, 0x9B, 0x83, 0xE4, + 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, 0x1D, 0xD5, + 0x8B, 0xE4, 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, + 0x23, 0xD5, 0x93, 0xE4, 0x7D, 0xC9, 0x8B, 0xE4, 0x7D, 0xC8, 0x09, 0xE0, + 0x08, 0xE0, 0x98, 0xBF, 0x23, 0xD5, 0xE0, 0xC8, 0x07, 0xD5, 0x83, 0xE4, + 0x8B, 0xBD, 0x06, 0xC8, 0x82, 0xBD, 0x8A, 0xBD, 0x01, 0xA0, 0x01, 0xD4, + 0xFF, 0xA0, 0x80, 0xE4, 0x0C, 0xB2, 0x1F, 0xB0, 0xA0, 0xE0, 0x83, 0xE4, + 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x82, 0xBD, 0xF5, 0xD4, 0x8B, 0xE4, + 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, 0xDD, 0xD4, + 0x8B, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x8A, 0xBD, 0xD7, 0xD5, + 0xFF, 0xA0, 0xE7, 0xDE, 0xE0, 0xC9, 0x10, 0xD5, 0x4A, 0xE4, 0x00, 0xA1, + 0xB3, 0xBF, 0x03, 0xD7, 0x03, 0xD4, 0xA2, 0xBF, 0x01, 0xDC, 0x01, 0xA1, + 0xFF, 0xA0, 0xE0, 0xC1, 0xDA, 0xD4, 0x01, 0xA0, 0x80, 0xE4, 0x0C, 0xB2, + 0x1F, 0xB0, 0xA0, 0xE0, 0x83, 0xE4, 0x32, 0xE4, 0x2B, 0xE4, 0x8B, 0xBF, + 0x03, 0xD7, 0x03, 0xD4, 0x3A, 0xBF, 0x01, 0xDC, 0x01, 0xA9, 0xFF, 0xA0, + 0xE0, 0xC9, 0xC9, 0xD4, 0x01, 0xA0, 0xEE, 0xDE, 0x1F, 0xB1, 0x0C, 0xB3, + 0x28, 0xE4, 0x39, 0xE4, 0x0A, 0x9A, 0x0B, 0x9B, 0x83, 0xE4, 0x51, 0xC8, + 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, 0x1E, 0xD5, 0x8B, 0xE4, + 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, 0x24, 0xD5, + 0x93, 0xE4, 0x7D, 0xC9, 0x8B, 0xE4, 0x7D, 0xC8, 0x09, 0xE0, 0x08, 0xE0, + 0x98, 0xBF, 0x2A, 0xD5, 0xE0, 0xC9, 0x05, 0xD4, 0x01, 0xA0, 0x80, 0xE4, + 0x0C, 0xB2, 0x1F, 0xB0, 0xA0, 0xE0, 0x83, 0xE4, 0x8B, 0xBD, 0x06, 0xC8, + 0x82, 0xBD, 0x8A, 0xBD, 0xFF, 0xA0, 0xF4, 0xD5, 0xF4, 0xDE, 0x83, 0xE4, + 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x82, 0xBD, 0xED, 0xD4, 0x8B, 0xE4, + 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, 0xDC, 0xD4, + 0x8B, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x8A, 0xBD, 0xE0, 0xD4, + 0x93, 0xE4, 0x7D, 0xC9, 0x8B, 0xE4, 0x7D, 0xC8, 0x09, 0xE0, 0x08, 0xE0, + 0x98, 0xBF, 0xD6, 0xD4, 0xE0, 0xC9, 0x0C, 0xD5, 0x4A, 0xE4, 0x00, 0xA1, + 0xB3, 0xBF, 0x03, 0xD7, 0x03, 0xD4, 0xA2, 0xBF, 0x01, 0xD6, 0x01, 0xA1, + 0xFF, 0xA0, 0xE0, 0xC1, 0xCB, 0xD5, 0xCB, 0xDE, 0x83, 0xE4, 0x32, 0xE4, + 0x2B, 0xE4, 0x8B, 0xBF, 0x03, 0xD7, 0x03, 0xD4, 0x3A, 0xBF, 0x01, 0xD6, + 0x01, 0xA9, 0xFF, 0xA0, 0xE0, 0xC9, 0xBE, 0xD5, 0xBE, 0xDE, 0x0F, 0xB1, + 0x0C, 0xB3, 0x28, 0xE4, 0x39, 0xE4, 0x09, 0x9A, 0x0A, 0x9B, 0x83, 0xE4, + 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, 0x19, 0xD5, + 0x8B, 0xE4, 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, 0x8F, 0xBF, + 0x1F, 0xD5, 0x2A, 0xBF, 0x04, 0xD5, 0x01, 0xA8, 0x0C, 0xB2, 0x0F, 0xB0, + 0xA0, 0xE0, 0x3B, 0xBF, 0x06, 0xD5, 0xE0, 0xC2, 0xF8, 0xD4, 0x83, 0xE4, + 0x8B, 0xBD, 0x06, 0xC8, 0xF4, 0xD4, 0x00, 0xA8, 0x0C, 0xB2, 0x0F, 0xB0, + 0xA0, 0xE0, 0x83, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x82, 0xBD, + 0xEA, 0xD4, 0x8B, 0xE4, 0x51, 0xC8, 0x7F, 0x40, 0x8F, 0xBC, 0x7F, 0x40, + 0x8F, 0xBF, 0xE1, 0xD4, 0x8B, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, + 0x8A, 0xBD, 0xDB, 0xD5, 0x01, 0xA8, 0xDC, 0xDE, 0x20, 0xB5, 0xFF, 0xB1, + 0x0C, 0x90, 0x0D, 0x91, 0x80, 0xBF, 0x07, 0xD4, 0x29, 0xE4, 0x21, 0xBE, + 0x00, 0x60, 0x00, 0x40, 0x20, 0xBF, 0x01, 0x40, 0x57, 0xD5, 0x29, 0xE4, + 0x06, 0xC2, 0x28, 0xBD, 0x01, 0x40, 0x99, 0xD5, 0x21, 0xE4, 0x06, 0xC2, + 0x20, 0xBD, 0x00, 0x40, 0xE7, 0xD5, 0x49, 0xE4, 0xFC, 0x5F, 0x00, 0x40, + 0x40, 0xBC, 0x51, 0xE4, 0xFC, 0x5F, 0x00, 0x40, 0x50, 0xBC, 0xFC, 0x5F, + 0x00, 0x40, 0x40, 0xBF, 0x01, 0x40, 0x50, 0xD5, 0xFC, 0x5F, 0x00, 0x40, + 0x50, 0xBF, 0x01, 0x40, 0x4B, 0xD5, 0x54, 0xBA, 0x01, 0x40, 0x7C, 0xD9, + 0x07, 0xD5, 0x45, 0xB8, 0x08, 0xBE, 0x19, 0xBE, 0x80, 0xBE, 0x91, 0xBE, + 0x08, 0xBE, 0x19, 0xBE, 0xD8, 0x40, 0x00, 0x40, 0x50, 0xBF, 0x00, 0x40, + 0xC5, 0xDC, 0x00, 0x60, 0x00, 0x40, 0x90, 0xE3, 0x01, 0x40, 0x62, 0xD5, + 0x07, 0x40, 0xFF, 0x7F, 0x9F, 0xBC, 0x04, 0x40, 0x00, 0x40, 0x90, 0xBD, + 0x00, 0xA7, 0x78, 0xBA, 0x87, 0xE4, 0x00, 0x40, 0x90, 0xB9, 0x69, 0xE0, + 0x00, 0x60, 0x00, 0x40, 0x10, 0xE3, 0x01, 0x40, 0x49, 0xD5, 0x07, 0x40, + 0xFF, 0x7F, 0x1F, 0xBC, 0x04, 0x40, 0x00, 0x40, 0x10, 0xBD, 0x00, 0xA7, + 0x70, 0xBA, 0x07, 0xE4, 0x00, 0x40, 0x10, 0xB9, 0x61, 0xE0, 0x45, 0xBF, + 0x00, 0x40, 0xF3, 0xD5, 0x00, 0xA2, 0x51, 0xC5, 0x34, 0xD5, 0x04, 0x40, + 0x00, 0x40, 0x40, 0xBF, 0x09, 0xD5, 0x06, 0xC9, 0x06, 0xC8, 0x92, 0xB9, + 0x04, 0x40, 0x00, 0x40, 0x40, 0xBA, 0x00, 0x40, 0x51, 0xBA, 0x27, 0xD5, + 0x20, 0xA3, 0x35, 0xBA, 0x11, 0xD9, 0x20, 0xE4, 0x8E, 0xC2, 0x02, 0x40, + 0x50, 0xBF, 0x06, 0xDA, 0x95, 0xC0, 0x71, 0xE4, 0x8E, 0xC7, 0x07, 0xBD, + 0x94, 0xC1, 0x19, 0xDE, 0x00, 0xA0, 0x71, 0xE4, 0x8E, 0xC7, 0x07, 0xBD, + 0x7C, 0xC1, 0x13, 0xDE, 0x02, 0x40, 0x50, 0xBA, 0x02, 0x40, 0x30, 0xB8, + 0x00, 0x40, 0x01, 0xBF, 0x00, 0x40, 0x20, 0xB9, 0x71, 0xE4, 0x02, 0x40, + 0x30, 0xBF, 0x02, 0xDA, 0x8E, 0xC7, 0x01, 0xDE, 0x00, 0xA7, 0x27, 0xB8, + 0x01, 0xE4, 0x94, 0xC0, 0x7C, 0xC1, 0x80, 0xB8, 0x91, 0xB9, 0x59, 0xE4, + 0x00, 0x60, 0x00, 0x40, 0x50, 0xBC, 0x09, 0xD2, 0x00, 0xA7, 0x72, 0xBA, + 0x27, 0xE4, 0x00, 0xA7, 0x78, 0xBB, 0x87, 0xE4, 0x00, 0xA7, 0x79, 0xBB, + 0x97, 0xE4, 0x04, 0x40, 0x00, 0x40, 0x90, 0xBF, 0x57, 0xD7, 0x08, 0x40, + 0x00, 0x40, 0x90, 0xBF, 0x34, 0xD7, 0x10, 0x40, 0x00, 0x40, 0x90, 0xBF, + 0x18, 0xD7, 0x00, 0xA7, 0x05, 0xC9, 0x00, 0x40, 0xFA, 0xD7, 0x05, 0xC8, + 0x00, 0x40, 0xFB, 0xD7, 0x05, 0xC2, 0x02, 0xD6, 0x00, 0x40, 0x21, 0xBD, + 0x04, 0x40, 0x00, 0x40, 0x40, 0xB8, 0x05, 0xC7, 0x03, 0xD6, 0x00, 0x60, + 0x00, 0x40, 0x80, 0xBD, 0x11, 0xC7, 0x03, 0xD6, 0x00, 0x60, 0x00, 0x40, + 0x20, 0xBD, 0x00, 0xA7, 0x05, 0xC9, 0x00, 0x40, 0xEA, 0xD7, 0x05, 0xC8, + 0x00, 0x40, 0xEB, 0xD7, 0x05, 0xC2, 0x02, 0xD6, 0x00, 0x40, 0x21, 0xBD, + 0x04, 0x40, 0x00, 0x40, 0x40, 0xB8, 0x05, 0xC7, 0x03, 0xD6, 0x00, 0x60, + 0x00, 0x40, 0x80, 0xBD, 0x11, 0xC7, 0x03, 0xD6, 0x00, 0x60, 0x00, 0x40, + 0x20, 0xBD, 0x72, 0xE4, 0x7D, 0xC7, 0x87, 0xB8, 0x00, 0x40, 0x90, 0xB9, + 0x00, 0x60, 0x00, 0x40, 0x20, 0xBF, 0x02, 0xD4, 0xFF, 0x7F, 0x8E, 0xBC, + 0x08, 0x40, 0x00, 0x40, 0x90, 0xE3, 0x03, 0xD5, 0x04, 0x40, 0x00, 0x40, + 0x40, 0xB8, 0x24, 0xE4, 0x04, 0x40, 0x00, 0x40, 0x20, 0xB8, 0x00, 0x40, + 0x75, 0xD3, 0xF3, 0x7F, 0xFF, 0x7F, 0x9F, 0xBC, 0x94, 0xBD, 0x95, 0xBD, + 0xFF, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0x90, 0xBF, 0x07, 0xD4, 0x98, 0xE4, + 0x00, 0xA8, 0x09, 0xE1, 0x10, 0xE4, 0x01, 0x40, 0x15, 0xB8, 0x04, 0xDE, + 0x09, 0xE1, 0x10, 0xE4, 0x00, 0x40, 0x1B, 0xBA, 0x01, 0xE4, 0x02, 0x40, + 0x00, 0xBA, 0x0D, 0xDA, 0x00, 0x40, 0x0C, 0xB8, 0x0D, 0xDB, 0x20, 0xE4, + 0x01, 0x40, 0x24, 0xB8, 0x60, 0xE0, 0x00, 0x40, 0x0C, 0xB8, 0x89, 0xE4, + 0x8A, 0xC8, 0x81, 0xC9, 0x0C, 0xDE, 0x04, 0xDB, 0x82, 0xC9, 0x09, 0xDE, + 0x01, 0x40, 0x04, 0xB8, 0x20, 0xA7, 0x70, 0xBA, 0x82, 0xC9, 0x68, 0xE4, + 0x9D, 0xC6, 0x96, 0xBD, 0x82, 0xC8, 0x71, 0xE4, 0x52, 0xC7, 0x47, 0xBA, + 0xCA, 0xD8, 0x50, 0xC4, 0x74, 0xE0, 0x01, 0x40, 0x4E, 0xBA, 0x19, 0xDA, + 0x00, 0x40, 0x4C, 0xB8, 0x0B, 0xD8, 0x01, 0x40, 0x44, 0xB8, 0x20, 0xA0, + 0x04, 0xBA, 0x91, 0xC8, 0x79, 0xE4, 0x82, 0xC7, 0x87, 0xBD, 0x91, 0xC9, + 0x95, 0xBD, 0xBC, 0xDE, 0x64, 0xE0, 0x00, 0x40, 0x4C, 0xB8, 0x20, 0xA0, + 0x04, 0xBA, 0x89, 0xC8, 0x79, 0xE4, 0x92, 0xC7, 0x87, 0xBD, 0x95, 0xE4, + 0xB1, 0xDE, 0x89, 0xE4, 0x91, 0xC8, 0x95, 0xE4, 0xAD, 0xDE, 0x00, 0x40, + 0x40, 0xBF, 0x06, 0xD4, 0x04, 0x40, 0x00, 0x40, 0x90, 0xBE, 0x04, 0x40, + 0x00, 0x40, 0x40, 0xB8, 0x04, 0x40, 0x00, 0x40, 0x10, 0xBE, 0xFE, 0x7F, + 0xFF, 0xD5, 0x04, 0x40, 0x00, 0x40, 0x50, 0xBA, 0xFE, 0x7F, 0xFA, 0xDE, + 0x04, 0x40, 0x00, 0x40, 0x20, 0xBA, 0x09, 0xE4, 0x02, 0xBC, 0x02, 0xBF, + 0x21, 0xD5, 0x00, 0xA9, 0x00, 0xA8, 0x90, 0xDE, 0x95, 0xE4, 0xFC, 0x5F, + 0x00, 0x40, 0x90, 0xBD, 0x00, 0xA8, 0x8A, 0xDE, 0xFC, 0x5F, 0x00, 0x40, + 0x40, 0xBF, 0x03, 0xD5, 0x91, 0xE4, 0x80, 0xE4, 0x83, 0xDE, 0xFC, 0x5F, + 0x00, 0x40, 0x50, 0xBF, 0xFF, 0x7F, 0x7E, 0xD4, 0x49, 0xE4, 0x32, 0xC4, + 0x48, 0xBD, 0x07, 0xD4, 0x41, 0xE4, 0x32, 0xC4, 0x40, 0xBD, 0x03, 0xD4, + 0x91, 0xBF, 0xFF, 0x7F, 0x73, 0xD5, 0x95, 0xE4, 0x02, 0x40, 0x00, 0x40, + 0x90, 0xBD, 0x00, 0xA8, 0xFF, 0x7F, 0x6C, 0xDE, 0x68, 0xE0, 0x00, 0x40, + 0x91, 0xB8, 0x69, 0xE0, 0xFF, 0x7F, 0x0D, 0xDE, 0x07, 0x40, 0xFF, 0x7F, + 0x1F, 0xBC, 0x04, 0x40, 0x00, 0x40, 0x10, 0xBD, 0xFE, 0x7F, 0xBB, 0xDE, + 0x07, 0x40, 0xFF, 0x7F, 0x9F, 0xBC, 0x04, 0x40, 0x00, 0x40, 0x90, 0xBD, + 0xFE, 0x7F, 0xA2, 0xDE, 0x65, 0xE0, 0xFE, 0x7F, 0x89, 0xDE, 0x80, 0xE4, + 0x91, 0xE4, 0xFF, 0x7F, 0x4F, 0xDE, 0x00, 0x40, 0x71, 0xBD, 0xFF, 0x7F, + 0x02, 0xDE, 0x01, 0x40, 0x70, 0xBD, 0xFF, 0x7F, 0x01, 0xDE, 0x00, 0x40, + 0x71, 0xBD, 0xFF, 0x7F, 0x12, 0xDE, 0x01, 0x40, 0x70, 0xBD, 0xFF, 0x7F, + 0x11, 0xDE, 0x20, 0xB5, 0xFF, 0xB1, 0x0C, 0x90, 0x0D, 0x91, 0x00, 0x60, + 0x00, 0x40, 0x10, 0xBE, 0xFE, 0x7F, 0x3C, 0xDE, 0x20, 0xB5, 0xFF, 0xB1, + 0x00, 0x40, 0x80, 0xBF, 0x03, 0xD4, 0x00, 0xA9, 0xFF, 0xB0, 0x40, 0xB4, + 0xCC, 0x50, 0x00, 0x40, 0x00, 0xA4, 0x00, 0xA5, 0x00, 0xA9, 0xFF, 0x7F, + 0x29, 0xDE, 0x20, 0xB5, 0xFF, 0xB1, 0x00, 0x40, 0x80, 0xBF, 0x03, 0xD4, + 0x00, 0xA9, 0xFF, 0xB0, 0x40, 0xB4, 0xCC, 0x50, 0x00, 0x40, 0x00, 0xA4, + 0x58, 0xE4, 0x00, 0x60, 0x00, 0x40, 0x50, 0xBC, 0x01, 0xD2, 0x68, 0xE0, + 0x00, 0xA9, 0xFF, 0x7F, 0x15, 0xDE, 0x20, 0xB5, 0xFF, 0xB1, 0x0C, 0x90, + 0x0D, 0x91, 0x49, 0xE4, 0xFC, 0x5F, 0x00, 0x40, 0x40, 0xBC, 0x51, 0xE4, + 0xFC, 0x5F, 0x00, 0x40, 0x50, 0xBC, 0xFC, 0x5F, 0x00, 0x40, 0x40, 0xBF, + 0x01, 0x40, 0x41, 0xD5, 0xFC, 0x5F, 0x00, 0x40, 0x50, 0xBF, 0x01, 0x40, + 0x3C, 0xD5, 0x69, 0xE4, 0x06, 0xC6, 0x68, 0xBD, 0x00, 0x40, 0x9A, 0xD5, + 0x61, 0xE4, 0x06, 0xC6, 0x60, 0xBD, 0x00, 0x40, 0x95, 0xD5, 0x05, 0xC4, + 0x01, 0x40, 0x05, 0xD5, 0x00, 0x40, 0x50, 0xBF, 0x01, 0x40, 0x01, 0xD5, + 0x75, 0xE4, 0x04, 0xC7, 0x47, 0xB8, 0x79, 0xE4, 0x71, 0xBE, 0x02, 0xD2, + 0x00, 0x48, 0x40, 0xBD, 0x07, 0x40, 0xFF, 0x7F, 0x9F, 0xBC, 0x07, 0x40, + 0xFF, 0x7F, 0x1F, 0xBC, 0x04, 0x40, 0x00, 0x40, 0x90, 0xBD, 0x04, 0x40, + 0x00, 0x40, 0x10, 0xBD, 0x28, 0xE4, 0x30, 0xE6, 0x73, 0xE1, 0x14, 0xB3, + 0xA9, 0xE4, 0xB0, 0xE6, 0x75, 0xE1, 0x3A, 0xB8, 0x00, 0x40, 0x50, 0xB9, + 0x00, 0xA6, 0xA8, 0xE4, 0xC1, 0xE4, 0xBC, 0xE6, 0x3A, 0xB8, 0x7A, 0xE1, + 0x5A, 0xB9, 0x00, 0x40, 0x60, 0xB9, 0xA9, 0xE4, 0xC1, 0xE4, 0xBC, 0xE6, + 0x5A, 0xB8, 0x7A, 0xE1, 0x6A, 0xB9, 0x14, 0xB2, 0x00, 0x40, 0x20, 0xBF, + 0x02, 0xD5, 0x00, 0x40, 0x31, 0xBD, 0x94, 0xE4, 0x42, 0xC9, 0xFF, 0x77, + 0x4F, 0xBC, 0x20, 0x40, 0x60, 0xE3, 0x21, 0xD5, 0x02, 0x40, 0x00, 0x40, + 0x40, 0xB8, 0x05, 0xC6, 0x07, 0xD7, 0x05, 0xC5, 0x12, 0xD7, 0x05, 0xC3, + 0x18, 0xD6, 0x00, 0x40, 0x31, 0xBD, 0x15, 0xDE, 0x05, 0xC5, 0x08, 0xD7, + 0x00, 0x60, 0x00, 0x40, 0x50, 0xBD, 0x05, 0xC3, 0x0E, 0xD6, 0x00, 0x40, + 0x31, 0xBD, 0x0B, 0xDE, 0x00, 0x60, 0x00, 0x40, 0x50, 0xBD, 0x05, 0xC3, + 0x02, 0xD6, 0x00, 0x40, 0x31, 0xBD, 0x00, 0x60, 0x00, 0x40, 0x30, 0xBD, + 0x00, 0xDE, 0x76, 0xE4, 0x32, 0xC7, 0x97, 0xBD, 0x75, 0xE4, 0x51, 0xC7, + 0x97, 0xBD, 0x85, 0xE4, 0x32, 0xC8, 0x73, 0xE4, 0x51, 0xC7, 0x87, 0xBD, + 0xFE, 0x47, 0x00, 0x40, 0x40, 0xBA, 0x2A, 0xDB, 0x32, 0xC3, 0x11, 0xD2, + 0x00, 0x40, 0x81, 0xB8, 0x00, 0x40, 0x90, 0xB9, 0x00, 0x60, 0x00, 0x40, + 0x30, 0xBF, 0x02, 0xD4, 0xFF, 0x7F, 0x8E, 0xBC, 0x08, 0x40, 0x00, 0x40, + 0x90, 0xE3, 0x03, 0xD5, 0x02, 0x40, 0x00, 0x40, 0x40, 0xB8, 0x24, 0xE4, + 0x02, 0x40, 0x00, 0x40, 0x20, 0xB8, 0x00, 0x50, 0x00, 0x40, 0x20, 0xE3, + 0x00, 0x40, 0xBA, 0xD4, 0xF3, 0x7F, 0xFF, 0x7F, 0x9F, 0xBC, 0x74, 0xE4, + 0x06, 0xC7, 0x97, 0xBD, 0xFF, 0xB0, 0x40, 0xB4, 0x91, 0xBE, 0x00, 0x60, + 0x00, 0x40, 0x90, 0xBC, 0x00, 0xA8, 0xF8, 0xDE, 0x56, 0x7F, 0x00, 0x40, + 0x40, 0xBF, 0x05, 0xD8, 0x00, 0xA8, 0x00, 0x60, 0x00, 0x40, 0x90, 0xBC, + 0xEF, 0xDE, 0x4C, 0xC4, 0x74, 0xE0, 0x01, 0x40, 0x4E, 0xBA, 0x3C, 0xDA, + 0x00, 0x40, 0x4C, 0xB8, 0x1D, 0xD8, 0x01, 0x40, 0x44, 0xB8, 0x20, 0xA5, + 0x54, 0xBA, 0x18, 0xE4, 0x96, 0xC1, 0x91, 0xC8, 0x79, 0xE4, 0x96, 0xC7, + 0x87, 0xBD, 0x06, 0xC9, 0x4A, 0xD7, 0x91, 0xC9, 0x05, 0xC9, 0x71, 0xE4, + 0x7D, 0xC7, 0x87, 0xB8, 0x00, 0x40, 0x90, 0xB9, 0x00, 0x40, 0x30, 0xBF, + 0xD1, 0xD4, 0x00, 0x60, 0x00, 0x40, 0x10, 0xBF, 0xCD, 0xD4, 0xFF, 0x7F, + 0x8E, 0xBC, 0xCA, 0xDE, 0x01, 0x40, 0x44, 0xB8, 0x20, 0xA5, 0x54, 0xBA, + 0x18, 0xE4, 0x92, 0xC1, 0x96, 0xC8, 0x79, 0xE4, 0x92, 0xC7, 0x87, 0xBD, + 0x00, 0x60, 0x00, 0x40, 0x90, 0xBC, 0x71, 0xE4, 0x7D, 0xC7, 0x87, 0xB8, + 0x00, 0x40, 0x90, 0xB9, 0x00, 0x40, 0x30, 0xBF, 0xB5, 0xD4, 0x00, 0x60, + 0x00, 0x40, 0x10, 0xBF, 0xB1, 0xD4, 0xFF, 0x7F, 0x8E, 0xBC, 0xAE, 0xDE, + 0x20, 0xA5, 0x54, 0xBA, 0x68, 0xE4, 0x96, 0xC6, 0x18, 0xE4, 0x91, 0xC1, + 0x79, 0xE4, 0x96, 0xC7, 0x17, 0xBD, 0x99, 0xE4, 0x91, 0xC8, 0x00, 0x60, + 0x00, 0x40, 0x90, 0xBC, 0x79, 0xE4, 0x91, 0xC7, 0x87, 0xBC, 0x71, 0xE4, + 0x7D, 0xC7, 0x87, 0xB8, 0x63, 0xBD, 0x98, 0xD4, 0x00, 0x60, 0x00, 0x40, + 0x10, 0xBF, 0x94, 0xD4, 0xFF, 0x7F, 0x8E, 0xBC, 0x91, 0xDE, 0x91, 0xC9, + 0x05, 0xC9, 0x00, 0x60, 0x00, 0x40, 0x90, 0xBD, 0xB2, 0xDE, 0x00, 0xA3, + 0x00, 0x40, 0x40, 0xBF, 0x14, 0xD4, 0x69, 0xE4, 0x00, 0x60, 0x00, 0x40, + 0x60, 0xBC, 0x06, 0xC9, 0x06, 0xC8, 0x93, 0xB9, 0x04, 0x40, 0x00, 0x40, + 0x90, 0xE3, 0x04, 0xD4, 0x02, 0x40, 0x00, 0x40, 0x40, 0xBA, 0xF5, 0xDE, + 0x96, 0xBD, 0x00, 0x40, 0x50, 0xBF, 0xFE, 0x7F, 0xE7, 0xD4, 0x61, 0xE4, + 0x00, 0x60, 0x00, 0x40, 0x60, 0xBC, 0x06, 0xC1, 0x06, 0xC0, 0x13, 0xB9, + 0x04, 0x40, 0x00, 0x40, 0x10, 0xE3, 0x04, 0xD4, 0x04, 0x40, 0x00, 0x40, + 0x50, 0xBA, 0x00, 0xDE, 0x16, 0xBD, 0xFE, 0x7F, 0xD5, 0xDE, 0x69, 0xE4, + 0x06, 0xC6, 0x68, 0xBD, 0x1A, 0xD5, 0x61, 0xE4, 0x06, 0xC6, 0x60, 0xBD, + 0x16, 0xD5, 0x42, 0xBF, 0x04, 0xD4, 0x69, 0xE4, 0x32, 0xC6, 0x68, 0xBD, + 0x10, 0xD4, 0x52, 0xBF, 0x04, 0xD4, 0x61, 0xE4, 0x32, 0xC6, 0x60, 0xBD, + 0x0A, 0xD4, 0x91, 0xBE, 0x00, 0x60, 0x00, 0x40, 0x90, 0xBC, 0xFC, 0x5F, + 0x00, 0x40, 0x90, 0xBD, 0x00, 0xA8, 0xFF, 0x7F, 0x43, 0xDE, 0xFE, 0x5F, + 0x00, 0x40, 0x00, 0xA9, 0xFF, 0x7F, 0x3E, 0xDE, 0x20, 0xB5, 0xFF, 0xB1, + 0x0C, 0x90, 0x0D, 0x91, 0x49, 0xE4, 0x51, 0xE4, 0xFC, 0x5F, 0x00, 0x40, + 0x40, 0xBC, 0xFC, 0x5F, 0x00, 0x40, 0x50, 0xBC, 0xFC, 0x5F, 0x00, 0x40, + 0x40, 0xBF, 0x01, 0x40, 0x11, 0xD5, 0xFC, 0x5F, 0x00, 0x40, 0x50, 0xBF, + 0x01, 0x40, 0x0C, 0xD5, 0x69, 0xE4, 0x06, 0xC6, 0x68, 0xBD, 0x01, 0x40, + 0x07, 0xD5, 0x61, 0xE4, 0x06, 0xC6, 0x60, 0xBD, 0x01, 0x40, 0x02, 0xD5, + 0x05, 0xC4, 0x00, 0x40, 0xD5, 0xD5, 0x00, 0x40, 0x50, 0xBF, 0x00, 0x40, + 0xD1, 0xD5, 0x75, 0xE4, 0x04, 0xC7, 0x47, 0xBA, 0x39, 0xE4, 0x31, 0xBE, + 0x00, 0x44, 0x00, 0x40, 0x00, 0xA5, 0x32, 0xC1, 0x11, 0xC1, 0x15, 0xBD, + 0x70, 0xE4, 0x61, 0xC7, 0x17, 0xBD, 0x32, 0xC9, 0x22, 0xC0, 0x03, 0xD4, + 0x15, 0xBF, 0x00, 0x40, 0x9A, 0xD5, 0x79, 0xE4, 0x11, 0xC7, 0x57, 0xBD, + 0x78, 0xE4, 0x61, 0xC7, 0x57, 0xBD, 0x68, 0xE4, 0x22, 0xC6, 0x93, 0xE4, + 0x00, 0x60, 0x00, 0x40, 0x90, 0xBC, 0x51, 0xBF, 0x01, 0xD4, 0x60, 0xBF, + 0x07, 0xD6, 0x02, 0x40, 0x00, 0x40, 0x40, 0xBA, 0x05, 0xC1, 0x01, 0x40, + 0x1E, 0xD7, 0x05, 0xC0, 0xFE, 0x47, 0x00, 0x40, 0x40, 0xB8, 0x96, 0x7F, + 0x00, 0x40, 0x40, 0xBF, 0xFE, 0x7F, 0xE7, 0xDB, 0xFE, 0x4F, 0x00, 0x40, + 0x40, 0xBF, 0x94, 0xDA, 0x60, 0xBA, 0x51, 0xBB, 0x05, 0xC1, 0x01, 0x40, + 0x00, 0xD7, 0x05, 0xC0, 0x04, 0x40, 0x00, 0x40, 0x00, 0xA8, 0x02, 0x40, + 0x00, 0x40, 0x00, 0xA2, 0x36, 0xE4, 0x30, 0xBA, 0x35, 0xE4, 0x31, 0xBB, + 0x03, 0xD7, 0x60, 0xBA, 0x53, 0xE4, 0x82, 0xBD, 0x05, 0xC1, 0x00, 0x40, + 0xE8, 0xD7, 0x05, 0xC0, 0x36, 0xE4, 0x30, 0xBA, 0x35, 0xE4, 0x31, 0xBB, + 0x05, 0xD7, 0x60, 0xBA, 0x53, 0xE4, 0x72, 0xE4, 0x05, 0xC7, 0x87, 0xBD, + 0x05, 0xC1, 0x00, 0x40, 0xD4, 0xD7, 0x05, 0xC0, 0x36, 0xE4, 0x30, 0xBA, + 0x35, 0xE4, 0x31, 0xBB, 0x05, 0xD7, 0x60, 0xBA, 0x53, 0xE4, 0x72, 0xE4, + 0x09, 0xC7, 0x87, 0xBD, 0x05, 0xC1, 0x00, 0x40, 0xC0, 0xD7, 0x05, 0xC0, + 0x36, 0xE4, 0x30, 0xBA, 0x35, 0xE4, 0x31, 0xBB, 0x05, 0xD7, 0x60, 0xBA, + 0x53, 0xE4, 0x72, 0xE4, 0x0D, 0xC7, 0x87, 0xBD, 0x36, 0xE4, 0x35, 0xBD, + 0x17, 0xD5, 0x12, 0xC5, 0x76, 0xE4, 0x71, 0xC7, 0x57, 0xBD, 0x12, 0xC6, + 0x0E, 0xC1, 0x70, 0xE4, 0x75, 0xC7, 0x17, 0xBD, 0x0E, 0xC0, 0x11, 0xC2, + 0xBF, 0xD4, 0x04, 0x40, 0x00, 0x40, 0x90, 0xE3, 0x0D, 0xD4, 0x98, 0xBD, + 0x00, 0xA8, 0x00, 0x60, 0x00, 0x40, 0x00, 0xA2, 0xB5, 0xDE, 0x05, 0xC7, + 0x04, 0x40, 0x00, 0x40, 0x90, 0xE3, 0x02, 0xD4, 0x98, 0xBD, 0x00, 0xA8, + 0x00, 0x40, 0x40, 0xBF, 0x35, 0xDB, 0x25, 0xE4, 0x21, 0xBA, 0x00, 0x40, + 0x8A, 0xD5, 0x04, 0xD7, 0x00, 0x40, 0x81, 0xB8, 0x00, 0x40, 0x90, 0xB9, + 0x00, 0x40, 0x20, 0xBF, 0x02, 0xD4, 0xFF, 0x7F, 0x8E, 0xBC, 0xFB, 0x7F, + 0xFF, 0x7F, 0x9F, 0xBC, 0x74, 0xE4, 0x06, 0xC7, 0x97, 0xBD, 0xFF, 0xB0, + 0x40, 0xB4, 0x00, 0x60, 0x00, 0x40, 0x30, 0xBC, 0x31, 0xC9, 0x93, 0xBD, + 0xFE, 0x47, 0x00, 0x40, 0x40, 0xB8, 0xFE, 0x4F, 0x00, 0x40, 0x40, 0xBF, + 0xFF, 0x7F, 0x10, 0xDA, 0x00, 0x40, 0x40, 0xBF, 0x04, 0xDB, 0x74, 0xE4, + 0x06, 0xC7, 0x97, 0xBD, 0xEA, 0xDE, 0x96, 0x7F, 0x00, 0x40, 0x40, 0xBF, + 0xFE, 0x7F, 0x53, 0xDB, 0x04, 0x40, 0x00, 0x40, 0x90, 0xBD, 0x00, 0xA3, + 0xFE, 0x7F, 0x5B, 0xDE, 0x36, 0xE4, 0x35, 0xBD, 0xFE, 0x7F, 0x57, 0xDE, + 0x00, 0xA3, 0x00, 0x40, 0x40, 0xBF, 0x14, 0xD4, 0x69, 0xE4, 0x00, 0x60, + 0x00, 0x40, 0x60, 0xBC, 0x06, 0xC9, 0x06, 0xC8, 0x93, 0xB9, 0x04, 0x40, + 0x00, 0x40, 0x90, 0xE3, 0x04, 0xD4, 0x02, 0x40, 0x00, 0x40, 0x40, 0xBA, + 0xF5, 0xD5, 0x96, 0xBD, 0x00, 0x40, 0x50, 0xBF, 0xFF, 0x7F, 0x17, 0xD4, + 0x61, 0xE4, 0x00, 0x60, 0x00, 0x40, 0x60, 0xBC, 0x06, 0xC1, 0x06, 0xC0, + 0x19, 0xB9, 0x04, 0x40, 0x00, 0x40, 0x10, 0xE3, 0x04, 0xD4, 0x04, 0x40, + 0x00, 0x40, 0x50, 0xBA, 0xF5, 0xD5, 0x16, 0xBD, 0xFF, 0x7F, 0x05, 0xDE, + 0xFC, 0x5F, 0x00, 0x40, 0x40, 0xBF, 0x10, 0xD4, 0xFC, 0x5F, 0x00, 0x40, + 0x50, 0xBF, 0xFE, 0x7F, 0xD0, 0xD5, 0xFC, 0x5F, 0x00, 0x40, 0x40, 0xBF, + 0x07, 0xD4, 0x49, 0xE4, 0x32, 0xC4, 0x48, 0xBD, 0xFE, 0x7F, 0xC7, 0xD4, + 0xFE, 0x7F, 0xBB, 0xDE, 0xFC, 0x5F, 0x00, 0x40, 0x50, 0xBF, 0x07, 0xD4, + 0x51, 0xE4, 0x32, 0xC5, 0x50, 0xBD, 0xFE, 0x7F, 0xBC, 0xD4, 0xFD, 0x7F, + 0xFF, 0xDE, 0x49, 0xE4, 0x06, 0xC4, 0x48, 0xBD, 0xFE, 0x7F, 0xAB, 0xD4, + 0x51, 0xE4, 0x06, 0xC5, 0x50, 0xBD, 0xFD, 0x7F, 0xF5, 0xD4, 0xFE, 0x7F, + 0xAE, 0xDE, 0x26, 0xE4, 0x20, 0xBA, 0xFF, 0x7F, 0x72, 0xDE, 0x05, 0xC0, + 0x00, 0x60, 0x00, 0x40, 0x00, 0xBD, 0xFF, 0x7F, 0x3B, 0xDE, 0x05, 0xC0, + 0x00, 0x60, 0x00, 0x40, 0x00, 0xBD, 0xFF, 0x7F, 0x27, 0xDE, 0x05, 0xC0, + 0x00, 0x60, 0x00, 0x40, 0x00, 0xBD, 0xFF, 0x7F, 0x13, 0xDE, 0x05, 0xC0, + 0x00, 0x60, 0x00, 0x40, 0x00, 0xBD, 0x04, 0x40, 0x00, 0x40, 0x00, 0xA8, + 0x02, 0x40, 0x00, 0x40, 0x00, 0xA2, 0xFE, 0x7F, 0xFB, 0xDE, 0x05, 0xC0, + 0x00, 0x60, 0x00, 0x40, 0x00, 0xBD, 0xFE, 0x7F, 0xDD, 0xDE, 0x20, 0xB5, + 0xFF, 0xB1, 0x39, 0xE4, 0x00, 0x60, 0x00, 0x40, 0x30, 0xBC, 0x49, 0xE4, + 0x06, 0xC4, 0x48, 0xBD, 0x28, 0xD5, 0x29, 0xE4, 0xFC, 0x5F, 0x00, 0x40, + 0x20, 0xBC, 0xFC, 0x5F, 0x00, 0x40, 0x20, 0xBF, 0x23, 0xD5, 0xFC, 0x4F, + 0x00, 0x40, 0x20, 0xBF, 0x1C, 0xD7, 0x78, 0x50, 0x00, 0x40, 0x20, 0xBF, + 0x1F, 0xD6, 0x62, 0xE0, 0x78, 0x50, 0x00, 0x40, 0x20, 0xB8, 0x49, 0xE4, + 0x2E, 0xC4, 0x00, 0x60, 0x00, 0x40, 0x40, 0xBD, 0x78, 0xE4, 0x55, 0xC7, + 0x47, 0xBD, 0x51, 0xC2, 0x00, 0x60, 0x00, 0x40, 0x30, 0xE3, 0x04, 0xD5, + 0x84, 0xE4, 0x89, 0xC8, 0x68, 0xE0, 0x04, 0xDE, 0x84, 0xE4, 0x89, 0xC8, + 0x01, 0xDE, 0x00, 0xA8, 0xFF, 0xB0, 0x40, 0xB4, 0x79, 0xE4, 0x32, 0xC7, + 0x87, 0xBD, 0x09, 0xD4, 0x83, 0xE4, 0x00, 0x60, 0x00, 0x40, 0x80, 0xBC, + 0xF5, 0xD4, 0xFF, 0x5F, 0xFF, 0x7F, 0x0F, 0xA8, 0xF1, 0xDE, 0x00, 0xA8, + 0xEF, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFA, 0xB6, 0x0D, 0x90, 0x00, 0x40, + 0xAC, 0x63, 0x00, 0xA2, 0x02, 0x01, 0x83, 0x90, 0x84, 0x98, 0x85, 0x99, + 0x31, 0x08, 0x00, 0x40, 0x4A, 0x63, 0x00, 0xA9, 0x1A, 0xDF, 0x09, 0x40, + 0x19, 0xDF, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0xA0, 0xE0, + 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x00, 0xA9, 0x08, 0x40, + 0x73, 0xDF, 0x00, 0x40, 0x88, 0x62, 0x08, 0xA9, 0x09, 0x08, 0xF8, 0x09, + 0xE0, 0xC9, 0x03, 0xD4, 0x80, 0xE4, 0x08, 0x40, 0xF4, 0xDF, 0x99, 0xE0, + 0xFB, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFC, 0xB6, 0x87, 0x98, 0x88, 0x99, + 0x24, 0x40, 0xD0, 0xE1, 0x83, 0x90, 0x00, 0x40, 0xC2, 0xDF, 0x04, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0x0F, 0xB1, 0x38, 0xE4, 0x28, 0xE4, 0x09, 0xE4, + 0x07, 0x91, 0xEF, 0xC1, 0x2A, 0xDD, 0x89, 0xE4, 0x83, 0xBD, 0x00, 0x40, + 0x83, 0xBC, 0x25, 0xD4, 0x93, 0xE4, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, + 0xC4, 0xC9, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0x00, 0x08, + 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, + 0xC4, 0xC9, 0xD0, 0xC1, 0xEF, 0xC1, 0xED, 0xDC, 0xE3, 0xC1, 0x07, 0xDD, + 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0xDC, 0xC1, 0xE3, 0xC1, + 0xF9, 0xDC, 0x29, 0xE4, 0xDF, 0xC1, 0xFF, 0xC1, 0x07, 0xD5, 0x00, 0x28, + 0xC1, 0xC0, 0x02, 0x38, 0xC1, 0xC2, 0xDF, 0xC1, 0xFF, 0xC1, 0xF9, 0xD4, + 0x83, 0xE4, 0x0F, 0xB0, 0xA0, 0xE0, 0x0F, 0xB1, 0x38, 0xE4, 0x29, 0xE4, + 0x07, 0x99, 0x08, 0xE4, 0x0F, 0x40, 0x2F, 0xBC, 0xE3, 0xC9, 0x21, 0xDD, + 0x00, 0x40, 0x83, 0xBC, 0x1E, 0xD4, 0x12, 0xE4, 0x22, 0xC1, 0x12, 0xBD, + 0x81, 0xE4, 0x42, 0xC8, 0x18, 0xBD, 0x09, 0xDE, 0x00, 0x11, 0xC4, 0xC0, + 0x00, 0x11, 0xC4, 0xC0, 0x00, 0x11, 0xC4, 0xC0, 0x00, 0x11, 0xC4, 0xC0, + 0xD0, 0xC9, 0xEF, 0xC9, 0xF5, 0xDC, 0xE3, 0xC9, 0x0A, 0xDD, 0x00, 0x11, + 0xC4, 0xC0, 0xDC, 0xC9, 0xE3, 0xC9, 0xFB, 0xDC, 0xDF, 0xC9, 0xFF, 0xC9, + 0x05, 0xD5, 0x00, 0x32, 0xC1, 0xC0, 0xDF, 0xC9, 0xFF, 0xC9, 0xFB, 0xD4, + 0x83, 0xE4, 0x0F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, + 0x18, 0xE4, 0x09, 0xE4, 0x29, 0x08, 0xE0, 0xC8, 0x04, 0xD4, 0x19, 0x18, + 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0x0A, 0x40, 0xE6, 0xDF, + 0x00, 0xA9, 0x20, 0x19, 0x10, 0x19, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0x0F, 0xB1, 0xB9, 0x7F, 0x00, 0xB6, 0x29, 0xE4, 0x49, 0x40, + 0x00, 0x90, 0x49, 0x40, 0x01, 0x91, 0x14, 0x44, 0xD3, 0xE1, 0xE9, 0x29, + 0xFF, 0x7F, 0x9D, 0xBC, 0x42, 0x40, 0x89, 0xEA, 0xF2, 0x29, 0x42, 0x40, + 0x99, 0xEA, 0x72, 0x09, 0x43, 0x40, 0x80, 0x99, 0x92, 0x09, 0x43, 0x40, + 0x82, 0x99, 0x14, 0x40, 0xD9, 0xE1, 0x03, 0x19, 0x42, 0x40, 0x81, 0x99, + 0x40, 0x40, 0x00, 0xA9, 0x41, 0x40, 0x83, 0x99, 0x42, 0x40, 0x82, 0x99, + 0x00, 0xA9, 0x42, 0x40, 0x83, 0x99, 0x83, 0x90, 0x84, 0x91, 0x93, 0xE4, + 0x28, 0xDF, 0x08, 0xE4, 0x88, 0xB8, 0x05, 0xD7, 0x83, 0xE4, 0x08, 0x40, + 0x4F, 0xDF, 0xE0, 0xC8, 0x0E, 0xD4, 0x42, 0x40, 0x88, 0xE8, 0x04, 0x40, + 0x80, 0xBC, 0x04, 0xD5, 0xE2, 0x28, 0x04, 0x40, 0x80, 0xBD, 0xE2, 0x38, + 0x80, 0xE4, 0x47, 0x40, 0x00, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0xFF, 0xA0, + 0xF0, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, 0x0A, 0x98, + 0x83, 0x99, 0x84, 0x98, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, + 0x90, 0xE4, 0x03, 0xDF, 0x05, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0xFC, 0xB3, 0x5F, 0xB1, 0xD1, 0xB6, 0xBD, 0x98, 0xF9, 0xE4, 0x3F, 0x90, + 0x40, 0x9D, 0x00, 0xA8, 0x86, 0x98, 0x87, 0x98, 0x3D, 0x99, 0xE0, 0xC9, + 0x04, 0xD5, 0xE9, 0x08, 0xE0, 0xC8, 0x01, 0x40, 0x90, 0xD5, 0xEF, 0x29, + 0x89, 0xE4, 0x00, 0x40, 0x88, 0xBC, 0x01, 0x40, 0x6D, 0xD5, 0x4F, 0x08, + 0xE0, 0xC8, 0x01, 0x40, 0x69, 0xD5, 0x89, 0xE4, 0x01, 0x40, 0x8A, 0xBC, + 0xEA, 0xC8, 0x01, 0x40, 0x70, 0xD5, 0x40, 0xE4, 0x70, 0xA2, 0xD7, 0xE1, + 0x27, 0xB8, 0x02, 0xE4, 0xAC, 0x92, 0x00, 0xA9, 0xAE, 0x99, 0xAD, 0x99, + 0x8A, 0x99, 0x34, 0xE4, 0x04, 0x28, 0x98, 0xE4, 0x09, 0xE0, 0x08, 0xD5, + 0x02, 0x40, 0x95, 0xBF, 0x05, 0xD5, 0xC1, 0xC4, 0x04, 0x28, 0x98, 0xE4, + 0x09, 0xE0, 0xF8, 0xD4, 0x14, 0xE4, 0x13, 0xBA, 0x10, 0xD5, 0x02, 0x13, + 0x12, 0x11, 0x2E, 0x98, 0x81, 0xB8, 0xAE, 0x98, 0xC8, 0xC2, 0x2D, 0x98, + 0xC1, 0xC8, 0xAD, 0x98, 0xE7, 0xC8, 0x01, 0x40, 0x5F, 0xD8, 0x0A, 0x98, + 0x81, 0xB8, 0x8A, 0x98, 0x04, 0x28, 0x08, 0xE0, 0x04, 0x40, 0x2E, 0xD5, + 0xC1, 0xC4, 0x00, 0xAB, 0x88, 0x9B, 0x89, 0x9B, 0xFF, 0xAC, 0x05, 0x40, + 0x7B, 0xEA, 0x04, 0x28, 0xA8, 0xE4, 0x0A, 0xE0, 0xC1, 0xC4, 0x8A, 0xE4, + 0xFE, 0x7F, 0x80, 0xB8, 0x05, 0x40, 0x88, 0xBF, 0x06, 0xDC, 0x0A, 0xC8, + 0x00, 0x40, 0x8A, 0x62, 0x8C, 0xB8, 0x08, 0x08, 0x88, 0xE0, 0xE0, 0xCA, + 0x04, 0x40, 0x14, 0xD5, 0x48, 0x40, 0xD3, 0xE1, 0x03, 0x3A, 0x01, 0xA6, + 0x00, 0xA8, 0x05, 0x40, 0x78, 0xEA, 0x16, 0xE4, 0x08, 0x90, 0x60, 0xBF, + 0x01, 0xDA, 0x10, 0xE4, 0x05, 0x40, 0x79, 0xE8, 0xE0, 0xC9, 0x02, 0x40, + 0xA2, 0xD5, 0xC1, 0xC1, 0xCB, 0xE4, 0x08, 0x40, 0xC4, 0xBC, 0x3C, 0xD4, + 0x09, 0x90, 0x01, 0xBA, 0xE0, 0xC0, 0x38, 0xDB, 0x01, 0x40, 0x00, 0xBF, + 0x03, 0x40, 0x4F, 0xDB, 0x00, 0x40, 0x88, 0x62, 0x0C, 0xAE, 0x04, 0xDE, + 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0x1E, 0xDB, 0x02, 0x1E, 0x10, 0xA8, + 0x12, 0x18, 0x2E, 0x98, 0x01, 0x40, 0x80, 0xB8, 0xAE, 0x98, 0xC8, 0xC2, + 0x2D, 0x98, 0xC1, 0xC8, 0xAD, 0x98, 0xE7, 0xC8, 0xEF, 0xDB, 0x8F, 0xE4, + 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFE, 0x7F, 0xF5, 0xDF, + 0xE0, 0xC8, 0x02, 0x40, 0x47, 0xD4, 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, + 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0xE2, 0xD8, 0x02, 0x1E, 0x12, 0x10, + 0x2E, 0x98, 0x80, 0xB8, 0xAE, 0x98, 0xC8, 0xC2, 0x2D, 0x98, 0xC1, 0xC8, + 0xAD, 0x98, 0xE7, 0xC8, 0x02, 0x40, 0xDD, 0xD8, 0x05, 0x40, 0x79, 0xE8, + 0x89, 0xE4, 0x08, 0xE0, 0x02, 0x40, 0x65, 0xD5, 0x2F, 0x40, 0xD8, 0xE1, + 0x02, 0x18, 0x01, 0xA8, 0x12, 0x18, 0x2E, 0x98, 0xC1, 0xC8, 0xAE, 0x98, + 0xC8, 0xC2, 0x2D, 0x98, 0xC1, 0xC8, 0xAD, 0x98, 0xE7, 0xC8, 0x02, 0x40, + 0x6E, 0xD8, 0x08, 0x40, 0xC0, 0xBF, 0x02, 0x40, 0x7A, 0xD5, 0x08, 0x90, + 0x06, 0xBA, 0xE0, 0xC0, 0x42, 0xDB, 0x01, 0x40, 0x00, 0xBF, 0x02, 0x40, + 0xCD, 0xDB, 0x00, 0x40, 0x89, 0x62, 0x0C, 0xAA, 0x04, 0xDE, 0xD0, 0xC0, + 0x01, 0x40, 0x00, 0xBF, 0x1E, 0xDB, 0x02, 0x1A, 0x10, 0xA8, 0x12, 0x18, + 0x2E, 0x98, 0x01, 0x40, 0x80, 0xB8, 0xAE, 0x98, 0xC8, 0xC2, 0x2D, 0x98, + 0xC1, 0xC8, 0xAD, 0x98, 0xE7, 0xC8, 0xEF, 0xDB, 0x8F, 0xE4, 0x0B, 0x40, + 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFE, 0x7F, 0xA2, 0xDF, 0xE0, 0xC8, + 0x01, 0x40, 0xF4, 0xD4, 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0xD0, 0xC0, + 0x01, 0x40, 0x00, 0xBF, 0xE2, 0xD8, 0x02, 0x1A, 0x12, 0x10, 0x2E, 0x98, + 0x80, 0xB8, 0xAE, 0x98, 0xC8, 0xC2, 0x2D, 0x98, 0xC1, 0xC8, 0xAD, 0x98, + 0xE7, 0xC8, 0x0D, 0xDB, 0x8F, 0xE4, 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xFE, 0x7F, 0x86, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0xD8, 0xD4, + 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0x02, 0x13, 0x12, 0x16, 0x2E, 0x98, + 0x86, 0xB8, 0xAE, 0x98, 0xC8, 0xC2, 0x2D, 0x98, 0xC1, 0xC8, 0xAD, 0x98, + 0xE7, 0xC8, 0x02, 0x40, 0x88, 0xD8, 0x00, 0x40, 0xB4, 0xBC, 0x42, 0xD5, + 0x09, 0x90, 0x01, 0xBA, 0xE0, 0xC0, 0x3E, 0xDB, 0x01, 0x40, 0x00, 0xBF, + 0x02, 0x40, 0xAC, 0xDB, 0x00, 0x40, 0x88, 0x62, 0x0C, 0xAE, 0x04, 0xDE, + 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0x1E, 0xDB, 0x02, 0x1E, 0x10, 0xA8, + 0x12, 0x18, 0x2E, 0x98, 0x01, 0x40, 0x80, 0xB8, 0xAE, 0x98, 0xC8, 0xC2, + 0x2D, 0x98, 0xC1, 0xC8, 0xAD, 0x98, 0xE7, 0xC8, 0xEF, 0xDB, 0x8F, 0xE4, + 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFE, 0x7F, 0x4D, 0xDF, + 0xE0, 0xC8, 0x01, 0x40, 0x9F, 0xD4, 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, + 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0xE2, 0xD8, 0x02, 0x1E, 0x12, 0x10, + 0x2E, 0x99, 0x90, 0xB8, 0xAE, 0x99, 0x2D, 0x98, 0xC1, 0xC8, 0xAD, 0x98, + 0xE7, 0xC8, 0x0B, 0xDB, 0x8F, 0xE4, 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xFE, 0x7F, 0x32, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0x84, 0xD4, + 0x2E, 0x99, 0x81, 0xE4, 0x09, 0x90, 0x10, 0xBF, 0x01, 0xDA, 0x80, 0xE4, + 0x0A, 0x90, 0x08, 0xB8, 0x8A, 0x90, 0xE0, 0xC9, 0x02, 0x40, 0x46, 0xD4, + 0x00, 0xA0, 0xAD, 0x90, 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0x06, 0x98, + 0xE0, 0xC8, 0xFE, 0x7F, 0xAE, 0xD5, 0x3D, 0x98, 0x06, 0x99, 0x07, 0x40, + 0xCE, 0xDF, 0x86, 0x90, 0xFE, 0x7F, 0xA7, 0xDE, 0x8F, 0xE4, 0x05, 0x40, + 0xA7, 0xDF, 0xFF, 0xA9, 0xE0, 0xC8, 0x12, 0xD4, 0xEF, 0x29, 0x89, 0xE4, + 0x01, 0x40, 0x8A, 0xBC, 0xEA, 0xC8, 0xFE, 0x7F, 0x90, 0xD4, 0xFF, 0x28, + 0x88, 0xB8, 0xFE, 0x7F, 0x8C, 0xD7, 0x83, 0x90, 0x84, 0x9D, 0x3D, 0x98, + 0x9F, 0xE4, 0xFE, 0x7F, 0x11, 0xDF, 0x98, 0xE4, 0x89, 0xE4, 0x2F, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x89, 0xE4, 0x07, 0x40, 0x5A, 0xDF, + 0xFE, 0x7F, 0x6B, 0xDE, 0x8F, 0xE4, 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xFD, 0x7F, 0xEA, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0x3C, 0xD4, + 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0xFE, 0x7F, 0x92, 0xDE, 0x01, 0x40, + 0xB0, 0xBD, 0x8B, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0x02, 0x40, 0x28, 0xD4, + 0x8B, 0xE4, 0x04, 0x40, 0x80, 0xBC, 0x02, 0x40, 0x23, 0xD5, 0x8D, 0x80, + 0xC4, 0xCD, 0x01, 0xA9, 0x00, 0x40, 0xA0, 0xDE, 0x01, 0x40, 0xB0, 0xBD, + 0x8B, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0x02, 0x40, 0x1D, 0xD4, 0x8B, 0xE4, + 0x04, 0x40, 0x80, 0xBC, 0x02, 0x40, 0x18, 0xD5, 0x8D, 0x80, 0xC4, 0xCD, + 0x00, 0xA9, 0x00, 0x40, 0x8F, 0xDE, 0x01, 0x40, 0xB0, 0xBD, 0x8B, 0xE4, + 0x01, 0x40, 0x80, 0xBC, 0x02, 0x40, 0x01, 0xD4, 0x8B, 0xE4, 0x04, 0x40, + 0x80, 0xBC, 0x01, 0x40, 0xFC, 0xD5, 0x8D, 0x20, 0xC4, 0xCD, 0xE0, 0xC0, + 0x01, 0x40, 0x2D, 0xD9, 0x01, 0xA9, 0x88, 0x9C, 0xCC, 0xB8, 0x02, 0xD7, + 0xF7, 0x7F, 0xBF, 0xBC, 0x70, 0xA3, 0xD7, 0xE1, 0x37, 0xB8, 0xE0, 0xC0, + 0x04, 0xD4, 0x08, 0x98, 0xE0, 0xC8, 0x01, 0x40, 0xCF, 0xD5, 0x89, 0xE4, + 0x48, 0xE0, 0xE1, 0xC8, 0x1A, 0xD5, 0x01, 0x40, 0xF7, 0xDB, 0xE2, 0xC8, + 0x25, 0xD5, 0x00, 0x40, 0x4C, 0x63, 0x0D, 0xA3, 0x83, 0xE4, 0x11, 0x40, + 0x5A, 0xDF, 0x68, 0xE4, 0xFE, 0x7F, 0x67, 0xDE, 0xDF, 0xC3, 0x80, 0xE4, + 0x0A, 0xA9, 0xF5, 0x7F, 0xA4, 0xDF, 0x03, 0x40, 0x80, 0xB8, 0x03, 0x38, + 0x80, 0xE4, 0x0A, 0xA9, 0xF4, 0x7F, 0xFF, 0xDF, 0x08, 0xE4, 0xE9, 0xC0, + 0xF1, 0xDC, 0xDF, 0xC3, 0x03, 0x40, 0x00, 0xB8, 0x03, 0x30, 0x0B, 0x40, + 0x0C, 0xA6, 0xD7, 0xE1, 0x67, 0xB8, 0x63, 0xBA, 0xFB, 0x7F, 0x64, 0xB8, + 0xFE, 0x7F, 0x4B, 0xDE, 0xDF, 0xC3, 0x80, 0xE4, 0x00, 0x40, 0x8F, 0xBC, + 0x07, 0x99, 0x89, 0xB8, 0x08, 0x28, 0x03, 0x38, 0x11, 0xC0, 0xF6, 0xD4, + 0xEC, 0xDE, 0x0D, 0x08, 0xC4, 0xCD, 0x89, 0x98, 0xE0, 0xC8, 0xFE, 0x7F, + 0x20, 0xDA, 0x68, 0xE0, 0x89, 0x98, 0x00, 0x40, 0xB4, 0xBD, 0xFE, 0x7F, + 0x1A, 0xDE, 0xC1, 0xC4, 0x01, 0x40, 0xB0, 0xBD, 0xFE, 0x7F, 0x15, 0xDE, + 0x04, 0x2A, 0xC1, 0xC4, 0x02, 0x40, 0xAA, 0xBF, 0x02, 0x40, 0x58, 0xD5, + 0x00, 0xA0, 0x07, 0xDE, 0x00, 0x40, 0x0A, 0xE6, 0x0A, 0xB8, 0xFD, 0x7F, + 0x00, 0xB8, 0x04, 0x2A, 0xC1, 0xC4, 0x8A, 0xE4, 0xFD, 0x7F, 0x80, 0xB8, + 0xE9, 0xC8, 0xF4, 0xDD, 0xC0, 0xE4, 0xFF, 0xC0, 0xFE, 0x7F, 0x01, 0xDA, + 0xFF, 0xAC, 0xFD, 0x7F, 0xFE, 0xDE, 0x0D, 0x08, 0xC4, 0xCD, 0x08, 0xE4, + 0x02, 0xA9, 0x00, 0x40, 0x4E, 0x63, 0x07, 0xA8, 0x87, 0x98, 0x00, 0x40, + 0xB2, 0xBD, 0x78, 0xAA, 0x00, 0xA8, 0x05, 0x40, 0x78, 0xEA, 0xFF, 0x7F, + 0x7E, 0xDE, 0x00, 0xA8, 0x05, 0x40, 0x78, 0xEA, 0x0D, 0x08, 0xC4, 0xCD, + 0x38, 0xE4, 0xE0, 0xC8, 0x01, 0x40, 0x9D, 0xD4, 0x00, 0x40, 0x4F, 0x63, + 0x08, 0xA3, 0x06, 0xA6, 0xFD, 0x7F, 0xF5, 0xDE, 0x00, 0x40, 0x4E, 0x63, + 0x07, 0xA0, 0x87, 0x90, 0x8B, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0x3F, 0xD4, + 0x8B, 0xE4, 0x04, 0x40, 0x80, 0xBC, 0x3B, 0xD5, 0x8D, 0x80, 0xC4, 0xCD, + 0x02, 0xA9, 0x8B, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0xD9, 0xD5, 0xE0, 0xC0, + 0xD7, 0xD5, 0x00, 0x40, 0xB2, 0xBD, 0xD4, 0xDE, 0x8B, 0xE4, 0x01, 0x40, + 0x80, 0xBC, 0x01, 0x40, 0x74, 0xD4, 0x04, 0x40, 0xB0, 0xBC, 0x01, 0x40, + 0x70, 0xD5, 0x0D, 0x08, 0x0A, 0x90, 0x88, 0x30, 0xC4, 0xCD, 0xFD, 0x7F, + 0x8A, 0xDE, 0x04, 0x28, 0x06, 0x40, 0x8C, 0xBF, 0x96, 0xD5, 0x01, 0x40, + 0xB0, 0xBD, 0xFD, 0x7F, 0xAD, 0xDE, 0x00, 0xA0, 0x00, 0x40, 0x0A, 0xE6, + 0x0A, 0xB8, 0xFD, 0x7F, 0x00, 0xB8, 0x04, 0x2A, 0xC1, 0xC4, 0x8A, 0xE4, + 0xFD, 0x7F, 0x80, 0xB8, 0xE9, 0xC8, 0xF4, 0xDD, 0x89, 0x90, 0xFD, 0x7F, + 0xA0, 0xDE, 0x00, 0x40, 0x4F, 0x63, 0x0F, 0xA9, 0x87, 0x99, 0x8B, 0xE4, + 0x01, 0x40, 0x80, 0xBC, 0xC1, 0xD5, 0x0D, 0x08, 0xC4, 0xCD, 0x08, 0xE4, + 0xC3, 0xDE, 0x04, 0x40, 0xB0, 0xBD, 0xFD, 0x7F, 0x8C, 0xDE, 0x48, 0x40, + 0xD3, 0xE1, 0x04, 0x40, 0xA3, 0xBF, 0x05, 0xD5, 0x8B, 0xE4, 0x01, 0x40, + 0x80, 0xBC, 0x01, 0x40, 0x92, 0xD5, 0x08, 0xA8, 0x83, 0x98, 0x3C, 0x40, + 0xD8, 0xE1, 0x00, 0xA9, 0xFC, 0x7F, 0x8D, 0xDF, 0x0D, 0x08, 0x83, 0x98, + 0xC4, 0xCD, 0x3C, 0x40, 0xD8, 0xE1, 0x84, 0x98, 0x3D, 0x98, 0x93, 0xE4, + 0x02, 0x40, 0x1D, 0xDF, 0x68, 0xE4, 0xFF, 0xC8, 0xFD, 0x7F, 0x84, 0xD4, + 0xEF, 0x28, 0x04, 0x40, 0x80, 0xBD, 0xEF, 0x38, 0x06, 0x99, 0xE0, 0xC9, + 0x03, 0xD5, 0x3D, 0x98, 0x06, 0x40, 0x5D, 0xDF, 0xEF, 0x28, 0x04, 0x40, + 0x80, 0xBC, 0xFF, 0xA9, 0xFE, 0x7F, 0xA4, 0xD4, 0x0A, 0x99, 0x89, 0xE4, + 0x2F, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x2B, 0xA8, 0x05, 0x40, + 0x78, 0xEA, 0xFD, 0x7F, 0x52, 0xDE, 0x00, 0x40, 0xB1, 0xBD, 0xFD, 0x7F, + 0x4E, 0xDE, 0x05, 0x40, 0x78, 0xE8, 0xE0, 0xC8, 0xFD, 0x7F, 0x49, 0xD4, + 0x20, 0xA8, 0x05, 0x40, 0x78, 0xEA, 0xFD, 0x7F, 0x44, 0xDE, 0x08, 0x40, + 0xB0, 0xBD, 0xFD, 0x7F, 0x40, 0xDE, 0x60, 0xE0, 0x2D, 0xA8, 0x05, 0x40, + 0x78, 0xEA, 0xFE, 0x7F, 0xCD, 0xDE, 0x8B, 0xE4, 0x00, 0x40, 0x82, 0xBC, + 0xFD, 0x7F, 0x5A, 0xD5, 0xC2, 0xC1, 0xFD, 0x7F, 0x57, 0xDE, 0x8B, 0xE4, + 0x00, 0x40, 0x82, 0xBC, 0xFD, 0x7F, 0xA5, 0xD5, 0x44, 0x40, 0xD9, 0xE1, + 0x30, 0xA8, 0x09, 0x38, 0x08, 0x40, 0x5A, 0xEA, 0x02, 0x19, 0x02, 0xA8, + 0x12, 0x18, 0x2E, 0x98, 0xC2, 0xC8, 0xAE, 0x98, 0xC8, 0xC2, 0x2D, 0x98, + 0xC1, 0xC8, 0xAD, 0x98, 0xE7, 0xC8, 0xFD, 0x7F, 0x92, 0xDB, 0x8F, 0xE4, + 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFC, 0x7F, 0x55, 0xDF, + 0xE0, 0xC8, 0xA8, 0xD4, 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0x08, 0x40, + 0xC0, 0xBF, 0xFD, 0x7F, 0x86, 0xD4, 0x09, 0x90, 0x01, 0xBA, 0xE0, 0xC0, + 0xFD, 0x7F, 0x81, 0xDB, 0x01, 0x40, 0x00, 0xBF, 0x00, 0x40, 0x9C, 0xDB, + 0x00, 0x40, 0x89, 0x62, 0x0C, 0xAA, 0x04, 0xDE, 0xD0, 0xC0, 0x01, 0x40, + 0x00, 0xBF, 0x1E, 0xDB, 0x02, 0x1A, 0x10, 0xA8, 0x12, 0x18, 0x2E, 0x98, + 0x01, 0x40, 0x80, 0xB8, 0xAE, 0x98, 0xC8, 0xC2, 0x2D, 0x98, 0xC1, 0xC8, + 0xAD, 0x98, 0xE7, 0xC8, 0xEF, 0xDB, 0x8F, 0xE4, 0x0B, 0x40, 0x00, 0xA9, + 0xD7, 0xE1, 0x97, 0xB8, 0xFC, 0x7F, 0x27, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, + 0x79, 0xD4, 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0xD0, 0xC0, 0x01, 0x40, + 0x00, 0xBF, 0xE2, 0xD8, 0x02, 0x1A, 0x12, 0x10, 0x2E, 0x98, 0x80, 0xB8, + 0xAE, 0x98, 0xC8, 0xC2, 0x2D, 0x98, 0xC1, 0xC8, 0xAD, 0x98, 0xE7, 0xC8, + 0xFD, 0x7F, 0x4B, 0xDB, 0x8F, 0xE4, 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xFC, 0x7F, 0x0A, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, 0x5C, 0xD4, + 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0xFD, 0x7F, 0x3C, 0xDE, 0x8F, 0xE4, + 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFB, 0x7F, 0xFB, 0xDF, + 0xE0, 0xC8, 0xFF, 0x7F, 0x4D, 0xD4, 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, + 0x05, 0x40, 0x79, 0xE8, 0xFD, 0x7F, 0x14, 0xDE, 0x00, 0x40, 0x89, 0x62, + 0x0C, 0xAA, 0xFD, 0x7F, 0x54, 0xDE, 0x8F, 0xE4, 0x0B, 0x40, 0x00, 0xA9, + 0xD7, 0xE1, 0x97, 0xB8, 0xFB, 0x7F, 0xE5, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, + 0x37, 0xD4, 0x70, 0xA2, 0xD7, 0xE1, 0x27, 0xB8, 0xFD, 0x7F, 0x69, 0xDE, + 0x8F, 0xE4, 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFB, 0x7F, + 0xD6, 0xDF, 0xE0, 0xC8, 0xFD, 0x7F, 0xB0, 0xD5, 0xFF, 0x7F, 0x26, 0xDE, + 0x89, 0xE4, 0x48, 0xE0, 0xFE, 0x7F, 0x51, 0xD4, 0x8B, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0xFE, 0x7F, 0x4C, 0xD5, 0x6F, 0x40, 0xD3, 0xE1, 0x30, 0xA8, + 0x03, 0x38, 0xFE, 0x7F, 0x46, 0xDE, 0x00, 0x40, 0x88, 0x62, 0x0C, 0xAE, + 0xFC, 0x7F, 0xD2, 0xDE, 0x00, 0x40, 0x88, 0x62, 0x0C, 0xAE, 0xFD, 0x7F, + 0x75, 0xDE, 0x0D, 0x08, 0xC4, 0xCD, 0x08, 0xE4, 0xFE, 0x7F, 0x01, 0xDE, + 0x0D, 0x08, 0xC4, 0xCD, 0x08, 0xE4, 0x01, 0xA9, 0xFE, 0x7F, 0x7C, 0xDE, + 0x0D, 0x08, 0xC4, 0xCD, 0x08, 0xE4, 0x00, 0xA9, 0xFE, 0x7F, 0x76, 0xDE, + 0x00, 0x40, 0x89, 0x62, 0x0C, 0xAA, 0x86, 0xDE, 0xE0, 0xC8, 0xFE, 0x7F, + 0x08, 0xD4, 0xDF, 0xC3, 0x90, 0xE4, 0x00, 0x40, 0x97, 0xBC, 0x03, 0x40, + 0x90, 0xB8, 0x03, 0x39, 0x0D, 0xC0, 0xF7, 0xD4, 0x8B, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0xFE, 0x7F, 0x16, 0xD5, 0x03, 0x40, 0x90, 0xBF, 0xFE, 0x7F, + 0x12, 0xD5, 0xDF, 0xC3, 0xC6, 0xDE, 0x0D, 0x08, 0x0A, 0x99, 0x08, 0x19, + 0xC4, 0xCD, 0xFC, 0x7F, 0x1A, 0xDE, 0x05, 0x40, 0xA3, 0xBF, 0x04, 0xD5, + 0x9B, 0xE4, 0x01, 0x40, 0x90, 0xBC, 0x52, 0xD5, 0x8C, 0x93, 0x00, 0xA6, + 0x16, 0xE4, 0x08, 0xA8, 0x83, 0x98, 0x34, 0x40, 0xD8, 0xE1, 0x96, 0xE4, + 0xFB, 0x7F, 0x45, 0xDF, 0xE0, 0xCC, 0x5F, 0xD9, 0x0C, 0x99, 0x81, 0xE4, + 0x0A, 0xC8, 0x89, 0xB8, 0x08, 0x08, 0xE0, 0xC8, 0x14, 0xD5, 0x83, 0x98, + 0x34, 0x40, 0xD8, 0xE1, 0x84, 0x98, 0x3D, 0x98, 0x48, 0x40, 0xD9, 0xE1, + 0x00, 0x40, 0xCD, 0xDF, 0x08, 0xE4, 0xFF, 0xC8, 0xFE, 0x7F, 0xB0, 0xD5, + 0x86, 0xB8, 0x8C, 0xBF, 0x04, 0xD8, 0xC1, 0xC1, 0x68, 0xE4, 0x8C, 0xBF, + 0xE5, 0xD4, 0xE0, 0xC6, 0xFC, 0x7F, 0x2D, 0xD5, 0x96, 0xE4, 0xC1, 0xC9, + 0x3D, 0x98, 0x09, 0x40, 0x60, 0xDF, 0x86, 0x98, 0xE0, 0xC8, 0x5D, 0xD5, + 0x08, 0xA8, 0x83, 0x98, 0x34, 0x40, 0xD8, 0xE1, 0x00, 0xA9, 0xFB, 0x7F, + 0x16, 0xDF, 0x30, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x84, 0x96, 0xC4, 0xC8, + 0x85, 0x98, 0x3D, 0x98, 0x06, 0x99, 0x00, 0x40, 0xD9, 0xDF, 0x86, 0xBF, + 0xFE, 0x7F, 0x8A, 0xD4, 0x06, 0x93, 0x93, 0xE4, 0x96, 0xB8, 0x00, 0xA8, + 0x09, 0x38, 0xFC, 0x7F, 0x0A, 0xDE, 0x0D, 0x08, 0xC4, 0xCD, 0x03, 0x38, + 0xFC, 0x7F, 0x01, 0xDE, 0xE0, 0xCC, 0xFD, 0x7F, 0x95, 0xD9, 0x83, 0x9C, + 0x0B, 0x40, 0x04, 0xDF, 0x6C, 0xE4, 0xE0, 0xC8, 0xFB, 0x7F, 0xFB, 0xD5, + 0x68, 0xE4, 0x63, 0xBA, 0x6C, 0xBF, 0xFB, 0x7F, 0xF6, 0xDB, 0x6C, 0xE4, + 0xFB, 0x7F, 0xF3, 0xDE, 0x2E, 0x98, 0xE0, 0xC8, 0x14, 0xD4, 0x00, 0xA8, + 0xAD, 0x98, 0xFE, 0x7F, 0x69, 0xDE, 0x30, 0x40, 0xD8, 0xE1, 0x83, 0x98, + 0x84, 0x96, 0xC4, 0xC8, 0x85, 0x98, 0x3D, 0x98, 0x96, 0xE4, 0x00, 0x40, + 0xA7, 0xDF, 0x68, 0xE4, 0xFF, 0xC8, 0xFE, 0x7F, 0x57, 0xD5, 0x8C, 0x93, + 0xAC, 0xDE, 0x8F, 0xE4, 0x0B, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, + 0xFA, 0x7F, 0xFD, 0xDF, 0xE0, 0xC8, 0xE3, 0xD5, 0xFE, 0x7F, 0x4E, 0xDE, + 0x0D, 0x08, 0xC4, 0xCD, 0xC8, 0xE4, 0x88, 0xB8, 0xFB, 0x7F, 0xB1, 0xD6, + 0xFF, 0xAC, 0xFB, 0x7F, 0xAE, 0xDE, 0xEF, 0x28, 0x04, 0x40, 0x80, 0xBD, + 0xEF, 0x38, 0xFE, 0x7F, 0x45, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0xE4, 0xB6, + 0x29, 0xE4, 0x24, 0x90, 0x25, 0x93, 0x14, 0x40, 0xD1, 0xE1, 0x20, 0x40, + 0x08, 0xA9, 0x02, 0x40, 0x89, 0xEA, 0x01, 0x18, 0x89, 0x98, 0x82, 0xE4, + 0xDF, 0xC8, 0xE0, 0xC2, 0x01, 0xD4, 0x82, 0xE4, 0x21, 0x18, 0x51, 0x18, + 0xFF, 0xA8, 0x02, 0x40, 0x98, 0xEA, 0x83, 0x90, 0x84, 0x93, 0x00, 0x40, + 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0x91, 0xE4, 0x0F, 0x40, 0x22, 0xDF, + 0x08, 0xE4, 0xE0, 0xC2, 0x03, 0xD5, 0x01, 0x09, 0x00, 0xA8, 0x09, 0x38, + 0x80, 0xE4, 0x1C, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x1F, 0xB1, + 0xE4, 0xB6, 0x48, 0xE4, 0x25, 0x90, 0x26, 0x91, 0x27, 0x93, 0x14, 0x40, + 0xD2, 0xE1, 0x20, 0x40, 0x08, 0xA8, 0x02, 0x40, 0x88, 0xEA, 0x02, 0x19, + 0x89, 0x99, 0x80, 0xE4, 0xDF, 0xC8, 0xE0, 0xC0, 0x01, 0xD4, 0x80, 0xE4, + 0x22, 0x18, 0x52, 0x18, 0xFF, 0xA8, 0x02, 0x40, 0x98, 0xEA, 0x83, 0x91, + 0x84, 0x93, 0x84, 0xE4, 0x92, 0xE4, 0x0E, 0x40, 0xF9, 0xDF, 0x18, 0xE4, + 0xE0, 0xC0, 0x03, 0xD5, 0x02, 0x09, 0x00, 0xA8, 0x09, 0x38, 0x81, 0xE4, + 0x1C, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, 0xF8, 0xB6, + 0x28, 0xE4, 0x19, 0xE4, 0x0F, 0x98, 0x10, 0x90, 0x00, 0xA9, 0xE0, 0xC1, + 0x0C, 0xD5, 0x83, 0x98, 0x84, 0x90, 0x82, 0xE4, 0x91, 0xE4, 0x00, 0x40, + 0x87, 0xDF, 0x98, 0xE4, 0xFF, 0xC9, 0x09, 0xD5, 0x08, 0xB6, 0x07, 0xB0, + 0x40, 0xB4, 0x83, 0x99, 0x84, 0x90, 0x82, 0xE4, 0x14, 0x40, 0xD9, 0xE1, + 0xF2, 0xDE, 0x00, 0xA8, 0x00, 0x18, 0x08, 0x40, 0x0A, 0xA8, 0x02, 0x18, + 0x89, 0xE4, 0xF0, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, + 0x0A, 0x98, 0x83, 0x99, 0x84, 0x98, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, + 0x09, 0x08, 0x90, 0xE4, 0xD0, 0xDF, 0x05, 0xB6, 0x01, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xF8, 0xB6, 0xF8, 0xE4, 0xE9, 0xE4, + 0x18, 0x9A, 0x19, 0x94, 0x1A, 0x93, 0x19, 0xE4, 0xE0, 0xC9, 0x33, 0xD5, + 0x00, 0xA6, 0x0A, 0x02, 0x64, 0xBF, 0x2A, 0xD6, 0x14, 0x40, 0xDB, 0xE1, + 0x03, 0x0C, 0x13, 0x0D, 0x02, 0x08, 0x83, 0x98, 0x84, 0x93, 0x8F, 0xE4, + 0x9B, 0xE4, 0xFF, 0x7F, 0xB2, 0xDF, 0x08, 0xE4, 0xFF, 0xC8, 0x26, 0xD5, + 0x84, 0xE4, 0x80, 0xBA, 0x86, 0xBF, 0x1F, 0xD7, 0x04, 0xBF, 0x1D, 0xD6, + 0x60, 0xB8, 0xE0, 0xCE, 0x0D, 0xD5, 0x00, 0xA9, 0x06, 0xDE, 0x8B, 0xE4, + 0x89, 0xB8, 0x08, 0x28, 0x01, 0x38, 0xC1, 0xC1, 0xC1, 0xC9, 0x90, 0xBF, + 0xF8, 0xD9, 0x0A, 0x08, 0xC4, 0xC8, 0x0A, 0x18, 0x02, 0x08, 0xC4, 0xC2, + 0xE0, 0xC8, 0x13, 0xD5, 0x64, 0xBF, 0xD8, 0xD7, 0x86, 0xE4, 0x08, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0xFF, 0xA4, 0xCB, 0xDE, 0x03, 0x1C, + 0x13, 0x1D, 0xF6, 0xDE, 0x08, 0x40, 0x0A, 0xA8, 0x0F, 0x18, 0x00, 0xA8, + 0x03, 0x18, 0x80, 0xE4, 0xF0, 0xDE, 0xE0, 0xCE, 0x01, 0xD5, 0x0A, 0x18, + 0x03, 0x18, 0x86, 0xE4, 0xDF, 0xC8, 0xE9, 0xDE, 0x20, 0xB5, 0x03, 0xB1, + 0xFA, 0xB6, 0x18, 0xE4, 0x0C, 0x98, 0x0D, 0x90, 0x83, 0x99, 0x84, 0x98, + 0x85, 0x90, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0x91, 0xE4, + 0x9F, 0xDF, 0x06, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x5F, 0xB1, + 0xFD, 0xB6, 0x69, 0xE4, 0x0D, 0x91, 0x0E, 0x92, 0x00, 0x40, 0xAD, 0x63, + 0x00, 0xA8, 0x0D, 0x40, 0xBC, 0xDF, 0xE1, 0xC8, 0x09, 0xDC, 0x96, 0xE4, + 0xE0, 0xC6, 0x02, 0xD5, 0x06, 0x31, 0x01, 0xA9, 0x89, 0xE4, 0x03, 0xB6, + 0x5F, 0xB0, 0x40, 0xB4, 0x00, 0x40, 0xAD, 0x63, 0x00, 0xA8, 0x00, 0x40, + 0x51, 0x63, 0x00, 0xA9, 0x0D, 0x40, 0x75, 0xDF, 0xE0, 0xC8, 0x5C, 0xD4, + 0x96, 0xE4, 0xE0, 0xC6, 0xEF, 0xD5, 0x07, 0x40, 0x1F, 0xBF, 0xEA, 0xDB, + 0x81, 0xE4, 0xF8, 0x7F, 0x80, 0xB8, 0x77, 0x40, 0x8F, 0xBF, 0x00, 0x40, + 0xFE, 0xDD, 0x81, 0xE4, 0x80, 0x7F, 0x80, 0xB8, 0x7F, 0x4F, 0x8F, 0xBF, + 0x00, 0x40, 0x7B, 0xDD, 0x81, 0xE4, 0x00, 0x70, 0x80, 0xB8, 0x07, 0x40, + 0xFF, 0x6F, 0x8F, 0xBF, 0x00, 0x40, 0xFC, 0xDD, 0x81, 0xE4, 0xF8, 0x7F, + 0x00, 0x40, 0x80, 0xB8, 0xF7, 0x40, 0xFF, 0x7F, 0x8F, 0xBF, 0x01, 0x40, + 0x14, 0xDD, 0xFF, 0xA9, 0xFF, 0x40, 0xFF, 0x7F, 0x1F, 0xBF, 0xC8, 0xDB, + 0x81, 0xE4, 0x00, 0x50, 0x00, 0x40, 0x80, 0xBC, 0x78, 0xC8, 0xFF, 0x7F, + 0x8C, 0xBD, 0x06, 0x38, 0xC1, 0xC6, 0x81, 0xE4, 0xC0, 0x4F, 0x00, 0x40, + 0x80, 0xBC, 0x60, 0xC8, 0xF8, 0x7F, 0x80, 0xBD, 0x06, 0x38, 0xC1, 0xC6, + 0x81, 0xE4, 0x3F, 0x40, 0x00, 0x40, 0x80, 0xBC, 0x48, 0xC8, 0xF8, 0x7F, + 0x80, 0xBD, 0x06, 0x38, 0xC1, 0xC6, 0x81, 0xE4, 0x00, 0x40, 0x00, 0x7F, + 0x80, 0xBC, 0x30, 0xC8, 0xF8, 0x7F, 0x80, 0xBD, 0x06, 0x38, 0xC1, 0xC6, + 0x81, 0xE4, 0xFC, 0x40, 0x80, 0xBC, 0x18, 0xC8, 0xF8, 0x7F, 0x80, 0xBD, + 0x06, 0x38, 0x03, 0x40, 0x1F, 0xBC, 0xF8, 0x7F, 0x10, 0xBD, 0x16, 0x31, + 0x06, 0xA9, 0x96, 0xDE, 0x00, 0x40, 0xAD, 0x63, 0x00, 0xA8, 0x00, 0x40, + 0x51, 0x63, 0x08, 0xA9, 0x0D, 0x40, 0x0F, 0xDF, 0xE0, 0xC8, 0x47, 0xD4, + 0x21, 0xE4, 0x20, 0xC2, 0x82, 0xE4, 0x96, 0xE4, 0xE0, 0xC6, 0x86, 0xD5, + 0x48, 0xE0, 0xFF, 0x7F, 0x7E, 0xD5, 0x82, 0xE4, 0x07, 0x40, 0x8F, 0xB8, + 0x48, 0xE0, 0x01, 0x40, 0x8E, 0xBF, 0x06, 0xDD, 0x82, 0xE4, 0x02, 0x40, + 0x80, 0xB8, 0x48, 0xE0, 0xEF, 0xC8, 0x54, 0xDC, 0x81, 0xE4, 0xFC, 0x7F, + 0x80, 0xB8, 0x48, 0xE0, 0x03, 0x40, 0x8E, 0xBF, 0x07, 0xDD, 0x81, 0xE4, + 0xF8, 0x7F, 0x80, 0xB8, 0x48, 0xE0, 0x07, 0x40, 0x8C, 0xBF, 0x46, 0xDC, + 0x06, 0x32, 0x16, 0x31, 0x02, 0xA9, 0xFF, 0x7F, 0x63, 0xDE, 0x00, 0x73, + 0x80, 0xB8, 0xFF, 0xA9, 0x7F, 0x40, 0x8F, 0xBF, 0xFF, 0x7F, 0x5C, 0xDD, + 0x81, 0xE4, 0x00, 0x4F, 0x80, 0xBC, 0x30, 0xC8, 0xFE, 0x7F, 0x80, 0xBD, + 0x06, 0x38, 0xC1, 0xC6, 0x81, 0xE4, 0xFC, 0x40, 0x80, 0xBC, 0x18, 0xC8, + 0xF8, 0x7F, 0x80, 0xBD, 0x06, 0x38, 0x03, 0x40, 0x1F, 0xBC, 0xF8, 0x7F, + 0x10, 0xBD, 0x16, 0x31, 0x03, 0xA9, 0xFF, 0x7F, 0x45, 0xDE, 0x00, 0x40, + 0xAD, 0x63, 0x00, 0xA8, 0x00, 0x40, 0x51, 0x63, 0x0F, 0xA9, 0x0C, 0x40, + 0xBE, 0xDF, 0xE0, 0xC8, 0x1C, 0xD4, 0x31, 0xE4, 0x21, 0xE4, 0x20, 0xC2, + 0x82, 0xE4, 0x96, 0xE4, 0xE0, 0xC6, 0xFF, 0x7F, 0x33, 0xD5, 0x48, 0xE0, + 0xFF, 0x7F, 0x2B, 0xD5, 0x0A, 0x40, 0x80, 0xBF, 0x0B, 0xDD, 0x0F, 0x40, + 0x8F, 0xBF, 0x08, 0xD5, 0x81, 0xE4, 0x48, 0xE0, 0x0A, 0x40, 0x80, 0xBF, + 0x03, 0xDD, 0x0F, 0x40, 0x8F, 0xBF, 0xBA, 0xD4, 0xFF, 0xA9, 0xFF, 0x7F, + 0x1F, 0xDE, 0x00, 0x40, 0xAD, 0x63, 0x00, 0xA8, 0x00, 0x40, 0x52, 0x63, + 0x07, 0xA9, 0x0C, 0x40, 0x98, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, 0x0F, 0xD4, + 0x48, 0xE4, 0x31, 0xE4, 0x20, 0xC3, 0x83, 0xE4, 0x01, 0xA9, 0xE0, 0xC6, + 0xFF, 0x7F, 0x0C, 0xD5, 0x48, 0xE0, 0x00, 0x40, 0x7A, 0xD5, 0x83, 0xE4, + 0xFD, 0x7F, 0x8F, 0xB8, 0x48, 0xE0, 0x05, 0x40, 0x8D, 0xBF, 0xE0, 0xDC, + 0x81, 0xE4, 0xFD, 0x7F, 0x8F, 0xB8, 0x48, 0xE0, 0x05, 0x40, 0x8D, 0xBF, + 0xD9, 0xDC, 0x02, 0x08, 0xE0, 0xC8, 0x0B, 0xD4, 0x02, 0x19, 0x1B, 0xA8, + 0x06, 0x38, 0x69, 0xB8, 0x24, 0xA8, 0x06, 0x38, 0x69, 0xB8, 0x42, 0xA8, + 0x06, 0x38, 0x69, 0xB8, 0x03, 0xA4, 0x06, 0x33, 0x16, 0x31, 0x94, 0xE4, + 0xC2, 0xC9, 0xFE, 0x7F, 0xE7, 0xDE, 0x81, 0xE4, 0x7C, 0x40, 0x80, 0xBC, + 0x18, 0xC8, 0xFC, 0x7F, 0x80, 0xBD, 0x06, 0x38, 0x03, 0x40, 0x1F, 0xBC, + 0xF8, 0x7F, 0x10, 0xBD, 0xFF, 0x7F, 0x73, 0xDE, 0x81, 0xE4, 0x07, 0x40, + 0x00, 0x40, 0x80, 0xBC, 0x48, 0xC8, 0xFF, 0x7F, 0x80, 0xBD, 0x06, 0x38, + 0xC1, 0xC6, 0x81, 0xE4, 0x00, 0x40, 0x00, 0x7F, 0x80, 0xBC, 0x30, 0xC8, + 0xF8, 0x7F, 0x80, 0xBD, 0x06, 0x38, 0xC1, 0xC6, 0x81, 0xE4, 0xFC, 0x40, + 0x80, 0xBC, 0x18, 0xC8, 0xF8, 0x7F, 0x80, 0xBD, 0x06, 0x38, 0x03, 0x40, + 0x1F, 0xBC, 0xF8, 0x7F, 0x10, 0xBD, 0x16, 0x31, 0x04, 0xA9, 0xFE, 0x7F, + 0xB9, 0xDE, 0x81, 0xE4, 0xC0, 0x40, 0x00, 0x40, 0x80, 0xBC, 0x60, 0xC8, + 0xFF, 0x7F, 0x88, 0xBD, 0x06, 0x38, 0xC1, 0xC6, 0x81, 0xE4, 0x3F, 0x40, + 0x00, 0x40, 0x80, 0xBC, 0x48, 0xC8, 0xF8, 0x7F, 0x80, 0xBD, 0x06, 0x38, + 0xC1, 0xC6, 0x81, 0xE4, 0x00, 0x40, 0x00, 0x7F, 0x80, 0xBC, 0x30, 0xC8, + 0xF8, 0x7F, 0x80, 0xBD, 0x06, 0x38, 0xC1, 0xC6, 0x81, 0xE4, 0xFC, 0x40, + 0x80, 0xBC, 0x18, 0xC8, 0xF8, 0x7F, 0x80, 0xBD, 0x06, 0x38, 0x03, 0x40, + 0x1F, 0xBC, 0xF8, 0x7F, 0x10, 0xBD, 0x16, 0x31, 0x05, 0xA9, 0xFE, 0x7F, + 0x8F, 0xDE, 0x02, 0x08, 0xE0, 0xC8, 0x0B, 0xD5, 0x02, 0x14, 0x1B, 0xA8, + 0x06, 0x38, 0xC1, 0xC6, 0x28, 0xA8, 0x06, 0x38, 0xC1, 0xC6, 0x42, 0xA8, + 0x06, 0x38, 0xC1, 0xC6, 0x03, 0xA4, 0x06, 0x31, 0x94, 0xE4, 0xC1, 0xC9, + 0xFE, 0x7F, 0x7C, 0xDE, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, + 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA0, 0x00, 0x09, 0xE0, 0xC9, 0x03, 0xD5, + 0xE9, 0x08, 0xE0, 0xC8, 0x4B, 0xD5, 0xE1, 0x22, 0x92, 0xE4, 0x19, 0xE0, + 0x39, 0xE4, 0x00, 0x40, 0x38, 0xBC, 0x22, 0xD4, 0x89, 0xE4, 0x01, 0x40, + 0x80, 0xBC, 0xFF, 0xA0, 0x2B, 0xD5, 0x00, 0x40, 0x94, 0xBC, 0x36, 0xD5, + 0xC1, 0x09, 0xE0, 0xC9, 0x0D, 0xD5, 0x81, 0xE4, 0x04, 0x40, 0x80, 0xB8, + 0x98, 0xBF, 0x07, 0xD5, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA0, 0x00, 0x08, + 0x01, 0x40, 0xF7, 0xDF, 0xE1, 0x22, 0xC1, 0x13, 0x92, 0xE4, 0xFD, 0x7F, + 0x9B, 0xBC, 0xE1, 0x39, 0x00, 0xA8, 0x11, 0x18, 0x41, 0x00, 0x01, 0x10, + 0x29, 0xE4, 0x1D, 0xDE, 0x41, 0x00, 0xE0, 0xC0, 0x15, 0xD5, 0xE1, 0x28, + 0x98, 0xE4, 0x00, 0x40, 0x91, 0xBC, 0x0A, 0xD4, 0x00, 0x40, 0x82, 0xBC, + 0x01, 0xD4, 0x51, 0x09, 0x21, 0x19, 0x00, 0xA0, 0x80, 0xE4, 0x03, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x00, 0xA8, 0x21, 0x18, 0x51, 0x08, 0x68, 0xE0, + 0x61, 0x18, 0xF5, 0xDE, 0x81, 0xE4, 0x04, 0x40, 0xE0, 0xDF, 0xE7, 0xDE, + 0x41, 0x00, 0x82, 0xE4, 0x00, 0x40, 0x88, 0xBD, 0xE1, 0x38, 0xDF, 0xDE, + 0x89, 0xE4, 0x01, 0x40, 0x75, 0xDF, 0xB1, 0xDE, 0x20, 0xB5, 0x3C, 0xB3, + 0x5F, 0xB1, 0xFD, 0xB6, 0xD8, 0xE4, 0xB9, 0xE4, 0x00, 0x40, 0x88, 0x62, + 0x08, 0xA9, 0x09, 0x08, 0x14, 0x40, 0x28, 0x06, 0xC8, 0xE4, 0x14, 0x40, + 0xC8, 0xB8, 0xE0, 0xC6, 0x3D, 0xD5, 0x26, 0xE4, 0x08, 0x40, 0x28, 0xB8, + 0x16, 0x03, 0x03, 0xE4, 0xDF, 0xC0, 0xE0, 0xC0, 0x2C, 0xD9, 0x01, 0xA4, + 0x82, 0xC4, 0xE0, 0xCB, 0x35, 0xD5, 0xE0, 0xC2, 0xF7, 0xD5, 0x10, 0xE4, + 0x0A, 0xC1, 0x81, 0xE4, 0x82, 0xB8, 0x08, 0x40, 0x08, 0x08, 0x8B, 0xBF, + 0xEF, 0xD4, 0x91, 0xE4, 0x96, 0xB8, 0xC8, 0xC9, 0x09, 0x0A, 0x83, 0xE4, + 0xDF, 0xC8, 0x80, 0xBF, 0x2D, 0xD5, 0x00, 0xA8, 0x09, 0x18, 0xE0, 0xCA, + 0xE3, 0xD5, 0xE0, 0xC2, 0x37, 0xD5, 0x10, 0x40, 0x02, 0x08, 0x84, 0xBC, + 0x33, 0xD5, 0x10, 0x40, 0x12, 0x08, 0x84, 0xBC, 0x24, 0xD4, 0x12, 0xB8, + 0x8D, 0xE4, 0x01, 0x09, 0x9A, 0xE0, 0x16, 0x03, 0xDF, 0xC0, 0xE0, 0xC0, + 0xD4, 0xDA, 0xE0, 0xC3, 0x18, 0xD4, 0x06, 0x08, 0xE0, 0xC8, 0x1C, 0xD4, + 0xC6, 0xE4, 0x68, 0xE4, 0xE0, 0xC6, 0xC3, 0xD4, 0x03, 0xB6, 0x5F, 0xB0, + 0x3C, 0xB2, 0x40, 0xB4, 0x10, 0xE4, 0x0A, 0xC1, 0x91, 0xE4, 0x96, 0xB8, + 0xC8, 0xC9, 0x09, 0x0A, 0x83, 0xE4, 0xDF, 0xC8, 0x80, 0xBF, 0xD3, 0xD4, + 0x30, 0xE4, 0x16, 0x10, 0xD2, 0xDE, 0x06, 0x08, 0xE9, 0xDE, 0x12, 0xB8, + 0x01, 0x08, 0x9A, 0xE0, 0x16, 0x03, 0xDC, 0xDE, 0x0C, 0x18, 0x86, 0xE4, + 0x04, 0x40, 0xE6, 0xDF, 0x0C, 0x06, 0xA3, 0xDE, 0x9A, 0xE0, 0x16, 0x03, + 0xD3, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x00, 0x40, 0xAC, 0x63, + 0x04, 0xA0, 0x00, 0x09, 0x00, 0x40, 0x57, 0x63, 0x92, 0xBF, 0x02, 0xD7, + 0x0D, 0xDE, 0x98, 0xE4, 0x09, 0x08, 0xC4, 0xC9, 0x00, 0x40, 0xAC, 0x63, + 0x04, 0xA0, 0x00, 0x19, 0x98, 0xE0, 0x00, 0x08, 0x00, 0x40, 0x57, 0x63, + 0x82, 0xBF, 0xF3, 0xD7, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x01, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, 0xDF, 0xDF, 0x00, 0xA8, 0x83, 0x98, + 0x84, 0x98, 0x01, 0xA8, 0x90, 0xE4, 0x0B, 0x40, 0x5E, 0xDF, 0x05, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0x06, 0xA8, 0x0A, 0x40, + 0x38, 0xDF, 0x01, 0xA8, 0xFF, 0x7F, 0xE9, 0xDF, 0x20, 0xB5, 0x0F, 0xB1, + 0xFC, 0xB6, 0x38, 0xE4, 0xE0, 0xC8, 0x2F, 0xD5, 0x00, 0x40, 0xAC, 0x63, + 0x00, 0xA8, 0x08, 0x09, 0xE0, 0xC9, 0x20, 0xD4, 0xE3, 0x29, 0x89, 0xE4, + 0x00, 0x40, 0x88, 0xBC, 0x17, 0xD5, 0x43, 0x02, 0xE0, 0xC2, 0x14, 0xD5, + 0x03, 0x01, 0x12, 0xBA, 0x03, 0x12, 0x00, 0x40, 0x93, 0xBC, 0x00, 0xA8, + 0x18, 0xD5, 0x23, 0x18, 0x09, 0xDE, 0x83, 0x91, 0x93, 0x00, 0x73, 0x08, + 0x92, 0xE4, 0x90, 0xE0, 0xE0, 0xC8, 0x1B, 0xDB, 0x28, 0xB8, 0x18, 0xBA, + 0xE0, 0xC1, 0xF5, 0xD8, 0x00, 0xA8, 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0xE9, 0x08, 0xE0, 0xC8, 0xDD, 0xD4, 0x89, 0xE4, 0x00, 0x40, 0xA0, 0xDF, + 0xD9, 0xDE, 0x53, 0x08, 0xE6, 0xDE, 0x00, 0x40, 0x88, 0x62, 0x08, 0xA9, + 0x09, 0x08, 0x00, 0x40, 0x3D, 0x5A, 0x08, 0xA9, 0x03, 0x40, 0x8E, 0xDF, + 0xEA, 0xDE, 0xE3, 0x28, 0x04, 0x40, 0x80, 0xBD, 0xE3, 0x38, 0xFF, 0xA8, + 0xE4, 0xDE, 0x03, 0xB1, 0x05, 0x91, 0x00, 0xA0, 0x08, 0x10, 0x18, 0x10, + 0x28, 0x10, 0xE8, 0x39, 0xF8, 0x31, 0x48, 0x10, 0x58, 0x10, 0x68, 0x10, + 0x78, 0x18, 0x00, 0x40, 0x8E, 0x5B, 0x02, 0xA9, 0x88, 0x19, 0x00, 0x40, + 0x92, 0x5B, 0x08, 0xA9, 0x98, 0x19, 0x00, 0x40, 0x97, 0x5B, 0x04, 0xA9, + 0xA8, 0x19, 0x00, 0x40, 0x9B, 0x5B, 0x0C, 0xA9, 0xB8, 0x19, 0x03, 0xB0, + 0xA0, 0xE0, 0x20, 0xB5, 0x15, 0xB1, 0xFC, 0xB6, 0x49, 0xE4, 0x29, 0xE4, + 0x05, 0x40, 0x2C, 0xE6, 0x92, 0xE4, 0xCC, 0xC9, 0x05, 0x40, 0x0D, 0xDF, + 0x08, 0xE4, 0xE0, 0xC0, 0x09, 0xD5, 0xCC, 0xC8, 0x00, 0xA9, 0x00, 0x19, + 0x10, 0x14, 0x20, 0x18, 0x83, 0x92, 0xF6, 0x7F, 0xC2, 0xDF, 0x80, 0xE4, + 0x04, 0xB6, 0x15, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, 0xFD, 0xB6, + 0x38, 0xE4, 0x00, 0x40, 0x7E, 0xDF, 0x00, 0x40, 0x88, 0x62, 0x08, 0xA8, + 0x08, 0x00, 0xE0, 0x08, 0xE0, 0xC8, 0x33, 0xD5, 0x20, 0xE4, 0x2E, 0x40, + 0x20, 0xB8, 0x22, 0x00, 0x12, 0x08, 0x05, 0xDE, 0xE0, 0x21, 0xE0, 0xC1, + 0x15, 0xD5, 0x05, 0x40, 0x0C, 0xB8, 0xDF, 0xC8, 0xE0, 0xC8, 0xF8, 0xDA, + 0x02, 0x08, 0xE0, 0xC8, 0x02, 0xD5, 0x28, 0xE4, 0xF0, 0xDE, 0x83, 0xE4, + 0x04, 0xA9, 0xC3, 0xDF, 0x02, 0x18, 0xE0, 0xC8, 0xF8, 0xD4, 0x5E, 0xDF, + 0x0C, 0xA8, 0x03, 0x18, 0x00, 0xA8, 0x12, 0xDE, 0xFF, 0xA8, 0xF0, 0x38, + 0x01, 0xA8, 0xE0, 0x38, 0x55, 0xDF, 0x00, 0x11, 0x20, 0x11, 0x10, 0x11, + 0x40, 0x11, 0x50, 0x11, 0x60, 0x11, 0xC0, 0x11, 0xD0, 0x11, 0x04, 0x40, + 0x10, 0x11, 0x04, 0x40, 0x20, 0x11, 0x80, 0xE4, 0x03, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x80, 0xE4, 0x13, 0xDF, 0xCA, 0xDE, 0x20, 0xB5, 0xFD, 0xB6, + 0x00, 0x40, 0xD8, 0x5D, 0x0C, 0xA9, 0x03, 0x40, 0x05, 0xDF, 0x03, 0xB6, + 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0x00, 0x40, 0x88, 0x62, 0x08, 0xA9, + 0x09, 0x08, 0xF0, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, + 0xFB, 0xB6, 0x18, 0xE4, 0x2C, 0xDF, 0xE1, 0x09, 0xE0, 0xC9, 0x23, 0xD4, + 0x00, 0x40, 0x55, 0x5A, 0x08, 0xA8, 0xF1, 0x18, 0x01, 0xA0, 0xE1, 0x10, + 0x2E, 0x40, 0x01, 0x19, 0x03, 0xA8, 0x2E, 0x40, 0x11, 0x18, 0x81, 0xE4, + 0x2E, 0x40, 0x8C, 0xB8, 0x2E, 0x40, 0x21, 0x18, 0x83, 0x99, 0x84, 0x91, + 0x11, 0x08, 0x04, 0xA9, 0xFF, 0x7F, 0x55, 0xDF, 0x83, 0x90, 0x84, 0x91, + 0x21, 0x08, 0x09, 0xA9, 0xFF, 0x7F, 0x4F, 0xDF, 0x02, 0xA8, 0x83, 0x98, + 0x84, 0x91, 0x31, 0x08, 0x0A, 0xA9, 0xFF, 0x7F, 0x48, 0xDF, 0x06, 0xDF, + 0x05, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0xA0, 0xE0, 0xA0, 0xE0, 0xA0, 0xE0, + 0xA0, 0xE0, 0x00, 0xA8, 0xA0, 0xE0, 0x00, 0xA8, 0xA0, 0xE0, 0x20, 0xB5, + 0xFD, 0xB6, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0x00, 0x40, + 0x5E, 0x5A, 0x02, 0xA9, 0x02, 0x40, 0xB8, 0xDF, 0x03, 0xB6, 0x40, 0xB4, + 0x20, 0xB5, 0xFD, 0xB6, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, + 0x00, 0x40, 0x5E, 0x5A, 0x06, 0xA9, 0x02, 0x40, 0xAB, 0xDF, 0x03, 0xB6, + 0x40, 0xB4, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0xB8, 0xE4, + 0x09, 0xE4, 0xE0, 0xC9, 0x4C, 0xD5, 0x06, 0x40, 0xA7, 0xDF, 0x60, 0xE4, + 0xD8, 0xC6, 0x16, 0x09, 0x49, 0xE4, 0xFF, 0x7F, 0x4E, 0xBC, 0x26, 0xE4, + 0x24, 0xB8, 0x12, 0x03, 0xFF, 0x7F, 0x3C, 0xBC, 0x00, 0x40, 0xAE, 0x63, + 0x04, 0xA0, 0x00, 0x08, 0x82, 0xBF, 0x00, 0x40, 0x7D, 0xD5, 0x12, 0x13, + 0x00, 0xAA, 0x00, 0x40, 0x91, 0xBC, 0x37, 0xD5, 0x82, 0xE4, 0x83, 0xB8, + 0x18, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x08, 0xD4, 0x43, 0xB8, 0xE0, 0xCA, + 0x3B, 0xD5, 0x22, 0x08, 0x32, 0x01, 0x08, 0xE4, 0x38, 0x11, 0x21, 0x18, + 0x84, 0xE4, 0x00, 0x40, 0x81, 0xBD, 0x16, 0x18, 0x86, 0xE4, 0x84, 0xB8, + 0x08, 0x14, 0xE0, 0xCA, 0x19, 0xD4, 0x1F, 0x40, 0x4F, 0xBF, 0x35, 0xDC, + 0x0D, 0xC4, 0x94, 0xE4, 0x08, 0xC9, 0x01, 0xA8, 0xA6, 0xC8, 0x00, 0x40, + 0xAE, 0x63, 0x00, 0xA1, 0x01, 0x09, 0x98, 0xBD, 0x00, 0x40, 0xAD, 0x63, + 0x0C, 0xA8, 0x18, 0x19, 0x14, 0xE4, 0x0E, 0xC1, 0x18, 0xB8, 0x21, 0x00, + 0x36, 0x11, 0x26, 0x10, 0x21, 0x16, 0x30, 0x16, 0x8B, 0xE4, 0x06, 0x40, + 0x5E, 0xDF, 0x03, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x06, 0x08, + 0x68, 0xBA, 0x48, 0xB8, 0x26, 0x08, 0x00, 0x40, 0xAE, 0x63, 0x84, 0xBF, + 0x37, 0xD5, 0x36, 0x01, 0x08, 0xE4, 0x38, 0x11, 0x21, 0x18, 0xBC, 0xDE, + 0x22, 0x08, 0x00, 0x40, 0xAE, 0x63, 0x84, 0xBF, 0xC1, 0xD4, 0x01, 0xAA, + 0x38, 0x16, 0x28, 0x16, 0x36, 0x18, 0x26, 0x18, 0xBF, 0xDE, 0x94, 0xE4, + 0x25, 0xC9, 0x84, 0xE4, 0x0D, 0xC8, 0xE0, 0xC9, 0x0F, 0xD5, 0xE4, 0xC9, + 0x41, 0xDD, 0x89, 0xE4, 0x05, 0x40, 0x8B, 0xB8, 0x01, 0x40, 0x94, 0xBF, + 0x07, 0xDD, 0x05, 0x40, 0x94, 0xBF, 0x4A, 0xDC, 0x84, 0xE4, 0x31, 0xC8, + 0x06, 0x40, 0x8E, 0xB8, 0x18, 0xE4, 0x0E, 0xC1, 0x00, 0x40, 0xAD, 0x63, + 0x1C, 0xB8, 0x21, 0x00, 0x01, 0xBF, 0x31, 0xD5, 0x10, 0x08, 0xFF, 0x7F, + 0x8C, 0xBC, 0x84, 0xBF, 0x03, 0xDD, 0x20, 0x00, 0x01, 0xBF, 0xF8, 0xD4, + 0x30, 0x01, 0xB6, 0xDE, 0x01, 0xAA, 0x88, 0xDE, 0x43, 0xB8, 0x00, 0x40, + 0x91, 0xBC, 0x07, 0xD4, 0x06, 0x08, 0x68, 0xBA, 0x48, 0xB8, 0x36, 0x01, + 0x26, 0x00, 0x30, 0x11, 0x21, 0x10, 0x84, 0xE4, 0x00, 0x40, 0x81, 0xBD, + 0x16, 0x18, 0x00, 0x40, 0xAD, 0x63, 0x0C, 0xA8, 0x28, 0x16, 0x00, 0x40, + 0xEE, 0x63, 0x04, 0xA1, 0x01, 0x08, 0x48, 0xBF, 0x9F, 0xD7, 0x8B, 0xE4, + 0x00, 0x40, 0x5A, 0x64, 0x00, 0xA2, 0x02, 0x09, 0x24, 0xDF, 0x98, 0xDE, + 0x84, 0xE4, 0x19, 0xC8, 0x03, 0x40, 0x88, 0xB8, 0xC7, 0xDE, 0x08, 0xC8, + 0x01, 0xA9, 0xA2, 0xC9, 0x00, 0x40, 0xAE, 0x63, 0x00, 0xA2, 0x02, 0x08, + 0x89, 0xBD, 0x00, 0x40, 0xAD, 0x63, 0x0C, 0xA9, 0x19, 0x18, 0x82, 0xDE, + 0x15, 0x40, 0x94, 0xBF, 0x05, 0xDC, 0x84, 0xE4, 0x3D, 0xC8, 0x07, 0x40, + 0x87, 0xB8, 0xB2, 0xDE, 0x7E, 0xA8, 0x55, 0x40, 0x94, 0xBF, 0xAE, 0xDC, + 0x84, 0xE4, 0x49, 0xC8, 0x07, 0x40, 0x8C, 0xB8, 0xA9, 0xDE, 0x20, 0xB5, + 0x0F, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, 0x09, 0xE4, 0x05, 0x40, 0xCE, 0xDF, + 0x00, 0x40, 0xAE, 0x63, 0x04, 0xA3, 0x03, 0x08, 0x18, 0x01, 0xFF, 0x7F, + 0x1C, 0xBC, 0x81, 0xE4, 0x80, 0xBA, 0x08, 0xE4, 0xFE, 0x40, 0x0F, 0xB8, + 0x00, 0x7F, 0x00, 0xBC, 0x00, 0x7F, 0x00, 0xB8, 0xFF, 0x40, 0x0F, 0xBF, + 0x0C, 0xDB, 0x82, 0xE4, 0x00, 0xA9, 0x07, 0x40, 0x59, 0xDF, 0x98, 0xE4, + 0x00, 0x40, 0xAE, 0x63, 0x04, 0xA3, 0x03, 0x08, 0x81, 0xB8, 0x89, 0xBF, + 0x07, 0xD5, 0x82, 0xE4, 0x05, 0x40, 0xAD, 0xDF, 0x00, 0xA8, 0x03, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x00, 0xA9, 0x90, 0xBA, 0x82, 0xE4, 0x07, 0x40, + 0x45, 0xDF, 0xFF, 0xC8, 0x13, 0xD5, 0x00, 0x40, 0xAE, 0x63, 0x04, 0xA9, + 0x09, 0x08, 0x10, 0xBA, 0x00, 0x40, 0x11, 0xBD, 0x18, 0x11, 0x00, 0x40, + 0x5A, 0x64, 0x0C, 0xA3, 0x03, 0x08, 0x80, 0xBA, 0x03, 0x18, 0x82, 0xE4, + 0x05, 0x40, 0x91, 0xDF, 0x01, 0xA8, 0xE3, 0xDE, 0x82, 0xE4, 0x00, 0xA9, + 0x07, 0x40, 0x2C, 0xDF, 0x98, 0xE4, 0x00, 0x40, 0xAE, 0x63, 0x04, 0xA8, + 0x08, 0x00, 0x19, 0xE4, 0x10, 0xBA, 0xEF, 0xC1, 0xD2, 0xDB, 0x00, 0x40, + 0xEE, 0x63, 0x08, 0xA3, 0x03, 0x08, 0x98, 0xBA, 0x00, 0x40, 0x5A, 0x64, + 0x0C, 0xA8, 0x08, 0x19, 0x00, 0x40, 0x11, 0xBD, 0x10, 0x11, 0xC5, 0xDE, + 0x20, 0xB5, 0x3C, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0x48, 0xE4, 0xC9, 0xE4, + 0x00, 0xA3, 0x29, 0x01, 0x91, 0xE4, 0xE0, 0xC1, 0x33, 0xD5, 0xE8, 0x29, + 0x89, 0xE4, 0x00, 0x40, 0x88, 0xBC, 0x03, 0xD5, 0x44, 0x08, 0xE0, 0xC8, + 0x07, 0xD4, 0x84, 0xE4, 0xFC, 0x7F, 0x8C, 0xDF, 0xFF, 0xA9, 0xE0, 0xC8, + 0x25, 0xD4, 0xE4, 0x29, 0x0C, 0x02, 0x00, 0xA1, 0x09, 0xE4, 0x10, 0xE0, + 0x80, 0xE4, 0x00, 0x40, 0x82, 0xBC, 0x21, 0xD5, 0x03, 0xDE, 0x02, 0x03, + 0x12, 0x01, 0xC8, 0xC2, 0xE0, 0xC1, 0xFB, 0xD5, 0x81, 0xE4, 0x40, 0x40, + 0x10, 0xBF, 0x02, 0xDD, 0x40, 0x40, 0x00, 0xA8, 0x83, 0x98, 0x94, 0x00, + 0x74, 0x08, 0x93, 0xE4, 0x90, 0xE0, 0x08, 0xE4, 0xE0, 0xC8, 0x00, 0x40, + 0x87, 0xDB, 0x38, 0xB8, 0x18, 0xBA, 0x2C, 0x08, 0x80, 0xBA, 0x2C, 0x18, + 0xE9, 0xD4, 0x00, 0xA9, 0x89, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, + 0x40, 0xB4, 0x00, 0x40, 0x01, 0xBE, 0x00, 0x40, 0x01, 0xBC, 0x40, 0xD4, + 0xD1, 0xE4, 0xB1, 0xE4, 0xE0, 0xC1, 0x36, 0xD4, 0x02, 0x03, 0x12, 0x01, + 0xC8, 0xC2, 0xE0, 0xC1, 0xFB, 0xD5, 0x83, 0x91, 0x83, 0xE4, 0x0A, 0xA9, + 0x04, 0x40, 0x92, 0xDF, 0xB1, 0xE4, 0xC1, 0xCB, 0xE0, 0xC8, 0x03, 0xD5, + 0xB8, 0xE4, 0xB3, 0xBA, 0xC1, 0xCB, 0x01, 0xAD, 0x9B, 0xE4, 0xB1, 0xBF, + 0x01, 0xDD, 0x91, 0xE4, 0x24, 0x00, 0x54, 0x06, 0x06, 0xB8, 0x04, 0x0A, + 0x44, 0x08, 0xA8, 0xBF, 0x03, 0xDD, 0x90, 0xBF, 0x00, 0x40, 0xA1, 0xD8, + 0x69, 0xBF, 0x00, 0x40, 0x66, 0xD8, 0x83, 0x96, 0x94, 0x00, 0x74, 0x08, + 0x93, 0xE4, 0x90, 0xE0, 0x08, 0xE4, 0xE0, 0xC8, 0x47, 0xDB, 0xB0, 0xBA, + 0x00, 0x40, 0x69, 0xD5, 0x30, 0xB8, 0x10, 0xBA, 0x2C, 0x08, 0x80, 0xBA, + 0x2C, 0x18, 0xBD, 0xD5, 0xE0, 0xC1, 0xCA, 0xD5, 0xE0, 0xCD, 0xDA, 0xD4, + 0xCC, 0xDE, 0x02, 0x03, 0x12, 0x01, 0xC8, 0xC2, 0xE0, 0xC1, 0xFB, 0xD5, + 0x24, 0x00, 0x19, 0xE0, 0x89, 0xE4, 0x20, 0x40, 0x80, 0xBC, 0x1D, 0xD5, + 0x01, 0xBF, 0x04, 0xD6, 0x08, 0x40, 0x90, 0xBC, 0x00, 0x40, 0x62, 0xD4, + 0x01, 0xBF, 0x01, 0xDD, 0x01, 0xE4, 0x83, 0x90, 0x04, 0x08, 0x93, 0xE4, + 0x04, 0x40, 0x89, 0xDF, 0x24, 0x08, 0x80, 0xBA, 0x24, 0x18, 0x04, 0x08, + 0x80, 0xB8, 0x04, 0x18, 0x01, 0xE4, 0x30, 0xB8, 0x10, 0xBA, 0x2C, 0x08, + 0x80, 0xBA, 0x2C, 0x18, 0x92, 0xD5, 0xE4, 0x29, 0xDB, 0xDE, 0x04, 0x09, + 0x44, 0x08, 0x98, 0xBF, 0x02, 0xDD, 0x01, 0xBF, 0x37, 0xD7, 0x54, 0x00, + 0x01, 0xBF, 0x12, 0xDC, 0x83, 0x90, 0x94, 0x00, 0x74, 0x08, 0x93, 0xE4, + 0x90, 0xE0, 0x08, 0xE4, 0xE0, 0xC8, 0xE7, 0xD8, 0xE4, 0x28, 0x04, 0x40, + 0x80, 0xBD, 0xE4, 0x38, 0xFF, 0xA9, 0x89, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, + 0x3C, 0xB2, 0x40, 0xB4, 0x01, 0xE4, 0x83, 0x91, 0x04, 0x08, 0x93, 0xE4, + 0x04, 0x40, 0x59, 0xDF, 0x24, 0x08, 0x81, 0xBA, 0x24, 0x18, 0x04, 0x08, + 0x81, 0xB8, 0x04, 0x18, 0xD0, 0xDE, 0x09, 0xE4, 0x83, 0x99, 0x04, 0x08, + 0x93, 0xE4, 0x04, 0x40, 0x4C, 0xDF, 0x24, 0x08, 0x80, 0xBA, 0x24, 0x18, + 0x04, 0x08, 0x80, 0xB8, 0x04, 0x18, 0xB0, 0xBA, 0x97, 0xD4, 0x84, 0xE4, + 0xFC, 0x7F, 0xBA, 0xDF, 0xE0, 0xC8, 0xD6, 0xD4, 0xD8, 0xE4, 0x90, 0xDE, + 0x83, 0x90, 0x89, 0xE4, 0x93, 0xE4, 0x04, 0x40, 0x38, 0xDF, 0x04, 0x08, + 0x80, 0xB8, 0x04, 0x18, 0x84, 0xE4, 0xFC, 0x7F, 0xAB, 0xDF, 0xE0, 0xC8, + 0xAE, 0xD5, 0xC6, 0xDE, 0x04, 0x00, 0x44, 0x09, 0x09, 0xBA, 0x60, 0xE4, + 0x61, 0xB8, 0x83, 0x96, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xAA, 0x0A, 0x08, + 0x04, 0x40, 0x72, 0xDF, 0xE0, 0xC8, 0x16, 0xD5, 0x44, 0x18, 0x08, 0xB8, + 0x04, 0x10, 0x54, 0x16, 0x24, 0x11, 0x01, 0xE4, 0x89, 0xDE, 0x83, 0x90, + 0x8A, 0xE4, 0x93, 0xE4, 0x04, 0x40, 0x15, 0xDF, 0x04, 0x08, 0x80, 0xB8, + 0x04, 0x18, 0x84, 0xE4, 0xFC, 0x7F, 0x88, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, + 0x5C, 0xD5, 0xA2, 0xDE, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, + 0x44, 0x09, 0xFD, 0x7F, 0xA0, 0xDF, 0x9A, 0xDE, 0x20, 0xB5, 0x1F, 0xB1, + 0xFD, 0xB6, 0x28, 0xE4, 0x49, 0xE4, 0x00, 0xA3, 0x2E, 0x40, 0x20, 0xB8, + 0x16, 0xD5, 0x22, 0x00, 0x12, 0x01, 0xDF, 0xC1, 0xE0, 0xC1, 0x0E, 0xD9, + 0xE0, 0x28, 0xE0, 0xC8, 0x06, 0xD5, 0xF0, 0x28, 0xFF, 0xC8, 0x03, 0xD5, + 0x80, 0xE4, 0x94, 0xE0, 0x38, 0xBD, 0x05, 0x40, 0x0C, 0xB8, 0xDF, 0xC1, + 0xE0, 0xC1, 0xF2, 0xDA, 0x02, 0x02, 0xE0, 0xC2, 0xEA, 0xD4, 0x83, 0xE4, + 0x03, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x5F, 0xB1, 0xFD, 0xB6, + 0x48, 0xE4, 0x69, 0xE4, 0x00, 0xA3, 0x28, 0xE4, 0x2E, 0x40, 0x20, 0xB8, + 0x17, 0xD5, 0x22, 0x00, 0x12, 0x01, 0xDF, 0xC1, 0xE0, 0xC1, 0x0F, 0xD9, + 0xE0, 0x28, 0xE0, 0xC8, 0x07, 0xD5, 0xF0, 0x28, 0xFF, 0xC8, 0x04, 0xD5, + 0x84, 0xE4, 0x90, 0xE4, 0x96, 0xE0, 0x38, 0xBD, 0x05, 0x40, 0x0C, 0xB8, + 0xDF, 0xC1, 0xE0, 0xC1, 0xF1, 0xDA, 0x02, 0x02, 0xE0, 0xC2, 0xE9, 0xD4, + 0x83, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, + 0xFD, 0xB6, 0x08, 0xE4, 0x19, 0xE4, 0xFD, 0x7F, 0x2E, 0xDF, 0x80, 0xE4, + 0x91, 0xE4, 0xAE, 0xDF, 0x08, 0xE4, 0xFD, 0x7F, 0x29, 0xDF, 0x80, 0xE4, + 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, + 0x08, 0xE4, 0x19, 0xE4, 0xFD, 0x7F, 0x1D, 0xDF, 0x80, 0xE4, 0x91, 0xE4, + 0xC0, 0xDF, 0x08, 0xE4, 0xFD, 0x7F, 0x18, 0xDF, 0x80, 0xE4, 0x03, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, + 0x29, 0xE4, 0x0A, 0x90, 0xE0, 0xC0, 0x0A, 0xD5, 0x80, 0xE4, 0x00, 0x40, + 0x4C, 0x63, 0x0B, 0xA9, 0x07, 0x40, 0x03, 0xDF, 0xE0, 0xC8, 0x09, 0xD4, + 0xC1, 0x12, 0xD1, 0x10, 0x00, 0x40, 0x4C, 0x63, 0x0B, 0xA9, 0x89, 0xE4, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x80, 0xE4, 0x00, 0x40, 0x52, 0x63, + 0x0F, 0xA9, 0x06, 0x40, 0xF2, 0xDF, 0x00, 0xA9, 0xE0, 0xC8, 0xF3, 0xD4, + 0xC1, 0x12, 0xD1, 0x10, 0xED, 0xDE, 0x00, 0x40, 0xAC, 0x63, 0x0C, 0xA9, + 0x09, 0x08, 0xA0, 0xE0, 0x00, 0x40, 0xA1, 0x62, 0x00, 0xA8, 0xA0, 0xE0, + 0x20, 0xB5, 0x01, 0xB1, 0xFC, 0xB6, 0x08, 0xE4, 0x83, 0x99, 0x00, 0x40, + 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0x90, 0xE4, 0xC7, 0xDF, 0x04, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0x00, 0x40, 0xAC, 0x63, + 0x00, 0xA9, 0x09, 0x08, 0xE7, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, + 0x0F, 0xB1, 0xED, 0xB6, 0x18, 0xE4, 0xE8, 0x28, 0x08, 0xE4, 0x00, 0x40, + 0x02, 0xBC, 0x20, 0xD4, 0xF1, 0x29, 0xE0, 0xC9, 0x28, 0xD9, 0x10, 0x40, + 0xD8, 0xE1, 0x83, 0x98, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA2, 0x02, 0x08, + 0x18, 0x40, 0x9E, 0xDF, 0x88, 0xB8, 0x1C, 0xD7, 0x30, 0xE4, 0x05, 0x98, + 0x00, 0x4F, 0x80, 0xBC, 0x00, 0x42, 0x80, 0xBF, 0x4E, 0xD5, 0x40, 0x40, + 0x00, 0xA2, 0x00, 0x48, 0x80, 0xBF, 0x3D, 0xD5, 0xE1, 0x28, 0x12, 0xDE, + 0xE1, 0x28, 0x00, 0x40, 0x82, 0xBD, 0xE1, 0x38, 0x81, 0xE4, 0x04, 0x40, + 0x83, 0xB8, 0x01, 0x18, 0x41, 0x18, 0x01, 0xA8, 0x51, 0x18, 0x13, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0xE1, 0x28, 0x30, 0xE4, 0x40, 0x40, 0x00, 0xA2, + 0x80, 0x40, 0x80, 0xBD, 0xE1, 0x38, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, + 0x09, 0x08, 0x40, 0x40, 0x00, 0xA9, 0x01, 0x40, 0x06, 0xDF, 0x08, 0xE4, + 0xE0, 0xC8, 0xE0, 0xD5, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, + 0x00, 0x40, 0x55, 0x5A, 0x08, 0xA9, 0xF8, 0x19, 0xE1, 0x28, 0x08, 0x40, + 0x80, 0xBD, 0xE1, 0x38, 0x01, 0x10, 0x41, 0x10, 0x51, 0x12, 0xE0, 0xC3, + 0xDA, 0xD5, 0xF1, 0x28, 0x18, 0x40, 0x75, 0xDF, 0xE0, 0xC8, 0xD5, 0xD5, + 0xE1, 0x28, 0x00, 0x40, 0x81, 0xBD, 0xE1, 0x38, 0xD0, 0xDE, 0xA1, 0x08, + 0x00, 0x40, 0x97, 0x5B, 0x84, 0xBF, 0xBE, 0xD4, 0xE1, 0x28, 0x40, 0x40, + 0x80, 0xBD, 0xE1, 0x38, 0x04, 0x40, 0x31, 0x12, 0xCE, 0xDE, 0x01, 0xA3, + 0xB0, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x98, 0xE4, 0x00, 0x40, + 0xAC, 0x63, 0x00, 0xA0, 0x00, 0x08, 0x00, 0x40, 0xD0, 0xDF, 0x03, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x98, 0xE4, + 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA0, 0x00, 0x08, 0xFC, 0x7F, 0x6B, 0xDF, + 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x0C, 0xB3, 0x5F, 0xB1, + 0xFD, 0xB6, 0xA8, 0xE4, 0x00, 0x40, 0xAE, 0x63, 0x04, 0xA0, 0x00, 0x04, + 0x14, 0x03, 0xFF, 0x7F, 0x3C, 0xBC, 0x24, 0xE4, 0x23, 0xB8, 0x00, 0x40, + 0x5A, 0x64, 0x00, 0xA1, 0x01, 0x08, 0x98, 0xB8, 0x09, 0xE4, 0x01, 0x40, + 0x00, 0xB8, 0x00, 0x41, 0x00, 0xA6, 0x00, 0x40, 0xEE, 0x63, 0x08, 0xAB, + 0x0B, 0x08, 0xFF, 0xC8, 0x04, 0xD5, 0xFF, 0x40, 0x0F, 0xB8, 0x00, 0x7F, + 0x00, 0xBC, 0x8A, 0xE4, 0x90, 0xE4, 0x04, 0x40, 0x95, 0xDF, 0x18, 0xE4, + 0xFF, 0xC8, 0x00, 0x40, 0x6A, 0xD5, 0x82, 0xBF, 0x64, 0xD7, 0x00, 0x40, + 0x5A, 0x64, 0x0C, 0xA8, 0x08, 0x09, 0x90, 0xB8, 0x12, 0xBF, 0x00, 0x40, + 0x70, 0xD5, 0x00, 0x40, 0xEE, 0x63, 0x08, 0xAB, 0x0B, 0x08, 0xFF, 0xC8, + 0x64, 0xD5, 0x81, 0xE4, 0x82, 0xBA, 0x98, 0xB8, 0x00, 0x40, 0x5A, 0x64, + 0x0C, 0xAB, 0x0B, 0x19, 0x81, 0xE4, 0x00, 0x40, 0x87, 0xBC, 0x28, 0xE4, + 0x03, 0xD5, 0x08, 0xA2, 0x28, 0xBA, 0x12, 0xB8, 0x01, 0xB8, 0xFF, 0x40, + 0x0F, 0xBC, 0x60, 0xBA, 0x26, 0xB8, 0x8A, 0xE4, 0x92, 0xE4, 0x04, 0x40, + 0x69, 0xDF, 0x98, 0xE4, 0xFF, 0xC8, 0x62, 0xD5, 0x00, 0x40, 0x5A, 0x64, + 0x0C, 0xA0, 0x00, 0x08, 0x82, 0xB8, 0x00, 0x18, 0x00, 0x40, 0xAD, 0x63, + 0x0C, 0xA8, 0x28, 0x11, 0x89, 0xE4, 0x81, 0xBA, 0x82, 0xB8, 0x00, 0x40, + 0x81, 0xBD, 0x00, 0x40, 0xAD, 0x63, 0x4C, 0xBF, 0x4D, 0xD5, 0xEF, 0xC3, + 0x2E, 0xDD, 0x11, 0x18, 0xD4, 0xC3, 0xFF, 0x7F, 0x38, 0xBC, 0x14, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0x83, 0xBD, 0x14, 0x18, 0x94, 0xE4, 0x93, 0xB8, + 0x05, 0xA8, 0x19, 0x18, 0x29, 0x18, 0xEF, 0xC3, 0x40, 0xDC, 0x00, 0x40, + 0x5A, 0x64, 0x0C, 0xA1, 0x01, 0x09, 0x00, 0x40, 0x5A, 0x64, 0x04, 0xAB, + 0x0B, 0x08, 0x98, 0xBF, 0x01, 0xDD, 0x0B, 0x19, 0x00, 0x40, 0x5A, 0x64, + 0x08, 0xA0, 0x00, 0x08, 0x98, 0xBF, 0x09, 0xDD, 0x00, 0x19, 0x03, 0xB6, + 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x00, 0x40, 0xAD, 0x63, 0x4C, 0xBF, + 0x98, 0xD5, 0x03, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x01, 0xA8, + 0x11, 0x18, 0x03, 0xB6, 0x5F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x00, 0x40, + 0x5A, 0x64, 0x0C, 0xA8, 0x08, 0x19, 0x0B, 0x11, 0x9D, 0xDE, 0x81, 0xE4, + 0xFF, 0x40, 0x8F, 0xBC, 0x8C, 0xD4, 0x00, 0x40, 0x5A, 0x64, 0x0C, 0xAB, + 0x0B, 0x19, 0x03, 0xB8, 0x00, 0x40, 0xAE, 0x63, 0x04, 0xA1, 0x01, 0x08, + 0x00, 0x40, 0x01, 0xBD, 0x18, 0x10, 0xC5, 0xDE, 0x11, 0x18, 0xC3, 0xDE, + 0x00, 0xA2, 0x91, 0xE4, 0x9B, 0xDE, 0xC8, 0xC4, 0x8A, 0xE4, 0x94, 0xE4, + 0xFB, 0x7F, 0xA9, 0xDF, 0xBA, 0xDE, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, + 0xFD, 0xB6, 0xD8, 0xE4, 0x89, 0xE4, 0xCB, 0xC8, 0x10, 0xA4, 0x01, 0x40, + 0x86, 0xBF, 0x05, 0xDD, 0x48, 0xE4, 0xFF, 0x7F, 0x48, 0xBC, 0xE0, 0xC4, + 0x02, 0xD9, 0x49, 0xBF, 0x07, 0xD6, 0x0C, 0xA8, 0x0D, 0x18, 0x00, 0xA8, + 0x03, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x8D, 0xE4, 0x02, 0x40, + 0x3D, 0xDF, 0x1F, 0x40, 0x47, 0xBF, 0x21, 0xDC, 0x64, 0xE4, 0x0D, 0xC6, + 0x34, 0xE4, 0x00, 0x40, 0xAD, 0x63, 0x3C, 0xB8, 0x33, 0x02, 0x23, 0xBF, + 0x01, 0x40, 0x02, 0xD5, 0x23, 0xBF, 0x5B, 0xD5, 0x12, 0x09, 0xFF, 0x7F, + 0x9C, 0xBC, 0x32, 0x00, 0x22, 0x03, 0x33, 0x10, 0x20, 0x13, 0x92, 0xB8, + 0x19, 0x08, 0x00, 0x40, 0x81, 0xBD, 0x19, 0x18, 0x8D, 0xE4, 0x02, 0x40, + 0x20, 0xDF, 0x82, 0xE4, 0xC8, 0xC8, 0x03, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, + 0x40, 0xB4, 0x84, 0xE4, 0x25, 0xC8, 0x64, 0xE4, 0x0D, 0xC6, 0xE0, 0xC8, + 0x10, 0xD5, 0xE4, 0xC8, 0x40, 0xDD, 0x68, 0xE4, 0x05, 0x40, 0x6B, 0xB8, + 0x01, 0x40, 0x84, 0xBF, 0x08, 0xDD, 0x05, 0x40, 0x84, 0xBF, 0x01, 0x40, + 0x30, 0xDC, 0x64, 0xE4, 0x31, 0xC6, 0x06, 0x40, 0x6E, 0xB8, 0x06, 0xE4, + 0x0E, 0xC0, 0x00, 0x40, 0xAD, 0x63, 0x0C, 0xB8, 0x30, 0x02, 0x0C, 0xDE, + 0x12, 0x01, 0xFF, 0x7F, 0x1C, 0xBC, 0x91, 0xE4, 0x94, 0xBA, 0xEF, 0xC9, + 0x00, 0x40, 0xCB, 0xD8, 0x99, 0xB8, 0x00, 0x40, 0xCB, 0xD6, 0x32, 0x02, + 0x20, 0xBF, 0xF2, 0xD4, 0xC1, 0xC6, 0x00, 0x40, 0xAE, 0x63, 0x04, 0xAE, + 0x00, 0x40, 0xAE, 0x63, 0x0C, 0xA1, 0x01, 0x02, 0x00, 0x40, 0xAE, 0x63, + 0x24, 0xBF, 0x30, 0xD5, 0x12, 0x01, 0xFF, 0x7F, 0x1C, 0xBC, 0x91, 0xE4, + 0x94, 0xBA, 0xEF, 0xC9, 0x00, 0x40, 0x78, 0xD8, 0x3E, 0x1E, 0x2E, 0x1E, + 0x99, 0xB8, 0x0A, 0xD7, 0x92, 0xE4, 0x91, 0xB8, 0xAD, 0xDE, 0xC2, 0xC6, + 0xE4, 0xDE, 0x64, 0xE4, 0x19, 0xC6, 0x03, 0x40, 0x68, 0xB8, 0xC9, 0xDE, + 0x1F, 0x40, 0x1F, 0xBF, 0x00, 0x40, 0xB9, 0xDC, 0x0D, 0xC1, 0x00, 0x40, + 0xAD, 0x63, 0x0C, 0xAF, 0x01, 0xE4, 0x81, 0xE4, 0x08, 0xC8, 0x01, 0xA9, + 0xA2, 0xC9, 0x00, 0x40, 0xAE, 0x63, 0x00, 0xA1, 0x01, 0x08, 0x89, 0xBD, + 0x1F, 0x18, 0x0E, 0xC0, 0x0F, 0xB8, 0x20, 0x03, 0x32, 0x10, 0x22, 0x13, + 0x20, 0x12, 0x33, 0x12, 0x86, 0xE4, 0xE0, 0xC6, 0x00, 0x40, 0xD4, 0xD9, + 0x08, 0xC8, 0x01, 0xAA, 0xA2, 0xCA, 0x00, 0x40, 0xAD, 0x63, 0x0C, 0xAF, + 0x00, 0x40, 0xAE, 0x63, 0x00, 0xA8, 0x08, 0x0B, 0xAB, 0xBF, 0x51, 0xDC, + 0x8B, 0xE4, 0x8A, 0xBC, 0x07, 0xD4, 0xFF, 0x7F, 0x6C, 0xBC, 0xC4, 0xC6, + 0x06, 0xCA, 0x8B, 0xE4, 0x8A, 0xBC, 0xFB, 0xD5, 0xC6, 0xE4, 0x36, 0xE4, + 0x0E, 0xC3, 0x00, 0x40, 0xAD, 0x63, 0x3C, 0xB8, 0x03, 0xE4, 0x30, 0x02, + 0x0C, 0xDE, 0x12, 0x01, 0xFF, 0x7F, 0x1C, 0xBC, 0x91, 0xE4, 0x94, 0xBA, + 0xEF, 0xC9, 0x00, 0x40, 0x97, 0xD8, 0x99, 0xB8, 0x00, 0x40, 0x9E, 0xD6, + 0x32, 0x02, 0x20, 0xBF, 0xF2, 0xD4, 0xC8, 0xC0, 0xC1, 0xC6, 0x86, 0xE4, + 0x00, 0x40, 0x83, 0xBC, 0xEA, 0xD4, 0x8C, 0xE4, 0x00, 0x40, 0x83, 0xBC, + 0x00, 0x40, 0xCF, 0xD5, 0xDF, 0xCC, 0xD8, 0xC3, 0x23, 0x08, 0x83, 0xBF, + 0xF6, 0xD5, 0x06, 0xCA, 0x00, 0x40, 0xAD, 0x63, 0x0C, 0xAF, 0xAB, 0xBF, + 0x1A, 0xDC, 0xE0, 0xCA, 0x03, 0xD4, 0x17, 0xDE, 0xC4, 0xC6, 0x06, 0xCA, + 0x8B, 0xE4, 0x8A, 0xBC, 0xFB, 0xD5, 0xCA, 0xDE, 0x12, 0xE4, 0x14, 0xB8, + 0x00, 0x40, 0x41, 0xBD, 0x12, 0x14, 0x3E, 0x11, 0x2E, 0x11, 0x31, 0x1E, + 0x21, 0x1E, 0x89, 0xE4, 0x00, 0x40, 0x81, 0xBD, 0x11, 0x18, 0x19, 0xB8, + 0x01, 0x19, 0xFF, 0x7F, 0x2F, 0xDE, 0x00, 0x40, 0xAE, 0x63, 0x04, 0xA1, + 0x01, 0x00, 0x10, 0x08, 0xFF, 0x7F, 0x8C, 0xBC, 0x98, 0xE4, 0x94, 0xBA, + 0x84, 0xBF, 0x02, 0xD7, 0xEF, 0xC9, 0x24, 0xD8, 0x8D, 0xE4, 0x94, 0xE4, + 0xFE, 0x7F, 0x27, 0xDF, 0x00, 0x40, 0xAE, 0x63, 0x04, 0xA8, 0x08, 0x00, + 0x10, 0x08, 0xFF, 0x7F, 0x8C, 0xBC, 0x98, 0xE4, 0x94, 0xBA, 0x84, 0xBF, + 0x02, 0xD7, 0xEF, 0xC9, 0x13, 0xD8, 0x8D, 0xE4, 0x01, 0x40, 0x31, 0xDF, + 0xFE, 0x7F, 0xE9, 0xDE, 0x32, 0xE4, 0xC8, 0xC3, 0x33, 0x02, 0xFE, 0x7F, + 0xF9, 0xDE, 0xDF, 0xC6, 0xFF, 0x7F, 0x38, 0xDE, 0x32, 0x00, 0x22, 0x03, + 0x33, 0x10, 0x20, 0x13, 0xFF, 0x7F, 0x4A, 0xDE, 0x84, 0xE4, 0x00, 0x40, + 0x81, 0xBD, 0x10, 0x18, 0x80, 0xE4, 0x84, 0xB8, 0x2F, 0x18, 0x00, 0x40, + 0x91, 0xBD, 0x18, 0x19, 0x8D, 0xE4, 0x01, 0x40, 0x14, 0xDF, 0x80, 0xE4, + 0xC8, 0xC8, 0xFE, 0x7F, 0xF2, 0xDE, 0x91, 0xE4, 0x25, 0xC9, 0x81, 0xE4, + 0x0D, 0xC8, 0xE0, 0xC9, 0x06, 0xD5, 0xE4, 0xC9, 0x39, 0xDC, 0x81, 0xE4, + 0x19, 0xC8, 0x03, 0x40, 0x88, 0xB8, 0x08, 0xE4, 0x0E, 0xC0, 0x00, 0x40, + 0xAD, 0x63, 0x0C, 0xB8, 0x20, 0x03, 0x30, 0xBF, 0x46, 0xD5, 0x13, 0x08, + 0xFF, 0x7F, 0x8C, 0xBC, 0x81, 0xBF, 0x03, 0xDD, 0x23, 0x03, 0x30, 0xBF, + 0xF8, 0xD4, 0x33, 0x00, 0xFF, 0x7F, 0x3A, 0xDE, 0x12, 0xE4, 0x14, 0xB8, + 0x00, 0x40, 0x41, 0xBD, 0x12, 0x14, 0x32, 0x00, 0x22, 0x03, 0x33, 0x10, + 0x20, 0x13, 0x89, 0xDE, 0x92, 0xE4, 0x91, 0xB8, 0x19, 0x08, 0x00, 0x40, + 0x81, 0xBD, 0x19, 0x18, 0x32, 0x00, 0x22, 0x03, 0x33, 0x10, 0x20, 0x13, + 0xFE, 0x7F, 0xB8, 0xDE, 0xC3, 0xC8, 0xFF, 0x7F, 0x29, 0xDE, 0x15, 0x40, + 0x84, 0xBF, 0x14, 0xDC, 0x64, 0xE4, 0x3D, 0xC6, 0x07, 0x40, 0x67, 0xB8, + 0xFE, 0x7F, 0xCB, 0xDE, 0x89, 0xE4, 0x05, 0x40, 0x8B, 0xB8, 0x01, 0x40, + 0x94, 0xBF, 0xC5, 0xDD, 0x05, 0x40, 0x94, 0xBF, 0x28, 0xDC, 0x81, 0xE4, + 0x31, 0xC8, 0x06, 0x40, 0x8E, 0xB8, 0xBD, 0xDE, 0x7E, 0xA6, 0x55, 0x40, + 0x84, 0xBF, 0xFE, 0x7F, 0xB8, 0xDC, 0x64, 0xE4, 0x49, 0xC6, 0x07, 0x40, + 0x6C, 0xB8, 0xFE, 0x7F, 0xB2, 0xDE, 0x00, 0x40, 0xAD, 0x63, 0x0C, 0xAF, + 0x08, 0xC8, 0x01, 0xA9, 0xA2, 0xC9, 0x00, 0x40, 0xAE, 0x63, 0x00, 0xA1, + 0x01, 0x08, 0x89, 0xBD, 0x1F, 0x18, 0xFE, 0x7F, 0xF1, 0xDE, 0x8A, 0xE4, + 0x78, 0xE0, 0xB8, 0xBC, 0x1F, 0x1B, 0x00, 0x40, 0xAE, 0x63, 0x00, 0xA0, + 0x00, 0x0B, 0xFF, 0x7F, 0x2C, 0xDE, 0x15, 0x40, 0x94, 0xBF, 0x05, 0xDC, + 0x81, 0xE4, 0x3D, 0xC8, 0x07, 0x40, 0x87, 0xB8, 0x92, 0xDE, 0x7E, 0xA8, + 0x55, 0x40, 0x94, 0xBF, 0x8E, 0xDC, 0x81, 0xE4, 0x49, 0xC8, 0x07, 0x40, + 0x8C, 0xB8, 0x89, 0xDE, 0x1F, 0xB1, 0x29, 0xE4, 0x08, 0x90, 0x98, 0xE4, + 0x0F, 0x40, 0x2F, 0xBC, 0xE3, 0xC0, 0x2E, 0xDD, 0x00, 0x40, 0x83, 0xBC, + 0x2B, 0xD4, 0x39, 0xE4, 0x48, 0xE4, 0x03, 0xA8, 0x22, 0xC4, 0x42, 0xB8, + 0xDF, 0xC8, 0xE0, 0xC8, 0xFB, 0xDA, 0xE3, 0xC0, 0x19, 0xDD, 0x03, 0x08, + 0x84, 0xBE, 0x98, 0xE4, 0xBF, 0x7F, 0xEF, 0x6F, 0x9F, 0xB8, 0x78, 0xE0, + 0x98, 0xBC, 0x20, 0x60, 0x08, 0x48, 0x90, 0xBC, 0x09, 0xD5, 0x93, 0xE4, + 0x00, 0xA1, 0x09, 0x88, 0x82, 0xBF, 0x16, 0xD5, 0xC1, 0xC9, 0xC1, 0xC1, + 0xE3, 0xC1, 0xF9, 0xDD, 0xDC, 0xC0, 0xC4, 0xC3, 0xE3, 0xC0, 0xE7, 0xDC, + 0x93, 0xE4, 0xDF, 0xC0, 0xFF, 0xC0, 0x07, 0xD5, 0x09, 0x88, 0x82, 0xBF, + 0x07, 0xD5, 0xC1, 0xC9, 0xDF, 0xC0, 0xFF, 0xC0, 0xF9, 0xD4, 0x00, 0xA8, + 0x1F, 0xB0, 0xA0, 0xE0, 0x89, 0xE4, 0x1F, 0xB0, 0xA0, 0xE0, 0x1F, 0xB1, + 0x48, 0xE4, 0x39, 0xE4, 0x08, 0x90, 0x28, 0xE4, 0x10, 0xE4, 0x98, 0xBF, + 0x11, 0xD6, 0x89, 0xE4, 0x80, 0xB8, 0x84, 0xBF, 0x0D, 0xDD, 0x98, 0xE4, + 0x20, 0xB8, 0x04, 0xDE, 0xDF, 0xC2, 0xDF, 0xC9, 0x09, 0x28, 0x02, 0x38, + 0xDF, 0xC1, 0xFF, 0xC1, 0xF9, 0xD4, 0x84, 0xE4, 0x1F, 0xB0, 0xA0, 0xE0, + 0xEF, 0xC0, 0x2C, 0xDD, 0x83, 0xE4, 0x84, 0xBD, 0x00, 0x40, 0x83, 0xBC, + 0x27, 0xD4, 0x94, 0xE4, 0x03, 0xE4, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, + 0xC4, 0xC9, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0x00, 0x08, + 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, + 0xC4, 0xC9, 0xD0, 0xC1, 0xEF, 0xC1, 0xED, 0xDC, 0xE3, 0xC1, 0x07, 0xDD, + 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0xDC, 0xC1, 0xE3, 0xC1, + 0xF9, 0xDC, 0x29, 0xE4, 0x90, 0xE4, 0xDF, 0xC1, 0xFF, 0xC1, 0xD3, 0xD5, + 0x09, 0x28, 0xC1, 0xC9, 0x02, 0x38, 0xC1, 0xC2, 0xDF, 0xC1, 0xFF, 0xC1, + 0xF9, 0xD4, 0x84, 0xE4, 0x1F, 0xB0, 0xA0, 0xE0, 0xA0, 0xE0, 0xA0, 0xE0, + 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xFC, 0xB6, 0xF8, 0xE4, 0xA9, 0xE4, + 0x14, 0x93, 0xE0, 0xC9, 0x00, 0x40, 0xEF, 0xD5, 0xFF, 0x7F, 0xF2, 0xDF, + 0x1A, 0xE4, 0xD8, 0xC1, 0xC1, 0xE4, 0x11, 0x09, 0x49, 0xE4, 0xFF, 0x7F, + 0x4C, 0xBC, 0xD4, 0xE4, 0x83, 0xE4, 0xCB, 0xC8, 0x10, 0xAB, 0x01, 0x40, + 0x86, 0xBF, 0x09, 0xDC, 0xB3, 0xBF, 0x0E, 0xD6, 0x0C, 0xA8, 0x0F, 0x18, + 0x00, 0xA8, 0x04, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0xB8, 0xE4, + 0xFF, 0x7F, 0xB8, 0xBC, 0xE0, 0xCB, 0xF4, 0xD9, 0xB3, 0xBF, 0xF2, 0xD7, + 0x4B, 0xBF, 0x00, 0x40, 0xB4, 0xDA, 0x21, 0xE4, 0x24, 0xB8, 0x00, 0x40, + 0xAE, 0x63, 0x04, 0xA8, 0x08, 0x06, 0x62, 0xBF, 0x00, 0x40, 0xE3, 0xD5, + 0x12, 0x00, 0x80, 0xE4, 0xFF, 0x7F, 0x8E, 0xBC, 0x82, 0xB8, 0x18, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0x00, 0x40, 0xD5, 0xD4, 0xFF, 0x7F, 0x0C, 0xBC, + 0x62, 0xBF, 0x00, 0x40, 0xE4, 0xD5, 0x80, 0xE4, 0x84, 0xB8, 0x8B, 0xBF, + 0x00, 0x40, 0xD9, 0xDA, 0x00, 0x40, 0x91, 0xBC, 0x16, 0xD4, 0x01, 0x08, + 0xE1, 0xE4, 0xE8, 0xBA, 0x1E, 0x09, 0xFF, 0x7F, 0x9C, 0xBC, 0xE0, 0xC2, + 0x08, 0xD5, 0x62, 0xBF, 0x00, 0x40, 0xE9, 0xD5, 0x80, 0xE4, 0x89, 0xB8, + 0x84, 0xB8, 0x8B, 0xBF, 0x4D, 0xDA, 0xE0, 0xCE, 0x04, 0xD5, 0x89, 0xE4, + 0x84, 0xB8, 0x8B, 0xBF, 0x4B, 0xDA, 0x8F, 0xE4, 0x93, 0xE4, 0xFD, 0x7F, + 0x3E, 0xDF, 0x28, 0xE4, 0xE0, 0xC8, 0x38, 0xD5, 0x18, 0xE4, 0xD8, 0xC1, + 0x1C, 0x08, 0xFF, 0x7F, 0x8E, 0xBC, 0x8C, 0xB8, 0x18, 0xBF, 0x01, 0x40, + 0x20, 0xD5, 0x14, 0xE4, 0xDC, 0xC1, 0x02, 0x40, 0x14, 0xBF, 0x00, 0x40, + 0xA3, 0xDC, 0x0A, 0xE4, 0x92, 0xE4, 0x01, 0x40, 0x13, 0xBF, 0x18, 0xDD, + 0x0A, 0x08, 0x02, 0x18, 0x1A, 0x08, 0xC8, 0xC0, 0x12, 0x18, 0xC8, 0xC9, + 0x01, 0x40, 0x1B, 0xBF, 0x0F, 0xDD, 0x00, 0x08, 0x09, 0x18, 0x3A, 0x08, + 0xC8, 0xC0, 0x32, 0x18, 0xC8, 0xC9, 0x02, 0x40, 0x13, 0xBF, 0x06, 0xDD, + 0x00, 0x08, 0x09, 0x18, 0x5A, 0x08, 0xC8, 0xC0, 0x52, 0x18, 0xC8, 0xC9, + 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0x00, 0x08, 0x09, 0x18, + 0x10, 0x08, 0x19, 0x18, 0x8F, 0xE4, 0x9A, 0xE4, 0xF8, 0x7F, 0xAB, 0xDF, + 0x8F, 0xE4, 0xFF, 0x7F, 0x5A, 0xDF, 0x82, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, + 0xFC, 0xB2, 0x40, 0xB4, 0x32, 0x00, 0x22, 0x09, 0x39, 0x10, 0x20, 0x19, + 0x3E, 0x00, 0x2E, 0x09, 0x39, 0x10, 0x20, 0x19, 0x1E, 0xE4, 0x48, 0xE4, + 0x2E, 0xE4, 0xC8, 0xC2, 0x3D, 0xE4, 0xDC, 0xC3, 0x02, 0x40, 0x34, 0xBF, + 0x00, 0x40, 0xD0, 0xDC, 0x0A, 0xE4, 0x92, 0xE4, 0x01, 0x40, 0x33, 0xBF, + 0x18, 0xDD, 0x0A, 0x08, 0x02, 0x18, 0x1A, 0x08, 0xC8, 0xC0, 0x3E, 0x18, + 0xC8, 0xC9, 0x01, 0x40, 0x3B, 0xBF, 0x0F, 0xDD, 0x00, 0x08, 0x09, 0x18, + 0x3A, 0x08, 0xC8, 0xC0, 0x5E, 0x18, 0xC8, 0xC9, 0x02, 0x40, 0x33, 0xBF, + 0x06, 0xDD, 0x00, 0x08, 0x09, 0x18, 0x5A, 0x08, 0xC8, 0xC0, 0x7E, 0x18, + 0xC8, 0xC9, 0x00, 0x08, 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0x00, 0x08, + 0x09, 0x18, 0x10, 0x08, 0x19, 0x18, 0x04, 0xE4, 0x0B, 0xBA, 0xEF, 0xC0, + 0x1B, 0xDC, 0x11, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x84, 0xBD, 0x11, 0x18, + 0x91, 0xE4, 0x94, 0xB8, 0x19, 0x08, 0x00, 0x40, 0x81, 0xBD, 0x19, 0x18, + 0x8F, 0xE4, 0xFF, 0x7F, 0x0C, 0xDF, 0x81, 0xE4, 0xC8, 0xC8, 0x04, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x93, 0xE4, 0xFC, 0x7F, 0xA9, 0xDF, + 0x04, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x91, 0xE4, 0x9B, 0xB8, + 0x11, 0x08, 0x00, 0x40, 0x81, 0xBC, 0x8B, 0xBD, 0x11, 0x18, 0x80, 0xE4, + 0x00, 0x40, 0x81, 0xBD, 0x19, 0x18, 0x09, 0xB8, 0x10, 0x08, 0x00, 0x40, + 0x81, 0xBD, 0x10, 0x18, 0xC8, 0xC9, 0x8F, 0xE4, 0xF8, 0x7F, 0x39, 0xDF, + 0xDB, 0xDE, 0x00, 0xA2, 0x02, 0xE4, 0xFF, 0x7F, 0x31, 0xDE, 0x12, 0x00, + 0xFF, 0x7F, 0x24, 0xDE, 0x83, 0x91, 0x82, 0xE4, 0x9A, 0xE4, 0xFE, 0x7F, + 0x90, 0xDF, 0xFF, 0x7F, 0x7B, 0xDE, 0x32, 0x00, 0x22, 0x09, 0x39, 0x10, + 0x20, 0x19, 0x48, 0xE4, 0xB8, 0xDE, 0xE0, 0xE4, 0xE4, 0xB8, 0x8B, 0xE4, + 0x01, 0x40, 0x80, 0xB8, 0xE8, 0xBF, 0xFF, 0x7F, 0x19, 0xD9, 0x81, 0xE4, + 0x8B, 0xB8, 0x00, 0x40, 0xAD, 0x63, 0x0C, 0xA9, 0x29, 0x18, 0xEB, 0xBA, + 0x00, 0x40, 0xE1, 0xBD, 0x18, 0x1E, 0x11, 0x08, 0x00, 0x40, 0x81, 0xBC, + 0x8B, 0xBD, 0x11, 0x18, 0xAF, 0xDE, 0x60, 0xE4, 0x69, 0xB8, 0x64, 0xB8, + 0x8B, 0xE4, 0x01, 0x40, 0x80, 0xB8, 0x68, 0xBF, 0xFF, 0x7F, 0x13, 0xD9, + 0x3E, 0x00, 0x2E, 0x09, 0x39, 0x10, 0x20, 0x19, 0x1E, 0xE4, 0x2E, 0xE4, + 0xC8, 0xC2, 0x3D, 0xE4, 0xDC, 0xC3, 0x02, 0x40, 0x34, 0xBF, 0x44, 0xDC, + 0x0A, 0xE4, 0x92, 0xE4, 0x01, 0x40, 0x33, 0xBF, 0x18, 0xDD, 0x0A, 0x08, + 0x02, 0x18, 0x1A, 0x08, 0xC8, 0xC0, 0x3E, 0x18, 0xC8, 0xC9, 0x01, 0x40, + 0x3B, 0xBF, 0x0F, 0xDD, 0x00, 0x08, 0x09, 0x18, 0x3A, 0x08, 0xC8, 0xC0, + 0x5E, 0x18, 0xC8, 0xC9, 0x02, 0x40, 0x33, 0xBF, 0x06, 0xDD, 0x00, 0x08, + 0x09, 0x18, 0x5A, 0x08, 0xC8, 0xC0, 0x7E, 0x18, 0xC8, 0xC9, 0x00, 0x08, + 0xC4, 0xC0, 0x09, 0x18, 0xC4, 0xC9, 0x00, 0x08, 0x09, 0x18, 0x10, 0x08, + 0x19, 0x18, 0x8E, 0xE4, 0x8B, 0xB8, 0x00, 0x40, 0xAD, 0x63, 0x0C, 0xA9, + 0x29, 0x18, 0x6B, 0xBA, 0x00, 0x40, 0x61, 0xBD, 0x18, 0x16, 0x1E, 0x08, + 0x00, 0x40, 0x81, 0xBC, 0x8B, 0xBD, 0x1E, 0x18, 0xFF, 0x7F, 0x16, 0xDE, + 0x83, 0x93, 0x82, 0xE4, 0x9A, 0xE4, 0xFE, 0x7F, 0x20, 0xDF, 0xFF, 0x7F, + 0x4E, 0xDE, 0x11, 0x08, 0xFF, 0x7F, 0x8C, 0xBC, 0x48, 0xB8, 0x1C, 0xE4, + 0xFF, 0x7F, 0x47, 0xDE, 0x83, 0x93, 0x82, 0xE4, 0x9A, 0xE4, 0xFE, 0x7F, + 0x12, 0xDF, 0xDB, 0xDE, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, + 0x89, 0xE4, 0x00, 0xA9, 0x00, 0x40, 0xEE, 0x63, 0x0C, 0xA1, 0x01, 0x19, + 0x18, 0x40, 0x54, 0xDF, 0xFF, 0xC8, 0x03, 0xD5, 0x03, 0xB6, 0x03, 0xB0, + 0x40, 0xB4, 0x01, 0x09, 0xE0, 0xC9, 0xFA, 0xD5, 0x00, 0x19, 0xF8, 0xDE, + 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x2D, 0x40, 0x38, 0x01, + 0xE0, 0xC1, 0x05, 0xD5, 0x00, 0xA9, 0x89, 0xE4, 0x03, 0xB6, 0x03, 0xB0, + 0x40, 0xB4, 0x08, 0x40, 0x00, 0xA9, 0xFB, 0x7F, 0xDE, 0xDF, 0x2D, 0x40, + 0x30, 0x18, 0xFF, 0xA9, 0xE0, 0xC8, 0xF3, 0xD5, 0x01, 0xE4, 0x1F, 0xA9, + 0x08, 0x10, 0xC4, 0xC8, 0xDF, 0xC9, 0xE0, 0xC9, 0xFB, 0xDA, 0xEA, 0xDE, + 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, 0x29, 0xE4, 0x0A, 0x91, + 0x01, 0x40, 0x9F, 0xBF, 0x07, 0xDD, 0x16, 0xA8, 0x00, 0x18, 0xFF, 0xA9, + 0x89, 0xE4, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x2D, 0x40, 0x38, 0x09, + 0xE0, 0xC9, 0x09, 0xD5, 0x82, 0xE4, 0x0A, 0xC8, 0x89, 0xB8, 0x08, 0x09, + 0x08, 0x11, 0x89, 0xE4, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0xC4, 0xDF, + 0xFF, 0xA9, 0xE0, 0xC8, 0xEB, 0xD4, 0x2D, 0x40, 0x30, 0x09, 0xF0, 0xDE, + 0x20, 0xB5, 0x0F, 0xB1, 0xFC, 0xB6, 0x08, 0xE4, 0x29, 0xE4, 0x01, 0x40, + 0x9F, 0xBF, 0x31, 0xDC, 0x2D, 0x40, 0x38, 0x08, 0xE0, 0xC8, 0x1B, 0xD5, + 0x92, 0xE4, 0x0A, 0xC9, 0x98, 0xB8, 0x09, 0x01, 0xE0, 0xC1, 0x1D, 0xD5, + 0x00, 0xA3, 0xE1, 0xC1, 0x07, 0xD5, 0xFF, 0xC1, 0x09, 0xD5, 0x00, 0xA0, + 0x09, 0x10, 0x82, 0xE4, 0x91, 0xE0, 0x30, 0xE4, 0x83, 0xE4, 0x04, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x16, 0xA8, 0x00, 0x18, 0x01, 0xA3, 0x83, 0xE4, + 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x80, 0xE4, 0x95, 0xDF, 0xFF, 0xA3, + 0xE0, 0xC8, 0xF0, 0xD4, 0x2D, 0x40, 0x30, 0x08, 0xDD, 0xDE, 0x80, 0xE4, + 0x00, 0x40, 0x7F, 0xDF, 0x98, 0xE4, 0x83, 0x92, 0x80, 0xE4, 0x00, 0x40, + 0x61, 0xDF, 0x38, 0xE4, 0xE3, 0xDE, 0x16, 0xA8, 0x00, 0x18, 0xFF, 0xA3, + 0xDF, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, 0x29, 0xE4, + 0xFF, 0xA0, 0x01, 0x40, 0x9F, 0xBF, 0x15, 0xDC, 0x2D, 0x40, 0x38, 0x08, + 0xE0, 0xC8, 0x15, 0xD5, 0x92, 0xE4, 0x0A, 0xC9, 0x98, 0xB8, 0x09, 0x01, + 0x01, 0xA0, 0xE0, 0xC1, 0x0A, 0xD5, 0x02, 0xA0, 0xFF, 0xC1, 0x07, 0xD5, + 0x03, 0xA0, 0xE1, 0xC1, 0x04, 0xD5, 0x00, 0xA0, 0x09, 0x10, 0x82, 0xE4, + 0x91, 0xE0, 0x80, 0xE4, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x81, 0xE4, + 0xFF, 0x7F, 0x5C, 0xDF, 0xE0, 0xC8, 0xF7, 0xD4, 0x2D, 0x40, 0x31, 0x08, + 0xE3, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x98, 0xE4, 0x00, 0x40, + 0xAC, 0x63, 0x00, 0xA0, 0x00, 0x08, 0x90, 0xDF, 0x03, 0xB6, 0x01, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFC, 0xB6, 0x08, 0xE4, 0x83, 0x99, + 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0x90, 0xE4, 0xFF, 0x7F, + 0x5D, 0xDF, 0x04, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, + 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0xFF, 0x7F, 0x34, 0xDF, + 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x98, 0xE4, + 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA0, 0x00, 0x08, 0xA8, 0xDF, 0x03, 0xB6, + 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, + 0x89, 0xE4, 0x0A, 0x99, 0x00, 0xA0, 0x00, 0x40, 0xEE, 0x63, 0x0C, 0xA2, + 0x02, 0x10, 0x12, 0x40, 0x90, 0xDF, 0xFF, 0xC8, 0x03, 0xD5, 0x03, 0xB6, + 0x07, 0xB0, 0x40, 0xB4, 0x02, 0x09, 0xE0, 0xC9, 0xFA, 0xD5, 0x01, 0x19, + 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFD, 0xB6, 0x12, 0x40, + 0x7C, 0xDF, 0x03, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, 0xFB, 0xB6, + 0x18, 0xE4, 0x0B, 0x98, 0xF1, 0x20, 0x83, 0x99, 0x84, 0x98, 0x00, 0x40, + 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0x90, 0xE4, 0x17, 0x40, 0x10, 0xDF, + 0x98, 0xE4, 0x88, 0xB8, 0x09, 0xD7, 0x05, 0x40, 0x01, 0x08, 0x89, 0xB8, + 0x05, 0x40, 0x01, 0x18, 0x89, 0xE4, 0x05, 0xB6, 0x03, 0xB0, 0x40, 0xB4, + 0xE1, 0x28, 0xFF, 0x7E, 0x8F, 0xBC, 0xE1, 0x38, 0x89, 0xE4, 0x05, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, + 0x29, 0xE4, 0x0D, 0x91, 0xE8, 0x28, 0x10, 0x40, 0x80, 0xBC, 0x10, 0xD4, + 0xE0, 0x28, 0xFF, 0x7E, 0x8F, 0xBC, 0xE0, 0x38, 0xF0, 0x29, 0x83, 0x92, + 0x84, 0x91, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA0, 0x00, 0x08, 0x0A, 0x40, + 0x8A, 0xDF, 0x05, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0xF0, 0x29, 0x00, 0xA8, + 0x83, 0x98, 0x02, 0xA8, 0x84, 0x98, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA3, + 0x03, 0x08, 0x12, 0x40, 0x42, 0xDF, 0xE4, 0xDE, 0x20, 0xB5, 0x03, 0xB1, + 0xFB, 0xB6, 0x18, 0xE4, 0x0B, 0x98, 0xF1, 0x20, 0x83, 0x99, 0x84, 0x98, + 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0x90, 0xE4, 0x12, 0x40, + 0x32, 0xDF, 0x98, 0xE4, 0xFF, 0xC8, 0x0A, 0xD5, 0xE1, 0x28, 0x00, 0x41, + 0x80, 0xBD, 0xE1, 0x38, 0x05, 0x40, 0x01, 0x19, 0x89, 0xE4, 0x05, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0xE1, 0x28, 0xFF, 0x7E, 0x8F, 0xBC, 0xE1, 0x38, + 0x89, 0xE4, 0x05, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, + 0xFD, 0xB6, 0xF8, 0x29, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA0, 0x00, 0x08, + 0x0A, 0x40, 0x68, 0xDF, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x0F, 0xB1, + 0x08, 0xE4, 0x89, 0xBD, 0x00, 0x40, 0x83, 0xBC, 0x16, 0xD4, 0x19, 0xE4, + 0x00, 0x09, 0x01, 0x08, 0x98, 0xBF, 0x10, 0xD4, 0x89, 0xE4, 0xBF, 0x7F, + 0xEF, 0x6F, 0x8F, 0xB8, 0x79, 0xE0, 0x89, 0xBC, 0x20, 0x60, 0x08, 0x48, + 0x80, 0xBC, 0x1D, 0xD4, 0xC4, 0xC0, 0xC4, 0xC1, 0x00, 0x09, 0x01, 0x08, + 0x98, 0xBF, 0xF0, 0xD5, 0x91, 0xE4, 0x00, 0x21, 0x81, 0xE4, 0x08, 0xE0, + 0x09, 0xD5, 0x09, 0x22, 0x82, 0xBF, 0x07, 0xD4, 0xC1, 0xC0, 0xC1, 0xC9, + 0x00, 0x21, 0x81, 0xE4, 0x08, 0xE0, 0xF7, 0xD4, 0x09, 0x22, 0x91, 0xE4, + 0x49, 0xE0, 0x82, 0xE4, 0x48, 0xE0, 0x98, 0xBA, 0x89, 0xE4, 0x0F, 0xB0, + 0xA0, 0xE0, 0x00, 0xA9, 0xFB, 0xDE, 0x03, 0xB1, 0x98, 0xE4, 0x18, 0xE4, + 0x00, 0x40, 0x83, 0xBC, 0x13, 0xD4, 0x09, 0xE4, 0x01, 0xDE, 0xC4, 0xC0, + 0x00, 0x08, 0x98, 0xE4, 0xBF, 0x7F, 0xEF, 0x6F, 0x9F, 0xB8, 0x78, 0xE0, + 0x98, 0xBC, 0x20, 0x60, 0x08, 0x48, 0x90, 0xBC, 0xF4, 0xD5, 0x90, 0xE4, + 0x09, 0x28, 0xE0, 0xC8, 0x04, 0xD5, 0xC1, 0xC9, 0x09, 0x28, 0xE0, 0xC8, + 0xFC, 0xD4, 0x91, 0xBA, 0x89, 0xE4, 0x03, 0xB0, 0xA0, 0xE0, 0xC6, 0xE0, + 0x00, 0x40, 0x80, 0xBF, 0x04, 0xD5, 0x00, 0x40, 0xEE, 0x63, 0x0C, 0xA7, + 0x07, 0x18, 0xA0, 0xE0, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x18, 0xE4, + 0x09, 0xE4, 0x29, 0x08, 0xE0, 0xC8, 0x04, 0xD4, 0x19, 0x18, 0x03, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0x81, 0xE4, 0xF6, 0x7F, 0xF5, 0xDF, 0x00, 0xA9, + 0x20, 0x19, 0x10, 0x19, 0x03, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x0F, 0xB1, 0xB9, 0x7F, 0x00, 0xB6, 0x29, 0xE4, 0x49, 0x40, 0x00, 0x90, + 0x49, 0x40, 0x01, 0x91, 0x14, 0x44, 0xD3, 0xE1, 0xE9, 0x29, 0xFF, 0x7F, + 0x9D, 0xBC, 0x42, 0x40, 0x89, 0xEA, 0xF2, 0x29, 0x42, 0x40, 0x99, 0xEA, + 0x72, 0x09, 0x43, 0x40, 0x80, 0x99, 0x92, 0x09, 0x43, 0x40, 0x82, 0x99, + 0x14, 0x40, 0xD9, 0xE1, 0x03, 0x19, 0x42, 0x40, 0x81, 0x99, 0x40, 0x40, + 0x00, 0xA9, 0x41, 0x40, 0x83, 0x99, 0x42, 0x40, 0x82, 0x99, 0x00, 0xA9, + 0x42, 0x40, 0x83, 0x99, 0x83, 0x90, 0x84, 0x91, 0x93, 0xE4, 0x28, 0xDF, + 0x08, 0xE4, 0x88, 0xB8, 0x05, 0xD7, 0x83, 0xE4, 0xF4, 0x7F, 0x5E, 0xDF, + 0xE0, 0xC8, 0x0E, 0xD4, 0x42, 0x40, 0x88, 0xE8, 0x04, 0x40, 0x80, 0xBC, + 0x04, 0xD5, 0xE2, 0x28, 0x04, 0x40, 0x80, 0xBD, 0xE2, 0x38, 0x80, 0xE4, + 0x47, 0x40, 0x00, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0xFF, 0xA0, 0xF0, 0xDE, + 0x20, 0xB5, 0x01, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, 0x0A, 0x98, 0x83, 0x99, + 0x84, 0x98, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA9, 0x09, 0x08, 0x90, 0xE4, + 0x03, 0xDF, 0x05, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFC, 0xB3, + 0x5F, 0xB1, 0xDD, 0x7F, 0x03, 0xB6, 0x25, 0x40, 0x83, 0x98, 0x26, 0x40, + 0x80, 0x99, 0x26, 0x40, 0x01, 0x90, 0x26, 0x40, 0x02, 0x9E, 0xF8, 0x7F, + 0x57, 0xDF, 0x08, 0x08, 0x90, 0x98, 0x00, 0xA8, 0x00, 0xA9, 0x8E, 0x98, + 0x8F, 0x99, 0x00, 0xA9, 0x8D, 0x99, 0x8B, 0x99, 0x8A, 0x99, 0x25, 0x40, + 0x03, 0x91, 0xE0, 0xC1, 0x04, 0xD5, 0xE1, 0x08, 0xE0, 0xC8, 0x01, 0x40, + 0xC3, 0xD5, 0x26, 0x40, 0x00, 0x98, 0xE8, 0x29, 0x89, 0xE4, 0x00, 0x40, + 0x88, 0xBC, 0x01, 0x40, 0x98, 0xD5, 0x26, 0x40, 0x00, 0x91, 0x41, 0x08, + 0xE0, 0xC8, 0x01, 0x40, 0x92, 0xD5, 0x89, 0xE4, 0x01, 0x40, 0x8A, 0xBC, + 0xEA, 0xC8, 0x01, 0x40, 0x9C, 0xD5, 0x40, 0xE4, 0xD0, 0x41, 0xDF, 0xE1, + 0x2F, 0xE4, 0x21, 0x40, 0x80, 0x9F, 0x00, 0xA9, 0x21, 0x40, 0x82, 0x99, + 0x21, 0x40, 0x81, 0x99, 0x92, 0x99, 0x34, 0xE4, 0x04, 0x28, 0x98, 0xE4, + 0x09, 0xE0, 0x08, 0xD5, 0x02, 0x40, 0x95, 0xBF, 0x05, 0xD5, 0xC1, 0xC4, + 0x04, 0x28, 0x98, 0xE4, 0x09, 0xE0, 0xF8, 0xD4, 0x14, 0xE4, 0x13, 0xBA, + 0x14, 0xD5, 0x02, 0x13, 0x12, 0x11, 0x21, 0x40, 0x02, 0x98, 0x81, 0xB8, + 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, + 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0x01, 0x40, 0x88, 0xD8, 0x12, 0x98, + 0x81, 0xB8, 0x92, 0x98, 0x04, 0x28, 0x08, 0xE0, 0x07, 0x40, 0xF0, 0xD5, + 0xC1, 0xC4, 0x00, 0xAB, 0x8C, 0x9B, 0x91, 0x9B, 0xFF, 0xAC, 0x09, 0x40, + 0x7B, 0xEA, 0x04, 0x28, 0xA8, 0xE4, 0x0A, 0xE0, 0xC1, 0xC4, 0x8A, 0xE4, + 0xFE, 0x7F, 0x80, 0xB8, 0x05, 0x40, 0x88, 0xBF, 0x06, 0xDC, 0x0A, 0xC8, + 0x00, 0x40, 0xA6, 0x62, 0x80, 0xB8, 0x08, 0x08, 0x88, 0xE0, 0xE0, 0xCA, + 0x07, 0x40, 0xD6, 0xD5, 0x74, 0x40, 0xD3, 0xE1, 0x03, 0x3A, 0x01, 0xA6, + 0x00, 0xA8, 0x09, 0x40, 0x78, 0xEA, 0xC6, 0xE4, 0x0C, 0x90, 0x60, 0xBF, + 0x01, 0xDA, 0xC0, 0xE4, 0x09, 0x40, 0x79, 0xE8, 0xE0, 0xC9, 0x03, 0x40, + 0x0A, 0xD5, 0xC1, 0xCC, 0x1B, 0xE4, 0x08, 0x40, 0x14, 0xBC, 0x43, 0xD4, + 0x11, 0x90, 0x0C, 0xBA, 0xE0, 0xC0, 0x3F, 0xDB, 0x01, 0x40, 0x00, 0xBF, + 0x04, 0x40, 0x7B, 0xDB, 0x00, 0x40, 0xA4, 0x62, 0x00, 0xAD, 0x04, 0xDE, + 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0x21, 0xDB, 0x02, 0x1D, 0x10, 0xA8, + 0x12, 0x18, 0x21, 0x40, 0x02, 0x98, 0x01, 0x40, 0x80, 0xB8, 0x21, 0x40, + 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, + 0x81, 0x98, 0xE7, 0xC8, 0xEB, 0xDB, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, + 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFE, 0x7F, 0xD7, 0xDF, 0xE0, 0xC8, + 0x02, 0x40, 0x9D, 0xD4, 0x2F, 0xE4, 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, + 0xDF, 0xD8, 0x02, 0x1D, 0x12, 0x10, 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, + 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, + 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0x03, 0x40, 0xBD, 0xD8, 0x09, 0x40, + 0x79, 0xE8, 0x89, 0xE4, 0x08, 0xE0, 0x02, 0x40, 0xC6, 0xD5, 0x4F, 0x40, + 0xD8, 0xE1, 0x02, 0x18, 0x01, 0xA8, 0x12, 0x18, 0x21, 0x40, 0x02, 0x98, + 0xC1, 0xC8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, + 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0x02, 0x40, 0xCF, 0xD8, + 0x08, 0x40, 0x10, 0xBF, 0x02, 0x40, 0xDA, 0xD5, 0x0C, 0x90, 0x06, 0xBA, + 0xE0, 0xC0, 0x48, 0xDB, 0x01, 0x40, 0x00, 0xBF, 0x03, 0x40, 0xA8, 0xDB, + 0x00, 0x40, 0xA5, 0x62, 0x00, 0xA1, 0x04, 0xDE, 0xD0, 0xC0, 0x01, 0x40, + 0x00, 0xBF, 0x21, 0xDB, 0x02, 0x11, 0x10, 0xA8, 0x12, 0x18, 0x21, 0x40, + 0x02, 0x98, 0x01, 0x40, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, + 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, + 0xEB, 0xDB, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xFE, 0x7F, 0x79, 0xDF, 0xE0, 0xC8, 0x02, 0x40, 0x3F, 0xD4, + 0x2F, 0xE4, 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0xDF, 0xD8, 0x02, 0x11, + 0x12, 0x10, 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, + 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, + 0xE7, 0xC8, 0x0C, 0xDB, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, + 0xD7, 0xE1, 0x97, 0xB8, 0xFE, 0x7F, 0x5A, 0xDF, 0xE0, 0xC8, 0x02, 0x40, + 0x20, 0xD4, 0x2F, 0xE4, 0x8B, 0xE4, 0x10, 0x40, 0x80, 0xBC, 0x02, 0x40, + 0xD9, 0xD4, 0x02, 0x13, 0x12, 0x16, 0x21, 0x40, 0x02, 0x98, 0x86, 0xB8, + 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, + 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0x03, 0x40, 0x61, 0xD8, 0x00, 0x40, + 0xB4, 0xBC, 0x4A, 0xD5, 0x11, 0x90, 0x0C, 0xBA, 0xE0, 0xC0, 0x46, 0xDB, + 0x01, 0x40, 0x00, 0xBF, 0x03, 0x40, 0xBE, 0xDB, 0x00, 0x40, 0xA4, 0x62, + 0x00, 0xAD, 0x04, 0xDE, 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0x21, 0xDB, + 0x02, 0x1D, 0x10, 0xA8, 0x12, 0x18, 0x21, 0x40, 0x02, 0x98, 0x01, 0x40, + 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, + 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0xEB, 0xDB, 0x26, 0x40, + 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFE, 0x7F, + 0x15, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0xDB, 0xD4, 0x2F, 0xE4, 0xD0, 0xC0, + 0x01, 0x40, 0x00, 0xBF, 0xDF, 0xD8, 0x02, 0x1D, 0x12, 0x10, 0x21, 0x40, + 0x02, 0x99, 0x90, 0xB8, 0x21, 0x40, 0x82, 0x99, 0x21, 0x40, 0x01, 0x98, + 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0x0D, 0xDB, 0x26, 0x40, + 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFD, 0x7F, + 0xF7, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0xBD, 0xD4, 0x21, 0x40, 0x02, 0x99, + 0x8C, 0xE4, 0x11, 0x90, 0xC0, 0xBF, 0x01, 0xDA, 0x80, 0xE4, 0x12, 0x91, + 0x18, 0xB8, 0x92, 0x91, 0xE0, 0xC9, 0x02, 0x40, 0xFA, 0xD4, 0x00, 0xA0, + 0x21, 0x40, 0x81, 0x90, 0x2F, 0xE4, 0x0A, 0x98, 0xE0, 0xC8, 0xFE, 0x7F, + 0x88, 0xD5, 0x25, 0x40, 0x03, 0x98, 0x0A, 0x99, 0xF3, 0x7F, 0xA1, 0xDF, + 0x8A, 0x90, 0xFE, 0x7F, 0x80, 0xDE, 0x26, 0x40, 0x00, 0x98, 0xF1, 0x7F, + 0x79, 0xDF, 0xFF, 0xA9, 0xE0, 0xC8, 0x16, 0xD4, 0x26, 0x40, 0x00, 0x98, + 0xE8, 0x29, 0x89, 0xE4, 0x01, 0x40, 0x8A, 0xBC, 0xEA, 0xC8, 0xFE, 0x7F, + 0x64, 0xD4, 0x26, 0x40, 0x00, 0x99, 0xF9, 0x28, 0x88, 0xB8, 0xFE, 0x7F, + 0x5E, 0xD7, 0x83, 0x90, 0x84, 0x9E, 0x25, 0x40, 0x03, 0x98, 0xFD, 0x7F, + 0xD0, 0xDF, 0x98, 0xE4, 0x89, 0xE4, 0x22, 0x40, 0x01, 0xB6, 0x5F, 0xB0, + 0xFC, 0xB2, 0x40, 0xB4, 0x81, 0xE4, 0xF3, 0x7F, 0x27, 0xDF, 0xFE, 0x7F, + 0x38, 0xDE, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xFD, 0x7F, 0xA7, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0x6D, 0xD4, + 0x2F, 0xE4, 0xFE, 0x7F, 0x6A, 0xDE, 0x01, 0x40, 0xB0, 0xBD, 0x8B, 0xE4, + 0x01, 0x40, 0x80, 0xBC, 0x03, 0x40, 0x7B, 0xD4, 0x8B, 0xE4, 0x04, 0x40, + 0x80, 0xBC, 0x03, 0x40, 0x76, 0xD5, 0x8E, 0x80, 0xC4, 0xCE, 0x01, 0xA9, + 0x00, 0x40, 0xB2, 0xDE, 0x01, 0x40, 0xB0, 0xBD, 0x8B, 0xE4, 0x01, 0x40, + 0x80, 0xBC, 0x03, 0x40, 0x5F, 0xD4, 0x8B, 0xE4, 0x04, 0x40, 0x80, 0xBC, + 0x03, 0x40, 0x5A, 0xD5, 0x8E, 0x80, 0xC4, 0xCE, 0x00, 0xA9, 0x00, 0x40, + 0xA1, 0xDE, 0x01, 0x40, 0xB0, 0xBD, 0x8B, 0xE4, 0x01, 0x40, 0x80, 0xBC, + 0x03, 0x40, 0x54, 0xD4, 0x8B, 0xE4, 0x04, 0x40, 0x80, 0xBC, 0x03, 0x40, + 0x4F, 0xD5, 0x8E, 0x20, 0xC4, 0xCE, 0xE0, 0xC0, 0x01, 0x40, 0x6D, 0xD9, + 0x01, 0xA9, 0x8C, 0x9C, 0xCC, 0xB8, 0x02, 0xD7, 0xF7, 0x7F, 0xBF, 0xBC, + 0x3F, 0xE4, 0xE0, 0xC0, 0x04, 0xD4, 0x0C, 0x91, 0xE0, 0xC1, 0x02, 0x40, + 0xD5, 0xD5, 0x89, 0xE4, 0x48, 0xE0, 0xE1, 0xC8, 0x1A, 0xD5, 0x03, 0x40, + 0x97, 0xDB, 0xE2, 0xC8, 0x25, 0xD5, 0x00, 0x40, 0x4C, 0x63, 0x0D, 0xA3, + 0x83, 0xE4, 0xFD, 0x7F, 0x2A, 0xDF, 0x68, 0xE4, 0xFE, 0x7F, 0x41, 0xDE, + 0xDF, 0xC3, 0x80, 0xE4, 0x0A, 0xA9, 0xE1, 0x7F, 0x74, 0xDF, 0x03, 0x40, + 0x80, 0xB8, 0x03, 0x38, 0x80, 0xE4, 0x0A, 0xA9, 0xE0, 0x7F, 0xCF, 0xDF, + 0x08, 0xE4, 0xE9, 0xC0, 0xF1, 0xDC, 0xDF, 0xC3, 0x03, 0x40, 0x00, 0xB8, + 0x03, 0x30, 0x22, 0x40, 0x04, 0xA6, 0xD7, 0xE1, 0x67, 0xB8, 0x63, 0xBA, + 0xFA, 0x7F, 0x6C, 0xB8, 0xFE, 0x7F, 0x25, 0xDE, 0xDF, 0xC3, 0x80, 0xE4, + 0x00, 0x40, 0x8F, 0xBC, 0x0B, 0x99, 0x89, 0xB8, 0x08, 0x28, 0x03, 0x38, + 0x11, 0xC0, 0xF6, 0xD4, 0xEC, 0xDE, 0x0E, 0x08, 0xC4, 0xCE, 0x91, 0x98, + 0xE0, 0xC8, 0xFD, 0x7F, 0xFA, 0xDA, 0x68, 0xE0, 0x91, 0x98, 0x00, 0x40, + 0xB4, 0xBD, 0xFD, 0x7F, 0xF4, 0xDE, 0xC1, 0xC4, 0x01, 0x40, 0xB0, 0xBD, + 0xFD, 0x7F, 0xEF, 0xDE, 0x00, 0xA0, 0x00, 0x40, 0x0A, 0xE6, 0x0A, 0xB8, + 0xFD, 0x7F, 0x00, 0xB8, 0x04, 0x2A, 0xC1, 0xC4, 0x8A, 0xE4, 0xFD, 0x7F, + 0x80, 0xB8, 0xE9, 0xC8, 0xF4, 0xDD, 0x91, 0x90, 0xFD, 0x7F, 0xE3, 0xDE, + 0x08, 0x40, 0xB0, 0xBD, 0xFD, 0x7F, 0xDB, 0xDE, 0x04, 0x2A, 0xC1, 0xC4, + 0x02, 0x40, 0xAA, 0xBF, 0x06, 0x40, 0x08, 0xD5, 0x00, 0xA0, 0x07, 0xDE, + 0x00, 0x40, 0x0A, 0xE6, 0x0A, 0xB8, 0xFD, 0x7F, 0x00, 0xB8, 0x04, 0x2A, + 0xC1, 0xC4, 0x8A, 0xE4, 0xFD, 0x7F, 0x80, 0xB8, 0xE9, 0xC8, 0xF4, 0xDD, + 0xC0, 0xE4, 0xFF, 0xC0, 0xFD, 0x7F, 0xC7, 0xDA, 0xFF, 0xAC, 0xFD, 0x7F, + 0xC4, 0xDE, 0x0E, 0x08, 0xC4, 0xCE, 0x08, 0xE4, 0x02, 0xA9, 0x00, 0x40, + 0x4E, 0x63, 0x07, 0xA1, 0x8B, 0x91, 0x00, 0x40, 0xB2, 0xBD, 0x78, 0xAA, + 0x00, 0xA8, 0x09, 0x40, 0x78, 0xEA, 0xFF, 0x7F, 0x6C, 0xDE, 0x00, 0xA8, + 0x09, 0x40, 0x78, 0xEA, 0x0E, 0x08, 0xC4, 0xCE, 0x38, 0xE4, 0xE0, 0xC8, + 0x03, 0x40, 0xC5, 0xD4, 0x00, 0x40, 0x4F, 0x63, 0x08, 0xA3, 0x06, 0xA6, + 0xFD, 0x7F, 0xBB, 0xDE, 0x00, 0x40, 0x4E, 0x63, 0x07, 0xA9, 0x8B, 0x99, + 0x8B, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0x00, 0x40, 0xBB, 0xD4, 0x8B, 0xE4, + 0x04, 0x40, 0x80, 0xBC, 0x00, 0x40, 0xB6, 0xD5, 0x8E, 0x80, 0xC4, 0xCE, + 0x02, 0xA9, 0x8B, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0xD7, 0xD5, 0xE0, 0xC0, + 0xD5, 0xD5, 0x00, 0x40, 0xB2, 0xBD, 0xD2, 0xDE, 0x8B, 0xE4, 0x01, 0x40, + 0x80, 0xBC, 0x03, 0x40, 0x74, 0xD5, 0x0E, 0x08, 0x12, 0x90, 0x08, 0x10, + 0xC4, 0xCE, 0xFD, 0x7F, 0x4E, 0xDE, 0x04, 0x28, 0x06, 0x40, 0x8C, 0xBF, + 0x84, 0xD5, 0x01, 0x40, 0xB0, 0xBD, 0xFD, 0x7F, 0x75, 0xDE, 0x2B, 0xA8, + 0x09, 0x40, 0x78, 0xEA, 0xFD, 0x7F, 0x6F, 0xDE, 0x04, 0x40, 0xB0, 0xBD, + 0xFD, 0x7F, 0x6B, 0xDE, 0xFF, 0xCC, 0x04, 0x40, 0x75, 0xD5, 0x06, 0x40, + 0xA7, 0xBF, 0x04, 0x40, 0x07, 0xD5, 0x04, 0x40, 0xA7, 0xBF, 0x04, 0x40, + 0x03, 0xD5, 0x8B, 0xE4, 0x00, 0x40, 0x88, 0xBC, 0x03, 0x40, 0x57, 0xD5, + 0x0E, 0x00, 0x1E, 0x01, 0x8E, 0x90, 0x8F, 0x91, 0xC8, 0xCE, 0x0E, 0x98, + 0x0F, 0x99, 0x12, 0x40, 0xDE, 0xDF, 0xE0, 0xC8, 0x03, 0x40, 0x57, 0xD5, + 0x00, 0xA8, 0x98, 0xE4, 0x83, 0x98, 0x84, 0x99, 0x0E, 0x98, 0x0F, 0x99, + 0xE2, 0x7F, 0x2C, 0xDF, 0x88, 0xB8, 0x03, 0xD6, 0x2D, 0xA8, 0x09, 0x40, + 0x78, 0xEA, 0x8A, 0xE4, 0xFB, 0x7F, 0x8B, 0xB8, 0x00, 0x40, 0x53, 0x63, + 0x0B, 0xA3, 0xE2, 0xC8, 0x03, 0xDD, 0x00, 0x40, 0x53, 0x63, 0x0F, 0xA3, + 0x03, 0xA6, 0xFD, 0x7F, 0x4E, 0xDE, 0x74, 0x40, 0xD3, 0xE1, 0x04, 0x40, + 0xA3, 0xBF, 0x05, 0xD5, 0x8B, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0x03, 0x40, + 0xAF, 0xD5, 0x08, 0xA8, 0x83, 0x98, 0x68, 0x40, 0xD8, 0xE1, 0x00, 0xA9, + 0xE8, 0x7F, 0x2B, 0xDF, 0x0E, 0x08, 0x83, 0x98, 0xC4, 0xCE, 0x68, 0x40, + 0xD8, 0xE1, 0x84, 0x98, 0x25, 0x40, 0x03, 0x98, 0x93, 0xE4, 0xED, 0x7F, + 0xBA, 0xDF, 0x68, 0xE4, 0xFF, 0xC8, 0xFD, 0x7F, 0x2B, 0xD4, 0x26, 0x40, + 0x00, 0x99, 0xE9, 0x28, 0x04, 0x40, 0x80, 0xBD, 0xE9, 0x38, 0x0A, 0x99, + 0xE0, 0xC9, 0x04, 0xD5, 0x25, 0x40, 0x03, 0x98, 0xF1, 0x7F, 0xF7, 0xDF, + 0x26, 0x40, 0x00, 0x90, 0xE0, 0x28, 0x04, 0x40, 0x80, 0xBC, 0xFF, 0xA9, + 0xFE, 0x7F, 0x6E, 0xD4, 0x12, 0x99, 0x89, 0xE4, 0x22, 0x40, 0x01, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x00, 0x40, 0xB1, 0xBD, 0xFC, 0x7F, + 0xF4, 0xDE, 0x09, 0x40, 0x78, 0xE8, 0xE0, 0xC8, 0xFC, 0x7F, 0xEF, 0xD4, + 0x20, 0xA8, 0x09, 0x40, 0x78, 0xEA, 0xFC, 0x7F, 0xEA, 0xDE, 0x00, 0x40, + 0xB8, 0xBD, 0xFC, 0x7F, 0xE6, 0xDE, 0x00, 0x40, 0x4F, 0x63, 0x0F, 0xA8, + 0x8B, 0x98, 0x8B, 0xE4, 0x01, 0x40, 0x80, 0xBC, 0xFF, 0x7F, 0x45, 0xD5, + 0x0E, 0x08, 0xC4, 0xCE, 0x08, 0xE4, 0xFF, 0x7F, 0x47, 0xDE, 0x60, 0xE0, + 0x2D, 0xA8, 0x09, 0x40, 0x78, 0xEA, 0xFE, 0x7F, 0x8D, 0xDE, 0x8B, 0xE4, + 0x00, 0x40, 0x82, 0xBC, 0xFC, 0x7F, 0xF2, 0xD5, 0xC2, 0xCC, 0xFC, 0x7F, + 0xEF, 0xDE, 0x8B, 0xE4, 0x00, 0x40, 0x82, 0xBC, 0xFD, 0x7F, 0x48, 0xD5, + 0x70, 0x40, 0xD9, 0xE1, 0x30, 0xA8, 0x09, 0x38, 0x0E, 0x40, 0x1A, 0xEA, + 0x02, 0x19, 0x02, 0xA8, 0x12, 0x18, 0x21, 0x40, 0x02, 0x98, 0xC2, 0xC8, + 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, + 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0xFD, 0x7F, 0x31, 0xDB, 0x26, 0x40, + 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFB, 0x7F, + 0xCF, 0xDF, 0xE0, 0xC8, 0x96, 0xD4, 0x2F, 0xE4, 0x08, 0x40, 0x10, 0xBF, + 0xFD, 0x7F, 0x26, 0xD4, 0x11, 0x90, 0x0C, 0xBA, 0xE0, 0xC0, 0xFD, 0x7F, + 0x21, 0xDB, 0x01, 0x40, 0x00, 0xBF, 0x01, 0x40, 0xF6, 0xDB, 0x00, 0x40, + 0xA5, 0x62, 0x00, 0xA1, 0x04, 0xDE, 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, + 0x21, 0xDB, 0x02, 0x11, 0x10, 0xA8, 0x12, 0x18, 0x21, 0x40, 0x02, 0x98, + 0x01, 0x40, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, + 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0xEB, 0xDB, + 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, + 0xFB, 0x7F, 0x9E, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, 0x64, 0xD4, 0x2F, 0xE4, + 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0xDF, 0xD8, 0x02, 0x11, 0x12, 0x10, + 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, + 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, + 0xFC, 0x7F, 0xE4, 0xDB, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, + 0xD7, 0xE1, 0x97, 0xB8, 0xFB, 0x7F, 0x7E, 0xDF, 0xE0, 0xC8, 0xFF, 0x7F, + 0x44, 0xD4, 0x2F, 0xE4, 0xFC, 0x7F, 0xD6, 0xDE, 0x06, 0x40, 0xA5, 0xBF, + 0x00, 0x40, 0xA2, 0xDB, 0x00, 0xA8, 0x98, 0xE4, 0x83, 0x98, 0x84, 0x99, + 0x0E, 0x98, 0x0F, 0x99, 0xE1, 0x7F, 0x89, 0xDF, 0xE0, 0xC8, 0x00, 0x40, + 0xF6, 0xD4, 0x00, 0x40, 0x44, 0x63, 0x04, 0xA8, 0x02, 0x18, 0x01, 0xA0, + 0x12, 0x10, 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, + 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0x80, 0xB8, 0x21, 0x40, 0x81, 0x98, + 0xE7, 0xC8, 0x02, 0x40, 0xA3, 0xD8, 0x18, 0x99, 0x17, 0x98, 0x98, 0xBF, + 0x05, 0xD9, 0x8B, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0xFD, 0x7F, 0x0B, 0xD5, + 0x10, 0x91, 0x02, 0x11, 0x12, 0x10, 0x21, 0x40, 0x02, 0x98, 0xC1, 0xC8, + 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, + 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0x02, 0x40, 0xA7, 0xD8, 0x17, 0x90, + 0xDF, 0xC0, 0xE0, 0xC0, 0xFC, 0x7F, 0xF5, 0xDB, 0x01, 0x40, 0x00, 0xBF, + 0x02, 0x40, 0xB2, 0xDB, 0x00, 0x40, 0xA5, 0x62, 0x00, 0xA1, 0x04, 0xDE, + 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0x21, 0xDB, 0x02, 0x11, 0x10, 0xA8, + 0x12, 0x18, 0x21, 0x40, 0x02, 0x98, 0x01, 0x40, 0x80, 0xB8, 0x21, 0x40, + 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, + 0x81, 0x98, 0xE7, 0xC8, 0xEB, 0xDB, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, + 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFB, 0x7F, 0x11, 0xDF, 0xE0, 0xC8, + 0xFE, 0x7F, 0xD7, 0xD4, 0x2F, 0xE4, 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, + 0xDF, 0xD8, 0x02, 0x11, 0x12, 0x10, 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, + 0xFC, 0x7F, 0xB6, 0xDE, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, + 0xD7, 0xE1, 0x97, 0xB8, 0xFA, 0x7F, 0xFA, 0xDF, 0xE0, 0xC8, 0xFE, 0x7F, + 0xC0, 0xD4, 0x2F, 0xE4, 0x09, 0x40, 0x79, 0xE8, 0xFC, 0x7F, 0x35, 0xDE, + 0x00, 0x40, 0xA5, 0x62, 0x00, 0xA1, 0xFC, 0x7F, 0x7C, 0xDE, 0x26, 0x40, + 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xFA, 0x7F, + 0xE5, 0xDF, 0xE0, 0xC8, 0xFC, 0x7F, 0xFB, 0xD5, 0xFE, 0x7F, 0xA9, 0xDE, + 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, + 0xFA, 0x7F, 0xD8, 0xDF, 0xE0, 0xC8, 0xFE, 0x7F, 0x9E, 0xD4, 0x2F, 0xE4, + 0xFC, 0x7F, 0x91, 0xDE, 0x17, 0x98, 0xE1, 0xC8, 0x01, 0x40, 0x30, 0xDB, + 0x70, 0x40, 0xD9, 0xE1, 0x03, 0x28, 0xC1, 0xC3, 0x09, 0x38, 0x2E, 0xA8, + 0x0E, 0x40, 0x18, 0xEA, 0x02, 0x19, 0x02, 0xA8, 0x12, 0x18, 0x21, 0x40, + 0x02, 0x98, 0xC2, 0xC8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, + 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0x01, 0x40, + 0x09, 0xD8, 0x00, 0xA8, 0x98, 0xE4, 0x83, 0x98, 0x84, 0x99, 0x0E, 0x98, + 0x0F, 0x99, 0xDF, 0x7F, 0x79, 0xDF, 0xE0, 0xC8, 0x00, 0x40, 0x91, 0xD5, + 0x02, 0x13, 0x17, 0x99, 0x89, 0xE4, 0xDF, 0xC8, 0x12, 0x18, 0x21, 0x40, + 0x02, 0x98, 0x89, 0xB8, 0xDF, 0xC8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, + 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, + 0x00, 0x40, 0xBF, 0xD8, 0x1C, 0x42, 0xD8, 0xE1, 0x02, 0x18, 0x0D, 0x99, + 0x12, 0x19, 0x21, 0x40, 0x02, 0x98, 0x89, 0xB8, 0xFC, 0x7F, 0x40, 0xDE, + 0x89, 0xE4, 0x48, 0xE0, 0xFD, 0x7F, 0x4B, 0xD4, 0x8B, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0xFD, 0x7F, 0x46, 0xD5, 0xCF, 0x41, 0xD3, 0xE1, 0x30, 0xA8, + 0x03, 0x38, 0xFD, 0x7F, 0x40, 0xDE, 0x00, 0x40, 0xA4, 0x62, 0x00, 0xAD, + 0xFB, 0x7F, 0xA9, 0xDE, 0x00, 0x40, 0xA4, 0x62, 0x00, 0xAD, 0xFC, 0x7F, + 0x66, 0xDE, 0x18, 0x99, 0xE0, 0xC9, 0x01, 0x40, 0xF9, 0xDB, 0x17, 0x90, + 0x90, 0xBF, 0x00, 0x40, 0xDA, 0xD9, 0x02, 0x13, 0x12, 0x10, 0x21, 0x40, + 0x02, 0x98, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, + 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0x02, 0x40, + 0x82, 0xD8, 0x18, 0x90, 0x17, 0x98, 0x08, 0xBA, 0xE0, 0xC0, 0x01, 0x40, + 0x0E, 0xDB, 0x01, 0x40, 0x00, 0xBF, 0x00, 0x40, 0xEC, 0xDB, 0x00, 0x40, + 0xA5, 0x62, 0x00, 0xA1, 0x05, 0xDE, 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, + 0x00, 0x40, 0xE6, 0xDB, 0x02, 0x11, 0x10, 0xA8, 0x12, 0x18, 0x21, 0x40, + 0x02, 0x98, 0x01, 0x40, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, + 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, + 0xEA, 0xDB, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xFA, 0x7F, 0x2F, 0xDF, 0xE0, 0xC8, 0xFD, 0x7F, 0xF5, 0xD4, + 0x2F, 0xE4, 0xDD, 0xDE, 0x0E, 0x08, 0xC4, 0xCE, 0x08, 0xE4, 0x00, 0xA9, + 0xFD, 0x7F, 0x46, 0xDE, 0x0E, 0x08, 0xC4, 0xCE, 0x08, 0xE4, 0xFC, 0x7F, + 0xAE, 0xDE, 0x0E, 0x08, 0xC4, 0xCE, 0x08, 0xE4, 0x01, 0xA9, 0xFD, 0x7F, + 0x3B, 0xDE, 0x17, 0x90, 0xDF, 0xC0, 0xE0, 0xC0, 0xFF, 0x7F, 0x7E, 0xDB, + 0x01, 0x40, 0x00, 0xBF, 0x01, 0x40, 0x72, 0xDB, 0x00, 0x40, 0xA5, 0x62, + 0x00, 0xA1, 0x04, 0xDE, 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0x21, 0xDB, + 0x02, 0x11, 0x10, 0xA8, 0x12, 0x18, 0x21, 0x40, 0x02, 0x98, 0x01, 0x40, + 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, + 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0xEB, 0xDB, 0x26, 0x40, + 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xF9, 0x7F, + 0xEF, 0xDF, 0xE0, 0xC8, 0xFD, 0x7F, 0xB5, 0xD4, 0x2F, 0xE4, 0xD0, 0xC0, + 0x01, 0x40, 0x00, 0xBF, 0xDF, 0xD8, 0x02, 0x11, 0x12, 0x10, 0x21, 0x40, + 0x02, 0x98, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, + 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0xFF, 0x7F, + 0x41, 0xDB, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xF9, 0x7F, 0xCF, 0xDF, 0xE0, 0xC8, 0xFD, 0x7F, 0x95, 0xD4, + 0x2F, 0xE4, 0xFF, 0x7F, 0x33, 0xDE, 0x00, 0x40, 0xA5, 0x62, 0x00, 0xA1, + 0xFE, 0x7F, 0x2E, 0xDE, 0xE0, 0xC8, 0xFC, 0x7F, 0x68, 0xD4, 0xDF, 0xC3, + 0x90, 0xE4, 0x00, 0x40, 0x97, 0xBC, 0x03, 0x40, 0x90, 0xB8, 0x03, 0x39, + 0x0D, 0xC0, 0xF7, 0xD4, 0x8B, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0xFC, 0x7F, + 0x76, 0xD5, 0x03, 0x40, 0x90, 0xBF, 0xFC, 0x7F, 0x72, 0xD5, 0xDF, 0xC3, + 0xFF, 0x7F, 0x2B, 0xDE, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, + 0xD7, 0xE1, 0x97, 0xB8, 0xF9, 0x7F, 0xA4, 0xDF, 0xE0, 0xC8, 0xFD, 0x7F, + 0x6A, 0xD4, 0x2F, 0xE4, 0xFE, 0x7F, 0xE9, 0xDE, 0x8B, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0xFE, 0x7F, 0xCB, 0xD4, 0x02, 0x13, 0x01, 0xA8, 0x12, 0x18, + 0x21, 0x40, 0x02, 0x98, 0xC1, 0xC8, 0xFE, 0x7F, 0xF0, 0xDE, 0x02, 0x13, + 0x12, 0x19, 0x21, 0x40, 0x02, 0x98, 0x89, 0xB8, 0x21, 0x40, 0x82, 0x98, + 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, + 0xE7, 0xC8, 0x01, 0x40, 0xC4, 0xD8, 0x18, 0x98, 0x38, 0xB8, 0x00, 0x40, + 0x52, 0x63, 0x0D, 0xA8, 0x02, 0x18, 0x01, 0xA8, 0x12, 0x18, 0x21, 0x40, + 0x02, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, + 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0x01, 0x40, + 0xA0, 0xD8, 0x02, 0x13, 0x17, 0x99, 0x18, 0x98, 0x98, 0xBA, 0xFE, 0x7F, + 0xD3, 0xDE, 0x00, 0x40, 0xA5, 0x62, 0x00, 0xA1, 0x02, 0x11, 0x12, 0x10, + 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, + 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, + 0x0C, 0xDB, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xF9, 0x7F, 0x4B, 0xDF, 0xE0, 0xC8, 0xFD, 0x7F, 0x11, 0xD4, + 0x2F, 0xE4, 0x8B, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0xFB, 0x7F, 0x01, 0xD5, + 0x00, 0x40, 0x52, 0x63, 0x0D, 0xA8, 0x02, 0x18, 0x01, 0xA8, 0x12, 0x18, + 0x21, 0x40, 0x02, 0x98, 0xC1, 0xC8, 0xFA, 0x7F, 0xEB, 0xDE, 0x04, 0x40, + 0xB0, 0xBC, 0x01, 0x40, 0x1A, 0xD5, 0x0E, 0x08, 0x12, 0x91, 0x88, 0x31, + 0xC4, 0xCE, 0xF9, 0x7F, 0xD6, 0xDE, 0x0E, 0x08, 0x1E, 0x09, 0x8E, 0x98, + 0x8F, 0x99, 0xC8, 0xCE, 0x0E, 0x98, 0x0F, 0x99, 0x0F, 0x40, 0x87, 0xDF, + 0xE0, 0xC8, 0xFC, 0x7F, 0xA9, 0xD4, 0x0E, 0x98, 0x0F, 0x99, 0xDB, 0x7F, + 0x35, 0xDF, 0xE0, 0xC8, 0x01, 0x40, 0x79, 0xD5, 0x8A, 0xE4, 0xFB, 0x7F, + 0x8B, 0xB8, 0x00, 0x40, 0x54, 0x63, 0x03, 0xA3, 0xE2, 0xC8, 0xFC, 0x7F, + 0xB1, 0xDD, 0x00, 0x40, 0x54, 0x63, 0x07, 0xA3, 0x03, 0xA6, 0xF9, 0x7F, + 0xFC, 0xDE, 0x05, 0x40, 0xA3, 0xBF, 0x05, 0xD5, 0x9B, 0xE4, 0x01, 0x40, + 0x90, 0xBC, 0x01, 0x40, 0x18, 0xD5, 0x94, 0x93, 0x00, 0xA6, 0x16, 0xE4, + 0x08, 0xA8, 0x83, 0x98, 0x54, 0x40, 0xD8, 0xE1, 0x96, 0xE4, 0xE4, 0x7F, + 0xD8, 0xDF, 0xE0, 0xCC, 0x01, 0x40, 0xBF, 0xD9, 0x14, 0x99, 0x81, 0xE4, + 0x0A, 0xC8, 0x89, 0xB8, 0x08, 0x08, 0xE0, 0xC8, 0x14, 0xD5, 0x83, 0x98, + 0x54, 0x40, 0xD8, 0xE1, 0x84, 0x98, 0x25, 0x40, 0x03, 0x98, 0x74, 0x40, + 0xD9, 0xE1, 0xEA, 0x7F, 0x5E, 0xDF, 0xFF, 0xC8, 0x01, 0x40, 0x9A, 0xD5, + 0x86, 0xB8, 0x8C, 0xBF, 0x04, 0xD8, 0xC1, 0xC1, 0x68, 0xE4, 0x8C, 0xBF, + 0xE5, 0xD4, 0xE0, 0xC6, 0xF9, 0x7F, 0xC9, 0xD5, 0x96, 0xE4, 0xC1, 0xC9, + 0x25, 0x40, 0x03, 0x98, 0xF2, 0x7F, 0xF1, 0xDF, 0x8A, 0x98, 0xE0, 0xC8, + 0x01, 0x40, 0xE9, 0xD5, 0x08, 0xA8, 0x83, 0x98, 0x54, 0x40, 0xD8, 0xE1, + 0x00, 0xA9, 0xE4, 0x7F, 0xA6, 0xDF, 0x50, 0x40, 0xD8, 0xE1, 0x83, 0x98, + 0x84, 0x96, 0xC4, 0xC8, 0x85, 0x98, 0x25, 0x40, 0x03, 0x98, 0x0A, 0x99, + 0xEA, 0x7F, 0x68, 0xDF, 0x86, 0xBF, 0x01, 0x40, 0x71, 0xD4, 0x0A, 0x93, + 0x93, 0xE4, 0x96, 0xB8, 0x00, 0xA8, 0x09, 0x38, 0xF9, 0x7F, 0xA3, 0xDE, + 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, + 0xF8, 0x7F, 0xAA, 0xDF, 0xE0, 0xC8, 0xFC, 0x7F, 0x70, 0xD4, 0x2F, 0xE4, + 0xFD, 0x7F, 0x4F, 0xDE, 0x0E, 0x08, 0xC4, 0xCE, 0x03, 0x38, 0x01, 0xA6, + 0xF9, 0x7F, 0x8C, 0xDE, 0x00, 0x40, 0xA5, 0x62, 0x00, 0xA1, 0x02, 0x11, + 0x12, 0x10, 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, 0xFE, 0x7F, 0xB2, 0xDE, + 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, + 0xF8, 0x7F, 0x8C, 0xDF, 0xE0, 0xC8, 0xFC, 0x7F, 0x52, 0xD4, 0x2F, 0xE4, + 0xFD, 0x7F, 0x4B, 0xDE, 0xE0, 0xCC, 0xFB, 0x7F, 0xFA, 0xD4, 0x01, 0xAC, + 0xFB, 0x7F, 0xF7, 0xDE, 0x00, 0x40, 0xA5, 0x62, 0x00, 0xA1, 0x02, 0x11, + 0x12, 0x10, 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, 0xFA, 0x7F, 0x2A, 0xDE, + 0x00, 0x40, 0x44, 0x63, 0x04, 0xA8, 0x02, 0x18, 0x01, 0xA0, 0x12, 0x10, + 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, + 0x21, 0x40, 0x01, 0x98, 0x80, 0xB8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, + 0x00, 0x40, 0xB3, 0xD8, 0x18, 0x98, 0xE0, 0xC8, 0x04, 0xD4, 0x17, 0x98, + 0xE0, 0xC8, 0xFA, 0x7F, 0x1A, 0xD5, 0x10, 0x98, 0x02, 0x18, 0x12, 0x10, + 0x21, 0x40, 0x02, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, + 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, + 0x00, 0x40, 0xE8, 0xD8, 0x18, 0x98, 0x00, 0xA0, 0x08, 0xBA, 0xE0, 0xC0, + 0x50, 0xDB, 0x01, 0x40, 0x00, 0xBF, 0x2F, 0xDB, 0x00, 0x40, 0xA5, 0x62, + 0x00, 0xA1, 0x04, 0xDE, 0xD0, 0xC0, 0x01, 0x40, 0x00, 0xBF, 0x2A, 0xDB, + 0x02, 0x11, 0x10, 0xA8, 0x12, 0x18, 0x21, 0x40, 0x02, 0x98, 0x01, 0x40, + 0x80, 0xB8, 0x21, 0x40, 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, + 0xC1, 0xC8, 0x21, 0x40, 0x81, 0x98, 0xE7, 0xC8, 0xEB, 0xDB, 0x26, 0x40, + 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xF8, 0x7F, + 0x21, 0xDF, 0xE0, 0xC8, 0xFB, 0x7F, 0xE7, 0xD4, 0x2F, 0xE4, 0xDE, 0xDE, + 0x06, 0xAC, 0xFB, 0x7F, 0x90, 0xDE, 0x0E, 0x08, 0x12, 0x99, 0x08, 0x19, + 0xC4, 0xCE, 0xF8, 0x7F, 0xBC, 0xDE, 0x00, 0x40, 0xA5, 0x62, 0x00, 0xA1, + 0x02, 0x11, 0x12, 0x10, 0x21, 0x40, 0x02, 0x98, 0x80, 0xB8, 0x21, 0x40, + 0x82, 0x98, 0xC8, 0xC2, 0x21, 0x40, 0x01, 0x98, 0xC1, 0xC8, 0x21, 0x40, + 0x81, 0x98, 0xE7, 0xC8, 0x0C, 0xDB, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, + 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xF7, 0x7F, 0xF9, 0xDF, 0xE0, 0xC8, + 0xFB, 0x7F, 0xBF, 0xD4, 0x2F, 0xE4, 0x02, 0x13, 0x17, 0x98, 0x12, 0x18, + 0x21, 0x40, 0x02, 0x99, 0x98, 0xB8, 0x21, 0x40, 0x82, 0x99, 0xF9, 0x7F, + 0xA1, 0xDE, 0xE0, 0xCC, 0xFA, 0x7F, 0x92, 0xD9, 0x83, 0x9C, 0xF3, 0x7F, + 0xD1, 0xDF, 0x6C, 0xE4, 0xE0, 0xC8, 0xF8, 0x7F, 0xD2, 0xD5, 0x68, 0xE4, + 0x63, 0xBA, 0x6C, 0xBF, 0xF8, 0x7F, 0xCD, 0xDB, 0x6C, 0xE4, 0xF8, 0x7F, + 0xCA, 0xDE, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xF7, 0x7F, 0xD1, 0xDF, 0xE0, 0xC8, 0xFB, 0x7F, 0x97, 0xD4, + 0x2F, 0xE4, 0xFD, 0x7F, 0x70, 0xDE, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, + 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xF7, 0x7F, 0xC3, 0xDF, 0xE0, 0xC8, + 0xFB, 0x7F, 0x89, 0xD4, 0x2F, 0xE4, 0xFE, 0x7F, 0x52, 0xDE, 0x26, 0x40, + 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xF7, 0x7F, + 0xB5, 0xDF, 0xE0, 0xC8, 0xFB, 0x7F, 0x7B, 0xD4, 0x2F, 0xE4, 0xFE, 0x7F, + 0x2E, 0xDE, 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, + 0x97, 0xB8, 0xF7, 0x7F, 0xA7, 0xDF, 0xE0, 0xC8, 0xFB, 0x7F, 0x6D, 0xD4, + 0x2F, 0xE4, 0xFF, 0x7F, 0x3F, 0xDE, 0x10, 0x40, 0xB0, 0xBD, 0x84, 0x9C, + 0x85, 0x9B, 0x67, 0x40, 0xD8, 0xE1, 0x86, 0x98, 0xD9, 0xC8, 0x87, 0x98, + 0x88, 0x9A, 0xDC, 0xC8, 0x89, 0x98, 0x0F, 0x99, 0x83, 0x99, 0x0E, 0x99, + 0x25, 0x40, 0x03, 0x98, 0x00, 0x40, 0xB1, 0xDF, 0x38, 0xE4, 0x06, 0x40, + 0xA7, 0xBF, 0x36, 0xD5, 0x04, 0x40, 0xA7, 0xBF, 0x33, 0xD5, 0x18, 0x99, + 0x06, 0x40, 0xA5, 0xBF, 0x00, 0x40, 0x64, 0xDB, 0x06, 0x40, 0xA6, 0xBF, + 0x10, 0xD5, 0x17, 0x98, 0x98, 0xBF, 0x56, 0xD9, 0x69, 0xE4, 0x8B, 0xE4, + 0x00, 0x40, 0x81, 0xBC, 0x13, 0xD4, 0x0C, 0x40, 0x78, 0xE8, 0xE0, 0xC8, + 0xF8, 0x7F, 0x63, 0xD5, 0x2D, 0xA8, 0xF8, 0x7F, 0x5E, 0xDE, 0xE0, 0xC9, + 0x00, 0x40, 0x6B, 0xDB, 0x69, 0xE4, 0xE0, 0xCC, 0x04, 0xD4, 0x8B, 0xE4, + 0x00, 0x40, 0x81, 0xBC, 0xEE, 0xD5, 0x6C, 0xB8, 0xC1, 0xC6, 0xEB, 0xDE, + 0x26, 0x40, 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, + 0xF7, 0x7F, 0x5A, 0xDF, 0xE0, 0xC8, 0xFB, 0x7F, 0x20, 0xD4, 0x2F, 0xE4, + 0xFF, 0x7F, 0x0A, 0xDE, 0x18, 0x99, 0xFC, 0xC9, 0x02, 0xDB, 0x9C, 0xBF, + 0x4C, 0xDB, 0x65, 0xA8, 0x06, 0x40, 0xA7, 0xBF, 0x01, 0xD5, 0x45, 0xA8, + 0xA8, 0xE4, 0xC2, 0xDE, 0x26, 0x40, 0x00, 0x90, 0xE0, 0x28, 0x04, 0x40, + 0x80, 0xBD, 0xE0, 0x38, 0xFB, 0x7F, 0x09, 0xDE, 0x21, 0x40, 0x02, 0x98, + 0xE0, 0xC8, 0x2D, 0xD4, 0x00, 0xA8, 0x21, 0x40, 0x81, 0x98, 0xFB, 0x7F, + 0x00, 0xDE, 0x50, 0x40, 0xD8, 0xE1, 0x83, 0x98, 0x84, 0x96, 0xC4, 0xC8, + 0x85, 0x98, 0x25, 0x40, 0x03, 0x98, 0x96, 0xE4, 0xE8, 0x7F, 0xD8, 0xDF, + 0x68, 0xE4, 0xFF, 0xC8, 0x3C, 0xD5, 0x94, 0x93, 0xFE, 0x7F, 0x4B, 0xDE, + 0x68, 0xE4, 0xC1, 0xC6, 0xE0, 0xC9, 0xAB, 0xD8, 0x68, 0xE4, 0x69, 0xBA, + 0xC2, 0xC6, 0xA7, 0xDE, 0xDF, 0xC9, 0x98, 0x99, 0x83, 0x9A, 0x1C, 0x42, + 0xD8, 0xE1, 0x00, 0x40, 0xBD, 0xDF, 0x8D, 0x98, 0x17, 0x98, 0x0D, 0x96, + 0x68, 0xB8, 0xE1, 0xC8, 0x96, 0xDB, 0xC1, 0xC6, 0x98, 0xDE, 0x26, 0x40, + 0x00, 0x98, 0x21, 0x40, 0x00, 0xA9, 0xD7, 0xE1, 0x97, 0xB8, 0xF7, 0x7F, + 0x07, 0xDF, 0xE0, 0xC8, 0xC9, 0xD5, 0xFA, 0x7F, 0xCC, 0xDE, 0x67, 0xAA, + 0x82, 0xDE, 0xE0, 0xCC, 0x05, 0xD4, 0x8B, 0xE4, 0x00, 0x40, 0x81, 0xBC, + 0x01, 0xA6, 0x83, 0xD5, 0x6C, 0xE4, 0xC2, 0xC6, 0xFF, 0x7F, 0x7F, 0xDE, + 0x0E, 0x08, 0xC4, 0xCE, 0xC8, 0xE4, 0x88, 0xB8, 0xF7, 0x7F, 0xC7, 0xD6, + 0xFF, 0xAC, 0xF7, 0x7F, 0xC4, 0xDE, 0x26, 0x40, 0x00, 0x91, 0xE1, 0x28, + 0x04, 0x40, 0x80, 0xBD, 0xE1, 0x38, 0xFA, 0x7F, 0xAE, 0xDE, 0x26, 0x40, + 0x00, 0x99, 0xE9, 0x28, 0x04, 0x40, 0x80, 0xBD, 0xE9, 0x38, 0xFA, 0x7F, + 0xAD, 0xDE, 0x20, 0xB5, 0x3C, 0xB3, 0x5F, 0xB1, 0xF5, 0xB6, 0xC8, 0xE4, + 0x98, 0x99, 0x18, 0x90, 0x19, 0x91, 0x1A, 0x96, 0x1B, 0x92, 0x1C, 0x94, + 0x1D, 0x9B, 0x1E, 0x93, 0x1F, 0x9D, 0x03, 0xAA, 0x06, 0x40, 0x36, 0xBF, + 0x07, 0xD5, 0x06, 0x40, 0x35, 0xBF, 0x3E, 0xD5, 0x04, 0x40, 0x35, 0xBF, + 0x3B, 0xD5, 0x02, 0xAA, 0x80, 0xE4, 0x91, 0xE4, 0x00, 0xA8, 0x99, 0xB8, + 0x4B, 0xD7, 0x04, 0x38, 0x84, 0x9A, 0x85, 0x96, 0x86, 0x9B, 0x28, 0x40, + 0xD8, 0xE1, 0x87, 0x98, 0xDC, 0xC8, 0x88, 0x98, 0x83, 0x91, 0x90, 0xE4, + 0x8C, 0xE4, 0x01, 0x40, 0x7D, 0xDF, 0x48, 0xE4, 0x06, 0x40, 0x37, 0xBF, + 0x25, 0xD5, 0x04, 0x40, 0x37, 0xBF, 0x22, 0xD5, 0x24, 0xE4, 0x26, 0xB8, + 0x06, 0x40, 0x36, 0xBF, 0x2A, 0xD5, 0x00, 0xA8, 0x98, 0xE4, 0x83, 0x98, + 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0xDC, 0x7F, 0xBA, 0xDF, 0xE0, 0xC8, + 0x1E, 0xD4, 0x82, 0xE4, 0x89, 0x92, 0x82, 0xBF, 0x06, 0xD6, 0x30, 0xA9, + 0x08, 0x39, 0xC1, 0xC8, 0x89, 0x98, 0x82, 0xBF, 0xFB, 0xD7, 0x84, 0xBA, + 0x0D, 0x18, 0x84, 0xE4, 0x0B, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, + 0xC1, 0xC6, 0xC3, 0xDE, 0x00, 0x40, 0x21, 0xBC, 0xDB, 0xD4, 0x09, 0x98, + 0x84, 0xBA, 0x0D, 0x18, 0x84, 0xE4, 0x0B, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, + 0x40, 0xB4, 0x09, 0x98, 0xE2, 0xDE, 0x04, 0x28, 0x03, 0x40, 0x80, 0xBF, + 0x0E, 0xD5, 0x0B, 0x08, 0x28, 0xB8, 0xCF, 0xDE, 0x80, 0xE4, 0x00, 0x40, + 0x80, 0xBE, 0x91, 0xE4, 0x00, 0x60, 0x00, 0x40, 0x90, 0xBE, 0x08, 0xE4, + 0x19, 0xE4, 0x2D, 0xA8, 0xAA, 0xDE, 0x00, 0xA8, 0x98, 0xE4, 0x83, 0x98, + 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0xDB, 0x7F, 0x2D, 0xDF, 0xE0, 0xC8, + 0xE8, 0xD5, 0x01, 0xA8, 0x86, 0xBA, 0x0B, 0x18, 0x28, 0xB8, 0xB5, 0xDE, + 0x20, 0xB5, 0x0F, 0xB1, 0xF3, 0xB6, 0x38, 0xE4, 0x09, 0xE4, 0x15, 0x98, + 0x03, 0x38, 0x23, 0xE4, 0xC1, 0xC2, 0x99, 0xB8, 0x37, 0xD7, 0x2B, 0xA8, + 0x02, 0x38, 0x23, 0xE4, 0xC2, 0xC2, 0x34, 0xA1, 0xD7, 0xE1, 0x17, 0xB8, + 0xE9, 0xC0, 0x22, 0xDB, 0xDF, 0xC1, 0x80, 0xE4, 0x0A, 0xA9, 0xDA, 0x7F, + 0xB6, 0xDF, 0x03, 0x40, 0x80, 0xB8, 0x01, 0x38, 0x80, 0xE4, 0x0A, 0xA9, + 0xDA, 0x7F, 0x07, 0xDF, 0x08, 0xE4, 0xE9, 0xC8, 0xF1, 0xD8, 0xDF, 0xC1, + 0x03, 0x40, 0x00, 0xB8, 0x01, 0x30, 0x04, 0xDE, 0x01, 0x28, 0xC1, 0xC1, + 0x02, 0x38, 0xC1, 0xC2, 0x34, 0xA8, 0xD7, 0xE1, 0x87, 0xB8, 0x81, 0xBF, + 0xF7, 0xDC, 0x23, 0xBA, 0x82, 0xE4, 0x0D, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x30, 0xA8, 0x02, 0x38, 0xC1, 0xC2, 0x03, 0x40, 0x00, 0xB8, 0x02, 0x30, + 0xC1, 0xC2, 0x23, 0xBA, 0x82, 0xE4, 0x0D, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x60, 0xE0, 0x2D, 0xA8, 0x02, 0x38, 0xC1, 0xC2, 0xC8, 0xDE, 0x20, 0xB5, + 0x0F, 0xB1, 0xFC, 0xB6, 0x28, 0xE4, 0x89, 0xE4, 0x0C, 0x99, 0x0D, 0x91, + 0x00, 0xA0, 0x00, 0x40, 0xEE, 0x63, 0x0C, 0xA3, 0x03, 0x10, 0x83, 0x91, + 0x0C, 0x40, 0xAF, 0xDF, 0xFF, 0xC8, 0x03, 0xD5, 0x04, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x03, 0x09, 0xE0, 0xC9, 0xFA, 0xD5, 0x02, 0x19, 0x04, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x03, 0xB1, 0xFD, 0xB6, 0x08, 0xE4, + 0x89, 0xE4, 0x00, 0xA9, 0x00, 0x40, 0xEE, 0x63, 0x0C, 0xA1, 0x01, 0x19, + 0x0C, 0x40, 0xE0, 0xDF, 0xFF, 0xC8, 0x03, 0xD5, 0x03, 0xB6, 0x03, 0xB0, + 0x40, 0xB4, 0x01, 0x09, 0xE0, 0xC9, 0xFA, 0xD5, 0x00, 0x19, 0x03, 0xB6, + 0x03, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xFA, 0xB6, + 0x94, 0x98, 0xF9, 0xE4, 0x49, 0x0C, 0x48, 0x08, 0x00, 0xA9, 0x8C, 0xBF, + 0x5D, 0xD9, 0x3F, 0xE4, 0x01, 0x40, 0x34, 0xB8, 0x85, 0x93, 0xDF, 0xCC, + 0x8C, 0xE4, 0x0A, 0xC8, 0xB8, 0xE4, 0xB3, 0xB8, 0x14, 0x9E, 0x01, 0x40, + 0xE4, 0xB8, 0x83, 0x9E, 0x68, 0xE4, 0x6E, 0xB8, 0x0B, 0x09, 0xC1, 0xC9, + 0x06, 0x00, 0x84, 0x90, 0x80, 0xE4, 0xD9, 0x7F, 0x4A, 0xDF, 0xD8, 0xE4, + 0xE0, 0xC8, 0x49, 0xD4, 0x14, 0x98, 0x9F, 0xE4, 0x0A, 0x40, 0x1C, 0xDF, + 0x88, 0xB8, 0x3D, 0xD7, 0xC1, 0xCD, 0x00, 0xA4, 0xA4, 0xE4, 0x83, 0x9E, + 0x05, 0x93, 0x03, 0x08, 0xC4, 0xC3, 0x98, 0xE4, 0xFF, 0x4F, 0x9F, 0xBC, + 0x9A, 0xB8, 0x18, 0xE4, 0x41, 0xC1, 0x89, 0xE4, 0x41, 0xC8, 0x18, 0xB8, + 0xA1, 0xE4, 0x41, 0xCA, 0x03, 0x92, 0x02, 0x08, 0x28, 0xE4, 0xFF, 0x4F, + 0x2F, 0xBC, 0xFF, 0x4F, 0x9F, 0xBC, 0x29, 0xBA, 0x24, 0xB8, 0x42, 0xE4, + 0x40, 0xC4, 0x41, 0xC8, 0xFF, 0x4F, 0x1F, 0xBC, 0x81, 0xBA, 0x84, 0xB8, + 0x48, 0xE4, 0x40, 0xC4, 0x03, 0x99, 0x99, 0x38, 0x89, 0x32, 0xC4, 0xC9, + 0x83, 0x99, 0x3B, 0xBF, 0xDA, 0xDD, 0x6C, 0xE4, 0x0A, 0xC6, 0x6E, 0xB8, + 0x06, 0x08, 0xE0, 0xC8, 0x0C, 0xD4, 0xDC, 0xC6, 0x6E, 0xBF, 0x07, 0xDD, + 0x06, 0x08, 0xE0, 0xC8, 0x04, 0xD4, 0xDF, 0xCC, 0xDC, 0xC6, 0x6E, 0xBF, + 0xF9, 0xDC, 0x14, 0x90, 0x40, 0x1C, 0x9D, 0xE4, 0x89, 0xE4, 0x06, 0xB6, + 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x00, 0xA4, 0xA4, 0xE4, 0x03, 0x08, + 0xC4, 0xC3, 0x98, 0xE4, 0xFF, 0x4F, 0x9F, 0xBC, 0x29, 0xE4, 0x2D, 0xE6, + 0x92, 0xE4, 0x9A, 0xB8, 0x18, 0xE4, 0x41, 0xC1, 0x21, 0xE4, 0x2D, 0xE6, + 0x12, 0xE4, 0x89, 0xE4, 0x41, 0xC8, 0x18, 0xB8, 0xA1, 0xE4, 0x41, 0xCA, + 0x03, 0x92, 0x02, 0x08, 0x28, 0xE4, 0xFF, 0x4F, 0x2F, 0xBC, 0xFF, 0x4F, + 0x9F, 0xBC, 0x29, 0xBA, 0x24, 0xB8, 0x42, 0xE4, 0x40, 0xC4, 0x41, 0xC8, + 0xFF, 0x4F, 0x1F, 0xBC, 0x81, 0xBA, 0x84, 0xB8, 0x48, 0xE4, 0x40, 0xC4, + 0x03, 0x99, 0x99, 0x38, 0x89, 0x32, 0xC4, 0xC9, 0x83, 0x99, 0x3B, 0xBF, + 0xD4, 0xDD, 0x04, 0x90, 0xE0, 0xC0, 0x86, 0xD4, 0xDC, 0xC6, 0x6E, 0xBF, + 0x07, 0xDD, 0x06, 0x08, 0xE0, 0xC8, 0x04, 0xD4, 0xDF, 0xCC, 0xDC, 0xC6, + 0x6E, 0xBF, 0xF9, 0xDC, 0x14, 0x92, 0x42, 0x1C, 0xFF, 0x7F, 0x78, 0xDE, + 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, 0xE7, 0xB6, 0xA7, 0x98, 0xA8, 0x99, + 0x2D, 0x91, 0x00, 0xA0, 0x89, 0x90, 0x28, 0x9C, 0x29, 0x9D, 0x04, 0x40, + 0x08, 0x00, 0xE0, 0xC0, 0x01, 0x40, 0xCE, 0xD4, 0xE0, 0xCD, 0x01, 0x40, + 0xDF, 0xD9, 0x09, 0x98, 0x01, 0x18, 0x8D, 0xE4, 0xFC, 0x5F, 0x00, 0x40, + 0x80, 0xBC, 0xFC, 0x5F, 0x00, 0x40, 0x80, 0xBF, 0x01, 0x40, 0xE2, 0xD5, + 0x00, 0xA8, 0x98, 0xE4, 0x83, 0x98, 0x84, 0x99, 0x8C, 0xE4, 0x9D, 0xE4, + 0xDB, 0x7F, 0x2B, 0xDF, 0xE0, 0xC8, 0x13, 0xD4, 0x01, 0xA8, 0x2C, 0x99, + 0x09, 0x18, 0x00, 0x40, 0x44, 0x63, 0x04, 0xA6, 0x2E, 0x90, 0xE0, 0xC0, + 0x04, 0xD5, 0x00, 0x40, 0x44, 0x63, 0x05, 0xA8, 0x00, 0x18, 0x06, 0xE4, + 0x80, 0xE4, 0x19, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, 0x60, 0x40, + 0xD8, 0xE1, 0x84, 0x98, 0xDC, 0xC8, 0x85, 0x98, 0x83, 0x9D, 0x9C, 0xE4, + 0x27, 0x98, 0x0A, 0x40, 0x74, 0xDF, 0x8A, 0x98, 0x4D, 0xE4, 0x51, 0xC4, + 0x7F, 0x40, 0x4F, 0xBC, 0x01, 0x40, 0xD4, 0xD4, 0x17, 0x96, 0x18, 0x90, + 0x06, 0xB8, 0x40, 0xE4, 0x43, 0x40, 0x42, 0xB8, 0x02, 0x40, 0x40, 0xBF, + 0x02, 0x40, 0x6E, 0xDB, 0x00, 0xA8, 0x84, 0xBA, 0x2D, 0xE4, 0xA2, 0xC2, + 0x41, 0x40, 0x02, 0xB8, 0x8C, 0xE4, 0x81, 0xC8, 0x28, 0xBD, 0x82, 0xE4, + 0xDD, 0x7F, 0x01, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0x22, 0xB8, 0x04, 0x40, + 0xFD, 0xD7, 0xE0, 0xE4, 0xF1, 0xE4, 0x84, 0x7F, 0x00, 0x40, 0xF0, 0xB8, + 0xBC, 0x7F, 0x4D, 0xB8, 0x01, 0xA8, 0x8B, 0x98, 0x00, 0xA8, 0xFE, 0x4F, + 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x8E, 0xE4, 0x9F, 0xE4, + 0xDC, 0x7F, 0xD1, 0xDF, 0xDB, 0x58, 0x36, 0x74, 0x01, 0xA0, 0xF4, 0x4F, + 0x7A, 0x68, 0x07, 0xA1, 0x83, 0x90, 0x84, 0x91, 0xDC, 0x7F, 0xF3, 0xDF, + 0xD8, 0x62, 0x8B, 0x4C, 0x03, 0xA0, 0xF1, 0x4F, 0xA2, 0x68, 0x08, 0xA1, + 0x83, 0x90, 0x84, 0x91, 0xDA, 0x7F, 0xFE, 0xDF, 0x28, 0xE4, 0x39, 0xE4, + 0x84, 0xE4, 0xDC, 0x7F, 0xD0, 0xDF, 0x27, 0x54, 0x9F, 0x77, 0x0B, 0xA0, + 0xF4, 0x4F, 0x41, 0x74, 0x03, 0xA1, 0x83, 0x90, 0x84, 0x91, 0xDC, 0x7F, + 0xDA, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x82, 0xE4, 0x93, 0xE4, 0xDA, 0x7F, + 0xE9, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, 0xDF, 0x7F, 0xBA, 0xDF, 0x91, 0x98, + 0x00, 0xA8, 0x98, 0xE4, 0x83, 0x98, 0x84, 0x99, 0x8A, 0xE4, 0x9B, 0xE4, + 0xDA, 0x7F, 0x40, 0xDF, 0x88, 0xB8, 0x0C, 0xD6, 0x11, 0x98, 0xDC, 0x7F, + 0xAE, 0xDF, 0x83, 0x9A, 0x84, 0x9B, 0xD9, 0x7F, 0x47, 0xDF, 0xE0, 0xC8, + 0x03, 0xD5, 0x11, 0x99, 0xDF, 0xC9, 0x91, 0x99, 0x01, 0xA0, 0x8F, 0x90, + 0x11, 0x91, 0x01, 0x40, 0x16, 0xBF, 0x11, 0xDC, 0x81, 0xE4, 0x0E, 0xC8, + 0x00, 0x40, 0xBE, 0x62, 0x88, 0xB8, 0x18, 0x09, 0x08, 0x08, 0x83, 0x9C, + 0x84, 0x9D, 0xD9, 0x7F, 0xC2, 0xDF, 0xE0, 0xC8, 0x02, 0xDB, 0xDF, 0xC1, + 0x91, 0x91, 0x00, 0xA8, 0x8F, 0x98, 0x16, 0xE4, 0x14, 0xBA, 0xDF, 0xC1, + 0xE0, 0xC1, 0x03, 0x40, 0xF2, 0xD9, 0x00, 0xA9, 0x96, 0x99, 0x8D, 0x91, + 0x11, 0x91, 0xE0, 0xC1, 0x03, 0x40, 0xE1, 0xD9, 0x00, 0xA8, 0x95, 0x98, + 0x8C, 0x91, 0x0D, 0x99, 0x91, 0xB8, 0x8D, 0x99, 0x2A, 0x99, 0xE9, 0xC9, + 0x02, 0xDD, 0x00, 0xA0, 0xAA, 0x90, 0x01, 0xA2, 0x2A, 0x91, 0xE5, 0xC1, + 0x03, 0xDB, 0xDC, 0xC1, 0xAA, 0x91, 0x00, 0xA2, 0x01, 0xA8, 0x8E, 0x98, + 0xFF, 0xA9, 0x94, 0x99, 0x92, 0x99, 0x2A, 0x90, 0xE5, 0xC0, 0x07, 0xDC, + 0x80, 0xE4, 0x0A, 0xC8, 0x00, 0x40, 0xBC, 0x62, 0x84, 0xB8, 0x08, 0x08, + 0x88, 0xE0, 0x04, 0xA1, 0x00, 0xA9, 0x09, 0xE4, 0x01, 0x40, 0x47, 0xBF, + 0x0A, 0xDD, 0x80, 0xE4, 0xC1, 0xC8, 0x08, 0xE4, 0x98, 0xE4, 0x06, 0xC1, + 0x81, 0xE4, 0x01, 0x40, 0x84, 0xB8, 0x84, 0xBF, 0xF6, 0xDD, 0x27, 0x90, + 0x04, 0x40, 0x10, 0x19, 0x80, 0xE4, 0x05, 0x40, 0xE9, 0xDF, 0x86, 0x98, + 0x04, 0x40, 0x00, 0x18, 0x68, 0xE4, 0x14, 0x91, 0xEE, 0xC1, 0x01, 0x40, + 0x21, 0xDC, 0xE0, 0xC2, 0x01, 0x40, 0x1E, 0xD5, 0xEC, 0xE4, 0xFD, 0xE4, + 0x11, 0x98, 0x90, 0x98, 0x93, 0x91, 0x02, 0xA2, 0xE0, 0xC8, 0x01, 0x40, + 0xE9, 0xDB, 0x00, 0x40, 0x8F, 0xBC, 0x0E, 0xC8, 0x00, 0x40, 0xBE, 0x62, + 0x88, 0xB8, 0x08, 0x0A, 0x18, 0x0B, 0x11, 0x91, 0x10, 0xC1, 0x81, 0xE4, + 0x01, 0x40, 0x80, 0xBC, 0x10, 0xD5, 0x00, 0x40, 0x1F, 0xBC, 0x00, 0x40, + 0xCB, 0x62, 0x00, 0xA8, 0x98, 0x09, 0x88, 0x08, 0x83, 0x98, 0x84, 0x99, + 0x8C, 0xE4, 0x9D, 0xE4, 0xDD, 0x7F, 0xA4, 0xDF, 0xC8, 0xE4, 0xD9, 0xE4, + 0x03, 0xA2, 0xE0, 0xC1, 0x16, 0xD5, 0x00, 0x40, 0xCB, 0x62, 0x00, 0xA0, + 0x81, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x0B, 0xD5, 0xC1, 0xC2, 0x00, 0x08, + 0x10, 0x09, 0x83, 0x98, 0x84, 0x99, 0x8A, 0xE4, 0x9B, 0xE4, 0xDC, 0x7F, + 0x1A, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, 0x04, 0xC1, 0xC8, 0xC0, 0xE0, 0xC1, + 0xED, 0xD4, 0x83, 0x9A, 0x84, 0x9B, 0x8C, 0xE4, 0x9D, 0xE4, 0xDD, 0x7F, + 0x83, 0xDF, 0xC8, 0xE4, 0xD9, 0xE4, 0x0F, 0x99, 0xE0, 0xC9, 0x24, 0xD5, + 0x00, 0xA8, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, + 0x8C, 0xE4, 0x9D, 0xE4, 0xD9, 0x7F, 0x78, 0xDF, 0x88, 0xB8, 0x18, 0xD6, + 0x14, 0x90, 0xE0, 0xC0, 0x15, 0xDB, 0x12, 0x91, 0xE0, 0xC1, 0x00, 0x40, + 0xBA, 0xDB, 0x94, 0x91, 0x11, 0x98, 0xDF, 0xC8, 0x91, 0x98, 0x00, 0xA8, + 0x09, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x8C, 0xE4, + 0x9D, 0xE4, 0xDB, 0x7F, 0xE8, 0xDF, 0xC8, 0xE4, 0xD9, 0xE4, 0xC1, 0xC2, + 0x82, 0xE4, 0xDB, 0x7F, 0xCE, 0xDF, 0x83, 0x9C, 0x84, 0x9D, 0xDB, 0x7F, + 0xDE, 0xDF, 0x00, 0xA0, 0x07, 0x50, 0x00, 0x40, 0x00, 0xA1, 0x83, 0x90, + 0x84, 0x91, 0xD9, 0x7F, 0xEB, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, 0x30, 0x7F, + 0x00, 0x40, 0xB0, 0xB8, 0x14, 0x99, 0xE0, 0xC9, 0x03, 0x40, 0x4F, 0xD4, + 0x88, 0x99, 0x87, 0x99, 0x00, 0xA8, 0x05, 0x50, 0x00, 0x40, 0x00, 0xA9, + 0x83, 0x98, 0x84, 0x99, 0x8C, 0xE4, 0x9D, 0xE4, 0xDB, 0x7F, 0x95, 0xDF, + 0x08, 0xE4, 0x19, 0xE4, 0x83, 0x9A, 0x84, 0x9B, 0xD8, 0x7F, 0xD5, 0xDF, + 0xE0, 0xC8, 0x00, 0x40, 0x70, 0xDB, 0x31, 0xA8, 0x06, 0x91, 0x01, 0x38, + 0x61, 0xE4, 0xC1, 0xC6, 0x11, 0x98, 0xC1, 0xC8, 0x91, 0x98, 0x27, 0x98, + 0x07, 0x99, 0x05, 0x40, 0x6E, 0xDF, 0x08, 0x99, 0xE0, 0xC9, 0x00, 0x40, + 0xE1, 0xD5, 0x09, 0x90, 0xE0, 0xC0, 0x06, 0xD5, 0x09, 0xBF, 0x04, 0xD5, + 0x27, 0x98, 0x90, 0xE4, 0x05, 0x40, 0x61, 0xDF, 0x27, 0x98, 0x08, 0x99, + 0x05, 0x40, 0x5D, 0xDF, 0x00, 0x40, 0xD2, 0xDE, 0x98, 0xE4, 0x04, 0x40, + 0x18, 0x08, 0x10, 0x18, 0x04, 0x40, 0x19, 0x09, 0x01, 0xA8, 0xA6, 0xC8, + 0x20, 0x18, 0x27, 0x98, 0x90, 0xE4, 0x05, 0x40, 0x4E, 0xDF, 0x09, 0x90, + 0x27, 0x99, 0x04, 0x40, 0x09, 0x10, 0xE0, 0xCD, 0xFE, 0x7F, 0x21, 0xDA, + 0x01, 0xA8, 0x01, 0x18, 0xFF, 0x5F, 0xFF, 0x7F, 0xDF, 0xBC, 0x8D, 0xE4, + 0xFC, 0x5F, 0x00, 0x40, 0x80, 0xBC, 0xFC, 0x5F, 0x00, 0x40, 0x80, 0xBF, + 0xFE, 0x7F, 0x1E, 0xD4, 0x70, 0x42, 0x0F, 0xA8, 0x2C, 0x99, 0x09, 0x18, + 0xE0, 0xCC, 0x11, 0xD5, 0x00, 0x40, 0x54, 0x63, 0x0B, 0xA6, 0x2E, 0x90, + 0xE0, 0xC0, 0xFE, 0x7F, 0x28, 0xD5, 0x36, 0x28, 0x96, 0xE4, 0xC8, 0xC9, + 0xE0, 0xC8, 0x01, 0xD4, 0xDB, 0xC9, 0x2E, 0x91, 0x01, 0x19, 0xFE, 0x7F, + 0x1E, 0xDE, 0x8D, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0x00, 0x40, + 0x54, 0x63, 0x0F, 0xA6, 0xEA, 0xD5, 0xE6, 0xDE, 0xEC, 0xE4, 0xFD, 0xE4, + 0x03, 0x40, 0xFF, 0x7F, 0xFF, 0xBC, 0xFC, 0x4F, 0x00, 0x40, 0xF0, 0xBD, + 0xC0, 0x7F, 0x41, 0xB8, 0x00, 0xA1, 0x8B, 0x91, 0x17, 0x96, 0xFE, 0x7F, + 0x41, 0xDE, 0x8A, 0xE4, 0x9B, 0xE4, 0x00, 0x60, 0x00, 0x40, 0x90, 0xBE, + 0x83, 0x90, 0x84, 0x91, 0xD8, 0x7F, 0x59, 0xDF, 0xE0, 0xC8, 0x00, 0x40, + 0xD6, 0xD8, 0x06, 0x96, 0xCE, 0xE4, 0xDF, 0xE4, 0x10, 0x91, 0x91, 0x91, + 0x13, 0x98, 0x94, 0x98, 0x18, 0x98, 0xE0, 0xC8, 0x00, 0x40, 0xFE, 0xD9, + 0x11, 0x99, 0xEE, 0xC9, 0x00, 0x40, 0xFA, 0xD8, 0x89, 0xE4, 0x0E, 0xC8, + 0x00, 0x40, 0xBE, 0x62, 0x88, 0xB8, 0x08, 0x0A, 0x18, 0x0B, 0x2B, 0x90, + 0x00, 0xB8, 0x00, 0x40, 0xA3, 0xD7, 0x01, 0xA4, 0x15, 0xDE, 0x00, 0xA8, + 0x09, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x80, 0xE4, + 0x91, 0xE4, 0xDB, 0x7F, 0x16, 0xDF, 0xC8, 0xE4, 0xD9, 0xE4, 0x00, 0xA0, + 0x10, 0xE4, 0x83, 0x90, 0x84, 0x91, 0xD8, 0x7F, 0xE8, 0xDF, 0xE0, 0xC8, + 0x45, 0xD5, 0xC1, 0xC4, 0x83, 0x9A, 0x84, 0x9B, 0x8C, 0xE4, 0x9D, 0xE4, + 0xDC, 0x7F, 0x7A, 0xDF, 0xDD, 0x7F, 0xED, 0xDF, 0x28, 0xE4, 0xDA, 0x7F, + 0xEC, 0xDF, 0x83, 0x9A, 0x84, 0x9B, 0xDA, 0x7F, 0xFC, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x8C, 0xE4, 0x9D, 0xE4, 0xDA, 0x7F, 0xCA, 0xDF, 0x08, 0xE4, + 0x19, 0xE4, 0x82, 0xE4, 0x03, 0x40, 0x80, 0xB8, 0x06, 0x38, 0xC1, 0xC6, + 0x14, 0x99, 0x49, 0xBF, 0xCC, 0xD4, 0x83, 0x90, 0x84, 0x91, 0x80, 0xE4, + 0x91, 0xE4, 0xD8, 0x7F, 0xFB, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0x83, 0x98, + 0x84, 0x99, 0x8A, 0xE4, 0x9B, 0xE4, 0xD8, 0x7F, 0x57, 0xDF, 0x88, 0xB8, + 0x0B, 0xD7, 0x83, 0x90, 0x84, 0x91, 0x8A, 0xE4, 0x9B, 0xE4, 0xD8, 0x7F, + 0xB0, 0xDF, 0xE0, 0xC8, 0x0D, 0xD4, 0x00, 0x40, 0x21, 0xBC, 0x0A, 0xD5, + 0xDF, 0xC6, 0x06, 0x20, 0x03, 0x40, 0x09, 0xBF, 0x24, 0xD5, 0x96, 0xE4, + 0xC1, 0xC6, 0x09, 0x28, 0xC1, 0xC8, 0x09, 0x38, 0x27, 0x98, 0x0A, 0x99, + 0x04, 0x40, 0x85, 0xDF, 0x00, 0xA8, 0x06, 0x38, 0x11, 0x91, 0xC1, 0xC1, + 0x2C, 0x98, 0x08, 0x11, 0x2E, 0x99, 0xE0, 0xC9, 0x01, 0xD5, 0x09, 0x16, + 0x06, 0x90, 0x80, 0xE4, 0x19, 0xB6, 0x5F, 0xB0, 0xFC, 0xB2, 0x40, 0xB4, + 0x00, 0xA8, 0x84, 0xBA, 0x2C, 0xE4, 0xA2, 0xC2, 0xFD, 0x7F, 0x95, 0xDE, + 0xDF, 0xC6, 0x06, 0x28, 0x03, 0x40, 0x89, 0xBF, 0xDC, 0xD4, 0x06, 0x91, + 0x61, 0xBF, 0xF8, 0xD4, 0x11, 0x99, 0xC1, 0xC9, 0x91, 0x99, 0x30, 0xA8, + 0x06, 0x90, 0x00, 0x38, 0xD2, 0xDE, 0x00, 0xA8, 0x8E, 0x98, 0x2B, 0x99, + 0xE0, 0xC9, 0x03, 0x40, 0x65, 0xDB, 0x2B, 0x94, 0x92, 0x94, 0x94, 0x94, + 0xFE, 0x7F, 0x1F, 0xDE, 0x00, 0xA1, 0x8E, 0x91, 0x2B, 0x98, 0x11, 0x99, + 0x89, 0xB8, 0x48, 0xE4, 0xC1, 0xC4, 0x94, 0x94, 0x92, 0x98, 0xE0, 0xC4, + 0xFE, 0x7F, 0x13, 0xD8, 0x01, 0xA4, 0xFE, 0x7F, 0x10, 0xDE, 0x12, 0xA4, + 0x00, 0xA1, 0xAB, 0x91, 0xFE, 0x7F, 0x0B, 0xDE, 0x14, 0x91, 0xE0, 0xC1, + 0xFF, 0x7F, 0x59, 0xD8, 0x00, 0xA8, 0x88, 0x98, 0x87, 0x98, 0x11, 0xD9, + 0x00, 0xA8, 0x05, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, + 0x8A, 0xE4, 0x9B, 0xE4, 0xDA, 0x7F, 0x6D, 0xDF, 0x83, 0x9C, 0x84, 0x9D, + 0xD7, 0x7F, 0x2A, 0xDF, 0x88, 0xB8, 0xFE, 0x7F, 0xAE, 0xD7, 0x2B, 0x90, + 0x70, 0xE0, 0x91, 0x90, 0xFE, 0x7F, 0xB1, 0xDE, 0x11, 0x93, 0x63, 0xE0, + 0xE0, 0xC3, 0xFE, 0x7F, 0x50, 0xD5, 0x83, 0xE4, 0x00, 0x40, 0x8F, 0xBC, + 0x0E, 0xC8, 0x00, 0x40, 0xBE, 0x62, 0x88, 0xB8, 0x18, 0x09, 0x08, 0x08, + 0x83, 0x9C, 0x84, 0x9D, 0xDA, 0x7F, 0x4F, 0xDF, 0xC8, 0xE4, 0xD9, 0xE4, + 0x13, 0xE4, 0x10, 0xC1, 0xFE, 0x7F, 0x3D, 0xD5, 0x00, 0x40, 0xCB, 0x62, + 0x00, 0xA0, 0x81, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x09, 0xD5, 0xC1, 0xC2, + 0x00, 0x08, 0x10, 0x09, 0x83, 0x9C, 0x84, 0x9D, 0xDA, 0x7F, 0x3B, 0xDF, + 0xC8, 0xE4, 0xD9, 0xE4, 0x04, 0xC1, 0xC8, 0xC0, 0xE0, 0xC1, 0xEF, 0xD4, + 0xFE, 0x7F, 0x27, 0xDE, 0x16, 0x92, 0x15, 0x93, 0x00, 0xA1, 0x88, 0x91, + 0x89, 0x91, 0x0E, 0x99, 0xE0, 0xC9, 0x21, 0xD5, 0x2A, 0x90, 0xE1, 0xC0, + 0x02, 0x40, 0xE3, 0xDB, 0x14, 0x91, 0xDF, 0xC1, 0x15, 0x93, 0x31, 0xBA, + 0x15, 0x98, 0x81, 0xBF, 0x07, 0xDA, 0x18, 0xBA, 0x0C, 0x99, 0x91, 0xB8, + 0x8C, 0x99, 0x81, 0xB8, 0x95, 0x98, 0x08, 0x93, 0x14, 0x94, 0xE0, 0xC4, + 0x02, 0x40, 0xDD, 0xD9, 0x16, 0x90, 0x04, 0xB8, 0x96, 0x90, 0x0D, 0x91, + 0x14, 0xB8, 0x8D, 0x91, 0x27, 0x98, 0x01, 0xA9, 0x04, 0x40, 0xD6, 0xDF, + 0x88, 0x98, 0xE0, 0xC2, 0x0E, 0xDB, 0x0D, 0x98, 0xE0, 0xC8, 0x0B, 0xDB, + 0x48, 0xE4, 0x82, 0xBF, 0x01, 0xDB, 0x42, 0xE4, 0x16, 0x99, 0x94, 0xBA, + 0x96, 0x99, 0x24, 0xBA, 0x0D, 0x90, 0x04, 0xBA, 0x8D, 0x90, 0x15, 0x91, + 0xE0, 0xC1, 0x1C, 0xDB, 0x0E, 0x98, 0xE0, 0xC8, 0x01, 0x40, 0xD7, 0xD5, + 0xE0, 0xC3, 0x12, 0xDB, 0x83, 0x93, 0x27, 0x98, 0x08, 0x99, 0x05, 0x40, + 0x65, 0xDF, 0x88, 0x98, 0x0A, 0x99, 0x83, 0x99, 0x27, 0x98, 0x08, 0x99, + 0x04, 0x40, 0xBD, 0xDF, 0x08, 0xE4, 0x27, 0x98, 0x0A, 0x99, 0x03, 0x40, + 0xA2, 0xDF, 0x8A, 0x90, 0x15, 0x91, 0x13, 0xBA, 0x02, 0x40, 0x07, 0xD4, + 0x27, 0x98, 0x01, 0xA9, 0x04, 0x40, 0xA2, 0xDF, 0x87, 0x98, 0x0C, 0x91, + 0xE0, 0xC1, 0x06, 0xDB, 0x83, 0x91, 0x27, 0x98, 0x07, 0x99, 0x05, 0x40, + 0x47, 0xDF, 0x87, 0x98, 0x00, 0xA0, 0x2A, 0x98, 0xE1, 0xC8, 0x01, 0x40, + 0xDC, 0xDB, 0x0C, 0x91, 0xE0, 0xC1, 0x01, 0x40, 0x20, 0xD4, 0x0D, 0x94, + 0xC1, 0xC4, 0x01, 0x40, 0x4F, 0xBC, 0x03, 0xD5, 0x20, 0xA8, 0x84, 0xBA, + 0x48, 0xE4, 0xE4, 0xC4, 0x00, 0x40, 0xF7, 0xDB, 0xDC, 0xC4, 0x16, 0x91, + 0x14, 0xB8, 0x96, 0x91, 0x24, 0xB8, 0x0D, 0x98, 0x84, 0xB8, 0x8D, 0x98, + 0x16, 0x98, 0xE0, 0xC8, 0x06, 0xDB, 0x83, 0x98, 0x27, 0x98, 0x0A, 0x99, + 0x05, 0x40, 0x73, 0xDF, 0x8A, 0x98, 0x0D, 0x99, 0xE0, 0xC9, 0x06, 0xDB, + 0x83, 0x99, 0x27, 0x98, 0x07, 0x99, 0x05, 0x40, 0x6A, 0xDF, 0x87, 0x98, + 0x0F, 0x91, 0xE0, 0xC1, 0x01, 0x40, 0x02, 0xD4, 0x14, 0x98, 0xE0, 0xC8, + 0x01, 0x40, 0x92, 0xDB, 0x01, 0xA4, 0x0E, 0x99, 0xE0, 0xC9, 0x00, 0x40, + 0x70, 0xD5, 0xE0, 0xC2, 0x06, 0xDB, 0x83, 0x92, 0x27, 0x98, 0x08, 0x99, + 0x05, 0x40, 0x55, 0xDF, 0x88, 0x98, 0x08, 0x91, 0x89, 0x91, 0xE0, 0xC0, + 0x00, 0x40, 0x9B, 0xD4, 0x01, 0xA4, 0x0A, 0x98, 0x07, 0x99, 0xFB, 0x7F, + 0x5D, 0xDF, 0x28, 0xE4, 0x03, 0x40, 0x20, 0xB8, 0x0A, 0x98, 0x09, 0x99, + 0x05, 0x40, 0x9A, 0xDF, 0x18, 0xE4, 0x08, 0x98, 0x83, 0x98, 0x27, 0x98, + 0x07, 0x99, 0x05, 0x40, 0xB7, 0xDF, 0x08, 0xE4, 0x38, 0x08, 0x01, 0xA3, + 0xE0, 0xC8, 0x00, 0x40, 0x99, 0xD5, 0x27, 0x98, 0x90, 0xE4, 0x03, 0x40, + 0x2A, 0xDF, 0xE0, 0xC3, 0x08, 0xD4, 0x2A, 0x99, 0xE0, 0xC9, 0x05, 0xD4, + 0x8C, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x01, 0x40, 0xAC, 0xD5, 0xE0, 0xC1, + 0x01, 0x40, 0x89, 0xD9, 0x08, 0xD4, 0x2A, 0x90, 0xE0, 0xC0, 0x05, 0xD4, + 0x8C, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x01, 0x40, 0x80, 0xD5, 0xE0, 0xC3, + 0x01, 0x40, 0x95, 0xD8, 0x06, 0x32, 0xC1, 0xC6, 0x14, 0x91, 0x41, 0xBF, + 0x35, 0xD5, 0x0A, 0xA0, 0x83, 0x90, 0x00, 0xA1, 0x84, 0x91, 0x27, 0x98, + 0x0A, 0x99, 0x03, 0x40, 0x13, 0xDF, 0x8A, 0x98, 0x09, 0x98, 0x08, 0x99, + 0x89, 0xBF, 0x00, 0x40, 0x70, 0xD5, 0x83, 0x90, 0x84, 0x91, 0x27, 0x98, + 0x09, 0x99, 0x03, 0x40, 0x07, 0xDF, 0x89, 0x98, 0x83, 0x90, 0x84, 0x91, + 0x27, 0x98, 0x08, 0x99, 0x03, 0x40, 0x00, 0xDF, 0x88, 0x98, 0xC1, 0xC4, + 0xA8, 0xDE, 0x0A, 0xA8, 0x83, 0x98, 0x00, 0xA8, 0x84, 0x98, 0x27, 0x98, + 0x0A, 0x99, 0x02, 0x40, 0xF5, 0xDF, 0x8A, 0x98, 0xC1, 0xC4, 0x06, 0xE4, + 0xC1, 0xC6, 0x0A, 0x98, 0x07, 0x99, 0xFA, 0x7F, 0xF9, 0xDF, 0x28, 0xE4, + 0x03, 0x40, 0x20, 0xB8, 0x00, 0x32, 0x14, 0x90, 0x40, 0xBF, 0xE9, 0xD9, + 0x01, 0xA8, 0x83, 0x98, 0x27, 0x98, 0x0A, 0x99, 0x04, 0x40, 0xD9, 0xDF, + 0x8A, 0x98, 0x07, 0x99, 0x05, 0x40, 0x2C, 0xDF, 0xE0, 0xC8, 0x01, 0x40, + 0xB6, 0xDB, 0xDF, 0xC6, 0x06, 0x21, 0x03, 0x40, 0x19, 0xBF, 0x0C, 0xD5, + 0x96, 0xE4, 0xC1, 0xC6, 0x09, 0x28, 0xC1, 0xC8, 0x09, 0x38, 0xFD, 0x7F, + 0x4C, 0xDE, 0xDF, 0xC6, 0x06, 0x29, 0x03, 0x40, 0x99, 0xBF, 0xF4, 0xD4, + 0x06, 0x98, 0x68, 0xBF, 0xF8, 0xD4, 0x11, 0x90, 0xC1, 0xC0, 0x91, 0x90, + 0x31, 0xA8, 0x06, 0x91, 0x01, 0x38, 0x61, 0xE4, 0xC1, 0xC6, 0xFD, 0x7F, + 0x3A, 0xDE, 0x27, 0x98, 0x11, 0x09, 0x02, 0x40, 0x71, 0xDF, 0x88, 0x98, + 0xCC, 0xC8, 0x91, 0xE4, 0xCC, 0xC9, 0x41, 0x00, 0x0A, 0xC0, 0xC8, 0xC0, + 0x83, 0x90, 0xDC, 0x7F, 0x41, 0xDF, 0x01, 0xA8, 0x83, 0x98, 0x27, 0x98, + 0x08, 0x99, 0x04, 0x40, 0xA0, 0xDF, 0x88, 0x98, 0xFF, 0x7F, 0x4E, 0xDE, + 0x0A, 0x98, 0x90, 0xE4, 0x04, 0x40, 0xF0, 0xDF, 0x38, 0xE4, 0xFF, 0x7F, + 0x60, 0xDE, 0x83, 0x90, 0x84, 0x91, 0x27, 0x98, 0x02, 0x40, 0x98, 0xDF, + 0x88, 0x98, 0x89, 0x98, 0xC1, 0xC4, 0xFF, 0x7F, 0x3E, 0xDE, 0xE3, 0xC4, + 0xFF, 0x7F, 0x0E, 0xD8, 0x01, 0x40, 0x4C, 0xB8, 0x16, 0x99, 0x94, 0xB8, + 0x96, 0x99, 0x24, 0xB8, 0x0D, 0x91, 0x14, 0xB8, 0x8D, 0x91, 0xFF, 0x7F, + 0x03, 0xDE, 0x16, 0x90, 0x11, 0x91, 0x01, 0xBA, 0x96, 0x90, 0x61, 0xE0, + 0x95, 0x91, 0x00, 0xA8, 0x8C, 0x98, 0xFC, 0x7F, 0x1B, 0xDE, 0x61, 0xE0, + 0x96, 0x91, 0x00, 0xA0, 0x8D, 0x90, 0xFC, 0x7F, 0x0B, 0xDE, 0x07, 0x99, + 0x49, 0x08, 0x0A, 0xC8, 0x89, 0xB8, 0x48, 0x08, 0x02, 0x40, 0xFF, 0xDF, + 0x0D, 0x94, 0x48, 0xBA, 0xFE, 0x7F, 0xD7, 0xDE, 0x0A, 0x98, 0x07, 0x99, + 0x04, 0x40, 0xB6, 0xDF, 0x88, 0xB8, 0xFE, 0x7F, 0xF7, 0xD6, 0x11, 0x98, + 0xDF, 0xC8, 0x91, 0x98, 0x0A, 0xA1, 0x83, 0x91, 0x00, 0xA3, 0x84, 0x93, + 0x27, 0x98, 0x0A, 0x99, 0x02, 0x40, 0x58, 0xDF, 0x8A, 0x98, 0x0E, 0x99, + 0xE0, 0xC9, 0x01, 0x40, 0x5E, 0xD4, 0x12, 0x91, 0x94, 0x91, 0xFE, 0x7F, + 0xE3, 0xDE, 0x0E, 0x90, 0xE0, 0xC0, 0x00, 0x40, 0xD0, 0xD5, 0x14, 0x98, + 0x0E, 0xC8, 0x00, 0x40, 0xBE, 0x62, 0x80, 0xB8, 0x18, 0x09, 0x08, 0x08, + 0x83, 0x98, 0x84, 0x99, 0x00, 0xA8, 0xF8, 0x4F, 0x00, 0x40, 0x00, 0xA9, + 0xD9, 0x7F, 0xE0, 0xDF, 0x83, 0x9A, 0x84, 0x9B, 0xD8, 0x7F, 0x3B, 0xDF, + 0xA8, 0xE4, 0xB9, 0xE4, 0x00, 0xA4, 0x18, 0xDE, 0x00, 0xA8, 0x09, 0x50, + 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x8A, 0xE4, 0x9B, 0xE4, + 0xD8, 0x7F, 0x59, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, 0x00, 0xA8, 0x09, 0x50, + 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, + 0xD8, 0x7F, 0x4D, 0xDF, 0xC8, 0xE4, 0xD9, 0xE4, 0x8C, 0xE4, 0x9D, 0xE4, + 0xDB, 0x7F, 0x31, 0xDF, 0x28, 0xE4, 0xD8, 0x7F, 0x30, 0xDF, 0x83, 0x98, + 0x84, 0x99, 0x8C, 0xE4, 0x9D, 0xE4, 0xD8, 0x7F, 0x12, 0xDF, 0x08, 0xE4, + 0x19, 0xE4, 0x03, 0x40, 0x20, 0xB8, 0x06, 0x32, 0xC1, 0xC6, 0x83, 0x9A, + 0x84, 0x9B, 0xD5, 0x7F, 0xAD, 0xDF, 0x88, 0xB8, 0xFD, 0x7F, 0x6A, 0xD7, + 0x83, 0x90, 0x84, 0x91, 0x00, 0xA8, 0xFC, 0x4F, 0x00, 0x40, 0x00, 0xA9, + 0xD7, 0x7F, 0xFD, 0xDF, 0x83, 0x9A, 0x84, 0x9B, 0xD5, 0x7F, 0x9E, 0xDF, + 0x88, 0xB8, 0xFD, 0x7F, 0x51, 0xD7, 0xC1, 0xC4, 0x14, 0x98, 0x48, 0xBF, + 0xBB, 0xD9, 0xFC, 0x7F, 0xE0, 0xDE, 0x15, 0x90, 0x83, 0x90, 0x27, 0x98, + 0x0A, 0x99, 0x03, 0x40, 0x8F, 0xDF, 0x8A, 0x98, 0xFE, 0x7F, 0x38, 0xDE, + 0x00, 0xA8, 0x7C, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, 0x84, 0x99, + 0x80, 0xE4, 0x91, 0xE4, 0xD6, 0x7F, 0x1E, 0xDF, 0x08, 0xE4, 0x19, 0xE4, + 0xFA, 0x7F, 0xF5, 0xDE, 0x2A, 0x99, 0xE2, 0xC9, 0xFE, 0x7F, 0x6A, 0xDB, + 0x88, 0xB8, 0xFD, 0x7F, 0x98, 0xD7, 0x05, 0xA8, 0x83, 0x98, 0x00, 0xA8, + 0x84, 0x98, 0x27, 0x98, 0x07, 0x99, 0x01, 0x40, 0xC7, 0xDF, 0x87, 0x98, + 0x0A, 0x98, 0x07, 0x99, 0x04, 0x40, 0x12, 0xDF, 0xE0, 0xC8, 0xFC, 0x7F, + 0x36, 0xD8, 0xFD, 0x7F, 0x86, 0xDE, 0xE0, 0xCC, 0xFE, 0x7F, 0x21, 0xD4, + 0x8D, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x8F, 0xBC, 0xFE, 0x7F, 0x1B, 0xD4, + 0x8D, 0xE4, 0xFC, 0x5F, 0x00, 0x40, 0x80, 0xBC, 0xFE, 0x7F, 0x15, 0xD5, + 0x16, 0x99, 0xC1, 0xC9, 0x96, 0x99, 0x0D, 0x90, 0xC1, 0xC0, 0x8D, 0x90, + 0x01, 0xA0, 0xFE, 0x7F, 0x0C, 0xDE, 0x83, 0x91, 0xB8, 0xDE, 0xE0, 0xC3, + 0x12, 0xDB, 0x01, 0xA8, 0x83, 0x98, 0x27, 0x98, 0x0A, 0x99, 0x03, 0x40, + 0x94, 0xDF, 0x8A, 0x98, 0x07, 0x99, 0x03, 0x40, 0xE7, 0xDF, 0x38, 0xE4, + 0xE0, 0xC8, 0x00, 0x40, 0x93, 0xDB, 0xC1, 0xC2, 0x03, 0x40, 0x2A, 0xBF, + 0x07, 0xD5, 0x06, 0x32, 0xC1, 0xC6, 0xFC, 0x7F, 0x0A, 0xDE, 0x03, 0x40, + 0x29, 0xBF, 0x0A, 0xD4, 0x39, 0xA8, 0x06, 0x38, 0xC1, 0xC6, 0xFE, 0x7F, + 0xAA, 0xDE, 0x03, 0x40, 0x29, 0xBF, 0xF8, 0xD5, 0xE0, 0xC1, 0xEF, 0xDB, + 0xC1, 0xC2, 0x06, 0x32, 0xED, 0xDE, 0x14, 0x98, 0x0E, 0xC8, 0x00, 0x40, + 0xBE, 0x62, 0x80, 0xB8, 0x18, 0x09, 0x08, 0x08, 0x83, 0x9A, 0x84, 0x9B, + 0xD7, 0x7F, 0x9F, 0xDF, 0xA8, 0xE4, 0xB9, 0xE4, 0x01, 0xA4, 0x0D, 0xDE, + 0xC1, 0xC4, 0x00, 0xA8, 0x09, 0x50, 0x00, 0x40, 0x00, 0xA9, 0x83, 0x98, + 0x84, 0x99, 0x80, 0xE4, 0x91, 0xE4, 0xD7, 0x7F, 0x90, 0xDF, 0xC8, 0xE4, + 0xD9, 0xE4, 0x8C, 0xE4, 0x9D, 0xE4, 0xDA, 0x7F, 0x74, 0xDF, 0x28, 0xE4, + 0xD7, 0x7F, 0x73, 0xDF, 0x83, 0x98, 0x84, 0x99, 0x8C, 0xE4, 0x9D, 0xE4, + 0xD7, 0x7F, 0x55, 0xDF, 0x08, 0xE4, 0x19, 0xE4, 0x03, 0x40, 0x20, 0xB8, + 0x06, 0x32, 0xC1, 0xC6, 0x14, 0x99, 0x49, 0xBF, 0xDD, 0xD4, 0x00, 0xA2, + 0xF8, 0x4F, 0x00, 0x40, 0x00, 0xA3, 0x83, 0x92, 0x84, 0x93, 0x8A, 0xE4, + 0x9B, 0xE4, 0xD5, 0x7F, 0x83, 0xDF, 0x83, 0x90, 0x84, 0x91, 0xD4, 0x7F, + 0xE3, 0xDF, 0x88, 0xB8, 0xFC, 0x7F, 0x96, 0xD7, 0x83, 0x9A, 0x84, 0x9B, + 0x82, 0xE4, 0x93, 0xE4, 0xD7, 0x7F, 0x35, 0xDF, 0x83, 0x90, 0x84, 0x91, + 0xD4, 0x7F, 0x77, 0xDF, 0xE0, 0xC8, 0xFC, 0x7F, 0x1E, 0xDB, 0xDF, 0xC6, + 0x06, 0x20, 0x03, 0x40, 0x00, 0xBF, 0xFB, 0xD5, 0xC1, 0xC6, 0xFC, 0x7F, + 0x8B, 0xDE, 0xE0, 0xC8, 0x04, 0xD4, 0x00, 0x40, 0x21, 0xBC, 0xFE, 0x7F, + 0x44, 0xD4, 0xDF, 0xC6, 0x06, 0x28, 0x03, 0x40, 0x80, 0xBF, 0xFB, 0xD5, + 0xC1, 0xC6, 0xFB, 0x7F, 0x94, 0xDE, 0x48, 0xE4, 0x43, 0x40, 0x43, 0xB8, + 0x0B, 0x91, 0xE0, 0xC1, 0xFD, 0x7F, 0x28, 0xD4, 0x17, 0x98, 0x36, 0xA4, + 0x48, 0xBA, 0xFD, 0x7F, 0x23, 0xDE, 0x16, 0x92, 0x24, 0xBA, 0x00, 0xA4, + 0xFD, 0x7F, 0x1E, 0xDE, 0x01, 0xA0, 0xAB, 0x90, 0xFC, 0x7F, 0x97, 0xDE, + 0xE0, 0xC8, 0xFF, 0x7F, 0x6E, 0xD4, 0x82, 0xE4, 0x00, 0x40, 0x81, 0xBC, + 0xFF, 0x7F, 0x65, 0xD4, 0x06, 0x32, 0xFF, 0x7F, 0x67, 0xDE, 0x83, 0x91, + 0x84, 0x93, 0x27, 0x98, 0x08, 0x99, 0x00, 0x40, 0xEF, 0xDF, 0x88, 0x98, + 0xFE, 0x7F, 0x99, 0xDE, 0x20, 0xB5, 0x07, 0xB1, 0xFD, 0xB6, 0x28, 0xE4, + 0x19, 0xE4, 0x89, 0xE4, 0xE0, 0xC9, 0x2D, 0xD5, 0xE4, 0x7F, 0x73, 0xDF, + 0xE0, 0xC2, 0x03, 0xD5, 0xE2, 0x08, 0xE0, 0xC8, 0x29, 0xD5, 0xE1, 0x20, + 0xE0, 0xC0, 0x20, 0xD5, 0x00, 0x40, 0x08, 0xBC, 0x3C, 0xD4, 0xB1, 0x09, + 0xE0, 0xC9, 0x33, 0xD4, 0xE1, 0x28, 0x08, 0x40, 0x80, 0xBC, 0x20, 0xD4, + 0xC1, 0x09, 0xE0, 0xC9, 0x0D, 0xD5, 0x81, 0xE4, 0x04, 0x40, 0x80, 0xB8, + 0x98, 0xBF, 0x06, 0xD5, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA2, 0x02, 0x08, + 0xE4, 0x7F, 0x75, 0xDF, 0x00, 0xA8, 0xC1, 0x18, 0x04, 0x40, 0x11, 0x09, + 0xE0, 0xC9, 0x11, 0xD4, 0x00, 0xA8, 0xE1, 0x38, 0xE4, 0x7F, 0x4A, 0xDF, + 0x80, 0xE4, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x82, 0xE4, 0xE4, 0x7F, + 0x13, 0xDF, 0xD3, 0xDE, 0x82, 0xE4, 0x41, 0x09, 0xE4, 0x7F, 0x5F, 0xDF, + 0xDB, 0xDE, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA2, 0x02, 0x08, 0xE4, 0x7F, + 0x58, 0xDF, 0x00, 0xA8, 0x04, 0x40, 0x11, 0x18, 0xE5, 0xDE, 0x71, 0x08, + 0x99, 0xE0, 0x88, 0xB8, 0xC9, 0xD6, 0xFF, 0xA0, 0xC7, 0xDE, 0x81, 0xE4, + 0xE3, 0x7F, 0x28, 0xDF, 0x08, 0xE4, 0xBF, 0xDE, 0x20, 0xB5, 0x01, 0xB1, + 0xFD, 0xB6, 0x98, 0xE4, 0x00, 0x40, 0xAC, 0x63, 0x00, 0xA0, 0x00, 0x08, + 0xA1, 0xDF, 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x07, 0xB1, + 0xFD, 0xB6, 0x18, 0xE4, 0x89, 0xE4, 0x0A, 0x99, 0x00, 0xA0, 0x00, 0x40, + 0xEE, 0x63, 0x0C, 0xA2, 0x02, 0x10, 0x05, 0x40, 0x68, 0xDF, 0xFF, 0xC8, + 0x03, 0xD5, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x02, 0x09, 0xE0, 0xC9, + 0xFA, 0xD5, 0x01, 0x19, 0x03, 0xB6, 0x07, 0xB0, 0x40, 0xB4, 0x01, 0xA8, + 0xA0, 0xE0, 0x01, 0xA8, 0xA0, 0xE0, 0x20, 0xB5, 0xFB, 0xB6, 0x00, 0xA8, + 0x83, 0x98, 0x84, 0x98, 0x01, 0xA8, 0xEA, 0x4D, 0x0D, 0xA9, 0xEE, 0x7F, + 0x46, 0xDF, 0x05, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0x0F, 0xB1, 0xFC, 0xB6, + 0x28, 0xE4, 0x89, 0xE4, 0x0C, 0x99, 0x0D, 0x91, 0x00, 0xA0, 0x00, 0x40, + 0xEE, 0x63, 0x0C, 0xA3, 0x03, 0x10, 0x83, 0x91, 0x05, 0x40, 0x45, 0xDF, + 0xFF, 0xC8, 0x03, 0xD5, 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x03, 0x09, + 0xE0, 0xC9, 0xFA, 0xD5, 0x02, 0x19, 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0x0F, 0xB1, 0xFC, 0xB6, 0x18, 0xE4, 0x29, 0xE4, 0x04, 0x40, + 0x38, 0x08, 0xE0, 0xC8, 0x10, 0xD5, 0x92, 0xE4, 0x0A, 0xC9, 0x98, 0xB8, + 0x09, 0x00, 0xE0, 0xC0, 0x16, 0xD5, 0x00, 0x08, 0x09, 0x18, 0x00, 0xA8, + 0x40, 0x18, 0x30, 0x18, 0x90, 0xE4, 0x89, 0xE4, 0x04, 0xB6, 0x0F, 0xB0, + 0x40, 0xB4, 0x10, 0xA8, 0x83, 0x98, 0x81, 0xE4, 0x04, 0xA9, 0x04, 0x40, + 0xCC, 0xDF, 0x04, 0x40, 0x31, 0x18, 0x98, 0xE4, 0xE0, 0xC8, 0xE5, 0xD4, + 0xF0, 0xDE, 0x01, 0xA9, 0x39, 0xE4, 0x8A, 0xC3, 0x83, 0xE4, 0x0A, 0xC8, + 0x01, 0x40, 0x84, 0xB8, 0x83, 0x98, 0x81, 0xE4, 0x04, 0x40, 0xBB, 0xDF, + 0x08, 0xE4, 0x98, 0xE4, 0xE0, 0xC8, 0xE1, 0xD5, 0x18, 0x12, 0x28, 0x13, + 0xDA, 0xDE, 0x03, 0xB1, 0x18, 0xE4, 0x09, 0xE4, 0xE0, 0xC9, 0x08, 0xD5, + 0x19, 0x08, 0x04, 0x40, 0x31, 0x09, 0x0A, 0xC8, 0x89, 0xB8, 0x08, 0x09, + 0x00, 0x19, 0x08, 0x10, 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x0C, 0xB3, + 0x5F, 0xB1, 0xFC, 0xB6, 0xA8, 0xE4, 0x69, 0xE4, 0x10, 0x93, 0x11, 0x92, + 0x49, 0x04, 0xB9, 0xE4, 0x01, 0x40, 0xB4, 0xB8, 0x00, 0xA1, 0x0B, 0x09, + 0x89, 0xE4, 0xFF, 0x4F, 0x8F, 0xBC, 0x83, 0xE6, 0x82, 0xB8, 0x29, 0xE4, + 0x41, 0xC2, 0x23, 0xE6, 0x98, 0xE4, 0x41, 0xC9, 0x29, 0xB8, 0x92, 0xE4, + 0x41, 0xC2, 0x42, 0xC9, 0xFF, 0x4F, 0x8F, 0xBC, 0x98, 0xB8, 0x0B, 0x19, + 0xC4, 0xCB, 0xC1, 0xC1, 0x14, 0xBF, 0xE9, 0xD9, 0xE0, 0xC2, 0x09, 0xD5, + 0x26, 0x08, 0x84, 0xBF, 0x0B, 0xDB, 0x84, 0xE4, 0x0A, 0xC8, 0x86, 0xB8, + 0x58, 0x12, 0xC1, 0xC4, 0x46, 0x14, 0x86, 0xE4, 0x04, 0xB6, 0x5F, 0xB0, + 0x0C, 0xB2, 0x40, 0xB4, 0x16, 0x09, 0xC1, 0xC9, 0x8A, 0xE4, 0x82, 0xDF, + 0x18, 0xE4, 0xCC, 0xC8, 0x96, 0xE4, 0xCC, 0xC9, 0x46, 0x00, 0x0A, 0xC0, + 0xC8, 0xC0, 0x83, 0x90, 0xD9, 0x7F, 0x52, 0xDF, 0x8A, 0xE4, 0x96, 0xE4, + 0xAC, 0xDF, 0x61, 0xE4, 0xE2, 0xDE, 0x20, 0xB5, 0x5F, 0xB1, 0xFB, 0xB6, + 0x48, 0xE4, 0x09, 0xE4, 0x0F, 0x96, 0x10, 0x92, 0x11, 0x93, 0x82, 0xE4, + 0xC8, 0xC8, 0x09, 0xA9, 0xD1, 0x7F, 0x65, 0xDF, 0x18, 0xE4, 0x00, 0xA9, + 0x01, 0xA8, 0xE1, 0xC1, 0x04, 0xDB, 0x06, 0xC8, 0xC1, 0xC9, 0x18, 0xBF, + 0xFC, 0xD8, 0x84, 0xE4, 0xFF, 0x7F, 0x5A, 0xDF, 0x98, 0xE4, 0x58, 0x13, + 0x01, 0xA8, 0x49, 0x18, 0x09, 0xA1, 0xE9, 0xC6, 0x15, 0xDB, 0x01, 0xB8, + 0x0A, 0xA3, 0x83, 0x93, 0x00, 0x28, 0xFD, 0x7F, 0x80, 0xB8, 0x84, 0x98, + 0xC1, 0xC0, 0x84, 0xE4, 0x8F, 0xDF, 0x98, 0xE4, 0xC1, 0xC1, 0x16, 0xBF, + 0xF4, 0xD9, 0xC1, 0xC0, 0x12, 0xBF, 0x07, 0xD9, 0x89, 0xE4, 0x05, 0xB6, + 0x5F, 0xB0, 0x40, 0xB4, 0xCA, 0xC0, 0x12, 0xBF, 0xF9, 0xDA, 0x0A, 0xA3, + 0x83, 0x93, 0x00, 0x28, 0xFD, 0x7F, 0x80, 0xB8, 0x84, 0x98, 0xC1, 0xC0, + 0x84, 0xE4, 0xFF, 0x7F, 0x77, 0xDF, 0x98, 0xE4, 0xC1, 0xC1, 0x12, 0xBF, + 0xF3, 0xD9, 0x89, 0xE4, 0x05, 0xB6, 0x5F, 0xB0, 0x40, 0xB4, 0x01, 0xB1, + 0x98, 0xE4, 0x00, 0xA0, 0x00, 0x70, 0x80, 0xBC, 0x02, 0xD4, 0x10, 0xA0, + 0x82, 0xC9, 0x89, 0xE4, 0xC0, 0x7F, 0x00, 0x40, 0x80, 0xBC, 0x02, 0xD4, + 0xC8, 0xC0, 0x22, 0xC9, 0x89, 0xE4, 0x00, 0x7C, 0x00, 0x40, 0x80, 0xBC, + 0x02, 0xD4, 0xC4, 0xC0, 0x12, 0xC9, 0x89, 0xE4, 0x00, 0x70, 0x00, 0x40, + 0x80, 0xBC, 0x02, 0xD4, 0xC2, 0xC0, 0x0A, 0xC9, 0xE0, 0xC9, 0x06, 0xD9, + 0xC1, 0xC0, 0x00, 0x50, 0x00, 0x40, 0x90, 0xBC, 0x20, 0xA8, 0x01, 0xD5, + 0x80, 0xE4, 0x01, 0xB0, 0xA0, 0xE0, 0x07, 0xB1, 0x28, 0xE4, 0x08, 0x09, + 0x89, 0xE4, 0x00, 0x40, 0x87, 0xBC, 0x0F, 0xD5, 0x89, 0xE4, 0x00, 0x40, + 0x81, 0xBC, 0x00, 0xA0, 0x07, 0xD4, 0x89, 0xE4, 0x00, 0x40, 0x82, 0xBC, + 0x2D, 0xD5, 0x05, 0xC9, 0x02, 0x19, 0x01, 0xA0, 0x80, 0xE4, 0x07, 0xB0, + 0xA0, 0xE0, 0x18, 0xE4, 0x89, 0xE4, 0xFF, 0x4F, 0x8F, 0xBC, 0x1F, 0xD5, + 0x89, 0xE4, 0x0F, 0x40, 0x8F, 0xBC, 0x02, 0xD4, 0xC8, 0xC1, 0x21, 0xC9, + 0x89, 0xE4, 0x00, 0x40, 0x8F, 0xBC, 0x02, 0xD4, 0xC4, 0xC1, 0x11, 0xC9, + 0x89, 0xE4, 0x00, 0x40, 0x83, 0xBC, 0x02, 0xD4, 0xC2, 0xC1, 0x09, 0xC9, + 0x89, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x04, 0xD4, 0xC1, 0xC1, 0x05, 0xC9, + 0x20, 0xA0, 0xDE, 0xD5, 0x02, 0x19, 0x01, 0xE4, 0x80, 0xE4, 0x07, 0xB0, + 0xA0, 0xE0, 0x10, 0xA1, 0x41, 0xC9, 0xDE, 0xDE, 0x09, 0xC9, 0x02, 0x19, + 0x02, 0xA0, 0xD2, 0xDE, 0x20, 0xB5, 0x01, 0xB1, 0xFD, 0xB6, 0x09, 0xE4, + 0x01, 0xA9, 0xFE, 0x7F, 0xB9, 0xDF, 0x58, 0x10, 0x01, 0xA9, 0x48, 0x19, + 0x03, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0xFC, 0xB3, 0x5F, 0xB1, + 0xF8, 0xB6, 0x48, 0xE4, 0x09, 0xE4, 0x18, 0x93, 0x49, 0x01, 0x43, 0x02, + 0x12, 0xBF, 0x05, 0xDA, 0x87, 0x99, 0x03, 0xE4, 0x39, 0xE4, 0x12, 0xE4, + 0x49, 0x02, 0x10, 0x09, 0xE1, 0xE4, 0xE2, 0xB8, 0x20, 0x08, 0x8E, 0xBF, + 0x01, 0xDA, 0xC1, 0xC9, 0x84, 0xE4, 0xFE, 0x7F, 0x99, 0xDF, 0x87, 0x98, + 0x01, 0x40, 0x84, 0xB8, 0x84, 0x98, 0x68, 0xE4, 0x8E, 0xE4, 0x0A, 0xC8, + 0x85, 0x98, 0xF8, 0xE4, 0xF6, 0xB8, 0x6F, 0xBF, 0x05, 0xD6, 0x00, 0xA8, + 0x06, 0x18, 0xC4, 0xC6, 0x6F, 0xBF, 0xFC, 0xD7, 0xF0, 0xE4, 0x01, 0x40, + 0xF4, 0xB8, 0xB1, 0xE4, 0x0A, 0xCB, 0xBF, 0xB8, 0xC3, 0xE4, 0x01, 0x40, + 0xC4, 0xB8, 0x0A, 0xC2, 0x02, 0xE4, 0x0C, 0xB8, 0x86, 0x90, 0x04, 0x9D, + 0xC0, 0xBF, 0x54, 0xD6, 0x0C, 0x08, 0xA8, 0xE4, 0xFF, 0x4F, 0xAF, 0xBC, + 0x23, 0xD5, 0x6F, 0xE4, 0x3D, 0xE4, 0x00, 0xA4, 0x06, 0x02, 0x82, 0xE4, + 0xFF, 0x4F, 0x8F, 0xBC, 0x8A, 0xE6, 0x03, 0x01, 0x91, 0xE4, 0xFF, 0x4F, + 0x9F, 0xBC, 0x89, 0xB8, 0x48, 0xB8, 0x83, 0x94, 0x41, 0xC4, 0x92, 0xE4, + 0x41, 0xC9, 0x89, 0xE4, 0x8A, 0xE6, 0x98, 0xE4, 0x41, 0xC1, 0x91, 0xB8, + 0x94, 0xB8, 0xC4, 0xC6, 0x49, 0xE4, 0x41, 0xC4, 0x93, 0x39, 0x03, 0x98, + 0x83, 0x38, 0xC4, 0xC3, 0x6B, 0xBF, 0xE2, 0xD7, 0x03, 0x14, 0x0C, 0x08, + 0xA8, 0xE4, 0x41, 0xCA, 0x24, 0xD5, 0x6F, 0xE4, 0x3D, 0xE4, 0x00, 0xA4, + 0x0D, 0x09, 0x19, 0xE4, 0x06, 0x08, 0x28, 0xE4, 0xFF, 0x4F, 0x2F, 0xBC, + 0x2A, 0xE6, 0x41, 0xC1, 0x21, 0xB8, 0x42, 0xB8, 0x83, 0x94, 0x41, 0xC4, + 0x03, 0x90, 0x93, 0x30, 0x83, 0x39, 0xC4, 0xC3, 0x98, 0xE4, 0x41, 0xC9, + 0x89, 0xE4, 0x8A, 0xE6, 0x98, 0xE4, 0x03, 0x01, 0x81, 0xE4, 0xFF, 0x4F, + 0x8F, 0xBC, 0x98, 0xB8, 0x94, 0xB8, 0xC4, 0xC6, 0x49, 0xE4, 0x41, 0xC4, + 0x6B, 0xBF, 0xE2, 0xD7, 0x03, 0x19, 0xC4, 0xCC, 0xC4, 0xCD, 0x06, 0x98, + 0xC8, 0xBF, 0xAC, 0xD7, 0x05, 0x93, 0x04, 0x90, 0x30, 0xB8, 0xE0, 0xCE, + 0x07, 0xDB, 0xDC, 0xC3, 0x03, 0x08, 0xE0, 0xC8, 0x03, 0xD4, 0xDF, 0xCE, + 0xE0, 0xCE, 0xF9, 0xD8, 0x07, 0x98, 0x48, 0x1E, 0x08, 0xB6, 0x5F, 0xB0, + 0xFC, 0xB2, 0x40, 0xB4, 0x20, 0xB5, 0x1F, 0xB1, 0xFB, 0xB6, 0x48, 0xE4, + 0x39, 0xE4, 0x0E, 0x91, 0x81, 0xE4, 0x00, 0x40, 0x83, 0xBC, 0x27, 0xD4, + 0x08, 0xC1, 0x21, 0xD5, 0x04, 0x40, 0x24, 0x02, 0x02, 0xE4, 0xE0, 0xC2, + 0x36, 0xD5, 0x81, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0x0B, 0xD4, 0x04, 0xC1, + 0x16, 0xD5, 0x02, 0x08, 0x08, 0xE4, 0xE0, 0xC8, 0x23, 0xD5, 0x28, 0xE4, + 0x81, 0xE4, 0x00, 0x40, 0x81, 0xBC, 0xF5, 0xD5, 0x83, 0x92, 0x84, 0xE4, + 0x93, 0xE4, 0xFF, 0x7F, 0x3A, 0xDF, 0x08, 0xE4, 0x84, 0xE4, 0x93, 0xE4, + 0xFE, 0x7F, 0x1F, 0xDF, 0x30, 0xE4, 0x04, 0xC1, 0xEA, 0xD4, 0x83, 0xE4, + 0x05, 0xB6, 0x1F, 0xB0, 0x40, 0xB4, 0x0A, 0xC8, 0x00, 0x40, 0xBD, 0x62, + 0x88, 0xB8, 0x08, 0x08, 0x83, 0x98, 0x00, 0xA8, 0x84, 0x98, 0x84, 0xE4, + 0xFE, 0x7F, 0x1C, 0xDF, 0x38, 0xE4, 0xCC, 0xDE, 0x83, 0x92, 0x84, 0xE4, + 0x92, 0xE4, 0xFF, 0x7F, 0x1C, 0xDF, 0x02, 0x18, 0x08, 0x10, 0x28, 0xE4, + 0xD5, 0xDE, 0x84, 0xE4, 0x27, 0x40, 0x01, 0xA9, 0xFF, 0x7F, 0x06, 0xDF, + 0x04, 0x40, 0x24, 0x18, 0x28, 0xE4, 0x08, 0x10, 0xC0, 0xDE, 0x20, 0xB5, + 0x3C, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, 0xC8, 0xE4, 0xB9, 0xE4, 0x11, 0x96, + 0x26, 0xE4, 0x14, 0xC2, 0x19, 0x01, 0x49, 0x04, 0x42, 0xB8, 0xC1, 0xC4, + 0x29, 0x08, 0x02, 0xDE, 0xC1, 0xC1, 0x06, 0xC8, 0x48, 0xBF, 0xFC, 0xD8, + 0x8C, 0xE4, 0x91, 0xE4, 0xFD, 0x7F, 0xAA, 0xDF, 0xA8, 0xE4, 0xD8, 0xE4, + 0x01, 0x40, 0xD4, 0xB8, 0x00, 0xA8, 0x82, 0xBF, 0x06, 0xDA, 0x98, 0xE4, + 0x0D, 0x19, 0xC4, 0xCD, 0xC1, 0xC8, 0x82, 0xBF, 0xFB, 0xD9, 0x9B, 0xE4, + 0x01, 0x40, 0x94, 0xB8, 0x4B, 0x03, 0x0A, 0xC3, 0x39, 0xB8, 0x01, 0x40, + 0x6F, 0xBC, 0x1D, 0xD5, 0x20, 0xA1, 0x16, 0xBA, 0x00, 0xA2, 0x09, 0x08, + 0x9A, 0xC8, 0x82, 0xBD, 0x0D, 0x18, 0xC4, 0xCD, 0x09, 0x02, 0x01, 0xE4, + 0x81, 0xC2, 0xC4, 0xC9, 0x93, 0xBF, 0xF5, 0xD7, 0x0D, 0x12, 0xE0, 0xC2, + 0x01, 0xD5, 0xC1, 0xC4, 0xDF, 0xC4, 0x4A, 0x14, 0x8C, 0xE4, 0x9B, 0xE4, + 0xFD, 0x7F, 0xB3, 0xDF, 0x8A, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, + 0x40, 0xB4, 0x09, 0x08, 0xC4, 0xC9, 0x0D, 0x18, 0xC4, 0xCD, 0x93, 0xBF, + 0xEF, 0xD6, 0x09, 0x08, 0xC4, 0xC9, 0x0D, 0x18, 0xC4, 0xCD, 0x93, 0xBF, + 0xF4, 0xD7, 0xE8, 0xDE, 0x0F, 0xB1, 0x18, 0xE4, 0x39, 0xE4, 0x48, 0x08, + 0x49, 0x00, 0x80, 0xBA, 0x14, 0xD4, 0x21, 0xE4, 0x01, 0x40, 0x24, 0xB8, + 0x80, 0xE4, 0x0A, 0xC8, 0x98, 0xE4, 0x92, 0xB8, 0x03, 0xE4, 0x01, 0x40, + 0x04, 0xB8, 0x08, 0xB8, 0xDC, 0xC9, 0xDC, 0xC0, 0x09, 0x01, 0x00, 0x08, + 0x18, 0xBF, 0x05, 0xD4, 0x92, 0xBF, 0xF8, 0xDC, 0x00, 0xA8, 0x0F, 0xB0, + 0xA0, 0xE0, 0xFF, 0xA9, 0x18, 0xBF, 0x01, 0xD7, 0x01, 0xA9, 0x89, 0xE4, + 0x0F, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x7C, 0xB3, 0x5F, 0xB1, 0xFD, 0xB6, + 0x38, 0xE4, 0x19, 0xE4, 0x12, 0x92, 0x89, 0xE4, 0x92, 0xE4, 0xD2, 0xDF, + 0x08, 0xE4, 0xE0, 0xC8, 0x55, 0xD5, 0x61, 0xD9, 0x00, 0xA0, 0x83, 0xE4, + 0x11, 0x09, 0xFD, 0x7F, 0x33, 0xDF, 0xD8, 0xE4, 0x38, 0x10, 0x41, 0x0B, + 0x31, 0xE4, 0x01, 0x40, 0x34, 0xB8, 0xCB, 0xE4, 0x0A, 0xCC, 0xC3, 0xB8, + 0x42, 0x0A, 0x42, 0xE4, 0x01, 0x40, 0x44, 0xB8, 0x0A, 0xCA, 0xA4, 0xB8, + 0xE8, 0xE4, 0x01, 0x40, 0xE4, 0xB8, 0x00, 0xA6, 0x03, 0x01, 0x21, 0xE4, + 0xFF, 0x4F, 0x2F, 0xBC, 0x04, 0x09, 0x89, 0xE4, 0xFF, 0x4F, 0x8F, 0xBC, + 0x28, 0xBA, 0x26, 0xB8, 0x62, 0xE4, 0x40, 0xC6, 0x41, 0xC1, 0x41, 0xC9, + 0x19, 0xBA, 0x16, 0xB8, 0xC4, 0xC4, 0xC4, 0xC3, 0x61, 0xE4, 0x40, 0xC6, + 0x9E, 0x31, 0x8E, 0x32, 0xC4, 0xCE, 0x4A, 0xBF, 0xE7, 0xD7, 0x3C, 0xBF, + 0x17, 0xD6, 0x03, 0x08, 0x28, 0xE4, 0xFF, 0x4F, 0x2F, 0xBC, 0x26, 0xB8, + 0x62, 0xE4, 0x40, 0xC6, 0x18, 0xE4, 0x41, 0xC1, 0x16, 0xB8, 0xC4, 0xC3, + 0x61, 0xE4, 0x40, 0xC6, 0x9E, 0x31, 0x8E, 0x32, 0xC4, 0xCE, 0x3C, 0xBF, + 0xEE, 0xD7, 0xDC, 0xCE, 0x0E, 0x08, 0xE0, 0xC8, 0x05, 0xD4, 0xDF, 0xCB, + 0xDC, 0xCE, 0x0E, 0x08, 0xE0, 0xC8, 0xFB, 0xD5, 0x4D, 0x1B, 0x8D, 0xE4, + 0x03, 0xB6, 0x5F, 0xB0, 0x7C, 0xB2, 0x40, 0xB4, 0x83, 0xE4, 0x90, 0xE4, + 0xFC, 0x7F, 0xE0, 0xDF, 0xD8, 0xE4, 0x01, 0xA8, 0x4D, 0x18, 0x5D, 0x10, + 0x8D, 0xE4, 0x03, 0xB6, 0x5F, 0xB0, 0x7C, 0xB2, 0x40, 0xB4, 0xD1, 0xE4, + 0x12, 0xE4, 0x2D, 0xE4, 0x01, 0xA0, 0x9B, 0xDE, 0x0D, 0xB1, 0xFC, 0x5F, + 0x00, 0x40, 0x90, 0xBC, 0x30, 0x7F, 0x00, 0x40, 0x90, 0xB8, 0x39, 0xE4, + 0xE0, 0xC9, 0x05, 0xDB, 0x00, 0xA2, 0x82, 0xE4, 0x93, 0xE4, 0x0D, 0xB0, + 0xA0, 0xE0, 0x69, 0xE0, 0x50, 0xC9, 0x01, 0x40, 0x93, 0xBF, 0x0E, 0xDB, + 0x00, 0xA3, 0xFE, 0x7F, 0x9C, 0xB8, 0x01, 0xA8, 0x01, 0x40, 0x9E, 0xBF, + 0x02, 0xD8, 0x79, 0xE0, 0xA6, 0xC8, 0x28, 0xE4, 0x82, 0xE4, 0x93, 0xE4, + 0x0D, 0xB0, 0xA0, 0xE0, 0x02, 0x40, 0x00, 0x40, 0x00, 0xA8, 0x38, 0xE4, + 0xA4, 0xC3, 0xE2, 0xDE, 0x20, 0xB5, 0x0C, 0xB3, 0x1F, 0xB1, 0xFD, 0xB6, + 0x09, 0xE4, 0x38, 0xE4, 0x01, 0x40, 0x34, 0xB8, 0x48, 0x01, 0x0A, 0xC1, + 0x13, 0xB8, 0xDC, 0xC1, 0x01, 0x02, 0x82, 0xE4, 0xFD, 0x7F, 0x71, 0xDF, + 0x98, 0xE4, 0x20, 0xA8, 0x89, 0xBA, 0x00, 0x18, 0xEA, 0xC9, 0x2F, 0xDB, + 0x00, 0xA4, 0x13, 0xBF, 0x1D, 0xDC, 0xD5, 0xC9, 0x1F, 0xD5, 0xA6, 0xC2, + 0x00, 0xA0, 0x09, 0xBA, 0x84, 0xE4, 0x81, 0xC8, 0x28, 0xBD, 0xB2, 0xE4, + 0xFC, 0x4F, 0x00, 0x40, 0xB0, 0xBD, 0x00, 0xA2, 0x13, 0xBF, 0x02, 0xDD, + 0xFF, 0x7F, 0x31, 0x02, 0xA6, 0xC4, 0x00, 0xA0, 0x09, 0xBA, 0x81, 0xC2, + 0xA4, 0xE4, 0xA2, 0xBD, 0x8A, 0xE4, 0x9B, 0xE4, 0x03, 0xB6, 0x1F, 0xB0, + 0x0C, 0xB2, 0x40, 0xB4, 0xDC, 0xC1, 0x01, 0x04, 0xD5, 0xC9, 0xE1, 0xD4, + 0xB2, 0xE4, 0xFC, 0x4F, 0x00, 0x40, 0xB0, 0xBD, 0xA4, 0xE4, 0x8A, 0xE4, + 0x9B, 0xE4, 0x03, 0xB6, 0x1F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x0B, 0xA0, + 0x09, 0xBA, 0x82, 0xE4, 0x81, 0xC8, 0xB8, 0xE4, 0xFC, 0x4F, 0x00, 0x40, + 0xB0, 0xBD, 0x00, 0xA4, 0x13, 0xBF, 0x02, 0xDD, 0xFF, 0x7F, 0x31, 0x04, + 0x89, 0xE4, 0x01, 0x40, 0x85, 0xB8, 0xA2, 0xC2, 0x0B, 0xA0, 0x09, 0xBA, + 0x81, 0xC4, 0xA2, 0xE4, 0xA4, 0xBD, 0x8A, 0xE4, 0x9B, 0xE4, 0x03, 0xB6, + 0x1F, 0xB0, 0x0C, 0xB2, 0x40, 0xB4, 0x20, 0xB5, 0x34, 0xB3, 0x5F, 0xB1, + 0xFB, 0xB6, 0x91, 0x99, 0x13, 0x96, 0x14, 0x9A, 0x11, 0x9C, 0x12, 0x9D, + 0x01, 0xA9, 0xFC, 0x7F, 0x3D, 0xDF, 0x48, 0xE4, 0x38, 0xE4, 0x01, 0x40, + 0x34, 0xB8, 0x9D, 0xE4, 0x03, 0x40, 0xFF, 0x7F, 0x9F, 0xBC, 0x8D, 0xE4, + 0xFF, 0x5F, 0xFF, 0x7F, 0x8F, 0xBC, 0xD8, 0xE4, 0x28, 0xE4, 0x51, 0xC2, + 0x03, 0xD5, 0x04, 0x40, 0x00, 0x40, 0x90, 0xBD, 0x83, 0x99, 0xE0, 0xCC, + 0x25, 0xD5, 0x84, 0x9C, 0x10, 0x40, 0xD8, 0xE1, 0xFD, 0x7F, 0x21, 0xDF, + 0x08, 0xE4, 0xE0, 0xC8, 0x36, 0xD4, 0x04, 0x98, 0x03, 0x18, 0x03, 0x99, + 0x13, 0x19, 0x02, 0xA8, 0xE0, 0xC9, 0x01, 0xD4, 0x01, 0xA8, 0x44, 0x18, + 0xE0, 0xC2, 0x1F, 0xD4, 0xBC, 0x7F, 0x0E, 0xB8, 0x06, 0x10, 0x08, 0xE4, + 0x16, 0xC0, 0x0A, 0xC8, 0x38, 0xB8, 0xFF, 0x7F, 0x33, 0x08, 0xFC, 0x7F, + 0xE0, 0xDF, 0x08, 0xBA, 0x0A, 0x10, 0x84, 0xE4, 0x05, 0xB6, 0x5F, 0xB0, + 0x34, 0xB2, 0x40, 0xB4, 0x0C, 0x40, 0xD8, 0xE1, 0xFC, 0x7F, 0xFD, 0xDF, + 0x08, 0xE4, 0x03, 0x98, 0x03, 0x18, 0x01, 0xA8, 0x44, 0x18, 0x02, 0x40, + 0x00, 0xB8, 0xE0, 0xC2, 0xE1, 0xD5, 0x20, 0xB8, 0xBC, 0x7F, 0x2D, 0xB8, + 0x06, 0x12, 0x35, 0xA8, 0x80, 0xBA, 0x0A, 0x18, 0x84, 0xE4, 0x05, 0xB6, + 0x5F, 0xB0, 0x34, 0xB2, 0x40, 0xB4, 0x68, 0xE0, 0x03, 0x99, 0xA2, 0xC9, + 0x04, 0x98, 0x98, 0xBD, 0x03, 0x19, 0x03, 0x99, 0x81, 0xC9, 0x83, 0x99, + 0xC3, 0xDE, 0x20, 0xB5, 0x3C, 0xB3, 0x07, 0xB1, 0xF9, 0xB6, 0x08, 0xE4, + 0x19, 0xE4, 0x18, 0x40, 0xD9, 0xE1, 0xFF, 0x7F, 0x2B, 0xDF, 0xA8, 0xE4, + 0xB9, 0xE4, 0x81, 0xE4, 0x14, 0x40, 0xD9, 0xE1, 0xFF, 0x7F, 0x24, 0xDF, + 0xC8, 0xE4, 0xD9, 0xE4, 0x06, 0x92, 0x05, 0x98, 0x28, 0xBA, 0x40, 0x08, + 0x41, 0x09, 0x89, 0xBA, 0x16, 0xC8, 0x28, 0xB8, 0xE0, 0xC2, 0x0C, 0xDB, + 0x52, 0xC2, 0xB2, 0xB8, 0x83, 0x9C, 0x84, 0x9D, 0x8A, 0xE4, 0x9B, 0xE4, + 0xD3, 0x7F, 0xA4, 0xDF, 0x07, 0xB6, 0x07, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, + 0x52, 0xC2, 0xD2, 0xBA, 0x83, 0x9C, 0x84, 0x9D, 0x8A, 0xE4, 0x9B, 0xE4, + 0xD3, 0x7F, 0x98, 0xDF, 0x07, 0xB6, 0x07, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, + 0x20, 0xB5, 0x0D, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, 0x00, 0xA8, 0xFC, 0x4F, + 0x00, 0x40, 0x00, 0xA9, 0x01, 0x40, 0x07, 0xBF, 0x09, 0xD8, 0x0E, 0xC0, + 0x00, 0x40, 0xBE, 0x62, 0x08, 0xB8, 0x00, 0x08, 0x10, 0x09, 0x05, 0xB6, + 0x0D, 0xB0, 0x40, 0xB4, 0xE0, 0xC0, 0xFB, 0xDB, 0x00, 0xA2, 0x09, 0x50, + 0x00, 0x40, 0x00, 0xA3, 0x83, 0x92, 0x84, 0x93, 0xD2, 0x7F, 0x01, 0xDF, + 0xDF, 0xC0, 0xE0, 0xC0, 0xF9, 0xD8, 0x05, 0xB6, 0x0D, 0xB0, 0x40, 0xB4, + 0x20, 0xB5, 0x0F, 0xB1, 0xFC, 0xB6, 0x28, 0xE4, 0x89, 0xE4, 0x0C, 0x99, + 0x0D, 0x91, 0x00, 0xA0, 0x00, 0x40, 0xEE, 0x63, 0x0C, 0xA3, 0x03, 0x10, + 0x83, 0x91, 0x00, 0x40, 0xBE, 0xDF, 0xFF, 0xC8, 0x03, 0xD5, 0x04, 0xB6, + 0x0F, 0xB0, 0x40, 0xB4, 0x03, 0x09, 0xE0, 0xC9, 0xFA, 0xD5, 0x02, 0x19, + 0x04, 0xB6, 0x0F, 0xB0, 0x40, 0xB4, 0x03, 0xB1, 0x19, 0xE4, 0x98, 0xE4, + 0xFF, 0x5F, 0xFF, 0x7F, 0x1F, 0xBC, 0x68, 0xE0, 0x89, 0xBD, 0x7D, 0xC8, + 0x18, 0xBD, 0xFC, 0x5F, 0x00, 0x40, 0x00, 0xA8, 0x81, 0xBA, 0x18, 0xE4, + 0x00, 0xA9, 0x98, 0xBA, 0x98, 0xBD, 0x7D, 0xC9, 0x01, 0xA8, 0x89, 0xBA, + 0x03, 0xB0, 0xA0, 0xE0, 0x20, 0xB5, 0x03, 0xB1, 0xFB, 0xB6, 0x10, 0x40, + 0xD0, 0xE1, 0x84, 0x90, 0x00, 0x40, 0x5D, 0x64, 0x08, 0xA1, 0x01, 0x09, + 0xE0, 0xC9, 0x04, 0xD4, 0x00, 0x40, 0xB3, 0x64, 0x00, 0xA9, 0x01, 0x19, + 0x89, 0xB8, 0x80, 0xBF, 0x08, 0xDC, 0x00, 0x40, 0x5D, 0x64, 0x08, 0xA0, + 0x00, 0x18, 0x89, 0xE4, 0x05, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x19, 0xA8, + 0x83, 0x98, 0x01, 0xA8, 0x00, 0x40, 0x55, 0x63, 0x08, 0xA9, 0x0F, 0xDF, + 0x00, 0xA8, 0xF4, 0xDE, 0x20, 0xB5, 0xFC, 0xB6, 0x19, 0xA8, 0x83, 0x98, + 0x01, 0xA8, 0x00, 0x40, 0x55, 0x63, 0x08, 0xA9, 0x04, 0xDF, 0xDD, 0x7F, + 0xF3, 0xDF, 0x04, 0xB6, 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFB, 0xB6, + 0x08, 0xE4, 0x0A, 0x98, 0x83, 0x99, 0x84, 0x98, 0x04, 0xA8, 0x90, 0xE4, + 0xE9, 0x7F, 0x41, 0xDF, 0x05, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, + 0x03, 0xB1, 0xFC, 0xB6, 0x09, 0xE4, 0x0A, 0x99, 0x09, 0xE6, 0x90, 0xE4, + 0xE3, 0x7F, 0x5D, 0xDF, 0x08, 0xE4, 0xE0, 0xC0, 0x26, 0xD5, 0xFF, 0x7F, + 0x30, 0x08, 0xFF, 0x7F, 0x8C, 0xBC, 0xDC, 0xC8, 0x02, 0x40, 0x84, 0xBF, + 0x21, 0xDC, 0x90, 0xE4, 0x01, 0x40, 0x83, 0xBF, 0x13, 0xDD, 0x00, 0xA1, + 0x00, 0x11, 0xC4, 0xC9, 0x09, 0x11, 0xC4, 0xC9, 0x01, 0x40, 0x8B, 0xBF, + 0x0B, 0xDD, 0x09, 0x11, 0xC4, 0xC9, 0x09, 0x11, 0xC4, 0xC9, 0x02, 0x40, + 0x83, 0xBF, 0x04, 0xDD, 0x09, 0x11, 0xC4, 0xC9, 0x09, 0x11, 0xC4, 0xC9, + 0x00, 0xA8, 0x09, 0x18, 0xC4, 0xC9, 0x09, 0x18, 0xC4, 0xC9, 0x09, 0x18, + 0x80, 0xE4, 0x04, 0xB6, 0x03, 0xB0, 0x40, 0xB4, 0x83, 0x98, 0x80, 0xE4, + 0x00, 0xA9, 0xD4, 0x7F, 0xEC, 0xDF, 0xF6, 0xDE, 0x20, 0xB5, 0xFB, 0xB6, + 0x98, 0xE4, 0x00, 0xA8, 0x83, 0x98, 0x84, 0x98, 0x06, 0xA8, 0xE8, 0x7F, + 0xFA, 0xDF, 0x05, 0xB6, 0x40, 0xB4, 0x00, 0x42, 0x00, 0xA8, 0x19, 0x18, + 0x00, 0x41, 0x00, 0xA8, 0xB9, 0x18, 0x00, 0xA8, 0xA0, 0xE0, 0x20, 0xB5, + 0x01, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, 0x0A, 0x98, 0x83, 0x99, 0x84, 0x98, + 0x13, 0xA8, 0x90, 0xE4, 0xE8, 0x7F, 0xE5, 0xDF, 0x05, 0xB6, 0x01, 0xB0, + 0x40, 0xB4, 0x20, 0xB5, 0x01, 0xB1, 0xFB, 0xB6, 0x08, 0xE4, 0x0A, 0x98, + 0x83, 0x99, 0x84, 0x98, 0x03, 0xA8, 0x90, 0xE4, 0xE8, 0x7F, 0xD7, 0xDF, + 0x05, 0xB6, 0x01, 0xB0, 0x40, 0xB4, 0x20, 0xB5, 0x3C, 0xB3, 0x5F, 0xB1, + 0xF8, 0xB6, 0xA8, 0xE4, 0x19, 0xE4, 0x19, 0x93, 0x1A, 0x94, 0x1B, 0x92, + 0x28, 0x7F, 0x6A, 0xDF, 0x84, 0x98, 0x28, 0x7F, 0x50, 0xDF, 0x0D, 0xC8, + 0x85, 0x98, 0x00, 0xA0, 0x00, 0x40, 0xF0, 0x63, 0x0A, 0xA8, 0x08, 0x30, + 0x77, 0x41, 0x00, 0xA9, 0x00, 0x40, 0xF0, 0x63, 0x0C, 0xA8, 0x88, 0x39, + 0x00, 0x40, 0xF2, 0x63, 0x08, 0xAB, 0x0B, 0x30, 0x00, 0x40, 0xF0, 0x63, + 0x08, 0xA8, 0x88, 0x32, 0x00, 0xA0, 0x00, 0x40, 0xF1, 0x63, 0x00, 0xA8, + 0x08, 0x10, 0x00, 0x40, 0xF1, 0x63, 0x04, 0xA9, 0x09, 0x10, 0xC0, 0xE4, + 0x00, 0x40, 0xF2, 0x63, 0x0C, 0xA8, 0x08, 0x11, 0x81, 0xE4, 0x02, 0x40, + 0x8C, 0xB8, 0x00, 0x40, 0xF3, 0x63, 0x00, 0xA9, 0x09, 0x18, 0x28, 0x7F, + 0x3B, 0xDF, 0x01, 0x18, 0x00, 0x40, 0xF2, 0x63, 0x0C, 0xA8, 0x08, 0x01, + 0x21, 0x10, 0x62, 0xE4, 0x42, 0xC6, 0x86, 0xE4, 0x84, 0xBD, 0x01, 0x76, + 0x04, 0xA9, 0x09, 0x18, 0x00, 0x40, 0xF0, 0x63, 0x00, 0xAD, 0x8D, 0x88, + 0x84, 0xBF, 0x00, 0x40, 0xF5, 0xD5, 0x00, 0xA9, 0x00, 0x40, 0xF2, 0x63, + 0x09, 0xA8, 0x08, 0x39, 0x03, 0x08, 0x04, 0x40, 0x84, 0xBC, 0x00, 0x40, + 0xC9, 0xD5, 0x00, 0x40, 0xF3, 0x63, 0x04, 0xA0, 0x00, 0x08, 0x08, 0x40, + 0x08, 0x29, 0x06, 0xC9, 0x03, 0x40, 0x31, 0x28, 0x00, 0x40, 0x81, 0xBC, + 0x89, 0xBD, 0x03, 0x40, 0x31, 0x38, 0x00, 0x40, 0xF2, 0x63, 0x0C, 0xA8, + 0x08, 0x01, 0x00, 0xA8, 0x81, 0x18, 0x00, 0x40, 0xF3, 0x63, 0x04, 0xA9, + 0x09, 0x08, 0x91, 0x18, 0x01, 0x40, 0x81, 0x34, 0x01, 0x40, 0x91, 0x32, + 0x03, 0x09, 0x89, 0xE4, 0x66, 0xC8, 0x88, 0xB8, 0x00, 0x40, 0xAF, 0xD6, + 0x03, 0x40, 0x01, 0x28, 0x03, 0x40, 0x80, 0xBD, 0x03, 0x40, 0x01, 0x38, + 0x00, 0x40, 0xF0, 0x63, 0x04, 0xA2, 0x82, 0x20, 0xE1, 0xC0, 0x00, 0x40, + 0xB5, 0xD5, 0x03, 0x08, 0x04, 0x40, 0x8F, 0xBC, 0x02, 0x76, 0x04, 0xA9, + 0x09, 0x18, 0x02, 0x76, 0x04, 0xA8, 0x08, 0x00, 0x00, 0x40, 0x01, 0xBC, + 0xFA, 0xD4, 0x25, 0x7F, 0xFB, 0xDF, 0x02, 0x76, 0x08, 0xA9, 0x09, 0x08, + 0xE1, 0xC8, 0x00, 0x40, 0xBA, 0xD5, 0x00, 0x40, 0x72, 0x64, 0x0C, 0xA8, + 0x08, 0x10, 0x01, 0xAC, 0xC4, 0xE0, 0x01, 0x76, 0x04, 0xA9, 0x09, 0x08, + 0x00, 0x40, 0xF2, 0x63, 0x0C, 0xA0, 0x00, 0x01, 0x98, 0xE4, 0x3F, 0x40, + 0x9F, 0xBC, 0x01, 0x40, 0xA1, 0x39, 0x41, 0xC8, 0x3F, 0x40, 0x8F, 0xBC, + 0x01, 0x40, 0xB1, 0x38, 0x27, 0x7F, 0xC0, 0xDF, 0x11, 0x18, 0x00, 0x40, + 0xF2, 0x63, 0x0C, 0xA9, 0x09, 0x08, 0x10, 0xA9, 0x38, 0x19, 0x16, 0x7F, + 0x49, 0xDF, 0x0B, 0x28, 0xC1, 0xC8, 0x0B, 0x38, 0x02, 0x76, 0x0C, 0xA0, + 0x00, 0x01, 0x01, 0x76, 0x04, 0xA9, 0x09, 0x08, 0x98, 0xE4, 0x41, 0xC9, + 0x00, 0x40, 0xF1, 0x63, 0x0C, 0xA0, 0x00, 0x19, 0x08, 0xE4, 0xFF, 0x4F, + 0x0F, 0xBC, 0x00, 0x40, 0xF1, 0x63, 0x08, 0xA8, 0x08, 0x10, 0x00, 0x40, + 0xF0, 0x63, 0x06, 0xA8, 0x88, 0x88, 0x89, 0xBF, 0x04, 0xD7, 0x82, 0x88, + 0x80, 0xBF, 0x00, 0x40, 0x75, 0xD6, 0xFF, 0x4F, 0x0F, 0xA1, 0x25, 0x7F, + 0xAF, 0xDF, 0x00, 0x40, 0xF2, 0x63, 0x0C, 0xA0, 0x00, 0x09, 0x01, 0x40, + 0xA9, 0x28, 0xDF, 0xC8, 0x01, 0x40, 0xA9, 0x38, 0x01, 0x76, 0x04, 0xA9, + 0x09, 0x08, 0x00, 0x40, 0xF1, 0x63, 0x04, 0xA0, 0x00, 0x18, 0x64, 0xBD, + 0x68, 0xBF, 0x03, 0xD5, 0xFF, 0x4F, 0x8F, 0xBC, 0x03, 0xD4, 0x0B, 0x28, + 0xDF, 0xC8, 0x0B, 0x38, 0x00, 0x40, 0xF1, 0x63, 0x00, 0xA8, 0x08, 0x11, + 0x0F, 0xA8, 0x03, 0x76, 0x00, 0xA9, 0x09, 0x18, 0x27, 0x7F, 0x59, 0xDF, + 0xC7, 0xC8, 0x0D, 0xC8, 0x05, 0x99, 0x89, 0xBA, 0x85, 0x98, 0x00, 0x40, + 0xF2, 0x63, 0x0C, 0xA0, 0x00, 0x09, 0x04, 0x98, 0x19, 0x09, 0x27, 0x7F, + 0x50, 0xDF, 0x0B, 0x29, 0x0C, 0xE4, 0x40, 0xE0, 0x49, 0xE0, 0x0A, 0x19, + 0x1A, 0x18, 0x05, 0x98, 0x2A, 0x18, 0x3A, 0x11, 0x4A, 0x10, 0x8A, 0xE4, + 0x08, 0xB6, 0x5F, 0xB0, 0x3C, 0xB2, 0x40, 0xB4, 0x8D, 0x88, 0x84, 0xBF, + 0x47, 0xD5, 0x02, 0x76, 0x00, 0xA0, 0x00, 0x09, 0x65, 0xC9, 0xFF, 0x7F, + 0x34, 0xDE, 0x8D, 0x88, 0x84, 0xBF, 0x37, 0xD5, 0x76, 0xC9, 0x99, 0xB8, + 0x2C, 0xD6, 0x03, 0x40, 0x01, 0x28, 0xFC, 0x7F, 0x8F, 0xBC, 0x03, 0x40, + 0x01, 0x38, 0x00, 0x40, 0xF0, 0x63, 0x04, 0xA2, 0x82, 0x20, 0xE1, 0xC0, + 0xFF, 0x7F, 0x4B, 0xD4, 0x03, 0x08, 0xFB, 0x7F, 0x8F, 0xBC, 0x03, 0x18, + 0xFF, 0x7F, 0x45, 0xDE, 0x00, 0x40, 0xF0, 0x63, 0x02, 0xA8, 0x88, 0x88, + 0x82, 0xBF, 0xFF, 0x7F, 0x04, 0xD5, 0x03, 0x28, 0x09, 0xC8, 0x00, 0x40, + 0x81, 0xBC, 0x01, 0xA9, 0xFE, 0x7F, 0xFE, 0xD5, 0xFE, 0x7F, 0xFB, 0xDE, + 0xE0, 0xC1, 0xAE, 0xD5, 0x8A, 0xDE, 0x00, 0x40, 0x72, 0x64, 0x0C, 0xA0, + 0x00, 0x18, 0xFF, 0x7F, 0x45, 0xDE, 0x03, 0x40, 0x01, 0x28, 0xFC, 0x7F, + 0x8F, 0xBC, 0x02, 0x40, 0x80, 0xBD, 0xFF, 0x7F, 0x1B, 0xDE, 0x00, 0x40, + 0xF0, 0x63, 0x02, 0xA8, 0x88, 0x88, 0x82, 0xBF, 0xC3, 0xD4, 0xC5, 0xDE, + 0x00, 0x40, 0xF0, 0x63, 0x02, 0xA8, 0x88, 0x88, 0x82, 0xBF, 0xB3, 0xD4, + 0x00, 0x40, 0xF3, 0x63, 0x04, 0xA9, 0x09, 0x08, 0xFE, 0x7F, 0xE5, 0xDE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0xC8, 0x02, 0xD5, 0xC0, 0xE0, 0xA0, 0xE0, 0xC1, 0xE0, 0xA0, 0xE0, + 0x38, 0x12, 0x00, 0x00, 0x1A, 0x12, 0x00, 0x00, 0x6A, 0x12, 0x00, 0x00, + 0x60, 0x12, 0x00, 0x00, 0x56, 0x12, 0x00, 0x00, 0x1A, 0x12, 0x00, 0x00, + 0x4C, 0x12, 0x00, 0x00, 0x42, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0E, 0xE4, 0x20, 0x00, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, + 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x0E, 0xE4, 0x7A, 0x00, + 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, + 0x70, 0xE4, 0x90, 0xE1, 0x0E, 0xE4, 0x81, 0x00, 0x70, 0xE4, 0x90, 0xE1, + 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, + 0x70, 0xE4, 0x90, 0xE1, 0x68, 0xE1, 0x00, 0xA2, 0xC2, 0xE0, 0x7F, 0x00, + 0x1E, 0xE4, 0x54, 0x00, 0x71, 0xD0, 0x2F, 0x04, 0x81, 0xE1, 0x6A, 0xE1, + 0x00, 0xC0, 0xC0, 0xE0, 0x41, 0x00, 0x04, 0xE4, 0x2B, 0x00, 0x05, 0xE0, + 0x00, 0x00, 0xC0, 0xE0, 0x41, 0x00, 0x00, 0xA1, 0x0A, 0xE4, 0x38, 0x00, + 0x05, 0xE0, 0x00, 0x18, 0x13, 0x3E, 0x1E, 0xE4, 0x43, 0x00, 0x1E, 0xE4, + 0x54, 0x00, 0x00, 0xA2, 0xC2, 0xE0, 0x0C, 0x00, 0x1C, 0x3C, 0x0E, 0xE4, + 0x99, 0x02, 0xC1, 0xE0, 0x44, 0x00, 0x11, 0xAE, 0x13, 0xA9, 0x28, 0xCA, + 0xF8, 0xF7, 0xC0, 0xE0, 0x43, 0x00, 0x13, 0x08, 0x20, 0xCE, 0x11, 0xD1, + 0x00, 0x00, 0x12, 0xD1, 0x00, 0x0C, 0x27, 0xCE, 0xE1, 0xE1, 0x2E, 0xE4, + 0x00, 0xA2, 0x01, 0xC4, 0x88, 0xE1, 0xFF, 0x05, 0x11, 0x3D, 0x2E, 0xE4, + 0x00, 0xA2, 0xC1, 0xE0, 0x7F, 0x00, 0x2B, 0xE4, 0x02, 0xA2, 0xC2, 0xE0, + 0x0C, 0x00, 0x00, 0xA2, 0x22, 0xD0, 0x0F, 0x00, 0x84, 0xE1, 0x68, 0x00, + 0x02, 0xA0, 0x03, 0xAF, 0x2B, 0xE4, 0x00, 0xA2, 0x00, 0xA2, 0xC2, 0xE0, + 0x0C, 0x00, 0x2E, 0xE4, 0xC1, 0xE0, 0x07, 0x00, 0x51, 0xE0, 0x2B, 0xE4, + 0xC1, 0xE0, 0x05, 0x00, 0x55, 0xE0, 0xC3, 0xE0, 0x05, 0x00, 0x03, 0xA2, + 0x01, 0xCE, 0x2E, 0xE4, 0xC0, 0xE0, 0x41, 0x00, 0x02, 0xA1, 0x08, 0xE4, + 0x07, 0x01, 0x0E, 0xE4, 0x5E, 0x01, 0xC0, 0xE0, 0x41, 0x00, 0x02, 0xA1, + 0x08, 0xE4, 0x16, 0x01, 0x0E, 0xE4, 0x64, 0x01, 0x0A, 0xE0, 0x00, 0x80, + 0xC2, 0xE0, 0xC0, 0x00, 0xC0, 0xE0, 0xC2, 0x00, 0x02, 0xA8, 0xDA, 0xF7, + 0xC0, 0xE0, 0xC1, 0x00, 0x2E, 0xE4, 0xC3, 0xE0, 0xC1, 0x00, 0xC2, 0xE0, + 0xC0, 0x00, 0xC0, 0xE0, 0xC2, 0x00, 0x02, 0xA8, 0xDA, 0xF7, 0x2E, 0xE4, + 0x12, 0x3C, 0x2E, 0xE4, 0x12, 0x2A, 0x6B, 0xF0, 0xC2, 0xE0, 0xC1, 0x00, + 0xC3, 0xE0, 0xC0, 0x00, 0x3E, 0xF0, 0xC2, 0xE0, 0xC1, 0x00, 0xC0, 0xE0, + 0xC2, 0x00, 0x02, 0xA8, 0xDA, 0xF7, 0x2B, 0xE4, 0x01, 0xA2, 0x12, 0x3E, + 0x04, 0xA2, 0xC2, 0xE0, 0xC2, 0x00, 0x2E, 0xE4, 0x00, 0xA2, 0xC2, 0xE0, + 0xC2, 0x00, 0x2E, 0xE4, 0x04, 0xE0, 0x80, 0x02, 0xC1, 0xE0, 0x46, 0x00, + 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x82, 0x02, 0xC1, 0xE0, 0x46, 0x00, + 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x81, 0x02, 0x01, 0xA2, 0x1E, 0xE4, + 0x93, 0x00, 0x04, 0xE0, 0x83, 0x02, 0x01, 0xA2, 0x1E, 0xE4, 0x93, 0x00, + 0x1E, 0xE4, 0xF7, 0x00, 0x64, 0xE1, 0x00, 0x02, 0xC0, 0xE0, 0x44, 0x00, + 0x06, 0xAE, 0x00, 0xE0, 0x00, 0x03, 0x1E, 0xE4, 0x9C, 0x00, 0xC0, 0xE0, + 0x45, 0x00, 0x02, 0xA1, 0x44, 0xCC, 0x84, 0xE1, 0xED, 0x00, 0x14, 0x2D, + 0x14, 0x49, 0x1E, 0xE4, 0x9E, 0x00, 0x14, 0x2D, 0x14, 0x49, 0x1E, 0xE4, + 0x9E, 0x00, 0x14, 0x2D, 0x14, 0x49, 0x1E, 0xE4, 0x9E, 0x00, 0x14, 0x2D, + 0x14, 0x49, 0x1E, 0xE4, 0x9E, 0x00, 0x90, 0xE1, 0x1E, 0xE4, 0xB2, 0x00, + 0x04, 0xE0, 0x0E, 0x02, 0x03, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0x02, 0xA2, + 0x2E, 0xE4, 0x28, 0xCA, 0xF8, 0xF7, 0x11, 0xD1, 0x00, 0x02, 0xC0, 0xE0, + 0x43, 0x00, 0x20, 0xCE, 0xC0, 0xE0, 0x45, 0x00, 0x08, 0xAE, 0x24, 0xCE, + 0x13, 0xD1, 0x01, 0x00, 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, 0x7F, 0xC8, + 0x00, 0xA2, 0x7E, 0xCC, 0x80, 0xCC, 0x62, 0xC8, 0x1E, 0xA8, 0x48, 0xF0, + 0x02, 0xA2, 0x7E, 0xCC, 0x80, 0xCC, 0x00, 0xA2, 0x7A, 0xCC, 0x7F, 0xCC, + 0x81, 0xCC, 0x70, 0xE4, 0x02, 0xA2, 0x4A, 0xCE, 0x4E, 0xCA, 0x0B, 0x10, + 0x0C, 0x1C, 0x48, 0xF0, 0x07, 0x28, 0x48, 0xF0, 0x3E, 0xF0, 0x1E, 0xE4, + 0x22, 0x01, 0x70, 0xE4, 0x42, 0xCA, 0x0D, 0x3C, 0x00, 0xA2, 0x42, 0xCE, + 0x4C, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, 0x1E, 0xE4, 0x35, 0x01, 0x47, 0xCE, + 0x40, 0xCE, 0x06, 0x28, 0x48, 0xCE, 0x4C, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, + 0x0D, 0x28, 0x42, 0xCE, 0x2E, 0xE4, 0x4E, 0xCA, 0x04, 0x10, 0x05, 0x1C, + 0x5A, 0xF1, 0x0B, 0x26, 0x0C, 0x4E, 0x02, 0x16, 0x03, 0x1E, 0x4B, 0xF0, + 0x00, 0xA2, 0x4C, 0xCE, 0x4E, 0xF0, 0x07, 0x28, 0x04, 0xAE, 0x4C, 0xCE, + 0x09, 0x24, 0x0A, 0x4C, 0x44, 0xCE, 0x4E, 0xCE, 0x04, 0x26, 0x05, 0x4E, + 0x04, 0xE0, 0x62, 0x00, 0x2E, 0xE4, 0x02, 0x24, 0x03, 0x4C, 0x44, 0xCE, + 0x4E, 0xCE, 0x09, 0x34, 0x0A, 0x3C, 0x0B, 0x26, 0x0C, 0x4E, 0x07, 0x28, + 0x04, 0xAE, 0x4C, 0xCE, 0x44, 0xA2, 0x2E, 0xE4, 0x6B, 0xE1, 0x05, 0xE0, + 0xFF, 0xFF, 0x2E, 0xE4, 0x43, 0xD0, 0x02, 0x00, 0x88, 0xC8, 0x02, 0xA8, + 0xE8, 0xF7, 0x70, 0xE4, 0x31, 0xD1, 0x02, 0x00, 0x08, 0x28, 0xB8, 0xF0, + 0x02, 0x24, 0x03, 0x4C, 0x00, 0xE0, 0x00, 0x02, 0x6C, 0xCE, 0x31, 0xD1, + 0x04, 0x00, 0x02, 0xA2, 0x1F, 0x3C, 0x70, 0xE4, 0x74, 0xCA, 0xC2, 0xE0, + 0x78, 0x00, 0x04, 0xE0, 0x40, 0x00, 0xC1, 0xE0, 0x05, 0x00, 0x55, 0xE0, + 0xC3, 0xE0, 0x05, 0x00, 0x00, 0xD1, 0x01, 0x00, 0xC1, 0xE0, 0x05, 0x00, + 0x81, 0xA8, 0xD9, 0xF7, 0xC0, 0xE0, 0x49, 0x00, 0x6C, 0xCE, 0x15, 0x34, + 0x16, 0x3C, 0x31, 0xD1, 0x05, 0x00, 0x70, 0xE4, 0xC0, 0xE0, 0x47, 0x00, + 0x08, 0xAF, 0x02, 0xA8, 0x08, 0x30, 0xC0, 0xE0, 0x47, 0x00, 0x0A, 0xAF, + 0x17, 0x3C, 0x72, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, 0x33, 0xD1, 0x00, 0x00, + 0x30, 0xD1, 0x01, 0x00, 0x72, 0xCA, 0x04, 0xA8, 0xE8, 0xF7, 0xC0, 0xE0, + 0x47, 0x00, 0x1E, 0xA8, 0x70, 0xCE, 0xC0, 0xE0, 0x45, 0x00, 0x02, 0x34, + 0x03, 0x3C, 0x02, 0x24, 0x03, 0x4C, 0x68, 0xCE, 0xC1, 0xE0, 0x46, 0x00, + 0x04, 0x36, 0x05, 0x3E, 0x04, 0x26, 0x05, 0x4E, 0x6F, 0xCE, 0x08, 0x28, + 0x3A, 0xF0, 0xC1, 0xE0, 0x49, 0x00, 0x6D, 0xCE, 0x15, 0x36, 0x16, 0x3E, + 0xC0, 0xE0, 0x48, 0x00, 0x09, 0x34, 0x0A, 0x3C, 0x09, 0x24, 0x0A, 0x4C, + 0x6A, 0xCE, 0x02, 0xA2, 0xC4, 0xCE, 0x84, 0xCC, 0x86, 0xCC, 0x66, 0xCE, + 0x62, 0xCE, 0x2E, 0xE4, 0x02, 0xA2, 0x84, 0xCC, 0x73, 0xCA, 0x03, 0xA8, + 0xE9, 0xF7, 0x66, 0xCE, 0x2E, 0xE4, 0x90, 0xC8, 0x0E, 0xA8, 0x2A, 0xE4, + 0x11, 0xA2, 0x45, 0xE0, 0x13, 0x3E, 0x00, 0xA2, 0x13, 0x70, 0x2E, 0xE4, + 0x1D, 0x34, 0x1E, 0x3C, 0x20, 0xAF, 0x1F, 0xA2, 0x02, 0xAF, 0x03, 0xA0, + 0xE8, 0xF7, 0x13, 0x3E, 0x00, 0xA2, 0x13, 0x70, 0x02, 0xA0, 0x13, 0x3C, + 0x1D, 0x20, 0x1E, 0x4C, 0x02, 0xA0, 0x13, 0x70, 0x2E, 0xE4, 0x72, 0xCA, + 0x02, 0xA8, 0xE8, 0xF7, 0x33, 0xD1, 0x00, 0x00, 0x32, 0xD1, 0x01, 0x00, + 0x2E, 0xE4, 0x72, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, 0x1E, 0xE4, 0xCB, 0x01, + 0x47, 0xD0, 0x01, 0x00, 0x77, 0xCA, 0x03, 0xA8, 0xEB, 0xF7, 0x63, 0xD1, + 0x01, 0x00, 0xC6, 0xCA, 0x04, 0xA8, 0xE8, 0xF7, 0x1E, 0xE4, 0xE5, 0x01, + 0x72, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, 0x2E, 0xE4, 0xC0, 0xE0, 0x44, 0x00, + 0xC1, 0xE0, 0x45, 0x00, 0x46, 0xE0, 0x92, 0xF2, 0xC0, 0xE0, 0x44, 0x00, + 0x02, 0x34, 0x03, 0x3C, 0xC0, 0xE0, 0x45, 0x00, 0x04, 0x34, 0x05, 0x3C, + 0xC0, 0xE0, 0x46, 0x00, 0x49, 0xE0, 0x1E, 0xA8, 0x06, 0x3C, 0x4A, 0xE0, + 0x0A, 0xAF, 0x08, 0x30, 0x2E, 0xE4, 0x0E, 0x28, 0x02, 0xAE, 0x00, 0xE0, + 0x1E, 0x02, 0x7C, 0xE6, 0x0E, 0xE4, 0x32, 0x02, 0x0E, 0xE4, 0x46, 0x02, + 0x0E, 0xE4, 0x5A, 0x02, 0x0E, 0xE4, 0x61, 0x02, 0x0E, 0xE4, 0x6B, 0x02, + 0x2E, 0xE4, 0x08, 0x28, 0x6A, 0xF0, 0x1E, 0xE4, 0x22, 0x01, 0x04, 0xA2, + 0x0E, 0x3C, 0xBE, 0xF2, 0x6B, 0xE1, 0x2E, 0xE4, 0x04, 0xA2, 0x80, 0xCE, + 0xC0, 0xE0, 0x43, 0x00, 0x09, 0x34, 0x0A, 0x3C, 0xC1, 0xE0, 0x44, 0x00, + 0x0B, 0x36, 0x0C, 0x3E, 0x45, 0xE0, 0xC5, 0xF6, 0xC0, 0xE0, 0x46, 0x00, + 0x08, 0xAF, 0x07, 0x3C, 0x00, 0xA2, 0x42, 0xCE, 0x02, 0xA2, 0x0E, 0x3C, + 0x4C, 0xCA, 0x02, 0xA8, 0x28, 0xE4, 0x09, 0x24, 0x0A, 0x4C, 0x44, 0xCE, + 0x4E, 0xCE, 0x0B, 0x24, 0x0C, 0x4C, 0x46, 0xCE, 0x06, 0x28, 0x48, 0xCE, + 0x07, 0x28, 0x04, 0xAE, 0x4C, 0xCE, 0x04, 0xE0, 0x62, 0x00, 0x40, 0xCE, + 0x04, 0xA2, 0x0E, 0x3C, 0x4C, 0xCA, 0x02, 0xA8, 0x28, 0xE4, 0x02, 0xA2, + 0x80, 0xCE, 0x06, 0xA2, 0x0E, 0x3C, 0x86, 0xCA, 0x02, 0xA8, 0x28, 0xE4, + 0x02, 0xA2, 0x42, 0xCE, 0x28, 0xE1, 0x02, 0xA2, 0x7A, 0xCC, 0x08, 0xA2, + 0x0E, 0x3C, 0x62, 0xC8, 0x02, 0xA8, 0x28, 0xE4, 0x14, 0x74, 0x00, 0xA2, + 0x0E, 0x3C, 0x2E, 0xE4, 0xC0, 0xE0, 0x42, 0x00, 0x6A, 0xF0, 0x02, 0xA1, + 0x1A, 0xF1, 0x02, 0xA1, 0x5A, 0xF1, 0x7E, 0xF1, 0x04, 0xE0, 0x14, 0x02, + 0x1E, 0xE4, 0x88, 0x00, 0xC2, 0xE0, 0x69, 0x00, 0x04, 0xE0, 0x11, 0x02, + 0x1E, 0xE4, 0x88, 0x00, 0xC2, 0xE0, 0x6A, 0x00, 0xAE, 0xF0, 0xC0, 0xE0, + 0x43, 0x00, 0x1E, 0xE4, 0xAC, 0x03, 0x2A, 0xE4, 0x4E, 0xF0, 0x1E, 0xE4, + 0xA5, 0x03, 0x2A, 0xE4, 0x00, 0xA2, 0xC2, 0xE0, 0x7E, 0x00, 0xC0, 0xE0, + 0x42, 0x00, 0xC2, 0xE0, 0x68, 0x00, 0x02, 0xA2, 0x2E, 0xE4, 0x1E, 0xE4, + 0xA3, 0x02, 0x1C, 0x28, 0x08, 0xE4, 0x2B, 0x00, 0x23, 0x28, 0x3A, 0xF0, + 0x1E, 0xE4, 0xED, 0x02, 0x7E, 0xF7, 0x00, 0x28, 0x00, 0xE0, 0xA7, 0x02, + 0x7C, 0xE6, 0x1E, 0xF1, 0x4E, 0xF1, 0x7E, 0xF1, 0xAE, 0xF1, 0xDE, 0xF1, + 0x5E, 0xF3, 0x4E, 0xF3, 0x3E, 0xF3, 0x2E, 0xF3, 0xCE, 0xF1, 0x0E, 0xF3, + 0xFE, 0xF2, 0xEE, 0xF2, 0x2E, 0xF2, 0xCE, 0xF2, 0x7E, 0xF2, 0x6E, 0xF2, + 0x1E, 0xE4, 0x5A, 0x00, 0x00, 0x3C, 0x2E, 0xE4, 0x1E, 0xE4, 0xB6, 0x00, + 0x2A, 0xE4, 0x2E, 0xF2, 0x1E, 0xE4, 0xC1, 0x03, 0x2A, 0xE4, 0xEE, 0xF1, + 0x1E, 0xE4, 0x5C, 0x05, 0x2A, 0xE4, 0xAE, 0xF1, 0x1E, 0xE4, 0x07, 0x08, + 0x2A, 0xE4, 0x6E, 0xF1, 0x00, 0xA2, 0xC2, 0xE0, 0x7F, 0x00, 0xC0, 0xE0, + 0x41, 0x00, 0x00, 0xA1, 0xFA, 0xF0, 0x02, 0xA2, 0x1C, 0x3C, 0x2E, 0xE4, + 0xC1, 0xE0, 0x76, 0x00, 0x04, 0xE0, 0x7C, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x5E, 0xF0, 0x1E, 0xE4, 0x72, 0x02, 0x2A, 0xE4, 0x1E, 0xF0, 0xC0, 0xE0, + 0x7F, 0x00, 0x1E, 0xE4, 0x6E, 0x00, 0x00, 0xA2, 0x00, 0x3C, 0xC2, 0xE0, + 0x7F, 0x00, 0x00, 0xA2, 0xC2, 0xE0, 0x0C, 0x00, 0x2E, 0xE4, 0x1E, 0xCB, + 0x28, 0xE4, 0x3C, 0x28, 0x08, 0xE4, 0x42, 0x03, 0x3D, 0x28, 0x9A, 0xE0, + 0x15, 0x29, 0x2A, 0xE4, 0x3F, 0x28, 0xC4, 0xF0, 0xD0, 0xCB, 0xC2, 0xE0, + 0x70, 0x00, 0x1E, 0xE4, 0x6A, 0x03, 0x1E, 0xE4, 0xAC, 0x07, 0x22, 0x28, + 0x3A, 0xF0, 0x1E, 0xE4, 0xEF, 0x07, 0x4B, 0x2A, 0xBB, 0xF0, 0x26, 0x28, + 0x04, 0xA1, 0x8A, 0xF0, 0x36, 0x2A, 0x05, 0xA1, 0x59, 0xF0, 0x39, 0x2A, + 0x39, 0xF0, 0x1E, 0xE4, 0x4E, 0x06, 0x22, 0x28, 0x3A, 0xF0, 0x3E, 0x2A, + 0x87, 0xCF, 0x02, 0xA2, 0x1E, 0xCF, 0x3C, 0x3C, 0x3D, 0x2A, 0x05, 0xA0, + 0x9B, 0xE0, 0x83, 0xCB, 0x4A, 0xE0, 0x15, 0x17, 0x15, 0x1F, 0x3F, 0x3E, + 0x08, 0xE0, 0xFF, 0x7F, 0x58, 0xF0, 0x36, 0x3C, 0x52, 0x28, 0x16, 0xE0, + 0x52, 0x30, 0x79, 0xF0, 0x3B, 0x28, 0x16, 0xE0, 0x3B, 0x3C, 0x11, 0x28, + 0x16, 0xE0, 0x11, 0x3C, 0xC4, 0xD1, 0x02, 0x00, 0x82, 0xCB, 0x08, 0xE0, + 0xFF, 0x07, 0xD8, 0xF0, 0x28, 0x28, 0x1E, 0xA8, 0xA4, 0xCC, 0x37, 0x82, + 0x19, 0xE0, 0x31, 0x5A, 0x34, 0x06, 0x35, 0x0E, 0x34, 0x36, 0x35, 0x3E, + 0x00, 0xA2, 0x33, 0x3C, 0x22, 0x28, 0x3A, 0xF0, 0x1E, 0xE4, 0xEF, 0x07, + 0x1E, 0xCB, 0x28, 0xE4, 0x00, 0xA2, 0x3C, 0x3C, 0x36, 0x2A, 0x03, 0xA0, + 0x36, 0x3E, 0x3F, 0x2A, 0x09, 0xE4, 0xED, 0x02, 0x6A, 0xE1, 0x00, 0xA2, + 0x24, 0xCF, 0x3D, 0x28, 0x9A, 0xE0, 0x00, 0xA2, 0x39, 0x3C, 0x05, 0x3D, + 0x3B, 0x28, 0x05, 0xE0, 0xE0, 0x00, 0xF1, 0xB4, 0x3D, 0x3E, 0x22, 0xCB, + 0xF8, 0xF7, 0x9C, 0xCB, 0xF8, 0xF7, 0x20, 0xCB, 0xF8, 0xF7, 0x82, 0xCB, + 0x08, 0xE0, 0xFF, 0x07, 0x38, 0xF0, 0xCC, 0xCB, 0xF8, 0xF7, 0x9B, 0xE0, + 0x15, 0x2B, 0x09, 0xE4, 0xED, 0x02, 0x2E, 0xE4, 0x3B, 0x28, 0x36, 0xCF, + 0x11, 0x28, 0x82, 0xCC, 0x15, 0x2B, 0x4A, 0xE0, 0x06, 0xA8, 0x3A, 0x3C, + 0x39, 0x28, 0x68, 0xF1, 0x05, 0xAF, 0xEB, 0xF0, 0x03, 0xA1, 0x2B, 0xF1, + 0x03, 0xA1, 0x8B, 0xF0, 0x26, 0x28, 0x04, 0xA1, 0x2A, 0xF0, 0x6E, 0xF0, + 0x08, 0xA2, 0x40, 0xCF, 0x3E, 0xF0, 0x18, 0xA2, 0x40, 0xCF, 0x02, 0xA2, + 0x42, 0xCF, 0x42, 0xCB, 0x08, 0xE0, 0x00, 0x80, 0xDA, 0xF7, 0x3D, 0x2A, + 0x09, 0xA0, 0x9B, 0xE0, 0x15, 0x27, 0x15, 0x4F, 0x83, 0xCF, 0x2E, 0xE4, + 0xA4, 0xCF, 0x0A, 0xA2, 0x9E, 0xCF, 0x9E, 0xCB, 0x02, 0xA8, 0xE8, 0xF7, + 0xA1, 0xCB, 0xA2, 0xCB, 0x2E, 0xE4, 0x14, 0x21, 0x14, 0x4D, 0xA0, 0xCF, + 0x14, 0x21, 0x14, 0x4D, 0xA2, 0xCF, 0x0E, 0xA2, 0x9E, 0xCF, 0x9E, 0xCB, + 0x02, 0xA8, 0xE8, 0xF7, 0x2E, 0xE4, 0x02, 0xA2, 0x1E, 0xE4, 0x88, 0x00, + 0x08, 0xE0, 0x01, 0x30, 0x16, 0xE0, 0x2E, 0xE4, 0x13, 0x3C, 0x02, 0xA2, + 0x1E, 0xE4, 0x88, 0x00, 0x02, 0xA8, 0x16, 0xE0, 0x28, 0xE4, 0x04, 0xE0, + 0x39, 0x00, 0x1E, 0xE4, 0x88, 0x00, 0x49, 0xE0, 0x06, 0xA8, 0x13, 0x18, + 0x1A, 0xE0, 0x05, 0xAF, 0x07, 0xA8, 0x13, 0x1A, 0x1B, 0xE0, 0x52, 0xE0, + 0x2E, 0xE4, 0x65, 0xE1, 0xE0, 0x00, 0x05, 0x29, 0x16, 0xE0, 0x2A, 0xE4, + 0x65, 0xE1, 0xE7, 0x00, 0x05, 0x29, 0x16, 0xE0, 0x2A, 0xE4, 0xC0, 0xE0, + 0x49, 0x00, 0x28, 0xAF, 0x0E, 0xA8, 0x23, 0x3C, 0xC0, 0xE0, 0x47, 0x00, + 0x20, 0x3C, 0x21, 0x34, 0xC0, 0xE0, 0x5F, 0x00, 0x50, 0x34, 0x51, 0x3C, + 0xC1, 0xE0, 0x43, 0x00, 0x27, 0x32, 0x4A, 0xE0, 0x04, 0xAF, 0x28, 0x3C, + 0x7F, 0xA8, 0x40, 0x4A, 0x27, 0x28, 0x28, 0xF0, 0x01, 0xA2, 0xC1, 0xCF, + 0xC0, 0xE0, 0x43, 0x00, 0x02, 0xAF, 0x52, 0x30, 0x1E, 0xE4, 0x13, 0x04, + 0x1E, 0xE4, 0x4B, 0x04, 0x1E, 0xE4, 0x08, 0x05, 0xFE, 0xA2, 0x43, 0x3C, + 0x00, 0xA2, 0x3F, 0x3C, 0x49, 0x3C, 0x3B, 0x3C, 0x4A, 0x3C, 0x11, 0x3C, + 0x10, 0x3C, 0x3C, 0x3C, 0x36, 0x3C, 0x33, 0x3C, 0x32, 0x3C, 0x04, 0xE0, + 0xE0, 0x00, 0x3D, 0x3C, 0x20, 0x2A, 0x02, 0xA2, 0x23, 0x58, 0x42, 0xE0, + 0x02, 0xA1, 0x23, 0x5C, 0x26, 0x3C, 0x1E, 0xE4, 0x21, 0x07, 0xC4, 0xD1, + 0x1C, 0x00, 0x1E, 0xE4, 0x02, 0x02, 0x02, 0xA2, 0x42, 0x3C, 0x27, 0x28, + 0x3A, 0xF0, 0xCE, 0xCB, 0xF8, 0xF7, 0x02, 0xA2, 0x2E, 0xE4, 0xC0, 0xE0, + 0x49, 0x00, 0x00, 0xCF, 0xC0, 0xE0, 0x4A, 0x00, 0x04, 0xCF, 0xC0, 0xE0, + 0x4B, 0x00, 0x1E, 0xA8, 0x60, 0xCF, 0xC0, 0xE0, 0x47, 0x00, 0x80, 0xCF, + 0xC0, 0xE0, 0x5C, 0x00, 0x08, 0xCF, 0xC0, 0xE0, 0x48, 0x00, 0x02, 0xCF, + 0x02, 0xAF, 0x4B, 0x30, 0x02, 0xAF, 0x22, 0x30, 0xC0, 0xE0, 0x4C, 0x00, + 0x06, 0xCF, 0xC0, 0xE0, 0x60, 0x00, 0x24, 0x34, 0x25, 0x3C, 0xC0, 0xE0, + 0x61, 0x00, 0x02, 0xA8, 0x20, 0xAE, 0xC2, 0xCF, 0x23, 0x28, 0x08, 0xA1, + 0x2A, 0xF0, 0x02, 0xA2, 0x23, 0x08, 0x36, 0xAE, 0x03, 0xA2, 0x2F, 0xAE, + 0x56, 0xE0, 0x04, 0xA9, 0x26, 0xCF, 0x94, 0xD1, 0x00, 0x00, 0x02, 0xA2, + 0x28, 0xAE, 0x2C, 0xCF, 0x97, 0xD1, 0x00, 0x00, 0x98, 0xD1, 0x00, 0x00, + 0x2E, 0xE4, 0x01, 0xA2, 0x04, 0xE0, 0xC2, 0x02, 0x1E, 0xE4, 0x93, 0x00, + 0xC1, 0xE0, 0x49, 0x00, 0x4A, 0xE0, 0x32, 0xAF, 0x20, 0xA8, 0x1F, 0xA8, + 0x55, 0xE0, 0x12, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x49, 0x00, + 0x19, 0xA8, 0x04, 0xE0, 0xC4, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0x03, 0xA2, + 0x58, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x4B, 0x00, 0x04, 0xE0, + 0x50, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x62, 0x00, 0x48, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5D, 0x00, 0x4C, 0xA2, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x48, 0x00, 0x35, 0xAF, 0x03, 0xA8, 0x20, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x48, 0x00, 0x33, 0xAF, 0x03, 0xA8, + 0x30, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x49, 0x00, 0x29, 0xAF, + 0x07, 0xA8, 0x06, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x47, 0x00, + 0x08, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x67, 0x00, 0x04, 0xE0, + 0x61, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x68, 0x00, 0x04, 0xE0, + 0x62, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x69, 0x00, 0x04, 0xE0, + 0x63, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x6F, 0x00, 0x09, 0xE0, + 0x0F, 0x00, 0x04, 0xE0, 0x64, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, + 0x6A, 0x00, 0x04, 0xE0, 0x60, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, + 0x6B, 0x00, 0x42, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x6C, 0x00, + 0x46, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x6D, 0x00, 0x40, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x6E, 0x00, 0x44, 0xA2, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x6F, 0x00, 0x09, 0xE0, 0x00, 0x0F, 0x04, 0xE0, + 0xCA, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x64, 0x00, 0x4A, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0x01, 0xA2, 0x50, 0xA2, 0x1E, 0xE4, 0x93, 0x00, + 0x21, 0x2A, 0x03, 0xA1, 0x21, 0xAE, 0x20, 0x4E, 0x03, 0xA1, 0x52, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0x01, 0xA2, 0x54, 0xA2, 0x1E, 0xE4, 0x93, 0x00, + 0x21, 0x2A, 0x03, 0xA1, 0x21, 0xAE, 0x20, 0x4E, 0x03, 0xA1, 0x56, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x61, 0x00, 0x03, 0xAF, 0x03, 0xAE, + 0x09, 0xA9, 0x04, 0xE0, 0x0C, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, + 0x61, 0x00, 0x03, 0xAF, 0x03, 0xAE, 0x09, 0xA9, 0x04, 0xE0, 0x0D, 0x02, + 0x1E, 0xE4, 0x93, 0x00, 0xC0, 0xE0, 0x48, 0x00, 0x34, 0xAF, 0x02, 0xA8, + 0x18, 0xE4, 0x31, 0x05, 0x14, 0xA2, 0xC1, 0xE0, 0x43, 0x00, 0x09, 0xE0, + 0xFF, 0x05, 0x1E, 0xE4, 0x93, 0x00, 0x2E, 0xE4, 0x0E, 0xA2, 0x01, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0x10, 0xA2, 0x01, 0xA2, 0x1E, 0xE4, 0x93, 0x00, + 0x0A, 0xA2, 0xC1, 0xE0, 0x47, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x0C, 0xA2, + 0xC1, 0xE0, 0x47, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x1E, 0xE4, 0x21, 0x05, + 0x00, 0xA2, 0x05, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0x2E, 0xE4, 0x01, 0xA2, + 0x50, 0xA2, 0x1E, 0xE4, 0x93, 0x00, 0x00, 0xA2, 0xC1, 0xE0, 0x47, 0x00, + 0x41, 0xE0, 0x02, 0xA2, 0x20, 0xAE, 0x02, 0xA9, 0x45, 0xE0, 0x52, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0x2E, 0xE4, 0x28, 0xCA, 0xF8, 0xF7, 0x11, 0xD1, + 0x00, 0x02, 0xC0, 0xE0, 0x5E, 0x00, 0x20, 0xCE, 0x12, 0xD1, 0x00, 0x02, + 0x13, 0xD1, 0x01, 0x00, 0x28, 0xCA, 0xF8, 0xF7, 0x64, 0xE1, 0x00, 0x02, + 0x14, 0x23, 0x14, 0x4F, 0x04, 0xE0, 0x11, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x14, 0x23, 0x14, 0x4F, 0x04, 0xE0, 0x12, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x00, 0x01, 0x1E, 0xE4, 0x9C, 0x00, 0x22, 0xD0, 0xF7, 0x00, + 0x84, 0xE1, 0x58, 0x05, 0x14, 0x21, 0x14, 0x4D, 0x1E, 0xE4, 0x9E, 0x00, + 0x90, 0xE1, 0x1E, 0xE4, 0xB2, 0x00, 0x2E, 0xE4, 0x49, 0x2A, 0x04, 0xE0, + 0xE0, 0x00, 0xF2, 0xB4, 0x9C, 0xE0, 0x06, 0x29, 0x16, 0xE0, 0x2A, 0xE4, + 0x01, 0x28, 0x02, 0xAE, 0x00, 0xE0, 0x69, 0x05, 0x7C, 0xE6, 0x2E, 0xF1, + 0x90, 0xE1, 0xEE, 0xF1, 0x90, 0xE1, 0x6E, 0xF2, 0x90, 0xE1, 0x0E, 0xE4, + 0xBC, 0x05, 0x0E, 0xE4, 0xCA, 0x05, 0x0E, 0xE4, 0xCE, 0x05, 0x0E, 0xE4, + 0xE8, 0x05, 0x0E, 0xE4, 0xF4, 0x05, 0x0E, 0xE4, 0x04, 0x06, 0x49, 0x28, + 0x38, 0xCF, 0x4A, 0x28, 0x5A, 0xCF, 0x58, 0xCF, 0xC0, 0xE0, 0x45, 0x00, + 0x14, 0x3C, 0x1E, 0xE4, 0x63, 0x06, 0x02, 0xA2, 0x01, 0x3C, 0x00, 0xA2, + 0x2E, 0xE4, 0x4D, 0x28, 0x8A, 0xF3, 0x04, 0xA1, 0x0A, 0xE4, 0xCE, 0x05, + 0x4C, 0x28, 0x0A, 0xE4, 0xCE, 0x05, 0x04, 0xA2, 0x01, 0x3C, 0x28, 0xCA, + 0x16, 0xE0, 0x2A, 0xE4, 0x4D, 0x28, 0x02, 0xA1, 0x0A, 0xF2, 0x26, 0x28, + 0x04, 0xA1, 0x3A, 0xF3, 0x27, 0x28, 0x4A, 0xF1, 0x3F, 0x2A, 0x00, 0xA2, + 0x29, 0xE4, 0xD1, 0xCB, 0x4A, 0xE0, 0x1C, 0xAF, 0x02, 0xA8, 0x2A, 0xE4, + 0x4A, 0xE0, 0x1E, 0xAF, 0x02, 0xA8, 0x52, 0x54, 0xB8, 0xF0, 0x09, 0xE0, + 0xFF, 0x07, 0x03, 0xA1, 0x71, 0xF0, 0x00, 0xA2, 0x2E, 0xE4, 0x36, 0x2A, + 0x05, 0xA1, 0x00, 0xA2, 0x25, 0xE4, 0x1E, 0xE4, 0x38, 0x06, 0x3E, 0xF0, + 0x1E, 0xE4, 0x43, 0x06, 0x06, 0xA2, 0x01, 0x3C, 0x28, 0xCA, 0x16, 0xE0, + 0x2A, 0xE4, 0x0A, 0xA2, 0x01, 0x3C, 0xDE, 0xF0, 0xC0, 0xE0, 0x4C, 0x00, + 0x14, 0xAF, 0x04, 0xA8, 0x02, 0xA9, 0x40, 0xCF, 0x08, 0xA2, 0x01, 0x3C, + 0x40, 0xCB, 0x08, 0xE0, 0x00, 0x80, 0x2A, 0xE4, 0x0A, 0xA2, 0x01, 0x3C, + 0x3F, 0x20, 0x3C, 0x4C, 0xDA, 0xF0, 0x4C, 0xCA, 0x02, 0xA8, 0x16, 0xE0, + 0x2A, 0xE4, 0x4C, 0xCA, 0x08, 0xA8, 0x2A, 0xE4, 0x4E, 0xCA, 0x47, 0xCA, + 0x46, 0xE0, 0x16, 0xE0, 0x2A, 0xE4, 0x10, 0x28, 0x52, 0xCE, 0x60, 0xCE, + 0xC0, 0xCE, 0xC2, 0xCE, 0x7E, 0xCC, 0x80, 0xCC, 0x0C, 0xA2, 0x01, 0x3C, + 0x1E, 0xE4, 0x19, 0x02, 0x0E, 0x28, 0x16, 0xE0, 0x2A, 0xE4, 0x10, 0x28, + 0x16, 0xE0, 0x10, 0x3C, 0x0E, 0xA2, 0x01, 0x3C, 0x00, 0xA2, 0x2E, 0xE4, + 0x1E, 0xE4, 0x97, 0x06, 0xC0, 0xE0, 0x4C, 0x00, 0x14, 0xAF, 0x44, 0x30, + 0x44, 0x28, 0x43, 0x18, 0x0A, 0xE4, 0x13, 0x06, 0x43, 0x28, 0x44, 0x2A, + 0x43, 0x3E, 0x04, 0xF1, 0x10, 0xA2, 0x01, 0x3C, 0x04, 0xE0, 0x39, 0x00, + 0x1E, 0xE4, 0x88, 0x00, 0x49, 0xE0, 0x02, 0xA8, 0x44, 0x18, 0x2A, 0xE4, + 0x05, 0xAF, 0x03, 0xA8, 0x44, 0x1A, 0x00, 0xA2, 0x2B, 0xE4, 0x1E, 0xE4, + 0xD6, 0x06, 0x42, 0x28, 0x8A, 0xF0, 0x04, 0xE0, 0x00, 0x00, 0x03, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0x00, 0xA2, 0x42, 0x3C, 0x00, 0xA2, 0x01, 0x3C, + 0x02, 0xA2, 0x16, 0x3D, 0x4D, 0x28, 0x04, 0xAE, 0x41, 0x4C, 0x16, 0x3D, + 0xC0, 0xE0, 0x48, 0x00, 0x16, 0x35, 0x16, 0x3D, 0xC0, 0xE0, 0x47, 0x00, + 0x16, 0x35, 0x16, 0x3D, 0xC0, 0xE0, 0x49, 0x00, 0x1E, 0xA8, 0x06, 0x3D, + 0x4A, 0x28, 0x16, 0xE0, 0x4A, 0x3C, 0x49, 0x28, 0x16, 0xE0, 0x49, 0x3C, + 0x02, 0xA2, 0x2E, 0xE4, 0x00, 0xA2, 0x4C, 0xCF, 0x22, 0xCE, 0x50, 0x24, + 0x51, 0x4C, 0x20, 0xCE, 0x12, 0xD1, 0x28, 0x00, 0x13, 0xD1, 0x13, 0x00, + 0x2E, 0xE4, 0x00, 0xA2, 0x4C, 0xCF, 0x22, 0xCE, 0xC0, 0xE0, 0x4B, 0x00, + 0x20, 0xCE, 0x12, 0xD1, 0x28, 0x00, 0x13, 0xD1, 0x13, 0x00, 0x2E, 0xE4, + 0x3B, 0x28, 0x58, 0xCF, 0x28, 0xCA, 0xF8, 0xF7, 0x00, 0xA2, 0x4C, 0xCF, + 0x22, 0xCE, 0x50, 0x24, 0x51, 0x4C, 0x20, 0xCE, 0x12, 0xD1, 0x28, 0x00, + 0x13, 0xD1, 0x12, 0x00, 0x28, 0xCA, 0xF8, 0xF7, 0x2C, 0xCA, 0xFA, 0xF7, + 0x4A, 0x28, 0x58, 0xCF, 0x2E, 0xE4, 0xC0, 0xE0, 0x4C, 0x00, 0x0A, 0xCF, + 0x3C, 0xAF, 0x06, 0xA8, 0x41, 0x3C, 0xC0, 0xE0, 0x4D, 0x00, 0x0C, 0xCF, + 0xC0, 0xE0, 0x49, 0x00, 0x05, 0xE0, 0x7F, 0x00, 0x33, 0xAE, 0x51, 0xE0, + 0x4C, 0x30, 0x08, 0xAF, 0x06, 0xA8, 0x4D, 0x3C, 0x04, 0xA1, 0x38, 0xF0, + 0x4B, 0x28, 0x28, 0xF0, 0x0F, 0xCF, 0xC0, 0xE0, 0x5A, 0x00, 0x18, 0xCF, + 0xC0, 0xE0, 0x4E, 0x00, 0x12, 0xCF, 0xC0, 0xE0, 0x4F, 0x00, 0x10, 0xCF, + 0xC0, 0xE0, 0x50, 0x00, 0x16, 0xCF, 0xC0, 0xE0, 0x51, 0x00, 0x14, 0xCF, + 0xC0, 0xE0, 0x5B, 0x00, 0x29, 0x34, 0x2A, 0x3C, 0xC0, 0xE0, 0x5D, 0x00, + 0x45, 0x34, 0x46, 0x3C, 0xC0, 0xE0, 0x5E, 0x00, 0x47, 0x34, 0x48, 0x3C, + 0x2E, 0xE4, 0x43, 0x28, 0x22, 0xE4, 0x04, 0xE0, 0x1A, 0x00, 0xC1, 0xE0, + 0x5F, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x19, 0x00, 0xC1, 0xE0, + 0x60, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x53, 0x00, 0xC1, 0xE0, + 0x61, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x52, 0x00, 0xC1, 0xE0, + 0x61, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x55, 0x00, 0xC1, 0xE0, + 0x63, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x54, 0x00, 0xC1, 0xE0, + 0x63, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x5A, 0x00, 0xC1, 0xE0, + 0x62, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x59, 0x00, 0xC1, 0xE0, + 0x62, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x5C, 0x00, 0xC1, 0xE0, + 0x64, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, 0x5B, 0x00, 0xC1, 0xE0, + 0x64, 0x00, 0x1E, 0xE4, 0x93, 0x00, 0x2E, 0xE4, 0x41, 0x28, 0x04, 0xA1, + 0x2A, 0xE4, 0x04, 0xE0, 0x41, 0x00, 0x44, 0x2A, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x4C, 0x00, 0xC1, 0xE0, 0x4D, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x4D, 0x00, 0xC1, 0xE0, 0x65, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x4E, 0x00, 0xC1, 0xE0, 0x66, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x44, 0x00, 0xC1, 0xE0, 0x52, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x45, 0x00, 0xC1, 0xE0, 0x53, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x46, 0x00, 0xC1, 0xE0, 0x54, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x47, 0x00, 0xC1, 0xE0, 0x55, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x48, 0x00, 0xC1, 0xE0, 0x56, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x49, 0x00, 0xC1, 0xE0, 0x57, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x4A, 0x00, 0xC1, 0xE0, 0x58, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x04, 0xE0, 0x4B, 0x00, 0xC1, 0xE0, 0x59, 0x00, 0x1E, 0xE4, 0x93, 0x00, + 0x2E, 0xE4, 0xD2, 0xD1, 0xC6, 0x01, 0x64, 0xE1, 0x4D, 0x00, 0x22, 0xD0, + 0x06, 0x00, 0x84, 0xE1, 0x31, 0x07, 0x14, 0x9E, 0xA0, 0xCF, 0x14, 0x9E, + 0xA2, 0xCF, 0xCF, 0xD1, 0x07, 0x00, 0x9E, 0xCB, 0x02, 0xA8, 0xEA, 0xF7, + 0x14, 0x9E, 0xA0, 0xCF, 0xD1, 0xD1, 0x00, 0x00, 0xCF, 0xD1, 0x07, 0x00, + 0x9E, 0xCB, 0x02, 0xA8, 0xEA, 0xF7, 0x1E, 0xE4, 0xD1, 0x07, 0x00, 0xA2, + 0x2C, 0x3C, 0x23, 0x28, 0x08, 0xA1, 0xDA, 0xF2, 0x02, 0xA1, 0x5A, 0xF1, + 0x58, 0xA2, 0x2B, 0x3C, 0x10, 0xA2, 0x31, 0x3C, 0x26, 0x28, 0x37, 0x3C, + 0x04, 0xE0, 0x84, 0x00, 0x30, 0x3C, 0x04, 0xE0, 0xC6, 0x00, 0x2E, 0x3C, + 0x04, 0xE0, 0x06, 0x01, 0x2F, 0x3C, 0x04, 0xE0, 0x66, 0x01, 0x2D, 0x3C, + 0x0E, 0xE4, 0x84, 0x07, 0x60, 0xA2, 0x2B, 0x3C, 0x0C, 0xA2, 0x31, 0x3C, + 0x26, 0x28, 0x02, 0xA0, 0x08, 0xE0, 0xFE, 0x07, 0x37, 0x3C, 0x04, 0xE0, + 0x90, 0x00, 0x30, 0x3C, 0x04, 0xE0, 0xB4, 0x00, 0x2E, 0x3C, 0x04, 0xE0, + 0xD4, 0x00, 0x2F, 0x3C, 0x04, 0xE0, 0xF4, 0x00, 0x2D, 0x3C, 0x7E, 0xF1, + 0x04, 0xE0, 0x40, 0x00, 0x2B, 0x3C, 0x08, 0xA2, 0x31, 0x3C, 0x26, 0x28, + 0x06, 0xA0, 0x08, 0xE0, 0xFC, 0x07, 0x37, 0x3C, 0x04, 0xE0, 0xC0, 0x00, + 0x30, 0x3C, 0x04, 0xE0, 0xD8, 0x00, 0x2E, 0x3C, 0x04, 0xE0, 0xE8, 0x00, + 0x2F, 0x3C, 0x04, 0xE0, 0xF8, 0x00, 0x2D, 0x3C, 0x30, 0x20, 0x2C, 0x4C, + 0x90, 0xCF, 0x30, 0x28, 0x84, 0xCF, 0x2D, 0x20, 0x2F, 0x4C, 0x8C, 0xCF, + 0x2F, 0x20, 0x2E, 0x4C, 0x8E, 0xCF, 0x2D, 0x28, 0x92, 0xCF, 0x2C, 0x20, + 0x2B, 0x00, 0x2C, 0x4C, 0x96, 0xCF, 0x04, 0xE0, 0xCE, 0x01, 0x20, 0xAE, + 0x0A, 0xE0, 0xC6, 0x01, 0x98, 0xCF, 0x04, 0xE0, 0xD6, 0x01, 0x20, 0xAE, + 0x0A, 0xE0, 0xCE, 0x01, 0x9A, 0xCF, 0x28, 0x28, 0x08, 0xAF, 0x0E, 0xA8, + 0xA4, 0xCC, 0x37, 0x82, 0x18, 0xE0, 0x31, 0x58, 0x80, 0xA0, 0x34, 0x34, + 0x35, 0x3C, 0x2E, 0xE4, 0x29, 0x24, 0x2A, 0x4C, 0x0A, 0xF1, 0x32, 0x28, + 0x58, 0xF0, 0x02, 0xA2, 0x32, 0x3C, 0x1E, 0xE4, 0xE0, 0x07, 0x33, 0x28, + 0x88, 0xF0, 0x02, 0xA2, 0x33, 0x3C, 0x34, 0x26, 0x35, 0x4E, 0x29, 0x06, + 0x2A, 0x0E, 0xCB, 0xCF, 0x82, 0xCB, 0x08, 0xE0, 0xFF, 0x07, 0xF8, 0xF0, + 0x2F, 0x20, 0x2E, 0x4C, 0x94, 0xCF, 0x45, 0x24, 0x46, 0x4C, 0xC6, 0xCF, + 0x47, 0x24, 0x48, 0x4C, 0xC4, 0xCF, 0x34, 0x26, 0x35, 0x4E, 0x24, 0x06, + 0x25, 0x0E, 0xC9, 0xCF, 0x2E, 0xE4, 0x28, 0xCA, 0xF8, 0xF7, 0x11, 0xD1, + 0xC6, 0x01, 0x24, 0x24, 0x25, 0x4C, 0x20, 0xCE, 0x40, 0xA2, 0x04, 0xAF, + 0x24, 0xCE, 0x13, 0xD1, 0x18, 0x00, 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, + 0x28, 0xCA, 0xF8, 0xF7, 0x11, 0xD1, 0xCE, 0x01, 0x29, 0x24, 0x2A, 0x4C, + 0x20, 0xCE, 0x40, 0xA2, 0x04, 0xAF, 0x24, 0xCE, 0x13, 0xD1, 0x19, 0x00, + 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, 0x3D, 0x28, 0x06, 0xA0, 0x96, 0xE0, + 0x13, 0x29, 0x54, 0x3C, 0x13, 0x81, 0x13, 0x29, 0x53, 0x3C, 0x13, 0x29, + 0x3E, 0x3C, 0x82, 0xCB, 0x55, 0x3C, 0x54, 0x28, 0x55, 0x18, 0x01, 0xA2, + 0x51, 0xB6, 0x53, 0x28, 0x55, 0x18, 0x31, 0xB4, 0x1F, 0xAA, 0x3E, 0x28, + 0x52, 0xE0, 0x3E, 0x3C, 0x2E, 0xE4, 0xC0, 0xE0, 0x43, 0x00, 0xC2, 0xE0, + 0x68, 0x00, 0xC0, 0xE0, 0x44, 0x00, 0xC2, 0xE0, 0x69, 0x00, 0xC0, 0xE0, + 0x46, 0x00, 0xC2, 0xE0, 0x6A, 0x00, 0xC0, 0xE0, 0x45, 0x00, 0xC2, 0xE0, + 0x6B, 0x00, 0xC0, 0xE0, 0x47, 0x00, 0xC2, 0xE0, 0x6C, 0x00, 0xC0, 0xE0, + 0x48, 0x00, 0xC2, 0xE0, 0x6D, 0x00, 0xC0, 0xE0, 0x4A, 0x00, 0xC2, 0xE0, + 0x6F, 0x00, 0xC0, 0xE0, 0x49, 0x00, 0xC2, 0xE0, 0x6E, 0x00, 0x22, 0xCB, + 0xF8, 0xF7, 0x9C, 0xCB, 0xF8, 0xF7, 0x20, 0xCB, 0xF8, 0xF7, 0xCC, 0xCB, + 0xF8, 0xF7, 0x66, 0xE1, 0xE0, 0x00, 0x06, 0x29, 0x16, 0xE0, 0x2A, 0xE4, + 0x66, 0xE1, 0xE7, 0x00, 0x06, 0x29, 0x16, 0xE0, 0x2A, 0xE4, 0x49, 0x28, + 0x38, 0xCF, 0x4A, 0x28, 0x5A, 0xCF, 0x58, 0xCF, 0xC0, 0xE0, 0x5A, 0x00, + 0x18, 0xCF, 0xC0, 0xE0, 0x4E, 0x00, 0x12, 0xCF, 0xC0, 0xE0, 0x4F, 0x00, + 0x10, 0xCF, 0xC0, 0xE0, 0x50, 0x00, 0x16, 0xCF, 0xC0, 0xE0, 0x51, 0x00, + 0x14, 0xCF, 0xC0, 0xE0, 0x5B, 0x00, 0x29, 0x34, 0x2A, 0x3C, 0xC0, 0xE0, + 0x5D, 0x00, 0x45, 0x34, 0x46, 0x3C, 0xC0, 0xE0, 0x5E, 0x00, 0x47, 0x34, + 0x48, 0x3C, 0x10, 0x28, 0x52, 0xCE, 0x60, 0xCE, 0xC0, 0xCE, 0xC2, 0xCE, + 0x7E, 0xCC, 0x80, 0xCC, 0x1E, 0xE4, 0xA5, 0x08, 0xC0, 0xE0, 0x4C, 0x00, + 0x0A, 0xCF, 0x14, 0xAF, 0x44, 0x30, 0x28, 0xAF, 0x06, 0xA8, 0x41, 0x3C, + 0x86, 0xD1, 0x00, 0x00, 0x87, 0xD1, 0x00, 0x00, 0x49, 0x2A, 0x04, 0xE0, + 0xE0, 0x00, 0xF2, 0xB4, 0x9C, 0xE0, 0x1E, 0xE4, 0x97, 0x06, 0xC0, 0xE0, + 0x4C, 0x00, 0x14, 0xAF, 0x44, 0x30, 0x44, 0x2A, 0x43, 0x3E, 0x1E, 0xE4, + 0xD6, 0x06, 0x42, 0x28, 0x8A, 0xF0, 0x04, 0xE0, 0x00, 0x00, 0x03, 0xA2, + 0x1E, 0xE4, 0x93, 0x00, 0x00, 0xA2, 0x42, 0x3C, 0x02, 0xA2, 0x24, 0xCF, + 0x16, 0x3D, 0x4D, 0x28, 0x04, 0xAE, 0x41, 0x4C, 0x16, 0x3D, 0xC0, 0xE0, + 0x48, 0x00, 0x16, 0x35, 0x16, 0x3D, 0xC0, 0xE0, 0x47, 0x00, 0x16, 0x35, + 0x16, 0x3D, 0xC0, 0xE0, 0x49, 0x00, 0x1E, 0xA8, 0x06, 0x3D, 0x4A, 0x28, + 0x16, 0xE0, 0x4A, 0x3C, 0x49, 0x28, 0x16, 0xE0, 0x49, 0x3C, 0x10, 0x28, + 0x16, 0xE0, 0x10, 0x3C, 0x02, 0xA2, 0x39, 0x3C, 0x2E, 0xE4, 0x23, 0x28, + 0x08, 0xA1, 0x2A, 0xF0, 0x02, 0xA2, 0x23, 0x08, 0x36, 0xAE, 0xC1, 0xE0, + 0x4A, 0x00, 0x05, 0xA1, 0x6B, 0xF0, 0x03, 0xA2, 0x2F, 0xAE, 0x56, 0xE0, + 0x04, 0xA9, 0x2E, 0xF0, 0x08, 0xA9, 0x26, 0xCF, 0x94, 0xD1, 0x00, 0x00, + 0x02, 0xA2, 0x28, 0xAE, 0x2C, 0xCF, 0x97, 0xD1, 0x00, 0x00, 0x98, 0xD1, + 0x00, 0x00, 0x2E, 0xE4, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x0E, 0xE4, 0x20, 0x00, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, + 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x0E, 0xE4, 0x7A, 0x00, + 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, + 0x70, 0xE4, 0x90, 0xE1, 0x0E, 0xE4, 0x81, 0x00, 0x70, 0xE4, 0x90, 0xE1, + 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, 0x70, 0xE4, 0x90, 0xE1, + 0x70, 0xE4, 0x90, 0xE1, 0x68, 0xE1, 0x00, 0xA2, 0xC2, 0xE0, 0x7F, 0x00, + 0x1E, 0xE4, 0x54, 0x00, 0x71, 0xD0, 0x2F, 0x04, 0x81, 0xE1, 0x6A, 0xE1, + 0x00, 0xC0, 0xC0, 0xE0, 0x41, 0x00, 0x04, 0xE4, 0x2B, 0x00, 0x05, 0xE0, + 0x00, 0x00, 0xC0, 0xE0, 0x41, 0x00, 0x00, 0xA1, 0x0A, 0xE4, 0x38, 0x00, + 0x05, 0xE0, 0x00, 0x18, 0x13, 0x3E, 0x1E, 0xE4, 0x43, 0x00, 0x1E, 0xE4, + 0x54, 0x00, 0x00, 0xA2, 0xC2, 0xE0, 0x0C, 0x00, 0x1C, 0x3C, 0x0E, 0xE4, + 0x06, 0x02, 0xC1, 0xE0, 0x44, 0x00, 0x11, 0xAE, 0x13, 0xA9, 0x28, 0xCA, + 0xF8, 0xF7, 0xC0, 0xE0, 0x43, 0x00, 0x13, 0x08, 0x20, 0xCE, 0x11, 0xD1, + 0x00, 0x00, 0x12, 0xD1, 0x00, 0x0C, 0x27, 0xCE, 0xE1, 0xE1, 0x2E, 0xE4, + 0x00, 0xA2, 0x01, 0xC4, 0x88, 0xE1, 0xFF, 0x05, 0x11, 0x3D, 0x2E, 0xE4, + 0x00, 0xA2, 0xC1, 0xE0, 0x7F, 0x00, 0x2B, 0xE4, 0x02, 0xA2, 0xC2, 0xE0, + 0x0C, 0x00, 0x00, 0xA2, 0x22, 0xD0, 0x0F, 0x00, 0x84, 0xE1, 0x68, 0x00, + 0x02, 0xA0, 0x03, 0xAF, 0x2B, 0xE4, 0x00, 0xA2, 0x00, 0xA2, 0xC2, 0xE0, + 0x0C, 0x00, 0x2E, 0xE4, 0xC1, 0xE0, 0x07, 0x00, 0x51, 0xE0, 0x2B, 0xE4, + 0xC1, 0xE0, 0x05, 0x00, 0x55, 0xE0, 0xC3, 0xE0, 0x05, 0x00, 0x03, 0xA2, + 0x01, 0xCE, 0x2E, 0xE4, 0xC0, 0xE0, 0x41, 0x00, 0x02, 0xA1, 0x08, 0xE4, + 0xB6, 0x00, 0x0E, 0xE4, 0x0D, 0x01, 0xC0, 0xE0, 0x41, 0x00, 0x02, 0xA1, + 0x08, 0xE4, 0xC5, 0x00, 0x0E, 0xE4, 0x13, 0x01, 0x0A, 0xE0, 0x00, 0x80, + 0xC2, 0xE0, 0xC0, 0x00, 0xC0, 0xE0, 0xC2, 0x00, 0x02, 0xA8, 0xDA, 0xF7, + 0xC0, 0xE0, 0xC1, 0x00, 0x2E, 0xE4, 0xC3, 0xE0, 0xC1, 0x00, 0xC2, 0xE0, + 0xC0, 0x00, 0xC0, 0xE0, 0xC2, 0x00, 0x02, 0xA8, 0xDA, 0xF7, 0x2E, 0xE4, + 0x12, 0x3C, 0x2E, 0xE4, 0x12, 0x2A, 0x6B, 0xF0, 0xC2, 0xE0, 0xC1, 0x00, + 0xC3, 0xE0, 0xC0, 0x00, 0x3E, 0xF0, 0xC2, 0xE0, 0xC1, 0x00, 0xC0, 0xE0, + 0xC2, 0x00, 0x02, 0xA8, 0xDA, 0xF7, 0x2B, 0xE4, 0x01, 0xA2, 0x12, 0x3E, + 0x04, 0xA2, 0xC2, 0xE0, 0xC2, 0x00, 0x2E, 0xE4, 0x00, 0xA2, 0xC2, 0xE0, + 0xC2, 0x00, 0x2E, 0xE4, 0x7F, 0xC8, 0x00, 0xA2, 0x7E, 0xCC, 0x80, 0xCC, + 0x62, 0xC8, 0x1E, 0xA8, 0x48, 0xF0, 0x02, 0xA2, 0x7E, 0xCC, 0x80, 0xCC, + 0x00, 0xA2, 0x7A, 0xCC, 0x7F, 0xCC, 0x81, 0xCC, 0x70, 0xE4, 0x02, 0xA2, + 0x4A, 0xCE, 0x4E, 0xCA, 0x0B, 0x10, 0x0C, 0x1C, 0x48, 0xF0, 0x07, 0x28, + 0x48, 0xF0, 0x3E, 0xF0, 0x1E, 0xE4, 0xD1, 0x00, 0x70, 0xE4, 0x42, 0xCA, + 0x0D, 0x3C, 0x00, 0xA2, 0x42, 0xCE, 0x4C, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, + 0x1E, 0xE4, 0xE4, 0x00, 0x47, 0xCE, 0x40, 0xCE, 0x06, 0x28, 0x48, 0xCE, + 0x4C, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, 0x0D, 0x28, 0x42, 0xCE, 0x2E, 0xE4, + 0x4E, 0xCA, 0x04, 0x10, 0x05, 0x1C, 0x5A, 0xF1, 0x0B, 0x26, 0x0C, 0x4E, + 0x02, 0x16, 0x03, 0x1E, 0x4B, 0xF0, 0x00, 0xA2, 0x4C, 0xCE, 0x4E, 0xF0, + 0x07, 0x28, 0x04, 0xAE, 0x4C, 0xCE, 0x09, 0x24, 0x0A, 0x4C, 0x44, 0xCE, + 0x4E, 0xCE, 0x04, 0x26, 0x05, 0x4E, 0x04, 0xE0, 0x62, 0x00, 0x2E, 0xE4, + 0x02, 0x24, 0x03, 0x4C, 0x44, 0xCE, 0x4E, 0xCE, 0x09, 0x34, 0x0A, 0x3C, + 0x0B, 0x26, 0x0C, 0x4E, 0x07, 0x28, 0x04, 0xAE, 0x4C, 0xCE, 0x44, 0xA2, + 0x2E, 0xE4, 0x6B, 0xE1, 0x05, 0xE0, 0xFF, 0xFF, 0x2E, 0xE4, 0x43, 0xD0, + 0x02, 0x00, 0x88, 0xC8, 0x02, 0xA8, 0xE8, 0xF7, 0x70, 0xE4, 0x31, 0xD1, + 0x02, 0x00, 0x08, 0x28, 0xB8, 0xF0, 0x02, 0x24, 0x03, 0x4C, 0x00, 0xE0, + 0x00, 0x02, 0x6C, 0xCE, 0x31, 0xD1, 0x04, 0x00, 0x02, 0xA2, 0x1F, 0x3C, + 0x70, 0xE4, 0x74, 0xCA, 0xC2, 0xE0, 0x78, 0x00, 0x04, 0xE0, 0x40, 0x00, + 0xC1, 0xE0, 0x05, 0x00, 0x55, 0xE0, 0xC3, 0xE0, 0x05, 0x00, 0x00, 0xD1, + 0x01, 0x00, 0xC1, 0xE0, 0x05, 0x00, 0x81, 0xA8, 0xD9, 0xF7, 0xC0, 0xE0, + 0x49, 0x00, 0x6C, 0xCE, 0x15, 0x34, 0x16, 0x3C, 0x31, 0xD1, 0x05, 0x00, + 0x70, 0xE4, 0xC0, 0xE0, 0x47, 0x00, 0x08, 0xAF, 0x02, 0xA8, 0x08, 0x30, + 0xC0, 0xE0, 0x47, 0x00, 0x0A, 0xAF, 0x17, 0x3C, 0x72, 0xCA, 0x02, 0xA8, + 0xE8, 0xF7, 0x33, 0xD1, 0x00, 0x00, 0x30, 0xD1, 0x01, 0x00, 0x72, 0xCA, + 0x04, 0xA8, 0xE8, 0xF7, 0xC0, 0xE0, 0x47, 0x00, 0x1E, 0xA8, 0x70, 0xCE, + 0xD0, 0x3C, 0xC0, 0xE0, 0x45, 0x00, 0x02, 0x34, 0x03, 0x3C, 0x02, 0x24, + 0x03, 0x4C, 0x68, 0xCE, 0xC1, 0xE0, 0x46, 0x00, 0x04, 0x36, 0x05, 0x3E, + 0x04, 0x26, 0x05, 0x4E, 0xC0, 0xE0, 0x49, 0x00, 0x15, 0x34, 0x16, 0x3C, + 0x01, 0xE0, 0x00, 0x80, 0x6F, 0xCE, 0x6D, 0xCE, 0xC0, 0xE0, 0x48, 0x00, + 0x09, 0x34, 0x0A, 0x3C, 0x09, 0x24, 0x0A, 0x4C, 0x6A, 0xCE, 0x02, 0xA2, + 0xC4, 0xCE, 0x84, 0xCC, 0x86, 0xCC, 0x66, 0xCE, 0x62, 0xCE, 0x2E, 0xE4, + 0x02, 0xA2, 0x84, 0xCC, 0x73, 0xCA, 0x03, 0xA8, 0xE9, 0xF7, 0x66, 0xCE, + 0x2E, 0xE4, 0x90, 0xC8, 0x0E, 0xA8, 0x2A, 0xE4, 0x11, 0xA2, 0x45, 0xE0, + 0x13, 0x3E, 0x00, 0xA2, 0x13, 0x70, 0x2E, 0xE4, 0x1D, 0x34, 0x1E, 0x3C, + 0x20, 0xAF, 0x1F, 0xA2, 0x02, 0xAF, 0x03, 0xA0, 0xE8, 0xF7, 0x13, 0x3E, + 0x00, 0xA2, 0x13, 0x70, 0x02, 0xA0, 0x13, 0x3C, 0x1D, 0x20, 0x1E, 0x4C, + 0x02, 0xA0, 0x13, 0x70, 0x2E, 0xE4, 0x09, 0x24, 0x0A, 0x4C, 0x69, 0x26, + 0x6A, 0x4E, 0x45, 0xE0, 0x03, 0xE0, 0x00, 0x08, 0x25, 0xE4, 0x69, 0x24, + 0x6A, 0x4C, 0x09, 0x34, 0x0A, 0x3C, 0xC2, 0xE0, 0x78, 0x00, 0x04, 0xE0, + 0x40, 0x00, 0xC1, 0xE0, 0x05, 0x00, 0x55, 0xE0, 0xC3, 0xE0, 0x05, 0x00, + 0x00, 0xD1, 0x01, 0x00, 0xC1, 0xE0, 0x05, 0x00, 0x81, 0xA8, 0xD9, 0xF7, + 0xC0, 0xE0, 0x49, 0x00, 0x15, 0x34, 0x16, 0x3C, 0x2E, 0xE4, 0x75, 0xCA, + 0x1D, 0x36, 0x1E, 0x3E, 0x1D, 0x26, 0x1E, 0x4E, 0x04, 0x24, 0x05, 0x4C, + 0x46, 0xE0, 0x22, 0xE4, 0x72, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, 0x31, 0xD1, + 0x02, 0x00, 0x33, 0xD1, 0x00, 0x00, 0x72, 0xCA, 0x08, 0xA8, 0xEA, 0xF7, + 0x74, 0xCA, 0xC2, 0xE0, 0x78, 0x00, 0x04, 0xE0, 0x40, 0x00, 0xC1, 0xE0, + 0x05, 0x00, 0x55, 0xE0, 0xC3, 0xE0, 0x05, 0x00, 0x00, 0xD1, 0x01, 0x00, + 0xC1, 0xE0, 0x05, 0x00, 0x81, 0xA8, 0xD9, 0xF7, 0xC0, 0xE0, 0x48, 0x00, + 0x6A, 0xCE, 0x09, 0x34, 0x0A, 0x3C, 0xC0, 0xE0, 0x49, 0x00, 0x15, 0x34, + 0x16, 0x3C, 0x72, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, 0x31, 0xD1, 0x01, 0x00, + 0x33, 0xD1, 0x01, 0x00, 0x2E, 0xE4, 0x72, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, + 0x33, 0xD1, 0x00, 0x00, 0x32, 0xD1, 0x01, 0x00, 0x2E, 0xE4, 0x72, 0xCA, + 0x02, 0xA8, 0xE8, 0xF7, 0x1E, 0xE4, 0x7B, 0x01, 0x47, 0xD0, 0x01, 0x00, + 0x77, 0xCA, 0x03, 0xA8, 0xEB, 0xF7, 0x63, 0xD1, 0x01, 0x00, 0xC6, 0xCA, + 0x04, 0xA8, 0xE8, 0xF7, 0x1E, 0xE4, 0xE9, 0x01, 0x72, 0xCA, 0x02, 0xA8, + 0xE8, 0xF7, 0x2E, 0xE4, 0x00, 0x28, 0x00, 0xE0, 0x0A, 0x02, 0x7C, 0xE6, + 0x1E, 0xF1, 0xAE, 0xF3, 0x9E, 0xF3, 0x8E, 0xF3, 0x7E, 0xF3, 0x1E, 0xF1, + 0x5E, 0xF1, 0x4E, 0xF3, 0x3E, 0xF3, 0xFE, 0xF1, 0x1E, 0xF3, 0x0E, 0xF3, + 0xFE, 0xF2, 0x4E, 0xF2, 0xDE, 0xF2, 0x9E, 0xF2, 0x8E, 0xF2, 0x1E, 0xE4, + 0x5A, 0x00, 0xEA, 0xF7, 0x00, 0x3C, 0x7E, 0xF6, 0x1E, 0xE4, 0xEA, 0x03, + 0x1E, 0xE4, 0x08, 0x04, 0x1E, 0xF2, 0x00, 0xA2, 0x1F, 0x3C, 0x1E, 0xE4, + 0x7C, 0x06, 0x1E, 0xE4, 0x58, 0x02, 0x1F, 0x28, 0x04, 0xA1, 0x8A, 0xF7, + 0x1E, 0xE4, 0xDB, 0x03, 0x77, 0x28, 0x4E, 0xF1, 0x00, 0xA2, 0xC2, 0xE0, + 0x7F, 0x00, 0xC0, 0xE0, 0x41, 0x00, 0x02, 0xA1, 0x08, 0xE4, 0x2B, 0x00, + 0xBE, 0xF0, 0xC1, 0xE0, 0x76, 0x00, 0x04, 0xE0, 0x7C, 0x00, 0x1E, 0xE4, + 0x93, 0x00, 0x4E, 0xF0, 0x1E, 0xE4, 0x8F, 0x07, 0x1E, 0xF0, 0xC2, 0xE0, + 0x7D, 0x00, 0x1F, 0x28, 0xC2, 0xE0, 0x7C, 0x00, 0xC0, 0xE0, 0x7F, 0x00, + 0x1E, 0xE4, 0x6E, 0x00, 0x00, 0xA2, 0x00, 0x3C, 0xC2, 0xE0, 0x7F, 0x00, + 0x1F, 0x3C, 0x00, 0xA2, 0xC2, 0xE0, 0x0C, 0x00, 0x0E, 0xE4, 0x06, 0x02, + 0x04, 0xE0, 0x50, 0x00, 0x13, 0x3C, 0x0A, 0xCB, 0x02, 0xA8, 0x92, 0xE0, + 0x13, 0x2A, 0x03, 0xA1, 0x13, 0x3E, 0x01, 0xE4, 0x9D, 0x02, 0x04, 0xE0, + 0xF5, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0x08, 0xAF, 0x02, 0xA8, 0x48, 0xF3, + 0x04, 0xE0, 0xF6, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0x08, 0xE0, 0xFF, 0x00, + 0xD8, 0xF2, 0x04, 0xE0, 0xF6, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0x10, 0xAF, + 0x08, 0xE0, 0xFF, 0x00, 0x06, 0xA1, 0x48, 0xF2, 0x04, 0xE0, 0x00, 0x04, + 0x13, 0x3C, 0x13, 0x2A, 0x03, 0xA1, 0x13, 0x3E, 0x01, 0xE4, 0x7D, 0x02, + 0x04, 0xE0, 0xF5, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0x08, 0xAF, 0x02, 0xA8, + 0x58, 0xF1, 0x04, 0xE0, 0xF6, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0x08, 0xE0, + 0xFF, 0x00, 0xE8, 0xF0, 0x04, 0xE0, 0xF6, 0x02, 0x1E, 0xE4, 0x88, 0x00, + 0x10, 0xAF, 0x08, 0xE0, 0xFF, 0x00, 0x06, 0xA1, 0x58, 0xF0, 0x04, 0xA2, + 0x1F, 0x3C, 0x0E, 0xE4, 0x33, 0x03, 0x82, 0xE0, 0x0A, 0xE4, 0x5B, 0x02, + 0x12, 0xCB, 0x15, 0xCB, 0x84, 0x34, 0x85, 0x3C, 0x86, 0x36, 0x87, 0x3E, + 0x18, 0xCB, 0x49, 0xE0, 0x05, 0xAF, 0xFF, 0xA8, 0x6B, 0x3E, 0x49, 0xE0, + 0x03, 0xA8, 0x7E, 0x32, 0x59, 0xF0, 0x02, 0xAF, 0x7F, 0x30, 0x20, 0xAF, + 0x4E, 0xF0, 0x01, 0xA2, 0x7F, 0x3E, 0x22, 0xAF, 0x80, 0x30, 0x80, 0x28, + 0x8A, 0xF0, 0x1E, 0xF0, 0x77, 0xCA, 0x39, 0xF0, 0x1E, 0xE4, 0xE9, 0x01, + 0x1E, 0xE4, 0xF1, 0x01, 0x1E, 0xE4, 0xAE, 0x03, 0x7E, 0x2A, 0x79, 0xF0, + 0x25, 0x28, 0x88, 0x44, 0xB8, 0xF0, 0x7F, 0x2A, 0xF9, 0xF0, 0x4E, 0xF1, + 0xA0, 0xD1, 0x02, 0x00, 0x41, 0xCB, 0x23, 0xAF, 0x03, 0xA8, 0xD9, 0xF7, + 0x7E, 0xF0, 0xA0, 0xD1, 0x04, 0x00, 0x41, 0xCB, 0x25, 0xAF, 0x03, 0xA8, + 0xD9, 0xF7, 0xA0, 0xD1, 0x01, 0x00, 0x41, 0xCB, 0x21, 0xAF, 0x03, 0xA8, + 0xD9, 0xF7, 0x80, 0x2A, 0x5B, 0xF0, 0x17, 0x28, 0x3A, 0xF0, 0x1E, 0xE4, + 0xCE, 0x03, 0x7E, 0x2A, 0x7F, 0x4E, 0x0B, 0xF1, 0x1E, 0xE4, 0x74, 0x01, + 0x00, 0xA2, 0x72, 0x3C, 0x73, 0x3C, 0x62, 0x28, 0x7E, 0x08, 0x62, 0x3C, + 0x63, 0x28, 0x7F, 0x08, 0x63, 0x3C, 0x25, 0x28, 0x38, 0xF0, 0x1E, 0xE4, + 0x75, 0x08, 0x1E, 0xE4, 0xB5, 0x01, 0x75, 0xCA, 0x69, 0x36, 0x6A, 0x3E, + 0x88, 0xD1, 0x01, 0x00, 0x1E, 0xE4, 0x81, 0x08, 0x08, 0x28, 0x3A, 0xF0, + 0x1E, 0xE4, 0x95, 0x01, 0x1F, 0x28, 0x08, 0xF3, 0x10, 0xCB, 0x02, 0xA8, + 0xC8, 0xF7, 0x71, 0x28, 0x83, 0x18, 0x08, 0xE4, 0x58, 0x02, 0x04, 0xE0, + 0xC1, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0x02, 0xA8, 0xBA, 0xF7, 0x1E, 0xE4, + 0x9B, 0x03, 0x77, 0xCA, 0x03, 0xA8, 0x39, 0xF0, 0x1E, 0xE4, 0xE9, 0x01, + 0x1E, 0xE4, 0xF1, 0x01, 0x1E, 0xE4, 0x5A, 0x09, 0x25, 0x28, 0x3A, 0xF0, + 0x1E, 0xE4, 0xF9, 0x03, 0x72, 0xCA, 0x02, 0xA8, 0xE8, 0xF7, 0x00, 0xA2, + 0x1A, 0x3C, 0xDA, 0xCA, 0x75, 0x34, 0x76, 0x3C, 0x72, 0xCA, 0x08, 0xA8, + 0xEA, 0xF7, 0x08, 0x28, 0x3A, 0xF0, 0x1E, 0xE4, 0xB5, 0x01, 0x02, 0xA2, + 0x77, 0x3C, 0x70, 0x3C, 0x2E, 0xE4, 0x02, 0xA2, 0x70, 0x3C, 0x00, 0xA2, + 0x66, 0xCE, 0x62, 0xCE, 0x86, 0xCC, 0xC0, 0xE0, 0x3D, 0x02, 0xE8, 0xF7, + 0xC0, 0xE0, 0x3D, 0x02, 0xE8, 0xF7, 0xC0, 0xE0, 0x3D, 0x02, 0xE8, 0xF7, + 0x09, 0xA2, 0x04, 0xE0, 0xC0, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0x04, 0xE0, + 0xC1, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0x08, 0xA8, 0xBA, 0xF7, 0x20, 0x28, + 0x21, 0x48, 0x00, 0xCF, 0xCC, 0x20, 0xCD, 0x4C, 0x02, 0xCF, 0xCE, 0x20, + 0xCF, 0x4C, 0x04, 0xCF, 0x83, 0xD1, 0x01, 0x00, 0x72, 0xCA, 0x02, 0xA8, + 0xE8, 0xF7, 0x33, 0xD1, 0x00, 0x00, 0x30, 0xD1, 0x01, 0x00, 0x72, 0xCA, + 0x04, 0xA8, 0xE8, 0xF7, 0xD0, 0x28, 0x1E, 0xA8, 0x70, 0xCE, 0x02, 0x24, + 0x03, 0x4C, 0x68, 0xCE, 0x04, 0x26, 0x05, 0x4E, 0x01, 0xE0, 0x00, 0x80, + 0x6F, 0xCE, 0x6D, 0xCE, 0x09, 0x24, 0x0A, 0x4C, 0x6A, 0xCE, 0x02, 0xA2, + 0xC4, 0xCE, 0x84, 0xCC, 0x86, 0xCC, 0x66, 0xCE, 0x62, 0xCE, 0x00, 0xA2, + 0x91, 0x3C, 0x92, 0x3C, 0x93, 0x3C, 0xA2, 0x3C, 0xA3, 0x3C, 0xA0, 0x3C, + 0xA1, 0x3C, 0x54, 0x3C, 0xC9, 0x3C, 0xD1, 0x28, 0x7A, 0x3C, 0xD2, 0x20, + 0x84, 0x34, 0xD3, 0x28, 0x85, 0x3C, 0xD4, 0x20, 0x96, 0x34, 0xD5, 0x28, + 0x97, 0x3C, 0xD6, 0x20, 0x9C, 0x34, 0xD7, 0x28, 0x9D, 0x3C, 0xD8, 0x20, + 0x86, 0x34, 0xD9, 0x28, 0x87, 0x3C, 0xDA, 0x20, 0x98, 0x34, 0xDB, 0x28, + 0x99, 0x3C, 0x6A, 0xE1, 0x00, 0xA2, 0x77, 0x3C, 0x2E, 0xE4, 0x04, 0xE0, + 0xED, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0xC3, 0x34, 0xC4, 0x3C, 0x04, 0xE0, + 0xEE, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0xC5, 0x34, 0xC6, 0x3C, 0x04, 0xE0, + 0xEF, 0x02, 0x1E, 0xE4, 0x88, 0x00, 0xC7, 0x34, 0xC8, 0x3C, 0x2E, 0xE4, + 0x72, 0x22, 0x73, 0x4E, 0x8A, 0xC8, 0x72, 0x34, 0x73, 0x3C, 0x46, 0xE0, + 0x49, 0xE0, 0x74, 0x3C, 0x0E, 0xCB, 0x81, 0x3C, 0x82, 0x34, 0x08, 0xE0, + 0xFF, 0x00, 0x01, 0xA2, 0x88, 0xF0, 0x82, 0x28, 0x6A, 0xF0, 0x25, 0x28, + 0x3A, 0xF0, 0x1E, 0xE4, 0x6D, 0x0A, 0x03, 0xA2, 0x88, 0x3E, 0x82, 0x84, + 0x23, 0x82, 0x18, 0xE0, 0x81, 0x08, 0x83, 0x3C, 0x02, 0xA2, 0x20, 0xAE, + 0x0A, 0xCF, 0x2E, 0xE4, 0x71, 0x28, 0x83, 0x18, 0x2A, 0xE4, 0x74, 0xCA, + 0xC2, 0xE0, 0x78, 0x00, 0x04, 0xE0, 0x80, 0x00, 0xC2, 0xE0, 0x05, 0x00, + 0x02, 0xA2, 0x00, 0xCE, 0x2E, 0xE4, 0x28, 0xCA, 0xF8, 0xF7, 0x11, 0xD1, + 0x00, 0x00, 0xB6, 0x24, 0xB7, 0x4C, 0x20, 0xCE, 0x04, 0xE0, 0x00, 0x04, + 0x24, 0xCE, 0x13, 0xD1, 0x00, 0x00, 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, + 0x28, 0xCA, 0xF8, 0xF7, 0x11, 0xD1, 0x00, 0x00, 0xC0, 0xE0, 0x79, 0x00, + 0x20, 0xCE, 0x04, 0xE0, 0x00, 0x04, 0x24, 0xCE, 0x13, 0xD1, 0x01, 0x00, + 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, 0x28, 0xCA, 0xF8, 0xF7, 0x11, 0xD1, + 0x00, 0x02, 0xC0, 0xE0, 0x78, 0x00, 0x20, 0xCE, 0x02, 0xA2, 0x10, 0xAE, + 0x24, 0xCE, 0x13, 0xD1, 0x00, 0x00, 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, + 0x00, 0xA2, 0x70, 0x3C, 0x1B, 0x3C, 0x1E, 0xE4, 0x88, 0x05, 0x1E, 0xE4, + 0x15, 0x04, 0x1E, 0xE4, 0x76, 0x05, 0x1E, 0xE4, 0x39, 0x01, 0x02, 0xA2, + 0x2E, 0xE4, 0x05, 0xE0, 0x99, 0xF9, 0x04, 0xE0, 0x7C, 0x00, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x44, 0x00, 0x03, 0xA9, 0x04, 0xE0, 0xC2, 0x02, + 0x1E, 0xE4, 0x93, 0x00, 0x09, 0xAF, 0x24, 0x3E, 0xC1, 0xE0, 0x59, 0x00, + 0x04, 0xE0, 0xC3, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5A, 0x00, + 0x04, 0xE0, 0xC4, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5B, 0x00, + 0x04, 0xE0, 0xC5, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5C, 0x00, + 0x04, 0xE0, 0xC6, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5D, 0x00, + 0x04, 0xE0, 0xC7, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5E, 0x00, + 0x04, 0xE0, 0xC8, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5F, 0x00, + 0x04, 0xE0, 0xC9, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x58, 0x00, + 0x04, 0xE0, 0xCA, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x55, 0x00, + 0x04, 0xE0, 0xCB, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x56, 0x00, + 0x04, 0xE0, 0xCC, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x60, 0x00, + 0x04, 0xE0, 0xCD, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x4A, 0x00, + 0x04, 0xE0, 0xCE, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x4B, 0x00, + 0x04, 0xE0, 0xCF, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x4C, 0x00, + 0x04, 0xE0, 0xD0, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x4D, 0x00, + 0x04, 0xE0, 0xD1, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x4E, 0x00, + 0x04, 0xE0, 0xD2, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x4F, 0x00, + 0x04, 0xE0, 0xD3, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x61, 0x00, + 0x04, 0xE0, 0xD4, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x57, 0x00, + 0x04, 0xE0, 0xD5, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x62, 0x00, + 0x04, 0xE0, 0xD6, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x63, 0x00, + 0x0F, 0xA8, 0x6C, 0x28, 0x55, 0xE0, 0x04, 0xE0, 0xD7, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x64, 0x00, 0x04, 0xE0, 0xD8, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x65, 0x00, 0x04, 0xE0, 0xD9, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x67, 0x00, 0x04, 0xE0, 0xDB, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x68, 0x00, 0x04, 0xE0, 0xDC, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x69, 0x00, 0x04, 0xE0, 0xDD, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x6A, 0x00, 0x04, 0xE0, 0xDE, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x6B, 0x00, 0x04, 0xE0, 0xDF, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x6C, 0x00, 0x04, 0xE0, 0xE0, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x50, 0x00, 0x04, 0xE0, 0xE1, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x51, 0x00, 0x04, 0xE0, 0xE2, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x52, 0x00, 0x04, 0xE0, 0xE3, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x53, 0x00, 0x04, 0xE0, 0xE4, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x54, 0x00, 0x04, 0xE0, 0xE5, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0xC1, 0xE0, 0x72, 0x00, 0x04, 0xE0, 0xEC, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0x39, 0x28, 0x68, 0xF0, 0xC1, 0xE0, 0x72, 0x00, 0x07, 0xAF, + 0x03, 0xA8, 0x49, 0xF1, 0xC1, 0xE0, 0x73, 0x00, 0x4A, 0xE0, 0x08, 0xE0, + 0xFF, 0x00, 0xC3, 0x34, 0xC4, 0x3C, 0x4A, 0xE0, 0x10, 0xAF, 0x08, 0xE0, + 0xFF, 0x00, 0xC5, 0x34, 0xC6, 0x3C, 0x4A, 0xE0, 0x20, 0xAF, 0x08, 0xE0, + 0xFF, 0x00, 0xC7, 0x34, 0xC8, 0x3C, 0xC3, 0x22, 0xC4, 0x4E, 0x04, 0xE0, + 0xED, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC5, 0x22, 0xC6, 0x4E, 0x04, 0xE0, + 0xEE, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC7, 0x22, 0xC8, 0x4E, 0x04, 0xE0, + 0xEF, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x77, 0x00, 0x04, 0xE0, + 0xE7, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x42, 0x00, 0x09, 0xE0, + 0x08, 0x01, 0x04, 0xE0, 0x0C, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, + 0x42, 0x00, 0x09, 0xE0, 0x08, 0x01, 0x04, 0xE0, 0x0D, 0x02, 0x1E, 0xE4, + 0x93, 0x00, 0x1E, 0xE4, 0x8B, 0x0A, 0x66, 0xE1, 0x00, 0x03, 0x22, 0xD0, + 0x33, 0x00, 0x84, 0xE1, 0x49, 0x05, 0x16, 0x2F, 0x16, 0x4B, 0x04, 0xE0, + 0xDA, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0x90, 0xE1, 0x2E, 0xE4, 0x1E, 0xE4, + 0x99, 0x08, 0x1E, 0xE4, 0xB3, 0x08, 0x2A, 0x28, 0x7B, 0x3C, 0x1E, 0xE4, + 0x1F, 0x06, 0x6C, 0x28, 0x18, 0xE4, 0xF8, 0x0A, 0x55, 0x28, 0x18, 0xE4, + 0xB5, 0x0A, 0x00, 0xA2, 0x6B, 0x3C, 0x2E, 0xE4, 0x04, 0xE0, 0xC1, 0x02, + 0x1E, 0xE4, 0x88, 0x00, 0x04, 0xA8, 0xBA, 0xF7, 0x0B, 0xA2, 0x71, 0x1A, + 0x22, 0xD0, 0x04, 0x00, 0x37, 0xF0, 0x71, 0x88, 0x22, 0x00, 0x84, 0xE1, + 0x6F, 0x05, 0x1E, 0xE4, 0x4B, 0x05, 0x1E, 0xE4, 0x27, 0x09, 0x90, 0xE1, + 0x03, 0xA2, 0x04, 0xE0, 0xC0, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0x2E, 0xE4, + 0xC0, 0xE0, 0x59, 0x00, 0x00, 0xCF, 0x21, 0x34, 0x20, 0x3C, 0xC0, 0xE0, + 0x5A, 0x00, 0x02, 0xCF, 0xCC, 0x34, 0xCD, 0x3C, 0xC0, 0xE0, 0x6D, 0x00, + 0x04, 0xCF, 0xCE, 0x34, 0xCF, 0x3C, 0x83, 0xD1, 0x01, 0x00, 0x2E, 0xE4, + 0x00, 0xA2, 0x91, 0x3C, 0x92, 0x3C, 0x93, 0x3C, 0x50, 0x3C, 0x51, 0x3C, + 0xA2, 0x3C, 0xA3, 0x3C, 0xA0, 0x3C, 0xA1, 0x3C, 0x54, 0x3C, 0xC9, 0x3C, + 0xC0, 0xE0, 0x6E, 0x00, 0x23, 0x3C, 0x22, 0x34, 0x23, 0x84, 0x22, 0x82, + 0x18, 0xE0, 0x94, 0x3C, 0x02, 0xA1, 0x71, 0x3C, 0xC0, 0xE0, 0x5A, 0x00, + 0x49, 0xE0, 0x06, 0xA8, 0x33, 0x3C, 0x05, 0xAF, 0x07, 0xA8, 0x68, 0x3E, + 0xC0, 0xE0, 0x63, 0x00, 0x26, 0x30, 0x06, 0xAF, 0x39, 0x30, 0x02, 0xAF, + 0x27, 0x30, 0x02, 0xAF, 0x55, 0x30, 0x02, 0xAF, 0x6C, 0x30, 0xC1, 0xE0, + 0x64, 0x00, 0x4A, 0xE0, 0x7E, 0xA8, 0x28, 0x3C, 0x11, 0xAF, 0x7F, 0xA8, + 0x29, 0x3E, 0xC0, 0xE0, 0x65, 0x00, 0x2A, 0x30, 0xC1, 0xE0, 0x66, 0x00, + 0x4A, 0xE0, 0x3D, 0x30, 0x02, 0xAF, 0x08, 0xE0, 0xFF, 0x7F, 0x3B, 0x3C, + 0x2D, 0xAF, 0x7F, 0xA8, 0x3A, 0x3E, 0xC1, 0xE0, 0x6F, 0x00, 0x4A, 0xE0, + 0x08, 0xE0, 0xFF, 0x00, 0x32, 0x3C, 0x4A, 0xE0, 0x10, 0xAF, 0x08, 0xE0, + 0xFF, 0x00, 0x31, 0x3C, 0x21, 0xAF, 0x4A, 0xE0, 0x08, 0xE0, 0xFF, 0x00, + 0x30, 0x3C, 0x11, 0xAF, 0x0F, 0xA8, 0x2F, 0x3E, 0x6B, 0xF0, 0x31, 0x84, + 0x23, 0x82, 0x18, 0xE0, 0x32, 0x08, 0x38, 0x3C, 0xC0, 0xE0, 0x70, 0x00, + 0x2C, 0x34, 0xC0, 0xE0, 0x71, 0x00, 0x2D, 0x34, 0x2E, 0x3C, 0xC0, 0xE0, + 0x68, 0x00, 0x16, 0xAF, 0x36, 0x30, 0xC0, 0xE0, 0x75, 0x00, 0x52, 0x34, + 0x53, 0x3C, 0xC0, 0xE0, 0x78, 0x00, 0x3E, 0x34, 0x3F, 0x3C, 0xC0, 0xE0, + 0x79, 0x00, 0xB6, 0x34, 0xB7, 0x3C, 0xC0, 0xE0, 0x74, 0x00, 0xCA, 0x34, + 0xCB, 0x3C, 0xC0, 0xE0, 0x6D, 0x00, 0x49, 0xE0, 0x25, 0x30, 0x0A, 0xAF, + 0x34, 0x30, 0x02, 0xAF, 0x06, 0xA8, 0x37, 0x3C, 0x11, 0xAF, 0xFF, 0xA8, + 0x2B, 0x3E, 0x7A, 0x3E, 0xD1, 0x3E, 0x3D, 0x28, 0xBA, 0xF0, 0x00, 0xA2, + 0xAE, 0x3C, 0xAF, 0x3C, 0x1E, 0xE4, 0x5F, 0x06, 0x1E, 0xE4, 0x5F, 0x06, + 0x1E, 0xE4, 0x4B, 0x06, 0x2B, 0x2A, 0x07, 0xA1, 0x28, 0x62, 0x28, 0x3E, + 0x55, 0x28, 0x18, 0xE4, 0x9C, 0x0A, 0x6C, 0x28, 0x18, 0xE4, 0xDF, 0x0A, + 0x2E, 0xE4, 0x3D, 0x28, 0x2A, 0xE4, 0xAF, 0x2A, 0xAF, 0x28, 0x02, 0xA8, + 0x0A, 0xE4, 0x27, 0x06, 0x03, 0xA1, 0x03, 0xAF, 0x04, 0xE0, 0x00, 0x04, + 0x42, 0xE0, 0x94, 0xE0, 0x02, 0x29, 0xAF, 0x2A, 0x03, 0xA8, 0x0B, 0xE4, + 0x32, 0x06, 0x10, 0xAF, 0x08, 0xE0, 0xFF, 0x00, 0x05, 0xE0, 0x68, 0x03, + 0x42, 0xE0, 0x94, 0xE0, 0x02, 0x29, 0x7A, 0x3C, 0xAF, 0x28, 0x02, 0xA0, + 0xAF, 0x3C, 0x03, 0xA2, 0x0D, 0xAE, 0x45, 0xE0, 0x1B, 0xE4, 0x5F, 0x06, + 0x03, 0xA2, 0x0F, 0xAE, 0x45, 0xE0, 0x59, 0xF0, 0x00, 0xA2, 0xAF, 0x3C, + 0x1E, 0xE4, 0x5F, 0x06, 0x2E, 0xE4, 0x00, 0xA2, 0x6D, 0x3C, 0x64, 0xE1, + 0x68, 0x03, 0x22, 0xD0, 0x08, 0x00, 0x84, 0xE1, 0x5D, 0x06, 0x3B, 0x28, + 0x3A, 0x84, 0x6D, 0x82, 0x19, 0xE0, 0x46, 0xE0, 0x28, 0x60, 0x29, 0x64, + 0x14, 0x3D, 0x6D, 0x28, 0x02, 0xA0, 0x6D, 0x3C, 0x2E, 0xE4, 0x28, 0xCA, + 0xF8, 0xF7, 0x04, 0xE0, 0x00, 0x04, 0xAE, 0x2A, 0x0B, 0xAE, 0x42, 0xE0, + 0x22, 0xCE, 0xCA, 0x24, 0xCB, 0x4C, 0x20, 0xCE, 0x04, 0xE0, 0x20, 0x00, + 0x24, 0xCE, 0x13, 0xD1, 0x01, 0x00, 0xCA, 0x24, 0xCB, 0x4C, 0x03, 0xA2, + 0x0D, 0xAE, 0x42, 0xE0, 0xCA, 0x34, 0xCB, 0x3C, 0xAE, 0x28, 0x16, 0xE0, + 0xAE, 0x3C, 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, 0xC1, 0xE0, 0x57, 0x00, + 0x04, 0xE0, 0xF0, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x58, 0x00, + 0x04, 0xE0, 0xF2, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x59, 0x00, + 0x04, 0xE0, 0xF1, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5A, 0x00, + 0x04, 0xE0, 0xF3, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5B, 0x00, + 0x04, 0xE0, 0xE8, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5C, 0x00, + 0x04, 0xE0, 0xEA, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5D, 0x00, + 0x04, 0xE0, 0xE9, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xC1, 0xE0, 0x5E, 0x00, + 0x04, 0xE0, 0xEB, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0x05, 0xA2, 0x04, 0xE0, + 0xC0, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0x1E, 0xE4, 0x5C, 0x05, 0x00, 0xA2, + 0x62, 0x3C, 0x63, 0x3C, 0x75, 0x3C, 0x76, 0x3C, 0x74, 0x3C, 0xAC, 0x3C, + 0xAD, 0x3C, 0x72, 0x3C, 0x73, 0x3C, 0xC0, 0xE0, 0x44, 0x00, 0x40, 0x3C, + 0x12, 0xAF, 0x7E, 0xA8, 0x41, 0x3C, 0xC0, 0xE0, 0x45, 0x00, 0x42, 0x3C, + 0xC0, 0xE0, 0x46, 0x00, 0x43, 0x3C, 0xC0, 0xE0, 0x47, 0x00, 0x45, 0x34, + 0x44, 0x3C, 0xC0, 0xE0, 0x48, 0x00, 0x49, 0x34, 0x08, 0xE0, 0xFF, 0x07, + 0x49, 0xE0, 0x3E, 0xA8, 0x02, 0xA1, 0x46, 0x3C, 0x4A, 0xE0, 0x14, 0xAF, + 0x48, 0x30, 0x0B, 0xAF, 0x3F, 0xA8, 0x47, 0x3E, 0xC0, 0xE0, 0x49, 0x00, + 0x56, 0x30, 0xC0, 0xE0, 0x4A, 0x00, 0x57, 0x30, 0xC0, 0xE0, 0x4B, 0x00, + 0x58, 0x30, 0xC0, 0xE0, 0x4C, 0x00, 0x59, 0x30, 0x02, 0xAF, 0x5A, 0x30, + 0xC0, 0xE0, 0x4D, 0x00, 0x4A, 0x30, 0x02, 0xAF, 0x4B, 0x30, 0x02, 0xAF, + 0x4C, 0x30, 0x02, 0xAF, 0x49, 0xE0, 0x1E, 0xA8, 0x4D, 0x3C, 0x0B, 0xAF, + 0x4A, 0xE0, 0x1E, 0xA8, 0x4E, 0x3C, 0x19, 0xAF, 0x1F, 0xA8, 0x4F, 0x3E, + 0x39, 0x28, 0xAA, 0xF1, 0xC0, 0xE0, 0x50, 0x00, 0x5D, 0x34, 0x5E, 0x3C, + 0x15, 0xA2, 0x1E, 0xE4, 0xF1, 0x09, 0x49, 0xE0, 0x06, 0xAE, 0x42, 0xE0, + 0x5D, 0x34, 0x5E, 0x3C, 0x27, 0x28, 0xCA, 0xF0, 0x22, 0x28, 0x98, 0x34, + 0x99, 0x3C, 0x02, 0xA1, 0x44, 0xCC, 0x65, 0xE1, 0x71, 0x03, 0x84, 0xE1, + 0x16, 0x07, 0x03, 0xA2, 0x15, 0x3F, 0xC0, 0xE0, 0x51, 0x00, 0x00, 0xA4, + 0x5D, 0x22, 0x5E, 0x4E, 0x66, 0xE0, 0x5F, 0x34, 0x60, 0x3C, 0xA4, 0x34, + 0xA5, 0x3C, 0xC0, 0xE0, 0x4F, 0x00, 0x5B, 0x34, 0x5C, 0x3C, 0x1E, 0xE4, + 0x61, 0x0A, 0x1C, 0xA1, 0x00, 0xA4, 0x95, 0x3C, 0x5B, 0x20, 0x5C, 0x4C, + 0x95, 0x5C, 0x9F, 0x3C, 0x98, 0x20, 0x99, 0x4C, 0x96, 0x34, 0x97, 0x3C, + 0x00, 0xA2, 0x98, 0x34, 0x99, 0x3C, 0xC1, 0xE0, 0x52, 0x00, 0x4A, 0xE0, + 0x20, 0xAF, 0x08, 0xE0, 0xFF, 0x00, 0x65, 0x3C, 0x4A, 0xE0, 0x30, 0xAF, + 0x64, 0x3C, 0x4A, 0xE0, 0x1E, 0xA8, 0x67, 0x3C, 0x09, 0xAF, 0x1F, 0xA8, + 0x66, 0x3E, 0x65, 0xE1, 0x00, 0x01, 0xC1, 0xE0, 0x53, 0x00, 0x1E, 0xE4, + 0x7C, 0x07, 0xC1, 0xE0, 0x54, 0x00, 0x1E, 0xE4, 0x7C, 0x07, 0x65, 0xE1, + 0x50, 0x01, 0xC1, 0xE0, 0x55, 0x00, 0x1E, 0xE4, 0x7C, 0x07, 0xC1, 0xE0, + 0x56, 0x00, 0x1E, 0xE4, 0x7C, 0x07, 0xC1, 0xE0, 0x5F, 0x00, 0x4A, 0xE0, + 0x06, 0xA8, 0xB8, 0x3C, 0x4A, 0xE0, 0x04, 0xAF, 0x08, 0xE0, 0xFF, 0x00, + 0xB9, 0x3C, 0x4A, 0xE0, 0x14, 0xAF, 0x08, 0xE0, 0xFF, 0x00, 0xBA, 0x3C, + 0x4A, 0xE0, 0x24, 0xAF, 0xBB, 0x30, 0x02, 0xAF, 0xBC, 0x30, 0x02, 0xAF, + 0xBD, 0x30, 0x02, 0xAF, 0xBE, 0x30, 0x02, 0xAF, 0x61, 0x30, 0xC0, 0xE0, + 0x60, 0x00, 0xBF, 0x34, 0xC0, 0x3C, 0xC0, 0xE0, 0x61, 0x00, 0xC1, 0x34, + 0xC2, 0x3C, 0x2E, 0xE4, 0x4A, 0xE0, 0x08, 0xE0, 0xFF, 0x00, 0x15, 0x3D, + 0x4A, 0xE0, 0x10, 0xAF, 0x08, 0xE0, 0xFF, 0x00, 0x15, 0x3D, 0x4A, 0xE0, + 0x20, 0xAF, 0x08, 0xE0, 0xFF, 0x00, 0x15, 0x3D, 0x31, 0xAF, 0x09, 0xE0, + 0xFF, 0x00, 0x15, 0x3F, 0x2E, 0xE4, 0xC0, 0xE0, 0x42, 0x00, 0x4A, 0xF0, + 0x04, 0xA1, 0xFA, 0xF0, 0x2E, 0xF1, 0x04, 0xE0, 0x14, 0x02, 0x1E, 0xE4, + 0x88, 0x00, 0xC2, 0xE0, 0x7A, 0x00, 0x04, 0xE0, 0x11, 0x02, 0x1E, 0xE4, + 0x88, 0x00, 0xC2, 0xE0, 0x7B, 0x00, 0x5E, 0xF0, 0x70, 0x28, 0x2A, 0xE4, + 0x1E, 0xE4, 0xB0, 0x07, 0x00, 0xA2, 0xC2, 0xE0, 0x7E, 0x00, 0x02, 0xA2, + 0xC1, 0xE0, 0x42, 0x00, 0x05, 0xA1, 0x29, 0xE4, 0x77, 0x28, 0x2E, 0xE4, + 0xA0, 0x24, 0xA1, 0x4C, 0xC2, 0xE0, 0x75, 0x00, 0xAA, 0x28, 0xC2, 0xE0, + 0x77, 0x00, 0xAB, 0x28, 0xC2, 0xE0, 0x76, 0x00, 0x75, 0x20, 0x76, 0x4C, + 0xC2, 0xE0, 0x79, 0x00, 0x74, 0xCA, 0xC2, 0xE0, 0x78, 0x00, 0x1A, 0xCB, + 0xC2, 0xE0, 0x70, 0x00, 0x1C, 0xCB, 0xC2, 0xE0, 0x6D, 0x00, 0x9E, 0xCB, + 0xC2, 0xE0, 0x6F, 0x00, 0x63, 0x20, 0x62, 0x4C, 0xC2, 0xE0, 0x6C, 0x00, + 0x2E, 0xE4, 0x02, 0xA2, 0xD0, 0xCE, 0x40, 0x28, 0xCC, 0xCE, 0x8C, 0xC8, + 0x0C, 0xA0, 0x8C, 0xCC, 0x2E, 0xE4, 0x83, 0x2A, 0x17, 0xE0, 0x81, 0xBA, + 0x41, 0x28, 0x49, 0xE0, 0x26, 0xA1, 0x2B, 0xA1, 0x52, 0xE0, 0x28, 0xF0, + 0xC0, 0xBA, 0x42, 0x28, 0xFC, 0xBB, 0x83, 0x28, 0x6A, 0xF0, 0x03, 0xA2, + 0x3B, 0xF0, 0x7F, 0x2A, 0x81, 0xBA, 0x43, 0x70, 0x7F, 0x2A, 0x09, 0xE4, + 0x52, 0x08, 0x33, 0x28, 0xFC, 0xBB, 0x41, 0x28, 0x26, 0xA1, 0x7A, 0xF3, + 0x44, 0x28, 0x45, 0x70, 0x48, 0x28, 0x80, 0xBA, 0x1A, 0xE4, 0x56, 0x08, + 0x48, 0x28, 0x5A, 0xF0, 0x46, 0x2A, 0x37, 0xF0, 0x47, 0x28, 0x49, 0x70, + 0x61, 0x28, 0x5A, 0xF2, 0xB8, 0x28, 0xFC, 0xBB, 0x26, 0xF2, 0xB9, 0x28, + 0x45, 0x70, 0xBB, 0x28, 0x80, 0xBA, 0xBD, 0x28, 0x80, 0xBA, 0x9A, 0xF0, + 0xBF, 0x20, 0x5A, 0xF0, 0xC0, 0x4C, 0x1E, 0xE4, 0x84, 0x01, 0x3E, 0xF0, + 0xC0, 0x28, 0xFC, 0xBB, 0xB8, 0x28, 0x02, 0xA1, 0x06, 0xF1, 0xBA, 0x28, + 0x45, 0x70, 0xBC, 0x28, 0x80, 0xBA, 0xBE, 0x28, 0x80, 0xBA, 0x9A, 0xF0, + 0xC1, 0x20, 0x5A, 0xF0, 0xC2, 0x4C, 0x1E, 0xE4, 0x84, 0x01, 0x3E, 0xF0, + 0xC2, 0x28, 0xFC, 0xBB, 0x56, 0x2A, 0x3B, 0xF0, 0x36, 0x28, 0x80, 0xBA, + 0x57, 0x2A, 0x4B, 0xF0, 0x34, 0x28, 0x80, 0xBA, 0x80, 0xBA, 0x33, 0x2A, + 0x05, 0xA1, 0xCB, 0xF1, 0xC0, 0xBA, 0x4A, 0x28, 0xEA, 0xF0, 0x4B, 0x28, + 0x80, 0xBA, 0x3A, 0xF0, 0x4E, 0x28, 0x4D, 0x70, 0x33, 0x2A, 0x01, 0xA1, + 0x69, 0xF0, 0x4C, 0x28, 0x80, 0xBA, 0x3A, 0xF0, 0x4F, 0x28, 0x4D, 0x70, + 0x33, 0x2A, 0x01, 0xA1, 0x69, 0xF0, 0xC0, 0xBA, 0x36, 0x28, 0x3A, 0xF0, + 0x58, 0x28, 0x80, 0xBA, 0x0A, 0xA2, 0x37, 0x18, 0xFC, 0xBB, 0x2B, 0x28, + 0x34, 0xA1, 0xFE, 0xBB, 0x59, 0x2A, 0x3B, 0xF0, 0x5A, 0x28, 0x80, 0xBA, + 0xE0, 0xBA, 0x1E, 0xE4, 0x7B, 0x01, 0x2E, 0xE4, 0xC0, 0xBA, 0x67, 0x2A, + 0xFD, 0xBB, 0x66, 0x28, 0xFC, 0xBB, 0x65, 0xE1, 0x00, 0x01, 0x03, 0xA1, + 0x95, 0xF0, 0x45, 0xCC, 0x65, 0x2A, 0x84, 0xE1, 0x66, 0x08, 0x15, 0x29, + 0xFC, 0xBB, 0x81, 0xBA, 0x03, 0xAF, 0x65, 0xE1, 0x50, 0x01, 0x66, 0x2A, + 0x03, 0xA1, 0x95, 0xF0, 0x45, 0xCC, 0x64, 0x2A, 0x84, 0xE1, 0x73, 0x08, + 0x15, 0x29, 0xFC, 0xBB, 0x81, 0xBA, 0x03, 0xAF, 0x2E, 0xE4, 0x1E, 0xE4, + 0xCF, 0x07, 0x1E, 0xE4, 0xD7, 0x07, 0x8B, 0xC8, 0x72, 0x36, 0x73, 0x3E, + 0x50, 0x06, 0x51, 0x0E, 0x50, 0x36, 0x51, 0x3E, 0x2E, 0xE4, 0x81, 0x28, + 0x82, 0x08, 0x2A, 0xE4, 0x1E, 0xE4, 0x99, 0x08, 0x1E, 0xE4, 0xB3, 0x08, + 0x2A, 0x28, 0x7B, 0x3C, 0x1E, 0xE4, 0xD6, 0x08, 0x81, 0x28, 0xAC, 0x3C, + 0x82, 0x28, 0xAD, 0x3C, 0x91, 0x28, 0x71, 0x18, 0x20, 0xE4, 0x55, 0x28, + 0x18, 0xE4, 0xB5, 0x0A, 0x1E, 0xE4, 0x27, 0x09, 0x2E, 0xE4, 0x00, 0xA2, + 0x78, 0x3C, 0x79, 0x3C, 0x33, 0x2A, 0x7D, 0x3E, 0x91, 0x28, 0x1A, 0xF1, + 0x2E, 0x2A, 0x5B, 0xF0, 0x0F, 0xC7, 0x2E, 0x7C, 0x20, 0xAF, 0xBA, 0xF0, + 0x2D, 0x2A, 0x6B, 0xF0, 0x91, 0x28, 0x0F, 0xC7, 0x2D, 0x7C, 0x20, 0xAF, + 0x2A, 0xF0, 0x2E, 0xE4, 0x02, 0xA2, 0x78, 0x3C, 0x02, 0xA2, 0x79, 0x3C, + 0x2E, 0xE4, 0x33, 0x2A, 0x05, 0xA1, 0xEB, 0xF1, 0x2F, 0x28, 0xDA, 0xF1, + 0x02, 0xA1, 0x1A, 0xF1, 0x02, 0xA1, 0x3A, 0xF1, 0x02, 0xA1, 0x5A, 0xF0, + 0x02, 0xA1, 0x4A, 0xF1, 0x00, 0xA2, 0x3E, 0xF1, 0x91, 0x2A, 0x38, 0x1A, + 0x05, 0xF1, 0x0F, 0xC7, 0x30, 0x7E, 0x21, 0xAF, 0xBB, 0xF0, 0xBE, 0xF0, + 0x93, 0x2A, 0x31, 0x1E, 0x85, 0xF0, 0x4E, 0xF0, 0x92, 0x2A, 0x32, 0x1E, + 0x45, 0xF0, 0x30, 0x1E, 0x23, 0xF0, 0x02, 0xA2, 0x7C, 0x3C, 0x2E, 0xE4, + 0xAC, 0x28, 0x28, 0xF2, 0x27, 0x28, 0x0A, 0xF2, 0x05, 0xE0, 0x71, 0x03, + 0xAD, 0x0A, 0x99, 0xE0, 0x04, 0x2D, 0x6D, 0x3C, 0x9F, 0x84, 0x6D, 0x82, + 0x18, 0xE0, 0x96, 0x26, 0x97, 0x4E, 0x1E, 0xE4, 0x09, 0x0A, 0x95, 0x58, + 0x23, 0x2A, 0x1E, 0xE4, 0xF1, 0x09, 0x05, 0xE0, 0xFF, 0x7F, 0x66, 0xE0, + 0x9E, 0x3C, 0x00, 0xA2, 0x9A, 0x34, 0x9B, 0x3C, 0x9C, 0x34, 0x9D, 0x3C, + 0x96, 0x24, 0x97, 0x4C, 0x6D, 0x1C, 0x96, 0x34, 0x97, 0x3C, 0x1E, 0xE4, + 0x1F, 0x06, 0x6C, 0x28, 0x18, 0xE4, 0xF8, 0x0A, 0xA0, 0x24, 0xA1, 0x4C, + 0x84, 0x00, 0x85, 0x0C, 0xA0, 0x34, 0xA1, 0x3C, 0x27, 0x28, 0x18, 0xE4, + 0x9B, 0x09, 0x27, 0x28, 0xEA, 0xF1, 0x23, 0x28, 0x02, 0xA1, 0xAC, 0x1C, + 0xA8, 0xF1, 0x9F, 0x2E, 0x9A, 0x24, 0x9B, 0x4C, 0x95, 0x5C, 0x45, 0xE0, + 0x01, 0xA4, 0x9F, 0x3E, 0x9C, 0x24, 0x9D, 0x4C, 0x23, 0x2A, 0x1E, 0xE4, + 0xF1, 0x09, 0x02, 0xA4, 0x98, 0x26, 0x99, 0x4E, 0x41, 0xE0, 0x98, 0x36, + 0x99, 0x3E, 0x2A, 0x2A, 0x69, 0xF0, 0x05, 0xE0, 0x71, 0x03, 0xAD, 0x0A, + 0x99, 0xE0, 0x04, 0x3D, 0x2E, 0xE4, 0x04, 0xE0, 0xFF, 0x02, 0x1E, 0xE4, + 0x88, 0x00, 0x0A, 0xA1, 0xB2, 0xF7, 0x6B, 0x2A, 0x1B, 0xAE, 0x78, 0x28, + 0x18, 0xAE, 0x55, 0xE0, 0x79, 0x28, 0x16, 0xAE, 0x55, 0xE0, 0x7A, 0x28, + 0x0A, 0xAE, 0x55, 0xE0, 0x7B, 0x28, 0x08, 0xAE, 0x55, 0xE0, 0x00, 0xA2, + 0x06, 0xAE, 0x55, 0xE0, 0x7C, 0x28, 0x04, 0xAE, 0x55, 0xE0, 0x7D, 0x28, + 0x55, 0xE0, 0x04, 0xE0, 0xFF, 0x02, 0x1E, 0xE4, 0x93, 0x00, 0xA2, 0x24, + 0xA3, 0x4C, 0x7A, 0x08, 0xA2, 0x34, 0xA3, 0x3C, 0x91, 0x28, 0x02, 0xA0, + 0x91, 0x3C, 0x92, 0x28, 0x02, 0xA0, 0x92, 0x3C, 0x23, 0x18, 0x28, 0xE4, + 0x00, 0xA2, 0x92, 0x3C, 0x93, 0x28, 0x02, 0xA0, 0x93, 0x3C, 0x2E, 0xE4, + 0x72, 0x22, 0x73, 0x4E, 0x8A, 0xC8, 0x72, 0x34, 0x73, 0x3C, 0x46, 0xE0, + 0x49, 0xE0, 0x74, 0x3C, 0x12, 0xCB, 0x84, 0x34, 0x85, 0x3C, 0xD2, 0x34, + 0xD3, 0x3C, 0x14, 0xCB, 0x86, 0x34, 0x87, 0x3C, 0xD8, 0x34, 0xD9, 0x3C, + 0x1E, 0xE4, 0xD6, 0x08, 0xA2, 0x24, 0xA3, 0x4C, 0x94, 0x2A, 0x03, 0xAF, + 0x42, 0xE0, 0x94, 0x2A, 0x1E, 0xE4, 0xF1, 0x09, 0xAA, 0x3C, 0xA0, 0x24, + 0xA1, 0x4C, 0x94, 0x2A, 0x03, 0xAF, 0x42, 0xE0, 0x94, 0x2A, 0x1E, 0xE4, + 0xF1, 0x09, 0xAB, 0x3C, 0x1E, 0xE4, 0x61, 0x0A, 0xAB, 0x3C, 0x27, 0x28, + 0x2A, 0xF1, 0x96, 0x24, 0x97, 0x4C, 0xD4, 0x34, 0xD5, 0x3C, 0x2A, 0x2A, + 0xC9, 0xF0, 0x9C, 0x20, 0x9D, 0x4C, 0xD6, 0x34, 0xD7, 0x3C, 0x23, 0x2A, + 0x1E, 0xE4, 0xF1, 0x09, 0x02, 0xA4, 0x98, 0x26, 0x99, 0x4E, 0x42, 0xE0, + 0x98, 0x34, 0x99, 0x3C, 0xDA, 0x34, 0xDB, 0x3C, 0x2E, 0xE4, 0x3D, 0x28, + 0x38, 0xF0, 0x2B, 0x28, 0x7A, 0x3C, 0x9A, 0x24, 0x9B, 0x4C, 0x74, 0x0C, + 0x9A, 0x34, 0x9B, 0x3C, 0x86, 0x26, 0x87, 0x4E, 0x0D, 0xAF, 0x04, 0xE0, + 0xFF, 0x7F, 0x65, 0xE0, 0x9C, 0x24, 0x9D, 0x4C, 0x42, 0xE0, 0x9C, 0x34, + 0x9D, 0x3C, 0xA4, 0x20, 0xA5, 0x4C, 0x74, 0x0C, 0x9E, 0x1C, 0xA4, 0x34, + 0xA5, 0x3C, 0x5F, 0x22, 0x60, 0x4E, 0x46, 0xE0, 0xA6, 0x34, 0xA7, 0x3C, + 0xB4, 0xF1, 0x29, 0x28, 0x2B, 0x18, 0xA8, 0x3C, 0xA9, 0x3C, 0x5D, 0x20, + 0x5E, 0x4C, 0x46, 0xE0, 0x0C, 0xAF, 0x6E, 0x34, 0x6F, 0x3C, 0xCA, 0xF0, + 0xA8, 0x84, 0xA6, 0x20, 0xA7, 0x4C, 0x0C, 0xAF, 0x1E, 0xE4, 0x34, 0x0A, + 0x6E, 0x22, 0x6F, 0x4E, 0x1E, 0xE4, 0x09, 0x0A, 0xA9, 0x3C, 0x7A, 0x28, + 0xA9, 0x0C, 0x29, 0x64, 0xBE, 0xF1, 0x2B, 0x28, 0x28, 0x18, 0xA8, 0x3C, + 0xA9, 0x3C, 0x5F, 0x20, 0x60, 0x4C, 0x0C, 0xAF, 0x6E, 0x34, 0x6F, 0x3C, + 0xEA, 0xF0, 0xA8, 0x84, 0xA6, 0x22, 0xA7, 0x4E, 0x00, 0xA2, 0x46, 0xE0, + 0x0C, 0xAF, 0x1E, 0xE4, 0x34, 0x0A, 0x6E, 0x22, 0x6F, 0x4E, 0x1E, 0xE4, + 0x09, 0x0A, 0xA9, 0x3C, 0x7A, 0x28, 0xA9, 0x1C, 0x28, 0x60, 0x7A, 0x3C, + 0x2E, 0xE4, 0x8A, 0x3E, 0x01, 0xA2, 0x32, 0xF0, 0x12, 0xE0, 0x03, 0xA2, + 0x8E, 0x3E, 0x8B, 0x3C, 0x20, 0xAF, 0x0F, 0xC7, 0x8A, 0x7C, 0x8C, 0x3C, + 0x20, 0xAF, 0x20, 0xAE, 0x8B, 0x4C, 0x0F, 0xC7, 0x8A, 0x7C, 0x8D, 0x3C, + 0x8F, 0x34, 0x8C, 0x20, 0x8D, 0x4C, 0x8E, 0x2A, 0x2B, 0xE4, 0x12, 0xE0, + 0x2E, 0xE4, 0x89, 0x36, 0x8A, 0x3E, 0x01, 0xA2, 0x8E, 0x3E, 0x89, 0x22, + 0x8A, 0x4E, 0x8E, 0x5A, 0x45, 0xE0, 0x61, 0xF0, 0x8E, 0x2A, 0x03, 0xA0, + 0x8E, 0x3E, 0x21, 0xA1, 0x75, 0xF7, 0x8E, 0x2A, 0x39, 0xF0, 0x00, 0xA2, + 0x2E, 0xE4, 0x03, 0xA1, 0x8E, 0x3E, 0x45, 0xCC, 0x01, 0xA2, 0x8D, 0x3E, + 0x84, 0xE1, 0x31, 0x0A, 0x8D, 0x2A, 0x03, 0xAE, 0x8D, 0x3E, 0x89, 0x22, + 0x8A, 0x4E, 0x8E, 0x5A, 0x45, 0xE0, 0x61, 0xF0, 0x13, 0xE0, 0x4A, 0xE0, + 0x8D, 0x2E, 0x03, 0xA0, 0x8D, 0x3E, 0x8E, 0x2A, 0x03, 0xA1, 0x8E, 0x3E, + 0x8D, 0x2C, 0x2E, 0xE4, 0x02, 0xAE, 0x89, 0x34, 0x08, 0xE0, 0xFF, 0xFF, + 0x02, 0xAF, 0x8A, 0x3C, 0x89, 0x82, 0x18, 0xE0, 0x1E, 0xAE, 0x8A, 0x82, + 0x1C, 0xE0, 0x2E, 0xE4, 0x8A, 0x3E, 0x6D, 0x3C, 0x1E, 0xAF, 0x6E, 0x3C, + 0x6D, 0x28, 0x08, 0xE0, 0xFF, 0x7F, 0x6D, 0x3C, 0x6D, 0x82, 0x18, 0xE0, + 0x6D, 0x3C, 0x1E, 0xAF, 0x6F, 0x3C, 0x6E, 0x82, 0x18, 0xE0, 0x6F, 0x08, + 0x0F, 0xC7, 0x8A, 0x7C, 0x90, 0x3C, 0x8F, 0x34, 0x6D, 0x28, 0x08, 0xE0, + 0xFF, 0x7F, 0x8F, 0x2E, 0x1F, 0xAE, 0x42, 0xE0, 0x8A, 0x2A, 0x1E, 0xE4, + 0xF1, 0x09, 0x90, 0x2E, 0x1F, 0xAE, 0x42, 0xE0, 0x2E, 0xE4, 0x41, 0xA2, + 0x6D, 0x3E, 0x6D, 0x2A, 0x03, 0xA1, 0x6D, 0x3E, 0x5B, 0xF0, 0x03, 0xA2, + 0x6D, 0x5A, 0x51, 0xE0, 0x9B, 0xF7, 0x6D, 0x28, 0x2E, 0xE4, 0x77, 0xCA, + 0x39, 0xF0, 0x1E, 0xE4, 0xE9, 0x01, 0x1E, 0xE4, 0xF1, 0x01, 0x72, 0xCA, + 0x02, 0xA8, 0xE8, 0xF7, 0x04, 0xE0, 0x00, 0x02, 0x82, 0x2A, 0x03, 0xA1, + 0x03, 0xAE, 0x42, 0xE0, 0x9E, 0xE0, 0x75, 0x22, 0x76, 0x4E, 0xDA, 0xCA, + 0x76, 0x3C, 0x75, 0x34, 0x46, 0xE0, 0x17, 0x3D, 0x17, 0x35, 0x1E, 0xE4, + 0x74, 0x01, 0x00, 0xA2, 0x72, 0x3C, 0x73, 0x3C, 0x2E, 0xE4, 0x28, 0xCA, + 0xF8, 0xF7, 0x11, 0xD1, 0x00, 0x03, 0xC0, 0xE0, 0x78, 0x00, 0x00, 0xE0, + 0x00, 0x04, 0x20, 0xCE, 0x04, 0xE0, 0x68, 0x00, 0x24, 0xCE, 0x13, 0xD1, + 0x01, 0x00, 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, 0x28, 0xCA, 0xF8, 0xF7, + 0x04, 0xE0, 0x40, 0x04, 0x22, 0xCE, 0x52, 0x24, 0x53, 0x4C, 0x20, 0xCE, + 0x94, 0x2A, 0x03, 0xAF, 0x07, 0xA0, 0x05, 0xAF, 0x05, 0xAE, 0x04, 0xE0, + 0x00, 0x01, 0x46, 0xE0, 0x30, 0xF0, 0x05, 0xE0, 0x00, 0x01, 0x25, 0xCE, + 0x13, 0xD1, 0x01, 0x00, 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, 0x54, 0x2C, + 0x02, 0xE0, 0x00, 0x02, 0xB4, 0xF0, 0x00, 0xA2, 0x54, 0x3C, 0x52, 0x24, + 0x53, 0x4C, 0x00, 0xE0, 0x00, 0x02, 0x52, 0x34, 0x53, 0x3C, 0x1E, 0xE4, + 0x9C, 0x0A, 0x54, 0x2C, 0x02, 0xAF, 0x05, 0xE0, 0x40, 0x04, 0x41, 0xE0, + 0x95, 0xE0, 0x02, 0x2B, 0x54, 0x28, 0x02, 0xA8, 0x2A, 0xF0, 0x11, 0xAF, + 0x09, 0xE0, 0x03, 0x00, 0xBB, 0xF0, 0x03, 0xA1, 0x4B, 0xF0, 0x03, 0xA1, + 0x5B, 0xF0, 0x6E, 0xF0, 0x02, 0xA2, 0x7B, 0x3C, 0x3E, 0xF0, 0x02, 0xA2, + 0x7C, 0x3C, 0x54, 0x2C, 0x02, 0xA0, 0x54, 0x3C, 0x2E, 0xE4, 0x28, 0xCA, + 0xF8, 0xF7, 0x04, 0xE0, 0x00, 0x04, 0x22, 0xCE, 0xCA, 0x24, 0xCB, 0x4C, + 0x20, 0xCE, 0x94, 0x2A, 0x03, 0xAF, 0x07, 0xA0, 0x05, 0xAF, 0x05, 0xAE, + 0x04, 0xE0, 0x40, 0x00, 0x46, 0xE0, 0x30, 0xF0, 0x05, 0xE0, 0x40, 0x00, + 0x25, 0xCE, 0x13, 0xD1, 0x01, 0x00, 0x28, 0xCA, 0xF8, 0xF7, 0x2E, 0xE4, + 0xC9, 0x2C, 0x02, 0xE0, 0x80, 0x00, 0xB4, 0xF0, 0x00, 0xA2, 0xC9, 0x3C, + 0xCA, 0x24, 0xCB, 0x4C, 0x00, 0xE0, 0x80, 0x00, 0xCA, 0x34, 0xCB, 0x3C, + 0x1E, 0xE4, 0xDF, 0x0A, 0xC9, 0x2C, 0x02, 0xAF, 0x05, 0xE0, 0x00, 0x04, + 0x41, 0xE0, 0x95, 0xE0, 0x02, 0x2B, 0xC9, 0x28, 0x02, 0xA8, 0x2A, 0xF0, + 0x11, 0xAF, 0x7F, 0xA8, 0x7A, 0x3E, 0xC9, 0x2C, 0x02, 0xA0, 0xC9, 0x3C, + 0x2E, 0xE4, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, 0x90, 0xE1, + 0x00, 0x40, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xA6, 0x3F, 0x00, 0x00, 0xFA, 0x3F, 0x00, 0x00, + 0xF8, 0x3F, 0x00, 0x00, 0xF6, 0x3F, 0x00, 0x00, 0xF4, 0x3F, 0x00, 0x00, + 0xF2, 0x3F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0xEE, 0x3F, 0x00, 0x00, + 0xEA, 0x3F, 0x00, 0x00, 0xDE, 0x3F, 0x00, 0x00, 0x0E, 0x40, 0x00, 0x00, + 0x0C, 0x40, 0x00, 0x00, 0x0A, 0x40, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, + 0x06, 0x40, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, + 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x04, 0x02, 0x05, 0x08, 0x03, 0x06, + 0x09, 0x0C, 0x07, 0x0A, 0x0D, 0x0B, 0x0E, 0x0F, 0x00, 0x01, 0x08, 0x02, + 0x09, 0x10, 0x03, 0x0A, 0x11, 0x18, 0x04, 0x0B, 0x12, 0x19, 0x20, 0x05, + 0x0C, 0x13, 0x1A, 0x21, 0x28, 0x06, 0x0D, 0x14, 0x1B, 0x22, 0x29, 0x30, + 0x07, 0x0E, 0x15, 0x1C, 0x23, 0x2A, 0x31, 0x38, 0x0F, 0x16, 0x1D, 0x24, + 0x2B, 0x32, 0x39, 0x17, 0x1E, 0x25, 0x2C, 0x33, 0x3A, 0x1F, 0x26, 0x2D, + 0x34, 0x3B, 0x27, 0x2E, 0x35, 0x3C, 0x2F, 0x36, 0x3D, 0x37, 0x3E, 0x3F, + 0x10, 0x10, 0x10, 0x10, 0x11, 0x12, 0x15, 0x18, 0x10, 0x10, 0x10, 0x10, + 0x11, 0x13, 0x16, 0x19, 0x10, 0x10, 0x11, 0x12, 0x14, 0x16, 0x19, 0x1D, + 0x10, 0x10, 0x12, 0x15, 0x18, 0x1B, 0x1F, 0x24, 0x11, 0x11, 0x14, 0x18, + 0x1E, 0x23, 0x29, 0x2F, 0x12, 0x13, 0x16, 0x1B, 0x23, 0x2C, 0x36, 0x41, + 0x15, 0x16, 0x19, 0x1F, 0x29, 0x36, 0x46, 0x58, 0x18, 0x19, 0x1D, 0x24, + 0x2F, 0x41, 0x58, 0x73, 0x10, 0x10, 0x10, 0x10, 0x11, 0x12, 0x14, 0x18, + 0x10, 0x10, 0x10, 0x11, 0x12, 0x14, 0x18, 0x19, 0x10, 0x10, 0x11, 0x12, + 0x14, 0x18, 0x19, 0x1C, 0x10, 0x11, 0x12, 0x14, 0x18, 0x19, 0x1C, 0x21, + 0x11, 0x12, 0x14, 0x18, 0x19, 0x1C, 0x21, 0x29, 0x12, 0x14, 0x18, 0x19, + 0x1C, 0x21, 0x29, 0x36, 0x14, 0x18, 0x19, 0x1C, 0x21, 0x29, 0x36, 0x47, + 0x18, 0x19, 0x1C, 0x21, 0x29, 0x36, 0x47, 0x5B, 0xF2, 0x6E, 0x00, 0x00, + 0xDC, 0x70, 0x00, 0x00, 0xC4, 0x72, 0x00, 0x00, 0x02, 0x71, 0x00, 0x00, + 0x3A, 0x71, 0x00, 0x00, 0x66, 0x71, 0x00, 0x00, 0xBA, 0x72, 0x00, 0x00, + 0xA4, 0xC2, 0x00, 0x00, 0xA4, 0xC2, 0x00, 0x00, 0xB0, 0xC2, 0x00, 0x00, + 0xB0, 0xC2, 0x00, 0x00, 0xBC, 0xC2, 0x00, 0x00, 0xBC, 0xC2, 0x00, 0x00, + 0xC0, 0xC2, 0x00, 0x00, 0xC0, 0xC2, 0x00, 0x00, 0xC4, 0xC2, 0x00, 0x00, + 0xC4, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, + 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, + 0x1C, 0xC2, 0x00, 0x00, 0xC8, 0xC2, 0x00, 0x00, 0xC8, 0xC2, 0x00, 0x00, + 0xC8, 0xC2, 0x00, 0x00, 0xCC, 0xC2, 0x00, 0x00, 0xCC, 0xC2, 0x00, 0x00, + 0xD0, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, + 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, + 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, + 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, 0xD6, 0xC2, 0x00, 0x00, + 0xFA, 0xC2, 0x00, 0x00, 0x3C, 0xC3, 0x00, 0x00, 0x5A, 0xC3, 0x00, 0x00, + 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, 0x1C, 0xC2, 0x00, 0x00, + 0x8A, 0xC2, 0x00, 0x00, 0x90, 0xC2, 0x00, 0x00, 0x3A, 0xC5, 0x00, 0x00, + 0x3A, 0xC5, 0x00, 0x00, 0x4E, 0xC5, 0x00, 0x00, 0x4E, 0xC5, 0x00, 0x00, + 0x52, 0xC5, 0x00, 0x00, 0x52, 0xC5, 0x00, 0x00, 0x56, 0xC5, 0x00, 0x00, + 0x56, 0xC5, 0x00, 0x00, 0x62, 0xC5, 0x00, 0x00, 0x62, 0xC5, 0x00, 0x00, + 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, + 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, + 0x6E, 0xC5, 0x00, 0x00, 0x6E, 0xC5, 0x00, 0x00, 0x6E, 0xC5, 0x00, 0x00, + 0x82, 0xC5, 0x00, 0x00, 0x82, 0xC5, 0x00, 0x00, 0xB0, 0xC4, 0x00, 0x00, + 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, + 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, + 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, + 0xF2, 0xC3, 0x00, 0x00, 0xE2, 0xC4, 0x00, 0x00, 0xFC, 0xC4, 0x00, 0x00, + 0x26, 0xC5, 0x00, 0x00, 0x94, 0xC4, 0x00, 0x00, 0xA6, 0xC4, 0x00, 0x00, + 0xA6, 0xC4, 0x00, 0x00, 0xF2, 0xC3, 0x00, 0x00, 0x7C, 0xC4, 0x00, 0x00, + 0x82, 0xC4, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, + 0x40, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, + 0x40, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, + 0x40, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, + 0x0A, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, + 0x0A, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, + 0x40, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, + 0x40, 0xC6, 0x00, 0x00, 0x40, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, + 0x0A, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, + 0x0A, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, + 0x0A, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, 0x0A, 0xC6, 0x00, 0x00, + 0x4E, 0xC6, 0x00, 0x00, 0x64, 0xC6, 0x00, 0x00, 0x8A, 0xC6, 0x00, 0x00, + 0x9E, 0xC6, 0x00, 0x00, 0xAA, 0xC6, 0x00, 0x00, 0xAA, 0xC6, 0x00, 0x00, + 0x0A, 0xC6, 0x00, 0x00, 0x28, 0xC6, 0x00, 0x00, 0x2E, 0xC6, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 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, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xFF, 0xFF, 0xFF, 0xFF, + 0x01, 0x00, 0x00, 0x00, 0x02, 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, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x01, 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, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x2A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, + 0x0D, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, + 0x1D, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, + 0x1F, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, + 0x1D, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x1B, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x02, 0x00, 0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x02, 0x03, 0x03, + 0x00, 0x01, 0x00, 0x02, 0x01, 0x00, 0x03, 0x02, 0x01, 0x00, 0x03, 0x02, + 0x01, 0x03, 0x02, 0x03, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x01, + 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x02, + 0x03, 0x04, 0x05, 0x06, 0x07, 0x03, 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, + 0x06, 0x07, 0x05, 0x06, 0x07, 0x06, 0x07, 0x07, 0x00, 0x01, 0x00, 0x02, + 0x01, 0x00, 0x03, 0x02, 0x01, 0x00, 0x04, 0x03, 0x02, 0x01, 0x00, 0x05, + 0x04, 0x03, 0x02, 0x01, 0x00, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, + 0x03, 0x02, 0x01, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x07, 0x06, 0x05, + 0x04, 0x03, 0x07, 0x06, 0x05, 0x04, 0x07, 0x06, 0x05, 0x07, 0x06, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x0C, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x00, + 0xCA, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, + 0x9C, 0x01, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, + 0x49, 0x03, 0x00, 0x00, 0x2B, 0x04, 0x00, 0x00, 0x4A, 0x05, 0x00, 0x00, + 0xB5, 0x06, 0x00, 0x00, 0x83, 0x08, 0x00, 0x00, 0xCD, 0x0A, 0x00, 0x00, + 0xB4, 0x0D, 0x00, 0x00, 0x63, 0x11, 0x00, 0x00, 0x0F, 0x16, 0x00, 0x00, + 0xFD, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, + 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x1A, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, + 0x4B, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x08, 0x07, 0x06, 0x06, + 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9C, 0x75, 0x00, 0x88, 0x3C, 0xE4, 0x37, 0x7E, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x3F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x03, 0xB8, 0xE2, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0xD0, 0xCF, 0x43, 0xEB, 0xFD, 0x4C, 0x3E, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x43, 0x9C, 0x75, 0x00, 0x88, 0x3C, 0xE4, 0x37, 0x7E, + 0x59, 0xF3, 0xF8, 0xC2, 0x1F, 0x6E, 0xA5, 0x01, 0x03, 0x33, 0x33, 0x33, + 0x33, 0x33, 0xE3, 0x3F, 0xFF, 0xAB, 0x6F, 0xDB, 0xB6, 0x6D, 0xDB, 0x3F, + 0x4D, 0x26, 0x8F, 0x51, 0x55, 0x55, 0xD5, 0x3F, 0x01, 0x41, 0x1D, 0xA9, + 0x60, 0x74, 0xD1, 0x3F, 0x65, 0xDB, 0xC9, 0x93, 0x4A, 0x86, 0xCD, 0x3F, + 0xEF, 0x4E, 0x45, 0x4A, 0x28, 0x7E, 0xCA, 0x3F, 0x3E, 0x55, 0x55, 0x55, + 0x55, 0x55, 0xC5, 0x3F, 0x93, 0xBD, 0xBE, 0x16, 0x6C, 0xC1, 0x66, 0xBF, + 0x2C, 0xDE, 0x25, 0xAF, 0x6A, 0x56, 0x11, 0x3F, 0xF1, 0x6B, 0xD2, 0xC5, + 0x41, 0xBD, 0xBB, 0xBE, 0xD0, 0xA4, 0xBE, 0x72, 0x69, 0x37, 0x66, 0x3E, + 0xEF, 0x39, 0xFA, 0xFE, 0x42, 0x2E, 0xE6, 0x3F, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x2E, 0xE6, 0x3F, 0x39, 0x6C, 0xA8, 0x0C, 0x61, 0x5C, 0x20, 0xBE, + 0xFE, 0x82, 0x2B, 0x65, 0x47, 0x15, 0x97, 0x3C, 0xFD, 0x03, 0x3A, 0xDC, + 0x09, 0xC7, 0xEE, 0x3F, 0x00, 0x00, 0x00, 0xE0, 0x09, 0xC7, 0xEE, 0x3F, + 0xF5, 0x01, 0x5B, 0x14, 0xE0, 0x2F, 0x3E, 0xBE, 0xFE, 0x82, 0x2B, 0x65, + 0x47, 0x15, 0xF7, 0x3F, 0x00, 0x00, 0x00, 0x60, 0x47, 0x15, 0xF7, 0x3F, + 0x44, 0xDF, 0x5D, 0xF8, 0x0B, 0xAE, 0x54, 0x3E, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0x3F, 0x59, 0xF3, 0xF8, 0xC2, 0x1F, 0x6E, 0xA5, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x43, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC3, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x50, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x3C, + 0x9C, 0x75, 0x00, 0x88, 0x3C, 0xE4, 0x37, 0x7E, 0x59, 0xF3, 0xF8, 0xC2, + 0x1F, 0x6E, 0xA5, 0x01, 0xC0, 0x36, 0x02, 0x00, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x8E, 0x99, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x86, 0x99, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0xDE, 0x97, 0x01, 0x00, + 0x7C, 0x99, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0xEE, 0x97, 0x01, 0x00, + 0x00, 0x98, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0xA2, 0x99, 0x01, 0x00, + 0xD2, 0x98, 0x01, 0x00, 0xD2, 0x98, 0x01, 0x00, 0xD2, 0x98, 0x01, 0x00, + 0xD2, 0x98, 0x01, 0x00, 0xD2, 0x98, 0x01, 0x00, 0xD2, 0x98, 0x01, 0x00, + 0xD2, 0x98, 0x01, 0x00, 0xD2, 0x98, 0x01, 0x00, 0xD2, 0x98, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x12, 0x99, 0x01, 0x00, 0x2E, 0x97, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x0C, 0x97, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x56, 0x98, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0xEA, 0x96, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0xF2, 0x98, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x12, 0x99, 0x01, 0x00, + 0x32, 0x97, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x0A, 0x99, 0x01, 0x00, 0x32, 0x97, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0xC2, 0x98, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0xA4, 0x98, 0x01, 0x00, 0x10, 0x97, 0x01, 0x00, + 0x36, 0x98, 0x01, 0x00, 0xF8, 0x97, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, + 0x56, 0x98, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0xEE, 0x96, 0x01, 0x00, + 0x4A, 0x94, 0x01, 0x00, 0x4A, 0x94, 0x01, 0x00, 0x74, 0x98, 0x01, 0x00, + 0x2D, 0x35, 0x02, 0x00, 0x2F, 0x35, 0x02, 0x00, 0x2F, 0x35, 0x02, 0x00, + 0x2F, 0x35, 0x02, 0x00, 0x2F, 0x35, 0x02, 0x00, 0x2F, 0x35, 0x02, 0x00, + 0x2F, 0x35, 0x02, 0x00, 0x2F, 0x35, 0x02, 0x00, 0x2F, 0x35, 0x02, 0x00, + 0x2F, 0x35, 0x02, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x56, 0xC2, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x4E, 0xC2, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x3E, 0xC0, 0x01, 0x00, 0x56, 0xC1, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x4E, 0xC0, 0x01, 0x00, 0x88, 0xC0, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x80, 0xC0, 0x01, 0x00, 0x60, 0xC0, 0x01, 0x00, 0x60, 0xC0, 0x01, 0x00, + 0x60, 0xC0, 0x01, 0x00, 0x60, 0xC0, 0x01, 0x00, 0x60, 0xC0, 0x01, 0x00, + 0x60, 0xC0, 0x01, 0x00, 0x60, 0xC0, 0x01, 0x00, 0x60, 0xC0, 0x01, 0x00, + 0x60, 0xC0, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0xD6, 0xC1, 0x01, 0x00, 0x92, 0xBF, 0x01, 0x00, + 0x68, 0xC1, 0x01, 0x00, 0x68, 0xC1, 0x01, 0x00, 0x68, 0xC1, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x6A, 0xC2, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x70, 0xBF, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0xDE, 0xC0, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x4E, 0xBF, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x72, 0xC2, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0xD6, 0xC1, 0x01, 0x00, 0x96, 0xBF, 0x01, 0x00, 0x68, 0xC1, 0x01, 0x00, + 0x68, 0xC1, 0x01, 0x00, 0x68, 0xC1, 0x01, 0x00, 0x60, 0xC1, 0x01, 0x00, + 0x96, 0xBF, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x46, 0xC1, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x30, 0xC1, 0x01, 0x00, + 0x74, 0xBF, 0x01, 0x00, 0xBE, 0xC0, 0x01, 0x00, 0x58, 0xC0, 0x01, 0x00, + 0x5E, 0xBC, 0x01, 0x00, 0xDE, 0xC0, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0x52, 0xBF, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, 0x5E, 0xBC, 0x01, 0x00, + 0xFC, 0xC0, 0x01, 0x00, 0x0E, 0xD6, 0x01, 0x00, 0x0E, 0xD6, 0x01, 0x00, + 0xDA, 0xD5, 0x01, 0x00, 0xF0, 0xD5, 0x01, 0x00, 0xDE, 0xD5, 0x01, 0x00, + 0xF4, 0xD5, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x59, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x8F, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xC3, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6A, 0xF8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x84, 0x2E, 0x41, + 0x00, 0x00, 0x00, 0x00, 0xD0, 0x12, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, + 0x84, 0xD7, 0x97, 0x41, 0x00, 0x00, 0x00, 0x00, 0x65, 0xCD, 0xCD, 0x41, + 0x00, 0x00, 0x00, 0x20, 0x5F, 0xA0, 0x02, 0x42, 0x00, 0x00, 0x00, 0xE8, + 0x76, 0x48, 0x37, 0x42, 0x00, 0x00, 0x00, 0xA2, 0x94, 0x1A, 0x6D, 0x42, + 0x00, 0x00, 0x40, 0xE5, 0x9C, 0x30, 0xA2, 0x42, 0x00, 0x00, 0x90, 0x1E, + 0xC4, 0xBC, 0xD6, 0x42, 0x00, 0x00, 0x34, 0x26, 0xF5, 0x6B, 0x0C, 0x43, + 0x00, 0x80, 0xE0, 0x37, 0x79, 0xC3, 0x41, 0x43, 0x00, 0xA0, 0xD8, 0x85, + 0x57, 0x34, 0x76, 0x43, 0x00, 0xC8, 0x4E, 0x67, 0x6D, 0xC1, 0xAB, 0x43, + 0x00, 0x3D, 0x91, 0x60, 0xE4, 0x58, 0xE1, 0x43, 0x40, 0x8C, 0xB5, 0x78, + 0x1D, 0xAF, 0x15, 0x44, 0x50, 0xEF, 0xE2, 0xD6, 0xE4, 0x1A, 0x4B, 0x44, + 0x92, 0xD5, 0x4D, 0x06, 0xCF, 0xF0, 0x80, 0x44, 0xF6, 0x4A, 0xE1, 0xC7, + 0x02, 0x2D, 0xB5, 0x44, 0xB4, 0x9D, 0xD9, 0x79, 0x43, 0x78, 0xEA, 0x44, + 0x00, 0x80, 0xE0, 0x37, 0x79, 0xC3, 0x41, 0x43, 0x17, 0x6E, 0x05, 0xB5, + 0xB5, 0xB8, 0x93, 0x46, 0xF5, 0xF9, 0x3F, 0xE9, 0x03, 0x4F, 0x38, 0x4D, + 0x32, 0x1D, 0x30, 0xF9, 0x48, 0x77, 0x82, 0x5A, 0x3C, 0xBF, 0x73, 0x7F, + 0xDD, 0x4F, 0x15, 0x75, 0xBC, 0x89, 0xD8, 0x97, 0xB2, 0xD2, 0x9C, 0x3C, + 0x33, 0xA7, 0xA8, 0xD5, 0x23, 0xF6, 0x49, 0x39, 0x3D, 0xA7, 0xF4, 0x44, + 0xFD, 0x0F, 0xA5, 0x32, 0x9D, 0x97, 0x8C, 0xCF, 0x08, 0xBA, 0x5B, 0x25, + 0x43, 0x6F, 0xAC, 0x64, 0x28, 0x06, 0xC8, 0x0A, 0x44, 0x49, 0x53, 0x50, + 0x4C, 0x41, 0x59, 0x20, 0x51, 0x55, 0x45, 0x20, 0x4F, 0x56, 0x45, 0x52, + 0x2D, 0x46, 0x4C, 0x4F, 0x57, 0x0A, 0x00, 0x73, 0x70, 0x73, 0x3A, 0x3A, + 0x6C, 0x6F, 0x67, 0x32, 0x5F, 0x6D, 0x61, 0x78, 0x5F, 0x70, 0x63, 0x6D, + 0x5F, 0x63, 0x62, 0x5F, 0x73, 0x69, 0x7A, 0x65, 0x20, 0x3E, 0x20, 0x6C, + 0x6F, 0x67, 0x32, 0x5F, 0x6D, 0x61, 0x78, 0x5F, 0x6C, 0x75, 0x6D, 0x61, + 0x5F, 0x63, 0x62, 0x5F, 0x73, 0x69, 0x7A, 0x65, 0x0A, 0x00, 0x73, 0x63, + 0x61, 0x6C, 0x69, 0x6E, 0x67, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5B, 0x5D, + 0x5B, 0x5D, 0x5B, 0x5D, 0x20, 0x73, 0x68, 0x61, 0x6C, 0x6C, 0x20, 0x62, + 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x61, 0x6E, 0x20, 0x30, 0x0A, 0x00, 0x73, 0x6C, 0x69, 0x63, 0x65, 0x20, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, + 0x0A, 0x00, 0x43, 0x55, 0x20, 0x71, 0x70, 0x20, 0x64, 0x65, 0x6C, 0x74, + 0x61, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x0A, 0x00, 0x73, 0x6C, 0x69, + 0x63, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x20, 0x6C, 0x6F, 0x73, 0x73, + 0x2F, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x0A, 0x00, 0x6D, 0x61, 0x78, 0x5F, + 0x6D, 0x76, 0x5F, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x72, + 0x72, 0x6F, 0x72, 0x0A, 0x00, 0x63, 0x6F, 0x65, 0x66, 0x66, 0x69, 0x63, + 0x69, 0x65, 0x6E, 0x74, 0x20, 0x72, 0x61, 0x6E, 0x67, 0x65, 0x20, 0x65, + 0x72, 0x72, 0x6F, 0x72, 0x0A, 0x00, 0x65, 0x6E, 0x64, 0x5F, 0x6F, 0x66, + 0x5F, 0x73, 0x6C, 0x69, 0x63, 0x65, 0x5F, 0x73, 0x65, 0x67, 0x6D, 0x65, + 0x6E, 0x74, 0x20, 0x66, 0x6C, 0x61, 0x67, 0x20, 0x65, 0x72, 0x72, 0x6F, + 0x72, 0x0A, 0x00, 0x6D, 0x61, 0x78, 0x20, 0x6D, 0x76, 0x64, 0x20, 0x6C, + 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x0A, + 0x00, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6E, 0x6F, + 0x20, 0x74, 0x61, 0x73, 0x6B, 0x0D, 0x0A, 0x00, 0x54, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x20, 0x73, 0x65, 0x67, 0x6D, + 0x65, 0x6E, 0x74, 0x20, 0x74, 0x61, 0x73, 0x6B, 0x0D, 0x0A, 0x00, 0x73, + 0x70, 0x73, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x75, + 0x6C, 0x6C, 0x00, 0x70, 0x70, 0x73, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x20, 0x66, 0x75, 0x6C, 0x6C, 0x00, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6E, 0x63, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6D, 0x65, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x6F, 0x76, 0x65, 0x72, 0x66, 0x6C, + 0x6F, 0x77, 0x0A, 0x00, 0x73, 0x6C, 0x69, 0x63, 0x65, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6D, 0x20, 0x61, 0x6C, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x66, 0x61, 0x69, 0x6C, 0x00, 0x73, 0x6C, 0x69, 0x63, + 0x65, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x20, 0x70, + 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6D, 0x20, 0x61, 0x6C, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x66, 0x61, 0x69, 0x6C, 0x00, 0x44, 0x50, 0x42, 0x20, + 0x42, 0x55, 0x46, 0x46, 0x45, 0x52, 0x20, 0x4F, 0x56, 0x45, 0x52, 0x2D, + 0x46, 0x4C, 0x4F, 0x57, 0x0A, 0x00, 0x78, 0x3E, 0x3D, 0x30, 0x00, 0x2E, + 0x2E, 0x2F, 0x2E, 0x2E, 0x2F, 0x65, 0x6E, 0x63, 0x5F, 0x72, 0x65, 0x66, + 0x5F, 0x63, 0x2F, 0x68, 0x65, 0x76, 0x63, 0x5F, 0x65, 0x6E, 0x63, 0x2F, + 0x73, 0x72, 0x63, 0x2F, 0x76, 0x63, 0x70, 0x75, 0x2F, 0x63, 0x6F, 0x64, + 0x65, 0x63, 0x5F, 0x66, 0x77, 0x2F, 0x66, 0x77, 0x5F, 0x75, 0x74, 0x69, + 0x6C, 0x2E, 0x63, 0x00, 0x64, 0x69, 0x76, 0x69, 0x73, 0x6F, 0x72, 0x3E, + 0x30, 0x00, 0x2E, 0x2E, 0x2F, 0x2E, 0x2E, 0x2F, 0x65, 0x6E, 0x63, 0x5F, + 0x72, 0x65, 0x66, 0x5F, 0x63, 0x2F, 0x68, 0x65, 0x76, 0x63, 0x5F, 0x65, + 0x6E, 0x63, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x76, 0x63, 0x70, 0x75, 0x2F, + 0x63, 0x6F, 0x64, 0x65, 0x63, 0x5F, 0x66, 0x77, 0x2F, 0x68, 0x65, 0x76, + 0x63, 0x5F, 0x65, 0x6E, 0x63, 0x2E, 0x63, 0x00, 0x54, 0x68, 0x65, 0x20, + 0x76, 0x61, 0x6C, 0x75, 0x65, 0x20, 0x6F, 0x66, 0x20, 0x6D, 0x61, 0x78, + 0x5F, 0x64, 0x65, 0x63, 0x5F, 0x70, 0x69, 0x63, 0x5F, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x69, 0x73, 0x20, 0x6F, 0x76, + 0x65, 0x72, 0x20, 0x4D, 0x61, 0x78, 0x44, 0x70, 0x62, 0x53, 0x69, 0x7A, + 0x65, 0x00, 0x5B, 0x45, 0x52, 0x52, 0x5D, 0x20, 0x4E, 0x6F, 0x74, 0x20, + 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5F, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3C, 0x20, 0x32, 0x35, 0x36, 0x20, + 0x7C, 0x7C, 0x20, 0x73, 0x72, 0x63, 0x5F, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x20, 0x3C, 0x20, 0x31, 0x32, 0x38, 0x0A, 0x00, 0x5B, 0x45, 0x52, + 0x52, 0x5D, 0x20, 0x4E, 0x6F, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6F, + 0x72, 0x74, 0x20, 0x73, 0x72, 0x63, 0x5F, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x20, 0x3C, 0x20, 0x31, 0x32, 0x38, 0x20, 0x7C, 0x7C, 0x20, 0x73, 0x72, + 0x63, 0x5F, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3C, 0x20, 0x32, + 0x32, 0x35, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x39, 0x30, 0x20, 0x64, + 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x72, 0x6F, 0x74, 0x61, 0x74, 0x69, + 0x6F, 0x6E, 0x0A, 0x00, 0x65, 0x6E, 0x74, 0x72, 0x79, 0x2D, 0x3E, 0x72, + 0x65, 0x66, 0x5F, 0x70, 0x6F, 0x63, 0x5B, 0x6C, 0x69, 0x73, 0x74, 0x5D, + 0x20, 0x3E, 0x3D, 0x20, 0x2D, 0x32, 0x2A, 0x67, 0x6F, 0x70, 0x5F, 0x73, + 0x69, 0x7A, 0x65, 0x00, 0x2E, 0x2E, 0x2F, 0x2E, 0x2E, 0x2F, 0x65, 0x6E, + 0x63, 0x5F, 0x72, 0x65, 0x66, 0x5F, 0x63, 0x2F, 0x68, 0x65, 0x76, 0x63, + 0x5F, 0x65, 0x6E, 0x63, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x76, 0x63, 0x70, + 0x75, 0x2F, 0x63, 0x6F, 0x64, 0x65, 0x63, 0x5F, 0x66, 0x77, 0x2F, 0x68, + 0x65, 0x76, 0x63, 0x5F, 0x65, 0x6E, 0x63, 0x5F, 0x63, 0x70, 0x75, 0x5F, + 0x70, 0x69, 0x63, 0x2E, 0x63, 0x00, 0x65, 0x6E, 0x74, 0x72, 0x79, 0x2D, + 0x3E, 0x72, 0x65, 0x66, 0x5F, 0x70, 0x6F, 0x63, 0x5B, 0x30, 0x5D, 0x20, + 0x3E, 0x3D, 0x20, 0x2D, 0x32, 0x2A, 0x67, 0x6F, 0x70, 0x5F, 0x73, 0x69, + 0x7A, 0x65, 0x00, 0x63, 0x75, 0x72, 0x72, 0x5F, 0x70, 0x6F, 0x63, 0x20, + 0x3E, 0x3D, 0x20, 0x30, 0x00, 0x2A, 0x6E, 0x75, 0x6D, 0x5F, 0x69, 0x6E, + 0x5F, 0x72, 0x70, 0x73, 0x3E, 0x3D, 0x30, 0x00, 0x63, 0x66, 0x67, 0x20, + 0x66, 0x69, 0x6C, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x3A, 0x20, + 0x46, 0x72, 0x61, 0x6D, 0x65, 0x25, 0x64, 0x20, 0x68, 0x61, 0x73, 0x20, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, 0x20, 0x70, 0x69, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x6C, 0x61, 0x72, 0x67, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x25, 0x64, 0x0A, 0x00, 0x70, + 0x72, 0x65, 0x76, 0x5F, 0x65, 0x6E, 0x63, 0x5F, 0x69, 0x64, 0x78, 0x3E, + 0x3D, 0x30, 0x20, 0x26, 0x26, 0x20, 0x70, 0x72, 0x65, 0x76, 0x5F, 0x65, + 0x6E, 0x63, 0x5F, 0x69, 0x64, 0x78, 0x3C, 0x67, 0x6F, 0x70, 0x5F, 0x73, + 0x69, 0x7A, 0x65, 0x00, 0x63, 0x75, 0x72, 0x72, 0x5F, 0x65, 0x6E, 0x63, + 0x5F, 0x69, 0x64, 0x78, 0x3E, 0x3D, 0x30, 0x20, 0x26, 0x26, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x5F, 0x65, 0x6E, 0x63, 0x5F, 0x69, 0x64, 0x78, 0x3C, + 0x4D, 0x41, 0x58, 0x5F, 0x47, 0x4F, 0x50, 0x5F, 0x53, 0x49, 0x5A, 0x45, + 0x00, 0x67, 0x6F, 0x70, 0x5F, 0x73, 0x69, 0x7A, 0x65, 0x3E, 0x3D, 0x30, + 0x20, 0x26, 0x26, 0x20, 0x67, 0x6F, 0x70, 0x5F, 0x73, 0x69, 0x7A, 0x65, + 0x3C, 0x3D, 0x4D, 0x41, 0x58, 0x5F, 0x47, 0x4F, 0x50, 0x5F, 0x53, 0x49, + 0x5A, 0x45, 0x00, 0x63, 0x66, 0x67, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, + 0x65, 0x72, 0x72, 0x6F, 0x72, 0x3A, 0x20, 0x46, 0x72, 0x61, 0x6D, 0x65, + 0x25, 0x64, 0x20, 0x68, 0x61, 0x73, 0x20, 0x69, 0x6E, 0x76, 0x61, 0x6C, + 0x69, 0x64, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, + 0x20, 0x70, 0x6F, 0x63, 0x20, 0x25, 0x64, 0x0A, 0x00, 0x63, 0x66, 0x67, + 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x3A, + 0x20, 0x46, 0x72, 0x61, 0x6D, 0x65, 0x25, 0x64, 0x20, 0x68, 0x61, 0x73, + 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, 0x20, 0x70, + 0x6F, 0x63, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x61, 0x6D, 0x65, 0x20, 0x61, 0x73, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x6F, 0x63, 0x0A, 0x00, + 0x65, 0x6E, 0x63, 0x5F, 0x69, 0x64, 0x78, 0x20, 0x21, 0x3D, 0x20, 0x67, + 0x6F, 0x70, 0x2D, 0x3E, 0x67, 0x6F, 0x70, 0x5F, 0x73, 0x69, 0x7A, 0x65, + 0x00, 0x63, 0x75, 0x72, 0x72, 0x5F, 0x70, 0x6F, 0x63, 0x3E, 0x3D, 0x30, + 0x00, 0x74, 0x65, 0x6D, 0x70, 0x6F, 0x72, 0x61, 0x6C, 0x5F, 0x69, 0x64, + 0x20, 0x3D, 0x3D, 0x20, 0x30, 0x00, 0x69, 0x20, 0x3C, 0x20, 0x67, 0x6F, + 0x70, 0x2D, 0x3E, 0x67, 0x6F, 0x70, 0x5F, 0x73, 0x69, 0x7A, 0x65, 0x00, + 0x72, 0x65, 0x66, 0x5F, 0x6C, 0x31, 0x5F, 0x70, 0x69, 0x63, 0x5F, 0x69, + 0x64, 0x78, 0x20, 0x3E, 0x3D, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x72, + 0x65, 0x66, 0x5F, 0x6C, 0x31, 0x5F, 0x70, 0x69, 0x63, 0x5F, 0x69, 0x64, + 0x78, 0x20, 0x3C, 0x20, 0x4D, 0x41, 0x58, 0x5F, 0x46, 0x52, 0x41, 0x4D, + 0x45, 0x5F, 0x42, 0x55, 0x46, 0x46, 0x45, 0x52, 0x00, 0x2E, 0x2E, 0x2F, + 0x2E, 0x2E, 0x2F, 0x65, 0x6E, 0x63, 0x5F, 0x72, 0x65, 0x66, 0x5F, 0x63, + 0x2F, 0x68, 0x65, 0x76, 0x63, 0x5F, 0x65, 0x6E, 0x63, 0x2F, 0x73, 0x72, + 0x63, 0x2F, 0x76, 0x63, 0x70, 0x75, 0x2F, 0x63, 0x6F, 0x64, 0x65, 0x63, + 0x5F, 0x66, 0x77, 0x2F, 0x68, 0x65, 0x76, 0x63, 0x5F, 0x65, 0x6E, 0x63, + 0x5F, 0x70, 0x69, 0x63, 0x2E, 0x63, 0x00, 0x72, 0x65, 0x66, 0x5F, 0x6C, + 0x30, 0x5F, 0x70, 0x69, 0x63, 0x5F, 0x69, 0x64, 0x78, 0x20, 0x3E, 0x3D, + 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x72, 0x65, 0x66, 0x5F, 0x6C, 0x30, + 0x5F, 0x70, 0x69, 0x63, 0x5F, 0x69, 0x64, 0x78, 0x20, 0x3C, 0x20, 0x4D, + 0x41, 0x58, 0x5F, 0x46, 0x52, 0x41, 0x4D, 0x45, 0x5F, 0x42, 0x55, 0x46, + 0x46, 0x45, 0x52, 0x00, 0x70, 0x69, 0x63, 0x5F, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3E, 0x3D, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x70, 0x69, 0x63, + 0x5F, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3C, 0x20, 0x33, 0x00, 0x74, 0x69, + 0x64, 0x5F, 0x70, 0x6C, 0x75, 0x73, 0x5F, 0x31, 0x20, 0x3E, 0x20, 0x30, + 0x00, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5F, 0x62, 0x70, 0x73, 0x20, + 0x3E, 0x20, 0x66, 0x72, 0x61, 0x6D, 0x65, 0x5F, 0x72, 0x61, 0x74, 0x65, + 0x00, 0x2E, 0x2E, 0x2F, 0x2E, 0x2E, 0x2F, 0x65, 0x6E, 0x63, 0x5F, 0x72, + 0x65, 0x66, 0x5F, 0x63, 0x2F, 0x68, 0x65, 0x76, 0x63, 0x5F, 0x65, 0x6E, + 0x63, 0x2F, 0x73, 0x72, 0x63, 0x2F, 0x76, 0x63, 0x70, 0x75, 0x2F, 0x63, + 0x6F, 0x64, 0x65, 0x63, 0x5F, 0x66, 0x77, 0x2F, 0x68, 0x65, 0x76, 0x63, + 0x5F, 0x65, 0x6E, 0x63, 0x5F, 0x72, 0x63, 0x2E, 0x63, 0x00, 0x74, 0x72, + 0x61, 0x6E, 0x73, 0x5F, 0x62, 0x70, 0x73, 0x20, 0x3D, 0x3D, 0x20, 0x30, + 0x20, 0x7C, 0x7C, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x5F, 0x62, 0x70, + 0x73, 0x20, 0x3E, 0x3D, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5F, + 0x62, 0x70, 0x73, 0x00, 0x72, 0x65, 0x66, 0x5F, 0x70, 0x6F, 0x63, 0x20, + 0x3C, 0x3D, 0x20, 0x67, 0x6F, 0x70, 0x5F, 0x73, 0x69, 0x7A, 0x65, 0x00, + 0x67, 0x6F, 0x70, 0x5F, 0x73, 0x69, 0x7A, 0x65, 0x20, 0x3E, 0x3D, 0x20, + 0x31, 0x20, 0x26, 0x26, 0x20, 0x67, 0x6F, 0x70, 0x5F, 0x73, 0x69, 0x7A, + 0x65, 0x20, 0x3C, 0x3D, 0x20, 0x4D, 0x41, 0x58, 0x5F, 0x47, 0x4F, 0x50, + 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x00, 0x65, 0x6E, 0x63, 0x5F, 0x6F, 0x72, + 0x64, 0x65, 0x72, 0x5F, 0x69, 0x6E, 0x5F, 0x67, 0x6F, 0x70, 0x20, 0x3E, + 0x3D, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x65, 0x6E, 0x63, 0x5F, 0x6F, + 0x72, 0x64, 0x65, 0x72, 0x5F, 0x69, 0x6E, 0x5F, 0x67, 0x6F, 0x70, 0x20, + 0x3C, 0x20, 0x67, 0x6F, 0x70, 0x5F, 0x73, 0x69, 0x7A, 0x65, 0x00, 0x70, + 0x69, 0x63, 0x5F, 0x62, 0x69, 0x74, 0x20, 0x3E, 0x3D, 0x20, 0x30, 0x00, + 0x62, 0x70, 0x70, 0x20, 0x3E, 0x20, 0x30, 0x00, 0x69, 0x6E, 0x74, 0x72, + 0x61, 0x5F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x3D, 0x3D, 0x20, + 0x30, 0x20, 0x7C, 0x7C, 0x20, 0x69, 0x6E, 0x74, 0x72, 0x61, 0x5F, 0x70, + 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x3E, 0x20, 0x30, 0x00, 0x65, 0x6E, + 0x63, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x5F, 0x69, 0x6E, 0x5F, 0x67, + 0x6F, 0x70, 0x20, 0x3E, 0x3D, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x65, + 0x6E, 0x63, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x5F, 0x69, 0x6E, 0x5F, + 0x67, 0x6F, 0x70, 0x20, 0x3C, 0x20, 0x72, 0x63, 0x2D, 0x3E, 0x67, 0x6F, + 0x70, 0x5F, 0x73, 0x69, 0x7A, 0x65, 0x00, 0x61, 0x76, 0x67, 0x5F, 0x71, + 0x70, 0x3E, 0x3D, 0x30, 0x20, 0x26, 0x26, 0x20, 0x61, 0x76, 0x67, 0x5F, + 0x71, 0x70, 0x3C, 0x3D, 0x35, 0x31, 0x00, 0x70, 0x6F, 0x77, 0x00, 0x73, + 0x71, 0x72, 0x74, 0x00, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6F, + 0x6E, 0x20, 0x22, 0x25, 0x73, 0x22, 0x20, 0x66, 0x61, 0x69, 0x6C, 0x65, + 0x64, 0x3A, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x22, 0x25, 0x73, 0x22, + 0x2C, 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x25, 0x64, 0x0A, 0x00, 0x43, + 0x00, 0x62, 0x75, 0x67, 0x20, 0x69, 0x6E, 0x20, 0x76, 0x66, 0x70, 0x72, + 0x69, 0x6E, 0x74, 0x66, 0x3A, 0x20, 0x62, 0x61, 0x64, 0x20, 0x62, 0x61, + 0x73, 0x65, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x00, 0x28, 0x6E, 0x75, 0x6C, + 0x6C, 0x29, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x43, 0x2D, 0x55, 0x54, + 0x46, 0x2D, 0x38, 0x00, 0x43, 0x2D, 0x53, 0x4A, 0x49, 0x53, 0x00, 0x43, + 0x2D, 0x45, 0x55, 0x43, 0x4A, 0x50, 0x00, 0x43, 0x2D, 0x4A, 0x49, 0x53, + 0x00, 0x2E, 0x00, 0x00, 0x49, 0x53, 0x4F, 0x2D, 0x38, 0x38, 0x35, 0x39, + 0x2D, 0x31, 0x00, 0x49, 0x4E, 0x46, 0x00, 0x69, 0x6E, 0x66, 0x00, 0x4E, + 0x41, 0x4E, 0x00, 0x6E, 0x61, 0x6E, 0x00, 0x4E, 0x61, 0x4E, 0x00, 0x49, + 0x6E, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x79, 0x00, 0x48, 0x65, 0x61, 0x70, + 0x20, 0x61, 0x6E, 0x64, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6B, 0x20, 0x63, + 0x6F, 0x6C, 0x6C, 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x0A, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, + 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, + 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x20, 0x02, + 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, + 0x00, 0x00, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x16, 0x14, 0x16, 0x14, + 0x16, 0x14, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB4, 0x1F, 0x02, 0x00, 0xCC, 0x1F, 0x02, 0x00, 0xE4, 0x1F, 0x02, 0x00, + 0xFC, 0x1F, 0x02, 0x00, 0x2C, 0x20, 0x02, 0x00, 0x8C, 0x20, 0x02, 0x00, + 0xEC, 0x20, 0x02, 0x00, 0x4C, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x22, 0x02, 0x00, 0x24, 0x22, 0x02, 0x00, 0x3C, 0x22, 0x02, 0x00, + 0x54, 0x22, 0x02, 0x00, 0x84, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, + 0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, + 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x20, 0x02, + 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, + 0xAC, 0x39, 0x02, 0x00, 0x08, 0x3A, 0x02, 0x00, 0x64, 0x3A, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCB, 0x34, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0E, 0x33, 0xCD, 0xAB, 0x34, 0x12, 0x6D, 0xE6, 0xEC, 0xDE, 0x05, 0x00, + 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0x36, 0x02, 0x00, 0x72, 0x35, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x30, 0x35, 0x02, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDC, 0x3A, 0x02, 0x00, 0xDC, 0x3A, 0x02, 0x00, 0xE4, 0x3A, 0x02, 0x00, + 0xE4, 0x3A, 0x02, 0x00, 0xEC, 0x3A, 0x02, 0x00, 0xEC, 0x3A, 0x02, 0x00, + 0xF4, 0x3A, 0x02, 0x00, 0xF4, 0x3A, 0x02, 0x00, 0xFC, 0x3A, 0x02, 0x00, + 0xFC, 0x3A, 0x02, 0x00, 0x04, 0x3B, 0x02, 0x00, 0x04, 0x3B, 0x02, 0x00, + 0x0C, 0x3B, 0x02, 0x00, 0x0C, 0x3B, 0x02, 0x00, 0x14, 0x3B, 0x02, 0x00, + 0x14, 0x3B, 0x02, 0x00, 0x1C, 0x3B, 0x02, 0x00, 0x1C, 0x3B, 0x02, 0x00, + 0x24, 0x3B, 0x02, 0x00, 0x24, 0x3B, 0x02, 0x00, 0x2C, 0x3B, 0x02, 0x00, + 0x2C, 0x3B, 0x02, 0x00, 0x34, 0x3B, 0x02, 0x00, 0x34, 0x3B, 0x02, 0x00, + 0x3C, 0x3B, 0x02, 0x00, 0x3C, 0x3B, 0x02, 0x00, 0x44, 0x3B, 0x02, 0x00, + 0x44, 0x3B, 0x02, 0x00, 0x4C, 0x3B, 0x02, 0x00, 0x4C, 0x3B, 0x02, 0x00, + 0x54, 0x3B, 0x02, 0x00, 0x54, 0x3B, 0x02, 0x00, 0x5C, 0x3B, 0x02, 0x00, + 0x5C, 0x3B, 0x02, 0x00, 0x64, 0x3B, 0x02, 0x00, 0x64, 0x3B, 0x02, 0x00, + 0x6C, 0x3B, 0x02, 0x00, 0x6C, 0x3B, 0x02, 0x00, 0x74, 0x3B, 0x02, 0x00, + 0x74, 0x3B, 0x02, 0x00, 0x7C, 0x3B, 0x02, 0x00, 0x7C, 0x3B, 0x02, 0x00, + 0x84, 0x3B, 0x02, 0x00, 0x84, 0x3B, 0x02, 0x00, 0x8C, 0x3B, 0x02, 0x00, + 0x8C, 0x3B, 0x02, 0x00, 0x94, 0x3B, 0x02, 0x00, 0x94, 0x3B, 0x02, 0x00, + 0x9C, 0x3B, 0x02, 0x00, 0x9C, 0x3B, 0x02, 0x00, 0xA4, 0x3B, 0x02, 0x00, + 0xA4, 0x3B, 0x02, 0x00, 0xAC, 0x3B, 0x02, 0x00, 0xAC, 0x3B, 0x02, 0x00, + 0xB4, 0x3B, 0x02, 0x00, 0xB4, 0x3B, 0x02, 0x00, 0xBC, 0x3B, 0x02, 0x00, + 0xBC, 0x3B, 0x02, 0x00, 0xC4, 0x3B, 0x02, 0x00, 0xC4, 0x3B, 0x02, 0x00, + 0xCC, 0x3B, 0x02, 0x00, 0xCC, 0x3B, 0x02, 0x00, 0xD4, 0x3B, 0x02, 0x00, + 0xD4, 0x3B, 0x02, 0x00, 0xDC, 0x3B, 0x02, 0x00, 0xDC, 0x3B, 0x02, 0x00, + 0xE4, 0x3B, 0x02, 0x00, 0xE4, 0x3B, 0x02, 0x00, 0xEC, 0x3B, 0x02, 0x00, + 0xEC, 0x3B, 0x02, 0x00, 0xF4, 0x3B, 0x02, 0x00, 0xF4, 0x3B, 0x02, 0x00, + 0xFC, 0x3B, 0x02, 0x00, 0xFC, 0x3B, 0x02, 0x00, 0x04, 0x3C, 0x02, 0x00, + 0x04, 0x3C, 0x02, 0x00, 0x0C, 0x3C, 0x02, 0x00, 0x0C, 0x3C, 0x02, 0x00, + 0x14, 0x3C, 0x02, 0x00, 0x14, 0x3C, 0x02, 0x00, 0x1C, 0x3C, 0x02, 0x00, + 0x1C, 0x3C, 0x02, 0x00, 0x24, 0x3C, 0x02, 0x00, 0x24, 0x3C, 0x02, 0x00, + 0x2C, 0x3C, 0x02, 0x00, 0x2C, 0x3C, 0x02, 0x00, 0x34, 0x3C, 0x02, 0x00, + 0x34, 0x3C, 0x02, 0x00, 0x3C, 0x3C, 0x02, 0x00, 0x3C, 0x3C, 0x02, 0x00, + 0x44, 0x3C, 0x02, 0x00, 0x44, 0x3C, 0x02, 0x00, 0x4C, 0x3C, 0x02, 0x00, + 0x4C, 0x3C, 0x02, 0x00, 0x54, 0x3C, 0x02, 0x00, 0x54, 0x3C, 0x02, 0x00, + 0x5C, 0x3C, 0x02, 0x00, 0x5C, 0x3C, 0x02, 0x00, 0x64, 0x3C, 0x02, 0x00, + 0x64, 0x3C, 0x02, 0x00, 0x6C, 0x3C, 0x02, 0x00, 0x6C, 0x3C, 0x02, 0x00, + 0x74, 0x3C, 0x02, 0x00, 0x74, 0x3C, 0x02, 0x00, 0x7C, 0x3C, 0x02, 0x00, + 0x7C, 0x3C, 0x02, 0x00, 0x84, 0x3C, 0x02, 0x00, 0x84, 0x3C, 0x02, 0x00, + 0x8C, 0x3C, 0x02, 0x00, 0x8C, 0x3C, 0x02, 0x00, 0x94, 0x3C, 0x02, 0x00, + 0x94, 0x3C, 0x02, 0x00, 0x9C, 0x3C, 0x02, 0x00, 0x9C, 0x3C, 0x02, 0x00, + 0xA4, 0x3C, 0x02, 0x00, 0xA4, 0x3C, 0x02, 0x00, 0xAC, 0x3C, 0x02, 0x00, + 0xAC, 0x3C, 0x02, 0x00, 0xB4, 0x3C, 0x02, 0x00, 0xB4, 0x3C, 0x02, 0x00, + 0xBC, 0x3C, 0x02, 0x00, 0xBC, 0x3C, 0x02, 0x00, 0xC4, 0x3C, 0x02, 0x00, + 0xC4, 0x3C, 0x02, 0x00, 0xCC, 0x3C, 0x02, 0x00, 0xCC, 0x3C, 0x02, 0x00, + 0xD4, 0x3C, 0x02, 0x00, 0xD4, 0x3C, 0x02, 0x00, 0xDC, 0x3C, 0x02, 0x00, + 0xDC, 0x3C, 0x02, 0x00, 0xE4, 0x3C, 0x02, 0x00, 0xE4, 0x3C, 0x02, 0x00, + 0xEC, 0x3C, 0x02, 0x00, 0xEC, 0x3C, 0x02, 0x00, 0xF4, 0x3C, 0x02, 0x00, + 0xF4, 0x3C, 0x02, 0x00, 0xFC, 0x3C, 0x02, 0x00, 0xFC, 0x3C, 0x02, 0x00, + 0x04, 0x3D, 0x02, 0x00, 0x04, 0x3D, 0x02, 0x00, 0x0C, 0x3D, 0x02, 0x00, + 0x0C, 0x3D, 0x02, 0x00, 0x14, 0x3D, 0x02, 0x00, 0x14, 0x3D, 0x02, 0x00, + 0x1C, 0x3D, 0x02, 0x00, 0x1C, 0x3D, 0x02, 0x00, 0x24, 0x3D, 0x02, 0x00, + 0x24, 0x3D, 0x02, 0x00, 0x2C, 0x3D, 0x02, 0x00, 0x2C, 0x3D, 0x02, 0x00, + 0x34, 0x3D, 0x02, 0x00, 0x34, 0x3D, 0x02, 0x00, 0x3C, 0x3D, 0x02, 0x00, + 0x3C, 0x3D, 0x02, 0x00, 0x44, 0x3D, 0x02, 0x00, 0x44, 0x3D, 0x02, 0x00, + 0x4C, 0x3D, 0x02, 0x00, 0x4C, 0x3D, 0x02, 0x00, 0x54, 0x3D, 0x02, 0x00, + 0x54, 0x3D, 0x02, 0x00, 0x5C, 0x3D, 0x02, 0x00, 0x5C, 0x3D, 0x02, 0x00, + 0x64, 0x3D, 0x02, 0x00, 0x64, 0x3D, 0x02, 0x00, 0x6C, 0x3D, 0x02, 0x00, + 0x6C, 0x3D, 0x02, 0x00, 0x74, 0x3D, 0x02, 0x00, 0x74, 0x3D, 0x02, 0x00, + 0x7C, 0x3D, 0x02, 0x00, 0x7C, 0x3D, 0x02, 0x00, 0x84, 0x3D, 0x02, 0x00, + 0x84, 0x3D, 0x02, 0x00, 0x8C, 0x3D, 0x02, 0x00, 0x8C, 0x3D, 0x02, 0x00, + 0x94, 0x3D, 0x02, 0x00, 0x94, 0x3D, 0x02, 0x00, 0x9C, 0x3D, 0x02, 0x00, + 0x9C, 0x3D, 0x02, 0x00, 0xA4, 0x3D, 0x02, 0x00, 0xA4, 0x3D, 0x02, 0x00, + 0xAC, 0x3D, 0x02, 0x00, 0xAC, 0x3D, 0x02, 0x00, 0xB4, 0x3D, 0x02, 0x00, + 0xB4, 0x3D, 0x02, 0x00, 0xBC, 0x3D, 0x02, 0x00, 0xBC, 0x3D, 0x02, 0x00, + 0xC4, 0x3D, 0x02, 0x00, 0xC4, 0x3D, 0x02, 0x00, 0xCC, 0x3D, 0x02, 0x00, + 0xCC, 0x3D, 0x02, 0x00, 0xD4, 0x3D, 0x02, 0x00, 0xD4, 0x3D, 0x02, 0x00, + 0xDC, 0x3D, 0x02, 0x00, 0xDC, 0x3D, 0x02, 0x00, 0xE4, 0x3D, 0x02, 0x00, + 0xE4, 0x3D, 0x02, 0x00, 0xEC, 0x3D, 0x02, 0x00, 0xEC, 0x3D, 0x02, 0x00, + 0xF4, 0x3D, 0x02, 0x00, 0xF4, 0x3D, 0x02, 0x00, 0xFC, 0x3D, 0x02, 0x00, + 0xFC, 0x3D, 0x02, 0x00, 0x04, 0x3E, 0x02, 0x00, 0x04, 0x3E, 0x02, 0x00, + 0x0C, 0x3E, 0x02, 0x00, 0x0C, 0x3E, 0x02, 0x00, 0x14, 0x3E, 0x02, 0x00, + 0x14, 0x3E, 0x02, 0x00, 0x1C, 0x3E, 0x02, 0x00, 0x1C, 0x3E, 0x02, 0x00, + 0x24, 0x3E, 0x02, 0x00, 0x24, 0x3E, 0x02, 0x00, 0x2C, 0x3E, 0x02, 0x00, + 0x2C, 0x3E, 0x02, 0x00, 0x34, 0x3E, 0x02, 0x00, 0x34, 0x3E, 0x02, 0x00, + 0x3C, 0x3E, 0x02, 0x00, 0x3C, 0x3E, 0x02, 0x00, 0x44, 0x3E, 0x02, 0x00, + 0x44, 0x3E, 0x02, 0x00, 0x4C, 0x3E, 0x02, 0x00, 0x4C, 0x3E, 0x02, 0x00, + 0x54, 0x3E, 0x02, 0x00, 0x54, 0x3E, 0x02, 0x00, 0x5C, 0x3E, 0x02, 0x00, + 0x5C, 0x3E, 0x02, 0x00, 0x64, 0x3E, 0x02, 0x00, 0x64, 0x3E, 0x02, 0x00, + 0x6C, 0x3E, 0x02, 0x00, 0x6C, 0x3E, 0x02, 0x00, 0x74, 0x3E, 0x02, 0x00, + 0x74, 0x3E, 0x02, 0x00, 0x7C, 0x3E, 0x02, 0x00, 0x7C, 0x3E, 0x02, 0x00, + 0x84, 0x3E, 0x02, 0x00, 0x84, 0x3E, 0x02, 0x00, 0x8C, 0x3E, 0x02, 0x00, + 0x8C, 0x3E, 0x02, 0x00, 0x94, 0x3E, 0x02, 0x00, 0x94, 0x3E, 0x02, 0x00, + 0x9C, 0x3E, 0x02, 0x00, 0x9C, 0x3E, 0x02, 0x00, 0xA4, 0x3E, 0x02, 0x00, + 0xA4, 0x3E, 0x02, 0x00, 0xAC, 0x3E, 0x02, 0x00, 0xAC, 0x3E, 0x02, 0x00, + 0xB4, 0x3E, 0x02, 0x00, 0xB4, 0x3E, 0x02, 0x00, 0xBC, 0x3E, 0x02, 0x00, + 0xBC, 0x3E, 0x02, 0x00, 0xC4, 0x3E, 0x02, 0x00, 0xC4, 0x3E, 0x02, 0x00, + 0xCC, 0x3E, 0x02, 0x00, 0xCC, 0x3E, 0x02, 0x00, 0xD4, 0x3E, 0x02, 0x00, + 0xD4, 0x3E, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, +}; +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/main_helper.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/main_helper.c new file mode 100644 index 0000000000..4bdebd0ed0 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/main_helper.c @@ -0,0 +1,2655 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2014 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include +#include "vpuapifunc.h" +#include "coda9/coda9_regdefine.h" +#include "wave/common/common_vpuconfig.h" +#include "wave/common/common_regdefine.h" +#include "wave/wave4/wave4_regdefine.h" +#include "vpuerror.h" +#include "main_helper.h" +#ifdef PLATFORM_LINUX +#include +#endif +#include "fw_h264.h" +#include "fw_h265.h" + +#define BIT_DUMMY_READ_GEN 0x06000000 +#define BIT_READ_LATENCY 0x06000004 +#define W4_SET_READ_DELAY 0x01000000 +#define W4_SET_WRITE_DELAY 0x01000004 +#define MAX_CODE_BUF_SIZE (512 * 1024) + +#ifdef PLATFORM_WIN32 +#pragma warning(disable : 4996) + //!<< disable waring C4996: The POSIX name for + //! +#include +#endif + +#ifdef FIRMWARE_H +Int32 LoadFirmwareH(Int32 productId, Uint8 **retFirmware, Uint32 *retSizeInWord) +{ + Uint32 readSize; + + if (productId == PRODUCT_ID_420L) { + readSize = sizeof(fw_h265); + *retFirmware = fw_h265; + } else if (productId == PRODUCT_ID_980) { + readSize = sizeof(fw_h264); + *retFirmware = fw_h264; + } else { + CVI_VC_ERR("productId = %d\n", productId); + return -1; + } + + readSize = ((readSize + 1) >> 1) << 1; + *retSizeInWord = readSize >> 1; + + CVI_VC_TRACE("productId = %d, retFirmware %p, retSizeInWord %u\n", + productId, *retFirmware, *retSizeInWord); + + return 0; +} +#else +Int32 LoadFirmware(Int32 productId, Uint8 **retFirmware, Uint32 *retSizeInWord, + const char *path) +{ + Uint8 *firmware = NULL; +#ifdef PLATFORM_NON_OS +#ifdef WAVE420 + Uint32 readSize = 147456; +#else + Uint32 readSize = 256000; +#endif +#if CFG_MEM + Uint8 *fwAddr = (Uint8 *)dramCfg.pucCodeAddr; +#else + Uint8 *fwAddr = (Uint8 *)WAVE420L_CODE_ADDR; +#endif +#else + Uint32 readSize = 1024 * 1024; + osal_file_t fp; +#endif + +#ifndef PLATFORM_NON_OS + CVI_VC_TRACE("path = %s\n", path); + fp = osal_fopen(path, "rb"); + if (fp == NULL) { + VLOG(ERR, "Failed to open %s\n", path); + return -1; + } + osal_fseek(fp, 0, 2);//seek file end + readSize = osal_ftell(fp); + osal_fseek(fp, 0, 0);//seek file start +#endif + +#ifdef PLATFORM_NON_OS + CVI_VC_TRACE("frimware addr : 0x%lX\n", fwAddr); +#endif + + CVI_VC_TRACE("productId = %d\n", productId); + + firmware = (Uint8 *)osal_malloc(readSize); + if (firmware == NULL) { + CVI_VC_ERR("allocation fail, firmware !\n"); + } + +#ifdef PLATFORM_NON_OS + memcpy(firmware, fwAddr, readSize); +#else + osal_fread(firmware, 1, readSize, fp); +#endif + + *retSizeInWord = (readSize + 1) >> 1; + +#ifndef PLATFORM_NON_OS + osal_fclose(fp); +#endif + + *retFirmware = firmware; + + return 0; +} +#endif + +void PrintVpuVersionInfo(Uint32 core_idx) +{ + Uint32 version; + Uint32 revision; + Uint32 productId; + + VPU_GetVersionInfo(core_idx, &version, &revision, &productId); + + VLOG(INFO, "VPU coreNum : [%d]\n", core_idx); + VLOG(INFO, + "Firmware : CustomerCode: %04x | version : %d.%d.%d rev.%d\n", + (Uint32)(version >> 16), (Uint32)((version >> (12)) & 0x0f), + (Uint32)((version >> (8)) & 0x0f), (Uint32)((version)&0xff), + revision); + VLOG(INFO, "Hardware : %04x\n", productId); + VLOG(INFO, "API : %d.%d.%d\n\n", API_VERSION_MAJOR, + API_VERSION_MINOR, API_VERSION_PATCH); +} + +#ifdef REDUNDENT_CODE +void FreePreviousFramebuffer(Uint32 coreIdx, DecGetFramebufInfo *fb) +{ + int i; + if (fb->vbFrame.size > 0) { + VDI_FREE_MEMORY(coreIdx, &fb->vbFrame); + osal_memset((void *)&fb->vbFrame, 0x00, sizeof(vpu_buffer_t)); + } + if (fb->vbWTL.size > 0) { + VDI_FREE_MEMORY(coreIdx, &fb->vbWTL); + osal_memset((void *)&fb->vbWTL, 0x00, sizeof(vpu_buffer_t)); + } + for (i = 0; i < MAX_REG_FRAME; i++) { + if (fb->vbFbcYTbl[i].size > 0) { + VDI_FREE_MEMORY(coreIdx, &fb->vbFbcYTbl[i]); + osal_memset((void *)&fb->vbFbcYTbl, 0x00, + sizeof(vpu_buffer_t)); + } + if (fb->vbFbcCTbl[i].size > 0) { + VDI_FREE_MEMORY(coreIdx, &fb->vbFbcCTbl[i]); + osal_memset((void *)&fb->vbFbcCTbl, 0x00, + sizeof(vpu_buffer_t)); + } + } +} +#endif + +void PrintDecSeqWarningMessages(Uint32 productId, DecInitialInfo *seqInfo) +{ + if (PRODUCT_ID_W_SERIES(productId)) { + if (seqInfo->seqInitErrReason & 0x00000001) + VLOG(WARN, + "sps_max_sub_layer_minus1 shall be 0 to 6\n"); + if (seqInfo->seqInitErrReason & 0x00000002) + VLOG(WARN, + "general_reserved_zero_44bits shall be 0.\n"); + if (seqInfo->seqInitErrReason & 0x00000004) + VLOG(WARN, "reserved_zero_2bits shall be 0\n"); + if (seqInfo->seqInitErrReason & 0x00000008) + VLOG(WARN, "sub_layer_reserved_zero_44bits shall be 0"); + if (seqInfo->seqInitErrReason & 0x00000010) + VLOG(WARN, + "general_level_idc shall have one of level of Table A.1\n"); + if (seqInfo->seqInitErrReason & 0x00000020) + VLOG(WARN, + "sps_max_dec_pic_buffering[i] <= MaxDpbSize\n"); + if (seqInfo->seqInitErrReason & 0x00000040) + VLOG(WARN, + "trailing bits shall be 1000... pattern, 7.3.2.1\n"); + if (seqInfo->seqInitErrReason & 0x00100000) + VLOG(WARN, "Not supported or undefined profile: %d\n", + seqInfo->profile); + if (seqInfo->seqInitErrReason & 0x00200000) + VLOG(WARN, "Spec over level(%d)\n", seqInfo->level); + } +} + +void DisplayDecodedInformationForHevc(DecHandle handle, Uint32 frameNo, + DecOutputInfo *decodedInfo) +{ + Int32 logLevel; + + if (decodedInfo == NULL) { +#ifdef REDUNDENT_CODE + if (handle->productId == PRODUCT_ID_510 || + handle->productId == PRODUCT_ID_512) { + VLOG(TRACE, + "I NO T POC NAL DECO DISP PRESCAN DISPFLAG RD_PTR WR_PTR FRM_START FRM_END WxH SEQ TEMP CYCLE (Seek, Parse, Dec)\n"); + } else +#endif + { + VLOG(TRACE, + "I NO T POC NAL DECO DISP PRESCAN DISPFLAG RD_PTR WR_PTR FRM_START FRM_END WxH SEQ TEMP CYCLE\n"); + } + VLOG(TRACE, + "------------------------------------------------------------------------------------------------------------\n"); + } else { + logLevel = (decodedInfo->decodingSuccess & 0x01) == 0 ? ERR : + TRACE; + if (handle->productId == PRODUCT_ID_4102) { + logLevel = (decodedInfo->indexFramePrescan == -2) ? + TRACE : + logLevel; + } + // Print informations +#ifdef REDUNDENT_CODE + if (handle->productId == PRODUCT_ID_510 || + handle->productId == PRODUCT_ID_512) { + VLOG(logLevel, + "%02d %5d %d %4d(%4d) %3d %2d(%2d) %2d(%2d) %7d %08x %08x %08x %08x %08x %4dx%-4d %4d %4d %d(%d,%d,%d)\n", + handle->instIndex, frameNo, decodedInfo->picType, + decodedInfo->h265Info.decodedPOC, + decodedInfo->h265Info.displayPOC, + decodedInfo->nalType, + decodedInfo->indexFrameDecoded, + decodedInfo->indexFrameDecodedForTiled, + decodedInfo->indexFrameDisplay, + decodedInfo->indexFrameDisplayForTiled, + decodedInfo->indexFramePrescan, + decodedInfo->frameDisplayFlag, decodedInfo->rdPtr, + decodedInfo->wrPtr, decodedInfo->bytePosFrameStart, + decodedInfo->bytePosFrameEnd, + decodedInfo->dispPicWidth, + decodedInfo->dispPicHeight, + decodedInfo->sequenceNo, + decodedInfo->h265Info.temporalId, + decodedInfo->frameCycle, decodedInfo->seekCycle, + decodedInfo->parseCycle, decodedInfo->decodeCycle); + } else +#endif + { + VLOG(logLevel, + "%02d %5d %d %4d(%4d) %3d %2d(%2d) %2d(%2d) %7d %08x %08x %08x %08x %08x %4dx%-4d %4d %4d %d\n", + handle->instIndex, frameNo, decodedInfo->picType, + decodedInfo->h265Info.decodedPOC, + decodedInfo->h265Info.displayPOC, + decodedInfo->nalType, + decodedInfo->indexFrameDecoded, + decodedInfo->indexFrameDecodedForTiled, + decodedInfo->indexFrameDisplay, + decodedInfo->indexFrameDisplayForTiled, + decodedInfo->indexFramePrescan, + decodedInfo->frameDisplayFlag, decodedInfo->rdPtr, + decodedInfo->wrPtr, decodedInfo->bytePosFrameStart, + decodedInfo->bytePosFrameEnd, + decodedInfo->dispPicWidth, + decodedInfo->dispPicHeight, + decodedInfo->sequenceNo, + decodedInfo->h265Info.temporalId, + decodedInfo->frameCycle); + } + if (logLevel == ERR) { + VLOG(ERR, "\t>>ERROR REASON: 0x%08x(0x%08x)\n", + decodedInfo->errorReason, + decodedInfo->errorReasonExt); + } + if (decodedInfo->numOfErrMBs) { + VLOG(WARN, "\t>> ErrorBlock: %d\n", + decodedInfo->numOfErrMBs); + } + } +} + +#ifdef REDUNDENT_CODE +void DisplayDecodedInformationForVP9(DecHandle handle, Uint32 frameNo, + DecOutputInfo *decodedInfo) +{ + Int32 logLevel; + + if (decodedInfo == NULL) { + // Print header + VLOG(TRACE, + "I NO T DECO DISP PRESCAN DISPFLAG RD_PTR WR_PTR FRM_START FRM_END WxH SEQ CYCLE\n"); + VLOG(TRACE, + "--------------------------------------------------------------------------------------------\n"); + } else { + logLevel = (decodedInfo->decodingSuccess & 0x01) == 0 ? ERR : + TRACE; + // Print informations + VLOG(logLevel, + "%02d %5d %d %2d(%2d) %2d(%2d) %7d %08x %08x %08x %08x %08x %4dx%-4d %4d %d\n", + handle->instIndex, frameNo, decodedInfo->picType, + decodedInfo->indexFrameDecoded, + decodedInfo->indexFrameDecodedForTiled, + decodedInfo->indexFrameDisplay, + decodedInfo->indexFrameDisplayForTiled, + decodedInfo->indexFramePrescan, + decodedInfo->frameDisplayFlag, decodedInfo->rdPtr, + decodedInfo->wrPtr, decodedInfo->bytePosFrameStart, + decodedInfo->bytePosFrameEnd, decodedInfo->dispPicWidth, + decodedInfo->dispPicHeight, decodedInfo->sequenceNo, + decodedInfo->frameCycle); + if (logLevel == ERR) { + VLOG(ERR, "\t>>ERROR REASON: 0x%08x(0x%08x)\n", + decodedInfo->errorReason, + decodedInfo->errorReasonExt); + } + if (decodedInfo->numOfErrMBs) { + VLOG(WARN, "\t>> ErrorBlock: %d\n", + decodedInfo->numOfErrMBs); + } + } +} +#endif + +void DisplayDecodedInformationCommon(DecHandle handle, CodStd codec, + Uint32 frameNo, DecOutputInfo *decodedInfo) +{ + Int32 logLevel; + + if (decodedInfo == NULL) { + // Print header + VLOG(TRACE, + "I NO T TID DEC_POC DECO DISP DISPFLAG RD_PTR WR_PTR FRM_START FRM_END WxH\n"); + VLOG(TRACE, + "---------------------------------------------------------------------------------------\n"); + } else { + VpuRect rc = decodedInfo->rcDisplay; + Uint32 width = rc.right - rc.left; + Uint32 height = rc.bottom - rc.top; + char strTemporalId[16]; + char strPoc[16]; + +#ifdef SUPPORT_980_ROI_RC_LIB + if (STD_AVC == codec) { + sprintf(strTemporalId, "%d", + decodedInfo->avcTemporalId); + sprintf(strPoc, "%8d", decodedInfo->avcPocPic); + } else { + strcpy(strTemporalId, "-"); + strcpy(strPoc, "--------"); + } +#endif + + logLevel = (decodedInfo->decodingSuccess & 0x01) == 0 ? ERR : + TRACE; + // Print informations + VLOG(logLevel, + "%02d %5d %d %s %s %2d(%2d) %2d(%2d) %08x %08x %08x %08x %08x %dx%d\n", + handle->instIndex, frameNo, decodedInfo->picType, + strTemporalId, strPoc, decodedInfo->indexFrameDecoded, + decodedInfo->indexFrameDecodedForTiled, + decodedInfo->indexFrameDisplay, + decodedInfo->indexFrameDisplayForTiled, + decodedInfo->frameDisplayFlag, decodedInfo->rdPtr, + decodedInfo->wrPtr, (Uint32)decodedInfo->bytePosFrameStart, + (Uint32)decodedInfo->bytePosFrameEnd, width, height); + if (logLevel == ERR) { + VLOG(ERR, "\t>>ERROR REASON: 0x%08x(0x%08x)\n", + decodedInfo->errorReason, + decodedInfo->errorReasonExt); + } + if (decodedInfo->numOfErrMBs) { + VLOG(WARN, "\t>> ErrorBlock: %d\n", + decodedInfo->numOfErrMBs); + } + } +} + +/** + * \brief Print out decoded information such like RD_PTR, + * WR_PTR, PIC_TYPE, .. \param decodedInfo If this parameter is not NULL + * then print out decoded informations otherwise print out header. + */ +void DisplayDecodedInformation(DecHandle handle, CodStd codec, Uint32 frameNo, + DecOutputInfo *decodedInfo) +{ + switch (codec) { + case STD_HEVC: + DisplayDecodedInformationForHevc(handle, frameNo, decodedInfo); + break; + default: + DisplayDecodedInformationCommon(handle, codec, frameNo, + decodedInfo); + break; + } +} + +static void Wave4DisplayEncodedInformation(EncHandle handle, + EncOutputInfo *encodedInfo, + Int32 srcEndFlag, Int32 srcFrameIdx) +{ + if (encodedInfo == NULL) { +#ifdef REPORT_PIC_SUM_VAR + VLOG(INFO, + "--------------------------------------------------------------------------------------------\n"); + VLOG(INFO, + "I NO T RECON RD_PTR WR_PTR BYTES SRCIDX USEDSRCIDX Cycle SumVariance\n"); + VLOG(INFO, + "--------------------------------------------------------------------------------------------\n"); +#else + VLOG(INFO, + "------------------------------------------------------------------------------\n"); + VLOG(INFO, + "C I NO T RECON RD_PTR WR_PTR BYTES SRCIDX USEDSRCIDX Cycle\n"); + VLOG(INFO, + "------------------------------------------------------------------------------\n"); +#endif + } else { +#ifdef REPORT_PIC_SUM_VAR + VLOG(INFO, + "HEVC %02d %5d %5d %5d %08x %08x %8x %2d %2d %8d %8d\n", + handle->instIndex, encodedInfo->encPicCnt, + encodedInfo->picType, encodedInfo->reconFrameIndex, + encodedInfo->rdPtr, encodedInfo->wrPtr, + encodedInfo->bitstreamSize, + (srcEndFlag == 1 ? -1 : srcFrameIdx), + encodedInfo->encSrcIdx, encodedInfo->frameCycle, + encodedInfo->sumPicVar); +#else + VLOG(INFO, + "HEVC %02d %5d %5d %5d %08x %08x %8x %2d %2d %8d\n", + handle->instIndex, encodedInfo->encPicCnt, + encodedInfo->picType, encodedInfo->reconFrameIndex, + encodedInfo->rdPtr, encodedInfo->wrPtr, + encodedInfo->bitstreamSize, + (srcEndFlag == 1 ? -1 : srcFrameIdx), + encodedInfo->encSrcIdx, encodedInfo->frameCycle); +#endif + } +} + +#ifdef REDUNDENT_CODE +static void Wave5DisplayEncodedInformation(EncHandle handle, + EncOutputInfo *encodedInfo, + Int32 srcEndFlag, Int32 srcFrameIdx) +{ + if (encodedInfo == NULL) { + VLOG(INFO, + "--------------------------------------------------------------------------------------------------------------\n"); + VLOG(INFO, + " | Cycle\n"); + VLOG(INFO, + "I NO T RECON RD_PTR WR_PTR BYTES SRCIDX USEDSRCIDX | FRAME PREPARING PROCESSING ENCODING\n"); + VLOG(INFO, + "--------------------------------------------------------------------------------------------------------------\n"); + } else { + VLOG(INFO, + "%02d %5d %5d %5d %08x %08x %8x %2d %2d %8d %8d %8d %8d\n", + handle->instIndex, encodedInfo->encPicCnt, + encodedInfo->picType, encodedInfo->reconFrameIndex, + encodedInfo->rdPtr, encodedInfo->wrPtr, + encodedInfo->bitstreamSize, + (srcEndFlag == 1 ? -1 : srcFrameIdx), + encodedInfo->encSrcIdx, encodedInfo->frameCycle, + encodedInfo->encPrepareCycle, + encodedInfo->encProcessingCycle, + encodedInfo->encEncodingCycle); + } +} +#endif + +static void Coda9DisplayEncodedInformation(DecHandle handle, CodStd codec, + EncOutputInfo *encodedInfo) +{ + if (encodedInfo == NULL) { + // Print header + VLOG(INFO, "C I NO T RECON RD_PTR WR_PTR\n"); + VLOG(INFO, "-------------------------------------\n"); + } else { + char **picTypeArray = + (codec == STD_AVC ? EncPicTypeStringH264 : + EncPicTypeStringMPEG4); + char *strPicType; + FrameBuffer *pRec = NULL; + + if (encodedInfo->picType > 2) + strPicType = "?"; + else + strPicType = picTypeArray[encodedInfo->picType]; + // Print informations + VLOG(INFO, "AVC %02d %5d %5s %5d %08x %08x\n", + handle->instIndex, encodedInfo->encPicCnt, strPicType, + encodedInfo->reconFrameIndex, encodedInfo->rdPtr, + encodedInfo->wrPtr); + + pRec = &encodedInfo->reconFrame; + CVI_VC_INFO( + "pRec, bufY = 0x%llX, bufCb = 0x%llX, bufCr = 0x%llX\n", + pRec->bufY, pRec->bufCb, pRec->bufCr); + } +} + +/*lint -esym(438, ap) */ +void DisplayEncodedInformation(EncHandle handle, CodStd codec, + EncOutputInfo *encodedInfo, ...) +{ + int srcEndFlag; + int srcFrameIdx; + va_list ap; + + switch (codec) { + case STD_HEVC: + va_start(ap, encodedInfo); + srcEndFlag = va_arg(ap, Uint32); + srcFrameIdx = va_arg(ap, Uint32); + va_end(ap); +#ifdef REDUNDENT_CODE + if (handle->productId == PRODUCT_ID_520) + Wave5DisplayEncodedInformation(handle, encodedInfo, + srcEndFlag, srcFrameIdx); + else +#endif + Wave4DisplayEncodedInformation(handle, encodedInfo, + srcEndFlag, srcFrameIdx); + break; + default: + Coda9DisplayEncodedInformation(handle, codec, encodedInfo); + break; + } +} + +#ifdef REDUNDENT_CODE +void ChangePathStyle(char *str) +{ + UNREFERENCED_PARAMETER(str); +} +#endif + +void ReleaseVideoMemory(Uint32 coreIndex, vpu_buffer_t *memoryArr, Uint32 count) +{ + Uint32 index; + + for (index = 0; index < count; index++) { + if (memoryArr[index].size) + VDI_FREE_MEMORY(coreIndex, &memoryArr[index]); + } +} + +#ifdef REDUNDENT_CODE +BOOL AllocateDecFrameBuffer(DecHandle decHandle, TestDecConfig *config, + Uint32 tiledFbCount, Uint32 linearFbCount, + FrameBuffer *retFbArray, vpu_buffer_t *retFbAddrs, + Uint32 *retStride) +{ + Uint32 framebufSize; + Uint32 totalFbCount; + Uint32 coreIndex; + Uint32 index; + FrameBufferFormat format = config->wtlFormat; + DecInitialInfo seqInfo; + FrameBufferAllocInfo fbAllocInfo; + RetCode ret; + vpu_buffer_t *pvb; + size_t framebufStride; + size_t framebufHeight; + Uint32 productId; + DRAMConfig *pDramCfg = NULL; + DRAMConfig dramCfg = { 0 }; + + coreIndex = VPU_HANDLE_CORE_INDEX(decHandle); + productId = VPU_HANDLE_PRODUCT_ID(decHandle); + VPU_DecGiveCommand(decHandle, DEC_GET_SEQ_INFO, (void *)&seqInfo); + + if (productId == PRODUCT_ID_960) { + pDramCfg = &dramCfg; + ret = VPU_DecGiveCommand(decHandle, GET_DRAM_CONFIG, pDramCfg); + } + + totalFbCount = tiledFbCount + linearFbCount; + + if (productId == PRODUCT_ID_4102 || productId == PRODUCT_ID_420 || + productId == PRODUCT_ID_412 || productId == PRODUCT_ID_420L || + productId == PRODUCT_ID_510 || productId == PRODUCT_ID_512 || + productId == PRODUCT_ID_515) { + format = (seqInfo.lumaBitdepth > 8 || + seqInfo.chromaBitdepth > 8) ? + FORMAT_420_P10_16BIT_LSB : + FORMAT_420; + } else if (productId == PRODUCT_ID_7Q) { + if (decHandle->codecMode == HEVC_DEC) + format = (seqInfo.lumaBitdepth > 8 || + seqInfo.chromaBitdepth > 8) ? + FORMAT_420_P10_16BIT_LSB : + FORMAT_420; + else + format = FORMAT_420; + } + + if (decHandle->codecMode == C7_VP9_DEC) { + framebufStride = CalcStride(VPU_ALIGN64(seqInfo.picWidth), + seqInfo.picHeight, format, + config->cbcrInterleave, + config->mapType, TRUE, TRUE); + framebufHeight = VPU_ALIGN64(seqInfo.picHeight); + framebufSize = VPU_GetFrameBufSize( + decHandle->coreIdx, framebufStride, framebufHeight, + config->mapType, format, config->cbcrInterleave, NULL); + *retStride = framebufStride; + } else if (productId == PRODUCT_ID_7Q && + decHandle->codecMode != C7_HEVC_DEC) { + framebufStride = CalcStride(seqInfo.picWidth, seqInfo.picHeight, + format, config->cbcrInterleave, + config->mapType, FALSE, TRUE); + framebufHeight = seqInfo.interlace ? + VPU_ALIGN32(seqInfo.picHeight) : + VPU_ALIGN16(seqInfo.picHeight); + framebufSize = VPU_GetFrameBufSize( + decHandle->coreIdx, framebufStride, framebufHeight, + config->mapType, format, config->cbcrInterleave, NULL); + *retStride = framebufStride; + } else if (decHandle->codecMode == C7_AVS2_DEC) { + framebufStride = CalcStride(seqInfo.picWidth, seqInfo.picHeight, + format, config->cbcrInterleave, + config->mapType, FALSE, TRUE); + framebufHeight = VPU_ALIGN8(seqInfo.picHeight); + framebufSize = + VPU_GetFrameBufSize(decHandle->coreIdx, framebufStride, + framebufHeight, config->mapType, + format, config->cbcrInterleave, + pDramCfg); + *retStride = framebufStride; + } else { + *retStride = VPU_ALIGN32(seqInfo.picWidth); + framebufStride = CalcStride(seqInfo.picWidth, seqInfo.picHeight, + format, config->cbcrInterleave, + config->mapType, FALSE, TRUE); + framebufHeight = seqInfo.picHeight; + framebufSize = + VPU_GetFrameBufSize(decHandle->coreIdx, framebufStride, + seqInfo.picHeight, config->mapType, + format, config->cbcrInterleave, + pDramCfg); + } + + osal_memset((void *)&fbAllocInfo, 0x00, sizeof(fbAllocInfo)); + osal_memset((void *)retFbArray, 0x00, + sizeof(FrameBuffer) * totalFbCount); + fbAllocInfo.format = format; + fbAllocInfo.cbcrInterleave = config->cbcrInterleave; + fbAllocInfo.mapType = config->mapType; + fbAllocInfo.stride = framebufStride; + fbAllocInfo.height = framebufHeight; + fbAllocInfo.size = framebufSize; + fbAllocInfo.lumaBitDepth = seqInfo.lumaBitdepth; + fbAllocInfo.chromaBitDepth = seqInfo.chromaBitdepth; + fbAllocInfo.num = tiledFbCount; + fbAllocInfo.endian = config->frameEndian; + fbAllocInfo.type = FB_TYPE_CODEC; + osal_memset((void *)retFbAddrs, 0x00, + sizeof(vpu_buffer_t) * totalFbCount); + for (index = 0; index < tiledFbCount; index++) { + pvb = &retFbAddrs[index]; + pvb->size = framebufSize; + CVI_VC_MEM("FB[%d], size = 0x%X\n", index, pvb->size); + if (VDI_ALLOCATE_MEMORY(coreIndex, pvb, 0) < 0) { + VLOG(ERR, "%s:%d fail to allocate frame buffer\n", + __func__, __LINE__); + ReleaseVideoMemory(coreIndex, retFbAddrs, totalFbCount); + return FALSE; + } + retFbArray[index].bufY = pvb->phys_addr; + retFbArray[index].bufCb = (PhysicalAddress)-1; + retFbArray[index].bufCr = (PhysicalAddress)-1; + retFbArray[index].updateFbInfo = TRUE; + retFbArray[index].size = framebufSize; + } + + if (tiledFbCount != 0) { + ret = VPU_DecAllocateFrameBuffer(decHandle, fbAllocInfo, + retFbArray); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "%s:%d failed to VPU_DecAllocateFrameBuffer(), ret(%d)\n", + __func__, __LINE__, ret); + ReleaseVideoMemory(coreIndex, retFbAddrs, totalFbCount); + return FALSE; + } + } + + if (config->enableWTL == TRUE || linearFbCount != 0) { + size_t linearStride; + size_t picWidth; + size_t picHeight; + size_t fbHeight; + Uint32 mapType = LINEAR_FRAME_MAP; + FrameBufferFormat outFormat = config->wtlFormat; + picWidth = seqInfo.picWidth; + picHeight = seqInfo.picHeight; + fbHeight = picHeight; + if (decHandle->codecMode == C7_VP9_DEC) { + fbHeight = VPU_ALIGN64(picHeight); + } else if (decHandle->codecMode == C7_AVS2_DEC) { + fbHeight = VPU_ALIGN8(picHeight); + } else if (productId == PRODUCT_ID_7Q && + decHandle->codecMode != C7_HEVC_DEC) { + fbHeight = seqInfo.interlace ? VPU_ALIGN32(picHeight) : + VPU_ALIGN16(picHeight); + } else if (productId == PRODUCT_ID_960 || + productId == PRODUCT_ID_980) { + fbHeight = VPU_ALIGN32(picHeight); + } + if (decHandle->codecMode == C7_VP9_DEC) { + linearStride = + CalcStride(VPU_ALIGN64(picWidth), picHeight, + outFormat, config->cbcrInterleave, + (TiledMapType)mapType, TRUE, TRUE); + } else { + linearStride = + CalcStride(picWidth, picHeight, outFormat, + config->cbcrInterleave, + (TiledMapType)mapType, FALSE, TRUE); + } + framebufSize = + VPU_GetFrameBufSize(coreIndex, linearStride, fbHeight, + (TiledMapType)mapType, outFormat, + config->cbcrInterleave, pDramCfg); + + for (index = tiledFbCount; index < totalFbCount; index++) { + pvb = &retFbAddrs[index]; + pvb->size = framebufSize; + CVI_VC_MEM("FB[%d], size = 0x%X\n", index, pvb->size); + if (VDI_ALLOCATE_MEMORY(coreIndex, pvb, 0) < 0) { + VLOG(ERR, + "%s:%d fail to allocate frame buffer\n", + __func__, __LINE__); + ReleaseVideoMemory(coreIndex, retFbAddrs, + totalFbCount); + return FALSE; + } + retFbArray[index].bufY = pvb->phys_addr; + retFbArray[index].bufCb = -1; + retFbArray[index].bufCr = -1; + retFbArray[index].updateFbInfo = TRUE; + retFbArray[index].size = framebufSize; + } + + fbAllocInfo.nv21 = config->nv21; + fbAllocInfo.format = outFormat; + fbAllocInfo.num = linearFbCount; + fbAllocInfo.mapType = (TiledMapType)mapType; + fbAllocInfo.stride = linearStride; + fbAllocInfo.height = fbHeight; + ret = VPU_DecAllocateFrameBuffer(decHandle, fbAllocInfo, + &retFbArray[tiledFbCount]); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "%s:%d failed to VPU_DecAllocateFrameBuffer() ret:%d\n", + __func__, __LINE__, ret); + ReleaseVideoMemory(coreIndex, retFbAddrs, totalFbCount); + return FALSE; + } + } + + return TRUE; +} + +#if defined(_WIN32) || defined(__MSDOS__) +#define DOS_FILESYSTEM +#define IS_DIR_SEPARATOR(__c) ((__c == '/') || (__c == '\\')) +#else +/* UNIX style */ +#define IS_DIR_SEPARATOR(__c) (__c == '/') +#endif + +char *GetDirname(const char *path) +{ + int length; + int i; + char *upper_dir; + + if (path == NULL) + return NULL; + + length = strlen(path); + for (i = length - 1; i >= 0; i--) { + if (IS_DIR_SEPARATOR(path[i])) + break; + } + + if (i < 0) { + upper_dir = strdup("."); + } else { + upper_dir = strdup(path); + upper_dir[i] = 0; + } + + return upper_dir; +} + +char *GetBasename(const char *pathname) +{ + const char *base = NULL; + const char *p = pathname; + + if (p == NULL) { + return NULL; + } + +#if defined(DOS_FILESYSTEM) + if (isalpha((int)p[0]) && p[1] == ':') { + p += 2; + } +#endif + + for (base = p; *p; p++) { + if (IS_DIR_SEPARATOR(*p)) { + base = p + 1; + } + } + + return (char *)base; +} + +char *GetFileExtension(const char *filename) +{ + Uint32 len; + Int32 i; + + len = strlen(filename); + for (i = (Int32)len - 1; i >= 0; i--) { + if (filename[i] == '.') { + return (char *)&filename[i + 1]; + } + } + + return NULL; +} + +void byte_swap(unsigned char *data, int len) +{ + Uint8 temp; + Int32 i; + + for (i = 0; i < len; i += 2) { + temp = data[i]; + data[i] = data[i + 1]; + data[i + 1] = temp; + } +} + +BOOL IsEndOfFile(FILE *fp) +{ + BOOL result = FALSE; + Int32 index = 0; + char cTemp; + + // Check current fp pos + if (osal_feof(fp) != 0) { + result = TRUE; + } + + // Check next fp pos + // Ignore newline character + do { + cTemp = fgetc(fp); + index++; + + if (osal_feof(fp) != 0) { + result = TRUE; + break; + } + } while (cTemp == '\n' || cTemp == '\r'); + + // Revert fp pos + index *= (-1); + osal_fseek(fp, index, SEEK_CUR); + + return result; +} +#endif + +BOOL CalcYuvSize(Int32 format, Int32 picWidth, Int32 picHeight, + Int32 cbcrInterleave, size_t *lumaSize, size_t *chromaSize, + size_t *frameSize, Int32 *bitDepth, Int32 *packedFormat, + Int32 *yuv3p4b) +{ + Int32 temp_picWidth; + Int32 chromaWidth; + + if (bitDepth != 0) + *bitDepth = 0; + if (packedFormat != 0) + *packedFormat = 0; + if (yuv3p4b != 0) + *yuv3p4b = 0; + + CVI_VC_TRACE("format = %d\n", format); + + switch (format) { + case FORMAT_420: + if (lumaSize) + *lumaSize = picWidth * picHeight; + if (chromaSize) + *chromaSize = (picWidth * picHeight) >> 1; + if (frameSize) + *frameSize = (picWidth * picHeight * 3) >> 1; + break; + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + if (packedFormat != 0) + *packedFormat = 1; + if (lumaSize) + *lumaSize = picWidth * picHeight; + if (chromaSize) + *chromaSize = picWidth * picHeight; + if (frameSize) + *frameSize = *lumaSize + *chromaSize; + break; + case FORMAT_224: + if (lumaSize) + *lumaSize = picWidth * picHeight; + if (chromaSize) + *chromaSize = picWidth * picHeight; + if (frameSize) + *frameSize = picWidth * picHeight * 2; + break; + case FORMAT_422: + if (lumaSize) + *lumaSize = picWidth * picHeight; + if (chromaSize) + *chromaSize = picWidth * picHeight; + if (frameSize) + *frameSize = picWidth * picHeight * 2; + break; + case FORMAT_444: + if (lumaSize) + *lumaSize = picWidth * picHeight; + if (chromaSize) + *chromaSize = picWidth * picHeight * 2; + if (frameSize) + *frameSize = picWidth * picHeight * 3; + break; + case FORMAT_400: + if (lumaSize) + *lumaSize = picWidth * picHeight; + if (chromaSize) + *chromaSize = 0; + if (frameSize) + *frameSize = picWidth * picHeight; + break; + case FORMAT_422_P10_16BIT_MSB: + case FORMAT_422_P10_16BIT_LSB: + if (bitDepth != NULL) { + *bitDepth = 10; + } + if (lumaSize) + *lumaSize = picWidth * picHeight * 2; + if (chromaSize) + *chromaSize = *lumaSize; + if (frameSize) + *frameSize = *lumaSize + *chromaSize; + break; + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_420_P10_16BIT_LSB: + if (bitDepth != 0) + *bitDepth = 10; + if (lumaSize) + *lumaSize = picWidth * picHeight * 2; + if (chromaSize) + *chromaSize = picWidth * picHeight; + if (frameSize) + *frameSize = *lumaSize + *chromaSize; + break; + case FORMAT_YUYV_P10_16BIT_MSB: // 4:2:2 10bit packed + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + if (bitDepth != 0) + *bitDepth = 10; + if (packedFormat != 0) + *packedFormat = 1; + if (lumaSize) + *lumaSize = picWidth * picHeight * 2; + if (chromaSize) + *chromaSize = picWidth * picHeight * 2; + if (frameSize) + *frameSize = *lumaSize + *chromaSize; + break; + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_420_P10_32BIT_LSB: + if (bitDepth != 0) + *bitDepth = 10; + if (yuv3p4b != 0) + *yuv3p4b = 1; + temp_picWidth = VPU_ALIGN32(picWidth); + chromaWidth = ((VPU_ALIGN16((temp_picWidth >> 1) * + (1 << cbcrInterleave)) + + 2) / + 3 * 4); + if (cbcrInterleave == 1) { + if (lumaSize) + *lumaSize = + (temp_picWidth + 2) / 3 * 4 * picHeight; + if (chromaSize) + *chromaSize = (chromaWidth * picHeight) >> 1; + } else { + if (lumaSize) + *lumaSize = + (temp_picWidth + 2) / 3 * 4 * picHeight; + if (chromaSize) + *chromaSize = ((chromaWidth * picHeight) >> 1) + << 1; + } + if (frameSize) + *frameSize = *lumaSize + *chromaSize; + break; + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + if (bitDepth != 0) + *bitDepth = 10; + if (packedFormat != 0) + *packedFormat = 1; + if (yuv3p4b != 0) + *yuv3p4b = 1; + if (frameSize) + *frameSize = ((picWidth * 2) + 2) / 3 * 4 * picHeight; + if (lumaSize) + *lumaSize = *frameSize >> 1; + if (chromaSize) + *chromaSize = *frameSize >> 1; + break; + default: + if (frameSize) + *frameSize = (picWidth * picHeight * 3) >> 1; + VLOG(ERR, "%s:%d Not supported format(%d)\n", __FILE__, + __LINE__, format); + return FALSE; + } + return TRUE; +} + +FrameBufferFormat GetPackedFormat(int srcBitDepth, PackedFormatNum packedType, + int p10bits, int msb) +{ + int format = FORMAT_YUYV; + + // default pixel format = P10_16BIT_LSB (p10bits = 16, msb = 0) + if (srcBitDepth == 8) { + switch (packedType) { + case PACKED_YUYV: + format = FORMAT_YUYV; + break; + case PACKED_YVYU: + format = FORMAT_YVYU; + break; + case PACKED_UYVY: + format = FORMAT_UYVY; + break; + case PACKED_VYUY: + format = FORMAT_VYUY; + break; + default: + format = -1; + } + } else if (srcBitDepth == 10) { + switch (packedType) { + case PACKED_YUYV: + if (p10bits == 16) { + format = (msb == 0) ? + FORMAT_YUYV_P10_16BIT_LSB : + FORMAT_YUYV_P10_16BIT_MSB; + } else if (p10bits == 32) { + format = (msb == 0) ? + FORMAT_YUYV_P10_32BIT_LSB : + FORMAT_YUYV_P10_32BIT_MSB; + } else { + format = -1; + } + break; + case PACKED_YVYU: + if (p10bits == 16) { + format = (msb == 0) ? + FORMAT_YVYU_P10_16BIT_LSB : + FORMAT_YVYU_P10_16BIT_MSB; + } else if (p10bits == 32) { + format = (msb == 0) ? + FORMAT_YVYU_P10_32BIT_LSB : + FORMAT_YVYU_P10_32BIT_MSB; + } else { + format = -1; + } + break; + case PACKED_UYVY: + if (p10bits == 16) { + format = (msb == 0) ? + FORMAT_UYVY_P10_16BIT_LSB : + FORMAT_UYVY_P10_16BIT_MSB; + } else if (p10bits == 32) { + format = (msb == 0) ? + FORMAT_UYVY_P10_32BIT_LSB : + FORMAT_UYVY_P10_32BIT_MSB; + } else { + format = -1; + } + break; + case PACKED_VYUY: + if (p10bits == 16) { + format = (msb == 0) ? + FORMAT_VYUY_P10_16BIT_LSB : + FORMAT_VYUY_P10_16BIT_MSB; + } else if (p10bits == 32) { + format = (msb == 0) ? + FORMAT_VYUY_P10_32BIT_LSB : + FORMAT_VYUY_P10_32BIT_MSB; + } else { + format = -1; + } + break; + default: + format = -1; + } + } else { + format = -1; + } + + return format; +} + +void GenRegionToMap(VpuRect *region, + int *roiLevel, int num, Uint32 mapWidth, Uint32 mapHeight, + Uint8 *roiCtuMap) +{ + Int32 roi_id, blk_addr; + Uint32 roi_map_size = mapWidth * mapHeight; + Uint32 x, y; + // init roi map + for (blk_addr = 0; blk_addr < (Int32)roi_map_size; blk_addr++) + roiCtuMap[blk_addr] = 0; + + // set roi map. roi_entry[i+1] has higher priority than roi_entry[i] + for (roi_id = 0; roi_id < (Int32)num; roi_id++) { + + VpuRect *roi = region + roi_id; + + CVI_VC_TRACE("roi level:%d\n", *(roiLevel + roi_id)); + for (y = roi->top; y <= roi->bottom; y++) { + for (x = roi->left; x <= roi->right; x++) { + roiCtuMap[y * mapWidth + x] = *(roiLevel + roi_id); + } + } + } + for (y = 0; y < mapHeight; y++) { + for (x = 0; x < mapWidth; x++) + CVI_VC_TRACE("%d ", roiCtuMap[y*mapWidth + x]); + CVI_VC_TRACE("\n"); + } +} + +#ifdef REDUNDENT_CODE +#ifdef SUPPORT_980_ROI_RC_LIB +void GenRegionToMap980(VpuRect *region, /**< The size of the ROI region (start + X/Y in pixel, end X/Y in pixel) */ + int *roiLevel, int num, Uint32 mapWidth, + Uint32 mapHeight, Uint8 *roiCtuMap) +{ + Int32 roi_id, blk_addr; + Uint32 roi_map_size = mapWidth * mapHeight; + + // init roi map + for (blk_addr = 0; blk_addr < (Int32)roi_map_size; blk_addr++) + roiCtuMap[blk_addr] = 0; + + // set roi map. roi_entry[i+1] has higher priority than roi_entry[i] + for (roi_id = (Int32)num - 1; roi_id >= 0; roi_id--) { + Uint32 x, y, top, bottom, left, right; + VpuRect *roi = region + roi_id; + + // convert pixel unit to ctu(64x64) unit. + top = (roi->top >> 6); + bottom = (roi->bottom >> 6); + left = (roi->left >> 6); + right = (roi->right >> 6); + + for (y = top; y <= bottom; y++) { + for (x = left; x <= right; x++) { + roiCtuMap[y * mapWidth + x] = + *(roiLevel + roi_id); + } + } + } +} +#endif +#endif + +void GenRegionToQpMap( + VpuRect *region, /**< The size of the ROI region for H.265 (start X/Y in + CTU, end X/Y int CTU) */ + int *roiLevel, int num, int initQp, Uint32 mapWidth, Uint32 mapHeight, + Uint8 *roiCtuMap) +{ + Int32 roi_id, blk_addr; + Uint32 roi_map_size = mapWidth * mapHeight; + + // init roi map + for (blk_addr = 0; blk_addr < (Int32)roi_map_size; blk_addr++) + roiCtuMap[blk_addr] = initQp; + + // set roi map. roi_entry[i] has higher priority than roi_entry[i+1] + for (roi_id = 0; roi_id < num; roi_id++) { + Uint32 x, y; + VpuRect *roi = region + roi_id; + + for (y = roi->top; y <= roi->bottom; y++) { + for (x = roi->left; x <= roi->right; x++) { + roiCtuMap[y * mapWidth + x] = + *(roiLevel + roi_id); + } + } + } +} + +Int32 writeVuiRbsp(int coreIdx, TestEncConfig *pEncConfig, EncOpenParam *pEncOP, + vpu_buffer_t *vbVuiRbsp) +{ + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + CVI_VC_TRACE("\n"); + + if (pEncOP->encodeVuiRbsp == TRUE) { + vbVuiRbsp->size = VUI_HRD_RBSP_BUF_SIZE; + + CVI_VC_MEM("vbVuiRbsp->size = 0x%X\n", vbVuiRbsp->size); + sprintf(ionName, "VENC_%d_VuiRbsp", pEncConfig->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, vbVuiRbsp, 0, ionName) < 0) { + VLOG(ERR, "fail to allocate VUI rbsp buffer\n"); + return FALSE; + } + pEncOP->vuiRbspDataAddr = vbVuiRbsp->phys_addr; + } + return TRUE; +} + +Int32 writeHrdRbsp(int coreIdx, TestEncConfig *pEncConfig, EncOpenParam *pEncOP, + vpu_buffer_t *vbHrdRbsp) +{ + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + CVI_VC_TRACE("\n"); + + if (pEncOP->encodeHrdRbspInVPS || pEncOP->encodeHrdRbspInVUI) { + vbHrdRbsp->size = VUI_HRD_RBSP_BUF_SIZE; + CVI_VC_MEM("vbHrdRbsp->size = 0x%X\n", vbHrdRbsp->size); + sprintf(ionName, "VENC_%d_HrdRbsp", pEncConfig->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, vbHrdRbsp, 0, ionName) < 0) { + VLOG(ERR, "fail to allocate HRD rbsp buffer\n"); + return FALSE; + } + + pEncOP->hrdRbspDataAddr = vbHrdRbsp->phys_addr; + } + return TRUE; +} + +#ifdef TEST_ENCODE_CUSTOM_HEADER +Int32 writeCustomHeader(int coreIdx, EncOpenParam *pEncOP, + vpu_buffer_t *vbCustomHeader, hrd_t *hrd) +{ + Int32 rbspBitSize; + Uint8 *pRbspBuf; + Int32 rbspByteSize; + vui_t vui; + + CVI_VC_TRACE("\n"); + + pEncOP->encodeVuiRbsp = 1; + + vbCustomHeader->size = VUI_HRD_RBSP_BUF_SIZE; + + CVI_VC_MEM("vbCustomHeader->size = 0x%X\n", vbCustomHeader->size); + if (VDI_ALLOCATE_MEMORY(coreIdx, vbCustomHeader, 0) < 0) { + VLOG(ERR, "fail to allocate VUI rbsp buffer\n"); + return FALSE; + } + + pEncOP->vuiRbspDataAddr = vbCustomHeader->phys_addr; + + pRbspBuf = (Uint8 *)osal_malloc(VUI_HRD_RBSP_BUF_SIZE); + if (pRbspBuf) { + osal_memset(pRbspBuf, 0, VUI_HRD_RBSP_BUF_SIZE); + vui.vui_parameters_presesent_flag = 1; + vui.vui_timing_info_present_flag = 1; + vui.vui_num_units_in_tick = 1000; + vui.vui_time_scale = 60 * 1000.0; + vui.vui_hrd_parameters_present_flag = 1; + vui.def_disp_win_left_offset = 1; + vui.def_disp_win_right_offset = 1; + vui.def_disp_win_top_offset = 1; + vui.def_disp_win_bottom_offset = 1; + + // HRD param : refer xInitHrdParameters in HM + { + int useSubCpbParams = 0; + int bitRate = pEncOP->bitRate; + int isRandomAccess; + int cpbSize = bitRate; // Adjusting value to be equal to + // TargetBitrate + int bitRateScale; + int cpbSizeScale; + int i, j, numSubLayersM1; + Uint32 bitrateValue, cpbSizeValue; + Uint32 duCpbSizeValue; + Uint32 duBitRateValue = 0; + + if (bitRate > 0) { + hrd->nal_hrd_parameters_present_flag = 1; + hrd->vcl_hrd_parameters_present_flag = 1; + } else { + hrd->nal_hrd_parameters_present_flag = 0; + hrd->vcl_hrd_parameters_present_flag = 0; + } + + if (pEncOP->EncStdParam.hevcParam.independSliceMode != + 0) + useSubCpbParams = 1; + + if (pEncOP->EncStdParam.hevcParam.intraPeriod > 0) + isRandomAccess = 1; + else + isRandomAccess = 0; + + hrd->sub_pic_hrd_params_present_flag = useSubCpbParams; + if (useSubCpbParams) { + hrd->tick_divisor_minus2 = 100 - 2; + hrd->du_cpb_removal_delay_increment_length_minus1 = + 7; // 8-bit precision ( plus 1 for last + // DU in AU ) + hrd->sub_pic_cpb_params_in_pic_timing_sei_flag = + 1; + hrd->dpb_output_delay_du_length_minus1 = + 5 + 7; // With sub-clock tick factor of + // 100, at least 7 bits to have + // the same value as AU dpb delay + } else + hrd->sub_pic_cpb_params_in_pic_timing_sei_flag = + 0; + + // calculate scale value of bitrate and initial delay + bitRateScale = calcScale(bitRate); + if (bitRateScale <= 6) + hrd->bit_rate_scale = 0; + else + hrd->bit_rate_scale = bitRateScale - 6; + + cpbSizeScale = calcScale(cpbSize); + if (cpbSizeScale <= 4) + hrd->cpb_size_scale = 0; + else + hrd->cpb_size_scale = cpbSizeScale - 4; + + hrd->cpb_size_du_scale = 6; // in units of 2^( 4 + 6 ) = + // 1,024 bit + hrd->initial_cpb_removal_delay_length_minus1 = + 15; // assuming 0.5 sec, log2( 90,000 * 0.5 ) = + // 16-bit + + if (isRandomAccess > 0) { + hrd->au_cpb_removal_delay_length_minus1 = 5; + hrd->dpb_output_delay_length_minus1 = 5; + } else { + hrd->au_cpb_removal_delay_length_minus1 = 9; + hrd->dpb_output_delay_length_minus1 = 9; + } + + numSubLayersM1 = 0; + if (pEncOP->EncStdParam.hevcParam.gopPresetIdx == + 0) { // custom GOP + for (i = 0; i < pEncOP->EncStdParam.hevcParam + .gopParam.customGopSize; + i++) { + if (numSubLayersM1 < + pEncOP->EncStdParam.hevcParam + .gopParam.picParam[i] + .temporalId) + numSubLayersM1 = + pEncOP->EncStdParam + .hevcParam + .gopParam + .picParam[i] + .temporalId; + } + } + hrd->vps_max_sub_layers_minus1 = numSubLayersM1; + // sub_layer_hrd_parameters + // BitRate[ i ] = ( bit_rate_value_minus1[ i ] + 1 ) * + // 2^( 6 + bit_rate_scale ) + bitrateValue = + bitRate / + (1 << (6 + hrd->bit_rate_scale)); // bitRate is + // in bits, so + // it needs to + // be scaled + // down + // CpbSize[ i ] = ( cpb_size_value_minus1[ i ] + 1 ) * + // 2^( 4 + cpb_size_scale ) + cpbSizeValue = + cpbSize / + (1 << (4 + hrd->cpb_size_scale)); // using + // bitRate + // results + // in 1 + // second + // CPB + // size + + // DU CPB size could be smaller (i.e. bitrateValue / + // number of DUs), but we don't know in how many DUs the + // slice segment settings will result + duCpbSizeValue = bitrateValue; + duBitRateValue = cpbSizeValue; + + for (i = 0; i < (int)hrd->vps_max_sub_layers_minus1; + i++) { + hrd->fixed_pic_rate_general_flag[i] = 1; + hrd->fixed_pic_rate_within_cvs_flag[i] = + 1; // fixed_pic_rate_general_flag[ i ] + // is equal to 1, the value of + // fixed_pic_rate_within_cvs_flag[ i + // ] is inferred to be equal to 1 + hrd->elemental_duration_in_tc_minus1[i] = 0; + + hrd->low_delay_hrd_flag[i] = 0; + hrd->cpb_cnt_minus1[i] = 0; + + if (hrd->nal_hrd_parameters_present_flag) { + for (j = 0; hrd->cpb_cnt_minus1[i]; + j++) { + hrd->bit_rate_value_minus1[j][i] = + bitrateValue - 1; + hrd->cpb_size_value_minus1[j][i] = + cpbSize - 1; + hrd->cpb_size_du_value_minus1[j] + [i] = + duCpbSizeValue - 1; + hrd->bit_rate_du_value_minus1[j] + [i] = + duBitRateValue - 1; + hrd->cbr_flag[j][i] = 0; + } + } + if (hrd->vcl_hrd_parameters_present_flag) { + for (j = 0; hrd->cpb_cnt_minus1[i]; + j++) { + hrd->bit_rate_value_minus1[j][i] = + bitrateValue - 1; + hrd->cpb_size_value_minus1[j][i] = + cpbSize - 1; + hrd->cpb_size_du_value_minus1[j] + [i] = + duCpbSizeValue - 1; + hrd->bit_rate_du_value_minus1[j] + [i] = + duBitRateValue - 1; + hrd->cbr_flag[j][i] = 0; + } + } + } + } + + EncodeVUI(hrd, &vui, pRbspBuf, VUI_HRD_RBSP_BUF_SIZE, + &rbspByteSize, &rbspBitSize, 60); + pEncOP->vuiRbspDataSize = rbspBitSize; + vdi_write_memory(coreIdx, pEncOP->vuiRbspDataAddr, pRbspBuf, + rbspByteSize, pEncOP->streamEndian); + osal_free(pRbspBuf); + } + return TRUE; +} + +Int32 allocateSeiNalDataBuf(int coreIdx, vpu_buffer_t *vbSeiNal, int srcFbNum) +{ + Int32 i; + for (i = 0; i < srcFbNum; i++) { // the number of roi buffer should be + // the same as source buffer num. + vbSeiNal[i].size = SEI_NAL_DATA_BUF_SIZE; + CVI_VC_MEM("vbSeiNal[%d].size = 0x%X\n", i, vbSeiNal[i].size); + if (VDI_ALLOCATE_MEMORY(coreIdx, &vbSeiNal[i], 0) < 0) { + VLOG(ERR, "fail to allocate SeiNalData buffer\n"); + return FALSE; + } + } + return TRUE; +} + +Int32 writeSeiNalData(EncHandle handle, int streamEndian, + PhysicalAddress prefixSeiNalAddr, hrd_t *hrd) +{ + sei_buffering_period_t buffering_period_sei; + Uint8 *pSeiBuf; + sei_active_parameter_t active_parameter_sei; + Int32 seiByteSize = 0; + HevcSEIDataEnc seiDataEnc; + sei_pic_timing_t pic_timing_sei; + + pSeiBuf = (Uint8 *)osal_malloc(SEI_NAL_DATA_BUF_SIZE); + if (pSeiBuf) { + osal_memset(pSeiBuf, 0x00, SEI_NAL_DATA_BUF_SIZE); + osal_memset(&seiDataEnc, 0x00, sizeof(seiDataEnc)); + + seiDataEnc.prefixSeiNalEnable = 1; + seiDataEnc.prefixSeiDataEncOrder = 0; + seiDataEnc.prefixSeiNalAddr = prefixSeiNalAddr; + + active_parameter_sei.active_video_parameter_set_id = + 0; // vps_video_parameter_set_id of the VPS. wave420 is + // 0 + active_parameter_sei.self_contained_cvs_flag = 0; + active_parameter_sei.no_parameter_set_update_flag = 0; + active_parameter_sei.num_sps_ids_minus1 = 0; + active_parameter_sei.active_seq_parameter_set_id[0] = + 0; // sps_seq_parameter_set_id of the SPS. wave420 is 0 + + // put sei_pic_timing + pic_timing_sei.pic_struct = 0; + pic_timing_sei.source_scan_type = 1; + pic_timing_sei.duplicate_flag = 0; + + buffering_period_sei.nal_initial_cpb_removal_delay[0] = 2229; + buffering_period_sei.nal_initial_cpb_removal_offset[0] = 0; + + seiByteSize = + EncodePrefixSEI(&active_parameter_sei, &pic_timing_sei, + &buffering_period_sei, &hrd, pSeiBuf, + SEI_NAL_DATA_BUF_SIZE); + seiDataEnc.prefixSeiDataSize = seiByteSize; + vdi_write_memory(handle->coreIdx, seiDataEnc.prefixSeiNalAddr, + pSeiBuf, seiDataEnc.prefixSeiDataSize, + streamEndian); + + free(pSeiBuf); + } + VPU_EncGiveCommand(handle, ENC_SET_SEI_NAL_DATA, &seiDataEnc); + return TRUE; +} +#endif + +void setRoiMapFromMap(int coreIdx, TestEncConfig *pEncConfig, + EncOpenParam *pEncOP, PhysicalAddress addrRoiMap, + Uint8 *roiMapBuf, EncParam *encParam, int frmNum) +{ + int mapWidth, mapHeight, roi_map_size; + int x, y; + int foregroundCnt = 0; + int roi_percent = 0; + CVI_VC_TRACE("roi_enable = %d\n", pEncConfig->roi_enable); + + if ((!(pEncConfig->roi_enable && encParam->srcEndFlag != 1)) && + pEncConfig->cviApiMode == API_MODE_DRIVER) { + return; + } + mapWidth = ((pEncOP->picWidth + 63) & ~63) >> 6; + mapHeight = ((pEncOP->picHeight + 63) & ~63) >> 6; + roi_map_size = mapWidth * mapHeight; + encParam->ctuOptParam.mapEndian = VDI_LITTLE_ENDIAN; + encParam->ctuOptParam.mapStride = ((pEncOP->picWidth + 63) & ~63) >> 6; + encParam->ctuOptParam.addrRoiCtuMap = addrRoiMap; + + encParam->ctuOptParam.roiDeltaQp = ABS(pEncOP->fg_dealt_qp); + // DEBUG + CVI_VC_MOTMAP("###############################\n"); + for (y = 0; y < mapHeight; y++) { + for (x = 0; x < mapWidth; x++) { + if (pEncOP->picMotionMap[(y * mapWidth) + x]) { + roiMapBuf[(y * mapWidth) + x] = 2; + foregroundCnt++; + } else { + roiMapBuf[(y * mapWidth) + x] = 0; + } + } + } + + encParam->ctuOptParam.roiEnable = (foregroundCnt > 0) ? TRUE : FALSE; + roi_percent = foregroundCnt * 100 / roi_map_size; + if (roi_percent > 80) { + encParam->ctuOptParam.roiEnable = FALSE; + } else if (roi_percent > 70 && + encParam->ctuOptParam.roiDeltaQp > 1) { + encParam->ctuOptParam.roiDeltaQp = 1; + } else if (roi_percent > 50 && + encParam->ctuOptParam.roiDeltaQp > 2) { + encParam->ctuOptParam.roiDeltaQp = 2; + } else if (roi_percent > 35 && + encParam->ctuOptParam.roiDeltaQp > 3) { + encParam->ctuOptParam.roiDeltaQp = 3; + } else if (roi_percent > 15 && + encParam->ctuOptParam.roiDeltaQp > 5) { + encParam->ctuOptParam.roiDeltaQp = 5; + } + + if (!(frmNum % 20)) { + char buf_dbg[128] = {0}; + u32 pos = 0; + int i = 0; + + for (i = 0; i < mapHeight * mapWidth; i++) { + sprintf(buf_dbg + pos, "%d ", + (pEncOP->picMotionMap[i]) != 0); + pos += 2; + if ((i + 1) % mapWidth == 0) { + CVI_VC_MOTMAP("%s\n", buf_dbg); + pos = 0; + } + } + + } + + vdi_write_memory(coreIdx, encParam->ctuOptParam.addrRoiCtuMap, + roiMapBuf, mapHeight * mapWidth, + encParam->ctuOptParam.mapEndian); +#ifdef DUMP_MOTIONMAP + { + int i = 0; + + for (i = 0; i < mapHeight * mapWidth; i++) + roiMapBuf[i] = 127 * roiMapBuf[i]; + + kernel_write(pEncConfig->filp, roiMapBuf, + mapHeight * mapWidth, &pEncConfig->pos); + } +#endif +} + +int cviSetCtuRoiLevelMap(int coreIdx, TestEncConfig *pEncConfig, + EncOpenParam *pEncOP, PhysicalAddress addrRoiMap, + Uint8 *roiMapBuf, EncParam *encParam, + int maxCtuNum) +{ + CVI_VC_TRACE("roi_enable = %d\n", pEncConfig->roi_enable); + + if (pEncConfig->roi_enable && encParam->srcEndFlag != 1) { + int roiNum = pEncConfig->actRegNum; + encParam->ctuOptParam.addrRoiCtuMap = addrRoiMap; + encParam->ctuOptParam.mapEndian = VDI_LITTLE_ENDIAN; + encParam->ctuOptParam.mapStride = + ((pEncOP->picWidth + 63) & ~63) >> 6; + encParam->ctuOptParam.roiEnable = + (roiNum != 0) ? pEncConfig->roi_enable : 0; + encParam->ctuOptParam.roiDeltaQp = pEncConfig->roi_delta_qp; + CVI_VC_TRACE("roiEnable:%d, roi_delta_qp:%d\n", + encParam->ctuOptParam.roiEnable, pEncConfig->roi_delta_qp); + if (encParam->ctuOptParam.roiEnable) { + vdi_write_memory(coreIdx, + encParam->ctuOptParam.addrRoiCtuMap, + roiMapBuf, maxCtuNum, + encParam->ctuOptParam.mapEndian); + } + } + return TRUE; +} + +int cviSmartRoiLevelCfg(int coreIdx, TestEncConfig *pEncConfig, + EncParam *pEncParam, EncOpenParam *pEncOP, + PhysicalAddress addrRoiMap, Uint8 *roiMapBuf, + int frmNum) +{ + if (pEncConfig->cviEc.bRoiBinValid == 1 && pEncOP->smart_ai_en) { + int map_width, map_height; + uint8_t *roiBinBuffer; + + map_height = ((pEncOP->picHeight + 63) & ~63) >> 6; + map_width = ((pEncOP->picWidth + 63) & ~63) >> 6; + roiBinBuffer = pEncConfig->cviEc.pu8QpMap; + pEncParam->ctuOptParam.addrRoiCtuMap = addrRoiMap; + pEncParam->ctuOptParam.mapEndian = VDI_LITTLE_ENDIAN; + pEncParam->ctuOptParam.mapStride = map_width; + pEncParam->ctuOptParam.roiEnable = 1; + + if (pEncConfig->cviEc.roideltaqp < 0) { + CVI_VC_ERR("smart ai roideltaqp cfg err\n"); + return 0; + } + + if (pEncOP->fg_protect_en) { + int roi_level = (pEncOP->fg_dealt_qp + + pEncConfig->cviEc.roideltaqp - 1) / + pEncConfig->cviEc.roideltaqp; + int x, y; + + if (pEncOP->picMotionLevel > 230) + roi_level = 0; + else if (pEncOP->picMotionLevel > 192 && roi_level > 1) + roi_level = 1; + else if (pEncOP->picMotionLevel > 128 && roi_level > 2) + roi_level = 2; + else if (pEncOP->picMotionLevel > 64 && roi_level > 3) + roi_level = 3; + + for (y = 0; y < map_height; y++) { + for (x = 0; x < map_width; x++) { + if (!roiBinBuffer[(y * map_width) + x] && + pEncOP->picMotionMap[(y * map_width) + x]) { + roiBinBuffer[(y * map_width) + x] = roi_level; + } + } + } + + } +#ifdef DUMP_MOTIONMAP + { + int i = 0; + + for (i = 0; i < map_height * map_width; i++) + pEncOP->picMotionMap[i] = 230 * pEncOP->picMotionMap[i]; + + kernel_write(pEncConfig->filp, pEncOP->picMotionMap, + map_height * map_width, &pEncConfig->pos); + } +#endif + pEncParam->ctuOptParam.roiDeltaQp = pEncConfig->cviEc.roideltaqp; + CVI_VC_TRACE("bRoiBinValid is 1, roideltaqp:%d\n", + pEncConfig->cviEc.roideltaqp); + vdi_write_memory(coreIdx, + pEncParam->ctuOptParam.addrRoiCtuMap, + roiBinBuffer, map_height * map_width, + VDI_LITTLE_ENDIAN); + pEncConfig->cviEc.bRoiBinValid = 0; +#ifdef DUMP_MOTIONMAP + { + int i = 0; + + for (i = 0; i < map_height * map_width; i++) + roiBinBuffer[i] = 35 * roiBinBuffer[i]; + + kernel_write(pEncConfig->filp, roiBinBuffer, + map_height * map_width, &pEncConfig->pos); + } +#endif + } else if (pEncOP->fg_protect_en) { + setRoiMapFromMap(coreIdx, pEncConfig, + pEncOP, addrRoiMap, + roiMapBuf, pEncParam, + frmNum); + } + return TRUE; +} + +int checkParamRestriction(Uint32 productId, TestEncConfig *pEncConfig) +{ + CVI_VC_TRACE("IN, productId = 0x%X\n", productId); + + if ((pEncConfig->compare_type & (1 << MODE_SAVE_ENCODED)) && + pEncConfig->bitstreamFileName[0] == 0) { + pEncConfig->compare_type &= ~(1 << MODE_SAVE_ENCODED); + VLOG(ERR, "You want to Save bitstream data. Set the path\n"); + } + + if ((pEncConfig->compare_type & (1 << MODE_COMP_ENCODED)) && + pEncConfig->ref_stream_path[0] == 0) { + pEncConfig->compare_type &= ~(1 << MODE_COMP_ENCODED); + VLOG(ERR, "You want to Compare bitstream data. Set the path\n"); + } + + /* CHECK PARAMETERS */ + if (productId == PRODUCT_ID_420L) { + if (pEncConfig->rotAngle != 0) { + VLOG(ERR, "WAVE420L Not support rotation option\n"); + return FALSE; + } + if (pEncConfig->mirDir != 0) { + VLOG(ERR, "WAVE420L Not support mirror option\n"); + return FALSE; + } + if (pEncConfig->srcFormat3p4b == TRUE) { + VLOG(ERR, + "WAVE420L Not support 3 pixel 4byte format option\n"); + return FALSE; + } + + if (pEncConfig->ringBufferEnable == TRUE) { + pEncConfig->ringBufferEnable = FALSE; + VLOG(ERR, "WAVE420L doesn't support ring-buffer.\n"); + } + } + return TRUE; +} + +void GenQpMap(TestEncConfig *pEncConfig, EncParam *param, + EncOpenParam *pEncOP, Uint8 *QpMapBuf) +{ + Int32 roi_idx, valid_roi_cnt = 0; + // Int32 blk_addr; + CVI_U32 row, col; + BOOL roi_param_change = param->roi_request; + Int32 maxCtuWidth, maxCtuHeight; + + if (roi_param_change) { + + maxCtuWidth = ((pEncOP->picWidth + 63) & ~63) >> 6; + maxCtuHeight = ((pEncOP->picHeight + 63) & ~63) >> 6; + + for (roi_idx = 0; roi_idx < VENC_MAX_ROI_NUM; roi_idx++) { + + VpuRect *rect = &pEncConfig->region[roi_idx]; + + if (param->roi_enable[roi_idx]) { + + rect->left = + CLIP3(0, maxCtuWidth, + param->roi_rect_x[roi_idx] >> 6); + rect->top = + CLIP3(0, maxCtuHeight, + param->roi_rect_y[roi_idx] >> 6); + rect->right = CLIP3( + 0, maxCtuWidth, + (Int32)(rect->left + + ((param->roi_rect_width[roi_idx] + + 63) >> 6) - 1)); + rect->bottom = CLIP3( + 0, maxCtuHeight, + (Int32)(rect->top + + ((param->roi_rect_height[roi_idx] + + 63) >> 6) - 1)); + + + valid_roi_cnt++; + } else { + continue; + } + for (row = rect->top; row <= rect->bottom; row++) { + for (col = rect->left; col <= rect->right; col++) { + if (param->roi_qp_mode[roi_idx] == TRUE) + QpMapBuf[maxCtuWidth * row + col] = param->roi_qp[roi_idx]; + } + } + + } + pEncConfig->roi_enable = (valid_roi_cnt > 0) ? 1 : 0; + } +} + +void GenRoiLevelMap(TestEncConfig *pEncConfig, EncParam *param, + EncOpenParam *pEncOP, Int32 base_qp, Uint8 *roiCtuMap) +{ + Int32 roi_idx, qp_delta, roi_level, blk_addr, valid_roi_cnt = 0; + Uint32 roi_map_size; + Uint32 x, y; + + Int32 mapWidth = pEncOP->picWidth >> 6; + Int32 mapHeight = pEncOP->picHeight >> 6; + BOOL roi_param_change = param->roi_request; + + if (roi_param_change || param->roi_base_qp != base_qp) { + for (roi_idx = 0; roi_idx < 8; roi_idx++) { + if (param->roi_enable[roi_idx]) { + if (param->roi_qp_mode[roi_idx] == TRUE) { + CVI_VC_TRACE("base qp:%d param->roi_qp[roi_idx]:%d\n", + base_qp, param->roi_qp[roi_idx]); + qp_delta = (base_qp - param->roi_qp[roi_idx]); + } else { + qp_delta = abs(param->roi_qp[roi_idx]); + } + + if (qp_delta >= 0 && qp_delta < 8) { + pEncConfig->roi_delta_qp = 1; + roi_level = (qp_delta / pEncConfig->roi_delta_qp); + } else if (qp_delta >= 8 && qp_delta < 15) { + pEncConfig->roi_delta_qp = 2; + roi_level = (qp_delta / pEncConfig->roi_delta_qp); + } else if (qp_delta >= 16 && qp_delta < 24) { + pEncConfig->roi_delta_qp = 3; + roi_level = (qp_delta / pEncConfig->roi_delta_qp); + } else if (qp_delta >= 24 && qp_delta < 32) { + pEncConfig->roi_delta_qp = 4; + roi_level = (qp_delta / pEncConfig->roi_delta_qp); + } else if (qp_delta >= 32 && qp_delta < 40) { + pEncConfig->roi_delta_qp = 5; + roi_level = (qp_delta / pEncConfig->roi_delta_qp); + } + + pEncConfig->roiLevel[roi_idx] = roi_level; + } else { + continue; + } + } + } + CVI_VC_TRACE("qp_delta:%d pEncConfig->roi_delta_qp:%d roi level:%d\n", + qp_delta, pEncConfig->roi_delta_qp, roi_level); + + roi_map_size = mapWidth * mapHeight; + + for (blk_addr = 0; blk_addr < (Int32)roi_map_size; blk_addr++) + roiCtuMap[blk_addr] = 0; + + if (roi_param_change) { + for (roi_idx = 0; roi_idx < 8; roi_idx++) { + VpuRect *rect = &pEncConfig->region[roi_idx]; + + if (param->roi_enable[roi_idx]) { + rect->left = CLIP3(0, mapWidth - 1, param->roi_rect_x[roi_idx] >> 6); + + rect->top = CLIP3(0, mapHeight - 1, param->roi_rect_y[roi_idx] >> 6); + + rect->right = CLIP3(0, mapWidth - 1, + (Int32)(rect->left + ((param->roi_rect_width[roi_idx] + 63) >> 6) - 1)); + + rect->bottom = CLIP3(0, mapHeight - 1, + (Int32)(rect->top + ((param->roi_rect_height[roi_idx] + 63) >> 6) - 1)); + + for (y = rect->top; y <= rect->bottom; y++) { + for (x = rect->left; x <= rect->right; x++) + roiCtuMap[y * mapWidth + x] = pEncConfig->roiLevel[roi_idx]; + } + valid_roi_cnt++; + + } else { + continue; + } + } + pEncConfig->actRegNum = 8; + pEncConfig->roi_enable = (valid_roi_cnt > 0) ? 1 : 0; + param->roi_request = FALSE; + } + param->roi_base_qp = base_qp; +} + +void cviSetCodaRoiBySdk(EncParam *param, EncOpenParam *pEncOP, Int32 base_qp) +{ + Int32 roi_idx, valid_roi_cnt = 0; + BOOL roi_param_change = param->roi_request; + if (roi_param_change) { + Int32 maxMbWidth = (pEncOP->picWidth >> 4) - 1; + Int32 maxMbHeight = (pEncOP->picHeight >> 4) - 1; + for (roi_idx = 0; roi_idx < 8; roi_idx++) { + VpuRect *rect = ¶m->setROI.region[roi_idx]; + if (param->roi_enable[roi_idx]) { + rect->left = + CLIP3(0, maxMbWidth, + param->roi_rect_x[roi_idx] >> 4); + rect->top = + CLIP3(0, maxMbHeight, + param->roi_rect_y[roi_idx] >> 4); + rect->right = CLIP3( + 0, maxMbWidth, + (Int32)(rect->left + + ((param->roi_rect_width[roi_idx] + + 15) >> + 4) - + 1)); + rect->bottom = CLIP3( + 0, maxMbHeight, + (Int32)(rect->top + + ((param->roi_rect_height[roi_idx] + + 15) >> + 4) - + 1)); + valid_roi_cnt++; + } else { + rect->left = rect->top = -1; + rect->right = rect->bottom = 0; + } + } + param->setROI.number = 8; + param->coda9RoiEnable = (valid_roi_cnt > 0) ? 1 : 0; + param->roi_request = FALSE; + } + if (roi_param_change || (param->roi_base_qp != base_qp)) { + if (param->coda9RoiEnable == 0) { + return; + } + param->nonRoiQp = base_qp; + param->coda9RoiPicAvgQp = base_qp; + for (roi_idx = 0; roi_idx < 8; roi_idx++) { + if (param->roi_enable[roi_idx]) { + param->setROI.qp[roi_idx] = + (param->roi_qp_mode[roi_idx] == TRUE) ? + param->roi_qp[roi_idx] : + base_qp + + param->roi_qp[roi_idx]; + } else { + param->setROI.qp[roi_idx] = 0; + } + } + } + param->roi_base_qp = base_qp; +} + +int allocateRoiMapBuf(int coreIdx, TestEncConfig *pEncConfig, + vpu_buffer_t *vbRoi, int srcFbNum, int ctuNum) +{ + int i; + if (pEncConfig->roi_enable || + pEncConfig->cviApiMode != API_MODE_DRIVER) { + // number of roi buffer should be the same as source buffer num. + for (i = 0; i < srcFbNum; i++) { + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + vbRoi[i].size = ctuNum; + CVI_VC_MEM("vbRoi[%d].size = 0x%X\n", i, vbRoi[i].size); + sprintf(ionName, "VENC_%d_H265_RoiMap", + pEncConfig->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, &vbRoi[i], 0, + ionName) < 0) { + CVI_VC_ERR("fail to allocate ROI buffer\n"); + return FALSE; + } + } + } + return TRUE; +} + +#ifdef REDUNDENT_CODE +int openCtuModeMapFile(TestEncConfig *pEncConfig) +{ + if (pEncConfig->ctu_mode_enable) { + if (pEncConfig->ctumode_file_name[0]) { + ChangePathStyle(pEncConfig->ctumode_file_name); + pEncConfig->ctumode_file = + osal_fopen(pEncConfig->ctumode_file_name, "r"); + if (pEncConfig->ctumode_file == NULL) { + VLOG(ERR, "fail to open CTU mode file, %s\n", + pEncConfig->ctumode_file_name); + return FALSE; + } + } + } + return TRUE; +} + +int allocateCtuModeMapBuf(int coreIdx, TestEncConfig encConfig, + vpu_buffer_t *vbCtuMode, int srcFbNum, int ctuNum) +{ + char ionName[MAX_VPU_ION_BUFFER_NAME]; + int i; + + if (encConfig.ctu_mode_enable) { + // the number of CTU mode buffer should be the same as source buffer num. + for (i = 0; i < srcFbNum; i++) { + vbCtuMode[i].size = ctuNum; + + CVI_VC_MEM("vbCtuMode[%d].size = 0x%X\n", i, + vbCtuMode[i].size); + sprintf(ionName, "VENC_%d_CtuMode", + encConfig.s32ChnNum); + + if (VDI_ALLOCATE_MEMORY(coreIdx, &vbCtuMode[i], 0, + ionName) < 0) { + VLOG(ERR, "fail to allocate CTU mode buffer\n"); + return FALSE; + } + } + } + return TRUE; +} + +int setCtuModeMap(int coreIdx, TestEncConfig *pEncConfig, EncOpenParam *pEncOP, + PhysicalAddress addrCtuModeMap, Uint8 *ctuModeMapBuf, + int srcFrameWidth, int srcFrameHeight, EncParam *encParam, + int maxCtuNum) +{ + int i; + if (pEncConfig->ctu_mode_enable && encParam->srcEndFlag != 1) { + int ctuModeNum = 0; + // sample code to convert CTU coordinate to CTU MODE map. + osal_memset(&pEncConfig->region[0], 0, + sizeof(VpuRect) * MAX_ROI_NUMBER); + osal_memset(&pEncConfig->ctuMode[0], 0, + sizeof(int) * MAX_ROI_NUMBER); + if (pEncConfig->ctumode_file_name) { + char lineStr[256] = { + 0, + }; + int val; + + fgets(lineStr, 256, pEncConfig->ctumode_file); + if (sscanf(lineStr, "%x\n", &val) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + if (val != 0xFFFF) + VLOG(ERR, "can't find the picture delimiter\n"); + // picture index + fgets(lineStr, 256, pEncConfig->ctumode_file); + if (sscanf(lineStr, "%d\n", &val) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + // number of roi regions + fgets(lineStr, 256, pEncConfig->ctumode_file); + if (sscanf(lineStr, "%d\n", &ctuModeNum) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + + for (i = 0; i < ctuModeNum; i++) { + fgets(lineStr, 256, pEncConfig->ctumode_file); + if (parseRoiCtuModeParam( + lineStr, &pEncConfig->region[i], + &pEncConfig->ctuMode[i], + srcFrameWidth, + srcFrameHeight) == 0) { + VLOG(ERR, + "CFG file error : %s value is not available.\n", + pEncConfig->ctumode_file_name); + } + } + } + + encParam->ctuOptParam.addrCtuModeMap = addrCtuModeMap; + encParam->ctuOptParam.mapEndian = VDI_LITTLE_ENDIAN; + encParam->ctuOptParam.mapStride = + ((pEncOP->picWidth + 63) & ~63) >> 6; + encParam->ctuOptParam.ctuModeEnable = + (ctuModeNum != 0) ? pEncConfig->ctu_mode_enable : 0; + + if (encParam->ctuOptParam.ctuModeEnable) { + GenRegionToMap(&pEncConfig->region[0], + &pEncConfig->ctuMode[0], ctuModeNum, + encParam->ctuOptParam.mapStride, + ((pEncOP->picHeight + 63) & ~63) >> 6, + &ctuModeMapBuf[0]); + vdi_write_memory(coreIdx, + encParam->ctuOptParam.addrCtuModeMap, + ctuModeMapBuf, maxCtuNum, + encParam->ctuOptParam.mapEndian); + } + } + return TRUE; +} +#endif + +int cviSetCtuQpMap(int coreIdx, TestEncConfig *pEncConfig, EncOpenParam *pEncOP, + PhysicalAddress addrCtuQpMap, Uint8 *ctuQpMapBuf, + EncParam *encParam, int maxCtuNum) +{ + int ctbHeight, ctbwidth; + + if (pEncConfig->ctu_qpMap_enable == 1 && encParam->srcEndFlag != 1) { + ctbHeight = ((pEncOP->picHeight + 63) & ~63) >> 6; + ctbwidth = ((pEncOP->picWidth + 63) & ~63) >> 6; + + if (ctbHeight * ctbwidth > maxCtuNum) { + CVI_VC_ERR( + "ctbHeight = %d, ctbwidth = %d, maxCtuNum = %d\n", + ctbHeight, ctbwidth, maxCtuNum); + return FALSE; + } + + encParam->ctuOptParam.addrCtuQpMap = addrCtuQpMap; + encParam->ctuOptParam.mapEndian = VDI_LITTLE_ENDIAN; + encParam->ctuOptParam.mapStride = ctbwidth; + encParam->ctuOptParam.ctuQpEnable = pEncConfig->ctu_qpMap_enable; + + CVI_VC_CFG( + "bQpMapValid = %d, mapStride = %d, ctuQpMapBuf = %p\n", + pEncConfig->cviEc.bQpMapValid, + encParam->ctuOptParam.mapStride, ctuQpMapBuf); + CVI_VC_TRACE("addrCtuQpMap = 0x%llX\n", addrCtuQpMap); + + vdi_write_memory(coreIdx, + encParam->ctuOptParam.addrCtuQpMap, + ctuQpMapBuf, ctbHeight * ctbwidth, + encParam->ctuOptParam.mapEndian); + + if (vcodec_mask & CVI_MASK_TRACE) { + int row, col; + CVI_VC_TRACE( + "ctbwidth = %d, ctbHeight = %d, QpMap =%p\n", + ctbwidth, ctbHeight, ctuQpMapBuf); + + CVI_VC_TRACE("ctuQpMapBuf =\n"); + for (row = 0; row < ctbHeight; row++) { + for (col = 0; col < ctbwidth; col++) + CVI_VC_TRACE("%d ", ctuQpMapBuf[ctbwidth * row + col]); + + CVI_VC_TRACE("\n"); + } + } + } + return TRUE; +} + +int allocateCtuQpMapBuf(int coreIdx, TestEncConfig *pEncConfig, + vpu_buffer_t *vbCtuQp, int srcFbNum, int ctuNum) +{ + int i; + + if (pEncConfig->ctu_qpMap_enable) { + // the number of CTU mode buffer should be the same as source + // buffer num. + + for (i = 0; i < srcFbNum; i++) { + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + vbCtuQp[i].size = ctuNum; + CVI_VC_MEM("vbCtuQp[%d].size = 0x%X\n", i, + vbCtuQp[i].size); + sprintf(ionName, "VENC_%d_H265_CtuQpMap", + pEncConfig->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, &vbCtuQp[i], 0, + ionName) < 0) { + CVI_VC_ERR("fail to allocate CTU QP buffer\n"); + return FALSE; + } + } + } + return TRUE; +} + +#ifdef SUPPORT_HOST_RC_PARAM +#ifdef REDUNDENT_CODE +int openHostPicRcFile(TestEncConfig *pEncConfig) +{ + if (pEncConfig->host_pic_rc_enable) { + if (pEncConfig->host_pic_rc_file_name[0]) { +#ifdef REDUNDENT_CODE + ChangePathStyle(pEncConfig->host_pic_rc_file_name); +#endif + pEncConfig->host_pic_rc_file = osal_fopen( + pEncConfig->host_pic_rc_file_name, "rt"); + if (pEncConfig->host_pic_rc_file == NULL) { + VLOG(ERR, "fail to open HOST PIC RC file, %s\n", + pEncConfig->host_pic_rc_file_name); + return FALSE; + } + } + } + return TRUE; +} + +int setHostPicRc(TestEncConfig *pEncConfig, EncParam *encParam) +{ + if (pEncConfig->host_pic_rc_enable) { + if (pEncConfig->host_pic_rc_file_name) { + char lineStr[256] = { + 0, + }; + int qp, pic_bit; + fgets(lineStr, 256, pEncConfig->host_pic_rc_file); + if (sscanf(lineStr, "%d %d\n", &qp, &pic_bit) != 2) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + encParam->hostRcPicQp = qp; + encParam->hostRcTargetPicBit = pic_bit; + } + } + return TRUE; +} +#endif +#endif + +#ifdef REDUNDENT_CODE +// Define tokens for parsing scaling list file +const char *MatrixType[SCALING_LIST_SIZE_NUM][SL_NUM_MATRIX] = { + { "INTRA4X4_LUMA", "INTRA4X4_CHROMAU", "INTRA4X4_CHROMAV", + "INTER4X4_LUMA", "INTER4X4_CHROMAU", "INTER4X4_CHROMAV" }, + { "INTRA8X8_LUMA", "INTRA8X8_CHROMAU", "INTRA8X8_CHROMAV", + "INTER8X8_LUMA", "INTER8X8_CHROMAU", "INTER8X8_CHROMAV" }, + { "INTRA16X16_LUMA", "INTRA16X16_CHROMAU", "INTRA16X16_CHROMAV", + "INTER16X16_LUMA", "INTER16X16_CHROMAU", "INTER16X16_CHROMAV" }, + { "INTRA32X32_LUMA", "INTRA32X32_CHROMAU_FROM16x16_CHROMAU", + "INTRA32X32_CHROMAV_FROM16x16_CHROMAV", "INTER32X32_LUMA", + "INTER32X32_CHROMAU_FROM16x16_CHROMAU", + "INTER32X32_CHROMAV_FROM16x16_CHROMAV" } +}; + +const char *MatrixType_DC[SCALING_LIST_SIZE_NUM - 2][SL_NUM_MATRIX] = { + { "INTRA16X16_LUMA_DC", "INTRA16X16_CHROMAU_DC", + "INTRA16X16_CHROMAV_DC", "INTER16X16_LUMA_DC", + "INTER16X16_CHROMAU_DC", "INTER16X16_CHROMAV_DC" }, + { "INTRA32X32_LUMA_DC", "INTRA32X32_CHROMAU_DC_FROM16x16_CHROMAU", + "INTRA32X32_CHROMAV_DC_FROM16x16_CHROMAV", "INTER32X32_LUMA_DC", + "INTER32X32_CHROMAU_DC_FROM16x16_CHROMAU", + "INTER32X32_CHROMAV_DC_FROM16x16_CHROMAV" }, +}; + +static Uint8 *get_sl_addr(UserScalingList *sl, Uint32 size_id, Uint32 mat_id) +{ + Uint8 *addr = NULL; + + switch (size_id) { + case SCALING_LIST_4x4: + addr = sl->s4[mat_id]; + break; + case SCALING_LIST_8x8: + addr = sl->s8[mat_id]; + break; + case SCALING_LIST_16x16: + addr = sl->s16[mat_id]; + break; + case SCALING_LIST_32x32: + addr = sl->s32[mat_id]; + break; + } + return addr; +} + +int parse_user_scaling_list(UserScalingList *sl, FILE *fp_sl) +{ +#define LINE_SIZE (1024) + const Uint32 scaling_list_size[SCALING_LIST_SIZE_NUM] = { 16, 64, 64, + 64 }; + char line[LINE_SIZE]; + Uint32 i; + Uint32 size_id, mat_id, data, num_coef = 0; + Uint8 *src = NULL; + Uint8 *ref = NULL; + char *ret; + const char *type_str; + + for (size_id = 0; size_id < SCALING_LIST_SIZE_NUM; size_id++) // for 4, + // 8, 16, + // 32 + { + num_coef = scaling_list_size[size_id]; + + for (mat_id = 0; mat_id < SL_NUM_MATRIX; mat_id++) // for + // intra_y, + // intra_cb, + // intra_cr, + // inter_y, + // inter_cb, + // inter_cr + { + src = get_sl_addr(sl, size_id, mat_id); + + if (size_id == SCALING_LIST_32x32 && + (mat_id % 3)) // derive scaling list of chroma32x32 + // from that of chrom16x16 + { + ref = get_sl_addr(sl, size_id - 1, mat_id); + + for (i = 0; i < num_coef; i++) + src[i] = ref[i]; + } else { + fseek(fp_sl, 0, 0); + type_str = MatrixType[size_id][mat_id]; + + do { + ret = fgets(line, LINE_SIZE, fp_sl); + if ((ret == NULL) || + (strstr(line, type_str) == NULL && + feof(fp_sl))) { + printf("Error: can't read a scaling list matrix(%s)\n", + type_str); + return 0; + } + } while (strstr(line, type_str) == NULL); + + // get all coeff + for (i = 0; i < num_coef; i++) { + if (fscanf(fp_sl, "%d,", &data) != 1) { + printf("Error: can't read a scaling list matrix(%s)\n", + type_str); + return 0; + } + src[i] = data; + } + + // get DC coeff for 16, 32 + if (size_id <= SCALING_LIST_8x8) { + continue; + } + + fseek(fp_sl, 0, 0); + type_str = MatrixType_DC[size_id - 2] + [mat_id]; + + do { + ret = fgets(line, LINE_SIZE, + fp_sl); + if ((ret == NULL) || + (strstr(line, type_str) == + NULL && + feof(fp_sl))) { + printf("Error: can't read a scaling list matrix(%s)\n", + type_str); + return 0; + } + } while (strstr(line, type_str) == + NULL); + + if (fscanf(fp_sl, "%d,", &data) != 1) { + printf("Error: can't read a scaling list matrix(%s)\n", + type_str); + return 0; + } + + // overwrite DC value + src[0] = data; + } + } // for matrix id + } // for size id + return 1; +} + +int parse_custom_lambda(Uint32 buf[NUM_CUSTOM_LAMBDA], FILE *fp) +{ + int i, j = 0; + char lineStr[256] = { + 0, + }; + for (i = 0; i < 52; i++) { + if (NULL != fgets(lineStr, 256, fp)) { + if (sscanf(lineStr, "%d\n", &buf[j++]) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } else { + printf("Error: can't read custom_lambda\n"); + return 0; + } + } + for (i = 0; i < 52; i++) { + if (NULL != fgets(lineStr, 256, fp)) { + if (sscanf(lineStr, "%d\n", &buf[j++]) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } else { + printf("Error: can't read custom_lambda\n"); + return 0; + } + } + + return 1; +} + +#ifdef PLATFORM_LINUX +struct option *ConvertOptions(struct OptionExt *cnmOpt, Uint32 nItems) +{ + struct option *opt; + Uint32 i; + + opt = (struct option *)osal_malloc(sizeof(struct option) * nItems); + if (opt == NULL) { + return NULL; + } + + for (i = 0; i < nItems; i++) { + osal_memcpy((void *)&opt[i], (void *)&cnmOpt[i], + sizeof(struct option)); + } + + return opt; +} + +int mkdir_recursive(char *path, mode_t omode) +{ + struct stat sb; + mode_t numask, oumask; + int first, last, retval; + char *p; + + p = path; + oumask = 0; + retval = 0; + if (p[0] == '/') /* Skip leading '/'. */ + ++p; + for (first = 1, last = 0; !last; ++p) { + if (p[0] == '\0') + last = 1; + else if (p[0] != '/') + continue; + *p = '\0'; + if (p[1] == '\0') + last = 1; + if (first) { + /* + * POSIX 1003.2: + * For each dir operand that does not name an existing + * directory, effects equivalent to those cased by the + * following command shall occcur: + * + * mkdir -p -m $(umask -S),u+wx $(dirname dir) && + * mkdir [-m mode] dir + * + * We change the user's umask and then restore it, + * instead of doing chmod's. + */ + oumask = umask(0); + numask = oumask & ~(0300); + (void)umask(numask); + first = 0; + } + if (last) + (void)umask(oumask); + if (mkdir(path, last ? omode : 0777) < + 0) { + if (errno == EEXIST || errno == EISDIR) { + if (stat(path, &sb) < 0) { + VLOG(INFO, "%s", path); + retval = 1; + break; + } else if (!S_ISDIR(sb.st_mode)) { + if (last) + errno = EEXIST; + else + errno = ENOTDIR; + VLOG(INFO, "%s", path); + retval = 1; + break; + } + } else { + VLOG(INFO, "%s", path); + retval = 1; + break; + } + } else if (1) { + VLOG(INFO, "%s", path); + chmod(path, omode); + } + if (!last) + *p = '/'; + } + if (!first && !last) + (void)umask(oumask); + return retval; +} +#endif + +BOOL TestMachineSetup(TestMachine *machine) +{ + BOOL success = TRUE; + + osal_init_keyboard(); + + InitializeDebugEnv(machine->testEnvOptions); + + return success; +} + +void TestMachineCleanUp(TestMachine *machine) +{ + Uint32 i; + Listener *o; + + for (i = 0; i < machine->numObservers; i++) { + o = &machine->observers[i]; + o->destruct(o); + } + ReleaseDebugEnv(); + osal_close_keyboard(); +} + +void TestMachineAddListener(TestMachine *machine, Listener observer, + void *handle) +{ + Uint32 i = machine->numObservers; + + if (i == MAX_OBSERVERS) { + return; + } + + observer.construct(&observer, handle); + osal_memcpy(&machine->observers[i], (void *)&observer, + sizeof(Listener)); + machine->numObservers++; +} + +BOOL TestMachineSetData(TestMachine *machine, void *data) +{ + Listener *o = NULL; + Uint32 i; + BOOL success = TRUE; + + for (i = 0; i < machine->numObservers; i++) { + o = &machine->observers[i]; + if (o->update(o, data) == FALSE) { + success = FALSE; + } + } + + return success; +} + +static int file_exist(char *path) +{ +#ifdef _MSC_VER + DWORD attributes; + char temp[4096]; + LPCTSTR lp_path = (LPCTSTR)temp; + + if (path == NULL) { + return False; + } + + strcpy(temp, path); + + replace_character(temp, '/', '\\'); + + attributes = GetFileAttributes(lp_path); + return (attributes != (DWORD)-1); +#else +#ifdef PLATFORM_NON_OS + return 1; +#else + return !access(path, F_OK); +#endif +#endif +} + +BOOL MkDir(char *path) +{ +#if defined(PLATFORM_NON_OS) || defined(PLATFORM_QNX) + /* need to implement */ + return FALSE; +#else +#ifdef _MSC_VER + char cmd[4096]; +#endif + if (file_exist(path)) + return TRUE; + +#ifdef _MSC_VER + sprintf(cmd, "mkdir %s", path); + replace_character(cmd, '/', '\\'); + if (system(cmd)) { + return FALSE; + } + return True; +#else + return mkdir_recursive(path, 0777); +#endif +#endif +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/main_helper.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/main_helper.h new file mode 100644 index 0000000000..f0eb618e48 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/main_helper.h @@ -0,0 +1,1844 @@ +//------------------------------------------------------------------------------ +// File: main_helper.h +// +// Copyright (c) 2006, Chips & Media. All rights reserved. +//------------------------------------------------------------------------------ +#ifndef _MAIN_HELPER_H_ +#define _MAIN_HELPER_H_ + +#include "config.h" +#include "vpuapifunc.h" +#include "vpuapi.h" +#include "vputypes.h" +#ifdef PLATFORM_QNX +#include +#endif + +#ifdef SUPPORT_ENCODE_CUSTOM_HEADER +#include "./misc/header_struct.h" +#endif + +#define MATCH_OR_MISMATCH(_expected, _value, _ret) \ + ((_ret = (_expected == _value)) ? "MATCH" : "MISMATCH") + +#if defined(WIN32) || defined(WIN64) +/* + ( _MSC_VER => 1200 ) 6.0 vs6 + ( _MSC_VER => 1310 ) 7.1 vs2003 + ( _MSC_VER => 1400 ) 8.0 vs2005 + ( _MSC_VER => 1500 ) 9.0 vs2008 + ( _MSC_VER => 1600 ) 10.0 vs2010 + */ +#if (_MSC_VER == 1200) +#define strcasecmp stricmp +#define strncasecmp strnicmp +#else +#define strcasecmp _stricmp +#define strncasecmp _strnicmp +#endif +#define inline _inline +#if (_MSC_VER == 1600) +#define strdup _strdup +#endif +#endif + +#define MAX_GETOPT_OPTIONS 100 +// extension of option struct in getopt +struct OptionExt { + const char *name; + int has_arg; + int *flag; + int val; + const char *help; +}; + +#define MAX_FILE_PATH 256 +#define MAX_PIC_SKIP_NUM 5 +#ifdef SUPPORT_SRC_BUF_CONTROL +#define ENC_SRC_BUF_NUM 2000 +#else +//!< case of GOPsize = 8 (IBBBBBBBP), max src buffer num = 13 +#define ENC_SRC_BUF_NUM 3 +#endif + +#define EXTRA_SRC_BUFFER_NUM 0 +#define VPU_WAIT_TIME_OUT 10 +/* should be less than normal decoding time to give a chance to fill + stream. if this value happens some problem. we should fix + VPU_WaitInterrupt function */ +#define VPU_WAIT_TIME_OUT_CQ 1 +#define PARALLEL_VPU_WAIT_TIME_OUT 1 +/* the value of timeout is 1 means we want to keep a waiting time to + give a chance of an interrupt of the next core. */ + +#define NUM_OF_USER_DATA_BUF 4 + +extern char *productNameList[]; + +typedef union { + struct { + Uint32 ctu_force_mode : 2; //[ 1: 0] + Uint32 ctu_coeff_drop : 1; //[ 2] + Uint32 reserved : 5; //[ 7: 3] + Uint32 sub_ctu_qp_0 : 6; //[13: 8] + Uint32 sub_ctu_qp_1 : 6; //[19:14] + Uint32 sub_ctu_qp_2 : 6; //[25:20] + Uint32 sub_ctu_qp_3 : 6; //[31:26] + + Uint32 lambda_sad_0 : 8; //[39:32] + Uint32 lambda_sad_1 : 8; //[47:40] + Uint32 lambda_sad_2 : 8; //[55:48] + Uint32 lambda_sad_3 : 8; //[63:56] + } field; +} EncCustomMap; // for wave520 custom map (1 CTU = 64bits) + +typedef enum { + MODE_YUV_LOAD = 0, + MODE_COMP_JYUV, + MODE_SAVE_JYUV, + + MODE_COMP_CONV_YUV, + MODE_SAVE_CONV_YUV, + + MODE_SAVE_LOAD_YUV, + + MODE_COMP_RECON, + MODE_SAVE_RECON, + + MODE_COMP_ENCODED, + MODE_SAVE_ENCODED +} CompSaveMode; + +typedef enum { + CVI_CAVLC = 0, + CVI_CABAC = 1, +} CviEntropyMode; + +typedef struct { + int picX; + int picY; + int internalBitDepth; + int losslessEnable; + int constIntraPredFlag; + int gopSize; + int numTemporalLayers; + int decodingRefreshType; + int intraQP; + int intraPeriod; + int frameRate; + + int confWinTop; + int confWinBot; + int confWinLeft; + int confWinRight; + + int independSliceMode; + int independSliceModeArg; + int dependSliceMode; + int dependSliceModeArg; + int intraRefreshMode; + int intraRefreshArg; + + int useRecommendEncParam; + int scalingListEnable; + int cuSizeMode; + int tmvpEnable; + int wppenable; + int maxNumMerge; + int dynamicMerge8x8Enable; + int dynamicMerge16x16Enable; + int dynamicMerge32x32Enable; + int disableDeblk; + int lfCrossSliceBoundaryEnable; + int betaOffsetDiv2; + int tcOffsetDiv2; + int skipIntraTrans; + int saoEnable; + int intraInInterSliceEnable; + int intraNxNEnable; + int rcEnable; + + int bitRate; + int intraQpOffset; + int initBufLevelx8; + int bitAllocMode; + int fixedBitRatio[MAX_GOP_NUM]; + int cuLevelRCEnable; + int hvsQPEnable; + + int hvsQpScaleEnable; + int hvsQpScale; + int minQp; + int maxQp; + int maxDeltaQp; + + int initDelay; + + int transRate; + int gopPresetIdx; + // CUSTOM_GOP + CustomGopParam gopParam; + + // ROI / CTU mode + HevcCtuOptParam ctuOptParam; + char roiFileName[MAX_FILE_PATH]; + char ctuModeFileName[MAX_FILE_PATH]; + char ctuQpFileName[MAX_FILE_PATH]; + + // VUI + HevcVuiParam vuiParam; + Uint32 numUnitsInTick; + Uint32 timeScale; + Uint32 numTicksPocDiffOne; + + int encAUD; + int encEOS; + int encEOB; + + int chromaCbQpOffset; + int chromaCrQpOffset; + + int initialRcQp; + + Uint32 nrYEnable; + Uint32 nrCbEnable; + Uint32 nrCrEnable; + Uint32 nrNoiseEstEnable; + Uint32 nrNoiseSigmaY; + Uint32 nrNoiseSigmaCb; + Uint32 nrNoiseSigmaCr; + + Uint32 nrIntraWeightY; + Uint32 nrIntraWeightCb; + Uint32 nrIntraWeightCr; + + Uint32 nrInterWeightY; + Uint32 nrInterWeightCb; + Uint32 nrInterWeightCr; + + Uint32 intraMinQp; + Uint32 intraMaxQp; + + Uint32 useAsLongtermPeriod; + Uint32 refLongtermPeriod; + Uint32 vuiDataEnable; + Uint32 vuiDataSize; + char vuiDataFileName[MAX_FILE_PATH]; + Uint32 hrdInVPS; + Uint32 hrdInVUI; + Uint32 hrdDataSize; + char hrdDataFileName[MAX_FILE_PATH]; + Uint32 prefixSeiEnable; + Uint32 prefixSeiDataSize; + Uint32 prefixSeiTimingFlag; + char prefixSeiDataFileName[MAX_FILE_PATH]; + Uint32 suffixSeiEnable; + Uint32 suffixSeiDataSize; + Uint32 suffixSeiTimingFlag; + char suffixSeiDataFileName[MAX_FILE_PATH]; + int forcedIdrHeaderEnable; + + // newly added for WAVE520 +#ifdef SUPPORT_HOST_RC_PARAM + int hostPicRcEnable; + char hostPicRcFileName[MAX_FILE_PATH]; +#endif +} HEVC_ENC_CFG; + +typedef struct { + char SrcFileName[MAX_FILE_PATH]; + char BitStreamFileName[MAX_FILE_PATH]; + BOOL srcCbCrInterleave; + int NumFrame; + int PicX; + int PicY; + int FrameRate; + + // MPEG4 ONLY + int VerId; + int DataPartEn; + int RevVlcEn; + int ShortVideoHeader; + int AnnexI; + int AnnexJ; + int AnnexK; + int AnnexT; + int IntraDcVlcThr; + int VopQuant; + + int frameCroppingFlag; + int frameCropLeft; + int frameCropRight; + int frameCropTop; + int frameCropBottom; + + // H.264 ONLY + int ConstIntraPredFlag; + int DisableDeblk; + int DeblkOffsetA; + int DeblkOffsetB; + int ChromaQpOffset; + int PicQpY; + // H.264 VUI information + int VuiPresFlag; + int VideoSignalTypePresFlag; + char VideoFormat; + char VideoFullRangeFlag; + int ColourDescripPresFlag; + char ColourPrimaries; + char TransferCharacteristics; + char MatrixCoeff; + int NumReorderFrame; + int MaxDecBuffering; + int aud_en; + int level; + // COMMON + int GopPicNum; + int SliceMode; + int SliceSizeMode; + int SliceSizeNum; + // COMMON - RC + int RcEnable; + int RcBitRate; + int RcInitDelay; + int RcBufSize; + int IntraRefreshNum; + int ConscIntraRefreshEnable; + int CountIntraMbEnable; + int FieldSeqIntraRefreshEnable; + int frameSkipDisable; + int ConstantIntraQPEnable; + int MaxQpSetEnable; + int MaxQp; + // H.264 only + int MaxDeltaQpSetEnable; + int MaxDeltaQp; + int MinQpSetEnable; + int MinQp; + int MinDeltaQpSetEnable; + int MinDeltaQp; + int intraCostWeight; + + // MP4 Only + int RCIntraQP; + int HecEnable; + + int GammaSetEnable; + int Gamma; + + // NEW RC Scheme + int rcIntervalMode; + int RcMBInterval; + int skipPicNums[MAX_PIC_SKIP_NUM]; + int RcMaxIntraSize; + int SearchRangeX; + int SearchRangeY; + // H.264 ONLY + int entropyCodingMode; + int cabacInitIdc; + int transform8x8Mode; + int chroma_format_400; + int field_flag; + int field_ref_mode; + int RcGopIQpOffsetEn; + int RcGopIQpOffset; + int coda9RoiEnable; + char RoiFile[MAX_FILE_PATH]; + int RoiPicAvgQp; + int set_dqp_pic_num; + int HvsQpScaleDiv2; + int EnHvsQp; + int EnRowLevelRc; + int RcInitialQp; + int RcHvsMaxDeltaQp; + + gop_entry_t gop_entry[MAX_GOP_SIZE * 2]; + int GopPreset; // 0: user specified, 1: normal, 2, 3 svc-T layer coding + + int LongTermPeriod; + int LongTermDeltaQp; + int VirtualIPeriod; + int dqp[8]; + +#ifdef ROI_MB_RC + int roi_max_delta_qp_minus; + int roi_max_delta_qp_plus; +#endif + + char pchChangeCfgFileName[MAX_FILE_PATH]; + int ChangeFrameNum; + int paraEnable; + + int IntraMbRefreshNum; + int NewGopNum; + int NewIntraQp; + int NewBitrate; + int NewFrameRate; + int NewIntraRefresh; + MinMaxQpChangeParam minMaxQpParam; + + int interviewEn; + int parasetRefreshEn; + int prefixNalEn; + int MeUseZeroPmv; // will be removed. must be 264 = 0, mpeg4 = 1 263 = 0 + int MeBlkModeEnable; // only api option + int IDRInterval; + int SrcBitDepth; + + HEVC_ENC_CFG hevcCfg; +#ifdef AUTO_FRM_SKIP_DROP + int enAutoFrmSkip; + int enAutoFrmDrop; + int vbvThreshold; + int qpThreshold; + int maxContinuosFrameSkipNum; + int maxContinuosFrameDropNum; +#endif + int rcWeightFactor; +} ENC_CFG; + +extern Uint32 randomSeed; + +/* yuv & md5 */ +#define NO_COMPARE 0 +#define YUV_COMPARE 1 +#define MD5_COMPARE 2 +#define STREAM_COMPARE 3 + +//#define FIRMWARE_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Performance report */ +typedef void *PFCtx; + +PFCtx PFMonitorSetup(Uint32 coreIndex, Uint32 instanceIndex, + Uint32 referenceClkInMHz, Uint32 fps, char *strLogDir); + +void PFMonitorRelease(PFCtx context); + +void PFMonitorUpdate(PFCtx context, Uint32 cycles); + +#ifdef REDUNDENT_CODE +void PrepareDecoderTest(DecHandle decHandle); + +void PreparationWorkForDecTest(DecHandle decHandle); + +void PreparationWorkForEncTest(EncHandle handle); + +void byte_swap(unsigned char *data, int len); +#endif + +#ifdef FIRMWARE_H +Int32 LoadFirmwareH(Int32 productId, Uint8 **retFirmware, + Uint32 *retSizeInWord); +#else +Int32 LoadFirmware(Int32 productId, Uint8 **retFirmware, Uint32 *retSizeInWord, + const char *path); +#endif + +void PrintDecSeqWarningMessages(Uint32 productId, DecInitialInfo *seqInfo); + +void DisplayEncodedInformation(EncHandle handle, CodStd codec, + EncOutputInfo *encodedInfo, ...); + +void PrintEncSppStatus(Uint32 coreIdx, Uint32 productId); + +void WriteRegVCE(Uint32 core_idx, Uint32 vce_core_idx, Uint32 vce_addr, + Uint32 udata); + +Uint32 ReadRegVCE(Uint32 core_idx, Uint32 vce_core_idx, Uint32 vce_addr); + +/* + * VPU Helper functions + */ +/************************************************************************/ +/* Video */ +/************************************************************************/ + +#define PUT_BYTE(_p, _b) \ + { \ + *_p++ = (unsigned char)_b; \ + } + +#define PUT_BUFFER(_p, _buf, _len) \ + do { \ + osal_memcpy(_p, _buf, _len); \ + _p += _len; \ + while (0) + +#define PUT_LE32(_p, _var) \ + do { \ + *_p++ = (unsigned char)((_var) >> 0); \ + *_p++ = (unsigned char)((_var) >> 8); \ + *_p++ = (unsigned char)((_var) >> 16); \ + *_p++ = (unsigned char)((_var) >> 24); \ + while (0) + +#define PUT_BE32(_p, _var) \ + do { \ + *_p++ = (unsigned char)((_var) >> 24); \ + *_p++ = (unsigned char)((_var) >> 16); \ + *_p++ = (unsigned char)((_var) >> 8); \ + *_p++ = (unsigned char)((_var) >> 0); \ + while (0) + +#define PUT_LE16(_p, _var) \ + do { \ + *_p++ = (unsigned char)((_var) >> 0); \ + *_p++ = (unsigned char)((_var) >> 8); \ + while (0) + +#define PUT_BE16(_p, _var) \ + do { \ + *_p++ = (unsigned char)((_var) >> 8); \ + *_p++ = (unsigned char)((_var) >> 0); \ + while (0) + +Int32 ConvFOURCCToMp4Class(Int32 fourcc); + +Int32 ConvFOURCCToCodStd(Uint32 fourcc); + +Int32 ConvCodecIdToMp4Class(Uint32 codecId); + +Int32 ConvCodecIdToCodStd(Int32 codecId); + +Int32 ConvCodecIdToFourcc(Int32 codecId); + +/*! + * \brief wrapper function of StoreYuvImageBurstFormat() + */ +Uint8 *GetYUVFromFrameBuffer(DecHandle decHandle, FrameBuffer *fb, + VpuRect rcFrame, Uint32 *retWidth, + Uint32 *retHeight, Uint32 *retBpp, + size_t *retSize); + +/************************************************************************/ +/* VpuMutex */ +/************************************************************************/ +typedef void *VpuMutex; + +VpuMutex VpuMutex_Create(void); + +void VpuMutex_Destroy(VpuMutex handle); + +BOOL VpuMutex_Lock(VpuMutex handle); + +BOOL VpuMutex_Unlock(VpuMutex handle); + +/************************************************************************/ +/* Queue */ +/************************************************************************/ +typedef struct { + void *data; +} QueueData; +typedef struct { + Uint8 *buffer; + Uint32 size; + Uint32 itemSize; + Uint32 count; + Uint32 front; + Uint32 rear; + VpuMutex lock; +} Queue; + +Queue *Queue_Create(Uint32 itemCount, Uint32 itemSize); + +#ifdef REDUNDENT_CODE +Queue *Queue_Create_With_Lock(Uint32 itemCount, Uint32 itemSize); +#endif + +void Queue_Destroy(Queue *queue); + +/** + * \brief Enqueue with deep copy + */ +BOOL Queue_Enqueue(Queue *queue, void *data); + +/** + * \brief Caller has responsibility for releasing the returned data + */ +void *Queue_Dequeue(Queue *queue); + +#ifdef REDUNDENT_CODE +void Queue_Flush(Queue *queue); +#endif + +void *Queue_Peek(Queue *queue); + +#ifdef REDUNDENT_CODE +Uint32 Queue_Get_Cnt(Queue *queue); + +/** + * \brief @dstQ is NULL, it allocates Queue structure and then copy from + * @srcQ. + */ +Queue *Queue_Copy(Queue *dstQ, Queue *srcQ); +#endif + +/************************************************************************/ +/* VpuThread */ +/************************************************************************/ +typedef void *VpuThread; +typedef void (*VpuThreadRunner)(void *); + +VpuThread VpuThread_Create(VpuThreadRunner func, void *arg); + +BOOL VpuThread_Join(VpuThread thread); + +/*! + * \brief millisecond sleep + */ +void MSleep(Uint32 ms //!<< millisecond +); + +/************************************************************************/ +/* ETC */ +/************************************************************************/ +#ifdef REDUNDENT_CODE +Uint32 GetRandom(Uint32 start, Uint32 end); +#endif + +#ifdef PLATFORM_WIN32 +struct timezone { + Int32 tz_minuteswest; /* minutes W of Greenwich */ + BOOL tz_dsttime; /* type of dst correction */ +}; + +Int32 gettimeofday(struct timeval *tv, struct timezone *tz); +#endif +/************************************************************************/ +/* MD5 */ +/************************************************************************/ +#ifdef REDUNDENT_CODE +typedef struct MD5state_st { + Uint32 A, B, C, D; + Uint32 Nl, Nh; + Uint32 data[16]; + Uint32 num; +} MD5_CTX; + +Int32 MD5_Init(MD5_CTX *c); + +Int32 MD5_Update(MD5_CTX *c, const void *data, size_t len); + +Int32 MD5_Final(Uint8 *md, MD5_CTX *c); + +Uint8 *MD5(const Uint8 *d, size_t n, Uint8 *md); +void plane_md5(MD5_CTX *md5_ctx, Uint8 *src, int src_x, int src_y, int out_x, + int out_y, int stride, int bpp, Uint16 zero); + +/************************************************************************/ +/* Comparator */ +/************************************************************************/ +#define COMPARATOR_SKIP 0xF0F0F0F0 +typedef enum { + COMPARATOR_CONF_SET_GOLDEN_DATA_SIZE, + COMPARATOR_CONF_SKIP_GOLDEN_DATA, /*!<< 2nd parameter pointer of Queue + containing skip command */ + COMPARATOR_CONF_SET_PICINFO, //!<< This command is followed by YUVInfo + //! +#include +#include "vpuapi.h" +#include "vpuapifunc.h" +#include "main_helper.h" +#include "cvi_vc_getopt.h" + +#ifdef VC_DRIVER_TEST +const HevcCfgInfo hevcCfgInfo[MAX_CFG] = { + // name min max default + { "InputFile", 0, 0, 0 }, + { "SourceWidth", 0, W4_MAX_ENC_PIC_WIDTH, 0 }, + { "SourceHeight", 0, W4_MAX_ENC_PIC_WIDTH, 0 }, + { "InputBitDepth", 8, 10, 8 }, + { "FrameRate", 0, 240, 0 }, // 5 + { "FrameSkip", 0, INT_MAX, 0 }, + { "FramesToBeEncoded", 0, INT_MAX, 0 }, + { "IntraPeriod", 0, UI16_MAX, 0 }, + { "DecodingRefreshType", 0, 2, 1 }, + { "DeriveLambdaWeight", 0, 1, 0 }, // 10 + { "GOPSize", 1, MAX_GOP_NUM, 1 }, + { "EnIntraInInterSlice", 0, 1, 1 }, + { "IntraNxN", 0, 1, 1 }, + { "EnCu8x8", 0, 1, 1 }, + { "EnCu16x16", 0, 1, 1 }, // 15 + { "EnCu32x32", 0, 1, 1 }, + { "IntraTransSkip", 0, 2, 1 }, + { "ConstrainedIntraPred", 0, 1, 0 }, + { "IntraCtuRefreshMode", 0, 4, 0 }, + { "IntraCtuRefreshArg", 0, UI16_MAX, 0 }, // 20 + { "MaxNumMerge", 0, 2, 2 }, + { "EnDynMerge", 0, 1, 1 }, + { "EnTemporalMVP", 0, 1, 1 }, + { "ScalingList", 0, 1, 0 }, + { "IndeSliceMode", 0, 1, 0 }, // 25 + { "IndeSliceArg", 0, UI16_MAX, 0 }, + { "DeSliceMode", 0, 2, 0 }, + { "DeSliceArg", 0, UI16_MAX, 0 }, + { "EnDBK", 0, 1, 1 }, + { "EnSAO", 0, 1, 1 }, // 30 + { "LFCrossSliceBoundaryFlag", 0, 1, 1 }, + { "BetaOffsetDiv2", -6, 6, 0 }, + { "TcOffsetDiv2", -6, 6, 0 }, + { "WaveFrontSynchro", 0, 1, 0 }, + { "LosslessCoding", 0, 1, 0 }, // 35 + { "UsePresetEncTools", 0, 3, 0 }, + { "NumTemporalLayers", 0, 7, 1 }, + { "GopPreset", 0, 20, 0 }, + { "RateControl", 0, 1, 0 }, + { "EncBitrate", 0, 700000000, 0 }, // 40 + { "TransBitrate", 0, 700000000, 0 }, + { "InitialDelay", 10, 3000, 3000 }, + { "EnHvsQp", 0, 1, 1 }, + { "CULevelRateControl", 0, 1, 1 }, + { "ConfWindSizeTop", 0, W4_MAX_ENC_PIC_HEIGHT, 0 }, // 45 + { "ConfWindSizeBot", 0, W4_MAX_ENC_PIC_HEIGHT, 0 }, + { "ConfWindSizeRight", 0, W4_MAX_ENC_PIC_WIDTH, 0 }, + { "ConfWindSizeLeft", 0, W4_MAX_ENC_PIC_WIDTH, 0 }, + { "HvsQpScaleDiv2", 0, 4, 2 }, + { "MinQp", 0, 51, 8 }, // 50 + { "MaxQp", 0, 51, 51 }, + { "MaxDeltaQp", 0, 51, 10 }, + { "NumRoi", 0, MAX_ROI_NUMBER, 0 }, + { "QP", 0, 51, 30 }, + { "RoiDeltaQP", 0, 51, 3 }, // 55 + { "IntraQpOffset", -10, 10, 0 }, + { "InitBufLevelx8", 0, 8, 1 }, + { "BitAllocMode", 0, 2, 0 }, + { "FixedBitRatio%d", 1, 255, 1 }, + { "InternalBitDepth", 0, 10, 0 }, // 60 + { "EnUserDataSei", 0, 1, 0 }, + { "UserDataEncTiming", 0, 1, 0 }, + { "UserDataSize", 0, (1 << 24) - 1, 1 }, + { "UserDataPos", 0, 1, 0 }, + { "EnRoi", 0, 1, 0 }, // 65 + { "VuiParamFlags", 0, INT_MAX, 0 }, + { "VuiAspectRatioIdc", 0, 255, 0 }, + { "VuiSarSize", 0, INT_MAX, 0 }, + { "VuiOverScanAppropriate", 0, 1, 0 }, + { "VideoSignal", 0, INT_MAX, 0 }, // 70 + { "VuiChromaSampleLoc", 0, INT_MAX, 0 }, + { "VuiDispWinLeftRight", 0, INT_MAX, 0 }, + { "VuiDispWinTopBottom", 0, INT_MAX, 0 }, + { "NumUnitsInTick", 0, INT_MAX, 0 }, + { "TimeScale", 0, INT_MAX, 0 }, // 75 + { "NumTicksPocDiffOne", 0, INT_MAX, 0 }, + { "EncAUD", 0, 1, 0 }, + { "EncEOS", 0, 1, 0 }, + { "EncEOB", 0, 1, 0 }, + { "CbQpOffset", -12, 12, 0 }, // 80 + { "CrQpOffset", -12, 12, 0 }, + { "RcInitialQp", -1, 63, 63 }, + { "EnNoiseReductionY", 0, 1, 0 }, + { "EnNoiseReductionCb", 0, 1, 0 }, + { "EnNoiseReductionCr", 0, 1, 0 }, // 85 + { "EnNoiseEst", 0, 1, 1 }, + { "NoiseSigmaY", 0, 255, 0 }, + { "NoiseSigmaCb", 0, 255, 0 }, + { "NoiseSigmaCr", 0, 255, 0 }, + { "IntraNoiseWeightY", 0, 31, 7 }, // 90 + { "IntraNoiseWeightCb", 0, 31, 7 }, + { "IntraNoiseWeightCr", 0, 31, 7 }, + { "InterNoiseWeightY", 0, 31, 4 }, + { "InterNoiseWeightCb", 0, 31, 4 }, + { "InterNoiseWeightCr", 0, 31, 4 }, // 95 + { "IntraMinQp", 0, 51, 8 }, + { "IntraMaxQp", 0, 51, 51 }, + { "MdFlag0", 0, 1, 0 }, + { "MdFlag1", 0, 1, 0 }, + { "MdFlag2", 0, 1, 0 }, // 100 + { "EnSmartBackground", 0, 1, 0 }, + { "ThrPixelNumCnt", 0, 63, 0 }, + { "ThrMean0", 0, 255, 5 }, + { "ThrMean1", 0, 255, 5 }, + { "ThrMean2", 0, 255, 5 }, // 105 + { "ThrMean3", 0, 255, 5 }, + { "MdQpY", 0, 51, 30 }, + { "MdQpC", 0, 51, 30 }, + { "ThrDcY0", 0, UI16_MAX, 2 }, + { "ThrDcC0", 0, UI16_MAX, 2 }, // 110 + { "ThrDcY1", 0, UI16_MAX, 2 }, + { "ThrDcC1", 0, UI16_MAX, 2 }, + { "ThrDcY2", 0, UI16_MAX, 2 }, + { "ThrDcC2", 0, UI16_MAX, 2 }, + { "ThrAcNumY0", 0, 63, 12 }, // 115 + { "ThrAcNumC0", 0, 15, 3 }, + { "ThrAcNumY1", 0, 255, 51 }, + { "ThrAcNumC1", 0, 63, 12 }, + { "ThrAcNumY2", 0, 1023, 204 }, + { "ThrAcNumC2", 0, 255, 51 }, // 120 + { "UseAsLongTermRefPeriod", 0, INT_MAX, 0 }, + { "RefLongTermPeriod", 0, INT_MAX, 0 }, + { "EnCtuMode", 0, 1, 0 }, + { "EnCtuQp", 0, 1, 0 }, + { "CropXPos", 0, W4_MAX_ENC_PIC_WIDTH, 0 }, // 125 + { "CropYPos", 0, W4_MAX_ENC_PIC_HEIGHT, 0 }, + { "CropXSize", 0, W4_MAX_ENC_PIC_WIDTH, 0 }, + { "CropYSize", 0, W4_MAX_ENC_PIC_HEIGHT, 0 }, + { "EncodeRbspVui", 0, 1, 0 }, + { "RbspVuiSize", 0, INT_MAX, 0 }, // 130 + { "EncodeRbspHrdInVps", 0, 1, 0 }, + { "EncodeRbspHrdInVui", 0, 1, 0 }, + { "RbspHrdSize", 0, INT_MAX, 0 }, + { "EnPrefixSeiData", 0, 1, 0 }, + { "PrefixSeiDataSize", 0, UI16_MAX, 0 }, // 135 + { "PrefixSeiTimingFlag", 0, 1, 0 }, + { "EnSuffixSeiData", 0, 1, 0 }, + { "SuffixSeiDataSize", 0, UI16_MAX, 0 }, + { "SuffixSeiTimingFlag", 0, 1, 0 }, + { "EnReportMvCol", 0, 1, 0 }, // 140 + { "EnReportDistMap", 0, 1, 0 }, + { "EnReportBitInfo", 0, 1, 0 }, + { "EnReportFrameDist", 0, 1, 0 }, + { "EnReportQpHisto", 0, 1, 0 }, + { "BitstreamFile", 0, 0, 0 }, // 145 + { "EnCustomVpsHeader", 0, 1, 0 }, + { "EnCustomSpsHeader", 0, 1, 0 }, + { "EnCustomPpsHeader", 0, 1, 0 }, + { "CustomVpsPsId", 0, 15, 0 }, + { "CustomSpsPsId", 0, 15, 0 }, // 150 + { "CustomSpsActiveVpsId", 0, 15, 0 }, + { "CustomPpsActiveSpsId", 0, 15, 0 }, + { "CustomVpsIntFlag", 0, 1, 1 }, + { "CustomVpsAvailFlag", 0, 1, 1 }, + { "CustomVpsMaxLayerMinus1", 0, 62, 0 }, // 155 + { "CustomVpsMaxSubLayerMinus1", 0, 6, 0 }, + { "CustomVpsTempIdNestFlag", 0, 1, 0 }, + { "CustomVpsMaxLayerId", 0, 31, 0 }, + { "CustomVpsNumLayerSetMinus1", 0, 2, 0 }, + { "CustomVpsExtFlag", 0, 1, 0 }, // 160 + { "CustomVpsExtDataFlag", 0, 1, 0 }, + { "CustomVpsSubOrderInfoFlag", 0, 1, 0 }, + { "CustomSpsSubOrderInfoFlag", 0, 1, 0 }, + { "CustomVpsLayerId0", 0, 0xFFFFFFFF, 0 }, + { "CustomVpsLayerId1", 0, 0xFFFFFFFF, 0 }, // 165 + { "CustomSpsLog2MaxPocMinus4", 0, 12, 4 }, + { "EnForcedIDRHeader", 0, 1, 0 }, + + // newly added for WAVE520 + { "EncMonochrome", 0, 1, 0 }, + { "StrongIntraSmoothing", 0, 1, 1 }, + { "RoiAvgQP", 0, 51, 0 }, // 170 + { "WeightedPred", 0, 1, 0 }, + { "EnBgDetect", 0, 1, 0 }, + { "BgThDiff", 0, 255, 8 }, + { "BgThMeanDiff", 0, 255, 1 }, + { "BgLambdaQp", 0, 51, 32 }, // 175 + { "BgDeltaQp", -16, 15, 3 }, + { "TileNumColumns", 1, 6, 1 }, + { "TileNumRows", 1, 6, 1 }, + { "TileUniformSpace", 0, 1, 1 }, + { "EnLambdaMap", 0, 1, 0 }, // 180 + { "EnCustomLambda", 0, 1, 0 }, + { "EnCustomMD", 0, 1, 0 }, + { "PU04DeltaRate", -128, 127, 0 }, + { "PU08DeltaRate", -128, 127, 0 }, + { "PU16DeltaRate", -128, 127, 0 }, // 185 + { "PU32DeltaRate", -128, 127, 0 }, + { "PU04IntraPlanarDeltaRate", -128, 127, 0 }, + { "PU04IntraDcDeltaRate", -128, 127, 0 }, + { "PU04IntraAngleDeltaRate", -128, 127, 0 }, + { "PU08IntraPlanarDeltaRate", -128, 127, 0 }, // 190 + { "PU08IntraDcDeltaRate", -128, 127, 0 }, + { "PU08IntraAngleDeltaRate", -128, 127, 0 }, + { "PU16IntraPlanarDeltaRate", -128, 127, 0 }, + { "PU16IntraDcDeltaRate", -128, 127, 0 }, + { "PU16IntraAngleDeltaRate", -128, 127, 0 }, // 195 + { "PU32IntraPlanarDeltaRate", -128, 127, 0 }, + { "PU32IntraDcDeltaRate", -128, 127, 0 }, + { "PU32IntraAngleDeltaRate", -128, 127, 0 }, + { "CU08IntraDeltaRate", -128, 127, 0 }, + { "CU08InterDeltaRate", -128, 127, 0 }, // 200 + { "CU08MergeDeltaRate", -128, 127, 0 }, + { "CU16IntraDeltaRate", -128, 127, 0 }, + { "CU16InterDeltaRate", -128, 127, 0 }, + { "CU16MergeDeltaRate", -128, 127, 0 }, + { "CU32IntraDeltaRate", -128, 127, 0 }, // 205 + { "CU32InterDeltaRate", -128, 127, 0 }, + { "CU32MergeDeltaRate", -128, 127, 0 }, + { "DisableCoefClear", 0, 1, 0 }, + { "EnModeMap", 0, 3, 0 }, + { "EnTemporalLayerQp", 0, 1, 0 }, + { "TID_0_Qp", 0, 51, 30 }, + { "TID_1_Qp", 0, 51, 33 }, + { "TID_2_Qp", 0, 51, 36 }, + { "TID_0_Period", 2, 128, 60 }, +#ifdef SUPPORT_HOST_RC_PARAM + { "EnHostPicRC", 0, 1, 0 }, + { "HostPicRcFile", 0, 0, 0 }, +#endif +}; + +/* +#define NUM_GOP_PRESET (5) +const int32_t GOP_SIZE_PRESET[NUM_GOP_PRESET + 1] = { 0, 1, 1, 1, 2, 2 }; + +static const int32_t SVC_T_ENC_GOP_PRESET_1[5] = { 1, 0, 0, 0, 0 }; +static const int32_t SVC_T_ENC_GOP_PRESET_2[5] = { 1, 0, 0, 1, 0 }; +static const int32_t SVC_T_ENC_GOP_PRESET_3[5] = { + 1, 0, 0, 1, 1, +}; + +static const int32_t SVC_T_ENC_GOP_PRESET_4[10] = { + 1, 0, 0, 2, 0, 2, 2, 0, 1, 0 +}; + +static const int32_t SVC_T_ENC_GOP_PRESET_5[10] = { + 1, 0, 0, 2, 0, 2, 2, 0, 1, 1 +}; + +static const int32_t *AVC_GOP_PRESET[NUM_GOP_PRESET + 1] = { + NULL, + SVC_T_ENC_GOP_PRESET_1, + SVC_T_ENC_GOP_PRESET_2, + SVC_T_ENC_GOP_PRESET_3, + SVC_T_ENC_GOP_PRESET_4, + SVC_T_ENC_GOP_PRESET_5, +}; +*/ +#endif +#define NUM_GOP_PRESET (3) +const int32_t GOP_SIZE_PRESET[NUM_GOP_PRESET + 1] = { 0, 1, 2, 4 }; + +static const int32_t SVC_T_ENC_GOP_PRESET_1[5] = { 1, 0, 0, 0, 0 }; +static const int32_t SVC_T_ENC_GOP_PRESET_2[10] = { + 1, 2, 0, 2, 0, 2, 0, 0, 1, 0 +}; +static const int32_t SVC_T_ENC_GOP_PRESET_3[20] = { 1, 4, 0, 3, 0, 2, 2, + 0, 2, 0, 3, 4, 2, 3, + 0, 4, 0, 0, 1, 0 }; + +static const int32_t *AVC_GOP_PRESET[NUM_GOP_PRESET + 1] = { + NULL, + SVC_T_ENC_GOP_PRESET_1, + SVC_T_ENC_GOP_PRESET_2, + SVC_T_ENC_GOP_PRESET_3, +}; + +void set_gop_info(ENC_CFG *pEncCfg) +{ + int i, j; + const int32_t *src_gop = AVC_GOP_PRESET[pEncCfg->GopPreset]; + + pEncCfg->set_dqp_pic_num = GOP_SIZE_PRESET[pEncCfg->GopPreset]; + + for (i = 0, j = 0; i < pEncCfg->set_dqp_pic_num; i++) { + pEncCfg->gop_entry[i].curr_poc = src_gop[j++]; + pEncCfg->gop_entry[i].qp_offset = src_gop[j++]; + pEncCfg->gop_entry[i].ref_poc = src_gop[j++]; + pEncCfg->gop_entry[i].temporal_id = src_gop[j++]; + pEncCfg->gop_entry[i].ref_long_term = src_gop[j++]; + } +} +#ifdef VC_DRIVER_TEST +static int HEVC_SetGOPInfo(char *lineStr, CustomGopPicParam *gopPicParam, + int *gopPicLambda, int useDeriveLambdaWeight, + int intraQp) +{ + int numParsed; + char sliceType; + //double lambda; origal + int lambda; //need double type here + + osal_memset(gopPicParam, 0, sizeof(CustomGopPicParam)); + *gopPicLambda = 0; + + numParsed = sscanf(lineStr, "%c %d %d %d %d %d %d", &sliceType, + &gopPicParam->pocOffset, &gopPicParam->picQp, + &lambda, &gopPicParam->temporalId, + &gopPicParam->refPocL0, &gopPicParam->refPocL1); + + +#if FLOATING_POINT_LAMBDA == 0 + lambda = (int)(lambda * 256); // * 2^10 +#endif + + if (sliceType == 'I') { + gopPicParam->picType = PIC_TYPE_I; + } else if (sliceType == 'P') { + gopPicParam->picType = PIC_TYPE_P; + if (numParsed == 6) + gopPicParam->numRefPicL0 = 2; + else + gopPicParam->numRefPicL0 = 1; + } else if (sliceType == 'B') { + gopPicParam->picType = PIC_TYPE_B; + } else { + return 0; + } + if (sliceType == 'P' && numParsed != 6) { + return 0; + } + if (sliceType == 'B' && numParsed != 7) { + return 0; + } + if (gopPicParam->temporalId < 0) { + return 0; + } + + gopPicParam->picQp = gopPicParam->picQp + intraQp; + + if (useDeriveLambdaWeight == 0) { + *gopPicLambda = (int)(lambda * LAMBDA_SCALE_FACTOR); + } else { + *gopPicLambda = 0; + } + + return 1; +} + +static int HEVC_GetStringValue(char **ppArray, int ArrayCnt, char *para, char *value) +{ + int pos = 0; + char *token = NULL; + int j = 0; + char *valueStr = vzalloc(256); + char *lineStr = vmalloc(256); + + while (j < ArrayCnt && ppArray[j]) { + memset(lineStr, 0, 256); + memcpy(lineStr, ppArray[j], strlen(ppArray[j])); + j++; + + if ((lineStr[0] == '#') || (lineStr[0] == ';') || + (lineStr[0] == ':')) { // check comment + continue; + } + + token = cvi_strtok(lineStr, + ": "); // parameter name is separated by ' ' or + // ':' + if (token != NULL) { + if (strcasecmp(para, token) != 0) { + continue; + } else { + // check parameter name + token = cvi_strtok(NULL, ":\r\n"); + osal_memcpy(valueStr, token, strlen(token)); + while (valueStr[pos] == ' ') { // check space + pos++; + } + + strcpy(value, &valueStr[pos]); + vfree(valueStr); + vfree(lineStr); + return 1; + } + } else { + continue; + } + } + + vfree(valueStr); + vfree(lineStr); + return 0; +} + +int HEVC_GetValue(char **ppArray, int ArrayCnt, HevcCfgName cfgName, int *value) +{ + int iValue; + char *sValue = vmalloc(256); + + if (HEVC_GetStringValue(ppArray, ArrayCnt, hevcCfgInfo[cfgName].name, sValue) == 1) { + iValue = atoi(sValue); + if ((iValue >= hevcCfgInfo[cfgName].min) && + (iValue <= hevcCfgInfo[cfgName].max)) { // Check min, max + *value = iValue; + vfree(sValue); + return 1; + } + VLOG(ERR, + "CFG file error : %s value is not available. ( min = %d, max = %d)\n", + hevcCfgInfo[cfgName].name, + hevcCfgInfo[cfgName].min, + hevcCfgInfo[cfgName].max); + vfree(sValue); + return 0; + } + + *value = hevcCfgInfo[cfgName].def; + vfree(sValue); + return 1; +} + + +int parseHevcCfgFile(ENC_CFG *pEncCfg, char *FileName) +{ + osal_file_t fp; + int array_cnt = 0; + char *save_ptr; + char *pstrArray[120]; + //char sValue[256]; + //char tempStr[256]; + char *sValue = vmalloc(256); + char *tempStr = vmalloc(256); + char *sRead = vmalloc(1000*20); + char *pstr = sRead; + int iValue = 0, ret = 0, i = 0; + int intra8 = 0, intra16 = 0, intra32 = 0, frameSkip = 0, + dynamicMergeEnable; // temp value + UNREFERENCED_PARAMETER(frameSkip); + + if (!sRead) { + return -1; + } + memset(sRead, 0, 1000*20); + fp = osal_fopen(FileName, "rb"); + if (fp == NULL) { + CVI_VC_ERR("open fail\n"); + vfree(sRead); + vfree(sValue); + vfree(tempStr); + return 0; + } + + ret = osal_fread(sRead, 1, 1000*20, fp); + osal_fclose(fp); + + i = 0; + while (NULL != (pstrArray[i] = cvi_strtok_r(pstr, "\n", &save_ptr))) { + i++; + if (i >= 120) { + break; + } + pstr = NULL; + } + array_cnt = i; + + if (HEVC_GetStringValue(pstrArray, array_cnt, hevcCfgInfo[BITSTREAM_FILE].name, sValue) != + 0) + strcpy(pEncCfg->BitStreamFileName, sValue); + + if (HEVC_GetStringValue(pstrArray, array_cnt, hevcCfgInfo[INPUT_FILE].name, sValue) == 0) + goto __end_parse; + else + strcpy(pEncCfg->SrcFileName, sValue); + + if (HEVC_GetValue(pstrArray, array_cnt, SOURCE_WIDTH, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.picX = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, SOURCE_HEIGHT, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.picY = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, FRAMES_TO_BE_ENCODED, &iValue) == 0) + goto __end_parse; + else + pEncCfg->NumFrame = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, INPUT_BIT_DEPTH, &iValue) == 0) + goto __end_parse; + else + pEncCfg->SrcBitDepth = iValue; // BitDepth == 8 ? + // HEVC_PROFILE_MAIN : + // HEVC_PROFILE_MAIN10 + + if (HEVC_GetValue(pstrArray, array_cnt, INTERNAL_BITDEPTH, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.internalBitDepth = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, LOSSLESS_CODING, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.losslessEnable = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, CONSTRAINED_INTRA_PRED, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.constIntraPredFlag = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, DECODING_REFRESH_TYPE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.decodingRefreshType = iValue; + + // RoiDetaQp + if (HEVC_GetValue(pstrArray, array_cnt, ROI_DELTA_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.ctuOptParam.roiDeltaQp = iValue; + CVI_VC_CFG("roiDeltaQp = %d\n", + pEncCfg->hevcCfg.ctuOptParam.roiDeltaQp); + + // IntraQpOffset + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_QP_OFFSET, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.intraQpOffset = iValue; + + // Initial Buf level x 8 + if (HEVC_GetValue(pstrArray, array_cnt, INIT_BUF_LEVELx8, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.initBufLevelx8 = iValue; + + // BitAllocMode + if (HEVC_GetValue(pstrArray, array_cnt, BIT_ALLOC_MODE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.bitAllocMode = iValue; + + // FixedBitRatio 0 ~ 7 + for (i = 0; i < MAX_GOP_NUM; i++) { + sprintf(tempStr, "FixedBitRatio%d", i); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) != 0) { + iValue = atoi(sValue); + if (iValue >= hevcCfgInfo[FIXED_BIT_RATIO].min && + iValue <= hevcCfgInfo[FIXED_BIT_RATIO].max) + pEncCfg->hevcCfg.fixedBitRatio[i] = iValue; + else + pEncCfg->hevcCfg.fixedBitRatio[i] = + hevcCfgInfo[FIXED_BIT_RATIO].def; + } else + pEncCfg->hevcCfg.fixedBitRatio[i] = + hevcCfgInfo[FIXED_BIT_RATIO].def; + } + + // IntraQp + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.intraQP = iValue; + + if (pEncCfg->hevcCfg.losslessEnable) + pEncCfg->hevcCfg.intraQP = 4; + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_PERIOD, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.intraPeriod = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, CONF_WIND_SIZE_TOP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.confWinTop = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, CONF_WIND_SIZE_BOT, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.confWinBot = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, CONF_WIND_SIZE_RIGHT, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.confWinRight = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, CONF_WIND_SIZE_LEFT, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.confWinLeft = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, FRAME_RATE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.frameRate = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INDE_SLICE_MODE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.independSliceMode = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INDE_SLICE_ARG, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.independSliceModeArg = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, DE_SLICE_MODE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.dependSliceMode = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, DE_SLICE_ARG, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.dependSliceModeArg = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_INTRA_IN_INTER_SLICE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.intraInInterSliceEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_CTU_REFRESH_MODE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.intraRefreshMode = iValue; + + if (pEncCfg->hevcCfg.intraInInterSliceEnable == 0) { + pEncCfg->hevcCfg.intraRefreshMode = 0; + } + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_CTU_REFRESH_ARG, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.intraRefreshArg = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, USE_PRESENT_ENC_TOOLS, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.useRecommendEncParam = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, SCALING_LIST, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.scalingListEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_CU_8X8, &iValue) == 0) + goto __end_parse; + else + intra8 = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_CU_16X16, &iValue) == 0) + goto __end_parse; + else + intra16 = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_CU_32X32, &iValue) == 0) + goto __end_parse; + else + intra32 = iValue; + + intra8 = intra16 = intra32 = 1; // force enable all cu mode. [CEZ-1865] + pEncCfg->hevcCfg.cuSizeMode = + (intra8 & 0x01) | (intra16 & 0x01) << 1 | (intra32 & 0x01) << 2; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_TEMPORAL_MVP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.tmvpEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, WAVE_FRONT_SYNCHRO, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.wppenable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, MAX_NUM_MERGE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.maxNumMerge = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_DYN_MERGE, &iValue) == 0) + goto __end_parse; + else + dynamicMergeEnable = iValue; + + pEncCfg->hevcCfg.dynamicMerge8x8Enable = dynamicMergeEnable; // [FIXME] + pEncCfg->hevcCfg.dynamicMerge16x16Enable = + dynamicMergeEnable; // [FIXME] + pEncCfg->hevcCfg.dynamicMerge32x32Enable = + dynamicMergeEnable; // [FIXME] + + if (HEVC_GetValue(pstrArray, array_cnt, EN_DBK, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.disableDeblk = !(iValue); + + if (HEVC_GetValue(pstrArray, array_cnt, LF_CROSS_SLICE_BOUNDARY_FLAG, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.lfCrossSliceBoundaryEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, BETA_OFFSET_DIV2, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.betaOffsetDiv2 = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, TC_OFFSET_DIV2, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.tcOffsetDiv2 = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_TRANS_SKIP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.skipIntraTrans = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_SAO, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.saoEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_NXN, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.intraNxNEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, RATE_CONTROL, &iValue) == 0) + goto __end_parse; + else + pEncCfg->RcEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, ENC_BITRATE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->RcBitRate = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, TRANS_BITRATE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.transRate = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, CU_LEVEL_RATE_CONTROL, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.cuLevelRCEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_HVS_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.hvsQPEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, HVS_QP_SCALE_DIV2, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.hvsQpScale = iValue; + + pEncCfg->hevcCfg.hvsQpScaleEnable = (iValue > 0) ? 1 : 0; + + if (HEVC_GetValue(pstrArray, array_cnt, INITIAL_DELAY, &iValue) == 0) + goto __end_parse; + else + pEncCfg->RcInitDelay = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, MIN_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.minQp = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, MAX_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.maxQp = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, MAX_DELTA_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.maxDeltaQp = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, GOP_SIZE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.gopParam.customGopSize = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, DERIVE_LAMBDA_WEIGHT, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.gopParam.useDeriveLambdaWeight = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, ROI_ENABLE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.ctuOptParam.roiEnable = iValue; + CVI_VC_CFG("roiEnable = %d\n", pEncCfg->hevcCfg.ctuOptParam.roiEnable); + + if (HEVC_GetValue(pstrArray, array_cnt, GOP_PRESET, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.gopPresetIdx = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, EN_TEMPORAL_LAYER_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.gopParam.enTemporalLayerQp = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, TID_0_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.gopParam.tidQp0 = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, TID_1_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.gopParam.tidQp1 = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, TID_2_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.gopParam.tidQp2 = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, TID_0_PERIOD, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.gopParam.tidPeriod0 = iValue; + if (HEVC_GetValue(pstrArray, array_cnt, FRAME_SKIP, &iValue) == 0) + goto __end_parse; + else + frameSkip = iValue; + + // VUI encoding + if (HEVC_GetValue(pstrArray, array_cnt, VUI_PARAM_FLAG, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiParam.vuiParamFlags = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, VUI_ASPECT_RATIO_IDC, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiParam.vuiAspectRatioIdc = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, VUI_SAR_SIZE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiParam.vuiSarSize = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, VUI_OVERSCAN_APPROPRIATE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiParam.vuiOverScanAppropriate = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, VIDEO_SIGNAL, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiParam.videoSignal = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, VUI_CHROMA_SAMPLE_LOC, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiParam.vuiChromaSampleLoc = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, VUI_DISP_WIN_LEFT_RIGHT, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiParam.vuiDispWinLeftRight = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, VUI_DISP_WIN_TOP_BOTTOM, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiParam.vuiDispWinTopBottom = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, NUM_UNITS_IN_TICK, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.numUnitsInTick = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, TIME_SCALE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.timeScale = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, NUM_TICKS_POC_DIFF_ONE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.numTicksPocDiffOne = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, ENC_AUD, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.encAUD = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, ENC_EOS, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.encEOS = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, ENC_EOB, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.encEOB = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, CB_QP_OFFSET, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.chromaCbQpOffset = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, CR_QP_OFFSET, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.chromaCrQpOffset = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, RC_INIT_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.initialRcQp = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_NR_Y, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrYEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_NR_CB, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrCbEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_NR_CR, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrCrEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_NOISE_EST, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrNoiseEstEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, NOISE_SIGMA_Y, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrNoiseSigmaY = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, NOISE_SIGMA_CB, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrNoiseSigmaCb = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, NOISE_SIGMA_CR, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrNoiseSigmaCr = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_NOISE_WEIGHT_Y, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrIntraWeightY = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_NOISE_WEIGHT_CB, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrIntraWeightCb = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_NOISE_WEIGHT_CR, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrIntraWeightCr = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTER_NOISE_WEIGHT_Y, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrInterWeightY = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTER_NOISE_WEIGHT_CB, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrInterWeightCb = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTER_NOISE_WEIGHT_CR, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.nrInterWeightCr = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_MIN_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.intraMinQp = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, INTRA_MAX_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.intraMaxQp = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, USE_LONGTERM_PRRIOD, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.useAsLongtermPeriod = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, REF_LONGTERM_PERIOD, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.refLongtermPeriod = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_CTU_MODE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.ctuOptParam.ctuModeEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_CTU_QP, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.ctuOptParam.ctuQpEnable = iValue; + + CVI_VC_CFG("ctuQpEnable = %d\n", + pEncCfg->hevcCfg.ctuOptParam.ctuQpEnable); + + if (HEVC_GetValue(pstrArray, array_cnt, EN_VUI_DATA, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiDataEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, VUI_DATA_SIZE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.vuiDataSize = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_HRD_IN_VPS, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.hrdInVPS = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_HRD_IN_VUI, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.hrdInVUI = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, HRD_DATA_SIZE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.hrdDataSize = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_PREFIX_SEI_DATA, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.prefixSeiEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, PREFIX_SEI_DATA_SIZE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.prefixSeiDataSize = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, PREFIX_SEI_TIMING_FLAG, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.prefixSeiTimingFlag = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_SUFFIX_SEI_DATA, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.suffixSeiEnable = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, SUFFIX_SEI_DATA_SIZE, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.suffixSeiDataSize = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, SUFFIX_SEI_TIMING_FLAG, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.suffixSeiTimingFlag = iValue; + + if (HEVC_GetValue(pstrArray, array_cnt, EN_FORCED_IDR_HEADER, &iValue) == 0) + goto __end_parse; + else + pEncCfg->hevcCfg.forcedIdrHeaderEnable = iValue; + + + // GOP + if (pEncCfg->hevcCfg.intraPeriod == 1) { + pEncCfg->hevcCfg.gopParam.picParam[0].picType = PIC_TYPE_I; + pEncCfg->hevcCfg.gopParam.picParam[0].picQp = + pEncCfg->hevcCfg.intraQP; + if (pEncCfg->hevcCfg.gopParam.customGopSize > 1) { + VLOG(ERR, + "CFG file error : gop size should be smaller than 2 for all intra case\n"); + goto __end_parse; + } + } else { + for (i = 0; + pEncCfg->hevcCfg.gopPresetIdx == PRESET_IDX_CUSTOM_GOP && + i < pEncCfg->hevcCfg.gopParam.customGopSize; + i++) { + sprintf(tempStr, "Frame%d", i + 1); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) == 0) { + VLOG(ERR, + "CFG file error : %s value is not available.\n", + tempStr); + goto __end_parse; + } + if (HEVC_SetGOPInfo( + sValue, + &pEncCfg->hevcCfg.gopParam.picParam[i], + &pEncCfg->hevcCfg.gopParam.gopPicLambda[i], + pEncCfg->hevcCfg.gopParam.useDeriveLambdaWeight, + pEncCfg->hevcCfg.intraQP) == 0) { + VLOG(ERR, + "CFG file error : %s value is not available.\n", + tempStr); + goto __end_parse; + } +#if TEMP_SCALABLE_RC + if ((pEncCfg->hevcCfg.gopParam.picParam[i].temporalId + + 1) > MAX_NUM_TEMPORAL_LAYER) { + VLOG(ERR, + "CFG file error : %s MaxTempLayer %d exceeds MAX_TEMP_LAYER(7).\n", + tempStr, + pEncCfg->hevcCfg.gopParam.picParam[i] + .temporalId + + 1); + goto __end_parse; + } +#endif + } + } + + + CVI_VC_CFG("roiEnable = %d\n", pEncCfg->hevcCfg.ctuOptParam.roiEnable); + // ROI + if (pEncCfg->hevcCfg.ctuOptParam.roiEnable) { + sprintf(tempStr, "RoiFile"); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) != 0) { + if (sscanf(sValue, "%s\n", pEncCfg->hevcCfg.roiFileName) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } + } + + if (pEncCfg->hevcCfg.ctuOptParam.ctuModeEnable) { + sprintf(tempStr, "CtuModeFile"); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) != 0) { + if (sscanf(sValue, "%s\n", pEncCfg->hevcCfg.ctuModeFileName) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } + } + + if (pEncCfg->hevcCfg.ctuOptParam.ctuQpEnable) { + sprintf(tempStr, "CtuQpFile"); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) != 0) { + if (sscanf(sValue, "%s\n", pEncCfg->hevcCfg.ctuQpFileName) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } + } + + if (pEncCfg->hevcCfg.prefixSeiEnable) { + sprintf(tempStr, "PrefixSeiDataFile"); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) != 0) { + if (sscanf(sValue, "%s\n", pEncCfg->hevcCfg.prefixSeiDataFileName) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } + } + + if (pEncCfg->hevcCfg.suffixSeiEnable) { + sprintf(tempStr, "SuffixSeiDataFile"); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) != 0) { + if (sscanf(sValue, "%s\n", pEncCfg->hevcCfg.suffixSeiDataFileName) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } + } + + if (pEncCfg->hevcCfg.hrdInVPS || pEncCfg->hevcCfg.hrdInVUI) { + sprintf(tempStr, "RbspHrdFile"); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) != 0) { + if (sscanf(sValue, "%s\n", pEncCfg->hevcCfg.hrdDataFileName) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } + } + + if (pEncCfg->hevcCfg.vuiDataEnable) { + sprintf(tempStr, "RbspVuiFile"); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) != 0) { + if (sscanf(sValue, "%s\n", pEncCfg->hevcCfg.vuiDataFileName) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } + } + + if (pEncCfg->hevcCfg.losslessEnable) { + pEncCfg->hevcCfg.disableDeblk = 1; + pEncCfg->hevcCfg.saoEnable = 0; + pEncCfg->RcEnable = 0; + } + +#ifdef SUPPORT_HOST_RC_PARAM + if (pEncCfg->hevcCfg.hostPicRcEnable) { + sprintf(tempStr, "HostPicRcFile"); + if (HEVC_GetStringValue(pstrArray, array_cnt, tempStr, sValue) != 0) { + if (sscanf(sValue, "%s\n", pEncCfg->hevcCfg.hostPicRcFileName) != 1) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + } + } +#endif + + ret = 1; /* Success */ + +__end_parse: + vfree(sRead); + vfree(sValue); + vfree(tempStr); + return ret; +} + + +int GetValueFrameInfo(char **ppArray, int ArrayCnt, char *para, char *value1, char *value2, + char *value3, char *value4, char *value5, + int init_ref_poc) +{ + static int LineNum = 1; + char lineStr[256]; + char paraStr[256]; + int i = 0; + + while (i < ArrayCnt && ppArray[i]) { + memset(lineStr, 0, 256); + memset(paraStr, 0, 256); + memcpy(lineStr, ppArray[i], strlen(ppArray[i])); + + *value1 = *value2 = *value4 = *value5 = 0; + *value3 = init_ref_poc; + + if (sscanf(lineStr, "%s %s %s %s %s %s", paraStr, value1, value2, value3, value4, value5) != 6) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + if (paraStr[0] != ';') { + if (strcmp(para, paraStr) == 0) { + // printf(" * %s %s\n", paraStr, value); + return 1; + } + } + // printf("Error in cmd file line <%d> : %s", + LineNum++; + } + + return 1; +} + +static int GetValues(char **ppArray, int ArrayCnt, char *para, int *values, int num) +{ + char line[256]; + int j = 0; + int i; + + while (j < ArrayCnt && ppArray[j]) { + char *str; + + memset(line, 0, 256); + memcpy(line, ppArray[j], strlen(ppArray[j])); + j++; + // empty line + str = cvi_strtok(line, " "); + if (str == NULL) + continue; + + if (strcmp(str, para) != 0) + continue; + + for (i = 0; i < num; i++) { + str = cvi_strtok(NULL, " "); + if (str == NULL) + return 1; + if (!cvi_isdigit((Int32)str[0])) + return 1; + values[i] = atoi(str); + } + return 1; + } + + return 0; +} + + +static int GetValue(char **ppArray, int ArrayCnt, char *para, char *value) +{ + char lineStr[256]; + char paraStr[256]; + int i = 0; + + while (i < ArrayCnt && ppArray[i]) { + memset(lineStr, 0, 256); + memcpy(lineStr, ppArray[i], 256); + if (sscanf(lineStr, "%s %s", paraStr, value) != 2) + VLOG(ERR, "sscanf input is wrong %d\n", __LINE__); + if (paraStr[0] != ';') { + if (strcmp(para, paraStr) == 0) { + return 1; + } + } + i++; + } + + return 0; +} + +int parseAvcCfgFile(ENC_CFG *pEncCfg, char *FileName) +{ + osal_file_t fp; + int ret = 0; + int i; + int array_cnt = 0; + char *save_ptr; + char *pstrArray[120]; + char sValue[256]; + char *sRead = vmalloc(1000*20); + char *pstr = sRead; + + if (!sRead) { + return -1; + } + memset(sRead, 0, 1000*20); + fp = osal_fopen(FileName, "rb"); + if (fp == NULL) { + CVI_VC_ERR("open fail\n"); + vfree(sRead); + return 0; + } + + ret = osal_fread(sRead, 1, 1000*20, fp); + osal_fclose(fp); + + i = 0; + while (NULL != (pstrArray[i] = cvi_strtok_r(pstr, "\n", &save_ptr))) { + i++; + if (i >= 120) { + break; + } + pstr = NULL; //important + } + array_cnt = i; + + if (GetValue(pstrArray, array_cnt, "YUV_SRC_IMG", sValue) == 0) + goto __end_parseAvcCfgFile; + else + strcpy(pEncCfg->SrcFileName, sValue); + if (GetValue(pstrArray, array_cnt, "OUT_BS", sValue) != 0) { + strcpy(pEncCfg->BitStreamFileName, sValue); + CVI_VC_INFO("pEncCfg->BitStreamFileName %s\n", + pEncCfg->BitStreamFileName); + } + if (GetValue(pstrArray, array_cnt, "FRAME_NUMBER_ENCODED", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->NumFrame = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "PICTURE_WIDTH", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->PicX = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "PICTURE_HEIGHT", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->PicY = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "FRAME_RATE", sValue) == 0) + goto __end_parseAvcCfgFile; + { + double frameRate; + int timeRes, timeInc; + +#ifdef ANDROID + frameRate = atoi(sValue); +#else + //frameRate = atof(sValue); + frameRate = atoi(sValue); +#endif + timeInc = 1; + while ((int)frameRate != frameRate) { + timeInc *= 10; + frameRate *= 10; + } + timeRes = (int)frameRate; + // divide 2 or 5 + if (timeInc % 2 == 0 && timeRes % 2 == 0) { + timeInc >>= 1; + timeRes >>= 1; + } + if (timeInc % 5 == 0 && timeRes % 5 == 0) { + timeInc /= 5; + timeRes /= 5; + } + + if (timeRes == 2997 && timeInc == 100) { + timeRes = 30000; + timeInc = 1001; + } + pEncCfg->FrameRate = (timeInc - 1) << 16; + pEncCfg->FrameRate |= timeRes; + } + if (GetValue(pstrArray, array_cnt, "CONSTRAINED_INTRA", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->ConstIntraPredFlag = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "DISABLE_DEBLK", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->DisableDeblk = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "DEBLK_ALPHA", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->DeblkOffsetA = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "DEBLK_BETA", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->DeblkOffsetB = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "CHROMA_QP_OFFSET", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->ChromaQpOffset = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "LEVEL", sValue) == 0) { + pEncCfg->level = 0; // note : 0 means auto calculation. + } else { + pEncCfg->level = atoi(sValue); + if (pEncCfg->level < 0 || pEncCfg->level > 51) + goto __end_parseAvcCfgFile; + } + if (GetValue(pstrArray, array_cnt, "PIC_QP_Y", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->PicQpY = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "GOP_PIC_NUMBER", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->GopPicNum = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "IDR_INTERVAL", sValue) == 0) + pEncCfg->IDRInterval = 0; + else + pEncCfg->IDRInterval = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "SLICE_MODE", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->SliceMode = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "SLICE_SIZE_MODE", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->SliceSizeMode = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "SLICE_SIZE_NUMBER", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->SliceSizeNum = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "AUD_ENABLE", sValue) == 0) + pEncCfg->aud_en = 0; + else + pEncCfg->aud_en = atoi(sValue); + + /** + * Error Resilience + */ + // Intra Cost Weight : not mandatory. default zero + if (GetValue(pstrArray, array_cnt, "WEIGHT_INTRA_COST", sValue) == 0) + pEncCfg->intraCostWeight = 0; + else + pEncCfg->intraCostWeight = atoi(sValue); + + /** + * CROP information + */ + if (GetValue(pstrArray, array_cnt, "FRAME_CROP_LEFT", sValue) == 0) + pEncCfg->frameCropLeft = 0; + else + pEncCfg->frameCropLeft = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "FRAME_CROP_RIGHT", sValue) == 0) + pEncCfg->frameCropRight = 0; + else + pEncCfg->frameCropRight = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "FRAME_CROP_TOP", sValue) == 0) + pEncCfg->frameCropTop = 0; + else + pEncCfg->frameCropTop = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "FRAME_CROP_BOTTOM", sValue) == 0) + pEncCfg->frameCropBottom = 0; + else + pEncCfg->frameCropBottom = atoi(sValue); + /** + * ME Option + */ + + if (GetValue(pstrArray, array_cnt, "ME_USE_ZERO_PMV", sValue) == 0) + pEncCfg->MeUseZeroPmv = 0; + else + pEncCfg->MeUseZeroPmv = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "ME_BLK_MODE_ENABLE", sValue) == 0) + pEncCfg->MeBlkModeEnable = 0; + else + pEncCfg->MeBlkModeEnable = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "RATE_CONTROL_ENABLE", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->RcEnable = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "BIT_RATE_KBPS", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->RcBitRate = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "DELAY_IN_MS", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->RcInitDelay = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "VBV_BUFFER_SIZE", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->RcBufSize = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "INTRA_MB_REFRESH", sValue) == 0) + goto __end_parseAvcCfgFile; + pEncCfg->IntraRefreshNum = atoi(sValue); + + pEncCfg->ConscIntraRefreshEnable = 0; + pEncCfg->CountIntraMbEnable = 0; + pEncCfg->FieldSeqIntraRefreshEnable = 0; + if (pEncCfg->IntraRefreshNum > 0) { + if (GetValue(pstrArray, array_cnt, "CONSC_INTRA_REFRESH_EN", sValue) == 0) + pEncCfg->ConscIntraRefreshEnable = 0; + else + pEncCfg->ConscIntraRefreshEnable = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "COUNT_INTRA_MB_EN", sValue) == 0) + pEncCfg->CountIntraMbEnable = 0; + else + pEncCfg->CountIntraMbEnable = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "FIELD_SEQ_INTRA_REFRESH_EN", sValue) == 0) + pEncCfg->FieldSeqIntraRefreshEnable = 0; + else + pEncCfg->FieldSeqIntraRefreshEnable = atoi(sValue); + } + + if (GetValue(pstrArray, array_cnt, "FRAME_SKIP_DISABLE", sValue) == 0) + pEncCfg->frameSkipDisable = 0; + else + pEncCfg->frameSkipDisable = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "CONST_INTRAQP_ENABLE", sValue) == 0) + pEncCfg->ConstantIntraQPEnable = 0; + else + pEncCfg->ConstantIntraQPEnable = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "RC_INTRA_QP", sValue) == 0) + pEncCfg->RCIntraQP = 0; + else + pEncCfg->RCIntraQP = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "MAX_QP_SET_ENABLE", sValue) == 0) + pEncCfg->MaxQpSetEnable = 0; + else + pEncCfg->MaxQpSetEnable = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "MAX_QP", sValue) == 0) + pEncCfg->MaxQp = 0; + else + pEncCfg->MaxQp = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "MIN_QP_SET_ENABLE", sValue) == 0) + pEncCfg->MinQpSetEnable = 0; + else + pEncCfg->MinQpSetEnable = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "MIN_QP", sValue) == 0) + pEncCfg->MinQp = 0; + else + pEncCfg->MinQp = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "MAX_DELTA_QP_SET_ENABLE", sValue) == 0) + pEncCfg->MaxDeltaQpSetEnable = 0; + else + pEncCfg->MaxDeltaQpSetEnable = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "MAX_DELTA_QP", sValue) == 0) + pEncCfg->MaxDeltaQp = 0; + else + pEncCfg->MaxDeltaQp = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "MIN_DELTA_QP_SET_ENABLE", sValue) == 0) + pEncCfg->MinDeltaQpSetEnable = 0; + else + pEncCfg->MinDeltaQpSetEnable = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "MIN_DELTA_QP", sValue) == 0) + pEncCfg->MinDeltaQp = 0; + else + pEncCfg->MinDeltaQp = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "GAMMA_SET_ENABLE", sValue) == 0) + pEncCfg->GammaSetEnable = 0; + else + pEncCfg->GammaSetEnable = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "GAMMA", sValue) == 0) + pEncCfg->Gamma = 0; + else + pEncCfg->Gamma = atoi(sValue); + /* CODA960 features */ + if (GetValue(pstrArray, array_cnt, "RC_INTERVAL_MODE", sValue) == 0) + pEncCfg->rcIntervalMode = 0; + else + pEncCfg->rcIntervalMode = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "RC_MB_INTERVAL", sValue) == 0) + pEncCfg->RcMBInterval = 0; + else + pEncCfg->RcMBInterval = atoi(sValue); + /***************************************/ + if (GetValue(pstrArray, array_cnt, "MAX_INTRA_SIZE", sValue) == 0) + pEncCfg->RcMaxIntraSize = 0; + else + pEncCfg->RcMaxIntraSize = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "RC_INTERVAL_MODE", sValue) == 0) + pEncCfg->rcIntervalMode = 0; + else { + pEncCfg->rcIntervalMode = atoi(sValue); + if (pEncCfg->rcIntervalMode != 0 && + pEncCfg->rcIntervalMode != 3) { + VLOG(ERR, "RC_INTERVAL_MODE Error: %d\n", + pEncCfg->rcIntervalMode); + goto __end_parseAvcCfgFile; + } + } + if (GetValue(pstrArray, array_cnt, "RC_MB_INTERVAL", sValue) == 0) + pEncCfg->RcMBInterval = 1; + else { + pEncCfg->RcMBInterval = atoi(sValue); // [1-64] + } + + if (pEncCfg->RcEnable == 0) { + pEncCfg->RcGopIQpOffsetEn = 0; + pEncCfg->RcGopIQpOffset = 0; + } else { + if (GetValue(pstrArray, array_cnt, "RC_GOP_I_QP_OFFSET_EN", sValue) == 0) { + pEncCfg->RcGopIQpOffsetEn = 0; + pEncCfg->RcGopIQpOffset = 0; + } else { + pEncCfg->RcGopIQpOffsetEn = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "RC_GOP_I_QP_OFFSET", sValue) == 0) + pEncCfg->RcGopIQpOffset = 0; + else + pEncCfg->RcGopIQpOffset = atoi(sValue); + + if (pEncCfg->RcGopIQpOffset < -4) + pEncCfg->RcGopIQpOffset = -4; + else if (pEncCfg->RcGopIQpOffset > 4) + pEncCfg->RcGopIQpOffset = 4; + } + } + if (GetValue(pstrArray, array_cnt, "SEARCH_RANGE_X", sValue) == 0) // 3: -16~15, 2:-32~31, + // 1:-48~47, 0:-64~63, + // H.263(Short Header : + // always 0) + pEncCfg->SearchRangeX = 0; + else + pEncCfg->SearchRangeX = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "SEARCH_RANGE_Y", sValue) == 0) // 2: -16~15, 1:-32~31, + // 0:-48~47, + // H.263(Short Header : + // always 0) + pEncCfg->SearchRangeY = 0; + else + pEncCfg->SearchRangeY = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "ENTROPY_CODING_MODE", sValue) == 0) // 0 : CAVLC, 1 : + // CABAC, 2: + // CAVLC/CABAC + // select + // according to + // PicType + pEncCfg->entropyCodingMode = 0; + else + pEncCfg->entropyCodingMode = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "CABAC_INIT_IDC", sValue) == 0) // cabac init idc ( 0 ~ + // 2 ) + pEncCfg->cabacInitIdc = 0; + else + pEncCfg->cabacInitIdc = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "TRANSFORM_8X8_MODE", sValue) == 0) // 0 : disable(BP), + // 1 : enable(HP) + pEncCfg->transform8x8Mode = 0; + else + pEncCfg->transform8x8Mode = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "CHROMA_FORMAT_400", sValue) == 0) // 0 : 420, 1 : 400 + // (MONO mode + // allowed only on + // HP) + pEncCfg->chroma_format_400 = 0; + else + pEncCfg->chroma_format_400 = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "INTERLACED_PIC", sValue) == 0) + pEncCfg->field_flag = 0; + else + pEncCfg->field_flag = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "FIELD_REFERENCE_MODE", sValue) == 0) + pEncCfg->field_ref_mode = 1; + else + pEncCfg->field_ref_mode = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "EN_ROI", sValue) == 0) + pEncCfg->coda9RoiEnable = 0; + else + pEncCfg->coda9RoiEnable = atoi(sValue) != 0; + + if (pEncCfg->coda9RoiEnable == 1) { + if (GetValue(pstrArray, array_cnt, "ROI_FILE", sValue) != 0) + snprintf(pEncCfg->RoiFile, MAX_FILE_PATH, "%s", sValue); + + if (GetValue(pstrArray, array_cnt, "ROI_PIC_AVG_QP", sValue) == 0) + pEncCfg->RoiPicAvgQp = 25; + else + pEncCfg->RoiPicAvgQp = atoi(sValue); + } + + if (GetValue(pstrArray, array_cnt, "SET_CYCLIC_PIC_NUM", sValue) == 0) + pEncCfg->set_dqp_pic_num = 1; + else + pEncCfg->set_dqp_pic_num = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "GOP_PRESET", sValue) == 0) + pEncCfg->GopPreset = 1; + else + pEncCfg->GopPreset = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "LONG_TERM_PERIOD", sValue) != 0) + pEncCfg->LongTermPeriod = atoi(sValue); + else + pEncCfg->LongTermPeriod = -1; + if (GetValue(pstrArray, array_cnt, "LONG_TERM_DELTA_QP", sValue) != 0) + pEncCfg->LongTermDeltaQp = atoi(sValue); + else + pEncCfg->LongTermDeltaQp = 0; + + if (GetValue(pstrArray, array_cnt, "VIRTUAL_I_PERIOD", sValue) != 0) + pEncCfg->VirtualIPeriod = atoi(sValue); + else + pEncCfg->VirtualIPeriod = 0; + // LongTermPeriod should be larger than 1 + if (pEncCfg->LongTermPeriod == 0) + pEncCfg->LongTermPeriod = -1; + + if (GetValue(pstrArray, array_cnt, "HVS_QP_SCALE_DIV2", sValue) == 0) + pEncCfg->HvsQpScaleDiv2 = 4; + else + pEncCfg->HvsQpScaleDiv2 = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "EN_HVS_QP", sValue) == 0) + pEncCfg->EnHvsQp = 1; + else + pEncCfg->EnHvsQp = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "EN_ROW_LEVEL_RC", sValue) == 0) + pEncCfg->EnRowLevelRc = 1; + else + pEncCfg->EnRowLevelRc = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "RC_INITIAL_QP", sValue) == 0) + pEncCfg->RcInitialQp = -1; + else + pEncCfg->RcInitialQp = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "HVS_MAX_DELTA_QP", sValue) == 0) + pEncCfg->RcHvsMaxDeltaQp = 10; + else + pEncCfg->RcHvsMaxDeltaQp = atoi(sValue); +#ifdef ROI_MB_RC + if (GetValue(pstrArray, array_cnt, "QP_MAP_MAX_DELTA_QP_PLUSE", sValue) != 0) + pEncCfg->roi_max_delta_qp_plus = atoi(sValue); + else + pEncCfg->roi_max_delta_qp_plus = 0; + + if (GetValue(pstrArray, array_cnt, "QP_MAP_MAX_DELTA_QP_MINUS", sValue) != 0) + pEncCfg->roi_max_delta_qp_minus = atoi(sValue); + else + pEncCfg->roi_max_delta_qp_minus = 0; +#endif + +#ifdef AUTO_FRM_SKIP_DROP + if (pEncCfg->RcEnable == 4) { + if (GetValue(pstrArray, array_cnt, "EN_AUTO_FRM_SKIP", sValue) != 0) + pEncCfg->enAutoFrmSkip = atoi(sValue); + else + pEncCfg->enAutoFrmSkip = 0; + + if (GetValue(pstrArray, array_cnt, "EN_AUTO_FRM_DROP", sValue) != 0) + pEncCfg->enAutoFrmDrop = atoi(sValue); + else + pEncCfg->enAutoFrmDrop = 0; + + if (GetValue(pstrArray, array_cnt, "VBV_THRESHOLD", sValue) != 0) { + pEncCfg->vbvThreshold = atoi(sValue); + if (pEncCfg->vbvThreshold > 3000) + pEncCfg->vbvThreshold = 3000; + else if (pEncCfg->vbvThreshold < 10) + pEncCfg->vbvThreshold = 10; + } else + pEncCfg->vbvThreshold = 3000; + + if (GetValue(pstrArray, array_cnt, "QP_THRESHOLD", sValue) != 0) { + pEncCfg->qpThreshold = atoi(sValue); + if (pEncCfg->qpThreshold > 51) + pEncCfg->qpThreshold = 51; + else if (pEncCfg->qpThreshold < 0) + pEncCfg->qpThreshold = 0; + } else + pEncCfg->qpThreshold = 0; + + if (GetValue(pstrArray, array_cnt, "MAX_CONTINUOUS_FRAME_SKIP_NUM", sValue) != 0) + pEncCfg->maxContinuosFrameSkipNum = atoi(sValue); + else + pEncCfg->maxContinuosFrameSkipNum = 0; + + if (GetValue(pstrArray, array_cnt, "MAX_CONTINUOUS_FRAME_DROP_NUM", sValue) != 0) + pEncCfg->maxContinuosFrameDropNum = atoi(sValue); + else + pEncCfg->maxContinuosFrameDropNum = 0; + + if (GetValue(pstrArray, array_cnt, "RC_WEIGHT_UPDATE_FACTOR", sValue) != 0) + pEncCfg->rcWeightFactor = atoi(sValue); + else + pEncCfg->rcWeightFactor = 1; + } +#endif /* AUTO_FRM_SKIP_DROP */ + + osal_memset(pEncCfg->skipPicNums, 0, sizeof(pEncCfg->skipPicNums)); + GetValues(pstrArray, array_cnt, "SKIP_PIC_NUMS", pEncCfg->skipPicNums, + sizeof(pEncCfg->skipPicNums)); + if (GetValue(pstrArray, array_cnt, "INTERVIEW_ENABLE", sValue) == 0) + pEncCfg->interviewEn = 0; + else + pEncCfg->interviewEn = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "PARASET_REFRESH_ENABLE", sValue) == 0) + pEncCfg->parasetRefreshEn = 0; + else + pEncCfg->parasetRefreshEn = atoi(sValue); + if (GetValue(pstrArray, array_cnt, "PREFIX_NAL_ENABLE", sValue) == 0) + pEncCfg->prefixNalEn = 0; + else + pEncCfg->prefixNalEn = atoi(sValue); + /** + * VUI Parameter + */ + if (GetValue(pstrArray, array_cnt, "VUI_PARAMETERS_PRESENT_FLAG", sValue) == 0) + pEncCfg->VuiPresFlag = 0; + else + pEncCfg->VuiPresFlag = atoi(sValue); + + if (pEncCfg->VuiPresFlag == 1) { + if (GetValue(pstrArray, array_cnt, "VIDEO_SIGNAL_TYPE_PRESENT_FLAG", sValue) == 0) + pEncCfg->VideoSignalTypePresFlag = 0; + else + pEncCfg->VideoSignalTypePresFlag = atoi(sValue); + + if (pEncCfg->VideoSignalTypePresFlag) { + if (GetValue(pstrArray, array_cnt, "VIDEO_FORMAT", sValue) == 0) + pEncCfg->VideoFormat = 5; + else + pEncCfg->VideoFormat = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "VIDEO_FULL_RANGE_FLAG", sValue) == 0) + pEncCfg->VideoFullRangeFlag = 0; + else + pEncCfg->VideoFullRangeFlag = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "COLOUR_DESCRIPTION_PRESENT_FLAG", + sValue) == 0) + pEncCfg->ColourDescripPresFlag = 1; + else + pEncCfg->ColourDescripPresFlag = atoi(sValue); + + if (pEncCfg->ColourDescripPresFlag) { + if (GetValue(pstrArray, array_cnt, "COLOUR_PRIMARIES", sValue) == + 0) + pEncCfg->ColourPrimaries = 1; + else + pEncCfg->ColourPrimaries = atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "TRANSFER_CHARACTERISTICS", + sValue) == 0) + pEncCfg->TransferCharacteristics = 2; + else + pEncCfg->TransferCharacteristics = + atoi(sValue); + + if (GetValue(pstrArray, array_cnt, "MATRIX_COEFFICIENTS", + sValue) == 0) + pEncCfg->MatrixCoeff = 2; + else + pEncCfg->MatrixCoeff = atoi(sValue); + } + } + } + if (GetValue(pstrArray, array_cnt, "CHANGE_PARAM_CONFIG_FILE", sValue) != 0) { + strcpy(pEncCfg->pchChangeCfgFileName, sValue); + if (GetValue(pstrArray, array_cnt, "CHANGE_PARAM_FRAME_NUM", sValue) != 0) + pEncCfg->ChangeFrameNum = atoi(sValue); + else + pEncCfg->ChangeFrameNum = 0; + } else { + /* Disable parameter change */ + strcpy(pEncCfg->pchChangeCfgFileName, ""); + pEncCfg->ChangeFrameNum = 0; + } + ret = 1; /* Success */ +__end_parseAvcCfgFile: + vfree(sRead); + return ret; +} + + +#ifdef REDUNDENT_CODE +int ParseChangeParamCfgFile(ENC_CFG *pEncCfg, char *FileName) +{ + FILE *fp; + char sValue[1024]; + + /* Initialize enable flags */ + pEncCfg->paraEnable = 0; + + fp = osal_fopen(FileName, "rt"); + if (fp == NULL) { + fprintf(stderr, "File not exist <%s>\n", FileName); + return 0; + } + + /* + Change Param Enable + [1] : GOP_NUM + [2] : RC_INTRA_QP + [3] : RC_BIT_RATE + [4] : RC_FRAME_RATE + [5] : RC_INTRA_REFRESH + */ + if (GetValue(fp, "PARAM_CHANGE_ENABLE", sValue) != 0) + pEncCfg->paraEnable = (PARA_CHANGE_ENABLE)atoi(sValue); + else + pEncCfg->paraEnable = (PARA_CHANGE_ENABLE)0; + + /* Change GOP NUM */ + if (pEncCfg->paraEnable & EN_GOP_NUM) { + if (GetValue(fp, "PARAM_CHANGE_GOP_NUM", sValue) != 0) + pEncCfg->NewGopNum = atoi(sValue); + else + pEncCfg->NewGopNum = 30; + } + /* Change Constant Intra QP */ + if (pEncCfg->paraEnable & EN_RC_INTRA_QP) { + // if (GetValue(fp, "PARAM_CHANGE_CONST_INTRAQP_EN", sValue)!=0) + // pEncCfg->NewIntraQpEn = atoi(sValue); + // else + // pEncCfg->NewIntraQpEn = 0; + if (GetValue(fp, "PARAM_CHANGE_INTRA_QP", sValue) != 0) + pEncCfg->NewIntraQp = atoi(sValue); + else + pEncCfg->NewIntraQp = 25; + } + /* Change Bitrate */ + if (pEncCfg->paraEnable & EN_RC_BIT_RATE) { + if (GetValue(fp, "PARAM_CHANGE_BIT_RATE", sValue) != 0) + pEncCfg->NewBitrate = atoi(sValue); + else + pEncCfg->NewBitrate = 0; // RC will be disabled + } + /* Change Frame Rate */ + if (pEncCfg->paraEnable & EN_RC_FRAME_RATE) { + if (GetValue(fp, "PARAM_CHANGE_FRAME_RATE", sValue) != 0) { + int frame_rate; + frame_rate = atoi(sValue); + + pEncCfg->NewFrameRate = frame_rate; + } else { + pEncCfg->NewFrameRate = 30; + } + } + /* Change Intra Refresh */ + if (pEncCfg->paraEnable & EN_INTRA_REFRESH) { + if (GetValue(fp, "PARAM_CHANGE_INTRA_REFRESH", sValue) != 0) + pEncCfg->NewIntraRefresh = atoi(sValue); + else + pEncCfg->NewIntraRefresh = 0; + } + + if (pEncCfg->paraEnable & EN_RC_MIN_MAX_QP_CHANGE) { + if (GetValue(fp, "PARAM_CHANGE_MAX_QP_I", sValue) != 0) { + pEncCfg->minMaxQpParam.maxQpI = atoi(sValue); + pEncCfg->minMaxQpParam.maxQpIEnable = 1; + } else + pEncCfg->minMaxQpParam.maxQpIEnable = 0; + + if (GetValue(fp, "PARAM_CHANGE_MIN_QP_I", sValue) != 0) { + pEncCfg->minMaxQpParam.minQpI = atoi(sValue); + pEncCfg->minMaxQpParam.minQpIEnable = 1; + } else + pEncCfg->minMaxQpParam.minQpIEnable = 0; + + if (GetValue(fp, "PARAM_CHANGE_MAX_QP_P", sValue) != 0) { + pEncCfg->minMaxQpParam.maxQpP = atoi(sValue); + pEncCfg->minMaxQpParam.maxQpPEnable = 1; + } else + pEncCfg->minMaxQpParam.maxQpPEnable = 0; + + if (GetValue(fp, "PARAM_CHANGE_MIN_QP_P", sValue) != 0) { + pEncCfg->minMaxQpParam.minQpP = atoi(sValue); + pEncCfg->minMaxQpParam.minQpPEnable = 1; + } else + pEncCfg->minMaxQpParam.minQpPEnable = 0; + } + +#if defined(RC_PIC_PARACHANGE) && defined(RC_CHANGE_PARAMETER_DEF) + if (pEncCfg->paraEnable & EN_PIC_PARA_CHANGE) { + if (GetValue(fp, "PARAM_CHANGE_MAX_DELTA_QP", sValue) != 0) { + pEncCfg->MaxDeltaQp = atoi(sValue); + pEncCfg->MaxDeltaQpSetEnable = 1; + } else { + pEncCfg->MaxDeltaQpSetEnable = 0; + pEncCfg->MaxDeltaQp = 51; + } + + if (GetValue(fp, "PARAM_CHANGE_MIN_DELTA_QP", sValue) != 0) { + pEncCfg->MinDeltaQp = atoi(sValue); + pEncCfg->MinDeltaQpSetEnable = 1; + } else { + pEncCfg->MinDeltaQp = 0; + pEncCfg->MinDeltaQpSetEnable = 0; + } + + if (GetValue(fp, "PARAM_CHANGE_INTERVAL_MODE", sValue) != 0) + pEncCfg->rcIntervalMode = atoi(sValue); + else + pEncCfg->rcIntervalMode = 0; + + if (pEncCfg->rcIntervalMode != 0 && + pEncCfg->rcIntervalMode != 3) { // support only 3 + printf("Check RC_INTERVAL_MODE: %d (we support only mode 0, 3)\n", + pEncCfg->rcIntervalMode); + return 0; + } + + if (GetValue(fp, "PARAM_CHANGE_HVS_QP_SCALE_DIV2", sValue) == 0) + pEncCfg->HvsQpScaleDiv2 = 4; + else + pEncCfg->HvsQpScaleDiv2 = atoi(sValue); + + if (GetValue(fp, "PARAM_CHANGE_EN_HVS_QP", sValue) == 0) + pEncCfg->EnHvsQp = 1; + else + pEncCfg->EnHvsQp = atoi(sValue); + + if (pEncCfg->EnHvsQp == 1 && pEncCfg->HvsQpScaleDiv2 == 0) { + printf(" HVS_QP_SCALE_DIV2 is larger than zero"); + return 0; + } + + if (GetValue(fp, "PARAM_CHANGE_ROW_LEVEL_RC", sValue) == 0) + pEncCfg->EnRowLevelRc = 1; + else + pEncCfg->EnRowLevelRc = atoi(sValue); + + if (GetValue(fp, "PARAM_CHANGE_HVS_MAX_DELTA_QP", sValue) == 0) + pEncCfg->RcHvsMaxDeltaQp = 10; + else + pEncCfg->RcHvsMaxDeltaQp = atoi(sValue); + +#ifdef AUTO_FRM_SKIP_DROP + // if (pEncCfg->RcEnable == 4) + { + if (GetValue(fp, "PARAM_CHANGE_EN_AUTO_FRM_SKIP", + sValue) != 0) + pEncCfg->enAutoFrmSkip = atoi(sValue); + else + pEncCfg->enAutoFrmSkip = 0; + + if (GetValue(fp, "PARAM_CHANGE_EN_AUTO_FRM_DROP", + sValue) != 0) + pEncCfg->enAutoFrmDrop = atoi(sValue); + else + pEncCfg->enAutoFrmDrop = 0; + + if (GetValue(fp, "PARAM_CHANGE_VBV_THRESHOLD", + sValue) != 0) { + pEncCfg->vbvThreshold = atoi(sValue); + if (pEncCfg->vbvThreshold > 3000) + pEncCfg->vbvThreshold = 3000; + else if (pEncCfg->vbvThreshold < 10) + pEncCfg->vbvThreshold = 10; + } else + pEncCfg->vbvThreshold = 3000; + + if (GetValue(fp, "PARAM_CHANGE_QP_THRESHOLD", sValue) != + 0) { + pEncCfg->qpThreshold = atoi(sValue); + if (pEncCfg->qpThreshold > 51) + pEncCfg->qpThreshold = 51; + else if (pEncCfg->qpThreshold < 0) + pEncCfg->qpThreshold = 0; + } else + pEncCfg->qpThreshold = 0; + + if (GetValue( + fp, + "PARAM_CHANGE_MAX_CONTINUOUS_FRAME_SKIP_NUM", + sValue) != 0) + pEncCfg->maxContinuosFrameSkipNum = + atoi(sValue); + else + pEncCfg->maxContinuosFrameSkipNum = 0; + + if (GetValue( + fp, + "PARAM_CHANGE_MAX_CONTINUOUS_FRAME_DROP_NUM", + sValue) != 0) + pEncCfg->maxContinuosFrameDropNum = + atoi(sValue); + else + pEncCfg->maxContinuosFrameDropNum = 0; + + if (GetValue(fp, "PARAM_CHANGE_GAMMA_SET_ENABLE", + sValue) == 0) + pEncCfg->GammaSetEnable = 0; + else + pEncCfg->GammaSetEnable = atoi(sValue); + + if (GetValue(fp, "PARAM_CHANGE_GAMMA", sValue) == 0) + pEncCfg->Gamma = 0; + else + pEncCfg->Gamma = atoi(sValue); + + if (pEncCfg->GammaSetEnable == 0) + pEncCfg->Gamma = -1; + + if (GetValue(fp, "PARAM_CHANGE_DELAY_IN_MS", sValue) == + 0) + pEncCfg->RcInitDelay = 1000; + else + pEncCfg->RcInitDelay = atoi(sValue); + + if (GetValue(fp, "PARAM_CHANGE_SET_DPQ_PIC_NUM", + sValue) == 0) + pEncCfg->set_dqp_pic_num = 0; + else + pEncCfg->set_dqp_pic_num = atoi(sValue); + + if (GetValue(fp, "PARAM_CHNAGE_GOP_I_QP_OFFSET_EN", + sValue) == 0) { + pEncCfg->RcGopIQpOffsetEn = 0; + pEncCfg->RcGopIQpOffset = 0; + } else { + pEncCfg->RcGopIQpOffsetEn = atoi(sValue); + + if (GetValue(fp, "PARAM_CHANGE_GOP_I_QP_OFFSET", + sValue) == 0) + pEncCfg->RcGopIQpOffset = 0; + else + pEncCfg->RcGopIQpOffset = atoi(sValue); + + if (pEncCfg->RcGopIQpOffset < -4) + pEncCfg->RcGopIQpOffset = -4; + else if (pEncCfg->RcGopIQpOffset > 4) + pEncCfg->RcGopIQpOffset = 4; + } + + if (pEncCfg->set_dqp_pic_num == 0) { + printf("PARAM_CHANGE_SET_DPQ_PIC_NUM must larger than 0"); + return 0; + } + if (pEncCfg->set_dqp_pic_num >= 1) { + int i; + char name[1024]; + for (i = 0; i < pEncCfg->set_dqp_pic_num; i++) { + sprintf(name, "Frame%d", i); + if (GetValue(fp, name, sValue) != 0) { + pEncCfg->dqp[i] = atoi(sValue); + } else { + printf("dqp Error"); + return 0; + } + } + } + } +#endif /* AUTO_FRM_SKIP_DROP */ + } +#endif /* (RC_PIC_PARACHANGE) && (RC_CHANGE_PARAMETER_DEF) */ + + /* Read next config for another param change, if exist */ + if (GetValue(fp, "CHANGE_PARAM_CONFIG_FILE", sValue) != 0) { + strcpy(pEncCfg->pchChangeCfgFileName, sValue); + if (GetValue(fp, "CHANGE_PARAM_FRAME_NUM", sValue) != 0) + pEncCfg->ChangeFrameNum = atoi(sValue); + else + pEncCfg->ChangeFrameNum = 0; + } else { + /* Disable parameter change */ + strcpy(pEncCfg->pchChangeCfgFileName, ""); + pEncCfg->ChangeFrameNum = 0; + } + + osal_fclose(fp); + return 1; +} +#endif +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/cnm_fpga.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/cnm_fpga.c new file mode 100644 index 0000000000..6ed5d3aa80 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/cnm_fpga.c @@ -0,0 +1,15 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/cnm_video_helper.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/cnm_video_helper.c new file mode 100644 index 0000000000..cca92e6615 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/cnm_video_helper.c @@ -0,0 +1,2769 @@ +//--=========================================================================-- +// This file is a part of QC Tool project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2004 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#include "main_helper.h" +#if FFMPEG_EN +#include +#endif +//#ifdef SUPPORT_ENCODE_CUSTOM_HEADER +#include "header_struct.h" +#include "pbu.h" +//#endif + +// include in the ffmpeg header +typedef struct { + CodStd codStd; + Uint32 mp4Class; + Uint32 codecId; + Uint32 fourcc; +} CodStdTab; + +#ifndef MKTAG +#define MKTAG(a, b, c, d) (a | (b << 8) | (c << 16) | (d << 24)) +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#endif + +#if FFMPEG_EN +static const CodStdTab codstd_tab[] = { + { STD_AVC, 0, AV_CODEC_ID_H264, MKTAG('H', '2', '6', '4') }, + { STD_AVC, 0, AV_CODEC_ID_H264, MKTAG('X', '2', '6', '4') }, + { STD_AVC, 0, AV_CODEC_ID_H264, MKTAG('A', 'V', 'C', '1') }, + { STD_AVC, 0, AV_CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('H', '2', '6', '3') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('X', '2', '6', '3') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('T', '2', '6', '3') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('L', '2', '6', '3') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('V', 'X', '1', 'K') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('Z', 'y', 'G', 'o') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('H', '2', '6', '3') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('I', '2', '6', '3') }, /* intel + h263 */ + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('H', '2', '6', '1') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('U', '2', '6', '3') }, + { STD_H263, 0, AV_CODEC_ID_H263, MKTAG('V', 'I', 'V', '1') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') }, + { STD_MPEG4, 5, AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') }, // DivX + // 4 + { STD_MPEG4, 1, AV_CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') }, + { STD_MPEG4, 2, AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, + MKTAG('M', '4', 'S', '2') }, // MPEG-4 version 2 simple profile + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG(4, 0, 0, 0) }, /* some broken + avi use this + */ + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'V') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('F', 'F', 'D', 'S') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('F', 'V', 'F', 'W') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('D', 'C', 'O', 'D') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('M', 'V', 'X', 'M') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('P', 'M', '4', 'V') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('S', 'M', 'P', '4') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('D', 'X', 'G', 'M') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('V', 'I', 'D', 'M') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'T', '3') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'X') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, + MKTAG('H', 'D', 'X', '4') }, /* flipped + video + */ + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('D', 'M', 'K', '2') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'G', 'I') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('I', 'N', 'M', 'C') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('E', 'P', 'H', 'V') }, /* Ephv + MPEG-4 + */ + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('E', 'M', '4', 'A') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'C', 'C') }, /* Divio + MPEG-4 + */ + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('S', 'N', '4', '0') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('V', 'S', 'P', 'X') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('U', 'L', 'D', 'X') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'V') }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, + MKTAG('S', 'I', 'P', 'P') }, /* Samsung + SHR-6040 + */ + { STD_DIV3, 0, AV_CODEC_ID_MSMPEG4V3, + MKTAG('D', 'I', 'V', '3') }, /* default + signature + when + using + MSMPEG4 + */ + { STD_DIV3, 0, AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') }, + { STD_DIV3, 0, AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') }, + { STD_MPEG4, 1, AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') }, + { STD_MPEG4, 1, AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') }, + { STD_MPEG4, 5, AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') }, + { STD_DIV3, 0, AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') }, + { STD_DIV3, 0, AV_CODEC_ID_MSMPEG4V3, + MKTAG('A', 'P', '4', '1') }, // Another hacked version of Microsoft's + // MP43 codec. + { STD_MPEG4, 0, AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') }, + { STD_MPEG4, 0, AV_CODEC_ID_MSMPEG4V3, + MKTAG('C', 'O', 'L', '0') }, // not support ms mpeg4 v1, 2 + { STD_MPEG4, 256, AV_CODEC_ID_FLV1, + MKTAG('F', 'L', 'V', '1') }, /* Sorenson + spark + */ + { STD_VC1, 0, AV_CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') }, + { STD_VC1, 0, AV_CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG1VIDEO, MKTAG('M', 'P', 'G', '1') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG1VIDEO, MKTAG('M', 'P', 'G', '2') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'G', '2') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG1VIDEO, MKTAG('M', 'P', '2', 'V') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG1VIDEO, MKTAG(1, 0, 0, 16) }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG2VIDEO, MKTAG(2, 0, 0, 16) }, + { STD_MPEG4, 0, AV_CODEC_ID_MPEG4, MKTAG(4, 0, 0, 16) }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG2VIDEO, + MKTAG('L', 'M', 'P', '2') }, /* Lead MPEG2 in avi */ + { STD_MPEG2, 0, AV_CODEC_ID_MPEG2VIDEO, MKTAG('S', 'L', 'I', 'F') }, + { STD_MPEG2, 0, AV_CODEC_ID_MPEG2VIDEO, MKTAG('E', 'M', '2', 'V') }, + { STD_VC1, 0, AV_CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') }, + { STD_VC1, 0, AV_CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') }, + { STD_VC1, 0, AV_CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') }, + + { STD_RV, 0, AV_CODEC_ID_RV30, MKTAG('R', 'V', '3', '0') }, + { STD_RV, 0, AV_CODEC_ID_RV40, MKTAG('R', 'V', '4', '0') }, + + { STD_AVS, 0, AV_CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') }, + { STD_AVS, 0, AV_CODEC_ID_AVS, MKTAG('A', 'V', 'S', '2') }, + { STD_VP3, 0, AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') }, + { STD_VP3, 0, AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, + { STD_THO, 0, AV_CODEC_ID_THEORA, MKTAG('T', 'H', 'E', 'O') }, + { STD_VP8, 0, AV_CODEC_ID_VP8, MKTAG('V', 'P', '8', '0') }, + { STD_VP9, 0, AV_CODEC_ID_VP9, MKTAG('V', 'P', '9', '0') }, + // { STD_VP6, 0, AV_CODEC_ID_VP6, MKTAG('V', + // 'P', '6', '0') }, { STD_VP6, 0, AV_CODEC_ID_VP6, + // MKTAG('V', 'P', '6', '1') }, { STD_VP6, 0, + // AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') }, { STD_VP6, + // 0, AV_CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') }, { + // STD_VP6, 0, AV_CODEC_ID_VP6F, MKTAG('F', + // 'L', 'V', '4') }, + { STD_HEVC, 0, AV_CODEC_ID_HEVC, MKTAG('H', 'E', 'V', 'C') }, + { STD_HEVC, 0, AV_CODEC_ID_HEVC, MKTAG('H', 'E', 'V', '1') }, + { STD_HEVC, 0, AV_CODEC_ID_HEVC, MKTAG('H', 'V', 'C', '1') }, + { STD_HEVC, 0, AV_CODEC_ID_HEVC, MKTAG('h', 'e', 'v', 'c') }, + { STD_HEVC, 0, AV_CODEC_ID_HEVC, MKTAG('h', 'e', 'v', '1') }, + { STD_HEVC, 0, AV_CODEC_ID_HEVC, MKTAG('h', 'v', 'c', '1') } +}; + +Int32 ConvFOURCCToMp4Class(Int32 fourcc) +{ + Int32 i; + Int32 mp4Class = -1; + unsigned char str[5]; + + str[0] = toupper((Int32)fourcc); + str[1] = toupper((Int32)(fourcc >> 8)); + str[2] = toupper((Int32)(fourcc >> 16)); + str[3] = toupper((Int32)(fourcc >> 24)); + str[4] = '\0'; + + for (i = 0; i < ARRAY_SIZE(codstd_tab); i++) { + if (codstd_tab[i].fourcc == + (Int32)MKTAG(str[0], str[1], str[2], str[3])) { + mp4Class = codstd_tab[i].mp4Class; + break; + } + } + + return mp4Class; +} + +Int32 ConvFOURCCToCodStd(Uint32 fourcc) +{ + Int32 codStd = -1; + Int32 i; + + char str[5]; + + str[0] = toupper((Int32)fourcc); + str[1] = toupper((Int32)(fourcc >> 8)); + str[2] = toupper((Int32)(fourcc >> 16)); + str[3] = toupper((Int32)(fourcc >> 24)); + str[4] = '\0'; + + for (i = 0; i < ARRAY_SIZE(codstd_tab); i++) { + if (codstd_tab[i].fourcc == + (Uint32)MKTAG(str[0], str[1], str[2], str[3])) { + codStd = codstd_tab[i].codStd; + break; + } + } + + return codStd; +} + +Int32 ConvCodecIdToMp4Class(Uint32 codecId) +{ + Int32 mp4Class = -1; + Int32 i; + + for (i = 0; i < ARRAY_SIZE(codstd_tab); i++) { + if (codstd_tab[i].codecId == codecId) { + mp4Class = codstd_tab[i].mp4Class; + break; + } + } + + return mp4Class; +} + +Int32 ConvCodecIdToCodStd(Int32 codecId) +{ + Int32 codStd = -1; + Int32 i; + + for (i = 0; i < ARRAY_SIZE(codstd_tab); i++) { + if (codstd_tab[i].codecId == codecId) { + codStd = codstd_tab[i].codStd; + break; + } + } + + return codStd; +} + +Int32 ConvCodecIdToFourcc(Int32 codecId) +{ + Int32 fourcc = 0; + Int32 i; + + for (i = 0; i < ARRAY_SIZE(codstd_tab); i++) { + if (codstd_tab[i].codecId == codecId) { + fourcc = codstd_tab[i].fourcc; + break; + } + } + return fourcc; +} +#endif + +//////////////////// DRAM Read/Write helper Function +/////////////////////////////// +BOOL LoadYuvImageBurstFormat(Uint32 coreIdx, Uint8 *src, size_t picWidth, + size_t picHeight, FrameBuffer *fb, + BOOL convertCbcrIntl) +{ + Int32 y = 0, nY = 0, nCb = 0, nCr = 0; + PhysicalAddress addr; + size_t lumaSize = 0, chromaSize = 0, chromaStride = 0, chromaWidth = 0; + Uint8 *puc; + size_t stride = fb->stride; + EndianMode endian = (EndianMode)fb->endian; + FrameBufferFormat format = fb->format; + BOOL interLeave = fb->cbcrInterleave; + int twice = 1 << interLeave; + + switch (format) { + case FORMAT_420: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 2; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + case FORMAT_224: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 1; + chromaStride = stride; + chromaWidth = picWidth; + break; + case FORMAT_422: + nY = picHeight; + nCb = nCr = picHeight; + chromaSize = (picWidth * picHeight) >> 1; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + case FORMAT_444: + nY = picHeight; + nCb = nCr = picHeight; + chromaSize = picWidth * picHeight; + chromaStride = stride; + chromaWidth = picWidth; + break; + case FORMAT_400: + nY = picHeight; + nCb = nCr = 0; + chromaSize = (picWidth * picHeight) >> 2; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + case FORMAT_YUYV_P10_16BIT_MSB: + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + nY = picHeight; + nCb = nCr = 0; + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 1; + chromaStride = stride >> 1; + chromaWidth = picWidth; + picWidth *= 2; + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + nY = picHeight; + nCb = nCr = picHeight >> 1; + picWidth = VPU_ALIGN32(picWidth); + chromaWidth = + ((VPU_ALIGN16((picWidth >> 1) * twice) + 2) / 3 * 4); + chromaStride = VPU_ALIGN16((stride >> 1)) * twice; + if (interLeave == 1) + chromaStride = stride; + chromaSize = (chromaWidth * picHeight) >> 1; + picWidth = ((VPU_ALIGN16(picWidth) + 2) / 3) * 4; + break; + default: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 2; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + } + + puc = src; + addr = fb->bufY; + lumaSize = picWidth * picHeight; + + if (picWidth == stride) { // for fast write + vdi_write_memory(coreIdx, addr, (Uint8 *)(puc), lumaSize, + endian); + + if (format == FORMAT_400) + return FALSE; + if (format >= FORMAT_YUYV && + format <= FORMAT_VYUY_P10_32BIT_LSB) + return FALSE; + + if (interLeave == TRUE) { + UNREFERENCED_PARAMETER(convertCbcrIntl); + puc = src + lumaSize; + addr = fb->bufCb; + vdi_write_memory(coreIdx, addr, (Uint8 *)puc, + chromaSize * 2, endian); + } else { + if (chromaWidth == chromaStride) { + puc = src + lumaSize; + addr = fb->bufCb; + vdi_write_memory(coreIdx, addr, (Uint8 *)puc, + chromaSize, endian); + + puc = src + lumaSize + chromaSize; + addr = fb->bufCr; + vdi_write_memory(coreIdx, addr, (Uint8 *)puc, + chromaSize, endian); + } else { + puc = src + lumaSize; + addr = fb->bufCb; + for (y = 0; y < nCb; ++y) { + vdi_write_memory( + coreIdx, + addr + chromaStride * y, + (Uint8 *)(puc + + y * chromaWidth), + chromaWidth, endian); + } + + puc = src + lumaSize + chromaSize; + addr = fb->bufCr; + for (y = 0; y < nCr; ++y) { + vdi_write_memory( + coreIdx, + addr + chromaStride * y, + (Uint8 *)(puc + + y * chromaWidth), + chromaWidth, endian); + } + } + } + } else { + for (y = 0; y < nY; ++y) { + vdi_write_memory(coreIdx, addr + stride * y, + (Uint8 *)(puc + y * picWidth), + picWidth, endian); + } + + if (format == FORMAT_400) { + return FALSE; + } + if (format >= FORMAT_YUYV && + format <= FORMAT_VYUY_P10_32BIT_LSB) { + return FALSE; + } + + if (interLeave == TRUE) { + UNREFERENCED_PARAMETER(convertCbcrIntl); + puc = src + lumaSize; + addr = fb->bufCb; + for (y = 0; y < nCb; ++y) { + vdi_write_memory(coreIdx, addr + stride * y, + (Uint8 *)(puc + y * picWidth), + picWidth, endian); + } + } else { + puc = src + lumaSize; + addr = fb->bufCb; + for (y = 0; y < nCb; ++y) { + vdi_write_memory( + coreIdx, addr + chromaStride * y, + (Uint8 *)(puc + y * chromaWidth), + chromaWidth, endian); + } + + puc = src + lumaSize + chromaSize; + addr = fb->bufCr; + for (y = 0; y < nCr; ++y) { + vdi_write_memory( + coreIdx, addr + chromaStride * y, + (Uint8 *)(puc + y * chromaWidth), + chromaWidth, endian); + } + } + } + + return TRUE; +} + +BOOL LoadYuvImageBurstFormat3(Uint32 coreIdx, Uint8 *srcY, Uint8 *srcCb, + Uint8 *srcCr, size_t picWidth, size_t picHeight, + FrameBuffer *fb, BOOL convertCbcrIntl) +{ + Int32 y = 0, nY = 0, nCb = 0, nCr = 0; + unsigned long addr = 0; + size_t lumaSize = 0, chromaSize = 0, chromaStride = 0, chromaWidth = 0; + Uint8 *puc; + size_t stride = fb->stride; + EndianMode endian = (EndianMode)fb->endian; + FrameBufferFormat format = fb->format; + BOOL interLeave = fb->cbcrInterleave; + int twice = 1 << interLeave; + + switch (format) { + case FORMAT_420: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 2; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + case FORMAT_224: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 1; + chromaStride = stride; + chromaWidth = picWidth; + break; + case FORMAT_422: + nY = picHeight; + nCb = nCr = picHeight; + chromaSize = (picWidth * picHeight) >> 1; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + case FORMAT_444: + nY = picHeight; + nCb = nCr = picHeight; + chromaSize = picWidth * picHeight; + chromaStride = stride; + chromaWidth = picWidth; + break; + case FORMAT_400: + nY = picHeight; + nCb = nCr = 0; + chromaSize = (picWidth * picHeight) >> 2; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + case FORMAT_YUYV_P10_16BIT_MSB: + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + nY = picHeight; + nCb = nCr = 0; + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 1; + chromaStride = stride >> 1; + chromaWidth = picWidth; + picWidth *= 2; + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + nY = picHeight; + nCb = nCr = picHeight >> 1; + picWidth = VPU_ALIGN32(picWidth); + chromaWidth = + ((VPU_ALIGN16((picWidth >> 1) * twice) + 2) / 3 * 4); + chromaStride = VPU_ALIGN16((stride >> 1)) * twice; + if (interLeave == 1) + chromaStride = stride; + chromaSize = (chromaWidth * picHeight) >> 1; + picWidth = ((VPU_ALIGN16(picWidth) + 2) / 3) * 4; + break; + default: + nY = picHeight; + nCb = nCr = picHeight >> 1; + chromaSize = (picWidth * picHeight) >> 2; + chromaStride = stride >> 1; + chromaWidth = picWidth >> 1; + break; + } + + puc = srcY; + addr = fb->bufY; + lumaSize = picWidth * picHeight; + + if (picWidth == stride) { // for fast write + vdi_write_memory(coreIdx, addr, (Uint8 *)(puc), lumaSize, + endian); + + if (format == FORMAT_400) + return FALSE; + if (format >= FORMAT_YUYV && + format <= FORMAT_VYUY_P10_32BIT_LSB) + return FALSE; + + if (interLeave == TRUE) { + UNREFERENCED_PARAMETER(convertCbcrIntl); + puc = srcCb; + addr = fb->bufCb; + vdi_write_memory(coreIdx, addr, (Uint8 *)puc, + chromaSize * 2, endian); + } else { + if (chromaWidth == chromaStride) { + puc = srcCb; + addr = fb->bufCb; + vdi_write_memory(coreIdx, addr, (Uint8 *)puc, + chromaSize, endian); + + puc = srcCr; + addr = fb->bufCr; + vdi_write_memory(coreIdx, addr, (Uint8 *)puc, + chromaSize, endian); + } else { + puc = srcCb; + addr = fb->bufCb; + for (y = 0; y < nCb; ++y) { + vdi_write_memory( + coreIdx, + addr + chromaStride * y, + (Uint8 *)(puc + + y * chromaWidth), + chromaWidth, endian); + } + + puc = srcCr; + addr = fb->bufCr; + for (y = 0; y < nCr; ++y) { + vdi_write_memory( + coreIdx, + addr + chromaStride * y, + (Uint8 *)(puc + + y * chromaWidth), + chromaWidth, endian); + } + } + } + } else { + for (y = 0; y < nY; ++y) { + vdi_write_memory(coreIdx, addr + stride * y, + (Uint8 *)(puc + y * picWidth), + picWidth, endian); + } + + if (format == FORMAT_400) { + return FALSE; + } + if (format >= FORMAT_YUYV && + format <= FORMAT_VYUY_P10_32BIT_LSB) { + return FALSE; + } + + if (interLeave == TRUE) { + UNREFERENCED_PARAMETER(convertCbcrIntl); + puc = srcCb; + addr = fb->bufCb; + for (y = 0; y < nCb; ++y) { + vdi_write_memory(coreIdx, addr + stride * y, + (Uint8 *)(puc + y * picWidth), + picWidth, endian); + } + } else { + puc = srcCb; + addr = fb->bufCb; + for (y = 0; y < nCb; ++y) { + vdi_write_memory( + coreIdx, addr + chromaStride * y, + (Uint8 *)(puc + y * chromaWidth), + chromaWidth, endian); + } + + puc = srcCr; + addr = fb->bufCr; + for (y = 0; y < nCr; ++y) { + vdi_write_memory( + coreIdx, addr + chromaStride * y, + (Uint8 *)(puc + y * chromaWidth), + chromaWidth, endian); + } + } + } + + return TRUE; +} + +BOOL LoadTiledImageYuvBurst(Uint32 coreIdx, BYTE *pYuv, size_t picWidth, + size_t picHeight, FrameBuffer *fb, + TiledMapConfig mapCfg) +{ + BYTE *pSrc; + size_t divX, divY; + size_t pix_addr; + size_t rrow, ccol; + size_t offsetX, offsetY; + size_t stride_c; + size_t stride = fb->stride; + EndianMode endian = (EndianMode)fb->endian; + FrameBufferFormat format = fb->format; + BOOL interLeave = fb->cbcrInterleave; + Int32 productId; + Int32 dramBusWidth = 8; + + productId = VPU_GetProductId(coreIdx); + if (PRODUCT_ID_W_SERIES(productId)) { + dramBusWidth = 16; + } + + offsetX = offsetY = 0; + + divX = format == FORMAT_420 || format == FORMAT_422 ? 2 : 1; + divY = format == FORMAT_420 || format == FORMAT_224 ? 2 : 1; + + switch (format) { + case FORMAT_400: + stride_c = 0; + break; + case FORMAT_420: + case FORMAT_422: + stride_c = stride >> 1; + break; + case FORMAT_224: + case FORMAT_444: + stride_c = stride; + break; + default: + stride_c = stride >> 1; + break; + } + + // Y + pSrc = pYuv; + + // no opt code + for (rrow = 0; rrow < picHeight; rrow = rrow + 1) { + for (ccol = 0; ccol < picWidth; ccol = ccol + dramBusWidth) { + pix_addr = GetXY2AXIAddr(&mapCfg, 0 /*luma*/, + rrow + offsetY, ccol + offsetX, + stride, fb); + vdi_write_memory(coreIdx, pix_addr, + pSrc + rrow * picWidth + ccol, 8, + endian); + } + } + + if (format == FORMAT_400) { + return 1; + } + + if (interLeave == FALSE) { + // CB + pSrc = pYuv + picWidth * picHeight; + + for (rrow = 0; rrow < (picHeight / divY); rrow = rrow + 1) { + for (ccol = 0; ccol < (picWidth / divX); + ccol = ccol + dramBusWidth) { + pix_addr = GetXY2AXIAddr(&mapCfg, 2, + rrow + offsetY, + ccol + offsetX, + stride_c, fb); + vdi_write_memory(coreIdx, pix_addr, + pSrc + rrow * picWidth / divX + + ccol, + 8, endian); + } + } + // CR + + pSrc = pYuv + picWidth * picHeight + + (picWidth / divX) * (picHeight / divY); + + for (rrow = 0; rrow < picHeight / divY; rrow = rrow + 1) { + for (ccol = 0; ccol < picWidth / divX; + ccol = ccol + dramBusWidth) { + pix_addr = GetXY2AXIAddr(&mapCfg, 3, + rrow + offsetY, + ccol + offsetX, + stride_c, fb); + vdi_write_memory(coreIdx, pix_addr, + pSrc + rrow * picWidth / divX + + ccol, + 8, endian); + } + } + } else { + BYTE *pTemp; + BYTE *srcAddrCb; + BYTE *srcAddrCr; + + size_t cbcr_x; + + switch (format) { + case FORMAT_444: + cbcr_x = picWidth * 2; + break; + case FORMAT_420: + cbcr_x = picWidth; + break; + case FORMAT_422: + cbcr_x = picWidth; + break; + case FORMAT_224: + cbcr_x = picWidth * 2; + break; + default: + cbcr_x = picWidth; + break; + } + + stride = stride_c * 2; + + srcAddrCb = pYuv + picWidth * picHeight; + srcAddrCr = pYuv + picWidth * picHeight + + picWidth / divX * picHeight / divY; + + pTemp = (BYTE *)osal_malloc(sizeof(char) * 8); + if (!pTemp) { + return FALSE; + } + + for (rrow = 0; rrow < picHeight / divY; rrow = rrow + 1) { + for (ccol = 0; ccol < cbcr_x; + ccol = ccol + dramBusWidth) { + pTemp[0] = *srcAddrCb++; + pTemp[0 + 2] = *srcAddrCb++; + pTemp[0 + 4] = *srcAddrCb++; + pTemp[0 + 6] = *srcAddrCb++; + pTemp[0 + 1] = *srcAddrCr++; + pTemp[0 + 3] = *srcAddrCr++; + pTemp[0 + 5] = *srcAddrCr++; + pTemp[0 + 7] = *srcAddrCr++; + + pix_addr = GetXY2AXIAddr(&mapCfg, 2, + rrow + offsetY, + ccol + (offsetX * 2), + stride, fb); + vdi_write_memory(coreIdx, pix_addr, + (unsigned char *)pTemp, 8, + endian); + } + } + osal_free(pTemp); + } + + return TRUE; +} + +static void SwapDword(unsigned char *data, int len) +{ + Uint32 temp; + Uint32 *ptr = (Uint32 *)data; + Int32 i, size = len / sizeof(Uint32); + + for (i = 0; i < size; i += 2) { + temp = ptr[i]; + ptr[i] = ptr[i + 1]; + ptr[i + 1] = temp; + } +} + +static void SwapLword(unsigned char *data, int len) +{ + Uint64 temp; + Uint64 *ptr = (Uint64 *)data; + Int32 i, size = len / sizeof(Uint64); + + for (i = 0; i < size; i += 2) { + temp = ptr[i]; + ptr[i] = ptr[i + 1]; + ptr[i + 1] = temp; + } +} + +static void SwapPixelOrder(Uint8 *data) +{ + Uint32 *temp; + Uint32 temp2[4] = { + 0, + }; + Int32 i, j; + + for (i = 0, j = 3; i < 16; i += 4, j--) { + temp = (Uint32 *)(data + i); + temp2[j] = (*temp & 0xffc00000) >> 20; + temp2[j] |= (*temp & 0x003ff000); + temp2[j] |= (*temp & 0x00000ffc) << 20; + } + + osal_memcpy(data, temp2, 16); + + // for matching with Ref-C + SwapDword(data, 16); + SwapLword(data, 16); +} + +static void StoreYuvImageBurstLinearCbCrInterleaveHelper( + Uint8 *ptrCb, Uint8 *ptrCr, + Uint8 *pTemp, Uint32 *pTempLeft32, Uint32 *pTempRight32, + BOOL nv21, FrameBufferFormat format, int interLeave, + Int32 dramBusWidth, Uint32 x, Uint32 stride, Uint32 bpp) +{ + Int32 k; + Uint32 temp_32; + + if (interLeave == TRUE) { + for (k = 0; k < dramBusWidth && + (x + k) < stride; + k += ((2 * bpp) >> 3)) { + if (bpp == 8) { + if (nv21) { + *ptrCr++ = + pTemp[k]; + *ptrCb++ = + pTemp[k + + 1]; + } else { + *ptrCb++ = + pTemp[k]; + *ptrCr++ = + pTemp[k + + 1]; + } + } else { + if (nv21) { + *ptrCr++ = + pTemp[k]; + *ptrCr++ = + pTemp[k + + 1]; + *ptrCb++ = + pTemp[k + + 2]; + *ptrCb++ = + pTemp[k + + 3]; + } else { + *ptrCb++ = + pTemp[k]; + *ptrCb++ = + pTemp[k + + 1]; + *ptrCr++ = + pTemp[k + + 2]; + *ptrCr++ = + pTemp[k + + 3]; + } + } + } + } else { + for (k = 0; k < dramBusWidth && + (x + k) < stride; + k += 8) { //(2*bpp/8)) { + pTempLeft32 = + (Uint32 *)&pTemp[k]; + pTempRight32 = + (Uint32 *)&pTemp[k + 4]; + + if (format == + FORMAT_420_P10_32BIT_MSB) { + temp_32 = *pTempLeft32 & + 0x003ff000; + *pTempLeft32 = + (*pTempLeft32 & + 0xffc00000) | + (*pTempLeft32 & + 0x00000ffc) + << 10 | + (*pTempRight32 & + 0x003ff000) >> + 10; + *pTempRight32 = + (temp_32) + << 10 | + (*pTempRight32 & + 0xffc00000) >> + 10 | + (*pTempRight32 & + 0x00000ffc); + } else if (format == + FORMAT_420_P10_32BIT_LSB) { + temp_32 = *pTempLeft32 & + 0x000ffc00; + *pTempLeft32 = + (*pTempLeft32 & + 0x000003ff) | + (*pTempLeft32 & + 0x3ff00000) >> + 10 | + (*pTempRight32 & + 0x000ffc00) + << 10; + *pTempRight32 = + (temp_32) >> + 10 | + (*pTempRight32 & + 0x000003ff) + << 10 | + (*pTempRight32 & + 0x3ff00000); + } + + if (nv21) { + *ptrCr++ = pTemp[k]; + *ptrCr++ = pTemp[k + 1]; + *ptrCr++ = pTemp[k + 2]; + *ptrCr++ = pTemp[k + 3]; + *ptrCb++ = pTemp[k + 4]; + *ptrCb++ = pTemp[k + 5]; + *ptrCb++ = pTemp[k + 6]; + *ptrCb++ = pTemp[k + 7]; + } else { + *ptrCb++ = pTemp[k]; + *ptrCb++ = pTemp[k + 1]; + *ptrCb++ = pTemp[k + 2]; + *ptrCb++ = pTemp[k + 3]; + *ptrCr++ = pTemp[k + 4]; + *ptrCr++ = pTemp[k + 5]; + *ptrCr++ = pTemp[k + 6]; + *ptrCr++ = pTemp[k + 7]; + } + } + } +} + +Uint32 StoreYuvImageBurstLinear(Uint32 coreIdx, FrameBuffer *fbSrc, + TiledMapConfig mapCfg, Uint8 *pDst, + VpuRect cropRect, BOOL enableCrop, BOOL isVP9) +{ + Uint32 y, x; + Uint32 pix_addr, div_x, div_y, chroma_stride = 0; + Uint8 *puc; + Uint8 *rowBufferY, *rowBufferCb, *rowBufferCr; + Uint32 stride = fbSrc->stride; + Uint32 height = fbSrc->height; + int interLeave = fbSrc->cbcrInterleave; + BOOL nv21 = fbSrc->nv21; + EndianMode endian = (EndianMode)fbSrc->endian; + FrameBufferFormat format = (FrameBufferFormat)fbSrc->format; + Uint32 width = 0; + Uint32 dstWidth = 0, dstHeight = 0; + Uint32 offsetX = 0, offsetY = 0; + Uint32 dstChromaHeight = 0; + Uint32 dstChromaWidth = 0; + Uint32 chromaHeight = 0; + Uint32 bpp = 8; + Uint32 p10_32bit_interleave = 0; + Int32 productId = 0; + Int32 dramBusWidth = 8; + Uint32 totSize = 0; + BOOL copyLumaOnly = FALSE; + + // Int32 addr; + Int32 baseY; + Int32 baseCb; + Int32 baseCr; + Uint8 *pY; + Uint8 *pCbTemp; + Uint8 *pCb; + Uint8 *pCr; + + productId = VPU_GetProductId(coreIdx); + if (PRODUCT_ID_W_SERIES(productId)) { + dramBusWidth = 16; + } + switch (fbSrc->format) { + case FORMAT_420: + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_422: + case FORMAT_422_P10_16BIT_LSB: + case FORMAT_422_P10_16BIT_MSB: + case FORMAT_422_P10_32BIT_LSB: + case FORMAT_422_P10_32BIT_MSB: + div_x = 2; + break; + default: + div_x = 1; + } + + switch (fbSrc->format) { + case FORMAT_420: + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_224: + div_y = 2; + break; + default: + div_y = 1; + } + + // for matching with Ref-C + width = (enableCrop == TRUE ? cropRect.right - cropRect.left : stride); + dstHeight = + (enableCrop == TRUE ? cropRect.bottom - cropRect.top : height); + offsetX = (enableCrop == TRUE ? cropRect.left : 0); + offsetY = (enableCrop == TRUE ? cropRect.top : 0); + + switch (fbSrc->format) { + case FORMAT_400: + copyLumaOnly = TRUE; + break; + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + copyLumaOnly = TRUE; + dstWidth = width * 2; + dstChromaHeight = 0; + chromaHeight = 0; + break; + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YUYV_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_16BIT_MSB: + copyLumaOnly = TRUE; + dstWidth = (width * 2) * 2; + dstChromaHeight = 0; + chromaHeight = 0; + break; + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + copyLumaOnly = TRUE; + dstWidth = ((width + 2) / 3 * 4) * 2; + dstChromaHeight = 0; + chromaHeight = 0; + break; + case FORMAT_422_P10_16BIT_LSB: + case FORMAT_422_P10_16BIT_MSB: + dstWidth = width * 2; + bpp = 16; + dstChromaWidth = dstWidth / div_x; + dstChromaHeight = dstHeight / div_y; + chromaHeight = height / div_y; + chroma_stride = (stride / div_x); + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + dstWidth = width * 2; + bpp = 16; + dstChromaWidth = dstWidth / div_x; + dstChromaHeight = dstHeight / div_y; + chromaHeight = height / div_y; + chroma_stride = (stride / div_x); + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: +#ifdef DUMP_YUV_WHOLE_DATA + if (interLeave) { + dstChromaWidth = + ((VPU_ALIGN16(width / div_x)) * 2 + 11) / 12 * + 16; + dstChromaWidth = VPU_ALIGN16(dstChromaWidth); + dstChromaHeight = dstHeight / div_y; + + stride = stride; + chroma_stride = stride; + dstWidth = (VPU_ALIGN16(width) + 11) / 12 * 16; + + interLeave = 0; + } else { + dstChromaWidth = + ((VPU_ALIGN16(width / div_x)) + 11) / 12 * 16; + dstChromaWidth = VPU_ALIGN16(dstChromaWidth); + dstChromaHeight = dstHeight / div_y; + chroma_stride = dstChromaWidth; + stride = (VPU_ALIGN16(stride) + 11) / 12 * 16; + dstWidth = (VPU_ALIGN16(dstWidth) + 11) / 12 * 16; + } + break; +#else + if (interLeave) { + dstChromaWidth = + ((VPU_ALIGN16(width * 2 / div_x)) + 11) / 12 * + 16; + dstChromaWidth = VPU_ALIGN16(dstChromaWidth); + if (isVP9 == TRUE) { + dstChromaWidth = VPU_ALIGN32(dstChromaWidth); + } + chroma_stride = stride; + + dstChromaWidth = (width / div_x + 2) / 3 * 4; + + dstChromaHeight = dstHeight / div_y; + chromaHeight = height / div_y; + + dstWidth = (width + 2) / 3 * 4; + + interLeave = 0; + p10_32bit_interleave = 1; + } else { + // dstChromaWidth = + // ((VPU_ALIGN16(width/div_x))+11)/12*16; + // dstChromaWidth = + // VPU_ALIGN16(dstChromaWidth); + // chroma_stride = dstChromaWidth; + chroma_stride = stride >> 1; + + dstChromaWidth = ((width >> 1) + 2) / 3 * 4; + + dstChromaHeight = dstHeight / div_y; + chromaHeight = height / div_y; + + dstWidth = (width + 2) / 3 * 4; + } + break; +#endif + default: + dstWidth = width; + dstChromaWidth = width / div_x; + dstChromaHeight = dstHeight / div_y; + chromaHeight = height / div_y; + chroma_stride = (stride / div_x); + break; + } + + puc = pDst; + + pY = (Uint8 *)osal_malloc(stride * height); + pCbTemp = (Uint8 *)osal_malloc(stride * 4 * chromaHeight); + pCb = (Uint8 *)osal_malloc(stride * 4 * chromaHeight); + pCr = (Uint8 *)osal_malloc(stride * 2 * chromaHeight); + baseY = fbSrc->bufY; + baseCb = fbSrc->bufCb; + baseCr = fbSrc->bufCr; + + CVI_VC_DISP("stride = %d, height = %d\n", stride, height); + vdi_read_memory(coreIdx, fbSrc->bufY, pY, stride * height, endian); + + for (y = 0; y < dstHeight; y += 1) { + pix_addr = GetXY2AXIAddr(&mapCfg, 0, y + offsetY, 0, stride, + fbSrc); + rowBufferY = pY + (pix_addr - baseY); + // CHECK POINT + for (x = 0; x < stride; x += dramBusWidth) { + if (fbSrc->format == FORMAT_420_P10_32BIT_MSB) + SwapPixelOrder(rowBufferY + x); + } + // CHECK POINT + osal_memcpy(puc + y * dstWidth, rowBufferY + offsetX, dstWidth); + totSize += dstWidth; + } + + if (copyLumaOnly == TRUE) { + osal_free(pY); + osal_free(pCb); + osal_free(pCr); + osal_free(pCbTemp); + return totSize; + } + + if (interLeave || p10_32bit_interleave) { + Int32 cbcr_per_2pix = 1; + + cbcr_per_2pix = + (format == FORMAT_224 || format == FORMAT_444) ? 2 : 1; + vdi_read_memory(coreIdx, fbSrc->bufCb, pCbTemp, + stride * cbcr_per_2pix * chromaHeight, endian); + } else { + vdi_read_memory(coreIdx, fbSrc->bufCb, pCb, + chroma_stride * chromaHeight, endian); + if ((fbSrc->format == FORMAT_420_P10_32BIT_LSB || + fbSrc->format == FORMAT_420_P10_32BIT_MSB) && + p10_32bit_interleave == 1) { + // Nothing to do + } else { + vdi_read_memory(coreIdx, fbSrc->bufCr, pCr, + chroma_stride * chromaHeight, endian); + } + } + + if (interLeave == TRUE || p10_32bit_interleave == TRUE) { + // Uint8 pTemp[16]; + Uint8 *pTemp; + Uint8 *dstAddrCb; + Uint8 *dstAddrCr; + Uint8 *ptrCb, *ptrCr; + Int32 cbcr_per_2pix = 1; + Uint32 *pTempLeft32, *pTempRight32; + + dstAddrCb = pDst + dstWidth * dstHeight; + dstAddrCr = dstAddrCb + dstChromaWidth * dstChromaHeight; + + cbcr_per_2pix = + (format == FORMAT_224 || format == FORMAT_444) ? 2 : 1; + + for (y = 0; y < dstChromaHeight; ++y) { + ptrCb = pCb; + ptrCr = pCr; + for (x = 0; x < stride * cbcr_per_2pix; + x += dramBusWidth) { + pix_addr = GetXY2AXIAddr(&mapCfg, 2, + y + (offsetY / div_y), + x, stride, fbSrc); + pTemp = pCbTemp + (pix_addr - baseCb); + // CHECK POINT + if (fbSrc->format == FORMAT_420_P10_32BIT_MSB) + SwapPixelOrder(pTemp); + // CHECK POINT + + StoreYuvImageBurstLinearCbCrInterleaveHelper( + ptrCb, ptrCr, + pTemp, pTempLeft32, pTempRight32, + nv21, format, interLeave, + dramBusWidth, x, stride, bpp); + } + osal_memcpy(dstAddrCb + y * dstChromaWidth, + pCb + offsetX / div_x, dstChromaWidth); + totSize += dstChromaWidth; + osal_memcpy(dstAddrCr + y * dstChromaWidth, + pCr + offsetX / div_x, dstChromaWidth); + totSize += dstChromaWidth; + } + } else { + puc = pDst + dstWidth * dstHeight; + + for (y = 0; y < dstChromaHeight; y += 1) { + x = 0; + pix_addr = + GetXY2AXIAddr(&mapCfg, 2, y + (offsetY / div_y), + x, chroma_stride, fbSrc); + rowBufferCb = pCb + (pix_addr - baseCb); + // CHECK POINT + for (x = 0; x < chroma_stride; x += dramBusWidth) { + if (fbSrc->format == FORMAT_420_P10_32BIT_MSB) + SwapPixelOrder(rowBufferCb + x); + } + // CHECK POINT + osal_memcpy(puc + (y * dstChromaWidth), + rowBufferCb + offsetX / div_x, + dstChromaWidth); + totSize += dstChromaWidth; + } + + puc += dstChromaWidth * dstChromaHeight; + if ((fbSrc->format == FORMAT_420_P10_32BIT_LSB || + fbSrc->format == FORMAT_420_P10_32BIT_MSB) && + p10_32bit_interleave == 1) { + } else { + for (y = 0; y < dstChromaHeight; y += 1) { + x = 0; + pix_addr = + GetXY2AXIAddr(&mapCfg, 3, + y + (offsetY / div_y), x, + chroma_stride, fbSrc); + // vdi_read_memory(coreIdx, pix_addr, + // rowBufferCr+x, dramBusWidth, endian); + rowBufferCr = pCr + (pix_addr - baseCr); + // CHECK POINT + for (x = 0; x < chroma_stride; + x += dramBusWidth) { + if (fbSrc->format == + FORMAT_420_P10_32BIT_MSB) + SwapPixelOrder(rowBufferCr + x); + } + // CHECK POINT + osal_memcpy(puc + (y * dstChromaWidth), + rowBufferCr + offsetX / div_x, + dstChromaWidth); + totSize += dstChromaWidth; + } + } + } + + osal_free(pY); + osal_free(pCb); + osal_free(pCr); + osal_free(pCbTemp); + + return totSize; +} + +static void StoreYuvImageBurstFormatCheckPoint( + FrameBuffer *fbSrc, Uint8 *ptrCb, Uint8 *ptrCr, Uint8 *pTemp, + Int32 dramBusWidth, Uint32 x, Uint32 stride, Uint32 bpp, BOOL nv21) +{ + Int32 k; + + // CHECK POINT + if (fbSrc->format == FORMAT_420_P10_32BIT_MSB) + SwapPixelOrder(pTemp); + // CHECK POINT + for (k = 0; + k < dramBusWidth && (x + k) < stride; + k += ((2 * bpp) >> 3)) { + if (bpp == 8) { + if (nv21) { + *ptrCr++ = pTemp[k]; + *ptrCb++ = pTemp[k + 1]; + } else { + *ptrCb++ = pTemp[k]; + *ptrCr++ = pTemp[k + 1]; + } + } else { + if (nv21) { + *ptrCr++ = pTemp[k]; + *ptrCr++ = pTemp[k + 1]; + *ptrCb++ = pTemp[k + 2]; + *ptrCb++ = pTemp[k + 3]; + } else { + *ptrCb++ = pTemp[k]; + *ptrCb++ = pTemp[k + 1]; + *ptrCr++ = pTemp[k + 2]; + *ptrCr++ = pTemp[k + 3]; + } + } + } +} + +Uint32 StoreYuvImageBurstFormat(Uint32 coreIdx, FrameBuffer *fbSrc, + TiledMapConfig mapCfg, Uint8 *pDst, + VpuRect cropRect, BOOL enableCrop) +{ + Uint32 y, x; + Uint32 pix_addr, div_x, div_y, chroma_stride; + Uint8 *puc; + Uint8 *rowBufferY, *rowBufferCb, *rowBufferCr; + Uint32 stride = fbSrc->stride; + Uint32 height = fbSrc->height; + int interLeave = fbSrc->cbcrInterleave; + BOOL nv21 = fbSrc->nv21; + EndianMode endian = (EndianMode)fbSrc->endian; + FrameBufferFormat format = (FrameBufferFormat)fbSrc->format; + Uint32 width; + Uint32 dstWidth, dstHeight; + Uint32 offsetX, offsetY; + Uint32 dstChromaHeight; + Uint32 dstChromaWidth; + Uint32 bpp = 8; + Uint32 p10_32bit_interleave = 0; + Int32 productId; + Int32 dramBusWidth = 8; + Uint32 totSize = 0; + + productId = VPU_GetProductId(coreIdx); + if (PRODUCT_ID_W_SERIES(productId)) { + dramBusWidth = 16; + } + switch (fbSrc->format) { + case FORMAT_420: + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_422: + case FORMAT_422_P10_16BIT_LSB: + case FORMAT_422_P10_16BIT_MSB: + case FORMAT_422_P10_32BIT_LSB: + case FORMAT_422_P10_32BIT_MSB: + div_x = 2; + break; + default: + div_x = 1; + } + + switch (fbSrc->format) { + case FORMAT_420: + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_224: + div_y = 2; + break; + default: + div_y = 1; + } + + width = (enableCrop == TRUE ? cropRect.right - cropRect.left : stride); + dstHeight = + (enableCrop == TRUE ? cropRect.bottom - cropRect.top : height); + offsetX = (enableCrop == TRUE ? cropRect.left : 0); + offsetY = (enableCrop == TRUE ? cropRect.top : 0); + + switch (fbSrc->format) { + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + dstWidth = width * 2; + bpp = 16; + dstChromaWidth = dstWidth / div_x; + dstChromaHeight = dstHeight / div_y; + chroma_stride = (stride / div_x); + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: +#ifdef DUMP_YUV_WHOLE_DATA + if (interLeave) { + dstChromaWidth = + ((VPU_ALIGN16(width / div_x)) * 2 + 11) / 12 * + 16; + dstChromaWidth = VPU_ALIGN16(dstChromaWidth); + dstChromaHeight = dstHeight / div_y; + + stride = stride; + chroma_stride = stride; + dstWidth = (VPU_ALIGN16(width) + 11) / 12 * 16; + + interLeave = 0; + } else { + dstChromaWidth = + ((VPU_ALIGN16(width / div_x)) + 11) / 12 * 16; + dstChromaWidth = VPU_ALIGN16(dstChromaWidth); + dstChromaHeight = dstHeight / div_y; + chroma_stride = dstChromaWidth; + stride = (VPU_ALIGN16(stride) + 11) / 12 * 16; + dstWidth = (VPU_ALIGN16(dstWidth) + 11) / 12 * 16; + } + break; +#else + if (interLeave) { + dstChromaWidth = + ((VPU_ALIGN16(width * 2 / div_x)) + 11) / 12 * + 16; + dstChromaWidth = VPU_ALIGN16(dstChromaWidth); + chroma_stride = stride; + + dstChromaWidth = (width + 2) / 3 * 4; + dstChromaHeight = dstHeight / div_y; + + dstWidth = (width + 2) / 3 * 4; + + interLeave = 0; + p10_32bit_interleave = 1; + } else { + dstChromaWidth = + ((VPU_ALIGN16(width / div_x)) + 11) / 12 * 16; + dstChromaWidth = VPU_ALIGN16(dstChromaWidth); + chroma_stride = dstChromaWidth; + + dstChromaWidth = ((width >> 1) + 2) / 3 * 4; + dstChromaHeight = dstHeight / div_y; + + dstWidth = (width + 2) / 3 * 4; + } + break; +#endif + case FORMAT_YUYV: + case FORMAT_YUYV_P10_16BIT_MSB: + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY: + case FORMAT_VYUY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + dstWidth = stride; + dstChromaWidth = 0; + dstChromaHeight = 0; + chroma_stride = 0; + break; + default: + dstWidth = width; + dstChromaWidth = width / div_x; + dstChromaHeight = dstHeight / div_y; + chroma_stride = (stride / div_x); + break; + } + + puc = pDst; + rowBufferY = (Uint8 *)osal_malloc(stride); + rowBufferCb = (Uint8 *)osal_malloc(stride * 4); + rowBufferCr = (Uint8 *)osal_malloc(stride * 2); + + for (y = 0; y < dstHeight; y += 1) { + for (x = 0; x < stride; x += dramBusWidth) { + pix_addr = GetXY2AXIAddr(&mapCfg, 0, y + offsetY, x, + stride, fbSrc); + vdi_read_memory(coreIdx, pix_addr, rowBufferY + x, + dramBusWidth, endian); + } + osal_memcpy(puc + y * dstWidth, rowBufferY + offsetX, dstWidth); + totSize += dstWidth; + } + + if (format == FORMAT_400) { + osal_free(rowBufferY); + osal_free(rowBufferCb); + osal_free(rowBufferCr); + return totSize; + } + + if (interLeave == TRUE) { + Uint8 pTemp[16]; + Uint8 *dstAddrCb; + Uint8 *dstAddrCr; + Uint8 *ptrCb, *ptrCr; + Int32 cbcr_per_2pix = 1; + + dstAddrCb = pDst + dstWidth * dstHeight; + dstAddrCr = dstAddrCb + dstChromaWidth * dstChromaHeight; + + cbcr_per_2pix = + (format == FORMAT_224 || format == FORMAT_444) ? 2 : 1; + + for (y = 0; y < dstChromaHeight; ++y) { + ptrCb = rowBufferCb; + ptrCr = rowBufferCr; + for (x = 0; x < stride * cbcr_per_2pix; + x += dramBusWidth) { + pix_addr = GetXY2AXIAddr(&mapCfg, 2, + y + (offsetY / div_y), + x, stride, fbSrc); + vdi_read_memory(coreIdx, pix_addr, pTemp, + dramBusWidth, endian); + + StoreYuvImageBurstFormatCheckPoint( + fbSrc, ptrCb, ptrCr, pTemp, + dramBusWidth, x, stride, bpp, nv21); + } + osal_memcpy(dstAddrCb + y * dstChromaWidth, + rowBufferCb + offsetX / div_x, + dstChromaWidth); + totSize += dstChromaWidth; + osal_memcpy(dstAddrCr + y * dstChromaWidth, + rowBufferCr + offsetX / div_x, + dstChromaWidth); + totSize += dstChromaWidth; + } + } else { + puc = pDst + dstWidth * dstHeight; + + for (y = 0; y < dstChromaHeight; y += 1) { + for (x = 0; x < chroma_stride; x += dramBusWidth) { + pix_addr = + GetXY2AXIAddr(&mapCfg, 2, + y + (offsetY / div_y), x, + chroma_stride, fbSrc); + vdi_read_memory(coreIdx, pix_addr, + rowBufferCb + x, dramBusWidth, + endian); + } + osal_memcpy(puc + (y * dstChromaWidth), + rowBufferCb + offsetX / div_x, + dstChromaWidth); + totSize += dstChromaWidth; + } + + puc += dstChromaWidth * dstChromaHeight; + if ((fbSrc->format == FORMAT_420_P10_32BIT_LSB || + fbSrc->format == FORMAT_420_P10_32BIT_MSB) && + p10_32bit_interleave == 1) { + } else { + for (y = 0; y < dstChromaHeight; y += 1) { + for (x = 0; x < chroma_stride; + x += dramBusWidth) { + pix_addr = GetXY2AXIAddr( + &mapCfg, 3, + y + (offsetY / div_y), x, + chroma_stride, fbSrc); + vdi_read_memory(coreIdx, pix_addr, + rowBufferCr + x, + dramBusWidth, endian); + } + osal_memcpy(puc + (y * dstChromaWidth), + rowBufferCr + offsetX / div_x, + dstChromaWidth); + totSize += dstChromaWidth; + } + } + } + + osal_free(rowBufferY); + osal_free(rowBufferCb); + osal_free(rowBufferCr); + + return totSize; +} + +Uint8 *GetYUVFromFrameBuffer(DecHandle decHandle, FrameBuffer *fb, + VpuRect rcFrame, Uint32 *retWidth, + Uint32 *retHeight, Uint32 *retBpp, size_t *retSize) +{ + Uint32 coreIdx = VPU_HANDLE_CORE_INDEX(decHandle); + size_t frameSizeY; // the size of luma + size_t frameSizeC; // the size of chroma + size_t frameSize; // the size of frame + Uint32 Bpp = 1; //!<< Byte per pixel + Uint32 picWidth, picHeight; + Uint8 *pYuv; + TiledMapConfig mapCfg; + + picWidth = rcFrame.right - rcFrame.left; + picHeight = rcFrame.bottom - rcFrame.top; + + CalcYuvSize(fb->format, picWidth, fb->height, fb->cbcrInterleave, + &frameSizeY, &frameSizeC, &frameSize, NULL, NULL, NULL); + + switch (fb->format) { + case FORMAT_422_P10_16BIT_MSB: + case FORMAT_422_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + Bpp = 2; + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + picWidth = (picWidth / 3) * 4 + ((picWidth % 3) ? 4 : 0); + Bpp = 1; + break; + case FORMAT_422: + case FORMAT_422_P10_32BIT_MSB: + case FORMAT_422_P10_32BIT_LSB: + break; + default: + Bpp = 1; + break; + } + { + Int32 temp_picWidth; + Int32 chromaWidth; + + switch (fb->format) { + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + temp_picWidth = VPU_ALIGN32(picWidth); + chromaWidth = + ((VPU_ALIGN16(((temp_picWidth >> 1) << 1)) + + 2) / + 3 * 4); + frameSizeY = (temp_picWidth + 2) / 3 * 4 * picHeight; + frameSizeC = ((chromaWidth * picHeight) >> 1) << 1; + frameSize = frameSizeY + frameSizeC; + break; + default: + break; + } + } + + pYuv = (Uint8 *)osal_malloc(frameSize); + if (pYuv == NULL) { + CVI_VC_ERR("Failed to allocate memory\n"); + return NULL; + } + + VPU_DecGiveCommand(decHandle, GET_TILEDMAP_CONFIG, &mapCfg); + if (fb->mapType == LINEAR_FRAME_MAP || + fb->mapType == COMPRESSED_FRAME_MAP) { + if (decHandle->codecMode == C7_VP9_DEC) { + *retSize = StoreYuvImageBurstLinear( + coreIdx, fb, mapCfg, pYuv, rcFrame, TRUE, TRUE); + } else { + *retSize = StoreYuvImageBurstLinear(coreIdx, fb, mapCfg, + pYuv, rcFrame, TRUE, + FALSE); + } + } else { + *retSize = StoreYuvImageBurstFormat(coreIdx, fb, mapCfg, pYuv, + rcFrame, TRUE); + } + + *retWidth = picWidth; + *retHeight = picHeight; + *retBpp = Bpp; + + CVI_VC_DISP("picWidth = %d, picHeight = %d\n", picWidth, picHeight); + + return pYuv; +} + +#ifdef REDUNDENT_CODE +void PrepareDecoderTest(DecHandle decHandle) +{ + UNREFERENCED_PARAMETER(decHandle); +} + +void PreparationWorkForDecTest(DecHandle handle) +{ + UNREFERENCED_PARAMETER(handle); +} + +void PreparationWorkForEncTest(EncHandle handle) +{ + UNREFERENCED_PARAMETER(handle); +} +#endif + +int ProcessEncodedBitstreamBurst(Uint32 coreIdx, osal_file_t fp, int targetAddr, + PhysicalAddress bsBufStartAddr, + PhysicalAddress bsBufEndAddr, int size, + int endian, Comparator comparator) +{ + Uint8 *buffer = 0; + int room = 0; + int file_wr_size = 0; + + buffer = (Uint8 *)osal_malloc(size); + if ((targetAddr + size) > (int)bsBufEndAddr) { + room = bsBufEndAddr - targetAddr; + vdi_read_memory(coreIdx, targetAddr, buffer, room, endian); + vdi_read_memory(coreIdx, bsBufStartAddr, buffer + room, + (size - room), endian); + } else { + vdi_read_memory(coreIdx, targetAddr, buffer, size, endian); + } +#ifdef REDUNDENT_CODE + if (comparator) { + if (Comparator_Act(comparator, buffer, size) == FALSE) { + osal_free(buffer); + return 0; + } + } +#endif + if (fp) { + file_wr_size = osal_fwrite(buffer, sizeof(Uint8), size, fp); + } + + osal_free(buffer); + + return file_wr_size; +} + +Uint32 seiEncode(CodStd format, Uint8 *pSrc, Uint32 srcLen, Uint8 *pBuffer, + Uint32 bufferSize) +{ + spp_enc_context spp; + Uint32 code; + + Uint32 put_bit_byte_size; + Uint32 i; + + const Uint32 nuh_layer_id = 0; + const Uint32 nuh_temporal_id_plus1 = 1; + + spp = spp_enc_init(pBuffer, bufferSize, 1); + + // put start code + spp_enc_put_nal_byte(spp, 1, 4); + + // put nal header + if (format == STD_AVC) { + code = AVC_NUT_SEI; + spp_enc_put_nal_byte(spp, code, 1); + } else if (format == STD_HEVC) { + code = ((SNT_PREFIX_SEI & 0x3f) << 9) | + ((nuh_layer_id & 0x3f) << 3) | + ((nuh_temporal_id_plus1 & 0x3) << 0); + spp_enc_put_nal_byte(spp, code, 2); + } + + // put payload data which include + // payload type, size, and bytes + for (i = 0; i < srcLen; i++) + spp_enc_put_bits(spp, pSrc[i], 8); + + spp_enc_put_byte_align(spp, 1); + spp_enc_flush(spp); + + put_bit_byte_size = spp_enc_get_nal_cnt(spp); + + spp_enc_deinit(spp); + return put_bit_byte_size; +} + +static int get_stop_one_bit_idx(Uint8 byte) +{ + int i; + + for (i = 0; i < 7; i++) { + if ((byte >> i) & 0x1) + break; + } + + return i; +} + +static void encodeVuiAspectRatioInfo(spp_enc_context spp, + cviVuiAspectRatio *pari) +{ + spp_enc_put_bits(spp, pari->aspect_ratio_info_present_flag ? 1 : 0, 1); + if (pari->aspect_ratio_info_present_flag) { + spp_enc_put_bits(spp, pari->aspect_ratio_idc, 8); + if (pari->aspect_ratio_idc == EXTENDED_SAR) { + spp_enc_put_bits(spp, pari->sar_width, 16); + spp_enc_put_bits(spp, pari->sar_height, 16); + } + } +} + +static void encodeVuiOverscanInfo(spp_enc_context spp, cviVuiAspectRatio *pari) +{ + spp_enc_put_bits(spp, pari->overscan_info_present_flag ? 1 : 0, 1); + if (pari->overscan_info_present_flag) { + spp_enc_put_bits(spp, pari->overscan_appropriate_flag ? 1 : 0, + 1); + } +} + +static void encodeVuiVideoSignalType(spp_enc_context spp, + cviVuiVideoSignalType *pvst) +{ + spp_enc_put_bits(spp, pvst->video_signal_type_present_flag ? 1 : 0, 1); + if (pvst->video_signal_type_present_flag) { + spp_enc_put_bits(spp, pvst->video_format, 3); + spp_enc_put_bits(spp, pvst->video_full_range_flag, 1); + spp_enc_put_bits( + spp, pvst->colour_description_present_flag ? 1 : 0, 1); + if (pvst->colour_description_present_flag) { + spp_enc_put_bits(spp, pvst->colour_primaries, 8); + spp_enc_put_bits(spp, pvst->transfer_characteristics, + 8); + spp_enc_put_bits(spp, pvst->matrix_coefficients, 8); + } + } +} + +static void encodeVuiH264TimingInfo(spp_enc_context spp, + cviVuiH264TimingInfo *pti) +{ + spp_enc_put_bits(spp, pti->timing_info_present_flag ? 1 : 0, 1); + if (pti->timing_info_present_flag) { + spp_enc_put_bits(spp, pti->num_units_in_tick, 32); + spp_enc_put_bits(spp, pti->time_scale, 32); + spp_enc_put_bits(spp, pti->fixed_frame_rate_flag, 1); + } +} + +static void encodeVuiH265TimingInfo(spp_enc_context spp, + cviVuiH265TimingInfo *pti) +{ + spp_enc_put_bits(spp, pti->timing_info_present_flag ? 1 : 0, 1); + if (pti->timing_info_present_flag) { + spp_enc_put_bits(spp, pti->num_units_in_tick, 32); + spp_enc_put_bits(spp, pti->time_scale, 32); + spp_enc_put_bits(spp, 0, + 1); // vui_poc_proportional_to_timing_flag = 0; + spp_enc_put_bits(spp, 0, + 1); // vui_hrd_parameters_present_flag = 0; + } +} + +BOOL H264SpsAddVui(cviH264Vui *pVui, void **ppBuffer, Int32 *pBufferSize) +{ + int i; + int stop_one_bit_idx = 0; + int keep_bytes = 0; + int keep_bits = 0; + + int dst_size = *pBufferSize + 64; + unsigned char *dst_buf = NULL; + unsigned char *sps = (unsigned char *)(*ppBuffer); + + spp_enc_context spp; + + if (!pVui->aspect_ratio_info.aspect_ratio_info_present_flag && + !pVui->aspect_ratio_info.overscan_info_present_flag && + !pVui->video_signal_type.video_signal_type_present_flag && + !pVui->timing_info.timing_info_present_flag) { + // none of the supported flags are present. do nothing. + return TRUE; + } + + dst_buf = osal_kmalloc(dst_size); + + // find location of vui_parameters_present_flag + // which immediately precedes the stop_one_bit + stop_one_bit_idx = get_stop_one_bit_idx(sps[*pBufferSize - 1]); + + // keep everything before vui_parameters_present_flag + if (stop_one_bit_idx == 7) { + keep_bytes = *pBufferSize - 2; + keep_bits = 7; + } else { + keep_bytes = *pBufferSize - 1; + keep_bits = 6 - stop_one_bit_idx; + } + + osal_memcpy(dst_buf, *ppBuffer, keep_bytes - 2); + + spp = spp_enc_init(dst_buf + keep_bytes - 2, + dst_size - (keep_bytes - 2), 1); + + for (i = 0; i < 2; i++) { + spp_enc_put_bits(spp, sps[keep_bytes - 2 + i], 8); + } + + for (i = 0; i < keep_bits; i++) { + int bit = (sps[keep_bytes] >> (7 - i)) & 0x1; + spp_enc_put_bits(spp, bit, 1); + } + + // vui_parameters_present_flag = 1 + spp_enc_put_bits(spp, 1, 1); + + encodeVuiAspectRatioInfo(spp, &pVui->aspect_ratio_info); + encodeVuiOverscanInfo(spp, &pVui->aspect_ratio_info); + encodeVuiVideoSignalType(spp, &pVui->video_signal_type); + + // chroma_loc_info_present_flag = 0 + spp_enc_put_bits(spp, 0, 1); + + encodeVuiH264TimingInfo(spp, &pVui->timing_info); + + // nal_hrd_parameters_present_flag = 0 + // vcl_hrd_parameters_present_flag = 0 + // pic_struct_present_flag = 0 + // bitstream_restriction_flag = 0 + spp_enc_put_bits(spp, 0, 4); + + spp_enc_put_byte_align(spp, 1); + spp_enc_flush(spp); + + // update new sps length + *pBufferSize = spp_enc_get_nal_cnt(spp) + keep_bytes - 2; + spp_enc_deinit(spp); + + // replace sps + osal_kfree(*ppBuffer); + *ppBuffer = dst_buf; + + return TRUE; +} + +BOOL H265SpsAddVui(cviH265Vui *pVui, void **ppBuffer, Int32 *pBufferSize) +{ + int i; + int stop_one_bit_idx = 0; + int keep_bytes = 0; + int keep_bits = 0; + int dst_size = *pBufferSize + 64; + unsigned char *dst_buf = NULL; + unsigned char *sps = (unsigned char *)(*ppBuffer); + + spp_enc_context spp; + + if (!pVui->aspect_ratio_info.aspect_ratio_info_present_flag && + !pVui->aspect_ratio_info.overscan_info_present_flag && + !pVui->video_signal_type.video_signal_type_present_flag && + !pVui->timing_info.timing_info_present_flag) { + // none of the supported flags are present. do nothing. + return TRUE; + } + + dst_buf = osal_kmalloc(dst_size); + + // find location of vui_parameters_present_flag + // which is 2 bits ahead of the stop_one_bit + stop_one_bit_idx = get_stop_one_bit_idx(sps[*pBufferSize - 1]); + + // keep everything before vui_parameters_present_flag + if (stop_one_bit_idx == 7) { + keep_bytes = *pBufferSize - 2; + keep_bits = 6; + } else if (stop_one_bit_idx == 6) { + keep_bytes = *pBufferSize - 2; + keep_bits = 7; + } else { + keep_bytes = *pBufferSize - 1; + keep_bits = 5 - stop_one_bit_idx; + } + + osal_memcpy(dst_buf, *ppBuffer, keep_bytes - 2); + + spp = spp_enc_init(dst_buf + keep_bytes - 2, + dst_size - (keep_bytes - 2), 1); + + for (i = 0; i < 2; i++) { + spp_enc_put_bits(spp, sps[keep_bytes - 2 + i], 8); + } + + for (i = 0; i < keep_bits; i++) { + int bit = (sps[keep_bytes] >> (7 - i)) & 0x1; + spp_enc_put_bits(spp, bit, 1); + } + + // vui_parameters_present_flag = 1 + spp_enc_put_bits(spp, 1, 1); + + encodeVuiAspectRatioInfo(spp, &pVui->aspect_ratio_info); + encodeVuiOverscanInfo(spp, &pVui->aspect_ratio_info); + encodeVuiVideoSignalType(spp, &pVui->video_signal_type); + + // chroma_loc_info_present_flag = 0 + // neutral_chroma_indication_flag = 0 + // field_seq_flag = 0 + // frame_field_info_present_flag = 0 + // default_display_window_flag = 0 + spp_enc_put_bits(spp, 0, 5); + + encodeVuiH265TimingInfo(spp, &pVui->timing_info); + + // bitstream_restriction_flag = 0 + // sps_extension_present_flag = 0 + spp_enc_put_bits(spp, 0, 2); + + spp_enc_put_byte_align(spp, 1); + spp_enc_flush(spp); + + // update new sps length + *pBufferSize = spp_enc_get_nal_cnt(spp) + keep_bytes - 2; + spp_enc_deinit(spp); + + // replace sps + osal_kfree(*ppBuffer); + *ppBuffer = dst_buf; + + return TRUE; +} + +#ifdef SUPPORT_ENCODE_CUSTOM_HEADER +Uint32 activeParameterSEIEncode(sei_active_parameter_t *sap, hrd_t *hrd, + Uint8 *pBuffer, Uint32 bufferSize) +{ + spp_enc_context spp; + Uint32 code; + const Uint32 layer_id = 0; + const Uint32 temporal_id_plus_one = 1; + const Uint32 payload_type = (Uint32)ACTIVE_PARAMETER_SETS; + + Uint32 put_bit_byte_size; + Uint32 payload_bit_size; + Uint32 payload_byte_size; + int i; + + UNREFERENCED_PARAMETER(hrd); + payload_bit_size = 0; + payload_byte_size = 0; + + spp = spp_enc_init(pBuffer, bufferSize, 1); + + // put start code + spp_enc_put_nal_byte(spp, 1, 4); + + // put nal header + code = (SNT_PREFIX_SEI << 9) | (layer_id << 3) | temporal_id_plus_one; + spp_enc_put_nal_byte(spp, code, 2); + + // put payload type + spp_enc_put_nal_byte(spp, payload_type, 1); + + // put payload size + payload_bit_size = 4 /*active_video_parameter_set_id*/ + + 1 /*self_contained_cvs_flag*/ + + 1 /*no_parameter_set_update_flag*/; + payload_bit_size += spp_enc_get_ue_bit_size(sap->num_sps_ids_minus1); + for (i = 0; i <= (int)sap->num_sps_ids_minus1; i++) + payload_bit_size += spp_enc_get_ue_bit_size( + sap->active_seq_parameter_set_id[i]); + + payload_byte_size = ((payload_bit_size + 7) >> 3); + spp_enc_put_nal_byte(spp, payload_byte_size, 1); + + spp_enc_put_bits(spp, sap->active_video_parameter_set_id, 4); + spp_enc_put_bits(spp, sap->self_contained_cvs_flag, 1); + spp_enc_put_bits(spp, sap->no_parameter_set_update_flag, 1); + spp_enc_put_ue(spp, sap->num_sps_ids_minus1); + for (i = 0; i <= (int)sap->num_sps_ids_minus1; i++) { + spp_enc_put_ue(spp, sap->active_seq_parameter_set_id[i]); + } + + if (payload_bit_size & 7) { + spp_enc_put_bits(spp, 1 /*payload_bit_equal_to_one*/, 1); + spp_enc_put_bits(spp, 0 /*payload_bit_equal_to_zero*/, + (8 - (payload_bit_size & 7) - 1)); + } + spp_enc_put_byte_align(spp, 1); + spp_enc_flush(spp); + + put_bit_byte_size = spp_enc_get_nal_cnt(spp); + + spp_enc_deinit(spp); + return put_bit_byte_size; +} +Uint32 picTimingSEIEncode(sei_pic_timing_t *spt, hrd_t *hrd, Uint8 *pBuffer, + Uint32 bufferSize) +{ + spp_enc_context spp; + Uint32 code; + const Uint32 layer_id = 0; + const Uint32 temporal_id_plus_one = 1; + const Uint32 payload_type = (Uint32)PICTURE_TIMING; + + Uint32 put_bit_byte_size; + Uint32 payload_bit_size; + Uint32 payload_byte_size; + int i; + + payload_bit_size = 0; + payload_byte_size = 0; + + if (hrd->nal_hrd_parameters_present_flag || + hrd->vcl_hrd_parameters_present_flag) + spt->CpbDpbDelaysPresentFlag = 1; + + spp = spp_enc_init(pBuffer, bufferSize, 1); + + // put start code + spp_enc_put_nal_byte(spp, 1, 4); + + // put nal header + code = (SNT_PREFIX_SEI << 9) | (layer_id << 3) | temporal_id_plus_one; + spp_enc_put_nal_byte(spp, code, 2); + + // put payload type + spp_enc_put_nal_byte(spp, payload_type, 1); + + // put payload size + payload_bit_size = 4 /*pic_struct*/ + 2 /*source_scan_type*/ + + 1 /*duplicate_flag*/; + + if (spt->CpbDpbDelaysPresentFlag) { + payload_bit_size += (hrd->au_cpb_removal_delay_length_minus1 + + 1); // spt->au_cpb_removal_delay_minus1 + payload_bit_size += (hrd->dpb_output_delay_length_minus1 + + 1); // spt->pic_dpb_output_delay + if (hrd->sub_pic_hrd_params_present_flag) + payload_bit_size += + (hrd->dpb_output_delay_du_length_minus1 + + 1); // spt->pic_dpb_output_du_delay + if (hrd->sub_pic_hrd_params_present_flag && + hrd->sub_pic_cpb_params_in_pic_timing_sei_flag) { + payload_bit_size += spp_enc_get_ue_bit_size( + spt->num_decoding_units_minus1); // spt->num_decoding_units_minus1 + payload_bit_size += + 1; // spt->du_common_cpb_removal_delay_flag + if (spt->du_common_cpb_removal_delay_flag) + payload_bit_size += + (hrd->du_cpb_removal_delay_increment_length_minus1 + + 1); // spt->du_common_cpb_removal_delay_increment_minus1 + for (i = 0; i <= (int)spt->num_decoding_units_minus1; + i++) { + payload_bit_size += spp_enc_get_ue_bit_size( + spt->num_nalus_in_du_minus1 + [i]); // spt->num_nalus_in_du_minus1[i] + if (!spt->du_common_cpb_removal_delay_flag && + i < (int)spt->num_decoding_units_minus1) { + payload_bit_size += + (hrd->du_cpb_removal_delay_increment_length_minus1 + + 1); // spt->du_cpb_removal_delay_increment_minus1[i] + } + } + } + } + + payload_byte_size = ((payload_bit_size + 7) >> 3); + spp_enc_put_nal_byte(spp, payload_byte_size, 1); + + spp_enc_put_bits(spp, spt->pic_struct, 4); + spp_enc_put_bits(spp, spt->source_scan_type, 2); + spp_enc_put_bits(spp, spt->duplicate_flag, 1); + + if (spt->CpbDpbDelaysPresentFlag) { + spp_enc_put_bits(spp, spt->au_cpb_removal_delay_minus1, + (hrd->au_cpb_removal_delay_length_minus1 + 1)); + spp_enc_put_bits(spp, spt->pic_dpb_output_delay, + (hrd->dpb_output_delay_length_minus1 + 1)); + if (hrd->sub_pic_hrd_params_present_flag) + spp_enc_put_bits( + spp, spt->pic_dpb_output_du_delay, + (hrd->dpb_output_delay_du_length_minus1 + 1)); + if (hrd->sub_pic_hrd_params_present_flag && + hrd->sub_pic_cpb_params_in_pic_timing_sei_flag) { + spp_enc_put_ue(spp, spt->num_decoding_units_minus1); + spp_enc_put_bits( + spp, spt->du_common_cpb_removal_delay_flag, 1); + if (spt->du_common_cpb_removal_delay_flag) + spp_enc_put_bits( + spp, + spt->du_common_cpb_removal_delay_increment_minus1, + (hrd->du_cpb_removal_delay_increment_length_minus1 + + 1)); + for (i = 0; i <= (int)spt->num_decoding_units_minus1; + i++) { + spp_enc_put_ue(spp, + spt->num_nalus_in_du_minus1[i]); + if (!spt->du_common_cpb_removal_delay_flag && + i < (int)spt->num_decoding_units_minus1) { + spp_enc_put_bits( + spp, + spt->du_cpb_removal_delay_increment_minus1 + [i], + (hrd->du_cpb_removal_delay_increment_length_minus1 + + 1)); + } + } + } + } + if (payload_bit_size & 7) { + spp_enc_put_bits(spp, 1 /*payload_bit_equal_to_one*/, 1); + spp_enc_put_bits(spp, 0 /*payload_bit_equal_to_zero*/, + (8 - (payload_bit_size & 7) - 1)); + } + + spp_enc_put_byte_align(spp, 1); + spp_enc_flush(spp); + + put_bit_byte_size = spp_enc_get_nal_cnt(spp); + + spp_enc_deinit(spp); + return put_bit_byte_size; +} + +Uint32 bufferingPeriodSeiEncode(sei_buffering_period_t *sbp, hrd_t *hrd, + Uint8 *pBuffer, Uint32 bufferSize) +{ + spp_enc_context spp; + Uint32 code; + const Uint32 layer_id = 0; + const Uint32 temporal_id_plus_one = 1; + const Uint32 payload_type = (Uint32)BUFFERING_PERIOD; + int i; + Uint32 put_bit_byte_size; + Uint32 payload_bit_size; + Uint32 payload_byte_size; + + payload_bit_size = 0; + payload_byte_size = 0; + + sbp->sub_pic_hrd_params_present_flag = + hrd->sub_pic_hrd_params_present_flag; + sbp->au_cpb_removal_delay_length_minus1 = + hrd->au_cpb_removal_delay_length_minus1; + sbp->initial_cpb_removal_delay_length_minus1 = + hrd->initial_cpb_removal_delay_length_minus1; + sbp->CpbCnt = hrd->cpb_cnt_minus1[0] + 1; + sbp->NalHrdBpPresentFlag = hrd->nal_hrd_parameters_present_flag; + sbp->VclHrdBpPresentFlag = hrd->vcl_hrd_parameters_present_flag; + + payload_bit_size += + spp_enc_get_ue_bit_size(sbp->bp_seq_parameter_set_id); + if (!sbp->sub_pic_hrd_params_present_flag) + payload_bit_size += 1; // irap_cpb_params_present_flag + if (sbp->irap_cpb_params_present_flag) { + payload_bit_size += (sbp->au_cpb_removal_delay_length_minus1 + + 1); // cpb_delay_offset + payload_bit_size += (sbp->au_cpb_removal_delay_length_minus1 + + 1); // dpb_delay_offset + } + payload_bit_size += 1; // concatenation_flag + payload_bit_size += (sbp->au_cpb_removal_delay_length_minus1 + + 1); // au_cpb_removal_delay_delta_minus1 + if (sbp->NalHrdBpPresentFlag) { + for (i = 0; i < (int)sbp->CpbCnt; i++) { + payload_bit_size += + (sbp->initial_cpb_removal_delay_length_minus1 + + 1); // nal_initial_cpb_removal_delay + payload_bit_size += + (sbp->initial_cpb_removal_delay_length_minus1 + + 1); // nal_initial_cpb_removal_offset + + if (sbp->sub_pic_hrd_params_present_flag || + sbp->irap_cpb_params_present_flag) { + payload_bit_size += + (sbp->initial_cpb_removal_delay_length_minus1 + + 1); // nal_initial_alt_cpb_removal_delay + payload_bit_size += + (sbp->initial_cpb_removal_delay_length_minus1 + + 1); // nal_initial_alt_cpb_removal_offset + } + } + } + if (sbp->VclHrdBpPresentFlag) { + for (i = 0; i < (int)sbp->CpbCnt; i++) { + payload_bit_size += + (sbp->initial_cpb_removal_delay_length_minus1 + + 1); // vcl_initial_cpb_removal_delay + payload_bit_size += + (sbp->initial_cpb_removal_delay_length_minus1 + + 1); // vcl_initial_cpb_removal_offset + + if (sbp->sub_pic_hrd_params_present_flag || + sbp->irap_cpb_params_present_flag) { + payload_bit_size += + (sbp->initial_cpb_removal_delay_length_minus1 + + 1); // vcl_initial_alt_cpb_removal_delay + payload_bit_size += + (sbp->initial_cpb_removal_delay_length_minus1 + + 1); // vcl_initial_alt_cpb_removal_offset + } + } + } + + spp = spp_enc_init(pBuffer, bufferSize, 1); + + // put start code + spp_enc_put_nal_byte(spp, 1, 4); + + // put nal header + code = (SNT_PREFIX_SEI << 9) | (layer_id << 3) | temporal_id_plus_one; + spp_enc_put_nal_byte(spp, code, 2); + + // put payload type + spp_enc_put_nal_byte(spp, payload_type, 1); + + // put payload size + payload_byte_size = ((payload_bit_size + 7) >> 3); + spp_enc_put_nal_byte(spp, payload_byte_size, 1); + + // put buffering period + spp_enc_put_ue(spp, sbp->bp_seq_parameter_set_id); + if (!sbp->sub_pic_hrd_params_present_flag) + spp_enc_put_bits(spp, sbp->irap_cpb_params_present_flag, 1); + if (sbp->irap_cpb_params_present_flag) { + spp_enc_put_bits(spp, sbp->dpb_delay_offset, + (sbp->au_cpb_removal_delay_length_minus1 + 1)); + spp_enc_put_bits(spp, sbp->dpb_delay_offset, + (sbp->au_cpb_removal_delay_length_minus1 + 1)); + } + spp_enc_put_bits(spp, sbp->concatenation_flag, 1); + spp_enc_put_bits(spp, sbp->au_cpb_removal_delay_delta_minus1, + (sbp->au_cpb_removal_delay_length_minus1 + 1)); + if (sbp->NalHrdBpPresentFlag) { + for (i = 0; i < (int)sbp->CpbCnt; i++) { + spp_enc_put_bits( + spp, sbp->nal_initial_cpb_removal_delay[i], + (sbp->initial_cpb_removal_delay_length_minus1 + + 1)); + spp_enc_put_bits( + spp, sbp->nal_initial_cpb_removal_offset[i], + (sbp->initial_cpb_removal_delay_length_minus1 + + 1)); + if (sbp->sub_pic_hrd_params_present_flag || + sbp->irap_cpb_params_present_flag) { + spp_enc_put_bits( + spp, + sbp->nal_initial_alt_cpb_removal_delay[i], + (sbp->initial_cpb_removal_delay_length_minus1 + + 1)); + spp_enc_put_bits( + spp, + sbp->nal_initial_alt_cpb_removal_offset + [i], + (sbp->initial_cpb_removal_delay_length_minus1 + + 1)); + } + } + } + if (sbp->VclHrdBpPresentFlag) { + for (i = 0; i < (int)sbp->CpbCnt; i++) { + spp_enc_put_bits( + spp, sbp->vcl_initial_cpb_removal_delay[i], + (sbp->initial_cpb_removal_delay_length_minus1 + + 1)); + spp_enc_put_bits( + spp, sbp->vcl_initial_cpb_removal_offset[i], + (sbp->initial_cpb_removal_delay_length_minus1 + + 1)); + if (sbp->sub_pic_hrd_params_present_flag || + sbp->irap_cpb_params_present_flag) { + spp_enc_put_bits( + spp, + sbp->vcl_initial_alt_cpb_removal_delay[i], + (sbp->initial_cpb_removal_delay_length_minus1 + + 1)); + spp_enc_put_bits( + spp, + sbp->vcl_initial_alt_cpb_removal_offset + [i], + (sbp->initial_cpb_removal_delay_length_minus1 + + 1)); + } + } + } + + if (payload_bit_size & 7) { + spp_enc_put_bits(spp, 1 /*payload_bit_equal_to_one*/, 1); + spp_enc_put_bits(spp, 0 /*payload_bit_equal_to_zero*/, + (8 - (payload_bit_size & 7) - 1)); + } + + spp_enc_put_byte_align(spp, 1); + spp_enc_flush(spp); + + put_bit_byte_size = spp_enc_get_nal_cnt(spp); + + spp_enc_deinit(spp); + + return put_bit_byte_size; +} + +Uint32 EncodePrefixSEI(sei_active_parameter_t *sap, sei_pic_timing_t *spt, + sei_buffering_period_t *sbp, hrd_t *hrd, Uint8 *pBuffer, + Uint32 bufferSize) +{ + Uint8 *ptrBuffer; + Uint32 byteSize; + + byteSize = 0; + + ptrBuffer = (Uint8 *)(pBuffer + byteSize); + byteSize += activeParameterSEIEncode(sap, hrd, ptrBuffer, bufferSize); + + ptrBuffer = (Uint8 *)(pBuffer + byteSize); + byteSize += picTimingSEIEncode(spt, hrd, ptrBuffer, bufferSize); + + ptrBuffer = (Uint8 *)(pBuffer + byteSize); + byteSize += bufferingPeriodSeiEncode(sbp, hrd, ptrBuffer, bufferSize); + + return byteSize; +} + +// calculate scale value of bitrate and initial delay +int calcScale(int x) +{ + Uint32 iMask = 0xffffffff; + int scaleValue = 32; + + if (x == 0) { + return 0; + } + + while ((x & iMask) != 0) { + scaleValue--; + iMask = (iMask >> 1); + } + + return scaleValue; +} + +static void hrdEncode(spp_enc_context spp, hrd_t *hrd) +{ + Uint32 layer; + Uint32 cpb; + + hrd->commonInfPresentFlag = 1; + // the other parameters can be configured according to the target + // application. + if (hrd->commonInfPresentFlag) { + spp_enc_put_bits(spp, hrd->nal_hrd_parameters_present_flag, 1); + spp_enc_put_bits(spp, hrd->vcl_hrd_parameters_present_flag, 1); + + if (hrd->nal_hrd_parameters_present_flag || + hrd->vcl_hrd_parameters_present_flag) { + spp_enc_put_bits( + spp, hrd->sub_pic_hrd_params_present_flag, 1); + if (hrd->sub_pic_hrd_params_present_flag) { + spp_enc_put_bits(spp, hrd->tick_divisor_minus2, + 8); + spp_enc_put_bits( + spp, + hrd->du_cpb_removal_delay_increment_length_minus1, + 5); + spp_enc_put_bits( + spp, + hrd->sub_pic_cpb_params_in_pic_timing_sei_flag, + 1); + spp_enc_put_bits( + spp, + hrd->dpb_output_delay_du_length_minus1, + 5); + } + + spp_enc_put_bits(spp, hrd->bit_rate_scale, 4); + + spp_enc_put_bits(spp, hrd->cpb_size_scale, 4); + + if (hrd->sub_pic_hrd_params_present_flag) { + spp_enc_put_bits(spp, hrd->cpb_size_du_scale, + 4); + } + + spp_enc_put_bits( + spp, + hrd->initial_cpb_removal_delay_length_minus1, + 5); + spp_enc_put_bits( + spp, hrd->au_cpb_removal_delay_length_minus1, + 5); + spp_enc_put_bits( + spp, hrd->dpb_output_delay_length_minus1, 5); + } + } + + for (layer = 0; layer <= (Uint32)hrd->vps_max_sub_layers_minus1; + layer++) { + spp_enc_put_bits(spp, hrd->fixed_pic_rate_general_flag[layer], + 1); + + if (!hrd->fixed_pic_rate_general_flag[layer]) + spp_enc_put_bits( + spp, hrd->fixed_pic_rate_within_cvs_flag[layer], + 1); + + if (hrd->fixed_pic_rate_within_cvs_flag[layer]) + spp_enc_put_ue( + spp, + hrd->elemental_duration_in_tc_minus1[layer]); + else + spp_enc_put_bits(spp, hrd->low_delay_hrd_flag[layer], + 1); + + if (!hrd->low_delay_hrd_flag[layer]) + spp_enc_put_ue(spp, hrd->cpb_cnt_minus1[layer]); + + if (hrd->nal_hrd_parameters_present_flag) { + for (cpb = 0; cpb <= (Uint32)hrd->cpb_cnt_minus1[layer]; + cpb++) { + spp_enc_put_ue( + spp, + hrd->bit_rate_value_minus1[cpb][layer]); + + spp_enc_put_ue( + spp, + hrd->cpb_size_value_minus1[cpb][layer]); + + if (hrd->sub_pic_hrd_params_present_flag) { + spp_enc_put_ue( + spp, + hrd->cpb_size_du_value_minus1 + [cpb][layer]); + + spp_enc_put_ue( + spp, + hrd->bit_rate_du_value_minus1 + [cpb][layer]); + } + spp_enc_put_bits(spp, hrd->cbr_flag[cpb][layer], + 1); + } + } + + if (hrd->vcl_hrd_parameters_present_flag) { + for (cpb = 0; cpb <= (Uint32)hrd->cpb_cnt_minus1[layer]; + cpb++) { + spp_enc_put_ue( + spp, + hrd->bit_rate_value_minus1[cpb][layer]); + + spp_enc_put_ue( + spp, + hrd->cpb_size_value_minus1[cpb][layer]); + + if (hrd->sub_pic_hrd_params_present_flag) { + spp_enc_put_ue( + spp, + hrd->cpb_size_du_value_minus1 + [cpb][layer]); + + spp_enc_put_ue( + spp, + hrd->bit_rate_du_value_minus1 + [cpb][layer]); + } + spp_enc_put_bits(spp, hrd->cbr_flag[cpb][layer], + 1); + } + } + } +} + +BOOL EncodeVUI(hrd_t *hrd, vui_t *vui, Uint8 *pBuffer, Uint32 bufferSize, + Uint32 *pByteSize, Uint32 *pBitSize, double dframeRate) +{ + spp_enc_context spp; + Uint32 put_bit_byte_size; + Uint32 put_bit_bit_size; + + UNREFERENCED_PARAMETER(dframeRate); + // the other parameters can be configured according to the target + // application. + + spp = spp_enc_init(pBuffer, bufferSize, 0); + + spp_enc_put_bits(spp, vui->aspect_ratio_info_present_flag, 1); + if (vui->aspect_ratio_info_present_flag) { + spp_enc_put_bits(spp, vui->aspect_ratio_idc, 8); + + if (vui->aspect_ratio_idc == EXTENDED_SAR) { + spp_enc_put_bits(spp, vui->sar_width, 16); + spp_enc_put_bits(spp, vui->sar_height, 16); + } + } + + spp_enc_put_bits(spp, vui->overscan_info_present_flag, 1); + if (vui->overscan_info_present_flag) { + spp_enc_put_bits(spp, vui->overscan_appropriate_flag, 1); + } + + spp_enc_put_bits(spp, vui->video_signal_type_present_flag, 1); + if (vui->video_signal_type_present_flag) { + spp_enc_put_bits(spp, vui->video_format, 3); + spp_enc_put_bits(spp, vui->video_full_range_flag, 1); + spp_enc_put_bits(spp, vui->colour_description_present_flag, 1); + + if (vui->colour_description_present_flag) { + spp_enc_put_bits(spp, vui->colour_primaries, 8); + spp_enc_put_bits(spp, vui->transfer_characteristics, 1); + spp_enc_put_bits(spp, vui->matrix_coeffs, 1); + } + } + + spp_enc_put_bits(spp, vui->chroma_loc_info_present_flag, 1); + if (vui->chroma_loc_info_present_flag) { + spp_enc_put_ue(spp, vui->chroma_sample_loc_type_top_field); + spp_enc_put_ue(spp, vui->chroma_sample_loc_type_bottom_field); + } + + spp_enc_put_bits(spp, vui->neutral_chroma_indication_flag, 1); + spp_enc_put_bits(spp, vui->field_seq_flag, 1); + spp_enc_put_bits(spp, vui->frame_field_info_present_flag, 1); + spp_enc_put_bits(spp, vui->default_display_window_flag, 1); + if (vui->default_display_window_flag) { + spp_enc_put_ue(spp, vui->def_disp_win_left_offset); + spp_enc_put_ue(spp, vui->def_disp_win_right_offset); + spp_enc_put_ue(spp, vui->def_disp_win_top_offset); + spp_enc_put_ue(spp, vui->def_disp_win_bottom_offset); + } + spp_enc_put_bits(spp, vui->vui_timing_info_present_flag, 1); + if (vui->vui_timing_info_present_flag) { + spp_enc_put_bits(spp, vui->vui_num_units_in_tick, 32); + spp_enc_put_bits(spp, vui->vui_time_scale, 32); + spp_enc_put_bits(spp, vui->vui_poc_proportional_to_timing_flag, + 1); + if (vui->vui_poc_proportional_to_timing_flag) { + spp_enc_put_ue(spp, + vui->vui_num_ticks_poc_diff_one_minus1); + } + + spp_enc_put_bits(spp, vui->vui_hrd_parameters_present_flag, 1); + if (vui->vui_hrd_parameters_present_flag) + hrdEncode(spp, hrd); + } + + spp_enc_put_bits(spp, vui->bitstream_restriction_flag, 1); + if (vui->bitstream_restriction_flag) { + spp_enc_put_bits(spp, vui->tiles_fixed_structure_flag, 1); + spp_enc_put_bits( + spp, vui->motion_vectors_over_pic_boundaries_flag, 1); + spp_enc_put_bits(spp, vui->restricted_ref_pic_lists_flag, 1); + spp_enc_put_ue(spp, vui->min_spatial_segmentation_idc); + spp_enc_put_ue(spp, vui->max_bytes_per_pic_denom); + spp_enc_put_ue(spp, vui->max_bits_per_min_cu_denom); + spp_enc_put_ue(spp, vui->log2_max_mv_length_horizontal); + spp_enc_put_ue(spp, vui->log2_max_mv_length_vertical); + } + + spp_enc_flush(spp); + + put_bit_byte_size = spp_enc_get_nal_cnt(spp); + put_bit_bit_size = spp_enc_get_rbsp_bit(spp); + + if (pByteSize) + *pByteSize = put_bit_byte_size; + + if (pBitSize) + *pBitSize = put_bit_bit_size; + + spp_enc_deinit(spp); + return 1; +} + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/container.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/container.c new file mode 100644 index 0000000000..abbe0a8494 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/container.c @@ -0,0 +1,282 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include + +#include "main_helper.h" + +/* make container */ +#if 0 // def SUPPORT_FFMPEG_DEMUX +#include +#include + +/* add a video output stream */ +static AVStream *add_stream(AVFormatContext *oc, int codec_id, + EncConfigParam encConfig, int gopSize) +{ + AVCodecContext *c; + AVStream *st; + + st = avformat_new_stream(oc, 0); + if (!st) { + VLOG(ERR, "Could not alloc stream\n"); + return 0; + } + st->id = oc->nb_streams - 1; + c = st->codec; + c->codec_id = codec_id; + c->codec_type = AVMEDIA_TYPE_VIDEO; + + /* put sample parameters */ + c->bit_rate = encConfig.kbps * 1000; + /* resolution must be a multiple of two */ + c->width = (encConfig.rotAngle == 90 || encConfig.rotAngle == 270) ? + encConfig.picHeight : + encConfig.picWidth; + c->height = (encConfig.rotAngle == 90 || encConfig.rotAngle == 270) ? + encConfig.picWidth : + encConfig.picHeight; + + /* time base: this is the fundamental unit of time (in seconds) in terms + of which frame timestamps are represented. for fixed-fps content, + timebase should be 1/framerate and timestamp increments should be + identically 1. */ + c->time_base.den = encConfig.container_frame_rate; + c->time_base.num = 1; + + c->gop_size = + gopSize; /* emit one intra frame every (gop_size)frames at most */ + + c->pix_fmt = PIX_FMT_YUV420P; + if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) { + /* just for testing, we also add B frames */ + c->max_b_frames = 2; + } + if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) { + /* Needed to avoid using macroblocks in which some coeffs overflow. + This does not happen with normal video, it just happens here as + the motion of the chroma plane does not match the luma plane. */ + c->mb_decision = 2; + } + // some formats want stream headers to be separate + if (oc->oformat->flags & AVFMT_GLOBALHEADER) + c->flags |= CODEC_FLAG_GLOBAL_HEADER; + + return st; +} + +static int write_video_frame(AVFormatContext *oc, AVStream *st, + unsigned char *addr, int size, int picType) +{ + int ret; + static struct SwsContext *img_convert_ctx; + + /* if zero size, it means the image was buffered */ + if (size > 0) { + AVPacket pkt; + av_init_packet(&pkt); + + if (picType == 0) //I Frame + pkt.flags |= AV_PKT_FLAG_KEY; + pkt.stream_index = st->index; + pkt.data = addr; + pkt.size = size; + + /* write the compressed frame in the media file */ + ret = av_interleaved_write_frame(oc, &pkt); + } else + ret = 0; + + if (ret != 0) { + VLOG(ERR, "Error while writing video frame\n"); + return 0; + } + + return 1; +} + +/* +* make a file and write a container's header part +* must set -> en_container, container_frame_rate, gopSize, kbps, rotAngle, picHeight, picWidth, +* stdMode and bitstreamFileName in struct EncConfigParam +*/ +int container_init(EncConfigParam encConfig, AVOutputFormat **fmt, + AVFormatContext **oc, AVStream **video_st, int gopSize) +{ + int stdMode = encConfig.stdMode; + char *filename = encConfig.bitstreamFileName; + unsigned int i; + + if (encConfig.ringBufferEnable == 1) { + VLOG(ERR, "not supported format\n"); + return 0; + } + + /* initialize libavcodec, and register all codecs and formats */ + av_register_all(); + + /* allocate the output media context */ + if (avformat_open_input(oc, filename, NULL, NULL) < 0) { + fprintf(stderr, "failed to avformat_open_input\n"); + return 0; + } + + *fmt = (*oc)->oformat; + + if (stdMode == 0) + (*fmt)->video_codec = AV_CODEC_ID_MPEG4; + else if (stdMode == 1) + (*fmt)->video_codec = AV_CODEC_ID_H263; + else if (stdMode == 2) + (*fmt)->video_codec = AV_CODEC_ID_H264; + else + VLOG(ERR, "unknown codec type = 0x%x\n", stdMode); + + (*oc)->video_codec_id = (*fmt)->video_codec; + (*oc)->audio_codec_id = (*fmt)->audio_codec; + + /* add the audio and video streams using the default format codecs + and initialize the codecs */ + *video_st = + add_stream(*oc, (int)(*fmt)->video_codec, encConfig, gopSize); + + av_dump_format(*oc, 0, filename, 1); + + /* open the output file, if needed */ + if (avio_open(&(*oc)->pb, filename, AVIO_FLAG_WRITE) < 0) { + VLOG(ERR, "Could not open '%s'\n", filename); + for (i = 0; i < (*oc)->nb_streams; i++) { + av_freep(&(*oc)->streams[i]->codec); + av_freep(&(*oc)->streams[i]); + } + /* free the stream */ + av_free(*oc); + return 0; + } + + /* write the stream header, if any */ + if (avformat_write_header(*oc, NULL) < 0) { + VLOG(ERR, + "Could not write header for output file (incorrect codec paramters ?)\n"); + /* free the streams */ + for (i = 0; i < (*oc)->nb_streams; i++) { + av_freep(&(*oc)->streams[i]->codec); + av_freep(&(*oc)->streams[i]); + } + + /* close the output file */ + avio_close((*oc)->pb); + + /* free the stream */ + av_free(*oc); + *oc = NULL; + return 0; + } + + return 1; +} + +/* +* save the header data to temp_buf(header_buf). (instead of ReadBsResetBufHelper) +*/ +int container_copy_header_from_bitstream_buffer(const Uint32 core_idx, + const PhysicalAddress bitstream, + const int size, + const int endian, char *buf, + int *pos) +{ + vdi_read_memory(core_idx, bitstream, (unsigned char *)(buf + (*pos)), + size, endian); + *pos += size; + + //to check memory boundary + if (*pos >= CONTAINER_HEADER_SIZE) { + VLOG(ERR, "exceed header buffer, header buffer size[%d]\n", + *pos); + return 0; + } + return 1; +} + +/* +* write the Element stream data with syntax header to the container file +*/ +int container_write_es(const Uint32 core_idx, const PhysicalAddress bitstream, + const int size, const int endian, AVFormatContext *oc, + AVStream *st, char *header_buffer, int *header_pos, + int format, int picType) +{ + unsigned char *buf = osal_malloc(size); + + if (!buf) { + VLOG(ERR, "fail to allocate bitstream buffer\n"); + return 0; + } + vdi_read_memory(core_idx, bitstream, buf, size, endian); + + //video data = write only 1 SPS & PPS data in the file, + //JPEG = copy jpeg header to every chunk in the file + if (*header_pos) { + //I Frame || MJPEG + unsigned char *buf2 = osal_malloc(size + *header_pos); + + osal_memcpy(buf2, header_buffer, *header_pos); + osal_memcpy(buf2 + *header_pos, buf, size); + + write_video_frame(oc, st, buf2, size + *header_pos, picType); + + osal_free(buf2); + + //to write a header to the first chunk just one time in container except JPEG + if (format != 8) //(format != MJPEG) + *header_pos = 0; + } else + write_video_frame(oc, st, buf, size, picType); + + osal_free(buf); + + return 1; +} + +int container_deinit(AVFormatContext *oc) +{ + unsigned int i; + + if (!oc || !oc->pb) + return 0; + + /* write the trailer, if any. the trailer must be written + * before you close the CodecContexts open when you wrote the + * header; otherwise write_trailer may try to use memory that + * was freed on av_codec_close() */ + av_write_trailer(oc); + + /* free the streams */ + for (i = 0; i < oc->nb_streams; i++) { + av_freep(&oc->streams[i]->codec); + av_freep(&oc->streams[i]); + } + + /* close the output file */ + avio_close(oc->pb); + + /* free the stream */ + av_free(oc); + + return 1; +} + +#endif /* SUPPORT_FFMPEG_DEMUX */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/datastructure.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/datastructure.c new file mode 100644 index 0000000000..034151eabf --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/datastructure.c @@ -0,0 +1,196 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "main_helper.h" + +Queue *Queue_Create(Uint32 itemCount, Uint32 itemSize) +{ + Queue *queue = NULL; + + queue = (Queue *)osal_malloc(sizeof(Queue)); + if (queue == NULL) + return NULL; + queue->size = itemCount; + queue->itemSize = itemSize; + queue->count = 0; + queue->front = 0; + queue->rear = 0; + queue->buffer = (Uint8 *)osal_malloc(itemCount * itemSize); + queue->lock = NULL; + + return queue; +} + +#ifdef REDUNDENT_CODE +Queue *Queue_Create_With_Lock(Uint32 itemCount, Uint32 itemSize) +{ + Queue *queue = NULL; + + queue = (Queue *)osal_malloc(sizeof(Queue)); + if (queue == NULL) + return NULL; + queue->size = itemCount; + queue->itemSize = itemSize; + queue->count = 0; + queue->front = 0; + queue->rear = 0; + queue->buffer = (Uint8 *)osal_malloc(itemCount * itemSize); + queue->lock = VpuMutex_Create(); + + return queue; +} +#endif + +void Queue_Destroy(Queue *queue) +{ + if (queue == NULL) + return; + + if (queue->buffer) + osal_free(queue->buffer); + if (queue->lock) + VpuMutex_Destroy(queue->lock); + osal_free(queue); +} + +BOOL Queue_Enqueue(Queue *queue, void *data) +{ + Uint8 *ptr; + Uint32 offset; + + if (queue == NULL) + return FALSE; + + /* Queue is full */ + if (queue->count == queue->size) + return -1; + + if (queue->lock) + VpuMutex_Lock(queue->lock); + offset = queue->rear * queue->itemSize; + + ptr = &queue->buffer[offset]; + osal_memcpy(ptr, data, queue->itemSize); + queue->rear++; + queue->rear %= queue->size; + queue->count++; + if (queue->lock) + VpuMutex_Unlock(queue->lock); + + return TRUE; +} + +void *Queue_Dequeue(Queue *queue) +{ + void *data; + Uint32 offset; + + if (queue == NULL) + return NULL; + /* Queue is empty */ + if (queue->count == 0) + return NULL; + if (queue->lock) + VpuMutex_Lock(queue->lock); + offset = queue->front * queue->itemSize; + data = (void *)&queue->buffer[offset]; + queue->front++; + queue->front %= queue->size; + queue->count--; + if (queue->lock) + VpuMutex_Unlock(queue->lock); + return data; +} + +#ifdef REDUNDENT_CODE +void Queue_Flush(Queue *queue) +{ + if (queue == NULL) + return; + if (queue->lock) + VpuMutex_Lock(queue->lock); + queue->count = 0; + queue->front = 0; + queue->rear = 0; + if (queue->lock) + VpuMutex_Unlock(queue->lock); +} +#endif + +void *Queue_Peek(Queue *queue) +{ + Uint32 offset; + void *temp; + + if (queue == NULL) + return NULL; + /* Queue is empty */ + if (queue->count == 0) + return NULL; + if (queue->lock) + VpuMutex_Lock(queue->lock); + offset = queue->front * queue->itemSize; + temp = (void *)&queue->buffer[offset]; + if (queue->lock) + VpuMutex_Unlock(queue->lock); + return temp; +} + +#ifdef REDUNDENT_CODE +Uint32 Queue_Get_Cnt(Queue *queue) +{ + Uint32 cnt; + + if (queue == NULL) + return 0; + if (queue->lock) + VpuMutex_Lock(queue->lock); + cnt = queue->count; + if (queue->lock) + VpuMutex_Unlock(queue->lock); + return cnt; +} + +Queue *Queue_Copy(Queue *dstQ, Queue *srcQ) +{ + Queue *queue = NULL; + Uint32 bufferSize; + + if (dstQ == NULL) { + queue = (Queue *)osal_malloc(sizeof(Queue)); + if (queue == NULL) + return NULL; + osal_memset((void *)queue, 0x00, sizeof(Queue)); + } else { + queue = dstQ; + } + + bufferSize = srcQ->size * srcQ->itemSize; + queue->size = srcQ->size; + queue->itemSize = srcQ->itemSize; + queue->count = srcQ->count; + queue->front = srcQ->front; + queue->rear = srcQ->rear; + if (queue->buffer) { + osal_free(queue->buffer); + } + queue->buffer = (Uint8 *)osal_malloc(bufferSize); + + osal_memcpy(queue->buffer, srcQ->buffer, bufferSize); + + return queue; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/debug.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/debug.c new file mode 100644 index 0000000000..677a77c4c6 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/debug.c @@ -0,0 +1,1848 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#include "config.h" +#include "wave/common/common_regdefine.h" +#include "wave/wave4/wave4_regdefine.h" +#include "coda9/coda9_regdefine.h" +#include "wave/common/common_vpuconfig.h" +#if defined(PLATFORM_LINUX) || defined(PLATFORM_QNX) +#include +#include +#include +#include +#include +#endif +#include "main_helper.h" +#include "misc/debug.h" + +enum { False, True }; + +#ifdef REDUNDENT_CODE +void InitializeDebugEnv(Uint32 productId, Uint32 options) +{ + UNREFERENCED_PARAMETER(productId); + UNREFERENCED_PARAMETER(options); +} + +void ReleaseDebugEnv(void) +{ +} +#endif + +#ifdef ENABLE_CNM_DEBUG_MSG +static void DisplayVceEncDebugCommon(int core_idx, int vcore_idx, int set_mode, + int debug0, int debug1, int debug2) +{ + int reg_val; + VLOG(ERR, "---------------Common Debug INFO-----------------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 0); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug0); + VLOG(ERR, "\t- pipe_on : 0x%x\n", ((reg_val >> 8) & 0xf)); + VLOG(ERR, "\t- cur_pipe : 0x%x\n", ((reg_val >> 12) & 0xf)); + VLOG(ERR, "\t- cur_s2ime : 0x%x\n", ((reg_val >> 16) & 0xf)); + VLOG(ERR, "\t- cur_s2cache : 0x%x\n", ((reg_val >> 20) & 0x7)); + VLOG(ERR, "\t- subblok_done : 0x%x\n", ((reg_val >> 24) & 0x7f)); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug1); + VLOG(ERR, + "\t- subblok_done : SFU 0x%x LF 0x%x RDO 0x%x IMD 0x%x FME 0x%x IME 0x%x\n", + ((reg_val >> 5) & 0x1), ((reg_val >> 4) & 0x1), + ((reg_val >> 3) & 0x1), ((reg_val >> 2) & 0x1), + ((reg_val >> 1) & 0x1), ((reg_val >> 0) & 0x1)); + VLOG(ERR, "\t- pipe_on : 0x%x\n", ((reg_val >> 8) & 0xf)); + VLOG(ERR, "\t- cur_pipe : 0x%x\n", ((reg_val >> 12) & 0xf)); + VLOG(ERR, "\t- cur_s2cache : 0x%x\n", ((reg_val >> 16) & 0x7)); + VLOG(ERR, "\t- cur_s2ime : 0x%x\n", ((reg_val >> 24) & 0xf)); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug2); + VLOG(ERR, "\t- main_ctu_ypos : 0x%x\n", ((reg_val >> 0) & 0xff)); + VLOG(ERR, "\t- main_ctu_xpos : 0x%x\n", ((reg_val >> 8) & 0xff)); + VLOG(ERR, "\t- o_prp_ctu_ypos: 0x%x\n", ((reg_val >> 16) & 0xff)); + VLOG(ERR, "\t- o_prp_ctu_xpos: 0x%x\n", ((reg_val >> 24) & 0xff)); + + SetClockGate(0, 1); + reg_val = vdi_fio_read_register(core_idx, W4_GDI_VCORE0_BUS_STATUS); + VLOG(ERR, "\t- =========== GDI_BUS_STATUS ==========\n"); + VLOG(ERR, "\t- pri_bus_busy: 0x%x\n", ((reg_val >> 0) & 0x1)); + VLOG(ERR, "\t- sec_bus_busy: 0x%x\n", ((reg_val >> 16) & 0x1)); + reg_val = VpuReadReg(core_idx, W4_RET_ENC_PIC_TYPE); + VLOG(ERR, "[DEBUG] ret_core1_init : %d\n", (reg_val >> 16) & 0x3ff); + reg_val = VpuReadReg(core_idx, W4_RET_ENC_PIC_FLAG); + VLOG(ERR, "[DEBUG] ret_core0_init : %d\n", (reg_val >> 5) & 0x3ff); + SetClockGate(0, 0); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugDCI(int core_idx, int vcore_idx, int set_mode, + int *debug) +{ + int reg_val; + VLOG(ERR, "----------- MODE 0 : DCI DEBUG INFO----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 0); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[3]); + VLOG(ERR, "\t- i_cnt_dci_rd_tuh : 0x%x\n", + ((reg_val >> 16) & 0xffff)); + VLOG(ERR, "\t- i_cnt_dci_wd_tuh : 0x%x\n", + ((reg_val >> 0) & 0xffff)); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + VLOG(ERR, "\t- i_cnt_dci_rd_cu : 0x%x\n", + ((reg_val >> 16) & 0xffff)); + VLOG(ERR, "\t- i_cnt_dci_wd_cu : 0x%x\n", + ((reg_val >> 0) & 0xffff)); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[5]); + VLOG(ERR, "\t- i_cnt_dci_rd_ctu : 0x%x\n", + ((reg_val >> 16) & 0xffff)); + VLOG(ERR, "\t- i_cnt_dci_2d_ctu : 0x%x\n", + ((reg_val >> 0) & 0xffff)); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[6]); + VLOG(ERR, "\t- i_cnt_dci_rd_coef : 0x%x\n", + ((reg_val >> 16) & 0xffff)); + VLOG(ERR, "\t- i_cnt_dci_wd_coef : 0x%x\n", + ((reg_val >> 0) & 0xffff)); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[7]); + VLOG(ERR, "\t- i_dci_full_empty_flag : 0x%x\n", reg_val); + + VLOG(ERR, "----------- MODE 0 : VCE_CTRL DEBUG INFO----------\n"); + // HW_PARAM + reg_val = ReadRegVCE(core_idx, vcore_idx, 0x0b08); + VLOG(ERR, "\t- r_cnt_enable : 0x%x\n", (reg_val >> 8) & 0x1); + VLOG(ERR, "\t- r_pic_done_sel : 0x%x\n", (reg_val >> 9) & 0x1); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[8]); + VLOG(ERR, "\t- vce_cnt : 0x%x\n", reg_val); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[8]); + VLOG(ERR, "\t- prp_cnt : 0x%x\n", reg_val); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugRDO(int core_idx, int vcore_idx, int set_mode, + int *debug) +{ + int reg_val; + int reg_val_sub; + + VLOG(ERR, "----------- MODE 1 : RDO DEBUG INFO ----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 1); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[3]); + VLOG(ERR, "\t- o_rdo_cu_root_cb : 0x%x\n", + ((reg_val >> 0) & 0x1)); + VLOG(ERR, "\t- o_rdo_tu_cbf_y : 0x%x\n", + ((reg_val >> 1) & 0x1)); + VLOG(ERR, "\t- o_rdo_tu_cbf_u : 0x%x\n", + ((reg_val >> 2) & 0x1)); + VLOG(ERR, "\t- o_rdo_tu_cbf_v : 0x%x\n", + ((reg_val >> 3) & 0x1)); + VLOG(ERR, "\t- w_rdo_wdma_wait : 0x%x\n", + ((reg_val >> 4) & 0x1)); + VLOG(ERR, "\t- |o_rdo_tu_sb_luma_csbf[63: 0] : 0x%x\n", + ((reg_val >> 5) & 0x1)); + VLOG(ERR, "\t- |o_rdo_tu_sb_chro_csbf[31:16] : 0x%x\n", + ((reg_val >> 6) & 0x1)); + VLOG(ERR, "\t- |o_rdo_tu_sb_chro_csbf[15: 0] : 0x%x\n", + ((reg_val >> 7) & 0x1)); + VLOG(ERR, "\t- o_sub_ctu_coe_ready : 0x%x\n", + ((reg_val >> 8) & 0x1)); + VLOG(ERR, "\t- o_sub_ctu_rec_ready : 0x%x\n", + ((reg_val >> 9) & 0x1)); + VLOG(ERR, "\t- o_rdo_wdma_busy : 0x%x\n", + ((reg_val >> 10) & 0x1)); + VLOG(ERR, "\t- w_rdo_rdma_wait : 0x%x\n", + ((reg_val >> 11) & 0x1)); + VLOG(ERR, "\t- o_log2_cu_size[07:06] : 0x%x\n", + ((reg_val >> 12) & 0x3)); + VLOG(ERR, "\t- o_log2_cu_size[15:14] : 0x%x\n", + ((reg_val >> 14) & 0x3)); + VLOG(ERR, "\t- o_log2_cu_size[23:22] : 0x%x\n", + ((reg_val >> 16) & 0x3)); + VLOG(ERR, "\t- o_log2_cu_size[31:30] : 0x%x\n", + ((reg_val >> 18) & 0x3)); + VLOG(ERR, "\t- o_rdo_dbk_valid : 0x%x\n", + ((reg_val >> 20) & 0x1)); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + VLOG(ERR, "\t- debug_status_ctrl : 0x%x\n", + ((reg_val >> 0) & 0xff)); + reg_val_sub = (reg_val >> 0) & 0xff; + VLOG(ERR, "\t- debug_status_ctrl.fsm_main_cur : 0x%x\n", + ((reg_val_sub >> 0) & 0x7)); + VLOG(ERR, "\t- debug_status_ctrl.i_rdo_wdma_wait : 0x%x\n", + ((reg_val_sub >> 3) & 0x1)); + VLOG(ERR, "\t- debug_status_ctrl.fsm_cu08_cur : 0x%x\n", + ((reg_val_sub >> 4) & 0x7)); + VLOG(ERR, "\t- debug_status_ctrl.init_hold : 0x%x\n", + ((reg_val_sub >> 7) & 0x1)); + + VLOG(ERR, "\t- debug_status_nb : 0x%x\n", + ((reg_val >> 8) & 0xff)); + reg_val_sub = (reg_val >> 8) & 0xff; + VLOG(ERR, "\t- debug_status_nb.fsm_save_cur : 0x%x\n", + ((reg_val_sub >> 0) & 0x7)); + VLOG(ERR, "\t- debug_status_nb.fsm_load_cur : 0x%x\n", + ((reg_val_sub >> 4) & 0x7)); + + VLOG(ERR, "\t- debug_status_rec : 0x%x\n", + ((reg_val >> 16) & 0xf)); + reg_val_sub = (reg_val >> 16) & 0xf; + VLOG(ERR, "\t- debug_status_rec.fsm_obuf_cur : 0x%x\n", + ((reg_val_sub >> 0) & 0x7)); + + VLOG(ERR, "\t- debug_status_coe : 0x%x\n", + ((reg_val >> 20) & 0xf)); + reg_val_sub = (reg_val >> 20) & 0xf; + VLOG(ERR, "\t- debug_status_coe.fsm_obuf_cur : 0x%x\n", + ((reg_val_sub >> 0) & 0x7)); + + VLOG(ERR, "\t- debug_status_para : 0x%x\n", + ((reg_val >> 24) & 0xff)); + reg_val_sub = (reg_val >> 24) & 0xff; + VLOG(ERR, "\t- debug_status_para.cur_sfu_rd_state : 0x%x\n", + ((reg_val_sub >> 0) & 0xf)); + VLOG(ERR, "\t- debug_status_para.cur_para_state : 0x%x\n", + ((reg_val_sub >> 4) & 0xf)); + + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugLF(int core_idx, int vcore_idx, int set_mode, + int *debug) +{ + int reg_val; + VLOG(ERR, "----------- MODE 2 : LF DEBUG INFO----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 2); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[3]); + + VLOG(ERR, "\t- cur_enc_main_state : 0x%x\n", (reg_val >> 27) & 0x1F); + VLOG(ERR, "\t- i_sao_para_valie : 0x%x\n", (reg_val >> 26) & 0x1); + VLOG(ERR, "\t- i_sao_fetch_done : 0x%x\n", (reg_val >> 25) & 0x1); + VLOG(ERR, "\t- i_global_encode_en : 0x%x\n", (reg_val >> 24) & 0x1); + VLOG(ERR, "\t- i_bs_valid : 0x%x\n", (reg_val >> 23) & 0x1); + VLOG(ERR, "\t- i_rec_buf_rdo_ready : 0x%x\n", (reg_val >> 22) & 0x1); + VLOG(ERR, "\t- o_rec_buf_dbk_hold : 0x%x\n", (reg_val >> 21) & 0x1); + VLOG(ERR, "\t- cur_main_state : 0x%x\n", (reg_val >> 16) & 0x1F); + VLOG(ERR, "\t- r_lf_pic_dbk_disable : 0x%x\n", (reg_val >> 15) & 0x1); + VLOG(ERR, "\t- r_lf_pic_sao_disable : 0x%x\n", (reg_val >> 14) & 0x1); + VLOG(ERR, "\t- para_load_done : 0x%x\n", (reg_val >> 13) & 0x1); + VLOG(ERR, "\t- i_rdma_ack_wait : 0x%x\n", (reg_val >> 12) & 0x1); + VLOG(ERR, "\t- i_sao_intl_col_done : 0x%x\n", (reg_val >> 11) & 0x1); + VLOG(ERR, "\t- i_sao_outbuf_full : 0x%x\n", (reg_val >> 10) & 0x1); + VLOG(ERR, "\t- lf_sub_done : 0x%x\n", (reg_val >> 9) & 0x1); + VLOG(ERR, "\t- i_wdma_ack_wait : 0x%x\n", (reg_val >> 8) & 0x1); + VLOG(ERR, "\t- lf_all_sub_done : 0x%x\n", (reg_val >> 6) & 0x1); + VLOG(ERR, "\t- cur_ycbcr : 0x%x\n", (reg_val >> 5) & 0x3); + VLOG(ERR, "\t- sub8x8_done : 0x%x\n", (reg_val >> 0) & 0xF); + + VLOG(ERR, "----------- MODE 2 : SYNC_Y_POS DEBUG INFO----------\n"); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + + VLOG(ERR, "\t- fbc_y_pos : 0x%x\n", (reg_val >> 0) & 0xff); + VLOG(ERR, "\t- bwb_y_pos : 0x%x\n", (reg_val >> 16) & 0xff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[5]); + VLOG(ERR, "\t- trace_frame : 0x%x\n", + ((reg_val >> 0) & 0xffff)); + + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugSFU(int core_idx, int vcore_idx, int set_mode, + int *debug) +{ + int reg_val; + VLOG(ERR, "----------- MODE 3 : SFU DEBUG INFO----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 3); + + reg_val = ReadRegVCE(0, vcore_idx, debug[3]); + VLOG(ERR, "\t- i_sub_ctu_pos_y : 0x%x\n", + (reg_val >> 0) & 0xff); + VLOG(ERR, "\t- i_sub_ctu_pos_x : 0x%x\n", + (reg_val >> 8) & 0xff); + VLOG(ERR, "\t- i_cu_fifo_wvalid : 0x%x\n", + (reg_val >> 16) & 0x1); + VLOG(ERR, "\t- i_ctu_busy : 0x%x\n", + (reg_val >> 20) & 0x1); + VLOG(ERR, "\t- i_cs_sctu : 0x%x\n", + (reg_val >> 24) & 0x7); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + VLOG(ERR, "\t- i_ctu_pos_y : 0x%x\n", + (reg_val >> 0) & 0xff); + VLOG(ERR, "\t- i_ctu_pos_x : 0x%x\n", + (reg_val >> 8) & 0xff); + VLOG(ERR, "\t- i_sao_rdo_valid : 0x%x\n", + (reg_val >> 16) & 0x1); + VLOG(ERR, "\t- i_sao_en_r : 0x%x\n", + (reg_val >> 20) & 0x1); + VLOG(ERR, "\t- i_ctu_fifo_wvalid : 0x%x\n", + (reg_val >> 24) & 0x1); + VLOG(ERR, "\t- cs_sfu_ctu : 0x%x\n", + (reg_val >> 28) & 0x3); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[5]); + VLOG(ERR, "\t- i_cu_fifo_wvalid : 0x%x\n", + (reg_val >> 0) & 0x1); + VLOG(ERR, "\t- i_rdo_cu_rd_valid : 0x%x\n", + (reg_val >> 4) & 0x1); + VLOG(ERR, "\t- i_cu_size_r : 0x%x\n", + (reg_val >> 8) & 0x3); + VLOG(ERR, "\t- i_cu_idx_r : 0x%x\n", + (reg_val >> 12) & 0xf); + VLOG(ERR, "\t- cs_cu : 0x%x\n", + (reg_val >> 16) & 0x7); + VLOG(ERR, "\t- cs_fifo : 0x%x\n", + (reg_val >> 20) & 0x7); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[6]); + VLOG(ERR, "\t- w_dbg_tu_fifo_fsm : 0x%x\n", + (reg_val >> 0) & 0xff); + VLOG(ERR, "\t- i_coff_fifo_wvalid : 0x%x\n", + (reg_val >> 8) & 0x1); + VLOG(ERR, "\t- i_tuh_fifo_wvalid : 0x%x\n", + (reg_val >> 12) & 0x1); + VLOG(ERR, "\t- w_dbg_tu_ctrl_fsm : 0x%x\n", + (reg_val >> 16) & 0xf); + VLOG(ERR, "\t- i_rdo_tc_ready : 0x%x\n", + (reg_val >> 20) & 0x1); + VLOG(ERR, "\t- w_dbg_coef_st_in_pic : 0x%x\n", + (reg_val >> 24) & 0x7); + VLOG(ERR, "\t- i_rdo_tu_rd-valid : 0x%x\n", + (reg_val >> 28) & 0x1); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugDCI2(int core_idx, int vcore_idx, int set_mode, + int *debug) +{ + int reg_val; + VLOG(ERR, "----------- MODE 4 : DCI2 DEBUG INFO----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 4); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[3]); + VLOG(ERR, "\t- i_cnt_dci_rd_tuh2 : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_dci_wd_tuh2 : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + VLOG(ERR, "\t- i_cnt_dci_rd_cu2 : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_dci_wd_cu2 : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[5]); + VLOG(ERR, "\t- i_cnt_dci_rd_ctu2 : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_dci_wd_ctu2 : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[6]); + VLOG(ERR, "\t- i_cnt_dci_rd_coef2 : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_dci_wd_coef2 : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[7]); + VLOG(ERR, "\t- i_dci_full_empty_flag : 0x%x\n", reg_val); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugDCILast(int core_idx, int vcore_idx, int set_mode, + int *debug) +{ + int reg_val; + VLOG(ERR, "----------- MODE 5 : DCI LAST DEBUG INFO----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 5); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[3]); + VLOG(ERR, "\t- i_cnt_dci_last_rdata[143:112] : 0x%x\n", reg_val); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + VLOG(ERR, "\t- i_cnt_dci_last_rdata[111: 96] : 0x%x\n", + reg_val & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[5]); + VLOG(ERR, "\t- i_cnt_dci_last_rdata[ 95: 64] : 0x%x\n", reg_val); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[6]); + VLOG(ERR, "\t- i_cnt_dci_last_rdata[ 63: 32] : 0x%x\n", reg_val); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[7]); + VLOG(ERR, "\t- i_cnt_dci_last_rdata[ 31: 0] : 0x%x\n", reg_val); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[8]); + VLOG(ERR, "\t- i_wr_read_point : 0x%x\n", + (reg_val >> 16) & 0x7ff); + VLOG(ERR, "\t- i_wr_read_point_limit : 0x%x\n", + (reg_val >> 0) & 0x7ff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[9]); + VLOG(ERR, "\t- i_sbuf_raddr_store : 0x%x\n", + (reg_val >> 0) & 0x3f); + VLOG(ERR, "\t- i_read_point : 0x%x\n", + (reg_val >> 8) & 0x1f); + VLOG(ERR, "\t- i_dci_write_addr_b : 0x%x\n", + (reg_val >> 16) & 0x3f); + VLOG(ERR, "\t- i_dci_write_addr_c : 0x%x\n", + (reg_val >> 24) & 0x1f); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugBigBufferCnt(int core_idx, int vcore_idx, + int set_mode, int *debug) +{ + int reg_val; + VLOG(ERR, "----------- MODE 6 : BIG BUFFER CNT DEBUG INFO----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 6); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[3]); + VLOG(ERR, "\t- i_cnt_bbuf_read_tuh : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_bbuf_write_tuh : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + VLOG(ERR, "\t- i_cnt_bbuf_read_cu : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_bbuf_write_cu : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[5]); + VLOG(ERR, "\t- i_cnt_bbuf_read_coef : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_bbuf_write_coef : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[6]); + VLOG(ERR, "\t- i_cnt_sbuf_read_tuh : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_sbuf_write_tuh : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[7]); + VLOG(ERR, "\t- i_cnt_sbuf_read_cu : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_sbuf_write_cu : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[8]); + VLOG(ERR, "\t- i_cnt_sbuf_read_ctu : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_sbuf_write_tcu : 0x%x\n", + (reg_val >> 0) & 0xffff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[9]); + VLOG(ERR, "\t- i_cnt_sbuf_read_coef : 0x%x\n", + (reg_val >> 16) & 0xffff); + VLOG(ERR, "\t- i_cnt_sbuf_write_coef : 0x%x\n", + (reg_val >> 0) & 0xffff); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugBigBufferAddr(int core_idx, int vcore_idx, + int set_mode, int *debug) +{ + int reg_val; + VLOG(ERR, + "----------- MODE 6 : BIG BUFFER ADDR DEBUG INFO----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 7); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[3]); + VLOG(ERR, "\t- i_cnt_bbuf_raddr_read_tuh : 0x%x\n", + (reg_val >> 16) & 0x7ff); + VLOG(ERR, "\t- i_cnt_bbuf_raddr_write_tuh : 0x%x\n", + (reg_val >> 0) & 0x7ff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + VLOG(ERR, "\t- i_cnt_bbuf_raddr_read_cu : 0x%x\n", + (reg_val >> 16) & 0x1ff); + VLOG(ERR, "\t- i_cnt_bbuf_raddr_write_cu : 0x%x\n", + (reg_val >> 0) & 0x1ff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[5]); + VLOG(ERR, "\t- i_cnt_bbuf_raddr_read_coef : 0x%x\n", + (reg_val >> 16) & 0xfff); + VLOG(ERR, "\t- i_cnt_bbuf_raddr_write_coef : 0x%x\n", + (reg_val >> 0) & 0xfff); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[6]); + VLOG(ERR, "\t- i_cnt_sbuf_raddr_read_tuh : 0x%x\n", + (reg_val >> 16) & 0x1f); + VLOG(ERR, "\t- i_cnt_sbuf_raddr_write_tuh : 0x%x\n", + (reg_val >> 0) & 0x1f); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[7]); + VLOG(ERR, "\t- i_cnt_sbuf_raddr_read_cu : 0x%x\n", + (reg_val >> 16) & 0x1f); + VLOG(ERR, "\t- i_cnt_sbuf_raddr_write_cu : 0x%x\n", + (reg_val >> 0) & 0x1f); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[8]); + VLOG(ERR, "\t- i_cnt_sbuf_raddr_read_ctu : 0x%x\n", + (reg_val >> 16) & 0x1f); + VLOG(ERR, "\t- i_cnt_sbuf_raddr_write_tcu : 0x%x\n", + (reg_val >> 0) & 0x1f); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[9]); + VLOG(ERR, "\t- i_cnt_sbuf_raddr_read_coef : 0x%x\n", + (reg_val >> 16) & 0x1f); + VLOG(ERR, "\t- i_cnt_sbuf_raddr_write_coef : 0x%x\n", + (reg_val >> 0) & 0x1f); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugSubWb(int core_idx, int vcore_idx, int set_mode, + int *debug) +{ + int reg_val; + VLOG(ERR, "----------- MODE 7 : SUB_WB DEBUG INFO----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 8); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[3]); + VLOG(ERR, "\t- subwb_debug_0 : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + VLOG(ERR, "\t- subwb_debug_1 : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[5]); + VLOG(ERR, "\t- subwb_debug_2 : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[6]); + VLOG(ERR, "\t- subwb_debug_3 : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[7]); + VLOG(ERR, "\t- subwb_debug_4 : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[8]); + VLOG(ERR, "\t- int_sync_ypos : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[9]); + VLOG(ERR, "\t- pic_run_cnt : 0x%x\n", + ((reg_val) >> 0) & 0xffff); + VLOG(ERR, "\t- pic_init_ct : 0x%x\n", + ((reg_val) >> 16) & 0xffff); + + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +static void DisplayVceEncDebugFBC(int core_idx, int vcore_idx, int set_mode, + int *debug) +{ + int reg_val; + VLOG(ERR, "----------- MODE 8 : FBC DEBUG INFO----------\n"); + + WriteRegVCE(core_idx, vcore_idx, set_mode, 9); + + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[3]); + VLOG(ERR, "\t- ofs_request_count : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[4]); + VLOG(ERR, "\t- ofs_bvalid_count : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[5]); + VLOG(ERR, "\t- dat_request_count : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[6]); + VLOG(ERR, "\t- dat_bvalid_count : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[7]); + VLOG(ERR, "\t- fbc_debug : 0x%x\n", + ((reg_val) >> 0) & 0x3FFFFFFF); + VLOG(ERR, "\t- fbc_cr_idle_3d : 0x%x\n", + ((reg_val) >> 30) & 0x1); + VLOG(ERR, "\t- fbc_cr_busy_3d : 0x%x\n", + ((reg_val) >> 31) & 0x1); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[8]); + VLOG(ERR, "\t- outbuf_debug : 0x%x\n", reg_val); + reg_val = ReadRegVCE(core_idx, vcore_idx, debug[9]); + VLOG(ERR, "\t- fbcif_debug : 0x%x\n", reg_val); + + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); + VLOG(ERR, "\n"); +} + +#define VCORE_DBG_ADDR(__vCoreIdx) (0x8000 + (0x1000 * __vCoreIdx) + 0x300) +#define VCORE_DBG_DATA(__vCoreIdx) (0x8000 + (0x1000 * __vCoreIdx) + 0x304) +#define VCORE_DBG_READY(__vCoreIdx) (0x8000 + (0x1000 * __vCoreIdx) + 0x308) +Uint32 ReadRegVCE(Uint32 core_idx, Uint32 vce_core_idx, Uint32 vce_addr) +{ + int vcpu_reg_addr; + int udata; + int vce_core_base = 0x8000 + 0x1000 * vce_core_idx; + + SetClockGate(core_idx, 1); + vdi_fio_write_register(core_idx, VCORE_DBG_READY(vce_core_idx), 0); + + vcpu_reg_addr = vce_addr >> 2; + + vdi_fio_write_register(core_idx, VCORE_DBG_ADDR(vce_core_idx), + vcpu_reg_addr + vce_core_base); + + if (vdi_fio_read_register(0, VCORE_DBG_READY(vce_core_idx)) == 1) + udata = vdi_fio_read_register(0, VCORE_DBG_DATA(vce_core_idx)); + else { + VLOG(ERR, "failed to read VCE register: %d, 0x%04x\n", + vce_core_idx, vce_addr); + udata = -2; //-1 can be a valid value + } + + SetClockGate(core_idx, 0); + return udata; +} + +void WriteRegVCE(Uint32 core_idx, Uint32 vce_core_idx, Uint32 vce_addr, + Uint32 udata) +{ + int vcpu_reg_addr; + + SetClockGate(core_idx, 1); + + vdi_fio_write_register(core_idx, VCORE_DBG_READY(vce_core_idx), 0); + + vcpu_reg_addr = vce_addr >> 2; + + vdi_fio_write_register(core_idx, VCORE_DBG_DATA(vce_core_idx), udata); + vdi_fio_write_register(core_idx, VCORE_DBG_ADDR(vce_core_idx), + (vcpu_reg_addr)&0x00007FFF); + + for (unsigned int i = 0; i < 16; i++) { + unsigned int vcpu_reg_val = + vdi_fio_read_register(0, VCORE_DBG_READY(vce_core_idx)); + if ((vcpu_reg_val >> 31) & 0x1) + VLOG(ERR, "failed to write VCE register: 0x%04x\n", + vce_addr); + else + break; + } + SetClockGate(core_idx, 0); +} + +void PrintVpuStatus(Uint32 coreIdx, Uint32 productId) +{ + SetClockGate(coreIdx, 1); + if (PRODUCT_ID_W_SERIES(productId)) { + int rd, wr; + Uint32 tq, ip, mc, lf; + Uint32 avail_cu, avail_tu, avail_tc, avail_lf, avail_ip; + Uint32 ctu_fsm, nb_fsm, cabac_fsm, cu_info, mvp_fsm, tc_busy, + lf_fsm, bs_data, bbusy, fv; + Uint32 reg_val; + Uint32 index; + Uint32 vcpu_reg[31] = { + 0, + }; + + VLOG(ERR, + "-------------------------------------------------------------------------------\n"); + VLOG(ERR, + "------ VCPU STATUS(DEC) -----\n"); + VLOG(ERR, + "-------------------------------------------------------------------------------\n"); + rd = VpuReadReg(coreIdx, W4_BS_RD_PTR); + wr = VpuReadReg(coreIdx, W4_BS_WR_PTR); + VLOG(ERR, + "RD_PTR: 0x%08x WR_PTR: 0x%08x BS_OPT: 0x%08x BS_PARAM: 0x%08x\n", + rd, wr, VpuReadReg(coreIdx, W4_BS_OPTION), + VpuReadReg(coreIdx, W4_BS_PARAM)); + + // --------- VCPU register Dump + VLOG(ERR, "[+] VCPU REG Dump\n"); + for (index = 0; index < 25; index++) { + VpuWriteReg(coreIdx, 0x14, (1 << 9) | (index & 0xff)); + vcpu_reg[index] = VpuReadReg(coreIdx, 0x1c); + + if (index < 16) { + VLOG(ERR, "0x%08x\t", vcpu_reg[index]); + if ((index % 4) == 3) + VLOG(ERR, "\n"); + } else { + switch (index) { + case 16: + VLOG(ERR, "CR0: 0x%08x\t", + vcpu_reg[index]); + break; + case 17: + VLOG(ERR, "CR1: 0x%08x\n", + vcpu_reg[index]); + break; + case 18: + VLOG(ERR, "ML: 0x%08x\t", + vcpu_reg[index]); + break; + case 19: + VLOG(ERR, "MH: 0x%08x\n", + vcpu_reg[index]); + break; + case 21: + VLOG(ERR, "LR: 0x%08x\n", + vcpu_reg[index]); + break; + case 22: + VLOG(ERR, "PC: 0x%08x\n", + vcpu_reg[index]); + break; + case 23: + VLOG(ERR, "SR: 0x%08x\n", + vcpu_reg[index]); + break; + case 24: + VLOG(ERR, "SSP: 0x%08x\n", + vcpu_reg[index]); + break; + } + } + } + + VLOG(ERR, "[-] VCPU REG Dump\n"); + // --------- BIT register Dump + VLOG(ERR, "[+] BPU REG Dump\n"); + for (index = 0; index < 30; index++) { + unsigned int temp; + temp = vdi_fio_read_register( + coreIdx, (W4_REG_BASE + 0x8000 + 0x18)); + VLOG(ERR, "BITPC = 0x%08x\n", temp); + if (temp == 0xffffffff) + return; + } + VLOG(ERR, "BIT START=0x%08x, BIT END=0x%08x\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x11c)), + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x120))); +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_410) + VLOG(ERR, "BIT COMMAND 0x%x\n", + vdi_fio_read_register( + coreIdx, (W4_REG_BASE + 0x8000 + 0x100))); + if (productId == PRODUCT_ID_4102 || productId == PRODUCT_ID_510) + VLOG(ERR, "BIT COMMAND 0x%x\n", + vdi_fio_read_register( + coreIdx, (W4_REG_BASE + 0x8000 + 0x1FC))); +#endif + + // DECODER SDMA INFO + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x120); + while ((vdi_fio_read_register(0, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = + vdi_fio_read_register(0, (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_LOAD_CMD = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x121); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_AURO_MODE = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x122); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_BASE_ADDR = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x123); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_ENC_ADDR = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x124); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_ENDIAN = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x125); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_IRQ_CLEAR = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x126); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_BUSY = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x127); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_LAST_ADDR = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x128); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_SC_BASE_ADDR = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x129); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_RD_SEL = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x130); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SDMA_WR_SEL = 0x%x\n", reg_val); + + // DECODER SHU INFO + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x140); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_INIT = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x141); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_SEEK_NXT_NAL = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x142); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_RD_NAL_ADDR = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x143); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_STATUS = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x144); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_GBYTE0 = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x145); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_GBYTE1 = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x146); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_GBYTE2 = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x147); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_GBYTE3 = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x148); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_GBYTE4 = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x14C); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_SBYTE_LOW = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x14D); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_SBYTE_HIGH = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x14E); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_ST_PAT_DIS = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x150); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_NBUF0 = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x151); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_NBUF1 = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x152); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_NBUF2 = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x153); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_NBUF3 = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x15C); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_NBUF_RPTR = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x15D); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_NBUF_WPTR = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x15E); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_REMAIN_BYTE = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x15F); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_CONSUME_BYTE= 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x160); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_RD_SEL = 0x%x\n", reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x161); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "C_SHU_WR_SEL = 0x%x\n", reg_val); + + // --------- BIT HEVC Status Dump + ctu_fsm = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x48)); + nb_fsm = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x4c)); + cabac_fsm = vdi_fio_read_register( + coreIdx, (W4_REG_BASE + 0x8000 + 0x50)); + cu_info = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x54)); + mvp_fsm = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x58)); + tc_busy = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x5c)); + lf_fsm = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x60)); + bs_data = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x64)); + bbusy = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x68)); + fv = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x6C)); + + VLOG(ERR, "[DEBUG-BPUHEVC] CTU_X: %4d, CTU_Y: %4d\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x40)), + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x44))); + VLOG(ERR, + "[DEBUG-BPUHEVC] CTU_FSM> Main: 0x%02x, FIFO: 0x%1x, NB: 0x%02x, DBK: 0x%1x\n", + ((ctu_fsm >> 24) & 0xff), ((ctu_fsm >> 16) & 0xff), + ((ctu_fsm >> 8) & 0xff), (ctu_fsm & 0xff)); + VLOG(ERR, "[DEBUG-BPUHEVC] NB_FSM: 0x%02x\n", + nb_fsm & 0xff); + VLOG(ERR, + "[DEBUG-BPUHEVC] CABAC_FSM> SAO: 0x%02x, CU: 0x%02x, PU: 0x%02x, TU: 0x%02x, EOS: 0x%02x\n", + ((cabac_fsm >> 25) & 0x3f), ((cabac_fsm >> 19) & 0x3f), + ((cabac_fsm >> 13) & 0x3f), ((cabac_fsm >> 6) & 0x7f), + (cabac_fsm & 0x3f)); + VLOG(ERR, + "[DEBUG-BPUHEVC] CU_INFO value = 0x%04x\n\t\t(l2cb: 0x%1x, cux: %1d, cuy; %1d, pred: %1d, pcm: %1d, wr_done: %1d, par_done: %1d, nbw_done: %1d, dec_run: %1d)\n", + cu_info, ((cu_info >> 16) & 0x3), ((cu_info >> 13) & 0x7), + ((cu_info >> 10) & 0x7), ((cu_info >> 9) & 0x3), + ((cu_info >> 8) & 0x1), ((cu_info >> 6) & 0x3), + ((cu_info >> 4) & 0x3), ((cu_info >> 2) & 0x3), + (cu_info & 0x3)); + VLOG(ERR, "[DEBUG-BPUHEVC] MVP_FSM> 0x%02x\n", mvp_fsm & 0xf); + VLOG(ERR, + "[DEBUG-BPUHEVC] TC_BUSY> tc_dec_busy: %1d, tc_fifo_busy: 0x%02x\n", + ((tc_busy >> 3) & 0x1), (tc_busy & 0x7)); + VLOG(ERR, "[DEBUG-BPUHEVC] LF_FSM> SAO: 0x%1x, LF: 0x%1x\n", + ((lf_fsm >> 4) & 0xf), (lf_fsm & 0xf)); + VLOG(ERR, + "[DEBUG-BPUHEVC] BS_DATA> ExpEnd=%1d, bs_valid: 0x%03x, bs_data: 0x%03x\n", + ((bs_data >> 31) & 0x1), ((bs_data >> 16) & 0xfff), + (bs_data & 0xfff)); + VLOG(ERR, + "[DEBUG-BPUHEVC] BUS_BUSY> mib_wreq_done: %1d, mib_busy: %1d, sdma_bus: %1d\n", + ((bbusy >> 2) & 0x1), ((bbusy >> 1) & 0x1), (bbusy & 0x1)); + VLOG(ERR, + "[DEBUG-BPUHEVC] FIFO_VALID> cu: %1d, tu: %1d, iptu: %1d, lf: %1d, coff: %1d\n\n", + ((fv >> 4) & 0x1), ((fv >> 3) & 0x1), ((fv >> 2) & 0x1), + ((fv >> 1) & 0x1), (fv & 0x1)); + VLOG(ERR, "[-] BPU REG Dump\n"); + + // --------- VCE register Dump + VLOG(ERR, "[+] VCE REG Dump\n"); + tq = ReadRegVCE(coreIdx, 0, 0xd0); + ip = ReadRegVCE(coreIdx, 0, 0xd4); + mc = ReadRegVCE(coreIdx, 0, 0xd8); + lf = ReadRegVCE(coreIdx, 0, 0xdc); + avail_cu = (ReadRegVCE(coreIdx, 0, 0x11C) >> 16) - + (ReadRegVCE(coreIdx, 0, 0x110) >> 16); + avail_tu = (ReadRegVCE(coreIdx, 0, 0x11C) & 0xFFFF) - + (ReadRegVCE(coreIdx, 0, 0x110) & 0xFFFF); + avail_tc = (ReadRegVCE(coreIdx, 0, 0x120) >> 16) - + (ReadRegVCE(coreIdx, 0, 0x114) >> 16); + avail_lf = (ReadRegVCE(coreIdx, 0, 0x120) & 0xFFFF) - + (ReadRegVCE(coreIdx, 0, 0x114) & 0xFFFF); + avail_ip = (ReadRegVCE(coreIdx, 0, 0x124) >> 16) - + (ReadRegVCE(coreIdx, 0, 0x118) >> 16); + VLOG(ERR, + " TQ IP MC LF GDI_EMPTY ROOM\n"); + VLOG(ERR, + "------------------------------------------------------------------------------------------------------------\n"); + SetClockGate(coreIdx, 1); + VLOG(ERR, + "| %d %04d %04d | %d %04d %04d | %d %04d %04d | %d %04d %04d | 0x%08x | CU(%d) TU(%d) TC(%d) LF(%d) IP(%d)\n", + (tq >> 22) & 0x07, (tq >> 11) & 0x3ff, tq & 0x3ff, + (ip >> 22) & 0x07, (ip >> 11) & 0x3ff, ip & 0x3ff, + (mc >> 22) & 0x07, (mc >> 11) & 0x3ff, mc & 0x3ff, + (lf >> 22) & 0x07, (lf >> 11) & 0x3ff, lf & 0x3ff, + vdi_fio_read_register(coreIdx, 0x88f4), /* GDI empty */ + avail_cu, avail_tu, avail_tc, avail_lf, avail_ip); + /* CU/TU Queue count */ + reg_val = ReadRegVCE(coreIdx, 0, 0x12C); + VLOG(ERR, "[DCIDEBUG] QUEUE COUNT: CU(%5d) TU(%5d) ", + (reg_val >> 16) & 0xffff, reg_val & 0xffff); + reg_val = ReadRegVCE(coreIdx, 0, 0x1A0); + VLOG(ERR, "TC(%5d) IP(%5d) ", (reg_val >> 16) & 0xffff, + reg_val & 0xffff); + reg_val = ReadRegVCE(coreIdx, 0, 0x1A4); + VLOG(ERR, "LF(%5d)\n", (reg_val >> 16) & 0xffff); + VLOG(ERR, + "VALID SIGNAL : CU0(%d) CU1(%d) CU2(%d) TU(%d) TC(%d) IP(%5d) LF(%5d)\nDCI_FALSE_RUN(%d) VCE_RESET(%d) CORE_INIT(%d) SET_RUN_CTU(%d)\n", + (reg_val >> 6) & 1, (reg_val >> 5) & 1, (reg_val >> 4) & 1, + (reg_val >> 3) & 1, (reg_val >> 2) & 1, (reg_val >> 1) & 1, + (reg_val >> 0) & 1, (reg_val >> 10) & 1, + (reg_val >> 9) & 1, (reg_val >> 8) & 1, + (reg_val >> 7) & 1); + + VLOG(ERR, "State TQ: 0x%08x IP: 0x%08x MC: 0x%08x LF: 0x%08x\n", + ReadRegVCE(coreIdx, 0, 0xd0), ReadRegVCE(coreIdx, 0, 0xd4), + ReadRegVCE(coreIdx, 0, 0xd8), + ReadRegVCE(coreIdx, 0, 0xdc)); + VLOG(ERR, "BWB[1]: RESPONSE_CNT(0x%08x) INFO(0x%08x)\n", + ReadRegVCE(coreIdx, 0, 0x194), + ReadRegVCE(coreIdx, 0, 0x198)); + VLOG(ERR, "BWB[2]: RESPONSE_CNT(0x%08x) INFO(0x%08x)\n", + ReadRegVCE(coreIdx, 0, 0x194), + ReadRegVCE(coreIdx, 0, 0x198)); + VLOG(ERR, "DCI INFO\n"); + VLOG(ERR, "READ_CNT_0 : 0x%08x\n", + ReadRegVCE(coreIdx, 0, 0x110)); + VLOG(ERR, "READ_CNT_1 : 0x%08x\n", + ReadRegVCE(coreIdx, 0, 0x114)); + VLOG(ERR, "READ_CNT_2 : 0x%08x\n", + ReadRegVCE(coreIdx, 0, 0x118)); + VLOG(ERR, "WRITE_CNT_0: 0x%08x\n", + ReadRegVCE(coreIdx, 0, 0x11c)); + VLOG(ERR, "WRITE_CNT_1: 0x%08x\n", + ReadRegVCE(coreIdx, 0, 0x120)); + VLOG(ERR, "WRITE_CNT_2: 0x%08x\n", + ReadRegVCE(coreIdx, 0, 0x124)); + reg_val = ReadRegVCE(coreIdx, 0, 0x128); + VLOG(ERR, "LF_DEBUG_PT: 0x%08x\n", reg_val & 0xffffffff); + VLOG(ERR, + "cur_main_state %2d, r_lf_pic_deblock_disable %1d, r_lf_pic_sao_disable %1d\n", + (reg_val >> 16) & 0x1f, (reg_val >> 15) & 0x1, + (reg_val >> 14) & 0x1); + VLOG(ERR, + "para_load_done %1d, i_rdma_ack_wait %1d, i_sao_intl_col_done %1d, i_sao_outbuf_full %1d\n", + (reg_val >> 13) & 0x1, (reg_val >> 12) & 0x1, + (reg_val >> 11) & 0x1, (reg_val >> 10) & 0x1); + VLOG(ERR, + "lf_sub_done %1d, i_wdma_ack_wait %1d, lf_all_sub_done %1d, cur_ycbcr %1d, sub8x8_done %2d\n", + (reg_val >> 9) & 0x1, (reg_val >> 8) & 0x1, + (reg_val >> 6) & 0x1, (reg_val >> 4) & 0x1, reg_val & 0xf); + VLOG(ERR, "[-] VCE REG Dump\n"); + VLOG(ERR, "[-] VCE REG Dump\n"); + + VLOG(ERR, + "-------------------------------------------------------------------------------\n"); + } + if (productId == PRODUCT_ID_420 || productId == PRODUCT_ID_420L) { + int rd, wr; + Uint32 reg_val, num; + int vce_enc_debug[12] = { + 0, + }; + int set_mode; + int vcore_num, vcore_idx; + Uint32 index; + Uint32 vcpu_reg[31] = { + 0, + }; + + SetClockGate(coreIdx, 1); + VLOG(ERR, + "-------------------------------------------------------------------------------\n"); + VLOG(ERR, + "------ VCPU STATUS(ENC) -----\n"); + VLOG(ERR, + "-------------------------------------------------------------------------------\n"); + rd = VpuReadReg(coreIdx, W4_BS_RD_PTR); + wr = VpuReadReg(coreIdx, W4_BS_WR_PTR); + VLOG(ERR, + "RD_PTR: 0x%08x WR_PTR: 0x%08x BS_OPT: 0x%08x BS_PARAM: 0x%08x\n", + rd, wr, VpuReadReg(coreIdx, W4_BS_OPTION), + VpuReadReg(coreIdx, W4_BS_PARAM)); + + // --------- VCPU register Dump + VLOG(ERR, "[+] VCPU REG Dump\n"); + for (index = 0; index < 25; index++) { + VpuWriteReg(coreIdx, W4_VPU_PDBG_IDX_REG, + (1 << 9) | (index & 0xff)); + vcpu_reg[index] = + VpuReadReg(coreIdx, W4_VPU_PDBG_RDATA_REG); + + if (index < 16) { + VLOG(ERR, "0x%08x\t", vcpu_reg[index]); + if ((index % 4) == 3) + VLOG(ERR, "\n"); + } else { + switch (index) { + case 16: + VLOG(ERR, "CR0: 0x%08x\t", + vcpu_reg[index]); + break; + case 17: + VLOG(ERR, "CR1: 0x%08x\n", + vcpu_reg[index]); + break; + case 18: + VLOG(ERR, "ML: 0x%08x\t", + vcpu_reg[index]); + break; + case 19: + VLOG(ERR, "MH: 0x%08x\n", + vcpu_reg[index]); + break; + case 21: + VLOG(ERR, "LR: 0x%08x\n", + vcpu_reg[index]); + break; + case 22: + VLOG(ERR, "PC: 0x%08x\n", + vcpu_reg[index]); + break; + case 23: + VLOG(ERR, "SR: 0x%08x\n", + vcpu_reg[index]); + break; + case 24: + VLOG(ERR, "SSP: 0x%08x\n", + vcpu_reg[index]); + break; + } + } + } + VLOG(ERR, "[-] VCPU REG Dump\n"); + VLOG(ERR, "vce run flag = %d\n", VpuReadReg(coreIdx, 0x1E8)); + // --------- BIT register Dump + VLOG(ERR, "[+] BPU REG Dump\n"); + for (index = 0; index < 30; index++) { + unsigned int temp; + temp = vdi_fio_read_register( + coreIdx, (W4_REG_BASE + 0x8000 + 0x18)); + VLOG(ERR, "BITPC = 0x%08x\n", temp); + if (temp == 0xffffffff) + return; + } + + // --------- BIT HEVC Status Dump + VLOG(ERR, "==================================\n"); + VLOG(ERR, "[-] BPU REG Dump\n"); + VLOG(ERR, "==================================\n"); + + VLOG(ERR, "DBG_FIFO_VALID [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x6C))); + + // SDMA debug information + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x13c); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "SDMA_DBG_INFO [%08x]\n", reg_val); + VLOG(ERR, "\t- [ 28] need_more_update : 0x%x\n", + (reg_val >> 28) & 0x1); + VLOG(ERR, "\t- [27:25] tr_init_fsm : 0x%x\n", + (reg_val >> 25) & 0x7); + VLOG(ERR, "\t- [24:18] remain_trans_size : 0x%x\n", + (reg_val >> 18) & 0x7F); + VLOG(ERR, "\t- [17:13] wdata_out_cnt : 0x%x\n", + (reg_val >> 13) & 0x1F); + VLOG(ERR, "\t- [12:10] wdma_wd_fsm : 0x%x\n", + (reg_val >> 10) & 0x1F); + VLOG(ERR, "\t- [ 9: 7] wdma_wa_fsm : 0x%x ", + (reg_val >> 7) & 0x7); + if (((reg_val >> 7) & 0x7) == 3) + VLOG(ERR, "-->WDMA_WAIT_ADDR\n"); + else + VLOG(ERR, "\n"); + VLOG(ERR, "\t- [ 6: 5] sdma_init_fsm : 0x%x\n", + (reg_val >> 5) & 0x3); + VLOG(ERR, "\t- [ 4: 1] save_fsm : 0x%x\n", + (reg_val >> 1) & 0xF); + VLOG(ERR, "\t- [ 0] unalign_written : 0x%x\n", + (reg_val >> 0) & 0x1); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x13b); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "SDMA_NAL_MEM_INF [%08x]\n", reg_val); + VLOG(ERR, "\t- [ 7: 1] nal_mem_empty_room : 0x%x\n", + (reg_val >> 1) & 0x3F); + VLOG(ERR, "\t- [ 0] ge_wnbuf_size : 0x%x\n", + (reg_val >> 0) & 0x1); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x131); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, + "SDMA_IRQ [%08x]: [1]sdma_irq : 0x%x, [2]enable_sdma_irq : 0x%x\n", + reg_val, (reg_val >> 1) & 0x1, (reg_val & 0x1)); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x134); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "SDMA_BS_BASE_ADDR [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x135); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "SDMA_NAL_STR_ADDR [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x136); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "SDMA_IRQ_ADDR [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x137); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "SDMA_BS_END_ADDR [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x13A); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "SDMA_CUR_ADDR [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x139); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "SDMA_STATUS [%08x]\n", reg_val); + VLOG(ERR, "\t- [2] all_wresp_done : 0x%x\n", + (reg_val >> 2) & 0x1); + VLOG(ERR, "\t- [1] sdma_init_busy : 0x%x\n", + (reg_val >> 1) & 0x1); + VLOG(ERR, "\t- [0] save_busy : 0x%x\n", + (reg_val >> 0) & 0x1); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x164); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, + "SHU_DBG [%08x] : shu_unaligned_num (0x%x)\n", + reg_val, reg_val); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x169); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "SHU_NBUF_WPTR [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x16A); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "SHU_NBUF_RPTR [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x16C); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78)); + VLOG(ERR, "SHU_NBUF_INFO [%08x]\n", reg_val); + VLOG(ERR, "\t- [5:1] nbuf_remain_byte : 0x%x\n", + (reg_val >> 1) & 0x1F); + VLOG(ERR, "\t- [ 0] nbuf_wptr_wrap : 0x%x\n", + (reg_val >> 0) & 0x1); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x184); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "CTU_LAST_ENC_POS [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x187); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "CTU_POS_IN_PIC [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x110); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "MIB_EXTADDR [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x111); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "MIB_INTADDR [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x113); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "MIB_CMD [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + vdi_fio_write_register(coreIdx, (W4_REG_BASE + 0x8000 + 0x74), + (1 << 20) | (1 << 16) | 0x114); + while ((vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x7c)) & + 0x1) == 0) + ; + VLOG(ERR, "MIB_BUSY [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x78))); + + VLOG(ERR, "DBG_BPU_ENC_NB0 [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x40))); + VLOG(ERR, "DBG_BPU_CTU_CTRL0 [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x44))); + VLOG(ERR, "DBG_BPU_CAB_FSM0 [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x48))); + VLOG(ERR, "DBG_BPU_BIN_GEN0 [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x4C))); + VLOG(ERR, "DBG_BPU_CAB_MBAE0 [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x50))); + VLOG(ERR, "DBG_BPU_BUS_BUSY [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x68))); + VLOG(ERR, "DBG_FIFO_VALID [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x6C))); + VLOG(ERR, "DBG_BPU_CTU_CTRL1 [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x54))); + VLOG(ERR, "DBG_BPU_CTU_CTRL2 [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x58))); + VLOG(ERR, "DBG_BPU_CTU_CTRL3 [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x5C))); + + for (index = 0x80; index < 0xA0; index += 4) { + reg_val = vdi_fio_read_register( + coreIdx, (W4_REG_BASE + 0x8000 + index)); + num = (index - 0x80) >> 1; + VLOG(ERR, + "DBG_BIT_STACK [%08x] : Stack%02d (0x%04x), Stack%02d(0x%04x)\n", + reg_val, num, reg_val >> 16, num + 1, + reg_val & 0xffff); + } + + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0xA0)); + VLOG(ERR, + "DGB_BIT_CORE_INFO [%08x] : pc_ctrl_id (0x%04x), pfu_reg_pc(0x%04x)\n", + reg_val, reg_val >> 16, reg_val & 0xffff); + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0xA4)); + VLOG(ERR, "DGB_BIT_CORE_INFO [%08x] : ACC0 (0x%08x)\n", + reg_val, reg_val); + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0xA8)); + VLOG(ERR, "DGB_BIT_CORE_INFO [%08x] : ACC1 (0x%08x)\n", + reg_val, reg_val); + + reg_val = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0xAC)); + VLOG(ERR, + "DGB_BIT_CORE_INFO [%08x] : pfu_ibuff_id(0x%04x), pfu_ibuff_op(0x%04x)\n", + reg_val, reg_val >> 16, reg_val & 0xffff); + + for (num = 0; num < 5; num += 1) { + reg_val = vdi_fio_read_register( + coreIdx, (W4_REG_BASE + 0x8000 + 0xB0)); + VLOG(ERR, + "DGB_BIT_CORE_INFO [%08x] : core_pram_rd_en(0x%04x), core_pram_rd_addr(0x%04x)\n", + reg_val, reg_val >> 16, reg_val & 0xffff); + } + + VLOG(ERR, "SAO_LUMA_OFFSET [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0xB4))); + VLOG(ERR, "SAO_CB_OFFSET [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0xB8))); + VLOG(ERR, "SAO_CR_OFFSET [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0xBC))); + + VLOG(ERR, "GDI_NO_MORE_REQ [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x8f0))); + VLOG(ERR, "GDI_EMPTY_FLAG [%08x]\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x8f4))); + + if (productId == PRODUCT_ID_420) { + VLOG(ERR, "WAVE420_CODE VCE DUMP\n"); + vce_enc_debug[0] = 0x0bc8; // MODE SEL + vce_enc_debug[1] = 0x0be0; + vce_enc_debug[2] = 0x0bcc; + vce_enc_debug[3] = 0x0be4; + vce_enc_debug[4] = 0x0be8; + vce_enc_debug[5] = 0x0bec; + vce_enc_debug[6] = 0x0bc0; + vce_enc_debug[7] = 0x0bc4; + vce_enc_debug[8] = 0x0bf0; + vce_enc_debug[9] = 0x0bf4; + set_mode = 0x0bc8; + vcore_num = 1; + } else if (productId == PRODUCT_ID_420L) { + VLOG(ERR, "WAVE420L_CODE VCE DUMP\n"); + vce_enc_debug[0] = 0x0bd0; // MODE SEL + vce_enc_debug[1] = 0x0bd4; + vce_enc_debug[2] = 0x0bd8; + vce_enc_debug[3] = 0x0bdc; + vce_enc_debug[4] = 0x0be0; + vce_enc_debug[5] = 0x0be4; + vce_enc_debug[6] = 0x0be8; + vce_enc_debug[7] = 0x0bc4; + vce_enc_debug[8] = 0x0bf0; + vce_enc_debug[9] = 0x0bf4; + set_mode = 0x0bd0; + vcore_num = 1; + } + + for (vcore_idx = 0; vcore_idx < vcore_num; vcore_idx++) { + VLOG(ERR, + "==========================================\n"); + VLOG(ERR, "[+] VCE REG Dump VCORE_IDX : %d\n", + vcore_idx); + VLOG(ERR, + "==========================================\n"); + DisplayVceEncDebugCommon(coreIdx, vcore_idx, set_mode, + vce_enc_debug[0], + vce_enc_debug[1], + vce_enc_debug[2]); + DisplayVceEncDebugDCI(coreIdx, vcore_idx, set_mode, + vce_enc_debug); + DisplayVceEncDebugRDO(coreIdx, vcore_idx, set_mode, + vce_enc_debug); + DisplayVceEncDebugLF(coreIdx, vcore_idx, set_mode, + vce_enc_debug); + DisplayVceEncDebugSFU(coreIdx, vcore_idx, set_mode, + vce_enc_debug); + DisplayVceEncDebugDCI2(coreIdx, vcore_idx, set_mode, + vce_enc_debug); + DisplayVceEncDebugDCILast(coreIdx, vcore_idx, set_mode, + vce_enc_debug); + DisplayVceEncDebugBigBufferCnt(coreIdx, vcore_idx, + set_mode, vce_enc_debug); + DisplayVceEncDebugBigBufferAddr( + coreIdx, vcore_idx, set_mode, vce_enc_debug); + DisplayVceEncDebugSubWb(coreIdx, vcore_idx, set_mode, + vce_enc_debug); + DisplayVceEncDebugFBC(coreIdx, vcore_idx, set_mode, + vce_enc_debug); + } + } +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_520) { + int rd, wr; + SetClockGate(coreIdx, 1); + VLOG(ERR, + "-------------------------------------------------------------------------------\n"); + VLOG(ERR, + "------ VCPU STATUS(ENC) -----\n"); + VLOG(ERR, + "-------------------------------------------------------------------------------\n"); + rd = VpuReadReg(coreIdx, W4_BS_RD_PTR); + wr = VpuReadReg(coreIdx, W4_BS_WR_PTR); + VLOG(ERR, + "RD_PTR: 0x%08x WR_PTR: 0x%08x BS_OPT: 0x%08x BS_PARAM: 0x%08x\n", + rd, wr, VpuReadReg(coreIdx, W4_BS_OPTION), + VpuReadReg(coreIdx, W4_BS_PARAM)); + + VLOG(ERR, "=========Need to add debug code here =========\n"); + } else { + } +#endif + SetClockGate(coreIdx, 0); +} +#endif + +#ifdef REDUNDENT_CODE +void HandleEncoderError(EncHandle handle, Uint32 encPicCnt, + EncOutputInfo *outputInfo) +{ + UNREFERENCED_PARAMETER(handle); + UNREFERENCED_PARAMETER(encPicCnt); + UNREFERENCED_PARAMETER(outputInfo); +} + +void HandleDecoderError(DecHandle handle, Uint32 frameIdx, TestDecConfig *param, + vpu_buffer_t *fbMem, DecOutputInfo *outputInfo) +{ + UNREFERENCED_PARAMETER(handle); + UNREFERENCED_PARAMETER(frameIdx); + UNREFERENCED_PARAMETER(param); + UNREFERENCED_PARAMETER(fbMem); + UNREFERENCED_PARAMETER(outputInfo); +} + +void PrintMemoryAccessViolationReason(Uint32 core_idx, void *outp) +{ + UNREFERENCED_PARAMETER(core_idx); + UNREFERENCED_PARAMETER(outp); +} + +/** + * \brief Handle error cases depending on product + * \return -1 SEQUENCE ERROR + */ +Int32 HandleDecInitSequenceError(DecHandle handle, Uint32 productId, + DecOpenParam *openParam, + DecInitialInfo *seqInfo, RetCode apiErrorCode) +{ + if (apiErrorCode == RETCODE_MEMORY_ACCESS_VIOLATION) { + PrintMemoryAccessViolationReason(handle->coreIdx, NULL); + return -1; + } + + if (PRODUCT_ID_W_SERIES(productId)) { + if (seqInfo->seqInitErrReason == WAVE4_SPSERR_NOT_FOUND) { + return -2; + } + if (seqInfo->seqInitErrReason == + WAVE4_SPEC_OVER_PICTURE_WIDTH_SIZE) { + VLOG(ERR, + "Not supported picture width: MAX_SIZE(8192): %d\n", + seqInfo->picWidth); + } + if (seqInfo->seqInitErrReason == + WAVE4_SPEC_OVER_PICTURE_HEIGHT_SIZE) { + VLOG(ERR, + "Not supported picture height: MAX_SIZE(8192): %d\n", + seqInfo->picHeight); + } + if (seqInfo->seqInitErrReason == + WAVE4_SPEC_OVER_CHROMA_FORMAT) { + VLOG(ERR, "Not supported chroma idc: %d\n", + seqInfo->chromaFormatIDC); + } + if (seqInfo->seqInitErrReason == + WAVE4_SPEC_OVER_BIT_DEPTH) { + VLOG(INFO, + "Not supported Luma or Chroma bitdepth: L(%d), C(%d)\n", + seqInfo->lumaBitdepth, + seqInfo->chromaBitdepth); + } + if (seqInfo->seqInitErrReason == + WAVE4_SPEC_OVER_PROFILE) { + VLOG(INFO, "Not supported profile: %d\n", + seqInfo->profile); + } + if (seqInfo->seqInitErrReason == + WAVE4_SPSERR_NOT_FOUND) { + VLOG(INFO, + "Not found SPS: RD_PTR(0x%08x), WR_PTR(0x%08x)\n", + seqInfo->rdPtr, seqInfo->wrPtr); + } + return -1; + } + if (openParam->bitstreamMode == BS_MODE_PIC_END && + (seqInfo->seqInitErrReason & (1 << 31))) { + VLOG(ERR, "SEQUENCE HEADER NOT FOUND\n"); + } + return -1; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/debug.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/debug.h new file mode 100644 index 0000000000..655789ee0c --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/debug.h @@ -0,0 +1,50 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#ifndef _DEBUG_H_ +#define _DEBUG_H_ + +#include "config.h" +#include "main_helper.h" + +enum { + CNMQC_ENV_NONE, + CNMQC_ENV_GDBSERVER = + (1 << 16), /*!<< It executes gdb server in order to + debug F/W on the C&M FPGA env. */ + CNMQC_ENV_MAX, +}; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* @param options It can be multiples of the above options. + */ +#ifdef REDUNDENT_CODE +extern void InitializeDebugEnv(Uint32 productId, Uint32 options); + +extern void ReleaseDebugEnv(void); +#endif + +#ifdef ENABLE_CNM_DEBUG_MSG +void PrintVpuStatus(Uint32 coreIdx, Uint32 productId); +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _SKIP_H_ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/getopt.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/getopt.h new file mode 100644 index 0000000000..64f2e55e83 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/getopt.h @@ -0,0 +1,37 @@ +#ifndef __GETOPT_H__ +#define __GETOPT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int opterr; /* if error message should be printed */ +extern int optind; /* index into parent argv vector */ +extern int optopt; /* character checked for validity */ +extern int optreset; /* reset getopt */ +extern char *optarg; /* argument associated with option */ + +struct option { + const char *name; + int has_arg; + int *flag; + int val; +}; + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +int getopt(int nargc, char *const nargv[], const char *ostr); + +#if defined(PLATFORM_QNX) +#else +int getopt_long(int nargc, char **nargv, char *options, + struct option *long_options, int *index); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __GETOPT_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/header_struct.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/header_struct.h new file mode 100644 index 0000000000..dfe6a6fc20 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/header_struct.h @@ -0,0 +1,263 @@ +#ifndef __HEADER_STRUCT_H__ +#define __HEADER_STRUCT_H__ + +#define EXTENDED_SAR 255 +#define MAX_VPS_MAX_SUB_LAYERS 16 +#define MAX_CPB_COUNT 16 + +typedef struct sei_buffering_period_tag { + Uint32 sub_pic_hrd_params_present_flag; // derived from syntax elements + // found in the hrd_parameters( ) + Uint32 au_cpb_removal_delay_length_minus1; // derived from syntax + // elements found in the + // hrd_parameters( ) + Uint32 initial_cpb_removal_delay_length_minus1; // derived from syntax + // elements found in the + // hrd_parameters( ) + Uint32 CpbCnt; // CpbCnt are derived from syntax elements found in the + // sub_layer_hrd_parameters( ) syntax structure + Uint32 NalHrdBpPresentFlag; // NalHrdBpPresentFlag and + // VclHrdBpPresentFlag are found in or + // derived from syntax elements found in the + // hrd_parameters( ) + Uint32 VclHrdBpPresentFlag; // NalHrdBpPresentFlag and + // VclHrdBpPresentFlag are found in or + // derived from syntax elements found in the + // hrd_parameters( ) + + Uint32 bp_seq_parameter_set_id; + Uint32 irap_cpb_params_present_flag; + Uint32 cpb_delay_offset; // The syntax element has a length in bits + // given by au_cpb_removal_delay_length_minus1 + + // 1 + Uint32 dpb_delay_offset; + Uint32 concatenation_flag; + Uint32 au_cpb_removal_delay_delta_minus1; + Uint32 nal_initial_cpb_removal_delay[MAX_CPB_COUNT]; // + Uint32 nal_initial_cpb_removal_offset[MAX_CPB_COUNT]; + Uint32 nal_initial_alt_cpb_removal_delay[MAX_CPB_COUNT]; + Uint32 nal_initial_alt_cpb_removal_offset[MAX_CPB_COUNT]; + + Uint32 vcl_initial_cpb_removal_delay[MAX_CPB_COUNT]; + Uint32 vcl_initial_cpb_removal_offset[MAX_CPB_COUNT]; + Uint32 vcl_initial_alt_cpb_removal_delay[MAX_CPB_COUNT]; + Uint32 vcl_initial_alt_cpb_removal_offset[MAX_CPB_COUNT]; +} sei_buffering_period_t; + +typedef struct sei_pic_timing_tag { + Uint32 duplicate_flag; + Uint32 source_scan_type; + Uint32 pic_struct; + + Uint32 CpbDpbDelaysPresentFlag; // if nal_hrd_parameters_present_flag or + // vcl_hrd_parameters_present_flag is + // 1, + Uint32 au_cpb_removal_delay_minus1; + Uint32 pic_dpb_output_delay; + Uint32 pic_dpb_output_du_delay; + + Uint32 num_decoding_units_minus1; + Uint32 du_common_cpb_removal_delay_flag; + Uint32 du_common_cpb_removal_delay_increment_minus1; +#define MAX_NUM_DECODING_UNIT 20 + Uint32 num_nalus_in_du_minus1[MAX_NUM_DECODING_UNIT]; + Uint32 du_cpb_removal_delay_increment_minus1[MAX_NUM_DECODING_UNIT]; + +} sei_pic_timing_t; + +typedef struct sei_active_parameter_tag { + Uint32 active_video_parameter_set_id; + Uint32 self_contained_cvs_flag; + Uint32 no_parameter_set_update_flag; + + Uint32 num_sps_ids_minus1; +#define MAX_NUM_SEQ_ID 20 + Uint32 active_seq_parameter_set_id[MAX_NUM_SEQ_ID]; +} sei_active_parameter_t; + +typedef enum { + BUFFERING_PERIOD = 0, + PICTURE_TIMING, + FILLER_PAYLOAD = 3, + USER_DATA_REGISTERED_ITU_T_T35, + USER_DATA_UNREGISTERED, + RECOVERY_POINT, + SCENE_INFO = 9, + FULL_FRAME_SNAPSHOT = 15, + PROGRESSIVE_REFINEMENT_SEGMENT_START, + PROGRESSIVE_REFINEMENT_SEGMENT_END, + FILM_GRAIN_CHARACTERISTICS = 19, + POST_FILTER_HINT = 22, + TONE_MAPPING_INFO, + KNEE_FUNCTION_INFO, + FRAME_PACKING = 45, + DISPLAY_ORIENTATION = 47, + SOP_DESCRIPTION, + ACTIVE_PARAMETER_SETS = 129, + DECODING_UNIT_INFO, + TEMPORAL_LEVEL0_INDEX, + DECODED_PICTURE_HASH, + SCALABLE_NESTING = 133, + REGION_REFRESH_INFO, + NO_DISPLAY, + TIME_CODE, + MASTERING_DISPLAY_COLOUR_VOLUME, + SEGM_RECT_FRAME_PACKING, + TEMP_MOTION_CONSTRAINED_TILE_SETS, + CHROMA_SAMPLING_FILTER_HINT +} SeiPayloadType; + +enum { + SNT_TRAIL_N = 0, + SNT_TRAIL_R = 1, + SNT_TSA_N = 2, + SNT_TSA_R = 3, + SNT_STSA_N = 4, + SNT_STSA_R = 5, + SNT_RADL_N = 6, + SNT_RADL_R = 7, + SNT_RASL_N = 8, + SNT_RASL_R = 9, + SNT_RSV_N10 = 10, + SNT_RSV_R11 = 11, + SNT_RSV_N12 = 12, + SNT_RSV_R13 = 13, + SNT_RSV_N14 = 14, + SNT_RSV_R15 = 15, + SNT_BLA_W_LP = 16, + SNT_BLA_W_RADL = 17, + SNT_BLA_N_LP = 18, + SNT_IDR_W_RADL = 19, + SNT_IDR_N_LP = 20, + SNT_CRA = 21, + SNT_RSV_IRAP22 = 22, + SNT_RSV_IRAP23 = 23, + SNT_VPS = 32, + SNT_SPS = 33, + SNT_PPS = 34, + SNT_AUD = 35, + SNT_EOS = 36, + SNT_EOB = 37, + SNT_FD = 38, + SNT_PREFIX_SEI = 39, + SNT_SUFFIX_SEI = 40, +}; + +typedef enum { + AVC_NUT_NON_IDR = 1, // coded slice of an non-IDR picture + AVC_NUT_IDR = 5, // coded slice of an IDR picture + AVC_NUT_SEI = 6, // supplemental enhancement information + AVC_NUT_SPS = 7, // sequence parameter set + AVC_NUT_PPS = 8, // picture parameter set + AVC_NUT_AUD = 9, // access unit delimiter + AVC_NUT_EOSEQ = 10, // end of sequence + AVC_NUT_EOS = 11, // end of stream +} AVC_NAL_UNIT_TYPE; + +typedef struct { + Uint32 vui_parameters_presesent_flag; + + // vui_present_flags + Uint32 neutral_chroma_indication_flag; + Uint32 field_seq_flag; // this syntax shall be 1 when pic_struct in + // sei_pic_timing is 1 or 2 + Uint32 frame_field_info_present_flag; // this syntax shall be 1 when + // pic_struct in sei_pic_timing is + // not 0 + Uint32 aspect_ratio_info_present_flag; + Uint32 overscan_info_present_flag; + Uint32 video_signal_type_present_flag; + Uint32 colour_description_present_flag; + Uint32 chroma_loc_info_present_flag; + Uint32 default_display_window_flag; + Uint32 vui_timing_info_present_flag; + Uint32 bitstream_restriction_flag; + + // vui_aspect_ratio_idc + Uint32 aspect_ratio_idc; + + // vui_sar_size + Uint32 sar_width; + Uint32 sar_height; + + // vui_overscan_appropriate + Uint32 overscan_appropriate_flag; + + // vui_video_signal + Uint32 video_format; + Uint32 video_full_range_flag; + Uint32 colour_primaries; + Uint32 transfer_characteristics; + Uint32 matrix_coeffs; + + // vui_chroma_sample_loc + Uint32 chroma_sample_loc_type_top_field; + Uint32 chroma_sample_loc_type_bottom_field; + + // vui_disp_win_left_right + Uint32 def_disp_win_left_offset; + Uint32 def_disp_win_right_offset; + + // vui_disp_win_top_bot + Uint32 def_disp_win_top_offset; + Uint32 def_disp_win_bottom_offset; + + Uint32 vui_hrd_parameters_present_flag; + + Uint32 vui_num_units_in_tick; + Uint32 vui_time_scale; + Uint32 vui_poc_proportional_to_timing_flag; + Uint32 vui_num_ticks_poc_diff_one_minus1; + + Uint32 tiles_fixed_structure_flag; + Uint32 motion_vectors_over_pic_boundaries_flag; + Uint32 restricted_ref_pic_lists_flag; + Uint32 min_spatial_segmentation_idc; + Uint32 max_bytes_per_pic_denom; + Uint32 max_bits_per_min_cu_denom; + Uint32 log2_max_mv_length_horizontal; + Uint32 log2_max_mv_length_vertical; + +} vui_t; + +typedef struct { + Uint32 encodeRbspHrdInVui; + Uint32 encodeRbspHrdInVps; + + Uint32 commonInfPresentFlag; + Uint32 vps_max_sub_layers_minus1; // this parameter is from VPS + + Uint32 nal_hrd_parameters_present_flag; + Uint32 vcl_hrd_parameters_present_flag; + Uint32 sub_pic_hrd_params_present_flag; + + Uint32 tick_divisor_minus2; + Uint32 du_cpb_removal_delay_increment_length_minus1; + Uint32 sub_pic_cpb_params_in_pic_timing_sei_flag; + Uint32 dpb_output_delay_du_length_minus1; + + Uint32 bit_rate_scale; + Uint32 cpb_size_scale; + + Uint32 cpb_size_du_scale; + Uint32 initial_cpb_removal_delay_length_minus1; + Uint32 au_cpb_removal_delay_length_minus1; + Uint32 dpb_output_delay_length_minus1; + + Uint32 fixed_pic_rate_general_flag[MAX_VPS_MAX_SUB_LAYERS]; + Uint32 fixed_pic_rate_within_cvs_flag[MAX_VPS_MAX_SUB_LAYERS]; + Uint32 elemental_duration_in_tc_minus1[MAX_VPS_MAX_SUB_LAYERS]; + Uint32 low_delay_hrd_flag[MAX_VPS_MAX_SUB_LAYERS]; + Uint32 cpb_cnt_minus1[MAX_VPS_MAX_SUB_LAYERS]; + + // sub_layer_hrd_parameters( + + Uint32 bit_rate_value_minus1[MAX_CPB_COUNT][MAX_VPS_MAX_SUB_LAYERS]; + Uint32 cpb_size_value_minus1[MAX_CPB_COUNT][MAX_VPS_MAX_SUB_LAYERS]; + Uint32 cpb_size_du_value_minus1[MAX_CPB_COUNT][MAX_VPS_MAX_SUB_LAYERS]; + Uint32 bit_rate_du_value_minus1[MAX_CPB_COUNT][MAX_VPS_MAX_SUB_LAYERS]; + Uint32 cbr_flag[MAX_CPB_COUNT][MAX_VPS_MAX_SUB_LAYERS]; + +} hrd_t; + +#endif /* __HEADER_STRUCT_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/md5.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/md5.c new file mode 100644 index 0000000000..333d7d4a4b --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/md5.c @@ -0,0 +1,332 @@ +#include +#include +#include +#include "main_helper.h" + +#define MD5_CBLOCK 64 +#define MD5_LBLOCK (MD5_CBLOCK >> 2) +#define MD5_DIGEST_LENGTH 16 + +#define DATA_ORDER_IS_LITTLE_ENDIAN + +#define HASH_MAKE_STRING(c, s) \ + do { \ + unsigned long ll; \ + ll = (c)->A; \ + HOST_l2c(ll, (s)); \ + ll = (c)->B; \ + HOST_l2c(ll, (s)); \ + ll = (c)->C; \ + HOST_l2c(ll, (s)); \ + ll = (c)->D; \ + HOST_l2c(ll, (s)); \ + } while (0) + +#define ROTATE(a, n) (((a) << (n)) | (((a)&0xffffffff) >> (32 - (n)))) + +#if defined(DATA_ORDER_IS_BIG_ENDIAN) +#define HOST_c2l(c, l) \ + (l = (((unsigned long)(*((c)++))) << 24), \ + l |= (((unsigned long)(*((c)++))) << 16), \ + l |= (((unsigned long)(*((c)++))) << 8), \ + l |= (((unsigned long)(*((c)++))))) + +#define HOST_l2c(l, c) \ + (*((c)++) = (unsigned char)(((l) >> 24) & 0xff), \ + *((c)++) = (unsigned char)(((l) >> 16) & 0xff), \ + *((c)++) = (unsigned char)(((l) >> 8) & 0xff), \ + *((c)++) = (unsigned char)(((l)) & 0xff)) +#endif +#if defined(DATA_ORDER_IS_LITTLE_ENDIAN) +#define HOST_c2l(c, l) \ + (l = (((unsigned long)(*((c)++)))), \ + l |= (((unsigned long)(*((c)++))) << 8), \ + l |= (((unsigned long)(*((c)++))) << 16), \ + l |= (((unsigned long)(*((c)++))) << 24)) + +#define HOST_l2c(l, c) \ + (*((c)++) = (unsigned char)(((l)) & 0xff), \ + *((c)++) = (unsigned char)(((l) >> 8) & 0xff), \ + *((c)++) = (unsigned char)(((l) >> 16) & 0xff), \ + *((c)++) = (unsigned char)(((l) >> 24) & 0xff)) +#endif + +#define MD32_REG_T long + +#define F(b, c, d) ((((c) ^ (d)) & (b)) ^ (d)) +#define G(b, c, d) ((((b) ^ (c)) & (d)) ^ (c)) +#define H(b, c, d) ((b) ^ (c) ^ (d)) +#define I(b, c, d) (((~(d)) | (b)) ^ (c)) + +#define R0(a, b, c, d, k, s, t) \ + { \ + a += ((k) + (t) + F((b), (c), (d))); \ + a = ROTATE(a, s); \ + a += b; \ + } +#define R1(a, b, c, d, k, s, t) \ + { \ + a += ((k) + (t) + G((b), (c), (d))); \ + a = ROTATE(a, s); \ + a += b; \ + } +#define R2(a, b, c, d, k, s, t) \ + { \ + a += ((k) + (t) + H((b), (c), (d))); \ + a = ROTATE(a, s); \ + a += b; \ + } +#define R3(a, b, c, d, k, s, t) \ + { \ + a += ((k) + (t) + I((b), (c), (d))); \ + a = ROTATE(a, s); \ + a += b; \ + } + +void md5_block_data_order(MD5_CTX *c, const void *data_, size_t num) +{ + const unsigned char *data = data_; + register unsigned MD32_REG_T A, B, C, D, l; +#ifndef MD32_XARRAY + /* See comment in crypto/sha/sha_locl.h for details. */ + unsigned MD32_REG_T XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7, XX8, XX9, + XX10, XX11, XX12, XX13, XX14, XX15; +#define X(i) XX##i +#else + Uint32 XX[MD5_LBLOCK]; +#define X(i) XX[i] +#endif + + A = c->A; + B = c->B; + C = c->C; + D = c->D; + + for (; num--;) { + HOST_c2l(data, l); + X(0) = l; + HOST_c2l(data, l); + X(1) = l; + /* Round 0 */ + R0(A, B, C, D, X(0), 7, 0xd76aa478L); + HOST_c2l(data, l); + X(2) = l; + R0(D, A, B, C, X(1), 12, 0xe8c7b756L); + HOST_c2l(data, l); + X(3) = l; + R0(C, D, A, B, X(2), 17, 0x242070dbL); + HOST_c2l(data, l); + X(4) = l; + R0(B, C, D, A, X(3), 22, 0xc1bdceeeL); + HOST_c2l(data, l); + X(5) = l; + R0(A, B, C, D, X(4), 7, 0xf57c0fafL); + HOST_c2l(data, l); + X(6) = l; + R0(D, A, B, C, X(5), 12, 0x4787c62aL); + HOST_c2l(data, l); + X(7) = l; + R0(C, D, A, B, X(6), 17, 0xa8304613L); + HOST_c2l(data, l); + X(8) = l; + R0(B, C, D, A, X(7), 22, 0xfd469501L); + HOST_c2l(data, l); + X(9) = l; + R0(A, B, C, D, X(8), 7, 0x698098d8L); + HOST_c2l(data, l); + X(10) = l; + R0(D, A, B, C, X(9), 12, 0x8b44f7afL); + HOST_c2l(data, l); + X(11) = l; + R0(C, D, A, B, X(10), 17, 0xffff5bb1L); + HOST_c2l(data, l); + X(12) = l; + R0(B, C, D, A, X(11), 22, 0x895cd7beL); + HOST_c2l(data, l); + X(13) = l; + R0(A, B, C, D, X(12), 7, 0x6b901122L); + HOST_c2l(data, l); + X(14) = l; + R0(D, A, B, C, X(13), 12, 0xfd987193L); + HOST_c2l(data, l); + X(15) = l; + R0(C, D, A, B, X(14), 17, 0xa679438eL); + R0(B, C, D, A, X(15), 22, 0x49b40821L); + /* Round 1 */ + R1(A, B, C, D, X(1), 5, 0xf61e2562L); + R1(D, A, B, C, X(6), 9, 0xc040b340L); + R1(C, D, A, B, X(11), 14, 0x265e5a51L); + R1(B, C, D, A, X(0), 20, 0xe9b6c7aaL); + R1(A, B, C, D, X(5), 5, 0xd62f105dL); + R1(D, A, B, C, X(10), 9, 0x02441453L); + R1(C, D, A, B, X(15), 14, 0xd8a1e681L); + R1(B, C, D, A, X(4), 20, 0xe7d3fbc8L); + R1(A, B, C, D, X(9), 5, 0x21e1cde6L); + R1(D, A, B, C, X(14), 9, 0xc33707d6L); + R1(C, D, A, B, X(3), 14, 0xf4d50d87L); + R1(B, C, D, A, X(8), 20, 0x455a14edL); + R1(A, B, C, D, X(13), 5, 0xa9e3e905L); + R1(D, A, B, C, X(2), 9, 0xfcefa3f8L); + R1(C, D, A, B, X(7), 14, 0x676f02d9L); + R1(B, C, D, A, X(12), 20, 0x8d2a4c8aL); + /* Round 2 */ + R2(A, B, C, D, X(5), 4, 0xfffa3942L); + R2(D, A, B, C, X(8), 11, 0x8771f681L); + R2(C, D, A, B, X(11), 16, 0x6d9d6122L); + R2(B, C, D, A, X(14), 23, 0xfde5380cL); + R2(A, B, C, D, X(1), 4, 0xa4beea44L); + R2(D, A, B, C, X(4), 11, 0x4bdecfa9L); + R2(C, D, A, B, X(7), 16, 0xf6bb4b60L); + R2(B, C, D, A, X(10), 23, 0xbebfbc70L); + R2(A, B, C, D, X(13), 4, 0x289b7ec6L); + R2(D, A, B, C, X(0), 11, 0xeaa127faL); + R2(C, D, A, B, X(3), 16, 0xd4ef3085L); + R2(B, C, D, A, X(6), 23, 0x04881d05L); + R2(A, B, C, D, X(9), 4, 0xd9d4d039L); + R2(D, A, B, C, X(12), 11, 0xe6db99e5L); + R2(C, D, A, B, X(15), 16, 0x1fa27cf8L); + R2(B, C, D, A, X(2), 23, 0xc4ac5665L); + /* Round 3 */ + R3(A, B, C, D, X(0), 6, 0xf4292244L); + R3(D, A, B, C, X(7), 10, 0x432aff97L); + R3(C, D, A, B, X(14), 15, 0xab9423a7L); + R3(B, C, D, A, X(5), 21, 0xfc93a039L); + R3(A, B, C, D, X(12), 6, 0x655b59c3L); + R3(D, A, B, C, X(3), 10, 0x8f0ccc92L); + R3(C, D, A, B, X(10), 15, 0xffeff47dL); + R3(B, C, D, A, X(1), 21, 0x85845dd1L); + R3(A, B, C, D, X(8), 6, 0x6fa87e4fL); + R3(D, A, B, C, X(15), 10, 0xfe2ce6e0L); + R3(C, D, A, B, X(6), 15, 0xa3014314L); + R3(B, C, D, A, X(13), 21, 0x4e0811a1L); + R3(A, B, C, D, X(4), 6, 0xf7537e82L); + R3(D, A, B, C, X(11), 10, 0xbd3af235L); + R3(C, D, A, B, X(2), 15, 0x2ad7d2bbL); + R3(B, C, D, A, X(9), 21, 0xeb86d391L); + + A = c->A += A; + B = c->B += B; + C = c->C += C; + D = c->D += D; + } +} + +/* Implemented from RFC1321 The MD5 Message-Digest Algorithm + */ + +#define INIT_DATA_A (0x67452301) +#define INIT_DATA_B (0xefcdab89) +#define INIT_DATA_C (0x98badcfe) +#define INIT_DATA_D (0x10325476) + +Int32 MD5_Init(MD5_CTX *c) +{ + c->A = INIT_DATA_A; + c->B = INIT_DATA_B; + c->C = INIT_DATA_C; + c->D = INIT_DATA_D; + c->Nl = 0; + c->Nh = 0; + c->num = 0; + return 1; +} + +Int32 MD5_Update(MD5_CTX *c, const void *data_, size_t len) +{ + const unsigned char *data = data_; + unsigned char *p; + Uint32 l; + size_t n; + + if (len == 0) + return 1; + + l = (c->Nl + (((Uint32)len) << 3)) & 0xffffffffUL; + /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to + * Wei Dai for pointing it out. */ + if (l < c->Nl) /* overflow */ + c->Nh++; + c->Nh += (len >> 29); /* might cause compiler warning on 16-bit */ + c->Nl = l; + + n = c->num; + if (n != 0) { + p = (unsigned char *)c->data; + + if (len >= MD5_CBLOCK || len + n >= MD5_CBLOCK) { + osal_memcpy(p + n, data, MD5_CBLOCK - n); + md5_block_data_order(c, p, 1); + n = MD5_CBLOCK - n; + data += n; + len -= n; + c->num = 0; + osal_memset(p, 0, MD5_CBLOCK); /* keep it zeroed */ + } else { + osal_memcpy(p + n, data, len); + c->num += (unsigned int)len; + return 1; + } + } + + n = len / MD5_CBLOCK; + if (n > 0) { + md5_block_data_order(c, data, n); + n *= MD5_CBLOCK; + data += n; + len -= n; + } + + if (len != 0) { + p = (unsigned char *)c->data; + c->num = len; + osal_memcpy(p, data, len); + } + return 1; +} + +Int32 MD5_Final(Uint8 *md, MD5_CTX *c) +{ + unsigned char *p = (unsigned char *)c->data; + size_t n = c->num; + + p[n] = 0x80; /* there is always room for one */ + n++; + + if (n > (MD5_CBLOCK - 8)) { + osal_memset(p + n, 0, MD5_CBLOCK - n); + n = 0; + md5_block_data_order(c, p, 1); + } + osal_memset(p + n, 0, MD5_CBLOCK - 8 - n); + + p += MD5_CBLOCK - 8; +#if defined(DATA_ORDER_IS_BIG_ENDIAN) + (void)HOST_l2c(c->Nh, p); + (void)HOST_l2c(c->Nl, p); +#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN) + (void)HOST_l2c(c->Nl, p); + (void)HOST_l2c(c->Nh, p); +#endif + p -= MD5_CBLOCK; + md5_block_data_order(c, p, 1); + c->num = 0; + osal_memset(p, 0, MD5_CBLOCK); + + HASH_MAKE_STRING(c, md); + + return 1; +} + +Uint8 *MD5(const Uint8 *d, size_t n, Uint8 *md) +{ + MD5_CTX c; + static unsigned char m[MD5_DIGEST_LENGTH]; + + if (md == NULL) + md = m; + if (!MD5_Init(&c)) + return NULL; + MD5_Update(&c, d, n); + MD5_Final(md, &c); + return md; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/pbu.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/pbu.c new file mode 100644 index 0000000000..3ef70b8530 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/pbu.c @@ -0,0 +1,548 @@ +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2003 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +// File : pbu.c 43121 2013-07-25 07:09:33Z lafley.kim $ +// Author : Tee Jung +// Modifier : $LastChangedBy$ +// Descriptions : Soruce file for PBU abstract model +// +//----------------------------------------------------------------------------- + +#include "main_helper.h" +#include "pbu.h" + +enum { SPP_IN, SPP_OUT_RBSP, SPP_OUT_NAL, SPP_UNALIGN }; + +#define NAL_BUF_SIZE 512 + +typedef struct { + // stream buffer status + unsigned char *rd_ptr; + unsigned char *wr_ptr; + + unsigned char *bb_start; + unsigned char *bb_end; + + int explicit_end_flag; + int stream_end_flag; + + // instance handler ... for interrupt handling + void *handle; + +} gbu_if_t; + +typedef struct { + // for interfacing + gbu_if_t *param; + + // internal read pointer + Uint8 *rd_ptr; + + // nal buffer things + Uint8 nal_buf[2][NAL_BUF_SIZE]; + + int nal_buf_idx; + int nal_buf_cnt; + + int nal_ptr; + Uint32 nal_cnt; + + int last_nal_byte; + + // rbsp buffer things + Uint32 wbuf[2]; + Int8 wbuf_emul_info; + + Int8 bptr; + Int8 rbsp_bit_cnt; + + int rbsp_init; + + // rbsp consumed bit count + int tcnt; + + int tc; + + // trailing zero counter + int zero_cnt; + + // eos + int eos; + + Uint32 est_nal_byte_cnt; + + int epbRequired; + +} gbu_t; + +static void enc_flush_rbsp(spp_enc_context context); +static void enc_flush_nal_buf(spp_enc_context context); +#ifdef REDUNDENT_CODE +static void put_bits(spp_enc_context context, Uint32 var, int n); +static void put_ue(spp_enc_context context, Uint32 var); +#endif + +spp_enc_context spp_enc_init(Uint8 *buffer, int buffer_size, int enableEPB) +{ + gbu_t *gbu; + + gbu = (gbu_t *)osal_malloc(sizeof(gbu_t)); + if (!gbu) + return NULL; + gbu->param = (gbu_if_t *)osal_malloc(sizeof(gbu_if_t)); + if (!gbu->param) { + osal_free(gbu); + return NULL; + } + + // connect interface structure + gbu->param->bb_start = buffer; + gbu->param->bb_end = buffer + buffer_size; + gbu->param->rd_ptr = buffer; + gbu->param->wr_ptr = buffer; + + // reset write pointer + gbu->rd_ptr = gbu->param->wr_ptr; + + // reset nal memory index/cnt + gbu->nal_buf_idx = 0; + gbu->nal_buf_cnt = 0; + + gbu->nal_ptr = 0; + gbu->nal_cnt = 0; + gbu->est_nal_byte_cnt = 0; + + // reset trailing zero count + gbu->zero_cnt = 0; + + // reset rbsp consumed count + gbu->bptr = 32; + + gbu->rbsp_bit_cnt = 0; + gbu->tcnt = 0; + + // reset wbuf + gbu->wbuf[0] = gbu->wbuf[1] = 0x00; + + gbu->epbRequired = enableEPB; + + return (spp_enc_context)gbu; +} + +void spp_enc_deinit(spp_enc_context context) +{ + gbu_t *gbu = (gbu_t *)context; + + if (gbu) { + if (gbu->param) { + osal_free(gbu->param); + } + osal_free(gbu); + } +} + +#ifdef REDUNDENT_CODE +void spp_enc_init_rbsp(spp_enc_context context) +{ + gbu_t *gbu = (gbu_t *)context; + + gbu->tcnt = 0; + + // reset trailing zero count + gbu->zero_cnt = 0; + + // reset rbsp consumed count + gbu->bptr = 32; + + // reset wbuf + gbu->wbuf[0] = gbu->wbuf[1] = 0x00; +} +#endif + +void spp_enc_put_nal_byte(spp_enc_context context, Uint32 var, int n) +{ + int i; + gbu_t *gbu = (gbu_t *)context; + + for (i = n - 1; i >= 0; i--) { + gbu->nal_buf[gbu->nal_buf_idx][gbu->nal_ptr] = + ((var >> (i << 3)) & 0xFF); + gbu->nal_ptr++; + gbu->nal_cnt++; + gbu->est_nal_byte_cnt++; + + if (gbu->nal_ptr == NAL_BUF_SIZE) { + enc_flush_nal_buf(context); + + gbu->nal_buf_idx = (gbu->nal_buf_idx + 1) & 1; + gbu->nal_ptr = 0; + } + } +} + +void spp_enc_put_bits(spp_enc_context context, Uint32 var, int n) +{ + Uint32 mask; + Uint32 data; + gbu_t *gbu = (gbu_t *)context; + + if (n == 0) + return; + + // update total rbsp count + gbu->tcnt += n; + + if (n > gbu->bptr) { + // write data + mask = (1 << gbu->bptr) - 1; + data = (var >> (n - gbu->bptr)) & mask; + + gbu->wbuf[0] |= data; + gbu->rbsp_bit_cnt += gbu->bptr; + + // update input data + n -= gbu->bptr; + + // update gbu bptr + gbu->bptr = 0; + + // write rbsp data to nbuf + enc_flush_rbsp(context); + } + + mask = ((Uint64)1 << n) - 1; + data = var & mask; + + // write data + gbu->wbuf[0] |= data << (gbu->bptr - n); + gbu->rbsp_bit_cnt += n; + + // update bptr + gbu->bptr -= n; + + if (gbu->bptr == 0) + enc_flush_rbsp(context); +} + +void spp_enc_flush(spp_enc_context context) +{ + enc_flush_rbsp(context); + + enc_flush_nal_buf(context); +} + +void enc_flush_rbsp(spp_enc_context context) +{ + gbu_t *gbu = (gbu_t *)context; + + int cnt = (32 - gbu->bptr + 7) >> 3; + int pos = 4 - cnt; + Uint8 data; + + gbu->wbuf[1] = gbu->wbuf[0]; + + for (cnt = cnt - 1; cnt >= 0; cnt--) { + data = (gbu->wbuf[0] >> ((cnt + pos) << 3)) & 0xFF; + + if (gbu->epbRequired == 1) { + // insert EPB if needed + if ((gbu->zero_cnt == 2) && (data <= 0x03)) { + spp_enc_put_nal_byte(context, 0x03, 1); + gbu->zero_cnt = 0; + } + } + spp_enc_put_nal_byte(context, data, 1); + + // update number of trailing zeroes + if (data == 0x00) + gbu->zero_cnt++; + else + gbu->zero_cnt = 0; + } + + // reset bit ptr + gbu->bptr = 32; + + // reset wbuf + gbu->wbuf[0] = 0; +} + +static void enc_flush_nal_buf(spp_enc_context context) +{ + int i, cnt; + int left, room; + Uint8 *ptr; + Uint8 *align_wr_ptr; + gbu_t *gbu = (gbu_t *)context; + gbu_if_t *io = gbu->param; + ptr = (Uint8 *)io->wr_ptr; + + align_wr_ptr = (Uint8 *)(ptr); + + for (cnt = 0; cnt < gbu->nal_ptr;) { + room = left = io->rd_ptr - io->wr_ptr; + + // wraparound case + if (left <= 0) { + left = io->bb_end - io->wr_ptr; + room += io->bb_end - io->bb_start; + } + + // write stream to CPB + for (i = 0; i < left && cnt < gbu->nal_ptr; i++, cnt++) + *(align_wr_ptr + i) = + gbu->nal_buf[gbu->nal_buf_idx][cnt]; + + gbu->param->wr_ptr = align_wr_ptr + i; + + // handle wraparound case + if (io->wr_ptr == io->bb_end) + io->wr_ptr = io->bb_start; + + // if room is small enough, then flush data to external memory + if ((room - i) < 256) { + // host_isr(gbu->param, INT_BIT_BIT_BUF_FULL, NULL); + continue; + } + } + + // clear nal_ptr + gbu->nal_ptr = 0; +} + +#ifdef REDUNDENT_CODE +// put unsigned exp-golomb code +void spp_enc_put_ue(spp_enc_context context, Uint32 var) +{ + Uint32 num; + Uint32 data; + + num = -1; + data = var + 1; + + while (data) { + data = data >> 1; + num++; + } + + // leading zero bits + put_bits(context, 0, num); + put_bits(context, var + 1, num + 1); +} + +Uint32 spp_enc_get_ue_bit_size(Uint32 var) +{ + Uint32 size; + Uint32 num; + Uint32 data; + + num = -1; + data = var + 1; + + while (data) { + data = data >> 1; + num++; + } + + // leading zero bits + size = num; + size += (num + 1); + + return size; +} + +// put signed exp-golomb code +void spp_enc_put_se(spp_enc_context context, Uint32 var) +{ + Uint32 data; + + // (-1)^(code_num + 1) + if (var > 0) + data = ((var) << 1) - 1; + else + data = ((-var) << 1); + + put_ue(context, data); +} +#endif + +// put stop one bit & padding zeroes +void spp_enc_put_byte_align(spp_enc_context context, int has_stop_bit) +{ + gbu_t *gbu = (gbu_t *)context; + + // stop one bit + if (has_stop_bit) + spp_enc_put_bits(context, 1, 1); + + // padding zeroes + if (gbu->bptr & 7) + spp_enc_put_bits(context, 0, gbu->bptr & 7); +} + +#ifdef REDUNDENT_CODE +// number of remain bit in wbuf +Uint32 spp_enc_get_wbuf_remain(spp_enc_context context) +{ + gbu_t *gbu = (gbu_t *)context; + + return (Uint32)gbu->bptr; +} + +// number of total bit after gbu initialization +Uint32 spp_enc_get_rbsp_bit(spp_enc_context context) +{ + gbu_t *gbu = (gbu_t *)context; + + return (Uint32)gbu->tcnt; +} +#endif + +// number of nal byte after gbu initialization +Uint32 spp_enc_get_nal_cnt(spp_enc_context context) +{ + gbu_t *gbu = (gbu_t *)context; + + return (Uint32)gbu->nal_cnt; +} + +#ifdef REDUNDENT_CODE +// return wr_ptr of stream buffer +Uint8 *spp_enc_get_wr_ptr(spp_enc_context context) +{ + gbu_t *gbu = (gbu_t *)context; + + enc_flush_rbsp(context); + enc_flush_nal_buf(context); + + return gbu->param->wr_ptr; +} + +Uint8 *spp_enc_get_wr_ptr_only(spp_enc_context context) +{ + gbu_t *gbu = (gbu_t *)context; + + enc_flush_rbsp(context); + + return gbu->param->wr_ptr + gbu->nal_ptr; +} + +void spp_enc_set_wr_ptr(spp_enc_context context, Uint32 wr_ptr) +{ + gbu_t *gbu = (gbu_t *)context; + gbu_if_t *io = gbu->param; + uintptr_t wr_int_ptr = wr_ptr; + uintptr_t bb_end_int_ptr = (uintptr_t)io->bb_end; + uintptr_t gbu_param_bb_end_int_ptr = (uintptr_t)gbu->param->bb_end; + uintptr_t gbu_param_bb_start_int_ptr = (uintptr_t)gbu->param->bb_start; + + while ((uintptr_t)wr_ptr > bb_end_int_ptr) + wr_int_ptr = wr_int_ptr + gbu_param_bb_end_int_ptr - + gbu_param_bb_start_int_ptr; + + io->wr_ptr = (Uint8 *)wr_int_ptr; +} + +// get a estimated NAL count in byte +Uint32 spp_enc_get_est_nal_cnt(spp_enc_context context) +{ + gbu_t *gbu = (gbu_t *)context; + Uint32 est_nal_byte = 0; + Uint8 data; + Uint32 cnt = (32 - gbu->bptr) >> 3; + Uint32 pos = 4 - cnt; + Uint32 zero_cnt = gbu->zero_cnt; + Int32 i; + + for (i = cnt - 1; i >= 0; i--) { + data = (gbu->wbuf[0] >> ((cnt + pos) << 3)) & 0xFF; + + // insert EPB if needed + if ((zero_cnt == 2) && (data <= 0x03)) { + est_nal_byte++; + zero_cnt = 0; + } + + est_nal_byte++; + + // update number of trailing zeroes + if (data == 0x00) + zero_cnt++; + else + zero_cnt = 0; + } + + return gbu->est_nal_byte_cnt + est_nal_byte; +} + +static void put_bits(spp_enc_context context, Uint32 var, int n) +{ + Uint32 mask; + Uint32 data; + gbu_t *gbu = (gbu_t *)context; + + if (n == 0) + return; + + // update total rbsp count + gbu->tcnt += n; + + if (n > gbu->bptr) { + // write data + mask = (1 << gbu->bptr) - 1; + data = (var >> (n - gbu->bptr)) & mask; + + gbu->wbuf[0] |= data; + gbu->rbsp_bit_cnt += gbu->bptr; + + // update input data + n -= gbu->bptr; + + // update gbu bptr + gbu->bptr = 0; + + // write rbsp data to nbuf + enc_flush_rbsp(context); + } + + mask = (1 << n) - 1; + data = var & mask; + + // write data + gbu->wbuf[0] |= data << (gbu->bptr - n); + gbu->rbsp_bit_cnt += n; + + // update bptr + gbu->bptr -= n; + + if (gbu->bptr == 0) + enc_flush_rbsp(context); +} + +static void put_ue(spp_enc_context context, Uint32 var) +{ + Uint32 num; + Uint32 data; + + num = -1; + data = var + 1; + + while (data) { + data = data >> 1; + num++; + } + + // leading zero bits + put_bits(context, 0, num); + put_bits(context, var + 1, num + 1); +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/pbu.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/pbu.h new file mode 100644 index 0000000000..fba339a9ae --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/pbu.h @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2003 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +// File : pbu.h : gbu.c 43121 2013-07-25 07:09:33Z lafley.kim $ +// Author : Tee Jung +// Modifier : $LastChangedBy$ +// Descriptions : Header file for PBU abstract model +//----------------------------------------------------------------------------- + +//#include "com_cnm.h" + +#ifndef __PBU_H__ +#define __PBU_H__ + +#include + +typedef void *spp_enc_context; + +#ifdef __cplusplus +extern "C" { +#endif + +spp_enc_context spp_enc_init(Uint8 *buffer, int buffer_size, int enableEPB); +void spp_enc_deinit(spp_enc_context context); +#ifdef REDUNDENT_CODE +void spp_enc_init_rbsp(spp_enc_context context); +#endif + +void spp_enc_put_nal_byte(spp_enc_context context, Uint32 var, int n); +void spp_enc_put_bits(spp_enc_context context, Uint32 var, int n); + +void spp_enc_flush(spp_enc_context context); + +#ifdef REDUNDENT_CODE +void spp_enc_put_ue(spp_enc_context context, Uint32 var); +Uint32 spp_enc_get_ue_bit_size(Uint32 var); +void spp_enc_put_se(spp_enc_context context, Uint32 var); +#endif +void spp_enc_put_byte_align(spp_enc_context context, int has_stop_bit); + +#ifdef REDUNDENT_CODE +Uint32 spp_enc_get_wbuf_remain(spp_enc_context context); +Uint32 spp_enc_get_rbsp_bit(spp_enc_context context); +#endif +Uint32 spp_enc_get_nal_cnt(spp_enc_context context); +#ifdef REDUNDENT_CODE +Uint8 *spp_enc_get_wr_ptr(spp_enc_context context); +Uint8 *spp_enc_get_wr_ptr_only(spp_enc_context context); + +Uint32 spp_enc_get_est_nal_cnt(spp_enc_context context); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/picture_meta_data.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/picture_meta_data.c new file mode 100644 index 0000000000..8e1d373d4e --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/picture_meta_data.c @@ -0,0 +1,122 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#include +#include +#include "main_helper.h" + +FILE *CreatePicInfoXmlFile(const char *yuvPath) +{ + char strXmlFilePath[256]; + FILE *fp; + + if (yuvPath != NULL) { + sprintf(strXmlFilePath, "%s.xml", yuvPath); + } else { + strcpy(strXmlFilePath, "out.xml"); + } + + fp = osal_fopen(strXmlFilePath, "wb"); + if (fp == NULL) { + printf("%s:%d failed to open %s\n", __func__, __LINE__, + strXmlFilePath); + return NULL; + } + + fputs("\r\n", fp); + fputs("\r\n", fp); + fputs("\r\n", fp); + + return fp; +} + +void ClosePicInfoXMLFile(FILE *fpXML) +{ + if (fpXML != NULL) { + fputs("\r\n", fpXML); + fputs("\r\n", fpXML); + + osal_fclose(fpXML); + } +} + +void SavePicInfoToXml(FILE *fpXml, DecOutputInfo *fbInfo) +{ + // BOOL bCrop; + BOOL bKeyFrame; + Uint32 pkt_pts; + Uint32 pkt_dts; + Uint32 pkt_pos; + double pkt_pts_sec; + double pkt_dts_sec; + Uint32 pkt_size; + Uint32 width; + Uint32 height; + Uint32 bitdepthY; + Uint32 bitdepthC; + char strFormat[256] = { "yuv420p" }; + char strPicType[8]; + + pkt_size = fbInfo->consumedByte; + pkt_pos = 0; + pkt_size = 0; + pkt_pts = 0; + pkt_dts = 0; + pkt_pts_sec = pkt_pts / 1000.0; + pkt_dts_sec = pkt_dts / 1000.0; + bKeyFrame = FALSE; + switch (fbInfo->picType) { + case PIC_TYPE_I: + strcpy(strPicType, "I"); + bKeyFrame = TRUE; + break; + case PIC_TYPE_P: + strcpy(strPicType, "P"); + break; + case PIC_TYPE_B: + strcpy(strPicType, "B"); + break; + default: + strcpy(strPicType, "B"); + break; + } + + if (fbInfo->dispFrame.format == FORMAT_420) { + if (fbInfo->dispFrame.cbcrInterleave == TRUE) { + strcpy(strFormat, "nv12"); + } else { + strcpy(strFormat, "yuv420p"); + } + + if (fbInfo->dispFrame.nv21 == TRUE) { + strcpy(strFormat, "nv21"); + } + } + + width = fbInfo->dispPicWidth; + height = fbInfo->dispPicHeight; + bitdepthY = fbInfo->dispFrame.lumaBitDepth; + bitdepthC = fbInfo->dispFrame.chromaBitDepth; + + fprintf(fpXml, + "\r\n", + bKeyFrame, pkt_pts, pkt_pts_sec, pkt_dts, pkt_dts_sec, pkt_pos, + pkt_size, width, height, strFormat, strPicType, bitdepthY, + bitdepthC); +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/platform.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/platform.c new file mode 100644 index 0000000000..40cf64bd20 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/platform.c @@ -0,0 +1,352 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "main_helper.h" + +/* + * Platform dependent functions + */ +#ifdef PLATFORM_WIN32 +#include +VpuThread VpuThread_Create(VpuThreadRunner runner, void *arg) +{ + HANDLE thread; + DWORD threadId; + + thread = + CreateThread(NULL, 20 * 1024 * 1024, + (LPTHREAD_START_ROUTINE)runner, arg, 0, /* Creation + Flag */ + &threadId); + + return (VpuThread)thread; +} + +BOOL VpuThread_Join(VpuThread thread) +{ + DWORD ret; + HANDLE hVpuThread = (HANDLE)thread; + + if (hVpuThread == NULL) + return FALSE; + + ret = WaitForSingleObject(hVpuThread, INFINITE); + if (ret == WAIT_FAILED) { + VLOG(ERR, "%s:%d WaitForSingleObject failed: ERROR=%d\n", + __func__, __LINE__, GetLastError()); + return FALSE; + } + return TRUE; +} + +void MSleep(Uint32 ms) +{ + Sleep(ms); +} + +/* + * returns current time in ms unit + */ +Uint64 GetCurrentTimeInMs(void) +{ + return 0; +} +const __int64 DELTA_EPOCH_IN_MICROSECS = 11644473600000000; + +#if 0 +int gettimeofday(struct timeval *tv /*in*/, struct timezone *tz /*in*/) +{ + FILETIME ft; + Uint32 tmpres = 0; + TIME_ZONE_INFORMATION tz_winapi; + int rez = 0; + + ZeroMemory(&ft, sizeof(ft)); + ZeroMemory(&tz_winapi, sizeof(tz_winapi)); + + GetSystemTimeAsFileTime(&ft); + + tmpres = ft.dwHighDateTime; + tmpres <<= 32; + tmpres |= ft.dwLowDateTime; + + /*converting file time to unix epoch*/ + tmpres /= 10; /*convert into microseconds*/ + tmpres -= (Uint32)DELTA_EPOCH_IN_MICROSECS; + tv->tv_sec = (__int32)(tmpres * 0.000001); + tv->tv_usec = (tmpres % 1000000); + + //_tzset(),don't work properly, so we use GetTimeZoneInformation + rez = GetTimeZoneInformation(&tz_winapi); + tz->tz_dsttime = (rez == 2) ? TRUE : FALSE; + tz->tz_minuteswest = + tz_winapi.Bias + ((rez == 2) ? tz_winapi.DaylightBias : 0); + + return 0; +} +#endif + +VpuMutex VpuMutex_Create(void) +{ + HANDLE mutexHandle; + + mutexHandle = CreateMutex(NULL, FALSE, NULL); + if (mutexHandle == NULL) { + VLOG(ERR, "%s:%d Failed to CreateVpuMutex: errno(%d)\n", + __func__, __LINE__, GetLastError()); + } + + return mutexHandle; +} + +void VpuMutex_Destroy(VpuMutex handle) +{ + if (handle == NULL) { + VLOG(ERR, "%s:%d Invalid mutex handle\n", __func__, + __LINE__); + return; + } + + CloseHandle((HANDLE)handle); +} + +BOOL VpuMutex_Lock(VpuMutex handle) +{ + if (handle == NULL) { + VLOG(ERR, "%s:%d Invalid mutex handle\n", __func__, + __LINE__); + return FALSE; + } + + if (WaitForSingleObject((HANDLE)handle, INFINITE) != WAIT_OBJECT_0) { + VLOG(ERR, "%s:%d Faield to WaitForSingleObject. err(%d)\n", + __func__, __LINE__, GetLastError()); + return FALSE; + } + + return TRUE; +} + +BOOL VpuMutex_Unlock(VpuMutex handle) +{ + if (handle == NULL) { + VLOG(ERR, "%s:%d Invalid mutex handle\n", __func__, + __LINE__); + return FALSE; + } + + ReleaseMutex((HANDLE)handle); + + return TRUE; +} + +#elif defined(PLATFORM_LINUX) +#include +#include + +typedef void *(*PTHREAD_START_ROUTINE)(void *); + +VpuThread VpuThread_Create(VpuThreadRunner runner, void *arg) +{ + Int32 ret; + VpuThread thread = (pthread_t *)osal_malloc(sizeof(pthread_t)); + + ret = pthread_create((pthread_t *)thread, NULL, + (PTHREAD_START_ROUTINE)runner, arg); + if (ret != 0) { + osal_free(thread); + VLOG(ERR, "Failed to pthread_create ret(%d)\n", ret); + return NULL; + } + + return thread; +} + +BOOL VpuThread_Join(VpuThread thread) +{ + Int32 ret; + pthread_t pthreadHandle; + + if (thread == NULL) { + VLOG(ERR, "%s:%d invalid thread handle\n", __func__, + __LINE__); + return FALSE; + } + + pthreadHandle = *(pthread_t *)thread; + + ret = pthread_join(pthreadHandle, NULL); + if (ret != 0) { + VLOG(ERR, "%s:%d Failed to pthread_join ret(%d)\n", + __func__, __LINE__, ret); + return FALSE; + } + + return TRUE; +} + +void MSleep(Uint32 ms) +{ + usleep(ms * 1000); +} + +typedef struct { + pthread_mutex_t lock; +} VpuMutexHandle; + +VpuMutex VpuMutex_Create(void) +{ + VpuMutexHandle *handle = + (VpuMutexHandle *)osal_malloc(sizeof(VpuMutexHandle)); + + if (handle == NULL) { + VLOG(ERR, "%s:%d failed to allocate memory\n", __func__, + __LINE__); + return NULL; + } + + if (pthread_mutex_init(&handle->lock, NULL) < 0) { + osal_free(handle); + VLOG(ERR, "%s:%d failed to pthread_mutex_init() errno(%d)\n", + __func__, __LINE__, errno); + return NULL; + } + + return (VpuMutex)handle; +} + +void VpuMutex_Destroy(VpuMutex handle) +{ + if (handle == NULL) { + VLOG(ERR, "%s:%d Invalid mutex handle\n", __func__, + __LINE__); + return; + } + + osal_free(handle); +} + +BOOL VpuMutex_Lock(VpuMutex handle) +{ + VpuMutexHandle *mutex = (VpuMutexHandle *)handle; + + if (mutex == NULL) { + VLOG(ERR, "%s:%d Invalid mutex handle\n", __func__, + __LINE__); + return FALSE; + } + + pthread_mutex_lock(&mutex->lock); + + return TRUE; +} + +BOOL VpuMutex_Unlock(VpuMutex handle) +{ + VpuMutexHandle *mutex = (VpuMutexHandle *)handle; + + if (mutex == NULL) { + VLOG(ERR, "%s:%d Invalid mutex handle\n", __func__, + __LINE__); + return FALSE; + } + + pthread_mutex_unlock(&mutex->lock); + + return TRUE; +} +#else +VpuThread VpuThread_Create(VpuThreadRunner runner, void *arg) +{ + UNREFERENCED_PARAMETER(runner); + UNREFERENCED_PARAMETER(arg); + + VLOG(WARN, "%s not implemented yet\n", __func__); + + return NULL; +} + +BOOL VpuThread_Join(VpuThread thread) +{ + UNREFERENCED_PARAMETER(thread); + + VLOG(WARN, "%s not implemented yet\n", __func__); + + return FALSE; +} + +void MSleep(Uint32 ms) +{ + UNREFERENCED_PARAMETER(ms); +} + +VpuMutex VpuMutex_Create(void) +{ + void *ctx; + VLOG(WARN, "%s not implemented yet\n", __func__); + + ctx = osal_malloc(sizeof(Int32)); + + return (VpuMutex)ctx; +} + +void VpuMutex_Destroy(VpuMutex handle) +{ + UNREFERENCED_PARAMETER(handle); + + VLOG(WARN, "%s not implemented yet\n", __func__); + + osal_free((void *)handle); +} + +BOOL VpuMutex_Lock(VpuMutex handle) +{ + UNREFERENCED_PARAMETER(handle); + + return TRUE; +} + +BOOL VpuMutex_Unlock(VpuMutex handle) +{ + UNREFERENCED_PARAMETER(handle); + + return TRUE; +} +#endif /* WINDOWS PLATFORM */ + +#ifdef REDUNDENT_CODE +Uint32 randomSeed; +Uint32 GetRandom(Uint32 start, Uint32 end) +{ + Uint32 range = end - start + 1; + + if (randomSeed == 0) { +#if 1 + randomSeed = 123456; +#else + randomSeed = (Uint32)time(NULL); +#endif + VLOG(INFO, "======= RANDOM SEED: %08x ======\n", randomSeed); + } + + if (range == 0) { + VLOG(ERR, "%s:%d RANGE IS 0\n", __func__, __LINE__); + return 0; + } else { + return ((rand() % range) + start); + } +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/skip.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/skip.c new file mode 100644 index 0000000000..f4d833789b --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/skip.c @@ -0,0 +1,171 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#include +#include "main_helper.h" +#include "skip.h" + +#define CONTINUE_VALUE 0x7fffffff + +typedef struct Md5Node { + char md5[12]; +} Md5Node; + +#define MAX_SKIP_NUM_LENGTH 10 +/*! @return positive value + * -1 - parsing error + */ +static Int32 ParsePositiveNumber(const char *str, Int32 *consumedBytes) +{ + Int32 i = 0, n; + Int32 val = -1; + char ch; + char buf[16]; + BOOL start = FALSE; + BOOL continueChar = FALSE; + + n = 0; + while ((ch = str[i++]) != 0) { + if (ch == '[') { + start = TRUE; + continue; + } else if (ch == ']') { + buf[n++] = 0; + if (continueChar == TRUE) { + val = CONTINUE_VALUE; + } else { + val = atoi(buf); + } + break; + } + + if (start == TRUE) { + if ('0' <= ch && ch <= '9') { + buf[n++] = ch; + } else if (ch == '-') { + // continue character + continueChar = TRUE; + } else { + VLOG(ERR, "%s:%d Invalid number: %c\n", + __func__, __LINE__, ch); + break; + } + } else { + break; + } + } + + *consumedBytes = i; + + return val; +} + +Queue *BuildSkipCommandQueue(const char *skipCmd, Uint32 nFrames) +{ + Uint32 i = 0, j; + Uint32 cmd, nCmds; + Int32 num, consumed; + char ch; + BOOL success = TRUE; + Queue *Q; + SkipCmd skip; + + // Parse skip command + // Pattern: (n)D(n), FOR CODA + // R(n)N(n)D(n)C(n)T(n), FOR WAVE + Q = Queue_Create(nFrames, sizeof(SkipCmd)); + nCmds = 0; + while (nCmds < nFrames) { + ch = skipCmd[i++]; + if (ch == '\0') { + // repeat pattern + i = 0; + continue; + } + switch (ch) { + case 'D': + case 'd': + cmd = SKIP_CMD_DECODE; + break; + case 'R': + case 'r': + cmd = SKIP_CMD_NON_IRAP; + break; + case 'N': + case 'n': + cmd = SKIP_CMD_NON_REF; + break; + case 'T': + case 't': + cmd = SKIP_CMD_TARGET_SUBLAYER; + break; + default: + cmd = SKIP_CMD_NONE; + break; + } + + if (cmd == SKIP_CMD_NONE) { + VLOG(ERR, "Unknown skip command: %c\n", ch); + success = FALSE; + break; + } + + num = ParsePositiveNumber(&skipCmd[i], &consumed); + if (num < 0) { + success = FALSE; + break; + } + if (num == CONTINUE_VALUE) { + num = nFrames - nCmds; + } + + skip.cmd = cmd; + if (cmd == SKIP_CMD_TARGET_SUBLAYER) { + skip.tid = num; // Target sublayer id + Queue_Enqueue(Q, (void *)&skip); + nCmds++; + } else { + skip.tid = H265_MAX_TEMPORAL_ID; + for (j = nCmds; j < nCmds + num && j < nFrames; j++) { + Queue_Enqueue(Q, (void *)&skip); + } + nCmds += num; + } + + i += consumed; + } + + // consumed all bytes + + if (success == FALSE) { + Queue_Destroy(Q); + Q = NULL; + } + +#ifdef DEBUG_SKIP_CMD + { + SkipCmd *val; + static const char *const cmdString[] = { "DECODE", "NON-IRAP", "NON-REF", NULL }; + + for (i = 0; (val = Queue_Dequeue(Q)) != NULL; i++) { + Uint32 cmdIndex = val->cmd; + VLOG(INFO, "COMMAND[%-4d]: %s\n", i, + cmdString[cmdIndex]); + } + } +#endif /* DEBUG_SKIP_CMD */ + + return Q; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/skip.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/skip.h new file mode 100644 index 0000000000..7542c3faf8 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/misc/skip.h @@ -0,0 +1,79 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#ifndef _SKIP_H_ +#define _SKIP_H_ + +typedef enum { + NUT_TRAIL_N = 0, + NUT_TRAIL_R = 1, + NUT_TSA_N = 2, + NUT_TSA_R = 3, + NUT_STSA_N = 4, + NUT_STSA_R = 5, + NUT_RADL_N = 6, + NUT_RADL_R = 7, + NUT_RASL_N = 8, + NUT_RASL_R = 9, + NUT_RSV_N10 = 10, + NUT_RSV_R11 = 11, + NUT_RSV_N12 = 12, + NUT_RSV_R13 = 13, + NUT_RSV_N14 = 14, + NUT_RSV_R15 = 15, + NUT_BLA_W_LP = 16, + NUT_BLA_W_RADL = 17, + NUT_BLA_N_LP = 18, + NUT_IDR_W_RADL = 19, + NUT_IDR_N_LP = 20, + NUT_CRA = 21, + NUT_RSV_IRAP22 = 22, + NUT_RSV_IRAP23 = 23, + NUT_VPS = 32, + NUT_SPS = 33, + NUT_PPS = 34, + NUT_AUD = 35, + NUT_EOS = 36, + NUT_EOB = 37, + NUT_FD = 38, + NUT_PREFIX_SEI = 39, + NUT_SUFFIX_SEI = 40, + NUT_MAX = 63 +} NalType; + +#define H265_MAX_TEMPORAL_ID 6 + +enum { + SKIP_CMD_DECODE, + SKIP_CMD_NON_IRAP, //< 1000 +#pragma once +#endif + +#include "stdint.h" + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote \ + // 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +#define SCNdPTR "I64d" +#define SCNiPTR "I64i" +#else // _WIN64 ][ +#define SCNdPTR "ld" +#define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +#define SCNoPTR "I64o" +#define SCNuPTR "I64u" +#define SCNxPTR "I64x" +#define SCNXPTR "I64X" +#else // _WIN64 ][ +#define SCNoPTR "lo" +#define SCNuPTR "lu" +#define SCNxPTR "lx" +#define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] + imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_INTTYPES_H_ ] +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/msvc/stdint.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/msvc/stdint.h new file mode 100644 index 0000000000..1b5bd4e564 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/msvc/stdint.h @@ -0,0 +1,264 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifdef PLATFORM_WIN32 + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we should wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +#define _W64 __w64 +#else +#define _W64 +#endif +#endif + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#else +typedef signed __int8 int8_t; +typedef signed __int16 int16_t; +typedef signed __int32 int32_t; +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + +// 7.18.1.2 Minimum-width integer types +#ifndef __int_least8_t_defined +#define __int_least8_t_defined +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +#endif + +#ifndef __uint_least8_t_defined +#define __uint_least8_t_defined +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; +#endif + +// 7.18.1.3 Fastest minimum-width integer types +#ifndef __int_fast8_t_defined +#define __int_fast8_t_defined +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +#endif + +#ifndef __uint_fast8_t_defined +#define __uint_fast8_t_defined +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; +#endif + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ +typedef signed __int64 intptr_t; +typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ +typedef _W64 signed int intptr_t; +typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote \ + // 220 at page 257 and \ + // footnote 221 at \ + // page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +#define INTPTR_MIN INT64_MIN +#define INTPTR_MAX INT64_MAX +#define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +#define INTPTR_MIN INT32_MIN +#define INTPTR_MAX INT32_MAX +#define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +#define PTRDIFF_MIN _I64_MIN +#define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +#define PTRDIFF_MIN _I32_MIN +#define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +#ifdef _WIN64 // [ +#define SIZE_MAX _UI64_MAX +#else // _WIN64 ][ +#define SIZE_MAX _UI32_MAX +#endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +#define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +#define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || \ + defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_STDINT_H_ ] + +#endif // PLATFORM_WIN32 diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/vpuhelper.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/vpuhelper.c new file mode 100644 index 0000000000..befc6dd364 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/vpuhelper.c @@ -0,0 +1,3085 @@ +//------------------------------------------------------------------------------ +// File: vpuhelper.c +// +// Copyright (c) 2006, Chips & Media. All rights reserved. +//------------------------------------------------------------------------------ +#include "main_helper.h" + +#ifdef PLATFORM_WIN32 +#pragma warning(disable : 4996) + //!<< disable waring C4996: The POSIX name for + //!fpPicDispInfoLogfile = NULL; + rpt->fpPicTypeLogfile = NULL; + rpt->fpSeqDispInfoLogfile = NULL; + rpt->fpUserDataLogfile = NULL; + rpt->fpSeqUserDataLogfile = NULL; + + rpt->decIndex = 0; + rpt->userDataEnable = cfg->userDataEnable; + rpt->userDataReportMode = cfg->userDataReportMode; + + rpt->reportOpened = FALSE; +} + +void CloseDecReport(Uint32 core_idx) +{ + vpu_rpt_info_t *rpt = &s_rpt_info[core_idx]; + + if (rpt->reportOpened == FALSE) { + return; + } + + if (rpt->fpPicDispInfoLogfile) { + osal_fclose(rpt->fpPicDispInfoLogfile); + rpt->fpPicDispInfoLogfile = NULL; + } + if (rpt->fpPicTypeLogfile) { + osal_fclose(rpt->fpPicTypeLogfile); + rpt->fpPicTypeLogfile = NULL; + } + if (rpt->fpSeqDispInfoLogfile) { + osal_fclose(rpt->fpSeqDispInfoLogfile); + rpt->fpSeqDispInfoLogfile = NULL; + } + + if (rpt->fpUserDataLogfile) { + osal_fclose(rpt->fpUserDataLogfile); + rpt->fpUserDataLogfile = NULL; + } + + if (rpt->fpSeqUserDataLogfile) { + osal_fclose(rpt->fpSeqUserDataLogfile); + rpt->fpSeqUserDataLogfile = NULL; + } + + if (rpt->vb_rpt.base) { + VDI_FREE_MEMORY(core_idx, &rpt->vb_rpt); + } + rpt->decIndex = 0; +} + +static void SaveUserData(Uint32 core_idx, BYTE *userDataBuf) +{ + vpu_rpt_info_t *rpt = &s_rpt_info[core_idx]; + Uint32 i; + Uint32 UserDataType; + Uint32 UserDataSize; + Uint32 userDataNum; + Uint32 TotalSize; + BYTE *tmpBuf; + + if (rpt->reportOpened == FALSE) { + return; + } + + if (rpt->fpUserDataLogfile == 0) { + rpt->fpUserDataLogfile = osal_fopen(FN_USER_DATA, "w+"); + } + + tmpBuf = userDataBuf; + userDataNum = (short)((tmpBuf[0] << 8) | (tmpBuf[1] << 0)); + TotalSize = (short)((tmpBuf[2] << 8) | (tmpBuf[3] << 0)); + tmpBuf = userDataBuf + 8; + + for (i = 0; i < userDataNum; i++) { + UserDataType = (short)((tmpBuf[0] << 8) | (tmpBuf[1] << 0)); + UserDataSize = (short)((tmpBuf[2] << 8) | (tmpBuf[3] << 0)); + + osal_fprintf(rpt->fpUserDataLogfile, + "\n[Idx Type Size] : [%4d %4d %4d]", i, + UserDataType, UserDataSize); + + tmpBuf += 8; + } + osal_fprintf(rpt->fpUserDataLogfile, "\n"); + + tmpBuf = userDataBuf + USER_DATA_INFO_OFFSET; + + for (i = 0; i < TotalSize; i++) { + osal_fprintf(rpt->fpUserDataLogfile, "%02x", tmpBuf[i]); + if ((i & 7) == 7) { + osal_fprintf(rpt->fpUserDataLogfile, "\n"); + } + } + osal_fprintf(rpt->fpUserDataLogfile, "\n"); + +} + +static void SaveUserDataINT(Uint32 core_idx, BYTE *userDataBuf, Int32 size, + Int32 intIssued, Int32 decIdx, + CodStd bitstreamFormat) +{ + vpu_rpt_info_t *rpt = &s_rpt_info[core_idx]; + Int32 i; + Int32 UserDataType = 0; + Int32 UserDataSize = 0; + Int32 userDataNum = 0; + Int32 TotalSize; + BYTE *tmpBuf; + BYTE *backupBufTmp; + static Int32 backupSize; + static BYTE *backupBuf; + + if (rpt->reportOpened == FALSE) { + return; + } + + if (rpt->fpUserDataLogfile == NULL) { + rpt->fpUserDataLogfile = osal_fopen(FN_USER_DATA, "w+"); + } + + backupBufTmp = (BYTE *)osal_malloc(backupSize + size); + + if (backupBufTmp == 0) { + VLOG(ERR, "Can't mem allock\n"); + return; + } + + for (i = 0; i < backupSize; i++) { + backupBufTmp[i] = backupBuf[i]; + } + if (backupBuf != NULL) { + osal_free(backupBuf); + } + backupBuf = backupBufTmp; + + tmpBuf = userDataBuf + USER_DATA_INFO_OFFSET; + size -= USER_DATA_INFO_OFFSET; + + for (i = 0; i < size; i++) { + backupBuf[backupSize + i] = tmpBuf[i]; + } + + backupSize += size; + + if (intIssued) { + return; + } + + tmpBuf = userDataBuf; + userDataNum = (short)((tmpBuf[0] << 8) | (tmpBuf[1] << 0)); + if (userDataNum == 0) { + return; + } + + tmpBuf = userDataBuf + 8; + UserDataSize = (short)((tmpBuf[2] << 8) | (tmpBuf[3] << 0)); + + UserDataSize = ((UserDataSize + 7) >> 3) << 3; + osal_fprintf(rpt->fpUserDataLogfile, "FRAME [%1d]\n", decIdx); + + for (i = 0; i < backupSize; i++) { + osal_fprintf(rpt->fpUserDataLogfile, "%02x", backupBuf[i]); + if ((i & 7) == 7) { + osal_fprintf(rpt->fpUserDataLogfile, "\n"); + } + + if ((i % 8 == 7) && (i == UserDataSize - 1) && + (UserDataSize != backupSize)) { + osal_fprintf(rpt->fpUserDataLogfile, "\n"); + tmpBuf += 8; + UserDataSize += + (short)((tmpBuf[2] << 8) | (tmpBuf[3] << 0)); + UserDataSize = ((UserDataSize + 7) >> 3) << 3; + } + } + if (backupSize > 0) { + osal_fprintf(rpt->fpUserDataLogfile, "\n"); + } + + tmpBuf = userDataBuf; + userDataNum = (short)((tmpBuf[0] << 8) | (tmpBuf[1] << 0)); + TotalSize = (short)((tmpBuf[2] << 8) | (tmpBuf[3] << 0)); + + osal_fprintf(rpt->fpUserDataLogfile, "User Data Num: [%d]\n", + userDataNum); + osal_fprintf(rpt->fpUserDataLogfile, "User Data Total Size: [%d]\n", + TotalSize); + + tmpBuf = userDataBuf + 8; + for (i = 0; i < userDataNum; i++) { + UserDataType = (short)((tmpBuf[0] << 8) | (tmpBuf[1] << 0)); + UserDataSize = (short)((tmpBuf[2] << 8) | (tmpBuf[3] << 0)); + + if (bitstreamFormat == STD_VC1) { + switch (UserDataType) { + case BDU_SLICE_LEVEL_USER_DATA: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:%s]\n", i, + "BDU_SLICE_LEVEL_USER_DATA"); + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", + UserDataSize); + break; + case BDU_FIELD_LEVEL_USER_DATA: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:%s]\n", i, + "BDU_FIELD_LEVEL_USER_DATA"); + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", + UserDataSize); + break; + case BDU_FRAME_LEVEL_USER_DATA: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:%s]\n", i, + "BDU_FRAME_LEVEL_USER_DATA"); + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", + UserDataSize); + break; + case BDU_ENTRYPOINT_LEVEL_USER_DATA: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:%s]\n", i, + "BDU_ENTRYPOINT_LEVEL_USER_DATA"); + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", + UserDataSize); + break; + case BDU_SEQUENCE_LEVEL_USER_DATA: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:%s]\n", i, + "BDU_SEQUENCE_LEVEL_USER_DATA"); + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", + UserDataSize); + break; + } + } else if (bitstreamFormat == STD_AVC) { + switch (UserDataType) { + case SEI_REGISTERED_ITUTT35_USERDATA: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:%s]\n", i, + "registered_itu_t_t35"); + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", + UserDataSize); + break; + case SEI_UNREGISTERED_USERDATA: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:%s]\n", i, + "unregistered"); + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", + UserDataSize); + break; + + case SEI_MVC_SCALABLE_NESTING: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:%s]\n", i, + "mvc_scalable_nesting"); + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", + UserDataSize); + break; + } + } else if (bitstreamFormat == STD_MPEG2) { + switch (UserDataType) { + case 0: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:Seq]\n", i); + break; + case 1: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:Gop]\n", i); + break; + case 2: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:Pic]\n", i); + break; + default: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:Error]\n", i); + break; + } + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", UserDataSize); + } else if (bitstreamFormat == STD_AVS) { + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:%s]\n", i, + "User Data"); + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", UserDataSize); + } else { + switch (UserDataType) { + case 0: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:Vos]\n", i); + break; + case 1: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:Vis]\n", i); + break; + case 2: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:Vol]\n", i); + break; + case 3: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:Gov]\n", i); + break; + default: + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Type: [%d:Error]\n", i); + break; + } + osal_fprintf(rpt->fpUserDataLogfile, + "User Data Size: [%d]\n", UserDataSize); + } + + tmpBuf += 8; + } + osal_fprintf(rpt->fpUserDataLogfile, "\n"); + + backupSize = 0; + if (backupBuf != NULL) { + osal_free(backupBuf); + } + + backupBuf = 0; +} + +void CheckUserDataInterrupt(Uint32 core_idx, Int32 decodeIdx, + CodStd bitstreamFormat, Int32 int_reason) +{ + vpu_rpt_info_t *rpt = &s_rpt_info[core_idx]; + + if (int_reason & (1 << INT_BIT_USERDATA)) { + // USER DATA INTERRUPT Issued + // User Data save + if (rpt->userDataEnable == TRUE) { + int size; + BYTE *userDataBuf; + size = rpt->vb_rpt.size + USER_DATA_INFO_OFFSET; + userDataBuf = osal_malloc(size); + osal_memset(userDataBuf, 0, size); + + vdi_read_memory(core_idx, rpt->vb_rpt.phys_addr, + userDataBuf, size, VDI_BIG_ENDIAN); + if (decodeIdx >= 0) + SaveUserDataINT(core_idx, userDataBuf, size, 1, + rpt->decIndex, bitstreamFormat); + osal_free(userDataBuf); + } else { + VLOG(ERR, "Unexpected Interrupt issued"); + } + } +} + +void ConfigDecReport(Uint32 core_idx, DecHandle handle) +{ + vpu_rpt_info_t *rpt = &s_rpt_info[core_idx]; + + if (rpt->reportOpened == FALSE) { + return; + } + + // Report Information + if (!rpt->vb_rpt.base) { + rpt->vb_rpt.size = SIZE_REPORT_BUF; + CVI_VC_MEM("vb_rpt.size = 0x%X\n", rpt->vb_rpt.size); + if (VDI_ALLOCATE_MEMORY(core_idx, &rpt->vb_rpt, 0) < 0) { + VLOG(ERR, "fail to allocate report buffer\n"); + return; + } + } + + VPU_DecGiveCommand(handle, SET_ADDR_REP_USERDATA, + &rpt->vb_rpt.phys_addr); + VPU_DecGiveCommand(handle, SET_SIZE_REP_USERDATA, &rpt->vb_rpt.size); + VPU_DecGiveCommand(handle, SET_USERDATA_REPORT_MODE, + &rpt->userDataReportMode); + + if (rpt->userDataEnable == TRUE) { + VPU_DecGiveCommand(handle, ENABLE_REP_USERDATA, 0); + } else { + VPU_DecGiveCommand(handle, DISABLE_REP_USERDATA, 0); + } +} + +void SaveDecReport(Uint32 core_idx, DecOutputInfo *pDecInfo, + CodStd bitstreamFormat) +{ + vpu_rpt_info_t *rpt = &s_rpt_info[core_idx]; + + if (rpt->reportOpened == FALSE) { + return; + } + + // Report Information + + // User Data + if ((pDecInfo->indexFrameDecoded >= 0 || + (bitstreamFormat == STD_VC1)) && + rpt->userDataEnable == TRUE && + pDecInfo->decOutputExtData.userDataSize > 0) { + // Vc1 Frame user data follow picture. After last frame + // decoding, user data should be reported. + Uint32 size = 0; + BYTE *userDataBuf = NULL; + + if (pDecInfo->decOutputExtData.userDataBufFull == TRUE) { + VLOG(ERR, "User Data Buffer is Full\n"); + } + + size = (((pDecInfo->decOutputExtData.userDataSize + 7) >> 3) + << 3) + + USER_DATA_INFO_OFFSET; + userDataBuf = (BYTE *)osal_malloc(size); + osal_memset(userDataBuf, 0, size); + + vdi_read_memory(core_idx, rpt->vb_rpt.phys_addr, userDataBuf, + size, HOST_ENDIAN); + if (pDecInfo->indexFrameDecoded >= 0) { + SaveUserData(core_idx, userDataBuf); + } + osal_free(userDataBuf); + } + + if (((pDecInfo->indexFrameDecoded >= 0 || + (bitstreamFormat == STD_VC1)) && + rpt->userDataEnable) || // Vc1 Frame user data follow picture. + // After last frame decoding, user data + // should be reported. + (pDecInfo->indexFrameDisplay >= 0 && rpt->userDataEnable)) { + Uint32 size = 0; + Uint32 dataSize = 0; + BYTE *userDataBuf = NULL; + + if (pDecInfo->decOutputExtData.userDataBufFull) { + VLOG(ERR, "User Data Buffer is Full\n"); + } + + dataSize = pDecInfo->decOutputExtData.userDataSize % + rpt->vb_rpt.size; + if (dataSize == 0 && + pDecInfo->decOutputExtData.userDataSize != 0) { + dataSize = rpt->vb_rpt.size; + } + + size = (((dataSize + 7) >> 3) << 3) + USER_DATA_INFO_OFFSET; + userDataBuf = (BYTE *)osal_malloc(size); + osal_memset(userDataBuf, 0, size); + vdi_read_memory(core_idx, rpt->vb_rpt.phys_addr, userDataBuf, + size, HOST_ENDIAN); + if (pDecInfo->indexFrameDecoded >= 0 || + (bitstreamFormat == STD_VC1)) { + SaveUserDataINT(core_idx, userDataBuf, size, 0, + rpt->decIndex, bitstreamFormat); + } + osal_free(userDataBuf); + } + + if (pDecInfo->indexFrameDecoded >= 0) { + if (rpt->fpPicTypeLogfile == NULL) { + rpt->fpPicTypeLogfile = osal_fopen(FN_PIC_TYPE, "w+"); + } + osal_fprintf(rpt->fpPicTypeLogfile, "FRAME [%1d]\n", + rpt->decIndex); + + switch (bitstreamFormat) { + case STD_AVC: + if (pDecInfo->pictureStructure == + 3) { // FIELD_INTERLACED + osal_fprintf(rpt->fpPicTypeLogfile, + "Top Field Type: [%s]\n", + pDecInfo->picTypeFirst == 0 ? + "I_TYPE" : + (pDecInfo->picTypeFirst) == 1 ? + "P_TYPE" : + (pDecInfo->picTypeFirst) == 2 ? + "BI_TYPE" : + (pDecInfo->picTypeFirst) == 3 ? + "B_TYPE" : + (pDecInfo->picTypeFirst) == 4 ? + "SKIP_TYPE" : + (pDecInfo->picTypeFirst) == 5 ? + "IDR_TYPE" : + "FORBIDDEN"); + + osal_fprintf( + rpt->fpPicTypeLogfile, + "Bottom Field Type: [%s]\n", + pDecInfo->picType == 0 ? "I_TYPE" : + (pDecInfo->picType) == 1 ? "P_TYPE" : + (pDecInfo->picType) == 2 ? "BI_TYPE" : + (pDecInfo->picType) == 3 ? "B_TYPE" : + (pDecInfo->picType) == 4 ? "SKIP_TYPE" : + (pDecInfo->picType) == 5 ? "IDR_TYPE" : + "FORBIDDEN"); + } else { + osal_fprintf( + rpt->fpPicTypeLogfile, + "Picture Type: [%s]\n", + pDecInfo->picType == 0 ? "I_TYPE" : + (pDecInfo->picType) == 1 ? "P_TYPE" : + (pDecInfo->picType) == 2 ? "BI_TYPE" : + (pDecInfo->picType) == 3 ? "B_TYPE" : + (pDecInfo->picType) == 4 ? "SKIP_TYPE" : + (pDecInfo->picType) == 5 ? "IDR_TYPE" : + "FORBIDDEN"); + } + break; + case STD_MPEG2: + osal_fprintf(rpt->fpPicTypeLogfile, + "Picture Type: [%s]\n", + pDecInfo->picType == 0 ? "I_TYPE" : + pDecInfo->picType == 1 ? "P_TYPE" : + pDecInfo->picType == 2 ? "B_TYPE" : + "D_TYPE"); + break; + case STD_MPEG4: + osal_fprintf(rpt->fpPicTypeLogfile, + "Picture Type: [%s]\n", + pDecInfo->picType == 0 ? "I_TYPE" : + pDecInfo->picType == 1 ? "P_TYPE" : + pDecInfo->picType == 2 ? "B_TYPE" : + "S_TYPE"); + break; + case STD_VC1: + if (pDecInfo->pictureStructure == + 3) { // FIELD_INTERLACED + osal_fprintf(rpt->fpPicTypeLogfile, + "Top Field Type: [%s]\n", + pDecInfo->picTypeFirst == 0 ? + "I_TYPE" : + (pDecInfo->picTypeFirst) == 1 ? + "P_TYPE" : + (pDecInfo->picTypeFirst) == 2 ? + "BI_TYPE" : + (pDecInfo->picTypeFirst) == 3 ? + "B_TYPE" : + (pDecInfo->picTypeFirst) == 4 ? + "SKIP_TYPE" : + "FORBIDDEN"); + + osal_fprintf( + rpt->fpPicTypeLogfile, + "Bottom Field Type: [%s]\n", + pDecInfo->picType == 0 ? "I_TYPE" : + (pDecInfo->picType) == 1 ? "P_TYPE" : + (pDecInfo->picType) == 2 ? "BI_TYPE" : + (pDecInfo->picType) == 3 ? "B_TYPE" : + (pDecInfo->picType) == 4 ? "SKIP_TYPE" : + "FORBIDDEN"); + } else { + osal_fprintf(rpt->fpPicTypeLogfile, + "Picture Type: [%s]\n", + pDecInfo->picType == 0 ? + "I_TYPE" : + (pDecInfo->picTypeFirst) == 1 ? + "P_TYPE" : + (pDecInfo->picTypeFirst) == 2 ? + "BI_TYPE" : + (pDecInfo->picTypeFirst) == 3 ? + "B_TYPE" : + (pDecInfo->picTypeFirst) == 4 ? + "SKIP_TYPE" : + "FORBIDDEN"); + } + break; + default: + osal_fprintf(rpt->fpPicTypeLogfile, + "Picture Type: [%s]\n", + pDecInfo->picType == 0 ? "I_TYPE" : + pDecInfo->picType == 1 ? "P_TYPE" : + "B_TYPE"); + break; + } + } + + if (pDecInfo->indexFrameDecoded >= 0) { + if (rpt->fpPicDispInfoLogfile == NULL) { + rpt->fpPicDispInfoLogfile = + osal_fopen(FN_PIC_INFO, "w+"); + } + osal_fprintf(rpt->fpPicDispInfoLogfile, "FRAME [%1d]\n", + rpt->decIndex); + + switch (bitstreamFormat) { + case STD_MPEG2: + osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", + pDecInfo->picType == 0 ? "I_TYPE" : + pDecInfo->picType == 1 ? "P_TYPE" : + pDecInfo->picType == 2 ? "B_TYPE" : + "D_TYPE"); + break; + case STD_MPEG4: + osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", + pDecInfo->picType == 0 ? "I_TYPE" : + pDecInfo->picType == 1 ? "P_TYPE" : + pDecInfo->picType == 2 ? "B_TYPE" : + "S_TYPE"); + break; + case STD_VC1: + if (pDecInfo->pictureStructure == + 3) { // FIELD_INTERLACED + osal_fprintf(rpt->fpPicDispInfoLogfile, + "Top : %s\n", + (pDecInfo->picType >> 3) == 0 ? + "I_TYPE" : + (pDecInfo->picType >> 3) == 1 ? + "P_TYPE" : + (pDecInfo->picType >> 3) == 2 ? + "BI_TYPE" : + (pDecInfo->picType >> 3) == 3 ? + "B_TYPE" : + (pDecInfo->picType >> 3) == 4 ? + "SKIP_TYPE" : + "FORBIDDEN"); + + osal_fprintf(rpt->fpPicDispInfoLogfile, + "Bottom : %s\n", + (pDecInfo->picType & 0x7) == 0 ? + "I_TYPE" : + (pDecInfo->picType & 0x7) == 1 ? + "P_TYPE" : + (pDecInfo->picType & 0x7) == 2 ? + "BI_TYPE" : + (pDecInfo->picType & 0x7) == 3 ? + "B_TYPE" : + (pDecInfo->picType & 0x7) == 4 ? + "SKIP_TYPE" : + "FORBIDDEN"); + + osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", + "Interlaced Picture"); + } else { + osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", + (pDecInfo->picType >> 3) == 0 ? + "I_TYPE" : + (pDecInfo->picType >> 3) == 1 ? + "P_TYPE" : + (pDecInfo->picType >> 3) == 2 ? + "BI_TYPE" : + (pDecInfo->picType >> 3) == 3 ? + "B_TYPE" : + (pDecInfo->picType >> 3) == 4 ? + "SKIP_TYPE" : + "FORBIDDEN"); + + osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", + "Frame Picture"); + } + break; + default: + osal_fprintf(rpt->fpPicDispInfoLogfile, "%s\n", + pDecInfo->picType == 0 ? "I_TYPE" : + pDecInfo->picType == 1 ? "P_TYPE" : + "B_TYPE"); + break; + } + + if (bitstreamFormat != STD_VC1) { + if (pDecInfo->interlacedFrame) { + if (bitstreamFormat == STD_AVS) { + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "Frame Picture"); + } else { + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", + "Interlaced Picture"); + } + } else { + if (bitstreamFormat == STD_AVS) { + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", + "Interlaced Picture"); + } else { + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "Frame Picture"); + } + } + } + + if (bitstreamFormat != STD_RV) { + if (bitstreamFormat == STD_VC1) { + switch (pDecInfo->pictureStructure) { + case 0: + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "PROGRESSIVE"); + break; + case 2: + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "FRAME_INTERLACE"); + break; + case 3: + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "FIELD_INTERLACE"); + break; + default: + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "FORBIDDEN"); + break; + } + } else if (bitstreamFormat == STD_AVC) { + if (!pDecInfo->interlacedFrame) { + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "FRAME_PICTURE"); + } else { + if (pDecInfo->topFieldFirst) { + osal_fprintf( + rpt->fpPicDispInfoLogfile, + "%s\n", + "Top Field First"); + } else { + osal_fprintf( + rpt->fpPicDispInfoLogfile, + "%s\n", + "Bottom Field First"); + } + } + } else if (bitstreamFormat != STD_MPEG4 && + bitstreamFormat != STD_AVS) { + switch (pDecInfo->pictureStructure) { + case 1: + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "TOP_FIELD"); + break; + case 2: + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "BOTTOM_FIELD"); + break; + case 3: + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "FRAME_PICTURE"); + break; + default: + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "FORBIDDEN"); + break; + } + } + + if (bitstreamFormat != STD_AVC) { + if (pDecInfo->topFieldFirst) { + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", "Top Field First"); + } else { + osal_fprintf(rpt->fpPicDispInfoLogfile, + "%s\n", + "Bottom Field First"); + } + + if (bitstreamFormat != STD_MPEG4) { + if (pDecInfo->repeatFirstField) { + osal_fprintf( + rpt->fpPicDispInfoLogfile, + "%s\n", + "Repeat First Field"); + } else { + osal_fprintf( + rpt->fpPicDispInfoLogfile, + "%s\n", + "Not Repeat First Field"); + } + + if (bitstreamFormat == STD_VC1) { + osal_fprintf( + rpt->fpPicDispInfoLogfile, + "VC1 RPTFRM [%1d]\n", + pDecInfo->progressiveFrame); + } else if (pDecInfo->progressiveFrame) { + osal_fprintf( + rpt->fpPicDispInfoLogfile, + "%s\n", + "Progressive Frame"); + } else { + osal_fprintf( + rpt->fpPicDispInfoLogfile, + "%s\n", + "Interlaced Frame"); + } + } + } + } + + if (bitstreamFormat == STD_MPEG2) { + osal_fprintf(rpt->fpPicDispInfoLogfile, + "Field Sequence [%d]\n\n", + pDecInfo->fieldSequence); + } else { + osal_fprintf(rpt->fpPicDispInfoLogfile, "\n"); + } + + } + + if (pDecInfo->indexFrameDecoded >= 0) { + rpt->decIndex++; + } +} +#endif + +#define DEFAULT_ENC_OUTPUT_NUM 30 + +/******************************************************************************* + * FUNCTIONS RELATED TO CPB * + *******************************************************************************/ +#ifdef REDUNDENT_CODE +int FillBsResetBufHelper(Uint32 core_idx, BYTE *buf, + PhysicalAddress paBsBufAddr, int bsBufsize, int endian) +{ + if (!bsBufsize) + return -1; + VpuReadMem(core_idx, paBsBufAddr, buf, bsBufsize, endian); + return bsBufsize; +} + +RetCode ReadBsRingBufHelper(Uint32 core_idx, EncHandle handle, osal_file_t bsFp, + PhysicalAddress bitstreamBuffer, + Uint32 bitstreamBufferSize, int defaultsize, + int endian) +{ + RetCode ret = RETCODE_SUCCESS; + int loadSize = 0; + PhysicalAddress paRdPtr, paWrPtr; + int size = 0; + PhysicalAddress paBsBufStart = bitstreamBuffer; + PhysicalAddress paBsBufEnd = bitstreamBuffer + bitstreamBufferSize; + + ret = VPU_EncGetBitstreamBuffer(handle, &paRdPtr, &paWrPtr, &size); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "VPU_EncGetBitstreamBuffer failed Error code is 0x%x\n", + ret); + goto LOAD_BS_ERROR; + } + + if (size > 0) { + if (defaultsize > 0) { + if (size < defaultsize) + loadSize = ((size >> 9) << 9); + else + loadSize = defaultsize; + } else { + loadSize = size; + } + + if (loadSize > 0) { + ProcessEncodedBitstreamBurst(core_idx, bsFp, paRdPtr, + paBsBufStart, paBsBufEnd, + loadSize, endian, NULL); + ret = VPU_EncUpdateBitstreamBuffer(handle, loadSize); + if (ret != RETCODE_SUCCESS) { + VLOG(ERR, + "VPU_EncUpdateBitstreamBuffer failed Error code is 0x%x\n", + ret); + goto LOAD_BS_ERROR; + } + } + } + +LOAD_BS_ERROR: + + return ret; +} + +/****************************************************************************** + DPB Image Data Control +******************************************************************************/ +/* THIS FUNCTION WILL BE REMOVED */ +/*lint -save -e438 */ +int LoadYuvImageHelperFormat(Uint32 core_idx, osal_file_t yuvFp, Uint8 *pYuv, + FrameBuffer *fb, TiledMapConfig mapCfg, + int picWidth, int picHeight, int stride, + int format) +{ + int frameSize; + + switch (format) { + case FORMAT_420: + frameSize = (picWidth * picHeight * 3) >> 1; + break; + case FORMAT_224: + frameSize = (picWidth * picHeight * 4) >> 1; + break; + case FORMAT_422: + frameSize = (picWidth * picHeight * 4) >> 1; + break; + case FORMAT_444: + frameSize = (picWidth * picHeight * 6) >> 1; + break; + case FORMAT_400: + frameSize = picWidth * picHeight; + break; + case FORMAT_YUYV: + frameSize = (picWidth * picHeight * 4) >> 1; + picWidth *= 2; + stride *= 2; + break; + default: + frameSize = (picWidth * picHeight * 3) >> 1; + break; + } + + // Load source one picture image to encode to SDRAM frame buffer. + if (!osal_fread(pYuv, 1, frameSize, yuvFp)) { + if (!osal_feof(yuvFp)) + VLOG(ERR, + "Yuv Data osal_fread failed file handle is 0x%x\n", + yuvFp); + return 0; + } + + if (fb->mapType) + LoadTiledImageYuvBurst(core_idx, pYuv, picWidth, picHeight, fb, + mapCfg); + else + LoadYuvImageBurstFormat(core_idx, pYuv, picWidth, picHeight, fb, + TRUE); + + return 1; +} +#endif +/*lint -restore */ + +#if 0 +int SaveYuvImageHelperFormat(Uint32 core_idx, osal_file_t yuvFp, + FrameBuffer *fbSrc, TiledMapConfig mapCfg, + Uint8 *pYuv, VpuRect rect, BOOL enableCrop, + int interLeave, int format, int endian) +{ + int frameSize; + int picWidth; + int picHeight; + + picWidth = enableCrop == TRUE ? (int)(rect.right - rect.left) : + fbSrc->stride; + picHeight = enableCrop == TRUE ? (int)(rect.bottom - rect.top) : + fbSrc->height; + + switch (format) { + case FORMAT_420: + frameSize = picWidth * ((picHeight + 1) / 2 * 2) * 3 / 2; + break; + case FORMAT_224: + frameSize = picWidth * ((picHeight + 1) / 2 * 2) * 4 / 2; + break; + case FORMAT_422: + frameSize = picWidth * picHeight * 4 / 2; + break; + case FORMAT_444: + frameSize = picWidth * picHeight * 6 / 2; + break; + case FORMAT_400: + frameSize = picWidth * picHeight; + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + frameSize = picWidth * 2 * ((picHeight + 1) / 2 * 2) * 3 / 2; + break; + default: + frameSize = picWidth * ((picHeight + 1) / 2 * 2) * 3 / 2; + break; + } + + StoreYuvImageBurstFormat(core_idx, fbSrc, mapCfg, pYuv, rect, + enableCrop, format, endian); + if (yuvFp) { + if (!osal_fwrite(pYuv, sizeof(Uint8), frameSize, yuvFp)) { + VLOG(ERR, + "Frame Data osal_fwrite failed file handle is 0x%x\n", + yuvFp); + return 0; + } + } + + return 1; +} +#endif +#ifdef VC_DRIVER_TEST +int setWaveEncOpenParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig, + ENC_CFG *pCfg) +{ + cviEncCfg *pCviEc = &pEncConfig->cviEc; + Int32 i = 0; + Int32 srcWidth; + Int32 srcHeight; + Int32 outputNum; + + EncHevcParam *param = &pEncOP->EncStdParam.hevcParam; + + srcWidth = (pEncConfig->picWidth > 0) ? pEncConfig->picWidth : + pCfg->hevcCfg.picX; + srcHeight = (pEncConfig->picHeight > 0) ? pEncConfig->picHeight : + pCfg->hevcCfg.picY; + outputNum = + (pEncConfig->outNum > 0) ? pEncConfig->outNum : pCfg->NumFrame; + pEncOP->bitRate = + (pEncConfig->kbps > 0) ? pEncConfig->kbps : pCfg->RcBitRate; + + pEncOP->rcMode = pEncConfig->rcMode; + + pEncOP->statTime = 2; + pEncOP->changePos = + (pEncConfig->changePos > 50 && pEncConfig->changePos < 100) ? + pEncConfig->changePos : + 90; + pEncOP->frmLostOpen = pEncConfig->frmLostOpen; + pEncOP->frmLostBpsThr = pEncOP->bitRate * 1100; + pEncOP->encFrmGaps = 1; + pEncConfig->outNum = outputNum; + pEncOP->picWidth = srcWidth; + pEncOP->picHeight = srcHeight; + pEncOP->frameRateInfo = pCfg->hevcCfg.frameRate; + param->level = 0; + param->tier = 0; + pEncOP->srcBitDepth = pCfg->SrcBitDepth; + + if (pCfg->hevcCfg.internalBitDepth == 0) + param->internalBitDepth = pCfg->SrcBitDepth; + else + param->internalBitDepth = pCfg->hevcCfg.internalBitDepth; + + if (param->internalBitDepth > 8) + param->profile = HEVC_PROFILE_MAIN10; + else + param->profile = HEVC_PROFILE_MAIN; + + param->chromaFormatIdc = 0; + param->losslessEnable = pCfg->hevcCfg.losslessEnable; + param->constIntraPredFlag = pCfg->hevcCfg.constIntraPredFlag; + + if (pCfg->hevcCfg.useAsLongtermPeriod > 0 || + pCfg->hevcCfg.refLongtermPeriod > 0) + param->useLongTerm = 1; + else + param->useLongTerm = 0; + + /* for CMD_ENC_SEQ_GOP_PARAM */ + param->gopPresetIdx = + (pEncConfig->tempLayer == 2) ? 17 : + (pEncConfig->tempLayer == 3) ? 19 : + pCfg->hevcCfg.gopPresetIdx; + + /* for CMD_ENC_SEQ_INTRA_PARAM */ + param->decodingRefreshType = (pEncConfig->decodingRefreshType) ? + pEncConfig->decodingRefreshType : + pCfg->hevcCfg.decodingRefreshType; + param->intraPeriod = (pEncConfig->gopSize) ? pEncConfig->gopSize : + pCfg->hevcCfg.intraPeriod; + + pEncOP->gopSize = param->intraPeriod; + param->intraQP = pCfg->hevcCfg.intraQP; + param->forcedIdrHeaderEnable = pCfg->hevcCfg.forcedIdrHeaderEnable; + CVI_VC_TRACE("gopSize = %d, intraPeriod = %d\n", pEncOP->gopSize, + pCfg->hevcCfg.intraPeriod); + + /* for CMD_ENC_SEQ_CONF_WIN_TOP_BOT/LEFT_RIGHT */ + param->confWinTop = pCfg->hevcCfg.confWinTop; + param->confWinBot = pCfg->hevcCfg.confWinBot; + param->confWinLeft = pCfg->hevcCfg.confWinLeft; + param->confWinRight = pCfg->hevcCfg.confWinRight; + CVI_VC_CFG("confWinBot = %d, confWinRight = %d\n", param->confWinBot, + param->confWinRight); + + /* for CMD_ENC_SEQ_INDEPENDENT_SLICE */ + param->independSliceMode = (pEncConfig->independSliceMode) ? + pEncConfig->independSliceMode : + pCfg->hevcCfg.independSliceMode; + param->independSliceModeArg = + (pEncConfig->independSliceModeArg) ? + (pEncConfig->independSliceModeArg) : + pCfg->hevcCfg.independSliceModeArg; + + CVI_VC_CFG("independSliceMode = %d, independSliceModeArg = %d\n", + param->independSliceMode, param->independSliceModeArg); + + /* for CMD_ENC_SEQ_DEPENDENT_SLICE */ + param->dependSliceMode = pCfg->hevcCfg.dependSliceMode; + param->dependSliceModeArg = pCfg->hevcCfg.dependSliceModeArg; + + /* for CMD_ENC_SEQ_INTRA_REFRESH_PARAM */ + param->intraRefreshMode = pCfg->hevcCfg.intraRefreshMode; + param->intraRefreshArg = pCfg->hevcCfg.intraRefreshArg; + param->useRecommendEncParam = pCfg->hevcCfg.useRecommendEncParam; + + /* for CMD_ENC_PARAM */ + param->scalingListEnable = pCfg->hevcCfg.scalingListEnable; + param->cuSizeMode = pCfg->hevcCfg.cuSizeMode; + param->tmvpEnable = pCfg->hevcCfg.tmvpEnable; + param->wppEnable = pCfg->hevcCfg.wppenable; + param->maxNumMerge = pCfg->hevcCfg.maxNumMerge; + + if (pEncConfig->dynamicMergeEnable) { + param->dynamicMerge8x8Enable = pEncConfig->dynamicMergeEnable; + param->dynamicMerge16x16Enable = pEncConfig->dynamicMergeEnable; + param->dynamicMerge32x32Enable = pEncConfig->dynamicMergeEnable; + } else { + param->dynamicMerge8x8Enable = + pCfg->hevcCfg.dynamicMerge8x8Enable; + param->dynamicMerge16x16Enable = + pCfg->hevcCfg.dynamicMerge16x16Enable; + param->dynamicMerge32x32Enable = + pCfg->hevcCfg.dynamicMerge32x32Enable; + } + + CVI_VC_CFG( + "dynamicMerge8x8Enable = %d, dynamicMerge16x16Enable = %d, dynamicMerge32x32Enable = %d\n", + param->dynamicMerge8x8Enable, param->dynamicMerge16x16Enable, + param->dynamicMerge32x32Enable); + + param->disableDeblk = pCfg->hevcCfg.disableDeblk; + param->lfCrossSliceBoundaryEnable = + pCfg->hevcCfg.lfCrossSliceBoundaryEnable; + param->betaOffsetDiv2 = pCfg->hevcCfg.betaOffsetDiv2; + param->tcOffsetDiv2 = pCfg->hevcCfg.tcOffsetDiv2; + param->skipIntraTrans = pCfg->hevcCfg.skipIntraTrans; + param->saoEnable = pCfg->hevcCfg.saoEnable; + param->intraInInterSliceEnable = pCfg->hevcCfg.intraInInterSliceEnable; + param->intraNxNEnable = pCfg->hevcCfg.intraNxNEnable; +#ifdef SUPPORT_HOST_RC_PARAM + param->hostPicRCEnable = pCfg->hevcCfg.hostPicRcEnable; +#endif + + /* for CMD_ENC_RC_PARAM */ + pEncOP->rcEnable = (pEncConfig->RcEnable >= 0) ? pEncConfig->RcEnable : + pCfg->RcEnable; + CVI_VC_CFG("rcEnable = %d, bitRate = %d\n", pEncOP->rcEnable, + pEncOP->bitRate); + + pEncOP->initialDelay = pCfg->RcInitDelay; + param->cuLevelRCEnable = pCfg->hevcCfg.cuLevelRCEnable; + param->hvsQPEnable = pCfg->hevcCfg.hvsQPEnable; + param->hvsQpScaleEnable = pCfg->hevcCfg.hvsQpScaleEnable; + param->hvsQpScale = pCfg->hevcCfg.hvsQpScale; + + param->ctuOptParam.roiDeltaQp = pCfg->hevcCfg.ctuOptParam.roiDeltaQp; + param->intraQpOffset = pCfg->hevcCfg.intraQpOffset; + CVI_VC_CFG("intraQpOffset = %d\n", param->intraQpOffset); + + param->initBufLevelx8 = pCfg->hevcCfg.initBufLevelx8; + param->bitAllocMode = pCfg->hevcCfg.bitAllocMode; + for (i = 0; i < MAX_GOP_NUM; i++) { + param->fixedBitRatio[i] = pCfg->hevcCfg.fixedBitRatio[i]; + } + + /* for CMD_ENC_RC_MIN_MAX_QP */ + pEncOP->userQpMinP = pCfg->hevcCfg.minQp; + pEncOP->userQpMaxP = pCfg->hevcCfg.maxQp; + param->maxDeltaQp = pCfg->hevcCfg.maxDeltaQp; + param->transRate = pCfg->hevcCfg.transRate; + param->gopParam.enTemporalLayerQp = + pCfg->hevcCfg.gopParam.enTemporalLayerQp; + param->gopParam.tidQp0 = pCfg->hevcCfg.gopParam.tidQp0; + param->gopParam.tidQp1 = pCfg->hevcCfg.gopParam.tidQp1; + param->gopParam.tidQp2 = pCfg->hevcCfg.gopParam.tidQp2; + param->gopParam.tidPeriod0 = (pEncConfig->tempLayer == 2) ? 2 : + (pEncConfig->tempLayer == 3) ? 4 : + 1; + /* for CMD_ENC_CUSTOM_GOP_PARAM */ + param->gopParam.customGopSize = pCfg->hevcCfg.gopParam.customGopSize; + param->gopParam.useDeriveLambdaWeight = + (pEncConfig->useDeriveLambdaWeight) ? + pEncConfig->useDeriveLambdaWeight : + pCfg->hevcCfg.gopParam.useDeriveLambdaWeight; + + for (i = 0; i < param->gopParam.customGopSize; i++) { + param->gopParam.picParam[i].picType = + pCfg->hevcCfg.gopParam.picParam[i].picType; + param->gopParam.picParam[i].pocOffset = + pCfg->hevcCfg.gopParam.picParam[i].pocOffset; + param->gopParam.picParam[i].picQp = + pCfg->hevcCfg.gopParam.picParam[i].picQp; + param->gopParam.picParam[i].refPocL0 = + pCfg->hevcCfg.gopParam.picParam[i].refPocL0; + param->gopParam.picParam[i].refPocL1 = + pCfg->hevcCfg.gopParam.picParam[i].refPocL1; + param->gopParam.picParam[i].temporalId = + pCfg->hevcCfg.gopParam.picParam[i].temporalId; + param->gopParam.gopPicLambda[i] = + pCfg->hevcCfg.gopParam.gopPicLambda[i]; + } + + param->ctuOptParam.roiEnable = pCfg->hevcCfg.ctuOptParam.roiEnable; + param->ctuOptParam.ctuQpEnable = pCfg->hevcCfg.ctuOptParam.ctuQpEnable; + param->ctuOptParam.ctuModeEnable = + pCfg->hevcCfg.ctuOptParam.ctuModeEnable; + + // VPS & VUI + param->numUnitsInTick = pCfg->hevcCfg.numUnitsInTick; + param->timeScale = pCfg->hevcCfg.timeScale; + param->numTicksPocDiffOne = pCfg->hevcCfg.numTicksPocDiffOne; + + param->vuiParam.vuiParamFlags = pCfg->hevcCfg.vuiParam.vuiParamFlags; + param->vuiParam.vuiAspectRatioIdc = + pCfg->hevcCfg.vuiParam.vuiAspectRatioIdc; + param->vuiParam.vuiSarSize = pCfg->hevcCfg.vuiParam.vuiSarSize; + param->vuiParam.vuiOverScanAppropriate = + pCfg->hevcCfg.vuiParam.vuiOverScanAppropriate; + param->vuiParam.videoSignal = pCfg->hevcCfg.vuiParam.videoSignal; + param->vuiParam.vuiChromaSampleLoc = + pCfg->hevcCfg.vuiParam.vuiChromaSampleLoc; + param->vuiParam.vuiDispWinLeftRight = + pCfg->hevcCfg.vuiParam.vuiDispWinLeftRight; + param->vuiParam.vuiDispWinTopBottom = + pCfg->hevcCfg.vuiParam.vuiDispWinTopBottom; + + pEncOP->encodeVuiRbsp = pCfg->hevcCfg.vuiDataEnable; + pEncOP->vuiRbspDataSize = pCfg->hevcCfg.vuiDataSize; + pEncOP->encodeHrdRbspInVPS = pCfg->hevcCfg.hrdInVPS; + pEncOP->hrdRbspDataSize = pCfg->hevcCfg.hrdDataSize; + pEncOP->encodeHrdRbspInVUI = pCfg->hevcCfg.hrdInVUI; + + param->chromaCbQpOffset = pCfg->hevcCfg.chromaCbQpOffset; + param->chromaCrQpOffset = pCfg->hevcCfg.chromaCrQpOffset; + param->initialRcQp = (pCviEc->firstFrmstartQp > -1) ? + pCviEc->firstFrmstartQp : + pCfg->hevcCfg.initialRcQp; + CVI_VC_CFG("firstFrmstartQp = %d, initialRcQp = %d\n", + pCviEc->firstFrmstartQp, pCfg->hevcCfg.initialRcQp); + + param->nrYEnable = pCfg->hevcCfg.nrYEnable; + param->nrCbEnable = pCfg->hevcCfg.nrCbEnable; + param->nrCrEnable = pCfg->hevcCfg.nrCrEnable; + param->nrNoiseEstEnable = pCfg->hevcCfg.nrNoiseEstEnable; + param->nrNoiseSigmaY = pCfg->hevcCfg.nrNoiseSigmaY; + param->nrNoiseSigmaCb = pCfg->hevcCfg.nrNoiseSigmaCb; + param->nrNoiseSigmaCr = pCfg->hevcCfg.nrNoiseSigmaCr; + param->nrIntraWeightY = pCfg->hevcCfg.nrIntraWeightY; + param->nrIntraWeightCb = pCfg->hevcCfg.nrIntraWeightCb; + param->nrIntraWeightCr = pCfg->hevcCfg.nrIntraWeightCr; + param->nrInterWeightY = pCfg->hevcCfg.nrInterWeightY; + param->nrInterWeightCb = pCfg->hevcCfg.nrInterWeightCb; + param->nrInterWeightCr = pCfg->hevcCfg.nrInterWeightCr; + + pEncOP->userQpMinI = pCfg->hevcCfg.intraMinQp; + pEncOP->userQpMaxI = pCfg->hevcCfg.intraMaxQp; + + // avbr + pEncOP->picMotionLevel = 32; + pEncOP->minStillPercent = 10; + pEncOP->motionSensitivy = 30; + + pEncOP->avbrFrmLostOpen = 0; + pEncOP->pureStillThr = 4; + pEncOP->avbrFrmGaps = 1; + + pEncOP->maxIprop = -1; // not support + return 1; +} + +int setCoda9EncOpenParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig, + ENC_CFG *pCfg) +{ + Int32 bitFormat; + Int32 srcWidth; + Int32 srcHeight; + Int32 outputNum; + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + bitFormat = pEncOP->bitstreamFormat; + + srcWidth = + (pEncConfig->picWidth > 0) ? pEncConfig->picWidth : pCfg->PicX; + srcHeight = (pEncConfig->picHeight > 0) ? pEncConfig->picHeight : + pCfg->PicY; + outputNum = + (pEncConfig->outNum > 0) ? pEncConfig->outNum : pCfg->NumFrame; + + pEncConfig->outNum = outputNum; + osal_memcpy(pEncConfig->skipPicNums, pCfg->skipPicNums, + sizeof(pCfg->skipPicNums)); + pEncOP->picWidth = srcWidth; + pEncOP->picHeight = srcHeight; + pEncOP->frameRateInfo = pCfg->FrameRate; + pEncOP->bitRate = + (pEncConfig->kbps > 0) ? pEncConfig->kbps : pCfg->RcBitRate; + pEncOP->rcMode = pEncConfig->rcMode; + + pEncOP->statTime = 2; + pEncOP->changePos = + (pEncConfig->changePos > 50 && pEncConfig->changePos < 100) ? + pEncConfig->changePos : + 90; + pEncOP->frmLostOpen = pEncConfig->frmLostOpen; + pEncOP->frmLostBpsThr = pEncOP->bitRate * 1200; + pEncOP->encFrmGaps = 1; + pEncConfig->picQpY = + (pEncConfig->picQpY >= 0) ? pEncConfig->picQpY : pCfg->PicQpY; + CVI_VC_TRACE("picQpY = %d, PicQpY = %d\n", pEncConfig->picQpY, + pCfg->PicQpY); + + pEncOP->rcInitDelay = pCfg->RcInitDelay; + pEncOP->vbvBufferSize = pCfg->RcBufSize; + // for compare with C-model ( C-model = only 1 ) + pEncOP->frameSkipDisable = pCfg->frameSkipDisable; + // for compare with C-model ( C-model = only 0 ) + pEncOP->meBlkMode = pCfg->MeBlkModeEnable; + + CVI_VC_TRACE("gopSize = %d, GopPicNum = %d\n", pEncConfig->gopSize, + pCfg->GopPicNum); + pEncOP->gopSize = + (pEncConfig->gopSize) ? pEncConfig->gopSize : pCfg->GopPicNum; + pEncOP->idrInterval = pCfg->IDRInterval; + pEncOP->sliceMode.sliceMode = pCfg->SliceMode; + pEncOP->sliceMode.sliceSizeMode = pCfg->SliceSizeMode; + pEncOP->sliceMode.sliceSize = pCfg->SliceSizeNum; + pEncOP->intraRefreshNum = pCfg->IntraRefreshNum; + pEncOP->ConscIntraRefreshEnable = pCfg->ConscIntraRefreshEnable; + pEncOP->CountIntraMbEnable = pCfg->CountIntraMbEnable; + pEncOP->FieldSeqIntraRefreshEnable = pCfg->FieldSeqIntraRefreshEnable; + pEncOP->rcIntraQp = pCfg->RCIntraQP; + pEncOP->intraCostWeight = pCfg->intraCostWeight; + pEncOP->rcGopIQpOffsetEn = pCfg->RcGopIQpOffsetEn; + pEncOP->rcGopIQpOffset = pCfg->RcGopIQpOffset; + strcpy(pEncOP->paramChange.pchChangeCfgFileName, + pCfg->pchChangeCfgFileName); + pEncOP->paramChange.ChangeFrameNum = pCfg->ChangeFrameNum; + + if (bitFormat == STD_AVC && pEncOP->EncStdParam.avcParam.mvcExtension) { + pEncOP->EncStdParam.avcParam.interviewEn = pCfg->interviewEn; + pEncOP->EncStdParam.avcParam.parasetRefreshEn = + pCfg->parasetRefreshEn; + pEncOP->EncStdParam.avcParam.prefixNalEn = pCfg->prefixNalEn; + } + +#ifdef CODA980 + pEncOP->MESearchRangeX = 3; //pCfg->SearchRangeX; + pEncOP->MESearchRangeY = 2; //pCfg->SearchRangeY; +#else + pEncOP->MESearchRangeY = pCfg->SearchRangeY; + pEncOP->MESearchRangeX = pCfg->SearchRangeX; +#endif + CVI_VC_TRACE("MESearchRangeX = %d, MESearchRangeY = %d\n", + pEncOP->MESearchRangeX, pEncOP->MESearchRangeY); + + pEncOP->maxIntraSize = pCfg->RcMaxIntraSize; + pEncOP->rcEnable = (pEncConfig->RcEnable >= 0) ? pEncConfig->RcEnable : + pCfg->RcEnable; + if (!pEncOP->rcEnable) + pEncOP->bitRate = 0; + + CVI_VC_TRACE("RcEnable = %d, bitRate = %d bps\n", pCfg->RcEnable, + pEncOP->bitRate); + + pEncOP->maxIprop = pCviEc->u32MaxIprop; + CVI_VC_TRACE("maxIprop = %d\n", pEncOP->maxIprop); + + if (!pCfg->GammaSetEnable) + pEncOP->userGamma = -1; + else + pEncOP->userGamma = pCfg->Gamma; + pEncOP->MEUseZeroPmv = pCfg->MeUseZeroPmv; + /* It was agreed that the statements below would be used. but Cmodel at + r25518 is not changed yet according to the statements below if (bitFormat == + STD_MPEG4) pEncOP->MEUseZeroPmv = 1; else pEncOP->MEUseZeroPmv = 0; + */ + // MP4 263 Only + if (!pCfg->ConstantIntraQPEnable) + pEncOP->rcIntraQp = -1; + + if (pCfg->MaxQpSetEnable) + pEncOP->userQpMax = pCfg->MaxQp; + else + pEncOP->userQpMax = -1; + // H.264 Only + if (bitFormat == STD_AVC) { + if (pCfg->MaxQpSetEnable) + pEncOP->userQpMaxI = pEncOP->userQpMaxP = pCfg->MaxQp; + else + pEncOP->userQpMaxI = pEncOP->userQpMaxP = 51; + + if (pCfg->MinQpSetEnable) + pEncOP->userQpMinI = pEncOP->userQpMinP = pCfg->MinQp; + else + pEncOP->userQpMinI = pEncOP->userQpMinP = 12; + + if (pCfg->MaxDeltaQpSetEnable) + pEncOP->userMaxDeltaQp = pCfg->MaxDeltaQp; + else + pEncOP->userMaxDeltaQp = -1; + + if (pCfg->MinDeltaQpSetEnable) + pEncOP->userMinDeltaQp = pCfg->MinDeltaQp; + else + pEncOP->userMinDeltaQp = -1; + } + pEncOP->rcIntervalMode = pCfg->rcIntervalMode; // 0:normal, + // 1:frame_level, + // 2:slice_level, 3: user + // defined Mb_level + pEncOP->mbInterval = pCfg->RcMBInterval; // FIXME + + // Standard specific +#ifdef REDUNDENT_CODE + if (bitFormat == STD_MPEG4) { + pEncOP->EncStdParam.mp4Param.mp4DataPartitionEnable = + pCfg->DataPartEn; + pEncOP->EncStdParam.mp4Param.mp4ReversibleVlcEnable = + pCfg->RevVlcEn; + pEncOP->EncStdParam.mp4Param.mp4IntraDcVlcThr = + pCfg->IntraDcVlcThr; + pEncOP->EncStdParam.mp4Param.mp4HecEnable = pCfg->HecEnable; + pEncOP->EncStdParam.mp4Param.mp4Verid = pCfg->VerId; + } else if (bitFormat == STD_H263) { + pEncOP->EncStdParam.h263Param.h263AnnexIEnable = pCfg->AnnexI; + pEncOP->EncStdParam.h263Param.h263AnnexJEnable = pCfg->AnnexJ; + pEncOP->EncStdParam.h263Param.h263AnnexKEnable = pCfg->AnnexK; + pEncOP->EncStdParam.h263Param.h263AnnexTEnable = pCfg->AnnexT; + } else +#endif + if (bitFormat == STD_AVC) { + pEncOP->EncStdParam.avcParam.constrainedIntraPredFlag = + pCfg->ConstIntraPredFlag; + pEncOP->EncStdParam.avcParam.disableDeblk = pCfg->DisableDeblk; + pEncOP->EncStdParam.avcParam.deblkFilterOffsetAlpha = + pCfg->DeblkOffsetA; + pEncOP->EncStdParam.avcParam.deblkFilterOffsetBeta = + pCfg->DeblkOffsetB; + pEncOP->EncStdParam.avcParam.chromaQpOffset = + pCfg->ChromaQpOffset; + pEncOP->EncStdParam.avcParam.audEnable = pCfg->aud_en; + pEncOP->EncStdParam.avcParam.frameCroppingFlag = + pCfg->frameCroppingFlag; + pEncOP->EncStdParam.avcParam.frameCropLeft = + pCfg->frameCropLeft; + pEncOP->EncStdParam.avcParam.frameCropRight = + pCfg->frameCropRight; + pEncOP->EncStdParam.avcParam.frameCropTop = pCfg->frameCropTop; + pEncOP->EncStdParam.avcParam.frameCropBottom = + pCfg->frameCropBottom; + pEncOP->EncStdParam.avcParam.level = pCfg->level; + + // Update cropping information : Usage example for H.264 + // frame_cropping_flag + if ((pEncOP->picHeight % 16) != 0) { + // In case of AVC encoder, when we want to use unaligned + // display width(For example, 1080), frameCroppingFlag + // parameters should be adjusted to displayable + // rectangle + if (pEncConfig->rotAngle != 90 && + pEncConfig->rotAngle != 270) { + // except rotation + if (pEncOP->EncStdParam.avcParam + .frameCroppingFlag == 0) { + pEncOP->EncStdParam.avcParam + .frameCroppingFlag = 1; + // frameCropBottomOffset = + // picHeight(MB-aligned) - displayable + // rectangle height + pEncOP->EncStdParam.avcParam + .frameCropBottom = + (((pEncOP->picHeight + 15) >> 4) + << 4) - + pEncOP->picHeight; + } + } + } + + // ENCODE SEQUENCE HEADER + pEncOP->EncStdParam.avcParam.ppsParam[0].ppsId = 0; + pEncOP->EncStdParam.avcParam.ppsParam[0].entropyCodingMode = + pCfg->entropyCodingMode; // 0 : CAVLC, 1 : CABAC + pEncOP->EncStdParam.avcParam.ppsParam[0].cabacInitIdc = + pCfg->cabacInitIdc; + pEncOP->EncStdParam.avcParam.ppsParam[0].transform8x8Mode = + pCfg->transform8x8Mode; + pEncOP->EncStdParam.avcParam.ppsNum = 1; + pEncOP->EncStdParam.avcParam.chromaFormat400 = + pCfg->chroma_format_400; + pEncOP->EncStdParam.avcParam.fieldFlag = pCfg->field_flag; + pEncOP->EncStdParam.avcParam.fieldRefMode = + pCfg->field_ref_mode; + + if (pCfg->transform8x8Mode == 1 || pCfg->chroma_format_400 == 1) + pEncOP->EncStdParam.avcParam.profile = + CVI_H264E_PROFILE_HIGH; + else if (pCfg->entropyCodingMode >= 1 || pCfg->field_flag == 1) + pEncOP->EncStdParam.avcParam.profile = + CVI_H264E_PROFILE_MAIN; + else + pEncOP->EncStdParam.avcParam.profile = + CVI_H264E_PROFILE_BASELINE; + + pEncOP->gopPreset = (pEncConfig->tempLayer > 0) ? + pEncConfig->tempLayer : + pCfg->GopPreset; + + if (pEncOP->gopPreset > 0) { + pCfg->GopPreset = pEncOP->gopPreset; + set_gop_info(pCfg); + } + memcpy(pEncOP->gopEntry, pCfg->gop_entry, + sizeof(gop_entry_t) * MAX_GOP_SIZE); + pEncOP->set_dqp_pic_num = pCfg->set_dqp_pic_num; + + pEncOP->LongTermPeriod = pCfg->LongTermPeriod; + pEncOP->LongTermDeltaQp = pCfg->LongTermDeltaQp; + pEncOP->VirtualIPeriod = pCfg->VirtualIPeriod; + pEncOP->HvsQpScaleDiv2 = pCfg->HvsQpScaleDiv2; + pEncOP->EnHvsQp = pCfg->EnHvsQp; + pEncOP->EnRowLevelRc = pCfg->EnRowLevelRc; + pEncOP->RcInitialQp = (pCviEc->firstFrmstartQp > -1) ? + pCviEc->firstFrmstartQp : + pCfg->RcInitialQp; + pEncOP->RcHvsMaxDeltaQp = pCfg->RcHvsMaxDeltaQp; + // avbr + pEncOP->picMotionLevel = 32; + pEncOP->minStillPercent = 10; + pEncOP->motionSensitivy = 30; + pEncOP->avbrFrmLostOpen = 0; + pEncOP->pureStillThr = 4; + pEncOP->avbrFrmGaps = 1; +#ifdef ROI_MB_RC + pEncOP->roi_max_delta_qp_minus = pCfg->roi_max_delta_qp_minus; + pEncOP->roi_max_delta_qp_plus = pCfg->roi_max_delta_qp_plus; +#endif +#ifdef AUTO_FRM_SKIP_DROP + pEncOP->enAutoFrmSkip = pCfg->enAutoFrmSkip; + pEncOP->enAutoFrmDrop = pCfg->enAutoFrmDrop; + pEncOP->vbvThreshold = pCfg->vbvThreshold; + pEncOP->qpThreshold = pCfg->qpThreshold; + pEncOP->maxContinuosFrameDropNum = + pCfg->maxContinuosFrameDropNum; + pEncOP->maxContinuosFrameSkipNum = + pCfg->maxContinuosFrameSkipNum; +#endif + pEncOP->rcWeightFactor = pCfg->rcWeightFactor; + + // ROI + pEncOP->coda9RoiEnable = pCfg->coda9RoiEnable; + pEncOP->RoiPicAvgQp = pCfg->RoiPicAvgQp; + } else { + VLOG(ERR, "Invalid codec standard mode\n"); + return 0; + } + return 1; +} +#endif +#if 0 +void changeRcParaTest(Uint32 core_idx, EncHandle handle, osal_file_t bsFp, + EncParam *pEncParam, EncHeaderParam *pEncHeaderParam, + TestEncConfig *pEncConfig, EncOpenParam *pEncOP) +{ + int optionNum; + + while (1) { + printf("\n 0: GOP number change\n"); + printf(" 1: Intra Qp change\n"); + printf(" 2: Bit Rate change\n"); + printf(" 3: Frame Rate change\n"); + printf(" 4: Intra Refresh Number change\n"); + printf(" 5: Slice Mode change\n"); + if (pEncOP->bitstreamFormat == STD_MPEG4) { + printf(" 6: HEC Mode change\n"); + } + + printf(" 9: go encoding\n"); + scanf("%d", &optionNum); + + switch (optionNum) { + case 0: { + int newGopNum = 0; + printf("\n New Gop Number="); + scanf("%d", &newGopNum); + VPU_EncGiveCommand(handle, ENC_SET_GOP_NUMBER, + &newGopNum); + } break; + case 1: { + int newIntraQp = 0; + printf("\n New Intra Qp value="); + scanf("%d", &newIntraQp); + VPU_EncGiveCommand(handle, ENC_SET_INTRA_QP, + &newIntraQp); + } break; + case 2: { + int newBitrate = 0; + printf("\n New Bit Rate="); + scanf("%d", &newBitrate); + VPU_EncGiveCommand(handle, ENC_SET_BITRATE, + &newBitrate); + } break; + case 3: { + int newFramerate = 0; + printf("\n New Frame Rate="); + scanf("%d", &newFramerate); + VPU_EncGiveCommand(handle, ENC_SET_FRAME_RATE, + &newFramerate); + if (pEncOP->bitstreamFormat == STD_MPEG4) { + pEncHeaderParam->headerType = VOL_HEADER; + VPU_EncGiveCommand(handle, ENC_PUT_VIDEO_HEADER, + pEncHeaderParam); +#ifdef SUPPORT_FFMPEG_DEMUX + if (pEncOP->ringBufferEnable == 0 && + !pEncConfig->en_container) +#else + if (pEncOP->ringBufferEnable == 0) +#endif + { +#if 0 + if (!ReadBsResetBufHelper( + core_idx, bsFp, + pEncHeaderParam->buf, + pEncHeaderParam->size, + pEncOP->streamEndian)) + break; +#else + BitstreamReader_Act( + bsReader, core_idx, + pEncHeaderParam->buf, + pEncHeaderParam->size, + pEncOP->streamEndian, + comparator); +#endif + } + } + } break; + case 4: { + int newIntraRefreshNum = 0; + printf("\n New Intra Refresh Number="); + scanf("%d", &newIntraRefreshNum); + VPU_EncGiveCommand(handle, + ENC_SET_INTRA_MB_REFRESH_NUMBER, + &newIntraRefreshNum); + } break; + case 5: { + EncSliceMode newSlice; + printf("\n New Slice Mode[0:one slice, 1:muliple slice]="); + scanf("%d", &newSlice.sliceMode); + if (!newSlice.sliceMode) { + newSlice.sliceSizeMode = 0; + newSlice.sliceSize = 0; + } else { + printf("\n New Slice Size Mode[0:bit number, 1:mb number]="); + scanf("%d", &newSlice.sliceSizeMode); + if (!newSlice.sliceSizeMode) { + printf("\n New Slice bit number="); + } else { + printf("\n New Slice MB number="); + } + scanf("%d", &newSlice.sliceSize); + } + + VPU_EncGiveCommand(handle, ENC_SET_SLICE_INFO, + &newSlice); + } break; + case 6: { + int newHecMode = 0; + printf("\n New Hec Mode Enable[0:disable, 1:enable]="); + scanf("%d", &newHecMode); + if (newHecMode > 0) { + VPU_EncGiveCommand(handle, ENC_ENABLE_HEC, + &newHecMode); + } else { + VPU_EncGiveCommand(handle, ENC_DISABLE_HEC, + &newHecMode); + } + + } break; + default: + break; + } + if (optionNum == 9) + break; + } +} +#endif + +static int get_entropy_coding_mode(const cviH264Entropy *pEntropy) +{ + if (pEntropy->entropyEncModeI == 0 && pEntropy->entropyEncModeP == 0) + return CVI_CAVLC; + else if (pEntropy->entropyEncModeI == 1 && + pEntropy->entropyEncModeP == 1) + return CVI_CABAC; + else + return CVI_CABAC; +} + +/****************************************************************************** +EncOpenParam Initialization +******************************************************************************/ +/** + * To init EncOpenParam by runtime evaluation + * IN + * EncConfigParam *pEncConfig + * OUT + * EncOpenParam *pEncOP + */ +Int32 GetEncOpenParamDefault(EncOpenParam *pEncOP, TestEncConfig *pEncConfig) +{ + cviEncCfg *pCviEc = &pEncConfig->cviEc; + int bitFormat; + int frameRateDiv, frameRateRes; + + pEncConfig->outNum = pEncConfig->outNum == 0 ? DEFAULT_ENC_OUTPUT_NUM : + pEncConfig->outNum; + + bitFormat = pEncOP->bitstreamFormat; + + pEncOP->picWidth = pEncConfig->picWidth; + pEncOP->picHeight = pEncConfig->picHeight; + pEncOP->gopSize = pCviEc->gop; + + CVI_VC_CFG("picWidth = %d, picHeight = %d\n", pEncConfig->picWidth, + pEncConfig->picHeight); + CVI_VC_CFG("secondary_axi = 0x%X, lineBufIntEnbitRate = %d\n", + pEncConfig->secondary_axi, pEncConfig->lineBufIntEn); + + frameRateDiv = (pCviEc->framerate >> 16); + frameRateRes = pCviEc->framerate & 0xFFFF; + + if (frameRateDiv == 0) { + pEncOP->frameRateInfo = pCviEc->framerate; + } else { + pEncOP->frameRateInfo = + ((frameRateDiv - 1) << 16) + frameRateRes; + } + + pEncOP->maxIntraSize = 0; + + pEncOP->bitRate = (pCviEc->rcMode == RC_MODE_CBR || + pCviEc->rcMode == RC_MODE_UBR) ? + pCviEc->bitrate : + pCviEc->maxbitrate; + + CVI_VC_CFG("rcMode = %d,\n", pCviEc->rcMode); + CVI_VC_CFG("bitRate = %d, framerate = %d\n", pCviEc->bitrate, + pEncOP->frameRateInfo); + CVI_VC_CFG("statTime = %d, maxbitrate = %d\n", pCviEc->statTime, + pCviEc->maxbitrate); + + pEncOP->vbvBufferSize = 0; // 0 = ignore + pEncOP->meBlkMode = 0; // for compare with C-model ( C-model = only 0 ) + pEncOP->frameSkipDisable = + 0; // for compare with C-model ( C-model = only 1 ) + pEncOP->sliceMode.sliceSizeMode = 1; + pEncOP->sliceMode.sliceSize = 115; + pEncOP->intraRefreshNum = 0; + pEncOP->rcIntraQp = -1; // disable == -1 + pEncOP->userQpMax = -1; // disable == -1 + + pCviEc->cviRcEn = 1; + + pEncOP->cviRcEn = pCviEc->cviRcEn; + CVI_VC_CFG("cviRcEn = %d\n", pCviEc->cviRcEn); + + pEncOP->rcMode = pCviEc->rcMode; + pEncOP->statTime = pCviEc->statTime; + + // for VBR, AVBR + pEncOP->changePos = pEncConfig->changePos; + CVI_VC_CFG("statTime = %d, changePos = %d\n", pEncOP->statTime, + pEncOP->changePos); + + // for AVBR + pEncOP->picMotionLevel = 32; + pEncOP->picDciLv = 0; + pEncOP->minStillPercent = pCviEc->s32MinStillPercent; + pEncOP->motionSensitivy = pCviEc->u32MotionSensitivity; + pEncOP->maxStillQp = pCviEc->u32MaxStillQP; + pEncOP->avbrFrmLostOpen = pCviEc->s32AvbrFrmLostOpen; + pEncOP->pureStillThr = pCviEc->s32AvbrPureStillThr; + pEncOP->avbrFrmGaps = pCviEc->s32AvbrFrmGap; + // pEncOP->bBgEnhanceEn = pCviEc->bBgEnhanceEn; + // pEncOP->s32BgDeltaQp = pCviEc->s32BgDeltaQp; + + CVI_VC_CFG("picMotionLevel = %d\n", pEncOP->picMotionLevel); + CVI_VC_CFG("StillPercent = %d, StillQP = %d, MotionSensitivity = %d\n", + pCviEc->s32MinStillPercent, pCviEc->u32MaxStillQP, + pCviEc->u32MotionSensitivity); + CVI_VC_CFG("FrmLostOpen = %d, FrmGap = %d, PureStillThr = %d\n", + pCviEc->s32AvbrFrmLostOpen, pCviEc->s32AvbrFrmGap, + pCviEc->s32AvbrPureStillThr); + + pEncOP->frmLostBpsThr = 0; + pEncOP->frmLostOpen = pEncConfig->frmLostOpen; + pEncOP->frmLostMode = 1; // only support P_SKIP + pEncOP->encFrmGaps = pCviEc->encFrmGaps; + pEncOP->frmLostBpsThr = pCviEc->frmLostBpsThr; + pEncOP->minQpDelta = -1; + + pEncConfig->picQpY = pCviEc->iqp; + + if (bitFormat == STD_AVC) { + setAvcEncDefaultParam(pEncOP, pEncConfig); + } else if (bitFormat == STD_HEVC) { + setHevcEncDefaultParam(pEncOP, pEncConfig); + } else { + VLOG(ERR, "Invalid codec standard mode: codec index(%d)\n", + bitFormat); + return 0; + } + + pEncOP->EncStdParam.avcParam.interviewEn = 0; + pEncOP->EncStdParam.avcParam.parasetRefreshEn = 0; + pEncOP->EncStdParam.avcParam.prefixNalEn = 0; + + pEncOP->svc_enable = pCviEc->svcEnable; + pEncOP->fg_protect_en = pCviEc->svcParam.fg_protect_en; + pEncOP->fg_dealt_qp = pCviEc->svcParam.fg_dealt_qp; + pEncOP->complex_scene_detect_en = pCviEc->svcParam.complex_scene_detect_en; + pEncOP->complex_scene_low_th = pCviEc->svcParam.complex_scene_low_th; + pEncOP->complex_scene_hight_th = pCviEc->svcParam.complex_scene_hight_th; + pEncOP->middle_min_percent = pCviEc->svcParam.middle_min_percent; + pEncOP->complex_min_percent = pCviEc->svcParam.complex_min_percent; + pEncOP->smart_ai_en = pCviEc->svcParam.smart_ai_en; + return 1; +} + +static void setAvcEncDefaultParam(EncOpenParam *pEncOP, + TestEncConfig *pEncConfig) +{ + EncAvcParam *pAvcParam = &pEncOP->EncStdParam.avcParam; + AvcPpsParam *pPpsParam = &pEncOP->EncStdParam.avcParam.ppsParam[0]; + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + pAvcParam->constrainedIntraPredFlag = 0; + pAvcParam->disableDeblk = pCviEc->h264Dblk.disable_deblocking_filter_idc; + pAvcParam->deblkFilterOffsetAlpha = pCviEc->h264Dblk.slice_alpha_c0_offset_div2; + pAvcParam->deblkFilterOffsetBeta = pCviEc->h264Dblk.slice_beta_offset_div2; + pAvcParam->chromaQpOffset = pCviEc->h264Trans.chroma_qp_index_offset; + pAvcParam->audEnable = 0; + pAvcParam->frameCroppingFlag = 0; + pAvcParam->frameCropLeft = 0; + pAvcParam->frameCropRight = 0; + pAvcParam->frameCropTop = 0; + pAvcParam->frameCropBottom = 0; + pAvcParam->level = 0; + + // Update cropping information : Usage example for H.264 + // frame_cropping_flag + if ((pEncOP->picWidth % 16) != 0 || (pEncOP->picHeight % 16) != 0) { + // In case of AVC encoder, when we want to use unaligned + // display width(For example, 1080), frameCroppingFlag + // parameters should be adjusted to displayable + // rectangle + if (pEncConfig->rotAngle != 90 && pEncConfig->rotAngle != 270) { + // except rotation + if (pAvcParam->frameCroppingFlag == 0) { + pAvcParam->frameCroppingFlag = 1; + + if ((pEncOP->picWidth % 16) != 0) { + pAvcParam->frameCropRight = + (((pEncOP->picWidth + 15) >> 4) + << 4) - + pEncOP->picWidth; + } + + if ((pEncOP->picHeight % 16) != 0) { + pAvcParam->frameCropBottom = + (((pEncOP->picHeight + 15) >> 4) + << 4) - + pEncOP->picHeight; + } + } + } + } + + pPpsParam->ppsId = 0; + pPpsParam->entropyCodingMode = + get_entropy_coding_mode(&pCviEc->h264Entropy); + pPpsParam->cabacInitIdc = pCviEc->h264Entropy.cabac_init_idc; + pPpsParam->transform8x8Mode = + (pCviEc->u32Profile == CVI_H264E_PROFILE_HIGH); + CVI_VC_CFG("u32Profile = %d, entropy = %d, transform8x8Mode = %d\n", + pCviEc->u32Profile, pPpsParam->entropyCodingMode, + pPpsParam->transform8x8Mode); + + pAvcParam->profile = pCviEc->u32Profile; + pAvcParam->ppsNum = 1; + pAvcParam->chromaFormat400 = 0; + pAvcParam->fieldFlag = 0; + pAvcParam->fieldRefMode = 1; + + rcLibSetParam(pEncOP, pEncConfig); +} + +static void rcLibSetParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig) +{ + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + pEncOP->rcEnable = (pEncOP->bitRate) ? 4 : 0; + pEncOP->EnRowLevelRc = (pCviEc->u32RowQpDelta > 0); + pEncOP->RcHvsMaxDeltaQp = 8; + pEncOP->HvsQpScaleDiv2 = + (pCviEc->u32ThrdLv <= 4) ? (int)pCviEc->u32ThrdLv : 2; + + pEncOP->EnHvsQp = 1; + pEncOP->rcInitDelay = pCviEc->initialDelay; + + if (pEncOP->bitstreamFormat == STD_HEVC && + pCviEc->cviRcEn && + pCviEc->firstFrmstartQp == 63) { + pEncOP->RcInitialQp = DEFAULT_QP; + } else { + pEncOP->RcInitialQp = + (pCviEc->firstFrmstartQp > -1) ? pCviEc->firstFrmstartQp : DEFAULT_QP; + } + + pEncOP->userMinDeltaQp = -1; + pEncOP->userMaxDeltaQp = -1; + + { + ENC_CFG *pCfg = vzalloc(sizeof(ENC_CFG)); + pEncOP->gopPreset = + (pEncConfig->tempLayer > 0) ? pEncConfig->tempLayer : 1; + + if (pEncOP->gopPreset > 0) { + pCfg->GopPreset = pEncOP->gopPreset; + set_gop_info(pCfg); + } + pEncOP->set_dqp_pic_num = pCfg->set_dqp_pic_num; + memcpy(pEncOP->gopEntry, pCfg->gop_entry, + sizeof(gop_entry_t) * MAX_GOP_SIZE); + vfree(pCfg); + } + + pEncOP->LongTermPeriod = -1; + pEncOP->LongTermDeltaQp = -pCviEc->s32IPQpDelta; + pEncOP->VirtualIPeriod = -1; + if (pCviEc->virtualIPeriod) { + pEncOP->LongTermDeltaQp = pCviEc->s32ViQpDelta; + pEncOP->LongTermPeriod = pCviEc->gop; + pEncOP->VirtualIPeriod = pCviEc->virtualIPeriod; + } + pEncOP->userQpMinI = CLIP3(0, 51, (int)pCviEc->u32MinIQp); + pEncOP->userQpMaxI = CLIP3(0, 51, (int)pCviEc->u32MaxIQp); + pEncOP->userQpMinP = CLIP3(0, 51, (int)pCviEc->u32MinQp); + pEncOP->userQpMaxP = CLIP3(0, 51, (int)pCviEc->u32MaxQp); + pEncOP->MEUseZeroPmv = 0; + pEncOP->sliceMode.sliceMode = 0; + pEncOP->idrInterval = 1; + pEncOP->userGamma = 16; + pEncOP->rcIntervalMode = 0; + pEncOP->mbInterval = 1; + pEncOP->MESearchRangeX = 0; + pEncOP->MESearchRangeY = 0; + pEncOP->rcGopIQpOffsetEn = 1; + + if (pCviEc->virtualIPeriod) + pEncOP->rcGopIQpOffset = pCviEc->s32BgQpDelta; + else + pEncOP->rcGopIQpOffset = pCviEc->s32IPQpDelta; + + pEncOP->frameSkipDisable = + 1; // for compare with C-model ( C-model = only 1 ) + pEncOP->enAutoFrmSkip = 0; + pEncOP->rcWeightFactor = 4; + pEncOP->intraCostWeight = (int)pCviEc->u32IntraCost; + pEncOP->vbvThreshold = 3000; + + pEncOP->maxIprop = pCviEc->u32MaxIprop; +} + +static void setHevcEncDefaultParam(EncOpenParam *pEncOP, + TestEncConfig *pEncConfig) +{ + EncHevcParam *pHevcParam = &pEncOP->EncStdParam.hevcParam; + cviEncCfg *pCviEc = &pEncConfig->cviEc; + Int32 i = 0; + + CVI_VC_TRACE("cviRcEn = %d\n", pEncOP->cviRcEn); + if (pEncOP->cviRcEn || pEncOP->rcMode == RC_MODE_UBR) { + rcLibSetParam(pEncOP, pEncConfig); + } + + pEncOP->idrInterval = 1; + pHevcParam->profile = HEVC_PROFILE_MAIN; + pHevcParam->level = 0; + pHevcParam->tier = 0; + pHevcParam->internalBitDepth = 8; + pEncOP->srcBitDepth = 8; + pHevcParam->chromaFormatIdc = 0; + pHevcParam->losslessEnable = 0; + pHevcParam->constIntraPredFlag = 0; + pHevcParam->enableAFBCD = 0; + pHevcParam->useLongTerm = 0; + + /* HEVC SmartP mode is implemented with GOP preset 17 */ + if (pCviEc->virtualIPeriod) + pEncConfig->tempLayer = + 2; // implement SmartP with GOP preset 17 + + /* for CMD_ENC_SEQ_GOP_PARAM */ + if (pEncConfig->tempLayer == 2) + pHevcParam->gopPresetIdx = 17; + else if (pEncConfig->tempLayer == 3) + pHevcParam->gopPresetIdx = 19; + else + pHevcParam->gopPresetIdx = PRESET_IDX_CUSTOM_GOP; + + /* for CMD_ENC_SEQ_INTRA_PARAM */ + pHevcParam->decodingRefreshType = pEncConfig->decodingRefreshType; + pHevcParam->intraPeriod = pCviEc->gop; + pHevcParam->intraQP = pCviEc->iqp; + CVI_VC_CFG("intraQP = %d\n", pHevcParam->intraQP); + + /* for CMD_ENC_SEQ_CONF_WIN_TOP_BOT/LEFT_RIGHT */ + pHevcParam->confWinTop = 0; + pHevcParam->confWinBot = 0; + pHevcParam->confWinLeft = 0; + pHevcParam->confWinRight = 0; + + /* for CMD_ENC_SEQ_INDEPENDENT_SLICE */ + pHevcParam->independSliceMode = 0; + pHevcParam->independSliceModeArg = 0; + + /* for CMD_ENC_SEQ_DEPENDENT_SLICE */ + pHevcParam->dependSliceMode = 0; + pHevcParam->dependSliceModeArg = 0; + + /* for CMD_ENC_SEQ_INTRA_REFRESH_PARAM */ + pHevcParam->intraRefreshMode = 0; + pHevcParam->intraRefreshArg = 0; + pHevcParam->useRecommendEncParam = 0; + pEncConfig->seiDataEnc.prefixSeiNalEnable = 0; + pEncConfig->seiDataEnc.suffixSeiNalEnable = 0; + pEncOP->encodeHrdRbspInVPS = 0; + pEncOP->encodeHrdRbspInVUI = 0; + pEncOP->encodeVuiRbsp = 0; + pEncConfig->roi_enable = 0; + pEncConfig->ctu_mode_enable = 0; + pEncConfig->ctu_qpMap_enable = 0; +#ifdef SUPPORT_HOST_RC_PARAM + pEncConfig->host_pic_rc_enable = (pEncOP->cviRcEn || pEncOP->rcMode == RC_MODE_UBR); + CVI_VC_CFG("host_pic_rc_enable = %d\n", pEncConfig->host_pic_rc_enable); +#endif + + /* for CMD_ENC_PARAM */ + if (pHevcParam->useRecommendEncParam != 1) { + // 0 : Custom + // 2 : Boost mode (normal encoding speed, normal picture quality) + // 3 : Fast mode (high encoding speed, low picture quality) + pHevcParam->scalingListEnable = 0; + pHevcParam->cuSizeMode = 0x7; + pHevcParam->tmvpEnable = 1; + pHevcParam->wppEnable = 0; + pHevcParam->maxNumMerge = 2; + pHevcParam->dynamicMerge8x8Enable = 1; + pHevcParam->dynamicMerge16x16Enable = 1; + pHevcParam->dynamicMerge32x32Enable = 1; + pHevcParam->disableDeblk = pCviEc->h265Dblk.slice_deblocking_filter_disabled_flag; + pHevcParam->lfCrossSliceBoundaryEnable = 1; + pHevcParam->betaOffsetDiv2 = pCviEc->h265Dblk.slice_beta_offset_div2; + pHevcParam->tcOffsetDiv2 = pCviEc->h265Dblk.slice_tc_offset_div2; + pHevcParam->skipIntraTrans = 1; + pHevcParam->saoEnable = 0; + pHevcParam->intraInInterSliceEnable = 1; + pHevcParam->intraNxNEnable = 0; + } + +#ifdef SUPPORT_HOST_RC_PARAM + pHevcParam->hostPicRCEnable = (pEncOP->cviRcEn || pEncOP->rcMode == RC_MODE_UBR); + CVI_VC_CFG("hostPicRCEnable = %d\n", pHevcParam->hostPicRCEnable); +#endif + + + /* for CMD_ENC_RC_PARAM */ + pEncOP->rcEnable = (pEncOP->bitRate) ? 1 : 0; + pEncOP->initialDelay = pCviEc->initialDelay; + + pHevcParam->ctuOptParam.roiEnable = 0; + if (pHevcParam->ctuOptParam.roiEnable == 1) + pHevcParam->ctuOptParam.roiDeltaQp = 3; + + if (pEncOP->rcMode == RC_MODE_QPMAP) { + pEncConfig->ctu_qpMap_enable = 1; + pHevcParam->ctuOptParam.ctuQpEnable = 1; + } else { + pHevcParam->ctuOptParam.ctuQpEnable = 0; + pEncConfig->ctu_qpMap_enable = 0; + } + + if (pCviEc->virtualIPeriod > 0) + pHevcParam->intraQpOffset = -pCviEc->s32BgQpDelta; + else + pHevcParam->intraQpOffset = -pCviEc->s32IPQpDelta; + CVI_VC_CFG("ctuQpEnable = %d, ctu_qpMap_enable = %d, intraQpOffset = %d\n", + pHevcParam->ctuOptParam.ctuQpEnable, + pEncConfig->ctu_qpMap_enable, pHevcParam->intraQpOffset); + + pHevcParam->initBufLevelx8 = 1; + pHevcParam->bitAllocMode = 1; + for (i = 0; i < MAX_GOP_NUM; i++) { + pHevcParam->fixedBitRatio[i] = 1; + } + pHevcParam->cuLevelRCEnable = (pCviEc->u32RowQpDelta > 0); + pHevcParam->hvsQPEnable = 1; + pHevcParam->hvsQpScale = + (pCviEc->u32ThrdLv <= 4) ? (int)pCviEc->u32ThrdLv : 2; + CVI_VC_CFG("u32ThrdLv = %d, hvsQpScale = %d\n", pCviEc->u32ThrdLv, + pHevcParam->hvsQpScale); + pHevcParam->hvsQpScaleEnable = (pHevcParam->hvsQpScale > 0) ? 1 : 0; + + if (pCviEc->svcEnable) { + pHevcParam->cuLevelRCEnable = 0; + pHevcParam->hvsQPEnable = 0; + pHevcParam->cuLevelRCEnable = 0; + pHevcParam->hvsQPEnable = 0; + pHevcParam->hvsQpScale = 0; + pHevcParam->hvsQpScaleEnable = 0; + if (pEncOP->rcEnable == 1) { + pHevcParam->hvsQPEnable = 1; + pHevcParam->cuLevelRCEnable = (pCviEc->u32RowQpDelta > 0); + pHevcParam->initBufLevelx8 = 0; + pHevcParam->hvsQpScale = + (pCviEc->u32ThrdLv <= 4) ? (int)pCviEc->u32ThrdLv : 2; + CVI_VC_CFG("u32ThrdLv = %d, hvsQpScale = %d\n", pCviEc->u32ThrdLv, + pHevcParam->hvsQpScale); + pHevcParam->hvsQpScaleEnable = (pHevcParam->hvsQpScale > 0) ? 1 : 0; + } + } + /* for CMD_ENC_RC_MIN_MAX_QP */ + { + unsigned int MinQP = 8, MaxQP = 51; + if (pCviEc->u32MinQp > 0 && pCviEc->u32MinQp <= 51) + MinQP = pCviEc->u32MinQp; + if (pCviEc->u32MinIQp > 0 && pCviEc->u32MinIQp <= 51 && + pCviEc->u32MinIQp > pCviEc->u32MinQp) + MinQP = pCviEc->u32MinIQp; + if (pCviEc->svcEnable) { + pEncOP->userQpMinP = pCviEc->u32MinQp; + pEncOP->userQpMinI = pCviEc->u32MinIQp; + } else { + pEncOP->userQpMinP = MinQP; + pEncOP->userQpMinI = MinQP; + } + + if (pCviEc->u32MaxQp > 0 && pCviEc->u32MaxQp <= 51) + MaxQP = pCviEc->u32MaxQp; + + if (pCviEc->u32MaxIQp > 0 && pCviEc->u32MaxIQp <= 51 && + pCviEc->u32MaxIQp < pCviEc->u32MaxQp) + MaxQP = pCviEc->u32MaxIQp; + if (pCviEc->svcEnable) { + pEncOP->userQpMaxP = pCviEc->u32MaxQp; + pEncOP->userQpMaxI = pCviEc->u32MaxIQp; + } else { + pEncOP->userQpMaxP = MaxQP; + pEncOP->userQpMaxI = MaxQP; + } + } + + CVI_VC_TRACE("minQP:%d maxQP:%d,minIQp:%d,maxIQp:%d\n", + pEncOP->userQpMinP, pEncOP->userQpMaxP, pEncOP->userQpMinI, + pEncOP->userQpMaxI); + + pHevcParam->maxDeltaQp = 10; + pHevcParam->hvsMaxDeltaQp = 10; + + if (pCviEc->virtualIPeriod > 0 && pEncOP->rcMode != RC_MODE_FIXQP && + pEncOP->rcMode != RC_MODE_QPMAP) { + pHevcParam->gopParam.enTemporalLayerQp = 1; + pHevcParam->gopParam.tidQp0 = 20; + pHevcParam->gopParam.tidQp1 = + pHevcParam->gopParam.tidQp0 + pCviEc->s32ViQpDelta; + pHevcParam->gopParam.tidQp2 = 26; + } else { + pHevcParam->gopParam.enTemporalLayerQp = 0; + pHevcParam->gopParam.tidQp0 = 30; + pHevcParam->gopParam.tidQp1 = 33; + pHevcParam->gopParam.tidQp2 = 36; + } + CVI_VC_CFG("enTemporalLayerQp %d, tidQp0 %d, tidQp1 %d, tidQp2 %d\n", + pHevcParam->gopParam.enTemporalLayerQp, + pHevcParam->gopParam.tidQp0, pHevcParam->gopParam.tidQp1, + pHevcParam->gopParam.tidQp2); + + if (pEncConfig->tempLayer == 2) { + if (pCviEc->virtualIPeriod) + pHevcParam->gopParam.tidPeriod0 = + pCviEc->virtualIPeriod; // HEVC SmartP + else + pHevcParam->gopParam.tidPeriod0 = 2; + } else if (pEncConfig->tempLayer == 3) + pHevcParam->gopParam.tidPeriod0 = 4; + else + pHevcParam->gopParam.tidPeriod0 = 1; + + /* for CMD_ENC_CUSTOM_GOP_PARAM */ + pHevcParam->gopParam.customGopSize = 1; + pHevcParam->gopParam.useDeriveLambdaWeight = 1; + + for (i = 0; i < pHevcParam->gopParam.customGopSize; i++) { + pHevcParam->gopParam.picParam[i].picType = PIC_TYPE_P; + pHevcParam->gopParam.picParam[i].pocOffset = 1; + pHevcParam->gopParam.picParam[i].picQp = pCviEc->pqp; + pHevcParam->gopParam.picParam[i].refPocL0 = 0; + pHevcParam->gopParam.picParam[i].refPocL1 = 0; + pHevcParam->gopParam.picParam[i].temporalId = 0; + pHevcParam->gopParam.gopPicLambda[i] = 0; + } + + pHevcParam->transRate = + ((pEncOP->rcMode != RC_MODE_CBR && + pEncOP->rcMode != RC_MODE_UBR) || + (pEncOP->statTime <= 0)) ? + MAX_TRANSRATE : + pEncOP->bitRate * pEncOP->statTime * 1000; + CVI_VC_CFG("transRate = %d\n", pHevcParam->transRate); + + // for VUI / time information. + pHevcParam->numTicksPocDiffOne = 0; + pHevcParam->timeScale = 0; + pHevcParam->numUnitsInTick = 0; + + // when vuiParamFlags == 0, VPU doesn't encode VUI + pHevcParam->vuiParam.vuiParamFlags = 0; + pHevcParam->chromaCbQpOffset = pCviEc->h265Trans.cb_qp_offset; + pHevcParam->chromaCrQpOffset = pCviEc->h265Trans.cr_qp_offset; + pHevcParam->initialRcQp = pCviEc->firstFrmstartQp; // 63 is meaningless. + CVI_VC_TRACE("initialRcQp = %d\n", pHevcParam->initialRcQp); + + pHevcParam->nrYEnable = 0; + pHevcParam->nrCbEnable = 0; + pHevcParam->nrCrEnable = 0; + pHevcParam->nrNoiseEstEnable = 1; + pHevcParam->nrIntraWeightY = 7; + pHevcParam->nrIntraWeightCb = 7; + pHevcParam->nrIntraWeightCr = 7; + pHevcParam->nrInterWeightY = 4; + pHevcParam->nrInterWeightCb = 4; + pHevcParam->nrInterWeightCr = 4; + + pHevcParam->rcWeightParam = 2; + pHevcParam->rcWeightBuf = 128; + +#ifdef SUPPORT_HOST_RC_PARAM + if (!pHevcParam->hostPicRCEnable) + pEncOP->maxIprop = -1; +#endif +} + +#ifdef REDUNDENT_CODE +#if defined(_WIN32) || defined(__MSDOS__) +#define DOS_FILESYSTEM +#define IS_DIR_SEPARATOR(__c) ((__c == '/') || (__c == '\\')) +#else +/* UNIX style */ +#define IS_DIR_SEPARATOR(__c) (__c == '/') +#endif + +static char *dirname(const char *path) +{ + int length; + int i; + char *upper_dir; + + if (path == NULL) + return NULL; + + length = strlen(path); + for (i = length - 1; i >= 0; i--) { + if (IS_DIR_SEPARATOR(path[i])) + break; + } + + if (i < 0) { + upper_dir = strdup("."); + } else { + upper_dir = strdup(path); + upper_dir[i] = 0; + } + + return upper_dir; +} + +Int32 GetEncOpenParamChange(EncOpenParam *pEncOP, char *cfgFileName, + ENC_CFG *pEncCfg) +{ + ENC_CFG *pEncCfgInst = vzalloc(sizeof(ENC_CFG)); + ENC_CFG *pCfg; + char param_change_config[MAX_FILE_PATH]; + char *cfgFilePath; +#if defined(RC_PIC_PARACHANGE) && defined(RC_CHANGE_PARAMETER_DEF) + int idx = 0; +#endif + + // Source YUV Image File to load + if (pEncCfg) { + pCfg = pEncCfg; + } else { + pCfg = pEncCfgInst; + } + + cfgFilePath = dirname(cfgFileName); + snprintf(param_change_config, MAX_FILE_PATH, "%s/%s", cfgFilePath, + pEncOP->paramChange.pchChangeCfgFileName); + + ParseChangeParamCfgFile(pCfg, param_change_config); + + pEncOP->paramChange.paraEnable = pCfg->paraEnable; + pEncOP->paramChange.NewGopNum = pCfg->NewGopNum; + // pEncOP->paramChange.NewIntraQpEn = pCfg->NewIntraQpEn; + pEncOP->paramChange.NewIntraQp = pCfg->NewIntraQp; + pEncOP->paramChange.NewBitrate = pCfg->NewBitrate; + pEncOP->paramChange.NewFrameRate = pCfg->NewFrameRate; + pEncOP->paramChange.NewIntraRefresh = pCfg->NewIntraRefresh; + + pEncOP->paramChange.minMaxQpParam.maxQpIEnable = + pCfg->minMaxQpParam.maxQpIEnable; + pEncOP->paramChange.minMaxQpParam.maxQpI = pCfg->minMaxQpParam.maxQpI; + pEncOP->paramChange.minMaxQpParam.minQpIEnable = + pCfg->minMaxQpParam.minQpIEnable; + pEncOP->paramChange.minMaxQpParam.minQpI = pCfg->minMaxQpParam.minQpI; + pEncOP->paramChange.minMaxQpParam.maxQpPEnable = + pCfg->minMaxQpParam.maxQpPEnable; + pEncOP->paramChange.minMaxQpParam.maxQpP = pCfg->minMaxQpParam.maxQpP; + pEncOP->paramChange.minMaxQpParam.minQpPEnable = + pCfg->minMaxQpParam.minQpPEnable; + pEncOP->paramChange.minMaxQpParam.minQpP = pCfg->minMaxQpParam.minQpP; +#if defined(RC_PIC_PARACHANGE) && defined(RC_CHANGE_PARAMETER_DEF) + pEncOP->paramChange.changePicParam.MaxdeltaQp = pCfg->MaxDeltaQp; + pEncOP->paramChange.changePicParam.MindeltaQp = pCfg->MinDeltaQp; + pEncOP->paramChange.changePicParam.EnHvsQp = pCfg->EnHvsQp; + pEncOP->paramChange.changePicParam.EnRowLevelRc = pCfg->EnRowLevelRc; + pEncOP->paramChange.changePicParam.HvsQpScaleDiv2 = + pCfg->HvsQpScaleDiv2; + pEncOP->paramChange.changePicParam.RcHvsMaxDeltaQp = + pCfg->RcHvsMaxDeltaQp; + + pEncOP->paramChange.changePicParam.RcInitDelay = pCfg->RcInitDelay; + pEncOP->paramChange.changePicParam.Gamma = pCfg->Gamma; + pEncOP->paramChange.changePicParam.GammaEn = pCfg->GammaSetEnable; + pEncOP->paramChange.changePicParam.SetDqpNum = pCfg->set_dqp_pic_num; + for (idx = 0; idx < 8; idx++) + pEncOP->paramChange.changePicParam.dqp[idx] = pCfg->dqp[idx]; + + pEncOP->paramChange.changePicParam.RcGopIQpOffset = + pCfg->RcGopIQpOffset; + pEncOP->paramChange.changePicParam.RcGopIQpOffsetEn = + pCfg->RcGopIQpOffsetEn; + +#ifdef AUTO_FRM_SKIP_DROP + pEncOP->paramChange.changePicParam.EnAuToFrmDrop = pCfg->enAutoFrmDrop; + pEncOP->paramChange.changePicParam.EnAutoFrmSkip = pCfg->enAutoFrmSkip; + pEncOP->paramChange.changePicParam.VbvThreshold = pCfg->vbvThreshold; + pEncOP->paramChange.changePicParam.QpThreshold = pCfg->qpThreshold; + pEncOP->paramChange.changePicParam.MaxContinuousFrameSkipNum = + pCfg->maxContinuosFrameSkipNum; + pEncOP->paramChange.changePicParam.MaxContinuousFrameDropNum = + pCfg->maxContinuosFrameDropNum; +#endif + pEncOP->paramChange.changePicParam.rcWeightFactor = + pCfg->rcWeightFactor; + +#endif /* (RC_PIC_PARACHANGE) && (RC_CHANGE_PARAMETER_DEF) */ + + strcpy(pEncOP->paramChange.pchChangeCfgFileName, + pCfg->pchChangeCfgFileName); + pEncOP->paramChange.ChangeFrameNum = pCfg->ChangeFrameNum; + + return 1; +} +#endif +/** + * To init EncOpenParam by CFG file + * IN + * EncConfigParam *pEncConfig + * OUT + * EncOpenParam *pEncOP + * char *srcYuvFileName + */ +#ifdef VC_DRIVER_TEST +Int32 GetEncOpenParam(EncOpenParam *pEncOP, TestEncConfig *pEncConfig, + ENC_CFG *pEncCfg, EncParam *encParam) +{ + int bitFormat; + ENC_CFG *encCfgInst = vmalloc(sizeof(ENC_CFG)); + ENC_CFG *pCfg; + char yuvDir[256] = "./"; + + // Source YUV Image File to load + if (pEncCfg) { + pCfg = pEncCfg; + } else { + if (!encCfgInst) { + pr_err("vmalloc failed.\n"); + return -1; + } + osal_memset(encCfgInst, 0x00, sizeof(ENC_CFG)); + pCfg = encCfgInst; + } + + bitFormat = pEncOP->bitstreamFormat; + switch (bitFormat) { + case STD_AVC: +#ifdef PLATFORM_NON_OS +#if SET_DEFAULT_CFG + setDefaultCfg(pEncConfig, pCfg); +#else + pCfg->FrameRate = 30; + GetEncOpenParamDefault(pEncOP, pEncConfig); +#endif +#else + if (parseAvcCfgFile(pCfg, pEncConfig->cfgFileName) == 0) { + CVI_VC_ERR("pase file %s fail\n", + pEncConfig->cfgFileName); + if (encCfgInst) + vfree(encCfgInst); + return 0; + } + if (pEncCfg) + strcpy(pEncConfig->yuvFileName, pCfg->SrcFileName); + else + snprintf(pEncConfig->yuvFileName, MAX_FILE_PATH, "%s%s", + yuvDir, pCfg->SrcFileName); + + if (pEncConfig->bitstreamFileName[0] == 0 && + pCfg->BitStreamFileName[0] != 0) + snprintf(pEncConfig->bitstreamFileName, MAX_FILE_PATH, + "%s", pCfg->BitStreamFileName); + + if (pEncConfig->bitstreamFileName[0] == 0) + snprintf(pEncConfig->bitstreamFileName, MAX_FILE_PATH, + "%s", "output_stream.264"); + + CVI_VC_CFG("264 : yuv name = %s, bs name = %s\n", + pEncConfig->yuvFileName, + pEncConfig->bitstreamFileName); + + if (pEncOP->EncStdParam.avcParam.svcExtension == TRUE) { + if (pCfg->RcEnable != 0) + pCfg->RcEnable = 4; // Other modes are not + // supported. + + if (pCfg->field_flag == 1) { // Field is not supported + CVI_VC_ERR("field not supported\n"); + if (encCfgInst) + vfree(encCfgInst); + return 0; + } + } + + if (pCfg->coda9RoiEnable) { + strcpy(pEncConfig->roi_file_name, pCfg->RoiFile); + } +#endif + break; + case STD_HEVC: + if (parseHevcCfgFile(pCfg, pEncConfig->cfgFileName) == 0) { + CVI_VC_ERR("pase file %s fail\n", + pEncConfig->cfgFileName); + if (encCfgInst) + vfree(encCfgInst); + return 0; + } + if (pEncCfg) + strcpy(pEncConfig->yuvFileName, pCfg->SrcFileName); + else + snprintf(pEncConfig->yuvFileName, MAX_FILE_PATH, "%s%s", + yuvDir, pCfg->SrcFileName); + + CVI_VC_CFG("roiEnable = %d, roi_enable = %d\n", + pCfg->hevcCfg.ctuOptParam.roiEnable, + pEncConfig->roi_enable); + + if (pEncConfig->bitstreamFileName[0] == 0 && + pCfg->BitStreamFileName[0] != 0) + snprintf(pEncConfig->bitstreamFileName, MAX_FILE_PATH, + "%s", pCfg->BitStreamFileName); + + if (pEncConfig->bitstreamFileName[0] == 0) + snprintf(pEncConfig->bitstreamFileName, MAX_FILE_PATH, + "%s", "output_stream.265"); + + CVI_VC_TRACE("h265 : yuv name = %s, bs name = %s\n", + pEncConfig->yuvFileName, + pEncConfig->bitstreamFileName); + + if (pCfg->hevcCfg.ctuOptParam.roiEnable) + strcpy(pEncConfig->roi_file_name, + pCfg->hevcCfg.roiFileName); + + pEncConfig->roi_enable = pCfg->hevcCfg.ctuOptParam.roiEnable; + pEncConfig->roi_delta_qp = pCfg->hevcCfg.ctuOptParam.roiDeltaQp; + + if (pCfg->hevcCfg.prefixSeiEnable) + strcpy(pEncConfig->prefix_sei_nal_file_name, + pCfg->hevcCfg.prefixSeiDataFileName); + + if (pCfg->hevcCfg.suffixSeiEnable) + strcpy(pEncConfig->suffix_sei_nal_file_name, + pCfg->hevcCfg.suffixSeiDataFileName); + + pEncConfig->seiDataEnc.prefixSeiNalEnable = + pCfg->hevcCfg.prefixSeiEnable; + pEncConfig->seiDataEnc.prefixSeiDataSize = + pCfg->hevcCfg.prefixSeiDataSize; + pEncConfig->seiDataEnc.prefixSeiDataEncOrder = + pCfg->hevcCfg.prefixSeiTimingFlag; + + pEncConfig->seiDataEnc.suffixSeiNalEnable = + pCfg->hevcCfg.suffixSeiEnable; + pEncConfig->seiDataEnc.suffixSeiDataSize = + pCfg->hevcCfg.suffixSeiDataSize; + pEncConfig->seiDataEnc.suffixSeiDataEncOrder = + pCfg->hevcCfg.suffixSeiTimingFlag; + + if (pCfg->hevcCfg.hrdInVPS || pCfg->hevcCfg.hrdInVUI) + strcpy(pEncConfig->hrd_rbsp_file_name, + pCfg->hevcCfg.hrdDataFileName); + + if (pCfg->hevcCfg.vuiDataEnable) + strcpy(pEncConfig->vui_rbsp_file_name, + pCfg->hevcCfg.vuiDataFileName); + + if (pCfg->hevcCfg.ctuOptParam.ctuModeEnable) + strcpy(pEncConfig->ctumode_file_name, + pCfg->hevcCfg.ctuModeFileName); + pEncConfig->ctu_mode_enable = + pCfg->hevcCfg.ctuOptParam.ctuModeEnable; + + if (pCfg->hevcCfg.ctuOptParam.ctuQpEnable) + strcpy(pEncConfig->ctuqp_file_name, + pCfg->hevcCfg.ctuQpFileName); + + pEncConfig->ctu_qpMap_enable = + pCfg->hevcCfg.ctuOptParam.ctuQpEnable; + pEncConfig->encAUD = pCfg->hevcCfg.encAUD; + pEncConfig->encEOS = pCfg->hevcCfg.encEOS; + pEncConfig->encEOB = pCfg->hevcCfg.encEOB; + pEncConfig->useAsLongtermPeriod = + pCfg->hevcCfg.useAsLongtermPeriod; + pEncConfig->refLongtermPeriod = pCfg->hevcCfg.refLongtermPeriod; + +#ifdef SUPPORT_HOST_RC_PARAM + pEncConfig->host_pic_rc_enable = pCfg->hevcCfg.hostPicRcEnable; + if (pCfg->hevcCfg.hostPicRcEnable) + strcpy(pEncConfig->host_pic_rc_file_name, + pCfg->hevcCfg.hostPicRcFileName); +#endif + break; + default: + break; + } + + if (bitFormat == STD_HEVC) { + if (setWaveEncOpenParam(pEncOP, pEncConfig, pCfg) == 0) { + CVI_VC_ERR("setWaveEncOpenParam fail\n"); + if (encCfgInst) + vfree(encCfgInst); + return 0; + } + } else { + if (setCoda9EncOpenParam(pEncOP, pEncConfig, pCfg) == 0) { + CVI_VC_ERR("setCoda9EncOpenParam fail\n"); + if (encCfgInst) + vfree(encCfgInst); + return 0; + } + } + if (encCfgInst) + vfree(encCfgInst); + return 1; +} +#endif + +#if SET_DEFAULT_CFG +static void setDefaultCfg(TestEncConfig *pEncConfig, ENC_CFG *pCfg) +{ + pEncConfig->picWidth = WIDTH; + pEncConfig->picHeight = HEIGHT; + pEncConfig->outNum = DEFAULT_ENC_OUTPUT_NUM; + pCfg->FrameRate = 30; + pCfg->RcBitRate = 0; + pCfg->frameSkipDisable = 1; + pCfg->GopPicNum = 60; + pCfg->IDRInterval = 60; + pCfg->RCIntraQP = 33; + pCfg->level = 51; + pCfg->entropyCodingMode = 1; + pCfg->LongTermPeriod = 60; + pCfg->LongTermDeltaQp = 33; + pCfg->RcInitialQp = 33; + pCfg->rcWeightFactor = 2; + pCfg->PicQpY = 33; +} +#endif + +#ifdef REDUNDENT_CODE +int ReadBsResetBufHelper(Uint32 core_idx, osal_file_t streamFp, + PhysicalAddress bitstream, int size, int endian) +{ + unsigned char *buf = osal_malloc(size); + + if (!buf) { + VLOG(ERR, "fail to allocate bitstream buffer\n"); + return 0; + } + + vdi_read_memory(core_idx, bitstream, buf, size, endian); + osal_fwrite((void *)buf, sizeof(Uint8), size, streamFp); + osal_free(buf); + return 1; +} + +/* + * To be compatible with Ref-SW 4.0 + */ + +frame_queue_item_t *frame_queue_init(Int32 count) +{ + frame_queue_item_t *queue = NULL; + + queue = (frame_queue_item_t *)osal_malloc(sizeof(frame_queue_item_t)); + if (!queue) { + return NULL; + } + + queue->size = count; + queue->count = 0; + queue->front = 0; + queue->rear = 0; + queue->buffer = + (DecOutputInfo *)osal_malloc(count * sizeof(DecOutputInfo)); + + return queue; +} + +void frame_queue_deinit(frame_queue_item_t *queue) +{ + if (queue == NULL) { + return; + } + + if (queue->buffer) { + osal_free(queue->buffer); + } + + osal_free(queue); +} + +/* + * Return 0 on success. + * -1 on failure + */ +Int32 frame_queue_enqueue(frame_queue_item_t *queue, DecOutputInfo data) +{ + if (queue == NULL) { + return -1; + } + + /* Queue is full */ + if (queue->count == queue->size) { + return -1; + } + + queue->buffer[queue->rear++] = data; + queue->rear %= queue->size; + queue->count++; + + return 0; +} + +/* + * Return 0 on success. + * -1 on failure + */ +Int32 frame_queue_dequeue(frame_queue_item_t *queue, DecOutputInfo *data) +{ + if (queue == NULL) { + return -1; + } + + /* Queue is empty */ + if (queue->count == 0) { + return -1; + } + + *data = queue->buffer[queue->front++]; + queue->front %= queue->size; + queue->count--; + + return 0; +} + +Int32 frame_queue_dequeue_all(frame_queue_item_t *queue) +{ + Int32 ret; + DecOutputInfo data; + + if (queue == NULL) { + return -1; + } + + do { + ret = frame_queue_dequeue(queue, &data); + if (ret >= 0) { + VLOG(INFO, + "Empty display Queue for flush display_index=%d\n", + data.indexFrameDisplay); + } + } while (ret >= 0); + return 0; +} + +Int32 frame_queue_peekqueue(frame_queue_item_t *queue, DecOutputInfo *data) +{ + if (queue == NULL) { + return -1; + } + /* Queue is empty */ + if (queue->count == 0) { + return -1; + } + + *data = queue->buffer[queue->front]; + return 0; +} + +Int32 frame_queue_check_in_queue(frame_queue_item_t *queue, Int32 index) +{ + DecOutputInfo data; + Int32 front; + Int32 count; + + if (queue == NULL) { + return -1; + } + + front = queue->front; + count = queue->count; + while (count > 0) { + data = queue->buffer[front++]; + if (data.indexFrameDisplay == index) { + return 1; + } + + count--; + front %= queue->size; + } + + return 0; +} + +Int32 frame_queue_count(frame_queue_item_t *queue) +{ + if (queue == NULL) { + return -1; + } + + return queue->count; +} +#endif + +#define AVC_ENC_NUT_SLICE 1 +#define AVC_ENC_NUT_IDR 5 +static frm_t *get_current_frame(EncInfo *seq) +{ + int i; + frm_t *curr_frm = NULL; + + if (seq->openParam.gopSize == 1) { + // all intra + curr_frm = &seq->frm[0]; + seq->prev_idx = 0; + } else { + for (i = 0; i < seq->num_total_frames; i++) { + if (seq->frm[i].used_for_ref == 0) { + curr_frm = &seq->frm[i]; + seq->prev_idx = i; + break; + } + } + } + + return curr_frm; +} + +static void set_mmco(EncInfo *seq) +{ + int frmidx; + int next_idx = (seq->enc_idx_modulo == seq->gop_size - 1) ? + 0 : + seq->enc_idx_modulo + 1; + rps_t *next_rps = &seq->rps[next_idx]; + int curr_gop_poc = seq->curr_frm->poc - + seq->gop_entry[seq->enc_idx_modulo].curr_poc; + int next_gop_poc = curr_gop_poc + ((next_idx == 0) ? seq->gop_size : 0); + + // mmco1 : set short-term as non-ref + seq->num_mmco1 = 0; + + for (frmidx = 0; frmidx < seq->num_total_frames; frmidx++) { + frm_t *frm = &seq->frm[frmidx]; + + if (frm->used_for_ref && (frm != seq->curr_frm) && + (frmidx != seq->longterm_frmidx)) { + int i; + int found = 0; + + // check if the ref-frame is in next rps + for (i = 0; i < next_rps->num_poc; i++) + if (frm->poc == next_gop_poc + next_rps->poc[i]) + found = 1; + + if (!found) { + seq->mmco1_frmidx[seq->num_mmco1++] = frmidx; + } + } + } +} + +static int search_ref_frame(EncInfo *seq, int poc) +{ + int i; + for (i = 0; i < 31; i++) + if (seq->frm[i].used_for_ref && seq->frm[i].poc == poc) + return i; + return -1; +} + +static void set_refpic_list(EncInfo *seq, int ref_long_term) +{ + int ref, list; + int num_ref, num_list; + int enc_idx; + int gop_poc; + + enc_idx = seq->enc_idx_modulo; + + gop_poc = seq->curr_frm->poc - seq->gop_entry[enc_idx].curr_poc; + + seq->num_ref_idx = 0; + seq->ref_pic_list = 0; + + // fill ref_list + num_ref = 1; //(seq->curr_frm->slice_type == AVC_ENC_SLICE_TYPE_B || + //seq->gop_entry[enc_idx].use_multi_ref_p) ? 2 : 1; + for (ref = 0; ref < num_ref; ref++) { + int frmidx; + int poc = gop_poc + seq->gop_entry[enc_idx].ref_poc; + + if (ref_long_term && (ref == num_ref - 1) && + (seq->longterm_frmidx >= 0)) // long-term + frmidx = seq->longterm_frmidx; + else + frmidx = search_ref_frame(seq, poc); + + if (frmidx != -1) { + seq->ref_pic_list = frmidx; + seq->num_ref_idx++; + } + } + + // when num_ref_idx is 0, fill ref_list with rps + num_list = 1; + for (list = 0; list < num_list; list++) { + if (seq->num_ref_idx == 0) { + int i; + rps_t *rps = &seq->rps[enc_idx]; + + for (i = 0; i < rps->num_poc; i++) { + int poc = gop_poc + rps->poc[i]; + int frmidx = search_ref_frame(seq, poc); + if (frmidx != -1) { + seq->ref_pic_list = frmidx; + seq->num_ref_idx++; + break; + } + } + } + } +} + +static int get_nal_ref_idc(EncInfo *seq, int enc_idx) +{ + if (seq->idr_picture) + return 3; + else if (seq->gop_entry[enc_idx].curr_poc == seq->gop_size) // anchor + return 2; + else if (seq->curr_frm->used_for_ref) + return 1; + else + return 0; +} + +#define AVC_ENC_NUT_SLICE 1 +#define AVC_ENC_NUT_IDR 5 + +void dpb_pic_init(EncInfo *pAvcInfo) +{ + int encode_frame; + int enc_idx; // = pAvcInfo->enc_idx_modulo; + int i; + int gop_num = pAvcInfo->openParam.gopSize; + + encode_frame = pAvcInfo->encoded_frames_in_gop; + enc_idx = pAvcInfo->enc_idx_modulo; + + if (gop_num == 1) // All I + encode_frame = 0; + else { + if (encode_frame >= gop_num && gop_num != 0) // I frame + encode_frame = 0; + } + + pAvcInfo->idr_picture = 0; + if (pAvcInfo->frm_cnt == 0) { + pAvcInfo->Idr_cnt = 0; + pAvcInfo->idr_picture = 1; + } else { + if ((pAvcInfo->openParam.idrInterval) > 0 && + (pAvcInfo->openParam.gopSize > 0)) { + if (encode_frame == 0) { + pAvcInfo->Idr_cnt++; + } + + if (pAvcInfo->openParam.idrInterval == + pAvcInfo->Idr_cnt) { + pAvcInfo->frm_cnt = 0; + pAvcInfo->Idr_cnt = 0; + pAvcInfo->idr_picture = 1; + + if (pAvcInfo->singleLumaBuf) { + for (i = 0; i < 31; i++) + pAvcInfo->frm[i].used_for_ref = + 0; + } + } + } + } + + if (pAvcInfo->idr_picture) + pAvcInfo->Idr_picId = (pAvcInfo->Idr_picId + 1) & + 0xFFFF; // Idr_pic_id: 0 ~ 65535 + + pAvcInfo->slice_type = (encode_frame == 0) ? 0 : 1; + + if (pAvcInfo->enc_long_term_cnt > 0) { + if (pAvcInfo->enc_long_term_cnt == pAvcInfo->long_term_period) + pAvcInfo->enc_long_term_cnt = 0; + } + + if ((pAvcInfo->enc_long_term_cnt == 0 || + pAvcInfo->force_as_long_term_ref) && + pAvcInfo->long_term_period != -1) + pAvcInfo->curr_long_term = 1; // enc_long_term_cnt % + // pAvcInfo->long_term_d; + else + pAvcInfo->curr_long_term = 0; + + pAvcInfo->ref_long_term = // pAvcInfo->curr_long_term || + ((pAvcInfo->virtual_i_period > 0) ? + (pAvcInfo->frm_cnt % pAvcInfo->virtual_i_period == 0) : + 0) || + pAvcInfo->gop_entry[pAvcInfo->enc_idx_modulo].ref_long_term; + + if (pAvcInfo->enc_idx_modulo >= 0) + pAvcInfo->src_idx = + pAvcInfo->enc_idx_gop + + pAvcInfo->gop_entry[pAvcInfo->enc_idx_modulo].curr_poc; + else + pAvcInfo->src_idx = pAvcInfo->enc_idx_gop; + + pAvcInfo->num_mmco1 = 0; + pAvcInfo->curr_frm = get_current_frame(pAvcInfo); + + if (pAvcInfo->idr_picture) + pAvcInfo->src_idx_last_idr = pAvcInfo->src_idx; + + if (pAvcInfo->idr_picture) { + // pAvcInfo->Idr_picId ^= 1; + + // clear all refs + for (i = 0; i < 31; i++) + pAvcInfo->frm[i].used_for_ref = 0; + + pAvcInfo->curr_frm->used_for_ref = 1; + pAvcInfo->curr_frm->slice_type = 0; // I_SLICE; + pAvcInfo->curr_frm->poc = 0; + pAvcInfo->curr_frm->frame_num = 0; + } else { + int enc_idx = pAvcInfo->enc_idx_modulo; + + pAvcInfo->curr_frm->used_for_ref = + pAvcInfo->rps[enc_idx].used_for_ref || + pAvcInfo->curr_long_term; + pAvcInfo->curr_frm->slice_type = pAvcInfo->slice_type; + pAvcInfo->curr_frm->poc = + pAvcInfo->src_idx - pAvcInfo->src_idx_last_idr; + pAvcInfo->curr_frm->frame_num = + (pAvcInfo->prev_frame_num + 1) % (1 << 4); + + if (pAvcInfo->curr_frm->used_for_ref) + set_mmco(pAvcInfo); + + if (pAvcInfo->curr_frm->slice_type != 0) // I_SLICE) + set_refpic_list(pAvcInfo, pAvcInfo->ref_long_term); + } + + pAvcInfo->nal_ref_idc = get_nal_ref_idc(pAvcInfo, enc_idx); + pAvcInfo->nal_unit_type = + pAvcInfo->idr_picture ? AVC_ENC_NUT_IDR : AVC_ENC_NUT_SLICE; + + // update prev_frame_num + if (pAvcInfo->curr_frm->used_for_ref) + pAvcInfo->prev_frame_num = pAvcInfo->curr_frm->frame_num; + + // pAvcInfo->RefPicList[0] = pAvcInfo->ref_pic_list; + + pAvcInfo->temporal_id = + (pAvcInfo->enc_idx_modulo == -1) ? + 0 : + pAvcInfo->gop_entry[pAvcInfo->enc_idx_modulo] + .temporal_id; + + if (pAvcInfo->curr_long_term) + pAvcInfo->temporal_id = 0; + + // Update cnt + pAvcInfo->enc_long_term_cnt++; + pAvcInfo->frm_cnt++; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/fpgaYuvfeeder.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/fpgaYuvfeeder.c new file mode 100644 index 0000000000..96d6be2fd0 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/fpgaYuvfeeder.c @@ -0,0 +1,182 @@ +#include "main_helper.h" + +typedef struct _FPGA_YUV_FEEDER_FP_ { + unsigned char *base; + int offset; + int frameNo; + int size; +} fpgaYuvFp; + +BOOL fpgaYuvFeeder_Create(YuvFeederImpl *impl, const char *path, Uint32 packed, + Uint32 fbStride, Uint32 fbHeight) +{ + yuvContext *ctx; + fpgaYuvFp *fp; + Uint8 *pYuv; + + fp = osal_malloc(sizeof(fpgaYuvFp)); + if (fp == NULL) { + VLOG(ERR, "%s:%d failed to malloc fpgaYuvFp\n", __func__, + __LINE__); + return FALSE; + } + +#if CFG_MEM + fp->base = (unsigned char *)dramCfg.pucSrcYuvAddr; + fp->size = dramCfg.iSrcYuvSize; +#else + fp->base = (unsigned char *)SRC_YUV_BASE; + fp->size = SRC_YUV_SIZE; +#endif + + fp->offset = 0; + fp->frameNo = 0; + + CVI_VC_TRACE("packed = %d, fbStride = %d, fbHeight = %d\n", packed, + fbStride, fbHeight); + +#if 1 + pYuv = osal_malloc(0x100); // unsigned short +#else + if (packed == 1) + pYuv = osal_malloc(fbStride * fbHeight * 3 * 2 * 2); // packed, + // unsigned + // short + else + pYuv = osal_malloc(fbStride * fbHeight * 3 * 2); // unsigned + // short +#endif + + if (pYuv == NULL) { + VLOG(ERR, "%s:%d failed to malloc pYuv\n", __func__, + __LINE__); + return FALSE; + } + + ctx = (yuvContext *)osal_malloc(sizeof(yuvContext)); + if (ctx == NULL) { + osal_free(pYuv); + osal_free(fp); + return FALSE; + } + + osal_memset(ctx, 0, sizeof(yuvContext)); + + ctx->fp = (osal_file_t *)fp; + ctx->pYuv = pYuv; + impl->context = ctx; + + return TRUE; +} + +BOOL fpgaYuvFeeder_Feed(YuvFeederImpl *impl, Int32 coreIdx, FrameBuffer *fb, + size_t picWidth, size_t picHeight, void *arg) +{ + yuvContext *ctx = (yuvContext *)impl->context; + Uint8 *pYuv = ctx->pYuv; + size_t frameSize; + size_t frameSizeY; + size_t frameSizeC; + Int32 bitdepth = 0; + Int32 yuv3p4b = 0; + Int32 packedFormat = 0; +#ifndef PLATFORM_NON_OS + Uint32 outWidth = 0; + Uint32 outHeight = 0; +#endif + fpgaYuvFp *fp; + + CVI_VC_TRACE("impl = 0x%lX, ctx = 0x%lX, pYuv = 0x%lX\n", impl, ctx, + pYuv); + + CalcYuvSize(fb->format, picWidth, picHeight, fb->cbcrInterleave, + &frameSizeY, &frameSizeC, &frameSize, &bitdepth, + &packedFormat, &yuv3p4b); + + // Load source one picture image to encode to SDRAM frame buffer. + fp = (fpgaYuvFp *)ctx->fp; + +#if SRC_YUV_CYCLIC + fp->offset = (fp->frameNo % 10) * frameSize; +#endif + + if (fp->offset + frameSize > fp->size) { + CVI_VC_ERR("no more source frames to read\n"); + return FALSE; + } + CVI_VC_FLOW("bufY = 0x%lX\n", fb->bufY); + CVI_VC_TRACE( + "format = %d, endian = %d, frameSizeY = 0x%X, frameSizeC = 0x%X\n", + fb->format, fb->endian, frameSizeY, frameSizeC); + CVI_VC_TRACE( + "fp = 0x%lX, base = 0x%lX, offset = 0x%X, frameSize = 0x%X\n", + fp, fp->base, fp->offset, frameSize); +#if DIRECT_YUV + fb->bufY = (PhysicalAddress)(fp->base + fp->offset); + fb->bufCb = (PhysicalAddress)(fb->bufY + picWidth * picHeight); + fb->bufCr = (PhysicalAddress)(fb->bufCb + (picWidth * picHeight >> 2)); +#else + osal_memcpy((void *)fb->bufY, (void *)(fp->base + fp->offset), + frameSize); +#endif + + fp->frameNo++; + fp->offset += frameSize; + +#ifndef PLATFORM_NON_OS +#ifdef FPGA_YUV_ERROR + if (fb->mapType == LINEAR_FRAME_MAP) { + outWidth = (yuv3p4b && packedFormat == 0) ? + (((picWidth + 31) >> 5) << 5) : + picWidth; + outHeight = + (yuv3p4b) ? (((picHeight + 7) >> 3) << 3) : picHeight; + + if (yuv3p4b && packedFormat) { + outWidth = ((picWidth * 2) + 2) / 3 * 4; + } else if (packedFormat) { + outWidth *= 2; // 8bit packed mode(YUYV) only. (need to + // add 10bit cases later) + if (bitdepth != 0) // 10bit packed + outWidth *= 2; + } + LoadYuvImageBurstFormat(coreIdx, pYuv, outWidth, outHeight, fb, + ctx->srcPlanar); + } else { + TiledMapConfig mapConfig; + + osal_memset((void *)&mapConfig, 0x00, sizeof(TiledMapConfig)); + if (arg != NULL) { + osal_memcpy((void *)&mapConfig, arg, + sizeof(TiledMapConfig)); + } + + LoadTiledImageYuvBurst(coreIdx, pYuv, picWidth, picHeight, fb, + mapConfig); + } +#endif +#endif + return TRUE; +} + +BOOL fpgaYuvFeeder_Destory(YuvFeederImpl *impl) +{ + yuvContext *ctx = (yuvContext *)impl->context; + + osal_free(ctx->fp); + osal_free(ctx->pYuv); + osal_free(ctx); + return TRUE; +} + +BOOL fpgaYuvFeeder_Configure(YuvFeederImpl *impl, Uint32 cmd, YuvInfo yuv) +{ + yuvContext *ctx = (yuvContext *)impl->context; + UNREFERENCED_PARAMETER(cmd); + + ctx->fbStride = yuv.srcStride; + ctx->cbcrInterleave = yuv.cbcrInterleave; + ctx->srcPlanar = yuv.srcPlanar; + + return TRUE; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/yuvAddrfeeder.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/yuvAddrfeeder.c new file mode 100644 index 0000000000..f72f36515d --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/yuvAddrfeeder.c @@ -0,0 +1,143 @@ +#include "main_helper.h" + +typedef struct _YUV_ADDR_FP_ { + int frameNo; +} yuvAddrFp; + +BOOL yuvAddrFeeder_Create(YuvFeederImpl *impl, const char *path, Uint32 packed, + Uint32 fbStride, Uint32 fbHeight) +{ + yuvContext *ctx; + yuvAddrFp *fp; + Uint8 *pYuv; + + UNREFERENCED_PARAMETER(path); + + fp = osal_malloc(sizeof(yuvAddrFp)); + if (fp == NULL) { + VLOG(ERR, "%s:%d failed to malloc yuvAddrFp\n", __func__, + __LINE__); + return FALSE; + } + + fp->frameNo = 0; + + CVI_VC_TRACE("packed = %d, fbStride = %d, fbHeight = %d\n", packed, + fbStride, fbHeight); + + pYuv = osal_malloc(0x100); // unsigned short + + if (pYuv == NULL) { + VLOG(ERR, "%s:%d failed to malloc pYuv\n", __func__, + __LINE__); + return FALSE; + } + + ctx = (yuvContext *)osal_malloc(sizeof(yuvContext)); + if (ctx == NULL) { + osal_free(pYuv); + osal_free(fp); + return FALSE; + } + + osal_memset(ctx, 0, sizeof(yuvContext)); + + ctx->fp = (osal_file_t *)fp; + ctx->pYuv = pYuv; + impl->context = ctx; + + return TRUE; +} + +BOOL yuvAddrFeeder_Feed(YuvFeederImpl *impl, Int32 coreIdx, FrameBuffer *fb, + size_t picWidth, size_t picHeight, void *arg) +{ + yuvContext *ctx = (yuvContext *)impl->context; + Uint8 *pYuv = ctx->pYuv; + size_t frameSize; + size_t frameSizeY; + size_t frameSizeC; + Int32 bitdepth = 0; + Int32 yuv3p4b = 0; + Int32 packedFormat = 0; + Uint32 outWidth = 0; + Uint32 outHeight = 0; + + yuvAddrFp *fp; + feederYuvaddr *pYuvAddr = (feederYuvaddr *)arg; + + UNUSED(pYuv); + CVI_VC_TRACE("impl = 0x%p, ctx = 0x%p, pYuv = 0x%p\n", impl, ctx, pYuv); + + if (!pYuvAddr) { + CVI_VC_ERR("pYuvAddr = NULL\n"); + return FALSE; + } + CalcYuvSize(fb->format, picWidth, picHeight, fb->cbcrInterleave, + &frameSizeY, &frameSizeC, &frameSize, &bitdepth, + &packedFormat, &yuv3p4b); + + // Load source one picture image to encode to SDRAM frame buffer. + fp = (yuvAddrFp *)ctx->fp; + + CVI_VC_FLOW("bufY = 0x%llx\n", fb->bufY); + CVI_VC_TRACE( + "format = %d, endian = %d, frameSizeY = 0x%zx, frameSizeC = 0x%zx\n", + fb->format, fb->endian, frameSizeY, frameSizeC); + CVI_VC_TRACE("fp = 0x%p, frameSize = 0x%zx\n", fp, frameSize); + +#if 0 + osal_memcpy((void *)fb->bufY, (void *)(pYuvAddr->addrY), frameSize); + osal_memcpy((void *)fb->bufCb, (void *)(pYuvAddr->addrCb), + frameSize / 4); + osal_memcpy((void *)fb->bufCr, (void *)(pYuvAddr->addrCr), + frameSize / 4); +#endif + + { + outWidth = (yuv3p4b && packedFormat == 0) ? + (((picWidth + 31) >> 5) << 5) : + picWidth; + outHeight = + (yuv3p4b) ? (((picHeight + 7) >> 3) << 3) : picHeight; + + if (yuv3p4b && packedFormat) { + outWidth = ((picWidth * 2) + 2) / 3 * 4; + } else if (packedFormat) { + outWidth *= 2; // 8bit packed mode(YUYV) only. (need to + // add 10bit cases later) + if (bitdepth != 0) // 10bit packed + outWidth *= 2; + } + LoadYuvImageBurstFormat3(coreIdx, pYuvAddr->addrY, + pYuvAddr->addrCb, pYuvAddr->addrCr, + outWidth, outHeight, fb, + ctx->srcPlanar); + } + + fp->frameNo++; + + return TRUE; +} + +BOOL yuvAddrFeeder_Destory(YuvFeederImpl *impl) +{ + yuvContext *ctx = (yuvContext *)impl->context; + + osal_free(ctx->fp); + osal_free(ctx->pYuv); + osal_free(ctx); + return TRUE; +} + +BOOL yuvAddrFeeder_Configure(YuvFeederImpl *impl, Uint32 cmd, YuvInfo yuv) +{ + yuvContext *ctx = (yuvContext *)impl->context; + UNREFERENCED_PARAMETER(cmd); + + ctx->fbStride = yuv.srcStride; + ctx->cbcrInterleave = yuv.cbcrInterleave; + ctx->srcPlanar = yuv.srcPlanar; + + return TRUE; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/yuvLoaderfeeder.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/yuvLoaderfeeder.c new file mode 100644 index 0000000000..a97e7f6a60 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/yuvLoaderfeeder.c @@ -0,0 +1,1381 @@ +//------------------------------------------------------------------------------ +// File: vpuio.c +// +// Copyright (c) 2006, Chips & Media. All rights reserved. +//------------------------------------------------------------------------------ + +#include +#include "main_helper.h" + +//#define SAVE_WHOLE_LOADED_YUV +//#define DUMP_REFC_TYPE + +#ifdef SAVE_WHOLE_LOADED_YUV +FILE *save_fp; +int save_frame_cnt; +int save_frame_max; +#endif + +typedef struct { + osal_file_t *fp; + Uint8 *pYuv; + + Uint32 cbcrInterleave; + Uint32 nv21; + Uint32 packedFormat; +} Context; + +enum { + OUTPUT_PLANAR = 0, + OUTPUT_NV12 = 2, + OUTPUT_NV21 = 3, + OUTPUT_PACKED = 4, +}; + +typedef unsigned short pel; // the size of pel should be 16. +typedef struct { + pel * src_buf[3]; + Int32 rot_mode; + Int32 src_stride; + Int32 src_width; + Int32 src_height; + + Int32 padded_y_stride; + Int32 padded_c_stride; + + Int32 padded_y_height; + Int32 padded_c_height; + + Int32 enc_stride; + Int32 enc_width; + Int32 enc_height; + + Int32 enc_c_stride; + + pel * p_out_buf[3]; + pel *out_buf; + pel *pad_buf; +} prp_t; + +static void conv_image_not_pack_output_planar( + unsigned short *outbuf, unsigned short *inbuf, + int pic_width, int pic_height, int out_width, int out_height) +{ + int x = 0, y = 0; + int iaddr = 0, oaddr = 0; + int temp = 0, tbase = 0; + + // Y + iaddr = 0; + oaddr = 0; + for (y = 0; y < out_height; y++) { + for (x = 0; x < out_width; x++) { + if (y >= pic_height) { + if (x >= pic_width) + outbuf[oaddr] = temp; + else { + temp = inbuf + [x + + pic_width * + (pic_height - + 1)]; + outbuf[oaddr] = temp; + } + } else { + if (x >= pic_width) + outbuf[oaddr] = temp; + else { + temp = inbuf[iaddr]; + outbuf[oaddr] = temp; + iaddr++; + } + } + oaddr++; + } + } + // U + tbase = pic_width * pic_height; + iaddr = tbase; + oaddr = out_width * out_height; + for (y = 0; y < (out_height >> 1); y++) { + for (x = 0; x < (out_width >> 1); x++) { + if (y >= (pic_height >> 1)) { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf + [tbase + x + + (pic_width / + 2) * (pic_height / + 2 - + 1)]; + outbuf[oaddr] = temp; + } + } else { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf[iaddr]; + outbuf[oaddr] = temp; + iaddr++; + } + } + oaddr++; + } + } + // V + tbase = (pic_width * pic_height * 5) >> 2; + iaddr = tbase; + oaddr = (out_width * out_height * 5) >> 2; + for (y = 0; y < (out_height >> 1); y++) { + for (x = 0; x < (out_width >> 1); x++) { + if (y >= (pic_height >> 1)) { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf + [tbase + x + + (pic_width / + 2) * (pic_height / + 2 - + 1)]; + outbuf[oaddr] = temp; + } + } else { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf[iaddr]; + outbuf[oaddr] = temp; + iaddr++; + } + } + oaddr++; + } + } +} + +static void conv_image_not_pack_output_semiplanar( + unsigned short *outbuf, unsigned short *inbuf, + int pic_width, int pic_height, int out_width, int out_height, int frm_format) +{ + int x = 0, y = 0; + int iaddr = 0, oaddr = 0; + int temp = 0, tbase = 0; + + // Y + iaddr = 0; + oaddr = 0; + for (y = 0; y < out_height; y++) { + for (x = 0; x < out_width; x++) { + if (y >= pic_height) { + if (x >= pic_width) + outbuf[oaddr] = temp; + else { + temp = inbuf + [x + + pic_width * + (pic_height - + 1)]; + outbuf[oaddr] = temp; + } + } else { + if (x >= pic_width) + outbuf[oaddr] = temp; + else { + temp = inbuf[iaddr]; + outbuf[oaddr] = temp; + iaddr++; + } + } + oaddr++; + } + } + // U + tbase = (frm_format == OUTPUT_NV12) ? + pic_width * pic_height : + ((pic_width * pic_height * 5) >> 2); + iaddr = tbase; + oaddr = out_width * out_height; + for (y = 0; y < (out_height >> 1); y++) { + for (x = 0; x < (out_width >> 1); x++) { + if (y >= (pic_height >> 1)) { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf + [tbase + x + + (pic_width / + 2) * (pic_height / + 2 - + 1)]; + outbuf[oaddr] = temp; + } + } else { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf[iaddr]; + outbuf[oaddr] = temp; + iaddr++; + } + } + oaddr += 2; + } + } + // V + tbase = (frm_format == OUTPUT_NV12) ? + ((pic_width * pic_height * 5) >> 2) : + pic_width * pic_height; + iaddr = tbase; + oaddr = out_width * out_height + 1; + for (y = 0; y < (out_height >> 1); y++) { + for (x = 0; x < (out_width >> 1); x++) { + if (y >= (pic_height >> 1)) { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf + [tbase + x + + (pic_width / + 2) * (pic_height / + 2 - + 1)]; + outbuf[oaddr] = temp; + } + } else { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf[iaddr]; + outbuf[oaddr] = temp; + iaddr++; + } + } + oaddr += 2; + } + } +} + +void conv_image(unsigned short *outbuf, unsigned short *inbuf, int pic_width, + int pic_height, int out_width, int out_height, int frm_format, + int packedFormat) +{ + int x = 0, y = 0; + int iaddr = 0, oaddr = 0; + int temp = 0, tbase = 0; + + if (packedFormat == NOT_PACKED) { + if (frm_format == OUTPUT_PLANAR) { // planar + conv_image_not_pack_output_planar(outbuf, inbuf, + pic_width, pic_height, out_width, out_height); + } else if (frm_format == OUTPUT_NV12 || + frm_format == OUTPUT_NV21) { // NV12, NV21 + conv_image_not_pack_output_semiplanar(outbuf, inbuf, + pic_width, pic_height, out_width, out_height, frm_format) + } else { + printf("Error) Unknown frame format: %d\n", frm_format); + } + } else { /* packdformat */ + if (packedFormat == PACKED_YUYV || + packedFormat == PACKED_YVYU) { + oaddr = 0; + } else { + oaddr = 1; + } + + // Y + iaddr = 0; + for (y = 0; y < out_height; y++) { + for (x = 0; x < out_width; x++) { + if (y >= pic_height) { + if (x >= pic_width) + outbuf[oaddr] = temp; + else { + temp = inbuf[x + + pic_width * + (pic_height - + 1)]; + outbuf[oaddr] = temp; + } + } else { + if (x >= pic_width) + outbuf[oaddr] = temp; + else { + temp = inbuf[iaddr]; + outbuf[oaddr] = temp; + iaddr++; + } + } + oaddr += 2; + } + } + + // U + switch (packedFormat) { + case PACKED_YUYV: + oaddr = 1; + break; + case PACKED_YVYU: + oaddr = 3; + break; + case PACKED_UYVY: + oaddr = 0; + break; + case PACKED_VYUY: + oaddr = 2; + break; + default: + VLOG(ERR, "%s:%d Not supported format(%d)\n", __FILE__, + __LINE__, packedFormat); + break; + } + tbase = pic_width * pic_height; + iaddr = tbase; + for (y = 0; y < out_height; y++) { + for (x = 0; x < (out_width >> 1); x++) { + if (y >= pic_height) { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf[tbase + x + + (pic_width / + 2) * (pic_height / + 2 - + 1)]; + outbuf[oaddr] = temp; + } + } else { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf[iaddr]; + outbuf[oaddr] = temp; + iaddr++; + } + } + oaddr += 4; + } + if (y % 2 == 0) + iaddr = iaddr - (out_width >> 1); + } + // V + switch (packedFormat) { + case PACKED_YUYV: + oaddr = 3; + break; + case PACKED_YVYU: + oaddr = 1; + break; + case PACKED_UYVY: + oaddr = 2; + break; + case PACKED_VYUY: + oaddr = 0; + break; + default: + VLOG(ERR, "%s:%d Not supported format(%d)\n", __FILE__, + __LINE__, packedFormat); + break; + } + tbase = (pic_width * pic_height * 5) >> 2; + iaddr = tbase; + for (y = 0; y < out_height; y++) { + for (x = 0; x < (out_width >> 1); x++) { + if (y >= pic_height) { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf[tbase + x + + (pic_width / + 2) * (pic_height / + 2 - + 1)]; + outbuf[oaddr] = temp; + } + } else { + if (x >= (pic_width >> 1)) + outbuf[oaddr] = temp; + else { + temp = inbuf[iaddr]; + outbuf[oaddr] = temp; + iaddr++; + } + } + oaddr += 4; + } + if (y % 2 == 0) + iaddr = iaddr - (out_width >> 1); + } + } +} + +int write_image_to_file(FILE *fp, unsigned short *outbuf, int out_width, + int out_height, int pxl_format, int frm_format, + int packedFormat) +{ + int i = 0, x = 0, y = 0; + unsigned short tmp16 = 0; + unsigned int tmp32 = 0; + int width = 0, height = 0; + int size = 0; + unsigned char *temp = (unsigned char *)outbuf; + + size = (packedFormat) ? out_width * out_height * 2 : + ((out_width * out_height * 3) >> 1); + //***** 8bit + if (pxl_format == 0) { + for (i = 0; i < size; i++) + fputc(temp[i] & 0xff, fp); + } + //***** 16bit + else if (pxl_format == 1) { + for (i = 0; i < size; i++) { + // tmp16 = (outbuf[i]&0x3ff)<<6; + tmp16 = outbuf[i]; +#ifdef DUMP_REFC_TYPE + byte_swap((unsigned char *)&tmp16, 2); +#endif + fputc(tmp16 & 0xff, fp); + fputc((tmp16 >> 8) & 0xff, fp); + } + } else if (pxl_format == 5) { + for (i = 0; i < size; i++) { + // tmp16 = outbuf[i]&0x3ff; + tmp16 = outbuf[i]; +#ifdef DUMP_REFC_TYPE + byte_swap((unsigned char *)&tmp16, 2); +#endif + fputc(tmp16 & 0xff, fp); + fputc((tmp16 >> 8) & 0xff, fp); + } + } + //***** 32bit + else { + // Y + width = (packedFormat) ? out_width * 2 : out_width; + height = out_height; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x = x + 3) { + if (pxl_format == 2) { + if (x + 1 >= width) + tmp32 = ((outbuf[x + 0 + + width * y] & + 0x3ff) + << 22); + else if (x + 2 >= width) + tmp32 = ((outbuf[x + 0 + + width * y] & + 0x3ff) + << 22) | + ((outbuf[x + 1 + + width * y] & + 0x3ff) + << 12); + else + tmp32 = ((outbuf[x + 0 + + width * y] & + 0x3ff) + << 22) | + ((outbuf[x + 1 + + width * y] & + 0x3ff) + << 12) | + ((outbuf[x + 2 + + width * y] & + 0x3ff) + << 2); + } else if (pxl_format == 6) { + if (x + 1 >= width) + tmp32 = (outbuf[x + 0 + + width * y] & + 0x3ff); + else if (x + 2 >= width) + tmp32 = (outbuf[x + 0 + + width * y] & + 0x3ff) | + ((outbuf[x + 1 + + width * y] & + 0x3ff) + << 10); + else + tmp32 = (outbuf[x + 0 + + width * y] & + 0x3ff) | + ((outbuf[x + 1 + + width * y] & + 0x3ff) + << 10) | + ((outbuf[x + 2 + + width * y] & + 0x3ff) + << 20); + } + fputc((tmp32 >> 24) & 0xff, fp); + fputc((tmp32 >> 16) & 0xff, fp); + fputc((tmp32 >> 8) & 0xff, fp); + fputc(tmp32 & 0xff, fp); + } + } + if (packedFormat) // packed + return 1; + + width = (frm_format == 2 || frm_format == 3) ? out_width : + (out_width >> 1); + height = out_height >> 1; + // Cb + for (y = 0; y < height; y++) { + for (x = 0; x < width; x = x + 3) { + if (pxl_format == 2) { + if (x + 1 >= width) + tmp32 = ((outbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) + << 22); + else if (x + 2 >= width) + tmp32 = ((outbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) + << 22) | + ((outbuf[out_width * + out_height + + x + 1 + + width * y] & + 0x3ff) + << 12); + else + tmp32 = ((outbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) + << 22) | + ((outbuf[out_width * + out_height + + x + 1 + + width * y] & + 0x3ff) + << 12) | + ((outbuf[out_width * + out_height + + x + 2 + + width * y] & + 0x3ff) + << 2); + } else if (pxl_format == 6) { + if (x + 1 >= width) + tmp32 = (outbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff); + else if (x + 2 >= width) + tmp32 = (outbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) | + ((outbuf[out_width * + out_height + + x + 1 + + width * y] & + 0x3ff) + << 10); + else + tmp32 = (outbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) | + ((outbuf[out_width * + out_height + + x + 1 + + width * y] & + 0x3ff) + << 10) | + ((outbuf[out_width * + out_height + + x + 2 + + width * y] & + 0x3ff) + << 20); + } + fputc((tmp32 >> 24) & 0xff, fp); + fputc((tmp32 >> 16) & 0xff, fp); + fputc((tmp32 >> 8) & 0xff, fp); + fputc(tmp32 & 0xff, fp); + } + } + if (frm_format == 2 || frm_format == 3) // interleave + return 1; + + width = out_width >> 1; + height = out_height >> 1; + // Cr + for (y = 0; y < height; y++) { + for (x = 0; x < width; x = x + 3) { + if (pxl_format == 2) { + if (x + 1 >= width) + tmp32 = ((outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) + << 22); + else if (x + 2 >= width) + tmp32 = ((outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) + << 22) | + ((outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 1 + + width * y] & + 0x3ff) + << 12); + else + tmp32 = ((outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) + << 22) | + ((outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 1 + + width * y] & + 0x3ff) + << 12) | + ((outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 2 + + width * y] & + 0x3ff) + << 2); + } else if (pxl_format == 6) { + if (x + 1 >= width) + tmp32 = (outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff); + else if (x + 2 >= width) + tmp32 = (outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) | + ((outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 1 + + width * y] & + 0x3ff) + << 10); + else + tmp32 = (outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) | + ((outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 1 + + width * y] & + 0x3ff) + << 10) | + ((outbuf[((out_width * + out_height * + 5) >> + 2) + + x + 2 + + width * y] & + 0x3ff) + << 20); + } + fputc((tmp32 >> 24) & 0xff, fp); + fputc((tmp32 >> 16) & 0xff, fp); + fputc((tmp32 >> 8) & 0xff, fp); + fputc(tmp32 & 0xff, fp); + } + } + } + return 1; +} + +int write_image_to_mem(unsigned short *out_mem, unsigned short *inbuf, + int out_width, int out_height, int pxl_format, + int frm_format, int packedFormat) +{ + int i, x, y; + unsigned int tmp32 = 0; + int width = 0, height = 0; + int size = 0; + int oaddr = 0; + unsigned char *temp = (unsigned char *)out_mem; + + size = (packedFormat) ? out_width * out_height * 2 : + ((out_width * out_height * 3) >> 1); + + // 8BIT + if (pxl_format == 0) { + for (i = 0; i < size; i++) + temp[oaddr++] = inbuf[i] & 0xff; + } + // 16BIT + else if (pxl_format == 1 || pxl_format == 5) { + for (i = 0; i < size; i++) { + out_mem[oaddr++] = inbuf[i]; + } + } + // 32BIT + else { + // Y + width = (packedFormat) ? out_width * 2 : out_width; + height = out_height; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x = x + 3) { + if (pxl_format == 2) { + if (x + 1 >= width) + tmp32 = ((inbuf[x + 0 + + width * y] & + 0x3ff) + << 22); + else if (x + 2 >= width) + tmp32 = ((inbuf[x + 0 + + width * y] & + 0x3ff) + << 22) | + ((inbuf[x + 1 + + width * y] & + 0x3ff) + << 12); + else + tmp32 = ((inbuf[x + 0 + + width * y] & + 0x3ff) + << 22) | + ((inbuf[x + 1 + + width * y] & + 0x3ff) + << 12) | + ((inbuf[x + 2 + + width * y] & + 0x3ff) + << 2); + } else if (pxl_format == 6) { + if (x + 1 >= width) + tmp32 = (inbuf[x + 0 + + width * y] & + 0x3ff); + else if (x + 2 >= width) + tmp32 = (inbuf[x + 0 + + width * y] & + 0x3ff) | + ((inbuf[x + 1 + + width * y] & + 0x3ff) + << 10); + else + tmp32 = (inbuf[x + 0 + + width * y] & + 0x3ff) | + ((inbuf[x + 1 + + width * y] & + 0x3ff) + << 10) | + ((inbuf[x + 2 + + width * y] & + 0x3ff) + << 20); + } + temp[oaddr++] = (tmp32 >> 24) & 0xff; + temp[oaddr++] = (tmp32 >> 16) & 0xff; + temp[oaddr++] = (tmp32 >> 8) & 0xff; + temp[oaddr++] = tmp32 & 0xff; + } + } + if (packedFormat) // packed + return 1; + + width = (frm_format == 2 || frm_format == 3) ? out_width : + (out_width >> 1); + height = out_height >> 1; + // Cb + for (y = 0; y < height; y++) { + for (x = 0; x < width; x = x + 3) { + if (pxl_format == 2) { + if (x + 1 >= width) + tmp32 = ((inbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) + << 22); + else if (x + 2 >= width) + tmp32 = ((inbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) + << 22) | + ((inbuf[out_width * + out_height + + x + 1 + + width * y] & + 0x3ff) + << 12); + else + tmp32 = ((inbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) + << 22) | + ((inbuf[out_width * + out_height + + x + 1 + + width * y] & + 0x3ff) + << 12) | + ((inbuf[out_width * + out_height + + x + 2 + + width * y] & + 0x3ff) + << 2); + } else if (pxl_format == 6) { + if (x + 1 >= width) + tmp32 = (inbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff); + else if (x + 2 >= width) + tmp32 = (inbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) | + ((inbuf[out_width * + out_height + + x + 1 + + width * y] & + 0x3ff) + << 10); + else + tmp32 = (inbuf[out_width * + out_height + + x + 0 + + width * y] & + 0x3ff) | + ((inbuf[out_width * + out_height + + x + 1 + + width * y] & + 0x3ff) + << 10) | + ((inbuf[out_width * + out_height + + x + 2 + + width * y] & + 0x3ff) + << 20); + } + temp[oaddr++] = (tmp32 >> 24) & 0xff; + temp[oaddr++] = (tmp32 >> 16) & 0xff; + temp[oaddr++] = (tmp32 >> 8) & 0xff; + temp[oaddr++] = tmp32 & 0xff; + } + } + if (frm_format == 2 || frm_format == 3) // interleave + return 1; + + width = out_width >> 1; + height = out_height >> 1; + // Cr + for (y = 0; y < height; y++) { + for (x = 0; x < width; x = x + 3) { + if (pxl_format == 2) { + if (x + 1 >= width) + tmp32 = ((inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) + << 22); + else if (x + 2 >= width) + tmp32 = ((inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) + << 22) | + ((inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 1 + + width * y] & + 0x3ff) + << 12); + else + tmp32 = ((inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) + << 22) | + ((inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 1 + + width * y] & + 0x3ff) + << 12) | + ((inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 2 + + width * y] & + 0x3ff) + << 2); + } else if (pxl_format == 6) { + if (x + 1 >= width) + tmp32 = (inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff); + else if (x + 2 >= width) + tmp32 = (inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) | + ((inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 1 + + width * y] & + 0x3ff) + << 10); + else + tmp32 = (inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 0 + + width * y] & + 0x3ff) | + ((inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 1 + + width * y] & + 0x3ff) + << 10) | + ((inbuf[((out_width * + out_height * + 5) >> + 2) + + x + 2 + + width * y] & + 0x3ff) + << 20); + } + temp[oaddr++] = (tmp32 >> 24) & 0xff; + temp[oaddr++] = (tmp32 >> 16) & 0xff; + temp[oaddr++] = (tmp32 >> 8) & 0xff; + temp[oaddr++] = tmp32 & 0xff; + } + } + } + return 1; +} + +BOOL loaderYuvFeeder_Create(YuvFeederImpl *impl, const char *path, + Uint32 packed, Uint32 fbStride, Uint32 fbHeight) +{ + Context *ctx; + osal_file_t *fp; + Uint8 *pYuv; + + fp = osal_fopen(path, "rb"); + if (fp == NULL) { + VLOG(ERR, "%s:%d failed to open yuv file: %s\n", __func__, + __LINE__, path); + return FALSE; + } + + if (packed == 1) + pYuv = osal_malloc(fbStride * fbHeight * 3 * 2); // packed, + // unsigned + // short + else + pYuv = osal_malloc(fbStride * fbHeight * 3); // unsigned short + + ctx = (Context *)osal_malloc(sizeof(Context)); + if (ctx == NULL) { + osal_free(pYuv); + osal_fclose(fp); + return FALSE; + } + + osal_memset(ctx, 0, sizeof(Context)); + + ctx->fp = fp; + ctx->pYuv = pYuv; + impl->context = ctx; + + return TRUE; +} + +BOOL loaderYuvFeeder_Destory(YuvFeederImpl *impl) +{ + Context *ctx = (Context *)impl->context; + + osal_fclose(ctx->fp); + osal_free(ctx->pYuv); + osal_free(ctx); + return TRUE; +} + +BOOL loaderYuvFeeder_Feed(YuvFeederImpl *impl, Int32 coreIdx, FrameBuffer *fb, + size_t picWidth, size_t picHeight, void *arg) +{ + size_t srcFrameSize, lumaSize, chromaSize; + Int32 ystride; + Int32 out_frm_format; + Context *ctx = (Context *)impl->context; + + Uint8 *pYuv_int8 = ctx->pYuv; + osal_file_t yuvFp = ctx->fp; + Uint16 *pYuv_int16 = NULL, *pYuv2_int16 = NULL; + Int32 outsize, out_width, out_height, pxl_format, yuv3p4b = 0; + Int32 bitdepth = 0; + Uint32 i; + + UNREFERENCED_PARAMETER(arg); + + if (fb->cbcrInterleave == TRUE) { + if (ctx->nv21) + out_frm_format = OUTPUT_NV21; + else + out_frm_format = OUTPUT_NV12; + } else { + out_frm_format = OUTPUT_PLANAR; + } + + switch (fb->format) { + case FORMAT_420: + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + pxl_format = 0; + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_16BIT_LSB: + bitdepth = 10; + pxl_format = 5; + break; + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_YUYV_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_MSB: + bitdepth = 10; + pxl_format = 1; + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_32BIT_LSB: + bitdepth = 10; + pxl_format = 6; + yuv3p4b = 1; + break; + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_MSB: + bitdepth = 10; + pxl_format = 2; + yuv3p4b = 1; + break; + default: + VLOG(ERR, "%s:%d Not supported format(%d)\n", __FILE__, + __LINE__, fb->format); + break; + } + + { + int input_format = fb->format; + input_format = FORMAT_420; + if (yuv3p4b == 1) // calculate input YUV(16BIT) size + CalcYuvSize(FORMAT_420_P10_16BIT_LSB, picWidth, + picHeight, fb->cbcrInterleave, &lumaSize, + &chromaSize, &srcFrameSize, NULL, NULL, + NULL); + else if (bitdepth == 10) + CalcYuvSize(FORMAT_420_P10_16BIT_LSB, picWidth, + picHeight, fb->cbcrInterleave, &lumaSize, + &chromaSize, &srcFrameSize, NULL, NULL, + NULL); + else + CalcYuvSize(input_format, picWidth, picHeight, + fb->cbcrInterleave, &lumaSize, &chromaSize, + &srcFrameSize, NULL, NULL, NULL); + } + + out_width = (yuv3p4b && ctx->packedFormat == 0) ? + (((picWidth + 31) >> 5) << 5) : + picWidth; + out_height = (yuv3p4b) ? (((picHeight + 7) >> 3) << 3) : picHeight; + + outsize = (ctx->packedFormat) ? out_width * out_height * 2 : + ((out_width * out_height * 3) >> 1); + + outsize *= 2; // align margin + + pYuv_int16 = (Uint16 *)osal_malloc(outsize * sizeof(Uint16)); + if (pYuv_int16 == NULL) { + printf("malloc error: outbuf\n"); + return 0; + } + + pYuv2_int16 = (Uint16 *)osal_malloc(outsize * sizeof(Uint16)); + if (pYuv2_int16 == NULL) { + printf("malloc error: outbuf\n"); + return 0; + } + + if (bitdepth == 0) { + if (!osal_fread(pYuv_int8, 1, srcFrameSize, yuvFp)) { + if (!osal_feof(yuvFp)) + VLOG(ERR, + "YUV Data osal_fread failed file handle is 0x%x\n", + yuvFp); + + if (pYuv_int16) + osal_free(pYuv_int16); + if (pYuv2_int16) + osal_free(pYuv2_int16); + return 0; + } + for (i = 0; i < srcFrameSize; i++) + pYuv_int16[i] = (unsigned short)pYuv_int8[i]; + } else { + if (!osal_fread(pYuv_int16, 1, srcFrameSize, yuvFp)) { + if (!osal_feof(yuvFp)) + VLOG(ERR, + "YUV Data osal_fread failed file handle is 0x%x\n", + yuvFp); + + if (pYuv_int16) + osal_free(pYuv_int16); + if (pYuv2_int16) + osal_free(pYuv2_int16); + return 0; + } + if (yuv3p4b == 0) { + /************************************************************** + * when 10bit source YUV == LITTLE ENDIAN, 16LSB, alway + *do byte-swapping + **************************************************************/ + for (i = 0; i < (srcFrameSize >> 1); i++) { + pYuv_int8[i * 2] = + (Uint8)(pYuv_int16[i] >> 8) & 0xff; + pYuv_int8[i * 2 + 1] = + (Uint8)(pYuv_int16[i]) & 0xff; + } +#if 0 + /*************************************************************** + * when 10bit source YUV == BIG ENDIAN, 16LSB + **************************************************************/ + osal_memcpy(pYuv_int8, pYuv_int16, srcFrameSize); +#endif + } else { + /*************************************************************** + * when 10bit source YUV == LITTLE ENDIAN, 16LSB + **************************************************************/ + osal_memcpy(pYuv_int8, pYuv_int16, srcFrameSize); +#if 0 + /*************************************************************** + * when 10bit source YUV == BIG ENDIAN, 16LSB + **************************************************************/ + for (i = 0; i < srcFrameSize / 2; i++) { + pYuv_int8[i * 2] = + (Uint8)(pYuv_int16[i] >> 8) & 0xff; + pYuv_int8[i * 2 + 1] = + (Uint8)(pYuv_int16[i]) & 0xff; + } +#endif + } + } + if (yuv3p4b == 1 && ctx->packedFormat) { + ystride = picWidth; + } else if (yuv3p4b == 1) { + ystride = VPU_ALIGN32(picWidth); + } else { + ystride = VPU_ALIGN16(picWidth); + } + + if (out_frm_format != OUTPUT_PLANAR || ctx->packedFormat || yuv3p4b) { + conv_image((unsigned short *)pYuv2_int16, + ((bitdepth == 0) ? ((unsigned short *)pYuv_int16) : + ((unsigned short *)pYuv_int8)), + picWidth, picHeight, out_width, out_height, + out_frm_format, ctx->packedFormat); + write_image_to_mem((unsigned short *)pYuv_int8, + (unsigned short *)pYuv2_int16, ystride, + out_height, pxl_format, out_frm_format, + ctx->packedFormat); + } + +#if 0 + { + char fileName[MAX_FILE_PATH]; +#ifdef SAVE_WHOLE_LOADED_YUV +#else + FILE *save_fp; +#endif + char *frm_string; + char *pixel_string; + if (ctx->packedFormat == 1) + frm_string = "YUYV"; + else if (ctx->packedFormat == 2) + frm_string = "YVYU"; + else if (ctx->packedFormat == 3) + frm_string = "UYVY"; + else if (ctx->packedFormat == 4) + frm_string = "VYUY"; + else if (out_frm_format == OUTPUT_NV12) { + frm_string = "NV12"; + } else if (out_frm_format == OUTPUT_NV21) { + frm_string = "NV21"; + } else { + frm_string = "I420"; + } + + if (yuv3p4b) + pixel_string = "3P4B"; + else if (bitdepth == 10) + pixel_string = "1P2B"; + else + pixel_string = "8b"; + + sprintf(fileName, "loaded_%s_%dx%d_%s.yuv", pixel_string, + picWidth, picHeight, frm_string); + + VLOG(INFO, "save %s\n", fileName); +#ifdef SAVE_WHOLE_LOADED_YUV + if (save_frame_cnt == 0) + save_fp = osal_fopen(fileName, "wb"); +#else + save_fp = osal_fopen(fileName, "wb"); +#endif + if (yuv3p4b == 0) + write_image_to_file(save_fp, + (unsigned short *)pYuv_int8, + out_width, out_height, pxl_format, + out_frm_format, ctx->packedFormat); + else + write_image_to_file(save_fp, + (unsigned short *)pYuv2_int16, + out_width, out_height, pxl_format, + out_frm_format, ctx->packedFormat); +#ifdef SAVE_WHOLE_LOADED_YUV + if (++save_frame_cnt == save_frame_max) + osal_fclose(save_fp); +#else + osal_fclose(save_fp); +#endif + } +#endif + + if (yuv3p4b && ctx->packedFormat) { + out_width = ((picWidth * 2) + 2) / 3 * 4; + } else if (ctx->packedFormat) { + out_width *= 2; // 8bit packed mode(YUYV) only. (need to add + // 10bit cases later) + if (bitdepth != 0) // 10bit packed + out_width *= 2; + } + LoadYuvImageBurstFormat(coreIdx, pYuv_int8, out_width, out_height, fb, + TRUE); + + if (pYuv_int16) + osal_free(pYuv_int16); + if (pYuv2_int16) + osal_free(pYuv2_int16); + + return TRUE; +} + +BOOL loaderYuvFeeder_Configure(YuvFeederImpl *impl, Uint32 cmd, YuvInfo yuv) +{ + Context *ctx = (Context *)impl->context; + UNREFERENCED_PARAMETER(cmd); + + ctx->cbcrInterleave = yuv.cbcrInterleave; + ctx->nv21 = yuv.nv21; + ctx->packedFormat = yuv.packedFormat; + + return TRUE; +} + +YuvFeederImpl loaderYuvFeederImpl = { + NULL, + loaderYuvFeeder_Create, + loaderYuvFeeder_Feed, + loaderYuvFeeder_Destory, + loaderYuvFeeder_Configure, +}; diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/yuvfeeder.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/yuvfeeder.c new file mode 100644 index 0000000000..3429eaa06c --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/helper/yuv/yuvfeeder.c @@ -0,0 +1,325 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "main_helper.h" + +extern YuvFeederImpl loaderYuvFeederImpl; + +#ifdef REDUNDENT_CODE +BOOL loaderYuvFeeder_Create(YuvFeederImpl *impl, const char *path, + Uint32 packed, Uint32 fbStride, Uint32 fbHeight); + +BOOL loaderYuvFeeder_Destory(YuvFeederImpl *impl); + +BOOL loaderYuvFeeder_Feed(YuvFeederImpl *impl, Int32 coreIdx, FrameBuffer *fb, + size_t picWidth, size_t picHeight, void *arg); + +BOOL loaderYuvFeeder_Configure(YuvFeederImpl *impl, Uint32 cmd, YuvInfo yuv); + +BOOL fpgaYuvFeeder_Create(YuvFeederImpl *impl, const char *path, Uint32 packed, + Uint32 fbStride, Uint32 fbHeight); + +BOOL fpgaYuvFeeder_Feed(YuvFeederImpl *impl, Int32 coreIdx, FrameBuffer *fb, + size_t picWidth, size_t picHeight, void *arg); + +BOOL fpgaYuvFeeder_Destory(YuvFeederImpl *impl); + +BOOL fpgaYuvFeeder_Configure(YuvFeederImpl *impl, Uint32 cmd, YuvInfo yuv); +#endif + +BOOL yuvAddrFeeder_Create(YuvFeederImpl *impl, const char *path, Uint32 packed, + Uint32 fbStride, Uint32 fbHeight); + +BOOL yuvAddrFeeder_Feed(YuvFeederImpl *impl, Int32 coreIdx, FrameBuffer *fb, + size_t picWidth, size_t picHeight, void *arg); + +BOOL yuvAddrFeeder_Destory(YuvFeederImpl *impl); + +BOOL yuvAddrFeeder_Configure(YuvFeederImpl *impl, Uint32 cmd, YuvInfo yuv); + +static void printYuvInfo(YuvInfo *yuvInfo); + +static BOOL yuvYuvFeeder_Create(YuvFeederImpl *impl, const char *path, + Uint32 packed, Uint32 fbStride, Uint32 fbHeight) +{ + yuvContext *ctx; + osal_file_t *fp; + Uint8 *pYuv; + + fp = osal_fopen(path, "rb"); + if (fp == NULL) { + CVI_VC_ERR("failed to open yuv file: %s\n", path); + return FALSE; + } + + if (packed == 1) + pYuv = osal_malloc((fbStride * fbHeight * 3) << 2); // packed, + // unsigned + // short + else if (packed == 0) + pYuv = osal_malloc((fbStride * fbHeight * 3) >> 1); // unsigned + // short + else + pYuv = osal_malloc((fbStride * fbHeight * 3) << 1); // unsigned + // short + + ctx = (yuvContext *)osal_malloc(sizeof(yuvContext)); + if (ctx == NULL) { + osal_free(pYuv); + osal_fclose(fp); + return FALSE; + } + + osal_memset(ctx, 0, sizeof(yuvContext)); + + ctx->fp = fp; + ctx->pYuv = pYuv; + impl->context = ctx; + + return TRUE; +} + +static BOOL yuvYuvFeeder_Destory(YuvFeederImpl *impl) +{ + yuvContext *ctx = (yuvContext *)impl->context; + + osal_fclose(ctx->fp); + osal_free(ctx->pYuv); + osal_free(ctx); + return TRUE; +} + +static BOOL yuvYuvFeeder_Feed(YuvFeederImpl *impl, Int32 coreIdx, + FrameBuffer *fb, size_t picWidth, + size_t picHeight, void *arg) +{ + yuvContext *ctx = (yuvContext *)impl->context; + Uint8 *pYuv = ctx->pYuv; + size_t frameSize; + size_t frameSizeY; + size_t frameSizeC; + Int32 bitdepth = 0; + Int32 yuv3p4b = 0; + Int32 packedFormat = 0; + Uint32 outWidth = 0; + Uint32 outHeight = 0; + + CalcYuvSize(fb->format, picWidth, picHeight, fb->cbcrInterleave, + &frameSizeY, &frameSizeC, &frameSize, &bitdepth, + &packedFormat, &yuv3p4b); + + // Load source one picture image to encode to SDRAM frame buffer. + if (!osal_fread(pYuv, 1, frameSize, ctx->fp)) { + if (osal_feof(ctx->fp) == 0) + VLOG(ERR, + "Yuv Data osal_fread failed file handle is 0x%x\n", + ctx->fp); + return FALSE; + } + + if (fb->mapType == LINEAR_FRAME_MAP) { + outWidth = (yuv3p4b && packedFormat == 0) ? + (((picWidth + 31) >> 5) << 5) : + picWidth; + outHeight = + (yuv3p4b) ? (((picHeight + 7) >> 3) << 3) : picHeight; + + if (yuv3p4b && packedFormat) { + outWidth = ((picWidth * 2) + 2) / 3 * 4; + } else if (packedFormat) { + outWidth *= 2; // 8bit packed mode(YUYV) only. (need to + // add 10bit cases later) + if (bitdepth != 0) // 10bit packed + outWidth *= 2; + } + LoadYuvImageBurstFormat(coreIdx, pYuv, outWidth, outHeight, fb, + ctx->srcPlanar); + } else { + TiledMapConfig mapConfig; + + osal_memset((void *)&mapConfig, 0x00, sizeof(TiledMapConfig)); + if (arg != NULL) { + osal_memcpy((void *)&mapConfig, arg, + sizeof(TiledMapConfig)); + } + + LoadTiledImageYuvBurst(coreIdx, pYuv, picWidth, picHeight, fb, + mapConfig); + } + + return TRUE; +} + +static BOOL yuvYuvFeeder_Configure(YuvFeederImpl *impl, Uint32 cmd, YuvInfo yuv) +{ + yuvContext *ctx = (yuvContext *)impl->context; + UNREFERENCED_PARAMETER(cmd); + + ctx->fbStride = yuv.srcStride; + ctx->cbcrInterleave = yuv.cbcrInterleave; + ctx->srcPlanar = yuv.srcPlanar; + + return TRUE; +} + +YuvFeederImpl yuvYuvFeederImpl = { NULL, yuvYuvFeeder_Create, yuvYuvFeeder_Feed, + yuvYuvFeeder_Destory, + yuvYuvFeeder_Configure }; + +/*lint -esym(438, ap) */ +YuvFeeder YuvFeeder_Create(Uint32 type, const char *srcFilePath, + YuvInfo yuvInfo) +{ + AbstractYuvFeeder *feeder; + YuvFeederImpl *impl; + BOOL success = FALSE; + + CVI_VC_TRACE("type = %d\n", type); + printYuvInfo(&yuvInfo); + + if (srcFilePath == NULL) { + CVI_VC_ERR("src path is NULL\n"); + return NULL; + } + + // Create YuvFeeder for type. + switch (type) { + case SOURCE_YUV: + impl = osal_malloc(sizeof(YuvFeederImpl)); + impl->Create = &yuvYuvFeeder_Create; + impl->Feed = &yuvYuvFeeder_Feed; + impl->Destroy = &yuvYuvFeeder_Destory; + impl->Configure = &yuvYuvFeeder_Configure; + + success = impl->Create(impl, srcFilePath, yuvInfo.packedFormat, + yuvInfo.srcStride, yuvInfo.srcHeight); + if (success == TRUE) { + impl->Configure(impl, 0, yuvInfo); + } + break; +#ifdef REDUNDENT_CODE + case SOURCE_YUV_WITH_LOADER: + impl = osal_malloc(sizeof(YuvFeederImpl)); + impl->Create = &loaderYuvFeeder_Create; + impl->Feed = &loaderYuvFeeder_Feed; + impl->Destroy = &loaderYuvFeeder_Destory; + impl->Configure = &loaderYuvFeeder_Configure; + + success = impl->Create(impl, srcFilePath, yuvInfo.packedFormat, + yuvInfo.srcStride, yuvInfo.srcHeight); + if (success == TRUE) { + impl->Configure(impl, 0, yuvInfo); + } + break; + case SOURCE_YUV_FPGA: + impl = osal_malloc(sizeof(YuvFeederImpl)); + impl->Create = &fpgaYuvFeeder_Create; + impl->Feed = &fpgaYuvFeeder_Feed; + impl->Destroy = &fpgaYuvFeeder_Destory; + impl->Configure = &fpgaYuvFeeder_Configure; + + success = impl->Create(impl, srcFilePath, yuvInfo.packedFormat, + yuvInfo.srcStride, yuvInfo.srcHeight); + if (success == TRUE) { + impl->Configure(impl, 0, yuvInfo); + } else { + CVI_VC_ERR("impl->Create\n"); + } + break; +#endif + case SOURCE_YUV_ADDR: + impl = osal_malloc(sizeof(YuvFeederImpl)); + impl->Create = &yuvAddrFeeder_Create; + impl->Feed = &yuvAddrFeeder_Feed; + impl->Destroy = &yuvAddrFeeder_Destory; + impl->Configure = &yuvAddrFeeder_Configure; + + success = impl->Create(impl, srcFilePath, yuvInfo.packedFormat, + yuvInfo.srcStride, yuvInfo.srcHeight); + if (success == TRUE) { + impl->Configure(impl, 0, yuvInfo); + } else { + CVI_VC_ERR("impl->Create\n"); + } + break; + default: + CVI_VC_ERR("Unknown YuvFeeder Type\n"); + success = FALSE; + break; + } + + if (success == FALSE) + return NULL; + + feeder = (AbstractYuvFeeder *)osal_malloc(sizeof(AbstractYuvFeeder)); + feeder->impl = impl; + + CVI_VC_TRACE("feeder = 0x%p, impl = 0x%p\n", feeder, impl); + return feeder; +} + +static void printYuvInfo(YuvInfo *yuvInfo) +{ + CVI_VC_TRACE("cbcrInterleave = %d\n", yuvInfo->cbcrInterleave); + CVI_VC_TRACE("nv21 = %d\n", yuvInfo->nv21); + CVI_VC_TRACE("packedFormat = %d\n", yuvInfo->packedFormat); + CVI_VC_TRACE("srcFormat = %d\n", yuvInfo->srcFormat); + CVI_VC_TRACE("srcPlanar = %d\n", yuvInfo->srcPlanar); + CVI_VC_TRACE("srcStride = %d\n", yuvInfo->srcStride); + CVI_VC_TRACE("srcHeight = %d\n", yuvInfo->srcHeight); +} + +/*lint +esym(438, ap) */ + +BOOL YuvFeeder_Destroy(YuvFeeder feeder) +{ + YuvFeederImpl *impl = NULL; + AbstractYuvFeeder *yuvfeeder = (AbstractYuvFeeder *)feeder; + + if (yuvfeeder == NULL) { + CVI_VC_ERR("Invalid handle\n"); + return FALSE; + } + + impl = yuvfeeder->impl; + + impl->Destroy(impl); + osal_free(impl); + return TRUE; +} + +BOOL YuvFeeder_Feed(YuvFeeder feeder, Uint32 coreIdx, FrameBuffer *fb, + size_t picWidth, size_t picHeight, void *arg) +{ + YuvFeederImpl *impl = NULL; + AbstractYuvFeeder *absFeeder = (AbstractYuvFeeder *)feeder; + Int32 ret; + + CVI_VC_TRACE("feeder = 0x%p, absFeeder = 0x%p fb=%p\n", feeder, + absFeeder, fb); + if (absFeeder == NULL) { + CVI_VC_ERR("Invalid handle\n"); + return FALSE; + } + + impl = absFeeder->impl; + CVI_VC_TRACE("impl = 0x%p impl->Feed=%p\n", impl, impl->Feed); + + ret = impl->Feed(impl, coreIdx, fb, picWidth, picHeight, arg); + if (ret == TRUE) + fb->srcBufState = SRC_BUFFER_SRC_LOADED; + return ret; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.c new file mode 100644 index 0000000000..0792e0b696 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.c @@ -0,0 +1,6466 @@ +//------------------------------------------------------------------------------ +// File: main.c +// +// Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved. +//------------------------------------------------------------------------------ +#include +#include +#include +#include + +#include "module_common.h" +#include +#include + +#include "cvi_vcodec_version.h" +#include "main_helper.h" +#include "vpuapi.h" +#include "main_enc_cvitest.h" +#include "cvitest_internal.h" +#include "cvi_enc_internal.h" +#include "coda9/coda9.h" +#include +#include +#include +#include +#include "product.h" +#include "../cvi/cvi_enc_rc.h" +#include "cvi_vcodec_lib.h" +#include +#include "cvi_vc_drv.h" +#include "cvi_vc_getopt.h" + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) +#include +#endif + +#ifdef CLI_DEBUG_SUPPORT +#include "tcli.h" +#endif + +#define STREAM_READ_SIZE (512 * 16) +#define STREAM_READ_ALL_SIZE (0) +#define STREAM_BUF_MIN_SIZE (0x18000) + +#define STREAM_BUF_SIZE 0x400000 // max bitstream size (4MB) +#define WAVE4_ENC_REPORT_SIZE 144 +#define INIT_TEST_ENCODER_OK 10 +#define YUV_NAME "../img/3-1920x1080.yuv" +#define BS_NAME "CVISDK" + +#define SECONDARY_AXI_H264 0xf +#define SECONDARY_AXI_H265 0x7 +#define TIME_BLOCK_MODE (-1) +#define RET_VCODEC_TIMEOUT (-2) + +#ifndef UNUSED +#define UNUSED(x) ((void)(x)) +#endif + +typedef enum _E_VENC_VB_SOURCE { + VB_SOURCE_TYPE_COMMON = 0, + VB_SOURCE_TYPE_PRIVATE = 2, + VB_SOURCE_TYPE_USER = 3 +} E_VENC_VB_SOURCE; + +#define COMP(a, b) \ + do { \ + if ((a) != (b)) { \ + CVI_VC_ERR("0x%08X != 0x%X\n", (a), (b)); \ + } \ + } while (0) + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#endif + +#ifndef ROUND_UP_N_BIT +#define ROUND_UP_N_BIT(val, bit) ((((val) + (1 << (bit)) - 1) >> (bit)) << (bit)) +#endif + +#if CFG_MEM +DRAM_CFG dramCfg; +#endif + +#if USE_KERNEL_MODE +extern CVI_U32 err_frm_skip[VENC_MAX_CHN_NUM]; +#endif + +#define REPEAT_SPS 1 + +int gNumInstance = 1; + +static char optYuvPath[MAX_FILE_PATH]; +#ifdef VC_DRIVER_TEST +char gCfgFileName[MAX_NUM_INSTANCE][MAX_FILE_PATH]; +#endif + +static int initMcuEnv(TestEncConfig *pEncConfig); +static int initEncOneFrame(stTestEncoder *pTestEnc, TestEncConfig *pEncConfig); +static void cviDumpEncConfig(TestEncConfig *pEncConfig); +#ifndef VC_DEBUG_BASIC_LEVEL +static void cviDumpRcAttr(TestEncConfig *pEncConfig); +static void cviDumpRcParam(TestEncConfig *pEncConfig); +static void cviDumpCodingParam(TestEncConfig *pEncConfig); +static void cviDumpGopMode(TestEncConfig *pEncConfig); +#endif +#ifdef SUPPORT_DONT_READ_STREAM +static int updateBitstream(vpu_buffer_t *vb, Int32 size); +#endif +static int cviEncodeOneFrame(stTestEncoder *pTestEnc); +/* +static void RcChangeSetParameter(EncHandle handle, TestEncConfig encConfig, + EncOpenParam *encOP, EncParam *encParam, + Uint32 frameIdx, Uint32 fieldDone, + int field_flag, vpu_buffer_t vbRoi); */ +static void cviPicParamChangeCtrl(EncHandle handle, TestEncConfig *pEncConfig, + EncOpenParam *pEncOP, EncParam *encParam, + Uint32 frameIdx); + +#ifdef VC_DRIVER_TEST +static int cviGetStream(stTestEncoder *pTestEnc); +#endif +static int cviCheckOutputInfo(stTestEncoder *pTestEnc); +static int cviCheckEncodeEnd(stTestEncoder *pTestEnc); +static int cviCheckAndCompareBitstream(stTestEncoder *pTestEnc); +static int cviGetEncodedInfo(stTestEncoder *pTestEnc, int s32MilliSec); +static void cviCloseVpuEnc(stTestEncoder *pTestEnc); +static void cviDeInitVpuEnc(stTestEncoder *pTestEnc); +static void *cviInitEncoder(stTestEncoder *pTestEnc, TestEncConfig *pEncConfig); +static int cviGetOneStream(void *handle, cviVEncStreamInfo *pStreamInfo, + int s32MilliSec); +static int cviCheckSuperFrame(stTestEncoder *pTestEnc); +static int cviProcessSuperFrame(stTestEncoder *pTestEnc, + cviVEncStreamInfo *pStreamInfo, + int s32MilliSec); +static int cviReEncodeIDR(stTestEncoder *pTestEnc, + cviVEncStreamInfo *pStreamInfo, int s32MilliSec); +#ifdef VC_DRIVER_TEST +static int parseArgs(int argc, char **argv, TestEncConfig *pEncConfig); +#endif +static int checkEncConfig(TestEncConfig *pEncConfig, Uint32 productId); +#ifdef VC_DRIVER_TEST +static int initEncConfigByArgv(int argc, char **argv, TestEncConfig *pEncConfig); +#endif +static void initEncConfigByCtx(TestEncConfig *pEncConfig, + cviInitEncConfig * pInitEncCfg); +static int cviVEncGetVbInfo(stTestEncoder *pTestEnc, void *arg); +static int cviVEncSetVbBuffer(stTestEncoder *pTestEnc, void *arg); +static int _cviVencCalculateBufInfo(stTestEncoder *pTestEnc, int *butcnt, + int *bufsize); +static int cviVEncRegReconBuf(stTestEncoder *pTestEnc, void *arg); +static int _cviVEncRegFrameBuffer(stTestEncoder *pTestEnc, void *arg); +static int cviVEncSetInPixelFormat(stTestEncoder *pTestEnc, void *arg); +static int cviVEncSetFrameParam(stTestEncoder *pTestEnc, void *arg); +static int cviVEncCalcFrameParam(stTestEncoder *pTestEnc, void *arg); +#if 0 +static int cviVEncSetSbMode(stTestEncoder *pTestEnc, void *arg); +static int cviVEncStartSbMode(stTestEncoder *pTestEnc, void *arg); +static int cviVEncUpdateSbWptr(stTestEncoder *pTestEnc, void *arg); +static int cviVEncResetSb(stTestEncoder *pTestEnc, void *arg); +static int cviVEncSbEnDummyPush(stTestEncoder *pTestEnc, void *arg); +static int cviVEncSbTrigDummyPush(stTestEncoder *pTestEnc, void *arg); +static int cviVEncSbDisDummyPush(stTestEncoder *pTestEnc, void *arg); +static int cviVEncSbGetSkipFrmStatus(stTestEncoder *pTestEnc, void *arg); +#endif +#if CFG_MEM +static int checkDramCfg(DRAM_CFG *pDramCfg); +#endif +static int pfnWaitEncodeDone(void *param); +static CVI_S32 cviSetSbSetting(cviVencSbSetting *pstSbSetting); + +extern void cvi_VENC_SBM_IrqEnable(void); + + +void cviVcodecGetVersion(void) +{ + CVI_VC_INFO("VCODEC_VERSION = %s\n", VCODEC_VERSION); +} +#ifdef VC_DRIVER_TEST +static void help(struct OptionExt *opt, const char *programName) +{ + int i; + + CVI_VC_INFO( + "------------------------------------------------------------------------------\n"); + CVI_VC_INFO("%s(API v%d.%d.%d)\n", programName, API_VERSION_MAJOR, + API_VERSION_MINOR, API_VERSION_PATCH); + CVI_VC_INFO("\tAll rights reserved by Chips&Media(C)\n"); + CVI_VC_INFO("\tSample program controlling the Chips&Media VPU\n"); + CVI_VC_INFO( + "------------------------------------------------------------------------------\n"); + CVI_VC_INFO("%s [option]\n", programName); + CVI_VC_INFO("-h help\n"); + CVI_VC_INFO("-n [num] output frame number\n"); + CVI_VC_INFO("-v print version information\n"); + CVI_VC_INFO( + "-c compare with golden bitstream\n"); + + for (i = 0; i < MAX_GETOPT_OPTIONS; i++) { + if (opt[i].name == NULL) + break; + CVI_VC_INFO("%s", opt[i].help); + } +} +#endif +static void cviDumpEncConfig(TestEncConfig *pEncConfig) +{ +#ifndef VC_DEBUG_BASIC_LEVEL + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + cviDumpRcAttr(pEncConfig); + cviDumpRcParam(pEncConfig); + cviDumpCodingParam(pEncConfig); + cviDumpGopMode(pEncConfig); + + CVI_VC_CFG("enSuperFrmMode = %d\n", pCviEc->enSuperFrmMode); + CVI_VC_CFG("cviRcEn = %d\n", pCviEc->cviRcEn); + CVI_VC_CFG("rotAngle %d\n", pEncConfig->rotAngle); + CVI_VC_CFG("mirDir %d\n", pEncConfig->mirDir); + CVI_VC_CFG("useRot %d\n", pEncConfig->useRot); + CVI_VC_CFG("qpReport %d\n", pEncConfig->qpReport); + CVI_VC_CFG("ringBufferEnable %d\n", pEncConfig->ringBufferEnable); + CVI_VC_CFG("rcIntraQp %d\n", pEncConfig->rcIntraQp); + CVI_VC_CFG("outNum %d\n", pEncConfig->outNum); + CVI_VC_CFG("instNum %d\n", pEncConfig->instNum); + CVI_VC_CFG("coreIdx %d\n", pEncConfig->coreIdx); + CVI_VC_CFG("mapType %d\n", pEncConfig->mapType); + CVI_VC_CFG("lineBufIntEn %d\n", pEncConfig->lineBufIntEn); + CVI_VC_CFG("bEsBufQueueEn %d\n", pEncConfig->bEsBufQueueEn); + CVI_VC_CFG("en_container %d\n", pEncConfig->en_container); + CVI_VC_CFG("container_frame_rate %d\n", + pEncConfig->container_frame_rate); + CVI_VC_CFG("picQpY %d\n", pEncConfig->picQpY); + CVI_VC_CFG("cbcrInterleave %d\n", pEncConfig->cbcrInterleave); + CVI_VC_CFG("nv21 %d\n", pEncConfig->nv21); + CVI_VC_CFG("needSourceConvert %d\n", pEncConfig->needSourceConvert); + CVI_VC_CFG("packedFormat %d\n", pEncConfig->packedFormat); + CVI_VC_CFG("srcFormat %d\n", pEncConfig->srcFormat); + CVI_VC_CFG("srcFormat3p4b %d\n", pEncConfig->srcFormat3p4b); + CVI_VC_CFG("decodingRefreshType %d\n", pEncConfig->decodingRefreshType); + CVI_VC_CFG("tempLayer %d\n", pEncConfig->tempLayer); + CVI_VC_CFG("useDeriveLambdaWeight %d\n", + pEncConfig->useDeriveLambdaWeight); + CVI_VC_CFG("dynamicMergeEnable %d\n", pEncConfig->dynamicMergeEnable); + CVI_VC_CFG("independSliceMode %d\n", pEncConfig->independSliceMode); + CVI_VC_CFG("independSliceModeArg %d\n", + pEncConfig->independSliceModeArg); + CVI_VC_CFG("RcEnable %d\n", pEncConfig->RcEnable); + CVI_VC_CFG("bitdepth %d\n", pEncConfig->bitdepth); + CVI_VC_CFG("secondary_axi %d\n", pEncConfig->secondary_axi); + CVI_VC_CFG("stream_endian %d\n", pEncConfig->stream_endian); + CVI_VC_CFG("frame_endian %d\n", pEncConfig->frame_endian); + CVI_VC_CFG("source_endian %d\n", pEncConfig->source_endian); + CVI_VC_CFG("compare_type %d\n", pEncConfig->compare_type); + CVI_VC_CFG("yuv_mode %d\n", pEncConfig->yuv_mode); + CVI_VC_CFG("loopCount %d\n", pEncConfig->loopCount); + CVI_VC_CFG("bIsoSendFrmEn %d\n", pEncConfig->bIsoSendFrmEn); +#endif +} + +#ifndef VC_DEBUG_BASIC_LEVEL +static void cviDumpRcAttr(TestEncConfig *pEncConfig) +{ + + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + CVI_VC_CFG("stdMode %d\n", pEncConfig->stdMode); + CVI_VC_CFG("picWidth %d\n", pEncConfig->picWidth); + CVI_VC_CFG("picHeight %d\n", pEncConfig->picHeight); + CVI_VC_CFG("rcMode %d\n", pEncConfig->rcMode); + if (pCviEc->virtualIPeriod) { + CVI_VC_CFG("gop %d\n", pCviEc->virtualIPeriod); + } else { + CVI_VC_CFG("gop %d\n", pCviEc->gop); + } + CVI_VC_CFG("framerate %d\n", pCviEc->framerate); + CVI_VC_CFG("statTime %d\n", pCviEc->statTime); + CVI_VC_CFG("bitrate %d\n", pCviEc->bitrate); + CVI_VC_CFG("maxbitrate %d\n", pCviEc->maxbitrate); + CVI_VC_CFG("iqp %d\n", pCviEc->iqp); + CVI_VC_CFG("pqp %d\n", pCviEc->pqp); +} + +static void cviDumpRcParam(TestEncConfig *pEncConfig) +{ + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + CVI_VC_CFG("RowQpDelta %d\n", pCviEc->u32RowQpDelta); + CVI_VC_CFG("ThrdLv %d\n", pCviEc->u32ThrdLv); + CVI_VC_CFG("firstFrmstartQp %d\n", pCviEc->firstFrmstartQp); + CVI_VC_CFG("initialDelay %d\n", pCviEc->initialDelay); + CVI_VC_CFG("MaxIprop %d\n", pCviEc->u32MaxIprop); + CVI_VC_CFG("MaxQp %d, MinQp %d\n", pCviEc->u32MaxQp, pCviEc->u32MinQp); + CVI_VC_CFG("MaxIQp %d, MinIQp %d\n", pCviEc->u32MaxIQp, + pCviEc->u32MinIQp); + CVI_VC_CFG("changePos %d\n", pEncConfig->changePos); + CVI_VC_CFG("StillPercent %d\n", pCviEc->s32MinStillPercent); + CVI_VC_CFG("StillQP %d\n", pCviEc->u32MaxStillQP); + CVI_VC_CFG("MotionSensitivity %d\n", pCviEc->u32MotionSensitivity); + CVI_VC_CFG("AvbrPureStillThr %d\n", pCviEc->s32AvbrPureStillThr); + CVI_VC_CFG("AvbrFrmLostOpen %d\n", pCviEc->s32AvbrFrmLostOpen); +} + +static void cviDumpCodingParam(TestEncConfig *pEncConfig) +{ + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + CVI_VC_CFG("frmLostOpen %d\n", pEncConfig->frmLostOpen); + CVI_VC_CFG("frameSkipBufThr %d\n", pCviEc->frmLostBpsThr); + CVI_VC_CFG("encFrmGaps %d\n", pCviEc->encFrmGaps); + CVI_VC_CFG("IntraCost %d\n", pCviEc->u32IntraCost); + CVI_VC_CFG("chroma_qp_index_offset %d\n", + pCviEc->h264Trans.chroma_qp_index_offset); + CVI_VC_CFG("cb_qp_offset %d\n", pCviEc->h265Trans.cb_qp_offset); + CVI_VC_CFG("cr_qp_offset %d\n", pCviEc->h265Trans.cr_qp_offset); + CVI_VC_CFG("slice_split %d\n", pCviEc->h265Split.bSplitEnable); +} + +static void cviDumpGopMode(TestEncConfig *pEncConfig) +{ + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + CVI_VC_CFG("IPQpDelta %d\n", pCviEc->s32IPQpDelta); + if (pCviEc->virtualIPeriod) { + CVI_VC_CFG("BgInterval %d\n", pCviEc->gop); + } +} +#endif + +static int _updateEncFrameInfo(stTestEncoder *pTestEnc, + FrameBufferFormat *psrcFrameFormat) +{ + EncOpenParam *pEncOP = &pTestEnc->encOP; + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + // width = 8-aligned (CU unit) + pTestEnc->srcFrameWidth = VPU_ALIGN8(pTestEnc->encOP.picWidth); + CVI_VC_CFG("srcFrameWidth = %d\n", pTestEnc->srcFrameWidth); + + // height = 8-aligned (CU unit) + pTestEnc->srcFrameHeight = VPU_ALIGN8(pTestEnc->encOP.picHeight); + CVI_VC_CFG("srcFrameHeight = %d\n", pTestEnc->srcFrameHeight); + + // stride should be a 32-aligned. + pTestEnc->srcFrameStride = VPU_ALIGN32(pTestEnc->encOP.picWidth); + + if (strlen(pTestEnc->encConfig.cfgFileName) != 0) { + if (pTestEnc->encOP.srcBitDepth == 8) { + pTestEnc->encConfig.srcFormat = FORMAT_420; + } else if (pTestEnc->encOP.srcBitDepth == 10) { + pTestEnc->encConfig.srcFormat = + FORMAT_420_P10_16BIT_LSB; + if (pTestEnc->encConfig.yuv_mode == + YUV_MODE_YUV_LOADER) { + CVI_VC_INFO("Need to check YUV style.\n"); + pTestEnc->encConfig.srcFormat = + FORMAT_420_P10_16BIT_MSB; + } + if (pTestEnc->encConfig.srcFormat3p4b == 1) { + pTestEnc->encConfig.srcFormat = + FORMAT_420_P10_32BIT_MSB; + } + if (pTestEnc->encConfig.srcFormat3p4b == 2) { + pTestEnc->encConfig.srcFormat = + FORMAT_420_P10_32BIT_LSB; + } + } + } + + if (pTestEnc->encConfig.packedFormat >= PACKED_YUYV) + pTestEnc->encConfig.srcFormat = FORMAT_422; + + CVI_VC_TRACE("packedFormat = %d\n", pTestEnc->encConfig.packedFormat); + + if (pTestEnc->encConfig.srcFormat == FORMAT_422 && + pTestEnc->encConfig.packedFormat >= PACKED_YUYV) { + int p10bits = pTestEnc->encConfig.srcFormat3p4b == 0 ? 16 : 32; + FrameBufferFormat srcFormat = + GetPackedFormat(pTestEnc->encOP.srcBitDepth, + pTestEnc->encConfig.packedFormat, + p10bits, 1); + + if (srcFormat == (FrameBufferFormat)-1) { + CVI_VC_ERR("fail to GetPackedFormat\n"); + return TE_ERR_ENC_INIT; + } + pTestEnc->encOP.srcFormat = srcFormat; + *psrcFrameFormat = srcFormat; + pTestEnc->encOP.nv21 = 0; + pTestEnc->encOP.cbcrInterleave = 0; + } else { + pTestEnc->encOP.srcFormat = pTestEnc->encConfig.srcFormat; + *psrcFrameFormat = pTestEnc->encConfig.srcFormat; + pTestEnc->encOP.nv21 = pTestEnc->encConfig.nv21; + } + pTestEnc->encOP.packedFormat = pTestEnc->encConfig.packedFormat; + + CVI_VC_TRACE("packedFormat = %d\n", pTestEnc->encConfig.packedFormat); + + if (pEncOP->bitstreamFormat == STD_AVC) { + if (pEncCfg->rotAngle == 90 || pEncCfg->rotAngle == 270) { + pTestEnc->framebufWidth = pEncOP->picHeight; + pTestEnc->framebufHeight = pEncOP->picWidth; + } else { + pTestEnc->framebufWidth = pEncOP->picWidth; + pTestEnc->framebufHeight = pEncOP->picHeight; + } + + pTestEnc->framebufWidth = VPU_ALIGN16(pTestEnc->framebufWidth); + + // To cover interlaced picture + pTestEnc->framebufHeight = + VPU_ALIGN32(pTestEnc->framebufHeight); + + } else { + pTestEnc->framebufWidth = VPU_ALIGN8(pTestEnc->encOP.picWidth); + pTestEnc->framebufHeight = + VPU_ALIGN8(pTestEnc->encOP.picHeight); + + if ((pTestEnc->encConfig.rotAngle != 0 || + pTestEnc->encConfig.mirDir != 0) && + !(pTestEnc->encConfig.rotAngle == 180 && + pTestEnc->encConfig.mirDir == MIRDIR_HOR_VER)) { + pTestEnc->framebufWidth = + VPU_ALIGN32(pTestEnc->encOP.picWidth); + pTestEnc->framebufHeight = + VPU_ALIGN32(pTestEnc->encOP.picHeight); + } + + if (pTestEnc->encConfig.rotAngle == 90 || + pTestEnc->encConfig.rotAngle == 270) { + pTestEnc->framebufWidth = + VPU_ALIGN32(pTestEnc->encOP.picHeight); + pTestEnc->framebufHeight = + VPU_ALIGN32(pTestEnc->encOP.picWidth); + } + } + + return RETCODE_SUCCESS; +} + +static int initEncOneFrame(stTestEncoder *pTestEnc, TestEncConfig *pEncConfig) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + EncOpenParam *pEncOP = &pTestEnc->encOP; + cviEncCfg *pcviEc = &pEncCfg->cviEc; + cviCapability cap, *pCap = ∩ + MirrorDirection mirrorDirection; + FrameBufferFormat srcFrameFormat; + int FrameBufSize; + int addrremapsize[2]; + int remapsizeInPage[2]; + int extraSizeInPage[2]; + int framebufStride = 0; + int productId; + int numExtraLine; + RetCode ret = RETCODE_SUCCESS; + int i, mapType; + int coreIdx; + int instIdx; + Uint64 start_time, end_time; + +#if defined(CVI_H26X_USE_ION_MEM) +#if defined(BITSTREAM_ION_CACHED_MEM) + int bBsStreamCached = 1; +#else + int bBsStreamCached = 0; +#endif +#endif + + if (pTestEnc->bIsEncoderInited) { + CVI_VC_FLOW("is already init.\n"); + return INIT_TEST_ENCODER_OK; + } + + memset(pTestEnc, 0, sizeof(stTestEncoder)); + + pTestEnc->bsBufferCount = 1; + pTestEnc->bsQueueIndex = 1; + pTestEnc->srcFrameIdx = 0; + pTestEnc->frameIdx = 0; + pTestEnc->framebufWidth = 0; + pTestEnc->framebufHeight = 0; + pTestEnc->regFrameBufCount = 0; + pTestEnc->comparatorBitStream = NULL; + pTestEnc->bsReader = NULL; + pTestEnc->yuvFeeder = NULL; + + osal_memcpy(pEncCfg, pEncConfig, sizeof(TestEncConfig)); + osal_memset(&pTestEnc->yuvFeederInfo, 0x00, sizeof(YuvInfo)); + osal_memset(&pTestEnc->fbSrc[0], 0x00, sizeof(pTestEnc->fbSrc)); + osal_memset(&pTestEnc->fbRecon[0], 0x00, sizeof(pTestEnc->fbRecon)); + osal_memset(pTestEnc->vbReconFrameBuf, 0x00, + sizeof(pTestEnc->vbReconFrameBuf)); + osal_memset(pTestEnc->vbSourceFrameBuf, 0x00, + sizeof(pTestEnc->vbSourceFrameBuf)); + osal_memset(pEncOP, 0x00, sizeof(EncOpenParam)); + osal_memset(&pTestEnc->encParam, 0x00, sizeof(EncParam)); + osal_memset(&pTestEnc->initialInfo, 0x00, sizeof(EncInitialInfo)); + osal_memset(&pTestEnc->outputInfo, 0x00, sizeof(EncOutputInfo)); + osal_memset(&pTestEnc->secAxiUse, 0x00, sizeof(SecAxiUse)); + osal_memset(pTestEnc->vbStream, 0x00, sizeof(pTestEnc->vbStream)); + osal_memset(&pTestEnc->vbReport, 0x00, sizeof(vpu_buffer_t)); + osal_memset(&pTestEnc->encHeaderParam, 0x00, sizeof(EncHeaderParam)); + osal_memset(pTestEnc->vbRoi, 0x00, sizeof(pTestEnc->vbRoi)); + osal_memset(pTestEnc->vbCtuQp, 0x00, sizeof(pTestEnc->vbCtuQp)); + osal_memset(pTestEnc->vbPrefixSeiNal, 0x00, + sizeof(pTestEnc->vbPrefixSeiNal)); + osal_memset(pTestEnc->vbSuffixSeiNal, 0x00, + sizeof(pTestEnc->vbSuffixSeiNal)); + osal_memset(&pTestEnc->vbVuiRbsp, 0x00, sizeof(vpu_buffer_t)); + osal_memset(&pTestEnc->vbHrdRbsp, 0x00, sizeof(vpu_buffer_t)); +#ifdef TEST_ENCODE_CUSTOM_HEADER + osal_memset(&pTestEnc->vbSeiNal, 0x00, sizeof(pTestEnc->vbSeiNal)); + osal_memset(&pTestEnc->vbCustomHeader, 0x00, sizeof(vpu_buffer_t)); +#endif + osal_memset(&pTestEnc->streamPack, 0x00, sizeof(pTestEnc->streamPack)); + + MUTEX_INIT(&pTestEnc->streamPack.packMutex, 0); + + instIdx = pEncCfg->instNum; + coreIdx = pEncCfg->coreIdx; + + pTestEnc->coreIdx = coreIdx; + pTestEnc->productId = VPU_GetProductId(coreIdx); + + start_time = cviGetCurrentTime(); + + ret = VPU_InitWithBitcode(coreIdx, pEncCfg->pusBitCode, + pEncCfg->sizeInWord); + if (ret != RETCODE_CALLED_BEFORE && ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "Failed to boot up VPU(coreIdx: %d, productId: %d)\n", + coreIdx, pTestEnc->productId); +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(coreIdx, pTestEnc->productId); +#endif + return TE_ERR_ENC_INIT; + } +#ifndef FIRMWARE_H + if (pTestEnc->encConfig.pusBitCode) { + osal_free(pTestEnc->encConfig.pusBitCode); + pTestEnc->encConfig.pusBitCode = NULL; + pTestEnc->encConfig.sizeInWord = 0; + } +#endif + + end_time = cviGetCurrentTime(); + CVI_VC_PERF("VPU_InitWithBitcode = %llu us\n", end_time - start_time); + + PrintVpuVersionInfo(coreIdx); + + ret = (RetCode)vdi_set_single_es_buf(coreIdx, pcviEc->bSingleEsBuf, + &pcviEc->bitstreamBufferSize); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("set_single_es_buf fail with ret %d\n", ret); + return TE_ERR_ENC_INIT; + } + + pEncOP->bitstreamFormat = pEncCfg->stdMode; + mapType = (pEncCfg->mapType & 0x0f); +#ifdef VC_DRIVER_TEST + strcpy(pEncCfg->cfgFileName, gCfgFileName[pEncCfg->instNum]); + memset(gCfgFileName[pEncCfg->instNum], 0, MAX_FILE_PATH); + + CVI_VC_TRACE("set encConfig, cfgFileName[%d] = %s\n", pEncCfg->instNum, + pEncCfg->cfgFileName); + + if (strlen(pEncCfg->cfgFileName) != 0) { + ret = (RetCode) GetEncOpenParam(pEncOP, pEncCfg, NULL, + &pTestEnc->encParam); + } else +#endif + { + ret = (RetCode) GetEncOpenParamDefault(pEncOP, pEncCfg); + } + + vdi_get_chip_capability(coreIdx, pCap); + +#ifdef ENV_SET_ADDR_REMAP + if (pCap->addrRemapEn) { + pCap->addrRemapEn = cviVcodecGetEnv("addrRemapEn"); + } +#endif + + if ((pEncOP->bitstreamFormat == STD_AVC) && (pcviEc->singleLumaBuf > 0)) + pEncOP->addrRemapEn = 0; + else + pEncOP->addrRemapEn = pCap->addrRemapEn; + + cviPrintRc(pTestEnc); + + if (ret == RETCODE_SUCCESS) { + CVI_VC_ERR("\n"); + return TE_ERR_ENC_INIT; + } + + if (pEncOP->bitstreamFormat == STD_AVC) { + pEncOP->linear2TiledEnable = pEncCfg->coda9.enableLinear2Tiled; + if (pEncOP->linear2TiledEnable == TRUE) { + pEncOP->linear2TiledMode = FF_FRAME; + } + + // enable SVC for advanced termporal reference structure + pEncCfg->coda9.enableSvc = (pEncOP->gopPreset != 1) || + (pEncOP->VirtualIPeriod > 1); + pEncOP->EncStdParam.avcParam.mvcExtension = + pEncCfg->coda9.enableMvc; + pEncOP->EncStdParam.avcParam.svcExtension = + pEncCfg->coda9.enableSvc; + + if (pEncOP->EncStdParam.avcParam.fieldFlag == TRUE) { + if (pEncCfg->rotAngle != 0 || pEncCfg->mirDir != 0) { + VLOG(WARN, + "%s:%d When field Flag is enabled. VPU doesn't support rotation or mirror in field encoding mode.\n", + __func__, __LINE__); + pEncCfg->rotAngle = 0; + pEncCfg->mirDir = MIRDIR_NONE; + } + } + } + + if (optYuvPath[0] != 0) + strcpy(pEncCfg->yuvFileName, optYuvPath); + + ret = (RetCode) _updateEncFrameInfo(pTestEnc, &srcFrameFormat); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("_updateEncFrameInfo failure:%d\n", ret); + return TE_ERR_ENC_INIT; + } + + if (pEncOP->addrRemapEn == 1) { + productId = ProductVpuGetId(coreIdx); + numExtraLine = cviVcodecGetEnv("ARExtraLine"); + + framebufStride = + CalcStride(pTestEnc->framebufWidth, pTestEnc->framebufHeight, + pTestEnc->encOP.srcFormat, + pTestEnc->encOP.cbcrInterleave, + (TiledMapType)(pTestEnc->encConfig.mapType & 0x0f), + FALSE, FALSE); + + FrameBufSize = VPU_GetFrameBufSize( + pTestEnc->encConfig.coreIdx, framebufStride, + pTestEnc->framebufHeight, + (TiledMapType)(pTestEnc->encConfig.mapType & 0x0f), + pTestEnc->encOP.srcFormat, pTestEnc->encOP.cbcrInterleave, NULL); + + CVI_VC_AR("FrameBufSize = %d\n", FrameBufSize); + + //remap mode luma size + addrremapsize[0] = CalcLumaSize(productId, + framebufStride, pTestEnc->framebufHeight, + pEncOP->cbcrInterleave, (TiledMapType)(pEncCfg->mapType & 0x0f), NULL); + //remap mode chroma size + addrremapsize[1] = CalcChromaSize(productId, + framebufStride, pTestEnc->framebufHeight, pEncOP->srcFormat, + pEncOP->cbcrInterleave, (TiledMapType)(pEncCfg->mapType & 0x0f), NULL); + + remapsizeInPage[0] = ROUND_UP_N_BIT(addrremapsize[0], AR_PAGE_256KB + AR_PAGE_SIZE_OFFSET); + remapsizeInPage[1] = ROUND_UP_N_BIT(addrremapsize[1], AR_PAGE_256KB + AR_PAGE_SIZE_OFFSET); + + CVI_VC_AR("remapsizeInPage_Y = %d, remapsizeInPage_UV = %d\n", remapsizeInPage[0], remapsizeInPage[1]); + + extraSizeInPage[0] = + ROUND_UP_N_BIT(framebufStride * numExtraLine, AR_PAGE_256KB + AR_PAGE_SIZE_OFFSET); + extraSizeInPage[1] = + ROUND_UP_N_BIT(extraSizeInPage[0] >> 1, AR_PAGE_256KB + AR_PAGE_SIZE_OFFSET); + + CVI_VC_AR("extraSizeInPage_Y = %d, extraSizeInPage_UV = %d\n", extraSizeInPage[0], extraSizeInPage[1]); + + remapsizeInPage[0] += extraSizeInPage[0]; + remapsizeInPage[1] += extraSizeInPage[1]; + + CVI_VC_AR("remapsize_Y = %d, remapsize_UV = %d\n", remapsizeInPage[0], remapsizeInPage[1]); + + //remap recon size bigger than frame mode + if (remapsizeInPage[0] + remapsizeInPage[1] > FrameBufSize * 2) { + CVI_VC_AR("use two recon fb is slmaller,addrremap off\n"); + pEncOP->addrRemapEn = 0; + } + } + + CVI_VC_CFG("addrRemapEn = %d\n", pEncOP->addrRemapEn); + + pcviEc->addrRemapEn = pEncOP->addrRemapEn; + + cviDumpEncConfig(pEncCfg); + + pTestEnc->bsBufferCount = NUM_OF_BS_BUF; + + for (i = 0; i < (int)pTestEnc->bsBufferCount; i++) { + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + if (pEncConfig->cviEc.bitstreamBufferSize != 0) + pTestEnc->vbStream[i].size = + pEncConfig->cviEc.bitstreamBufferSize; + else + pTestEnc->vbStream[i].size = STREAM_BUF_SIZE; + CVI_VC_MEM("vbStream[%d].size = 0x%X\n", i, + pTestEnc->vbStream[i].size); + + sprintf(ionName, "VENC_%d_BitStreamBuffer", + pEncConfig->s32ChnNum); + if (vdi_get_is_single_es_buf(coreIdx)) + ret = (RetCode) vdi_allocate_single_es_buf_memory( + coreIdx, &pTestEnc->vbStream[i]); + else + ret = (RetCode) VDI_ALLOCATE_MEMORY(coreIdx, + &pTestEnc->vbStream[i], + bBsStreamCached, ionName); + + if (ret < RETCODE_SUCCESS) { + CVI_VC_ERR("fail to allocate bitstream buffer\n"); + return TE_ERR_ENC_INIT; + } + CVI_VC_TRACE( + "i = %d, STREAM_BUF = 0x%llX, STREAM_BUF_SIZE = 0x%X\n", + i, pTestEnc->vbStream[i].phys_addr, + pTestEnc->vbStream[i].size); + } + + pEncOP->bitstreamBuffer = pTestEnc->vbStream[0].phys_addr; + pEncOP->bitstreamBufferSize = + pTestEnc->vbStream[0].size; //* bsBufferCount;// + CVI_VC_BS("bitstreamBuffer = 0x%llX, bitstreamBufferSize = 0x%X\n", + pEncOP->bitstreamBuffer, pEncOP->bitstreamBufferSize); + + // -- HW Constraint -- + // Required size = actual size of bitstream buffer + 32KBytes + // Minimum size of bitstream : 96KBytes + // Margin : 32KBytes + // Please refer to 3.2.4.4 Encoder Stream Handling in WAVE420 + // programmer's guide. + if (pEncOP->bitstreamFormat == STD_HEVC) { + if (pEncCfg->ringBufferEnable) + pEncOP->bitstreamBufferSize -= 0x8000; + } + + // when irq return is 0x8000 (buff full), + // VPU maybe write out of bitstreamBuffer + // reserve some size avoid over write other ion + if (pEncOP->bitstreamBufferSize < STREAM_BUF_SIZE_RESERVE) { + CVI_VC_ERR("bitstreamBufferSize is to small\n"); + return TE_ERR_ENC_INIT; + } + pEncOP->bitstreamBufferSize -= STREAM_BUF_SIZE_RESERVE; + + CVI_VC_TRACE("ringBufferEnable = %d\n", pEncCfg->ringBufferEnable); + + pEncOP->ringBufferEnable = pEncCfg->ringBufferEnable; + pEncOP->cbcrInterleave = pEncCfg->cbcrInterleave; + pEncOP->frameEndian = pEncCfg->frame_endian; + pEncOP->streamEndian = pEncCfg->stream_endian; + pEncOP->sourceEndian = pEncCfg->source_endian; + if (pEncOP->bitstreamFormat == STD_AVC) { + pEncOP->bwbEnable = VPU_ENABLE_BWB; + } + + pEncOP->lineBufIntEn = pEncCfg->lineBufIntEn; + pEncOP->bEsBufQueueEn = pEncCfg->bEsBufQueueEn; + pEncOP->coreIdx = coreIdx; + pEncOP->cbcrOrder = CBCR_ORDER_NORMAL; + // host can set useLongTerm to 1 or 0 directly. + pEncOP->EncStdParam.hevcParam.useLongTerm = + (pEncCfg->useAsLongtermPeriod > 0 && + pEncCfg->refLongtermPeriod > 0) ? + 1 : + 0; + pEncOP->s32ChnNum = pEncCfg->s32ChnNum; + + // slice split + if (pTestEnc->encConfig.cviEc.h265Split.bSplitEnable) { + pEncOP->EncStdParam.hevcParam.independSliceMode = + pTestEnc->encConfig.cviEc.h265Split.bSplitEnable; + pEncOP->EncStdParam.hevcParam.independSliceModeArg = + pTestEnc->encConfig.cviEc.h265Split.u32LcuLineNum * (pEncOP->picWidth + 63) / 64; + } else if (pTestEnc->encConfig.cviEc.h264Split.bSplitEnable) { + pEncOP->sliceMode.sliceMode = pTestEnc->encConfig.cviEc.h264Split.bSplitEnable; + pEncOP->sliceMode.sliceSizeMode = 1; + pEncOP->sliceMode.sliceSize = + pTestEnc->encConfig.cviEc.h264Split.u32MbLineNum * (pEncOP->picWidth + 15) / 16; + } + + // h264 intra pred + if (pEncOP->bitstreamFormat == STD_AVC) { + pEncOP->EncStdParam.avcParam.constrainedIntraPredFlag = + pTestEnc->encConfig.cviEc.h264IntraPred.constrained_intra_pred_flag; + } + +#ifdef SUPPORT_MULTIPLE_PPS // if SUPPORT_MULTIPLE_PPS is enabled. encoder can include multiple pps in bitstream output. + if (pEncOP->bitstreamFormat == STD_AVC) { + getAvcEncPPS(&encOP); //add PPS before OPEN + } +#endif + + if (writeVuiRbsp(coreIdx, pEncCfg, pEncOP, &pTestEnc->vbVuiRbsp) == + FALSE) + return TE_ERR_ENC_INIT; + if (writeHrdRbsp(coreIdx, pEncCfg, pEncOP, &pTestEnc->vbHrdRbsp) == + FALSE) + return TE_ERR_ENC_INIT; + +#ifdef TEST_ENCODE_CUSTOM_HEADER + if (writeCustomHeader(coreIdx, pEncOP, &pTestEnc->vbCustomHeader, + &pTestEnc->hrd) == FALSE) + return TE_ERR_ENC_INIT; +#endif + + // Open an instance and get initial information for encoding. + ret = VPU_EncOpen(&pTestEnc->handle, pEncOP); + + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_EncOpen failed Error code is 0x%x\n", ret); +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(coreIdx, pTestEnc->productId); +#endif + return TE_ERR_ENC_INIT; + } + + cviEncRc_Open(&pTestEnc->handle->rcInfo, pEncOP); + + cviSetApiMode(pTestEnc->handle, pEncCfg->cviApiMode); + +#ifdef ENABLE_CNM_DEBUG_MSG + // VPU_EncGiveCommand(pTestEnc->handle, ENABLE_LOGGING, 0); +#endif + if (pEncCfg->useRot == TRUE) { + VPU_EncGiveCommand(pTestEnc->handle, ENABLE_ROTATION, 0); + VPU_EncGiveCommand(pTestEnc->handle, ENABLE_MIRRORING, 0); + VPU_EncGiveCommand(pTestEnc->handle, SET_ROTATION_ANGLE, + &pEncCfg->rotAngle); + + mirrorDirection = (MirrorDirection)pEncCfg->mirDir; + VPU_EncGiveCommand(pTestEnc->handle, SET_MIRROR_DIRECTION, + &mirrorDirection); + } + + if (pEncOP->bitstreamFormat == STD_AVC) { + pTestEnc->secAxiUse.u.coda9.useBitEnable = + (pEncCfg->secondary_axi >> 0) & 0x01; + pTestEnc->secAxiUse.u.coda9.useIpEnable = + (pEncCfg->secondary_axi >> 1) & 0x01; + pTestEnc->secAxiUse.u.coda9.useDbkYEnable = + (pEncCfg->secondary_axi >> 2) & 0x01; + pTestEnc->secAxiUse.u.coda9.useDbkCEnable = + (pEncCfg->secondary_axi >> 3) & 0x01; + pTestEnc->secAxiUse.u.coda9.useBtpEnable = + (pEncCfg->secondary_axi >> 4) & 0x01; + pTestEnc->secAxiUse.u.coda9.useOvlEnable = + (pEncCfg->secondary_axi >> 5) & 0x01; + VPU_EncGiveCommand(pTestEnc->handle, SET_SEC_AXI, + &pTestEnc->secAxiUse); + } + + /******************************************* + * INIT_SEQ * + *******************************************/ + ret = VPU_EncGetInitialInfo(pTestEnc->handle, &pTestEnc->initialInfo); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "VPU_EncGetInitialInfo failed Error code is 0x%x %p\n", + ret, __builtin_return_address(0)); +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(coreIdx, pTestEnc->productId); +#endif + return TE_ERR_ENC_OPEN; + } + + if (pEncOP->bitstreamFormat == STD_AVC) { + // Note: The below values of MaverickCache configuration are best values. + MaverickCacheConfig encCacheConfig; + MaverickCache2Config(&encCacheConfig, + 0, //encoder + pEncOP->cbcrInterleave, // cb cr interleave + 0, /* bypass */ + 0, /* burst */ + 3, /* merge mode */ + mapType, 15 /* shape */); + VPU_EncGiveCommand(pTestEnc->handle, SET_CACHE_CONFIG, + &encCacheConfig); + } + + CVI_VC_INFO( + "* Enc InitialInfo =>\n instance #%d\n minframeBuffercount: %u\n minSrcBufferCount: %d\n", + instIdx, pTestEnc->initialInfo.minFrameBufferCount, + pTestEnc->initialInfo.minSrcFrameCount); + CVI_VC_INFO(" picWidth: %u\n picHeight: %u\n ", pEncOP->picWidth, + pEncOP->picHeight); + + CVI_VC_TRACE("compare_type = %d\n", pEncCfg->compare_type); + +#ifdef REDUNDENT_CODE + if (pEncCfg->compare_type & (1 << MODE_COMP_ENCODED)) { + pTestEnc->comparatorBitStream = + Comparator_Create(STREAM_COMPARE, + pEncCfg->ref_stream_path, + pEncCfg->cfgFileName); + if (pTestEnc->comparatorBitStream == NULL) { + CVI_VC_ERR("pTestEnc->comparatorBitStream == NULL\n"); + return TE_ERR_ENC_OPEN; + } + } +#endif + + if (pEncOP->bitstreamFormat == STD_HEVC) { + pTestEnc->secAxiUse.u.wave4.useEncImdEnable = + (pEncCfg->secondary_axi & 0x1) ? + TRUE : + FALSE; // USE_IMD_INTERNAL_BUF + pTestEnc->secAxiUse.u.wave4.useEncRdoEnable = + (pEncCfg->secondary_axi & 0x2) ? + TRUE : + FALSE; // USE_RDO_INTERNAL_BUF + pTestEnc->secAxiUse.u.wave4.useEncLfEnable = + (pEncCfg->secondary_axi & 0x4) ? + TRUE : + FALSE; // USE_LF_INTERNAL_BUF + VPU_EncGiveCommand(pTestEnc->handle, SET_SEC_AXI, + &pTestEnc->secAxiUse); + + CVI_VC_FLOW( + "SET_SEC_AXI: useEncImdEnable = %d, useEncRdoEnable = %d, useEncLfEnable = %d\n", + pTestEnc->secAxiUse.u.wave4.useEncImdEnable, + pTestEnc->secAxiUse.u.wave4.useEncRdoEnable, + pTestEnc->secAxiUse.u.wave4.useEncLfEnable); + } +#ifdef VC_DRIVER_TEST + if (pEncCfg->cviApiMode == API_MODE_DRIVER) { + int iRet = _cviVEncRegFrameBuffer(pTestEnc, NULL); + + if (iRet != 0) + return iRet; + } +#endif + /************************* + * BUILD SEQUENCE HEADER * + ************************/ +#ifndef SUPPORT_DONT_READ_STREAM + pTestEnc->bsReader = BitstreamReader_Create( + pEncOP->ringBufferEnable, pEncCfg->bitstreamFileName, + (EndianMode)pEncOP->streamEndian, &pTestEnc->handle); + BitstreamReader_SetVbStream(pTestEnc->bsReader, &pTestEnc->vbStream[0]); +#endif + + pTestEnc->encParam.quantParam = pEncCfg->picQpY; + CVI_VC_TRACE("picQpY = %d\n", pEncCfg->picQpY); + pTestEnc->encParam.skipPicture = 0; + pTestEnc->encParam.forcePicQpI = 0; + + do { + int iRet = TRUE; + + if (pEncOP->bitstreamFormat == STD_AVC) { + if (pEncOP->ringBufferEnable == TRUE) { + VPU_EncSetWrPtr(pTestEnc->handle, + pEncOP->bitstreamBuffer, 1); + } else { + pTestEnc->encHeaderParam.buf = pEncOP->bitstreamBuffer; + pTestEnc->encHeaderParam.size = + pEncOP->bitstreamBufferSize; + } + + #if REPEAT_SPS + iRet = TRUE; + #else + iRet = cviEncode264Header(pTestEnc); + #endif + } else { + pTestEnc->encParam.forcePicQpEnable = 0; + pTestEnc->encParam.forcePicQpP = 0; + pTestEnc->encParam.forcePicQpB = 0; + pTestEnc->encParam.forcePicTypeEnable = 0; + pTestEnc->encParam.forcePicType = 0; + pTestEnc->encParam.codeOption.implicitHeaderEncode = + 1; // FW will encode header data implicitly when changing the + // header syntaxes + pTestEnc->encParam.codeOption.encodeAUD = pEncCfg->encAUD; + pTestEnc->encParam.codeOption.encodeEOS = 0; + + CVI_VC_TRACE("ringBufferEnable = %d\n", + pEncOP->ringBufferEnable); + + #if REPEAT_SPS + iRet = TRUE; + #else + iRet = cviEncode265Header(pTestEnc); + #endif + } + + if (iRet == FALSE) { + CVI_VC_ERR("iRet = %d\n", iRet); + return TE_ERR_ENC_OPEN; + } + + CVI_VC_TRACE("iRet = %d\n", iRet); + } while (0); + + pTestEnc->yuvFeederInfo.cbcrInterleave = pEncCfg->cbcrInterleave; + pTestEnc->yuvFeederInfo.nv21 = pEncCfg->nv21; + pTestEnc->yuvFeederInfo.packedFormat = pEncCfg->packedFormat; + pTestEnc->yuvFeederInfo.srcFormat = pEncOP->srcFormat; + pTestEnc->yuvFeederInfo.srcPlanar = TRUE; + pTestEnc->yuvFeederInfo.srcStride = pTestEnc->srcFrameStride; + pTestEnc->yuvFeederInfo.srcHeight = pTestEnc->srcFrameHeight; + pTestEnc->yuvFeeder = + YuvFeeder_Create(pEncCfg->yuv_mode, pEncCfg->yuvFileName, + pTestEnc->yuvFeederInfo); + CVI_VC_TRACE("yuvFeeder = 0x%p\n", pTestEnc->yuvFeeder); + if (pTestEnc->yuvFeeder == NULL) { + CVI_VC_ERR("YuvFeeder_Create error\n"); + return TE_ERR_ENC_OPEN; + } + + if (pEncOP->ringBufferEnable == TRUE) { + // this function shows that HOST can set wrPtr to + // start position of encoded output in ringbuffer enable mode + VPU_EncSetWrPtr(pTestEnc->handle, pEncOP->bitstreamBuffer, 1); + } + + DisplayEncodedInformation(pTestEnc->handle, pEncOP->bitstreamFormat, + NULL, 0, 0); + pTestEnc->bIsEncoderInited = TRUE; + + if (pEncCfg->bIsoSendFrmEn && !pTestEnc->tPthreadId) { + struct sched_param param = { + .sched_priority = 95, + }; + + init_completion(&pTestEnc->semSendEncCmd); + init_completion(&pTestEnc->semGetStreamCmd); + init_completion(&pTestEnc->semEncDoneCmd); + pTestEnc->tPthreadId = kthread_run(pfnWaitEncodeDone, + (CVI_VOID *)pTestEnc, + "cvitask_vc_wt%d", pEncCfg->s32ChnNum); + if (IS_ERR(pTestEnc->tPthreadId)) { + CVI_VC_ERR("WaitEncodeDone task error!\n"); + return RETCODE_FAILURE; + } + sched_setscheduler(pTestEnc->tPthreadId, SCHED_FIFO, ¶m); + } + + return INIT_TEST_ENCODER_OK; +} + +#ifdef SUPPORT_DONT_READ_STREAM +static int updateBitstream(vpu_buffer_t *vb, Int32 size) +{ + int status = TRUE; + if (size > vb->size) { + CVI_VC_ERR( + "bitstream buffer is not enough, size = 0x%X, bitstream size = 0x%X!\n", + size, vb->size); + return FALSE; + } + +#if 1 + unsigned char *ptr; + int len, idx; + + ptr = (unsigned char *)(vb->phys_addr + size); + len = size; + size = (size + 16) & 0xfffffff0; + len = size - len; + + for (idx = 0; idx < len; idx++, ptr++) + *ptr = 0x0; +#else + size = (size + 16) & 0xfffffff0; +#endif + + vb->phys_addr += size; + vb->size -= size; + +#if ES_CYCLIC + if (vb->phys_addr + STREAM_BUF_MIN_SIZE >= + dramCfg.pucVpuDramAddr + STREAM_BUF_SIZE + vb->base) { + vb->phys_addr = dramCfg.pucVpuDramAddr + vb->base; + vb->size = STREAM_BUF_SIZE; + CVI_VC_BS( + "vb, pucVpuDramAddr = 0x%lX, base = 0x%lX, phys_addr = 0x%lX, size = 0x%X\n", + dramCfg.pucVpuDramAddr, vb->base, vb->phys_addr, + vb->size); + } +#endif + + CVI_VC_BS("vb, phys_addr = 0x%lX, size = 0x%X\n", vb->phys_addr, + vb->size); + + return status; +} +#endif + +static void cviUpdateOneRoi(EncParam *param, const cviEncRoiCfg *proi, + int index) +{ + param->roi_request = TRUE; + param->roi_enable[index] = proi->roi_enable; + param->roi_qp_mode[index] = proi->roi_qp_mode; + param->roi_qp[index] = proi->roi_qp; + param->roi_rect_x[index] = proi->roi_rect_x; + param->roi_rect_y[index] = proi->roi_rect_y; + param->roi_rect_width[index] = proi->roi_rect_width; + param->roi_rect_height[index] = proi->roi_rect_height; +} + +static void cviUpdateRoiBySdk(EncParam *param, cviEncRoiCfg *cviRoi) +{ + int i; + + param->roi_request = TRUE; + for (i = 0; i <= 7; i++) { + cviUpdateOneRoi(param, &cviRoi[i], i); + } +} + +#if REPEAT_SPS + +static int cviH264SpsAddVui(stTestEncoder *pTestEnc) +{ + stStreamPack *psp = &pTestEnc->streamPack; + cviH264Vui *pVui = &pTestEnc->encConfig.cviEc.h264Vui; + int i; + + MUTEX_LOCK(&psp->packMutex); + for (i = 0; i < psp->totalPacks; i++) { + if (psp->pack[i].cviNalType == NAL_SPS) { + H264SpsAddVui(pVui, &psp->pack[i].addr, + &psp->pack[i].len); + psp->pack[i].u64PhyAddr = virt_to_phys(psp->pack[i].addr); + vdi_flush_ion_cache(psp->pack[i].u64PhyAddr, psp->pack[i].addr, psp->pack[i].len); + } + } + MUTEX_UNLOCK(&psp->packMutex); + + return TRUE; +} + +static int cviH265SpsAddVui(stTestEncoder *pTestEnc) +{ + stStreamPack *psp = &pTestEnc->streamPack; + cviH265Vui *pVui = &pTestEnc->encConfig.cviEc.h265Vui; + int i; + + MUTEX_LOCK(&psp->packMutex); + for (i = 0; i < psp->totalPacks; i++) { + if (psp->pack[i].cviNalType == NAL_SPS) { + H265SpsAddVui(pVui, &psp->pack[i].addr, + &psp->pack[i].len); + psp->pack[i].u64PhyAddr = virt_to_phys(psp->pack[i].addr); + vdi_flush_ion_cache(psp->pack[i].u64PhyAddr, psp->pack[i].addr, psp->pack[i].len); + } + } + MUTEX_UNLOCK(&psp->packMutex); + + return TRUE; +} +#endif +static int cviEncodeOneFrame(stTestEncoder *pTestEnc) +{ + EncParam *pEncParam = &pTestEnc->encParam; + EncOpenParam *pEncOP = &pTestEnc->encOP; + FrameBufferAllocInfo *pFbAllocInfo = &pTestEnc->fbAllocInfo; +#ifdef VC_DRIVER_TEST + void *pYuvFeeder = pTestEnc->yuvFeeder; +#endif + int coreIdx = pTestEnc->coreIdx; + int ret = 0, i; + feederYuvaddr *pYuvAddr; + CodecInst *pCodecInst; + + + CVI_VC_FLOW("frameIdx = %d\n", pTestEnc->frameIdx); + +#if 0 +RETRY: + ret = cviVPU_LockAndCheckState(pTestEnc->handle, CODEC_STAT_ENC_PIC); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("cviVPU_LockAndCheckState, ret = %d\n", ret); + return ret; + } +#endif + if (GetPendingInst(coreIdx)) { + //LeaveLock(coreIdx); + CVI_VC_TRACE("GetPendingInst, RETCODE_FRAME_NOT_COMPLETE\n"); + return RETCODE_FAILURE; + } + + pCodecInst = pTestEnc->handle; + pCodecInst->CodecInfo->encInfo.openParam.cbcrInterleave = + pEncOP->cbcrInterleave; + pCodecInst->CodecInfo->encInfo.openParam.nv21 = pEncOP->nv21; + + SetPendingInst(coreIdx, pCodecInst, __func__, __LINE__); + ret = cviVPU_ChangeState(pTestEnc->handle); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("cviVPU_ChangeState, ret = %d\n", ret); + } + + if (pTestEnc->encConfig.cviEc.roi_request) + cviUpdateRoiBySdk(pEncParam, pTestEnc->encConfig.cviEc.cviRoi); + pTestEnc->encConfig.cviEc.roi_request = FALSE; + + pEncParam->is_idr_frame = cviCheckIdrPeriod(pTestEnc); + +#ifdef DROP_FRAME + // because bitstream not enough, need request IDR and reduce target bitrate + if (pTestEnc->bDrop) { + if (pTestEnc->originBitrate == 0) + pTestEnc->originBitrate = pEncOP->bitRate; + + pEncOP->bitRate /= 2; + // if bitRate is too small, will overflow + if (pEncOP->bitRate < 100) + pEncOP->bitRate = 100; + + pEncParam->idr_request = TRUE; + pTestEnc->bDrop = FALSE; + CVI_VENC_BS("orignBitRate:%d, targetBitrate:%d\n", pTestEnc->originBitrate, pEncOP->bitRate); + } else if (pTestEnc->originBitrate && (pEncOP->bitRate != pTestEnc->originBitrate)) { + pEncOP->bitRate = pTestEnc->originBitrate; + pTestEnc->originBitrate = 0; + CVI_VENC_BS("restore originBitrate:%d\n", pEncOP->bitRate); + } +#endif + + cviPicParamChangeCtrl(pTestEnc->handle, &pTestEnc->encConfig, pEncOP, + pEncParam, pTestEnc->frameIdx); + + ret = cviSetupPicConfig(pTestEnc); + if (ret != 0) { + CVI_VC_ERR("cviSetupPicConfig, ret = %d\n", ret); + return RETCODE_FAILURE; + } + +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + for (i = 0; i < (int)pTestEnc->bsBufferCount; i++) { + if (pTestEnc->vbStream[i].size != 0) + vdi_invalidate_ion_cache(pTestEnc->vbStream[i].phys_addr, + pTestEnc->vbStream[i].virt_addr, pTestEnc->vbStream[i].size); + } +#endif + +#if REPEAT_SPS + if (pEncParam->is_idr_frame == TRUE) { + if (pEncOP->bitstreamFormat == STD_AVC) { + ret = cviEncode264Header(pTestEnc); + if (ret == FALSE) { + CVI_VC_ERR("cviEncode264Header = %d\n", ret); + return TE_ERR_ENC_OPEN; + } + ret = cviH264SpsAddVui(pTestEnc); + if (ret == FALSE) { + CVI_VC_ERR("cviH264AddTimingInfo = %d\n", ret); + return TE_ERR_ENC_OPEN; + } + } else { + ret = cviEncode265Header(pTestEnc); + if (ret == FALSE) { + CVI_VC_ERR("cviEncode265Header = %d\n", ret); + return TE_ERR_ENC_OPEN; + } + ret = cviH265SpsAddVui(pTestEnc); + if (ret == FALSE) { + CVI_VC_ERR("cviH265AddTimingInfo = %d\n", ret); + return TE_ERR_ENC_OPEN; + } + } + } +#endif + + ret = cviInsertUserData(pTestEnc); + if (ret == FALSE) { + CVI_VC_ERR("cviInsertUserData failed %d\n", ret); + //return TE_ERR_ENC_USER_DATA; + } + + if (pEncOP->bitstreamFormat == STD_AVC && + pEncOP->EncStdParam.avcParam.svcExtension == TRUE) + VPU_EncGiveCommand(pTestEnc->handle, ENC_GET_FRAMEBUF_IDX, + &pTestEnc->srcFrameIdx); + else + pTestEnc->srcFrameIdx = + (pTestEnc->frameIdx % pFbAllocInfo->num); + + pEncParam->srcIdx = pTestEnc->srcFrameIdx; + + CVI_VC_TRACE("Read YUV, srcIdx = %d\n", pEncParam->srcIdx); + +#ifdef SUPPORT_DIRECT_YUV + ret = YuvFeeder_Feed(pYuvFeeder, coreIdx, &pTestEnc->fbSrcFixed, + pTestEnc->encOP.picWidth, + pTestEnc->encOP.picHeight, NULL); +#else + if (pTestEnc->encConfig.yuv_mode == SOURCE_YUV_ADDR) + pYuvAddr = &pTestEnc->yuvAddr; + else + pYuvAddr = NULL; + + ret = TRUE; +#ifdef VC_DRIVER_TEST + if (pTestEnc->encConfig.cviApiMode == API_MODE_DRIVER) { + ret = YuvFeeder_Feed(pYuvFeeder, coreIdx, + &pTestEnc->fbSrc[pTestEnc->srcFrameIdx], + pTestEnc->encOP.picWidth, + pTestEnc->encOP.picHeight, pYuvAddr); + } +#endif +#endif + + if (ret == 0) { + pEncParam->srcEndFlag = 1; // when there is no more source image + // to be encoded, srcEndFlag should + // be set 1. because of encoding + // delay for WAVE420 + } + + if (pEncParam->srcEndFlag != 1) { + if (pTestEnc->encConfig.cviApiMode == API_MODE_SDK) { + pTestEnc->fbSrc[pTestEnc->srcFrameIdx].srcBufState = + SRC_BUFFER_USE_ENCODE; + pEncParam->sourceFrame = + &pTestEnc->fbSrc[pTestEnc->srcFrameIdx]; + pEncParam->sourceFrame->endian = 0x10; + pEncParam->sourceFrame->sourceLBurstEn = 0; + pEncParam->sourceFrame->bufY = + (PhysicalAddress)pYuvAddr->phyAddrY; + pEncParam->sourceFrame->bufCb = + (PhysicalAddress)pYuvAddr->phyAddrCb; + pEncParam->sourceFrame->bufCr = + (PhysicalAddress)pYuvAddr->phyAddrCr; + pEncParam->sourceFrame->stride = + pTestEnc->srcFrameStride; + pEncParam->sourceFrame->cbcrInterleave = + pEncOP->cbcrInterleave; + pEncParam->sourceFrame->nv21 = pEncOP->nv21; + + CVI_VC_SRC( + "srcFrameIdx = %d, bufY = 0x%llX, bufCb = 0x%llX, bufCr = 0x%llX, stride = %d\n", + pTestEnc->srcFrameIdx, + pEncParam->sourceFrame->bufY, + pEncParam->sourceFrame->bufCb, + pEncParam->sourceFrame->bufCr, + pEncParam->sourceFrame->stride); + } else { + pTestEnc->fbSrc[pTestEnc->srcFrameIdx].srcBufState = + SRC_BUFFER_USE_ENCODE; + pEncParam->sourceFrame = + &pTestEnc->fbSrc[pTestEnc->srcFrameIdx]; + pEncParam->sourceFrame->sourceLBurstEn = 0; + } + } + + if (pTestEnc->encOP.ringBufferEnable == FALSE) { + pTestEnc->bsQueueIndex = + (pTestEnc->bsQueueIndex + 1) % pTestEnc->bsBufferCount; + pEncParam->picStreamBufferAddr = + pTestEnc->vbStream[pTestEnc->bsQueueIndex] + .phys_addr; // can set the newly allocated + // buffer. +#ifdef SUPPORT_DONT_READ_STREAM + pEncParam->picStreamBufferSize = + pTestEnc->vbStream[pTestEnc->bsQueueIndex].size; +#else + pEncParam->picStreamBufferSize = + pTestEnc->encOP.bitstreamBufferSize; +#endif + + CVI_VC_BS( + "picStreamBufferAddr = 0x%llX, picStreamBufferSize = 0x%X\n", + pEncParam->picStreamBufferAddr, + pEncParam->picStreamBufferSize); + } + + if ((pTestEnc->encConfig.seiDataEnc.prefixSeiNalEnable || + pTestEnc->encConfig.seiDataEnc.suffixSeiNalEnable) && + pEncParam->srcEndFlag != 1) { + pTestEnc->encConfig.seiDataEnc.prefixSeiNalAddr = + pTestEnc->vbPrefixSeiNal[pTestEnc->srcFrameIdx] + .phys_addr; + pTestEnc->encConfig.seiDataEnc.suffixSeiNalAddr = + pTestEnc->vbSuffixSeiNal[pTestEnc->srcFrameIdx] + .phys_addr; + VPU_EncGiveCommand(pTestEnc->handle, ENC_SET_SEI_NAL_DATA, + &pTestEnc->encConfig.seiDataEnc); + } + + // set ROI map/qp map in dram for hevc encode + if (pEncOP->bitstreamFormat == STD_HEVC) { + // for qp Map + if (pTestEnc->encConfig.ctu_qpMap_enable) { + TestEncConfig *pEncConfig = &pTestEnc->encConfig; + + if (pEncConfig->cviEc.bQpMapValid) { + cviSetCtuQpMap(coreIdx, &pTestEnc->encConfig, + &pTestEnc->encOP, + pTestEnc->vbCtuQp[pTestEnc->srcFrameIdx].phys_addr, + pEncConfig->cviEc.pu8QpMap, pEncParam, + MAX_CTU_NUM); + } + + } + //for roiLevel Map + if (pTestEnc->encConfig.ctu_roiLevel_enable) { + int baseQp = pTestEnc->handle->CodecInfo->encInfo.pic_ctu_avg_qp; + + if (baseQp == 0) { //if first frame, rc have not been started + baseQp = pTestEnc->encOP.RcInitialQp; + } + CVI_VC_TRACE("roi cfg is 1"); + CVI_VC_TRACE("baseQp:%d\n", baseQp); + GenRoiLevelMap(&pTestEnc->encConfig, pEncParam, + &pTestEnc->encOP, baseQp, &pTestEnc->roiMapBuf[0]); + + cviSetCtuRoiLevelMap(coreIdx, &pTestEnc->encConfig, + &pTestEnc->encOP, + pTestEnc->vbRoi[pTestEnc->srcFrameIdx].phys_addr, + &pTestEnc->roiMapBuf[0], pEncParam, MAX_CTU_NUM); + + pTestEnc->encConfig.ctu_roiLevel_enable = 0; + } + // for ai output => roi level importance map + if (pTestEnc->encOP.svc_enable) { + cviSmartRoiLevelCfg(coreIdx, &pTestEnc->encConfig, + pEncParam, pEncOP, + pTestEnc->vbRoi[pTestEnc->srcFrameIdx] + .phys_addr, &pTestEnc->roiMapBuf[0], + pTestEnc->frameIdx); + + } +#ifdef TEST_OTHER_QMAP + if (pTestEnc->encConfig.ctu_qpMap_enable) { + cviSetCtuQpMap(coreIdx, &pTestEnc->encConfig, + &pTestEnc->encOP, + pTestEnc->vbCtuQp[pTestEnc->srcFrameIdx] + .phys_addr, + pCviEc->pu8QpMap, pEncParam, + MAX_CTU_NUM); + } else { + osal_memset(&pEncParam->ctuOptParam, 0, + sizeof(HevcCtuOptParam)); + if ((pTestEnc->encConfig.roi_cfg_type == 1 && + pTestEnc->encConfig.cviApiMode == + API_MODE_DRIVER) || + (pTestEnc->encOP.bgEnhanceEn == TRUE && + pTestEnc->encConfig.cviApiMode == API_MODE_SDK)) { + setRoiMapFromMap( + coreIdx, &pTestEnc->encConfig, + &pTestEnc->encOP, + pTestEnc->vbRoi[pTestEnc->srcFrameIdx] + .phys_addr, + &pTestEnc->roiMapBuf[0], pEncParam, + MAX_CTU_NUM); + } else { + if (pTestEnc->encConfig.cviApiMode != + API_MODE_DRIVER) { + GenRoiLevelMap( + &pTestEnc->encConfig, pEncParam, + &pTestEnc->encOP, + pTestEnc->handle->CodecInfo + ->encInfo + .pic_ctu_avg_qp); + } + cviSetCtuRoiLevelMap( + coreIdx, &pTestEnc->encConfig, + &pTestEnc->encOP, + pTestEnc->vbRoi[pTestEnc->srcFrameIdx] + .phys_addr, + &pTestEnc->roiMapBuf[0], pEncParam, + MAX_CTU_NUM); + } + } +#endif + } + +#ifdef TEST_ENCODE_CUSTOM_HEADER + if (writeSeiNalData(pTestEnc->handle, pTestEnc->encOP.streamEndian, + pTestEnc->vbSeiNal[pTestEnc->srcFrameIdx].phys_addr, + &pTestEnc->hrd) == FALSE) { + return TE_ERR_ENC_OPEN; + } +#endif + + if (pTestEnc->encConfig.useAsLongtermPeriod > 0 && + pTestEnc->encConfig.refLongtermPeriod > 0) { + pEncParam->useCurSrcAsLongtermPic = + (pTestEnc->frameIdx % + pTestEnc->encConfig.useAsLongtermPeriod) == 0 ? + 1 : + 0; + pEncParam->useLongtermRef = + (pTestEnc->frameIdx % + pTestEnc->encConfig.refLongtermPeriod) == 0 ? + 1 : + 0; + } + + // Start encoding a frame. + pTestEnc->frameIdx++; + +#if DUMP_SRC + { + FILE *fp; + int fsize = + pTestEnc->encOP.picWidth * pTestEnc->encOP.picHeight; + + fp = fopen("src.dat", "ab"); + if (fp) { + fwrite(pYuvAddr->addrY, 1, fsize, fp); + fwrite(pYuvAddr->addrCb, 1, fsize >> 2, fp); + fwrite(pYuvAddr->addrCr, 1, fsize >> 2, fp); + fflush(fp); + } + } +#endif + pTestEnc->handle->bBuffFull = CVI_FALSE; + + ret = VPU_EncStartOneFrame(pTestEnc->handle, pEncParam); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_EncStartOneFrame failed Error code is 0x%x\n", + ret); + return TE_ERR_ENC_OPEN; + } + + return ret; +} + +static void setInitRcQp(EncChangeParam *changeParam, EncHevcParam *param, + EncOpenParam *pEncOP, int initQp) +{ + changeParam->enable_option |= ENC_RC_PARAM_CHANGE; + changeParam->initialRcQp = initQp; + changeParam->rcEnable = 1; + changeParam->cuLevelRCEnable = param->cuLevelRCEnable; + changeParam->hvsQPEnable = param->hvsQPEnable; + changeParam->hvsQpScaleEnable = param->hvsQpScaleEnable; + changeParam->hvsQpScale = param->hvsQpScale; + changeParam->bitAllocMode = param->bitAllocMode; + changeParam->initBufLevelx8 = param->initBufLevelx8; + changeParam->initialDelay = pEncOP->initialDelay; +} + +static void setMinMaxQpByDelta(EncHandle handle, EncOpenParam *pEncOP, + int deltaQp, int isIFrame, + int intraQpOffsetForce0) +{ + if (pEncOP->bitstreamFormat == STD_AVC) { + MinMaxQpChangeParam param; + param.maxQpIEnable = 1; + param.maxQpI = CLIP3(0, 51, pEncOP->userQpMaxI + deltaQp); + param.minQpIEnable = 1; + param.minQpI = CLIP3(0, 51, pEncOP->userQpMinI); + param.maxQpPEnable = 1; + param.maxQpP = CLIP3(0, 51, pEncOP->userQpMaxP + deltaQp); + param.minQpPEnable = 1; + param.minQpP = CLIP3(0, 51, pEncOP->userQpMinP); + VPU_EncGiveCommand(handle, ENC_SET_MIN_MAX_QP, ¶m); + } else if (pEncOP->bitstreamFormat == STD_HEVC) { + int maxQp = + (isIFrame) ? pEncOP->userQpMaxI : pEncOP->userQpMaxP; + int minQp = + (isIFrame) ? pEncOP->userQpMinI : pEncOP->userQpMinP; + EncChangeParam param; + param.changeParaMode = OPT_COMMON; + param.enable_option = ENC_RC_MIN_MAX_QP_CHANGE; + param.maxQp = CLIP3(0, 51, maxQp + deltaQp); + param.minQp = CLIP3(0, 51, minQp); + param.maxDeltaQp = pEncOP->EncStdParam.hevcParam.maxDeltaQp; + param.intraQpOffset = + (intraQpOffsetForce0 == 0) ? + 0 : + pEncOP->EncStdParam.hevcParam.intraQpOffset; + + CVI_VC_TRACE( + "userQpMaxI = %d, userQpMaxP = %d, userQpMinI = %d, userQpMinP = %d\n", + pEncOP->userQpMaxI, pEncOP->userQpMaxP, + pEncOP->userQpMinI, pEncOP->userQpMinP); + CVI_VC_TRACE("minQp = %d, maxQp = %d\n", minQp, maxQp); + CVI_VC_TRACE( + "pminQp = %d, pmaxQp = %d, maxDeltaQp = %d, intraQpOffset = %d\n", + param.minQp, param.maxQp, param.maxDeltaQp, + param.intraQpOffset); + + VPU_EncGiveCommand(handle, ENC_SET_PARA_CHANGE, ¶m); + } +} + +static BOOL cviCheckIdrValid(EncOpenParam *pEncOP, Uint32 frameIdx) +{ + int keyframe_period = + (pEncOP->bitstreamFormat == STD_AVC) ? + pEncOP->set_dqp_pic_num : + pEncOP->EncStdParam.hevcParam.gopParam.tidPeriod0; + return (keyframe_period == 0 || (frameIdx % keyframe_period == 0)) ? + TRUE : + FALSE; +} + +static void cviForcePicTypeCtrl(EncOpenParam *pEncOP, EncParam *encParam, + EncInfo *pEncInfo, BOOL is_intra_period, + BOOL force_idr, BOOL force_skip_frame, + Uint32 frameIdx) +{ + encParam->skipPicture = 0; + encParam->forceIPicture = 0; + encParam->forcePicTypeEnable = 0; + pEncInfo->force_as_long_term_ref = 0; + + if (is_intra_period && (!encParam->force_i_for_gop_sync)) { + return; + } + + if (force_idr) { + CVI_VC_TRACE("force IDR request\n"); + } + + encParam->idr_registered |= (force_idr && !is_intra_period); + + if ((encParam->idr_registered && cviCheckIdrValid(pEncOP, frameIdx)) || + (is_intra_period && encParam->force_i_for_gop_sync)) { + if (pEncOP->bitstreamFormat == STD_HEVC) { + encParam->forcePicTypeEnable = 1; + encParam->forcePicType = 3; + } else { // encOP->bitstreamFormat == STD_AVC + encParam->forceIPicture = 1; + pEncInfo->force_as_long_term_ref = 1; + encParam->force_i_for_gop_sync = + encParam->idr_registered; + } + encParam->idr_registered = 0; + encParam->is_idr_frame |= 1; + CVI_VC_TRACE("force IDR ack\n"); + } else if (force_skip_frame) { + encParam->skipPicture = 1; + CVI_VC_TRACE("force skip ack\n"); + } +} + +static void cviPicParamChangeCtrl(EncHandle handle, TestEncConfig *pEncConfig, + EncOpenParam *pEncOP, EncParam *encParam, + Uint32 frameIdx) +{ + stRcInfo *pRcInfo = &handle->rcInfo; + BOOL rateChangeCmd = FALSE; + // dynamic bitrate change + CVI_VC_TRACE("gopSize = %d, frameIdx = %d\n", pEncOP->gopSize, + frameIdx); + if (pRcInfo->rcMode == RC_MODE_AVBR) { + // avbr bitrate change period check + if (cviEnc_Avbr_PicCtrl(pRcInfo, pEncOP, frameIdx)) { + cviEncRc_SetParam(&handle->rcInfo, pEncOP, E_BITRATE); + rateChangeCmd = TRUE; + } + } else { + // detect bitrate change + if (encParam->is_i_period && + pEncOP->bitRate != cviEncRc_GetParam(pRcInfo, E_BITRATE)) { + cviEncRc_SetParam(&handle->rcInfo, pEncOP, E_BITRATE); + rateChangeCmd = TRUE; + } + } + // detect framerate change + if (encParam->is_i_period && + (pEncOP->frameRateInfo != + cviEncRc_GetParam(pRcInfo, E_FRAMERATE))) { + cviEncRc_SetParam(pRcInfo, pEncOP, E_FRAMERATE); + rateChangeCmd = TRUE; + } + + // bitrate/framerate change handle + if (rateChangeCmd) { + if (pEncOP->bitstreamFormat == STD_AVC) { + VPU_EncGiveCommand(handle, ENC_SET_BITRATE, + &pRcInfo->targetBitrate); + } else if (pEncOP->bitstreamFormat == STD_HEVC) { + EncChangeParam changeParam; + + changeParam.changeParaMode = OPT_COMMON; + changeParam.enable_option = ENC_RC_TRANS_RATE_CHANGE | + ENC_RC_TARGET_RATE_CHANGE | + ENC_FRAME_RATE_CHANGE; + changeParam.bitRate = handle->rcInfo.targetBitrate; + changeParam.transRate = + ((pEncOP->rcMode != RC_MODE_CBR && + pEncOP->rcMode != RC_MODE_QPMAP && + pEncOP->rcMode != RC_MODE_UBR) || + (pEncOP->statTime <= 0)) ? + MAX_TRANSRATE : + handle->rcInfo.targetBitrate * + pEncOP->statTime * 1000; + changeParam.frameRate = pEncOP->frameRateInfo; + + if (pRcInfo->rcMode == RC_MODE_AVBR) { + EncHevcParam *param = + &pEncOP->EncStdParam.hevcParam; + int initQp = + (encParam->is_i_period) ? + pRcInfo->lastPicQp + + (param->intraQpOffset / + 2) : + pRcInfo->lastPicQp; + setInitRcQp(&changeParam, param, pEncOP, + initQp); + } + + CVI_VC_TRACE("bitRate = %d, transRate = %d\n", + changeParam.bitRate, + changeParam.transRate); + CVI_VC_INFO( + "bitRate = %d, transRate = %d, frameRate = %d\n", + changeParam.bitRate, changeParam.transRate, + changeParam.frameRate); + VPU_EncGiveCommand(handle, ENC_SET_PARA_CHANGE, + &changeParam); + } + } + + // auto frame-skipping + CVI_VC_TRACE("gopSize = %d, frameIdx = %d\n", pEncOP->gopSize, + frameIdx); + + cviEncRc_UpdateFrameSkipSetting(pRcInfo, pEncConfig->frmLostOpen, + pEncConfig->cviEc.encFrmGaps, + pEncConfig->cviEc.frmLostBpsThr); + do { + BOOL force_skip_frame = + cviEncRc_ChkFrameSkipByBitrate(pRcInfo, encParam->is_i_period); + if (!force_skip_frame) { + force_skip_frame |= cviEncRc_Avbr_CheckFrameSkip( + pRcInfo, pEncOP, encParam->is_i_period); + } + + cviForcePicTypeCtrl(pEncOP, encParam, &handle->CodecInfo->encInfo, + encParam->is_i_period, encParam->idr_request, + force_skip_frame, frameIdx); + } while (0); + + encParam->idr_request = 0; + + CVI_VC_TRACE("skipPicture = %d\n", encParam->skipPicture); + + // TBD: scene change detect signal generate + /*if(cviEncRc_StateCheck(&handle->rcInfo, FALSE)) { + int deltaQp = (handle->rcInfo.rcState==UNSTABLE) + ? 2 + : (handle->rcInfo.rcState==RECOVERY) + ? -1 : 0; + setMinMaxQpByDelta(handle, encOP, deltaQp\); + }*/ + + // avbr adaptive max Qp + if (pRcInfo->rcEnable && pRcInfo->rcMode == RC_MODE_AVBR) { + if (pRcInfo->avbrChangeBrEn == TRUE) { + int deltaQp = cviEncRc_Avbr_GetQpDelta(pRcInfo, pEncOP); + int intraQpOffsetForce0 = + (pRcInfo->periodMotionLvRaw > 64) ? 0 : -1; + CVI_VC_INFO("avbr qp delta: %d %d\n", deltaQp, + encParam->is_i_period); + setMinMaxQpByDelta(handle, pEncOP, deltaQp, + encParam->is_i_period, + intraQpOffsetForce0); + pRcInfo->avbrChangeBrEn = FALSE; + } + } +} + +// this is chip-and-media legacy code, not in used now +/* +static void RcChangeSetParameter(EncHandle handle, TestEncConfig encConfig, + EncOpenParam *encOP, EncParam *encParam, + Uint32 frameIdx, Uint32 fieldDone, + int field_flag, vpu_buffer_t vbRoi) +{ + BOOL isIdr = FALSE; + BOOL isIPic = FALSE; + Uint32 minSkipNum = 0; + Uint32 idx = 0; + Int32 iPicCnt = 0; + + if (encOP->EncStdParam.avcParam.fieldFlag) { + encParam->fieldRun = TRUE; + } + + if (0 == frameIdx) { + isIdr = TRUE; + isIPic = TRUE; + } else { + Int32 gopNum = encOP->EncStdParam.avcParam.fieldFlag ? + (2 * encOP->gopSize) : + encOP->gopSize; + Int32 picIdx = encOP->EncStdParam.avcParam.fieldFlag ? + (2 * frameIdx + fieldDone) : + frameIdx; + if ((encOP->idrInterval > 0) && (gopNum > 0)) { + if ((picIdx >= gopNum)) { + picIdx = 0; + } + if (picIdx == 0) { + isIPic = TRUE; + iPicCnt++; + } + } + } + + if (encOP->bitstreamFormat == STD_MPEG4) { + if (isIPic == TRUE && encOP->idrInterval > 0) { + if ((iPicCnt % encOP->idrInterval) == 0) { + isIdr = TRUE; + } + } + } + encParam->forceIPicture = fieldDone ? FALSE : isIdr; + + encParam->skipPicture = 0; + + minSkipNum = encOP->EncStdParam.avcParam.mvcExtension ? 1 : 0; + + for (idx = 0; idx < MAX_PIC_SKIP_NUM; idx++) { + Uint32 numPicSkip = field_flag ? + encConfig.skipPicNums[idx] / 2 : + encConfig.skipPicNums[idx]; + if (numPicSkip > minSkipNum && numPicSkip == (Uint32)frameIdx) { + if (field_flag == FALSE) { + encParam->skipPicture = TRUE; + } else { + if (encConfig.skipPicNums[idx] % 2) + encParam->skipPicture = fieldDone; + else + encParam->skipPicture = !(fieldDone); + // check next skip field + if ((idx + 1) < MAX_PIC_SKIP_NUM) { + numPicSkip = + encConfig.skipPicNums[idx + 1] / + 2; + if (numPicSkip == (Uint32)frameIdx) + encParam->skipPicture = TRUE; + } + } + break; + } + } + + // TODO: Need to do refactoring + if (encOP->bitstreamFormat == STD_AVC && frameIdx > 0 && + frameIdx == encOP->paramChange.ChangeFrameNum) { + if (strcmp(encOP->paramChange.pchChangeCfgFileName, "") != 0) { + EncInfo *pEncInfo; + CodecInst *pCodecInst; + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + GetEncOpenParamChange(encOP, encConfig.cfgFileName, + NULL); + if (encOP->paramChange.paraEnable & EN_RC_FRAME_RATE) { + VPU_EncGiveCommand( + handle, ENC_SET_FRAME_RATE, + &(encOP->paramChange.NewFrameRate)); + pEncInfo->openParam.frameRateInfo = + (encOP->paramChange.NewFrameRate & + 0xffff); + } + if (encOP->paramChange.paraEnable & EN_GOP_NUM) { + VPU_EncGiveCommand( + handle, ENC_SET_GOP_NUMBER, + &(encOP->paramChange.NewGopNum)); + pEncInfo->openParam.gopSize = + encOP->paramChange.NewGopNum; + } + if (encOP->paramChange.paraEnable & EN_RC_BIT_RATE) { + VPU_EncGiveCommand( + handle, ENC_SET_BITRATE, + &encOP->paramChange.NewBitrate); + pEncInfo->openParam.bitRate = + encOP->paramChange.NewBitrate; + } + if (encOP->paramChange.paraEnable & EN_RC_INTRA_QP) { + VPU_EncGiveCommand( + handle, ENC_SET_INTRA_QP, + &(encOP->paramChange.NewIntraQp)); + } + if (encOP->paramChange.paraEnable & EN_INTRA_REFRESH) { + VPU_EncGiveCommand( + handle, ENC_SET_INTRA_MB_REFRESH_NUMBER, + &encOP->paramChange.NewIntraRefresh); + pEncInfo->openParam.intraRefreshNum = + encOP->paramChange.NewIntraRefresh; + } + + if (encOP->paramChange.paraEnable & + EN_RC_MIN_MAX_QP_CHANGE) { + int rc_max_qp = 51; + int rc_min_qp = 12; + VPU_EncGiveCommand( + handle, ENC_SET_MIN_MAX_QP, + &(encOP->paramChange.minMaxQpParam)); + + if (encOP->paramChange.minMaxQpParam + .maxQpIEnable) + pEncInfo->openParam.userQpMaxI = + encOP->paramChange.minMaxQpParam + .maxQpI; + else + pEncInfo->openParam.userQpMaxI = + rc_max_qp; + + if (encOP->paramChange.minMaxQpParam + .minQpIEnable) + pEncInfo->openParam.userQpMinI = + encOP->paramChange.minMaxQpParam + .minQpI; + else + pEncInfo->openParam.userQpMinI = + rc_min_qp; + + if (encOP->paramChange.minMaxQpParam + .maxQpPEnable) + pEncInfo->openParam.userQpMaxP = + encOP->paramChange.minMaxQpParam + .maxQpP; + else + pEncInfo->openParam.userQpMaxP = + rc_max_qp; + + if (encOP->paramChange.minMaxQpParam + .maxQpPEnable) + pEncInfo->openParam.userQpMinP = + encOP->paramChange.minMaxQpParam + .minQpP; + else + pEncInfo->openParam.userQpMinP = + rc_min_qp; + } +#if defined(RC_PIC_PARACHANGE) && defined(RC_CHANGE_PARAMETER_DEF) + if (encOP->paramChange.paraEnable & + EN_PIC_PARA_CHANGE) { + VPU_EncGiveCommand( + handle, ENC_SET_PIC_CHANGE_PARAM, + &(encOP->paramChange.changePicParam)); + + pEncInfo->openParam.userMaxDeltaQp = + encOP->paramChange.changePicParam + .MaxdeltaQp; + pEncInfo->openParam.userMinDeltaQp = + encOP->paramChange.changePicParam + .MindeltaQp; + pEncInfo->openParam.HvsQpScaleDiv2 = + encOP->paramChange.changePicParam + .HvsQpScaleDiv2; + pEncInfo->openParam.EnHvsQp = + encOP->paramChange.changePicParam + .EnHvsQp; + pEncInfo->openParam.EnRowLevelRc = + encOP->paramChange.changePicParam + .EnRowLevelRc; + pEncInfo->openParam.RcHvsMaxDeltaQp = + encOP->paramChange.changePicParam + .RcHvsMaxDeltaQp; + pEncInfo->openParam.rcInitDelay = + encOP->paramChange.changePicParam + .RcInitDelay; + pEncInfo->openParam.userGamma = + encOP->paramChange.changePicParam.Gamma; + pEncInfo->openParam.rcGopIQpOffsetEn = + encOP->paramChange.changePicParam + .RcGopIQpOffsetEn; + pEncInfo->openParam.rcGopIQpOffset = + encOP->paramChange.changePicParam + .RcGopIQpOffset; + pEncInfo->openParam.rcWeightFactor = + encOP->paramChange.changePicParam + .rcWeightFactor; +#ifdef AUTO_FRM_SKIP_DROP + pEncInfo->openParam.enAutoFrmDrop = + encOP->paramChange.changePicParam + .EnAuToFrmDrop; + pEncInfo->openParam.enAutoFrmSkip = + encOP->paramChange.changePicParam + .EnAutoFrmSkip; + pEncInfo->openParam.vbvThreshold = + encOP->paramChange.changePicParam + .VbvThreshold; + pEncInfo->openParam.qpThreshold = + encOP->paramChange.changePicParam + .QpThreshold; + pEncInfo->openParam.maxContinuosFrameDropNum = + encOP->paramChange.changePicParam + .MaxContinuousFrameDropNum; + pEncInfo->openParam.maxContinuosFrameSkipNum = + encOP->paramChange.changePicParam + .MaxContinuousFrameSkipNum; + + frm_rc_set_auto_skip_param( + &pEncInfo->frm_rc, + pEncInfo->openParam.enAutoFrmSkip, + pEncInfo->openParam.enAutoFrmDrop, + pEncInfo->openParam.vbvThreshold, + pEncInfo->openParam.qpThreshold, + pEncInfo->openParam + .maxContinuosFrameSkipNum, + pEncInfo->openParam + .maxContinuosFrameDropNum); +#endif // AUTO_FRM_SKIP_DROP + + if (pEncInfo->max_temporal_id != 0) { + if (pEncInfo->gop_size != + encOP->paramChange.changePicParam + .SetDqpNum) + pEncInfo->openParam + .set_dqp_pic_num = + pEncInfo->gop_size; + + pEncInfo->openParam.enAutoFrmDrop = + 0; // encOP->paramChange.changePicParam.EnAuToFrmDrop; + pEncInfo->openParam.enAutoFrmSkip = + 0; // encOP->paramChange.changePicParam.EnAutoFrmSkip; + } else + pEncInfo->openParam.set_dqp_pic_num = + encOP->paramChange + .changePicParam + .SetDqpNum; + + for (idx = 0; idx < 8; idx++) + pEncInfo->openParam.dqp[idx] = + encOP->paramChange + .changePicParam.dqp[idx]; + } +#endif // (RC_PIC_PARACHANGE) && (RC_CHANGE_PARAMETER_DEF) + if (encOP->paramChange.paraEnable & EN_GOP_NUM) { + int encoded_frames; + + encoded_frames = + encParam->fieldRun ? + 2 * pEncInfo->encoded_frames_in_gop : + pEncInfo->encoded_frames_in_gop; + if (encoded_frames - + encOP->paramChange.NewGopNum >= + 0) + pEncInfo->encoded_frames_in_gop = 0; + } + if (encOP->paramChange.paraEnable & + (EN_RC_FRAME_RATE | EN_RC_BIT_RATE | + EN_PIC_PARA_CHANGE)) { + int pic_width; + int pic_height; + int is_first_pic = (pEncInfo->frameIdx == 0 && + fieldDone == FALSE); + int frame_rate = + (pEncInfo->openParam.frameRateInfo & + 0xffff) / + ((pEncInfo->openParam.frameRateInfo >> + 16) + + 1); + int gop_size = pEncInfo->openParam.gopSize; + int gamma = pEncInfo->openParam.userGamma; +#ifdef CLIP_PIC_DELTA_QP + int max_delta_qp_minus = + pEncInfo->openParam.userMinDeltaQp; + int max_delta_qp_plus = + pEncInfo->openParam.userMaxDeltaQp; +#endif // CLIP_PIC_DELTA_QP + if (pEncInfo->rotationAngle == 90 || + pEncInfo->rotationAngle == 270) { + pic_width = + pEncInfo->openParam.picHeight; + pic_height = + pEncInfo->openParam.picWidth; + } else { + pic_width = + pEncInfo->openParam.picWidth; + pic_height = + pEncInfo->openParam.picHeight; + } + + if (pEncInfo->openParam.EncStdParam.avcParam + .fieldFlag) { + pic_height = pic_height >> 1; + frame_rate = frame_rate << 1; + if (gop_size != 1) + gop_size = pEncInfo->openParam + .gopSize + << 1; + } + if (gamma == -1) + gamma = 1; +#ifdef CLIP_PIC_DELTA_QP + if (max_delta_qp_minus == -1) + max_delta_qp_minus = 51; + if (max_delta_qp_plus == -1) + max_delta_qp_plus = 51; +#endif // CLIP_PIC_DELTA_QP + { + int i; + + for (i = 0; + i < + pEncInfo->openParam.set_dqp_pic_num; + i++) + pEncInfo->openParam.gopEntry[i] + .qp_offset = + encOP->paramChange + .changePicParam + .dqp[i]; + } + frm_rc_seq_init( + &pEncInfo->frm_rc, + pEncInfo->openParam.bitRate * 1000, + pEncInfo->openParam.rcInitDelay, + frame_rate, pic_width, pic_height, + gop_size, pEncInfo->openParam.rcEnable, + pEncInfo->openParam.set_dqp_pic_num, + pEncInfo->openParam.gopEntry, + pEncInfo->openParam.LongTermDeltaQp, -1, + is_first_pic, gamma, + pEncInfo->openParam.rcWeightFactor +#ifdef CLIP_PIC_DELTA_QP + , + max_delta_qp_minus, max_delta_qp_plus +#endif // CLIP_PIC_DELTA_QP + ); + } + } + } + + encParam->coda9RoiEnable = encOP->coda9RoiEnable; + + if (encOP->coda9RoiEnable) { + encParam->roiQpMapAddr = vbRoi.phys_addr; + encParam->coda9RoiPicAvgQp = encOP->RoiPicAvgQp; + if (encConfig.roi_file_name[0]) { +#ifdef ROI_MB_RC + char lineStr[256] = { + 0, + }; + int val; + int roiNum; + int non_roi_qp, roi_avg_qp; + fgets(lineStr, 256, encConfig.roi_file); + sscanf(lineStr, "%x\n", &val); + if (val != 0xFFFF) + VLOG(ERR, + "can't find the picture delimiter\n"); + + fgets(lineStr, 256, encConfig.roi_file); + sscanf(lineStr, "%d\n", &val); // picture index + + fgets(lineStr, 256, encConfig.roi_file); + sscanf(lineStr, "%d %d %d\n", &roiNum, &non_roi_qp, + &roi_avg_qp); // number of roi regions + encParam->setROI.number = roiNum; + encParam->nonRoiQp = non_roi_qp; + encParam->coda9RoiPicAvgQp = roi_avg_qp; + for (idx = 0; idx < roiNum; idx++) { + fgets(lineStr, 256, encConfig.roi_file); + sscanf(lineStr, "%d %d %d %d %d\n", + &encParam->setROI.region[idx].left, + &encParam->setROI.region[idx].right, + &encParam->setROI.region[idx].top, + &encParam->setROI.region[idx].bottom, + &encParam->setROI.qp[idx]); + } +#else + Uint8 *pRoiBuf; + int pic_height = encOP->EncStdParam.avcParam.fieldFlag ? + encOP->picHeight / 2 : + encOP->picHeight; + Int32 roiMapSize = VPU_ALIGN16(encOP->picWidth) * + VPU_ALIGN16(pic_height) / + 256; // 1 Byte per 1 MB. + + pRoiBuf = (Uint8 *)osal_malloc(roiMapSize); + + if (osal_fread(pRoiBuf, 1, roiMapSize, + encConfig.roi_file) != roiMapSize) { + osal_fseek(encConfig.roi_file, 0, SEEK_SET); + osal_fread(pRoiBuf, 1, roiMapSize, + encConfig.roi_file); + } + + vdi_write_memory(encConfig.coreIdx, + encParam->roiQpMapAddr, pRoiBuf, + roiMapSize, VDI_BIG_ENDIAN); + osal_free(pRoiBuf); +#endif // ROI_MB_RC + } + } +} +*/ + +#ifdef DROP_FRAME +static int cviHandlePartialBitstreamDrop(stTestEncoder *pTestEnc, BOOL bStreamEnd) +{ + int ret = RETCODE_SUCCESS; + CodecInst *pCodecInst = pTestEnc->handle; + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + PhysicalAddress paRdPtr, paWrPtr; + Uint8 *vaRdPtr; + int size = 0; + + // NOTE: h265 will update pEncInfo->streamBufStartAddr, + // h264 not change pEncInfo->streamBufStartAddr + // Use pTestEnc->encParam.picStreamBufferAddr to get the bistStreamStartAddr + PhysicalAddress streamBufStartAddr = pTestEnc->encParam.picStreamBufferAddr; + + ret = VPU_EncGetBitstreamBuffer(pTestEnc->handle, &paRdPtr, &paWrPtr, + &size); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_EncGetBitstreamBuffer fail with ret %d\n", ret); + return ret; + } + + vaRdPtr = vdi_get_vir_addr(pTestEnc->coreIdx, paRdPtr); + CVI_VENC_BS("coreIdx:%d\n", pTestEnc->coreIdx); + + // partial encoded bitstream size is larger than free bitstream buffer size + // need to drop + + CVI_VENC_BS("streamBufAddr:0x%llx - 0x%llx paRdPtr:0x%llx\n", + streamBufStartAddr, pEncInfo->streamBufEndAddr, paRdPtr); + CVI_VENC_BS("freeStream:0x%llx UseStream:0x%x\n", paRdPtr - streamBufStartAddr, size); + if ((streamBufStartAddr + size) > paRdPtr) { + pTestEnc->bDrop = TRUE; + // u32PreStreamLen is only for store size here + pTestEnc->u32PreStreamLen += size; + CVI_VENC_BS("Drop bitream:%dkB\n", pTestEnc->u32PreStreamLen >> 10); + } else { + // partial encoded bitstream size is less than free bitstream buffer size + // rotate the partial bitstream to the start addr + + // RotateOffset+szie overwrite RdPtr + if ((Uint64)(pTestEnc->u32BsRotateOffset + size) >= paRdPtr - streamBufStartAddr) { + CVI_VENC_BS("RotateOffse:%lld > BuffSzie:%lld, continue\n", + (Uint64) (pTestEnc->u32BsRotateOffset + size), + paRdPtr - streamBufStartAddr); + + pTestEnc->bDrop = TRUE; + + CVI_VENC_BS("Drop bitream\n"); + return RETCODE_SUCCESS; + } + +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_invalidate_ion_cache(paRdPtr, vaRdPtr, size); +#endif + memcpy((pTestEnc->vbStream[0].virt_addr + + pTestEnc->u32BsRotateOffset), + vaRdPtr, size); +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_flush_ion_cache(pTestEnc->vbStream[0].phys_addr + + pTestEnc->u32BsRotateOffset, + pTestEnc->vbStream[0].virt_addr + + pTestEnc->u32BsRotateOffset, + size); +#endif + pTestEnc->u32BsRotateOffset += size; + CVI_VENC_BS("u32BsRotateOffset:%dKb\n", pTestEnc->u32BsRotateOffset >> 10); + } + + if (bStreamEnd) { + if (pTestEnc->bDrop) { + // reset RdPtr/WrPtr + VpuWriteReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr, + streamBufStartAddr); + pEncInfo->streamWrPtr = streamBufStartAddr; + + VpuWriteReg(pTestEnc->coreIdx, + pEncInfo->streamRdPtrRegAddr, + streamBufStartAddr); + pEncInfo->streamRdPtr = streamBufStartAddr; + CVI_VENC_BS("reset RdPtr/WrPtr, streamWrPtr:%llx streamRdPtr:%llx\n", + pEncInfo->streamWrPtr, pEncInfo->streamRdPtr); + } else if (pTestEnc->u32BsRotateOffset) { + // update WrPtr to BsStartAddr + BsRotateOffset + VpuWriteReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr, + streamBufStartAddr + pTestEnc->u32BsRotateOffset); + pEncInfo->streamWrPtr = streamBufStartAddr + pTestEnc->u32BsRotateOffset; + + // update RdPtr to BsStartAdd + VpuWriteReg(pTestEnc->coreIdx, + pEncInfo->streamRdPtrRegAddr, + streamBufStartAddr); + pEncInfo->streamRdPtr = streamBufStartAddr; + + CVI_VENC_BS("update RdPtr/WrPtr, streamWrPtr:%llx streamRdPtr:%llx\n", + pEncInfo->streamWrPtr, pEncInfo->streamRdPtr); + } + pTestEnc->u32BsRotateOffset = 0; + pTestEnc->u32PreStreamLen = 0; + } + + return RETCODE_SUCCESS; +} +#else +static int cviHandlePartialBitstream(stTestEncoder *pTestEnc, BOOL bStreamEnd) +{ + int ret = RETCODE_SUCCESS; + CodecInst *pCodecInst = pTestEnc->handle; + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + PhysicalAddress paRdPtr, paWrPtr; + Uint8 *vaRdPtr; + int size = 0; + + ret = VPU_EncGetBitstreamBuffer(pTestEnc->handle, &paRdPtr, &paWrPtr, + &size); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_EncGetBitstreamBuffer fail with ret %d\n", ret); + return ret; + } + + vaRdPtr = vdi_get_vir_addr(pTestEnc->coreIdx, paRdPtr); + + CVI_VC_TRACE("paRdPtr 0x%llx, paWrPtr 0x%llx, size 0x%x\n", paRdPtr, + paWrPtr, size); + + // using heap to save partial bitstream, + // if partial encoded bitstream size is larger than free bitstream buffer size: + // => RdPtr is less than (streamBufStartAddr + partial bitstream size) + // otherwise, rotate the partial bitstream to the start addr. of bitstream buffer + if ((pEncInfo->streamBufStartAddr + size) > paRdPtr) { + Uint8 *pu8PartialBitstreamBuf; + + pu8PartialBitstreamBuf = + osal_malloc(pTestEnc->u32PreStreamLen + size); + if (!pu8PartialBitstreamBuf) { + CVI_VC_ERR( + "Can not allocate memory for partial bitstream\n"); + return RETCODE_INSUFFICIENT_RESOURCE; + } + + CVI_VC_WARN( + "heap allocation (0x%X) for BIT_BUF_FULL interrupt!\n", + pTestEnc->u32PreStreamLen + size); + +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_invalidate_ion_cache(paRdPtr, vaRdPtr, size); +#endif + if (pTestEnc->pu8PreStream) { + memcpy(pu8PartialBitstreamBuf, pTestEnc->pu8PreStream, + pTestEnc->u32PreStreamLen); + memcpy(pu8PartialBitstreamBuf + + pTestEnc->u32PreStreamLen, + vaRdPtr, size); + osal_free(pTestEnc->pu8PreStream); + pTestEnc->pu8PreStream = NULL; + } else { + memcpy(pu8PartialBitstreamBuf, vaRdPtr, size); + } + + pTestEnc->pu8PreStream = pu8PartialBitstreamBuf; + pTestEnc->u32PreStreamLen += size; + CVI_VC_TRACE("current partial bitstream size 0x%x\n", + pTestEnc->u32PreStreamLen); + } else { +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_invalidate_ion_cache(paRdPtr, vaRdPtr, size); +#endif + memcpy((pTestEnc->vbStream[0].virt_addr + + pTestEnc->u32BsRotateOffset), + vaRdPtr, size); +#if (defined CVI_H26X_USE_ION_MEM && defined BITSTREAM_ION_CACHED_MEM) + vdi_flush_ion_cache(pTestEnc->vbStream[0].phys_addr + + pTestEnc->u32BsRotateOffset, + pTestEnc->vbStream[0].virt_addr + + pTestEnc->u32BsRotateOffset, + size); +#endif + pTestEnc->u32BsRotateOffset += size; + + CVI_VC_TRACE("u32BsRotateOffset 0x%x, bStreamEnd %d\n", + pTestEnc->u32BsRotateOffset, bStreamEnd); + if (bStreamEnd) { + // to update both RdPtr/WrPtr for later VPU_EncGetOutputInfo() + + // update WrPtr to (BsStartAddr + BsRotateOffset) + VpuWriteReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr, + pEncInfo->streamBufStartAddr + + pTestEnc->u32BsRotateOffset); + pEncInfo->streamWrPtr = pEncInfo->streamBufStartAddr + + pTestEnc->u32BsRotateOffset; + // update RdPtr to (BsStartAddr) + VpuWriteReg(pTestEnc->coreIdx, + pEncInfo->streamRdPtrRegAddr, + pEncInfo->streamBufStartAddr); + pEncInfo->streamRdPtr = pEncInfo->streamBufStartAddr; + + pTestEnc->u32BsRotateOffset = 0; + + CVI_VC_TRACE("streamRdPtr 0x%llx, streamWrPtr 0x%llx\n", + pEncInfo->streamRdPtr, + pEncInfo->streamWrPtr); + } + } + + return RETCODE_SUCCESS; +} +#endif + +static int cviGetEncodedInfo(stTestEncoder *pTestEnc, int s32MilliSec) +{ + EncParam *pEncParam = &pTestEnc->encParam; + int coreIdx = pTestEnc->coreIdx; + int int_reason = 0; + Uint32 timeoutCount = 0; + int ret = RETCODE_SUCCESS; + static Uint32 enc_cnt; + CodStd curCodec; + EncHandle handle = pTestEnc->handle; + + UNUSED(enc_cnt); + while (1) { + int_reason = VPU_WaitInterrupt(coreIdx, s32MilliSec); + + CVI_VC_TRACE("int_reason = 0x%X, timeoutCount = %d\n", + int_reason, timeoutCount); + + if (int_reason == -1) { + if (s32MilliSec >= 0) { + CVI_VC_ERR( + "Error : encoder timeout happened in non_block mode\n"); + return TE_STA_ENC_TIMEOUT; + } + + if (pTestEnc->interruptTimeout > 0 && + timeoutCount * s32MilliSec > + pTestEnc->interruptTimeout) { + CVI_VC_ERR( + "Error : encoder timeout happened\n"); +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(coreIdx, pTestEnc->productId); +#endif + VPU_SWReset(coreIdx, SW_RESET_SAFETY, + pTestEnc->handle); + break; + } + CVI_VC_TRACE( + "VPU_WaitInterrupt ret -1, retry timeoutCount[%d]\n", + timeoutCount); + + int_reason = 0; + timeoutCount++; + } + + if (pTestEnc->encOP.ringBufferEnable == TRUE) { + if (!BitstreamReader_Act( + pTestEnc->bsReader, + pTestEnc->encOP.bitstreamBuffer, + pTestEnc->encOP.bitstreamBufferSize, + STREAM_READ_SIZE, + pTestEnc->comparatorBitStream)) { +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(coreIdx, pTestEnc->productId); +#endif + break; + } + } + + if (int_reason & (1 << INT_BIT_BIT_BUF_FULL)) { + CVI_VC_WARN("INT_BIT_BIT_BUF_FULL\n"); + handle->bBuffFull = CVI_TRUE; + if (pTestEnc->encConfig.cviApiMode == API_MODE_SDK) { +#ifdef DROP_FRAME + ret = cviHandlePartialBitstreamDrop(pTestEnc, FALSE); +#else + ret = cviHandlePartialBitstream(pTestEnc, FALSE); +#endif + if (ret != RETCODE_SUCCESS) { + if (ret != RETCODE_INSUFFICIENT_RESOURCE) { + CVI_VC_ERR( + "cviHandlePartialBitstream fail\n"); + return RETCODE_FAILURE; + } + } + } + #ifdef VC_DRIVER_TEST + else { + BitstreamReader_Act( + pTestEnc->bsReader, + pTestEnc->encOP.bitstreamBuffer, + pTestEnc->encOP.bitstreamBufferSize, + STREAM_READ_ALL_SIZE, + pTestEnc->comparatorBitStream); + } + #endif + if (pTestEnc->encConfig.stdMode == STD_HEVC) { + // CnM workaround for BUF_FULL interrupt (BITMONET-68) + VpuWriteReg(coreIdx, 0x1EC, 0); + } + } + + if (int_reason) { + VPU_ClearInterrupt(coreIdx); + if (int_reason & (1 << INT_WAVE_ENC_PIC)) { + break; + } + } + } + + CVI_VC_PERF("%04u, enc time : %d ms\n", enc_cnt++, + (VPU_GetFrameCycle(coreIdx) / + vdi_get_clk_rate(coreIdx) * 1000)); // convert to ms +#ifdef DROP_FRAME + if ((pTestEnc->encOP.bEsBufQueueEn == 1 && pTestEnc->u32BsRotateOffset != 0) + || (pTestEnc->bDrop == TRUE)) { + if (cviHandlePartialBitstreamDrop(pTestEnc, TRUE) != + RETCODE_SUCCESS) { + CVI_VC_ERR("cviHandlePartialBitstream fail\n"); + return RETCODE_FAILURE; + } + } +#else + if ((pTestEnc->encOP.bEsBufQueueEn == 1 && pTestEnc->u32BsRotateOffset != 0)) { + if (cviHandlePartialBitstream(pTestEnc, TRUE) != + RETCODE_SUCCESS) { + CVI_VC_ERR("cviHandlePartialBitstream fail\n"); + return RETCODE_FAILURE; + } + } +#endif + + ret = VPU_EncGetOutputInfo(pTestEnc->handle, &pTestEnc->outputInfo); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("VPU_EncGetOutputInfo failed Error code is 0x%x int_reason 0x%x\n", + ret, int_reason); + if (ret == RETCODE_STREAM_BUF_FULL) { +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(coreIdx, pTestEnc->productId); +#endif + } else if (ret == RETCODE_MEMORY_ACCESS_VIOLATION || + ret == RETCODE_CP0_EXCEPTION || + ret == RETCODE_ACCESS_VIOLATION_HW) { +#ifdef REDUNDENT_CODE + PrintMemoryAccessViolationReason( + coreIdx, (void *)&pTestEnc->outputInfo); +#endif +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(coreIdx, pTestEnc->productId); +#endif + VPU_SWReset(coreIdx, SW_RESET_SAFETY, pTestEnc->handle); + } else { +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(coreIdx, pTestEnc->productId); +#endif + VPU_SWReset(coreIdx, SW_RESET_SAFETY, pTestEnc->handle); + } + + CVI_VC_ERR("VPU_EncGetOutputInfo, ret = %d\n", ret); + return TE_ERR_ENC_OPEN; + } + if (pTestEnc->encOP.cviRcEn) + cviEncRc_UpdatePicInfo(&pTestEnc->handle->rcInfo, + &pTestEnc->outputInfo); + + if (coreIdx == 0) + curCodec = STD_HEVC; + else + curCodec = STD_AVC; + + DisplayEncodedInformation(pTestEnc->handle, curCodec, + &pTestEnc->outputInfo, pEncParam->srcEndFlag, + pTestEnc->srcFrameIdx); + + return ret; +} + +static int cviCheckOutputInfo(stTestEncoder *pTestEnc) +{ + int ret = RETCODE_SUCCESS; + + if (pTestEnc->outputInfo.bitstreamWrapAround == 1) { + CVI_VC_WARN( + "Warnning!! BitStream buffer wrap arounded. prepare more large buffer\n"); + } + + if (pTestEnc->outputInfo.bitstreamSize == 0 && + pTestEnc->outputInfo.reconFrameIndex >= 0) { + CVI_VC_ERR("ERROR!!! bitstreamsize = 0\n"); + } + + if (pTestEnc->encOP.lineBufIntEn == 0) { + if (pTestEnc->outputInfo.wrPtr < pTestEnc->outputInfo.rdPtr) { + CVI_VC_ERR("wrptr < rdptr\n"); + return TE_ERR_ENC_OPEN; + } + } + + return ret; +} + +static int cviCheckEncodeEnd(stTestEncoder *pTestEnc) +{ + EncParam *pEncParam = &pTestEnc->encParam; + int ret = 0; + + // end of encoding + if (pTestEnc->outputInfo.reconFrameIndex == -1) { + CVI_VC_INFO("reconFrameIndex = -1\n"); + return TE_STA_ENC_BREAK; + } + +#ifdef ENC_RECON_FRAME_DISPLAY + SimpleRenderer_Act(); +#endif + + if (pTestEnc->frameIdx > + (Uint32)MAX(0, (pTestEnc->encConfig.outNum - 1))) { + if (pTestEnc->encOP.bitstreamFormat == STD_AVC) + ret = TE_STA_ENC_BREAK; + else + pEncParam->srcEndFlag = 1; + } + + return ret; +} + +static int cviCheckAndCompareBitstream(stTestEncoder *pTestEnc) +{ +#ifdef ENABLE_CNM_DEBUG_MSG + int coreIdx = pTestEnc->coreIdx; +#endif + int ret = 0; + + if (pTestEnc->encOP.ringBufferEnable == 1) { + ret = BitstreamReader_Act(pTestEnc->bsReader, + pTestEnc->encOP.bitstreamBuffer, + pTestEnc->encOP.bitstreamBufferSize, + 0, pTestEnc->comparatorBitStream); + if (ret == FALSE) { +#ifdef ENABLE_CNM_DEBUG_MSG + PrintVpuStatus(coreIdx, pTestEnc->productId); +#endif + return TE_ERR_ENC_OPEN; + } + } +#ifdef REDUNDENT_CODE + if (pTestEnc->encConfig.outNum == 0) { + if (pTestEnc->comparatorBitStream) { + if (Comparator_CheckEOF( + pTestEnc->comparatorBitStream) == FALSE) { + VLOG(ERR, + "MISMATCH BitStream data size. There is still data to compare.\n"); + return TE_ERR_ENC_OPEN; + } + } + } +#endif + return ret; +} + +static void cviCloseVpuEnc(stTestEncoder *pTestEnc) +{ + EncOpenParam *pEncOP = &pTestEnc->encOP; + int coreIdx = pTestEnc->coreIdx; + FrameBufferAllocInfo *pFbAllocInfo = &pTestEnc->fbAllocInfo; + int i; + int buf_cnt; + cviEncCfg *pcviEc = &pTestEnc->encConfig.cviEc; + + if (pTestEnc->encConfig.cviEc.singleLumaBuf > 0) { + buf_cnt = 1; + // smart-p with additional 1 framebuffer + if (pTestEnc->encConfig.cviEc.virtualIPeriod > 0) { + buf_cnt += 1; + } + } else { + buf_cnt = pTestEnc->regFrameBufCount; + } + + if (pcviEc->VbBufCfg.VbType == VB_SOURCE_TYPE_PRIVATE || + pcviEc->VbBufCfg.VbType == VB_SOURCE_TYPE_USER) { + //skip dma free under non common mode + + } else { + for (i = 0; i < buf_cnt; i++) { + if (pTestEnc->vbReconFrameBuf[i].size > 0) { + VDI_FREE_MEMORY(coreIdx, + &pTestEnc->vbReconFrameBuf[i]); + } + } + } + for (i = 0; i < pFbAllocInfo->num; i++) { + if (pTestEnc->vbSourceFrameBuf[i].size > 0) { + VDI_FREE_MEMORY(coreIdx, + &pTestEnc->vbSourceFrameBuf[i]); + } + if (pTestEnc->vbRoi[i].size) { + VDI_FREE_MEMORY(coreIdx, &pTestEnc->vbRoi[i]); + } + if (pTestEnc->vbCtuQp[i].size) { + VDI_FREE_MEMORY(coreIdx, &pTestEnc->vbCtuQp[i]); + } + if (pTestEnc->vbPrefixSeiNal[i].size) + VDI_FREE_MEMORY(coreIdx, &pTestEnc->vbPrefixSeiNal[i]); + if (pTestEnc->vbSuffixSeiNal[i].size) + VDI_FREE_MEMORY(coreIdx, &pTestEnc->vbSuffixSeiNal[i]); +#ifdef TEST_ENCODE_CUSTOM_HEADER + if (pTestEnc->vbSeiNal[i].size) + VDI_FREE_MEMORY(coreIdx, &pTestEnc->vbSeiNal[i]); +#endif + } + + if (pTestEnc->vbHrdRbsp.size) + VDI_FREE_MEMORY(coreIdx, &pTestEnc->vbHrdRbsp); + + if (pTestEnc->vbVuiRbsp.size) + VDI_FREE_MEMORY(coreIdx, &pTestEnc->vbVuiRbsp); + +#ifdef TEST_ENCODE_CUSTOM_HEADER + if (pTestEnc->vbCustomHeader.size) + VDI_FREE_MEMORY(coreIdx, &pTestEnc->vbCustomHeader); +#endif + + VPU_EncClose(pTestEnc->handle); + CoreSleepWake(coreIdx, 1); //ensure vpu sleep + + if (pEncOP->bitstreamFormat == STD_AVC) { + CVI_VC_INFO("\ninst %d Enc End. Tot Frame %d\n", + pTestEnc->encConfig.instNum, + pTestEnc->outputInfo.encPicCnt); + } else { + CVI_VC_INFO("\ninst %d Enc End. Tot Frame %d\n", + pTestEnc->encConfig.instNum, + pTestEnc->outputInfo.encPicCnt); + } +} + +static void cviDeInitVpuEnc(stTestEncoder *pTestEnc) +{ + void *pYuvFeeder = pTestEnc->yuvFeeder; + int coreIdx = pTestEnc->coreIdx; + Uint32 i = 0; + + for (i = 0; i < pTestEnc->bsBufferCount; i++) { + if (pTestEnc->vbStream[i].size) { + if (vdi_get_is_single_es_buf(coreIdx)) + vdi_free_single_es_buf_memory( + coreIdx, &pTestEnc->vbStream[i]); + else + VDI_FREE_MEMORY(coreIdx, + &pTestEnc->vbStream[i]); + } + } + + if (pTestEnc->vbReport.size) + VDI_FREE_MEMORY(coreIdx, &pTestEnc->vbReport); +#ifdef REDUNDENT_CODE + if (pTestEnc->comparatorBitStream != NULL) { + Comparator_Destroy(pTestEnc->comparatorBitStream); + osal_free(pTestEnc->comparatorBitStream); + } +#endif + + BitstreamReader_Destroy(pTestEnc->bsReader); + + if (pYuvFeeder != NULL) { + YuvFeeder_Destroy(pYuvFeeder); + osal_free(pYuvFeeder); + } + + VPU_DeInit(coreIdx); +} + +static void *cviInitEncoder(stTestEncoder *pTestEnc, TestEncConfig *pEncConfig) +{ + int ret = 0; + + ret = initEncoder(pTestEnc, pEncConfig); + if (ret == TE_ERR_ENC_INIT) + goto INIT_ERR_ENC_INIT; + else if (ret == TE_ERR_ENC_OPEN) + goto INIT_ERR_ENC_OPEN; + + return (void *)pTestEnc; + +INIT_ERR_ENC_OPEN: + cviCloseVpuEnc(pTestEnc); +INIT_ERR_ENC_INIT: + cviDeInitVpuEnc(pTestEnc); + return NULL; +} + +int initEncoder(stTestEncoder *pTestEnc, TestEncConfig *pEncConfig) +{ + int ret = 0; + + VDI_POWER_ON_DOING_JOB(pEncConfig->coreIdx, ret, + initEncOneFrame(pTestEnc, pEncConfig)); + + if (ret == TE_ERR_ENC_INIT) { + CVI_VC_ERR("TE_ERR_ENC_INIT\n"); + return ret; + } else if (ret == TE_ERR_ENC_OPEN) { + // TODO -- error handling + CVI_VC_ERR("TE_ERR_ENC_OPEN\n"); + return ret; + } +#ifdef DUMP_MOTIONMAP + pTestEnc->encConfig.filp = filp_open("motionmap.bin", O_RDWR | O_CREAT, 0644); + pEncConfig->pos = 0; +#endif + return ret; +} + +void cvi_vc_get_motion_tbl(void *arg) +{ + struct base_exe_m_cb exe_cb; + /* Notify vi to send buffer as soon as possible */ + exe_cb.callee = E_MODULE_VPSS; + exe_cb.caller = E_MODULE_VCODEC; + exe_cb.cmd_id = VPSS_CB_GET_MLV_INFO; + exe_cb.data = arg; + base_exe_module_cb(&exe_cb); +} + + +void cviCopyMotionMap(void *handle, cviEncOnePicCfg *pPicCfg, void *phandle) +{ + struct vpss_grp_mlv_info *mlv_info = NULL; + CodecInst *pCodecInst = NULL; + stTestEncoder *pTestEnc = (stTestEncoder *) handle; + + if (!pTestEnc) { + return; + } + pCodecInst = pTestEnc->handle; + if (!pCodecInst) + return; + + mlv_info = kzalloc(sizeof(*mlv_info), GFP_ATOMIC); + if (!mlv_info) { + CVI_VC_ERR("fail to kzalloc(%zu)\n", sizeof(struct vpss_grp_mlv_info)); + return; + } + if (pCodecInst->CodecInfo->encInfo.bSbmEn) { + mlv_info->vpss_grp = 0; + cvi_vc_get_motion_tbl((void *) mlv_info); + pPicCfg->picMotionLevel = mlv_info->m_lv_i.mlv_i_level; + pPicCfg->picDciLv = 0; + pPicCfg->picMotionMapSize = MO_TBL_SIZE; + memcpy(pPicCfg->picMotionMap, mlv_info->m_lv_i.mlv_i_table, MO_TBL_SIZE); + } + + kfree(mlv_info); +} + +static int cviVEncStartSb(stTestEncoder *pTestEnc) +{ + int reg = 0; + + // Set Register 0x0 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x00); + + // bit7 sbc0 h265 + // bit11 sbc1 h264 + // bit15 sbc2 jpeg + if (pTestEnc->encOP.bitstreamFormat == STD_AVC) + reg |= (1 << 11); + else if (pTestEnc->encOP.bitstreamFormat == STD_HEVC) + reg |= (1 << 7); + else { + CVI_VC_ERR("bitstreamFormat:%d not support", pTestEnc->encOP.bitstreamFormat); + return -1; + } + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + + return RETCODE_SUCCESS; +} + + +int cviVEncEncOnePic(void *handle, cviEncOnePicCfg *pPicCfg, int s32MilliSec) +{ + int ret = 0; + stTestEncoder *pTestEnc = (stTestEncoder *)handle; + EncOpenParam *pEncOP = &pTestEnc->encOP; + CodecInst *pCodecInst = pTestEnc->handle; +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) + struct timespec64 ts; +#else + struct timespec ts; +#endif + CVI_VC_IF("\n"); + + ret = cviVPU_LockAndCheck(pTestEnc->handle, CODEC_STAT_ENC_PIC, + s32MilliSec); + if (ret != RETCODE_SUCCESS) { + CVI_VC_TRACE("cviVPU_LockAndCheck, ret = %d\n", ret); + if (ret == RETCODE_VPU_RESPONSE_TIMEOUT) { + return RET_VCODEC_TIMEOUT; + //timeout return + } else { + CVI_VC_ERR( + "cviVPU_LockAndCheck error[%d]s32MilliSec[%d]\n", + ret, s32MilliSec); + return ret; + } + } + + pTestEnc->yuvAddr.addrY = pPicCfg->addrY; + pTestEnc->yuvAddr.addrCb = pPicCfg->addrCb; + pTestEnc->yuvAddr.addrCr = pPicCfg->addrCr; + + pTestEnc->yuvAddr.phyAddrY = pPicCfg->phyAddrY; + pTestEnc->yuvAddr.phyAddrCb = pPicCfg->phyAddrCb; + pTestEnc->yuvAddr.phyAddrCr = pPicCfg->phyAddrCr; + pTestEnc->u64Pts = pPicCfg->u64Pts; + + if (pCodecInst->CodecInfo->encInfo.bSbmEn) { + ret = cviSetSbSetting(&pTestEnc->SbSetting); + if (ret != RETCODE_SUCCESS) { + CVI_VENC_ERR("cviSetSbSetting fail, s32Ret=%d\n", ret); + } + + ret = cviVEncStartSb(pTestEnc); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("StartSb fail\n"); + LeaveVcodecLock(pTestEnc->coreIdx); + return ret; + } + +#if (KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE) + ktime_get_ts64(&ts); +#else + ktime_get_ts(&ts); +#endif + if (pTestEnc->u64Pts == 0) { + pTestEnc->u64Pts = ts.tv_sec * 1000000 + ts.tv_nsec / 1000; + } + } + + pTestEnc->srcFrameStride = pPicCfg->stride; + pEncOP->cbcrInterleave = pPicCfg->cbcrInterleave; + pEncOP->nv21 = pPicCfg->nv21; + pEncOP->picMotionLevel = pPicCfg->picMotionLevel; + pEncOP->picDciLv = pPicCfg->picDciLv; + pEncOP->picMotionMap = pPicCfg->picMotionMap; + pEncOP->picMotionMapSize = pPicCfg->picMotionMapSize; + + CVI_VC_TRACE("addrY = 0x%p, addrCb = 0x%p, addrCr = 0x%p\n", + pTestEnc->yuvAddr.addrY, pTestEnc->yuvAddr.addrCb, + pTestEnc->yuvAddr.addrCr); + CVI_VC_TRACE( + "phyAddrY = 0x%llX, phyAddrCb = 0x%llX, phyAddrCr = 0x%llX\n", + pTestEnc->yuvAddr.phyAddrY, pTestEnc->yuvAddr.phyAddrCb, + pTestEnc->yuvAddr.phyAddrCr); + CVI_VC_TRACE("motion lv = %d, mSize = %d\n", pPicCfg->picMotionLevel, + pPicCfg->picMotionMapSize); + + ret = cviEncodeOneFrame(pTestEnc); + + if (ret == TE_ERR_ENC_OPEN || ret == TE_STA_ENC_BREAK) { + CVI_VC_INFO("cviEncodeOneFrame, ret = %d\n", ret); + cviVPU_ChangeState(pTestEnc->handle); + LeaveVcodecLock(pTestEnc->coreIdx); + } else if (ret == RETCODE_SUCCESS && pTestEnc->encConfig.bIsoSendFrmEn && + !pTestEnc->handle->rcInfo.isReEncodeIdr) { + complete(&pTestEnc->semSendEncCmd); + } + + return ret; +} + +int cviVEncGetStream(void *handle, cviVEncStreamInfo *pStreamInfo, + int s32MilliSec) +{ + stTestEncoder *pTestEnc = (stTestEncoder *)handle; + int ret = RETCODE_SUCCESS; + + CVI_VC_IF("\n"); + + if (pTestEnc->encConfig.bIsoSendFrmEn) { + ret = wait_for_completion_timeout(&pTestEnc->semGetStreamCmd, + usecs_to_jiffies(s32MilliSec * 1000)); + if (ret == 0) { + CVI_VC_WARN("get stream timeout!\n"); + return RET_VCODEC_TIMEOUT; + } + memcpy(pStreamInfo, &pTestEnc->tStreamInfo, sizeof(cviVEncStreamInfo)); + return RETCODE_SUCCESS; + } + + pTestEnc->encConfig.cviEc.originPicType = PIC_TYPE_MAX; + + ret = cviGetOneStream(handle, pStreamInfo, s32MilliSec); + + if (ret == TE_ERR_ENC_IS_SUPER_FRAME) + ret = cviProcessSuperFrame(pTestEnc, pStreamInfo, s32MilliSec); + + return ret; +} + +// should mutex psp->packMutex in caller +static CVI_S32 cviDropEsPacks(stStreamPack *psp) +{ + CVI_U32 idx = 0; + stPack *pPack; + + if (psp->totalPacks) { + for (idx = 0; idx < psp->totalPacks && (idx < MAX_NUM_PACKS); idx++) { + pPack = &psp->pack[idx]; + + if (pPack->addr && pPack->need_free) { + if (pPack->cviNalType >= NAL_I && pPack->cviNalType <= NAL_IDR) { + osal_ion_free(pPack->addr); + } else { + osal_kfree(pPack->addr); + } + pPack->addr = NULL; + } + pPack->len = 0; + pPack->bUsed = CVI_FALSE; + } + psp->totalPacks = 0; + psp->dropCnt++; + psp->seq++; + } + + return 0; +} + +static int cviGetOneStream(void *handle, cviVEncStreamInfo *pStreamInfo, + int s32MilliSec) +{ + stTestEncoder *pTestEnc = (stTestEncoder *)handle; + cviEncCfg *pCviEc = &pTestEnc->encConfig.cviEc; + EncOpenParam *peop = &pTestEnc->encOP; + EncOutputInfo *pOutputInfo = &pTestEnc->outputInfo; + CodecInst *pCodecInst = pTestEnc->handle; + int ret = RETCODE_SUCCESS; + + CVI_VC_IF("\n"); + + ret = cviGetEncodedInfo(pTestEnc, s32MilliSec); + if (ret == TE_STA_ENC_TIMEOUT) { + //user should keep get frame until success + CVI_VC_TRACE("Time out please retry\n"); + return RET_VCODEC_TIMEOUT; + } else if (ret) { + CVI_VC_ERR("cviGetEncodedInfo, ret = %d\n", ret); + goto ERR_CVI_VENC_GET_STREAM; + } + + pStreamInfo->encHwTime = pOutputInfo->encHwTime; + pStreamInfo->u32MeanQp = pOutputInfo->u32MeanQp; + + +#ifdef DROP_FRAME + if (pTestEnc->bDrop) { + CVI_VENC_BS("Drop isIdr:%d\n", pTestEnc->encParam.is_idr_frame); + + // if drop IDR, need clear vps sps pps header + if (pTestEnc->encParam.is_idr_frame) { + MUTEX_LOCK(&pTestEnc->streamPack.packMutex); + cviDropEsPacks(&pTestEnc->streamPack); + MUTEX_UNLOCK(&pTestEnc->streamPack.packMutex); + } + ret = RETCODE_SUCCESS; + + goto ERR_CVI_VENC_GET_STREAM; + } +#endif + + if (pTestEnc->encOP.ringBufferEnable == 0) { + ret = cviCheckOutputInfo(pTestEnc); + if (ret == TE_ERR_ENC_OPEN) { + CVI_VC_ERR("cviCheckOutputInfo, ret = %d\n", ret); + goto ERR_CVI_VENC_GET_STREAM; + } + + if (pOutputInfo->bitstreamSize) { + ret = cviPutEsInPack(pTestEnc, + pOutputInfo->bitstreamBuffer, + pOutputInfo->bitstreamBuffer + + peop->bitstreamBufferSize, + pOutputInfo->bitstreamSize, + NAL_I + pOutputInfo->picType); + + if (ret == FALSE) { + CVI_VC_ERR("cviPutEsInPack, ret = %d\n", ret); + ret = TE_ERR_ENC_OPEN; + goto ERR_CVI_VENC_GET_STREAM; + } else { + ret = RETCODE_SUCCESS; + } + } + + if (pOutputInfo->bitstreamSize) + pStreamInfo->psp = &pTestEnc->streamPack; + + CVI_VC_TRACE("frameIdx = %d, isLastPicI = %d, size = %d\n", + pTestEnc->frameIdx, + (pOutputInfo->picType == PIC_TYPE_I) || + (pOutputInfo->picType == PIC_TYPE_IDR), + pOutputInfo->bitstreamSize << 3); + + if (pCviEc->enSuperFrmMode != CVI_SUPERFRM_NONE) + ret = cviCheckSuperFrame(pTestEnc); + } + +ERR_CVI_VENC_GET_STREAM: + cviVPU_ChangeState(pTestEnc->handle); + // if NOT sharing es buffer, we can unlock to speed-up enc process + if (!pCviEc->bSingleEsBuf) { + LeaveVcodecLock(pTestEnc->coreIdx); + } + + if (pCodecInst->CodecInfo->encInfo.bSbmEn == CVI_TRUE) { + cvi_VENC_SBM_IrqEnable(); + } + + return ret; +} + +static int cviCheckSuperFrame(stTestEncoder *pTestEnc) +{ + EncOutputInfo *pOutputInfo = &pTestEnc->outputInfo; + unsigned int currFrmBits = pOutputInfo->bitstreamSize << 3; + cviEncCfg *pCviEc = &pTestEnc->encConfig.cviEc; + stRcInfo *pRcInfo = &pTestEnc->handle->rcInfo; + int isSuperFrame = 0; + + if (pCviEc->originPicType == PIC_TYPE_MAX) + pCviEc->originPicType = pOutputInfo->picType; + + if (pCviEc->originPicType == PIC_TYPE_I || + pCviEc->originPicType == PIC_TYPE_IDR) { + CVI_VC_FLOW("currFrmBits = %d, SuperIFrmBitsThr = %d\n", + currFrmBits, pCviEc->u32SuperIFrmBitsThr); + + if (currFrmBits > pCviEc->u32SuperIFrmBitsThr) { + isSuperFrame = TE_ERR_ENC_IS_SUPER_FRAME; + pRcInfo->s32SuperFrmBitsThr = + (int)pCviEc->u32SuperIFrmBitsThr; + } + } else if (pCviEc->originPicType == PIC_TYPE_P) { + CVI_VC_FLOW("currFrmBits = %d, SuperPFrmBitsThr = %d\n", + currFrmBits, pCviEc->u32SuperPFrmBitsThr); + + if (currFrmBits > pCviEc->u32SuperPFrmBitsThr) { + isSuperFrame = TE_ERR_ENC_IS_SUPER_FRAME; + pRcInfo->s32SuperFrmBitsThr = + (int)pCviEc->u32SuperPFrmBitsThr; + } + } + + return isSuperFrame; +} + +static int cviProcessSuperFrame(stTestEncoder *pTestEnc, + cviVEncStreamInfo *pStreamInfo, int s32MilliSec) +{ + cviEncCfg *pCviEc = &pTestEnc->encConfig.cviEc; + stRcInfo *pRcInfo = &pTestEnc->handle->rcInfo; + int currReEncodeTimes = 0; + int ret = 0; + + pRcInfo->isReEncodeIdr = 1; + + while (currReEncodeTimes++ < pCviEc->s32MaxReEncodeTimes) { + ret = cviReEncodeIDR(pTestEnc, pStreamInfo, s32MilliSec); + if (ret != TE_ERR_ENC_IS_SUPER_FRAME) + break; + } + + if (ret == TE_ERR_ENC_IS_SUPER_FRAME) { + CVI_VC_FLOW("only re-Enccode IDR %d time\n", + pCviEc->s32MaxReEncodeTimes); + ret = 0; + } + + pRcInfo->isReEncodeIdr = 0; + CVI_VC_FLOW("re-Enccode IDR %d time\n", pCviEc->s32MaxReEncodeTimes); + + return ret; +} + +static int cviReEncodeIDR(stTestEncoder *pTestEnc, + cviVEncStreamInfo *pStreamInfo, int s32MilliSec) +{ + EncOpenParam *pEncOP = &pTestEnc->encOP; + cviEncOnePicCfg picCfg, *pPicCfg = &picCfg; + int ret = 0; + int totalPacks = 0; + stPack *pPack; + + CVI_VC_FLOW("\n"); + + pPicCfg->addrY = pTestEnc->yuvAddr.addrY; + pPicCfg->addrCb = pTestEnc->yuvAddr.addrCb; + pPicCfg->addrCr = pTestEnc->yuvAddr.addrCr; + + pPicCfg->phyAddrY = pTestEnc->yuvAddr.phyAddrY; + pPicCfg->phyAddrCb = pTestEnc->yuvAddr.phyAddrCb; + pPicCfg->phyAddrCr = pTestEnc->yuvAddr.phyAddrCr; + + pPicCfg->stride = pTestEnc->srcFrameStride; + pPicCfg->cbcrInterleave = pEncOP->cbcrInterleave; + pPicCfg->nv21 = pEncOP->nv21; + pPicCfg->picMotionLevel = pEncOP->picMotionLevel; + pPicCfg->picMotionMap = pEncOP->picMotionMap; + pPicCfg->picMotionMapSize = pEncOP->picMotionMapSize; + + pTestEnc->encParam.idr_request = TRUE; + + MUTEX_LOCK(&pStreamInfo->psp->packMutex); + // only drop latest super frame + totalPacks = pStreamInfo->psp->totalPacks; + if (totalPacks >= 1) { + pPack = &(pStreamInfo->psp->pack[totalPacks-1]); + if (pPack) { + pPack->bUsed = TRUE; + } + + // I frame need drop vps/sps/pps + if (pPack->cviNalType == NAL_I || pPack->cviNalType == NAL_IDR) { + // h265 idr include vps/sps/pps + if (totalPacks >= 4 && pStreamInfo->psp->pack[totalPacks-2].cviNalType == NAL_PPS + && pStreamInfo->psp->pack[totalPacks-3].cviNalType == NAL_SPS + && pStreamInfo->psp->pack[totalPacks-4].cviNalType == NAL_VPS) { + pStreamInfo->psp->pack[totalPacks-2].bUsed = true; + pStreamInfo->psp->pack[totalPacks-3].bUsed = true; + pStreamInfo->psp->pack[totalPacks-4].bUsed = true; + } + + // h264 idr include sps/pps + if (totalPacks >= 3 + && pStreamInfo->psp->pack[totalPacks-2].cviNalType == NAL_PPS + && pStreamInfo->psp->pack[totalPacks-3].cviNalType == NAL_SPS) { + pStreamInfo->psp->pack[totalPacks-2].bUsed = true; + pStreamInfo->psp->pack[totalPacks-3].bUsed = true; + } + } + } + MUTEX_UNLOCK(&pStreamInfo->psp->packMutex); + + ret = cviVEncReleaseStream((void *)pTestEnc, pStreamInfo); + if (ret) { + CVI_VC_ERR("cviVEncReleaseStream, %d\n", ret); + return ret; + } + + ret = cviVEncEncOnePic((void *)pTestEnc, pPicCfg, 20000); + if (ret != 0) { + CVI_VC_ERR("cviVEncEncOnePic, %d\n", ret); + return ret; + } + + ret = cviGetOneStream((void *)pTestEnc, pStreamInfo, s32MilliSec); + if (ret != 0 && ret != TE_ERR_ENC_IS_SUPER_FRAME) { + CVI_VC_ERR("cviGetOneStream, %d\n", ret); + return ret; + } + + return ret; +} + +int cviVEncReleaseStream(void *handle, cviVEncStreamInfo *pStreamInfo) +{ + stTestEncoder *pTestEnc = (stTestEncoder *)handle; + cviEncCfg *pCviEc = &pTestEnc->encConfig.cviEc; + stStreamPack *psp = pStreamInfo->psp; + stPack *pPack; + int ret = 0; + int idx; + int j = 0; + int usedCnt = 0; + + CVI_VC_IF("\n"); + + MUTEX_LOCK(&psp->packMutex); + if (psp->totalPacks) { + for (idx = 0; idx < psp->totalPacks; idx++) { + pPack = &psp->pack[idx]; + + if (pPack->bUsed) { + if (pPack->addr && pPack->need_free) { + if (pPack->cviNalType >= NAL_I && pPack->cviNalType <= NAL_IDR) { + osal_ion_free(pPack->addr); + } else { + osal_kfree(pPack->addr); + } + pPack->addr = NULL; + } + pPack->len = 0; + pPack->bUsed = CVI_FALSE; + usedCnt++; + } + } + psp->totalPacks -= usedCnt; + } + if (psp->totalPacks) { + for (idx = 0; idx < MAX_NUM_PACKS; idx++) { + pPack = &psp->pack[idx]; + if (pPack->len && !pPack->bUsed && pPack->addr) { + memcpy(&psp->pack[j], pPack, sizeof(stPack)); + j++; + } + } + } + MUTEX_UNLOCK(&psp->packMutex); + + ret = cviCheckEncodeEnd(pTestEnc); + if (ret == TE_STA_ENC_BREAK) { + CVI_VC_INFO("TE_STA_ENC_BREAK\n"); + } + + // if sharing es buffer, to unlock when releasing frame + if (pCviEc->bSingleEsBuf) { + LeaveVcodecLock(pTestEnc->coreIdx); + } + + return ret; +} + +static int cviVEncSetRequestIDR(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + + UNREFERENCED_PARAMETER(arg); + + CVI_VC_IF("\n"); + + pTestEnc->encParam.idr_request = TRUE; + + return ret; +} + +int _cviVencCalculateBufInfo(stTestEncoder *pTestEnc, int *butcnt, int *bufsize) +{ + int FrameBufSize; + int framebufStride = 0; + + if (pTestEnc->bIsEncoderInited == false) { + CVI_VC_ERR("\n"); + return TE_ERR_ENC_INIT; + } + + // reference frame + // calculate stride / size / apply variable + framebufStride = + CalcStride(pTestEnc->framebufWidth, pTestEnc->framebufHeight, + pTestEnc->encOP.srcFormat, + pTestEnc->encOP.cbcrInterleave, + (TiledMapType)(pTestEnc->encConfig.mapType & 0x0f), + FALSE, FALSE); + FrameBufSize = VPU_GetFrameBufSize( + pTestEnc->encConfig.coreIdx, framebufStride, + pTestEnc->framebufHeight, + (TiledMapType)(pTestEnc->encConfig.mapType & 0x0f), + pTestEnc->encOP.srcFormat, pTestEnc->encOP.cbcrInterleave, + NULL); + + pTestEnc->regFrameBufCount = pTestEnc->initialInfo.minFrameBufferCount; + *butcnt = pTestEnc->regFrameBufCount; + *bufsize = FrameBufSize; + + return 0; +} + +static int cviVEncGetVbInfo(stTestEncoder *pTestENC, void *arg) +{ + int ret = 0; + cviVbVencBufConfig *pcviVbVencCfg = (cviVbVencBufConfig *)arg; + + CVI_VC_IF("\n"); + + ret = _cviVencCalculateBufInfo(pTestENC, + &pcviVbVencCfg->VbGetFrameBufCnt, + &pcviVbVencCfg->VbGetFrameBufSize); + + return ret; +} + +static int cviVEncSetVbBuffer(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + cviVbVencBufConfig *pcviVbVencCfg = (cviVbVencBufConfig *)arg; + + CVI_VC_IF("\n"); + + CVI_VC_TRACE("[Before]cviVEncSetVbBuffer type[%d][%d] [%d]\n", + pcviVbVencCfg->VbType, pcviVbVencCfg->VbSetFrameBufCnt, + pcviVbVencCfg->VbSetFrameBufSize); + + memcpy(&pTestEnc->encConfig.cviEc.VbBufCfg, pcviVbVencCfg, + sizeof(cviVbVencBufConfig)); + + CVI_VC_TRACE( + "[After MW Venc]cviVEncSetVbBuffer again type[%d][%d] [%d]\n", + pTestEnc->encConfig.cviEc.VbBufCfg.VbType, + pTestEnc->encConfig.cviEc.VbBufCfg.VbSetFrameBufCnt, + pTestEnc->encConfig.cviEc.VbBufCfg.VbSetFrameBufSize); + + return ret; +} + +static int cviVEncRegReconBuf(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + int core_idx = + pTestEnc->encConfig.stdMode == STD_AVC ? CORE_H264 : CORE_H265; + + UNREFERENCED_PARAMETER(arg); + + CVI_VC_IF("\n"); + + EnterVcodecLock(core_idx); + + ret = _cviVEncRegFrameBuffer(pTestEnc, arg); + + LeaveVcodecLock(core_idx); + + return ret; +} + +static int _cviVEncRegFrameBuffer(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + int coreIdx; + int FrameBufSize; + int framebufStride = 0; + FrameBufferAllocInfo *pFbAllocInfo = &pTestEnc->fbAllocInfo; + cviEncCfg *pcviEc = &pTestEnc->encConfig.cviEc; + EncOpenParam *pEncOP = &pTestEnc->encOP; + int i, mapType; + CodecInst *pCodecInst = pTestEnc->handle; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + UNREFERENCED_PARAMETER(arg); + + coreIdx = pTestEnc->encConfig.coreIdx; + + /* Allocate framebuffers */ + framebufStride = + CalcStride(pTestEnc->framebufWidth, pTestEnc->framebufHeight, + pTestEnc->encOP.srcFormat, + pTestEnc->encOP.cbcrInterleave, + (TiledMapType)(pTestEnc->encConfig.mapType & 0x0f), + FALSE, FALSE); + FrameBufSize = VPU_GetFrameBufSize( + pTestEnc->encConfig.coreIdx, framebufStride, + pTestEnc->framebufHeight, + (TiledMapType)(pTestEnc->encConfig.mapType & 0x0f), + pTestEnc->encOP.srcFormat, pTestEnc->encOP.cbcrInterleave, + NULL); + pTestEnc->regFrameBufCount = pTestEnc->initialInfo.minFrameBufferCount; + + CVI_VC_TRACE( + "framebufWidth = %d, framebufHeight = %d, framebufStride = %d\n", + pTestEnc->framebufWidth, pTestEnc->framebufHeight, + framebufStride); + CVI_VC_MEM("FrameBufSize = 0x%X, regFrameBufCount = %d\n", FrameBufSize, + pTestEnc->regFrameBufCount); + + if (pEncOP->addrRemapEn) + pcviEc->singleLumaBuf = 0; + + pCodecInst->CodecInfo->encInfo.singleLumaBuf = pcviEc->singleLumaBuf; + + if (pcviEc->singleLumaBuf > 0) { + int ber, aft; + int luma_size, chr_size; + int productId; + + productId = ProductVpuGetId(coreIdx); + luma_size = CalcLumaSize( + productId, framebufStride, pTestEnc->framebufHeight, + pTestEnc->encOP.cbcrInterleave, + (TiledMapType)(pTestEnc->encConfig.mapType & 0x0f), + NULL); + + chr_size = CalcChromaSize( + productId, framebufStride, pTestEnc->framebufHeight, + pTestEnc->encOP.srcFormat, + pTestEnc->encOP.cbcrInterleave, + (TiledMapType)(pTestEnc->encConfig.mapType & 0x0f), + NULL); + + i = 0; + // smart-p case + if (pcviEc->virtualIPeriod > 0 && + pTestEnc->regFrameBufCount > 2) { + if (pcviEc->VbBufCfg.VbType == VB_SOURCE_TYPE_COMMON) { + for (i = 0; + i < (pTestEnc->regFrameBufCount - 2); + i++) { + pTestEnc->vbReconFrameBuf[i].size = + FrameBufSize; + + sprintf(ionName, + "VENC_%d_ReconFrameBuf", + pCodecInst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY( + coreIdx, + &pTestEnc->vbReconFrameBuf[i], + 0, ionName) < 0) { + CVI_VC_ERR( + "fail to allocate recon buffer\n"); + return TE_ERR_ENC_OPEN; + } + + pTestEnc->fbRecon[i].bufY = + pTestEnc->vbReconFrameBuf[i] + .phys_addr; + pTestEnc->fbRecon[i].bufCb = + (PhysicalAddress)-1; + pTestEnc->fbRecon[i].bufCr = + (PhysicalAddress)-1; + pTestEnc->fbRecon[i].size = + FrameBufSize; + pTestEnc->fbRecon[i].updateFbInfo = + TRUE; + } + } else { + for (i = 0; + i < (pTestEnc->regFrameBufCount - 2); + i++) { + int FrameBufSizeSet = + pcviEc->VbBufCfg + .VbSetFrameBufSize; + if (FrameBufSize > FrameBufSizeSet) { + CVI_VC_ERR( + "FrameBufSize > FrameBufSizeSet\n"); + return TE_ERR_ENC_OPEN; + } + + pTestEnc->vbReconFrameBuf[i].size = + FrameBufSizeSet; + pTestEnc->fbRecon[i].bufY = + pcviEc->VbBufCfg.vbModeAddr[i]; + pTestEnc->fbRecon[i].size = + FrameBufSizeSet; + } + } + } + + aft = i; + ber = aft + 1; + + if (pcviEc->VbBufCfg.VbType != VB_SOURCE_TYPE_COMMON) { + int FrameBufSizeSet = + pcviEc->VbBufCfg.VbSetFrameBufSize; + + CVI_VC_TRACE(" LumbBuf FrameBufSize[%d] set in[%d]\n", + FrameBufSize, FrameBufSizeSet); + if (FrameBufSize > FrameBufSizeSet) { + CVI_VC_ERR("FrameBufSize > FrameBufSizeSet\n"); + return TE_ERR_ENC_OPEN; + } + + pTestEnc->vbReconFrameBuf[ber].size = + FrameBufSizeSet + chr_size * 2; + pTestEnc->fbRecon[ber].bufY = + pcviEc->VbBufCfg.vbModeAddr[ber]; + pTestEnc->fbRecon[ber].size = FrameBufSizeSet; + } else { + pTestEnc->vbReconFrameBuf[ber].size = + FrameBufSize + chr_size * 2; + //pTestEnc->vbReconFrameBuf[1].size = FrameBufSize * 2; + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VENC_%d_ReconFrameBuf", + pCodecInst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, + &pTestEnc->vbReconFrameBuf[ber], + 0, ionName) < 0) { + CVI_VC_ERR("fail to allocate recon buffer\n"); + return TE_ERR_ENC_OPEN; + } + + pTestEnc->fbRecon[ber].bufY = + pTestEnc->vbReconFrameBuf[ber].phys_addr; + pTestEnc->fbRecon[ber].size = FrameBufSize; + } + pTestEnc->fbRecon[aft].bufY = pTestEnc->fbRecon[ber].bufY; + pTestEnc->fbRecon[ber].bufCb = + pTestEnc->fbRecon[aft].bufY + luma_size; + pTestEnc->fbRecon[ber].bufCr = + pTestEnc->fbRecon[ber].bufCb + chr_size; + pTestEnc->fbRecon[aft].bufCb = + pTestEnc->fbRecon[ber].bufCr + chr_size; + pTestEnc->fbRecon[aft].bufCr = + pTestEnc->fbRecon[aft].bufCb + chr_size; + + pTestEnc->fbRecon[ber].updateFbInfo = TRUE; + memcpy(&pTestEnc->vbReconFrameBuf[aft], + &pTestEnc->vbReconFrameBuf[ber], sizeof(vpu_buffer_t)); + pTestEnc->fbRecon[aft].size = pTestEnc->fbRecon[ber].size; + pTestEnc->fbRecon[aft].updateFbInfo = TRUE; + } else { + if (pcviEc->VbBufCfg.VbType == VB_SOURCE_TYPE_COMMON) { + + if (pEncOP->addrRemapEn) { + ret = cviInitAddrRemap(pTestEnc); + if (ret != 0) { + CVI_VC_ERR("cviInitAddrRemap\n"); + return ret; + } + } else { + for (i = 0; i < pTestEnc->regFrameBufCount; i++) { + pTestEnc->vbReconFrameBuf[i].size = + FrameBufSize; + + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VENC_%d_ReconFrameBuf", + pCodecInst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY( + coreIdx, + &pTestEnc->vbReconFrameBuf[i], 0, + ionName) < 0) { + CVI_VC_ERR( + "fail to allocate recon buffer\n"); + return TE_ERR_ENC_OPEN; + } + + pTestEnc->fbRecon[i].bufY = + pTestEnc->vbReconFrameBuf[i].phys_addr; + pTestEnc->fbRecon[i].bufCb = + (PhysicalAddress)-1; + pTestEnc->fbRecon[i].bufCr = + (PhysicalAddress)-1; + pTestEnc->fbRecon[i].size = FrameBufSize; + pTestEnc->fbRecon[i].updateFbInfo = TRUE; + } + } + } else { + CVI_VC_TRACE("pcviEc->VbBufCfg.VbType[%d]\n", + pcviEc->VbBufCfg.VbType); + CVI_VC_TRACE("bufcnt compare[%d][%d]\n", + pTestEnc->regFrameBufCount, + pcviEc->VbBufCfg.VbSetFrameBufCnt); + CVI_VC_TRACE("bufsize compare[%d][%d]\n", FrameBufSize, + pcviEc->VbBufCfg.VbSetFrameBufSize); + for (i = 0; i < pcviEc->VbBufCfg.VbSetFrameBufCnt; + i++) { + pTestEnc->vbReconFrameBuf[i].size = + pcviEc->VbBufCfg.VbSetFrameBufSize; + pTestEnc->fbRecon[i].bufY = + pcviEc->VbBufCfg.vbModeAddr[i]; + pTestEnc->fbRecon[i].bufCb = + (PhysicalAddress)-1; + pTestEnc->fbRecon[i].bufCr = + (PhysicalAddress)-1; + pTestEnc->fbRecon[i].size = + pcviEc->VbBufCfg.VbSetFrameBufSize; + pTestEnc->fbRecon[i].updateFbInfo = TRUE; + } + } + } + + mapType = (TiledMapType)(pTestEnc->encConfig.mapType & 0x0f); + + ret = VPU_EncRegisterFrameBuffer(pTestEnc->handle, pTestEnc->fbRecon, + pTestEnc->regFrameBufCount, + framebufStride, + pTestEnc->framebufHeight, mapType); + + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "VPU_EncRegisterFrameBuffer failed Error code is 0x%x\n", + ret); + return TE_ERR_ENC_OPEN; + } + + for (i = 0; i < pTestEnc->regFrameBufCount; i++) { + CVI_VC_INFO( + "Rec, bufY = 0x%llX, bufCb = 0x%llX, bufCr = 0x%llX\n", + pTestEnc->fbRecon[i].bufY, pTestEnc->fbRecon[i].bufCb, + pTestEnc->fbRecon[i].bufCr); + } + + /***************************** + * ALLOCATE SROUCE BUFFERS * + ****************************/ + if (pEncOP->bitstreamFormat == STD_AVC) { + if (pEncOP->linear2TiledEnable == TRUE) { + pFbAllocInfo->mapType = LINEAR_FRAME_MAP; + pFbAllocInfo->stride = pEncOP->picWidth; + } else { + pFbAllocInfo->mapType = mapType; + pFbAllocInfo->stride = + CalcStride(pEncOP->picWidth, pEncOP->picHeight, + pEncOP->srcFormat, + pEncOP->cbcrInterleave, mapType, + FALSE, FALSE); + } + + pFbAllocInfo->height = VPU_ALIGN16(pTestEnc->srcFrameHeight); + pFbAllocInfo->num = ENC_SRC_BUF_NUM; + + FrameBufSize = VPU_GetFrameBufSize( + coreIdx, pFbAllocInfo->stride, pFbAllocInfo->height, + pFbAllocInfo->mapType, pEncOP->srcFormat, + pEncOP->cbcrInterleave, NULL); + } else { + pFbAllocInfo->mapType = LINEAR_FRAME_MAP; + + pTestEnc->srcFrameStride = CalcStride( + pTestEnc->srcFrameWidth, pTestEnc->srcFrameHeight, + (FrameBufferFormat)pEncOP->srcFormat, + pTestEnc->encOP.cbcrInterleave, + (TiledMapType)pFbAllocInfo->mapType, FALSE, FALSE); + + FrameBufSize = VPU_GetFrameBufSize( + coreIdx, pTestEnc->srcFrameStride, + pTestEnc->srcFrameHeight, + (TiledMapType)pFbAllocInfo->mapType, pEncOP->srcFormat, + pTestEnc->encOP.cbcrInterleave, NULL); + + pFbAllocInfo->stride = pTestEnc->srcFrameStride; + pFbAllocInfo->height = pTestEnc->srcFrameHeight; + pFbAllocInfo->num = pTestEnc->initialInfo.minSrcFrameCount + + EXTRA_SRC_BUFFER_NUM; + pFbAllocInfo->num = (pFbAllocInfo->num > ENC_SRC_BUF_NUM) ? + ENC_SRC_BUF_NUM : + pFbAllocInfo->num; + } + + CVI_VC_TRACE("minSrcFrameCount = %d, num = %d, stride = %d\n", + pTestEnc->initialInfo.minSrcFrameCount, pFbAllocInfo->num, + pFbAllocInfo->stride); + + pFbAllocInfo->format = (FrameBufferFormat)pEncOP->srcFormat; + pFbAllocInfo->cbcrInterleave = pTestEnc->encOP.cbcrInterleave; + pFbAllocInfo->endian = pTestEnc->encOP.sourceEndian; + pFbAllocInfo->type = FB_TYPE_PPU; + pFbAllocInfo->nv21 = pTestEnc->encOP.nv21; + + if (pTestEnc->encConfig.cviApiMode == API_MODE_DRIVER || + pEncOP->bitstreamFormat == STD_AVC) { + for (i = 0; i < pFbAllocInfo->num; i++) { + #ifdef VC_DRIVER_TEST + if (pTestEnc->encConfig.cviApiMode == API_MODE_DRIVER) { + if (i == 0) { + CVI_VC_MEM( + "src FB, num = %d, cbcrInterleave = %d, nv21 = %d, FrameBufSize = 0x%X\n", + pFbAllocInfo->num, + pFbAllocInfo->cbcrInterleave, + pFbAllocInfo->nv21, + FrameBufSize); + } + + pTestEnc->vbSourceFrameBuf[i].size = + FrameBufSize; + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VENC_%d_SourceFrameBuf", + pCodecInst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY( + coreIdx, + &pTestEnc->vbSourceFrameBuf[i], 0, + ionName) < 0) { + CVI_VC_ERR( + "fail to allocate frame buffer, pFbAllocInfo->num %d\n", + pFbAllocInfo->num); + return TE_ERR_ENC_OPEN; + } + + vdi_clear_memory( + coreIdx, + pTestEnc->vbSourceFrameBuf[i].phys_addr, + FrameBufSize); + + pTestEnc->fbSrc[i].bufY = + pTestEnc->vbSourceFrameBuf[i].phys_addr; + pTestEnc->fbSrc[i].bufCb = (PhysicalAddress)-1; + pTestEnc->fbSrc[i].bufCr = (PhysicalAddress)-1; + } + #endif + pTestEnc->fbSrc[i].size = FrameBufSize; + pTestEnc->fbSrc[i].updateFbInfo = TRUE; + } + } + + ret = VPU_EncAllocateFrameBuffer(pTestEnc->handle, *pFbAllocInfo, + pTestEnc->fbSrc); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR( + "VPU_EncAllocateFrameBuffer fail to allocate source frame buffer is 0x%x\n", + ret); + return TE_ERR_ENC_OPEN; + } + + for (i = 0; i < pFbAllocInfo->num; i++) { + CVI_VC_TRACE( + "fbSrc[%d], bufY = 0x%llX, bufCb = 0x%llX, bufCr = 0x%llX\n", + i, pTestEnc->fbSrc[i].bufY, pTestEnc->fbSrc[i].bufCb, + pTestEnc->fbSrc[i].bufCr); + } + + if (pEncOP->bitstreamFormat == STD_HEVC) { + if (allocateRoiMapBuf(coreIdx, &pTestEnc->encConfig, + &pTestEnc->vbRoi[0], pFbAllocInfo->num, + MAX_CTU_NUM) == FALSE) { + CVI_VC_ERR("allocateRoiMapBuf fail\n"); + return TE_ERR_ENC_OPEN; + } + + if (allocateCtuQpMapBuf(coreIdx, &pTestEnc->encConfig, + &pTestEnc->vbCtuQp[0], + pFbAllocInfo->num, + MAX_CTU_NUM) == FALSE) { + CVI_VC_ERR("allocateCtuQpMapBuf fail\n"); + return TE_ERR_ENC_OPEN; + } + } + + // allocate User data buffer amount of source buffer num + if (pTestEnc->encConfig.seiDataEnc.prefixSeiNalEnable) { + for (i = 0; i < pFbAllocInfo->num; i++) { // the number of roi + // buffer should be + // the same as source + // buffer num. + pTestEnc->vbPrefixSeiNal[i].size = + SEI_NAL_DATA_BUF_SIZE; + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VENC_%d_PrefixSeiNal", + pCodecInst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, + &pTestEnc->vbPrefixSeiNal[i], 0, + ionName) < 0) { + CVI_VC_ERR("fail to allocate ROI buffer\n"); + return TE_ERR_ENC_OPEN; + } + } + } + + if (pTestEnc->encConfig.seiDataEnc.suffixSeiNalEnable) { + for (i = 0; i < pFbAllocInfo->num; i++) { // the number of roi + // buffer should be + // the same as source + // buffer num. + pTestEnc->vbSuffixSeiNal[i].size = + SEI_NAL_DATA_BUF_SIZE; + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VENC_%d_SuffixSeiNal", + pCodecInst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, + &pTestEnc->vbSuffixSeiNal[i], 0, + ionName) < 0) { + CVI_VC_ERR("fail to allocate ROI buffer\n"); + return TE_ERR_ENC_OPEN; + } + } + } + +#ifdef TEST_ENCODE_CUSTOM_HEADER + if (allocateSeiNalDataBuf(coreIdx, &pTestEnc->vbSeiNal[0], + pFbAllocInfo->num) == FALSE) { + CVI_VC_ERR("\n"); + return TE_ERR_ENC_OPEN; + } +#endif + + return ret; +} + +static int cviVEncSetInPixelFormat(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + EncOpenParam *pEncOP = &pTestEnc->encOP; + cviInPixelFormat *pInFormat = (cviInPixelFormat *)arg; + + CVI_VC_IF("\n"); + + pEncOP->cbcrInterleave = pInFormat->bCbCrInterleave; + pEncOP->nv21 = pInFormat->bNV21; + + if (pEncOP->bitstreamFormat == STD_AVC) { + if (pEncOP->cbcrInterleave == true) { + pEncCfg->mapType = TILED_FRAME_MB_RASTER_MAP; + pEncCfg->coda9.enableLinear2Tiled = TRUE; + pEncCfg->coda9.linear2TiledMode = FF_FRAME; + } + } + + return ret; +} + +static int cviVEncSetFrameParam(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + + cviFrameParam *pfp = (cviFrameParam *)arg; + EncParam *pEncParam = &pTestEnc->encParam; + + pEncParam->u32FrameQp = pfp->u32FrameQp; + pEncParam->u32FrameBits = pfp->u32FrameBits; + CVI_VC_UBR("u32FrameQp = %d, u32FrameBits = %d\n", + pEncParam->u32FrameQp, pEncParam->u32FrameBits); + + return ret; +} + +static int cviVEncCalcFrameParam(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + /* + This API is only used for testing UBR. It will use rcLib to + do CBR and get Qp & target bits. + Then these parameters will be sent to encoder by using UBR API. + */ + + cviFrameParam *pfp = (cviFrameParam *)arg; + CodecInst *pCodecInst = (CodecInst *)pTestEnc->handle; + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + EncOpenParam *pOpenParam = &pEncInfo->openParam; + int s32RowMaxDqpMinus, s32RowMaxDqpPlus; + int s32HrdBufLevel, s32HrdBufSize; + + pCodecInst->rcInfo.bTestUbrEn = 1; + + if (pOpenParam->bitstreamFormat == STD_HEVC && + pTestEnc->frameIdx == 0) { + rcLibSetupRc(pCodecInst); + } + + ret = rcLibCalcPicQp(pCodecInst, +#ifdef CLIP_PIC_DELTA_QP + &s32RowMaxDqpMinus, &s32RowMaxDqpPlus, +#endif + (int *)&pfp->u32FrameQp, (int *)&pfp->u32FrameBits, + &s32HrdBufLevel, &s32HrdBufSize); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("ret = %d\n", ret); + return ret; + } + pTestEnc->encParam.s32HrdBufLevel = s32HrdBufLevel; + + CVI_VC_UBR("fidx = %d, Qp = %d, Bits = %d\n", pTestEnc->frameIdx, + pfp->u32FrameQp, pfp->u32FrameBits); + + return ret; +} + +static CVI_S32 cviSetSbSetting(cviVencSbSetting *pstSbSetting) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + CVI_U32 srcHeightAlign = 0; + int reg = 0; + + CVI_VC_INFO("\n"); + + // Set Register 0x0 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x00); + reg &= ~0xFF00FFF0; + + // sb_nb:3, sbc1_mode:2, //sbc1_frm_start:1 + if (pstSbSetting->codec & 0x1) + reg |= (pstSbSetting->sb_mode << 4); + + if (pstSbSetting->codec & 0x2) + reg |= (pstSbSetting->sb_mode << 8); + + if (pstSbSetting->codec & 0x4) + reg |= (pstSbSetting->sb_mode << 12); + + reg |= (pstSbSetting->sb_size << 17); + reg |= (pstSbSetting->sb_nb << 24); + + if ((pstSbSetting->sb_ybase1 != 0) && (pstSbSetting->sb_uvbase1 != 0)) + reg |= (1<<19); // 1: sbc0/sbc1 sync with interface0 and sbc2 sync with interface1 + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x00 = 0x%x\n", reg); + + // pri interface + if ((pstSbSetting->sb_ybase != 0) && (pstSbSetting->sb_uvbase != 0)) { + // pri address setting ///////////////////////////////////////////// + // Set Register 0x20 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x20); + reg = ((pstSbSetting->src_height + 63) >> 6) << 22; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x20, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x20 = 0x%x\n", reg); + + // Set Register 0x24 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x24); + reg = ((pstSbSetting->y_stride>>4)<<4) + ((pstSbSetting->uv_stride>>4)<<20); + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x24, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x24 = 0x%x\n", reg); + + // Set Register 0x28 src y base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x28); + reg = 0x80000000; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x28, reg); + pstSbSetting->src_ybase = reg; + + CVI_VC_INFO("psbSetting->src_ybase = 0x%x\n", pstSbSetting->src_ybase); + CVI_VC_INFO("VC_REG_BANK_SBM 0x28 = 0x%x\n", reg); + + // Set Register 0x2C src y end addr + srcHeightAlign = ((pstSbSetting->src_height + 15)>>4)<<4; + reg = 0x80000000 + srcHeightAlign*pstSbSetting->y_stride; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x2C, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x2C = 0x%x\n", reg); + + // Set Register 0x30 sb y base addr + reg = pstSbSetting->sb_ybase; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x30, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x30 = 0x%x\n", reg); + + // Set Register 0x34 src c base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x34); + reg = 0x88000000; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x34, reg); + pstSbSetting->src_uvbase = reg; + CVI_VC_INFO("VC_REG_BANK_SBM 0x34 = 0x%x\n", reg); + + // Set Register 0x38 src c end addr + reg = 0x88000000 + srcHeightAlign*pstSbSetting->y_stride/2; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x38, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x38 = 0x%x\n", reg); + + // Set Register 0x3C sb c base addr + reg = pstSbSetting->sb_uvbase; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x3C, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x3C = 0x%x\n", reg); + } + + // sec interface + if ((pstSbSetting->sb_ybase1 != 0) && (pstSbSetting->sb_uvbase1 != 0)) { + // sec address setting ///////////////////////////////////////////// + // Set Register 0x40 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x40); + reg = ((pstSbSetting->src_height + 63) >> 6) << 22; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x40, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x40 = 0x%x\n", reg); + + // Set Register 0x44 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x44); + reg = ((pstSbSetting->y_stride>>4)<<4) + ((pstSbSetting->uv_stride>>4)<<20); + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x44, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x44 = 0x%x\n", reg); + + // Set Register 0x48 src y base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x48); + reg = 0x90000000; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x48, reg); + pstSbSetting->src_ybase1 = reg; + + CVI_VC_INFO("psbSetting->src_ybase1 = 0x%x\n", pstSbSetting->src_ybase1); + CVI_VC_INFO("VC_REG_BANK_SBM 0x48 = 0x%x\n", reg); + + // Set Register 0x4C src y end addr + srcHeightAlign = ((pstSbSetting->src_height + 15)>>4)<<4; + reg = 0x90000000 + srcHeightAlign*pstSbSetting->y_stride; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x4C, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x4C = 0x%x\n", reg); + + // Set Register 0x50 sb y base addr + reg = pstSbSetting->sb_ybase1; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x50, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x50 = 0x%x\n", reg); + + // Set Register 0x54 src c base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x54); + reg = 0x98000000; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x54, reg); + pstSbSetting->src_uvbase1 = reg; + CVI_VC_INFO("VC_REG_BANK_SBM 0x54 = 0x%x\n", reg); + + // Set Register 0x58 src c end addr + reg = 0x98000000 + srcHeightAlign*pstSbSetting->y_stride/2; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x58, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x58 = 0x%x\n", reg); + + // Set Register 0x5C sb c base addr + reg = pstSbSetting->sb_uvbase1; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x5C, reg); + CVI_VC_INFO("VC_REG_BANK_SBM 0x5C = 0x%x\n", reg); + } + + return s32Ret; +} + +#if 0 +static int cviVEncSetSbMode(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + unsigned long coreIdx = 0; + unsigned int srcHeightAlign = 0; + int reg = 0; + cviVencSbSetting *psbSetting = (cviVencSbSetting *)arg; + + CVI_VC_IF("\n"); + UNREFERENCED_PARAMETER(pTestEnc); + + if (psbSetting->codec & 0x1) + coreIdx = 0; + else + coreIdx = 1; + + // Set Register 0x0 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x00); + + // sb_nb:3, sbc1_mode:2, //sbc1_frm_start:1 + if (psbSetting->codec & 0x1) + reg |= (psbSetting->sb_mode << 4); + + if (psbSetting->codec & 0x2) + reg |= (psbSetting->sb_mode << 8); + + if (psbSetting->codec & 0x4) + reg |= (psbSetting->sb_mode << 12); + + reg |= (psbSetting->sb_size << 17); + reg |= (psbSetting->sb_nb << 24); + + if ((psbSetting->sb_ybase1 != 0) && (psbSetting->sb_uvbase1 != 0)) + reg |= (1 + << 19); // 1: sbc0/sbc1 sync with interface0 and sbc2 sync with interface1 + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + + CVI_VC_REG("VC_REG_BANK_SBM 0x00 = 0x%x\n", reg); + + if ((psbSetting->sb_ybase != 0) && (psbSetting->sb_uvbase != 0)) { + // pri address setting ///////////////////////////////////////////// + // Set Register 0x20 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x20); + reg = ((psbSetting->src_height + 63) >> 6) << 22; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x20, reg); + + CVI_VC_REG("VC_REG_BANK_SBM 0x20 = 0x%x\n", reg); + + // Set Register 0x24 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x24); + reg = ((psbSetting->y_stride >> 4) << 4) + + ((psbSetting->uv_stride >> 4) << 20); + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x24, reg); + + CVI_VC_REG("VC_REG_BANK_SBM 0x24 = 0x%x\n", reg); + + // Set Register 0x28 src y base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x28); + reg = 0x80000000; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x28, reg); + psbSetting->src_ybase = reg; + + CVI_VC_INFO("VC_REG_BANK_SBM 0x28 = 0x%x\n", reg); + + // Set Register 0x2C src y end addr + srcHeightAlign = ((psbSetting->src_height + 15) >> 4) << 4; + reg = 0x80000000 + srcHeightAlign * psbSetting->y_stride; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x2C, reg); + CVI_VC_REG("VC_REG_BANK_SBM 0x2C = 0x%x\n", reg); + + // Set Register 0x30 sb y base addr + reg = psbSetting->sb_ybase; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x30, reg); + + CVI_VC_INFO("VC_REG_BANK_SBM 0x30 = 0x%x\n", reg); + + // Set Register 0x34 src c base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x34); + reg = 0x88000000; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x34, reg); + psbSetting->src_uvbase = reg; + + CVI_VC_REG("VC_REG_BANK_SBM 0x34 = 0x%x\n", reg); + + // Set Register 0x38 src c end addr + reg = 0x88000000 + srcHeightAlign * psbSetting->y_stride / 2; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x38, reg); + + CVI_VC_REG("VC_REG_BANK_SBM 0x38 = 0x%x\n", reg); + + // Set Register 0x3C sb c base addr + reg = psbSetting->sb_uvbase; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x3C, reg); + + CVI_VC_REG("VC_REG_BANK_SBM 0x3C = 0x%x\n", reg); + } + + if ((psbSetting->sb_ybase1 != 0) && (psbSetting->sb_uvbase1 != 0)) { + // sec address setting ///////////////////////////////////////////// + // Set Register 0x40 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x40); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x40, reg); + + reg = ((psbSetting->src_height + 63) >> 6) << 22; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x40, reg); + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x40); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x40, reg); + + // Set Register 0x44 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x44); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x44, reg); + + reg = ((psbSetting->y_stride >> 4) << 4) + + ((psbSetting->uv_stride >> 4) << 20); + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x44, reg); + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x44); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x44, reg); + + // Set Register 0x48 src y base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x48); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x48, reg); + + reg = 0x90000000; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x48, reg); + psbSetting->src_ybase1 = reg; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x48); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x48, reg); + + // Set Register 0x4C src y end addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x4C); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x4C, reg); + + srcHeightAlign = ((psbSetting->src_height + 15) >> 4) << 4; + CVI_VC_REG("[%s][%d] src_height=%d, srcHeightAlign=%d\n", + __func__, __LINE__, psbSetting->src_height, + srcHeightAlign); + reg = 0x90000000 + srcHeightAlign * psbSetting->y_stride; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x4C, reg); + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x4C); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x4C, reg); + + // Set Register 0x50 sb y base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x50); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x50, reg); + + reg = psbSetting->sb_ybase1; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x50, reg); + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x50); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x50, reg); + + // Set Register 0x54 src c base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x54); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x54, reg); + + reg = 0x98000000; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x54, reg); + psbSetting->src_uvbase1 = reg; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x54); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x54, reg); + + // Set Register 0x58 src c end addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x58); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x58, reg); + + reg = 0x98000000 + srcHeightAlign * psbSetting->y_stride / 2; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x58, reg); + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x58); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x58, reg); + + // Set Register 0x5C sb c base addr + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x5C); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x5C, reg); + + reg = psbSetting->sb_uvbase1; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x5C, reg); + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x5C); + CVI_VC_REG("[%s][%d] SBM Reg 0x%x = 0x%x\n", __func__, + __LINE__, 0x5C, reg); + } + + return ret; +} + +static int cviVEncStartSbMode(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + unsigned long coreIdx = 0; + cviVencSbSetting *psbSetting = (cviVencSbSetting *)arg; + int reg = 0; + + UNUSED(pTestEnc); + UNUSED(arg); + + if (psbSetting->codec & 0x1) + coreIdx = 0; + else + coreIdx = 1; + + // Set Register 0x0 + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x00); + + // frm_start:1 + if (psbSetting->codec & 0x1) + reg |= (1 << 7); + + if (psbSetting->codec & 0x2) + reg |= (1 << 11); + + if (psbSetting->codec & 0x4) + reg |= (1 << 15); + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + + CVI_VC_REG("VC_REG_BANK_SBM 0x00 = 0x%x\n", reg); + + return ret; +} + +static int cviVEncUpdateSbWptr(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + unsigned long coreIdx = 0; + int sw_mode = 0; + cviVencSbSetting *psbSetting = (cviVencSbSetting *)arg; + int reg = 0; + + UNUSED(pTestEnc); + + if (psbSetting->codec & 0x1) + coreIdx = 0; + else + coreIdx = 1; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x00); + + if (coreIdx == 0) + sw_mode = (reg & 0x30) >> 4; + else + sw_mode = (reg & 0x300) >> 8; + + if (sw_mode == 3) { // SW mode + // Set Register 0x0c + int wptr = 0; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x88); + CVI_VC_INFO("VC_REG_BANK_SBM 0x88 = 0x%x\n", reg); + + wptr = (reg >> 16) & 0x1F; + + CVI_VC_INFO("wptr = 0x%x\n", reg); + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x0C); + reg = (reg & 0xFFFFFFE0) | wptr; + + cvi_vc_drv_write_vc_reg(REG_SBM, 0x0C, reg); + + CVI_VC_INFO("VC_REG_BANK_SBM 0x0C = 0x%x\n", reg); + } + + return ret; +} + +static int cviVEncResetSb(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + unsigned long coreIdx = 0; + cviVencSbSetting *psbSetting = (cviVencSbSetting *)arg; + int reg = 0; + UNUSED(pTestEnc); + + CVI_VC_FLOW("\n"); + + if (psbSetting->codec & 0x1) + coreIdx = 0; + else + coreIdx = 1; + + CVI_VC_INFO("Before sw reset sb =================\n"); + CVI_VC_INFO("VC_REG_BANK_SBM 0x80 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x80)); + CVI_VC_INFO("VC_REG_BANK_SBM 0x84 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x84)); + CVI_VC_INFO("VC_REG_BANK_SBM 0x88 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x88)); + CVI_VC_INFO("VC_REG_BANK_SBM 0x90 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x90)); + CVI_VC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x94)); + + // Reset VC SB ctrl + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x00); +#if 0 + reg |= 0x8; // reset all + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); +#else + if (psbSetting->codec & 0x1) { // h265 + reg |= 0x1; + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + } else if (psbSetting->codec & 0x2) { // h264 + reg |= 0x2; + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + } else { // jpeg + reg |= 0x4; + cvi_vc_drv_write_vc_reg(REG_SBM, 0x00, reg); + } +#endif + + CVI_VC_INFO("After sw reset sb =================\n"); + CVI_VC_INFO("VC_REG_BANK_SBM 0x80 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x80)); + CVI_VC_INFO("VC_REG_BANK_SBM 0x84 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x84)); + CVI_VC_INFO("VC_REG_BANK_SBM 0x88 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x88)); + CVI_VC_INFO("VC_REG_BANK_SBM 0x90 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x90)); + CVI_VC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x94)); + + return ret; +} + +static int cviVEncSbEnDummyPush(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + unsigned long coreIdx = 0; + cviVencSbSetting *psbSetting = (cviVencSbSetting *)arg; + int reg = 0; + UNUSED(pTestEnc); + + CVI_VC_FLOW("\n"); + + if (psbSetting->codec & 0x1) + coreIdx = 0; + else + coreIdx = 1; + + // Enable sb dummy push + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x14); + reg |= 0x1; // reg_pri_push_ow_en bit0 + cvi_vc_drv_write_vc_reg(REG_SBM, 0x14, reg); + + CVI_VC_INFO("VC_REG_BANK_SBM 0x14 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x14)); + + return ret; +} + +static int cviVEncSbTrigDummyPush(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + unsigned long coreIdx = 0; + cviVencSbSetting *psbSetting = (cviVencSbSetting *)arg; + int reg = 0; + int pop_cnt_pri = 0; + int push_cnt_pri = 0; + UNUSED(pTestEnc); + + CVI_VC_FLOW("\n"); + + if (psbSetting->codec & 0x1) + coreIdx = 0; + else + coreIdx = 1; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x94); + CVI_VC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x\n", reg); + + push_cnt_pri = reg & 0x3F; + pop_cnt_pri = (reg >> 16) & 0x3F; + + CVI_VC_INFO("push_cnt_pri=%d, pop_cnt_pri=%d\n", push_cnt_pri, + pop_cnt_pri); + + if (push_cnt_pri == pop_cnt_pri) { + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x14); + reg |= 0x4; // reg_pri_push_ow bit2 + cvi_vc_drv_write_vc_reg(REG_SBM, 0x14, reg); + + CVI_VC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x94)); + } + + return ret; +} + +static int cviVEncSbDisDummyPush(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + unsigned long coreIdx = 0; + cviVencSbSetting *psbSetting = (cviVencSbSetting *)arg; + int reg = 0; + + UNUSED(pTestEnc); + + CVI_VC_FLOW("\n"); + + if (psbSetting->codec & 0x1) + coreIdx = 0; + else + coreIdx = 1; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x14); + reg &= (~0x1); // reg_pri_push_ow_en bit0 + cvi_vc_drv_write_vc_reg(REG_SBM, 0x14, reg); + + CVI_VC_INFO("VC_REG_BANK_SBM 0x14 = 0x%x\n", + cvi_vc_drv_read_vc_reg(REG_SBM, 0x14)); + + return ret; +} + +static int cviVEncSbGetSkipFrmStatus(stTestEncoder *pTestEnc, void *arg) +{ + int ret = 0; + unsigned long coreIdx = 0; + cviVencSbSetting *psbSetting = (cviVencSbSetting *)arg; + int reg = 0; + int pop_cnt_pri = 0; + int push_cnt_pri = 0; + int target_slice_cnt = 0; + UNUSED(pTestEnc); + + CVI_VC_FLOW("\n"); + + if (psbSetting->codec & 0x1) + coreIdx = 0; + else + coreIdx = 1; + + reg = cvi_vc_drv_read_vc_reg(REG_SBM, 0x94); + CVI_VC_INFO("VC_REG_BANK_SBM 0x94 = 0x%x\n", reg); + + push_cnt_pri = reg & 0x3F; + pop_cnt_pri = (reg >> 16) & 0x3F; + + CVI_VC_INFO("push_cnt_pri=%d, pop_cnt_pri=%d\n", push_cnt_pri, + pop_cnt_pri); + + if (psbSetting->sb_size == 0) + target_slice_cnt = (psbSetting->src_height + 63) / 64; + else + target_slice_cnt = (psbSetting->src_height + 127) / 128; + + CVI_VC_INFO( + "psbSetting->src_height=%d, psbSetting->sb_size=%d, target_slice_cnt=%d\n", + psbSetting->src_height, + psbSetting->sb_size, target_slice_cnt); + + if (pop_cnt_pri == target_slice_cnt) { + psbSetting->status = 1; + + CVI_VC_INFO( + "psbSetting->src_height=%d, psbSetting->sb_size=%d, target_slice_cnt=%d\n", + psbSetting->src_height, + psbSetting->sb_size, target_slice_cnt); + } + + return ret; +} +#endif + +static int cviVEncWaitEncodeDone(stTestEncoder *pTestEnc, void *arg) +{ + + int ret = RETCODE_SUCCESS; + + ret = wait_for_completion_timeout(&pTestEnc->semEncDoneCmd, + usecs_to_jiffies(2000 * 1000)); + if (ret == 0) { + CVI_VC_WARN("get stream timeout!\n"); + return RET_VCODEC_TIMEOUT; + } + + return 0; +} + +static int cviVEncSetSbmEnable(stTestEncoder *pTestEnc, void *arg) +{ + CodecInst *pCodecInst; + + if (!pTestEnc) + return -1; + + pCodecInst = pTestEnc->handle; + if (pCodecInst == NULL || pCodecInst->CodecInfo == NULL) + return -1; + + pCodecInst->CodecInfo->encInfo.bSbmEn = *(bool *)arg; + + return 0; +} + +static int cviVEncEncodeUserData(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviUserData *pSrc = (cviUserData *)arg; + unsigned int len; + UserDataList *userdataNode; + + CVI_VC_IF("\n"); + + if (pSrc == NULL || pSrc->userData == NULL || pSrc->len == 0) { + CVI_VC_ERR("no user data\n"); + return TE_ERR_ENC_USER_DATA; + } + + userdataNode = (UserDataList *)osal_malloc(sizeof(UserDataList)); + if (userdataNode == NULL) + return TE_ERR_ENC_USER_DATA; + + userdataNode->userDataBuf = (Uint8 *)osal_malloc(pEncCfg->userDataBufSize); + if (userdataNode->userDataBuf == NULL) { + osal_free(userdataNode); + return TE_ERR_ENC_USER_DATA; + } + + len = seiEncode(pEncCfg->stdMode, pSrc->userData, + pSrc->len, userdataNode->userDataBuf, pEncCfg->userDataBufSize); + + if (len > pEncCfg->userDataBufSize) { + CVI_VC_ERR( + "encoded user data len %d exceeds buffer size %d\n", + len, pEncCfg->userDataBufSize); + osal_free(userdataNode); + osal_free(userdataNode->userDataBuf); + return TE_ERR_ENC_USER_DATA; + } + + userdataNode->userDataLen = len; + list_add_tail(&userdataNode->list, &pEncCfg->userdataList); + + return 0; +} + +static int cviVEncSetH264Entropy(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH264Entropy *pEntropy = &pEncCfg->cviEc.h264Entropy; + cviH264Entropy *pSrc = (cviH264Entropy *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h264 entropy data\n"); + return TE_ERR_ENC_H264_ENTROPY; + } + + memcpy(pEntropy, pSrc, sizeof(cviH264Entropy)); + return 0; +} + +static int cviVEncSetH264Trans(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH264Trans *pTrans = &pEncCfg->cviEc.h264Trans; + cviH264Trans *pSrc = (cviH264Trans *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h264 trans data\n"); + return TE_ERR_ENC_H264_TRANS; + } + + memcpy(pTrans, pSrc, sizeof(cviH264Trans)); + return 0; +} + +static int cviVEncSetH265Trans(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH265Trans *pTrans = &pEncCfg->cviEc.h265Trans; + cviH265Trans *pSrc = (cviH265Trans *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h265 trans data\n"); + return TE_ERR_ENC_H265_TRANS; + } + + memcpy(pTrans, pSrc, sizeof(cviH265Trans)); + return 0; +} + +static int cviVEncSetH264Vui(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH264Vui *pVui = &pEncCfg->cviEc.h264Vui; + cviH264Vui *pSrc = (cviH264Vui *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h264 vui data\n"); + return TE_ERR_ENC_H264_VUI; + } + + memcpy(pVui, pSrc, sizeof(cviH264Vui)); + return 0; +} + +static int cviVEncSetH265Vui(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH265Vui *pVui = &pEncCfg->cviEc.h265Vui; + cviH265Vui *pSrc = (cviH265Vui *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h265 vui data\n"); + return TE_ERR_ENC_H265_VUI; + } + + memcpy(pVui, pSrc, sizeof(cviH265Vui)); + return 0; +} + +static int cviVEncSetH264Split(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH264Split *pSplit = &pEncCfg->cviEc.h264Split; + cviH264Split *pSrc = (cviH264Split *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h264 split data\n"); + return TE_ERR_ENC_H264_SPLIT; + } + + memcpy(pSplit, pSrc, sizeof(cviH264Split)); + return 0; +} + +static int cviVEncSetH265Split(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH265Split *pSplit = &pEncCfg->cviEc.h265Split; + cviH265Split *pSrc = (cviH265Split *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h265 split data\n"); + return TE_ERR_ENC_H265_SPLIT; + } + + memcpy(pSplit, pSrc, sizeof(cviH265Split)); + return 0; +} + +static int cviVEncSetH264IntraPred(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH264IntraPred *pIntraPred = &pEncCfg->cviEc.h264IntraPred; + cviH264IntraPred *pSrc = (cviH264IntraPred *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h264 intra pred data\n"); + return TE_ERR_ENC_H264_INTRA_PRED; + } + + memcpy(pIntraPred, pSrc, sizeof(cviH264IntraPred)); + return 0; +} + +static int cviVEncSetRc(stTestEncoder *pTestEnc, void *arg) +{ + cviRcParam *prcp = (cviRcParam *)arg; + TestEncConfig *pEncConfig = &pTestEnc->encConfig; + cviEncCfg *pCviEc = &pEncConfig->cviEc; + int ret = 0; + + CVI_VC_IF("\n"); + + pCviEc->u32RowQpDelta = prcp->u32RowQpDelta; + pCviEc->firstFrmstartQp = prcp->firstFrmstartQp; + pCviEc->initialDelay = prcp->s32InitialDelay; + pCviEc->u32ThrdLv = prcp->u32ThrdLv; + CVI_VC_CFG("firstFrmstartQp = %d, initialDelay = %d, u32ThrdLv = %d\n", + pCviEc->firstFrmstartQp, pCviEc->initialDelay, + pCviEc->u32ThrdLv); + + pEncConfig->changePos = prcp->s32ChangePos; + pCviEc->bBgEnhanceEn = prcp->bBgEnhanceEn; + pCviEc->s32BgDeltaQp = prcp->s32BgDeltaQp; + CVI_VC_CFG("s32ChangePos = %d, bBgEnhanceEn = %d, s32BgDeltaQp = %d\n", + prcp->s32ChangePos, pCviEc->bBgEnhanceEn, + pCviEc->s32BgDeltaQp); + + pCviEc->u32MaxIprop = prcp->u32MaxIprop; + pCviEc->u32MinIprop = prcp->u32MinIprop; + pCviEc->s32MaxReEncodeTimes = prcp->s32MaxReEncodeTimes; + CVI_VC_CFG( + "u32MaxIprop = %d, u32MinIprop = %d, s32MaxReEncodeTimes = %d\n", + pCviEc->u32MaxIprop, pCviEc->u32MinIprop, + pCviEc->s32MaxReEncodeTimes); + + pCviEc->u32MaxQp = prcp->u32MaxQp; + pCviEc->u32MaxIQp = prcp->u32MaxIQp; + pCviEc->u32MinQp = prcp->u32MinQp; + pCviEc->u32MinIQp = prcp->u32MinIQp; + CVI_VC_CFG( + "u32MaxQp = %d, u32MaxIQp = %d, u32MinQp = %d, u32MinIQp = %d\n", + pCviEc->u32MaxQp, pCviEc->u32MaxIQp, pCviEc->u32MinQp, + pCviEc->u32MinIQp); + + pCviEc->s32MinStillPercent = prcp->s32MinStillPercent; + pCviEc->u32MaxStillQP = prcp->u32MaxStillQP; + pCviEc->u32MotionSensitivity = prcp->u32MotionSensitivity; + CVI_VC_CFG("StillPercent = %d, StillQP = %d, MotionSensitivity = %d\n", + prcp->s32MinStillPercent, prcp->u32MaxStillQP, + prcp->u32MotionSensitivity); + + pCviEc->s32AvbrFrmLostOpen = prcp->s32AvbrFrmLostOpen; + pCviEc->s32AvbrFrmGap = prcp->s32AvbrFrmGap; + pCviEc->s32AvbrPureStillThr = prcp->s32AvbrPureStillThr; + CVI_VC_CFG("FrmLostOpen = %d, FrmGap = %d, PureStillThr = %d\n", + prcp->s32AvbrFrmLostOpen, prcp->s32AvbrFrmGap, + prcp->s32AvbrPureStillThr); + + return ret; +} + +static int cviVEncSetRef(stTestEncoder *pTestEnc, void *arg) +{ + unsigned int *tempLayer = (unsigned int *)arg; + int ret = 0; + + CVI_VC_IF("\n"); + pTestEnc->encConfig.tempLayer = *tempLayer; + + return ret; +} + +static int cviVEncSetPred(stTestEncoder *pTestEnc, void *arg) +{ + cviEncCfg *pCviEc = &pTestEnc->encConfig.cviEc; + cviPred *pPred = (cviPred *)arg; + + CVI_VC_IF("\n"); + + pCviEc->u32IntraCost = pPred->u32IntraCost; + + return 0; +} + +static int cviVEncSetRoi(stTestEncoder *pTestEnc, void *arg) +{ + cviRoiParam *proi = (cviRoiParam *)arg; + int ret = 0; + int index = proi->roi_index; + cviEncRoiCfg *pcviRoi = NULL; + + if (index >= 8 || index < 0) { + CVI_VC_ERR("Set ROI index = %d\n", index); + return -1; + } + + CVI_VC_IF("\n"); + if (pTestEnc->encOP.bitstreamFormat == STD_HEVC) + pTestEnc->encConfig.ctu_roiLevel_enable = 1; + + pcviRoi = &pTestEnc->encConfig.cviEc.cviRoi[index]; + pTestEnc->encConfig.cviEc.roi_request = TRUE; + pTestEnc->encConfig.roi_enable = TRUE; + pcviRoi->roi_enable = proi->roi_enable; + pcviRoi->roi_qp_mode = proi->roi_qp_mode; + pcviRoi->roi_qp = proi->roi_qp; + pcviRoi->roi_rect_x = proi->roi_rect_x; + pcviRoi->roi_rect_y = proi->roi_rect_y; + pcviRoi->roi_rect_width = proi->roi_rect_width; + pcviRoi->roi_rect_height = proi->roi_rect_height; + cviUpdateOneRoi(&pTestEnc->encParam, pcviRoi, index); + + CVI_VC_TRACE("cviVEncSetRoi [%d]enable %d, qp mode %d, qp %d\n", index, + proi->roi_enable, proi->roi_qp_mode, proi->roi_qp); + CVI_VC_TRACE("cviVEncSetRoi [%d]X:%d,Y:%d,W:%d,H:%d\n", index, + proi->roi_rect_x, proi->roi_rect_y, proi->roi_rect_width, + proi->roi_rect_height); + return ret; +} + +static int cviVEncGetRoi(stTestEncoder *pTestEnc, void *arg) +{ + cviRoiParam *proi = (cviRoiParam *)arg; + + int ret = 0; + int index = proi->roi_index; + const cviEncRoiCfg *pcviRoi = NULL; + + if (index >= 8 || index < 0) { + CVI_VC_ERR("Get ROI index = %d\n", index); + return -1; + } + + CVI_VC_IF("\n"); + + pcviRoi = &pTestEnc->encConfig.cviEc.cviRoi[index]; + + proi->roi_enable = pcviRoi->roi_enable; + proi->roi_qp_mode = pcviRoi->roi_qp_mode; + proi->roi_qp = pcviRoi->roi_qp; + proi->roi_rect_x = pcviRoi->roi_rect_x; + proi->roi_rect_y = pcviRoi->roi_rect_y; + proi->roi_rect_width = pcviRoi->roi_rect_width; + proi->roi_rect_height = pcviRoi->roi_rect_height; + + return ret; +} + +static int cviVEncStart(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncConfig = vmalloc(sizeof(TestEncConfig)); + int ret = 0; + int idx; + stStreamPack *psp; + stPack *pPack; + int core_idx = + pTestEnc->encConfig.stdMode == STD_AVC ? CORE_H264 : CORE_H265; + + UNREFERENCED_PARAMETER(arg); + + CVI_VC_IF("\n"); + + EnterVcodecLock(core_idx); + memcpy(pEncConfig, &pTestEnc->encConfig, sizeof(TestEncConfig)); + + if (cviInitEncoder(pTestEnc, pEncConfig) == NULL) { + ret = -1; + } + + psp = &pTestEnc->streamPack; + MUTEX_LOCK(&psp->packMutex); + if (psp->totalPacks) { + for (idx = 0; idx < psp->totalPacks; idx++) { + pPack = &psp->pack[idx]; + if (pPack->addr && pPack->need_free) { + if (pPack->cviNalType >= NAL_I && pPack->cviNalType <= NAL_IDR) { + osal_ion_free(pPack->addr); + } else { + osal_kfree(pPack->addr); + } + pPack->addr = NULL; + } + pPack->len = 0; + pPack->bUsed = CVI_FALSE; + } + psp->totalPacks = 0; + } + MUTEX_UNLOCK(&psp->packMutex); + pTestEnc->encParam.idr_request = TRUE; + + LeaveVcodecLock(core_idx); + + vfree(pEncConfig); + return ret; +} + +#if 0 +static int cviVEncOpGetFd(stTestEncoder *pTestEnc, void *arg) +{ + int *fd = (int *)arg; + int coreIdx = pTestEnc->coreIdx; + int ret = 0; + + CVI_VC_IF("\n"); + + *fd = cviVPU_GetFd(coreIdx); + + if (*fd < 0) { + CVI_VC_ERR("get-fd failed\n"); + *fd = -1; + ret = -1; + } + + CVI_VC_TRACE("fd = %d\n", *fd); + + return ret; +} +#endif + +static int cviVEncOpSetChnAttr(stTestEncoder *pTestEnc, void *arg) +{ + cviVidChnAttr *pChnAttr = (cviVidChnAttr *)arg; + int ret = 0; + unsigned int u32Sec = 0; + unsigned int u32Frm = 0; + + CVI_VC_IF("\n"); + + pTestEnc->encOP.bitRate = pChnAttr->u32BitRate; + + u32Sec = pChnAttr->fr32DstFrameRate >> 16; + u32Frm = pChnAttr->fr32DstFrameRate & 0xFFFF; + + if (u32Sec == 0) { + pTestEnc->encOP.frameRateInfo = u32Frm; + } else { + pTestEnc->encOP.frameRateInfo = ((u32Sec - 1) << 16) + u32Frm; + } + + CVI_VC_IF("\n"); + + return ret; +} + +static int cviVEncSetFrameLost(stTestEncoder *pTestEnc, void *arg) +{ + cviFrameLost *pfrLost = (cviFrameLost *)arg; + TestEncConfig *pEncConfig = &pTestEnc->encConfig; + int ret = 0; + + CVI_VC_IF("\n"); + + pEncConfig->frmLostOpen = pfrLost->bFrameLostOpen; + pEncConfig->cviEc.frmLostBpsThr = pfrLost->u32FrmLostBpsThr; + pEncConfig->cviEc.encFrmGaps = pfrLost->u32EncFrmGaps; + + CVI_VC_CFG("frmLostOpen = %d\n", pEncConfig->frmLostOpen); + CVI_VC_CFG("frameSkipBufThr = %d\n", pEncConfig->cviEc.frmLostBpsThr); + CVI_VC_CFG("encFrmGaps = %d\n", pEncConfig->cviEc.encFrmGaps); + + return ret; +} + +#ifdef CLI_DEBUG_SUPPORT +extern void showCodecInstPoolInfo(CodecInst *pCodecInst); +static int cviVEncShowChnInfo(stTestEncoder *pTestEnc, void *arg) +{ + if (pTestEnc == NULL) { + tcli_print("error params.\n"); + return -1; + } + + UNUSED(arg); + EncOpenParam *pEncOP = &pTestEnc->encOP; + + tcli_print("bitstreamBufferSize:%d\n", pEncOP->bitstreamBufferSize); + tcli_print("bitstreamFormat:%d\n", pEncOP->bitstreamFormat); + tcli_print("picWidth:%d\n", pEncOP->picWidth); + tcli_print("picHeight:%d\n", pEncOP->picHeight); + FrameBufferAllocInfo *pfbAllocInfo = &pTestEnc->fbAllocInfo; + + if (pfbAllocInfo) { + tcli_print("pfbAllocInfo_stride:%d\n", pfbAllocInfo->stride); + tcli_print("pfbAllocInfo_height:%d\n", pfbAllocInfo->height); + tcli_print("pfbAllocInfo_size:%d\n", pfbAllocInfo->size); + tcli_print("pfbAllocInfo_numt:%d\n", pfbAllocInfo->num); + } + + TestEncConfig *pEncConfig = &pTestEnc->encConfig; + + tcli_print("encConfig info:\n"); + tcli_print("stdMode:%d\n", pEncConfig->stdMode); + tcli_print("picWidth:%d\n", pEncConfig->picWidth); + tcli_print("picHeight:%d\n", pEncConfig->picHeight); + tcli_print("kbps:%d\n", pEncConfig->kbps); + tcli_print("rcMode:%d\n", pEncConfig->rcMode); + tcli_print("changePos:%d\n", pEncConfig->changePos); + tcli_print("frmLostOpen:%d\n", pEncConfig->frmLostOpen); + tcli_print("rotAngle:%d\n", pEncConfig->rotAngle); + tcli_print("mirDir:%d\n", pEncConfig->mirDir); + tcli_print("useRot:%d\n", pEncConfig->useRot); + tcli_print("qpReport:%d\n", pEncConfig->qpReport); + tcli_print("ringBufferEnable:%d\n", pEncConfig->ringBufferEnable); + tcli_print("rcIntraQp:%d\n", pEncConfig->rcIntraQp); + tcli_print("instNum:%d\n", pEncConfig->instNum); + tcli_print("coreIdx:%d\n", pEncConfig->coreIdx); + + tcli_print("mapType:%d\n", pEncConfig->mapType); + tcli_print("lineBufIntEn:%d\n", pEncConfig->lineBufIntEn); + tcli_print("bEsBufQueueEn:%d\n", pEncConfig->bEsBufQueueEn); + tcli_print("en_container:%d\n", pEncConfig->en_container); + tcli_print("container_frame_rate:%d\n", + pEncConfig->container_frame_rate); + tcli_print("picQpY:%d\n", pEncConfig->picQpY); + tcli_print("cbcrInterleave:%d\n", pEncConfig->cbcrInterleave); + tcli_print("nv21:%d\n", pEncConfig->nv21); + tcli_print("needSourceConvert:%d\n", pEncConfig->needSourceConvert); + tcli_print("packedFormat:%d\n", pEncConfig->packedFormat); + tcli_print("srcFormat:%d\n", pEncConfig->srcFormat); + tcli_print("srcFormat3p4b:%d\n", pEncConfig->srcFormat3p4b); + tcli_print("decodingRefreshType:%d\n", pEncConfig->decodingRefreshType); + tcli_print("gopSize:%d\n", pEncConfig->gopSize); + + tcli_print("tempLayer:%d\n", pEncConfig->tempLayer); + tcli_print("useDeriveLambdaWeight:%d\n", + pEncConfig->useDeriveLambdaWeight); + tcli_print("dynamicMergeEnable:%d\n", pEncConfig->dynamicMergeEnable); + tcli_print("independSliceMode:%d\n", pEncConfig->independSliceMode); + tcli_print("independSliceModeArg:%d\n", + pEncConfig->independSliceModeArg); + tcli_print("RcEnable:%d\n", pEncConfig->RcEnable); + tcli_print("bitdepth:%d\n", pEncConfig->bitdepth); + tcli_print("secondary_axi:%d\n", pEncConfig->secondary_axi); + tcli_print("stream_endian:%d\n", pEncConfig->stream_endian); + tcli_print("frame_endian:%d\n", pEncConfig->frame_endian); + tcli_print("source_endian:%d\n", pEncConfig->source_endian); + tcli_print("compare_type:%d\n", pEncConfig->compare_type); + tcli_print("yuv_mode:%d\n", pEncConfig->yuv_mode); + tcli_print("loopCount:%d\n", pEncConfig->loopCount); + + tcli_print("roi_enable:%d\n", pEncConfig->roi_enable); + tcli_print("roi_delta_qp:%d\n", pEncConfig->roi_delta_qp); + tcli_print("ctu_qpMap_enable:%d\n", pEncConfig->ctu_qpMap_enable); + tcli_print("encAUD:%d\n", pEncConfig->encAUD); + tcli_print("encEOS:%d\n", pEncConfig->encEOS); + tcli_print("encEOB:%d\n", pEncConfig->encEOB); + tcli_print("actRegNum:%d\n", pEncConfig->actRegNum); + tcli_print("useAsLongtermPeriod:%d\n", pEncConfig->useAsLongtermPeriod); + tcli_print("refLongtermPeriod:%d\n", pEncConfig->refLongtermPeriod); + tcli_print("testEnvOptions:%d\n", pEncConfig->testEnvOptions); + tcli_print("cviApiMode:%d\n", pEncConfig->cviApiMode); + tcli_print("sizeInWord:%d\n", pEncConfig->sizeInWord); + tcli_print("userDataBufSize:%d\n", pEncConfig->userDataBufSize); + tcli_print("bIsoSendFrmEn:%d\n", pEncConfig->bIsoSendFrmEn); + + tcli_print("cviEncCfg cviEc info:\n"); + cviEncCfg *pcviEc = &pEncConfig->cviEc; + + tcli_print(" rcMode:%d\n", pcviEc->rcMode); + tcli_print(" s32IPQpDelta:%d\n", pcviEc->s32IPQpDelta); + tcli_print(" iqp:%d\n", pcviEc->iqp); + tcli_print(" pqp:%d\n", pcviEc->pqp); + tcli_print(" gop:%d\n", pcviEc->gop); + tcli_print(" bitrate:%d\n", pcviEc->bitrate); + tcli_print(" firstFrmstartQp:%d\n", pcviEc->firstFrmstartQp); + tcli_print(" framerate:%d\n", pcviEc->framerate); + tcli_print(" u32MaxIprop:%d\n", pcviEc->u32MaxIprop); + tcli_print(" u32MinIprop:%d\n", pcviEc->u32MinIprop); + tcli_print(" u32MaxQp:%d\n", pcviEc->u32MaxQp); + tcli_print(" u32MinQp:%d\n", pcviEc->u32MinQp); + tcli_print(" u32MaxIQp:%d\n", pcviEc->u32MaxIQp); + tcli_print(" u32MinIQp:%d\n", pcviEc->u32MinIQp); + tcli_print(" maxbitrate:%d\n", pcviEc->maxbitrate); + tcli_print(" initialDelay:%d\n", pcviEc->initialDelay); + tcli_print(" statTime:%d\n", pcviEc->statTime); + + tcli_print(" bitstreamBufferSize:%d\n", pcviEc->bitstreamBufferSize); + tcli_print(" singleLumaBuf:%d\n", pcviEc->singleLumaBuf); + tcli_print(" bSingleEsBuf:%d\n", pcviEc->bSingleEsBuf); + tcli_print(" roi_request:%d\n", pcviEc->roi_request); + tcli_print(" roi_enable mode roi_qp x"); + tcli_print(" y width height\n"); + for (int j = 0; j < 8; j++) { + tcli_print( + " :%d %d %d %d", + pcviEc->cviRoi[j].roi_enable, + pcviEc->cviRoi[j].roi_qp_mode, pcviEc->cviRoi[j].roi_qp, + pcviEc->cviRoi[j].roi_rect_x); + tcli_print(" %d %d %d\n", + pcviEc->cviRoi[j].roi_rect_y, + pcviEc->cviRoi[j].roi_rect_width, + pcviEc->cviRoi[j].roi_rect_height); + } + tcli_print(" virtualIPeriod:%d\n", pcviEc->virtualIPeriod); + tcli_print(" frmLostBpsThr:%d\n", pcviEc->frmLostBpsThr); + tcli_print(" encFrmGaps:%d\n", pcviEc->encFrmGaps); + tcli_print(" s32ChangePos:%d\n", pcviEc->s32ChangePos); + + tcli_print("interruptTimeout:%d\n", pTestEnc->interruptTimeout); + tcli_print("bsBufferCount:%d\n", pTestEnc->bsBufferCount); + tcli_print("srcFrameIdx:%d\n", pTestEnc->srcFrameIdx); + tcli_print("frameIdx:%d\n", pTestEnc->frameIdx); + tcli_print("coreIdx:%d\n", pTestEnc->coreIdx); + CodecInst *pCodecInst = pTestEnc->handle; + + showCodecInstPoolInfo(pCodecInst); + + return 0; +} +#else +static int cviVEncShowChnInfo(stTestEncoder *pTestEnc, void *arg) +{ + CodecInst *pCodecInst = pTestEnc->handle; + EncInfo *pEncInfo; + struct seq_file *m = (struct seq_file *)arg; + + if (pCodecInst && pCodecInst->CodecInfo) { + pEncInfo = &pCodecInst->CodecInfo->encInfo; + seq_printf(m, "chn num:%d yuvCnt:%llu dropCnt:%u\n", + pCodecInst->s32ChnNum, pCodecInst->yuvCnt, pTestEnc->streamPack.dropCnt); + seq_printf(m, "mapType:%d bSbmEn:%d\n", pEncInfo->mapType, pEncInfo->bSbmEn); + } else { + seq_printf(m, "pCodecInst %p or CodecInfo is NULL\n", pCodecInst); + } + + return 0; +} + +#endif + +static int cviVEncSetUserRcInfo(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncConfig = &pTestEnc->encConfig; + cviEncCfg *pCviEc = &pEncConfig->cviEc; + cviUserRcInfo *puri = (cviUserRcInfo *)arg; + int ret = 0; + + CVI_VC_IF("\n"); + + pCviEc->bQpMapValid = puri->bQpMapValid; + pCviEc->bRoiBinValid = puri->bRoiBinValid; + pCviEc->roideltaqp = puri->roideltaqp; + pCviEc->pu8QpMap = (Uint8 *)((uintptr_t)puri->u64QpMapPhyAddr); + + CVI_VC_CFG("bQpMapValid = %d\n", pCviEc->bQpMapValid); + CVI_VC_CFG("pu8QpMap = %p\n", pCviEc->pu8QpMap); + + return ret; +} + +static int cviVEncSetSuperFrame(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncConfig = &pTestEnc->encConfig; + cviEncCfg *pCviEc = &pEncConfig->cviEc; + cviSuperFrame *pSuper = (cviSuperFrame *)arg; + int ret = 0; + + CVI_VC_IF("\n"); + + pCviEc->enSuperFrmMode = pSuper->enSuperFrmMode; + pCviEc->u32SuperIFrmBitsThr = pSuper->u32SuperIFrmBitsThr; + pCviEc->u32SuperPFrmBitsThr = pSuper->u32SuperPFrmBitsThr; + + CVI_VC_CFG("enSuperFrmMode = %d, IFrmBitsThr = %d, PFrmBitsThr = %d\n", + pCviEc->enSuperFrmMode, pCviEc->u32SuperIFrmBitsThr, + pCviEc->u32SuperPFrmBitsThr); + + return ret; +} + +static int cviVEncSetH264Dblk(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH264Dblk *pDblk = &pEncCfg->cviEc.h264Dblk; + cviH264Dblk *pSrc = (cviH264Dblk *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h264 dblk data\n"); + return TE_ERR_ENC_H264_DBLK; + } + + memcpy(pDblk, pSrc, sizeof(cviH264Dblk)); + return 0; +} + +static int cviVEncSetH265Dblk(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviH265Dblk *pDblk = &pEncCfg->cviEc.h265Dblk; + cviH265Dblk *pSrc = (cviH265Dblk *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no h265 dblk data\n"); + return TE_ERR_ENC_H265_DBLK; + } + + memcpy(pDblk, pSrc, sizeof(cviH265Dblk)); + return 0; +} + +int cviVEncDropFrame(stTestEncoder *pTestEnc, void *arg) +{ + pTestEnc->bDrop = TRUE; + + return 0; +} + +int cviVEncSbmSetting(stTestEncoder *pTestEnc, void *arg) +{ + cviVencSbSetting *SbSetting = (cviVencSbSetting *)arg; + + memcpy(&pTestEnc->SbSetting, SbSetting, sizeof(cviVencSbSetting)); + + //Setting Sbm regieter before enable Sbm Irq + cviSetSbSetting(SbSetting); + + return 0; +} + +int cviVEncSvcEnable(stTestEncoder *pTestEnc, void *arg) +{ + bool *svc_enable = (bool *)arg; + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + + pTestEnc->encOP.svc_enable = *svc_enable; + pEncCfg->cviEc.svcEnable = *svc_enable; + return 0; +} + +int cviVEncSetSvcParam(stTestEncoder *pTestEnc, void *arg) +{ + TestEncConfig *pEncCfg = &pTestEnc->encConfig; + cviSvcParam *svc_param = &pEncCfg->cviEc.svcParam; + cviSvcParam *pSrc = (cviSvcParam *)arg; + + CVI_VC_IF("\n"); + + if (pSrc == NULL) { + CVI_VC_ERR("no svc param data\n"); + return TE_ERR_ENC_SVC_PARAM; + } + + memcpy(svc_param, pSrc, sizeof(cviSvcParam)); + pTestEnc->encOP.fg_protect_en = svc_param->fg_protect_en; + pTestEnc->encOP.fg_dealt_qp = svc_param->fg_dealt_qp; + pTestEnc->encOP.complex_scene_detect_en = svc_param->complex_scene_detect_en; + pTestEnc->encOP.complex_scene_low_th = svc_param->complex_scene_low_th; + pTestEnc->encOP.complex_scene_hight_th = svc_param->complex_scene_hight_th; + pTestEnc->encOP.middle_min_percent = svc_param->middle_min_percent; + pTestEnc->encOP.complex_min_percent = svc_param->complex_min_percent; + pTestEnc->encOP.smart_ai_en = svc_param->smart_ai_en; + return 0; +} + +int cviVEncShowRcRealInfo(stTestEncoder *pTestEnc, void *arg) +{ + stRcInfo *pRcInfo = &pTestEnc->handle->rcInfo; + struct seq_file *m = (struct seq_file *)arg; + + seq_printf( + m, + "realBitrate: %d\t minPercent: %d\t MotionLv: %d\t senecCplx: %d\n", + pRcInfo->targetBitrate, pRcInfo->lastMinPercent, + pRcInfo->lastPeriodMotionLv, pRcInfo->periodDciLv); + + seq_printf( + m, + "rcMinIqp: %d\t rcMaxIqp: %d\t rcMinqp: %d\t rcMaxqp: %d\t cur_qp: %d\n", + pRcInfo->rcKerInfo.minIQp, pRcInfo->rcKerInfo.maxIQp, + pRcInfo->rcKerInfo.minQp, pRcInfo->rcKerInfo.maxQp, + pRcInfo->rcPicOut.qp); + return 0; +} + +typedef struct _CVI_VENC_IOCTL_OP_ { + int opNum; + int (*ioctlFunc)(stTestEncoder *pTestEnc, void *arg); +} CVI_VENC_IOCTL_OP; + +CVI_VENC_IOCTL_OP cviIoctlOp[] = { + { CVI_H26X_OP_NONE, NULL }, + { CVI_H26X_OP_SET_RC_PARAM, cviVEncSetRc }, + { CVI_H26X_OP_START, cviVEncStart }, +#if 0 + { CVI_H26X_OP_GET_FD, cviVEncOpGetFd }, +#endif + { CVI_H26X_OP_SET_REQUEST_IDR, cviVEncSetRequestIDR }, + { CVI_H26X_OP_SET_CHN_ATTR, cviVEncOpSetChnAttr }, + { CVI_H26X_OP_SET_REF_PARAM, cviVEncSetRef }, + { CVI_H26X_OP_SET_ROI_PARAM, cviVEncSetRoi }, + { CVI_H26X_OP_GET_ROI_PARAM, cviVEncGetRoi }, + { CVI_H26X_OP_SET_FRAME_LOST_STRATEGY, cviVEncSetFrameLost }, + { CVI_H26X_OP_GET_VB_INFO, cviVEncGetVbInfo }, + { CVI_H26X_OP_SET_VB_BUFFER, cviVEncSetVbBuffer }, + { CVI_H26X_OP_SET_USER_DATA, cviVEncEncodeUserData }, + { CVI_H26X_OP_SET_PREDICT, cviVEncSetPred }, + { CVI_H26X_OP_SET_H264_ENTROPY, cviVEncSetH264Entropy }, + { CVI_H26X_OP_SET_H264_TRANS, cviVEncSetH264Trans }, + { CVI_H26X_OP_SET_H265_TRANS, cviVEncSetH265Trans }, + { CVI_H26X_OP_REG_VB_BUFFER, cviVEncRegReconBuf }, + { CVI_H26X_OP_SET_IN_PIXEL_FORMAT, cviVEncSetInPixelFormat }, + { CVI_H26X_OP_GET_CHN_INFO, cviVEncShowChnInfo }, + { CVI_H26X_OP_SET_USER_RC_INFO, cviVEncSetUserRcInfo }, + { CVI_H26X_OP_SET_SUPER_FRAME, cviVEncSetSuperFrame }, + { CVI_H26X_OP_SET_H264_VUI, cviVEncSetH264Vui }, + { CVI_H26X_OP_SET_H265_VUI, cviVEncSetH265Vui }, + { CVI_H26X_OP_SET_FRAME_PARAM, cviVEncSetFrameParam }, + { CVI_H26X_OP_CALC_FRAME_PARAM, cviVEncCalcFrameParam }, +#if 0 + { CVI_H26X_OP_SET_SB_MODE, cviVEncSetSbMode }, + { CVI_H26X_OP_START_SB_MODE, cviVEncStartSbMode }, + { CVI_H26X_OP_UPDATE_SB_WPTR, cviVEncUpdateSbWptr }, + { CVI_H26X_OP_RESET_SB, cviVEncResetSb }, + { CVI_H26X_OP_SB_EN_DUMMY_PUSH, cviVEncSbEnDummyPush }, + { CVI_H26X_OP_SB_TRIG_DUMMY_PUSH, cviVEncSbTrigDummyPush }, + { CVI_H26X_OP_SB_DIS_DUMMY_PUSH, cviVEncSbDisDummyPush }, + { CVI_H26X_OP_SB_GET_SKIP_FRM_STATUS, cviVEncSbGetSkipFrmStatus }, +#endif + { CVI_H26X_OP_SET_SBM_ENABLE, cviVEncSetSbmEnable }, + { CVI_H26X_OP_WAIT_FRAME_DONE, cviVEncWaitEncodeDone }, + { CVI_H26X_OP_SET_H264_SPLIT, cviVEncSetH264Split }, + { CVI_H26X_OP_SET_H265_SPLIT, cviVEncSetH265Split }, + { CVI_H26X_OP_SET_H264_DBLK, cviVEncSetH264Dblk }, + { CVI_H26X_OP_SET_H265_DBLK, cviVEncSetH265Dblk }, + { CVI_H26X_OP_SET_H264_INTRA_PRED, cviVEncSetH264IntraPred }, + { CVI_H26X_OP_DROP_FRAME, cviVEncDropFrame}, + { CVI_H26X_OP_SET_SBM_SETTING, cviVEncSbmSetting}, + { CVI_H26X_OP_SET_ENABLE_SVC, cviVEncSvcEnable}, + { CVI_H26X_OP_SET_SVC_PARAM, cviVEncSetSvcParam}, + { CVI_H26X_OP_GET_RC_REAL_INFO, cviVEncShowRcRealInfo}, +}; + +int cviVEncIoctl(void *handle, int op, void *arg) +{ + stTestEncoder *pTestEnc = (stTestEncoder *)handle; + int ret = 0; + int currOp; + + CVI_VC_IF("\n"); + + if (op <= 0 || op >= CVI_H26X_OP_MAX) { + CVI_VC_ERR("op = %d\n", op); + return -1; + } + + currOp = (cviIoctlOp[op].opNum & CVI_H26X_OP_MASK) >> CVI_H26X_OP_SHIFT; + if (op != currOp) { + CVI_VC_ERR("op = %d\n", op); + return -1; + } + + ret = cviIoctlOp[op].ioctlFunc(pTestEnc, arg); + + return ret; +} + +static int initMcuEnv(TestEncConfig *pEncConfig) +{ + Uint32 productId; + int ret = 0; +#ifndef FIRMWARE_H + char *fwPath = NULL; +#endif + + ret = cviSetCoreIdx(&pEncConfig->coreIdx, pEncConfig->stdMode); + if (ret) { + ret = TE_ERR_ENC_INIT; + CVI_VC_ERR("cviSetCoreIdx, ret = %d\n", ret); + return ret; + } + + EnterVcodecLock(pEncConfig->coreIdx); + productId = VPU_GetProductId(pEncConfig->coreIdx); + LeaveVcodecLock(pEncConfig->coreIdx); + + if (checkEncConfig(pEncConfig, productId)) { + CVI_VC_ERR("checkEncConfig\n"); + return -1; + } + +#ifdef FIRMWARE_H + if (productId != PRODUCT_ID_420L && productId != PRODUCT_ID_980) { + CVI_VC_ERR("productId = %d\n", productId); + return -1; + } + + if (pEncConfig->sizeInWord == 0 && pEncConfig->pusBitCode == NULL) { + if (LoadFirmwareH(productId, (Uint8 **)&pEncConfig->pusBitCode, + &pEncConfig->sizeInWord) < 0) { + CVI_VC_ERR("Failed to load firmware: productId = %d\n", + productId); + return 1; + } + } +#else + switch (productId) { + case PRODUCT_ID_980: + fwPath = CORE_1_BIT_CODE_FILE_PATH; + break; + case PRODUCT_ID_420L: + fwPath = CORE_5_BIT_CODE_FILE_PATH; + break; + default: + CVI_VC_ERR("Unknown product id: %d\n", productId); + return -1; + } + if (pEncConfig->sizeInWord == 0 && pEncConfig->pusBitCode == NULL) { + if (LoadFirmware(productId, (Uint8 **)&pEncConfig->pusBitCode, + &pEncConfig->sizeInWord, fwPath) < 0) { + CVI_VC_ERR("Failed to load firmware: %s\n", fwPath); + return 1; + } + } +#endif + + return INIT_TEST_ENCODER_OK; +} + +extern wait_queue_head_t tWaitQueue[]; + +static int pfnWaitEncodeDone(void *param) +{ + int ret; + stTestEncoder *pTestEnc = (stTestEncoder *)param; + CodecInst *pCodecInst = pTestEnc->handle; + pTestEnc->tPthreadRunFlag = CVI_TRUE; + + while (!kthread_should_stop()) { + // wait for enc cmd trigger + wait_for_completion(&pTestEnc->semSendEncCmd); + + if (!pTestEnc->tPthreadRunFlag || kthread_should_stop()) + break; + pTestEnc->encConfig.cviEc.originPicType = PIC_TYPE_MAX; + CVI_VENC_DEBUG("get s chn:%d %llu\n", pCodecInst->s32ChnNum, pCodecInst->yuvCnt); + ret = cviGetOneStream(pTestEnc, &pTestEnc->tStreamInfo, TIME_BLOCK_MODE); + CVI_VENC_DEBUG("get s done chn:%d HwTime:%llu cnt:%llu ret:%d\n", pCodecInst->s32ChnNum, + pTestEnc->tStreamInfo.encHwTime, pCodecInst->yuvCnt++, ret); + if (ret == TE_ERR_ENC_IS_SUPER_FRAME) { + ret = cviProcessSuperFrame(pTestEnc, &pTestEnc->tStreamInfo, TIME_BLOCK_MODE); + complete(&pTestEnc->semGetStreamCmd); + } else if (ret == RETCODE_SUCCESS) { + complete(&pTestEnc->semEncDoneCmd); + complete(&pTestEnc->semGetStreamCmd); + wake_up(&tWaitQueue[pCodecInst->s32ChnNum]); + } else { + CVI_VC_ERR("cviGetOneStream, ret = %d\n", ret); + return 0; + } + set_current_state(TASK_INTERRUPTIBLE); + cond_resched(); + } + + return 0; +} + +void *cviVEncOpen(cviInitEncConfig *pInitEncCfg) +{ + stTestEncoder *pTestEnc = NULL; + int ret = 0; + TestEncConfig *pEncConfig; + + ret = cviVcodecInit(); + if (ret < 0) { + CVI_VC_INFO("cviVcodecInit, %d\n", ret); + } + + CVI_VC_IF("\n"); + + cvi_vc_drv_write_vc_reg(REG_CTRL, 0x28, 0x7); +#if defined(__SOC_PHOBOS__) + /* disable cpu access vc sram for 180x romcode use vc sram*/ + cvi_vc_drv_write_vc_reg(REG_CTRL, 0x10, cvi_vc_drv_read_vc_reg(REG_CTRL, 0x10) & (~0x1)); +#endif + pTestEnc = (stTestEncoder *)osal_malloc(sizeof(stTestEncoder)); + if (!pTestEnc) { + CVI_VC_ERR("VENC context malloc\n"); + goto ERR_CVI_VENC_OPEN; + } + + pEncConfig = &pTestEnc->encConfig; + initEncConfigByCtx(pEncConfig, pInitEncCfg); + + ret = initMcuEnv(pEncConfig); + + if (ret != INIT_TEST_ENCODER_OK) { + CVI_VC_ERR("initMcuEnv, ret = %d\n", ret); + osal_free(pTestEnc); + pTestEnc = NULL; + } + +ERR_CVI_VENC_OPEN: + + return (void *)pTestEnc; +} + +int cviVEncClose(void *handle) +{ + int i, ret = 0; + stTestEncoder *pTestEnc = NULL; + UserDataList *userdataNode = NULL; + UserDataList *n; + + if (handle == NULL) + return -1; + pTestEnc = (stTestEncoder *)handle; + + CVI_VC_IF("\n"); + + EnterVcodecLock(pTestEnc->coreIdx); + + ret = cviCheckAndCompareBitstream(pTestEnc); + if (ret == TE_ERR_ENC_OPEN) { + CVI_VC_ERR("cviCheckAndCompareBitstream, ret = %d\n", ret); + LeaveVcodecLock(pTestEnc->coreIdx); + return ret; + } + +#if CACHE_ENCODE_HEADER + if (pTestEnc->bEncHeader) { + for (i = 0; i < ARRAY_SIZE(pTestEnc->headerBackup); i++) { + if (pTestEnc->headerBackup[i].size) + osal_kfree(pTestEnc->headerBackup[i].pBuf); + } + } +#endif + + cviCloseVpuEnc(pTestEnc); + cviDeInitVpuEnc(pTestEnc); + + if (pTestEnc->encConfig.pusBitCode) { +#ifndef FIRMWARE_H + osal_free(pTestEnc->encConfig.pusBitCode); +#endif + pTestEnc->encConfig.pusBitCode = NULL; + pTestEnc->encConfig.sizeInWord = 0; + } + + list_for_each_entry_safe(userdataNode, n, &pTestEnc->encConfig.userdataList, list) { + if (userdataNode->userDataBuf != NULL && userdataNode->userDataLen != 0) { + osal_free(userdataNode->userDataBuf); + list_del(&userdataNode->list); + osal_free(userdataNode); + } + } + pTestEnc->encConfig.userDataBufSize = 0; + + if (pTestEnc->tPthreadId) { + pTestEnc->tPthreadRunFlag = CVI_FALSE; + complete(&pTestEnc->semSendEncCmd); + kthread_stop(pTestEnc->tPthreadId); + pTestEnc->tPthreadId = NULL; + } + + LeaveVcodecLock(pTestEnc->coreIdx); + + if (pTestEnc) + osal_free(pTestEnc); + + return ret; +} + + +static void initEncConfigByCtx(TestEncConfig *pEncConfig, cviInitEncConfig *pInitEncCfg) +{ + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + initDefaultEncConfig(pEncConfig); + + pEncConfig->cviApiMode = API_MODE_SDK; + pEncConfig->lineBufIntEn = 1; +#ifdef CVI_H26X_ES_BUFFER_QUEUE_ENABLE + if (pInitEncCfg->bSingleEsBuf == 1) + pEncConfig->bEsBufQueueEn = 0; + else + pEncConfig->bEsBufQueueEn = pInitEncCfg->bEsBufQueueEn; +#endif + if (pInitEncCfg->bSingleEsBuf == 1) + pEncConfig->bIsoSendFrmEn = 0; + else + pEncConfig->bIsoSendFrmEn = pInitEncCfg->bIsoSendFrmEn; + pEncConfig->s32ChnNum = pInitEncCfg->s32ChnNum; + + if (pInitEncCfg->codec == CODEC_H264) { + pEncConfig->stdMode = STD_AVC; + + pEncConfig->mapType = TILED_FRAME_V_MAP; + pEncConfig->coda9.enableLinear2Tiled = TRUE; + pEncConfig->coda9.linear2TiledMode = FF_FRAME; + + pEncConfig->secondary_axi = SECONDARY_AXI_H264; + pEncConfig->cviEc.h264Entropy.entropyEncModeI = CVI_CABAC; + pEncConfig->cviEc.h264Entropy.entropyEncModeP = CVI_CABAC; + } else { + pEncConfig->stdMode = STD_HEVC; + pEncConfig->secondary_axi = SECONDARY_AXI_H265; + } + + CVI_VC_CFG("stdMode = %s, 2ndAXI = 0x%X\n", + (pInitEncCfg->codec == CODEC_H264) ? "264" : "265", + pEncConfig->secondary_axi); + + pEncConfig->yuv_mode = SOURCE_YUV_ADDR; + pEncConfig->outNum = 0x7fffffff; + + pEncConfig->picWidth = pInitEncCfg->width; + pEncConfig->picHeight = pInitEncCfg->height; + CVI_VC_CFG("picWidth = %d, picHeight = %d\n", pEncConfig->picWidth, + pEncConfig->picHeight); + + pCviEc->u32Profile = pInitEncCfg->u32Profile; + pEncConfig->rcMode = pInitEncCfg->rcMode; + pCviEc->rcMode = pInitEncCfg->rcMode; + pEncConfig->decodingRefreshType = pInitEncCfg->decodingRefreshType; + pCviEc->s32IPQpDelta = pInitEncCfg->s32IPQpDelta; + pCviEc->s32BgQpDelta = pInitEncCfg->s32BgQpDelta; + pCviEc->s32ViQpDelta = pInitEncCfg->s32ViQpDelta; + CVI_VC_CFG( + "Profile = %d, rcMode = %d, RefreshType = %d, s32IPQpDelta = %d, s32BgQpDelta = %d, s32ViQpDelta = %d\n", + pCviEc->u32Profile, pCviEc->rcMode, + pEncConfig->decodingRefreshType, pCviEc->s32IPQpDelta, + pCviEc->s32BgQpDelta, pCviEc->s32ViQpDelta); + + pCviEc->iqp = pInitEncCfg->iqp; + pCviEc->pqp = pInitEncCfg->pqp; + pCviEc->gop = pInitEncCfg->gop; + pCviEc->bitrate = pInitEncCfg->bitrate; + CVI_VC_CFG("iqp = %d, pqp = %d, gop = %d, bitrate = %d\n", + pInitEncCfg->iqp, pInitEncCfg->pqp, pInitEncCfg->gop, + pInitEncCfg->bitrate); + + pCviEc->framerate = pInitEncCfg->framerate; + pCviEc->maxbitrate = pInitEncCfg->maxbitrate; + pCviEc->statTime = pInitEncCfg->statTime; + pCviEc->initialDelay = pInitEncCfg->initialDelay; + CVI_VC_CFG( + "framerate = %d, maxbitrate = %d, statTime = %d, initialDelay = %d\n", + pInitEncCfg->framerate, pCviEc->maxbitrate, pCviEc->statTime, + pCviEc->initialDelay); + + pCviEc->bitstreamBufferSize = pInitEncCfg->bitstreamBufferSize; + pCviEc->singleLumaBuf = pInitEncCfg->singleLumaBuf; + pCviEc->bSingleEsBuf = pInitEncCfg->bSingleEsBuf; + CVI_VC_CFG("bs size = 0x%X, 1YBuf = %d, bSingleEsBuf = %d\n", + pCviEc->bitstreamBufferSize, pCviEc->singleLumaBuf, + pCviEc->bSingleEsBuf); + + if (pInitEncCfg->virtualIPeriod) { + pCviEc->virtualIPeriod = pInitEncCfg->virtualIPeriod; + CVI_VC_CFG("virtualIPeriod = %d\n", pCviEc->virtualIPeriod); + } + pCviEc->svcEnable = pInitEncCfg->svc_enable; + pCviEc->svcParam.fg_protect_en = pInitEncCfg->fg_protect_en; + pCviEc->svcParam.fg_dealt_qp = pInitEncCfg->fg_dealt_qp; + pCviEc->svcParam.complex_scene_detect_en = pInitEncCfg->complex_scene_detect_en; + pCviEc->svcParam.complex_scene_low_th = pInitEncCfg->complex_scene_low_th; + pCviEc->svcParam.complex_scene_hight_th = pInitEncCfg->complex_scene_hight_th; + pCviEc->svcParam.middle_min_percent = pInitEncCfg->middle_min_percent; + pCviEc->svcParam.complex_min_percent = pInitEncCfg->complex_min_percent; + pCviEc->svcParam.smart_ai_en = pInitEncCfg->smart_ai_en; + strcpy(pEncConfig->bitstreamFileName, BS_NAME); + strcpy(pEncConfig->yuvFileName, YUV_NAME); + + // user data bufs + pEncConfig->userDataBufSize = pInitEncCfg->userDataMaxLength; + INIT_LIST_HEAD(&pEncConfig->userdataList); + +// from BITMONET-68 in CnM Jira: +// There are two bit-stream handling method such as 'ring-buffer' and 'line-bufer'. +// Also these two method cannot be activated together. +} + +void initDefaultEncConfig(TestEncConfig *pEncConfig) +{ + cviEncCfg *pCviEc = &pEncConfig->cviEc; + +#ifndef PLATFORM_NON_OS + cviVcodecMask(); +#endif + + CVI_VC_TRACE("\n"); + + cviVcodecGetVersion(); + +#if CFG_MEM + osal_memset(&dramCfg, 0x0, sizeof(DRAM_CFG)); +#endif + +#ifdef ENABLE_LOG + InitLog(); +#endif + + osal_memset(pEncConfig, 0, sizeof(TestEncConfig)); +#ifdef CODA980 + pEncConfig->stdMode = STD_AVC; + pEncConfig->mapType = LINEAR_FRAME_MAP; +#else + pEncConfig->stdMode = STD_HEVC; + pEncConfig->mapType = COMPRESSED_FRAME_MAP; +#endif + pEncConfig->frame_endian = VPU_FRAME_ENDIAN; + pEncConfig->stream_endian = VPU_STREAM_ENDIAN; + pEncConfig->source_endian = VPU_SOURCE_ENDIAN; +#ifdef PLATFORM_NON_OS + pEncConfig->yuv_mode = SOURCE_YUV_FPGA; +#endif + pEncConfig->RcEnable = -1; + pEncConfig->picQpY = -1; + pCviEc->firstFrmstartQp = -1; + pCviEc->framerate = 30; + + COMP(pEncConfig->coreIdx, 0); +} +#ifdef VC_DRIVER_TEST +struct OptionExt options_help[] = { + { "output", 1, NULL, 0, + "--output bitstream path\n" }, + { "input", 1, NULL, 0, + "--input YUV file path\n" }, + /* The value of InputFile in a cfg is replaced to this value */ + { "codec", 1, NULL, 0, + "--codec codec index, HEVC = 12, AVC = 0\n" }, + { "cfgFileName", 1, NULL, 0, + "--cfgFileName cfg file path\n" }, + { "cfgFileName0", 1, NULL, 0, + "--cfgFileName0 cfg file 0 path\n" }, + { "cfgFileName1", 1, NULL, 0, + "--cfgFileName1 cfg file 1 path\n" }, + { "cfgFileName2", 1, NULL, 0, + "--cfgFileName2 cfg file 2 path\n" }, + { "cfgFileName3", 1, NULL, 0, + "--cfgFileName3 cfg file 3 path\n" }, + { "coreIdx", 1, NULL, 0, + "--coreIdx core index: default 0\n" }, + { "picWidth", 1, NULL, 0, + "--picWidth source width\n" }, + { "picHeight", 1, NULL, 0, + "--picHeight source height\n" }, + { "EncBitrate", 1, NULL, 0, + "--EncBitrate RC bitrate in kbps\n" }, + /* In case of without cfg file, if this option has value then RC will be enabled */ + { "RcMode", 1, NULL, 0, + "--RcMode RC mode. 0: CBR\n" }, + { "changePos", 1, NULL, 0, + "--changePos VBR bitrate change poistion\n" }, + { "frmLostOpen", 1, NULL, 0, + "--frmLostOpen auto-skip frame enable\n" }, + { "maxIprop", 1, NULL, 0, + "--maxIprop max I frame bitrate ratio to P frame\n" }, + { "enable-ringBuffer", 0, NULL, 0, + "--enable-ringBuffer enable stream ring buffer mode\n" }, + { "enable-lineBufInt", 0, NULL, 0, + "--enable-lineBufInt enable linebuffer interrupt\n" }, + { "mapType", 1, NULL, 0, + "--mapType mapType\n" }, + { "loop-count", 1, NULL, 0, + "--loop-count integer number. loop test, default 0\n" }, + { "enable-cbcrInterleave", 0, NULL, 0, + "--enable-cbcrInterleave enable cbcr interleave\n" }, + { "nv21", 1, NULL, 0, + "--nv21 enable NV21(must set enable-cbcrInterleave)\n" }, + { "packedFormat", 1, NULL, 0, + "--packedFormat 1:YUYV, 2:YVYU, 3:UYVY, 4:VYUY\n" }, + { "rotAngle", 1, NULL, 0, + "--rotAngle rotation angle(0,90,180,270), Not supported on WAVE420L\n" }, + { "mirDir", 1, NULL, 0, + "--mirDir 1:Vertical, 2: Horizontal, 3:Vert-Horz, Not supported on WAVE420L\n" }, + /* 20 */ + { "secondary-axi", 1, NULL, 0, + "--secondary-axi 0~7: bit mask values, Please refer programmer's guide or datasheet\n" }, + /* 1:IMD(not supported on WAVE420L), 2: RDO, 4: LF */ + { "frame-endian", 1, NULL, 0, + "--frame-endian 16~31, default 31(LE) Please refer programmer's guide or datasheet\n" }, + { "stream-endian", 1, NULL, 0, + "--stream-endian 16~31, default 31(LE) Please refer programmer's guide or datasheet\n" }, + { "source-endian", 1, NULL, 0, + "--source-endian 16~31, default 31(LE) Please refer programmer's guide or datasheet\n" }, + { "ref_stream_path", 1, NULL, 0, + "--ref_stream_path golden data which is compared with encoded stream when -c option\n" }, + { "srcFormat3p4b", 1, NULL, 0, + "--srcFormat3p4b [WAVE420]MUST BE enabled when yuv src format 3pixel 4byte format\n" }, + { "decodingRefreshType", 1, NULL, 0, + "--decRefreshType decodingRefreshType, 0 = disable, 1 = enable\n" }, + { "gopSize", 1, NULL, 0, + "--gopSize gopSize, The interval of 2 Intra frames\n" }, + { "tempLayer", 1, NULL, 0, + "--tempLayer temporal layer coding, Range from 1 to 3\n" }, + { "useDeriveLambdaWeight", 1, NULL, 0, + "--useDeriveLambdaWeight useDeriveLambdaWeight, 1 = use derived Lambda weight, 0 = No\n" }, + { "dynamicMergeEnable", 1, NULL, 0, + "--dynamicMergeEnable dynamicMergeEnable, 1 = enable dynamic merge, 0 = disable\n" }, + { "IndeSliceMode", 1, NULL, 0, + "--IndeSliceMode IndeSliceMode, 1 = enable, 0 = disable\n" }, + { "IndeSliceArg", 1, NULL, 0, + "--IndeSliceArg IndeSliceArg\n" }, + { "RateControl", 1, NULL, 0, + "--RateControl RateControl\n" }, + { "RcInitQp", 1, NULL, 0, + "--RcInitQp Initial QP of rate control\n" }, + { "PIC_QP_Y", 1, NULL, 0, + "--PIC_QP_Y PIC_QP_Y\n" }, + { "RoiCfgType", 1, NULL, 0, + "--RoiCfgType Roi map cfg type\n" }, +#if CFG_MEM + { "code-addr", 1, NULL, 0, + "--code-addr cvitest, fw address\n" }, + { "code-size", 1, NULL, 0, + "--code-size cvitest, fw size\n" }, + { "vpu-dram-addr", 1, NULL, 0, + "--vpu-dram-addr cvitest, dram address for vcodec\n" }, + { "vpu-dram-size", 1, NULL, 0, + "--vpu-dram-size cvitest, dram size for vcodec\n" }, + { "src-yuv-addr", 1, NULL, 0, + "--src-yuv-addr cvitest, source yuv address\n" }, + { "src-yuv-size", 1, NULL, 0, + "--src-yuv-size cvitest, source yuv size\n" }, +#endif + { NULL, 0, NULL, 0, NULL }, +}; + +struct option options[MAX_GETOPT_OPTIONS]; +static int parseArgs(int argc, char **argv, TestEncConfig *pEncConfig) +{ + char *optString = "c:rbhvn:t:"; + int opt, index = 0, ret = 0, i; + cviEncCfg *pCviEc = &pEncConfig->cviEc; + + for (i = 0; i < MAX_GETOPT_OPTIONS; i++) { + if (options_help[i].name == NULL) + break; + osal_memcpy(&options[i], &options_help[i], + sizeof(struct option)); + } + + CVI_VC_TRACE("argc = %d, optString = %s\n", argc, optString); + getopt_init(); + memset(gCfgFileName, 0, MAX_NUM_INSTANCE * MAX_FILE_PATH); + while ((opt = getopt_long(argc, argv, optString, options, + &index)) != -1) { + switch (opt) { + case 'n': + pEncConfig->outNum = atoi(optarg); + CVI_VC_TRACE("optarg = %s, outNum = %d\n", optarg, + pEncConfig->outNum); + break; + case 'c': + pEncConfig->compare_type |= (1 << MODE_COMP_ENCODED); + CVI_VC_FLOW("Stream compare Enable\n"); + break; + case 'h': + help(options_help, argv[0]); + return 0; + case 't': + gNumInstance = atoi(optarg); + CVI_VC_CFG("gNumInstance %d\n", gNumInstance); + break; + case 0: + CVI_VC_TRACE("name = %s\n", options[index].name); + if (!strcmp(options[index].name, "output")) { + osal_memcpy(pEncConfig->bitstreamFileName, + optarg, strlen(optarg)); +#ifdef REDUNDENT_CODE + ChangePathStyle(pEncConfig->bitstreamFileName); +#endif + } else if (!strcmp(options[index].name, "input")) { + strcpy(optYuvPath, optarg); +#ifdef REDUNDENT_CODE + ChangePathStyle(optYuvPath); +#endif + } else if (!strcmp(options[index].name, "codec")) { + pEncConfig->stdMode = (CodStd)atoi(optarg); + if (pEncConfig->stdMode == STD_AVC) + pEncConfig->mapType = LINEAR_FRAME_MAP; + else + pEncConfig->mapType = + COMPRESSED_FRAME_MAP; + } else if (!strcmp(options[index].name, + "cfgFileName") || + !strcmp(options[index].name, + "cfgFileName0")) { + osal_memcpy(gCfgFileName[0], optarg, + strlen(optarg)); + } else if (!strcmp(options[index].name, + "cfgFileName1")) { + osal_memcpy(gCfgFileName[1], optarg, + strlen(optarg)); + } else if (!strcmp(options[index].name, + "cfgFileName2")) { + osal_memcpy(gCfgFileName[2], optarg, + strlen(optarg)); + } else if (!strcmp(options[index].name, + "cfgFileName3")) { + osal_memcpy(gCfgFileName[3], optarg, + strlen(optarg)); + } else if (!strcmp(options[index].name, "coreIdx")) { + pEncConfig->coreIdx = atoi(optarg); + } else if (!strcmp(options[index].name, "picWidth")) { + pEncConfig->picWidth = atoi(optarg); + CVI_VC_TRACE("picWidth = %d\n", + pEncConfig->picWidth); + } else if (!strcmp(options[index].name, "picHeight")) { + pEncConfig->picHeight = atoi(optarg); + CVI_VC_TRACE("picHeight = %d\n", + pEncConfig->picHeight); + } else if (!strcmp(options[index].name, "EncBitrate")) { + pEncConfig->kbps = atoi(optarg); + } else if (!strcmp(options[index].name, "RcMode")) { + pEncConfig->rcMode = atoi(optarg); + } else if (!strcmp(options[index].name, "changePos")) { + pEncConfig->changePos = atoi(optarg); + } else if (!strcmp(options[index].name, + "frmLostOpen")) { + pEncConfig->frmLostOpen = atoi(optarg); + } else if (!strcmp(options[index].name, + "enable-ringBuffer")) { + pEncConfig->ringBufferEnable = TRUE; + } else if (!strcmp(options[index].name, + "enable-lineBufInt")) { + pEncConfig->lineBufIntEn = TRUE; + } else if (!strcmp(options[index].name, "loop-count")) { + pEncConfig->loopCount = atoi(optarg); + } else if (!strcmp(options[index].name, + "enable-cbcrInterleave")) { + pEncConfig->cbcrInterleave = 1; + if (pEncConfig->stdMode == STD_AVC) { + pEncConfig->mapType = TILED_FRAME_MB_RASTER_MAP; + pEncConfig->coda9.enableLinear2Tiled = TRUE; + pEncConfig->coda9.linear2TiledMode = FF_FRAME; + } + } else if (!strcmp(options[index].name, "nv21")) { + pEncConfig->nv21 = atoi(optarg); + } else if (!strcmp(options[index].name, + "packedFormat")) { + pEncConfig->packedFormat = atoi(optarg); + } else if (!strcmp(options[index].name, "rotAngle")) { + pEncConfig->rotAngle = atoi(optarg); + } else if (!strcmp(options[index].name, "mirDir")) { + pEncConfig->mirDir = atoi(optarg); + } else if (!strcmp(options[index].name, + "secondary-axi")) { + pEncConfig->secondary_axi = atoi(optarg); + } else if (!strcmp(options[index].name, + "frame-endian")) { + pEncConfig->frame_endian = atoi(optarg); + } else if (!strcmp(options[index].name, + "stream-endian")) { + pEncConfig->stream_endian = atoi(optarg); + } else if (!strcmp(options[index].name, + "source-endian")) { + pEncConfig->source_endian = atoi(optarg); + } else if (!strcmp(options[index].name, + "ref_stream_path")) { + osal_memcpy(pEncConfig->ref_stream_path, optarg, + strlen(optarg)); +#ifdef REDUNDENT_CODE + ChangePathStyle(pEncConfig->ref_stream_path); +#endif + } else if (!strcmp(options[index].name, + "srcFormat3p4b")) { + pEncConfig->srcFormat3p4b = atoi(optarg); + } else if (!strcmp(options[index].name, + "decodingRefreshType")) { + pEncConfig->decodingRefreshType = atoi(optarg); + } else if (!strcmp(options[index].name, "gopSize")) { + pEncConfig->gopSize = atoi(optarg); + } else if (!strcmp(options[index].name, "tempLayer")) { + pEncConfig->tempLayer = atoi(optarg); + } else if (!strcmp(options[index].name, + "useDeriveLambdaWeight")) { + pEncConfig->useDeriveLambdaWeight = + atoi(optarg); + } else if (!strcmp(options[index].name, + "dynamicMergeEnable")) { + pEncConfig->dynamicMergeEnable = atoi(optarg); + } else if (!strcmp(options[index].name, + "IndeSliceMode")) { + pEncConfig->independSliceMode = atoi(optarg); + } else if (!strcmp(options[index].name, + "IndeSliceArg")) { + pEncConfig->independSliceModeArg = atoi(optarg); + } else if (!strcmp(options[index].name, + "RateControl")) { + pEncConfig->RcEnable = atoi(optarg); + } else if (!strcmp(options[index].name, "maxIprop")) { + pCviEc->u32MaxIprop = atoi(optarg); + } else if (!strcmp(options[index].name, "RcInitQp")) { + pCviEc->firstFrmstartQp = atoi(optarg); + } else if (!strcmp(options[index].name, "RoiCfgType")) { + pEncConfig->roi_cfg_type = atoi(optarg); + } else if (!strcmp(options[index].name, "PIC_QP_Y")) { + pEncConfig->picQpY = atoi(optarg); +#if CFG_MEM + } else if (!strcmp(options[index].name, "code-addr")) { + if (kstrtoll(optarg, 16, &dramCfg.pucCodeAddr) != 0) { + pr_err("pucCodeAddr input error\n"); + } + CVI_VC_TRACE("pucCodeAddr = 0x%lX\n", + dramCfg.pucCodeAddr); + } else if (!strcmp(options[index].name, "code-size")) { + dramCfg.iCodeSize = atoi(optarg); + CVI_VC_TRACE("pucCodeSize = 0x%X\n", + dramCfg.iCodeSize); + } else if (!strcmp(options[index].name, + "vpu-dram-addr")) { + if (kstrtoll(optarg, 16, &dramCfg.pucVpuDramAddr) != 0) { + pr_err("pucVpuDramAddr input error\n"); + } + CVI_VC_TRACE("pucVpuDramAddr = 0x%lX\n", + dramCfg.pucVpuDramAddr); + } else if (!strcmp(options[index].name, + "vpu-dram-size")) { + if (kstrtoll(optarg, 16, &dramCfg.iVpuDramSize) != 0) { + pr_err("iVpuDramSize input error\n"); + } + CVI_VC_TRACE("pucVpuDramSize = 0x%X\n", + dramCfg.iVpuDramSize); + } else if (!strcmp(options[index].name, + "src-yuv-addr")) { + if (kstrtoll(optarg, 16, &dramCfg.pucSrcYuvAddr) != 0) { + pr_err("pucSrcYuvAddr input error\n"); + } + CVI_VC_TRACE("pucSrcYuvAddr = 0x%lX\n", + dramCfg.pucSrcYuvAddr); + } else if (!strcmp(options[index].name, + "src-yuv-size")) { + if (kstrtoll(optarg, 16, &dramCfg.iSrcYuvSize) != 0) { + pr_err("iSrcYuvSize input error\n"); + } + CVI_VC_TRACE("pucSrcYuvSize = 0x%X\n", + dramCfg.iSrcYuvSize); +#endif + } else { + CVI_VC_ERR("not exist pEncConfig = %s\n", + options[index].name); + help(options_help, argv[0]); + return 1; + } + break; + default: + help(options_help, argv[0]); + return 1; + } + } + + return ret; +} +#endif + +static int checkEncConfig(TestEncConfig *pEncConfig, Uint32 productId) +{ + int ret = 0; + + if (pEncConfig->mapType == TILED_FRAME_MB_RASTER_MAP || + pEncConfig->mapType == TILED_FIELD_MB_RASTER_MAP) + pEncConfig->cbcrInterleave = TRUE; + + if (pEncConfig->rotAngle > 0 || pEncConfig->mirDir > 0) + pEncConfig->useRot = TRUE; + +#if CFG_MEM + if (checkDramCfg(&dramCfg)) { + CVI_VC_ERR("checkDramCfg\n"); + return -1; + } +#endif + + if (checkParamRestriction(productId, pEncConfig) == FALSE) { + CVI_VC_ERR("checkParamRestriction\n"); + return 1; + } + + return ret; +} + +#ifdef VC_DRIVER_TEST +#if CFG_MEM +static int checkDramCfg(DRAM_CFG *pDramCfg) +{ + if (!pDramCfg->pucCodeAddr || !pDramCfg->iCodeSize || + !pDramCfg->pucVpuDramAddr || !pDramCfg->iVpuDramSize || + !pDramCfg->pucSrcYuvAddr || !pDramCfg->iSrcYuvSize) { + CVI_VC_TRACE("dramCfg = 0\n"); + return -1; + } + return 0; +} +#endif + +static int initEncConfigByArgv(int argc, char **argv, TestEncConfig *pEncConfig) +{ + int ret = 0; + + initDefaultEncConfig(pEncConfig); + + CVI_VC_TRACE("\n"); + + pEncConfig->cviApiMode = API_MODE_DRIVER; + pEncConfig->lineBufIntEn = 1; + + ret = parseArgs(argc, argv, pEncConfig); + + if (ret < 0) { + CVI_VC_ERR("parseArgs\n"); + return ret; + } + + // from BITMONET-68 in CnM Jira: + // There are two bit-stream handling method such as 'ring-buffer' and 'line-bufer'. + // Also these two method cannot be activated together. + //assert(pEncConfig->lineBufIntEn == !pEncConfig->ringBufferEnable); + + return ret; +} + +static int cviGetStream(stTestEncoder *pTestEnc) +{ + int ret = 0; + EncOutputInfo *pOutputInfo = &pTestEnc->outputInfo; + EncOpenParam *peop = &pTestEnc->encOP; + + ret = cviGetEncodedInfo(pTestEnc, TIME_BLOCK_MODE); + + if (ret == TE_STA_ENC_TIMEOUT) { + return RET_VCODEC_TIMEOUT; + } else if (ret) { + CVI_VC_ERR("cviGetEncodedInfo, ret = %d\n", ret); + return ret; + } + + if (peop->ringBufferEnable == 0) { + ret = cviCheckOutputInfo(pTestEnc); + + if (ret == TE_ERR_ENC_OPEN) { + CVI_VC_ERR("cviCheckOutputInfo, ret = %d\n", ret); + return ret; + } + +#ifdef SUPPORT_DONT_READ_STREAM + updateBitstream(&pTestEnc->vbStream[0], + pOutputInfo->bitstreamSize); +#else + + if (pOutputInfo->bitstreamSize) { + ret = BitstreamReader_Act( + pTestEnc->bsReader, + pOutputInfo->bitstreamBuffer, + peop->bitstreamBufferSize, + pOutputInfo->bitstreamSize, + pTestEnc->comparatorBitStream); + + if (ret == FALSE) { + CVI_VC_ERR("ES, ret = %d\n", ret); + return TE_ERR_ENC_OPEN; + } + } + +#endif + } + + ret = cviCheckEncodeEnd(pTestEnc); + cviVPU_ChangeState(pTestEnc->handle); + + return ret; +} + + +//extern char *optarg; /* argument associated with option */ +int TestEncoder(TestEncConfig *pEncConfig) +{ + stTestEncoder *pTestEnc = osal_malloc(sizeof(stTestEncoder)); + int suc = 0; + int ret; + + VDI_POWER_ON_DOING_JOB(pEncConfig->coreIdx, ret, + initEncOneFrame(pTestEnc, pEncConfig)); + + if (ret == TE_ERR_ENC_INIT) { + CVI_VC_ERR("ret %d\n", ret); + goto ERR_ENC_INIT; + } else if (ret == TE_ERR_ENC_OPEN) { + CVI_VC_ERR("ret %d\n", ret); + goto ERR_ENC_OPEN; + } + + while (1) { + vdi_set_clock_gate(pEncConfig->coreIdx, CLK_ENABLE); + ret = cviEncodeOneFrame(pTestEnc); + if (ret == TE_STA_ENC_BREAK) { + CVI_VC_INFO("cviEncodeOneFrame, ret = %d\n", ret); + vdi_set_clock_gate(pEncConfig->coreIdx, CLK_DISABLE); + break; + } else if (ret == TE_ERR_ENC_OPEN) { + CVI_VC_INFO("cviEncodeOneFrame, ret = %d\n", ret); + vdi_set_clock_gate(pEncConfig->coreIdx, CLK_DISABLE); + goto ERR_ENC_OPEN; + } + + ret = cviGetStream(pTestEnc); + vdi_set_clock_gate(pEncConfig->coreIdx, CLK_DISABLE); + + if (ret == TE_STA_ENC_BREAK) { + break; + } else if (ret) { + CVI_VC_ERR("cviGetStream, ret = %d\n", ret); + goto ERR_ENC_OPEN; + } + } + + VDI_POWER_ON_DOING_JOB(pEncConfig->coreIdx, ret, + cviCheckAndCompareBitstream(pTestEnc)); + + if (ret == TE_ERR_ENC_OPEN) { + CVI_VC_ERR("cviCheckAndCompareBitstream\n"); + goto ERR_ENC_OPEN; + } + + suc = 1; + +ERR_ENC_OPEN: + // Now that we are done with encoding, close the open instance. + cviCloseVpuEnc(pTestEnc); +ERR_ENC_INIT: + cviDeInitVpuEnc(pTestEnc); + osal_free(pTestEnc); + return suc; +} + +static int FnEncoder(void *param) +{ + int ret; + TestEncConfig *pEncConfig = (TestEncConfig *)param; + //pthread_t tid = pthread_self(); + + //SetTidToInstIdx(tid, pEncConfig->instNum); + + ret = TestEncoder(pEncConfig); + + if (ret) + return ret; + else + return 0; +} + +int cvitest_venc_main(int argc, char **argv) +{ + BOOL debugMode = FALSE; + TestEncConfig *pEncConfig[MAX_NUM_INSTANCE]; + struct task_struct *thread_id[MAX_NUM_INSTANCE]; + int ret = 0; + int i = 0; + struct sched_param param = { + .sched_priority = 80, + }; + + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + pEncConfig[i] = osal_malloc(sizeof(TestEncConfig)); + } + ret = cviVcodecInit(); + + if (ret < 0) { + CVI_VC_INFO("cviVcodecInit, %d\n", ret); + } + + ret = initEncConfigByArgv(argc, argv, pEncConfig[0]); + + if (ret < 0) { + CVI_VC_ERR("initEncConfigByArgv\n"); + return ret; + } + + VDI_POWER_ON_DOING_JOB(pEncConfig[0]->coreIdx, ret, + initMcuEnv(pEncConfig[0])); + + if (ret != INIT_TEST_ENCODER_OK) { + CVI_VC_ERR("initMcuEnv, ret = %d\n", ret); + return ret; + } + + for (i = 1; i < MAX_NUM_INSTANCE; i++) { + memcpy(pEncConfig[i], pEncConfig[0], sizeof(TestEncConfig)); + pEncConfig[i]->instNum = (i); + } + + ret = 1; + //assert(gNumInstance <= MAX_NUM_INSTANCE); + + for (i = 0; i < gNumInstance; i++) { + thread_id[i] = kthread_run(FnEncoder, + pEncConfig[i], "FnEncoder_%d", i); + + if (IS_ERR(thread_id[i])) { + CVI_VC_ERR("pthread_create error!\n"); + ret = 0; + goto BAILOUT; + } + sched_setscheduler(thread_id[i], SCHED_RR, ¶m); + } + + for (i = 0; i < gNumInstance; i++) { + if (thread_id[i]) { + kthread_stop(thread_id[i]); + } + + thread_id[i] = NULL; + } +BAILOUT: + + if (debugMode == TRUE) { + VPU_DeInit(pEncConfig[0]->coreIdx); + } + + vdi_release(pEncConfig[0]->coreIdx); + VPU_SetCoreStatus(pEncConfig[0]->coreIdx, 0); + + if (pEncConfig[0]->pusBitCode) { +#ifndef FIRMWARE_H + osal_free(pEncConfig[0]->pusBitCode); +#endif + pEncConfig[0]->pusBitCode = NULL; + pEncConfig[0]->sizeInWord = 0; + } + + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + osal_free(pEncConfig[i]); + } + + return ret == 1 ? 0 : 1; +} + +int cvi_venc_test(u_long arg) +{ +#define MAX_ARG_CNT 30 + char buf[512]; + char *pArgv[MAX_ARG_CNT] = {0}; + char *save_ptr; + unsigned int u32Argc = 0; + char *pBuf; + unsigned int __user *argp = (unsigned int __user *)arg; + + memset(buf, 0, 512); + + if (argp != NULL) { + if (copy_from_user(buf, (char *)argp, 512)) + return -1; + } + + pBuf = buf; + + while (NULL != (pArgv[u32Argc] = cvi_strtok_r(pBuf, " ", &save_ptr))) { + u32Argc++; + + if (u32Argc >= MAX_ARG_CNT) { + break; + } + + pBuf = NULL; + } + + return cvitest_venc_main(u32Argc, pArgv); +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.h new file mode 100644 index 0000000000..3e77679d24 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/sample/main_enc_cvitest.h @@ -0,0 +1,55 @@ +/* + * Copyright Bitmain Technologies Inc. + * + * Created Time: Dec, 2019 + */ +#ifndef __MAIN_ENC_CVITEST_H__ +#define __MAIN_ENC_CVITEST_H__ + +#define H264_VENC_INTR_NUM 76 +#define H265_VENC_INTR_NUM 77 +#define SUPPORT_INTERRUPT + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifdef TEST_H264_ENC +int cvitest_h264_venc_main(int argc, char **argv); +#ifdef SUPPORT_INTERRUPT +int irq_handler_h264_venc(int irqn, void *priv); +#endif +#endif + +#ifdef TEST_H265_ENC +int cvitest_venc_main(int argc, char **argv); +#ifdef SUPPORT_INTERRUPT +int irq_handler_h265_venc(int irqn, void *priv); +#endif +#endif + +enum TestEnc { + TE_STA_ENC_BREAK = 20, + TE_STA_ENC_TIMEOUT = 21, + TE_ERR_ENC_INIT = -10, + TE_ERR_ENC_OPEN = -11, + TE_ERR_ENC_USER_DATA = -12, + TE_ERR_ENC_H264_ENTROPY = -13, + TE_ERR_ENC_H264_TRANS = -14, + TE_ERR_ENC_H265_TRANS = -15, + TE_ERR_ENC_IS_SUPER_FRAME = -16, + TE_ERR_ENC_H264_VUI = -17, + TE_ERR_ENC_H265_VUI = -18, + TE_ERR_ENC_H264_SPLIT = -19, + TE_ERR_ENC_H265_SPLIT = -20, + TE_ERR_ENC_H264_DBLK = -21, + TE_ERR_ENC_H265_DBLK = -22, + TE_ERR_ENC_H264_INTRA_PRED = -23, + TE_ERR_ENC_SVC_PARAM = -24, +}; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/linux/driver/vcodec.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/linux/driver/vcodec.h new file mode 100644 index 0000000000..82ce1f9c4d --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/linux/driver/vcodec.h @@ -0,0 +1,77 @@ +//--=========================================================================-- +// This file is linux device driver for VPU. +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2015 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#ifndef __VPU_DRV_H__ +#define __VPU_DRV_H__ + +#include +#include + +#define USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + +#define VDI_IOCTL_MAGIC 'V' +#define VDI_IOCTL_ALLOCATE_PHYSICAL_MEMORY _IO(VDI_IOCTL_MAGIC, 0) +#define VDI_IOCTL_FREE_PHYSICALMEMORY _IO(VDI_IOCTL_MAGIC, 1) +#define VDI_IOCTL_WAIT_INTERRUPT _IO(VDI_IOCTL_MAGIC, 2) +#define VDI_IOCTL_SET_CLOCK_GATE _IO(VDI_IOCTL_MAGIC, 3) +#define VDI_IOCTL_RESET _IO(VDI_IOCTL_MAGIC, 4) +#define VDI_IOCTL_GET_INSTANCE_POOL _IO(VDI_IOCTL_MAGIC, 5) +#define VDI_IOCTL_GET_COMMON_MEMORY _IO(VDI_IOCTL_MAGIC, 6) +#define VDI_IOCTL_GET_RESERVED_VIDEO_MEMORY_INFO _IO(VDI_IOCTL_MAGIC, 8) +#define VDI_IOCTL_OPEN_INSTANCE _IO(VDI_IOCTL_MAGIC, 9) +#define VDI_IOCTL_CLOSE_INSTANCE _IO(VDI_IOCTL_MAGIC, 10) +#define VDI_IOCTL_GET_INSTANCE_NUM _IO(VDI_IOCTL_MAGIC, 11) +#define VDI_IOCTL_GET_REGISTER_INFO _IO(VDI_IOCTL_MAGIC, 12) +#define VDI_IOCTL_SET_CLOCK_GATE_EXT _IO(VDI_IOCTL_MAGIC, 13) +#define VDI_IOCTL_GET_CHIP_VERSION _IO(VDI_IOCTL_MAGIC, 14) +#define VDI_IOCTL_GET_CLOCK_FREQUENCY _IO(VDI_IOCTL_MAGIC, 15) +#define VDI_IOCTL_RELEASE_COMMON_MEMORY _IO(VDI_IOCTL_MAGIC, 16) +#define VDI_IOCTL_GET_SINGLE_CORE_CONFIG _IO(VDI_IOCTL_MAGIC, 17) + +typedef struct vpudrv_buffer_t { + __u32 size; + __u64 phys_addr; + __u64 base; /* kernel logical address in use kernel */ + __u8 *virt_addr; /* virtual user space address */ +#ifdef __arm__ + __u32 padding; /* padding for keeping same size of this structure */ +#endif +} vpudrv_buffer_t; + +typedef struct vpu_bit_firmware_info_t { + __u32 size; /* size of this structure*/ + __u32 core_idx; + __u64 reg_base_offset; + __u16 bit_code[512]; +} vpu_bit_firmware_info_t; + +typedef struct vpudrv_inst_info_t { + unsigned int core_idx; + unsigned int inst_idx; + int inst_open_count; /* for output only*/ +} vpudrv_inst_info_t; + +typedef struct vpudrv_intr_info_t { + unsigned int timeout; + int intr_reason; + int coreIdx; + __u64 intr_tv_sec; + __u64 intr_tv_nsec; +} vpudrv_intr_info_t; + +#define TEST_FPGA + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/linux/vdi.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/linux/vdi.c new file mode 100644 index 0000000000..32765af4b7 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/linux/vdi.c @@ -0,0 +1,3411 @@ +//------------------------------------------------------------------------------ +// File: vdi.c +// +// Copyright (c) 2006, Chips & Media. All rights reserved. +//------------------------------------------------------------------------------ +#if defined(linux) || defined(__linux) || defined(ANDROID) +#ifdef __arm__ +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE +#undef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 +#endif +#define MMAP mmap64 +#else +#define MMAP mmap +#endif + +#include +#include +#include +#include +#include +#include +#include "../vdi.h" +#include "../vdi_osal.h" +#include "vpuapifunc.h" +#include "coda9/coda9_regdefine.h" +#include "driver/vcodec.h" +#include "wave/common/common_regdefine.h" +#include "wave/wave4/wave4_regdefine.h" + +#define VCODEC_DEVICE_NAME "/dev/vcodec" +typedef struct mutex MUTEX_HANDLE; +#define MUTEX_INIT(P_MUTEX_HANDLE, ATTR) mutex_init(P_MUTEX_HANDLE) +#define MUTEX_DESTROY(P_MUTEX_HANDLE) mutex_destroy(P_MUTEX_HANDLE) +#define MUTEX_LOCK(P_MUTEX_HANDLE) mutex_lock_interruptible(P_MUTEX_HANDLE) +#define MUTEX_UNLOCK(P_MUTEX_HANDLE) mutex_unlock(P_MUTEX_HANDLE) + +#ifndef CVI_H26X_USE_ION_FW_BUFFER +extern int vpu_get_common_memory(vpudrv_buffer_t *vdb); +extern int vpu_release_common_memory(vpudrv_buffer_t *p_vdb); +#endif +extern int vpu_wait_interrupt(vpudrv_intr_info_t *p_intr_info); +extern int vpu_set_clock_gate_ext(struct clk_ctrl_info *p_info); +extern int vpu_get_instance_pool(vpudrv_buffer_t *p_vdb); +extern int vpu_open_instance(vpudrv_inst_info_t *p_inst_info); +extern int vpu_close_instance(vpudrv_inst_info_t *p_inst_info); +extern int vpu_reset(void); +extern int vpu_get_register_info(vpudrv_buffer_t *p_vdb_register); +extern int vpu_get_chip_version(unsigned int *p_chip_version); +extern int vpu_get_chip_cabability(unsigned int *p_chip_capability); +extern int vpu_get_clock_frequency(unsigned long *p_clk_rate); +extern int vpu_get_single_core_config(int *pSingleCoreConfig); +extern int vpu_op_write(vpu_bit_firmware_info_t *p_bit_firmware_info, + size_t len); + +#define SUPPORT_INTERRUPT +#define VPU_BIT_REG_SIZE (0x4000 * MAX_NUM_VPU_CORE) +#define VDI_SRAM_BASE_ADDR 0x00000000 +/* if we can know the sram address in SOC directly for vdi +layer. it is possible to set in vdi layer without +allocation from driver */ + +#define VDI_SRAM_SIZE_CODA9_1821A 0xE400 +#define VDI_SRAM_SIZE_CODA9_1822 0xEC00 +#define VDI_SRAM_SIZE_CODA9_1835 \ + 0x1D000 // FHD MAX size, 0x17D00 4K MAX size 0x34600 + +#define VDI_SRAM_SIZE_WAVE420L_1821A 0x17A00 +#define VDI_SRAM_SIZE_WAVE420L_1822 0x19400 +#define VDI_SRAM_SIZE_WAVE420L_1835 0x1D000 + +#define VDI_SYSTEM_ENDIAN VDI_LITTLE_ENDIAN +#define VDI_128BIT_BUS_SYSTEM_ENDIAN VDI_128BIT_LITTLE_ENDIAN +#define VDI_NUM_LOCK_HANDLES 4 + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER +#define VPU_CORE_BASE_OFFSET 0x0 +#endif + +#define DEBUG_MEMCPY 0 + +typedef struct vpudrv_buffer_pool_t { + vpudrv_buffer_t vdb; + int inuse; +} vpudrv_buffer_pool_t; + +typedef struct { + int chip_version; + int chip_capability; + unsigned long core_idx; + unsigned int product_code; + int vpu_fd; + vpu_instance_pool_t *pvip; + int task_num; + int clock_state; + vpudrv_buffer_t vdb_register; + vpudrv_buffer_t ctrl_register; + vpudrv_buffer_t addr_remap_register; + vpu_buffer_t vpu_common_memory; + vpudrv_buffer_pool_t vpu_buffer_pool[MAX_VPU_BUFFER_POOL]; + int vpu_buffer_pool_count; + + struct mutex *vpu_mutex; + struct mutex *core_mutex; + struct mutex *vpu_disp_mutex; + vpudrv_buffer_t vdb_bitstream; + int SingleCore; + + BOOL singleEsBuf; + unsigned int single_es_buf_size; + +} vdi_info_t; + +typedef struct { + unsigned long tv_sec; + unsigned long tv_usec; +} vdi_timeval_t; + +static void cviGetSysTime(vdi_timeval_t *pstTimeval) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + struct timespec64 ts = {0}; +#else + struct timeval tv = {0}; +#endif + + if (!pstTimeval) + return; + + memset(pstTimeval, 0, sizeof(vdi_timeval_t)); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + ktime_get_real_ts64(&ts); + pstTimeval->tv_sec = ts.tv_sec; + pstTimeval->tv_usec = ts.tv_nsec/1000; +#else + do_gettimeofday(&tv); + pstTimeval->tv_sec = tv.tv_sec; + pstTimeval->tv_usec = tv.tv_usec; +#endif +} + +struct mutex vcodecLock[MAX_NUM_VPU_CORE]; +vdi_info_t *s_vdi_info[MAX_NUM_VPU_CORE] = { 0 }; + +static int cviVdiCfgReg(vdi_info_t *vdi, int core_idx); +static int allocate_common_memory(unsigned long core_idx); +static int free_common_memory(unsigned long core_idx); +static vdi_info_t *vdi_get_vdi_info(unsigned long core_idx); +static int swap_endian(unsigned long core_idx, unsigned char *data, int len, + int endian); +#ifdef ARCH_CV182X +static BOOL vdi_is_share_single_es_buf(unsigned long core_idx, + unsigned int single_es_buf_size, + vdi_info_t **ppVdiSwitch); +#endif + +void cvi_vdi_init(void) +{ + unsigned long core_idx; + + for (core_idx = 0; core_idx < MAX_NUM_VPU_CORE; core_idx++) { + MUTEX_INIT(&vcodecLock[core_idx], NULL); + } +} + +static int vdi_get_size_common(unsigned long core_idx, int SingleCore) +{ + if (core_idx >= MAX_NUM_VPU_CORE) { + CVI_VC_ERR("core_idx (%lu) >= MAX_NUM_VPU_CORE (%d)\n", + core_idx, MAX_NUM_VPU_CORE); + return 0; + } + + if (SingleCore == 1) { + if (core_idx == 0) + return SIZE_COMMON_265; + else + return SIZE_COMMON_264; + } else { + return SIZE_COMMON * MAX_NUM_VPU_CORE; + } +} + +int vdi_get_single_core(unsigned long core_idx) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + return vdi->SingleCore; +} + +void vdi_change_task_count(unsigned long core_idx, int add) +{ + int locked = 0; + vdi_info_t *vdi; + + locked = vdi_check_lock_by_me(core_idx); + if (locked < 0) { + CVI_VC_ERR("lock failed\n"); + return; + } + + vdi = s_vdi_info[core_idx]; + + if (vdi->vpu_fd != -1 && vdi->vpu_fd != 0x00) { + vdi->task_num += add; + CVI_VC_LOCK("vdi->task_num %d\n", vdi->task_num); + } + + if (locked == 1) + vdi_unlock(core_idx); +} + +int vdi_get_clk_rate(unsigned long core_idx) +{ + vdi_info_t *vdi; + unsigned long clk_rate = 0; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + if (vpu_get_clock_frequency(&clk_rate) < 0) { + CVI_VC_ERR("[VDI] fail to VDI_IOCTL_GET_CLOCK_FREQUENCY\n"); + return -1; + } + + CVI_VC_INFO("mw : clk_rate %lu\n", clk_rate); + + return clk_rate; +} + +static int vdi_get_product_version(unsigned long core_idx) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + if (vpu_get_chip_version(&vdi->chip_version) < 0) { + CVI_VC_ERR("[VDI] fail to VDI_IOCTL_GET_CHIP_VERSION\n"); + return -1; + } + + if (vpu_get_chip_cabability(&vdi->chip_capability) < 0) { + CVI_VC_ERR( + "[VDI] fail to VDI_IOCTL_GET_CHIP_CAP\n"); + return -1; + } + + CVI_VC_INFO("chip_version = 0x%X, chip_capability = 0x%X\n", + vdi->chip_version, vdi->chip_capability); + + return 0; +} + +int vdi_init(unsigned long core_idx, BOOL bCountTaskNum) +{ + vdi_info_t *vdi; + int i, ret = 0; + + if (core_idx >= MAX_NUM_VPU_CORE) + return 0; + + if (s_vdi_info[core_idx] == NULL) { + s_vdi_info[core_idx] = osal_malloc(sizeof(vdi_info_t)); + } + vdi = s_vdi_info[core_idx]; + + if (vdi->vpu_fd != -1 && vdi->vpu_fd != 0x00) { + CVI_VC_INFO("Already call vdi_init, vdi->task_num %d\n", + vdi->task_num); + if (bCountTaskNum) + vdi_change_task_count(core_idx, 1); + return 0; + } + +// if this API supports VPU parallel +// processing using multi VPU. the driver +// should be made to open multiple times. + vdi->vpu_fd = 'v' + core_idx; // TODO: refine this! + + CVI_VC_TRACE("core_idx = %ld, vpu_fd = %d\n", core_idx, vdi->vpu_fd); + if (vdi_get_product_version(core_idx)) { + CVI_VC_INFO( + "[VDI] fail to vdi_get_product_version\n"); + goto ERR_VDI_INIT; + } + + ret = cviVdiCfgReg(vdi, core_idx); + if (ret < 0) { + CVI_VC_TRACE("\n"); + goto ERR_VDI_INIT; + } + + memset(&vdi->vpu_buffer_pool, 0x00, + sizeof(vpudrv_buffer_pool_t) * MAX_VPU_BUFFER_POOL); + + if (!vdi_get_instance_pool(core_idx)) { + CVI_VC_INFO( + "[VDI] fail to create shared info for saving context\n"); + goto ERR_VDI_INIT; + } + + if (vdi->pvip->instance_pool_inited == FALSE) { + CodecInst *pCodecInst; +#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP) +#else + /* If a process or a thread is terminated abnormally, + * pthread_mutexattr_setrobust_np(attr, PTHREAD_MUTEX_ROBUST_NP) + * makes next onwer call pthread_mutex_lock() without deadlock. + */ + pthread_mutexattr_setrobust_np(&mutexattr, + PTHREAD_MUTEX_ROBUST_NP); +#endif + MUTEX_INIT((MUTEX_HANDLE *)vdi->vpu_mutex, &mutexattr); + MUTEX_INIT((MUTEX_HANDLE *)vdi->core_mutex, &mutexattr); + MUTEX_INIT((MUTEX_HANDLE *)vdi->vpu_disp_mutex, &mutexattr); + + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + pCodecInst = (CodecInst *)vdi->pvip->codecInstPool[i]; + pCodecInst->instIndex = i; + pCodecInst->inUse = 0; + + CVI_VC_INFO( + "%d, pCodecInst->instIndex %d, pCodecInst->inUse %d\n", + i, pCodecInst->instIndex, pCodecInst->inUse); + } + + vdi->pvip->instance_pool_inited = TRUE; + } + + if (vdi_lock(core_idx) < 0) { + CVI_VC_ERR("[VDI] fail to handle lock function\n"); + goto ERR_VDI_INIT; + } + + vdi_set_clock_gate(core_idx, CLK_ENABLE); + + vdi->product_code = + vdi_read_register(core_idx, VPU_PRODUCT_CODE_REGISTER); + + CVI_VC_TRACE("core_idx = %ld, product_code = 0x%X\n", core_idx, + vdi->product_code); + + if (PRODUCT_CODE_W_SERIES(vdi->product_code)) { + if (vdi_read_register(core_idx, W4_VCPU_CUR_PC) == 0) { + // if BIT processor is not running. + for (i = 0; i < 64; i++) + vdi_write_register(core_idx, (i * 4) + 0x100, + 0x0); + } + } else if (PRODUCT_CODE_NOT_W_SERIES(vdi->product_code)) { + // CODA9XX + if (vdi_read_register(core_idx, BIT_CUR_PC) == 0) // if BIT + // processor + // is not + // running. + { + for (i = 0; i < 64; i++) + vdi_write_register(core_idx, (i * 4) + 0x100, + 0x0); + } + } else { + CVI_VC_ERR("Unknown product id : %08x\n", vdi->product_code); + vdi_set_clock_gate(core_idx, CLK_DISABLE); + goto ERR_VDI_INIT; + } + + vdi_set_clock_gate(core_idx, CLK_DISABLE); + + if (vpu_get_single_core_config(&vdi->SingleCore) < 0) { + CVI_VC_ERR( + "[VDI] fail to get single core setting from driver\n"); + goto ERR_VDI_INIT; + } + +#ifdef CVI_H26X_USE_ION_FW_BUFFER + // TODO: remove singleCore config + vdi->SingleCore = 1; +#endif + + if (allocate_common_memory(core_idx) < 0) { + CVI_VC_ERR("[VDI] fail to get common buffer from driver\n"); + goto ERR_VDI_INIT; + } + + vdi->core_idx = core_idx; + + vdi_unlock(core_idx); + if (bCountTaskNum) + vdi_change_task_count(core_idx, 1); + + CVI_VC_INFO("[VDI] success to init driver clk gate %d\n", + vdi->clock_state); + return 0; + +ERR_VDI_INIT: + vdi_unlock(core_idx); + vdi_release(core_idx); + return -1; +} + +static int cviVdiCfgReg(vdi_info_t *vdi, int core_idx) +{ + CVI_VC_TRACE("vdi %p\n", vdi); + + if (vdi->vdb_register.virt_addr) { + // already got vdb_register + return 0; + } + +#ifdef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + vdi->vdb_register.size = core_idx; + if (vpu_get_register_info(&vdi->vdb_register) < 0) { + CVI_VC_ERR("[VDI] fail to get host interface register\n"); + return -1; + } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + vdi->vdb_register.virt_addr = + ioremap(vdi->vdb_register.phys_addr, vdi->vdb_register.size); +#else + vdi->vdb_register.virt_addr = ioremap_nocache( + vdi->vdb_register.phys_addr, vdi->vdb_register.size); +#endif +#else + vdi->vdb_register.size = VPU_BIT_REG_SIZE; + vdi->vdb_register.virt_addr = + MMAP(NULL, vdi->vdb_register.size, PROT_READ | PROT_WRITE, + MAP_SHARED, vdi->vpu_fd, 0); +#endif + + CVI_VC_INFO( + "mmap vdi->vdb_register.virt_addr %p, vdi->vdb_register.size %d, vdi->vdb_register.phys_addr 0x%llx\n", + vdi->vdb_register.virt_addr, vdi->vdb_register.size, + vdi->vdb_register.phys_addr); + + if ((void *)vdi->vdb_register.virt_addr == NULL) { + CVI_VC_ERR("[VDI] fail to map %s registers\n", + VCODEC_DEVICE_NAME); + return -1; + } + + CVI_VC_INFO( + "[VDI] map vdb_register core_idx=%d, virtaddr=%p, size=%d\n", + core_idx, vdi->vdb_register.virt_addr, vdi->vdb_register.size); + + return 0; +} + +int vdi_set_bit_firmware_to_pm(unsigned long core_idx, + const unsigned short *code) +{ + int i; + vpu_bit_firmware_info_t *p_bit_firmware_info = + vzalloc(sizeof(vpu_bit_firmware_info_t)); + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return 0; + } + + p_bit_firmware_info->size = sizeof(vpu_bit_firmware_info_t); + p_bit_firmware_info->core_idx = core_idx; +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + p_bit_firmware_info->reg_base_offset = + (core_idx * VPU_CORE_BASE_OFFSET); +#else + p_bit_firmware_info->reg_base_offset = 0; +#endif + for (i = 0; i < 512; i++) + p_bit_firmware_info->bit_code[i] = code[i]; + + if (vpu_op_write(p_bit_firmware_info, p_bit_firmware_info->size) < 0) { + CVI_VC_ERR("[VDI] fail to vdi_set_bit_firmware core=%d\n", + p_bit_firmware_info->core_idx); + return -1; + } + vfree(p_bit_firmware_info); + + return 0; +} + +#if 0 +int vdi_get_vpu_fd(unsigned long core_idx) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + return vdi->vpu_fd; +} +#endif + +int vdi_release(unsigned long core_idx) +{ + int i; + vpudrv_buffer_t vdb; + vdi_info_t *vdi; + int locked = 0; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_WARN("vdi_get_vdi_info\n"); + return 0; + } + + if (vdi->task_num > 1) { + // means that the opened instance remains + vdi_change_task_count(core_idx, -1); + + CVI_VC_INFO("task_num = %d\n", vdi->task_num); + + return 0; + } + + locked = vdi_check_lock_by_me(core_idx); + if (locked < 0) { + CVI_VC_ERR("lock failed\n"); + return 0; + } + + CVI_VC_INFO("task_num = 0, try to release\n"); + + if (vdi->vdb_register.virt_addr) { + iounmap((void *)vdi->vdb_register.virt_addr); + } + + osal_memset(&vdi->vdb_register, 0x00, sizeof(vpudrv_buffer_t)); + vdb.size = 0; + // get common memory information to free virtual address + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_common_memory.phys_addr >= + vdi->vpu_buffer_pool[i].vdb.phys_addr && + vdi->vpu_common_memory.phys_addr < + (vdi->vpu_buffer_pool[i].vdb.phys_addr + + vdi->vpu_buffer_pool[i].vdb.size)) { + vdi->vpu_buffer_pool[i].inuse = 0; + vdi->vpu_buffer_pool_count--; + vdb = vdi->vpu_buffer_pool[i].vdb; +#ifndef CVI_H26X_USE_ION_FW_BUFFER + // if use ion to allocate common buffer, it would be unmap() in ion_free + iounmap((void *)vdb.virt_addr); +#endif + break; + } + } + + if (i >= MAX_VPU_BUFFER_POOL) { + CVI_VC_ERR("i >= MAX_VPU_BUFFER_POOL\n"); + } + + CVI_VC_INFO("physaddr=0x%llx, virtaddr=%p, size=0x%x, index=%d\n", + vdb.phys_addr, vdb.virt_addr, vdb.size, i); + + if (locked) + vdi_unlock(core_idx); + + vdi_change_task_count(core_idx, -1); + + if (vdi->SingleCore == 1) { + if (free_common_memory(core_idx) < 0) { + CVI_VC_ERR( + "[VDI] fail to free common buffer from driver\n"); + } + } + + if (vdi->vpu_fd != -1 && vdi->vpu_fd != 0x00) { + vdi_set_clock_gate(core_idx, CLK_DISABLE); + vdi->vpu_fd = -1; + } + MUTEX_DESTROY(&vcodecLock[core_idx]); + +#ifdef ARCH_CV182X + do { + vdi_info_t *vdiSwitch = NULL; + BOOL bIsUseShareSingleBuf = FALSE; + + bIsUseShareSingleBuf = vdi_is_share_single_es_buf( + core_idx, vdi->single_es_buf_size, &vdiSwitch); + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse && + vdi->vpu_buffer_pool[i].vdb.size > 0) { + if (bIsUseShareSingleBuf && + vdiSwitch->vdb_bitstream.virt_addr == + vdi->vpu_buffer_pool[i].vdb.virt_addr) { + continue; + } + } + } + } while (0); +#else // ARCH_CV182X + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse && + vdi->vpu_buffer_pool[i].vdb.size > 0) { + } + } +#endif // ARCH_CV182X + + memset(vdi, 0x00, sizeof(vdi_info_t)); + + if (s_vdi_info[core_idx]) { + osal_free(s_vdi_info[core_idx]); + } + s_vdi_info[core_idx] = NULL; + + return 0; +} + +int vdi_get_common_memory(unsigned long core_idx, vpu_buffer_t *vb) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + osal_memcpy(vb, &vdi->vpu_common_memory, sizeof(vpu_buffer_t)); + + return 0; +} + +int allocate_common_memory(unsigned long core_idx) +{ + vdi_info_t *vdi; + vpudrv_buffer_t vdb; + int i; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + vdb.size = vdi_get_size_common(core_idx, vdi->SingleCore); + + if (vdb.size == 0) { + CVI_VC_ERR("[VDI] fail to vdi_get_size_common %d\n", vdb.size); + return -1; + } + + CVI_VC_MEM("common mem vdb.sizesize=0x%x\n", vdb.size); + +#ifdef CVI_H26X_USE_ION_FW_BUFFER + + if (vdi->vpu_common_memory.base == 0) { + vpu_buffer_t vb = { 0x0 }; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + vb.size = vdb.size; + + if (core_idx == 0) { + sprintf(ionName, "VCODEC_H265_FW_Buffer"); + } else { + sprintf(ionName, "VCODEC_H264_FW_Buffer"); + } + + VDI_ALLOCATE_MEMORY(core_idx, &vb, 0, ionName); + + vdb.phys_addr = vb.phys_addr; + vdb.base = vb.base; + vdb.virt_addr = vb.virt_addr; + } else { + vdb.phys_addr = vdi->vpu_common_memory.phys_addr; + vdb.base = vdi->vpu_common_memory.base; + vdb.virt_addr = vdi->vpu_common_memory.virt_addr; + } +#else + if (vpu_get_common_memory(&vdb) < 0) { + CVI_VC_ERR("[VDI] fail to allocate_common_memory size=%d\n", + vdb.size); + return -1; + } + + vdb.virt_addr = ioremap_nocache(vdb.phys_addr, vdb.size); +#endif + + CVI_VC_TRACE( + "mmap vdb.virt_addr %p, vdb.size %d, vdb.phys_addr 0x%llx\n", + vdb.virt_addr, vdb.size, vdb.phys_addr); + + CVI_VC_MEM( + "[VDI] allocate_common_memory, physaddr=0x%llx, virtaddr=%p\n", + vdb.phys_addr, vdb.virt_addr); + + // convert os driver buffer type to vpu buffer type +#if 1 //def SUPPORT_MULTI_CORE_IN_ONE_DRIVER + if (vdi->SingleCore == 1) { + vdi->pvip->vpu_common_buffer.size = + vdi_get_size_common(core_idx, vdi->SingleCore); + vdi->pvip->vpu_common_buffer.phys_addr = (vdb.phys_addr); + vdi->pvip->vpu_common_buffer.base = (vdb.base); + vdi->pvip->vpu_common_buffer.virt_addr = vdb.virt_addr; + } else { + vdi->pvip->vpu_common_buffer.size = SIZE_COMMON; + vdi->pvip->vpu_common_buffer.phys_addr = + (vdb.phys_addr + (core_idx * SIZE_COMMON)); + vdi->pvip->vpu_common_buffer.base = + (vdb.base + (core_idx * SIZE_COMMON)); + vdi->pvip->vpu_common_buffer.virt_addr = + (vdb.virt_addr + (core_idx * SIZE_COMMON)); + } +#else + vdi->pvip->vpu_common_buffer.size = SIZE_COMMON; + vdi->pvip->vpu_common_buffer.phys_addr = (vdb.phys_addr); + vdi->pvip->vpu_common_buffer.base = (vdb.base); + vdi->pvip->vpu_common_buffer.virt_addr = vdb.virt_addr; +#endif + + osal_memcpy(&vdi->vpu_common_memory, &vdi->pvip->vpu_common_buffer, + sizeof(vpudrv_buffer_t)); + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 0) { + vdi->vpu_buffer_pool[i].vdb = vdb; + vdi->vpu_buffer_pool_count++; + vdi->vpu_buffer_pool[i].inuse = 1; + break; + } + } + + CVI_VC_TRACE("physaddr=0x%llx, size=0x%x, virtaddr=%p\n", + vdi->vpu_common_memory.phys_addr, + (int)vdi->vpu_common_memory.size, + vdi->vpu_common_memory.virt_addr); + + return 0; +} + +int free_common_memory(unsigned long core_idx) +{ + vdi_info_t *vdi; + vpudrv_buffer_t vdb; + vpudrv_buffer_t *p_vdb; + int i; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + osal_memcpy(&vdb, &vdi->pvip->vpu_common_buffer, + sizeof(vpudrv_buffer_t)); + + if (vdb.size == 0) { + CVI_VC_ERR("[VDI] fail to get common memory size %x\n", + vdb.size); + return -1; + } + + CVI_VC_MEM("release common mem physaddr=0x%llx size=0x%x\n", + vdb.phys_addr, vdb.size); + +#ifdef CVI_H26X_USE_ION_FW_BUFFER + do { + vpu_buffer_t vb; + osal_memcpy(&vb, &vdi->pvip->vpu_common_buffer, sizeof(vpu_buffer_t)); + VDI_FREE_MEMORY(core_idx, &vb); + } while (0); +#else + + if (vpu_release_common_memory(&vdb) < 0) { + CVI_VC_ERR("[VDI] fail to vpu_release_common_memory size=%d\n", + vdb.size); + return -1; + } + iounmap((void *)vdb.virt_addr); + +#endif + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].vdb.phys_addr == vdb.phys_addr) { + p_vdb = &vdi->vpu_buffer_pool[i].vdb; + vdi->vpu_buffer_pool[i].inuse = 0; + vdi->vpu_buffer_pool_count--; + break; + } + } + + osal_memset(p_vdb, 0x0, sizeof(vpudrv_buffer_t)); + osal_memset(&vdi->pvip->vpu_common_buffer, 0x0, sizeof(vpu_buffer_t)); + osal_memset(&vdi->vpu_common_memory, 0x0, sizeof(vpu_buffer_t)); + + return 0; +} + +vpu_instance_pool_t *vdi_get_instance_pool(unsigned long core_idx) +{ + vdi_info_t *vdi; + vpudrv_buffer_t vdb; + int i = 0; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return NULL; + } + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + if (sizeof(CodecInst) > MAX_INST_HANDLE_SIZE) { + CVI_VC_ERR("CodecInst = %d, MAX_INST_HANDLE_SIZE = %d\n", + (int)sizeof(CodecInst), MAX_INST_HANDLE_SIZE); + } + + if (!vdi->pvip) { + vdb.size = sizeof(vpu_instance_pool_t) + + sizeof(MUTEX_HANDLE) * VDI_NUM_LOCK_HANDLES; +#if 1 //def SUPPORT_MULTI_CORE_IN_ONE_DRIVER + vdb.size *= MAX_NUM_VPU_CORE; +#endif + if (vpu_get_instance_pool(&vdb) < 0) { + CVI_VC_ERR( + "[VDI] fail to allocate get instance pool physical space=%d\n", + (int)vdb.size); + return NULL; + } + +#ifdef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + vdb.virt_addr = + (__u8 *)(uintptr_t)(vdb.phys_addr); // instance pool was allocated by vmalloc +#else + vdb.virt_addr = MMAP(NULL, vdb.size, PROT_READ | PROT_WRITE, + MAP_SHARED, vdi->vpu_fd, vdb.phys_addr); +#endif + + CVI_VC_MEM("sizeof(vpu_instance_pool_t) = %zd\n", + sizeof(vpu_instance_pool_t)); + CVI_VC_MEM( + "vmalloc, sizeof(MUTEX_HANDLE) * VDI_NUM_LOCK_HANDLES = %zd\n", + sizeof(MUTEX_HANDLE) * VDI_NUM_LOCK_HANDLES); + CVI_VC_MEM( + "mmap vdb.virt_addr %p, vdb.size %d, vdb.phys_addr 0x%llx, lr %p\n", + vdb.virt_addr, vdb.size, vdb.phys_addr, + __builtin_return_address(0)); + + if ((void *)vdb.virt_addr == NULL) { + CVI_VC_ERR( + "[VDI] fail to map instance pool phyaddr=0x%llx, size = %d\n", + vdb.phys_addr, (int)vdb.size); + return NULL; + } + +#if 1 //def SUPPORT_MULTI_CORE_IN_ONE_DRIVER + vdi->pvip = (vpu_instance_pool_t + *)(vdb.virt_addr + + (core_idx * + (sizeof(vpu_instance_pool_t) + + sizeof(MUTEX_HANDLE) * + VDI_NUM_LOCK_HANDLES))); +#else + vdi->pvip = (vpu_instance_pool_t *)(vdb.virt_addr); +#endif + + vdi->vpu_mutex = (MUTEX_HANDLE *)((unsigned long)vdi->pvip + + sizeof(vpu_instance_pool_t)); + // change the + // pointer of vpu_mutex to at end pointer of vpu_instance_pool_t + // to assign at allocated position. + vdi->vpu_disp_mutex = + (MUTEX_HANDLE *)((unsigned long)vdi->pvip + + sizeof(vpu_instance_pool_t) + + sizeof(MUTEX_HANDLE)); + vdi->core_mutex = (MUTEX_HANDLE *)((unsigned long)vdi->pvip + + sizeof(vpu_instance_pool_t) + + sizeof(MUTEX_HANDLE) * 2); + + CVI_VC_INFO( + "[VDI] instance pool physaddr=0x%llx, virtaddr=%p, base=0x%llx, size=%d\n", + vdb.phys_addr, vdb.virt_addr, vdb.base, vdb.size); + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 0) { + vdi->vpu_buffer_pool[i].vdb = vdb; + vdi->vpu_buffer_pool_count++; + vdi->vpu_buffer_pool[i].inuse = 1; + break; + } + } + } + + return (vpu_instance_pool_t *)vdi->pvip; +} + +int vdi_open_instance(unsigned long core_idx, unsigned long inst_idx) +{ + vdi_info_t *vdi; + vpudrv_inst_info_t inst_info; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + inst_info.core_idx = core_idx; + inst_info.inst_idx = inst_idx; + if (vpu_open_instance(&inst_info) < 0) { + CVI_VC_ERR( + "[VDI] fail to deliver open instance num inst_idx=%d\n", + (int)inst_idx); + return -1; + } + + vdi->pvip->vpu_instance_num = inst_info.inst_open_count; + + CVI_VC_TRACE("vdi->pvip->vpu_instance_num %d\n", + vdi->pvip->vpu_instance_num); + + return 0; +} + +int vdi_close_instance(unsigned long core_idx, unsigned long inst_idx) +{ + vdi_info_t *vdi; + vpudrv_inst_info_t inst_info; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + inst_info.core_idx = core_idx; + inst_info.inst_idx = inst_idx; + if (vpu_close_instance(&inst_info) < 0) { + CVI_VC_ERR( + "[VDI] fail to deliver open instance num inst_idx=%d\n", + (int)inst_idx); + return -1; + } + + vdi->pvip->vpu_instance_num = inst_info.inst_open_count; + + CVI_VC_INFO( + "inst_idx %ld, after close vdi->pvip->vpu_instance_num %d\n", + inst_idx, vdi->pvip->vpu_instance_num); + + return 0; +} + +int vdi_get_instance_num(unsigned long core_idx) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + return vdi->pvip->vpu_instance_num; +} + +#ifdef REDUNDENT_CODE +int vdi_hw_reset(unsigned long core_idx) // DEVICE_ADDR_SW_RESET +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + return vpu_reset(); +} +#endif + +/* + pidt : the pid for current thread + mutex_owner_id : the owner id of the mutex + + if two id are equal, means that current thread is holding the mutex + if not, means, the mutex was not locked, or other thread is holding the mutex + + return : + 0 : caller do nothing + 1 : caller need to call vdi_lock() +*/ +int vdi_check_lock_by_me(unsigned long core_idx) +{ + vdi_info_t *vdi; + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + if (vdi_lock_check(core_idx) == 0) + return 0; + + // this thread not holding the mutex or no one is holding the mutex + // go to locked the mutex + vdi_lock(core_idx); + + return 1; +} + +int vdi_lock(unsigned long core_idx) +{ + vdi_info_t *vdi; +#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP) + int ret = 0; +#else + const int MUTEX_TIMEOUT = 0x7fffffff; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + +#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP) + ret = MUTEX_LOCK((MUTEX_HANDLE *)vdi->vpu_mutex); + + // might see we already hold the mutex, which means that we lock it more than one time + if (ret) + CVI_VC_ERR("Mutex lock failed %d\n", ret); +#else + if (MUTEX_LOCK((MUTEX_HANDLE *)vdi->vpu_mutex) != 0) { + CVI_VC_ERR("failed to pthread_mutex_lock\n"); + return -1; + } +#endif + + return 0; +} + +/* + return value : + -1 : Means that this thread didn't locked the mutex + 0 : Means that this thread had locked the mutex +*/ +int vdi_lock_check(unsigned long core_idx) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + if (mutex_is_locked(vdi->vpu_mutex)) { + return 0; + } else { + return -1; + } + return 0; +} + +void vdi_unlock(unsigned long core_idx) +{ + vdi_info_t *vdi; + int ret = 0; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return; + } + + MUTEX_UNLOCK((MUTEX_HANDLE *)vdi->vpu_mutex); + + if (ret) + CVI_VC_ERR("unlock failed %d\n", ret); + + CVI_VC_LOCK("vpu_mutex, unlock\n"); +} + +int vdi_vcodec_trylock(unsigned long core_idx) +{ +#ifdef ARCH_CV183X +#else + core_idx = 0; +#endif + if (mutex_trylock(&vcodecLock[core_idx]) == 1) { + // mutex_trylock returns 1 if the mutex has been acquired successfully, + // and 0 on contention. + return 0; + } else { + return -EAGAIN; + } +} + +int vdi_vcodec_timelock(unsigned long core_idx, int timeout_ms) +{ + int ret; + +#ifdef ARCH_CV183X +#else + core_idx = 0; +#endif +//1ms = 1000000ns + do { + int wait_cnt_ms = 1; + + while (mutex_is_locked(&vcodecLock[core_idx])) { + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(usecs_to_jiffies(1000)); + if (wait_cnt_ms >= timeout_ms) { + break; + } + wait_cnt_ms++; + } + } while (0); + + ret = mutex_trylock(&vcodecLock[core_idx]); + // mutex_trylock returns 1 if the mutex has been acquired successfully, + // and 0 on contention. + if (ret == 1) { + ret = 0; + } else { + ret = ETIMEDOUT; + } + + if (ret != 0) { + if (ret == ETIMEDOUT) + CVI_VC_LOCK("lock timeout %d time[%d]\n", ret, + timeout_ms); + else + CVI_VC_ERR("lock error %d\n", ret); + + return ret; + //timelock failure , return -1 + } else { + //timelock success + return 0; + } +} + +/* vdi_vcodec_lock: lock for all threads in one process, + * which data structure is saved in user space. + */ +void vdi_vcodec_lock(unsigned long core_idx) +{ +#ifdef ARCH_CV183X +#else + core_idx = 0; +#endif + MUTEX_LOCK(&vcodecLock[core_idx]); +} + +void vdi_vcodec_unlock(unsigned long core_idx) +{ +#ifdef ARCH_CV183X +#else + core_idx = 0; +#endif + MUTEX_UNLOCK(&vcodecLock[core_idx]); +} + +static vdi_info_t *vdi_get_vdi_info(unsigned long core_idx) +{ + vdi_info_t *vdi; + + if (core_idx >= MAX_NUM_VPU_CORE) + return NULL; + + vdi = s_vdi_info[core_idx]; + + if (!vdi || vdi->vpu_fd == -1 || vdi->vpu_fd == 0x00) { + CVI_VC_WARN("lock failed, vdi %p, ret %p\n", vdi, + __builtin_return_address(0)); + if (vdi) + CVI_VC_WARN("core_idx %lu with vpu_fd %d\n", core_idx, + vdi->vpu_fd); + return NULL; + } + + return vdi; +} + +int vdi_disp_lock(unsigned long core_idx) +{ + vdi_info_t *vdi; +#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP) +#else + const int MUTEX_TIMEOUT = 5000; // ms +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + +#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP) + MUTEX_LOCK((MUTEX_HANDLE *)vdi->vpu_disp_mutex); +#else + if (MUTEX_LOCK((MUTEX_HANDLE *)vdi->vpu_disp_mutex) != 0) { + CVI_VC_ERR("failed to pthread_mutex_lock\n"); + return -1; + } + +#endif /* ANDROID */ + + return 0; +} + +void vdi_disp_unlock(unsigned long core_idx) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return; + } + + MUTEX_UNLOCK((MUTEX_HANDLE *)vdi->vpu_disp_mutex); +} + +void vdi_write_register(unsigned long core_idx, unsigned long addr, + unsigned int data) +{ + vdi_info_t *vdi; + unsigned long *reg_addr; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return; + } + + if (vdi->clock_state == 0) { + vdi_set_clock_gate(core_idx, CLK_ENABLE); + } + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + reg_addr = + (unsigned long *)(addr + + (unsigned long)vdi->vdb_register.virt_addr + + (core_idx * VPU_CORE_BASE_OFFSET)); +#else + reg_addr = + (unsigned long *)(addr + + (unsigned long)vdi->vdb_register.virt_addr); +#endif + + CVI_VC_REG("write, %p = 0x%X\n", reg_addr, data); + + writel(data, reg_addr); +} + +unsigned int vdi_read_register(unsigned long core_idx, unsigned long addr) +{ + vdi_info_t *vdi; + unsigned long *reg_addr; + unsigned int value; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return (unsigned int)-1; + } + + if (vdi->clock_state == 0) { + vdi_set_clock_gate(core_idx, CLK_ENABLE); + } + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + reg_addr = + (unsigned long *)(addr + + (unsigned long)vdi->vdb_register.virt_addr + + (core_idx * VPU_CORE_BASE_OFFSET)); +#else + reg_addr = + (unsigned long *)(addr + + (unsigned long)vdi->vdb_register.virt_addr); +#endif + + value = readl(reg_addr); + + CVI_VC_REG("read, %p, 0x%X\n", reg_addr, value); + + return value; +} + +#define FIO_TIMEOUT 100 + +unsigned int vdi_fio_read_register(unsigned long core_idx, unsigned long addr) +{ + unsigned int ctrl; + unsigned int count = 0; + unsigned int data = 0xffffffff; + + ctrl = (addr & 0xffff); + ctrl |= (0 << 16); /* read operation */ + vdi_write_register(core_idx, W4_VPU_FIO_CTRL_ADDR, ctrl); + count = FIO_TIMEOUT; + while (count--) { + ctrl = vdi_read_register(core_idx, W4_VPU_FIO_CTRL_ADDR); + if (ctrl & 0x80000000) { + data = vdi_read_register(core_idx, W4_VPU_FIO_DATA); + break; + } + } + + return data; +} + +void vdi_fio_write_register(unsigned long core_idx, unsigned long addr, + unsigned int data) +{ + unsigned int ctrl; + + vdi_write_register(core_idx, W4_VPU_FIO_DATA, data); + ctrl = (addr & 0xffff); + ctrl |= (1 << 16); /* write operation */ + vdi_write_register(core_idx, W4_VPU_FIO_CTRL_ADDR, ctrl); +} + +#define VCORE_DBG_ADDR(__vCoreIdx) (0x8000 + (0x1000 * __vCoreIdx) + 0x300) +#define VCORE_DBG_DATA(__vCoreIdx) (0x8000 + (0x1000 * __vCoreIdx) + 0x304) +#define VCORE_DBG_READY(__vCoreIdx) (0x8000 + (0x1000 * __vCoreIdx) + 0x308) + +#ifdef REDUNDENT_CODE +static void UNREFERENCED_FUNCTION write_vce_register(unsigned int core_idx, + unsigned int vce_core_idx, + unsigned int vce_addr, + unsigned int udata) +{ + int vcpu_reg_addr; + unsigned int i = 0; + + vdi_fio_write_register(core_idx, VCORE_DBG_READY(vce_core_idx), 0); + + vcpu_reg_addr = vce_addr >> 2; + + vdi_fio_write_register(core_idx, VCORE_DBG_DATA(vce_core_idx), udata); + vdi_fio_write_register(core_idx, VCORE_DBG_ADDR(vce_core_idx), + (vcpu_reg_addr)&0x00007FFF); + + for (i = 0; i < 16; i++) { + unsigned int vcpu_reg_val = + vdi_fio_read_register(0, VCORE_DBG_READY(vce_core_idx)); + if ((vcpu_reg_val >> 31) & 0x1) + CVI_VC_ERR("failed to write VCE register: 0x%04x\n", + vce_addr); + else + break; + } +} +#endif + +#ifdef ENABLE_CNM_DEBUG_MSG +static unsigned int read_vce_register(unsigned int core_idx, + unsigned int vce_core_idx, + unsigned int vce_addr) +{ + int vcpu_reg_addr; + int udata; + int vce_core_base = 0x8000 + 0x1000 * vce_core_idx; + + vdi_fio_write_register(core_idx, VCORE_DBG_READY(vce_core_idx), 0); + + vcpu_reg_addr = vce_addr >> 2; + + vdi_fio_write_register(core_idx, VCORE_DBG_ADDR(vce_core_idx), + vcpu_reg_addr + vce_core_base); + + while (TRUE) { + if (vdi_fio_read_register(0, VCORE_DBG_READY(vce_core_idx)) == + 1) { + udata = vdi_fio_read_register( + 0, VCORE_DBG_DATA(vce_core_idx)); + break; + } + } + + return udata; +} +#endif + +int vdi_clear_memory(unsigned long core_idx, PhysicalAddress addr, int len) +{ + vdi_info_t *vdi; + vpudrv_buffer_t vdb; + unsigned long offset; + + int i; + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 1) { + vdb = vdi->vpu_buffer_pool[i].vdb; + if (addr >= vdb.phys_addr && + addr < (vdb.phys_addr + vdb.size)) + break; + } + } + + if (!vdb.size) { + CVI_VC_ERR("address 0x%08x is not mapped address!!!\n", + (int)addr); + return -1; + } + + offset = addr - (unsigned long)vdb.phys_addr; + osal_memset((void *)((unsigned long)vdb.virt_addr + offset), 0x00, len); + + return len; +} + +#ifdef REDUNDENT_CODE +void vdi_set_sdram(unsigned long core_idx, unsigned long addr, int len, + int endian) +{ + vdi_info_t *vdi; + unsigned char *buf; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return; + } + + buf = (unsigned char *)osal_malloc(len); + osal_memset(buf, 0x00, len); + vdi_write_memory(core_idx, addr, buf, len, endian); + osal_free(buf); +} +#endif + +int vdi_write_memory(unsigned long core_idx, PhysicalAddress addr, + unsigned char *data, int len, int endian) +{ + vdi_info_t *vdi; + vpudrv_buffer_t vdb; + PhysicalAddress offset; + int i; + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 1) { + vdb = vdi->vpu_buffer_pool[i].vdb; + if (addr >= vdb.phys_addr && + addr < (vdb.phys_addr + vdb.size)) { + break; + } + } + } + + if (!vdb.size) { + CVI_VC_ERR("address 0x%08x is not mapped address!!!\n", + (int)addr); + return -1; + } + + offset = addr - vdb.phys_addr; + swap_endian(core_idx, data, len, endian); + osal_memcpy((void *)((__u8 *)vdb.virt_addr + offset), data, len); + + return len; +} + +int vdi_read_memory(unsigned long core_idx, PhysicalAddress addr, + unsigned char *data, int len, int endian) +{ + vdi_info_t *vdi; + vpudrv_buffer_t vdb; + PhysicalAddress offset; + int i; +#if DEBUG_MEMCPY + unsigned char *buf; +#endif +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 1) { + vdb = vdi->vpu_buffer_pool[i].vdb; + if (addr >= vdb.phys_addr && + addr < (vdb.phys_addr + vdb.size)) + break; + } + } + + if (!vdb.size) { + return -1; + } + + CVI_VC_TRACE( + "i = %d, addr = 0x%llX, phys_addr = 0x%llX, virt_addr = %p, data = 0x%p\n", + i, addr, vdb.phys_addr, (void *)vdb.virt_addr, data); + + offset = addr - (unsigned long)vdb.phys_addr; + +#if DEBUG_MEMCPY + __u8 *srcAddr; + + srcAddr = ((__u8 *)vdb.virt_addr + offset); + CVI_VC_TRACE("srcAddr = %p, len = 0x%X\n", srcAddr, len); + + buf = (Uint8 *)osal_malloc(0x5000); + if (buf == NULL) { + CVI_VC_ERR("osal_malloc\n"); + return FALSE; + } + CVI_VC_TRACE("buf = 0x%lX, srcAddr = 0x%lX, len = 0x%X\n", buf, srcAddr, + len & (~0x7)); + osal_memcpy(buf, (const void *)srcAddr, len & (~0x7)); + CVI_VC_TRACE("\n"); + swap_endian(core_idx, buf, len, endian); +#else + osal_memcpy(data, (const void *)((__u8 *)vdb.virt_addr + offset), len); + swap_endian(core_idx, data, len, endian); +#endif + + CVI_VC_TRACE("\n"); + + return len; +} + +void *vdi_get_vir_addr(unsigned long core_idx, PhysicalAddress addr) +{ + vdi_info_t *vdi; + vpudrv_buffer_t vdb; + PhysicalAddress offset; + __u8 *srcAddr; + int i; + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return NULL; + } + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 1) { + vdb = vdi->vpu_buffer_pool[i].vdb; + if (addr >= vdb.phys_addr && + addr < (vdb.phys_addr + vdb.size)) + break; + } + } + + if (!vdb.size) { + CVI_VC_ERR("size = %d\n", vdb.size); + return NULL; + } + + CVI_VC_TRACE( + "i = %d, addr = 0x%llX, phys_addr = 0x%llX, virt_addr = %p\n", + i, addr, vdb.phys_addr, (void *)vdb.virt_addr); + + offset = addr - (unsigned long)vdb.phys_addr; + + srcAddr = ((__u8 *)vdb.virt_addr + offset); + CVI_VC_TRACE("srcAddr = %p\n", srcAddr); + + return srcAddr; +} + +#ifdef ARCH_CV182X +static BOOL vdi_is_share_single_es_buf(unsigned long core_idx, + unsigned int single_es_buf_size, + vdi_info_t **ppVdiSwitch) +{ + unsigned long coreIdxSwitch; + vdi_info_t *vdiSwitch; + BOOL bSharingSingleEsBuf = FALSE; + + coreIdxSwitch = (core_idx + 1) % MAX_NUM_VPU_CORE; + vdiSwitch = vdi_get_vdi_info(coreIdxSwitch); + + // other codec type also enable singleEsBuf flag, + // as well as with the same es buffer size + if (vdiSwitch != NULL && vdiSwitch->singleEsBuf && + vdiSwitch->single_es_buf_size == single_es_buf_size) { + bSharingSingleEsBuf = TRUE; + *ppVdiSwitch = vdiSwitch; + } + CVI_VC_TRACE("bSharingSingleEsBuf %d, vdiSwitch %p\n", + bSharingSingleEsBuf, vdiSwitch); + return bSharingSingleEsBuf; +} + +static void vdi_share_single_es_buf(unsigned long core_idx, vdi_info_t *vdi, + BOOL *pbReUsedEsBuf) +{ + vdi_info_t *vdiSwitch = NULL; + + if (vdi_is_share_single_es_buf(core_idx, vdi->single_es_buf_size, + &vdiSwitch)) { + int i; + + memcpy(&vdi->vdb_bitstream, &vdiSwitch->vdb_bitstream, + sizeof(vpudrv_buffer_t)); + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 0) { + vdi->vpu_buffer_pool_count++; + vdi->vpu_buffer_pool[i].inuse = 1; + memcpy(&vdi->vpu_buffer_pool[i].vdb, + &vdi->vdb_bitstream, + sizeof(vpudrv_buffer_t)); + break; + } + } + + *pbReUsedEsBuf = TRUE; + } + CVI_VC_INFO("bReUsedEsBuf %d\n", *pbReUsedEsBuf); +} +#endif + +int vdi_allocate_single_es_buf_memory(unsigned long core_idx, + vpu_buffer_t *vb) // saw not lock +{ + vdi_info_t *vdi; +#if defined(CVI_H26X_USE_ION_MEM) +#if defined(BITSTREAM_ION_CACHED_MEM) + int bBsStreamCached = 1; +#else + int bBsStreamCached = 0; +#endif +#endif +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + BOOL bReUsedEsBuf = FALSE; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + +#ifdef ARCH_CV182X + vdi_share_single_es_buf(core_idx, vdi, &bReUsedEsBuf); +#endif + + if (vdi->task_num > 1 || bReUsedEsBuf) { + vb->phys_addr = vdi->vdb_bitstream.phys_addr; + vb->base = vdi->vdb_bitstream.base; + vb->virt_addr = vdi->vdb_bitstream.virt_addr; + } else { + strncpy(ionName, "singleEsBuf", MAX_VPU_ION_BUFFER_NAME); + if (VDI_ALLOCATE_MEMORY(core_idx, vb, bBsStreamCached, + ionName) < 0) { + CVI_VC_ERR( + "[VDI] fail to vdi_allocate_single_es_buf_memory size=%d\n", + vb->size); + return -1; + } + vdi->vdb_bitstream.size = vb->size; + vdi->vdb_bitstream.phys_addr = vb->phys_addr; + vdi->vdb_bitstream.base = vb->base; + vdi->vdb_bitstream.virt_addr = vb->virt_addr; + } + + CVI_VC_MEM("physaddr=%llx, virtaddr=%p~%p, size=0x%x\n", + vb->phys_addr, (void *)vb->virt_addr, + (void *)(vb->virt_addr + vb->size), vb->size); + + return 0; +} + +void vdi_free_single_es_buf_memory(unsigned long core_idx, vpu_buffer_t *vb) +{ + vdi_info_t *vdi; + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return; + } + + if (vdi->task_num == 1) { +#ifdef ARCH_CV182X + vdi_info_t *vdiSwitch = NULL; + + if (vdi_is_share_single_es_buf(core_idx, + vdi->single_es_buf_size, + &vdiSwitch) == FALSE) +#endif + { + CVI_VC_MEM( + "relese physaddr=%llx, virtaddr=%p~%p, size=0x%x\n", + vb->phys_addr, (void *)vb->virt_addr, + (void *)(vb->virt_addr + vb->size), vb->size); + VDI_FREE_MEMORY(core_idx, vb); + } + osal_memset(&vdi->vdb_bitstream, 0x00, sizeof(vpudrv_buffer_t)); + } +} + +int vdi_attach_dma_memory(unsigned long core_idx, vpu_buffer_t *vb) +{ + vdi_info_t *vdi; + int i; + vpudrv_buffer_t vdb; + int locked = 0; + int ret = 0; + + locked = vdi_check_lock_by_me(core_idx); + if (locked < 0) { + CVI_VC_ERR("lock failed\n"); + return -1; + } + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + ret = -1; + goto ATTACH_DMA_ERROR; + } + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + vdb.size = vb->size; + vdb.phys_addr = vb->phys_addr; + vdb.base = vb->base; + + vdb.virt_addr = vb->virt_addr; + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].vdb.phys_addr == vb->phys_addr) { + vdi->vpu_buffer_pool[i].vdb = vdb; + vdi->vpu_buffer_pool[i].inuse = 1; + break; + } + if (vdi->vpu_buffer_pool[i].inuse == 0) { + vdi->vpu_buffer_pool[i].vdb = vdb; + vdi->vpu_buffer_pool_count++; + vdi->vpu_buffer_pool[i].inuse = 1; + break; + } + } + + CVI_VC_MEM("physaddr=0x%llx, virtaddr=%p, size=0x%x, index=%d\n", + vb->phys_addr, vb->virt_addr, vb->size, i); + +ATTACH_DMA_ERROR: + if (locked == 1) + vdi_unlock(core_idx); + + return ret; +} + +int vdi_dettach_dma_memory(unsigned long core_idx, vpu_buffer_t *vb) +{ + vdi_info_t *vdi; + int i; + int locked = 0; + int ret = 0; + + locked = vdi_check_lock_by_me(core_idx); + if (locked < 0) { + CVI_VC_ERR("lock failed\n"); + return -1; + } + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + ret = -1; + goto DETCH_DMA_ERROR; + } + + if (!vb || vb->size == 0) { + CVI_VC_ERR("null vb or zero vb size\n"); + ret = -1; + goto DETCH_DMA_ERROR; + } + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].vdb.phys_addr == vb->phys_addr) { + vdi->vpu_buffer_pool[i].inuse = 0; + vdi->vpu_buffer_pool_count--; + break; + } + } + +DETCH_DMA_ERROR: + if (locked == 1) + vdi_unlock(core_idx); + + return ret; +} + +#ifdef CVI_H26X_USE_ION_MEM + +int vdi_allocate_ion_memory(unsigned long core_idx, vpu_buffer_t *vb, + int is_cached, const char *str) +{ + vdi_info_t *vdi; + int i; + vpudrv_buffer_t vdb; + int locked = 0; + int ret = 0; + + locked = vdi_check_lock_by_me(core_idx); + if (locked < 0) { + CVI_VC_ERR("[VDI] lock failed\n"); + return -1; + } + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("[VDI] vdi_get_vdi_info\n"); + ret = -1; + goto ALLOCATE_ION_ERROR; + } + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + vdb.size = vb->size; + + if (sys_ion_alloc_nofd((uint64_t *)&vb->phys_addr, (void **)&vb->virt_addr, + (uint8_t *)str, vb->size, is_cached) != 0) { + CVI_VC_ERR("[VDI] fail to allocate ion memory. size=%d\n", + vb->size); + ret = -1; + goto ALLOCATE_ION_ERROR; + } + vdb.phys_addr = vb->phys_addr; + vdb.virt_addr = vb->virt_addr; + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 0) { + vdi->vpu_buffer_pool_count++; + vdi->vpu_buffer_pool[i].inuse = 1; + memcpy(&vdi->vpu_buffer_pool[i].vdb, &vdb, + sizeof(vpudrv_buffer_t)); + break; + } + } + + if (i >= MAX_VPU_BUFFER_POOL) { + CVI_VC_ERR("[VDI] vpu_buffer_pool out of limitation!\n"); + ret = -1; + goto ALLOCATE_ION_ERROR; + } + + CVI_VC_MEM("physaddr=%llx, virtaddr=%p~%p, size=0x%x, cached=%d\n", + vb->phys_addr, (void *)vb->virt_addr, + (void *)(vb->virt_addr + vb->size), vb->size, is_cached); + +ALLOCATE_ION_ERROR: + if (locked == 1) + vdi_unlock(core_idx); + + return ret; +} + +void vdi_free_ion_memory(unsigned long core_idx, vpu_buffer_t *vb) +{ + vdi_info_t *vdi; + int i; + vpudrv_buffer_t *p_vdb; + int locked = 0; + + locked = vdi_check_lock_by_me(core_idx); + if (locked < 0) { + CVI_VC_ERR("lock failed\n"); + return; + } + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + goto FREE_ION_ERROR; + } + + if (!vb || vb->size == 0) + goto FREE_ION_ERROR; + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].vdb.phys_addr == vb->phys_addr) { + p_vdb = &vdi->vpu_buffer_pool[i].vdb; + vdi->vpu_buffer_pool[i].inuse = 0; + vdi->vpu_buffer_pool_count--; + break; + } + } + + if (i >= MAX_VPU_BUFFER_POOL) { + CVI_VC_ERR("[VDI] vpu_buffer_pool out of limitation!\n"); + goto FREE_ION_ERROR; + } + + CVI_VC_MEM("physaddr=%llx, virtaddr=%p~%p, size=0x%x\n", + p_vdb->phys_addr, p_vdb->virt_addr, + (void *)(p_vdb->virt_addr + p_vdb->size), p_vdb->size); + + if (!p_vdb->size) { + CVI_VC_ERR("[VDI] invalid buffer to free address = %p\n", + p_vdb->virt_addr); + goto FREE_ION_ERROR; + } + + if (sys_ion_free_nofd((uint64_t)vb->phys_addr) != 0) { + CVI_VC_ERR("[VDI] fail to free ion phys_addr = 0x%llx\n", + vb->phys_addr); + goto FREE_ION_ERROR; + } + + osal_memset(p_vdb, 0x0, sizeof(vpudrv_buffer_t)); + osal_memset(vb, 0, sizeof(vpu_buffer_t)); + +FREE_ION_ERROR: + if (locked == 1) + vdi_unlock(core_idx); +} + +int vdi_invalidate_ion_cache(uint64_t u64PhyAddr, void *pVirAddr, + uint32_t u32Len) +{ + return sys_cache_invalidate(u64PhyAddr, phys_to_virt(u64PhyAddr), u32Len); +} + +int vdi_flush_ion_cache(uint64_t u64PhyAddr, void *pVirAddr, uint32_t u32Len) +{ + return sys_cache_flush(u64PhyAddr, phys_to_virt(u64PhyAddr), u32Len); +} + +#else //CVI_H26X_USE_ION_MEM + +int vdi_allocate_dma_memory(unsigned long core_idx, + vpu_buffer_t *vb) // saw not lock +{ + vdi_info_t *vdi; + int i; + vpudrv_buffer_t vdb; + int locked = 0; + int ret = 0; + + locked = vdi_check_lock_by_me(core_idx); + if (locked < 0) { + CVI_VC_ERR("lock failed\n"); + return -1; + } + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + ret = -1; + goto ALLOCATE_DMA_ERROR; + } + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + vdb.size = vb->size; + + if (ioctl(vdi->vpu_fd, VDI_IOCTL_ALLOCATE_PHYSICAL_MEMORY, &vdb) < 0) { + CVI_VC_ERR("[VDI] fail to vdi_allocate_dma_memory size=%d\n", + vb->size); + ret = -1; + goto ALLOCATE_DMA_ERROR; + } + + vb->phys_addr = vdb.phys_addr; + vb->base = vdb.base; + + // map to virtual address + vdb.virt_addr = MMAP(NULL, vdb.size, PROT_READ | PROT_WRITE, MAP_SHARED, + vdi->vpu_fd, vdb.phys_addr); + if ((void *)vdb.virt_addr == MAP_FAILED) { + CVI_VC_ERR("[VDI]MAP_FAILED %llx size %x\n", vdb.phys_addr, + vdb.size); + memset(vb, 0x00, sizeof(vpu_buffer_t)); + ret = -1; + goto ALLOCATE_DMA_ERROR; + } + vb->virt_addr = vdb.virt_addr; + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 0) { + memcpy(&vdi->vpu_buffer_pool[i].vdb, &vdb, + sizeof(vpudrv_buffer_t)); + vdi->vpu_buffer_pool[i].inuse = 1; + vdi->vpu_buffer_pool_count++; + break; + } + } + + assert(i < MAX_VPU_BUFFER_POOL); + + CVI_VC_MEM("physaddr=%llx, virtaddr=%p~%p, size=0x%x\n", + vb->phys_addr, (void *)vb->virt_addr, + (void *)(vb->virt_addr + vb->size), vb->size); + +ALLOCATE_DMA_ERROR: + if (locked == 1) + vdi_unlock(core_idx); + + return ret; +} + +void vdi_free_dma_memory(unsigned long core_idx, vpu_buffer_t *vb) +{ + vdi_info_t *vdi; + int i; + vpudrv_buffer_t *p_vdb; + int locked = 0; + + locked = vdi_check_lock_by_me(core_idx); + if (locked < 0) { + CVI_VC_ERR("lock failed\n"); + return; + } + +#ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER + core_idx = 0; +#endif + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + goto FREE_DMA_ERROR; + } + + if (!vb || vb->size == 0) { + CVI_VC_ERR("null vb or zero vb size\n"); + goto FREE_DMA_ERROR; + } + + for (i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].vdb.phys_addr == vb->phys_addr) { + p_vdb = &vdi->vpu_buffer_pool[i].vdb; + vdi->vpu_buffer_pool[i].inuse = 0; + vdi->vpu_buffer_pool_count--; + break; + } + } + + assert(i < MAX_VPU_BUFFER_POOL); + + CVI_VC_MEM("physaddr=%llx, virtaddr=%p~%p, size=0x%x\n", + p_vdb->phys_addr, (void *)p_vdb->virt_addr, + (void *)(p_vdb->virt_addr + p_vdb->size), p_vdb->size); + + if (!p_vdb->size) { + CVI_VC_ERR("[VDI] invalid buffer to free address = %p\n", + p_vdb->virt_addr); + goto FREE_DMA_ERROR; + } + + ioctl(vdi->vpu_fd, VDI_IOCTL_FREE_PHYSICALMEMORY, p_vdb); + + if (munmap((void *)p_vdb->virt_addr, p_vdb->size) != 0) { + CVI_VC_ERR("[VDI] fail to munmap virtial address = %p\n", + p_vdb->virt_addr); + } + osal_memset(p_vdb, 0x0, sizeof(vpudrv_buffer_t)); + osal_memset(vb, 0x0, sizeof(vpu_buffer_t)); + +FREE_DMA_ERROR: + if (locked == 1) + vdi_unlock(core_idx); +} + +#endif + +static unsigned int _get_sram_size(vdi_info_t *vdi) +{ + switch (vdi->chip_version) { + case CHIP_ID_1821A: + switch (vdi->product_code) { + case CODA980_CODE: + return VDI_SRAM_SIZE_CODA9_1821A; + case WAVE420L_CODE: + return VDI_SRAM_SIZE_WAVE420L_1821A; + } + break; + + case CHIP_ID_1822: + switch (vdi->product_code) { + case CODA980_CODE: + return VDI_SRAM_SIZE_CODA9_1822; + case WAVE420L_CODE: + return VDI_SRAM_SIZE_WAVE420L_1822; + } + break; + + case CHIP_ID_1835: + switch (vdi->product_code) { + case CODA980_CODE: + return VDI_SRAM_SIZE_CODA9_1835; + case WAVE420L_CODE: + return VDI_SRAM_SIZE_WAVE420L_1835; + } + break; + } + + CVI_VC_ERR("chip_version = 0x%x, product_code = 0x%x\n", + vdi->chip_version, vdi->product_code); + return 0; +} + +int vdi_get_sram_memory(unsigned long core_idx, vpu_buffer_t *vb) +{ + vdi_info_t *vdi = NULL; + vpudrv_buffer_t vdb; + unsigned int sram_size = 0; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + if (!vb) + return -1; + + osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t)); + + sram_size = _get_sram_size(vdi); + CVI_VC_TRACE("sram_size = 0x%X\n", sram_size); + + if (sram_size > 0) // if we can know the sram address directly in vdi + // layer, we use it first for sdram address + { + vb->phys_addr = VDI_SRAM_BASE_ADDR; + // base addr to + // VDI_SRAM_BASE_ADDR. + vb->size = sram_size; + + return 0; + } + + return 0; +} + +int vdi_set_clock_gate(unsigned long core_idx, int enable) +{ + vdi_info_t *vdi = NULL; + int ret = 0; + struct clk_ctrl_info info; + + vdi = vdi_get_vdi_info(core_idx); + + if (!vdi) { + CVI_VC_WARN("vdi_get_vdi_info\n"); + return -1; + } + + if (vdi->product_code == WAVE510_CODE || + vdi->product_code == WAVE512_CODE || + vdi->product_code == WAVE515_CODE) { + CVI_VC_ERR("product code error\n"); + return 0; + } + + // if clk is already on, return + if (enable && vdi_get_clock_gate(core_idx) == 1) + return 1; + + // if clk is already off, return + if (!enable && vdi_get_clock_gate(core_idx) == 0) + return 1; + + vdi->clock_state = enable; + + info.core_idx = core_idx; + info.enable = enable; + + ret = vpu_set_clock_gate_ext((void *)&info); + return ret; +} + +int vdi_get_clock_gate(unsigned long core_idx) +{ + vdi_info_t *vdi; + int ret; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + ret = vdi->clock_state; + return ret; +} + +int vdi_wait_bus_busy(unsigned long core_idx, int timeout, + unsigned int gdi_busy_flag) +{ + Int64 elapse, cur; + vdi_timeval_t tv; + vdi_info_t *vdi; + + vdi = s_vdi_info[core_idx]; + + cviGetSysTime(&tv); + elapse = tv.tv_sec * 1000 + tv.tv_usec / 1000; + + while (1) { + if (vdi->product_code == WAVE420L_CODE) { + if (vdi_fio_read_register(core_idx, gdi_busy_flag) == + 0) { + break; + } + } else if (vdi->product_code == WAVE520_CODE) { + if (vdi_fio_read_register(core_idx, gdi_busy_flag) == + 0x3f) + break; + } else if (PRODUCT_CODE_W_SERIES(vdi->product_code)) { + if (vdi_fio_read_register(core_idx, gdi_busy_flag) == + 0x738) + break; + } else if (PRODUCT_CODE_NOT_W_SERIES(vdi->product_code)) { + if (vdi_read_register(core_idx, gdi_busy_flag) == 0x77) + break; + } else { + CVI_VC_ERR("Unknown product id : %08x\n", + vdi->product_code); + return -1; + } + + if (timeout > 0) { + cviGetSysTime(&tv); + cur = tv.tv_sec * 1000 + tv.tv_usec / 1000; + + if ((cur - elapse) > timeout) { + CVI_VC_ERR( + "[VDI] vdi_wait_bus_busy timeout, PC=0x%x\n", + vdi_read_register(core_idx, 0x018)); + return -1; + } + } + } + return 0; +} + +int vdi_wait_vpu_busy(unsigned long core_idx, int timeout, + unsigned int addr_bit_busy_flag) +{ + Int64 elapse, cur; + vdi_timeval_t tv; + Uint32 pc; + Uint32 code, normalReg = TRUE; + + cviGetSysTime(&tv); + elapse = tv.tv_sec * 1000 + tv.tv_usec / 1000; + + code = vdi_read_register(core_idx, VPU_PRODUCT_CODE_REGISTER); + /* read product code */ + if (PRODUCT_CODE_W_SERIES(code)) { + pc = W4_VCPU_CUR_PC; + if (addr_bit_busy_flag & 0x8000) + normalReg = FALSE; + } else if (PRODUCT_CODE_NOT_W_SERIES(code)) { + pc = BIT_CUR_PC; + } else { + CVI_VC_ERR("Unknown product id : %08x\n", code); + return -1; + } + + while (1) { + if (normalReg == TRUE) { + if (vdi_read_register(core_idx, addr_bit_busy_flag) == + 0) + break; + } else { + if (vdi_fio_read_register(core_idx, + addr_bit_busy_flag) == 0) + break; + } + + if (timeout > 0) { + cviGetSysTime(&tv); + cur = tv.tv_sec * 1000 + tv.tv_usec / 1000; + + if ((cur - elapse) > timeout) { + Uint32 index; + for (index = 0; index < 50; index++) { + CVI_VC_ERR("[VDI] timeout, PC=0x%x\n", + vdi_read_register(core_idx, + pc)); + } + return -1; + } + } + } + return 0; +} + +int vdi_wait_interrupt(unsigned long coreIdx, int timeout, + uint64_t *pu64TimeStamp) +{ + int intr_reason = 0; + int ret; + vdi_info_t *vdi; + vpudrv_intr_info_t intr_info; + + vdi = vdi_get_vdi_info(coreIdx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + +#ifdef SUPPORT_INTERRUPT + intr_info.timeout = timeout; + intr_info.intr_reason = 0; + intr_info.coreIdx = coreIdx; + ret = vpu_wait_interrupt((void *)&intr_info); + if (ret != 0) + return -1; + intr_reason = intr_info.intr_reason; + if (pu64TimeStamp) { + *pu64TimeStamp = ((long int)intr_info.intr_tv_sec * 1000000) + + ((long int)intr_info.intr_tv_nsec / 1000); + } +#else + vdi_timeval_t tv; + Uint32 intrStatusReg; + Uint32 pc; + Int32 startTime, endTime, elaspedTime; + + UNREFERENCED_PARAMETER(intr_info); + + if (PRODUCT_CODE_W_SERIES(vdi->product_code)) { + pc = W4_VCPU_CUR_PC; + intrStatusReg = W4_VPU_VPU_INT_STS; + } else if (PRODUCT_CODE_NOT_W_SERIES(vdi->product_code)) { + pc = BIT_CUR_PC; + intrStatusReg = BIT_INT_STS; + } else { + CVI_VC_ERR("Unknown product id : %08x\n", vdi->product_code); + return -1; + } + + cviGetSysTime(&tv); + startTime = tv.tv_sec * 1000 + tv.tv_usec / 1000; + while (TRUE) { + if (vdi_read_register(coreIdx, intrStatusReg)) { + intr_reason = + vdi_read_register(coreIdx, addr_bit_int_reason); + if (intr_reason) + break; + } + + cviGetSysTime(&tv); + endTime = tv.tv_sec * 1000 + tv.tv_usec / 1000; + if (timeout > 0 && (endTime - startTime) >= timeout) { + return -1; + } + } +#endif + + return intr_reason; +} + +#ifdef DBG_CNM +static int read_pinfo_buffer(int core_idx, int addr) +{ + int ack; + int rdata; +#define VDI_LOG_GDI_PINFO_ADDR (0x1068) +#define VDI_LOG_GDI_PINFO_REQ (0x1060) +#define VDI_LOG_GDI_PINFO_ACK (0x1064) +#define VDI_LOG_GDI_PINFO_DATA (0x106c) + //------------------------------------------ + // read pinfo - indirect read + // 1. set read addr (GDI_PINFO_ADDR) + // 2. send req (GDI_PINFO_REQ) + // 3. wait until ack==1 (GDI_PINFO_ACK) + // 4. read data (GDI_PINFO_DATA) + //------------------------------------------ + vdi_write_register(core_idx, VDI_LOG_GDI_PINFO_ADDR, addr); + vdi_write_register(core_idx, VDI_LOG_GDI_PINFO_REQ, 1); + + ack = 0; + while (ack == 0) { + ack = vdi_read_register(core_idx, VDI_LOG_GDI_PINFO_ACK); + } + + rdata = vdi_read_register(core_idx, VDI_LOG_GDI_PINFO_DATA); + + // printf("[READ PINFO] ADDR[%x], DATA[%x]", addr, rdata); + return rdata; +} + +enum { VDI_PRODUCT_ID_980, VDI_PRODUCT_ID_960 }; + +static void printf_gdi_info(int core_idx, int num, int reset) +{ + int i = 0; + int bus_info_addr = 0; + int tmp = 0; + int val = 0; + int productId = 0; + + val = vdi_read_register(core_idx, VPU_PRODUCT_CODE_REGISTER); + if ((val & 0xff00) == 0x3200) + val = 0x3200; + + if (PRODUCT_CODE_W_SERIES(val)) { + return; + } else if (PRODUCT_CODE_NOT_W_SERIES(val)) { + if (val == CODA960_CODE || val == BODA950_CODE) + productId = VDI_PRODUCT_ID_960; + else if (val == CODA980_CODE || val == WAVE320_CODE) + productId = VDI_PRODUCT_ID_980; + } else { + CVI_VC_ERR("Unknown product id : %08x\n", val); + return; + } + + if (productId == VDI_PRODUCT_ID_980) + CVI_VC_INFO("\n**GDI information for GDI_20\n"); + else + CVI_VC_INFO("\n**GDI information for GDI_10\n"); + + for (i = 0; i < num; i++) { +#define VDI_LOG_GDI_INFO_CONTROL 0x1400 + if (productId == VDI_PRODUCT_ID_980) + bus_info_addr = VDI_LOG_GDI_INFO_CONTROL + i * (0x20); + else + bus_info_addr = VDI_LOG_GDI_INFO_CONTROL + i * 0x14; + if (reset) { + vdi_write_register(core_idx, bus_info_addr, 0x00); + bus_info_addr += 4; + vdi_write_register(core_idx, bus_info_addr, 0x00); + bus_info_addr += 4; + vdi_write_register(core_idx, bus_info_addr, 0x00); + bus_info_addr += 4; + vdi_write_register(core_idx, bus_info_addr, 0x00); + bus_info_addr += 4; + vdi_write_register(core_idx, bus_info_addr, 0x00); + + if (productId == VDI_PRODUCT_ID_980) { + bus_info_addr += 4; + vdi_write_register(core_idx, bus_info_addr, + 0x00); + + bus_info_addr += 4; + vdi_write_register(core_idx, bus_info_addr, + 0x00); + + bus_info_addr += 4; + vdi_write_register(core_idx, bus_info_addr, + 0x00); + } + } else { + CVI_VC_INFO("index = %02d", i); + + tmp = read_pinfo_buffer(core_idx, + bus_info_addr); // TiledEn<<20 + // ,GdiFormat<<17,IntlvCbCr,<<16 + // GdiYuvBufStride + CVI_VC_INFO(" control = 0x%08x", tmp); + + bus_info_addr += 4; + tmp = read_pinfo_buffer(core_idx, bus_info_addr); + CVI_VC_INFO(" pic_size = 0x%08x", tmp); + + bus_info_addr += 4; + tmp = read_pinfo_buffer(core_idx, bus_info_addr); + CVI_VC_INFO(" y-top = 0x%08x", tmp); + + bus_info_addr += 4; + tmp = read_pinfo_buffer(core_idx, bus_info_addr); + CVI_VC_INFO(" cb-top = 0x%08x", tmp); + + bus_info_addr += 4; + tmp = read_pinfo_buffer(core_idx, bus_info_addr); + CVI_VC_INFO(" cr-top = 0x%08x", tmp); + if (productId == VDI_PRODUCT_ID_980) { + bus_info_addr += 4; + tmp = read_pinfo_buffer(core_idx, + bus_info_addr); + CVI_VC_INFO(" y-bot = 0x%08x", tmp); + + bus_info_addr += 4; + tmp = read_pinfo_buffer(core_idx, + bus_info_addr); + CVI_VC_INFO(" cb-bot = 0x%08x", tmp); + + bus_info_addr += 4; + tmp = read_pinfo_buffer(core_idx, + bus_info_addr); + CVI_VC_INFO(" cr-bot = 0x%08x", tmp); + } + CVI_VC_INFO("\n"); + } + } +} +#endif + +#ifdef ENABLE_CNM_DEBUG_MSG +void vdi_print_vpu_status(unsigned long coreIdx) +{ + unsigned int product_code; + + product_code = vdi_read_register(coreIdx, VPU_PRODUCT_CODE_REGISTER); + + if (PRODUCT_CODE_W_SERIES(product_code)) { + unsigned long rd, wr; + unsigned int tq, ip, mc, lf; + unsigned int avail_cu, avail_tu, avail_tc, avail_lf, avail_ip; + unsigned int ctu_fsm, nb_fsm, cabac_fsm, cu_info, mvp_fsm, + tc_busy, lf_fsm, bs_data, bbusy, fv; + unsigned int reg_val; + unsigned int index; + unsigned int vcpu_reg[31] = { + 0, + }; + + pr_err("-------------------------------------------------------------------------------\n"); + pr_err("------ VCPU STATUS -----\n"); + pr_err("-------------------------------------------------------------------------------\n"); + rd = vdi_remap_memory_address( + coreIdx, VpuReadReg(coreIdx, W4_BS_RD_PTR)); + wr = vdi_remap_memory_address( + coreIdx, VpuReadReg(coreIdx, W4_BS_WR_PTR)); + pr_err("RD_PTR: 0x%lX WR_PTR: 0x%lX BS_OPT: 0x%08x BS_PARAM: 0x%08x\n", + rd, wr, VpuReadReg(coreIdx, W4_BS_OPTION), + VpuReadReg(coreIdx, W4_BS_PARAM)); + + // --------- VCPU register Dump + pr_err("[+] VCPU REG Dump\n"); + for (index = 0; index < 25; index++) { + VpuWriteReg(coreIdx, 0x14, (1 << 9) | (index & 0xff)); + vcpu_reg[index] = VpuReadReg(coreIdx, 0x1c); + + if (index < 16) { + pr_err("0x%08x\t", vcpu_reg[index]); + if ((index % 4) == 3) + pr_err("\n"); + } else { + switch (index) { + case 16: + pr_err("CR0: 0x%08x\t", + vcpu_reg[index]); + break; + case 17: + pr_err("CR1: 0x%08x\n", + vcpu_reg[index]); + break; + case 18: + pr_err("ML: 0x%08x\t", + vcpu_reg[index]); + break; + case 19: + pr_err("MH: 0x%08x\n", + vcpu_reg[index]); + break; + case 21: + pr_err("LR: 0x%08x\n", + vcpu_reg[index]); + break; + case 22: + pr_err("PC: 0x%08x\n", + vcpu_reg[index]); + break; + case 23: + pr_err("SR: 0x%08x\n", + vcpu_reg[index]); + break; + case 24: + pr_err("SSP: 0x%08x\n", + vcpu_reg[index]); + break; + } + } + } + pr_err("[-] VCPU REG Dump\n"); + // --------- BIT register Dump + pr_err("[+] BPU REG Dump\n"); + pr_err("BITPC = 0x%08x\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x18))); + pr_err("BIT START=0x%08x, BIT END=0x%08x\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x11c)), + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x120))); + if (product_code == WAVE410_CODE) + pr_err("BIT COMMAND 0x%x\n", + vdi_fio_read_register( + coreIdx, + (W4_REG_BASE + 0x8000 + 0x100))); + if (product_code == WAVE4102_CODE || + product_code == WAVE510_CODE) + pr_err("BIT COMMAND 0x%x\n", + vdi_fio_read_register( + coreIdx, + (W4_REG_BASE + 0x8000 + 0x1FC))); + + pr_err("CODE_BASE %x\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x7000 + 0x18))); + pr_err("VCORE_REINIT_FLAG %x\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x7000 + 0x0C))); + + // --------- BIT HEVC Status Dump + ctu_fsm = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x48)); + nb_fsm = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x4c)); + cabac_fsm = vdi_fio_read_register( + coreIdx, (W4_REG_BASE + 0x8000 + 0x50)); + cu_info = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x54)); + mvp_fsm = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x58)); + tc_busy = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x5c)); + lf_fsm = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x60)); + bs_data = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x64)); + bbusy = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x68)); + fv = vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x6C)); + + pr_err("[DEBUG-BPUHEVC] CTU_X: %4d, CTU_Y: %4d\n", + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x40)), + vdi_fio_read_register(coreIdx, + (W4_REG_BASE + 0x8000 + 0x44))); + pr_err("[DEBUG-BPUHEVC] CTU_FSM> Main: 0x%02x, FIFO: 0x%1x, NB: 0x%02x, DBK: 0x%1x\n", + ((ctu_fsm >> 24) & 0xff), ((ctu_fsm >> 16) & 0xff), + ((ctu_fsm >> 8) & 0xff), (ctu_fsm & 0xff)); + pr_err("[DEBUG-BPUHEVC] NB_FSM: 0x%02x\n", + nb_fsm & 0xff); + pr_err("[DEBUG-BPUHEVC] CABAC_FSM> SAO: 0x%02x, CU: 0x%02x, PU: 0x%02x, TU: 0x%02x, EOS: 0x%02x\n", + ((cabac_fsm >> 25) & 0x3f), ((cabac_fsm >> 19) & 0x3f), + ((cabac_fsm >> 13) & 0x3f), ((cabac_fsm >> 6) & 0x7f), + (cabac_fsm & 0x3f)); + pr_err("[DEBUG-BPUHEVC] CU_INFO value = 0x%04x\n\t\t(l2cb: 0x%1x, cux: %1d, cuy; %1d, pred: %1d, pcm: %1d, wr_done: %1d, par_done: %1d, nbw_done: %1d, dec_run: %1d)\n", + cu_info, ((cu_info >> 16) & 0x3), + ((cu_info >> 13) & 0x7), ((cu_info >> 10) & 0x7), + ((cu_info >> 9) & 0x3), ((cu_info >> 8) & 0x1), + ((cu_info >> 6) & 0x3), ((cu_info >> 4) & 0x3), + ((cu_info >> 2) & 0x3), (cu_info & 0x3)); + pr_err("[DEBUG-BPUHEVC] MVP_FSM> 0x%02x\n", + mvp_fsm & 0xf); + pr_err("[DEBUG-BPUHEVC] TC_BUSY> tc_dec_busy: %1d, tc_fifo_busy: 0x%02x\n", + ((tc_busy >> 3) & 0x1), (tc_busy & 0x7)); + pr_err("[DEBUG-BPUHEVC] LF_FSM> SAO: 0x%1x, LF: 0x%1x\n", + ((lf_fsm >> 4) & 0xf), (lf_fsm & 0xf)); + pr_err("[DEBUG-BPUHEVC] BS_DATA> ExpEnd=%1d, bs_valid: 0x%03x, bs_data: 0x%03x\n", + ((bs_data >> 31) & 0x1), ((bs_data >> 16) & 0xfff), + (bs_data & 0xfff)); + pr_err("[DEBUG-BPUHEVC] BUS_BUSY> mib_wreq_done: %1d, mib_busy: %1d, sdma_bus: %1d\n", + ((bbusy >> 2) & 0x1), ((bbusy >> 1) & 0x1), + (bbusy & 0x1)); + pr_err("[DEBUG-BPUHEVC] FIFO_VALID> cu: %1d, tu: %1d, iptu: %1d, lf: %1d, coff: %1d\n\n", + ((fv >> 4) & 0x1), ((fv >> 3) & 0x1), ((fv >> 2) & 0x1), + ((fv >> 1) & 0x1), (fv & 0x1)); + pr_err("[-] BPU REG Dump\n"); + + // --------- VCE register Dump + pr_err("[+] VCE REG Dump\n"); + tq = read_vce_register(0, 0, 0xd0); + ip = read_vce_register(0, 0, 0xd4); + mc = read_vce_register(0, 0, 0xd8); + lf = read_vce_register(0, 0, 0xdc); + avail_cu = (read_vce_register(0, 0, 0x11C) >> 16) - + (read_vce_register(0, 0, 0x110) >> 16); + avail_tu = (read_vce_register(0, 0, 0x11C) & 0xFFFF) - + (read_vce_register(0, 0, 0x110) & 0xFFFF); + avail_tc = (read_vce_register(0, 0, 0x120) >> 16) - + (read_vce_register(0, 0, 0x114) >> 16); + avail_lf = (read_vce_register(0, 0, 0x120) & 0xFFFF) - + (read_vce_register(0, 0, 0x114) & 0xFFFF); + avail_ip = (read_vce_register(0, 0, 0x124) >> 16) - + (read_vce_register(0, 0, 0x118) >> 16); + pr_err(" TQ IP MC LF GDI_EMPTY ROOM\n"); + pr_err("------------------------------------------------------------------------------------------------------------\n"); + pr_err( + "| %d %04d %04d | %d %04d %04d | %d %04d %04d | %d %04d %04d | 0x%08x | CU(%d) TU(%d) TC(%d) LF(%d) IP(%d)\n", + (tq >> 22) & 0x07, (tq >> 11) & 0x3ff, tq & 0x3ff, + (ip >> 22) & 0x07, (ip >> 11) & 0x3ff, ip & 0x3ff, + (mc >> 22) & 0x07, (mc >> 11) & 0x3ff, mc & 0x3ff, + (lf >> 22) & 0x07, (lf >> 11) & 0x3ff, lf & 0x3ff, + vdi_fio_read_register(0, 0x88f4), /* GDI empty */ + avail_cu, avail_tu, avail_tc, avail_lf, avail_ip); + /* CU/TU Queue count */ + reg_val = read_vce_register(0, 0, 0x12C); + pr_err("[DCIDEBUG] QUEUE COUNT: CU(%5d) TU(%5d) ", + (reg_val >> 16) & 0xffff, reg_val & 0xffff); + reg_val = read_vce_register(0, 0, 0x1A0); + pr_err("TC(%5d) IP(%5d) ", (reg_val >> 16) & 0xffff, + reg_val & 0xffff); + reg_val = read_vce_register(0, 0, 0x1A4); + pr_err("LF(%5d)\n", (reg_val >> 16) & 0xffff); + pr_err("VALID SIGNAL : CU0(%d) CU1(%d) CU2(%d) TU(%d) TC(%d) IP(%5d) LF(%5d)\nDCI_FALSE_RUN(%d) VCE_RESET(%d) CORE_INIT(%d) SET_RUN_CTU(%d)\n", + (reg_val >> 6) & 1, (reg_val >> 5) & 1, + (reg_val >> 4) & 1, (reg_val >> 3) & 1, + (reg_val >> 2) & 1, (reg_val >> 1) & 1, + (reg_val >> 0) & 1, (reg_val >> 10) & 1, + (reg_val >> 9) & 1, (reg_val >> 8) & 1, + (reg_val >> 7) & 1); + + pr_err( + "State TQ: 0x%08x IP: 0x%08x MC: 0x%08x LF: 0x%08x\n", + read_vce_register(0, 0, 0xd0), + read_vce_register(0, 0, 0xd4), + read_vce_register(0, 0, 0xd8), + read_vce_register(0, 0, 0xdc)); + pr_err("BWB[1]: RESPONSE_CNT(0x%08x) INFO(0x%08x)\n", + read_vce_register(0, 0, 0x194), + read_vce_register(0, 0, 0x198)); + pr_err("BWB[2]: RESPONSE_CNT(0x%08x) INFO(0x%08x)\n", + read_vce_register(0, 0, 0x194), + read_vce_register(0, 0, 0x198)); + pr_err("DCI INFO\n"); + pr_err("READ_CNT_0 : 0x%08x\n", + read_vce_register(0, 0, 0x110)); + pr_err("READ_CNT_1 : 0x%08x\n", + read_vce_register(0, 0, 0x114)); + pr_err("READ_CNT_2 : 0x%08x\n", + read_vce_register(0, 0, 0x118)); + pr_err("WRITE_CNT_0: 0x%08x\n", + read_vce_register(0, 0, 0x11c)); + pr_err("WRITE_CNT_1: 0x%08x\n", + read_vce_register(0, 0, 0x120)); + pr_err("WRITE_CNT_2: 0x%08x\n", + read_vce_register(0, 0, 0x124)); + reg_val = read_vce_register(0, 0, 0x128); + pr_err("LF_DEBUG_PT: 0x%08x\n", reg_val & 0xffffffff); + pr_err("cur_main_state %2d, r_lf_pic_deblock_disable %1d, r_lf_pic_sao_disable %1d\n", + (reg_val >> 16) & 0x1f, (reg_val >> 15) & 0x1, + (reg_val >> 14) & 0x1); + pr_err("para_load_done %1d, i_rdma_ack_wait %1d, i_sao_intl_col_done %1d,i_sao_outbuf_full %1d\n", + (reg_val >> 13) & 0x1, (reg_val >> 12) & 0x1, + (reg_val >> 11) & 0x1, (reg_val >> 10) & 0x1); + pr_err("lf_sub_done %1d, i_wdma_ack_wait %1d, lf_all_sub_done %1d, cur_ycbcr %1d, sub8x8_done %2d\n", + (reg_val >> 9) & 0x1, (reg_val >> 8) & 0x1, + (reg_val >> 6) & 0x1, (reg_val >> 4) & 0x1, + reg_val & 0xf); + pr_err("[-] VCE REG Dump\n"); + pr_err("[-] VCE REG Dump\n"); + + pr_err("-------------------------------------------------------------------------------\n"); + } else if (PRODUCT_CODE_NOT_W_SERIES(product_code)) { + } else { + CVI_VC_ERR("Unknown product id : %08x\n", product_code); + } +} + +void vdi_make_log(unsigned long core_idx, const char *str, int step) +{ + int val; + + val = VpuReadReg(core_idx, W4_INST_INDEX); + val &= 0xffff; + if (step == 1) + CVI_VC_INFO("\n**%s start(%d)\n", str, val); + else if (step == 2) // + CVI_VC_INFO("\n**%s timeout(%d)\n", str, val); + else + CVI_VC_INFO("\n**%s end(%d)\n", str, val); +} + +void vdi_log(unsigned long core_idx, int cmd, int step) +{ + vdi_info_t *vdi; + int i; + + // BIT_RUN command + enum { + SEQ_INIT = 1, + SEQ_END = 2, + PIC_RUN = 3, + SET_FRAME_BUF = 4, + ENCODE_HEADER = 5, + ENC_PARA_SET = 6, + DEC_PARA_SET = 7, + DEC_BUF_FLUSH = 8, + RC_CHANGE_PARAMETER = 9, + VPU_SLEEP = 10, + VPU_WAKE = 11, + ENC_ROI_INIT = 12, + FIRMWARE_GET = 0xf, + VPU_RESET = 0x10, + }; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return; + } + + if (PRODUCT_CODE_W_SERIES(vdi->product_code)) { + switch (cmd) { + case INIT_VPU: + vdi_make_log(core_idx, "INIT_VPU", step); + break; + case DEC_PIC_HDR: // SET_PARAM for ENC + vdi_make_log(core_idx, + "SET_PARAM(ENC), DEC_PIC_HDR(DEC)", step); + break; + case FINI_SEQ: + vdi_make_log(core_idx, "FINI_SEQ", step); + break; + case DEC_PIC: // ENC_PIC for ENC + vdi_make_log(core_idx, "DEC_PIC, ENC_PIC", step); + break; + case SET_FRAMEBUF: + vdi_make_log(core_idx, "SET_FRAMEBUF", step); + break; + case FLUSH_DECODER: + vdi_make_log(core_idx, "FLUSH_DECODER", step); + break; + case GET_FW_VERSION: + vdi_make_log(core_idx, "GET_FW_VERSION", step); + break; + case QUERY_DECODER: + vdi_make_log(core_idx, "QUERY_DECODER", step); + break; + case SLEEP_VPU: + vdi_make_log(core_idx, "SLEEP_VPU", step); + break; + case CREATE_INSTANCE: + vdi_make_log(core_idx, "CREATE_INSTANCE", step); + break; + case RESET_VPU: + vdi_make_log(core_idx, "RESET_VPU", step); + break; + default: + vdi_make_log(core_idx, "ANY_CMD", step); + break; + } + } else if (PRODUCT_CODE_NOT_W_SERIES(vdi->product_code)) { + switch (cmd) { + case SEQ_INIT: + vdi_make_log(core_idx, "SEQ_INIT", step); + break; + case SEQ_END: + vdi_make_log(core_idx, "SEQ_END", step); + break; + case PIC_RUN: + vdi_make_log(core_idx, "PIC_RUN", step); + break; + case SET_FRAME_BUF: + vdi_make_log(core_idx, "SET_FRAME_BUF", step); + break; + case ENCODE_HEADER: + vdi_make_log(core_idx, "ENCODE_HEADER", step); + break; + case RC_CHANGE_PARAMETER: + vdi_make_log(core_idx, "RC_CHANGE_PARAMETER", step); + break; + case DEC_BUF_FLUSH: + vdi_make_log(core_idx, "DEC_BUF_FLUSH", step); + break; + case FIRMWARE_GET: + vdi_make_log(core_idx, "FIRMWARE_GET", step); + break; + case VPU_RESET: + vdi_make_log(core_idx, "VPU_RESET", step); + break; + case ENC_PARA_SET: + vdi_make_log(core_idx, "ENC_PARA_SET", step); + break; + case DEC_PARA_SET: + vdi_make_log(core_idx, "DEC_PARA_SET", step); + break; + default: + vdi_make_log(core_idx, "ANY_CMD", step); + break; + } + } else { + CVI_VC_ERR("Unknown product id : %08x\n", vdi->product_code); + return; + } + + for (i = 0; i < 0x200; i = i + 16) { + CVI_VC_INFO("0x%04xh: 0x%08x 0x%08x 0x%08x 0x%08x\n", i, + vdi_read_register(core_idx, i), + vdi_read_register(core_idx, i + 4), + vdi_read_register(core_idx, i + 8), + vdi_read_register(core_idx, i + 0xc)); + } + + if (PRODUCT_CODE_W_SERIES(vdi->product_code)) { + // WAVE4xx + if (cmd == INIT_VPU || cmd == VPU_RESET || + cmd == CREATE_INSTANCE) { + vdi_print_vpu_status(core_idx); + } + } else if (PRODUCT_CODE_NOT_W_SERIES(vdi->product_code)) { + // if ((cmd == PIC_RUN && step== 0) || cmd == VPU_RESET) + if (cmd == VPU_RESET) { +#ifdef DBG_CNM + printf_gdi_info(core_idx, 32, 0); +#endif + +#define VDI_LOG_MBC_BUSY 0x0440 +#define VDI_LOG_MC_BASE 0x0C00 +#define VDI_LOG_MC_BUSY 0x0C04 +#define VDI_LOG_GDI_BUS_STATUS (0x10F4) +#define VDI_LOG_ROT_SRC_IDX (0x400 + 0x10C) +#define VDI_LOG_ROT_DST_IDX (0x400 + 0x110) + + CVI_VC_INFO("MBC_BUSY = %x\n", + vdi_read_register(core_idx, + VDI_LOG_MBC_BUSY)); + CVI_VC_INFO("MC_BUSY = %x\n", + vdi_read_register(core_idx, + VDI_LOG_MC_BUSY)); + CVI_VC_INFO( + "MC_MB_XY_DONE=(y:%d, x:%d)\n", + (vdi_read_register(core_idx, VDI_LOG_MC_BASE) >> + 20) & 0x3F, + (vdi_read_register(core_idx, VDI_LOG_MC_BASE) >> + 26) & 0x3F); + CVI_VC_INFO("GDI_BUS_STATUS = %x\n", + vdi_read_register(core_idx, + VDI_LOG_GDI_BUS_STATUS)); + + CVI_VC_INFO("ROT_SRC_IDX = %x\n", + vdi_read_register(core_idx, + VDI_LOG_ROT_SRC_IDX)); + CVI_VC_INFO("ROT_DST_IDX = %x\n", + vdi_read_register(core_idx, + VDI_LOG_ROT_DST_IDX)); + + CVI_VC_INFO("P_MC_PIC_INDEX_0 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x200)); + CVI_VC_INFO("P_MC_PIC_INDEX_1 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x20c)); + CVI_VC_INFO("P_MC_PIC_INDEX_2 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x218)); + CVI_VC_INFO("P_MC_PIC_INDEX_3 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x230)); + CVI_VC_INFO("P_MC_PIC_INDEX_3 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x23C)); + CVI_VC_INFO("P_MC_PIC_INDEX_4 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x248)); + CVI_VC_INFO("P_MC_PIC_INDEX_5 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x254)); + CVI_VC_INFO("P_MC_PIC_INDEX_6 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x260)); + CVI_VC_INFO("P_MC_PIC_INDEX_7 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x26C)); + CVI_VC_INFO("P_MC_PIC_INDEX_8 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x278)); + CVI_VC_INFO("P_MC_PIC_INDEX_9 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x284)); + CVI_VC_INFO("P_MC_PIC_INDEX_a = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x290)); + CVI_VC_INFO("P_MC_PIC_INDEX_b = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x29C)); + CVI_VC_INFO("P_MC_PIC_INDEX_c = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x2A8)); + CVI_VC_INFO("P_MC_PIC_INDEX_d = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x2B4)); + + CVI_VC_INFO("P_MC_PICIDX_0 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x028)); + CVI_VC_INFO("P_MC_PICIDX_1 = %x\n", + vdi_read_register(core_idx, + MC_BASE + 0x02C)); + } + } else { + CVI_VC_ERR("Unknown product id : %08x\n", vdi->product_code); + return; + } +} +#endif + +static void byte_swap(unsigned char *data, int len) +{ + Uint8 temp; + Int32 i; + + for (i = 0; i < len; i += 2) { + temp = data[i]; + data[i] = data[i + 1]; + data[i + 1] = temp; + } +} + +static void word_swap(unsigned char *data, int len) +{ + Uint16 temp; + Uint16 *ptr = (Uint16 *)data; + Int32 i, size = len / sizeof(Uint16); + + for (i = 0; i < size; i += 2) { + temp = ptr[i]; + ptr[i] = ptr[i + 1]; + ptr[i + 1] = temp; + } +} + +static void dword_swap(unsigned char *data, int len) +{ + Uint32 temp; + Uint32 *ptr = (Uint32 *)data; + Int32 i, size = len / sizeof(Uint32); + + for (i = 0; i < size; i += 2) { + temp = ptr[i]; + ptr[i] = ptr[i + 1]; + ptr[i + 1] = temp; + } +} + +static void lword_swap(unsigned char *data, int len) +{ + Uint64 temp; + Uint64 *ptr = (Uint64 *)data; + Int32 i, size = len / sizeof(Uint64); + + for (i = 0; i < size; i += 2) { + temp = ptr[i]; + ptr[i] = ptr[i + 1]; + ptr[i + 1] = temp; + } +} + +#ifdef REDUNDENT_CODE +int vdi_get_system_endian(unsigned long core_idx) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + if (PRODUCT_CODE_W_SERIES(vdi->product_code)) { + return VDI_128BIT_BUS_SYSTEM_ENDIAN; + } else if (PRODUCT_CODE_NOT_W_SERIES(vdi->product_code)) { + return VDI_SYSTEM_ENDIAN; + } + + CVI_VC_ERR("Unknown product id : %08x\n", vdi->product_code); + return -1; +} +#endif + +int vdi_convert_endian(unsigned long core_idx, unsigned int endian) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + if (PRODUCT_CODE_W_SERIES(vdi->product_code)) { + switch (endian) { + case VDI_LITTLE_ENDIAN: + endian = 0x00; + break; + case VDI_BIG_ENDIAN: + endian = 0x0f; + break; + case VDI_32BIT_LITTLE_ENDIAN: + endian = 0x04; + break; + case VDI_32BIT_BIG_ENDIAN: + endian = 0x03; + break; + } + } else if (PRODUCT_CODE_NOT_W_SERIES(vdi->product_code)) { + } else { + CVI_VC_ERR("Unknown product id : %08x\n", vdi->product_code); + return -1; + } + + return (endian & 0x0f); +} + +PhysicalAddress vdi_remap_memory_address(unsigned long coreIdx, + PhysicalAddress address) +{ + vdi_info_t *vdi; + + vdi = s_vdi_info[coreIdx]; + + switch (vdi->chip_version) { + case CHIP_ID_1835: + return VPU_TO_64BIT(address); + + case CHIP_ID_1821A: + case CHIP_ID_1822: + return VPU_TO_32BIT(address); + + default: + CVI_VC_ERR("Unsupported CHIP 0x%x\n", vdi->chip_version); + break; + } + + return 0; +} + +static Uint32 convert_endian_coda9_to_wave4(Uint32 endian) +{ + Uint32 converted_endian = endian; + switch (endian) { + case VDI_LITTLE_ENDIAN: + converted_endian = 0; + break; + case VDI_BIG_ENDIAN: + converted_endian = 7; + break; + case VDI_32BIT_LITTLE_ENDIAN: + converted_endian = 4; + break; + case VDI_32BIT_BIG_ENDIAN: + converted_endian = 3; + break; + } + return converted_endian; +} + +int swap_endian(unsigned long core_idx, unsigned char *data, int len, + int endian) +{ + vdi_info_t *vdi; + int changes; + int sys_endian; + BOOL byteChange, wordChange, dwordChange, lwordChange; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_ERR("vdi_get_vdi_info\n"); + return -1; + } + + if (PRODUCT_CODE_W_SERIES(vdi->product_code)) { + sys_endian = VDI_128BIT_BUS_SYSTEM_ENDIAN; + } else if (PRODUCT_CODE_NOT_W_SERIES(vdi->product_code)) { + sys_endian = VDI_SYSTEM_ENDIAN; + } else { + CVI_VC_ERR("Unknown product id : %08x\n", vdi->product_code); + return -1; + } + + endian = vdi_convert_endian(core_idx, endian); + sys_endian = vdi_convert_endian(core_idx, sys_endian); + if (endian == sys_endian) + return 0; + + if (PRODUCT_CODE_W_SERIES(vdi->product_code)) { + } else if (PRODUCT_CODE_NOT_W_SERIES(vdi->product_code)) { + endian = convert_endian_coda9_to_wave4(endian); + sys_endian = convert_endian_coda9_to_wave4(sys_endian); + } else { + CVI_VC_ERR("Unknown product id : %08x\n", vdi->product_code); + return -1; + } + + changes = endian ^ sys_endian; + byteChange = changes & 0x01; + wordChange = ((changes & 0x02) == 0x02); + dwordChange = ((changes & 0x04) == 0x04); + lwordChange = ((changes & 0x08) == 0x08); + + if (byteChange) + byte_swap(data, len); + if (wordChange) + word_swap(data, len); + if (dwordChange) + dword_swap(data, len); + if (lwordChange) + lword_swap(data, len); + + return 1; +} + +int vdi_set_single_es_buf(unsigned long core_idx, BOOL use_single_es_buf, + unsigned int *single_es_buf_size) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_WARN("vdi_get_vdi_info\n"); + return -1; + } + + if (vdi->task_num <= 0) { + CVI_VC_ERR("invalid vdi task num\n"); + return -1; + } else if (vdi->task_num == 1) { + vdi->singleEsBuf = use_single_es_buf; + vdi->single_es_buf_size = *single_es_buf_size; + } else { + if (vdi->singleEsBuf != use_single_es_buf) { + CVI_VC_ERR( + "use_single_es_buf flag must be the same for all tasks\n"); + return -1; + } + } + + if (vdi->singleEsBuf) { + if (vdi->single_es_buf_size != *single_es_buf_size) { + CVI_VC_WARN("different single es buf size %d ignored\n", + *single_es_buf_size); + CVI_VC_WARN("current single es buf size %d\n", + vdi->single_es_buf_size); + *single_es_buf_size = vdi->single_es_buf_size; + } + } + + return 0; +} + +BOOL vdi_get_is_single_es_buf(unsigned long core_idx) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + CVI_VC_WARN("vdi_get_vdi_info\n"); + return FALSE; + } + + return vdi->singleEsBuf; +} + +int vdi_get_chip_version(void) +{ + vdi_info_t *vdi; + int i = 0; + + for (i = 0; i < MAX_NUM_VPU_CORE; i++) { + vdi = vdi_get_vdi_info(i); + if (vdi) { + return vdi->chip_version; + } + } + + return -1; +} + +int vdi_get_chip_capability(unsigned long core_idx, cviCapability *pCap) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + return -1; + } + + pCap->addrRemapEn = (vdi->chip_capability & VCODEC_QUIRK_SUPPORT_VC_ADDR_REMAP) ? 1 : 0; + + return 0; +} + +int vdi_get_task_num(unsigned long core_idx) +{ + vdi_info_t *vdi; + + if (core_idx >= MAX_NUM_VPU_CORE) + return -1; + + if (s_vdi_info[core_idx] == NULL) { + return 0; + } + + vdi = s_vdi_info[core_idx]; + + if (!vdi) { + CVI_VC_WARN("lock failed, vdi %p, ret %p\n", vdi, + __builtin_return_address(0)); + return -1; + } + + return vdi->task_num; +} + +#ifdef CLI_DEBUG_SUPPORT +int vdi_show_vdi_info(unsigned long core_idx) +{ + vdi_info_t *vdi; + + vdi = vdi_get_vdi_info(core_idx); + if (!vdi) { + tcli_print("vdi_get_vdi_info\n"); + return -1; + } + + tcli_print("chip_version:0x%x\n", vdi->chip_version); + tcli_print("core_idx:%d\n", vdi->core_idx); + tcli_print("product_code:0x%x\n", vdi->product_code); + tcli_print("vpu_fd:%d\n", vdi->vpu_fd); + tcli_print("task_num:%d\n", vdi->task_num); + tcli_print("clock_state:%d\n", vdi->clock_state); + tcli_print("chip_version:0x%x\n", vdi->chip_version); + tcli_print("vdb_register_size:%d\n", vdi->vdb_register.size); + tcli_print("vpu_common_memory_size:%d\n", vdi->vpu_common_memory.size); + tcli_print("vpu_buffer_pool_count:%d\n", vdi->vpu_buffer_pool_count); + tcli_print("vdb_bitstream_size:%d\n", vdi->vdb_bitstream.size); + tcli_print("SingleCore:%d\n", vdi->SingleCore); + tcli_print("singleEsBuf:%d\n", vdi->singleEsBuf); + tcli_print("single_es_buf_size:%d\n", vdi->single_es_buf_size); + + for (int i = 0; i < MAX_VPU_BUFFER_POOL; i++) { + if (vdi->vpu_buffer_pool[i].inuse == 1) { + vpudrv_buffer_t *pVdb = &vdi->vpu_buffer_pool[i].vdb; + tcli_print("[%d]vdb_size:%d\n", i, pVdb->size); + } + } + + return 0; +} + +#endif + +#endif //#if defined(linux) || defined(__linux) || defined(ANDROID) diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/linux/vdi_osal.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/linux/vdi_osal.c new file mode 100644 index 0000000000..ca0259b1b1 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/linux/vdi_osal.c @@ -0,0 +1,375 @@ +//------------------------------------------------------------------------------ +// File: vdi_osal.c +// +// Copyright (c) 2006, Chips & Media. All rights reserved. +//------------------------------------------------------------------------------ +#if defined(linux) || defined(__linux) || defined(ANDROID) + +#include "vpuconfig.h" +#include +#include +#include + +#include "../vdi_osal.h" + +#ifdef REDUNDENT_CODE +static struct termios initial_settings, new_settings; +static int peek_character = -1; +#endif + +#if !defined(USE_KERNEL_MODE) || defined(REDUNDENT_CODE) +static int log_colors[MAX_LOG_LEVEL] = { + 0, + TERM_COLOR_R | TERM_COLOR_G | TERM_COLOR_B | TERM_COLOR_BRIGHT, // INFO + TERM_COLOR_R | TERM_COLOR_B | TERM_COLOR_BRIGHT, // WARN + TERM_COLOR_R | TERM_COLOR_BRIGHT, // ERR + TERM_COLOR_R | TERM_COLOR_G | TERM_COLOR_B // TRACE +}; + +static unsigned int log_decor = LOG_HAS_TIME | LOG_HAS_FILE | LOG_HAS_MICRO_SEC | + LOG_HAS_NEWLINE | LOG_HAS_SPACE | LOG_HAS_COLOR; +#endif +static int max_log_level = NONE; +#ifdef ENABLE_LOG +static FILE *fpLog; +#endif + +struct cvi_osal_file { + struct file *filep; + mm_segment_t old_fs; +}; + + +#ifdef ENABLE_LOG +int InitLog(void) +{ + fpLog = osal_fopen("ErrorLog.txt", "w"); + + return 1; +} + +void DeInitLog(void) +{ + if (fpLog) { + osal_fclose(fpLog); + fpLog = NULL; + } +} +#endif + +#ifdef REDUNDENT_CODE +void SetLogColor(int level, int color) +{ + log_colors[level] = color; +} + +int GetLogColor(int level) +{ + return log_colors[level]; +} + +void SetLogDecor(int decor) +{ + log_decor = decor; +} + +int GetLogDecor(void) +{ + return log_decor; +} +#endif + +void SetMaxLogLevel(int level) +{ + max_log_level = level; +} +int GetMaxLogLevel(void) +{ + return max_log_level; +} + +void LogMsg(int level, const char *format, ...) +{ + va_list ptr; + char logBuf[MAX_PRINT_LENGTH] = { 0 }; + + if (level > max_log_level) + return; + + va_start(ptr, format); + vsnprintf(logBuf, MAX_PRINT_LENGTH, format, ptr); + va_end(ptr); + + pr_err("%s", logBuf); +} + +#ifdef REDUNDENT_CODE +void osal_init_keyboard(void) +{ + tcgetattr(0, &initial_settings); + new_settings = initial_settings; + new_settings.c_lflag &= ~ICANON; + new_settings.c_lflag &= ~ECHO; + // new_settings.c_lflag &= ~ISIG; + new_settings.c_cc[VMIN] = 1; + new_settings.c_cc[VTIME] = 0; + tcsetattr(0, TCSANOW, &new_settings); + peek_character = -1; +} + +void osal_close_keyboard(void) +{ + tcsetattr(0, TCSANOW, &initial_settings); +} + +int osal_kbhit(void) +{ + unsigned char ch; + int nread; + + if (peek_character != -1) + return 1; + new_settings.c_cc[VMIN] = 0; + tcsetattr(0, TCSANOW, &new_settings); + nread = read(0, &ch, 1); + new_settings.c_cc[VMIN] = 1; + tcsetattr(0, TCSANOW, &new_settings); + if (nread == 1) { + peek_character = (int)ch; + return 1; + } + return 0; +} + +int osal_getch(void) +{ + int val; + char ch; + + if (peek_character != -1) { + val = peek_character; + peek_character = -1; + return val; + } + read(0, &ch, 1); + return ch; +} + +int osal_flush_ch(void) +{ + return 1; +} +#endif + +int osal_rand(void) +{ + return 0; +} + +void *osal_memcpy(void *dst, const void *src, int count) +{ + return memcpy(dst, src, count); +} + +int osal_memcmp(const void *src, const void *dst, int size) +{ + return memcmp(src, dst, size); +} + +void *osal_memset(void *dst, int val, int count) +{ + return memset(dst, val, count); +} + +void *osal_malloc(int size) +{ + return vzalloc(size); +} + +#ifdef REDUNDENT_CODE +void *osal_realloc(void *ptr, int size) +{ + return realloc(ptr, size); +} +#endif + +void osal_free(void *p) +{ + vfree(p); +} + +int osal_feof(osal_file_t fp) +{ + return 0; +} + +osal_file_t osal_fopen(const char *osal_file_tname, const char *mode) +{ + struct cvi_osal_file *cvi_fp = (struct cvi_osal_file *) + vmalloc(sizeof(struct cvi_osal_file)); + + if (!cvi_fp) + return NULL; + + if (!strncmp(mode, "rb", 2)) { + cvi_fp->filep = filp_open(osal_file_tname, O_RDONLY/*|O_NONBLOCK*/, 0644); + } else if (!strncmp(mode, "wb", 2)) { + cvi_fp->filep = filp_open(osal_file_tname, O_RDWR | O_CREAT, 0644); + } + + if (IS_ERR(cvi_fp->filep)) { + vfree(cvi_fp); + return NULL; + } + + cvi_fp->old_fs = get_fs(); + return cvi_fp; +} +size_t osal_fwrite(const void *p, int size, int count, osal_file_t fp) +{ + struct cvi_osal_file *cvi_fp = (struct cvi_osal_file *)fp; + struct file *filep = cvi_fp->filep; + + return kernel_write(filep, p, size * count, &filep->f_pos); +} +size_t osal_fread(void *p, int size, int count, osal_file_t fp) +{ + struct cvi_osal_file *cvi_fp = (struct cvi_osal_file *)fp; + struct file *filep = cvi_fp->filep; + + return kernel_read(filep, p, size * count, &filep->f_pos); +} +long osal_ftell(osal_file_t fp) +{ + struct cvi_osal_file *cvi_fp = (struct cvi_osal_file *)fp; + struct file *filep = cvi_fp->filep; + + return filep->f_pos; + return 0; +} + +int osal_fseek(osal_file_t fp, long offset, int origin) +{ + struct cvi_osal_file *cvi_fp = (struct cvi_osal_file *)fp; + struct file *filep = cvi_fp->filep; + + return default_llseek(filep, offset, origin); + + return 0; +} +int osal_fclose(osal_file_t fp) +{ + struct cvi_osal_file *cvi_fp = (struct cvi_osal_file *)fp; + struct file *filep; + + if (!fp) + return -1; + + filep = cvi_fp->filep; + filp_close(filep, 0); + set_fs(cvi_fp->old_fs); + vfree(cvi_fp); + return 0; +} + +#ifdef REDUNDENT_CODE +int osal_fscanf(osal_file_t fp, const char *_Format, ...) +{ + int ret; + return ret; +} + +int osal_fprintf(osal_file_t fp, const char *_Format, ...) +{ + int ret; + return ret; +} +#endif + +void *osal_kmalloc(int size) +{ + return kmalloc(size, GFP_KERNEL); +} + +void osal_kfree(void *p) +{ + kfree(p); +} + +void *osal_ion_alloc(int size) +{ + PhysicalAddress u64PhysAddr; + void *pVirtAddr; + + if (sys_ion_alloc_nofd((uint64_t *)&u64PhysAddr, (void **)&pVirtAddr, + "vcodec_bistream_ion", size, true) != 0) { + CVI_VC_ERR("[VDI] fail to allocate ion memory. size=%d\n", + size); + return NULL; + } + CVI_VC_MEM("physaddr=%llx, virtaddr=%p, size=0x%x\n", + u64PhysAddr, (void *)pVirtAddr, size); + return (void *)phys_to_virt(u64PhysAddr); +} + +void osal_ion_free(void *p) +{ + PhysicalAddress u64PhysAddr = (PhysicalAddress)virt_to_phys(p); + + CVI_VC_MEM("physaddr=%llx, virtaddr=%p\n", + u64PhysAddr, (void *)p); + sys_ion_free_nofd((uint64_t)u64PhysAddr); +} +//------------------------------------------------------------------------------ +// math related api +//------------------------------------------------------------------------------ +#ifndef I64 +typedef long long I64; +#endif + +// 32 bit / 16 bit ==> 32-n bit remainder, n bit quotient +static int fixDivRq(int a, int b, int n) +{ + I64 c; + I64 a_36bit; + I64 mask, signBit, signExt; + int i; + + // DIVS emulation for BPU accumulator size + // For SunOS build + mask = 0x0F; + mask <<= 32; + mask |= 0x00FFFFFFFF; // mask = 0x0FFFFFFFFF; + signBit = 0x08; + signBit <<= 32; // signBit = 0x0800000000; + signExt = 0xFFFFFFF0; + signExt <<= 32; // signExt = 0xFFFFFFF000000000; + + a_36bit = (I64)a; + + for (i = 0; i < n; i++) { + c = a_36bit - (b << 15); + if (c >= 0) + a_36bit = (c << 1) + 1; + else + a_36bit = a_36bit << 1; + + a_36bit = a_36bit & mask; + if (a_36bit & signBit) + a_36bit |= signExt; + } + + a = (int)a_36bit; + return a; // R = [31:n], Q = [n-1:0] +} + +int math_div(int number, int denom) +{ + int c; + c = fixDivRq(number, denom, 17); // R = [31:17], Q = [16:0] + c = c & 0xFFFF; + c = (c + 1) >> 1; // round + return (c & 0xFFFF); +} + +#endif //#if defined(linux) || defined(__linux) || defined(ANDROID) diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/mm.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/mm.c new file mode 100644 index 0000000000..5c2759031c --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/mm.c @@ -0,0 +1,589 @@ +#ifdef REDUNDENT_CODE +#include +#include +#include "mm.h" + +#ifdef MM_DEBUG +#ifdef _MSC_VER +#define DPRINT(_fmt, ...) printf(_fmt, __VA_ARGS__) +#else +#define DPRINT(_fmt, ...) printf(_fmt, args...) +#endif +#else +#define DPRINT(_fmt, ...) +#endif + +#define P_ALLOC(_x) malloc(_x) +#define P_FREE(_x) free(_x) +#define ASSERT(_exp) \ + do { \ + if (!(_exp)) { \ + printf("ASSERT at %s:%d\n", __FILE__, __LINE__); \ + while (1) \ + ; \ + } \ + } while (0) +#define HEIGHT(_tree) (_tree == NULL ? -1 : _tree->height) +#define MAX(_a, _b) (_a >= _b ? _a : _b) + +typedef enum { LEFT, RIGHT } rotation_dir_t; + +typedef struct avl_node_data_struct { + int key; + page_t *page; +} avl_node_data_t; + +static avl_node_t *make_avl_node(vmem_key_t key, page_t *page) +{ + avl_node_t *node = (avl_node_t *)P_ALLOC(sizeof(avl_node_t)); + node->key = key; + node->page = page; + node->height = 0; + node->left = NULL; + node->right = NULL; + + return node; +} + +static int get_balance_factor(avl_node_t *tree) +{ + int factor = 0; + if (tree) { + factor = HEIGHT(tree->right) - HEIGHT(tree->left); + } + + return factor; +} + +/* + * Left Rotation + * + * A B + * \ / \ + * B => A C + * / \ \ + * D C D + * + */ +static avl_node_t *rotation_left(avl_node_t *tree) +{ + avl_node_t *rchild; + avl_node_t *lchild; + + if (tree == NULL) + return NULL; + + rchild = tree->right; + if (rchild == NULL) { + return tree; + } + + lchild = rchild->left; + rchild->left = tree; + tree->right = lchild; + + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + rchild->height = MAX(HEIGHT(rchild->left), HEIGHT(rchild->right)) + 1; + + return rchild; +} + +/* + * Reft Rotation + * + * A B + * \ / \ + * B => D A + * / \ / + * D C C + * + */ +static avl_node_t *rotation_right(avl_node_t *tree) +{ + avl_node_t *rchild; + avl_node_t *lchild; + + if (tree == NULL) + return NULL; + + lchild = tree->left; + if (lchild == NULL) + return NULL; + + rchild = lchild->right; + lchild->right = tree; + tree->left = rchild; + + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + lchild->height = MAX(HEIGHT(lchild->left), HEIGHT(lchild->right)) + 1; + + return lchild; +} + +static avl_node_t *do_balance(avl_node_t *tree) +{ + int bfactor = 0, child_bfactor; /* balancing factor */ + + bfactor = get_balance_factor(tree); + + if (bfactor >= 2) { + child_bfactor = get_balance_factor(tree->right); + if (child_bfactor == 1 || child_bfactor == 0) { + tree = rotation_left(tree); + } else if (child_bfactor == -1) { + tree->right = rotation_right(tree->right); + tree = rotation_left(tree); + } else { + fprintf(stderr, "invalid balancing factor: %d\n", + child_bfactor); + ASSERT(0); + return NULL; + } + } else if (bfactor <= -2) { + child_bfactor = get_balance_factor(tree->left); + if (child_bfactor == -1 || child_bfactor == 0) { + tree = rotation_right(tree); + } else if (child_bfactor == 1) { + tree->left = rotation_left(tree->left); + tree = rotation_right(tree); + } else { + fprintf(stderr, "invalid balancing factor: %d\n", + child_bfactor); + ASSERT(0); + return NULL; + } + } + + return tree; +} +static avl_node_t *unlink_end_node(avl_node_t *tree, int dir, + avl_node_t **found_node) +{ + *found_node = NULL; + if (tree == NULL) + return NULL; + + if (dir == LEFT) { + if (tree->left == NULL) { + *found_node = tree; + return NULL; + } + } else { + if (tree->right == NULL) { + *found_node = tree; + return NULL; + } + } + + if (dir == LEFT) { + tree->left = unlink_end_node(tree->left, LEFT, found_node); + if (tree->left == NULL) { + tree->left = (*found_node)->right; + (*found_node)->left = NULL; + (*found_node)->right = NULL; + } + } else { + tree->right = unlink_end_node(tree->right, RIGHT, found_node); + if (tree->right == NULL) { + tree->right = (*found_node)->left; + (*found_node)->left = NULL; + (*found_node)->right = NULL; + } + } + + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + + return do_balance(tree); +} + +static avl_node_t *avltree_insert(avl_node_t *tree, vmem_key_t key, + page_t *page) +{ + if (tree == NULL) { + tree = make_avl_node(key, page); + } else { + if (key >= tree->key) { + tree->right = avltree_insert(tree->right, key, page); + } else { + tree->left = avltree_insert(tree->left, key, page); + } + } + + tree = do_balance(tree); + + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + + return tree; +} + +static avl_node_t *do_unlink(avl_node_t *tree) +{ + avl_node_t *node; + avl_node_t *end_node; + node = unlink_end_node(tree->right, LEFT, &end_node); + if (node) { + tree->right = node; + } else { + node = unlink_end_node(tree->left, RIGHT, &end_node); + if (node) + tree->left = node; + } + + if (node == NULL) { + node = tree->right ? tree->right : tree->left; + end_node = node; + } + + if (end_node) { + end_node->left = + (tree->left != end_node) ? tree->left : end_node->left; + end_node->right = (tree->right != end_node) ? tree->right : + end_node->right; + end_node->height = + MAX(HEIGHT(end_node->left), HEIGHT(end_node->right)) + + 1; + } + + tree = end_node; + + return tree; +} + +static avl_node_t *avltree_remove(avl_node_t *tree, avl_node_t **found_node, + vmem_key_t key) +{ + *found_node = NULL; + if (tree == NULL) { + DPRINT("failed to find key %d\n", (int)key); + return NULL; + } + + if (key == tree->key) { + *found_node = tree; + tree = do_unlink(tree); + } else if (key > tree->key) { + tree->right = avltree_remove(tree->right, found_node, key); + } else { + tree->left = avltree_remove(tree->left, found_node, key); + } + + if (tree) + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + + tree = do_balance(tree); + + return tree; +} + +void avltree_free(avl_node_t *tree) +{ + if (tree == NULL) + return; + if (tree->left == NULL && tree->right == NULL) { + P_FREE(tree); + return; + } + + avltree_free(tree->left); + tree->left = NULL; + avltree_free(tree->right); + tree->right = NULL; + P_FREE(tree); +} + +static avl_node_t *remove_approx_value(avl_node_t *tree, avl_node_t **found, + vmem_key_t key) +{ + *found = NULL; + if (tree == NULL) { + return NULL; + } + + if (key == tree->key) { + *found = tree; + tree = do_unlink(tree); + } else if (key > tree->key) { + tree->right = remove_approx_value(tree->right, found, key); + } else { + tree->left = remove_approx_value(tree->left, found, key); + if (*found == NULL) { + *found = tree; + tree = do_unlink(tree); + } + } + if (tree) + tree->height = MAX(HEIGHT(tree->left), HEIGHT(tree->right)) + 1; + tree = do_balance(tree); + + return tree; +} + +static void set_blocks_free(video_mm_t *mm, int pageno, int npages) +{ + int last_pageno = pageno + npages - 1; + int i; + page_t *page; + page_t *last_page; + + ASSERT(npages); + + if (last_pageno >= mm->num_pages) { + DPRINT("set_blocks_free: invalid last page number: %d\n", + last_pageno); + ASSERT(0); + return; + } + + for (i = pageno; i <= last_pageno; i++) { + mm->page_list[i].used = 0; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].first_pageno = -1; + } + + page = &mm->page_list[pageno]; + page->alloc_pages = npages; + last_page = &mm->page_list[last_pageno]; + last_page->first_pageno = pageno; + + mm->free_tree = avltree_insert(mm->free_tree, MAKE_KEY(npages, pageno), + page); /*lint !e571 Suspicious cast*/ +} + +static void set_blocks_alloc(video_mm_t *mm, int pageno, int npages) +{ + int last_pageno = pageno + npages - 1; + int i; + page_t *page; + page_t *last_page; + + if (last_pageno >= mm->num_pages) { + DPRINT("set_blocks_free: invalid last page number: %d\n", + last_pageno); + ASSERT(0); + return; + } + + for (i = pageno; i <= last_pageno; i++) { + mm->page_list[i].used = 1; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].first_pageno = -1; + } + + page = &mm->page_list[pageno]; + page->alloc_pages = npages; + + last_page = &mm->page_list[last_pageno]; + last_page->first_pageno = pageno; + + mm->alloc_tree = + avltree_insert(mm->alloc_tree, MAKE_KEY(page->addr, 0), page); +} + +int vmem_init(video_mm_t *mm, unsigned long addr, unsigned long size) +{ + int i; + + mm->base_addr = (addr + (VMEM_PAGE_SIZE - 1)) & ~(VMEM_PAGE_SIZE - 1); + mm->mem_size = size & ~VMEM_PAGE_SIZE; + mm->num_pages = mm->mem_size / VMEM_PAGE_SIZE; + mm->page_list = (page_t *)P_ALLOC(mm->num_pages * sizeof(page_t)); + mm->free_tree = NULL; + mm->alloc_tree = NULL; + mm->free_page_count = mm->num_pages; + mm->alloc_page_count = 0; + + for (i = 0; i < mm->num_pages; i++) { + mm->page_list[i].pageno = i; + mm->page_list[i].addr = mm->base_addr + i * VMEM_PAGE_SIZE; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].used = 0; + mm->page_list[i].first_pageno = -1; + } + + set_blocks_free(mm, 0, mm->num_pages); + + return 0; +} + +int vmem_exit(video_mm_t *mm) +{ + if (mm == NULL) { + DPRINT("vmem_exit: invalid handle\n"); + return -1; + } + + if (mm->free_tree) { + avltree_free(mm->free_tree); + mm->free_tree = NULL; + } + if (mm->alloc_tree) { + avltree_free(mm->alloc_tree); + mm->alloc_tree = NULL; + } + + if (mm->page_list) { + P_FREE(mm->page_list); + mm->page_list = NULL; + } + + return 0; +} + +unsigned long vmem_alloc(video_mm_t *mm, int size, unsigned long pid) +{ + avl_node_t *node; + page_t *free_page; + int npages, free_size; + int alloc_pageno; + unsigned long ptr; + + if (mm == NULL) { + DPRINT("vmem_alloc: invalid handle\n"); + return (unsigned long)-1; + } + + if (size <= 0) + return (unsigned long)-1; + + npages = (size + VMEM_PAGE_SIZE - 1) / VMEM_PAGE_SIZE; + + mm->free_tree = remove_approx_value(mm->free_tree, &node, + MAKE_KEY(npages, 0)); /*lint !e571 + Suspicious + cast*/ + if (node == NULL) { + return (unsigned long)-1; + } + free_page = node->page; + free_size = KEY_TO_VALUE(node->key); + + alloc_pageno = free_page->pageno; + set_blocks_alloc(mm, alloc_pageno, npages); + if (npages != free_size) { + int free_pageno = alloc_pageno + npages; + set_blocks_free(mm, free_pageno, (free_size - npages)); + } + + P_FREE(node); + + ptr = mm->page_list[alloc_pageno].addr; + mm->alloc_page_count += npages; + mm->free_page_count -= npages; + + return ptr; +} + +int vmem_free(video_mm_t *mm, unsigned long ptr, unsigned long pid) +{ + unsigned long addr; + avl_node_t *found; + page_t *page; + int pageno, prev_free_pageno, next_free_pageno; + int prev_size, next_size; + int merge_page_no, merge_page_size, free_page_size; + + if (mm == NULL) { + DPRINT("vmem_free: invalid handle\n"); + return -1; + } + + addr = ptr; + // printf("FREE: 0x%08x\n", addr); + + mm->alloc_tree = + avltree_remove(mm->alloc_tree, &found, MAKE_KEY(addr, 0)); + if (found == NULL) { + DPRINT("vmem_free: 0x%08x not found\n", addr); + return -1; + } + + /* find previous free block */ + page = found->page; + pageno = page->pageno; + free_page_size = page->alloc_pages; + prev_free_pageno = pageno - 1; + prev_size = -1; + if (prev_free_pageno >= 0) { + if (mm->page_list[prev_free_pageno].used == 0) { + prev_free_pageno = + mm->page_list[prev_free_pageno].first_pageno; + prev_size = mm->page_list[prev_free_pageno].alloc_pages; + } + } + + /* find next free block */ + next_free_pageno = pageno + page->alloc_pages; + next_free_pageno = + (next_free_pageno == mm->num_pages) ? -1 : next_free_pageno; + next_size = -1; + if (next_free_pageno >= 0) { + if (mm->page_list[next_free_pageno].used == 0) { + next_size = mm->page_list[next_free_pageno].alloc_pages; + } + } + P_FREE(found); + + /* merge */ + merge_page_no = page->pageno; + merge_page_size = page->alloc_pages; + if (prev_size >= 0) { + mm->free_tree = avltree_remove( + mm->free_tree, &found, + MAKE_KEY(prev_size, prev_free_pageno)); /*lint !e571 + Suspicious + cast*/ + if (found == NULL) { + ASSERT(0); + return -1; + } + merge_page_no = found->page->pageno; + merge_page_size += found->page->alloc_pages; + P_FREE(found); + } + if (next_size >= 0) { + mm->free_tree = avltree_remove( + mm->free_tree, &found, + MAKE_KEY(next_size, next_free_pageno)); /*lint !e571 + Suspicious + cast*/ + if (found == NULL) { + ASSERT(0); + return -1; + } + merge_page_size += found->page->alloc_pages; + P_FREE(found); + } + + page->alloc_pages = 0; + page->first_pageno = -1; + + set_blocks_free(mm, merge_page_no, merge_page_size); + + mm->alloc_page_count -= free_page_size; + mm->free_page_count += free_page_size; + + DPRINT("FREE: total(%d) alloc(%d) free(%d)\n", mm->num_pages, + mm->alloc_page_count, mm->free_page_count); + + return 0; +} + +int vmem_get_info(video_mm_t *mm, vmem_info_t *info) +{ + if (mm == NULL) { + // DPRINT("vmem_get_info: invalid handle\n"); + return -1; + } + + if (info == NULL) { + return -1; + } + + info->total_pages = mm->num_pages; + info->alloc_pages = mm->alloc_page_count; + info->free_pages = mm->free_page_count; + info->page_size = VMEM_PAGE_SIZE; + + return 0; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/mm.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/mm.h new file mode 100644 index 0000000000..4fba7d4891 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/mm.h @@ -0,0 +1,70 @@ +#ifndef __CNM_VIDEO_MEMORY_ALLOCATOR_H_ +#define __CNM_VIDEO_MEMORY_ALLOCATOR_H_ + +typedef struct _video_mm_info_struct { + unsigned long total_pages; + unsigned long alloc_pages; + unsigned long free_pages; + unsigned long page_size; +} vmem_info_t; + +#if defined(WIN32) || defined(WIN64) +#if (_MSC_VER == 1200) +typedef _int64 vmem_key_t; +#else +typedef unsigned long long vmem_key_t; +#endif +#else +typedef unsigned long long vmem_key_t; +#endif + +#define VMEM_PAGE_SIZE (16 * 1024) + +#define MAKE_KEY(_a, _b) (((vmem_key_t)_a) << 32 | _b) +#define KEY_TO_VALUE(_key) (_key >> 32) + +typedef struct page_struct { + int pageno; + unsigned long addr; + int used; + int alloc_pages; + int first_pageno; +} page_t; + +typedef struct avl_node_struct { + vmem_key_t key; + int height; + page_t *page; + struct avl_node_struct *left; + struct avl_node_struct *right; +} avl_node_t; + +typedef struct _video_mm_struct { + avl_node_t *free_tree; + avl_node_t *alloc_tree; + page_t *page_list; + int num_pages; + unsigned long base_addr; + unsigned long mem_size; + int free_page_count; + int alloc_page_count; +} video_mm_t; + +#if defined(__cplusplus) +extern "C" { +#endif + +extern int vmem_init(video_mm_t *mm, unsigned long addr, unsigned long size); + +extern int vmem_exit(video_mm_t *mm); + +extern unsigned long vmem_alloc(video_mm_t *mm, int size, unsigned long pid); + +extern int vmem_free(video_mm_t *mm, unsigned long ptr, unsigned long pid); + +extern int vmem_get_info(video_mm_t *mm, vmem_info_t *info); + +#if defined(__cplusplus) +} +#endif +#endif /* __CNM_VIDEO_MEMORY_ALLOCATOR_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/vdi.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/vdi.h new file mode 100644 index 0000000000..62936089b8 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/vdi.h @@ -0,0 +1,304 @@ +//------------------------------------------------------------------------------ +// File: vdi.h +// +// Copyright (c) 2006, Chips & Media. All rights reserved. +//------------------------------------------------------------------------------ + +#ifndef _VDI_H_ +#define _VDI_H_ + +#include +#include +#include "sys.h" + +#include "mm.h" +#include "vpuconfig.h" +#include "vputypes.h" +#include +#ifdef CVI_H26X_USE_ION_MEM +#include "ion/ion.h" +#include "ion/cvitek/cvitek_ion_alloc.h" +#endif +/************************************************************************/ +/* COMMON REGISTERS */ +/************************************************************************/ +enum { + CHIP_ID_1822 = 0x1822, + CHIP_ID_1835 = 0x1835, + CHIP_ID_1821A = 0x1821A, +}; + +#define VPU_PRODUCT_NAME_REGISTER 0x1040 +#define VPU_PRODUCT_CODE_REGISTER 0x1044 + +//#define SUPPORT_MULTI_CORE_IN_ONE_DRIVER +#define MAX_VPU_CORE_NUM MAX_NUM_VPU_CORE +#ifdef SUPPORT_SRC_BUF_CONTROL +#define MAX_VPU_BUFFER_POOL 2000 +#else +#define MAX_VPU_BUFFER_POOL (64 * MAX_NUM_INSTANCE + 12 * 3) + //+12*3 => mvCol + YOfsTable + COfsTable +#endif + +#define VpuWriteReg(CORE, ADDR, DATA) \ + vdi_write_register(CORE, ADDR, DATA) // system register write +#define VpuReadReg(CORE, ADDR) \ + vdi_read_register(CORE, ADDR) // system register read +#define VpuWriteMem(CORE, ADDR, DATA, LEN, ENDIAN) \ + vdi_write_memory(CORE, ADDR, DATA, LEN, ENDIAN) // system memory write +#define VpuReadMem(CORE, ADDR, DATA, LEN, ENDIAN) \ + vdi_read_memory(CORE, ADDR, DATA, LEN, ENDIAN) // system memory read + +#define VDI_POWER_ON_DOING_JOB(CORE_IDX, RET, JOB) \ + do { \ + vdi_set_clock_gate(CORE_IDX, CLK_ENABLE); \ + RET = JOB; \ + vdi_set_clock_gate(CORE_IDX, CLK_DISABLE); \ + } while (0) + +#define VDI_POWER_ON_DOING_JOB_START(CORE_IDX, RET, JOB) \ + do { \ + vdi_set_clock_gate(CORE_IDX, CLK_ENABLE); \ + RET = JOB; \ + } while (0) + +#define VDI_POWER_ON_DOING_JOB_CONTINUE(CORE_IDX, RET, JOB) \ + { \ + RET = JOB; \ + } + +#define VDI_POWER_ON_DOING_JOB_FINISH(CORE_IDX, RET, JOB) \ + do { \ + RET = JOB; \ + vdi_set_clock_gate(CORE_IDX, CLK_DISABLE); \ + } while (0) + +typedef struct vpu_buffer_t { + __u32 size; + PhysicalAddress phys_addr; + __u64 base; + __u8 *virt_addr; /* virtual user space address */ +#ifdef __arm__ + __u32 padding; /* padding for keeping same size of this structure */ +#endif +} vpu_buffer_t; + +struct clk_ctrl_info { + int core_idx; + int enable; +}; + +typedef enum { + VDI_LITTLE_ENDIAN = 0, /* 64bit LE */ + VDI_BIG_ENDIAN, /* 64bit BE */ + VDI_32BIT_LITTLE_ENDIAN, + VDI_32BIT_BIG_ENDIAN, + /* WAVE PRODUCTS */ + VDI_128BIT_LITTLE_ENDIAN = 16, + VDI_128BIT_LE_BYTE_SWAP, + VDI_128BIT_LE_WORD_SWAP, + VDI_128BIT_LE_WORD_BYTE_SWAP, + VDI_128BIT_LE_DWORD_SWAP, + VDI_128BIT_LE_DWORD_BYTE_SWAP, + VDI_128BIT_LE_DWORD_WORD_SWAP, + VDI_128BIT_LE_DWORD_WORD_BYTE_SWAP, + VDI_128BIT_BE_DWORD_WORD_BYTE_SWAP, + VDI_128BIT_BE_DWORD_WORD_SWAP, + VDI_128BIT_BE_DWORD_BYTE_SWAP, + VDI_128BIT_BE_DWORD_SWAP, + VDI_128BIT_BE_WORD_BYTE_SWAP, + VDI_128BIT_BE_WORD_SWAP, + VDI_128BIT_BE_BYTE_SWAP, + VDI_128BIT_BIG_ENDIAN = 31, + VDI_ENDIAN_MAX +} EndianMode; + +#define VDI_128BIT_ENDIAN_MASK 0xf + +typedef struct vpu_pending_intr_t { + int instance_id[COMMAND_QUEUE_DEPTH]; + int int_reason[COMMAND_QUEUE_DEPTH]; + int order_num[COMMAND_QUEUE_DEPTH]; + int in_use[COMMAND_QUEUE_DEPTH]; + int num_pending_intr; + int count; +} vpu_pending_intr_t; + +typedef enum { + VDI_LINEAR_FRAME_MAP = 0, + VDI_TILED_FRAME_V_MAP = 1, + VDI_TILED_FRAME_H_MAP = 2, + VDI_TILED_FIELD_V_MAP = 3, + VDI_TILED_MIXED_V_MAP = 4, + VDI_TILED_FRAME_MB_RASTER_MAP = 5, + VDI_TILED_FIELD_MB_RASTER_MAP = 6, + VDI_TILED_FRAME_NO_BANK_MAP = 7, + VDI_TILED_FIELD_NO_BANK_MAP = 8, + VDI_LINEAR_FIELD_MAP = 9, + VDI_TILED_MAP_TYPE_MAX +} vdi_gdi_tiled_map; + +enum { CLK_DISABLE = 0, CLK_ENABLE = 1 }; + +typedef struct vpu_instance_pool_t { + unsigned char codecInstPool[MAX_NUM_INSTANCE] + [MAX_INST_HANDLE_SIZE]; // Since VDI don't + // know the size of + // CodecInst + // structure, VDI + // should have the + // enough space not + // to overflow. + vpu_buffer_t vpu_common_buffer; + int vpu_instance_num; + int instance_pool_inited; + void *pendingInst; + int pendingInstIdxPlus1; +#ifdef REDUNDENT_CODE + video_mm_t vmem; +#endif + vpu_pending_intr_t pending_intr_list; +} vpu_instance_pool_t; + +typedef struct _cviCapability_ { + Uint32 addrRemapEn; + Uint32 sliceBufferModeEn; +} cviCapability; + +#define MAX_VPU_ION_BUFFER_NAME (32) + +#ifdef CVI_H26X_USE_ION_MEM +#define VDI_ALLOCATE_MEMORY(CORE_IDX, VPU_BUFFER, IS_CACHED, STR_NAME) \ + vdi_allocate_ion_memory((CORE_IDX), (VPU_BUFFER), (IS_CACHED), \ + (STR_NAME)) +#define VDI_FREE_MEMORY(CORE_IDX, VB_STREAM) \ + vdi_free_ion_memory((CORE_IDX), (VB_STREAM)) +#else +#define VDI_ALLOCATE_MEMORY(CORE_IDX, VPU_BUFFER, IS_CACHED, STR_NAME) \ + vdi_allocate_dma_memory((CORE_IDX), (VPU_BUFFER)) +#define VDI_FREE_MEMORY(CORE_IDX, VB_STREAM) \ + vdi_free_dma_memory((CORE_IDX), (VB_STREAM)) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif +void cvi_vdi_init(void); + +int vdi_init(unsigned long core_idx, BOOL bCountTaskNum); +int vdi_get_single_core(unsigned long core_idx); +int vdi_release(unsigned long core_idx); // this function may be called only at + // system off. + +vpu_instance_pool_t *vdi_get_instance_pool(unsigned long core_idx); +int vdi_allocate_common_memory(unsigned long core_idx, Uint32 size); +int vdi_get_common_memory(unsigned long core_idx, vpu_buffer_t *vb); +int vdi_allocate_single_es_buf_memory(unsigned long core_idx, vpu_buffer_t *vb); +void vdi_free_single_es_buf_memory(unsigned long core_idx, vpu_buffer_t *vb); +int vdi_attach_dma_memory(unsigned long core_idx, vpu_buffer_t *vb); +int vdi_get_sram_memory(unsigned long core_idx, vpu_buffer_t *vb); +int vdi_dettach_dma_memory(unsigned long core_idx, vpu_buffer_t *vb); + +#ifdef CVI_H26X_USE_ION_MEM +int vdi_allocate_ion_memory(unsigned long core_idx, vpu_buffer_t *vb, + int is_cached, const char *str); +void vdi_free_ion_memory(unsigned long core_idx, vpu_buffer_t *vb); +int vdi_invalidate_ion_cache(uint64_t u64PhyAddr, void *pVirAddr, + uint32_t u32Len); +int vdi_flush_ion_cache(uint64_t u64PhyAddr, void *pVirAddr, uint32_t u32Len); +#else +int vdi_allocate_dma_memory(unsigned long core_idx, vpu_buffer_t *vb); +void vdi_free_dma_memory(unsigned long core_idx, vpu_buffer_t *vb); +#endif + +int vdi_wait_interrupt(unsigned long core_idx, int timeout, + uint64_t *pu64TimeStamp); +int vdi_wait_vpu_busy(unsigned long core_idx, int timeout, + unsigned int addr_bit_busy_flag); +int vdi_wait_bus_busy(unsigned long core_idx, int timeout, + unsigned int gdi_busy_flag); +#ifdef REDUNDENT_CODE +int vdi_hw_reset(unsigned long core_idx); +#endif + +int vdi_set_clock_gate(unsigned long core_idx, int enable); +int vdi_get_clock_gate(unsigned long core_idx); +int vdi_get_clk_rate(unsigned long core_idx); + +/** + * @brief make clock stable before changing clock frequency + * @detail Before inoking vdi_set_clock_freg() caller MUST invoke + * vdi_ready_change_clock() function. after changing clock frequency caller also + * invoke vdi_done_change_clock() function. + * @return 0 failure + * 1 success + */ +int vdi_ready_change_clock(unsigned long core_idx); +int vdi_set_change_clock(unsigned long core_idx, unsigned long clock_mask); +int vdi_done_change_clock(unsigned long core_idx); + +int vdi_get_instance_num(unsigned long core_idx); + +void vdi_write_register(unsigned long core_idx, unsigned long addr, + unsigned int data); +unsigned int vdi_read_register(unsigned long core_idx, unsigned long addr); +void vdi_fio_write_register(unsigned long core_idx, unsigned long addr, + unsigned int data); +unsigned int vdi_fio_read_register(unsigned long core_idx, unsigned long addr); +int vdi_clear_memory(unsigned long core_idx, PhysicalAddress addr, int len); +int vdi_write_memory(unsigned long core_idx, PhysicalAddress addr, + unsigned char *data, int len, int endian); +int vdi_read_memory(unsigned long core_idx, PhysicalAddress addr, + unsigned char *data, int len, int endian); +void *vdi_get_vir_addr(unsigned long core_idx, PhysicalAddress addr); + +int vdi_check_lock_by_me(unsigned long core_idx); + +int vdi_lock(unsigned long core_idx); + +int vdi_lock_check(unsigned long core_idx); +void vdi_unlock(unsigned long core_idx); +void vdi_vcodec_lock(unsigned long core_idx); +int vdi_vcodec_timelock(unsigned long core_idx, int timeout_ms); +int vdi_vcodec_trylock(unsigned long core_idx); +void vdi_vcodec_unlock(unsigned long core_idx); +int vdi_disp_lock(unsigned long core_idx); +void vdi_disp_unlock(unsigned long core_idx); +#ifdef REDUNDENT_CODE +void vdi_set_sdram(unsigned long core_idx, unsigned long addr, int len, + int endian); +#endif +#ifdef ENABLE_CNM_DEBUG_MSG +void vdi_log(unsigned long core_idx, int cmd, int step); +#endif +int vdi_open_instance(unsigned long core_idx, unsigned long inst_idx); +int vdi_close_instance(unsigned long core_idx, unsigned long inst_idx); +int vdi_set_bit_firmware_to_pm(unsigned long core_idx, + const unsigned short *code); +int vdi_get_vpu_fd(unsigned long core_idx); +#ifdef REDUNDENT_CODE +int vdi_get_system_endian(unsigned long core_idx); +#endif +int vdi_convert_endian(unsigned long core_idx, unsigned int endian); +#ifdef ENABLE_CNM_DEBUG_MSG +void vdi_print_vpu_status(unsigned long coreIdx); +#endif +PhysicalAddress vdi_remap_memory_address(unsigned long coreIdx, + PhysicalAddress address); + +int vdi_set_single_es_buf(unsigned long core_idx, BOOL use_single_es_buf, + unsigned int *single_es_buf_size); +BOOL vdi_get_is_single_es_buf(unsigned long core_idx); +int vdi_get_chip_version(void); +int vdi_get_chip_capability(unsigned long core_idx, cviCapability *pCap); +int vdi_get_task_num(unsigned long core_idx); + +#ifdef CLI_DEBUG_SUPPORT +int vdi_show_vdi_info(unsigned long core_idx); +#endif + +#if defined(__cplusplus) +} +#endif + +#endif //#ifndef _VDI_H_ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/vdi_osal.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/vdi_osal.h new file mode 100644 index 0000000000..8e0d07ae5f --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vdi/vdi_osal.h @@ -0,0 +1,651 @@ +//------------------------------------------------------------------------------ +// File: log.h +// +// Copyright (c) 2006, Chips & Media. All rights reserved. +//------------------------------------------------------------------------------ + +#ifndef _VDI_OSAL_H_ +#define _VDI_OSAL_H_ + +#include +#include +#include +#include +#include +#include "sys.h" +#include "vputypes.h" + +#ifndef G_TEST +#define CVI_VC_MSG_ENABLE +#endif + +#define USE_SWAP_264_FW + +#define CVI_MASK_ERR 0x1 +#define CVI_MASK_WARN 0x2 +#define CVI_MASK_INFO 0x4 +#define CVI_MASK_FLOW 0x8 +#define CVI_MASK_DBG 0x10 +#define CVI_MASK_INTR 0x20 +#define CVI_MASK_MCU 0x40 +#define CVI_MASK_MEM 0x80 +#define CVI_MASK_BS 0x100 +#define CVI_MASK_SRC 0x200 +#define CVI_MASK_IF 0x400 +#define CVI_MASK_LOCK 0x800 +#define CVI_MASK_PERF 0x1000 +#define CVI_MASK_CFG 0x2000 +#define CVI_MASK_RC 0x4000 +#define CVI_MASK_TRACE 0x8000 +#define CVI_MASK_DISP 0x10000 +#define CVI_MASK_MOTMAP 0x20000 +#define CVI_MASK_UBR 0x40000 +#define CVI_MASK_RQ 0x80000 +#define CVI_MASK_CVRC 0x100000 +#define CVI_MASK_AR 0x200000 +#define CVI_MASK_REG 0x80000000 + +#define CVI_MASK_CURR ((0x0) | CVI_MASK_ERR) + +#ifndef UNUSED +#define UNUSED(X) ((X) = (X)) +#endif + +#ifdef CVI_VC_MSG_ENABLE +extern unsigned int vcodec_mask; +#define CVI_PRNT(msg, ...) pr_info(msg, ##__VA_ARGS__) +#ifndef CVI_FUNC_COND +#define CVI_FUNC_COND(FLAG, FUNC) +#endif +#ifdef LOG_WITH_FUNC_NAME +#define CVI_VC_ERR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_ERR) { \ + pr_info("[ERR] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_WARN(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_WARN) { \ + pr_warn("[WARN] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_INFO(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_INFO) { \ + pr_info("[INFO] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_FLOW(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_FLOW) { \ + pr_info("[FLOW] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_DBG(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_DBG) { \ + pr_info("[DBG] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_INTR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_INTR) { \ + pr_info("[INTR] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_MCU(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_MCU) { \ + pr_info("[MCU] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_MEM(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_MEM) { \ + pr_info("[MEM] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_BS(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_BS) { \ + pr_info("[BS] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_SRC(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_SRC) { \ + pr_info("[SRC] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_IF(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_IF) { \ + pr_info("[IF] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_LOCK(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_LOCK) { \ + pr_info("[LOCK] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_PERF(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_PERF) { \ + pr_info("[PERF] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_CFG(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_CFG) { \ + pr_info("[CFG] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_RC(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_RC) { \ + pr_info("[RC] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_TRACE(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_TRACE) { \ + pr_info("[TRACE] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_DISP(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_DISP) { \ + pr_info("[DISP] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_MOTMAP(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_MOTMAP) { \ + pr_info(msg, ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_UBR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_UBR) { \ + pr_info("[UBR] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_RQ(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_RQ) { \ + pr_info("[RQ] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_CVRC(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_CVRC) { \ + pr_info("[CVRC] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_AR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_AR) { \ + pr_info("[AR] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_REG(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_REG) { \ + pr_info("[REG] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#else +#ifndef VC_DEBUG_BASIC_LEVEL +#define CVI_VC_ERR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_ERR) { \ + pr_info("[ERR] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_WARN(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_WARN) { \ + pr_warn("[WARN] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_INFO(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_INFO) { \ + pr_info("[INFO] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_FLOW(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_FLOW) { \ + pr_info("[FLOW] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_DBG(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_DBG) { \ + pr_info("[DBG] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_INTR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_INTR) { \ + pr_info("[INTR] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_MCU(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_MCU) { \ + pr_info("[MCU] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_MEM(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_MEM) { \ + pr_info("[MEM] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_BS(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_BS) { \ + pr_info("[BS] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_SRC(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_SRC) { \ + pr_info("[SRC] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_IF(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_IF) { \ + pr_info("[IF] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_LOCK(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_LOCK) { \ + pr_info("[LOCK] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_PERF(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_PERF) { \ + pr_info("[PERF] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_CFG(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_CFG) { \ + pr_info("[CFG] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_RC(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_RC) { \ + pr_info("[RC] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_TRACE(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_TRACE) { \ + pr_info("[TRACE] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_DISP(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_DISP) { \ + pr_info("[DISP] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_MOTMAP(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_MOTMAP) { \ + pr_info(msg, ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_UBR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_UBR) { \ + pr_info("[UBR] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_RQ(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_RQ) { \ + pr_info("[RQ] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_CVRC(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_CVRC) { \ + pr_info("[CVRC] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_AR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_AR) { \ + pr_info("[AR] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_REG(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_REG) { \ + pr_info("[REG] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#else +#define CVI_VC_ERR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_ERR) { \ + pr_info("[ERR] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_WARN(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_WARN) { \ + pr_warn("[WARN] %d, " msg, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) +#define CVI_VC_INFO(msg, ...) +#define CVI_VC_FLOW(msg, ...) +#define CVI_VC_DBG(msg, ...) +#define CVI_VC_INTR(msg, ...) +#define CVI_VC_MCU(msg, ...) +#define CVI_VC_MEM(msg, ...) +#define CVI_VC_BS(msg, ...) +#define CVI_VC_SRC(msg, ...) +#define CVI_VC_IF(msg, ...) +#define CVI_VC_LOCK(msg, ...) +#define CVI_VC_PERF(msg, ...) +#define CVI_VC_CFG(msg, ...) +#define CVI_VC_RC(msg, ...) +#define CVI_VC_TRACE(msg, ...) +#define CVI_VC_DISP(msg, ...) +#define CVI_VC_MOTMAP(msg, ...) +#define CVI_VC_UBR(msg, ...) +#define CVI_VC_RQ(msg, ...) +#define CVI_VC_CVRC(msg, ...) +#define CVI_VC_AR(msg, ...) +#define CVI_VC_REG(msg, ...) +#endif +#endif +#else +#define CVI_FUNC_COND(FLAG, FUNC) +#define CVI_VC_ERR(msg, ...) \ + do { \ + if (vcodec_mask & CVI_MASK_ERR) { \ + pr_info("[ERR] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } \ + } while (0) + +#define CVI_VC_WARN(msg, ...) +#define CVI_VC_INFO(msg, ...) +#define CVI_VC_FLOW(msg, ...) +#define CVI_VC_DBG(msg, ...) +#define CVI_VC_INTR(msg, ...) +#define CVI_VC_MCU(msg, ...) +#define CVI_VC_MEM(msg, ...) +#define CVI_VC_BS(msg, ...) +#define CVI_VC_SRC(msg, ...) +#define CVI_VC_IF(msg, ...) +#define CVI_VC_LOCK(msg, ...) +#define CVI_VC_PERF(msg, ...) +#define CVI_VC_CFG(msg, ...) +#define CVI_VC_RC(msg, ...) +#define CVI_VC_TRACE(msg, ...) +#define CVI_VC_DISP(msg, ...) +#define CVI_VC_MOTMAP(msg, ...) +#define CVI_VC_UBR(msg, ...) +#define CVI_VC_RQ(msg, ...) +#define CVI_VC_CVRC(msg, ...) +#define CVI_VC_AR(msg, ...) +#define CVI_VC_REG(msg, ...) +#endif + +#ifdef PLATFORM_NON_OS +#define DRAM_START (0x10B000000) + +#define WAVE420L_CODE_ADDR (0x10B000000) +#define VPU_DRAM_PHYSICAL_BASE (0x113100000) //(0x10B100000 + 128*0x100000) +#define SRC_YUV_BASE (0x11B100000) //(0x10B100000 + 256*0x100000) + +#define WAVE420L_CODE_SIZE (0x100000) +#define SRC_YUV_SIZE (0x8000000) // (128*0x100000) +#define VPU_DRAM_SIZE (0x8000000) // (128*0x100000) + +#define SUPPORT_INTERRUPT +#define VPU_TO_32BIT(x) ((x)&0xFFFFFFFF) +#define VPU_TO_64BIT(x) ((x) | 0x100000000) +#define ENABLE_RC_LIB 0 +#define CFG_MEM 1 +#define DIRECT_YUV 1 +#define SRC_YUV_CYCLIC 1 +#define ES_CYCLIC 1 +#define PROFILE_PERFORMANCE 1 +#define DUMP_SRC 0 +#define FFMPEG_EN 0 +#define MAX_TRANSRATE 51000000 + +#else + +#define VPU_TO_32BIT(x) ((x)&0xFFFFFFFF) +#define VPU_TO_64BIT(x) ((x) | 0x100000000) +#define ENABLE_RC_LIB 1 +#ifdef G_TEST +#define CFG_MEM 1 +#else +#define CFG_MEM 0 +#endif +#define DIRECT_YUV 0 +#define SRC_YUV_CYCLIC 0 +#define ES_CYCLIC 0 +#define PROFILE_PERFORMANCE 0 +#define DUMP_SRC 0 +#define FFMPEG_EN 0 +#define MAX_TRANSRATE 51000000 + +#endif + +#if CFG_MEM +typedef struct _DRAM_CFG_ { + unsigned long pucCodeAddr; + int iCodeSize; + unsigned long pucVpuDramAddr; + int iVpuDramSize; + unsigned long pucSrcYuvAddr; + int iSrcYuvSize; +} DRAM_CFG; + +extern DRAM_CFG dramCfg; +#endif + +#define TO_VIR(addr, vb) ((addr) - ((vb)->phys_addr) + ((vb)->virt_addr)) + +enum { NONE = 0, INFO, WARN, ERR, TRACE, MAX_LOG_LEVEL }; +enum { + LOG_HAS_DAY_NAME = 1, /**< Include day name [default: no] */ + LOG_HAS_YEAR = 2, /**< Include year digit [no] */ + LOG_HAS_MONTH = 4, /**< Include month [no] */ + LOG_HAS_DAY_OF_MON = 8, /**< Include day of month [no] */ + LOG_HAS_TIME = 16, /**< Include time [yes] */ + LOG_HAS_MICRO_SEC = 32, /**< Include microseconds [yes] */ + LOG_HAS_FILE = 64, /**< Include sender in the log [yes] */ + LOG_HAS_NEWLINE = 128, /**< Terminate each call with newline [yes] */ + LOG_HAS_CR = 256, /**< Include carriage return [no] */ + LOG_HAS_SPACE = 512, /**< Include two spaces before log [yes] */ + LOG_HAS_COLOR = 1024, /**< Colorize logs [yes on win32] */ + LOG_HAS_LEVEL_TEXT = + 2048 /**< Include level text string [no] */ +}; +enum { + TERM_COLOR_R = 2, /**< Red */ + TERM_COLOR_G = 4, /**< Green */ + TERM_COLOR_B = 1, /**< Blue. */ + TERM_COLOR_BRIGHT = 8 /**< Bright mask. */ +}; + +#define MAX_PRINT_LENGTH 512 + +#ifdef ANDROID +#include +#undef LOG_NDEBUG +#define LOG_NDEBUG 0 +#undef LOG_TAG +#define LOG_TAG "VPUAPI" +#endif + +#define VLOG LogMsg + +#ifdef REDUNDENT_CODE +#define LOG_ENABLE_FILE SetLogDecor(GetLogDecor() | LOG_HAS_FILE) +#endif + +typedef void *osal_file_t; +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#if defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || \ + defined(WIN32) || defined(__MINGW32__) +#elif defined(linux) || defined(__linux) || defined(ANDROID) +#else + +#ifndef stdout +#define stdout (void *)1 +#endif +#ifndef stderr +#define stderr (void *)1 +#endif + +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifdef ENABLE_LOG +int InitLog(void); +void DeInitLog(void); +#endif + +void SetMaxLogLevel(int level); +int GetMaxLogLevel(void); + +#ifdef REDUNDENT_CODE +void SetLogColor(int level, int color); +int GetLogColor(int level); + +void SetLogDecor(int decor); +int GetLogDecor(void); +#endif + +// log print +void LogMsg(int level, const char *format, ...); + +// math +int math_div(int number, int denom); +int math_modulo(int number, int denom); + +#ifdef REDUNDENT_CODE +// terminal +void osal_init_keyboard(void); +void osal_close_keyboard(void); +#endif + +// memory +void *osal_memcpy(void *dst, const void *src, int count); +void *osal_memset(void *dst, int val, int count); +int osal_memcmp(const void *src, const void *dst, int size); +void *osal_malloc(int size); +#ifdef REDUNDENT_CODE +void *osal_realloc(void *ptr, int size); +#endif +void osal_free(void *p); + +osal_file_t osal_fopen(const char *osal_file_tname, const char *mode); +size_t osal_fwrite(const void *p, int size, int count, osal_file_t fp); +size_t osal_fread(void *p, int size, int count, osal_file_t fp); +long osal_ftell(osal_file_t fp); +int osal_fseek(osal_file_t fp, long offset, int origin); +int osal_fclose(osal_file_t fp); +#ifdef REDUNDENT_CODE +int osal_fprintf(osal_file_t fp, const char *_Format, ...); +int osal_fscanf(osal_file_t fp, const char *_Format, ...); +int osal_kbhit(void); +int osal_getch(void); +int osal_flush_ch(void); +#endif +int osal_feof(osal_file_t fp); +void *osal_create_mutex(const char *name); +void osal_close_mutex(void *handle); +int osal_mutex_lock(void *handle); +int osal_mutex_unlock(void *handle); +int osal_rand(void); +void *osal_kmalloc(int size); +void osal_kfree(void *p); +void *osal_ion_alloc(int size); +void osal_ion_free(void *p); + +#if defined(__cplusplus) +} +#endif + +#endif //#ifndef _VDI_OSAL_H_ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/Android.mk b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/Android.mk new file mode 100644 index 0000000000..dcd21ca20f --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/Android.mk @@ -0,0 +1,74 @@ +LOCAL_PATH := $(call my-dir) + +# FOR C&M FPGA Environment +CNM_FPGA_FLAGS := -DCNM_FPGA_PLATFORM -DCNM_FPGA_USB_INTERFACE -DSUPPORT_USB_TRANSFER -DSUPPORT_CONF_TEST +ifeq ($(PRODUCT), 7Q) +CNM_CFLAGS := -DCODA7Q $(CNM_FPGA_FLAGS) +endif +ifeq ($(PRODUCT), 960) +CNM_CFLAGS := -DCODA960 $(CNM_FPGA_FLAGS) +endif +ifeq ($(PRODUCT), 980) +CNM_CFLAGS := -DCODA980 $(CNM_FPGA_FLAGS) +endif +ifeq ($(PRODUCT), 410) +CNM_CFLAGS := -DWAVE410 $(CNM_FPGA_FLAGS) +endif +ifeq ($(PRODUCT), 412) +CNM_CFLAGS := -DWAVE412 $(CNM_FPGA_FLAGS) +endif +ifeq ($(PRODUCT), 420) +CNM_CFLAGS := -DWAVE420 $(CNM_FPGA_FLAGS) +endif +# + +# Building the vpuapi +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + ../vdi/linux/vdi.c \ + ../vdi/linux/vdi_osal.c + +LOCAL_SRC_FILES += \ + vpuapi.c \ + product.c \ + coda9/coda9.c \ + wave/common/common.c \ + wave/coda7q/coda7q.c \ + wave/wave4/wave4.c \ + vpuapifunc.c + +# ../vdi/mm.c + +# LOCAL_SRC_FILES += \ +# ../vdi/socket/vdi.c \ +# ../vdi/socket/vdi_osal.c \ +# ../vdi/socket/hpi_client.c \ +# ../vdi/mm.c + + + +LOCAL_MODULE_TAGS := eng +LOCAL_MODULE := libvpu + +LOCAL_CFLAGS := -DCONFIG_DEBUG_LEVEL=255 $(CNM_CFLAGS) +# LOCAL_CFLAGS += -DCNM_FPGA_PLATFORM -DCNM_FPGA_USB_INTERFACE + + +LOCAL_STATIC_LIBRARIES := + +LOCAL_SHARED_LIBRARIES := \ + libutils \ + libdl \ + libdvm \ + liblog + + +LOCAL_C_INCLUDES := $(LOCAL_PATH)/src \ + $(TOP)/hardware/vpu \ + $(TOP)/hardware/vpu/include + + + +include $(BUILD_SHARED_LIBRARY) + diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/980_roi_rc_lib/frm_rc.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/980_roi_rc_lib/frm_rc.h new file mode 100644 index 0000000000..adf3f0d459 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/980_roi_rc_lib/frm_rc.h @@ -0,0 +1,64 @@ +#ifndef _FRM_RC_H_ +#define _FRM_RC_H_ + +#include "hevc_enc_rc.h" + +typedef struct { + rc_pic_t rc_pic; +} frm_rc_t; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef AUTO_FRM_SKIP_DROP +void frm_rc_set_auto_skip_param(frm_rc_t *rc, int en_auto_frm_skip, + int en_auto_frm_drop, int vbv_threshold, + int qp_threshold, + int max_continuos_frame_skip_num, + int max_continuos_frame_drop_num); +#endif +void frm_rc_seq_init( + // IN + frm_rc_t *rc, + int bps, // unit is bits per second + int buf_size_ms, // HRD buffer size in unit of millisecond + int frame_rate, int pic_width, int pic_height, + int intra_period, // 0(only first), 1(all intra),.. + int rc_mode, int gop_size, gop_entry_t gop[MAX_GOP_SIZE], + int longterm_delta_qp, int rc_initial_qp, int is_first_pic, int gamma, + int rc_weight_factor +#ifdef CLIP_PIC_DELTA_QP + , + int max_delta_qp_minus, + int max_delta_qp_plus +#endif +); //-1(internally calculate initial QP), 0~51(use this for initial QP) + +void frm_rc_pic_init( + // IN + frm_rc_t *rc, int is_intra, int min_qp, int max_qp, +#ifdef AUTO_FRM_SKIP_DROP + int target_rate, +#endif +// OUT +#ifdef CLIP_PIC_DELTA_QP + int *max_delta_qp_minus, int *max_delta_qp_plus, +#endif + + int curr_long_term, int *out_qp, int *pic_target_bit, + int *hrd_buf_level, + int *hrd_buf_size); // when en_roi=1, it's non-ROI QP. otherwise it's + // frame QP. + +void frm_rc_pic_end( + // IN + frm_rc_t *rc, int real_pic_bit, int avg_qp, int frame_skip_flag); +int get_temporal_dqp(frm_rc_t *rc, int enc_idx_modulo, int slice_type, + int is_LongTerm, int PicQpY); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/980_roi_rc_lib/hevc_enc_rc.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/980_roi_rc_lib/hevc_enc_rc.h new file mode 100644 index 0000000000..25571fe13e --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/980_roi_rc_lib/hevc_enc_rc.h @@ -0,0 +1,151 @@ +#ifndef _HEVC_ENC_RC_H_ +#define _HEVC_ENC_RC_H_ + +#include "util_float.h" + +#define MAX_GOP_SIZE 8 +#define PARA_CHANGE_RC_SEQ_INIT + +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define CLIP3(a, b, c) (MIN(b, MAX(a, c))) +#define ABS(a) ((a >= 0) ? a : -a) + +enum { + BIT_ALLOC_ADAPTIVE, + BIT_ALLOC_FIXED_RATIO, +}; + +typedef struct { + int dqp; // delta qp relative anchor qp + FLOAT_T a; // QP = a*log2R + b + FLOAT_T b; + FLOAT_T bpp; // from alloc_gop_bit() +} rq_model_t; + +typedef struct { + int curr_poc; + int qp_offset; + int temporal_id; + int ref_poc; + int ref_long_term; +} gop_entry_t; + +typedef struct { + int used_for_ref; + int slice_type; + int poc; + int frame_num; +} frm_t; + +typedef struct { + int num_poc; + int poc[MAX_GOP_SIZE]; + int used_for_ref; // flag to indicate that this frame is reference frame + // or not +} rps_t; + +typedef struct { + // int32_t pic_type; + int32_t curr_poc; + int32_t qp; + // int32_t temporal_id; + // int32_t ref_poc[2]; +} fw_gop_entry_t; + +typedef struct { + int num_pixel_in_pic; + int mb_width; + int mb_height; + int gop_size; + int intra_period; + int bit_alloc_mode; + + int fixed_bit_ratio[MAX_GOP_SIZE]; + + int mode; + int avg_pic_bit; + int xmit_pic_bit; + + rq_model_t intra_model; + rq_model_t inter_model[MAX_GOP_SIZE]; + rq_model_t *curr_model; + rq_model_t *anchor_model; + FLOAT_T avg_bpp; + int min_qp; + int max_qp; + int buf_level; + int init_level; + int buf_size; + + int frame_num; // for trace + int initial_qp; + int max_intra_bit; + int para_changed; +#ifdef AUTO_FRM_SKIP_DROP + int en_auto_frm_skip; + int en_auto_frm_drop; + int vbv_threshold; + int qp_threshold; + int max_continuos_frame_skip_num; + int max_continuos_frame_drop_num; + int frame_skip; + int frame_drop; + int skip_cnt; + int drop_cnt; +#endif + int weight_factor; + int gamma; + +#ifdef CLIP_PIC_DELTA_QP + int last_anchor_qp; + int max_delta_qp_plus; + int max_delta_qp_minus; +#endif + int enc_order_in_gop; + + int long_term_delta_qp; + +} rc_pic_t; + +#ifdef __cplusplus +extern "C" { +#endif + +void rc_init(rc_pic_t *rc); + +void rc_seq_init( + // IN + rc_pic_t *rc, int enc_bps, int xmit_bps, int buf_size_ms, + int bit_alloc_mode, int fixed_bit_ratio[MAX_GOP_SIZE], int frame_rate, + int gop_size, gop_entry_t gop[MAX_GOP_SIZE], int pic_width, + int pic_height, int intra_period, int rc_mode, int intra_qp, + int rc_initial_qp, int is_para_change, int weight_factor, int gamma, +#ifdef CLIP_PIC_DELTA_QP + int max_delta_qp_minus, int max_delta_qp_plus, +#endif + int longterm_delta_qp, + // OUT + int *hrd_buf_size); + +void rc_pic_init( + // IN + rc_pic_t *rc, int is_intra, int enc_order_in_gop, int min_qp, + int max_qp, +// OUT +#ifdef CLIP_PIC_DELTA_QP + int *max_delta_qp_minus, int *max_delta_qp_plus, +#endif + + int curr_long_term, int *pic_qp, int *pic_target_bit, + int *hrd_buf_level, int *hrd_buf_size); + +void rc_pic_end( + // IN + rc_pic_t *rc, int avg_qp, int real_pic_bit, int frm_skip_flag); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/980_roi_rc_lib/util_float.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/980_roi_rc_lib/util_float.h new file mode 100644 index 0000000000..ea6c6b34c6 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/980_roi_rc_lib/util_float.h @@ -0,0 +1,35 @@ +#ifndef _UTIL_FLOAT_ +#define _UTIL_FLOAT_ + +#define OPT_FLOAT + +#ifdef OPT_FLOAT +typedef struct { + int16_t sig; // significant + int16_t exp; // exponent +} FLOAT_T; +#else +typedef double FLOAT_T; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +FLOAT_T FINIT(int32_t sig, int32_t exp); +FLOAT_T FADD(FLOAT_T x, FLOAT_T y); // max error 0.006% +FLOAT_T FSUB(FLOAT_T x, FLOAT_T y); // max error 0.006% +FLOAT_T FMUL(FLOAT_T x, FLOAT_T y); // max error 0.006% +FLOAT_T FDIV(FLOAT_T x, FLOAT_T y); // max error 0.006% +FLOAT_T FLOG2(FLOAT_T x); // max error 0.6% +FLOAT_T FPOW2(FLOAT_T x); // max error 0.02% +int32_t FINT(FLOAT_T x); // max error 0.5 +FLOAT_T FMIN(FLOAT_T x, FLOAT_T y); +FLOAT_T FMAX(FLOAT_T x, FLOAT_T y); +FLOAT_T FMINMAX(FLOAT_T min, FLOAT_T max, FLOAT_T x); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9.c new file mode 100644 index 0000000000..460f63b073 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9.c @@ -0,0 +1,5172 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#include "coda9_vpuconfig.h" +#include "product.h" +#include "coda9_regdefine.h" +#include "coda9.h" +#include "main_helper.h" +#include "cvi_enc_internal.h" + +#define SUPPORT_ASO_FMO 1 +#define USE_SWAP_264_FW + +#define UNREFERENCED_PARAM(x) ((void)(x)) + +static int Coda9VpuEncCalcPicQp(CodecInst *pCodecInst, EncParam *param, + int *pRowMaxDqpMinus, int *pRowMaxDqpPlus, + int *pOutQp, int *pTargetPicBit, + int *pHrdBufLevel, int *pHrdBufSize); +static void Coda9VpuEncGetPicInfo(EncInfo *pEncInfo, int *p_pic_idx, + int *p_gop_num, int *p_slice_type); +static void cviPrintFrmRc(frm_rc_t *pFrmRc); + +static void LoadBitCode(Uint32 coreIdx, PhysicalAddress codeBase, + const Uint16 *codeWord, int codeSize) +{ +#ifndef USE_SWAP_264_FW + int i; +#ifdef CVI_VC_MSG_ENABLE + int load, prevLoad = -1; +#endif + BYTE code[8]; + + for (i = 0; i < codeSize; i += 4) { + // 2byte little endian variable to 1byte big endian buffer + code[0] = (BYTE)(codeWord[i + 0] >> 8); + code[1] = (BYTE)codeWord[i + 0]; + code[2] = (BYTE)(codeWord[i + 1] >> 8); + code[3] = (BYTE)codeWord[i + 1]; + code[4] = (BYTE)(codeWord[i + 2] >> 8); + code[5] = (BYTE)codeWord[i + 2]; + code[6] = (BYTE)(codeWord[i + 3] >> 8); + code[7] = (BYTE)codeWord[i + 3]; + VpuWriteMem(coreIdx, codeBase + i * 2, (BYTE *)code, 8, + VDI_BIG_ENDIAN); + +#ifdef CVI_VC_MSG_ENABLE + load = i * 100 / codeSize; + if (load != prevLoad) { + printf("%d %%\r", load); + prevLoad = load; + } +#endif + } +#else + VpuWriteMem(coreIdx, codeBase, (BYTE *)codeWord, codeSize * 2, + VDI_128BIT_LITTLE_ENDIAN); +#endif + + CVI_VC_FLOW("\n"); + + vdi_set_bit_firmware_to_pm(coreIdx, codeWord); +} + +static RetCode BitLoadFirmware(Uint32 coreIdx, PhysicalAddress codeBase, + const Uint16 *codeWord, int codeSize) +{ + int i, len; + +#ifdef SMALL_CODE_SIZE + len = 10 * 1024; +#else + len = 2048; +#endif + + LoadBitCode(coreIdx, codeBase, codeWord, codeSize); + + VpuWriteReg(coreIdx, BIT_INT_ENABLE, 0); + VpuWriteReg(coreIdx, BIT_CODE_RUN, 0); + +#ifndef USE_SWAP_264_FW +#ifdef CVI_VC_MSG_ENABLE + int load = -1, prevLoad = -1; +#endif + Uint32 data; + + for (i = 0; i < len; ++i) { + data = codeWord[i]; + VpuWriteReg(coreIdx, BIT_CODE_DOWN, (i << 16) | data); + +#ifdef CVI_VC_MSG_ENABLE + load = i * 100 / len; + if (load != prevLoad) { + printf("%d %%\r", load); + prevLoad = load; + } +#endif + } +#else + + for (i = 0; i < len; i += 4) { + uint64_t code = *(uint64_t *)&codeWord[i]; + + VpuWriteReg(coreIdx, BIT_CODE_DOWN, + (i << 16) | ((code >> 48) & 0xFFFF)); + VpuWriteReg(coreIdx, BIT_CODE_DOWN, + ((i + 1) << 16) | ((code >> 32) & 0xFFFF)); + VpuWriteReg(coreIdx, BIT_CODE_DOWN, + ((i + 2) << 16) | ((code >> 16) & 0xFFFF)); + VpuWriteReg(coreIdx, BIT_CODE_DOWN, + ((i + 3) << 16) | (code & 0xFFFF)); + } + +#endif + CVI_VC_FLOW("\n"); + + return RETCODE_SUCCESS; +} + +static void SetEncFrameMemInfo(CodecInst *pCodecInst) +{ + Uint32 val; + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + + switch (pCodecInst->productId) { + case PRODUCT_ID_980: + val = (pEncInfo->openParam.bwbEnable << 15) | + (pEncInfo->linear2TiledMode << 13) | + (pEncInfo->mapType << 9); + if (pEncInfo->openParam.EncStdParam.avcParam.chromaFormat400) + val |= (FORMAT_400 << 6); + else + val |= (FORMAT_420 << 6); + val |= ((pEncInfo->openParam.cbcrInterleave) + << 2); // Interleave + // bit + // position + // is + // modified + val |= pEncInfo->openParam.frameEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_FRAME_MEM_CTRL, val); + + break; +#ifdef REDUNDENT_CODE + case PRODUCT_ID_960: + val = 0; + if (pEncInfo->mapType) { + if (pEncInfo->mapType == TILED_FRAME_MB_RASTER_MAP || + pEncInfo->mapType == TILED_FIELD_MB_RASTER_MAP) + val |= (pEncInfo->linear2TiledEnable << 11) | + (0x03 << 9) | (FORMAT_420 << 6); + else + val |= (pEncInfo->linear2TiledEnable << 11) | + (0x02 << 9) | (FORMAT_420 << 6); + } + val |= ((pEncInfo->openParam.cbcrInterleave) + << 2); // Interleave + // bit + // position + // is + // modified + val |= (pEncInfo->openParam.cbcrInterleave & + pEncInfo->openParam.nv21) + << 3; + val |= (pEncInfo->openParam.bwbEnable << 12); + val |= pEncInfo->openParam.frameEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_FRAME_MEM_CTRL, val); + break; +#endif + } +} + +void Coda9BitIssueCommand(Uint32 coreIdx, CodecInst *inst, int cmd) +{ + int instIdx = 0; + int cdcMode = 0; + int auxMode = 0; + + if (inst != NULL) { + // command is specific to instance + instIdx = inst->instIndex; + cdcMode = inst->codecMode; + auxMode = inst->codecModeAux; + } + + if (inst) { + if (inst->codecMode < AVC_ENC) { + VpuWriteReg(coreIdx, BIT_WORK_BUF_ADDR, + inst->CodecInfo->decInfo.vbWork.phys_addr); + } else { + VpuWriteReg(coreIdx, BIT_WORK_BUF_ADDR, + inst->CodecInfo->encInfo.vbWork.phys_addr); + } + } + + VpuWriteReg(coreIdx, BIT_BUSY_FLAG, 1); + VpuWriteReg(coreIdx, BIT_RUN_INDEX, instIdx); + VpuWriteReg(coreIdx, BIT_RUN_COD_STD, cdcMode); + VpuWriteReg(coreIdx, BIT_RUN_AUX_STD, auxMode); +#ifdef ENABLE_CNM_DEBUG_MSG + if (inst && inst->loggingEnable) + vdi_log(coreIdx, cmd, 1); +#endif + VpuWriteReg(coreIdx, BIT_RUN_COMMAND, cmd); +} + +static void SetupCoda9Properties(Uint32 coreIdx, Uint32 productId) +{ + VpuAttr *pAttr = &g_VpuCoreAttributes[coreIdx]; + Int32 val; + char *pstr; + + /* Setup Attributes */ + pAttr = &g_VpuCoreAttributes[coreIdx]; + + // Hardware version information + val = VpuReadReg(coreIdx, VPU_PRODUCT_CODE_REGISTER); + if ((val & 0xff00) == 0x3200) + val = 0x3200; + val = VpuReadReg(coreIdx, DBG_CONFIG_REPORT_0); + pstr = (char *)&val; + pAttr->productName[0] = pstr[3]; + pAttr->productName[1] = pstr[2]; + pAttr->productName[2] = pstr[1]; + pAttr->productName[3] = pstr[0]; + pAttr->productName[4] = 0; + + pAttr->supportDecoders = (1 << STD_AVC) | (1 << STD_VC1) | + (1 << STD_MPEG2) | (1 << STD_MPEG4) | + (1 << STD_H263) | (1 << STD_AVS) | + (1 << STD_DIV3) | (1 << STD_RV) | + (1 << STD_THO) | (1 << STD_VP8); + + /* Encoder */ + pAttr->supportEncoders = + (1 << STD_AVC) | (1 << STD_MPEG4) | (1 << STD_H263); + CVI_VC_TRACE("supportEncoders = 0x%X\n", pAttr->supportEncoders); + + /* WTL */ + if (productId == PRODUCT_ID_960 || productId == PRODUCT_ID_980) { + pAttr->supportWTL = 1; + } + /* Tiled2Linear */ + pAttr->supportTiled2Linear = 1; + /* Maptypes */ + pAttr->supportMapTypes = + (1 << LINEAR_FRAME_MAP) | (1 << TILED_FRAME_V_MAP) | + (1 << TILED_FRAME_H_MAP) | (1 << TILED_FIELD_V_MAP) | + (1 << TILED_MIXED_V_MAP) | (1 << TILED_FRAME_MB_RASTER_MAP) | + (1 << TILED_FIELD_MB_RASTER_MAP); + if (productId == PRODUCT_ID_980) { + pAttr->supportMapTypes |= (1 << TILED_FRAME_NO_BANK_MAP) | + (1 << TILED_FIELD_NO_BANK_MAP); + } + /* Linear2Tiled */ + if (productId == PRODUCT_ID_960 || productId == PRODUCT_ID_980) { + pAttr->supportLinear2Tiled = 1; + } + /* Framebuffer Cache */ +#ifdef REDUNDENT_CODE0 + if (productId == PRODUCT_ID_960) + pAttr->framebufferCacheType = FramebufCacheMaverickI; + else +#endif + if (productId == PRODUCT_ID_980) + pAttr->framebufferCacheType = FramebufCacheMaverickII; + else + pAttr->framebufferCacheType = FramebufCacheNone; + /* AXI 128bit Bus */ + pAttr->support128bitBus = FALSE; + pAttr->supportEndianMask = + (1 << VDI_LITTLE_ENDIAN) | (1 << VDI_BIG_ENDIAN) | + (1 << VDI_32BIT_LITTLE_ENDIAN) | (1 << VDI_32BIT_BIG_ENDIAN); + pAttr->supportBitstreamMode = + (1 << BS_MODE_INTERRUPT) | (1 << BS_MODE_PIC_END); + pAttr->bitstreamBufferMargin = VPU_GBU_SIZE; + pAttr->numberOfMemProtectRgns = 6; +} + +Uint32 Coda9VpuGetProductId(Uint32 coreIdx) +{ + Uint32 productId; + Uint32 val; + + val = VpuReadReg(coreIdx, VPU_PRODUCT_CODE_REGISTER); + +#ifdef REDUNDENT_CODE + if (val == BODA950_CODE) + productId = PRODUCT_ID_950; + else if (val == CODA960_CODE) + productId = PRODUCT_ID_960; + else +#endif + if (val == CODA980_CODE) + productId = PRODUCT_ID_980; + else + productId = PRODUCT_ID_NONE; + + if (productId != PRODUCT_ID_NONE) + SetupCoda9Properties(coreIdx, productId); + + return productId; +} + +RetCode Coda9VpuGetVersion(Uint32 coreIdx, Uint32 *versionInfo, + Uint32 *revision) +{ + /* Get Firmware version */ + VpuWriteReg(coreIdx, RET_FW_VER_NUM, 0); + Coda9BitIssueCommand(coreIdx, NULL, FIRMWARE_GET); + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) + return RETCODE_VPU_RESPONSE_TIMEOUT; + + if (versionInfo != NULL) { + *versionInfo = VpuReadReg(coreIdx, RET_FW_VER_NUM); + } + if (revision != NULL) { + *revision = VpuReadReg(coreIdx, RET_FW_CODE_REV); + } + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuInit(Uint32 coreIdx, void *firmware, Uint32 size) +{ + Uint32 data; + vpu_buffer_t vb; + PhysicalAddress tempBuffer; + PhysicalAddress paraBuffer; + PhysicalAddress codeBuffer; + Uint64 start_time, end_time; + + vdi_get_common_memory((unsigned long)coreIdx, &vb); + + codeBuffer = vb.phys_addr; + tempBuffer = codeBuffer + CODE_BUF_SIZE; + paraBuffer = tempBuffer + TEMP_BUF_SIZE; + + CVI_VC_MCU("VPU INIT Start\n"); + + start_time = cviGetCurrentTime(); + + BitLoadFirmware(coreIdx, codeBuffer, (const Uint16 *)firmware, size); + + /* Clear registers */ + if (vdi_read_register(coreIdx, BIT_CUR_PC) == 0) { + Uint32 i; + for (i = 0; i < 64; i++) { + vdi_write_register(coreIdx, (i * 4) + 0x100, 0x0); + } + } + end_time = cviGetCurrentTime(); + CVI_VC_PERF("Coda9 LoadFirmware = %llu us\n", end_time - start_time); + + VpuWriteReg(coreIdx, BIT_PARA_BUF_ADDR, paraBuffer); + VpuWriteReg(coreIdx, BIT_CODE_BUF_ADDR, codeBuffer); + VpuWriteReg(coreIdx, BIT_TEMP_BUF_ADDR, tempBuffer); + + VpuWriteReg(coreIdx, BIT_BIT_STREAM_CTRL, VPU_STREAM_ENDIAN); + VpuWriteReg(coreIdx, BIT_FRAME_MEM_CTRL, + CBCR_INTERLEAVE << 2 | VPU_FRAME_ENDIAN); // Interleave bit + // position is + // modified + VpuWriteReg(coreIdx, BIT_BIT_STREAM_PARAM, 0); + + VpuWriteReg(coreIdx, BIT_AXI_SRAM_USE, 0); + VpuWriteReg(coreIdx, BIT_INT_ENABLE, 0); + VpuWriteReg(coreIdx, BIT_ROLLBACK_STATUS, 0); + + data = (1 << INT_BIT_BIT_BUF_FULL); + data |= (1 << INT_BIT_BIT_BUF_EMPTY); + data |= (1 << INT_BIT_DEC_MB_ROWS); + data |= (1 << INT_BIT_SEQ_INIT); + data |= (1 << INT_BIT_DEC_FIELD); + data |= (1 << INT_BIT_PIC_RUN); + + VpuWriteReg(coreIdx, BIT_INT_ENABLE, data); + VpuWriteReg(coreIdx, BIT_INT_CLEAR, 0x1); + VpuWriteReg(coreIdx, BIT_BUSY_FLAG, 0x1); + VpuWriteReg(coreIdx, BIT_CODE_RESET, 1); + VpuWriteReg(coreIdx, BIT_CODE_RUN, 1); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == + -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuReInit(Uint32 coreIdx, void *firmware, Uint32 size) +{ + vpu_buffer_t vb; + PhysicalAddress tempBuffer; + PhysicalAddress paraBuffer; + PhysicalAddress codeBuffer; + PhysicalAddress oldCodeBuffer; + + CVI_VC_TRACE("\n"); + + vdi_get_common_memory((unsigned long)coreIdx, &vb); + + codeBuffer = vb.phys_addr; + tempBuffer = codeBuffer + CODE_BUF_SIZE; + paraBuffer = tempBuffer + TEMP_BUF_SIZE; + + oldCodeBuffer = VpuReadReg(coreIdx, BIT_CODE_BUF_ADDR); + + VpuWriteReg(coreIdx, BIT_PARA_BUF_ADDR, paraBuffer); + VpuWriteReg(coreIdx, BIT_CODE_BUF_ADDR, codeBuffer); + VpuWriteReg(coreIdx, BIT_TEMP_BUF_ADDR, tempBuffer); + + if (oldCodeBuffer != codeBuffer) { + LoadBitCode(coreIdx, codeBuffer, (const Uint16 *)firmware, + size); + } + + return RETCODE_SUCCESS; +} + +Uint32 Coda9VpuIsInit(Uint32 coreIdx) +{ + Uint32 pc; + + pc = VpuReadReg(coreIdx, BIT_CUR_PC); + + CVI_VC_TRACE("cur pc = 0x%X\n", pc); + return pc; +} + +Int32 Coda9VpuIsBusy(Uint32 coreIdx) +{ + return VpuReadReg(coreIdx, BIT_BUSY_FLAG); +} + +Int32 Coda9VpuWaitInterrupt(CodecInst *handle, Int32 timeout) +{ + Int32 reason = 0; + + reason = vdi_wait_interrupt(handle->coreIdx, timeout, + (uint64_t *)&handle->u64EndTime); + + if ((Uint32)reason != INTERRUPT_TIMEOUT_VALUE) { + VpuWriteReg(handle->coreIdx, BIT_INT_CLEAR, + 1); // clear HW signal + } + + return reason; +} +RetCode Coda9VpuClearInterrupt(Uint32 coreIdx) +{ + VpuWriteReg(coreIdx, BIT_INT_REASON, + 0); // tell to F/W that HOST received an interrupt. + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuReset(Uint32 coreIdx, SWResetMode resetMode) +{ + Uint32 cmd; + Int32 productId = Coda9VpuGetProductId(coreIdx); + + CVI_VC_TRACE("\n"); + if (productId == PRODUCT_ID_960 || productId == PRODUCT_ID_980) { + if (resetMode != SW_RESET_ON_BOOT) { + cmd = VpuReadReg(coreIdx, BIT_RUN_COMMAND); + if (cmd == DEC_SEQ_INIT || cmd == PIC_RUN) { + if (VpuReadReg(coreIdx, BIT_BUSY_FLAG) || + VpuReadReg(coreIdx, BIT_INT_REASON)) { +#define MBC_SET_SUBBLK_EN (MBC_BASE + 0xA0) + // subblk_man_mode[20] + // cr_subblk_man_en[19:0] stop all of + // pipeline + VpuWriteReg(coreIdx, MBC_SET_SUBBLK_EN, + ((1 << 20) | 0)); + + // force to set the end of Bitstream to + // be decoded. + cmd = VpuReadReg(coreIdx, + BIT_BIT_STREAM_PARAM); +#ifndef PLATFORM_NON_OS + cmd |= 1 << 2; +#endif + VpuWriteReg(coreIdx, + BIT_BIT_STREAM_PARAM, cmd); + + cmd = VpuReadReg(coreIdx, BIT_RD_PTR); + VpuWriteReg(coreIdx, BIT_WR_PTR, cmd); + + cmd = vdi_wait_interrupt( + coreIdx, __VPU_BUSY_TIMEOUT, + NULL); + + if (cmd != INTERRUPT_TIMEOUT_VALUE) { + VpuWriteReg(coreIdx, + BIT_INT_REASON, 0); + VpuWriteReg(coreIdx, + BIT_INT_CLEAR, + 1); // clear HW + // signal + } + // now all of hardwares would be stop. + } + } + } + + // Waiting for completion of BWB transaction first + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + GDI_BWB_STATUS) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_log(coreIdx, 0x10, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + // Waiting for completion of bus transaction + // Step1 : No more request + VpuWriteReg(coreIdx, GDI_BUS_CTRL, + 0x11); // no more request + // {3'b0,no_more_req_sec,3'b0,no_more_req} + + // Step2 : Waiting for completion of bus transaction + if (vdi_wait_bus_busy(coreIdx, __VPU_BUSY_TIMEOUT, + GDI_BUS_STATUS) == -1) { + VpuWriteReg(coreIdx, GDI_BUS_CTRL, 0x00); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_log(coreIdx, 0x10, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + cmd = 0; + // Software Reset Trigger + if (resetMode != SW_RESET_ON_BOOT) + cmd = VPU_SW_RESET_BPU_CORE | VPU_SW_RESET_BPU_BUS; + cmd |= VPU_SW_RESET_VCE_CORE | VPU_SW_RESET_VCE_BUS; + if (resetMode == SW_RESET_ON_BOOT) + cmd |= VPU_SW_RESET_GDI_CORE | + VPU_SW_RESET_GDI_BUS; // If you reset GDI, tiled + // map should be + // reconfigured + + VpuWriteReg(coreIdx, BIT_SW_RESET, cmd); + + // wait until reset is done + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + BIT_SW_RESET_STATUS) == -1) { + VpuWriteReg(coreIdx, BIT_SW_RESET, 0x00); + VpuWriteReg(coreIdx, GDI_BUS_CTRL, 0x00); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_log(coreIdx, 0x10, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + VpuWriteReg(coreIdx, BIT_SW_RESET, 0); + + // Step3 : must clear GDI_BUS_CTRL after done SW_RESET + VpuWriteReg(coreIdx, GDI_BUS_CTRL, 0x00); + } else { +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_log(coreIdx, 0x10, 0); +#endif + return RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuSleepWake_EX(Uint32 coreIdx, int iSleepWake, const Uint16 *code, + Uint32 size) +{ + static unsigned int regBk[64]; + int i = 0; +#ifdef FIRMWARE_H + const Uint16 *bit_code = NULL; + if (code && size > 0) + bit_code = code; + + if (!bit_code) { + CVI_VC_ERR("no bit_code\n"); + return RETCODE_INVALID_PARAM; + } +#endif + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == + -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + if (iSleepWake == 1) { + for (i = 0; i < 64; i++) + regBk[i] = + VpuReadReg(coreIdx, BIT_BASE + 0x100 + (i * 4)); + + VpuWriteReg(coreIdx, BIT_INT_ENABLE, 0); + VpuWriteReg(coreIdx, BIT_CODE_RUN, 0); + } else { + VpuWriteReg(coreIdx, BIT_CODE_RUN, 0); + + for (i = 0; i < 64; i++) + VpuWriteReg(coreIdx, BIT_BASE + 0x100 + (i * 4), + regBk[i]); + + VpuWriteReg(coreIdx, BIT_BUSY_FLAG, 1); + VpuWriteReg(coreIdx, BIT_CODE_RESET, 1); + VpuWriteReg(coreIdx, BIT_CODE_RUN, 1); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + } + + return RETCODE_SUCCESS; +} + +#ifdef REDUNDENT_CODE +RetCode Coda9VpuSleepWake(Uint32 coreIdx, int iSleepWake, const Uint16 *code, + Uint32 size) +{ + static unsigned int regBk[64]; + int i = 0; + const Uint16 *bit_code = NULL; + if (code && size > 0) + bit_code = code; + + if (!bit_code) { + CVI_VC_ERR("no bit_code\n"); + return RETCODE_INVALID_PARAM; + } + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == + -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + if (iSleepWake == 1) { + for (i = 0; i < 64; i++) + regBk[i] = + VpuReadReg(coreIdx, BIT_BASE + 0x100 + (i * 4)); + } else { + VpuWriteReg(coreIdx, BIT_CODE_RUN, 0); + + for (i = 0; i < 64; i++) + VpuWriteReg(coreIdx, BIT_BASE + 0x100 + (i * 4), + regBk[i]); + + VpuWriteReg(coreIdx, BIT_BUSY_FLAG, 1); + VpuWriteReg(coreIdx, BIT_CODE_RESET, 1); + VpuWriteReg(coreIdx, BIT_CODE_RUN, 1); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + } + + return RETCODE_SUCCESS; +} +#endif + +static RetCode SetupDecCodecInstance(Int32 productId, CodecInst *pCodec) +{ + DecInfo *pDecInfo = &pCodec->CodecInfo->decInfo; +#ifndef REDUNDENT_CODE + UNREFERENCED_PARAM(productId); +#endif + + pDecInfo->streamRdPtrRegAddr = BIT_RD_PTR; + pDecInfo->streamWrPtrRegAddr = BIT_WR_PTR; + pDecInfo->frameDisplayFlagRegAddr = BIT_FRM_DIS_FLG; + pDecInfo->currentPC = BIT_CUR_PC; + pDecInfo->busyFlagAddr = BIT_BUSY_FLAG; + +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + pDecInfo->dramCfg.rasBit = EM_RAS; + pDecInfo->dramCfg.casBit = EM_CAS; + pDecInfo->dramCfg.bankBit = EM_BANK; + pDecInfo->dramCfg.busBit = EM_WIDTH; + } +#endif + + return RETCODE_SUCCESS; +} + +static RetCode SetupEncCodecInstance(Int32 productId, CodecInst *pCodec) +{ + EncInfo *pEncInfo = &pCodec->CodecInfo->encInfo; +#ifndef REDUNDENT_CODE + UNREFERENCED_PARAM(productId); +#endif + + pEncInfo->streamRdPtrRegAddr = BIT_RD_PTR; + pEncInfo->streamWrPtrRegAddr = BIT_WR_PTR; + pEncInfo->currentPC = BIT_CUR_PC; + pEncInfo->busyFlagAddr = BIT_BUSY_FLAG; + +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + pEncInfo->dramCfg.rasBit = EM_RAS; + pEncInfo->dramCfg.casBit = EM_CAS; + pEncInfo->dramCfg.bankBit = EM_BANK; + pEncInfo->dramCfg.busBit = EM_WIDTH; + } +#endif + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuBuildUpDecParam(CodecInst *pCodec, DecOpenParam *param) +{ + RetCode ret = RETCODE_SUCCESS; + Uint32 coreIdx; + Uint32 productId; + DecInfo *pDecInfo = &pCodec->CodecInfo->decInfo; + + coreIdx = pCodec->coreIdx; + productId = Coda9VpuGetProductId(coreIdx); + + ret = SetupDecCodecInstance(productId, pCodec); + if (ret != RETCODE_SUCCESS) + return ret; + + if (param->vbWork.size) { + pDecInfo->vbWork = param->vbWork; + pDecInfo->workBufferAllocExt = 1; + } else { + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + pDecInfo->vbWork.size = WORK_BUF_SIZE; + if (pCodec->codecMode == AVC_DEC) + pDecInfo->vbWork.size += PS_SAVE_SIZE; + + CVI_VC_MEM("vbWork.size = 0x%X\n", pDecInfo->vbWork.size); + sprintf(ionName, "VDEC_%d_H264_WorkBuffer", pCodec->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(pCodec->coreIdx, &pDecInfo->vbWork, 0, + ionName) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + + param->vbWork = pDecInfo->vbWork; + pDecInfo->workBufferAllocExt = 0; + } + +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + pDecInfo->dramCfg.bankBit = EM_BANK; + pDecInfo->dramCfg.casBit = EM_CAS; + pDecInfo->dramCfg.rasBit = EM_RAS; + pDecInfo->dramCfg.busBit = EM_WIDTH; + } else +#endif + { + /* CODA980 */ + pDecInfo->targetSubLayerId = AVC_MAX_SUB_LAYER_ID; + } + + return ret; +} + +RetCode Coda9VpuDecInitSeq(DecHandle handle) +{ + CodecInst *pCodecInst = (CodecInst *)handle; + DecInfo *pDecInfo = &pCodecInst->CodecInfo->decInfo; + Uint32 val = 0; + + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_BB_START, + pDecInfo->streamBufStartAddr); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_BB_SIZE, + pDecInfo->streamBufSize >> 10); // size in KBytes + + if (pDecInfo->userDataEnable == TRUE) { + val = 0; + val |= (pDecInfo->userDataReportMode << 10); + val |= (pDecInfo->userDataEnable << 5); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_USER_DATA_OPTION, + val); + VpuWriteReg(pCodecInst->coreIdx, + CMD_DEC_SEQ_USER_DATA_BASE_ADDR, + pDecInfo->userDataBufAddr); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_USER_DATA_BUF_SIZE, + pDecInfo->userDataBufSize); + } else { + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_USER_DATA_OPTION, + 0); + VpuWriteReg(pCodecInst->coreIdx, + CMD_DEC_SEQ_USER_DATA_BASE_ADDR, 0); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_USER_DATA_BUF_SIZE, + 0); + } + val = 0; + + val |= (pDecInfo->reorderEnable << 1) & 0x2; + + val |= (pDecInfo->openParam.mp4DeblkEnable & 0x1); + val |= (pDecInfo->avcErrorConcealMode << 2); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_OPTION, val); + + switch (pCodecInst->codecMode) { +#ifdef REDUNDENT_CODE + case VC1_DEC: + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_VC1_STREAM_FMT, + (0 << 3) & 0x08); + break; + case MP4_DEC: + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_MP4_ASP_CLASS, + (VPU_GMC_PROCESS_METHOD << 3) | + pDecInfo->openParam.mp4Class); + break; +#endif + case AVC_DEC: + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_X264_MV_EN, + VPU_AVC_X264_SUPPORT); + break; + } + + if (pCodecInst->codecMode == AVC_DEC) + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_SEQ_SPP_CHUNK_SIZE, + VPU_GBU_SIZE); + + VpuWriteReg(pCodecInst->coreIdx, pDecInfo->streamWrPtrRegAddr, + pDecInfo->streamWrPtr); + VpuWriteReg(pCodecInst->coreIdx, pDecInfo->streamRdPtrRegAddr, + pDecInfo->streamRdPtr); + + if (pCodecInst->productId == PRODUCT_ID_980 || + pCodecInst->productId == PRODUCT_ID_960) { + pDecInfo->streamEndflag &= ~(3 << 3); + if (pDecInfo->openParam.bitstreamMode == BS_MODE_PIC_END) + pDecInfo->streamEndflag |= (2 << 3); + else { // Interrupt Mode + if (pDecInfo->seqInitEscape) { + pDecInfo->streamEndflag |= (2 << 3); + } + } + } + VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_PARAM, + pDecInfo->streamEndflag); + + val = pDecInfo->openParam.streamEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_CTRL, val); + + if (pCodecInst->productId == PRODUCT_ID_980) { + val = 0; + val |= (pDecInfo->openParam.bwbEnable << 15); + val |= (pDecInfo->wtlMode << 17) | + (pDecInfo->tiled2LinearMode << 13) | (FORMAT_420 << 6); + val |= ((pDecInfo->openParam.cbcrInterleave) + << 2); // Interleave + // bit + // position + // is + // modified + val |= pDecInfo->openParam.frameEndian; + val |= pDecInfo->openParam.nv21 << 3; + VpuWriteReg(pCodecInst->coreIdx, BIT_FRAME_MEM_CTRL, val); +#ifdef REDUNDENT_CODE + } else if (pCodecInst->productId == PRODUCT_ID_960) { + val = 0; + val |= (pDecInfo->wtlEnable << 17); + val |= (pDecInfo->openParam.bwbEnable << 12); + val |= ((pDecInfo->openParam.cbcrInterleave) + << 2); // Interleave + // bit + // position + // is + // modified + val |= pDecInfo->openParam.frameEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_FRAME_MEM_CTRL, val); +#endif + } else { + return RETCODE_NOT_FOUND_VPU_DEVICE; + } + + VpuWriteReg(pCodecInst->coreIdx, pDecInfo->frameDisplayFlagRegAddr, 0); + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, DEC_SEQ_INIT); + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuFiniSeq(CodecInst *instance) +{ + Coda9BitIssueCommand(instance->coreIdx, instance, DEC_SEQ_END); + if (vdi_wait_vpu_busy(instance->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuDecode(CodecInst *instance, DecParam *param) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + Uint32 rotMir; + Int32 val; + vpu_instance_pool_t *vip; + + pCodecInst = instance; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(pCodecInst->coreIdx); + if (!vip) { + return RETCODE_INVALID_HANDLE; + } + + rotMir = 0; + if (pDecInfo->rotationEnable) { + rotMir |= 0x10; // Enable rotator + switch (pDecInfo->rotationAngle) { + case 0: + rotMir |= 0x0; + break; + + case 90: + rotMir |= 0x1; + break; + + case 180: + rotMir |= 0x2; + break; + + case 270: + rotMir |= 0x3; + break; + } + } + + if (pDecInfo->mirrorEnable) { + rotMir |= 0x10; // Enable rotator + switch (pDecInfo->mirrorDirection) { + case MIRDIR_NONE: + rotMir |= 0x0; + break; + + case MIRDIR_VER: + rotMir |= 0x4; + break; + + case MIRDIR_HOR: + rotMir |= 0x8; + break; + + case MIRDIR_HOR_VER: + rotMir |= 0xc; + break; + } + } + + if (pDecInfo->tiled2LinearEnable) { + rotMir |= 0x10; + } + + if (pDecInfo->deringEnable) { + rotMir |= 0x20; // Enable Dering Filter + } + + if (rotMir && !pDecInfo->rotatorOutputValid) { + return RETCODE_ROTATOR_OUTPUT_NOT_SET; + } + + VpuWriteReg(pCodecInst->coreIdx, RET_DEC_PIC_CROP_LEFT_RIGHT, + 0); // frame crop information(left, right) + VpuWriteReg(pCodecInst->coreIdx, RET_DEC_PIC_CROP_TOP_BOTTOM, + 0); // frame crop information(top, bottom) + +#ifdef REDUNDENT_CODE + if (pCodecInst->productId == PRODUCT_ID_960) { + if (pDecInfo->mapType > LINEAR_FRAME_MAP && + pDecInfo->mapType <= TILED_MIXED_V_MAP) { + SetTiledFrameBase(pCodecInst->coreIdx, + pDecInfo->mapCfg.tiledBaseAddr); + } else { + SetTiledFrameBase(pCodecInst->coreIdx, 0); + } + } +#endif + + if (pDecInfo->mapType != LINEAR_FRAME_MAP && + pDecInfo->mapType != LINEAR_FIELD_MAP) { + val = SetTiledMapType( + pCodecInst->coreIdx, &pDecInfo->mapCfg, + pDecInfo->mapType, + (pDecInfo->stride > pDecInfo->frameBufferHeight) ? + pDecInfo->stride : + pDecInfo->frameBufferHeight, + pDecInfo->openParam.cbcrInterleave, &pDecInfo->dramCfg); + } else { + val = SetTiledMapType(pCodecInst->coreIdx, &pDecInfo->mapCfg, + pDecInfo->mapType, pDecInfo->stride, + pDecInfo->openParam.cbcrInterleave, + &pDecInfo->dramCfg); + } + if (val == 0) { + return RETCODE_INVALID_PARAM; + } + + if (rotMir & 0x30) { // rotator or dering or tiled2linear enabled + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_ROT_MODE, rotMir); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_ROT_INDEX, + pDecInfo->rotatorOutput.myIndex); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_ROT_ADDR_Y, + pDecInfo->rotatorOutput.bufY); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_ROT_ADDR_CB, + pDecInfo->rotatorOutput.bufCb); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_ROT_ADDR_CR, + pDecInfo->rotatorOutput.bufCr); + if (pCodecInst->productId == PRODUCT_ID_980) { + VpuWriteReg(pCodecInst->coreIdx, + CMD_DEC_PIC_ROT_BOTTOM_Y, + pDecInfo->rotatorOutput.bufYBot); + VpuWriteReg(pCodecInst->coreIdx, + CMD_DEC_PIC_ROT_BOTTOM_CB, + pDecInfo->rotatorOutput.bufCbBot); + VpuWriteReg(pCodecInst->coreIdx, + CMD_DEC_PIC_ROT_BOTTOM_CR, + pDecInfo->rotatorOutput.bufCrBot); + } + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_ROT_STRIDE, + pDecInfo->rotatorStride); + } else { + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_ROT_MODE, rotMir); + } + if (pDecInfo->userDataEnable) { + VpuWriteReg(pCodecInst->coreIdx, + CMD_DEC_PIC_USER_DATA_BASE_ADDR, + pDecInfo->userDataBufAddr); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_USER_DATA_BUF_SIZE, + pDecInfo->userDataBufSize); + } else { + VpuWriteReg(pCodecInst->coreIdx, + CMD_DEC_PIC_USER_DATA_BASE_ADDR, 0); + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_USER_DATA_BUF_SIZE, + 0); + } + + val = 0; + if (param->iframeSearchEnable == TRUE) { // if iframeSearch is Enable, + // other bit is ignore; + val |= (pDecInfo->userDataReportMode << 10); + + if (pCodecInst->codecMode == AVC_DEC || + pCodecInst->codecMode == VC1_DEC) { + if (param->iframeSearchEnable == 1) + val |= (1 << 11) | (1 << 2); + else if (param->iframeSearchEnable == 2) + val |= (1 << 2); + } else { + val |= ((param->iframeSearchEnable & 0x1) << 2); + } + } else { + val |= (pDecInfo->userDataReportMode << 10); + val |= (pDecInfo->userDataEnable << 5); + val |= (param->skipframeMode << 3); + } + + if (pCodecInst->productId == PRODUCT_ID_980) { + if (pCodecInst->codecMode == AVC_DEC && + pDecInfo->lowDelayInfo.lowDelayEn) { + val |= (pDecInfo->lowDelayInfo.lowDelayEn << 18); + } + } + if (pCodecInst->codecMode == MP2_DEC) { + val |= ((param->DecStdParam.mp2PicFlush & 1) << 15); + } + if (pCodecInst->codecMode == RV_DEC) { + val |= ((param->DecStdParam.rvDbkMode & 0x0f) << 16); + } + + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_OPTION, val); + + if (pCodecInst->productId == PRODUCT_ID_980) { + if (pDecInfo->lowDelayInfo.lowDelayEn == TRUE) { + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_NUM_ROWS, + pDecInfo->lowDelayInfo.numRows); + } else { + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_NUM_ROWS, + 0); + } + } + + val = 0; + + val = ((pDecInfo->secAxiInfo.u.coda9.useBitEnable & 0x01) << 0 | + (pDecInfo->secAxiInfo.u.coda9.useIpEnable & 0x01) << 1 | + (pDecInfo->secAxiInfo.u.coda9.useDbkYEnable & 0x01) << 2 | + (pDecInfo->secAxiInfo.u.coda9.useDbkCEnable & 0x01) << 3 | + (pDecInfo->secAxiInfo.u.coda9.useOvlEnable & 0x01) << 4 | + (pDecInfo->secAxiInfo.u.coda9.useBtpEnable & 0x01) << 5 | + (pDecInfo->secAxiInfo.u.coda9.useBitEnable & 0x01) << 8 | + (pDecInfo->secAxiInfo.u.coda9.useIpEnable & 0x01) << 9 | + (pDecInfo->secAxiInfo.u.coda9.useDbkYEnable & 0x01) << 10 | + (pDecInfo->secAxiInfo.u.coda9.useDbkCEnable & 0x01) << 11 | + (pDecInfo->secAxiInfo.u.coda9.useOvlEnable & 0x01) << 12 | + (pDecInfo->secAxiInfo.u.coda9.useBtpEnable & 0x01) << 13); + + VpuWriteReg(pCodecInst->coreIdx, BIT_AXI_SRAM_USE, val); + + VpuWriteReg(pCodecInst->coreIdx, pDecInfo->streamWrPtrRegAddr, + pDecInfo->streamWrPtr); + VpuWriteReg(pCodecInst->coreIdx, pDecInfo->streamRdPtrRegAddr, + pDecInfo->streamRdPtr); + CVI_VC_BS("rdPtr = 0x%llX, wrPtr = 0x%llX\n", pDecInfo->streamRdPtr, + pDecInfo->streamWrPtr); + + pDecInfo->streamEndflag &= ~(3 << 3); + if (pDecInfo->openParam.bitstreamMode == BS_MODE_PIC_END) + pDecInfo->streamEndflag |= (2 << 3); + + VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_PARAM, + pDecInfo->streamEndflag); + + if (pCodecInst->productId == PRODUCT_ID_980) { + val = 0; + val |= (pDecInfo->openParam.bwbEnable << 15); + val |= (pDecInfo->wtlMode << 17) | + (pDecInfo->tiled2LinearMode << 13) | + (pDecInfo->mapType << 9) | (FORMAT_420 << 6); + if (pDecInfo->openParam.cbcrInterleave == 1) + val |= pDecInfo->openParam.nv21 << 3; +#ifdef REDUNDENT_CODE + } else if (pCodecInst->productId == PRODUCT_ID_960) { + val = 0; + val |= (pDecInfo->wtlEnable << 17); + val |= (pDecInfo->openParam.bwbEnable << 12); + if (pDecInfo->mapType) { + if (pDecInfo->mapType == TILED_FRAME_MB_RASTER_MAP || + pDecInfo->mapType == TILED_FIELD_MB_RASTER_MAP) + val |= (pDecInfo->tiled2LinearEnable << 11) | + (0x03 << 9) | (FORMAT_420 << 6); + else + val |= (pDecInfo->tiled2LinearEnable << 11) | + (0x02 << 9) | (FORMAT_420 << 6); + } +#endif + } else { + return RETCODE_NOT_FOUND_VPU_DEVICE; + } + + val |= ((pDecInfo->openParam.cbcrInterleave) << 2); // Interleave bit + // position is + // modified + val |= pDecInfo->openParam.frameEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_FRAME_MEM_CTRL, val); + + val = pDecInfo->openParam.streamEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_CTRL, val); + + if (PRODUCT_ID_980 == pCodecInst->productId && + AVC_DEC == pCodecInst->codecMode) { + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PIC_SVC_INFO, + pDecInfo->targetSubLayerId); + } + + pCodecInst->u64StartTime = cviGetCurrentTime(); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, PIC_RUN); + + return RETCODE_SUCCESS; +} + +Uint32 Coda9VpuGetFrameCycle(Uint32 coreIdx) +{ + return VpuReadReg(coreIdx, BIT_FRAME_CYCLE); +} + +RetCode Coda9VpuDecGetResult(CodecInst *instance, DecOutputInfo *result) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + Uint32 val = 0; + + pCodecInst = instance; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, PIC_RUN, 0); +#endif + + result->warnInfo = 0; + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_SUCCESS); + result->decodingSuccess = val; + if (result->decodingSuccess & (1UL << 31)) { + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + + if (pCodecInst->codecMode == AVC_DEC) { + result->notSufficientPsBuffer = (val >> 3) & 0x1; + result->notSufficientSliceBuffer = (val >> 2) & 0x1; + result->refMissingFrameFlag = (val >> 21) & 0x1; + } + + result->chunkReuseRequired = 0; + if (pDecInfo->openParam.bitstreamMode == BS_MODE_PIC_END) { + switch (pCodecInst->codecMode) { + case AVC_DEC: + result->chunkReuseRequired = + ((val >> 16) & 0x01); // in case of NPF frame + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_DECODED_IDX); + if (val == (Uint32)-1) { + result->chunkReuseRequired = TRUE; + } + break; + default: + break; + } + } + + result->indexFrameDecoded = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_DECODED_IDX); + result->indexFrameDisplay = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_DISPLAY_IDX); + + if (pDecInfo->mapType == LINEAR_FRAME_MAP) { + result->indexFrameDecodedForTiled = -1; + result->indexFrameDisplayForTiled = -1; + } else { + result->indexFrameDecodedForTiled = result->indexFrameDecoded; + result->indexFrameDisplayForTiled = result->indexFrameDisplay; + } + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_SIZE); // decoding picture size + result->decPicWidth = (val >> 16) & 0xFFFF; + result->decPicHeight = (val)&0xFFFF; + + if (result->indexFrameDecoded >= 0 && + result->indexFrameDecoded < MAX_GDI_IDX) { + switch (pCodecInst->codecMode) { +#ifdef REDUNDENT_CODE + case VPX_DEC: + if (pCodecInst->codecModeAux == VPX_AUX_VP8) { + // VP8 specific header information + // h_scale[31:30] v_scale[29:28] + // pic_width[27:14] pic_height[13:0] + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_VP8_SCALE_INFO); + result->vp8ScaleInfo.hScaleFactor = + (val >> 30) & 0x03; + result->vp8ScaleInfo.vScaleFactor = + (val >> 28) & 0x03; + result->vp8ScaleInfo.picWidth = + (val >> 14) & 0x3FFF; + result->vp8ScaleInfo.picHeight = + (val >> 0) & 0x3FFF; + // ref_idx_gold[31:24], ref_idx_altr[23:16], + // ref_idx_last[15: 8], version_number[3:1], + // show_frame[0] + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_VP8_PIC_REPORT); + result->vp8PicInfo.refIdxGold = + (val >> 24) & 0x0FF; + result->vp8PicInfo.refIdxAltr = + (val >> 16) & 0x0FF; + result->vp8PicInfo.refIdxLast = + (val >> 8) & 0x0FF; + result->vp8PicInfo.versionNumber = + (val >> 1) & 0x07; + result->vp8PicInfo.showFrame = + (val >> 0) & 0x01; + } + break; + case AVS_DEC: +#endif + case AVC_DEC: + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_CROP_LEFT_RIGHT); // frame + // crop + // information(left, + // right) + pDecInfo->initialInfo.picCropRect.left = + (val >> 16) & 0xffff; + pDecInfo->initialInfo.picCropRect.right = + pDecInfo->initialInfo.picWidth - (val & 0xffff); + val = VpuReadReg( + pCodecInst->coreIdx, + RET_DEC_PIC_CROP_TOP_BOTTOM); // frame crop + // information(top, + // bottom) + pDecInfo->initialInfo.picCropRect.top = + (val >> 16) & 0xffff; + pDecInfo->initialInfo.picCropRect.bottom = + pDecInfo->initialInfo.picHeight - + (val & 0xffff); + break; +#ifdef REDUNDENT_CODE + case MP2_DEC: + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_MP2_BAR_LEFT_RIGHT); + pDecInfo->initialInfo.mp2BardataInfo.barLeft = + ((val >> 16) & 0xFFFF); + pDecInfo->initialInfo.mp2BardataInfo.barRight = + (val & 0xFFFF); + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_MP2_BAR_TOP_BOTTOM); + pDecInfo->initialInfo.mp2BardataInfo.barTop = + ((val >> 16) & 0xFFFF); + pDecInfo->initialInfo.mp2BardataInfo.barBottom = + (val & 0xFFFF); + result->mp2BardataInfo = + pDecInfo->initialInfo.mp2BardataInfo; + + result->mp2PicDispExtInfo.offsetNum = + VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_MP2_OFFSET_NUM); + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_MP2_OFFSET1); + result->mp2PicDispExtInfo.horizontalOffset1 = + (Int16)(val >> 16) & 0xFFFF; + result->mp2PicDispExtInfo.verticalOffset1 = + (Int16)(val & 0xFFFF); + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_MP2_OFFSET2); + result->mp2PicDispExtInfo.horizontalOffset2 = + (Int16)(val >> 16) & 0xFFFF; + result->mp2PicDispExtInfo.verticalOffset2 = + (Int16)(val & 0xFFFF); + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_MP2_OFFSET3); + result->mp2PicDispExtInfo.horizontalOffset3 = + (Int16)(val >> 16) & 0xFFFF; + result->mp2PicDispExtInfo.verticalOffset3 = + (Int16)(val & 0xFFFF); + break; +#endif + } + } + + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_TYPE); + result->interlacedFrame = (val >> 18) & 0x1; + result->topFieldFirst = (val >> 21) & 0x0001; // TopFieldFirst[21] + if (result->interlacedFrame) { + result->picTypeFirst = (val & 0x38) >> 3; // pic_type of 1st + // field + result->picType = val & 7; // pic_type of 2nd field + } else { + result->picTypeFirst = PIC_TYPE_MAX; // no meaning + result->picType = val & 7; + } + + result->pictureStructure = (val >> 19) & 0x0003; // MbAffFlag[17], + // FieldPicFlag[16] + result->repeatFirstField = (val >> 22) & 0x0001; + result->progressiveFrame = (val >> 23) & 0x0003; + + if (pCodecInst->codecMode == AVC_DEC) { + result->decFrameInfo = (val >> 15) & 0x0001; + result->picStrPresent = (val >> 27) & 0x0001; + result->picTimingStruct = (val >> 28) & 0x000f; + // update picture type when IDR frame + if (val & 0x40) { // 6th bit + if (result->interlacedFrame) + result->picTypeFirst = PIC_TYPE_IDR; + else + result->picType = PIC_TYPE_IDR; + } + result->decFrameInfo = (val >> 16) & 0x0003; + if (result->indexFrameDisplay >= 0) { + if (result->indexFrameDisplay == + result->indexFrameDecoded) + result->avcNpfFieldInfo = result->decFrameInfo; + else + result->avcNpfFieldInfo = + pDecInfo->decOutInfo + [result->indexFrameDisplay] + .decFrameInfo; + } + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_HRD_INFO); + result->avcHrdInfo.cpbMinus1 = val >> 2; + result->avcHrdInfo.vclHrdParamFlag = (val >> 1) & 1; + result->avcHrdInfo.nalHrdParamFlag = val & 1; + + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_VUI_INFO); + result->avcVuiInfo.fixedFrameRateFlag = val & 1; + result->avcVuiInfo.timingInfoPresent = (val >> 1) & 0x01; + result->avcVuiInfo.chromaLocBotField = (val >> 2) & 0x07; + result->avcVuiInfo.chromaLocTopField = (val >> 5) & 0x07; + result->avcVuiInfo.chromaLocInfoPresent = (val >> 8) & 0x01; + result->avcVuiInfo.colorPrimaries = (val >> 16) & 0xff; + result->avcVuiInfo.colorDescPresent = (val >> 24) & 0x01; + result->avcVuiInfo.isExtSAR = (val >> 25) & 0x01; + result->avcVuiInfo.vidFullRange = (val >> 26) & 0x01; + result->avcVuiInfo.vidFormat = (val >> 27) & 0x07; + result->avcVuiInfo.vidSigTypePresent = (val >> 30) & 0x01; + result->avcVuiInfo.vuiParamPresent = (val >> 31) & 0x01; + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_VUI_PIC_STRUCT); + result->avcVuiInfo.vuiPicStructPresent = (val & 0x1); + result->avcVuiInfo.vuiPicStruct = (val >> 1); + } + +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == MP2_DEC) { + result->fieldSequence = (val >> 25) & 0x0007; + result->frameDct = (val >> 28) & 0x0001; + result->progressiveSequence = (val >> 29) & 0x0001; + } +#endif + + result->fRateNumerator = + VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_FRATE_NR); // Frame rate, Aspect ratio + // can be changed frame by + // frame. + result->fRateDenominator = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_FRATE_DR); + if (pCodecInst->codecMode == AVC_DEC && result->fRateDenominator > 0) + result->fRateDenominator *= 2; +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == MP4_DEC) { + result->mp4ModuloTimeBase = VpuReadReg( + pCodecInst->coreIdx, RET_DEC_PIC_MODULO_TIME_BASE); + result->mp4TimeIncrement = VpuReadReg( + pCodecInst->coreIdx, RET_DEC_PIC_VOP_TIME_INCREMENT); + } + + if (pCodecInst->codecMode == RV_DEC) { + result->rvTr = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_RV_TR); + result->rvTrB = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_RV_TR_BFRAME); + } + + if (pCodecInst->codecMode == VPX_DEC) { + result->aspectRateInfo = 0; + } else +#endif + { + result->aspectRateInfo = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ASPECT); + } + + // User Data + if (pDecInfo->userDataEnable) { + int userDataNum; + int userDataSize; + BYTE tempBuf[8] = { + 0, + }; + + VpuReadMem(pCodecInst->coreIdx, pDecInfo->userDataBufAddr + 0, + tempBuf, 8, VPU_USER_DATA_ENDIAN); + + val = ((tempBuf[0] << 24) & 0xFF000000) | + ((tempBuf[1] << 16) & 0x00FF0000) | + ((tempBuf[2] << 8) & 0x0000FF00) | + ((tempBuf[3] << 0) & 0x000000FF); + + userDataNum = (val >> 16) & 0xFFFF; + userDataSize = (val >> 0) & 0xFFFF; + if (userDataNum == 0) + userDataSize = 0; + + result->decOutputExtData.userDataNum = userDataNum; + result->decOutputExtData.userDataSize = userDataSize; + + val = ((tempBuf[4] << 24) & 0xFF000000) | + ((tempBuf[5] << 16) & 0x00FF0000) | + ((tempBuf[6] << 8) & 0x0000FF00) | + ((tempBuf[7] << 0) & 0x000000FF); + + if (userDataNum == 0) + result->decOutputExtData.userDataBufFull = 0; + else + result->decOutputExtData.userDataBufFull = + (val >> 16) & 0xFFFF; + + result->decOutputExtData.activeFormat = + VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_ATSC_USER_DATA_INFO) & + 0xf; + } + + result->numOfErrMBs = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ERR_MB); + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_SUCCESS); + result->sequenceChanged = ((val >> 20) & 0x1); + result->streamEndFlag = ((pDecInfo->streamEndflag >> 2) & 0x01); + +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == VC1_DEC && + result->indexFrameDisplay != -3) { + if (pDecInfo->vc1BframeDisplayValid == 0) { + if (result->picType == 2) { + result->indexFrameDisplay = -3; + } else { + pDecInfo->vc1BframeDisplayValid = 1; + } + } + } +#endif + if (pCodecInst->codecMode == AVC_DEC && + pCodecInst->codecModeAux == AVC_AUX_MVC) { + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_MVC_REPORT); + result->mvcPicInfo.viewIdxDisplay = (val >> 0) & 1; + result->mvcPicInfo.viewIdxDecoded = (val >> 1) & 1; + } + + if (pCodecInst->codecMode == AVC_DEC) { + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_AVC_FPA_SEI0); + + if ((int)val < 0) { + result->avcFpaSei.exist = 0; + } else { + result->avcFpaSei.exist = 1; + result->avcFpaSei.framePackingArrangementId = val; + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_AVC_FPA_SEI1); + result->avcFpaSei.contentInterpretationType = + val & 0x3F; // [5:0] + result->avcFpaSei.framePackingArrangementType = + (val >> 6) & 0x7F; // [12:6] + result->avcFpaSei.framePackingArrangementExtensionFlag = + (val >> 13) & 0x01; // [13] + result->avcFpaSei.frame1SelfContainedFlag = + (val >> 14) & 0x01; // [14] + result->avcFpaSei.frame0SelfContainedFlag = + (val >> 15) & 0x01; // [15] + result->avcFpaSei.currentFrameIsFrame0Flag = + (val >> 16) & 0x01; // [16] + result->avcFpaSei.fieldViewsFlag = + (val >> 17) & 0x01; // [17] + result->avcFpaSei.frame0FlippedFlag = + (val >> 18) & 0x01; // [18] + result->avcFpaSei.spatialFlippingFlag = + (val >> 19) & 0x01; // [19] + result->avcFpaSei.quincunxSamplingFlag = + (val >> 20) & 0x01; // [20] + result->avcFpaSei.framePackingArrangementCancelFlag = + (val >> 21) & 0x01; // [21] + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_AVC_FPA_SEI2); + result->avcFpaSei + .framePackingArrangementRepetitionPeriod = + val & 0x7FFF; // [14:0] + result->avcFpaSei.frame1GridPositionY = + (val >> 16) & 0x0F; // [19:16] + result->avcFpaSei.frame1GridPositionX = + (val >> 20) & 0x0F; // [23:20] + result->avcFpaSei.frame0GridPositionY = + (val >> 24) & 0x0F; // [27:24] + result->avcFpaSei.frame0GridPositionX = + (val >> 28) & 0x0F; // [31:28] + } + + result->avcPocTop = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC_TOP); + result->avcPocBot = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC_BOT); + + if (result->interlacedFrame) { + if (result->avcPocTop > result->avcPocBot) { + result->avcPocPic = result->avcPocBot; + } else { + result->avcPocPic = result->avcPocTop; + } + } else + result->avcPocPic = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_POC); + + result->avcTemporalId = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_TID_INFO); + } + + if (pCodecInst->codecMode == AVC_DEC) { + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_AVC_SEI_RP_INFO); + + if ((int)val < 0) { + result->avcRpSei.exist = 0; + } else { + result->avcRpSei.exist = 1; + result->avcRpSei.changingSliceGroupIdc = + val & 0x3; // [1:0] + result->avcRpSei.brokenLinkFlag = + (val >> 2) & 0x01; // [2] + result->avcRpSei.exactMatchFlag = + (val >> 3) & 0x01; // [3] + result->avcRpSei.recoveryFrameCnt = + (val >> 4) & 0x3F; // [9:4] + } + } + + result->bytePosFrameStart = + VpuReadReg(pCodecInst->coreIdx, BIT_BYTE_POS_FRAME_START); + result->bytePosFrameEnd = + VpuReadReg(pCodecInst->coreIdx, BIT_BYTE_POS_FRAME_END); + + if (result->indexFrameDecoded >= 0 && + result->indexFrameDecoded < MAX_GDI_IDX) + pDecInfo->decOutInfo[result->indexFrameDecoded] = *result; + + result->frameDisplayFlag = pDecInfo->frameDisplayFlag; + result->frameCycle = VpuReadReg(pCodecInst->coreIdx, BIT_FRAME_CYCLE); + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuDecSetBitstreamFlag(CodecInst *instance, BOOL running, BOOL eos) +{ + Uint32 val; + DecInfo *pDecInfo; + + pDecInfo = &instance->CodecInfo->decInfo; + + if (eos & 0x01) { + val = VpuReadReg(instance->coreIdx, BIT_BIT_STREAM_PARAM); + val |= 1 << 2; + pDecInfo->streamEndflag = val; + if (running == TRUE) + VpuWriteReg(instance->coreIdx, BIT_BIT_STREAM_PARAM, + val); + } else { + val = VpuReadReg(instance->coreIdx, BIT_BIT_STREAM_PARAM); + val &= ~(1 << 2); + pDecInfo->streamEndflag = val; + if (running == TRUE) + VpuWriteReg(instance->coreIdx, BIT_BIT_STREAM_PARAM, + val); + } + return RETCODE_SUCCESS; +} + +#ifdef REDUNDENT_CODE +RetCode Coda9VpuDecCpbFlush(CodecInst *instance) +{ + Uint32 val; + DecInfo *pDecInfo; + + pDecInfo = &instance->CodecInfo->decInfo; + + if (pDecInfo->openParam.bitstreamMode != BS_MODE_INTERRUPT) { + return RETCODE_INVALID_COMMAND; + } + + val = VpuReadReg(instance->coreIdx, BIT_BIT_STREAM_PARAM); + val &= ~(3 << 3); + val |= (2 << 3); // set to pic_end mode + VpuWriteReg(instance->coreIdx, BIT_BIT_STREAM_PARAM, val); + + return RETCODE_SUCCESS; +} +#endif + +RetCode Coda9VpuDecGetSeqInfo(CodecInst *instance, DecInitialInfo *info) +{ + CodecInst *pCodecInst = NULL; + DecInfo *pDecInfo = NULL; + Uint32 val, val2; + + pCodecInst = instance; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) { + vdi_log(pCodecInst->coreIdx, DEC_SEQ_INIT, 0); + } +#endif + + info->warnInfo = 0; + if (pDecInfo->openParam.bitstreamMode == BS_MODE_INTERRUPT && + pDecInfo->seqInitEscape) { + pDecInfo->streamEndflag &= ~(3 << 3); + VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_PARAM, + pDecInfo->streamEndflag); + pDecInfo->seqInitEscape = 0; + } + pDecInfo->streamRdPtr = + VpuReadReg(instance->coreIdx, pDecInfo->streamRdPtrRegAddr); + + pDecInfo->frameDisplayFlag = VpuReadReg( + pCodecInst->coreIdx, pDecInfo->frameDisplayFlagRegAddr); + CVI_VC_DISP("frameDisplayFlag = 0x%X\n", pDecInfo->frameDisplayFlag); + + pDecInfo->streamEndflag = + VpuReadReg(pCodecInst->coreIdx, BIT_BIT_STREAM_PARAM); + + info->seqInitErrReason = 0; + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_SUCCESS); + if (val & (1UL << 31)) { + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + + if (pDecInfo->openParam.bitstreamMode == BS_MODE_PIC_END) { + if (val & (1 << 4)) { + info->seqInitErrReason = + (VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_SEQ_ERR_REASON)); + return RETCODE_FAILURE; + } + } + + if (val == 0) { + info->seqInitErrReason = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_SEQ_ERR_REASON); + CVI_VC_FLOW("seqInitErrReason = 0x%X\n", + info->seqInitErrReason); + return RETCODE_FAILURE; + } + + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_SRC_SIZE); + info->picWidth = ((val >> 16) & 0xffff); + info->picHeight = (val & 0xffff); + CVI_VC_MEM("picWidth = %d, picHeight = %d\n", info->picWidth, + info->picHeight); + + info->lumaBitdepth = 8; + info->chromaBitdepth = 8; + info->fRateNumerator = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_FRATE_NR); + info->fRateDenominator = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_FRATE_DR); + if (pCodecInst->codecMode == AVC_DEC && info->fRateDenominator > 0) { + info->fRateDenominator *= 2; + } + +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == MP4_DEC) { + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_INFO); + info->mp4ShortVideoHeader = (val >> 2) & 1; + info->mp4DataPartitionEnable = val & 1; + info->mp4ReversibleVlcEnable = + info->mp4DataPartitionEnable ? ((val >> 1) & 1) : 0; + info->h263AnnexJEnable = (val >> 3) & 1; + } else if (pCodecInst->codecMode == VPX_DEC && + pCodecInst->codecModeAux == VPX_AUX_VP8) { + // h_scale[31:30] v_scale[29:28] pic_width[27:14] + // pic_height[13:0] + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_VP8_SCALE_INFO); + info->vp8ScaleInfo.hScaleFactor = (val >> 30) & 0x03; + info->vp8ScaleInfo.vScaleFactor = (val >> 28) & 0x03; + info->vp8ScaleInfo.picWidth = (val >> 14) & 0x3FFF; + info->vp8ScaleInfo.picHeight = (val >> 0) & 0x3FFF; + } +#endif + + info->minFrameBufferCount = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_FRAME_NEED); + CVI_VC_FLOW("minFrameBufferCount = %d\n", info->minFrameBufferCount); + + info->frameBufDelay = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_FRAME_DELAY); + + if (pCodecInst->codecMode == AVC_DEC || + pCodecInst->codecMode == MP2_DEC || + pCodecInst->codecMode == AVS_DEC) { + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_CROP_LEFT_RIGHT); + val2 = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_CROP_TOP_BOTTOM); + + info->picCropRect.left = ((val >> 16) & 0xFFFF); + info->picCropRect.right = info->picWidth - (val & 0xFFFF); + ; + info->picCropRect.top = ((val2 >> 16) & 0xFFFF); + info->picCropRect.bottom = info->picHeight - (val2 & 0xFFFF); + + val = ((info->picWidth * info->picHeight * 3) >> 1) >> 10; + info->normalSliceSize = val >> 2; + info->worstSliceSize = val >> 1; + } +#ifdef REDUNDENT_CODE + else { + info->picCropRect.left = 0; + info->picCropRect.right = info->picWidth; + info->picCropRect.top = 0; + info->picCropRect.bottom = info->picHeight; + } + + if (pCodecInst->codecMode == MP2_DEC) { + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_MP2_BAR_LEFT_RIGHT); + val2 = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_MP2_BAR_TOP_BOTTOM); + + info->mp2BardataInfo.barLeft = ((val >> 16) & 0xFFFF); + info->mp2BardataInfo.barRight = (val & 0xFFFF); + info->mp2BardataInfo.barTop = ((val2 >> 16) & 0xFFFF); + info->mp2BardataInfo.barBottom = (val2 & 0xFFFF); + } +#endif + + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_HEADER_REPORT); + info->profile = (val >> 0) & 0xFF; + info->level = (val >> 8) & 0xFF; + info->interlace = (val >> 16) & 0x01; + info->direct8x8Flag = (val >> 17) & 0x01; + info->vc1Psf = (val >> 18) & 0x01; + info->constraint_set_flag[0] = (val >> 19) & 0x01; + info->constraint_set_flag[1] = (val >> 20) & 0x01; + info->constraint_set_flag[2] = (val >> 21) & 0x01; + info->constraint_set_flag[3] = (val >> 22) & 0x01; + info->chromaFormatIDC = (val >> 23) & 0x03; + info->isExtSAR = (val >> 25) & 0x01; + info->maxNumRefFrm = (val >> 27) & 0x0f; + info->maxNumRefFrmFlag = (val >> 31) & 0x01; + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_ASPECT); + info->aspectRateInfo = val; + + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_BIT_RATE); + info->bitRate = val; + + if (pCodecInst->codecMode == AVC_DEC) { + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_VUI_INFO); + info->avcVuiInfo.fixedFrameRateFlag = val & 1; + info->avcVuiInfo.timingInfoPresent = (val >> 1) & 0x01; + info->avcVuiInfo.chromaLocBotField = (val >> 2) & 0x07; + info->avcVuiInfo.chromaLocTopField = (val >> 5) & 0x07; + info->avcVuiInfo.chromaLocInfoPresent = (val >> 8) & 0x01; + info->avcVuiInfo.colorPrimaries = (val >> 16) & 0xff; + info->avcVuiInfo.colorDescPresent = (val >> 24) & 0x01; + info->avcVuiInfo.isExtSAR = (val >> 25) & 0x01; + info->avcVuiInfo.vidFullRange = (val >> 26) & 0x01; + info->avcVuiInfo.vidFormat = (val >> 27) & 0x07; + info->avcVuiInfo.vidSigTypePresent = (val >> 30) & 0x01; + info->avcVuiInfo.vuiParamPresent = (val >> 31) & 0x01; + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_SEQ_VUI_PIC_STRUCT); + info->avcVuiInfo.vuiPicStructPresent = (val & 0x1); + info->avcVuiInfo.vuiPicStruct = (val >> 1); + } + +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == MP2_DEC) { + // seq_ext info + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_SEQ_EXT_INFO); + info->mp2LowDelay = val & 1; + info->mp2DispVerSize = (val >> 1) & 0x3fff; + info->mp2DispHorSize = (val >> 15) & 0x3fff; + + if (pDecInfo->userDataEnable) { + Uint32 userDataNum = 0; + Uint32 userDataSize = 0; + BYTE tempBuf[8] = { + 0, + }; + + // user data + VpuReadMem(pCodecInst->coreIdx, + pDecInfo->userDataBufAddr, tempBuf, 8, + VPU_USER_DATA_ENDIAN); + + val = ((tempBuf[0] << 24) & 0xFF000000) | + ((tempBuf[1] << 16) & 0x00FF0000) | + ((tempBuf[2] << 8) & 0x0000FF00) | + ((tempBuf[3] << 0) & 0x000000FF); + + userDataNum = (val >> 16) & 0xFFFF; + userDataSize = (val >> 0) & 0xFFFF; + if (userDataNum == 0) { + userDataSize = 0; + } + + info->userDataNum = userDataNum; + info->userDataSize = userDataSize; + + val = ((tempBuf[4] << 24) & 0xFF000000) | + ((tempBuf[5] << 16) & 0x00FF0000) | + ((tempBuf[6] << 8) & 0x0000FF00) | + ((tempBuf[7] << 0) & 0x000000FF); + + if (userDataNum == 0) { + info->userDataBufFull = 0; + } else { + info->userDataBufFull = (val >> 16) & 0xFFFF; + } + } + } +#endif + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuDecRegisterFramebuffer(CodecInst *instance) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + PhysicalAddress paraBuffer; + vpu_buffer_t vb; + Uint32 val; + int i; + BYTE frameAddr[MAX_DEC_FRAME_NUM][3][4]; + BYTE colMvAddr[MAX_DEC_FRAME_NUM][4]; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + pCodecInst = instance; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + vdi_get_common_memory(pCodecInst->coreIdx, &vb); + paraBuffer = vb.phys_addr + CODE_BUF_SIZE + TEMP_BUF_SIZE; + + pDecInfo->mapCfg.productId = pCodecInst->productId; + + if (pDecInfo->mapType != LINEAR_FRAME_MAP && + pDecInfo->mapType != LINEAR_FIELD_MAP) { + val = SetTiledMapType( + pCodecInst->coreIdx, &pDecInfo->mapCfg, + pDecInfo->mapType, + (pDecInfo->stride > pDecInfo->frameBufferHeight) ? + pDecInfo->stride : + pDecInfo->frameBufferHeight, + pDecInfo->openParam.cbcrInterleave, &pDecInfo->dramCfg); + } else { + val = SetTiledMapType(pCodecInst->coreIdx, &pDecInfo->mapCfg, + pDecInfo->mapType, pDecInfo->stride, + pDecInfo->openParam.cbcrInterleave, + &pDecInfo->dramCfg); + } + + if (val == 0) { + return RETCODE_INVALID_PARAM; + } + + // Allocate frame buffer + for (i = 0; i < pDecInfo->numFbsForDecoding; i++) { + frameAddr[i][0][0] = + (pDecInfo->frameBufPool[i].bufY >> 24) & 0xFF; + frameAddr[i][0][1] = + (pDecInfo->frameBufPool[i].bufY >> 16) & 0xFF; + frameAddr[i][0][2] = + (pDecInfo->frameBufPool[i].bufY >> 8) & 0xFF; + frameAddr[i][0][3] = + (pDecInfo->frameBufPool[i].bufY >> 0) & 0xFF; + if (pDecInfo->openParam.cbcrOrder == CBCR_ORDER_NORMAL) { + frameAddr[i][1][0] = + (pDecInfo->frameBufPool[i].bufCb >> 24) & 0xFF; + frameAddr[i][1][1] = + (pDecInfo->frameBufPool[i].bufCb >> 16) & 0xFF; + frameAddr[i][1][2] = + (pDecInfo->frameBufPool[i].bufCb >> 8) & 0xFF; + frameAddr[i][1][3] = + (pDecInfo->frameBufPool[i].bufCb >> 0) & 0xFF; + frameAddr[i][2][0] = + (pDecInfo->frameBufPool[i].bufCr >> 24) & 0xFF; + frameAddr[i][2][1] = + (pDecInfo->frameBufPool[i].bufCr >> 16) & 0xFF; + frameAddr[i][2][2] = + (pDecInfo->frameBufPool[i].bufCr >> 8) & 0xFF; + frameAddr[i][2][3] = + (pDecInfo->frameBufPool[i].bufCr >> 0) & 0xFF; + } else { + frameAddr[i][2][0] = + (pDecInfo->frameBufPool[i].bufCb >> 24) & 0xFF; + frameAddr[i][2][1] = + (pDecInfo->frameBufPool[i].bufCb >> 16) & 0xFF; + frameAddr[i][2][2] = + (pDecInfo->frameBufPool[i].bufCb >> 8) & 0xFF; + frameAddr[i][2][3] = + (pDecInfo->frameBufPool[i].bufCb >> 0) & 0xFF; + frameAddr[i][1][0] = + (pDecInfo->frameBufPool[i].bufCr >> 24) & 0xFF; + frameAddr[i][1][1] = + (pDecInfo->frameBufPool[i].bufCr >> 16) & 0xFF; + frameAddr[i][1][2] = + (pDecInfo->frameBufPool[i].bufCr >> 8) & 0xFF; + frameAddr[i][1][3] = + (pDecInfo->frameBufPool[i].bufCr >> 0) & 0xFF; + } + } + + VpuWriteMem(pCodecInst->coreIdx, paraBuffer, (BYTE *)frameAddr, + sizeof(frameAddr), VDI_BIG_ENDIAN); + + // MV allocation and register + if (pCodecInst->codecMode == AVC_DEC || + pCodecInst->codecMode == VC1_DEC || + pCodecInst->codecMode == MP4_DEC || + pCodecInst->codecMode == RV_DEC || + pCodecInst->codecMode == AVS_DEC) { + int size_mvcolbuf; + vpu_buffer_t vbBuffer; + size_mvcolbuf = ((pDecInfo->initialInfo.picWidth + 31) & ~31) * + ((pDecInfo->initialInfo.picHeight + 31) & ~31); + size_mvcolbuf = (size_mvcolbuf * 3) >> 1; + size_mvcolbuf = (size_mvcolbuf + 4) / 5; + size_mvcolbuf = ((size_mvcolbuf + 7) >> 3) << 3; + vbBuffer.size = VPU_ALIGN16384(size_mvcolbuf); + vbBuffer.phys_addr = 0; + for (i = 0; i < pDecInfo->numFbsForDecoding; i++) { + CVI_VC_MEM("[%d] size_mvcolbuf = 0x%X\n", i, + vbBuffer.size); + sprintf(ionName, "VDEC_%d_H264_Mvcolbuf", + pCodecInst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(pCodecInst->coreIdx, &vbBuffer, + 0, ionName) < 0) { + return RETCODE_FAILURE; + } + pDecInfo->vbMV[i] = vbBuffer; + } + if (pCodecInst->codecMode == AVC_DEC) { + for (i = 0; i < pDecInfo->numFbsForDecoding; i++) { + colMvAddr[i][0] = + (pDecInfo->vbMV[i].phys_addr >> 24) & + 0xFF; + colMvAddr[i][1] = + (pDecInfo->vbMV[i].phys_addr >> 16) & + 0xFF; + colMvAddr[i][2] = + (pDecInfo->vbMV[i].phys_addr >> 8) & + 0xFF; + colMvAddr[i][3] = + (pDecInfo->vbMV[i].phys_addr >> 0) & + 0xFF; + } + } +#ifdef REDUNDENT_CODE + else { + colMvAddr[0][0] = + (pDecInfo->vbMV[0].phys_addr >> 24) & 0xFF; + colMvAddr[0][1] = + (pDecInfo->vbMV[0].phys_addr >> 16) & 0xFF; + colMvAddr[0][2] = + (pDecInfo->vbMV[0].phys_addr >> 8) & 0xFF; + colMvAddr[0][3] = + (pDecInfo->vbMV[0].phys_addr >> 0) & 0xFF; + } +#endif + VpuWriteMem(pCodecInst->coreIdx, paraBuffer + 384, + (BYTE *)colMvAddr, sizeof(colMvAddr), + VDI_BIG_ENDIAN); + } + + if (pCodecInst->productId == PRODUCT_ID_980) { + for (i = 0; i < pDecInfo->numFbsForDecoding; i++) { + frameAddr[i][0][0] = + (pDecInfo->frameBufPool[i].bufYBot >> 24) & + 0xFF; + frameAddr[i][0][1] = + (pDecInfo->frameBufPool[i].bufYBot >> 16) & + 0xFF; + frameAddr[i][0][2] = + (pDecInfo->frameBufPool[i].bufYBot >> 8) & 0xFF; + frameAddr[i][0][3] = + (pDecInfo->frameBufPool[i].bufYBot >> 0) & 0xFF; + if (pDecInfo->openParam.cbcrOrder == + CBCR_ORDER_NORMAL) { + frameAddr[i][1][0] = + (pDecInfo->frameBufPool[i].bufCbBot >> + 24) & + 0xFF; + frameAddr[i][1][1] = + (pDecInfo->frameBufPool[i].bufCbBot >> + 16) & + 0xFF; + frameAddr[i][1][2] = + (pDecInfo->frameBufPool[i].bufCbBot >> + 8) & + 0xFF; + frameAddr[i][1][3] = + (pDecInfo->frameBufPool[i].bufCbBot >> + 0) & + 0xFF; + frameAddr[i][2][0] = + (pDecInfo->frameBufPool[i].bufCrBot >> + 24) & + 0xFF; + frameAddr[i][2][1] = + (pDecInfo->frameBufPool[i].bufCrBot >> + 16) & + 0xFF; + frameAddr[i][2][2] = + (pDecInfo->frameBufPool[i].bufCrBot >> + 8) & + 0xFF; + frameAddr[i][2][3] = + (pDecInfo->frameBufPool[i].bufCrBot >> + 0) & + 0xFF; + } else { + frameAddr[i][2][0] = + (pDecInfo->frameBufPool[i].bufCbBot >> + 24) & + 0xFF; + frameAddr[i][2][1] = + (pDecInfo->frameBufPool[i].bufCbBot >> + 16) & + 0xFF; + frameAddr[i][2][2] = + (pDecInfo->frameBufPool[i].bufCbBot >> + 8) & + 0xFF; + frameAddr[i][2][3] = + (pDecInfo->frameBufPool[i].bufCbBot >> + 0) & + 0xFF; + frameAddr[i][1][0] = + (pDecInfo->frameBufPool[i].bufCrBot >> + 24) & + 0xFF; + frameAddr[i][1][1] = + (pDecInfo->frameBufPool[i].bufCrBot >> + 16) & + 0xFF; + frameAddr[i][1][2] = + (pDecInfo->frameBufPool[i].bufCrBot >> + 8) & + 0xFF; + frameAddr[i][1][3] = + (pDecInfo->frameBufPool[i].bufCrBot >> + 0) & + 0xFF; + } + } + + VpuWriteMem(pCodecInst->coreIdx, paraBuffer + 384 + 128, + (BYTE *)frameAddr, sizeof(frameAddr), + VDI_BIG_ENDIAN); + + if (pDecInfo->wtlEnable) { + int num = pDecInfo->numFbsForDecoding; /* start index of + WTL fb array + */ + int end = pDecInfo->numFrameBuffers; + for (i = num; i < end; i++) { + frameAddr[i - num][0][0] = + (pDecInfo->frameBufPool[i].bufY >> 24) & + 0xFF; + frameAddr[i - num][0][1] = + (pDecInfo->frameBufPool[i].bufY >> 16) & + 0xFF; + frameAddr[i - num][0][2] = + (pDecInfo->frameBufPool[i].bufY >> 8) & + 0xFF; + frameAddr[i - num][0][3] = + (pDecInfo->frameBufPool[i].bufY >> 0) & + 0xFF; + if (pDecInfo->openParam.cbcrOrder == + CBCR_ORDER_NORMAL) { + frameAddr[i - num][1][0] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 24) & + 0xFF; + frameAddr[i - num][1][1] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 16) & + 0xFF; + frameAddr[i - num][1][2] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 8) & + 0xFF; + frameAddr[i - num][1][3] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 0) & + 0xFF; + frameAddr[i - num][2][0] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 24) & + 0xFF; + frameAddr[i - num][2][1] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 16) & + 0xFF; + frameAddr[i - num][2][2] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 8) & + 0xFF; + frameAddr[i - num][2][3] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 0) & + 0xFF; + } else { + frameAddr[i - num][2][0] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 24) & + 0xFF; + frameAddr[i - num][2][1] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 16) & + 0xFF; + frameAddr[i - num][2][2] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 8) & + 0xFF; + frameAddr[i - num][2][3] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 0) & + 0xFF; + frameAddr[i - num][1][0] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 24) & + 0xFF; + frameAddr[i - num][1][1] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 16) & + 0xFF; + frameAddr[i - num][1][2] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 8) & + 0xFF; + frameAddr[i - num][1][3] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 0) & + 0xFF; + } + } + + VpuWriteMem(pCodecInst->coreIdx, + paraBuffer + 384 + 128 + 384, + (BYTE *)frameAddr, sizeof(frameAddr), + VDI_BIG_ENDIAN); + + if (pDecInfo->wtlMode == FF_FIELD) { + for (i = num; i < num * 2; i++) { + frameAddr[i - num][0][0] = + (pDecInfo->frameBufPool[i] + .bufYBot >> + 24) & + 0xFF; + frameAddr[i - num][0][1] = + (pDecInfo->frameBufPool[i] + .bufYBot >> + 16) & + 0xFF; + frameAddr[i - num][0][2] = + (pDecInfo->frameBufPool[i] + .bufYBot >> + 8) & + 0xFF; + frameAddr[i - num][0][3] = + (pDecInfo->frameBufPool[i] + .bufYBot >> + 0) & + 0xFF; + if (pDecInfo->openParam.cbcrOrder == + CBCR_ORDER_NORMAL) { + frameAddr[i - num][1][0] = + (pDecInfo->frameBufPool[i] + .bufCbBot >> + 24) & + 0xFF; + frameAddr[i - num][1][1] = + (pDecInfo->frameBufPool[i] + .bufCbBot >> + 16) & + 0xFF; + frameAddr[i - num][1][2] = + (pDecInfo->frameBufPool[i] + .bufCbBot >> + 8) & + 0xFF; + frameAddr[i - num][1][3] = + (pDecInfo->frameBufPool[i] + .bufCbBot >> + 0) & + 0xFF; + frameAddr[i - num][2][0] = + (pDecInfo->frameBufPool[i] + .bufCrBot >> + 24) & + 0xFF; + frameAddr[i - num][2][1] = + (pDecInfo->frameBufPool[i] + .bufCrBot >> + 16) & + 0xFF; + frameAddr[i - num][2][2] = + (pDecInfo->frameBufPool[i] + .bufCrBot >> + 8) & + 0xFF; + frameAddr[i - num][2][3] = + (pDecInfo->frameBufPool[i] + .bufCrBot >> + 0) & + 0xFF; + } else { + frameAddr[i - num][2][0] = + (pDecInfo->frameBufPool[i] + .bufCbBot >> + 24) & + 0xFF; + frameAddr[i - num][2][1] = + (pDecInfo->frameBufPool[i] + .bufCbBot >> + 16) & + 0xFF; + frameAddr[i - num][2][2] = + (pDecInfo->frameBufPool[i] + .bufCbBot >> + 8) & + 0xFF; + frameAddr[i - num][2][3] = + (pDecInfo->frameBufPool[i] + .bufCbBot >> + 0) & + 0xFF; + frameAddr[i - num][1][0] = + (pDecInfo->frameBufPool[i] + .bufCrBot >> + 24) & + 0xFF; + frameAddr[i - num][1][1] = + (pDecInfo->frameBufPool[i] + .bufCrBot >> + 16) & + 0xFF; + frameAddr[i - num][1][2] = + (pDecInfo->frameBufPool[i] + .bufCrBot >> + 8) & + 0xFF; + frameAddr[i - num][1][3] = + (pDecInfo->frameBufPool[i] + .bufCrBot >> + 0) & + 0xFF; + } + } + VpuWriteMem(pCodecInst->coreIdx, + paraBuffer + 384 + 128 + 384 + 384, + (BYTE *)frameAddr, + sizeof(frameAddr), VDI_BIG_ENDIAN); + } + } + } +#ifdef REDUNDENT_CODE + else { + if (pDecInfo->wtlEnable) { + int num = pDecInfo->numFbsForDecoding; /* start index of + WTL fb array + */ + int end = pDecInfo->numFrameBuffers; + for (i = num; i < end; i++) { + frameAddr[i - num][0][0] = + (pDecInfo->frameBufPool[i].bufY >> 24) & + 0xFF; + frameAddr[i - num][0][1] = + (pDecInfo->frameBufPool[i].bufY >> 16) & + 0xFF; + frameAddr[i - num][0][2] = + (pDecInfo->frameBufPool[i].bufY >> 8) & + 0xFF; + frameAddr[i - num][0][3] = + (pDecInfo->frameBufPool[i].bufY >> 0) & + 0xFF; + if (pDecInfo->openParam.cbcrOrder == + CBCR_ORDER_NORMAL) { + frameAddr[i - num][1][0] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 24) & + 0xFF; + frameAddr[i - num][1][1] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 16) & + 0xFF; + frameAddr[i - num][1][2] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 8) & + 0xFF; + frameAddr[i - num][1][3] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 0) & + 0xFF; + frameAddr[i - num][2][0] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 24) & + 0xFF; + frameAddr[i - num][2][1] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 16) & + 0xFF; + frameAddr[i - num][2][2] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 8) & + 0xFF; + frameAddr[i - num][2][3] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 0) & + 0xFF; + } else { + frameAddr[i - num][2][0] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 24) & + 0xFF; + frameAddr[i - num][2][1] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 16) & + 0xFF; + frameAddr[i - num][2][2] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 8) & + 0xFF; + frameAddr[i - num][2][3] = + (pDecInfo->frameBufPool[i] + .bufCb >> + 0) & + 0xFF; + frameAddr[i - num][1][0] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 24) & + 0xFF; + frameAddr[i - num][1][1] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 16) & + 0xFF; + frameAddr[i - num][1][2] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 8) & + 0xFF; + frameAddr[i - num][1][3] = + (pDecInfo->frameBufPool[i] + .bufCr >> + 0) & + 0xFF; + } + } + + VpuWriteMem(pCodecInst->coreIdx, + paraBuffer + 384 + 128 + 384, + (BYTE *)frameAddr, sizeof(frameAddr), + VDI_BIG_ENDIAN); + } + } +#endif + + if (!ConfigSecAXICoda9(pCodecInst->coreIdx, pCodecInst->codecMode, + &pDecInfo->secAxiInfo, pDecInfo->stride, + pDecInfo->initialInfo.profile & 0xff, + pDecInfo->initialInfo.interlace)) { + SecAxiUse sau; + sau.u.coda9.useBitEnable = 0; + sau.u.coda9.useIpEnable = 0; + sau.u.coda9.useDbkYEnable = 0; + sau.u.coda9.useDbkCEnable = 0; + sau.u.coda9.useOvlEnable = 0; + sau.u.coda9.useBtpEnable = 0; + VPU_DecGiveCommand((DecHandle)pCodecInst, SET_SEC_AXI, &sau); + + CVI_VC_ERR("ConfigSecAXICoda9 Fail, Don't use Sec AXI\n"); + + pDecInfo->secAxiInfo.u.coda9.bufBitUse = 0; + pDecInfo->secAxiInfo.u.coda9.bufIpAcDcUse = 0; + pDecInfo->secAxiInfo.u.coda9.bufDbkYUse = 0; + pDecInfo->secAxiInfo.u.coda9.bufDbkCUse = 0; + pDecInfo->secAxiInfo.u.coda9.bufOvlUse = 0; + pDecInfo->secAxiInfo.u.coda9.bufBtpUse = 0; + } + + for (i = 0; i < pDecInfo->numFrameBuffers; i++) { + pDecInfo->frameBufPool[i].nv21 = + pDecInfo->openParam.nv21 & + pDecInfo->openParam.cbcrInterleave; + } + + // Tell the decoder how much frame buffers were allocated. + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_BUF_NUM, + pDecInfo->numFrameBuffers); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_BUF_STRIDE, + pDecInfo->stride); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_BIT_ADDR, + pDecInfo->secAxiInfo.u.coda9.bufBitUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_IPACDC_ADDR, + pDecInfo->secAxiInfo.u.coda9.bufIpAcDcUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_DBKY_ADDR, + pDecInfo->secAxiInfo.u.coda9.bufDbkYUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_DBKC_ADDR, + pDecInfo->secAxiInfo.u.coda9.bufDbkCUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_OVL_ADDR, + pDecInfo->secAxiInfo.u.coda9.bufOvlUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_BTP_ADDR, + pDecInfo->secAxiInfo.u.coda9.bufBtpUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_DELAY, + pDecInfo->frameDelay); + + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_CACHE_CONFIG, + pDecInfo->cacheConfig.type2.CacheMode); + +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == VPX_DEC) { + vpu_buffer_t *pvbSlice = &pDecInfo->vbSlice; + if (pvbSlice->size == 0) { + pvbSlice->size = VP8_MB_SAVE_SIZE; + if (VDI_ALLOCATE_MEMORY(pCodecInst->coreIdx, pvbSlice, + 0) < 0) { + return RETCODE_INSUFFICIENT_RESOURCE; + } + } + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_MB_BUF_BASE, + pvbSlice->phys_addr); + } +#endif +#if SUPPORT_ASO_FMO + if ((pCodecInst->codecMode == AVC_DEC) && + (pDecInfo->initialInfo.profile == 66)) { + vpu_buffer_t *pvbSlice = &pDecInfo->vbSlice; + + if (pvbSlice->size == 0) { + // default pvbSlice->size = SLICE_SAVE_SIZE, we change to real frame size + pvbSlice->size = + ((pDecInfo->initialInfo.picHeight * + pDecInfo->initialInfo.picWidth * 3) >> + 2); + CVI_VC_MEM("pvbSlice->size = 0x%X\n", pvbSlice->size); + + sprintf(ionName, "VDEC_%d_H264_SliceBuf", + pCodecInst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(pCodecInst->coreIdx, pvbSlice, + 0, ionName) < 0) { + return RETCODE_INSUFFICIENT_RESOURCE; + } + } + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_SLICE_BB_START, + pvbSlice->phys_addr); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_SLICE_BB_SIZE, + (pvbSlice->size >> 10)); + } +#endif + if (pCodecInst->productId == PRODUCT_ID_980) { + val = 0; + val |= (pDecInfo->openParam.bwbEnable << 15); + val |= (pDecInfo->wtlMode << 17) | + (pDecInfo->tiled2LinearMode << 13) | + (pDecInfo->mapType << 9) | (FORMAT_420 << 6); + val |= ((pDecInfo->openParam.cbcrInterleave) + << 2); // Interleave + // bit + // position + // is + // modified + val |= pDecInfo->openParam.frameEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_FRAME_MEM_CTRL, val); +#ifdef REDUNDENT_CODE + } else if (pCodecInst->productId == PRODUCT_ID_960) { + val = 0; + val |= (pDecInfo->wtlEnable << 17); + val |= (pDecInfo->openParam.bwbEnable << 12); + if (pDecInfo->mapType) { + if (pDecInfo->mapType == TILED_FRAME_MB_RASTER_MAP || + pDecInfo->mapType == TILED_FIELD_MB_RASTER_MAP) + val |= (pDecInfo->tiled2LinearEnable << 11) | + (0x03 << 9) | (FORMAT_420 << 6); + else + val |= (pDecInfo->tiled2LinearEnable << 11) | + (0x02 << 9) | (FORMAT_420 << 6); + } + val |= ((pDecInfo->openParam.cbcrInterleave) + << 2); // Interleave + // bit + // position + // is + // modified + val |= pDecInfo->openParam.frameEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_FRAME_MEM_CTRL, val); +#endif + } else { + return RETCODE_NOT_FOUND_VPU_DEVICE; + } + + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_MAX_DEC_SIZE, + 0); // Must set to zero at API 2.1.5 version + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, SET_FRAME_BUF); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, SET_FRAME_BUF, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, SET_FRAME_BUF, 0); +#endif + + if (VpuReadReg(pCodecInst->coreIdx, RET_SET_FRAME_SUCCESS) & + (1UL << 31)) { + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuDecFlush(CodecInst *instance, + FramebufferIndex *framebufferIndexes, Uint32 size) +{ + Uint32 i; + DecInfo *pDecInfo = &instance->CodecInfo->decInfo; + + Coda9BitIssueCommand(instance->coreIdx, instance, DEC_BUF_FLUSH); + if (vdi_wait_vpu_busy(instance->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + pDecInfo->frameDisplayFlag = 0; + + if (framebufferIndexes != NULL) { + for (i = 0; i < size; i++) { + framebufferIndexes[i].linearIndex = -2; + framebufferIndexes[i].tiledIndex = -2; + } + } + + return RETCODE_SUCCESS; +} + +/************************************************************************/ +/* Encoder */ +/************************************************************************/ + +RetCode Coda9VpuBuildUpEncParam(CodecInst *pCodec, EncOpenParam *param) +{ + RetCode ret = RETCODE_SUCCESS; + Uint32 coreIdx; + Int32 productId; + EncInfo *pEncInfo = &pCodec->CodecInfo->encInfo; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + coreIdx = pCodec->coreIdx; + productId = Coda9VpuGetProductId(coreIdx); + + ret = SetupEncCodecInstance(productId, pCodec); + if (ret != RETCODE_SUCCESS) + return ret; + +#ifdef REDUNDENT_CODE + if (param->bitstreamFormat == STD_MPEG4 || + param->bitstreamFormat == STD_H263) + pCodec->codecMode = MP4_ENC; + else +#endif + if (param->bitstreamFormat == STD_AVC) + pCodec->codecMode = AVC_ENC; + + if (param->bitstreamFormat == STD_AVC && + param->EncStdParam.avcParam.mvcExtension) + pCodec->codecModeAux = AVC_AUX_MVC; + else + pCodec->codecModeAux = 0; + + if (param->bitstreamFormat == STD_AVC && + param->EncStdParam.avcParam.svcExtension) + pCodec->codecModeAux = AVC_AUX_SVC; + + if (productId == PRODUCT_ID_980) { + pEncInfo->ActivePPSIdx = 0; + pEncInfo->frameIdx = 0; + pEncInfo->fieldDone = 0; + } + + pEncInfo->vbWork.size = WORK_BUF_SIZE; + CVI_VC_MEM("vbWork.size = 0x%X\n", pEncInfo->vbWork.size); + + sprintf(ionName, "VENC_%d_H264_WorkBuffer", pCodec->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(pCodec->coreIdx, &pEncInfo->vbWork, 0, + ionName) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + + pEncInfo->streamRdPtr = param->bitstreamBuffer; + pEncInfo->streamWrPtr = param->bitstreamBuffer; + CVI_VC_TRACE("bitstreamBuffer = 0x%llX\n", param->bitstreamBuffer); + CVI_VC_TRACE("streamRdPtr = 0x%llX, streamWtPtr = 0x%llX\n", + pEncInfo->streamRdPtr, pEncInfo->streamWrPtr); + pEncInfo->lineBufIntEn = param->lineBufIntEn; + pEncInfo->bEsBufQueueEn = param->bEsBufQueueEn; + pEncInfo->streamBufStartAddr = param->bitstreamBuffer; + pEncInfo->streamBufSize = param->bitstreamBufferSize; + pEncInfo->streamBufEndAddr = + param->bitstreamBuffer + param->bitstreamBufferSize; + pEncInfo->stride = 0; + pEncInfo->vbFrame.size = 0; + pEncInfo->vbPPU.size = 0; + pEncInfo->frameAllocExt = 0; + pEncInfo->ppuAllocExt = 0; + pEncInfo->secAxiInfo.u.coda9.useBitEnable = 0; + pEncInfo->secAxiInfo.u.coda9.useIpEnable = 0; + pEncInfo->secAxiInfo.u.coda9.useDbkYEnable = 0; + pEncInfo->secAxiInfo.u.coda9.useDbkCEnable = 0; + pEncInfo->secAxiInfo.u.coda9.useOvlEnable = 0; + pEncInfo->rotationEnable = 0; + pEncInfo->mirrorEnable = 0; + pEncInfo->mirrorDirection = MIRDIR_NONE; + pEncInfo->rotationAngle = 0; + pEncInfo->initialInfoObtained = 0; + pEncInfo->ringBufferEnable = param->ringBufferEnable; + pEncInfo->linear2TiledEnable = param->linear2TiledEnable; + pEncInfo->linear2TiledMode = param->linear2TiledMode; // coda980 only + + if (pEncInfo->linear2TiledEnable == TRUE) + pEncInfo->mapType = TILED_FRAME_V_MAP; + + if (!pEncInfo->linear2TiledEnable) + pEncInfo->linear2TiledMode = 0; + + /* Maverick Cache I */ + osal_memset((void *)&pEncInfo->cacheConfig, 0x00, + sizeof(MaverickCacheConfig)); + +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + pEncInfo->dramCfg.bankBit = EM_BANK; + pEncInfo->dramCfg.casBit = EM_CAS; + pEncInfo->dramCfg.rasBit = EM_RAS; + pEncInfo->dramCfg.busBit = EM_WIDTH; + } +#endif + + return ret; +} + +#ifdef SUPPORT_980_ROI_RC_LIB +static void set_rps(gop_entry_t *gop, int gop_size, + // OUT + rps_t rps[MAX_GOP_SIZE]) +{ + int curr; + + for (curr = 0; curr < gop_size; curr++) + rps[curr].num_poc = 0; + + for (curr = 0; curr < gop_size; curr++) { + int next; + int last_idx = -1; + int curr_poc = gop[curr].curr_poc; + + // find the last frame that uses the current frame as reference + // in encoding order + for (next = curr + 1; next < 3 * gop_size; next++) { + gop_entry_t *g = &gop[next % gop_size]; + int gop_poc = next / gop_size * gop_size; + + if (g->ref_poc + gop_poc == curr_poc) // ref0 + last_idx = next; + } + + // set nal_ref_idc + rps[curr].used_for_ref = (last_idx != -1); + + // set rps + for (next = curr + 1; next <= last_idx; next++) { + rps_t *r = &rps[next % gop_size]; + int gop_poc = next / gop_size * gop_size; + + r->poc[r->num_poc++] = curr_poc - gop_poc; + } + } +} +static void set_extra_gop_entry(gop_entry_t *gop, int gop_size) +{ + int i; + gop_entry_t *src = gop; + gop_entry_t *des = gop + gop_size; + + for (i = 0; i < gop_size; i++) { + des->curr_poc = i + 1; + des->ref_poc = i; + des->qp_offset = src->qp_offset; + des++; + src++; + } +} + +static int get_num_ref_frames(rps_t *rps, int gop_size, int use_long_term) +{ + int i; + int num_ref_frames = 0; + + for (i = 0; i < gop_size; i++) { + num_ref_frames = MAX(rps[i].num_poc, num_ref_frames); + } + if (use_long_term) + num_ref_frames += 1; + + return num_ref_frames; +} +static void get_num_reorder_frames(gop_entry_t *gop, int gop_size, + int *max_num_reorder_pic, + int32_t *src_latency) +{ + int curr; + int max_num_reorder = 0; + int enc_order, latency; + int max_latency_pic = 0; + + for (curr = 0; curr < gop_size; curr++) { + int prev; + int num_reorder = 0; + for (prev = 0; prev < curr; prev++) // for all frames that + // precedes frame i in + // encoding order + { + if (gop[prev].curr_poc > gop[curr].curr_poc) // follows + // frame i + // in output + // order + num_reorder++; + } + enc_order = curr + 1; + latency = gop[curr].curr_poc - enc_order; + + max_num_reorder = MAX(num_reorder, max_num_reorder); + max_latency_pic = MAX(latency, max_latency_pic); + } + *src_latency = max_latency_pic; + *max_num_reorder_pic = max_num_reorder; +} + +static int get_max_dec_buffering(gop_entry_t gop[MAX_GOP_SIZE], + rps_t rps[MAX_GOP_SIZE], int gop_size, + int use_long_term) +{ + int curr; + int max_dec_buffering = 0; + + for (curr = 0; curr < gop_size; curr++) { + int prev; + int dec_buffering = rps[curr].num_poc; + + // find reordered frame that is not used for reference + for (prev = 0; prev < curr; prev++) { + int is_ref_frm = 0; + + if (gop[prev].curr_poc > gop[curr].curr_poc) // it is + // reordered + // frame + { + int i; + for (i = 0; i < rps[curr].num_poc; i++) { + if (gop[prev].curr_poc == + rps[curr].poc[i]) + is_ref_frm = 1; + } + if (!is_ref_frm) // not used for reference + dec_buffering++; + } + } + max_dec_buffering = MAX(dec_buffering, max_dec_buffering); + } + if (use_long_term) + max_dec_buffering += 1; + + return max_dec_buffering; +} + +// when temporal scalability is enabled, +// decoder needs more num_ref_frames than encoder due to non-existing frames. +static int get_num_ref_frames_for_decoder( + // dpb_t *dpb, + EncInfo *avc, int use_long_term) +{ + int num_ref_frames_decoder = avc->num_ref_frame; + + // if (avc->max_temporal_id > 0) + { + int enc_idx; + int frmnum = 0; + uint8_t poc_to_frmnum[2 * MAX_GOP_SIZE + 1]; + + poc_to_frmnum[0] = 0; + + for (enc_idx = 0; enc_idx < 2 * avc->gop_size; enc_idx++) { + int i; + int enc_idx_mod = enc_idx % avc->gop_size; + int gop_poc = enc_idx / avc->gop_size * avc->gop_size; + int poc = + avc->gop_entry[enc_idx_mod].curr_poc + gop_poc; + rps_t *rps = &avc->rps[enc_idx_mod]; + + if (rps->used_for_ref) + frmnum++; + + // set table for poc to frame_num + // assert(poc < sizeof(poc_to_frmnum)); + poc_to_frmnum[poc] = frmnum; + + // calculate difference of frame_num between current + // frame and ref frame + for (i = 0; i < rps->num_poc; i++) { + int ref_poc = gop_poc + rps->poc[i]; + if (ref_poc >= 0) { + int frmnum_diff; + // assert(ref_poc < + // sizeof(poc_to_frmnum)); +1 for non_ref + //frame because frmnum itself is ref + //frame + frmnum_diff = frmnum - + poc_to_frmnum[ref_poc] + + !rps->used_for_ref; + num_ref_frames_decoder = MAX( + num_ref_frames_decoder, + frmnum_diff + use_long_term); + } + } + } + } + + return num_ref_frames_decoder; +} + +static int get_max_dec_buffering_for_decoder( + // dpb_t *dpb) + EncInfo *avc) +{ + int extra_num_ref_frames = + avc->num_ref_frames_decoder - avc->num_ref_frame; + int max_dec_buffering_decoder = + avc->max_dec_buffering + extra_num_ref_frames; + + return max_dec_buffering_decoder; +} + +static int calc_max_temporal_id( + // dpb_t *dpb) + EncInfo *avc) +{ + int i; + int max_temporal_id = 0; + + if (avc->gop_size != 0) { + for (i = 0; i < avc->gop_size; i++) + max_temporal_id = MAX(max_temporal_id, + avc->gop_entry[i].temporal_id); + } + + return max_temporal_id; +} + +static void enc_init_header(EncInfo *pEncInfo, gop_entry_t *gop_entry_in, + int gopSize, int setAsLongTermPeriod, + int set_dqp_pic_num) +{ + int i; + + osal_memcpy(pEncInfo->gop_entry, gop_entry_in, + sizeof(gop_entry_t) * MAX_GOP_SIZE); + + pEncInfo->prev_idx = -1; + pEncInfo->gop_size = set_dqp_pic_num; + pEncInfo->enc_idx_modulo = -1; + pEncInfo->src_idx = 0; + pEncInfo->enc_idx_gop = 0; + pEncInfo->src_idx_last_idr = 0; + pEncInfo->prev_frame_num = 0; + pEncInfo->use_long_term_seq = setAsLongTermPeriod > 0 ? 1 : 0; + pEncInfo->curr_long_term = 0; + pEncInfo->longterm_frmidx = -1; + pEncInfo->ref_long_term = 0; + pEncInfo->Idr_picId = -1; + pEncInfo->long_term_period = pEncInfo->openParam.LongTermPeriod; + pEncInfo->virtual_i_period = pEncInfo->openParam.VirtualIPeriod; + + pEncInfo->Idr_cnt = 0; + pEncInfo->frm_cnt = 0; + pEncInfo->enc_long_term_cnt = 0; + + for (i = 0; i < 31; i++) + pEncInfo->frm[i].used_for_ref = 0; + + if (gopSize == 1) { // all-Intra + pEncInfo->num_ref_frame = 0; + pEncInfo->max_dec_buffering = 1; + pEncInfo->gop_size = 1; + pEncInfo->rps[0].used_for_ref = 1; + pEncInfo->rps[0].num_poc = 1; + pEncInfo->gop_entry[0].curr_poc = 1; + pEncInfo->gop_entry[0].temporal_id = 0; + } else { + set_extra_gop_entry(pEncInfo->gop_entry, pEncInfo->gop_size); + set_rps(pEncInfo->gop_entry, pEncInfo->gop_size, pEncInfo->rps); + set_rps(&pEncInfo->gop_entry[pEncInfo->gop_size], + pEncInfo->gop_size, &pEncInfo->rps[pEncInfo->gop_size]); + pEncInfo->num_ref_frame = + get_num_ref_frames(pEncInfo->rps, pEncInfo->gop_size, + pEncInfo->use_long_term_seq); + get_num_reorder_frames(pEncInfo->gop_entry, pEncInfo->gop_size, + &pEncInfo->num_reorder_frames, + &pEncInfo->max_latency_pictures); + pEncInfo->max_dec_buffering = + get_max_dec_buffering(pEncInfo->gop_entry, + pEncInfo->rps, pEncInfo->gop_size, + pEncInfo->use_long_term_seq); + } + pEncInfo->max_temporal_id = calc_max_temporal_id(pEncInfo); + pEncInfo->num_ref_frames_decoder = get_num_ref_frames_for_decoder( + pEncInfo, pEncInfo->use_long_term_seq); + pEncInfo->max_dec_buffering_decoder = + get_max_dec_buffering_for_decoder(pEncInfo); + + pEncInfo->num_total_frames = pEncInfo->num_ref_frame + 1; +} +#endif /* SUPPORT_980_ROI_RC_LIB */ + +RetCode Coda9VpuEncSetup(CodecInst *pCodecInst) +{ + Int32 picWidth, picHeight; + Int32 data, val; + Int32 productId, rcEnable; + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + stRcInfo *pRcInfo = &pCodecInst->rcInfo; + + rcEnable = pEncInfo->openParam.rcEnable & 0xf; + + //===================================================================== + // using RC library, + // 1. calculate non-roi QP considering target bitrate + // when rc mode == 4 && roi enabled. + // 2. calculate picQp (rc mode==4). if rc mode is 4(picture level RC) + // && roi disabled + //===================================================================== + + // to calculate real encoded bit when ringbuffer enabled. + pEncInfo->prevWrPtr = pEncInfo->streamBufStartAddr; + + if (pCodecInst->productId == PRODUCT_ID_980 && + pEncInfo->openParam.bitstreamFormat == STD_AVC) { + rcLibSetupRc(pCodecInst); + } + + if (pEncInfo->openParam.bitstreamFormat == STD_AVC && + pCodecInst->codecModeAux == AVC_AUX_SVC) +#ifdef SUPPORT_980_ROI_RC_LIB + enc_init_header(pEncInfo, pEncInfo->openParam.gopEntry, + pEncInfo->openParam.gopSize, + pEncInfo->openParam.LongTermPeriod, + pEncInfo->openParam.set_dqp_pic_num); +#endif + + productId = pCodecInst->productId; + picWidth = pEncInfo->openParam.picWidth; + picHeight = pEncInfo->openParam.picHeight; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_BB_START, + pEncInfo->streamBufStartAddr); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_BB_SIZE, + pEncInfo->streamBufSize >> 10); // size in KB + + // Rotation Left 90 or 270 case : Swap XY resolution for VPU internal + // usage + if (pEncInfo->rotationAngle == 90 || pEncInfo->rotationAngle == 270) + data = (picHeight << 16) | picWidth; + else + data = (picWidth << 16) | picHeight; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_SRC_SIZE, data); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_SRC_F_RATE, + pEncInfo->openParam.frameRateInfo); + +#ifdef REDUNDENT_CODE + if (pEncInfo->openParam.bitstreamFormat == STD_MPEG4) { + CVI_VC_TRACE("bitstreamFormat = 0x%X\n", + pEncInfo->openParam.bitstreamFormat); + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_COD_STD, 3); + data = pEncInfo->openParam.EncStdParam.mp4Param.mp4IntraDcVlcThr + << 2 | + pEncInfo->openParam.EncStdParam.mp4Param + .mp4ReversibleVlcEnable + << 1 | + pEncInfo->openParam.EncStdParam.mp4Param + .mp4DataPartitionEnable; + + data |= ((pEncInfo->openParam.EncStdParam.mp4Param.mp4HecEnable > + 0) ? + 1 : + 0) + << 5; + data |= ((pEncInfo->openParam.EncStdParam.mp4Param.mp4Verid == + 2) ? + 0 : + 1) + << 6; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_MP4_PARA, data); + + if (productId == PRODUCT_ID_980) + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_ME_OPTION, + (VPU_ME_LINEBUFFER_MODE << 9) | + (pEncInfo->openParam.meBlkMode + << 5) | + (pEncInfo->openParam.MEUseZeroPmv + << 4) | + (pEncInfo->openParam.MESearchRangeY + << 2) | + pEncInfo->openParam.MESearchRangeX); + else + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_ME_OPTION, + (pEncInfo->openParam.meBlkMode << 3) | + (pEncInfo->openParam.MEUseZeroPmv + << 2) | + pEncInfo->openParam.MESearchRange); + } else if (pEncInfo->openParam.bitstreamFormat == STD_H263) { + CVI_VC_TRACE("bitstreamFormat = 0x%X\n", + pEncInfo->openParam.bitstreamFormat); + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_COD_STD, 11); + data = pEncInfo->openParam.EncStdParam.h263Param.h263AnnexIEnable + << 3 | + pEncInfo->openParam.EncStdParam.h263Param.h263AnnexJEnable + << 2 | + pEncInfo->openParam.EncStdParam.h263Param.h263AnnexKEnable + << 1 | + pEncInfo->openParam.EncStdParam.h263Param + .h263AnnexTEnable; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_263_PARA, data); + if (productId == PRODUCT_ID_980) + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_ME_OPTION, + (VPU_ME_LINEBUFFER_MODE << 9) | + (pEncInfo->openParam.meBlkMode + << 5) | + (pEncInfo->openParam.MEUseZeroPmv + << 4) | + (pEncInfo->openParam.MESearchRangeY + << 2) | + pEncInfo->openParam.MESearchRangeX); + else + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_ME_OPTION, + (pEncInfo->openParam.meBlkMode << 3) | + (pEncInfo->openParam.MEUseZeroPmv + << 2) | + pEncInfo->openParam.MESearchRange); + } else +#endif + if (pEncInfo->openParam.bitstreamFormat == STD_AVC) { + CVI_VC_CFG("bitstreamFormat = 0x%X\n", + pEncInfo->openParam.bitstreamFormat); + + if (productId == PRODUCT_ID_980) { + int SliceNum = 0; + AvcPpsParam *ActivePPS = + &pEncInfo->openParam.EncStdParam.avcParam + .ppsParam[pEncInfo->ActivePPSIdx]; + if (ActivePPS->transform8x8Mode == 1 || + pEncInfo->openParam.EncStdParam.avcParam + .chromaFormat400 == 1) + pEncInfo->openParam.EncStdParam.avcParam + .profile = CVI_H264E_PROFILE_HIGH; + else if (ActivePPS->entropyCodingMode != 0 || + pEncInfo->openParam.EncStdParam.avcParam + .fieldFlag == 1) + pEncInfo->openParam.EncStdParam.avcParam + .profile = CVI_H264E_PROFILE_MAIN; + else + pEncInfo->openParam.EncStdParam.avcParam + .profile = CVI_H264E_PROFILE_BASELINE; + + if (pEncInfo->openParam.sliceMode.sliceMode == 1 && + pEncInfo->openParam.sliceMode.sliceSizeMode == 1) + SliceNum = + pEncInfo->openParam.sliceMode.sliceSize; + + if (!pEncInfo->openParam.EncStdParam.avcParam.level) { + if (pEncInfo->openParam.EncStdParam.avcParam + .fieldFlag) + pEncInfo->openParam.EncStdParam.avcParam + .level = LevelCalculation( + picWidth >> 4, + (picHeight + 31) >> 5, + pEncInfo->openParam + .frameRateInfo, + 1, pEncInfo->openParam.bitRate, + SliceNum); + else + pEncInfo->openParam.EncStdParam.avcParam + .level = LevelCalculation( + picWidth >> 4, picHeight >> 4, + pEncInfo->openParam + .frameRateInfo, + 0, pEncInfo->openParam.bitRate, + SliceNum); + if (pEncInfo->openParam.EncStdParam.avcParam + .level < 0) { + CVI_VC_ERR( + "avcParam.level %d not support\n", + pEncInfo->openParam.EncStdParam + .avcParam.level); + return RETCODE_INVALID_PARAM; + } + } + + VpuWriteReg( + pCodecInst->coreIdx, CMD_ENC_SEQ_COD_STD, + (pEncInfo->openParam.EncStdParam.avcParam.profile + << 4) | 0x0); + + } else { + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_COD_STD, + 0x0); + } + + data = (pEncInfo->openParam.EncStdParam.avcParam + .deblkFilterOffsetBeta & + 15) << 12 | + (pEncInfo->openParam.EncStdParam.avcParam + .deblkFilterOffsetAlpha & + 15) << 8 | + pEncInfo->openParam.EncStdParam.avcParam.disableDeblk + << 6 | + pEncInfo->openParam.EncStdParam.avcParam + .constrainedIntraPredFlag + << 5 | + (pEncInfo->openParam.EncStdParam.avcParam.chromaQpOffset & + 31); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_264_PARA, data); + +#if ENABLE_RC_LIB + if (productId == PRODUCT_ID_980) { + VpuWriteReg( + pCodecInst->coreIdx, CMD_ENC_SEQ_ME_OPTION, + (VPU_ME_LINEBUFFER_MODE << 9) | + (pEncInfo->openParam.meBlkMode << 5) | + (pEncInfo->openParam.MEUseZeroPmv + << 4) | +#ifdef CVI_SEARCH_RANGE + (pEncInfo->openParam.MESearchRangeY + << 2) | + pEncInfo->openParam.MESearchRangeX +#else + (2 << 2) | 3 +#endif + ); + + CVI_VC_CFG("CMD_ENC_SEQ_ME_OPTION = 0x%X\n", + VpuReadReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_ME_OPTION)); + } else { + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_ME_OPTION, + (pEncInfo->openParam.meBlkMode << 3) | + (pEncInfo->openParam.MEUseZeroPmv + << 2) | + pEncInfo->openParam.MESearchRange); + } +#endif + } + + if (productId == PRODUCT_ID_980) { + data = 0; + if (pEncInfo->openParam.sliceMode.sliceMode != 0) { + data = pEncInfo->openParam.sliceMode.sliceSize << 2 | + (pEncInfo->openParam.sliceMode.sliceSizeMode + + 1); // encoding mode 0,1,2 + } + } +#ifdef REDUNDENT_CODE + else { + data = pEncInfo->openParam.sliceMode.sliceSize << 2 | + pEncInfo->openParam.sliceMode.sliceSizeMode << 1 | + pEncInfo->openParam.sliceMode.sliceMode; + } +#endif + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_SLICE_MODE, data); + CVI_VC_CFG("rcEnable = %d\n", rcEnable); + + if (rcEnable) { // rate control enabled + if (productId == PRODUCT_ID_980) { + if (pEncInfo->openParam.bitstreamFormat == STD_AVC) { + int MinDeltaQp, MaxDeltaQp, QpMinI, QpMaxI, + QpMinP, QpMaxP; + + data = (pEncInfo->openParam.idrInterval << 21) | + (pEncInfo->openParam.rcGopIQpOffsetEn + << 20) | + ((pEncInfo->openParam.rcGopIQpOffset & + 0xF) + << 16) | + pEncInfo->openParam.gopSize; + + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_GOP_NUM, data); + + data = (pEncInfo->openParam.frameSkipDisable + << 31) | + (pEncInfo->openParam.rcInitDelay << 16) | + (pEncInfo->openParam.RcHvsMaxDeltaQp); + + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_RC_PARA, data); + + data = (pEncInfo->openParam.HvsQpScaleDiv2 + << 25) | + (pEncInfo->openParam.EnHvsQp << 24) | + (pEncInfo->openParam.EnRowLevelRc + << 23) | + (pRcInfo->targetBitrate << 4) | + (rcEnable); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_RC_PARA2, data); + + data = 0; + if (pEncInfo->openParam.maxIntraSize > 0) { + data = (1 << 16) | + (pEncInfo->openParam.maxIntraSize & + 0xFFFF); + } + + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_RC_MAX_INTRA_SIZE, + data); + + if (pEncInfo->openParam.userQpMinI < 0) + QpMinI = 0; + else + QpMinI = (1 << 6) | + pEncInfo->openParam.userQpMinI; + + if (pEncInfo->openParam.userQpMaxI < 0) + QpMaxI = 0; + else + QpMaxI = (1 << 6) | + pEncInfo->openParam.userQpMaxI; + + if (pEncInfo->openParam.userQpMinP < 0) + QpMinP = 0; + else + QpMinP = (1 << 6) | + pEncInfo->openParam.userQpMinP; + + if (pEncInfo->openParam.userQpMaxP < 0) + QpMaxP = 0; + else + QpMaxP = (1 << 6) | + pEncInfo->openParam.userQpMaxP; + + data = QpMinP << 24 | QpMaxP << 16 | + QpMinI << 8 | QpMaxI; + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_QP_RANGE_SET, data); + + if (pEncInfo->openParam.userMinDeltaQp < 0) + MinDeltaQp = 0; + else + MinDeltaQp = (1 << 6) | + pEncInfo->openParam + .userMinDeltaQp; + + if (pEncInfo->openParam.userMaxDeltaQp < 0) + MaxDeltaQp = 0; + else + MaxDeltaQp = (1 << 6) | + pEncInfo->openParam + .userMaxDeltaQp; + + data = MinDeltaQp << 8 | MaxDeltaQp; + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_DELTA_QP, data); + } +#ifdef REDUNDENT_CODE + else { // MP4 + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_GOP_NUM, + pEncInfo->openParam.gopSize); + data = (pEncInfo->openParam.frameSkipDisable) + << 31 | + pEncInfo->openParam.rcInitDelay << 16; + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_RC_PARA, data); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_QP_RANGE_SET, 0); + + data = (pEncInfo->openParam.bitRate << 4) | 1; + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_RC_PARA2, data); + } +#endif + } +#ifdef REDUNDENT_CODE + else { + /* coda960 ENCODER */ + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_GOP_NUM, + pEncInfo->openParam.gopSize); + + data = (pEncInfo->openParam.frameSkipDisable) << 31 | + pEncInfo->openParam.rcInitDelay << 16 | + pEncInfo->openParam.bitRate << 1 | 1; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_RC_PARA, + data); + } +#endif + } else { + if (pEncInfo->openParam.bitstreamFormat == STD_AVC) { + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_GOP_NUM, + (pEncInfo->openParam.idrInterval << 21) | + pEncInfo->openParam.gopSize); + } else + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_GOP_NUM, + pEncInfo->openParam.gopSize); + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_RC_PARA, 0); + + if (productId == PRODUCT_ID_980) { + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_SEQ_QP_RANGE_SET, 0); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_RC_PARA2, + 0); + } + } + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_RC_BUF_SIZE, + pEncInfo->openParam.vbvBufferSize); + data = pEncInfo->openParam.intraRefreshNum | + pEncInfo->openParam.ConscIntraRefreshEnable << 16 | + pEncInfo->openParam.CountIntraMbEnable << 17 | + pEncInfo->openParam.FieldSeqIntraRefreshEnable << 18; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_INTRA_REFRESH, data); + + data = 0; + if (pEncInfo->openParam.rcIntraQp >= 0) { + data = (1 << 5); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_INTRA_QP, + pEncInfo->openParam.rcIntraQp); + } else { + data = 0; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_INTRA_QP, + (Uint32)-1); + } + + if (pEncInfo->openParam.userQpMax >= 0) { + data |= (1 << 6); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_RC_QP_MAX, + pEncInfo->openParam.userQpMax); + } else { + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_RC_QP_MAX, 0); + } + + if (pEncInfo->openParam.userGamma >= 0) { + data |= (1 << 7); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_RC_GAMMA, + pEncInfo->openParam.userGamma); + } else { + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_RC_GAMMA, 0); + } + + if (pCodecInst->codecMode == AVC_ENC) { + data |= (pEncInfo->openParam.EncStdParam.avcParam.audEnable + << 2); + + if (pCodecInst->codecModeAux == AVC_AUX_MVC) { + data |= (pEncInfo->openParam.EncStdParam.avcParam + .interviewEn + << 4); + data |= (pEncInfo->openParam.EncStdParam.avcParam + .parasetRefreshEn + << 8); + data |= (pEncInfo->openParam.EncStdParam.avcParam + .prefixNalEn + << 9); + } + + if (productId == PRODUCT_ID_980) { + data |= pEncInfo->openParam.EncStdParam.avcParam + .fieldFlag + << 10; + data |= pEncInfo->openParam.EncStdParam.avcParam + .fieldRefMode + << 11; + } + } + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_OPTION, data); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_RC_INTERVAL_MODE, + (pEncInfo->openParam.mbInterval << 2) | + pEncInfo->openParam.rcIntervalMode); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_SEQ_INTRA_WEIGHT, + pEncInfo->openParam.intraCostWeight); + + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr, + pEncInfo->streamWrPtr); + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamRdPtrRegAddr, + pEncInfo->streamRdPtr); + CVI_VC_TRACE("streamRdPtr = 0x%llX, streamWtPtr = 0x%llX\n", + pEncInfo->streamRdPtr, pEncInfo->streamWrPtr); + + SetEncFrameMemInfo(pCodecInst); + + val = 0; + if (pEncInfo->ringBufferEnable == 0) { + if (pEncInfo->lineBufIntEn) + val |= (0x1 << 6); +#ifndef PLATFORM_NON_OS + val |= (0x1 << 5); + val |= (0x1 << 4); +#endif + } else { + val |= (0x1 << 3); + } + val |= pEncInfo->openParam.streamEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_CTRL, val); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, ENC_SEQ_INIT); + + if (vdi_wait_interrupt(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, NULL) == + -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENC_SEQ_INIT, 2); +#endif + CVI_VC_ERR("ENC_SEQ_INIT RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + VpuWriteReg(pCodecInst->coreIdx, BIT_INT_CLEAR, + 1); // that is OK. HW signal already is clear by device + // driver + VpuWriteReg(pCodecInst->coreIdx, BIT_INT_REASON, 0); + +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENC_SEQ_INIT, 0); +#endif + + if (VpuReadReg(pCodecInst->coreIdx, RET_ENC_SEQ_END_SUCCESS) & + (1UL << 31)) { + CVI_VC_ERR("MEMORY_ACCESS_VIOLATION\n"); + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + + if (VpuReadReg(pCodecInst->coreIdx, RET_ENC_SEQ_END_SUCCESS) == 0) { + CVI_VC_ERR("RET_ENC_SEQ_END_SUCCESS fail\n"); + return RETCODE_FAILURE; + } + + pEncInfo->streamWrPtr = + VpuReadReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr); + pEncInfo->streamEndflag = + VpuReadReg(pCodecInst->coreIdx, BIT_BIT_STREAM_PARAM); + CVI_VC_TRACE("streamRdPtr = 0x%llX, streamWtPtr = 0x%llX\n", + pEncInfo->streamRdPtr, pEncInfo->streamWrPtr); + + return RETCODE_SUCCESS; +} + +void rcLibSetupRc(CodecInst *pCodecInst) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + stRcInfo *pRcInfo = &pCodecInst->rcInfo; + int gamma = pEncInfo->openParam.userGamma; +#ifdef CLIP_PIC_DELTA_QP + int max_delta_qp_minus = pEncInfo->openParam.userMinDeltaQp; + int max_delta_qp_plus = pEncInfo->openParam.userMaxDeltaQp; +#endif +#if ENABLE_RC_LIB + int is_first_pic = (pEncInfo->frameIdx == 0); + int gop_size = pEncInfo->openParam.gopSize; +#if 1 + int buf_size_ms = pEncInfo->openParam.rcInitDelay; // * bps; +#else + int buf_size_ms = pEncInfo->openParam.statTime * 1000; // * bps; +#endif + int bps = pRcInfo->targetBitrate * 1000; + int frame_rate = (pEncInfo->openParam.frameRateInfo & 0xffff) / + ((pEncInfo->openParam.frameRateInfo >> 16) + 1); + int pic_width, pic_height; + Int32 rcEnable; + + UNUSED(pRcInfo); + UNUSED(is_first_pic); + UNUSED(buf_size_ms); + UNUSED(bps); + if (pCodecInst->codecMode == HEVC_ENC) { + /* + For current HEVC, FW does all the RC-releated jobs. + Some features are not supported, like maxIprop. + By using LLRC, user can develop thier own RC algorithm. + We open LLRC interface as UBR mode. User needs to set frame Qp & target + bits of each frame by using UBR API. + However, if bTestUbrEn is enabled, this means we'd like to use rcLib to + do CBR, and send Qp & target bits to test UBR API. + By using LLRC, We also can replace original CBR with new developed CBR. + In this way, maxIprop could be supported. + */ + rcEnable = 4; + } else { + rcEnable = pEncInfo->openParam.rcEnable & 0xf; + } + + CVI_VC_CFG("rcEnable = %d, bps = %d, frame_rate = %d\n", rcEnable, bps, + frame_rate); + + if (pEncInfo->rotationAngle == 90 || pEncInfo->rotationAngle == 270) { + pic_width = pEncInfo->openParam.picHeight; + pic_height = pEncInfo->openParam.picWidth; + } else { + pic_width = pEncInfo->openParam.picWidth; + pic_height = pEncInfo->openParam.picHeight; + } + + if (pEncInfo->openParam.EncStdParam.avcParam.fieldFlag) { + pic_height = pic_height >> 1; + frame_rate = frame_rate << 1; + if (gop_size != 1) + gop_size = pEncInfo->openParam.gopSize << 1; + } +#endif + + if (gamma == -1) + gamma = 1; + +#ifdef CLIP_PIC_DELTA_QP + if (max_delta_qp_minus == -1) + max_delta_qp_minus = 51; + if (max_delta_qp_plus == -1) + max_delta_qp_plus = 51; +#endif + +#if ENABLE_RC_LIB + CVI_VC_RC("bps = %d, buf_size_ms = %d\n", bps, buf_size_ms); + CVI_VC_RC("frame_rate = %d, pic_width = %d, pic_height = %d\n", + frame_rate, pic_width, pic_height); + CVI_VC_RC("gop_size = %d, rcEnable = %d, set_dqp_pic_num = %d\n", + gop_size, rcEnable, pEncInfo->openParam.set_dqp_pic_num); + CVI_VC_RC( + "LongTermDeltaQp = %d, RcInitialQp = %d, is_first_pic = %d, gamma = %d\n", + pEncInfo->openParam.LongTermDeltaQp, + pEncInfo->openParam.RcInitialQp, is_first_pic, gamma); + CVI_VC_RC( + "rcWeightFactor = %d, max_delta_qp_minus = %d, max_delta_qp_plus = %d\n", + pEncInfo->openParam.rcWeightFactor, max_delta_qp_minus, + max_delta_qp_plus); + + CVI_FUNC_COND(CVI_MASK_RQ, frm_rc_print(&pEncInfo->frm_rc)); +#endif + +#ifdef AUTO_FRM_SKIP_DROP + CVI_VC_RC( + "enAutoFrmSkip = %d, enAutoFrmDrop = %d, vbvThreshold = %d, qpThreshold = %d\n", + pEncInfo->openParam.enAutoFrmSkip, + pEncInfo->openParam.enAutoFrmDrop, + pEncInfo->openParam.vbvThreshold, + pEncInfo->openParam.qpThreshold); + + CVI_FUNC_COND(CVI_MASK_RQ, frm_rc_print(&pEncInfo->frm_rc)); +#endif +} + +RetCode Coda9VpuEncRegisterFramebuffer(CodecInst *instance) +{ + CodecInst *pCodecInst = instance; + EncInfo *pEncInfo; + Int32 i, val; +#ifdef REDUNDENT_CODE + RetCode ret; +#endif + PhysicalAddress paraBuffer; + BYTE frameAddr[MAX_FRAMEBUFFER_COUNT + 1][3][4] = { 0 }; +#ifdef REDUNDENT_CODE + Int32 stride, height, mapType, num; +#else + Int32 stride, height, mapType; +#endif + VpuAttr *pAttr = &g_VpuCoreAttributes[instance->coreIdx]; + + pEncInfo = &instance->CodecInfo->encInfo; + stride = pEncInfo->stride; + height = pEncInfo->frameBufferHeight; + mapType = pEncInfo->mapType; + + CVI_VC_TRACE("mapType = 0x%X\n", mapType); + +#ifdef REDUNDENT_CODE + if (pCodecInst->productId == PRODUCT_ID_960) { + pEncInfo->mapCfg.tiledBaseAddr = pEncInfo->vbFrame.phys_addr; + } +#endif + + if (!ConfigSecAXICoda9(pCodecInst->coreIdx, instance->codecMode, + &pEncInfo->secAxiInfo, stride, 0, 0)) + return RETCODE_INSUFFICIENT_RESOURCE; + +#ifdef REDUNDENT_CODE + if (pCodecInst->productId == PRODUCT_ID_960) { + val = SetTiledMapType(pCodecInst->coreIdx, &pEncInfo->mapCfg, + mapType, stride, + pEncInfo->openParam.cbcrInterleave, + &pEncInfo->dramCfg); + } else +#endif + { + if (mapType != LINEAR_FRAME_MAP && mapType != LINEAR_FIELD_MAP) + val = SetTiledMapType( + pCodecInst->coreIdx, &pEncInfo->mapCfg, mapType, + (stride > height) ? stride : height, + pEncInfo->openParam.cbcrInterleave, + &pEncInfo->dramCfg); + else + val = SetTiledMapType( + pCodecInst->coreIdx, &pEncInfo->mapCfg, mapType, + stride, pEncInfo->openParam.cbcrInterleave, + &pEncInfo->dramCfg); + } + + if (val == 0) + return RETCODE_INVALID_PARAM; + + SetEncFrameMemInfo(pCodecInst); + + paraBuffer = vdi_remap_memory_address(pCodecInst->coreIdx, + VpuReadReg(pCodecInst->coreIdx, + BIT_PARA_BUF_ADDR)); + + if (pEncInfo->addrRemapEn) { + cviInitAddrRemapFb(pCodecInst); + } + + if (pEncInfo->numFrameBuffers > MAX_FRAMEBUFFER_COUNT) { + CVI_VC_ERR("numFrameBuffers %d out of spec\n", + pEncInfo->numFrameBuffers); + return RETCODE_INVALID_PARAM; + } + + // Let the decoder know the addresses of the frame buffers. + for (i = 0; i < pEncInfo->numFrameBuffers; i++) { + CVI_VC_TRACE("bufY = 0x%llX, Cb = 0x%llX, Cr = 0x%llX\n", + pEncInfo->frameBufPool[i].bufY, + pEncInfo->frameBufPool[i].bufCb, + pEncInfo->frameBufPool[i].bufCr); + frameAddr[i][0][0] = + (pEncInfo->frameBufPool[i].bufY >> 24) & 0xFF; + frameAddr[i][0][1] = + (pEncInfo->frameBufPool[i].bufY >> 16) & 0xFF; + frameAddr[i][0][2] = + (pEncInfo->frameBufPool[i].bufY >> 8) & 0xFF; + frameAddr[i][0][3] = + (pEncInfo->frameBufPool[i].bufY >> 0) & 0xFF; + frameAddr[i][1][0] = + (pEncInfo->frameBufPool[i].bufCb >> 24) & 0xFF; + frameAddr[i][1][1] = + (pEncInfo->frameBufPool[i].bufCb >> 16) & 0xFF; + frameAddr[i][1][2] = + (pEncInfo->frameBufPool[i].bufCb >> 8) & 0xFF; + frameAddr[i][1][3] = + (pEncInfo->frameBufPool[i].bufCb >> 0) & 0xFF; + frameAddr[i][2][0] = + (pEncInfo->frameBufPool[i].bufCr >> 24) & 0xFF; + frameAddr[i][2][1] = + (pEncInfo->frameBufPool[i].bufCr >> 16) & 0xFF; + frameAddr[i][2][2] = + (pEncInfo->frameBufPool[i].bufCr >> 8) & 0xFF; + frameAddr[i][2][3] = + (pEncInfo->frameBufPool[i].bufCr >> 0) & 0xFF; + } + VpuWriteMem(pCodecInst->coreIdx, paraBuffer, (BYTE *)frameAddr, + sizeof(frameAddr), VDI_BIG_ENDIAN); + + if (pCodecInst->productId == PRODUCT_ID_980) { + for (i = 0; i < pEncInfo->numFrameBuffers; i++) { + frameAddr[i][0][0] = + (pEncInfo->frameBufPool[i].bufYBot >> 24) & + 0xFF; + frameAddr[i][0][1] = + (pEncInfo->frameBufPool[i].bufYBot >> 16) & + 0xFF; + frameAddr[i][0][2] = + (pEncInfo->frameBufPool[i].bufYBot >> 8) & 0xFF; + frameAddr[i][0][3] = + (pEncInfo->frameBufPool[i].bufYBot >> 0) & 0xFF; + frameAddr[i][1][0] = + (pEncInfo->frameBufPool[i].bufCbBot >> 24) & + 0xFF; + frameAddr[i][1][1] = + (pEncInfo->frameBufPool[i].bufCbBot >> 16) & + 0xFF; + frameAddr[i][1][2] = + (pEncInfo->frameBufPool[i].bufCbBot >> 8) & + 0xFF; + frameAddr[i][1][3] = + (pEncInfo->frameBufPool[i].bufCbBot >> 0) & + 0xFF; + frameAddr[i][2][0] = + (pEncInfo->frameBufPool[i].bufCrBot >> 24) & + 0xFF; + frameAddr[i][2][1] = + (pEncInfo->frameBufPool[i].bufCrBot >> 16) & + 0xFF; + frameAddr[i][2][2] = + (pEncInfo->frameBufPool[i].bufCrBot >> 8) & + 0xFF; + frameAddr[i][2][3] = + (pEncInfo->frameBufPool[i].bufCrBot >> 0) & + 0xFF; + } + VpuWriteMem(pCodecInst->coreIdx, paraBuffer + 384 + 128, + (BYTE *)frameAddr, sizeof(frameAddr), + VDI_BIG_ENDIAN); + } + + // Tell the codec how much frame buffers were allocated. + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_BUF_NUM, + pEncInfo->numFrameBuffers); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_BUF_STRIDE, stride); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_BIT_ADDR, + pEncInfo->secAxiInfo.u.coda9.bufBitUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_IPACDC_ADDR, + pEncInfo->secAxiInfo.u.coda9.bufIpAcDcUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_DBKY_ADDR, + pEncInfo->secAxiInfo.u.coda9.bufDbkYUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_DBKC_ADDR, + pEncInfo->secAxiInfo.u.coda9.bufDbkCUse); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_AXI_OVL_ADDR, + pEncInfo->secAxiInfo.u.coda9.bufOvlUse); + + if (pAttr->framebufferCacheType == FramebufCacheMaverickII) { + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_CACHE_CONFIG, + pEncInfo->cacheConfig.type2.CacheMode); + } else if (pAttr->framebufferCacheType == FramebufCacheMaverickI) { + // Maverick Cache Configuration + val = (pEncInfo->cacheConfig.type1.luma.cfg.PageSizeX << 28) | + (pEncInfo->cacheConfig.type1.luma.cfg.PageSizeY << 24) | + (pEncInfo->cacheConfig.type1.luma.cfg.CacheSizeX << 20) | + (pEncInfo->cacheConfig.type1.luma.cfg.CacheSizeY << 16) | + (pEncInfo->cacheConfig.type1.chroma.cfg.PageSizeX << 12) | + (pEncInfo->cacheConfig.type1.chroma.cfg.PageSizeY << 8) | + (pEncInfo->cacheConfig.type1.chroma.cfg.CacheSizeX << 4) | + (pEncInfo->cacheConfig.type1.chroma.cfg.CacheSizeY << 0); + + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_CACHE_SIZE, val); + + val = (pEncInfo->cacheConfig.type1.Bypass << 4) | + (pEncInfo->cacheConfig.type1.DualConf << 2) | + (pEncInfo->cacheConfig.type1.PageMerge << 0); + val = val << 24; + val |= (pEncInfo->cacheConfig.type1.luma.cfg.BufferSize << 16) | + (pEncInfo->cacheConfig.type1.chroma.cfg.BufferSize + << 8) | + (pEncInfo->cacheConfig.type1.chroma.cfg.BufferSize << 8); + + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_CACHE_CONFIG, + val); + } + +#ifdef REDUNDENT_CODE + num = pEncInfo->numFrameBuffers; + if (pCodecInst->productId == PRODUCT_ID_960) { + Uint32 subsampleLumaSize = stride * height; + Uint32 subsampleChromaSize = + (stride * height) >> 2; // FORMAT_420 + vpu_buffer_t vbBuf; + FrameBuffer *pFb; + + vbBuf.size = subsampleLumaSize + 2 * subsampleChromaSize; + vbBuf.phys_addr = (PhysicalAddress)0; + if (VDI_ALLOCATE_MEMORY(pCodecInst->coreIdx, &vbBuf, 0) < 0) { + pEncInfo->vbSubSampFrame.size = 0; + pEncInfo->vbSubSampFrame.phys_addr = 0; + return RETCODE_INSUFFICIENT_RESOURCE; + } + pFb = &pEncInfo->frameBufPool[num]; + pFb->bufY = vbBuf.phys_addr; + pFb->bufCb = (PhysicalAddress)-1; + pFb->bufCr = (PhysicalAddress)-1; + pFb->updateFbInfo = TRUE; + ret = AllocateLinearFrameBuffer(LINEAR_FRAME_MAP, pFb, 1, + subsampleLumaSize, + subsampleChromaSize); + if (ret != RETCODE_SUCCESS) { + pEncInfo->vbSubSampFrame.size = 0; + pEncInfo->vbSubSampFrame.phys_addr = 0; + return RETCODE_INSUFFICIENT_RESOURCE; + } + pEncInfo->vbSubSampFrame = vbBuf; + num++; + + // Set Sub-Sampling buffer for ME-Reference and + // DBK-Reconstruction BPU will swap below two buffer internally + // every pic by pic + val = GetXY2AXIAddr(&pEncInfo->mapCfg, 0, 0, 0, stride, pFb); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_SUBSAMP_A, val); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_SUBSAMP_B, + val + ((stride * height) >> 1)); + + if (pCodecInst->codecMode == AVC_ENC && + pCodecInst->codecModeAux == AVC_AUX_MVC) { + vbBuf.size = + subsampleLumaSize + 2 * subsampleChromaSize; + vbBuf.phys_addr = (PhysicalAddress)0; + if (VDI_ALLOCATE_MEMORY(pCodecInst->coreIdx, &vbBuf, + 0) < 0) { + pEncInfo->vbSubSampFrame.size = 0; + pEncInfo->vbSubSampFrame.phys_addr = 0; + return RETCODE_INSUFFICIENT_RESOURCE; + } + pFb = &pEncInfo->frameBufPool[num]; + pFb->bufY = vbBuf.phys_addr; + pFb->bufCb = (PhysicalAddress)-1; + pFb->bufCr = (PhysicalAddress)-1; + pFb->updateFbInfo = TRUE; + ret = AllocateLinearFrameBuffer(LINEAR_FRAME_MAP, pFb, + 1, subsampleLumaSize, + subsampleChromaSize); + if (ret != RETCODE_SUCCESS) { + pEncInfo->vbMvcSubSampFrame.size = 0; + pEncInfo->vbMvcSubSampFrame.phys_addr = 0; + return RETCODE_INSUFFICIENT_RESOURCE; + } + pEncInfo->vbMvcSubSampFrame = vbBuf; + + val = GetXY2AXIAddr(&pEncInfo->mapCfg, 0, 0, 0, stride, + pFb); + VpuWriteReg(pCodecInst->coreIdx, + CMD_SET_FRAME_SUBSAMP_A_MVC, val); + VpuWriteReg(pCodecInst->coreIdx, + CMD_SET_FRAME_SUBSAMP_B_MVC, + val + ((stride * height) >> 1)); + } + } + + if (pCodecInst->codecMode == MP4_ENC) { + // MPEG4 Encoder Data-Partitioned bitstream temporal buffer + pEncInfo->vbScratch.size = SIZE_MP4ENC_DATA_PARTITION; + if (VDI_ALLOCATE_MEMORY(pCodecInst->coreIdx, + &pEncInfo->vbScratch, 0) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_DP_BUF_BASE, + pEncInfo->vbScratch.phys_addr); + VpuWriteReg(pCodecInst->coreIdx, CMD_SET_FRAME_DP_BUF_SIZE, + pEncInfo->vbScratch.size >> 10); + } +#endif + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, SET_FRAME_BUF); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, SET_FRAME_BUF, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, SET_FRAME_BUF, 0); +#endif + + if (VpuReadReg(pCodecInst->coreIdx, RET_SET_FRAME_SUCCESS) & + (1UL << 31)) { + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + + return RETCODE_SUCCESS; +} + +static RetCode Coda9PicTypeEntropyCoding(CodecInst *pCodecInst, EncInfo *pEncInfo) +{ + int pic_idx; + int gop_num; + int slice_type; // 0 = Intra, 1 =inter + + Coda9VpuEncGetPicInfo(pEncInfo, &pic_idx, + &gop_num, &slice_type); + + CVI_VC_CFG("slice_type = %d\n", slice_type); + + if (pEncInfo->openParam.EncStdParam.avcParam + .mvcExtension) { + if (pEncInfo->openParam.EncStdParam + .avcParam.interviewEn) { + if (slice_type == 0 && + (pic_idx % 2) == 0) { + // change_enable. pps_id, entropy_coding_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_ENABLE, + (1 << 11) + + (1 + << 7)); + + // pps-id + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 0); + + // cabac_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 0); + } else if (slice_type != 0 && + (pic_idx % 2) == 0) { + // change_enable. pps_id, entropy_coding_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_ENABLE, + (1 << 11) + + (1 + << 7)); + // pps-id + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 1); + // cabac_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 1); + } + + else //(slice_type==0 && + //pic_idx%2 !=0) + { + // change_enable. pps_id, entropy_coding_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_ENABLE, + (1 << 11) + + (1 + << 7)); + // pps-id + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 1); + // cabac_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 3); + } + } else { + if (slice_type == 0 && + (pic_idx % 2) == 0) { + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_ENABLE, + 0x880); // change_enable. + // pps_id, + // entropy_coding_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 0); // pps-id + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 0); // cabac_mode + } + + else if (slice_type != 0 && + (pic_idx % 2) == 0) { + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_ENABLE, + 0x880); // change_enable. + // pps_id, + // entropy_coding_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 1); // pps-id + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 1); // cabac_mode + } + + else if (slice_type == 0 && + (pic_idx % 2) != 0) { + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_ENABLE, + 0x880); // change_enable. + // pps_id, + // entropy_coding_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 0); // pps-id + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 2); // cabac_mode + } + + else // if(slice_type!=0 && + // pic_idx%2 !=0) + { + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_ENABLE, + 0x880); // change_enable. + // pps_id, + // entropy_coding_mode + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 1); // pps-id + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 3); // cabac_mode + } + } + } else { + // change_enable. + // ppsId, + // entropyCodingMode + // default set by I (ID=0, mode=0) + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PARAM_CHANGE_ENABLE, + 0x880); + + VpuWriteReg( + pCodecInst->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 0); + + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 0); + + // only first I + if (gop_num == 0) { + if (slice_type != 0) { + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 1); + + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 1); + } + } else if (gop_num != 1) { + // not All I + if (slice_type != 0) { + // (encoded_frames_in_gop > 0) + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_CABAC_MODE, + 1); + VpuWriteReg( + pCodecInst + ->coreIdx, + CMD_ENC_PARAM_CHANGE_PPS_ID, + 1); + } + } + } + + CVI_VC_CFG("gop_num = %d, slice_type = %d\n", + gop_num, slice_type); + + Coda9BitIssueCommand(pCodecInst->coreIdx, + pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, + __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, + RC_CHANGE_PARAMETER, 0); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, + RC_CHANGE_PARAMETER, 0); +#endif + + return RETCODE_SUCCESS; +} + +RetCode Coda9VpuEncode(CodecInst *pCodecInst, EncParam *param) +{ + EncInfo *pEncInfo; + FrameBuffer *pSrcFrame; + Uint32 rotMirMode; + Uint32 val; + vpu_instance_pool_t *vip; + int outQp = 0; + int target_pic_bit = 0; + int hrd_buf_level = 0; + int hrd_buf_size = 0; +#ifdef CLIP_PIC_DELTA_QP + int row_max_dqp_minus = 0; + int row_max_dqp_plus = 0; +#endif + int ret; + + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(pCodecInst->coreIdx); + if (!vip) { + return RETCODE_INVALID_HANDLE; + } + + pSrcFrame = param->sourceFrame; + rotMirMode = 0; + if (pEncInfo->rotationEnable == TRUE) { + + switch (pEncInfo->rotationAngle) { + case 0: + rotMirMode |= 0x0; + break; + case 90: + rotMirMode |= 0x1; + break; + case 180: + rotMirMode |= 0x2; + break; + case 270: + rotMirMode |= 0x3; + break; + } + } + + if (pEncInfo->mirrorEnable == TRUE) { + + switch (pEncInfo->mirrorDirection) { + case MIRDIR_NONE: + rotMirMode |= 0x0; + break; + case MIRDIR_VER: + rotMirMode |= 0x4; + break; + case MIRDIR_HOR: + rotMirMode |= 0x8; + break; + case MIRDIR_HOR_VER: + rotMirMode |= 0xc; + break; + } + } + + //==================================== + // @ Step 1 : + // Get Qp for non-roi region + //==================================== + ret = Coda9VpuEncCalcPicQp(pCodecInst, param, &row_max_dqp_minus, + &row_max_dqp_plus, &outQp, &target_pic_bit, + &hrd_buf_level, &hrd_buf_size); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("ret = %d\n", ret); + return ret; + } + + if (pCodecInst->productId == PRODUCT_ID_980) { + rotMirMode |= ((pSrcFrame->endian & 0x03) << 16); + rotMirMode |= ((pSrcFrame->cbcrInterleave & 0x01) << 18); + rotMirMode |= ((pSrcFrame->sourceLBurstEn & 0x01) << 4); + } +#ifdef REDUNDENT_CODE + else { + rotMirMode |= ((pSrcFrame->sourceLBurstEn & 0x01) << 4); + rotMirMode |= ((pSrcFrame->cbcrInterleave & 0x01) << 18); + rotMirMode |= pEncInfo->openParam.nv21 << 21; + } +#endif + +#ifdef PLATFORM_NON_OS + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_ROT_MODE, rotMirMode); +#endif + if (pCodecInst->productId == PRODUCT_ID_980 && + pCodecInst->codecMode == AVC_ENC) { + if (pCodecInst->cviApiMode != API_MODE_DRIVER) + cviSetCodaRoiBySdk(param, &pEncInfo->openParam, outQp); + + // ROI command + if (param->coda9RoiEnable) { +#ifdef ROI_MB_RC + int roi_number = param->setROI.number; + int i; + int data = 0; + int qp = 0; + + VpuWriteReg( + pCodecInst->coreIdx, CMD_ENC_ROI_INFO, + param->nonRoiQp << 7 | + param->coda9RoiPicAvgQp << 1 | + param->coda9RoiEnable); // currently, + // only mode + // 0 can be + // supported + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_ROI_NUM, + param->setROI.number); + + for (i = 0; i < MAX_CODA980_ROI_NUMBER; i++) { + VpuRect *rect = ¶m->setROI.region[i]; + + /* + if (pEncInfo->openParam.EncStdParam.avcParam.fieldFlag) + data = ((((rect->bottom+1)/2)&0xff)<<24)| + ((((rect->top+1)/2)&0xff)<<16) | ((((rect->right+1)/2)&0xff)<<8) + | (((rect->left+1)/2)&0xff); else*/ + if (i < roi_number) { + data = (((rect->bottom) & 0xff) << 24) | + (((rect->top) & 0xff) << 16) | + (((rect->right) & 0xff) << 8) | + ((rect->left) & 0xff); + qp = param->setROI.qp[i]; + } + //=============================================== + // @ Step 2 : + if (i != 7) + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_ROI_POS_0 + i * 8, + data); + else + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_ROI_POS_7, data); + // generate roi qp for each region by using + // roi_delta_qp/roi_level and picQp (roi qp = + // picQp - (roi_delta_qp*roi_level) + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_ROI_QP_0 + i * 8, qp); + //=============================================== + } + +#else + VpuWriteReg( + pCodecInst->coreIdx, CMD_ENC_ROI_INFO, + param->coda9RoiPicAvgQp << 1 | + param->coda9RoiEnable); // currently, + // only mode + // 0 can be + // supported + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_ROI_QP_MAP_ADDR, + param->roiQpMapAddr); +#endif + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + ENC_ROI_INIT); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, + __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, + ENC_ROI_INIT, 0); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENC_ROI_INIT, 0); +#endif + if (!VpuReadReg(pCodecInst->coreIdx, + RET_ENC_ROI_SUCCESS)) { + return RETCODE_FAILURE; + } + } // if (param->coda9RoiEnable) + + { + int ActivePPSIdx = pEncInfo->ActivePPSIdx; + AvcPpsParam *ActvePPS = + &pEncInfo->openParam.EncStdParam.avcParam + .ppsParam[ActivePPSIdx]; + if (pEncInfo->frameIdx == 0) + pEncInfo->encoded_frames_in_gop = 0; + + CVI_VC_TRACE("ActivePPSIdx = %d, frameIdx = %d, encoded_frames_in_gop = %d\n", + ActivePPSIdx, pEncInfo->frameIdx, + pEncInfo->encoded_frames_in_gop); + + if (ActvePPS->entropyCodingMode == 2) { + ret = Coda9PicTypeEntropyCoding(pCodecInst, pEncInfo); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("Coda9PicTypeEntropyCoding = %d\n", ret); + return ret; + } + } else { + int pic_idx; + int gop_num; + int slice_type; // 0 = Intra, 1 =inter + + Coda9VpuEncGetPicInfo(pEncInfo, &pic_idx, + &gop_num, &slice_type); + } + } + } + +#ifdef SUPPORT_980_ROI_RC_LIB + if (pCodecInst->productId == PRODUCT_ID_980 && + pCodecInst->codecMode == AVC_ENC && + pCodecInst->codecModeAux == AVC_AUX_SVC) { + pEncInfo->is_skip_picture = param->skipPicture; + + // Write register + // Slice Header info + { + int long_term_ref_flag = (pEncInfo->ref_pic_list == + pEncInfo->longterm_frmidx); + int diff = + pEncInfo->frm[pEncInfo->ref_pic_list].frame_num - + pEncInfo->curr_frm->frame_num; + int diff_sign = (diff > 0) ? 1 : 0; + int abs_diff = (abs(diff) - 1) & + ((1 << 4) - 1); // LOG2_MAX_FRM_NUM + // 4 + int longterm_frmidx_flag = + (pEncInfo->longterm_frmidx == -1) ? 1 : 0; + int curr_poc = + pEncInfo->curr_frm->poc & ((1 << 16) - 1); + int data; + + data = (pEncInfo->curr_frm->frame_num << 24 | + pEncInfo->temporal_id << 21 | + pEncInfo->prev_idx << 18 | + pEncInfo->ref_pic_list << 15 | + longterm_frmidx_flag << 14 | + pEncInfo->curr_long_term << 13 | + diff_sign << 12 | abs_diff << 8 | + long_term_ref_flag << 7 | + pEncInfo->nal_ref_idc << 5); + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_DPB_INFO, + data); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_POC, + curr_poc); + } + } +#endif + +#ifdef REDUNDENT_CODE + if (pCodecInst->productId == PRODUCT_ID_960) { + if (pEncInfo->mapType > LINEAR_FRAME_MAP && + pEncInfo->mapType <= TILED_MIXED_V_MAP) { + SetTiledFrameBase(pCodecInst->coreIdx, + pEncInfo->vbFrame.phys_addr); + } else { + SetTiledFrameBase(pCodecInst->coreIdx, 0); + } + } +#endif + if (pEncInfo->mapType != LINEAR_FRAME_MAP && + pEncInfo->mapType != LINEAR_FIELD_MAP) { + if (pEncInfo->stride > pEncInfo->frameBufferHeight) + val = SetTiledMapType( + pCodecInst->coreIdx, &pEncInfo->mapCfg, + pEncInfo->mapType, pEncInfo->stride, + pEncInfo->openParam.cbcrInterleave, + &pEncInfo->dramCfg); + else + val = SetTiledMapType( + pCodecInst->coreIdx, &pEncInfo->mapCfg, + pEncInfo->mapType, pEncInfo->frameBufferHeight, + pEncInfo->openParam.cbcrInterleave, + &pEncInfo->dramCfg); + } else { + val = SetTiledMapType(pCodecInst->coreIdx, &pEncInfo->mapCfg, + pEncInfo->mapType, pEncInfo->stride, + pEncInfo->openParam.cbcrInterleave, + &pEncInfo->dramCfg); + } + + CVI_VC_TRACE("mapType = %d, stride = %d, cbcrInterleave = %d\n", + pEncInfo->mapType, pEncInfo->stride, + pEncInfo->openParam.cbcrInterleave); + + if (val == 0) { + return RETCODE_INVALID_PARAM; + } + +#ifndef PLATFORM_NON_OS + rotMirMode |= pEncInfo->openParam.nv21 << 21; + rotMirMode |= (1 << 4); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_ROT_MODE, rotMirMode); + +#endif + + //======================================================================= + // @ Step 3 : + // set Qp for non-roi region or Qp for picture. + //======================================================================= + if (pCodecInst->productId == PRODUCT_ID_980 && + pCodecInst->codecMode == AVC_ENC) { + CVI_VC_TRACE("outQp = %d, hrd_buf_level = %d, hrd_buf_size = %d\n", + outQp, hrd_buf_level, hrd_buf_size); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_QS, outQp); + + } else + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_QS, + param->quantParam); + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_TARGET_BIT, + target_pic_bit); + +#ifdef ROI_MB_RC + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_RC_BUF_LEVEL, + hrd_buf_level); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_RC_BUF_SIZE, hrd_buf_size); + + CVI_FUNC_COND(CVI_MASK_CFG, + fprintf(fpCfg, "hrd_buf_level = %d, hrd_buf_size = %d\n", + hrd_buf_level, hrd_buf_size)); + +#ifdef AUTO_FRM_SKIP_DROP + pEncInfo->frm_rc.rc_pic.frame_skip |= param->skipPicture; +#ifdef CLIP_PIC_DELTA_QP + if (param->coda9RoiEnable) { + row_max_dqp_plus = pEncInfo->openParam.roi_max_delta_qp_plus; + row_max_dqp_minus = pEncInfo->openParam.roi_max_delta_qp_minus; + } + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_RC_QP, + (row_max_dqp_minus << 26) | (row_max_dqp_plus << 20) | + (pEncInfo->frm_rc.rc_pic.frame_drop << 19) | + (pEncInfo->frm_rc.rc_pic.frame_skip << 18) | + (outQp << 12) | + (pEncInfo->openParam.roi_max_delta_qp_plus << 6) | + pEncInfo->openParam.roi_max_delta_qp_minus); +#else + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_RC_QP, + (pEncInfo->frm_rc.rc_pic.frame_drop << 19) | + (pEncInfo->frm_rc.rc_pic.frame_skip << 18) | + (outQp << 12) | + (pEncInfo->openParam.roi_max_delta_qp_plus << 6) | + pEncInfo->openParam.roi_max_delta_qp_minus); +#endif + +#else +#ifdef CLIP_PIC_DELTA_QP + if (param->coda9RoiEnable) { + row_max_dqp_plus = pEncInfo->openParam.roi_max_delta_qp_plus; + row_max_dqp_minus = pEncInfo->openParam.roi_max_delta_qp_minus; + } + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_RC_QP, + (row_max_dqp_minus << 26) | (row_max_dqp_plus << 20) | + 0 << 18 | (outQp << 12) | + (pEncInfo->openParam.roi_max_delta_qp_plus << 6) | + pEncInfo->openParam.roi_max_delta_qp_minus); +#else + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_RC_QP, + 0 << 18 | (outQp << 12) | + (pEncInfo->openParam.roi_max_delta_qp_plus << 6) | + pEncInfo->openParam.roi_max_delta_qp_minus); +#endif +#endif +#else + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_QP, outQp); +#endif + + if (param->skipPicture) { + if (param->fieldRun) { // not support field + skipPicture + return RETCODE_INVALID_PARAM; + } + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_OPTION, + (param->fieldRun << 8) | 1); + } else { + // Registering Source Frame Buffer information + // Hide GDI IF under FW level + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_SRC_INDEX, + pSrcFrame->myIndex); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_SRC_STRIDE, + pSrcFrame->stride); + + if (pEncInfo->openParam.cbcrOrder == CBCR_ORDER_NORMAL) { + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_SRC_ADDR_Y, + pSrcFrame->bufY); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_ADDR_CB, pSrcFrame->bufCb); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_ADDR_CR, pSrcFrame->bufCr); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_BOTTOM_Y, + pSrcFrame->bufYBot); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_BOTTOM_CB, + pSrcFrame->bufCbBot); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_BOTTOM_CR, + pSrcFrame->bufCrBot); + } else { // CBCR_ORDER_REVERSED (YV12) + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_SRC_ADDR_Y, + pSrcFrame->bufY); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_ADDR_CB, pSrcFrame->bufCr); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_ADDR_CR, pSrcFrame->bufCb); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_BOTTOM_Y, + pSrcFrame->bufYBot); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_BOTTOM_CB, + pSrcFrame->bufCrBot); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_PIC_SRC_BOTTOM_CR, + pSrcFrame->bufCbBot); + } + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_OPTION, + (param->fieldRun << 8) | + (param->forceIPicture << 1 & 0x2)); + } + + CVI_VC_INFO("CMD_ENC_PIC_OPTION = 0x%X\n", + VpuReadReg(pCodecInst->coreIdx, CMD_ENC_PIC_OPTION)); + + if (pEncInfo->ringBufferEnable == 0) { + SetEncBitStreamInfo(pCodecInst, NULL, param); + } + + val = 0; + val = ((pEncInfo->secAxiInfo.u.coda9.useBitEnable & 0x01) << 0 | + (pEncInfo->secAxiInfo.u.coda9.useIpEnable & 0x01) << 1 | + (pEncInfo->secAxiInfo.u.coda9.useDbkYEnable & 0x01) << 2 | + (pEncInfo->secAxiInfo.u.coda9.useDbkCEnable & 0x01) << 3 | + (pEncInfo->secAxiInfo.u.coda9.useOvlEnable & 0x01) << 4 | + (pEncInfo->secAxiInfo.u.coda9.useBtpEnable & 0x01) << 5 | + (pEncInfo->secAxiInfo.u.coda9.useBitEnable & 0x01) << 8 | + (pEncInfo->secAxiInfo.u.coda9.useIpEnable & 0x01) << 9 | + (pEncInfo->secAxiInfo.u.coda9.useDbkYEnable & 0x01) << 10 | + (pEncInfo->secAxiInfo.u.coda9.useDbkCEnable & 0x01) << 11 | + (pEncInfo->secAxiInfo.u.coda9.useOvlEnable & 0x01) << 12 | + (pEncInfo->secAxiInfo.u.coda9.useBtpEnable & 0x01) << 13); + + VpuWriteReg(pCodecInst->coreIdx, BIT_AXI_SRAM_USE, val); + + CVI_VC_TRACE("streamRdPtr = 0x%llX, streamWtPtr = 0x%llX\n", + pEncInfo->streamRdPtr, pEncInfo->streamWrPtr); + CVI_VC_TRACE("streamEndflag = %d\n", pEncInfo->streamEndflag); + + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr, + pEncInfo->streamWrPtr); + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamRdPtrRegAddr, + pEncInfo->streamRdPtr); + VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_PARAM, + pEncInfo->streamEndflag); + + SetEncFrameMemInfo(pCodecInst); + + val = 0; + if (pEncInfo->ringBufferEnable == 0) { + if (pEncInfo->lineBufIntEn) + val |= (0x1 << 6); +#ifndef PLATFORM_NON_OS + val |= (0x1 << 5); + val |= (0x1 << 4); +#endif + } else { + val |= (0x1 << 3); + } + val |= pEncInfo->openParam.streamEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_CTRL, val); + + if (pCodecInst->productId == PRODUCT_ID_980) + VpuWriteReg(pCodecInst->coreIdx, BIT_ME_LINEBUFFER_MODE, + VPU_ME_LINEBUFFER_MODE); // default + CVI_VC_FLOW("PIC_RUN\n"); +#ifdef DBG_CNM + printf_gdi_info(pCodecInst->coreIdx, 32); +#endif + + pCodecInst->u64StartTime = cviGetCurrentTime(); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, PIC_RUN); + + return RETCODE_SUCCESS; +} + +static int Coda9VpuEncCalcPicQp(CodecInst *pCodecInst, EncParam *param, + int *pRowMaxDqpMinus, int *pRowMaxDqpPlus, + int *pOutQp, int *pTargetPicBit, + int *pHrdBufLevel, int *pHrdBufSize) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + stRcInfo *pRcInfo = &pCodecInst->rcInfo; + int ret = RETCODE_SUCCESS; + + if (pCodecInst->productId == PRODUCT_ID_980 && + pCodecInst->codecMode == AVC_ENC) { + if (pEncInfo->openParam.rcEnable == 4) { + if (pEncInfo->cviRcEn || pRcInfo->rcMode == RC_MODE_UBR) { + *pOutQp = param->u32FrameQp; + *pRowMaxDqpMinus = param->u32FrameQp; + *pRowMaxDqpPlus = 51 - param->u32FrameQp; + *pTargetPicBit = param->u32FrameBits; + *pHrdBufSize = pRcInfo->targetBitrate * + pEncInfo->openParam.rcInitDelay; + + if (param->s32HrdBufLevel <= 0) + *pHrdBufLevel = 0; + else + *pHrdBufLevel = param->s32HrdBufLevel; + + CVI_VC_UBR( + "u32FrameBits = %d, u32FrameQp = %d, s32HrdBufLevel = %d\n", + param->u32FrameBits, param->u32FrameQp, + param->s32HrdBufLevel); + } else { + ret = rcLibCalcPicQp(pCodecInst, + pRowMaxDqpMinus, + pRowMaxDqpPlus, pOutQp, + pTargetPicBit, + pHrdBufLevel, pHrdBufSize); + if (ret != RETCODE_SUCCESS) { + CVI_VC_INFO("ret = %d\n", ret); + return ret; + } + } + } else { + *pOutQp = param->quantParam; + } + } else { + *pOutQp = param->quantParam; + } + + return RETCODE_SUCCESS; +} + +int rcLibCalcPicQp(CodecInst *pCodecInst, int *pRowMaxDqpMinus, + int *pRowMaxDqpPlus, int *pOutQp, int *pTargetPicBit, + int *pHrdBufLevel, int *pHrdBufSize) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + stRcInfo *pRcInfo = &pCodecInst->rcInfo; + + // outQp will be returned a QP for non-roi region when rc + // mode==4 && roi enabled. outQp will be returned a QP for one + // picture when rc mode==4 && roi disabled. + int min_qp; + int max_qp; + int pic_idx; + int gop_num; + int slice_type; // 0 = Intra, 1 =inter + + Coda9VpuEncGetPicInfo(pEncInfo, &pic_idx, &gop_num, &slice_type); + + min_qp = slice_type == 0 ? pRcInfo->picIMinQp : pRcInfo->picPMinQp; + max_qp = slice_type == 0 ? pRcInfo->picIMaxQp : pRcInfo->picPMaxQp; + + CVI_VC_RC("frameIdx = %d, maxIPicBit = %d\n", pEncInfo->frameIdx, + pRcInfo->maxIPicBit); + CVI_VC_RC( + "slice_type = %d, min_qp = %d, max_qp = %d, targetBitrate = %d\n", + slice_type, min_qp, max_qp, pRcInfo->targetBitrate); + CVI_VC_RC("curr_long_term = %d\n", pEncInfo->curr_long_term); + + CVI_FUNC_COND(CVI_MASK_RQ, frm_rc_print(&pEncInfo->frm_rc)); + +#ifdef AUTO_FRM_SKIP_DROP + // picture qp adjustment + if ((pRcInfo->isReEncodeIdr) || + (slice_type == 0 && pEncInfo->frameIdx > 0)) { + int constrain_min_i_qp = -1; + + CVI_VC_RC("isReEncodeIdr = %d, rcGopIQpOffset = %d\n", + pRcInfo->isReEncodeIdr, + pEncInfo->openParam.rcGopIQpOffset); + + *pOutQp -= pEncInfo->openParam.rcGopIQpOffset; + if (pRcInfo->maxIPicBit > 0) { + *pTargetPicBit = + MIN(*pTargetPicBit, pRcInfo->maxIPicBit); + + if (pRcInfo->isReEncodeIdr) { + *pTargetPicBit = + MIN(*pTargetPicBit, + pRcInfo->s32SuperFrmBitsThr); + } + + CVI_VC_RC( + "maxIPicBit = %d, constrain_min_i_qp = %d, outQp = %d\n", + pRcInfo->maxIPicBit, constrain_min_i_qp, + *pOutQp); + } + + if (constrain_min_i_qp > *pOutQp) { + int weight = CLIP3(1, 4, pEncInfo->frameIdx / gop_num); + *pOutQp = ((weight * constrain_min_i_qp) + + ((4 - weight) * (*pOutQp))) >> + 2; + } + } else if (slice_type == 1 && pEncInfo->ref_long_term == 1) { + // virtual I frame + *pOutQp -= pEncInfo->openParam.LongTermDeltaQp; + } else if (pRcInfo->rcMode == RC_MODE_VBR && + pRcInfo->rcState == STEADY) { + // picture Qp clipping for VBR + if (slice_type == 1) { + *pOutQp = CLIP3(pRcInfo->lastPicQp - 1, + pRcInfo->lastPicQp + 1, *pOutQp); + } + pRcInfo->lastPicQp = *pOutQp; + } + + if (pRcInfo->rcMode == RC_MODE_AVBR) { + // weird workaround here. Appoligized.. + pRcInfo->lastPicQp = *pOutQp; + } + + cviPrintFrmRc(&pEncInfo->frm_rc); + CVI_VC_RC("slice_type = %d, min_qp = %d, max_qp = %d\n", slice_type, + min_qp, max_qp); + CVI_VC_RC("row_max_dqp_minus = %d, curr_long_term = %d\n", + *pRowMaxDqpMinus, pEncInfo->curr_long_term); + CVI_VC_RC( + "outQp = %d, TargetPicBit = %d, HrdBufLevel = %d, HrdBufSize = %d\n", + *pOutQp, *pTargetPicBit, *pHrdBufLevel, *pHrdBufSize); + + if (pEncInfo->frm_rc.rc_pic.frame_drop) { + CVI_VC_INFO("RETCODE_FRAME_DROP\n"); + return RETCODE_FRAME_DROP; + } +#else +#endif + + return RETCODE_SUCCESS; +} + +static void Coda9VpuEncGetPicInfo(EncInfo *pEncInfo, int *p_pic_idx, + int *p_gop_num, int *p_slice_type) +{ + int pic_idx; + int gop_num; + int encoded_frames; + int slice_type; // 0 = Intra, 1 =inter + int is_all_i = (pEncInfo->openParam.gopSize == 1); + + int mvc_second_view; + + pic_idx = pEncInfo->openParam.EncStdParam.avcParam.fieldFlag ? + 2 * pEncInfo->frameIdx + pEncInfo->fieldDone : + pEncInfo->frameIdx; + gop_num = pEncInfo->openParam.EncStdParam.avcParam.fieldFlag ? + 2 * pEncInfo->openParam.gopSize : + pEncInfo->openParam.gopSize; + encoded_frames = pEncInfo->openParam.EncStdParam.avcParam.fieldFlag ? + 2 * pEncInfo->encoded_frames_in_gop + + pEncInfo->fieldDone : + pEncInfo->encoded_frames_in_gop; + + mvc_second_view = + pEncInfo->openParam.EncStdParam.avcParam.mvcExtension && + (!pEncInfo->openParam.EncStdParam.avcParam.interviewEn); + + if (pEncInfo->openParam.EncStdParam.avcParam.mvcExtension) + gop_num *= 2; + + UNREFERENCED_PARAMETER(mvc_second_view); + + CVI_VC_RC( + "gop_num = %d, encoded_frames = %d, encoded_frames_in_gop = %d\n", + gop_num, encoded_frames, pEncInfo->encoded_frames_in_gop); + + if (gop_num == 0) { + // Only first I + if (pic_idx == 0 || (pic_idx == 1 && mvc_second_view == 1)) + slice_type = 0; + else + slice_type = 1; + } else if (is_all_i) { + // All I + encoded_frames = 0; + pEncInfo->encoded_frames_in_gop = 0; + slice_type = 0; + } else { + if (encoded_frames >= gop_num) { + // I frame + encoded_frames = 0; + pEncInfo->encoded_frames_in_gop = 0; + } + if (encoded_frames == 0 || + (encoded_frames == 1 && mvc_second_view == 1)) + slice_type = 0; + else // P frame + slice_type = 1; + } + + *p_pic_idx = pic_idx; + *p_gop_num = gop_num; + *p_slice_type = slice_type; +} + +static void cviPrintFrmRc(frm_rc_t *pFrmRc) +{ + CVI_VC_RC( + "num_pixel_in_pic = %d, mb_width = %d, mb_height = %d, gop_size = %d\n", + pFrmRc->rc_pic.num_pixel_in_pic, pFrmRc->rc_pic.mb_width, + pFrmRc->rc_pic.mb_height, pFrmRc->rc_pic.gop_size); + CVI_VC_RC("intra_period = %d, bit_alloc_mode = %d, mode = %d\n", + pFrmRc->rc_pic.intra_period, pFrmRc->rc_pic.bit_alloc_mode, + pFrmRc->rc_pic.mode); + CVI_VC_RC(" avg_pic_bit = %d, xmit_pic_bit = %d\n", + pFrmRc->rc_pic.avg_pic_bit, pFrmRc->rc_pic.xmit_pic_bit); +} + +RetCode Coda9VpuEncGetResult(CodecInst *pCodecInst, EncOutputInfo *info) +{ + stRcInfo *pRcInfo = &pCodecInst->rcInfo; + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + PhysicalAddress rdPtr; + PhysicalAddress wrPtr; + Uint32 pic_enc_result; + +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, PIC_RUN, 0); +#endif + + pic_enc_result = VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_SUCCESS); + if (pic_enc_result & (1UL << 31)) { + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + +#ifdef REPORT_PIC_SUM_VAR + info->picVariance = + VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_SUM_VAR); + CVI_VC_RC("sumPicVar = %d\n", info->picVariance); +#endif + +#ifdef AUTO_FRM_SKIP_DROP + if (pCodecInst->productId == PRODUCT_ID_980 && + pCodecInst->codecMode == AVC_ENC && + pEncInfo->openParam.rcEnable == 4) { + if (pEncInfo->frm_rc.rc_pic.frame_drop) { + if (pRcInfo->rcMode != RC_MODE_UBR || + pRcInfo->bTestUbrEn) + rcLibUpdateRc(pCodecInst, info, 0, 0); + else { + CVI_VC_WARN("UBR should not drop frames\n"); + } + return RETCODE_SUCCESS; + } + info->picDropped = 0; + } +#endif + if (pCodecInst->productId == PRODUCT_ID_980) { + if (pic_enc_result & 2) { // top field coding done + if (!pEncInfo->fieldDone) + pEncInfo->fieldDone = 1; + } else { + pEncInfo->frameIdx = VpuReadReg(pCodecInst->coreIdx, + RET_ENC_PIC_FRAME_NUM); + info->encPicCnt = pEncInfo->frameIdx; + pEncInfo->fieldDone = 0; + } + } + + info->picType = VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_TYPE); + + if (pEncInfo->ringBufferEnable == 0) { + rdPtr = VpuReadReg(pCodecInst->coreIdx, + pEncInfo->streamRdPtrRegAddr); + wrPtr = VpuReadReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr); + info->bitstreamBuffer = rdPtr; + info->bitstreamSize = wrPtr - rdPtr; + CVI_VC_TRACE("rdPtr = 0x%llX, wrPtr = 0x%llX, size = 0x%X\n", + rdPtr, wrPtr, info->bitstreamSize); + } + + info->numOfSlices = + VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_SLICE_NUM); + info->bitstreamWrapAround = + VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_FLAG); + info->reconFrameIndex = + VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_FRAME_IDX); + if (info->reconFrameIndex < MAX_REG_FRAME) { + info->reconFrame = + pEncInfo->frameBufPool[info->reconFrameIndex]; + } + info->encSrcIdx = info->reconFrameIndex; + + pEncInfo->streamWrPtr = vdi_remap_memory_address( + pCodecInst->coreIdx, + VpuReadReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr)); + pEncInfo->streamEndflag = + VpuReadReg(pCodecInst->coreIdx, BIT_BIT_STREAM_PARAM); + +#ifdef SUPPORT_PIC_INFO_REPORT + info->u32SumQp = VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_SUM_QP); + info->u32MeanQp = + info->u32SumQp * 256 / (pEncInfo->openParam.picWidth * + pEncInfo->openParam.picHeight); + CVI_VC_TRACE("u32SumQp = %d, u32MeanQp = %d\n", info->u32SumQp, info->u32MeanQp); +#if 0 + info->intraMbNum = + VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_INTRA_MB_NUM); + info->skippedMbNum = + VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_SKPPED_MB_NUM); + info->sadSumLuma = + VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_SAD_LUMA); + info->sadSumChroma = + VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_SAD_CHROMA); +#endif +#endif + info->frameCycle = VpuReadReg(pCodecInst->coreIdx, BIT_FRAME_CYCLE); + info->rdPtr = pEncInfo->streamRdPtr; + info->wrPtr = pEncInfo->streamWrPtr; + CVI_VC_FLOW("streamRdPtr = 0x%llX, streamWtPtr = 0x%llX\n", + pEncInfo->streamRdPtr, pEncInfo->streamWrPtr); + //=================================================== + // @ Step 3 : + // set Qp for non-roi region or Qp for picture. + //=================================================== + if (pCodecInst->productId == PRODUCT_ID_980 && + pCodecInst->codecMode == AVC_ENC && + pEncInfo->openParam.rcEnable == 4) { +#if ENABLE_RC_LIB + Uint32 real_pic_bit; + int avg_qp; + + avg_qp = VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_RC); + avg_qp = (avg_qp & 0x7E) >> 1; + real_pic_bit = + VpuReadReg(pCodecInst->coreIdx, RET_ENC_PIC_USED_BIT); + + if (!pRcInfo->cviRcEn) { + if (pRcInfo->rcMode != RC_MODE_UBR || pRcInfo->bTestUbrEn) + rcLibUpdateRc(pCodecInst, info, avg_qp, real_pic_bit); + } + + info->encPicByte = (real_pic_bit + 7) >> 3; +#endif + pEncInfo->prevWrPtr = info->wrPtr; + } + + if (pCodecInst->productId == PRODUCT_ID_980 && + pCodecInst->codecMode == AVC_ENC && + pCodecInst->codecModeAux == AVC_AUX_SVC) { + int i; + for (i = 0; i < pEncInfo->num_mmco1; i++) + pEncInfo->frm[pEncInfo->mmco1_frmidx[i]].used_for_ref = + 0; + + if (pEncInfo->is_skip_picture) { + if (pEncInfo->curr_long_term) { + if (pEncInfo->longterm_frmidx >= 0) + pEncInfo->curr_frm->used_for_ref = 0; + + pEncInfo->longterm_frmidx = + pEncInfo->curr_frm - pEncInfo->frm; + } + + pEncInfo->frm[pEncInfo->ref_pic_list].frame_num = + pEncInfo->curr_frm->frame_num; + pEncInfo->frm[pEncInfo->ref_pic_list].poc = + pEncInfo->curr_frm->poc; + pEncInfo->frm[pEncInfo->ref_pic_list].slice_type = + pEncInfo->curr_frm->slice_type; + pEncInfo->frm[pEncInfo->ref_pic_list].used_for_ref = + pEncInfo->curr_frm->used_for_ref; + + pEncInfo->curr_frm->used_for_ref = 0; + } else { + if (pEncInfo->curr_long_term) { + if (!pEncInfo->singleLumaBuf) { + if (pEncInfo->longterm_frmidx >= 0) + pEncInfo->frm + [pEncInfo->longterm_frmidx] + .used_for_ref = + 0; + } + + pEncInfo->longterm_frmidx = + pEncInfo->curr_frm - pEncInfo->frm; + } + } + + pEncInfo->enc_idx_modulo++; + if (pEncInfo->enc_idx_modulo == pEncInfo->gop_size) { + pEncInfo->enc_idx_modulo = 0; + pEncInfo->enc_idx_gop += pEncInfo->gop_size; + } + } + + if (pEncInfo->fieldDone == FALSE) + pEncInfo->encoded_frames_in_gop++; + + return RETCODE_SUCCESS; +} + +void rcLibUpdateRc(CodecInst *pCodecInst, EncOutputInfo *info, int avg_qp, + int real_pic_bit) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + stRcInfo *pRcInfo = &pCodecInst->rcInfo; +#ifdef AUTO_FRM_SKIP_DROP + int frame_skip; + frame_skip = pEncInfo->frm_rc.rc_pic.frame_skip; +#else + frame_skip = 0; +#endif + + CVI_VC_RC("frame_drop = %d\n", pEncInfo->frm_rc.rc_pic.frame_drop); + + if (pEncInfo->frm_rc.rc_pic.frame_drop) { + info->picDropped = 1; + return; + } + + CVI_VC_RC("avg_qp = %d, real_pic_bit = %d, frame_skip = %d\n", avg_qp, + real_pic_bit, pEncInfo->frm_rc.rc_pic.frame_skip); + + // I frame RQ model update + if ((info->picType == PIC_TYPE_I || info->picType == PIC_TYPE_IDR) && + (pRcInfo->maxIPicBit > 0)) { + } +} + +#ifdef REDUNDENT_CODE +RetCode Coda9VpuEncGiveCommand(CodecCommand cmd, void *param) +{ + RetCode ret = RETCODE_SUCCESS; + + UNREFERENCED_PARAMETER(cmd); + UNREFERENCED_PARAMETER(param); + + switch (cmd) { + default: + ret = RETCODE_NOT_SUPPORTED_FEATURE; + } + + return ret; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9.h new file mode 100644 index 0000000000..7d76d8a558 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9.h @@ -0,0 +1,108 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#ifndef __CODA9_FUNCTION_H__ +#define __CODA9_FUNCTION_H__ + +#include "vpuapi.h" +#include "../product.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern void Coda9BitIssueCommand(Uint32 coreIdx, CodecInst *inst, int cmd); + +extern Uint32 Coda9VpuGetProductId(Uint32 coreIdx); + +extern RetCode Coda9VpuGetVersion(Uint32 coreIdx, Uint32 *versionInfo, + Uint32 *revision); + +extern RetCode Coda9VpuInit(Uint32 coreIdx, void *firmware, Uint32 size); + +extern RetCode Coda9VpuReInit(Uint32 coreIdx, void *firmware, Uint32 size); + +extern Uint32 Coda9VpuIsInit(Uint32 coreIdx); + +extern Int32 Coda9VpuIsBusy(Uint32 coreIdx); + +extern Int32 Coda9VpuWaitInterrupt(CodecInst *handle, Int32 timeout); + +extern RetCode Coda9VpuReset(Uint32 coreIdx, SWResetMode resetMode); + +#ifdef REDUNDENT_CODE +extern RetCode Coda9VpuSleepWake(Uint32 coreIdx, int iSleepWake, + const Uint16 *code, Uint32 size); +#endif + +extern RetCode Coda9VpuSleepWake_EX(Uint32 coreIdx, int iSleepWake, + const Uint16 *code, Uint32 size); + +extern RetCode Coda9VpuClearInterrupt(Uint32 coreIdx); + +extern RetCode Coda9VpuFiniSeq(CodecInst *instance); + +extern RetCode Coda9VpuBuildUpDecParam(CodecInst *instance, + DecOpenParam *param); + +extern RetCode Coda9VpuDecInitSeq(DecHandle handle); + +extern RetCode Coda9VpuDecRegisterFramebuffer(CodecInst *instance); + +extern RetCode Coda9VpuDecSetBitstreamFlag(CodecInst *instance, BOOL running, + BOOL eos); + +extern RetCode Coda9VpuDecGetSeqInfo(CodecInst *instance, DecInitialInfo *info); + +extern RetCode Coda9VpuDecode(CodecInst *instance, DecParam *option); + +extern RetCode Coda9VpuDecGetResult(CodecInst *instance, DecOutputInfo *result); + +extern RetCode Coda9VpuDecFlush(CodecInst *instance, + FramebufferIndex *framebufferIndexes, + Uint32 size); + +/************************************************************************/ +/* Encoder */ +/************************************************************************/ +extern RetCode Coda9VpuEncRegisterFramebuffer(CodecInst *instance); + +extern RetCode Coda9VpuBuildUpEncParam(CodecInst *pCodec, EncOpenParam *param); + +extern RetCode Coda9VpuEncSetup(CodecInst *instance); + +extern RetCode Coda9VpuEncode(CodecInst *pCodecInst, EncParam *param); + +extern RetCode Coda9VpuEncGetResult(CodecInst *pCodecInst, EncOutputInfo *info); + +#ifdef REDUNDENT_CODE +extern RetCode Coda9VpuEncGiveCommand(CodecInst *pCodecInst, CodecCommand cmd, + void *param); +#endif + +extern Uint32 Coda9VpuGetFrameCycle(Uint32 coreIdx); + +extern void rcLibSetupRc(CodecInst *pCodecInst); +extern int rcLibCalcPicQp(CodecInst *pCodecInst, int *pRowMaxDqpMinus, + int *pRowMaxDqpPlus, int *pOutQp, int *pTargetPicBit, + int *pHrdBufLevel, int *pHrdBufSize); +extern void rcLibUpdateRc(CodecInst *pCodecInst, EncOutputInfo *info, + int avg_qp, int real_pic_bit); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __CODA9_FUNCTION_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9_regdefine.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9_regdefine.h new file mode 100644 index 0000000000..1038b425ee --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9_regdefine.h @@ -0,0 +1,633 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#include "../../config.h" + +#ifndef REGDEFINE_H_INCLUDED +#define REGDEFINE_H_INCLUDED + +//------------------------------------------------------------------------------ +// REGISTER BASE +//------------------------------------------------------------------------------ +#define BIT_BASE 0x0000 +#define GDMA_BASE 0x1000 +#define MBC_BASE 0x0400 +#define ME_BASE 0x0600 +#define MC_BASE 0x0C00 +#define DMAC_BASE 0x2000 + +#define BW_BASE 0x03000000 +//------------------------------------------------------------------------------ +// HARDWARE REGISTER +//------------------------------------------------------------------------------ +// SW Reset command +#define VPU_SW_RESET_BPU_CORE 0x008 +#define VPU_SW_RESET_BPU_BUS 0x010 +#define VPU_SW_RESET_VCE_CORE 0x020 +#define VPU_SW_RESET_VCE_BUS 0x040 +#define VPU_SW_RESET_GDI_CORE 0x080 +#define VPU_SW_RESET_GDI_BUS 0x100 + +#define BIT_CODE_RUN (BIT_BASE + 0x000) +#define BIT_CODE_DOWN (BIT_BASE + 0x004) +#define BIT_INT_REQ (BIT_BASE + 0x008) +#define BIT_INT_CLEAR (BIT_BASE + 0x00C) +#define BIT_INT_STS (BIT_BASE + 0x010) +#define BIT_CODE_RESET (BIT_BASE + 0x014) +#define BIT_CUR_PC (BIT_BASE + 0x018) +#define BIT_SW_RESET (BIT_BASE + 0x024) +#define BIT_SW_RESET_STATUS (BIT_BASE + 0x034) + +//------------------------------------------------------------------------------ +// GLOBAL REGISTER +//------------------------------------------------------------------------------ +#define BIT_CODE_BUF_ADDR (BIT_BASE + 0x100) +#define BIT_WORK_BUF_ADDR (BIT_BASE + 0x104) +#define BIT_PARA_BUF_ADDR (BIT_BASE + 0x108) +#define BIT_BIT_STREAM_CTRL (BIT_BASE + 0x10C) +#define BIT_FRAME_MEM_CTRL (BIT_BASE + 0x110) +#define BIT_BIT_STREAM_PARAM (BIT_BASE + 0x114) +#define BIT_TEMP_BUF_ADDR (BIT_BASE + 0x118) + +#define BIT_RD_PTR (BIT_BASE + 0x120) +#define BIT_WR_PTR (BIT_BASE + 0x124) + +#define BIT_ROLLBACK_STATUS (BIT_BASE + 0x128) // internal used in f/w. + +#define BIT_AXI_SRAM_USE (BIT_BASE + 0x140) +#define BIT_BYTE_POS_FRAME_START (BIT_BASE + 0x144) +#define BIT_BYTE_POS_FRAME_END (BIT_BASE + 0x148) +#define BIT_FRAME_CYCLE (BIT_BASE + 0x14C) + +#define BIT_FRM_DIS_FLG (BIT_BASE + 0x150) + +#define BIT_BUSY_FLAG (BIT_BASE + 0x160) +#define BIT_RUN_COMMAND (BIT_BASE + 0x164) +#define BIT_RUN_INDEX (BIT_BASE + 0x168) +#define BIT_RUN_COD_STD (BIT_BASE + 0x16C) +#define BIT_INT_ENABLE (BIT_BASE + 0x170) +#define BIT_INT_REASON (BIT_BASE + 0x174) +#define BIT_RUN_AUX_STD (BIT_BASE + 0x178) + +// MSG REGISTER ADDRESS changed +#define BIT_MSG_0 (BIT_BASE + 0x130) +#define BIT_MSG_1 (BIT_BASE + 0x134) +#define BIT_MSG_2 (BIT_BASE + 0x138) +#define BIT_MSG_3 (BIT_BASE + 0x13C) + +#define MBC_BUSY (MBC_BASE + 0x040) +#define MC_BUSY (MC_BASE + 0x004) + +#define BIT_ME_LINEBUFFER_MODE (ME_BASE + 0x004) // CODA980 +#define BIT_ME_LINE_OVERFLOW (ME_BASE + 0x008) // CODA980 +#define BIT_ME_SEARCH_OVERFLOW (ME_BASE + 0x00C) // CODA980 + +//------------------------------------------------------------------------------ +// [ENC SEQ INIT] COMMAND +//------------------------------------------------------------------------------ +#define CMD_ENC_SEQ_BB_START (BIT_BASE + 0x180) +#define CMD_ENC_SEQ_BB_SIZE (BIT_BASE + 0x184) +#define CMD_ENC_SEQ_OPTION (BIT_BASE + 0x188) + // HecEnable,ConstIntraQp, FMO, QPREP, AUD, SLICE, MB BIT +#define CMD_ENC_SEQ_COD_STD (BIT_BASE + 0x18C) +#define CMD_ENC_SEQ_SRC_SIZE (BIT_BASE + 0x190) +#define CMD_ENC_SEQ_SRC_F_RATE (BIT_BASE + 0x194) +#define CMD_ENC_SEQ_MP4_PARA (BIT_BASE + 0x198) +#define CMD_ENC_SEQ_263_PARA (BIT_BASE + 0x19C) +#define CMD_ENC_SEQ_264_PARA (BIT_BASE + 0x1A0) +#define CMD_ENC_SEQ_SLICE_MODE (BIT_BASE + 0x1A4) +#define CMD_ENC_SEQ_GOP_NUM (BIT_BASE + 0x1A8) +#define CMD_ENC_SEQ_RC_PARA (BIT_BASE + 0x1AC) +#define CMD_ENC_SEQ_RC_BUF_SIZE (BIT_BASE + 0x1B0) +#define CMD_ENC_SEQ_INTRA_REFRESH (BIT_BASE + 0x1B4) +#define CMD_ENC_SEQ_INTRA_QP (BIT_BASE + 0x1C4) +#define CMD_ENC_SEQ_RC_QP_MAX (BIT_BASE + 0x1C8) +#define CMD_ENC_SEQ_RC_GAMMA (BIT_BASE + 0x1CC) +#define CMD_ENC_SEQ_RC_INTERVAL_MODE \ + (BIT_BASE + 0x1D0) // mbInterval[32:2], rcIntervalMode[1:0] +#define CMD_ENC_SEQ_INTRA_WEIGHT (BIT_BASE + 0x1D4) +#define CMD_ENC_SEQ_ME_OPTION (BIT_BASE + 0x1D8) +#define CMD_ENC_SEQ_RC_PARA2 (BIT_BASE + 0x1DC) +#define CMD_ENC_SEQ_QP_RANGE_SET (BIT_BASE + 0x1E0) +#define CMD_ENC_SEQ_RC_MAX_INTRA_SIZE (BIT_BASE + 0x1F0) + +#define CMD_ENC_SEQ_DELTA_QP (BIT_BASE + 0x1F4) + +#define CMD_ENC_SEQ_SVC_T_PARA (BIT_BASE + 0x1F8) + +#define CMD_ENC_SEQ_FIRST_MBA (BIT_BASE + 0x1E4) +#define CMD_ENC_SEQ_HEIGHT_IN_MAP_UNITS (BIT_BASE + 0x1E8) +#define CMD_ENC_SEQ_OVERLAP_CLIP_SIZE (BIT_BASE + 0x1EC) + +//------------------------------------------------------------------------------ +// [ENC SEQ END] COMMAND +//------------------------------------------------------------------------------ +#define RET_ENC_SEQ_END_SUCCESS (BIT_BASE + 0x1C0) +//------------------------------------------------------------------------------ +// [ENC PIC RUN] COMMAND +//------------------------------------------------------------------------------ + +#define CMD_ENC_PIC_SRC_INDEX (BIT_BASE + 0x180) +#define CMD_ENC_PIC_SRC_STRIDE (BIT_BASE + 0x184) +#define CMD_ENC_PIC_SRC_ADDR_Y (BIT_BASE + 0x1A8) +#define CMD_ENC_PIC_SRC_ADDR_CB (BIT_BASE + 0x1AC) +#define CMD_ENC_PIC_SRC_ADDR_CR (BIT_BASE + 0x1B0) +#define CMD_ENC_PIC_SRC_BOTTOM_Y (BIT_BASE + 0x1E8) // coda980 only +#define CMD_ENC_PIC_SRC_BOTTOM_CB (BIT_BASE + 0x1EC) // coda980 only +#define CMD_ENC_PIC_SRC_BOTTOM_CR (BIT_BASE + 0x1F0) // coda980 only + +#define CMD_ENC_PIC_QS (BIT_BASE + 0x18C) +#define CMD_ENC_PIC_ROT_MODE (BIT_BASE + 0x190) +#define CMD_ENC_PIC_OPTION (BIT_BASE + 0x194) +#define CMD_ENC_PIC_BB_START (BIT_BASE + 0x198) +#define CMD_ENC_PIC_BB_SIZE (BIT_BASE + 0x19C) +#define CMD_ENC_PIC_PARA_BASE_ADDR (BIT_BASE + 0x1A0) +#define CMD_ENC_PIC_SUB_FRAME_SYNC (BIT_BASE + 0x1A4) +#define CMD_ENC_PIC_DPB_INFO (BIT_BASE + 0x1DC) +#define CMD_ENC_PIC_POC (BIT_BASE + 0x1E0) + +#define CMD_ENC_PIC_TARGET_BIT (BIT_BASE + 0x1C0) +#ifdef ROI_MB_RC +//#define CMD_ENC_PIC_QP (BIT_BASE + 0x1C8) +#define CMD_ENC_PIC_RC_BUF_SIZE (BIT_BASE + 0x1CC) +#define CMD_ENC_PIC_RC_BUF_LEVEL (BIT_BASE + 0x1C8) +#define CMD_ENC_PIC_RC_QP (BIT_BASE + 0x1D4) +#else +#define CMD_ENC_PIC_QP (BIT_BASE + 0x1C8) +#endif +#define RET_ENC_PIC_USED_BIT (BIT_BASE + 0x18C) +#define RET_ENC_PIC_RC (BIT_BASE + 0x188) + +#define RET_ENC_PIC_FRAME_NUM (BIT_BASE + 0x1C0) +#define RET_ENC_PIC_TYPE (BIT_BASE + 0x1C4) +#define RET_ENC_PIC_FRAME_IDX (BIT_BASE + 0x1C8) +#define RET_ENC_PIC_SLICE_NUM (BIT_BASE + 0x1CC) +#define RET_ENC_PIC_FLAG (BIT_BASE + 0x1D0) +#define RET_ENC_PIC_SUCCESS (BIT_BASE + 0x1D8) + +#define SUPPORT_PIC_INFO_REPORT + +#ifdef SUPPORT_PIC_INFO_REPORT +#define RET_ENC_PIC_INTRA_MB_NUM (BIT_BASE + 0x1DC) +#define RET_ENC_PIC_SKPPED_MB_NUM (BIT_BASE + 0x1E0) +#define RET_ENC_PIC_SUM_QP (BIT_BASE + 0x1E4) +#define RET_ENC_PIC_SAD_LUMA (BIT_BASE + 0x1A0) +#define RET_ENC_PIC_SAD_CHROMA (BIT_BASE + 0x1A4) +#endif + +#ifdef REPORT_PIC_SUM_VAR +#define RET_ENC_PIC_SUM_VAR (BIT_BASE + 0x1A8) +#endif + +//------------------------------------------------------------------------------ +// [ENC ROI INIT] COMMAND +//------------------------------------------------------------------------------ +#define CMD_ENC_ROI_INFO (BIT_BASE + 0x180) // [7:1]: RoiPicAvgQp, [0]: RoiEn +#define CMD_ENC_ROI_QP_MAP_ADDR (BIT_BASE + 0x184) // [31:0] ROI Qp map address + +#ifdef ROI_MB_RC +#define CMD_ENC_ROI_NUM (BIT_BASE + 0x184) // [3:0] RoiNum +#define CMD_ENC_ROI_POS_0 (BIT_BASE + 0x188) + // [31:24]: MbyEnd, [23:16]: MbyStart, [15:8]: MbxEnd, [7:0]: MbxStart +#define CMD_ENC_ROI_QP_0 (BIT_BASE + 0x18C) // [05:04]: RoiQp +#define CMD_ENC_ROI_POS_1 (BIT_BASE + 0x190) +#define CMD_ENC_ROI_QP_1 (BIT_BASE + 0x194) +#define CMD_ENC_ROI_POS_2 (BIT_BASE + 0x198) +#define CMD_ENC_ROI_QP_2 (BIT_BASE + 0x19C) +#define CMD_ENC_ROI_POS_3 (BIT_BASE + 0x1A0) +#define CMD_ENC_ROI_QP_3 (BIT_BASE + 0x1A4) +#define CMD_ENC_ROI_POS_4 (BIT_BASE + 0x1A8) +#define CMD_ENC_ROI_QP_4 (BIT_BASE + 0x1AC) +#define CMD_ENC_ROI_POS_5 (BIT_BASE + 0x1B0) +#define CMD_ENC_ROI_QP_5 (BIT_BASE + 0x1B4) +#define CMD_ENC_ROI_POS_6 (BIT_BASE + 0x1B8) +#define CMD_ENC_ROI_QP_6 (BIT_BASE + 0x1BC) +//#define CMD_ENC_ROI_POS_7 (BIT_BASE + 0x1C0) +#define CMD_ENC_ROI_QP_7 (BIT_BASE + 0x1C4) +#define CMD_ENC_ROI_POS_8 (BIT_BASE + 0x1C8) +#define CMD_ENC_ROI_QP_8 (BIT_BASE + 0x1CC) +#define CMD_ENC_ROI_POS_9 (BIT_BASE + 0x1D0) +#define CMD_ENC_ROI_QP_9 (BIT_BASE + 0x1D4) +#define CMD_ENC_ROI_POS_7 (BIT_BASE + 0x1D8) +#endif + +#define RET_ENC_ROI_SUCCESS (BIT_BASE + 0x1D8) + +//------------------------------------------------------------------------------ +// [ENC SET FRAME BUF] COMMAND +//------------------------------------------------------------------------------ +#define CMD_SET_FRAME_SUBSAMP_A (BIT_BASE + 0x188) // coda960 only +#define CMD_SET_FRAME_SUBSAMP_B (BIT_BASE + 0x18C) // coda960 only +#define CMD_SET_FRAME_SUBSAMP_A_MVC (BIT_BASE + 0x1B0) // coda960 only +#define CMD_SET_FRAME_SUBSAMP_B_MVC (BIT_BASE + 0x1B4) // coda960 only + +#define CMD_SET_FRAME_DP_BUF_BASE (BIT_BASE + 0x1B0) +#define CMD_SET_FRAME_DP_BUF_SIZE (BIT_BASE + 0x1B4) + +//------------------------------------------------------------------------------ +// [ENC HEADER] COMMAND +//------------------------------------------------------------------------------ +#define CMD_ENC_HEADER_CODE (BIT_BASE + 0x180) +#define CMD_ENC_HEADER_BB_START (BIT_BASE + 0x184) +#define CMD_ENC_HEADER_BB_SIZE (BIT_BASE + 0x188) +#define CMD_ENC_HEADER_FRAME_CROP_H (BIT_BASE + 0x18C) +#define CMD_ENC_HEADER_FRAME_CROP_V (BIT_BASE + 0x190) +#define CMD_ENC_HEADER_CABAC_MODE (BIT_BASE + 0x194) // CODA980 +#define CMD_ENC_HEADER_CABAC_INIT_IDC (BIT_BASE + 0x198) // CODA980 +#define CMD_ENC_HEADER_TRANSFORM_8X8 (BIT_BASE + 0x19C) // CODA980 +#define CMD_ENC_HEADER_CHROMA_FORMAT (BIT_BASE + 0x1A0) // CODA980 +#define CMD_ENC_HEADER_FIELD_FLAG (BIT_BASE + 0x1A4) +#define CMD_ENC_HEADER_PROFILE (BIT_BASE + 0x1A8) // CODA980 + +#define CMD_ENC_HEADER_SVC_SEI_INFO1 (BIT_BASE + 0x1B4) +#define CMD_ENC_HEADER_SVC_SEI_INFO2 (BIT_BASE + 0x1B8) +#define CMD_ENC_HEADER_FRAME \ + (BIT_BASE + 0x1BC) // max_tid, num_ref_frame_decoder , NalRefIdc + +#define RET_ENC_HEADER_SUCCESS (BIT_BASE + 0x1C0) + +//------------------------------------------------------------------------------ +// [ENC_PARA_SET] COMMAND +//------------------------------------------------------------------------------ +#define CMD_ENC_PARA_SET_TYPE (BIT_BASE + 0x180) +#define RET_ENC_PARA_SET_SIZE (BIT_BASE + 0x1c0) +#define RET_ENC_PARA_SET_SUCCESS (BIT_BASE + 0x1C4) + +//------------------------------------------------------------------------------ +// [ENC PARA CHANGE] COMMAND : +//------------------------------------------------------------------------------ +#define CMD_ENC_PARAM_CHANGE_ENABLE (BIT_BASE + 0x180) + // FrameRateEn[3], BitRateEn[2], IntraQpEn[1], GopEn[0] +#define CMD_ENC_PARAM_CHANGE_GOP_NUM (BIT_BASE + 0x184) +#define CMD_ENC_PARAM_CHANGE_INTRA_QP (BIT_BASE + 0x188) +#define CMD_ENC_PARAM_CHANGE_BITRATE (BIT_BASE + 0x18C) +#define CMD_ENC_PARAM_CHANGE_F_RATE (BIT_BASE + 0x190) +#define CMD_ENC_PARAM_CHANGE_INTRA_REFRESH (BIT_BASE + 0x194) // update param +#define CMD_ENC_PARAM_CHANGE_SLICE_MODE (BIT_BASE + 0x198) // update param +#define CMD_ENC_PARAM_CHANGE_HEC_MODE (BIT_BASE + 0x19C) // update param +#define CMD_ENC_PARAM_CHANGE_CABAC_MODE \ + (BIT_BASE + 0x1A0) // entropyCodingMode==2 +#define CMD_ENC_PARAM_CHANGE_PPS_ID (BIT_BASE + 0x1B4) // entropyCodingMode==2 +#define CMD_ENC_PARAM_CHANGE_MIN_MAX_QP (BIT_BASE + 0x1BC) +#if defined(RC_PIC_PARACHANGE) && defined(RC_CHANGE_PARAMETER_DEF) +#define CMD_ENC_PARAM_MIN_MAX_DELTA_QP (BIT_BASE + 0x1C4) +#define CMD_ENC_PARAM_PIC_RC (BIT_BASE + 0x1C8) +#define CMD_ENC_PARAM_PIC_RC_2 (BIT_BASE + 0x1CC) +#define CMD_ENC_PARAM_PIC_GAMMA (BIT_BASE + 0x1D0) + +#endif +#define RET_ENC_SEQ_PARA_CHANGE_SUCCESS (BIT_BASE + 0x1C0) + +//------------------------------------------------------------------------------ +// [DEC SEQ INIT] COMMAND +//------------------------------------------------------------------------------ +#define CMD_DEC_SEQ_BB_START (BIT_BASE + 0x180) +#define CMD_DEC_SEQ_BB_SIZE (BIT_BASE + 0x184) +#define CMD_DEC_SEQ_OPTION (BIT_BASE + 0x188) + +#define CMD_DEC_SEQ_MP4_ASP_CLASS (BIT_BASE + 0x19C) +#define CMD_DEC_SEQ_VC1_STREAM_FMT (BIT_BASE + 0x19C) +#define CMD_DEC_SEQ_X264_MV_EN (BIT_BASE + 0x19C) +#define CMD_DEC_SEQ_SPP_CHUNK_SIZE (BIT_BASE + 0x1A0) + +// For MPEG2 only +#define CMD_DEC_SEQ_USER_DATA_OPTION (BIT_BASE + 0x194) +#define CMD_DEC_SEQ_USER_DATA_BASE_ADDR (BIT_BASE + 0x1AC) +#define CMD_DEC_SEQ_USER_DATA_BUF_SIZE (BIT_BASE + 0x1B0) + +#define CMD_DEC_SEQ_INIT_ESCAPE (BIT_BASE + 0x114) + +#define RET_DEC_SEQ_BIT_RATE (BIT_BASE + 0x1B4) +#define RET_DEC_SEQ_EXT_INFO (BIT_BASE + 0x1B8) +#define RET_DEC_SEQ_SUCCESS (BIT_BASE + 0x1C0) +#define RET_DEC_SEQ_SRC_SIZE (BIT_BASE + 0x1C4) + +#define RET_DEC_SEQ_ASPECT (BIT_BASE + 0x1C8) +#define RET_DEC_SEQ_FRAME_NEED (BIT_BASE + 0x1CC) +#define RET_DEC_SEQ_FRAME_DELAY (BIT_BASE + 0x1D0) +#define RET_DEC_SEQ_INFO (BIT_BASE + 0x1D4) +#define RET_DEC_SEQ_VP8_SCALE_INFO (BIT_BASE + 0x1D4) + +#define RET_DEC_SEQ_CROP_LEFT_RIGHT (BIT_BASE + 0x1D8) +#define RET_DEC_SEQ_CROP_TOP_BOTTOM (BIT_BASE + 0x1DC) +#define RET_DEC_SEQ_SEQ_ERR_REASON (BIT_BASE + 0x1E0) + +#define RET_DEC_SEQ_FRATE_NR (BIT_BASE + 0x1E4) +#define RET_DEC_SEQ_FRATE_DR (BIT_BASE + 0x1E8) +#define RET_DEC_SEQ_HEADER_REPORT (BIT_BASE + 0x1EC) +#define RET_DEC_SEQ_VUI_INFO (BIT_BASE + 0x18C) +#define RET_DEC_SEQ_VUI_PIC_STRUCT (BIT_BASE + 0x1A8) + +#define RET_DEC_SEQ_MP2_BAR_LEFT_RIGHT (BIT_BASE + 0x180) +#define RET_DEC_SEQ_MP2_BAR_TOP_BOTTOM (BIT_BASE + 0x184) + +#define RET_DEC_PIC_MP2_OFFSET1 (BIT_BASE + 0x19C) // for MP2 +#define RET_DEC_PIC_MP2_OFFSET2 (BIT_BASE + 0x1A0) // for MP2 +#define RET_DEC_PIC_MP2_OFFSET3 (BIT_BASE + 0x1A4) // for MP2 +#define RET_DEC_PIC_MP2_OFFSET_NUM (BIT_BASE + 0x1A8) // for MP2 + +//------------------------------------------------------------------------------ +// [DEC SEQ END] COMMAND +//------------------------------------------------------------------------------ +#define RET_DEC_SEQ_END_SUCCESS (BIT_BASE + 0x1C0) + +//------------------------------------------------------------------------------ +// [DEC PIC RUN] COMMAND +//---------------------------------------------------- +#define CMD_DEC_PIC_ROT_MODE (BIT_BASE + 0x180) +#define CMD_DEC_PIC_ROT_INDEX (BIT_BASE + 0x184) +#define CMD_DEC_PIC_ROT_ADDR_Y (BIT_BASE + 0x188) +#define CMD_DEC_PIC_ROT_ADDR_CB (BIT_BASE + 0x18C) +#define CMD_DEC_PIC_ROT_ADDR_CR (BIT_BASE + 0x190) +#define CMD_DEC_PIC_ROT_STRIDE (BIT_BASE + 0x1B8) +#define CMD_DEC_PIC_ROT_BOTTOM_Y (BIT_BASE + 0x1E8) // coda980 only +#define CMD_DEC_PIC_ROT_BOTTOM_CB (BIT_BASE + 0x1EC) // coda980 only +#define CMD_DEC_PIC_ROT_BOTTOM_CR (BIT_BASE + 0x1F0) // coda980 only + +#define CMD_DEC_PIC_SVC_INFO (BIT_BASE + 0x1C4) + +#define CMD_DEC_PIC_OPTION (BIT_BASE + 0x194) + +#define CMD_DEC_PIC_USER_DATA_BASE_ADDR (BIT_BASE + 0x1AC) +#define CMD_DEC_PIC_USER_DATA_BUF_SIZE (BIT_BASE + 0x1B0) + +#define CMD_DEC_PIC_NUM_ROWS (BIT_BASE + 0x1B4) +#define CMD_DEC_PIC_THO_PIC_PARA (BIT_BASE + 0x198) +#define CMD_DEC_PIC_THO_QMAT_ADDR (BIT_BASE + 0x1A0) +#define CMD_DEC_PIC_THO_MB_PARA_ADDR (BIT_BASE + 0x1A4) +#define RET_DEC_PIC_VUI_PIC_STRUCT (BIT_BASE + 0x1A8) +#define RET_DEC_PIC_TID_INFO (BIT_BASE + 0x190) +#define RET_DEC_PIC_AVC_FPA_SEI0 (BIT_BASE + 0x19C) +#define RET_DEC_PIC_AVC_FPA_SEI1 (BIT_BASE + 0x1A0) +#define RET_DEC_PIC_AVC_FPA_SEI2 (BIT_BASE + 0x1A4) +#define RET_DEC_NUM_MB_ROWS (BIT_BASE + 0x1B4) // it will be update +#define RET_DEC_PIC_AVC_SEI_RP_INFO (BIT_BASE + 0x1B4) +#define RET_DEC_PIC_HRD_INFO (BIT_BASE + 0x1B8) +#define RET_DEC_PIC_SIZE (BIT_BASE + 0x1BC) +#define RET_DEC_PIC_FRAME_NUM (BIT_BASE + 0x1C0) +#define RET_DEC_PIC_FRAME_IDX (BIT_BASE + 0x1C4) +#define RET_DEC_PIC_DISPLAY_IDX (BIT_BASE + 0x1C4) +#define RET_DEC_PIC_ERR_MB (BIT_BASE + 0x1C8) +#define RET_DEC_PIC_TYPE (BIT_BASE + 0x1CC) +#define RET_DEC_PIC_POST (BIT_BASE + 0x1D0) // for VC1 +#define RET_DEC_PIC_MVC_REPORT (BIT_BASE + 0x1D0) // for MVC +#define RET_DEC_PIC_OPTION (BIT_BASE + 0x1D4) +#define RET_DEC_PIC_SUCCESS (BIT_BASE + 0x1D8) +#define RET_DEC_PIC_CUR_IDX (BIT_BASE + 0x1DC) +#define RET_DEC_PIC_DECODED_IDX (BIT_BASE + 0x1DC) +#define RET_DEC_PIC_CROP_LEFT_RIGHT (BIT_BASE + 0x1E0) // for AVC, MPEG-2 +#define RET_DEC_PIC_CROP_TOP_BOTTOM (BIT_BASE + 0x1E4) // for AVC, MPEG-2 +#define RET_DEC_PIC_MODULO_TIME_BASE (BIT_BASE + 0x1E0) // for MP4 +#define RET_DEC_PIC_VOP_TIME_INCREMENT (BIT_BASE + 0x1E4) // for MP4 +#define RET_DEC_PIC_RV_TR (BIT_BASE + 0x1E8) +#define RET_DEC_PIC_VP8_PIC_REPORT (BIT_BASE + 0x1E8) +#define RET_DEC_PIC_ATSC_USER_DATA_INFO (BIT_BASE + 0x1E8) // H.264, MEPEG2 +#define RET_DEC_PIC_VUI_INFO (BIT_BASE + 0x1EC) +#define RET_DEC_PIC_RV_TR_BFRAME (BIT_BASE + 0x1EC) +#define RET_DEC_PIC_ASPECT (BIT_BASE + 0x1F0) +#define RET_DEC_PIC_VP8_SCALE_INFO (BIT_BASE + 0x1F0) +#define RET_DEC_PIC_FRATE_NR (BIT_BASE + 0x1F4) +#define RET_DEC_PIC_FRATE_DR (BIT_BASE + 0x1F8) +#define RET_DEC_PIC_POC_TOP (BIT_BASE + 0x1AC) +#define RET_DEC_PIC_POC_BOT (BIT_BASE + 0x1B0) +#define RET_DEC_PIC_POC (BIT_BASE + 0x1B0) + +//------------------------------------------------------------------------------ +// [DEC SET FRAME BUF] COMMAND +//------------------------------------------------------------------------------ +#define CMD_SET_FRAME_BUF_NUM (BIT_BASE + 0x180) +#define CMD_SET_FRAME_BUF_STRIDE (BIT_BASE + 0x184) + +#define CMD_SET_FRAME_SLICE_BB_START (BIT_BASE + 0x188) +#define CMD_SET_FRAME_SLICE_BB_SIZE (BIT_BASE + 0x18C) +#define CMD_SET_FRAME_AXI_BIT_ADDR (BIT_BASE + 0x190) +#define CMD_SET_FRAME_AXI_IPACDC_ADDR (BIT_BASE + 0x194) +#define CMD_SET_FRAME_AXI_DBKY_ADDR (BIT_BASE + 0x198) +#define CMD_SET_FRAME_AXI_DBKC_ADDR (BIT_BASE + 0x19C) +#define CMD_SET_FRAME_AXI_OVL_ADDR (BIT_BASE + 0x1A0) +#define CMD_SET_FRAME_AXI_BTP_ADDR (BIT_BASE + 0x1A4) + +#define CMD_SET_FRAME_CACHE_SIZE (BIT_BASE + 0x1A8) +#define CMD_SET_FRAME_CACHE_CONFIG (BIT_BASE + 0x1AC) +#define CMD_SET_FRAME_MB_BUF_BASE (BIT_BASE + 0x1B0) +#define CMD_SET_FRAME_MAX_DEC_SIZE (BIT_BASE + 0x1B8) +#define CMD_SET_FRAME_DELAY (BIT_BASE + 0x1BC) + +#define RET_SET_FRAME_SUCCESS (BIT_BASE + 0x1C0) + +//------------------------------------------------------------------------------ +// [DEC_PARA_SET] COMMAND +//------------------------------------------------------------------------------ +#define CMD_DEC_PARA_SET_TYPE (BIT_BASE + 0x180) +#define CMD_DEC_PARA_SET_SIZE (BIT_BASE + 0x184) +#define RET_DEC_PARA_SET_SUCCESS (BIT_BASE + 0x1C0) + +//------------------------------------------------------------------------------ +// [DEC_BUF_FLUSH] COMMAND +//------------------------------------------------------------------------------ +#define RET_DEC_BUF_FLUSH_SUCCESS (BIT_BASE + 0x1C0) + +//------------------------------------------------------------------------------ +// [SLEEP/WAKE] COMMAND +//------------------------------------------------------------------------------ +#define RET_SLEEP_WAKE_SUCCESS (BIT_BASE + 0x1C0) + +//------------------------------------------------------------------------------ +// [SET PIC INFO] COMMAND +//------------------------------------------------------------------------------ +#define GDI_PRI_RD_PRIO_L (GDMA_BASE + 0x000) +#define GDI_PRI_RD_PRIO_H (GDMA_BASE + 0x004) +#define GDI_PRI_WR_PRIO_L (GDMA_BASE + 0x008) +#define GDI_PRI_WR_PRIO_H (GDMA_BASE + 0x00c) +#define GDI_PRI_RD_LOCK_CNT (GDMA_BASE + 0x010) +#define GDI_PRI_WR_LOCK_CNT (GDMA_BASE + 0x014) +#define GDI_SEC_RD_PRIO_L (GDMA_BASE + 0x018) +#define GDI_SEC_RD_PRIO_H (GDMA_BASE + 0x01c) +#define GDI_SEC_WR_PRIO_L (GDMA_BASE + 0x020) +#define GDI_SEC_WR_PRIO_H (GDMA_BASE + 0x024) +#define GDI_SEC_RD_LOCK_CNT (GDMA_BASE + 0x028) +#define GDI_SEC_WR_LOCK_CNT (GDMA_BASE + 0x02c) +#define GDI_SEC_CLIENT_EN (GDMA_BASE + 0x030) +#define GDI_CONTROL (GDMA_BASE + 0x034) +#define GDI_PIC_INIT_HOST (GDMA_BASE + 0x038) + +#define GDI_HW_VERINFO (GDMA_BASE + 0x050) +#define GDI_PINFO_REQ (GDMA_BASE + 0x060) +#define GDI_PINFO_ACK (GDMA_BASE + 0x064) +#define GDI_PINFO_ADDR (GDMA_BASE + 0x068) +#define GDI_PINFO_DATA (GDMA_BASE + 0x06c) +#define GDI_BWB_ENABLE (GDMA_BASE + 0x070) +#define GDI_BWB_SIZE (GDMA_BASE + 0x074) +#define GDI_BWB_STD_STRUCT (GDMA_BASE + 0x078) +#define GDI_BWB_STATUS (GDMA_BASE + 0x07c) + +#define GDI_STATUS (GDMA_BASE + 0x080) + +#define GDI_DEBUG_0 (GDMA_BASE + 0x084) +#define GDI_DEBUG_1 (GDMA_BASE + 0x088) +#define GDI_DEBUG_2 (GDMA_BASE + 0x08c) +#define GDI_DEBUG_3 (GDMA_BASE + 0x090) +#define GDI_DEBUG_PROBE_ADDR (GDMA_BASE + 0x094) +#define GDI_DEBUG_PROBE_DATA (GDMA_BASE + 0x098) + +// write protect +#define GDI_WPROT_ERR_CLR (GDMA_BASE + 0x0A0) +#define GDI_WPROT_ERR_RSN (GDMA_BASE + 0x0A4) +#define GDI_WPROT_ERR_ADR (GDMA_BASE + 0x0A8) +#define GDI_WPROT_RGN_EN (GDMA_BASE + 0x0AC) +#define GDI_WPROT_RGN0_STA (GDMA_BASE + 0x0B0) +#define GDI_WPROT_RGN0_END (GDMA_BASE + 0x0B4) +#define GDI_WPROT_RGN1_STA (GDMA_BASE + 0x0B8) +#define GDI_WPROT_RGN1_END (GDMA_BASE + 0x0BC) +#define GDI_WPROT_RGN2_STA (GDMA_BASE + 0x0C0) +#define GDI_WPROT_RGN2_END (GDMA_BASE + 0x0C4) +#define GDI_WPROT_RGN3_STA (GDMA_BASE + 0x0C8) +#define GDI_WPROT_RGN3_END (GDMA_BASE + 0x0CC) +#define GDI_WPROT_RGN4_STA (GDMA_BASE + 0x0D0) +#define GDI_WPROT_RGN4_END (GDMA_BASE + 0x0D4) +#define GDI_WPROT_RGN5_STA (GDMA_BASE + 0x0D8) +#define GDI_WPROT_RGN5_END (GDMA_BASE + 0x0DC) +#define GDI_WPROT_REGIONS 6 + +#define GDI_BUS_CTRL (GDMA_BASE + 0x0F0) +#define GDI_BUS_STATUS (GDMA_BASE + 0x0F4) + +#define GDI_SIZE_ERR_FLAG (GDMA_BASE + 0x0e0) +#define GDI_ADR_RQ_SIZE_ERR_PRI0 (GDMA_BASE + 0x100) +#define GDI_ADR_RQ_SIZE_ERR_PRI1 (GDMA_BASE + 0x104) +#define GDI_ADR_RQ_SIZE_ERR_PRI1 (GDMA_BASE + 0x104) +#define GDI_ADR_RQ_SIZE_ERR_PRI2 (GDMA_BASE + 0x108) +#define GDI_ADR_WQ_SIZE_ERR_PRI0 (GDMA_BASE + 0x10c) +#define GDI_ADR_WQ_SIZE_ERR_PRI1 (GDMA_BASE + 0x110) +#define GDI_ADR_WQ_SIZE_ERR_PRI2 (GDMA_BASE + 0x114) + +#define GDI_ADR_RQ_SIZE_ERR_SEC0 (GDMA_BASE + 0x118) +#define GDI_ADR_RQ_SIZE_ERR_SEC1 (GDMA_BASE + 0x11c) +#define GDI_ADR_RQ_SIZE_ERR_SEC2 (GDMA_BASE + 0x120) + +#define GDI_ADR_WQ_SIZE_ERR_SEC0 (GDMA_BASE + 0x124) +#define GDI_ADR_WQ_SIZE_ERR_SEC1 (GDMA_BASE + 0x128) +#define GDI_ADR_WQ_SIZE_ERR_SEC2 (GDMA_BASE + 0x12c) + +#define GDI_INFO_CONTROL (GDMA_BASE + 0x400) +#define GDI_INFO_PIC_SIZE (GDMA_BASE + 0x404) +// GDI 2.0 register +#define GDI_INFO_BASE_Y_TOP (GDMA_BASE + 0x408) +#define GDI_INFO_BASE_CB_TOP (GDMA_BASE + 0x40C) +#define GDI_INFO_BASE_CR_TOP (GDMA_BASE + 0x410) +#define GDI_INFO_BASE_Y_BOT (GDMA_BASE + 0x414) +#define GDI_INFO_BASE_CB_BOT (GDMA_BASE + 0x418) +#define GDI_INFO_BASE_CR_BOT (GDMA_BASE + 0x41C) +#define GDI_XY2AXI_LUM_BIT00 (GDMA_BASE + 0x800) +#define GDI_XY2AXI_LUM_BIT1F (GDMA_BASE + 0x87C) +#define GDI_XY2AXI_CHR_BIT00 (GDMA_BASE + 0x880) +#define GDI_XY2AXI_CHR_BIT1F (GDMA_BASE + 0x8FC) +#define GDI_XY2AXI_CONFIG (GDMA_BASE + 0x900) + +// GDI 1.0 register +#define GDI_INFO_BASE_Y (GDMA_BASE + 0x408) +#define GDI_INFO_BASE_CB (GDMA_BASE + 0x40C) +#define GDI_INFO_BASE_CR (GDMA_BASE + 0x410) + +#define GDI_XY2_CAS_0 (GDMA_BASE + 0x800) +#define GDI_XY2_CAS_F (GDMA_BASE + 0x83C) + +#define GDI_XY2_BA_0 (GDMA_BASE + 0x840) +#define GDI_XY2_BA_1 (GDMA_BASE + 0x844) +#define GDI_XY2_BA_2 (GDMA_BASE + 0x848) +#define GDI_XY2_BA_3 (GDMA_BASE + 0x84C) + +#define GDI_XY2_RAS_0 (GDMA_BASE + 0x850) +#define GDI_XY2_RAS_F (GDMA_BASE + 0x88C) + +#define GDI_XY2_RBC_CONFIG (GDMA_BASE + 0x890) +#define GDI_RBC2_AXI_0 (GDMA_BASE + 0x8A0) +#define GDI_RBC2_AXI_1F (GDMA_BASE + 0x91C) +#define GDI_TILEDBUF_BASE (GDMA_BASE + 0x920) + +//------------------------------------------------------------------------------ +// Product, Reconfiguration Information +//------------------------------------------------------------------------------ +#define DBG_CONFIG_REPORT_0 (GDMA_BASE + 0x040) // product name and version +#define DBG_CONFIG_REPORT_1 \ + (GDMA_BASE + 0x044) // interface configuration, hardware definition +#define DBG_CONFIG_REPORT_2 (GDMA_BASE + 0x048) // standard definition +#define DBG_CONFIG_REPORT_3 (GDMA_BASE + 0x04C) // standard detail definition +#define DBG_CONFIG_REPORT_4 (GDMA_BASE + 0x050) // definition in cnm_define +#define DBG_CONFIG_REPORT_5 (GDMA_BASE + 0x054) +#define DBG_CONFIG_REPORT_6 (GDMA_BASE + 0x058) +#define DBG_CONFIG_REPORT_7 (GDMA_BASE + 0x05C) + +//------------------------------------------------------------------------------ +// MEMORY COPY MODULE REGISTER +//------------------------------------------------------------------------------ +#define ADDR_DMAC_PIC_RUN (DMAC_BASE + 0x000) +#define ADDR_DMAC_PIC_STATUS (DMAC_BASE + 0x004) +#define ADDR_DMAC_PIC_OP_MODE (DMAC_BASE + 0x008) +#define ADDR_DMAC_ID (DMAC_BASE + 0x00c) // the result muse be 0x4d435059 + +#define ADDR_DMAC_SRC_BASE_Y (DMAC_BASE + 0x010) +#define ADDR_DMAC_SRC_BASE_CB (DMAC_BASE + 0x014) +#define ADDR_DMAC_SRC_BASE_CR (DMAC_BASE + 0x018) +#define ADDR_DMAC_SRC_STRIDE (DMAC_BASE + 0x01c) + +#define ADDR_DMAC_DST_BASE_Y (DMAC_BASE + 0x020) +#define ADDR_DMAC_DST_BASE_CB (DMAC_BASE + 0x024) +#define ADDR_DMAC_DST_BASE_CR (DMAC_BASE + 0x028) +#define ADDR_DMAC_DST_STRIDE (DMAC_BASE + 0x02c) + +#define ADDR_DMAC_SRC_MB_POS_X (DMAC_BASE + 0x030) +#define ADDR_DMAC_SRC_MB_POS_Y (DMAC_BASE + 0x034) +#define ADDR_DMAC_SRC_MB_BLK_X (DMAC_BASE + 0x038) +#define ADDR_DMAC_SRC_MB_BLK_Y (DMAC_BASE + 0x03c) + +#define ADDR_DMAC_DST_MB_POS_X (DMAC_BASE + 0x040) +#define ADDR_DMAC_DST_MB_POS_Y (DMAC_BASE + 0x044) +#define ADDR_DMAC_DST_MB_BLK_X (DMAC_BASE + 0x048) +#define ADDR_DMAC_DST_MB_BLK_Y (DMAC_BASE + 0x04c) + +#define ADDR_DMAC_SET_COLOR_Y (DMAC_BASE + 0x050) +#define ADDR_DMAC_SET_COLOR_CB (DMAC_BASE + 0x054) +#define ADDR_DMAC_SET_COLOR_CR (DMAC_BASE + 0x058) + +#define ADDR_DMAC_SUB_SAMPLE_X (DMAC_BASE + 0x060) +#define ADDR_DMAC_SUB_SAMPLE_Y (DMAC_BASE + 0x064) + +//------------------------------------------------------------------------------ +// DMAC +//------------------------------------------------------------------------------ +#define DMAC_DMAC_RUN (DMAC_BASE + 0x00) +#define DMAC_SOFT_RESET (DMAC_BASE + 0x04) +#define DMAC_DMAC_MODE (DMAC_BASE + 0x08) +#define DMAC_DESC_ADDR (DMAC_BASE + 0x0c) +#define DMAC_DESC0 (DMAC_BASE + 0x10) +#define DMAC_DESC1 (DMAC_BASE + 0x14) +#define DMAC_DESC2 (DMAC_BASE + 0x18) +#define DMAC_DESC3 (DMAC_BASE + 0x1c) +#define DMAC_DESC4 (DMAC_BASE + 0x20) +#define DMAC_DESC5 (DMAC_BASE + 0x24) +#define DMAC_DESC6 (DMAC_BASE + 0x28) +#define DMAC_DESC7 (DMAC_BASE + 0x2c) + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +// [FIRMWARE VERSION] COMMAND +// [32:16] project number => +// [16:0] version => xxxx.xxxx.xxxxxxxx +//------------------------------------------------------------------------------ +#define RET_FW_VER_NUM (BIT_BASE + 0x1c0) +#define RET_FW_CODE_REV (BIT_BASE + 0x1c4) + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9_vpuconfig.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9_vpuconfig.h new file mode 100644 index 0000000000..4568b7ea67 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/coda9/coda9_vpuconfig.h @@ -0,0 +1,161 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// This file should be modified by some customers according to their +//SOC configuration. +//--=========================================================================-- + +#ifndef __CODA9_VPU_CONFIG_H__ +#define __CODA9_VPU_CONFIG_H__ + +#include "vpuconfig.h" +#include "vputypes.h" + +#if MAX_DEC_PIC_WIDTH > 1920 // 4K + +#define USE_WTL 0 // not support 4K WTL +#define MAX_EXTRA_FRAME_BUFFER_NUM 1 +#define MAX_PP_SRC_NUM \ + 2 // PPU buffer(decoding case) or Source buffer(encoding case) + +#define MAX_DPB_MBS 110400 // 32768 for level 5 + +#elif MAX_DEC_PIC_WIDTH > 720 + +#define USE_WTL 0 // for WTL (needs MAX_DPB_NUM*2 frame) +#define MAX_EXTRA_FRAME_BUFFER_NUM 4 +#define MAX_PP_SRC_NUM \ + 2 // PPU buffer(decoding case) or Source buffer(encoding case) + +#define MAX_DPB_MBS 32768 // 32768 for level 4.1 + +#else + +#define USE_WTL 0 // for WTL (needs MAX_DPB_NUM*2 frame) +#define MAX_EXTRA_FRAME_BUFFER_NUM 4 +#define MAX_PP_SRC_NUM \ + 2 // PPU buffer(decoding case) or Source buffer(encoding case) + +#define MAX_DPB_MBS 32768 // 32768 for level 4.1 + +#endif + +// codec specific configuration +#define VPU_REORDER_ENABLE \ + 1 // it can be set to 1 to handle reordering DPB in host side. + +#define VPU_REORDER_DISABLE \ + 0 // it can be set to 0 to disable reordering DPB in host side. + +#define VPU_GMC_PROCESS_METHOD 0 +#define VPU_AVC_X264_SUPPORT 1 + +// DRAM configuration for TileMap access +#define EM_RAS 13 +#define EM_BANK 3 +#define EM_CAS 10 +#define EM_WIDTH 2 + +// DDR3 3BA, DDR4 1BG+2BA +//#define EM_RAS 16 +//#define EM_BANK 3 +//#define EM_CAS 10 +//#define EM_WIDTH 3 + +// DDR3 4BA, DDR4 2BG+2BA +//#define EM_RAS 15 +//#define EM_BANK 4 +//#define EM_CAS 10 +//#define EM_WIDTH 3 + +/************************************************************************/ +/* VPU_ME_LINEBUFFER_MODE configuration +Config_0 +- LINE_BUFFER : 72kbyte +- IME_SR_MEM : 13.75kbyte +- Config_0: 36 lines +- search range y is -16 ~ 15. + +Config_1 +- LINE_BUFFER : 136kbyte +- IME_SR_MEM : 8.25kbyte +- Config_1: 68 lines +- search range y is -32 ~ 31. + +Config_2 +- LINE_BUFFER : 200kbyte +- IME_SR_MEM : 2.75kbyt +- Config_2: 100 lines +- search range y is -48 ~ 47. */ +/************************************************************************/ +#define VPU_ME_LINEBUFFER_MODE 0 + +#define VPU_GBU_SIZE 1024 + +//********************************************// +// External Memory Map Table +//********************************************// +#define CODE_BUF_SIZE (272 * 1024) +#define TEMP_BUF_SIZE (470 * 1024) +#define WORK_BUF_SIZE (80 * 1024) +#define PARA_BUF_SIZE (10 * 1024) + +//=====2. VPU BITSTREAM MEMORY ===================// +#define MAX_STREAM_BUF_SIZE 0x300000 // max bitstream size + +//===== 3. VPU PPS Save Size ===================// +//----- SPS/PPS save buffer --------------------// +#define PS_SAVE_SIZE ((320 + 8) * 1024 * 4) + // sps[64], pps[256], backupPsBuf[8] for + // rollback, error concealment (each 4Kbyte) +//----- VP8 MB save buffer -------------------// +#define VP8_MB_SAVE_SIZE (17 * 4 * ((MAX_DEC_PIC_WIDTH * MAX_DEC_PIC_HEIGHT) >> 8)) + // MB information + + // split + // MVs)*4*MbNumbyte +//----- slice save buffer --------------------// +#define SLICE_SAVE_SIZE ((MAX_DEC_PIC_WIDTH * MAX_DEC_PIC_HEIGHT * 3) >> 2) + // this buffer for + // ASO/FMO + +//=====5. VPU Encoder Scratch buffer ssize ======================// +#define SIZE_AVCENC_QMAT_TABLE ((16 * 6) + (64 * 2)) // 4x4 6, 8x8 2 +#define SIZE_MP4ENC_DATA_PARTITION \ + ((MAX_ENC_PIC_WIDTH * MAX_ENC_PIC_HEIGHT * 3) >> 2) + +//=====6. Check VPU required memory size =======================// +#define MAX_FRM_SIZE ((MAX_DEC_PIC_WIDTH * MAX_DEC_PIC_HEIGHT * 3) >> 1) +#define MAX_DEC_FRAME_BUFFERING \ + (MAX_DPB_MBS / ((MAX_DEC_PIC_WIDTH * MAX_DEC_PIC_HEIGHT) >> 8)) +#define MAX_DPB_NUM \ + (16 < MAX_DEC_FRAME_BUFFERING ? \ + (16 + 2 + MAX_EXTRA_FRAME_BUFFER_NUM) : \ + (MAX_DEC_FRAME_BUFFERING + 2 + \ + MAX_EXTRA_FRAME_BUFFER_NUM)) + // (+2 for current and display_delay) +#define MAX_DPB_SIZE \ + (((MAX_FRM_SIZE + 0x3fff) & (~0x3fff)) * MAX_DPB_NUM) + // frame buffer + // for codec + // (MAX_DPB_NUM) +#define MAX_MV_COL_SIZE (((MAX_FRM_SIZE + 4) / 5) * MAX_DPB_NUM) +#define MAX_PP_SRC_SIZE (((MAX_FRM_SIZE + 0x3fff) & (~0x3fff)) * MAX_PP_SRC_NUM) + +#define CODEC_FRAME_BASE \ + ((((MAX_STREAM_BUF_SIZE * MAX_NUM_INSTANCE)) + 0xff) & (~0xff)) +#define REQUIRED_VPU_MEMORY_SIZE \ + (CODEC_FRAME_BASE + ((MAX_DPB_SIZE * (1 + USE_WTL)) + \ + MAX_MV_COL_SIZE + MAX_PP_SRC_SIZE) * \ + MAX_NUM_INSTANCE) + +#endif /* __CODA9_VPU_CONFIG_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/product.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/product.c new file mode 100644 index 0000000000..77cbc43fb2 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/product.c @@ -0,0 +1,2063 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized copies. +// +//--=========================================================================-- +#include "product.h" +#include "wave/common/common.h" +#include "wave/wave4/wave4.h" +#include "coda9/coda9.h" + +#define UNREFERENCED_PARAM(x) ((void)(x)) + +extern void vpu_set_channel_core_mapping(int chnIdx, int coreIdx); + +VpuAttr g_VpuCoreAttributes[MAX_NUM_VPU_CORE]; + +static Int32 s_ProductIds[MAX_NUM_VPU_CORE] = { [0 ... MAX_NUM_VPU_CORE - 1] = + PRODUCT_ID_NONE }; + +typedef struct FrameBufInfoStruct { + Uint32 unitSizeHorLuma; + Uint32 sizeLuma; + Uint32 sizeChroma; + BOOL fieldMap; +} FrameBufInfo; + +Uint32 ProductVpuScan(Uint32 coreIdx) +{ + Uint32 productId = 0; + Uint32 foundProducts = 0; + + /* Already scanned */ + if (s_ProductIds[coreIdx] != PRODUCT_ID_NONE) + return 1; + + if (CORE_H265 == coreIdx) { + productId = WaveVpuGetProductId(CORE_H265); + } else if (CORE_H264 == coreIdx) { + productId = Coda9VpuGetProductId(CORE_H264); + } + + if (productId != PRODUCT_ID_NONE) { + s_ProductIds[coreIdx] = productId; + foundProducts++; + } + + return (foundProducts >= 1); +} + +Int32 ProductVpuGetId(Uint32 coreIdx) +{ + return s_ProductIds[coreIdx]; +} + +void ProductVpuSetId(Uint32 coreIdx, Uint32 productId) +{ + CVI_VC_INFO("set productId %d\n", productId); + + s_ProductIds[coreIdx] = productId; +} + +RetCode ProductVpuGetVersion(Uint32 coreIdx, Uint32 *versionInfo, + Uint32 *revision) +{ + Int32 productId = s_ProductIds[coreIdx]; + RetCode ret = RETCODE_SUCCESS; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuGetVersion(coreIdx, versionInfo, revision); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuGetVersion(coreIdx, versionInfo, revision); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} +#ifdef DRAM_TEST +RetCode ProductVpuDRAMReadWriteTest(Uint32 coreIdx, Uint32 *dram_source_addr, + Uint32 *dram_destination_addr, + Uint32 *dram_data_size) +{ + Int32 productId = s_ProductIds[coreIdx]; + RetCode ret = RETCODE_SUCCESS; + + switch (productId) { + case PRODUCT_ID_960: + case PRODUCT_ID_980: + break; + case PRODUCT_ID_410: + case PRODUCT_ID_4102: + case PRODUCT_ID_510: + ret = Wave4VpuDRAMReadWriteTest(coreIdx, dram_source_addr, + dram_destination_addr, + dram_data_size); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} +#endif + +RetCode ProductVpuInit(Uint32 coreIdx, void *firmware, Uint32 size) +{ + RetCode ret = RETCODE_SUCCESS; + int productId; + + CVI_VC_INFO("\n"); + + productId = s_ProductIds[coreIdx]; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuInit(coreIdx, firmware, size); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuInit(coreIdx, firmware, size); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +RetCode ProductVpuReInit(Uint32 coreIdx, void *firmware, Uint32 size) +{ + RetCode ret = RETCODE_SUCCESS; + int productId; + + CVI_VC_INFO("\n"); + + productId = s_ProductIds[coreIdx]; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuReInit(coreIdx, firmware, size); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuReInit(coreIdx, firmware, size); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +Uint32 ProductVpuIsInit(Uint32 coreIdx) +{ + Uint32 pc = 0; + int productId; + + productId = s_ProductIds[coreIdx]; + + if (productId == PRODUCT_ID_NONE) { + ProductVpuScan(coreIdx); + productId = s_ProductIds[coreIdx]; + } + + switch (productId) { + case PRODUCT_ID_980: + pc = Coda9VpuIsInit(coreIdx); + break; + case PRODUCT_ID_420L: + pc = Wave4VpuIsInit(coreIdx); + break; + } + + return pc; +} + +Int32 ProductVpuIsBusy(Uint32 coreIdx) +{ + Int32 busy; + int productId; + + productId = s_ProductIds[coreIdx]; + + switch (productId) { + case PRODUCT_ID_980: + busy = Coda9VpuIsBusy(coreIdx); + break; + case PRODUCT_ID_420L: + busy = Wave4VpuIsBusy(coreIdx); + break; + default: + busy = 0; + break; + } + + return busy; +} + +Int32 ProductVpuGetFrameCycle(Uint32 coreIdx) +{ + int productId; + int flag = -1; + + productId = s_ProductIds[coreIdx]; + + CVI_VC_BS("\n"); + + switch (productId) { + case PRODUCT_ID_980: + flag = Coda9VpuGetFrameCycle(coreIdx); + break; + case PRODUCT_ID_420L: + flag = Wave4VpuGetFrameCycle(coreIdx); + break; + default: + flag = -1; + break; + } + + return flag; +} + +Int32 ProductVpuWaitInterrupt(CodecInst *instance, Int32 timeout) +{ + int productId; + int flag = -1; + + productId = s_ProductIds[instance->coreIdx]; + + CVI_VC_BS("\n"); + + switch (productId) { + case PRODUCT_ID_980: + flag = Coda9VpuWaitInterrupt(instance, timeout); + break; + case PRODUCT_ID_420L: + flag = Wave4VpuWaitInterrupt(instance, timeout); + break; + default: + flag = -1; + break; + } + + return flag; +} + +#if 0 +Int32 ProductVpuGetFd(CodecInst *instance) +{ + int productId; + int fd = -1; + + productId = s_ProductIds[instance->coreIdx]; + + switch (productId) { + case PRODUCT_ID_960: + case PRODUCT_ID_980: + break; + case PRODUCT_ID_420L: + fd = Wave4VpuGetFd(instance); + break; + default: + fd = -1; + break; + } + + return fd; +} +#endif + +RetCode ProductVpuReset(Uint32 coreIdx, SWResetMode resetMode) +{ + int productId; + RetCode ret = RETCODE_SUCCESS; + + CVI_VC_INFO("resetMode %d\n", resetMode); + + productId = s_ProductIds[coreIdx]; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuReset(coreIdx, resetMode); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuReset(coreIdx, resetMode); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +#ifdef REDUNDENT_CODE +RetCode ProductVpuSleepWake(Uint32 coreIdx, int iSleepWake, const Uint16 *code, + Uint32 size) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + CVI_VC_INFO("iSleepWake %d\n", iSleepWake); + + productId = s_ProductIds[coreIdx]; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuSleepWake(coreIdx, iSleepWake, (void *)code, + size); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuSleepWake(coreIdx, iSleepWake, size); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} +#endif + +RetCode ProductVpuSleepWake_EX(Uint32 coreIdx, int iSleepWake, + const Uint16 *code, Uint32 size) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + Uint64 start_time, end_time; + + start_time = cviGetCurrentTime(); + + CVI_VC_LOCK("iSleepWake %d\n", iSleepWake); + + productId = s_ProductIds[coreIdx]; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuSleepWake_EX(coreIdx, iSleepWake, (void *)code, + size); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuSleepWake_EX(coreIdx, iSleepWake, size); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + end_time = cviGetCurrentTime(); + CVI_VC_PERF("SleepWake(%d) = %llu us\n", iSleepWake, + end_time - start_time); + + return ret; +} + +RetCode ProductVpuClearInterrupt(Uint32 coreIdx) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + productId = s_ProductIds[coreIdx]; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuClearInterrupt(coreIdx); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuClearInterrupt(coreIdx, 0xffff); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +RetCode ProductVpuDecBuildUpOpenParam(CodecInst *pCodec, DecOpenParam *param) +{ + Int32 productId; + Uint32 coreIdx; + RetCode ret = RETCODE_NOT_SUPPORTED_FEATURE; + + coreIdx = pCodec->coreIdx; + productId = s_ProductIds[coreIdx]; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuBuildUpDecParam(pCodec, param); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuBuildUpDecParam(pCodec, param); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +RetCode ProductVpuEncBuildUpOpenParam(CodecInst *pCodec, EncOpenParam *param) +{ + Int32 productId; + Uint32 coreIdx; + RetCode ret = RETCODE_NOT_SUPPORTED_FEATURE; + + coreIdx = pCodec->coreIdx; + productId = s_ProductIds[coreIdx]; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuBuildUpEncParam(pCodec, param); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuBuildUpEncParam(pCodec, param); + break; + default: + ret = RETCODE_NOT_SUPPORTED_FEATURE; + } + + return ret; +} + +RetCode ProductCheckDecOpenParam(DecOpenParam *param) +{ + Int32 productId; + Uint32 coreIdx; + VpuAttr *pAttr; + + if (param == 0) { + CVI_VC_ERR("param = 0\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->coreIdx > MAX_NUM_VPU_CORE) { + CVI_VC_ERR("coreIdx > MAX_NUM_VPU_CORE\n"); + return RETCODE_INVALID_PARAM; + } + + coreIdx = param->coreIdx; + productId = s_ProductIds[coreIdx]; + pAttr = &g_VpuCoreAttributes[coreIdx]; + + if (param->bitstreamBuffer % 8) { + CVI_VC_ERR("bitstreamBuffer %% 8 != 0\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->bitstreamMode == BS_MODE_INTERRUPT) { + if (param->bitstreamBufferSize % 1024 || + param->bitstreamBufferSize < 1024) { + CVI_VC_ERR("bitstreamBufferSize\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (PRODUCT_ID_W_SERIES(productId)) { + if (param->virtAxiID > 16) { + // Maximum number of AXI channels is 15 + return RETCODE_INVALID_PARAM; + } + } + + // Check bitstream mode + if ((pAttr->supportBitstreamMode & (1 << param->bitstreamMode)) == 0) { + CVI_VC_ERR("bitstreamMode\n"); + return RETCODE_INVALID_PARAM; + } + + if ((pAttr->supportDecoders & (1 << param->bitstreamFormat)) == 0) { + CVI_VC_ERR("bitstreamFormat\n"); + return RETCODE_INVALID_PARAM; + } + + /* check framebuffer endian */ + if ((pAttr->supportEndianMask & (1 << param->frameEndian)) == 0) { + CVI_VC_ERR("Invalid frame endian\n"); + APIDPRINT("%s:%d Invalid frame endian(%d)\n", + (Int32)param->frameEndian); + return RETCODE_INVALID_PARAM; + } + + /* check streambuffer endian */ + if ((pAttr->supportEndianMask & (1 << param->streamEndian)) == 0) { + CVI_VC_ERR("streamEndian\n"); + APIDPRINT("%s:%d Invalid stream endian(%d)\n", + (Int32)param->streamEndian); + return RETCODE_INVALID_PARAM; + } + + /* check WTL */ + if (param->wtlEnable) { + if (pAttr->supportWTL == 0) + return RETCODE_NOT_SUPPORTED_FEATURE; + switch (productId) { + case PRODUCT_ID_960: + case PRODUCT_ID_980: + case PRODUCT_ID_320: + if (param->wtlMode != FF_FRAME && + param->wtlMode != FF_FIELD) { + CVI_VC_ERR("wtlMode\n"); + return RETCODE_INVALID_PARAM; + } + default: + break; + } + } + + /* Tiled2Linear */ + if (param->tiled2LinearEnable) { + if (pAttr->supportTiled2Linear == 0) { + CVI_VC_ERR("supportTiled2Linear == 0\n"); + return RETCODE_NOT_SUPPORTED_FEATURE; + } + + if (productId == PRODUCT_ID_960 || + productId == PRODUCT_ID_980 || + productId == PRODUCT_ID_320) { + if (param->tiled2LinearMode != FF_FRAME && + param->tiled2LinearMode != FF_FIELD) { + CVI_VC_ERR("tiled2LinearMode\n"); + APIDPRINT( + "%s:%d Invalid Tiled2LinearMode(%d)\n", + (Int32)param->tiled2LinearMode); + return RETCODE_INVALID_PARAM; + } + } + } + if (productId == PRODUCT_ID_960 || productId == PRODUCT_ID_980 || + productId == PRODUCT_ID_7Q) { + if (param->mp4DeblkEnable == 1 && + !(param->bitstreamFormat == STD_MPEG4 || + param->bitstreamFormat == STD_H263 || + param->bitstreamFormat == STD_MPEG2 || + param->bitstreamFormat == STD_DIV3)) { + CVI_VC_ERR("bitstreamFormat\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->wtlEnable && param->tiled2LinearEnable) { + CVI_VC_ERR("wtlEnable / tiled2LinearEnable\n"); + return RETCODE_INVALID_PARAM; + } + } +#ifdef REDUNDENT_CODE + else { + if (param->mp4DeblkEnable || param->mp4Class) { + CVI_VC_ERR("mp4DeblkEnable / mp4Class\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->avcExtension) { + CVI_VC_ERR("avcExtension\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->tiled2LinearMode != FF_NONE) { + CVI_VC_ERR("tiled2LinearMode\n"); + return RETCODE_INVALID_PARAM; + } + } +#endif + + return RETCODE_SUCCESS; +} + +RetCode ProductVpuDecInitSeq(CodecInst *instance) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + productId = instance->productId; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuDecInitSeq(instance); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuDecInitSeq(instance); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +RetCode ProductVpuDecFiniSeq(CodecInst *instance) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + productId = instance->productId; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuFiniSeq(instance); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuDecFiniSeq(instance); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +RetCode ProductVpuDecGetSeqInfo(CodecInst *instance, DecInitialInfo *info) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + productId = instance->productId; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuDecGetSeqInfo(instance, info); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuDecGetSeqInfo(instance, info); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +RetCode ProductVpuDecCheckCapability(CodecInst *instance) +{ + DecInfo *pDecInfo; + VpuAttr *pAttr = &g_VpuCoreAttributes[instance->coreIdx]; + + pDecInfo = &instance->CodecInfo->decInfo; + + if ((pAttr->supportDecoders & + (1 << pDecInfo->openParam.bitstreamFormat)) == 0) + return RETCODE_NOT_SUPPORTED_FEATURE; + + switch (instance->productId) { + case PRODUCT_ID_980: + if (pDecInfo->mapType >= COMPRESSED_FRAME_MAP) + return RETCODE_NOT_SUPPORTED_FEATURE; + break; + case PRODUCT_ID_420L: + if (pDecInfo->mapType != LINEAR_FRAME_MAP && + pDecInfo->mapType != COMPRESSED_FRAME_MAP) + return RETCODE_NOT_SUPPORTED_FEATURE; + break; + } + + return RETCODE_SUCCESS; +} + +RetCode ProductVpuDecode(CodecInst *instance, DecParam *option) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + vpu_set_channel_core_mapping(instance->s32ChnNum, instance->coreIdx); + + productId = instance->productId; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuDecode(instance, option); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuDecode(instance, option); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +RetCode ProductVpuDecGetResult(CodecInst *instance, DecOutputInfo *result) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + vpu_set_channel_core_mapping(instance->s32ChnNum, -1); + + productId = instance->productId; + + switch (productId) { + case PRODUCT_ID_980: + ret = Coda9VpuDecGetResult(instance, result); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuDecGetResult(instance, result); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + result->decHwTime = instance->u64EndTime - instance->u64StartTime; + CVI_VC_PERF("decHwTime %llu\n", result->decHwTime); + + return ret; +} + +RetCode ProductVpuDecFlush(CodecInst *instance, FramebufferIndex *retIndexes, + Uint32 size) +{ + RetCode ret = RETCODE_SUCCESS; + + switch (instance->productId) { + case PRODUCT_ID_420L: + ret = Wave4VpuDecFlush(instance, retIndexes, size); + break; + default: + ret = Coda9VpuDecFlush(instance, retIndexes, size); + break; + } + + return ret; +} + +/************************************************************************/ +/* Decoder & Encoder */ +/************************************************************************/ + +RetCode ProductVpuDecSetBitstreamFlag(CodecInst *instance, BOOL running, + Int32 size) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + BOOL eos; + BOOL checkEos; + BOOL explicitEnd; + DecInfo *pDecInfo = &instance->CodecInfo->decInfo; + + productId = instance->productId; + + eos = (BOOL)(size == 0); + checkEos = (BOOL)(size > 0); + explicitEnd = (BOOL)(size == -2); + + switch (productId) { + case PRODUCT_ID_980: + if (checkEos) + eos = (BOOL)((pDecInfo->streamEndflag & 0x04) == 0x04); + ret = Coda9VpuDecSetBitstreamFlag(instance, running, eos); + break; + case PRODUCT_ID_420L: + if (checkEos) + eos = (BOOL)pDecInfo->streamEndflag; + ret = Wave4VpuDecSetBitstreamFlag(instance, running, eos, + explicitEnd); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + return ret; +} + +#ifdef REDUNDENT_CODE +RetCode ProductCpbFlush(CodecInst *instance) +{ + RetCode ret; + + switch (instance->productId) { + case PRODUCT_ID_980: + ret = Coda9VpuDecCpbFlush(instance); + break; + default: + ret = RETCODE_NOT_SUPPORTED_FEATURE; + break; + } + + return ret; +} +#endif + +/** + * \param stride stride of framebuffer in pixel. + */ +RetCode ProductVpuAllocateFramebuffer( + CodecInst *inst, FrameBuffer *fbArr, TiledMapType mapType, Int32 num, + Int32 stride, Int32 height, FrameBufferFormat format, + BOOL cbcrInterleave, BOOL nv21, Int32 endian, vpu_buffer_t *vb, + Int32 gdiIndex, FramebufferAllocType fbType) +{ + Int32 i; +#ifdef REDUNDENT_CODE + Uint32 coreIdx; +#endif + vpu_buffer_t vbFrame; + FrameBufInfo fbInfo; + DecInfo *pDecInfo = &inst->CodecInfo->decInfo; + EncInfo *pEncInfo = &inst->CodecInfo->encInfo; + // Variables for TILED_FRAME/FILED_MB_RASTER + Uint32 sizeLuma; + Uint32 sizeChroma; +#ifdef REDUNDENT_CODE + ProductId productId = (ProductId)inst->productId; +#endif + RetCode ret = RETCODE_SUCCESS; + + osal_memset((void *)&vbFrame, 0x00, sizeof(vpu_buffer_t)); + osal_memset((void *)&fbInfo, 0x00, sizeof(FrameBufInfo)); + +#ifdef REDUNDENT_CODE + coreIdx = inst->coreIdx; +#else + UNREFERENCED_PARAM(vb); + UNREFERENCED_PARAM(fbType); +#endif + + if (inst->codecMode == AVC_ENC) + format = pEncInfo->openParam.EncStdParam.avcParam + .chromaFormat400 ? + FORMAT_400 : + FORMAT_420; +#ifdef REDUNDENT_CODE + if (inst->codecMode == C7_VP9_DEC) { + Uint32 framebufHeight = VPU_ALIGN64(height); + sizeLuma = CalcLumaSize(inst->productId, stride, framebufHeight, + cbcrInterleave, mapType, NULL); + sizeChroma = + CalcChromaSize(inst->productId, stride, framebufHeight, + format, cbcrInterleave, mapType, NULL); + } else +#endif + { + DRAMConfig *dramConfig = NULL; +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + dramConfig = &pDecInfo->dramCfg; + dramConfig = (inst->isDecoder == TRUE) ? + &pDecInfo->dramCfg : + &pEncInfo->dramCfg; + } +#endif + sizeLuma = CalcLumaSize(inst->productId, stride, height, + cbcrInterleave, mapType, dramConfig); + sizeChroma = + CalcChromaSize(inst->productId, stride, height, format, + cbcrInterleave, mapType, dramConfig); + } + + // Framebuffer common informations + for (i = 0; i < num; i++) { + if (fbArr[i].updateFbInfo == TRUE) { + fbArr[i].updateFbInfo = FALSE; + fbArr[i].myIndex = i + gdiIndex; + CVI_VC_TRACE("fbArr[%d], myIndex = %d\n", i, + fbArr[i].myIndex); + + fbArr[i].stride = stride; + fbArr[i].height = height; + fbArr[i].mapType = mapType; + fbArr[i].format = format; + fbArr[i].cbcrInterleave = + (mapType == COMPRESSED_FRAME_MAP ? + TRUE : + cbcrInterleave); + fbArr[i].nv21 = nv21; + fbArr[i].endian = endian; + fbArr[i].lumaBitDepth = + pDecInfo->initialInfo.lumaBitdepth; + fbArr[i].chromaBitDepth = + pDecInfo->initialInfo.chromaBitdepth; + fbArr[i].sourceLBurstEn = FALSE; + if (inst->codecMode == HEVC_ENC) { + if (gdiIndex != 0) { // FB_TYPE_PPU + fbArr[i].srcBufState = + SRC_BUFFER_ALLOCATED; + } + fbArr[i].lumaBitDepth = + pEncInfo->openParam.EncStdParam + .hevcParam.internalBitDepth; + fbArr[i].chromaBitDepth = + pEncInfo->openParam.EncStdParam + .hevcParam.internalBitDepth; + } + } + } + + switch (mapType) { + case LINEAR_FRAME_MAP: + case LINEAR_FIELD_MAP: + case COMPRESSED_FRAME_MAP: + ret = AllocateLinearFrameBuffer(mapType, fbArr, num, sizeLuma, + sizeChroma); + break; + + default: + /* Tiled map */ +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + DRAMConfig *pDramCfg; + PhysicalAddress tiledBaseAddr = 0; + TiledMapConfig *pMapCfg; + + pDramCfg = (inst->isDecoder == TRUE) ? + &pDecInfo->dramCfg : + &pEncInfo->dramCfg; + pMapCfg = (inst->isDecoder == TRUE) ? + &pDecInfo->mapCfg : + &pEncInfo->mapCfg; + vbFrame.phys_addr = + GetTiledFrameBase(coreIdx, fbArr, num); + if (fbType == FB_TYPE_PPU) { + tiledBaseAddr = pMapCfg->tiledBaseAddr; + } else { + pMapCfg->tiledBaseAddr = vbFrame.phys_addr; + tiledBaseAddr = vbFrame.phys_addr; + } + *vb = vbFrame; + ret = AllocateTiledFrameBufferGdiV1( + mapType, tiledBaseAddr, fbArr, num, sizeLuma, + sizeChroma, pDramCfg); + } else +#endif + { + // PRODUCT_ID_980 + ret = AllocateTiledFrameBufferGdiV2( + mapType, fbArr, num, sizeLuma, sizeChroma); + } + break; + } + for (i = 0; i < num; i++) { + if (inst->codecMode == HEVC_ENC) { + if (gdiIndex != 0) { // FB_TYPE_PPU + APIDPRINT( + "SOURCE FB[%02d] Y(0x%08x), Cb(0x%08x), Cr(0x%08x)\n", + i, fbArr[i].bufY, fbArr[i].bufCb, + fbArr[i].bufCr); + } + } + } + return ret; +} + +RetCode ProductVpuRegisterFramebuffer(CodecInst *instance) +{ + RetCode ret = RETCODE_FAILURE; + FrameBuffer *fb; + DecInfo *pDecInfo = &instance->CodecInfo->decInfo; + Int32 gdiIndex = 0; + EncInfo *pEncInfo = &instance->CodecInfo->encInfo; + + switch (instance->productId) { + case PRODUCT_ID_980: + if (IS_DECODER_HANDLE(instance)) + ret = Coda9VpuDecRegisterFramebuffer(instance); + else + ret = Coda9VpuEncRegisterFramebuffer(instance); + break; + case PRODUCT_ID_420L: + if (instance->codecMode == HEVC_DEC) { + if (pDecInfo->mapType != COMPRESSED_FRAME_MAP) + return RETCODE_NOT_SUPPORTED_FEATURE; + + fb = pDecInfo->frameBufPool; + + gdiIndex = 0; + if (pDecInfo->wtlEnable == TRUE) { + if (fb[0].mapType == COMPRESSED_FRAME_MAP) + gdiIndex = pDecInfo->numFbsForDecoding; + ret = Wave4VpuDecRegisterFramebuffer( + instance, &fb[gdiIndex], + LINEAR_FRAME_MAP, + pDecInfo->numFbsForWTL); + if (ret != RETCODE_SUCCESS) + return ret; + gdiIndex = gdiIndex == 0 ? + pDecInfo->numFbsForDecoding : + 0; + } + ret = Wave4VpuDecRegisterFramebuffer( + instance, &fb[gdiIndex], COMPRESSED_FRAME_MAP, + pDecInfo->numFbsForDecoding); + if (ret != RETCODE_SUCCESS) + return ret; +#ifdef REDUNDENT_CODE + } else if (instance->codecMode == C7_VP9_DEC) { + if (pDecInfo->mapType != LINEAR_FRAME_MAP && + pDecInfo->mapType != COMPRESSED_FRAME_MAP && + pDecInfo->mapType != ARM_COMPRESSED_FRAME_MAP) + return RETCODE_NOT_SUPPORTED_FEATURE; + + fb = pDecInfo->frameBufPool; + + gdiIndex = 0; + if (pDecInfo->wtlEnable == TRUE) { + if (fb[0].mapType == COMPRESSED_FRAME_MAP) + gdiIndex = pDecInfo->numFbsForDecoding; + ret = Wave4VpuDecRegisterFramebuffer( + instance, &fb[gdiIndex], + LINEAR_FRAME_MAP, + pDecInfo->numFbsForWTL); + if (ret != RETCODE_SUCCESS) + return ret; + gdiIndex = gdiIndex == 0 ? + pDecInfo->numFbsForDecoding : + 0; + } + ret = Wave4VpuDecRegisterFramebuffer( + instance, &fb[gdiIndex], COMPRESSED_FRAME_MAP, + pDecInfo->numFbsForDecoding); + if (ret != RETCODE_SUCCESS) + return ret; +#endif + } else { + // ******************************************** + // HEVC_ENC + //********************************************* + if (pEncInfo->mapType != COMPRESSED_FRAME_MAP) + return RETCODE_NOT_SUPPORTED_FEATURE; + + fb = pEncInfo->frameBufPool; + + gdiIndex = 0; + ret = Wave4VpuEncRegisterFramebuffer( + instance, &fb[gdiIndex], COMPRESSED_FRAME_MAP, + pEncInfo->numFrameBuffers); + + if (ret != RETCODE_SUCCESS) + return ret; + } + + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + return ret; +} + +#ifdef REDUNDENT_CODE +RetCode ProductVpuDecUpdateFrameBuffer(void) +{ + RetCode ret = RETCODE_NOT_SUPPORTED_FEATURE; + + return ret; +} +#endif + +Int32 ProductCalculateFrameBufSize(Int32 productId, Int32 stride, Int32 height, + TiledMapType mapType, + FrameBufferFormat format, BOOL interleave, + DRAMConfig *pDramCfg) +{ + Int32 size_dpb_lum, size_dpb_chr, size_dpb_all; +#ifdef REDUNDENT_CODE + Int32 size_mvcolbuf = 0; +#endif + + size_dpb_lum = CalcLumaSize(productId, stride, height, interleave, + mapType, pDramCfg); + size_dpb_chr = CalcChromaSize(productId, stride, height, format, + interleave, mapType, pDramCfg); + size_dpb_all = size_dpb_lum + size_dpb_chr * 2; + + CVI_VC_MEM( + "size_dpb_lum = 0x%X, size_dpb_chr = 0x%X, size_dpb_all = 0x%X, productId = %d\n", + size_dpb_lum, size_dpb_chr, size_dpb_all, productId); + +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_320) { + size_mvcolbuf = VPU_ALIGN32(stride) * VPU_ALIGN32(height); + size_mvcolbuf = (size_mvcolbuf * 3) >> 1; + size_mvcolbuf = (size_mvcolbuf + 4) / 5; + size_mvcolbuf = VPU_ALIGN8(size_mvcolbuf); + size_dpb_all += size_mvcolbuf; + } +#endif + + return size_dpb_all; +} + +Int32 ProductCalculateAuxBufferSize(AUX_BUF_TYPE type, CodStd codStd, + Int32 width, Int32 height) +{ + Int32 size = 0; + + switch (type) { + case AUX_BUF_TYPE_MVCOL: + if (codStd == STD_AVC || codStd == STD_VC1 || + codStd == STD_MPEG4 || codStd == STD_H263 || + codStd == STD_RV || codStd == STD_AVS) { + size = VPU_ALIGN32(width) * VPU_ALIGN32(height); + size = (size * 3) >> 1; + size = (size + 4) / 5; + size = ((size + 7) >> 3) << 3; + } else if (codStd == STD_HEVC) { + size = WAVE4_DEC_HEVC_MVCOL_BUF_SIZE(width, height); +#ifdef REDUNDENT_CODE + } else if (codStd == STD_VP9) { + size = WAVE4_DEC_VP9_MVCOL_BUF_SIZE(width, height); +#endif + } else { + size = 0; + } + break; + case AUX_BUF_TYPE_FBC_Y_OFFSET: + size = WAVE4_FBC_LUMA_TABLE_SIZE(width, height); + break; + case AUX_BUF_TYPE_FBC_C_OFFSET: + size = WAVE4_FBC_CHROMA_TABLE_SIZE(width, height); + break; + } + + return size; +} + +RetCode ProductClrDispFlag(void) +{ + RetCode ret = RETCODE_SUCCESS; + return ret; +} + +#ifdef REDUNDENT_CODE +RetCode ProductSetDispFlag(void) +{ + RetCode ret = RETCODE_SUCCESS; + return ret; +} +#endif + +/************************************************************************/ +/* ENCODER */ +/************************************************************************/ +RetCode ProductCheckEncOpenParam(EncOpenParam *pop) +{ + Int32 coreIdx; + Int32 picWidth; + Int32 picHeight; + Int32 productId; + VpuAttr *pAttr; + + if (pop == 0) + return RETCODE_INVALID_PARAM; + + if (pop->coreIdx > MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + coreIdx = pop->coreIdx; + picWidth = pop->picWidth; + picHeight = pop->picHeight; + productId = s_ProductIds[coreIdx]; + pAttr = &g_VpuCoreAttributes[coreIdx]; + + if ((pAttr->supportEncoders & (1 << pop->bitstreamFormat)) == 0) { + CVI_VC_ERR( + "supportEncoders, supportEncoders = %d, bitstreamFormat = %d\n", + pAttr->supportEncoders, pop->bitstreamFormat); + return RETCODE_NOT_SUPPORTED_FEATURE; + } + + if (pop->ringBufferEnable == TRUE) { + if (pop->bitstreamBuffer % 8) { + CVI_VC_ERR("bitstreamBuffer %% 8\n"); + return RETCODE_INVALID_PARAM; + } + + if (productId == PRODUCT_ID_420 || + productId == PRODUCT_ID_420L || + productId == PRODUCT_ID_520) { + if (pop->bitstreamBuffer % 16) { + CVI_VC_ERR("bitstreamBuffer %% 16\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (productId == PRODUCT_ID_420 || + productId == PRODUCT_ID_420L || + productId == PRODUCT_ID_520) { + if (pop->bitstreamBufferSize < (1024 * 64)) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (pop->bitstreamBufferSize % 1024 || + pop->bitstreamBufferSize < 1024) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (productId == PRODUCT_ID_980 && + pop->bitstreamBufferSize < H264_MIN_BITSTREAM_SIZE) { + CVI_VC_ERR("bsSize (0x%x) is smaller than HW limitation (0x%x)", + pop->bitstreamBufferSize, H264_MIN_BITSTREAM_SIZE); + return RETCODE_INVALID_PARAM; + } else if (productId == PRODUCT_ID_420L && + pop->bitstreamBufferSize < H265_MIN_BITSTREAM_SIZE) { + CVI_VC_ERR("bsSize (0x%x) is smaller than HW limitation (0x%x)", + pop->bitstreamBufferSize, H265_MIN_BITSTREAM_SIZE); + return RETCODE_INVALID_PARAM; + } + + if (pop->frameRateInfo == 0) { + CVI_VC_ERR("frameRateInfo = 0\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->bitstreamFormat == STD_AVC) { + if (productId == PRODUCT_ID_980 || + productId == PRODUCT_ID_320) { + // RC bitrate setting check + if (pop->bitRate > 524288 || pop->bitRate < 0) { + CVI_VC_ERR( + "wrong bitRate setting! bitRate = %d\n", + pop->bitRate); + return RETCODE_INVALID_PARAM; + } + } + if (pop->set_dqp_pic_num == 0) { + CVI_VC_ERR("set_dqp_pic_num must larger than 0"); + return RETCODE_INVALID_PARAM; + } + // temporal layer coding constraint + if (pop->gopPreset >= 2 && + (pop->gopSize % pop->set_dqp_pic_num) != 0) { + CVI_VC_ERR( + "gopSize should be multiple of %d for %d T-layer\n", + pop->set_dqp_pic_num, pop->gopPreset); + return RETCODE_INVALID_PARAM; + } + + if (pop->LongTermPeriod > 0 && pop->gopSize > 0) { + if (pop->gopSize % pop->LongTermPeriod != 0) { + CVI_VC_ERR( + "gopSize %d should be LongTermPeriod %d\n", + pop->gopSize, pop->LongTermPeriod); + return RETCODE_INVALID_PARAM; + } + } + + if (pop->gopPreset >= 2 && pop->VirtualIPeriod > 0) { + if (pop->VirtualIPeriod % pop->set_dqp_pic_num != 0) { + CVI_VC_ERR( + "VirtualIPeriod should be multiple of %d for %d T-layer\n", + pop->set_dqp_pic_num, pop->gopPreset); + return RETCODE_INVALID_PARAM; + } + if (pop->gopPreset == 3) { + CVI_VC_ERR( + "not support 3 Tlayer coding with smartP structure\n"); + return RETCODE_INVALID_PARAM; + } + } + } else if (pop->bitstreamFormat == STD_HEVC) { + if (productId == PRODUCT_ID_420 || + productId == PRODUCT_ID_420L || + productId == PRODUCT_ID_520) { + if (pop->bitRate > 700000 || pop->bitRate < 0) { + CVI_VC_ERR( + "wrong bitRate setting! bitRate = %d\n", + pop->bitRate); + return RETCODE_INVALID_PARAM; + } + } + } else { + if (pop->bitRate > 32767 || pop->bitRate < 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (pop->bitRate != 0 && pop->initialDelay > 32767) { + CVI_VC_ERR("wrong initialDelay setting! initialDelay = %d\n", + pop->initialDelay); + return RETCODE_INVALID_PARAM; + } + + if (pop->bitRate != 0 && pop->initialDelay != 0 && + pop->vbvBufferSize < 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->frameSkipDisable != 0 && pop->frameSkipDisable != 1) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->sliceMode.sliceMode != 0 && pop->sliceMode.sliceMode != 1) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->sliceMode.sliceMode == 1) { + if (pop->sliceMode.sliceSizeMode != 0 && + pop->sliceMode.sliceSizeMode != 1) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + if (pop->sliceMode.sliceSizeMode == 1 && + pop->sliceMode.sliceSize == 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (pop->intraRefresh < 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->MEUseZeroPmv != 0 && pop->MEUseZeroPmv != 1) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->intraCostWeight < 0 || pop->intraCostWeight >= 65535) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (productId == PRODUCT_ID_980 || productId == PRODUCT_ID_320) { + if (pop->MESearchRangeX < 0 || pop->MESearchRangeX > 4) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + if (pop->MESearchRangeY < 0 || pop->MESearchRangeY > 3) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } else { + if (pop->MESearchRange < 0 || pop->MESearchRange >= 4) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + +#ifdef REDUNDENT_CODE + if (pop->bitstreamFormat == STD_MPEG4) { + EncMp4Param *param = &pop->EncStdParam.mp4Param; + if (param->mp4DataPartitionEnable != 0 && + param->mp4DataPartitionEnable != 1) { + return RETCODE_INVALID_PARAM; + } + if (param->mp4DataPartitionEnable == 1) { + if (param->mp4ReversibleVlcEnable != 0 && + param->mp4ReversibleVlcEnable != 1) { + return RETCODE_INVALID_PARAM; + } + } + if (param->mp4IntraDcVlcThr < 0 || + 7 < param->mp4IntraDcVlcThr) { + return RETCODE_INVALID_PARAM; + } + + if (picWidth < MIN_ENC_PIC_WIDTH || + picWidth > MAX_ENC_PIC_WIDTH) { + return RETCODE_INVALID_PARAM; + } + + if (picHeight < MIN_ENC_PIC_HEIGHT) { + return RETCODE_INVALID_PARAM; + } + } else if (pop->bitstreamFormat == STD_H263) { + EncH263Param *param = &pop->EncStdParam.h263Param; + Uint32 frameRateInc, frameRateRes; + + if (param->h263AnnexJEnable != 0 && + param->h263AnnexJEnable != 1) { + return RETCODE_INVALID_PARAM; + } + if (param->h263AnnexKEnable != 0 && + param->h263AnnexKEnable != 1) { + return RETCODE_INVALID_PARAM; + } + if (param->h263AnnexTEnable != 0 && + param->h263AnnexTEnable != 1) { + return RETCODE_INVALID_PARAM; + } + + if (picWidth < MIN_ENC_PIC_WIDTH || + picWidth > MAX_ENC_PIC_WIDTH) { + return RETCODE_INVALID_PARAM; + } + if (picHeight < MIN_ENC_PIC_HEIGHT) { + return RETCODE_INVALID_PARAM; + } + + frameRateInc = ((pop->frameRateInfo >> 16) & 0xFFFF) + 1; + frameRateRes = pop->frameRateInfo & 0xFFFF; + + if ((frameRateRes / frameRateInc) < 15) { + return RETCODE_INVALID_PARAM; + } + } else +#endif + if (pop->bitstreamFormat == STD_AVC) { + EncAvcParam *param = &pop->EncStdParam.avcParam; + + AvcPpsParam *ActivePPS = NULL; + + if (productId == PRODUCT_ID_980) + ActivePPS = ¶m->ppsParam[0]; + + if (param->constrainedIntraPredFlag != 0 && + param->constrainedIntraPredFlag != 1) + return RETCODE_INVALID_PARAM; + if (param->disableDeblk != 0 && param->disableDeblk != 1 && + param->disableDeblk != 2) + return RETCODE_INVALID_PARAM; + if (param->deblkFilterOffsetAlpha < -6 || + 6 < param->deblkFilterOffsetAlpha) + return RETCODE_INVALID_PARAM; + if (param->deblkFilterOffsetBeta < -6 || + 6 < param->deblkFilterOffsetBeta) + return RETCODE_INVALID_PARAM; + if (param->chromaQpOffset < -12 || 12 < param->chromaQpOffset) + return RETCODE_INVALID_PARAM; + if (param->audEnable != 0 && param->audEnable != 1) + return RETCODE_INVALID_PARAM; + if (param->frameCroppingFlag != 0 && + param->frameCroppingFlag != 1) + return RETCODE_INVALID_PARAM; + if (param->frameCropLeft & 0x01 || + param->frameCropRight & 0x01 || + param->frameCropTop & 0x01 || + param->frameCropBottom & 0x01) { + return RETCODE_INVALID_PARAM; + } + + if (productId == PRODUCT_ID_980 || + productId == PRODUCT_ID_320) { + if (picWidth < MIN_ENC_PIC_WIDTH || + picWidth > MAX_ENC_AVC_PIC_WIDTH) { + CVI_VC_ERR("picWidth = %d\n", picWidth); + return RETCODE_INVALID_PARAM; + } + if (picHeight < MIN_ENC_PIC_HEIGHT || + picHeight > MAX_ENC_AVC_PIC_HEIGHT) { + CVI_VC_ERR("picHeight = %d\n", picHeight); + return RETCODE_INVALID_PARAM; + } + if (ActivePPS->entropyCodingMode > 2 && + ActivePPS->entropyCodingMode < 0) + return RETCODE_INVALID_PARAM; + if (ActivePPS->cabacInitIdc < 0 || + ActivePPS->cabacInitIdc > 2) + return RETCODE_INVALID_PARAM; + if (ActivePPS->transform8x8Mode != 1 && + ActivePPS->transform8x8Mode != 0) + return RETCODE_INVALID_PARAM; + if (param->chromaFormat400 != 1 && + param->chromaFormat400 != 0) + return RETCODE_INVALID_PARAM; + if (param->fieldFlag != 1 && param->fieldFlag != 0) + return RETCODE_INVALID_PARAM; + } else { + if (picWidth < MIN_ENC_PIC_WIDTH || + picWidth > MAX_ENC_PIC_WIDTH) + return RETCODE_INVALID_PARAM; + if (picHeight < MIN_ENC_PIC_HEIGHT) + return RETCODE_INVALID_PARAM; + } + } else if (pop->bitstreamFormat == STD_HEVC) { + EncHevcParam *param = &pop->EncStdParam.hevcParam; + if (picWidth < W4_MIN_ENC_PIC_WIDTH || + picWidth > W4_MAX_ENC_PIC_WIDTH) { + CVI_VC_ERR("picWidth = %d\n", picWidth); + return RETCODE_INVALID_PARAM; + } + + if (picHeight < W4_MIN_ENC_PIC_HEIGHT || + picHeight > W4_MAX_ENC_PIC_HEIGHT) { + CVI_VC_ERR("picHeight = %d\n", picHeight); + return RETCODE_INVALID_PARAM; + } + + if (param->profile != HEVC_PROFILE_MAIN && + param->profile != HEVC_PROFILE_MAIN10) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->internalBitDepth != 8 && + param->internalBitDepth != 10) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->internalBitDepth > 8 && + param->profile == HEVC_PROFILE_MAIN) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->chromaFormatIdc < 0 || param->chromaFormatIdc > 3) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->decodingRefreshType < 0 || + param->decodingRefreshType > 2) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->gopParam.useDeriveLambdaWeight != 1 && + param->gopParam.useDeriveLambdaWeight != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->gopPresetIdx < PRESET_IDX_T0S || + param->gopPresetIdx > PRESET_IDX_T2ST1L) { + if (param->gopParam.enTemporalLayerQp != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + // seems not necessary + //if (param->gopParam.tidPeriod0 != 60) { + // CVI_VC_ERR("\n"); + // return RETCODE_INVALID_PARAM; + //} + } + + if (param->gopPresetIdx == PRESET_IDX_CUSTOM_GOP) { + if (param->gopParam.customGopSize < 1 || + param->gopParam.customGopSize > MAX_GOP_NUM) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (param->constIntraPredFlag != 1 && + param->constIntraPredFlag != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (productId == PRODUCT_ID_520) { + if (param->intraRefreshMode < 0 || + param->intraRefreshMode > 4) + return RETCODE_INVALID_PARAM; + } else { + // wave420 + if (param->intraRefreshMode < 0 || + param->intraRefreshMode > 3) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (param->independSliceMode < 0 || + param->independSliceMode > 1) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->independSliceMode != 0) { + if (param->dependSliceMode < 0 || + param->dependSliceMode > 2) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (param->useRecommendEncParam < 0 && + param->useRecommendEncParam > 3) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->useRecommendEncParam == 0 || + param->useRecommendEncParam == 2 || + param->useRecommendEncParam == 3) { + if (param->intraInInterSliceEnable != 1 && + param->intraInInterSliceEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->intraNxNEnable != 1 && + param->intraNxNEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->skipIntraTrans != 1 && + param->skipIntraTrans != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->scalingListEnable != 1 && + param->scalingListEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->tmvpEnable != 1 && param->tmvpEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->wppEnable != 1 && param->wppEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->useRecommendEncParam != 3) { // in FAST mode + // (recommendEncParam==3), + // maxNumMerge + // value will be + // decided in FW + if (param->maxNumMerge < 0 || + param->maxNumMerge > 3) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (param->disableDeblk != 1 && + param->disableDeblk != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->disableDeblk == 0 || param->saoEnable != 0) { + if (param->lfCrossSliceBoundaryEnable != 1 && + param->lfCrossSliceBoundaryEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (param->disableDeblk == 0) { + if (param->betaOffsetDiv2 < -6 || + param->betaOffsetDiv2 > 6) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->tcOffsetDiv2 < -6 || + param->tcOffsetDiv2 > 6) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + } + + if (param->losslessEnable != 1 && param->losslessEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->intraQP < 0 || param->intraQP > 51) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->rcEnable != 1 && pop->rcEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->rcEnable == 1) { + if (pop->userQpMinP < 0 || pop->userQpMinP > 51) { + CVI_VC_ERR("Invalid min Qp setting = %d\n", + pop->userQpMinP); + return RETCODE_INVALID_PARAM; + } + + if (pop->userQpMaxP < 0 || pop->userQpMaxP > 51) { + CVI_VC_ERR("Invalid max Qp setting = %d\n", + pop->userQpMaxP); + return RETCODE_INVALID_PARAM; + } + + if (productId == PRODUCT_ID_420L) { + if (param->initialRcQp < 0 || + param->initialRcQp > 63) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if ((param->initialRcQp < 52) && + ((param->initialRcQp > pop->userQpMaxP) || + (param->initialRcQp < pop->userQpMinP))) { + CVI_VC_ERR("Invalid initialRcQp = %d, maxQp = %d, minQp = %d\n", + param->initialRcQp, + pop->userQpMaxP, + pop->userQpMinP); + return RETCODE_INVALID_PARAM; + } + } + if (param->ctuOptParam.ctuQpEnable) // can't enable both + // rcEnable and + // ctuQpEnable + // together. + { + CVI_VC_ERR("RC must disable as ctuQp enable\n"); + return RETCODE_INVALID_PARAM; + } + if (param->intraQpOffset < -10 && + param->intraQpOffset > 10) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->cuLevelRCEnable != 1 && + param->cuLevelRCEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->hvsQPEnable != 1 && + param->hvsQPEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->hvsQPEnable) { + if (param->maxDeltaQp < 0 || + param->maxDeltaQp > 12) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->hvsQpScaleEnable != 1 && + param->hvsQpScaleEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->hvsQpScaleEnable == 1) { + if (param->hvsQpScale < 0 || + param->hvsQpScale > 4) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + } + + if (param->ctuOptParam.roiEnable) { + if (param->ctuOptParam.roiDeltaQp < 1 || + param->ctuOptParam.roiDeltaQp > 51) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + // no this constraint after FW_WAVE420L_v1.7.12 + /* + if (param->ctuOptParam.roiEnable && + param->hvsQPEnable) // can not use both ROI and + // hvsQp + { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } +*/ + if (param->bitAllocMode < 0 && + param->bitAllocMode > 2) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->initBufLevelx8 < 0 || + param->initBufLevelx8 > 8) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->initialDelay < 10 || + pop->initialDelay > 3000) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + // packed format & cbcrInterleave & nv12 can't be set at the + // same time. + if (pop->packedFormat == 1 && pop->cbcrInterleave == 1) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (pop->packedFormat == 1 && pop->nv21 == 1) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + // check valid for common param + if (CheckEncCommonParamValid(pop) == RETCODE_FAILURE) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + // check valid for RC param + if (CheckEncRcParamValid(pop) == RETCODE_FAILURE) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->wppEnable && pop->ringBufferEnable) // WPP can be + // processed on + // only + // linebuffer + // mode. + { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + // check additional features for WAVE420L + if (param->chromaCbQpOffset < -12 || + param->chromaCbQpOffset > 12) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->chromaCrQpOffset < -12 || + param->chromaCrQpOffset > 12) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrYEnable != 1 && param->nrYEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrCbEnable != 1 && param->nrCbEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrCrEnable != 1 && param->nrCrEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrNoiseEstEnable != 1 && + param->nrNoiseEstEnable != 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrNoiseSigmaY > 255) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrNoiseSigmaCb > 255) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrNoiseSigmaCr > 255) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrIntraWeightY > 31) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrIntraWeightCb > 31) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrIntraWeightCr > 31) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrInterWeightY > 31) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrInterWeightCb > 31) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->nrInterWeightCr > 31) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if ((param->nrYEnable == 1 || param->nrCbEnable == 1 || + param->nrCrEnable == 1) && + (param->losslessEnable == 1)) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->intraRefreshMode == 3 && + param->intraRefreshArg == 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->ctuOptParam.ctuModeEnable == 1 && + param->maxNumMerge == 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->ctuOptParam.ctuModeEnable == 1 && + param->intraInInterSliceEnable == 0) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + if (pop->linear2TiledEnable == TRUE) { + if (pop->linear2TiledMode != FF_FRAME && + pop->linear2TiledMode != FF_FIELD) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + } + + return RETCODE_SUCCESS; +} + +RetCode ProductVpuEncFiniSeq(CodecInst *instance) +{ + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + switch (instance->productId) { + case PRODUCT_ID_980: + ret = Coda9VpuFiniSeq(instance); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuEncFiniSeq(instance); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + return ret; +} + +RetCode ProductVpuEncSetup(CodecInst *instance) +{ + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + Uint64 start_time, end_time; + + start_time = cviGetCurrentTime(); + + switch (instance->productId) { + case PRODUCT_ID_980: + ret = Coda9VpuEncSetup(instance); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuEncSetup(instance); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + end_time = cviGetCurrentTime(); + CVI_VC_PERF("EncSetup = %llu us\n", end_time - start_time); + + return ret; +} + +RetCode ProductVpuEncode(CodecInst *instance, EncParam *param) +{ + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + vpu_set_channel_core_mapping(instance->s32ChnNum, instance->coreIdx); + + switch (instance->productId) { + case PRODUCT_ID_980: + ret = Coda9VpuEncode(instance, param); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuEncode(instance, param); + break; + default: + break; + } + + return ret; +} + +RetCode ProductVpuEncGetResult(CodecInst *instance, EncOutputInfo *result) +{ + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + vpu_set_channel_core_mapping(instance->s32ChnNum, -1); + + switch (instance->productId) { + case PRODUCT_ID_980: + ret = Coda9VpuEncGetResult(instance, result); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuEncGetResult(instance, result); + break; + default: + ret = RETCODE_NOT_FOUND_VPU_DEVICE; + } + + result->encHwTime = instance->u64EndTime - instance->u64StartTime; + CVI_VC_PERF("encHwTime %llu\n", result->encHwTime); + + return ret; +} + +#ifdef REDUNDENT_CODE +RetCode ProductVpuEncGiveCommand(CodecInst *instance, CodecCommand cmd, + void *param) +{ + RetCode ret = RETCODE_NOT_SUPPORTED_FEATURE; + + switch (instance->productId) { + case PRODUCT_ID_980: + ret = Coda9VpuEncGiveCommand(instance, cmd, param); + break; + case PRODUCT_ID_420L: + ret = Wave4VpuEncGiveCommand(instance, cmd, param); + break; + } + + return ret; +} + +RetCode ProductVpuEncInitSeq(CodecInst *instance) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + productId = instance->productId; + + switch (productId) { + default: + break; + } + + return ret; +} + +RetCode ProductVpuEncGetSeqInfo(CodecInst *instance) +{ + int productId; + RetCode ret = RETCODE_NOT_FOUND_VPU_DEVICE; + + productId = instance->productId; + + switch (productId) { + default: + break; + } + + return ret; +} +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/product.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/product.h new file mode 100644 index 0000000000..2d39362174 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/product.h @@ -0,0 +1,252 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#ifndef __VPUAPI_PRODUCT_ABSTRACT_H__ +#define __VPUAPI_PRODUCT_ABSTRACT_H__ + +#include "vpuapi.h" +#include "vpuapifunc.h" +#include "cvi_vcodec_lib.h" + +#define IS_DECODER_HANDLE(_instance) (_instance->codecMode < AVC_ENC) +#define IS_7Q_DECODER_HANDLE(_instance) (_instance->codecMode < C7_AVC_ENC) + +#define H264_MIN_BITSTREAM_SIZE (128 * 1024) // 128KB +#define H265_MIN_BITSTREAM_SIZE (128 * 1024) // 128KB +#define STREAM_BUF_SIZE_RESERVE (4096) + +enum { + FramebufCacheNone, + FramebufCacheMaverickI, + FramebufCacheMaverickII, +}; + +typedef enum { + AUX_BUF_TYPE_MVCOL, + AUX_BUF_TYPE_FBC_Y_OFFSET, + AUX_BUF_TYPE_FBC_C_OFFSET +} AUX_BUF_TYPE; + +typedef struct _tag_FramebufferIndex { + Int16 tiledIndex; + Int16 linearIndex; +} FramebufferIndex; + +typedef struct _tag_VpuAttrStruct { + Uint32 productId; + Uint32 productNumber; + char productName[8]; + Uint32 supportDecoders; /* bitmask: See CodStd in vpuapi.h */ + Uint32 supportEncoders; /* bitmask: See CodStd in vpuapi.h */ + Uint32 numberOfMemProtectRgns; /* always 10 */ + Uint32 numberOfVCores; + BOOL supportWTL; + BOOL supportTiled2Linear; + BOOL supportTiledMap; + BOOL supportMapTypes; /* Framebuffer map type */ + BOOL supportLinear2Tiled; /* Encoder */ + BOOL support128bitBus; + BOOL supportThumbnailMode; + BOOL supportBitstreamMode; + BOOL supportFBCBWOptimization; /* WAVE4xx decoder feature */ + BOOL supportGDIHW; + BOOL supportCommandQueue; + Uint32 supportEndianMask; + Uint32 framebufferCacheType; /* 0: for None, 1 - Maverick-I, 2 - + Maverick-II */ + Uint32 bitstreamBufferMargin; + Uint32 interruptEnableFlag; + Uint32 hwConfigDef0; + Uint32 hwConfigDef1; + Uint32 hwConfigFeature; /**<< supported codec standards */ + Uint32 hwConfigDate; /**<< Configuation Date Decimal, ex)20151130 */ + Uint32 hwConfigRev; /**<< SVN revision, ex) 83521 */ + Uint32 hwConfigType; /**<< Not defined yet */ +} VpuAttr; + +enum CORE_IDX { + CORE_H265 = 0, + CORE_H264 = 1, +}; + +extern VpuAttr g_VpuCoreAttributes[MAX_NUM_VPU_CORE]; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* + * Returns 0 - not found product id + * 1 - found product id + */ +extern Uint32 ProductVpuScan(Uint32 coreIdx); + +extern void ProductVpuSetId(Uint32 coreIdx, Uint32 productId); + +extern Int32 ProductVpuGetId(Uint32 coreIdx); + +extern RetCode ProductVpuGetVersion(Uint32 coreIdx, Uint32 *versionInfo, + Uint32 *revision); +#ifdef DRAM_TEST +extern RetCode ProductVpuDRAMReadWriteTest(Uint32 coreIdx, + Uint32 *dram_source_addr, + Uint32 *dram_destination_addr, + Uint32 *dram_data_size); +#endif + +extern RetCode ProductVpuInit(Uint32 coreIdx, void *firmware, Uint32 size); + +extern RetCode ProductVpuReInit(Uint32 coreIdx, void *firmware, Uint32 size); + +extern Uint32 ProductVpuIsInit(Uint32 coreIdx); + +extern Int32 ProductVpuIsBusy(Uint32 coreIdx); + +extern Int32 ProductVpuGetFrameCycle(Uint32 coreIdx); + +extern Int32 ProductVpuWaitInterrupt(CodecInst *instance, Int32 timeout); + +extern RetCode ProductVpuReset(Uint32 coreIdx, SWResetMode resetMode); + +#ifdef REDUNDENT_CODE +extern RetCode ProductVpuSleepWake(Uint32 coreIdx, int iSleepWake, + const Uint16 *code, Uint32 size); +#endif + +extern RetCode ProductVpuSleepWake_EX(Uint32 coreIdx, int iSleepWake, + const Uint16 *code, Uint32 size); + +extern RetCode ProductVpuClearInterrupt(Uint32 coreIdx); + +extern RetCode ProductVpuDecBuildUpOpenParam(CodecInst *instance, + DecOpenParam *param); + +extern RetCode ProductCheckDecOpenParam(DecOpenParam *param); + +extern RetCode ProductVpuDecInitSeq(CodecInst *instance); + +extern RetCode ProductVpuDecFiniSeq(CodecInst *instance); + +extern RetCode ProductVpuDecSetBitstreamFlag(CodecInst *instance, BOOL running, + Int32 size); + +#ifdef REDUNDENT_CODE +extern RetCode ProductCpbFlush(CodecInst *instance); +#endif +/* + * FINI_SEQ + */ +extern RetCode ProductVpuDecEndSequence(CodecInst *instance); + +/** + * @brief Abstract function for SEQ_INIT. + */ +extern RetCode ProductVpuDecGetSeqInfo(CodecInst *instance, + DecInitialInfo *info); + +/** + * \brief Check parameters for product specific decoder. + */ +extern RetCode ProductVpuDecCheckCapability(CodecInst *instance); + +/** + * \brief Decode a coded picture. + */ +extern RetCode ProductVpuDecode(CodecInst *instance, DecParam *option); + +/** + * + */ +extern RetCode ProductVpuDecGetResult(CodecInst *instance, + DecOutputInfo *result); + +/** + * \brief Flush framebuffers to prepare decoding new sequence + * \param instance decoder handle + * \param retIndexes Storing framebuffer indexes in display order. + * If retIndexes[i] is -1 then there is no display + * index from i-th. + */ +extern RetCode ProductVpuDecFlush(CodecInst *instance, + FramebufferIndex *retIndexes, Uint32 size); + +/** + * \brief Allocate framebuffers with given parameters + */ +extern RetCode ProductVpuAllocateFramebuffer( + CodecInst *instance, FrameBuffer *fbArr, TiledMapType mapType, + Int32 num, Int32 stride, Int32 height, FrameBufferFormat format, + BOOL cbcrInterleave, BOOL nv21, Int32 endian, vpu_buffer_t *vb, + Int32 gdiIndex, FramebufferAllocType fbType); + +/** + * \brief Register framebuffers to VPU + */ +extern RetCode ProductVpuRegisterFramebuffer(CodecInst *instance); + +extern RetCode ProductVpuDecUpdateFrameBuffer(void); + +extern Int32 ProductCalculateFrameBufSize(Int32 productId, Int32 stride, + Int32 height, TiledMapType mapType, + FrameBufferFormat format, + BOOL interleave, + DRAMConfig *pDramCfg); +extern Int32 ProductCalculateAuxBufferSize(AUX_BUF_TYPE type, CodStd codStd, + Int32 width, Int32 height); + +extern RetCode ProductClrDispFlag(void); + +#ifdef REDUNDENT_CODE +extern RetCode ProductSetDispFlag(void); +#endif +/************************************************************************/ +/* ENCODER */ +/************************************************************************/ +extern RetCode ProductVpuEncBuildUpOpenParam(CodecInst *pCodec, + EncOpenParam *param); + +extern RetCode ProductVpuEncFiniSeq(CodecInst *instance); + +extern RetCode ProductCheckEncOpenParam(EncOpenParam *param); + +extern RetCode ProductVpuEncSetup(CodecInst *instance); + +extern RetCode ProductVpuEncode(CodecInst *instance, EncParam *param); + +extern RetCode ProductVpuEncGetResult(CodecInst *instance, + EncOutputInfo *result); +#ifdef REDUNDENT_CODE +extern RetCode ProductVpuEncGiveCommand(CodecInst *instance, CodecCommand cmd, + void *param); +#endif + +extern RetCode Wave4VpuEncGetHeader(EncHandle instance, + EncHeaderParam *encHeaderParam); + +extern RetCode Wave4VpuEncParaChange(EncHandle instance, EncChangeParam *param); +extern RetCode Coda7qVpuEncGetHeader(EncHandle instance, + EncHeaderParam *encHeaderParam); + +#ifdef REDUNDENT_CODE +extern RetCode ProductVpuEncInitSeq(CodecInst *instance); +extern RetCode ProductVpuEncGetSeqInfo(CodecInst *instance); +#endif + +#ifdef __cplusplus +}; +#endif /* __cplusplus */ + +#endif /* __VPUAPI_PRODUCT_ABSTRACT_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.c new file mode 100644 index 0000000000..aa80e7e061 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.c @@ -0,0 +1,4255 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "vpuapifunc.h" +#include "product.h" +#include "main_helper.h" +#include "wave/common/common_regdefine.h" + +#ifdef BIT_CODE_FILE_PATH +#include BIT_CODE_FILE_PATH +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#endif + +static const Uint16 *s_pusBitCode[MAX_NUM_VPU_CORE] = { + NULL, +}; +static int s_bitCodeSize[MAX_NUM_VPU_CORE] = { + 0, +}; + +static int s_coreStatus[MAX_NUM_VPU_CORE] = { + 0, +}; + +Uint32 __VPU_BUSY_TIMEOUT = VPU_BUSY_CHECK_TIMEOUT; + +static RetCode cviConfigEncParam(CodecInst *pCodec, EncOpenParam *param); +static RetCode CheckInstanceValidity(CodecInst *pCodecInst) +{ + int i; + vpu_instance_pool_t *vip; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(pCodecInst->coreIdx); + if (!vip) { + CVI_VC_ERR("RETCODE_INSUFFICIENT_RESOURCE\n"); + return RETCODE_INSUFFICIENT_RESOURCE; + } + + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + if ((CodecInst *)vip->codecInstPool[i] == pCodecInst) + return RETCODE_SUCCESS; + } + + return RETCODE_INVALID_HANDLE; +} + +static RetCode CheckDecInstanceValidity(CodecInst *pCodecInst) +{ + RetCode ret; + + if (pCodecInst == NULL) + return RETCODE_INVALID_HANDLE; + + ret = CheckInstanceValidity(pCodecInst); + if (ret != RETCODE_SUCCESS) { + return RETCODE_INVALID_HANDLE; + } + if (!pCodecInst->inUse) { + return RETCODE_INVALID_HANDLE; + } + + return ProductVpuDecCheckCapability(pCodecInst); +} + +Int32 VPU_IsBusy(Uint32 coreIdx) +{ + Uint32 ret = 0; + + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + SetClockGate(coreIdx, 1); + ret = ProductVpuIsBusy(coreIdx); + SetClockGate(coreIdx, 0); + + return ret != 0; +} + +Int32 VPU_IsInit(Uint32 coreIdx) +{ + Int32 pc; + + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + SetClockGate(coreIdx, 1); + pc = ProductVpuIsInit(coreIdx); + SetClockGate(coreIdx, 0); + + return pc; +} + +Int32 VPU_WaitInterrupt(Uint32 coreIdx, int timeout) +{ + Int32 ret; + CodecInst *instance; + + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + instance = GetPendingInst(coreIdx); + if (instance != NULL) { + ret = ProductVpuWaitInterrupt(instance, timeout); + } else { + ret = -1; + } + + return ret; +} + +#if 0 +Int32 VPU_GetFd(Uint32 coreIdx) +{ + Int32 fd = -1; + CodecInst *instance; + + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + instance = GetPendingInst(coreIdx); + if (instance != NULL) { + fd = ProductVpuGetFd(instance); + } + + if (fd <= 0) { + CVI_VC_TRACE("fd = %d\n", fd); + return -1; + } + + return fd; +} +#endif + +Int32 VPU_GetFrameCycle(Uint32 coreIdx) +{ + return ProductVpuGetFrameCycle(coreIdx); +} + +#ifdef REDUNDENT_CODE +Int32 VPU_WaitInterruptEx(VpuHandle handle, int timeout) +{ + Int32 ret; + CodecInst *pCodecInst; + + pCodecInst = handle; + + if (pCodecInst->coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + ret = ProductVpuWaitInterrupt(pCodecInst, timeout); + + return ret; +} +#endif + +void VPU_ClearInterrupt(Uint32 coreIdx) +{ + /* clear all interrupt flags */ + ProductVpuClearInterrupt(coreIdx); +} + +#ifdef REDUNDENT_CODE +void VPU_ClearInterruptEx(VpuHandle handle, Int32 intrFlag) +{ + CodecInst *pCodecInst; + + UNREFERENCED_PARAMETER(intrFlag); + + pCodecInst = handle; + + ProductVpuClearInterrupt(pCodecInst->coreIdx); +} + +int VPU_GetMvColBufSize(CodStd codStd, int width, int height, int num) +{ + int size_mvcolbuf = ProductCalculateAuxBufferSize( + AUX_BUF_TYPE_MVCOL, codStd, width, height); + + if (codStd == STD_AVC || codStd == STD_HEVC || codStd == STD_VP9) + size_mvcolbuf *= num; + + return size_mvcolbuf; +} +#endif + +RetCode VPU_GetFBCOffsetTableSize(CodStd codStd, int width, int height, + int *ysize, int *csize) +{ + if (ysize == NULL || csize == NULL) + return RETCODE_INVALID_PARAM; + + *ysize = ProductCalculateAuxBufferSize(AUX_BUF_TYPE_FBC_Y_OFFSET, + codStd, width, height); + *csize = ProductCalculateAuxBufferSize(AUX_BUF_TYPE_FBC_C_OFFSET, + codStd, width, height); + + return RETCODE_SUCCESS; +} + +int VPU_GetFrameBufSize(int coreIdx, int stride, int height, int mapType, + int format, int interleave, DRAMConfig *pDramCfg) +{ + int productId; + UNREFERENCED_PARAMETER(interleave); /*!<< for backward compatiblity */ + + if (coreIdx < 0 || coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + productId = ProductVpuGetId(coreIdx); + + return ProductCalculateFrameBufSize(productId, stride, height, + (TiledMapType)mapType, + (FrameBufferFormat)format, + (BOOL)interleave, pDramCfg); +} + +int VPU_GetProductId(int coreIdx) +{ + Int32 productId; + + CVI_VC_TRACE("IN\n"); + + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + productId = ProductVpuGetId(coreIdx); + if (productId != PRODUCT_ID_NONE) { + CVI_VC_INFO("Already got product id\n"); + return productId; + } + + if (vdi_init(coreIdx, FALSE) < 0) { + CVI_VC_ERR("vdi_init error\n"); + return -1; + } + + if (ProductVpuScan(coreIdx) == FALSE) + productId = -1; + else + productId = ProductVpuGetId(coreIdx); + + // vdi_release(coreIdx); // vdi_release will be call after all jobs are done + + ProductVpuSetId(coreIdx, productId); + + return productId; +} + +#ifdef REDUNDENT_CODE +int VPU_GetOpenInstanceNum(Uint32 coreIdx) +{ + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + return vdi_get_instance_num(coreIdx); +} +#endif + +#if 0 +Int32 cviVPU_GetFd(Uint32 coreIdx) +{ + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + return vdi_get_vpu_fd(coreIdx); +} +#endif + +static RetCode InitializeVPU(Uint32 coreIdx, const Uint16 *code, Uint32 size) +{ + RetCode ret; + + if (vdi_init(coreIdx, TRUE) < 0) + return RETCODE_FAILURE; + + if (vdi_get_instance_num(coreIdx) > 0) { + if (ProductVpuScan(coreIdx) == 0) { + return RETCODE_NOT_FOUND_VPU_DEVICE; + } + } + + if (VPU_IsInit(coreIdx) != 0) { + int SingleCore; + + SetClockGate(coreIdx, 1); + + SingleCore = vdi_get_single_core(coreIdx); + + if (SingleCore == 1) { + ProductVpuInit(coreIdx, (void *)code, size); + } else if (SingleCore == 0) { +#ifdef ARCH_CV183X + ProductVpuReInit(coreIdx, (void *)code, size); +#else + if (vdi_get_instance_num(coreIdx) > 0) { + ProductVpuReInit(coreIdx, (void *)code, size); + } else { + ProductVpuInit(coreIdx, (void *)code, size); + } +#endif + } else { + CVI_VC_ERR("get_single_core fail\n"); + return RETCODE_FAILURE; + } + return RETCODE_CALLED_BEFORE; + } + + InitCodecInstancePool(coreIdx); + + SetClockGate(coreIdx, 1); + ret = ProductVpuReset(coreIdx, SW_RESET_ON_BOOT); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + ret = ProductVpuInit(coreIdx, (void *)code, size); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("ProductVpuInit err %d\n", ret); + return ret; + } + return RETCODE_SUCCESS; +} + +#ifdef REDUNDENT_CODE +RetCode VPU_Init(Uint32 coreIdx) +{ +#ifdef BIT_CODE_FILE_PATH + s_pusBitCode[coreIdx] = bit_code; + s_bitCodeSize[coreIdx] = ARRAY_SIZE(bit_code); +#endif + + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + if (s_bitCodeSize[coreIdx] == 0) + return RETCODE_NOT_FOUND_BITCODE_PATH; + + return InitializeVPU(coreIdx, s_pusBitCode[coreIdx], + s_bitCodeSize[coreIdx]); +} +#endif + +RetCode VPU_InitWithBitcode(Uint32 coreIdx, const Uint16 *code, Uint32 size) +{ + if (coreIdx >= MAX_NUM_VPU_CORE) { + CVI_VC_ERR("\n"); + return RETCODE_INVALID_PARAM; + } + if (code == NULL || size == 0) + return RETCODE_INVALID_PARAM; + +// load fw twice due to initMcuEnv done it before +#if 0 + if (s_pusBitCode[coreIdx] == NULL) { + s_pusBitCode[coreIdx] = (Uint16 *)osal_malloc(size * sizeof(Uint16)); + if (!s_pusBitCode[coreIdx]) + return RETCODE_INSUFFICIENT_RESOURCE; + + CVI_VC_MCU("s_pusBitCode[%d] = %p\n", coreIdx, s_pusBitCode[coreIdx]); + + osal_memcpy((void *)s_pusBitCode[coreIdx], (const void *)code, + size * sizeof(Uint16)); + s_bitCodeSize[coreIdx] = size; +#else + if (s_pusBitCode[coreIdx] == NULL) { +#ifdef FIRMWARE_H + s_pusBitCode[coreIdx] = (Uint16 *)code; +#endif + s_bitCodeSize[coreIdx] = size; + + CVI_VC_MCU("s_pusBitCode[%d] = %p\n", coreIdx, + s_pusBitCode[coreIdx]); + } +#endif + + return InitializeVPU(coreIdx, code, size); +} + +RetCode VPU_DeInit(Uint32 coreIdx) +{ + int ret = 0, num = 0; + + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + //#define WORK_AROUND_FREE + +#ifdef BIT_CODE_FILE_PATH +#else +#ifndef WORK_AROUND_FREE +#if 0 + if (s_pusBitCode[coreIdx]) { + osal_free((void *)s_pusBitCode[coreIdx]); + } +#endif +#endif +#endif +#if 0 + s_pusBitCode[coreIdx] = NULL; + s_bitCodeSize[coreIdx] = 0; +#endif + ret = vdi_release(coreIdx); + if (ret != 0) + return RETCODE_FAILURE; + +#if 1 + num = VPU_GetCoreTaskNum(coreIdx); + if (num == 0) { + s_pusBitCode[coreIdx] = NULL; + s_bitCodeSize[coreIdx] = 0; + } +#endif + + return RETCODE_SUCCESS; +} + +RetCode VPU_GetVersionInfo(Uint32 coreIdx, Uint32 *versionInfo, + Uint32 *revision, Uint32 *productId) +{ + RetCode ret; + + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + if (ProductVpuIsInit(coreIdx) == 0) { + return RETCODE_NOT_INITIALIZED; + } + + if (GetPendingInst(coreIdx)) { + return RETCODE_FRAME_NOT_COMPLETE; + } + + if (productId != NULL) { + *productId = ProductVpuGetId(coreIdx); + } + ret = ProductVpuGetVersion(coreIdx, versionInfo, revision); + + return ret; +} +RetCode VPU_DecOpen(DecHandle *pHandle, DecOpenParam *pop) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; + + ret = ProductCheckDecOpenParam(pop); + if (ret != RETCODE_SUCCESS) + return ret; + + if (VPU_IsInit(pop->coreIdx) == 0) { + return RETCODE_NOT_INITIALIZED; + } + + ret = GetCodecInstance(pop->coreIdx, &pCodecInst); + if (ret != RETCODE_SUCCESS) { + *pHandle = 0; + return ret; + } + + pCodecInst->isDecoder = TRUE; + *pHandle = pCodecInst; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + osal_memset(pDecInfo, 0x00, sizeof(DecInfo)); + osal_memcpy((void *)&pDecInfo->openParam, pop, sizeof(DecOpenParam)); + +#ifdef REDUNDENT_CODE + if (pop->bitstreamFormat == STD_MPEG4) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_MP4_DEC : + MP4_DEC); + pCodecInst->codecModeAux = MP4_AUX_MPEG4; + } else if (pop->bitstreamFormat == STD_AVC) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_AVC_DEC : + AVC_DEC); + pCodecInst->codecModeAux = pop->avcExtension; + } else if (pop->bitstreamFormat == STD_VC1) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_VC1_DEC : + VC1_DEC); + } else if (pop->bitstreamFormat == STD_MPEG2) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_MP2_DEC : + MP2_DEC); + } else if (pop->bitstreamFormat == STD_H263) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_MP4_DEC : + MP4_DEC); + pCodecInst->codecModeAux = MP4_AUX_MPEG4; + } else if (pop->bitstreamFormat == STD_DIV3) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_DV3_DEC : + DV3_DEC); + pCodecInst->codecModeAux = MP4_AUX_DIVX3; + pDecInfo->div3Width = pop->div3Width; + pDecInfo->div3Height = pop->div3Height; + } else if (pop->bitstreamFormat == STD_RV) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_RVX_DEC : + RV_DEC); + } else if (pop->bitstreamFormat == STD_AVS) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_AVS_DEC : + AVS_DEC); + } else if (pop->bitstreamFormat == STD_THO) { + pCodecInst->codecMode = VPX_DEC; + pCodecInst->codecModeAux = VPX_AUX_THO; + } else if (pop->bitstreamFormat == STD_VP3) { + pCodecInst->codecMode = VPX_DEC; + pCodecInst->codecModeAux = VPX_AUX_THO; + } else if (pop->bitstreamFormat == STD_VP8) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_VP8_DEC : + VPX_DEC); + pCodecInst->codecModeAux = VPX_AUX_VP8; + } else if (pop->bitstreamFormat == STD_HEVC) { + pCodecInst->codecMode = HEVC_DEC; + } else if (pop->bitstreamFormat == STD_VP9) { + pCodecInst->codecMode = C7_VP9_DEC; + } else if (pop->bitstreamFormat == STD_AVS2) { + pCodecInst->codecMode = C7_AVS2_DEC; + } else { + return RETCODE_INVALID_PARAM; + } +#else + pCodecInst->s32ChnNum = pop->s32ChnNum; + if (pop->bitstreamFormat == STD_AVC) { + pCodecInst->codecMode = + (pCodecInst->productId == PRODUCT_ID_7Q ? C7_AVC_DEC : + AVC_DEC); + pCodecInst->codecModeAux = pop->avcExtension; + } else if (pop->bitstreamFormat == STD_HEVC) { + pCodecInst->codecMode = HEVC_DEC; + } else { + return RETCODE_INVALID_PARAM; + } +#endif + + pDecInfo->wtlEnable = pop->wtlEnable; + pDecInfo->wtlMode = pop->wtlMode; + if (!pDecInfo->wtlEnable) + pDecInfo->wtlMode = 0; + + pDecInfo->streamWrPtr = pop->bitstreamBuffer; + pDecInfo->streamRdPtr = pop->bitstreamBuffer; + pDecInfo->frameDelay = -1; + pDecInfo->streamBufStartAddr = pop->bitstreamBuffer; + pDecInfo->streamBufSize = pop->bitstreamBufferSize; + pDecInfo->streamBufEndAddr = + pop->bitstreamBuffer + pop->bitstreamBufferSize; + pDecInfo->reorderEnable = pop->reorderEnable; + pDecInfo->mirrorDirection = MIRDIR_NONE; + pDecInfo->prevFrameEndPos = pop->bitstreamBuffer; + + SetClockGate(pop->coreIdx, TRUE); + ret = ProductVpuDecBuildUpOpenParam(pCodecInst, pop); + if (ret != RETCODE_SUCCESS) { + SetClockGate(pop->coreIdx, FALSE); + *pHandle = 0; + return ret; + } + SetClockGate(pop->coreIdx, FALSE); + + pDecInfo->tiled2LinearEnable = pop->tiled2LinearEnable; + pDecInfo->tiled2LinearMode = pop->tiled2LinearMode; + if (!pDecInfo->tiled2LinearEnable) + pDecInfo->tiled2LinearMode = 0; // coda980 only + + if (!pDecInfo->wtlEnable) // coda980, wave320, wave410 only + pDecInfo->wtlMode = 0; + + osal_memset((void *)&pDecInfo->cacheConfig, 0x00, + sizeof(MaverickCacheConfig)); + + return RETCODE_SUCCESS; +} + +RetCode VPU_DecClose(DecHandle handle) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; + int i; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + ret = ProductVpuDecFiniSeq(pCodecInst); + if (ret != RETCODE_SUCCESS) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, DEC_SEQ_END, 0); +#endif + + if (ret == RETCODE_VPU_STILL_RUNNING) { + return ret; + } + } + + if (pDecInfo->vbSlice.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pDecInfo->vbSlice); + + if (pDecInfo->vbWork.size) { + if (pDecInfo->workBufferAllocExt == 0) { + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pDecInfo->vbWork); + } else { + vdi_dettach_dma_memory(pCodecInst->coreIdx, + &pDecInfo->vbWork); + } + } + + if (pDecInfo->vbFrame.size) { + if (pDecInfo->frameAllocExt == 0) { + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFrame); + } + } + for (i = 0; i < MAX_REG_FRAME; i++) { + if (pDecInfo->vbMV[i].size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbMV[i]); + if (pDecInfo->vbFbcYTbl[i].size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFbcYTbl[i]); + if (pDecInfo->vbFbcCTbl[i].size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFbcCTbl[i]); + } + + if (pDecInfo->vbTemp.size) + vdi_dettach_dma_memory(pCodecInst->coreIdx, &pDecInfo->vbTemp); + + if (pDecInfo->vbPPU.size) { + if (pDecInfo->ppuAllocExt == 0) + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pDecInfo->vbPPU); + } + + if (pDecInfo->vbWTL.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pDecInfo->vbWTL); + + if (pDecInfo->vbUserData.size) + vdi_dettach_dma_memory(pCodecInst->coreIdx, + &pDecInfo->vbUserData); + + if (pDecInfo->vbReport.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pDecInfo->vbReport); + + if (GetPendingInst(pCodecInst->coreIdx) == pCodecInst) + ClearPendingInst(pCodecInst->coreIdx); + + FreeCodecInstance(pCodecInst); + + return ret; +} + +RetCode VPU_DecSetEscSeqInit(DecHandle handle, int escape) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + if (pDecInfo->openParam.bitstreamMode != BS_MODE_INTERRUPT) + return RETCODE_INVALID_PARAM; + + pDecInfo->seqInitEscape = escape; + + return RETCODE_SUCCESS; +} + +RetCode VPU_DecGetInitialInfo(DecHandle handle, DecInitialInfo *info) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; + Int32 flags; + Uint32 interruptBit; + + if (PRODUCT_ID_W_SERIES(handle->productId)) { + if (handle->productId == PRODUCT_ID_510 || + handle->productId == PRODUCT_ID_512) { + interruptBit = INT_WAVE5_INIT_SEQ; + } else { + interruptBit = INT_WAVE_DEC_PIC_HDR; + } + } else { + /* CODA9xx */ + interruptBit = INT_BIT_SEQ_INIT; + } + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + if (info == NULL) + return RETCODE_INVALID_PARAM; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + ret = ProductVpuDecCheckCapability(pCodecInst); + if (ret != RETCODE_SUCCESS) + return ret; + + if (GetPendingInst(pCodecInst->coreIdx)) { + /* The other instance is running */ + return RETCODE_FRAME_NOT_COMPLETE; + } + + if (DecBitstreamBufEmpty(pDecInfo)) { + return RETCODE_WRONG_CALL_SEQUENCE; + } + + ret = ProductVpuDecInitSeq(handle); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + flags = ProductVpuWaitInterrupt(pCodecInst, __VPU_BUSY_TIMEOUT); + + if (flags == -1) { + info->rdPtr = VpuReadReg(pCodecInst->coreIdx, + pDecInfo->streamRdPtrRegAddr); + info->wrPtr = VpuReadReg(pCodecInst->coreIdx, + pDecInfo->streamWrPtrRegAddr); + ret = RETCODE_VPU_RESPONSE_TIMEOUT; + } else { + if (flags & (1 << interruptBit)) + ProductVpuClearInterrupt(pCodecInst->coreIdx); + + if (flags != (1 << interruptBit)) + ret = RETCODE_FAILURE; + else + ret = ProductVpuDecGetSeqInfo(handle, info); + } + + info->rdPtr = + VpuReadReg(pCodecInst->coreIdx, pDecInfo->streamRdPtrRegAddr); + info->wrPtr = + VpuReadReg(pCodecInst->coreIdx, pDecInfo->streamWrPtrRegAddr); + + pDecInfo->initialInfo = *info; + if (ret == RETCODE_SUCCESS) { + pDecInfo->initialInfoObtained = 1; + } + + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + + return ret; +} + +RetCode VPU_DecIssueSeqInit(DecHandle handle) +{ + CodecInst *pCodecInst; + RetCode ret; + VpuAttr *pAttr; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + + if (GetPendingInst(pCodecInst->coreIdx)) { + return RETCODE_FRAME_NOT_COMPLETE; + } + + CVI_VC_BS("\n"); + ret = ProductVpuDecInitSeq(handle); + if (ret == RETCODE_SUCCESS) { + SetPendingInst(pCodecInst->coreIdx, pCodecInst, __func__, + __LINE__); + } + + if (pAttr->supportCommandQueue == TRUE) { + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + } + + return ret; +} + +RetCode VPU_DecCompleteSeqInit(DecHandle handle, DecInitialInfo *info) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; + VpuAttr *pAttr; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + if (info == 0) { + return RETCODE_INVALID_PARAM; + } + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + + if (pAttr->supportCommandQueue == FALSE) { + if (pCodecInst != GetPendingInst(pCodecInst->coreIdx)) { + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, + __LINE__); + return RETCODE_WRONG_CALL_SEQUENCE; + } + } + + ret = ProductVpuDecGetSeqInfo(handle, info); + if (ret == RETCODE_SUCCESS) { + pDecInfo->initialInfoObtained = 1; + } + + info->rdPtr = + VpuReadReg(pCodecInst->coreIdx, pDecInfo->streamRdPtrRegAddr); + info->wrPtr = + VpuReadReg(pCodecInst->coreIdx, pDecInfo->streamWrPtrRegAddr); + CVI_VC_BS("rdPtr = 0x%llX, wrPtr = 0x%llX\n", info->rdPtr, info->wrPtr); + + pDecInfo->prevFrameEndPos = info->rdPtr; + + pDecInfo->initialInfo = *info; + + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + + return ret; +} + +static RetCode DecRegisterFrameBuffer(DecHandle handle, FrameBuffer *bufArray, + int numFbsForDecoding, int numFbsForWTL, + int stride, int height, int mapType) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + Int32 i; + Uint32 size, totalAllocSize; + RetCode ret; + FrameBuffer *fb, nullFb; + vpu_buffer_t *vb; + FrameBufferFormat format = FORMAT_420; + Int32 totalNumOfFbs; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + if (numFbsForDecoding > MAX_FRAMEBUFFER_COUNT || + numFbsForWTL > MAX_FRAMEBUFFER_COUNT) { + return RETCODE_INVALID_PARAM; + } + + osal_memset(&nullFb, 0x00, sizeof(FrameBuffer)); + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + pDecInfo->numFbsForDecoding = numFbsForDecoding; + pDecInfo->numFbsForWTL = numFbsForWTL; + pDecInfo->numFrameBuffers = numFbsForDecoding + numFbsForWTL; + pDecInfo->stride = stride; + if (pCodecInst->codecMode == VPX_DEC || + pCodecInst->codecMode == C7_VP8_DEC) + pDecInfo->frameBufferHeight = VPU_ALIGN64(height); + else if (pCodecInst->codecMode == C7_VP9_DEC) + pDecInfo->frameBufferHeight = VPU_ALIGN64(height); + else + pDecInfo->frameBufferHeight = height; + pDecInfo->mapType = mapType; + pDecInfo->mapCfg.productId = pCodecInst->productId; + + ret = ProductVpuDecCheckCapability(pCodecInst); + if (ret != RETCODE_SUCCESS) + return ret; + + if (!pDecInfo->initialInfoObtained) + return RETCODE_WRONG_CALL_SEQUENCE; + + if ((stride < pDecInfo->initialInfo.picWidth) || (stride % 8 != 0) || + (height < pDecInfo->initialInfo.picHeight)) { + return RETCODE_INVALID_STRIDE; + } + + if (GetPendingInst(pCodecInst->coreIdx)) { + return RETCODE_FRAME_NOT_COMPLETE; + } + + /* clear frameBufPool */ + for (i = 0; + i < (int)(sizeof(pDecInfo->frameBufPool) / sizeof(FrameBuffer)); + i++) { + pDecInfo->frameBufPool[i] = nullFb; + } + + /* LinearMap or TiledMap, compressed framebuffer inclusive. */ + if (pDecInfo->initialInfo.lumaBitdepth > 8 || + pDecInfo->initialInfo.chromaBitdepth > 8) + format = FORMAT_420_P10_16BIT_LSB; + + totalNumOfFbs = numFbsForDecoding + numFbsForWTL; + if (bufArray) { + for (i = 0; i < totalNumOfFbs; i++) + pDecInfo->frameBufPool[i] = bufArray[i]; + } else { + vb = &pDecInfo->vbFrame; + fb = &pDecInfo->frameBufPool[0]; + ret = ProductVpuAllocateFramebuffer( + (CodecInst *)handle, fb, (TiledMapType)mapType, + numFbsForDecoding, stride, height, format, + pDecInfo->openParam.cbcrInterleave, + pDecInfo->openParam.nv21, + pDecInfo->openParam.frameEndian, vb, 0, FB_TYPE_CODEC); + if (ret != RETCODE_SUCCESS) { + return ret; + } + } + totalAllocSize = 0; + if (pCodecInst->productId != PRODUCT_ID_960) { + pDecInfo->mapCfg.tiledBaseAddr = pDecInfo->frameBufPool[0].bufY; + } + + if (numFbsForDecoding == 1) { + size = ProductCalculateFrameBufSize( + handle->productId, stride, height, + (TiledMapType)mapType, format, + pDecInfo->openParam.cbcrInterleave, &pDecInfo->dramCfg); + } else { + size = pDecInfo->frameBufPool[1].bufY - + pDecInfo->frameBufPool[0].bufY; + } + size *= numFbsForDecoding; + totalAllocSize += size; + + /* LinearMap */ + if (pDecInfo->wtlEnable == TRUE || numFbsForWTL != 0) { + pDecInfo->stride = stride; + if (bufArray) { + format = pDecInfo->frameBufPool[0].format; + } else { + TiledMapType map; + map = pDecInfo->wtlMode == FF_FRAME ? LINEAR_FRAME_MAP : + LINEAR_FIELD_MAP; + format = pDecInfo->wtlFormat; + vb = &pDecInfo->vbWTL; + fb = &pDecInfo->frameBufPool[numFbsForDecoding]; + + ret = ProductVpuAllocateFramebuffer( + (CodecInst *)handle, fb, map, numFbsForWTL, + stride, height, pDecInfo->wtlFormat, + pDecInfo->openParam.cbcrInterleave, + pDecInfo->openParam.nv21, + pDecInfo->openParam.frameEndian, vb, 0, + FB_TYPE_PPU); + + if (ret != RETCODE_SUCCESS) { + return ret; + } + } + if (numFbsForWTL == 1) { + size = ProductCalculateFrameBufSize( + handle->productId, stride, height, + (TiledMapType)mapType, format, + pDecInfo->openParam.cbcrInterleave, + &pDecInfo->dramCfg); + } else { + size = pDecInfo->frameBufPool[numFbsForDecoding + 1] + .bufY - + pDecInfo->frameBufPool[numFbsForDecoding].bufY; + } + size *= numFbsForWTL; + totalAllocSize += size; + } + + ret = ProductVpuRegisterFramebuffer(pCodecInst); + + return ret; +} + +RetCode VPU_DecRegisterFrameBuffer(DecHandle handle, FrameBuffer *bufArray, + int num, int stride, int height, int mapType) +{ + DecInfo *pDecInfo = &handle->CodecInfo->decInfo; + Uint32 numWTL = 0; + + if (pDecInfo->wtlEnable == TRUE) + numWTL = num; + return DecRegisterFrameBuffer(handle, bufArray, num, numWTL, stride, + height, mapType); +} + +RetCode VPU_DecRegisterFrameBufferEx(DecHandle handle, FrameBuffer *bufArray, + int numOfDecFbs, int numOfDisplayFbs, + int stride, int height, int mapType) +{ + return DecRegisterFrameBuffer(handle, bufArray, numOfDecFbs, + numOfDisplayFbs, stride, height, mapType); +} + +#ifdef REDUNDENT_CODE +RetCode VPU_DecGetFrameBuffer(DecHandle handle, int frameIdx, + FrameBuffer *frameBuf) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + if (frameBuf == 0) + return RETCODE_INVALID_PARAM; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + if (frameIdx < 0 || frameIdx >= pDecInfo->numFrameBuffers) + return RETCODE_INVALID_PARAM; + + *frameBuf = pDecInfo->frameBufPool[frameIdx]; + + return RETCODE_SUCCESS; +} + +RetCode VPU_DecUpdateFrameBuffer(DecHandle handle) +{ + if (handle == NULL) { + return RETCODE_INVALID_HANDLE; + } + + return ProductVpuDecUpdateFrameBuffer(); +} + +RetCode VPU_DecSetBitstreamBuffer(DecHandle handle, PhysicalAddress rdPtr, + PhysicalAddress wrPtr) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + SetClockGate(pCodecInst->coreIdx, 1); + + if (GetPendingInst(pCodecInst->coreIdx) == pCodecInst) + VpuWriteReg(pCodecInst->coreIdx, pDecInfo->streamRdPtrRegAddr, + rdPtr); + else + pDecInfo->streamRdPtr = rdPtr; + + SetClockGate(pCodecInst->coreIdx, 0); + + pDecInfo->streamWrPtr = wrPtr; + + return RETCODE_SUCCESS; +} +#endif + +RetCode VPU_DecGetBitstreamBuffer(DecHandle handle, PhysicalAddress *prdPtr, + PhysicalAddress *pwrPtr, Uint32 *size) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + PhysicalAddress rdPtr; + PhysicalAddress wrPtr; + PhysicalAddress tempPtr; + int room; + Int32 coreIdx; + VpuAttr *pAttr; + + coreIdx = handle->coreIdx; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + SetClockGate(coreIdx, TRUE); + + if (GetPendingInst(coreIdx) == pCodecInst) { + if (pCodecInst->codecMode == AVC_DEC && + pCodecInst->codecModeAux == AVC_AUX_MVC) { + rdPtr = pDecInfo->streamRdPtr; + } else { + rdPtr = VpuReadReg(coreIdx, + pDecInfo->streamRdPtrRegAddr); + } + } else { + rdPtr = pDecInfo->streamRdPtr; + } + + SetClockGate(coreIdx, FALSE); + + wrPtr = pDecInfo->streamWrPtr; + + pAttr = &g_VpuCoreAttributes[coreIdx]; + if (pCodecInst->productId == PRODUCT_ID_4102 || + pCodecInst->productId == PRODUCT_ID_420 || + pCodecInst->productId == PRODUCT_ID_412 || + pCodecInst->productId == PRODUCT_ID_420L || + (pCodecInst->productId == PRODUCT_ID_7Q && + pCodecInst->codecMode == C7_HEVC_DEC)) { + if (pDecInfo->openParam.bitstreamMode != BS_MODE_PIC_END) { + tempPtr = pDecInfo->prevFrameEndPos; + } else { + tempPtr = rdPtr; + } + } else { + tempPtr = rdPtr; + } + + if (pDecInfo->openParam.bitstreamMode != BS_MODE_PIC_END) { + if (wrPtr < tempPtr) { + room = tempPtr - wrPtr - + pAttr->bitstreamBufferMargin * 2; + } else { + room = (pDecInfo->streamBufEndAddr - wrPtr) + + (tempPtr - pDecInfo->streamBufStartAddr) - + pAttr->bitstreamBufferMargin * 2; + } + room--; + } else { + room = (pDecInfo->streamBufEndAddr - wrPtr); + } + + if (prdPtr) + *prdPtr = tempPtr; + if (pwrPtr) + *pwrPtr = wrPtr; + if (size) + *size = room; + + return RETCODE_SUCCESS; +} + +RetCode VPU_DecUpdateBitstreamBuffer(DecHandle handle, int size) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + PhysicalAddress wrPtr; + PhysicalAddress rdPtr; + RetCode ret; + BOOL running; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + wrPtr = pDecInfo->streamWrPtr; + + SetClockGate(pCodecInst->coreIdx, 1); + + running = (BOOL)(GetPendingInst(pCodecInst->coreIdx) == pCodecInst); + + if (size > 0) { + Uint32 room = 0; + + if (running == TRUE) + rdPtr = VpuReadReg(pCodecInst->coreIdx, + pDecInfo->streamRdPtrRegAddr); + else + rdPtr = pDecInfo->streamRdPtr; + + if (wrPtr < rdPtr) { + if (rdPtr <= wrPtr + size) { + SetClockGate(pCodecInst->coreIdx, 0); + return RETCODE_INVALID_PARAM; + } + } + + wrPtr += size; + + if (wrPtr > pDecInfo->streamBufEndAddr) { + room = wrPtr - pDecInfo->streamBufEndAddr; + wrPtr = pDecInfo->streamBufStartAddr; + wrPtr += room; + } else if (wrPtr == pDecInfo->streamBufEndAddr) { + wrPtr = pDecInfo->streamBufStartAddr; + } + + pDecInfo->streamWrPtr = wrPtr; + pDecInfo->streamRdPtr = rdPtr; + + if (running == TRUE) { + VpuAttr *pAttr = + &g_VpuCoreAttributes[pCodecInst->coreIdx]; + if (pAttr->supportCommandQueue == FALSE) { + VpuWriteReg(pCodecInst->coreIdx, + pDecInfo->streamWrPtrRegAddr, + wrPtr); + } + } + } + + ret = ProductVpuDecSetBitstreamFlag(pCodecInst, running, size); + + SetClockGate(pCodecInst->coreIdx, 0); + return ret; +} + +#ifdef REDUNDENT_CODE +RetCode VPU_HWReset(Uint32 coreIdx) +{ + if (vdi_hw_reset(coreIdx) < 0) + return RETCODE_FAILURE; + + if (GetPendingInst(coreIdx)) { + SetPendingInst(coreIdx, NULL, __func__, __LINE__); + // state; + } + return RETCODE_SUCCESS; +} +#endif + +/** + * VPU_SWReset + * IN + * forcedReset : 1 if there is no need to waiting for BUS transaction, + * 0 for otherwise + * OUT + * RetCode : RETCODE_FAILURE if failed to reset, + * RETCODE_SUCCESS for otherwise + */ +RetCode VPU_SWReset(Uint32 coreIdx, SWResetMode resetMode, void *pendingInst) +{ + CodecInst *pCodecInst = (CodecInst *)pendingInst; + RetCode ret = RETCODE_SUCCESS; + + SetClockGate(coreIdx, 1); + + if (pCodecInst) { + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + SetClockGate(coreIdx, 1); +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) { + vdi_log(pCodecInst->coreIdx, + (pCodecInst->productId == PRODUCT_ID_960 || + pCodecInst->productId == PRODUCT_ID_980) ? + 0x10 : + 0x10000, + 1); + } +#endif + } + + ret = ProductVpuReset(coreIdx, resetMode); + + if (pCodecInst) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) { + vdi_log(pCodecInst->coreIdx, + (pCodecInst->productId == PRODUCT_ID_960 || + pCodecInst->productId == PRODUCT_ID_980) ? + 0x10 : + 0x10000, + 0); + } +#endif + } + + SetClockGate(coreIdx, 0); + + return ret; +} + +#ifdef REDUNDENT_CODE +//---- VPU_SLEEP/WAKE +RetCode VPU_SleepWake(Uint32 coreIdx, int iSleepWake) +{ + RetCode ret; + + SetClockGate(coreIdx, TRUE); + ret = ProductVpuSleepWake(coreIdx, iSleepWake, s_pusBitCode[coreIdx], + s_bitCodeSize[coreIdx]); + SetClockGate(coreIdx, FALSE); + + return ret; +} +#endif + +//---- VPU_SLEEP/WAKE EX +RetCode VPU_SleepWake_EX(Uint32 coreIdx, int iSleepWake) +{ + RetCode ret; + + SetClockGate(coreIdx, TRUE); + ret = ProductVpuSleepWake_EX(coreIdx, iSleepWake, s_pusBitCode[coreIdx], + s_bitCodeSize[coreIdx]); + SetClockGate(coreIdx, FALSE); + + return ret; +} + +RetCode VPU_DecStartOneFrame(DecHandle handle, DecParam *param) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + Uint32 val = 0; + RetCode ret = RETCODE_SUCCESS; + VpuAttr *pAttr = NULL; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + pCodecInst = (CodecInst *)handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + if (pDecInfo->stride == 0) { // This means frame buffers have not been + // registered. + return RETCODE_WRONG_CALL_SEQUENCE; + } + + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + + if (GetPendingInst(pCodecInst->coreIdx)) { + return RETCODE_FRAME_NOT_COMPLETE; + } + + if (pAttr->supportCommandQueue == FALSE) { + EnterDispFlagLock(pCodecInst->coreIdx); + val = pDecInfo->frameDisplayFlag; + val |= pDecInfo->setDisplayIndexes; + val &= ~(Uint32)(pDecInfo->clearDisplayIndexes); + CVI_VC_DISP( + "frmDispFlag = 0x%X, DispIdx = 0x%X, clearDisplayIdx = 0x%X\n", + pDecInfo->frameDisplayFlag, pDecInfo->setDisplayIndexes, + pDecInfo->clearDisplayIndexes); + + VpuWriteReg(pCodecInst->coreIdx, + pDecInfo->frameDisplayFlagRegAddr, val); + pDecInfo->clearDisplayIndexes = 0; + pDecInfo->setDisplayIndexes = 0; + LeaveDispFlagLock(pCodecInst->coreIdx); + } + + pDecInfo->frameStartPos = pDecInfo->streamRdPtr; + + ret = ProductVpuDecode(pCodecInst, param); + + if (pAttr->supportCommandQueue == TRUE) { + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + } else { + SetPendingInst(pCodecInst->coreIdx, pCodecInst, __func__, + __LINE__); + } + + return ret; +} + +RetCode VPU_DecGetOutputInfo(DecHandle handle, DecOutputInfo *info) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; + VpuRect rectInfo; + Uint32 val; + Int32 decodedIndex; + Int32 displayIndex; + Uint32 maxDecIndex; + VpuAttr *pAttr; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + if (info == 0) { + return RETCODE_INVALID_PARAM; + } + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + + if (pAttr->supportCommandQueue == FALSE) { + if (pCodecInst != GetPendingInst(pCodecInst->coreIdx)) { + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, + __LINE__); + CVI_VC_ERR("SetPendingInst clear\n"); + return RETCODE_WRONG_CALL_SEQUENCE; + } + } + + osal_memset((void *)info, 0x00, sizeof(DecOutputInfo)); + + ret = ProductVpuDecGetResult(pCodecInst, info); + if (ret != RETCODE_SUCCESS) { + info->rdPtr = pDecInfo->streamRdPtr; + info->wrPtr = pDecInfo->streamWrPtr; + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + CVI_VC_ERR("SetPendingInst clear\n"); + return ret; + } + + decodedIndex = info->indexFrameDecoded; + + // Calculate display frame region + val = 0; + if (decodedIndex >= 0 && decodedIndex < MAX_GDI_IDX) { + // default value + rectInfo.left = 0; + rectInfo.right = info->decPicWidth; + rectInfo.top = 0; + rectInfo.bottom = info->decPicHeight; + + if (pCodecInst->codecMode == HEVC_DEC || + pCodecInst->codecMode == AVC_DEC || + pCodecInst->codecMode == C7_AVC_DEC || + pCodecInst->codecMode == AVS_DEC) + rectInfo = pDecInfo->initialInfo.picCropRect; + + if (pCodecInst->codecMode == HEVC_DEC) + pDecInfo->decOutInfo[decodedIndex].h265Info.decodedPOC = + info->h265Info.decodedPOC; + + info->rcDecoded.left = + pDecInfo->decOutInfo[decodedIndex].rcDecoded.left = + rectInfo.left; + info->rcDecoded.right = + pDecInfo->decOutInfo[decodedIndex].rcDecoded.right = + rectInfo.right; + info->rcDecoded.top = + pDecInfo->decOutInfo[decodedIndex].rcDecoded.top = + rectInfo.top; + info->rcDecoded.bottom = + pDecInfo->decOutInfo[decodedIndex].rcDecoded.bottom = + rectInfo.bottom; + } else { + info->rcDecoded.left = 0; + info->rcDecoded.right = info->decPicWidth; + info->rcDecoded.top = 0; + info->rcDecoded.bottom = info->decPicHeight; + } + + displayIndex = info->indexFrameDisplay; + if (info->indexFrameDisplay >= 0 && + info->indexFrameDisplay < MAX_GDI_IDX) { +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == VC1_DEC || + pCodecInst->codecMode == C7_VC1_DEC) // vc1 rotates decoded + // frame buffer region. + // the other std + // rotated whole frame + // buffer region. + { + if (pDecInfo->rotationEnable && + (pDecInfo->rotationAngle == 90 || + pDecInfo->rotationAngle == 270)) { + info->rcDisplay.left = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.top; + info->rcDisplay.right = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.bottom; + info->rcDisplay.top = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.left; + info->rcDisplay.bottom = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.right; + } else { + info->rcDisplay.left = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.left; + info->rcDisplay.right = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.right; + info->rcDisplay.top = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.top; + info->rcDisplay.bottom = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.bottom; + } + } else +#endif + { + if (pDecInfo->rotationEnable) { + switch (pDecInfo->rotationAngle) { + case 90: + info->rcDisplay.left = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.top; + info->rcDisplay.right = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.bottom; + info->rcDisplay.top = + info->decPicWidth - + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.right; + info->rcDisplay.bottom = + info->decPicWidth - + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.left; + break; + case 270: + info->rcDisplay.left = + info->decPicHeight - + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.bottom; + info->rcDisplay.right = + info->decPicHeight - + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.top; + info->rcDisplay.top = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.left; + info->rcDisplay.bottom = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.right; + break; + case 180: + info->rcDisplay.left = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.left; + info->rcDisplay.right = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.right; + info->rcDisplay.top = + info->decPicHeight - + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.bottom; + info->rcDisplay.bottom = + info->decPicHeight - + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.top; + break; + default: + info->rcDisplay.left = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.left; + info->rcDisplay.right = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.right; + info->rcDisplay.top = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.top; + info->rcDisplay.bottom = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.bottom; + break; + } + + } else { + info->rcDisplay.left = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.left; + info->rcDisplay.right = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.right; + info->rcDisplay.top = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.top; + info->rcDisplay.bottom = + pDecInfo->decOutInfo[displayIndex] + .rcDecoded.bottom; + } + + if (pDecInfo->mirrorEnable) { + Uint32 temp; + if (pDecInfo->mirrorDirection & MIRDIR_VER) { + temp = info->rcDisplay.top; + info->rcDisplay.top = + info->decPicHeight - + info->rcDisplay.bottom; + info->rcDisplay.bottom = + info->decPicHeight - temp; + } + if (pDecInfo->mirrorDirection & MIRDIR_HOR) { + temp = info->rcDisplay.left; + info->rcDisplay.left = + info->decPicWidth - + info->rcDisplay.right; + info->rcDisplay.right = + info->decPicWidth - temp; + } + } + + switch (pCodecInst->codecMode) { + case HEVC_DEC: + info->h265Info.displayPOC = + pDecInfo->decOutInfo[displayIndex] + .h265Info.decodedPOC; + break; + default: + break; + } + } + + if (info->indexFrameDisplay == info->indexFrameDecoded) { + info->dispPicWidth = info->decPicWidth; + info->dispPicHeight = info->decPicHeight; + } else { + /* + When indexFrameDecoded < 0, and indexFrameDisplay >= 0 + info->decPicWidth and info->decPicHeight are still valid + But those of pDecInfo->decOutInfo[displayIndex] are invalid in + VP9 + */ + info->dispPicWidth = + pDecInfo->decOutInfo[displayIndex].decPicWidth; + info->dispPicHeight = + pDecInfo->decOutInfo[displayIndex].decPicHeight; + } + + } else { + info->rcDisplay.left = 0; + info->rcDisplay.right = 0; + info->rcDisplay.top = 0; + info->rcDisplay.bottom = 0; + + if (pDecInfo->rotationEnable || pDecInfo->mirrorEnable || + pDecInfo->tiled2LinearEnable || pDecInfo->deringEnable) { + info->dispPicWidth = info->decPicWidth; + info->dispPicHeight = info->decPicHeight; + } else { + info->dispPicWidth = 0; + info->dispPicHeight = 0; + } + } + +#ifdef REDUNDENT_CODE + if ((pCodecInst->codecMode == VC1_DEC || + pCodecInst->codecMode == C7_VC1_DEC) && + info->indexFrameDisplay != -3) { + if (pDecInfo->vc1BframeDisplayValid == 0) { + if (info->picType == 2) + info->indexFrameDisplay = -3; + else + pDecInfo->vc1BframeDisplayValid = 1; + } + } +#endif + + pDecInfo->streamRdPtr = + VpuReadReg(pCodecInst->coreIdx, pDecInfo->streamRdPtrRegAddr); + + pDecInfo->frameDisplayFlag = VpuReadReg( + pCodecInst->coreIdx, pDecInfo->frameDisplayFlagRegAddr); +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == C7_VP9_DEC) { + pDecInfo->frameDisplayFlag &= 0xFFFF; + } +#endif + CVI_VC_DISP("frameDisplayFlag = 0x%X\n", pDecInfo->frameDisplayFlag); + + pDecInfo->frameEndPos = pDecInfo->streamRdPtr; + + if (pDecInfo->frameEndPos < pDecInfo->frameStartPos) + info->consumedByte = pDecInfo->frameEndPos + + pDecInfo->streamBufSize - + pDecInfo->frameStartPos; + else + info->consumedByte = + pDecInfo->frameEndPos - pDecInfo->frameStartPos; + + if (pDecInfo->deringEnable || pDecInfo->mirrorEnable || + pDecInfo->rotationEnable || pDecInfo->tiled2LinearEnable) { + info->dispFrame = pDecInfo->rotatorOutput; + info->dispFrame.stride = pDecInfo->rotatorStride; + CVI_VC_DISP("stride = %d\n", info->dispFrame.stride); + + } else { +#ifdef REDUNDENT_CODE + if (pCodecInst->productId == PRODUCT_ID_7Q && + pCodecInst->codecMode != C7_HEVC_DEC) { + if ((pCodecInst->codecMode == C7_AVC_DEC && + pDecInfo->initialInfo.interlace == 0)) // [TO BE + // OPT] use + // fbc + // enable + // information + // to adjust + // bfOffset + val = pDecInfo->numFbsForDecoding; + else + val = 0; + } else +#endif + { + val = (pDecInfo->openParam.wtlEnable == TRUE ? + pDecInfo->numFbsForDecoding : + 0); // fbOffset + } + + maxDecIndex = + (pDecInfo->numFbsForDecoding > pDecInfo->numFbsForWTL) ? + pDecInfo->numFbsForDecoding : + pDecInfo->numFbsForWTL; + + if (0 <= info->indexFrameDisplay && + info->indexFrameDisplay < (int)maxDecIndex) { + info->dispFrame = + pDecInfo->frameBufPool[val + + info->indexFrameDisplay]; + CVI_VC_DISP("indexFrameDisplay = %d\n", + info->indexFrameDisplay); + } + } + + info->rdPtr = pDecInfo->streamRdPtr; + info->wrPtr = pDecInfo->streamWrPtr; + info->frameDisplayFlag = pDecInfo->frameDisplayFlag; + + info->sequenceNo = pDecInfo->initialInfo.sequenceNo; + if (decodedIndex >= 0 && decodedIndex < MAX_GDI_IDX) { + pDecInfo->decOutInfo[decodedIndex] = *info; + } + + if (displayIndex >= 0 && displayIndex < MAX_GDI_IDX) { + info->numOfTotMBs = info->numOfTotMBs; + info->numOfErrMBs = info->numOfErrMBs; + info->numOfTotMBsInDisplay = + pDecInfo->decOutInfo[displayIndex].numOfTotMBs; + info->numOfErrMBsInDisplay = + pDecInfo->decOutInfo[displayIndex].numOfErrMBs; + info->dispFrame.sequenceNo = info->sequenceNo; + } else { + info->numOfTotMBsInDisplay = 0; + info->numOfErrMBsInDisplay = 0; + } + + if (info->sequenceChanged != 0) { + if (!(pCodecInst->productId == PRODUCT_ID_960 || + pCodecInst->productId == PRODUCT_ID_980 || + pCodecInst->productId == PRODUCT_ID_7Q)) { + /* Update new sequence information */ + osal_memcpy((void *)&pDecInfo->initialInfo, + (void *)&pDecInfo->newSeqInfo, + sizeof(DecInitialInfo)); + } + if ((info->sequenceChanged & SEQ_CHANGE_INTER_RES_CHANGE) != + SEQ_CHANGE_INTER_RES_CHANGE) { + pDecInfo->initialInfo.sequenceNo++; + } + } + +#ifdef REDUNDENT_CODE + if (pCodecInst->productId == PRODUCT_ID_412) { + if ((info->sequenceChanged & SEQ_CHANGE_INTER_RES_CHANGE) && + info->indexInterFrameDecoded == -1) { + pDecInfo->initialInfo.sequenceNo--; + } + } +#endif + + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + + return RETCODE_SUCCESS; +} + +RetCode VPU_DecFrameBufferFlush(DecHandle handle, DecOutputInfo *pRemainings, + Uint32 *retNum) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + DecOutputInfo *pOut; + RetCode ret; + FramebufferIndex retIndex[MAX_GDI_IDX]; + Uint32 retRemainings = 0; + Int32 i, index, val; + VpuAttr *pAttr = NULL; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + if (GetPendingInst(pCodecInst->coreIdx)) { + return RETCODE_FRAME_NOT_COMPLETE; + } + + osal_memset((void *)retIndex, 0xff, sizeof(retIndex)); + + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + if (pAttr->supportCommandQueue == FALSE) { + EnterDispFlagLock(pCodecInst->coreIdx); + val = pDecInfo->frameDisplayFlag; + val |= pDecInfo->setDisplayIndexes; + val &= ~(Uint32)(pDecInfo->clearDisplayIndexes); + VpuWriteReg(pCodecInst->coreIdx, + pDecInfo->frameDisplayFlagRegAddr, val); + pDecInfo->clearDisplayIndexes = 0; + pDecInfo->setDisplayIndexes = 0; + LeaveDispFlagLock(pCodecInst->coreIdx); + } + + ret = ProductVpuDecFlush(pCodecInst, retIndex, MAX_GDI_IDX); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + if (pRemainings != NULL) { + for (i = 0; i < MAX_GDI_IDX; i++) { + index = (pDecInfo->wtlEnable == TRUE) ? + retIndex[i].tiledIndex : + retIndex[i].linearIndex; + if (index < 0) + break; + pRemainings[i] = pDecInfo->decOutInfo[index]; + pOut = &pRemainings[i]; + pOut->indexFrameDisplay = pOut->indexFrameDecoded; + pOut->indexFrameDisplayForTiled = + pOut->indexFrameDecodedForTiled; + if (pDecInfo->wtlEnable == TRUE) + pOut->dispFrame = + pDecInfo->frameBufPool + [pDecInfo->numFbsForDecoding + + retIndex[i].linearIndex]; + else + pOut->dispFrame = pDecInfo->frameBufPool[index]; + + pOut->dispFrame.sequenceNo = pOut->sequenceNo; +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == C7_VP9_DEC || + pCodecInst->codecMode == C7_AVS2_DEC) { + Uint32 regVal; + regVal = VpuReadReg(pCodecInst->coreIdx, + W4_RET_DEC_DISPLAY_SIZE); + pOut->dispPicWidth = regVal >> 16; + pOut->dispPicHeight = regVal & 0xffff; + } else +#endif + { + pOut->dispPicWidth = pOut->decPicWidth; + pOut->dispPicHeight = pOut->decPicHeight; + } +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == VC1_DEC || + pCodecInst->codecMode == C7_VC1_DEC) // vc1 rotates + // decoded + // frame buffer + // region. the + // other std + // rotated + // whole frame + // buffer + // region. + { + if (pDecInfo->rotationEnable && + (pDecInfo->rotationAngle == 90 || + pDecInfo->rotationAngle == 270)) { + pOut->rcDisplay.left = + pDecInfo->decOutInfo[index] + .rcDecoded.top; + pOut->rcDisplay.right = + pDecInfo->decOutInfo[index] + .rcDecoded.bottom; + pOut->rcDisplay.top = + pDecInfo->decOutInfo[index] + .rcDecoded.left; + pOut->rcDisplay.bottom = + pDecInfo->decOutInfo[index] + .rcDecoded.right; + } else { + pOut->rcDisplay.left = + pDecInfo->decOutInfo[index] + .rcDecoded.left; + pOut->rcDisplay.right = + pDecInfo->decOutInfo[index] + .rcDecoded.right; + pOut->rcDisplay.top = + pDecInfo->decOutInfo[index] + .rcDecoded.top; + pOut->rcDisplay.bottom = + pDecInfo->decOutInfo[index] + .rcDecoded.bottom; + } + } else +#endif + { + if (pDecInfo->rotationEnable) { + switch (pDecInfo->rotationAngle) { + case 90: + pOut->rcDisplay.left = + pDecInfo->decOutInfo[index] + .rcDecoded.top; + pOut->rcDisplay.right = + pDecInfo->decOutInfo[index] + .rcDecoded + .bottom; + pOut->rcDisplay.top = + pOut->decPicWidth - + pDecInfo->decOutInfo[index] + .rcDecoded.right; + pOut->rcDisplay.bottom = + pOut->decPicWidth - + pDecInfo->decOutInfo[index] + .rcDecoded.left; + break; + case 270: + pOut->rcDisplay.left = + pOut->decPicHeight - + pDecInfo->decOutInfo[index] + .rcDecoded + .bottom; + pOut->rcDisplay.right = + pOut->decPicHeight - + pDecInfo->decOutInfo[index] + .rcDecoded.top; + pOut->rcDisplay.top = + pDecInfo->decOutInfo[index] + .rcDecoded.left; + pOut->rcDisplay.bottom = + pDecInfo->decOutInfo[index] + .rcDecoded.right; + break; + case 180: + pOut->rcDisplay.left = + pDecInfo->decOutInfo[index] + .rcDecoded.left; + pOut->rcDisplay.right = + pDecInfo->decOutInfo[index] + .rcDecoded.right; + pOut->rcDisplay.top = + pOut->decPicHeight - + pDecInfo->decOutInfo[index] + .rcDecoded + .bottom; + pOut->rcDisplay.bottom = + pOut->decPicHeight - + pDecInfo->decOutInfo[index] + .rcDecoded.top; + break; + default: + pOut->rcDisplay.left = + pDecInfo->decOutInfo[index] + .rcDecoded.left; + pOut->rcDisplay.right = + pDecInfo->decOutInfo[index] + .rcDecoded.right; + pOut->rcDisplay.top = + pDecInfo->decOutInfo[index] + .rcDecoded.top; + pOut->rcDisplay.bottom = + pDecInfo->decOutInfo[index] + .rcDecoded + .bottom; + break; + } + + } else { + pOut->rcDisplay.left = + pDecInfo->decOutInfo[index] + .rcDecoded.left; + pOut->rcDisplay.right = + pDecInfo->decOutInfo[index] + .rcDecoded.right; + pOut->rcDisplay.top = + pDecInfo->decOutInfo[index] + .rcDecoded.top; + pOut->rcDisplay.bottom = + pDecInfo->decOutInfo[index] + .rcDecoded.bottom; + } + } + retRemainings++; + } + } + + if (retNum) + *retNum = retRemainings; + +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, DEC_BUF_FLUSH, 0); +#endif + + return ret; +} + +RetCode VPU_DecSetRdPtr(DecHandle handle, PhysicalAddress addr, int updateWrPtr) +{ + CodecInst *pCodecInst; + CodecInst *pPendingInst; + DecInfo *pDecInfo; + RetCode ret; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) { + return ret; + } + pCodecInst = (CodecInst *)handle; + ret = ProductVpuDecCheckCapability(pCodecInst); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + pPendingInst = GetPendingInst(pCodecInst->coreIdx); + if (pCodecInst == pPendingInst) { + VpuWriteReg(pCodecInst->coreIdx, pDecInfo->streamRdPtrRegAddr, + addr); + } else { + VpuWriteReg(pCodecInst->coreIdx, pDecInfo->streamRdPtrRegAddr, + addr); + } + + pDecInfo->streamRdPtr = addr; + pDecInfo->prevFrameEndPos = addr; + if (updateWrPtr == TRUE) { + pDecInfo->streamWrPtr = addr; + } + pDecInfo->rdPtrValidFlag = 1; + + return RETCODE_SUCCESS; +} + +RetCode VPU_EncSetWrPtr(EncHandle handle, PhysicalAddress addr, int updateRdPtr) +{ + CodecInst *pCodecInst; + CodecInst *pPendingInst; + EncInfo *pEncInfo; + RetCode ret; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + pCodecInst = (CodecInst *)handle; + + if (pCodecInst->productId == PRODUCT_ID_960 || + pCodecInst->productId == PRODUCT_ID_980) { + return RETCODE_NOT_SUPPORTED_FEATURE; + } + + pEncInfo = &handle->CodecInfo->encInfo; + pPendingInst = GetPendingInst(pCodecInst->coreIdx); + if (pCodecInst == pPendingInst) { + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr, + addr); + } else { + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr, + addr); + } + pEncInfo->streamWrPtr = addr; + CVI_VC_TRACE("streamWrPtr = 0x%llX\n", pEncInfo->streamWrPtr); + + if (updateRdPtr) + pEncInfo->streamRdPtr = addr; + + return RETCODE_SUCCESS; +} + +RetCode VPU_GetCoreStatus(Uint32 coreIdx, int *pStatus) +{ + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + *pStatus = s_coreStatus[coreIdx]; + + return RETCODE_SUCCESS; +} + +RetCode VPU_SetCoreStatus(Uint32 coreIdx, int Status) +{ + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + s_coreStatus[coreIdx] = Status; + + return RETCODE_SUCCESS; +} + +int VPU_GetCoreTaskNum(Uint32 coreIdx) +{ + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + return vdi_get_task_num(coreIdx); +} + +RetCode VPU_DecClrDispFlag(DecHandle handle, int index) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret = RETCODE_SUCCESS; + Int32 endIndex; + VpuAttr *pAttr = NULL; + BOOL supportCommandQueue; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + + endIndex = (pDecInfo->openParam.wtlEnable == TRUE) ? + pDecInfo->numFbsForWTL : + pDecInfo->numFbsForDecoding; + + if ((index < 0) || (index > (endIndex - 1))) { + return RETCODE_INVALID_PARAM; + } + + supportCommandQueue = (pAttr->supportCommandQueue == TRUE); + if (supportCommandQueue == TRUE) { + ret = ProductClrDispFlag(); + } else { + EnterDispFlagLock(pCodecInst->coreIdx); + + pDecInfo->clearDisplayIndexes |= (1 << index); + CVI_VC_DISP("clearDisplayIndexes = 0x%X\n", + pDecInfo->clearDisplayIndexes); + + LeaveDispFlagLock(pCodecInst->coreIdx); + } + + return ret; +} + +RetCode VPU_DecGiveCommand(DecHandle handle, CodecCommand cmd, void *param) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; +#ifdef REDUNDENT_CODE + PhysicalAddress addr; +#endif + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + switch (cmd) { + case ENABLE_ROTATION: { + if (pDecInfo->rotatorStride == 0) { + return RETCODE_ROTATOR_STRIDE_NOT_SET; + } + pDecInfo->rotationEnable = 1; + break; + } + +#ifdef REDUNDENT_CODE + case DISABLE_ROTATION: { + pDecInfo->rotationEnable = 0; + break; + } +#endif + + case ENABLE_MIRRORING: { + if (pDecInfo->rotatorStride == 0) { + return RETCODE_ROTATOR_STRIDE_NOT_SET; + } + pDecInfo->mirrorEnable = 1; + break; + } +#ifdef REDUNDENT_CODE + case DISABLE_MIRRORING: { + pDecInfo->mirrorEnable = 0; + break; + } +#endif + case SET_MIRROR_DIRECTION: { + MirrorDirection mirDir; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + mirDir = *(MirrorDirection *)param; + if (!(mirDir == MIRDIR_NONE) && !(mirDir == MIRDIR_HOR) && + !(mirDir == MIRDIR_VER) && !(mirDir == MIRDIR_HOR_VER)) { + return RETCODE_INVALID_PARAM; + } + pDecInfo->mirrorDirection = mirDir; + + break; + } + case SET_ROTATION_ANGLE: { + int angle; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + angle = *(int *)param; + if (angle != 0 && angle != 90 && angle != 180 && angle != 270) { + return RETCODE_INVALID_PARAM; + } + if (pDecInfo->rotatorStride != 0) { + if (angle == 90 || angle == 270) { + if (pDecInfo->initialInfo.picHeight > + pDecInfo->rotatorStride) { + return RETCODE_INVALID_PARAM; + } + } else { + if (pDecInfo->initialInfo.picWidth > + pDecInfo->rotatorStride) { + return RETCODE_INVALID_PARAM; + } + } + } + + pDecInfo->rotationAngle = angle; + break; + } + case SET_ROTATOR_OUTPUT: { + FrameBuffer *frame; + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + frame = (FrameBuffer *)param; + + pDecInfo->rotatorOutput = *frame; + pDecInfo->rotatorOutputValid = 1; + break; + } + + case SET_ROTATOR_STRIDE: { + int stride; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + stride = *(int *)param; + if (stride % 8 != 0 || stride == 0) { + return RETCODE_INVALID_STRIDE; + } + + if (pDecInfo->rotationAngle == 90 || + pDecInfo->rotationAngle == 270) { + if (pDecInfo->initialInfo.picHeight > stride) { + return RETCODE_INVALID_STRIDE; + } + } else { + if (pDecInfo->initialInfo.picWidth > stride) { + return RETCODE_INVALID_STRIDE; + } + } + + pDecInfo->rotatorStride = stride; + break; + } +#ifdef REDUNDENT_CODE + case DEC_SET_SPS_RBSP: { + if (pCodecInst->codecMode != AVC_DEC && + pCodecInst->codecMode != C7_AVC_DEC) { + return RETCODE_INVALID_COMMAND; + } + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + + return SetParaSet(handle, 0, (DecParamSet *)param); + } + + case DEC_SET_PPS_RBSP: { + if (pCodecInst->codecMode != AVC_DEC && + pCodecInst->codecMode != C7_AVC_DEC) { + return RETCODE_INVALID_COMMAND; + } + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + + return SetParaSet(handle, 1, (DecParamSet *)param); + } +#endif + case ENABLE_DERING: { + if (pDecInfo->rotatorStride == 0) { + return RETCODE_ROTATOR_STRIDE_NOT_SET; + } + pDecInfo->deringEnable = 1; + break; + } + +#ifdef REDUNDENT_CODE + case DISABLE_DERING: { + pDecInfo->deringEnable = 0; + break; + } +#endif + case SET_SEC_AXI: { + SecAxiUse secAxiUse; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + secAxiUse = *(SecAxiUse *)param; + if (handle->productId == PRODUCT_ID_410 || + handle->productId == PRODUCT_ID_4102 || + handle->productId == PRODUCT_ID_420 || + handle->productId == PRODUCT_ID_412 || + handle->productId == PRODUCT_ID_420L || + handle->productId == PRODUCT_ID_510 || + handle->productId == PRODUCT_ID_512 || + handle->productId == PRODUCT_ID_515 || + handle->productId == PRODUCT_ID_520) { + pDecInfo->secAxiInfo.u.wave4.useIpEnable = + secAxiUse.u.wave4.useIpEnable; + pDecInfo->secAxiInfo.u.wave4.useLfRowEnable = + secAxiUse.u.wave4.useLfRowEnable; + pDecInfo->secAxiInfo.u.wave4.useBitEnable = + secAxiUse.u.wave4.useBitEnable; +#ifdef REDUNDENT_CODE + } else if (handle->productId == PRODUCT_ID_7Q) { + if (handle->codecMode == C7_HEVC_DEC) { + pDecInfo->secAxiInfo.u.wave4.useIpEnable = + secAxiUse.u.wave4.useIpEnable; + pDecInfo->secAxiInfo.u.wave4.useLfRowEnable = + secAxiUse.u.wave4.useLfRowEnable; + pDecInfo->secAxiInfo.u.wave4.useBitEnable = + secAxiUse.u.wave4.useBitEnable; + } else { + pDecInfo->secAxiInfo.u.coda9.useBitEnable = + secAxiUse.u.coda9.useBitEnable; + pDecInfo->secAxiInfo.u.coda9.useIpEnable = + secAxiUse.u.coda9.useIpEnable; + pDecInfo->secAxiInfo.u.coda9.useDbkYEnable = + secAxiUse.u.coda9.useDbkYEnable; + pDecInfo->secAxiInfo.u.coda9.useDbkCEnable = + secAxiUse.u.coda9.useDbkCEnable; + pDecInfo->secAxiInfo.u.coda9.useOvlEnable = + secAxiUse.u.coda9.useOvlEnable; + } +#endif + } else { + pDecInfo->secAxiInfo.u.coda9.useBitEnable = + secAxiUse.u.coda9.useBitEnable; + pDecInfo->secAxiInfo.u.coda9.useIpEnable = + secAxiUse.u.coda9.useIpEnable; + pDecInfo->secAxiInfo.u.coda9.useDbkYEnable = + secAxiUse.u.coda9.useDbkYEnable; + pDecInfo->secAxiInfo.u.coda9.useDbkCEnable = + secAxiUse.u.coda9.useDbkCEnable; + pDecInfo->secAxiInfo.u.coda9.useOvlEnable = + secAxiUse.u.coda9.useOvlEnable; + pDecInfo->secAxiInfo.u.coda9.useBtpEnable = + secAxiUse.u.coda9.useBtpEnable; + } + + break; + } + case ENABLE_REP_USERDATA: { + if (!pDecInfo->userDataBufAddr) { + return RETCODE_USERDATA_BUF_NOT_SET; + } + if (pDecInfo->userDataBufSize == 0) { + return RETCODE_USERDATA_BUF_NOT_SET; + } + switch (pCodecInst->productId) { + case PRODUCT_ID_4102: + case PRODUCT_ID_410: + case PRODUCT_ID_412: + case PRODUCT_ID_7Q: + case PRODUCT_ID_510: + case PRODUCT_ID_512: + case PRODUCT_ID_515: + case PRODUCT_ID_420: + case PRODUCT_ID_420L: + pDecInfo->userDataEnable = *(Uint32 *)param; + break; + case PRODUCT_ID_960: + case PRODUCT_ID_980: + pDecInfo->userDataEnable = TRUE; + break; + default: + VLOG(INFO, + "%s(ENABLE_REP_DATA) invalid productId(%d)\n", + __func__, pCodecInst->productId); + return RETCODE_INVALID_PARAM; + } + break; + } + case DISABLE_REP_USERDATA: { + pDecInfo->userDataEnable = 0; + break; + } + case SET_ADDR_REP_USERDATA: { + PhysicalAddress userDataBufAddr; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + userDataBufAddr = *(PhysicalAddress *)param; + if (userDataBufAddr % 8 != 0 || userDataBufAddr == 0) { + return RETCODE_INVALID_PARAM; + } + + pDecInfo->userDataBufAddr = userDataBufAddr; + break; + } +#ifdef REDUNDENT_CODE + case SET_VIRT_ADDR_REP_USERDATA: { + __u8 *userDataVirtAddr; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + + if (!pDecInfo->userDataBufAddr) { + return RETCODE_USERDATA_BUF_NOT_SET; + } + if (pDecInfo->userDataBufSize == 0) { + return RETCODE_USERDATA_BUF_NOT_SET; + } + + userDataVirtAddr = *(void **)param; + if (!userDataVirtAddr) { + return RETCODE_INVALID_PARAM; + } + + pDecInfo->vbUserData.phys_addr = pDecInfo->userDataBufAddr; + pDecInfo->vbUserData.size = pDecInfo->userDataBufSize; + pDecInfo->vbUserData.virt_addr = userDataVirtAddr; + if (vdi_attach_dma_memory(pCodecInst->coreIdx, + &pDecInfo->vbUserData) != 0) { + return RETCODE_INSUFFICIENT_RESOURCE; + } + break; + } +#endif + case SET_SIZE_REP_USERDATA: { + PhysicalAddress userDataBufSize; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + userDataBufSize = *(PhysicalAddress *)param; + + pDecInfo->userDataBufSize = userDataBufSize; + break; + } + +#ifdef REDUNDENT_CODE + case SET_USERDATA_REPORT_MODE: { + int userDataMode; + + userDataMode = *(int *)param; + if (userDataMode != 1 && userDataMode != 0) { + return RETCODE_INVALID_PARAM; + } + pDecInfo->userDataReportMode = userDataMode; + break; + } + /** WAVE4 CU DATA REPORT INTERFACE **/ + case ENABLE_REP_CUDATA: + if (!pDecInfo->cuDataBufAddr) { + /* share error code with USERDATA */ + return RETCODE_USERDATA_BUF_NOT_SET; + } + if (pDecInfo->cuDataBufSize == 0) { + /* share error code with USERDATA */ + return RETCODE_USERDATA_BUF_NOT_SET; + } + pDecInfo->cuDataEnable = TRUE; + break; + case DISABLE_REP_CUDATA: + pDecInfo->cuDataEnable = FALSE; + break; + case SET_ADDR_REP_CUDATA: + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + addr = *(PhysicalAddress *)param; + if ((addr % 8) != 0 || addr == 0) { + return RETCODE_INVALID_PARAM; + } + + pDecInfo->cuDataBufAddr = addr; + break; + case SET_SIZE_REP_CUDATA: + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + pDecInfo->cuDataBufSize = *(PhysicalAddress *)param; + break; +#endif + /************************************/ + case SET_CACHE_CONFIG: { + MaverickCacheConfig *mcCacheConfig; + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + mcCacheConfig = (MaverickCacheConfig *)param; + pDecInfo->cacheConfig = *mcCacheConfig; + } break; + case SET_LOW_DELAY_CONFIG: { + LowDelayInfo *lowDelayInfo; + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + if (pCodecInst->productId != PRODUCT_ID_980) { + return RETCODE_NOT_SUPPORTED_FEATURE; + } + lowDelayInfo = (LowDelayInfo *)param; + + if (lowDelayInfo->lowDelayEn) { + if ((pCodecInst->codecMode != AVC_DEC && + pCodecInst->codecMode != C7_AVC_DEC) || + pDecInfo->rotationEnable || + pDecInfo->mirrorEnable || + pDecInfo->tiled2LinearEnable || + pDecInfo->deringEnable) { + return RETCODE_INVALID_PARAM; + } + } + + pDecInfo->lowDelayInfo.lowDelayEn = lowDelayInfo->lowDelayEn; + pDecInfo->lowDelayInfo.numRows = lowDelayInfo->numRows; + } break; + +#ifdef REDUNDENT_CODE + case SET_DECODE_FLUSH: // interrupt mode to pic_end + ret = ProductCpbFlush((CodecInst *)handle); + break; + + case DEC_SET_FRAME_DELAY: { + pDecInfo->frameDelay = *(int *)param; + break; + } + case DEC_ENABLE_REORDER: { + if ((handle->productId == PRODUCT_ID_980) || + (handle->productId == PRODUCT_ID_960) || + (handle->productId == PRODUCT_ID_950) || + (handle->productId == PRODUCT_ID_7503) || + (handle->productId == PRODUCT_ID_320)) { + if (pDecInfo->initialInfoObtained) { + return RETCODE_WRONG_CALL_SEQUENCE; + } + } + + pDecInfo->reorderEnable = 1; + break; + } + case DEC_DISABLE_REORDER: { + if ((handle->productId == PRODUCT_ID_980) || + (handle->productId == PRODUCT_ID_960) || + (handle->productId == PRODUCT_ID_950) || + (handle->productId == PRODUCT_ID_7503) || + (handle->productId == PRODUCT_ID_320)) { + if (pDecInfo->initialInfoObtained) { + return RETCODE_WRONG_CALL_SEQUENCE; + } + + if (pCodecInst->codecMode != AVC_DEC && + pCodecInst->codecMode != VC1_DEC && + pCodecInst->codecMode != AVS_DEC && + pCodecInst->codecMode != C7_AVC_DEC && + pCodecInst->codecMode != C7_VC1_DEC && + pCodecInst->codecMode != C7_AVS_DEC) { + return RETCODE_INVALID_COMMAND; + } + } + + pDecInfo->reorderEnable = 0; + break; + } + case DEC_SET_AVC_ERROR_CONCEAL_MODE: { + if (pCodecInst->codecMode != AVC_DEC && + pCodecInst->codecMode != C7_AVC_DEC) { + return RETCODE_INVALID_COMMAND; + } + + pDecInfo->avcErrorConcealMode = *(int *)param; + break; + } +#endif + case DEC_FREE_FRAME_BUFFER: { + int i; + if (pDecInfo->vbSlice.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbSlice); + + if (pDecInfo->vbFrame.size) { + if (pDecInfo->frameAllocExt == 0) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFrame); + } + for (i = 0; i < MAX_REG_FRAME; i++) { + if (pDecInfo->vbFbcYTbl[i].size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFbcYTbl[i]); + + if (pDecInfo->vbFbcCTbl[i].size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFbcCTbl[i]); + + if (pDecInfo->vbMV[i].size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbMV[i]); + } + + if (pDecInfo->vbPPU.size) { + if (pDecInfo->ppuAllocExt == 0) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbPPU); + } + + if (pDecInfo->wtlEnable) { + if (pDecInfo->vbWTL.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbWTL); + } + break; + } + case DEC_GET_FRAMEBUF_INFO: { + DecGetFramebufInfo *fbInfo = (DecGetFramebufInfo *)param; + Uint32 i; + fbInfo->vbFrame = pDecInfo->vbFrame; + fbInfo->vbWTL = pDecInfo->vbWTL; + for (i = 0; i < MAX_REG_FRAME; i++) { + fbInfo->vbFbcYTbl[i] = pDecInfo->vbFbcYTbl[i]; + fbInfo->vbFbcCTbl[i] = pDecInfo->vbFbcCTbl[i]; + fbInfo->vbMvCol[i] = pDecInfo->vbMV[i]; + } + + for (i = 0; i < MAX_GDI_IDX * 2; i++) { + fbInfo->framebufPool[i] = pDecInfo->frameBufPool[i]; + } + } break; + case DEC_RESET_FRAMEBUF_INFO: { + int i; + + pDecInfo->vbFrame.base = 0; + pDecInfo->vbFrame.phys_addr = 0; + pDecInfo->vbFrame.virt_addr = 0; + pDecInfo->vbFrame.size = 0; + pDecInfo->vbWTL.base = 0; + pDecInfo->vbWTL.phys_addr = 0; + pDecInfo->vbWTL.virt_addr = 0; + pDecInfo->vbWTL.size = 0; + for (i = 0; i < MAX_REG_FRAME; i++) { + pDecInfo->vbFbcYTbl[i].base = 0; + pDecInfo->vbFbcYTbl[i].phys_addr = 0; + pDecInfo->vbFbcYTbl[i].virt_addr = 0; + pDecInfo->vbFbcYTbl[i].size = 0; + pDecInfo->vbFbcCTbl[i].base = 0; + pDecInfo->vbFbcCTbl[i].phys_addr = 0; + pDecInfo->vbFbcCTbl[i].virt_addr = 0; + pDecInfo->vbFbcCTbl[i].size = 0; + pDecInfo->vbMV[i].base = 0; + pDecInfo->vbMV[i].phys_addr = 0; + pDecInfo->vbMV[i].virt_addr = 0; + pDecInfo->vbMV[i].size = 0; + } + + pDecInfo->frameDisplayFlag = 0; + pDecInfo->setDisplayIndexes = 0; + pDecInfo->clearDisplayIndexes = 0; + break; + } +#ifdef REDUNDENT_CODE + case DEC_GET_QUEUE_STATUS: { + DecQueueStatusInfo *queueInfo = (DecQueueStatusInfo *)param; + queueInfo->instanceQueueCount = pDecInfo->instanceQueueCount; + queueInfo->totalQueueCount = pDecInfo->totalQueueCount; + break; + } +#endif + + case ENABLE_DEC_THUMBNAIL_MODE: { + pDecInfo->thumbnailMode = 1; + break; + } + case DEC_GET_SEQ_INFO: { + DecInitialInfo *seqInfo = (DecInitialInfo *)param; + *seqInfo = pDecInfo->initialInfo; + break; + } +#ifdef REDUNDENT_CODE + case DEC_GET_FIELD_PIC_TYPE: { + return RETCODE_FAILURE; + } + case DEC_GET_DISPLAY_OUTPUT_INFO: { + DecOutputInfo *pDecOutInfo = (DecOutputInfo *)param; + *pDecOutInfo = + pDecInfo->decOutInfo[pDecOutInfo->indexFrameDisplay]; + break; + } +#endif + case GET_TILEDMAP_CONFIG: { + TiledMapConfig *pMapCfg = (TiledMapConfig *)param; + if (!pMapCfg) { + return RETCODE_INVALID_PARAM; + } + if (!pDecInfo->stride) { + return RETCODE_WRONG_CALL_SEQUENCE; + } + *pMapCfg = pDecInfo->mapCfg; + break; + } +#ifdef REDUNDENT_CODE + case SET_DRAM_CONFIG: { + DRAMConfig *cfg = (DRAMConfig *)param; + + if (!cfg) { + return RETCODE_INVALID_PARAM; + } + + pDecInfo->dramCfg = *cfg; + break; + } + case GET_DRAM_CONFIG: { + DRAMConfig *cfg = (DRAMConfig *)param; + + if (!cfg) { + return RETCODE_INVALID_PARAM; + } + + *cfg = pDecInfo->dramCfg; + + break; + } + case GET_LOW_DELAY_OUTPUT: { + DecOutputInfo *lowDelayOutput; + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + + if (!pDecInfo->lowDelayInfo.lowDelayEn || + pCodecInst->codecMode != AVC_DEC) { + return RETCODE_INVALID_COMMAND; + } + + if (pCodecInst != GetPendingInst(pCodecInst->coreIdx)) { + return RETCODE_WRONG_CALL_SEQUENCE; + } + + lowDelayOutput = (DecOutputInfo *)param; + + GetLowDelayOutput(pCodecInst, lowDelayOutput); + } break; +#endif +#ifdef ENABLE_CNM_DEBUG_MSG + case ENABLE_LOGGING: { + pCodecInst->loggingEnable = 1; + break; + } + case DISABLE_LOGGING: { + pCodecInst->loggingEnable = 0; + break; + } +#endif + case DEC_SET_SEQ_CHANGE_MASK: + if (PRODUCT_ID_NOT_W_SERIES(pCodecInst->productId)) + return RETCODE_INVALID_PARAM; + pDecInfo->seqChangeMask = *(int *)param; + break; + case DEC_SET_WTL_FRAME_FORMAT: + pDecInfo->wtlFormat = *(FrameBufferFormat *)param; + break; +#ifdef REDUNDENT_CODE + case DEC_SET_DISPLAY_FLAG: { + Int32 index; + VpuAttr *pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + BOOL supportCommandQueue = FALSE; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + + index = *(Int32 *)param; + + supportCommandQueue = (pAttr->supportCommandQueue == TRUE); + if (supportCommandQueue == TRUE) { + ProductSetDispFlag(); + } else { + EnterDispFlagLock(pCodecInst->coreIdx); + + pDecInfo->setDisplayIndexes |= (1 << index); + CVI_VC_DISP("DispIdx = 0x%X\n", + pDecInfo->setDisplayIndexes); + + LeaveDispFlagLock(pCodecInst->coreIdx); + } + + } break; +#endif +#ifdef DRAM_TEST + case DRAM_READ_WRITE_TEST: { + Uint32 dram_source_addr; + Uint32 dram_destination_addr; + Uint32 dram_data_size; + Uint32 result; + Uint32 core_idx; + + unsigned int i; + // unsigned char probeData[64]; + unsigned char *probeSourceData; + unsigned char *probeDestinationData; + + dram_source_addr = 0x80000000; + dram_destination_addr = 0x90000000; + dram_data_size = 0x00000010; + core_idx = 0; + + result = ExecDRAMReadWriteTest(core_idx, &dram_source_addr, + &dram_destination_addr, + &dram_data_size); + if (result == RETCODE_SUCCESS) + VLOG(INFO, + "DRAM Read/Write Test is successful result = %x\r\n", + result); + else + VLOG(INFO, + "DRAM Read/Write Test is not successful result = %x\r\n", + result); + + probeSourceData = + (unsigned char *)osal_malloc(dram_data_size * 4); + probeDestinationData = + (unsigned char *)osal_malloc(dram_data_size * 4); + // osal_memset(probeData, 0xff, 64); + + vdi_read_memory(core_idx, dram_source_addr, probeSourceData, + dram_data_size * 4, VDI_BIG_ENDIAN); + + for (i = 0; i < (dram_data_size * 4); i = i + 8) { + printf("probeSourceData 0x%04xh: 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", + dram_source_addr + i, probeSourceData[i], + probeSourceData[i + 1], probeSourceData[i + 2], + probeSourceData[i + 3], probeSourceData[i + 4], + probeSourceData[i + 5], probeSourceData[i + 6], + probeSourceData[i + 7]); + } + + vdi_read_memory(core_idx, dram_destination_addr, + probeDestinationData, dram_data_size * 4, + VDI_BIG_ENDIAN); + + for (i = 0; i < (dram_data_size * 4); i = i + 8) { + printf("probeDestinationData 0x%04xh: 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", + dram_destination_addr + i, + probeDestinationData[i], + probeDestinationData[i + 1], + probeDestinationData[i + 2], + probeDestinationData[i + 3], + probeDestinationData[i + 4], + probeDestinationData[i + 5], + probeDestinationData[i + 6], + probeDestinationData[i + 7]); + } + + if (memcmp(probeSourceData, probeDestinationData, + dram_data_size * 4) == 0) { + printf("Source Data and Destination Data are identical\r\n"); + result = RETCODE_SUCCESS; + } else { + printf("Source Data and Destination Data are not identical\r\n"); + result = RETCODE_FAILURE; + } + + free(probeDestinationData); + free(probeSourceData); + break; + } +#endif /* SUPPORT DRAM_TEST */ + case DEC_SET_TARGET_TEMPORAL_ID: + if (param == NULL) { + return RETCODE_INVALID_PARAM; + } + + if (AVC_DEC == pCodecInst->codecMode || + HEVC_DEC == pCodecInst->codecMode) { + Uint32 targetSublayerId = *(Uint32 *)param; + Uint32 maxTargetId = + (AVC_DEC == pCodecInst->codecMode) ? + AVC_MAX_SUB_LAYER_ID : + HEVC_MAX_SUB_LAYER_ID; + + if (targetSublayerId > maxTargetId) { + ret = RETCODE_INVALID_PARAM; + } else { + pDecInfo->targetSubLayerId = targetSublayerId; + } + } else { + ret = RETCODE_NOT_SUPPORTED_FEATURE; + } + break; +#ifdef REDUNDENT_CODE + case DEC_SET_BWB_CUR_FRAME_IDX: + pDecInfo->chBwbFrameIdx = *(Uint32 *)param; + break; + case DEC_SET_FBC_CUR_FRAME_IDX: + pDecInfo->chFbcFrameIdx = *(Uint32 *)param; + break; + case DEC_SET_INTER_RES_INFO_ON: + pDecInfo->interResChange = 1; + break; + case DEC_SET_INTER_RES_INFO_OFF: + pDecInfo->interResChange = 0; + break; + case DEC_FREE_FBC_TABLE_BUFFER: { + Uint32 fbcCurFrameIdx = *(Uint32 *)param; + if (pDecInfo->vbFbcYTbl[fbcCurFrameIdx].size > 0) { + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFbcYTbl[fbcCurFrameIdx]); + pDecInfo->vbFbcYTbl[fbcCurFrameIdx].size = 0; + } + if (pDecInfo->vbFbcCTbl[fbcCurFrameIdx].size > 0) { + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFbcCTbl[fbcCurFrameIdx]); + pDecInfo->vbFbcCTbl[fbcCurFrameIdx].size = 0; + } + } break; + case DEC_FREE_MV_BUFFER: { + Uint32 fbcCurFrameIdx = *(Uint32 *)param; + if (pDecInfo->vbMV[fbcCurFrameIdx].size > 0) { + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbMV[fbcCurFrameIdx]); + pDecInfo->vbMV[fbcCurFrameIdx].size = 0; + } + } break; + case DEC_ALLOC_MV_BUFFER: { + Uint32 fbcCurFrameIdx = *(Uint32 *)param; + Uint32 size; + size = WAVE4_DEC_VP9_MVCOL_BUF_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); + pDecInfo->vbMV[fbcCurFrameIdx].phys_addr = 0; + pDecInfo->vbMV[fbcCurFrameIdx].size = + ((size + 4095) & ~4095) + 4096; /* 4096 is a margin */ + + CVI_VC_MEM("vbMV[%d].size = 0x%X\n", fbcCurFrameIdx, + pDecInfo->vbMV[fbcCurFrameIdx].size); + if (VDI_ALLOCATE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbMV[fbcCurFrameIdx], 0) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + } break; + case DEC_ALLOC_FBC_Y_TABLE_BUFFER: { + Uint32 fbcCurFrameIdx = *(Uint32 *)param; + Uint32 size; + size = WAVE4_FBC_LUMA_TABLE_SIZE( + VPU_ALIGN64(pDecInfo->initialInfo.picWidth), + VPU_ALIGN64(pDecInfo->initialInfo.picHeight)); + size = VPU_ALIGN16(size); + pDecInfo->vbFbcYTbl[fbcCurFrameIdx].phys_addr = 0; + pDecInfo->vbFbcYTbl[fbcCurFrameIdx].size = + ((size + 4095) & ~4095) + 4096; + CVI_VC_MEM("vbFbcYTbl[%d].size = 0x%X\n", fbcCurFrameIdx, + pDecInfo->vbFbcYTbl[fbcCurFrameIdx].size); + if (VDI_ALLOCATE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFbcYTbl[fbcCurFrameIdx], + 0) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + } break; + case DEC_ALLOC_FBC_C_TABLE_BUFFER: { + Uint32 fbcCurFrameIdx = *(Uint32 *)param; + Uint32 size; + size = WAVE4_FBC_CHROMA_TABLE_SIZE( + VPU_ALIGN64(pDecInfo->initialInfo.picWidth), + VPU_ALIGN64(pDecInfo->initialInfo.picHeight)); + size = VPU_ALIGN16(size); + pDecInfo->vbFbcCTbl[fbcCurFrameIdx].phys_addr = 0; + pDecInfo->vbFbcCTbl[fbcCurFrameIdx].size = + ((size + 4095) & ~4095) + 4096; + CVI_VC_MEM("vbFbcCTbl[%d].size = 0x%X\n", fbcCurFrameIdx, + pDecInfo->vbFbcCTbl[fbcCurFrameIdx].size); + if (VDI_ALLOCATE_MEMORY(pCodecInst->coreIdx, + &pDecInfo->vbFbcCTbl[fbcCurFrameIdx], + 0) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + } break; +#endif + default: + return RETCODE_INVALID_COMMAND; + } + + return ret; +} + +RetCode VPU_DecAllocateFrameBuffer(DecHandle handle, FrameBufferAllocInfo info, + FrameBuffer *frameBuffer) +{ + CodecInst *pCodecInst; + DecInfo *pDecInfo; + RetCode ret; + Uint32 gdiIndex; + + ret = CheckDecInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + if (!frameBuffer) { + return RETCODE_INVALID_PARAM; + } + + if (info.type == FB_TYPE_PPU) { + if (pDecInfo->numFrameBuffers == 0) + return RETCODE_WRONG_CALL_SEQUENCE; + if (frameBuffer[0].updateFbInfo == TRUE) { + pDecInfo->ppuAllocExt = TRUE; + } + pDecInfo->ppuAllocExt = frameBuffer[0].updateFbInfo; + gdiIndex = pDecInfo->numFbsForDecoding; + ret = ProductVpuAllocateFramebuffer( + pCodecInst, frameBuffer, (TiledMapType)info.mapType, + (Int32)info.num, info.stride, info.height, info.format, + info.cbcrInterleave, info.nv21, info.endian, + &pDecInfo->vbPPU, gdiIndex, FB_TYPE_PPU); + } else if (info.type == FB_TYPE_CODEC) { + gdiIndex = 0; + if (frameBuffer[0].updateFbInfo == TRUE) { + pDecInfo->frameAllocExt = TRUE; + } + ret = ProductVpuAllocateFramebuffer( + pCodecInst, frameBuffer, (TiledMapType)info.mapType, + (Int32)info.num, info.stride, info.height, info.format, + info.cbcrInterleave, info.nv21, info.endian, + &pDecInfo->vbFrame, gdiIndex, + (FramebufferAllocType)info.type); + + pDecInfo->mapCfg.tiledBaseAddr = pDecInfo->vbFrame.phys_addr; + } + + return ret; +} + +RetCode VPU_EncOpen(EncHandle *pHandle, EncOpenParam *pop) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + RetCode ret; + + CVI_VC_TRACE("\n"); + + ret = ProductCheckEncOpenParam(pop); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("ret = %d\n", ret); + return ret; + } + + if (VPU_IsInit(pop->coreIdx) == 0) { + return RETCODE_NOT_INITIALIZED; + } + + ret = GetCodecInstance(pop->coreIdx, &pCodecInst); + if (ret == RETCODE_FAILURE) { + *pHandle = 0; + CVI_VC_ERR("\n"); + return RETCODE_FAILURE; + } + + pCodecInst->isDecoder = FALSE; + *pHandle = pCodecInst; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + osal_memset(pEncInfo, 0x00, sizeof(EncInfo)); + pEncInfo->openParam = *pop; + + cviConfigEncParam(pCodecInst, pop); + + SetClockGate(pop->coreIdx, TRUE); + + ret = ProductVpuEncBuildUpOpenParam(pCodecInst, pop); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("\n"); + *pHandle = 0; + } + SetClockGate(pop->coreIdx, FALSE); + + return ret; +} + +RetCode cviConfigEncParam(CodecInst *pCodec, EncOpenParam *param) +{ + RetCode ret = RETCODE_SUCCESS; + EncInfo *pEncInfo = &pCodec->CodecInfo->encInfo; + + pCodec->s32ChnNum = param->s32ChnNum; + pEncInfo->cviRcEn = param->cviRcEn; + pEncInfo->addrRemapEn = param->addrRemapEn; + + return ret; +} + +void VPU_WaitPendingInst(CodecInst *pCodecInst) +{ +RETRY: + if (GetPendingInst(pCodecInst->coreIdx)) { + goto RETRY; + } + + SetPendingInst(pCodecInst->coreIdx, pCodecInst, __func__, __LINE__); +} + +RetCode VPU_EncClose(EncHandle handle) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + RetCode ret; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + VPU_WaitPendingInst(pCodecInst); + + if (pEncInfo->initialInfoObtained) { + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr, + pEncInfo->streamWrPtr); + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamRdPtrRegAddr, + pEncInfo->streamRdPtr); + + ret = ProductVpuEncFiniSeq(pCodecInst); + if (ret != RETCODE_SUCCESS) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENC_SEQ_END, 0); +#endif + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENC_SEQ_END, 0); +#endif + pEncInfo->streamWrPtr = vdi_remap_memory_address( + pCodecInst->coreIdx, + VpuReadReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr)); + } + + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + + if (pEncInfo->vbScratch.size) { + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pEncInfo->vbScratch); + } + + if (pEncInfo->vbWork.size) { + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pEncInfo->vbWork); + } + + if (pEncInfo->vbFrame.size) { + if (pEncInfo->frameAllocExt == 0) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pEncInfo->vbFrame); + } + + if (pCodecInst->codecMode == HEVC_ENC) { + if (pEncInfo->vbSubSamBuf.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pEncInfo->vbSubSamBuf); + + if (pEncInfo->vbMV.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pEncInfo->vbMV); + + if (pEncInfo->vbFbcYTbl.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pEncInfo->vbFbcYTbl); + + if (pEncInfo->vbFbcCTbl.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pEncInfo->vbFbcCTbl); + + if (pEncInfo->vbTemp.size) + vdi_dettach_dma_memory(pCodecInst->coreIdx, + &pEncInfo->vbTemp); + } + + if (pCodecInst->codecMode == C7_AVC_ENC) { + if (pEncInfo->vbFbcYTbl.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pEncInfo->vbFbcYTbl); + + if (pEncInfo->vbFbcCTbl.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pEncInfo->vbFbcCTbl); + } + + if (pEncInfo->vbPPU.size) { + if (pEncInfo->ppuAllocExt == 0) + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pEncInfo->vbPPU); + } + if (pEncInfo->vbSubSampFrame.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, &pEncInfo->vbSubSampFrame); + if (pEncInfo->vbMvcSubSampFrame.size) + VDI_FREE_MEMORY(pCodecInst->coreIdx, + &pEncInfo->vbMvcSubSampFrame); + + FreeCodecInstance(pCodecInst); + + return ret; +} + +RetCode VPU_EncGetInitialInfo(EncHandle handle, EncInitialInfo *info) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + RetCode ret; + + CVI_VC_TRACE("\n"); + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("CheckEncInstanceValidity ret error %d\n", ret); + return ret; + } + + if (info == 0) { + return RETCODE_INVALID_PARAM; + } + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + VPU_WaitPendingInst(pCodecInst); + + ret = ProductVpuEncSetup(pCodecInst); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("ProductVpuEncSetup ret error %d\n", ret); + return ret; + } + + CVI_VC_TRACE("productId = 0x%X\n", pCodecInst->productId); + if (pCodecInst->codecMode == AVC_ENC && + pCodecInst->codecModeAux == AVC_AUX_MVC) + info->minFrameBufferCount = 3; // reconstructed frame + 2 + // reference frame +#ifdef REDUNDENT_CODE + else if (pCodecInst->codecMode == C7_AVC_ENC && + pCodecInst->codecModeAux == AVC_AUX_MVC) + info->minFrameBufferCount = 3; // reconstructed frame + 2 + // reference frame +#endif + else if (pCodecInst->codecMode == HEVC_ENC) { + info->minFrameBufferCount = + pEncInfo->initialInfo.minFrameBufferCount; + info->minSrcFrameCount = pEncInfo->initialInfo.minSrcFrameCount; + } +#ifdef SUPPORT_980_ROI_RC_LIB + else if (pCodecInst->codecMode == AVC_ENC && + pCodecInst->codecModeAux == AVC_AUX_SVC) { + info->minFrameBufferCount = pEncInfo->num_total_frames; + } +#endif + else + info->minFrameBufferCount = 2; // reconstructed frame + + // reference frame + + pEncInfo->initialInfo = *info; + pEncInfo->initialInfoObtained = TRUE; + + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + + return RETCODE_SUCCESS; +} + +RetCode VPU_EncRegisterFrameBuffer(EncHandle handle, FrameBuffer *bufArray, + int num, int stride, int height, int mapType) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + Int32 i; + RetCode ret; + EncOpenParam *openParam; + FrameBuffer *fb; + + CVI_VC_TRACE("\n"); + + ret = CheckEncInstanceValidity(handle); + // FIXME temp + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + openParam = &pEncInfo->openParam; + + if (pEncInfo->stride) + return RETCODE_CALLED_BEFORE; + + if (!pEncInfo->initialInfoObtained) + return RETCODE_WRONG_CALL_SEQUENCE; + + if (num < pEncInfo->initialInfo.minFrameBufferCount) + return RETCODE_INSUFFICIENT_FRAME_BUFFERS; + + if (stride == 0 || (stride % 8 != 0) || stride < 0) + return RETCODE_INVALID_STRIDE; + + if (height == 0 || height < 0) + return RETCODE_INVALID_PARAM; + + if (openParam->bitstreamFormat == STD_HEVC) { + if (stride % 32 != 0) + return RETCODE_INVALID_STRIDE; + } + + VPU_WaitPendingInst(pCodecInst); + + pEncInfo->numFrameBuffers = num; + pEncInfo->stride = stride; + pEncInfo->frameBufferHeight = height; + pEncInfo->mapType = mapType; + pEncInfo->mapCfg.productId = pCodecInst->productId; + + if (bufArray) { + for (i = 0; i < num; i++) + pEncInfo->frameBufPool[i] = bufArray[i]; + } + + if (pEncInfo->frameAllocExt == FALSE) { + fb = pEncInfo->frameBufPool; + if (bufArray) { + if (bufArray[0].bufCb == (PhysicalAddress)-1 && + bufArray[0].bufCr == (PhysicalAddress)-1) { + Uint32 size; + pEncInfo->frameAllocExt = TRUE; + size = ProductCalculateFrameBufSize( + pCodecInst->productId, stride, height, + (TiledMapType)mapType, + openParam->srcFormat, + (BOOL)openParam->cbcrInterleave, NULL); + if (mapType == LINEAR_FRAME_MAP) { + pEncInfo->vbFrame.phys_addr = + bufArray[0].bufY; + pEncInfo->vbFrame.size = size * num; + } + } + } + ret = ProductVpuAllocateFramebuffer( + pCodecInst, fb, (TiledMapType)mapType, num, stride, + height, openParam->srcFormat, openParam->cbcrInterleave, + FALSE, openParam->frameEndian, &pEncInfo->vbFrame, 0, + FB_TYPE_CODEC); + if (ret != RETCODE_SUCCESS) { + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, + __LINE__); + CVI_VC_ERR("SetPendingInst clear\n"); + return ret; + } + } + ret = ProductVpuRegisterFramebuffer(pCodecInst); + + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + + return ret; +} + +#ifdef REDUNDENT_CODE +RetCode VPU_EncGetFrameBuffer(EncHandle handle, int frameIdx, + FrameBuffer *frameBuf) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + RetCode ret; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + if (frameIdx < 0 || frameIdx > pEncInfo->numFrameBuffers) + return RETCODE_INVALID_PARAM; + + if (frameBuf == 0) + return RETCODE_INVALID_PARAM; + + *frameBuf = pEncInfo->frameBufPool[frameIdx]; + + return RETCODE_SUCCESS; +} +#endif + +RetCode VPU_EncGetBitstreamBuffer(EncHandle handle, PhysicalAddress *prdPrt, + PhysicalAddress *pwrPtr, int *size) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + PhysicalAddress rdPtr; + PhysicalAddress wrPtr; + Uint32 room; + RetCode ret; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + if (prdPrt == 0 || pwrPtr == 0 || size == 0) { + return RETCODE_INVALID_PARAM; + } + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + rdPtr = pEncInfo->streamRdPtr; + + SetClockGate(pCodecInst->coreIdx, 1); + + if (GetPendingInst(pCodecInst->coreIdx) == pCodecInst) { + wrPtr = vdi_remap_memory_address( + pCodecInst->coreIdx, + VpuReadReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr)); + } else { + wrPtr = vdi_remap_memory_address(pCodecInst->coreIdx, + pEncInfo->streamWrPtr); + } + + SetClockGate(pCodecInst->coreIdx, 0); + if (pEncInfo->ringBufferEnable == 1 || pEncInfo->lineBufIntEn == 1) { + if (wrPtr >= rdPtr) { + room = wrPtr - rdPtr; + } else { + room = (pEncInfo->streamBufEndAddr - rdPtr) + + (wrPtr - pEncInfo->streamBufStartAddr); + } + } else { + if (wrPtr >= rdPtr) + room = wrPtr - rdPtr; + else { + CVI_VC_ERR("RETCODE_INVALID_PARAM\n"); + return RETCODE_INVALID_PARAM; + } + } + + *prdPrt = pEncInfo->streamRdPtr; + *pwrPtr = wrPtr; + *size = room; + + return RETCODE_SUCCESS; +} + +RetCode VPU_EncUpdateBitstreamBuffer(EncHandle handle, int size) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + PhysicalAddress wrPtr; + PhysicalAddress rdPtr; + RetCode ret; + int room = 0; + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + rdPtr = pEncInfo->streamRdPtr; + + SetClockGate(pCodecInst->coreIdx, 1); + + if (GetPendingInst(pCodecInst->coreIdx) == pCodecInst) + wrPtr = vdi_remap_memory_address( + pCodecInst->coreIdx, + VpuReadReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr)); + else + wrPtr = pEncInfo->streamWrPtr; + + if (rdPtr < wrPtr) { + if (rdPtr + size > wrPtr) { + SetClockGate(pCodecInst->coreIdx, 0); + CVI_VC_ERR( + "invalid param! rdPtr 0x%llx, wrPtr 0x%llx, size 0x%x\n", + rdPtr, wrPtr, size); + return RETCODE_INVALID_PARAM; + } + } + + if (pEncInfo->ringBufferEnable == TRUE || + pEncInfo->lineBufIntEn == TRUE) { + rdPtr += size; + if (rdPtr > pEncInfo->streamBufEndAddr + STREAM_BUF_SIZE_RESERVE) { + if (pEncInfo->lineBufIntEn == TRUE) { + CVI_VC_ERR( + "invalid param! rdPtr 0x%llx, streamBufEndAddr 0x%llx\n", + rdPtr, pEncInfo->streamBufEndAddr); + return RETCODE_INVALID_PARAM; + } + room = rdPtr - pEncInfo->streamBufEndAddr; + rdPtr = pEncInfo->streamBufStartAddr; + rdPtr += room; + } + + if (rdPtr == pEncInfo->streamBufEndAddr) { + rdPtr = pEncInfo->streamBufStartAddr; + } + } else { + rdPtr = pEncInfo->streamBufStartAddr; + } + + CVI_VC_TRACE("rdPtr = 0x%llX, wrPtr = 0x%llX\n", rdPtr, wrPtr); + + pEncInfo->streamRdPtr = rdPtr; + pEncInfo->streamWrPtr = wrPtr; + if (GetPendingInst(pCodecInst->coreIdx) == pCodecInst) + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamRdPtrRegAddr, + rdPtr); + + if (pEncInfo->lineBufIntEn == TRUE) { + // reset RdPtr to BufStartAddr if bEsBufQueueEn disable + if (pEncInfo->bEsBufQueueEn == 0) { + pEncInfo->streamRdPtr = pEncInfo->streamBufStartAddr; + } + } + + SetClockGate(pCodecInst->coreIdx, 0); + return RETCODE_SUCCESS; +} + +RetCode VPU_EncStartOneFrame(EncHandle handle, EncParam *param) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + RetCode ret; + VpuAttr *pAttr = NULL; + vpu_instance_pool_t *vip; + + ret = CheckEncInstanceValidity(handle); + + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("CheckEncInstanceValidity error\n"); + return ret; + } + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(pCodecInst->coreIdx); + if (!vip) { + return RETCODE_INVALID_HANDLE; + } + + if (pEncInfo->stride == 0) { // This means frame buffers have not been + // registered. + return RETCODE_WRONG_CALL_SEQUENCE; + } + + ret = CheckEncParam(handle, param); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("CheckEncParam, ret = %d\n", ret); + return ret; + } + + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + (void)pAttr; + + pEncInfo->ptsMap[param->srcIdx] = + (pEncInfo->openParam.enablePTS == TRUE) ? GetTimestamp(handle) : + param->pts; + + ret = ProductVpuEncode(pCodecInst, param); + + pCodecInst->cvi.frameNo++; + + return ret; +} + +RetCode cviVPU_LockAndCheck(EncHandle handle, int targetState, int timeout_ms) +{ + CodecInst *pCodecInst; + RetCode ret; + vpu_instance_pool_t *vip; + int err; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(pCodecInst->coreIdx); + if (!vip) { + //return invalid + return RETCODE_INVALID_HANDLE; + } + + if (timeout_ms <= -1) { + //block mode + while (1) { + EnterVcodecLock(pCodecInst->coreIdx); + + if (pCodecInst->state != targetState) { + CVI_VC_TRACE("state = %d\n", pCodecInst->state); + LeaveVcodecLock(pCodecInst->coreIdx); + cond_resched(); + } else { + break; + } + } + } else { + //time lock mode + err = VcodecTimeLock(pCodecInst->coreIdx, timeout_ms); + if (err == RETCODE_SUCCESS) { + //lock success in time < timeout_ms + if (pCodecInst->state == targetState) { + //inside the state we required , keep lock + ret = RETCODE_SUCCESS; + } else { + //not the require state ...release mutex + CVI_VC_ERR( + "pCodecInst->state mismatch target:%d\n", + targetState); + LeaveVcodecLock(pCodecInst->coreIdx); + ret = RETCODE_FAILURE; + } + } else if (err == RETCODE_VPU_RESPONSE_TIMEOUT) { + //time out + //cannot get the lock < timeout_ms + ret = RETCODE_VPU_RESPONSE_TIMEOUT; + } else { + //never been lock success + CVI_VC_ERR("VcodecTimeLock abnormal ret:%d\n", ret); + ret = RETCODE_FAILURE; + } + } + return ret; +} + +RetCode cviVPU_ChangeState(EncHandle handle) +{ + CodecInst *pCodecInst; + RetCode ret; + vpu_instance_pool_t *vip; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(pCodecInst->coreIdx); + if (!vip) { + return RETCODE_INVALID_HANDLE; + } + + pCodecInst->state = (pCodecInst->state + 1) % CODEC_STAT_MAX; + CVI_VC_TRACE("state = %d\n", pCodecInst->state); + + return ret; +} + +RetCode VPU_EncGetOutputInfo(EncHandle handle, EncOutputInfo *info) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + RetCode ret; + VpuAttr *pAttr; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("ret %d\n", ret); + return ret; + } + + if (info == 0) { + CVI_VC_ERR("info == 0\n"); + return RETCODE_INVALID_PARAM; + } + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + + if (pAttr->supportCommandQueue == FALSE) { + CodecInst *p = GetPendingInst(pCodecInst->coreIdx); + if (pCodecInst != p) { + CVI_VC_ERR("Different pCodecInst %p, p %p\n", + pCodecInst, p); + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, + __LINE__); + return RETCODE_WRONG_CALL_SEQUENCE; + } + } + + ret = ProductVpuEncGetResult(pCodecInst, info); + + if (ret == RETCODE_SUCCESS) { + info->pts = pEncInfo->ptsMap[info->encSrcIdx]; + } else { + info->pts = 0LL; + } + + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + + return ret; +} + +RetCode VPU_EncGiveCommand(EncHandle handle, CodecCommand cmd, void *param) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + RetCode ret; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + switch (cmd) { + case ENABLE_ROTATION: { + pEncInfo->rotationEnable = 1; + } break; +#ifdef REDUNDENT_CODE + case DISABLE_ROTATION: { + pEncInfo->rotationEnable = 0; + } break; +#endif + case ENABLE_MIRRORING: { + pEncInfo->mirrorEnable = 1; + } break; +#ifdef REDUNDENT_CODE + case DISABLE_MIRRORING: { + pEncInfo->mirrorEnable = 0; + } break; +#endif + case SET_MIRROR_DIRECTION: { + MirrorDirection mirDir; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + mirDir = *(MirrorDirection *)param; + if (!(mirDir == MIRDIR_NONE) && !(mirDir == MIRDIR_HOR) && + !(mirDir == MIRDIR_VER) && !(mirDir == MIRDIR_HOR_VER)) { + return RETCODE_INVALID_PARAM; + } + pEncInfo->mirrorDirection = mirDir; + } break; + case SET_ROTATION_ANGLE: { + int angle; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + angle = *(int *)param; + if (angle != 0 && angle != 90 && angle != 180 && angle != 270) { + return RETCODE_INVALID_PARAM; + } + if (pEncInfo->initialInfoObtained && + (angle == 90 || angle == 270)) { + return RETCODE_INVALID_PARAM; + } + pEncInfo->rotationAngle = angle; + } break; + case SET_CACHE_CONFIG: { + MaverickCacheConfig *mcCacheConfig; + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + mcCacheConfig = (MaverickCacheConfig *)param; + pEncInfo->cacheConfig = *mcCacheConfig; + } break; + case ENC_PUT_MP4_HEADER: + case ENC_PUT_AVC_HEADER: + case ENC_PUT_VIDEO_HEADER: { + EncHeaderParam *encHeaderParam; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + encHeaderParam = (EncHeaderParam *)param; + if (pCodecInst->codecMode == MP4_ENC || + pCodecInst->codecMode == C7_MP4_ENC) { + if (!(VOL_HEADER <= encHeaderParam->headerType && + encHeaderParam->headerType <= VIS_HEADER)) { + return RETCODE_INVALID_PARAM; + } + } else if (pCodecInst->codecMode == AVC_ENC || + pCodecInst->codecMode == C7_AVC_ENC) { + if (!(SPS_RBSP <= encHeaderParam->headerType && + encHeaderParam->headerType <= SVC_RBSP_SEI)) { + return RETCODE_INVALID_PARAM; + } + } else if (pCodecInst->codecMode == HEVC_ENC) { + if (!(CODEOPT_ENC_VPS <= encHeaderParam->headerType && + encHeaderParam->headerType <= + (CODEOPT_ENC_VPS | CODEOPT_ENC_SPS | + CODEOPT_ENC_PPS))) { + return RETCODE_INVALID_PARAM; + } + if (pEncInfo->ringBufferEnable == 0) { + if (encHeaderParam->buf % 16 || + encHeaderParam->size == 0) + return RETCODE_INVALID_PARAM; + } + if (encHeaderParam->headerType & + CODEOPT_ENC_VCL) // ENC_PUT_VIDEO_HEADER encode only + // non-vcl header. + return RETCODE_INVALID_PARAM; + + } else + return RETCODE_INVALID_PARAM; + + if (pEncInfo->ringBufferEnable == 0) { + if (encHeaderParam->buf % 8 || + encHeaderParam->size == 0) { + return RETCODE_INVALID_PARAM; + } + } + if (pCodecInst->codecMode == HEVC_ENC) { + return Wave4VpuEncGetHeader(handle, encHeaderParam); + } else { + return GetEncHeader(handle, encHeaderParam); + } + } + break; +#ifdef REDUNDENT_CODE + case ENC_SET_ACTIVE_PPS: + int ActivePPSIdx = (int)(*(int *)param); + if (pCodecInst->codecMode != AVC_ENC && pCodecInst->codecMode != C7_AVC_ENC) + return RETCODE_INVALID_COMMAND; + if (ActivePPSIdx < 0 || ActivePPSIdx > pEncInfo->openParam.EncStdParam.avcParam.ppsNum) + return RETCODE_INVALID_COMMAND; + + pEncInfo->ActivePPSIdx = ActivePPSIdx; + return EncParaSet(handle, PPS_RBSP); + case ENC_GET_ACTIVE_PPS: + if (pCodecInst->codecMode != AVC_ENC && pCodecInst->codecMode != C7_AVC_ENC) + return RETCODE_INVALID_COMMAND; + + *((int *)param) = pEncInfo->ActivePPSIdx; + break; + case ENC_SET_GOP_NUMBER: { + int *pGopNumber = (int *)param; + if (pCodecInst->codecMode != MP4_ENC && + pCodecInst->codecMode != AVC_ENC && + pCodecInst->codecMode != C7_MP4_ENC && + pCodecInst->codecMode != C7_AVC_ENC) { + return RETCODE_INVALID_COMMAND; + } + if (*pGopNumber < 0) + return RETCODE_INVALID_PARAM; + pEncInfo->openParam.gopSize = *pGopNumber; + SetGopNumber(handle, (Uint32 *)pGopNumber); + } break; + case ENC_SET_INTRA_QP: { + int *pIntraQp = (int *)param; + if (pCodecInst->codecMode != MP4_ENC && + pCodecInst->codecMode != AVC_ENC && + pCodecInst->codecMode != C7_MP4_ENC && + pCodecInst->codecMode != C7_AVC_ENC) { + return RETCODE_INVALID_COMMAND; + } + if (pCodecInst->codecMode == MP4_ENC || + pCodecInst->codecMode == C7_MP4_ENC) { + if (*pIntraQp < 1 || *pIntraQp > 31) + return RETCODE_INVALID_PARAM; + } + if (pCodecInst->codecMode == AVC_ENC || + pCodecInst->codecMode == C7_AVC_ENC) { + if (*pIntraQp < 0 || *pIntraQp > 51) + return RETCODE_INVALID_PARAM; + } + SetIntraQp(handle, (Uint32 *)pIntraQp); + } break; +#endif + case ENC_SET_BITRATE: { + int *pBitrate = (int *)param; + if (pCodecInst->codecMode != MP4_ENC && + pCodecInst->codecMode != AVC_ENC && + pCodecInst->codecMode != C7_MP4_ENC && + pCodecInst->codecMode != C7_AVC_ENC) { + return RETCODE_INVALID_COMMAND; + } + if (pCodecInst->codecMode == AVC_ENC || + pCodecInst->codecMode == C7_AVC_ENC) { + if (*pBitrate < 0 || *pBitrate > 524288) { + return RETCODE_INVALID_PARAM; + } + + } else { + // MP4_ENC + if (*pBitrate < 0 || *pBitrate > 32767) { + return RETCODE_INVALID_PARAM; + } + } + SetBitrate(handle, (Uint32 *)pBitrate); + } break; +#ifdef REDUNDENT_CODE + case ENC_SET_FRAME_RATE: { + int *pFramerate = (int *)param; + + if (pCodecInst->codecMode != MP4_ENC && + pCodecInst->codecMode != AVC_ENC && + pCodecInst->codecMode != C7_MP4_ENC && + pCodecInst->codecMode != C7_AVC_ENC) { + return RETCODE_INVALID_COMMAND; + } + if (*pFramerate <= 0) { + return RETCODE_INVALID_PARAM; + } + SetFramerate(handle, (Uint32 *)pFramerate); + } break; + case ENC_SET_INTRA_MB_REFRESH_NUMBER: { + int *pIntraRefreshNum = (int *)param; + SetIntraRefreshNum(handle, (Uint32 *)pIntraRefreshNum); + } break; +#endif + case ENC_SET_MIN_MAX_QP: { + MinMaxQpChangeParam *minMapQpParam = + (MinMaxQpChangeParam *)param; + SetMinMaxQp(handle, minMapQpParam); + } break; +#ifdef REDUNDENT_CODE +#if defined(RC_PIC_PARACHANGE) && defined(RC_CHANGE_PARAMETER_DEF) + case ENC_SET_PIC_CHANGE_PARAM: { + ChangePicParam *changePicParam = (ChangePicParam *)param; + SetChangePicPara(handle, changePicParam); + } break; +#endif + case ENC_SET_SLICE_INFO: { + EncSliceMode *pSliceMode = (EncSliceMode *)param; + if (pSliceMode->sliceMode < 0 || pSliceMode->sliceMode > 1) { + return RETCODE_INVALID_PARAM; + } + if (pSliceMode->sliceSizeMode < 0 || + pSliceMode->sliceSizeMode > 1) { + return RETCODE_INVALID_PARAM; + } + + SetSliceMode(handle, (EncSliceMode *)pSliceMode); + } break; + case ENC_ENABLE_HEC: { + if (pCodecInst->codecMode != MP4_ENC && + pCodecInst->codecMode != C7_MP4_ENC) { + return RETCODE_INVALID_COMMAND; + } + SetHecMode(handle, 1); + } break; + case ENC_DISABLE_HEC: { + if (pCodecInst->codecMode != MP4_ENC && + pCodecInst->codecMode != C7_MP4_ENC) { + return RETCODE_INVALID_COMMAND; + } + SetHecMode(handle, 0); + } break; +#endif + case SET_SEC_AXI: { + SecAxiUse secAxiUse; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + secAxiUse = *(SecAxiUse *)param; + if (handle->productId == PRODUCT_ID_410 || + handle->productId == PRODUCT_ID_4102 || + handle->productId == PRODUCT_ID_420 || + handle->productId == PRODUCT_ID_412 || + handle->productId == PRODUCT_ID_420L || + handle->productId == PRODUCT_ID_510 || + handle->productId == PRODUCT_ID_512 || + handle->productId == PRODUCT_ID_515) { + if (handle->codecMode == HEVC_DEC) { + pEncInfo->secAxiInfo.u.wave4.useIpEnable = + secAxiUse.u.wave4.useIpEnable; + pEncInfo->secAxiInfo.u.wave4.useLfRowEnable = + secAxiUse.u.wave4.useLfRowEnable; + pEncInfo->secAxiInfo.u.wave4.useBitEnable = + secAxiUse.u.wave4.useBitEnable; + } else { + pEncInfo->secAxiInfo.u.wave4.useEncImdEnable = + secAxiUse.u.wave4.useEncImdEnable; + pEncInfo->secAxiInfo.u.wave4.useEncRdoEnable = + secAxiUse.u.wave4.useEncRdoEnable; + pEncInfo->secAxiInfo.u.wave4.useEncLfEnable = + secAxiUse.u.wave4.useEncLfEnable; + } + } else if (handle->productId == PRODUCT_ID_520) { + pEncInfo->secAxiInfo.u.wave4.useEncRdoEnable = + secAxiUse.u.wave4.useEncRdoEnable; + pEncInfo->secAxiInfo.u.wave4.useEncLfEnable = + secAxiUse.u.wave4.useEncLfEnable; + } else { // coda9 or coda7q or ... + pEncInfo->secAxiInfo.u.coda9.useBitEnable = + secAxiUse.u.coda9.useBitEnable; + pEncInfo->secAxiInfo.u.coda9.useIpEnable = + secAxiUse.u.coda9.useIpEnable; + pEncInfo->secAxiInfo.u.coda9.useDbkYEnable = + secAxiUse.u.coda9.useDbkYEnable; + pEncInfo->secAxiInfo.u.coda9.useDbkCEnable = + secAxiUse.u.coda9.useDbkCEnable; + pEncInfo->secAxiInfo.u.coda9.useOvlEnable = + secAxiUse.u.coda9.useOvlEnable; + pEncInfo->secAxiInfo.u.coda9.useBtpEnable = + secAxiUse.u.coda9.useBtpEnable; + } + } break; + case GET_TILEDMAP_CONFIG: { + TiledMapConfig *pMapCfg = (TiledMapConfig *)param; + if (!pMapCfg) { + return RETCODE_INVALID_PARAM; + } + *pMapCfg = pEncInfo->mapCfg; + break; + } +#ifdef REDUNDENT_CODE + case SET_DRAM_CONFIG: { + DRAMConfig *cfg = (DRAMConfig *)param; + + if (!cfg) { + return RETCODE_INVALID_PARAM; + } + + pEncInfo->dramCfg = *cfg; + break; + } + case GET_DRAM_CONFIG: + DRAMConfig *cfg = (DRAMConfig *)param; + if (!cfg) + return RETCODE_INVALID_PARAM; + *cfg = pEncInfo->dramCfg; + break; +#endif +#ifdef ENABLE_CNM_DEBUG_MSG + case ENABLE_LOGGING: + pCodecInst->loggingEnable = 1; + break; + case DISABLE_LOGGING: + pCodecInst->loggingEnable = 0; + break; +#endif + case ENC_SET_PARA_CHANGE: { + EncChangeParam *option = (EncChangeParam *)param; + return Wave4VpuEncParaChange(handle, option); + } + case ENC_SET_SEI_NAL_DATA: { + HevcSEIDataEnc *option = (HevcSEIDataEnc *)param; + pEncInfo->prefixSeiNalEnable = option->prefixSeiNalEnable; + pEncInfo->prefixSeiDataSize = option->prefixSeiDataSize; + pEncInfo->prefixSeiDataEncOrder = option->prefixSeiDataEncOrder; + pEncInfo->prefixSeiNalAddr = option->prefixSeiNalAddr; + + pEncInfo->suffixSeiNalEnable = option->suffixSeiNalEnable; + pEncInfo->suffixSeiDataSize = option->suffixSeiDataSize; + pEncInfo->suffixSeiDataEncOrder = option->suffixSeiDataEncOrder; + pEncInfo->suffixSeiNalAddr = option->suffixSeiNalAddr; + } break; +#ifdef SUPPORT_W5ENC_BW_REPORT + case ENC_GET_BW_REPORT: { + EncBwMonitor *encBwMon; + + if (param == 0) { + return RETCODE_INVALID_PARAM; + } + + if (handle->productId != PRODUCT_ID_520) + return RETCODE_INVALID_COMMAND; + + encBwMon = (EncBwMonitor *)param; + return Wave5VpuEncGetBwReport(handle, encBwMon); + } break; +#endif + case ENC_GET_FRAMEBUF_IDX: { + Int32 *srcFrameIdx = (Int32 *)param; + EncInfo *pEncInfo; + CodecInst *pCodecInst; + + if (!srcFrameIdx) { + return RETCODE_INVALID_PARAM; + } + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + dpb_pic_init(pEncInfo); //, NULL, NULL); + *srcFrameIdx = pEncInfo->prev_idx; + } break; + default: + return RETCODE_INVALID_COMMAND; + } + return RETCODE_SUCCESS; +} + +RetCode VPU_EncAllocateFrameBuffer(EncHandle handle, FrameBufferAllocInfo info, + FrameBuffer *frameBuffer) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + RetCode ret; + int gdiIndex; + + CVI_VC_TRACE("\n"); + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + if (!frameBuffer) { + return RETCODE_INVALID_PARAM; + } + if (info.num == 0 || info.num < 0) { + return RETCODE_INVALID_PARAM; + } + if (info.stride == 0 || info.stride < 0) { + return RETCODE_INVALID_PARAM; + } + if (info.height == 0 || info.height < 0) { + return RETCODE_INVALID_PARAM; + } + + if (info.type == FB_TYPE_PPU) { + if (pEncInfo->numFrameBuffers == 0) { + return RETCODE_WRONG_CALL_SEQUENCE; + } + pEncInfo->ppuAllocExt = frameBuffer[0].updateFbInfo; + gdiIndex = pEncInfo->numFrameBuffers; + ret = ProductVpuAllocateFramebuffer( + pCodecInst, frameBuffer, (TiledMapType)info.mapType, + (Int32)info.num, info.stride, info.height, info.format, + info.cbcrInterleave, info.nv21, info.endian, + &pEncInfo->vbPPU, gdiIndex, + (FramebufferAllocType)info.type); + } else if (info.type == FB_TYPE_CODEC) { + gdiIndex = 0; + pEncInfo->frameAllocExt = frameBuffer[0].updateFbInfo; + ret = ProductVpuAllocateFramebuffer( + pCodecInst, frameBuffer, (TiledMapType)info.mapType, + (Int32)info.num, info.stride, info.height, info.format, + info.cbcrInterleave, FALSE, info.endian, + &pEncInfo->vbFrame, gdiIndex, + (FramebufferAllocType)info.type); + } else { + ret = RETCODE_INVALID_PARAM; + } + + return ret; +} + +#ifdef REDUNDENT_CODE +RetCode VPU_EncIssueSeqInit(EncHandle handle) +{ + CodecInst *pCodecInst; + RetCode ret; + VpuAttr *pAttr; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) + return ret; + + pCodecInst = handle; + + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + + if (GetPendingInst(pCodecInst->coreIdx)) { + return RETCODE_FRAME_NOT_COMPLETE; + } + + ret = ProductVpuEncInitSeq(handle); + if (ret == RETCODE_SUCCESS) { + SetPendingInst(pCodecInst->coreIdx, pCodecInst, __func__, + __LINE__); + } + + if (pAttr->supportCommandQueue == TRUE) { + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + } + + return ret; +} + +RetCode VPU_EncCompleteSeqInit(EncHandle handle, EncInitialInfo *info) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + RetCode ret; + VpuAttr *pAttr; + + ret = CheckEncInstanceValidity(handle); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + if (info == 0) { + return RETCODE_INVALID_PARAM; + } + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + pAttr = &g_VpuCoreAttributes[pCodecInst->coreIdx]; + + if (pAttr->supportCommandQueue == FALSE) { + if (pCodecInst != GetPendingInst(pCodecInst->coreIdx)) { + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, + __LINE__); + CVI_VC_ERR("SetPendingInst clear\n"); + return RETCODE_WRONG_CALL_SEQUENCE; + } + } + + ret = ProductVpuEncGetSeqInfo(handle); + if (ret == RETCODE_SUCCESS) { + pEncInfo->initialInfoObtained = 1; + } + + // info->rdPtr = VpuReadReg(pCodecInst->coreIdx, + // pEncInfo->streamRdPtrRegAddr); info->wrPtr = + // VpuReadReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr); + + // pEncInfo->prevFrameEndPos = info->rdPtr; + + pEncInfo->initialInfo = *info; + + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + + return ret; +} +#endif + +RetCode VPU_DecSetOutputFormat(DecHandle handle, int cbcrInterleave, int nv21) +{ + CodecInst *pCodecInst = (CodecInst *)handle; + DecOpenParam *pdop; + + if (pCodecInst == NULL) { + CVI_VC_ERR("Null pointer to codec instance\n"); + return RETCODE_INVALID_HANDLE; + } + + pdop = &pCodecInst->CodecInfo->decInfo.openParam; + pdop->cbcrInterleave = cbcrInterleave; + pdop->nv21 = nv21; + + return RETCODE_SUCCESS; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.h new file mode 100644 index 0000000000..a0b8a3aaf9 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapi.h @@ -0,0 +1,8621 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#ifndef VPUAPI_H_INCLUDED +#define VPUAPI_H_INCLUDED + +#include "vpuconfig.h" +#include "vputypes.h" +#include "../vdi/vdi.h" +#include "../vdi/vdi_osal.h" +#include "vpuerror.h" + +#include "coda9/980_roi_rc_lib/util_float.h" +#include "coda9/980_roi_rc_lib/hevc_enc_rc.h" +#include "coda9/980_roi_rc_lib/frm_rc.h" + +#define MAX_GDI_IDX 31 +#define MAX_DEC_FRAME_NUM (MAX_GDI_IDX + 1) +#ifdef SUPPORT_SRC_BUF_CONTROL +#define MAX_REG_FRAME 2000 +#else +// 2 for WTL +#define MAX_REG_FRAME (MAX_GDI_IDX * 2) +#endif + +#define WAVE4_FBC_LUMA_TABLE_SIZE(_w, _h) \ + ((((_h + 15) >> 4) * ((_w + 255) >> 8)) << 7) +#define WAVE4_FBC_CHROMA_TABLE_SIZE(_w, _h) \ + ((((_h + 15) >> 4) * (((_w >> 1) + 255) >> 8)) << 7) +#define WAVE4_DEC_HEVC_MVCOL_BUF_SIZE(_w, _h) \ + (((((_w + 63) >> 6) * ((_h + 63) >> 6)) << 8) + 64) +#define WAVE4_ENC_HEVC_MVCOL_BUF_SIZE(_w, _h) \ + ((((_w + 63) >> 6) * ((_h + 63) >> 6)) \ + << 7) // encoder case = (((_w+63)/64)*((_h+63)/64)128). +#define WAVE4_DEC_VP9_MVCOL_BUF_SIZE(_w, _h) \ + (((VPU_ALIGN64(_w) * VPU_ALIGN64(_h)) >> 2)) + +#define WAVE5_ENC_HEVC_MVCOL_BUF_SIZE(_w, _h) \ + ((((VPU_ALIGN64(_w) >> 6) * VPU_ALIGN64(_h)) >> 6) << 7) +#define WAVE5_FBC_LUMA_TABLE_SIZE(_w, _h) \ + ((VPU_ALIGN16(_h) * VPU_ALIGN256(_w)) >> 5) +#define WAVE5_FBC_CHROMA_TABLE_SIZE(_w, _h) \ + ((VPU_ALIGN16(_h) * VPU_ALIGN256((_w >> 1))) >> 5) + +//------------------------------------------------------------------------------ +// common struct and definition +//------------------------------------------------------------------------------ +/** +* @brief +@verbatim +This is an enumeration for declaring codec standard type variables. Currently, +VPU supports many different video standards such as H.265/HEVC, MPEG4 SP/ASP, +H.263 Profile 3, H.264/AVC BP/MP/HP, VC1 SP/MP/AP, Divx3, MPEG1, MPEG2, AVS, +RealVideo 8/9/10, AVS Jizhun/Guangdian profile, Theora, VP3, VP8, and VP9. + +NOTE: MPEG-1 decoder operation is handled as a special case of MPEG2 decoder. +STD_THO must be always 9. +@endverbatim +*/ +typedef enum { + STD_AVC, + STD_VC1, + STD_MPEG2, + STD_MPEG4, + STD_H263, + STD_DIV3, + STD_RV, + STD_AVS, + STD_THO = 9, + STD_VP3, + STD_VP8, + STD_HEVC, + STD_VP9, + STD_AVS2, + STD_MAX +} CodStd; + +/** +* @brief +@verbatim +This is an enumeration for declaring SET_PARAM command options. +Depending on this, SET_PARAM command parameter registers have different +settings. + +NOTE: This is only for WAVE encoder IP. + +@endverbatim +*/ +typedef enum { + OPT_COMMON = 0, /**< SET_PARAM command option for encoding sequence */ + OPT_CUSTOM_GOP = 1, /**< SET_PARAM command option for setting custom GOP + */ + OPT_CUSTOM_HEADER = 2, /**< SET_PARAM command option for setting custom + VPS/SPS/PPS */ + OPT_VUI = 3, /**< SET_PARAM command option for encoding VUI */ + OPT_CHANGE_PARAM = 16 /**< SET_PARAM command option for parameters + change (WAVE520 only) */ +} SET_PARAM_OPTION; + +/** +* @brief +@verbatim +This is an enumeration for declaring SET_PARAM command options. (CODA7Q encoder +only) Depending on this, SET_PARAM command parameter registers have different +settings. + +@endverbatim +*/ +typedef enum { + C7_OPT_COMMON = 16, + C7_OPT_SET_PARAM = 17, + C7_OPT_PARAM_CHANGE = 18, +} C7_SET_PARAM_OPTION; + +/** +* @brief +@verbatim +This is an enumeration for declaring the operation mode of DEC_PIC_HDR command. +(WAVE decoder only) + +@endverbatim +*/ +typedef enum { + INIT_SEQ_NORMAL = 0x01, /**< It initializes some parameters (i.e. buffer + mode) required for decoding sequence, + performs sequence header, and returns + information on the sequence. */ + INIT_SEQ_W_THUMBNAIL = 0x11, /**< It decodes only the first I picture of + sequence to get thumbnail. */ +} DEC_PIC_HDR_OPTION; + +/** +* @brief +@verbatim +This is an enumeration for declaring the running option of DEC_PIC command. +(WAVE decoder only) + +@endverbatim +*/ +typedef enum { + DEC_PIC_NORMAL = 0x00, /**< It is normal mode of DEC_PIC command. */ + DEC_PIC_W_THUMBNAIL = 0x10, /**< It handles CRA picture as BLA picture + not to use reference from the previously + decoded pictures. */ + SKIP_NON_IRAP = 0x11, /**< It is thumbnail mode (skip non-IRAP without + reference reg.) */ + SKIP_NON_RECOVERY = 0x12, /**< It skips to decode non-IRAP pictures. */ + SKIP_NON_REF_PIC = 0x13, /**< It skips to decode non-reference pictures + which correspond to sub-layer non-reference + picture with MAX_DEC_TEMP_ID. (The sub-layer + non-reference picture is the one whose + nal_unit_type equal to TRAIL_N, TSA_N, + STSA_N, RADL_N, RASL_N, RSV_VCL_N10, + RSV_VCL_N12, or RSV_VCL_N14. )*/ + SKIP_TEMPORAL_LAYER = 0x14, /**< It decodes only frames whose temporal + id is equal to or less than + MAX_DEC_TEMP_ID. */ +} DEC_PIC_OPTION; + +typedef enum _E_CORE_STATUS_ { + CORE_STATUS_WAIT_INIT = 0, + CORE_STATUS_WAKE, + CORE_STATUS_SLEEP, +} E_CORE_STATUS; + +/************************************************************************/ +/* Limitations */ +/************************************************************************/ +#define MAX_FRAMEBUFFER_COUNT \ + 31 /* The 32nd framebuffer is reserved for WTL \ + */ + +/************************************************************************/ +/* PROFILE & LEVEL */ +/************************************************************************/ +/* HEVC */ +#define HEVC_PROFILE_MAIN 1 +#define HEVC_PROFILE_MAIN10 2 +#define HEVC_PROFILE_STILLPICTURE 3 +/* VP9 */ +#define VP9_PROFILE_0 0 +#define VP9_PROFILE_1 1 +#define VP9_PROFILE_2 2 +#define VP9_PROFILE_3 3 +/* Tier */ +#define HEVC_TIER_MAIN 0 +#define HEVC_TIER_HIGH 1 +/* Level */ +#define HEVC_LEVEL(_Major, _Minor) (_Major * 10 + _Minor) + +/* H.264 */ +#define H264_PROFILE_BASELINE 66 +#define H264_PROFILE_MAIN 77 +#define H264_PROFILE_EXTENDED 88 +#define H264_PROFILE_HIGH 100 +#define H264_PROFILE_HIGH10 110 +#define H264_PROFILE_HIGH10_INTRA 120 +#define H264_PROFILE_HIGH422 122 +#define H264_PROFILE_HIGH444 244 +#define H264_PROFILE_CAVLC_444_INTRA 44 + +/* H265 USER_DATA(SPS & SEI) ENABLE FLAG */ +#define H265_USERDATA_FLAG_RESERVED_0 (0) +#define H265_USERDATA_FLAG_RESERVED_1 (1) +#define H265_USERDATA_FLAG_VUI (2) +#define H265_USERDATA_FLAG_RESERVED_3 (3) +#define H265_USERDATA_FLAG_PIC_TIMING (4) +#define H265_USERDATA_FLAG_ITU_T_T35_PRE \ + (5) /* SEI Prefix: user_data_registered_itu_t_t35 */ +#define H265_USERDATA_FLAG_UNREGISTERED_PRE \ + (6) /* SEI Prefix: user_data_unregistered */ +#define H265_USERDATA_FLAG_ITU_T_T35_SUF \ + (7) /* SEI Suffix: user_data_registered_itu_t_t35 */ +#define H265_USERDATA_FLAG_UNREGISTERED_SUF \ + (8) /* SEI Suffix: user_data_unregistered */ +#define H265_USERDATA_FLAG_RESERVED_9 (9) /* SEI RESERVED */ +#define H265_USERDATA_FLAG_MASTERING_COLOR_VOL \ + (10) /* SEI Prefix: mastering_display_color_volume */ +#define H265_USERDATA_FLAG_CHROMA_RESAMPLING_FILTER_HINT \ + (11) /* SEI Prefix: chroma_resampling_filter_hint */ +#define H265_USERDATA_FLAG_KNEE_FUNCTION_INFO \ + (12) /* SEI Prefix: knee_function_info */ + +/************************************************************************/ +/* Error codes */ +/************************************************************************/ + +/** +* @brief This is an enumeration for declaring return codes from API function +calls. The meaning of each return code is the same for all of the API functions, +but the reasons of non-successful return might be different. Some details of +those reasons are briefly described in the API definition chapter. In this +chapter, the basic meaning of each return code is presented. +*/ +typedef enum { + RETCODE_SUCCESS, /* 0 */ + /**< This means that operation was done successfully. */ + RETCODE_FAILURE, + /* + * This means that operation was not done successfully. When un-recoverable decoder error happens + * such as header parsing errors, this value is returned from VPU API. + */ + RETCODE_INVALID_HANDLE, + /* + * This means that the given handle for the current API function call was invalid (for example, + * not initialized yet, improper function call for the given handle, etc.). + */ + RETCODE_INVALID_PARAM, + /* This means that the given argument parameters (for example, input data structure) was invalid + * (not initialized yet or not valid anymore). + */ + RETCODE_INVALID_COMMAND, + /* + * This means that the given command was invalid (for example, undefined, or not allowed in the + * given instances). + */ + RETCODE_ROTATOR_OUTPUT_NOT_SET, /* 5 */ + /* + * This means that rotator output buffer was not allocated even though postprocessor (rotation, + * mirroring, or deringing) is enabled. + */ + RETCODE_ROTATOR_STRIDE_NOT_SET, + /* + * This means that rotator stride was not provided even though postprocessor (rotation, mirroring, + * or deringing) is enabled. + */ + RETCODE_FRAME_NOT_COMPLETE, + /* + * This means that frame decoding operation was not completed yet, so the given API function call + * cannot be allowed. + */ + RETCODE_INVALID_FRAME_BUFFER, + /* + * This means that the given source frame buffer pointers were invalid in encoder (not initialized + * yet or not valid anymore). + */ + RETCODE_INSUFFICIENT_FRAME_BUFFERS, + /* + * This means that the given numbers of frame buffers were not enough for the operations of the given + * handle. This return code is only received when calling VPU_DecRegisterFrameBuffer() or + * VPU_EncRegisterFrameBuffer() function. + */ + RETCODE_INVALID_STRIDE, /* 10 */ + /* + * This means that the given stride was invalid (for example, 0, not a multiple of 8 or smaller than + * picture size). This return code is only allowed in API functions which set stride. + */ + RETCODE_WRONG_CALL_SEQUENCE, + /* + * This means that the current API function call was invalid considering the allowed sequences between + * API functions (for example, missing one crucial function call before this function call). + */ + RETCODE_CALLED_BEFORE, + /* This means that multiple calls of the current API function for a given instance are invalid. */ + RETCODE_NOT_INITIALIZED, + /* + * This means that VPU was not initialized yet. Before calling any API functions, the initialization + * API function, VPU_Init(), should be called at the beginning. + */ + RETCODE_USERDATA_BUF_NOT_SET, + /* + * This means that there is no memory allocation for reporting userdata. Before setting user data + * enable, user data buffer address and size should be set with valid value. + */ + RETCODE_MEMORY_ACCESS_VIOLATION, /* 15 */ + /**< This means that access violation to the protected memory has been occurred. */ + RETCODE_VPU_RESPONSE_TIMEOUT, + /**< This means that VPU response time is too long, time out. */ + RETCODE_INSUFFICIENT_RESOURCE, + /**< This means that VPU cannot allocate memory due to lack of memory. */ + RETCODE_NOT_FOUND_BITCODE_PATH, + /* + * This means that BIT_CODE_FILE_PATH has a wrong firmware path or firmware size is 0 when calling + * VPU_InitWithBitcode() function. + */ + RETCODE_NOT_SUPPORTED_FEATURE, + /**< This means that HOST application uses an API option that is not supported in current hardware. */ + RETCODE_NOT_FOUND_VPU_DEVICE, /* 20 */ + /**< This means that HOST application uses the undefined product ID. */ + RETCODE_CP0_EXCEPTION, + /**< This means that coprocessor exception has occurred. (WAVE only) */ + RETCODE_STREAM_BUF_FULL, + /**< This means that stream buffer is full in encoder. */ + RETCODE_ACCESS_VIOLATION_HW, + /* + * This means that GDI access error has occurred. It might come from violation of write protection + * region or spec-out GDI read/write request. (WAVE only) + */ + RETCODE_QUERY_FAILURE, + /**< This means that query command was not successful (WAVE5 only) */ + RETCODE_QUEUEING_FAILURE, + /**< This means that commands cannot be queued (WAVE5 only) */ + RETCODE_VPU_STILL_RUNNING, + /**< This means that VPU cannot be flushed or closed now. because VPU is running (WAVE5 only) */ + RETCODE_REPORT_NOT_READY, + /**< This means that report is not ready for Query(GET_RESULT) command (WAVE5 only) */ +#ifdef AUTO_FRM_SKIP_DROP + RETCODE_FRAME_DROP, + /* + * This means that frame is dropped. HOST application don't have to wait INT_BIT_PIC_RUN. + * (CODA9 only) + */ +#endif +} RetCode; + +/************************************************************************/ +/* Utility macros */ +/************************************************************************/ +#define VPU_ALIGN4(_x) (((_x) + 0x03) & ~0x03) +#define VPU_ALIGN8(_x) (((_x) + 0x07) & ~0x07) +#define VPU_ALIGN16(_x) (((_x) + 0x0f) & ~0x0f) +#define VPU_ALIGN32(_x) (((_x) + 0x1f) & ~0x1f) +#define VPU_ALIGN64(_x) (((_x) + 0x3f) & ~0x3f) +#define VPU_ALIGN128(_x) (((_x) + 0x7f) & ~0x7f) +#define VPU_ALIGN256(_x) (((_x) + 0xff) & ~0xff) +#define VPU_ALIGN512(_x) (((_x) + 0x1ff) & ~0x1ff) +#define VPU_ALIGN4096(_x) (((_x) + 0xfff) & ~0xfff) +#define VPU_ALIGN16384(_x) (((_x) + 0x3fff) & ~0x3fff) + +/************************************************************************/ +/* */ +/************************************************************************/ +#define INTERRUPT_TIMEOUT_VALUE ((Uint32)-1) + +/** + * \brief parameters of DEC_SET_SEQ_CHANGE_MASK + */ +#define SEQ_CHANGE_ENABLE_PROFILE (1 << 5) +#define SEQ_CHANGE_ENABLE_SIZE (1 << 16) +#define SEQ_CHANGE_ENABLE_BITDEPTH (1 << 18) +#define SEQ_CHANGE_ENABLE_DPB_COUNT (1 << 19) + +#define SEQ_CHANGE_INTER_RES_CHANGE (1 << 17) /* VP9 */ +#define SEQ_CHANGE_ENABLE_ALL_VP9 \ + (SEQ_CHANGE_ENABLE_PROFILE | SEQ_CHANGE_ENABLE_SIZE | \ + SEQ_CHANGE_INTER_RES_CHANGE | SEQ_CHANGE_ENABLE_BITDEPTH | \ + SEQ_CHANGE_ENABLE_DPB_COUNT) + +#define SEQ_CHANGE_ENABLE_ALL_HEVC \ + (SEQ_CHANGE_ENABLE_PROFILE | SEQ_CHANGE_ENABLE_SIZE | \ + SEQ_CHANGE_ENABLE_BITDEPTH | SEQ_CHANGE_ENABLE_DPB_COUNT) + +#define DISPLAY_IDX_FLAG_SEQ_END -1 +#define DISPLAY_IDX_FLAG_NO_FB -3 +#define DECODED_IDX_FLAG_NO_FB -1 +#define DECODED_IDX_FLAG_SKIP -2 + +#define MAX_ROI_NUMBER 64 +#define MAX_CODA980_ROI_NUMBER 10 + +/** + * @brief This is a special enumeration type for some configuration commands + * which can be issued to VPU by HOST application. Most of these commands can be + * called occasionally, not periodically for changing the configuration of + * decoder or encoder operation running on VPU. Details of these commands are + * presented in <>. + */ +typedef enum { + ENABLE_ROTATION, + DISABLE_ROTATION, + ENABLE_MIRRORING, + DISABLE_MIRRORING, + SET_MIRROR_DIRECTION, + SET_ROTATION_ANGLE, + SET_ROTATOR_OUTPUT, + SET_ROTATOR_STRIDE, + DEC_GET_SEQ_INFO, + DEC_SET_SPS_RBSP, + DEC_SET_PPS_RBSP, + DEC_SET_SEQ_CHANGE_MASK, + ENABLE_DERING, + DISABLE_DERING, + SET_SEC_AXI, + SET_DRAM_CONFIG, // coda960 only + GET_DRAM_CONFIG, // coda960 only + ENABLE_REP_USERDATA, + DISABLE_REP_USERDATA, + SET_ADDR_REP_USERDATA, + SET_VIRT_ADDR_REP_USERDATA, + SET_SIZE_REP_USERDATA, + SET_USERDATA_REPORT_MODE, + // WAVE4 CU REPORT INFTERFACE + ENABLE_REP_CUDATA, + DISABLE_REP_CUDATA, + SET_ADDR_REP_CUDATA, + SET_SIZE_REP_CUDATA, + SET_CACHE_CONFIG, + GET_TILEDMAP_CONFIG, + SET_LOW_DELAY_CONFIG, + GET_LOW_DELAY_OUTPUT, + SET_DECODE_FLUSH, + DEC_SET_FRAME_DELAY, + DEC_SET_WTL_FRAME_FORMAT, + DEC_GET_FIELD_PIC_TYPE, + DEC_GET_DISPLAY_OUTPUT_INFO, + DEC_ENABLE_REORDER, + DEC_DISABLE_REORDER, + DEC_SET_AVC_ERROR_CONCEAL_MODE, + DEC_FREE_FRAME_BUFFER, + DEC_GET_FRAMEBUF_INFO, + DEC_RESET_FRAMEBUF_INFO, + ENABLE_DEC_THUMBNAIL_MODE, + DEC_SET_DISPLAY_FLAG, + DEC_SET_TARGET_TEMPORAL_ID, //!<< H.265 temporal scalability + DEC_SET_BWB_CUR_FRAME_IDX, + DEC_SET_FBC_CUR_FRAME_IDX, + DEC_SET_INTER_RES_INFO_ON, + DEC_SET_INTER_RES_INFO_OFF, + DEC_FREE_FBC_TABLE_BUFFER, + DEC_FREE_MV_BUFFER, + DEC_ALLOC_FBC_Y_TABLE_BUFFER, + DEC_ALLOC_FBC_C_TABLE_BUFFER, + DEC_ALLOC_MV_BUFFER, + ENC_ADD_PPS, + ENC_SET_ACTIVE_PPS, + ENC_GET_ACTIVE_PPS, + // vpu put header stream to bitstream buffer + ENC_PUT_VIDEO_HEADER, + ENC_PUT_MP4_HEADER, + ENC_PUT_AVC_HEADER, + // host generate header bitstream + ENC_GET_VIDEO_HEADER, + ENC_SET_INTRA_MB_REFRESH_NUMBER, + ENC_ENABLE_HEC, + ENC_DISABLE_HEC, + ENC_SET_SLICE_INFO, + ENC_SET_GOP_NUMBER, + ENC_SET_INTRA_QP, + ENC_SET_BITRATE, + ENC_SET_FRAME_RATE, + + ENC_SET_PARA_CHANGE, + ENABLE_LOGGING, + DISABLE_LOGGING, + ENC_SET_SEI_NAL_DATA, + DEC_GET_QUEUE_STATUS, + ENC_GET_BW_REPORT, // wave520 only + ENC_SET_MIN_MAX_QP, /**< This command sets a maximum delta QP and + maximum/minimum QP values of intra picture for + rate control. */ +#if defined(RC_PIC_PARACHANGE) && defined(RC_CHANGE_PARAMETER_DEF) + ENC_SET_PIC_CHANGE_PARAM, +#endif + ENC_GET_FRAMEBUF_IDX, + CMD_END +} CodecCommand; + +/** + * @brief This is an enumeration type for representing error conceal modes. + * (H.264/AVC decoder only) + */ +typedef enum { + AVC_ERROR_CONCEAL_MODE_DEFAULT = 0, /**< basic error concealment and + error concealment for missing + reference frame, wrong frame_num + syntax (default) */ + AVC_ERROR_CONCEAL_MODE_ENABLE_SELECTIVE_CONCEAL_MISSING_REFERENCE = + 1, /**< error concealment - selective error concealment for + missing reference frame */ + AVC_ERROR_CONCEAL_MODE_DISABLE_CONCEAL_MISSING_REFERENCE = + 2, /**< error concealment - disable error concealment for + missing reference frame */ + AVC_ERROR_CONCEAL_MODE_DISABLE_CONCEAL_WRONG_FRAME_NUM = + 4, /**< error concealment - disable error concealment for wrong + frame_num syntax */ +} AVCErrorConcealMode; + +/** + * @brief This is an enumeration type for representing the way of writing + * chroma data in planar format of frame buffer. + */ +typedef enum { + CBCR_ORDER_NORMAL, /**< Cb data are written in Cb buffer, and Cr data + are written in Cr buffer. */ + CBCR_ORDER_REVERSED /**< Cr data are written in Cb buffer, and Cb data + are written in Cr buffer. */ +} CbCrOrder; + +/** + * @brief This is an enumeration type for representing the mirroring + * direction. + */ +typedef enum { + MIRDIR_NONE, + MIRDIR_VER, + MIRDIR_HOR, + MIRDIR_HOR_VER +} MirrorDirection; + +/** + * @brief This is an enumeration type for representing chroma formats of the + * frame buffer and pixel formats in packed mode. + */ +typedef enum { + FORMAT_420 = 0, /* 8bit */ + FORMAT_422, /* 8bit */ + FORMAT_224, /* 8bit */ + FORMAT_444, /* 8bit */ + FORMAT_400, /* 8bit */ + + /* Little Endian Perspective */ + /* | addr 0 | addr 1 | */ + FORMAT_420_P10_16BIT_MSB = 5, /* lsb | 00xxxxx |xxxxxxxx | msb */ + FORMAT_420_P10_16BIT_LSB, /* lsb | xxxxxxx |xxxxxx00 | msb */ + FORMAT_420_P10_32BIT_MSB, /* lsb |00xxxxxxxxxxxxxxxxxxxxxxxxxxx| msb */ + FORMAT_420_P10_32BIT_LSB, /* lsb |xxxxxxxxxxxxxxxxxxxxxxxxxxx00| msb */ + + /* 4:2:2 packed format */ + /* Little Endian Perspective */ + /* | addr 0 | addr 1 | */ + FORMAT_422_P10_16BIT_MSB, /* lsb | 00xxxxx |xxxxxxxx | msb */ + FORMAT_422_P10_16BIT_LSB, /* lsb | xxxxxxx |xxxxxx00 | msb */ + FORMAT_422_P10_32BIT_MSB, /* lsb |00xxxxxxxxxxxxxxxxxxxxxxxxxxx| msb */ + FORMAT_422_P10_32BIT_LSB, /* lsb |xxxxxxxxxxxxxxxxxxxxxxxxxxx00| msb */ + + FORMAT_YUYV, /**< 8bit packed format : Y0U0Y1V0 Y2U1Y3V1 ... */ + FORMAT_YUYV_P10_16BIT_MSB, + /* lsb | 000000xxxxxxxxxx | msb */ /**< 10bit packed(YUYV) + format(1Pixel=2Byte) */ + FORMAT_YUYV_P10_16BIT_LSB, + /* lsb | xxxxxxxxxx000000 | msb */ /**< 10bit packed(YUYV) + format(1Pixel=2Byte) */ + FORMAT_YUYV_P10_32BIT_MSB, + /* lsb |00xxxxxxxxxxxxxxxxxxxxxxxxxxx| msb */ /**< 10bit packed(YUYV) + format(3Pixel=4Byte) */ + FORMAT_YUYV_P10_32BIT_LSB, + /* lsb |xxxxxxxxxxxxxxxxxxxxxxxxxxx00| msb */ /**< 10bit packed(YUYV) + format(3Pixel=4Byte) */ + + FORMAT_YVYU, /**< 8bit packed format : Y0V0Y1U0 Y2V1Y3U1 ... */ + FORMAT_YVYU_P10_16BIT_MSB, + /* lsb | 000000xxxxxxxxxx | msb */ /**< 10bit packed(YVYU) + format(1Pixel=2Byte) */ + FORMAT_YVYU_P10_16BIT_LSB, + /* lsb | xxxxxxxxxx000000 | msb */ /**< 10bit packed(YVYU) + format(1Pixel=2Byte) */ + FORMAT_YVYU_P10_32BIT_MSB, + /* lsb |00xxxxxxxxxxxxxxxxxxxxxxxxxxx| msb */ /**< 10bit packed(YVYU) + format(3Pixel=4Byte) */ + FORMAT_YVYU_P10_32BIT_LSB, + /* lsb |xxxxxxxxxxxxxxxxxxxxxxxxxxx00| msb */ /**< 10bit packed(YVYU) + format(3Pixel=4Byte) */ + + FORMAT_UYVY, /**< 8bit packed format : U0Y0V0Y1 U1Y2V1Y3 ... */ + FORMAT_UYVY_P10_16BIT_MSB, + /* lsb | 000000xxxxxxxxxx | msb */ /**< 10bit packed(UYVY) + format(1Pixel=2Byte) */ + FORMAT_UYVY_P10_16BIT_LSB, + /* lsb | 000000xxxxxxxxxx | msb */ /**< 10bit packed(UYVY) + format(1Pixel=2Byte) */ + FORMAT_UYVY_P10_32BIT_MSB, + /* lsb |00xxxxxxxxxxxxxxxxxxxxxxxxxxx| msb */ /**< 10bit packed(UYVY) + format(3Pixel=4Byte) */ + FORMAT_UYVY_P10_32BIT_LSB, + /* lsb |xxxxxxxxxxxxxxxxxxxxxxxxxxx00| msb */ /**< 10bit packed(UYVY) + format(3Pixel=4Byte) */ + + FORMAT_VYUY, /**< 8bit packed format : V0Y0U0Y1 V1Y2U1Y3 ... */ + FORMAT_VYUY_P10_16BIT_MSB, + /* lsb | 000000xxxxxxxxxx | msb */ /**< 10bit packed(VYUY) + format(1Pixel=2Byte) */ + FORMAT_VYUY_P10_16BIT_LSB, + /* lsb | xxxxxxxxxx000000 | msb */ /**< 10bit packed(VYUY) + format(1Pixel=2Byte) */ + FORMAT_VYUY_P10_32BIT_MSB, + /* lsb |00xxxxxxxxxxxxxxxxxxxxxxxxxxx| msb */ /**< 10bit packed(VYUY) + format(3Pixel=4Byte) */ + FORMAT_VYUY_P10_32BIT_LSB, + /* lsb |xxxxxxxxxxxxxxxxxxxxxxxxxxx00| msb */ /**< 10bit packed(VYUY) + format(3Pixel=4Byte) */ + + FORMAT_MAX, +} FrameBufferFormat; + +/** + * @brief This is an enumeration type for representing output image formats of + * down scaler. + */ +typedef enum { + YUV_FORMAT_I420, /**< This format is a 420 planar format, which is + described as forcc I420. */ + YUV_FORMAT_NV12, /**< This format is a 420 semi-planar format with U and + V interleaved, which is described as fourcc NV12. */ + YUV_FORMAT_NV21, /**< This format is a 420 semi-planar format with V and + U interleaved, which is described as fourcc NV21. */ + YUV_FORMAT_I422, /**< This format is a 422 planar format, which is + described as forcc I422. */ + YUV_FORMAT_NV16, /**< This format is a 422 semi-planar format with U and + V interleaved, which is described as fourcc NV16. */ + YUV_FORMAT_NV61, /**< This format is a 422 semi-planar format with V and + U interleaved, which is described as fourcc NV61. */ + YUV_FORMAT_UYVY, /**< This format is a 422 packed mode with UYVY, which + is described as fourcc UYVY. */ + YUV_FORMAT_YUYV, /**< This format is a 422 packed mode with YUYV, which + is described as fourcc YUYV. */ +} ScalerImageFormat; + +typedef enum { + NOT_PACKED = 0, + PACKED_YUYV, + PACKED_YVYU, + PACKED_UYVY, + PACKED_VYUY, +} PackedFormatNum; + +/** + * @brief This is an enumeration type for representing interrupt bit + * positions for CODA series. + */ +typedef enum { + INT_BIT_INIT = 0, + INT_BIT_SEQ_INIT = 1, + INT_BIT_SEQ_END = 2, + INT_BIT_PIC_RUN = 3, + INT_BIT_FRAMEBUF_SET = 4, + INT_BIT_ENC_HEADER = 5, + INT_BIT_DEC_PARA_SET = 7, + INT_BIT_DEC_BUF_FLUSH = 8, + INT_BIT_USERDATA = 9, + INT_BIT_DEC_FIELD = 10, + INT_BIT_DEC_MB_ROWS = 13, + INT_BIT_BIT_BUF_EMPTY = 14, + INT_BIT_BIT_BUF_FULL = 15 +} InterruptBit; + +/* For backward compatibility */ +typedef InterruptBit Coda9InterruptBit; + +/** +* @brief This is an enumeration type for representing interrupt bit +positions. + +NOTE: This is only for WAVE4 IP. +*/ +typedef enum { + INT_WAVE_INIT = 0, + INT_WAVE_DEC_PIC_HDR = 1, + INT_WAVE_ENC_SETPARAM = 2, + INT_WAVE_FINI_SEQ = 2, + INT_WAVE_DEC_PIC = 3, + INT_WAVE_ENC_PIC = 3, + INT_WAVE_SET_FRAMEBUF = 4, + INT_WAVE_FLUSH_DECODER = 5, + INT_WAVE_GET_FW_VERSION = 8, + INT_WAVE_QUERY_DECODER = 9, + INT_WAVE_SLEEP_VPU = 10, + INT_WAVE_WAKEUP_VPU = 11, + INT_WAVE_CHANGE_INST = 12, + INT_WAVE_CREATE_INSTANCE = 14, + INT_WAVE_BIT_BUF_EMPTY = 15, /* Decoder */ + INT_WAVE_BIT_BUF_FULL = 15, /* Encoder */ +} Wave4InterruptBit; + +/** +* @brief This is an enumeration type for representing interrupt bit +positions. + +NOTE: This is only for WAVE5 IP. +*/ +typedef enum { + INT_WAVE5_INIT_VPU = 0, + INT_WAVE5_WAKEUP_VPU = 1, + INT_WAVE5_SLEEP_VPU = 2, + INT_WAVE5_CREATE_INSTANCE = 3, + INT_WAVE5_FLUSH_INSTANCE = 4, + INT_WAVE5_DESTORY_INSTANCE = 5, + INT_WAVE5_INIT_SEQ = 6, + INT_WAVE5_SET_FRAMEBUF = 7, + INT_WAVE5_DEC_PIC = 8, + INT_WAVE5_ENC_PIC = 8, + INT_WAVE5_ENC_SET_PARAM = 9, + INT_WAVE5_DEC_QUERY = 14, + INT_WAVE5_BSBUF_EMPTY = 15, + INT_WAVE5_BSBUF_FULL = 15, +} Wave5InterruptBit; + +/** + * @brief This is an enumeration type for representing picture types. + */ +typedef enum { + PIC_TYPE_I = 0, /**< I picture */ + PIC_TYPE_P = 1, /**< P picture */ + PIC_TYPE_B = 2, /**< B picture (except VC1) */ + PIC_TYPE_REPEAT = 2, /**< Repeat frame (VP9 only) */ + PIC_TYPE_VC1_BI = 2, /**< VC1 BI picture (VC1 only) */ + PIC_TYPE_VC1_B = 3, /**< VC1 B picture (VC1 only) */ + PIC_TYPE_D = 3, /**< D picture in MPEG2 that is only composed of DC + coefficients (MPEG2 only) */ + PIC_TYPE_S = 3, /**< S picture in MPEG4 that is an acronym of Sprite and + used for GMC (MPEG4 only)*/ + PIC_TYPE_VC1_P_SKIP = 4, /**< VC1 P skip picture (VC1 only) */ + PIC_TYPE_MP4_P_SKIP_NOT_CODED = 4, /**< Not Coded P Picture in mpeg4 + packed mode */ + PIC_TYPE_IDR = 5, /**< H.264/H.265 IDR picture */ + PIC_TYPE_MAX /**< No Meaning */ +} PicType; + +/** + * @brief This is an enumeration type for H.264/AVC NPF (Non Paired Field) + * information. + */ +typedef enum { + PAIRED_FIELD = 0, + TOP_FIELD_MISSING = 1, + BOT_FIELD_MISSING = 2, +} AvcNpfFieldInfo; + +/** + * @brief This is an enumeration type for specifying frame buffer types when + * tiled2linear or wtlEnable is used. + */ +typedef enum { + FF_NONE = 0, /**< Frame buffer type when tiled2linear or wtlEnable is + disabled */ + FF_FRAME = 1, /**< Frame buffer type to store one frame */ + FF_FIELD = 2, /**< Frame buffer type to store top field or bottom field + separately */ +} FrameFlag; + +/** + * @brief This is an enumeration type for representing bitstream handling + * modes in decoder. + */ +typedef enum { + BS_MODE_INTERRUPT, /**< VPU returns an interrupt when bitstream buffer + is empty while decoding. VPU waits for more + bitstream to be filled. */ + BS_MODE_RESERVED, /**< Reserved for the future */ + BS_MODE_PIC_END, /**< VPU tries to decode with very small amount of + bitstream (not a complete 512-byte chunk). If it is + not successful, VPU performs error concealment for + the rest of the frame. */ +} BitStreamMode; + +/** + * @brief This is an enumeration type for representing software reset options. + */ +typedef enum { + SW_RESET_SAFETY, /**< It resets VPU in safe way. It waits until pending + bus transaction is completed and then perform reset. + */ + SW_RESET_FORCE, /**< It forces to reset VPU without waiting pending bus + transaction to be completed. It is used for immediate + termination such as system off. */ + SW_RESET_ON_BOOT /**< This is the default reset mode that is executed + since system booting. This mode is actually + executed in VPU_Init(), so does not have to be used + independently. */ +} SWResetMode; + +/** + * @brief This is an enumeration type for representing product IDs. + */ +typedef enum { + PRODUCT_ID_980, + PRODUCT_ID_960 = 1, + PRODUCT_ID_950 = 1, // same with CODA960 + PRODUCT_ID_7503, + PRODUCT_ID_320, + PRODUCT_ID_410, + PRODUCT_ID_4102, + PRODUCT_ID_420, + PRODUCT_ID_412, + PRODUCT_ID_7Q, + PRODUCT_ID_420L, + PRODUCT_ID_510, + PRODUCT_ID_512, + PRODUCT_ID_515, + PRODUCT_ID_520, + PRODUCT_ID_NONE, +} ProductId; + +#define PRODUCT_ID_W_SERIES(x) \ + (x == PRODUCT_ID_410 || x == PRODUCT_ID_4102 || x == PRODUCT_ID_420 || \ + x == PRODUCT_ID_412 || x == PRODUCT_ID_7Q || x == PRODUCT_ID_420L || \ + x == PRODUCT_ID_510 || x == PRODUCT_ID_512 || x == PRODUCT_ID_515 || \ + x == PRODUCT_ID_520) +#define PRODUCT_ID_NOT_W_SERIES(x) !PRODUCT_ID_W_SERIES(x) + +/** +* @brief This is an enumeration type for representing map types for frame +buffer. + +NOTE: Tiled maps are only for CODA9. Please find them in the CODA9 datasheet for +detailed information. +*/ +typedef enum { + /** +@verbatim +Linear frame map type + +NOTE: Products earlier than CODA9 can only set this linear map type. +@endverbatim +*/ + LINEAR_FRAME_MAP = 0, /**< Linear frame map type */ + TILED_FRAME_V_MAP = 1, /**< Tiled frame vertical map type (CODA9 only) + */ + TILED_FRAME_H_MAP = 2, /**< Tiled frame horizontal map type (CODA9 only) + */ + TILED_FIELD_V_MAP = 3, /**< Tiled field vertical map type (CODA9 only) + */ + TILED_MIXED_V_MAP = 4, /**< Tiled mixed vertical map type (CODA9 only) + */ + TILED_FRAME_MB_RASTER_MAP = 5, /**< Tiled frame MB raster map type + (CODA9 only) */ + TILED_FIELD_MB_RASTER_MAP = 6, /**< Tiled field MB raster map type + (CODA9 only) */ + TILED_FRAME_NO_BANK_MAP = 7, + /**< Tiled frame no bank map. (CODA9 only) */ // coda980 only + TILED_FIELD_NO_BANK_MAP = 8, + /**< Tiled field no bank map. (CODA9 only) */ // coda980 only + LINEAR_FIELD_MAP = 9, + /**< Linear field map type. (CODA9 only) */ // coda980 only + CODA_TILED_MAP_TYPE_MAX = 10, + COMPRESSED_FRAME_MAP = 10, + /**< Compressed frame map type (WAVE only) */ // WAVE4 only + ARM_COMPRESSED_FRAME_MAP = 12, + /**< AFBC(ARM Frame Buffer Compression) compressed frame map type */ // AFBC enabled WAVE decoder + TILED_MAP_TYPE_MAX +} TiledMapType; + +/** +* @brief This is an enumeration for declaring a type of framebuffer that is +allocated when VPU_DecAllocateFrameBuffer() and VPU_EncAllocateFrameBuffer() +function call. +*/ +typedef enum { + FB_TYPE_CODEC, /**< A framebuffer type used for decoding or encoding */ + FB_TYPE_PPU, /**< A framebuffer type used for additional allocation of + framebuffer for postprocessing(rotation/mirror) or + display (tiled2linear) purpose */ +} FramebufferAllocType; + +/** + * @brief This is data structure of product information. (WAVE only) + */ +typedef struct { + Uint32 productId; /**< The product id */ // W4_RET_PRODUCT_ID + Uint32 fwVersion; /**< The firmware version */ // W4_RET_FW_VERSION + Uint32 productName; + /**< VPU hardware product name */ // W4_RET_PRODUCT_NAME + Uint32 productVersion; + /**< VPU hardware product version */ // W4_RET_PRODUCT_VERSION + Uint32 customerId; /**< The customer id */ // W4_RET_CUSTOMER_ID + Uint32 stdDef0; + /**< The system configuration information */ // W4_RET_STD_DEF0 + Uint32 stdDef1; + /**< The hardware configuration information */ // W4_RET_STD_DEF1 + Uint32 confFeature; + /**< The supported codec standard */ // W4_RET_CONF_FEATURE + Uint32 configDate; + /**< The date that the hardware has been configured in YYYYmmdd in digit + */ //W4_RET_CONFIG_DATE + Uint32 configRevision; + /**< The revision number when the hardware has been configured */ // W4_RET_CONFIG_REVISION + Uint32 configType; + /**< The define value used in hardware configuration */ // W4_RET_CONFIG_TYPE + Uint32 configVcore[4]; + /**< VCORE Configuration Information */ // W4_RET_CONF_VCORE0 +} ProductInfo; + +/** +* @brief +@verbatim +This is a data structure of tiled map information. + +NOTE: WAVE4 does not support tiledmap type so this structure is not used in the +product. +@endverbatim +*/ +typedef struct { + // gdi2.0 + int xy2axiLumMap[32]; + int xy2axiChrMap[32]; + int xy2axiConfig; + + // gdi1.0 + int xy2caMap[16]; + int xy2baMap[16]; + int xy2raMap[16]; + int rbc2axiMap[32]; + int xy2rbcConfig; + unsigned long tiledBaseAddr; + + // common + int mapType; + int productId; + int tbSeparateMap; + int topBotSplit; + int tiledMap; + int convLinear; +} TiledMapConfig; + +/** +* @brief This is a data structure of DRAM information. (CODA960 and BODA950 +only). VPUAPI sets default values for this structure. However, HOST application +can configure if the default values are not associated with their DRAM or +desirable to change. +*/ +typedef struct { + int rasBit; /**< This value is used for width of RAS bit. (13 on the CNM + FPGA platform) */ + int casBit; /**< This value is used for width of CAS bit. (9 on the CNM + FPGA platform) */ + int bankBit; /**< This value is used for width of BANK bit. (2 on the + CNM FPGA platform) */ + int busBit; /**< This value is used for width of system BUS bit. (3 on + CNM FPGA platform) */ +} DRAMConfig; + +/** +* @brief +@verbatim +This is a data structure for representing frame buffer information such as +pointer of each YUV component, endian, map type, etc. + +All of the 3 component addresses must be aligned to AXI bus width. +HOST application must allocate external SDRAM spaces for those components by +using this data structure. For example, YCbCr 4:2:0, one pixel value of a +component occupies one byte, so the frame data sizes of Cb and Cr buffer are 1/4 +of Y buffer size. + +In case of CbCr interleave mode, Cb and Cr frame data are written to memory area +started from bufCb address. Also, in case that the map type of frame buffer is a +field type, the base addresses of frame buffer for bottom fields - bufYBot, +bufCbBot and bufCrBot should be set separately. +@endverbatim +*/ +typedef struct { + PhysicalAddress bufY; /**< It indicates the base address for Y component + in the physical address space when linear map + is used. It is the RAS base address for Y + component when tiled map is used (CODA9). It is + also compressed Y buffer or ARM compressed + framebuffer (WAVE). */ + PhysicalAddress bufCb; /**< It indicates the base address for Cb + component in the physical address space when + linear map is used. It is the RAS base address + for Cb component when tiled map is used + (CODA9). It is also compressed CbCr buffer + (WAVE) */ + PhysicalAddress bufCr; /**< It indicates the base address for Cr + component in the physical address space when + linear map is used. It is the RAS base address + for Cr component when tiled map is used + (CODA9). */ + PhysicalAddress bufYBot; + /**< It indicates the base address for Y bottom field component in the + * physical address space when linear map is used. It is the RAS base + * address for Y bottom field component when tiled map is used (CODA980 + * only). */ // coda980 only + PhysicalAddress bufCbBot; + /**< It indicates the base address for Cb bottom field component in the + * physical address space when linear map is used. It is the RAS base + * address for Cb bottom field component when tiled map is used (CODA980 + * only). */ // coda980 only + PhysicalAddress bufCrBot; + /**< It indicates the base address for Cr bottom field component in the + * physical address space when linear map is used. It is the RAS base + * address for Cr bottom field component when tiled map is used (CODA980 + * only). */ // coda980 only + /** +@verbatim +It specifies a chroma interleave mode of frame buffer. + +* 0 : CbCr data is written in their separate frame memory (chroma separate +mode). +* 1 : CbCr data is interleaved in chroma memory (chroma interleave mode). +@endverbatim +*/ + int cbcrInterleave; + /** +@verbatim +It specifies the way chroma data is interleaved in the frame buffer, bufCb or +bufCbBot. + +@* 0 : CbCr data is interleaved in chroma memory (NV12). +@* 1 : CrCb data is interleaved in chroma memory (NV21). +@endverbatim +*/ + int nv21; + /** +@verbatim +It specifies endianess of frame buffer. + +@* 0 : little endian format +@* 1 : big endian format +@* 2 : 32 bit little endian format +@* 3 : 32 bit big endian format +@* 16 ~ 31 : 128 bit endian format + +NOTE: For setting specific values of 128 bit endiness, please refer to the 'WAVE +Datasheet'. +@endverbatim +*/ + int endian; + int myIndex; /**< A frame buffer index to identify each frame buffer + that is processed by VPU. */ + int mapType; /**< A map type for GDI inferface or FBC (Frame Buffer + Compression). NOTE: For detailed map types, please refer + to <>. */ + int stride; /**< A horizontal stride for given frame buffer */ + int width; /**< A width for given frame buffer */ + int height; /**< A height for given frame buffer */ + int size; /**< A size for given frame buffer */ + int lumaBitDepth; /**< Bit depth for luma component */ + int chromaBitDepth; /**< Bit depth for chroma component */ + FrameBufferFormat format; /**< A YUV format of frame buffer */ + /** +@verbatim +It enables source frame data with long burst length to be loaded for reducing +DMA latency (CODA9 encoder only). + +@* 0 : disable the long-burst mode. +@* 1 : enable the long-burst mode. +@endverbatim +*/ + int sourceLBurstEn; + int srcBufState; /**< It indicates a status of each source buffer, + whether the source buffer is used for encoding or + not. */ + int sequenceNo; /**< A sequence number that the frame belongs to. It + increases by 1 every time a sequence changes in + decoder. */ + BOOL updateFbInfo; /**< If this is TRUE, VPU updates API-internal + framebuffer information when any of the + information is changed. */ +} FrameBuffer; + +/** +* @brief This is a data structure for representing framebuffer parameters. +It is used when framebuffer allocation using VPU_DecAllocateFrameBuffer() or +VPU_EncAllocateFrameBuffer(). +*/ +typedef struct { + int mapType; /**< <> */ + int cbcrInterleave; /**< CbCr interleave mode of frame buffer */ + int nv21; /**< 1 : CrCb (NV21) , 0 : CbCr (NV12). This is valid when + cbcrInterleave is 1. */ + FrameBufferFormat format; /**< <> */ + int stride; /**< A stride value of frame buffer */ + int height; /**< A height of frame buffer */ + int size; /**< A size of frame buffer */ + int lumaBitDepth; /**< A bit-depth of luma sample */ + int chromaBitDepth; /**< A bit-depth of chroma sample */ + int endian; /**< An endianess of frame buffer */ + int num; /**< The number of frame buffer to allocate */ + int type; /**< <> */ +} FrameBufferAllocInfo; + +/** +* @brief +@verbatim +This is a data structure for representing rectangular window information in a +frame. + +In order to specify a display window (or display window after cropping), this +structure is provided to HOST application. Each value means an offset from the +start point of a frame and therefore, all variables have positive values. +@endverbatim +*/ +typedef struct { + Uint32 left; /**< A horizontal pixel offset of top-left corner of + rectangle from (0, 0) */ + Uint32 top; /**< A vertical pixel offset of top-left corner of rectangle + from (0, 0) */ + Uint32 right; /**< A horizontal pixel offset of bottom-right corner of + rectangle from (0, 0) */ + Uint32 bottom; /**< A vertical pixel offset of bottom-right corner of + rectangle from (0, 0) */ +} VpuRect; + +// Theora specific display information +/** +* @brief This is a data structure of picture size information. This structure +is valid only for Theora decoding case. When HOST application allocates frame +buffers and gets a displayable picture region, HOST application needs this +information. +*/ +typedef struct { + int frameWidth; /**< This value is used for width of frame buffer. */ + int frameHeight; /**< This value is used for height of frame buffer. */ + int picWidth; /**< This value is used for width of the displayable + picture region. */ + int picHeight; /**< This value is used for height of the displayable + picture region. */ + int picOffsetX; /**< This value is located at the lower-left corner of + the displayable picture region. */ + int picOffsetY; /**< This value is located at the lower-left corner of + the displayable picture region. */ +} ThoScaleInfo; + +// VP8 specific display information +/** +* @brief This is a data structure of picture upscaling information for +post-processing out of decoding loop. This structure is valid only for VP8 +decoding case and can never be used by VPU itself. If HOST application has an +upsampling device, this information is useful for them. When the HOST +application allocates a frame buffer, HOST application needs upscaled resolution +derived by this information to allocate enough (maximum) memory for variable +resolution picture decoding. +*/ +typedef struct { + /** +@verbatim +This is an upscaling factor for horizontal expansion. +The value could be 0 to 3, and meaning of each value is described in below +table. + +.Upsampling Ratio by Scale Factor +[separator="|", frame="all", grid="all"] +`50`50_70 +h/vScaleFactor | Upsampling Ratio +________________________________________________________________________________ +0 |1 +1 |5/4 +2 |5/3 +3 |2/1 +________________________________________________________________________________ + +@endverbatim +*/ + unsigned int hScaleFactor : 2; + unsigned int vScaleFactor : 2; /**< This is an upscaling factor for vertical + expansion. The value could be 0 to 3, + meaning of each value is described in + above table. */ + unsigned int picWidth : 14; /**< Picture width in units of sample */ + unsigned int picHeight : 14; /**< Picture height in units of sample */ +} Vp8ScaleInfo; + +/** + * @brief The data structure to enable low delay decoding. + */ +typedef struct { + /** +@verbatim +This enables low delay decoding. (CODA980 H.264/AVC decoder only) + +If this flag is 1, VPU sends an interrupt to HOST application when numRows +decoding is done. + +* 0 : disable +* 1 : enable + +When this field is enabled, reorderEnable, tiled2LinearEnable, and the +post-rotator should be disabled. +@endverbatim +*/ + int lowDelayEn; + /** +@verbatim +This field indicates the number of mb rows (macroblock unit). + +The value is from 1 to height/16 - 1. +If the value of this field is 0 or picture height/16, low delay decoding is +disabled even though lowDelayEn is 1. +@endverbatim +*/ + int numRows; +} LowDelayInfo; + +/** + * @brief This is a data structure for representing use of secondary AXI for + * each hardware block. + */ +typedef struct { + union { + struct { + int useBitEnable; /**< This enables AXI secondary + channel for prediction data of the + BIT-processor. */ + int useIpEnable; /**< This enables AXI secondary + channel for row pixel data of IP. */ + int useDbkYEnable; /**< This enables AXI secondary + channel for temporal luminance + data of the de-blocking filter. */ + int useDbkCEnable; /**< This enables AXI secondary + channel for temporal chrominance + data of the de-blocking filter. */ + int useOvlEnable; /**< This enables AXI secondary + channel for temporal data of the + the overlap filter (VC1 only). */ + int useBtpEnable; /**< This enables AXI secondary + channel for bit-plane data of the + BIT-processor (VC1 only). */ + + int useMeEnable; /**< This enables AXI secondary + channel for motion estimation data. + */ + int useScalerEnable; /**< This enables AXI secondary + channel for scaler temporal + data. */ + } coda9; + struct { + // for Decoder + int useBitEnable; /**< This enables AXI secondary + channel for prediction data of the + BIT-processor. */ + int useIpEnable; /**< This enables AXI secondary + channel for row pixel data of IP. */ + int useLfRowEnable; /**< This enables AXI secondary + channel for loopfilter. */ + + // for Encoder + int useEncImdEnable; /**< This enables AXI secondary + channel for intra mode decision. + */ + int useEncLfEnable; /**< This enables AXI secondary + channel for loopfilter. */ + int useEncRdoEnable; /**< This enables AXI secondary + channel for RDO. */ + + } wave4; + } u; +} SecAxiUse; + +// For MaverickCache1 +/** + * @brief This is a data structure for representing cache rectangle area for + * each component of MC reference frame. (CODA9 only) + */ +typedef struct { + unsigned int BufferSize : 8; /**< This is the cache buffer size for each + component and can be set with 0 to 255. The + unit of this value is fixed with 256byte. */ + unsigned int PageSizeX : 4; /**< This is the cache page size and can be set + as 0 to 4. With this value(n), 8*(2^n) byte + is requested as the width of a page. */ + unsigned int PageSizeY : 4; /**< This is the cache page size and can be set + as 0 to 7. With this value(m), a page + width*(2^m) byte is requested as the + rectangle of a page.*/ + unsigned int CacheSizeX : 4; /**< This is the component data cache size, and + it can be set as 0 to 7 in a page unit. Then + there can be 2^n pages in x(y)-direction. + Make sure that for luma component the + CacheSizeX + CacheSizeY must be less than 8. + For chroma components, CacheSizeX + + CacheSizeY must be less than 7. */ + unsigned int CacheSizeY : 4; /**< This is the component data cache size, and + it can be set as 0 to 7 in a page unit. Then + there can be 2^n pages in x(y)-direction. + Make sure that for luma component the + CacheSizeX + CacheSizeY must be less than 8. + For chroma components, CacheSizeX + + CacheSizeY must be less than 7. */ + unsigned int Reserved : 8; +} CacheSizeCfg; + +/** + * @brief This is a data structure for cache configuration. (CODA9 only) + */ +typedef struct { + struct { + union { + Uint32 word; + CacheSizeCfg cfg; /**< <> */ + } luma; + union { + Uint32 word; + CacheSizeCfg cfg; /**< <> */ + } chroma; + /** +@verbatim +It disables cache function. + +@* 1 : Cache off +@* 0 : Cache on +@endverbatim +*/ + unsigned int Bypass : 1; + /** +@verbatim +It enables two frame caching mode. + +@* 1 : Dual mode (caching for FrameIndex0 and FrameIndex1) +@* 0 : Single mode (caching for FrameIndex0) +@endverbatim +*/ + unsigned int DualConf : 1; + /** +@verbatim +Mode for page merging + +@* 0 : Disable +@* 1 : Horizontal +@* 2 : Vertical + +We recommend you to set 1 (horizontal) in tiled map or to set 2 (vertical) in +linear map. +@endverbatim +*/ + unsigned int PageMerge : 2; + } type1; + struct { + /** +@verbatim +CacheMode represents cache configuration. + +@* [10:9] : Cache line processing direction and merge mode +@* [8:5] : CacheWayShape +@** [8:7] : CacheWayLuma +@** [6:5] : CacheWayChroma +@* [4] reserved +@* [3] CacheBurstMode +@** 0: burst 4 +@** 1: bust 8 +@* [2] CacheMapType +@** 0: linear +@** 1: tiled +@* [1] CacheBypassME +@** 0: Cache enable +@** 1: Cache disable (bypass) +@* [0] CacheBypassMC +@** 0: Cache enable +@** 1: Cache disable (bypass) +@endverbatim +*/ + unsigned int CacheMode; + } type2; +} MaverickCacheConfig; + +/** +* @brief This structure is used when HOST application additionally wants to +send SPS data or PPS data from external way. The resulting SPS data or PPS data +can be used in real applications as a kind of out-of-band information. +*/ +typedef struct { + Uint32 *paraSet; /**< The SPS/PPS rbsp data */ + int size; /**< The size of stream in byte */ +} DecParamSet; + +struct CodecInst; + +//------------------------------------------------------------------------------ +// decode struct and definition +//------------------------------------------------------------------------------ + +#define VPU_HANDLE_INSTANCE_NO(_handle) (_handle->instIndex) +#define VPU_HANDLE_CORE_INDEX(_handle) (((CodecInst *)_handle)->coreIdx) +#define VPU_HANDLE_PRODUCT_ID(_handle) (((CodecInst *)_handle)->productId) +#define VPU_CONVERT_WTL_INDEX(_handle, _index) \ + ((((CodecInst *)_handle)->CodecInfo->decInfo).numFbsForDecoding + \ + _index) + +/** +* @brief +@verbatim +This is a dedicated type for handle returned when a decoder instance or a +encoder instance is opened. + +@endverbatim +*/ +typedef struct CodecInst *VpuHandle; + +/** +* @brief +@verbatim +This is a dedicated type for decoder handle returned when a decoder instance is +opened. A decoder instance can be referred to by the corresponding handle. +CodecInst is a type managed internally by API. Application does not need to care +about it. + +NOTE: This type is vaild for decoder only. +@endverbatim +*/ +typedef struct CodecInst *DecHandle; + +/** +* @brief This is a data structure for H.264/AVC specific picture information. +Only H.264/AVC decoder returns this structure after decoding a frame. For +details about all these flags, please find them in H.264/AVC VUI syntax. +*/ +typedef struct { + /** +@verbatim +@* 1 : It indicates that the temporal distance between the decoder output times +of any two consecutive pictures in output order is constrained as +fixed_frame_rate_flag in H.264/AVC VUI syntax. +@* 0 : It indicates that no such constraints apply to the temporal distance +between the decoder output times of any two consecutive pictures in output order +@endverbatim +*/ + int fixedFrameRateFlag; + /** +@verbatim +timing_info_present_flag in H.264/AVC VUI syntax + +@* 1 : FixedFrameRateFlag is valid. +@* 0 : FixedFrameRateFlag is not valid. +@endverbatim +*/ + int timingInfoPresent; + int chromaLocBotField; /**< chroma_sample_loc_type_bottom_field in + H.264/AVC VUI syntax. It specifies the + location of chroma samples for the bottom + field. */ + int chromaLocTopField; /**< chroma_sample_loc_type_top_field in + H.264/AVC VUI syntax. It specifiesf the + location of chroma samples for the top field. + */ + int chromaLocInfoPresent; /**< chroma_loc_info_present_flag in H.264/AVC + VUI syntax. */ + /** +@verbatim +chroma_loc_info_present_flag in H.264/AVC VUI syntax + +@* 1 : ChromaSampleLocTypeTopField and ChromaSampleLoc TypeTopField are valid. +@* 0 : ChromaSampleLocTypeTopField and ChromaSampleLoc TypeTopField are not +valid. +@endverbatim +*/ + int colorPrimaries; /**< colour_primaries syntax in VUI parameter in + H.264/AVC */ + int colorDescPresent; /**< colour_description_present_flag in VUI + parameter in H.264/AVC */ + int isExtSAR; /**< This flag indicates whether aspectRateInfo represents + 8bit aspect_ratio_idc or 32bit extended_SAR. If the + aspect_ratio_idc is extended_SAR mode, this flag + returns 1. */ + int vidFullRange; /**< video_full_range in VUI parameter in H.264/AVC */ + int vidFormat; /**< video_format in VUI parameter in H.264/AVC */ + int vidSigTypePresent; /**< video_signal_type_present_flag in VUI + parameter in H.264/AVC */ + int vuiParamPresent; /**< vui_parameters_present_flag in VUI parameter + in H.264/AVC */ + int vuiPicStructPresent; /**< pic_struct_present_flag of VUI in + H.264/AVC. This field is valid only for + H.264/AVC decoding. */ + int vuiPicStruct; /**< pic_struct in H.264/AVC VUI reporting (Table D-1 + in H.264/AVC specification) */ +} AvcVuiInfo; + +/** +* @brief This is a data structure for bar information of MPEG2 user data. +For more details on this, please refer to 'ATSC Digital Television Standard: +Part 4:2009'. +*/ + +typedef struct { + /** +@verbatim +A 14-bit unsigned integer value representing the last horizontal +luminance sample of a vertical pillarbox bar area at the left side of the +reconstructed frame. Pixels shall be numbered from zero, starting with the +leftmost pixel. + +This variable is initialized to -1. +@endverbatim +*/ + int barLeft; + /** +@verbatim +A 14-bit unsigned integer value representing the first horizontal +luminance sample of a vertical pillarbox bar area at the right side of the +reconstructed frame. Pixels shall be numbered from zero, starting with the +leftmost pixel. + +This variable is initialized to -1. +@endverbatim +*/ + int barRight; + /** +@verbatim +A 14-bit unsigned integer value representing the first line of a +horizontal letterbox bar area at the top of the reconstructed frame. Designation +of line numbers shall be as defined per each applicable standard in Table 6.9. + +This variable is initialized to -1. +@endverbatim +*/ + int barTop; + /** +@verbatim +A 14-bit unsigned integer value representing the first line of a +horizontal letterbox bar area at the bottom of the reconstructed frame. +Designation of line numbers shall be as defined per each applicable standard in +Table 6.9. + +This variable is initialized to -1. +@endverbatim +*/ + int barBottom; +} MP2BarDataInfo; + +/** +* @brief +@verbatim +This is a data structure for MP2PicDispExtInfo. + +NOTE: For detailed information on these fields, +please refer to the MPEG2 standard specification. +@endverbatim +*/ +typedef struct { + Uint32 offsetNum; /**< This is number of frame_centre_offset with a + range of 0 to 3, inclusive. */ + Int16 horizontalOffset1; /**< A horizontal offset of display rectangle + in units of 1/16th sample */ + Int16 horizontalOffset2; /**< A horizontal offset of display rectangle + in units of 1/16th sample */ + Int16 horizontalOffset3; /**< A horizontal offset of display rectangle + in units of 1/16th sample */ + + Int16 verticalOffset1; /**< A vertical offset of display rectangle in + units of 1/16th sample */ + Int16 verticalOffset2; /**< A vertical offset of display rectangle in + units of 1/16th sample */ + Int16 verticalOffset3; /**< A vertical offset of display rectangle in + units of 1/16th sample */ +} MP2PicDispExtInfo; + +#define FBC_MODE_BEST_PREDICTION \ + 0x00 //!<< Best for bandwidth, some performance overhead +#define FBC_MODE_NORMAL_PREDICTION 0x0c //!<< Good for badnwidth and performance +#define FBC_MODE_BASIC_PREDICTION 0x3c //!<< Best for performance + +/** +* @brief This data structure is a group of common decoder parameters to run +VPU with a new decoding instance. This is used when HOST application calls +VPU_Decopen(). +*/ +typedef struct { + CodStd bitstreamFormat; /**< A standard type of bitstream in decoder + operation. It is one of codec standards + defined in CodStd. */ + PhysicalAddress bitstreamBuffer; /**< The start address of bitstream + buffer from which the decoder can + get the next bitstream. This address + must be aligned to AXI bus width. */ + int bitstreamBufferSize; /**< The size of the buffer pointed by + bitstreamBuffer in byte. This value must be + a multiple of 1024. */ + /** +@verbatim +@* 0 : disable +@* 1 : enable + +When this field is set in case of MPEG4, H.263 (post-processing), DivX3 or MPEG2 +decoding, VPU generates MPEG4 deblocking filtered output. +@endverbatim +*/ + int mp4DeblkEnable; + /** +@verbatim +@* 0 : No extension of H.264/AVC +@* 1 : MVC extension of H.264/AVC +@endverbatim +*/ + int avcExtension; + /** +@verbatim + +@* 0 : MPEG4 +@* 1 : DivX 5.0 or higher +@* 2 : Xvid +@* 5 : DivX 4.0 +@* 6 : old Xvid +@* 256 : Sorenson Spark + +NOTE: This variable is only valid when decoding MPEG4 stream. +@endverbatim +*/ + int mp4Class; + int tiled2LinearEnable; /**< It enables a tiled to linear map conversion + feature for display. */ + /** +@verbatim +It specifies which picture type is converted to. (CODA980 only) + +@* 1 : conversion to linear frame map (when FrameFlag enum is FF_FRAME) +@* 2 : conversion to linear field map (when FrameFlag enum is FF_FIELD) + +@endverbatim +*/ + int tiled2LinearMode; + /** +@verbatim +It enables WTL (Write Linear) function. If this field is enabled, +VPU writes a decoded frame to the frame buffer twice - first in linear map and +second in tiled or compressed map. Therefore, HOST application should allocate +one more frame buffer for saving both formats of frame buffers. + +@endverbatim +*/ + int wtlEnable; + /** +@verbatim +It specifies whether VPU writes in frame linear map or in field linear map when +WTL is enabled. (CODA980 only) + +@* 1 : write decoded frames in frame linear map (when FrameFlag enum is +FF_FRAME) +@* 2 : write decoded frames in field linear map (when FrameFlag enum is +FF_FIELD) + +@endverbatim +*/ + int wtlMode; + /** +@verbatim +@* 0 : CbCr data is written in separate frame memories (chroma separate mode) +@* 1 : CbCr data is interleaved in chroma memory. (chroma interleave mode) +@endverbatim +*/ + int cbcrInterleave; + /** +@verbatim +CrCb interleaved mode (NV21). + +@* 0 : Decoded chroma data is written in CbCr (NV12) format. +@* 1 : Decoded chroma data is written in CrCb (NV21) format. + +This is only valid if cbcrInterleave is 1. +@endverbatim +*/ + int nv21; + /** +@verbatim +CbCr order in planar mode (YV12 format) + +@* 0 : Cb data are written first and then Cr written in their separate plane. +@* 1 : Cr data are written first and then Cb written in their separate plane. +@endverbatim +*/ + int cbcrOrder; + /** +@verbatim +It writes output with 8 burst in linear map mode. (CODA9 only) + +@* 0 : burst write back is disabled +@* 1 : burst write back is enabled. + +@endverbatim +*/ + int bwbEnable; + /** +@verbatim +Frame buffer endianness + +@* 0 : little endian format +@* 1 : big endian format +@* 2 : 32 bit little endian format +@* 3 : 32 bit big endian format +@* 16 ~ 31 : 128 bit endian format + +NOTE: For setting specific values of 128 bit endiness, please refer to the 'WAVE +Datasheet'. +@endverbatim +*/ + EndianMode frameEndian; + /** +@verbatim +Bitstream buffer endianess + +@* 0 : little endian format +@* 1 : big endian format +@* 2 : 32 bits little endian format +@* 3 : 32 bits big endian format +@* 16 ~ 31 : 128 bit endian format + +NOTE: For setting specific values of 128 bit endiness, please refer to the 'WAVE +Datasheet'. +@endverbatim +*/ + EndianMode streamEndian; + /** +@verbatim +When read pointer reaches write pointer in the middle of decoding one picture, + +@* 0 : VPU sends an interrupt to HOST application and waits for more bitstream +to decode. (interrupt mode) +@* 1 : Reserved +@* 2 : VPU decodes bitstream from read pointer to write pointer. (PicEnd mode) +@endverbatim +*/ + int bitstreamMode; + Uint32 coreIdx; /**< VPU core index number (0 ~ [number of VPU core] - + 1) */ + /** +BIT processor work buffer SDRAM address/size information. In parallel decoding +operation, work buffer is shared between VPU cores. The work buffer address is +set to this member variable when VPU_Decopen() is called. Unless HOST +application sets the address and size of work buffer, VPU allocates +automatically work buffer when VPU_DecOpen() is executed. +*/ + vpu_buffer_t vbWork; + /** +@verbatim +It determines prediction mode of frame buffer compression. + +@* 0x00 : Best Predection (best for bandwidth, but some performance overhead +might exist) +@* 0x0C : Normal Prediction (good for bandwidth and performance) +@* 0x3C : Basic Predcition (best for performance) +@endverbatim +*/ + int fbc_mode; + Uint32 virtAxiID; /**< AXI_ID to distinguish guest OS. For + virtualization only. Set this value in highest bit + order.*/ + BOOL bwOptimization; /**< Bandwidth optimization feature which allows + WTL(Write to Linear)-enabled VPU to skip writing + compressed format of non-reference pictures or + linear format of non-display pictures to the + frame buffer for BW saving reason. */ + Uint32 div3Width; /**< The picture width of div3 stream (CODA7Q only) + */ + Uint32 div3Height; /**< The picture height of div3 stream (CODA7Q only) + */ + Int32 s32ChnNum; + int reorderEnable; /* If stream not have B frame, can set to false */ +} DecOpenParam; + +/** + * @brief Data structure to get information necessary to start decoding from the + * decoder. + */ + +typedef struct { + /** +@verbatim +Horizontal picture size in pixel + +This width value is used while allocating decoder frame buffers. In some +cases, this returned value, the display picture width declared on stream header, +should be aligned to a specific value depending on product and video standard +before allocating frame buffers. +@endverbatim +*/ + Int32 picWidth; + /** +@verbatim +Vertical picture size in pixel + +This height value is used while allocating decoder frame buffers. +In some cases, this returned value, the display picture height declared on +stream header, should be aligned to a specific value depending on product and +video standard before allocating frame buffers. +@endverbatim +*/ + Int32 picHeight; + + /** +@verbatim +The numerator part of frame rate fraction + +NOTE: The meaning of this flag can vary by codec standards. +For details about this, +please refer to 'Appendix: FRAME RATE NUMERATORS in programmer\'s guide'. +@endverbatim +*/ + Int32 fRateNumerator; + /** +@verbatim +The denominator part of frame rate fraction + +NOTE: The meaning of this flag can vary by codec standards. +For details about this, +please refer to 'Appendix: FRAME RATE DENOMINATORS in programmer\'s guide'. +@endverbatim +*/ + Int32 fRateDenominator; + /** +@verbatim +Picture cropping rectangle information (H.264/H.265/AVS decoder only) + +This structure specifies the cropping rectangle information. +The size and position of cropping window in full frame buffer is presented +by using this structure. +@endverbatim +*/ + VpuRect picCropRect; + Int32 mp4DataPartitionEnable; /**< data_partitioned syntax value in + MPEG4 VOL header */ + Int32 mp4ReversibleVlcEnable; /**< reversible_vlc syntax value in MPEG4 + VOL header */ + /** +@verbatim +@* 0 : not h.263 stream +@* 1 : h.263 stream(mpeg4 short video header) +@endverbatim +*/ + Int32 mp4ShortVideoHeader; + /** +@verbatim +@* 0 : Annex J disabled +@* 1 : Annex J (optional deblocking filter mode) enabled +@endverbatim +*/ + Int32 h263AnnexJEnable; + Int32 minFrameBufferCount; /**< This is the minimum number of frame + buffers required for decoding. + Applications must allocate at least as + many as this number of frame buffers and + register the number of buffers to VPU + using VPU_DecRegisterFrameBuffer() before + decoding pictures. */ + Int32 frameBufDelay; /**< This is the maximum display frame buffer delay + for buffering decoded picture reorder. VPU may + delay decoded picture display for display + reordering when H.264/H.265, pic_order_cnt_type + 0 or 1 case and for B-frame handling in VC1 + decoder. */ + Int32 normalSliceSize; /**< This is the recommended size of buffer used + to save slice in normal case. This value is + determined by quarter of the memory size for + one raw YUV image in KB unit. This is only for + H.264. */ + Int32 worstSliceSize; /**< This is the recommended size of buffer used + to save slice in worst case. This value is + determined by half of the memory size for one + raw YUV image in KB unit. This is only for + H.264. */ + + // Report Information + Int32 maxSubLayers; /**< Number of sub-layer for H.265/HEVC */ + /** +@verbatim +@* H.265/H.264 : profile_idc +@* VC1 +@** 0 : Simple profile +@** 1 : Main profile +@** 2 : Advanced profile +@* MPEG2 +@** 3\'b101 : Simple +@** 3\'b100 : Main +@** 3\'b011 : SNR Scalable +@** 3\'b10 : SpatiallyScalable +@** 3\'b001 : High +@* MPEG4 +@** 8\'b00000000 : SP +@** 8\'b00001111 : ASP +@* Real Video +@** 8 (version 8) +@** 9 (version 9) +@** 10 (version 10) +@* AVS +@** 8\'b0010 0000 : Jizhun profile +@** 8\'b0100 1000 : Guangdian profile +@* VP8 : 0 - 3 +@endverbatim +*/ + Int32 profile; + /** +@verbatim +@* H.265/H.264 : level_idc +@* VC1 : level +@* MPEG2 : +@** 4\'b1010 : Low +@** 4\'b1000 : Main +@** 4\'b0110 : High 1440, +@** 4\'b0100 : High +@* MPEG4 : +@** SP +@*** 4\'b1000 : L0 +@*** 4\'b0001 : L1 +@*** 4\'b0010 : L2 +@*** 4\'b0011 : L3 +@** ASP +@*** 4\'b0000 : L0 +@*** 4\'b0001 : L1 +@*** 4\'b0010 : L2 +@*** 4\'b0011 : L3 +@*** 4\'b0100 : L4 +@*** 4\'b0101 : L5 +@* Real Video : N/A (real video does not have any level info). +@* AVS : +@** 4\'b0000 : L2.0 +@** 4\'b0001 : L4.0 +@** 4\'b0010 : L4.2 +@** 4\'b0011 : L6.0 +@** 4\'b0100 : L6.2 +@* VC1 : level in struct B +@endverbatim +*/ + Int32 level; + /** +@verbatim +A tier indicator + +@* 0 : Main +@* 1 : High +@endverbatim +*/ + Int32 tier; + Int32 interlace; /**< When this value is 1, decoded stream may be + decoded into progressive or interlace frame. + Otherwise, decoded stream is progressive frame. */ + Int32 constraint_set_flag[4]; /**< constraint_set0_flag ~ + constraint_set3_flag in H.264/AVC SPS + */ + Int32 direct8x8Flag; /**< direct_8x8_inference_flag in H.264/AVC SPS */ + Int32 vc1Psf; /**< Progressive Segmented Frame(PSF) in VC1 sequence + layer */ + Int32 isExtSAR; + /** +@verbatim +This is one of the SPS syntax elements in H.264. + +@* 0 : max_num_ref_frames is 0. +@* 1 : max_num_ref_frames is not 0. +@endverbatim +*/ + Int32 maxNumRefFrmFlag; + Int32 maxNumRefFrm; + /** +@verbatim +@* H.264/AVC : When avcIsExtSAR is 0, this indicates aspect_ratio_idc[7:0]. When +avcIsExtSAR is 1, this indicates sar_width[31:16] and sar_height[15:0]. If +aspect_ratio_info_present_flag = 0, the register returns -1 (0xffffffff). +@* VC1 : This reports ASPECT_HORIZ_SIZE[15:8] and ASPECT_VERT_SIZE[7:0]. +@* MPEG2 : This value is index of Table 6-3 in ISO/IEC 13818-2. +@* MPEG4/H.263 : This value is index of Table 6-12 in ISO/IEC 14496-2. +@* RV : aspect_ratio_info +@* AVS : This value is the aspect_ratio_info[3:0] which is used as index of +Table 7-5 in AVS Part2 +@endverbatim +*/ + Int32 aspectRateInfo; + Int32 bitRate; /**< The bitrate value written in bitstream syntax. If + there is no bitRate, this reports -1. */ + ThoScaleInfo thoScaleInfo; /**< This is the Theora picture size + information. Refer to + <>. */ + Vp8ScaleInfo vp8ScaleInfo; /**< This is VP8 upsampling information. + Refer to <>. */ + Int32 mp2LowDelay; /**< This is low_delay syntax of sequence extension + in MPEG2 specification. */ + Int32 mp2DispVerSize; /**< This is display_vertical_size syntax of + sequence display extension in MPEG2 + specification. */ + Int32 mp2DispHorSize; /**< This is display_horizontal_size syntax of + sequence display extension in MPEG2 + specification. */ + Uint32 userDataHeader; /**< Refer to userDataHeader in + <>. */ + Int32 userDataNum; /**< Refer to userDataNum in + <>. */ + Int32 userDataSize; /**< Refer to userDataSize in + <>. */ + Int32 userDataBufFull; /**< Refer to userDataBufFull in + <>. */ + // VUI information + Int32 chromaFormatIDC; /**< A chroma format indicator */ + Int32 lumaBitdepth; /**< A bit-depth of luma sample */ + Int32 chromaBitdepth; /**< A bit-depth of chroma sample */ + /** +@verbatim +This is an error reason of sequence header decoding. +For detailed meaning of returned value, +please refer to the 'Appendix: ERROR DEFINITION in programmer\'s guide'. +@endverbatim +*/ + Int32 seqInitErrReason; + Int32 warnInfo; + PhysicalAddress rdPtr; /**< A read pointer of bitstream buffer */ + PhysicalAddress wrPtr; /**< A write pointer of bitstream buffer */ + AvcVuiInfo avcVuiInfo; /**< This is H.264/AVC VUI information. Refer to + <>. */ + MP2BarDataInfo mp2BardataInfo; /**< This is bar information in MPEG2 + user data. For details about this, + please see the document 'ATSC Digital + Television Standard: Part 4:2009'. */ + Uint32 sequenceNo; /**< This is the number of sequence information. This + variable is increased by 1 when VPU detects change + of sequence. */ + Int32 numReorderFrames; /**< This is num_reorder_frames in in H.264/AVC + VUI syntax (CODA7Q only) */ +} DecInitialInfo; + +// Report Information + +/** + * @brief The data structure for options of picture decoding. + */ +#define WAVE_SKIPMODE_WAVE_NONE 0 +#define WAVE_SKIPMODE_NON_IRAP 1 +#define WAVE_SKIPMODE_NON_REF 2 +typedef struct { + /** +@verbatim +@* 0 : disable +@* 1 : enable +@* 2 : I frame search enable (H.264/AVC only) + +If this option is enabled, then decoder performs skipping frame decoding until +decoder meets an I (IDR) frame. If there is no I frame in given stream, decoder +waits for I (IDR) frame. +Especially in H.264/AVC stream decoding, they might have I-frame and IDR frame. +Therefore HOST application should set iframeSearchEnable value according to +frame type. If HOST application wants to search IDR frame, this flag should be +set to 1 like other standards. Otherwise if HOST application wants to search I +frame, this flag should be set to 2. + +Note that when decoder meets EOS (End Of Sequence) code during I-Search, decoder +returns -1 (0xFFFF). And if this option is enabled, +skipframeMode options are ignored. + +NOTE: CODA9 only supports it. +@endverbatim +*/ + Int32 iframeSearchEnable; + /** +@verbatim +Skip frame function enable and operation mode + +In case of CODA9, + +@* 0 : skip frame disable +@* 1 : skip frame enabled (skip frames but I (IDR) frame) +@* 2 : skip frame enabled (skip any frames), + +If this option is enabled, decoder skips decoding as many as skipframeNum. + +If skipframeMode is 1, decoder skips frames but I (IDR) frames and decodes I +(IDR) frames. If skipframeMode is 2, decoder skips any frames. After decoder +skips frames, decoder returns the decoded index -2 (0xFFFE) when decoder does +not have any frames displayed. + +In case of WAVE4, + +@* 0x0 : skip frame off +@* 0x1 : skip non-RAP pictures. That is, all pictures that are not IDR, CRA, or +BLA are skipped. +@* 0x2 : skip non-reference pictures. +@* 0x3 : Reserved +@* 0x4~0xf : Reserved + +NOTE: When decoder meets EOS (End Of Sequence) code during frame skip, +decoder returns -1(0xFFFF). +@endverbatim +*/ + Int32 skipframeMode; + union { + /** +@verbatim +Forces to flush a display index of the frame buffer that +delayed without decoding of the current picture. + +@* 0 : disable +@* 1 : enable flushing +@endverbatim +*/ + Int32 mp2PicFlush; + /** +@verbatim +FSets a de-blocking filter mode for RV streams. + +@* 0 : It enables de-blocking filter for all pictures. +@* 1 : It disables de-blocking filter for all pictures. +@* 2 : It disables de-blocking filter for P and B pictures. +@* 3 : It disables de-blocking filter only for B pictures. +@endverbatim +*/ + Int32 rvDbkMode; + } DecStdParam; + + BOOL craAsBlaFlag; /**< It handles CRA picture as BLA picture not to use + reference from the previous decoded pictures + (H.265/HEVC only) */ +} DecParam; + +// Report Information +/** + * @brief The data structure to get result information from decoding a frame. + */ + +typedef struct { + /** +@verbatim +This variable indicates which userdata is reported by VPU. (WAVE only) +When this variable is not zero, each bit corresponds to the +`H265_USERDATA_FLAG_XXX`. + + // H265 USER_DATA(SPS & SEI) ENABLE FLAG + #define H265_USERDATA_FLAG_RESERVED_0 (0) + #define H265_USERDATA_FLAG_RESERVED_1 (1) + #define H265_USERDATA_FLAG_VUI (2) + #define H265_USERDATA_FLAG_RESERVED_3 (3) + #define H265_USERDATA_FLAG_PIC_TIMING (4) + #define H265_USERDATA_FLAG_ITU_T_T35_PRE (5) + #define H265_USERDATA_FLAG_UNREGISTERED_PRE (6) + #define H265_USERDATA_FLAG_ITU_T_T35_SUF (7) + #define H265_USERDATA_FLAG_UNREGISTERED_SUF (8) + #define H265_USERDATA_FLAG_RESERVED_9 (9) + #define H265_USERDATA_FLAG_MASTERING_COLOR_VOL (10) + #define H265_USERDATA_FLAG_CHROMA_RESAMPLING_FILTER_HINT (11) + #define H265_USERDATA_FLAG_KNEE_FUNCTION_INFO (12) + +Userdata are written from the memory address specified to SET_ADDR_REP_USERDATA, +and userdata consists of two parts, header (offset and size) and userdata as +shown below. + + ------------------------------------- + | offset_00(32bit) | size_00(32bit) | + | offset_01(32bit) | size_01(32bit) | + | ... | header + | ... | + | offset_31(32bit) | size_31(32bit) | + ------------------------------------- + | | data + | | + +@endverbatim +*/ + Uint32 userDataHeader; + Uint32 userDataNum; /**< This is the number of user data. */ + Uint32 userDataSize; /**< This is the size of user data. */ + Uint32 userDataBufFull; /**< When userDataEnable is enabled, decoder + reports frame buffer status into the + userDataBufAddr and userDataSize in byte + size. When user data report mode is 1 and the + user data size is bigger than the user data + buffer size, VPU reports user data as much as + buffer size, skips the remainings and sets + userDataBufFull. */ + Uint32 activeFormat; /**< active_format (4bit syntax value) in AFD user + data. The default value is 0000b. This is valid + only for H.264/AVC and MPEG2 stream. */ +} DecOutputExtData; + +// VP8 specific header information +/** +* @brief This is a data structure for VP8 specific hearder information and +reference frame indices. Only VP8 decoder returns this structure after decoding +a frame. +*/ +typedef struct { + unsigned int showFrame : 1; /**< This flag is the frame header syntax, + meaning whether the current decoded frame is + displayable or not. It is 0 when the current + frame is not for display, and 1 when the + current frame is for display. */ + unsigned int versionNumber : 3; /**< This is the VP8 profile version number + information in the frame header. The + version number enables or disables + certain features in bitstream. It can be + defined with one of the four different + profiles, 0 to 3 and each of them + indicates different decoding complexity. + */ + unsigned int refIdxLast : 8; /**< This is the frame buffer index for the + Last reference frame. This field is valid + only for next inter frame decoding. */ + unsigned int refIdxAltr : 8; /**< This is the frame buffer index for the + altref(Alternative Reference) reference + frame. This field is valid only for next + inter frame decoding. */ + unsigned int refIdxGold : 8; /**< This is the frame buffer index for the + Golden reference frame. This field is valid + only for next inter frame decoding. */ +} Vp8PicInfo; + +// MVC specific picture information +/** + * @brief This is a data structure for MVC specific picture information. Only + * MVC decoder returns this structure after decoding a frame. + */ +typedef struct { + int viewIdxDisplay; /**< This is view index order of display frame + buffer corresponding to indexFrameDisplay of + DecOutputInfo structure. */ + int viewIdxDecoded; /**< This is view index order of decoded frame + buffer corresponding to indexFrameDecoded of + DecOutputInfo structure. */ +} MvcPicInfo; + +// AVC specific SEI information (frame packing arrangement SEI) +/** +* @brief This is a data structure for H.264/AVC FPA(Frame Packing +Arrangement) SEI. For detailed information, refer to 'ISO/IEC 14496-10 D.2.25 +Frame packing arrangement SEI message semantics'. +*/ +typedef struct { + /** +@verbatim +This is a flag to indicate whether H.264/AVC FPA SEI exists or not. + +@* 0 : H.264/AVC FPA SEI does not exist. +@* 1 : H.264/AVC FPA SEI exists. +@endverbatim +*/ + unsigned int exist; + unsigned int framePackingArrangementId; /**< 0 ~ 2^32-1 : An identifying + number that may be used to + identify the usage of the frame + packing arrangement SEI message. + */ + unsigned int framePackingArrangementCancelFlag; /**< 1 indicates that the + frame packing arrangement + SEI message cancels the + persistence of any + previous frame packing + arrangement SEI message + in output order. */ + unsigned int quincunxSamplingFlag; /**< It indicates whether each color + component plane of each constituent + frame is quincunx sampled. */ + unsigned int spatialFlippingFlag; /**< It indicates that one of the two + constituent frames is spatially + flipped. */ + unsigned int frame0FlippedFlag; /**< It indicates which one of the two + constituent frames is flipped. */ + unsigned int fieldViewsFlag; /**< 1 indicates that all pictures in the + current coded video sequence are coded as + complementary field pairs. */ + unsigned int currentFrameIsFrame0Flag; /**< It indicates the current decoded + frame and the next decoded frame + in output order. */ + unsigned int frame0SelfContainedFlag; /**< It indicates whether inter + prediction operations within the + decoding process for the samples of + constituent frame 0 of the coded + video sequence refer to samples of + any constituent frame 1. */ + unsigned int frame1SelfContainedFlag; /**< It indicates whether inter + prediction operations within the + decoding process for the samples of + constituent frame 1 of the coded + video sequence refer to samples of + any constituent frame 0. */ + unsigned int framePackingArrangementExtensionFlag; /**< 0 indicates that no + additional data + follows within the + frame packing + arrangement SEI + message. */ + unsigned int framePackingArrangementType; /**< The type of packing + arrangement of the frames */ + unsigned int contentInterpretationType; /**< It indicates the intended + interpretation of the constituent + frames. */ + unsigned int frame0GridPositionX; /**< It specifies the horizontal location + of the upper left sample of constituent + frame 0 to the right of the spatial + reference point. */ + unsigned int frame0GridPositionY; /**< It specifies the vertical location of + the upper left sample of constituent + frame 0 below the spatial reference + point. */ + unsigned int frame1GridPositionX; /**< It specifies the horizontal location + of the upper left sample of constituent + frame 1 to the right of the spatial + reference point. */ + unsigned int frame1GridPositionY; /**< It specifies the vertical location of + the upper left sample of constituent + frame 1 below the spatial reference + point. */ + unsigned int framePackingArrangementRepetitionPeriod; /**< It indicates + persistence of the + frame packing + arrangement SEI + message. */ +} AvcFpaSei; + +// H.264/AVC specific HRD information +/** +* @brief This is a data structure for H.264/AVC specific picture information. +(H.264/AVC decoder only) VPU returns this structure after decoding a frame. For +detailed information, refer to 'ISO/IEC 14496-10 E.1 VUI syntax'. +*/ +typedef struct { + int cpbMinus1; /**< cpb_cnt_minus1 */ + int vclHrdParamFlag; /**< vcl_hrd_parameters_present_flag */ + int nalHrdParamFlag; /**< nal_hrd_parameters_present_flag */ +} AvcHrdInfo; + +// H.264/AVC specific Recovery Point information +/** +* @brief This is a data structure for H.264/AVC specific picture information. +(H.264/AVC decoder only) VPU returns this structure after decoding a frame. For +detailed information, refer to 'ISO/IEC 14496-10 D.1.7 Recovery point SEI +message syntax'. +*/ +typedef struct { + /** +@verbatim +This is a flag to indicate whether H.264/AVC RP SEI exists or not. + +@* 0 : H.264/AVC RP SEI does not exist. +@* 1 : H.264/AVC RP SEI exists. +@endverbatim +*/ + unsigned int exist; + int recoveryFrameCnt; /**< recovery_frame_cnt */ + int exactMatchFlag; /**< exact_match_flag */ + int brokenLinkFlag; /**< broken_link_flag */ + int changingSliceGroupIdc; /**< changing_slice_group_idc */ +} AvcRpSei; + +// HEVC specific Recovery Point information +/** +* @brief This is a data structure for H.265/HEVC specific picture +information. (H.265/HEVC decoder only) VPU returns this structure after decoding +a frame. +*/ +typedef struct { + /** +@verbatim +This is a flag to indicate whether H.265/HEVC RP SEI exists or not. + +@* 0 : H.265/HEVC RP SEI does not exist. +@* 1 : H.265/HEVC RP SEI exists. +@endverbatim +*/ + unsigned int exist; + int recoveryPocCnt; /**< recovery_poc_cnt */ + int exactMatchFlag; /**< exact_match_flag */ + int brokenLinkFlag; /**< broken_link_flag */ + +} H265RpSei; + +/** + * @brief This is a data structure that H.265/HEVC decoder returns for + * reporting POC (Picture Order Count). + */ +typedef struct { + int decodedPOC; /**< A POC value of picture that has currently been + decoded and with decoded index. When + indexFrameDecoded is -1, it returns -1. */ + int displayPOC; /**< A POC value of picture with display index. When + indexFrameDisplay is -1, it returns -1. */ + int temporalId; /**< A temporal ID of the picture */ +} H265Info; + +/** + * @brief The data structure to get result information from decoding a frame. + */ +typedef struct { + /** +@verbatim +This is a frame buffer index for the picture to be displayed at the moment among +frame buffers which are registered using VPU_DecRegisterFrameBuffer(). Frame +data to be displayed are stored into the frame buffer with this index. +When there is no display delay, this index is always +the same with indexFrameDecoded. However, if display delay does exist for +display reordering in AVC or B-frames in VC1), this index might be different +with indexFrameDecoded. By checking this index, HOST application can easily know +whether sequence decoding has been finished or not. + +@* -3(0xFFFD) : It is when decoder skip option is on. +@* -2(0xFFFE) : It is when decoder have decoded sequence but cannot give a +display output due to reordering. +@* -1(0xFFFF) : It is when there is no more output for display at the end of +sequence decoding. + +@endverbatim +*/ + int indexFrameDisplay; + int indexFrameDisplayForTiled; /**< In case of WTL mode, this index + indicates a display index of tiled or + compressed framebuffer. */ + /** +@verbatim +This is a frame buffer index of decoded picture among frame buffers which were +registered using VPU_DecRegisterFrameBuffer(). The currently decoded frame is +stored into the frame buffer specified by this index. + +* -2 : It indicates that no decoded output is generated because decoder meets +EOS (End Of Sequence) or skip. +* -1 : It indicates that decoder fails to decode a picture because there is no +available frame buffer. +@endverbatim +*/ + int indexFrameDecoded; + int indexInterFrameDecoded; /**< In case of VP9 codec, this indicates an + index of the frame buffer to reallocate + for the next frame's decoding. VPU + returns this information when detecting + change of the inter-frame resolution. */ + int indexFrameDecodedForTiled; /**< In case of WTL mode, this indicates + a decoded index of tiled or compressed + framebuffer. */ + int nalType; /**< This is nal Type of decoded picture. Please refer to + nal_unit_type in Table 7-1 - NAL unit type codes and NAL + unit type classes in H.265/HEVC specification. (WAVE + only) */ + int picType; /**< This is the picture type of decoded picture. It + reports the picture type of bottom field for interlaced + stream. <>. */ + int picTypeFirst; /**< This is only valid in interlaced mode and + indicates the picture type of the top field. */ + int numOfErrMBs; /**< This is the number of error coded unit in a + decoded picture. */ + int numOfTotMBs; /**< This is the number of coded unit in a decoded + picture. */ + int numOfErrMBsInDisplay; /**< This is the number of error coded unit in + a picture mapped to indexFrameDisplay. */ + int numOfTotMBsInDisplay; /**< This is the number of coded unit in a + picture mapped to indexFrameDisplay. */ + BOOL refMissingFrameFlag; /**< This indicates that the current frame's + references are missing in decoding. (WAVE + only) */ + int notSufficientSliceBuffer; /**< This is a flag which represents + whether slice save buffer is not + sufficient to decode the current + picture. VPU might not get the last + part of the current picture stream due + to buffer overflow, which leads to + macroblock errors. HOST application can + continue decoding the remaining + pictures of the current bitstream + without closing the current instance, + even though several pictures could be + error-corrupted. (H.264/AVC BP only) */ + int notSufficientPsBuffer; /**< This is a flag which represents whether + PS (SPS/PPS) save buffer is not sufficient + to decode the current picture. VPU might + not get the last part of the current + picture stream due to buffer overflow. + HOST application must close the current + instance, since the following picture + streams cannot be decoded properly for + loss of SPS/PPS data. (H.264/AVC only) */ + /** +@verbatim +This variable indicates whether decoding process was finished completely or not. +If stream has error in the picture header syntax or has the first slice header +syntax of H.264/AVC stream, VPU returns 0 without proceeding MB decode routine. + +@* 0 : It indicates incomplete finish of decoding process +@* 1 : It indicates complete finish of decoding process + +@endverbatim +*/ + int decodingSuccess; + /** +@verbatim +@* 0 : A progressive frame which consists of one picture +@* 1 : An interlaced frame which consists of two fields +@endverbatim +*/ + int interlacedFrame; + /** +@verbatim +This is a flag which represents whether chunk in bitstream buffer should be +reused or not, even after VPU_DecStartOneFrame() is executed. This flag is +meaningful when bitstream buffer operates in PicEnd mode. In that mode, VPU +consumes all the bitstream in bitstream buffer for the current +VPU_DecStartOneFrame() in assumption that one chunk is one frame. However, there +might be a few cases that chunk needs to be reused such as the following: + +* DivX or XivD stream : One chunk can contain P frame and B frame to reduce +display delay. In that case after decoding P frame, this flag is set to 1. HOST +application should try decoding with the rest of chunk data to get B frame. +* H.264/AVC NPF stream : After the first field has been decoded, this flag is +set to 1. HOST application should check if the next field is NPF or not. +* No DPB available: It is when VPU is not able to consume chunk with no frame +buffers available at the moment. Thus, the whole chunk should be provided again. +@endverbatim +*/ + int chunkReuseRequired; + VpuRect rcDisplay; /**< This field reports the rectangular region in + pixel unit after decoding one frame - the region + of `indexFrameDisplay` frame buffer. */ + int dispPicWidth; /**< This field reports the width of a picture to be + displayed in pixel unit after decoding one frame - + width of `indexFrameDisplay` frame bufffer. */ + int dispPicHeight; /**< This field reports the height of a picture to be + displayed in pixel unit after decoding one frame - + height of `indexFrameDisplay` frame bufffer. */ + VpuRect rcDecoded; /**< This field reports the rectangular region in + pixel unit after decoding one frame - the region + of `indexFrameDecoded` frame buffer. */ + int decPicWidth; /**< This field reports the width of a decoded picture + in pixel unit after decoding one frame - width of + `indexFrameDecoded` frame bufffer. */ + int decPicHeight; /**< This field reports the height of a decoded + picture in pixel unit after decoding one frame - + height of `indexFrameDecoded` frame bufffer. */ + int aspectRateInfo; /**< This is aspect ratio information for each + standard. Refer to aspectRateInfo of + <>. */ + int fRateNumerator; /**< The numerator part of frame rate fraction. Note + that the meaning of this flag can vary by codec + standards. For details about this, please refer + to 'Appendix: FRAME RATE NUMERATORS in + programmer\'s guide'. */ + int fRateDenominator; /**< The denominator part of frame rate fraction. + Note that the meaning of this flag can vary by + codec standards. For details about this, please + refer to 'Appendix: FRAME RATE DENOMINATORS in + programmer\'s guide'. */ + Vp8ScaleInfo vp8ScaleInfo; /**< This is VP8 upsampling information. + Refer to <>. */ + Vp8PicInfo vp8PicInfo; /**< This is VP8 frame header information. Refer + to <>. */ + MvcPicInfo mvcPicInfo; /**< This is MVC related picture information. + Refer to <>. */ + AvcFpaSei avcFpaSei; /**< This is H.264/AVC frame packing arrangement + SEI information. Refer to + <>. */ + AvcHrdInfo avcHrdInfo; /**< This is H.264/AVC HRD information. Refer to + <>. */ + AvcVuiInfo avcVuiInfo; /**< This is H.264/AVC VUI information. Refer to + <>. */ + H265Info h265Info; /**< This is H.265/HEVC picture information. Refer to + <>. */ + /** +@verbatim +This field is valid only for VC1 decoding. Field information of display frame +index is returned on `indexFrameDisplay`. + +@* 0 : Paired fields +@* 1 : Bottom (top-field missing) +@* 2 : Top (bottom-field missing) +@endverbatim +*/ + int vc1NpfFieldInfo; + int mp2DispVerSize; /**< This is display_vertical_size syntax of + sequence display extension in MPEG2 + specification. */ + int mp2DispHorSize; /**< This is display_horizontal_size syntax of + sequence display extension in MPEG2 + specification. */ + /** +@verbatim +This field is valid only for MPEG2 decoding. Field information of display frame +index is returned on `indexFrameDisplay`. + +@* 0 : Paired fields +@* 1 : Bottom (top-field missing) +@* 2 : Top (bottom-field missing) +@endverbatim +*/ + int mp2NpfFieldInfo; + MP2BarDataInfo mp2BardataInfo; /**< This is bar information in MPEG2 + user data. For details about this, + please see the document 'ATSC Digital + Television Standard: Part 4:2009'. */ + MP2PicDispExtInfo mp2PicDispExtInfo; /**< For meaning of each field, + please see + <>. + */ + AvcRpSei avcRpSei; /**< This is H.264/AVC recovery point SEI + information. Refer to <>. */ + H265RpSei h265RpSei; /**< This is H.265/HEVC recovery point SEI + information. Refer to <>. */ + /** +@verbatim +This field is valid only for H.264/AVC decoding. +Field information of display frame index is returned on `indexFrameDisplay`. +Refer to the <>. + +@* 0 : Paired fields +@* 1 : Bottom (top-field missing) +@* 2 : Top (bottom-field missing) +@endverbatim +*/ + int avcNpfFieldInfo; + int avcPocPic; /**< This field reports the POC value of frame picture in + case of H.264/AVC decoding. */ + int avcPocTop; /**< This field reports the POC value of top field + picture in case of H.264/AVC decoding. */ + int avcPocBot; /**< This field reports the POC value of bottom field + picture in case of H.264/AVC decoding. */ + Uint32 avcTemporalId; /**< This field reports the target temporal ID of + current picture. This is valid in H.264/AVC + decoder. */ + // Report Information + /** +@verbatim +This variable indicates that the decoded picture is progressive or interlaced +picture. The value of pictureStructure is used as below. + +@* H.264/AVC : MBAFF +@* VC1 : FCM +@** 0 : Progressive +@** 2 : Frame interlace +@** 3 : Field interlaced +@* MPEG2 : picture structure +@** 1 : TopField +@** 2 : BotField +@** 3 : Frame +@* MPEG4 : N/A +@* Real Video : N/A +@* H.265/HEVC : N/A +@endverbatim +*/ + int pictureStructure; + /** +@verbatim +For decoded picture consisting of two fields, this variable reports + +@ 0 : VPU decodes the bottom field and then top field. +@ 1 : VPU decodes the top field and then bottom field. + +Regardless of this variable, VPU writes the decoded image of top field picture +at each odd line and the decoded image of bottom field picture at each even line +in frame buffer. +@endverbatim +*/ + int topFieldFirst; + int repeatFirstField; /**< This variable indicates Repeat First Field + that repeats to display the first field. This + flag is valid for VC1, AVS, and MPEG2. */ + int progressiveFrame; /**< This variable indicates progressive_frame in + MPEG2 picture coding extention or in AVS + picture header. In the case of VC1, this + variable means RPTFRM (Repeat Frame Count), + which is used during display process. */ + int fieldSequence; /**< This variable indicates field_sequence in + picture coding extention in MPEG2. */ + int frameDct; /**< This variable indicates frame_pred_frame_dct in + sequence extension of MPEG2. */ + int nalRefIdc; /**< This variable indicates if the currently decoded + frame is a reference frame or not. This flag is valid + for H.264/AVC only. */ + /** +@verbatim +@* H.264/AVC, MPEG2, and VC1 +@** 0 : The decoded frame has paired fields. +@** 1 : The decoded frame has a top-field missing. +@** 2 : The decoded frame has a bottom-field missing. +@endverbatim +*/ + int decFrameInfo; + int picStrPresent; /**< It indicates pic_struct_present_flag in + H.264/AVC pic_timing SEI. */ + int picTimingStruct; /**< It indicates pic_struct in H.264/AVC + pic_timing SEI reporting. (Table D-1 in + H.264/AVC specification.) If pic_timing SEI is + not presented, pic_struct is inferred by the + D.2.1. pic_struct part in H.264/AVC + specification. This field is valid only for + H.264/AVC decoding. */ + int progressiveSequence; /**< It indicates progressive_sequence in + sequence extension of MPEG2. */ + int mp4TimeIncrement; /**< It indicates vop_time_increment_resolution in + MPEG4 VOP syntax. */ + int mp4ModuloTimeBase; /**< It indicates modulo_time_base in MPEG4 VOP + syntax. */ + DecOutputExtData decOutputExtData; /**< The data structure to get + additional information about a + decoded frame. Refer to + <>. */ + int consumedByte; /**< The number of bytes that are consumed by VPU. */ + int rdPtr; /**< A stream buffer read pointer for the current decoder + instance */ + int wrPtr; /**< A stream buffer write pointer for the current decoder + instance */ + /** +@verbatim +The start byte position of the current frame after decoding the frame for +audio-to-video synchronization + +H.265/HEVC or H.264/AVC decoder seeks only 3-byte start code +(0x000001) while other decoders seek 4-byte start code(0x00000001). +@endverbatim +*/ + PhysicalAddress bytePosFrameStart; + PhysicalAddress bytePosFrameEnd; /**< It indicates the end byte position + of the current frame after decoding. + This information helps + audio-to-video synchronization. */ + FrameBuffer dispFrame; /**< It indicates the display frame buffer + address and information. Refer to + <>. */ + int frameDisplayFlag; /**< It reports a frame buffer flag to be + displayed. */ + /** +@verbatim +This variable reports that sequence has been changed while H.264/AVC stream +decoding. If it is 1, HOST application can get the new sequence information by +calling VPU_DecGetInitialInfo() or VPU_DecIssueSeqInit(). + +For H.265/HEVC decoder, each bit has a different meaning as follows. + +@* sequenceChanged[5] : It indicates that the profile_idc has been changed. +@* sequenceChanged[16] : It indicates that the resolution has been changed. +@* sequenceChanged[19] : It indicates that the required number of frame buffer +has been changed. +@endverbatim +*/ + int sequenceChanged; + // CODA9: [0] 1 - sequence changed + // WAVEX: [5] 1 - H.265 profile changed + // [16] 1 - resolution changed + // [19] 1 - number of DPB changed + + int streamEndFlag; /**< This variable reports the status of `end of + stream` flag. This information can be used for low + delay decoding (CODA980 only). */ + int frameCycle; /**< This variable reports the cycle number of decoding + one frame. */ + int errorReason; /**< This variable reports the error reason that occurs + while decoding. For error description, please find + the 'Appendix: Error Definition' in the Programmer's + Guide. */ + int errorReasonExt; /**< This variable reports the specific reason of + error. For error description, please find the + 'Appendix: Error Definition' in the Programmer's + Guide. (WAVE only) */ + int warnInfo; + Uint32 sequenceNo; /**< This variable increases by 1 whenever sequence + changes. If it happens, HOST should call + VPU_DecFrameBufferFlush() to get the decoded + result that remains in the buffer in the form of + DecOutputInfo array. HOST can recognize with this + variable whether this frame is in the current + sequence or in the previous sequence when it is + displayed. (WAVE only) */ + int rvTr; /**< This variable reports RV timestamp for Ref frame. */ + int rvTrB; /**< This variable reports RV timestamp for B frame. */ + + /** +@verbatim +This variable reports the result of pre-scan which is the start of decoding +routine for DEC_PIC command. (WAVE4 only) In the prescan phase, VPU parses +bitstream and pre-allocates frame buffers. + +@* -2 : It is when VPU prescanned bitstream(bitstream consumed), but a decode +buffer was not allocated for the bitstream during pre-scan, since there was only +header information. +@* -1 : It is when VPU detected full of framebuffer while pre-scannig (bitstream +not consumed). +@* >= 0 : It indicates that prescan has been successfully done. This index is +returned to a decoded index for the next decoding. +@endverbatim +*/ + int indexFramePrescan; +#ifdef SUPPORT_REF_FLAG_REPORT + int frameReferenceFlag[31]; +#endif + + Int32 seekCycle; /**< This variable reports the number of cycles in + seeking phase on the command queue. (WAVE5 only) */ + Int32 parseCycle; /**< This variable reports the number of cycles in + prescan phase on the command queue. (WAVE5 only) */ + Int32 decodeCycle; /**< This variable reports the number of cycles in + decoding phase on the command queue. (WAVE5 only) + */ + + /** +@verbatim +A CTU size (only for WAVE series) + +@* 16 : CTU16x16 +@* 32 : CTU32x32 +@* 64 : CTU64x64 +@endverbatim +*/ + Int32 ctuSize; + Int32 outputFlag; /**< This variable reports whether the current frame + is bumped out or not. (WAVE5 only) */ + Uint64 decHwTime; +} DecOutputInfo; + +/** + * @brief This is a data structure of frame buffer information. It is used for + * parameter when host issues DEC_GET_FRAMEBUF_INFO of + * <>. + */ +typedef struct { + vpu_buffer_t vbFrame; /**< The information of frame buffer where + compressed frame is saved */ + vpu_buffer_t vbWTL; /**< The information of frame buffer where decoded, + uncompressed frame is saved with linear format if + WTL is on */ + vpu_buffer_t vbFbcYTbl[MAX_REG_FRAME]; /**< The information of frame + buffer to save luma offset + table of compressed frame */ + vpu_buffer_t vbFbcCTbl[MAX_REG_FRAME]; /**< The information of frame + buffer to save chroma offset + table of compressed frame */ + vpu_buffer_t vbMvCol[MAX_REG_FRAME]; /**< The information of frame + buffer to save motion vector + collocated buffer */ + FrameBuffer framebufPool[64]; /**< This is an array of + <> which contains + the information of each frame buffer. + When WTL is enabled, the number of + framebufPool would be [number of + compressed frame buffer] x 2, and the + starting index of frame buffer for WTL + is framebufPool[number of compressed + frame buffer]. */ +} DecGetFramebufInfo; + +/** + * @brief This is a data structure of queue command information. It is used + * for parameter when host issues DEC_GET_QUEUE_STATUS of + * <>. (WAVE5 only) + */ +typedef struct { + Uint32 instanceQueueCount; /**< This variable indicates the number of + queued commands of the instance. */ + Uint32 totalQueueCount; /**< This variable indicates the number of + queued commands of all instances. */ +} DecQueueStatusInfo; + +//------------------------------------------------------------------------------ +// encode struct and definition +//------------------------------------------------------------------------------ + +#define MAX_ENC_PPS_NUM 2 + +#define MAX_NUM_TEMPORAL_LAYER 7 +#define MAX_GOP_NUM 8 + +typedef struct CodecInst EncInst; + +/** +* @brief +@verbatim +This is a dedicated type for encoder handle returned when an encoder instance is +opened. An encoder instance can be referred by the corresponding handle. EncInst +is a type managed internally by API. Application does not need to care about it. + +NOTE: This type is vaild for encoder only. +@endverbatim +*/ +typedef EncInst * EncHandle; + +/** + * @brief This is a data structure for configuring MPEG4-specific parameters + * in encoder applications. (CODA9 encoder only) + */ +typedef struct { + int mp4DataPartitionEnable; /**< It encodes with MPEG4 data_partitioned + coding tool. */ + int mp4ReversibleVlcEnable; /**< It encodes with MPEG4 reversible_vlc + coding tool. */ + int mp4IntraDcVlcThr; /**< It encodes with MPEG4 intra_dc_vlc_thr coding + tool. The valid range is 0 - 7. */ + int mp4HecEnable; /**< It encodes with MPEG4 HEC (Header Extension Code) + coding tool. */ + int mp4Verid; /**< It encodes with value of MPEG4 part 2 standard + version ID. Version 1 and version 2 are allowed. */ +} EncMp4Param; + +/** + * @brief This is a data structure for configuring H.263-specific parameters + * in encoder applications. (CODA9 encoder only) + */ +typedef struct { + int h263AnnexIEnable; /**< It encodes with H.263 Annex I - Advanced + INTRA Coding mode. */ + int h263AnnexJEnable; /**< It encodes with H.263 Annex J - Deblocking + Filter mode. */ + int h263AnnexKEnable; /**< It encodes with H.263 Annex K - Slice + Structured mode. */ + int h263AnnexTEnable; /**< It encodes with H.263 Annex T - Modified + Quantization mode. */ +} EncH263Param; + +/** + * @brief This is a data structure for custom GOP parameters of the given + * picture. (WAVE encoder only) + */ +typedef struct { + int picType; /**< A picture type of Nth picture in the custom GOP */ + int pocOffset; /**< A POC of Nth picture in the custom GOP */ + int picQp; /**< A quantization parameter of Nth picture in the custom + GOP */ + int numRefPicL0; + int refPocL0; /**< A POC of reference L0 of Nth picture in the custom + GOP */ + int refPocL1; /**< A POC of reference L1 of Nth picture in the custom + GOP */ + int temporalId; /**< A temporal ID of Nth picture in the custom GOP */ +} CustomGopPicParam; + +/** + * @brief This is a data structure for custom GOP parameters. (WAVE encoder + * only) + */ +typedef struct { + int customGopSize; /**< The size of custom GOP (0~8) */ + int useDeriveLambdaWeight; /**< It internally derives a lamda weight + instead of using the given lamda weight. + */ + CustomGopPicParam picParam[MAX_GOP_NUM]; /**< Picture parameters of Nth + picture in custom GOP */ + int gopPicLambda[MAX_GOP_NUM]; /**< A lamda weight of Nth picture in + custom GOP */ + int enTemporalLayerQp; /**< Enable QP setting of each temporal layers */ + int tidQp0; /**< Specifies a QP value of temporal layer 0 */ + int tidQp1; /**< Specifies a QP value of temporal layer 1 */ + int tidQp2; /**< Specifies a QP value of temporal layer 2 */ + int tidPeriod0; /**< Specifies the period of temporal layer 0 */ +} CustomGopParam; + +/** + * @brief This is a data structure for setting CTU level options (ROI, CTU + * mode, CTU QP) in H.265/HEVC encoder (WAVE4 encoder only). + */ +typedef struct { + int roiEnable; /**< It enables ROI map. NOTE: It is valid when rcEnable + is on. */ + int roiDeltaQp; /**< It specifies a delta QP that is used to calculate + ROI QPs internally. */ + int mapEndian; /**< It specifies endianness of ROI CTU map. For the + specific modes, refer to the EndianMode of + <>. */ + /** +@verbatim +It specifies the stride of CTU-level ROI/mode/QP map. It should be set with the +value as below. + + (Width + CTB_SIZE - 1) / CTB_SIZE +@endverbatim +*/ + int mapStride; + /** +@verbatim +The start buffer address of ROI map + +ROI map holds importance levels for CTUs within a picture. The memory size is +the number of CTUs of picture in bytes. For example, if there are 64 CTUs within +a picture, the size of ROI map is 64 bytes. All CTUs have their ROI importance +level (0 ~ 8 ; 1 byte) in raster order. A CTU with a high ROI importance level +is encoded with a lower QP for higher quality. It should be given when roiEnable +is 1. +@endverbatim +*/ + PhysicalAddress addrRoiCtuMap; + + /** +@verbatim + +The start buffer address of CTU mode map + +The memory size is the number of CTUs of picture in bytes. +For example if there are 64 CTUs within a picture, the size of CTU map is 64 bytes. +It should be given when ctuModeEnable is 1. + +The content of ctuModeMap directly is mapped to the coding mode which is used to encode the CTU. I.e, +if (ctuModeMap[k] is 2), it means that CTU(k) is encoded with force intra. + +@* 0 : Normal +@* 1 : CTU skip +@* 2 : Force intra +@endverbatim +*/ + PhysicalAddress addrCtuModeMap; + /* It enables CTU mode map that allows CTUs to be encoded with force intra or to be skipped. */ + int ctuModeEnable; + + /** +@verbatim + +The start buffer address of CTU qp map + +The memory size is the number of CTUs of picture in bytes. +For example if there are 64 CTUs within a picture, the size of CTU map is 64 +bytes. It should be given when ctuQpEnable is 1. + +The content of ctuQpMap directly is mapped to the QP used to encode the CTU. +I.e, if (ctuQpMap[k] is 5), it means that CTU(k) is encoded with QP 5. +@endverbatim +*/ + PhysicalAddress addrCtuQpMap; + /** +@verbatim +It enables CTU QP map that allows CTUs to be encoded with the given QPs. + +NOTE: rcEnable should be turned off for this, encoding with the given CTU QPs. + +@endverbatim +*/ + int ctuQpEnable; +} HevcCtuOptParam; + +/** + * @brief This is a data structure for setting custom map options in + * H.265/HEVC encoder. (WAVE5 encoder only). + */ +typedef struct { + int roiAvgQp; /**< It sets an average QP of ROI map. */ + int customRoiMapEnable; /**< It enables ROI map. */ + int customLambdaMapEnable; /**< It enables custom lambda map. */ + int customModeMapEnable; /**< It enables to force CTU to be encoded with + intra or to be skipped. */ + int customCoefDropEnable; /**< It enables to force all coefficients to + be zero after TQ or not for each CTU (to be + dropped).*/ + PhysicalAddress addrCustomMap; /**< The address of custom map */ +} HevcCustomMapOpt; + +/** + * @brief This is a data structure for setting VUI parameters in H.265/HEVC + * encoder. (WAVE only) + */ +typedef struct { + Uint32 vuiParamFlags; /**< It specifies vui_parameters_present_flag. */ + Uint32 vuiAspectRatioIdc; /**< It specifies aspect_ratio_idc. */ + Uint32 vuiSarSize; /**< It specifies sar_width and sar_height (only + valid when aspect_ratio_idc is equal to 255). */ + Uint32 vuiOverScanAppropriate; /**< It specifies + overscan_appropriate_flag. */ + Uint32 videoSignal; /**< It specifies video_signal_type_present_flag. */ + Uint32 vuiChromaSampleLoc; /**< It specifies + chroma_sample_loc_type_top_field and + chroma_sample_loc_type_bottom_field. */ + Uint32 vuiDispWinLeftRight; /**< It specifies def_disp_win_left_offset + and def_disp_win_right_offset. */ + Uint32 vuiDispWinTopBottom; /**< It specifies def_disp_win_top_offset + and def_disp_win_bottom_offset. */ +} HevcVuiParam; + +/** + * @brief This is a data structure for setting SEI NALs in H.265/HEVC + * encoder. + */ +typedef struct { + Uint32 prefixSeiNalEnable; /**< It enables to encode the prefix SEI NAL + which is given by HOST application. */ + Uint32 prefixSeiDataSize; /**< The total byte size of the prefix SEI */ + /** +@verbatim +A flag whether to encode PREFIX_SEI_DATA with a picture of this command or with +a source picture of the buffer at the moment + +@* 0 : encode PREFIX_SEI_DATA when the current input source picture is encoded. +@* 1 : encode PREFIX_SEI_DATA at this command. +@endverbatim +*/ + Uint32 prefixSeiDataEncOrder; + PhysicalAddress prefixSeiNalAddr; /**< The start address of the total + prefix SEI NALs to be encoded */ + + Uint32 suffixSeiNalEnable; /**< It enables to encode the suffix SEI NAL + which is given by HOST application. */ + Uint32 suffixSeiDataSize; /**< The total byte size of the suffix SEI */ + /** +@verbatim +A flag whether to encode SUFFIX_SEI_DATA with a picture of this command or with +a source picture of the buffer at the moment + +@* 0 : encode SUFFIX_SEI_DATA when the current input source picture is encoded. +@* 1 : encode SUFFIX_SEI_DATA at this command. +@endverbatim +*/ + Uint32 suffixSeiDataEncOrder; + PhysicalAddress suffixSeiNalAddr; /**< The start address of the total + suffix SEI NALs to be encoded */ +} HevcSEIDataEnc; + +/** + * @brief This is a data structure for H.265/HEVC encoder parameters. + */ +typedef struct { + /** +@verbatim +A profile indicator + +@* 1 : main +@* 2 : main10 +@endverbatim +*/ + int profile; + int level; /**< A level indicator (level * 10) */ + /** +@verbatim +A tier indicator + +@* 0 : Main +@* 1 : High +@endverbatim +*/ + int tier; + /** +@verbatim +A bit-depth (8bit or 10bit) which VPU internally uses for encoding + +VPU encodes with internalBitDepth instead of InputBitDepth. +For example, if InputBitDepth is 8 and InternalBitDepth is 10, +VPU converts the 8-bit source frames into 10-bit ones and then encodes them. + +@endverbatim +*/ + int internalBitDepth; + int chromaFormatIdc; /**< A chroma format indicator (0 for 4:2:0) */ + int losslessEnable; /**< It enables lossless coding. */ + int constIntraPredFlag; /**< It enables constrained intra prediction. */ + /** +@verbatim +A GOP structure preset option + +@* 0 : Custom GOP +@* Other values : <> +@endverbatim +*/ + int gopPresetIdx; + /** +@verbatim +The type of I picture to be inserted at every intraPeriod + +@* 0 : Non-IRAP +@* 1 : CRA +@* 2 : IDR +@endverbatim +*/ + int decodingRefreshType; + int intraQP; /**< A quantization parameter of intra picture */ + int intraPeriod; /**< A period of intra picture in GOP size */ + + int confWinTop; /**< A top offset of conformance window */ + int confWinBot; /**< A bottom offset of conformance window */ + int confWinLeft; /**< A left offset of conformance window */ + int confWinRight; /**< A right offset of conformance window */ + + /** +@verbatim +A slice mode for independent slice + +@* 0 : No multi-slice +@* 1 : Slice in CTU number +@endverbatim +*/ + int independSliceMode; + int independSliceModeArg; /**< The number of CTU for a slice when + independSliceMode is set with 1 */ + + /** +@verbatim +A slice mode for dependent slice + +@* 0 : No multi-slice +@* 1 : Slice in CTU number +@* 2 : Slice in number of byte +@endverbatim +*/ + int dependSliceMode; + int dependSliceModeArg; /**< The number of CTU or bytes for a slice when + dependSliceMode is set with 1 or 2 */ + + /** +@verbatim +An intra refresh mode + +@* 0 : No intra refresh +@* 1 : Row +@* 2 : Column +@* 3 : Step size in CTU +@endverbatim +*/ + int intraRefreshMode; + int intraRefreshArg; /**< The number of CTU (only valid when + intraRefreshMode is 3.) */ + + /** +@verbatim +It uses one of the recommended encoder parameter presets. + +@* 0 : Custom +@* 1 : Recommend encoder parameters (slow encoding speed, highest picture +quality) +@* 2 : Boost mode (normal encoding speed, moderate picture quality) +@* 3 : Fast mode (fast encoding speed, low picture quality) +@endverbatim +*/ + int useRecommendEncParam; + int scalingListEnable; /**< It enables a scaling list. */ + /** +@verbatim +It enables CU(Coding Unit) size to be used in encoding process. Host application +can also select multiple CU sizes. + +@* 3'b001 : 8x8 +@* 3'b010 : 16x16 +@* 3'b100 : 32x32 +@endverbatim +*/ + int cuSizeMode; + int tmvpEnable; /**< It enables temporal motion vector prediction. */ + int wppEnable; /**< It enables WPP (Wave-front Parallel Processing). WPP + is unsupported in ring buffer mode of bitstream + buffer. */ + int maxNumMerge; /**< Maximum number of merge candidates (0~2) */ + int dynamicMerge8x8Enable; /**< It enables dynamic merge 8x8 candidates. + */ + int dynamicMerge16x16Enable; /**< It enables dynamic merge 16x16 + candidates. */ + int dynamicMerge32x32Enable; /**< It enables dynamic merge 32x32 + candidates. */ + int disableDeblk; /**< It disables in-loop deblocking filtering. */ + int lfCrossSliceBoundaryEnable; /**< It enables filtering across slice + boundaries for in-loop deblocking. */ + int betaOffsetDiv2; /**< It enables BetaOffsetDiv2 for deblocking + filter. */ + int tcOffsetDiv2; /**< It enables TcOffsetDiv3 for deblocking filter. */ + int skipIntraTrans; /**< It enables transform skip for an intra CU. */ + int saoEnable; /**< It enables SAO (Sample Adaptive Offset). */ + int intraInInterSliceEnable; /**< It enables to make intra CUs in an + inter slice. */ + int intraNxNEnable; /**< It enables intra NxN PUs. */ + + int intraQpOffset; /**< It specifies an intra QP offset relative to an + inter QP. It is only valid when RateControl is + enabled. */ + /** +@verbatim +It specifies encoder initial delay. It is only valid when RateControl is +enabled. + + encoder initial delay = InitialDelay * InitBufLevelx8 / 8 + +@endverbatim +*/ + int initBufLevelx8; + /** +@verbatim +It specifies picture bits allocation mode. +It is only valid when RateControl is enabled and GOP size is larger than 1. + +@* 0 : More referenced pictures have better quality than less referenced +pictures. +@* 1 : All pictures in a GOP have similar image quality. +@* 2 : Each picture bits in a GOP is allocated according to FixedRatioN. +@endverbatim +*/ + int bitAllocMode; + /** +@verbatim +A fixed bit ratio (1 ~ 255) for each picture of GOP's bit +allocation + +@* N = 0 ~ (MAX_GOP_SIZE - 1) +@* MAX_GOP_SIZE = 8 + +For instance when MAX_GOP_SIZE is 3, FixedBitRatio0, FixedBitRatio1, and +FixedBitRatio2 can be set as 2, 1, and 1 repsectively for the fixed bit ratio +2:1:1. This is only valid when BitAllocMode is 2. + +@endverbatim +*/ + int fixedBitRatio[MAX_GOP_NUM]; + int cuLevelRCEnable; /**< It enable CU level rate control. */ + + int hvsQPEnable; /**< It enable CU QP adjustment for subjective quality + enhancement. */ + + int hvsQpScaleEnable; /**< It enable QP scaling factor for CU QP + adjustment when hvsQPEnable is 1. */ + int hvsQpScale; /**< A QP scaling factor for CU QP adjustment when + hvcQpenable is 1 */ + + int hvsMaxDeltaQp; /**< A maximum delta QP for HVS */ + + //int minQp; /**< A minimum QP for rate control */ + //int maxQp; /**< A maximum QP for rate control */ + int maxDeltaQp; /**< A maximum delta QP for rate control */ + + int transRate; /**< A peak transmission bitrate in bps */ + + // CUSTOM_GOP + CustomGopParam gopParam; /**< <> */ + HevcCtuOptParam ctuOptParam; /**< <> */ + HevcVuiParam vuiParam; /**< <> */ + + Uint32 numUnitsInTick; /**< It specifies the number of time units of a + clock operating at the frequency time_scale + Hz. */ + Uint32 timeScale; /**< It specifies the number of time units that pass + in one second. */ + Uint32 numTicksPocDiffOne; /**< It specifies the number of clock ticks + corresponding to a difference of picture + order count values equal to 1. */ + + int chromaCbQpOffset; /**< The value of chroma(Cb) QP offset (only for + WAVE420L) */ + int chromaCrQpOffset; /**< The value of chroma(Cr) QP offset (only for + WAVE420L) */ + + int initialRcQp; /**< The value of initial QP by HOST application. This + value is meaningless if INITIAL_RC_QP is 63. (only + for WAVE420L) */ + + Uint32 nrYEnable; /**< It enables noise reduction algorithm to Y + component. */ + Uint32 nrCbEnable; /**< It enables noise reduction algorithm to Cb + component. */ + Uint32 nrCrEnable; /**< It enables noise reduction algorithm to Cr + component. */ + Uint32 nrNoiseEstEnable; /**< It enables noise estimation for reduction. + When this is disabled, noise estimation is + carried out ouside VPU. */ + Uint32 nrNoiseSigmaY; /**< It specifies Y noise standard deviation if no + use of noise estimation (nrNoiseEstEnable is + 0). */ + Uint32 nrNoiseSigmaCb; /**< It specifies Cb noise standard deviation if + no use of noise estimation (nrNoiseEstEnable + is 0). */ + Uint32 nrNoiseSigmaCr; /**< It specifies Cr noise standard deviation if + no use of noise estimation (nrNoiseEstEnable + is 0). */ + + // ENC_NR_WEIGHT + Uint32 nrIntraWeightY; /**< A weight to Y noise level for intra picture + (0 ~ 31). nrIntraWeight/4 is multiplied to the + noise level that has been estimated. This + weight is put for intra frame to be filtered + more strongly or more weakly than just with + the estimated noise level. */ + Uint32 nrIntraWeightCb; /**< A weight to Cb noise level for intra + picture (0 ~ 31) */ + Uint32 nrIntraWeightCr; /**< A weight to Cr noise level for intra + picture (0 ~ 31) */ + Uint32 nrInterWeightY; /**< A weight to Y noise level for inter picture + (0 ~ 31). nrInterWeight/4 is multiplied to the + noise level that has been estimated. This + weight is put for inter frame to be filtered + more strongly or more weakly than just with + the estimated noise level. */ + Uint32 nrInterWeightCb; /**< A weight to Cb noise level for inter + picture (0 ~ 31) */ + Uint32 nrInterWeightCr; /**< A weight to Cr noise level for inter + picture (0 ~ 31) */ + + // ENC_INTRA_MIN_MAX_QP + //Uint32 intraMinQp; /**< It specifies a minimum QP for intra picture (0 ~ + // 51). It is only valid when RateControl is 1. */ + //Uint32 intraMaxQp; /**< It specifies a maximum QP for intra picture (0 ~ + // 51). It is only valid when RateControl is 1. */ + + Uint32 enableAFBCD; /**< It enables AFBCD function that is able to + receive AFBC(ARM Frame Buffer Compression) format + stream as source input and decode them. */ + Uint32 useLongTerm; /**< It enables long-term reference function. */ + int forcedIdrHeaderEnable; /**< It enables every IDR frame to include + VPS/SPS/PPS. */ + + // newly added for WAVE520 + //#ifdef WAVE520 + Uint32 monochromeEnable; + Uint32 strongIntraSmoothEnable; + + Uint32 weightPredEnable; + Uint32 bgDetectEnable; + Uint32 bgThrDiff; + Uint32 bgThrMeanDiff; + Uint32 bgLambdaQp; + int bgDeltaQp; + Uint32 tileNumCols; + Uint32 tileNumRows; + Uint32 tileUniformSpaceEnable; + + Uint32 customLambdaEnable; + Uint32 customMDEnable; + int pu04DeltaRate; + int pu08DeltaRate; + int pu16DeltaRate; + int pu32DeltaRate; + int pu04IntraPlanarDeltaRate; + int pu04IntraDcDeltaRate; + int pu04IntraAngleDeltaRate; + int pu08IntraPlanarDeltaRate; + int pu08IntraDcDeltaRate; + int pu08IntraAngleDeltaRate; + int pu16IntraPlanarDeltaRate; + int pu16IntraDcDeltaRate; + int pu16IntraAngleDeltaRate; + int pu32IntraPlanarDeltaRate; + int pu32IntraDcDeltaRate; + int pu32IntraAngleDeltaRate; + int cu08IntraDeltaRate; + int cu08InterDeltaRate; + int cu08MergeDeltaRate; + int cu16IntraDeltaRate; + int cu16InterDeltaRate; + int cu16MergeDeltaRate; + int cu32IntraDeltaRate; + int cu32InterDeltaRate; + int cu32MergeDeltaRate; + int coefClearDisable; + int minQpI; /**< A minimum QP of I picture for rate control */ + int maxQpI; /**< A maximum QP of I picture for rate control */ + int minQpP; /**< A minimum QP of P picture for rate control */ + int maxQpP; /**< A maximum QP of P picture for rate control */ + int minQpB; /**< A minimum QP of B picture for rate control */ + int maxQpB; /**< A maximum QP of B picture for rate control */ + PhysicalAddress customLambdaAddr; + PhysicalAddress userScalingListAddr; + //#endif + + // for H.264 on WAVE + int avcIdrPeriod; /**< A period of IDR picture (0 ~ 1024). 0 - implies + an infinite period */ + int rdoSkip; /**< It skips RDO(rate distortion optimization). */ + int lambdaScalingEnable; /**< It enables lambda scaling using custom + GOP. */ + int transform8x8Enable; /**< It enables 8x8 intra prediction and 8x8 + transform. */ + /** +@verbatim +A slice mode for independent slice + +@* 0 : no multi-slice +@* 1 : slice in MB number +@endverbatim +*/ + int avcSliceMode; + int avcSliceArg; /**< The number of MB for a slice when avcSliceMode is + set with 1 */ + /** +@verbatim +An intra refresh mode + +@* 0 : no intra refresh +@* 1 : row +@* 2 : column +@* 3 : step size in CTU + +@endverbatim +*/ + int intraMbRefreshMode; + /** +@verbatim +It Specifies an intra MB refresh interval. Depending on intraMbRefreshMode, +it can mean one of the followings. + +@* The number of consecutive MB rows for intraMbRefreshMode of 1 +@* The number of consecutive MB columns for intraMbRefreshMode of 2 +@* A step size in MB for intraMbRefreshMode of 3 + +@endverbatim +*/ + int intraMbRefreshArg; + int mbLevelRcEnable; /**< It enables MB-level rate control. */ + /** +@verbatim +It selects the entropy coding mode used in encoding process. + +0 : CAVLC +1 : CABAC + +@endverbatim +*/ + int entropyCodingMode; + + int s2fmeDisable; /**< It disables s2me_fme (only for AVC encoder). */ + + Uint32 rcWeightParam; /**< Adjusts the speed of updating parameters to + the rate control model. If RcWeightFactor is + set with a large value, the RC parameters are + updated slowly. (Min: 1, Max: 31)*/ + Uint32 rcWeightBuf; /**< It is the smoothing factor in the estimation. + (Min: 1, Max: 255) This parameter indicates the + speed of adjusting bitrate toward fullness of + buffer as a reaction parameter. As it becomess + larger, the bit-rate error promptly affects the + target bit allocation of the following picture. + */ + +#ifdef SUPPORT_HOST_RC_PARAM + int hostPicRCEnable; /**< It enable host RC. Picture QP and picture target bit can be set by host.*/ +#endif +} EncHevcParam; + +/** + * @brief This is an enumeration for encoder parameter change. (WAVE4 encoder + * only) + */ +typedef enum { + // COMMON parameters + ENC_PIC_PARAM_CHANGE = (1 << 1), + ENC_INTRA_PARAM_CHANGE = (1 << 3), + ENC_CONF_WIN_TOP_BOT_CHANGE = (1 << 4), + ENC_CONF_WIN_LEFT_RIGHT_CHANGE = (1 << 5), + ENC_FRAME_RATE_CHANGE = (1 << 6), + ENC_INDEPENDENT_SLICE_CHANGE = (1 << 7), + ENC_DEPENDENT_SLICE_CHANGE = (1 << 8), + ENC_INTRA_REFRESH_CHANGE = (1 << 9), + ENC_PARAM_CHANGE = (1 << 10), + ENC_RC_INIT_QP = (1 << 11), + ENC_RC_PARAM_CHANGE = (1 << 12), + ENC_RC_MIN_MAX_QP_CHANGE = (1 << 13), + ENC_RC_TARGET_RATE_LAYER_0_3_CHANGE = (1 << 14), + ENC_RC_TARGET_RATE_LAYER_4_7_CHANGE = (1 << 15), + ENC_RC_INTRA_MIN_MAX_QP_CHANGE = (1 << 16), + ENC_NUM_UNITS_IN_TICK_CHANGE = (1 << 18), + ENC_TIME_SCALE_CHANGE = (1 << 19), + ENC_RC_TRANS_RATE_CHANGE = (1 << 21), + ENC_RC_TARGET_RATE_CHANGE = (1 << 22), + ENC_ROT_PARAM_CHANGE = (1 << 23), + ENC_NR_PARAM_CHANGE = (1 << 25), + ENC_NR_WEIGHT_CHANGE = (1 << 26), + ENC_CHANGE_SET_PARAM_ALL = (0xFFFFFFFF), +} ChangeCommonParam; + +/** + * @brief This is an enumeration for encoder parameter change. (WAVE5 encoder + * only) + */ +typedef enum { + // COMMON parameters which are changed frame by frame. + ENC_SET_PPS_PARAM_CHANGE = (1 << 1), + ENC_SET_RC_FRAMERATE_CHANGE = (1 << 4), + ENC_SET_INDEPEND_SLICE_CHANGE = (1 << 5), + ENC_SET_DEPEND_SLICE_CHANGE = (1 << 6), + ENC_SET_RDO_PARAM_CHANGE = (1 << 8), + ENC_SET_RC_TARGET_RATE_CHANGE = (1 << 9), + ENC_SET_RC_PARAM_CHANGE = (1 << 10), + ENC_SET_RC_MIN_MAX_QP_CHANGE = (1 << 11), + ENC_SET_RC_BIT_RATIO_LAYER_CHANGE = (1 << 12), + ENC_SET_BG_PARAM_CHANGE = (1 << 18), + ENC_SET_CUSTOM_MD_CHANGE = (1 << 19), +} Wave5ChangeParam; + +/** + * @brief This is a data structure for encoding parameters that have changed. + */ +typedef struct { + /** +@verbatim + +@* 0 : changes the COMMON parameters. +@* 1 : Reserved +@endverbatim +*/ + int changeParaMode; + int enable_option; /**< <> */ + + // ENC_PIC_PARAM_CHANGE + int losslessEnable; /**< It enables lossless coding. */ + int constIntraPredFlag; /**< It enables constrained intra prediction. */ + int chromaCbQpOffset; /**< The value of chroma(Cb) QP offset (only for + WAVE420L) */ + int chromaCrQpOffset; /**< The value of chroma(Cr) QP offset (only for + WAVE420L) */ + + // ENC_INTRA_PARAM_CHANGE + /** +@verbatim +The type of I picture to be inserted at every intraPeriod + +@* 0 : Non-IRAP +@* 1 : CRA +@* 2 : IDR +@endverbatim +*/ + int decodingRefreshType; + int intraPeriod; /**< A period of intra picture in GOP size */ + int intraQP; /**< A quantization parameter of intra picture */ + + // ENC_CONF_WIN_TOP_BOT_CHANGE + int confWinTop; /**< A top offset of conformance window */ + int confWinBot; /**< A bottom offset of conformance window */ + + // ENC_CONF_WIN_LEFT_RIGHT_CHANGE + int confWinLeft; /**< A left offset of conformance window */ + int confWinRight; /**< A right offset of conformance window */ + + // ENC_FRAME_RATE_CHANGE + int frameRate; /**< A frame rate indicator ( x 1024) */ + + // ENC_INDEPENDENT_SLICE_CHANGE + /** +@verbatim +A slice mode for independent slice + +@* 0 : no multi-slice +@* 1 : Slice in CTU number +@endverbatim +*/ + int independSliceMode; + int independSliceModeArg; /**< The number of CTU for a slice when + independSliceMode is set with 1 */ + + // ENC_DEPENDENT_SLICE_CHANGE + /** +@verbatim +A slice mode for dependent slice + +@* 0 : no multi-slice +@* 1 : Slice in CTU number +@* 2 : Slice in number of byte +@endverbatim +*/ + int dependSliceMode; + int dependSliceModeArg; /**< The number of CTU or bytes for a slice when + dependSliceMode is set with 1 or 2 */ + + // ENC_INTRA_REFRESH_CHANGE + /** +@verbatim +An intra refresh mode + +@* 0 : No intra refresh +@* 1 : Row +@* 2 : Column +@* 3 : Step size in CTU +@endverbatim +*/ + int intraRefreshMode; + int intraRefreshArg; /**< The number of CTU (only valid when + intraRefreshMode is 3.) */ + + // ENC_PARAM_CHANGE + /** +@verbatim +It uses a recommended ENC_PARAM setting. + +@* 0 : Custom +@* 1 : Recommended ENC_PARAM +@* 2 ~ 3 : Reserved +@endverbatim +*/ + int useRecommendEncParam; + int scalingListEnable; /**< It enables a scaling list. */ + /** +@verbatim +It enables CU(Coding Unit) size to be used in encoding process. Host application +can also select multiple CU sizes. + +@* 0 : 8x8 +@* 1 : 16x16 +@* 2 : 32x32 +@endverbatim +*/ + int cuSizeMode; + int tmvpEnable; /**< It enables temporal motion vector prediction. */ + int wppEnable; /**< It enables WPP (Wave-front Parallel Processing). WPP + is unsupported in ring buffer mode of bitstream + buffer. */ + int maxNumMerge; /**< Maximum number of merge candidates (0~2) */ + int dynamicMerge8x8Enable; /**< It enables dynamic merge 8x8 candidates. + */ + int dynamicMerge16x16Enable; /**< It enables dynamic merge 16x16 + candidates. */ + int dynamicMerge32x32Enable; /**< It enables dynamic merge 32x32 + candidates. */ + int disableDeblk; /**< It disables in-loop deblocking filtering. */ + int lfCrossSliceBoundaryEnable; /**< It enables filtering across slice + boundaries for in-loop deblocking. */ + int betaOffsetDiv2; /**< It enables BetaOffsetDiv2 for deblocking + filter. */ + int tcOffsetDiv2; /**< It enables TcOffsetDiv3 for deblocking filter. */ + int skipIntraTrans; /**< It enables transform skip for an intra CU. */ + int saoEnable; /**< It enables SAO (Sample Adaptive Offset). */ + int intraInInterSliceEnable; /**< It enables to make intra CUs in an + inter slice. */ + int intraNxNEnable; /**< It enables intra NxN PUs. */ +#ifdef SUPPORT_HOST_RC_PARAM + int hostPicRCEnable; /**< It enable host RC. Picture QP and picture target bit can be set by host.*/ +#endif + + // ENC_RC_PARAM_CHANGE + /** +@verbatim +@* WAVE420 +@** 0 : Rate control is off. +@** 1 : Rate control is on. + +@* CODA9 +@** 0 : Constant QP (VBR, rate control off) +@** 1 : Constant Bit-Rate (CBR) +@** 2 : Average Bit-Rate (ABR) +@** 4 : Picture level rate control +@endverbatim +*/ + int rcEnable; + int intraQpOffset; /**< It specifies an intra QP offset relative to an + inter QP. It is only valid when RateControl is + enabled. */ + /** +@verbatim +It specifies encoder initial delay. It is only valid when RateControl is +enabled. + + encoder initial delay = InitialDelay * InitBufLevelx8 / 8 + +@endverbatim +*/ + int initBufLevelx8; + /** +@verbatim +It specifies picture bits allocation mode. +It is only valid when RateControl is enabled and GOP size is larger than 1. + +@* 0 : More referenced pictures have better quality than less referenced +pictures +@* 1 : All pictures in a GOP have similar image quality +@* 2 : Each picture bits in a GOP is allocated according to FixedRatioN +@endverbatim +*/ + int bitAllocMode; + /** +@verbatim +A fixed bit ratio (1 ~ 255) for each picture of GOP's bit +allocation + +@* N = 0 ~ (MAX_GOP_SIZE - 1) +@* MAX_GOP_SIZE = 8 + +For instance when MAX_GOP_SIZE is 3, FixedBitRatio0, FixedBitRatio1, and +FixedBitRatio2 can be set as 2, 1, and 1 repsectively for the fixed bit ratio +2:1:1. This is only valid when BitAllocMode is 2. +@endverbatim +*/ + int fixedBitRatio[MAX_GOP_NUM]; + + int cuLevelRCEnable; /**< It enables CU level rate control. */ + int hvsQPEnable; /**< It enables CU QP adjustment for subjective quality + enhancement. */ + int hvsQpScaleEnable; /**< It enables QP scaling factor for CU QP + adjustment when hvsQPEnable is 1. */ + int hvsQpScale; /**< QP scaling factor for CU QP adjustment when + hvcQpenable is 1. */ + int initialDelay; /**< An initial cpb delay in msec */ + Uint32 initialRcQp; /**< The value of initial QP by HOST application. + This value is meaningless if INITIAL_RC_QP is 63. + (only for WAVE420L) */ + + // ENC_RC_MIN_MAX_QP_CHANGE + int minQp; /**< Minimum QP for rate control */ + int maxQp; /**< Maximum QP for rate control */ + int maxDeltaQp; /**< Maximum delta QP for rate control */ + + // ENC_TARGET_RATE_CHANGE + int bitRate; /**< A target bitrate when separateBitrateEnable is 0 */ + + // ENC_TRANS_RATE_CHANGE + int transRate; /**< A peak transmission bitrate in bps */ + + // ENC_RC_INTRA_MIN_MAX_CHANGE + int intraMaxQp; /**< It specifies a maximum QP for intra picture (0 ~ + 51). It is only valid when RateControl is 1. */ + int intraMinQp; /**< It specifies a minimum QP for intra picture (0 ~ + 51). It is only valid when RateControl is 1. */ + + // ENC_ROT_PARAM_CHANGE + int rotEnable; /**< It enables or disable rotation. */ + /** +@verbatim +@* [1:0] 90 degree left rotate +@** 1=90' +@** 2=180' +@** 3=270' +@* [2] vertical mirror +@* [3] horizontal mirror +@endverbatim +*/ + int rotMode; + + // ENC_NR_PARAM_CHANGE + Uint32 nrYEnable; /**< It enables noise reduction algorithm to Y + component. */ + Uint32 nrCbEnable; /**< It enables noise reduction algorithm to Cb + component. */ + Uint32 nrCrEnable; /**< It enables noise reduction algorithm to Cr + component. */ + Uint32 nrNoiseEstEnable; /**< It enables noise estimation for reduction. + When this is disabled, noise estimation is + carried out ouside VPU. */ + Uint32 nrNoiseSigmaY; /**< It specifies Y noise standard deviation if no + use of noise estimation (nrNoiseEstEnable is + 0). */ + Uint32 nrNoiseSigmaCb; /**< It specifies Cb noise standard deviation if + no use of noise estimation (nrNoiseEstEnable + is 0). */ + Uint32 nrNoiseSigmaCr; /**< It specifies Cr noise standard deviation if + no use of noise estimation (nrNoiseEstEnable + is 0). */ + + // ENC_NR_WEIGHT_CHANGE + Uint32 nrIntraWeightY; /**< A weight to Y noise level for intra picture + (0 ~ 31). nrIntraWeight/4 is multiplied to the + noise level that has been estimated. This + weight is put for intra frame to be filtered + more strongly or more weakly than just with + the estimated noise level. */ + Uint32 nrIntraWeightCb; /**< A weight to Cb noise level for intra + picture (0 ~ 31).*/ + Uint32 nrIntraWeightCr; /**< A weight to Cr noise level for intra + picture (0 ~ 31).*/ + Uint32 nrInterWeightY; /**< A weight to Y noise level for inter picture + (0 ~ 31). nrInterWeight/4 is multiplied to the + noise level that has been estimated. This + weight is put for inter frame to be filtered + more strongly or more weakly than just with + the estimated noise level. */ + Uint32 nrInterWeightCb; /**< A weight to Cb noise level for inter + picture (0 ~ 31).*/ + Uint32 nrInterWeightCr; /**< A weight to Cr noise level for inter + picture (0 ~ 31).*/ + + // ENC_NUM_UNITS_IN_TICK_CHANGE + Uint32 numUnitsInTick; /**< It specifies the number of time units of a + clock operating at the frequency time_scale + Hz. */ + + // ENC_TIME_SCALE_CHANGE + Uint32 timeScale; /**< It specifies the number of time units that pass + in one second. */ + + // belows are only for WAVE5 encoder + Uint32 numTicksPocDiffOne; + Uint32 monochromeEnable; + Uint32 strongIntraSmoothEnable; + Uint32 weightPredEnable; + Uint32 bgDetectEnable; + Uint32 bgThrDiff; + Uint32 bgThrMeanDiff; + Uint32 bgLambdaQp; + int bgDeltaQp; + Uint32 customLambdaEnable; + Uint32 customMDEnable; + int pu04DeltaRate; + int pu08DeltaRate; + int pu16DeltaRate; + int pu32DeltaRate; + int pu04IntraPlanarDeltaRate; + int pu04IntraDcDeltaRate; + int pu04IntraAngleDeltaRate; + int pu08IntraPlanarDeltaRate; + int pu08IntraDcDeltaRate; + int pu08IntraAngleDeltaRate; + int pu16IntraPlanarDeltaRate; + int pu16IntraDcDeltaRate; + int pu16IntraAngleDeltaRate; + int pu32IntraPlanarDeltaRate; + int pu32IntraDcDeltaRate; + int pu32IntraAngleDeltaRate; + int cu08IntraDeltaRate; + int cu08InterDeltaRate; + int cu08MergeDeltaRate; + int cu16IntraDeltaRate; + int cu16InterDeltaRate; + int cu16MergeDeltaRate; + int cu32IntraDeltaRate; + int cu32InterDeltaRate; + int cu32MergeDeltaRate; + int coefClearDisable; + int seqRoiEnable; +} EncChangeParam; + +/** + * @brief This is a data structure for configuring PPS information at + * H.264/AVC. + */ +typedef struct { + int ppsId; /**< H.264 picture_parameter_set_id in PPS. This shall be in + the range of 0 to 255, inclusive. */ + /** +@verbatim +It selects the entropy coding method used in the encoding process. + +@* 0 : CAVLC +@* 1 : CABAC +@* 2 : CAVLC/CABAC select according to PicType +@endverbatim +*/ + int entropyCodingMode; + int cabacInitIdc; /**< It specifies the index for determining the + initialization table used in the initialisation + process for CABAC. The value of cabac_init_idc + shall be in the range of 0 ~ 2. */ + /** +@verbatim +It specifies whether to enable 8x8 intra prediction and 8x8 transform or not. + +@* 0 : disable 8x8 intra and 8x8 transform (BP) +@* 1 : enable 8x8 intra and 8x8 transform (HP) +@endverbatim +*/ + int transform8x8Mode; +} AvcPpsParam; + +/** + * @brief This is a data structure for configuring H.264/AVC-specific + * parameters in encoder applications. + */ +typedef struct { + /** +@verbatim +@* 0 : disable +@* 1 : enable +@endverbatim +*/ + int constrainedIntraPredFlag; + /** +@verbatim +@* 0 : enable +@* 1 : disable +@* 2 : disable deblocking filter at slice boundaries +@endverbatim +*/ + int disableDeblk; + int deblkFilterOffsetAlpha; /**< deblk_filter_offset_alpha (-6 - 6) */ + int deblkFilterOffsetBeta; /**< deblk_filter_offset_beta (-6 - 6) */ + int chromaQpOffset; /**< chroma_qp_offset (-12 - 12) */ + /** +@verbatim +@* 0 : disable +@* 1 : enable + +If this is 1, the encoder generates AUD RBSP at the start of every picture. +@endverbatim +*/ + int audEnable; + /** +@verbatim +@* 0 : disable +@* 1 : enable + +If this is 1, the encoder generates frame_cropping_flag syntax at the SPS +header. +@endverbatim +*/ + int frameCroppingFlag; + int frameCropLeft; /**< The sample number of left cropping region in a + line. See the frame_crop_left_offset syntax in + AVC/H.264 SPS tabular form. The least significant + bit of this parameter should be always zero. */ + int frameCropRight; /**< The sample number of right cropping region in a + line. See the frame_crop_right_offset syntax in + AVC/H.264 SPS tabular form. The least significant + bit of this parameter should be always zero. */ + int frameCropTop; /**< The sample number of top cropping region in a + picture column. See the frame_crop_top_offset + syntax in AVC/H.264 SPS tabular form. The least + significant bit of this parameter should be always + zero. */ + int frameCropBottom; /**< The sample number of bottom cropping region in + a picture column. See the + frame_crop_bottom_offset syntax in AVC/H.264 SPS + tabular form. The least significant bit of this + parameter should be always zero. */ + + int mvcExtension; /**< MVC extension */ + int interviewEn; /**< MVC extension */ + int parasetRefreshEn; /**< MVC extension */ + int prefixNalEn; /**< MVC extension */ + int svcExtension; /**< SVC extension */ + + int level; /**< H.264/AVC level_idc in SPS */ + /** +@verbatim +H.264 profile_idc parameter is derived from each coding tool usage. + +@* 0 : Baseline profile +@* 1 : Main profile +@* 2 : High profile +@endverbatim +*/ + int profile; + // [START] CODA980 & WAVE320 + /** +@verbatim +It selects the encoding type, progressive or interlaced. + +@* 0 : Progressive frame encoding. +@* 1 : Interlaced field encoding. +@endverbatim +*/ + int fieldFlag; + /** +@verbatim +Reference mode for interlaced field encoding(avc_field_flag is 1). + +@* 0 : Same parity field referencing +@* 1 : Opposite parity field referencing +@endverbatim +*/ + int fieldRefMode; + /** +@verbatim +It specifies type of chroma format. + +@* 0 : YUV 420 format +@* 1 : YUV 400 monochrome format +@endverbatim +*/ + int chromaFormat400; + int ppsNum; /**< Number of PPS. If a PPS has the same pps_id, the last + PPS is available. */ + + AvcPpsParam ppsParam[MAX_ENC_PPS_NUM]; + // [END] CODA980 & WAVE320 +} EncAvcParam; + +/** + * @brief This structure is used for declaring an encoder slice mode and its + * options. It is newly added for more flexible usage of slice mode control in + * encoder. + */ +typedef struct { + /** +@verbatim +@* 0 : one slice per picture +@* 1 : multiple slices per picture +@* 2 : multiple slice encoding mode 2 for H.264 only. + +In normal MPEG4 mode, resync-marker and packet header are inserted between +slice boundaries. In short video header with Annex K of 0, GOB headers are +inserted at every GOB layer start. In short video header with Annex K of 1, +multiple slices are generated. In AVC mode, multiple slice layer RBSP is +generated. +@endverbatim +*/ + int sliceMode; + /** +@verbatim +This parameter means the size of generated slice when sliceMode of 1. + +@* 0 : sliceSize is defined by the amount of bits +@* 1 : sliceSize is defined by the number of MBs in a slice +@* 2 : sliceSize is defined by MBs run-length table (only for H.264) + +This parameter is ignored when sliceMode of 0 or +in short video header mode with Annex K of 0. +@endverbatim +*/ + int sliceSizeMode; + int sliceSize; /**< The size of a slice in bits or in MB numbers + included in a slice, which is specified by the + variable, sliceSizeMode. This parameter is ignored + when sliceMode is 0 or in short video header mode with + Annex K of 0. */ +} EncSliceMode; + +/** + * @brief This data structure is used when HOST wants to change min/max QP + * values. + */ +typedef struct { + int maxQpIEnable; /**< A maximum QP enable flag for I picture */ + int maxQpI; /**< A maximum QP of I picture for rate control */ + int minQpIEnable; /**< A minimum QP enable flag for I picture */ + int minQpI; /**< A minimum QP of I picture for rate control */ + int maxQpPEnable; /**< A maximum QP enable flag for P picture */ + int maxQpP; /**< A maximum QP of P picture for rate control */ + int minQpPEnable; /**< A minimum QP enable flag for P picture */ + int minQpP; /**< A minimum QP of P picture for rate control */ +} MinMaxQpChangeParam; + +#ifdef RC_PIC_PARACHANGE +/** + * @brief This data structure is used when HOST wants to change picture level + * parameter values. + */ +typedef struct { + int MaxdeltaQp; /**< A maximum delta QP for HVS */ + int MindeltaQp; /**< A minimum delta QP for HVS */ + int HvsQpScaleDiv2; /**< It specifies the scale for MB QP derivation. It + is only avilable when EN_HVS_QP is 1. */ + int EnHvsQp; /**< It enables HVS QP. */ + int EnRowLevelRc; /**< It enables row-level rate control. */ + int RcHvsMaxDeltaQp; /**< A maximum delta QP value for HVS considered + rate control */ + int Gamma; + int GammaEn; + /** +@verbatim +Time delay in mili-seconds (CODA9 only) + +It is the amount of time in ms taken for bitstream to reach initial occupancy of +the vbv buffer from zero level. + +This value is ignored if rate +control is disabled. The value 0 means VPU does not check for reference +decoder buffer delay constraints. +@endverbatim +*/ + int RcInitDelay; + int SetDqpNum; /**< It is the number of cyclic pictures.*/ + int dqp[8]; /**< A delta QP value of frame# within the cyclic pictures + */ + /** +@verbatim +An initial QP offset for I picture in GOP (CODA980 only) + +rcGopIQpOffset (-4 to 4) is added to an I picture QP value. +This value is valid for H.264/AVC encoder and ignored when RcEnable is 0 or +RcGopIQpOffsetEn is 0. +@endverbatim +*/ + int RcGopIQpOffset; + /** +@verbatim +An enable flag for initial QP offset for I picture in GOP. (CODA980 only) + +@* 0 : disable (default) +@* 1 : enable + +This value is valid for H.264/AVC encoder and ignored when RcEnable is 0. +@endverbatim +*/ + int RcGopIQpOffsetEn; +#ifdef AUTO_FRM_SKIP_DROP + int EnAutoFrmSkip; /**< It enables frame skip automatically according to + threshold */ + int EnAuToFrmDrop; /**< It enables frame drop automatically according to + threshold */ + int VbvThreshold; /**< Vbv buffer threshold value */ + int QpThreshold; /**< Qp buffer threshold value */ + int MaxContinuousFrameSkipNum; /**< The maximum number of continuous + frame(s) to skip */ + int MaxContinuousFrameDropNum; /**< The maximum number of confinuous + frame(s) to drop */ +#endif + int rcWeightFactor; /**< Adjusts the speed of updating parameters to the + rate control model. If RcWeightFactor is set with + a large value, the RC parameters are updated + slowly. (Min: 1, Max: 32, default: 2) */ +} ChangePicParam; +#endif + +/** + * @brief This data structure is used when HOST wants to apply new RC + * parameters. + */ +typedef struct { + char pchChangeCfgFileName[1024]; /**< Encoder configuration file name */ + int ChangeFrameNum; /**< A frame number to start applying parameter + change */ + int paraEnable; /**< An enable flag for each parameter change */ + + int NewGopNum; /**< A new encode GOP number */ + // int NewIntraQpEn; + int NewIntraQp; /**< A new quantized step parameter of intra frame + picture for encoding process.*/ + int NewBitrate; /**< A new target bit rate in kilo bit per seconds + (kbps) */ + int NewFrameRate; /**< A new frame rate */ + int NewIntraRefresh; /**< A new intra MB refresh number */ + MinMaxQpChangeParam minMaxQpParam; /**< <> + for Min/Max Qp change */ +#ifdef RC_PIC_PARACHANGE + ChangePicParam changePicParam; /**< <> */ +#endif +} ParamChange; + +/** + * @brief This data structure is used when HOST wants to open a new encoder + * instance. + */ +typedef struct { + PhysicalAddress bitstreamBuffer; /**< The start address of bitstream + buffer into which encoder puts + bitstream. This address must be + aligned to AXI bus width. */ + Uint32 bitstreamBufferSize; /**< The size of the buffer in bytes pointed + by bitstreamBuffer. This value must be a + multiple of 1024. The maximum size is + 16383 x 1024 bytes. */ + CodStd bitstreamFormat; /**< The standard type of bitstream in encoder + operation. It is one of STD_MPEG4, STD_H263, + STD_AVC and STD_MJPG. */ + /** +@verbatim +@* 0 : disable +@* 1 : enable + +This flag declares the streaming mode for the current encoder instance. Two +streaming modes, packet-based streaming with ring-buffer (buffer-reset mode) and +frame-based streaming with line buffer (buffer-flush mode), can be configured by +using this flag. + +When this field is set, packet-based streaming with ring-buffer is used. +And when this field is not set, frame-based streaming with line-buffer is used. + +@endverbatim +*/ + int ringBufferEnable; + int picWidth; /**< The width of a picture to be encoded in pixels. */ + int picHeight; /**< The height of a picture to be encoded in pixels. */ + /** +@verbatim +It is a linear to tiled enable mode. +The map type can be changed from linear to tiled format while reading source +frame in the PrP (Pre-Processing) unit. + +@* 0 : disable linear to tiled-map conversion for getting source image +@* 1 : enable linear to tiled-map conversion for getting source image +@endverbatim +*/ + int linear2TiledEnable; + /** +@verbatim +It can specify the map type of source frame buffer when linear2TiledEnable is +enabled. (CODA980 only) + +@* 1 : source frame buffer is in linear frame map. +@* 2 : source frame buffer is in linear field map. + +@endverbatim +*/ + int linear2TiledMode; + /** +@verbatim +The 16 LSB bits, [15:0], is a numerator and 16 MSB bits, [31:16], is a +denominator for calculating frame rate. The numerator means clock ticks per +second, and the denominator is clock ticks between frames minus 1. + +So the frame rate can be defined by (numerator/(denominator + 1)), +which equals to (frameRateInfo & 0xffff) /((frameRateInfo >> 16) + 1). + +For example, the value 30 of frameRateInfo represents 30 frames/sec, and the +value 0x3e87530 represents 29.97 frames/sec. +@endverbatim +*/ + int frameRateInfo; + /** +@verbatim +The horizontal search range mode for Motion Estimation + +@* 0 : Horizontal(-64 ~ 63) +@* 1 : Horizontal(-48 ~ 47) +@* 2 : Horizontal(-32 ~ 31) +@* 3 : Horizontal(-16 ~ 15) +@endverbatim +*/ + // [START] CODA980 & WAVE320 + int MESearchRangeX; + /** +@verbatim +The vertical search range mode for Motion Estimation + +@* 0 : Vertical(-48 ~ 47) +@* 1 : Vertical(-32 ~ 31) +@* 2 : Vertical(-16 ~ 15) +@endverbatim +*/ + int MESearchRangeY; + /** +@verbatim +An initial QP offset for I picture in GOP. + +This setting can lower an I picture QP value +down to a user-defined value ranging -4 to 4. +This value is valid for AvcEnc and ignored +when when RcEnable is 0 or RcGopIQpOff-setEn is 0. +@endverbatim +*/ + int rcGopIQpOffsetEn; + /** +@verbatim +An enable flag for initial QP offset for I picture in GOP. + +@* 0 : disable (default) +@* 1 : disable + +This value is valid for AvcEnc and ignored when when RcEnable is 0. +@endverbatim +*/ + int rcGopIQpOffset; + /** +@verbatim +The search range mode for Motion Estimation + +@* 0 : Horizontal(-128 ~ 127), Vertical(-64 ~ 63) +@* 1 : Horizontal(-64 ~ 63), Vertical(-32 ~ 31) +@* 2 : Horizontal(-32 ~ 31), Vertical(-16 ~ 15) +@* 3 : Horizontal(-16 ~ 15), Vertical(-16 ~ 15) +@endverbatim +*/ + int MESearchRange; + // [END] CODA980 & WAVE320 + /** +@verbatim +vbv_buffer_size in bits + +This value is ignored if rate control is disabled or +initialDelay is 0. The value 0 means the encoder does not check for reference +decoder buffer size constraints. +@endverbatim +*/ + // [START] CODA9xx & WAVE320 + int vbvBufferSize; + /** +@verbatim +Frame skip indicates that encoder can skip frame encoding automatically when +bitstream has been generated much so far considering the given target bitrate. +This parameter is ignored if rate control is not used (bitRate is 0). + +@* 0 : enables frame skip function in encoder. +@* 1 : disables frame skip function in encoder. +@endverbatim +*/ + int frameSkipDisable; + + /** +@verbatim +This is the GOP size. + +@* 0 : only first picture is I +@* 1 : all I pictures +@* 2 : IPIP... +@* 3 : IPPIPP... + +The maximum value is 32767, but in practice, a smaller value should be +chosen by HOST application for proper error concealment operations. This value +is ignored in case of STD_MJPG +@endverbatim +*/ + int gopSize; + /** +An interval of adding an IDR picture +*/ + int idrInterval; + /** +@verbatim +A block mode enable flag for Motion Estimation. (H.264/AVC only). +A HOST can use some combination (bitwise or-ing) of each value under below. + +@* 4'b0000 or 4'b1111 : Use all block mode +@* 4'b0001 : Enable 16x16 block mode +@* 4'b0010 : Enable 16x8 block mode +@* 4'b0100 : Enable 8x16 block mode +@* 4'b1000 : Enable 8x8 block mode +@endverbatim +*/ + int meBlkMode; + EncSliceMode sliceMode; /**< The parameter for slice mode */ + /** +@verbatim +@* 0 : intra MB refresh is not used. +@* Otherwise : at least N MBs in every P-frame is encoded as intra MBs. + +This value is ignored in case of STD_MJPG +@endverbatim +*/ + int intraRefresh; + /** +@verbatim +Consecutive intra MB refresh mode + +This option is valid only when IntraMbRefresh-Num[15:0] is not 0. + +@* 0 - ConscIntraRefreshEn is disabled. IntraMbRefreshNumnumber of MBs are +encoded as an intra MB at the defined interval by picture size. +@* 1 - IntraMbRefreshNumnumber of consec-utive MBs are encoded as an intra MB. +@endverbatim +*/ + int ConscIntraRefreshEnable; + /** +@verbatim +Intra MB count enable + +If it is enabled, VPU does not include intra MBs +from mode decision when counting IntraMbRefreshNum. This option is valid only +when IntraMbRefreshNum[15:0] is not 0. + +@* 0 - intra mb counting is disabled. +@* 1 - intra mb counting is enabled. +@endverbatim +*/ + int CountIntraMbEnable; + /** +@verbatim +Field sequence intra refresh enable + +This option is valid only when IntraMbRefresh-Num[15:0] is not 0 and interlaced +encoding. + +@* 0 - FieldSeqIntraRefreshEn is disabled. +@* 1 - Intra mb is sequentially refreshed at each +field. +@endverbatim +*/ + int FieldSeqIntraRefreshEnable; + /** +@verbatim +The maximum quantized step parameter for encoding process + +In MPEG4/H.263 mode, the maximum value is 31. +In H.264 mode, allowed maximum value is 51. +@endverbatim +*/ + int userQpMax; + + // h.264 only + int maxIntraSize; /**< The maximum bit size for intra frame or encoding + process. It works only in H.264/AVC encoder. */ + int userMaxDeltaQp; /**< The maximum delta QP for encoding process. It + works only in the H.264/AVC mode. */ + int userMinDeltaQp; /**< The minimum delta QP for encoding process. It + works only in the H.264/AVC mode. */ + int userQpMinI; /**< The minimum quantized step parameter for Intra + frame. (H.264/AVC only) */ + int userQpMinP; /**< The minimum quantized step parameter for Inter + frame. (H.264/AVC only) */ + int userQpMaxI; /**< The maximum quantized step parameter for Intra + frame. (H.264/AVC only) */ + int userQpMaxP; /**< The maximum quantized step parameter for Inter + frame. (H.264/AVC only) */ + /** +@verbatim +The PMV option for Motion Estimation. +If this field is 1, encoding quality could be worse than when it was zero. + +@* 0 : Motion Estimation engine uses PMV that was derived from neighbor MV +@* 1 : Motion Estimation engine uses Zero PMV +@endverbatim +*/ + int MEUseZeroPmv; + /** +@verbatim +Additional weight of intra cost for mode decision to reduce intra MB density + +By default, it could be zero. +If this register have some value W, +and the cost of best intra mode that was decided by Refine-Intra-Mode-Decision +is ICOST, the Final Intra Cost FIC is like below, + +FIC = ICOST + W + +So, if this field is not zero, +the Final Intra Cost have additional weight. Then the Intra/Inter mode decision +logic tend to make more Inter-Macroblock. +@endverbatim +*/ + int intraCostWeight; + /** +@verbatim +The quantization parameter for I frame + +When this value is -1, the quantization +parameter for I frames is automatically determined by VPU. This value is ignored +in case of STD_MJPG +@endverbatim +*/ + // mp4 only + int rcIntraQp; + /** +@verbatim +A gamma is a smoothing factor in motion estimation. A value for gamma is +factor * 32768, the factor value is selected from the range 0 ≤ factor +≥ 1. + +@* If the factor value getting close to 0, Qp changes slowly. +@* If the factor value getting close to 1, Qp changes quickly. + +The default gamma value is 0.75 * 32768 +@endverbatim +*/ + int userGamma; + /** +@verbatim +Encoder Rate Control Mode setting + +@* 0 : Normal mode rate control +@* 1 : FRAME_LEVEL rate control +@* 2 : SLICE_LEVEL rate control +@* 3 : USER DEFINED MB LEVEL rate control +@endverbatim +*/ + int rcIntervalMode; + /** +@verbatim +The user defined MB interval value + +This value is used only when rcIntervalMode is 3. +@endverbatim +*/ + int mbInterval; + /** +@verbatim +Target bit rate in kbps + +If 0, there is no rate control, and pictures are encoded with a quantization +parameter equal to quantParam in EncParam. +@endverbatim +*/ + // [END] CODA9xx & WAVE320 + int bitRate; // [WARNING] in kbit + /** +@verbatim +Time delay (in mili-seconds) + +It takes for the bitstream to reach initial occupancy of the vbv buffer from +zero level. + +This value is ignored if rate +control is disabled. The value 0 means the encoder does not check for reference +decoder buffer delay constraints. +@endverbatim +*/ + int initialDelay; + /** +@verbatim +@* WAVE420 +@** 0 : Rate control is off. +@** 1 : Rate control is on. + +@* CODA9 +@** 0 : Constant QP (VBR, rate control off) +@** 1 : Constant Bit-Rate (CBR) +@** 2 : Average Bit-Rate (ABR) +@** 4 : Picture level rate control +@endverbatim +*/ + int rcEnable; + + union { + EncMp4Param mp4Param; /**< The parameters for MPEG4 part 2 + Visual */ + EncH263Param h263Param; /**< The parameters for ITU-T H.263 */ + EncAvcParam avcParam; /**< The parameters for ITU-T H.263 */ + EncHevcParam hevcParam; /**< The parameters for ITU-T H.265/HEVC + */ + } EncStdParam; + + // Maverick-II Cache Configuration + /** +@verbatim +Enable or disable frame buffer cache + +@* 0 : ME/MC CACHE +@* 1 : ME BYPASS/MC CACHE +@* 2 : MC BYPASS/ME CACHE +@* 3 : ME/MC BYPASS +@endverbatim +*/ + int frameCacheBypass; + /** +@verbatim +Cache burst value + +@* 0 : Burst 4 +@* 1 : Burst 8 +@endverbatim +*/ + int frameCacheBurst; + /** +@verbatim +@* 0 : Horizontal no merge +@* 1 : Horizontal merge +@* 2 : Vertical no merge +@* 3 : Vertical merge +@endverbatim +*/ + int frameCacheMerge; + /** +@verbatim +Cache way size of luma and chroma. +This value range is from 0 to 15. + +[0-15] {chroma[1:0], luma[1:0]} + +@* Luma [0,1 : 64x64, 2,3 : 128x32] +@* Chroma Separated [0,1: 32x32, 2,3: 64x16] +@* Chroma Interleaved [0,1: 32x64, 2: 64x32, 3: 128x16] +@endverbatim +*/ + int frameCacheWayShape; + /** +@verbatim +@* 0 : CbCr data is written in separate frame memories (chroma separate mode) +@* 1 : CbCr data is interleaved in chroma memory. (chroma interleave mode) +@endverbatim +*/ + int cbcrInterleave; + /** +@verbatim +CbCr order in planar mode (YV12 format) + +@* 0 : Cb data are written first and then Cr written in their separate plane. +@* 1 : Cr data are written first and then Cb written in their separate plane. +@endverbatim +*/ + int cbcrOrder; + /** +@verbatim +Frame buffer endianness + +@* 0 : little endian format +@* 1 : big endian format +@* 2 : 32 bit little endian format +@* 3 : 32 bit big endian format +@* 16 ~ 31 : 128 bit endian format + +NOTE: For setting specific values of 128 bit endiness, please refer to the +'WAVE4 Datasheet'. +@endverbatim +*/ + int frameEndian; + /** +@verbatim +Bistream buffer endianness + +@* 0 : little endian format +@* 1 : big endian format +@* 2 : 32 bit little endian format +@* 3 : 32 bit big endian format +@* 16 ~ 31 : 128 bit endian format + +NOTE: For setting specific values of 128 bit endiness, please refer to the +'WAVE4 Datasheet'. +@endverbatim +*/ + int streamEndian; + /** +@verbatim +Endianness of source YUV + +@* 0 : Little endian format +@* 1 : Big endian format +@* 2 : 32 bit little endian format +@* 3 : 32 bit big endian format +@* 16 ~ 31 : 128 bit endian format + +NOTE: For setting specific values of 128 bit endiness, please refer to the +'WAVE4 Datasheet'. +@endverbatim +*/ + int sourceEndian; + /** +@verbatim +It writes output with 8 burst in linear map mode. + +@* 0 : Burst write back is disabled +@* 1 : Burst write back is enabled. + +NOTE: WAVE4 does not support it. +@endverbatim +*/ + int bwbEnable; + /** +@verbatim +@* 0 : Disable +@* 1 : Enable + +This flag is used for AvcEnc frame-based streaming with line buffer. +If coding standard is not AvcEnc or ringBufferEnable is 1, this flag is ignored. + +If this field is set, VPU sends a buffer full interrupt when line buffer is +full, and waits until the interrupt is cleared. HOST should read the bitstream +in line buffer and clear the interrupt. If this field is not set, VPU does not +send a buffer full interrupt when line buffer is full. In both cases, VPU sets +RET_ENC_PIC_FLAG register to 1 if line buffer is full. +@endverbatim +*/ + int lineBufIntEn; + int bEsBufQueueEn; + /** +@verbatim +This flag indicates whether source images are in packed format. + +@* 0 : Not packed mode +@* 1 : Packed YUYV +@* 2 : Packed YVYU +@* 3 : Packed UYVY +@* 4 : Packed VYUY +@endverbatim +*/ + PackedFormatNum packedFormat; + /** +This flag indicates a color format of source image which is one among +<>. +*/ + FrameBufferFormat srcFormat; + int srcBitDepth; + ParamChange paramChange; + + /** +@verbatim +VPU core index number + +* 0 ~ number of VPU core - 1 +@endverbatim +*/ + Uint32 coreIdx; + /** +@verbatim +@* 0 : CbCr data is interleaved in chroma source frame memory. (NV12) +@* 1 : CrCb data is interleaved in chroma source frame memory. (NV21) +@endverbatim +*/ + int nv21; + + Uint32 encodeHrdRbspInVPS; /**< It encodes the HRD syntax into VPS. */ + Uint32 encodeHrdRbspInVUI; /**< It encodes the HRD syntax into VUI. */ + Uint32 hrdRbspDataSize; /**< The bit size of the HRD rbsp data */ + PhysicalAddress hrdRbspDataAddr; /**< The address of the HRD rbsp data + */ + + Uint32 encodeVuiRbsp; /**< A flag to encode the VUI syntax in rbsp which + is given by HOST application */ + Uint32 vuiRbspDataSize; /**< The bit size of the VUI rbsp data */ + PhysicalAddress vuiRbspDataAddr; /**< The address of the VUI rbsp data + */ + + Uint32 virtAxiID; + BOOL enablePTS; /**< An enable flag to report PTS(Presentation + Timestamp. */ + int coda9RoiEnable; /**< It enables ROI for CODA980. */ + int RoiPicAvgQp; /**< It specifies an ROI average QP. */ + char RoiFile[1024]; /**< It specifies the ROI file. */ + + int set_dqp_pic_num; /**< It is the number of cyclic pictures. */ + + gop_entry_t gopEntry[MAX_GOP_SIZE * 2]; /**< The entire structure of + cyclic pictures */ + int gopPreset; /**< GOP preset value (0~5) */ + + int LongTermPeriod; /**< It specifies an interval value of longterm + period. */ + + int LongTermDeltaQp; /**< It specifies a delta QP value between + base(intra) picture and longterm inter picture. + */ + + int VirtualIPeriod; + + int dqp[8]; /**< A delta QP value of frame# within the cyclic pictures + */ + int HvsQpScaleDiv2; /**< It specifies the scale for MB QP derivation. It + is only avilable when EN_HVS_QP is 1. */ + int EnHvsQp; /**< It enables HVS QP. */ + int EnRowLevelRc; /**< It enables row-level rate control. */ + int RcInitialQp; /**< An initial QP for rate control */ + int RcHvsMaxDeltaQp; /**< A maximum delta QP value for HVS considered + rate control */ +#ifdef ROI_MB_RC + int roi_max_delta_qp_minus; + int roi_max_delta_qp_plus; +#endif +#ifdef AUTO_FRM_SKIP_DROP + int enAutoFrmSkip; /**< It enables frame skip automatically according to + threshold */ + int enAutoFrmDrop; /**< It enables frame drop automatically according to + threshold */ + int vbvThreshold; /**< Vbv buffer threshold value */ + int qpThreshold; /**< Qp buffer threshold value */ + int maxContinuosFrameSkipNum; /**< It specifies the maximum number of + continusous frame skip. */ + int maxContinuosFrameDropNum; /**< It specifies the maximum number of + continusous frame drop. */ +#endif + int rcWeightFactor; /**< Adjusts the speed of updating parameters to the + rate control model. If RcWeightFactor is set with + a large value, the RC parameters are updated + slowly. (Min: 1, Max: 32, default: 2) */ + + /** + @verbatim + Time delay in mili-seconds (CODA9 only) + + It is the amount of time in ms taken for bitstream to reach initial + occupancy of the vbv buffer from zero level. + + This value is ignored if rate + control is disabled. The value 0 means VPU does not check for reference + decoder buffer delay constraints. + @endverbatim + */ + int rcInitDelay; + + /** + @verbatim + The number of intra MB to be inserted in picture (CODA9 only) + + @* 0 : intra MB refresh is not used. + @* Other value : intraRefreshNum of MBs are encoded as intra MBs in every P + frame. + + @endverbatim + */ + int intraRefreshNum; + + int rcMode; + // align hisi API + int statTime; + int changePos; + int frmLostBpsThr; + int frmLostOpen; + int frmLostMode; + int encFrmGaps; + int minQpDelta; + // avbr + int picMotionLevel; // 8 bit frame motion lv from ISP + int picDciLv; + unsigned char *picMotionMap; + int picMotionMapSize; + int minStillPercent; + int maxStillQp; + int motionSensitivy; + BOOL avbrFrmLostOpen; + int pureStillThr; + int avbrFrmGaps; + // background enhancement + BOOL bgEnhanceEn; + int bgDeltaQp; + + int maxIprop; // only valid for 264 + Int32 s32ChnNum; + bool cviRcEn; + bool addrRemapEn; + + bool svc_enable; + bool fg_protect_en; + int fg_dealt_qp; + bool complex_scene_detect_en; + Uint32 complex_scene_low_th; + Uint32 complex_scene_hight_th; + Uint32 middle_min_percent; + Uint32 complex_min_percent; + bool smart_ai_en; +} EncOpenParam; + +/** +* @brief This is a data structure for parameters of VPU_EncGetInitialInfo() +which is required to get the minimum required buffer count in HOST application. +This returned value is used to allocate frame buffers in +VPU_EncRegisterFrameBuffer(). +*/ +typedef struct { + int minFrameBufferCount; /**< Minimum number of frame buffer */ + int minSrcFrameCount; /**< Minimum number of source buffer */ +} EncInitialInfo; + +/** + * @brief This is a data structure for setting ROI. (CODA9 encoder only). + */ +typedef struct { + /** +@verbatim +@* 0 : It disables ROI. +@* 1 : User can set QP value for both ROI and non-ROI region +@* 2 : User can set QP value for only ROI region (Currently, not support) +@endverbatim +*/ + int mode; + /** +@verbatim +Total number of ROI + +The maximum value is MAX_ROI_NUMBER. +MAX_ROI_NUMBER can be either 10 or 50. In order to use MAX_ROI_NUMBER as 50, +SUPPORT_ROI_50 define needs to be enabled in the reference SW. +@endverbatim +*/ + int number; + VpuRect region[MAX_ROI_NUMBER]; /**< Rectangle information for ROI */ + int qp[MAX_ROI_NUMBER]; /**< QP value for ROI region */ + + int rcMode; +} AvcRoiParam; + +/** + * @brief This is a data structure for setting NAL unit coding options. + */ +typedef struct { + int implicitHeaderEncode; /**< Whether HOST application encodes a header + implicitly or not. If this value is 1, + below encode options are ignored. */ + int encodeVCL; /**< A flag to encode VCL nal unit explicitly */ + int encodeVPS; /**< A flag to encode VPS nal unit explicitly */ + int encodeSPS; /**< A flag to encode SPS nal unit explicitly */ + int encodePPS; /**< A flag to encode PPS nal unit explicitly */ + int encodeAUD; /**< A flag to encode AUD nal unit explicitly */ + int encodeEOS; /**< A flag to encode EOS nal unit explicitly. This + should be set when to encode the last source picture + of sequence. */ + int encodeEOB; /**< A flag to encode EOB nal unit explicitly. This + should be set when to encode the last source picture + of sequence. */ + int encodeVUI; /**< A flag to encode VUI nal unit explicitly */ + int encodeFiller; /**< A flag to encode Filler nal unit explicitly + (WAVE5 only) */ +} EncCodeOpt; + +#ifdef ROI_MB_RC +/** + * @brief This is a data structure for setting ROI. + */ + +typedef struct { + Uint32 left; /**< A horizontal pixel offset of top-left corner of + rectangle from (0, 0), top-left corner of a frame. */ + Uint32 top; /**< A vertical pixel offset of top-left corner of rectangle + from (0, 0), top-left corner of a frame. */ + Uint32 right; /**< A horizontal pixel offset of bottom-right corner of + rectangle from (0, 0), bottom-right corner of a frame. + */ + Uint32 bottom; /**< A vertical pixel offset of bottom-right corner of + rectangle from (0, 0), bottom-right corner of a frame. + */ +} Rect; + +typedef struct { + /** +@verbatim +Total number of ROI + +The maximum value is MAX_ROI_NUMBER. +MAX_ROI_NUMBER can be either 10 or 50. In order to use MAX_ROI_NUMBER as 50, +SUPPORT_ROI_50 define needs to be enabled in the reference SW. +@endverbatim +*/ + int number; + Rect region[MAX_ROI_NUMBER]; /**< Rectangle information for ROI */ + int qp[MAX_ROI_NUMBER]; /**< QP value for ROI region */ + int roi_file; +} EncSetROI; +#endif + +/** + * @brief This is a data structure for configuring one frame encoding operation. + */ +typedef struct { + FrameBuffer *sourceFrame; /**< This member must represent the frame + buffer containing source image to be + encoded. */ + /** +@verbatim +If this value is 0, the picture type is determined by VPU +according to the various parameters such as encoded frame number and GOP size. + +If this value is 1, the frame is encoded as an I-picture regardless of the +frame number or GOP size, and I-picture period calculation is reset to +initial state. In MPEG4 and H.263 case, I-picture is sufficient for decoder +refresh. In H.264/AVC case, the picture is encoded as an IDR (Instantaneous +Decoding Refresh) picture. + +This value is ignored if skipPicture is 1. +@endverbatim +*/ + int forceIPicture; + /** +@verbatim +If this value is 0, the encoder encodes a picture as normal. + +If this value is 1, the encoder ignores sourceFrame and generates a skipped +picture. In this case, the reconstructed image at decoder side is a duplication +of the previous picture. The skipped picture is encoded as P-type regardless of +the GOP size. +@endverbatim +*/ + int skipPicture; + int quantParam; /**< This value is used for all quantization parameters + in case of VBR (no rate control). */ + /** +@verbatim +The start address of a picture stream buffer under line-buffer mode and dynamic +buffer allocation. (CODA encoder only) + +This variable represents the start of a picture stream for encoded output. In +buffer-reset mode, HOST might use multiple picture stream buffers for the +best performance. By using this variable, applications could re-register the +start position of the picture stream while issuing a picture encoding operation. +This start address of this buffer must be 4-byte aligned, and its size is +specified the following variable, picStreamBufferSize. In packet-based streaming +with ring-buffer, this variable is ignored. + +NOTE: This variable is only meaningful when both line-buffer mode and dynamic +buffer allocation are enabled. +@endverbatim +*/ + PhysicalAddress picStreamBufferAddr; + /** +@verbatim +The byte size of a picture stream chunk + +This variable represents the byte size of a picture stream buffer. This variable +is so crucial in line-buffer mode. That is because encoder output could be +corrupted if this size is smaller than any picture encoded output. So this value +should be big enough for storing multiple picture streams with average size. In +packet-based streaming with ring-buffer, this variable is ignored. +@endverbatim +*/ + int picStreamBufferSize; + /** +@verbatim +@* 0 : progressive (frame) encoding mode +@* 1 : interlaced (field) encoding mode +@endverbatim +*/ + int fieldRun; + + int coda9RoiEnable; /**< It enables ROI for CODA980. */ + Uint32 coda9RoiPicAvgQp; /**< A average value of ROI QP for a picture + (CODA9 only) */ + PhysicalAddress roiQpMapAddr; /**< The start address of ROI QP map + (CODA9 only) */ + Uint32 nonRoiQp; /**< A non-ROI QP for a picture */ + +#ifdef ROI_MB_RC + AvcRoiParam setROI; /**< This value sets ROI. If setROI mode is 0, ROI + does work and other member value of setROI is + ignored. */ +#endif + + HevcCtuOptParam ctuOptParam; /**< <> for + H.265/HEVC encoding */ + + int forcePicQpEnable; /**< A flag to use a force picture quantization + parameter */ + int forcePicQpSrcOrderEnable; /**< A flag to use a force picture QP by + source index order */ + int forcePicQpI; /**< A force picture quantization parameter for I + picture */ + int forcePicQpP;/* A force picture quantization parameter for P picture */ + int forcePicQpB;/* A force picture quantization parameter for B picture */ + int forcePicTypeEnable; /**< A flag to use a force picture type */ + int forcePicTypeSrcOrderEnable; + /* + * A flag to use a force picture type + * by source index order + */ + int forcePicType; /**< A force picture type (I, P, B, IDR, CRA) */ + int srcIdx; /**< A source frame buffer index */ + int srcEndFlag; + /**< A flag indicating that there is no more source frame buffer to encode */ + + EncCodeOpt codeOption; /**< <> */ + + Uint32 useCurSrcAsLongtermPic; + /* + * A flag for the current picture to be + * used as a longterm reference picture + * later when other picture's encoding + */ + Uint32 useLongtermRef; + /* + * A flag to use a longterm reference picture + * in DPB when encoding the current picture + */ + Uint32 pts; /**< The presentation Timestamp (PTS) of input source */ + + // belows are newly added for WAVE5 encoder + HevcCustomMapOpt customMapOpt; /**< <> */ + Uint32 wpPixVarianceY; + Uint32 wpPixVarianceCb; + Uint32 wpPixVarianceCr; + Uint32 wpPixMeanY; + Uint32 wpPixMeanCb; + Uint32 wpPixMeanCr; + Uint32 forceAllCtuCoefDropEnable; +#ifdef SUPPORT_HOST_RC_PARAM + Uint32 hostRcPicQp; /**< Host defined picture QP. It is available only hostPicRCEnable=1 case. */ + Uint32 hostRcTargetPicBit; + /**< Host defined picture target. It is available only hostPicRCEnable=1 case. */ +#endif + + // middleware adapting control variable + BOOL is_idr_frame; + BOOL idr_request; + BOOL is_i_period; + BOOL idr_registered; + BOOL force_i_for_gop_sync; + + BOOL roi_request; + BOOL roi_enable[8]; + BOOL roi_qp_mode[8]; // bAbsQp + Int32 roi_qp[8]; + Int32 roi_rect_x[8]; // pixel position + Int32 roi_rect_y[8]; // pixel position + Uint32 roi_rect_width[8]; // pixel width + Uint32 roi_rect_height[8]; // pixel width + Int32 roi_base_qp; + Uint32 u32FrameQp; + Uint32 u32FrameBits; + Int32 s32HrdBufLevel; +} EncParam; + +#define AR_PAGE_SIZE_OFFSET 17 +#define AR_PHY_ADDR_SHIFT 16 +#define AR_MMU_ENABLE_OFFSET 31 +#define AR_MAX_NUM_PAGE_TABLE_ENTRY 64 +#define AR_MAX_FB_NUM 4 + +typedef enum _AddrRemapMode_ { + AR_MODE_ORIG = 0, + AR_MODE_OFFSET +} AddrRemapMode; + +typedef enum _AddrRemapPageSize_ { + AR_PAGE_128KB = 0, + AR_PAGE_256KB, + AR_PAGE_512KB, + AR_PAGE_1024KB, +} AddrRemapPageSize; + +typedef enum _AddrRemapMmuEnable_ { + AR_MMU_BIT31 = 0, + AR_MMU_BIT30, + AR_MMU_BIT29, + AR_MMU_DISABLE, +} AddrRemapMmuEnable; + +typedef enum _AddrRemapComp_ { + AR_COMP_LUMA = 0, + AR_COMP_CHROMA, + AR_COMP_MAX, +} AddrRemapComp; + +typedef struct _PageEntry_ { + Uint32 phyAddr; // physical address + Int32 flag; // Frame Buffer index +} PageEntry; + +typedef struct _AddrRemap_ { + Uint32 mode; // 0 = original mode, 1 = offset mode + Uint32 pageSizeSel; // 0 = 128KB, 1 = 256KB, 2 = 512KB, 3 = 1024KB + Uint32 pageSizeInBit; // pageSize represented in 2's power + Uint32 pageSize; // actual pageSize + Uint32 mmuEnable; // 0 = bit31, 1 = bit30, 2 = bit29, 3 = disable + + /* Basic size of frame buffer is one frame. Beyond that, use numExtraLine */ + Uint32 numExtraLine; + + /* pageTable contains informaiton of all the pages, phyAddr & flag */ + PageEntry pageTable[AR_COMP_MAX][AR_MAX_NUM_PAGE_TABLE_ENTRY]; + + /* index of each page for each frame buffer */ + Int8 fbPageIndex[AR_MAX_FB_NUM][AR_COMP_MAX][AR_MAX_NUM_PAGE_TABLE_ENTRY]; + Uint32 u32ReadPhyAddr[AR_COMP_MAX][AR_MAX_NUM_PAGE_TABLE_ENTRY]; + + /* number of pages in one frame buffer for Luma or Chroma component */ + Int32 numFramePage[AR_COMP_MAX]; + + /* number of pages in one frame buffer for Luma or Chroma component */ + Int32 numVirPageInFbs[AR_COMP_MAX]; + + /* number of pages in all frame buffers for Luma or Chroma component, + * including extra-line size + */ + Int32 numPhyPageInFbs[AR_COMP_MAX]; + + Int32 lastWriteFb; // frame buffer index of the written frame +} AddrRemap; + +/** + * @brief This structure is used for reporting encoder information. + */ +typedef struct { + /** +@verbatim +@* 0 : reporting disable +@* 1 : reporting enable +@endverbatim +*/ + int enable; + int type; /**< This value is used for picture type reporting in MVInfo. + */ + int sz; /**< This value means size for each reporting data (MBinfo, + MVinfo, Sliceinfo). */ + PhysicalAddress addr; /**< The start address of each reporting buffer + into which encoder puts data. */ +} EncReportInfo; + +#ifdef SUPPORT_W5ENC_BW_REPORT +/** + * @brief This structure is used for reporting bandwidth (only for WAVE5). + */ +typedef struct { + osal_file_t fpBW; + Uint32 prpBwRead; + Uint32 prpBwWrite; + Uint32 fbdYRead; + Uint32 fbcYWrite; + Uint32 fbdCRead; + Uint32 fbcCWrite; + Uint32 priBwRead; + Uint32 priBwWrite; + Uint32 secBwRead; + Uint32 secBwWrite; + Uint32 procBwRead; + Uint32 procBwWrite; +} EncBwMonitor; +#endif + +/** + * @brief This is a data structure for reporting the results of picture + * encoding operations. + */ +typedef struct { + /** +@verbatim +The Physical address of the starting point of newly encoded picture stream + +If dynamic buffer allocation is enabled in line-buffer mode, this value is +identical with the specified picture stream buffer address by HOST. +@endverbatim +*/ + PhysicalAddress bitstreamBuffer; + Uint32 bitstreamSize; /**< The byte size of encoded bitstream */ + int bitstreamWrapAround; /**< This is a flag to indicate whether + bitstream buffer operates in ring buffer + mode in which read and write pointer are + wrapped arounded. If this flag is 1, HOST + application needs a larger buffer. */ + /** +@verbatim +Coded picture type + +@* H.263 and MPEG4 +@** 0 : I picture +@** 1 : P picture + +@* H.264/AVC +@** 0 : IDR picture +@** 1 : Non-IDR picture +@endverbatim +*/ + int picType; + int numOfSlices; /**< The number of slices of the currently being + encoded Picture */ + int reconFrameIndex; /**< A reconstructed frame index. The + reconstructed frame is used for reference of + future frame. */ + FrameBuffer reconFrame; /**< A reconstructed frame address and + information. Please refer to + <>. */ + PhysicalAddress + rdPtr; /**< A read pointer in bitstream buffer, which is where HOST + has read encoded bitstream from the buffer */ + PhysicalAddress + wrPtr; /**< A write pointer in bitstream buffer, which is where VPU + has written encoded bitstream into the buffer */ +#ifdef AUTO_FRM_SKIP_DROP + int picDropped; /**< A flag which represents whether the current + encoding has been dropped or not.*/ +#endif + + // for WAVE420 + int picSkipped; /**< A flag which represents whether the current + encoding has been skipped or not. */ + int numOfIntra; /**< The number of intra coded block */ + int numOfMerge; /**< The number of merge block in 8x8 */ + int numOfSkipBlock; /**< The number of skip block in 8x8 */ + int avgCtuQp; /**< The average value of CTU QPs */ + int encPicByte; /**< The number of encoded picture bytes */ + int encGopPicIdx; /**< GOP index of the current picture */ + int encPicPoc; /**< POC(picture order count) value of the current + picture */ + int encSrcIdx; /**< Source buffer index of the current encoded picture + */ + int encVclNal; /**< Encoded NAL unit type of VCL */ + int encPicCnt; /**< Encoded picture number */ + + // Report Information + EncReportInfo mbInfo; /**< The parameter for reporting MB data . Please + refer to <> structure. + */ + EncReportInfo mvInfo; /**< The parameter for reporting motion vector. + Please refer to <> + structure. */ + EncReportInfo sliceInfo; /**< The parameter for reporting slice + information. Please refer to + <> structure. */ + int frameCycle; /**< The parameter for reporting the cycle number of + decoding/encoding one frame.*/ + Uint64 pts; /**< Presentation Timestamp of encoded picture. */ + Uint32 encInstIdx; /**< An index of instance which have finished + encoding with a picture at this command. This is + only for Multi-Core encoder product. */ + Uint32 encPrepareCycle; + Uint32 encProcessingCycle; + Uint32 encEncodingCycle; +#ifdef REPORT_PIC_SUM_VAR + Uint32 sumPicVar; /**< The sum for subCTU's variance in a picture. + used for Wave */ + Uint32 picVariance; /**< The sum of MB pixel variance in a picture. + used for Coda9 */ +#endif + + Uint64 encHwTime; + Uint32 u32SumQp; + Uint32 u32MeanQp; +} EncOutputInfo; + +/** + * @brief This structure is used when HOST processor additionally wants to get +SPS data or PPS data from encoder instance. The resulting SPS data or PPS data +can be used in real applications as a kind of out-of-band information. +*/ +typedef struct { + PhysicalAddress paraSet; /**< An array of 32 bits which contains SPS + RBSP */ + int size; /**< The size of stream in byte */ +} EncParamSet; + +/** + * @brief This structure is used for adding a header syntax layer into the +encoded bit stream. The parameter headerType is the input parameter to VPU, and +the other two parameters are returned values from VPU after completing requested +operation. +*/ +typedef struct { + PhysicalAddress buf; /**< A physical address pointing the generated + stream location */ + BYTE *pBuf; /**< The virtual address according to buf. This address is + needed when a HOST wants to access encoder header + bitstream buffer. */ + size_t size; /**< The size of the generated stream in bytes */ + Int32 headerType; /**< This is a type of header that HOST wants to + generate and have values as VOL_HEADER, VOS_HEADER, + VO_HEADER, SPS_RBSP or PPS_RBSP. */ + BOOL zeroPaddingEnable; /**< It enables header to be padded at the end + with zero for byte alignment. */ + Int32 failReasonCode; /**< Not defined yet */ +} EncHeaderParam; + +/** + * @brief This is a special enumeration type for MPEG4 top-level header +classes such as visual sequence header, visual object header and video object +layer header. It is for MPEG4 encoder only. +*/ +typedef enum { + VOL_HEADER, /**< Video object layer header */ + VOS_HEADER, /**< Visual object sequence header */ + VIS_HEADER /**< Video object header */ +} Mp4HeaderType; + +/** + * @brief This is a special enumeration type for AVC parameter sets such as +sequence parameter set and picture parameter set. It is for AVC encoder only. +*/ +typedef enum { + SPS_RBSP, /**< Sequence parameter set */ + PPS_RBSP, /**< Picture parameter set */ + SPS_RBSP_MVC, /**< Subset sequence parameter set */ + PPS_RBSP_MVC, /**< Picture parameter set for dependent view */ + SVC_RBSP_SEI, /**< SEI for SVC */ + + END_OF_SEQUENCE, /**< End of sequence nal for H.264/AVC encoder (CODA7Q + only) */ + END_OF_STREAM /**< End of stream nal for H.264/AVC encoder (CODA7Q only) + */ +} AvcHeaderType; + +/** + * @brief This is a special enumeration type for explicit encoding headers + * such as VPS, SPS, PPS. (WAVE encoder only) + */ +typedef enum { + CODEOPT_ENC_VPS = (1 << 2), /**< A flag to encode VPS nal unit + explicitly */ + CODEOPT_ENC_SPS = (1 << 3), /**< A flag to encode SPS nal unit + explicitly */ + CODEOPT_ENC_PPS = (1 << 4), /**< A flag to encode PPS nal unit + explicitly */ +} HevcHeaderType; + +/** + * @brief This is a special enumeration type for NAL unit coding options + */ +typedef enum { + CODEOPT_ENC_HEADER_IMPLICIT = (1 << 0), /**< A flag to encode (a) + headers (VPS, SPS, PPS) + implicitly for generating + bitstreams conforming to + spec. */ + CODEOPT_ENC_VCL = (1 << 1), /**< A flag to encode VCL nal unit + explicitly */ +} ENC_PIC_CODE_OPTION; + +/** + * @brief This is a special enumeration type for defining GOP structure + * presets. + */ +typedef enum { + PRESET_IDX_CUSTOM_GOP = 0, /**< User defined GOP structure */ + PRESET_IDX_ALL_I = 1, /**< All Intra, gopsize = 1 */ + PRESET_IDX_IPP = 2, /**< Consecutive P, cyclic gopsize = 1 */ + PRESET_IDX_IBBB = 3, /**< Consecutive B, cyclic gopsize = 1 */ + PRESET_IDX_IBPBP = 4, /**< gopsize = 2 */ + PRESET_IDX_IBBBP = 5, /**< gopsize = 4 */ + PRESET_IDX_IPPPP = 6, /**< Consecutive P, cyclic gopsize = 4 */ + PRESET_IDX_IBBBB = 7, /**< Consecutive B, cyclic gopsize = 4 */ + PRESET_IDX_RA_IB = 8, /**< Random Access, cyclic gopsize = 8 */ + PRESET_IDX_T0S = 16, /**< Bitmain preset1 */ + PRESET_IDX_T1S = 17, /**< Bitmain preset2 */ + PRESET_IDX_T1L = 18, /**< Bitmain preset3 */ + PRESET_IDX_T2ST1S = 19, /**< Bitmain preset4 */ + PRESET_IDX_T2ST1L = 20, /**< Bitmain preset5 */ +} GOP_PRESET_IDX; + +#ifdef __cplusplus +extern "C" { +#endif + +/** +* @brief This function returns whether processing a frame by VPU is completed or +not. +* @return +@verbatim +@* 0 : VPU hardware is idle. +@* Non-zero value : VPU hardware is busy with processing a frame. +@endverbatim +*/ +Int32 VPU_IsBusy(Uint32 coreIdx /**< [input] An index of VPU core */ +); + +/** +* @brief +@verbatim +This function makes HOST application wait until VPU finishes processing a frame, +or check a busy flag of VPU during the given timeout period. +The behavior of this function depends on VDI layer\'s implementation. + +NOTE: Timeout may not work according to implementation of VDI layer. +@endverbatim +* @param coreIdx [input] An index of VPU core +* @param timeout [output] See return value. +* @return +@verbatim +* 1 : Wait time out +* Non -1 value : The value of InterruptBit +@endverbatim +*/ +Int32 VPU_WaitInterrupt(Uint32 coreIdx, int timeout); + +#ifdef REDUNDENT_CODE +Int32 VPU_WaitInterruptEx(VpuHandle handle, int timeout); +#endif + +/** + * @brief This function returns whether VPU is currently running or not. + * @param coreIdx [input] An index of VPU core +* @return +@verbatim +@* 0 : VPU is not running. +@* 1 or more : VPU is running. +@endverbatim + */ +Int32 VPU_IsInit(Uint32 coreIdx); + +#ifdef REDUNDENT_CODE +/** +* @brief +@verbatim +This function initializes VPU hardware and its data +structures/resources. HOST application must call this function only once before +calling VPU_DeInit(). + +NOTE: Before use, HOST application needs to define the header file path of BIT +firmware to BIT_CODE_FILE_PATH. +@endverbatim +*/ +RetCode VPU_Init(Uint32 coreIdx /**<[input] An index of VPU core. This value can + be from 0 to (number of VPU core - 1).*/ +); +#endif + +/** +* @brief +@verbatim +This function initializes VPU hardware and its data structures/resources. +HOST application must call this function only once before calling VPU_DeInit(). + +VPU_InitWithBitcodec() is basically same as VPU_Init() except that it takes +additional arguments, a buffer pointer where BIT firmware binary is located and +the size. HOST application can use this function when they wish to load a binary +format of BIT firmware, instead of it including the header file of BIT firmware. +Particularly in multi core running environment with different VPU products, +this function must be used because each core needs to load different firmware. +@endverbatim +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means VPU has been initialized +successfully. *RETCODE_CALLED_BEFORE* :: This function call is invalid which +means multiple calls of the current API function for a given instance are not +allowed. In this case, VPU has been already initialized, so that this function +call is meaningless and not allowed anymore. *RETCODE_NOT_FOUND_BITCODE_PATH* :: +The header file path of BIT firmware has not been defined. +*RETCODE_VPU_RESPONSE_TIMEOUT* :: +Operation has not received any response from VPU and has timed out. +*RETCODE_FAILURE* :: +Operation was failed. +@endverbatim +*/ +RetCode VPU_InitWithBitcode(Uint32 coreIdx, /**< [Input] An index of VPU core */ + const Uint16 *bitcode, /**< [Input] Buffer where + binary format of BIT + firmware is located */ + Uint32 sizeInWord /**< [Input] Size of binary BIT + firmware in short integer */ +); + +/** +* @brief This function frees all the resources allocated by VPUAPI and +releases the device driver. VPU_Init() and VPU_DeInit() always work in pairs. +* @return none +*/ +RetCode VPU_DeInit(Uint32 coreIdx /**< [Input] An index of VPU core */ +); + +#ifdef REDUNDENT_CODE +/** + * @brief This function returns the number of instances opened. + * @return The number of instances opened + */ +int VPU_GetOpenInstanceNum(Uint32 coreIdx /**< [Input] An index of VPU core */ +); +#endif + +int cviVPU_GetFd(Uint32 coreIdx /**< [Input] An index of VPU core */ +); + +/** +* @brief This function returns the product information of VPU which is currently +running on the system. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means version information is acquired +successfully. +*RETCODE_FAILURE* :: +Operation was failed, which means the current firmware does not contain any +version information. *RETCODE_NOT_INITIALIZED* :: VPU was not initialized at all +before calling this function. Application should initialize VPU by calling +VPU_Init() before calling this function. *RETCODE_FRAME_NOT_COMPLETE* :: This +means frame decoding operation was not completed yet, so the given API function +call cannot be performed this time. A frame-decoding operation should be +completed by calling VPU_Dec Info(). Even though the result of the current frame +operation is not necessary, HOST application should call VPU_DecGetOutputInfo() +to proceed this function call. *RETCODE_VPU_RESPONSE_TIMEOUT* :: Operation has +not received any response from VPU and has timed out. +@endverbatim +*/ +RetCode VPU_GetVersionInfo(Uint32 coreIdx, /**< [Input] An index of VPU core */ + /** + @verbatim + [Output] + + @* Version_number[15:12] - Major revision + @* Version_number[11:8] - Hardware minor revision + @* Version_number[7:0] - Software minor revision + @endverbatim + */ + Uint32 *versionInfo, Uint32 *revision, /**< [Output] + Revision + information + */ + Uint32 *productId /**< [Output] Product information. + Refer to the + <> + enumeration */ +); + +int VPU_GetFrameCycle(Uint32 coreIdx); + +/** + * @brief This function clears VPU interrupts that are pending. + * @return none + */ +void VPU_ClearInterrupt(Uint32 coreIdx /**< [Input] An index of VPU core */ +); + +#ifdef REDUNDENT_CODE +void VPU_ClearInterruptEx(VpuHandle handle, Int32 intrFlag /**< An interrupt + flag to be cleared + */ +); +#endif + +/** +* @brief +@verbatim + +This function stops operation of the current frame and initializes VPU hardware +by sending reset signals. It can be used when VPU is having a longer delay or +seems hang-up. After VPU has completed initialization, the context is rolled +back to the state before calling the previous VPU_DecStartOneFrame() or +VPU_EncStartOneFrame(). HOST can resume decoding from the next picture, instead +of decoding from the sequence header. It works only for the current instance, so +this function does not affect other instance\'s running in multi-instance +operation. + +This is some applicable scenario of using `VPU_SWReset()` when a series of +hang-up happens. For example, when VPU is hung up with frame 1, HOST application +calls `VPU_SWReset()` to initialize VPU and then calls `VPU_DecStartOneFrame()` +for frame 2 with specifying the start address, read pointer. If there is still +problem with frame 2, we recommend calling `VPU_SWReset()` and `seq_init()` or +calling `VPU_SWReset()` and enabling iframe search. +@endverbatim +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information of the stream +data to be decoded was received successfully. +@endverbatim + */ +RetCode VPU_SWReset(Uint32 coreIdx, /**<[Input] An index of VPU core */ + /** +@verbatim +[Input] Way of reset + +@* SW_RESET_SAFETY : It waits until AXI bus completes ongoing tasks. If +remaining bus transactions are done, VPU enters the reset process. (recommended +mode) +@* SW_RESET_FORCE : It forces to reset VPU no matter whether bus transactions +are completed or not. It might affect what other blocks do with bus, so we do +not recommend using this mode. +@* SW_RESET_ON_BOOT : This is the default reset mode that is executed once +system boots up. This mode is actually executed in VPU_Init(), so does not have +to be used independently. +@endverbatim +*/ + SWResetMode resetMode, void *pendingInst); + +#ifdef REDUNDENT_CODE +/** +* @brief +@verbatim +This function resets VPU as VPU_SWReset() does, but +it is done by the system reset signal and all the internal contexts are +initialized. Therefore after the `VPU_HWReset()`, HOST application needs to call +`VPU_Init()`. + +`VPU_HWReset()` requires vdi_hw_reset part of VDI module to be implemented +before use. +@endverbatim +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information of the stream +data to be decoded was received successfully. +@endverbatim + */ +RetCode VPU_HWReset(Uint32 coreIdx /**< [Input] An index of VPU core */ +); + +/** +* @brief +@verbatim +This function saves or restores context when VPU powers on/off. + +NOTE: This is a tip for safe operation - + call this function to make VPU enter into a sleep state before power down, +and after the power off call this function again to return to a wake state. +@endverbatim +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information of the stream +data to be decoded was received successfully. +@endverbatim + */ +RetCode VPU_SleepWake(Uint32 coreIdx, /**< [Input] An index of VPU core */ + /** +@verbatim +[Input] + +@* 1 : saves all of the VPU contexts and converts into a sleep state. +@* 0 : restores all of the VPU contexts and converts back to a wake state. +@endverbatim +*/ + int iSleepWake); +#endif + +/** +* @brief +@verbatim +This function saves or restores context when VPU powers on/off. + +NOTE: This is a tip for safe operation - + call this function to make VPU enter into a sleep state before power down, +and after the power off call this function again to return to a wake state. +@endverbatim +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information of the stream +data to be decoded was received successfully. +@endverbatim + */ +RetCode VPU_SleepWake_EX(Uint32 coreIdx, /**< [Input] An index of VPU core */ + /** +@verbatim +[Input] + +@* 1 : saves all of the VPU contexts and converts into a sleep state. +@* 0 : restores all of the VPU contexts and converts back to a wake state. +@endverbatim +*/ + int iSleepWake); + +#ifdef REDUNDENT_CODE +/** + * @brief This function returns the size of motion vector co-located buffer + * that are needed to decode H.265/AVC stream. The mvcol buffer should be + * allocated along with frame buffers and given to VPU_DecRegisterFramebuffer() + * as an argument. + * @return It returns the size of required mvcol buffer in byte unit. + */ +int VPU_GetMvColBufSize(CodStd codStd, /**< [Input] Video coding standards */ + int width, /**< [Input] Width of framebuffer */ + int height, /**< [Input] Height of framebuffer */ + int num /**< [Input] Number of framebuffers. */ +); +#endif + +/** +* @brief This function returns the size of FBC (Frame Buffer Compression) +offset table for luma and chroma. +* The offset tables are to look up where compressed data is located. +* HOST should allocate the offset table buffers for luma and chroma as +well as frame buffers +* and give their base addresses to VPU_DecRegisterFramebuffer() as an +argument. +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means given value is valid and setting is +done successfully. *RETCODE_INVALID_PARAM* :: The given argument parameter, +ysize, csize, or handle was NULL. +@endverbatim +*/ +RetCode VPU_GetFBCOffsetTableSize(CodStd codStd, /**< [Input] Video coding + standards */ + int width, /**< [Input] Width of framebuffer + */ + int height, /**< [Input] Height of framebuffer + */ + int *ysize, /**< [Output] Size of offset table + for Luma in bytes */ + int *csize /**< [Output] Size of offset table + for Chroma in bytes */ +); + +/** + * @brief This function returns the size of frame buffer that is required for + * VPU to decode or encode one frame. + * + * @return The size of frame buffer to be allocated + */ +int VPU_GetFrameBufSize(int coreIdx, /**< [Input] VPU core index number */ + int stride, /**< [Input] The stride of image */ + int height, /**< [Input] The height of image */ + int mapType, /**< [Input] The map type of framebuffer */ + int format, /**< [Input] The color format of framebuffer + */ + int interleave, /**< [Input] Whether to use CBCR + interleave mode or not */ + DRAMConfig *pDramCfg /**< [Input] Attributes of DRAM. It + is only valid for CODA960. Set + NULL for this variable in case + of other products. */ +); + +/** + * @brief This function returns the product ID of VPU which is currently + * running. + * @return Product information. Please refer to the <> + * enumeration. + */ +int VPU_GetProductId(int coreIdx /**< [Input] VPU core index number */ +); + +// function for decode +/** +* @brief In order to decode, HOST application must open the decoder. By calling +this function, HOST application can get a handle by which they can refer to a +decoder instance. Because the VPU is multiple instance codec, HOST application +needs this kind of handle. Once a HOST application gets a handle, the HOST +application must pass this handle to all subsequent decoder-related functions. +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means a new decoder instance was created +successfully. +*RETCODE_FAILURE* :: +Operation was failed, which means getting a new decoder instance was not done +successfully. If there is no free instance anymore, this value is returned +in this function call. +*RETCODE_INVALID_PARAM* :: +The given argument parameter, pOpenParam, was invalid, which means it has a null +pointer, or given values for some member variables are improper values. +*RETCODE_NOT_INITIALIZED* :: +This means VPU was not initialized yet before calling this function. +Applications should initialize VPU by calling VPU_Init() before calling this +function. +@endverbatim + */ +RetCode VPU_DecOpen(DecHandle *pHandle, /**< [Output] A pointer to a DecHandle + type variable which specifies each + instance for HOST application. */ + DecOpenParam *pop /**< [Input] A pointer to a DecOpenParam + type structure which describes required + parameters for creating a new decoder + instance. */ +); + +/** + * @brief When HOST application finished decoding a sequence and wanted to +release this instance for other processing, the applicaton should close this +instance. After completion of this function call, the instance referred to by +handle gets free. Once a HOST application closes an instance, the HOST +application cannot call any further decoder-specific function with the current +handle before re-opening a new decoder instance with the same handle. +* @return + @verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means the current decoder instance was +closed successfully. *RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, handle, was +invalid. This return code might be caused if + +* `handle` is not the handle which has been obtained by VPU_DecOpen() +* `handle` is the handle of an instance which has been closed already, etc. +-- +*RETCODE_VPU_RESPONSE_TIMEOUT* :: +Operation has not received any response from VPU and has timed out. +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame decoding operation should +be completed by calling VPU_DecGetOutputInfo(). Even though the result of the +current frame operation is not necessary, HOST application should call +VPU_DecGetOutputInfo() to proceed this function call. +function. +@endverbatim + */ +RetCode VPU_DecClose(DecHandle handle /**< [Output] A decoder handle obtained + from VPU_DecOpen() */ +); + +/** + * @brief +@verbatim +Applications must pass the address of <> structure, +where the decoder stores information such as picture size, number of necessary +frame buffers, etc. For the details, see definition of +<> data structure. This function should be called once +after creating a decoder instance and before starting frame decoding. + +It is a HOST application\'s responsibility to provide sufficient amount of +bitstream to the decoder by calling VPU_DecUpdateBitstreamBuffer() so that +bitstream buffer does not get empty before this function returns. If HOST +application cannot ensure to feed stream enough, they can use the Forced Escape +option by using VPU_DecSetEscSeqInit(). +@endverbatim +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information of the stream +data to be decoded was received successfully. +*RETCODE_FAILURE* :: +Operation was failed, which means there was an error in getting information for +configuring the decoder. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_INVALID_PARAM* :: +The given argument parameter, pInfo, was invalid, which means it has a null +pointer, or given values for some member variables are improper values. +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame decoding operation should +be completed by calling VPU_DecGetOutputInfo(). Even though the result of the +current frame operation is not necessary, HOST should call +VPU_DecGetOutputInfo() to proceed this function call. +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. In this case, HOST might call this +function before successfully putting bitstream data by calling +VPU_DecUpdateBitstreamBuffer(). In order to perform this functions call, +bitstream data including sequence level header should be transferred into +bitstream buffer before calling VPU_DecGetInitialInfo(). +*RETCODE_CALLED_BEFORE* :: +This function call might be invalid, which means multiple calls of the current +API function for a given instance are not allowed. In this case, decoder initial +information has been already received, so that this function call is meaningless +and not allowed anymore. +*RETCODE_VPU_RESPONSE_TIMEOUT* :: ++ +-- +Operation has not received any response from VPU and has timed out. + +NOTE: When this function returns RETCODE_SUCCESS, HOST should call +VPU_ClearInterrupt() function to clear out the interrupt pending status. +-- +@endverbatim + */ +RetCode VPU_DecGetInitialInfo(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() + */ + DecInitialInfo *info /**< [Output] A pointer to + <> + data structure */ +); + +/** + * @brief +@verbatim +This function starts decoding sequence header. Returning from this function does +not mean the completion of decoding sequence header, and it is just that +decoding sequence header was initiated. Every call of this function should be +matched with VPU_DecCompleteSeqInit() with the same handle. Without calling a +pair of these funtions, HOST can not call any other API functions except for +VPU_IsBusy(), VPU_DecGetBitstreamBuffer(), and VPU_DecUpdateBitstreamBuffer(). + +A pair of this function and VPU_DecCompleteSeqInit() or VPU_DecGetInitialInfo() +should be called at least once after creating a decoder instance and before +starting frame decoding. +@endverbatim +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information of the stream +data to be decoded was received successfully *RETCODE_FAILURE* :: Operation was +failed, which means there was an error in getting information for configuring +the decoder. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame decoding operation should +be completed by calling VPU_DecIssueSeqInit (). Even though the result of the +current frame operation is not necessary, HOST should call VPU_DecIssueSeqInit +() to proceed this function call. *RETCODE_WRONG_CALL_SEQUENCE* :: This means +the current API function call was invalid considering the allowed sequences +between API functions. In this case, HOST application might call this function +before successfully putting bitstream data by calling +VPU_DecUpdateBitstreamBuffer(). In order to perform this functions call, +bitstream data including sequence level header should be transferred into +bitstream buffer before calling VPU_ DecIssueSeqInit (). +@endverbatim + */ +RetCode VPU_DecIssueSeqInit(DecHandle handle /**< [Input] A decoder handle + obtained from VPU_DecOpen() */ +); + +/** + * @brief Application can get the information about sequence header. +Applications must pass the address of DecInitialInfo structure, where the +decoder stores information such as picture size, number of necessary frame +buffers, etc. For more details, see definition of the section called the +DecInitialInfo data structure. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information of the stream +data to be decoded was received successfully. *RETCODE_FAILURE* :: Operation was +failed, which means there was an error in getting information for configuring +the decoder. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_INVALID_PARAM* :: +The given argument parameter, pInfo, was invalid, which means it has a null +pointer, or given values for some member variables are improper values. +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. It might happen because VPU_DecIssueSeqInit () +with the same handle was not called before calling this function +*RETCODE_CALLED_BEFORE* :: +This function call might be invalid, which means multiple calls of the current +API function for a given instance are not allowed. In this case, decoder initial +information has been already received, so that this function call is meaningless +and not allowed anymore. +@endverbatim + */ +RetCode VPU_DecCompleteSeqInit(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() + */ + DecInitialInfo *info /**< [Output] A pointer to + DecInitialInfo data + structure */ +); + +/** + * @brief This is a special function to provide a way of escaping VPU hanging +during DEC_SEQ_INIT. When this flag is set to 1 and stream buffer empty happens, +VPU terminates automatically DEC_SEQ_INIT operation. If target applications +ensure that high layer header syntax is periodically sent through the channel, +they do not need to use this option. But if target applications cannot ensure +that such as file-play, it might be very useful to avoid VPU hanging without +HOST timeout caused by crucial errors in header syntax. +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means Force escape flag is successfully +provided to BIT Processor. *RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not the handle which has been obtained by VPU_DecOpen(). +* `handle` is the handle of an instance which has been closed already, etc. +* bitstreamMode of DecOpenParam structure is not BS_MODE_INTERRUPT. +-- +@endverbatim +*/ +RetCode VPU_DecSetEscSeqInit(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() */ + int escape /**< [Input] A flag to enable or disable + forced escape from SEQ_INIT */ +); + +/** + * @brief This function is used for registering frame buffers with the acquired +information from VPU_DecGetInitialInfo(). The frame buffers pointed to by +bufArray are managed internally within VPU. These include reference +frames, reconstructed frame, etc. Applications must not change the contents of +the array of frame buffers during the life time of the instance, and `num` must +not be less than `minFrameBufferCount` obtained by VPU_DecGetInitialInfo(). +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means registering frame buffer +information was done successfully. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame decoding operation should +be completed by calling VPU_DecGetOutputInfo(). Even though the result of the +current frame operation is not necessary, HOST should call +VPU_DecGetOutputInfo() to proceed this function call. +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. A HOST might call this +function before calling VPU_DecGetInitialInfo() successfully. This function +should be called after successful calling VPU_DecGetInitialInfo(). +*RETCODE_INVALID_FRAME_BUFFER* :: +This happens when pBuffer was invalid, which means pBuffer was not initialized +yet or not valid anymore. +*RETCODE_INSUFFICIENT_FRAME_BUFFERS* :: +This means the given number of frame buffers, num, was not enough for the +decoder operations of the given handle. It should be greater than or equal to +the value requested by VPU_DecGetInitialInfo(). +*RETCODE_INVALID_STRIDE* :: +The given argument stride was invalid, which means it is smaller than the +decoded picture width, or is not a multiple of 8 in this case. +*RETCODE_CALLED_BEFORE* :: +This function call is invalid which means multiple calls of the current API +function for a given instance are not allowed. In this case, registering decoder +frame buffers has been already done, so that this function call is meaningless +and not allowed anymore. *RETCODE_VPU_RESPONSE_TIMEOUT* :: Operation has not +recieved any response from VPU and has timed out. +@endverbatim + */ +RetCode VPU_DecRegisterFrameBuffer(DecHandle handle, /**< [Input] A decoder + handle obtained from + VPU_DecOpen() */ + FrameBuffer *bufArray, /**< [Input] Allocated + frame buffer + address and + information. If + this parameter is + set to 0, VPU + allocates frame + buffers. */ + int num, /**< [Input] A number of frame + buffers. VPU can allocate frame + buffers as many as this given + value. */ + int stride, /**< [Input] A stride value of + the given frame buffers */ + int height, /**< [Input] Frame height */ + /** + @verbatim + [Input] + Map type of frame buffer The distance between a pixel + in a row and the corresponding pixel in the next row + is called a stride. It comes from 64-bit access unit + of AXI. + + The stride for luminance frame buffer should be at + least equal or greater than the width of picture and + a multiple of 8. It means the least significant 3-bit + of the 13-bit stride should be always 0. The stride + for chrominance frame buffers is the half of the + luminance stride. So in case Cb/Cr non-interleave + (separate Cb/Cr) map is used, make sure the stride + for luminance frame buffer should be a multiple of 16 + so that the stride for chrominance frame buffer can + become a multiple of 8. + @endverbatim + */ + int mapType); + +/** + * @brief This function is used for registering frame buffers with the acquired +information from VPU_DecGetInitialInfo(). +This function is functionally same as VPU_DecRegisterFrameBuffer(), but +it can give linear (display) frame buffers and compressed buffers separately +with different numbers unlike the way VPU_DecRegisterFrameBuffer() does. +VPU_DecRegisterFrameBuffer() assigns only the same number of frame buffers for +linear buffer and for compressed buffer, which can take up huge memory space. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means registering frame buffer +information was done successfully. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame decoding operation should +be completed by calling VPU_DecGetOutputInfo(). Even though the result of the +current frame operation is not necessary, HOST should call +VPU_DecGetOutputInfo() to proceed this function call. +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. A HOST might call this +function before calling VPU_DecGetInitialInfo() successfully. This function +should be called after successful calling VPU_DecGetInitialInfo(). +*RETCODE_INVALID_FRAME_BUFFER* :: +This happens when pBuffer was invalid, which means pBuffer was not initialized +yet or not valid anymore. +*RETCODE_INSUFFICIENT_FRAME_BUFFERS* :: +This means the given number of frame buffers, num, was not enough for the +decoder operations of the given handle. It should be greater than or equal to +the value requested by VPU_DecGetInitialInfo(). +*RETCODE_INVALID_STRIDE* :: +The given argument stride was invalid, which means it is smaller than the +decoded picture width, or is not a multiple of 8 in this case. +*RETCODE_CALLED_BEFORE* :: +This function call is invalid which means multiple calls of the current API +function for a given instance are not allowed. In this case, registering decoder +frame buffers has been already done, so that this function call is meaningless +and not allowed anymore. *RETCODE_VPU_RESPONSE_TIMEOUT* :: Operation has not +recieved any response from VPU and has timed out. +@endverbatim + */ +RetCode VPU_DecRegisterFrameBufferEx( + DecHandle handle, /**< [Input] A decoder handle obtained from + VPU_DecOpen() */ + FrameBuffer *bufArray, /**< [Input] Allocated frame buffer address and + information. If this parameter is set to 0, + VPU allocates frame buffers. */ + int numOfDecFbs, /**< [Input] Number of compressed frame buffer */ + int numOfDisplayFbs, /**< [Input] Number of linear frame buffer when WTL + is enabled. In WAVE4, this should be equal to or + larger than framebufDelay of + <> + 2. */ + int stride, /**< [Input] A stride value of the given frame buffers */ + int height, /**< [Input] Frame height */ + int mapType /**< [Input] A Map type for GDI inferface or FBC (Frame + Buffer Compression) For detailed map options, please + refer to the <>. */ +); + +#ifdef REDUNDENT_CODE +RetCode VPU_DecUpdateFrameBuffer(DecHandle handle); + +RetCode VPU_DecSetBitstreamBuffer(DecHandle handle, PhysicalAddress rdPtr, + PhysicalAddress wrPtr); +#endif + +/** +* @brief +This is a special function that enables HOST to allocate directly the frame +buffer for decoding (Recon) or for display or post-processor unit (PPU) such as +Rotator or Tiled2Linear. In normal operation, VPU API allocates frame buffers +when the argument `bufArray` in VPU_DecRegisterFrameBuffer() is set to 0. +However, for any other reason HOST can use this function to allocate frame +buffers by themselves. + * @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means the framebuffer is allocated +successfully. *RETCODE_INVALID_HANDLE* :: This means the given handle for the +current API function call, handle, was invalid. This return code might be caused +if ++ +-- +* `handle` is not the handle which has been obtained by VPU_DecOpen(). +* `handle` is the handle of an instance which has been closed already, etc. +-- +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. It might happen because +VPU_DecRegisterFrameBuffer() for (FramebufferAllocType.FB_TYPE_CODEC) has not +been called, before this function call for allocating frame buffer for PPU +(FramebufferAllocType.FB_TYPE_PPU). *RETCODE_INSUFFICIENT_RESOURCE* :: Fail to +allocate a framebuffer due to lack of memory *RETCODE_INVALID_PARAM* :: The +given argument parameter, index, was invalid, which means it has improper +values. +@endverbatim + + */ +RetCode VPU_DecAllocateFrameBuffer(DecHandle handle, /**< [Input] A decoder + handle obtained from + VPU_DecOpen() */ + FrameBufferAllocInfo info, /**< [Input] + Information + required for + frame bufer + allocation */ + FrameBuffer *frameBuffer /**< [Output] Data + structure that + holds information + of allocated + frame buffers */ +); + +#ifdef REDUNDENT_CODE +/** +* @brief +@verbatim +This function returns the frame buffer information that was allocated by +VPU_DecRegisterFrameBuffer() function. + +It does not affect actual decoding and simply does obtain the information of +frame buffer. This function is more helpful especially when frame buffers are +automatically assigned by setting 0 to `bufArray` of +VPU_DecRegisterFrameBuffer() and HOST wants to know about the allocated frame +buffer. +@endverbatim +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means registering frame buffer +information was done successfully. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_INVALID_PARAM* :: +The given argument parameter, frameIdx, was invalid, which means frameIdx is +larger than allocated framebuffer. +@endverbatim + */ +RetCode VPU_DecGetFrameBuffer(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() + */ + int frameIdx, /**< [Input] An index of frame + buffer */ + FrameBuffer *frameBuf /**< [output] Allocated + frame buffer address and + information. */ +); +#endif + +/** +* @brief +@verbatim +Before decoding bitstream, HOST application must feed the decoder with +bitstream. To do that, HOST application must know where to put bitstream and the +maximum size. Applications can get the information by calling this function. +This way is more efficient than providing arbitrary bitstream buffer to the +decoder as far as VPU is concerned. + +The given size is the total sum of free space in ring buffer. So when +a HOST application downloads this given size of bitstream, Wrptr could meet the +end of stream buffer. In this case, the HOST application should wrap-around the +Wrptr back to the beginning of stream buffer, and download the remaining bits. +If not, decoder operation could be crashed. +@endverbatim +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information for decoder +stream buffer was received successfully. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not the handle which has been obtained by VPU_DecOpen(). +* `handle` is the handle of an instance which has been closed already, etc. +-- +*RETCODE_INVALID_PARAM* :: +The given argument parameter, pRdptr, pWrptr or size, was invalid, which means +it has a null pointer, or given values for some member variables are improper +values. +@endverbatim +*/ +RetCode VPU_DecGetBitstreamBuffer(DecHandle handle, /**< [Input] A decoder + handle obtained from + VPU_DecOpen() */ + PhysicalAddress *prdPrt, /**< [Output] A + stream buffer read + pointer for the + current decoder + instance */ + PhysicalAddress *pwrPtr, /**< [Output] A + stream buffer + write pointer for + the current + decoder instance + */ + Uint32 *size /**< [Output] A variable + specifying the available space + in bitstream buffer for the + current decoder instance */ +); +/** +* @brief +@verbatim +Before decoding bitstream, HOST application must feed the decoder with +bitstream. To do that, HOST application must know where to put bitstream and the +maximum size. Applications can get the information by calling this function. +This way is more efficient than providing arbitrary bitstream buffer to the +decoder as far as VPU is concerned. + +The given size is the total sum of free space in ring buffer. So when +a HOST application downloads this given size of bitstream, Wrptr could meet the +end of stream buffer. In this case, the HOST application should wrap-around the +Wrptr back to the beginning of stream buffer, and download the remaining bits. +If not, decoder operation could be crashed. +@endverbatim +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information for decoder +stream buffer was received successfully. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not the handle which has been obtained by VPU_DecOpen(). +* `handle` is the handle of an instance which has been closed already, etc. +-- +*RETCODE_INVALID_PARAM* :: +The given argument parameter, pRdptr, pWrptr or size, was invalid, which means +it has a null pointer, or given values for some member variables are improper +values. +@endverbatim +*/ + +/** +* @brief Applications must let decoder know how much bitstream has been +transferred to the address obtained from VPU_DecGetBitstreamBuffer(). By just +giving the size as an argument, API automatically handles pointer wrap-around +and updates the write pointer. +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means putting new stream data was done +successfully. *RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not the handle which has been obtained by VPU_DecOpen(). +* `handle` is the handle of an instance which has been closed already, etc. +-- +*RETCODE_INVALID_PARAM* :: +The given argument parameter, size, was invalid, which means size is larger than +the value obtained from VPU_DecGetBitstreamBuffer(), or than the available space +in the bitstream buffer. +@endverbatim +*/ +RetCode VPU_DecUpdateBitstreamBuffer(DecHandle handle, /**< [Input] A decoder + handle obtained from + VPU_DecOpen() */ + + /** + @verbatim + [Input] + A variable specifying the amount of bits + transferred into bitstream buffer for the current + decoder instance. + + @* 0 : It means that no more bitstream exists to + feed (end of stream). If 0 is set for `size`, VPU + decodes just remaing bitstream and returns -1 to + `indexFrameDisplay`. + @* -1: It allows VPU to continue to decode without + VPU_DecClose(), even after remaining stream has + completely been decoded by + VPU_DecUpdateBitstreamBuffer(handle, 0). This is + especially useful when a sequence changes in the + middle of decoding. + @* -2 : It is for handling exception cases like + error stream or failure of finding frame boundaries + in interrupt mode. If such cases happen, VPU is + unable to continue decoding. If -2 is set for + `size`, VPU decodes until the current write pointer + in the bitstream buffer and then force to end + decoding. (WAVE only) + + @endverbatim + */ + int size); + +/** +* @brief +This function specifies the location of read pointer in bitstream buffer. +It can also set a write pointer with same value of read pointer (addr) when +updateWrPtr is not a zero value, which allows to flush up the bitstream buffer +at once. This function is used to operate bitstream buffer in PicEnd mode. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information of the stream +data to be decoded was received successfully. *RETCODE_FAILURE* :: Operation was +failed, which means there was an error in getting information for configuring +the decoder. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame decoding operation should +be completed by calling VPU_ DecSetRdPtr (). +@endverbatim + */ +RetCode VPU_DecSetRdPtr(DecHandle handle, /**< [Input] A decoder handle obtained + from VPU_DecOpen() */ + PhysicalAddress addr, /**< [Input] Updated read or write + pointer */ + int updateWrPtr /**< [Input] A flag whether to move the + write pointer to where the read + pointer is located */ +); + +/** +* @brief This function is provided to let HOST have a certain level of freedom +for re-configuring decoder operation after creating a decoder instance. Some +options which can be changed dynamically during decoding as the video sequence +has been included. Some command-specific return codes are also presented. +* @return +@verbatim +*RETCODE_INVALID_COMMAND* :: +The given argument, cmd, was invalid, which means the given cmd was undefined, +or not allowed in the current instance. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame decoding operation should +be completed by calling VPU_DecGetOutputInfo(). Even though the result of the +current frame operation is not necessary, HOST application should call +VPU_DecGetOutputInfo() to proceed this function call. +values. +@endverbatim + * @note +@verbatim +The list of commands can be summarized as follows: + +@* ENABLE_ROTATION +@* DIABLE_ROTATION +@* ENABLE_MIRRORING +@* DISABLE_MIRRORING +@* ENABLE_DERING +@* DISABLE_DERING +@* SET_MIRROR_DIRECTION +@* SET_ROTATION_ANGLE +@* SET_ROTATOR_OUTPUT +@* SET_ROTATOR_STRIDE +@* ENABLE_DEC_THUMBNAIL_MODE, +@* DEC_SET_SPS_RBSP +@* DEC_SET_PPS_RBSP +@* ENABLE_REP_USERDATA +@* DISABLE_REP_USERDATA +@* SET_ADDR_REP_USERDATA +@* SET_VIRT_ADDR_REP_USERDATA +@* SET_SIZE_REP_USERDATA +@* SET_USERDATA_REPORT_MODE +@* SET_SEC_AXI +@* SET_DRAM_CONFIG +@* GET_DRAM_CONFIG +@* ENABLE_REP_BUFSTAT +@* DISABLE_REP_BUFSTAT +@* ENABLE_REP_MBPARAM +@* DISABLE_REP_MBPARAM +@* ENABLE_REP_MBMV +@* DISABLE_REP_MBMV +@* SET_ADDR_REP_PICPARAM +@* SET_ADDR_REP_BUF_STATE +@* SET_ADDR_REP_MBMV_DATA +@* SET_CACHE_CONFIG +@* GET_TILEDMAP_CONFIG +@* SET_LOW_DELAY_CONFIG +@* DEC_GET_DISPLAY_OUTPUT_INFO +@* SET_DECODE_FLUSH +@* DEC_SET_FRAME_DELAY +@* DEC_FREE_FRAME_BUFFER +@* DEC_GET_FIELD_PIC_TYPE +@* DEC_ENABLE_REORDER +@* DEC_DISABLE_REORDER +@* DEC_GET_FRAMEBUF_INFO +@* DEC_RESET_FRAMEBUF_INFO +@* DEC_SET_DISPLAY_FLAG +@* DEC_GET_SEQ_INFO +@* ENABLE_LOGGING +@* DISABLE_LOGGING +@* DEC_SET_2ND_FIELD_INFO +@* DEC_ENABLE_AVC_MC_INTERPOL +@* DEC_DISABLE_AVC_MC_INTERPOL + +====== ENABLE_ROTATION +This command enables rotation of the post-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== DISABLE_ROTATION +This command disables rotation of the post-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== ENABLE_MIRRORING +This command enables mirroring of the post-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== DISABLE_MIRRORING +This command disables mirroring of the post-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== ENABLE_DERING +This command enables deringring filter of the post-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== DISABLE_DERING +This command disables deringing filter of the post-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== SET_MIRROR_DIRECTION +This command sets mirror direction of the post-rotator, and `parameter` is +interpreted as a pointer to MirrorDirection. The `parameter` should be one of +MIRDIR_NONE, MIRDIR_VER, MIRDIR_HOR, and MIRDIR_HOR_VER. + +@* MIRDIR_NONE: No mirroring +@* MIRDIR_VER: Vertical mirroring +@* MIRDIR_HOR: Horizontal mirroring +@* MIRDIR_HOR_VER: Both directions + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given mirroring direction is valid. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means given +mirroring direction is invalid. + +====== SET_ROTATION_ANGLE +This command sets counter-clockwise angle for post-rotation, and `parameter` is +interpreted as a pointer to the integer which represents rotation angle in +degrees. Rotation angle should be one of 0, 90, 180, and 270. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given rotation angle is valid. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means given +rotation angle is invalid. + +====== SET_ROTATOR_OUTPUT +This command sets rotator output buffer address, and `parameter` is interpreted +as the pointer of a structure representing physical addresses of YCbCr +components of output frame. For storing the rotated output for display, at least +one more frame buffer should be allocated. When multiple display buffers are +required, HOST application could change the buffer pointer of rotated output at +every frame by issuing this command. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given rotation angle is valid. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means given frame +buffer pointer is invalid. + +====== SET_ROTATOR_STRIDE +This command sets the stride size of the frame buffer containing rotated output, +and `parameter` is interpreted as the value of stride of the rotated output. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given rotation angle is valid. +* RETCODE_INVALID_STRIDE: +The given argument parameter, `parameter`, was invalid, which means given value +of stride is invalid. The value of stride must be greater than 0 and a multiple +of 8. + +====== ENABLE_DEC_THUMBNAIL_MODE +This command decodes only an I-frame of picture from bitstream for using it as a +thumbnail. It requires as little as size of frame buffer since I-picture does +not need any reference picture. If HOST issues this command and sets one frame +buffer address to FrameBuffer array in VPU_DecRegisterFrameBuffer(), only the +frame buffer is used. And please make sure that the number of frame buffer `num` +should be registered as minFrameBufferCount. + +====== DEC_SET_SPS_RBSP +This command applies SPS stream received from a certain +out-of-band reception scheme to the decoder. +The stream should be in RBSP format and in big Endian. +The argument `parameter` is interpreted as a pointer to DecParamSet structure. +In this case, `paraSet` is an array of 32 bits which contains SPS RBSP, and +`size` is the size of the stream in bytes. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means transferring an SPS RBSP to decoder +was done successfully. +* RETCODE_INVALID_COMMAND: +The given argument `cmd` was invalid, which means the given `cmd` was undefined, +or not allowed in the current instance. In this case, current instance might not +be an H.264/AVC decoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means it has a +null pointer, or given values for some member variables are improper values. + +====== DEC_SET_PPS_RBSP +This command applies PPS stream received from a certain +out-of-band reception scheme to the decoder. The stream should be in RBSP format +and in big Endian. The argument `parameter` is interpreted as a pointer to a +DecParamSet structure. In this case, paraSet is an array of 32 bits which +contains PPS RBSP, and `size` is the size of the stream in bytes. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means transferring a PPS RBSP to decoder +was done successfully. +* RETCODE_INVALID_COMMAND: +The given argument `cmd` was invalid, which means the given cmd was undefined, +or not allowed in the current instance. In this case, current instance might not +be an H.264/AVC decoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means it has a +null pointer, or given values for some member variables are improper values. + +====== ENABLE_REP_USERDATA +This command enables user data report. This command ignores `parameter`. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means enabling user data report is done +successfully. +* RETCODE_USERDATA_BUF_NOT_SET: +This means user data buffer address and size have not set yet. + +====== DISABLE_REP_USERDATA +This command disables user data report. This command ignores `parameter` and +returns RETCODE_SUCCESS. + +====== SET_ADDR_REP_USERDATA +This command sets user data buffer address. `parameter` is interpreted as a +pointer to address. This command returns as follows. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given value of address is valid and +setting is done successfully. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` was invalid, which means given value of +address is invalid. The value of address must be greater than 0 and a multiple +of 8. + +====== SET_VIRT_ADDR_REP_USERDATA +This command sets user data buffer address (virtual address) as well as physical +address by using SET_ADDR_REP_USERDATA `parameter` is interpreted as a pointer +to address. This command returns as follows. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given value of address is valid and +setting is done successfully. +* RETCODE_USERDATA_BUF_NOT_SET: +SET_ADDR_REP_USERDATA command was not been executed +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` was invalid, which means given value of +address is invalid. The value of address must be greater than 0 and a multiple +of 8. + +====== SET_SIZE_REP_USERDATA +This command sets the size of user data buffer which is set with +SET_ADDR_REP_USERDATA command. `parameter` is interpreted as a pointer to the +value of size. This command returns RETCODE_SUCCESS. + +According to codec standards, user data type means as below. + +@* H.264/AVC +@** 4 : user_data_registered_itu_t_t35 +@** 5 : user_data_unregistered + +More details are in Annex D of H.264 specifications. + +@* VC1 +@** 31 : Sequence Level user data +@** 30 : Entry-point Level user data +@** 29 : Frame Level user data +@** 28 : Field Level user data +@** 27 : Slice Level user data + +@* MPEG2 +@** 0 : Sequence user data +@** 1 : GOP user data +@** 2 : Picture user data + +@* MPEG4 +@** 0 : VOS user data +@** 1 : VIS user data +@** 2 : VOL user data +@** 3 : GOV user data + +NOTE: This command is available soon. + +The user data size 0 - 15 is used to make offset from userDataBuf Base + 8x17. +It specifies byte size of user data 0 to 15 excluding 0 padding byte, +which exists between user data. So HOST reads 1 user data from +userDataBuf Base + 8x17 + 0 User Data Size + 0 Padding. +Size of 0 padding is (8 - (User Data Size % 8))%8. + +====== SET_USERDATA_REPORT_MODE +TBD + +====== SET_SEC_AXI +This command sets the secondary channel of AXI for saving memory bandwidth to +dedicated memory. The argument `parameter` is interpreted as a pointer to +SecAxiUse which represents an enable flag and physical address which is related +with the secondary channel for BIT processor, IP/AC-DC predictor, de-blocking +filter, overlap filter respectively. + +This command has one of the following return codes:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given value for setting secondary +AXI is valid. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means given value +is invalid. + +====== SET_DRAM_CONFIG +TBD + +====== GET_DRAM_CONFIG +TBD + +====== ENABLE_REP_BUFSTAT +This command enables frame buffer status report. This command ignores +`parameter` and returns RETCODE_SUCCESS. + +If this option is enabled, frame buffer status is reported. +Each frame buffers can be used for display, reference or not used. Decoder +reports the status of each frame buffer by using 4 bits [3:0] + +@* [3] Not used +@* [2] USE_DIS +@* [1] USE_REF +@* [0] Not used + +For example, if the value of frame buffer status is 6, then the frame buffer is +used for reference and display. If 4, the frame buffer is used for display and +is not used for reference. + +In H.264/AVC, bit field definition is as bellows: + +@* [3] Not used +@* [2] USE_DIS +@* [1] USE_OUT +@* [0] USE_REF + +If USE_OUT is 1, it means that the Frame is in DPB buffer. + +====== DISABLE_REP_BUFSTAT +This command disables frame buffer status report. This command ignores +`parameter` and returns RETCODE_SUCCESS. + +====== ENABLE_REP_MBPARAM +This command enables MB Parameter report. This command ignores `parameter` and +returns RETCODE_SUCCESS. + +If this option is enabled, error flag, Slice Boundary and QP are reported using +8 bits. + +@* [7] : Error Map. If error is detected in macroblock decoding, this bit field +is set to 1. +@* [6] : Slice Boundary. Whenever new slice header is decoded, this bit field is +toggled. +@* [5:0] : An macroblock QP value + +====== DISABLE_REP_MBPARAM +This command disables MB Parameter report. This command ignores `parameter` and +returns RETCODE_SUCCESS. + +====== ENABLE_REP_MV +This command enables MV report. This command ignores `parameter` and returns +RETCODE_SUCCESS. + +If this option is enabled, decoder reports 1 motion vector for P picture and 2 +motion vectors for B picture. + +====== DISABLE_REP_MV +This command disables MV report. This command ignores `parameter` and returns +RETCODE_SUCCESS. + +====== SET_ADDR_REP_PICPARAM +This command sets the address of picture parameter base. `parameter` is +interpreted as a pointer to a address. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given value of address is valid and +setting is done successfully. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means given value +of address is invalid. The value of address must be greater than 0 and a +multiple of 8. + +To report frame buffer status, MB parameter and Motion vector, VPU reads the +base addresses of external memory, which are specified by PicParaBaseAddr. + +[[dec_picparam_address_struct]] +.Decoder Picture parameter base address structure +ifdef::pdf[] +image::../figure/dec_picparam_address_struct.svg["Decoder Picture parameter base +address structure", width=300] endif::pdf[] ifdef::html[] +image::../figure/dec_picparam_address_struct.png[Decoder Picture parameter base +address structure] endif::html[] + +When `picUserDataEnable`, `mvReportEnable`, `mbParamEnable` or `frmBufStaEnable` +in CMD_DEC_PIC_OPTION register are enabled, HOST application should specify +buffer addresses in +<>. +VPU reports each data and fills info, Data Size and MV num fields to + these buffer addresses of external memory. For VPU to report data +properly, HOST application needs to specify these 3 buffer addresses preserving +8 byte alignment and buffer sizes need to be multiples of 256. + +====== SET_ADDR_REP_BUF_STATE + +This command sets the buffer address of frame buffer status. The `parameter` is +interpreted as a pointer to the address. + +This command has one of the following return codes:: + +* RETCODE_SUCCESS: Operation was done successfully, which means given value of +address is valid and setting is done successfully. +* RETCODE_INVALID_PARAM: The given argument parameter, `parameter`, was invalid, +which means given value of address is invalid. The value of address must be +greater than 0 and a multiple of 8. + +====== SET_ADDR_REP_MBMV_DATA + +This command sets the buffer address of motion vector information reporting +array. The `parameter` is interpreted as a pointer to the address. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: Operation was done successfully, which means given value of +address is valid and setting is done successfully. +* RETCODE_INVALID_PARAM: The given argument parameter, `parameter`, was invalid, +which means given value of address is invalid. The value of address must be +greater than 0 and a multiple of 8. + +The motion vector information reporting array consists of below fields for each +macroblock. The array element has 32 bit data per a macroblock. + +.Description of SET_ADDR_REP_MBMV_DATA +[separator="|", frame="all", grid="all"] +`15`20`65_80 +Bit range | Field name | Description +________________________________________________________________________________ +31 | Inter MB | A flag to indicate whether the macroblock is +inter macroblock or not 29:16 | Mv X | Signed motion vector +value for X axis 13:00 | Mv Y | Signed motion vector value for Y +axis +________________________________________________________________________________ + +====== SET_CACHE_CONFIG + +This command sets the configuration of cache. The `parameter` is interpreted as +a pointer to MaverickCacheConfig. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given value is valid and setting is +done successfully. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid. The value of address +must be not zero. + +====== GET_TILEDMAP_CONFIG +This command gets tiled map configuration according to `TiledMapConfig` +structure. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given value is valid and setting is +done successfully. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means it has a +null pointer, or given values for some member variables are improper values. + +====== SET_LOW_DELAY_CONFIG +This command sets the low delay decoding options which enable low delay decoding +and indicate the number of MB row. The argument `parameter` is interpreted as a +pointer to LowDelayInfo which represents an enable flag and the number of MB +row. If low delay decoding is enabled, VPU sends an interrupt and +indexFrameDisplay to HOST when the number of MB row decoding is done. If the +interrupt is issued, HOST should clear the interrupt and read indexFrameDisplay +from the RET_DEC_PIC_FRAME_IDX register in order to display. + +====== DEC_GET_DISPLAY_OUTPUT_INFO +HOST can get decoder output information according to display index in +DecOutputInfo structure. HOST can set display index using member variable +`indexFrameDisplay`. This command returns RETCODE_SUCCESS. + +* Example code +......................................................................... +DecOutputInfo decOutputInfo; +decOutputInfo. indexFrameDisplay = disp_index; +VPU_DecGiveCommand(handle, DEC_GET_DISPLAY_OUTPUT_INFO, & decOutputInfo); +......................................................................... + +====== SET_DECODE_FLUSH +This command is used to change bitstream buffer mode from Interrupt mode to +Picture End mode. When HOST receives an interrupt about bistream buffer empty in +Interrupt Mode, but there is no more bitstream for the current frame in +bitstream buffer, this command completes decoding only with remaining bitstream. + +This command returns RETCODE_SUCCESS. + +====== DEC_SET_FRAME_DELAY +HOST can set the number of frame to be delayed before display (H.264/AVC only) +by using this command. This command is useful when display frame buffer delay is +supposed to happen for buffering decoded picture reorder and HOST is sure of +that. Unless this command is executed, VPU has display frame buffer delay as +frameBufDelay value of DecInitialInfo structure. + +====== DEC_FREE_FRAME_BUFFER +HOST can free all the frame buffers allocated by VPUAPI. +This command is useful when VPU detects sequence change. +For example, if HOST knows resolution change while decoding through +`sequenceChanged` variable of DecOutputInfo structure, HOST should change the +size of frame buffer accordingly. This command is used to release the frame +buffers allocated for the previous sequence. Then VPU_DecGetInitialInfo() and +VPU_DecIsseuSeqInit() are called before frame buffer allocation for a new +sequence. + +====== DEC_SET_DISPLAY_FLAG +Applications can set a display flag for each frame buffer by calling this +function after creating decoder instance. If a certain display flag of frame +buffer is set, the frame buffer cannot be used in the decoding process. +Applications can control displaying a buffer with this command to prevent VPU +from using buffer in every decoding process. + +This command is the opposite of what VPU_DecClrDispFlag() does. +All of buffer flags are initialized with 0x00000000 which means being able to +decode. Unless it is called, VPU starts decoding with available frame buffer +that has been cleared in round robin order. + +====== DEC_GET_SEQ_INFO +This command returns the information of the current sequence in the form of +<> structure. HOST can get this information with more +accuracy after VPU_DecIssueSeqInit() or VPU_DecGetOutputInfo() is called. + +====== ENABLE_LOGGING +HOST can activate message logging once VPU_DecOpen() or VPU_EncOpen() is called. + +====== DISABLE_LOGGING +HOST can deactivate message logging which is off as default. + +====== DEC_ENABLE_AVC_MC_INTERPOL +This is option for enable fast MC interpolation. this command is only used for +H.264/AVC decoder. + +====== DEC_DISABLE_AVC_MC_INTERPOL +This is option for disable fast MC interpolation. this command is only used for +H.264/AVC decoder. + +====== DEC_SET_2ND_FIELD_INFO +This command sets bistream buffer information for a second field after a first +field has been decoded. In case of H.264/AVC, MPEG2, or VC1 decoder, they issue +an INT_BIT_DEC_FIELD interrupt after first field decoding. This command then can +give VPU the address and size of bitstream buffer for a second field. This +commands is used when first field and second field are in separate bistreams - +not together in a bitstream. If HOST gives this command and clears the +INT_BIT_DEC_FIELD interrupt, VPU starts decoding from the given base address +until the size of bitstream buffer. + +====== DEC_GET_FIELD_PIC_TYPE +This command gets a field picture type of decoded picture after +INT_BIT_DEC_FIELD interrupt is issued. + +====== DEC_ENABLE_REORDER +HOST can enable display buffer reordering when decoding H.264 streams. In H.264 +case output decoded picture may be re-ordered if pic_order_cnt_type is 0 or 1. +In that case, decoder must delay output display for re-ordering but some +applications (ex. video telephony) do not want such display delay. + +====== DEC_DISABLE_REORDER +HOST can disable output display buffer reorder-ing. Then BIT processor does not +re-order output buffer when pic_order_cnt_type is 0 or 1. If In H.264/AVC case. +pic_order_cnt_type is 2 or the other standard case, this flag is ignored because +output display buffer reordering is not allowed. + +====== DEC_GET_FRAMEBUF_INFO +This command gives HOST the information of framebuffer in the form of +DecGetFramebufInfo structure. + +====== DEC_RESET_FRAMEBUF_INFO +This command resets the information of framebuffer. +Unlike DEC_FREE_FRAME_BUFFER, it does not release the assigned memory itself. +This command is used for sequence change along with DEC_GET_FRAMEBUF_INFO. + +====== ENABLE_REP_CUDATA +This command enables to report CU data. + +====== DISABLE_REP_CUDATA +This command disables to report CU data. + +====== SET_ADDR_REP_CUDATA +This command sets the address of buffer where CU data is written. + +====== SET_SIZE_REP_CUDATA +This command sets the size of buffer where CU data is written. + +====== DEC_SET_WTL_FRAME_FORMAT +This command sets FrameBufferFormat for WTL. + +====== DEC_SET_AVC_ERROR_CONCEAL_MODE +This command sets error conceal mode for H.264 decoder. +This command must be issued through VPU_DecGiveCommand() before calling +VPU_DecGetInitialInfo() or VPU_DecIssueSeqInit(). In other words, error conceal +mode cannot be applied once a sequence initialized. + +@* AVC_ERROR_CONCEAL_MODE_DEFAULT - VPU performs error concealment in default +mode. +@* AVC_ERROR_CONCEAL_MODE_ENABLE_SELECTIVE_CONCEAL_MISSING_REFERENCE - +VPU performs error concealment using another framebuffer if the error comes from +missing reference frame. +@* AVC_ERROR_CONCEAL_MODE_DISABLE_CONCEAL_MISSING_REFERENCE - +VPU does not perform error concealment if the error comes from missing reference +frame. +@* AVC_ERROR_CONCEAL_MODE_DISABLE_CONCEAL_WRONG_FRAME_NUM - +VPU does not perform error concealment if the error comes from wrong frame_num +syntax. + +====== DEC_GET_SCALER_INFO +This command returns setting information to downscale an image such as enable, +width, and height. + +====== DEC_SET_SCALER_INFO +This command sets information to downscale an image such as enable, width, and +height. + +====== DEC_SET_TARGET_TEMPORAL_ID +This command decodes only a frame whose temporal id is equal to or less than the +given target temporal id. + +NOTE: It is only for H.265/HEVC decoder. + +====== DEC_SET_BWB_CUR_FRAME_IDX +This command specifies the index of linear frame buffer which needs to be +changed to due to change of inter-frame resolution while decoding. + +NOTE: It is only for VP9 decoder. + +====== DEC_SET_FBC_CUR_FRAME_IDX +This command specifies the index of FBC frame buffer which needs to be changed +to due to change of inter-frame resolution while decoding. + +NOTE: It is only for VP9 decoder. + +====== DEC_SET_INTER_RES_INFO_ON +This command informs inter-frame resolution has been changed while decoding. +After this command issued, VPU reallocates one frame buffer for the change. + +NOTE: It is only for VP9 decoder. + +====== DEC_SET_INTER_RES_INFO_OFF +This command releases the flag informing inter-frame resolution change. +It should be issued after reallocation of one frame buffer is completed. + +NOTE: It is only for VP9 decoder. + +====== DEC_FREE_FBC_TABLE_BUFFER +This command frees one FBC table to deal with inter-frame resolution change. + +NOTE: It is only for VP9 decoder. + +====== DEC_FREE_MV_BUFFER +This command frees one MV buffer to deal with inter-frame resolution change. + +NOTE: It is only for VP9 decoder. + +====== DEC_ALLOC_FBC_Y_TABLE_BUFFER +This command allocates one FBC luma table to deal with inter-frame resolution +change. + +NOTE: It is only for VP9 decoder. + +====== DEC_ALLOC_FBC_C_TABLE_BUFFER +This command allocates one FBC chroma table to deal with inter-frame resolution +change. + +NOTE: It is only for VP9 decoder. + +====== DEC_ALLOC_MV_BUFFER +This command allocates one MV buffer to deal with inter-frame resolution change. + +NOTE: It is only for VP9 decoder. + +@endverbatim +*/ +RetCode VPU_DecGiveCommand(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() */ + CodecCommand cmd, /**< [Input] A variable specifying + the given command of CodecComand + type */ + void *parameter /**< [Input/Output] A pointer to + command-specific data structure + which describes picture I/O + parameters for the current decoder + instance */ +); + +/** +* @brief +This function sets the secondary channel of AXI for saving memory bandwidth to +dedicated memory. It works same as SET_SEC_AXI command which is only able to be +called before VPU_DecRegisterFramebuffer(). This function can be called before +VPU_DecStartOneFrame() to change information about the secondary channel of AXI. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means given value for setting secondary +AXI is valid. *RETCODE_FRAME_NOT_COMPLETE* :: This means frame decoding +operation was not completed yet, so the given API function call cannot be +allowed. *RETCODE_INSUFFICIENT_RESOURCE* :: This means that VPU cannot allocate +memory due to lack of memory. *RETCODE_VPU_RESPONSE_TIMEOUT* :: This means that +VPU response time is too long, time out. *RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame decoding operation should +be completed by calling VPU_ DecSetRdPtr (). +@endverbatim + */ +RetCode VPU_DecConfigSecondAxi(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() + */ + int stride, /**< [Input] Width of framebuffer */ + int height /**< [Input] Height of framebuffer */ +); + +/** + * @brief This function starts decoding one frame. Returning from this +function does not mean the completion of decoding one frame, and it is just that +decoding one frame was initiated. Every call of this function should be matched +with VPU_DecGetOutputInfo() with the same handle. Without calling a pair of +these funtions, HOST cannot call any other API functions except for +VPU_IsBusy(), VPU_DecGetBitstreamBuffer(), and VPU_DecUpdateBitstreamBuffer(). + * +* @return +@verbatim +*RETCODE_SUCCESS* :: ++ +-- +Operation was done successfully, which means decoding a new frame was started +successfully. + +NOTE: This return value does not mean that decoding a frame was completed +successfully. +-- +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame decoding operation should +be completed by calling VPU_DecGetOutputInfo(). Even though the result of the +current frame operation is not necessary, HOST should call +VPU_DecGetOutputInfo() to proceed this function call. +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. A HOST might call this +function before successfully calling VPU_DecRegisterFrameBuffer(). This function +should be called after calling VPU_ DecRegisterFrameBuffer() successfully. +@endverbatim + */ +RetCode VPU_DecStartOneFrame(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() */ + DecParam *param /**< [Input] A pointer to a + DecParam type structure which + describes picture decoding + parameters for the given decoder + instance */ +); + +/** + * @brief VPU returns the result of decoding which +includes information on decoded picture, syntax value, frame buffer, other +report values, and etc. HOST should call this function after frame decoding is +finished and before starting the further processing. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means receiving the output information of +the current frame was done successfully. *RETCODE_FAILURE* :: Operation was +failed, which means there was an error in getting information for configuring +the decoder. *RETCODE_INVALID_HANDLE* :: This means argument handle is invalid. +This includes cases where `handle` is not a handle which has been obtained by +VPU_DecOpen(), `handle` is a handle to an instance already closed, or `handle` +is a handle to a decoder instance. Also, this value is returned when +VPU_DecStartOneFrame() is matched with VPU_DecGetOutputInfo() with different +handles. *RETCODE_INVALID_PARAM* :: The given argument parameter, pInfo, was +invalid, which means it has a null pointer, or given values for some member +variables are improper values. +@endverbatim + */ +RetCode VPU_DecGetOutputInfo(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() */ + DecOutputInfo *info /**< [Output] A pointer to a + DecOutputInfo type structure + which describes picture + decoding results for the + current decoder instance. */ +); + +/** +* @brief +@verbatim +This function flushes all of the decoded framebuffer contexts that remain in +decoder firmware. It is used to start seamless decoding operation without +randome access to the buffer or calling VPU_DecClose(). + +NOTE: In WAVE4, this function returns all of the decoded framebuffer contexts +that remain. pRetNum always has 0 in CODA9. +@endverbatim +* +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means receiving the output information of +the current frame was done successfully. *RETCODE_FRAME_NOT_COMPLETE* :: This +means frame decoding operation was not completed yet, so the given API function +call cannot be performed this time. A frame decoding operation should be +completed by calling VPU_DecGetOutputInfo(). Even though the result of the +current frame operation is not necessary, HOST should call +VPU_DecGetOutputInfo() to proceed this function call. +*RETCODE_INVALID_HANDLE* :: +This means argument handle is invalid. This includes cases where `handle` is not +a handle which has been obtained by VPU_DecOpen(), `handle` is a handle to an +instance already closed, or `handle` is a handle to an decoder instance. +Also,this value is returned when VPU_DecStartOneFrame() is matched with +VPU_DecGetOutputInfo() with different handles. +*RETCODE_VPU_RESPONSE_TIMEOUT* :: +Operation has not recieved any response from VPU and has timed out. +@endverbatim + */ +RetCode VPU_DecFrameBufferFlush(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() + */ + DecOutputInfo *pRemainingInfo, /**< [Output] + All of the + decoded + framebuffer + contexts are + stored in + display order + as array of + DecOutputInfo. + If + this is NULL, + the remaining + information is + not returned. + */ + Uint32 *pRetNum /**< [Output] The number of the + decoded frame buffer + contexts. It this is null, + the information is not + returned. */ +); + +/** +* @brief This function clears a display flag of frame buffer. +If display flag of frame buffer is cleared, the +frame buffer can be reused in the decoding process. With VPU_DecClrDispFlag(), +HOST application can control display of frame buffer marked with the display +index which is given by VPU. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means receiving the output information of +the current frame was done successfully. *RETCODE_INVALID_HANDLE* :: This means +argument handle is invalid. This includes cases where `handle` is not a handle +which has been obtained by VPU_DecOpen(), `handle` is a handle to an instance +already closed, or `handle` is a handle to an decoder instance. Also,this value +is returned when VPU_DecStartOneFrame() is matched with VPU_DecGetOutputInfo() +with different handles. *RETCODE_WRONG_CALL_SEQUENCE* :: This means the current +API function call was invalid considering the allowed sequences between API +functions. It might happen because VPU_DecRegisterFrameBuffer() with the same +handle was not called before calling this function. *RETCODE_INVALID_PARAM* :: +The given argument parameter, index, was invalid, which means it has improper +values. +@endverbatim + */ +RetCode VPU_DecClrDispFlag(DecHandle handle, /**< [Input] A decoder handle + obtained from VPU_DecOpen() */ + int index /**< [Input] A frame buffer index to be + cleared */ +); + +// function for encode +/** +* @brief In order to start a new encoder operation, HOST application must +open a new instance for this encoder operation. By calling this function, HOST +application can get a handle specifying a new encoder instance. Because VPU +supports multiple instances of codec operations, HOST application needs this +kind of handles for the all codec instances now on running. Once a HOST +application gets a handle, the HOST application must use this handle to +represent the target instances for all subsequent encoder-related functions. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means a new encoder instance was opened +successfully. + +*RETCODE_FAILURE* :: +Operation was failed, which means getting a new encoder instance was not done +successfully. If there is no free instance anymore, this value is returned +in this function call. + +*RETCODE_INVALID_PARAM* :: +The given argument parameter, pOpenParam, was invalid, which means it has a null +pointer, or given values for some member variables are improper values. + +*RETCODE_NOT_INITIALIZED* :: +VPU was not initialized at all before calling this function. Application should +initialize VPU by calling VPU_Init() before calling this function. +@endverbatim +*/ + +RetCode VPU_EncOpen(EncHandle *handle, /**< [Output] A pointer to a EncHandle + type variable which specifies each + instance for HOST application. If no + instance is available, null handle is + returned. */ + EncOpenParam *encOpParam /**< [Input] A pointer to a + EncOpenParam type structure + which describes required + parameters for creating a new + encoder instance. */ +); + +/** +* @brief When HOST application finished encoding operations and wanted to +release this instance for other processing, the HOST application should close +this instance by calling this function. After completion of this function call, +the instance referred to by pHandle gets free. Once HOST application closes an +instance, the HOST application cannot call any further encoder-specific function +with the current handle before re-opening a new instance with the same handle. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully. That means the current encoder instance was +closed successfully. + +*RETCODE_INVALID_HANDLE* :: +This means the given handle for the current API function call, pHandle, was +invalid. This return code might be caused if ++ +-- +* pHandle is not a handle which has been obtained by VPU_EncOpen(). +* pHandle is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding or encoding operation was not completed yet, so the +given API function call cannot be performed this time. A frame encoding or +decoding operation should be completed by calling VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo(). Even though the result of the current frame operation is +not necessary, HOST application should call VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo() to proceed this function call. + +*RETCODE_VPU_RESPONSE_TIMEOUT* :: +Operation has not recieved any response from VPU and has timed out. +@endverbatim +*/ +RetCode VPU_EncClose(EncHandle handle /**< [Input] An encoder handle obtained + from VPU_EncOpen() */ +); + +/** +* @brief Before starting encoder operation, HOST application must allocate +frame buffers according to the information obtained from this function. This +function returns the required parameters for VPU_EncRegisterFrameBuffer(), which +follows right after this function call. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means receiving the initial parameters +was done successfully. + +*RETCODE_FAILURE* :: +Operation was failed, which means there was an error in getting information for +configuring the encoder. + +*RETCODE_INVALID_HANDLE* :: +This means the given handle for the current API function call, pHandle, was +invalid. This return code might be caused if + +* pHandle is not a handle which has been obtained by VPU_EncOpen(). +* pHandle is a handle of an instance which has been closed already, etc. + +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding or encoding operation was not completed yet, so the +given API function call cannot be performed this time. A frame encoding or +decoding operation should be completed by calling VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo(). Even though the result of the current frame operation is +not necessary, HOST application should call VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo() to proceed this function call. + +*RETCODE_INVALID_PARAM* :: +The given argument parameter, pInitialInfo, was invalid, which means it has a +null pointer, or given values for some member variables are improper values. + +*RETCODE_CALLED_BEFORE* :: +This function call is invalid which means multiple calls of the current API +function for a given instance are not allowed. In this case, encoder initial +information has been received already, so that this function call is meaningless +and not allowed anymore. + +*RETCODE_VPU_RESPONSE_TIMEOUT* :: +Operation has not recieved any response from VPU and has timed out. +@endverbatim +*/ +RetCode +VPU_EncGetInitialInfo(EncHandle handle, /**< [Input] An encoder handle obtained + from VPU_EncOpen() */ + EncInitialInfo *encInitInfo /**< [Output] Minimum number + of frame buffer for this + encoder instance */ +); + +/** +* @brief +@verbatim +This function registers frame buffers requested by VPU_EncGetInitialInfo(). The +frame buffers pointed to by pBuffer are managed internally within VPU. +These include reference frames, reconstructed frames, etc. Applications must not +change the contents of the array of frame buffers during the life time of the +instance, and `num` must not be less than minFrameBufferCount obtained by +VPU_EncGetInitialInfo(). + +The distance between a pixel in a row and the corresponding pixel in the next +row is called a stride. The value of stride must be a multiple of 8. The +address of the first pixel in the second row does not necessarily coincide with +the value next to the last pixel in the first row. In other words, a stride can +be greater than the picture width in pixels. + +Applications should not set a stride value smaller than the picture width. +So, for Y component, HOST application must allocate at least a space of size +(frame height \* stride), and Cb or Cr component, +(frame height/2 \* stride/2), respectively. +But make sure that in Cb/Cr non-interleave (separate Cb/Cr) map, +a stride for the luminance frame buffer should be multiple of 16 so that a +stride for the luminance frame buffer becomes a multiple of 8. +@endverbatim +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means registering frame buffers were done +successfully. + +*RETCODE_INVALID_HANDLE* :: +This means the given handle for the current API function call, pHandle, was +invalid. This return code might be caused if + +* handle is not a handle which has been obtained by VPU_EncOpen(). +* handle is a handle of an instance which has been closed already, etc. + +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding or encoding operation was not completed yet, so the +given API function call cannot be performed this time. A frame encoding or +decoding operation should be completed by calling VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo(). Even though the result of the current frame operation is +not necessary, HOST application should call VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo() to proceed this function call. + +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. HOST application might call this +function before calling VPU_EncGetInitialInfo() successfully. This function +should be called after successful calling of VPU_EncGetInitialInfo(). + +*RETCODE_INVALID_FRAME_BUFFER* :: +This means argument pBuffer were invalid, which means it was not initialized +yet or not valid anymore. + +*RETCODE_INSUFFICIENT_FRAME_BUFFERS* :: +This means the given number of frame buffers, num, was not enough for the +encoder operations of the given handle. It should be greater than or equal to +the value of minFrameBufferCount obtained from VPU_EncGetInitialInfo(). + +*RETCODE_INVALID_STRIDE* :: +This means the given argument stride was invalid, which means it is 0, or is not +a multiple of 8 in this case. + +*RETCODE_CALLED_BEFORE* :: +This function call is invalid which means multiple calls of the current API +function for a given instance are not allowed. It might happen when registering +frame buffer for this instance has been done already so that this function call +is meaningless and not allowed anymore. + +*RETCODE_VPU_RESPONSE_TIMEOUT* :: +Operation has not recieved any response from VPU and has timed out. +@endverbatim +*/ +RetCode VPU_EncRegisterFrameBuffer(EncHandle handle, /**< [Input] An encoder + handle obtained from + VPU_EncOpen() */ + FrameBuffer *bufArray, /**< [Input] Allocated + frame buffer + address and + information. If + this parameter is + set to -1, VPU + allocates frame + buffers. */ + int num, /**< [Input] A number of frame + buffers. VPU can allocate frame + buffers as many as this given + value. */ + int stride, /**< [Input] A stride value of + the given frame buffers */ + int height, /**< [Input] Frame height */ + int mapType /**< [Input] Map type of frame + buffer */ +); + +/** +* @brief This is a special function that enables HOST application to allocate +directly the frame buffer for encoding or for Pre-processor (PRP) such as +Rotator. In normal operation, VPU API allocates frame buffers when the argument +`bufArray` in VPU_EncRegisterFrameBuffer() is set to 0. However, for any other +reason HOST application can use this function to allocate frame buffers by +themselves. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means the framebuffer is allocated +successfully. + +*RETCODE_INVALID_HANDLE* :: +This means the given handle for the current API function call, pHandle, was +invalid. This return code might be caused if ++ +-- +* handle is not a handle which has been obtained by VPU_EncOpen(). +* handle is a handle of an instance which has been closed already, etc. +-- +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. It might happen because +VPU_EncRegisterFrameBuffer() for (FramebufferAllocType.FB_TYPE_CODEC) has not +been called, before this function call for allocating frame buffer for PRP +(FramebufferAllocType.FB_TYPE_PPU). + +*RETCODE_INSUFFICIENT_RESOURCE* :: +Fail to allocate a framebuffer due to lack of memory + +*RETCODE_INVALID_PARAM* :: +The given argument parameter, index, was invalid, which means it has improper +values +@endverbatim +*/ +RetCode VPU_EncAllocateFrameBuffer(EncHandle handle, /**< [Input] An encoder + handle obtained from + VPU_EncOpen() */ + FrameBufferAllocInfo info, /**< [Input] + Information + required for + frame bufer + allocation */ + FrameBuffer *frameBuffer /**< [Output] Data + structure that + holds information + of allocated + frame buffers */ +); + +#ifdef REDUNDENT_CODE +/** +* @brief +@verbatim +This function gets the frame buffer information that was allocated by +VPU_EncRegisterFrameBuffer() function. + +It does not affect actual encoding and simply does obtain the information of +frame buffer. This function is more helpful especially when frame buffers are +automatically assigned by setting 0 to `bufArray` of +VPU_EncRegisterFrameBuffer() and HOST wants to know about the allocated frame +buffer. +@endverbatim +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means registering frame buffer +information was done successfully. + +*RETCODE_INVALID_HANDLE* :: +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if ++ +-- +* `handle` is not a handle which has been obtained by VPU_DecOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- + +*RETCODE_INVALID_PARAM* :: +The given argument parameter, frameIdx, was invalid, which means frameIdx is +larger than allocated framebuffer. +@endverbatim +*/ +RetCode VPU_EncGetFrameBuffer(EncHandle handle, /**< [Input] An encoder handle + obtained from VPU_EncOpen() + */ + int frameIdx, /**< [Input] An index of frame + buffer */ + FrameBuffer *frameBuf /**< [output] Allocated + frame buffer address and + information */ +); +#endif + +/** +* @brief This function is provided to let HOST application have a certain +level of freedom for re-configuring encoder operation after creating an encoder +instance. Some options which can be changed dynamically during encoding as the +video sequence has been included. Some command-specific return codes are also +presented. +* @return +@verbatim +*RETCODE_INVALID_COMMAND* :: +This means the given argument, cmd, was invalid which means the given cmd was +undefined, or not allowed in the current instance. + +*RETCODE_INVALID_HANDLE* :: +This means the given handle for the current API function call, pHandle, was +invalid. This return code might be caused if ++ +-- +* pHandle is not a handle which has been obtained by VPU_EncOpen(). +* pHandle is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding or encoding operation was not completed yet, so the +given API function call cannot be performed this time. A frame encoding or +decoding operation should be completed by calling VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo(). Even though the result of the current frame operation is +not necessary, HOST application should call VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo() to proceed this function call. +@endverbatim +* @note +@verbatim +The list of commands can be summarized as follows: + +@* ENABLE_ROTATION +@* DIABLE_ROTATION +@* ENABLE_MIRRORING +@* DISABLE_MIRRORING +@* SET_MIRROR_DIRECTION +@* SET_ROTATION_ANGLE +@* ENC_ADD_PPS +@* ENC_SET_ACTIVE_PPS +@* ENC_GET_ACTIVE_PPS +@* ENC_PUT_VIDEO_HEADER +@* ENC_PUT_MP4_HEADER +@* ENC_PUT_AVC_HEADER +@* ENC_GET_VIDEO_HEADER +@* ENC_SET_INTRA_MB_REFRESH_NUMBER +@* ENC_ENABLE_HEC +@* ENC_DISABLE_HEC +@* ENC_SET_SLICE_INFO +@* ENC_SET_GOP_NUMBER +@* ENC_SET_INTRA_QP +@* ENC_SET_BITRATE +@* ENC_SET_FRAMERATE +@* ENC_SET_SEARCHRAM_PARAM +@* ENC_SET_REPORT_MBINFO +@* ENC_SET_REPORT_MVINFO +@* ENC_SET_REPORT_SLICEINFO +@* ENC_SET_PIC_PARA_ADDR +@* SET_SEC_AXI +@* ENABLE_LOGGING +@* DISABLE_LOGGING +@* ENC_CONFIG_SUB_FRAME_SYNC +@* ENC_SET_SUB_FRAME_SYNC + +====== ENABLE_ROTATION +This command enables rotation of the pre-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== DIABLE_ROTATION +This command disables rotation of the pre-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== ENABLE_MIRRORING +This command enables mirroring of the pre-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== DISABLE_MIRRORING +This command disables mirroring of the pre-rotator. +In this case, `parameter` is ignored. This command returns RETCODE_SUCCESS. + +====== SET_MIRROR_DIRECTION +This command sets mirror direction of the pre-rotator, and `parameter` is +interpreted as a pointer to MirrorDirection. +The `parameter` should be one of MIRDIR_NONE, MIRDIR_VER, MIRDIR_HOR, and +MIRDIR_HOR_VER. + +@* MIRDIR_NONE: No mirroring +@* MIRDIR_VER: Vertical mirroring +@* MIRDIR_HOR: Horizontal mirroring +@* MIRDIR_HOR_VER: Both directions + +This command has one of the following return codes:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given mirroring direction is valid. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means given +mirroring direction is invalid. + +====== SET_ROTATION_ANGLE +This command sets counter-clockwise angle for post-rotation, and `parameter` is +interpreted as a pointer to the integer which represents +rotation angle in degrees. Rotation angle should be one of 0, 90, 180, and 270. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given rotation angle is valid. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means given +rotation angle is invalid. + +NOTE: Rotation angle could not be changed after sequence initialization, because +it might cause problems in handling frame buffers. + +====== ENC_ADD_PPS +This command adds PPS header syntax of AVC/H.264 bitstream + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header +syntax was successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument cmd was invalid +which means the given cmd was undefined, or not allowed in the current instance. +In this case, the current instance might not be an H.264/AVC encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` was invalid, which means +it has a null pointer, or given values for some member variables are improper +values. + +====== ENC_SET_ACTIVE_PPS +This command sets active PPS header syntax of AVC/H.264 bitstream, and +`parameter` is interpreted ] as an active PPS index. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header +syntax was successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument cmd was invalid +which means the given cmd was undefined, or not allowed in the current instance. +In this case, the current instance might not be an MPEG4 encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` was invalid, which means +it has a null pointer, or given values for some member variables are improper +values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. + +====== ENC_GET_ACTIVE_PPS +This command gets active PPS header syntax of AVC/H.264 bitstream, and +`parameter` is interpreted as an active PPS index. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header +syntax was successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument cmd was invalid +which means the given cmd was undefined, or not allowed in the current instance. +In this case, the current instance might not be an MPEG4 encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` was invalid, which means +it has a null pointer, or given values for some member variables are improper +values. + +====== ENC_PUT_VIDEO_HEADER +This command inserts an MPEG4 header syntax or SPS or PPS to the AVC/H.264 +bitstream to the bitstream during encoding. The argument `parameter` is +interpreted as a pointer to EncHeaderParam structure holding + +* buf is a physical address pointing the generated stream location +* size is the size of generated stream in bytes +* headerType is a type of header that HOST application wants to generate and +have values as VOL_HEADER, VOS_HEADER,, VO_HEADER, SPS_RBSP or PPS_RBSP. + +This command has one of the following return codes.:: ++ +-- +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header +syntax was successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument cmd was invalid +which means the given cmd was undefined, or not allowed in the current instance. +In this case, the current instance might not be an MPEG4 encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or headerType +was invalid, which means it has a null pointer, or given values for some member +variables are improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. +-- + +====== ENC_PUT_MP4_HEADER +This command inserts an MPEG4 header syntax to the bitstream during encoding. +The argument `parameter` is interpreted as a pointer to EncHeaderParam +structure holding + +* `buf` is a physical address pointing the generated stream +location +* `size` is the size of generated stream in bytes +* `headerType` is a type of header that HOST application wants to generate and +have values as VOL_HEADER, VOS_HEADER, or VO_HEADER. + +This command has one of the following return codes.:: ++ +-- +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument `cmd` was invalid which means the given cmd was +undefined, or not allowed in the current instance. In this case, the current +instance might not be an MPEG4 encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or `headerType` was invalid, which +means it has a null pointer, or given values for some member variables are +improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. +-- + +====== ENC_PUT_AVC_HEADER +This command inserts an SPS or PPS to the AVC/H.264 bitstream during encoding. + +The argument `parameter` is interpreted as a pointer to EncHeaderParam +structure holding + +* buf is a physical address pointing the generated stream location +* size is the size of generated stream in bytes +* headerType is type of header that HOST application wants to generate and have +values as SPS_RBSP or PPS_RBSP. + +This command has one of the following return codes.:: ++ +-- +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument `cmd` was invalid which means the given `cmd` was +undefined, or not allowed in the current instance. In this case, the current +instance might not be an AVC/H.264 encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or `headerType` was invalid, which +means it has a null pointer, or given values for some member variables are +improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. +-- + +====== ENC_GET_VIDEO_HEADER +This command gets a SPS to the AVC/H.264 bitstream to the bitstream during +encoding. Because VPU does not generate bitstream but HOST application generate +bitstream in this command, HOST application has to set pBuf value to access +bitstream buffer. The argument `parameter` is interpreted as a pointer to +EncHeaderParam structure holding + +* buf is a physical address pointing the generated stream location +* pBuf is a virtual address pointing the generated stream location +* size is the size of generated stream in bytes +* headerType is a type of header that HOST application wants to generate and +have values as SPS_RBSP. + +This command has one of the following return codes.:: ++ +-- +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header +syntax was successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument cmd was invalid +which means the given cmd was undefined, or not allowed in the current instance. +In this case, the current instance might not be an AVC/H.264 encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or headerType +was invalid, which means it has a null pointer, or given values for some member +variables are improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. +-- + +====== ENC_SET_INTRA_MB_REFRESH_NUMBER +This command sets intra MB refresh number of header syntax. +The argument `parameter` is interpreted as a pointer to integer which +represents an intra refresh number. It should be between 0 and +macroblock number of encoded picture. + +This command returns the following code.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. + +====== ENC_ENABLE_HEC +This command enables HEC(Header Extension Code) syntax of MPEG4. + +This command ignores the argument `parameter` and returns one of the following +return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument, cmd, was invalid which means the given cmd was +undefined, or not allowed in the current instance. In this case, the current +instance might not be an MPEG4 encoder instance. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. + +====== ENC_DISABLE_HEC +This command disables HEC(Header Extension Code) syntax of MPEG4. + +This command ignores the argument `parameter` and returns one of the following +return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument, cmd, was invalid which means the given cmd was +undefined, or not allowed in the current instance. In this case, the current +instance might not be an MPEG4 encoder instance. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. + +====== ENC_SET_SLICE_INFO +This command sets slice inforamtion of header syntax. +The argument `parameter` is interpreted as a pointer to EncSliceMode +structure holding + +* sliceModeuf is a mode which means enabling multi slice structure +* sliceSizeMode is the mode representing mode of calculating one slicesize +* sliceSize is the size of one slice. + +This command has one of the following return codes.:: ++ +-- +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or `headerType` was invalid, which +means it has a null pointer, or given values for some member variables are +improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. +-- + +====== ENC_SET_GOP_NUMBER +This command sets GOP number of header syntax. +The argument `parameter` is interpreted as a pointer to the integer which +represents a GOP number. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or `headerType` was invalid, which +means it has a null pointer, or given values for some member variables are +improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. + +====== ENC_SET_INTRA_QP +This command sets intra QP value of header syntax. +The argument `parameter` is interpreted as a pointer to the integer which +represents a Constant I frame QP. The Constant I frame QP should be between 1 +and 31 for MPEG4 and between 0 and 51 for AVC/H.264. + +This command has one of the following return codes:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument `cmd` was invalid which means the given cmd was +undefined, or not allowed in the current instance. In this case, the current +instance might not be an encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or `headerType` was invalid, which +means it has a null pointer, or given values for some member variables are +improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. + +====== ENC_SET_BITRATE +This command sets bitrate inforamtion of header syntax. +The argument `parameter` is interpreted as a pointer to the integer which +represents a bitrate. It should be between 0 and 32767. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument `cmd` was invalid which means the given `cmd` was +undefined, or not allowed in the current instance. In this case, the current +instance might not be an encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or `headerType` was invalid, which +means it has a null pointer, or given values for some member variables are +improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. + +====== ENC_SET_FRAMERATE +This command sets frame rate of header syntax. +The argument `parameter` is interpreted as a pointer to the integer which +represents a frame rate value. The fraem rate should be greater than 0. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument `cmd` was invalid which means the given `cmd` was +undefined, or not allowed in the current instance. In this case, the current +instance might not be an encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or `headerType` was invalid, which +means it has a null pointer, or given values for some member variables are +improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. + +====== ENC_SET_SEARCHRAM_PARAM +This command sets the parameter of search sram used in encoder. +The `parameter` is interpreted as a pointer to SearchRamParam. + +This command has one of the following return codes.:: + +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or `SearchRamSize` was invalid, +which means it has a null pointer, or given values for some member variables are +improper values. + +====== ENC_SET_REPORT_MBINFO +This command sets MB data report structure. The argument `parameter` is +interpreted as a pointer to address and returns RETCODE_SUCCESS. + +If this option is set, the slice boundary and QP are reported using 1 bytes. + +* [7] : Reserved +* [6] : Slice Boundary. Whenever a new slice header is decoded, this bit field +is toggled. +* [5:0] : An macroblock QP value + +====== ENC_SET_REPORT_MVINFO +This command sets motion vector report structure. The argument `parameter` is +interpreted as a pointer to address and returns RETCODE_SUCCESS. + +If this option is set, the motion vector information are reported using 4 bytes. + +* [31] : Intra Flag (1: intra, 0: inter) +* [30:16] : X value of motion vector +* [16:0] : Y value of motion vector + +====== ENC_SET_REPORT_SLICEINFO +This command sets slice information report structure. +The argument `parameter` is interpreted as a pointer to address and returns +RETCODE_SUCCESS. + +If this option is set, the slice information are reported using 8 bytes. + +* [63:48] : Reserved. +* [47:32] :The last macroblock indeed of a slice (zero based-index) +* [31:0] : Total of bits used for encoding a slice. + +====== ENC_SET_PIC_PARA_ADDR +This command sets the address of picture parameter base. The argument +`parameter` is interpreted as a pointer to `address` and returns +RETCODE_SUCCESS. + +To report MB data, Motion Vector, and Slice information, VPU should reads the +base address of external memory, which all are specified by picParaBaseAddr. + +[[enc_pic_param_baseaddr_struct]] +.Encoder Picture parameter base address structure +ifdef::pdf[] +image::../figure/enc_pic_param_baseaddr_struct.svg["Encoder Picture parameter +base address structure", width=300] endif::pdf[] ifdef::html[] +image::../figure/enc_pic_param_baseaddr_struct.png[Encoder Picture parameter +base address structure] endif::html[] + +When `enReportMBInfo`, `enReportMVInfo`, and `enReportSliceinfo` in +CMD_ENC_PIC_OPTION register are enabled, HOST application should specify the +buffer addresses in <>. VPU reports each data and +fills info, Data Size and other fields to these buffer addresses of external +memory. For VPU to report data properly, HOST application needs to specify these +3 buffer addresses preserving 8 byte alignment and buffer sizes need to be +multiples of 256. + +====== SET_SEC_AXI +This command sets the secondary channel of AXI for saving memory bandwidth to +dedicated memory. The argument `parameter` is interpreted as a pointer to +SecAxiUse which represents an enable flag and physical address which is related +with the secondary channel for BIT processor, IP/AC-DC predictor, de-blocking +filter, overlap filter respectively. + +This command has one of the following return codes.:: + +* RETCODE_SUCCESS: +Operation was done successfully, which means given value for setting secondary +AXI is valid. +* RETCODE_INVALID_PARAM: +The given argument parameter, `parameter`, was invalid, which means given value +is invalid. + +====== ENABLE_LOGGING +HOST can activate message logging once VPU_DecOpen() or VPU_EncOpen() is called. + +====== DISABLE_LOGGING +HOST can deactivate message logging which is off as default. + +====== ENC_CONFIG_SUB_FRAME_SYNC +This command sets the configuration of sub frame sync mode. +The `parameter` is interpreted as a pointer to EncSubFrameSyncConfig. This +command returns RETCODE_SUCCESS. + +====== ENC_SET_SUB_FRAME_SYNC +This command sets the status of sub frame sync signal. +The `parameter` is interpreted as a pointer to EncSubFrameSyncState. This +command returns RETCODE_SUCCESS. + +====== ENC_SET_PARA_CHANGE +This command changes encoding parameter(s) during the encoding operation in +H.265/AVC encoder The argument `parameter` is interpreted as a pointer to +<> structure holding + +* changeParaMode : OPT_COMMON (only valid currently) +* enable_option : Set an enum value that is associated with parameters to +change, <> (multiple option allowed). + +For instance, if bitrate and framerate need to be changed in the middle of +encoding, that requires some setting like below. + + EncChangeParam changeParam; + changeParam.changeParaMode = OPT_COMMON; + changeParam.enable_option = ENC_RC_TARGET_RATE_CHANGE | +ENC_FRAME_RATE_CHANGE; + + changeParam.bitrate = 14213000; + changeParam.frameRate = 15; + VPU_EncGiveCommand(handle, ENC_SET_PARA_CHANGE, &changeParam); + +This command has one of the following return codes.:: ++ +-- +* RETCODE_SUCCESS: +Operation was done successfully, which means the requested header syntax was +successfully inserted. +* RETCODE_INVALID_COMMAND: +This means the given argument `cmd` was invalid which means the given `cmd` was +undefined, or not allowed in the current instance. In this case, the current +instance might not be an AVC/H.264 encoder instance. +* RETCODE_INVALID_PARAM: +The given argument parameter `parameter` or `headerType` was invalid, which +means it has a null pointer, or given values for some member variables are +improper values. +* RETCODE_VPU_RESPONSE_TIMEOUT: +Operation has not recieved any response from VPU and has timed out. +-- + +====== ENC_SET_PROFILE + +This command encodes videos into H.264/AVC stream with HOST application-given +profile in header syntax. (CODA9 only) + +====== ENC_SET_SEI_NAL_DATA +This command sets variables in HevcSEIDataEnc structure for SEI encoding. + +====== SET_ENC_WTL_INFO +This command sets information of frame buffer such as Y/Cb/Cr addr, +cbcrinterleave, nv21, and number of linear framebuffer for WTL-enabled encoder. + +====== SET_ADDR_ENC_RC_REPORT_BASE +This command sets the base address of report buffer. +It should be specified when any of these bitInfoReportEnable, +frameDistortionReportEnable, or qpHistogramReportEnable in EncParam is on. In +total 144bytes of data are reported to the report buffer from +w4EncReportBaseAddr in the following order. If a certain ReportEnable flag is +diabled i.e frameDistortionReportEnable, dummy data are written into the +frameDistortion region of the buffer. + +image::../figure/rc_report.png["Report Buffer", width=150] + +-- +* bit information + +@* Header bits : total slice header bits of the current frame except start code +@* Residual bits : total residual bits of the current frame + +header bits are in the beginning 32bits of w4EncReportBaseAddr, + and header bits are in the following 32bits of the report buffer. + +* frame distortion + +With this command, +frame distortion data - frame distortion sum, y, cb, and cr for each 8bytes, +totally 32bytes) are reported 8bytes away from w4EncReportBaseAddr +(w4EncReportBaseAddr + 8) when picture encoding is completed. + +* QP histogram + +With this command, +QP histogram for every subCTU(CU32) taking 16bits are reported 40bytes away from +w4EncReportBaseAddr (w4EncReportBaseAddr + 40) when picture encoding is +completed. +-- + +====== SET_SIZE_ENC_RC_REPORT +This command sets the size of report buffer. +It should be specified when any of these bitInfoReportEnable, +frameDistortionReportEnable, or qpHistogramReportEnable in EncParam is on. + +@endverbatim +*/ +RetCode VPU_EncGiveCommand(EncHandle handle, /**< [Input] An encoder handle + obtained from VPU_EncOpen() */ + CodecCommand cmd, /**< [Input] A variable specifying + the given command of CodecComand + type */ + void *parameter /**< [Input/Output] A pointer to + command-specific data structure + which describes picture I/O + parameters for the current encoder + instance */ +); + +/** +* @brief +@verbatim +This function starts encoding one frame. Returning from this function does not +mean the completion of encoding one frame, and it is just that encoding one +frame was initiated. + +Every call of this function should be matched with VPU_EncGetOutputInfo() +with the same handle. Without calling a pair of these funtions, +HOST application cannot call any other API functions +except for VPU_IsBusy(), VPU_EncGetBitstreamBuffer(), and +VPU_EncUpdateBitstreamBuffer(). +@endverbatim +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means encoding a new frame was started +successfully. ++ +-- +NOTE: This return value does not mean that encoding a frame was completed +successfully. +-- +*RETCODE_INVALID_HANDLE* :: +This means the given handle for the current API function call, pHandle, was +invalid. This return code might be caused if ++ +-- +* handle is not a handle which has been obtained by VPU_EncOpen(). +* handle is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame decoding or encoding operation was not completed yet, so the +given API function call cannot be performed this time. A frame encoding or +decoding operation should be completed by calling VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo(). Even though the result of the current frame operation is +not necessary, HOST application should call VPU_EncGetOutputInfo() or +VPU_DecGetOutputInfo() to proceed this function call. + +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. In this case, HOST application might call this +function before successfully calling VPU_EncRegisterFrameBuffer(). This function +should be called after successfully calling VPU_EncRegisterFrameBuffer(). + +*RETCODE_INVALID_PARAM* :: +The given argument parameter, `parameter`, was invalid, which means it has a +null pointer, or given values for some member variables are improper values. + +*RETCODE_INVALID_FRAME_BUFFER* :: +This means sourceFrame in input structure EncParam was invalid, which means +sourceFrame was not valid even though picture-skip is disabled. +@endverbatim +*/ +RetCode +VPU_EncStartOneFrame(EncHandle handle, /**< [Input] An encoder handle obtained + from VPU_EncOpen() */ + EncParam *param /**< [Input] A pointer to EncParam type + structure which describes picture + encoding parameters for the current + encoder instance. */ +); + +RetCode cviVPU_LockAndCheck(EncHandle handle, int targetState, int timeout_ms); +RetCode cviVPU_ChangeState(EncHandle handle); + +/** +* @brief This function gets information of the output of encoding. +Application can know about picture type, the address and size of the generated +bitstream, the number of generated slices, the end addresses of the slices, and +macroblock bit position information. HOST application should call this function +after frame encoding is finished, and before starting the further processing. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means the output information of the +current frame encoding was received successfully. + +*RETCODE_INVALID_HANDLE* :: +The given handle for the current API function call, pHandle, was invalid. This +return code might be caused if ++ +-- +* handle is not a handle which has been obtained by VPU_EncOpen(), for example +a decoder handle, +* handle is a handle of an instance which has been closed already, +* handle is not the same handle as the last VPU_EncStartOneFrame() has, etc. +-- +*RETCODE_WRONG_CALL_SEQUENCE* :: +This means the current API function call was invalid considering the allowed +sequences between API functions. HOST application might call this +function before calling VPU_EncStartOneFrame() successfully. This function +should be called after successful calling of VPU_EncStartOneFrame(). + +*RETCODE_INVALID_PARAM* :: +The given argument parameter, pInfo, was invalid, which means it has a null +pointer, or given values for some member variables are improper values. +@endverbatim +*/ +RetCode VPU_EncGetOutputInfo(EncHandle handle, /**< [Input] An encoder handle + obtained from VPU_EncOpen(). + */ + EncOutputInfo *info /**< [Output] A pointer to a + EncOutputInfo type structure + which describes picture + encoding results for the + current encoder instance. */ +); + +/** +* @brief After encoding frame, HOST application must get bitstream from the +encoder. To do that, they must know where to get bitstream and the maximum size. +Applications can get the information by calling this function. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully. That means the current encoder instance was +closed successfully. + +*RETCODE_INVALID_HANDLE* :: +This means the given handle for the current API function call, pHandle, was +invalid. This return code might be caused if ++ +-- +* pHandle is not a handle which has been obtained by VPU_EncOpen(). +* pHandle is a handle of an instance which has been closed already, etc. +-- +*RETCODE_INVALID_PARAM* :: +The given argument parameter, pRdptr, pWrptr or size, was invalid, which means +it has a null pointer, or given values for some member variables are improper +values. +@endverbatim +*/ +RetCode VPU_EncGetBitstreamBuffer(EncHandle handle, /**< [Input] An encoder + handle obtained from + VPU_EncOpen() */ + PhysicalAddress *prdPrt, /**< [Output] A + stream buffer read + pointer for the + current encoder + instance */ + PhysicalAddress *pwrPtr, /**< [Output] A + stream buffer + write pointer for + the current + encoder instance + */ + int *size /**< [Output] A variable specifying + the available space in bitstream + buffer for the current encoder + instance */ +); + +/** +* @brief Applications must let encoder know how much bitstream has been +transferred from the address obtained from VPU_EncGetBitstreamBuffer(). By just +giving the size as an argument, API automatically handles pointer wrap-around +and updates the read pointer. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully. That means the current encoder instance was +closed successfully. + +*RETCODE_INVALID_HANDLE* :: +This means the given handle for the current API function call, pHandle, was +invalid. This return code might be caused if ++ +-- +* pHandle is not a handle which has been obtained by VPU_EncOpen(). +* pHandle is a handle of an instance which has been closed already, etc. +-- +*RETCODE_INVALID_PARAM* :: +The given argument parameter, size, was invalid, which means size is larger than +the value obtained from VPU_EncGetBitstreamBuffer(). +@endverbatim +*/ +RetCode VPU_EncUpdateBitstreamBuffer(EncHandle handle, /**< [Input] An encoder + handle obtained from + VPU_EncOpen() */ + int size /**< [Input] A variable specifying + the amount of bits being filled + from bitstream buffer for the + current encoder instance */ +); + +/** +* @brief This function specifies the location of write pointer in bitstream +buffer. It can also set a read pointer with the same value of write pointer +(addr) when updateRdPtr is not a zero value. This function can be used +regardless of bitstream buffer mode. +* @return +@verbatim +*RETCODE_SUCCESS* :: +Operation was done successfully, which means required information of the stream +data to be encoded was received successfully. *RETCODE_FAILURE* :: Operation was +failed, which means there was an error in getting information for configuring +the encoder. +*RETCODE_INVALID_HANDLE* :: ++ +-- +This means the given handle for the current API function call, `handle`, was +invalid. This return code might be caused if + +* `handle` is not a handle which has been obtained by VPU_EncOpen(). +* `handle` is a handle of an instance which has been closed already, etc. +-- +*RETCODE_FRAME_NOT_COMPLETE* :: +This means frame encoding operation was not completed yet, so the given API +function call cannot be performed this time. A frame encoding operation should +be completed by calling VPU_ EncSetRdPtr (). +@endverbatim +*/ +RetCode VPU_EncSetWrPtr(EncHandle handle, /**< [Input] An encoder handle + obtained from VPU_EncOpen() */ + PhysicalAddress addr, /**< [Input] Updated write or read + pointer */ + int updateRdPtr /**< [Input] A flag whether to move the + read pointer to where the write + pointer is located */ +); + +RetCode VPU_GetCoreStatus(Uint32 coreIdx, int *pStatus); +RetCode VPU_SetCoreStatus(Uint32 coreIdx, int Status); +int VPU_GetCoreTaskNum(Uint32 coreIdx); + +/** +Not used +*/ +void VPU_EncSetHostParaAddr(PhysicalAddress baseAddr, PhysicalAddress paraAddr); + +#ifdef REDUNDENT_CODE +RetCode VPU_EncIssueSeqInit(EncHandle handle /**< [Input] A encoder handle + obtained from VPU_EncOpen() */ +); +#endif + +RetCode VPU_DecSetOutputFormat(DecHandle handle, int cbcrInterleave, int nv21); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapifunc.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapifunc.c new file mode 100644 index 0000000000..b94c3be5c2 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapifunc.c @@ -0,0 +1,6403 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#include "vpuapifunc.h" +#include "product.h" +#include "coda9/coda9.h" +#include "coda9/coda9_regdefine.h" +#include "coda9/coda9_vpuconfig.h" +#include "wave/common/common_regdefine.h" +#include "wave/wave4/wave4_regdefine.h" +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#define MAX_LAVEL_IDX 16 +#define UNREFERENCED_PARAM(x) ((void)(x)) + +static const int g_anLevel[MAX_LAVEL_IDX] = { 10, 11, 11, 12, 13, + // 10, 16, 11, 12, 13, + 20, 21, 22, 30, 31, 32, 40, 41, + 42, 50, 51 }; + +static const int g_anLevelMaxMBPS[MAX_LAVEL_IDX] = { + 1485, 1485, 3000, 6000, 11880, 11880, 19800, 20250, + 40500, 108000, 216000, 245760, 245760, 522240, 589824, 983040 +}; + +static const int g_anLevelMaxFS[MAX_LAVEL_IDX] = { 99, 99, 396, 396, + 396, 396, 792, 1620, + 1620, 3600, 5120, 8192, + 8192, 8704, 22080, 36864 }; + +static const int g_anLevelMaxBR[MAX_LAVEL_IDX] = { + 64, 64, 192, 384, 768, 2000, 4000, 4000, + 10000, 14000, 20000, 20000, 50000, 50000, 135000, 240000 +}; + +static const int g_anLevelSliceRate[MAX_LAVEL_IDX] = { 0, 0, 0, 0, 0, 0, + 0, 0, 22, 60, 60, 60, + 24, 24, 24, 24 }; + +static const int g_anLevelMaxMbs[MAX_LAVEL_IDX] = { + 28, 28, 56, 56, 56, 56, 79, 113, 113, 169, 202, 256, 256, 263, 420, 543 +}; + +/****************************************************************************** + define value +******************************************************************************/ + +/****************************************************************************** + Codec Instance Slot Management +******************************************************************************/ + +RetCode InitCodecInstancePool(Uint32 coreIdx) +{ + int i; + CodecInst *pCodecInst; + vpu_instance_pool_t *vip; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); + if (!vip) + return RETCODE_INSUFFICIENT_RESOURCE; + + if (vip->instance_pool_inited == 0) { + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + pCodecInst = (CodecInst *)vip->codecInstPool[i]; + pCodecInst->instIndex = i; + pCodecInst->inUse = 0; + + CVI_VC_INFO( + "%d, pCodecInst->instIndex %d, pCodecInst->inUse %d\n", + i, pCodecInst->instIndex, pCodecInst->inUse); + } + vip->instance_pool_inited = 1; + } + return RETCODE_SUCCESS; +} + +/* + * GetCodecInstance() obtains a instance. + * It stores a pointer to the allocated instance in *ppInst + * and returns RETCODE_SUCCESS on success. + * Failure results in 0(null pointer) in *ppInst and RETCODE_FAILURE. + */ + +RetCode GetCodecInstance(Uint32 coreIdx, CodecInst **ppInst) +{ + int i; + CodecInst *pCodecInst = 0; + vpu_instance_pool_t *vip; + Uint32 handleSize; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); + if (!vip) + return RETCODE_INSUFFICIENT_RESOURCE; + + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + pCodecInst = (CodecInst *)vip->codecInstPool[i]; + + if (!pCodecInst) { + return RETCODE_FAILURE; + } + + if (!pCodecInst->inUse) { + break; + } + } + + if (i == MAX_NUM_INSTANCE) { + *ppInst = 0; + return RETCODE_FAILURE; + } + + pCodecInst->inUse = 1; + pCodecInst->coreIdx = coreIdx; + pCodecInst->codecMode = -1; + pCodecInst->codecModeAux = -1; +#ifdef ENABLE_CNM_DEBUG_MSG + pCodecInst->loggingEnable = 0; +#endif + pCodecInst->isDecoder = TRUE; + pCodecInst->productId = ProductVpuGetId(coreIdx); + osal_memset((void *)&pCodecInst->CodecInfo, 0x00, + sizeof(pCodecInst->CodecInfo)); + + handleSize = sizeof(DecInfo); + if (handleSize < sizeof(EncInfo)) { + handleSize = sizeof(EncInfo); + } + + pCodecInst->CodecInfo = (void *)osal_malloc(handleSize); + if (pCodecInst->CodecInfo == NULL) { + return RETCODE_INSUFFICIENT_RESOURCE; + } + osal_memset(pCodecInst->CodecInfo, 0x00, sizeof(handleSize)); + + *ppInst = pCodecInst; + + if (vdi_open_instance(pCodecInst->coreIdx, pCodecInst->instIndex) < 0) { + return RETCODE_FAILURE; + } + + return RETCODE_SUCCESS; +} + +void FreeCodecInstance(CodecInst *pCodecInst) +{ + pCodecInst->inUse = 0; + pCodecInst->codecMode = -1; + pCodecInst->codecModeAux = -1; + + vdi_close_instance(pCodecInst->coreIdx, pCodecInst->instIndex); + + osal_free(pCodecInst->CodecInfo); + pCodecInst->CodecInfo = NULL; +} + +RetCode CheckInstanceValidity(CodecInst *pCodecInst) +{ + int i; + vpu_instance_pool_t *vip; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(pCodecInst->coreIdx); + if (!vip) { + CVI_VC_ERR("RETCODE_INSUFFICIENT_RESOURCE\n"); + return RETCODE_INSUFFICIENT_RESOURCE; + } + + for (i = 0; i < MAX_NUM_INSTANCE; i++) { + if ((CodecInst *)vip->codecInstPool[i] == pCodecInst) + return RETCODE_SUCCESS; + } + + CVI_VC_ERR("RETCODE_INVALID_HANDLE\n"); + return RETCODE_INVALID_HANDLE; +} + +/****************************************************************************** + API Subroutines +******************************************************************************/ + +RetCode CheckDecOpenParam(DecOpenParam *pop) +{ + if (pop == 0) { + return RETCODE_INVALID_PARAM; + } + if (pop->bitstreamBuffer % 8) { + return RETCODE_INVALID_PARAM; + } + + if (pop->bitstreamBufferSize % 1024 || + pop->bitstreamBufferSize < 1024 || + pop->bitstreamBufferSize > (256 * 1024 * 1024 - 1)) { + return RETCODE_INVALID_PARAM; + } + +#ifdef REDUNDENT_CODE + if (pop->bitstreamFormat != STD_AVC && + pop->bitstreamFormat != STD_VC1 && + pop->bitstreamFormat != STD_MPEG2 && + pop->bitstreamFormat != STD_H263 && + pop->bitstreamFormat != STD_MPEG4 && + pop->bitstreamFormat != STD_DIV3 && + pop->bitstreamFormat != STD_RV && pop->bitstreamFormat != STD_AVS && + pop->bitstreamFormat != STD_THO && + pop->bitstreamFormat != STD_VP3 && + pop->bitstreamFormat != STD_VP8 && + pop->bitstreamFormat != STD_HEVC && + pop->bitstreamFormat != STD_VP9) { + return RETCODE_INVALID_PARAM; + } + + if (pop->mp4DeblkEnable == 1 && !(pop->bitstreamFormat == STD_MPEG4 || + pop->bitstreamFormat == STD_MPEG2 || + pop->bitstreamFormat == STD_DIV3)) { + return RETCODE_INVALID_PARAM; + } +#endif + if (pop->bitstreamFormat != STD_AVC && + pop->bitstreamFormat != STD_HEVC) { + return RETCODE_INVALID_PARAM; + } + + if (pop->wtlEnable && pop->tiled2LinearEnable) { + return RETCODE_INVALID_PARAM; + } + if (pop->wtlEnable) { + if (pop->wtlMode != FF_FRAME && pop->wtlMode != FF_FIELD) { + return RETCODE_INVALID_PARAM; + } + } + + if (pop->coreIdx > MAX_NUM_VPU_CORE) { + return RETCODE_INVALID_PARAM; + } + + return RETCODE_SUCCESS; +} + +Uint64 GetTimestamp(EncHandle handle) +{ + CodecInst *pCodecInst = (CodecInst *)handle; + EncInfo *pEncInfo = NULL; + Uint64 pts; + Uint32 fps; + + if (pCodecInst == NULL) { + return 0; + } + + pEncInfo = &pCodecInst->CodecInfo->encInfo; + fps = pEncInfo->openParam.frameRateInfo; + if (fps == 0) { + fps = 30; /* 30 fps */ + } + + pts = pEncInfo->curPTS; + pEncInfo->curPTS += 90000 / fps; /* 90KHz/fps */ + + return pts; +} + +RetCode CalcEncCropInfo(EncHevcParam *param, int rotMode, int srcWidth, + int srcHeight) +{ + int width32, height32, pad_right, pad_bot; + int crop_right, crop_left, crop_top, crop_bot; + int prp_mode = rotMode >> 1; // remove prp_enable bit + + width32 = (srcWidth + 31) & ~31; + height32 = (srcHeight + 31) & ~31; + + pad_right = width32 - srcWidth; + pad_bot = height32 - srcHeight; + + if (param->confWinRight > 0) + crop_right = param->confWinRight + pad_right; + else + crop_right = pad_right; + + if (param->confWinBot > 0) + crop_bot = param->confWinBot + pad_bot; + else + crop_bot = pad_bot; + + crop_top = param->confWinTop; + crop_left = param->confWinLeft; + + param->confWinTop = crop_top; + param->confWinLeft = crop_left; + param->confWinBot = crop_bot; + param->confWinRight = crop_right; + + if (prp_mode == 1 || prp_mode == 15) { + param->confWinTop = crop_right; + param->confWinLeft = crop_top; + param->confWinBot = crop_left; + param->confWinRight = crop_bot; + } else if (prp_mode == 2 || prp_mode == 12) { + param->confWinTop = crop_bot; + param->confWinLeft = crop_right; + param->confWinBot = crop_top; + param->confWinRight = crop_left; + } else if (prp_mode == 3 || prp_mode == 13) { + param->confWinTop = crop_left; + param->confWinLeft = crop_bot; + param->confWinBot = crop_right; + param->confWinRight = crop_top; + } else if (prp_mode == 4 || prp_mode == 10) { + param->confWinTop = crop_bot; + param->confWinBot = crop_top; + } else if (prp_mode == 8 || prp_mode == 6) { + param->confWinLeft = crop_right; + param->confWinRight = crop_left; + } else if (prp_mode == 5 || prp_mode == 11) { + param->confWinTop = crop_left; + param->confWinLeft = crop_top; + param->confWinBot = crop_right; + param->confWinRight = crop_bot; + } else if (prp_mode == 7 || prp_mode == 9) { + param->confWinTop = crop_right; + param->confWinLeft = crop_bot; + param->confWinBot = crop_left; + param->confWinRight = crop_top; + } + + CVI_VC_CFG("confWinTop = %d\n", param->confWinTop); + CVI_VC_CFG("confWinBot = %d\n", param->confWinBot); + CVI_VC_CFG("confWinBot = %d\n", param->confWinBot); + CVI_VC_CFG("confWinRight = %d\n", param->confWinRight); + + return RETCODE_SUCCESS; +} + +int DecBitstreamBufEmpty(DecInfo *pDecInfo) +{ + return (pDecInfo->streamRdPtr == pDecInfo->streamWrPtr); +} + +#ifdef DRAM_TEST +RetCode ExecDRAMReadWriteTest(Uint32 coreIdx, Uint32 *dram_source_addr, + Uint32 *dram_destination_addr, + Uint32 *dram_data_size) +{ + VpuAttr *pAttr; + RetCode ret; + + if (coreIdx >= MAX_NUM_VPU_CORE) + return RETCODE_INVALID_PARAM; + + if (ProductVpuIsInit(coreIdx) == 0) { + return RETCODE_NOT_INITIALIZED; + } + + if (GetPendingInst(coreIdx)) { + return RETCODE_FRAME_NOT_COMPLETE; + } + + pAttr = &g_VpuCoreAttributes[coreIdx]; + + ret = ProductVpuDRAMReadWriteTest(coreIdx, dram_source_addr, + dram_destination_addr, + dram_data_size); + + return ret; +} +#endif + +#ifdef REDUNDENT_CODE +RetCode SetParaSet(DecHandle handle, int paraSetType, DecParamSet *para) +{ + CodecInst *pCodecInst; + PhysicalAddress paraBuffer; + int i; + Uint32 *src; + + pCodecInst = handle; + src = para->paraSet; + + paraBuffer = VpuReadReg(pCodecInst->coreIdx, BIT_PARA_BUF_ADDR); + for (i = 0; i < para->size; i += 4) { + VpuWriteReg(pCodecInst->coreIdx, paraBuffer + i, *src++); + } + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PARA_SET_TYPE, + paraSetType); // 0: SPS, 1: PPS + VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PARA_SET_SIZE, para->size); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, DEC_PARA_SET); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, DEC_PARA_SET, 0); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, DEC_PARA_SET, 0); +#endif + + return RETCODE_SUCCESS; +} + +void DecSetHostParaAddr(Uint32 coreIdx, PhysicalAddress baseAddr, + PhysicalAddress paraBuffer) +{ + BYTE tempBuf[8] = { + 0, + }; // 64bit bus & endian + Uint32 val; + + val = paraBuffer; + tempBuf[0] = 0; + tempBuf[1] = 0; + tempBuf[2] = 0; + tempBuf[3] = 0; + tempBuf[4] = (val >> 24) & 0xff; + tempBuf[5] = (val >> 16) & 0xff; + tempBuf[6] = (val >> 8) & 0xff; + tempBuf[7] = (val >> 0) & 0xff; + VpuWriteMem(coreIdx, baseAddr, (BYTE *)tempBuf, 8, VDI_BIG_ENDIAN); +} +#endif + +RetCode CheckEncInstanceValidity(EncHandle handle) +{ + CodecInst *pCodecInst; + RetCode ret; + + if (handle == NULL) { + CVI_VC_ERR("null handle %p\n", handle); + return RETCODE_INVALID_HANDLE; + } + pCodecInst = handle; + ret = CheckInstanceValidity(pCodecInst); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("CheckInstanceValidity ret %d\n", ret); + return RETCODE_INVALID_HANDLE; + } + if (!pCodecInst->inUse) { + return RETCODE_INVALID_HANDLE; + } + + if (pCodecInst->codecMode != MP4_ENC && + pCodecInst->codecMode != HEVC_ENC && + pCodecInst->codecMode != AVC_ENC && + pCodecInst->codecMode != C7_MP4_ENC && + pCodecInst->codecMode != C7_AVC_ENC) { + return RETCODE_INVALID_HANDLE; + } + return RETCODE_SUCCESS; +} + +RetCode CheckEncParam(EncHandle handle, EncParam *param) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + + if (param == 0) { + CVI_VC_ERR("null param\n"); + return RETCODE_INVALID_PARAM; + } + + if (param->setROI.mode && (pCodecInst->codecMode == AVC_ENC || + pCodecInst->codecMode == C7_AVC_ENC)) { + if (param->setROI.number < 0 || + param->setROI.number > MAX_CODA980_ROI_NUMBER) { + CVI_VC_ERR("ROI number %d out of range\n", + param->setROI.number); + return RETCODE_INVALID_PARAM; + } + } + + if (param->skipPicture != 0 && param->skipPicture != 1) { + CVI_VC_ERR("skipPicture %d out of range\n", param->skipPicture); + return RETCODE_INVALID_PARAM; + } + + if (param->skipPicture == 0) { + if (param->sourceFrame == 0) { + CVI_VC_ERR("null sourceFrame\n"); + return RETCODE_INVALID_FRAME_BUFFER; + } + if (param->forceIPicture != 0 && param->forceIPicture != 1) { + CVI_VC_ERR("forceIPicture %d out of range\n", + param->forceIPicture); + return RETCODE_INVALID_PARAM; + } + } + + if (pEncInfo->openParam.bitRate == 0) { // no rate control +#ifdef REDUNDENT_CODE + if (pCodecInst->codecMode == MP4_ENC || + pCodecInst->codecMode == C7_MP4_ENC) { + if (param->quantParam < 1 || param->quantParam > 31) { + CVI_VC_ERR("quantParam %d out of range\n", + param->quantParam); + return RETCODE_INVALID_PARAM; + } + } else +#endif + if (pCodecInst->codecMode == HEVC_ENC) { + if (param->forcePicQpEnable == 1) { + if (param->forcePicQpI < 0 || + param->forcePicQpI > 51) { + CVI_VC_ERR( + "forcePicQpI %d out of range\n", + param->forcePicQpI); + return RETCODE_INVALID_PARAM; + } + + if (param->forcePicQpP < 0 || + param->forcePicQpP > 51) { + CVI_VC_ERR( + "forcePicQpP %d out of range\n", + param->forcePicQpP); + return RETCODE_INVALID_PARAM; + } + + if (param->forcePicQpB < 0 || + param->forcePicQpB > 51) { + CVI_VC_ERR( + "forcePicQpB %d out of range\n", + param->forcePicQpB); + return RETCODE_INVALID_PARAM; + } + } + if (pEncInfo->ringBufferEnable == 0) { + if (param->picStreamBufferAddr % 16 || + param->picStreamBufferSize == 0) { + CVI_VC_ERR( + "picStreamBufferAddr / Size\n"); + return RETCODE_INVALID_PARAM; + } + } + } else { // AVC_ENC + if (param->quantParam < 0 || param->quantParam > 51) { + CVI_VC_ERR("quantParam %d out of range\n", + param->quantParam); + return RETCODE_INVALID_PARAM; + } + } + } + if (pEncInfo->ringBufferEnable == 0) { + if (param->picStreamBufferAddr % 8 || + param->picStreamBufferSize == 0) { + CVI_VC_ERR("BufferAddr 0x%llX BufferSize %d fail\n", + param->picStreamBufferAddr, + param->picStreamBufferSize); + return RETCODE_INVALID_PARAM; + } + } + + if (param->ctuOptParam.roiEnable && param->ctuOptParam.ctuQpEnable) { + CVI_VC_ERR("roiEnable + ctuQpEnable, not support\n"); + return RETCODE_INVALID_PARAM; + } + return RETCODE_SUCCESS; +} + +#ifdef SUPPORT_980_ROI_RC_LIB +static int32_t fw_util_round_divide(int32_t dividend, int32_t divisor) +{ + return (dividend + (divisor >> 1)) / divisor; +} +#endif + +/** + * GetEncHeader() + * 1. Generate encoder header bitstream + * @param handle : encoder handle + * @param encHeaderParam : encoder header parameter (buffer, size, type) + * @return none + */ +RetCode GetEncHeader(EncHandle handle, EncHeaderParam *encHeaderParam) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + EncOpenParam *encOP; + int encHeaderCode; + int ppsCopySize = 0; + unsigned char pps_temp[256]; + int spsID = 0; + PhysicalAddress rdPtr; + PhysicalAddress wrPtr; + int flag = 0; + Uint32 val = 0; + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + encOP = &(pEncInfo->openParam); + + if (pEncInfo->ringBufferEnable == 0) { + if (pEncInfo->lineBufIntEn) + val |= (0x1 << 6); + val |= (0x1 << 5); + val |= (0x1 << 4); + + } else { + val |= (0x1 << 3); + } + val |= pEncInfo->openParam.streamEndian; + VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_CTRL, val); + + if (pEncInfo->ringBufferEnable == 0) { + SetEncBitStreamInfo(pCodecInst, encHeaderParam, NULL); + } + + if ((encHeaderParam->headerType == SPS_RBSP || + encHeaderParam->headerType == SPS_RBSP_MVC) && + pEncInfo->openParam.bitstreamFormat == STD_AVC) { + Uint32 CropV, CropH; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_PROFILE, + encOP->EncStdParam.avcParam.profile); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_CHROMA_FORMAT, + encOP->EncStdParam.avcParam.chromaFormat400); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_FIELD_FLAG, + (encOP->EncStdParam.avcParam.fieldRefMode << 1) | + encOP->EncStdParam.avcParam.fieldFlag); + if (encOP->EncStdParam.avcParam.frameCroppingFlag == 1) { + flag = 1; + CropH = encOP->EncStdParam.avcParam.frameCropLeft << 16; + CropH |= encOP->EncStdParam.avcParam.frameCropRight; + CropV = encOP->EncStdParam.avcParam.frameCropTop << 16; + CropV |= encOP->EncStdParam.avcParam.frameCropBottom; + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_FRAME_CROP_H, CropH); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_FRAME_CROP_V, CropV); + } + +#ifdef SUPPORT_980_ROI_RC_LIB + + // AVC don't care about that It is only used for svc_t + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_FRAME, + pEncInfo->max_temporal_id << 16 | + pEncInfo->num_ref_frames_decoder); +#endif + } + if (encHeaderParam->headerType == SPS_RBSP_MVC) + spsID = 1; + encHeaderCode = + encHeaderParam->headerType | (flag << 3); // paraSetType>> + // SPS: 0, PPS: + // 1, VOS: 1, + // VO: 2, VOL: + // 0 + + encHeaderCode |= (pEncInfo->openParam.EncStdParam.avcParam.level) << 8; + encHeaderCode |= (spsID << 24); + if ((encHeaderParam->headerType == PPS_RBSP || + encHeaderParam->headerType == PPS_RBSP_MVC) && + pEncInfo->openParam.bitstreamFormat == STD_AVC) { + int ActivePPSIdx = pEncInfo->ActivePPSIdx; + AvcPpsParam *ActivePPS = + &encOP->EncStdParam.avcParam.ppsParam[ActivePPSIdx]; + if (ActivePPS->entropyCodingMode != 2) { + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_MODE, + ActivePPS->entropyCodingMode); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_INIT_IDC, + ActivePPS->cabacInitIdc); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_TRANSFORM_8X8, + ActivePPS->transform8x8Mode); + if (encHeaderParam->headerType == PPS_RBSP) + encHeaderCode |= (ActivePPS->ppsId << 16); + else if (encHeaderParam->headerType == PPS_RBSP_MVC) + encHeaderCode |= (1 << 24) | + ((ActivePPS->ppsId + 1) << 16); + } else { + int mvcPPSOffset = 0; + if (encHeaderParam->headerType == PPS_RBSP_MVC) { + encHeaderCode |= (1 << 24); /* sps_id: 1 */ + mvcPPSOffset = 2; + } + // PPS for I frame (CAVLC) + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_MODE, 0); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_INIT_IDC, + ActivePPS->cabacInitIdc); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_TRANSFORM_8X8, + ActivePPS->transform8x8Mode); + encHeaderCode |= + ((ActivePPS->ppsId + mvcPPSOffset) << 16); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_CODE, + encHeaderCode); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + ENCODE_HEADER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, + __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, + ENCODE_HEADER, 2); +#endif + SetPendingInst(pCodecInst->coreIdx, NULL, + __func__, __LINE__); + CVI_VC_ERR("SetPendingInst clear\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENCODE_HEADER, 0); +#endif + + if (pEncInfo->ringBufferEnable == 0) { + ppsCopySize = + vdi_remap_memory_address( + pCodecInst->coreIdx, + VpuReadReg( + pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr)) - + encHeaderParam->buf; + VpuReadMem(pCodecInst->coreIdx, + encHeaderParam->buf, &pps_temp[0], + ppsCopySize, + pEncInfo->openParam.streamEndian); + } + + // PPS for P frame (CABAC) + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_MODE, 1); + encHeaderCode |= ((ActivePPS->ppsId + mvcPPSOffset + 1) + << 16); // ppsId=1; + } + } + + // SET_SEI param + if (pEncInfo->openParam.bitstreamFormat == STD_AVC && + encHeaderParam->headerType == SVC_RBSP_SEI) { + int data = 0; + if (pEncInfo->max_temporal_id) { + int i; + int num_layer; + int frm_rate[MAX_GOP_SIZE] = { + 0, + }; + + if (pEncInfo->openParam.gopSize == 1) // || + // seq->intra_period + // == 1) //all + // intra + { + num_layer = 1; + frm_rate[0] = pEncInfo->openParam.frameRateInfo; + } else { + num_layer = 1; + for (i = 0; i < pEncInfo->gop_size; i++) { + // assert(seq->gop_entry[i].temporal_id + // < MAX_GOP_SIZE); + num_layer = MAX( + num_layer, + pEncInfo->gop_entry[i] + .temporal_id + + 1); + frm_rate[pEncInfo->gop_entry[i] + .temporal_id]++; + } + + for (i = 0; i < num_layer; i++) { + frm_rate[i] = fw_util_round_divide( + frm_rate[i] * + pEncInfo->openParam + .frameRateInfo * + 256, + pEncInfo->gop_size); + if (i > 0) + frm_rate[i] += frm_rate[i - 1]; + } + } + + data = num_layer << 16 | frm_rate[0]; + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_SVC_SEI_INFO1, data); + data = frm_rate[1] << 16 | frm_rate[2]; + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_SVC_SEI_INFO2, data); + } else { + data = 0; + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_SVC_SEI_INFO1, data); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_SVC_SEI_INFO2, data); + } + } + + encHeaderCode |= (encHeaderParam->zeroPaddingEnable & 1) << 31; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_CODE, encHeaderCode); + + CVI_VC_TRACE("streamRdPtr = 0x%llX, streamWrPtr = 0x%llX\n", + pEncInfo->streamRdPtr, pEncInfo->streamWrPtr); + + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamRdPtrRegAddr, + pEncInfo->streamRdPtr); + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr, + pEncInfo->streamWrPtr); + + CVI_VC_FLOW("ENCODE_HEADER\n"); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, ENCODE_HEADER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENCODE_HEADER, 2); +#endif + SetPendingInst(pCodecInst->coreIdx, NULL, __func__, __LINE__); + CVI_VC_ERR("SetPendingInst clear\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENCODE_HEADER, 0); +#endif + + if (pEncInfo->ringBufferEnable == 0 && pEncInfo->bEsBufQueueEn == 0) { + rdPtr = encHeaderParam->buf; + wrPtr = vdi_remap_memory_address( + pCodecInst->coreIdx, + VpuReadReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr)); + + if (ppsCopySize) { + int size = wrPtr - rdPtr; + VpuReadMem(pCodecInst->coreIdx, rdPtr, + &pps_temp[ppsCopySize], size, + pEncInfo->openParam.streamEndian); + ppsCopySize += size; + VpuWriteMem(pCodecInst->coreIdx, rdPtr, &pps_temp[0], + ppsCopySize, + pEncInfo->openParam.streamEndian); + encHeaderParam->size = ppsCopySize; + wrPtr = rdPtr + ppsCopySize; + VpuWriteReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr, wrPtr); + } else { + encHeaderParam->size = wrPtr - rdPtr; + } + } else { + rdPtr = vdi_remap_memory_address( + pCodecInst->coreIdx, + VpuReadReg(pCodecInst->coreIdx, + pEncInfo->streamRdPtrRegAddr)); + wrPtr = vdi_remap_memory_address( + pCodecInst->coreIdx, + VpuReadReg(pCodecInst->coreIdx, + pEncInfo->streamWrPtrRegAddr)); + encHeaderParam->buf = rdPtr; + encHeaderParam->size = wrPtr - rdPtr; + } + + pEncInfo->streamWrPtr = wrPtr; + pEncInfo->streamRdPtr = rdPtr; + + CVI_VC_BS("streamRdPtr = 0x%llX, streamWrPtr = 0x%llX, size = 0x%zX\n", + pEncInfo->streamRdPtr, pEncInfo->streamWrPtr, + encHeaderParam->size); + + return RETCODE_SUCCESS; +} + +RetCode SetEncBitStreamInfo(CodecInst *pCodecInst, + EncHeaderParam *encHeaderParam, EncParam *param) +{ + EncInfo *pEncInfo = &pCodecInst->CodecInfo->encInfo; + PhysicalAddress paBitStreamWrPtr = VPU_ALIGN8(pEncInfo->streamWrPtr); + PhysicalAddress paBitStreamStart; + int bitStreamBufSize; + + if (encHeaderParam) { + if (pEncInfo->bEsBufQueueEn == 0) { + paBitStreamStart = encHeaderParam->buf; + bitStreamBufSize = (int)encHeaderParam->size; + } else { + paBitStreamStart = paBitStreamWrPtr; + bitStreamBufSize = (int)(pEncInfo->streamBufEndAddr - + paBitStreamWrPtr); + } + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_BB_START, + paBitStreamStart); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_BB_SIZE, + bitStreamBufSize >> 10); // size in KB + + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamRdPtrRegAddr, + paBitStreamStart); + pEncInfo->streamRdPtr = paBitStreamStart; + + CVI_VC_BS( + "headerStreamBufferAddr = 0x%llX, headerStreamBufferSize = 0x%X\n", + paBitStreamStart, bitStreamBufSize); + + } else if (param) { + // reset RdPtr/WrPtr to streamBufStartAddr: + // 1. bEsBufQueueEn disable or + // 2. empty size (pEncInfo->streamBufEndAddr - pEncInfo->streamWrPtr) lower than threshold + if (pEncInfo->bEsBufQueueEn == 0 || + ((pEncInfo->streamBufEndAddr - paBitStreamWrPtr) < + H264_MIN_BITSTREAM_SIZE)) { + paBitStreamStart = param->picStreamBufferAddr; + bitStreamBufSize = param->picStreamBufferSize; + } else { + paBitStreamStart = paBitStreamWrPtr; + bitStreamBufSize = (int)(pEncInfo->streamBufEndAddr - + paBitStreamWrPtr); + } + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_BB_START, + paBitStreamStart); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PIC_BB_SIZE, + bitStreamBufSize >> 10); // size in KB + VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamRdPtrRegAddr, + paBitStreamStart); + pEncInfo->streamRdPtr = paBitStreamStart; + + CVI_VC_BS( + "picStreamBufferAddr = 0x%llX, picStreamBufferSize = 0x%X\n", + paBitStreamStart, bitStreamBufSize); + } + + return RETCODE_SUCCESS; +} + +#ifdef REDUNDENT_CODE +/** + * EncParaSet() + * 1. Setting encoder header option + * 2. Get RBSP format header in PARA_BUF + * @param handle : encoder handle + * @param paraSetType : encoder header type >> SPS: 0, PPS: 1, VOS: 1, VO: 2, + * VOL: 0 + * @return none + */ +RetCode EncParaSet(EncHandle handle, int paraSetType) +{ + CodecInst *pCodecInst; + EncInfo *pEncInfo; + int flag = 0; + int encHeaderCode = paraSetType; + EncOpenParam *encOP; + int spsID = 0; + int picWidth, picHeight; + int SliceNum = 0; + + pCodecInst = handle; + pEncInfo = &pCodecInst->CodecInfo->encInfo; + encOP = &(pEncInfo->openParam); + + if ((paraSetType == SPS_RBSP_MVC || paraSetType == SPS_RBSP) && + pEncInfo->openParam.bitstreamFormat == STD_AVC) { + Uint32 CropV, CropH; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_CHROMA_FORMAT, + encOP->EncStdParam.avcParam.chromaFormat400); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_FIELD_FLAG, + encOP->EncStdParam.avcParam.fieldFlag | + encOP->EncStdParam.avcParam.fieldFlag); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_PROFILE, + encOP->EncStdParam.avcParam.profile); + + picWidth = encOP->picWidth; + picHeight = encOP->picHeight; + + if (encOP->sliceMode.sliceMode == 1 && + encOP->sliceMode.sliceSizeMode == 1) + SliceNum = encOP->sliceMode.sliceSize; + + if (!encOP->EncStdParam.avcParam.level) { + if (encOP->EncStdParam.avcParam.fieldFlag) + encOP->EncStdParam.avcParam.level = + LevelCalculation(picWidth >> 4, + (picHeight + 31) >> 5, + encOP->frameRateInfo, + 1, encOP->bitRate, + SliceNum); + else + encOP->EncStdParam.avcParam.level = + LevelCalculation(picWidth >> 4, + picHeight >> 4, + encOP->frameRateInfo, + 0, encOP->bitRate, + SliceNum); + if (encOP->EncStdParam.avcParam.level < 0) + return RETCODE_INVALID_PARAM; + } + + encHeaderCode |= (encOP->EncStdParam.avcParam.level) << 8; + + if (encOP->EncStdParam.avcParam.frameCroppingFlag == 1) { + flag = 1; + CropH = encOP->EncStdParam.avcParam.frameCropLeft << 16; + CropH |= encOP->EncStdParam.avcParam.frameCropRight; + CropV = encOP->EncStdParam.avcParam.frameCropTop << 16; + CropV |= encOP->EncStdParam.avcParam.frameCropBottom; + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_FRAME_CROP_H, CropH); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_FRAME_CROP_V, CropV); + } + } + encHeaderCode |= paraSetType | (flag << 3); // paraSetType>> SPS: 0, + // PPS: 1, VOS: 1, VO: 2, + // VOL: 0 + + if (paraSetType == SPS_RBSP_MVC) + spsID = 1; + encHeaderCode |= (pEncInfo->openParam.EncStdParam.avcParam.level) << 8; + encHeaderCode |= (spsID << 24); + + if ((paraSetType == PPS_RBSP || paraSetType == PPS_RBSP_MVC) && + pEncInfo->openParam.bitstreamFormat == STD_AVC) { + int ActivePPSIdx = pEncInfo->ActivePPSIdx; + AvcPpsParam *ActivePPS = + &encOP->EncStdParam.avcParam.ppsParam[ActivePPSIdx]; + + // PPS ID + if (ActivePPS->entropyCodingMode != 2) { + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_MODE, + ActivePPS->entropyCodingMode); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_INIT_IDC, + ActivePPS->cabacInitIdc); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_TRANSFORM_8X8, + ActivePPS->transform8x8Mode); + encHeaderCode |= (ActivePPS->ppsId << 16); + + if (paraSetType == PPS_RBSP) + encHeaderCode |= (ActivePPS->ppsId << 16); + else if (paraSetType == PPS_RBSP_MVC) { + spsID = 1; + encHeaderCode |= ((ActivePPS->ppsId + 1) + << 16); /* sps_id : 1 */ + encHeaderCode |= (spsID << 24) | + ((ActivePPS->ppsId + 1) + << 16); /* sps_id : 1 */ + } + } else { + // CAVLC for I frame, CABAC for P frame. + int mvcPPSOffset = 0; + if (paraSetType == PPS_RBSP_MVC) { + encHeaderCode |= (1 << 24); /* sps_id: 1 */ + mvcPPSOffset = 2; + } + + // 1st PPS + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_MODE, 0); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_INIT_IDC, + ActivePPS->cabacInitIdc); + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_TRANSFORM_8X8, + ActivePPS->transform8x8Mode); + encHeaderCode |= + ((ActivePPS->ppsId + mvcPPSOffset) << 16); + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARA_SET_TYPE, + encHeaderCode); + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + ENC_PARA_SET); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, + __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, + ENC_PARA_SET, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENC_PARA_SET, 0); +#endif + // 2nd PPS + VpuWriteReg(pCodecInst->coreIdx, + CMD_ENC_HEADER_CABAC_MODE, 1); + encHeaderCode |= ((ActivePPS->ppsId + mvcPPSOffset + 1) + << 16); // ppsId=1; + } + } + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARA_SET_TYPE, encHeaderCode); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, ENC_PARA_SET); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENC_PARA_SET, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, ENC_PARA_SET, 0); +#endif + + return RETCODE_SUCCESS; +} + +RetCode SetGopNumber(EncHandle handle, Uint32 *pGopNumber) +{ + CodecInst *pCodecInst; + int data = 0; + Uint32 gopNumber = *pGopNumber; + + pCodecInst = handle; + + data = 1; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_GOP_NUM, + gopNumber); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0); +#endif + + return RETCODE_SUCCESS; +} + +RetCode SetIntraQp(EncHandle handle, Uint32 *pIntraQp) +{ + CodecInst *pCodecInst; + int data = 0; + Uint32 intraQp = *pIntraQp; + + pCodecInst = handle; + + data = 1 << 1; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_INTRA_QP, + intraQp); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0); +#endif + + return RETCODE_SUCCESS; +} +#endif + +RetCode SetBitrate(EncHandle handle, Uint32 *pBitrate) +{ + CodecInst *pCodecInst; + int data = 0; + Uint32 bitrate = *pBitrate; + + pCodecInst = handle; + + data = 1 << 2; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_BITRATE, bitrate); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0); +#endif + + return RETCODE_SUCCESS; +} + +#ifdef REDUNDENT_CODE +RetCode SetFramerate(EncHandle handle, Uint32 *pFramerate) +{ + CodecInst *pCodecInst; + int data = 0; + Uint32 frameRate = *pFramerate; + + pCodecInst = handle; + + data = 1 << 3; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_F_RATE, + frameRate); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0); +#endif + + return RETCODE_SUCCESS; +} + +RetCode SetIntraRefreshNum(EncHandle handle, Uint32 *pIntraRefreshNum) +{ + CodecInst *pCodecInst; + Uint32 intraRefreshNum = *pIntraRefreshNum; + int data = 0; + + pCodecInst = handle; + + data = 1 << 4; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_INTRA_REFRESH, + intraRefreshNum); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0); +#endif + return RETCODE_SUCCESS; +} + +RetCode SetSliceMode(EncHandle handle, EncSliceMode *pSliceMode) +{ + CodecInst *pCodecInst; + Uint32 data = 0; + int data2 = 0; + + pCodecInst = handle; + + data = 0; + if (pSliceMode->sliceMode != 0) { + data = (pSliceMode->sliceSize << 2) | + (pSliceMode->sliceSizeMode + 1); // encoding mode + } + data2 = 1 << 5; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data2); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_SLICE_MODE, data); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0); +#endif + + return RETCODE_SUCCESS; +} + +RetCode SetHecMode(EncHandle handle, int mode) +{ + CodecInst *pCodecInst; + Uint32 HecMode = mode; + int data = 0; + + pCodecInst = handle; + + data = 1 << 6; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_HEC_MODE, + HecMode); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0); +#endif + + return RETCODE_SUCCESS; +} +#endif + +RetCode SetMinMaxQp(EncHandle handle, MinMaxQpChangeParam *param) +{ + CodecInst *pCodecInst; + int data = 0; + pCodecInst = handle; + + data = 1 << 6; + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data); + + data = (param->maxQpI << 0) | (param->maxQpIEnable << 6) | + (param->minQpI << 8) | (param->maxQpIEnable << 14) | + (param->maxQpP << 16) | (param->maxQpPEnable << 22) | + (param->minQpP << 24) | (param->maxQpPEnable << 30); + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_MIN_MAX_QP, data); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0); +#endif + + return RETCODE_SUCCESS; +} + +#ifdef REDUNDENT_CODE +#if defined(RC_PIC_PARACHANGE) && defined(RC_CHANGE_PARAMETER_DEF) +RetCode SetChangePicPara(EncHandle handle, ChangePicParam *param) +{ + CodecInst *pCodecInst; + int data = 0; + int gopIQpOffset = 0; + int gamma = 0; + pCodecInst = handle; + + data = 0x4000; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data); + + data = param->MindeltaQp << 8 | param->MaxdeltaQp; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_MIN_MAX_DELTA_QP, data); + + data = (param->RcHvsMaxDeltaQp << 6) | (param->HvsQpScaleDiv2 << 2) | + (param->EnHvsQp << 1) | param->EnRowLevelRc; + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_PIC_RC, data); + + if (param->RcGopIQpOffsetEn != 0) + gopIQpOffset = param->RcGopIQpOffset; + + if (param->GammaEn != 0) + gamma = param->Gamma; + + data = (param->RcInitDelay << 16) | (param->RcGopIQpOffsetEn << 5) | + ((gopIQpOffset & 0xF) << 1) | (param->GammaEn); + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_PIC_RC_2, data); + + VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_PIC_GAMMA, gamma); + + Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, + RC_CHANGE_PARAMETER); + if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, + BIT_BUSY_FLAG) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0); +#endif + + return RETCODE_SUCCESS; +} +#endif + +void EncSetHostParaAddr(Uint32 coreIdx, PhysicalAddress baseAddr, + PhysicalAddress paraAddr) +{ + BYTE tempBuf[8] = { + 0, + }; // 64bit bus & endian + Uint32 val; + + val = paraAddr; + tempBuf[0] = 0; + tempBuf[1] = 0; + tempBuf[2] = 0; + tempBuf[3] = 0; + tempBuf[4] = (val >> 24) & 0xff; + tempBuf[5] = (val >> 16) & 0xff; + tempBuf[6] = (val >> 8) & 0xff; + tempBuf[7] = (val >> 0) & 0xff; + VpuWriteMem(coreIdx, baseAddr, (BYTE *)tempBuf, 8, VDI_BIG_ENDIAN); +} + +RetCode VcodecTryLock(Uint32 core_idx) +{ + CVI_VC_LOCK("core_idx %d\n", core_idx); + + if (core_idx >= MAX_NUM_VPU_CORE) { + CVI_VC_ERR("\n"); + return -1; + } + + int ret = vdi_vcodec_trylock(core_idx); + + if (ret == 0) { + //trylock success + vdi_set_clock_gate(core_idx, CLK_ENABLE); + } else { + //trylock failure + ret = RETCODE_VPU_RESPONSE_TIMEOUT; + } + return ret; +} +#endif + +RetCode VcodecTimeLock(Uint32 core_idx, int timeout_ms) +{ + int ret = 0; + + CVI_VC_LOCK("core_idx %d\n", core_idx); + + if (core_idx >= MAX_NUM_VPU_CORE) { + CVI_VC_ERR("\n"); + return -1; + } + + if (timeout_ms == 0) { + ret = vdi_vcodec_trylock(core_idx); + if (ret == 0) { + //trylock success + vdi_set_clock_gate(core_idx, CLK_ENABLE); + } else { + //trylock failure + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + } else { + ret = vdi_vcodec_timelock(core_idx, timeout_ms); + + if (ret != 0) { + CVI_VC_TRACE("TimeLock Timeout, ret %p\n", + __builtin_return_address(0)); + if (ret == ETIMEDOUT) + return RETCODE_VPU_RESPONSE_TIMEOUT; + + CVI_VC_ERR("vdi_vcodec_timelock error[%d]\n", ret); + return RETCODE_FAILURE; + } + } + + vdi_set_clock_gate(core_idx, CLK_ENABLE); + + CoreSleepWake(core_idx, 0); + + return RETCODE_SUCCESS; +} +/* EnterVcodecLock: + * Acquire mutex lock for 264/265 dec/enc thread in one process + */ +void EnterVcodecLock(Uint32 core_idx) +{ + CVI_VC_LOCK("core_idx %d\n", core_idx); + + if (core_idx >= MAX_NUM_VPU_CORE) { + CVI_VC_ERR("core_idx %d\n", core_idx); + return; + } + + vdi_vcodec_lock(core_idx); + vdi_set_clock_gate(core_idx, CLK_ENABLE); + + CoreSleepWake(core_idx, 0); +} + +/* LeaveVcodecLock: + * Release mutex lock for 264/265 dec/enc thread in one process + */ +void LeaveVcodecLock(Uint32 core_idx) +{ + CVI_VC_LOCK("core_idx %d\n", core_idx); + + if (core_idx >= MAX_NUM_VPU_CORE) { + CVI_VC_ERR("core_idx %d\n", core_idx); + return; + } + + CoreSleepWake(core_idx, 1); + + vdi_set_clock_gate(core_idx, CLK_DISABLE); + vdi_vcodec_unlock(core_idx); +} + +void CoreSleepWake(Uint32 coreIdx, int iSleepWake) +{ +#ifdef ARCH_CV183X + UNREFERENCED_PARAMETER(coreIdx); + UNREFERENCED_PARAMETER(iSleepWake); +#else + int coreStatus = CORE_STATUS_WAIT_INIT; + + if (coreIdx >= MAX_NUM_VPU_CORE) { + CVI_VC_ERR("\n"); + return; + } + + if (iSleepWake == 0) { + VPU_GetCoreStatus(coreIdx, &coreStatus); + + if (coreStatus == CORE_STATUS_SLEEP) { + VPU_SleepWake_EX(coreIdx, 0); + VPU_SetCoreStatus(coreIdx, CORE_STATUS_WAKE); + } + } else if (iSleepWake == 1) { + int TaskNum = VPU_GetCoreTaskNum(coreIdx); + + if (TaskNum == 0) { + VPU_SetCoreStatus(coreIdx, CORE_STATUS_WAIT_INIT); + } else { + VPU_GetCoreStatus(coreIdx, &coreStatus); + if (coreStatus != CORE_STATUS_SLEEP) { + VPU_SleepWake_EX(coreIdx, 1); + VPU_SetCoreStatus(coreIdx, CORE_STATUS_SLEEP); + } + } + + VPU_GetCoreStatus(coreIdx, &coreStatus); + } +#endif +} + +RetCode EnterDispFlagLock(Uint32 coreIdx) +{ + if (vdi_disp_lock(coreIdx) != 0) + return RETCODE_FAILURE; + return RETCODE_SUCCESS; +} + +RetCode LeaveDispFlagLock(Uint32 coreIdx) +{ + vdi_disp_unlock(coreIdx); + return RETCODE_SUCCESS; +} + +RetCode SetClockGate(Uint32 coreIdx, Uint32 on) +{ + CodecInst *inst; + vpu_instance_pool_t *vip; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); + if (!vip) { + VLOG(ERR, "SetClockGate: RETCODE_INSUFFICIENT_RESOURCE\n"); + return RETCODE_INSUFFICIENT_RESOURCE; + } + + inst = (CodecInst *)vip->pendingInst; + + if (!on && (inst || !vdi_lock_check(coreIdx))) + return RETCODE_SUCCESS; + + vdi_set_clock_gate(coreIdx, on); + + return RETCODE_SUCCESS; +} + +void SetPendingInst(Uint32 coreIdx, CodecInst *inst, const char *caller_fn, + int caller_line) +{ + vpu_instance_pool_t *vip; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); + if (!vip) + return; + + if (inst) + CVI_VC_TRACE( + "coreIdx %d, set pending inst = %p, inst->instIndex %d, s_n %s, s_line %d\n", + coreIdx, inst, inst->instIndex, caller_fn, caller_line); + else + CVI_VC_TRACE( + "coreIdx %d, clear pending inst, s_n %s, s_line %d\n", + coreIdx, caller_fn, caller_line); + + vip->pendingInst = inst; + if (inst) + vip->pendingInstIdxPlus1 = (inst->instIndex + 1); + else + vip->pendingInstIdxPlus1 = 0; +} + +void ClearPendingInst(Uint32 coreIdx) +{ + vpu_instance_pool_t *vip; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); + if (!vip) + return; + + if (vip->pendingInst) { + vip->pendingInst = 0; + vip->pendingInstIdxPlus1 = 0; + } else { + CVI_VC_ERR("pendingInst is NULL\n"); + } +} + +CodecInst *GetPendingInst(Uint32 coreIdx) +{ + vpu_instance_pool_t *vip; + int pendingInstIdx; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); + if (!vip) { + CVI_VC_ERR("VIP null\n"); + return NULL; + } + + if (!vip->pendingInst) { + return NULL; + } + + pendingInstIdx = vip->pendingInstIdxPlus1 - 1; + if (pendingInstIdx < 0) { + CVI_VC_ERR("pendingInstIdx < 0, vip->pendingInst %p, lr %p\n", + vip->pendingInst, __builtin_return_address(0)); + CVI_VC_ERR("pendingInstIdx %d, vip->pendingInstIdxPlus1 %d\n", + pendingInstIdx, vip->pendingInstIdxPlus1); + return NULL; + } + + if (pendingInstIdx > MAX_NUM_INSTANCE) { + CVI_VC_ERR("pendingInstIdx > MAX_NUM_INSTANCE\n"); + return NULL; + } + return (CodecInst *)vip->codecInstPool[pendingInstIdx]; +} + +#ifdef REDUNDENT_CODE +int GetPendingInstIdx(Uint32 coreIdx) +{ + vpu_instance_pool_t *vip; + + vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx); + if (!vip) + return -1; + + return (vip->pendingInstIdxPlus1 - 1); +} +#endif + +Int32 MaverickCache2Config(MaverickCacheConfig *pCache, BOOL decoder, + BOOL interleave, Uint32 bypass, Uint32 burst, + Uint32 merge, TiledMapType mapType, Uint32 wayshape) +{ + unsigned int cacheConfig = 0; + + if (decoder == TRUE) { + if (mapType == 0) { // LINEAR_FRAME_MAP + // VC1 opposite field padding is not allowable in UV + // separated, burst 8 and linear map + if (!interleave) + burst = 0; + + wayshape = 15; + + if (merge == 1) + merge = 3; + + // GDI constraint. Width should not be over 64 + if ((merge == 1) && (burst)) + burst = 0; + } else { + // horizontal merge constraint in tiled map + if (merge == 1) + merge = 3; + } + } else { // encoder + if (mapType == LINEAR_FRAME_MAP) { + wayshape = 15; + // GDI constraint. Width should not be over 64 + if ((merge == 1) && (burst)) + burst = 0; + } else { + // horizontal merge constraint in tiled map + if (merge == 1) + merge = 3; + } + } + + cacheConfig = (merge & 0x3) << 9; + cacheConfig = cacheConfig | ((wayshape & 0xf) << 5); + cacheConfig = cacheConfig | ((burst & 0x1) << 3); + cacheConfig = cacheConfig | (bypass & 0x3); + + if (mapType != 0) // LINEAR_FRAME_MAP + cacheConfig = cacheConfig | 0x00000004; + + ///{16'b0, 5'b0, merge[1:0], wayshape[3:0], 1'b0, burst[0], map[0], + ///bypass[1:0]}; + pCache->type2.CacheMode = cacheConfig; + + return 1; +} + +#ifdef REDUNDENT_CODE +int GetLowDelayOutput(CodecInst *pCodecInst, DecOutputInfo *info) +{ + Uint32 val = 0; + Uint32 val2 = 0; + Int32 endIndex; + VpuRect rectInfo; + DecInfo *pDecInfo; + + pDecInfo = &pCodecInst->CodecInfo->decInfo; + + info->indexFrameDisplay = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_DISPLAY_IDX); + info->indexFrameDecoded = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_DECODED_IDX); + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_SIZE); // decoding picture size + info->decPicWidth = (val >> 16) & 0xFFFF; + info->decPicHeight = (val)&0xFFFF; + + if (info->indexFrameDecoded >= 0 && + info->indexFrameDecoded < MAX_GDI_IDX) { + // default value + rectInfo.left = 0; + rectInfo.right = info->decPicWidth; + rectInfo.top = 0; + rectInfo.bottom = info->decPicHeight; + + if (pCodecInst->codecMode == AVC_DEC || + pCodecInst->codecMode == MP2_DEC || + pCodecInst->codecMode == C7_AVC_DEC || + pCodecInst->codecMode == C7_MP2_DEC) { + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_CROP_LEFT_RIGHT); // frame + // crop + // information(left, + // right) + val2 = VpuReadReg( + pCodecInst->coreIdx, + RET_DEC_PIC_CROP_TOP_BOTTOM); // frame crop + // information(top, + // bottom) + + if (val == (Uint32)-1 || val == 0) { + rectInfo.left = 0; + rectInfo.right = info->decPicWidth; + } else { + rectInfo.left = ((val >> 16) & 0xFFFF); + rectInfo.right = + info->decPicWidth - (val & 0xFFFF); + } + if (val2 == (Uint32)-1 || val2 == 0) { + rectInfo.top = 0; + rectInfo.bottom = info->decPicHeight; + } else { + rectInfo.top = ((val2 >> 16) & 0xFFFF); + rectInfo.bottom = + info->decPicHeight - (val2 & 0xFFFF); + } + } + + info->rcDecoded.left = + pDecInfo->decOutInfo[info->indexFrameDecoded] + .rcDecoded.left = rectInfo.left; + info->rcDecoded.right = + pDecInfo->decOutInfo[info->indexFrameDecoded] + .rcDecoded.right = rectInfo.right; + info->rcDecoded.top = + pDecInfo->decOutInfo[info->indexFrameDecoded] + .rcDecoded.top = rectInfo.top; + info->rcDecoded.bottom = + pDecInfo->decOutInfo[info->indexFrameDecoded] + .rcDecoded.bottom = rectInfo.bottom; + } else { + info->rcDecoded.left = 0; + info->rcDecoded.right = info->decPicWidth; + info->rcDecoded.top = 0; + info->rcDecoded.bottom = info->decPicHeight; + } + + if (info->indexFrameDisplay >= 0 && + info->indexFrameDisplay < MAX_GDI_IDX) { + if (pCodecInst->codecMode == VC1_DEC || + pCodecInst->codecMode == C7_VC1_DEC) // vc1 rotates decoded + // frame buffer region. + // the other std + // rotated whole frame + // buffer region. + { + if (pDecInfo->rotationEnable && + (pDecInfo->rotationAngle == 90 || + pDecInfo->rotationAngle == 270)) { + info->rcDisplay.left = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.top; + info->rcDisplay.right = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.bottom; + info->rcDisplay.top = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.left; + info->rcDisplay.bottom = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.right; + } else { + info->rcDisplay.left = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.left; + info->rcDisplay.right = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.right; + info->rcDisplay.top = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.top; + info->rcDisplay.bottom = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.bottom; + } + } else { + if (pDecInfo->rotationEnable) { + switch (pDecInfo->rotationAngle) { + case 90: + case 270: + info->rcDisplay.left = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.top; + info->rcDisplay.right = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded + .bottom; + info->rcDisplay.top = + pDecInfo->rotatorOutput.height - + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.right; + info->rcDisplay.bottom = + pDecInfo->rotatorOutput.height - + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.left; + break; + default: + info->rcDisplay.left = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.left; + info->rcDisplay.right = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.right; + info->rcDisplay.top = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.top; + info->rcDisplay.bottom = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded + .bottom; + break; + } + + if (pDecInfo->mirrorEnable) { + Uint32 temp; + if (pDecInfo->mirrorDirection & + MIRDIR_VER) { + temp = info->rcDisplay.top; + info->rcDisplay.top = + info->decPicHeight - + info->rcDisplay.bottom; + info->rcDisplay.bottom = + info->decPicHeight - + temp; + } + if (pDecInfo->mirrorDirection & + MIRDIR_HOR) { + temp = info->rcDisplay.left; + info->rcDisplay.left = + info->decPicWidth - + info->rcDisplay.right; + info->rcDisplay.right = + info->decPicWidth - + temp; + } + } + } else { + info->rcDisplay.left = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.left; + info->rcDisplay.right = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.right; + info->rcDisplay.top = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.top; + info->rcDisplay.bottom = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .rcDecoded.bottom; + } + } + + if (info->indexFrameDisplay == info->indexFrameDecoded) { + info->dispPicWidth = info->decPicWidth; + info->dispPicHeight = info->decPicHeight; + } else { + info->dispPicWidth = + pDecInfo->decOutInfo[info->indexFrameDisplay] + .decPicWidth; + info->dispPicHeight = + pDecInfo->decOutInfo[info->indexFrameDisplay] + .decPicHeight; + } + } else { + info->rcDisplay.left = 0; + info->rcDisplay.right = 0; + info->rcDisplay.top = 0; + info->rcDisplay.bottom = 0; + + info->dispPicWidth = 0; + info->dispPicHeight = 0; + } + + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_TYPE); + info->interlacedFrame = (val >> 18) & 0x1; + info->topFieldFirst = (val >> 21) & 0x0001; // TopFieldFirst[21] + if (info->interlacedFrame) { + info->picTypeFirst = (val & 0x38) >> 3; // pic_type of 1st field + info->picType = val & 7; // pic_type of 2nd field + + } else { + info->picTypeFirst = PIC_TYPE_MAX; // no meaning + info->picType = val & 7; + } + + info->pictureStructure = (val >> 19) & 0x0003; // MbAffFlag[17], + // FieldPicFlag[16] + info->repeatFirstField = (val >> 22) & 0x0001; + info->progressiveFrame = (val >> 23) & 0x0003; + + if (pCodecInst->codecMode == AVC_DEC || + pCodecInst->codecMode == C7_AVC_DEC) { + info->nalRefIdc = (val >> 7) & 0x03; + info->decFrameInfo = (val >> 15) & 0x0001; + info->picStrPresent = (val >> 27) & 0x0001; + info->picTimingStruct = (val >> 28) & 0x000f; + // update picture type when IDR frame + if (val & 0x40) { // 6th bit + if (info->interlacedFrame) + info->picTypeFirst = PIC_TYPE_IDR; + else + info->picType = PIC_TYPE_IDR; + } + info->decFrameInfo = (val >> 16) & 0x0003; + if (info->indexFrameDisplay >= 0) { + if (info->indexFrameDisplay == info->indexFrameDecoded) + info->avcNpfFieldInfo = info->decFrameInfo; + else + info->avcNpfFieldInfo = + pDecInfo->decOutInfo + [info->indexFrameDisplay] + .decFrameInfo; + } + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_HRD_INFO); + info->avcHrdInfo.cpbMinus1 = val >> 2; + info->avcHrdInfo.vclHrdParamFlag = (val >> 1) & 1; + info->avcHrdInfo.nalHrdParamFlag = val & 1; + + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_VUI_INFO); + info->avcVuiInfo.fixedFrameRateFlag = val & 1; + info->avcVuiInfo.timingInfoPresent = (val >> 1) & 0x01; + info->avcVuiInfo.chromaLocBotField = (val >> 2) & 0x07; + info->avcVuiInfo.chromaLocTopField = (val >> 5) & 0x07; + info->avcVuiInfo.chromaLocInfoPresent = (val >> 8) & 0x01; + info->avcVuiInfo.colorPrimaries = (val >> 16) & 0xff; + info->avcVuiInfo.colorDescPresent = (val >> 24) & 0x01; + info->avcVuiInfo.isExtSAR = (val >> 25) & 0x01; + info->avcVuiInfo.vidFullRange = (val >> 26) & 0x01; + info->avcVuiInfo.vidFormat = (val >> 27) & 0x07; + info->avcVuiInfo.vidSigTypePresent = (val >> 30) & 0x01; + info->avcVuiInfo.vuiParamPresent = (val >> 31) & 0x01; + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_VUI_PIC_STRUCT); + info->avcVuiInfo.vuiPicStructPresent = (val & 0x1); + info->avcVuiInfo.vuiPicStruct = (val >> 1); + } + + info->fRateNumerator = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_FRATE_NR); // Frame rate, + // Aspect ratio + // can be + // changed frame + // by frame. + info->fRateDenominator = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_FRATE_DR); + if ((pCodecInst->codecMode == AVC_DEC || + pCodecInst->codecMode == C7_AVC_DEC) && + info->fRateDenominator > 0) + info->fRateDenominator *= 2; + + info->aspectRateInfo = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ASPECT); + + // User Data + if (pDecInfo->userDataEnable) { + int userDataNum; + int userDataSize; + BYTE tempBuf[8] = { + 0, + }; + + VpuReadMem(pCodecInst->coreIdx, pDecInfo->userDataBufAddr + 0, + tempBuf, 8, VPU_USER_DATA_ENDIAN); + + val = ((tempBuf[0] << 24) & 0xFF000000) | + ((tempBuf[1] << 16) & 0x00FF0000) | + ((tempBuf[2] << 8) & 0x0000FF00) | + ((tempBuf[3] << 0) & 0x000000FF); + + userDataNum = (val >> 16) & 0xFFFF; + userDataSize = (val >> 0) & 0xFFFF; + if (userDataNum == 0) + userDataSize = 0; + + info->decOutputExtData.userDataNum = userDataNum; + info->decOutputExtData.userDataSize = userDataSize; + + val = ((tempBuf[4] << 24) & 0xFF000000) | + ((tempBuf[5] << 16) & 0x00FF0000) | + ((tempBuf[6] << 8) & 0x0000FF00) | + ((tempBuf[7] << 0) & 0x000000FF); + + if (userDataNum == 0) + info->decOutputExtData.userDataBufFull = 0; + else + info->decOutputExtData.userDataBufFull = + (val >> 16) & 0xFFFF; + + info->decOutputExtData.activeFormat = + VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_ATSC_USER_DATA_INFO) & + 0xf; + } + + info->numOfErrMBs = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ERR_MB); + + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_SUCCESS); + info->decodingSuccess = val; + info->sequenceChanged = ((val >> 20) & 0x1); + info->streamEndFlag = ((pDecInfo->streamEndflag >> 2) & 0x01); + + endIndex = (pDecInfo->openParam.wtlEnable == TRUE) ? + pDecInfo->numFbsForWTL : + pDecInfo->numFbsForDecoding; + if (0 <= info->indexFrameDisplay && + info->indexFrameDisplay < endIndex) { + info->dispFrame = + pDecInfo->frameBufPool[info->indexFrameDisplay]; + if (pDecInfo->openParam.wtlEnable) { // coda980 only + info->dispFrame = pDecInfo->frameBufPool + [info->indexFrameDisplay + + pDecInfo->numFbsForDecoding]; + } + } + + if (pDecInfo->deringEnable || pDecInfo->mirrorEnable || + pDecInfo->rotationEnable || pDecInfo->tiled2LinearEnable) { + info->dispFrame = pDecInfo->rotatorOutput; + } + + if ((pCodecInst->codecMode == AVC_DEC || + pCodecInst->codecMode == C7_AVC_DEC) && + pCodecInst->codecModeAux == AVC_AUX_MVC) { + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_MVC_REPORT); + info->mvcPicInfo.viewIdxDisplay = (val >> 0) & 1; + info->mvcPicInfo.viewIdxDecoded = (val >> 1) & 1; + } + + if (pCodecInst->codecMode == AVC_DEC || + pCodecInst->codecMode == C7_AVC_DEC) { + val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_AVC_FPA_SEI0); + + if (val == (Uint32)-1) { + info->avcFpaSei.exist = 0; + } else { + info->avcFpaSei.exist = 1; + info->avcFpaSei.framePackingArrangementId = val; + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_AVC_FPA_SEI1); + info->avcFpaSei.contentInterpretationType = + val & 0x3F; // [5:0] + info->avcFpaSei.framePackingArrangementType = + (val >> 6) & 0x7F; // [12:6] + info->avcFpaSei.framePackingArrangementExtensionFlag = + (val >> 13) & 0x01; // [13] + info->avcFpaSei.frame1SelfContainedFlag = + (val >> 14) & 0x01; // [14] + info->avcFpaSei.frame0SelfContainedFlag = + (val >> 15) & 0x01; // [15] + info->avcFpaSei.currentFrameIsFrame0Flag = + (val >> 16) & 0x01; // [16] + info->avcFpaSei.fieldViewsFlag = + (val >> 17) & 0x01; // [17] + info->avcFpaSei.frame0FlippedFlag = + (val >> 18) & 0x01; // [18] + info->avcFpaSei.spatialFlippingFlag = + (val >> 19) & 0x01; // [19] + info->avcFpaSei.quincunxSamplingFlag = + (val >> 20) & 0x01; // [20] + info->avcFpaSei.framePackingArrangementCancelFlag = + (val >> 21) & 0x01; // [21] + + val = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_AVC_FPA_SEI2); + info->avcFpaSei.framePackingArrangementRepetitionPeriod = + val & 0x7FFF; // [14:0] + info->avcFpaSei.frame1GridPositionY = + (val >> 16) & 0x0F; // [19:16] + info->avcFpaSei.frame1GridPositionX = + (val >> 20) & 0x0F; // [23:20] + info->avcFpaSei.frame0GridPositionY = + (val >> 24) & 0x0F; // [27:24] + info->avcFpaSei.frame0GridPositionX = + (val >> 28) & 0x0F; // [31:28] + } + + info->avcPocTop = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC_TOP); + info->avcPocBot = + VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC_BOT); + + if (info->interlacedFrame) { + if (info->avcPocTop > info->avcPocBot) { + info->avcPocPic = info->avcPocBot; + } else { + info->avcPocPic = info->avcPocTop; + } + } else + info->avcPocPic = VpuReadReg(pCodecInst->coreIdx, + RET_DEC_PIC_POC); + } + + // pDecInfo->streamRdPtr //NA + pDecInfo->frameDisplayFlag = VpuReadReg( + pCodecInst->coreIdx, pDecInfo->frameDisplayFlagRegAddr); + // info->consumedByte //NA + // info->notSufficientSliceBuffer; // NA + // info->notSufficientPsBuffer; // NA + // info->bytePosFrameStart //NA + // info->bytePosFrameEnd //NA + // info->rdPtr //NA + // info->wrPtr //NA + + // info->frameCycle //NA + // Vp8ScaleInfo vp8ScaleInfo; //NA + // Vp8PicInfo vp8PicInfo; //NA + // MvcPicInfo mvcPicInfo; ////NA + // info->wprotErrReason; avcVuiInfo + // PhysicalAddress wprotErrAddress; avcVuiInfo + + // Report Information + // info->frameDct; //NA + // info->progressiveSequence; //NA + // info->mp4TimeIncrement; //NA + // info->mp4ModuloTimeBase; //NA + + return 1; +} +#endif + +RetCode AllocateLinearFrameBuffer(TiledMapType mapType, FrameBuffer *fbArr, + Uint32 numOfFrameBuffers, Uint32 sizeLuma, + Uint32 sizeChroma) +{ + Uint32 i; + BOOL yuv422Interleave = FALSE; + BOOL fieldFrame = (BOOL)(mapType == LINEAR_FIELD_MAP); + BOOL cbcrInterleave = (BOOL)(mapType == COMPRESSED_FRAME_MAP || + fbArr[0].cbcrInterleave == TRUE); + BOOL reuseFb = FALSE; + + if (mapType != COMPRESSED_FRAME_MAP) { + switch (fbArr[0].format) { + case FORMAT_YUYV: + case FORMAT_YUYV_P10_16BIT_MSB: + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY: + case FORMAT_VYUY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + yuv422Interleave = TRUE; + break; + default: + yuv422Interleave = FALSE; + break; + } + } + + for (i = 0; i < numOfFrameBuffers; i++) { + reuseFb = (fbArr[i].bufY != (PhysicalAddress)-1 && + fbArr[i].bufCb != (PhysicalAddress)-1 && + fbArr[i].bufCr != (PhysicalAddress)-1); + if (reuseFb == FALSE) { + if (yuv422Interleave == TRUE) { + fbArr[i].bufCb = (PhysicalAddress)-1; + fbArr[i].bufCr = (PhysicalAddress)-1; + } else { + if (fbArr[i].bufCb == (PhysicalAddress)-1) { + fbArr[i].bufCb = + fbArr[i].bufY + + (sizeLuma >> fieldFrame); + CVI_VC_TRACE( + "bufY = 0x%llX, bufCb = 0x%llX\n", + fbArr[i].bufY, fbArr[i].bufCb); + } + if (fbArr[i].bufCr == (PhysicalAddress)-1) { + if (cbcrInterleave == TRUE) { + fbArr[i].bufCr = + (PhysicalAddress)-1; + } else { + fbArr[i].bufCr = + fbArr[i].bufCb + + (sizeChroma >> + fieldFrame); + } + } + } + } + } + + return RETCODE_SUCCESS; +} + +#ifdef REDUNDENT_CODE +/* \brief Allocate tiled framebuffer on GDI version 1.0 H/W. + */ +RetCode AllocateTiledFrameBufferGdiV1(TiledMapType mapType, + PhysicalAddress tiledBaseAddr, + FrameBuffer *fbArr, + Uint32 numOfFrameBuffers, Uint32 sizeLuma, + Uint32 sizeChroma, DRAMConfig *pDramCfg) +{ + Uint32 rasLowBitsForHor; + Uint32 i; + Uint32 cas, ras, bank, bus; + Uint32 lumRasTop, lumRasBot, chrRasTop, chrRasBot; + Uint32 lumFrameRasSize, lumFieldRasSize, chrFieldRasSize; + PhysicalAddress addrY, addrYRas; + + if (mapType == TILED_FRAME_MB_RASTER_MAP || + mapType == TILED_FIELD_MB_RASTER_MAP) { + for (i = 0; i < numOfFrameBuffers; i++) { + int lum_top_base; + int lum_bot_base; + int chr_top_base; + int chr_bot_base; + + addrY = ((fbArr[i].bufY + (16384 - 1)) & ~(16384 - 1)); + + lum_top_base = addrY; + lum_bot_base = addrY + (sizeLuma >> 1); + chr_top_base = addrY + sizeLuma; + chr_bot_base = addrY + sizeLuma + sizeChroma; // cbcr is + // interleaved + + lum_top_base = (lum_top_base >> 12) & 0xfffff; + lum_bot_base = (lum_bot_base >> 12) & 0xfffff; + chr_top_base = (chr_top_base >> 12) & 0xfffff; + chr_bot_base = (chr_bot_base >> 12) & 0xfffff; + + fbArr[i].bufY = + (lum_top_base << 12) | (chr_top_base >> 8); + fbArr[i].bufCb = ((chr_top_base & 0xff) << 24) | + (lum_bot_base << 4) | + (chr_bot_base >> 16); + fbArr[i].bufCr = ((chr_bot_base & 0xffff) << 16); + fbArr[i].bufYBot = (PhysicalAddress)-1; + fbArr[i].bufCbBot = (PhysicalAddress)-1; + fbArr[i].bufCrBot = (PhysicalAddress)-1; + } + } else { + cas = pDramCfg->casBit; + ras = pDramCfg->rasBit; + bank = pDramCfg->bankBit; + bus = pDramCfg->busBit; + if (cas == 9 && bank == 2 && ras == 13) { + rasLowBitsForHor = 3; + } else if (cas == 10 && bank == 3 && ras == 13) { + rasLowBitsForHor = 2; + } else { + return RETCODE_INVALID_PARAM; + } + + for (i = 0; i < numOfFrameBuffers; i++) { + addrY = fbArr[i].bufY - tiledBaseAddr; + // align base_addr to RAS boundary + addrYRas = (addrY + ((1 << (bank + cas + bus)) - 1)) >> + (bank + cas + bus); + // round up RAS lower 3(or 4) bits + addrYRas = + ((addrYRas + ((1 << (rasLowBitsForHor)) - 1)) >> + rasLowBitsForHor) + << rasLowBitsForHor; + + chrFieldRasSize = sizeChroma >> + (pDramCfg->bankBit + + pDramCfg->casBit + pDramCfg->busBit); + lumFieldRasSize = (sizeLuma >> 1) >> + (pDramCfg->bankBit + + pDramCfg->casBit + pDramCfg->busBit); + lumFrameRasSize = lumFieldRasSize * 2; + lumRasTop = addrYRas; + lumRasBot = lumRasTop + lumFieldRasSize; + chrRasTop = lumRasTop + lumFrameRasSize; + chrRasBot = chrRasTop + chrFieldRasSize; + + fbArr[i].bufY = (lumRasBot << 16) + lumRasTop; + fbArr[i].bufCb = (chrRasBot << 16) + chrRasTop; + if (rasLowBitsForHor == 4) { + fbArr[i].bufCr = + ((((chrRasBot >> 4) << 4) + 8) << 16) + + (((chrRasTop >> 4) << 4) + 8); + } else if (rasLowBitsForHor == 3) { + fbArr[i].bufCr = + ((((chrRasBot >> 3) << 3) + 4) << 16) + + (((chrRasTop >> 3) << 3) + 4); + } else if (rasLowBitsForHor == 2) { + fbArr[i].bufCr = + ((((chrRasBot >> 2) << 2) + 2) << 16) + + (((chrRasTop >> 2) << 2) + 2); + } else if (rasLowBitsForHor == 1) { + fbArr[i].bufCr = + ((((chrRasBot >> 1) << 1) + 1) << 16) + + (((chrRasTop >> 1) << 1) + 1); + } else { + return RETCODE_INSUFFICIENT_RESOURCE; // Invalid + // RasLowBit + // value + } + } + } + + return RETCODE_SUCCESS; +} +#endif + +/* \brief Allocate tiled framebuffer on GDI version 2.0 H/W + */ +RetCode AllocateTiledFrameBufferGdiV2(TiledMapType mapType, FrameBuffer *fbArr, + Uint32 numOfFrameBuffers, Uint32 sizeLuma, + Uint32 sizeChroma) +{ + Uint32 i; + Uint32 fieldFrame; + Uint32 sizeFb; + BOOL cbcrInterleave; + + sizeFb = sizeLuma + sizeChroma * 2; + fieldFrame = (mapType == TILED_FIELD_V_MAP || + mapType == TILED_FIELD_NO_BANK_MAP || + mapType == LINEAR_FIELD_MAP); + + for (i = 0; i < numOfFrameBuffers; i++) { + cbcrInterleave = fbArr[0].cbcrInterleave; + + if (fbArr[i].bufCb == (PhysicalAddress)-1) + fbArr[i].bufCb = + fbArr[i].bufY + (sizeLuma >> fieldFrame); + + if (fbArr[i].bufCr == (PhysicalAddress)-1) + fbArr[i].bufCr = + fbArr[i].bufCb + (sizeChroma >> fieldFrame); + + switch (mapType) { + case TILED_FIELD_V_MAP: + case TILED_FIELD_NO_BANK_MAP: + fbArr[i].bufYBot = + fbArr[i].bufY + (sizeFb >> fieldFrame); + fbArr[i].bufCbBot = + fbArr[i].bufYBot + (sizeLuma >> fieldFrame); + if (cbcrInterleave == FALSE) { + fbArr[i].bufCrBot = fbArr[i].bufCbBot + + (sizeChroma >> fieldFrame); + } + break; + case TILED_FRAME_V_MAP: + case TILED_FRAME_H_MAP: + case TILED_MIXED_V_MAP: + case TILED_FRAME_NO_BANK_MAP: + fbArr[i].bufYBot = fbArr[i].bufY; + fbArr[i].bufCbBot = fbArr[i].bufCb; + if (cbcrInterleave == FALSE) { + fbArr[i].bufCrBot = fbArr[i].bufCr; + } + break; + case TILED_FIELD_MB_RASTER_MAP: + fbArr[i].bufYBot = fbArr[i].bufY + (sizeLuma >> 1); + fbArr[i].bufCbBot = fbArr[i].bufCb + sizeChroma; + break; + default: + fbArr[i].bufYBot = 0; + fbArr[i].bufCbBot = 0; + fbArr[i].bufCrBot = 0; + break; + } + } + + return RETCODE_SUCCESS; +} + +Int32 _ConfigSecAXICoda9_182x(Uint32 coreIdx, Int32 codecMode, SecAxiInfo *sa, + Uint32 width) +{ + vpu_buffer_t vb; + int offset; + Uint32 MbNumX = ((width & 0xFFFF) + 15) / 16; + int free_size; + + if (vdi_get_sram_memory(coreIdx, &vb) < 0) { + return 0; + } + + if (!vb.size) { + sa->bufSize = 0; + sa->u.coda9.useBitEnable = 0; + sa->u.coda9.useIpEnable = 0; + sa->u.coda9.useDbkYEnable = 0; + sa->u.coda9.useDbkCEnable = 0; + sa->u.coda9.useOvlEnable = 0; + sa->u.coda9.useBtpEnable = 0; + return 0; + } + + CVI_VC_CFG("Get sram: addr = 0x%llx, size = 0x%x\n", + (Uint64)vb.phys_addr, vb.size); + + vb.phys_addr = (PhysicalAddress)vb.size; + free_size = vb.size; + + offset = 0; + // BIT + if (sa->u.coda9.useBitEnable) { + sa->u.coda9.useBitEnable = 1; + + switch (codecMode) { + case AVC_DEC: + offset = offset + MbNumX * 144; + break; // AVC + case AVC_ENC: { + offset = offset + MbNumX * 16; + } break; + default: + offset = offset + MbNumX * 16; + break; // MPEG-4, Divx3 + } + + if (offset > free_size) { + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + sa->u.coda9.bufBitUse = vb.phys_addr - offset; + CVI_VC_CFG( + "bufBitUse = 0x%llx, offset= 0x%X, free_size = 0x%X\n", + (Uint64)sa->u.coda9.bufBitUse, offset, free_size); + } + + // Intra Prediction, ACDC + if (sa->u.coda9.useIpEnable) { + //sa->u.coda9.bufIpAcDcUse = vb.phys_addr + offset; + sa->u.coda9.useIpEnable = 1; + + switch (codecMode) { + case AVC_DEC: + offset = offset + MbNumX * 32; + break; // AVC + case AVC_ENC: + offset = offset + MbNumX * 64; + break; + default: + offset = offset + MbNumX * 128; + break; // MPEG-4, Divx3 + } + + if (offset > free_size) { + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + sa->u.coda9.bufIpAcDcUse = vb.phys_addr - offset; + CVI_VC_CFG( + "bufIpAcDcUse = 0x%llx, offset = 0x%X, free_size = 0x%X\n", + (Uint64)sa->u.coda9.bufIpAcDcUse, offset, free_size); + } + + // Deblock Chroma + if (sa->u.coda9.useDbkCEnable) { + sa->u.coda9.useDbkCEnable = 1; + switch (codecMode) { + case AVC_DEC: + offset = offset + MbNumX * 64; + break; // AVC + case AVC_ENC: + offset = offset + MbNumX * 64; + break; + default: + offset = offset + MbNumX * 64; + break; + } + + if (offset > free_size) { + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + sa->u.coda9.bufDbkCUse = vb.phys_addr - offset; + CVI_VC_CFG( + "bufDbkCUse = 0x%llx, offset = 0x%X, free_size = 0x%X\n", + (Uint64)sa->u.coda9.bufDbkCUse, offset, free_size); + } + + // Deblock Luma + if (sa->u.coda9.useDbkYEnable) { + sa->u.coda9.useDbkYEnable = 1; + + switch (codecMode) { + case AVC_DEC: + offset = offset + MbNumX * 64; + break; // AVC + case AVC_ENC: + offset = offset + MbNumX * 64; + break; + default: + offset = offset + MbNumX * 128; + break; + } + + if (offset > free_size) { + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + sa->u.coda9.bufDbkYUse = vb.phys_addr - offset; + CVI_VC_CFG( + "bufDbkYUse = 0x%llx, offset = 0x%X, free_size = 0x%X\n", + (Uint64)sa->u.coda9.bufDbkYUse, offset, free_size); + } + + // check the buffer address which is 256 byte is available. + if (((offset + 255) & (~255)) > (int)vb.size) { + VLOG(ERR, "%s:%d NOT ENOUGH SRAM: required(%d), sram(%d)\n", + __func__, __LINE__, offset, vb.size); + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + // VC1 Bit-plane + if (sa->u.coda9.useBtpEnable) { + if (codecMode != VC1_DEC) { + sa->u.coda9.useBtpEnable = 0; + } + } + + // VC1 Overlap + if (sa->u.coda9.useOvlEnable) { + if (codecMode != VC1_DEC) { + sa->u.coda9.useOvlEnable = 0; + } + } + + sa->bufSize = offset; + sa->bufBase = vb.phys_addr - offset; + CVI_VC_CFG("Calc sram used size=0x%x, sa->bufBase = 0x%llx\n", offset, + sa->bufBase); + + return 1; +} + +Int32 ConfigSecAXICoda9(Uint32 coreIdx, Int32 codecMode, SecAxiInfo *sa, + Uint32 width, Uint32 profile, Uint32 interlace) +{ + vpu_buffer_t vb; + int offset; + Uint32 MbNumX = ((width & 0xFFFF) + 15) >> 4; +#ifdef REDUNDENT_CODE + Uint32 productId; +#endif + int free_size; + + if ((codecMode == AVC_DEC) && + (vdi_get_chip_version() == CHIP_ID_1821A || + vdi_get_chip_version() == CHIP_ID_1822) && + ((profile == 66) || (interlace == 0))) { + return _ConfigSecAXICoda9_182x(coreIdx, codecMode, sa, width); + } + + if (vdi_get_sram_memory(coreIdx, &vb) < 0) { + return 0; + } + +#ifdef REDUNDENT_CODE + productId = ProductVpuGetId(coreIdx); +#endif + + if (!vb.size) { + sa->bufSize = 0; + sa->u.coda9.useBitEnable = 0; + sa->u.coda9.useIpEnable = 0; + sa->u.coda9.useDbkYEnable = 0; + sa->u.coda9.useDbkCEnable = 0; + sa->u.coda9.useOvlEnable = 0; + sa->u.coda9.useBtpEnable = 0; + return 0; + } + + CVI_VC_CFG("Get sram: addr = 0x%llx, size = 0x%x\n", + (Uint64)vb.phys_addr, vb.size); + + vb.phys_addr = (PhysicalAddress)vb.size; + free_size = vb.size; + + offset = 0; + // BIT + if (sa->u.coda9.useBitEnable) { + sa->u.coda9.useBitEnable = 1; + + switch (codecMode) { + case AVC_DEC: + offset = offset + MbNumX * 144; + break; // AVC +#ifdef REDUNDENT_CODE + case RV_DEC: + offset = offset + MbNumX * 128; + break; + case VC1_DEC: + offset = offset + MbNumX * 64; + break; + case AVS_DEC: + offset = offset + ((MbNumX + 3) & ~3) * 32; + break; + case MP2_DEC: + offset = offset + MbNumX * 0; + break; + case VPX_DEC: + offset = offset + MbNumX * 0; + break; +#endif + case AVC_ENC: { +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) + offset = offset + MbNumX * 128; + else +#endif + offset = offset + MbNumX * 16; + } break; +#ifdef REDUNDENT_CODE + case MP4_ENC: + offset = offset + MbNumX * 16; + break; +#endif + default: + offset = offset + MbNumX * 16; + break; // MPEG-4, Divx3 + } + + if (offset > free_size) { + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + sa->u.coda9.bufBitUse = vb.phys_addr - offset; + CVI_VC_CFG( + "bufBitUse = 0x%llx, offset= 0x%X, free_size = 0x%X\n", + (Uint64)sa->u.coda9.bufBitUse, offset, free_size); + } + + // Intra Prediction, ACDC + if (sa->u.coda9.useIpEnable) { + //sa->u.coda9.bufIpAcDcUse = vb.phys_addr + offset; + sa->u.coda9.useIpEnable = 1; + + switch (codecMode) { + case AVC_DEC: + offset = offset + MbNumX * 64; + break; // AVC + case RV_DEC: + offset = offset + MbNumX * 64; + break; + case VC1_DEC: + offset = offset + MbNumX * 128; + break; + case AVS_DEC: + offset = offset + MbNumX * 64; + break; + case MP2_DEC: + offset = offset + MbNumX * 0; + break; + case VPX_DEC: + offset = offset + MbNumX * 64; + break; + case AVC_ENC: + offset = offset + MbNumX * 64; + break; + case MP4_ENC: + offset = offset + MbNumX * 128; + break; + default: + offset = offset + MbNumX * 128; + break; // MPEG-4, Divx3 + } + + if (offset > free_size) { + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + sa->u.coda9.bufIpAcDcUse = vb.phys_addr - offset; + CVI_VC_CFG( + "bufIpAcDcUse = 0x%llx, offset = 0x%X, free_size = 0x%X\n", + (Uint64)sa->u.coda9.bufIpAcDcUse, offset, free_size); + } + + // Deblock Chroma + if (sa->u.coda9.useDbkCEnable) { + sa->u.coda9.useDbkCEnable = 1; + switch (codecMode) { + case AVC_DEC: + offset = (profile == 66 /*AVC BP decoder*/) ? + offset + (MbNumX * 64) : + offset + (MbNumX * 128); + break; // AVC + case RV_DEC: + offset = offset + MbNumX * 128; + break; + case VC1_DEC: + offset = profile == 2 ? offset + MbNumX * 256 : + offset + MbNumX * 128; + break; + case AVS_DEC: + offset = offset + MbNumX * 64; + break; + case MP2_DEC: + offset = offset + MbNumX * 64; + break; + case VPX_DEC: + offset = offset + MbNumX * 128; + break; + case MP4_DEC: + offset = offset + MbNumX * 64; + break; + case AVC_ENC: + offset = offset + MbNumX * 64; + break; + case MP4_ENC: + offset = offset + MbNumX * 64; + break; + default: + offset = offset + MbNumX * 64; + break; + } + + if (offset > free_size) { + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + sa->u.coda9.bufDbkCUse = vb.phys_addr - offset; + CVI_VC_CFG( + "bufDbkCUse = 0x%llx, offset = 0x%X, free_size = 0x%X\n", + (Uint64)sa->u.coda9.bufDbkCUse, offset, free_size); + } + + // Deblock Luma + if (sa->u.coda9.useDbkYEnable) { + sa->u.coda9.useDbkYEnable = 1; + + switch (codecMode) { + case AVC_DEC: + offset = (profile == 66 /*AVC BP decoder*/) ? + offset + (MbNumX * 64) : + offset + (MbNumX * 128); + break; // AVC + case RV_DEC: + offset = offset + MbNumX * 128; + break; + case VC1_DEC: + offset = profile == 2 ? offset + MbNumX * 256 : + offset + MbNumX * 128; + break; + case AVS_DEC: + offset = offset + MbNumX * 64; + break; + case MP2_DEC: + offset = offset + MbNumX * 128; + break; + case VPX_DEC: + offset = offset + MbNumX * 128; + break; + case MP4_DEC: + offset = offset + MbNumX * 64; + break; + case AVC_ENC: + offset = offset + MbNumX * 64; + break; + case MP4_ENC: + offset = offset + MbNumX * 64; + break; + default: + offset = offset + MbNumX * 128; + break; + } + + if (offset > free_size) { + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + sa->u.coda9.bufDbkYUse = vb.phys_addr - offset; + CVI_VC_CFG( + "bufDbkYUse = 0x%llx, offset = 0x%X, free_size = 0x%X\n", + (Uint64)sa->u.coda9.bufDbkYUse, offset, free_size); + } + + // check the buffer address which is 256 byte is available. + if (((offset + 255) & (~255)) > (int)vb.size) { + VLOG(ERR, "%s:%d NOT ENOUGH SRAM: required(%d), sram(%d)\n", + __func__, __LINE__, offset, vb.size); + sa->bufSize = 0; + CVI_VC_ERR("offset (0x%X) > free_size (0x%X)\n", offset, + free_size); + return 0; + } + + // VC1 Bit-plane + if (sa->u.coda9.useBtpEnable) { + if (codecMode != VC1_DEC) { + sa->u.coda9.useBtpEnable = 0; + } /* else { + int oneBTP; + + offset = ((offset + 255) & ~255); + sa->u.coda9.bufBtpUse = vb.phys_addr + offset; + sa->u.coda9.useBtpEnable = 1; + + oneBTP = (((MbNumX + 15) / 16) * MbNumY + 1) * 2; + oneBTP = (oneBTP % 256) ? ((oneBTP / 256) + 1) * 256 : + oneBTP; + + offset = offset + oneBTP * 3; + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + }*/ + } + + // VC1 Overlap + if (sa->u.coda9.useOvlEnable) { + if (codecMode != VC1_DEC) { + sa->u.coda9.useOvlEnable = 0; + } /* else { + sa->u.coda9.bufOvlUse = vb.phys_addr + offset; + sa->u.coda9.useOvlEnable = 1; + + offset = offset + MbNumX * 80; + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + }*/ + } + + sa->bufSize = offset; + sa->bufBase = vb.phys_addr - offset; + CVI_VC_CFG("Calc sram used size=0x%x, sa->bufBase = 0x%llx\n", offset, + sa->bufBase); + + return 1; +} + +Int32 ConfigSecAXIWave(Uint32 coreIdx, Int32 codecMode, SecAxiInfo *sa, + Uint32 width, Uint32 height, Uint32 profile, + Uint32 levelIdc) +{ + vpu_buffer_t vb; + int offset; + Uint32 size; + Uint32 lumaSize; + Uint32 chromaSize; + Uint32 productId; + + UNREFERENCED_PARAMETER(codecMode); + UNREFERENCED_PARAMETER(height); + + if (vdi_get_sram_memory(coreIdx, &vb) < 0) + return 0; + + CVI_VC_CFG("Get sram: addr=0x%llx, size=0x%x\n", (Uint64)vb.phys_addr, + vb.size); + + productId = ProductVpuGetId(coreIdx); + + if (!vb.size) { + sa->bufSize = 0; + sa->u.wave4.useIpEnable = 0; + sa->u.wave4.useLfRowEnable = 0; + sa->u.wave4.useBitEnable = 0; + sa->u.wave4.useEncImdEnable = 0; + sa->u.wave4.useEncLfEnable = 0; + sa->u.wave4.useEncRdoEnable = 0; + return 0; + } + + sa->bufBase = vb.phys_addr; + offset = 0; + /* Intra Prediction */ + if (sa->u.wave4.useIpEnable == TRUE) { + sa->u.wave4.bufIp = sa->bufBase + offset; + + CVI_VC_CFG("u.wave4.bufIp=0x%llx, offset=%d\n", + (Uint64)sa->u.wave4.bufIp, offset); + + switch (productId) { +#ifdef REDUNDENT_CODE + case PRODUCT_ID_410: + lumaSize = VPU_ALIGN16(width); + chromaSize = VPU_ALIGN16(width); + break; + case PRODUCT_ID_412: + case PRODUCT_ID_512: + case PRODUCT_ID_515: + if (codecMode == C7_VP9_DEC) { + lumaSize = (VPU_ALIGN128(width) * 10) >> 3; + chromaSize = (VPU_ALIGN128(width) * 10) >> 3; + } else { + lumaSize = + ((VPU_ALIGN16(width) * 10 + 127) >> 7) + << 4; + chromaSize = + ((VPU_ALIGN16(width) * 10 + 127) >> 7) + << 4; + } + break; +#endif + case PRODUCT_ID_4102: + case PRODUCT_ID_420: + case PRODUCT_ID_420L: + case PRODUCT_ID_510: + lumaSize = ((VPU_ALIGN16(width) * 10 + 127) >> 7) << 4; + chromaSize = ((VPU_ALIGN16(width) * 10 + 127) >> 7) + << 4; + break; + default: + return 0; + } + + offset = lumaSize + chromaSize; + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + /* Loopfilter row */ + if (sa->u.wave4.useLfRowEnable == TRUE) { + sa->u.wave4.bufLfRow = sa->bufBase + offset; + + CVI_VC_CFG("u.wave4.bufLfRow=0x%llx, offset=%d\n", + (Uint64)sa->u.wave4.bufLfRow, offset); + + if (codecMode == C7_VP9_DEC) { + if (profile == VP9_PROFILE_2) { + lumaSize = VPU_ALIGN64(width) * 8 * 10 / + 8; /* lumaLIne : 8 */ + chromaSize = VPU_ALIGN64(width) * 8 * 10 / + 8; /* chromaLine : 8 */ + } else { + lumaSize = VPU_ALIGN64(width) * 8; /* lumaLIne + : 8 */ + chromaSize = + VPU_ALIGN64(width) * 8; /* chromaLine + : 8 */ + } + offset += lumaSize + chromaSize; + } else { + Uint32 level = levelIdc / 30; + if (level >= 5) { + size = (VPU_ALIGN32(width) >> 1) * 13 + + VPU_ALIGN64(width) * 4; + } else { + size = VPU_ALIGN64(width) * 13; + } + offset += size; + } + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + if (sa->u.wave4.useBitEnable == TRUE) { + sa->u.wave4.bufBit = sa->bufBase + offset; + if (codecMode == C7_VP9_DEC) { + size = (VPU_ALIGN64(width) >> 6) * (70 * 8); + } else { + size = 34 * 1024; /* Fixed size */ + } + offset += size; + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + if (sa->u.wave4.useEncImdEnable == TRUE) { + /* Main profile(8bit) : Align32(picWidth) + * Main10 profile(10bit): Align32(picWidth) + */ + sa->u.wave4.bufImd = sa->bufBase + offset; + CVI_VC_CFG("u.wave4.bufImd=0x%llx, offset=%d\n", + (Uint64)sa->u.wave4.bufImd, offset); + + offset += VPU_ALIGN32(width); + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + if (sa->u.wave4.useEncLfEnable == TRUE) { + /* Main profile(8bit) : + * Luma = Align64(picWidth) * 5 + * Chroma = Align64(picWidth) * 3 + * Main10 profile(10bit) : + * Luma = Align64(picWidth) * 7 + * Chroma = Align64(picWidth) * 5 + */ + Uint32 luma = (profile == HEVC_PROFILE_MAIN10 ? 7 : 5); + Uint32 chroma = (profile == HEVC_PROFILE_MAIN10 ? 5 : 3); + + sa->u.wave4.bufLf = sa->bufBase + offset; + CVI_VC_CFG("u.wave4.bufLf=0x%llx, offset=%d\n", + (Uint64)sa->u.wave4.bufLf, offset); + + lumaSize = VPU_ALIGN64(width) * luma; + chromaSize = VPU_ALIGN64(width) * chroma; + offset += lumaSize + chromaSize; + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + if (sa->u.wave4.useEncRdoEnable == TRUE) { + switch (productId) { + case PRODUCT_ID_520: + sa->u.wave4.bufRdo = sa->bufBase + offset; + offset += ((288 * VPU_ALIGN64(width)) >> 6); + break; + default: + /* Main profile(8bit) : (Align64(picWidth)/32) * 22*16 + * Main10 profile(10bit): (Align64(picWidth)/32) * 22*16 + */ + sa->u.wave4.bufRdo = sa->bufBase + offset; + offset += (VPU_ALIGN64(width) >> 5) * 22 * 16; + } + + CVI_VC_CFG("u.wave4.bufRdo=0x%llx, offset=%d\n", + (Uint64)sa->u.wave4.bufRdo, offset); + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + sa->bufSize = offset; + + CVI_VC_CFG("Calc sram used size=0x%x, sa->bufBase = 0x%llx\n", offset, + sa->bufBase); + + return 1; +} + +#ifdef REDUNDENT_CODE +Int32 ConfigSecAXICoda7(Uint32 coreIdx, CodStd codStd, SecAxiInfo *sa, + Uint32 width, Uint32 height, Uint32 profile) +{ + vpu_buffer_t vb; + int offset; + Uint32 size; + Uint32 lumaSize; + Uint32 chromaSize; + Uint32 MbNumX = ((width & 0xFFFF) + 15) >> 4; + Uint32 MbNumY = ((height & 0xFFFF) + 15) >> 4; + + if (vdi_get_sram_memory(coreIdx, &vb) < 0) + return 0; + + if (!vb.size) { + sa->bufSize = 0; + sa->u.wave4.useIpEnable = 0; + sa->u.wave4.useLfRowEnable = 0; + sa->u.wave4.useBitEnable = 0; + sa->u.coda9.useBitEnable = 0; + sa->u.coda9.useIpEnable = 0; + sa->u.coda9.useDbkYEnable = 0; + sa->u.coda9.useDbkCEnable = 0; + sa->u.coda9.useOvlEnable = 0; + sa->u.coda9.useMeEnable = 0; + return 0; + } + + sa->bufBase = vb.phys_addr; + offset = 0; + + if (codStd == STD_HEVC) { + /* Intra Prediction */ + if (sa->u.wave4.useIpEnable == TRUE) { + sa->u.wave4.bufIp = sa->bufBase + offset; + lumaSize = ((VPU_ALIGN16(width) * 10 + 127) >> 7) << 4; + chromaSize = ((VPU_ALIGN16(width) * 10 + 127) >> 7) + << 4; + + offset = lumaSize + chromaSize; + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + /* Loopfilter row */ + if (sa->u.wave4.useLfRowEnable == TRUE) { + /* Main profile: Luma 5 lines + Chroma 3 lines + Main10 profile: Luma 7 lines + Chroma 4 lines + */ + Uint32 lumaLines = + (profile == HEVC_PROFILE_MAIN10 ? 7 : 5); + Uint32 chromaLines = + (profile == HEVC_PROFILE_MAIN10 ? 4 : 3); + + sa->u.wave4.bufLfRow = sa->bufBase + offset; + lumaSize = VPU_ALIGN64(width) * lumaLines; + chromaSize = VPU_ALIGN64(width) * chromaLines; + + offset += lumaSize + chromaSize; + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + if (sa->u.wave4.useBitEnable == TRUE) { + sa->u.wave4.bufBit = sa->bufBase + offset; + size = VPU_ALIGN64(width) * 4; + + offset += size; + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + } else { // for legacy codec + /* BIT, VC1 Bit-plane */ + /* Coda7Q use same register for BIT and Bit-plane */ + if (sa->u.coda9.useBitEnable == TRUE) { + sa->u.coda9.bufBitUse = sa->bufBase + offset; + sa->u.coda9.useBitEnable = 1; + + switch (codStd) { + case STD_AVC: + offset = offset + MbNumX * 128; + break; // AVC + case STD_RV: + offset = offset + MbNumX * 128; + break; + case STD_VC1: { + int oneBTP; + + oneBTP = + (((MbNumX + 15) >> 4) * MbNumY + 1) * 2; + oneBTP = (oneBTP % 256) ? + ((oneBTP >> 8) + 1) * 256 : + oneBTP; + + offset = offset + oneBTP * 3; + offset = offset + MbNumX * 64; + } break; + case STD_AVS: + offset = offset + ((MbNumX + 3) & ~3) * 32; + break; + case STD_MPEG2: + offset = offset + MbNumX * 0; + break; + case STD_VP8: + offset = offset + MbNumX * 128; + break; + default: + offset = offset + MbNumX * 16; + break; // MPEG-4, Divx3 + } + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + /* Intra Prediction, ACDC */ + if (sa->u.coda9.useIpEnable == TRUE) { + sa->u.coda9.bufIpAcDcUse = sa->bufBase + offset; + sa->u.coda9.useIpEnable = 1; + + switch (codStd) { + case STD_AVC: + offset = offset + MbNumX * 64 * 2; // MBAFF + // needs + // double + // buffer; + break; // AVC + case STD_RV: + offset = offset + MbNumX * 64; + break; + case STD_VC1: + offset = offset + MbNumX * 128; + break; + case STD_AVS: + offset = offset + MbNumX * 64; + break; + case STD_MPEG2: + offset = offset + MbNumX * 0; + break; + case STD_VP8: + offset = offset + MbNumX * 64; + break; + default: + offset = offset + MbNumX * 128; + break; // MPEG-4, Divx3 + } + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + /* Deblock Chroma */ + if (sa->u.coda9.useDbkCEnable == TRUE) { + sa->u.coda9.bufDbkCUse = sa->bufBase + offset; + sa->u.coda9.useDbkCEnable = 1; + switch (codStd) { + case STD_AVC: + offset = (profile == 66 || profile == 0) ? + (offset + (MbNumX * 64)) : + (offset + (MbNumX * 128)); + break; // AVC + case STD_RV: + offset = offset + MbNumX * 128; + break; + case STD_VC1: + offset = profile == 2 ? offset + MbNumX * 256 : + offset + MbNumX * 128; + offset = (offset + 255) & (~255); + break; + case STD_AVS: + offset = offset + MbNumX * 128; + break; + case STD_MPEG2: + offset = offset + MbNumX * 64; + break; + case STD_VP8: + offset = offset + MbNumX * 128; + break; + default: + offset = offset + MbNumX * 64; + break; + } + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + /* Deblock Luma */ + if (sa->u.coda9.useDbkYEnable == TRUE) { + sa->u.coda9.bufDbkYUse = sa->bufBase + offset; + sa->u.coda9.useDbkYEnable = 1; + + switch (codStd) { + case STD_AVC: + offset = (profile == 66 /*AVC BP decoder*/ || + profile == 0 /* AVC encoder */) ? + (offset + (MbNumX * 64)) : + (offset + (MbNumX * 128)); + break; // AVC + case STD_RV: + offset = offset + MbNumX * 128; + break; + case STD_VC1: + offset = profile == 2 ? offset + MbNumX * 256 : + offset + MbNumX * 128; + offset = (offset + 255) & (~255); + break; + case STD_AVS: + offset = offset + MbNumX * 128; + break; + case STD_MPEG2: + offset = offset + MbNumX * 128; + break; + case STD_VP8: + offset = offset + MbNumX * 128; + break; + default: + offset = offset + MbNumX * 128; + break; + } + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + // check the buffer address which is 256 byte is available. + if (((offset + 255) & (~255)) > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + + /* Motion Estimation */ + if (sa->u.coda9.useMeEnable == TRUE) { + offset = (offset + 255) & (~255); + sa->u.coda9.bufMeUse = sa->bufBase + offset; + sa->u.coda9.useMeEnable = 1; + + offset = offset + MbNumX * 16 * 36 + 2048; + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + + /* VC1 Overlap */ + if (sa->u.coda9.useOvlEnable == TRUE) { + if (codStd != STD_VC1) { + sa->u.coda9.useOvlEnable = 0; + } else { + sa->u.coda9.bufOvlUse = sa->bufBase + offset; + sa->u.coda9.useOvlEnable = 1; + + offset = offset + MbNumX * 80; + + if (offset > (int)vb.size) { + sa->bufSize = 0; + return 0; + } + } + } + } + + sa->bufSize = offset; + + return 1; +} +#endif + +static int SetTiledMapTypeV20(Uint32 coreIdx, TiledMapConfig *pMapCfg, + int mapType, int width, int interleave) +{ +#define GEN_XY2AXI(INV, ZER, TBX, XY, BIT) \ + ((INV) << 7 | (ZER) << 6 | (TBX) << 5 | (XY) << 4 | (BIT)) +#define GEN_CONFIG(A, B, C, D, E, F, G, H, I) \ + ((A) << 20 | (B) << 19 | (C) << 18 | (D) << 17 | (E) << 16 | \ + (F) << 12 | (G) << 8 | (H) << 4 | (I)) +#define X_SEL 0 +#define Y_SEL 1 + + const int luma_map = 0x40; // zero, inv = 1'b0, zero = 1'b1 , tbxor = + // 1'b0, xy = 1'b0, bit = 4'd0 + const int chro_map = 0x40; // zero, inv = 1'b0, zero = 1'b1 , tbxor = + // 1'b0, xy = 1'b0, bit = 4'd0 + int width_chr; + int i; + + pMapCfg->mapType = mapType; + + for (i = 0; i < 32; i = i + 1) { + pMapCfg->xy2axiLumMap[i] = luma_map; + pMapCfg->xy2axiChrMap[i] = chro_map; + } + pMapCfg->xy2axiConfig = 0; + + width_chr = (interleave) ? width : (width >> 1); + + switch (mapType) { + case LINEAR_FRAME_MAP: + case LINEAR_FIELD_MAP: + pMapCfg->xy2axiConfig = 0; +#ifndef PLATFORM_NON_OS + return 1; +#endif + break; + case TILED_FRAME_V_MAP: { + // luma + pMapCfg->xy2axiLumMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiLumMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiLumMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiLumMap[6] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiLumMap[7] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiLumMap[8] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiLumMap[9] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0, 0, 0, Y_SEL, 4); + pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0, 0, 0, X_SEL, 7); + pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0, 0, 0, Y_SEL, 5); + + if (width <= 512) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 1024) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 2048) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { // 4K size + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + // chroma + pMapCfg->xy2axiChrMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiChrMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiChrMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiChrMap[6] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiChrMap[7] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiChrMap[8] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiChrMap[9] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0, 0, 0, Y_SEL, 5); + pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1, 0, 0, X_SEL, 7); + pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1, 0, 0, Y_SEL, 4); + + if (width_chr <= 512) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 1024) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 2048) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { // 4K size + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + // xy2axiConfig + pMapCfg->xy2axiConfig = GEN_CONFIG(0, 0, 0, 1, 1, 15, 0, 15, 0); + break; + } // case TILED_FRAME_V_MAP + case TILED_FRAME_H_MAP: { + pMapCfg->xy2axiLumMap[3] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiLumMap[4] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiLumMap[5] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiLumMap[6] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiLumMap[7] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiLumMap[8] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiLumMap[9] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0, 0, 0, Y_SEL, 4); + pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0, 0, 0, X_SEL, 7); + pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0, 0, 0, Y_SEL, 5); + if (width <= 512) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 1024) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 2048) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { // 4K size + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + pMapCfg->xy2axiChrMap[3] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiChrMap[4] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiChrMap[5] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiChrMap[6] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiChrMap[7] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiChrMap[8] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiChrMap[9] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0, 0, 0, Y_SEL, 5); + pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1, 0, 0, X_SEL, 7); + pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1, 0, 0, Y_SEL, 4); + if (width_chr <= 512) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 1024) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 2048) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { // 4K size + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + // xy2axiConfig + pMapCfg->xy2axiConfig = + GEN_CONFIG(0, 0, 0, 1, 0, 15, 15, 15, 15); + break; + } // case TILED_FRAME_H_MAP: + case TILED_FIELD_V_MAP: { + pMapCfg->xy2axiLumMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiLumMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiLumMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiLumMap[6] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiLumMap[7] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiLumMap[8] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiLumMap[9] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0, 0, 0, Y_SEL, 4); + pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0, 0, 0, X_SEL, 7); + pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0, 0, 1, Y_SEL, 5); + if (width <= 512) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 1024) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 2048) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { // 4K size + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + pMapCfg->xy2axiChrMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiChrMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiChrMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiChrMap[6] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiChrMap[7] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiChrMap[8] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiChrMap[9] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0, 0, 0, Y_SEL, 5); + pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1, 0, 0, X_SEL, 7); + pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1, 0, 1, Y_SEL, 4); + if (width_chr <= 512) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 1024) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 2048) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { // 4K size + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + + // xy2axiConfig + pMapCfg->xy2axiConfig = + GEN_CONFIG(0, 1, 1, 1, 1, 15, 15, 15, 15); + break; + } + case TILED_MIXED_V_MAP: { + pMapCfg->xy2axiLumMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiLumMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiLumMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiLumMap[6] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiLumMap[7] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiLumMap[8] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiLumMap[9] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0, 0, 0, Y_SEL, 4); + pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0, 0, 0, X_SEL, 7); + pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0, 0, 0, Y_SEL, 5); + if (width <= 512) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 1024) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 2048) { + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { // 4K size + pMapCfg->xy2axiLumMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiLumMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + pMapCfg->xy2axiChrMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiChrMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiChrMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiChrMap[6] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiChrMap[7] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiChrMap[8] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiChrMap[9] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0, 0, 0, Y_SEL, 5); + pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1, 0, 0, X_SEL, 7); + pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1, 0, 0, Y_SEL, 4); + if (width_chr <= 512) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 1024) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 2048) { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { + pMapCfg->xy2axiChrMap[14] = + GEN_XY2AXI(0, 0, 0, X_SEL, 8); + pMapCfg->xy2axiChrMap[15] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + // xy2axiConfig + pMapCfg->xy2axiConfig = GEN_CONFIG(0, 0, 1, 1, 1, 7, 7, 7, 7); + break; + } + case TILED_FRAME_MB_RASTER_MAP: { + pMapCfg->xy2axiLumMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiLumMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiLumMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiLumMap[6] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiLumMap[7] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + + pMapCfg->xy2axiChrMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiChrMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiChrMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiChrMap[6] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + + //----------------------------------------------------------- + // mb_addr = mby*stride + mbx + // mb_addr mapping: + // luma : axi_addr[~:8] => axi_addr = + // {mb_addr[23:0],map_addr[7:0]} chroma : axi_addr[~:7] => + // axi_addr = {mb_addr[23:0],map_addr[6:0]} + //----------------------------------------------------------- + + // xy2axiConfig + pMapCfg->xy2axiConfig = GEN_CONFIG(0, 0, 0, 1, 1, 15, 0, 7, 0); + break; + } + case TILED_FIELD_MB_RASTER_MAP: { + pMapCfg->xy2axiLumMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiLumMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiLumMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiLumMap[6] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + + pMapCfg->xy2axiChrMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiChrMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiChrMap[5] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + + //----------------------------------------------------------- + // mb_addr = mby*stride + mbx + // mb_addr mapping: + // luma : axi_addr[~:7] => axi_addr = + // {mb_addr[23:0],map_addr[6:0]} chroma : axi_addr[~:6] => + // axi_addr = {mb_addr[23:0],map_addr[5:0]} + //----------------------------------------------------------- + + // xy2axiConfig + pMapCfg->xy2axiConfig = GEN_CONFIG(0, 1, 1, 1, 1, 7, 7, 3, 3); + + break; + } + case TILED_FRAME_NO_BANK_MAP: + case TILED_FIELD_NO_BANK_MAP: { + // luma + pMapCfg->xy2axiLumMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiLumMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiLumMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiLumMap[6] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiLumMap[7] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiLumMap[8] = GEN_XY2AXI(0, 0, 0, Y_SEL, 4); + pMapCfg->xy2axiLumMap[9] = GEN_XY2AXI(0, 0, 0, Y_SEL, 5); + pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0, 0, 0, X_SEL, 7); + pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0, 0, 0, X_SEL, 8); + if (width <= 512) { + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 1024) { + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width <= 2048) { + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { + pMapCfg->xy2axiLumMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiLumMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiLumMap[18] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiLumMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiLumMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiLumMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiLumMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiLumMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + // chroma + pMapCfg->xy2axiChrMap[3] = GEN_XY2AXI(0, 0, 0, Y_SEL, 0); + pMapCfg->xy2axiChrMap[4] = GEN_XY2AXI(0, 0, 0, Y_SEL, 1); + pMapCfg->xy2axiChrMap[5] = GEN_XY2AXI(0, 0, 0, Y_SEL, 2); + pMapCfg->xy2axiChrMap[6] = GEN_XY2AXI(0, 0, 0, Y_SEL, 3); + pMapCfg->xy2axiChrMap[7] = GEN_XY2AXI(0, 0, 0, X_SEL, 3); + pMapCfg->xy2axiChrMap[8] = GEN_XY2AXI(0, 0, 0, Y_SEL, 4); + pMapCfg->xy2axiChrMap[9] = GEN_XY2AXI(0, 0, 0, Y_SEL, 5); + pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0, 0, 0, Y_SEL, 6); + pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0, 0, 0, X_SEL, 4); + pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(0, 0, 0, X_SEL, 5); + pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(0, 0, 0, X_SEL, 6); + pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0, 0, 0, X_SEL, 7); + pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0, 0, 0, X_SEL, 8); + + if (width_chr <= 512) { + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 1024) { + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else if (width_chr <= 2048) { + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } else { + pMapCfg->xy2axiChrMap[16] = + GEN_XY2AXI(0, 0, 0, X_SEL, 9); + pMapCfg->xy2axiChrMap[17] = + GEN_XY2AXI(0, 0, 0, X_SEL, 10); + pMapCfg->xy2axiChrMap[18] = + GEN_XY2AXI(0, 0, 0, X_SEL, 11); + pMapCfg->xy2axiChrMap[19] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 7); + pMapCfg->xy2axiChrMap[20] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 8); + pMapCfg->xy2axiChrMap[21] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 9); + pMapCfg->xy2axiChrMap[22] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 10); + pMapCfg->xy2axiChrMap[23] = + GEN_XY2AXI(0, 0, 0, Y_SEL, 11); + } + + // xy2axiConfig + if (mapType == TILED_FRAME_NO_BANK_MAP) + pMapCfg->xy2axiConfig = + GEN_CONFIG(0, 0, 0, 1, 1, 15, 0, 15, 0); + else + pMapCfg->xy2axiConfig = + GEN_CONFIG(0, 1, 1, 1, 1, 15, 15, 15, 15); + + break; + } + default: + return 0; + } + + for (i = 0; i < 32; i++) { // xy2axiLumMap + VpuWriteReg(coreIdx, GDI_XY2AXI_LUM_BIT00 + 4 * i, + pMapCfg->xy2axiLumMap[i]); + } + + for (i = 0; i < 32; i++) { // xy2axiChrMap + VpuWriteReg(coreIdx, GDI_XY2AXI_CHR_BIT00 + 4 * i, + pMapCfg->xy2axiChrMap[i]); + } + + // xy2axiConfig + VpuWriteReg(coreIdx, GDI_XY2AXI_CONFIG, pMapCfg->xy2axiConfig); + + // fast access for reading + pMapCfg->tbSeparateMap = (pMapCfg->xy2axiConfig >> 19) & 0x1; + pMapCfg->topBotSplit = (pMapCfg->xy2axiConfig >> 18) & 0x1; + pMapCfg->tiledMap = (pMapCfg->xy2axiConfig >> 17) & 0x1; + + return 1; +} + +static int GetXY2AXILogic(int map_val, int xpos, int ypos, int tb) +{ + int invert; + int assign_zero; + int tbxor; + int xysel; + int bitsel; + + int xypos, xybit, xybit_st1, xybit_st2, xybit_st3; + + invert = map_val >> 7; + assign_zero = (map_val & 0x78) >> 6; + tbxor = (map_val & 0x3C) >> 5; + xysel = (map_val & 0x1E) >> 4; + bitsel = map_val & 0x0f; + + xypos = (xysel) ? ypos : xpos; + xybit = (xypos >> bitsel) & 0x01; + xybit_st1 = (tbxor) ? xybit ^ tb : xybit; + xybit_st2 = (assign_zero) ? 0 : xybit_st1; + xybit_st3 = (invert) ? !xybit_st2 : xybit_st2; + + return xybit_st3; +} + +static int GetXY2AXIAddr20(TiledMapConfig *pMapCfg, int ycbcr, int posY, + int posX, int stride, FrameBuffer *fb) +{ + int tbSeparateMap; + int use_linear_field; + int ypos_field; + int tb; + int chr_flag; + int ypos_mod; + int i; + int mbx, mby; + int mbx_num; + int mb_addr; + int xy2axiLumMap; + int xy2axiChrMap; + int xy2axi_map_sel; + int temp_bit; + int tmp_addr; + int axi_conv; + + int y_top_base; + int cb_top_base; + int cr_top_base; + int y_bot_base; + int cb_bot_base; + int cr_bot_base; + int top_base_addr; + int bot_base_addr; + int base_addr; + int pix_addr; + int mapType; + mapType = fb->mapType; + + if (!pMapCfg) + return -1; + + tbSeparateMap = pMapCfg->tbSeparateMap; + use_linear_field = (mapType == 9); + ypos_field = (posY >> 1); + tb = posY & 1; + ypos_mod = (tbSeparateMap | use_linear_field) ? ypos_field : posY; + chr_flag = (ycbcr >> 1) & 0x1; + + mbx_num = (stride >> 4); + + y_top_base = fb->bufY; + cb_top_base = fb->bufCb; + cr_top_base = fb->bufCr; + y_bot_base = fb->bufYBot; + cb_bot_base = fb->bufCbBot; + cr_bot_base = fb->bufCrBot; + + if (mapType == LINEAR_FRAME_MAP) { + base_addr = (ycbcr == 0) ? y_top_base : + (ycbcr == 2) ? cb_top_base : + cr_top_base; + pix_addr = ((posY * stride) + posX) + base_addr; + } else if (mapType == LINEAR_FIELD_MAP) { + top_base_addr = (ycbcr == 0) ? y_top_base : + (ycbcr == 2) ? cb_top_base : + cr_top_base; + bot_base_addr = (ycbcr == 0) ? y_bot_base : + (ycbcr == 2) ? cb_bot_base : + cr_bot_base; + base_addr = tb ? bot_base_addr : top_base_addr; + + pix_addr = ((ypos_mod * stride) + posX) + base_addr; + } else if (mapType == TILED_FRAME_MB_RASTER_MAP || + mapType == TILED_FIELD_MB_RASTER_MAP) { + top_base_addr = (ycbcr == 0) ? y_top_base : + (ycbcr == 2) ? cb_top_base : + cr_top_base; + bot_base_addr = (ycbcr == 0) ? y_bot_base : + (ycbcr == 2) ? cb_bot_base : + cr_bot_base; + + if (tbSeparateMap & tb) + base_addr = bot_base_addr; + else + base_addr = top_base_addr; + + if (ycbcr == 0) { + mbx = posX >> 4; + mby = posY >> 4; + } else { // always interleave + mbx = posX >> 4; + mby = posY >> 3; + } + + mb_addr = mbx_num * mby + mbx; + + // axi_conv[7:0] + axi_conv = 0; + for (i = 0; i < 8; i++) { + xy2axiLumMap = pMapCfg->xy2axiLumMap[i]; + xy2axiChrMap = pMapCfg->xy2axiChrMap[i]; + xy2axi_map_sel = + (chr_flag) ? xy2axiChrMap : xy2axiLumMap; + temp_bit = GetXY2AXILogic(xy2axi_map_sel, posX, + ypos_mod, tb); + axi_conv = axi_conv + (temp_bit << i); + } + + if (mapType == TILED_FRAME_MB_RASTER_MAP) { + if (chr_flag == 0) + tmp_addr = (mb_addr << 8) + axi_conv; + else // chroma, interleaved only + tmp_addr = (mb_addr << 7) + axi_conv; + } else { // TILED_FIELD_MB_RASTER_MAP + if (chr_flag == 0) + tmp_addr = (mb_addr << 7) + axi_conv; + else // chroma, interleaved only + tmp_addr = (mb_addr << 6) + axi_conv; + } + + pix_addr = tmp_addr + base_addr; + } else { + top_base_addr = (ycbcr == 0) ? y_top_base : + (ycbcr == 2) ? cb_top_base : + cr_top_base; + bot_base_addr = (ycbcr == 0) ? y_bot_base : + (ycbcr == 2) ? cb_bot_base : + cr_bot_base; + if (tbSeparateMap & tb) + base_addr = bot_base_addr; + else + base_addr = top_base_addr; + + // axi_conv[31:0] + axi_conv = 0; + for (i = 0; i < 32; i++) { + xy2axiLumMap = pMapCfg->xy2axiLumMap[i]; + xy2axiChrMap = pMapCfg->xy2axiChrMap[i]; + xy2axi_map_sel = + (chr_flag) ? xy2axiChrMap : xy2axiLumMap; + temp_bit = GetXY2AXILogic(xy2axi_map_sel, posX, + ypos_mod, tb); + axi_conv = axi_conv + (temp_bit << i); + } + + pix_addr = axi_conv + base_addr; + } + + return pix_addr; +} + +#ifdef REDUNDENT_CODE +// GDI related functios for GDI 1.0 +PhysicalAddress GetTiledFrameBase(Uint32 coreIdx, FrameBuffer *frame, int num) +{ + PhysicalAddress baseAddr; + int i; + + UNREFERENCED_PARAMETER(coreIdx); + baseAddr = frame[0].bufY; + for (i = 0; i < num; i++) { + if (frame[i].bufY < baseAddr) + baseAddr = frame[i].bufY; + } + + return baseAddr; +} + +void SetTiledFrameBase(Uint32 coreIdx, PhysicalAddress baseAddr) +{ + VpuWriteReg(coreIdx, GDI_TILEDBUF_BASE, baseAddr); +} + +static int SetTiledMapTypeV10(Uint32 coreIdx, TiledMapConfig *pMapCfg, + DRAMConfig *dramCfg, int stride, int mapType) +{ +#define XY2CONFIG(A, B, C, D, E, F, G, H, I) \ + ((A) << 20 | (B) << 19 | (C) << 18 | (D) << 17 | (E) << 16 | \ + (F) << 12 | (G) << 8 | (H) << 4 | (I)) +#define XY2(A, B, C, D) ((A) << 12 | (B) << 8 | (C) << 4 | (D)) +#define XY2BANK(A, B, C, D, E, F) \ + ((A) << 13 | (B) << 12 | (C) << 8 | (D) << 5 | (E) << 4 | (F)) +#define RBC(A, B, C, D) ((A) << 10 | (B) << 6 | (C) << 4 | (D)) +#define RBC_SAME(A, B) ((A) << 10 | (B) << 6 | (A) << 4 | (B)) +#define X_SEL 0 +#define Y_SEL 1 +#define CA_SEL 0 +#define BA_SEL 1 +#define RA_SEL 2 +#define Z_SEL 3 + int ret; + int luma_map; + int chro_map; + int i; + + UNREFERENCED_PARAMETER(stride); + pMapCfg->mapType = mapType; + // inv = 1'b0, zero = 1'b1 , tbxor = 1'b0, xy = 1'b0, bit = 4'd0 + luma_map = 64; + chro_map = 64; + + for (i = 0; i < 16; i = i + 1) { + pMapCfg->xy2caMap[i] = luma_map << 8 | chro_map; + } + + for (i = 0; i < 4; i = i + 1) { + pMapCfg->xy2baMap[i] = luma_map << 8 | chro_map; + } + + for (i = 0; i < 16; i = i + 1) { + pMapCfg->xy2raMap[i] = luma_map << 8 | chro_map; + } + + ret = stride; // this will be removed after map size optimizing. + ret = 0; + switch (mapType) { + case LINEAR_FRAME_MAP: + pMapCfg->xy2rbcConfig = 0; + ret = 1; + break; + case TILED_FRAME_V_MAP: + if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && + dramCfg->rasBit == 13) { + // CNN setting + // cas + pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); + pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(0, Y_SEL, 5, 4, Y_SEL, 4); + + // ras + pMapCfg->xy2raMap[0] = XY2(X_SEL, 8, X_SEL, 8); + pMapCfg->xy2raMap[1] = XY2(X_SEL, 9, X_SEL, 9); + pMapCfg->xy2raMap[2] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 10, Y_SEL, 10); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[11] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[12] = XY2(Y_SEL, 15, Y_SEL, 15); + + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && + dramCfg->rasBit == 13) { + // cas + pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[4] = XY2(Y_SEL, 3, Y_SEL, 3); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[8] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(0, X_SEL, 8, 4, X_SEL, 8); + pMapCfg->xy2baMap[2] = + XY2BANK(0, Y_SEL, 5, 4, Y_SEL, 5); + + // ras + pMapCfg->xy2raMap[0] = XY2(X_SEL, 9, X_SEL, 9); + pMapCfg->xy2raMap[1] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[2] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 10, Y_SEL, 10); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[11] = XY2(Y_SEL, 15, Y_SEL, 15); + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && + dramCfg->rasBit == 16) { + // DDR3 3BA, DDR4 1BG+2BA + pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); + + pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[8] = XY2(X_SEL, 7, X_SEL, 7); + pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 5); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 8, 4, X_SEL, 8); + pMapCfg->xy2baMap[1] = + XY2BANK(0, X_SEL, 9, 4, X_SEL, 9); + pMapCfg->xy2baMap[2] = + XY2BANK(0, Y_SEL, 5, 4, Y_SEL, 4); + + // ras + pMapCfg->xy2raMap[0] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[1] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[2] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 10, Y_SEL, 10); + + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 15, Y_SEL, 15); + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 4 && + dramCfg->rasBit == 15) { + // DDR3 4BA, DDR4 2BG+2BA + pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); + + pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 4); + pMapCfg->xy2caMap[9] = XY2(Y_SEL, 5, Y_SEL, 6); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(0, X_SEL, 8, 4, X_SEL, 8); + pMapCfg->xy2baMap[2] = + XY2BANK(0, X_SEL, 9, 4, X_SEL, 9); + pMapCfg->xy2baMap[3] = + XY2BANK(0, Y_SEL, 6, 4, Y_SEL, 5); + + // ras + pMapCfg->xy2raMap[0] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[1] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[2] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 10, Y_SEL, 10); + + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 15, Y_SEL, 15); + } + // xy2rbcConfig + pMapCfg->xy2rbcConfig = XY2CONFIG(0, 0, 0, 1, 1, 15, 0, 15, 0); + break; + case TILED_FRAME_H_MAP: + if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && + dramCfg->rasBit == 13) { + // CNN setting + // cas + pMapCfg->xy2caMap[0] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[1] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[2] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[3] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[4] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[5] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[6] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[7] = XY2(Y_SEL, 3, Y_SEL, 3); + pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(0, Y_SEL, 5, 4, Y_SEL, 4); + + // ras + pMapCfg->xy2raMap[0] = XY2(X_SEL, 8, X_SEL, 8); + pMapCfg->xy2raMap[1] = XY2(X_SEL, 9, X_SEL, 9); + pMapCfg->xy2raMap[2] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 10, Y_SEL, 10); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[11] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[12] = XY2(Y_SEL, 15, Y_SEL, 15); + + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && + dramCfg->rasBit == 13) { + // cas + pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[2] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[3] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[4] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[5] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[6] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[7] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[8] = XY2(Y_SEL, 3, Y_SEL, 3); + pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(0, X_SEL, 8, 4, X_SEL, 8); + pMapCfg->xy2baMap[2] = + XY2BANK(0, Y_SEL, 5, 4, Y_SEL, 5); + pMapCfg->xy2raMap[0] = XY2(X_SEL, 9, X_SEL, 9); + pMapCfg->xy2raMap[1] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[2] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 10, Y_SEL, 10); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[11] = XY2(Y_SEL, 15, Y_SEL, 15); + } + // xy2rbcConfig + pMapCfg->xy2rbcConfig = + XY2CONFIG(0, 0, 0, 1, 0, 15, 15, 15, 15); + break; + case TILED_FIELD_V_MAP: + if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && + dramCfg->rasBit == 13) { + // CNN setting + // cas + pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); + pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(1, Y_SEL, 5, 5, Y_SEL, 4); + + // ras + pMapCfg->xy2raMap[0] = XY2(X_SEL, 8, X_SEL, 8); + pMapCfg->xy2raMap[1] = XY2(X_SEL, 9, X_SEL, 9); + pMapCfg->xy2raMap[2] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 10, Y_SEL, 10); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[11] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[12] = XY2(Y_SEL, 15, Y_SEL, 15); + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && + dramCfg->rasBit == 13) { + // cas + pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[4] = XY2(Y_SEL, 3, Y_SEL, 3); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[8] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(0, X_SEL, 8, 4, X_SEL, 8); + pMapCfg->xy2baMap[2] = + XY2BANK(0, Y_SEL, 5, 4, Y_SEL, 5); + pMapCfg->xy2raMap[0] = XY2(X_SEL, 9, X_SEL, 9); + pMapCfg->xy2raMap[1] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[2] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 10, Y_SEL, 10); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[11] = XY2(Y_SEL, 15, Y_SEL, 15); + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && + dramCfg->rasBit == 16) { + // // DDR3 3BA, DDR4 1BG+2BA + pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); + + pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[8] = XY2(X_SEL, 7, X_SEL, 7); + pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 5); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 8, 4, X_SEL, 8); + pMapCfg->xy2baMap[1] = + XY2BANK(0, X_SEL, 9, 4, X_SEL, 9); + pMapCfg->xy2baMap[2] = + XY2BANK(1, Y_SEL, 5, 5, Y_SEL, 4); + + // ras + pMapCfg->xy2raMap[0] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[1] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[2] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 10, Y_SEL, 10); + + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 15, Y_SEL, 15); + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 4 && + dramCfg->rasBit == 15) { + // // DDR3 4BA, DDR4 2BG+2BA + // cas + pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); + + pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 4); + pMapCfg->xy2caMap[9] = XY2(Y_SEL, 5, Y_SEL, 6); + + // xy2rbcConfig + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(0, X_SEL, 8, 4, X_SEL, 8); + pMapCfg->xy2baMap[2] = + XY2BANK(0, X_SEL, 9, 4, X_SEL, 9); + pMapCfg->xy2baMap[3] = + XY2BANK(1, Y_SEL, 6, 5, Y_SEL, 5); + + // ras + pMapCfg->xy2raMap[0] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[1] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[2] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 10, Y_SEL, 10); + + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 15, Y_SEL, 15); + } + // xy2rbcConfig + pMapCfg->xy2rbcConfig = + XY2CONFIG(0, 1, 1, 1, 1, 15, 15, 15, 15); + break; + case TILED_MIXED_V_MAP: + // cas + if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && + dramCfg->rasBit == 13) { + // CNN setting + pMapCfg->xy2caMap[0] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 3, Y_SEL, 3); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5); + + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(0, Y_SEL, 5, 4, Y_SEL, 4); + + pMapCfg->xy2raMap[0] = XY2(X_SEL, 8, X_SEL, 8); + pMapCfg->xy2raMap[1] = XY2(X_SEL, 9, X_SEL, 9); + pMapCfg->xy2raMap[2] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 10, Y_SEL, 10); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[11] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[12] = XY2(Y_SEL, 15, Y_SEL, 15); + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && + dramCfg->rasBit == 13) { + // cas + pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3); + pMapCfg->xy2caMap[4] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[5] = XY2(X_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[6] = XY2(X_SEL, 4, X_SEL, 4); + pMapCfg->xy2caMap[7] = XY2(X_SEL, 5, X_SEL, 5); + pMapCfg->xy2caMap[8] = XY2(X_SEL, 6, X_SEL, 6); + pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4); + + // bank + pMapCfg->xy2baMap[0] = + XY2BANK(0, X_SEL, 7, 4, X_SEL, 7); + pMapCfg->xy2baMap[1] = + XY2BANK(0, X_SEL, 8, 4, X_SEL, 8); + pMapCfg->xy2baMap[2] = + XY2BANK(0, Y_SEL, 5, 4, Y_SEL, 5); + pMapCfg->xy2raMap[0] = XY2(X_SEL, 9, X_SEL, 9); + pMapCfg->xy2raMap[1] = XY2(X_SEL, 10, X_SEL, 10); + pMapCfg->xy2raMap[2] = XY2(Y_SEL, 6, Y_SEL, 6); + pMapCfg->xy2raMap[3] = XY2(Y_SEL, 7, Y_SEL, 7); + pMapCfg->xy2raMap[4] = XY2(Y_SEL, 8, Y_SEL, 8); + pMapCfg->xy2raMap[5] = XY2(Y_SEL, 9, Y_SEL, 9); + pMapCfg->xy2raMap[6] = XY2(Y_SEL, 10, Y_SEL, 10); + pMapCfg->xy2raMap[7] = XY2(Y_SEL, 11, Y_SEL, 11); + pMapCfg->xy2raMap[8] = XY2(Y_SEL, 12, Y_SEL, 12); + pMapCfg->xy2raMap[9] = XY2(Y_SEL, 13, Y_SEL, 13); + pMapCfg->xy2raMap[10] = XY2(Y_SEL, 14, Y_SEL, 14); + pMapCfg->xy2raMap[11] = XY2(Y_SEL, 15, Y_SEL, 15); + } + + // xy2rbcConfig + pMapCfg->xy2rbcConfig = XY2CONFIG(0, 0, 1, 1, 1, 7, 7, 7, 7); + break; + case TILED_FRAME_MB_RASTER_MAP: + // cas + pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2); + pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, X_SEL, 3); + pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, 4, 0); + + // xy2rbcConfig + pMapCfg->xy2rbcConfig = XY2CONFIG(0, 0, 0, 1, 1, 15, 0, 7, 0); + break; + case TILED_FIELD_MB_RASTER_MAP: + // cas + pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0); + pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1); + pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, X_SEL, 3); + pMapCfg->xy2caMap[3] = XY2(X_SEL, 3, 4, 0); + + // xy2rbcConfig + pMapCfg->xy2rbcConfig = XY2CONFIG(0, 1, 1, 1, 1, 7, 7, 3, 3); + break; + default: + return 0; + } + + if (mapType == TILED_FRAME_MB_RASTER_MAP) { + pMapCfg->rbc2axiMap[0] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[1] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[2] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[3] = RBC(CA_SEL, 0, CA_SEL, 0); + pMapCfg->rbc2axiMap[4] = RBC(CA_SEL, 1, CA_SEL, 1); + pMapCfg->rbc2axiMap[5] = RBC(CA_SEL, 2, CA_SEL, 2); + pMapCfg->rbc2axiMap[6] = RBC(CA_SEL, 3, CA_SEL, 3); + pMapCfg->rbc2axiMap[7] = RBC(CA_SEL, 4, CA_SEL, 8); + pMapCfg->rbc2axiMap[8] = RBC(CA_SEL, 8, CA_SEL, 9); + pMapCfg->rbc2axiMap[9] = RBC(CA_SEL, 9, CA_SEL, 10); + pMapCfg->rbc2axiMap[10] = RBC(CA_SEL, 10, CA_SEL, 11); + pMapCfg->rbc2axiMap[11] = RBC(CA_SEL, 11, CA_SEL, 12); + pMapCfg->rbc2axiMap[12] = RBC(CA_SEL, 12, CA_SEL, 13); + pMapCfg->rbc2axiMap[13] = RBC(CA_SEL, 13, CA_SEL, 14); + pMapCfg->rbc2axiMap[14] = RBC(CA_SEL, 14, CA_SEL, 15); + pMapCfg->rbc2axiMap[15] = RBC(CA_SEL, 15, RA_SEL, 0); + pMapCfg->rbc2axiMap[16] = RBC(RA_SEL, 0, RA_SEL, 1); + pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 1, RA_SEL, 2); + pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 2, RA_SEL, 3); + pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 3, RA_SEL, 4); + pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 4, RA_SEL, 5); + pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 5, RA_SEL, 6); + pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 6, RA_SEL, 7); + pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 7, RA_SEL, 8); + pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 8, RA_SEL, 9); + pMapCfg->rbc2axiMap[25] = RBC(RA_SEL, 9, RA_SEL, 10); + pMapCfg->rbc2axiMap[26] = RBC(RA_SEL, 10, RA_SEL, 11); + pMapCfg->rbc2axiMap[27] = RBC(RA_SEL, 11, RA_SEL, 12); + pMapCfg->rbc2axiMap[28] = RBC(RA_SEL, 12, RA_SEL, 13); + pMapCfg->rbc2axiMap[29] = RBC(RA_SEL, 13, RA_SEL, 14); + pMapCfg->rbc2axiMap[30] = RBC(RA_SEL, 14, RA_SEL, 15); + pMapCfg->rbc2axiMap[31] = RBC(RA_SEL, 15, Z_SEL, 0); + ret = 1; + } else if (mapType == TILED_FIELD_MB_RASTER_MAP) { + pMapCfg->rbc2axiMap[0] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[1] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[2] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[3] = RBC(CA_SEL, 0, CA_SEL, 0); + pMapCfg->rbc2axiMap[4] = RBC(CA_SEL, 1, CA_SEL, 1); + pMapCfg->rbc2axiMap[5] = RBC(CA_SEL, 2, CA_SEL, 2); + pMapCfg->rbc2axiMap[6] = RBC(CA_SEL, 3, CA_SEL, 8); + pMapCfg->rbc2axiMap[7] = RBC(CA_SEL, 8, CA_SEL, 9); + pMapCfg->rbc2axiMap[8] = RBC(CA_SEL, 9, CA_SEL, 10); + pMapCfg->rbc2axiMap[9] = RBC(CA_SEL, 10, CA_SEL, 11); + pMapCfg->rbc2axiMap[10] = RBC(CA_SEL, 11, CA_SEL, 12); + pMapCfg->rbc2axiMap[11] = RBC(CA_SEL, 12, CA_SEL, 13); + pMapCfg->rbc2axiMap[12] = RBC(CA_SEL, 13, CA_SEL, 14); + pMapCfg->rbc2axiMap[13] = RBC(CA_SEL, 14, CA_SEL, 15); + pMapCfg->rbc2axiMap[14] = RBC(CA_SEL, 15, RA_SEL, 0); + + pMapCfg->rbc2axiMap[15] = RBC(RA_SEL, 0, RA_SEL, 1); + pMapCfg->rbc2axiMap[16] = RBC(RA_SEL, 1, RA_SEL, 2); + pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 2, RA_SEL, 3); + pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 3, RA_SEL, 4); + pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 4, RA_SEL, 5); + pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 5, RA_SEL, 6); + pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 6, RA_SEL, 7); + pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 7, RA_SEL, 8); + pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 8, RA_SEL, 9); + pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 9, RA_SEL, 10); + pMapCfg->rbc2axiMap[25] = RBC(RA_SEL, 10, RA_SEL, 11); + pMapCfg->rbc2axiMap[26] = RBC(RA_SEL, 11, RA_SEL, 12); + pMapCfg->rbc2axiMap[27] = RBC(RA_SEL, 12, RA_SEL, 13); + pMapCfg->rbc2axiMap[28] = RBC(RA_SEL, 13, RA_SEL, 14); + pMapCfg->rbc2axiMap[29] = RBC(RA_SEL, 14, RA_SEL, 15); + pMapCfg->rbc2axiMap[30] = RBC(RA_SEL, 15, Z_SEL, 0); + pMapCfg->rbc2axiMap[31] = RBC(Z_SEL, 0, Z_SEL, 0); + ret = 1; + } else { + if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && + dramCfg->rasBit == 13) { + pMapCfg->rbc2axiMap[0] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[1] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[2] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[3] = RBC(CA_SEL, 0, CA_SEL, 0); + pMapCfg->rbc2axiMap[4] = RBC(CA_SEL, 1, CA_SEL, 1); + pMapCfg->rbc2axiMap[5] = RBC(CA_SEL, 2, CA_SEL, 2); + pMapCfg->rbc2axiMap[6] = RBC(CA_SEL, 3, CA_SEL, 3); + pMapCfg->rbc2axiMap[7] = RBC(CA_SEL, 4, CA_SEL, 4); + pMapCfg->rbc2axiMap[8] = RBC(CA_SEL, 5, CA_SEL, 5); + pMapCfg->rbc2axiMap[9] = RBC(CA_SEL, 6, CA_SEL, 6); + pMapCfg->rbc2axiMap[10] = RBC(CA_SEL, 7, CA_SEL, 7); + pMapCfg->rbc2axiMap[11] = RBC(CA_SEL, 8, CA_SEL, 8); + + pMapCfg->rbc2axiMap[12] = RBC(BA_SEL, 0, BA_SEL, 0); + pMapCfg->rbc2axiMap[13] = RBC(BA_SEL, 1, BA_SEL, 1); + + pMapCfg->rbc2axiMap[14] = RBC(RA_SEL, 0, RA_SEL, 0); + pMapCfg->rbc2axiMap[15] = RBC(RA_SEL, 1, RA_SEL, 1); + pMapCfg->rbc2axiMap[16] = RBC(RA_SEL, 2, RA_SEL, 2); + pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 3, RA_SEL, 3); + pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 4, RA_SEL, 4); + pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 5, RA_SEL, 5); + pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 6, RA_SEL, 6); + pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 7, RA_SEL, 7); + pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 8, RA_SEL, 8); + pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 9, RA_SEL, 9); + pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 10, RA_SEL, 10); + pMapCfg->rbc2axiMap[25] = RBC(RA_SEL, 11, RA_SEL, 11); + pMapCfg->rbc2axiMap[26] = RBC(RA_SEL, 12, RA_SEL, 12); + pMapCfg->rbc2axiMap[27] = RBC(RA_SEL, 13, RA_SEL, 13); + pMapCfg->rbc2axiMap[28] = RBC(RA_SEL, 14, RA_SEL, 14); + pMapCfg->rbc2axiMap[29] = RBC(RA_SEL, 15, RA_SEL, 15); + pMapCfg->rbc2axiMap[30] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[31] = RBC(Z_SEL, 0, Z_SEL, 0); + + ret = 1; + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && + dramCfg->rasBit == 13) { + pMapCfg->rbc2axiMap[0] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[1] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[2] = RBC(CA_SEL, 0, CA_SEL, 0); + pMapCfg->rbc2axiMap[3] = RBC(CA_SEL, 1, CA_SEL, 1); + pMapCfg->rbc2axiMap[4] = RBC(CA_SEL, 2, CA_SEL, 2); + pMapCfg->rbc2axiMap[5] = RBC(CA_SEL, 3, CA_SEL, 3); + pMapCfg->rbc2axiMap[6] = RBC(CA_SEL, 4, CA_SEL, 4); + pMapCfg->rbc2axiMap[7] = RBC(CA_SEL, 5, CA_SEL, 5); + pMapCfg->rbc2axiMap[8] = RBC(CA_SEL, 6, CA_SEL, 6); + pMapCfg->rbc2axiMap[9] = RBC(CA_SEL, 7, CA_SEL, 7); + pMapCfg->rbc2axiMap[10] = RBC(CA_SEL, 8, CA_SEL, 8); + pMapCfg->rbc2axiMap[11] = RBC(CA_SEL, 9, CA_SEL, 9); + + pMapCfg->rbc2axiMap[12] = RBC(BA_SEL, 0, BA_SEL, 0); + pMapCfg->rbc2axiMap[13] = RBC(BA_SEL, 1, BA_SEL, 1); + pMapCfg->rbc2axiMap[14] = RBC(BA_SEL, 2, BA_SEL, 2); + + pMapCfg->rbc2axiMap[15] = RBC(RA_SEL, 0, RA_SEL, 0); + pMapCfg->rbc2axiMap[16] = RBC(RA_SEL, 1, RA_SEL, 1); + pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 2, RA_SEL, 2); + pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 3, RA_SEL, 3); + pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 4, RA_SEL, 4); + pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 5, RA_SEL, 5); + pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 6, RA_SEL, 6); + pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 7, RA_SEL, 7); + pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 8, RA_SEL, 8); + pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 9, RA_SEL, 9); + pMapCfg->rbc2axiMap[25] = RBC(RA_SEL, 10, RA_SEL, 10); + pMapCfg->rbc2axiMap[26] = RBC(RA_SEL, 11, RA_SEL, 11); + pMapCfg->rbc2axiMap[27] = RBC(RA_SEL, 12, RA_SEL, 12); + pMapCfg->rbc2axiMap[28] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[29] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[30] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[31] = RBC(Z_SEL, 0, Z_SEL, 0); + + ret = 1; + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && + dramCfg->rasBit == 16) { + // DDR3 3BA, DDR4 1BG+2BA + pMapCfg->rbc2axiMap[0] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[1] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[2] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[3] = RBC(CA_SEL, 0, CA_SEL, 0); + pMapCfg->rbc2axiMap[4] = RBC(CA_SEL, 1, CA_SEL, 1); + pMapCfg->rbc2axiMap[5] = RBC(CA_SEL, 2, CA_SEL, 2); + pMapCfg->rbc2axiMap[6] = RBC(CA_SEL, 3, CA_SEL, 3); + pMapCfg->rbc2axiMap[7] = RBC(CA_SEL, 4, CA_SEL, 4); + pMapCfg->rbc2axiMap[8] = RBC(CA_SEL, 5, CA_SEL, 5); + pMapCfg->rbc2axiMap[9] = RBC(CA_SEL, 6, CA_SEL, 6); + pMapCfg->rbc2axiMap[10] = RBC(CA_SEL, 7, CA_SEL, 7); + pMapCfg->rbc2axiMap[11] = RBC(CA_SEL, 8, CA_SEL, 8); + pMapCfg->rbc2axiMap[12] = RBC(CA_SEL, 9, CA_SEL, 9); + + pMapCfg->rbc2axiMap[13] = RBC(BA_SEL, 0, BA_SEL, 0); + pMapCfg->rbc2axiMap[14] = RBC(BA_SEL, 1, BA_SEL, 1); + pMapCfg->rbc2axiMap[15] = RBC(BA_SEL, 2, BA_SEL, 2); + + pMapCfg->rbc2axiMap[16] = RBC(RA_SEL, 0, RA_SEL, 0); + pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 1, RA_SEL, 1); + pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 2, RA_SEL, 2); + pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 3, RA_SEL, 3); + pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 4, RA_SEL, 4); + pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 5, RA_SEL, 5); + pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 6, RA_SEL, 6); + pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 7, RA_SEL, 7); + pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 8, RA_SEL, 8); + pMapCfg->rbc2axiMap[25] = RBC(RA_SEL, 9, RA_SEL, 9); + pMapCfg->rbc2axiMap[26] = RBC(RA_SEL, 10, RA_SEL, 10); + pMapCfg->rbc2axiMap[27] = RBC(RA_SEL, 11, RA_SEL, 11); + pMapCfg->rbc2axiMap[28] = RBC(RA_SEL, 12, RA_SEL, 12); + pMapCfg->rbc2axiMap[29] = RBC(RA_SEL, 13, RA_SEL, 13); + pMapCfg->rbc2axiMap[30] = RBC(RA_SEL, 14, RA_SEL, 14); + pMapCfg->rbc2axiMap[31] = RBC(RA_SEL, 15, RA_SEL, 15); + + ret = 1; + } else if (dramCfg->casBit == 10 && dramCfg->bankBit == 4 && + dramCfg->rasBit == 15) { + // DDR3 4BA, DDR4 2BG+2BA + pMapCfg->rbc2axiMap[0] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[1] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[2] = RBC(Z_SEL, 0, Z_SEL, 0); + pMapCfg->rbc2axiMap[3] = RBC(CA_SEL, 0, CA_SEL, 0); + pMapCfg->rbc2axiMap[4] = RBC(CA_SEL, 1, CA_SEL, 1); + pMapCfg->rbc2axiMap[5] = RBC(CA_SEL, 2, CA_SEL, 2); + pMapCfg->rbc2axiMap[6] = RBC(CA_SEL, 3, CA_SEL, 3); + pMapCfg->rbc2axiMap[7] = RBC(CA_SEL, 4, CA_SEL, 4); + pMapCfg->rbc2axiMap[8] = RBC(CA_SEL, 5, CA_SEL, 5); + pMapCfg->rbc2axiMap[9] = RBC(CA_SEL, 6, CA_SEL, 6); + pMapCfg->rbc2axiMap[10] = RBC(CA_SEL, 7, CA_SEL, 7); + pMapCfg->rbc2axiMap[11] = RBC(CA_SEL, 8, CA_SEL, 8); + pMapCfg->rbc2axiMap[12] = RBC(CA_SEL, 9, CA_SEL, 9); + + pMapCfg->rbc2axiMap[13] = RBC(BA_SEL, 2, BA_SEL, 2); + pMapCfg->rbc2axiMap[14] = RBC(BA_SEL, 3, BA_SEL, 3); + pMapCfg->rbc2axiMap[15] = RBC(BA_SEL, 0, BA_SEL, 0); + pMapCfg->rbc2axiMap[16] = RBC(BA_SEL, 1, BA_SEL, 1); + + pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 0, RA_SEL, 0); + pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 1, RA_SEL, 1); + pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 2, RA_SEL, 2); + pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 3, RA_SEL, 3); + pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 4, RA_SEL, 4); + pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 5, RA_SEL, 5); + pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 6, RA_SEL, 6); + pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 7, RA_SEL, 7); + pMapCfg->rbc2axiMap[25] = RBC(RA_SEL, 8, RA_SEL, 8); + pMapCfg->rbc2axiMap[26] = RBC(RA_SEL, 9, RA_SEL, 9); + pMapCfg->rbc2axiMap[27] = RBC(RA_SEL, 10, RA_SEL, 10); + pMapCfg->rbc2axiMap[28] = RBC(RA_SEL, 11, RA_SEL, 11); + pMapCfg->rbc2axiMap[29] = RBC(RA_SEL, 12, RA_SEL, 12); + pMapCfg->rbc2axiMap[30] = RBC(RA_SEL, 13, RA_SEL, 13); + pMapCfg->rbc2axiMap[31] = RBC(RA_SEL, 14, RA_SEL, 14); + + ret = 1; + } + } + + for (i = 0; i < 16; i++) { // xy2ca_map + VpuWriteReg(coreIdx, GDI_XY2_CAS_0 + 4 * i, + pMapCfg->xy2caMap[i]); + } + + for (i = 0; i < 4; i++) { // xy2baMap + VpuWriteReg(coreIdx, GDI_XY2_BA_0 + 4 * i, + pMapCfg->xy2baMap[i]); + } + + for (i = 0; i < 16; i++) { // xy2raMap + VpuWriteReg(coreIdx, GDI_XY2_RAS_0 + 4 * i, + pMapCfg->xy2raMap[i]); + } + + // xy2rbcConfig + VpuWriteReg(coreIdx, GDI_XY2_RBC_CONFIG, pMapCfg->xy2rbcConfig); + //// fast access for reading + pMapCfg->tbSeparateMap = (pMapCfg->xy2rbcConfig >> 19) & 0x1; + pMapCfg->topBotSplit = (pMapCfg->xy2rbcConfig >> 18) & 0x1; + pMapCfg->tiledMap = (pMapCfg->xy2rbcConfig >> 17) & 0x1; + + // RAS, BA, CAS -> Axi Addr + for (i = 0; i < 32; i++) { + VpuWriteReg(coreIdx, GDI_RBC2_AXI_0 + 4 * i, + pMapCfg->rbc2axiMap[i]); + } + + return ret; +} + +static int GetXY2RBCLogic(int map_val, int xpos, int ypos, int tb) +{ + int invert; + int assign_zero; + int tbxor; + int xysel; + int bitsel; + + int xypos, xybit, xybit_st1, xybit_st2, xybit_st3; + + invert = map_val >> 7; + assign_zero = (map_val & 0x78) >> 6; + tbxor = (map_val & 0x3C) >> 5; + xysel = (map_val & 0x1E) >> 4; + bitsel = map_val & 0x0f; + + xypos = (xysel) ? ypos : xpos; + xybit = (xypos >> bitsel) & 0x01; + xybit_st1 = (tbxor) ? xybit ^ tb : xybit; + xybit_st2 = (assign_zero) ? 0 : xybit_st1; + xybit_st3 = (invert) ? !xybit_st2 : xybit_st2; + + return xybit_st3; +} + +static int GetRBC2AXILogic(int map_val, int ra_in, int ba_in, int ca_in) +{ + int rbc; + int rst_bit; + int rbc_sel = map_val >> 4; + int bit_sel = map_val & 0x0f; + + if (rbc_sel == 0) + rbc = ca_in; + else if (rbc_sel == 1) + rbc = ba_in; + else if (rbc_sel == 2) + rbc = ra_in; + else + rbc = 0; + + rst_bit = ((rbc >> bit_sel) & 1); + + return rst_bit; +} + +static int GetXY2AXIAddrV10(TiledMapConfig *pMapCfg, int ycbcr, int posY, + int posX, int stride, FrameBuffer *fb) +{ + int ypos_mod; + int temp; + int temp_bit; + int i; + int tb; + int ra_base; + int ras_base; + int ra_conv, ba_conv, ca_conv; + + int pix_addr; + + int lum_top_base, chr_top_base; + int lum_bot_base, chr_bot_base; + + int mbx, mby, mb_addr; + int temp_val12bit, temp_val6bit; + int Addr; + int mb_raster_base; + + if (!pMapCfg) + return -1; + + pix_addr = 0; + mb_raster_base = 0; + ra_conv = 0; + ba_conv = 0; + ca_conv = 0; + + tb = posY & 0x1; + + ypos_mod = pMapCfg->tbSeparateMap ? posY >> 1 : posY; + + Addr = ycbcr == 0 ? fb->bufY : ycbcr == 2 ? fb->bufCb : fb->bufCr; + + if (fb->mapType == LINEAR_FRAME_MAP) + return ((posY * stride) + posX) + Addr; + + // 20bit = AddrY [31:12] + lum_top_base = fb->bufY >> 12; + + // 20bit = AddrY [11: 0], AddrCb[31:24] + chr_top_base = ((fb->bufY & 0xfff) << 8) | + ((fb->bufCb >> 24) & 0xff); // 12bit + (32-24) bit + + // 20bit = AddrCb[23: 4] + lum_bot_base = (fb->bufCb >> 4) & 0xfffff; + + // 20bit = AddrCb[ 3: 0], AddrCr[31:16] + chr_bot_base = ((fb->bufCb & 0xf) << 16) | ((fb->bufCr >> 16) & 0xffff); + + if (fb->mapType == TILED_FRAME_MB_RASTER_MAP || + fb->mapType == TILED_FIELD_MB_RASTER_MAP) { + if (ycbcr == 0) { + mbx = posX >> 4; + mby = posY >> 4; + } else { + // always interleave + mbx = posX >> 4; + mby = posY >> 3; + } + + mb_addr = (stride >> 4) * mby + mbx; + + // ca[7:0] + for (i = 0; i < 8; i++) { + if (ycbcr == 2 || ycbcr == 3) + temp = pMapCfg->xy2caMap[i] & 0xff; + else + temp = pMapCfg->xy2caMap[i] >> 8; + temp_bit = GetXY2RBCLogic(temp, posX, ypos_mod, tb); + ca_conv = ca_conv + (temp_bit << i); + } + + // ca[15:8] + ca_conv = ca_conv + ((mb_addr & 0xff) << 8); + + // ra[15:0] + ra_conv = mb_addr >> 8; + + // ra,ba,ca -> axi + for (i = 0; i < 32; i++) { + temp_val12bit = pMapCfg->rbc2axiMap[i]; + temp_val6bit = (ycbcr == 0) ? (temp_val12bit >> 6) : + (temp_val12bit & 0x3f); + + temp_bit = GetRBC2AXILogic(temp_val6bit, ra_conv, + ba_conv, ca_conv); + + pix_addr = pix_addr + (temp_bit << i); + } + + if (pMapCfg->tbSeparateMap == 1 && tb == 1) + mb_raster_base = + ycbcr == 0 ? lum_bot_base : chr_bot_base; + else + mb_raster_base = + ycbcr == 0 ? lum_top_base : chr_top_base; + + pix_addr = pix_addr + (mb_raster_base << 12); + } else { + // ca + for (i = 0; i < 16; i++) { + if (ycbcr == 0 || ycbcr == 1) // clair : there are no + // case ycbcr = 1 + temp = pMapCfg->xy2caMap[i] >> 8; + else + temp = pMapCfg->xy2caMap[i] & 0xff; + + temp_bit = GetXY2RBCLogic(temp, posX, ypos_mod, tb); + ca_conv = ca_conv + (temp_bit << i); + } + + // ba + for (i = 0; i < 4; i++) { + if (ycbcr == 2 || ycbcr == 3) + temp = pMapCfg->xy2baMap[i] & 0xff; + else + temp = pMapCfg->xy2baMap[i] >> 8; + + temp_bit = GetXY2RBCLogic(temp, posX, ypos_mod, tb); + ba_conv = ba_conv + (temp_bit << i); + } + + // ras + for (i = 0; i < 16; i++) { + if (ycbcr == 2 || ycbcr == 3) + temp = pMapCfg->xy2raMap[i] & 0xff; + else + temp = pMapCfg->xy2raMap[i] >> 8; + + temp_bit = GetXY2RBCLogic(temp, posX, ypos_mod, tb); + ra_conv = ra_conv + (temp_bit << i); + } + + if (pMapCfg->tbSeparateMap == 1 && tb == 1) + ras_base = Addr >> 16; + else + ras_base = Addr & 0xffff; + + ra_base = ra_conv + ras_base; + pix_addr = 0; + + // ra,ba,ca -> axi + for (i = 0; i < 32; i++) { + temp_val12bit = pMapCfg->rbc2axiMap[i]; + temp_val6bit = (ycbcr == 0) ? (temp_val12bit >> 6) : + (temp_val12bit & 0x3f); + + temp_bit = GetRBC2AXILogic(temp_val6bit, ra_base, + ba_conv, ca_conv); + + pix_addr = pix_addr + (temp_bit << i); + } + pix_addr += pMapCfg->tiledBaseAddr; + } + + return pix_addr; +} +#endif + +int GetXY2AXIAddr(TiledMapConfig *pMapCfg, int ycbcr, int posY, int posX, + int stride, FrameBuffer *fb) +{ + if (pMapCfg->productId == PRODUCT_ID_980 || + PRODUCT_ID_W_SERIES(pMapCfg->productId)) + return GetXY2AXIAddr20(pMapCfg, ycbcr, posY, posX, stride, fb); +#ifdef REDUNDENT_CODE + else if (pMapCfg->productId == PRODUCT_ID_960) + return GetXY2AXIAddrV10(pMapCfg, ycbcr, posY, posX, stride, fb); +#endif + + return 0; +} + +int SetTiledMapType(Uint32 coreIdx, TiledMapConfig *pMapCfg, int mapType, + int stride, int interleave, DRAMConfig *pDramCfg) +{ + int ret; +#ifndef REDUNDENT_CODE + UNREFERENCED_PARAM(pDramCfg); +#endif + + switch (pMapCfg->productId) { + case PRODUCT_ID_980: + ret = SetTiledMapTypeV20(coreIdx, pMapCfg, mapType, stride, + interleave); + break; +#ifdef REDUNDENT_CODE + case PRODUCT_ID_960: + ret = SetTiledMapTypeV10(coreIdx, pMapCfg, pDramCfg, stride, + mapType); + break; +#endif + case PRODUCT_ID_7503: + case PRODUCT_ID_410: + case PRODUCT_ID_4102: + case PRODUCT_ID_420: + case PRODUCT_ID_420L: + case PRODUCT_ID_412: + case PRODUCT_ID_7Q: + case PRODUCT_ID_510: + case PRODUCT_ID_512: + case PRODUCT_ID_515: + case PRODUCT_ID_520: + ret = 1; + break; + default: + ret = 0; + break; + } + return ret; +} + +Int32 CalcStride(Uint32 width, Uint32 height, FrameBufferFormat format, + BOOL cbcrInterleave, TiledMapType mapType, BOOL isVP9, + BOOL isDec) +{ + Uint32 lumaStride = 0; + Uint32 chromaStride = 0; + + lumaStride = VPU_ALIGN32(width); + + if (height > width) { + if ((mapType >= TILED_FRAME_V_MAP && + mapType <= TILED_MIXED_V_MAP) || + mapType == TILED_FRAME_NO_BANK_MAP || + mapType == TILED_FIELD_NO_BANK_MAP) + width = VPU_ALIGN16(height); // TiledMap constraints + } + if (mapType == LINEAR_FRAME_MAP || mapType == LINEAR_FIELD_MAP) { + Uint32 twice = 0; + + twice = cbcrInterleave == TRUE ? 2 : 1; + switch (format) { + case FORMAT_420: + /* nothing to do */ + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_422_P10_16BIT_MSB: + case FORMAT_422_P10_16BIT_LSB: + lumaStride = VPU_ALIGN32(width) * 2; + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_422_P10_32BIT_MSB: + case FORMAT_422_P10_32BIT_LSB: + if (isVP9 == TRUE) { + lumaStride = + VPU_ALIGN32(((width + 11) / 12) * 16); + chromaStride = + (((width >> 1) + 11) * twice / 12) * 16; + } else { + width = VPU_ALIGN32(width); + lumaStride = + ((VPU_ALIGN16(width) + 11) / 12) * 16; + chromaStride = + ((VPU_ALIGN16((width >> 1)) + 11) * + twice / 12) * + 16; + // if ( isWAVE410 == TRUE ) { + if ((chromaStride * 2) > lumaStride) { + lumaStride = chromaStride * 2; + VLOG(ERR, + "double chromaStride size is bigger than lumaStride\n"); + } + //} + } + if (cbcrInterleave == TRUE) { + lumaStride = MAX(lumaStride, chromaStride); + } + break; + case FORMAT_422: + /* nothing to do */ + break; + case FORMAT_YUYV: // 4:2:2 8bit packed + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + lumaStride = VPU_ALIGN32(width) * 2; + break; + case FORMAT_YUYV_P10_16BIT_MSB: // 4:2:2 10bit packed + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + lumaStride = VPU_ALIGN32(width) * 4; + break; + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + lumaStride = VPU_ALIGN32(width * 2) * 2; + break; + default: + break; + } + } else if (mapType == COMPRESSED_FRAME_MAP) { + switch (format) { + case FORMAT_420: + case FORMAT_422: + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_422_P10_16BIT_MSB: + case FORMAT_422_P10_16BIT_LSB: + case FORMAT_422_P10_32BIT_MSB: + case FORMAT_422_P10_32BIT_LSB: + case FORMAT_YUYV_P10_16BIT_MSB: + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + lumaStride = VPU_ALIGN32(VPU_ALIGN16(width) * 5) >> 2; + lumaStride = VPU_ALIGN32(lumaStride); + break; + default: + return -1; + } + } else if (mapType == TILED_FRAME_NO_BANK_MAP || + mapType == TILED_FIELD_NO_BANK_MAP) { + lumaStride = (width > 4096) ? 8192 : + (width > 2048) ? 4096 : + (width > 1024) ? 2048 : + (width > 512) ? 1024 : + 512; + } else if (mapType == TILED_FRAME_MB_RASTER_MAP || + mapType == TILED_FIELD_MB_RASTER_MAP) { + lumaStride = VPU_ALIGN32(width); + } else { + width = (width < height) ? height : width; + + lumaStride = (width > 4096) ? 8192 : + (width > 2048) ? 4096 : + (width > 1024) ? 2048 : + (width > 512) ? 1024 : + 512; + } + +#ifdef ARCH_CV183X + UNREFERENCED_PARAMETER(isDec); +#else + if ((format == FORMAT_420) && (isDec == TRUE)) { + if (cbcrInterleave == TRUE) { + lumaStride = VPU_ALIGN64(lumaStride); + } else { + lumaStride = VPU_ALIGN128(lumaStride); + } + } +#endif + + return lumaStride; +} + +int LevelCalculation(int MbNumX, int MbNumY, int frameRateInfo, + int interlaceFlag, int BitRate, int SliceNum) +{ + int mbps; + int frameRateDiv, frameRateRes, frameRate; + int mbPicNum = (MbNumX * MbNumY); + int mbFrmNum; + int MaxSliceNum; + + int LevelIdc = 0; + int i, maxMbs; + + if (interlaceFlag) { + mbFrmNum = mbPicNum * 2; + MbNumY *= 2; + } else + mbFrmNum = mbPicNum; + + frameRateDiv = (frameRateInfo >> 16) + 1; + frameRateRes = frameRateInfo & 0xFFFF; + frameRate = math_div(frameRateRes, frameRateDiv); + mbps = mbFrmNum * frameRate; + + for (i = 0; i < MAX_LAVEL_IDX; i++) { + maxMbs = g_anLevelMaxMbs[i]; + if (mbps <= g_anLevelMaxMBPS[i] && + mbFrmNum <= g_anLevelMaxFS[i] && MbNumX <= maxMbs && + MbNumY <= maxMbs && BitRate <= g_anLevelMaxBR[i]) { + LevelIdc = g_anLevel[i]; + break; + } + } + + if (i == MAX_LAVEL_IDX) + i = MAX_LAVEL_IDX - 1; + + if (SliceNum) { + SliceNum = math_div(mbPicNum, SliceNum); + + if (g_anLevelSliceRate[i]) { + MaxSliceNum = math_div( + MAX(mbPicNum, + g_anLevelMaxMBPS[i] / + (172 / (1 + interlaceFlag))), + g_anLevelSliceRate[i]); + + if (SliceNum > MaxSliceNum) + return -1; + } + } + + return LevelIdc; +} + +Int32 CalcLumaSize(Int32 productId, Int32 stride, Int32 height, BOOL cbcrIntl, + TiledMapType mapType, DRAMConfig *pDramCfg) +{ + Int32 unit_size_hor_lum, unit_size_ver_lum, size_dpb_lum, field_map, + size_dpb_lum_4k; + UNREFERENCED_PARAMETER(cbcrIntl); +#ifndef REDUNDENT_CODE + UNREFERENCED_PARAM(productId); + UNREFERENCED_PARAM(pDramCfg); +#endif + + if (mapType == TILED_FIELD_V_MAP || + mapType == TILED_FIELD_NO_BANK_MAP || mapType == LINEAR_FIELD_MAP) { + field_map = 1; + } else { + field_map = 0; + } + + if (mapType == LINEAR_FRAME_MAP || mapType == LINEAR_FIELD_MAP) { + size_dpb_lum = stride * height; + } else if (mapType == COMPRESSED_FRAME_MAP) { + size_dpb_lum = stride * height; + } else if (mapType == TILED_FRAME_NO_BANK_MAP || + mapType == TILED_FIELD_NO_BANK_MAP) { + unit_size_hor_lum = stride; + unit_size_ver_lum = ((((height >> field_map) + 127) >> 7) << 7); + // unit vertical size is 128 pixel + // (8MB) + size_dpb_lum = + unit_size_hor_lum * (unit_size_ver_lum << field_map); + } else if (mapType == TILED_FRAME_MB_RASTER_MAP || + mapType == TILED_FIELD_MB_RASTER_MAP) { +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + size_dpb_lum = stride * height; + + // aligned to 8192*2 (0x4000) for top/bot field + // use upper 20bit address only + size_dpb_lum_4k = ((size_dpb_lum + 16383) >> 14) << 14; + + if (mapType == TILED_FIELD_MB_RASTER_MAP) { + size_dpb_lum_4k = + ((size_dpb_lum_4k + (0x8000 - 1)) & + ~(0x8000 - 1)); + } + + size_dpb_lum = size_dpb_lum_4k; + } else +#endif + { + size_dpb_lum = stride * (height >> field_map); + size_dpb_lum_4k = ((size_dpb_lum + (16384 - 1)) >> 14) + << 14; + size_dpb_lum = size_dpb_lum_4k << field_map; + } + } else { +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + Int32 VerSizePerRas, Ras1DBit; + Int32 ChrSizeYField; + Int32 ChrFieldRasSize, ChrFrameRasSize, LumFieldRasSize, + LumFrameRasSize; + + ChrSizeYField = ((height >> 1) + 1) >> 1; + + if (pDramCfg == NULL) + return 0; + if (mapType == TILED_FRAME_V_MAP) { + if (pDramCfg->casBit == 9 && + pDramCfg->bankBit == 2 && + pDramCfg->rasBit == 13) { // CNN setting + VerSizePerRas = 64; + Ras1DBit = 3; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 13) { + VerSizePerRas = 64; + Ras1DBit = 2; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 16) { // BITMAIN + // setting + VerSizePerRas = 64; // Tile (16x2)*(4*2) + Ras1DBit = 1; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 4 && + pDramCfg->rasBit == 15) { // BITMAIN + // setting + VerSizePerRas = 128; // Tile (8x4)*(8x2) + Ras1DBit = 1; + } else + return 0; + + } else if (mapType == TILED_FRAME_H_MAP) { + if (pDramCfg->casBit == 9 && + pDramCfg->bankBit == 2 && + pDramCfg->rasBit == 13) { // CNN setting + VerSizePerRas = 64; + Ras1DBit = 3; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 13) { + VerSizePerRas = 64; + Ras1DBit = 2; + } else + return 0; + + } else if (mapType == TILED_FIELD_V_MAP) { + if (pDramCfg->casBit == 9 && + pDramCfg->bankBit == 2 && + pDramCfg->rasBit == 13) { // CNN setting + VerSizePerRas = 64; + Ras1DBit = 3; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 13) { + VerSizePerRas = 64; + Ras1DBit = 2; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 16) { // BITMAIN + // setting + VerSizePerRas = 64; // Tile (16x2)*(4*2) + Ras1DBit = 1; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 4 && + pDramCfg->rasBit == 15) { // BITMAIN + // setting + VerSizePerRas = 128; // Tile (8x4)*(8x2) + Ras1DBit = 1; + } else + return 0; + } else { // TILED_FIELD_H_MAP + if (pDramCfg->casBit == 9 && + pDramCfg->bankBit == 2 && + pDramCfg->rasBit == 13) { // CNN setting + VerSizePerRas = 64; + Ras1DBit = 3; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 13) { + VerSizePerRas = 64; + Ras1DBit = 2; + } else + return 0; + } + ChrFieldRasSize = + ((ChrSizeYField + (VerSizePerRas - 1)) / + VerSizePerRas) + << Ras1DBit; + ChrFrameRasSize = ChrFieldRasSize * 2; + LumFieldRasSize = ChrFrameRasSize; + LumFrameRasSize = LumFieldRasSize * 2; + size_dpb_lum = LumFrameRasSize + << (pDramCfg->bankBit + + pDramCfg->casBit + pDramCfg->busBit); + } else +#endif + { // productId != 960 + unit_size_hor_lum = stride; + unit_size_ver_lum = (((height >> field_map) + 63) >> 6) + << 6; + // unit vertical size is 64 pixel (4MB) + size_dpb_lum = unit_size_hor_lum * + (unit_size_ver_lum << field_map); + } + } + + if (vdi_get_chip_version() == CHIP_ID_1821A || + vdi_get_chip_version() == CHIP_ID_1822) + return size_dpb_lum; + + // 4k-aligned for frame buffer addr (VPSS usage) + return VPU_ALIGN4096(size_dpb_lum); +} + +Int32 CalcChromaSize(Int32 productId, Int32 stride, Int32 height, + FrameBufferFormat format, BOOL cbcrIntl, + TiledMapType mapType, DRAMConfig *pDramCfg) +{ + Int32 chr_size_y, chr_size_x; + Int32 chr_vscale, chr_hscale; + Int32 unit_size_hor_chr, unit_size_ver_chr; + Int32 size_dpb_chr, size_dpb_chr_4k; + Int32 field_map; +#ifndef REDUNDENT_CODE + UNREFERENCED_PARAM(productId); + UNREFERENCED_PARAM(pDramCfg); +#endif + + unit_size_hor_chr = 0; + unit_size_ver_chr = 0; + + chr_hscale = 1; + chr_vscale = 1; + + switch (format) { + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_420: + chr_hscale = 2; + chr_vscale = 2; + break; + case FORMAT_224: + chr_vscale = 2; + break; + case FORMAT_422: + case FORMAT_422_P10_16BIT_LSB: + case FORMAT_422_P10_16BIT_MSB: + case FORMAT_422_P10_32BIT_LSB: + case FORMAT_422_P10_32BIT_MSB: + chr_hscale = 2; + break; + case FORMAT_444: + case FORMAT_400: + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + case FORMAT_YUYV_P10_16BIT_MSB: // 4:2:2 10bit packed + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + break; + default: + return 0; + } + + if (mapType == TILED_FIELD_V_MAP || + mapType == TILED_FIELD_NO_BANK_MAP || mapType == LINEAR_FIELD_MAP) { + field_map = 1; + } else { + field_map = 0; + } + + if (mapType == LINEAR_FRAME_MAP || mapType == LINEAR_FIELD_MAP) { + switch (format) { + case FORMAT_420: + unit_size_hor_chr = stride >> 1; + unit_size_ver_chr = height >> 1; + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_420_P10_16BIT_MSB: + unit_size_hor_chr = stride >> 1; + unit_size_ver_chr = height >> 1; + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_420_P10_32BIT_MSB: + unit_size_hor_chr = VPU_ALIGN16((stride >> 1)); + unit_size_ver_chr = height >> 1; + break; + case FORMAT_422: + case FORMAT_422_P10_16BIT_LSB: + case FORMAT_422_P10_16BIT_MSB: + case FORMAT_422_P10_32BIT_LSB: + case FORMAT_422_P10_32BIT_MSB: + unit_size_hor_chr = VPU_ALIGN32((stride >> 1)); + unit_size_ver_chr = height; + break; + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + case FORMAT_YUYV_P10_16BIT_MSB: // 4:2:2 10bit packed + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_LSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_LSB: + unit_size_hor_chr = 0; + unit_size_ver_chr = 0; + break; + default: + break; + } + size_dpb_chr = (format == FORMAT_400) ? + 0 : + unit_size_ver_chr * unit_size_hor_chr; + } else if (mapType == COMPRESSED_FRAME_MAP) { + switch (format) { + case FORMAT_420: + case FORMAT_YUYV: // 4:2:2 8bit packed + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + size_dpb_chr = VPU_ALIGN16((stride >> 1)) * height; + break; + default: + /* 10bit */ + stride = VPU_ALIGN64((stride >> 1)) + 12; /* FIXME: need + width + information */ + size_dpb_chr = VPU_ALIGN32(stride) * VPU_ALIGN4(height); + break; + } + size_dpb_chr = size_dpb_chr >> 1; + } else if (mapType == TILED_FRAME_NO_BANK_MAP || + mapType == TILED_FIELD_NO_BANK_MAP) { + chr_size_y = (height >> field_map) / chr_hscale; + chr_size_x = stride / chr_vscale; + + unit_size_hor_chr = (chr_size_x > 4096) ? 8192 : + (chr_size_x > 2048) ? 4096 : + (chr_size_x > 1024) ? 2048 : + (chr_size_x > 512) ? 1024 : + 512; + unit_size_ver_chr = ((chr_size_y + 127) >> 7) + << 7; // unit vertical size + // is 128 pixel (8MB) + + size_dpb_chr = (format == FORMAT_400) ? + 0 : + (unit_size_hor_chr * + (unit_size_ver_chr << field_map)); + } else if (mapType == TILED_FRAME_MB_RASTER_MAP || + mapType == TILED_FIELD_MB_RASTER_MAP) { +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + chr_size_x = stride / chr_hscale; + chr_size_y = height / chr_hscale; + size_dpb_chr = chr_size_y * chr_size_x; + + // aligned to 8192*2 (0x4000) for top/bot field + // use upper 20bit address only + size_dpb_chr_4k = ((size_dpb_chr + 16383) >> 14) << 14; + + if (mapType == TILED_FIELD_MB_RASTER_MAP) { + size_dpb_chr_4k = + ((size_dpb_chr_4k + (0x8000 - 1)) & + ~(0x8000 - 1)); + } + + size_dpb_chr = size_dpb_chr_4k; + } else +#endif + { + size_dpb_chr = + (format == FORMAT_400) ? + 0 : + ((stride * (height >> field_map)) / + (chr_hscale * chr_vscale)); + size_dpb_chr_4k = ((size_dpb_chr + (16384 - 1)) >> 14) + << 14; + size_dpb_chr = size_dpb_chr_4k << field_map; + } + } else { +#ifdef REDUNDENT_CODE + if (productId == PRODUCT_ID_960) { + int VerSizePerRas, Ras1DBit; + int ChrSizeYField; + int divY; + int ChrFieldRasSize, ChrFrameRasSize; + + divY = format == FORMAT_420 || format == FORMAT_224 ? + 2 : + 1; + + ChrSizeYField = ((height / divY) + 1) >> 1; + if (pDramCfg == NULL) + return 0; + if (mapType == TILED_FRAME_V_MAP) { + if (pDramCfg->casBit == 9 && + pDramCfg->bankBit == 2 && + pDramCfg->rasBit == 13) { // CNN setting + VerSizePerRas = 64; + Ras1DBit = 3; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 13) { + VerSizePerRas = 64; + Ras1DBit = 2; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 16) { // BITMAIN + // setting + VerSizePerRas = 64; // Tile (16x2)*(4*2) + Ras1DBit = 1; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 4 && + pDramCfg->rasBit == 15) { // BITMAIN + // setting + VerSizePerRas = 128; // Tile (8x4)*(8x2) + Ras1DBit = 1; + } else + return 0; + + } else if (mapType == TILED_FRAME_H_MAP) { + if (pDramCfg->casBit == 9 && + pDramCfg->bankBit == 2 && + pDramCfg->rasBit == 13) { // CNN setting + VerSizePerRas = 64; + Ras1DBit = 3; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 13) { + VerSizePerRas = 64; + Ras1DBit = 2; + } else + return 0; + + } else if (mapType == TILED_FIELD_V_MAP) { + if (pDramCfg->casBit == 9 && + pDramCfg->bankBit == 2 && + pDramCfg->rasBit == 13) { // CNN setting + VerSizePerRas = 64; + Ras1DBit = 3; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 13) { + VerSizePerRas = 64; + Ras1DBit = 2; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 16) { // BITMAIN + // setting + VerSizePerRas = 64; // Tile (16x2)*(4*2) + Ras1DBit = 1; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 4 && + pDramCfg->rasBit == 15) { // BITMAIN + // setting + VerSizePerRas = 128; // Tile (8x4)*(8x2) + Ras1DBit = 1; + } else + return 0; + } else { // TILED_FIELD_H_MAP + if (pDramCfg->casBit == 9 && + pDramCfg->bankBit == 2 && + pDramCfg->rasBit == 13) { // CNN setting + VerSizePerRas = 64; + Ras1DBit = 3; + } else if (pDramCfg->casBit == 10 && + pDramCfg->bankBit == 3 && + pDramCfg->rasBit == 13) { + VerSizePerRas = 64; + Ras1DBit = 2; + } else + return 0; + } + ChrFieldRasSize = + ((ChrSizeYField + (VerSizePerRas - 1)) / + VerSizePerRas) + << Ras1DBit; + ChrFrameRasSize = ChrFieldRasSize * 2; + size_dpb_chr = (ChrFrameRasSize << (pDramCfg->bankBit + + pDramCfg->casBit + + pDramCfg->busBit)) / + 2; // divide 2 = to calucate one Cb(or + // Cr) size; + + } else +#endif + { // productId != 960 + chr_size_y = (height >> field_map) / chr_hscale; + chr_size_x = + cbcrIntl == TRUE ? stride : stride / chr_vscale; + + unit_size_hor_chr = (chr_size_x > 4096) ? 8192 : + (chr_size_x > 2048) ? 4096 : + (chr_size_x > 1024) ? 2048 : + (chr_size_x > 512) ? 1024 : + 512; + unit_size_ver_chr = ((chr_size_y + 63) >> 6) + << 6; // unit vertical + // size is 64 + // pixel (4MB) + + size_dpb_chr = + (format == FORMAT_400) ? + 0 : + unit_size_hor_chr * (unit_size_ver_chr + << field_map); + if (cbcrIntl == TRUE) + size_dpb_chr >>= 1; + } + } + + if (vdi_get_chip_version() == CHIP_ID_1821A || + vdi_get_chip_version() == CHIP_ID_1822) + return size_dpb_chr; + + // 4k-aligned for frame buffer addr (VPSS usage) + return VPU_ALIGN4096(size_dpb_chr); +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapifunc.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapifunc.h new file mode 100644 index 0000000000..fbfd81752c --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuapifunc.h @@ -0,0 +1,727 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#ifndef VPUAPI_UTIL_H_INCLUDED +#define VPUAPI_UTIL_H_INCLUDED + +#include "vpuapi.h" + +#include "../cvi/cvi_enc_rc.h" + +// COD_STD +enum { + HEVC_DEC = 0, + AVC_DEC = 0, + VC1_DEC = 1, + HEVC_ENC = 1, + MP2_DEC = 2, + MP4_DEC = 3, + DV3_DEC = 3, + RV_DEC = 4, + AVS_DEC = 5, + VPX_DEC = 7, + MAX_DEC = 7, + AVC_ENC = 8, + MP4_ENC = 11, + MAX_CODECS, +}; + +// new COD_STD since Coda7Q, WAVE412 +enum { + C7_HEVC_DEC = 0x00, + C7_HEVC_ENC = 0x01, + + C7_AVC_DEC = 0x10, + C7_VC1_DEC = 0x11, + C7_MP2_DEC = 0x12, + C7_MP4_DEC = 0x13, + C7_DV3_DEC = 0x13, + C7_RVX_DEC = 0x14, + C7_AVS_DEC = 0x15, + C7_VP9_DEC = 0x16, + C7_VP8_DEC = 0x17, + C7_AVS2_DEC = 0x18, + + C7_VP9_ENC = 0x19, + C7_SVAC_DEC = 0x20, + C7_SVAC_ENC = 0x21, + + C7_AVC_ENC = 0x88, /* The original value is 0x18 */ + C7_MP4_ENC = 0x89, /* The original value is 0x19 */ + + STD_UNKNOWN = 0xFF +}; + +// AUX_COD_STD +enum { MP4_AUX_MPEG4 = 0, MP4_AUX_DIVX3 = 1 }; + +enum { VPX_AUX_THO = 0, VPX_AUX_VP6 = 1, VPX_AUX_VP8 = 2, VPX_AUX_NUM }; + +enum { AVC_AUX_AVC = 0, AVC_AUX_MVC = 1, AVC_AUX_SVC = 2 }; + +// BIT_RUN command +enum { + DEC_SEQ_INIT = 1, + ENC_SEQ_INIT = 1, + DEC_SEQ_END = 2, + ENC_SEQ_END = 2, + PIC_RUN = 3, + SET_FRAME_BUF = 4, + ENCODE_HEADER = 5, + ENC_PARA_SET = 6, + DEC_PARA_SET = 7, + DEC_BUF_FLUSH = 8, + RC_CHANGE_PARAMETER = 9, + VPU_SLEEP = 10, + VPU_WAKE = 11, + ENC_ROI_INIT = 12, + FIRMWARE_GET = 0xf +}; + +enum { + SRC_BUFFER_EMPTY = 0, //!< source buffer doesn't allocated. + SRC_BUFFER_ALLOCATED = 1, //!< source buffer has been allocated. + SRC_BUFFER_SRC_LOADED = 2, //!< source buffer has been allocated. + SRC_BUFFER_USE_ENCODE = 3 //!< source buffer was sent to VPU. but it was + //!< not used for encoding. +}; + +#define HEVC_MAX_SUB_LAYER_ID 6 +#define AVC_MAX_SUB_LAYER_ID 15 + +//#define API_DEBUG +#ifdef API_DEBUG +#ifdef _MSC_VER +#define APIDPRINT(_fmt, ...) printf(_fmt, __VA_ARGS__) +#else +#define APIDPRINT(_fmt, ...) printf(_fmt, ##__VA_ARGS__) +#endif +#else +#define APIDPRINT(_fmt, ...) +#endif + +extern Uint32 __VPU_BUSY_TIMEOUT; +/** + * PRODUCT: CODA960/CODA980/WAVE320 + */ +typedef struct { + union { + struct { + int useBitEnable; + int useIpEnable; + int useDbkYEnable; + int useDbkCEnable; + int useOvlEnable; + int useBtpEnable; + int useMeEnable; // used only for coda7q encoder + PhysicalAddress bufBitUse; + PhysicalAddress bufIpAcDcUse; + PhysicalAddress bufDbkYUse; + PhysicalAddress bufDbkCUse; + PhysicalAddress bufOvlUse; + PhysicalAddress bufBtpUse; + PhysicalAddress bufMeUse; // used only for coda7q + // encoder + } coda9; + struct { + int useIpEnable; + int useLfRowEnable; + int useBitEnable; + PhysicalAddress bufIp; + PhysicalAddress bufLfRow; + PhysicalAddress bufBit; + int useEncImdEnable; + int useEncRdoEnable; + int useEncLfEnable; + PhysicalAddress bufImd; + PhysicalAddress bufRdo; + PhysicalAddress bufLf; + } wave4; + } u; + int bufSize; + PhysicalAddress bufBase; +} SecAxiInfo; + +typedef struct { + DecOpenParam openParam; + DecInitialInfo initialInfo; + DecInitialInfo newSeqInfo; /* Temporal new sequence information */ + PhysicalAddress streamWrPtr; + PhysicalAddress streamRdPtr; + Int32 streamBufFull; + int streamEndflag; + int frameDisplayFlag; + int clearDisplayIndexes; + int setDisplayIndexes; + PhysicalAddress streamRdPtrRegAddr; + PhysicalAddress streamWrPtrRegAddr; + PhysicalAddress streamBufStartAddr; + PhysicalAddress streamBufEndAddr; + PhysicalAddress frameDisplayFlagRegAddr; + PhysicalAddress currentPC; + PhysicalAddress busyFlagAddr; + int streamBufSize; + FrameBuffer frameBufPool[MAX_REG_FRAME]; + vpu_buffer_t vbFrame; + vpu_buffer_t vbWTL; + vpu_buffer_t vbPPU; + vpu_buffer_t vbMV[MAX_REG_FRAME]; + vpu_buffer_t vbFbcYTbl[MAX_REG_FRAME]; + vpu_buffer_t vbFbcCTbl[MAX_REG_FRAME]; + int chBwbFrameIdx; + int chFbcFrameIdx; + BOOL interResChange; + int frameAllocExt; + int ppuAllocExt; + int numFrameBuffers; + int numFbsForDecoding; /*!<< number of framebuffers used in decoding */ + int numFbsForWTL; /*!<< number of linear framebuffer for displaying when + DecInfo::wtlEnable is set to 1 */ + int stride; + int frameBufferHeight; + int rotationEnable; + int mirrorEnable; + int deringEnable; + MirrorDirection mirrorDirection; + int rotationAngle; + FrameBuffer rotatorOutput; + int rotatorStride; + int rotatorOutputValid; + int initialInfoObtained; + int vc1BframeDisplayValid; + int mapType; + int tiled2LinearEnable; + int tiled2LinearMode; + int wtlEnable; + int wtlMode; + FrameBufferFormat wtlFormat; /*!<< default value: FORMAT_420 8bit */ + SecAxiInfo secAxiInfo; + MaverickCacheConfig cacheConfig; + int chunkSize; + int seqInitEscape; + + // Report Information + PhysicalAddress userDataBufAddr; + vpu_buffer_t vbUserData; + + BOOL userDataEnable; /* User Data Enable Flag + CODA9xx: TRUE or FALSE + WAVE4xx: Refer to + H265_USERDATA_FLAG_xxx values in vpuapi.h */ + int userDataBufSize; + int userDataReportMode; // User Data report mode (0 : interrupt mode, 1 + // interrupt disable mode) + + BOOL cuDataEnable; //!<< Enable reporting CU data + Int32 cuDataBufSize; //!<< Size of CU buffer in bytes + PhysicalAddress cuDataBufAddr; //!<< Physical address + + LowDelayInfo lowDelayInfo; + int frameStartPos; + int frameEndPos; + int frameDelay; + vpu_buffer_t vbSlice; // AVC, VP8 only + vpu_buffer_t vbWork; + vpu_buffer_t vbTemp; + vpu_buffer_t vbReport; + int workBufferAllocExt; + DecOutputInfo decOutInfo[MAX_GDI_IDX]; + TiledMapConfig mapCfg; + int reorderEnable; + Uint32 avcErrorConcealMode; + DRAMConfig dramCfg; // coda960 only + int thumbnailMode; + int seqChangeMask; // WAVE410 + Uint32 prevFrameEndPos; //!<< WAVE410v2: end position of previous frame + Int32 targetSubLayerId; //!<< H.265 temporal scalability + + Uint32 div3Width; // for CODA7Q + Uint32 div3Height; // for CODA7Q + int rdPtrValidFlag; + + Int32 instanceQueueCount; + Int32 totalQueueCount; +} DecInfo; + +typedef struct { + EncOpenParam openParam; + EncInitialInfo initialInfo; + PhysicalAddress streamRdPtr; + PhysicalAddress streamWrPtr; + int streamEndflag; + PhysicalAddress streamRdPtrRegAddr; + PhysicalAddress streamWrPtrRegAddr; + PhysicalAddress streamBufStartAddr; + PhysicalAddress streamBufEndAddr; + PhysicalAddress currentPC; + PhysicalAddress busyFlagAddr; + int streamBufSize; + int linear2TiledEnable; + int linear2TiledMode; // coda980 only + int mapType; + int userMapEnable; + FrameBuffer frameBufPool[MAX_REG_FRAME]; + vpu_buffer_t vbFrame; + vpu_buffer_t vbPPU; + int frameAllocExt; + int ppuAllocExt; + vpu_buffer_t vbSubSampFrame; /*!<< CODA960 only */ + vpu_buffer_t vbMvcSubSampFrame; /*!<< CODA960 only */ + int numFrameBuffers; + int stride; + int frameBufferHeight; + int rotationEnable; + int mirrorEnable; + MirrorDirection mirrorDirection; + int rotationAngle; + int initialInfoObtained; + int ringBufferEnable; + SecAxiInfo secAxiInfo; + MaverickCacheConfig cacheConfig; + + int sliceIntEnable; /*!<< WAVE420 only */ + + int ActivePPSIdx; /*!<< CODA980 */ + int frameIdx; /*!<< CODA980 */ + int fieldDone; /*!<< CODA980 */ + int encoded_frames_in_gop; + int lineBufIntEn; + int bEsBufQueueEn; + vpu_buffer_t vbWork; + vpu_buffer_t vbScratch; + + vpu_buffer_t vbTemp; //!< Temp buffer (WAVE420) + vpu_buffer_t vbMV; //!< colMV buffer (WAVE420) + vpu_buffer_t vbFbcYTbl; //!< FBC Luma table buffer (WAVE420) + vpu_buffer_t vbFbcCTbl; //!< FBC Chroma table buffer (WAVE420) + vpu_buffer_t vbSubSamBuf; //!< Sub-sampled buffer for ME (WAVE420) + + TiledMapConfig mapCfg; + DRAMConfig dramCfg; /*!<< CODA960 */ + + Uint32 prefixSeiNalEnable; + Uint32 prefixSeiDataSize; + Uint32 prefixSeiDataEncOrder; + PhysicalAddress prefixSeiNalAddr; + Uint32 suffixSeiNalEnable; + Uint32 suffixSeiDataSize; + Uint32 suffixSeiDataEncOrder; + PhysicalAddress suffixSeiNalAddr; + + Int32 errorReasonCode; + Uint64 curPTS; /**! Current timestamp in 90KHz */ + Uint64 ptsMap[32]; /**! PTS mapped with source frame index */ + Uint32 instanceQueueCount; + Uint32 totalQueueCount; + +#ifdef SUPPORT_980_ROI_RC_LIB + frm_rc_t frm_rc; + int prevWrPtr; /**< An WrPtr for previous frame encoding. to calculate + real encoded bit when ringbuffer == 1 */ + // SVC_T parameter in Coda 980 + gop_entry_t gop_entry[MAX_GOP_SIZE * 2]; + rps_t rps[MAX_GOP_SIZE * 2]; + int gop_size; // hierarchical ref-frame structure + int max_latency_pictures; + int num_reorder_frames; + int use_long_term_seq; + int max_dec_buffering; + int max_temporal_id; + int num_ref_frames_decoder; + int max_dec_buffering_decoder; + int num_total_frames; + int temporal_id; + // Long term + int curr_long_term; + int long_term_period; + int virtual_i_period; + int longterm_frmidx; + int ref_long_term; + + frm_t frm[31]; // In H.264, max_dec_buffering does not count current + // recon frame. + frm_t *curr_frm; + + int num_mmco1; + int prev_idx; + int enc_idx_modulo; + int enc_idx_gop; + unsigned int src_idx; + unsigned int src_idx_last_idr; + int prev_frame_num; + int mmco1_frmidx[MAX_GOP_SIZE]; + int num_ref_idx; + int ref_pic_list; + // int nal_ref_idc; + int nal_unit_type; + int num_ref_frame; + int nal_ref_idc; + int idr_picture; + int Idr_picId; + int slice_type; + int is_skip_picture; + + int Idr_cnt; + int frm_cnt; + int enc_long_term_cnt; + //~ SVC_T parameter in Coda 980 +#endif + + BOOL force_as_long_term_ref; + int pic_ctu_avg_qp; + int singleLumaBuf; + bool cviRcEn; + bool addrRemapEn; + AddrRemap addrRemap; + bool bSbmEn; +} EncInfo; + +typedef struct _CVI_CODEC_ { + Int32 frameNo; +} CVI_CODEC; + +typedef enum _CodecInstState_ { + CODEC_STAT_ENC_PIC = 0, + CODEC_STAT_GET_BS, + CODEC_STAT_MAX +} CodecInstState; + +typedef struct CodecInst { + Int32 inUse; + Int32 instIndex; + Int32 coreIdx; + Int32 codecMode; + Int32 codecModeAux; + Int32 productId; +#ifdef ENABLE_CNM_DEBUG_MSG + Int32 loggingEnable; +#endif + Uint32 isDecoder; + Int32 state; + union { + EncInfo encInfo; + DecInfo decInfo; + } *CodecInfo; + + CVI_CODEC cvi; + stRcInfo rcInfo; + int cviApiMode; + Uint64 yuvCnt; + Uint64 u64StartTime; + Uint64 u64EndTime; + Int32 s32ChnNum; + Uint8 bBuffFull; +} CodecInst; + +/******************************************************************************* + * H.265 USER DATA(VUI and SEI) * + *******************************************************************************/ +#define H265_MAX_DPB_SIZE 17 +#define H265_MAX_NUM_SUB_LAYER 8 +#define H265_MAX_NUM_ST_RPS 64 +#define H265_MAX_CPB_CNT 32 +#define H265_MAX_NUM_VERTICAL_FILTERS 5 +#define H265_MAX_NUM_HORIZONTAL_FILTERS 3 +#define H265_MAX_TAP_LENGTH 32 +#define H265_MAX_NUM_KNEE_POINT 999 + +typedef struct { + Uint32 offset; + Uint32 size; +} user_data_entry_t; + +typedef struct { + Int16 left; + Int16 right; + Int16 top; + Int16 bottom; +} win_t; + +typedef struct { + Uint8 nal_hrd_param_present_flag; + Uint8 vcl_hrd_param_present_flag; + Uint8 sub_pic_hrd_params_present_flag; + Uint8 tick_divisor_minus2; + Int8 du_cpb_removal_delay_inc_length_minus1; + Int8 sub_pic_cpb_params_in_pic_timing_sei_flag; + Int8 dpb_output_delay_du_length_minus1; + Int8 bit_rate_scale; + Int8 cpb_size_scale; + Int8 initial_cpb_removal_delay_length_minus1; + Int8 cpb_removal_delay_length_minus1; + Int8 dpb_output_delay_length_minus1; + + Uint8 fixed_pic_rate_gen_flag[H265_MAX_NUM_SUB_LAYER]; + Uint8 fixed_pic_rate_within_cvs_flag[H265_MAX_NUM_SUB_LAYER]; + Uint8 low_delay_hrd_flag[H265_MAX_NUM_SUB_LAYER]; + Int8 cpb_cnt_minus1[H265_MAX_NUM_SUB_LAYER]; + Int16 elemental_duration_in_tc_minus1[H265_MAX_NUM_SUB_LAYER]; + + Uint32 nal_bit_rate_value_minus1[H265_MAX_NUM_SUB_LAYER] + [H265_MAX_CPB_CNT]; + Uint32 nal_cpb_size_value_minus1[H265_MAX_NUM_SUB_LAYER] + [H265_MAX_CPB_CNT]; + Uint32 nal_cpb_size_du_value_minus1[H265_MAX_NUM_SUB_LAYER]; + Uint32 nal_bit_rate_du_value_minus1[H265_MAX_NUM_SUB_LAYER]; + Uint8 nal_cbr_flag[H265_MAX_NUM_SUB_LAYER][H265_MAX_CPB_CNT]; + + Uint32 vcl_bit_rate_value_minus1[H265_MAX_NUM_SUB_LAYER] + [H265_MAX_CPB_CNT]; + Uint32 vcl_cpb_size_value_minus1[H265_MAX_NUM_SUB_LAYER] + [H265_MAX_CPB_CNT]; + Uint32 vcl_cpb_size_du_value_minus1[H265_MAX_NUM_SUB_LAYER]; + Uint32 vcl_bit_rate_du_value_minus1[H265_MAX_NUM_SUB_LAYER]; + Uint8 vcl_cbr_flag[H265_MAX_NUM_SUB_LAYER][H265_MAX_CPB_CNT]; +} h265_hrd_param_t; + +typedef struct { + Uint8 aspect_ratio_info_present_flag; + Uint8 aspect_ratio_idc; + Uint8 overscan_info_present_flag; + Uint8 overscan_appropriate_flag; + + Uint8 video_signal_type_present_flag; + Int8 video_format; + + Uint8 video_full_range_flag; + Uint8 colour_description_present_flag; + + Uint16 sar_width; + Uint16 sar_height; + + Uint8 colour_primaries; + Uint8 transfer_characteristics; + Uint8 matrix_coefficients; + + Uint8 chroma_loc_info_present_flag; + Int8 chroma_sample_loc_type_top_field; + Int8 chroma_sample_loc_type_bottom_field; + + Uint8 neutral_chroma_indication_flag; + + Uint8 field_seq_flag; + + Uint8 frame_field_info_present_flag; + Uint8 default_display_window_flag; + Uint8 vui_timing_info_present_flag; + Uint8 vui_poc_proportional_to_timing_flag; + + Uint32 vui_num_units_in_tick; + Uint32 vui_time_scale; + + Uint8 vui_hrd_parameters_present_flag; + Uint8 bitstream_restriction_flag; + + Uint8 tiles_fixed_structure_flag; + Uint8 motion_vectors_over_pic_boundaries_flag; + Uint8 restricted_ref_pic_lists_flag; + Int8 min_spatial_segmentation_idc; + Int8 max_bytes_per_pic_denom; + Int8 max_bits_per_mincu_denom; + + Int16 vui_num_ticks_poc_diff_one_minus1; + Int8 log2_max_mv_length_horizontal; + Int8 log2_max_mv_length_vertical; + + win_t def_disp_win; + h265_hrd_param_t hrd_param; +} h265_vui_param_t; + +typedef struct { + Uint32 display_primaries_x[3]; + Uint32 display_primaries_y[3]; + Uint32 white_point_x : 16; + Uint32 white_point_y : 16; + Uint32 max_display_mastering_luminance : 32; + Uint32 min_display_mastering_luminance : 32; +} h265_mastering_display_colour_volume_t; + +typedef struct { + Uint32 ver_chroma_filter_idc : 8; + Uint32 hor_chroma_filter_idc : 8; + Uint32 ver_filtering_field_processing_flag : 1; + Uint32 target_format_idc : 2; + Uint32 num_vertical_filters : 3; + Uint32 num_horizontal_filters : 3; + Uint8 ver_tap_length_minus1[H265_MAX_NUM_VERTICAL_FILTERS]; + Uint8 hor_tap_length_minus1[H265_MAX_NUM_HORIZONTAL_FILTERS]; + Int32 ver_filter_coeff[H265_MAX_NUM_VERTICAL_FILTERS] + [H265_MAX_TAP_LENGTH]; + Int32 hor_filter_coeff[H265_MAX_NUM_HORIZONTAL_FILTERS] + [H265_MAX_TAP_LENGTH]; +} h265_chroma_resampling_filter_hint_t; + +typedef struct { + Uint32 knee_function_id; + Uint8 knee_function_cancel_flag; + + Uint8 knee_function_persistence_flag; + Uint32 input_disp_luminance; + Uint32 input_d_range; + Uint32 output_d_range; + Uint32 output_disp_luminance; + Uint16 num_knee_points_minus1; + Uint16 input_knee_point[H265_MAX_NUM_KNEE_POINT]; + Uint16 output_knee_point[H265_MAX_NUM_KNEE_POINT]; +} h265_knee_function_info_t; + +typedef struct { + Int8 status; // 0 : empty, 1 : occupied + Int8 pic_struct; + Int8 source_scan_type; + Int8 duplicate_flag; +} h265_sei_pic_timing_t; + +#ifdef __cplusplus +extern "C" { +#endif + +RetCode InitCodecInstancePool(Uint32 coreIdx); +RetCode GetCodecInstance(Uint32 coreIdx, CodecInst **ppInst); +void FreeCodecInstance(CodecInst *pCodecInst); + +RetCode CheckDecOpenParam(DecOpenParam *pop); +int DecBitstreamBufEmpty(DecInfo *pDecInfo); +#ifdef DRAM_TEST +RetCode ExecDRAMReadWriteTest(Uint32 coreIdx, Uint32 *dram_source_addr, + Uint32 *dram_destination_addr, + Uint32 *dram_data_size); +#endif +#ifdef REDUNDENT_CODE +RetCode SetParaSet(DecHandle handle, int paraSetType, DecParamSet *para); +void DecSetHostParaAddr(Uint32 coreIdx, PhysicalAddress baseAddr, + PhysicalAddress paraAddr); +#endif + +Int32 ConfigSecAXICoda9(Uint32 coreIdx, Int32 codecMode, SecAxiInfo *sa, + Uint32 width, Uint32 profile, Uint32 interlace); + +Int32 ConfigSecAXIWave(Uint32 coreIdx, Int32 codecMode, SecAxiInfo *sa, + Uint32 width, Uint32 height, Uint32 profile, + Uint32 level); + +#ifdef REDUNDENT_CODE +Int32 ConfigSecAXICoda7(Uint32 coreIdx, CodStd codStd, SecAxiInfo *sa, + Uint32 width, Uint32 height, Uint32 profile); +#endif + +RetCode AllocateLinearFrameBuffer(TiledMapType mapType, FrameBuffer *fbArr, + Uint32 numOfFrameBuffers, Uint32 sizeLuma, + Uint32 sizeChroma); + +#ifdef REDUNDENT_CODE +RetCode AllocateTiledFrameBufferGdiV1(TiledMapType mapType, + PhysicalAddress tiledBaseAddr, + FrameBuffer *fbArr, + Uint32 numOfFrameBuffers, Uint32 sizeLuma, + Uint32 sizeChroma, DRAMConfig *pDramCfg); +#endif + +RetCode AllocateTiledFrameBufferGdiV2(TiledMapType mapType, FrameBuffer *fbArr, + Uint32 numOfFrameBuffers, Uint32 sizeLuma, + Uint32 sizeChroma); + +RetCode CheckEncInstanceValidity(EncHandle handle); +RetCode CheckEncOpenParam(EncOpenParam *pop); +RetCode CheckEncParam(EncHandle handle, EncParam *param); +RetCode GetEncHeader(EncHandle handle, EncHeaderParam *encHeaderParam); +RetCode SetEncBitStreamInfo(CodecInst *pCodecInst, + EncHeaderParam *encHeaderParam, EncParam *param); + +#ifdef REDUNDENT_CODE +RetCode EncParaSet(EncHandle handle, int paraSetType); +RetCode SetGopNumber(EncHandle handle, Uint32 *gopNumber); +RetCode SetIntraQp(EncHandle handle, Uint32 *intraQp); +#endif +RetCode SetBitrate(EncHandle handle, Uint32 *bitrate); +#ifdef REDUNDENT_CODE +RetCode SetFramerate(EncHandle handle, Uint32 *frameRate); +RetCode SetIntraRefreshNum(EncHandle handle, Uint32 *pIntraRefreshNum); +RetCode SetSliceMode(EncHandle handle, EncSliceMode *pSliceMode); +RetCode SetHecMode(EncHandle handle, int mode); +void EncSetHostParaAddr(Uint32 coreIdx, PhysicalAddress baseAddr, + PhysicalAddress paraAddr); +RetCode VcodecTryLock(Uint32 core_idx); +#endif +RetCode SetMinMaxQp(EncHandle handle, MinMaxQpChangeParam *param); + +RetCode SetClockGate(Uint32 coreIdx, Uint32 on); + +void EnterVcodecLock(Uint32 coreIdx); +void LeaveVcodecLock(Uint32 coreIdx); +RetCode VcodecTimeLock(Uint32 core_idx, int timeout_ms); + +void CoreSleepWake(Uint32 coreIdx, int iSleepWake); + +RetCode EnterDispFlagLock(Uint32 coreIdx); +RetCode LeaveDispFlagLock(Uint32 coreIdx); + +/* Add func name and line number for debugging */ +void SetPendingInst(Uint32 coreIdx, CodecInst *inst, const char *n, int line); +void ClearPendingInst(Uint32 coreIdx); +CodecInst *GetPendingInst(Uint32 coreIdx); +#ifdef REDUNDENT_CODE +int GetPendingInstIdx(Uint32 coreIdx); +#endif + +Int32 MaverickCache2Config(MaverickCacheConfig *pCache, BOOL decoder, + BOOL interleave, Uint32 bypass, Uint32 burst, + Uint32 merge, TiledMapType mapType, Uint32 wayshape); + +int SetTiledMapType(Uint32 coreIdx, TiledMapConfig *pMapCfg, int mapType, + int stride, int interleave, DRAMConfig *dramCfg); +int GetXY2AXIAddr(TiledMapConfig *pMapCfg, int ycbcr, int posY, int posX, + int stride, FrameBuffer *fb); +#ifdef REDUNDENT_CODE +int GetLowDelayOutput(CodecInst *pCodecInst, DecOutputInfo *lowDelayOutput); +// for GDI 1.0 +void SetTiledFrameBase(Uint32 coreIdx, PhysicalAddress baseAddr); +PhysicalAddress GetTiledFrameBase(Uint32 coreIdx, FrameBuffer *frame, int num); +#endif + +/** + * \brief It returns the stride of framebuffer in byte. + * + * \param width picture width in pixel. + * \param format YUV format. see FrameBufferFormat structure in + * vpuapi.h \param cbcrInterleave \param mapType map type. see + * TiledMapType in vpuapi.h + */ +Int32 CalcStride(Uint32 width, Uint32 height, FrameBufferFormat format, + BOOL cbcrInterleave, TiledMapType mapType, BOOL isVP9, + BOOL isDec); + +Int32 CalcLumaSize(Int32 productId, Int32 stride, Int32 height, BOOL cbcrIntl, + TiledMapType mapType, DRAMConfig *pDramCfg); + +Int32 CalcChromaSize(Int32 productId, Int32 stride, Int32 height, + FrameBufferFormat format, BOOL cbcrIntl, + TiledMapType mapType, DRAMConfig *pDramCfg); + +int LevelCalculation(int MbNumX, int MbNumY, int frameRateInfo, + int interlaceFlag, int BitRate, int SliceNum); + +/* timescale: 1/90000 */ +Uint64 GetTimestamp(EncHandle handle); + +RetCode CalcEncCropInfo(EncHevcParam *param, int rotMode, int srcWidth, + int srcHeight); + +#ifdef __cplusplus +} +#endif + +#endif // endif VPUAPI_UTIL_H_INCLUDED diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuconfig.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuconfig.h new file mode 100644 index 0000000000..b8e289f12b --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuconfig.h @@ -0,0 +1,148 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// This file should be modified by some customers according to their +//SOC configuration. +//--=========================================================================-- + +#ifndef _VPU_CONFIG_H_ +#define _VPU_CONFIG_H_ +#include "../config.h" + +#define BODA7503_CODE 0x7503 +#define CODA7542_CODE 0x7542 +#define BODA950_CODE 0x9500 +#define CODA960_CODE 0x9600 +#define CODA980_CODE 0x9800 +#define WAVE320_CODE 0x3200 +#define WAVE410_CODE 0x4100 /* Wave410 version 1: Single vcore */ +#define WAVE4102_CODE 0x4102 /* Wave410 version 2: Multi vcore */ +#define WAVE420_CODE 0x4200 /* Wave420 */ +#define WAVE420L_CODE 0x4201 /* Wave420L */ +#define WAVE412_CODE 0x4120 +#define WAVE510_CODE 0x5100 +#define WAVE512_CODE 0x5120 +#define WAVE515_CODE 0x5150 +#define WAVE520_CODE 0x5200 +#define CODA7Q_CODE 0x7101 + +#define PRODUCT_CODE_W_SERIES(x) \ + (x == WAVE410_CODE || x == WAVE4102_CODE || x == WAVE420_CODE || \ + x == WAVE412_CODE || x == CODA7Q_CODE || x == WAVE420L_CODE || \ + x == WAVE510_CODE || x == WAVE512_CODE || x == WAVE515_CODE || \ + x == WAVE520_CODE) +#define PRODUCT_CODE_NOT_W_SERIES(x) \ + (x == BODA7503_CODE || x == CODA7542_CODE || x == BODA950_CODE || \ + x == CODA960_CODE || x == CODA980_CODE || x == WAVE320_CODE) + +#define MAX_INST_HANDLE_SIZE 768 +#define MAX_NUM_INSTANCE 16 +#define MAX_NUM_DEC_INSTANCE 4 +#define MAX_NUM_VPU_CORE 2 +#define MAX_NUM_VCORE 1 + +#define MAX_ENC_AVC_PIC_WIDTH 4096 +#define MAX_ENC_AVC_PIC_HEIGHT 2304 +#define MAX_ENC_PIC_WIDTH 4096 +#define MAX_ENC_PIC_HEIGHT 2304 +#define MIN_ENC_PIC_WIDTH 96 +#define MIN_ENC_PIC_HEIGHT 16 + +// for WAVE420 +#define W4_MIN_ENC_PIC_WIDTH 256 +#define W4_MIN_ENC_PIC_HEIGHT 128 +#define W4_MAX_ENC_PIC_WIDTH 8192 +#define W4_MAX_ENC_PIC_HEIGHT 8192 + +#define MAX_DEC_PIC_WIDTH 4096 +#define MAX_DEC_PIC_HEIGHT 2304 + +// Application specific configuration +#ifdef HAPS_SIM +#define VPU_ENC_TIMEOUT (30000 * 10000) +#else +#define VPU_ENC_TIMEOUT 30000 +#endif + +#define VPU_DEC_TIMEOUT 10000 + +#ifdef HAPS_SIM +#define VPU_BUSY_CHECK_TIMEOUT (5000 * 10000) +#else +#define VPU_BUSY_CHECK_TIMEOUT 5000 +#endif + +// codec specific configuration +#define VPU_REORDER_ENABLE 1 + // it can be set to 1 to handle reordering DPB in host side. +#define VPU_REORDER_DISABLE 0 + // it can be set to 0 to disable reordering DPB in host side. + +#define CBCR_INTERLEAVE 1 + //[default 1 for BW checking with CnMViedo Conformance] 0 (chroma + //separate mode), 1 (chroma interleave mode) // if the type of + //tiledmap uses the kind of MB_RASTER_MAP. must set to enable + //CBCR_INTERLEAVE + +#define VPU_ENABLE_BWB 1 + +#define HOST_ENDIAN VDI_128BIT_LITTLE_ENDIAN +#define VPU_FRAME_ENDIAN HOST_ENDIAN +#define VPU_STREAM_ENDIAN HOST_ENDIAN +#define VPU_USER_DATA_ENDIAN HOST_ENDIAN +#define VPU_SOURCE_ENDIAN HOST_ENDIAN +#define DRAM_BUS_WIDTH 16 + +/************************************************************************/ +/* VPU COMMON MEMORY */ +/************************************************************************/ +#define COMMAND_QUEUE_DEPTH 4 +#define ONE_TASKBUF_SIZE_FOR_W5DEC_CQ (8 * 1024 * 1024) +/* upto 8Kx4K, need 8Mbyte per task*/ +#define ONE_TASKBUF_SIZE_FOR_W5ENC_CQ (16 * 1024 * 1024) +/* upto 8Kx8K, need 16Mbyte per task. (worst case VLC data =: 13M for 8kx8k) */ + +#define ONE_TASKBUF_SIZE_FOR_CQ 0x0 +#define SIZE_COMMON (1 * 768 * 1024) + +#define SIZE_COMMON_265 \ + (SIZE_COMMON) // WAVE4_MAX_CODE_BUF_SIZE + DEFAULT_TEMPBUF_SIZE +#define SIZE_COMMON_264 \ + (SIZE_COMMON) // CODE_BUF_SIZE + TEMP_BUF_SIZE + PARA_BUF_SIZE +//=====4. VPU REPORT MEMORY ======================// +#define SIZE_REPORT_BUF (0x10000) + +#define STREAM_END_SIZE 0 +#define STREAM_END_SET_FLAG 0 +#define STREAM_END_CLEAR_FLAG -1 +#define EXPLICIT_END_SET_FLAG -2 + +#define USE_BIT_INTERNAL_BUF 1 +#define USE_IP_INTERNAL_BUF 1 +#define USE_DBKY_INTERNAL_BUF 1 +#define USE_DBKC_INTERNAL_BUF 1 +#define USE_OVL_INTERNAL_BUF 1 +#define USE_BTP_INTERNAL_BUF 1 +#define USE_ME_INTERNAL_BUF 1 + +/* WAVE410 only */ +#define USE_BPU_INTERNAL_BUF 1 +#define USE_VCE_IP_INTERNAL_BUF 1 +#define USE_VCE_LF_ROW_INTERNAL_BUF 1 + +/* WAVE420 only */ +#define USE_IMD_INTERNAL_BUF 1 +#define USE_RDO_INTERNAL_BUF 1 +#define USE_LF_INTERNAL_BUF 1 + +#endif /* _VPU_CONFIG_H_ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuerror.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuerror.h new file mode 100644 index 0000000000..057b476442 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vpuerror.h @@ -0,0 +1,235 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +/************************************************************************/ +/* Error code definitions depending on product */ +/************************************************************************/ + +#ifndef ERROR_CODE_H_INCLUDED +#define ERROR_CODE_H_INCLUDED + +/* + * CODA9(CODA960, CODA980, WAVE320) + */ + +/* + * WAVE410 + */ + +/************************************************************************/ +/* WAVE4 SYSTEM ERROR */ +/************************************************************************/ +#define WAVE4_CODEC_ERROR 0x00000001 +#define WAVE4_SYSERR_CP0_DATA_ACCESS_VIOLATION 0x00000002 +#define WAVE4_SYSERR_CP0_INST_ADDR_ALIGN 0x00000003 +#define WAVE4_SYSERR_CP0_DATA_ADDR_ALIGN 0x00000004 +#define WAVE4_SYSERR_CP0_PRIVILEDGE_VIOLATION 0x00000005 +#define WAVE4_SYSERR_CP0_WRITE_PROT 0x00000006 +#define WAVE4_SYSERR_STREAM_BUF_FULL 0x00000100 +#define WAVE4_SYSERR_BUS_ERROR 0x00000200 +#define WAVE4_SYSERR_DOUBLE_FAULT 0x00000400 +#define WAVE4_SYSERR_ACCESS_VIOLATION_HW 0x00001000 +#define WAVE4_SYSERR_WRITEPROTECTION 0x00004000 +#define WAVE4_SYSERR_WATCHDOG_TIMEOUT 0x00008000 + +/************************************************************************/ +/* WAVE4 CODEC ERROR ON DEC_PIC_HDR */ +/************************************************************************/ +#define WAVE4_SPSERR_MAX_SUB_LAYERS_MINUS1 \ + 0x00000001 // WARNING sps_max_sub_layer_minus1 shall be 0 to 6 +#define WAVE4_SPSERR_GENERAL_RESERVED_ZERO_44BITS \ + 0x00000002 // WARNING general_reserved_zero_44bits shall be 0 +#define WAVE4_SPSERR_RESERVED_ZERO_2BITS \ + 0x00000004 // WARNING reserved_zero_2bits shall be 0 +#define WAVE4_SPSERR_SUB_LAYER_RESERVED_ZERO_44BITS \ + 0x00000008 // WARNING sub_layer_reserved_zero_44bits shall be 0 +#define WAVE4_SPSERR_GENERAL_LEVEL_IDC \ + 0x00000010 // WARNING general_level_idc shall have one of level of Table A.1 +#define WAVE4_SPSERR_SPS_MAX_DEC_PIC_BUFFERING_VALUE_OVER \ + 0x00000020 // WARNING sps_max_dec_pic_buffering[i] <= MaxDpbSize +#define WAVE4_SPSERR_RBSP_TRAILING_BITS \ + 0x00000040 // WARNING trailing bits shall be 1000... pattern, 7.3.2.1 + +#define WAVE4_SPSERR_BASE 0x00000100 +#define WAVE4_SPSERR_SEQ_PARAMETER_SET_ID \ + 0x00000100 // ERROR seq_parameter_set_id golomb decode error +#define WAVE4_SPSERR_CHROMA_FORMAT_IDC \ + 0x00000200 // ERROR chroma_format_idc golomb decode error +#define WAVE4_SPSERR_PIC_WIDTH_IN_LUMA_SAMPLES \ + 0x00000300 // ERROR pic_width_in_luma_samples golomb decode error +#define WAVE4_SPSERR_PIC_HEIGHT_IN_LUMA_SAMPLES \ + 0x00000400 // ERROR pic_height_in_luma_samples golomb decode error +#define WAVE4_SPSERR_CONF_WIN_LEFT_OFFSET \ + 0x00000500 // ERROR conf_win_left_offset golomb decode error +#define WAVE4_SPSERR_CONF_WIN_RIGHT_OFFSET \ + 0x00000600 // ERROR conf_win_right_offset golomb decode error +#define WAVE4_SPSERR_CONF_WIN_TOP_OFFSET \ + 0x00000700 // ERROR conf_win_top_offset golomb decode error +#define WAVE4_SPSERR_CONF_WIN_BOTTOM_OFFSET \ + 0x00000800 // ERROR conf_win_top_offset golomb decode error +#define WAVE4_SPSERR_BIT_DEPTH_LUMA_MINUS8 \ + 0x00000900 // ERROR bit_depth_luma_minus8 golomb decode error +#define WAVE4_SPSERR_BIT_DEPTH_CHROMA_MINUS8 \ + 0x00000A00 // ERROR bit_depth_chroma_minus8 golomb decode error +#define WAVE4_SPSERR_LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4 \ + 0x00000B00 // ERROR log2_max_pic_order_cnt_lsb_minus4 golomb decode error +#define WAVE4_SPSERR_SPS_MAX_DEC_PIC_BUFFERING \ + 0x00000C00 // ERROR sps_max_dec_pic_buffering[i] golomb decode error +#define WAVE4_SPSERR_SPS_MAX_NUM_REORDER_PICS \ + 0x00000D00 // ERROR sps_max_num_reorder_pics[i] golomb decode error +#define WAVE4_SPSERR_SPS_MAX_LATENCY_INCREASE \ + 0x00000E00 // ERROR sps_sps_max_latency_increase[i] golomb decode error +#define WAVE4_SPSERR_LOG2_MIN_LUMA_CODING_BLOCK_SIZE_MINUS3 \ + 0x00000F00 // ERROR log2_min_luma_coding_block_size_minus3 golomb decode error +#define WAVE4_SPSERR_LOG2_DIFF_MAX_MIN_LUMA_CODING_BLOCK_SIZE \ + 0x00001000 // ERROR log2_diff_max_min_luma_coding_block_size golomb decode error +#define WAVE4_SPSERR_LOG2_MIN_TRANSFORM_BLOCK_SIZE_MINUS2 \ + 0x00001100 // ERROR log2_min_transform_block_size_minus2 golomb decode error +#define WAVE4_SPSERR_LOG2_DIFF_MAX_MIN_TRANSFORM_BLOCK_SIZE \ + 0x00001200 // ERROR log2_diff_max_min_transform_block_size golomb decode error +#define WAVE4_SPSERR_MAX_TRANSFORM_HIERARCHY_DEPTH_INTER \ + 0x00001300 // ERROR max_transform_hierarchy_depth_inter golomb decode error +#define WAVE4_SPSERR_MAX_TRANSFORM_HIERARCHY_DEPTH_INTRA \ + 0x00001400 // ERROR max_transform_hierarchy_depth_intra golomb decode error +#define WAVE4_SPSERR_SCALING_LIST \ + 0x00001500 // ERROR scaling list parsing error in scaling_list_data() +#define WAVE4_SPSERR_LOG2_DIFF_MIN_PCM_LUMA_CODING_BLOCK_SIZE_MINUS3 \ + 0x00001600 + // ERROR log2_diff_min_pcm_luma_coding_block_size_minus3 golomb decode error +#define WAVE4_SPSERR_LOG2_DIFF_MAX_MIN_PCM_LUMA_CODING_BLOCK_SIZE \ + 0x00001700 + // ERROR log2_diff_max_min_pcm_luma_coding_block_size golomb decode error +#define WAVE4_SPSERR_NUM_SHORT_TERM_REF_PIC_SETS \ + 0x00001800 // ERROR num_short_term_ref_pic_sets golomb decode error +#define WAVE4_SPSERR_NUM_LONG_TERM_REF_PICS_SPS \ + 0x00001900 // ERROR num_long_term_ref_pics_sps golomb decode error + +// WAVE4 CODEC ERROR SPEC OVER SECTION : shared with DEC_PIC command +#define WAVE4_SPEC_OVER_PICTURE_WIDTH_SIZE \ + 0x00010000 // Spec over ERROR decoded picture width size over +#define WAVE4_SPEC_OVER_PICTURE_HEIGHT_SIZE \ + 0x00020000 // Spec over ERROR decoded picture height size over +#define WAVE4_SPEC_OVER_CHROMA_FORMAT \ + 0x00040000 // Spec over ERROR chroma format is not 4:2:0 +#define WAVE4_SPEC_OVER_BIT_DEPTH 0x00080000 // luma or chroma bit depth over +// In WAVE410 v1.0 luma and chroma bit depth should be 8 bits +// In WAVE410 v2.0 luma and chroma bit depth should be up to 10 bits +// repectively. +#define WAVE4_SPEC_OVER_PROFILE 0x00100000 // Spec over WARNING +// general_profile_idc and general_profile_compatibility_flag over +// In WAVE410 v1.0. general_profile_idc and general_profile_compatibility_flag +// should specify Main profile In WAVE410 v2.0. general_profile_idc and +// general_profile_compatibility_flag should specify Main or Main10 profile. +#define WAVE4_SPEC_OVER_LEVEL \ + 0x00200000 // Spec over WARNING general_level_idc over. + +/************************************************************************/ +/* WAVE4 CODEC ERROR NO SEQUENCE INFORMATION SECTION */ +/************************************************************************/ +#define WAVE4_SPSERR_NOT_FOUND 0x01000000 +#define WAVE4_SPS_PARSING_ERROR 0x02000000 + +/************************************************************************/ +/* WAVE4 CODEC ERROR ON DEC_PIC */ +/************************************************************************/ +/* Syntax error */ +#define WAVE4_SHERR_FIRST_SLICE_SEGMENT_IN_PIC_FLAG \ + 0x00000001 // WARNING first_slice_in_pic_flag shall be 1 at first slice +#define WAVE4_SHERR_NO_OUTPUT_OF_PRIOR_PICS_FLAG \ + 0x00000002 // WARNING no_output_of_prior_pics_flag shall be equal to the first slice +#define WAVE4_SHERR_PIC_OUTPUT_FLAG \ + 0x00000004 // WARNING pic_output_flag shall be equal to the first slice +#define WAVE4_SHERR_SLICE_PIC_PARAMETER_SET_ID \ + 0x00000100 // ERROR slice_pic_parameter_set_id decode error +#define WAVE4_SHERR_ACTIVATE_PPS 0x00000200 // ERROR activate_pps decode error +#define WAVE4_SHERR_SLICE_TYPE 0x00000300 // ERROR slice_type decode error +#define WAVE4_SHERR_FIRST_SLICE_IS_DEPENDENT_SLICE \ + 0x00000400 // ERROR first_slice must be independent slice +#define WAVE4_SHERR_SHORT_TERM_REF_PIC_SET_SPS_FLAG \ + 0x00000500 // ERROR short_term_ref_pic_set_sps_flag shall be equal to the first slice +#define WAVE4_SHERR_SHORT_TERM_REF_PIC_SET \ + 0x00000600 // ERROR short_term_ref_pic_set decode error +#define WAVE4_SHERR_SHORT_TERM_REF_PIC_SET_IDX \ + 0x00000700 // ERROR short_term_ref_pic_set_idx shall be equal to the first slice +#define WAVE4_SHERR_NUM_LONG_TERM_SPS \ + 0x00000800 // ERROR num_long_term_sps decode error +#define WAVE4_SHERR_NUM_LONG_TERM_PICS \ + 0x00000900 // ERROR num_long_term_pics decode error +#define WAVE4_SHERR_LT_IDX_SPS_IS_OUT_OF_RANGE \ + 0x00000A00 // ERROR lt_idx_sps is out of range +#define WAVE4_SHERR_DELTA_POC_MSB_CYCLE_LT \ + 0x00000B00 // ERROR delta_poc_msb_cycle_lt decode error +#define WAVE4_SHERR_NUM_REF_IDX_L0_ACTIVE_MINUS1 \ + 0x00000C00 // ERROR num_ref_idx_l0_active_minus1 decode error +#define WAVE4_SHERR_NUM_REF_IDX_L1_ACTIVE_MINUS1 \ + 0x00000D00 // ERROR num_ref_idx_l1_active_minus1 decode error +#define WAVE4_SHERR_COLLOCATED_REF_IDX \ + 0x00000E00 // ERROR collocated_ref_idx decode error +#define WAVE4_SHERR_PRED_WEIGHT_TABLE \ + 0x00000F00 // ERROR pred_weight_table decode error +#define WAVE4_SHERR_FIVE_MINUS_MAX_NUM_MERGE_CAND \ + 0x00001000 // ERROR five_minus_max_num_merge_cand decode error +#define WAVE4_SHERR_SLICE_QP_DELTA \ + 0x00001100 // ERROR slice_qp_delta decode error +#define WAVE4_SHERR_SLICE_QP_DELTA_IS_OUT_OF_RANGE \ + 0x00001200 // ERROR slice_qp_delta is out of range +#define WAVE4_SHERR_SLICE_CB_QP_OFFSET \ + 0x00001300 // ERROR slice_cb_qp_offset decode error +#define WAVE4_SHERR_SLICE_CR_QP_OFFSET \ + 0x00001400 // ERROR slice_cr_qp_offset decode error +#define WAVE4_SHERR_SLICE_BETA_OFFSET_DIV2 \ + 0x00001500 // ERROR slice_beta_offset_div2 decode error +#define WAVE4_SHERR_SLICE_TC_OFFSET_DIV2 \ + 0x00001600 // ERROR slice_tc_offset_div2 decode error +#define WAVE4_SHERR_NUM_ENTRY_POINT_OFFSETS \ + 0x00001700 // ERROR num_entry_point_offsets decode error +#define WAVE4_SHERR_OFFSET_LEN_MINUS1 \ + 0x00001800 // ERROR offset_len_minus1 decode error +#define WAVE4_SHERR_SLICE_SEGMENT_HEADER_EXTENSION_LENGTH \ + 0x00001900 // ERROR slice_segment_header_extension_length decode error +#define WAVE4_SHERR_SLICE_HEADER_OVER_CONSUMED \ + 0x00001A00 // ERROR slice header over-consumed +#define WAVE4_SHERR_DPB_OVERFLOW 0x00001B00 // ERROR DPB overflow + +// ETC +#define WAVE4_ETCERR_NEXT_AU_SLICE 0x01000000 // WARNING slice of next au found +#define WAVE4_ETCERR_SLICE_NOT_FOUND 0x02000000 // WARNING slice not found +#define WAVE4_ETCERR_SEQ_CHANGE_DETECT \ + 0x04000000 // ERROR sequence change detected +#define WAVE4_ETCERR_PPS_NOT_FOUND 0x08000000 // ERROR PPS not found +#define WAVE4_ETCERR_SPS_NOT_FOUND 0x10000000 // ERROR SPS not found +#define WAVE4_ETCERR_MISSING_REFERENCE_PICTURE \ + 0x20000000 // WARNING Reference picture was missing +#define WAVE4_ETCERR_LACK_OF_STREAM \ + 0x40000000 // ERROR notice lack_of_stream for support roll-back mode +#define WAVE4_ETCERR_SH_PARSING_ERROR \ + 0x80000000 // ERROR syntax parsing error detected + +/* + * WAVE5 + */ + +/************************************************************************/ +/* WAVE5 SYSTEM ERROR */ +/************************************************************************/ +#define WAVE5_CODEC_ERROR 0x00000001 +#define WAVE5_SYSERR_ACCESS_VIOLATION_HW 0x00000040 +#define WAVE5_RESULT_NOT_READY 0x00000800 +#define WAVE5_VPU_STILL_RUNNING 0x00001000 +#define WAVE5_INSTANCE_DESTROYED 0x00004000 +#define WAVE5_SYSERR_WATCHDOG_TIMEOUT 0x00008000 + +#endif /* ERROR_CODE_H_INCLUDED */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vputypes.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vputypes.h new file mode 100644 index 0000000000..494fb9a90e --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/vputypes.h @@ -0,0 +1,117 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#ifndef _VPU_TYPES_H_ +#define _VPU_TYPES_H_ + +#include + +/** + * @brief This type is an 8-bit unsigned integral type, which is used for + * declaring pixel data. + */ +typedef uint8_t Uint8; + +/** + * @brief This type is a 32-bit unsigned integral type, which is used for + * declaring variables with wide ranges and no signs such as size of buffer. + */ +typedef uint32_t Uint32; + +/** + * @brief This type is a 16-bit unsigned integral type. + */ +typedef uint16_t Uint16; + +/** + * @brief This type is an 8-bit signed integral type. + */ +typedef int8_t Int8; + +/** + * @brief This type is a 32-bit signed integral type. + */ +typedef int32_t Int32; + +/** + * @brief This type is a 16-bit signed integral type. + */ +typedef int16_t Int16; +#if defined(_MSC_VER) +typedef unsigned __int64 Uint64; +typedef __int64 Int64; +#elif defined(__arm__) || defined(__aarch64__) || defined(__riscv) +#include +typedef __u64 Uint64; +typedef __s32 Int64; +#else +typedef uint64_t Uint64; +typedef int64_t Int64; +#endif +#ifndef PhysicalAddress +/** +* @brief This is a type for representing physical addresses which are +recognizable by VPU. In general, VPU hardware does not know about virtual +address space which is set and handled by host processor. All these virtual +addresses are translated into physical addresses by Memory Management Unit. All +data buffer addresses such as stream buffer and frame buffer should be given to +VPU as an address on physical address space. +*/ +#if defined(__aarch64__) || defined(__arm__) || defined(__riscv) +typedef Uint64 PhysicalAddress; +#else +#if defined(__amd64__) || defined(__x86_64__) +typedef Uint64 PhysicalAddress; +#else +typedef Uint32 PhysicalAddress; +#endif +#endif +#endif +#ifndef BYTE +/** + * @brief This type is an 8-bit unsigned integral type. + */ +typedef unsigned char BYTE; +#endif +#ifndef BOOL +typedef int BOOL; +#endif +#ifndef TRUE +#define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +#define FALSE 0 +#endif /* FALSE */ +#ifndef NULL +#define NULL 0 +#endif + +#ifndef UNREFERENCED_PARAMETER +#define UNREFERENCED_PARAMETER(P) \ + /*lint -save -e527 -e530 */ \ + { \ + (P) = (P); \ + } \ + /*lint -restore */ +#endif + +#ifdef __GNUC__ +#define UNREFERENCED_FUNCTION __attribute__((unused)) +#else +#define UNREFERENCED_FUNCTION +#endif + +#endif /* _VPU_TYPES_H_ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common.c new file mode 100644 index 0000000000..c91bb4a83c --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common.c @@ -0,0 +1,1771 @@ +#include "product.h" +#include "wave/common/common.h" +#include "wave/common/common_vpuconfig.h" +#include "vpuerror.h" +#include "wave/common/common_regdefine.h" + +#define COMMAND_TIMEOUT 0xffff + +#ifdef CVI_VC_MSG_ENABLE +#ifndef VC_DEBUG_BASIC_LEVEL +static char *cmd2Txt(Uint32 cmd); +#endif +#endif + +void Wave4BitIssueCommand(CodecInst *instance, Uint32 cmd) +{ + Uint32 instanceIndex = 0; + Uint32 codecMode = 0; + Uint32 coreIdx; + + if (instance != NULL) { + instanceIndex = instance->instIndex; + codecMode = instance->codecMode; + } + + coreIdx = instance->coreIdx; + + VpuWriteReg(coreIdx, W4_VPU_BUSY_STATUS, 1); + VpuWriteReg(coreIdx, W4_RET_SUCCESS, 0); // for debug + VpuWriteReg(coreIdx, W4_CORE_INDEX, 0); + +#ifdef REDUNDENT_CODE + if (instance->productId == PRODUCT_ID_7Q) // only coda7q use + // codecModeAux for DIV + VpuWriteReg(coreIdx, W4_INST_INDEX, + (instanceIndex & 0xffff) | (codecMode << 16) | + (instance->codecModeAux << 24)); + else +#endif + VpuWriteReg(coreIdx, W4_INST_INDEX, + (instanceIndex & 0xffff) | (codecMode << 16)); + +#ifdef CVI_VC_MSG_ENABLE +#ifndef VC_DEBUG_BASIC_LEVEL + CVI_VC_MCU("cmd = 0x%X, %s\n", cmd, cmd2Txt(cmd)); +#endif +#endif + + VpuWriteReg(coreIdx, W4_COMMAND, cmd); + +#ifdef ENABLE_CNM_DEBUG_MSG + if ((instance != NULL && instance->loggingEnable)) + vdi_log(coreIdx, cmd, 1); +#endif + + if (cmd != INIT_VPU) { + CVI_VC_MCU("W4_VPU_HOST_INT_REQ\n"); + VpuWriteReg(coreIdx, W4_VPU_HOST_INT_REQ, 1); + } +} + +typedef struct _CMD_TXT_ { + Uint32 cmd; + char *txt; +} cmd_txt; + +#ifdef CVI_VC_MSG_ENABLE +#ifndef VC_DEBUG_BASIC_LEVEL +static char *cmd2Txt(Uint32 cmd) +{ + Uint32 idx = 0; + static cmd_txt allCmds[] = { + { 0x0, "UNKNOWN" }, + { 0x0001, "INIT_VPU" }, + { 0x0002, "DEC_PIC_HDR / SET_PARAM" }, + { 0x0004, "FINI_SEQ" }, + { 0x0008, "DEC_PIC / ENC_PIC" }, + { 0x0010, "SET_FRAMEBUF" }, + { 0x0020, "FLUSH_DECODER" }, + { 0x0100, "GET_FW_VERSION" }, + { 0x0200, "QUERY_DECODER" }, + { 0x0400, "SLEEP_VPU" }, + { 0x0800, "WAKEUP_VPU" }, + { 0x4000, "CREATE_INSTANCE" }, + { 0x10000, "RESET_VPU" }, + }; + + for (idx = 0; idx < sizeof(allCmds) / sizeof(cmd_txt); idx++) { + if (allCmds[idx].cmd == cmd) + return allCmds[idx].txt; + } + + return allCmds[0].txt; +} +#endif +#endif + +static RetCode SetupWave4Properties(Uint32 coreIdx) +{ + VpuAttr *pAttr = &g_VpuCoreAttributes[coreIdx]; + Uint32 regVal; + Uint8 *str; + CodecInst hdr; + + /* GET FIRMWARE&HARDWARE INFORMATION */ + hdr.coreIdx = 0; + hdr.instIndex = 0; +#ifdef ENABLE_CNM_DEBUG_MSG + hdr.loggingEnable = 0; +#endif + + CVI_VC_MCU("GET_FW_VERSION, cmd = 0x%X\n", GET_FW_VERSION); + Wave4BitIssueCommand((CodecInst *)&hdr, GET_FW_VERSION); + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + CVI_VC_ERR("GET_FW_VERSION RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) { + CVI_VC_ERR("W4_RET_SUCCESS fail\n"); + return RETCODE_FAILURE; + } + + regVal = VpuReadReg(coreIdx, W4_RET_PRODUCT_NAME); + str = (Uint8 *)®Val; + pAttr->productName[0] = str[3]; + pAttr->productName[1] = str[2]; + pAttr->productName[2] = str[1]; + pAttr->productName[3] = str[0]; + pAttr->productName[4] = 0; + pAttr->productNumber = VpuReadReg(coreIdx, W4_RET_PRODUCT_VERSION); + + switch (pAttr->productNumber) { +#ifdef REDUNDENT_CODE + case WAVE410_CODE: + pAttr->productId = PRODUCT_ID_410; + break; + case WAVE4102_CODE: + pAttr->productId = PRODUCT_ID_4102; + break; + case WAVE420_CODE: + pAttr->productId = PRODUCT_ID_420; + break; + case WAVE412_CODE: + pAttr->productId = PRODUCT_ID_412; + break; + case CODA7Q_CODE: + pAttr->productId = PRODUCT_ID_7Q; + break; +#endif + case WAVE420L_CODE: + pAttr->productId = PRODUCT_ID_420L; + break; +#ifdef REDUNDENT_CODE + case WAVE510_CODE: + pAttr->productId = PRODUCT_ID_510; + break; + case WAVE512_CODE: + pAttr->productId = PRODUCT_ID_412; + break; + case WAVE515_CODE: + pAttr->productId = PRODUCT_ID_515; + break; +#endif + default: + pAttr->productId = PRODUCT_ID_NONE; + break; + } + + pAttr->hwConfigDef0 = VpuReadReg(coreIdx, W4_RET_STD_DEF0); + pAttr->hwConfigDef1 = VpuReadReg(coreIdx, W4_RET_STD_DEF1); + pAttr->hwConfigFeature = VpuReadReg(coreIdx, W4_RET_CONF_FEATURE); + pAttr->hwConfigDate = VpuReadReg(coreIdx, W4_RET_CONFIG_DATE); + pAttr->hwConfigRev = VpuReadReg(coreIdx, W4_RET_CONFIG_REVISION); + pAttr->hwConfigType = VpuReadReg(coreIdx, W4_RET_CONFIG_TYPE); + + pAttr->supportGDIHW = TRUE; + if (pAttr->productId == PRODUCT_ID_420L) { + pAttr->supportDecoders = (1 << STD_HEVC); + pAttr->supportEncoders = (1 << STD_HEVC); + pAttr->supportGDIHW = FALSE; + } +#ifdef REDUNDENT_CODE + else if (pAttr->productId == PRODUCT_ID_420) { + pAttr->supportDecoders = (1 << STD_HEVC); + pAttr->supportEncoders = (1 << STD_HEVC); + } else if (pAttr->productId == PRODUCT_ID_412) { + pAttr->supportDecoders = (1 << STD_HEVC); + pAttr->supportDecoders |= (1 << STD_VP9); + ; + pAttr->supportEncoders = (1 << STD_VP9); + } else if (pAttr->productId == PRODUCT_ID_515) { + pAttr->supportDecoders = (1 << STD_HEVC); + pAttr->supportDecoders |= (1 << STD_VP9); + pAttr->supportDecoders |= (1 << STD_AVS2); + pAttr->supportEncoders = (1 << STD_VP9); + } else if (pAttr->productId == PRODUCT_ID_7Q) { + pAttr->supportDecoders = + (1 << STD_AVC) | (1 << STD_VC1) | (1 << STD_MPEG2) | + (1 << STD_MPEG4) | (1 << STD_H263) | (1 << STD_AVS) | + (1 << STD_DIV3) | (1 << STD_RV) | (1 << STD_THO) | + (1 << STD_VP8) | (1 << STD_HEVC); + pAttr->supportEncoders = + (1 << STD_AVC) | (1 << STD_MPEG4) | (1 << STD_H263); + } else { + // Wave410 + pAttr->supportDecoders = (1 << STD_HEVC); + pAttr->supportEncoders = 0; + } +#endif + pAttr->supportFBCBWOptimization = + (BOOL)((pAttr->hwConfigDef1 >> 15) & 0x01); + pAttr->supportWTL = TRUE; + pAttr->supportTiled2Linear = FALSE; + pAttr->supportMapTypes = FALSE; + pAttr->support128bitBus = TRUE; + pAttr->supportThumbnailMode = TRUE; + pAttr->supportEndianMask = + (Uint32)((1 << VDI_LITTLE_ENDIAN) | (1 << VDI_BIG_ENDIAN) | + (1 << VDI_32BIT_LITTLE_ENDIAN) | + (1 << VDI_32BIT_BIG_ENDIAN) | (0xffff << 16)); + pAttr->supportBitstreamMode = + (1 << BS_MODE_INTERRUPT) | (1 << BS_MODE_PIC_END); + pAttr->framebufferCacheType = FramebufCacheNone; + pAttr->bitstreamBufferMargin = + (pAttr->productId == PRODUCT_ID_7Q) ? 1024 : 0; + pAttr->numberOfVCores = MAX_NUM_VCORE; + pAttr->numberOfMemProtectRgns = 10; + + return RETCODE_SUCCESS; +} + +Int32 WaveVpuGetProductId(Uint32 coreIdx) +{ + Uint32 productId = PRODUCT_ID_NONE; + Uint32 val; + + if (coreIdx >= MAX_NUM_VPU_CORE) + return PRODUCT_ID_NONE; + + val = VpuReadReg(coreIdx, W4_PRODUCT_NUMBER); + + switch (val) { +#ifdef REDUNDENT_CODE + case WAVE410_CODE: + productId = PRODUCT_ID_410; + break; + case WAVE4102_CODE: + productId = PRODUCT_ID_4102; + break; + case WAVE420_CODE: + productId = PRODUCT_ID_420; + break; + case WAVE412_CODE: + productId = PRODUCT_ID_412; + break; + case CODA7Q_CODE: + productId = PRODUCT_ID_7Q; + break; +#endif + case WAVE420L_CODE: + productId = PRODUCT_ID_420L; + break; +#ifdef REDUNDENT_CODE + case WAVE510_CODE: + productId = PRODUCT_ID_510; + break; + case WAVE512_CODE: + productId = PRODUCT_ID_512; + break; + case WAVE515_CODE: + productId = PRODUCT_ID_515; + break; + case WAVE520_CODE: + productId = PRODUCT_ID_520; + break; +#endif + default: + VLOG(ERR, "Check productId(%d)\n", val); + break; + } + + return productId; +} + +RetCode Wave4VpuGetVersion(Uint32 coreIdx, Uint32 *versionInfo, + Uint32 *revision) +{ + Uint32 regVal; + CodecInstHeader hdr = { 0 }; + + /* GET FIRMWARE&HARDWARE INFORMATION */ + hdr.coreIdx = coreIdx; + hdr.instIndex = 0; +#ifdef ENABLE_CNM_DEBUG_MSG + hdr.loggingEnable = 0; +#endif + Wave4BitIssueCommand((CodecInst *)&hdr, GET_FW_VERSION); + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) + return RETCODE_FAILURE; + + regVal = VpuReadReg(coreIdx, W4_RET_FW_VERSION); + if (versionInfo != NULL) { + *versionInfo = 0; + } + if (revision != NULL) { + *revision = regVal; + } + + regVal = VpuReadReg(coreIdx, W4_RET_CONFIG_REVISION); + VLOG(INFO, "\nget hw version %d !!!\n", regVal); + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuInit(Uint32 coreIdx, void *firmware, Uint32 size) +{ + vpu_buffer_t vb; + PhysicalAddress codeBase; + Uint32 codeSize; + Uint32 i, regVal, remapSize; + Uint32 hwOption = 0; + CodecInstHeader hdr; + Uint64 start_time, end_time; + + osal_memset((void *)&hdr, 0x00, sizeof(CodecInstHeader)); + vdi_get_common_memory(coreIdx, &vb); + + start_time = cviGetCurrentTime(); + + codeBase = vb.phys_addr; + /* ALIGN TO 4KB */ + codeSize = (WAVE4_MAX_CODE_BUF_SIZE & ~0xfff); + if (codeSize < size * 2) { + return RETCODE_INSUFFICIENT_RESOURCE; + } + + CVI_VC_MCU("VPU INIT Start\n"); + + VpuWriteMem(coreIdx, codeBase, (unsigned char *)firmware, size * 2, + VDI_128BIT_LITTLE_ENDIAN); + + vdi_set_bit_firmware_to_pm(coreIdx, (Uint16 *)firmware); + + regVal = 0; + VpuWriteReg(coreIdx, W4_PO_CONF, regVal); + + CVI_VC_MCU("Reset All blocks\n"); + + /* Reset All blocks */ + regVal = 0x7ffffff; + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, regVal); // Reset All blocks + /* Waiting reset done */ + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_RESET_STATUS) == -1) { + VLOG(ERR, "VPU init(W4_VPU_RESET_REQ) timeout\n"); + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + + CVI_VC_MCU("clear registers\n"); + + /* clear registers */ + for (i = W4_CMD_REG_BASE; i < W4_CMD_REG_END; i += 4) + VpuWriteReg(coreIdx, i, 0x00); + + end_time = cviGetCurrentTime(); + CVI_VC_PERF("Wave4 LoadFirmware = %llu us\n", end_time - start_time); + + /* remap page size */ + remapSize = (codeSize >> 12) & 0x1ff; + regVal = 0x80000000 | (0 << 16) | (W4_REMAP_CODE_INDEX << 12) | + (1 << 11) | remapSize; + VpuWriteReg(coreIdx, W4_VPU_REMAP_CTRL, regVal); + VpuWriteReg(coreIdx, W4_VPU_REMAP_VADDR, 0x00000000); /* DO NOT CHANGE! + */ + VpuWriteReg(coreIdx, W4_VPU_REMAP_PADDR, codeBase); + VpuWriteReg(coreIdx, W4_ADDR_CODE_BASE, codeBase); + VpuWriteReg(coreIdx, W4_CODE_SIZE, codeSize); + VpuWriteReg(coreIdx, W4_CODE_PARAM, 0); + // timeoutTicks = COMMAND_TIMEOUT*VCPU_CLOCK_IN_MHZ*(1000000>>15); + VpuWriteReg(coreIdx, W4_TIMEOUT_CNT, 0xffffffff); + + VpuWriteReg(coreIdx, W4_HW_OPTION, hwOption); + /* Interrupt */ + // for encoder interrupt + regVal = (1 << W4_INT_ENC_PIC); + //regVal |= (1 << W4_INT_SLEEP_VPU); + regVal |= (1 << W4_INT_SET_PARAM); + // for decoder interrupt + regVal |= (1 << W4_INT_DEC_PIC_HDR); + regVal |= (1 << W4_INT_DEC_PIC); + regVal |= (1 << W4_INT_QUERY_DEC); + //regVal |= (1 << W4_INT_SLEEP_VPU); + regVal |= (1 << W4_INT_BSBUF_EMPTY); + + CVI_VC_MCU("W4_VPU_VINT_ENABLE\n"); + VpuWriteReg(coreIdx, W4_VPU_VINT_ENABLE, regVal); + + hdr.coreIdx = coreIdx; + + Wave4BitIssueCommand((CodecInst *)&hdr, INIT_VPU); + VpuWriteReg(coreIdx, W4_VPU_REMAP_CORE_START, 1); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + CVI_VC_ERR("VPU init(W4_VPU_REMAP_CORE_START) timeout\n"); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_print_vpu_status(coreIdx); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + + if (regVal == 0) { + Uint32 reasonCode = VpuReadReg(coreIdx, W4_RET_FAIL_REASON); + CVI_VC_ERR( + "VPU init(W4_RET_SUCCESS) failed(%d) REASON CODE(%08x)\n", + regVal, reasonCode); + return RETCODE_FAILURE; + } + + SetupWave4Properties(coreIdx); + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuReInit(Uint32 coreIdx, void *firmware, Uint32 size) +{ + vpu_buffer_t vb; + PhysicalAddress codeBase; + PhysicalAddress oldCodeBase; + Uint32 codeSize; + Uint32 regVal, remapSize; + CodecInstHeader hdr; + + CVI_VC_TRACE("\n"); + + osal_memset((void *)&hdr, 0x00, sizeof(CodecInstHeader)); + vdi_get_common_memory(coreIdx, &vb); + + codeBase = vb.phys_addr; + /* ALIGN TO 4KB */ + codeSize = (WAVE4_MAX_CODE_BUF_SIZE & ~0xfff); + if (codeSize < size * 2) { + return RETCODE_INSUFFICIENT_RESOURCE; + } + + oldCodeBase = vdi_remap_memory_address( + coreIdx, VpuReadReg(coreIdx, W4_VPU_REMAP_PADDR)); + + if (oldCodeBase != codeBase) { + VpuWriteMem(coreIdx, codeBase, (unsigned char *)firmware, + size * 2, VDI_128BIT_LITTLE_ENDIAN); + vdi_set_bit_firmware_to_pm(coreIdx, (Uint16 *)firmware); + + regVal = 0; + VpuWriteReg(coreIdx, W4_PO_CONF, regVal); + + // Waiting for completion of bus transaction + // Step1 : disable request + vdi_fio_write_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL, + 0x100); // WAVE410 GDI added new feature: + // disable_request + + // Step2 : Waiting for completion of bus transaction + if (vdi_wait_bus_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_GDI_VCORE0_BUS_STATUS) == -1) { + vdi_fio_write_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL, + 0x00); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_log(coreIdx, RESET_VPU, 2); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + /* Reset All blocks */ + regVal = 0x7ffffff; + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, + regVal); // Reset All blocks + /* Waiting reset done */ + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_RESET_STATUS) == -1) { + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + // Step3 : must clear GDI_BUS_CTRL after done SW_RESET + vdi_fio_write_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL, 0x00); + + /* not needed to clear registers + for (i=W4_CMD_REG_BASE; i> 12) & 0x1ff; + regVal = 0x80000000 | (W4_REMAP_CODE_INDEX << 12) | (0 << 16) | + (1 << 11) | remapSize; + VpuWriteReg(coreIdx, W4_VPU_REMAP_CTRL, regVal); + VpuWriteReg(coreIdx, W4_VPU_REMAP_VADDR, 0x00000000); /* DO NOT + CHANGE! + */ + VpuWriteReg(coreIdx, W4_VPU_REMAP_PADDR, codeBase); + VpuWriteReg(coreIdx, W4_ADDR_CODE_BASE, codeBase); + VpuWriteReg(coreIdx, W4_CODE_SIZE, codeSize); + VpuWriteReg(coreIdx, W4_CODE_PARAM, 0); + VpuWriteReg(coreIdx, W4_TIMEOUT_CNT, COMMAND_TIMEOUT); + VpuWriteReg(coreIdx, W4_HW_OPTION, 0); + /* Interrupt */ + // for encoder interrupt + regVal = (1 << W4_INT_ENC_PIC); + //regVal |= (1 << W4_INT_SLEEP_VPU); + regVal |= (1 << W4_INT_SET_PARAM); + // for decoder interrupt + regVal |= (1 << W4_INT_DEC_PIC_HDR); + regVal |= (1 << W4_INT_DEC_PIC); + regVal |= (1 << W4_INT_QUERY_DEC); + //regVal |= (1 << W4_INT_SLEEP_VPU); + regVal |= (1 << W4_INT_BSBUF_EMPTY); + VpuWriteReg(coreIdx, W4_VPU_VINT_ENABLE, regVal); + + hdr.coreIdx = coreIdx; + + Wave4BitIssueCommand((CodecInst *)&hdr, INIT_VPU); + VpuWriteReg(coreIdx, W4_VPU_REMAP_CORE_START, 1); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + CVI_VC_ERR("INIT_VPU RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) + return RETCODE_FAILURE; + } + SetupWave4Properties(coreIdx); + + return RETCODE_SUCCESS; +} + +Uint32 Wave4VpuIsInit(Uint32 coreIdx) +{ + Uint32 pc; + + pc = (Uint32)VpuReadReg(coreIdx, W4_VCPU_CUR_PC); + + return pc; +} + +Int32 Wave4VpuIsBusy(Uint32 coreIdx) +{ + return VpuReadReg(coreIdx, W4_VPU_BUSY_STATUS); +} + +Int32 Wave4VpuWaitInterrupt(CodecInst *handle, Int32 timeout) +{ + Int32 reason = -1; + Uint32 coreIdx = handle->coreIdx; + + reason = vdi_wait_interrupt(coreIdx, timeout, + (uint64_t *)&handle->u64EndTime); + if (reason > 0) { + /* If you are using device driver that we provide. the below + * codes are meaningless. Because device driver clears + * interrupt. + */ + VpuWriteReg(coreIdx, W4_VPU_VINT_REASON_CLR, reason); + VpuWriteReg(coreIdx, W4_VPU_VINT_CLEAR, 1); + } + + CVI_VC_INTR("reason = 0x%X\n", reason); + + return reason; +} + +RetCode Wave4VpuClearInterrupt(Uint32 coreIdx, Uint32 flags) +{ + Uint32 interruptReason; + + interruptReason = VpuReadReg(coreIdx, W4_VPU_VINT_REASON_USR); + interruptReason &= ~flags; + VpuWriteReg(coreIdx, W4_VPU_VINT_REASON_USR, interruptReason); + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuSleepWake_EX(Uint32 coreIdx, int iSleepWake, Uint32 size) +{ + CodecInstHeader hdr; + Uint32 regVal; + vpu_buffer_t vb; + PhysicalAddress codeBase; + + Uint32 codeSize; + Uint32 remapSize; + + osal_memset((void *)&hdr, 0x00, sizeof(CodecInstHeader)); + hdr.coreIdx = coreIdx; + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + CVI_VC_ERR("RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + if (iSleepWake == 1) { + // saves + Wave4BitIssueCommand((CodecInst *)&hdr, SLEEP_VPU); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + CVI_VC_ERR("RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) { + APIDPRINT("SLEEP_VPU failed [0x%x]", + VpuReadReg(coreIdx, W4_RET_FAIL_REASON)); + CVI_VC_ERR("SLEEP_VPU fail\n"); + return RETCODE_FAILURE; + } + + regVal = vdi_fio_read_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL); + + if ((regVal >> 24) == 0x01) { + /* VPU has a bus transaction controller */ + vdi_fio_write_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL, + 0x11); + } + + if (vdi_wait_bus_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_GDI_VCORE0_BUS_STATUS) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_log(coreIdx, RESET_VPU, 2); +#endif + CVI_VC_ERR("wait_bus_busy timeout\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + regVal = W4_RST_BLOCK_ACLK_ALL | W4_RST_BLOCK_BCLK_ALL | + W4_RST_BLOCK_CCLK_ALL; + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, + regVal); // Reset All blocks + + /* Waiting reset done */ + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_RESET_STATUS) == -1) { + VLOG(ERR, "VPU Wakeup(W4_VPU_RESET_REQ) timeout\n"); + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + CVI_VC_ERR("RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + + regVal = vdi_fio_read_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL); + + if ((regVal >> 24) == 0x01) { + /* VPU has a bus transaction controller */ + vdi_fio_write_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL, + 0x0); + } + + regVal = 0; + VpuWriteReg(coreIdx, W4_PO_CONF, regVal); + } else { + // restore + Uint32 hwOption = 0; + + vdi_get_common_memory(coreIdx, &vb); + codeBase = vb.phys_addr; + /* ALIGN TO 4KB */ + codeSize = (WAVE4_MAX_CODE_BUF_SIZE & ~0xfff); + if (codeSize < size * 2) { + CVI_VC_ERR("INSUFFICIENT_RESOURCE\n"); + return RETCODE_INSUFFICIENT_RESOURCE; + } + + regVal = 0; + VpuWriteReg(coreIdx, W4_PO_CONF, regVal); + + /* SW_RESET_SAFETY */ + + regVal = W4_RST_BLOCK_ALL; + + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, + regVal); // Reset All blocks + + /* Waiting reset done */ + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_RESET_STATUS) == -1) { + VLOG(ERR, "VPU Wakeup(W4_VPU_RESET_REQ) timeout\n"); + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + CVI_VC_ERR("RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + + /* remap page size */ + remapSize = (codeSize >> 12) & 0x1ff; + regVal = 0x80000000 | (0 << 16) | (W4_REMAP_CODE_INDEX << 12) | + (1 << 11) | remapSize; + VpuWriteReg(coreIdx, W4_VPU_REMAP_CTRL, regVal); + VpuWriteReg(coreIdx, W4_VPU_REMAP_VADDR, 0x00000000); /* DO NOT + CHANGE! + */ + VpuWriteReg(coreIdx, W4_VPU_REMAP_PADDR, codeBase); + VpuWriteReg(coreIdx, W4_ADDR_CODE_BASE, codeBase); + VpuWriteReg(coreIdx, W4_CODE_SIZE, codeSize); + VpuWriteReg(coreIdx, W4_CODE_PARAM, 0); + VpuWriteReg(coreIdx, W4_TIMEOUT_CNT, 0xffffffff); + + VpuWriteReg(coreIdx, W4_HW_OPTION, hwOption); + + /* Interrupt */ + // for encoder interrupt + regVal = (1 << W4_INT_ENC_PIC); + regVal |= (1 << W4_INT_SET_PARAM); + // for decoder interrupt + regVal |= (1 << W4_INT_DEC_PIC_HDR); + regVal |= (1 << W4_INT_DEC_PIC); + regVal |= (1 << W4_INT_QUERY_DEC); + regVal |= (1 << W4_INT_BSBUF_EMPTY); + + VpuWriteReg(coreIdx, W4_VPU_VINT_ENABLE, regVal); + + VpuWriteReg(coreIdx, W4_VPU_BUSY_STATUS, 1); + VpuWriteReg(coreIdx, W4_RET_SUCCESS, 0); + VpuWriteReg(coreIdx, W4_CORE_INDEX, 0); + VpuWriteReg(coreIdx, W4_COMMAND, INIT_VPU); + VpuWriteReg(coreIdx, W4_VPU_HOST_INT_REQ, 1); + + VpuWriteReg(coreIdx, W4_VPU_REMAP_CORE_START, 1); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + VLOG(ERR, + "VPU Wakeup (W4_VPU_REMAP_CORE_START) timeout\n"); + CVI_VC_ERR("RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) { + Uint32 reasonCode = + VpuReadReg(coreIdx, W4_RET_FAIL_REASON); + VLOG(ERR, + "VPU Wakeup(W4_RET_SUCCESS) failed(%d) REASON CODE(%08x)\n", + regVal, reasonCode); + CVI_VC_ERR("VPU Wakeup fail\n"); + return RETCODE_FAILURE; + } + } + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuSleepWake(Uint32 coreIdx, int iSleepWake, Uint32 size) +{ + CodecInstHeader hdr; + Uint32 regVal; + vpu_buffer_t vb; + PhysicalAddress codeBase; + + Uint32 codeSize; + Uint32 remapSize; + + osal_memset((void *)&hdr, 0x00, sizeof(CodecInstHeader)); + hdr.coreIdx = coreIdx; + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + CVI_VC_ERR("RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + if (iSleepWake == 1) { + // saves + Wave4BitIssueCommand((CodecInst *)&hdr, SLEEP_VPU); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + CVI_VC_ERR("RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) { + APIDPRINT("SLEEP_VPU failed [0x%x]", + VpuReadReg(coreIdx, W4_RET_FAIL_REASON)); + CVI_VC_ERR("SLEEP_VPU fail\n"); + return RETCODE_FAILURE; + } + } else { + // restore + Uint32 hwOption = 0; + + vdi_get_common_memory(coreIdx, &vb); + codeBase = vb.phys_addr; + /* ALIGN TO 4KB */ + codeSize = (WAVE4_MAX_CODE_BUF_SIZE & ~0xfff); + if (codeSize < size * 2) { + CVI_VC_ERR("INSUFFICIENT_RESOURCE\n"); + return RETCODE_INSUFFICIENT_RESOURCE; + } + + regVal = 0; + VpuWriteReg(coreIdx, W4_PO_CONF, regVal); + + /* SW_RESET_SAFETY */ + regVal = W4_RST_BLOCK_ALL; + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, + regVal); // Reset All blocks + + /* Waiting reset done */ + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_RESET_STATUS) == -1) { + VLOG(ERR, "VPU Wakeup(W4_VPU_RESET_REQ) timeout\n"); + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + CVI_VC_ERR("RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + + /* remap page size */ + remapSize = (codeSize >> 12) & 0x1ff; + regVal = 0x80000000 | (0 << 16) | (W4_REMAP_CODE_INDEX << 12) | + (1 << 11) | remapSize; + VpuWriteReg(coreIdx, W4_VPU_REMAP_CTRL, regVal); + VpuWriteReg(coreIdx, W4_VPU_REMAP_VADDR, 0x00000000); /* DO NOT + CHANGE! + */ + VpuWriteReg(coreIdx, W4_VPU_REMAP_PADDR, codeBase); + VpuWriteReg(coreIdx, W4_ADDR_CODE_BASE, codeBase); + VpuWriteReg(coreIdx, W4_CODE_SIZE, codeSize); + VpuWriteReg(coreIdx, W4_CODE_PARAM, 0); + VpuWriteReg(coreIdx, W4_TIMEOUT_CNT, COMMAND_TIMEOUT); + + VpuWriteReg(coreIdx, W4_HW_OPTION, hwOption); + + /* Interrupt */ + // for encoder interrupt + regVal = (1 << W4_INT_ENC_PIC); + regVal |= (1 << W4_INT_SLEEP_VPU); + regVal |= (1 << W4_INT_SET_PARAM); + // for decoder interrupt + regVal |= (1 << W4_INT_DEC_PIC_HDR); + regVal |= (1 << W4_INT_DEC_PIC); + regVal |= (1 << W4_INT_QUERY_DEC); + regVal |= (1 << W4_INT_SLEEP_VPU); + regVal |= (1 << W4_INT_BSBUF_EMPTY); + + VpuWriteReg(coreIdx, W4_VPU_VINT_ENABLE, regVal); + + hdr.coreIdx = coreIdx; + + VpuWriteReg(coreIdx, W4_VPU_BUSY_STATUS, 1); + VpuWriteReg(coreIdx, W4_RET_SUCCESS, 0); // for debug + VpuWriteReg(coreIdx, W4_CORE_INDEX, 0); + +#ifdef REDUNDENT_CODE + if (hdr.productId == PRODUCT_ID_7Q) // only coda7q use + // codecModeAux for DIV + VpuWriteReg(coreIdx, W4_INST_INDEX, + (hdr.instIndex & 0xffff) | + (hdr.codecMode << 16) | + (hdr.codecModeAux << 24)); + else +#endif + VpuWriteReg(coreIdx, W4_INST_INDEX, + (hdr.instIndex & 0xffff) | + (hdr.codecMode << 16)); + + VpuWriteReg(coreIdx, W4_COMMAND, INIT_VPU); + +#ifdef ENABLE_CNM_DEBUG_MSG + if (hdr.loggingEnable) { + vdi_log(coreIdx, INIT_VPU, 1); + } +#endif + + VpuWriteReg(coreIdx, W4_VPU_REMAP_CORE_START, 1); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + VLOG(ERR, + "VPU Wakeup (W4_VPU_REMAP_CORE_START) timeout\n"); + CVI_VC_ERR("RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) { + Uint32 reasonCode = + VpuReadReg(coreIdx, W4_RET_FAIL_REASON); + VLOG(ERR, + "VPU Wakeup(W4_RET_SUCCESS) failed(%d) REASON CODE(%08x)\n", + regVal, reasonCode); + CVI_VC_ERR("VPU Wakeup fail\n"); + return RETCODE_FAILURE; + } + } + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuReset(Uint32 coreIdx, SWResetMode resetMode) +{ + Uint32 val = 0; + RetCode ret = RETCODE_FAILURE; + VpuAttr *pAttr = &g_VpuCoreAttributes[coreIdx]; + + // VPU doesn't send response. Force to set BUSY flag to 0. + VpuWriteReg(coreIdx, W4_VPU_BUSY_STATUS, 0); + if (pAttr->supportGDIHW == TRUE) { + // Waiting for completion of bus transaction + // Step1 : disable request + vdi_fio_write_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL, + 0x100); // WAVE410 GDI added new feature: + // disable_request + + // Step2 : Waiting for completion of bus transaction + if (vdi_wait_bus_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_GDI_VCORE0_BUS_STATUS) == -1) { + vdi_fio_write_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL, + 0x00); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_log(coreIdx, RESET_VPU, 2); +#endif + CVI_VC_ERR("wait_bus_busy timeout\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + } else { + if (pAttr->productId == PRODUCT_ID_420L) { + val = vdi_fio_read_register(coreIdx, + W4_GDI_VCORE0_BUS_CTRL); + if ((val >> 24) == 0x01) { + /* VPU has a bus transaction controller */ + vdi_fio_write_register( + coreIdx, W4_GDI_VCORE0_BUS_CTRL, 0x11); + } + if (vdi_wait_bus_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_GDI_VCORE0_BUS_STATUS) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_log(coreIdx, RESET_VPU, 2); +#endif + CVI_VC_ERR("wait_bus_busy timeout\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + } + } + + if (resetMode == SW_RESET_SAFETY) { + ret = Wave4VpuSleepWake(coreIdx, TRUE, 0); + if (ret != RETCODE_SUCCESS) { + CVI_VC_ERR("Wave4VpuSleepWake error %d\n", ret); + return ret; + } + } + + switch (resetMode) { + case SW_RESET_ON_BOOT: + case SW_RESET_FORCE: + val = W4_RST_BLOCK_ALL; + break; + case SW_RESET_SAFETY: + val = W4_RST_BLOCK_ACLK_ALL | W4_RST_BLOCK_BCLK_ALL | + W4_RST_BLOCK_CCLK_ALL; + break; + default: + CVI_VC_ERR("RETCODE_INVALID_PARAM\n"); + return RETCODE_INVALID_PARAM; + } + + if (val) { + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, val); + + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_RESET_STATUS) == -1) { + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_log(coreIdx, RESET_VPU, 2); +#endif + CVI_VC_ERR("wait_vpu_busy timeout\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + VpuWriteReg(coreIdx, W4_VPU_RESET_REQ, 0); + } + if (pAttr->supportGDIHW == TRUE) { + // Step3 : must clear GDI_BUS_CTRL after done SW_RESET + vdi_fio_write_register(coreIdx, W4_GDI_VCORE0_BUS_CTRL, 0x00); + } else { + if (pAttr->productId == PRODUCT_ID_420L) { + val = vdi_fio_read_register(coreIdx, + W4_GDI_VCORE0_BUS_CTRL); + if ((val >> 24) == 0x01) { + /* VPU has a bus transaction controller */ + vdi_fio_write_register( + coreIdx, W4_GDI_VCORE0_BUS_CTRL, 0); + } + } + } + + if (resetMode == SW_RESET_SAFETY || resetMode == SW_RESET_FORCE) { + ret = Wave4VpuSleepWake(coreIdx, FALSE, 0); + } + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuBuildUpDecParam(CodecInst *instance, DecOpenParam *param) +{ + RetCode ret = RETCODE_SUCCESS; + DecInfo *pDecInfo; + VpuAttr *pAttr = &g_VpuCoreAttributes[instance->coreIdx]; + + pDecInfo = VPU_HANDLE_TO_DECINFO(instance); + + pDecInfo->streamRdPtrRegAddr = W4_BS_RD_PTR; + pDecInfo->streamWrPtrRegAddr = W4_BS_WR_PTR; + pDecInfo->frameDisplayFlagRegAddr = W4_RET_DEC_DISP_FLAG; + pDecInfo->currentPC = W4_VCPU_CUR_PC; + pDecInfo->busyFlagAddr = W4_VPU_BUSY_STATUS; + if ((pAttr->supportDecoders & (1 << param->bitstreamFormat)) == 0) + return RETCODE_NOT_SUPPORTED_FEATURE; + pDecInfo->seqChangeMask = (param->bitstreamFormat == STD_HEVC) ? + SEQ_CHANGE_ENABLE_ALL_HEVC : + SEQ_CHANGE_ENABLE_ALL_VP9; + + pDecInfo->targetSubLayerId = HEVC_MAX_SUB_LAYER_ID; + + if (param->vbWork.size > 0) { + pDecInfo->vbWork = param->vbWork; + pDecInfo->workBufferAllocExt = TRUE; + vdi_attach_dma_memory(instance->coreIdx, ¶m->vbWork); + } else { + char ionName[MAX_VPU_ION_BUFFER_NAME]; + +#ifdef REDUNDENT_CODE + if ((instance->productId == PRODUCT_ID_412) || + (instance->productId == PRODUCT_ID_512) || + (instance->productId == PRODUCT_ID_515)) { + pDecInfo->vbWork.size = WAVE412DEC_WORKBUF_SIZE; + } else +#endif + { + pDecInfo->vbWork.size = WAVE4DEC_WORKBUF_SIZE; + } + pDecInfo->workBufferAllocExt = FALSE; + + CVI_VC_MEM("vbWork.size = 0x%X\n", pDecInfo->vbWork.size); + sprintf(ionName, "VDEC_%d_H265_WorkBuffer", + instance->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(instance->coreIdx, &pDecInfo->vbWork, 0, + ionName) < 0) { + pDecInfo->vbWork.base = 0; + pDecInfo->vbWork.phys_addr = 0; + pDecInfo->vbWork.size = 0; + pDecInfo->vbWork.virt_addr = 0; + return RETCODE_INSUFFICIENT_RESOURCE; + } + } + + vdi_clear_memory(instance->coreIdx, pDecInfo->vbWork.phys_addr, + pDecInfo->vbWork.size); + + VpuWriteReg(instance->coreIdx, W4_ADDR_WORK_BASE, + pDecInfo->vbWork.phys_addr); + VpuWriteReg(instance->coreIdx, W4_WORK_SIZE, pDecInfo->vbWork.size); + VpuWriteReg(instance->coreIdx, W4_WORK_PARAM, 0); + + Wave4BitIssueCommand(instance, CREATE_INSTANCE); + if (vdi_wait_vpu_busy(instance->coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) + vdi_log(instance->coreIdx, CREATE_INSTANCE, 2); +#endif + VDI_FREE_MEMORY(instance->coreIdx, &pDecInfo->vbWork); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + if (VpuReadReg(instance->coreIdx, W4_RET_SUCCESS) == FALSE) { + VDI_FREE_MEMORY(instance->coreIdx, &pDecInfo->vbWork); + ret = RETCODE_FAILURE; + } + + return ret; +} + +RetCode Wave4VpuDecFiniSeq(CodecInst *instance) +{ + DecInfo *pDecInfo = VPU_HANDLE_TO_DECINFO(instance); + + VpuWriteReg(instance->coreIdx, W4_ADDR_WORK_BASE, + pDecInfo->vbWork.phys_addr); + VpuWriteReg(instance->coreIdx, W4_WORK_SIZE, pDecInfo->vbWork.size); + VpuWriteReg(instance->coreIdx, W4_WORK_PARAM, 0); + + Wave4BitIssueCommand(instance, FINI_SEQ); + if (vdi_wait_vpu_busy(instance->coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) + return RETCODE_VPU_RESPONSE_TIMEOUT; + + if (VpuReadReg(instance->coreIdx, W4_RET_SUCCESS) == FALSE) + return RETCODE_FAILURE; + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuDecSetBitstreamFlag(CodecInst *instance, BOOL running, BOOL eos, + BOOL explicitEnd) +{ + DecInfo *pDecInfo = &instance->CodecInfo->decInfo; + + pDecInfo->streamEndflag = (eos == 1) ? TRUE : FALSE; + + if (running == TRUE) { + BitStreamMode bsMode = + (BitStreamMode)pDecInfo->openParam.bitstreamMode; + BOOL explicitEndFlag = 0; + + explicitEndFlag = (BOOL)(bsMode == BS_MODE_PIC_END || + pDecInfo->streamEndflag == TRUE || + explicitEnd == TRUE); + VpuWriteReg(instance->coreIdx, W4_BS_OPTION, + (pDecInfo->streamEndflag << 1) | explicitEndFlag); + } + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuDecRegisterFramebuffer(CodecInst *inst, FrameBuffer *fbArr, + TiledMapType mapType, Uint32 count) +{ + RetCode ret = RETCODE_SUCCESS; + DecInfo *pDecInfo = &inst->CodecInfo->decInfo; + DecInitialInfo *sequenceInfo = &inst->CodecInfo->decInfo.initialInfo; + Int32 q, j, i, remain, idx; + Uint32 mvCount; + Uint32 k; + Int32 coreIdx, startNo, endNo; + Uint32 regVal, cbcrInterleave, nv21; + Uint32 endian, yuvFormat = 0; + Uint32 addrY, addrCb, addrCr; + Uint32 mvColSize, fbcYTblSize, fbcCTblSize, lumaStride, chromaStride; + vpu_buffer_t vbBuffer; + Uint32 stride; + Uint32 colorFormat = 0; + Uint32 outputFormat = 0; + Uint32 axiID; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + coreIdx = inst->coreIdx; + axiID = pDecInfo->openParam.virtAxiID; + cbcrInterleave = pDecInfo->openParam.cbcrInterleave; + nv21 = pDecInfo->openParam.nv21; + mvColSize = fbcYTblSize = fbcCTblSize = 0; + if (mapType == COMPRESSED_FRAME_MAP) { + cbcrInterleave = 0; + nv21 = 0; + +#ifdef REDUNDENT_CODE + if (inst->codecMode == C7_VP9_DEC) { + mvColSize = WAVE4_DEC_VP9_MVCOL_BUF_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); + } else if (inst->codecMode == HEVC_DEC) { + mvColSize = WAVE4_DEC_HEVC_MVCOL_BUF_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); + } else if (inst->codecMode == C7_AVS2_DEC) { + mvColSize = CODA7Q_MVCOL_BUF_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); // [FIX ME!!!] + } else { + mvColSize = CODA7Q_MVCOL_BUF_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); + } +#else + mvColSize = WAVE4_DEC_HEVC_MVCOL_BUF_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); +#endif + mvColSize = VPU_ALIGN16(mvColSize); + vbBuffer.phys_addr = 0; + if (inst->codecMode == HEVC_DEC || + inst->codecMode == C7_HEVC_DEC || + inst->codecMode == C7_VP9_DEC || + inst->codecMode == C7_AVS2_DEC) { + vbBuffer.size = ((mvColSize + 4095) & ~4095) + + 4096; /* 4096 is a margin */ + mvCount = count; + + for (k = 0; k < mvCount; k++) { + if (pDecInfo->vbMV[k].size == 0) { + CVI_VC_MEM("vbMV[%d].size = 0x%X\n", k, + vbBuffer.size); + sprintf(ionName, + "VDEC_%d_H265_mvColBuf", + inst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(inst->coreIdx, + &vbBuffer, 0, + ionName) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + pDecInfo->vbMV[k] = vbBuffer; + } + } + } + +#ifdef REDUNDENT_CODE + // VP9 Decoded size : 64 aligned. + if (inst->codecMode == C7_VP9_DEC) + fbcYTblSize = WAVE4_FBC_LUMA_TABLE_SIZE( + VPU_ALIGN64(pDecInfo->initialInfo.picWidth), + VPU_ALIGN64(pDecInfo->initialInfo.picHeight)); + else if (inst->codecMode == HEVC_DEC) + fbcYTblSize = WAVE4_FBC_LUMA_TABLE_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); + else if (inst->codecMode == C7_AVS2_DEC) + fbcYTblSize = CODA7Q_FBC_LUMA_TABLE_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); // [FIX ME!!!] + else + fbcYTblSize = CODA7Q_FBC_LUMA_TABLE_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); +#else + fbcYTblSize = WAVE4_FBC_LUMA_TABLE_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); +#endif + fbcYTblSize = VPU_ALIGN16(fbcYTblSize); + vbBuffer.phys_addr = 0; + vbBuffer.size = ((fbcYTblSize + 4095) & ~4095) + 4096; + for (k = 0; k < count; k++) { + if (pDecInfo->vbFbcYTbl[k].size == 0) { + CVI_VC_MEM("vbFbcYTbl[%d].size = 0x%X\n", k, + vbBuffer.size); + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VDEC_%d_H265_vbFbcYTbl", + inst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(inst->coreIdx, + &vbBuffer, 0, + ionName) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + pDecInfo->vbFbcYTbl[k] = vbBuffer; + } + } + +#ifdef REDUNDENT_CODE + if (inst->codecMode == C7_VP9_DEC) + fbcCTblSize = WAVE4_FBC_CHROMA_TABLE_SIZE( + VPU_ALIGN64(pDecInfo->initialInfo.picWidth), + VPU_ALIGN64(pDecInfo->initialInfo.picHeight)); + else if (inst->codecMode == HEVC_DEC) + fbcCTblSize = WAVE4_FBC_CHROMA_TABLE_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); + else if (inst->codecMode == C7_AVS2_DEC) + fbcCTblSize = CODA7Q_FBC_CHROMA_TABLE_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); // [FIX ME!!!] + else + fbcCTblSize = CODA7Q_FBC_CHROMA_TABLE_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); +#else + fbcCTblSize = WAVE4_FBC_CHROMA_TABLE_SIZE( + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight); +#endif + + fbcCTblSize = VPU_ALIGN16(fbcCTblSize); + vbBuffer.phys_addr = 0; + vbBuffer.size = ((fbcCTblSize + 4095) & ~4095) + 4096; + for (k = 0; k < count; k++) { + if (pDecInfo->vbFbcCTbl[k].size == 0) { + CVI_VC_MEM("vbFbcCTbl[%d].size = 0x%X\n", k, + vbBuffer.size); + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VDEC_%d_H265_vbFbcCTbl", + inst->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(inst->coreIdx, + &vbBuffer, 0, + ionName) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + pDecInfo->vbFbcCTbl[k] = vbBuffer; + } + } + + if (inst->productId == PRODUCT_ID_420 || + inst->productId == PRODUCT_ID_420L) { + lumaStride = + VPU_ALIGN16(pDecInfo->initialInfo.picWidth) * + (pDecInfo->initialInfo.lumaBitdepth > 8 ? 5 : + 4); + lumaStride = VPU_ALIGN32(lumaStride); + chromaStride = + VPU_ALIGN16(pDecInfo->initialInfo.picWidth / + 2) * + (pDecInfo->initialInfo.chromaBitdepth > 8 ? 5 : + 4); + chromaStride = VPU_ALIGN32(chromaStride); + VpuWriteReg(coreIdx, W4_FBC_STRIDE, + lumaStride << 16 | chromaStride); + } + } + endian = vdi_convert_endian(coreIdx, fbArr[0].endian) & + VDI_128BIT_ENDIAN_MASK; + + regVal = (pDecInfo->initialInfo.picWidth << 16) | + (pDecInfo->initialInfo.picHeight); + VpuWriteReg(coreIdx, W4_PIC_SIZE, regVal); + + yuvFormat = 0; /* YUV420 8bit */ + if (mapType == LINEAR_FRAME_MAP) { + BOOL justified = W4_WTL_RIGHT_JUSTIFIED; + Uint32 formatNo = W4_WTL_PIXEL_8BIT; + switch (pDecInfo->wtlFormat) { + case FORMAT_420_P10_16BIT_MSB: + justified = W4_WTL_RIGHT_JUSTIFIED; + formatNo = W4_WTL_PIXEL_16BIT; + break; + case FORMAT_420_P10_16BIT_LSB: + justified = W4_WTL_LEFT_JUSTIFIED; + formatNo = W4_WTL_PIXEL_16BIT; + break; + case FORMAT_420_P10_32BIT_MSB: + justified = W4_WTL_RIGHT_JUSTIFIED; + formatNo = W4_WTL_PIXEL_32BIT; + break; + case FORMAT_420_P10_32BIT_LSB: + justified = W4_WTL_LEFT_JUSTIFIED; + formatNo = W4_WTL_PIXEL_32BIT; + break; + default: + break; + } + yuvFormat = justified << 2 | formatNo; + } + + stride = fbArr[0].stride; + if (mapType == COMPRESSED_FRAME_MAP) { + if (pDecInfo->chFbcFrameIdx != -1) + stride = fbArr[pDecInfo->chFbcFrameIdx].stride; + } else { + if (pDecInfo->chBwbFrameIdx != -1) + stride = fbArr[pDecInfo->chBwbFrameIdx].stride; + } + + if (mapType == LINEAR_FRAME_MAP) { + outputFormat = 0; + outputFormat |= (nv21 << 1); + outputFormat |= (cbcrInterleave << 0); + + if (inst->productId == PRODUCT_ID_420 || + inst->productId == PRODUCT_ID_420L) { + lumaStride = + VPU_ALIGN16(pDecInfo->initialInfo.picWidth) * + (pDecInfo->initialInfo.lumaBitdepth > 8 ? 5 : + 4); + lumaStride = VPU_ALIGN32(lumaStride); + chromaStride = + VPU_ALIGN16(pDecInfo->initialInfo.picWidth / + 2) * + (pDecInfo->initialInfo.chromaBitdepth > 8 ? 5 : + 4); + chromaStride = VPU_ALIGN32(chromaStride); + VpuWriteReg(coreIdx, W4_FBC_STRIDE, + lumaStride << 16 | chromaStride); + } + } + + regVal = ((mapType == LINEAR_FRAME_MAP) << 28) | (axiID << 24) | + (1 << 23) | /* PIXEL ORDER in 128bit. first pixel in low + address */ + (yuvFormat << 20) | (colorFormat << 19) | + (outputFormat << 16) | (stride); + + VpuWriteReg(coreIdx, W4_COMMON_PIC_INFO, regVal); + + if (pDecInfo->interResChange == 1) { + i = 0; + // W4_SFB_OPTION [2:0] : 0x3 = SET_FB_UPDATE_MODE + VpuWriteReg(coreIdx, W4_SFB_OPTION, + (pDecInfo->openParam.fbc_mode << 20) | + (endian << 16) | (1 << 4) | (1 << 3) | 3); + if (mapType == COMPRESSED_FRAME_MAP) { + idx = pDecInfo->chFbcFrameIdx; + } else { + idx = pDecInfo->chBwbFrameIdx; + } + VpuWriteReg(coreIdx, W4_SET_FB_NUM, (idx << 8) | idx); + if (mapType == LINEAR_FRAME_MAP && + pDecInfo->openParam.cbcrOrder == CBCR_ORDER_REVERSED) { + addrY = fbArr[idx].bufY; + addrCb = fbArr[idx].bufCr; + addrCr = fbArr[idx].bufCb; + } else { + addrY = fbArr[idx].bufY; + addrCb = fbArr[idx].bufCb; + addrCr = fbArr[idx].bufCr; + } + VpuWriteReg(coreIdx, W4_ADDR_LUMA_BASE0 + (i << 4), addrY); + VpuWriteReg(coreIdx, W4_ADDR_CB_BASE0 + (i << 4), addrCb); + APIDPRINT("REGISTER FB[%02d] Y(0x%08x), Cb(0x%08x) ", i, addrY, + addrCb); + if (mapType == COMPRESSED_FRAME_MAP) { + VpuWriteReg(coreIdx, W4_ADDR_FBC_Y_OFFSET0 + (i << 4), + pDecInfo->vbFbcYTbl[idx].phys_addr); /* Luma + FBC + offset + table + */ + VpuWriteReg( + coreIdx, W4_ADDR_FBC_C_OFFSET0 + (i << 4), + pDecInfo->vbFbcCTbl[idx].phys_addr); /* Chroma + FBC + offset + table + */ + VpuWriteReg(coreIdx, W4_ADDR_MV_COL0 + (i << 2), + pDecInfo->vbMV[idx].phys_addr); + APIDPRINT("Yo(0x%08x) Co(0x%08x), Mv(0x%08x)\n", + pDecInfo->vbFbcYTbl[idx].phys_addr, + pDecInfo->vbFbcCTbl[idx].phys_addr, + pDecInfo->vbMV[idx].phys_addr); + } else { + VpuWriteReg(coreIdx, W4_ADDR_CR_BASE0 + (i << 4), + addrCr); + VpuWriteReg(coreIdx, W4_ADDR_FBC_C_OFFSET0 + (i << 4), + 0); + VpuWriteReg(coreIdx, W4_ADDR_MV_COL0 + (i << 2), 0); + APIDPRINT("Cr(0x%08x)\n", addrCr); + } + VpuWriteReg(coreIdx, W4_ADDR_WORK_BASE, + pDecInfo->vbWork.phys_addr); + VpuWriteReg(coreIdx, W4_WORK_SIZE, pDecInfo->vbWork.size); + VpuWriteReg(coreIdx, W4_WORK_PARAM, 0); + + Wave4BitIssueCommand(inst, SET_FRAMEBUF); + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + } else { + remain = count; + q = (remain + 7) >> 3; + idx = 0; + for (j = 0; j < q; j++) { + regVal = (pDecInfo->openParam.fbc_mode << 20) | + (endian << 16) | (j == q - 1) << 4 | + ((j == 0) << 3); + VpuWriteReg(coreIdx, W4_SFB_OPTION, regVal); + startNo = j * 8; + endNo = startNo + (remain >= 8 ? 8 : remain) - 1; + + VpuWriteReg(coreIdx, W4_SET_FB_NUM, + (startNo << 8) | endNo); + + for (i = 0; i < 8 && i < remain; i++) { + if (mapType == LINEAR_FRAME_MAP && + pDecInfo->openParam.cbcrOrder == + CBCR_ORDER_REVERSED) { + addrY = fbArr[i + startNo].bufY; + addrCb = fbArr[i + startNo].bufCr; + addrCr = fbArr[i + startNo].bufCb; + } else { + addrY = fbArr[i + startNo].bufY; + addrCb = fbArr[i + startNo].bufCb; + addrCr = fbArr[i + startNo].bufCr; + } + VpuWriteReg(coreIdx, + W4_ADDR_LUMA_BASE0 + (i << 4), + addrY); + VpuWriteReg(coreIdx, + W4_ADDR_CB_BASE0 + (i << 4), + addrCb); + APIDPRINT( + "REGISTER FB[%02d] Y(0x%08x), Cb(0x%08x) ", + i, addrY, addrCb); + if (mapType == COMPRESSED_FRAME_MAP) { + VpuWriteReg(coreIdx, + W4_ADDR_FBC_Y_OFFSET0 + + (i << 4), + pDecInfo->vbFbcYTbl[idx] + .phys_addr); /* Luma + FBC + offset + table + */ + VpuWriteReg( + coreIdx, + W4_ADDR_FBC_C_OFFSET0 + + (i << 4), + pDecInfo->vbFbcCTbl[idx] + .phys_addr); /* Chroma + FBC + offset + table + */ + VpuWriteReg( + coreIdx, + W4_ADDR_MV_COL0 + (i << 2), + pDecInfo->vbMV[idx].phys_addr); + APIDPRINT( + "Yo(0x%08x) Co(0x%08x), Mv(0x%08x)\n", + pDecInfo->vbFbcYTbl[idx] + .phys_addr, + pDecInfo->vbFbcCTbl[idx] + .phys_addr, + pDecInfo->vbMV[idx].phys_addr); + } else { + VpuWriteReg(coreIdx, + W4_ADDR_CR_BASE0 + (i << 4), + addrCr); + VpuWriteReg(coreIdx, + W4_ADDR_FBC_C_OFFSET0 + + (i << 4), + 0); + VpuWriteReg(coreIdx, + W4_ADDR_MV_COL0 + (i << 2), + 0); + APIDPRINT("Cr(0x%08x)\n", addrCr); + } + idx++; + } + remain -= i; + + VpuWriteReg(coreIdx, W4_ADDR_WORK_BASE, + pDecInfo->vbWork.phys_addr); + VpuWriteReg(coreIdx, W4_WORK_SIZE, + pDecInfo->vbWork.size); + VpuWriteReg(coreIdx, W4_WORK_PARAM, 0); + + // CODA7Q needs temporal buffer address. + VpuWriteReg(coreIdx, W4_ADDR_TEMP_BASE, + pDecInfo->vbTemp.phys_addr); + VpuWriteReg(coreIdx, W4_TEMP_SIZE, + pDecInfo->vbTemp.size); + VpuWriteReg(coreIdx, W4_TEMP_PARAM, 0); + + Wave4BitIssueCommand(inst, SET_FRAMEBUF); + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + } + } + + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) { + return RETCODE_FAILURE; + } + +#ifdef REDUNDENT_CODE + if (inst->productId == PRODUCT_ID_7Q) { + if (ConfigSecAXICoda7(coreIdx, + pDecInfo->openParam.bitstreamFormat, + &pDecInfo->secAxiInfo, + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight, + sequenceInfo->profile) == 0) { + return RETCODE_INSUFFICIENT_RESOURCE; + } + } else +#endif + { + if (ConfigSecAXIWave( + coreIdx, inst->codecMode, &pDecInfo->secAxiInfo, + pDecInfo->initialInfo.picWidth, + pDecInfo->initialInfo.picHeight, + sequenceInfo->profile, sequenceInfo->level) == 0) { + return RETCODE_INSUFFICIENT_RESOURCE; + } + } + + return ret; +} + +RetCode Wave4VpuDecFlush(CodecInst *instance, + FramebufferIndex *framebufferIndexes, Uint32 size) +{ + Int32 regVal; + Uint32 i, j; + DecInfo *pDecInfo = &instance->CodecInfo->decInfo; + + VpuWriteReg(instance->coreIdx, W4_FLUSH_DECODER_OPTION, FLUSH_DPB); + /* Set up work-buffer */ + VpuWriteReg(instance->coreIdx, W4_ADDR_WORK_BASE, + pDecInfo->vbWork.phys_addr); + VpuWriteReg(instance->coreIdx, W4_WORK_SIZE, pDecInfo->vbWork.size); + VpuWriteReg(instance->coreIdx, W4_WORK_PARAM, 0); + + Wave4BitIssueCommand(instance, FLUSH_DECODER); + if (vdi_wait_vpu_busy(instance->coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + // Clear display flags. + pDecInfo->frameDisplayFlag = 0; + + regVal = VpuReadReg(instance->coreIdx, W4_RET_SUCCESS); + if (regVal == 0) { + return RETCODE_FAILURE; + } + + /* Get remaining framebuffers */ + if (framebufferIndexes != NULL) { + for (j = 0, i = W4_RET_DEC_DISPLAY_INDEX_0; + i <= W4_RET_DEC_DISPLAY_INDEX_15 && j < size; + i += 4, j++) { + regVal = VpuReadReg(instance->coreIdx, i); + framebufferIndexes[j].linearIndex = regVal >> 16; + framebufferIndexes[j].tiledIndex = regVal & 0xffff; + if (pDecInfo->wtlEnable == FALSE) + framebufferIndexes[j].linearIndex = + framebufferIndexes[j].tiledIndex; + APIDPRINT("FLUSH LINEAR(%d) TILED(%d)\n", + framebufferIndexes[j].linearIndex, + framebufferIndexes[j].tiledIndex); + } + } + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuEncFiniSeq(CodecInst *instance) +{ + EncInfo *pEncInfo = VPU_HANDLE_TO_ENCINFO(instance); + + VpuWriteReg(instance->coreIdx, W4_ADDR_WORK_BASE, + pEncInfo->vbWork.phys_addr); + VpuWriteReg(instance->coreIdx, W4_WORK_SIZE, pEncInfo->vbWork.size); + VpuWriteReg(instance->coreIdx, W4_WORK_PARAM, 0); + + Wave4BitIssueCommand(instance, FINI_SEQ); + if (vdi_wait_vpu_busy(instance->coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) + return RETCODE_VPU_RESPONSE_TIMEOUT; + + if (VpuReadReg(instance->coreIdx, W4_RET_SUCCESS) == FALSE) + return RETCODE_FAILURE; + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuBuildUpEncParam(CodecInst *instance, EncOpenParam *param) +{ + RetCode ret = RETCODE_SUCCESS; + VpuAttr *pAttr = &g_VpuCoreAttributes[instance->coreIdx]; + EncInfo *pEncInfo = &instance->CodecInfo->encInfo; + char ionName[MAX_VPU_ION_BUFFER_NAME]; + + pEncInfo->streamRdPtrRegAddr = W4_BS_RD_PTR; + pEncInfo->streamWrPtrRegAddr = W4_BS_WR_PTR; + pEncInfo->currentPC = W4_VCPU_CUR_PC; + pEncInfo->busyFlagAddr = W4_VPU_BUSY_STATUS; +#ifdef REDUNDENT_CODE + if (instance->productId == PRODUCT_ID_7Q) { + if (param->bitstreamFormat == STD_HEVC) + instance->codecMode = C7_HEVC_ENC; + else if (param->bitstreamFormat == STD_AVC) + instance->codecMode = C7_AVC_ENC; + else if (param->bitstreamFormat == STD_MPEG4 || + param->bitstreamFormat == STD_H263) + instance->codecMode = C7_MP4_ENC; + else + return RETCODE_NOT_SUPPORTED_FEATURE; + } else +#endif + { + if (param->bitstreamFormat == STD_HEVC) + instance->codecMode = HEVC_ENC; + else + return RETCODE_NOT_SUPPORTED_FEATURE; + } + + if ((pAttr->supportEncoders & (1 << param->bitstreamFormat)) == 0) + return RETCODE_NOT_SUPPORTED_FEATURE; + + pEncInfo->vbWork.size = WAVE4ENC_WORKBUF_SIZE; + + CVI_VC_MEM("vbWork, phys_addr = 0x%llX, size = 0x%X\n", + pEncInfo->vbWork.phys_addr, pEncInfo->vbWork.size); + + sprintf(ionName, "VENC_%d_H265_WorkBuffer", instance->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(instance->coreIdx, &pEncInfo->vbWork, 0, + ionName) < 0) { + pEncInfo->vbWork.base = 0; + pEncInfo->vbWork.phys_addr = 0; + pEncInfo->vbWork.size = 0; + pEncInfo->vbWork.virt_addr = 0; + CVI_VC_ERR("RETCODE_INSUFFICIENT_RESOURCE\n"); + return RETCODE_INSUFFICIENT_RESOURCE; + } + + vdi_clear_memory(instance->coreIdx, pEncInfo->vbWork.phys_addr, + pEncInfo->vbWork.size); + + VpuWriteReg(instance->coreIdx, W4_ADDR_WORK_BASE, + pEncInfo->vbWork.phys_addr); + VpuWriteReg(instance->coreIdx, W4_WORK_SIZE, pEncInfo->vbWork.size); + VpuWriteReg(instance->coreIdx, W4_WORK_PARAM, 0); + + Wave4BitIssueCommand(instance, CREATE_INSTANCE); + if (vdi_wait_vpu_busy(instance->coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) + vdi_log(instance->coreIdx, CREATE_INSTANCE, 2); +#endif + VDI_FREE_MEMORY(instance->coreIdx, &pEncInfo->vbWork); + CVI_VC_ERR("CREATE_INSTANCE timeout\n"); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_print_vpu_status(instance->coreIdx); +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + if (VpuReadReg(instance->coreIdx, W4_RET_SUCCESS) == FALSE) { + VDI_FREE_MEMORY(instance->coreIdx, &pEncInfo->vbWork); + CVI_VC_ERR("CREATE_INSTANCE fail\n"); + ret = RETCODE_FAILURE; + } + + pEncInfo->streamRdPtr = param->bitstreamBuffer; + pEncInfo->streamWrPtr = param->bitstreamBuffer; + pEncInfo->lineBufIntEn = param->lineBufIntEn; + pEncInfo->bEsBufQueueEn = param->bEsBufQueueEn; + pEncInfo->streamBufStartAddr = param->bitstreamBuffer; + pEncInfo->streamBufSize = param->bitstreamBufferSize; + pEncInfo->streamBufEndAddr = + param->bitstreamBuffer + param->bitstreamBufferSize; + pEncInfo->stride = 0; + pEncInfo->vbFrame.size = 0; + pEncInfo->vbPPU.size = 0; + pEncInfo->frameAllocExt = 0; + pEncInfo->ppuAllocExt = 0; + pEncInfo->secAxiInfo.u.wave4.useBitEnable = 0; + pEncInfo->secAxiInfo.u.wave4.useIpEnable = 0; + pEncInfo->secAxiInfo.u.wave4.useLfRowEnable = 0; + pEncInfo->rotationEnable = 0; + pEncInfo->mirrorEnable = 0; + pEncInfo->mirrorDirection = MIRDIR_NONE; + pEncInfo->rotationAngle = 0; + pEncInfo->initialInfoObtained = 0; + pEncInfo->ringBufferEnable = param->ringBufferEnable; + pEncInfo->sliceIntEnable = 0; + + return ret; +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common.h new file mode 100644 index 0000000000..008728ebd7 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common.h @@ -0,0 +1,124 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#ifndef __COMMON_FUNCTION_H__ +#define __COMMON_FUNCTION_H__ + +#include "vpuapi.h" +#include "product.h" + +#define VPU_HANDLE_TO_DECINFO(_handle) \ + (&(((CodecInst *)_handle)->CodecInfo->decInfo)) +#define VPU_HANDLE_TO_ENCINFO(_handle) \ + (&(((CodecInst *)_handle)->CodecInfo->encInfo)) + +#define CODA7Q_MVCOL_BUF_SIZE(_w, _h) \ + ((((VPU_ALIGN32(_w) * VPU_ALIGN32(_h) * 3) >> 1) + 4) / 5) +#define CODA7Q_FBC_LUMA_TABLE_SIZE(_w, _h) \ + ((((_h + 15) >> 4) * ((_w + 255) >> 8)) << 7) +#define CODA7Q_FBC_CHROMA_TABLE_SIZE(_w, _h) \ + ((((_h + 15) >> 4) * (((_w >> 1) + 255) >> 8)) << 7) + +#define WAVE4_SUBSAMPLED_ONE_SIZE(_w, _h) \ + ((((_w >> 2) + 15) & ~15) * (((_h >> 2) + 7) & ~7)) +#define WAVE5_SUBSAMPLED_ONE_SIZE(_w, _h) \ + ((((_w >> 2) + 15) & ~15) * (((_h >> 2) + 7) & ~7)) + +#define BSOPTION_ENABLE_EXPLICIT_END (1 << 0) + +#define W4_WTL_RIGHT_JUSTIFIED 0 +#define W4_WTL_LEFT_JUSTIFIED 1 +#define W4_WTL_PIXEL_8BIT 0 +#define W4_WTL_PIXEL_16BIT 1 +#define W4_WTL_PIXEL_32BIT 2 + +typedef struct CodecInstHeader { + Int32 inUse; + Int32 coreIdx; + Int32 productId; + Int32 instIndex; + Int32 codecMode; + Int32 codecModeAux; +#ifdef ENABLE_CNM_DEBUG_MSG + Int32 loggingEnable; +#endif + Uint32 isDecoder; +} CodecInstHeader; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern Int32 WaveVpuGetProductId(Uint32 coreIdx); + +extern RetCode Wave4VpuGetVersion(Uint32 coreIdx, Uint32 *versionInfo, + Uint32 *revision); +extern RetCode Wave4VpuInit(Uint32 coreIdx, void *firmware, Uint32 size); + +extern RetCode Wave4VpuReInit(Uint32 coreIdx, void *firmware, Uint32 size); + +extern RetCode Wave4VpuDeinit(Uint32 coreIdx); + +extern Uint32 Wave4VpuIsInit(Uint32 coreIdx); + +extern Int32 Wave4VpuIsBusy(Uint32 coreIdx); + +extern Int32 Wave4VpuWaitInterrupt(CodecInst *handle, Int32 timeout); + +#if 0 +extern Int32 Wave4VpuGetFd(CodecInst *handle); +#endif + +extern RetCode Wave4VpuClearInterrupt(Uint32 coreIdx, Uint32 flags); + +extern RetCode Wave4VpuReset(Uint32 coreIdx, SWResetMode resetMode); + +extern RetCode Wave4VpuSleepWake(Uint32 coreIdx, int iSleepWake, Uint32 size); + +extern RetCode Wave4VpuSleepWake_EX(Uint32 coreIdx, int iSleepWake, + Uint32 size); + +extern RetCode Wave4VpuBuildUpDecParam(CodecInst *instance, + DecOpenParam *param); + +extern RetCode Wave4VpuDecFiniSeq(CodecInst *instance); + +extern RetCode Wave4VpuDecRegisterFramebuffer(CodecInst *instance, + FrameBuffer *fb, + TiledMapType mapType, + Uint32 count); + +extern RetCode Wave4VpuDecSetBitstreamFlag(CodecInst *instance, BOOL running, + BOOL eos, BOOL explicitEnd); + +extern RetCode Wave4VpuDecFlush(CodecInst *instance, + FramebufferIndex *framebufferIndexes, + Uint32 size); + +extern RetCode Wave4DecWriteProtect(CodecInst *instance); + +extern RetCode Wave4EncWriteProtect(CodecInst *instance); + +extern void Wave4BitIssueCommand(CodecInst *instance, Uint32 cmd); + +extern RetCode Wave4VpuEncFiniSeq(CodecInst *instance); + +extern RetCode Wave4VpuBuildUpEncParam(CodecInst *pCodec, EncOpenParam *param); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __COMMON_FUNCTION_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common_regdefine.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common_regdefine.h new file mode 100644 index 0000000000..7bde00d9d8 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common_regdefine.h @@ -0,0 +1,516 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#ifndef __COMMON_REGISTER_DEFINE_H__ +#define __COMMON_REGISTER_DEFINE_H__ + +#define W4_REG_BASE 0x00000000 +#define W4_CMD_REG_BASE 0x00000100 +#define W4_CMD_REG_END 0x00000200 + +/* + * Common + */ +/* Power On Configuration + * PO_DEBUG_MODE [0] 1 - Power On with debug mode + * USE_PO_CONF [3] 1 - Use Power-On-Configuration + */ +#define W4_PO_CONF (W4_REG_BASE + 0x0000) +#define W4_VCPU_CUR_PC (W4_REG_BASE + 0x0004) +#define W4_VPU_PDBG_CTRL (W4_REG_BASE + 0x0010) // vCPU debugger ctrl register +#define W4_VPU_PDBG_IDX_REG \ + (W4_REG_BASE + 0x0014) // vCPU debugger index register +#define W4_VPU_PDBG_WDATA_REG \ + (W4_REG_BASE + 0x0018) // vCPU debugger write data register +#define W4_VPU_PDBG_RDATA_REG \ + (W4_REG_BASE + 0x001C) // vCPU debugger read data register +#define W4_VPU_FIO_CTRL_ADDR (W4_REG_BASE + 0x0020) +#define W4_VPU_FIO_DATA (W4_REG_BASE + 0x0024) +#define W4_VPU_VINT_REASON_USR (W4_REG_BASE + 0x0030) +#define W4_VPU_VINT_REASON_CLR (W4_REG_BASE + 0x0034) +#define W4_VPU_HOST_INT_REQ (W4_REG_BASE + 0x0038) +#define W4_VPU_VINT_CLEAR (W4_REG_BASE + 0x003C) +#define W4_VPU_HINT_CLEAR (W4_REG_BASE + 0x0040) +#define W4_VPU_VPU_INT_STS (W4_REG_BASE + 0x0044) +#define W4_VPU_VINT_ENABLE (W4_REG_BASE + 0x0048) +/* INTERRUPT + */ +enum { + W4_INT_INIT_VPU = 0, + W4_INT_DEC_PIC_HDR = 1, + W4_INT_SET_PARAM = 1, + W4_INT_ENC_INIT_SEQ = 1, + W4_INT_FINI_SEQ = 2, + W4_INT_DEC_PIC = 3, + W4_INT_ENC_PIC = 3, + W4_INT_SET_FRAMEBUF = 4, + W4_INT_FLUSH_DEC = 5, + W4_INT_ENC_SLICE_INT = 7, + W4_INT_GET_FW_VERSION = 8, + W4_INT_QUERY_DEC = 9, + W4_INT_SLEEP_VPU = 10, + W4_INT_WAKEUP_VPU = 11, + W4_INT_CHANGE_INT = 12, + W4_INT_CREATE_INSTANCE = 14, + W4_INT_BSBUF_EMPTY = 15, /*!<< Bitstream buffer empty[dec]/full[enc] */ +}; + +typedef enum { + INIT_VPU = 0x0001, + DEC_PIC_HDR = 0x0002, /* INIT_SEQ or SLICE HEADER */ + SET_PARAM = 0x0002, + FINI_SEQ = 0x0004, + DEC_PIC = 0x0008, + ENC_PIC = 0x0008, + SET_FRAMEBUF = 0x0010, + FLUSH_DECODER = 0x0020, + GET_FW_VERSION = 0x0100, + QUERY_DECODER = 0x0200, + SLEEP_VPU = 0x0400, + WAKEUP_VPU = 0x0800, + CREATE_INSTANCE = 0x4000, + RESET_VPU = 0x10000, + MAX_VPU_COMD = 0x10000, +} VPU_COMMAND; + +#define W4_VPU_VINT_REASON (W4_REG_BASE + 0x004C) +/* RESET_REQ + * CCLK [7:0] - for each vCORE + * BCLK [15:8] - for each vCORE + * ACLK [23:16] - for each vCORE + * ACLK [24] - for vCPU + * VCLK [25] - + * MCLK [26] - Multi-media AXI + */ +#define W4_VPU_RESET_REQ (W4_REG_BASE + 0x0050) +#define W4_RST_BLOCK_CCLK(_core) (1 << _core) +#define W4_RST_BLOCK_CCLK_ALL (0xff) +#define W4_RST_BLOCK_BCLK(_core) (0x100 << _core) +#define W4_RST_BLOCK_BCLK_ALL (0xff00) +#define W4_RST_BLOCK_ACLK(_core) (0x10000 << _core) +#define W4_RST_BLOCK_ACLK_ALL (0xff0000) +#define W4_RST_BLOCK_VCPU (0x1000000) +#define W4_RST_BLOCK_VCLK (0x2000000) +#define W4_RST_BLOCK_MCLK (0x4000000) +#define W4_RST_BLOCK_ALL (0xfffffff) +#define W4_VPU_RESET_STATUS (W4_REG_BASE + 0x0054) +enum { + RESET_VCE = 0x01, + RESET_BPU = 0x02, + RESET_MAXI = 0x04, + RESET_VCPU = 0x08, + RESET_PAXI = 0x10, + RESET_ALL = 0x1f, +}; + +#define W4_VCPU_RESTART (W4_REG_BASE + 0x0058) +#define W4_VPU_CLK_MASK (W4_REG_BASE + 0x005C) +/* REMAP_CTRL + * PAGE SIZE: [8:0] 0x001 - 4K + * 0x002 - 8K + * 0x004 - 16K + * ... + * 0x100 - 1M + * REGION ATTR1 [10] 0 - Normal + * 1 - Make Bus error for the region + * REGION ATTR2 [11] 0 - Normal + * 1 - Bypass region + * REMAP INDEX [15:12] - 0 ~ 3 , 0 - Code, 1-Stack + * ENDIAN [19:16] - See EndianMode in vdi.h + * AXI-ID [23:20] - Upper AXI-ID + * BUS_ERROR [29] 0 - bypass + * 1 - Make BUS_ERROR for unmapped region + * BYPASS_ALL [30] 1 - Bypass all + * ENABLE [31] 1 - Update control register[30:16] + */ +enum { + W4_REMAP_CODE_INDEX = 0, +}; +#define W4_VPU_REMAP_CTRL (W4_REG_BASE + 0x0060) +#define W4_VPU_REMAP_VADDR (W4_REG_BASE + 0x0064) +#define W4_VPU_REMAP_PADDR (W4_REG_BASE + 0x0068) +#define W4_VPU_REMAP_CORE_START (W4_REG_BASE + 0x006C) +#define W4_VPU_BUSY_STATUS (W4_REG_BASE + 0x0070) +#define W4_VPU_HALT_STATUS (W4_REG_BASE + 0x0074) +#define W4_CMD_VCPU_DDR_CH_SELECT (W4_REG_BASE + 0x00F8) + +/************************************************************************/ +/* Decoder Common */ +/************************************************************************/ +#define W4_COMMAND (W4_REG_BASE + 0x0100) +#define W4_CORE_INDEX (W4_REG_BASE + 0x0104) +/* INST_INDEX [15:0] : 0 - HEVC + * [31:16] : Instance index + */ +#define W4_INST_INDEX (W4_REG_BASE + 0x0108) +/* COMMAND Description + * ------------------------------------------------------------------ + * DEC_PIC 0x100 Reset + */ +#define DEC_PIC_SEQ_INIT (0x1) +#define DEC_PIC_OPT_DISCARD_PICTURE (0x100) +#define DEC_PIC_OPT_EMPTY_INTR_INTERVAL (0x10000) +#define W4_COMMAND_OPTION (W4_REG_BASE + 0x010C) +#define W4_RET_SUCCESS (W4_REG_BASE + 0x0110) +/* + * See WAVE4_ERRORS + */ +#define W4_RET_FAIL_REASON (W4_REG_BASE + 0x0114) +#define W4_FRAME_CYCLE (W4_REG_BASE + 0x01d4) + +/************************************************************************/ +/* DECODER - INIT_VPU */ +/************************************************************************/ +/* Note: W4_INIT_CODE_BASE_ADDR should be aligned to 4KB */ +#define W4_ADDR_CODE_BASE (W4_REG_BASE + 0x0118) +#define W4_CODE_SIZE (W4_REG_BASE + 0x011C) +#define W4_CODE_PARAM (W4_REG_BASE + 0x0120) +#define W4_HW_OPTION (W4_REG_BASE + 0x0124) +/* Note: W4_INIT_STACK_BASE_ADDR should be aligned to 4KB */ +#define W4_ADDR_STACK_BASE (W4_REG_BASE + 0x012C) +#define W4_STACK_SIZE (W4_REG_BASE + 0x0130) +#define W4_TIMEOUT_CNT (W4_REG_BASE + 0x0134) + +/************************************************************************/ +/* DECODER - SET_FRAMEBUF */ +/************************************************************************/ +/* SFB_OPTION [25:20] fbc mode + * [19:16] endian + * [4] Done + * [3:0] 0: SET_FRAMEBUFFER(upto 8 framebuffers at once) + */ +#define W4_SFB_OPTION (W4_REG_BASE + 0x010C) +/* COMMON_PIC_INFO [29] NV21_ENABLE for linear framebuffer + * [28] BWB_ENABLE_FLAG + * [27:24] AXI_ID + * [23] Reserved + * [22] 0: Right justified, 1: Left justified + * [21:20] MapType 0: 8bit, 1: 16bit, 2: 3 pixels in 32bit + * [19:17] Color format + * [16] Cb/Cr interleaved + * [15:0] stride + */ + +#define W4_COMMON_PIC_INFO (W4_REG_BASE + 0x0120) +/* PIC_SIZE [31:16] picture width + * [15:0] picture height + */ +#define W4_PIC_SIZE (W4_REG_BASE + 0x0124) +/* SET_FB_NUM [12:8] FB_NUM_START + * [4:0] FB_NUM_END + * [31:0] TARGET_FB_FLAG + */ +#define W4_SET_FB_NUM (W4_REG_BASE + 0x0128) // ADD/REMOVE NUM + +#define C7_SET_FRAME_SLICE_BB_START (W4_REG_BASE + 0x0150) +#define C7_SET_FRAME_SLICE_BB_SIZE (W4_REG_BASE + 0x0154) + +#define W4_ADDR_LUMA_BASE0 (W4_REG_BASE + 0x0160) +#define W4_ADDR_CB_BASE0 (W4_REG_BASE + 0x0164) +#define W4_ADDR_CR_BASE0 (W4_REG_BASE + 0x0168) +#define W4_ADDR_FBC_Y_OFFSET0 \ + (W4_REG_BASE + 0x0168) // Compression offset table for Luma +#define W4_ADDR_FBC_C_OFFSET0 \ + (W4_REG_BASE + 0x016C) // Compression offset table for Chroma +#define W4_ADDR_LUMA_BASE1 (W4_REG_BASE + 0x0170) +#define W4_ADDR_CB_ADDR1 (W4_REG_BASE + 0x0174) +#define W4_ADDR_CR_ADDR1 (W4_REG_BASE + 0x0178) +#define W4_ADDR_FBC_Y_OFFSET1 \ + (W4_REG_BASE + 0x0178) // Compression offset table for Luma +#define W4_ADDR_FBC_C_OFFSET1 \ + (W4_REG_BASE + 0x017C) // Compression offset table for Chroma +#define W4_ADDR_LUMA_BASE2 (W4_REG_BASE + 0x0180) +#define W4_ADDR_CB_ADDR2 (W4_REG_BASE + 0x0184) +#define W4_ADDR_CR_ADDR2 (W4_REG_BASE + 0x0188) +#define W4_ADDR_FBC_Y_OFFSET2 \ + (W4_REG_BASE + 0x0188) // Compression offset table for Luma +#define W4_ADDR_FBC_C_OFFSET2 \ + (W4_REG_BASE + 0x018C) // Compression offset table for Chroma +#define W4_ADDR_LUMA_BASE3 (W4_REG_BASE + 0x0190) +#define W4_ADDR_CB_ADDR3 (W4_REG_BASE + 0x0194) +#define W4_ADDR_CR_ADDR3 (W4_REG_BASE + 0x0198) +#define W4_ADDR_FBC_Y_OFFSET3 \ + (W4_REG_BASE + 0x0198) // Compression offset table for Luma +#define W4_ADDR_FBC_C_OFFSET3 \ + (W4_REG_BASE + 0x019C) // Compression offset table for Chroma +#define W4_ADDR_LUMA_BASE4 (W4_REG_BASE + 0x01A0) +#define W4_ADDR_CB_ADDR4 (W4_REG_BASE + 0x01A4) +#define W4_ADDR_CR_ADDR4 (W4_REG_BASE + 0x01A8) +#define W4_ADDR_FBC_Y_OFFSET4 \ + (W4_REG_BASE + 0x01A8) // Compression offset table for Luma +#define W4_ADDR_FBC_C_OFFSET4 \ + (W4_REG_BASE + 0x01AC) // Compression offset table for Chroma +#define W4_ADDR_LUMA_BASE5 (W4_REG_BASE + 0x01B0) +#define W4_ADDR_CB_ADDR5 (W4_REG_BASE + 0x01B4) +#define W4_ADDR_CR_ADDR5 (W4_REG_BASE + 0x01B8) +#define W4_ADDR_FBC_Y_OFFSET5 \ + (W4_REG_BASE + 0x01B8) // Compression offset table for Luma +#define W4_ADDR_FBC_C_OFFSET5 \ + (W4_REG_BASE + 0x01BC) // Compression offset table for Chroma +#define W4_ADDR_LUMA_BASE6 (W4_REG_BASE + 0x01C0) +#define W4_ADDR_CB_ADDR6 (W4_REG_BASE + 0x01C4) +#define W4_ADDR_CR_ADDR6 (W4_REG_BASE + 0x01C8) +#define W4_ADDR_FBC_Y_OFFSET6 \ + (W4_REG_BASE + 0x01C8) // Compression offset table for Luma +#define W4_ADDR_FBC_C_OFFSET6 \ + (W4_REG_BASE + 0x01CC) // Compression offset table for Chroma +#define W4_ADDR_LUMA_BASE7 (W4_REG_BASE + 0x01D0) +#define W4_ADDR_CB_ADDR7 (W4_REG_BASE + 0x01D4) +#define W4_ADDR_CR_ADDR7 (W4_REG_BASE + 0x01D8) +#define W4_ADDR_FBC_Y_OFFSET7 \ + (W4_REG_BASE + 0x01D8) // Compression offset table for Luma +#define W4_ADDR_FBC_C_OFFSET7 \ + (W4_REG_BASE + 0x01DC) // Compression offset table for Chroma +#define W4_ADDR_MV_COL0 (W4_REG_BASE + 0x01E0) +#define W4_ADDR_MV_COL1 (W4_REG_BASE + 0x01E4) +#define W4_ADDR_MV_COL2 (W4_REG_BASE + 0x01E8) +#define W4_ADDR_MV_COL3 (W4_REG_BASE + 0x01EC) +#define W4_ADDR_MV_COL4 (W4_REG_BASE + 0x01F0) +#define W4_ADDR_MV_COL5 (W4_REG_BASE + 0x01F4) +#define W4_ADDR_MV_COL6 (W4_REG_BASE + 0x01F8) +#define W4_ADDR_MV_COL7 (W4_REG_BASE + 0x01FC) + +/************************************************************************/ +/* DECODER - FLUSH_DECODER */ +/************************************************************************/ +/* W4_FLUSH_DECODER_OPTION[0] 0 - flush DPB + */ +#define FLUSH_DPB 0 +#define FLUSH_CPB 1 +#define W4_FLUSH_DECODER_OPTION (W4_REG_BASE + 0x010C) +#define W4_RET_DEC_DISPLAY_INDEX_0 (W4_REG_BASE + 0x0198) +#define W4_RET_DEC_DISPLAY_INDEX_1 (W4_REG_BASE + 0x019C) +#define W4_RET_DEC_DISPLAY_INDEX_2 (W4_REG_BASE + 0x01A0) +#define W4_RET_DEC_DISPLAY_INDEX_3 (W4_REG_BASE + 0x01A4) +#define W4_RET_DEC_DISPLAY_INDEX_4 (W4_REG_BASE + 0x01A8) +#define W4_RET_DEC_DISPLAY_INDEX_5 (W4_REG_BASE + 0x01AC) +#define W4_RET_DEC_DISPLAY_INDEX_6 (W4_REG_BASE + 0x01B0) +#define W4_RET_DEC_DISPLAY_INDEX_7 (W4_REG_BASE + 0x01B4) +#define W4_RET_DEC_DISPLAY_INDEX_8 (W4_REG_BASE + 0x01B8) +#define W4_RET_DEC_DISPLAY_INDEX_9 (W4_REG_BASE + 0x01BC) +#define W4_RET_DEC_DISPLAY_INDEX_10 (W4_REG_BASE + 0x01C0) +#define W4_RET_DEC_DISPLAY_INDEX_11 (W4_REG_BASE + 0x01C4) +#define W4_RET_DEC_DISPLAY_INDEX_12 (W4_REG_BASE + 0x01C8) +#define W4_RET_DEC_DISPLAY_INDEX_13 (W4_REG_BASE + 0x01CC) +#define W4_RET_DEC_DISPLAY_INDEX_14 (W4_REG_BASE + 0x01D0) +#define W4_RET_DEC_DISPLAY_INDEX_15 (W4_REG_BASE + 0x01D4) +#define W4_RET_DEC_DISPLAY_SIZE (W4_REG_BASE + 0x01D8) + +/************************************************************************/ +/* DECODER - DEC_PIC_HDR/DEC_PIC */ +/************************************************************************/ +#define W4_BS_START_ADDR (W4_REG_BASE + 0x0120) +#define W4_BS_SIZE (W4_REG_BASE + 0x0124) +/* BS_PARAM [9] Ring-buffer enable + * [3:0] endianess + */ +#define BSPARAM_ENABLE_RINGBUFFER (1 << 9) +#define BSPARAM_ENABLE_NALPUMPING (1 << 8) +#define BSPARAM_EMODE_SEND_IMM (0 << 4) +#define BSPARAM_EMODE_CONCEAL (2 << 4) +#define W4_BS_PARAM (W4_REG_BASE + 0x0128) +/* BS_OPTION [0] : 1 - explict_end + * [1] : 1 - stream end flag + */ +#define W4_BS_OPTION (W4_REG_BASE + 0x012C) +/* Bit Index */ + +#define W4_BS_RD_PTR (W4_REG_BASE + 0x0130) +#define W4_BS_WR_PTR (W4_REG_BASE + 0x0134) +#define W4_ADDR_WORK_BASE (W4_REG_BASE + 0x0138) +#define W4_WORK_SIZE (W4_REG_BASE + 0x013C) +/* WORK_PARAM [3:0] Endianess + */ +#define W4_WORK_PARAM (W4_REG_BASE + 0x0140) +#define W4_ADDR_TEMP_BASE (W4_REG_BASE + 0x0144) +#define W4_TEMP_SIZE (W4_REG_BASE + 0x0148) +/* TEMP_PARAM [3:0] Endianess + */ +#define W4_TEMP_PARAM (W4_REG_BASE + 0x014C) + +#define W4_ADDR_SEC_AXI (W4_REG_BASE + 0x0150) +#define W4_SEC_AXI_SIZE (W4_REG_BASE + 0x0154) +#define W4_USE_SEC_AXI (W4_REG_BASE + 0x0158) +/************************************************************************/ +/* DECODER - DEC_PIC_HDR/DEC_PIC */ +/************************************************************************/ +#define W4_CMD_DEC_ADDR_REPORT_BASE (W4_REG_BASE + 0x015C) +#define W4_CMD_DEC_REPORT_SIZE (W4_REG_BASE + 0x0160) +/* USER_PARAM [3:0] Endianess + */ +#define W4_CMD_DEC_REPORT_PARAM (W4_REG_BASE + 0x0164) +#define W4_CMD_DEC_ADDR_USER_BASE (W4_REG_BASE + 0x0168) +#define W4_CMD_DEC_USER_SIZE (W4_REG_BASE + 0x016C) +#define W4_CMD_DEC_USER_PARAM (W4_REG_BASE + 0x0170) + +#define W4_RET_DEC_DISP_FLAG (W4_REG_BASE + 0x0190) +#define W4_CMD_DEC_DISP_FLAG (W4_REG_BASE + 0x0190) +/************************************************************************/ +/* DECODER - GET_FW_VERSION */ +/************************************************************************/ +#define W4_RET_FW_VERSION (W4_REG_BASE + 0x0118) +#define W4_RET_PRODUCT_NAME (W4_REG_BASE + 0x011C) +#define W4_RET_PRODUCT_VERSION (W4_REG_BASE + 0x0120) +#define W4_RET_STD_DEF0 (W4_REG_BASE + 0x0124) +#define W4_RET_STD_DEF1 (W4_REG_BASE + 0x0128) +#define W4_RET_CONF_FEATURE (W4_REG_BASE + 0x012C) +#define W4_RET_CONFIG_DATE (W4_REG_BASE + 0x0130) +#define W4_RET_CONFIG_REVISION (W4_REG_BASE + 0x0134) +#define W4_RET_CONFIG_TYPE (W4_REG_BASE + 0x0138) + +#define W4_RET_CONF_VCORE0 (W4_REG_BASE + 0x0150) + +/************************************************************************/ +/* SLEEP_VPU */ +/************************************************************************/ +#define W4_RET_CUR_SP (W4_REG_BASE + 0x0124) + +/************************************************************************/ +/* WAKEUP_VPU */ +/************************************************************************/ +#define W4_SET_CUR_SP (W4_REG_BASE + 0x0120) + +/************************************************************************/ +/* PRODUCT INFORMATION */ +/************************************************************************/ +#define W4_PRODUCT_NAME (W4_REG_BASE + 0x1040) +#define W4_PRODUCT_NUMBER (W4_REG_BASE + 0x1044) + +/************************************************************************/ +/* GDI register for Debugging */ +/************************************************************************/ +#define W4_GDI_BASE 0x8800 +#define W4_GDI_CORE1_BASE 0x9800 + +#define W4_GDI_PRI_RD_PRIO_L (W4_GDI_BASE + 0x000) +#define W4_GDI_PRI_RD_PRIO_H (W4_GDI_BASE + 0x004) +#define W4_GDI_PRI_WR_PRIO_L (W4_GDI_BASE + 0x008) +#define W4_GDI_PRI_WR_PRIO_H (W4_GDI_BASE + 0x00c) +#define W4_GDI_PRI_RD_LOCK_CNT (W4_GDI_BASE + 0x010) +#define W4_GDI_PRI_WR_LOCK_CNT (W4_GDI_BASE + 0x014) +#define W4_GDI_SEC_RD_PRIO_L (W4_GDI_BASE + 0x018) +#define W4_GDI_SEC_RD_PRIO_H (W4_GDI_BASE + 0x01c) +#define W4_GDI_SEC_WR_PRIO_L (W4_GDI_BASE + 0x020) +#define W4_GDI_SEC_WR_PRIO_H (W4_GDI_BASE + 0x024) +#define W4_GDI_SEC_RD_LOCK_CNT (W4_GDI_BASE + 0x028) +#define W4_GDI_SEC_WR_LOCK_CNT (W4_GDI_BASE + 0x02c) +#define W4_GDI_SEC_CLIENT_EN (W4_GDI_BASE + 0x030) +#define W4_GDI_CONTROL (W4_GDI_BASE + 0x034) +#define W4_GDI_PIC_INIT_HOST (W4_GDI_BASE + 0x038) +#define W4_GDI_HW_VERINFO (W4_GDI_BASE + 0x050) +#define W4_GDI_PINFO_REQ (W4_GDI_BASE + 0x060) +#define W4_GDI_PINFO_ACK (W4_GDI_BASE + 0x064) +#define W4_GDI_PINFO_ADDR (W4_GDI_BASE + 0x068) +#define W4_GDI_PINFO_DATA (W4_GDI_BASE + 0x06c) +#define W4_GDI_BWB_ENABLE (W4_GDI_BASE + 0x070) +#define W4_GDI_BWB_SIZE (W4_GDI_BASE + 0x074) +#define W4_GDI_BWB_STD_STRUCT (W4_GDI_BASE + 0x078) +#define W4_GDI_BWB_STATUS (W4_GDI_BASE + 0x07c) +#define W4_GDI_STATUS (W4_GDI_BASE + 0x080) +#define W4_GDI_DEBUG_0 (W4_GDI_BASE + 0x084) +#define W4_GDI_DEBUG_1 (W4_GDI_BASE + 0x088) +#define W4_GDI_DEBUG_2 (W4_GDI_BASE + 0x08c) +#define W4_GDI_DEBUG_3 (W4_GDI_BASE + 0x090) +#define W4_GDI_DEBUG_PROBE_ADDR (W4_GDI_BASE + 0x094) +#define W4_GDI_DEBUG_PROBE_DATA (W4_GDI_BASE + 0x098) + +// write protect +#define W4_GDI_WPROT_ERR_CLR (W4_GDI_BASE + 0x0A0) +#define W4_GDI_WPROT_ERR_RSN (W4_GDI_BASE + 0x0A4) +#define W4_GDI_WPROT_ERR_ADR (W4_GDI_BASE + 0x0A8) +#define W4_GDI_WPROT_RGN_EN (W4_GDI_BASE + 0x0AC) +#define W4_GDI_WPROT_RGN0_STA (W4_GDI_BASE + 0x0B0) +#define W4_GDI_WPROT_RGN0_END (W4_GDI_BASE + 0x0B4) +#define W4_GDI_WPROT_RGN1_STA (W4_GDI_BASE + 0x0B8) +#define W4_GDI_WPROT_RGN1_END (W4_GDI_BASE + 0x0BC) +#define W4_GDI_WPROT_RGN2_STA (W4_GDI_BASE + 0x0C0) +#define W4_GDI_WPROT_RGN2_END (W4_GDI_BASE + 0x0C4) +#define W4_GDI_WPROT_RGN3_STA (W4_GDI_BASE + 0x0C8) +#define W4_GDI_WPROT_RGN3_END (W4_GDI_BASE + 0x0CC) +#define W4_GDI_WPROT_RGN4_STA (W4_GDI_BASE + 0x0D0) +#define W4_GDI_WPROT_RGN4_END (W4_GDI_BASE + 0x0D4) +#define W4_GDI_WPROT_RGN5_STA (W4_GDI_BASE + 0x0D8) +#define W4_GDI_WPROT_RGN5_END (W4_GDI_BASE + 0x0DC) +#define W4_GDI_VCORE0_BUS_CTRL (W4_GDI_BASE + 0x0F0) +#define W4_GDI_VCORE0_BUS_STATUS (W4_GDI_BASE + 0x0F4) +#define W4_GDI_VCORE1_BUS_CTRL (W4_GDI_CORE1_BASE + 0x0F0) +#define W4_GDI_VCORE1_BUS_STATUS (W4_GDI_CORE1_BASE + 0x0F4) + +#define W4_RET_GDI_WPROT_ERR_RSN (W4_REG_BASE + 0x0118) +#define W4_RET_GDI_WPROT_ERR_ADR (W4_REG_BASE + 0x011C) +#define W4_RET_GDI_SIZE_ERR_FLAG (W4_REG_BASE + 0x0120) + +#define W4_GDI_SIZE_ERR_FLAG (W4_GDI_BASE + 0x0e0) +#define W4_GDI_ADR_RQ_SIZE_ERR_PRI0 (W4_GDI_BASE + 0x100) +#define W4_GDI_ADR_RQ_SIZE_ERR_PRI1 (W4_GDI_BASE + 0x104) +#define W4_GDI_ADR_RQ_SIZE_ERR_PRI2 (W4_GDI_BASE + 0x108) +#define W4_GDI_ADR_WQ_SIZE_ERR_PRI0 (W4_GDI_BASE + 0x10c) +#define W4_GDI_ADR_WQ_SIZE_ERR_PRI1 (W4_GDI_BASE + 0x110) +#define W4_GDI_ADR_WQ_SIZE_ERR_PRI2 (W4_GDI_BASE + 0x114) + +#define W4_GDI_ADR_RQ_SIZE_ERR_SEC0 (W4_GDI_BASE + 0x118) +#define W4_GDI_ADR_RQ_SIZE_ERR_SEC1 (W4_GDI_BASE + 0x11c) +#define W4_GDI_ADR_RQ_SIZE_ERR_SEC2 (W4_GDI_BASE + 0x120) +#define W4_GDI_ADR_WQ_SIZE_ERR_SEC0 (W4_GDI_BASE + 0x124) +#define W4_GDI_ADR_WQ_SIZE_ERR_SEC1 (W4_GDI_BASE + 0x128) +#define W4_GDI_ADR_WQ_SIZE_ERR_SEC2 (W4_GDI_BASE + 0x12c) + +#define W4_GDI_ADR_RQ_SIZE_ERR_PRI0_2D (W4_GDI_BASE + 0x130) +#define W4_GDI_ADR_RQ_SIZE_ERR_PRI1_2D (W4_GDI_BASE + 0x134) +#define W4_GDI_ADR_RQ_SIZE_ERR_PRI2_2D (W4_GDI_BASE + 0x138) +#define W4_GDI_ADR_WQ_SIZE_ERR_PRI0_2D (W4_GDI_BASE + 0x13c) +#define W4_GDI_ADR_WQ_SIZE_ERR_PRI1_2D (W4_GDI_BASE + 0x140) +#define W4_GDI_ADR_WQ_SIZE_ERR_PRI2_2D (W4_GDI_BASE + 0x144) + +#define W4_GDI_INFO_CONTROL (W4_GDI_BASE + 0x400) +#define W4_GDI_INFO_PIC_SIZE (W4_GDI_BASE + 0x404) +// W4_GDI 2.0 register +#define W4_GDI_INFO_BASE_Y_TOP (W4_GDI_BASE + 0x408) +#define W4_GDI_INFO_BASE_CB_TOP (W4_GDI_BASE + 0x40C) +#define W4_GDI_INFO_BASE_CR_TOP (W4_GDI_BASE + 0x410) +#define W4_GDI_INFO_BASE_Y_BOT (W4_GDI_BASE + 0x414) +#define W4_GDI_INFO_BASE_CB_BOT (W4_GDI_BASE + 0x418) +#define W4_GDI_INFO_BASE_CR_BOT (W4_GDI_BASE + 0x41C) +#define W4_GDI_XY2AXI_LUM_BIT00 (W4_GDI_BASE + 0x800) +#define W4_GDI_XY2AXI_LUM_BIT1F (W4_GDI_BASE + 0x87C) +#define W4_GDI_XY2AXI_CHR_BIT00 (W4_GDI_BASE + 0x880) +#define W4_GDI_XY2AXI_CHR_BIT1F (W4_GDI_BASE + 0x8FC) +#define W4_GDI_XY2AXI_CONFIG (W4_GDI_BASE + 0x900) + +// W4_GDI 1.0 register +#define W4_GDI_INFO_BASE_Y (W4_GDI_BASE + 0x408) +#define W4_GDI_INFO_BASE_CB (W4_GDI_BASE + 0x40C) +#define W4_GDI_INFO_BASE_CR (W4_GDI_BASE + 0x410) + +#define W4_GDI_XY2_CAS_0 (W4_GDI_BASE + 0x800) +#define W4_GDI_XY2_CAS_F (W4_GDI_BASE + 0x83C) + +#define W4_GDI_XY2_BA_0 (W4_GDI_BASE + 0x840) +#define W4_GDI_XY2_BA_1 (W4_GDI_BASE + 0x844) +#define W4_GDI_XY2_BA_2 (W4_GDI_BASE + 0x848) +#define W4_GDI_XY2_BA_3 (W4_GDI_BASE + 0x84C) + +#define W4_GDI_XY2_RAS_0 (W4_GDI_BASE + 0x850) +#define W4_GDI_XY2_RAS_F (W4_GDI_BASE + 0x88C) + +#define W4_GDI_XY2_RBC_CONFIG (W4_GDI_BASE + 0x890) +#define W4_GDI_RBC2_AXI_0 (W4_GDI_BASE + 0x8A0) +#define W4_GDI_RBC2_AXI_1F (W4_GDI_BASE + 0x91C) +#define W4_GDI_TILEDBUF_BASE (W4_GDI_BASE + 0x920) + +#define W4_FBC_STRIDE (W4_REG_BASE + 0x0154) + +#endif /* __COMMON_REGISTER_DEFINE_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common_vpuconfig.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common_vpuconfig.h new file mode 100644 index 0000000000..d40737d445 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/common/common_vpuconfig.h @@ -0,0 +1,51 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// This file should be modified by some customers according to their +//SOC configuration. +//--=========================================================================-- + +#ifndef __COMMON_VPU_CONFIGURATION_H__ +#define __COMMON_VPU_CONFIGURATION_H__ + +#include "vpuconfig.h" + +#define WAVE4_MAX_CODE_BUF_SIZE (256 * 1024) +#define WAVE5_MAX_CODE_BUF_SIZE (1024 * 1024) + +#define WAVE4DEC_WORKBUF_SIZE \ + (3 * 1024 * \ + 1024) /* 2K(system) + 463K(codec) + 1850K(prescan, \ + level 6.x) */ +#define WAVE412DEC_WORKBUF_SIZE \ + (5 * 1024 * \ + 1024) /* 2K(system) + 2M(codec) + 1850K(prescan, \ + level 6.x) */ +#define WAVE512DEC_WORKBUF_SIZE \ + (2 * 1024 * \ + 1024) /* This code will be removed till merging with \ + WAVE510 F/W */ +#define WAVE510DEC_WORKBUF_SIZE (512 * 1024) + +#define WAVE4ENC_WORKBUF_SIZE (128 * 1024) + +#define CODA7Q_VPU_GMC_PROCESS_METHOD 0 +#define CODA7Q_VPU_AVC_X264_SUPPORT 1 +//----- slice save buffer --------------------// +#define CODA7Q_SLICE_SAVE_SIZE \ + ((MAX_DEC_PIC_WIDTH * MAX_DEC_PIC_HEIGHT * 3) >> 2) // this buffer for +// ASO/FMO + +#define DEFAULT_TEMPBUF_SIZE (512 * 1024) +#define WAVE4_TEMPBUF_OFFSET (WAVE4_MAX_CODE_BUF_SIZE) //(codeSize) +#endif /* __COMMON_VPU_CONFIGURATION_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.c b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.c new file mode 100644 index 0000000000..6fb0313aba --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.c @@ -0,0 +1,2612 @@ +#include "product.h" +#include "wave/common/common.h" +#include "wave/common/common_vpuconfig.h" +#include "wave/common/common_regdefine.h" +#include "wave/wave4/wave4.h" +#include "vpuerror.h" +#include "wave/wave4/wave4_regdefine.h" +#include "coda9/coda9.h" +#include "cvi_enc_internal.h" + +// static RetCode CalcEncCropInfo(EncHevcParam* param, int rotMode, int +// srcWidth, int srcHeight); + +static Uint32 presetGopSize[] = { + 1, /* Custom GOP, Not used */ + 1, /* All Intra */ + 1, /* IPP Cyclic GOP size 1 */ + 1, /* IBB Cyclic GOP size 1 */ + 2, /* IBP Cyclic GOP size 2 */ + 4, /* IBBBP */ + 4, 4, 8, 0, 0, 0, 0, 0, 0, 0, 1, /* Bitmain preset1 */ + 1, /* Bitmain preset2 */ + 1, /* Bitmain preset3 */ + 2, /* Bitmain preset4 */ + 2 /* Bitmain preset5 */ +}; + +#define DUMP_REG 0 +#if DUMP_REG +static void cviDumpVpuReg(Int32 coreIdx); +#endif + +static RetCode cviCfgCropInfo(EncOpenParam *pOpenParam); +static void Wave4VpuEncCalcPicQp(EncParam *option); +static void printResult(EncInfo *pEncInfo, EncOutputInfo *result); + +static RetCode PrepareDecodingPicture(CodecInst *instance, Uint32 cmd) +{ + Int32 coreIdx; + Uint32 regVal = 0, bsParam, bsOption; + DecInfo *pDecInfo; + DecOpenParam *pOpenParam; + vpu_buffer_t vb; + + coreIdx = instance->coreIdx; + pDecInfo = VPU_HANDLE_TO_DECINFO(instance); + + pOpenParam = &pDecInfo->openParam; + + /* Set attributes of bitstream buffer controller */ + bsParam = bsOption = 0; + regVal = 0; + switch (pOpenParam->bitstreamMode) { + case BS_MODE_INTERRUPT: + bsParam = BSPARAM_ENABLE_RINGBUFFER; + if ((cmd == DEC_PIC_HDR) && (pDecInfo->seqInitEscape == TRUE)) + bsOption = BSOPTION_ENABLE_EXPLICIT_END; + break; + case BS_MODE_PIC_END: + bsOption = BSOPTION_ENABLE_EXPLICIT_END; + break; + default: + return RETCODE_INVALID_PARAM; + } + + regVal = vdi_convert_endian(coreIdx, pOpenParam->streamEndian); + /* NOTE: When endian mode is 0, SDMA reads MSB first */ + bsParam |= (~regVal & VDI_128BIT_ENDIAN_MASK); + + VpuWriteReg(coreIdx, W4_BS_PARAM, bsParam); + VpuWriteReg(coreIdx, W4_BS_START_ADDR, pDecInfo->streamBufStartAddr); + VpuWriteReg(coreIdx, W4_BS_SIZE, pDecInfo->streamBufSize); + VpuWriteReg(coreIdx, W4_BS_RD_PTR, pDecInfo->streamRdPtr); + VpuWriteReg(coreIdx, W4_BS_WR_PTR, pDecInfo->streamWrPtr); + + if (pDecInfo->streamEndflag == 1) + bsOption = 3; + + VpuWriteReg(coreIdx, W4_BS_OPTION, bsOption); + + /* Secondary AXI */ + vdi_get_sram_memory(coreIdx, &vb); + VpuWriteReg(coreIdx, W4_ADDR_SEC_AXI, vb.phys_addr); + VpuWriteReg(coreIdx, W4_SEC_AXI_SIZE, pDecInfo->secAxiInfo.bufSize); + regVal = (pDecInfo->secAxiInfo.u.wave4.useBitEnable << 0) | + (pDecInfo->secAxiInfo.u.wave4.useIpEnable << 9) | + (pDecInfo->secAxiInfo.u.wave4.useLfRowEnable << 15); + VpuWriteReg(coreIdx, W4_USE_SEC_AXI, regVal); + + /* Set up work-buffer */ + VpuWriteReg(coreIdx, W4_ADDR_WORK_BASE, pDecInfo->vbWork.phys_addr); + VpuWriteReg(coreIdx, W4_WORK_SIZE, pDecInfo->vbWork.size); + VpuWriteReg(coreIdx, W4_WORK_PARAM, 0); + + /* Set up temp-buffer */ + VpuWriteReg(coreIdx, W4_ADDR_TEMP_BASE, pDecInfo->vbTemp.phys_addr); + VpuWriteReg(coreIdx, W4_TEMP_SIZE, pDecInfo->vbTemp.size); + VpuWriteReg(coreIdx, W4_TEMP_PARAM, 0); + + /* Set attributes of User buffer */ + VpuWriteReg(coreIdx, W4_CMD_DEC_USER_MASK, pDecInfo->userDataEnable); + VpuWriteReg(coreIdx, W4_CMD_DEC_ADDR_USER_BASE, + pDecInfo->userDataBufAddr); + VpuWriteReg(coreIdx, W4_CMD_DEC_USER_SIZE, pDecInfo->userDataBufSize); + VpuWriteReg(coreIdx, W4_CMD_DEC_USER_PARAM, + VPU_USER_DATA_ENDIAN & VDI_128BIT_ENDIAN_MASK); + + if (cmd == DEC_PIC) { + /** Configure CU data report */ + VpuWriteReg(coreIdx, W4_CMD_DEC_ADDR_REPORT_BASE, + pDecInfo->cuDataBufAddr); + VpuWriteReg(coreIdx, W4_CMD_DEC_REPORT_SIZE, + pDecInfo->cuDataBufSize); + VpuWriteReg(coreIdx, W4_CMD_DEC_REPORT_PARAM, + (pDecInfo->cuDataEnable << 31 | + (VDI_128BIT_LE_WORD_BYTE_SWAP & + VDI_128BIT_ENDIAN_MASK))); + } + + VpuWriteReg(coreIdx, W4_CMD_DEC_SEVERITY_LEVEL, 0); + + return RETCODE_SUCCESS; +} + +static void GetSequenceInformation(CodecInst *instance, DecInitialInfo *info) +{ + DecInfo *pDecInfo = &instance->CodecInfo->decInfo; + Uint32 regVal; +#ifdef REDUNDENT_CODE + Uint32 profileCompatibilityFlag; +#endif + Uint32 left, right, top, bottom; + + info->rdPtr = VpuReadReg(instance->coreIdx, W4_BS_RD_PTR); + info->wrPtr = VpuReadReg(instance->coreIdx, W4_BS_WR_PTR); + + pDecInfo->streamRdPtr = vdi_remap_memory_address( + instance->coreIdx, + VpuReadReg(instance->coreIdx, pDecInfo->streamRdPtrRegAddr)); + + pDecInfo->frameDisplayFlag = VpuReadReg( + instance->coreIdx, pDecInfo->frameDisplayFlagRegAddr); + regVal = VpuReadReg(instance->coreIdx, W4_BS_OPTION); + pDecInfo->streamEndflag = (regVal & 0x02) ? TRUE : FALSE; + + regVal = VpuReadReg(instance->coreIdx, W4_RET_DEC_PIC_SIZE); + info->picWidth = ((regVal >> 16) & 0xffff); + info->picHeight = (regVal & 0xffff); + info->minFrameBufferCount = + VpuReadReg(instance->coreIdx, W4_RET_DEC_FRAMEBUF_NEEDED); + info->frameBufDelay = + VpuReadReg(instance->coreIdx, W4_RET_DEC_NUM_REORDER_DELAY); + + regVal = VpuReadReg(instance->coreIdx, W4_RET_DEC_CROP_LEFT_RIGHT); + left = (regVal >> 16) & 0xffff; + right = regVal & 0xffff; + regVal = VpuReadReg(instance->coreIdx, W4_RET_DEC_CROP_TOP_BOTTOM); + top = (regVal >> 16) & 0xffff; + bottom = regVal & 0xffff; + + info->picCropRect.left = left; + info->picCropRect.right = info->picWidth - right; + info->picCropRect.top = top; + info->picCropRect.bottom = info->picHeight - bottom; + + regVal = VpuReadReg(instance->coreIdx, W4_RET_DEC_SEQ_PARAM); +#ifdef REDUNDENT_CODE + profileCompatibilityFlag = (regVal >> 12) & 0xff; +#endif + info->profile = (regVal >> 24) & 0x1f; + info->level = regVal & 0xff; + info->tier = (regVal >> 29) & 0x01; + info->maxSubLayers = (regVal >> 21) & 0x07; + info->fRateNumerator = + VpuReadReg(instance->coreIdx, W4_RET_DEC_FRAME_RATE_NR); + info->fRateDenominator = + VpuReadReg(instance->coreIdx, W4_RET_DEC_FRAME_RATE_DR); + regVal = VpuReadReg(instance->coreIdx, W4_RET_DEC_COLOR_SAMPLE_INFO); + info->chromaFormatIDC = (regVal >> 8) & 0x0f; + info->lumaBitdepth = (regVal >> 0) & 0x0f; + info->chromaBitdepth = (regVal >> 4) & 0x0f; + info->aspectRateInfo = (regVal >> 16) & 0xff; + info->isExtSAR = (info->aspectRateInfo == 255 ? TRUE : FALSE); + if (info->isExtSAR == TRUE) { + info->aspectRateInfo = VpuReadReg( + instance->coreIdx, W4_RET_DEC_ASPECT_RATIO); /* [0:15] - + vertical size, + [16:31] - + horizontal size + */ + } + info->bitRate = VpuReadReg(instance->coreIdx, W4_RET_DEC_BIT_RATE); + +#ifdef REDUNDENT_CODE + if (instance->codecMode == C7_HEVC_DEC) { + /* Guessing Profile */ + if (info->profile == 0) { + if ((profileCompatibilityFlag & 0x06) == 0x06) + info->profile = 1; /* Main profile */ + else if ((profileCompatibilityFlag & 0x04) == 0x04) + info->profile = 2; /* Main10 profile */ + else if ((profileCompatibilityFlag & 0x08) == 0x08) + info->profile = 3; /* Main Still Picture profile + */ + else + info->profile = 1; /* For old version HM */ + } + } +#endif +} + +RetCode Wave4VpuDecInitSeq(CodecInst *instance) +{ + RetCode ret; + DecInfo *pDecInfo; + Uint32 cmdOption = INIT_SEQ_NORMAL; + vpu_buffer_t vb; + + if (instance == NULL) + return RETCODE_INVALID_PARAM; + + pDecInfo = VPU_HANDLE_TO_DECINFO(instance); + vdi_get_common_memory(instance->coreIdx, &vb); + pDecInfo->vbTemp.phys_addr = vb.phys_addr + WAVE4_TEMPBUF_OFFSET; + pDecInfo->vbTemp.virt_addr = vb.virt_addr + WAVE4_TEMPBUF_OFFSET; + pDecInfo->vbTemp.size = DEFAULT_TEMPBUF_SIZE; + if (pDecInfo->thumbnailMode) + cmdOption = INIT_SEQ_W_THUMBNAIL; + + ret = PrepareDecodingPicture(instance, DEC_PIC_HDR); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + VpuWriteReg(instance->coreIdx, W4_CMD_DEC_DISP_FLAG, 0); + VpuWriteReg(instance->coreIdx, W4_COMMAND_OPTION, + cmdOption); /* INIT_SEQ + */ + VpuWriteReg(instance->coreIdx, W4_CMD_DEC_FORCE_FB_LATENCY_PLUS1, 0); + Wave4BitIssueCommand(instance, DEC_PIC_HDR); + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuDecode(CodecInst *instance, DecParam *option) +{ + RetCode ret; + Uint32 modeOption = DEC_PIC_NORMAL; + Int32 forceLatency = -1; + DecInfo *pDecInfo = &instance->CodecInfo->decInfo; + + if (pDecInfo->thumbnailMode) { + modeOption = DEC_PIC_W_THUMBNAIL; + } else if (option->skipframeMode) { + switch (option->skipframeMode) { + case 1: + modeOption = SKIP_NON_IRAP; + forceLatency = 0; + break; + case 2: + modeOption = SKIP_NON_REF_PIC; + break; + case 3: + modeOption = SKIP_NON_RECOVERY; + break; + default: + // skip off + break; + } + } + if (pDecInfo->targetSubLayerId < + (pDecInfo->initialInfo.maxSubLayers - 1)) { + modeOption = SKIP_TEMPORAL_LAYER; + } + if (option->craAsBlaFlag == TRUE) { + modeOption |= (1 << 1); + } + + // set disable reorder + if (pDecInfo->reorderEnable == FALSE) { + forceLatency = 0; + } + // Bandwidth optimization + modeOption |= (pDecInfo->openParam.bwOptimization << 31); + + ret = PrepareDecodingPicture(instance, DEC_PIC); + if (ret != RETCODE_SUCCESS) { + return ret; + } + + VpuWriteReg(instance->coreIdx, W4_CMD_DEC_VCORE_LIMIT, 1); + VpuWriteReg(instance->coreIdx, W4_CMD_DEC_TEMPORAL_ID_PLUS1, + pDecInfo->targetSubLayerId + 1); + VpuWriteReg(instance->coreIdx, W4_CMD_SEQ_CHANGE_ENABLE_FLAG, + pDecInfo->seqChangeMask); + VpuWriteReg(instance->coreIdx, W4_CMD_DEC_FORCE_FB_LATENCY_PLUS1, + forceLatency + 1); + VpuWriteReg(instance->coreIdx, W4_COMMAND_OPTION, modeOption); + + instance->u64StartTime = cviGetCurrentTime(); + + Wave4BitIssueCommand(instance, DEC_PIC); + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuDecGetResult(CodecInst *instance, DecOutputInfo *result) +{ + Uint32 regVal; + Uint32 nalUnitType; + Uint32 index; + DecInfo *pDecInfo = VPU_HANDLE_TO_DECINFO(instance); + +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) + vdi_log(instance->coreIdx, DEC_PIC, 0); +#endif + + result->decOutputExtData.userDataSize = 0; + result->decOutputExtData.userDataNum = 0; + result->decOutputExtData.userDataHeader = + VpuReadReg(instance->coreIdx, W4_RET_DEC_USER_MASK); + if (result->decOutputExtData.userDataHeader != 0) { + regVal = result->decOutputExtData.userDataHeader; + for (index = 0; index < 32; index++) { + if (regVal & (1 << index)) { + result->decOutputExtData.userDataNum++; + } + } + result->decOutputExtData.userDataSize = + pDecInfo->userDataBufSize; + } + result->frameCycle = VpuReadReg(instance->coreIdx, W4_FRAME_CYCLE); + result->decodingSuccess = VpuReadReg(instance->coreIdx, W4_RET_SUCCESS); + result->refMissingFrameFlag = FALSE; + if (result->decodingSuccess == FALSE) { + result->errorReason = + VpuReadReg(instance->coreIdx, W4_RET_FAIL_REASON); + if (result->errorReason == WAVE4_SYSERR_ACCESS_VIOLATION_HW) { + return RETCODE_MEMORY_ACCESS_VIOLATION; + } else if (result->errorReason == WAVE4_CODEC_ERROR) { + result->errorReasonExt = VpuReadReg( + instance->coreIdx, W4_RET_DEC_ERR_INFO); + } + if (result->errorReasonExt == + WAVE4_ETCERR_MISSING_REFERENCE_PICTURE) { + result->refMissingFrameFlag = TRUE; + } + } else { + result->warnInfo = + VpuReadReg(instance->coreIdx, W4_RET_DEC_WARN_INFO); + } + + regVal = VpuReadReg(instance->coreIdx, W4_RET_DEC_PIC_TYPE); +#ifdef REDUNDENT_CODE + if (instance->codecMode == C7_VP9_DEC) { + if (regVal & 0x01) + result->picType = PIC_TYPE_I; + else if (regVal & 0x02) + result->picType = PIC_TYPE_P; + else + result->picType = PIC_TYPE_MAX; + } else +#endif + { + if (regVal & 0x04) + result->picType = PIC_TYPE_B; + else if (regVal & 0x02) + result->picType = PIC_TYPE_P; + else if (regVal & 0x01) + result->picType = PIC_TYPE_I; + else + result->picType = PIC_TYPE_MAX; + } + + nalUnitType = (regVal & 0x3f0) >> 4; + if ((nalUnitType == 19 || nalUnitType == 20) && + result->picType == PIC_TYPE_I) { + /* IDR_W_RADL, IDR_N_LP */ + result->picType = PIC_TYPE_IDR; + } + result->nalType = nalUnitType; + result->ctuSize = 16 << ((regVal >> 10) & 0x3); + if (pDecInfo->openParam.wtlEnable == TRUE) { + index = VpuReadReg(instance->coreIdx, W4_RET_DEC_DISPLAY_INDEX); + result->indexFrameDisplay = + (short)(index >> 16 & 0xffff); // linear + result->indexFrameDisplayForTiled = + (short)(index & 0xffff); // fbc + index = VpuReadReg(instance->coreIdx, W4_RET_DEC_DECODED_INDEX); + result->indexFrameDecoded = (short)(index >> 16 & 0xffff); + result->indexFrameDecodedForTiled = (short)(index & 0xffff); + } else { + index = VpuReadReg(instance->coreIdx, W4_RET_DEC_DISPLAY_INDEX); + result->indexFrameDisplay = (short)(index & 0xffff); + result->indexFrameDisplayForTiled = result->indexFrameDisplay; + index = VpuReadReg(instance->coreIdx, W4_RET_DEC_DECODED_INDEX); + result->indexFrameDecoded = (short)(index & 0xffff); + result->indexFrameDecodedForTiled = result->indexFrameDecoded; + } + +#ifdef REDUNDENT_CODE + if (instance->codecMode != C7_VP9_DEC) { + result->h265Info.decodedPOC = -1; + result->h265Info.displayPOC = -1; + if (result->indexFrameDecoded >= 0) + result->h265Info.decodedPOC = VpuReadReg( + instance->coreIdx, W4_RET_DEC_PIC_POC); + result->h265Info.temporalId = + VpuReadReg(instance->coreIdx, + W4_RET_TEMP_SUB_LAYER_INFO) & + 0xff; + } +#endif + + regVal = VpuReadReg(instance->coreIdx, W4_RET_DEC_SEQ_CHANGE_FLAG); + result->sequenceChanged = regVal & 0x7FFFFFFF; + + /* + * If current picture is the last of the current sequence and + * sequence-change flag is not 0, then the width and height of the + * current picture is set to the width and height of the current + * sequence. + */ + if (result->sequenceChanged == 0) { + regVal = VpuReadReg(instance->coreIdx, W4_RET_DEC_PIC_SIZE); + result->decPicWidth = regVal >> 16; + result->decPicHeight = regVal & 0xffff; + if (instance->codecMode == C7_VP9_DEC) { + result->indexInterFrameDecoded = VpuReadReg( + instance->coreIdx, + W4_RET_DEC_INTER_RES_CHANGE_REALLOCATED_DPB_IDX); + } + } else { + CVI_VC_FLOW("sequenceChanged = %d\n", result->sequenceChanged); + + if (result->indexFrameDecoded < 0) { + result->decPicWidth = 0; + result->decPicHeight = 0; + } else { + result->decPicWidth = pDecInfo->initialInfo.picWidth; + result->decPicHeight = pDecInfo->initialInfo.picHeight; + } +#ifdef REDUNDENT_CODE + if (instance->codecMode == C7_VP9_DEC) { + if (result->sequenceChanged & + SEQ_CHANGE_INTER_RES_CHANGE) { + regVal = VpuReadReg(instance->coreIdx, + W4_RET_DEC_PIC_SIZE); + result->decPicWidth = regVal >> 16; + result->decPicHeight = regVal & 0xffff; + result->indexInterFrameDecoded = VpuReadReg( + instance->coreIdx, + W4_RET_DEC_INTER_RES_CHANGE_REALLOCATED_DPB_IDX); + } + } +#endif + osal_memcpy((void *)&pDecInfo->newSeqInfo, + (void *)&pDecInfo->initialInfo, + sizeof(DecInitialInfo)); + GetSequenceInformation(instance, &pDecInfo->newSeqInfo); + } + + result->numOfErrMBs = + VpuReadReg(instance->coreIdx, W4_RET_DEC_ERR_CTB_NUM) >> 16; + result->numOfTotMBs = + VpuReadReg(instance->coreIdx, W4_RET_DEC_ERR_CTB_NUM) & 0xffff; + result->bytePosFrameStart = + VpuReadReg(instance->coreIdx, W4_RET_DEC_AU_START_POS); + result->bytePosFrameEnd = + VpuReadReg(instance->coreIdx, W4_RET_DEC_AU_END_POS); + pDecInfo->prevFrameEndPos = result->bytePosFrameEnd; + +#ifdef REDUNDENT_CODE + if (pDecInfo->openParam.bitstreamFormat == STD_VP9) { + /* One chunk has multiple frames. */ + result->chunkReuseRequired = (result->rdPtr < result->wrPtr); + } +#endif + + result->indexFramePrescan = + VpuReadReg(instance->coreIdx, W4_RET_DEC_PRESCAN_INDEX); + + regVal = VpuReadReg(instance->coreIdx, W4_RET_DEC_RECOVERY_POINT); + result->h265RpSei.recoveryPocCnt = regVal & 0xFFFF; // [15:0] + result->h265RpSei.exactMatchFlag = (regVal >> 16) & 0x01; // [16] + result->h265RpSei.brokenLinkFlag = (regVal >> 17) & 0x01; // [17] + result->h265RpSei.exist = (regVal >> 18) & 0x01; // [18] + if (result->h265RpSei.exist == 0) { + result->h265RpSei.recoveryPocCnt = 0; + result->h265RpSei.exactMatchFlag = 0; + result->h265RpSei.brokenLinkFlag = 0; + } + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuDecGetSeqInfo(CodecInst *pCodecInst, DecInitialInfo *info) +{ + DecInfo *pDecInfo = &pCodecInst->CodecInfo->decInfo; + Uint32 regVal; + Uint32 i; + +#ifdef ENABLE_CNM_DEBUG_MSG + if (pCodecInst->loggingEnable) + vdi_log(pCodecInst->coreIdx, DEC_PIC_HDR, 0); +#endif + + info->userDataSize = 0; + info->userDataNum = 0; + info->userDataHeader = + VpuReadReg(pCodecInst->coreIdx, W4_RET_DEC_USER_MASK); + if (info->userDataHeader != 0) { + regVal = info->userDataHeader; + for (i = 0; i < 32; i++) { + if (regVal & (1 << i)) { + info->userDataNum++; + } + } + info->userDataSize = pDecInfo->userDataBufSize; + } + +#if 0 // Comment out. Because, seqInitEscape feature is supported. + if (pDecInfo->openParam.bitstreamMode == BS_MODE_INTERRUPT && + pDecInfo->seqInitEscape) { + pDecInfo->seqInitEscape = 0; + /* NOTE: Not implemented yet */ + return RETCODE_NOT_SUPPORTED_FEATURE; + } +#endif + GetSequenceInformation(pCodecInst, info); + + info->warnInfo = 0; + regVal = VpuReadReg(pCodecInst->coreIdx, W4_RET_SUCCESS); + if (regVal == FALSE) { + info->seqInitErrReason = + VpuReadReg(pCodecInst->coreIdx, W4_RET_FAIL_REASON); + if (info->seqInitErrReason == WAVE4_SYSERR_WRITEPROTECTION) + return RETCODE_MEMORY_ACCESS_VIOLATION; + else if (info->seqInitErrReason == 1) { + info->seqInitErrReason = VpuReadReg( + pCodecInst->coreIdx, W4_RET_DEC_ERR_INFO); + } + return RETCODE_FAILURE; + } + + info->warnInfo = + VpuReadReg(pCodecInst->coreIdx, W4_RET_DEC_WARN_INFO); + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuEncRegisterFramebuffer(CodecInst *instance, FrameBuffer *fbArr, + TiledMapType mapType, Uint32 count) +{ + RetCode ret = RETCODE_SUCCESS; + EncInfo *pEncInfo = &instance->CodecInfo->encInfo; + Int32 q = 0, j = 0, i = 0, remain = 0, idx = 0, bufHeight = 0, + bufWidth = 0; + Int32 coreIdx = 0, startNo = 0, endNo = 0; + Uint32 regVal = 0, cbcrInterleave = 0, nv21 = 0, lumaStride = 0, + chromaStride = 0; + Uint32 endian = 0, yuvFormat = 0; + Uint32 addrY = 0, addrCb = 0, addrCr = 0; + Uint32 mvColSize = 0, fbcYTblSize = 0, fbcCTblSize = 0, + subSampledSize = 0; + Uint32 bpp = 1; /* byte per pixel */ + vpu_buffer_t vbBuffer; + Int32 stride = 0; + Uint32 axiID = 0; + EncOpenParam *pOpenParam = NULL; + pOpenParam = &pEncInfo->openParam; + + coreIdx = instance->coreIdx; + mvColSize = fbcYTblSize = fbcCTblSize = 0; + stride = pEncInfo->stride; + axiID = pOpenParam->virtAxiID; + + bufWidth = VPU_ALIGN8(pOpenParam->picWidth); + bufHeight = VPU_ALIGN8(pOpenParam->picHeight); + + if ((pEncInfo->rotationAngle != 0 || pEncInfo->mirrorDirection != 0) && + !(pEncInfo->rotationAngle == 180 && + pEncInfo->mirrorDirection == MIRDIR_HOR_VER)) { + bufWidth = VPU_ALIGN32(pOpenParam->picWidth); + bufHeight = VPU_ALIGN32(pOpenParam->picHeight); + } + + if (pEncInfo->rotationAngle == 90 || pEncInfo->rotationAngle == 270) { + bufWidth = VPU_ALIGN32(pOpenParam->picHeight); + bufHeight = VPU_ALIGN32(pOpenParam->picWidth); + } + + if (mapType == COMPRESSED_FRAME_MAP) { + char ionName[MAX_VPU_ION_BUFFER_NAME]; + cbcrInterleave = 0; + nv21 = 0; + + mvColSize = WAVE4_ENC_HEVC_MVCOL_BUF_SIZE(bufWidth, bufHeight); + mvColSize = VPU_ALIGN16(mvColSize); + vbBuffer.size = ((mvColSize * count + 4095) & ~4095) + + 4096; /* 4096 is a margin */ + vbBuffer.phys_addr = 0; + + CVI_VC_MEM("mvColSize = 0x%X\n", vbBuffer.size); + + sprintf(ionName, "VENC_%d_H265_mvCol", instance->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, &vbBuffer, 0, ionName) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + pEncInfo->vbMV = vbBuffer; + + fbcYTblSize = WAVE4_FBC_LUMA_TABLE_SIZE(bufWidth, bufHeight); + fbcYTblSize = VPU_ALIGN16(fbcYTblSize); + + fbcCTblSize = WAVE4_FBC_CHROMA_TABLE_SIZE(bufWidth, bufHeight); + fbcCTblSize = VPU_ALIGN16(fbcCTblSize); + + vbBuffer.size = ((fbcYTblSize * count + 4095) & ~4095) + 4096; + vbBuffer.phys_addr = 0; + + CVI_VC_MEM("fbcYTblSize = 0x%X\n", vbBuffer.size); + + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VENC_%d_H265_fbcYTbl", instance->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, &vbBuffer, 0, ionName) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + pEncInfo->vbFbcYTbl = vbBuffer; + + vbBuffer.size = ((fbcCTblSize * count + 4095) & ~4095) + 4096; + vbBuffer.phys_addr = 0; + + CVI_VC_MEM("fbcCTblSize = 0x%X\n", vbBuffer.size); + + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VENC_%d_H265_fbcCTbl", instance->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, &vbBuffer, 0, ionName) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + pEncInfo->vbFbcCTbl = vbBuffer; + + subSampledSize = WAVE4_SUBSAMPLED_ONE_SIZE(bufWidth, bufHeight); + vbBuffer.size = + ((subSampledSize * count + 4095) & ~4095) + 4096; + vbBuffer.phys_addr = 0; + + CVI_VC_MEM("subSampledSize = 0x%X\n", vbBuffer.size); + + memset(ionName, 0, MAX_VPU_ION_BUFFER_NAME); + sprintf(ionName, "VENC_%d_H265_subSampled", + instance->s32ChnNum); + if (VDI_ALLOCATE_MEMORY(coreIdx, &vbBuffer, 0, ionName) < 0) + return RETCODE_INSUFFICIENT_RESOURCE; + pEncInfo->vbSubSamBuf = vbBuffer; + } + VpuWriteReg(coreIdx, W4_ADDR_SUB_SAMPLED_FB_BASE, + pEncInfo->vbSubSamBuf.phys_addr); // set sub-sampled buffer + // base addr + VpuWriteReg(coreIdx, W4_SUB_SAMPLED_ONE_FB_SIZE, + subSampledSize); // set sub-sampled buffer size for one + // frame + + endian = vdi_convert_endian(coreIdx, fbArr[0].endian) & + VDI_128BIT_ENDIAN_MASK; + + regVal = (bufWidth << 16) | bufHeight; + + VpuWriteReg(coreIdx, W4_PIC_SIZE, regVal); + + // set stride of Luma/Chroma for compressed buffer + if ((pEncInfo->rotationAngle != 0 || pEncInfo->mirrorDirection != 0) && + !(pEncInfo->rotationAngle == 180 && + pEncInfo->mirrorDirection == MIRDIR_HOR_VER)) { + lumaStride = + VPU_ALIGN32(bufWidth) * + (pOpenParam->EncStdParam.hevcParam.internalBitDepth > + 8 ? + 5 : + 4); + lumaStride = VPU_ALIGN32(lumaStride); + chromaStride = + VPU_ALIGN16((bufWidth >> 1)) * + (pOpenParam->EncStdParam.hevcParam.internalBitDepth > + 8 ? + 5 : + 4); + chromaStride = VPU_ALIGN32(chromaStride); + } else { + lumaStride = + VPU_ALIGN16(pOpenParam->picWidth) * + (pOpenParam->EncStdParam.hevcParam.internalBitDepth > + 8 ? + 5 : + 4); + lumaStride = VPU_ALIGN32(lumaStride); + + chromaStride = + VPU_ALIGN16((pOpenParam->picWidth >> 1)) * + (pOpenParam->EncStdParam.hevcParam.internalBitDepth > + 8 ? + 5 : + 4); + chromaStride = VPU_ALIGN32(chromaStride); + } + + VpuWriteReg(coreIdx, W4_FBC_STRIDE, lumaStride << 16 | chromaStride); + + regVal = (nv21 << 29) | ((mapType == LINEAR_FRAME_MAP) << 28) | + (axiID << 24) | (yuvFormat << 20) | (cbcrInterleave << 16) | + (stride * bpp); + + VpuWriteReg(coreIdx, W4_COMMON_PIC_INFO, regVal); + + if (pEncInfo->addrRemapEn) { + cviInitAddrRemapFb(instance); + } + + remain = count; + q = (remain + 7) >> 3; + idx = 0; + for (j = 0; j < q; j++) { + regVal = (endian << 16) | (j == q - 1) << 4 | ((j == 0) << 3); + VpuWriteReg(coreIdx, W4_SFB_OPTION, regVal); + startNo = j * 8; + endNo = startNo + (remain >= 8 ? 8 : remain) - 1; + + VpuWriteReg(coreIdx, W4_SET_FB_NUM, (startNo << 8) | endNo); + + for (i = 0; i < 8 && i < remain; i++) { + addrY = fbArr[i + startNo].bufY; + addrCb = fbArr[i + startNo].bufCb; + addrCr = fbArr[i + startNo].bufCr; + + VpuWriteReg(coreIdx, W4_ADDR_LUMA_BASE0 + (i << 4), + addrY); + VpuWriteReg(coreIdx, W4_ADDR_CB_BASE0 + (i << 4), + addrCb); + APIDPRINT("REGISTER FB[%02d] Y(0x%08x), Cb(0x%08x) ", i, + addrY, addrCb); + if (mapType == COMPRESSED_FRAME_MAP) { + VpuWriteReg(coreIdx, + W4_ADDR_FBC_Y_OFFSET0 + (i << 4), + pEncInfo->vbFbcYTbl.phys_addr + + idx * fbcYTblSize); /* Luma + FBC + offset + table + */ + VpuWriteReg( + coreIdx, + W4_ADDR_FBC_C_OFFSET0 + (i << 4), + pEncInfo->vbFbcCTbl.phys_addr + + idx * fbcCTblSize); /* Chroma + FBC + offset + table + */ + VpuWriteReg(coreIdx, W4_ADDR_MV_COL0 + (i << 2), + pEncInfo->vbMV.phys_addr + + idx * mvColSize); + APIDPRINT("Yo(0x%08x) Co(0x%08x), Mv(0x%08x)\n", + pEncInfo->vbFbcYTbl.phys_addr + + idx * fbcYTblSize, + pEncInfo->vbFbcCTbl.phys_addr + + idx * fbcCTblSize, + pEncInfo->vbMV.phys_addr + + idx * mvColSize); + } else { + VpuWriteReg(coreIdx, + W4_ADDR_CR_BASE0 + (i << 4), + addrCr); + VpuWriteReg(coreIdx, + W4_ADDR_FBC_C_OFFSET0 + (i << 4), + 0); + VpuWriteReg(coreIdx, W4_ADDR_MV_COL0 + (i << 2), + 0); + APIDPRINT("Cr(0x%08x)\n", addrCr); + } + idx++; + } + remain -= i; + + VpuWriteReg(coreIdx, W4_ADDR_WORK_BASE, + pEncInfo->vbWork.phys_addr); + VpuWriteReg(coreIdx, W4_WORK_SIZE, pEncInfo->vbWork.size); + VpuWriteReg(coreIdx, W4_WORK_PARAM, 0); + + Wave4BitIssueCommand(instance, SET_FRAMEBUF); + if (vdi_wait_vpu_busy(coreIdx, __VPU_BUSY_TIMEOUT, + W4_VPU_BUSY_STATUS) == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + } + + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) { + return RETCODE_FAILURE; + } + + if (ConfigSecAXIWave(coreIdx, instance->codecMode, + &pEncInfo->secAxiInfo, pOpenParam->picWidth, + pOpenParam->picHeight, + pOpenParam->EncStdParam.hevcParam.profile, + pOpenParam->EncStdParam.hevcParam.level) == 0) { + return RETCODE_INSUFFICIENT_RESOURCE; + } + + return ret; +} + +RetCode Wave4VpuEncSetup(CodecInst *instance) +{ + Int32 coreIdx, int_reason = 0, width32 = 0, height32 = 0; + Int32 srcWidth = 0, srcHeight = 0; + Uint32 regVal = 0, bsEndian = 0, rotMirMode; + EncInfo *pEncInfo; + EncOpenParam *pOpenParam; + EncHevcParam *pHevc; + vpu_buffer_t vb; + stRcInfo *rcInfo = &instance->rcInfo; + int status = 0; + + coreIdx = instance->coreIdx; + pEncInfo = &instance->CodecInfo->encInfo; + + pOpenParam = &pEncInfo->openParam; + pHevc = &pOpenParam->EncStdParam.hevcParam; + + rotMirMode = 0; + /* CMD_ENC_ROT_MODE : + * | hor_mir | ver_mir | rot_angle | rot_en | + * [4] [3] [2:1] [0] + */ + if (pEncInfo->rotationEnable == TRUE) { + switch (pEncInfo->rotationAngle) { + case 0: + rotMirMode |= 0x0; + break; + case 90: + rotMirMode |= 0x3; + break; + case 180: + rotMirMode |= 0x5; + break; + case 270: + rotMirMode |= 0x7; + break; + } + } + + if (pEncInfo->mirrorEnable == TRUE) { + switch (pEncInfo->mirrorDirection) { + case MIRDIR_NONE: + rotMirMode |= 0x0; + break; + case MIRDIR_VER: + rotMirMode |= 0x9; + break; + case MIRDIR_HOR: + rotMirMode |= 0x11; + break; + case MIRDIR_HOR_VER: + rotMirMode |= 0x19; + break; + } + } + + width32 = VPU_ALIGN32(pOpenParam->picWidth); + height32 = VPU_ALIGN32(pOpenParam->picHeight); + + srcWidth = VPU_ALIGN8(pOpenParam->picWidth); + srcHeight = VPU_ALIGN8(pOpenParam->picHeight); + + if (((rotMirMode != 0) && + !((pEncInfo->rotationAngle == 180) && + (pEncInfo->mirrorDirection == MIRDIR_HOR_VER))) && + ((pOpenParam->picWidth != width32) || + (pOpenParam->picHeight != height32))) // if rot/mir enable && pic + // size is not 32-aligned, + // set crop info. + CalcEncCropInfo(pHevc, rotMirMode, pOpenParam->picWidth, + pOpenParam->picHeight); + else { + status = cviCfgCropInfo(pOpenParam); + if (status != RETCODE_SUCCESS) { + CVI_VC_ERR("CalcEncCropInfo = %d\n", status); + return RETCODE_FAILURE; + } + } + + regVal = vdi_convert_endian(coreIdx, pOpenParam->streamEndian); + /* NOTE: When endian mode is 0, SDMA reads MSB first */ + bsEndian = (~regVal & VDI_128BIT_ENDIAN_MASK); + + VpuWriteReg(coreIdx, W4_BS_START_ADDR, pEncInfo->streamBufStartAddr); + VpuWriteReg(coreIdx, W4_BS_SIZE, pEncInfo->streamBufSize); + VpuWriteReg(coreIdx, pEncInfo->streamRdPtrRegAddr, + pEncInfo->streamRdPtr); + VpuWriteReg(coreIdx, pEncInfo->streamWrPtrRegAddr, + pEncInfo->streamWrPtr); + VpuWriteReg(coreIdx, W4_BS_PARAM, + (pEncInfo->lineBufIntEn << 6) | + (pEncInfo->sliceIntEnable << 5) | + (pEncInfo->ringBufferEnable << 4) | bsEndian); + + /* Secondary AXI */ + vdi_get_sram_memory(coreIdx, &vb); + VpuWriteReg(coreIdx, W4_ADDR_SEC_AXI, vb.phys_addr); + VpuWriteReg(coreIdx, W4_SEC_AXI_SIZE, pEncInfo->secAxiInfo.bufSize); + VpuWriteReg( + coreIdx, W4_USE_SEC_AXI, + (pEncInfo->secAxiInfo.u.wave4.useEncImdEnable << 9) | + (pEncInfo->secAxiInfo.u.wave4.useEncRdoEnable << 11) | + (pEncInfo->secAxiInfo.u.wave4.useEncLfEnable << 15)); + + /* Set up work-buffer */ + VpuWriteReg(coreIdx, W4_ADDR_WORK_BASE, pEncInfo->vbWork.phys_addr); + VpuWriteReg(coreIdx, W4_WORK_SIZE, pEncInfo->vbWork.size); + VpuWriteReg(coreIdx, W4_WORK_PARAM, 0); + + /* Set up temp-buffer */ + vdi_get_common_memory(instance->coreIdx, &vb); + pEncInfo->vbTemp.phys_addr = vb.phys_addr + WAVE4_TEMPBUF_OFFSET; + pEncInfo->vbTemp.virt_addr = vb.virt_addr + WAVE4_TEMPBUF_OFFSET; + pEncInfo->vbTemp.size = DEFAULT_TEMPBUF_SIZE; + + VpuWriteReg(coreIdx, W4_ADDR_TEMP_BASE, pEncInfo->vbTemp.phys_addr); + VpuWriteReg(coreIdx, W4_TEMP_SIZE, pEncInfo->vbTemp.size); + VpuWriteReg(coreIdx, W4_TEMP_PARAM, 0); + + /* Set up BitstreamBuffer */ + VpuWriteReg(coreIdx, W4_BS_START_ADDR, pEncInfo->streamBufStartAddr); + VpuWriteReg(coreIdx, W4_BS_SIZE, pEncInfo->streamBufSize); + + /* SET_PARAM + COMMON */ + VpuWriteReg(coreIdx, W4_CMD_ENC_SET_PARAM_OPTION, OPT_COMMON); + VpuWriteReg(coreIdx, W4_CMD_ENC_SET_PARAM_ENABLE, + (unsigned int)ENC_CHANGE_SET_PARAM_ALL); + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_SRC_SIZE, + srcHeight << 16 | srcWidth); + +#ifdef REDUNDENT_CODE + if (instance->productId == PRODUCT_ID_420) { + regVal = (pHevc->profile << 0) | (pHevc->level << 3) | + (pHevc->tier << 12) | (pHevc->internalBitDepth << 14) | + (pHevc->chromaFormatIdc << 19) | + (pHevc->losslessEnable << 21) | + (pHevc->constIntraPredFlag << 22) | + (pHevc->useLongTerm << 23) | + (pHevc->enableAFBCD << 24); + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_PIC_PARAM, regVal); + + regVal = pHevc->gopPresetIdx; + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_GOP_PARAM, regVal); + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_INTRA_MIN_MAX_QP, + pOpenParam->userQpMaxI << 6 | + pOpenParam->userQpMinI); + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_PARAM, + (pOpenParam->rcEnable << 0) | + (pHevc->cuLevelRCEnable << 1) | + (pHevc->hvsQPEnable << 2) | + (pHevc->hvsQpScaleEnable << 3) | + (pHevc->hvsQpScale << 4) | + (pHevc->bitAllocMode << 8) | + (pHevc->initBufLevelx8 << 10) | + (pHevc->ctuOptParam.roiEnable << 14) | + /* [15] reserved */ + (pOpenParam->initialDelay << 16)); + } else +#endif + { // WAVE420L + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_PIC_PARAM, + (pHevc->profile << 0) | (pHevc->level << 3) | + (pHevc->tier << 12) | + (pHevc->internalBitDepth << 14) | + (pHevc->chromaFormatIdc << 18) | + (pHevc->losslessEnable << 20) | + (pHevc->constIntraPredFlag << 21) | + ((pHevc->chromaCbQpOffset & 0x1f) << 22) | + ((pHevc->chromaCrQpOffset & 0x1f) << 27)); + + regVal = pHevc->gopPresetIdx; + regVal |= (pHevc->gopParam.enTemporalLayerQp << 8); + regVal |= (pHevc->gopParam.tidQp0 << 9); + regVal |= (pHevc->gopParam.tidQp1 << 15); + regVal |= (pHevc->gopParam.tidQp2 << 21); + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_GOP_PARAM, regVal); + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_LAYER_PERIOD, + (pHevc->gopParam.tidPeriod0 << 16)); + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_PARAM, + (pOpenParam->rcEnable << 0) | + (pHevc->cuLevelRCEnable << 1) | + (pHevc->hvsQPEnable << 2) | + (pHevc->hvsQpScaleEnable << 3) | + (pHevc->hvsQpScale << 4) | + (pHevc->bitAllocMode << 7) | + (pHevc->initBufLevelx8 << 9) | + (pHevc->ctuOptParam.roiEnable << 13) | + (pHevc->initialRcQp << 14) | + (pOpenParam->initialDelay << 20)); + } + + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_INTRA_PARAM, + (pHevc->decodingRefreshType << 0) | (pHevc->intraQP << 3) | + (pHevc->forcedIdrHeaderEnable << 9) | + (pHevc->intraPeriod << 16)); + + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_CONF_WIN_TOP_BOT, + pHevc->confWinBot << 16 | pHevc->confWinTop); + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_CONF_WIN_LEFT_RIGHT, + pHevc->confWinRight << 16 | pHevc->confWinLeft); + + do { + int frameRateDiv, frameRateRes, frameRate; + + frameRateDiv = (pOpenParam->frameRateInfo >> 16) + 1; + frameRateRes = pOpenParam->frameRateInfo & 0xFFFF; + + frameRate = frameRateRes / frameRateDiv; + + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_FRAME_RATE, frameRate); + } while (0); + + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_INDEPENDENT_SLICE, + pHevc->independSliceModeArg << 16 | + pHevc->independSliceMode); + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_DEPENDENT_SLICE, + pHevc->dependSliceModeArg << 16 | pHevc->dependSliceMode); + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_INTRA_REFRESH, + pHevc->intraRefreshArg << 16 | pHevc->intraRefreshMode); + + regVal = (pHevc->useRecommendEncParam) | + (pHevc->scalingListEnable << 3) | (pHevc->cuSizeMode << 4) | + (pHevc->tmvpEnable << 7) | (pHevc->wppEnable << 8) | + (pHevc->maxNumMerge << 9) | + (pHevc->dynamicMerge8x8Enable << 12) | + (pHevc->dynamicMerge16x16Enable << 13) | + (pHevc->dynamicMerge32x32Enable << 14) | + (pHevc->disableDeblk << 15) | + (pHevc->lfCrossSliceBoundaryEnable << 16) | + ((pHevc->betaOffsetDiv2 & 0xF) << 17) | + ((pHevc->tcOffsetDiv2 & 0xF) << 21) | + (pHevc->skipIntraTrans << 25) | (pHevc->saoEnable << 26) | + (pHevc->intraInInterSliceEnable << 27) | + (pHevc->intraNxNEnable << 28); + regVal |= (pHevc->ctuOptParam.ctuQpEnable << 2); +#ifdef SUPPORT_HOST_RC_PARAM + regVal |= (pHevc->hostPicRCEnable << 29); +#endif + VpuWriteReg(coreIdx, W4_CMD_ENC_PARAM, regVal); + + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_MIN_MAX_QP, + (pOpenParam->userQpMinP << 0) | + (pOpenParam->userQpMaxP << 6) | + (pHevc->maxDeltaQp << 12) | + ((pHevc->intraQpOffset & 0xFFFF) << 18)); + + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_BIT_RATIO_LAYER_0_3, + (pHevc->fixedBitRatio[0] << 0) | + (pHevc->fixedBitRatio[1] << 8) | + (pHevc->fixedBitRatio[2] << 16) | + (pHevc->fixedBitRatio[3] << 24)); + + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_BIT_RATIO_LAYER_4_7, + (pHevc->fixedBitRatio[4] << 0) | + (pHevc->fixedBitRatio[5] << 8) | + (pHevc->fixedBitRatio[6] << 16) | + (pHevc->fixedBitRatio[7] << 24)); + + VpuWriteReg(coreIdx, W4_CMD_ENC_NR_PARAM, + (pHevc->nrYEnable << 0) | (pHevc->nrCbEnable << 1) | + (pHevc->nrCrEnable << 2) | + (pHevc->nrNoiseEstEnable << 3) | + (pHevc->nrNoiseSigmaY << 4) | + (pHevc->nrNoiseSigmaCb << 12) | + (pHevc->nrNoiseSigmaCr << 20)); + + VpuWriteReg(coreIdx, W4_CMD_ENC_NR_WEIGHT, + (pHevc->nrIntraWeightY << 0) | + (pHevc->nrIntraWeightCb << 5) | + (pHevc->nrIntraWeightCr << 10) | + (pHevc->nrInterWeightY << 15) | + (pHevc->nrInterWeightCb << 20) | + (pHevc->nrInterWeightCr << 25)); + + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_TARGET_RATE, + rcInfo->targetBitrate * 1000); + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_TRANS_RATE, pHevc->transRate); + VpuWriteReg(coreIdx, W4_CMD_ENC_ROT_PARAM, rotMirMode); + VpuWriteReg(coreIdx, W4_CMD_ENC_NUM_UNITS_IN_TICK, + pHevc->numUnitsInTick); + VpuWriteReg(coreIdx, W4_CMD_ENC_TIME_SCALE, pHevc->timeScale); + VpuWriteReg(coreIdx, W4_CMD_ENC_NUM_TICKS_POC_DIFF_ONE, + pHevc->numTicksPocDiffOne); + + // comment until VPU working + Wave4BitIssueCommand(instance, SET_PARAM); + + do { + int_reason = vdi_wait_interrupt(coreIdx, VPU_ENC_TIMEOUT, NULL); + } while (int_reason == -1 && __VPU_BUSY_TIMEOUT == 0); + if (int_reason == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) { + vdi_log(coreIdx, SET_PARAM, 0); + } +#endif + CVI_VC_ERR("SET_PARAM RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + VpuWriteReg(coreIdx, W4_VPU_VINT_REASON_CLR, int_reason); + VpuWriteReg(coreIdx, W4_VPU_VINT_CLEAR, 1); + + int_reason = 0; + +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) + vdi_log(coreIdx, SET_PARAM, 0); +#endif + + if (VpuReadReg(coreIdx, W4_RET_SUCCESS) == 0) { + if (VpuReadReg(coreIdx, W4_RET_FAIL_REASON) == + WAVE4_SYSERR_WRITEPROTECTION) { + CVI_VC_ERR("RETCODE_MEMORY_ACCESS_VIOLATION\n"); + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + CVI_VC_ERR("W4_RET_SUCCESS fail\n"); + return RETCODE_FAILURE; + } + + pEncInfo->initialInfo.minFrameBufferCount = + VpuReadReg(coreIdx, W4_RET_ENC_MIN_FB_NUM); + pEncInfo->initialInfo.minSrcFrameCount = + VpuReadReg(coreIdx, W4_RET_ENC_MIN_SRC_BUF_NUM); + CVI_VC_MEM("minSrcFrameCount = %d\n", + pEncInfo->initialInfo.minSrcFrameCount); + + /* + * SET_PARAM + CUSTOM_GOP + * only when gopPresetIdx == custom_gop, custom_gop related registers + * should be set + */ + if (pHevc->gopPresetIdx == PRESET_IDX_CUSTOM_GOP) { + int i = 0, j = 0; + VpuWriteReg(coreIdx, W4_CMD_ENC_SET_PARAM_OPTION, + OPT_CUSTOM_GOP); + VpuWriteReg( + coreIdx, W4_CMD_ENC_SET_CUSTOM_GOP_ENABLE, + (unsigned int)ENC_CHANGE_SET_PARAM_ALL); // enable to + // change for + // all custom + // gop + // parameters. + VpuWriteReg(coreIdx, W4_CMD_ENC_CUSTOM_GOP_PARAM, + pHevc->gopParam.customGopSize << 0 | + pHevc->gopParam.useDeriveLambdaWeight << 4); + + for (i = 0; i < pHevc->gopParam.customGopSize; i++) { + VpuWriteReg( + coreIdx, + W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_0 + (i * 4), + (pHevc->gopParam.picParam[i].picType << 0) | + (pHevc->gopParam.picParam[i].pocOffset + << 2) | + (pHevc->gopParam.picParam[i].picQp + << 6) | + ((pHevc->gopParam.picParam[i].refPocL0 & + 0x1F) + << 14) | + ((pHevc->gopParam.picParam[i].refPocL1 & + 0x1F) + << 19) | + (pHevc->gopParam.picParam[i].temporalId + << 24)); + VpuWriteReg(coreIdx, + W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_0 + + (i * 4), + pHevc->gopParam.gopPicLambda[i]); + + } + + for (j = i; j < MAX_GOP_NUM; j++) { + VpuWriteReg(coreIdx, + W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_0 + (j * 4), + 0); + VpuWriteReg(coreIdx, + W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_0 + + (j * 4), + 0); + } + + // comment until VPU working + + Wave4BitIssueCommand(instance, SET_PARAM); + do { + int_reason = vdi_wait_interrupt(coreIdx, + VPU_ENC_TIMEOUT, NULL); + } while (int_reason == -1 && __VPU_BUSY_TIMEOUT == 0); + if (int_reason == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) { + vdi_log(coreIdx, SET_PARAM, 0); + } +#endif + CVI_VC_ERR("SET_PARAM RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + VpuWriteReg(coreIdx, W4_VPU_VINT_REASON_CLR, int_reason); + VpuWriteReg(coreIdx, W4_VPU_VINT_CLEAR, 1); + + int_reason = 0; +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) + vdi_log(coreIdx, SET_PARAM, 0); +#endif + + if (VpuReadReg(coreIdx, W4_RET_SUCCESS) == 0) { + if (VpuReadReg(coreIdx, W4_RET_FAIL_REASON) == + WAVE4_SYSERR_WRITEPROTECTION) { + CVI_VC_ERR("RETCODE_MEMORY_ACCESS_VIOLATION\n"); + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + CVI_VC_ERR("W4_RET_SUCCESS fail\n"); + return RETCODE_FAILURE; + } + + if ((int)VpuReadReg(coreIdx, W4_RET_ENC_MIN_FB_NUM) > + pEncInfo->initialInfo.minFrameBufferCount) + pEncInfo->initialInfo.minFrameBufferCount = + VpuReadReg(coreIdx, W4_RET_ENC_MIN_FB_NUM); + + if ((int)VpuReadReg(coreIdx, W4_RET_ENC_MIN_SRC_BUF_NUM) > + pEncInfo->initialInfo.minSrcFrameCount) + pEncInfo->initialInfo.minSrcFrameCount = + VpuReadReg(coreIdx, W4_RET_ENC_MIN_SRC_BUF_NUM); + CVI_VC_MEM("minSrcFrameCount = %d\n", + pEncInfo->initialInfo.minSrcFrameCount); + } + + if (pHevc->vuiParam.vuiParamFlags || + pEncInfo->openParam.encodeVuiRbsp || + pEncInfo->openParam.encodeHrdRbspInVPS || + pEncInfo->openParam.encodeHrdRbspInVUI) { + //*** VUI encoding by host registers ***/ + if (pHevc->vuiParam.vuiParamFlags) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SET_PARAM_OPTION, + OPT_VUI); + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_PARAM_FLAGS, + pHevc->vuiParam.vuiParamFlags); + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_ASPECT_RATIO_IDC, + pHevc->vuiParam.vuiAspectRatioIdc); + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_SAR_SIZE, + pHevc->vuiParam.vuiSarSize); + VpuWriteReg(coreIdx, + W4_CMD_ENC_VUI_OVERSCAN_APPROPRIATE, + pHevc->vuiParam.vuiOverScanAppropriate); + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_VIDEO_SIGNAL, + pHevc->vuiParam.videoSignal); + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_CHROMA_SAMPLE_LOC, + pHevc->vuiParam.vuiChromaSampleLoc); + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_DISP_WIN_LEFT_RIGHT, + pHevc->vuiParam.vuiDispWinLeftRight); + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_DISP_WIN_TOP_BOT, + pHevc->vuiParam.vuiDispWinTopBottom); + } else { + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_PARAM_FLAGS, 0x0); + } + + if (pEncInfo->openParam.encodeVuiRbsp || + pEncInfo->openParam.encodeHrdRbspInVPS || + pEncInfo->openParam.encodeHrdRbspInVUI) { + //*** VUI encoding by given rbsp data ***/ + VpuWriteReg(coreIdx, W4_CMD_ENC_SET_PARAM_OPTION, + OPT_VUI); + + VpuWriteReg( + coreIdx, W4_CMD_ENC_VUI_HRD_RBSP_PARAM_FLAG, + (pEncInfo->openParam.encodeHrdRbspInVPS << 2) | + (pEncInfo->openParam.encodeHrdRbspInVUI + << 1) | + (pEncInfo->openParam.encodeVuiRbsp)); + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_RBSP_ADDR, + pEncInfo->openParam.vuiRbspDataAddr); + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_RBSP_SIZE, + pEncInfo->openParam.vuiRbspDataSize); + VpuWriteReg(coreIdx, W4_CMD_ENC_HRD_RBSP_ADDR, + pEncInfo->openParam.hrdRbspDataAddr); + VpuWriteReg(coreIdx, W4_CMD_ENC_HRD_RBSP_SIZE, + pEncInfo->openParam.hrdRbspDataSize); + + } else { + VpuWriteReg(coreIdx, W4_CMD_ENC_VUI_HRD_RBSP_PARAM_FLAG, + 0x0); + } + + Wave4BitIssueCommand(instance, SET_PARAM); + + do { + int_reason = vdi_wait_interrupt(coreIdx, + VPU_ENC_TIMEOUT, NULL); + } while (int_reason == -1 && __VPU_BUSY_TIMEOUT == 0); + if (int_reason == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) { + vdi_log(coreIdx, SET_PARAM, 0); + } +#endif + CVI_VC_ERR("SET_PARAM RESPONSE_TIMEOUT\n"); + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + VpuWriteReg(coreIdx, W4_VPU_VINT_REASON_CLR, int_reason); + VpuWriteReg(coreIdx, W4_VPU_VINT_CLEAR, 1); + +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) + vdi_log(coreIdx, SET_PARAM, 0); +#endif + + if (VpuReadReg(coreIdx, W4_RET_SUCCESS) == 0) { + if (VpuReadReg(coreIdx, W4_RET_FAIL_REASON) == + WAVE4_SYSERR_WRITEPROTECTION) { + CVI_VC_ERR("RETCODE_MEMORY_ACCESS_VIOLATION\n"); + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + CVI_VC_ERR("W4_RET_SUCCESS fail\n"); + return RETCODE_FAILURE; + } + } + + pEncInfo->streamWrPtr = vdi_remap_memory_address( + coreIdx, VpuReadReg(coreIdx, pEncInfo->streamWrPtrRegAddr)); + return RETCODE_SUCCESS; +} + +static RetCode cviCfgCropInfo(EncOpenParam *pOpenParam) +{ + EncHevcParam *pHevc = &pOpenParam->EncStdParam.hevcParam; + + // width and height must be 2 pixel aligned + if ((pOpenParam->picWidth & 0x1) || (pOpenParam->picHeight & 0x1)) { + CVI_VC_ERR("picWidth = %d, picHeight = %d\n", + pOpenParam->picWidth, pOpenParam->picHeight); + return RETCODE_FAILURE; + } + + if (pOpenParam->picWidth & 0x7) + pHevc->confWinRight = 8 - (pOpenParam->picWidth & 0x7); + + if (pOpenParam->picHeight & 0x7) + pHevc->confWinBot = 8 - (pOpenParam->picHeight & 0x7); + + CVI_VC_CFG("confWinRight = %d, confWinBot = %d\n", pHevc->confWinRight, + pHevc->confWinBot); + + return RETCODE_SUCCESS; +} + +static RetCode Wave4SetEncBitStreamInfo(CodecInst *instance, + EncHeaderParam *encHeaderParam, + EncParam *option) +{ + Int32 coreIdx = instance->coreIdx; + EncInfo *pEncInfo = VPU_HANDLE_TO_ENCINFO(instance); + PhysicalAddress paBitStreamWrPtr = VPU_ALIGN8(pEncInfo->streamWrPtr); + PhysicalAddress paBitStreamStart = 0; + int bitStreamBufSize = 0; + + if (encHeaderParam) { + if (pEncInfo->bEsBufQueueEn == 0) { + paBitStreamStart = encHeaderParam->buf; + bitStreamBufSize = (int)encHeaderParam->size; + } else { + paBitStreamStart = paBitStreamWrPtr; + bitStreamBufSize = (int)(pEncInfo->streamBufEndAddr - + paBitStreamWrPtr); + } + + CVI_VC_BS( + "headerStreamBufferAddr = 0x%llX, headerStreamBufferSize = 0x%X\n", + paBitStreamWrPtr, bitStreamBufSize); + } else if (option) { + if (pEncInfo->bEsBufQueueEn == 0 + || ((pEncInfo->streamBufEndAddr - paBitStreamWrPtr) < H265_MIN_BITSTREAM_SIZE) + || (pEncInfo->streamBufEndAddr < paBitStreamWrPtr) + ) { + paBitStreamStart = option->picStreamBufferAddr; + bitStreamBufSize = option->picStreamBufferSize; + } else { + paBitStreamStart = paBitStreamWrPtr; + bitStreamBufSize = (int)(pEncInfo->streamBufEndAddr - + paBitStreamWrPtr); + } + + CVI_VC_BS( + "picStreamBufferAddr = 0x%llX, picStreamBufferSize = 0x%X\n", + paBitStreamWrPtr, bitStreamBufSize); + } + + VpuWriteReg(coreIdx, W4_BS_START_ADDR, paBitStreamStart); + VpuWriteReg(coreIdx, W4_BS_SIZE, bitStreamBufSize); + pEncInfo->streamRdPtr = paBitStreamStart; + pEncInfo->streamWrPtr = paBitStreamStart; + pEncInfo->streamBufStartAddr = paBitStreamStart; + pEncInfo->streamBufSize = bitStreamBufSize; + + return RETCODE_SUCCESS; +} + +RetCode Wave4VpuEncode(CodecInst *instance, EncParam *option) +{ + Int32 coreIdx, srcFrameFormat, srcPixelFormat, packedFormat; + Uint32 regVal = 0, bsEndian; + Uint32 srcStrideC = 0; + EncInfo *pEncInfo; + FrameBuffer *pSrcFrame; + EncOpenParam *pOpenParam; + stRcInfo *pRcInfo; + BOOL justified = W4_WTL_RIGHT_JUSTIFIED; + Uint32 formatNo = W4_WTL_PIXEL_8BIT; + + coreIdx = instance->coreIdx; + pEncInfo = VPU_HANDLE_TO_ENCINFO(instance); + pOpenParam = &pEncInfo->openParam; + pSrcFrame = option->sourceFrame; + pRcInfo = &instance->rcInfo; + + if (pEncInfo->cviRcEn || pRcInfo->rcMode == RC_MODE_UBR) + Wave4VpuEncCalcPicQp(option); + + switch (pOpenParam->srcFormat) { + case FORMAT_420_P10_16BIT_MSB: + case FORMAT_YUYV_P10_16BIT_MSB: + case FORMAT_YVYU_P10_16BIT_MSB: + case FORMAT_UYVY_P10_16BIT_MSB: + case FORMAT_VYUY_P10_16BIT_MSB: + justified = W4_WTL_RIGHT_JUSTIFIED; + formatNo = W4_WTL_PIXEL_16BIT; + break; + case FORMAT_420_P10_16BIT_LSB: + case FORMAT_YUYV_P10_16BIT_LSB: + case FORMAT_YVYU_P10_16BIT_LSB: + case FORMAT_UYVY_P10_16BIT_LSB: + case FORMAT_VYUY_P10_16BIT_LSB: + justified = W4_WTL_LEFT_JUSTIFIED; + formatNo = W4_WTL_PIXEL_16BIT; + break; + case FORMAT_420_P10_32BIT_MSB: + case FORMAT_YUYV_P10_32BIT_MSB: + case FORMAT_YVYU_P10_32BIT_MSB: + case FORMAT_UYVY_P10_32BIT_MSB: + case FORMAT_VYUY_P10_32BIT_MSB: + justified = W4_WTL_RIGHT_JUSTIFIED; + formatNo = W4_WTL_PIXEL_32BIT; + break; + case FORMAT_420_P10_32BIT_LSB: + case FORMAT_YUYV_P10_32BIT_LSB: + case FORMAT_YVYU_P10_32BIT_LSB: + case FORMAT_UYVY_P10_32BIT_LSB: + case FORMAT_VYUY_P10_32BIT_LSB: + justified = W4_WTL_LEFT_JUSTIFIED; + formatNo = W4_WTL_PIXEL_32BIT; + break; + case FORMAT_420: + case FORMAT_YUYV: + case FORMAT_YVYU: + case FORMAT_UYVY: + case FORMAT_VYUY: + justified = W4_WTL_LEFT_JUSTIFIED; + formatNo = W4_WTL_PIXEL_8BIT; + break; + default: + break; + } + + packedFormat = (pOpenParam->packedFormat >= PACKED_YUYV) ? 1 : 0; + + srcFrameFormat = packedFormat << 2 | pOpenParam->cbcrInterleave << 1 | + pOpenParam->nv21; + + switch (pOpenParam->packedFormat) { // additional packed format + // (interleave & nv21 bit are used + // to present these modes) + case PACKED_YVYU: + srcFrameFormat = 0x5; + break; + case PACKED_UYVY: + srcFrameFormat = 0x6; + break; + case PACKED_VYUY: + srcFrameFormat = 0x7; + break; + default: + break; + } + + srcPixelFormat = justified << 2 | formatNo; + + regVal = vdi_convert_endian(coreIdx, pOpenParam->streamEndian); + /* NOTE: When endian mode is 0, SDMA reads MSB first */ + bsEndian = (~regVal & VDI_128BIT_ENDIAN_MASK); + + if (pEncInfo->openParam.ringBufferEnable == 1) { + VpuWriteReg(coreIdx, W4_BS_START_ADDR, + pEncInfo->streamBufStartAddr); + VpuWriteReg(coreIdx, W4_BS_SIZE, pEncInfo->streamBufSize); + } else { + Wave4SetEncBitStreamInfo(instance, NULL, option); + } + + VpuWriteReg(coreIdx, pEncInfo->streamRdPtrRegAddr, + pEncInfo->streamRdPtr); + VpuWriteReg(coreIdx, pEncInfo->streamWrPtrRegAddr, + pEncInfo->streamWrPtr); + VpuWriteReg(coreIdx, W4_BS_PARAM, + (pEncInfo->lineBufIntEn << 6) | + (pEncInfo->sliceIntEnable << 5) | + (pEncInfo->ringBufferEnable << 4) | bsEndian); + + /* Secondary AXI */ + VpuWriteReg(coreIdx, W4_ADDR_SEC_AXI, pEncInfo->secAxiInfo.bufBase); + VpuWriteReg(coreIdx, W4_SEC_AXI_SIZE, pEncInfo->secAxiInfo.bufSize); + VpuWriteReg( + coreIdx, W4_USE_SEC_AXI, + (pEncInfo->secAxiInfo.u.wave4.useEncImdEnable << 9) | + (pEncInfo->secAxiInfo.u.wave4.useEncRdoEnable << 11) | + (pEncInfo->secAxiInfo.u.wave4.useEncLfEnable << 15)); + + /* Set up work-buffer */ + VpuWriteReg(coreIdx, W4_ADDR_WORK_BASE, pEncInfo->vbWork.phys_addr); + VpuWriteReg(coreIdx, W4_WORK_SIZE, pEncInfo->vbWork.size); + VpuWriteReg(coreIdx, W4_WORK_PARAM, 0); + + /* Set up temp-buffer */ + VpuWriteReg(coreIdx, W4_ADDR_TEMP_BASE, pEncInfo->vbTemp.phys_addr); + VpuWriteReg(coreIdx, W4_TEMP_SIZE, pEncInfo->vbTemp.size); + VpuWriteReg(coreIdx, W4_TEMP_PARAM, 0); + + VpuWriteReg(coreIdx, W4_CMD_ENC_ADDR_REPORT_BASE, 0); + VpuWriteReg(coreIdx, W4_CMD_ENC_REPORT_SIZE, 0); + VpuWriteReg(coreIdx, W4_CMD_ENC_REPORT_PARAM, 0); + + if (option->codeOption.implicitHeaderEncode == 1) { + VpuWriteReg(coreIdx, W4_CMD_ENC_CODE_OPTION, + CODEOPT_ENC_HEADER_IMPLICIT | + CODEOPT_ENC_VCL | // implicitly encode a + // header(headers) for + // generating bitstream. + // (to encode a header + // only, use + // ENC_PUT_VIDEO_HEADER + // for GiveCommand) + (option->codeOption.encodeAUD << 5) | + (option->codeOption.encodeEOS << 6) | + (option->codeOption.encodeEOB << 7)); + } else { + VpuWriteReg(coreIdx, W4_CMD_ENC_CODE_OPTION, + (option->codeOption.implicitHeaderEncode << 0) | + (option->codeOption.encodeVCL << 1) | + (option->codeOption.encodeVPS << 2) | + (option->codeOption.encodeSPS << 3) | + (option->codeOption.encodePPS << 4) | + (option->codeOption.encodeAUD << 5) | + (option->codeOption.encodeEOS << 6) | + (option->codeOption.encodeEOB << 7) | + (option->codeOption.encodeVUI << 9)); + } + + VpuWriteReg(coreIdx, W4_CMD_ENC_PIC_PARAM, + (option->skipPicture << 0) | + (option->forcePicQpEnable << 1) | + (option->forcePicQpI << 2) | + (option->forcePicQpP << 8) | + (option->forcePicQpB << 14) | + (option->forcePicTypeEnable << 20) | + (option->forcePicType << 21) | + (option->forcePicQpSrcOrderEnable << 29) | + (option->forcePicTypeSrcOrderEnable << 30)); + + if (option->srcEndFlag == 1) + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_PIC_IDX, + 0xFFFFFFFF); // no more source image. + else + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_PIC_IDX, option->srcIdx); + + CVI_VC_SRC("bufY = 0x%llX, bufCb = 0x%llX, bufCr = 0x%llX\n", + pSrcFrame->bufY, pSrcFrame->bufCb, pSrcFrame->bufCr); + + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_ADDR_Y, pSrcFrame->bufY); + if (pOpenParam->cbcrOrder == CBCR_ORDER_NORMAL) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_ADDR_U, pSrcFrame->bufCb); + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_ADDR_V, pSrcFrame->bufCr); + } else { + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_ADDR_U, pSrcFrame->bufCr); + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_ADDR_V, pSrcFrame->bufCb); + } + + if (formatNo == W4_WTL_PIXEL_32BIT) { + srcStrideC = VPU_ALIGN16((pSrcFrame->stride >> 1)) * + (1 << pSrcFrame->cbcrInterleave); + if (pSrcFrame->cbcrInterleave == 1) + srcStrideC = pSrcFrame->stride; + } else { + srcStrideC = (pSrcFrame->cbcrInterleave == 1) ? + pSrcFrame->stride : + (pSrcFrame->stride >> 1); + } + + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_STRIDE, + (pSrcFrame->stride << 16) | srcStrideC); + + regVal = vdi_convert_endian(coreIdx, pOpenParam->sourceEndian); + bsEndian = (~regVal & VDI_128BIT_ENDIAN_MASK); + + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_FORMAT, + (srcFrameFormat << 0) | (srcPixelFormat << 3) | + (bsEndian << 6)); + + VpuWriteReg(coreIdx, W4_CMD_ENC_PREFIX_SEI_NAL_ADDR, + pEncInfo->prefixSeiNalAddr); + VpuWriteReg(coreIdx, W4_CMD_ENC_PREFIX_SEI_INFO, + pEncInfo->prefixSeiDataSize << 16 | + pEncInfo->prefixSeiDataEncOrder << 1 | + pEncInfo->prefixSeiNalEnable); + VpuWriteReg(coreIdx, W4_CMD_ENC_SUFFIX_SEI_NAL_ADDR, + pEncInfo->suffixSeiNalAddr); + VpuWriteReg(coreIdx, W4_CMD_ENC_SUFFIX_SEI_INFO, + pEncInfo->suffixSeiDataSize << 16 | + pEncInfo->suffixSeiDataEncOrder << 1 | + pEncInfo->suffixSeiNalEnable); + VpuWriteReg(coreIdx, W4_CMD_ENC_ROI_ADDR_CTU_MAP, + option->ctuOptParam.addrRoiCtuMap); + VpuWriteReg(coreIdx, W4_CMD_ENC_CTU_MODE_MAP_ADDR, + option->ctuOptParam.addrCtuModeMap); + VpuWriteReg(coreIdx, W4_CMD_ENC_CTU_QP_MAP_ADDR, + option->ctuOptParam.addrCtuQpMap); + VpuWriteReg(coreIdx, W4_CMD_ENC_CTU_OPT_PARAM, + ((option->ctuOptParam.roiEnable) << 0) | + (option->ctuOptParam.roiDeltaQp << 1) | + (option->ctuOptParam.ctuModeEnable << 8) | + (option->ctuOptParam.ctuQpEnable << 9) | + (option->ctuOptParam.mapEndian << 12) | + (option->ctuOptParam.mapStride << 16)); + + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_TIMESTAMP_LOW, 0); + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_TIMESTAMP_HIGH, 0); + VpuWriteReg(coreIdx, W4_CMD_ENC_LONGTERM_PIC, + (option->useCurSrcAsLongtermPic << 0) | + (option->useLongtermRef << 1)); + VpuWriteReg(coreIdx, W4_CMD_ENC_SUB_FRAME_SYNC_CONFIG, 0); +#ifdef SUPPORT_HOST_RC_PARAM + VpuWriteReg(coreIdx, W4_CMD_ENC_HOST_PIC_QP, option->hostRcPicQp); + VpuWriteReg(coreIdx, W4_CMD_ENC_HOST_PIC_TARGET_BIT, + option->hostRcTargetPicBit); +#endif + +#if DUMP_REG + cviDumpVpuReg(coreIdx); +#endif + + CVI_VC_FLOW("ENC_PIC\n"); + +#if PROFILE_PERFORMANCE + timer_meter_start(); +#endif + + instance->u64StartTime = cviGetCurrentTime(); + + Wave4BitIssueCommand(instance, ENC_PIC); + + return RETCODE_SUCCESS; +} + +static void Wave4VpuEncCalcPicQp(EncParam *option) +{ +#ifdef SUPPORT_HOST_RC_PARAM + option->hostRcTargetPicBit = option->u32FrameBits; + option->hostRcPicQp = option->u32FrameQp; + + CVI_VC_UBR("hostRcTargetPicBit = %d, hostRcPicQp = %d\n", + option->hostRcTargetPicBit, option->hostRcPicQp); +#endif +} + +#if DUMP_REG +static void cviDumpVpuReg(Int32 coreIdx) +{ + Int32 idx; + + for (idx = 0x100; idx <= 0x200; idx += 0x10) { + printf("0x%04X %08X %08X %08X %08X\n", idx, + VpuReadReg(coreIdx, idx), VpuReadReg(coreIdx, idx + 0x4), + VpuReadReg(coreIdx, idx + 0x8), + VpuReadReg(coreIdx, idx + 0xC)); + } +} +#endif + +RetCode Wave4VpuEncGetResult(CodecInst *instance, EncOutputInfo *result) +{ + Uint32 encodingSuccess, errorReason = 0; + Uint32 regVal; + Int32 coreIdx; + EncInfo *pEncInfo = VPU_HANDLE_TO_ENCINFO(instance); + stRcInfo *pRcInfo = &instance->rcInfo; + + coreIdx = instance->coreIdx; + +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) + vdi_log(coreIdx, ENC_PIC, 0); +#endif + + encodingSuccess = VpuReadReg(coreIdx, W4_RET_SUCCESS); + + if (encodingSuccess == FALSE) { + CVI_VC_ERR("encodingSuccess = %d\n", encodingSuccess); + + errorReason = VpuReadReg(coreIdx, W4_RET_FAIL_REASON); + if (errorReason == WAVE4_SYSERR_WRITEPROTECTION) { + CVI_VC_ERR( + "errorReason == WAVE4_SYSERR_WRITEPROTECTION\n"); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_print_vpu_status(coreIdx); +#endif + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + if (errorReason == WAVE4_SYSERR_CP0_DATA_ACCESS_VIOLATION || + errorReason == WAVE4_SYSERR_CP0_INST_ADDR_ALIGN || + errorReason == WAVE4_SYSERR_CP0_DATA_ADDR_ALIGN || + errorReason == WAVE4_SYSERR_CP0_PRIVILEDGE_VIOLATION || + errorReason == WAVE4_SYSERR_CP0_WRITE_PROT) { + CVI_VC_ERR( + "errorReason == WAVE4_SYSERR_CP0_EXCEPTION\n"); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_print_vpu_status(coreIdx); +#endif + return RETCODE_CP0_EXCEPTION; + } + if (errorReason == WAVE4_SYSERR_STREAM_BUF_FULL) { + CVI_VC_ERR( + "errorReason == WAVE4_SYSERR_STREAM_BUF_FULL\n"); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_print_vpu_status(coreIdx); +#endif + return RETCODE_STREAM_BUF_FULL; + } + if (errorReason == WAVE4_SYSERR_ACCESS_VIOLATION_HW) { + CVI_VC_ERR( + "errorReason == WAVE4_SYSERR_ACCESS_VIOLATION_HW\n"); +#ifdef ENABLE_CNM_DEBUG_MSG + vdi_print_vpu_status(coreIdx); +#endif + return RETCODE_ACCESS_VIOLATION_HW; + } + CVI_VC_ERR("errorReason 0x%x\n", errorReason); + return RETCODE_FAILURE; + } + + result->encPicCnt = VpuReadReg(coreIdx, W4_RET_ENC_PIC_NUM); + pEncInfo->frameIdx = result->encPicCnt; + regVal = VpuReadReg(coreIdx, W4_RET_ENC_PIC_TYPE); + result->picType = regVal & 0xFFFF; + result->encVclNal = VpuReadReg(coreIdx, W4_RET_ENC_VCL_NUT); + result->reconFrameIndex = VpuReadReg(coreIdx, W4_RET_ENC_PIC_IDX); + +#ifdef REPORT_PIC_SUM_VAR + result->sumPicVar = VpuReadReg(coreIdx, W4_RET_ENC_PIC_SUM_VAR); +#endif + + if (result->reconFrameIndex >= 0) + result->reconFrame = + pEncInfo->frameBufPool[result->reconFrameIndex]; + + result->numOfSlices = VpuReadReg(coreIdx, W4_RET_ENC_PIC_SLICE_NUM); + result->picSkipped = VpuReadReg(coreIdx, W4_RET_ENC_PIC_SKIP); + result->numOfIntra = VpuReadReg(coreIdx, W4_RET_ENC_PIC_NUM_INTRA); + result->numOfMerge = VpuReadReg(coreIdx, W4_RET_ENC_PIC_NUM_MERGE); + result->numOfSkipBlock = VpuReadReg(coreIdx, W4_RET_ENC_PIC_NUM_SKIP); + regVal = VpuReadReg(coreIdx, W4_RET_ENC_PIC_FLAG); + result->bitstreamWrapAround = regVal & 0x01; + result->avgCtuQp = VpuReadReg(coreIdx, W4_RET_ENC_PIC_AVG_CU_QP); + pEncInfo->pic_ctu_avg_qp = result->avgCtuQp; + result->u32MeanQp = result->avgCtuQp; + result->encPicByte = VpuReadReg(coreIdx, W4_RET_ENC_PIC_BYTE); + result->encGopPicIdx = VpuReadReg(coreIdx, W4_RET_ENC_GOP_PIC_IDX); + result->encPicPoc = VpuReadReg(coreIdx, W4_RET_ENC_PIC_POC); + result->encSrcIdx = VpuReadReg(coreIdx, W4_RET_ENC_USED_SRC_IDX); + result->frameCycle = VpuReadReg(coreIdx, W4_FRAME_CYCLE); + pEncInfo->streamWrPtr = vdi_remap_memory_address( + coreIdx, VpuReadReg(coreIdx, pEncInfo->streamWrPtrRegAddr)); + + if (pEncInfo->ringBufferEnable == 0) { + result->bitstreamBuffer = vdi_remap_memory_address( + coreIdx, + VpuReadReg(coreIdx, pEncInfo->streamRdPtrRegAddr)); + } + result->rdPtr = pEncInfo->streamRdPtr; + result->wrPtr = pEncInfo->streamWrPtr; + + if (result->reconFrameIndex < 0) + result->bitstreamSize = 0; + else + result->bitstreamSize = result->encPicByte; + + CVI_VC_BS("bitstreamSize = 0x%X, bitstreamBuffer = 0x%llX\n" + "rdPtr = 0x%llX, wrPtr = 0x%llX\n", + result->bitstreamSize, result->bitstreamBuffer, result->rdPtr, + result->wrPtr); + + /* + * bEsBufQueueEn mode, when I frame result bitstream size + * is little larger than the left bitstream size(result->wrPtr - result->rdPt) + * HW maybe not trigger BUFF FULL irq but wrPtr will go back to roiginal position + * the result->bitstreamSize is read from W4_RET_ENC_PIC_BYTE and result is right + * so need update streamWrPtrRegAddr + * eg: + * left bitstream size 200KB, wrPtr = 0x1000_0000, rdPt = 0x0x1000_0000 + * actually I fream result bitstream size 200KB+100B + * for right scene: + * wrPtr = 0x1000_0000 + 200KB+100B, rdPt = 0x0x1000_0000 + * size = wrPtr - rdPt = 200KB+100B + * + * for bad error scene: + * wrPtr = 0x1000_0000 + 100B, rdPt = 0x0x1000_0000 + * size = wrPtr - rdPt = 100B + * + */ + if (result->bitstreamSize != (Uint32) (result->wrPtr - result->rdPtr)) { + CVI_VC_BS("result->bitstreamSize != (result->wrPtr - result->rdPtr)\n"); + if (!instance->bBuffFull) { + CVI_VC_BS("update streamWrPtr:0x%llx to 0x%llx\n", pEncInfo->streamWrPtr, result->bitstreamBuffer + result->bitstreamSize); + VpuWriteReg(coreIdx, pEncInfo->streamWrPtrRegAddr, result->bitstreamBuffer + result->bitstreamSize); + + pEncInfo->streamWrPtr = vdi_remap_memory_address( + coreIdx, VpuReadReg(coreIdx, pEncInfo->streamWrPtrRegAddr)); + + result->wrPtr = pEncInfo->streamWrPtr; + CVI_VC_BS("after update streamWrPtr:0x%llx, wrPtr = 0x%llx\n", pEncInfo->streamWrPtr, result->wrPtr); + } + } + + +#ifdef REPORT_PIC_SUM_VAR + CVI_VC_RC("sumPicVar = %d\n", result->sumPicVar); +#endif + + if (pRcInfo->rcMode == RC_MODE_UBR && pRcInfo->bTestUbrEn) { + Uint32 real_pic_bit = result->bitstreamSize << 3; + int avg_qp = result->u32MeanQp; + + rcLibUpdateRc(instance, result, avg_qp, real_pic_bit); + pEncInfo->encoded_frames_in_gop++; + } + + printResult(pEncInfo, result); + + return RETCODE_SUCCESS; +} + +static void printResult(EncInfo *pEncInfo, EncOutputInfo *result) +{ + CVI_VC_TRACE("encPicCnt = %d\n", result->encPicCnt); + CVI_VC_TRACE("picType = %d\n", result->picType); + CVI_VC_TRACE("encVclNal = %d\n", result->encVclNal); + CVI_VC_TRACE("reconFrameIndex = %d\n", result->reconFrameIndex); + CVI_VC_TRACE("numOfSlices = %d\n", result->numOfSlices); + CVI_VC_TRACE("picSkipped = %d\n", result->picSkipped); + CVI_VC_TRACE("numOfIntra = %d\n", result->numOfIntra); + CVI_VC_TRACE("numOfMerge = %d\n", result->numOfMerge); + CVI_VC_TRACE("numOfSkipBlock = %d\n", result->numOfSkipBlock); + CVI_VC_TRACE("bitstreamWrapAround = %d\n", result->bitstreamWrapAround); + CVI_VC_TRACE("avgCtuQp = %d\n", result->avgCtuQp); + CVI_VC_TRACE("encPicByte = 0x%X\n", result->encPicByte); + CVI_VC_TRACE("encGopPicIdx = %d\n", result->encGopPicIdx); + CVI_VC_TRACE("encPicPoc = %d\n", result->encPicPoc); + CVI_VC_TRACE("encSrcIdx = %d\n", result->encSrcIdx); + CVI_VC_TRACE("frameCycle = %d\n", result->frameCycle); + if (pEncInfo->ringBufferEnable == 0) { + CVI_VC_TRACE("bitstreamBuffer = 0x%llX\n", + result->bitstreamBuffer); + } + + CVI_VC_TRACE("rdPtr = 0x%llX\n", result->rdPtr); + CVI_VC_TRACE("wrPtr = 0x%llX\n", result->wrPtr); + CVI_VC_TRACE("bitstreamSize = 0x%X\n", result->bitstreamSize); + CVI_VC_FLOW("rdPtr = 0x%llX, wrPtr = 0x%llX, bitstreamSize = 0x%X\n", + result->rdPtr, result->wrPtr, result->bitstreamSize); +} + +RetCode Wave4VpuEncGetHeader(EncHandle instance, EncHeaderParam *encHeaderParam) +{ + EncInfo *pEncInfo; + EncOpenParam *encOP; + PhysicalAddress rdPtr; + PhysicalAddress wrPtr; + Int32 coreIdx, bsEndian, regVal, int_reason; + RetCode ret; + + CVI_VC_TRACE("\n"); + + pEncInfo = VPU_HANDLE_TO_ENCINFO(instance); + encOP = &(pEncInfo->openParam); + coreIdx = instance->coreIdx; + + regVal = vdi_convert_endian(coreIdx, encOP->streamEndian); + /* NOTE: When endian mode is 0, SDMA reads MSB first */ + bsEndian = (~regVal & VDI_128BIT_ENDIAN_MASK); + + if (pEncInfo->ringBufferEnable == 1) { + VpuWriteReg(coreIdx, W4_BS_START_ADDR, + pEncInfo->streamBufStartAddr); + VpuWriteReg(coreIdx, W4_BS_SIZE, pEncInfo->streamBufSize); + } else { + Wave4SetEncBitStreamInfo(instance, encHeaderParam, NULL); + } + + VpuWriteReg(coreIdx, W4_BS_PARAM, + (pEncInfo->lineBufIntEn << 6) | + (pEncInfo->sliceIntEnable << 5) | + (pEncInfo->ringBufferEnable << 4) | bsEndian); + VpuWriteReg(coreIdx, W4_BS_OPTION, 0); + /* Set up work-buffer */ + VpuWriteReg(coreIdx, W4_ADDR_WORK_BASE, pEncInfo->vbWork.phys_addr); + VpuWriteReg(coreIdx, W4_WORK_SIZE, pEncInfo->vbWork.size); + VpuWriteReg(coreIdx, W4_WORK_PARAM, 0); + + /* Set up temp-buffer */ + VpuWriteReg(coreIdx, W4_ADDR_TEMP_BASE, pEncInfo->vbTemp.phys_addr); + VpuWriteReg(coreIdx, W4_TEMP_SIZE, pEncInfo->vbTemp.size); + VpuWriteReg(coreIdx, W4_TEMP_PARAM, 0); + + VpuWriteReg(coreIdx, pEncInfo->streamRdPtrRegAddr, + pEncInfo->streamRdPtr); + VpuWriteReg(coreIdx, pEncInfo->streamWrPtrRegAddr, + pEncInfo->streamWrPtr); + + /* Secondary AXI */ + VpuWriteReg(coreIdx, W4_ADDR_SEC_AXI, pEncInfo->secAxiInfo.bufBase); + VpuWriteReg(coreIdx, W4_SEC_AXI_SIZE, pEncInfo->secAxiInfo.bufSize); + VpuWriteReg( + coreIdx, W4_USE_SEC_AXI, + (pEncInfo->secAxiInfo.u.wave4.useEncImdEnable << 9) | + (pEncInfo->secAxiInfo.u.wave4.useEncRdoEnable << 11) | + (pEncInfo->secAxiInfo.u.wave4.useEncLfEnable << 15)); + + VpuWriteReg(coreIdx, W4_CMD_ENC_SRC_PIC_IDX, 0); + VpuWriteReg(coreIdx, W4_CMD_ENC_CODE_OPTION, + encHeaderParam->headerType); + + CVI_VC_TRACE("ENC_PIC, headerType = 0x%X\n", + encHeaderParam->headerType); + Wave4BitIssueCommand(instance, ENC_PIC); + + do { + int_reason = vdi_wait_interrupt(coreIdx, VPU_ENC_TIMEOUT, NULL); + } while (int_reason == -1 && __VPU_BUSY_TIMEOUT == 0); + if (int_reason == -1) { + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + + CVI_VC_TRACE("int_reason = 0x%X\n", int_reason); + + VpuWriteReg(coreIdx, W4_VPU_VINT_REASON_CLR, int_reason); + VpuWriteReg(coreIdx, W4_VPU_VINT_CLEAR, 1); + +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) + vdi_log(coreIdx, ENC_PIC, 0); +#endif + + rdPtr = vdi_remap_memory_address( + coreIdx, VpuReadReg(coreIdx, pEncInfo->streamRdPtrRegAddr)); + wrPtr = vdi_remap_memory_address( + coreIdx, VpuReadReg(coreIdx, pEncInfo->streamWrPtrRegAddr)); + encHeaderParam->buf = rdPtr; + encHeaderParam->size = VpuReadReg(coreIdx, W4_RET_ENC_PIC_BYTE); + + CVI_VC_BS("buf = 0x%llX, size = 0x%zx\n", encHeaderParam->buf, + encHeaderParam->size); + + pEncInfo->streamWrPtr = wrPtr; + pEncInfo->streamRdPtr = rdPtr; + + regVal = VpuReadReg(coreIdx, W4_RET_SUCCESS); + if (regVal == 0) { + encHeaderParam->failReasonCode = + VpuReadReg(coreIdx, W4_RET_FAIL_REASON); + ret = RETCODE_FAILURE; + CVI_VC_ERR("failReasonCode = 0x%X\n", + encHeaderParam->failReasonCode); + } else { + ret = RETCODE_SUCCESS; + } + + return ret; +} + +RetCode Wave4VpuEncParaChange(EncHandle instance, EncChangeParam *param) +{ + EncInfo *pEncInfo; + EncOpenParam *encOP; + Int32 coreIdx, bsEndian, regVal, int_reason = 0; + + pEncInfo = VPU_HANDLE_TO_ENCINFO(instance); + encOP = &(pEncInfo->openParam); + coreIdx = instance->coreIdx; + + regVal = vdi_convert_endian(coreIdx, encOP->streamEndian); + /* NOTE: When endian mode is 0, SDMA reads MSB first */ + bsEndian = (~regVal & VDI_128BIT_ENDIAN_MASK); + + VpuWriteReg(coreIdx, W4_BS_PARAM, + (pEncInfo->lineBufIntEn << 6) | + (pEncInfo->sliceIntEnable << 5) | + (pEncInfo->ringBufferEnable << 4) | bsEndian); + + /* Secondary AXI */ + VpuWriteReg(coreIdx, W4_ADDR_SEC_AXI, pEncInfo->secAxiInfo.bufBase); + VpuWriteReg(coreIdx, W4_SEC_AXI_SIZE, pEncInfo->secAxiInfo.bufSize); + VpuWriteReg( + coreIdx, W4_USE_SEC_AXI, + (pEncInfo->secAxiInfo.u.wave4.useEncImdEnable << 9) | + (pEncInfo->secAxiInfo.u.wave4.useEncRdoEnable << 11) | + (pEncInfo->secAxiInfo.u.wave4.useEncLfEnable << 15)); + + /* Set up work-buffer */ + VpuWriteReg(coreIdx, W4_ADDR_WORK_BASE, pEncInfo->vbWork.phys_addr); + VpuWriteReg(coreIdx, W4_WORK_SIZE, pEncInfo->vbWork.size); + VpuWriteReg(coreIdx, W4_WORK_PARAM, 0); + + /* Set up temp-buffer */ + VpuWriteReg(coreIdx, W4_ADDR_TEMP_BASE, pEncInfo->vbTemp.phys_addr); + VpuWriteReg(coreIdx, W4_TEMP_SIZE, pEncInfo->vbTemp.size); + VpuWriteReg(coreIdx, W4_TEMP_PARAM, 0); + + /* Set up reporting-buffer */ + VpuWriteReg(coreIdx, W4_CMD_ENC_ADDR_REPORT_BASE, 0); + VpuWriteReg(coreIdx, W4_CMD_ENC_REPORT_SIZE, 0); + VpuWriteReg(coreIdx, W4_CMD_ENC_REPORT_PARAM, 0); + + /* change COMMON parameters */ + if (param->changeParaMode == OPT_COMMON) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SET_PARAM_OPTION, OPT_COMMON); + VpuWriteReg(coreIdx, W4_CMD_ENC_SET_PARAM_ENABLE, + param->enable_option); + + if (param->enable_option & ENC_PIC_PARAM_CHANGE) { + if (instance->productId == PRODUCT_ID_420) { + regVal = (param->losslessEnable << 21) | + (param->constIntraPredFlag << 22); + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_PIC_PARAM, + regVal); + } else { // WAVE420L + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_PIC_PARAM, + (param->losslessEnable << 20) | + (param->constIntraPredFlag + << 21) | + ((param->chromaCbQpOffset & + 0x1f) + << 22) | + ((param->chromaCrQpOffset & + 0x1f) + << 27)); + } + } + + if (param->enable_option & ENC_INTRA_PARAM_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_INTRA_PARAM, + (param->decodingRefreshType << 0) | + (param->intraQP << 3) | + (param->intraPeriod << 16)); + } + + if (param->enable_option & ENC_CONF_WIN_TOP_BOT_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_CONF_WIN_TOP_BOT, + param->confWinBot << 16 | + param->confWinTop); + } + + if (param->enable_option & ENC_CONF_WIN_LEFT_RIGHT_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_CONF_WIN_LEFT_RIGHT, + param->confWinRight << 16 | + param->confWinLeft); + } + + if (param->enable_option & ENC_FRAME_RATE_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_FRAME_RATE, + param->frameRate); + } + + if (param->enable_option & ENC_RC_INTRA_MIN_MAX_QP_CHANGE) { + if (instance->productId == PRODUCT_ID_420) { + VpuWriteReg(coreIdx, + W4_CMD_ENC_RC_INTRA_MIN_MAX_QP, + param->intraMaxQp << 6 | + param->intraMinQp); + } + } + + if (param->enable_option & ENC_NUM_UNITS_IN_TICK_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_NUM_UNITS_IN_TICK, + param->numUnitsInTick); + } + + if (param->enable_option & ENC_TIME_SCALE_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_TIME_SCALE, + param->timeScale); + } + + if (param->enable_option & ENC_INDEPENDENT_SLICE_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_INDEPENDENT_SLICE, + param->independSliceModeArg << 16 | + param->independSliceMode); + } + + if (param->enable_option & ENC_DEPENDENT_SLICE_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_DEPENDENT_SLICE, + param->dependSliceModeArg << 16 | + param->dependSliceMode); + } + + if (param->enable_option & ENC_INTRA_REFRESH_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_SEQ_INTRA_REFRESH, + param->intraRefreshArg << 16 | + param->intraRefreshMode); + } + + if (param->enable_option & ENC_PARAM_CHANGE) { + VpuWriteReg( + coreIdx, W4_CMD_ENC_PARAM, + (param->useRecommendEncParam) | + (param->scalingListEnable << 3) | + (0x7 << 4) | // cuSizeMode should be + // always 0x7 (should use + // all cu size (cu8x8, + // cu16x16, cu32x32)) + (param->tmvpEnable << 7) | + (param->wppEnable << 8) | + (param->maxNumMerge << 9) | + (param->dynamicMerge8x8Enable << 12) | + (param->dynamicMerge16x16Enable << 13) | + (param->dynamicMerge32x32Enable << 14) | + (param->disableDeblk << 15) | + (param->lfCrossSliceBoundaryEnable + << 16) | + ((param->betaOffsetDiv2 & 0xF) << 17) | + ((param->tcOffsetDiv2 & 0xF) << 21) | + (param->skipIntraTrans << 25) | + (param->saoEnable << 26) | + (param->intraInInterSliceEnable << 27) | +#ifdef SUPPORT_HOST_RC_PARAM + (param->hostPicRCEnable << 29) | +#endif + (param->intraNxNEnable << 28)); + } + if (param->enable_option & ENC_RC_PARAM_CHANGE) { + if (instance->productId == PRODUCT_ID_420) { + VpuWriteReg( + coreIdx, W4_CMD_ENC_RC_PARAM, + (param->rcEnable << 0) | + (param->cuLevelRCEnable << 1) | + (param->hvsQPEnable << 2) | + (param->hvsQpScaleEnable << 3) | + (param->hvsQpScale << 4) | + (param->bitAllocMode << 8) | + (param->initBufLevelx8 << 10) | + /* [15] reserved */ + (param->initialDelay << 16)); + } else { + VpuWriteReg( + coreIdx, W4_CMD_ENC_RC_PARAM, + (param->rcEnable << 0) | + (param->cuLevelRCEnable << 1) | + (param->hvsQPEnable << 2) | + (param->hvsQpScaleEnable << 3) | + (param->hvsQpScale << 4) | + (param->bitAllocMode << 7) | + (param->initBufLevelx8 << 9) | + (param->initialRcQp << 14) | + (param->initialDelay << 20)); + } + } + + if (param->enable_option & ENC_RC_MIN_MAX_QP_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_MIN_MAX_QP, + (param->minQp << 0) | (param->maxQp << 6) | + (param->maxDeltaQp << 12) | + (param->intraQpOffset << 18)); + } + + if (param->enable_option & + ENC_RC_TARGET_RATE_LAYER_0_3_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_BIT_RATIO_LAYER_0_3, + (param->fixedBitRatio[0] << 0) | + (param->fixedBitRatio[1] << 8) | + (param->fixedBitRatio[2] << 16) | + (param->fixedBitRatio[3] << 24)); + } + + if (param->enable_option & + ENC_RC_TARGET_RATE_LAYER_4_7_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_BIT_RATIO_LAYER_4_7, + (param->fixedBitRatio[4] << 0) | + (param->fixedBitRatio[5] << 8) | + (param->fixedBitRatio[6] << 16) | + (param->fixedBitRatio[7] << 24)); + } + if (param->enable_option & ENC_NR_PARAM_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_NR_PARAM, + (param->nrYEnable << 0) | + (param->nrCbEnable << 1) | + (param->nrCrEnable << 2) | + (param->nrNoiseEstEnable << 3) | + (param->nrNoiseSigmaY << 4) | + (param->nrNoiseSigmaCb << 12) | + (param->nrNoiseSigmaCr << 20)); + } + + if (param->enable_option & ENC_NR_WEIGHT_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_NR_WEIGHT, + (param->nrIntraWeightY << 0) | + (param->nrIntraWeightCb << 5) | + (param->nrIntraWeightCr << 10) | + (param->nrInterWeightY << 15) | + (param->nrInterWeightCb << 20) | + (param->nrInterWeightCr << 25)); + } + + if (param->enable_option & ENC_RC_TRANS_RATE_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_TRANS_RATE, + param->transRate); + } + + if (param->enable_option & ENC_RC_TARGET_RATE_CHANGE) { + VpuWriteReg(coreIdx, W4_CMD_ENC_RC_TARGET_RATE, + param->bitRate * 1000); + } + + if (param->enable_option & ENC_ROT_PARAM_CHANGE) { + Uint32 rotMirMode = 0; + + /* CMD_ENC_ROT_MODE : + * | hor_mir | ver_mir | rot_angle | + * rot_en | [4] [3] [2:1] [0] + */ + + // VPU can't support below cases that should be + // re-allocated framebuffers. + if (pEncInfo->rotationEnable == FALSE) { // previous + // rotator is + // disabled, + // change to + // rotator + // enable with + // angle + // 90/270. + if (param->rotEnable == TRUE && + ((param->rotMode & 0x3) == 1 || + (param->rotMode & 0x3) == 3)) { + return RETCODE_INVALID_PARAM; + } + } else { // previous rotator angle is not matched with + // current angle. (0/180 => 90/270, 90/270 => + // 0/180) + if ((pEncInfo->rotationAngle == 90 || + pEncInfo->rotationAngle == 270) && + ((param->rotMode & 0x3) == 0 || + (param->rotMode & 0x3) == 2)) { + return RETCODE_INVALID_PARAM; + } + + if ((pEncInfo->rotationAngle == 0 || + pEncInfo->rotationAngle == 180) && + ((param->rotMode & 0x3) == 1 || + (param->rotMode & 0x3) == 3)) { + return RETCODE_INVALID_PARAM; + } + } + + if (param->rotEnable == TRUE) { + rotMirMode |= 0x1; + rotMirMode |= param->rotMode << 1; + } + VpuWriteReg(coreIdx, W4_CMD_ENC_ROT_PARAM, rotMirMode); + } + + Wave4BitIssueCommand(instance, SET_PARAM); + + do { + int_reason = vdi_wait_interrupt(coreIdx, + VPU_ENC_TIMEOUT, NULL); + } while (int_reason == -1 && __VPU_BUSY_TIMEOUT == 0); + if (int_reason == -1) { +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) { + vdi_log(coreIdx, SET_PARAM, 0); + } +#endif + return RETCODE_VPU_RESPONSE_TIMEOUT; + } + VpuWriteReg(coreIdx, W4_VPU_VINT_REASON_CLR, int_reason); + VpuWriteReg(coreIdx, W4_VPU_VINT_CLEAR, 1); + +#ifdef ENABLE_CNM_DEBUG_MSG + if (instance->loggingEnable) + vdi_log(coreIdx, SET_PARAM, 0); +#endif + + if (VpuReadReg(coreIdx, W4_RET_SUCCESS) == 0) { + if (VpuReadReg(coreIdx, W4_RET_FAIL_REASON) == + WAVE4_SYSERR_WRITEPROTECTION) { + return RETCODE_MEMORY_ACCESS_VIOLATION; + } + return RETCODE_FAILURE; + } + } + + return RETCODE_SUCCESS; +} + +#ifdef REDUNDENT_CODE +RetCode Wave4VpuEncGiveCommand(CodecInst *pCodecInst, CodecCommand cmd, + void *param) +{ + RetCode ret = RETCODE_SUCCESS; + + UNREFERENCED_PARAMETER(pCodecInst); + UNREFERENCED_PARAMETER(param); + + switch (cmd) { + default: + ret = RETCODE_NOT_SUPPORTED_FEATURE; + } + + return ret; +} +#endif + +RetCode CheckEncCommonParamValid(EncOpenParam *pop) +{ + RetCode ret = RETCODE_SUCCESS; + Int32 low_delay = 0; + Int32 intra_period_gop_step_size; + Int32 i; + + EncHevcParam *param = &pop->EncStdParam.hevcParam; + + // check low-delay gop structure + if (param->gopPresetIdx == 0) { + // common gop + Int32 minVal = 0; + if (param->gopParam.customGopSize > 1) { + minVal = param->gopParam.picParam[0].pocOffset; + low_delay = 1; + for (i = 1; i < param->gopParam.customGopSize; i++) { + if (minVal <= + param->gopParam.picParam[i].pocOffset) { + minVal = param->gopParam.picParam[i] + .pocOffset; + } else { + low_delay = 0; + break; + } + } + } + } else if (param->gopPresetIdx == 2 || param->gopPresetIdx == 3 || + param->gopPresetIdx == 6 || + param->gopPresetIdx == 7) // low-delay case (IPPP, IBBB) + low_delay = 1; + + if (low_delay) { + intra_period_gop_step_size = 1; + } else { + if (param->gopPresetIdx == PRESET_IDX_CUSTOM_GOP) { + intra_period_gop_step_size = + param->gopParam.customGopSize; + } else { + intra_period_gop_step_size = + presetGopSize[param->gopPresetIdx]; + } + } + + if (param->gopPresetIdx >= PRESET_IDX_T0S && + param->gopPresetIdx <= PRESET_IDX_T2ST1L) { + intra_period_gop_step_size = 1; + } + + if (!low_delay && (param->intraPeriod != 0) && + ((param->intraPeriod % intra_period_gop_step_size) != 0) && + (param->decodingRefreshType != 0)) { + VLOG(ERR, + "CFG FAIL : Not support intra period[%d] for the gop structure\n", + param->intraPeriod); + VLOG(ERR, "RECOMMEND CONFIG PARAMETER : Intra period = %d\n", + intra_period_gop_step_size * + (param->intraPeriod / intra_period_gop_step_size)); + ret = RETCODE_FAILURE; + } + + if (!low_delay && (param->intraPeriod != 0) && + ((param->intraPeriod % intra_period_gop_step_size) == 1) && + param->decodingRefreshType == 0) { + VLOG(ERR, + "CFG FAIL : Not support decoding refresh type[%d] for closed gop structure\n", + param->decodingRefreshType); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : Decoding refresh type = IDR\n"); + ret = RETCODE_FAILURE; + } + + if (param->gopPresetIdx == PRESET_IDX_CUSTOM_GOP) { + for (i = 0; i < param->gopParam.customGopSize; i++) { + if (param->gopParam.picParam[i].temporalId >= + MAX_NUM_TEMPORAL_LAYER) { + VLOG(ERR, + "CFG FAIL : temporalId %d exceeds MAX_NUM_TEMPORAL_LAYER\n", + param->gopParam.picParam[i].temporalId); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : Adjust temporal ID under MAX_NUM_TEMPORAL_LAYER(7) in GOP structure\n"); + ret = RETCODE_FAILURE; + } + + if (param->gopParam.picParam[i].temporalId < 0) { + VLOG(ERR, + "CFG FAIL : Must be %d-th temporal_id >= 0\n", + param->gopParam.picParam[i].temporalId); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : Adjust temporal layer above '0' in GOP structure\n"); + ret = RETCODE_FAILURE; + } + } + } + + if (param->useRecommendEncParam == 0) { + // Intra + if (param->intraInInterSliceEnable == 0 && + param->intraRefreshMode != 0) { + VLOG(ERR, + "CFG FAIL : If intraInInterSliceEnable is '0', Intra refresh mode must be '0'\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : intraRefreshMode = 0\n"); + ret = RETCODE_FAILURE; + } + + // RDO + { + int align_32_width_flag = pop->picWidth % 32; + int align_16_width_flag = pop->picWidth % 16; + int align_8_width_flag = pop->picWidth % 8; + int align_32_height_flag = pop->picHeight % 32; + int align_16_height_flag = pop->picHeight % 16; + int align_8_height_flag = pop->picHeight % 8; + if (param->cuSizeMode != 0x7) { + // [CEZ-1865] + VLOG(ERR, + "All CU size mode should be enabled.\n"); + ret = RETCODE_FAILURE; + } + if (((param->cuSizeMode & 0x1) == 0) && + ((align_8_width_flag != 0) || + (align_8_height_flag != 0))) { + VLOG(ERR, + "CFG FAIL : Picture width and height must be aligned with 8 pixels when enable CU8x8 of cuSizeMode\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : cuSizeMode |= 0x1 (CU8x8)\n"); + ret = RETCODE_FAILURE; + } else if (((param->cuSizeMode & 0x1) == 0) && + ((param->cuSizeMode & 0x2) == 0) && + ((align_16_width_flag != 0) || + (align_16_height_flag != 0))) { + VLOG(ERR, + "CFG FAIL : Picture width and height must be aligned with 16 pixels when enable CU16x16 of cuSizeMode\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : cuSizeMode |= 0x2 (CU16x16)\n"); + ret = RETCODE_FAILURE; + } else if (((param->cuSizeMode & 0x1) == 0) && + ((param->cuSizeMode & 0x2) == 0) && + ((param->cuSizeMode & 0x4) == 0) && + ((align_32_width_flag != 0) || + (align_32_height_flag != 0))) { + VLOG(ERR, + "CFG FAIL : Picture width and height must be aligned with 32 pixels when enable CU32x32 of cuSizeMode\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : cuSizeMode |= 0x4 (CU32x32)\n"); + ret = RETCODE_FAILURE; + } + } + + // multi-slice & wpp + if (param->wppEnable == 1 && (param->independSliceMode != 0 || + param->dependSliceMode != 0)) { + VLOG(ERR, + "CFG FAIL : If WaveFrontSynchro(WPP) '1', the option of multi-slice must be '0'\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : independSliceMode = 0, dependSliceMode = 0\n"); + ret = RETCODE_FAILURE; + } + } + + // Slice + { + if (param->independSliceMode == 0 && + param->dependSliceMode != 0) { + VLOG(ERR, + "CFG FAIL : If independSliceMode is '0', dependSliceMode must be '0'\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : independSliceMode = 1, independSliceModeArg = TotalCtuNum\n"); + ret = RETCODE_FAILURE; + } else if ((param->independSliceMode == 1) && + (param->dependSliceMode == 1)) { + if (param->independSliceModeArg < + param->dependSliceModeArg) { + VLOG(ERR, + "CFG FAIL : If independSliceMode & dependSliceMode is both '1' (multi-slice with ctu count), must be independSliceModeArg >= dependSliceModeArg\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : dependSliceMode = 0\n"); + ret = RETCODE_FAILURE; + } + } + + if (param->independSliceMode != 0) { + if (param->independSliceModeArg > 65535) { + VLOG(ERR, + "CFG FAIL : If independSliceMode is not 0, must be independSliceModeArg <= 0xFFFF\n"); + ret = RETCODE_FAILURE; + } + } + + if (param->dependSliceMode != 0) { + if (param->dependSliceModeArg > 65535) { + VLOG(ERR, + "CFG FAIL : If dependSliceMode is not 0, must be dependSliceModeArg <= 0xFFFF\n"); + ret = RETCODE_FAILURE; + } + } + } + + if (param->confWinTop % 2) { + VLOG(ERR, + "CFG FAIL : conf_win_top : %d value is not available. The value should be equal to multiple of 2.\n", + param->confWinTop); + ret = RETCODE_FAILURE; + } + + if (param->confWinBot % 2) { + VLOG(ERR, + "CFG FAIL : conf_win_bot : %d value is not available. The value should be equal to multiple of 2.\n", + param->confWinBot); + ret = RETCODE_FAILURE; + } + + if (param->confWinLeft % 2) { + VLOG(ERR, + "CFG FAIL : conf_win_left : %d value is not available. The value should be equal to multiple of 2.\n", + param->confWinLeft); + ret = RETCODE_FAILURE; + } + + if (param->confWinRight % 2) { + VLOG(ERR, + "CFG FAIL : conf_win_right : %d value is not available. The value should be equal to multiple of 2.\n", + param->confWinRight); + ret = RETCODE_FAILURE; + } + + return ret; +} + +RetCode CheckEncRcParamValid(EncOpenParam *pop) +{ + RetCode ret = RETCODE_SUCCESS; + EncHevcParam *param = &pop->EncStdParam.hevcParam; + + if (pop->rcEnable == 1) { + int frameRateDiv, frameRateRes, frameRate; + + if (((pop->bitRate * 1000) > param->transRate) && + (param->transRate != 0)) { + VLOG(ERR, + "CFG FAIL : Not allowed bitRate > transRate\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : bitRate = transRate (CBR)\n"); + CVI_VC_ERR("bitRate = %dk, transRate = %d\n", + pop->bitRate, param->transRate); + ret = RETCODE_FAILURE; + } + + if (pop->userQpMinP > pop->userQpMaxP) { + VLOG(ERR, "CFG FAIL : Not allowed MinQP > MaxQP\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : MinQP = MaxQP\n"); + ret = RETCODE_FAILURE; + } + + frameRateDiv = (pop->frameRateInfo >> 16) + 1; + frameRateRes = pop->frameRateInfo & 0xFFFF; + frameRate = frameRateRes / frameRateDiv; + + if (pop->bitRate * 1000 <= (int)frameRate) { + VLOG(ERR, + "CFG FAIL : Not allowed EncBitRate <= FrameRate\n"); + VLOG(ERR, + "RECOMMEND CONFIG PARAMETER : EncBitRate = FrameRate * 10000\n"); + ret = RETCODE_FAILURE; + } + } + + return ret; +} + +Uint32 Wave4VpuGetFrameCycle(Uint32 coreIdx) +{ + return VpuReadReg(coreIdx, W4_FRAME_CYCLE); +} diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.h new file mode 100644 index 0000000000..e0d1c70cde --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4.h @@ -0,0 +1,58 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2011 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- +#ifndef __WAVE410_FUNCTION_H__ +#define __WAVE410_FUNCTION_H__ + +#include "vpuapi.h" +#include "product.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern RetCode Wave4VpuDecInitSeq(CodecInst *instance); + +extern RetCode Wave4VpuDecode(CodecInst *instance, DecParam *option); + +extern RetCode Wave4VpuDecGetResult(CodecInst *instance, DecOutputInfo *result); + +extern RetCode Wave4VpuDecGetSeqInfo(CodecInst *instance, DecInitialInfo *info); + +extern RetCode Wave4VpuEncRegisterFramebuffer(CodecInst *instance, + FrameBuffer *fb, + TiledMapType mapType, + Uint32 count); + +extern RetCode Wave4VpuEncSetup(CodecInst *instance); + +extern RetCode Wave4VpuEncode(CodecInst *instance, EncParam *option); +extern RetCode Wave4VpuEncGetResult(CodecInst *instance, EncOutputInfo *result); +#ifdef REDUNDENT_CODE +extern RetCode Wave4VpuEncGiveCommand(CodecInst *pCodecInst, CodecCommand cmd, + void *param); +#endif + +extern RetCode CheckEncCommonParamValid(EncOpenParam *pop); + +extern RetCode CheckEncRcParamValid(EncOpenParam *pop); + +extern Uint32 Wave4VpuGetFrameCycle(Uint32 coreIdx); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __WAVE410_FUNCTION_H__ */ diff --git a/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4_regdefine.h b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4_regdefine.h new file mode 100644 index 0000000000..4789dcfe99 --- /dev/null +++ b/osdrv/interdrv/v2/cvi_vc_drv/vcodec/vpuapi/wave/wave4/wave4_regdefine.h @@ -0,0 +1,301 @@ +//--=========================================================================-- +// This file is a part of VPU Reference API project +//----------------------------------------------------------------------------- +// +// This confidential and proprietary software may be used only +// as authorized by a licensing agreement from Chips&Media Inc. +// In the event of publication, the following notice is applicable: +// +// (C) COPYRIGHT 2006 - 2013 CHIPS&MEDIA INC. +// ALL RIGHTS RESERVED +// +// The entire notice above must be reproduced on all authorized +// copies. +// +//--=========================================================================-- + +#ifndef __WAVE410_REGISTER_DEFINE_H__ +#define __WAVE410_REGISTER_DEFINE_H__ + +#define W4_REG_BASE 0x00000000 +#define W4_CMD_REG_BASE 0x00000100 +#define W4_CMD_REG_END 0x00000200 + +/************************************************************************/ +/* DECODER - DEC_PIC_HDR/DEC_PIC */ +/************************************************************************/ +#define W4_CMD_DEC_USER_MASK (W4_REG_BASE + 0x0174) +#define W4_CMD_DEC_SEVERITY_LEVEL (W4_REG_BASE + 0x0178) +#define W4_CMD_DEC_VCORE_LIMIT (W4_REG_BASE + 0x017C) +#define W4_CMD_DEC_SKIP_OPTION (W4_REG_BASE + 0x0184) +#define W4_CMD_DEC_FORCE_FB_LATENCY_PLUS1 (W4_REG_BASE + 0x0188) +#define W4_CMD_DEC_TEMPORAL_ID_PLUS1 (W4_REG_BASE + 0x018C) + +/* Sequence change enable mask register + * CMD_SEQ_CHANGE_ENABLE_FLAG [5] profile_idc + * [16] pic_width/height_in_luma_sample + * [19] sps_max_dec_pic_buffering, max_num_reorder, + * max_latency_increase + */ +#define W4_CMD_SEQ_CHANGE_ENABLE_FLAG (W4_REG_BASE + 0x0194) + +#define W4_RET_DEC_USER_MASK (W4_REG_BASE + 0x0174) +/* Profile/Level/Tier/Max sublayers... + * LEVEL_IDC [7:0] general_level_idc + * FRAME_ONLY_CONSTRAINT_FLAG [8] general_frame_only_constraint_flag + * NON_PACKED_CONSTRAINT_FLAG [9] general_non_packed_constraint_flag + * INTERLACE_SOUCE_FLAG [10] general_interlaced_source_flag + * PROGRESSIVE_SOURCE_FLAG [11] general_progressive_source_flag + * PROFILE_COMPATIBLE_FLAG[8] [19:12] + * SPS_MAX_SUB_LAYER [23:21] + * PROFILE_IDC [28:24] + * TIER_FLAG [29] + * PROFILE_SPACE [31:30] + */ +#define W4_RET_DEC_SEQ_PARAM (W4_REG_BASE + 0x0198) +#define W4_RET_DEC_DECODED_ID (W4_REG_BASE + 0x019C) +#define W4_RET_DEC_COLOR_SAMPLE_INFO (W4_REG_BASE + 0x01A0) +#define W4_RET_DEC_ASPECT_RATIO (W4_REG_BASE + 0x01A4) +#define W4_RET_DEC_BIT_RATE (W4_REG_BASE + 0x01A8) +#define W4_RET_DEC_FRAME_RATE_NR (W4_REG_BASE + 0x01AC) +#define W4_RET_DEC_FRAME_RATE_DR (W4_REG_BASE + 0x01B0) +/* conformance_window: top, bottom + * bottom [15:0] conformance_window_bottom_offset + * top [31:16] conformance_window_top_offset + */ +#define W4_RET_DEC_CROP_TOP_BOTTOM (W4_REG_BASE + 0x01B4) +/* conformance_window: left, right + * right [15:0] conformance_window_left_offset + * left [31:16] conformance_window_right_offset + */ +#define W4_RET_DEC_CROP_LEFT_RIGHT (W4_REG_BASE + 0x01B8) +#define W4_RET_DEC_PIC_SIZE (W4_REG_BASE + 0x01BC) +#define W4_RET_DEC_FRAMEBUF_NEEDED (W4_REG_BASE + 0x01C0) +#define W4_RET_DEC_NUM_REORDER_DELAY (W4_REG_BASE + 0x0188) +#define W4_RET_DEC_INTER_RES_CHANGE_REALLOCATED_DPB_IDX (W4_REG_BASE + 0x0188) +/* Sequence change result register + * RET_SEQ_CHANGE_FLAG [5] profile_idc changed + * [16] pic_width/height_in_luma_sample changed + * [19] sps_max_dec_pic_buffering, max_num_reorder or + * max_latency_increase changed + */ +#define W4_RET_DEC_SEQ_CHANGE_FLAG (W4_REG_BASE + 0x01C4) +#define W4_RET_DEC_RECOVERY_POINT (W4_REG_BASE + 0x01C8) +#define W4_RET_DEC_VCORE_USED (W4_REG_BASE + 0x01CC) +#define W4_RET_TEMP_SUB_LAYER_INFO (W4_REG_BASE + 0x01D0) +#define W4_RET_FRAME_CYCLE (W4_REG_BASE + 0x01D4) +#define W4_RET_DEC_WARN_INFO (W4_REG_BASE + 0x01D8) +#define W4_RET_DEC_PRESCAN_INDEX (W4_REG_BASE + 0x01DC) +#define W4_RET_DEC_DECODED_INDEX (W4_REG_BASE + 0x01E0) +#define W4_RET_DEC_DISPLAY_INDEX (W4_REG_BASE + 0x01E4) +/* I_SLICE_DECODED [0] + * P_SLICE_DECODED [1] + * B_SLICE_DECODED [2] + * VCL_NAL_UNIT_TYPE [9:4] See Table 7-1 in H.265 specification. + */ +#define W4_RET_DEC_PIC_TYPE (W4_REG_BASE + 0x01E8) +#define W4_RET_DEC_PIC_POC (W4_REG_BASE + 0x01EC) +#define W4_RET_DEC_ERR_CTB_NUM (W4_REG_BASE + 0x01F0) +#define W4_RET_DEC_ERR_INFO (W4_REG_BASE + 0x01F4) +#define W4_RET_DEC_AU_START_POS (W4_REG_BASE + 0x01F8) +#define W4_RET_DEC_AU_END_POS (W4_REG_BASE + 0x01FC) + +#define W4_ENC_SUB_FRAME_SYNC_IF (W4_REG_BASE + 0x00F0) +#define W4_CMD_ENC_SUB_FRAME_SYNC_CONFIG (W4_REG_BASE + 0x019C) +/************************************************************************/ +/* ENCODER - SET_PARAM (in common) */ +/************************************************************************/ +#define W4_CMD_ENC_SET_PARAM_OPTION (W4_REG_BASE + 0x010C) +#define W4_ROLLBACK_OPTION (W4_REG_BASE + 0x011C) + +/* same as the WAVE410 host registers + *#define W4_BS_START_ADDR (W4_REG_BASE + 0x0120) + *#define W4_BS_SIZE (W4_REG_BASE + 0x0124) + *#define W4_BS_PARAM (W4_REG_BASE + 0x0128) + *#define W4_BS_OPTION (W4_REG_BASE + 0x012C) + *#define W4_BS_RD_PTR (W4_REG_BASE + 0x0130) + *#define W4_BS_WR_PTR (W4_REG_BASE + 0x0134) + *#define W4_ADDR_WORK_BASE (W4_REG_BASE + 0x0138) + *#define W4_WORK_SIZE (W4_REG_BASE + 0x013C) + *#define W4_WORK_PARAM (W4_REG_BASE + 0x0140) + *#define W4_ADDR_TEMP_BASE (W4_REG_BASE + 0x0144) + *#define W4_TEMP_SIZE (W4_REG_BASE + 0x0148) + *#define W4_TEMP_PARAM (W4_REG_BASE + 0x014C) + *#define W4_ADDR_SEC_AXI (W4_REG_BASE + 0x0150) + *#define W4_SEC_AXI_SIZE (W4_REG_BASE + 0x0154) + *#define W4_USE_SEC_AXI (W4_REG_BASE + 0x0158) + */ + +/************************************************************************/ +/* ENCODER - SET_PARAM + COMMON */ +/************************************************************************/ +#define W4_CMD_ENC_SET_PARAM_ENABLE (W4_REG_BASE + 0x015C) +#define W4_CMD_ENC_SEQ_SRC_SIZE (W4_REG_BASE + 0x0160) +#define W4_CMD_ENC_SEQ_PIC_PARAM (W4_REG_BASE + 0x016C) +#define W4_CMD_ENC_SEQ_GOP_PARAM (W4_REG_BASE + 0x0170) +#define W4_CMD_ENC_SEQ_INTRA_PARAM (W4_REG_BASE + 0x0174) +#define W4_CMD_ENC_SEQ_CONF_WIN_TOP_BOT (W4_REG_BASE + 0x0178) +#define W4_CMD_ENC_SEQ_CONF_WIN_LEFT_RIGHT (W4_REG_BASE + 0x017C) +#define W4_CMD_ENC_SEQ_FRAME_RATE (W4_REG_BASE + 0x0180) +#define W4_CMD_ENC_SEQ_INDEPENDENT_SLICE (W4_REG_BASE + 0x0184) +#define W4_CMD_ENC_SEQ_DEPENDENT_SLICE (W4_REG_BASE + 0x0188) +#define W4_CMD_ENC_SEQ_INTRA_REFRESH (W4_REG_BASE + 0x018C) +#define W4_CMD_ENC_PARAM (W4_REG_BASE + 0x0190) +#define W4_CMD_ENC_SEQ_LAYER_PERIOD (W4_REG_BASE + 0x0194) +#define W4_CMD_ENC_RC_INTRA_MIN_MAX_QP (W4_REG_BASE + 0x0194) +#define W4_CMD_ENC_RC_PARAM (W4_REG_BASE + 0x0198) +#define W4_CMD_ENC_RC_MIN_MAX_QP (W4_REG_BASE + 0x019C) +#define W4_CMD_ENC_RC_BIT_RATIO_LAYER_0_3 (W4_REG_BASE + 0x01A0) +#define W4_CMD_ENC_RC_BIT_RATIO_LAYER_4_7 (W4_REG_BASE + 0x01A4) +#define W4_CMD_ENC_NR_PARAM (W4_REG_BASE + 0x01A8) +#define W4_CMD_ENC_NR_WEIGHT (W4_REG_BASE + 0x01AC) +#define W4_CMD_ENC_NUM_UNITS_IN_TICK (W4_REG_BASE + 0x01B0) +#define W4_CMD_ENC_TIME_SCALE (W4_REG_BASE + 0x01B4) +#define W4_CMD_ENC_NUM_TICKS_POC_DIFF_ONE (W4_REG_BASE + 0x01B8) +#define W4_CMD_ENC_RC_TRANS_RATE (W4_REG_BASE + 0x01BC) +#define W4_CMD_ENC_RC_TARGET_RATE (W4_REG_BASE + 0x01C0) +#define W4_CMD_ENC_ROT_PARAM (W4_REG_BASE + 0x01C4) +#define W4_CMD_ENC_ROT_RESERVED (W4_REG_BASE + 0x01C8) +#define W4_RET_ENC_MIN_FB_NUM (W4_REG_BASE + 0x01CC) +#define W4_RET_ENC_NAL_INFO_TO_BE_ENCODED (W4_REG_BASE + 0x01D0) +#define W4_RET_ENC_MIN_SRC_BUF_NUM (W4_REG_BASE + 0x01D8) + +/************************************************************************/ +/* ENCODER - SET_PARAM + CUSTOM_GOP */ +/************************************************************************/ +#define W4_CMD_ENC_SET_CUSTOM_GOP_ENABLE (W4_REG_BASE + 0x015C) +#define W4_CMD_ENC_CUSTOM_GOP_PARAM (W4_REG_BASE + 0x0160) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_0 (W4_REG_BASE + 0x0164) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_1 (W4_REG_BASE + 0x0168) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_2 (W4_REG_BASE + 0x016C) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_3 (W4_REG_BASE + 0x0170) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_4 (W4_REG_BASE + 0x0174) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_5 (W4_REG_BASE + 0x0178) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_6 (W4_REG_BASE + 0x017C) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_PARAM_7 (W4_REG_BASE + 0x0180) +#define W4_CMD_ENC_CUSTOM_GOP_RESERVED (W4_REG_BASE + 0x0184) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_0 (W4_REG_BASE + 0x0188) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_1 (W4_REG_BASE + 0x018C) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_2 (W4_REG_BASE + 0x0190) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_3 (W4_REG_BASE + 0x0194) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_4 (W4_REG_BASE + 0x0198) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_5 (W4_REG_BASE + 0x019C) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_6 (W4_REG_BASE + 0x01A0) +#define W4_CMD_ENC_CUSTOM_GOP_PIC_LAMBDA_7 (W4_REG_BASE + 0x01A4) + +/************************************************************************/ +/* ENCODER - SET_PARAM + CUSTOM_HEADER */ +/************************************************************************/ +#define W4_CMD_ENC_CUSTOM_VPS_COMMON (W4_REG_BASE + 0x015C) +#define W4_CMD_ENC_CUSTOM_VPS_DEC_PIC_BUFFERING_MINUS1 (W4_REG_BASE + 0x0160) +#define W4_CMD_ENC_CUSTOM_VPS_NUM_REORDERING (W4_REG_BASE + 0x0164) +#define W4_CMD_ENC_CUSTOM_VPS_MAX_LATENCY_PLUS1_0 (W4_REG_BASE + 0x0168) +#define W4_CMD_ENC_CUSTOM_VPS_MAX_LATENCY_PLUS1_1 (W4_REG_BASE + 0x016C) +#define W4_CMD_ENC_CUSTOM_VPS_MAX_LATENCY_PLUS1_2 (W4_REG_BASE + 0x0170) +#define W4_CMD_ENC_CUSTOM_VPS_MAX_LATENCY_PLUS1_3 (W4_REG_BASE + 0x0174) +#define W4_CMD_ENC_CUSTOM_VPS_MAX_LATENCY_PLUS1_4 (W4_REG_BASE + 0x0178) +#define W4_CMD_ENC_CUSTOM_VPS_MAX_LATENCY_PLUS1_5 (W4_REG_BASE + 0x017C) +#define W4_CMD_ENC_CUSTOM_VPS_MAX_LATENCY_PLUS1_6 (W4_REG_BASE + 0x0180) +#define W4_CMD_ENC_CUSTOM_VPS_LAYER_ID_0 (W4_REG_BASE + 0x0184) +#define W4_CMD_ENC_CUSTOM_VPS_LAYER_ID_1 (W4_REG_BASE + 0x0188) + +#define W4_CMD_ENC_CUSTOM_SPS_COMMON (W4_REG_BASE + 0x018C) +#define W4_CMD_ENC_CUSTOM_SPS_DEC_PIC_BUFFERING_MINUS1 (W4_REG_BASE + 0x0190) +#define W4_CMD_ENC_CUSTOM_SPS_NUM_REORDERING (W4_REG_BASE + 0x0194) +#define W4_CMD_ENC_CUSTOM_SPS_MAX_LATENCY_PLUS1_0 (W4_REG_BASE + 0x0198) +#define W4_CMD_ENC_CUSTOM_SPS_MAX_LATENCY_PLUS1_1 (W4_REG_BASE + 0x019C) +#define W4_CMD_ENC_CUSTOM_SPS_MAX_LATENCY_PLUS1_2 (W4_REG_BASE + 0x01A0) +#define W4_CMD_ENC_CUSTOM_SPS_MAX_LATENCY_PLUS1_3 (W4_REG_BASE + 0x01A4) +#define W4_CMD_ENC_CUSTOM_SPS_MAX_LATENCY_PLUS1_4 (W4_REG_BASE + 0x01A8) +#define W4_CMD_ENC_CUSTOM_SPS_MAX_LATENCY_PLUS1_5 (W4_REG_BASE + 0x01AC) +#define W4_CMD_ENC_CUSTOM_SPS_MAX_LATENCY_PLUS1_6 (W4_REG_BASE + 0x01B0) + +#define W4_CMD_ENC_CUSTOM_PPS_COMMON (W4_REG_BASE + 0x01B4) +/************************************************************************/ +/* ENCODER - SET_PARAM + VUI */ +/************************************************************************/ +#define W4_CMD_ENC_VUI_PARAM_FLAGS (W4_REG_BASE + 0x015C) +#define W4_CMD_ENC_VUI_ASPECT_RATIO_IDC (W4_REG_BASE + 0x0160) +#define W4_CMD_ENC_VUI_SAR_SIZE (W4_REG_BASE + 0x0164) +#define W4_CMD_ENC_VUI_OVERSCAN_APPROPRIATE (W4_REG_BASE + 0x0168) +#define W4_CMD_ENC_VUI_VIDEO_SIGNAL (W4_REG_BASE + 0x016C) +#define W4_CMD_ENC_VUI_CHROMA_SAMPLE_LOC (W4_REG_BASE + 0x0170) +#define W4_CMD_ENC_VUI_DISP_WIN_LEFT_RIGHT (W4_REG_BASE + 0x0174) +#define W4_CMD_ENC_VUI_DISP_WIN_TOP_BOT (W4_REG_BASE + 0x0178) + +#define W4_CMD_ENC_VUI_HRD_RBSP_PARAM_FLAG (W4_REG_BASE + 0x017C) +#define W4_CMD_ENC_VUI_RBSP_ADDR (W4_REG_BASE + 0x0180) +#define W4_CMD_ENC_VUI_RBSP_SIZE (W4_REG_BASE + 0x0184) +#define W4_CMD_ENC_HRD_RBSP_ADDR (W4_REG_BASE + 0x0188) +#define W4_CMD_ENC_HRD_RBSP_SIZE (W4_REG_BASE + 0x018C) + +/************************************************************************/ +/* ENCODER - ENC_PIC */ +/************************************************************************/ +#define W4_CMD_ENC_ADDR_REPORT_BASE (W4_REG_BASE + 0x015C) +#define W4_CMD_ENC_REPORT_SIZE (W4_REG_BASE + 0x0160) +#define W4_CMD_ENC_REPORT_PARAM (W4_REG_BASE + 0x0164) +#define W4_CMD_ENC_CODE_OPTION (W4_REG_BASE + 0x0168) +#define W4_CMD_ENC_PIC_PARAM (W4_REG_BASE + 0x016C) +#define W4_CMD_ENC_SRC_PIC_IDX (W4_REG_BASE + 0x0170) +#define W4_CMD_ENC_SRC_ADDR_Y (W4_REG_BASE + 0x0174) +#define W4_CMD_ENC_SRC_ADDR_U (W4_REG_BASE + 0x0178) +#define W4_CMD_ENC_SRC_ADDR_V (W4_REG_BASE + 0x017C) +#define W4_CMD_ENC_SRC_STRIDE (W4_REG_BASE + 0x0180) +#define W4_CMD_ENC_SRC_FORMAT (W4_REG_BASE + 0x0184) + +#define W4_CMD_ENC_PREFIX_SEI_NAL_ADDR (W4_REG_BASE + 0x0188) +#define W4_CMD_ENC_PREFIX_SEI_INFO (W4_REG_BASE + 0x018C) +#define W4_CMD_ENC_SUFFIX_SEI_NAL_ADDR (W4_REG_BASE + 0x0190) +#define W4_CMD_ENC_SUFFIX_SEI_INFO (W4_REG_BASE + 0x0194) + +#define W4_CMD_ENC_LONGTERM_PIC (W4_REG_BASE + 0x0198) +/*(W4_REG_BASE + 0x019C) = used for SUB_FRAME_SYNC */ +#define W4_CMD_ENC_CTU_OPT_PARAM (W4_REG_BASE + 0x01A0) +#define W4_CMD_ENC_ROI_ADDR_CTU_MAP (W4_REG_BASE + 0x01A4) +#define W4_CMD_ENC_CTU_MODE_MAP_ADDR (W4_REG_BASE + 0x01A8) +#define W4_CMD_ENC_CTU_QP_MAP_ADDR (W4_REG_BASE + 0x01AC) +#define W4_CMD_ENC_SRC_TIMESTAMP_LOW (W4_REG_BASE + 0x01B0) +#define W4_CMD_ENC_SRC_TIMESTAMP_HIGH (W4_REG_BASE + 0x01B4) +#ifdef SUPPORT_HOST_RC_PARAM +#define W4_CMD_ENC_HOST_PIC_QP (W4_REG_BASE + 0x01B8) +#define W4_CMD_ENC_HOST_PIC_TARGET_BIT (W4_REG_BASE + 0x01BC) +#endif + +#define W4_CMD_ENC_FC_PARAM (W4_REG_BASE + 0x01E8) +#define W4_CMD_ENC_FC_TABLE_ADDR_Y (W4_REG_BASE + 0x01EC) +#define W4_CMD_ENC_FC_TABLE_ADDR_C (W4_REG_BASE + 0x01F0) + +#define W4_RET_ENC_PIC_IDX (W4_REG_BASE + 0x01A8) +#define W4_RET_ENC_PIC_SLICE_NUM (W4_REG_BASE + 0x01AC) +#define W4_RET_ENC_PIC_SKIP (W4_REG_BASE + 0x01B0) +#define W4_RET_ENC_PIC_NUM_INTRA (W4_REG_BASE + 0x01B4) +#define W4_RET_ENC_PIC_NUM_MERGE (W4_REG_BASE + 0x01B8) +#define W4_RET_ENC_PIC_FLAG (W4_REG_BASE + 0x01BC) +#define W4_RET_ENC_PIC_NUM_SKIP (W4_REG_BASE + 0x01C0) +#define W4_RET_ENC_PIC_AVG_CU_QP (W4_REG_BASE + 0x01C4) +#define W4_RET_ENC_PIC_BYTE (W4_REG_BASE + 0x01C8) +#define W4_RET_ENC_GOP_PIC_IDX (W4_REG_BASE + 0x01CC) +#define W4_RET_ENC_PIC_POC (W4_REG_BASE + 0x01D0) +#define W4_RET_ENC_USED_SRC_IDX (W4_REG_BASE + 0x01D8) +#define W4_RET_ENC_PIC_NUM (W4_REG_BASE + 0x01DC) +#define W4_RET_ENC_PIC_TYPE (W4_REG_BASE + 0x01E0) +#define W4_RET_ENC_VCL_NUT (W4_REG_BASE + 0x01E4) +#ifdef REPORT_PIC_SUM_VAR +#define W4_RET_ENC_PIC_SUM_VAR (W4_REG_BASE + 0x01E8) +#endif + +/************************************************************************/ +/* ENCODER - SET_FRAMEBUF */ +/************************************************************************/ +#define W4_CMD_FBC_STRIDE_Y (W4_REG_BASE + 0x150) +#define W4_CMD_FBC_STRIDE_C (W4_REG_BASE + 0x154) +/* 1/4 sub-sampled buffer (for S2 ME) + * SUB_SAMPLED_ONE_FB_SIZE = ALIGN16(width/4) * ALIGN8(height/4) + * total size for sub-sampled buffer = SUB_SAMPLED_ONE_FB_SIZE * SET_FB_NUM + */ +#define W4_ADDR_SUB_SAMPLED_FB_BASE (W4_REG_BASE + 0x0158) +#define W4_SUB_SAMPLED_ONE_FB_SIZE (W4_REG_BASE + 0x015C) +/* 0x160 ~ 0x17F : same as the WAVE410 registers for SET_FRAMEBUF */ + +#endif /* __WAVE410_REGISTER_DEFINE_H__ */ diff --git a/osdrv/interdrv/v2/include/chip/cv180x b/osdrv/interdrv/v2/include/chip/cv180x new file mode 120000 index 0000000000..0b623c74c9 --- /dev/null +++ b/osdrv/interdrv/v2/include/chip/cv180x @@ -0,0 +1 @@ +phobos \ No newline at end of file diff --git a/osdrv/interdrv/v2/include/chip/cv181x b/osdrv/interdrv/v2/include/chip/cv181x new file mode 120000 index 0000000000..f63b11c494 --- /dev/null +++ b/osdrv/interdrv/v2/include/chip/cv181x @@ -0,0 +1 @@ +mars \ No newline at end of file diff --git a/osdrv/interdrv/v2/include/common/uapi/linux/cvi_comm_venc.h b/osdrv/interdrv/v2/include/common/uapi/linux/cvi_comm_venc.h index 70b1f69488..24fdd179e8 100644 --- a/osdrv/interdrv/v2/include/common/uapi/linux/cvi_comm_venc.h +++ b/osdrv/interdrv/v2/include/common/uapi/linux/cvi_comm_venc.h @@ -383,6 +383,7 @@ typedef enum { CVI_ERR_VENC_H264_SPLIT, CVI_ERR_VENC_H265_SPLIT, CVI_ERR_VENC_H264_INTRA_PRED, + CVI_ERR_VENC_SVC_PARAM, CVI_ERR_VENC_BUTT } VENC_RECODE_E_ERRTYPE; @@ -1190,6 +1191,8 @@ typedef enum _VENC_FRAME_TYPE_E { /* the information of the user rc*/ typedef struct _USER_RC_INFO_S { + CVI_BOOL bRoiBinValid; + int roideltaqp; CVI_BOOL bQpMapValid; /*RW; Range:[0,1]; Indicates whether the QpMap mode is valid for the current frame*/ CVI_BOOL bSkipWeightValid; // RW; Range:[0,1]; Indicates whether // the Skip Weight mode is valid for the current frame @@ -1305,6 +1308,27 @@ typedef struct _VENC_FRAME_PARAM_S { CVI_U32 u32FrameBits; } VENC_FRAME_PARAM_S; +typedef struct _VENC_SVC_PARAM_S { + /*enable foreground protect according motion info*/ + CVI_BOOL fg_protect_en; + CVI_S32 fg_dealt_qp; + + /*static scene auto change bitrate according dci_lv threshold*/ + CVI_BOOL complex_scene_detect_en; + /*dci_lv avg < threshold as simple scene*/ + CVI_U32 complex_scene_low_th; + /*dci_lv avg > threshold as complex scene*/ + CVI_U32 complex_scene_hight_th; + /*middle scene still case min bitrate*/ + CVI_U32 middle_min_percent; + /*complex scene still case min bitrate*/ + CVI_U32 complex_min_percent; + /*when smart_ai_en is 1, user show pass level roi used USER_FRAME_INFO_S + * and bRoiBinValid set valid + */ + CVI_BOOL smart_ai_en; +} VENC_SVC_PARAM_S; + #ifdef __cplusplus #if __cplusplus } diff --git a/osdrv/interdrv/v2/include/common/uapi/linux/cvi_vc_drv_ioctl.h b/osdrv/interdrv/v2/include/common/uapi/linux/cvi_vc_drv_ioctl.h index ee82dca4dd..c27a8c04db 100644 --- a/osdrv/interdrv/v2/include/common/uapi/linux/cvi_vc_drv_ioctl.h +++ b/osdrv/interdrv/v2/include/common/uapi/linux/cvi_vc_drv_ioctl.h @@ -96,5 +96,9 @@ #define CVI_VC_VENC_SET_H264_INTRA_PRED _IO(CVI_VC_DRV_IOCTL_MAGIC, 76) #define CVI_VC_VENC_GET_H264_INTRA_PRED _IO(CVI_VC_DRV_IOCTL_MAGIC, 77) + +#define CVI_VC_VENC_ENABLE_SVC _IO(CVI_VC_DRV_IOCTL_MAGIC, 78) +#define CVI_VC_VENC_SET_SVC_PARAM _IO(CVI_VC_DRV_IOCTL_MAGIC, 79) +#define CVI_VC_VENC_GET_SVC_PARAM _IO(CVI_VC_DRV_IOCTL_MAGIC, 80) #endif /* __CVI_VC_DRV_IOCTL_H__ */ diff --git a/osdrv/interdrv/v2/jpeg/Makefile b/osdrv/interdrv/v2/jpeg/Makefile index 82fa2ef848..92a3b85c04 100644 --- a/osdrv/interdrv/v2/jpeg/Makefile +++ b/osdrv/interdrv/v2/jpeg/Makefile @@ -1,4 +1,38 @@ +include $(PWD)/../Makefile.interdrv.param + +HAL_PATH = hal/$(CHIP_CODE) + +CHIP_TYPE = CHIP_BM1880 +SUB_TYPE = ASIC_EVB + +# Add your debugging flag (or not) to CFLAGS +ifeq ($(DEBUG),y) + DEBFLAGS = -O -g # "-O" is needed to expand inlines +else + DEBFLAGS = -O2 +endif + +ccflags-y += $(DEBFLAGS) -I$(PWD) -I$(LDDINCDIR) -D$(CHIP_TYPE) -D$(SUB_TYPE) -DUSE_KERNEL_MODE -Wno-date-time -Werror + +KBUILD_EXTRA_SYMBOLS += $(PWD)/../vcodec/Module.symvers + +# PWD := $(shell pwd) +obj-m += soph_jpeg.o +soph_jpeg-y += cvi_jpeg.o jpeg_common.o jmm.o hal/$(CHIP_CODE)/cvi_jpeg_cfg.o + all: + $(MAKE) ARCH=${ARCH} -C $(KERNEL_DIR) M=$(PWD) modules clean: + rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c + rm -rf .tmp_versions Module.symvers + rm -rf modules.order + rm -rf $(HAL_PATH)/*.o $(HAL_PATH)/.*.cmd + +depend .depend dep: + $(CC) $(CFLAGS) -M *.c > .depend + +ifeq (.depend,$(wildcard .depend)) +include .depend +endif diff --git a/osdrv/interdrv/v2/jpeg/config.h b/osdrv/interdrv/v2/jpeg/config.h new file mode 100644 index 0000000000..2e1413be26 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/config.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2021. All rights reserved. + * + * File Name: config.h + * Description: jpeg software API configuration + */ + +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || \ + defined(WIN32) || defined(__MINGW32__) +#define PLATFORM_WIN32 +#elif defined(linux) || defined(__linux) || defined(ANDROID) +#define PLATFORM_LINUX +#else +#define PLATFORM_NON_OS +#endif + +#if defined(_MSC_VER) +#include +#include +#define inline _inline +#define JPU_DELAY_MS(X) Sleep(X) +#define JPU_DELAY_US(X) \ + Sleep(X) // should change to delay function which can be delay a microsecond unut. +#define kbhit _kbhit +#define getch _getch +#elif defined(__GNUC__) +#ifdef _KERNEL_ +#define JPU_DELAY_MS(X) udelay(X * 1000) +#define JPU_DELAY_US(X) udelay(X) +#else +#define JPU_DELAY_MS(X) usleep(X * 1000) +#define JPU_DELAY_US(X) usleep(X) +#endif +#elif defined(__ARMCC__) +#else +#error "Unknown compiler." +#endif + +#define PROJECT_ROOT "..\\..\\..\\" + +#if defined(JPU_FPGA_PLATFORM) +#if defined(ANDROID) || defined(linux) +#else +#define SUPPORT_CONF_TEST +#endif +#endif + +#define API_VERSION 165 + +//#define MJPEG_ERROR_CONCEAL + +#ifdef __cplusplus +} +#endif + +#endif /* __CONFIG_H__ */ diff --git a/osdrv/interdrv/v2/jpeg/cvi_jpeg.c b/osdrv/interdrv/v2/jpeg/cvi_jpeg.c new file mode 100644 index 0000000000..5d275ffb60 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/cvi_jpeg.c @@ -0,0 +1,692 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2021. All rights reserved. + * + * File Name: cvi_jpeg.c + * Description: jpeg system interface + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) +#include +#endif + +#include "cvi_jpeg.h" +#include "jpeg_common.h" + +#define VERSION "CVITEK" +//#define ENABLE_DEBUG_MSG +#ifdef ENABLE_DEBUG_MSG +#define DPRINTK(args...) pr_info(args) +#else +#define DPRINTK(args...) +#endif + +#define JPU_PLATFORM_DEVICE_NAME "jpeg" +#define JPU_CLK_NAME "jpeg_clk" +#define JPU_CLASS_NAME "jpu" +#define JPU_DEV_NAME "jpu" + +#define JPU_REG_SIZE 0x300 +#define JPU_CONTROL_REG_ADDR 0x50008008 +#define JPU_CONTROL_REG_SIZE 0x4 + +#ifndef VM_RESERVED // for kernel up to 3.7.0 version +#define VM_RESERVED (VM_DONTEXPAND | VM_DONTDUMP) +#endif + +#define MJPEG_PIC_STATUS_REG 0x4 +#define MJPEG_INTR_MASK_REG 0x0C0 + +static DEFINE_SEMAPHORE(s_jpu_sem); + +int jpu_mask = JPU_MASK_ERR; +module_param(jpu_mask, int, 0644); + +static int jpu_chn_idx = -1; +extern wait_queue_head_t tWaitQueue[]; + +#ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT +// global variable to avoid kernal config mismatch in filp->private_data +static void *pCviJpuDevice; +#endif + +static int cvi_jpu_register_cdev(struct cvi_jpu_device *jdev); +static void cvi_jpu_unregister_cdev(struct platform_device *pdev); +#ifndef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY +static int jpu_allocate_memory(struct cvi_jpu_device *jdev, struct platform_device *pdev); +#endif + +static void set_clock_enable(struct cvi_jpu_device *jdev, int enable) +{ + if (jdev->pdata->quirks & (JPU_QUIRK_SUPPORT_CLOCK_CONTROL | JPU_QUIRK_SUPPORT_FPGA)) { + if (enable) { + if (jdev->pdata->ops->clk_enable) + jdev->pdata->ops->clk_enable(jdev); + } else { + if (jdev->pdata->ops->clk_disable) + jdev->pdata->ops->clk_disable(jdev); + } + } +} + +irqreturn_t jpu_irq_handler(int irq, void *data) +{ + struct cvi_jpu_device *jdev = data; + jpudrv_buffer_t *pReg = &jdev->jpu_register; + + if (jpu_chn_idx == -1) + return IRQ_HANDLED; + + writel(0xFF, pReg->virt_addr + MJPEG_INTR_MASK_REG);//disable_irq_nosync(jdev->jpu_irq); + + if (jdev->async_queue) + kill_fasync(&jdev->async_queue, SIGIO, + POLL_IN); // notify the interrupt to userspace + + jdev->interrupt_flag = 1; + wake_up(&tWaitQueue[jpu_chn_idx]); + wake_up(&jdev->interrupt_wait_q); + + return IRQ_HANDLED; +} + +// JDI_IOCTL_WAIT_INTERRUPT +int jpu_wait_interrupt(int timeout) +{ + u32 u32TimeOut; + #ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + struct cvi_jpu_device *jdev = (struct cvi_jpu_device *)pCviJpuDevice; + #else + struct cvi_jpu_device *jdev = filp->private_data; + #endif + + u32TimeOut = (u32)timeout; + if (!wait_event_timeout( + jdev->interrupt_wait_q, jdev->interrupt_flag != 0, + msecs_to_jiffies(u32TimeOut))) { + return -ETIME; + } + + if (signal_pending(current)) { + return -ERESTARTSYS; + } + + jdev->interrupt_flag = 0; + + return 0; +} +EXPORT_SYMBOL(jpu_wait_interrupt); + +// JDI_IOCTL_SET_CLOCK_GATE +int jpu_set_clock_gate(int *pEnable) +{ + #ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + struct cvi_jpu_device *jdev = (struct cvi_jpu_device *)pCviJpuDevice; + #else + struct cvi_jpu_device *jdev = filp->private_data; + #endif + u32 clkgate; + + clkgate = *(u32 *)pEnable; + + set_clock_enable(jdev, clkgate); + return 0; +} +EXPORT_SYMBOL(jpu_set_clock_gate); + +// JDI_IOCTL_GET_INSTANCE_POOL +int jpu_get_instance_pool(jpudrv_buffer_t *p_jdb) +{ + #ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + struct cvi_jpu_device *jdev = (struct cvi_jpu_device *)pCviJpuDevice; + #else + struct cvi_jpu_device *jdev = filp->private_data; + #endif + + down(&s_jpu_sem); + + if (jdev->jpu_instance_pool.base == 0) { + + memcpy(&jdev->jpu_instance_pool, (struct jpudrv_buffer_t *)p_jdb, + sizeof(struct jpudrv_buffer_t)); + +#ifdef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + jdev->jpu_instance_pool.size = + PAGE_ALIGN(jdev->jpu_instance_pool.size); + jdev->jpu_instance_pool.phys_addr = + jdev->jpu_instance_pool.base = + (unsigned long)vmalloc( + jdev->jpu_instance_pool.size); + if (jdev->jpu_instance_pool.base == 0) { + up(&s_jpu_sem); + return -EFAULT; + } + memset((void *)(uintptr_t)jdev->jpu_instance_pool.base, 0x0, + jdev->jpu_instance_pool.size); +#else + if (jpu_alloc_dma_buffer(jdev, &jdev->jpu_instance_pool) == -1) { + up(&s_jpu_sem); + return -EFAULT; + } + memset_io((void *)jdev->jpu_instance_pool.base, 0x0, + jdev->jpu_instance_pool.size); +#endif + JPU_DBG_INFO("jdev->jpu_instance_pool base: 0x%llx, size: %d\n", + jdev->jpu_instance_pool.base, + jdev->jpu_instance_pool.size); + } + + memcpy(p_jdb, &jdev->jpu_instance_pool, sizeof(struct jpudrv_buffer_t)); + + up(&s_jpu_sem); + + return 0; +} +EXPORT_SYMBOL(jpu_get_instance_pool); + +// JDI_IOCTL_OPEN_INSTANCE +int jpu_open_instance(unsigned long *pInstIdx) +{ + u32 inst_idx; + struct jpudrv_instanace_list_t *jil; + #ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + struct cvi_jpu_device *jdev = (struct cvi_jpu_device *)pCviJpuDevice; + #else + struct cvi_jpu_device *jdev = filp->private_data; + #endif + unsigned long flags = 0; + + jil = kzalloc(sizeof(*jil), GFP_KERNEL); + if (!jil) + return -ENOMEM; + + inst_idx = *(u32 *)pInstIdx; + + jil->inst_idx = inst_idx; + //jil->filp = filp; + spin_lock_irqsave(&jdev->jpu_lock, flags); + list_add(&jil->list, &jdev->s_jpu_inst_list_head); + jdev->open_instance_count++; + spin_unlock_irqrestore(&jdev->jpu_lock, flags); + + return 0; +} +EXPORT_SYMBOL(jpu_open_instance); + +// JDI_IOCTL_CLOSE_INSTANCE +int jpu_close_instance(unsigned long *pInstIdx) +{ + u32 inst_idx; + struct jpudrv_instanace_list_t *jil, *n; + bool find_jil = false; + #ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + struct cvi_jpu_device *jdev = (struct cvi_jpu_device *)pCviJpuDevice; + #else + struct cvi_jpu_device *jdev = filp->private_data; + #endif + unsigned long flags = 0; + + inst_idx = *(u32 *)pInstIdx; + + spin_lock_irqsave(&jdev->jpu_lock, flags); + list_for_each_entry_safe(jil, n, &jdev->s_jpu_inst_list_head, list) { + if (jil->inst_idx == inst_idx) { + jdev->open_instance_count--; + list_del(&jil->list); + find_jil = true; + break; + } + } + spin_unlock_irqrestore(&jdev->jpu_lock, flags); + + if (find_jil) { + kfree(jil); + JPU_DBG_INFO("IOCTL_CLOSE_INSTANCE, inst_idx=%d, open_count=%d\n", + (int)inst_idx, jdev->open_instance_count); + } + + return 0; +} +EXPORT_SYMBOL(jpu_close_instance); + +// JDI_IOCTL_GET_INSTANCE_NUM +int jpu_get_instance_num(int *pInstNum) +{ + #ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + struct cvi_jpu_device *jdev = (struct cvi_jpu_device *)pCviJpuDevice; + #else + struct cvi_jpu_device *jdev = filp->private_data; + #endif + + down(&s_jpu_sem); + + *pInstNum = jdev->open_instance_count; + + JPU_DBG_INFO("IOCTL_GET_INSTANCE_NUM open_count=%d\n", + jdev->open_instance_count); + + up(&s_jpu_sem); + return 0; +} +EXPORT_SYMBOL(jpu_get_instance_num); + +// JDI_IOCTL_GET_REGISTER_INFO +int jpu_get_register_info(jpudrv_buffer_t *p_jdb_register) +{ + #ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + struct cvi_jpu_device *jdev = (struct cvi_jpu_device *)pCviJpuDevice; + #else + struct cvi_jpu_device *jdev = filp->private_data; + #endif + + JPU_DBG_INFO("[+]JDI_IOCTL_GET_REGISTER_INFO\n"); + + memcpy(p_jdb_register, &jdev->jpu_register, sizeof(struct jpudrv_buffer_t)); + + JPU_DBG_INFO("[-]GET_REGISTER_INFO, pa = 0x%llx, va = %p, size = %d\n", + jdev->jpu_register.phys_addr, jdev->jpu_register.virt_addr, + jdev->jpu_register.size); + + return 0; +} +EXPORT_SYMBOL(jpu_get_register_info); + +// JDI_IOCTL_RESET +int jpu_reset(int InstIdx) +{ + return 0; +} +EXPORT_SYMBOL(jpu_reset); + +unsigned long jpu_get_interrupt_flag(int chnIdx) +{ + unsigned long interrupt_flag = 0; + #ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + struct cvi_jpu_device *jdev = (struct cvi_jpu_device *)pCviJpuDevice; + #else + struct cvi_jpu_device *jdev = filp->private_data; + #endif + + interrupt_flag = (jpu_chn_idx == chnIdx) ? jdev->interrupt_flag : 0; + + return interrupt_flag; +} +EXPORT_SYMBOL(jpu_get_interrupt_flag); + +void jpu_set_channel_num(int chnIdx) +{ + jpu_chn_idx = chnIdx; +} +EXPORT_SYMBOL(jpu_set_channel_num); + +static int jpu_probe(struct platform_device *pdev) +{ + int err = 0; + const struct of_device_id *match; + struct device *dev = &pdev->dev; + struct cvi_jpu_device *jdev; + + struct resource *res = NULL; + + jdev = devm_kzalloc(&pdev->dev, sizeof(*jdev), GFP_KERNEL); + if (!jdev) + return -ENOMEM; + + memset(jdev, 0, sizeof(*jdev)); + #ifdef JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + pCviJpuDevice = jdev; + #endif + + jdev->dev = dev; + + match = of_match_device(cvi_jpu_match_table, &pdev->dev); + if (!match) + return -EINVAL; + + jdev->pdata = match->data; + + if (pdev) + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + + if (res) { + unsigned long size = resource_size(res); + + jdev->jpu_register.phys_addr = res->start; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + jdev->jpu_register.virt_addr = + (__u8 *)ioremap(res->start, size); +#else + jdev->jpu_register.virt_addr = + (__u8 *)ioremap_nocache(res->start, size); +#endif + jdev->jpu_register.size = size; + JPU_DBG_INFO("jpu reg pa = 0x%llx, va = %p, size = %u\n", + jdev->jpu_register.phys_addr, jdev->jpu_register.virt_addr, + jdev->jpu_register.size); + } else { + pr_err("Unable to get base register\n"); + return -EINVAL; + } + + if (pdev) + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + // if platform driver is implemented + if (res) { + unsigned long size = resource_size(res); + + jdev->jpu_control_register.phys_addr = res->start; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + jdev->jpu_control_register.virt_addr = + (__u8 *)ioremap(res->start, size); +#else + jdev->jpu_control_register.virt_addr = + (__u8 *)ioremap_nocache(res->start, size); +#endif + jdev->jpu_control_register.size = size; + pr_info("jpu ctrl reg pa = 0x%llx, va = %p, size = %u\n", + jdev->jpu_control_register.phys_addr, + jdev->jpu_control_register.virt_addr, + jdev->jpu_control_register.size); + } else { + //TODO get res from kernel + jdev->jpu_control_register.phys_addr = JPU_CONTROL_REG_ADDR; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + jdev->jpu_control_register.virt_addr = + (__u8 *)ioremap( + jdev->jpu_control_register.phys_addr, + JPU_CONTROL_REG_SIZE); +#else + jdev->jpu_control_register.virt_addr = + (__u8 *)ioremap_nocache( + jdev->jpu_control_register.phys_addr, + JPU_CONTROL_REG_SIZE); +#endif + jdev->jpu_control_register.size = JPU_CONTROL_REG_SIZE; + JPU_DBG_INFO("jpu ctrl reg pa = 0x%llx, va = %p, size = %u\n", + jdev->jpu_control_register.phys_addr, + jdev->jpu_control_register.virt_addr, + jdev->jpu_control_register.size); + } + + err = cvi_jpu_register_cdev(jdev); + + if (err < 0) { + pr_err("jpu_register_cdev\n"); + goto ERROR_PROBE_DEVICE; + } + + if (jdev->pdata->quirks & JPU_QUIRK_SUPPORT_CLOCK_CONTROL) { + if (jdev->pdata->ops->clk_get) + jdev->pdata->ops->clk_get(jdev); // jpu_clk_get + } + + if (pdev) + res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); + // if platform driver is implemented + if (res) { + jdev->jpu_irq = res->start; + JPU_DBG_INFO("jpu irq number irq = %d\n", jdev->jpu_irq); + } else { + JPU_DBG_ERR("jpu irq number irq = %d\n", jdev->jpu_irq); + } +#if 0 + err = request_irq(jdev->jpu_irq, jpu_irq_handler, 0, "JPU_CODEC_IRQ", jdev); + if (err) { + pr_err("[JPUDRV] : fail to register interrupt handler\n"); + goto ERROR_PROBE_DEVICE; + } +#endif +#ifndef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + if (jpu_allocate_memory(jdev, pdev) < 0) { + pr_err("[JPUDRV] : fail to remap jpu memory\n"); + goto ERROR_PROBE_DEVICE; + } + + if (jmem_init(&jdev->jmem, jdev->video_memory.phys_addr, jdev->video_memory.size) < + 0) { + pr_err("[JPUDRV] : fail to init vmem system\n"); + goto ERROR_PROBE_DEVICE; + } +#endif + + jdev->jpu_instance_pool.base = 0; + + if (jdev->pdata->quirks & JPU_QUIRK_SUPPORT_SWITCH_TO_PLL && jdev->pdata->ops->config_pll) { + jdev->pdata->ops->config_pll(jdev); //cv1835_config_pll + } + + init_waitqueue_head(&jdev->interrupt_wait_q); + + spin_lock_init(&jdev->jpu_lock); + + INIT_LIST_HEAD(&jdev->s_jbp_head); + INIT_LIST_HEAD(&jdev->s_jpu_inst_list_head); + + platform_set_drvdata(pdev, jdev); + + return 0; + +ERROR_PROBE_DEVICE: + + if (jdev->s_jpu_major) + unregister_chrdev_region(jdev->cdev_id, 1); + + if (jdev->jpu_register.virt_addr) { + iounmap((void *)jdev->jpu_register.virt_addr); + jdev->jpu_register.virt_addr = 0x00; + } + + if (jdev->jpu_control_register.virt_addr) { + iounmap((void *)jdev->jpu_control_register.virt_addr); + jdev->jpu_control_register.virt_addr = 0x00; + } + + return err; +} + +static int cvi_jpu_register_cdev(struct cvi_jpu_device *jdev) +{ + int err = 0; + + jdev->jpu_class = class_create(THIS_MODULE, JPU_CLASS_NAME); + if (IS_ERR(jdev->jpu_class)) { + pr_err("create class failed\n"); + return PTR_ERR(jdev->jpu_class); + } + + /* get the major number of the character device */ + if ((alloc_chrdev_region(&jdev->cdev_id, 0, 1, JPU_DEV_NAME)) < 0) { + err = -EBUSY; + pr_err("could not allocate major number\n"); + return err; + } + jdev->s_jpu_major = MAJOR(jdev->cdev_id); + + return err; +} + +#ifndef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY +static int jpu_allocate_memory(struct cvi_jpu_device *jdev, struct platform_device *pdev) +{ + struct device_node *target = NULL; + struct reserved_mem *prmem = NULL; + + if (pdev) { + target = + of_parse_phandle(pdev->dev.of_node, "memory-region", 0); + } + + if (target) { + prmem = of_reserved_mem_lookup(target); + of_node_put(target); + + if (!prmem) { + pr_err("[JPUDRV]: cannot acquire memory-region\n"); + return -1; + } + } else { + pr_err("[JPUDRV]: cannot find the node, memory-region\n"); + return -1; + } + + JPU_DBG_INFO("pool name = %s, size = 0x%llx, base = 0x%llx\n", + prmem->name, prmem->size, prmem->base); + + jdev->video_memory.phys_addr = (unsigned long)prmem->base; + jdev->video_memory.size = (unsigned int)prmem->size; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + jdev->video_memory.base = (unsigned long)devm_ioremap( + &pdev->dev, jdev->video_memory.phys_addr, jdev->video_memory.size); +#else + jdev->video_memory.base = (unsigned long)devm_ioremap_nocache( + &pdev->dev, jdev->video_memory.phys_addr, jdev->video_memory.size); +#endif + + if (!jdev->video_memory.base) { + pr_err("[JPUDRV] ioremap fail!\n"); + pr_err("jdev->video_memory.base = 0x%llx\n", jdev->video_memory.base); + return -1; + } + + JPU_DBG_INFO("reserved mem pa = 0x%llx, base = 0x%llx, size = 0x%x\n", + jdev->video_memory.phys_addr, jdev->video_memory.base, + jdev->video_memory.size); + JPU_DBG_INFO("success to probe jpu\n"); + + return 0; +} +#endif // #ifndef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + +static int jpu_remove(struct platform_device *pdev) +{ + struct cvi_jpu_device *jdev = platform_get_drvdata(pdev); + + pr_info("jpu_remove\n"); + + if (jdev->jpu_instance_pool.base) { +#ifdef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + vfree((const void *)(uintptr_t)jdev->jpu_instance_pool.base); +#else + jpu_free_dma_buffer(jdev, &jdev->jpu_instance_pool); +#endif + jdev->jpu_instance_pool.base = 0; + } +#ifndef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + if (jdev->video_memory.base) { + jdev->video_memory.base = 0; + jmem_exit(&jdev->jmem); + } +#endif + + cvi_jpu_unregister_cdev(pdev); + + if (jdev->jpu_irq) + free_irq(jdev->jpu_irq, jdev); + + if (jdev->jpu_register.virt_addr) { + iounmap((void *)jdev->jpu_register.virt_addr); + jdev->jpu_register.virt_addr = 0x00; + } + + if (jdev->jpu_control_register.virt_addr) { + iounmap((void *)jdev->jpu_control_register.virt_addr); + jdev->jpu_control_register.virt_addr = 0x00; + } + + return 0; +} + +static void cvi_jpu_unregister_cdev(struct platform_device *pdev) +{ + struct cvi_jpu_device *jdev = platform_get_drvdata(pdev); + + if (jdev->s_jpu_major > 0) { + device_destroy(jdev->jpu_class, jdev->cdev_id); + class_destroy(jdev->jpu_class); + cdev_del(&jdev->cdev); + unregister_chrdev_region(jdev->cdev_id, 1); + jdev->s_jpu_major = 0; + } +} + +#ifdef CONFIG_PM +static int jpu_suspend(struct platform_device *pdev, pm_message_t state) +{ + struct cvi_jpu_device *jdev = platform_get_drvdata(pdev); + + set_clock_enable(jdev, JPEG_CLK_DISABLE); + + return 0; +} + +static int jpu_resume(struct platform_device *pdev) +{ + struct cvi_jpu_device *jdev = platform_get_drvdata(pdev); + + set_clock_enable(jdev, JPEG_CLK_ENABLE); + + return 0; +} +#else +#define jpu_suspend NULL +#define jpu_resume NULL +#endif /* !CONFIG_PM */ + +static struct platform_driver jpu_driver = { + .driver = { + .owner = THIS_MODULE, + .name = JPU_PLATFORM_DEVICE_NAME, + .of_match_table = cvi_jpu_match_table, + }, + .probe = jpu_probe, + .remove = jpu_remove, +#ifdef CONFIG_PM + .suspend = jpu_suspend, + .resume = jpu_resume, +#endif /* !CONFIG_PM */ +}; + +static int __init jpu_init(void) +{ + int res = 0; + + res = platform_driver_register(&jpu_driver); + + pr_info("end jpu_init result = 0x%x\n", res); + return res; +} + +static void __exit jpu_exit(void) +{ + pr_info("jpu_exit\n"); + platform_driver_unregister(&jpu_driver); +} + +MODULE_AUTHOR("Cvitek"); +MODULE_DESCRIPTION("JPEG linux driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(VERSION); + +module_init(jpu_init); +module_exit(jpu_exit); diff --git a/osdrv/interdrv/v2/jpeg/cvi_jpeg.h b/osdrv/interdrv/v2/jpeg/cvi_jpeg.h new file mode 100644 index 0000000000..28a73f4e9a --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/cvi_jpeg.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2021. All rights reserved. + * + * File Name: cvi_jpeg.h + * Description: jpeg system interface definition + */ + +#ifndef __CVI_JPEG_H__ +#define __CVI_JPEG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include "jpuconfig.h" +#include "jmm.h" + +#define USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY + +/* global device context to avoid kernal config mismatch in filp->private_data */ +#define JPU_SUPPORT_GLOBAL_DEVICE_CONTEXT + +typedef struct jpudrv_buffer_t { + __u32 size; + __u64 phys_addr; + __u64 base; /* kernel logical address in use kernel */ + __u8 *virt_addr; /* virtual user space address */ +#ifdef __arm__ + __u32 padding; /* padding for keeping same size of this structure */ +#endif +} jpudrv_buffer_t; + +/* To track the allocated memory buffer */ +struct jpudrv_buffer_pool_t { + struct list_head list; + struct jpudrv_buffer_t jb; + struct file *filp; +}; + +struct jpudrv_instance_pool_t { + unsigned char jpgInstPool[MAX_NUM_INSTANCE][MAX_INST_HANDLE_SIZE]; +}; + +/* To track the instance index and buffer in instance pool */ +struct jpudrv_instanace_list_t { + struct list_head list; + unsigned long inst_idx; + struct file *filp; +}; + +#define JPU_QUIRK_SUPPORT_CLOCK_CONTROL (1<<0) +#define JPU_QUIRK_SUPPORT_SWITCH_TO_PLL (1<<1) +#define JPU_QUIRK_SUPPORT_FPGA (1<<2) + +struct jpu_pltfm_data { + const struct jpu_ops *ops; + unsigned int quirks; + unsigned int version; +}; + +struct cvi_jpu_device { + struct device *dev; + + dev_t cdev_id; + struct cdev cdev; + + int s_jpu_major; + struct class *jpu_class; + + int jpu_irq; + int interrupt_flag; + + // inc when JDI_IOCTL_OPEN_INSTANCE is called, dec when JDI_IOCTL_CLOSE_INSTANCE is called + int open_instance_count; + + // inc when jpu_open is called, dec when jpu_release is called + int process_count; + + struct clk *clk_axi_video_codec; + struct clk *clk_jpeg; + struct clk *clk_apb_jpeg; + struct clk *clk_vc_src0; + struct clk *clk_vc_src1; + struct clk *clk_vc_src2; + struct clk *clk_cfg_reg_vc; + + jpudrv_buffer_t jpu_instance_pool; + struct jpudrv_buffer_t video_memory; + struct jpu_mm_struct jmem; + struct jpudrv_buffer_t jpu_register; + struct jpudrv_buffer_t jpu_control_register; + + wait_queue_head_t interrupt_wait_q; + spinlock_t jpu_lock; + struct fasync_struct *async_queue; + struct list_head s_jbp_head; + struct list_head s_jpu_inst_list_head; + + const struct jpu_pltfm_data *pdata; +}; + +struct jpu_ops { + void (*clk_get)(struct cvi_jpu_device *jdev); + void (*clk_put)(struct cvi_jpu_device *jdev); + void (*clk_enable)(struct cvi_jpu_device *jdev); + void (*clk_disable)(struct cvi_jpu_device *jdev); + void (*config_pll)(struct cvi_jpu_device *jdev); +}; + +struct jpu_intr_info_t { + unsigned int timeout; + int intr_reason; +}; + +#define JPEG_CLK_ENABLE 1 +#define JPEG_CLK_DISABLE 0 + +extern bool __clk_is_enabled(struct clk *clk); + +#ifdef __cplusplus +} +#endif + +#endif // __CVI_JPEG_H__ diff --git a/osdrv/interdrv/v2/jpeg/hal/cv180x b/osdrv/interdrv/v2/jpeg/hal/cv180x new file mode 120000 index 0000000000..d177554aca --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/hal/cv180x @@ -0,0 +1 @@ +cv181x \ No newline at end of file diff --git a/osdrv/interdrv/v2/jpeg/hal/cv181x/cvi_jpeg_cfg.c b/osdrv/interdrv/v2/jpeg/hal/cv181x/cvi_jpeg_cfg.c new file mode 100644 index 0000000000..4409708588 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/hal/cv181x/cvi_jpeg_cfg.c @@ -0,0 +1,102 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2021. All rights reserved. + * + * File Name: cv182x_jpeg_cfg.c + * Description: jpeg cv182x implementation + */ + +#include +#include +#include +#include "cvi_jpeg.h" +#include "jpeg_common.h" + +static void jpu_cfg_clk_enable(struct cvi_jpu_device *jdev); +static void jpu_cfg_clk_disable(struct cvi_jpu_device *jdev); +// static void jpu_fpga_init(struct cvi_jpu_device *jdev); + +const struct jpu_ops asic_jpu_ops = { + .clk_get = jpu_clk_get, + .clk_put = jpu_clk_put, + .clk_enable = jpu_cfg_clk_enable, + .clk_disable = jpu_cfg_clk_disable, + .config_pll = NULL, +}; +#if 0 + +const struct jpu_ops fpga_jpu_ops = { + .clk_get = NULL, + .clk_put = NULL, + .clk_enable = jpu_fpga_init, + .clk_disable = NULL, + .config_pll = NULL, +}; + +static const struct jpu_pltfm_data fpga_jpu_pdata = { + .ops = &fpga_jpu_ops, + .quirks = JPU_QUIRK_SUPPORT_FPGA, + .version = 0x1821A, +}; + +static const struct jpu_pltfm_data pxp_jpu_pdata = { + .ops = NULL, + .quirks = 0, + .version = 0x1821A, +}; +#endif +static const struct jpu_pltfm_data asic_jpu_pdata = { + .ops = &asic_jpu_ops, + .quirks = JPU_QUIRK_SUPPORT_CLOCK_CONTROL, + .version = 0x1821A, +}; + +const struct of_device_id cvi_jpu_match_table[] = { +#if 0 + { .compatible = "cvitek,fpga-jpeg", .data = &fpga_jpu_pdata}, // for fpga + { .compatible = "cvitek,pxp-jpeg", .data = &pxp_jpu_pdata}, // for pxp +#endif + { .compatible = "cvitek,asic-jpeg", .data = &asic_jpu_pdata}, // for asic + {}, +}; + +MODULE_DEVICE_TABLE(of, cvi_jpu_match_table); + +static void jpu_cfg_clk_enable(struct cvi_jpu_device *jdev) +{ + WARN_ON(!jdev->clk_jpeg); + WARN_ON(!jdev->clk_apb_jpeg); + WARN_ON(!jdev->clk_vc_src0); + WARN_ON(!jdev->clk_cfg_reg_vc); + WARN_ON(!jdev->clk_axi_video_codec); + + clk_prepare_enable(jdev->clk_jpeg); + clk_prepare_enable(jdev->clk_apb_jpeg); + + clk_prepare_enable(jdev->clk_vc_src0); + clk_prepare_enable(jdev->clk_cfg_reg_vc); + clk_prepare_enable(jdev->clk_axi_video_codec); +} + +static void jpu_cfg_clk_disable(struct cvi_jpu_device *jdev) +{ + if (jpu_mask & JPU_MASK_DISABLE_CLK_GATING) + return; +#if 0 + clk_disable_unprepare(jdev->clk_jpeg); + clk_disable_unprepare(jdev->clk_apb_jpeg); + + clk_disable_unprepare(jdev->clk_vc_src0); + clk_disable_unprepare(jdev->clk_cfg_reg_vc); + clk_disable_unprepare(jdev->clk_axi_video_codec); +#endif +} +#if 0 +static void jpu_fpga_init(struct cvi_jpu_device *jdev) +{ +#if 0 + jpudrv_buffer_t *pReg = &jdev->jpu_control_register; + + writel(0xFF, pReg->virt_addr + 0x30); // reg_dis_fab_lp_opt, bus low power control off +#endif +} +#endif \ No newline at end of file diff --git a/osdrv/interdrv/v2/jpeg/hal/mars b/osdrv/interdrv/v2/jpeg/hal/mars new file mode 120000 index 0000000000..d177554aca --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/hal/mars @@ -0,0 +1 @@ +cv181x \ No newline at end of file diff --git a/osdrv/interdrv/v2/jpeg/hal/phobos b/osdrv/interdrv/v2/jpeg/hal/phobos new file mode 120000 index 0000000000..313209b2c8 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/hal/phobos @@ -0,0 +1 @@ +cv180x \ No newline at end of file diff --git a/osdrv/interdrv/v2/jpeg/jmm.c b/osdrv/interdrv/v2/jpeg/jmm.c new file mode 100644 index 0000000000..8f8755ff88 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/jmm.c @@ -0,0 +1,578 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2021. All rights reserved. + * + * File Name: jmm.c + * Description: jpeg memory management + */ +#if 0 +#include +#include "jmm.h" + +static struct avl_node_struct *make_avl_node(unsigned long long key, + struct page_struct *page) +{ + struct avl_node_struct *node = (struct avl_node_struct *)VMEM_P_ALLOC( + sizeof(struct avl_node_struct)); + + node->key = key; + node->page = page; + node->height = 0; + node->left = NULL; + node->right = NULL; + + return node; +} + +static int get_balance_factor(struct avl_node_struct *tree) +{ + int factor = 0; + + if (tree) { + factor = VMEM_HEIGHT(tree->right) - VMEM_HEIGHT(tree->left); + } + + return factor; +} + +/* + * Left Rotation + * + * A B + * \ / \ + * B => A C + * / \ \ + * D C D + * + */ +static struct avl_node_struct *rotation_left(struct avl_node_struct *tree) +{ + struct avl_node_struct *rchild; + struct avl_node_struct *lchild; + + if (tree == NULL) + return NULL; + + rchild = tree->right; + if (rchild == NULL) { + return tree; + } + + lchild = rchild->left; + rchild->left = tree; + tree->right = lchild; + + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + 1; + rchild->height = + MAX(VMEM_HEIGHT(rchild->left), VMEM_HEIGHT(rchild->right)) + 1; + + return rchild; +} + +/* + * Reft Rotation + * + * A B + * \ / \ + * B => D A + * / \ / + * D C C + * + */ +static struct avl_node_struct *rotation_right(struct avl_node_struct *tree) +{ + struct avl_node_struct *rchild; + struct avl_node_struct *lchild; + + if (tree == NULL) + return NULL; + + lchild = tree->left; + if (lchild == NULL) + return NULL; + + rchild = lchild->right; + lchild->right = tree; + tree->left = rchild; + + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + 1; + lchild->height = + MAX(VMEM_HEIGHT(lchild->left), VMEM_HEIGHT(lchild->right)) + 1; + + return lchild; +} + +static struct avl_node_struct *do_balance(struct avl_node_struct *tree) +{ + int bfactor = 0, child_bfactor; /* balancing factor */ + + bfactor = get_balance_factor(tree); + + if (bfactor >= 2) { + child_bfactor = get_balance_factor(tree->right); + if (child_bfactor == 1 || child_bfactor == 0) { + tree = rotation_left(tree); + } else if (child_bfactor == -1) { + tree->right = rotation_right(tree->right); + tree = rotation_left(tree); + } else { + JPU_DBG_ERR("invalid balancing factor: %d\n", + child_bfactor); + VMEM_ASSERT(0); + return NULL; + } + } else if (bfactor <= -2) { + child_bfactor = get_balance_factor(tree->left); + if (child_bfactor == -1 || child_bfactor == 0) { + tree = rotation_right(tree); + } else if (child_bfactor == 1) { + tree->left = rotation_left(tree->left); + tree = rotation_right(tree); + } else { + JPU_DBG_ERR("invalid balancing factor: %d\n", + child_bfactor); + VMEM_ASSERT(0); + return NULL; + } + } + + return tree; +} +static struct avl_node_struct * +unlink_end_node(struct avl_node_struct *tree, int dir, + struct avl_node_struct **found_node) +{ + struct avl_node_struct *node; + *found_node = NULL; + + if (tree == NULL) + return NULL; + + if (dir == LEFT) { + if (tree->left == NULL) { + *found_node = tree; + return NULL; + } + } else { + if (tree->right == NULL) { + *found_node = tree; + return NULL; + } + } + + if (dir == LEFT) { + node = tree->left; + tree->left = unlink_end_node(tree->left, LEFT, found_node); + if (tree->left == NULL) { + tree->left = (*found_node)->right; + (*found_node)->left = NULL; + (*found_node)->right = NULL; + } + } else { + node = tree->right; + tree->right = unlink_end_node(tree->right, RIGHT, found_node); + if (tree->right == NULL) { + tree->right = (*found_node)->left; + (*found_node)->left = NULL; + (*found_node)->right = NULL; + } + } + + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + 1; + + return do_balance(tree); +} + +static struct avl_node_struct *avltree_insert(struct avl_node_struct *tree, + unsigned long long key, + struct page_struct *page) +{ + if (tree == NULL) { + tree = make_avl_node(key, page); + } else { + if (key >= tree->key) { + tree->right = avltree_insert(tree->right, key, page); + } else { + tree->left = avltree_insert(tree->left, key, page); + } + } + + tree = do_balance(tree); + + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + 1; + + return tree; +} + +static struct avl_node_struct *do_unlink(struct avl_node_struct *tree) +{ + struct avl_node_struct *node; + struct avl_node_struct *end_node; + + node = unlink_end_node(tree->right, LEFT, &end_node); + if (node) { + tree->right = node; + } else { + node = unlink_end_node(tree->left, RIGHT, &end_node); + if (node) + tree->left = node; + } + + if (node == NULL) { + node = tree->right ? tree->right : tree->left; + end_node = node; + } + + if (end_node) { + end_node->left = + (tree->left != end_node) ? tree->left : end_node->left; + end_node->right = (tree->right != end_node) ? tree->right : + end_node->right; + end_node->height = MAX(VMEM_HEIGHT(end_node->left), + VMEM_HEIGHT(end_node->right)) + + 1; + } + + tree = end_node; + + return tree; +} + +static struct avl_node_struct * +avltree_remove(struct avl_node_struct *tree, + struct avl_node_struct **found_node, unsigned long long key) +{ + *found_node = NULL; + if (tree == NULL) { + JPU_DBG_ERR("failed to find key %lu\n", (unsigned long)key); + return NULL; + } + + if (key == tree->key) { + *found_node = tree; + tree = do_unlink(tree); + } else if (key > tree->key) { + tree->right = avltree_remove(tree->right, found_node, key); + } else { + tree->left = avltree_remove(tree->left, found_node, key); + } + + if (tree) + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + + 1; + + tree = do_balance(tree); + + return tree; +} + +static void jpu_avltree_free(struct avl_node_struct *tree) +{ + if (tree == NULL) + return; + if (tree->left == NULL && tree->right == NULL) { + VMEM_P_FREE(tree); + return; + } + + jpu_avltree_free(tree->left); + tree->left = NULL; + jpu_avltree_free(tree->right); + tree->right = NULL; + VMEM_P_FREE(tree); +} + +static struct avl_node_struct * +remove_approx_value(struct avl_node_struct *tree, + struct avl_node_struct **found, unsigned long long key) +{ + *found = NULL; + if (tree == NULL) { + return NULL; + } + + if (key == tree->key) { + *found = tree; + tree = do_unlink(tree); + } else if (key > tree->key) { + tree->right = remove_approx_value(tree->right, found, key); + } else { + tree->left = remove_approx_value(tree->left, found, key); + if (*found == NULL) { + *found = tree; + tree = do_unlink(tree); + } + } + if (tree) + tree->height = + MAX(VMEM_HEIGHT(tree->left), VMEM_HEIGHT(tree->right)) + + 1; + tree = do_balance(tree); + + return tree; +} + +static void set_blocks_free(struct jpu_mm_struct *mm, int pageno, int npages) +{ + int last_pageno = pageno + npages - 1; + int i; + struct page_struct *page; + struct page_struct *last_page; + + VMEM_ASSERT(npages); + + if (last_pageno >= mm->num_pages) { + JPU_DBG_ERR("set_blocks_free: invalid last page number: %d\n", + last_pageno); + VMEM_ASSERT(0); + return; + } + + for (i = pageno; i <= last_pageno; i++) { + mm->page_list[i].used = 0; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].first_pageno = -1; + } + + page = &mm->page_list[pageno]; + page->alloc_pages = npages; + last_page = &mm->page_list[last_pageno]; + last_page->first_pageno = pageno; + + mm->free_tree = + avltree_insert(mm->free_tree, MAKE_KEY(npages, pageno), page); +} + +static void set_blocks_alloc(struct jpu_mm_struct *mm, int pageno, int npages) +{ + int last_pageno = pageno + npages - 1; + int i; + struct page_struct *page; + struct page_struct *last_page; + + if (last_pageno >= mm->num_pages) { + JPU_DBG_ERR("set_blocks_free: invalid last page number: %d\n", + last_pageno); + VMEM_ASSERT(0); + return; + } + + for (i = pageno; i <= last_pageno; i++) { + mm->page_list[i].used = 1; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].first_pageno = -1; + } + + page = &mm->page_list[pageno]; + page->alloc_pages = npages; + + last_page = &mm->page_list[last_pageno]; + last_page->first_pageno = pageno; + + mm->alloc_tree = + avltree_insert(mm->alloc_tree, MAKE_KEY(page->addr, 0), page); +} + +int jmem_init(struct jpu_mm_struct *mm, unsigned long addr, unsigned long size) +{ + int i; + + mm->base_addr = (addr + (JMEM_PAGE_SIZE - 1)) & ~(JMEM_PAGE_SIZE - 1); + mm->mem_size = size & ~JMEM_PAGE_SIZE; + mm->num_pages = mm->mem_size / JMEM_PAGE_SIZE; + mm->free_tree = NULL; + mm->alloc_tree = NULL; + mm->free_page_count = mm->num_pages; + mm->alloc_page_count = 0; + mm->page_list = (struct page_struct *)VMEM_P_ALLOC( + mm->num_pages * sizeof(struct page_struct)); + if (mm->page_list == NULL) { + pr_err("%s:%d failed to vmalloc(%d)\n", __func__, __LINE__, + (int)(mm->num_pages * sizeof(struct page_struct))); + return -1; + } + + JPU_DBG_MEM("mem_size = 0x%lx, num_pages = %d\n", mm->mem_size, + mm->num_pages); + + for (i = 0; i < mm->num_pages; i++) { + mm->page_list[i].pageno = i; + mm->page_list[i].addr = mm->base_addr + i * JMEM_PAGE_SIZE; + mm->page_list[i].alloc_pages = 0; + mm->page_list[i].used = 0; + mm->page_list[i].first_pageno = -1; + } + + set_blocks_free(mm, 0, mm->num_pages); + + return 0; +} + +int jmem_exit(struct jpu_mm_struct *mm) +{ + if (mm == NULL) { + JPU_DBG_ERR("vmem_exit: invalid handle\n"); + return -1; + } + + if (mm->free_tree) { + jpu_avltree_free(mm->free_tree); + } + if (mm->alloc_tree) { + jpu_avltree_free(mm->alloc_tree); + } + + if (mm->page_list) { + VMEM_P_FREE(mm->page_list); + mm->page_list = NULL; + } + + mm->base_addr = 0; + mm->mem_size = 0; + mm->num_pages = 0; + mm->page_list = NULL; + mm->free_tree = NULL; + mm->alloc_tree = NULL; + mm->free_page_count = 0; + mm->alloc_page_count = 0; + return 0; +} + +unsigned long jmem_alloc(struct jpu_mm_struct *mm, int size, unsigned long pid) +{ + struct avl_node_struct *node; + struct page_struct *free_page; + int npages, free_size; + int alloc_pageno; + unsigned long ptr; + + if (mm == NULL) { + JPU_DBG_ERR("jmem_alloc: invalid handle\n"); + return -1; + } + + if (size <= 0) + return -1; + + npages = (size + JMEM_PAGE_SIZE - 1) / JMEM_PAGE_SIZE; + + mm->free_tree = + remove_approx_value(mm->free_tree, &node, MAKE_KEY(npages, 0)); + if (node == NULL) { + return -1; + } + free_page = node->page; + free_size = KEY_TO_VALUE(node->key); + + alloc_pageno = free_page->pageno; + set_blocks_alloc(mm, alloc_pageno, npages); + if (npages != free_size) { + int free_pageno = alloc_pageno + npages; + + set_blocks_free(mm, free_pageno, (free_size - npages)); + } + + VMEM_P_FREE(node); + + ptr = mm->page_list[alloc_pageno].addr; + mm->alloc_page_count += npages; + mm->free_page_count -= npages; + + JPU_DBG_MEM("npages = %d, free_page_count = %d\n", npages, mm->free_page_count); + + return ptr; +} + +int jmem_free(struct jpu_mm_struct *mm, unsigned long ptr, unsigned long pid) +{ + unsigned long addr; + struct avl_node_struct *found; + struct page_struct *page; + int pageno, prev_free_pageno, next_free_pageno; + int prev_size, next_size; + int merge_page_no, merge_page_size, free_page_size; + + if (mm == NULL) { + JPU_DBG_ERR("vmem_free: invalid handle\n"); + return -1; + } + + addr = ptr; + + mm->alloc_tree = + avltree_remove(mm->alloc_tree, &found, MAKE_KEY(addr, 0)); + if (found == NULL) { + JPU_DBG_ERR("vmem_free: 0x%lx not found\n", addr); + VMEM_ASSERT(0); + return -1; + } + + /* find previous free block */ + page = found->page; + pageno = page->pageno; + free_page_size = page->alloc_pages; + prev_free_pageno = pageno - 1; + prev_size = -1; + if (prev_free_pageno >= 0) { + if (mm->page_list[prev_free_pageno].used == 0) { + prev_free_pageno = + mm->page_list[prev_free_pageno].first_pageno; + prev_size = mm->page_list[prev_free_pageno].alloc_pages; + } + } + + /* find next free block */ + next_free_pageno = pageno + page->alloc_pages; + next_free_pageno = + (next_free_pageno == mm->num_pages) ? -1 : next_free_pageno; + next_size = -1; + if (next_free_pageno >= 0) { + if (mm->page_list[next_free_pageno].used == 0) { + next_size = mm->page_list[next_free_pageno].alloc_pages; + } + } + VMEM_P_FREE(found); + + /* merge */ + merge_page_no = page->pageno; + merge_page_size = page->alloc_pages; + if (prev_size >= 0) { + mm->free_tree = + avltree_remove(mm->free_tree, &found, + MAKE_KEY(prev_size, prev_free_pageno)); + if (found == NULL) { + VMEM_ASSERT(0); + return -1; + } + merge_page_no = found->page->pageno; + merge_page_size += found->page->alloc_pages; + VMEM_P_FREE(found); + } + if (next_size >= 0) { + mm->free_tree = + avltree_remove(mm->free_tree, &found, + MAKE_KEY(next_size, next_free_pageno)); + if (found == NULL) { + VMEM_ASSERT(0); + return -1; + } + merge_page_size += found->page->alloc_pages; + VMEM_P_FREE(found); + } + + page->alloc_pages = 0; + page->first_pageno = -1; + + set_blocks_free(mm, merge_page_no, merge_page_size); + + mm->alloc_page_count -= free_page_size; + mm->free_page_count += free_page_size; + + return 0; +} + +#endif \ No newline at end of file diff --git a/osdrv/interdrv/v2/jpeg/jmm.h b/osdrv/interdrv/v2/jpeg/jmm.h new file mode 100644 index 0000000000..5ac13751d1 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/jmm.h @@ -0,0 +1,159 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2021. All rights reserved. + * + * File Name: jmm.h + * Description: jpeg memory management definition + */ + +#ifndef __JMM_H__ +#define __JMM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int jpu_mask; + +#define JPU_MASK_ERR 0x1 +#define JPU_MASK_WARN 0x2 +#define JPU_MASK_INFO 0x4 +#define JPU_MASK_FLOW 0x8 +#define JPU_MASK_DBG 0x10 +#define JPU_MASK_MEM 0x80 +#define JPU_MASK_CLK 0x100 +#define JPU_MASK_TRACE 0x1000 +#define JPU_MASK_DISABLE_CLK_GATING 0x2000 + +#define JPU_DBG_MSG_ENABLE +#ifdef JPU_DBG_MSG_ENABLE +#define JPU_DBG_ERR(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_ERR) \ + pr_info("[ERR] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_WARN(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_WARN) \ + pr_info("[WARN] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_INFO(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_INFO) \ + pr_info("[INFO] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_FLOW(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_FLOW) \ + pr_info("[FLOW] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_DBG(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_DBG) \ + pr_info("[DBG] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_MEM(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_MEM) \ + pr_info("[MEM] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_CLK(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_CLK) \ + pr_info("[CLK] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_TRACE(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_TRACE) \ + pr_info("[TRACE] %s = %d, " msg, __func__, __LINE__,\ + ##__VA_ARGS__); \ + } while (0) +#else +#define JPU_DBG_ERR(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_ERR) \ + pr_info("[ERR] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_WARN(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_WARN) \ + pr_info("[WARN] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_INFO(msg, ...) \ + do { \ + if (jpu_mask & JPU_MASK_INFO) \ + pr_info("[INFO] %s = %d, " msg, __func__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#define JPU_DBG_FLOW(msg, ...) +#define JPU_DBG_DBG(msg, ...) +#define JPU_DBG_MEM(msg, ...) +#define JPU_DBG_TRACE(msg, ...) +#endif + +#define JMEM_PAGE_SIZE (16 * 1024) +#define MAKE_KEY(_a, _b) (((unsigned long long)_a) << 32 | _b) +#define KEY_TO_VALUE(_key) (_key >> 32) + +enum rotation_dir_t { LEFT, RIGHT }; + +struct page_struct { + int pageno; + unsigned long addr; + int used; + int alloc_pages; + int first_pageno; +}; + +struct avl_node_struct { + unsigned long long key; + int height; + struct page_struct *page; + struct avl_node_struct *left; + struct avl_node_struct *right; +}; + +struct jpu_mm_struct { + struct avl_node_struct *free_tree; + struct avl_node_struct *alloc_tree; + struct page_struct *page_list; + int num_pages; + unsigned long base_addr; + unsigned long mem_size; + int free_page_count; + int alloc_page_count; +}; + +#define VMEM_P_ALLOC(_x) vmalloc(_x) +#define VMEM_P_FREE(_x) vfree(_x) +#define VMEM_ASSERT(_exp) \ + do { \ + if (!(_exp)) \ + JPU_DBG_MEM("VMEM_ASSERT at %s:%d\n", __FILE__, __LINE__); \ + } while (0) +#define VMEM_HEIGHT(_tree) (_tree == NULL ? -1 : _tree->height) +#define MAX(_a, _b) (_a >= _b ? _a : _b) + +struct avl_node_data_struct { + int key; + struct page_struct *page; +}; + +int jmem_init(struct jpu_mm_struct *mm, unsigned long addr, unsigned long size); +int jmem_exit(struct jpu_mm_struct *mm); +unsigned long jmem_alloc(struct jpu_mm_struct *mm, int size, unsigned long pid); +int jmem_free(struct jpu_mm_struct *mm, unsigned long ptr, unsigned long pid); + +#ifdef __cplusplus +} +#endif + +#endif /* __JMM_H__ */ diff --git a/osdrv/interdrv/v2/jpeg/jpeg_common.c b/osdrv/interdrv/v2/jpeg/jpeg_common.c new file mode 100644 index 0000000000..8f16d223a6 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/jpeg_common.c @@ -0,0 +1,145 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2021. All rights reserved. + * + * File Name: jpeg_common.c + * Description: jpeg chip common interface + */ + +#include +#include +#include +#include +#include +#include "cvi_jpeg.h" +#include "jpeg_common.h" + +void jpu_clk_get(struct cvi_jpu_device *jdev) +{ + struct device *dev = jdev->dev; + + jdev->clk_axi_video_codec = devm_clk_get(dev, "clk_axi_video_codec"); + if (IS_ERR(jdev->clk_axi_video_codec)) { + dev_err(dev, "failed to get clk_axi_video_codec\n"); + } + jdev->clk_jpeg = devm_clk_get(dev, "clk_jpeg"); + if (IS_ERR(jdev->clk_jpeg)) { + dev_err(dev, "failed to get clk_jpeg\n"); + } + jdev->clk_apb_jpeg = devm_clk_get(dev, "clk_apb_jpeg"); + if (IS_ERR(jdev->clk_apb_jpeg)) { + dev_err(dev, "failed to get clk_apb_jpeg\n"); + } + jdev->clk_vc_src0 = devm_clk_get(dev, "clk_vc_src0"); + if (IS_ERR(jdev->clk_vc_src0)) { + dev_err(dev, "failed to get clk_vc_src0\n"); + } + jdev->clk_vc_src1 = devm_clk_get(dev, "clk_vc_src1"); + if (IS_ERR(jdev->clk_vc_src1)) { + dev_err(dev, "failed to get clk_vc_src1\n"); + } + jdev->clk_vc_src2 = devm_clk_get(dev, "clk_vc_src2"); + if (IS_ERR(jdev->clk_vc_src2)) { + dev_err(dev, "failed to get clk_vc_src2\n"); + } + jdev->clk_cfg_reg_vc = devm_clk_get(dev, "clk_cfg_reg_vc"); + if (IS_ERR(jdev->clk_cfg_reg_vc)) { + dev_err(dev, "failed to get clk_cfg_reg_vc\n"); + } +} + +void jpu_clk_put(struct cvi_jpu_device *jdev) +{ + struct device *dev = jdev->dev; + + devm_clk_put(dev, jdev->clk_jpeg); +} +#if 0 +void jpu_clk_enable(struct cvi_jpu_device *jdev) +{ + JPU_DBG_CLK("enable\n"); + + clk_prepare_enable(jdev->clk_jpeg); + + clk_prepare_enable(jdev->clk_apb_jpeg); + + clk_prepare_enable(jdev->clk_vc_src0); + clk_prepare_enable(jdev->clk_vc_src1); + clk_prepare_enable(jdev->clk_vc_src2); + + clk_prepare_enable(jdev->clk_cfg_reg_vc); +} + +void jpu_clk_disable(struct cvi_jpu_device *jdev) +{ + if (jpu_mask & JPU_MASK_DISABLE_CLK_GATING) + return; + + clk_disable_unprepare(jdev->clk_jpeg); + + clk_disable_unprepare(jdev->clk_apb_jpeg); + + clk_disable_unprepare(jdev->clk_vc_src0); + clk_disable_unprepare(jdev->clk_vc_src1); + clk_disable_unprepare(jdev->clk_vc_src2); + + clk_disable_unprepare(jdev->clk_cfg_reg_vc); +} + +void cv1835_config_pll(struct cvi_jpu_device *jdev) +{ + unsigned int val; + void __iomem *base_030001; + void __iomem *base_030028; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + base_030001 = ioremap(0x03000100, 0x100); + base_030028 = ioremap(0x03002800, 0x100); +#else + base_030001 = ioremap_nocache(0x03000100, 0x100); + base_030028 = ioremap_nocache(0x03002800, 0x100); +#endif + + // 0x03002840 = 0x3E //enable synthesizer clock enable + writel(0x3E, base_030028 + 0x40); + + // 0x03002854 = 385505882 //set apll synthesizer 104.4480001 M + writel(385505882, base_030028 + 0x54); + + //0x03002850 ^= 0x00000001 // bit 0 toggle + val = readl(base_030028 + 0x50); + writel((val ^ 0x1), base_030028 + 0x50); + + // 0x0300280C = 0x01108201 // set apll *8/2 + writel(0x01108201, base_030028 + 0x0C); + + // 0x03002800 &= ~0x00000010 //clear apll pd , apll = 417.792 + val = readl(base_030028 + 0x00); + writel((val &= (~0x10)), base_030028 + 0x00); + + // 0x03002884 = 421827145 //set cam1 synthesizer 95.45454549 M + writel(421827145, base_030028 + 0x84); + + // 0x03002880 ^= 0x00000001 // bit 0 toggle + val = readl(base_030028 + 0x80); + writel((val ^ 0x1), base_030028 + 0x80); + + // 0x03002818 = 0x00168000 // set cam1 *11/1 + writel(0x00168000, base_030028 + 0x18); + + // 0x03002800 &= ~0x00010000 //clear cam1pll pd , cam1pll = 1050 + val = readl(base_030028 + 0x00); + writel((val &= (~0x00010000)), base_030028 + 0x00); + + // #=========measure apll + // 0x03000140 = 0x00000000 + // 0x03000140 = 0x00000049 + // Read 0x03000140 >>8 = ~ 2085 + + // #=========measure cam1pll + // 0x03000140 = 0x00000000 + // 0x03000140 = 0x00000079 + // Read 0x03000140 >>8 = ~ 5250 + iounmap(base_030001); + iounmap(base_030028); +} +#endif \ No newline at end of file diff --git a/osdrv/interdrv/v2/jpeg/jpeg_common.h b/osdrv/interdrv/v2/jpeg/jpeg_common.h new file mode 100644 index 0000000000..49e7fb3580 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/jpeg_common.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2021. All rights reserved. + * + * File Name: jpeg_common.h + * Description: jpeg chip common interface definition + */ + +#ifndef __JPEG_COMMON_H__ +#define __JPEG_COMMON_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "cvi_jpeg.h" + +extern const struct of_device_id cvi_jpu_match_table[]; + +void jpu_clk_disable(struct cvi_jpu_device *jdev); +void jpu_clk_enable(struct cvi_jpu_device *jdev); +void jpu_clk_get(struct cvi_jpu_device *jdev); +void jpu_clk_put(struct cvi_jpu_device *jdev); +void cv1835_config_pll(struct cvi_jpu_device *jdev); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/osdrv/interdrv/v2/jpeg/jpuconfig.h b/osdrv/interdrv/v2/jpeg/jpuconfig.h new file mode 100644 index 0000000000..29bef93d11 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/jpuconfig.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2021. All rights reserved. + * + * File Name: jpuconfig.h + * Description: jpeg hardware configuration + */ + +#ifndef _JPU_CONFIG_H_ +#define _JPU_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "config.h" + +#define MAX_NUM_INSTANCE 8 +#define MAX_INST_HANDLE_SIZE (13 * 1024) + +#ifdef JPU_FPGA_PLATFORM +#define JPU_FRAME_ENDIAN JDI_BIG_ENDIAN +#define JPU_STREAM_ENDIAN JDI_BIG_ENDIAN +#else +#define JPU_FRAME_ENDIAN JDI_LITTLE_ENDIAN +#define JPU_STREAM_ENDIAN JDI_LITTLE_ENDIAN +#endif +#define JPU_CHROMA_INTERLEAVE \ + 1 // 0 (chroma separate mode), 1 (cbcr interleave mode), 2 (crcb interleave mode) + +#define JPU_INTERRUPT_TIMEOUT_MS 2000 + +#define JPU_STUFFING_BYTE_FF 0 // 0 : ON ("0xFF"), 1 : OFF ("0x00") for stuffing + +#define JPU_PARTIAL_DECODE 1 // 0 : OFF, 1 : ON + +#define MAX_MJPG_PIC_WIDTH 32768 +#define MAX_MJPG_PIC_HEIGHT 32768 + +// TODO +#define MAX_FRAME \ + (19 * \ + MAX_NUM_INSTANCE) // For AVC decoder, 16(reference) + 2(current) + 1(rotator) +#define MAX_FRAME_JPU 4 // the number of frame buffers for JPEG + +#define STREAM_FILL_SIZE 0x10000 +#define STREAM_END_SIZE 0 + +#define JPU_GBU_SIZE 512 + +#define JPU_CHECK_WRITE_RESPONSE_BVALID_SIGNAL 0 + +#ifdef __cplusplus +} +#endif + +#endif /* _JPU_CONFIG_H_ */ diff --git a/osdrv/interdrv/v2/jpeg/mars/soph_jpeg.ko b/osdrv/interdrv/v2/jpeg/mars/soph_jpeg.ko deleted file mode 100644 index 81fcddca12..0000000000 Binary files a/osdrv/interdrv/v2/jpeg/mars/soph_jpeg.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/jpeg/mars_arm/soph_jpeg.ko b/osdrv/interdrv/v2/jpeg/mars_arm/soph_jpeg.ko deleted file mode 100644 index fa878fd2b0..0000000000 Binary files a/osdrv/interdrv/v2/jpeg/mars_arm/soph_jpeg.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/jpeg/mars_riscv/soph_jpeg.ko b/osdrv/interdrv/v2/jpeg/mars_riscv/soph_jpeg.ko deleted file mode 100644 index 81fcddca12..0000000000 Binary files a/osdrv/interdrv/v2/jpeg/mars_riscv/soph_jpeg.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/jpeg/phobos/soph_jpeg.ko b/osdrv/interdrv/v2/jpeg/phobos/soph_jpeg.ko deleted file mode 100644 index 81fcddca12..0000000000 Binary files a/osdrv/interdrv/v2/jpeg/phobos/soph_jpeg.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/jpeg/phobos_riscv/soph_jpeg.ko b/osdrv/interdrv/v2/jpeg/phobos_riscv/soph_jpeg.ko deleted file mode 100644 index 81fcddca12..0000000000 Binary files a/osdrv/interdrv/v2/jpeg/phobos_riscv/soph_jpeg.ko and /dev/null differ diff --git a/osdrv/interdrv/v2/jpeg/scripts/load_jpu.sh b/osdrv/interdrv/v2/jpeg/scripts/load_jpu.sh new file mode 100755 index 0000000000..245f1b6eb3 --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/scripts/load_jpu.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +module="jpu" +device="jpu" +mode="664" + +# Group: since distributions do it differently, look for wheel or use staff +if grep '^staff:' /etc/group > /dev/null; then + group="staff" +else + group="wheel" +fi + +# invoke insmod with all arguments we got +# and use a pathname, as newer modutils don't look in . by default +insmod /lib/modules/$module.ko $* || exit 1 + +major=`cat /proc/devices | awk "\\$2==\"$module\" {print \\$1}"` + +# Remove stale nodes and replace them, then give gid and perms +# Usually the script is shorter, it's simple that has several devices in it. + +rm -f /dev/${device} +mknod /dev/${device} c $major 0 +chgrp $group /dev/${device} +chmod $mode /dev/${device} +chown $SUDO_USER.$SUDO_USER /dev/${device} diff --git a/osdrv/interdrv/v2/jpeg/scripts/unload_jpu.sh b/osdrv/interdrv/v2/jpeg/scripts/unload_jpu.sh new file mode 100755 index 0000000000..302d5fcbbc --- /dev/null +++ b/osdrv/interdrv/v2/jpeg/scripts/unload_jpu.sh @@ -0,0 +1,9 @@ +#!/bin/sh +module="jpu" +device="jpu" + +# invoke rmmod with all arguments we got +rmmod /lib/modules/$module $* || exit 1 + +# Remove stale nodes +rm -f /dev/${device} diff --git a/osdrv/interdrv/v2/vi/chip/mars/cmdq.c b/osdrv/interdrv/v2/vi/chip/mars/cmdq.c new file mode 100644 index 0000000000..62475ad5e2 --- /dev/null +++ b/osdrv/interdrv/v2/vi/chip/mars/cmdq.c @@ -0,0 +1,186 @@ +#ifdef ENV_CVITEST +#include +#include +#include "system_common.h" +#include "timer.h" +#elif defined(ENV_EMU) +#include +#include +#include +#include +#include +#include +#include "emu/command.h" +#else +#include +#include +#endif // ENV_CVITEST + +#include "reg.h" +#include "cmdq.h" + +#define REG_CMDQ_INT_EVENT 0x00 +#define REG_CMDQ_INT_EN 0x04 +#define REG_CMDQ_DMA_ADDR_L 0x08 +#define REG_CMDQ_DMA_ADDR_H 0x0C +#define REG_CMDQ_DMA_CNT 0x10 +#define REG_CMDQ_DMA_CONFIG 0x14 +#define REG_CMDQ_DMA_PARA 0x18 +#define REG_CMDQ_JOB_CTL 0x1C +#define REG_CMDQ_STATUS 0x20 +#define REG_CMDQ_APB_PARA 0x24 +#define REG_CMDQ_SOFT_RST 0x28 +#define REG_CMDQ_DEBUG 0x2c +#define REG_CMDQ_DUMMY 0x30 + +/** + * cmdQ_set_package - package reg_write to cmd_set. + * + */ +void cmdQ_set_package(struct cmdq_set_reg *set, u32 addr, u32 data) +{ + set->data = data; + set->addr = addr >> 2; + set->byte_mask = 0xf; + set->intr_end = 0; + set->intr_int = 0; + set->intr_last = 0; + set->intr_rsv = 0; + set->action = CMDQ_SET_REG; +} + +/** + * cmdQ_set_package - package reg_write to cmd_set. + * + * @param set: the set to modify + * @param is_timer: 1: wait_timer, 0: wait_flag + * @param data: the data of wait condition. + * counter if timer and flag_num if flag + * @param intr: the interrupt condition + */ +void cmdQ_set_wait(union cmdq_set *set, bool is_timer, u32 data, u8 intr) +{ + if (is_timer) { + struct cmdq_set_wait_timer *wait = &(set->wait_timer); + + wait->counter = data; + wait->intr_end = intr & 0x01; + wait->intr_int = (intr >> 1) & 0x01; + wait->intr_last = (intr >> 2) & 0x01; + wait->action = CMDQ_SET_WAIT_TIMER; + } else { + struct cmdq_set_wait_flags *wait = &(set->wait_flags); + + wait->flag_num = data; + wait->intr_end = intr & 0x01; + wait->intr_int = (intr >> 1) & 0x01; + wait->intr_last = (intr >> 2) & 0x01; + wait->action = CMDQ_SET_WAIT_FLAG; + } +} + +/** + * cmdQ_adma_package - package adma entries. + * + * @param item: adma entry to modify + * @param addr: address of link/cmd_set + * @param size: size(bytes) if only this is cmd_set + * @param is_link: 1: link descriptor, 2: cmd_set + * @param is_end: true if this is last entry in adma-table. + */ +void cmdQ_adma_package(struct cmdq_adma *item, u64 addr, u32 size, + bool is_link, bool is_end) +{ + item->addr = addr; + item->size = size; + item->flags_end = is_end ? 1 : 0; + item->flags_link = is_link ? 1 : 0; +} + +/** + * cmdQ_intr_ctrl - cmdQ's interrupt on(1)/off(0) + * bit0: cmdQ intr, bit1: cmdQ end, bit2: cmdQ wait + * + * @param intr_mask: On/Off ctrl of the interrupt. + */ +void cmdQ_intr_ctrl(uintptr_t base, u8 intr_mask) +{ + _reg_write(base + REG_CMDQ_INT_EN, intr_mask); +} + +/** + * cmdQ_intr_ctrl - clear cmdQ's interrupt + * bit0: cmdQ intr, bit1: cmdQ end, bit2: cmdQ wait + * + * @param base: base-address of cmdQ + * @param intr_mask: the mask of the interrupt to clear. + */ +void cmdQ_intr_clr(uintptr_t base, u8 intr_mask) +{ + _reg_write(base + REG_CMDQ_INT_EVENT, intr_mask); +} + +/** + * cmdQ_intr_status - cmdQ's interrupt status + * bit0: cmdQ intr, bit1: cmdQ end, bit2: cmdQ wait + * + * @param base: base-address of cmdQ + */ +u8 cmdQ_intr_status(uintptr_t base) +{ + return _reg_read(base + REG_CMDQ_INT_EVENT); +} + +/** + * cmdQ_engine - start cmdQ + * + * @param base: base-address of cmdQ + * @param tbl_addr: adma/cmd_set table's address (32-byte alignment) + * @param apb_base: relative IP's apb_base_address, whose MSB 10bits needed only + * @param is_hw_restart: wait_flag is waiting for hw(1) or sw(0). + * @param is_adma: 1 if adma table is used. + * @param cnt: the number of entry in cmdset. only useful if adma + */ +void cmdQ_engine(uintptr_t base, uintptr_t tbl_addr, u16 apb_base, + bool is_hw_restart, bool is_adma, u16 cnt) +{ + u8 job_ctl = (is_hw_restart) ? 0x05 : 0x01; + u8 dma_cfg = (is_adma) ? 0x02 : 0x00; + + // adma tbl addr + _reg_write(base + REG_CMDQ_DMA_ADDR_L, tbl_addr); +#if defined(__aarch64__) + _reg_write(base + REG_CMDQ_DMA_ADDR_H, tbl_addr >> 32); +#endif + if (!is_adma) + _reg_write(base + REG_CMDQ_DMA_CNT, cnt<<3); + + _reg_write(base + REG_CMDQ_DMA_CONFIG, dma_cfg); + _reg_write(base + REG_CMDQ_APB_PARA, apb_base); + + // job start + _reg_write(base + REG_CMDQ_JOB_CTL, job_ctl); + +#ifdef ENV_EMU + u32 *cmdq_set = tbl_addr; + + for (u16 i = 0 ; i < cnt; ++i) + printf("%3d: 0x%08x-%08x\n", i, cmdq_set[(i<<1) + 1], + cmdq_set[(i<<1)]); +#endif +} + +/** + * cmdQ_sw_restart - toggle sw_restart if cmdQ wait-flag is sw-toggle. + * + * @param base: base-address of cmdQ + */ +void cmdQ_sw_restart(uintptr_t base) +{ + _reg_write(base + REG_CMDQ_JOB_CTL, 0x02); +} + +bool cmdQ_is_sw_restart(uintptr_t base) +{ + return (_reg_read(base + REG_CMDQ_JOB_CTL) & 0x04) ? false : true; +} diff --git a/osdrv/interdrv/v2/vi/chip/mars/cmdq.h b/osdrv/interdrv/v2/vi/chip/mars/cmdq.h new file mode 100644 index 0000000000..3215a70b75 --- /dev/null +++ b/osdrv/interdrv/v2/vi/chip/mars/cmdq.h @@ -0,0 +1,137 @@ +#ifndef _CVI_CMDQ_H_ +#define _CVI_CMDQ_H_ + +enum { + CMDQ_MODE_SDMA, + CMDQ_MODE_ADMA, +}; + +struct cmdq_adma { + u64 addr; + u32 size; + u32 flags_end : 1; + u32 rsv : 2; + u32 flags_link : 1; + u32 rsv2 : 28; +}; + +enum { + CMDQ_SET_REG, + CMDQ_SET_WAIT_TIMER, + CMDQ_SET_WAIT_FLAG, +}; + +struct cmdq_set_reg { + u32 data; // [31:0] Write data + u32 addr : 20; // [51:32] Address for REG Write, Address[19:2] + u32 byte_mask : 4; // [55:52] Byte Write for REG Write + u32 intr_end : 1; // [56] End + u32 intr_int : 1; // [57] INT + u32 intr_last : 1; // [58] Last + u32 intr_rsv : 1; // [59] + u32 action : 4; // [63:60] 0: REG Write +}; + +struct cmdq_set_wait_timer { + u32 counter; + u32 rsv : 24; + u32 intr_end : 1; + u32 intr_int : 1; + u32 intr_last : 1; + u32 intr_rsv : 1; + u32 action : 4; // 1 for this case +}; + +struct cmdq_set_wait_flags { + u32 flag_num; // 0 ~ 15, depending on each module + u32 rsv : 24; + u32 intr_end : 1; + u32 intr_int : 1; + u32 intr_last : 1; + u32 intr_rsv : 1; + u32 action : 4; // 2 for this case +}; + +union cmdq_set { + struct cmdq_set_reg reg; + struct cmdq_set_wait_timer wait_timer; + struct cmdq_set_wait_flags wait_flags; +}; + +/** + * cmdQ_set_package - package reg_write to cmd_set. + * + */ +void cmdQ_set_package(struct cmdq_set_reg *set, u32 addr, u32 data); + +/** + * cmdQ_set_package - package reg_write to cmd_set. + * + * @param set: the set to modify + * @param is_timer: 1: wait_timer, 0: wait_flag + * @param data: the data of wait condition. + * counter if timer and flag_num if flag + * @param intr: the interrupt condition + */ +void cmdQ_set_wait(union cmdq_set *set, bool is_timer, u32 data, u8 intr); + +/** + * cmdQ_adma_package - package adma entries. + * + * @param item: adma entry to modify + * @param addr: address of link/cmd_set + * @param size: size(bytes) if only this is cmd_set + * @param is_link: 1: link descriptor, 2: cmd_set + * @param is_end: true if this is last entry in adma-table. + */ +void cmdQ_adma_package(struct cmdq_adma *item, u64 addr, u32 size, bool is_link, + bool is_end); + +/** + * cmdQ_intr_ctrl - cmdQ's interrupt on(1)/off(0) + * bit0: cmdQ intr, bit1: cmdQ end, bit2: cmdQ wait + * + * @param intr_mask: On/Off ctrl of the interrupt. + */ +void cmdQ_intr_ctrl(uintptr_t base, u8 intr_mask); + +/** + * cmdQ_intr_ctrl - clear cmdQ's interrupt + * bit0: cmdQ intr, bit1: cmdQ end, bit2: cmdQ wait + * + * @param base: base-address of cmdQ + * @param intr_mask: the mask of the interrupt to clear. + */ +void cmdQ_intr_clr(uintptr_t base, u8 intr_mask); + +/** + * cmdQ_intr_status - cmdQ's interrupt status + * bit0: cmdQ intr, bit1: cmdQ end, bit2: cmdQ wait + * + * @param base: base-address of cmdQ + */ +u8 cmdQ_intr_status(uintptr_t base); + +/** + * cmdQ_engine - start cmdQ + * + * @param base: base-address of cmdQ + * @param adma_addr: adma table's address + * @param apb_base: relative IP's apb_base_address, whose MSB 10bits needed only + * @param is_hw_restart: wait_flag is waiting for hw(1) or sw(0). + * @param is_adma: 1 if adma table is used. + * @param cnt: the number of entry in cmdset. only useful if adma + */ +void cmdQ_engine(uintptr_t base, uintptr_t tbl_addr, u16 apb_base, + bool is_hw_restart, bool is_adma, u16 cnt); + +/** + * cmdQ_sw_restart - toggle sw_restart if cmdQ wait-flag is sw-toggle. + * + * @param base: base-address of cmdQ + */ +void cmdQ_sw_restart(uintptr_t base); + +bool cmdQ_is_sw_restart(uintptr_t base); + +#endif //_CVI_CMDQ_H_