From 12c1088777b3d700d465f5dca961934837ae9013 Mon Sep 17 00:00:00 2001 From: Juvenn Woo Date: Thu, 16 May 2013 18:25:10 +0800 Subject: [PATCH 01/19] aes3k: extract common routines aes3k from aes4000 AES3500 and AES4000 are pretty similar devices, have same command send, the only difference is in image size and init sequence. Extract common routines from AES4K to be used later in AES3500 driver https://bugs.freedesktop.org/show_bug.cgi?id=64351 --- configure.ac | 8 ++ libfprint/Makefile.am | 6 ++ libfprint/drivers/aes3k.c | 155 ++++++++++++++++++++++++++++++++++++ libfprint/drivers/aes3k.h | 58 ++++++++++++++ libfprint/drivers/aes4000.c | 155 ++++++++---------------------------- 5 files changed, 261 insertions(+), 121 deletions(-) create mode 100644 libfprint/drivers/aes3k.c create mode 100644 libfprint/drivers/aes3k.h diff --git a/configure.ac b/configure.ac index d4536f69..3722a676 100644 --- a/configure.ac +++ b/configure.ac @@ -28,6 +28,7 @@ all_drivers="upeke2 upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes16 require_imaging='no' require_aeslib='no' require_aesX660='no' +require_aes3k='no' enable_upeke2='no' enable_upekts='no' enable_upektc='no' @@ -115,6 +116,7 @@ for driver in `echo ${drivers} | sed -e 's/,/ /g' -e 's/,$//g'`; do AC_DEFINE([ENABLE_AES4000], [], [Build AuthenTec AES4000 driver]) require_aeslib="yes" require_imaging="yes" + require_aes3k="yes" enable_aes4000="yes" ;; vfs101) @@ -143,6 +145,7 @@ AM_CONDITIONAL([ENABLE_AES2660], [test "$enable_aes2660" = "yes"]) AM_CONDITIONAL([ENABLE_AES4000], [test "$enable_aes4000" = "yes"]) AM_CONDITIONAL([REQUIRE_AESLIB], [test "$require_aeslib" = "yes"]) AM_CONDITIONAL([REQUIRE_AESX660], [test "$require_aesX660" = "yes"]) +AM_CONDITIONAL([REQUIRE_AES3K], [test "$require_aes3k" = "yes"]) AM_CONDITIONAL([ENABLE_VFS101], [test "$enable_vfs101" = "yes"]) AM_CONDITIONAL([ENABLE_VFS301], [test "$enable_vfs301" = "yes"]) @@ -366,6 +369,11 @@ if test x$require_aesX660 != xno ; then else AC_MSG_NOTICE([ aesX660 common routines disabled]) fi +if test x$require_aes3k != xno ; then + AC_MSG_NOTICE([** aes3k common routines enabled]) +else + AC_MSG_NOTICE([ aes3k common routines disabled]) +fi AC_CONFIG_FILES([libfprint.pc] [Makefile] [libfprint/Makefile] [examples/Makefile] [doc/Makefile]) AC_OUTPUT diff --git a/libfprint/Makefile.am b/libfprint/Makefile.am index 4dee3011..da62cf4c 100644 --- a/libfprint/Makefile.am +++ b/libfprint/Makefile.am @@ -36,6 +36,8 @@ EXTRA_DIST = \ $(VFS301_SRC) \ drivers/aesx660.c \ drivers/aesx660.h \ + drivers/aes3k.c \ + drivers/aes3k.h \ drivers/driver_ids.h \ aeslib.c aeslib.h \ imagemagick.c \ @@ -177,6 +179,10 @@ if REQUIRE_AESX660 OTHER_SRC += drivers/aesx660.c drivers/aesx660.h endif +if REQUIRE_AES3K +OTHER_SRC += drivers/aes3k.c drivers/aes3k.h +endif + libfprint_la_SOURCES = \ fp_internal.h \ async.c \ diff --git a/libfprint/drivers/aes3k.c b/libfprint/drivers/aes3k.c new file mode 100644 index 00000000..fefba3cb --- /dev/null +++ b/libfprint/drivers/aes3k.c @@ -0,0 +1,155 @@ +/* + * AuthenTec AES3500/AES4000 common routines + * + * The AES3500 and AES4000 sensors are press-typed, and could capture + * fingerprint images in 128x128 and 96x96 pixels respectively. They + * share a same communication interface: a number of frames are + * transferred and captured, from which a final image could be + * assembled. Each frame has fixed height of 16 pixels. + * + * As the imaging area is a bit small, only a part of finger could be + * captured, the detected minutiae are not so many that the NBIS + * matching works not so good. The verification rate is very low at the + * moment. + * + * This work is derived from Daniel Drake's AES4000 driver. + * + * Copyright (C) 2013 Juvenn Woo + * Copyright (C) 2007-2008 Daniel Drake + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#define FP_COMPONENT "aes3k" + +#include + +#include +#include + +#include +#include + +#include "aes3k.h" + +#define CTRL_TIMEOUT 1000 +#define EP_IN (1 | LIBUSB_ENDPOINT_IN) +#define EP_OUT (2 | LIBUSB_ENDPOINT_OUT) + +static void do_capture(struct fp_img_dev *dev); + +static void img_cb(struct libusb_transfer *transfer) +{ + struct fp_img_dev *dev = transfer->user_data; + struct aes3k_dev *aesdev = dev->priv; + unsigned char *ptr = transfer->buffer; + struct fp_img *tmp; + struct fp_img *img; + int i; + + if (transfer->status == LIBUSB_TRANSFER_CANCELLED) { + goto err; + } else if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fpi_imgdev_session_error(dev, -EIO); + goto err; + } else if (transfer->length != transfer->actual_length) { + fpi_imgdev_session_error(dev, -EPROTO); + goto err; + } + + fpi_imgdev_report_finger_status(dev, TRUE); + + tmp = fpi_img_new(aesdev->frame_width * aesdev->frame_width); + tmp->width = aesdev->frame_width; + tmp->height = aesdev->frame_width; + tmp->flags = FP_IMG_COLORS_INVERTED | FP_IMG_V_FLIPPED | FP_IMG_H_FLIPPED; + for (i = 0; i < aesdev->frame_number; i++) { + fp_dbg("frame header byte %02x", *ptr); + ptr++; + aes_assemble_image(ptr, aesdev->frame_width, AES3K_FRAME_HEIGHT, tmp->data + (i * aesdev->frame_width * AES3K_FRAME_HEIGHT)); + ptr += aesdev->frame_size; + } + + /* FIXME: this is an ugly hack to make the image big enough for NBIS + * to process reliably */ + img = fpi_im_resize(tmp, aesdev->enlarge_factor, aesdev->enlarge_factor); + fp_img_free(tmp); + fpi_imgdev_image_captured(dev, img); + + /* FIXME: rather than assuming finger has gone, we should poll regs until + * it really has, then restart the capture */ + fpi_imgdev_report_finger_status(dev, FALSE); + + do_capture(dev); + +err: + g_free(transfer->buffer); + aesdev->img_trf = NULL; + libusb_free_transfer(transfer); +} + +static void do_capture(struct fp_img_dev *dev) +{ + struct aes3k_dev *aesdev = dev->priv; + unsigned char *data; + int r; + + aesdev->img_trf = libusb_alloc_transfer(0); + if (!aesdev->img_trf) { + fpi_imgdev_session_error(dev, -EIO); + return; + } + + data = g_malloc(aesdev->data_buflen); + libusb_fill_bulk_transfer(aesdev->img_trf, dev->udev, EP_IN, data, + aesdev->data_buflen, img_cb, dev, 0); + + r = libusb_submit_transfer(aesdev->img_trf); + if (r < 0) { + g_free(data); + libusb_free_transfer(aesdev->img_trf); + aesdev->img_trf = NULL; + fpi_imgdev_session_error(dev, r); + } +} + +static void init_reqs_cb(struct fp_img_dev *dev, int result, void *user_data) +{ + fpi_imgdev_activate_complete(dev, result); + if (result == 0) + do_capture(dev); +} + +int aes3k_dev_activate(struct fp_img_dev *dev, enum fp_imgdev_state state) +{ + struct aes3k_dev *aesdev = dev->priv; + aes_write_regv(dev, aesdev->init_reqs, aesdev->init_reqs_len, init_reqs_cb, NULL); + return 0; +} + +void aes3k_dev_deactivate(struct fp_img_dev *dev) +{ + struct aes3k_dev *aesdev = dev->priv; + + /* FIXME: should wait for cancellation to complete before returning + * from deactivation, otherwise app may legally exit before we've + * cleaned up */ + if (aesdev->img_trf) + libusb_cancel_transfer(aesdev->img_trf); + fpi_imgdev_deactivate_complete(dev); +} + diff --git a/libfprint/drivers/aes3k.h b/libfprint/drivers/aes3k.h new file mode 100644 index 00000000..98750ede --- /dev/null +++ b/libfprint/drivers/aes3k.h @@ -0,0 +1,58 @@ +/* + * AuthenTec AES3500/AES4000 common routines + * + * The AES3500 and AES4000 sensors are press-typed, and could capture + * fingerprint images in 128x128 and 96x96 pixels respectively. They + * share a same communication interface: a number of frames are + * transferred and captured, from which a final image could be + * assembled. Each frame has fixed height of 16 pixels. + * + * As the imaging area is a bit small, only a part of finger could be + * captured, the detected minutiae are not so many that the NBIS + * matching works not so good. The verification rate is very low at the + * moment. + * + * This work is derived from Daniel Drake's AES4000 driver. + * + * Copyright (C) 2013 Juvenn Woo + * Copyright (C) 2007-2008 Daniel Drake + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef __AES3K_H +#define __AES3K_H + +#define AES3K_FRAME_HEIGHT 16 + +struct aes3k_dev { + struct libusb_transfer *img_trf; + size_t frame_width; /* image size = frame_width x frame_width */ + size_t frame_size; /* 4 bits/pixel: frame_width x AES3K_FRAME_HEIGHT / 2 */ + size_t frame_number; /* number of frames */ + size_t enlarge_factor; + + size_t data_buflen; /* buffer length of usb bulk transfer */ + struct aes_regwrite *init_reqs; /* initial values sent to device */ + size_t init_reqs_len; +}; + + +int aes3k_dev_activate(struct fp_img_dev *dev, enum fp_imgdev_state state); +void aes3k_dev_deactivate(struct fp_img_dev *dev); + +#endif diff --git a/libfprint/drivers/aes4000.c b/libfprint/drivers/aes4000.c index 6ff32a27..b8496514 100644 --- a/libfprint/drivers/aes4000.c +++ b/libfprint/drivers/aes4000.c @@ -1,5 +1,12 @@ /* * AuthenTec AES4000 driver for libfprint + * + * AES4000 is a press-typed sensor, which captures image in 96x96 + * pixels. + * + * This work is derived from Daniel Drake's AES4000 driver. + * + * Copyright (C) 2013 Juvenn Woo * Copyright (C) 2007-2008 Daniel Drake * * This library is free software; you can redistribute it and/or @@ -27,24 +34,19 @@ #include #include +#include "aes3k.h" #include "driver_ids.h" -#define CTRL_TIMEOUT 1000 -#define EP_IN (1 | LIBUSB_ENDPOINT_IN) -#define EP_OUT (2 | LIBUSB_ENDPOINT_OUT) -#define DATA_BUFLEN 0x1259 -#define NR_SUBARRAYS 6 -#define SUBARRAY_LEN 768 +#define DATA_BUFLEN 0x1259 -#define IMG_HEIGHT 96 -#define IMG_WIDTH 96 -#define ENLARGE_FACTOR 3 +/* image size = FRAME_WIDTH x FRAME_WIDTH */ +#define FRAME_WIDTH 96 +#define FRAME_SIZE (FRAME_WIDTH * AES3K_FRAME_HEIGHT / 2) +#define FRAME_NUMBER (FRAME_WIDTH / AES3K_FRAME_HEIGHT) +#define ENLARGE_FACTOR 3 -struct aes4k_dev { - struct libusb_transfer *img_trf; -}; -static const struct aes_regwrite init_reqs[] = { +static struct aes_regwrite init_reqs[] = { /* master reset */ { 0x80, 0x01 }, { 0, 0 }, @@ -119,119 +121,28 @@ static const struct aes_regwrite init_reqs[] = { { 0x81, 0x00 }, }; -static void do_capture(struct fp_img_dev *dev); - -static void img_cb(struct libusb_transfer *transfer) -{ - struct fp_img_dev *dev = transfer->user_data; - struct aes4k_dev *aesdev = dev->priv; - unsigned char *ptr = transfer->buffer; - struct fp_img *tmp; - struct fp_img *img; - int i; - - if (transfer->status == LIBUSB_TRANSFER_CANCELLED) { - goto err; - } else if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { - fpi_imgdev_session_error(dev, -EIO); - goto err; - } else if (transfer->length != transfer->actual_length) { - fpi_imgdev_session_error(dev, -EPROTO); - goto err; - } - - fpi_imgdev_report_finger_status(dev, TRUE); - - tmp = fpi_img_new(IMG_WIDTH * IMG_HEIGHT); - tmp->width = IMG_WIDTH; - tmp->height = IMG_HEIGHT; - tmp->flags = FP_IMG_COLORS_INVERTED | FP_IMG_V_FLIPPED | FP_IMG_H_FLIPPED; - for (i = 0; i < NR_SUBARRAYS; i++) { - fp_dbg("subarray header byte %02x", *ptr); - ptr++; - aes_assemble_image(ptr, 96, 16, tmp->data + (i * 96 * 16)); - ptr += SUBARRAY_LEN; - } - - /* FIXME: this is an ugly hack to make the image big enough for NBIS - * to process reliably */ - img = fpi_im_resize(tmp, ENLARGE_FACTOR, ENLARGE_FACTOR); - fp_img_free(tmp); - fpi_imgdev_image_captured(dev, img); - - /* FIXME: rather than assuming finger has gone, we should poll regs until - * it really has, then restart the capture */ - fpi_imgdev_report_finger_status(dev, FALSE); - - do_capture(dev); - -err: - g_free(transfer->buffer); - aesdev->img_trf = NULL; - libusb_free_transfer(transfer); -} - -static void do_capture(struct fp_img_dev *dev) -{ - struct aes4k_dev *aesdev = dev->priv; - unsigned char *data; - int r; - - aesdev->img_trf = libusb_alloc_transfer(0); - if (!aesdev->img_trf) { - fpi_imgdev_session_error(dev, -EIO); - return; - } - - data = g_malloc(DATA_BUFLEN); - libusb_fill_bulk_transfer(aesdev->img_trf, dev->udev, EP_IN, data, - DATA_BUFLEN, img_cb, dev, 0); - - r = libusb_submit_transfer(aesdev->img_trf); - if (r < 0) { - g_free(data); - libusb_free_transfer(aesdev->img_trf); - aesdev->img_trf = NULL; - fpi_imgdev_session_error(dev, r); - } -} - -static void init_reqs_cb(struct fp_img_dev *dev, int result, void *user_data) -{ - fpi_imgdev_activate_complete(dev, result); - if (result == 0) - do_capture(dev); -} - -static int dev_activate(struct fp_img_dev *dev, enum fp_imgdev_state state) -{ - aes_write_regv(dev, init_reqs, G_N_ELEMENTS(init_reqs), init_reqs_cb, NULL); - return 0; -} - -static void dev_deactivate(struct fp_img_dev *dev) -{ - struct aes4k_dev *aesdev = dev->priv; - - /* FIXME: should wait for cancellation to complete before returning - * from deactivation, otherwise app may legally exit before we've - * cleaned up */ - if (aesdev->img_trf) - libusb_cancel_transfer(aesdev->img_trf); - fpi_imgdev_deactivate_complete(dev); -} - static int dev_init(struct fp_img_dev *dev, unsigned long driver_data) { int r; + struct aes3k_dev *aesdev; r = libusb_claim_interface(dev->udev, 0); if (r < 0) fp_err("could not claim interface 0"); - dev->priv = g_malloc0(sizeof(struct aes4k_dev)); + aesdev = dev->priv = g_malloc0(sizeof(struct aes3k_dev)); + + if (!aesdev) + return -ENOMEM; if (r == 0) + aesdev->data_buflen = DATA_BUFLEN; + aesdev->frame_width = FRAME_WIDTH; + aesdev->frame_size = FRAME_SIZE; + aesdev->frame_number = FRAME_NUMBER; + aesdev->enlarge_factor = ENLARGE_FACTOR; + aesdev->init_reqs = init_reqs; + aesdev->init_reqs_len = G_N_ELEMENTS(init_reqs); fpi_imgdev_open_complete(dev, 0); return r; @@ -239,11 +150,13 @@ static int dev_init(struct fp_img_dev *dev, unsigned long driver_data) static void dev_deinit(struct fp_img_dev *dev) { - g_free(dev->priv); + struct aes3k_dev *aesdev = dev->priv; + g_free(aesdev); libusb_release_interface(dev->udev, 0); fpi_imgdev_close_complete(dev); } + static const struct usb_id id_table[] = { { .vendor = 0x08ff, .product = 0x5501 }, { 0, 0, 0, }, @@ -258,15 +171,15 @@ struct fp_img_driver aes4000_driver = { .scan_type = FP_SCAN_TYPE_PRESS, }, .flags = 0, - .img_height = IMG_HEIGHT * ENLARGE_FACTOR, - .img_width = IMG_WIDTH * ENLARGE_FACTOR, + .img_height = FRAME_WIDTH * ENLARGE_FACTOR, + .img_width = FRAME_WIDTH * ENLARGE_FACTOR, /* temporarily lowered until image quality improves */ .bz3_threshold = 9, .open = dev_init, .close = dev_deinit, - .activate = dev_activate, - .deactivate = dev_deactivate, + .activate = aes3k_dev_activate, + .deactivate = aes3k_dev_deactivate, }; From aeca32fc12a4fd98ae39334b301f94d371a34dcf Mon Sep 17 00:00:00 2001 From: Juvenn Woo Date: Tue, 21 May 2013 13:40:36 +0800 Subject: [PATCH 02/19] aes3k: add aes3500 driver This driver supports AES3500 device (08ff:5731) and utilizes common routines from AES4000. --- configure.ac | 16 ++- libfprint/Makefile.am | 6 ++ libfprint/core.c | 3 + libfprint/drivers/aes3500.c | 188 +++++++++++++++++++++++++++++++++ libfprint/drivers/driver_ids.h | 1 + libfprint/fp_internal.h | 3 + 6 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 libfprint/drivers/aes3500.c diff --git a/configure.ac b/configure.ac index 3722a676..b65a0bc3 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ AC_SUBST(lt_major) AC_SUBST(lt_revision) AC_SUBST(lt_age) -all_drivers="upeke2 upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes4000 vfs101 vfs301" +all_drivers="upeke2 upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes3500 aes4000 vfs101 vfs301" require_imaging='no' require_aeslib='no' @@ -41,6 +41,7 @@ enable_aes1660='no' enable_aes2501='no' enable_aes2550='no' enable_aes2660='no' +enable_aes3500='no' enable_aes4000='no' enable_vfs101='no' enable_vfs301='no' @@ -112,6 +113,13 @@ for driver in `echo ${drivers} | sed -e 's/,/ /g' -e 's/,$//g'`; do require_aesX660="yes" enable_aes2660="yes" ;; + aes3500) + AC_DEFINE([ENABLE_AES3500], [], [Build AuthenTec AES3500 driver]) + require_aeslib="yes" + require_imaging="yes" + require_aes3k="yes" + enable_aes3500="yes" + ;; aes4000) AC_DEFINE([ENABLE_AES4000], [], [Build AuthenTec AES4000 driver]) require_aeslib="yes" @@ -142,6 +150,7 @@ AM_CONDITIONAL([ENABLE_AES1660], [test "$enable_aes1660" = "yes"]) AM_CONDITIONAL([ENABLE_AES2501], [test "$enable_aes2501" = "yes"]) AM_CONDITIONAL([ENABLE_AES2550], [test "$enable_aes2550" = "yes"]) AM_CONDITIONAL([ENABLE_AES2660], [test "$enable_aes2660" = "yes"]) +AM_CONDITIONAL([ENABLE_AES3500], [test "$enable_aes3500" = "yes"]) AM_CONDITIONAL([ENABLE_AES4000], [test "$enable_aes4000" = "yes"]) AM_CONDITIONAL([REQUIRE_AESLIB], [test "$require_aeslib" = "yes"]) AM_CONDITIONAL([REQUIRE_AESX660], [test "$require_aesX660" = "yes"]) @@ -344,6 +353,11 @@ if test x$enable_aes2660 != xno ; then else AC_MSG_NOTICE([ aes2660 driver disabled]) fi +if test x$enable_aes3500 != xno ; then + AC_MSG_NOTICE([** aes3500 driver enabled]) +else + AC_MSG_NOTICE([ aes3500 driver disabled]) +fi if test x$enable_aes4000 != xno ; then AC_MSG_NOTICE([** aes4000 driver enabled]) else diff --git a/libfprint/Makefile.am b/libfprint/Makefile.am index da62cf4c..5f46bc25 100644 --- a/libfprint/Makefile.am +++ b/libfprint/Makefile.am @@ -12,6 +12,7 @@ AES1660_SRC = drivers/aes1660.c drivers/aes1660.h AES2501_SRC = drivers/aes2501.c drivers/aes2501.h AES2550_SRC = drivers/aes2550.c drivers/aes2550.h AES2660_SRC = drivers/aes2660.c drivers/aes2660.h +AES3500_SRC = drivers/aes3500.c AES4000_SRC = drivers/aes4000.c FDU2000_SRC = drivers/fdu2000.c VCOM5S_SRC = drivers/vcom5s.c @@ -29,6 +30,7 @@ EXTRA_DIST = \ $(AES2501_SRC) \ $(AES2550_SRC) \ $(AES2660_SRC) \ + $(AES3500_SRC) \ $(AES4000_SRC) \ $(FDU2000_SRC) \ $(VCOM5S_SRC) \ @@ -147,6 +149,10 @@ if ENABLE_AES2660 DRIVER_SRC += $(AES2660_SRC) endif +if ENABLE_AES3500 +DRIVER_SRC += $(AES3500_SRC) +endif + if ENABLE_AES4000 DRIVER_SRC += $(AES4000_SRC) endif diff --git a/libfprint/core.c b/libfprint/core.c index 5315fdc7..584e7629 100644 --- a/libfprint/core.c +++ b/libfprint/core.c @@ -349,6 +349,9 @@ static struct fp_driver * const primitive_drivers[] = { }; static struct fp_img_driver * const img_drivers[] = { +#ifdef ENABLE_AES3500 + &aes3500_driver, +#endif #ifdef ENABLE_AES4000 &aes4000_driver, #endif diff --git a/libfprint/drivers/aes3500.c b/libfprint/drivers/aes3500.c new file mode 100644 index 00000000..6f4d6b07 --- /dev/null +++ b/libfprint/drivers/aes3500.c @@ -0,0 +1,188 @@ +/* + * AuthenTec AES3500 driver for libfprint + * + * AES3500 is a press-typed sensor, which captures image in 128x128 + * pixels. + * + * Thanks Rafael Toledo for the Windows driver and the help. + * + * This work is derived from Daniel Drake's AES4000 driver. + * + * Copyright (C) 2011-2013 Juvenn Woo + * Copyright (C) 2007-2008 Daniel Drake + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#define FP_COMPONENT "aes3500" + +#include + +#include +#include + +#include +#include + +#include "aes3k.h" +#include "driver_ids.h" + +#define DATA_BUFLEN 0x2089 + +/* image size = FRAME_WIDTH x FRAME_WIDTH */ +#define FRAME_WIDTH 128 +#define FRAME_SIZE (FRAME_WIDTH * AES3K_FRAME_HEIGHT / 2) +#define FRAME_NUMBER (FRAME_WIDTH / AES3K_FRAME_HEIGHT) +#define ENLARGE_FACTOR 2 + + +static struct aes_regwrite init_reqs[] = { + /* master reset */ + { 0x80, 0x01 }, + { 0, 0 }, + { 0x80, 0x00 }, + { 0, 0 }, + + { 0x81, 0x00 }, + { 0x80, 0x00 }, + { 0, 0 }, + + /* scan reset */ + { 0x80, 0x02 }, + { 0, 0 }, + { 0x80, 0x00 }, + { 0, 0 }, + + /* disable register buffering */ + { 0x80, 0x04 }, + { 0, 0 }, + { 0x80, 0x00 }, + { 0, 0 }, + + { 0x81, 0x00 }, + { 0, 0 }, + /* windows driver reads registers now (81 02) */ + { 0x80, 0x00 }, + { 0x81, 0x00 }, + + /* set excitation bias current: 2mhz drive ring frequency, + * 4V drive ring voltage, 16.5mA excitation bias */ + { 0x82, 0x04 }, + + /* continuously sample drive ring for finger detection, + * 62.50ms debounce delay */ + { 0x83, 0x13 }, + + { 0x84, 0x07 }, /* set calibration resistance to 12 kiloohms */ + { 0x85, 0x3d }, /* set calibration capacitance */ + { 0x86, 0x03 }, /* detect drive voltage */ + { 0x87, 0x01 }, /* set detection frequency to 125khz */ + { 0x88, 0x02 }, /* set column scan period */ + { 0x89, 0x02 }, /* set measure drive */ + { 0x8a, 0x33 }, /* set measure frequency and sense amplifier bias */ + { 0x8b, 0x33 }, /* set matrix pattern */ + { 0x8c, 0x0f }, /* set demodulation phase 1 */ + { 0x8d, 0x04 }, /* set demodulation phase 2 */ + { 0x8e, 0x23 }, /* set sensor gain */ + { 0x8f, 0x07 }, /* set image parameters */ + { 0x90, 0x00 }, /* carrier offset null */ + { 0x91, 0x1c }, /* set A/D reference high */ + { 0x92, 0x08 }, /* set A/D reference low */ + { 0x93, 0x00 }, /* set start row to 0 */ + { 0x94, 0x07 }, /* set end row */ + { 0x95, 0x00 }, /* set start column to 0 */ + { 0x96, 0x1f }, /* set end column */ + { 0x97, 0x04 }, /* data format and thresholds */ + { 0x98, 0x28 }, /* image data control */ + { 0x99, 0x00 }, /* disable general purpose outputs */ + { 0x9a, 0x0b }, /* set initial scan state */ + { 0x9b, 0x00 }, /* clear challenge word bits */ + { 0x9c, 0x00 }, /* clear challenge word bits */ + { 0x9d, 0x09 }, /* set some challenge word bits */ + { 0x9e, 0x53 }, /* clear challenge word bits */ + { 0x9f, 0x6b }, /* set some challenge word bits */ + { 0, 0 }, + + { 0x80, 0x00 }, + { 0x81, 0x00 }, + { 0, 0 }, + { 0x81, 0x04 }, + { 0, 0 }, + { 0x81, 0x00 }, +}; + +static int dev_init(struct fp_img_dev *dev, unsigned long driver_data) +{ + int r; + struct aes3k_dev *aesdev; + + r = libusb_claim_interface(dev->udev, 0); + if (r < 0) + fp_err("could not claim interface 0"); + + aesdev = dev->priv = g_malloc0(sizeof(struct aes3k_dev)); + + if (!aesdev) + return -ENOMEM; + + if (r == 0) + aesdev->data_buflen = DATA_BUFLEN; + aesdev->frame_width = FRAME_WIDTH; + aesdev->frame_size = FRAME_SIZE; + aesdev->frame_number = FRAME_NUMBER; + aesdev->enlarge_factor = ENLARGE_FACTOR; + aesdev->init_reqs = init_reqs; + aesdev->init_reqs_len = G_N_ELEMENTS(init_reqs); + fpi_imgdev_open_complete(dev, 0); + + return r; +} + +static void dev_deinit(struct fp_img_dev *dev) +{ + struct aes3k_dev *aesdev = dev->priv; + g_free(aesdev); + libusb_release_interface(dev->udev, 0); + fpi_imgdev_close_complete(dev); +} + + +static const struct usb_id id_table[] = { + { .vendor = 0x08ff, .product = 0x5731 }, + { 0, 0, 0, }, +}; + +struct fp_img_driver aes3500_driver = { + .driver = { + .id = AES3500_ID, + .name = FP_COMPONENT, + .full_name = "AuthenTec AES3500", + .id_table = id_table, + .scan_type = FP_SCAN_TYPE_PRESS, + }, + .flags = 0, + .img_height = FRAME_WIDTH * ENLARGE_FACTOR, + .img_width = FRAME_WIDTH * ENLARGE_FACTOR, + + /* temporarily lowered until image quality improves */ + .bz3_threshold = 9, + + .open = dev_init, + .close = dev_deinit, + .activate = aes3k_dev_activate, + .deactivate = aes3k_dev_deactivate, +}; + diff --git a/libfprint/drivers/driver_ids.h b/libfprint/drivers/driver_ids.h index 0f45beb6..25ef2297 100644 --- a/libfprint/drivers/driver_ids.h +++ b/libfprint/drivers/driver_ids.h @@ -36,6 +36,7 @@ enum { UPEKE2_ID = 13, AES1660_ID = 14, AES2660_ID = 15, + AES3500_ID = 16, }; #endif diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h index 04d304f4..a8a26a90 100644 --- a/libfprint/fp_internal.h +++ b/libfprint/fp_internal.h @@ -267,6 +267,9 @@ extern struct fp_img_driver aes2550_driver; #ifdef ENABLE_AES2660 extern struct fp_img_driver aes2660_driver; #endif +#ifdef ENABLE_AES3500 +extern struct fp_img_driver aes3500_driver; +#endif #ifdef ENABLE_AES4000 extern struct fp_img_driver aes4000_driver; #endif From 2bba4fb0733e97a4f3aca44b170159c5b92cf5b5 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Fri, 8 Feb 2013 14:38:13 +0300 Subject: [PATCH 03/19] Implement image capture (both synchronous and asynchronous variants) fp_dev_img_capture() is not implemented and returns -ENOTSUPP for all devices since migration to asynchronous model. This commit implement missing functionality --- libfprint/async.c | 98 +++++++++++++++++++++++++++++++++++++++++ libfprint/core.c | 34 +------------- libfprint/fp_internal.h | 20 +++++++-- libfprint/fprint.h | 18 ++++++++ libfprint/imgdev.c | 59 ++++++++++++++++++++----- libfprint/sync.c | 97 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 278 insertions(+), 48 deletions(-) diff --git a/libfprint/async.c b/libfprint/async.c index 67e3481e..128b7e90 100644 --- a/libfprint/async.c +++ b/libfprint/async.c @@ -412,3 +412,101 @@ void fpi_drvcb_identify_stopped(struct fp_dev *dev) dev->identify_stop_cb(dev, dev->identify_stop_cb_data); } +API_EXPORTED int fp_async_capture_start(struct fp_dev *dev, int unconditional, + fp_capture_cb callback, void *user_data) +{ + struct fp_driver *drv = dev->drv; + int r; + + fp_dbg(""); + if (!drv->capture_start) + return -ENOTSUP; + + dev->state = DEV_STATE_CAPTURE_STARTING; + dev->capture_cb = callback; + dev->capture_cb_data = user_data; + dev->unconditional_capture = unconditional; + + r = drv->capture_start(dev); + if (r < 0) { + dev->capture_cb = NULL; + dev->state = DEV_STATE_ERROR; + fp_err("failed to start verification, error %d", r); + } + return r; +} + +/* Drivers call this when capture has started */ +void fpi_drvcb_capture_started(struct fp_dev *dev, int status) +{ + fp_dbg(""); + BUG_ON(dev->state != DEV_STATE_CAPTURE_STARTING); + if (status) { + if (status > 0) { + status = -status; + fp_dbg("adjusted to %d", status); + } + dev->state = DEV_STATE_ERROR; + if (dev->capture_cb) + dev->capture_cb(dev, status, NULL, dev->capture_cb_data); + } else { + dev->state = DEV_STATE_CAPTURING; + } +} + +/* Drivers call this to report a capture result (which might mark completion) */ +void fpi_drvcb_report_capture_result(struct fp_dev *dev, int result, + struct fp_img *img) +{ + fp_dbg("result %d", result); + BUG_ON(dev->state != DEV_STATE_CAPTURING); + if (result < 0 || result == FP_CAPTURE_COMPLETE) + dev->state = DEV_STATE_CAPTURE_DONE; + + if (dev->capture_cb) + dev->capture_cb(dev, result, img, dev->capture_cb_data); + else + fp_dbg("ignoring capture result as no callback is subscribed"); +} + +/* Drivers call this when capture has stopped */ +void fpi_drvcb_capture_stopped(struct fp_dev *dev) +{ + fp_dbg(""); + BUG_ON(dev->state != DEV_STATE_CAPTURE_STOPPING); + dev->state = DEV_STATE_INITIALIZED; + if (dev->capture_stop_cb) + dev->capture_stop_cb(dev, dev->capture_stop_cb_data); +} + +API_EXPORTED int fp_async_capture_stop(struct fp_dev *dev, + fp_capture_stop_cb callback, void *user_data) +{ + struct fp_driver *drv = dev->drv; + int r; + + fp_dbg(""); + BUG_ON(dev->state != DEV_STATE_ERROR + && dev->state != DEV_STATE_CAPTURING + && dev->state != DEV_STATE_CAPTURE_DONE); + + dev->capture_cb = NULL; + dev->capture_stop_cb = callback; + dev->capture_stop_cb_data = user_data; + dev->state = DEV_STATE_CAPTURE_STOPPING; + + if (!drv->capture_start) + return -ENOTSUP; + if (!drv->capture_stop) { + dev->state = DEV_STATE_INITIALIZED; + fpi_drvcb_capture_stopped(dev); + return 0; + } + + r = drv->capture_stop(dev); + if (r < 0) { + fp_err("failed to stop verification"); + dev->capture_stop_cb = NULL; + } + return r; +} diff --git a/libfprint/core.c b/libfprint/core.c index 584e7629..f6faab28 100644 --- a/libfprint/core.c +++ b/libfprint/core.c @@ -804,7 +804,7 @@ static struct fp_img_dev *dev_to_img_dev(struct fp_dev *dev) */ API_EXPORTED int fp_dev_supports_imaging(struct fp_dev *dev) { - return dev->drv->type == DRIVER_IMAGING; + return dev->drv->capture_start != NULL; } /** \ingroup dev @@ -819,38 +819,6 @@ API_EXPORTED int fp_dev_supports_identification(struct fp_dev *dev) return dev->drv->identify_start != NULL; } -/** \ingroup dev - * Captures an \ref img "image" from a device. The returned image is the raw - * image provided by the device, you may wish to \ref img_std "standardize" it. - * - * If set, the unconditional flag indicates that the device should - * capture an image unconditionally, regardless of whether a finger is there - * or not. If unset, this function will block until a finger is detected on - * the sensor. - * - * \param dev the device - * \param unconditional whether to unconditionally capture an image, or to only capture when a finger is detected - * \param image a location to return the captured image. Must be freed with - * fp_img_free() after use. - * \return 0 on success, non-zero on error. -ENOTSUP indicates that either the - * unconditional flag was set but the device does not support this, or that the - * device does not support imaging. - * \sa fp_dev_supports_imaging() - */ -API_EXPORTED int fp_dev_img_capture(struct fp_dev *dev, int unconditional, - struct fp_img **image) -{ - struct fp_img_dev *imgdev = dev_to_img_dev(dev); - if (!imgdev) { - fp_dbg("image capture on non-imaging device"); - return -ENOTSUP; - } - - //return fpi_imgdev_capture(imgdev, unconditional, image); - /* FIXME reimplement async */ - return -ENOTSUP; -} - /** \ingroup dev * Gets the expected width of images that will be captured from the device. * This function will return -1 for devices that are not diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h index a8a26a90..c383c66a 100644 --- a/libfprint/fp_internal.h +++ b/libfprint/fp_internal.h @@ -91,6 +91,10 @@ enum fp_dev_state { DEV_STATE_IDENTIFYING, DEV_STATE_IDENTIFY_DONE, DEV_STATE_IDENTIFY_STOPPING, + DEV_STATE_CAPTURE_STARTING, + DEV_STATE_CAPTURING, + DEV_STATE_CAPTURE_DONE, + DEV_STATE_CAPTURE_STOPPING, }; struct fp_driver **fprint_get_drivers (void); @@ -108,8 +112,8 @@ struct fp_dev { /* drivers should not mess with any of the below */ enum fp_dev_state state; - int __enroll_stage; + int unconditional_capture; /* async I/O callbacks and data */ /* FIXME: convert this to generic state operational data mechanism? */ @@ -129,6 +133,10 @@ struct fp_dev { void *identify_cb_data; fp_identify_stop_cb identify_stop_cb; void *identify_stop_cb_data; + fp_capture_cb capture_cb; + void *capture_cb_data; + fp_capture_stop_cb capture_stop_cb; + void *capture_stop_cb_data; /* FIXME: better place to put this? */ struct fp_print_data **identify_gallery; @@ -146,6 +154,7 @@ enum fp_imgdev_action { IMG_ACTION_ENROLL, IMG_ACTION_VERIFY, IMG_ACTION_IDENTIFY, + IMG_ACTION_CAPTURE, }; enum fp_imgdev_enroll_state { @@ -179,8 +188,6 @@ struct fp_img_dev { void *priv; }; -int fpi_imgdev_capture(struct fp_img_dev *imgdev, int unconditional, - struct fp_img **image); int fpi_imgdev_get_img_width(struct fp_img_dev *imgdev); int fpi_imgdev_get_img_height(struct fp_img_dev *imgdev); @@ -215,6 +222,8 @@ struct fp_driver { int (*verify_stop)(struct fp_dev *dev, gboolean iterating); int (*identify_start)(struct fp_dev *dev); int (*identify_stop)(struct fp_dev *dev, gboolean iterating); + int (*capture_start)(struct fp_dev *dev); + int (*capture_stop)(struct fp_dev *dev); }; enum fp_print_data_type fpi_driver_get_data_type(struct fp_driver *drv); @@ -439,6 +448,11 @@ void fpi_drvcb_report_identify_result(struct fp_dev *dev, int result, size_t match_offset, struct fp_img *img); void fpi_drvcb_identify_stopped(struct fp_dev *dev); +void fpi_drvcb_capture_started(struct fp_dev *dev, int status); +void fpi_drvcb_report_capture_result(struct fp_dev *dev, int result, + struct fp_img *img); +void fpi_drvcb_capture_stopped(struct fp_dev *dev); + /* for image drivers */ void fpi_imgdev_open_complete(struct fp_img_dev *imgdev, int status); void fpi_imgdev_close_complete(struct fp_img_dev *imgdev); diff --git a/libfprint/fprint.h b/libfprint/fprint.h index 99fa1e10..af1d686b 100644 --- a/libfprint/fprint.h +++ b/libfprint/fprint.h @@ -107,6 +107,17 @@ uint32_t fp_dev_get_devtype(struct fp_dev *dev); int fp_dev_supports_print_data(struct fp_dev *dev, struct fp_print_data *data); int fp_dev_supports_dscv_print(struct fp_dev *dev, struct fp_dscv_print *print); +/** \ingroup dev + * Image capture result codes returned from fp_dev_img_capture(). + */ +enum fp_capture_result { + /** Capture completed successfully, the capture data has been + * returned to the caller. */ + FP_CAPTURE_COMPLETE = 0, + /** Capture failed for some reason */ + FP_CAPTURE_FAIL, +}; + int fp_dev_supports_imaging(struct fp_dev *dev); int fp_dev_img_capture(struct fp_dev *dev, int unconditional, struct fp_img **image); @@ -340,6 +351,13 @@ typedef void (*fp_identify_stop_cb)(struct fp_dev *dev, void *user_data); int fp_async_identify_stop(struct fp_dev *dev, fp_identify_stop_cb callback, void *user_data); +typedef void (*fp_capture_cb)(struct fp_dev *dev, int result, + struct fp_img *img, void *user_data); +int fp_async_capture_start(struct fp_dev *dev, int unconditional, fp_capture_cb callback, void *user_data); + +typedef void (*fp_capture_stop_cb)(struct fp_dev *dev, void *user_data); +int fp_async_capture_stop(struct fp_dev *dev, fp_capture_stop_cb callback, void *user_data); + #ifdef __cplusplus } #endif diff --git a/libfprint/imgdev.c b/libfprint/imgdev.c index 1ed3f6dd..f83ea11b 100644 --- a/libfprint/imgdev.c +++ b/libfprint/imgdev.c @@ -163,6 +163,9 @@ void fpi_imgdev_report_finger_status(struct fp_img_dev *imgdev, imgdev->identify_match_offset, img); fp_print_data_free(data); break; + case IMG_ACTION_CAPTURE: + fpi_drvcb_report_capture_result(imgdev->dev, r, img); + break; default: fp_err("unhandled action %d", imgdev->action); break; @@ -231,18 +234,20 @@ void fpi_imgdev_image_captured(struct fp_img_dev *imgdev, struct fp_img *img) fp_img_standardize(img); imgdev->acquire_img = img; - r = fpi_img_to_print_data(imgdev, img, &print); - if (r < 0) { - fp_dbg("image to print data conversion error: %d", r); - imgdev->action_result = FP_ENROLL_RETRY; - goto next_state; - } else if (img->minutiae->num < MIN_ACCEPTABLE_MINUTIAE) { - fp_dbg("not enough minutiae, %d/%d", img->minutiae->num, - MIN_ACCEPTABLE_MINUTIAE); - fp_print_data_free(print); - /* depends on FP_ENROLL_RETRY == FP_VERIFY_RETRY */ - imgdev->action_result = FP_ENROLL_RETRY; - goto next_state; + if (imgdev->action != IMG_ACTION_CAPTURE) { + r = fpi_img_to_print_data(imgdev, img, &print); + if (r < 0) { + fp_dbg("image to print data conversion error: %d", r); + imgdev->action_result = FP_ENROLL_RETRY; + goto next_state; + } else if (img->minutiae->num < MIN_ACCEPTABLE_MINUTIAE) { + fp_dbg("not enough minutiae, %d/%d", img->minutiae->num, + MIN_ACCEPTABLE_MINUTIAE); + fp_print_data_free(print); + /* depends on FP_ENROLL_RETRY == FP_VERIFY_RETRY */ + imgdev->action_result = FP_ENROLL_RETRY; + goto next_state; + } } imgdev->acquire_data = print; @@ -256,6 +261,9 @@ void fpi_imgdev_image_captured(struct fp_img_dev *imgdev, struct fp_img *img) case IMG_ACTION_IDENTIFY: identify_process_img(imgdev); break; + case IMG_ACTION_CAPTURE: + imgdev->action_result = FP_CAPTURE_COMPLETE; + break; default: BUG(); break; @@ -280,6 +288,9 @@ void fpi_imgdev_session_error(struct fp_img_dev *imgdev, int error) case IMG_ACTION_IDENTIFY: fpi_drvcb_report_identify_result(imgdev->dev, error, 0, NULL); break; + case IMG_ACTION_CAPTURE: + fpi_drvcb_report_capture_result(imgdev->dev, error, NULL); + break; default: fp_err("unhandled action %d", imgdev->action); break; @@ -300,6 +311,9 @@ void fpi_imgdev_activate_complete(struct fp_img_dev *imgdev, int status) case IMG_ACTION_IDENTIFY: fpi_drvcb_identify_started(imgdev->dev, status); break; + case IMG_ACTION_CAPTURE: + fpi_drvcb_capture_started(imgdev->dev, status); + break; default: fp_err("unhandled action %d", imgdev->action); return; @@ -325,6 +339,9 @@ void fpi_imgdev_deactivate_complete(struct fp_img_dev *imgdev) case IMG_ACTION_IDENTIFY: fpi_drvcb_identify_stopped(imgdev->dev); break; + case IMG_ACTION_CAPTURE: + fpi_drvcb_capture_stopped(imgdev->dev); + break; default: fp_err("unhandled action %d", imgdev->action); break; @@ -421,6 +438,14 @@ static int img_dev_identify_start(struct fp_dev *dev) return generic_acquire_start(dev, IMG_ACTION_IDENTIFY); } +static int img_dev_capture_start(struct fp_dev *dev) +{ + /* Unconditional capture is not supported yet */ + if (dev->unconditional_capture) + return -ENOTSUP; + return generic_acquire_start(dev, IMG_ACTION_CAPTURE); +} + static int img_dev_enroll_stop(struct fp_dev *dev) { struct fp_img_dev *imgdev = dev->priv; @@ -446,6 +471,14 @@ static int img_dev_identify_stop(struct fp_dev *dev, gboolean iterating) return 0; } +static int img_dev_capture_stop(struct fp_dev *dev) +{ + struct fp_img_dev *imgdev = dev->priv; + BUG_ON(imgdev->action != IMG_ACTION_CAPTURE); + generic_acquire_stop(imgdev); + return 0; +} + void fpi_img_driver_setup(struct fp_img_driver *idriver) { idriver->driver.type = DRIVER_IMAGING; @@ -457,5 +490,7 @@ void fpi_img_driver_setup(struct fp_img_driver *idriver) idriver->driver.verify_stop = img_dev_verify_stop; idriver->driver.identify_start = img_dev_identify_start; idriver->driver.identify_stop = img_dev_identify_stop; + idriver->driver.capture_start = img_dev_capture_start; + idriver->driver.capture_stop = img_dev_capture_stop; } diff --git a/libfprint/sync.c b/libfprint/sync.c index ca2f302f..b3b28983 100644 --- a/libfprint/sync.c +++ b/libfprint/sync.c @@ -512,3 +512,100 @@ err: return r; } +struct sync_capture_data { + gboolean populated; + int result; + struct fp_img *img; +}; + +static void sync_capture_cb(struct fp_dev *dev, int result, struct fp_img *img, + void *user_data) +{ + struct sync_capture_data *vdata = user_data; + vdata->result = result; + vdata->img = img; + vdata->populated = TRUE; +} + +static void capture_stop_cb(struct fp_dev *dev, void *user_data) +{ + gboolean *stopped = user_data; + fp_dbg(""); + *stopped = TRUE; +} +/** \ingroup dev + * Captures an \ref img "image" from a device. The returned image is the raw + * image provided by the device, you may wish to \ref img_std "standardize" it. + * + * If set, the unconditional flag indicates that the device should + * capture an image unconditionally, regardless of whether a finger is there + * or not. If unset, this function will block until a finger is detected on + * the sensor. + * + * \param dev the device + * \param unconditional whether to unconditionally capture an image, or to only capture when a finger is detected + * \param img a location to return the captured image. Must be freed with + * fp_img_free() after use. + * \return 0 on success, non-zero on error. -ENOTSUP indicates that either the + * unconditional flag was set but the device does not support this, or that the + * device does not support imaging. + * \sa fp_dev_supports_imaging() + */ +API_EXPORTED int fp_dev_img_capture(struct fp_dev *dev, int unconditional, + struct fp_img **img) +{ + struct sync_capture_data *vdata; + gboolean stopped = FALSE; + int r; + + if (!dev->drv->capture_start) { + fp_dbg("image capture is not supported on %s device", dev->drv->name); + return -ENOTSUP; + } + + fp_dbg("to be handled by %s", dev->drv->name); + vdata = g_malloc0(sizeof(struct sync_capture_data)); + r = fp_async_capture_start(dev, unconditional, sync_capture_cb, vdata); + if (r < 0) { + fp_dbg("capture_start error %d", r); + g_free(vdata); + return r; + } + + while (!vdata->populated) { + r = fp_handle_events(); + if (r < 0) { + g_free(vdata); + goto err; + } + } + + if (img) + *img = vdata->img; + else + fp_img_free(vdata->img); + + r = vdata->result; + g_free(vdata); + switch (r) { + case FP_CAPTURE_COMPLETE: + fp_dbg("result: complete"); + break; + case FP_CAPTURE_FAIL: + fp_dbg("result: fail"); + break; + default: + fp_err("unrecognised return code %d", r); + r = -EINVAL; + } + +err: + fp_dbg("ending capture"); + if (fp_async_capture_stop(dev, capture_stop_cb, &stopped) == 0) + while (!stopped) + if (fp_handle_events() < 0) + break; + + return r; +} + From d12b29478305da18918b2cb0df98c93516cd77d9 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Fri, 8 Feb 2013 19:04:30 +0300 Subject: [PATCH 04/19] Add upektc_img driver Imaging driver, handles UPEK 147e:2020 device --- configure.ac | 13 +- libfprint/Makefile.am | 6 + libfprint/core.c | 3 + libfprint/drivers/driver_ids.h | 1 + libfprint/drivers/upeke2.c | 5 - libfprint/drivers/upektc_img.c | 628 +++++++++++++++++++++++++++++++++ libfprint/drivers/upektc_img.h | 144 ++++++++ libfprint/fp_internal.h | 3 + 8 files changed, 797 insertions(+), 6 deletions(-) create mode 100644 libfprint/drivers/upektc_img.c create mode 100644 libfprint/drivers/upektc_img.h diff --git a/configure.ac b/configure.ac index b65a0bc3..5897e34b 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ AC_SUBST(lt_major) AC_SUBST(lt_revision) AC_SUBST(lt_age) -all_drivers="upeke2 upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes3500 aes4000 vfs101 vfs301" +all_drivers="upeke2 upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes3500 aes4000 vfs101 vfs301 upektc_img" require_imaging='no' require_aeslib='no' @@ -45,6 +45,7 @@ enable_aes3500='no' enable_aes4000='no' enable_vfs101='no' enable_vfs301='no' +enable_upektc_img='no' AC_ARG_WITH([drivers],[AS_HELP_STRING([--with-drivers], [List of drivers to enable])], @@ -135,6 +136,10 @@ for driver in `echo ${drivers} | sed -e 's/,/ /g' -e 's/,$//g'`; do AC_DEFINE([ENABLE_VFS301], [], [Build Validity VFS301/VFS300 driver]) enable_vfs301="yes" ;; + upektc_img) + AC_DEFINE([ENABLE_UPEKTC_IMG], [], [Build Upek TouchChip Fingerprint Coprocessor driver]) + enable_upektc_img="yes" + ;; esac done @@ -157,6 +162,7 @@ AM_CONDITIONAL([REQUIRE_AESX660], [test "$require_aesX660" = "yes"]) AM_CONDITIONAL([REQUIRE_AES3K], [test "$require_aes3k" = "yes"]) AM_CONDITIONAL([ENABLE_VFS101], [test "$enable_vfs101" = "yes"]) AM_CONDITIONAL([ENABLE_VFS301], [test "$enable_vfs301" = "yes"]) +AM_CONDITIONAL([ENABLE_UPEKTC_IMG], [test "$enable_upektc_img" = "yes"]) PKG_CHECK_MODULES(LIBUSB, [libusb-1.0 >= 0.9.1]) @@ -373,6 +379,11 @@ if test x$enable_vfs301 != xno ; then else AC_MSG_NOTICE([ vfs301 driver disabled]) fi +if test x$enable_upektc_img != xno ; then + AC_MSG_NOTICE([** upektc_img driver enabled]) +else + AC_MSG_NOTICE([ upektc_img driver disabled]) +fi if test x$require_aeslib != xno ; then AC_MSG_NOTICE([** aeslib helper functions enabled]) else diff --git a/libfprint/Makefile.am b/libfprint/Makefile.am index 5f46bc25..2d2c8908 100644 --- a/libfprint/Makefile.am +++ b/libfprint/Makefile.am @@ -18,6 +18,7 @@ FDU2000_SRC = drivers/fdu2000.c VCOM5S_SRC = drivers/vcom5s.c VFS101_SRC = drivers/vfs101.c VFS301_SRC = drivers/vfs301.c drivers/vfs301_proto.c drivers/vfs301_proto.h drivers/vfs301_proto_fragments.h +UPEKTC_IMG_SRC = drivers/upektc_img.c drivers/upektc_img.h EXTRA_DIST = \ $(UPEKE2_SRC) \ @@ -36,6 +37,7 @@ EXTRA_DIST = \ $(VCOM5S_SRC) \ $(VFS101_SRC) \ $(VFS301_SRC) \ + $(UPEKTC_IMG_SRC) \ drivers/aesx660.c \ drivers/aesx660.h \ drivers/aes3k.c \ @@ -165,6 +167,10 @@ if ENABLE_VFS301 DRIVER_SRC += $(VFS301_SRC) endif +if ENABLE_UPEKTC_IMG +DRIVER_SRC += $(UPEKTC_IMG_SRC) +endif + if REQUIRE_IMAGEMAGICK OTHER_SRC += imagemagick.c libfprint_la_CFLAGS += $(IMAGING_CFLAGS) diff --git a/libfprint/core.c b/libfprint/core.c index f6faab28..bf46826c 100644 --- a/libfprint/core.c +++ b/libfprint/core.c @@ -389,6 +389,9 @@ static struct fp_img_driver * const img_drivers[] = { #ifdef ENABLE_UPEKTC &upektc_driver, #endif +#ifdef ENABLE_UPEKTC_IMG + &upektc_img_driver, +#endif /*#ifdef ENABLE_FDU2000 &fdu2000_driver, #endif diff --git a/libfprint/drivers/driver_ids.h b/libfprint/drivers/driver_ids.h index 25ef2297..fde2512c 100644 --- a/libfprint/drivers/driver_ids.h +++ b/libfprint/drivers/driver_ids.h @@ -37,6 +37,7 @@ enum { AES1660_ID = 14, AES2660_ID = 15, AES3500_ID = 16, + UPEKTC_IMG_ID = 17, }; #endif diff --git a/libfprint/drivers/upeke2.c b/libfprint/drivers/upeke2.c index a7db54d2..83fe93f7 100644 --- a/libfprint/drivers/upeke2.c +++ b/libfprint/drivers/upeke2.c @@ -48,7 +48,6 @@ enum { UPEKE2_2016, - UPEKE2_2020, }; struct upeke2_dev { @@ -856,9 +855,6 @@ static int discover(struct libusb_device_descriptor *dsc, uint32_t *devtype) if (dsc->idProduct == 0x2016 && dsc->bcdDevice == 2) return 1; - if (dsc->idProduct == 0x2020 && dsc->bcdDevice == 1) - return 1; - return 0; } @@ -1461,7 +1457,6 @@ static int verify_stop(struct fp_dev *dev, gboolean iterating) static const struct usb_id id_table[] = { { .vendor = 0x147e, .product = 0x2016, .driver_data = UPEKE2_2016 }, - { .vendor = 0x147e, .product = 0x2020, .driver_data = UPEKE2_2020 }, { 0, 0, 0, }, /* terminating entry */ }; diff --git a/libfprint/drivers/upektc_img.c b/libfprint/drivers/upektc_img.c new file mode 100644 index 00000000..3bf6dcfa --- /dev/null +++ b/libfprint/drivers/upektc_img.c @@ -0,0 +1,628 @@ +/* + * UPEK TouchChip driver for libfprint + * Copyright (C) 2013 Vasily Khoruzhick + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define FP_COMPONENT "upekts_img" + +#include +#include + +#include + +#include +#include + +#include "upektc_img.h" +#include "driver_ids.h" + +static void start_capture(struct fp_img_dev *dev); +static void start_deactivation(struct fp_img_dev *dev); + +#define EP_IN (1 | LIBUSB_ENDPOINT_IN) +#define EP_OUT (2 | LIBUSB_ENDPOINT_OUT) +#define CTRL_TIMEOUT 4000 +#define BULK_TIMEOUT 4000 + +#define IMAGE_WIDTH 144 +#define IMAGE_HEIGHT 384 +#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT) + +#define MAX_CMD_SIZE 64 +#define MAX_RESPONSE_SIZE 2052 +#define SHORT_RESPONSE_SIZE 64 + +struct upekts_img_dev { + unsigned char cmd[MAX_CMD_SIZE]; + unsigned char image_bits[IMAGE_SIZE * 2]; + unsigned char seq; + size_t image_size; + gboolean deactivating; +}; + +/****** HELPERS ******/ + +static const uint16_t crc_table[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +}; + +static uint16_t udf_crc(unsigned char *buffer, size_t size) +{ + uint16_t crc = 0; + while (size--) + crc = (uint16_t) ((crc << 8) ^ + crc_table[((crc >> 8) & 0x00ff) ^ *buffer++]); + return crc; +} + +static void upektc_img_cmd_fix_seq(unsigned char *cmd_buf, unsigned char seq) +{ + uint8_t byte; + + byte = cmd_buf[5]; + byte &= 0x0f; + byte |= (seq << 4); + cmd_buf[5] = byte; +} + +static void upektc_img_cmd_update_crc(unsigned char *cmd_buf, size_t size) +{ + /* CRC does not cover Ciao prefix (4 bytes) and CRC location (2 bytes) */ + uint16_t crc = udf_crc(cmd_buf + 4, size - 6); + + cmd_buf[size - 2] = (crc & 0x00ff); + cmd_buf[size - 1] = (crc & 0xff00) >> 8; +} + +static void upektc_img_submit_req(struct fpi_ssm *ssm, + const unsigned char *buf, size_t buf_size, unsigned char seq, + libusb_transfer_cb_fn cb) +{ + struct fp_img_dev *dev = ssm->priv; + struct upekts_img_dev *upekdev = dev->priv; + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + int r; + + BUG_ON(buf_size > MAX_CMD_SIZE); + + if (!transfer) { + fpi_ssm_mark_aborted(ssm, -ENOMEM); + return; + } + + transfer->flags |= LIBUSB_TRANSFER_FREE_TRANSFER; + + memcpy(upekdev->cmd, buf, buf_size); + upektc_img_cmd_fix_seq(upekdev->cmd, seq); + upektc_img_cmd_update_crc(upekdev->cmd, buf_size); + + libusb_fill_bulk_transfer(transfer, dev->udev, EP_OUT, upekdev->cmd, buf_size, + cb, ssm, BULK_TIMEOUT); + + r = libusb_submit_transfer(transfer); + if (r < 0) { + libusb_free_transfer(transfer); + fpi_ssm_mark_aborted(ssm, r); + } +} + +static void upektc_img_read_data(struct fpi_ssm *ssm, size_t buf_size, libusb_transfer_cb_fn cb) +{ + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + struct fp_img_dev *dev = ssm->priv; + int r; + unsigned char *data; + + if (!transfer) { + fpi_ssm_mark_aborted(ssm, -ENOMEM); + return; + } + + transfer->flags |= LIBUSB_TRANSFER_FREE_BUFFER | + LIBUSB_TRANSFER_FREE_TRANSFER; + + data = g_malloc(buf_size); + libusb_fill_bulk_transfer(transfer, dev->udev, EP_IN, data, buf_size, + cb, ssm, BULK_TIMEOUT); + + r = libusb_submit_transfer(transfer); + if (r < 0) { + g_free(data); + libusb_free_transfer(transfer); + fpi_ssm_mark_aborted(ssm, r); + } +} + +/****** CAPTURE ******/ + +enum capture_states { + CAPTURE_INIT_CAPTURE, + CAPTURE_READ_DATA, + CAPTURE_ACK_00_28, + CAPTURE_ACK_08, + CAPTURE_ACK_FRAME, + CAPTURE_NUM_STATES, +}; + +static void capture_reqs_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + + if ((transfer->status == LIBUSB_TRANSFER_COMPLETED) && + (transfer->length == transfer->actual_length)) { + fpi_ssm_jump_to_state(ssm, CAPTURE_READ_DATA); + } else { + fpi_ssm_mark_aborted(ssm, -EIO); + } +} + +static int upektc_img_process_image_frame(unsigned char *image_buf, unsigned char *cmd_res) +{ + int offset = 8; + int len = ((cmd_res[5] & 0x0f) << 8) | (cmd_res[6]); + + len -= 1; + if (cmd_res[7] == 0x2c) { + len -= 10; + offset += 10; + } + if (cmd_res[7] == 0x20) { + len -= 4; + } + memcpy(image_buf, cmd_res + offset, len); + + return len; +} + +static void capture_read_data_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + struct fp_img_dev *dev = ssm->priv; + struct upekts_img_dev *upekdev = dev->priv; + unsigned char *data = transfer->buffer; + struct fp_img *img; + + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fp_dbg("request is not completed, %d", transfer->status); + fpi_ssm_mark_aborted(ssm, -EIO); + return; + } + + fp_dbg("request completed, len: %.4x", transfer->actual_length); + if (transfer->actual_length == 0) { + fpi_ssm_jump_to_state(ssm, CAPTURE_READ_DATA); + return; + } + + if (upekdev->deactivating) { + fp_dbg("Deactivate requested\n"); + fpi_ssm_mark_completed(ssm); + return; + } + + switch (data[4]) { + case 0x00: + switch (data[7]) { + /* No finger */ + case 0x28: + fpi_ssm_jump_to_state(ssm, CAPTURE_ACK_00_28); + break; + /* Image frame with additional info */ + case 0x2c: + fpi_imgdev_report_finger_status(dev, TRUE); + /* Plain image frame */ + case 0x24: + upekdev->image_size += + upektc_img_process_image_frame(upekdev->image_bits + upekdev->image_size, + data); + fpi_ssm_jump_to_state(ssm, CAPTURE_ACK_FRAME); + break; + /* Last image frame */ + case 0x20: + upekdev->image_size += + upektc_img_process_image_frame(upekdev->image_bits + upekdev->image_size, + data); + BUG_ON(upekdev->image_size != IMAGE_SIZE); + fp_dbg("Image size is %d\n", upekdev->image_size); + img = fpi_img_new(IMAGE_SIZE); + memcpy(img->data, upekdev->image_bits, IMAGE_SIZE); + fpi_imgdev_image_captured(dev, img); + fpi_imgdev_report_finger_status(dev, FALSE); + fpi_ssm_mark_completed(ssm); + break; + default: + fp_err("Uknown response!\n"); + fpi_ssm_mark_aborted(ssm, -EINVAL); + break; + } + break; + case 0x08: + fpi_ssm_jump_to_state(ssm, CAPTURE_ACK_08); + break; + } +} + +static void capture_run_state(struct fpi_ssm *ssm) +{ + struct fp_img_dev *dev = ssm->priv; + struct upekts_img_dev *upekdev = dev->priv; + + switch (ssm->cur_state) { + case CAPTURE_INIT_CAPTURE: + upektc_img_submit_req(ssm, upek2020_init_capture, sizeof(upek2020_init_capture), + upekdev->seq, capture_reqs_cb); + upekdev->seq++; + break; + case CAPTURE_READ_DATA: + upektc_img_read_data(ssm, MAX_RESPONSE_SIZE, capture_read_data_cb); + break; + case CAPTURE_ACK_00_28: + upektc_img_submit_req(ssm, upek2020_ack_00_28, sizeof(upek2020_ack_00_28), + upekdev->seq, capture_reqs_cb); + upekdev->seq++; + break; + case CAPTURE_ACK_08: + upektc_img_submit_req(ssm, upek2020_ack_08, sizeof(upek2020_ack_08), + 0, capture_reqs_cb); + break; + case CAPTURE_ACK_FRAME: + upektc_img_submit_req(ssm, upek2020_ack_frame, sizeof(upek2020_ack_frame), + upekdev->seq, capture_reqs_cb); + upekdev->seq++; + break; + }; +} + +static void capture_sm_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *dev = ssm->priv; + struct upekts_img_dev *upekdev = dev->priv; + int err = ssm->error; + + fp_dbg("Capture completed, %d", err); + fpi_ssm_free(ssm); + + if (upekdev->deactivating) + start_deactivation(dev); + else if (err) + fpi_imgdev_session_error(dev, err); + else + start_capture(dev); +} + +static void start_capture(struct fp_img_dev *dev) +{ + struct upekts_img_dev *upekdev = dev->priv; + struct fpi_ssm *ssm; + + upekdev->image_size = 0; + + ssm = fpi_ssm_new(dev->dev, capture_run_state, CAPTURE_NUM_STATES); + ssm->priv = dev; + fpi_ssm_start(ssm, capture_sm_complete); +} + +/****** INITIALIZATION/DEINITIALIZATION ******/ + +enum deactivate_states { + DEACTIVATE_DEINIT, + DEACTIVATE_READ_DEINIT_DATA, + DEACTIVATE_NUM_STATES, +}; + +static void deactivate_reqs_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + + if ((transfer->status == LIBUSB_TRANSFER_COMPLETED) && + (transfer->length == transfer->actual_length)) { + fpi_ssm_jump_to_state(ssm, CAPTURE_READ_DATA); + } else { + fpi_ssm_mark_aborted(ssm, -EIO); + } +} + +/* TODO: process response properly */ +static void deactivate_read_data_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { + fpi_ssm_mark_completed(ssm); + } else { + fpi_ssm_mark_aborted(ssm, -EIO); + } +} + +static void deactivate_run_state(struct fpi_ssm *ssm) +{ + struct fp_img_dev *dev = ssm->priv; + struct upekts_img_dev *upekdev = dev->priv; + + switch (ssm->cur_state) { + case DEACTIVATE_DEINIT: + upektc_img_submit_req(ssm, upek2020_deinit, sizeof(upek2020_deinit), + upekdev->seq, deactivate_reqs_cb); + upekdev->seq++; + break; + case DEACTIVATE_READ_DEINIT_DATA: + upektc_img_read_data(ssm, MAX_RESPONSE_SIZE, deactivate_read_data_cb); + break; + }; +} + +static void deactivate_sm_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *dev = ssm->priv; + struct upekts_img_dev *upekdev = dev->priv; + int err = ssm->error; + + fp_dbg("Deactivate completed"); + fpi_ssm_free(ssm); + + if (err) { + fpi_imgdev_session_error(dev, err); + return; + } + + upekdev->deactivating = FALSE; + fpi_imgdev_deactivate_complete(dev); +} + +static void start_deactivation(struct fp_img_dev *dev) +{ + struct upekts_img_dev *upekdev = dev->priv; + struct fpi_ssm *ssm; + + upekdev->image_size = 0; + + ssm = fpi_ssm_new(dev->dev, deactivate_run_state, DEACTIVATE_NUM_STATES); + ssm->priv = dev; + fpi_ssm_start(ssm, deactivate_sm_complete); +} + +enum activate_states { + ACTIVATE_CONTROL_REQ_1, + ACTIVATE_READ_CTRL_RESP_1, + ACTIVATE_INIT_1, + ACTIVATE_READ_INIT_1_RESP, + ACTIVATE_INIT_2, + ACTIVATE_READ_INIT_2_RESP, + ACTIVATE_CONTROL_REQ_2, + ACTIVATE_READ_CTRL_RESP_2, + ACTIVATE_INIT_3, + ACTIVATE_READ_INIT_3_RESP, + ACTIVATE_INIT_4, + ACTIVATE_READ_INIT_4_RESP, + ACTIVATE_NUM_STATES, +}; + +static void init_reqs_ctrl_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { + fpi_ssm_next_state(ssm); + } else { + fpi_ssm_mark_aborted(ssm, -EIO); + } +} + +static void init_reqs_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + + if ((transfer->status == LIBUSB_TRANSFER_COMPLETED) && + (transfer->length == transfer->actual_length)) { + fpi_ssm_next_state(ssm); + } else { + fpi_ssm_mark_aborted(ssm, -EIO); + } +} + +/* TODO: process response properly */ +static void init_read_data_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { + fpi_ssm_next_state(ssm); + } else { + fpi_ssm_mark_aborted(ssm, -EIO); + } +} + +static void activate_run_state(struct fpi_ssm *ssm) +{ + struct libusb_transfer *transfer; + struct fp_img_dev *dev = ssm->priv; + struct upekts_img_dev *upekdev = dev->priv; + int r; + + switch (ssm->cur_state) { + case ACTIVATE_CONTROL_REQ_1: + case ACTIVATE_CONTROL_REQ_2: + { + unsigned char *data; + + transfer = libusb_alloc_transfer(0); + if (!transfer) { + fpi_ssm_mark_aborted(ssm, -ENOMEM); + break; + } + transfer->flags |= LIBUSB_TRANSFER_FREE_BUFFER | + LIBUSB_TRANSFER_FREE_TRANSFER; + + data = g_malloc0(LIBUSB_CONTROL_SETUP_SIZE + 1); + libusb_fill_control_setup(data, + LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, 0x0c, 0x100, 0x0400, 1); + libusb_fill_control_transfer(transfer, ssm->dev->udev, data, + init_reqs_ctrl_cb, ssm, CTRL_TIMEOUT); + r = libusb_submit_transfer(transfer); + if (r < 0) { + g_free(data); + libusb_free_transfer(transfer); + fpi_ssm_mark_aborted(ssm, r); + } + } + break; + case ACTIVATE_INIT_1: + upektc_img_submit_req(ssm, upek2020_init_1, sizeof(upek2020_init_1), + 0, init_reqs_cb); + break; + case ACTIVATE_INIT_2: + upektc_img_submit_req(ssm, upek2020_init_2, sizeof(upek2020_init_2), + 0, init_reqs_cb); + break; + case ACTIVATE_INIT_3: + upektc_img_submit_req(ssm, upek2020_init_3, sizeof(upek2020_init_3), + 0, init_reqs_cb); + break; + case ACTIVATE_INIT_4: + upektc_img_submit_req(ssm, upek2020_init_4, sizeof(upek2020_init_4), + upekdev->seq, init_reqs_cb); + /* Seq should be updated after 4th init */ + upekdev->seq++; + break; + case ACTIVATE_READ_CTRL_RESP_1: + case ACTIVATE_READ_CTRL_RESP_2: + case ACTIVATE_READ_INIT_1_RESP: + case ACTIVATE_READ_INIT_2_RESP: + case ACTIVATE_READ_INIT_3_RESP: + case ACTIVATE_READ_INIT_4_RESP: + upektc_img_read_data(ssm, SHORT_RESPONSE_SIZE, init_read_data_cb); + break; + } +} + +static void activate_sm_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *dev = ssm->priv; + int err = ssm->error; + + fpi_ssm_free(ssm); + fp_dbg("%s status %d", __func__, err); + fpi_imgdev_activate_complete(dev, err); + + if (!err) + start_capture(dev); +} + +static int dev_activate(struct fp_img_dev *dev, enum fp_imgdev_state state) +{ + struct upekts_img_dev *upekdev = dev->priv; + struct fpi_ssm *ssm = fpi_ssm_new(dev->dev, activate_run_state, + ACTIVATE_NUM_STATES); + ssm->priv = dev; + upekdev->seq = 0; + fpi_ssm_start(ssm, activate_sm_complete); + return 0; +} + +static void dev_deactivate(struct fp_img_dev *dev) +{ + struct upekts_img_dev *upekdev = dev->priv; + + upekdev->deactivating = TRUE; +} + +static int dev_init(struct fp_img_dev *dev, unsigned long driver_data) +{ + /* TODO check that device has endpoints we're using */ + int r; + + r = libusb_claim_interface(dev->udev, 0); + if (r < 0) { + fp_err("could not claim interface 0"); + return r; + } + + dev->priv = g_malloc0(sizeof(struct upekts_img_dev)); + fpi_imgdev_open_complete(dev, 0); + return 0; +} + +static void dev_deinit(struct fp_img_dev *dev) +{ + g_free(dev->priv); + libusb_release_interface(dev->udev, 0); + fpi_imgdev_close_complete(dev); +} + +static int discover(struct libusb_device_descriptor *dsc, uint32_t *devtype) +{ + if (dsc->idProduct == 0x2020 && dsc->bcdDevice == 1) + return 1; + + return 0; +} + +static const struct usb_id id_table[] = { + { .vendor = 0x147e, .product = 0x2020 }, + { 0, 0, 0, }, +}; + +struct fp_img_driver upektc_img_driver = { + .driver = { + .id = UPEKTC_IMG_ID, + .name = FP_COMPONENT, + .full_name = "Upek TouchChip Fingerprint Coprocessor", + .id_table = id_table, + .scan_type = FP_SCAN_TYPE_SWIPE, + .discover = discover, + }, + .flags = 0, + .img_height = IMAGE_HEIGHT, + .img_width = IMAGE_WIDTH, + .bz3_threshold = 70, + + .open = dev_init, + .close = dev_deinit, + .activate = dev_activate, + .deactivate = dev_deactivate, +}; diff --git a/libfprint/drivers/upektc_img.h b/libfprint/drivers/upektc_img.h new file mode 100644 index 00000000..6146557e --- /dev/null +++ b/libfprint/drivers/upektc_img.h @@ -0,0 +1,144 @@ +/* + * Upek TouchChip Fingerprint Coprocessor definitions + * Copyright (c) 2013 Vasily Khoruzhick + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __UPEKTC_IMG_H +#define __UPEKTC_IMG_H + +static const unsigned char upek2020_init_1[] = { +'C', 'i', 'a', 'o', +0x04, +0x00, 0x0d, +0x01, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x00, 0x00, 0x00, +0xda, 0xc1 +}; + +static const unsigned char upek2020_init_2[] = { +0x43, 0x69, 0x61, 0x6f, +0x07, +0x00, 0x01, +0x01, +0x3d, 0x72 +}; + +static const unsigned char upek2020_init_3[] = { +'C', 'i', 'a', 'o', +0x04, +0x00, 0x0d, +0x01, 0x00, 0xbc, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x00, 0x00, 0x00, +0x55, 0x2f +}; + +static const unsigned char upek2020_init_4[] = { +'C', 'i', 'a', 'o', +0x00, +0x00, 0x07, +0x28, 0x04, 0x00, 0x00, 0x00, 0x06, 0x04, +0xc0, 0xd6 +}; + +static const unsigned char upek2020_deinit[] = { +'C', 'i', 'a', 'o', +0x07, +0x00, 0x01, +0x01, +0x3d, +0x72 +}; + +static const unsigned char upek2020_init_capture[] = { +'C', 'i', 'a', 'o', +0x00, +0x00, 0x0e, /* Seq = 7, len = 0x00e */ +0x28, /* CMD = 0x28 */ +0x0b, 0x00, /* Inner len = 0x000b */ +0x00, 0x00, +0x0e, /* SUBCMD = 0x0e */ +0x02, +0xfe, 0xff, 0xff, 0xff, /* timeout = -2 = 0xfffffffe = infinite time */ +0x02, +0x00, /* Wait for acceptable finger */ +0x02, +0x14, 0x9a /* CRC */ +}; + +#if 0 +static const unsigned char finger_status[] = { +'C', 'i', 'a', 'o', +0x00, +0x70, 0x14, /* Seq = 7, len = 0x014 */ +0x28, /* CMD = 0x28 */ +0x11, 0x00, /* Inner len = 0x0011 */ +0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, +0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, +0x26, 0x03, /* CRC */ +0x00, 0x00, 0x00, /* Rest is garbage */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif + +static const unsigned char upek2020_ack_00_28[] = { +'C', 'i', 'a', 'o', +0x00, +0x80, 0x08, /* Seq = 8, len = 0x008 */ +0x28, /* CMD = 0x28 */ +0x05, 0x00, /* Inner len = 0x0005 */ +0x00, 0x00, 0x00, 0x30, 0x01, +0x6a, 0xc4 /* CRC */ +}; + +#if 0 +/* No seq should be tracked here */ +static const unsigned char got_finger[] = { +'C', 'i', 'a', 'o', +0x08, +0x00, 0x00, /* Seq = 0, len = 0x000 */ +0xa1, 0xa9, /* CRC */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Rest is garbage */ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif + +/* No seq should be put in there */ +static const unsigned char upek2020_ack_08[] = { +'C', 'i', 'a', 'o', +0x09, +0x00, 0x00, /* Seq = 0, len = 0x0 */ +0x91, 0x9e /* CRC */ +}; + +static const unsigned char upek2020_ack_frame[] = { +'C', 'i', 'a', 'o', +0x00, +0x50, 0x01, /* Seq = 5, len = 0x001 */ +0x30, +0xac, 0x5b /* CRC */ +}; + +#endif diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h index c383c66a..42d38f1e 100644 --- a/libfprint/fp_internal.h +++ b/libfprint/fp_internal.h @@ -294,6 +294,9 @@ extern struct fp_img_driver vfs101_driver; #ifdef ENABLE_VFS301 extern struct fp_img_driver vfs301_driver; #endif +#ifdef ENABLE_UPEKTC_IMG +extern struct fp_img_driver upektc_img_driver; +#endif extern libusb_context *fpi_usb_ctx; extern GSList *opened_devices; From 5ff45658c0921f250e3c24538037b80024287ea7 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Sat, 9 Mar 2013 14:08:50 +0300 Subject: [PATCH 05/19] upektc_img: add support for Upek Eikon 2 devices --- libfprint/drivers/upektc_img.c | 63 +++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/libfprint/drivers/upektc_img.c b/libfprint/drivers/upektc_img.c index 3bf6dcfa..9bf099d1 100644 --- a/libfprint/drivers/upektc_img.c +++ b/libfprint/drivers/upektc_img.c @@ -48,9 +48,11 @@ static void start_deactivation(struct fp_img_dev *dev); struct upekts_img_dev { unsigned char cmd[MAX_CMD_SIZE]; + unsigned char response[MAX_RESPONSE_SIZE]; unsigned char image_bits[IMAGE_SIZE * 2]; unsigned char seq; size_t image_size; + size_t response_rest; gboolean deactivating; }; @@ -151,28 +153,27 @@ static void upektc_img_submit_req(struct fpi_ssm *ssm, } } -static void upektc_img_read_data(struct fpi_ssm *ssm, size_t buf_size, libusb_transfer_cb_fn cb) +static void upektc_img_read_data(struct fpi_ssm *ssm, size_t buf_size, size_t buf_offset, libusb_transfer_cb_fn cb) { struct libusb_transfer *transfer = libusb_alloc_transfer(0); struct fp_img_dev *dev = ssm->priv; + struct upekts_img_dev *upekdev = dev->priv; int r; - unsigned char *data; if (!transfer) { fpi_ssm_mark_aborted(ssm, -ENOMEM); return; } - transfer->flags |= LIBUSB_TRANSFER_FREE_BUFFER | - LIBUSB_TRANSFER_FREE_TRANSFER; + BUG_ON(buf_size > MAX_RESPONSE_SIZE); - data = g_malloc(buf_size); - libusb_fill_bulk_transfer(transfer, dev->udev, EP_IN, data, buf_size, + transfer->flags |= LIBUSB_TRANSFER_FREE_TRANSFER; + + libusb_fill_bulk_transfer(transfer, dev->udev, EP_IN, upekdev->response + buf_offset, buf_size, cb, ssm, BULK_TIMEOUT); r = libusb_submit_transfer(transfer); if (r < 0) { - g_free(data); libusb_free_transfer(transfer); fpi_ssm_mark_aborted(ssm, r); } @@ -224,8 +225,9 @@ static void capture_read_data_cb(struct libusb_transfer *transfer) struct fpi_ssm *ssm = transfer->user_data; struct fp_img_dev *dev = ssm->priv; struct upekts_img_dev *upekdev = dev->priv; - unsigned char *data = transfer->buffer; + unsigned char *data = upekdev->response; struct fp_img *img; + size_t response_size; if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { fp_dbg("request is not completed, %d", transfer->status); @@ -233,17 +235,32 @@ static void capture_read_data_cb(struct libusb_transfer *transfer) return; } + if (upekdev->deactivating) { + fp_dbg("Deactivate requested\n"); + fpi_ssm_mark_completed(ssm); + return; + } + fp_dbg("request completed, len: %.4x", transfer->actual_length); if (transfer->actual_length == 0) { fpi_ssm_jump_to_state(ssm, CAPTURE_READ_DATA); return; } - if (upekdev->deactivating) { - fp_dbg("Deactivate requested\n"); - fpi_ssm_mark_completed(ssm); - return; + if (!upekdev->response_rest) { + response_size = ((data[5] & 0x0f) << 8) + data[6]; + response_size += 9; /* 7 bytes for header, 2 for CRC */ + if (response_size > transfer->actual_length) { + fp_dbg("response_size is %d, actual_length is %d\n", + response_size, transfer->actual_length); + fp_dbg("Waiting for rest of transfer"); + BUG_ON(upekdev->response_rest); + upekdev->response_rest = response_size - transfer->actual_length; + fpi_ssm_jump_to_state(ssm, CAPTURE_READ_DATA); + return; + } } + upekdev->response_rest = 0; switch (data[4]) { case 0x00: @@ -277,13 +294,16 @@ static void capture_read_data_cb(struct libusb_transfer *transfer) break; default: fp_err("Uknown response!\n"); - fpi_ssm_mark_aborted(ssm, -EINVAL); + fpi_ssm_mark_aborted(ssm, -EIO); break; } break; case 0x08: fpi_ssm_jump_to_state(ssm, CAPTURE_ACK_08); break; + default: + fp_err("Not handled response!\n"); + fpi_ssm_mark_aborted(ssm, -EIO); } } @@ -299,7 +319,11 @@ static void capture_run_state(struct fpi_ssm *ssm) upekdev->seq++; break; case CAPTURE_READ_DATA: - upektc_img_read_data(ssm, MAX_RESPONSE_SIZE, capture_read_data_cb); + if (!upekdev->response_rest) + upektc_img_read_data(ssm, SHORT_RESPONSE_SIZE, 0, capture_read_data_cb); + else + upektc_img_read_data(ssm, MAX_RESPONSE_SIZE - SHORT_RESPONSE_SIZE, + SHORT_RESPONSE_SIZE, capture_read_data_cb); break; case CAPTURE_ACK_00_28: upektc_img_submit_req(ssm, upek2020_ack_00_28, sizeof(upek2020_ack_00_28), @@ -391,7 +415,7 @@ static void deactivate_run_state(struct fpi_ssm *ssm) upekdev->seq++; break; case DEACTIVATE_READ_DEINIT_DATA: - upektc_img_read_data(ssm, MAX_RESPONSE_SIZE, deactivate_read_data_cb); + upektc_img_read_data(ssm, SHORT_RESPONSE_SIZE, 0, deactivate_read_data_cb); break; }; } @@ -535,7 +559,7 @@ static void activate_run_state(struct fpi_ssm *ssm) case ACTIVATE_READ_INIT_2_RESP: case ACTIVATE_READ_INIT_3_RESP: case ACTIVATE_READ_INIT_4_RESP: - upektc_img_read_data(ssm, SHORT_RESPONSE_SIZE, init_read_data_cb); + upektc_img_read_data(ssm, SHORT_RESPONSE_SIZE, 0, init_read_data_cb); break; } } @@ -598,11 +622,18 @@ static int discover(struct libusb_device_descriptor *dsc, uint32_t *devtype) { if (dsc->idProduct == 0x2020 && dsc->bcdDevice == 1) return 1; +#ifndef ENABLE_UPEKE2 + if (dsc->idProduct == 0x2016 && dsc->bcdDevice == 2) + return 1; +#endif return 0; } static const struct usb_id id_table[] = { +#ifndef ENABLE_UPEKE2 + { .vendor = 0x147e, .product = 0x2016 }, +#endif { .vendor = 0x147e, .product = 0x2020 }, { 0, 0, 0, }, }; From fe3fdd1f5061d3b6fa172758c07705f8bfcb6d07 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Sat, 9 Mar 2013 14:09:11 +0300 Subject: [PATCH 06/19] upeke2: disable by default, device is now handled by upektc_img driver --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 5897e34b..65ae69b7 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ AC_SUBST(lt_major) AC_SUBST(lt_revision) AC_SUBST(lt_age) -all_drivers="upeke2 upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes3500 aes4000 vfs101 vfs301 upektc_img" +all_drivers="upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes3500 aes4000 vfs101 vfs301 upektc_img" require_imaging='no' require_aeslib='no' From e215b0509448e05bf7a352317bc3282a9d5fd437 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Mon, 18 Feb 2013 12:27:33 +0300 Subject: [PATCH 07/19] imgdev: perform 5 scans for enrollment This feature dramatically improves matching rate on devices with small sensors. --- libfprint/data.c | 159 ++++++++++++++++++++++++++++++------- libfprint/drivers/upeke2.c | 12 ++- libfprint/drivers/upekts.c | 12 ++- libfprint/fp_internal.h | 24 ++++-- libfprint/img.c | 78 +++++++++++++----- libfprint/imgdev.c | 32 +++++++- 6 files changed, 248 insertions(+), 69 deletions(-) diff --git a/libfprint/data.c b/libfprint/data.c index bfbf8fb5..3c138c3c 100644 --- a/libfprint/data.c +++ b/libfprint/data.c @@ -95,21 +95,33 @@ static const char *finger_num_to_str(enum fp_finger finger) #endif static struct fp_print_data *print_data_new(uint16_t driver_id, - uint32_t devtype, enum fp_print_data_type type, size_t length) + uint32_t devtype, enum fp_print_data_type type) { - struct fp_print_data *data = g_malloc0(sizeof(*data) + length); - fp_dbg("length=%zd driver=%02x devtype=%04x", length, driver_id, devtype); + struct fp_print_data *data = g_malloc0(sizeof(*data)); + fp_dbg("driver=%02x devtype=%04x", driver_id, devtype); data->driver_id = driver_id; data->devtype = devtype; data->type = type; - data->length = length; return data; } -struct fp_print_data *fpi_print_data_new(struct fp_dev *dev, size_t length) +void fpi_print_data_item_free(struct fp_print_data_item *item) +{ + g_free(item); +} + +struct fp_print_data_item *fpi_print_data_item_new(size_t length) +{ + struct fp_print_data_item *item = g_malloc(sizeof(*item) + length); + item->length = length; + + return item; +} + +struct fp_print_data *fpi_print_data_new(struct fp_dev *dev) { return print_data_new(dev->drv->id, dev->devtype, - fpi_driver_get_data_type(dev->drv), length); + fpi_driver_get_data_type(dev->drv)); } /** \ingroup print_data @@ -124,27 +136,115 @@ struct fp_print_data *fpi_print_data_new(struct fp_dev *dev, size_t length) API_EXPORTED size_t fp_print_data_get_data(struct fp_print_data *data, unsigned char **ret) { - struct fpi_print_data_fp1 *buf; - size_t buflen; + struct fpi_print_data_fp2 *out_data; + struct fpi_print_data_item_fp2 *out_item; + struct fp_print_data_item *item; + size_t buflen = 0; + GSList *list_item; + unsigned char *buf; fp_dbg(""); - buflen = sizeof(*buf) + data->length; - buf = malloc(buflen); - if (!buf) - return 0; + list_item = data->prints; + while (list_item) { + item = list_item->data; + buflen += sizeof(*out_item); + buflen += item->length; + list_item = g_slist_next(list_item); + } + + buflen += sizeof(*out_data); + out_data = g_malloc(buflen); + + *ret = (unsigned char *) out_data; + buf = out_data->data; + out_data->prefix[0] = 'F'; + out_data->prefix[1] = 'P'; + out_data->prefix[2] = '2'; + out_data->driver_id = GUINT16_TO_LE(data->driver_id); + out_data->devtype = GUINT32_TO_LE(data->devtype); + out_data->data_type = data->type; + + list_item = data->prints; + while (list_item) { + item = list_item->data; + out_item = (struct fpi_print_data_item_fp2 *)buf; + out_item->length = GUINT32_TO_LE(item->length); + /* FIXME: fp_print_data_item->data content is not endianess agnostic */ + memcpy(out_item->data, item->data, item->length); + buf += sizeof(*out_item); + buf += item->length; + list_item = g_slist_next(list_item); + } - *ret = (unsigned char *) buf; - buf->prefix[0] = 'F'; - buf->prefix[1] = 'P'; - buf->prefix[2] = '1'; - buf->driver_id = GUINT16_TO_LE(data->driver_id); - buf->devtype = GUINT32_TO_LE(data->devtype); - buf->data_type = data->type; - memcpy(buf->data, data->data, data->length); return buflen; } +static struct fp_print_data *fpi_print_data_from_fp1_data(unsigned char *buf, + size_t buflen) +{ + size_t print_data_len; + struct fp_print_data *data; + struct fp_print_data_item *item; + struct fpi_print_data_fp2 *raw = (struct fpi_print_data_fp2 *) buf; + + print_data_len = buflen - sizeof(*raw); + data = print_data_new(GUINT16_FROM_LE(raw->driver_id), + GUINT32_FROM_LE(raw->devtype), raw->data_type); + item = fpi_print_data_item_new(print_data_len); + /* FIXME: fp_print_data->data content is not endianess agnostic */ + memcpy(item->data, raw->data, print_data_len); + data->prints = g_slist_prepend(data->prints, item); + + return data; +} + +static struct fp_print_data *fpi_print_data_from_fp2_data(unsigned char *buf, + size_t buflen) +{ + size_t total_data_len, item_len; + struct fp_print_data *data; + struct fp_print_data_item *item; + struct fpi_print_data_fp2 *raw = (struct fpi_print_data_fp2 *) buf; + unsigned char *raw_buf; + struct fpi_print_data_item_fp2 *raw_item; + + total_data_len = buflen - sizeof(*raw); + data = print_data_new(GUINT16_FROM_LE(raw->driver_id), + GUINT32_FROM_LE(raw->devtype), raw->data_type); + raw_buf = raw->data; + while (total_data_len) { + if (total_data_len < sizeof(*raw_item)) + break; + total_data_len -= sizeof(*raw_item); + + raw_item = (struct fpi_print_data_item_fp2 *)raw_buf; + item_len = GUINT32_FROM_LE(raw_item->length); + fp_dbg("item len %d, total_data_len %d", item_len, total_data_len); + if (total_data_len < item_len) { + fp_err("corrupted fingerprint data"); + break; + } + total_data_len -= item_len; + + item = fpi_print_data_item_new(item_len); + /* FIXME: fp_print_data->data content is not endianess agnostic */ + memcpy(item->data, raw_item->data, item_len); + data->prints = g_slist_prepend(data->prints, item); + + raw_buf += sizeof(*raw_item); + raw_buf += item_len; + } + + if (g_slist_length(data->prints) == 0) { + fp_print_data_free(data); + data = NULL; + } + + return data; + +} + /** \ingroup print_data * Load a stored print from a data buffer. The contents of said buffer must * be the untouched contents of a buffer previously supplied to you by the @@ -157,24 +257,21 @@ API_EXPORTED size_t fp_print_data_get_data(struct fp_print_data *data, API_EXPORTED struct fp_print_data *fp_print_data_from_data(unsigned char *buf, size_t buflen) { - struct fpi_print_data_fp1 *raw = (struct fpi_print_data_fp1 *) buf; - size_t print_data_len; - struct fp_print_data *data; + struct fpi_print_data_fp2 *raw = (struct fpi_print_data_fp2 *) buf; fp_dbg("buffer size %zd", buflen); if (buflen < sizeof(*raw)) return NULL; - if (strncmp(raw->prefix, "FP1", 3) != 0) { + if (strncmp(raw->prefix, "FP1", 3) == 0) { + return fpi_print_data_from_fp1_data(buf, buflen); + } else if (strncmp(raw->prefix, "FP2", 3) == 0) { + return fpi_print_data_from_fp2_data(buf, buflen); + } else { fp_dbg("bad header prefix"); - return NULL; } - print_data_len = buflen - sizeof(*raw); - data = print_data_new(GUINT16_FROM_LE(raw->driver_id), - GUINT32_FROM_LE(raw->devtype), raw->data_type, print_data_len); - memcpy(data->data, raw->data, print_data_len); - return data; + return NULL; } static char *get_path_to_storedir(uint16_t driver_id, uint32_t devtype) @@ -405,6 +502,8 @@ API_EXPORTED int fp_print_data_from_dscv_print(struct fp_dscv_print *print, */ API_EXPORTED void fp_print_data_free(struct fp_print_data *data) { + if (data) + g_slist_free_full(data->prints, (GDestroyNotify)fpi_print_data_item_free); g_free(data); } diff --git a/libfprint/drivers/upeke2.c b/libfprint/drivers/upeke2.c index 83fe93f7..f6852058 100644 --- a/libfprint/drivers/upeke2.c +++ b/libfprint/drivers/upeke2.c @@ -1072,6 +1072,7 @@ static void e_handle_resp02(struct fp_dev *dev, unsigned char *data, size_t data_len) { struct fp_print_data *fdata = NULL; + struct fp_print_data_item *item = NULL; int result = -EPROTO; if (data_len < sizeof(scan_comp)) { @@ -1080,9 +1081,11 @@ static void e_handle_resp02(struct fp_dev *dev, unsigned char *data, fp_err("unrecognised data prefix %x %x %x %x %x", data[0], data[1], data[2], data[3], data[4]); } else { - fdata = fpi_print_data_new(dev, data_len - sizeof(scan_comp)); - memcpy(fdata->data, data + sizeof(scan_comp), + fdata = fpi_print_data_new(dev); + item = fpi_print_data_item_new(data_len - sizeof(scan_comp)); + memcpy(item->data, data + sizeof(scan_comp), data_len - sizeof(scan_comp)); + fdata->prints = g_slist_prepend(fdata->prints, item); result = FP_ENROLL_COMPLETE; } @@ -1244,12 +1247,13 @@ static void verify_start_sm_run_state(struct fpi_ssm *ssm) break; case VERIFY_INIT: ; struct fp_print_data *print = dev->verify_data; - size_t data_len = sizeof(verify_hdr) + print->length; + struct fp_print_data_item *item = print->prints->data; + size_t data_len = sizeof(verify_hdr) + item->length; unsigned char *data = g_malloc(data_len); struct libusb_transfer *transfer; memcpy(data, verify_hdr, sizeof(verify_hdr)); - memcpy(data + sizeof(verify_hdr), print->data, print->length); + memcpy(data + sizeof(verify_hdr), item->data, item->length); transfer = alloc_send_cmd28_transfer(dev, 0x03, data, data_len, verify_init_2803_cb, ssm); g_free(data); diff --git a/libfprint/drivers/upekts.c b/libfprint/drivers/upekts.c index b347949b..c191a2dd 100644 --- a/libfprint/drivers/upekts.c +++ b/libfprint/drivers/upekts.c @@ -1077,6 +1077,7 @@ static void e_handle_resp02(struct fp_dev *dev, unsigned char *data, size_t data_len) { struct fp_print_data *fdata = NULL; + struct fp_print_data_item *item = NULL; int result = -EPROTO; if (data_len < sizeof(scan_comp)) { @@ -1085,9 +1086,11 @@ static void e_handle_resp02(struct fp_dev *dev, unsigned char *data, fp_err("unrecognised data prefix %x %x %x %x %x", data[0], data[1], data[2], data[3], data[4]); } else { - fdata = fpi_print_data_new(dev, data_len - sizeof(scan_comp)); - memcpy(fdata->data, data + sizeof(scan_comp), + fdata = fpi_print_data_new(dev); + item = fpi_print_data_item_new(data_len - sizeof(scan_comp)); + memcpy(item->data, data + sizeof(scan_comp), data_len - sizeof(scan_comp)); + fdata->prints = g_slist_prepend(fdata->prints, item); result = FP_ENROLL_COMPLETE; } @@ -1249,12 +1252,13 @@ static void verify_start_sm_run_state(struct fpi_ssm *ssm) break; case VERIFY_INIT: ; struct fp_print_data *print = dev->verify_data; - size_t data_len = sizeof(verify_hdr) + print->length; + struct fp_print_data_item *item = print->prints->data; + size_t data_len = sizeof(verify_hdr) + item->length; unsigned char *data = g_malloc(data_len); struct libusb_transfer *transfer; memcpy(data, verify_hdr, sizeof(verify_hdr)); - memcpy(data + sizeof(verify_hdr), print->data, print->length); + memcpy(data + sizeof(verify_hdr), item->data, item->length); transfer = alloc_send_cmd28_transfer(dev, 0x03, data, data_len, verify_init_2803_cb, ssm); g_free(data); diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h index 42d38f1e..8af02828 100644 --- a/libfprint/fp_internal.h +++ b/libfprint/fp_internal.h @@ -179,7 +179,9 @@ struct fp_img_dev { int action_state; struct fp_print_data *acquire_data; + struct fp_print_data *enroll_data; struct fp_img *acquire_img; + int enroll_stage; int action_result; /* FIXME: better place to put this? */ @@ -325,15 +327,19 @@ enum fp_print_data_type { PRINT_DATA_NBIS_MINUTIAE, }; -struct fp_print_data { - uint16_t driver_id; - uint32_t devtype; - enum fp_print_data_type type; +struct fp_print_data_item { size_t length; unsigned char data[0]; }; -struct fpi_print_data_fp1 { +struct fp_print_data { + uint16_t driver_id; + uint32_t devtype; + enum fp_print_data_type type; + GSList *prints; +}; + +struct fpi_print_data_fp2 { char prefix[3]; uint16_t driver_id; uint32_t devtype; @@ -341,8 +347,14 @@ struct fpi_print_data_fp1 { unsigned char data[0]; } __attribute__((__packed__)); +struct fpi_print_data_item_fp2 { + uint32_t length; + unsigned char data[0]; +} __attribute__((__packed__)); + void fpi_data_exit(void); -struct fp_print_data *fpi_print_data_new(struct fp_dev *dev, size_t length); +struct fp_print_data *fpi_print_data_new(struct fp_dev *dev); +struct fp_print_data_item *fpi_print_data_item_new(size_t length); gboolean fpi_print_data_compatible(uint16_t driver_id1, uint32_t devtype1, enum fp_print_data_type type1, uint16_t driver_id2, uint32_t devtype2, enum fp_print_data_type type2); diff --git a/libfprint/img.c b/libfprint/img.c index b1d32edc..3c91d93f 100644 --- a/libfprint/img.c +++ b/libfprint/img.c @@ -313,6 +313,7 @@ int fpi_img_to_print_data(struct fp_img_dev *imgdev, struct fp_img *img, struct fp_print_data **ret) { struct fp_print_data *print; + struct fp_print_data_item *item; int r; if (!img->minutiae) { @@ -327,9 +328,11 @@ int fpi_img_to_print_data(struct fp_img_dev *imgdev, struct fp_img *img, /* FIXME: space is wasted if we dont hit the max minutiae count. would * be good to make this dynamic. */ - print = fpi_print_data_new(imgdev->dev, sizeof(struct xyt_struct)); + print = fpi_print_data_new(imgdev->dev); + item = fpi_print_data_item_new(sizeof(struct xyt_struct)); print->type = PRINT_DATA_NBIS_MINUTIAE; - minutiae_to_xyt(img->minutiae, img->width, img->height, print->data); + minutiae_to_xyt(img->minutiae, img->width, img->height, item->data); + print->prints = g_slist_prepend(print->prints, item); /* FIXME: the print buffer at this point is endian-specific, and will * only work when loaded onto machines with identical endianness. not good! @@ -342,42 +345,73 @@ int fpi_img_to_print_data(struct fp_img_dev *imgdev, struct fp_img *img, int fpi_img_compare_print_data(struct fp_print_data *enrolled_print, struct fp_print_data *new_print) { - struct xyt_struct *gstruct = (struct xyt_struct *) enrolled_print->data; - struct xyt_struct *pstruct = (struct xyt_struct *) new_print->data; - GTimer *timer; - int r; + int score, max_score = 0, probe_len; + struct xyt_struct *pstruct = NULL; + struct xyt_struct *gstruct = NULL; + struct fp_print_data_item *data_item; + GSList *list_item; if (enrolled_print->type != PRINT_DATA_NBIS_MINUTIAE || - new_print->type != PRINT_DATA_NBIS_MINUTIAE) { + new_print->type != PRINT_DATA_NBIS_MINUTIAE) { fp_err("invalid print format"); return -EINVAL; } - timer = g_timer_new(); - r = bozorth_main(pstruct, gstruct); - g_timer_stop(timer); - fp_dbg("bozorth processing took %f seconds, score=%d", - g_timer_elapsed(timer, NULL), r); - g_timer_destroy(timer); + if (g_slist_length(new_print->prints) != 1) { + fp_err("new_print contains more than one sample, is it enrolled print?"); + return -EINVAL; + } - return r; + data_item = new_print->prints->data; + pstruct = (struct xyt_struct *)data_item->data; + + probe_len = bozorth_probe_init(pstruct); + list_item = enrolled_print->prints; + do { + data_item = list_item->data; + gstruct = (struct xyt_struct *)data_item->data; + score = bozorth_to_gallery(probe_len, pstruct, gstruct); + fp_dbg("score %d", score); + max_score = max(score, max_score); + list_item = g_slist_next(list_item); + } while (list_item); + + return max_score; } int fpi_img_compare_print_data_to_gallery(struct fp_print_data *print, struct fp_print_data **gallery, int match_threshold, size_t *match_offset) { - struct xyt_struct *pstruct = (struct xyt_struct *) print->data; + struct xyt_struct *pstruct; + struct xyt_struct *gstruct; struct fp_print_data *gallery_print; - int probe_len = bozorth_probe_init(pstruct); + struct fp_print_data_item *data_item; + int probe_len; size_t i = 0; + int r; + GSList *list_item; + if (g_slist_length(print->prints) != 1) { + fp_err("new_print contains more than one sample, is it enrolled print?"); + return -EINVAL; + } + + data_item = print->prints->data; + pstruct = (struct xyt_struct *)data_item->data; + + probe_len = bozorth_probe_init(pstruct); while ((gallery_print = gallery[i++])) { - struct xyt_struct *gstruct = (struct xyt_struct *) gallery_print->data; - int r = bozorth_to_gallery(probe_len, pstruct, gstruct); - if (r >= match_threshold) { - *match_offset = i - 1; - return FP_VERIFY_MATCH; - } + list_item = gallery_print->prints; + do { + data_item = list_item->data; + gstruct = (struct xyt_struct *)data_item->data; + r = bozorth_to_gallery(probe_len, pstruct, gstruct); + if (r >= match_threshold) { + *match_offset = i - 1; + return FP_VERIFY_MATCH; + } + list_item = g_slist_next(list_item); + } while (list_item); } return FP_VERIFY_NO_MATCH; } diff --git a/libfprint/imgdev.c b/libfprint/imgdev.c index f83ea11b..f960ee34 100644 --- a/libfprint/imgdev.c +++ b/libfprint/imgdev.c @@ -25,6 +25,7 @@ #define MIN_ACCEPTABLE_MINUTIAE 10 #define BOZORTH3_DEFAULT_THRESHOLD 40 +#define IMG_ENROLL_STAGES 5 static int img_dev_open(struct fp_dev *dev, unsigned long driver_data) { @@ -33,8 +34,9 @@ static int img_dev_open(struct fp_dev *dev, unsigned long driver_data) int r = 0; imgdev->dev = dev; + imgdev->enroll_stage = 0; dev->priv = imgdev; - dev->nr_enroll_stages = 1; + dev->nr_enroll_stages = IMG_ENROLL_STAGES; /* for consistency in driver code, allow udev access through imgdev */ imgdev->udev = dev->udev; @@ -144,7 +146,13 @@ void fpi_imgdev_report_finger_status(struct fp_img_dev *imgdev, switch (imgdev->action) { case IMG_ACTION_ENROLL: fp_dbg("reporting enroll result"); - fpi_drvcb_enroll_stage_completed(imgdev->dev, r, data, img); + data = imgdev->enroll_data; + if (r == FP_ENROLL_COMPLETE) { + imgdev->enroll_data = NULL; + } + fpi_drvcb_enroll_stage_completed(imgdev->dev, r, + r == FP_ENROLL_COMPLETE ? data : NULL, + img); /* the callback can cancel enrollment, so recheck current * action and the status to see if retry is needed */ if (imgdev->action == IMG_ACTION_ENROLL && @@ -253,7 +261,22 @@ void fpi_imgdev_image_captured(struct fp_img_dev *imgdev, struct fp_img *img) imgdev->acquire_data = print; switch (imgdev->action) { case IMG_ACTION_ENROLL: - imgdev->action_result = FP_ENROLL_COMPLETE; + if (!imgdev->enroll_data) { + imgdev->enroll_data = fpi_print_data_new(imgdev->dev); + } + BUG_ON(g_slist_length(print->prints) != 1); + /* Move print data from acquire data into enroll_data */ + imgdev->enroll_data->prints = + g_slist_prepend(imgdev->enroll_data->prints, print->prints->data); + print->prints = g_slist_remove(print->prints, print->prints->data); + + fp_print_data_free(imgdev->acquire_data); + imgdev->acquire_data = NULL; + imgdev->enroll_stage++; + if (imgdev->enroll_stage == imgdev->dev->nr_enroll_stages) + imgdev->action_result = FP_ENROLL_COMPLETE; + else + imgdev->action_result = FP_ENROLL_PASS; break; case IMG_ACTION_VERIFY: verify_process_img(imgdev); @@ -402,6 +425,7 @@ static int generic_acquire_start(struct fp_dev *dev, int action) fp_dbg("action %d", action); imgdev->action = action; imgdev->action_state = IMG_ACQUIRE_STATE_ACTIVATING; + imgdev->enroll_stage = 0; r = dev_activate(imgdev, IMGDEV_STATE_AWAIT_FINGER_ON); if (r < 0) @@ -417,8 +441,10 @@ static void generic_acquire_stop(struct fp_img_dev *imgdev) dev_deactivate(imgdev); fp_print_data_free(imgdev->acquire_data); + fp_print_data_free(imgdev->enroll_data); fp_img_free(imgdev->acquire_img); imgdev->acquire_data = NULL; + imgdev->enroll_data = NULL; imgdev->acquire_img = NULL; imgdev->action_result = 0; } From e1728e7c25d6bd3fdbebf5bc9cc2040cf9063979 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Mon, 18 Feb 2013 13:41:13 +0300 Subject: [PATCH 08/19] aes1660: remove unneeded lowering of bz3_threshold Since 5 scans for enroll was introduced it's not necessary to lower bz3_threshold anymore, there's a good probability that scan to verify matches with at least one enrolled sample. --- libfprint/drivers/aes1660.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/libfprint/drivers/aes1660.c b/libfprint/drivers/aes1660.c index 250ca52d..d9ddc809 100644 --- a/libfprint/drivers/aes1660.c +++ b/libfprint/drivers/aes1660.c @@ -104,12 +104,6 @@ struct fp_img_driver aes1660_driver = { .img_height = -1, .img_width = FRAME_WIDTH * SCALE_FACTOR, - /* temporarily lowered until we sort out image processing code - * binarized scan quality is good, minutiae detection is accurate, - * it's just that we get fewer minutiae than other scanners (less scanning - * area) */ - .bz3_threshold = 25, - .open = dev_init, .close = dev_deinit, .activate = aesX660_dev_activate, From e278e8321cb91bcbf577d05778fe6553a14b4f14 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Mon, 18 Feb 2013 14:37:48 +0300 Subject: [PATCH 09/19] vfs301: drop nr_enroll_stages override Imaging drivers aren't allowed to change number of enroll stages anymore, all that imaging driver does is providing image to the upper layer. Upper layer decides if it needs more scans. --- libfprint/drivers/vfs301.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/libfprint/drivers/vfs301.c b/libfprint/drivers/vfs301.c index c0e36123..04db05ec 100644 --- a/libfprint/drivers/vfs301.c +++ b/libfprint/drivers/vfs301.c @@ -244,9 +244,6 @@ static int dev_open(struct fp_img_dev *dev, unsigned long driver_data) return r; } - /* Set enroll stage number */ - dev->dev->nr_enroll_stages = 1; - /* Initialize private structure */ vdev = g_malloc0(sizeof(vfs301_dev_t)); dev->priv = vdev; From e0966cb20fb7cf1c9ee8165428f5d3810e2e8c4e Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Mon, 4 Mar 2013 17:50:54 +0300 Subject: [PATCH 10/19] vfs101: drop nr_enroll_stages override Imaging drivers aren't allowed to change number of enroll stages anymore, all that imaging driver does is providing image to the upper layer. Upper layer decides if it needs more scans. --- libfprint/drivers/vfs101.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/libfprint/drivers/vfs101.c b/libfprint/drivers/vfs101.c index 95e654f4..db0b06ef 100644 --- a/libfprint/drivers/vfs101.c +++ b/libfprint/drivers/vfs101.c @@ -64,9 +64,6 @@ /* Best image contrast */ #define VFS_IMG_BEST_CONRAST 128 -/* Number of enroll stages */ -#define VFS_NR_ENROLL 3 - /* Device parameters address */ #define VFS_PAR_000E 0x000e #define VFS_PAR_0011 0x0011 @@ -656,7 +653,7 @@ static int action_completed(struct fp_img_dev *dev) struct vfs101_dev *vdev = dev->priv; if ((dev->action == IMG_ACTION_ENROLL) && - (vdev->enroll_stage < VFS_NR_ENROLL)) + (vdev->enroll_stage < 1)) /* Enroll not completed, return false */ return FALSE; @@ -1511,9 +1508,6 @@ static int dev_open(struct fp_img_dev *dev, unsigned long driver_data) return r; } - /* Set enroll stage number */ - dev->dev->nr_enroll_stages = VFS_NR_ENROLL; - /* Initialize private structure */ vdev = g_malloc0(sizeof(struct vfs101_dev)); vdev->seqnum = -1; From a6101026d2ddff76efe9f46669e24db3a0a6a0e4 Mon Sep 17 00:00:00 2001 From: Patrick Marlier Date: Wed, 12 Dec 2012 20:43:09 +0100 Subject: [PATCH 11/19] Add EgisTec ES603 driver This driver handles EgisTec ES603 device, ID 1c7a:0603 --- configure.ac | 13 +- libfprint/Makefile.am | 6 + libfprint/core.c | 3 + libfprint/drivers/driver_ids.h | 1 + libfprint/drivers/etes603.c | 1513 ++++++++++++++++++++++++++++++++ libfprint/fp_internal.h | 3 + 6 files changed, 1538 insertions(+), 1 deletion(-) create mode 100644 libfprint/drivers/etes603.c diff --git a/configure.ac b/configure.ac index 65ae69b7..4fbaad82 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ AC_SUBST(lt_major) AC_SUBST(lt_revision) AC_SUBST(lt_age) -all_drivers="upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes3500 aes4000 vfs101 vfs301 upektc_img" +all_drivers="upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes3500 aes4000 vfs101 vfs301 upektc_img etes603" require_imaging='no' require_aeslib='no' @@ -46,6 +46,7 @@ enable_aes4000='no' enable_vfs101='no' enable_vfs301='no' enable_upektc_img='no' +enable_etes603='no' AC_ARG_WITH([drivers],[AS_HELP_STRING([--with-drivers], [List of drivers to enable])], @@ -140,6 +141,10 @@ for driver in `echo ${drivers} | sed -e 's/,/ /g' -e 's/,$//g'`; do AC_DEFINE([ENABLE_UPEKTC_IMG], [], [Build Upek TouchChip Fingerprint Coprocessor driver]) enable_upektc_img="yes" ;; + etes603) + AC_DEFINE([ENABLE_ETES603], [], [Build EgisTec ES603 driver]) + enable_etes603="yes" + ;; esac done @@ -163,6 +168,7 @@ AM_CONDITIONAL([REQUIRE_AES3K], [test "$require_aes3k" = "yes"]) AM_CONDITIONAL([ENABLE_VFS101], [test "$enable_vfs101" = "yes"]) AM_CONDITIONAL([ENABLE_VFS301], [test "$enable_vfs301" = "yes"]) AM_CONDITIONAL([ENABLE_UPEKTC_IMG], [test "$enable_upektc_img" = "yes"]) +AM_CONDITIONAL([ENABLE_ETES603], [test "$enable_etes603" = "yes"]) PKG_CHECK_MODULES(LIBUSB, [libusb-1.0 >= 0.9.1]) @@ -384,6 +390,11 @@ if test x$enable_upektc_img != xno ; then else AC_MSG_NOTICE([ upektc_img driver disabled]) fi +if test x$enable_etes603 != xno ; then + AC_MSG_NOTICE([** etes603 driver enabled]) +else + AC_MSG_NOTICE([ etes603 driver disabled]) +fi if test x$require_aeslib != xno ; then AC_MSG_NOTICE([** aeslib helper functions enabled]) else diff --git a/libfprint/Makefile.am b/libfprint/Makefile.am index 2d2c8908..7ceb90de 100644 --- a/libfprint/Makefile.am +++ b/libfprint/Makefile.am @@ -19,6 +19,7 @@ VCOM5S_SRC = drivers/vcom5s.c VFS101_SRC = drivers/vfs101.c VFS301_SRC = drivers/vfs301.c drivers/vfs301_proto.c drivers/vfs301_proto.h drivers/vfs301_proto_fragments.h UPEKTC_IMG_SRC = drivers/upektc_img.c drivers/upektc_img.h +ETES603_SRC = drivers/etes603.c EXTRA_DIST = \ $(UPEKE2_SRC) \ @@ -38,6 +39,7 @@ EXTRA_DIST = \ $(VFS101_SRC) \ $(VFS301_SRC) \ $(UPEKTC_IMG_SRC) \ + $(ETES603_SRC) \ drivers/aesx660.c \ drivers/aesx660.h \ drivers/aes3k.c \ @@ -171,6 +173,10 @@ if ENABLE_UPEKTC_IMG DRIVER_SRC += $(UPEKTC_IMG_SRC) endif +if ENABLE_ETES603 +DRIVER_SRC += $(ETES603_SRC) +endif + if REQUIRE_IMAGEMAGICK OTHER_SRC += imagemagick.c libfprint_la_CFLAGS += $(IMAGING_CFLAGS) diff --git a/libfprint/core.c b/libfprint/core.c index bf46826c..cde8f488 100644 --- a/libfprint/core.c +++ b/libfprint/core.c @@ -392,6 +392,9 @@ static struct fp_img_driver * const img_drivers[] = { #ifdef ENABLE_UPEKTC_IMG &upektc_img_driver, #endif +#ifdef ENABLE_ETES603 + &etes603_driver, +#endif /*#ifdef ENABLE_FDU2000 &fdu2000_driver, #endif diff --git a/libfprint/drivers/driver_ids.h b/libfprint/drivers/driver_ids.h index fde2512c..b3c6ee6f 100644 --- a/libfprint/drivers/driver_ids.h +++ b/libfprint/drivers/driver_ids.h @@ -38,6 +38,7 @@ enum { AES2660_ID = 15, AES3500_ID = 16, UPEKTC_IMG_ID = 17, + ETES603_ID = 18, }; #endif diff --git a/libfprint/drivers/etes603.c b/libfprint/drivers/etes603.c new file mode 100644 index 00000000..aae0f0f4 --- /dev/null +++ b/libfprint/drivers/etes603.c @@ -0,0 +1,1513 @@ +/* + * EgisTec ES603 driver for libfprint + * Copyright (C) 2012 Patrick Marlier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* EgisTec ES603 device information + * Sensor area: 192 x 4 pixels + * Sensor gray: 16 gray levels/sensor pixel + * Sensor resolution: 508 dpi + * USB Manufacturer ID: 1C7A + * USB Product ID: 0603 + * + * Possible compatibility LTT-SS500/SS501 + * + * Extra features not present in this driver (see https://code.google.com/p/etes603): + * Tuning of DTVRT for contact detection + * Contact detection via capacitance + * Capture mode using assembled frames (usually better quality) + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#define FP_COMPONENT "etes603" +#include +#include "driver_ids.h" + +/* libusb defines */ +#define EP_IN 0x81 +#define EP_OUT 0x02 +/* Note that 1000 ms is usually enough but with CMD_READ_FE could be longer + * since the sensor is waiting motion. */ +#define BULK_TIMEOUT 1000 + +/* es603 defines */ +#define FRAME_WIDTH 192 /* pixels per row */ +#define FRAME_HEIGHT 4 /* number of rows */ +#define FRAME_SIZE 384 /* size in bytes (4 bits per pixels) */ +#define FE_WIDTH 256 /* pixels per row for Fly-Estimation */ +#define FE_HEIGHT 500 /* number of rows for Fly-Estimation */ +#define FE_SIZE 64000 /* size in bytes (4 bits per pixels) */ + +#define GAIN_SMALL_INIT 0x23 /* Initial small gain */ +#define VRT_MAX 0x3F /* Maximum value for VRT */ +#define VRB_MAX 0x3A /* Maximum value for VRB */ +#define DTVRT_MAX 0x3A /* Maximum value for DTVRT */ +#define DCOFFSET_MIN 0x00 /* Minimum value for DCoffset */ +#define DCOFFSET_MAX 0x35 /* Maximum value for DCoffset */ + +/* es603 commands */ +#define CMD_READ_REG 0x01 +#define CMD_WRITE_REG 0x02 +#define CMD_READ_FRAME 0x03 /* Read the sensor area */ +#define CMD_READ_FE 0x06 /* Read a fingerprint using Fly-Estimation */ +#define CMD_20 0x20 /* ? */ +#define CMD_25 0x25 /* ? */ +#define CMD_60 0x60 /* ? */ + +#define CMD_OK 0x01 /* Command successfully executed */ + +/* es603 registers */ +#define REG_MAX 0x18 /* Maximum number of registers in one message */ +#define REG_MODE_CONTROL 0x02 /* Mode control */ +#define REG_03 0x03 /* Contact register? */ +#define REG_04 0x04 /* ? */ +#define REG_10 0x10 /* MVS FRMBUF control */ +#define REG_1A 0x1A /* ? */ +/* BEGIN init sensor */ +#define REG_20 0x20 /* (def: 0x00) */ +#define REG_21 0x21 /* Small gain (def: 0x23) */ +#define REG_22 0x22 /* Normal gain (def: 0x21) */ +#define REG_23 0x23 /* Large gain (def: 0x20) */ +#define REG_24 0x24 /* (def: 0x14) */ +#define REG_25 0x25 /* (def: 0x6A) */ +#define REG_26 0x26 /* VRB again? (def: 0x00) */ +#define REG_27 0x27 /* VRT again? (def: 0x00) */ +#define REG_28 0x28 /* (def: 0x00) */ +#define REG_29 0x29 /* (def: 0xC0) */ +#define REG_2A 0x2A /* (def: 0x50) */ +#define REG_2B 0x2B /* (def: 0x50) */ +#define REG_2C 0x2C /* (def: 0x4D) */ +#define REG_2D 0x2D /* (def: 0x03) */ +#define REG_2E 0x2E /* (def: 0x06) */ +#define REG_2F 0x2F /* (def: 0x06) */ +#define REG_30 0x30 /* (def: 0x10) */ +#define REG_31 0x31 /* (def: 0x02) */ +#define REG_32 0x32 /* (def: 0x14) */ +#define REG_33 0x33 /* (def: 0x34) */ +#define REG_34 0x34 /* (def: 0x01) */ +#define REG_35 0x35 /* (def: 0x08) */ +#define REG_36 0x36 /* (def: 0x03) */ +#define REG_37 0x37 /* (def: 0x21) */ +/* END init sensor */ + +#define REG_ENC1 0x41 /* Encryption 1 */ +#define REG_ENC2 0x42 +#define REG_ENC3 0x43 +#define REG_ENC4 0x44 +#define REG_ENC5 0x45 +#define REG_ENC6 0x46 +#define REG_ENC7 0x47 +#define REG_ENC8 0x48 /* Encryption 8 */ + +#define REG_50 0x50 /* ? For contact detection */ +#define REG_51 0x51 /* ? */ +#define REG_59 0x59 /* ? */ +#define REG_5A 0x5A /* ? */ +#define REG_5B 0x5B /* ? */ + +#define REG_INFO0 0x70 /* Sensor model byte0 */ +#define REG_INFO1 0x71 /* Sensor model byte1 */ +#define REG_INFO2 0x72 /* Sensor model byte2 */ +#define REG_INFO3 0x73 /* Sensor model byte3 */ + +#define REG_GAIN 0xE0 +#define REG_VRT 0xE1 +#define REG_VRB 0xE2 +#define REG_DTVRT 0xE3 /* used for contact detection */ +#define REG_VCO_CONTROL 0xE5 /* 0x13 (IDLE?), 0x14 (REALTIME) */ +#define REG_DCOFFSET 0xE6 + +#define REG_F0 0xF0 /* ? init:0x00 close:0x01 */ +#define REG_F2 0xF2 /* ? init:0x00 close:0x4E */ + +#define REG_MODE_SLEEP 0x30 /* Sleep mode */ +#define REG_MODE_CONTACT 0x31 /* Contact mode */ +#define REG_MODE_SENSOR 0x33 /* Sensor mode */ +#define REG_MODE_FP 0x34 /* FingerPrint mode (Fly-Estimation®) */ + +#define REG_VCO_IDLE 0x13 +#define REG_VCO_RT 0x14 /* Realtime */ + +/* The size of the message header is 5 plus 1 for the command. */ +#define MSG_HDR_SIZE 6 + +/* This structure must be packed because it is a the raw message sent. */ +struct egis_msg { + uint8_t magic[5]; /* out: 'EGIS' 0x09 / in: 'SIGE' 0x0A */ + uint8_t cmd; + union { + struct { + uint8_t nb; + uint8_t regs[REG_MAX]; + } egis_readreg; + struct { + uint8_t regs[REG_MAX]; + } sige_readreg; + struct { + uint8_t nb; + struct { + uint8_t reg; + uint8_t val; + } regs[REG_MAX]; + } egis_writereg; + struct { + uint8_t length_factor; + uint8_t length; + uint8_t use_gvv; + uint8_t gain; + uint8_t vrt; + uint8_t vrb; + } egis_readf; + struct { + uint8_t len[2]; + uint8_t val[3]; + } egis_readfp; + struct { + uint8_t val[5]; + } sige_misc; + uint8_t padding[0x40-6]; /* Ensure size of 0x40 */ + }; +} __attribute__((packed)); + + +/* Structure to keep information between asynchronous functions. */ +struct etes603_dev { + uint8_t regs[256]; + struct egis_msg *req; + size_t req_len; + struct egis_msg *ans; + size_t ans_len; + + uint8_t *fp; + uint16_t fp_height; + + uint8_t tunedc_min; + uint8_t tunedc_max; + + /* Device parameters */ + uint8_t gain; + uint8_t dcoffset; + uint8_t vrt; + uint8_t vrb; + + unsigned int is_active; +}; + +static void m_start_fingerdetect(struct fp_img_dev *idev); +/* + * Prepare the header of the message to be sent to the device. + */ +static void msg_header_prepare(struct egis_msg *msg) +{ + msg->magic[0] = 'E'; + msg->magic[1] = 'G'; + msg->magic[2] = 'I'; + msg->magic[3] = 'S'; + msg->magic[4] = 0x09; +} + +/* + * Check that the header of the received message is correct. + */ +static int msg_header_check(struct egis_msg *msg) +{ + if (msg->magic[0] == 'S' && msg->magic[1] == 'I' + && msg->magic[2] == 'G' && msg->magic[3] == 'E' + && msg->magic[4] == 0x0A) + return 0; + return -1; +} + +/* + * Prepare message to ask for a frame. + */ +static void msg_get_frame(struct etes603_dev *dev, + uint8_t use_gvv, uint8_t gain, uint8_t vrt, uint8_t vrb) +{ + struct egis_msg *msg = dev->req; + msg_header_prepare(msg); + msg->cmd = CMD_READ_FRAME; + msg->egis_readf.length_factor = 0x01; + /* length should be 0xC0 */ + msg->egis_readf.length = FRAME_WIDTH; + msg->egis_readf.use_gvv = use_gvv; + /* if use_gvv is set, gain/vrt/vrb are used */ + msg->egis_readf.gain = gain; + msg->egis_readf.vrt = vrt; + msg->egis_readf.vrb = vrb; + + dev->req_len = MSG_HDR_SIZE + 6; + dev->ans_len = FRAME_SIZE; +} + +/* + * Prepare message to ask for a fingerprint frame. + */ +static void msg_get_fp(struct etes603_dev *dev, uint8_t len0, uint8_t len1, + uint8_t v2, uint8_t v3, uint8_t v4) +{ + struct egis_msg *msg = dev->req; + msg_header_prepare(msg); + msg->cmd = CMD_READ_FE; + /* Unknown values and always same on captured frames. + * 1st 2nd bytes is unsigned short for height, but only on value range + * 0x01 0xF4 (500), 0x02 0x00 (512), 0x02 0xF4 (756) are ok + */ + msg->egis_readfp.len[0] = len0; + msg->egis_readfp.len[1] = len1; + /* 3rd byte : ?? but changes frame size + * 4th byte : 0x00 -> can change width + * 5th byte : motion sensibility? + */ + msg->egis_readfp.val[0] = v2; + msg->egis_readfp.val[1] = v3; + msg->egis_readfp.val[2] = v4; + + dev->req_len = MSG_HDR_SIZE + 5; + dev->ans_len = FE_SIZE; +} + +/* + * Prepare message to read registers from the sensor. + * Variadic argument pattern: int reg, ... + */ +static void msg_get_regs(struct etes603_dev *dev, int n_args, ... ) +{ + struct egis_msg *msg = dev->req; + va_list ap; + int i; + + assert(n_args > 0 && n_args <= REG_MAX); + + msg_header_prepare(msg); + msg->cmd = CMD_READ_REG; + msg->egis_readreg.nb = n_args; + va_start(ap, n_args); + for (i = 0; i < n_args; i++) { + msg->egis_readreg.regs[i] = va_arg(ap, int); + } + va_end(ap); + + dev->req_len = MSG_HDR_SIZE + 1 + n_args; + dev->ans_len = MSG_HDR_SIZE + 1 + n_args; +} + +/* + * Parse the result of read register command. + */ +static int msg_parse_regs(struct etes603_dev *dev) +{ + size_t i, n_args; + struct egis_msg *msg_req = dev->req; + struct egis_msg *msg_ans = dev->ans; + n_args = dev->ans_len - MSG_HDR_SIZE; + + if (msg_header_check(msg_ans)) { + return -1; + } + if (msg_ans->cmd != CMD_OK) { + return -2; + } + + for (i = 0; i < n_args; i++) { + int reg = msg_req->egis_readreg.regs[i]; + dev->regs[reg] = msg_ans->sige_readreg.regs[i]; + } + return 0; +} + +/* + * Prepare message to write sensor's registers. + * Variadic arguments are: int reg, int val, ... + */ +static void msg_set_regs(struct etes603_dev *dev, int n_args, ...) +{ + struct egis_msg *msg = dev->req; + va_list ap; + int i; + + assert(n_args != 0 && n_args % 2 == 0 && n_args <= REG_MAX * 2); + + msg_header_prepare(msg); + msg->cmd = CMD_WRITE_REG; + msg->egis_writereg.nb = n_args / 2; + + va_start(ap, n_args); + for (i = 0; i < n_args / 2; i++) { + msg->egis_writereg.regs[i].reg = va_arg(ap, int); + msg->egis_writereg.regs[i].val = va_arg(ap, int); + } + va_end(ap); + + dev->req_len = MSG_HDR_SIZE + 1 + n_args; + dev->ans_len = MSG_HDR_SIZE + 1; +} + +static int msg_check_ok(struct etes603_dev *dev) +{ + struct egis_msg *msg = dev->ans; + if (msg_header_check(msg)) { + goto err; + } + if (msg->cmd != CMD_OK) { + goto err; + } + return 0; +err: + return -1; +} + +/* + * Check the model of the sensor. + */ +static int check_info(struct etes603_dev *dev) +{ + if (dev->regs[0x70] == 0x4A && dev->regs[0x71] == 0x44 + && dev->regs[0x72] == 0x49 && dev->regs[0x73] == 0x31) + return 0; + fp_err("unknown device parameters (REG_70:%02X REG_71:%02X " + "REG_FIRMWARE:%02X REG_VERSION:%02X)", + dev->regs[0x70], dev->regs[0x71], dev->regs[0x72], + dev->regs[0x73]); + return -1; +} + +static void msg_get_cmd20(struct etes603_dev *dev) +{ + struct egis_msg *msg = dev->req; + msg_header_prepare(msg); + msg->cmd = CMD_20; + dev->req_len = MSG_HDR_SIZE; +} + +static int msg_check_cmd20(struct etes603_dev *dev) +{ + struct egis_msg *msg = dev->ans; + if (msg_header_check(msg)) { + fp_err("msg_header_check failed"); + return -1; + } + /* status or flashtype/flashinfo or ? */ + if (msg->cmd != 0x05 + || msg->sige_misc.val[0] != 0x00 + || msg->sige_misc.val[1] != 0x00) { + fp_warn("unexpected answer CMD_20 from device(%02X %02X %02X)", + msg->cmd, msg->sige_misc.val[0], msg->sige_misc.val[1]); + } + + return 0; +} + +static void msg_get_cmd25(struct etes603_dev *dev) +{ + struct egis_msg *msg = dev->req; + msg_header_prepare(msg); + msg->cmd = CMD_25; + dev->req_len = MSG_HDR_SIZE; +} + +static int msg_check_cmd25(struct etes603_dev *dev) +{ + struct egis_msg *msg = dev->ans; + if (msg_header_check(msg)) { + fp_err("msg_header_check failed"); + goto err; + } + if (msg->cmd != CMD_OK) { + fp_err("CMD_OK failed"); + goto err; + } + /* flashtype or status or ? */ + if (msg->sige_misc.val[0] != 0x00) { + fp_warn("unexpected answer for CMD_25 (%02X)", + msg->sige_misc.val[0]); + } + return 0; +err: + return -1; +} + +static void msg_set_mode_control(struct etes603_dev *dev, uint8_t mode) +{ + msg_set_regs(dev, 2, REG_MODE_CONTROL, mode); +} + + +/* Processing functions */ + +/* + * Return the brightness of a 4bpp frame + */ +static unsigned int process_get_brightness(uint8_t *f, size_t s) +{ + unsigned int i, sum = 0; + for (i = 0; i < s; i++) { + sum += f[i] >> 4; + sum += f[i] & 0x0F; + } + return sum; +} + +/* + * Return the histogram of a 4bpp frame + */ +static void process_hist(uint8_t *f, size_t s, float stat[5]) +{ + float hist[16]; + float black_mean, white_mean; + int i; + /* Clean histogram */ + for (i = 0; i < 16; i++) + hist[i] = 0.0; + for (i = 0; i < s; i++) { + hist[f[i] >> 4]++; + hist[f[i] & 0x0F]++; + } + /* histogram average */ + for (i = 0; i < 16; i++) { + hist[i] = hist[i] / (s * 2); + } + /* Average black/white pixels (full black and full white pixels + * are excluded). */ + black_mean = white_mean = 0.0; + for (i = 1; i < 8; i++) + black_mean += hist[i]; + for (i = 8; i < 15; i++) + white_mean += hist[i]; + stat[0] = hist[0]; + stat[1] = black_mean; + stat[2] = black_mean+white_mean; + stat[3] = white_mean; + stat[4] = hist[15]; + fp_dbg("fullb=%6f black=%6f grey=%6f white=%6f fullw=%6f", + hist[0], black_mean, black_mean+white_mean, white_mean, + hist[15]); +} + +/* + * Return true if the frame is almost empty. + */ +static int process_frame_empty(uint8_t *frame, size_t size) +{ + unsigned int sum = process_get_brightness(frame, size); + /* Allow an average of 'threshold' luminosity per pixel */ + if (sum < size) + return 1; + return 0; +} + +/* Transform 4 bits image to 8 bits image */ +static void process_4to8_bpp(uint8_t *input, unsigned int input_size, + uint8_t *output) +{ + unsigned int i, j = 0; + for (i = 0; i < input_size; i++, j += 2) { + /* 16 gray levels transform to 256 levels using << 4 */ + output[j] = input[i] & 0xF0; + output[j+1] = input[i] << 4; + } +} + +/* + * Remove duplicated lines at the end of a fingerprint. + */ +static void process_remove_fp_end(struct etes603_dev *dev) +{ + unsigned int i; + /* 2 last lines with Fly-Estimation are the empty pattern. */ + uint8_t *pattern = dev->fp + (dev->fp_height - 2) * FE_WIDTH / 2; + for (i = 2; i < dev->fp_height; i+= 2) { + if (memcmp(pattern, pattern - (i * FE_WIDTH / 2), FE_WIDTH)) + break; + } + dev->fp_height -= i; + fp_dbg("Removing %d empty lines from image", i - 2); +} + +static void reset_param(struct etes603_dev *dev) +{ + dev->dcoffset = 0; + dev->vrt = 0; + dev->vrb = 0; + dev->gain = 0; +} + + +/* Asynchronous stuff */ + +enum { + INIT_CHECK_INFO_REQ, + INIT_CHECK_INFO_ANS, + INIT_CMD20_REQ, + INIT_CMD20_ANS, + INIT_CMD25_REQ, + INIT_CMD25_ANS, + INIT_SENSOR_REQ, + INIT_SENSOR_ANS, + INIT_ENC_REQ, + INIT_ENC_ANS, + INIT_REGS_REQ, + INIT_REGS_ANS, + INIT_NUM_STATES +}; + +enum { + TUNEDC_INIT, + TUNEDC_SET_DCOFFSET_REQ, + TUNEDC_SET_DCOFFSET_ANS, + TUNEDC_GET_FRAME_REQ, + TUNEDC_GET_FRAME_ANS, + TUNEDC_FINAL_SET_REG2122_REQ, + TUNEDC_FINAL_SET_REG2122_ANS, + TUNEDC_FINAL_SET_GAIN_REQ, + TUNEDC_FINAL_SET_GAIN_ANS, + TUNEDC_FINAL_SET_DCOFFSET_REQ, + TUNEDC_FINAL_SET_DCOFFSET_ANS, + TUNEDC_NUM_STATES +}; + +enum { + TUNEVRB_INIT, + TUNEVRB_GET_GAIN_REQ, + TUNEVRB_GET_GAIN_ANS, + TUNEVRB_GET_DCOFFSET_REQ, + TUNEVRB_GET_DCOFFSET_ANS, + TUNEVRB_SET_DCOFFSET_REQ, + TUNEVRB_SET_DCOFFSET_ANS, + TUNEVRB_FRAME_REQ, + TUNEVRB_FRAME_ANS, + TUNEVRB_FINAL_SET_DCOFFSET_REQ, + TUNEVRB_FINAL_SET_DCOFFSET_ANS, + TUNEVRB_FINAL_SET_REG2627_REQ, + TUNEVRB_FINAL_SET_REG2627_ANS, + TUNEVRB_FINAL_SET_GAINVRTVRB_REQ, + TUNEVRB_FINAL_SET_GAINVRTVRB_ANS, + TUNEVRB_FINAL_SET_MODE_SLEEP_REQ, + TUNEVRB_FINAL_SET_MODE_SLEEP_ANS, + TUNEVRB_NUM_STATES +}; + +enum { + FGR_FPA_INIT_SET_MODE_SLEEP_REQ, + FGR_FPA_INIT_SET_MODE_SLEEP_ANS, + FGR_FPA_INIT_SET_DCOFFSET_REQ, + FGR_FPA_INIT_SET_DCOFFSET_ANS, + FGR_FPA_INIT_SET_GAINVRTVRB_REQ, + FGR_FPA_INIT_SET_GAINVRTVRB_ANS, + FGR_FPA_INIT_SET_VCO_CONTROL_RT_REQ, + FGR_FPA_INIT_SET_VCO_CONTROL_RT_ANS, + FGR_FPA_INIT_SET_REG04_REQ, + FGR_FPA_INIT_SET_REG04_ANS, + FGR_FPA_INIT_SET_MODE_SENSOR_REQ, + FGR_FPA_INIT_SET_MODE_SENSOR_ANS, + FGR_FPA_GET_FRAME_REQ, + FGR_FPA_GET_FRAME_ANS, + FGR_NUM_STATES +}; + +enum { + CAP_FP_INIT_SET_REG10_REQ, + CAP_FP_INIT_SET_REG10_ANS, + CAP_FP_INIT_SET_MODE_FP_REQ, + CAP_FP_INIT_SET_MODE_FP_ANS, + CAP_FP_GET_FP_REQ, + CAP_FP_GET_FP_ANS, + CAP_NUM_STATES +}; + +enum { + EXIT_SET_REGS_REQ, + EXIT_SET_REGS_ANS, + EXIT_NUM_STATES +}; + +static int async_tx(struct fp_img_dev *idev, unsigned int ep, void *cb, + void *cb_arg) +{ + struct etes603_dev *dev = idev->priv; + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + unsigned char *buffer; + int length; + + if (!transfer) + return -ENOMEM; + + if (ep == EP_OUT) { + buffer = (unsigned char *)dev->req; + length = dev->req_len; + } else if (ep == EP_IN) { + buffer = (unsigned char *)dev->ans; + length = dev->ans_len; + } else { + return -EIO; + } + libusb_fill_bulk_transfer(transfer, idev->udev, ep, buffer, length, + cb, cb_arg, BULK_TIMEOUT); + + if (libusb_submit_transfer(transfer)) { + libusb_free_transfer(transfer); + return -EIO; + } + return 0; +} + + +static void async_tx_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + struct fp_img_dev *idev = ssm->priv; + struct etes603_dev *dev = idev->priv; + + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + fp_warn("transfer is not completed (status=%d)", + transfer->status); + fpi_ssm_mark_aborted(ssm, -EIO); + libusb_free_transfer(transfer); + } else { + unsigned char endpoint = transfer->endpoint; + int actual_length = transfer->actual_length; + int length = transfer->length; + /* Freeing now transfer since fpi_ssm_* functions are not + * returning directly. */ + libusb_free_transfer(transfer); + if (endpoint == EP_OUT) { + if (length != actual_length) + fp_warn("length %d != actual_length %d", + length, actual_length); + /* Chained with the answer */ + if (async_tx(idev, EP_IN, async_tx_cb, ssm)) + fpi_ssm_mark_aborted(ssm, -EIO); + } else if (endpoint == EP_IN) { + dev->ans_len = actual_length; + fpi_ssm_next_state(ssm); + } + } +} + +static void m_exit_state(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + struct etes603_dev *dev = idev->priv; + + switch (ssm->cur_state) { + case EXIT_SET_REGS_REQ: + msg_set_regs(dev, 4, REG_VCO_CONTROL, REG_VCO_IDLE, + REG_MODE_CONTROL, REG_MODE_SLEEP); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case EXIT_SET_REGS_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_mark_completed(ssm); + break; + default: + fp_err("Unknown state %d", ssm->cur_state); + goto err; + break; + } + + return; +err: + fpi_ssm_mark_aborted(ssm, -EIO); +} + +static void m_exit_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + + if (ssm->error) { + fp_err("Error switching the device to idle state"); + } else { + fp_dbg("The device is now in idle state"); + } + fpi_imgdev_deactivate_complete(idev); + fpi_ssm_free(ssm); +} + +static void m_exit_start(struct fp_img_dev *idev) +{ + struct fpi_ssm *ssm = fpi_ssm_new(idev->dev, m_exit_state, + EXIT_NUM_STATES); + fp_dbg("Switching device to idle mode"); + ssm->priv = idev; + fpi_ssm_start(ssm, m_exit_complete); +} + +static void m_capture_state(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + struct etes603_dev *dev = idev->priv; + + if (dev->is_active == FALSE) { + fpi_ssm_mark_completed(ssm); + return; + } + + switch (ssm->cur_state) { + case CAP_FP_INIT_SET_REG10_REQ: + /* Reset fingerprint */ + fp_dbg("Capturing a fingerprint..."); + memset(dev->fp, 0, FE_SIZE * 2); + dev->fp_height = 0; + msg_set_regs(dev, 2, REG_10, 0x92); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case CAP_FP_INIT_SET_REG10_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case CAP_FP_INIT_SET_MODE_FP_REQ: + msg_set_mode_control(dev, REG_MODE_FP); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case CAP_FP_INIT_SET_MODE_FP_ANS: + if (msg_check_ok(dev)) + goto err; + fp_dbg("Capturing a 1st frame..."); + fpi_ssm_next_state(ssm); + break; + case CAP_FP_GET_FP_REQ: + msg_get_fp(dev, 0x01, 0xF4, 0x02, 0x01, 0x64); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case CAP_FP_GET_FP_ANS: + memcpy(dev->fp + dev->fp_height * FE_WIDTH / 2, dev->ans, + FE_SIZE); + dev->fp_height += FE_HEIGHT; + if (dev->fp_height <= FE_HEIGHT) { + /* 2 lines are at least removed each time */ + dev->fp_height -= 2; + fp_dbg("Capturing a 2nd frame..."); + fpi_ssm_jump_to_state(ssm, CAP_FP_GET_FP_REQ); + } else { + struct fp_img *img; + unsigned int img_size; + /* Remove empty parts 2 times for the 2 frames */ + process_remove_fp_end(dev); + process_remove_fp_end(dev); + img_size = dev->fp_height * FE_WIDTH; + img = fpi_img_new(img_size); + /* Images received are white on black, so invert it. */ + /* TODO detect sweep direction */ + img->flags = FP_IMG_COLORS_INVERTED | FP_IMG_V_FLIPPED; + img->height = dev->fp_height; + process_4to8_bpp(dev->fp, img_size / 2, img->data); + fp_dbg("Sending the raw fingerprint image (%dx%d)", + img->width, img->height); + fpi_imgdev_image_captured(idev, img); + fpi_imgdev_report_finger_status(idev, FALSE); + fpi_ssm_mark_completed(ssm); + } + break; + default: + fp_err("Unknown state %d", ssm->cur_state); + goto err; + break; + } + + return; +err: + fpi_ssm_mark_aborted(ssm, -EIO); +} + +static void m_capture_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + struct etes603_dev *dev = idev->priv; + + if (ssm->error) { + if (idev->action_state != IMG_ACQUIRE_STATE_DEACTIVATING) { + fp_err("Error while capturing fingerprint " + "(ssm->error=%d)", ssm->error); + fpi_imgdev_session_error(idev, ssm->error); + } + } + fpi_ssm_free(ssm); + + if (dev->is_active == TRUE) { + fp_dbg("Device is still active, restarting finger detection"); + m_start_fingerdetect(idev); + } else { + fp_dbg("And it's over."); + } +} + +static void m_finger_state(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + struct etes603_dev *dev = idev->priv; + + if (dev->is_active == FALSE) { + fpi_ssm_mark_completed(ssm); + return; + } + + switch (ssm->cur_state) { + case FGR_FPA_INIT_SET_MODE_SLEEP_REQ: + msg_set_mode_control(dev, REG_MODE_SLEEP); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case FGR_FPA_INIT_SET_MODE_SLEEP_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case FGR_FPA_INIT_SET_DCOFFSET_REQ: + msg_set_regs(dev, 2, REG_DCOFFSET, dev->dcoffset); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case FGR_FPA_INIT_SET_DCOFFSET_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case FGR_FPA_INIT_SET_GAINVRTVRB_REQ: + msg_set_regs(dev, 6, REG_GAIN, dev->gain, REG_VRT, dev->vrt, + REG_VRB, dev->vrb); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case FGR_FPA_INIT_SET_GAINVRTVRB_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case FGR_FPA_INIT_SET_VCO_CONTROL_RT_REQ: + msg_set_regs(dev, 2, REG_VCO_CONTROL, REG_VCO_RT); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case FGR_FPA_INIT_SET_VCO_CONTROL_RT_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case FGR_FPA_INIT_SET_REG04_REQ: + msg_set_regs(dev, 2, REG_04, 0x00); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case FGR_FPA_INIT_SET_REG04_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case FGR_FPA_INIT_SET_MODE_SENSOR_REQ: + msg_set_mode_control(dev, REG_MODE_SENSOR); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case FGR_FPA_INIT_SET_MODE_SENSOR_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case FGR_FPA_GET_FRAME_REQ: + msg_get_frame(dev, 0x00, 0x00, 0x00, 0x00); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case FGR_FPA_GET_FRAME_ANS: + if (process_frame_empty((uint8_t *)dev->ans, FRAME_SIZE)) { + fpi_ssm_jump_to_state(ssm, FGR_FPA_GET_FRAME_REQ); + } else { + fpi_imgdev_report_finger_status(idev, TRUE); + fpi_ssm_mark_completed(ssm); + } + break; + default: + fp_err("Unknown state %d", ssm->cur_state); + goto err; + break; + } + + return; +err: + fpi_ssm_mark_aborted(ssm, -EIO); +} + +static void m_finger_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + struct etes603_dev *dev = idev->priv; + + if (!ssm->error) { + struct fpi_ssm *ssm_cap; + ssm_cap = fpi_ssm_new(idev->dev, m_capture_state, + CAP_NUM_STATES); + ssm_cap->priv = idev; + fpi_ssm_start(ssm_cap, m_capture_complete); + } else { + if (idev->action_state != IMG_ACQUIRE_STATE_DEACTIVATING) { + fp_err("Error while capturing fingerprint " + "(ssm->error=%d)", ssm->error); + fpi_imgdev_session_error(idev, -4); + } + dev->is_active = FALSE; + } + + fpi_ssm_free(ssm); +} + +static void m_start_fingerdetect(struct fp_img_dev *idev) +{ + struct fpi_ssm *ssmf; + ssmf = fpi_ssm_new(idev->dev, m_finger_state, FGR_NUM_STATES); + ssmf->priv = idev; + fpi_ssm_start(ssmf, m_finger_complete); +} + +/* + * Tune value of VRT and VRB for contrast and brightness. + */ +static void m_tunevrb_state(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + struct etes603_dev *dev = idev->priv; + float hist[5]; + + if (dev->is_active == FALSE) { + fpi_ssm_mark_completed(ssm); + return; + } + + switch (ssm->cur_state) { + case TUNEVRB_INIT: + fp_dbg("Tuning of VRT/VRB"); + assert(dev->dcoffset); + /* VRT(reg E1)=0x0A and VRB(reg E2)=0x10 are starting values */ + dev->vrt = 0x0A; + dev->vrb = 0x10; + fpi_ssm_next_state(ssm); + break; + case TUNEVRB_GET_GAIN_REQ: + msg_get_regs(dev, 1, REG_GAIN); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEVRB_GET_GAIN_ANS: + if (msg_parse_regs(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case TUNEVRB_GET_DCOFFSET_REQ: + msg_get_regs(dev, 1, REG_DCOFFSET); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEVRB_GET_DCOFFSET_ANS: + if (msg_parse_regs(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case TUNEVRB_SET_DCOFFSET_REQ: + /* Reduce DCoffset by 1 to allow tuning */ + msg_set_regs(dev, 2, REG_DCOFFSET, dev->dcoffset - 1); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEVRB_SET_DCOFFSET_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case TUNEVRB_FRAME_REQ: + fp_dbg("Testing VRT=0x%02X VRB=0x%02X", dev->vrt, dev->vrb); + msg_get_frame(dev, 0x01, dev->gain, dev->vrt, dev->vrb); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEVRB_FRAME_ANS: + process_hist((uint8_t *)dev->ans, FRAME_SIZE, hist); + /* Note that this tuning could probably be improved */ + if (hist[0] + hist[1] > 0.95) { + if (dev->vrt <= 0 || dev->vrb <= 0) { + fp_dbg("Image is too dark, reducing DCOffset"); + dev->dcoffset--; + fpi_ssm_jump_to_state(ssm, TUNEVRB_INIT); + } else { + dev->vrt--; + dev->vrb--; + fpi_ssm_jump_to_state(ssm, TUNEVRB_FRAME_REQ); + } + break; + } + if (hist[4] > 0.95) { + fp_dbg("Image is too bright, increasing DCOffset"); + dev->dcoffset++; + fpi_ssm_jump_to_state(ssm, TUNEVRB_INIT); + break; + } + if (hist[4] + hist[3] > 0.4) { + if (dev->vrt >= 2 * dev->vrb - 0x0a) { + dev->vrt++; dev->vrb++; + } else { + dev->vrt++; + } + /* Check maximum for vrt/vrb */ + /* TODO if maximum is reached, leave with an error? */ + if (dev->vrt > VRT_MAX) + dev->vrt = VRT_MAX; + if (dev->vrb > VRB_MAX) + dev->vrb = VRB_MAX; + fpi_ssm_jump_to_state(ssm, TUNEVRB_FRAME_REQ); + break; + } + fpi_ssm_next_state(ssm); + break; + case TUNEVRB_FINAL_SET_DCOFFSET_REQ: + fp_dbg("-> VRT=0x%02X VRB=0x%02X", dev->vrt, dev->vrb); + /* Reset the DCOffset */ + msg_set_regs(dev, 2, REG_DCOFFSET, dev->dcoffset); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEVRB_FINAL_SET_DCOFFSET_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case TUNEVRB_FINAL_SET_REG2627_REQ: + /* In traces, REG_26/REG_27 are set. purpose? values? */ + msg_set_regs(dev, 4, REG_26, 0x11, REG_27, 0x00); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEVRB_FINAL_SET_REG2627_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case TUNEVRB_FINAL_SET_GAINVRTVRB_REQ: + /* Set Gain/VRT/VRB values found */ + msg_set_regs(dev, 6, REG_GAIN, dev->gain, REG_VRT, dev->vrt, + REG_VRB, dev->vrb); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEVRB_FINAL_SET_GAINVRTVRB_ANS: + if (msg_check_ok(dev)) + goto err; + /* In traces, Gain/VRT/VRB are read again. */ + fpi_ssm_next_state(ssm); + break; + case TUNEVRB_FINAL_SET_MODE_SLEEP_REQ: + msg_set_mode_control(dev, REG_MODE_SLEEP); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEVRB_FINAL_SET_MODE_SLEEP_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_mark_completed(ssm); + break; + default: + fp_err("Unknown state %d", ssm->cur_state); + goto err; + break; + } + + return; +err: + fpi_ssm_mark_aborted(ssm, -EIO); +} + +static void m_tunevrb_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + + fpi_imgdev_activate_complete(idev, ssm->error != 0); + if (!ssm->error) { + fp_dbg("Tuning is done. Starting finger detection."); + m_start_fingerdetect(idev); + } else { + struct etes603_dev *dev = idev->priv; + fp_err("Error while tuning VRT"); + dev->is_active = FALSE; + reset_param(dev); + fpi_imgdev_session_error(idev, -3); + } + fpi_ssm_free(ssm); +} + +/* + * This function tunes the DCoffset value and adjusts the gain value if + * required. + */ +static void m_tunedc_state(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + struct etes603_dev *dev = idev->priv; + + if (dev->is_active == FALSE) { + fpi_ssm_mark_completed(ssm); + return; + } + + /* TODO To get better results, tuning could be done 3 times as in + * captured traffic to make sure that the value is correct. */ + /* The default gain should work but it may reach a DCOffset limit so in + * this case we decrease the gain. */ + switch (ssm->cur_state) { + case TUNEDC_INIT: + /* reg_e0 = 0x23 is sensor normal/small gain */ + dev->gain = GAIN_SMALL_INIT; + dev->tunedc_min = DCOFFSET_MIN; + dev->tunedc_max = DCOFFSET_MAX; + fp_dbg("Tuning DCoffset"); + fpi_ssm_next_state(ssm); + break; + case TUNEDC_SET_DCOFFSET_REQ: + /* Dichotomic search to find at which value the frame becomes + * almost black. */ + dev->dcoffset = (dev->tunedc_max + dev->tunedc_min) / 2; + fp_dbg("Testing DCoffset=0x%02X Gain=0x%02X", dev->dcoffset, + dev->gain); + msg_set_regs(dev, 2, REG_DCOFFSET, dev->dcoffset); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEDC_SET_DCOFFSET_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case TUNEDC_GET_FRAME_REQ: + /* vrt:0x15 vrb:0x10 are constant in all tuning frames. */ + msg_get_frame(dev, 0x01, dev->gain, 0x15, 0x10); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEDC_GET_FRAME_ANS: + if (process_frame_empty((uint8_t *)dev->ans, FRAME_WIDTH)) + dev->tunedc_max = dev->dcoffset; + else + dev->tunedc_min = dev->dcoffset; + if (dev->tunedc_min + 1 < dev->tunedc_max) { + fpi_ssm_jump_to_state(ssm, TUNEDC_SET_DCOFFSET_REQ); + } else if (dev->tunedc_max < DCOFFSET_MAX) { + dev->dcoffset = dev->tunedc_max + 1; + fpi_ssm_next_state(ssm); + } else { + dev->gain--; + fpi_ssm_jump_to_state(ssm, TUNEDC_SET_DCOFFSET_REQ); + } + break; + case TUNEDC_FINAL_SET_REG2122_REQ: + fp_dbg("-> DCoffset=0x%02X Gain=0x%02X", dev->dcoffset, + dev->gain); + /* ??? how reg21 / reg22 are calculated */ + msg_set_regs(dev, 4, REG_21, 0x23, REG_22, 0x21); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEDC_FINAL_SET_REG2122_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case TUNEDC_FINAL_SET_GAIN_REQ: + msg_set_regs(dev, 2, REG_GAIN, dev->gain); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEDC_FINAL_SET_GAIN_ANS: + fpi_ssm_next_state(ssm); + break; + case TUNEDC_FINAL_SET_DCOFFSET_REQ: + msg_set_regs(dev, 2, REG_DCOFFSET, dev->dcoffset); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case TUNEDC_FINAL_SET_DCOFFSET_ANS: + /* In captured traffic, read GAIN, VRT, and VRB registers. */ + if (msg_check_ok(dev)) + goto err; + fpi_ssm_mark_completed(ssm); + break; + default: + fp_err("Unknown state %d", ssm->cur_state); + goto err; + break; + } + + return; +err: + fpi_ssm_mark_aborted(ssm, -EIO); + +} + +static void m_tunedc_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + if (!ssm->error) { + struct fpi_ssm *ssm_tune; + ssm_tune = fpi_ssm_new(idev->dev, m_tunevrb_state, + TUNEVRB_NUM_STATES); + ssm_tune->priv = idev; + fpi_ssm_start(ssm_tune, m_tunevrb_complete); + } else { + struct etes603_dev *dev = idev->priv; + fp_err("Error while tuning DCOFFSET"); + dev->is_active = FALSE; + reset_param(dev); + fpi_imgdev_session_error(idev, -2); + } + fpi_ssm_free(ssm); +} + +static void m_init_state(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + struct etes603_dev *dev = idev->priv; + + if (dev->is_active == FALSE) { + fpi_ssm_mark_completed(ssm); + return; + } + + switch (ssm->cur_state) { + case INIT_CHECK_INFO_REQ: + msg_get_regs(dev, 4, REG_INFO0, REG_INFO1, REG_INFO2, + REG_INFO3); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case INIT_CHECK_INFO_ANS: + if (msg_parse_regs(dev)) + goto err; + if (check_info(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case INIT_CMD20_REQ: + msg_get_cmd20(dev); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case INIT_CMD20_ANS: + if (msg_check_cmd20(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case INIT_CMD25_REQ: + msg_get_cmd25(dev); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case INIT_CMD25_ANS: + if (msg_check_cmd25(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case INIT_SENSOR_REQ: + /* In captured traffic, those are splitted. */ + msg_set_regs(dev, 18, REG_MODE_CONTROL, REG_MODE_SLEEP, + REG_50, 0x0F, REG_GAIN, 0x04, REG_VRT, 0x08, + REG_VRB, 0x0D, REG_VCO_CONTROL, REG_VCO_RT, + REG_DCOFFSET, 0x36, REG_F0, 0x00, REG_F2, 0x00); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case INIT_SENSOR_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case INIT_ENC_REQ: + /* Initialize encryption registers without encryption. */ + /* Set registers from 0x41 to 0x48 (0x8 regs) */ + msg_set_regs(dev, 16, REG_ENC1, 0x12, REG_ENC2, 0x34, + REG_ENC3, 0x56, REG_ENC4, 0x78, REG_ENC5, 0x90, + REG_ENC6, 0xAB, REG_ENC7, 0xCD, REG_ENC8, 0xEF); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case INIT_ENC_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_next_state(ssm); + break; + case INIT_REGS_REQ: + /* Set register from 0x20 to 0x37 (0x18 regs) */ + msg_set_regs(dev, 48, + REG_20, 0x00, REG_21, 0x23, REG_22, 0x21, REG_23, 0x20, + REG_24, 0x14, REG_25, 0x6A, REG_26, 0x00, REG_27, 0x00, + REG_28, 0x00, REG_29, 0xC0, REG_2A, 0x50, REG_2B, 0x50, + REG_2C, 0x4D, REG_2D, 0x03, REG_2E, 0x06, REG_2F, 0x06, + REG_30, 0x10, REG_31, 0x02, REG_32, 0x14, REG_33, 0x34, + REG_34, 0x01, REG_35, 0x08, REG_36, 0x03, REG_37, 0x21); + if (async_tx(idev, EP_OUT, async_tx_cb, ssm)) + goto err; + break; + case INIT_REGS_ANS: + if (msg_check_ok(dev)) + goto err; + fpi_ssm_mark_completed(ssm); + break; + default: + fp_err("Unknown state %d", ssm->cur_state); + goto err; + break; + } + + return; +err: + fpi_ssm_mark_aborted(ssm, -EIO); + +} + +static void m_init_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *idev = ssm->priv; + if (!ssm->error) { + struct fpi_ssm *ssm_tune; + ssm_tune = fpi_ssm_new(idev->dev, m_tunedc_state, + TUNEDC_NUM_STATES); + ssm_tune->priv = idev; + fpi_ssm_start(ssm_tune, m_tunedc_complete); + } else { + struct etes603_dev *dev = idev->priv; + fp_err("Error initializing the device"); + dev->is_active = FALSE; + reset_param(dev); + fpi_imgdev_session_error(idev, -1); + } + fpi_ssm_free(ssm); +} + +static int dev_activate(struct fp_img_dev *idev, enum fp_imgdev_state state) +{ + struct etes603_dev *dev = idev->priv; + struct fpi_ssm *ssm; + + assert(dev); + + if (state != IMGDEV_STATE_AWAIT_FINGER_ON) { + fp_err("The driver is in an unexpected state: %d.", state); + fpi_imgdev_activate_complete(idev, 1); + return -1; + } + + /* Reset info and data */ + dev->is_active = TRUE; + + if (dev->dcoffset == 0) { + fp_dbg("Tuning device..."); + ssm = fpi_ssm_new(idev->dev, m_init_state, INIT_NUM_STATES); + ssm->priv = idev; + fpi_ssm_start(ssm, m_init_complete); + } else { + fp_dbg("Using previous tuning (DCOFFSET=0x%02X,VRT=0x%02X," + "VRB=0x%02X,GAIN=0x%02X).", dev->dcoffset, dev->vrt, + dev->vrb, dev->gain); + fpi_imgdev_activate_complete(idev, 0); + ssm = fpi_ssm_new(idev->dev, m_finger_state, FGR_NUM_STATES); + ssm->priv = idev; + fpi_ssm_start(ssm, m_finger_complete); + } + return 0; +} + +static void dev_deactivate(struct fp_img_dev *idev) +{ + struct etes603_dev *dev = idev->priv; + + fp_dbg("deactivating"); + + /* this can be called even if still activated. */ + if (dev->is_active == TRUE) { + dev->is_active = FALSE; + m_exit_start(idev); + } +} + +static int dev_open(struct fp_img_dev *idev, unsigned long driver_data) +{ + int ret; + struct etes603_dev *dev; + + dev = g_malloc0(sizeof(struct etes603_dev)); + idev->priv = dev; + + dev->req = g_malloc(sizeof(struct egis_msg)); + dev->ans = g_malloc(FE_SIZE); + dev->fp = g_malloc(FE_SIZE * 4); + + ret = libusb_claim_interface(idev->udev, 0); + if (ret != LIBUSB_SUCCESS) { + fp_err("libusb_claim_interface failed on interface 0 " + "(err=%d)", ret); + return ret; + } + + fpi_imgdev_open_complete(idev, 0); + return 0; +} + +static void dev_close(struct fp_img_dev *idev) +{ + struct etes603_dev *dev = idev->priv; + + g_free(dev->req); + g_free(dev->ans); + g_free(dev->fp); + g_free(dev); + + libusb_release_interface(idev->udev, 0); + fpi_imgdev_close_complete(idev); +} + +static const struct usb_id id_table[] = { + /* EgisTec (aka Lightuning) ES603 */ + { .vendor = 0x1c7a, .product = 0x0603}, + { 0, 0, 0, }, +}; + +struct fp_img_driver etes603_driver = { + .driver = { + .id = ETES603_ID, + .name = FP_COMPONENT, + .full_name = "EgisTec ES603", + .id_table = id_table, + .scan_type = FP_SCAN_TYPE_SWIPE, + }, + .flags = 0, + .img_height = -1, + .img_width = 256, + + .open = dev_open, + .close = dev_close, + .activate = dev_activate, + .deactivate = dev_deactivate, +}; + diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h index 8af02828..6910b645 100644 --- a/libfprint/fp_internal.h +++ b/libfprint/fp_internal.h @@ -299,6 +299,9 @@ extern struct fp_img_driver vfs301_driver; #ifdef ENABLE_UPEKTC_IMG extern struct fp_img_driver upektc_img_driver; #endif +#ifdef ENABLE_ETES603 +extern struct fp_img_driver etes603_driver; +#endif extern libusb_context *fpi_usb_ctx; extern GSList *opened_devices; From 948ab02d1a9d321e31dfd501646c29b880c1e5d0 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Fri, 24 May 2013 12:34:45 +0300 Subject: [PATCH 12/19] lib: use pixman for imaging utils pixman is very lightweight library for pixel manipulation, and it has no dependencies except glibc, so using it instead of gdkpixbuf/imagemagick makes list for libfprint dependencies a bit shorter. --- configure.ac | 24 +++----- libfprint/Makefile.am | 15 ++--- libfprint/gdkpixbuf.c | 88 --------------------------- libfprint/{imagemagick.c => pixman.c} | 50 +++++++-------- 4 files changed, 34 insertions(+), 143 deletions(-) delete mode 100644 libfprint/gdkpixbuf.c rename libfprint/{imagemagick.c => pixman.c} (56%) diff --git a/configure.ac b/configure.ac index 4fbaad82..d9faeb01 100644 --- a/configure.ac +++ b/configure.ac @@ -184,8 +184,7 @@ PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.28]) AC_SUBST(GLIB_CFLAGS) AC_SUBST(GLIB_LIBS) -imagemagick_found=no -gdkpixbuf_found=no +pixman_found=no AC_ARG_ENABLE(udev-rules, AC_HELP_STRING([--enable-udev-rules],[Update the udev rules]), @@ -213,20 +212,13 @@ AC_MSG_NOTICE([installing udev rules in ${ac_with_udev_rules_dir}]) AC_SUBST([udev_rulesdir],[${ac_with_udev_rules_dir}]) if test "$require_imaging" = "yes"; then - PKG_CHECK_MODULES(IMAGING, gthread-2.0 gdk-pixbuf-2.0, [gdkpixbuf_found=yes], [gdkpixbuf_found=no]) - if test "$gdkpixbuf_found" != "yes"; then - PKG_CHECK_MODULES(IMAGING, ImageMagick, [imagemagick_found=yes], [imagemagick_found=no]) + PKG_CHECK_MODULES(IMAGING, pixman-1, [pixman_found=yes], [pixman_found=no]) + if test "$pixman_found" != "yes"; then + AC_MSG_ERROR([pixman is required for imaging support]) fi fi -if test "$require_imaging" = "yes"; then - if test "$gdkpixbuf_found" != "yes" && test "$imagemagick_found" != "yes"; then - AC_MSG_ERROR([gdk-pixbuf or ImageMagick is required for imaging support]) - fi -fi - -AM_CONDITIONAL([REQUIRE_GDKPIXBUF], [test "$gdkpixbuf_found" = "yes"]) -AM_CONDITIONAL([REQUIRE_IMAGEMAGICK], [test "$imagemagick_found" = "yes"]) +AM_CONDITIONAL([REQUIRE_PIXMAN], [test "$pixman_found" = "yes"]) AC_SUBST(IMAGING_CFLAGS) AC_SUBST(IMAGING_LIBS) @@ -296,10 +288,8 @@ AM_CFLAGS="-std=gnu99 $inline_cflags -Wall -Wundef -Wunused -Wstrict-prototypes AC_SUBST(AM_CFLAGS) if test "$require_imaging" = "yes"; then - if test x$gdkpixbuf_found != no; then - AC_MSG_NOTICE([** Using gdk-pixbuf for imaging]) - else - AC_MSG_NOTICE([** Using ImageMagick for imaging]) + if test x$pixman_found != no; then + AC_MSG_NOTICE([** Using pixman for imaging]) fi else AC_MSG_NOTICE([ Imaging support disabled]) diff --git a/libfprint/Makefile.am b/libfprint/Makefile.am index 7ceb90de..c216d49e 100644 --- a/libfprint/Makefile.am +++ b/libfprint/Makefile.am @@ -46,8 +46,7 @@ EXTRA_DIST = \ drivers/aes3k.h \ drivers/driver_ids.h \ aeslib.c aeslib.h \ - imagemagick.c \ - gdkpixbuf.c \ + pixman.c \ 60-fprint-autosuspend.rules DRIVER_SRC = @@ -95,7 +94,7 @@ libfprint_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@ libfprint_la_LIBADD = -lm $(LIBUSB_LIBS) $(GLIB_LIBS) $(CRYPTO_LIBS) fprint_list_udev_rules_SOURCES = fprint-list-udev-rules.c -fprint_list_udev_rules_CFLAGS = -fvisibility=hidden -I$(srcdir)/nbis/include $(LIBUSB_CFLAGS) $(GLIB_CFLAGS) $(IMAGEMAGICK_CFLAGS) $(CRYPTO_CFLAGS) $(AM_CFLAGS) +fprint_list_udev_rules_CFLAGS = -fvisibility=hidden -I$(srcdir)/nbis/include $(LIBUSB_CFLAGS) $(GLIB_CFLAGS) $(CRYPTO_CFLAGS) $(AM_CFLAGS) fprint_list_udev_rules_LDADD = $(builddir)/libfprint.la $(GLIB_LIBS) udev_rules_DATA = 60-fprint-autosuspend.rules @@ -177,14 +176,8 @@ if ENABLE_ETES603 DRIVER_SRC += $(ETES603_SRC) endif -if REQUIRE_IMAGEMAGICK -OTHER_SRC += imagemagick.c -libfprint_la_CFLAGS += $(IMAGING_CFLAGS) -libfprint_la_LIBADD += $(IMAGING_LIBS) -endif - -if REQUIRE_GDKPIXBUF -OTHER_SRC += gdkpixbuf.c +if REQUIRE_PIXMAN +OTHER_SRC += pixman.c libfprint_la_CFLAGS += $(IMAGING_CFLAGS) libfprint_la_LIBADD += $(IMAGING_LIBS) endif diff --git a/libfprint/gdkpixbuf.c b/libfprint/gdkpixbuf.c deleted file mode 100644 index 4de6151c..00000000 --- a/libfprint/gdkpixbuf.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Imaging utility functions for libfprint - * Copyright (C) 2007-2008 Daniel Drake - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include - -#include "fp_internal.h" - -struct fp_img *fpi_im_resize(struct fp_img *img, unsigned int w_factor, unsigned int h_factor) -{ - int new_width = img->width * w_factor; - int new_height = img->height * h_factor; - GdkPixbuf *orig, *resized; - struct fp_img *newimg; - guchar *pixels; - guint y; - int rowstride; - - g_type_init (); - - /* It is possible to implement resizing using a simple algorithm, however - * we use gdk-pixbuf because it applies some kind of smoothing to the - * result, which improves matching performances in my experiments. */ - - /* Create the original pixbuf, and fill it in from the grayscale data */ - orig = gdk_pixbuf_new (GDK_COLORSPACE_RGB, - FALSE, - 8, - img->width, - img->height); - rowstride = gdk_pixbuf_get_rowstride (orig); - pixels = gdk_pixbuf_get_pixels (orig); - for (y = 0; y < img->height; y++) { - guint x; - for (x = 0; x < img->width; x++) { - guchar *p, *r; - - p = pixels + y * rowstride + x * 3; - r = img->data + y * img->width + x; - p[0] = r[0]; - p[1] = r[0]; - p[2] = r[0]; - } - } - - /* Resize the pixbuf, and create the new fp_img */ - resized = gdk_pixbuf_scale_simple (orig, new_width, new_height, GDK_INTERP_HYPER); - g_object_unref (orig); - - newimg = fpi_img_new(new_width * new_height); - newimg->width = new_width; - newimg->height = new_height; - newimg->flags = img->flags; - - rowstride = gdk_pixbuf_get_rowstride (resized); - pixels = gdk_pixbuf_get_pixels (resized); - for (y = 0; y < newimg->height; y++) { - guint x; - for (x = 0; x < newimg->width; x++) { - guchar *p, *r; - - r = newimg->data + y * newimg->width + x; - p = pixels + y * rowstride + x * 3; - r[0] = p[0]; - } - } - - g_object_unref (resized); - - return newimg; -} - diff --git a/libfprint/imagemagick.c b/libfprint/pixman.c similarity index 56% rename from libfprint/imagemagick.c rename to libfprint/pixman.c index 68e7146f..1b4ca06f 100644 --- a/libfprint/imagemagick.c +++ b/libfprint/pixman.c @@ -1,6 +1,7 @@ /* * Imaging utility functions for libfprint * Copyright (C) 2007-2008 Daniel Drake + * Copyright (C) 2013 Vasily Khoruzhick * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,50 +18,45 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include -#include +#include +#include #include "fp_internal.h" struct fp_img *fpi_im_resize(struct fp_img *img, unsigned int w_factor, unsigned int h_factor) { - Image *mimg; - Image *resized; - ExceptionInfo exception; - MagickBooleanType ret; int new_width = img->width * w_factor; int new_height = img->height * h_factor; + pixman_image_t *orig, *resized; + pixman_transform_t transform; struct fp_img *newimg; - /* It is possible to implement resizing using a simple algorithm, however - * we use ImageMagick because it applies some kind of smoothing to the - * result, which improves matching performances in my experiments. */ + orig = pixman_image_create_bits(PIXMAN_a8, img->width, img->height, (uint32_t *)img->data, img->width); + resized = pixman_image_create_bits(PIXMAN_a8, new_width, new_height, NULL, new_width); - if (!IsMagickInstantiated()) - InitializeMagick(NULL); - - GetExceptionInfo(&exception); - mimg = ConstituteImage(img->width, img->height, "I", CharPixel, img->data, - &exception); - - GetExceptionInfo(&exception); - resized = ResizeImage(mimg, new_width, new_height, 0, 1.0, &exception); + pixman_transform_init_identity(&transform); + pixman_transform_scale(NULL, &transform, pixman_int_to_fixed(w_factor), pixman_int_to_fixed(h_factor)); + pixman_image_set_transform(orig, &transform); + pixman_image_set_filter(orig, PIXMAN_FILTER_BILINEAR, NULL, 0); + pixman_image_composite32(PIXMAN_OP_SRC, + orig, /* src */ + NULL, /* mask */ + resized, /* dst */ + 0, 0, /* src x y */ + 0, 0, /* mask x y */ + 0, 0, /* dst x y */ + new_width, new_height /* width height */ + ); newimg = fpi_img_new(new_width * new_height); newimg->width = new_width; newimg->height = new_height; newimg->flags = img->flags; - GetExceptionInfo(&exception); - ret = ExportImagePixels(resized, 0, 0, new_width, new_height, "I", - CharPixel, newimg->data, &exception); - if (ret != MagickTrue) { - fp_err("export failed"); - return NULL; - } + memcpy(newimg->data, pixman_image_get_data(resized), new_width * new_height); - DestroyImage(mimg); - DestroyImage(resized); + pixman_image_unref(orig); + pixman_image_unref(resized); return newimg; } From 35e356f625d254f44c14f720c0eb9216297d35c2 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Mon, 12 Aug 2013 11:45:17 +0300 Subject: [PATCH 13/19] build: add subdir-objects option to make automake happy Without subdir-object automake throws warnings like this one: Makefile.am:x: warning: source file 'drivers/aes2550.c' is in a subdirectory, Makefile.am:x: but option 'subdir-objects' is disabled --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index d9faeb01..34f2eb14 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_INIT([libfprint], [0.5.1]) -AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz check-news]) +AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz check-news subdir-objects]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([libfprint/core.c]) AC_CONFIG_HEADERS([config.h]) From 79d79c3c875d41379eae418157a8254e87641f85 Mon Sep 17 00:00:00 2001 From: Rex Dieter Date: Wed, 17 Dec 2014 07:27:15 -0600 Subject: [PATCH 14/19] lib: Test before applying power saving udev rules add TEST=="power/control"... to test for the presence of the file before setting it. See https://bugzilla.redhat.com/show_bug.cgi?id=950205 https://bugs.freedesktop.org/show_bug.cgi?id=87414 --- libfprint/fprint-list-udev-rules.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libfprint/fprint-list-udev-rules.c b/libfprint/fprint-list-udev-rules.c index 71c0b598..4b18f5ae 100644 --- a/libfprint/fprint-list-udev-rules.c +++ b/libfprint/fprint-list-udev-rules.c @@ -74,7 +74,7 @@ static void print_driver (struct fp_driver *driver) if (num_printed == 0) printf ("# %s\n", driver->full_name); - printf ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", ATTR{power/control}=\"auto\"\n", driver->id_table[i].vendor, driver->id_table[i].product); + printf ("SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ATTRS{dev}==\"*\", TEST==\"power/control\", ATTR{power/control}=\"auto\"\n", driver->id_table[i].vendor, driver->id_table[i].product); num_printed++; } From 82ae7c1c0909dba765ed8c42d26c22913841f206 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Mon, 30 Dec 2013 12:05:08 +0300 Subject: [PATCH 15/19] aesx660: fix spelling of define name --- libfprint/drivers/aesx660.c | 2 +- libfprint/drivers/aesx660.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libfprint/drivers/aesx660.c b/libfprint/drivers/aesx660.c index d030d0e7..6f35720d 100644 --- a/libfprint/drivers/aesx660.c +++ b/libfprint/drivers/aesx660.c @@ -355,7 +355,7 @@ static void capture_read_stripe_data_cb(struct libusb_transfer *transfer) if (aesdev->buffer_size == aesdev->buffer_max) { if (aesdev->buffer_max == AESX660_HEADER_SIZE) { aesdev->buffer_max = aesdev->buffer[AESX660_RESPONSE_SIZE_LSB_OFFSET] + - (aesdev->buffer[AESX660_RESPONSE_SIZE_MSB_OFFSEt] << 8) + AESX660_HEADER_SIZE; + (aesdev->buffer[AESX660_RESPONSE_SIZE_MSB_OFFSET] << 8) + AESX660_HEADER_SIZE; fp_dbg("Got frame, type %.2x size %.4x", aesdev->buffer[AESX660_RESPONSE_TYPE_OFFSET], aesdev->buffer_max); diff --git a/libfprint/drivers/aesx660.h b/libfprint/drivers/aesx660.h index b53ad51b..e3545386 100644 --- a/libfprint/drivers/aesx660.h +++ b/libfprint/drivers/aesx660.h @@ -23,7 +23,7 @@ #define AESX660_HEADER_SIZE 3 #define AESX660_RESPONSE_TYPE_OFFSET 0x00 #define AESX660_RESPONSE_SIZE_LSB_OFFSET 0x01 -#define AESX660_RESPONSE_SIZE_MSB_OFFSEt 0x02 +#define AESX660_RESPONSE_SIZE_MSB_OFFSET 0x02 #define AESX660_CALIBRATE_RESPONSE 0x06 #define AESX660_FINGER_DET_RESPONSE 0x40 From 061a457658f1b39fe04ceb3c104c46b19a13799f Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Mon, 30 Dec 2013 12:07:53 +0300 Subject: [PATCH 16/19] aeslib: improve frame-assembling routines Some scanners provide hardware assistance in frame assemling, i.e. horizontal and vertical offset to previous frame is provided. This commit improves code to utilise that assistance. Sensors without hardware assistance will use software algorithm, which was also improved to do search in horizontal direction. --- libfprint/aeslib.c | 327 ++++++++++++++++++++++++++---------- libfprint/aeslib.h | 13 +- libfprint/drivers/aes1610.c | 21 ++- libfprint/drivers/aes1660.c | 4 +- libfprint/drivers/aes2501.c | 22 ++- libfprint/drivers/aes2550.c | 17 +- libfprint/drivers/aes2660.c | 3 +- libfprint/drivers/aes3k.c | 16 +- libfprint/drivers/aesx660.c | 23 ++- libfprint/drivers/aesx660.h | 3 + 10 files changed, 320 insertions(+), 129 deletions(-) diff --git a/libfprint/aeslib.c b/libfprint/aeslib.c index 00ddfd91..8c0381a4 100644 --- a/libfprint/aeslib.c +++ b/libfprint/aeslib.c @@ -158,127 +158,268 @@ void aes_write_regv(struct fp_img_dev *dev, const struct aes_regwrite *regs, continue_write_regv(wdata); } -void aes_assemble_image(unsigned char *input, size_t width, size_t height, - unsigned char *output) +static inline unsigned char aes_get_pixel(struct aes_stripe *frame, + unsigned int x, + unsigned int y, + unsigned int frame_width, + unsigned int frame_height) { - size_t row, column; + unsigned char ret; - for (column = 0; column < width; column++) { - for (row = 0; row < height; row += 2) { - output[width * row + column] = (*input & 0x0f) * 17; - output[width * (row + 1) + column] = ((*input & 0xf0) >> 4) * 17; - input++; + ret = frame->data[x * (frame_height >> 1) + (y >> 1)]; + ret = y % 2 ? ret >> 4 : ret & 0xf; + ret *= 17; + + return ret; +} + +static unsigned int calc_error(struct aes_stripe *first_frame, + struct aes_stripe *second_frame, + int dx, + int dy, + unsigned int frame_width, + unsigned int frame_height) +{ + unsigned int width, height; + unsigned int x1, y1, x2, y2, err, i, j; + + width = frame_width - (dx > 0 ? dx : -dx); + height = frame_height - dy; + + y1 = 0; + y2 = dy; + i = 0; + err = 0; + do { + x1 = dx < 0 ? 0 : dx; + x2 = dx < 0 ? -dx : 0; + j = 0; + + do { + unsigned char v1, v2; + + + v1 = aes_get_pixel(first_frame, x1, y1, frame_width, frame_height); + v2 = aes_get_pixel(second_frame, x2, y2, frame_width, frame_height); + err += v1 > v2 ? v1 - v2 : v2 - v1; + j++; + x1++; + x2++; + + } while (j < width); + i++; + y1++; + y2++; + } while (i < height); + + /* Normalize error */ + err *= (frame_height * frame_width); + err /= (height * width); + + if (err == 0) + return INT_MAX; + + return err; +} + +/* This function is rather CPU-intensive. It's better to use hardware + * to detect movement direction when possible. + */ +static void find_overlap(struct aes_stripe *first_frame, + struct aes_stripe *second_frame, + unsigned int *min_error, + unsigned int frame_width, + unsigned int frame_height) +{ + int dx, dy; + unsigned int err; + *min_error = INT_MAX; + + /* Seeking in horizontal and vertical dimensions, + * for horizontal dimension we'll check only 8 pixels + * in both directions. For vertical direction diff is + * rarely less than 2, so start with it. + */ + for (dy = 2; dy < frame_height; dy++) { + for (dx = -8; dx < 8; dx++) { + err = calc_error(first_frame, second_frame, + dx, dy, frame_width, frame_height); + if (err < *min_error) { + *min_error = err; + second_frame->delta_x = -dx; + second_frame->delta_y = dy; + } } } } -/* find overlapping parts of frames */ -static unsigned int find_overlap(unsigned char *first_frame, - unsigned char *second_frame, unsigned int *min_error, - unsigned int frame_width, unsigned int frame_height) -{ - unsigned int dy; - unsigned int not_overlapped_height = 0; - /* 255 is highest brightness value for an 8bpp image */ - *min_error = 255 * frame_width * frame_height; - for (dy = 0; dy < frame_height; dy++) { - /* Calculating difference (error) between parts of frames */ - unsigned int i; - unsigned int error = 0; - for (i = 0; i < frame_width * (frame_height - dy); i++) { - /* Using ? operator to avoid abs function */ - error += first_frame[i] > second_frame[i] ? - (first_frame[i] - second_frame[i]) : - (second_frame[i] - first_frame[i]); - } - - /* Normalize error */ - error *= 15; - error /= i; - if (error < *min_error) { - *min_error = error; - not_overlapped_height = dy; - } - first_frame += frame_width; - } - - return not_overlapped_height; -} - -/* assemble a series of frames into a single image */ -static unsigned int assemble(GSList *list_entry, size_t num_stripes, +unsigned int aes_calc_delta(GSList *stripes, size_t num_stripes, unsigned int frame_width, unsigned int frame_height, - unsigned char *output, gboolean reverse, unsigned int *errors_sum) + gboolean reverse) { - uint8_t *assembled = output; - int frame; - uint32_t image_height = frame_height; - unsigned int min_error, frame_size = frame_width * frame_height; - *errors_sum = 0; + GSList *list_entry = stripes; + GTimer *timer; + int frame = 1; + int height = 0; + struct aes_stripe *prev_stripe = list_entry->data; + unsigned int min_error; - if (reverse) - output += (num_stripes - 1) * frame_size; - for (frame = 0; frame < num_stripes; frame++) { - aes_assemble_image(list_entry->data, frame_width, frame_height, output); + list_entry = g_slist_next(list_entry); - if (reverse) - output -= frame_size; + timer = g_timer_new(); + do { + struct aes_stripe *cur_stripe = list_entry->data; + + if (reverse) { + find_overlap(prev_stripe, cur_stripe, &min_error, + frame_width, frame_height); + prev_stripe->delta_y = -prev_stripe->delta_y; + prev_stripe->delta_x = -prev_stripe->delta_x; + } else - output += frame_size; + find_overlap(cur_stripe, prev_stripe, &min_error, + frame_width, frame_height); + + frame++; + height += prev_stripe->delta_y; + prev_stripe = cur_stripe; list_entry = g_slist_next(list_entry); + + } while (frame < num_stripes); + + if (height < 0) + height = -height; + height += frame_height; + g_timer_stop(timer); + fp_dbg("calc delta completed in %f secs", g_timer_elapsed(timer, NULL)); + g_timer_destroy(timer); + + return height; +} + +static inline void aes_blit_stripe(struct fp_img *img, + struct aes_stripe *stripe, + int x, int y, unsigned int frame_width, + unsigned int frame_height) +{ + unsigned int ix, iy; + unsigned int fx, fy; + unsigned int width, height; + + /* Find intersection */ + if (x < 0) { + width = frame_width + x; + ix = 0; + fx = -x; + } else { + ix = x; + fx = 0; + width = frame_width; + } + if ((ix + width) > img->width) + width = img->width - ix; + + if (y < 0) { + iy = 0; + fy = -y; + height = frame_height + y; + } else { + iy = y; + fy = 0; + height = frame_height; } - /* Detecting where frames overlaped */ - output = assembled; - for (frame = 1; frame < num_stripes; frame++) { - int not_overlapped; + if (fx > frame_width) + return; - output += frame_size; - not_overlapped = find_overlap(assembled, output, &min_error, - frame_width, frame_height); - *errors_sum += min_error; - image_height += not_overlapped; - assembled += frame_width * not_overlapped; - memcpy(assembled, output, frame_size); + if (fy > frame_height) + return; + + if (ix > img->width) + return; + + if (iy > img->height) + return; + + if ((iy + height) > img->height) + height = img->height - iy; + + for (; fy < height; fy++, iy++) { + if (x < 0) { + ix = 0; + fx = -x; + } else { + ix = x; + fx = 0; + } + for (; fx < width; fx++, ix++) { + img->data[ix + (iy * img->width)] = aes_get_pixel(stripe, fx, fy, frame_width, frame_height); + } } - return image_height; } struct fp_img *aes_assemble(GSList *stripes, size_t stripes_len, - unsigned int frame_width, unsigned int frame_height) + unsigned int frame_width, unsigned int frame_height, unsigned int img_width) { - size_t final_size; + GSList *stripe; struct fp_img *img; - unsigned int frame_size = frame_width * frame_height; - unsigned int errors_sum, r_errors_sum; + int height = 0; + int i, y, x; + gboolean reverse = FALSE; + struct aes_stripe *aes_stripe; BUG_ON(stripes_len == 0); + BUG_ON(img_width < frame_width); - /* create buffer big enough for max image */ - img = fpi_img_new(stripes_len * frame_size); + /* Calculate height */ + i = 0; + stripe = stripes; - img->flags = FP_IMG_COLORS_INVERTED; - img->height = assemble(stripes, stripes_len, - frame_width, frame_height, - img->data, FALSE, &errors_sum); - img->height = assemble(stripes, stripes_len, - frame_width, frame_height, - img->data, TRUE, &r_errors_sum); + /* No offset for 1st image */ + aes_stripe = stripe->data; + aes_stripe->delta_x = 0; + aes_stripe->delta_y = 0; + do { + aes_stripe = stripe->data; - if (r_errors_sum > errors_sum) { - img->height = assemble(stripes, stripes_len, - frame_width, frame_height, - img->data, FALSE, &errors_sum); - img->flags |= FP_IMG_V_FLIPPED | FP_IMG_H_FLIPPED; - fp_dbg("normal scan direction"); - } else { - fp_dbg("reversed scan direction"); + height += aes_stripe->delta_y; + i++; + stripe = g_slist_next(stripe); + } while (i < stripes_len); + + fp_dbg("height is %d", height); + + if (height < 0) { + reverse = TRUE; + height = -height; } - /* now that overlap has been removed, resize output image buffer */ - final_size = img->height * frame_width; - img = fpi_img_resize(img, final_size); - img->width = frame_width; + /* For last frame */ + height += frame_height; + + /* Create buffer big enough for max image */ + img = fpi_img_new(img_width * height); + img->flags = FP_IMG_COLORS_INVERTED; + img->width = img_width; + img->height = height; + + /* Assemble stripes */ + i = 0; + stripe = stripes; + y = reverse ? (height - frame_height) : 0; + x = (img_width - frame_width) / 2; + + do { + aes_stripe = stripe->data; + + y += aes_stripe->delta_y; + x += aes_stripe->delta_x; + + aes_blit_stripe(img, aes_stripe, x, y, frame_width, frame_height); + + stripe = g_slist_next(stripe); + i++; + } while (i < stripes_len); return img; } diff --git a/libfprint/aeslib.h b/libfprint/aeslib.h index e366262f..7721d111 100644 --- a/libfprint/aeslib.h +++ b/libfprint/aeslib.h @@ -27,17 +27,24 @@ struct aes_regwrite { unsigned char value; }; +struct aes_stripe { + int delta_x; + int delta_y; + unsigned char data[0]; +}; + typedef void (*aes_write_regv_cb)(struct fp_img_dev *dev, int result, void *user_data); void aes_write_regv(struct fp_img_dev *dev, const struct aes_regwrite *regs, unsigned int num_regs, aes_write_regv_cb callback, void *user_data); -void aes_assemble_image(unsigned char *input, size_t width, size_t height, - unsigned char *output); +unsigned int aes_calc_delta(GSList *stripes, size_t stripes_len, + unsigned int frame_width, unsigned int frame_height, + gboolean reverse); struct fp_img *aes_assemble(GSList *stripes, size_t stripes_len, - unsigned int frame_width, unsigned int frame_height); + unsigned int frame_width, unsigned int frame_height, unsigned int img_width); #endif diff --git a/libfprint/drivers/aes1610.c b/libfprint/drivers/aes1610.c index 2e04c593..957d0f4a 100644 --- a/libfprint/drivers/aes1610.c +++ b/libfprint/drivers/aes1610.c @@ -609,13 +609,24 @@ static void capture_read_strip_cb(struct libusb_transfer *transfer) /* stop capturing if MAX_FRAMES is reached */ if (aesdev->blanks_count > 10 || g_slist_length(aesdev->strips) >= MAX_FRAMES) { struct fp_img *img; + unsigned int height, rev_height; fp_dbg("sending stop capture.... blanks=%d frames=%d", aesdev->blanks_count, g_slist_length(aesdev->strips)); /* send stop capture bits */ aes_write_regv(dev, capture_stop, G_N_ELEMENTS(capture_stop), stub_capture_stop_cb, NULL); aesdev->strips = g_slist_reverse(aesdev->strips); + height = aes_calc_delta(aesdev->strips, aesdev->strips_len, + FRAME_WIDTH, FRAME_HEIGHT, FALSE); + rev_height = aes_calc_delta(aesdev->strips, aesdev->strips_len, + FRAME_WIDTH, FRAME_HEIGHT, TRUE); + fp_dbg("heights: %d rev: %d", height, rev_height); + if (rev_height < height) { + fp_dbg("Reversed direction"); + height = aes_calc_delta(aesdev->strips, aesdev->strips_len, + FRAME_WIDTH, FRAME_HEIGHT, FALSE); + } img = aes_assemble(aesdev->strips, aesdev->strips_len, - FRAME_WIDTH, FRAME_HEIGHT); + FRAME_WIDTH, FRAME_HEIGHT, FRAME_WIDTH + FRAME_WIDTH / 2); g_slist_free_full(aesdev->strips, g_free); aesdev->strips = NULL; aesdev->strips_len = 0; @@ -829,13 +840,9 @@ struct fp_img_driver aes1610_driver = { }, .flags = 0, .img_height = -1, - .img_width = 128, + .img_width = FRAME_WIDTH + FRAME_WIDTH / 2, - /* temporarily lowered until we sort out image processing code - * binarized scan quality is good, minutiae detection is accurate, - * it's just that we get fewer minutiae than other scanners (less scanning - * area) */ - .bz3_threshold = 10, + .bz3_threshold = 50, .open = dev_init, .close = dev_deinit, diff --git a/libfprint/drivers/aes1660.c b/libfprint/drivers/aes1660.c index d9ddc809..f931ba36 100644 --- a/libfprint/drivers/aes1660.c +++ b/libfprint/drivers/aes1660.c @@ -49,7 +49,6 @@ static int dev_init(struct fp_img_dev *dev, unsigned long driver_data) dev->priv = aesdev = g_malloc0(sizeof(struct aesX660_dev)); aesdev->buffer = g_malloc0(AES1660_FRAME_SIZE + AESX660_HEADER_SIZE); - aesdev->h_scale_factor = SCALE_FACTOR; aesdev->init_seqs[0] = aes1660_init_1; aesdev->init_seqs_len[0] = array_n_elements(aes1660_init_1); aesdev->init_seqs[1] = aes1660_init_2; @@ -102,7 +101,8 @@ struct fp_img_driver aes1660_driver = { }, .flags = 0, .img_height = -1, - .img_width = FRAME_WIDTH * SCALE_FACTOR, + .img_width = FRAME_WIDTH + FRAME_WIDTH / 2, + .bz3_threshold = 70, .open = dev_init, .close = dev_deinit, diff --git a/libfprint/drivers/aes2501.c b/libfprint/drivers/aes2501.c index 75d19fcd..264e2dcf 100644 --- a/libfprint/drivers/aes2501.c +++ b/libfprint/drivers/aes2501.c @@ -481,10 +481,21 @@ static void capture_read_strip_cb(struct libusb_transfer *transfer) aesdev->no_finger_cnt++; if (aesdev->no_finger_cnt == 3) { struct fp_img *img; + unsigned int height, rev_height; aesdev->strips = g_slist_reverse(aesdev->strips); + height = aes_calc_delta(aesdev->strips, aesdev->strips_len, + FRAME_WIDTH, FRAME_HEIGHT, FALSE); + rev_height = aes_calc_delta(aesdev->strips, aesdev->strips_len, + FRAME_WIDTH, FRAME_HEIGHT, TRUE); + fp_dbg("heights: %d rev: %d", height, rev_height); + if (rev_height < height) { + fp_dbg("Reversed direction"); + height = aes_calc_delta(aesdev->strips, aesdev->strips_len, + FRAME_WIDTH, FRAME_HEIGHT, FALSE); + } img = aes_assemble(aesdev->strips, aesdev->strips_len, - FRAME_WIDTH, FRAME_HEIGHT); + FRAME_WIDTH, FRAME_HEIGHT, FRAME_WIDTH + FRAME_WIDTH / 2); g_slist_free_full(aesdev->strips, g_free); aesdev->strips = NULL; aesdev->strips_len = 0; @@ -498,10 +509,13 @@ static void capture_read_strip_cb(struct libusb_transfer *transfer) } else { /* obtain next strip */ /* FIXME: would preallocating strip buffers be a decent optimization? */ - stripdata = g_malloc(192 * 8); + struct aes_stripe *stripe = g_malloc(FRAME_WIDTH * FRAME_HEIGHT / 2 + sizeof(struct aes_stripe)); + stripe->delta_x = 0; + stripe->delta_y = 0; + stripdata = stripe->data; memcpy(stripdata, data + 1, 192*8); aesdev->no_finger_cnt = 0; - aesdev->strips = g_slist_prepend(aesdev->strips, stripdata); + aesdev->strips = g_slist_prepend(aesdev->strips, stripe); aesdev->strips_len++; fpi_ssm_jump_to_state(ssm, CAPTURE_REQUEST_STRIP); @@ -867,7 +881,7 @@ struct fp_img_driver aes2501_driver = { }, .flags = 0, .img_height = -1, - .img_width = 192, + .img_width = FRAME_WIDTH + FRAME_WIDTH / 2, .open = dev_init, .close = dev_deinit, diff --git a/libfprint/drivers/aes2550.c b/libfprint/drivers/aes2550.c index dcfbc824..29e59d17 100644 --- a/libfprint/drivers/aes2550.c +++ b/libfprint/drivers/aes2550.c @@ -204,6 +204,7 @@ static int process_strip_data(struct fpi_ssm *ssm, unsigned char *data) unsigned char *stripdata; struct fp_img_dev *dev = ssm->priv; struct aes2550_dev *aesdev = dev->priv; + struct aes_stripe *stripe; int len; if (data[0] != AES2550_EDATA_MAGIC) { @@ -214,11 +215,16 @@ static int process_strip_data(struct fpi_ssm *ssm, unsigned char *data) if (len != (AES2550_STRIP_SIZE - 3)) { fp_dbg("Bogus frame len: %.4x\n", len); } - stripdata = g_malloc(FRAME_WIDTH * FRAME_HEIGHT / 2); /* 4 bits per pixel */ + stripe = g_malloc(FRAME_WIDTH * FRAME_HEIGHT / 2 + sizeof(struct aes_stripe)); /* 4 bits per pixel */ + stripe->delta_x = (int8_t)data[6]; + stripe->delta_y = -(int8_t)data[7]; + stripdata = stripe->data; memcpy(stripdata, data + 33, FRAME_WIDTH * FRAME_HEIGHT / 2); - aesdev->strips = g_slist_prepend(aesdev->strips, stripdata); + aesdev->strips = g_slist_prepend(aesdev->strips, stripe); aesdev->strips_len++; + fp_dbg("deltas: %dx%d", stripe->delta_x, stripe->delta_y); + return 0; } @@ -242,12 +248,13 @@ static void capture_set_idle_reqs_cb(struct libusb_transfer *transfer) struct aes2550_dev *aesdev = dev->priv; if ((transfer->status == LIBUSB_TRANSFER_COMPLETED) && - (transfer->length == transfer->actual_length)) { + (transfer->length == transfer->actual_length) && + aesdev->strips_len) { struct fp_img *img; aesdev->strips = g_slist_reverse(aesdev->strips); img = aes_assemble(aesdev->strips, aesdev->strips_len, - FRAME_WIDTH, FRAME_HEIGHT); + FRAME_WIDTH, FRAME_HEIGHT, FRAME_WIDTH + FRAME_WIDTH / 2); g_slist_free_full(aesdev->strips, g_free); aesdev->strips = NULL; aesdev->strips_len = 0; @@ -637,7 +644,7 @@ struct fp_img_driver aes2550_driver = { }, .flags = 0, .img_height = -1, - .img_width = 192, + .img_width = FRAME_WIDTH + FRAME_WIDTH / 2, .open = dev_init, .close = dev_deinit, diff --git a/libfprint/drivers/aes2660.c b/libfprint/drivers/aes2660.c index 4be7475d..d7b6cefc 100644 --- a/libfprint/drivers/aes2660.c +++ b/libfprint/drivers/aes2660.c @@ -49,7 +49,6 @@ static int dev_init(struct fp_img_dev *dev, unsigned long driver_data) dev->priv = aesdev = g_malloc0(sizeof(struct aesX660_dev)); aesdev->buffer = g_malloc0(AES2660_FRAME_SIZE + AESX660_HEADER_SIZE); /* No scaling for AES2660 */ - aesdev->h_scale_factor = 1; aesdev->init_seqs[0] = aes2660_init_1; aesdev->init_seqs_len[0] = array_n_elements(aes2660_init_1); aesdev->init_seqs[1] = aes2660_init_2; @@ -103,7 +102,7 @@ struct fp_img_driver aes2660_driver = { }, .flags = 0, .img_height = -1, - .img_width = FRAME_WIDTH, + .img_width = FRAME_WIDTH + FRAME_WIDTH / 2, .open = dev_init, .close = dev_deinit, diff --git a/libfprint/drivers/aes3k.c b/libfprint/drivers/aes3k.c index fefba3cb..ba969010 100644 --- a/libfprint/drivers/aes3k.c +++ b/libfprint/drivers/aes3k.c @@ -52,6 +52,20 @@ static void do_capture(struct fp_img_dev *dev); +static void aes3k_assemble_image(unsigned char *input, size_t width, size_t height, + unsigned char *output) +{ + size_t row, column; + + for (column = 0; column < width; column++) { + for (row = 0; row < height; row += 2) { + output[width * row + column] = (*input & 0x0f) * 17; + output[width * (row + 1) + column] = ((*input & 0xf0) >> 4) * 17; + input++; + } + } +} + static void img_cb(struct libusb_transfer *transfer) { struct fp_img_dev *dev = transfer->user_data; @@ -80,7 +94,7 @@ static void img_cb(struct libusb_transfer *transfer) for (i = 0; i < aesdev->frame_number; i++) { fp_dbg("frame header byte %02x", *ptr); ptr++; - aes_assemble_image(ptr, aesdev->frame_width, AES3K_FRAME_HEIGHT, tmp->data + (i * aesdev->frame_width * AES3K_FRAME_HEIGHT)); + aes3k_assemble_image(ptr, aesdev->frame_width, AES3K_FRAME_HEIGHT, tmp->data + (i * aesdev->frame_width * AES3K_FRAME_HEIGHT)); ptr += aesdev->frame_size; } diff --git a/libfprint/drivers/aesx660.c b/libfprint/drivers/aesx660.c index 6f35720d..ec28a5bd 100644 --- a/libfprint/drivers/aesx660.c +++ b/libfprint/drivers/aesx660.c @@ -273,19 +273,25 @@ enum capture_states { /* Returns number of processed bytes */ static int process_stripe_data(struct fpi_ssm *ssm, unsigned char *data) { + struct aes_stripe *stripe; unsigned char *stripdata; struct fp_img_dev *dev = ssm->priv; struct aesX660_dev *aesdev = dev->priv; - stripdata = g_malloc(aesdev->frame_width * FRAME_HEIGHT / 2); /* 4 bits per pixel */ + stripe = g_malloc(aesdev->frame_width * FRAME_HEIGHT / 2 + sizeof(struct aes_stripe)); /* 4 bpp */ + stripdata = stripe->data; fp_dbg("Processing frame %.2x %.2x", data[AESX660_IMAGE_OK_OFFSET], data[AESX660_LAST_FRAME_OFFSET]); + stripe->delta_x = (int8_t)data[AESX660_FRAME_DELTA_X_OFFSET]; + stripe->delta_y = -(int8_t)data[AESX660_FRAME_DELTA_Y_OFFSET]; + fp_dbg("Offset to previous frame: %d %d", stripe->delta_x, stripe->delta_y); + if (data[AESX660_IMAGE_OK_OFFSET] == AESX660_IMAGE_OK) { memcpy(stripdata, data + AESX660_IMAGE_OFFSET, aesdev->frame_width * FRAME_HEIGHT / 2); - aesdev->strips = g_slist_prepend(aesdev->strips, stripdata); + aesdev->strips = g_slist_prepend(aesdev->strips, stripe); aesdev->strips_len++; return (data[AESX660_LAST_FRAME_OFFSET] & AESX660_LAST_FRAME_BIT); } else { @@ -302,22 +308,15 @@ static void capture_set_idle_cmd_cb(struct libusb_transfer *transfer) if ((transfer->status == LIBUSB_TRANSFER_COMPLETED) && (transfer->length == transfer->actual_length)) { - struct fp_img *img, *tmp; + struct fp_img *img; aesdev->strips = g_slist_reverse(aesdev->strips); - tmp = aes_assemble(aesdev->strips, aesdev->strips_len, - aesdev->frame_width, FRAME_HEIGHT); + img = aes_assemble(aesdev->strips, aesdev->strips_len, + aesdev->frame_width, FRAME_HEIGHT, aesdev->frame_width + aesdev->frame_width / 2); g_slist_foreach(aesdev->strips, (GFunc) g_free, NULL); g_slist_free(aesdev->strips); aesdev->strips = NULL; aesdev->strips_len = 0; - if (aesdev->h_scale_factor > 1) { - img = fpi_im_resize(tmp, aesdev->h_scale_factor, 1); - fp_img_free(tmp); - } else { - img = tmp; - tmp = NULL; - } fpi_imgdev_image_captured(dev, img); fpi_imgdev_report_finger_status(dev, FALSE); fpi_ssm_mark_completed(ssm); diff --git a/libfprint/drivers/aesx660.h b/libfprint/drivers/aesx660.h index e3545386..0510a43a 100644 --- a/libfprint/drivers/aesx660.h +++ b/libfprint/drivers/aesx660.h @@ -35,6 +35,9 @@ #define AESX660_LAST_FRAME_OFFSET 0x04 #define AESX660_LAST_FRAME_BIT 0x01 +#define AESX660_FRAME_DELTA_X_OFFSET 16 +#define AESX660_FRAME_DELTA_Y_OFFSET 17 + #define AESX660_IMAGE_OFFSET 43 #define AESX660_BULK_TRANSFER_SIZE 4096 From dc537ef2c9b1ee62e88db02560abcead4f9486f9 Mon Sep 17 00:00:00 2001 From: Arseniy Lartsev Date: Tue, 5 Nov 2013 16:32:15 +0800 Subject: [PATCH 17/19] lib: Add VFS5011 driver New driver for VFS5011 138a:0011 and 138a:0018 https://bugs.freedesktop.org/show_bug.cgi?id=61692 [vasilykh]: - use g_get_real_time() instead of non-portable time() - use g_free() instead of free() - comment out "RECV(VFS5011_IN_ENDPOINT_CTRL2, 8)" --- configure.ac | 13 +- libfprint/Makefile.am | 6 + libfprint/core.c | 3 + libfprint/drivers/driver_ids.h | 1 + libfprint/drivers/vfs5011.c | 1020 +++++ libfprint/drivers/vfs5011_proto.h | 6186 +++++++++++++++++++++++++++++ libfprint/fp_internal.h | 3 + 7 files changed, 7231 insertions(+), 1 deletion(-) create mode 100644 libfprint/drivers/vfs5011.c create mode 100644 libfprint/drivers/vfs5011_proto.h diff --git a/configure.ac b/configure.ac index 34f2eb14..67ef78d3 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ AC_SUBST(lt_major) AC_SUBST(lt_revision) AC_SUBST(lt_age) -all_drivers="upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes3500 aes4000 vfs101 vfs301 upektc_img etes603" +all_drivers="upekts upektc upeksonly vcom5s uru4000 fdu2000 aes1610 aes1660 aes2501 aes2550 aes2660 aes3500 aes4000 vfs101 vfs301 vfs5011 upektc_img etes603" require_imaging='no' require_aeslib='no' @@ -45,6 +45,7 @@ enable_aes3500='no' enable_aes4000='no' enable_vfs101='no' enable_vfs301='no' +enable_vfs5011='no' enable_upektc_img='no' enable_etes603='no' @@ -137,6 +138,10 @@ for driver in `echo ${drivers} | sed -e 's/,/ /g' -e 's/,$//g'`; do AC_DEFINE([ENABLE_VFS301], [], [Build Validity VFS301/VFS300 driver]) enable_vfs301="yes" ;; + vfs5011) + AC_DEFINE([ENABLE_VFS5011], [], [Build Validity VFS5011 driver]) + enable_vfs5011="yes" + ;; upektc_img) AC_DEFINE([ENABLE_UPEKTC_IMG], [], [Build Upek TouchChip Fingerprint Coprocessor driver]) enable_upektc_img="yes" @@ -167,6 +172,7 @@ AM_CONDITIONAL([REQUIRE_AESX660], [test "$require_aesX660" = "yes"]) AM_CONDITIONAL([REQUIRE_AES3K], [test "$require_aes3k" = "yes"]) AM_CONDITIONAL([ENABLE_VFS101], [test "$enable_vfs101" = "yes"]) AM_CONDITIONAL([ENABLE_VFS301], [test "$enable_vfs301" = "yes"]) +AM_CONDITIONAL([ENABLE_VFS5011], [test "$enable_vfs5011" = "yes"]) AM_CONDITIONAL([ENABLE_UPEKTC_IMG], [test "$enable_upektc_img" = "yes"]) AM_CONDITIONAL([ENABLE_ETES603], [test "$enable_etes603" = "yes"]) @@ -375,6 +381,11 @@ if test x$enable_vfs301 != xno ; then else AC_MSG_NOTICE([ vfs301 driver disabled]) fi +if test x$enable_vfs5011 != xno ; then + AC_MSG_NOTICE([** vfs5011 driver enabled]) +else + AC_MSG_NOTICE([ vfs5011 driver disabled]) +fi if test x$enable_upektc_img != xno ; then AC_MSG_NOTICE([** upektc_img driver enabled]) else diff --git a/libfprint/Makefile.am b/libfprint/Makefile.am index c216d49e..b86d0f8e 100644 --- a/libfprint/Makefile.am +++ b/libfprint/Makefile.am @@ -18,6 +18,7 @@ FDU2000_SRC = drivers/fdu2000.c VCOM5S_SRC = drivers/vcom5s.c VFS101_SRC = drivers/vfs101.c VFS301_SRC = drivers/vfs301.c drivers/vfs301_proto.c drivers/vfs301_proto.h drivers/vfs301_proto_fragments.h +VFS5011_SRC = drivers/vfs5011.c drivers/vfs5011_proto.h UPEKTC_IMG_SRC = drivers/upektc_img.c drivers/upektc_img.h ETES603_SRC = drivers/etes603.c @@ -38,6 +39,7 @@ EXTRA_DIST = \ $(VCOM5S_SRC) \ $(VFS101_SRC) \ $(VFS301_SRC) \ + $(VFS5011_SRC) \ $(UPEKTC_IMG_SRC) \ $(ETES603_SRC) \ drivers/aesx660.c \ @@ -168,6 +170,10 @@ if ENABLE_VFS301 DRIVER_SRC += $(VFS301_SRC) endif +if ENABLE_VFS5011 +DRIVER_SRC += $(VFS5011_SRC) +endif + if ENABLE_UPEKTC_IMG DRIVER_SRC += $(UPEKTC_IMG_SRC) endif diff --git a/libfprint/core.c b/libfprint/core.c index cde8f488..2ae76497 100644 --- a/libfprint/core.c +++ b/libfprint/core.c @@ -386,6 +386,9 @@ static struct fp_img_driver * const img_drivers[] = { #ifdef ENABLE_VFS301 &vfs301_driver, #endif +#ifdef ENABLE_VFS5011 + &vfs5011_driver, +#endif #ifdef ENABLE_UPEKTC &upektc_driver, #endif diff --git a/libfprint/drivers/driver_ids.h b/libfprint/drivers/driver_ids.h index b3c6ee6f..4d8414c7 100644 --- a/libfprint/drivers/driver_ids.h +++ b/libfprint/drivers/driver_ids.h @@ -39,6 +39,7 @@ enum { AES3500_ID = 16, UPEKTC_IMG_ID = 17, ETES603_ID = 18, + VFS5011_ID = 19, }; #endif diff --git a/libfprint/drivers/vfs5011.c b/libfprint/drivers/vfs5011.c new file mode 100644 index 00000000..38a9ef9d --- /dev/null +++ b/libfprint/drivers/vfs5011.c @@ -0,0 +1,1020 @@ +/* + * Validity Sensors, Inc. VFS5011 Fingerprint Reader driver for libfprint + * Copyright (C) 2013 Arseniy Lartsev + * AceLan Kao + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include "driver_ids.h" + +#include "vfs5011_proto.h" + +/* =================== sync/async USB transfer sequence ==================== */ + +enum { + ACTION_SEND, + ACTION_RECEIVE, +}; + +struct usb_action { + int type; + const char *name; + int endpoint; + int size; + unsigned char *data; + int correct_reply_size; +}; + +#define SEND(ENDPOINT, COMMAND) \ +{ \ + .type = ACTION_SEND, \ + .endpoint = ENDPOINT, \ + .name = #COMMAND, \ + .size = sizeof(COMMAND), \ + .data = COMMAND \ +}, + +#define RECV(ENDPOINT, SIZE) \ +{ \ + .type = ACTION_RECEIVE, \ + .endpoint = ENDPOINT, \ + .size = SIZE, \ + .data = NULL \ +}, + +#define RECV_CHECK(ENDPOINT, SIZE, EXPECTED) \ +{ \ + .type = ACTION_RECEIVE, \ + .endpoint = ENDPOINT, \ + .size = SIZE, \ + .data = EXPECTED, \ + .correct_reply_size = sizeof(EXPECTED) \ +}, + +struct usbexchange_data { + int stepcount; + struct fp_img_dev *device; + struct usb_action *actions; + void *receive_buf; + int timeout; +}; + +static void async_send_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + struct usbexchange_data *data = (struct usbexchange_data *)ssm->priv; + struct usb_action *action; + + if (ssm->cur_state >= data->stepcount) { + fp_err("Radiation detected!"); + fpi_imgdev_session_error(data->device, -EINVAL); + fpi_ssm_mark_aborted(ssm, -EINVAL); + goto out; + } + + action = &data->actions[ssm->cur_state]; + if (action->type != ACTION_SEND) { + fp_err("Radiation detected!"); + fpi_imgdev_session_error(data->device, -EINVAL); + fpi_ssm_mark_aborted(ssm, -EINVAL); + goto out; + } + + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + /* Transfer not completed, return IO error */ + fp_err("transfer not completed, status = %d", transfer->status); + fpi_imgdev_session_error(data->device, -EIO); + fpi_ssm_mark_aborted(ssm, -EIO); + goto out; + } + if (transfer->length != transfer->actual_length) { + /* Data sended mismatch with expected, return protocol error */ + fp_err("length mismatch, got %d, expected %d", + transfer->actual_length, transfer->length); + fpi_imgdev_session_error(data->device, -EIO); + fpi_ssm_mark_aborted(ssm, -EIO); + goto out; + } + + /* success */ + fpi_ssm_next_state(ssm); + +out: + libusb_free_transfer(transfer); +} + +static void async_recv_cb(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = transfer->user_data; + struct usbexchange_data *data = (struct usbexchange_data *)ssm->priv; + struct usb_action *action; + + if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { + /* Transfer not completed, return IO error */ + fp_err("transfer not completed, status = %d", transfer->status); + fpi_imgdev_session_error(data->device, -EIO); + fpi_ssm_mark_aborted(ssm, -EIO); + goto out; + } + + if (ssm->cur_state >= data->stepcount) { + fp_err("Radiation detected!"); + fpi_imgdev_session_error(data->device, -EINVAL); + fpi_ssm_mark_aborted(ssm, -EINVAL); + goto out; + } + + action = &data->actions[ssm->cur_state]; + if (action->type != ACTION_RECEIVE) { + fp_err("Radiation detected!"); + fpi_imgdev_session_error(data->device, -EINVAL); + fpi_ssm_mark_aborted(ssm, -EINVAL); + goto out; + } + + if (action->data != NULL) { + if (transfer->actual_length != action->correct_reply_size) { + fp_err("Got %d bytes instead of %d", + transfer->actual_length, + action->correct_reply_size); + fpi_imgdev_session_error(data->device, -EIO); + fpi_ssm_mark_aborted(ssm, -EIO); + goto out; + } + if (memcmp(transfer->buffer, action->data, + action->correct_reply_size) != 0) { + fp_dbg("Wrong reply:"); + fpi_imgdev_session_error(data->device, -EIO); + fpi_ssm_mark_aborted(ssm, -EIO); + goto out; + } + } else + fp_dbg("Got %d bytes out of %d", transfer->actual_length, + transfer->length); + + fpi_ssm_next_state(ssm); +out: + libusb_free_transfer(transfer); +} + +static void usbexchange_loop(struct fpi_ssm *ssm) +{ + struct usbexchange_data *data = (struct usbexchange_data *)ssm->priv; + if (ssm->cur_state >= data->stepcount) { + fp_err("Bug detected: state %d out of range, only %d steps", + ssm->cur_state, data->stepcount); + fpi_imgdev_session_error(data->device, -EINVAL); + fpi_ssm_mark_aborted(ssm, -EINVAL); + return; + } + + struct usb_action *action = &data->actions[ssm->cur_state]; + struct libusb_transfer *transfer; + int ret = -EINVAL; + + switch (action->type) { + case ACTION_SEND: + fp_dbg("Sending %s", action->name); + transfer = libusb_alloc_transfer(0); + if (transfer == NULL) { + fp_err("Failed to allocate transfer"); + fpi_imgdev_session_error(data->device, -ENOMEM); + fpi_ssm_mark_aborted(ssm, -ENOMEM); + return; + } + libusb_fill_bulk_transfer(transfer, data->device->udev, + action->endpoint, action->data, + action->size, async_send_cb, ssm, + data->timeout); + ret = libusb_submit_transfer(transfer); + break; + + case ACTION_RECEIVE: + fp_dbg("Receiving %d bytes", action->size); + transfer = libusb_alloc_transfer(0); + if (transfer == NULL) { + fp_err("Failed to allocate transfer"); + fpi_imgdev_session_error(data->device, -ENOMEM); + fpi_ssm_mark_aborted(ssm, -ENOMEM); + return; + } + libusb_fill_bulk_transfer(transfer, data->device->udev, + action->endpoint, data->receive_buf, + action->size, async_recv_cb, ssm, + data->timeout); + ret = libusb_submit_transfer(transfer); + break; + + default: + fp_err("Bug detected: invalid action %d", action->type); + fpi_imgdev_session_error(data->device, -EINVAL); + fpi_ssm_mark_aborted(ssm, -EINVAL); + return; + } + + if (ret != 0) { + fp_err("USB transfer error: %s", strerror(ret)); + fpi_imgdev_session_error(data->device, ret); + fpi_ssm_mark_aborted(ssm, ret); + } +} + +static void usb_exchange_async(struct fpi_ssm *ssm, + struct usbexchange_data *data) +{ + struct fpi_ssm *subsm = fpi_ssm_new(data->device->dev, + usbexchange_loop, + data->stepcount); + subsm->priv = data; + fpi_ssm_start_subsm(ssm, subsm); +} + +/* ====================== utils ======================= */ + +#if VFS5011_LINE_SIZE > INT_MAX/(256*256) +#error We might get integer overflow while computing standard deviation! +#endif + +/* Calculade squared standand deviation */ +static int get_deviation(unsigned char *buf, int size) +{ + int res = 0, mean = 0, i; + for (i = 0; i < size; i++) + mean += buf[i]; + + mean /= size; + + for (i = 0; i < size; i++) { + int dev = (int)buf[i] - mean; + res += dev*dev; + } + + return res / size; +} + +/* Calculate mean square difference of two lines */ +static int get_diff_norm(unsigned char *buf1, unsigned char *buf2, int size) +{ + int res = 0, i; + for (i = 0; i < size; i++) { + int dev = (int)buf1[i] - (int)buf2[i]; + res += dev*dev; + } + + return res / size; +} + +/* Calculade squared standand deviation of sum of two lines */ +static int get_deviation2(unsigned char *buf1, unsigned char *buf2, int size) +{ + int res = 0, mean = 0, i; + for (i = 0; i < size; i++) + mean += (int)buf1[i] + (int)buf2[i]; + + mean /= size; + + for (i = 0; i < size; i++) { + int dev = (int)buf1[i] + (int)buf2[i] - mean; + res += dev*dev; + } + + return res / size; +} + +static int cmpint(const void *p1, const void *p2, gpointer data) +{ + int a = *((int *)p1); + int b = *((int *)p2); + if (a < b) + return -1; + else if (a == b) + return 0; + else + return 1; +} + +static void median_filter(int *data, int size, int filtersize) +{ + int i; + int *result = (int *)g_malloc0(size*sizeof(int)); + int *sortbuf = (int *)g_malloc0(filtersize*sizeof(int)); + for (i = 0; i < size; i++) { + int i1 = i - (filtersize-1)/2; + int i2 = i + (filtersize-1)/2; + if (i1 < 0) + i1 = 0; + if (i2 >= size) + i2 = size-1; + g_memmove(sortbuf, data+i1, (i2-i1+1)*sizeof(int)); + g_qsort_with_data(sortbuf, i2-i1+1, sizeof(int), cmpint, NULL); + result[i] = sortbuf[(i2-i1+1)/2]; + } + memmove(data, result, size*sizeof(int)); + g_free(result); + g_free(sortbuf); +} + +void interpolate_lines(unsigned char *line1, float y1, unsigned char *line2, + float y2, unsigned char *output, float yi, int size) +{ + int i; + for (i = 0; i < size; i++) + output[i] = (float)line1[i] + + (yi-y1)/(y2-y1)*(line2[i]-line1[i]); +} + +int min(int a, int b) {return (a < b) ? a : b; } + +/* Rescale image to account for variable swiping speed */ +int vfs5011_rescale_image(unsigned char *image, int input_lines, + unsigned char *output, int max_output_lines) +{ + /* Number of output lines per distance between two scanners */ + enum { + RESOLUTION = 10, + MEDIAN_FILTER_SIZE = 13, + MAX_OFFSET = 10, + GOOD_OFFSETS_CRITERION = 20, + GOOD_OFFSETS_THRESHOLD = 3 + }; + int i; + float y = 0.0; + int line_ind = 0; + int *offsets = (int *)g_malloc0(input_lines * sizeof(int)); +#ifdef ENABLE_DEBUG_LOGGING + gint64 start_time = g_get_real_time(); +#endif + + for (i = 0; i < input_lines-1; i += 2) { + int bestmatch = i; + int bestdiff = 0; + int j; + + int firstrow, lastrow; + firstrow = i+1; + lastrow = min(i + MAX_OFFSET, input_lines-1); + + for (j = firstrow; j <= lastrow; j++) { + int diff = get_deviation2( + image + i*VFS5011_LINE_SIZE + 56, + image + j*VFS5011_LINE_SIZE + 168, + 64); + if ((j == firstrow) || (diff < bestdiff)) { + bestdiff = diff; + bestmatch = j; + } + } + offsets[i/2] = bestmatch - i; + fp_dbg("offsets: %llu - %d", start_time, offsets[i/2]); + } + + median_filter(offsets, input_lines-1, MEDIAN_FILTER_SIZE); + + fp_dbg("offsets_filtered: %llu", g_get_real_time()); + for (i = 0; i <= input_lines/2-1; i++) + fp_dbg("%d", offsets[i]); + for (i = 0; i < input_lines-1; i++) { + int offset = offsets[i/2]; + if (offset > 0) { + float ynext = y + (float)RESOLUTION / offset; + while (line_ind < ynext) { + if (line_ind > max_output_lines-1) { + g_free(offsets); + return line_ind; + } + interpolate_lines( + image + i*VFS5011_LINE_SIZE + 8, y, + image + (i+1)*VFS5011_LINE_SIZE + 8, + ynext, + output + line_ind*VFS5011_IMAGE_WIDTH, + line_ind, + VFS5011_IMAGE_WIDTH); + line_ind++; + } + y = ynext; + } + } + g_free(offsets); + return line_ind; +} + +/* ====================== main stuff ======================= */ + +enum { + CAPTURE_LINES = 256, + MAXLINES = 2000, + MAX_CAPTURE_LINES = 100000, +}; + +struct vfs5011_data { + unsigned char *total_buffer; + unsigned char *capture_buffer; + unsigned char *image_buffer; + unsigned char *lastline; + unsigned char *rescale_buffer; + int lines_captured, lines_recorded, empty_lines; + int max_lines_captured, max_lines_recorded; + int lines_total, lines_total_allocated; + gboolean loop_running; + gboolean deactivating; + struct usbexchange_data init_sequence; +}; + +enum { + DEV_ACTIVATE_REQUEST_FPRINT, + DEV_ACTIVATE_INIT_COMPLETE, + DEV_ACTIVATE_READ_DATA, + DEV_ACTIVATE_DATA_COMPLETE, + DEV_ACTIVATE_PREPARE_NEXT_CAPTURE, + DEV_ACTIVATE_NUM_STATES +}; + +enum { + DEV_OPEN_START, + DEV_OPEN_NUM_STATES +}; + +static void capture_init(struct vfs5011_data *data, int max_captured, + int max_recorded) +{ + fp_dbg("capture_init"); + data->lastline = NULL; + data->lines_captured = 0; + data->lines_recorded = 0; + data->empty_lines = 0; + data->lines_total = 0; + data->lines_total_allocated = 0; + data->total_buffer = NULL; + data->max_lines_captured = max_captured; + data->max_lines_recorded = max_recorded; +} + +static int process_chunk(struct vfs5011_data *data, int transferred) +{ + enum { + DEVIATION_THRESHOLD = 15*15, + DIFFERENCE_THRESHOLD = 600, + STOP_CHECK_LINES = 50 + }; + + fp_dbg("process_chunk: got %d bytes", transferred); + int lines_captured = transferred/VFS5011_LINE_SIZE; + int i; + + for (i = 0; i < lines_captured; i++) { + unsigned char *linebuf = data->capture_buffer + + i * VFS5011_LINE_SIZE; + + if (get_deviation(linebuf + 8, VFS5011_IMAGE_WIDTH) + < DEVIATION_THRESHOLD) { + if (data->lines_captured == 0) + continue; + else + data->empty_lines++; + } else + data->empty_lines = 0; + if (data->empty_lines >= STOP_CHECK_LINES) { + fp_dbg("process_chunk: got %d empty lines, finishing", + data->empty_lines); + return 1; + } + + data->lines_captured++; + if (data->lines_captured > data->max_lines_captured) { + fp_dbg("process_chunk: captured %d lines, finishing", + data->lines_captured); + return 1; + } + + if ((data->lastline == NULL) + || (get_diff_norm( + data->lastline + 8, + linebuf + 8, + VFS5011_IMAGE_WIDTH) >= DIFFERENCE_THRESHOLD)) { + data->lastline = data->image_buffer + + data->lines_recorded + * VFS5011_LINE_SIZE; + memmove(data->lastline, linebuf, VFS5011_LINE_SIZE); + data->lines_recorded++; + if (data->lines_recorded >= data->max_lines_recorded) { + fp_dbg("process_chunk: recorded %d lines, finishing", + data->lines_recorded); + return 1; + } + } + } + return 0; +} + +void submit_image(struct fpi_ssm *ssm, struct vfs5011_data *data) +{ + struct fp_img_dev *dev = (struct fp_img_dev *)ssm->priv; + int height = vfs5011_rescale_image(data->image_buffer, + data->lines_recorded, + data->rescale_buffer, MAXLINES); + struct fp_img *img = fpi_img_new(VFS5011_IMAGE_WIDTH * height); + + if (img == NULL) { + fp_err("Failed to create image"); + fpi_ssm_mark_aborted(ssm, -1); + } + + img->flags = FP_IMG_V_FLIPPED; + img->width = VFS5011_IMAGE_WIDTH; + img->height = height; + memmove(img->data, data->rescale_buffer, VFS5011_IMAGE_WIDTH * height); + + fp_dbg("Image captured, commiting"); + + fpi_imgdev_image_captured(dev, img); +} + +static void chunk_capture_callback(struct libusb_transfer *transfer) +{ + struct fpi_ssm *ssm = (struct fpi_ssm *)transfer->user_data; + struct fp_img_dev *dev = (struct fp_img_dev *)ssm->priv; + struct vfs5011_data *data = (struct vfs5011_data *)dev->priv; + + if ((transfer->status == LIBUSB_TRANSFER_COMPLETED) || + (transfer->status == LIBUSB_TRANSFER_TIMED_OUT)) { + + if (transfer->actual_length > 0) + fpi_imgdev_report_finger_status(dev, TRUE); + + if (process_chunk(data, transfer->actual_length)) + fpi_ssm_jump_to_state(ssm, DEV_ACTIVATE_DATA_COMPLETE); + else + fpi_ssm_jump_to_state(ssm, DEV_ACTIVATE_READ_DATA); + } else { + fp_err("Failed to capture data"); + fpi_ssm_mark_aborted(ssm, -1); + } + libusb_free_transfer(transfer); +} + +static int capture_chunk_async(struct vfs5011_data *data, + libusb_device_handle *handle, int nline, + int timeout, struct fpi_ssm *ssm) +{ + fp_dbg("capture_chunk_async: capture %d lines, already have %d", + nline, data->lines_recorded); + enum { + DEVIATION_THRESHOLD = 15*15, + DIFFERENCE_THRESHOLD = 600, + STOP_CHECK_LINES = 50 + }; + + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + libusb_fill_bulk_transfer(transfer, handle, VFS5011_IN_ENDPOINT_DATA, + data->capture_buffer, + nline * VFS5011_LINE_SIZE, + chunk_capture_callback, ssm, timeout); + return libusb_submit_transfer(transfer); +} + +static void async_sleep_cb(void *data) +{ + struct fpi_ssm *ssm = data; + + fpi_ssm_next_state(ssm); +} + +/* + * Device initialization. Windows driver only does it when the device is + * plugged in, but it doesn't harm to do this every time before scanning the + * image. + */ +struct usb_action vfs5011_initialization[] = { + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_01) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_19) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) /* B5C457F9 */ + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_00) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) /* 0000FFFFFFFF */ + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_01) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) /* 0000FFFFFFFFFF */ + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_02) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_01) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_03) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_04) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV(VFS5011_IN_ENDPOINT_DATA, 256) + RECV(VFS5011_IN_ENDPOINT_DATA, 64) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_05) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_01) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_06) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV(VFS5011_IN_ENDPOINT_DATA, 17216) + RECV(VFS5011_IN_ENDPOINT_DATA, 32) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_07) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV(VFS5011_IN_ENDPOINT_DATA, 45056) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_08) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV(VFS5011_IN_ENDPOINT_DATA, 16896) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_09) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV(VFS5011_IN_ENDPOINT_DATA, 4928) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_10) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV(VFS5011_IN_ENDPOINT_DATA, 5632) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_11) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV(VFS5011_IN_ENDPOINT_DATA, 5632) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_12) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV(VFS5011_IN_ENDPOINT_DATA, 3328) + RECV(VFS5011_IN_ENDPOINT_DATA, 64) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_13) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_03) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_14) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + RECV(VFS5011_IN_ENDPOINT_DATA, 4800) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_02) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_27) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_15) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_16) + RECV(VFS5011_IN_ENDPOINT_CTRL, 2368) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + RECV(VFS5011_IN_ENDPOINT_DATA, 4800) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_17) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_init_18) + /* 0000 */ + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + /* + * Windows driver does this and it works + * But in this driver this call never returns... + * RECV(VFS5011_IN_ENDPOINT_CTRL2, 8) //00D3054000 + */ +}; + +/* Initiate recording the image */ +struct usb_action vfs5011_initiate_capture[] = { + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_04) + RECV(VFS5011_IN_ENDPOINT_DATA, 64) + RECV(VFS5011_IN_ENDPOINT_DATA, 84032) + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_00) + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_cmd_1A) + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_01) + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_02) + RECV(VFS5011_IN_ENDPOINT_CTRL, 2368) + RECV(VFS5011_IN_ENDPOINT_CTRL, 64) + RECV(VFS5011_IN_ENDPOINT_DATA, 4800) + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_03) + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 64, VFS5011_NORMAL_CONTROL_REPLY) + /* + * Windows driver does this and it works + * But in this driver this call never returns... + * RECV(VFS5011_IN_ENDPOINT_CTRL2, 8); + */ + + SEND(VFS5011_OUT_ENDPOINT, vfs5011_prepare_04) + RECV_CHECK(VFS5011_IN_ENDPOINT_CTRL, 2368, VFS5011_NORMAL_CONTROL_REPLY) + + /* + * Windows driver does this and it works + * But in this driver this call never returns... + * RECV(VFS5011_IN_ENDPOINT_CTRL2, 8); + */ +}; + +/* ====================== lifprint interface ======================= */ + +static void activate_loop(struct fpi_ssm *ssm) +{ + enum {READ_TIMEOUT = 0}; + + struct fp_img_dev *dev = (struct fp_img_dev *)ssm->priv; + struct vfs5011_data *data = (struct vfs5011_data *)dev->priv; + int r; + struct fpi_timeout *timeout; + + fp_dbg("main_loop: state %d", ssm->cur_state); + + switch (ssm->cur_state) { + case DEV_ACTIVATE_REQUEST_FPRINT: + data->init_sequence.stepcount = + array_n_elements(vfs5011_initiate_capture); + data->init_sequence.actions = vfs5011_initiate_capture; + data->init_sequence.device = dev; + if (data->init_sequence.receive_buf == NULL) + data->init_sequence.receive_buf = + g_malloc0(VFS5011_RECEIVE_BUF_SIZE); + data->init_sequence.timeout = 1000; + usb_exchange_async(ssm, &data->init_sequence); + break; + + case DEV_ACTIVATE_INIT_COMPLETE: + if (data->init_sequence.receive_buf != NULL) + g_free(data->init_sequence.receive_buf); + data->init_sequence.receive_buf = NULL; + capture_init(data, MAX_CAPTURE_LINES, MAXLINES); + fpi_imgdev_activate_complete(dev, 0); + fpi_ssm_next_state(ssm); + break; + + case DEV_ACTIVATE_READ_DATA: + if (data->deactivating) { + fp_dbg("deactivating, marking completed"); + fpi_ssm_mark_completed(ssm); + } else { + r = capture_chunk_async(data, dev->udev, CAPTURE_LINES, + READ_TIMEOUT, ssm); + if (r != 0) { + fp_err("Failed to capture data"); + fpi_imgdev_session_error(dev, r); + fpi_ssm_mark_aborted(ssm, r); + } + } + break; + + case DEV_ACTIVATE_DATA_COMPLETE: + timeout = fpi_timeout_add(1, async_sleep_cb, ssm); + + if (timeout == NULL) { + /* Failed to add timeout */ + fp_err("failed to add timeout"); + fpi_imgdev_session_error(dev, -1); + fpi_ssm_mark_aborted(ssm, -1); + } + break; + + case DEV_ACTIVATE_PREPARE_NEXT_CAPTURE: + data->init_sequence.stepcount = + array_n_elements(vfs5011_initiate_capture); + data->init_sequence.actions = vfs5011_initiate_capture; + data->init_sequence.device = dev; + if (data->init_sequence.receive_buf == NULL) + data->init_sequence.receive_buf = + g_malloc0(VFS5011_RECEIVE_BUF_SIZE); + data->init_sequence.timeout = VFS5011_DEFAULT_WAIT_TIMEOUT; + usb_exchange_async(ssm, &data->init_sequence); + break; + + } +} + +static void activate_loop_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *dev = (struct fp_img_dev *)ssm->priv; + struct vfs5011_data *data = (struct vfs5011_data *)dev->priv; + int r = ssm->error; + + fp_dbg("finishing"); + if (data->init_sequence.receive_buf != NULL) + g_free(data->init_sequence.receive_buf); + data->init_sequence.receive_buf = NULL; + data->loop_running = FALSE; + submit_image(ssm, data); + fpi_imgdev_report_finger_status(dev, FALSE); + + fpi_ssm_free(ssm); + + if (r) + fpi_imgdev_session_error(dev, r); + + if (data->deactivating) + fpi_imgdev_deactivate_complete(dev); +} + +static void open_loop(struct fpi_ssm *ssm) +{ + struct fp_img_dev *dev = (struct fp_img_dev *)ssm->priv; + struct vfs5011_data *data = (struct vfs5011_data *)dev->priv; + + switch (ssm->cur_state) { + case DEV_OPEN_START: + data->init_sequence.stepcount = + array_n_elements(vfs5011_initialization); + data->init_sequence.actions = vfs5011_initialization; + data->init_sequence.device = dev; + data->init_sequence.receive_buf = + g_malloc0(VFS5011_RECEIVE_BUF_SIZE); + data->init_sequence.timeout = VFS5011_DEFAULT_WAIT_TIMEOUT; + usb_exchange_async(ssm, &data->init_sequence); + break; + }; +} + +static void open_loop_complete(struct fpi_ssm *ssm) +{ + struct fp_img_dev *dev = (struct fp_img_dev *)ssm->priv; + struct vfs5011_data *data = (struct vfs5011_data *)dev->priv; + + g_free(data->init_sequence.receive_buf); + data->init_sequence.receive_buf = NULL; + + fpi_imgdev_open_complete(dev, 0); + fpi_ssm_free(ssm); +} + +static int dev_open(struct fp_img_dev *dev, unsigned long driver_data) +{ + + struct vfs5011_data *data; + int r; + + data = (struct vfs5011_data *)g_malloc0(sizeof(*data)); + data->capture_buffer = + (unsigned char *)g_malloc0(CAPTURE_LINES * VFS5011_LINE_SIZE); + data->image_buffer = + (unsigned char *)g_malloc0(MAXLINES * VFS5011_LINE_SIZE); + data->rescale_buffer = + (unsigned char *)g_malloc0(MAXLINES * VFS5011_IMAGE_WIDTH); + dev->priv = data; + + dev->dev->nr_enroll_stages = 1; + + r = libusb_reset_device(dev->udev); + if (r != 0) { + fp_err("Failed to reset the device"); + return r; + } + + r = libusb_claim_interface(dev->udev, 0); + if (r != 0) { + fp_err("Failed to claim interface"); + return r; + } + + struct fpi_ssm *ssm; + ssm = fpi_ssm_new(dev->dev, open_loop, DEV_OPEN_NUM_STATES); + ssm->priv = dev; + fpi_ssm_start(ssm, open_loop_complete); + + return 0; +} + +static void dev_close(struct fp_img_dev *dev) +{ + libusb_release_interface(dev->udev, 0); + struct vfs5011_data *data = (struct vfs5011_data *)dev->priv; + if (data != NULL) { + g_free(data->capture_buffer); + g_free(data->image_buffer); + g_free(data->rescale_buffer); + g_free(data); + } + fpi_imgdev_close_complete(dev); +} + +static int dev_activate(struct fp_img_dev *dev, enum fp_imgdev_state state) +{ + struct vfs5011_data *data = (struct vfs5011_data *)dev->priv; + struct fpi_ssm *ssm; + + fp_dbg("device initialized"); + data->deactivating = FALSE; + data->loop_running = TRUE; + + fp_dbg("creating ssm"); + ssm = fpi_ssm_new(dev->dev, activate_loop, DEV_ACTIVATE_NUM_STATES); + ssm->priv = dev; + fp_dbg("starting ssm"); + fpi_ssm_start(ssm, activate_loop_complete); + fp_dbg("ssm done, getting out"); + + return 0; +} + +static void dev_deactivate(struct fp_img_dev *dev) +{ + struct vfs5011_data *data = dev->priv; + if (data->loop_running) + data->deactivating = TRUE; + else + fpi_imgdev_deactivate_complete(dev); +} + +static const struct usb_id id_table[] = { + { .vendor = 0x138a, .product = 0x0011 /* vfs5011 */ }, + { .vendor = 0x138a, .product = 0x0017 /* Validity device from Lenovo T440 laptops */ }, + { .vendor = 0x138a, .product = 0x0018 /* one more Validity device */ }, + { 0, 0, 0, }, +}; + +struct fp_img_driver vfs5011_driver = { + .driver = { + .id = VFS5011_ID, + .name = "vfs5011", + .full_name = "Validity VFS5011", + .id_table = id_table, + .scan_type = FP_SCAN_TYPE_SWIPE, + }, + + .flags = 0, + .img_width = VFS5011_IMAGE_WIDTH, + .img_height = -1, + .bz3_threshold = 20, + + .open = dev_open, + .close = dev_close, + .activate = dev_activate, + .deactivate = dev_deactivate, +}; + diff --git a/libfprint/drivers/vfs5011_proto.h b/libfprint/drivers/vfs5011_proto.h new file mode 100644 index 00000000..8cd0ea80 --- /dev/null +++ b/libfprint/drivers/vfs5011_proto.h @@ -0,0 +1,6186 @@ +#ifndef __VFS5011_PROTO_H +#define __VFS5011_PROTO_H + +#define VFS5011_LINE_SIZE 240 +#define VFS5011_IMAGE_WIDTH 160 + +enum { + VFS5011_DEFAULT_WAIT_TIMEOUT = 3000, + + VFS5011_OUT_ENDPOINT = 1 | LIBUSB_ENDPOINT_OUT, + VFS5011_IN_ENDPOINT_CTRL = 1 | LIBUSB_ENDPOINT_IN, + VFS5011_IN_ENDPOINT_DATA = 2 | LIBUSB_ENDPOINT_IN, + VFS5011_IN_ENDPOINT_CTRL2 = 3 | LIBUSB_ENDPOINT_IN, +}; + +enum { + VFS5011_RECEIVE_BUF_SIZE = 102400 +}; + +static unsigned char VFS5011_NORMAL_CONTROL_REPLY[] = {0x00, 0x00}; + +static unsigned char vfs5011_cmd_01[] = { /* 1 B */ + 0x01, +}; + +static unsigned char vfs5011_cmd_19[] = { /* 1 B */ + 0x19, +}; + +static unsigned char vfs5011_init_00[] = { /* 39 B */ + 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x00, +}; + +static unsigned char vfs5011_init_01[] = { /* 40 B */ + 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xAB, 0x00, 0x00, 0x00, 0x00, + +}; + +static unsigned char vfs5011_init_02[] = { /* 578 B */ + 0x06, 0x9C, 0xF1, 0x9D, 0x71, 0xC3, 0x13, 0xDF, + 0x5F, 0xE4, 0x7A, 0x1F, 0xC7, 0x17, 0x53, 0x9A, + 0x1A, 0xA1, 0xD7, 0xB6, 0x6E, 0xBE, 0xDF, 0x1F, + 0x9F, 0x44, 0x42, 0x22, 0xFA, 0x2A, 0x6A, 0xAB, + 0x2B, 0xF0, 0x56, 0x39, 0xE3, 0x7B, 0x53, 0x9A, + 0x1A, 0xA1, 0xDB, 0xBA, 0x62, 0xB2, 0xE4, 0x65, + 0xE5, 0xDB, 0x68, 0x04, 0x79, 0x98, 0xDE, 0x8F, + 0x23, 0xFB, 0xEC, 0xAD, 0x76, 0xCA, 0xA2, 0xEB, + 0x61, 0x38, 0xC7, 0xAB, 0x6E, 0x2E, 0x78, 0xF9, + 0x79, 0x13, 0x8A, 0xE5, 0x90, 0x22, 0x63, 0x8D, + 0x0E, 0x93, 0x25, 0x49, 0x5A, 0xC8, 0xA3, 0xD8, + 0x7E, 0xAE, 0x12, 0xF6, 0x2C, 0x1C, 0xFC, 0x48, + 0x4F, 0x0E, 0x48, 0x22, 0xFB, 0x4B, 0xCE, 0x7E, + 0xDB, 0x2D, 0x91, 0xE0, 0xC8, 0x78, 0x2E, 0xAF, + 0x2F, 0xD4, 0x03, 0x6F, 0x12, 0x59, 0xC6, 0x26, + 0x40, 0x88, 0x2E, 0x62, 0xBA, 0x06, 0x6C, 0xC9, + 0x7A, 0x84, 0x93, 0xCF, 0x14, 0x15, 0x44, 0x87, + 0xE2, 0x09, 0x97, 0xE6, 0xCE, 0x7E, 0x28, 0xA9, + 0x29, 0x53, 0xD7, 0xB8, 0xD1, 0x53, 0x30, 0x15, + 0x6E, 0x95, 0x3E, 0xA2, 0x7A, 0xCA, 0x9C, 0x1D, + 0x9D, 0xEB, 0x5F, 0x15, 0xEF, 0x48, 0x34, 0xCC, + 0xCB, 0x02, 0xA6, 0xD6, 0xA7, 0x80, 0xF2, 0x3F, + 0x7E, 0x96, 0x23, 0xAE, 0x42, 0xF1, 0x29, 0xF5, + 0xAD, 0x5A, 0x35, 0x57, 0x36, 0xAA, 0xAF, 0x97, + 0xE8, 0x1E, 0xA2, 0xD3, 0xFB, 0x4B, 0x1D, 0x9C, + 0x1C, 0x06, 0x84, 0xEB, 0x9E, 0x2C, 0xD4, 0x18, + 0x94, 0x44, 0x7E, 0x4B, 0x12, 0x91, 0xF2, 0x8B, + 0x07, 0x45, 0xDB, 0x52, 0xBB, 0x2E, 0x53, 0x63, + 0xE3, 0x38, 0xB8, 0x95, 0x4D, 0x9B, 0xCF, 0x07, + 0x05, 0xDD, 0x4C, 0xE2, 0x39, 0xAF, 0xA9, 0x51, + 0xDB, 0xAD, 0x19, 0xC8, 0x13, 0x6E, 0x0A, 0x2F, + 0xEA, 0x12, 0xB9, 0x25, 0x55, 0xB6, 0x64, 0x04, + 0x7F, 0x14, 0x6E, 0x12, 0x08, 0xFB, 0xBD, 0xBD, + 0x1D, 0xC6, 0xE2, 0x84, 0x50, 0x20, 0x60, 0xA0, + 0x90, 0xD2, 0x74, 0x8A, 0x18, 0xA4, 0xD9, 0xE9, + 0x69, 0xB2, 0x1E, 0x73, 0xAB, 0x1B, 0x7B, 0xBB, + 0x3B, 0xE0, 0x42, 0x23, 0xF9, 0x29, 0x49, 0x89, + 0x09, 0xD2, 0x4C, 0x29, 0xF1, 0x21, 0x65, 0xAC, + 0x2C, 0x97, 0x30, 0x6C, 0xB4, 0x04, 0xF4, 0x3D, + 0xBD, 0x06, 0xA0, 0xC6, 0x1E, 0xCE, 0x7E, 0xB3, + 0x33, 0x88, 0x2E, 0x43, 0x9B, 0x2B, 0x37, 0xF0, + 0x70, 0xCB, 0x91, 0xF1, 0x2B, 0xFB, 0x8B, 0x48, + 0xCA, 0x39, 0x97, 0xFB, 0x21, 0xB9, 0xCD, 0x0E, + 0x8C, 0x7F, 0x8D, 0xEC, 0x36, 0xE6, 0xEA, 0x27, + 0xA5, 0x1E, 0x40, 0x2A, 0xF2, 0x22, 0xCA, 0x07, + 0x85, 0x3E, 0xC8, 0xAE, 0x76, 0xA6, 0xF0, 0x71, + 0xF1, 0xAB, 0x6B, 0x04, 0x6D, 0xA9, 0xCA, 0x06, + 0x2C, 0x66, 0xA5, 0xCA, 0xB0, 0x4B, 0x2B, 0x62, + 0xEB, 0xD5, 0x61, 0x0D, 0xF0, 0x46, 0x26, 0xC3, + 0x44, 0x9F, 0x0C, 0x63, 0xBB, 0xAA, 0xBD, 0x7E, + 0xF2, 0x74, 0x00, 0x66, 0x2B, 0x7A, 0x62, 0xA1, + 0x07, 0x80, 0x33, 0x8D, 0x1F, 0xF7, 0x45, 0xCB, + 0x5E, 0x24, 0xEB, 0x84, 0xED, 0x27, 0x44, 0x61, + 0xFF, 0x0C, 0xA7, 0x3B, 0xE3, 0x53, 0x05, 0x84, + 0x04, 0xEE, 0x23, 0x4C, 0xB5, 0x79, 0x1A, 0xF3, + 0xA0, 0x66, 0x20, 0x4C, 0x94, 0x24, 0x72, 0xF3, + 0x73, 0x39, 0xF8, 0x97, 0xDD, 0x64, 0x54, 0xF2, + 0x6B, 0xBA, 0xAD, 0xBC, 0x67, 0x66, 0x78, 0xBB, + 0x5E, 0x6D, 0xFB, 0x8A, 0xA2, 0x74, 0x3D, 0xF5, + 0xD4, 0x72, 0xC7, 0x1A, 0xBD, 0x0E, 0x0B, 0x2C, + 0x8C, 0x4A, 0x0C, 0x60, 0xB8, 0x08, 0x5E, 0xDF, + 0x5F, 0x05, 0x33, 0x5C, 0xB5, 0x7E, 0x1D, 0xFC, + 0xFD, 0x25, 0xBA, 0x95, 0xC4, 0xA7, 0xDA, 0xEA, + 0x6A, 0xB1, 0x31, 0x1C, 0xC4, 0xE5, 0x07, 0xC4, + 0xC5, 0x9D, 0x28, 0xCD, 0x3C, 0xE9, 0x89, 0x49, + 0xD4, 0xFF, 0x7F, 0x52, 0x8A, 0x9B, 0x7F, 0xBC, + 0x8E, 0xF5, 0xCF, 0x0B, 0xD9, 0x49, 0x48, 0x88, + 0x80, 0x71, 0x7D, 0xAB, 0xEF, 0x47, 0x2B, 0xF7, + 0x7B, 0x2D, 0x79, 0x3F, 0xCF, 0xBF, 0xFF, 0x3F, + 0x6D, 0xF8, 0x42, 0xEC, 0x7F, 0xE8, 0xED, 0x42, + 0xE6, 0x1D, 0x4D, 0x32, 0xFA, 0x6A, 0x0A, 0xD7, + 0xA7, 0x7C, 0xCB, 0xA7, 0x7B, 0xCB, 0xBF, 0x71, + 0xF3, 0x48, +}; + +static unsigned char vfs5011_cmd_1A[] = { /* 1 B */ + 0x1A, +}; + +static unsigned char vfs5011_init_03[] = { /* 2354 B */ + 0x06, 0xFE, 0x93, 0xFF, 0x03, 0xBA, 0x6A, 0xA6, + 0x26, 0x9D, 0x03, 0x66, 0xBE, 0x6E, 0x2A, 0xE3, + 0x63, 0xD8, 0xFE, 0x9B, 0x43, 0x93, 0xD7, 0x03, + 0x83, 0x38, 0x8C, 0xE0, 0x38, 0x88, 0x58, 0x94, + 0x14, 0xAF, 0xC9, 0xA2, 0x7A, 0xCA, 0x96, 0x5E, + 0xDE, 0x65, 0x27, 0x36, 0xEA, 0x3A, 0x4E, 0x82, + 0x02, 0xB9, 0x0F, 0x4B, 0x97, 0x17, 0xF7, 0x1A, + 0x9E, 0x75, 0xC3, 0x8F, 0x53, 0xD3, 0x9F, 0x7F, + 0xFB, 0x10, 0xE6, 0xAA, 0x76, 0xF6, 0x72, 0x93, + 0x17, 0xFC, 0x4A, 0x26, 0xFE, 0x76, 0x2A, 0xEA, + 0x6A, 0x89, 0x3F, 0xF3, 0x2B, 0xA3, 0xFF, 0x9F, + 0x1F, 0xFC, 0x4A, 0x06, 0xDE, 0x56, 0x38, 0xD8, + 0x58, 0xBB, 0x0D, 0x21, 0xF9, 0x71, 0x19, 0x99, + 0x19, 0xFA, 0x4C, 0x40, 0x98, 0x10, 0x78, 0xD8, + 0x58, 0xBB, 0x0D, 0xE1, 0x39, 0xB1, 0xD9, 0x99, + 0x19, 0xFA, 0x6C, 0x7E, 0xA2, 0x72, 0xC6, 0x7D, + 0xF9, 0x42, 0xF4, 0x86, 0x5A, 0xDA, 0xD2, 0x06, + 0x86, 0x3D, 0x6F, 0x08, 0xD0, 0x00, 0xD8, 0x10, + 0x90, 0x2B, 0xFD, 0xB7, 0x6B, 0xBB, 0x67, 0xA0, + 0x20, 0x9B, 0x35, 0x36, 0xEA, 0x3A, 0xA2, 0x0C, + 0x88, 0x33, 0x7D, 0x1A, 0xC2, 0x12, 0x2A, 0xFE, + 0x7E, 0xC5, 0x8C, 0x17, 0x30, 0x7F, 0xE0, 0xCF, + 0xB0, 0x94, 0x4E, 0x36, 0xEE, 0x3E, 0x5E, 0x96, + 0x16, 0xCD, 0x9F, 0xE1, 0x3B, 0xEB, 0x8B, 0x5B, + 0xDB, 0x00, 0x8A, 0xF2, 0x2A, 0xFA, 0x0E, 0xC8, + 0x48, 0xF3, 0x6D, 0x12, 0xC8, 0x18, 0x08, 0xDC, + 0x5C, 0xE7, 0x01, 0x79, 0xA1, 0x71, 0x3D, 0xF4, + 0x74, 0xCF, 0x84, 0x17, 0xCF, 0x7F, 0xE0, 0x20, + 0x5F, 0x7B, 0xFB, 0xD6, 0x0E, 0x1B, 0x65, 0xA5, + 0x00, 0xDC, 0x6A, 0xE3, 0x7E, 0xCE, 0x4B, 0xCE, + 0x68, 0x22, 0xB8, 0xD7, 0xAE, 0x33, 0x50, 0x9C, + 0x14, 0x46, 0xFA, 0x14, 0x85, 0x35, 0x48, 0x78, + 0xF8, 0x23, 0xA3, 0x8E, 0x56, 0x77, 0x39, 0xFA, + 0x76, 0xA5, 0x91, 0xB4, 0x34, 0xE1, 0x4D, 0xA8, + 0x35, 0x1E, 0x9E, 0xB3, 0x6B, 0x6A, 0x3A, 0xF9, + 0xD4, 0x0D, 0x9A, 0xD9, 0x02, 0xF4, 0x94, 0x54, + 0x1F, 0xE6, 0x5B, 0x8C, 0x72, 0xC9, 0xA3, 0xEB, + 0x69, 0x32, 0x04, 0x1C, 0x43, 0x69, 0xF9, 0x3F, + 0xBE, 0x65, 0xF6, 0xFE, 0x03, 0x9E, 0xF4, 0x29, + 0x59, 0x82, 0x02, 0x2F, 0xF7, 0x67, 0x66, 0xA6, + 0x03, 0x22, 0x6B, 0x27, 0x19, 0xBA, 0xCA, 0x2A, + 0xAA, 0x7D, 0xC1, 0x08, 0xF6, 0x63, 0xA2, 0x53, + 0xD0, 0xBA, 0x3E, 0x51, 0xAC, 0x38, 0x70, 0xAD, + 0xDD, 0x06, 0x86, 0xAB, 0x73, 0xF2, 0xA1, 0x62, + 0xC3, 0x2C, 0x99, 0xDC, 0x47, 0xEA, 0x7A, 0xBA, + 0x3A, 0xE1, 0x61, 0x4C, 0x94, 0xA6, 0xC4, 0x09, + 0x85, 0x45, 0x73, 0x9F, 0x43, 0xA5, 0xDD, 0x1A, + 0x96, 0x48, 0xF2, 0x98, 0x02, 0xA0, 0xCE, 0x12, + 0x95, 0x74, 0x86, 0x58, 0x44, 0x75, 0x27, 0xE3, + 0x63, 0x0A, 0xB7, 0xA5, 0xBF, 0x0B, 0x6A, 0x9D, + 0xA6, 0x71, 0xF0, 0x20, 0xE9, 0x64, 0x0F, 0x08, + 0x33, 0xE4, 0x6F, 0x0F, 0x11, 0xA0, 0xC0, 0x37, + 0x8B, 0x54, 0x25, 0xF2, 0x2B, 0xA6, 0xCD, 0xA0, + 0x23, 0x45, 0xF0, 0xF9, 0x99, 0x01, 0xCB, 0x6D, + 0xB7, 0x3F, 0x82, 0x99, 0x0A, 0xFE, 0x2C, 0x28, + 0x29, 0xA4, 0x85, 0x15, 0x60, 0xD5, 0x08, 0xCD, + 0x68, 0x04, 0x9A, 0xFA, 0x39, 0x5B, 0x99, 0x35, + 0x15, 0x0A, 0xFD, 0x51, 0x4F, 0x3F, 0x85, 0x97, + 0xE5, 0x23, 0x17, 0xBB, 0xA7, 0x56, 0xF6, 0xB5, + 0x74, 0x5F, 0x06, 0x9A, 0xA2, 0xF1, 0xB0, 0xFA, + 0x94, 0xBF, 0xC7, 0x38, 0x22, 0xCF, 0x2D, 0xEB, + 0x68, 0xB3, 0xC7, 0x09, 0xBD, 0xC7, 0x65, 0x67, + 0xFB, 0x5D, 0xD1, 0x71, 0x6B, 0xD7, 0xB7, 0xA5, + 0x37, 0xE5, 0x7E, 0x19, 0x16, 0x1A, 0x7B, 0xB7, + 0x15, 0xD3, 0x95, 0xF9, 0x21, 0x91, 0xC7, 0x46, + 0xC6, 0xAC, 0x2F, 0x40, 0x20, 0x9B, 0x77, 0xDC, + 0xFE, 0x84, 0x52, 0x94, 0xE7, 0xF2, 0x28, 0xC8, + 0xE5, 0x3C, 0x2F, 0xEF, 0x12, 0xBF, 0x2F, 0xEF, + 0x6F, 0xB4, 0x34, 0x19, 0xC1, 0xD0, 0x86, 0x45, + 0x74, 0x98, 0x2D, 0x8C, 0x56, 0x43, 0x75, 0x90, + 0xA1, 0x43, 0xF6, 0xBA, 0x48, 0x58, 0x99, 0x61, + 0xE2, 0xF4, 0x40, 0x89, 0x04, 0x91, 0x40, 0xBB, + 0x38, 0xC3, 0x4F, 0x83, 0x99, 0xEA, 0x9A, 0xFB, + 0x41, 0x99, 0x23, 0x4D, 0xBC, 0x0F, 0x46, 0x95, + 0x3C, 0xC4, 0x5B, 0x04, 0xF9, 0x1D, 0x58, 0x29, + 0x94, 0x4C, 0xCA, 0x9C, 0xE4, 0x96, 0x35, 0xE5, + 0xC4, 0x23, 0x96, 0xDF, 0x54, 0xC1, 0xAD, 0x64, + 0xD4, 0x35, 0x23, 0x7D, 0x66, 0xC6, 0xBD, 0xE4, + 0x4D, 0x95, 0x68, 0x37, 0x89, 0xA0, 0x36, 0x5B, + 0xD8, 0xB1, 0xA7, 0x6E, 0x9A, 0x66, 0x23, 0x41, + 0xE9, 0x93, 0x1B, 0x74, 0x1D, 0x92, 0xF1, 0xF3, + 0xB0, 0x4F, 0x5C, 0x60, 0x9D, 0x9C, 0xBD, 0x7E, + 0xCE, 0x2F, 0x39, 0xF4, 0x6C, 0xDF, 0x8D, 0x8E, + 0x2A, 0x3C, 0x89, 0xC0, 0x4A, 0xDF, 0x0E, 0x8D, + 0x0E, 0xE5, 0x69, 0xA5, 0xDC, 0x2E, 0x4D, 0x40, + 0xC3, 0xFD, 0x18, 0x51, 0x38, 0xCD, 0xAE, 0x5E, + 0xE4, 0x9F, 0x88, 0xA0, 0x7B, 0x06, 0x65, 0x40, + 0x92, 0x6C, 0x6B, 0x40, 0x9B, 0x1B, 0x41, 0x21, + 0x00, 0x9D, 0x28, 0x89, 0x52, 0xC7, 0xF5, 0x10, + 0xA0, 0x51, 0x47, 0x36, 0x1E, 0xAE, 0xF8, 0x79, + 0xF9, 0x07, 0x94, 0xF8, 0xA1, 0x58, 0x3B, 0x6A, + 0xD9, 0x01, 0x16, 0x32, 0xE9, 0xF0, 0xC9, 0x80, + 0x09, 0xCF, 0x89, 0xE5, 0x3D, 0x8D, 0xDB, 0x5A, + 0xDA, 0x30, 0xB3, 0xDC, 0x08, 0x9F, 0xC7, 0x04, + 0xD5, 0x44, 0xF1, 0x0F, 0xD4, 0x6C, 0x6E, 0x0F, + 0xFF, 0x2F, 0x10, 0x6A, 0xFA, 0x4C, 0xFD, 0x76, + 0xF5, 0x22, 0xFE, 0x9E, 0x41, 0x73, 0xDA, 0xE6, + 0x70, 0xA3, 0x1F, 0x55, 0xD4, 0x6C, 0xA1, 0x63, + 0x06, 0x1C, 0x8C, 0xCD, 0x1F, 0xB2, 0x22, 0x88, + 0x4B, 0x22, 0x87, 0xE0, 0xAA, 0x1E, 0x7E, 0xA8, + 0x13, 0xC3, 0x13, 0x06, 0xCE, 0xBC, 0xC8, 0xF4, + 0x22, 0x55, 0xE9, 0x27, 0xBC, 0x04, 0x46, 0x85, + 0x08, 0xF3, 0x64, 0x0C, 0xC9, 0x89, 0xE5, 0x2E, + 0x2C, 0xF4, 0x4F, 0xE1, 0x1A, 0x77, 0x00, 0xA8, + 0x27, 0x6E, 0xD5, 0xB9, 0x6D, 0xCF, 0xB9, 0x50, + 0xDE, 0x0E, 0x11, 0xDF, 0x4A, 0xFA, 0xDC, 0x1C, + 0x9C, 0x4B, 0xFF, 0x53, 0xAB, 0x1B, 0xD9, 0x0A, + 0x82, 0x9B, 0x48, 0x84, 0xD0, 0x7A, 0xFF, 0xD5, + 0x73, 0xB5, 0xF3, 0xF5, 0x6E, 0x0C, 0x68, 0xA8, + 0x4E, 0x88, 0x02, 0xD6, 0x2C, 0x31, 0x52, 0x77, + 0x13, 0xEE, 0xF8, 0x74, 0xD8, 0x0E, 0x70, 0x91, + 0xA0, 0x37, 0x82, 0x1C, 0xCF, 0x7F, 0x39, 0xD6, + 0x51, 0xF8, 0x05, 0x69, 0xBD, 0x07, 0xC2, 0x68, + 0xCD, 0x1A, 0x94, 0x6A, 0x91, 0xFF, 0x5F, 0xBF, + 0x3F, 0x76, 0xA5, 0x69, 0x33, 0xC0, 0xA8, 0x2E, + 0xAD, 0x76, 0x62, 0x1D, 0xC2, 0xFE, 0xE4, 0x56, + 0x92, 0x49, 0x5D, 0x22, 0xFD, 0xE8, 0x6E, 0x88, + 0x04, 0xCD, 0x66, 0xFA, 0x90, 0x33, 0x5B, 0xF1, + 0x32, 0xFF, 0x82, 0xE9, 0xF3, 0x47, 0x27, 0x25, + 0x69, 0x49, 0xE9, 0xB9, 0x66, 0x34, 0x57, 0x9A, + 0x98, 0x67, 0x50, 0x2B, 0x9D, 0x7D, 0x8F, 0x42, + 0xC2, 0x0F, 0x30, 0x50, 0x84, 0x26, 0x4D, 0x74, + 0x06, 0x90, 0x26, 0xCC, 0x04, 0xB4, 0x56, 0x5F, + 0x26, 0xAB, 0x85, 0x1C, 0x7C, 0xEE, 0x23, 0xE0, + 0x85, 0x83, 0x13, 0xDF, 0x97, 0x53, 0x38, 0x61, + 0xB7, 0x85, 0x39, 0x59, 0x8A, 0x36, 0x1A, 0x38, + 0x9B, 0x9D, 0xF9, 0x37, 0x9B, 0xF1, 0x42, 0x42, + 0xE2, 0x39, 0x2D, 0x52, 0x82, 0xD0, 0xD5, 0xB5, + 0x47, 0xC1, 0x09, 0xA7, 0x3C, 0x84, 0xF2, 0x78, + 0x0A, 0xDD, 0x05, 0x8B, 0x17, 0xA7, 0x65, 0xB6, + 0x3E, 0x00, 0x69, 0x23, 0x7D, 0x08, 0x97, 0x7A, + 0xFD, 0x2A, 0x93, 0x3F, 0xC7, 0x77, 0xB5, 0x66, + 0xEE, 0xB7, 0x64, 0xA8, 0x66, 0x4C, 0xDF, 0x7A, + 0x24, 0xD9, 0x72, 0xEE, 0x3A, 0x88, 0xAE, 0xA6, + 0xD9, 0xBA, 0x2E, 0xEF, 0x34, 0x21, 0x99, 0x7F, + 0x5F, 0x14, 0xD6, 0xDC, 0x1D, 0x8A, 0xE6, 0x2D, + 0x7F, 0x87, 0xEC, 0x42, 0x38, 0xFC, 0x56, 0x55, + 0x15, 0xEE, 0x58, 0xE6, 0x5B, 0x4B, 0x89, 0x5A, + 0xD2, 0x7B, 0x91, 0x83, 0xE7, 0x0D, 0x07, 0x24, + 0xA8, 0x1E, 0x7A, 0x58, 0x80, 0x92, 0xE1, 0x29, + 0x4C, 0x4D, 0xDD, 0x37, 0xE6, 0x56, 0x3A, 0x85, + 0x09, 0x86, 0x72, 0x5D, 0x8D, 0x57, 0x74, 0x46, + 0x82, 0x59, 0x5D, 0x22, 0xF1, 0xDD, 0xF6, 0x84, + 0x50, 0x77, 0xCD, 0x5B, 0x8F, 0xB7, 0x55, 0xD1, + 0x51, 0x6F, 0x01, 0x4B, 0x01, 0xA5, 0x39, 0x6B, + 0x22, 0x08, 0x2C, 0x14, 0x30, 0xA2, 0xC1, 0x0C, + 0xAC, 0x56, 0xE4, 0x95, 0xBD, 0x20, 0x47, 0x01, + 0x5E, 0x7A, 0x6E, 0x16, 0x32, 0x94, 0x2E, 0x06, + 0x8A, 0xD9, 0xED, 0xC5, 0x1D, 0x1B, 0xC1, 0x11, + 0x9D, 0xBC, 0x2F, 0x95, 0x6B, 0xF9, 0x8D, 0xB1, + 0x13, 0x0A, 0x4D, 0x03, 0x8F, 0xC3, 0xA5, 0xF8, + 0x87, 0x39, 0x5A, 0x10, 0xE5, 0x52, 0x74, 0x48, + 0x37, 0xEC, 0x6C, 0x41, 0x99, 0x78, 0x2D, 0xEE, + 0x36, 0xE8, 0x1C, 0xD0, 0xF8, 0x02, 0x27, 0xD5, + 0x51, 0x0A, 0x9A, 0xD5, 0x3C, 0xAA, 0x89, 0x7A, + 0x9B, 0x0A, 0xBF, 0xA2, 0x31, 0x82, 0xEE, 0x86, + 0x20, 0x98, 0x01, 0x0B, 0x50, 0xFE, 0x92, 0x21, + 0x33, 0xCD, 0xA5, 0x09, 0xF1, 0x41, 0xB3, 0x15, + 0x35, 0xDC, 0x2E, 0xC2, 0xA8, 0x1D, 0x70, 0x12, + 0x95, 0x4E, 0x48, 0x95, 0x49, 0x49, 0x81, 0xD2, + 0xF0, 0x6C, 0xDA, 0xAB, 0x83, 0x2E, 0xBE, 0x72, + 0xE1, 0x7C, 0xCA, 0xA6, 0x72, 0xF1, 0xA3, 0x27, + 0x27, 0xE1, 0xA7, 0xC7, 0x4C, 0x3E, 0x7B, 0x65, + 0x25, 0xDE, 0x68, 0xC6, 0x78, 0x68, 0xCE, 0xFD, + 0x82, 0x59, 0xD9, 0xF4, 0x2C, 0xAD, 0x80, 0x43, + 0xE2, 0x77, 0xC2, 0x87, 0x4C, 0xE1, 0x71, 0xB1, + 0x31, 0xEA, 0x6A, 0x47, 0x9F, 0xBE, 0xEB, 0x28, + 0x30, 0xE2, 0xD8, 0x1D, 0x67, 0xFE, 0x43, 0x23, + 0x03, 0xCC, 0x5C, 0x0A, 0xD0, 0x05, 0x22, 0xC3, + 0x5E, 0x75, 0xF5, 0xD8, 0x00, 0x11, 0x21, 0xE2, + 0x43, 0xD1, 0x64, 0x39, 0xD2, 0x61, 0x90, 0x1F, + 0x9C, 0xC6, 0x21, 0x4E, 0x1F, 0x86, 0xCF, 0x0C, + 0x25, 0xA7, 0x0C, 0x90, 0x48, 0xF8, 0xAE, 0x2F, + 0xAF, 0x55, 0xB1, 0xDE, 0x8E, 0x1C, 0xBB, 0x13, + 0x8E, 0xF4, 0x11, 0x7E, 0x43, 0xBE, 0xF6, 0xA7, + 0x73, 0xAB, 0xDC, 0xE5, 0x3E, 0x3F, 0x09, 0xCA, + 0xE2, 0x1B, 0x15, 0x72, 0x6A, 0x70, 0x00, 0x50, + 0x4A, 0x81, 0x87, 0x71, 0x3A, 0x13, 0x51, 0xB4, + 0xFA, 0x04, 0xAF, 0x33, 0xEB, 0x5B, 0x0D, 0x8C, + 0x0C, 0x76, 0x93, 0xFC, 0x41, 0xB6, 0xFE, 0xDF, + 0x08, 0xD0, 0x27, 0x78, 0xA3, 0x22, 0x10, 0xD3, + 0x5F, 0x88, 0xE6, 0xA9, 0x80, 0x66, 0x05, 0x72, + 0x9F, 0x66, 0x6D, 0x0E, 0x1E, 0xAA, 0x03, 0xCC, + 0xE1, 0x38, 0x0F, 0x3B, 0xE0, 0xB0, 0x4D, 0xAD, + 0xB4, 0x4C, 0x73, 0x1B, 0xA6, 0x13, 0x73, 0x02, + 0xDB, 0x03, 0x1D, 0x52, 0x86, 0x34, 0xE4, 0x8E, + 0x2E, 0x5C, 0xC9, 0xB8, 0x90, 0x2C, 0x47, 0x41, + 0x37, 0x13, 0x93, 0xBE, 0x66, 0xCA, 0x62, 0x25, + 0x37, 0xE8, 0x7F, 0x49, 0x92, 0x3F, 0xAF, 0xC2, + 0x40, 0x3E, 0x4E, 0x07, 0xF2, 0x48, 0x35, 0x05, + 0x85, 0x5E, 0xDE, 0xF3, 0x2B, 0xDA, 0xE1, 0x22, + 0x93, 0x14, 0xA1, 0x45, 0xD9, 0xE0, 0x02, 0xFB, + 0x3F, 0xF9, 0xBF, 0xD3, 0x0B, 0xBB, 0xED, 0x6C, + 0xEC, 0x95, 0xE1, 0x9D, 0x60, 0xAB, 0xEB, 0xBA, + 0x61, 0xB9, 0x87, 0x69, 0x38, 0xC1, 0xBC, 0x8C, + 0x0C, 0xD7, 0x57, 0x7A, 0xA2, 0xAF, 0xCD, 0x2C, + 0xF1, 0x29, 0xB7, 0xD9, 0x0D, 0x31, 0xDA, 0xB8, + 0x1D, 0x8C, 0x12, 0xFF, 0x79, 0xCA, 0x38, 0x3A, + 0xAA, 0xE8, 0x0C, 0xF9, 0x63, 0x5A, 0x58, 0x14, + 0x97, 0x75, 0x51, 0x20, 0x08, 0xB8, 0xEE, 0x6F, + 0xEF, 0x05, 0xEE, 0x81, 0x61, 0xD2, 0x00, 0xD3, + 0x4B, 0x9C, 0x36, 0x5D, 0x6E, 0xC4, 0x35, 0xAA, + 0x29, 0x32, 0x2F, 0x63, 0x19, 0xFA, 0x82, 0x82, + 0x22, 0xF9, 0xD7, 0xB2, 0xE8, 0x4B, 0x2D, 0x4F, + 0x0C, 0xC7, 0xEB, 0x0F, 0x5E, 0x9D, 0x18, 0xAB, + 0x0B, 0x62, 0xC7, 0xB3, 0x7C, 0x27, 0x49, 0x31, + 0x22, 0x75, 0x58, 0xBC, 0x6F, 0x72, 0x10, 0x30, + 0xB8, 0x63, 0xF8, 0x9E, 0x5B, 0x1B, 0x77, 0xB5, + 0x28, 0x03, 0x83, 0xAE, 0x76, 0xF7, 0xCA, 0x09, + 0xB1, 0x69, 0x6D, 0x13, 0xDF, 0xA7, 0x64, 0x0C, + 0xAF, 0xBE, 0xB3, 0x66, 0x1D, 0x0A, 0x51, 0xC0, + 0xE0, 0xA0, 0xD6, 0x38, 0xF3, 0x5B, 0xA2, 0xC1, + 0x56, 0xE5, 0x78, 0xD6, 0xA6, 0xE9, 0x68, 0xC8, + 0x4B, 0x68, 0x6D, 0xC1, 0x39, 0x89, 0x3B, 0xE8, + 0x70, 0x1A, 0xE6, 0x89, 0xB1, 0xDC, 0xAC, 0x9E, + 0x75, 0x0E, 0x6A, 0x55, 0x95, 0xE5, 0xA5, 0x65, + 0x47, 0xB7, 0x81, 0x2D, 0xD5, 0x65, 0xC5, 0xAF, + 0x3F, 0x46, 0x9B, 0x77, 0xE9, 0x58, 0x38, 0x5A, + 0x19, 0xD2, 0xC1, 0xC3, 0x3B, 0x4B, 0x0B, 0xCB, + 0xDA, 0x5E, 0xEB, 0x05, 0xCE, 0x78, 0x80, 0x49, + 0x6B, 0x73, 0xD5, 0x23, 0x73, 0x4A, 0x59, 0x7C, + 0x97, 0x6C, 0x52, 0xBD, 0xC8, 0x7A, 0xFA, 0x32, + 0xB2, 0x74, 0x32, 0x5E, 0x86, 0x36, 0x60, 0xE1, + 0x61, 0xF8, 0xE6, 0x75, 0x3C, 0xED, 0x8E, 0xFF, + 0x22, 0xFA, 0x7D, 0x5B, 0x80, 0x88, 0xE3, 0xE1, + 0x7A, 0xB9, 0x03, 0x42, 0x4A, 0x36, 0x76, 0x74, + 0xAF, 0x6C, 0x1A, 0x56, 0x8E, 0x9C, 0xDF, 0xBF, + 0x96, 0xF6, 0x80, 0xCC, 0x14, 0x26, 0x65, 0x05, + 0x45, 0xBE, 0x08, 0xF4, 0xA4, 0x04, 0xF6, 0x97, + 0x17, 0x5C, 0x62, 0x2E, 0x74, 0xA7, 0x67, 0x67, + 0xC7, 0x1C, 0x88, 0xC7, 0x9F, 0xEF, 0xAF, 0x6F, + 0xAF, 0x56, 0xF0, 0xDE, 0xA2, 0x12, 0x32, 0xD0, + 0x70, 0x89, 0x5C, 0xB0, 0x75, 0x35, 0x63, 0xE2, + 0x62, 0xDF, 0x5D, 0x39, 0x63, 0xD0, 0x97, 0x95, + 0x16, 0xEB, 0x3B, 0x6F, 0xBD, 0xA0, 0xC2, 0xBF, + 0x3C, 0x2A, 0x98, 0x51, 0x56, 0xC4, 0xB9, 0x89, + 0xA1, 0x29, 0x2D, 0xE1, 0xC2, 0xC2, 0x6E, 0xBE, + 0xFC, 0x64, 0xF4, 0x58, 0xA0, 0x10, 0xE2, 0x28, + 0xA4, 0xBF, 0x29, 0x45, 0x2D, 0x04, 0x74, 0x26, + 0xEC, 0x3B, 0x90, 0x0C, 0xD4, 0x64, 0x1E, 0xDF, + 0x5F, 0x84, 0x32, 0x5E, 0x86, 0x36, 0xB6, 0x7B, + 0xF9, 0x42, 0xF0, 0x9D, 0x45, 0xF5, 0x95, 0x55, + 0xD5, 0x0E, 0x14, 0x76, 0xAC, 0x7C, 0x00, 0xC0, + 0x48, 0x93, 0x58, 0x30, 0x96, 0x22, 0x7E, 0xAC, + 0x2E, 0x95, 0xBB, 0xC5, 0x1F, 0xCF, 0x03, 0xD1, + 0x53, 0xE8, 0xC2, 0xBD, 0x67, 0xB7, 0xFF, 0x2C, + 0xAE, 0x15, 0xEB, 0x93, 0x4B, 0x9B, 0xB7, 0x63, + 0xE3, 0x58, 0x9E, 0xE6, 0x3E, 0xEE, 0xBA, 0x7A, + 0xFA, 0x21, 0x97, 0xFB, 0x23, 0x93, 0xF3, 0x33, + 0xB3, 0x68, 0xDE, 0xB2, 0x6A, 0xDA, 0x92, 0x5B, + 0xDB, 0x60, 0xF2, 0x97, 0x4F, 0x9F, 0xEF, 0x1F, + 0x9D, 0x46, 0x70, 0x08, 0xD0, 0x00, 0x30, 0xF1, + 0x71, 0xAA, 0xA0, 0xCB, 0x13, 0xC3, 0x0B, 0xC6, + 0x44, 0xFF, 0x35, 0x5E, 0x86, 0x56, 0x8E, 0x43, + 0xC1, 0x7A, 0xF0, 0x94, 0x4C, 0x9C, 0xEC, 0x22, + 0xA0, 0x1B, 0x65, 0x07, 0xDD, 0x0D, 0x05, 0xD1, + 0x51, 0xEA, 0xD0, 0xB3, 0x69, 0xB9, 0xB1, 0x60, + 0xE2, 0x59, 0x57, 0x33, 0xEB, 0x3B, 0x83, 0x52, + 0xD0, 0x6B, 0xD1, 0xAF, 0x75, 0xA5, 0x45, 0x97, + 0x15, 0xAE, 0xF0, 0x9A, 0x42, 0x92, 0x1E, 0xCD, + 0x4F, 0xF4, 0x02, 0x64, 0xBC, 0x6C, 0x3A, 0xBB, + 0x3B, 0x61, 0xC8, 0xA1, 0xC8, 0x65, 0x00, 0xCC, + 0x16, 0x5C, 0xF4, 0x9D, 0xE7, 0x1C, 0x7C, 0x35, + 0xBC, 0x42, 0xF7, 0x9B, 0xA6, 0x15, 0x75, 0x10, + 0x95, 0x4E, 0x9D, 0xF9, 0x21, 0xF4, 0x90, 0x50, + 0xB5, 0x67, 0xD1, 0x58, 0x80, 0x30, 0xF1, 0x11, + 0x94, 0xFE, 0x69, 0x00, 0xFD, 0xF9, 0xBE, 0x63, + 0x13, 0xC8, 0x48, 0x65, 0xBD, 0x3C, 0x7E, 0xBB, + 0x1A, 0xE2, 0x51, 0x14, 0xDF, 0x72, 0xE2, 0x22, + 0xA2, 0x79, 0xF9, 0xD4, 0x0C, 0x8D, 0xC9, 0x0C, + 0xAD, 0x53, 0xE0, 0xA5, 0xAE, 0x03, 0x93, 0x53, + 0xD3, 0x08, 0x88, 0xA5, 0x7D, 0xFC, 0xBA, 0x7F, + 0xDE, 0x22, 0x91, 0xD4, 0x4F, 0xE2, 0x72, 0xB2, + 0x32, 0xE9, 0x69, 0x44, 0x9C, 0x1D, 0x59, 0x9C, + 0x3D, 0xCE, 0x7D, 0x38, 0x73, 0xDE, 0x4E, 0x8E, + 0x0E, 0xD5, 0x55, 0x78, 0xA0, 0x81, 0xC8, 0x0D, + 0x81, 0x52, 0x66, 0x43, 0x9B, 0x4E, 0x2F, 0xEF, + 0xCE, 0x3E, 0x8D, 0x50, 0xAE, 0x1B, 0xBA, 0x50, + 0xD5, 0xC7, 0x7A, 0xBF, 0x3C, 0x91, 0x01, 0xC1, + 0x41, 0x9A, 0x1A, 0x37, 0xEF, 0x6E, 0x22, 0xE7, + 0x46, 0xB0, 0x03, 0x46, 0x8D, 0x20, 0xB0, 0x70, + 0xF0, 0x2B, 0xAB, 0x86, 0x5E, 0x6F, 0x21, 0xE4, + 0x55, 0xAC, 0x1F, 0x52, 0xA5, 0x10, 0x59, 0xBA, + 0xB3, 0x3B, 0x90, 0x0C, 0xD4, 0x64, 0x32, 0xB3, + 0x33, 0x79, 0xFF, 0x96, 0xCF, 0x4E, 0x2B, 0x62, + 0xCB, 0x75, 0xC3, 0xAF, 0x6A, 0x2A, 0x7C, 0xFD, + 0x7D, 0x07, 0x83, 0xEA, 0x80, 0x90, 0x7C, 0x14, + 0x9E, 0x65, 0xB2, 0xDE, 0x8E, 0x14, 0xCE, 0xB4, + 0xA8, 0x6B, 0xD1, 0xA1, 0x75, 0x48, 0xCA, 0x20, + 0x88, 0x93, 0x05, 0x69, 0x63, 0x9D, 0xF1, 0xF3, + 0x38, 0xC4, 0x57, 0x3A, 0xC6, 0x56, 0xD0, 0x03, + 0x93, 0x68, 0xDE, 0xAF, 0x87, 0x37, 0x57, 0x97, + 0x17, 0xCC, 0x7A, 0x16, 0xCE, 0x7E, 0x1E, 0xDE, + 0x5E, 0x85, 0x32, 0x5E, 0x82, 0x32, 0x9E, 0x4A, + 0xC8, 0x73, +}; + +static unsigned char vfs5011_init_04[] = { /* 2221 B */ + 0x02, 0x20, 0x01, 0x01, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xAD, 0x01, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xAD, 0x01, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xAD, 0x01, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xFF, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x50, 0x03, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x54, 0x20, 0x04, 0x30, 0x01, + 0x3E, 0x02, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x21, 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x14, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x1C, 0x21, 0x04, 0x30, 0x12, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x20, 0x21, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x40, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, + 0x21, 0x04, 0x30, 0x10, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x5C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, + 0x30, 0x0F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x80, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x84, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x98, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x9C, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x0F, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC0, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC4, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xC8, 0x21, 0x04, 0x30, 0x10, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xCC, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD0, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD4, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xD8, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xDC, 0x21, 0x04, 0x30, 0x1F, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xE0, + 0x21, 0x04, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA0, 0x20, 0x04, 0x30, + 0xEF, 0xE1, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xA4, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA8, 0x20, + 0x04, 0x30, 0xFE, 0x21, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xC4, 0x20, 0x04, 0x30, 0x47, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x12, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x8A, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x83, 0x48, 0x84, 0x20, + 0x83, 0x48, 0x84, 0x20, 0x85, 0x48, 0x04, 0x20, + 0x87, 0x48, 0x04, 0x20, 0x89, 0x48, 0x04, 0x20, + 0x8B, 0x48, 0x04, 0x20, 0x8D, 0x48, 0x04, 0x20, + 0x8F, 0x48, 0x04, 0x20, 0x91, 0x48, 0x04, 0x20, + 0x93, 0x48, 0x04, 0x20, 0x95, 0x48, 0x04, 0x20, + 0x97, 0x48, 0x04, 0x20, 0x99, 0x48, 0x04, 0x20, + 0x9B, 0x48, 0x04, 0x20, 0x9D, 0x48, 0x04, 0x20, + 0x9F, 0x48, 0x04, 0x20, 0xA1, 0x48, 0x04, 0x20, + 0xA3, 0x48, 0x04, 0x20, 0xA3, 0x48, 0x04, 0x00, + 0x85, 0x5A, 0x04, 0x20, 0x87, 0x5A, 0x04, 0x20, + 0x89, 0x5A, 0x04, 0x20, 0x8B, 0x5A, 0x04, 0x20, + 0x8D, 0x5A, 0x04, 0x20, 0x8F, 0x5A, 0x04, 0x20, + 0x91, 0x5A, 0x04, 0x20, 0x93, 0x5A, 0x04, 0x20, + 0x95, 0x5A, 0x04, 0x20, 0x97, 0x5A, 0x04, 0x20, + 0x99, 0x5A, 0x04, 0x20, 0x9B, 0x5A, 0x04, 0x20, + 0x9D, 0x5A, 0x04, 0x20, 0x9F, 0x5A, 0x04, 0x20, + 0xA1, 0x5A, 0x04, 0x20, 0xA3, 0x5A, 0x04, 0x20, + 0xA3, 0x5A, 0x04, 0x00, 0x85, 0x6C, 0x04, 0x20, + 0x87, 0x6C, 0x04, 0x20, 0x89, 0x6C, 0x04, 0x20, + 0x8B, 0x6C, 0x04, 0x20, 0x8D, 0x6C, 0x04, 0x20, + 0x8F, 0x6C, 0x04, 0x20, 0x91, 0x6C, 0x04, 0x20, + 0x93, 0x6C, 0x04, 0x20, 0x95, 0x6C, 0x04, 0x20, + 0x97, 0x6C, 0x04, 0x20, 0x99, 0x6C, 0x04, 0x20, + 0x9B, 0x6C, 0x04, 0x20, 0x9D, 0x6C, 0x04, 0x20, + 0x9F, 0x6C, 0x04, 0x20, 0xA1, 0x6C, 0x04, 0x20, + 0xA3, 0x6C, 0x04, 0x20, 0xA3, 0x6C, 0x04, 0x00, + 0x86, 0x48, 0x04, 0x20, 0x88, 0x48, 0x04, 0x20, + 0x8A, 0x48, 0x04, 0x20, 0x8C, 0x48, 0x04, 0x20, + 0x8E, 0x48, 0x04, 0x20, 0x90, 0x48, 0x04, 0x20, + 0x92, 0x48, 0x04, 0x20, 0xF7, 0x48, 0x04, 0x20, + 0xF9, 0x48, 0x04, 0x20, 0xFB, 0x48, 0x04, 0x20, + 0xFD, 0x48, 0x04, 0x20, 0xFF, 0x48, 0x04, 0x20, + 0x01, 0x49, 0x04, 0x20, 0x03, 0x49, 0x04, 0x20, + 0x05, 0x49, 0x04, 0x20, 0x07, 0x49, 0x04, 0x20, + 0x07, 0x49, 0x04, 0x00, 0x86, 0x5A, 0x04, 0x20, + 0x88, 0x5A, 0x04, 0x20, 0x8A, 0x5A, 0x04, 0x20, + 0x8C, 0x5A, 0x04, 0x20, 0x8E, 0x5A, 0x04, 0x20, + 0x90, 0x5A, 0x04, 0x20, 0x92, 0x5A, 0x04, 0x20, + 0xF7, 0x5A, 0x04, 0x20, 0xF9, 0x5A, 0x04, 0x20, + 0xFB, 0x5A, 0x04, 0x20, 0xFD, 0x5A, 0x04, 0x20, + 0xFF, 0x5A, 0x04, 0x20, 0x01, 0x5B, 0x04, 0x20, + 0x03, 0x5B, 0x04, 0x20, 0x05, 0x5B, 0x04, 0x20, + 0x07, 0x5B, 0x04, 0x20, 0x07, 0x5B, 0x04, 0x00, + 0x86, 0x6C, 0x04, 0x20, 0x88, 0x6C, 0x04, 0x20, + 0x8A, 0x6C, 0x04, 0x20, 0x8C, 0x6C, 0x04, 0x20, + 0x8E, 0x6C, 0x04, 0x20, 0x90, 0x6C, 0x04, 0x20, + 0x92, 0x6C, 0x04, 0x20, 0xF7, 0x6C, 0x04, 0x20, + 0xF9, 0x6C, 0x04, 0x20, 0xFB, 0x6C, 0x04, 0x20, + 0xFD, 0x6C, 0x04, 0x20, 0xFF, 0x6C, 0x04, 0x20, + 0x01, 0x6D, 0x04, 0x20, 0x03, 0x6D, 0x04, 0x20, + 0x05, 0x6D, 0x04, 0x20, 0x07, 0x6D, 0x04, 0x20, + 0x07, 0x6D, 0x04, 0x00, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x83, 0x68, 0x84, 0x20, + 0x83, 0x68, 0x84, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x51, 0x09, + 0x10, 0x03, 0x51, 0x09, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x28, 0x00, 0x00, +}; + +static unsigned char vfs5011_init_05[] = { /* 2770 B */ + 0x06, 0x6B, 0x06, 0x6A, 0x76, 0xCC, 0x1C, 0xD0, + 0x50, 0xEB, 0x75, 0x10, 0xC8, 0x18, 0x5C, 0x95, + 0x15, 0xAE, 0xA8, 0xC8, 0x10, 0xC0, 0xB0, 0x7A, + 0xFA, 0x21, 0x96, 0xFA, 0x22, 0x92, 0xAE, 0x78, + 0xF8, 0x43, 0x05, 0x6E, 0xB6, 0x66, 0x62, 0xD5, + 0x51, 0xEA, 0xF0, 0xE5, 0x39, 0xE9, 0xA1, 0x19, + 0x9D, 0x26, 0x80, 0xE0, 0x38, 0xE8, 0x1C, 0xCA, + 0x4A, 0xF1, 0xBF, 0xD8, 0x00, 0xD0, 0x34, 0xD9, + 0x5D, 0xB6, 0x00, 0xF2, 0x2A, 0xA2, 0xAA, 0x7C, + 0xFC, 0x47, 0xDD, 0xB8, 0x60, 0xB0, 0xD0, 0xEF, + 0x6F, 0xB4, 0x46, 0x2C, 0xF4, 0x24, 0xBB, 0x7B, + 0x04, 0x20, 0x96, 0xC5, 0x1D, 0xAD, 0x32, 0x32, + 0x4D, 0x69, 0xDF, 0xA0, 0x7A, 0xAA, 0xB6, 0x60, + 0xE0, 0x5B, 0x89, 0xF6, 0x2C, 0xFC, 0x14, 0xC2, + 0x42, 0xF9, 0x23, 0x59, 0x81, 0x51, 0x31, 0xEF, + 0x6B, 0x80, 0x36, 0x52, 0x8A, 0x3A, 0x5A, 0x64, + 0x1B, 0xF7, 0xBD, 0xD4, 0x0C, 0xDC, 0xBC, 0x54, + 0xD0, 0x3B, 0x0D, 0x4C, 0x90, 0x10, 0x70, 0x90, + 0x14, 0xFF, 0x65, 0x29, 0xF5, 0x75, 0x55, 0xB5, + 0x31, 0xDA, 0x88, 0xC5, 0x19, 0x99, 0xF9, 0x39, + 0xB9, 0x5A, 0xD0, 0xBC, 0x64, 0xEC, 0x8C, 0xEC, + 0x6C, 0x8F, 0x05, 0xC9, 0x11, 0x99, 0xF9, 0x19, + 0x99, 0x7A, 0xC2, 0x8E, 0x56, 0xDE, 0xBE, 0x3E, + 0xBE, 0x5D, 0xE3, 0xCF, 0x17, 0x9F, 0xFF, 0x5F, + 0xDF, 0x3C, 0x82, 0x8E, 0x56, 0xDE, 0xBE, 0xFE, + 0x7E, 0x9D, 0x23, 0xCF, 0x17, 0x9F, 0xC9, 0x48, + 0xC8, 0xF6, 0x07, 0x4D, 0x04, 0x98, 0xFB, 0x9A, + 0x37, 0xEF, 0x55, 0x31, 0x60, 0xDA, 0x38, 0xB1, + 0x31, 0xF7, 0xB1, 0xDD, 0x05, 0xB5, 0xE3, 0x62, + 0xE2, 0x19, 0xCE, 0xA2, 0x5F, 0x11, 0x8E, 0x6E, + 0x08, 0xC0, 0x66, 0x2A, 0xF2, 0x4E, 0x24, 0x01, + 0xAA, 0x54, 0x43, 0x01, 0xDA, 0xDB, 0x94, 0x57, + 0xB2, 0x40, 0xDE, 0xAF, 0x87, 0x37, 0x61, 0xE0, + 0x60, 0x16, 0xA2, 0x4F, 0xA7, 0x14, 0x78, 0xB1, + 0x3A, 0x59, 0x78, 0x0C, 0xC5, 0x54, 0x05, 0xC6, + 0x8E, 0x57, 0xEA, 0x3D, 0x25, 0x55, 0x41, 0x46, + 0xDC, 0x0C, 0x71, 0x3F, 0x81, 0x3A, 0xAA, 0x8F, + 0x6B, 0x95, 0x0E, 0x68, 0xAD, 0xED, 0x90, 0xA0, + 0x20, 0xFB, 0x7B, 0x56, 0x8E, 0xAF, 0xFC, 0x3F, + 0x9E, 0x70, 0xC5, 0x98, 0x72, 0xC1, 0x20, 0xD4, + 0x57, 0x05, 0x60, 0x2E, 0x95, 0x35, 0xCC, 0x9F, + 0x02, 0x29, 0xA9, 0x84, 0x5C, 0xDD, 0x8B, 0x48, + 0xDE, 0xA7, 0x17, 0x1E, 0x49, 0xDC, 0x94, 0x57, + 0x75, 0xCC, 0x58, 0x15, 0xFA, 0x49, 0xB5, 0x7F, + 0x77, 0x96, 0xB2, 0xC4, 0x08, 0x3A, 0x72, 0xB2, + 0xA0, 0x29, 0x91, 0x1D, 0xCD, 0x7D, 0x5B, 0x9A, + 0x1A, 0xC1, 0x7B, 0x1D, 0x20, 0x5C, 0x1C, 0x79, + 0x9E, 0x45, 0x42, 0x17, 0xCC, 0xD5, 0x37, 0xFB, + 0x67, 0x34, 0x81, 0x0C, 0xEC, 0x5F, 0xCD, 0x05, + 0x50, 0x87, 0x58, 0xA4, 0x83, 0x03, 0xF2, 0x08, + 0x8B, 0xA2, 0x5C, 0xE5, 0xBC, 0x3E, 0x5D, 0x45, + 0xC6, 0xF5, 0x4D, 0xE3, 0x76, 0x11, 0xD9, 0x1A, + 0x78, 0xFE, 0x1F, 0xC1, 0x73, 0xDF, 0x7F, 0x9F, + 0x1F, 0x4C, 0x22, 0xDC, 0x2D, 0x1D, 0xEF, 0x45, + 0xE6, 0x31, 0x8E, 0x70, 0xC2, 0x50, 0xA2, 0x38, + 0xEE, 0xD5, 0x6B, 0x07, 0xC2, 0x82, 0x4A, 0x89, + 0xAB, 0xBA, 0x54, 0x5D, 0x7C, 0xEB, 0x96, 0xA6, + 0x26, 0xFD, 0x7D, 0x50, 0x88, 0xA9, 0xFE, 0x3D, + 0x3F, 0xED, 0x7F, 0x91, 0x00, 0x95, 0x50, 0xB1, + 0x31, 0x4B, 0xC6, 0xA9, 0xF0, 0x72, 0x11, 0xDD, + 0x74, 0x2D, 0xB3, 0xCD, 0x87, 0x5D, 0x39, 0x19, + 0x91, 0x4A, 0x5E, 0x92, 0xDE, 0xDF, 0x89, 0x4A, + 0x0B, 0xEC, 0x59, 0x8D, 0x5E, 0x2E, 0x6E, 0xAE, + 0xE6, 0x31, 0x15, 0x62, 0xE7, 0xFD, 0x36, 0x3C, + 0x25, 0x6C, 0xB1, 0xF5, 0x08, 0x02, 0x42, 0x9F, + 0xEF, 0x34, 0xB4, 0x99, 0x41, 0xFD, 0x88, 0x09, + 0xBE, 0x66, 0xE7, 0x69, 0x9D, 0x6A, 0xE8, 0x27, + 0x95, 0x4A, 0xDB, 0x95, 0x49, 0xDF, 0x85, 0x67, + 0xC7, 0x3D, 0xAA, 0xE4, 0x78, 0xED, 0x90, 0xA0, + 0x79, 0xE6, 0xC2, 0xAA, 0x57, 0x65, 0x01, 0xE7, + 0x6C, 0x2E, 0x08, 0xF4, 0x58, 0x7A, 0x5E, 0xB9, + 0xA3, 0xF0, 0xC6, 0x2B, 0xD2, 0xE0, 0xC4, 0x21, + 0xBC, 0x97, 0x78, 0x20, 0x4A, 0xFE, 0xB9, 0xDB, + 0x5F, 0xA1, 0xB5, 0x9D, 0x4F, 0xE4, 0x2E, 0x4E, + 0x6E, 0xC1, 0xD5, 0xFD, 0x03, 0x09, 0xC3, 0xA3, + 0x82, 0x78, 0x6C, 0x44, 0xB9, 0x14, 0x84, 0x44, + 0xC4, 0x1F, 0x9F, 0xB2, 0x6A, 0x1A, 0x5A, 0x9A, + 0x16, 0xC4, 0xF3, 0xA2, 0x79, 0xF8, 0xA2, 0x61, + 0xB0, 0x50, 0xE5, 0xFB, 0x00, 0x3A, 0x9A, 0x7A, + 0xFA, 0x69, 0x9A, 0x94, 0x6F, 0x56, 0xB6, 0x01, + 0x91, 0xCA, 0x0B, 0x76, 0x2E, 0xF8, 0x88, 0x88, + 0x28, 0xF3, 0x77, 0x38, 0x61, 0xA1, 0xA7, 0x47, + 0xB6, 0x5B, 0xEE, 0xE2, 0x7E, 0xEE, 0xBE, 0xDF, + 0x5B, 0xE1, 0x6B, 0x04, 0xEC, 0xDD, 0xB9, 0x49, + 0x78, 0xE2, 0xEC, 0x87, 0x49, 0xD1, 0xB9, 0xFB, + 0x50, 0x94, 0x15, 0x71, 0xD5, 0xE4, 0xBA, 0x79, + 0xF5, 0x64, 0x5A, 0xDE, 0x36, 0x35, 0x75, 0x55, + 0xDD, 0x06, 0x78, 0x51, 0xA8, 0x2F, 0x4C, 0x87, + 0x9B, 0x56, 0xB9, 0xDF, 0xB5, 0xC9, 0x57, 0x81, + 0xBA, 0x6B, 0x0F, 0xAF, 0x8A, 0x2C, 0xE1, 0x2D, + 0xBB, 0xDC, 0x6A, 0x20, 0xB4, 0x0C, 0xCE, 0xAE, + 0x2E, 0x50, 0x50, 0x1C, 0x06, 0x93, 0xF7, 0xF7, + 0xE7, 0x48, 0x52, 0x57, 0xA9, 0x50, 0x14, 0x71, + 0xE1, 0x3A, 0x0D, 0x53, 0x88, 0xBA, 0xF2, 0x20, + 0x40, 0x93, 0x25, 0xEB, 0x93, 0xB7, 0x6F, 0xA8, + 0xE8, 0x13, 0xA5, 0x01, 0xDF, 0xFD, 0x86, 0x1B, + 0x31, 0x41, 0x3D, 0xC8, 0x82, 0x59, 0x11, 0x34, + 0x1D, 0xE6, 0x98, 0xB1, 0x65, 0xDE, 0x3E, 0x52, + 0xD3, 0xA8, 0xBA, 0xF6, 0x0B, 0xA8, 0xC8, 0xA5, + 0x26, 0xF1, 0x4C, 0x85, 0x4F, 0xFF, 0x57, 0xD2, + 0x92, 0xD9, 0x1B, 0xEB, 0xAA, 0x3C, 0x15, 0xC2, + 0x5F, 0x74, 0x02, 0x4E, 0x96, 0xEE, 0x88, 0xFA, + 0x61, 0xE7, 0xFC, 0x92, 0x80, 0x8B, 0x52, 0xA0, + 0xC5, 0xB8, 0x2E, 0x5F, 0x77, 0xC7, 0xA7, 0x67, + 0x55, 0x2E, 0x99, 0x27, 0xFD, 0x47, 0x85, 0x47, + 0xEF, 0x34, 0x5F, 0x22, 0x7A, 0x60, 0x11, 0x71, + 0x5D, 0xA6, 0xC0, 0x06, 0xFE, 0x6B, 0x04, 0xC4, + 0xEC, 0xB5, 0x0F, 0x68, 0x15, 0xAB, 0xCB, 0x2E, + 0xE7, 0x3C, 0x86, 0xC1, 0x3C, 0x82, 0xE2, 0x3F, + 0x4F, 0x94, 0x2E, 0x48, 0xF5, 0xE8, 0xA8, 0xA0, + 0x65, 0x38, 0x54, 0xC7, 0x1F, 0xAF, 0x62, 0xA1, + 0x04, 0x36, 0x7F, 0xE1, 0x3B, 0xAD, 0x2F, 0xED, + 0x4A, 0x66, 0x6E, 0x13, 0x43, 0xC1, 0x1D, 0x55, + 0x4D, 0xD4, 0xDE, 0xFB, 0x81, 0x33, 0x59, 0x95, + 0x1E, 0x7C, 0x8F, 0x41, 0xDB, 0x4E, 0xE6, 0x63, + 0x25, 0x2E, 0x67, 0xA6, 0x7D, 0x28, 0xAE, 0x91, + 0xC3, 0x1A, 0x8A, 0x24, 0xFE, 0x69, 0xDE, 0xA2, + 0x33, 0x00, 0x84, 0x44, 0x62, 0x2A, 0x08, 0x64, + 0x5B, 0x02, 0xB6, 0xD0, 0x04, 0xBD, 0x44, 0xC1, + 0xC3, 0x5A, 0xC9, 0x6D, 0xF0, 0xC6, 0x61, 0x5E, + 0xDE, 0x05, 0xBF, 0xD9, 0xE4, 0x4A, 0x2A, 0xBC, + 0x86, 0xA1, 0x1B, 0x6D, 0xD0, 0x7E, 0x1E, 0xD2, + 0x69, 0x7F, 0xC3, 0xA3, 0x31, 0x41, 0x8A, 0xD9, + 0xF0, 0x6E, 0xDE, 0x5C, 0x7B, 0xCB, 0xA7, 0x4D, + 0xE8, 0x2E, 0x98, 0x2C, 0xB1, 0x0D, 0x23, 0x43, + 0x1D, 0x45, 0x2A, 0x03, 0x1D, 0x5F, 0xC0, 0x00, + 0x80, 0x5B, 0xDB, 0xF6, 0x2E, 0x3C, 0xFC, 0x18, + 0x49, 0xAF, 0x1A, 0x97, 0x70, 0xC3, 0x92, 0x65, + 0xE6, 0x1C, 0x90, 0xFF, 0x66, 0xE8, 0x8B, 0x8B, + 0x2B, 0xF0, 0xC4, 0x8C, 0x5A, 0x58, 0x1A, 0x53, + 0x11, 0xC9, 0x57, 0xDB, 0xB8, 0x18, 0xF8, 0xF4, + 0x65, 0x6E, 0x14, 0x68, 0x70, 0x7B, 0x3B, 0x1B, + 0x93, 0x48, 0x3E, 0x72, 0xAA, 0x36, 0xDC, 0x94, + 0xF0, 0xFA, 0x0D, 0x62, 0x08, 0x9A, 0x70, 0x72, + 0xF1, 0x0F, 0x58, 0x74, 0xAF, 0x9F, 0x33, 0xE2, + 0x82, 0x95, 0x33, 0x8F, 0xEC, 0x4C, 0xEC, 0x97, + 0x37, 0x0C, 0xB2, 0xDE, 0x1B, 0x5B, 0x0D, 0x8C, + 0x0C, 0x96, 0x16, 0x79, 0xF0, 0x72, 0x11, 0x09, + 0x8D, 0x27, 0xA6, 0xC9, 0x83, 0x1E, 0x62, 0x62, + 0xC2, 0x19, 0x2D, 0x56, 0x80, 0xF2, 0x8F, 0x19, + 0xB0, 0x62, 0x56, 0xF2, 0xD2, 0xF0, 0xBD, 0x61, + 0xAA, 0xBD, 0xCB, 0x67, 0x4B, 0x39, 0x04, 0x92, + 0x59, 0x1B, 0x3F, 0x3E, 0xFA, 0xCD, 0x81, 0x37, + 0x96, 0x74, 0xC1, 0x48, 0xCC, 0x59, 0x81, 0x45, + 0x67, 0xD7, 0x43, 0xA3, 0xC1, 0xF3, 0xB9, 0x7A, + 0x78, 0x8B, 0x3D, 0xB1, 0x61, 0xD1, 0xF7, 0x36, + 0xB6, 0x6D, 0xD7, 0xB1, 0x8C, 0xA6, 0xE6, 0xAE, + 0x8B, 0xB0, 0x0E, 0x62, 0x57, 0xED, 0x5F, 0xBB, + 0x3B, 0x52, 0xFE, 0x86, 0xFC, 0x21, 0x63, 0x71, + 0xEC, 0x61, 0x65, 0xC2, 0xE2, 0x85, 0x4E, 0x8F, + 0xD2, 0x02, 0x09, 0x67, 0x17, 0x89, 0x39, 0x99, + 0xED, 0xFB, 0x4B, 0xAC, 0xDE, 0x8B, 0x8B, 0x63, + 0xC9, 0x34, 0x3A, 0x52, 0x02, 0xE7, 0x25, 0xCE, + 0x6C, 0x25, 0xB8, 0xC8, 0xD2, 0x79, 0x4F, 0xEF, + 0xF6, 0xED, 0x3B, 0x9B, 0x83, 0xF1, 0xCA, 0x5C, + 0x4E, 0xFE, 0x54, 0xD8, 0x08, 0xB8, 0x00, 0xC4, + 0xE6, 0x2A, 0x92, 0x3C, 0xF9, 0x1F, 0xDD, 0xD7, + 0xAF, 0xD3, 0xC9, 0x2B, 0x75, 0xC5, 0xA5, 0x44, + 0xFD, 0x25, 0x21, 0x8E, 0xA9, 0xEF, 0xA4, 0x30, + 0xA6, 0x91, 0x22, 0xAB, 0x27, 0xB2, 0x1A, 0xDE, + 0xFC, 0x4B, 0xDF, 0x3F, 0x5D, 0x6F, 0x25, 0xE6, + 0xE4, 0x17, 0xA1, 0x2D, 0xFD, 0x4D, 0x6B, 0xAA, + 0x2A, 0xF1, 0x4B, 0x2D, 0x10, 0x32, 0x72, 0x3A, + 0x1F, 0x24, 0x9A, 0xF6, 0xE6, 0x52, 0x8F, 0x4D, + 0x6F, 0xD8, 0x4C, 0x88, 0x7A, 0x08, 0x74, 0xE2, + 0xC0, 0xD1, 0x6F, 0xE6, 0x67, 0xFF, 0x2E, 0xD7, + 0x54, 0x07, 0xE4, 0x20, 0xFC, 0x8E, 0x4E, 0x8E, + 0xCC, 0x4D, 0xAD, 0x73, 0xC1, 0x6D, 0xAF, 0x45, + 0xE7, 0xDC, 0x62, 0x0E, 0x04, 0x90, 0xF0, 0xC0, + 0x60, 0xBB, 0xCF, 0xBE, 0x30, 0x0C, 0xF0, 0x92, + 0x3F, 0xF8, 0xF3, 0x9D, 0x20, 0xC7, 0x8F, 0x9D, + 0x39, 0xE2, 0x32, 0x7D, 0x9B, 0xC9, 0xB4, 0x23, + 0x1F, 0xAA, 0x79, 0x5B, 0xA6, 0xEE, 0x8A, 0xE8, + 0x07, 0xFE, 0xE4, 0x92, 0xC2, 0x48, 0xA0, 0x68, + 0x08, 0xDB, 0x6D, 0x89, 0xF4, 0xA4, 0xCC, 0x0C, + 0x14, 0xCB, 0xF5, 0xCC, 0xB6, 0x6F, 0x2D, 0x0D, + 0x85, 0x5E, 0x40, 0x28, 0x52, 0xF8, 0xCF, 0x59, + 0xA3, 0x85, 0x35, 0x5A, 0x82, 0x32, 0x52, 0x33, + 0xF0, 0x28, 0x2F, 0x01, 0xDA, 0xD3, 0xE4, 0x01, + 0x3D, 0xC1, 0xAF, 0xC7, 0xDD, 0x70, 0x47, 0x0B, + 0x87, 0x41, 0x07, 0xCA, 0x57, 0xE4, 0x55, 0xD1, + 0x52, 0x50, 0x81, 0x08, 0x6A, 0xFD, 0x80, 0xB0, + 0x30, 0xEB, 0x6B, 0x46, 0x9E, 0xEF, 0xB8, 0x7B, + 0x5A, 0xBA, 0x0F, 0xDF, 0xC5, 0xF7, 0x55, 0x6B, + 0xFD, 0x6E, 0xDE, 0xD4, 0x1E, 0x85, 0x5D, 0x97, + 0xF5, 0x22, 0xB0, 0x0E, 0xDD, 0x6A, 0xA8, 0x63, + 0xE5, 0xAC, 0x11, 0x78, 0x70, 0x6A, 0xCA, 0x9D, + 0x37, 0xA5, 0xB1, 0x91, 0x61, 0x33, 0x1F, 0xFA, + 0x58, 0x88, 0x37, 0xA9, 0x7A, 0xC2, 0x50, 0xDC, + 0x7B, 0x82, 0x78, 0x32, 0xE6, 0x44, 0x39, 0x09, + 0x89, 0x52, 0xE8, 0x8E, 0xB3, 0x87, 0xC7, 0x0B, + 0x89, 0x4F, 0x09, 0xDD, 0x0F, 0x6D, 0x01, 0xE9, + 0xCB, 0x1B, 0xAA, 0x44, 0x97, 0x23, 0x99, 0xF3, + 0xD4, 0x27, 0xD7, 0x19, 0x8D, 0x15, 0x57, 0x9C, + 0x15, 0x2C, 0x96, 0xDE, 0xF4, 0x4F, 0x27, 0x15, + 0xD9, 0x25, 0x71, 0x51, 0xAC, 0x3E, 0x12, 0xF4, + 0x78, 0xB1, 0x1A, 0x86, 0x52, 0xE0, 0x9D, 0xAD, + 0x95, 0x44, 0x50, 0x30, 0xC0, 0xA2, 0xC9, 0x0E, + 0x0C, 0xDC, 0x6F, 0xD3, 0xA1, 0xD1, 0x36, 0xDC, + 0x40, 0x39, 0xC3, 0x87, 0x7D, 0xC6, 0xAF, 0x8D, + 0x01, 0xFE, 0xBA, 0xDD, 0x0D, 0x4F, 0x63, 0x84, + 0xE6, 0x71, 0xE2, 0xAC, 0x38, 0xAE, 0xC2, 0x10, + 0x8D, 0xA6, 0x1C, 0x72, 0xB7, 0xF7, 0x9B, 0x59, + 0xC4, 0xEF, 0x6F, 0x42, 0x9A, 0x0B, 0x5D, 0x9E, + 0x9C, 0x65, 0xD3, 0xFE, 0x11, 0xA2, 0x40, 0x98, + 0x4F, 0xA5, 0x21, 0x4E, 0x3A, 0xF2, 0x37, 0xCA, + 0x6F, 0x2C, 0x98, 0x56, 0xE7, 0x75, 0xB9, 0xA3, + 0xAB, 0x4A, 0x74, 0x10, 0x28, 0x90, 0xF0, 0xB8, + 0x9B, 0xA0, 0x1E, 0x72, 0x32, 0x80, 0x62, 0x81, + 0x04, 0x7D, 0xA2, 0xEC, 0xD4, 0x6C, 0x0C, 0x64, + 0xE6, 0x9F, 0x33, 0x08, 0x86, 0x5C, 0xC1, 0xA0, + 0x65, 0xBD, 0xBA, 0x92, 0x49, 0x40, 0x44, 0x21, + 0x0A, 0xF6, 0x5D, 0xC1, 0x19, 0xA9, 0xC9, 0xA8, + 0x6B, 0xB3, 0xC4, 0xEA, 0x31, 0x48, 0x7C, 0x19, + 0x33, 0xCF, 0xA1, 0xCF, 0xC5, 0x68, 0x5F, 0xC9, + 0x34, 0x11, 0xE1, 0x7B, 0x5C, 0xEC, 0xBA, 0x3B, + 0xBB, 0x6C, 0xD0, 0x9D, 0x73, 0xC0, 0xDC, 0xF0, + 0xC8, 0x11, 0x26, 0x74, 0xAF, 0xAD, 0xE6, 0x05, + 0x0D, 0x3E, 0x48, 0x9F, 0x57, 0x07, 0x6F, 0xAF, + 0x87, 0x5E, 0x4A, 0xEC, 0x6C, 0x39, 0xFE, 0x19, + 0x84, 0xAF, 0x2F, 0x02, 0xDA, 0x76, 0xCE, 0x89, + 0x9B, 0x44, 0xD3, 0xF9, 0x22, 0x8F, 0x1F, 0x72, + 0xF0, 0x0E, 0x0E, 0x47, 0xB2, 0x08, 0x75, 0x45, + 0xC5, 0x1E, 0x9E, 0xB3, 0x6B, 0x76, 0x14, 0xB1, + 0x31, 0xEA, 0x50, 0x3E, 0xFB, 0xBB, 0xED, 0x6C, + 0xEC, 0x17, 0x03, 0x4F, 0xB2, 0xE0, 0xA7, 0x56, + 0xED, 0x35, 0x1B, 0x74, 0x0C, 0x34, 0x15, 0x57, + 0x9E, 0x44, 0x50, 0x75, 0xAD, 0x36, 0xF4, 0xD1, + 0xB1, 0x4D, 0x4A, 0x11, 0xCA, 0xF8, 0x9A, 0x5F, + 0x2D, 0xF4, 0x45, 0xFB, 0x21, 0x97, 0x35, 0xF7, + 0x7F, 0x4C, 0xF9, 0x07, 0xDD, 0x69, 0x9B, 0x15, + 0x91, 0xC8, 0x30, 0x59, 0x23, 0xDD, 0xBF, 0xDF, + 0xF7, 0x6D, 0x79, 0x5B, 0x80, 0x92, 0xF0, 0x39, + 0x4B, 0xDE, 0x6F, 0xA1, 0x32, 0xA4, 0x66, 0xE8, + 0x61, 0x78, 0x80, 0xE4, 0xEE, 0x10, 0x76, 0x66, + 0x36, 0x99, 0xEF, 0x43, 0xEF, 0x9D, 0xB6, 0x51, + 0x03, 0x93, 0x0D, 0xCB, 0xCF, 0xAF, 0x1E, 0xFF, + 0xAD, 0x3D, 0xAF, 0xDE, 0xF6, 0x46, 0x10, 0x91, + 0x11, 0x07, 0xB3, 0xD3, 0x06, 0xAD, 0xAE, 0xD3, + 0x55, 0xB9, 0x3B, 0x26, 0xD5, 0x31, 0x61, 0xE5, + 0xA5, 0x65, 0x97, 0xBB, 0xE2, 0x13, 0x74, 0xD0, + 0x56, 0xA6, 0xA3, 0x1D, 0xC7, 0x77, 0x0C, 0x0E, + 0x12, 0xF1, 0xEA, 0x8B, 0x78, 0x73, 0xF1, 0x3D, + 0xBD, 0xB4, 0x0E, 0x63, 0x90, 0xEC, 0x66, 0x0C, + 0x56, 0x27, 0xC6, 0x31, 0x07, 0x6A, 0x00, 0x6D, + 0xE0, 0x86, 0x34, 0x7D, 0xC5, 0x5D, 0xF0, 0x32, + 0x0F, 0xD2, 0x68, 0x09, 0x91, 0xC0, 0xE1, 0x26, + 0xC2, 0x15, 0xB8, 0x16, 0x1C, 0xAE, 0xCE, 0x15, + 0x23, 0x28, 0x44, 0xE8, 0xE0, 0x81, 0x81, 0xDD, + 0xA3, 0x55, 0xEE, 0x10, 0xC4, 0x74, 0x3F, 0x44, + 0x54, 0x15, 0x63, 0x9F, 0xD6, 0x06, 0xFC, 0x1E, + 0x1C, 0xCB, 0x7C, 0x3B, 0x2F, 0x1F, 0xF5, 0xF5, + 0xF5, 0xAF, 0x79, 0x9F, 0x65, 0x82, 0x79, 0x5B, + 0xC6, 0xED, 0x76, 0x17, 0xD2, 0x92, 0xFE, 0x3C, + 0xA1, 0x8A, 0x0A, 0x07, 0xDF, 0xAF, 0xEF, 0x2F, + 0xEE, 0x7C, 0xC9, 0x04, 0x94, 0x27, 0x66, 0xE1, + 0x62, 0xEB, 0xFD, 0x90, 0x1A, 0xC8, 0x29, 0x29, + 0x89, 0x52, 0x76, 0x38, 0x60, 0x10, 0x50, 0x90, + 0xB0, 0xF2, 0x64, 0x9A, 0x20, 0x10, 0xB0, 0x50, + 0xD0, 0x89, 0x1B, 0xF6, 0xEE, 0x7E, 0x1E, 0x8E, + 0x86, 0x7D, 0x49, 0x41, 0x18, 0xCD, 0x8F, 0x6A, + 0xD7, 0x06, 0xA6, 0x80, 0x54, 0x5C, 0x16, 0x6F, + 0xEE, 0x39, 0x84, 0x08, 0xB1, 0x01, 0xB3, 0xD3, + 0x53, 0x59, 0xD8, 0xB7, 0xAF, 0x3F, 0x5F, 0x5D, + 0xFF, 0xA4, 0xD2, 0x9E, 0x46, 0xA6, 0x0A, 0xEA, + 0xB8, 0x7E, 0xC6, 0x68, 0xD2, 0xE2, 0x24, 0xF9, + 0x5C, 0x25, 0x33, 0xA3, 0xB9, 0x28, 0x48, 0x48, + 0xE8, 0x33, 0x77, 0x39, 0x6B, 0x2B, 0xC3, 0x42, + 0x62, 0x46, 0xE0, 0x0B, 0xCC, 0x8C, 0x2C, 0xCC, + 0x4C, 0xDC, 0xD1, 0x3F, 0xC5, 0xF9, 0x1B, 0xB7, + 0x37, 0x2E, 0x54, 0x3C, 0x33, 0xA8, 0x17, 0x86, + 0x4C, 0x94, 0xC2, 0x48, 0x83, 0x23, 0x63, 0xA3, + 0xA1, 0x5F, 0xED, 0x61, 0xB1, 0x01, 0x77, 0xBD, + 0x3A, 0xED, 0x55, 0xF8, 0x1B, 0xA8, 0xB4, 0x9C, + 0x10, 0x81, 0x4B, 0x1E, 0x06, 0x96, 0xF6, 0xE4, + 0x40, 0x1D, 0x6B, 0x27, 0xFF, 0xDF, 0x22, 0xF2, + 0xD2, 0x90, 0x06, 0xF8, 0x44, 0x72, 0xD2, 0x32, + 0xB2, 0x9B, 0x09, 0xE4, 0xFC, 0x6C, 0x0C, 0x4C, + 0x33, 0xF8, 0xBC, 0xB4, 0xED, 0x9D, 0xDD, 0x1D, + 0x4F, 0xF0, 0xC0, 0x6C, 0x94, 0x24, 0x8C, 0x40, + 0x68, 0x90, 0xD4, 0xB4, 0x6C, 0x6E, 0x02, 0xC3, + 0x81, 0x96, 0x22, 0xCE, 0xAD, 0x0C, 0x9C, 0xE7, + 0x47, 0x4E, 0xF4, 0x98, 0x82, 0x3E, 0x5F, 0x7D, + 0x9F, 0xC5, 0xF3, 0x53, 0x9A, 0xFA, 0x56, 0xB6, + 0xD3, 0xE0, 0xA9, 0x4D, 0xA6, 0x3B, 0x51, 0x19, + 0x91, 0xE7, 0x52, 0xDE, 0x0E, 0xBE, 0xC3, 0xF3, + 0x73, 0xA8, 0x12, 0x74, 0x49, 0xAD, 0xED, 0xAB, + 0xE6, 0xC2, 0xFC, 0xD5, 0xED, 0x55, 0x35, 0xE3, + 0x19, 0x3D, 0x4D, 0xC1, 0xE6, 0x56, 0x00, 0x81, + 0x01, 0x7B, 0x86, 0xE9, 0x80, 0x7C, 0x1F, 0x12, + 0x90, 0x2E, 0x70, 0x38, 0x51, 0xAF, 0xCC, 0x2C, + 0x86, 0xFD, 0xEA, 0xCB, 0x10, 0x6D, 0x0F, 0xAA, + 0xCD, 0x32, 0x35, 0x09, 0xD2, 0x42, 0x18, 0x78, + 0x3A, 0x22, 0x84, 0x49, 0xDE, 0x6D, 0x01, 0xC3, + 0x6A, 0xB2, 0x2D, 0x52, 0xA3, 0x30, 0x79, 0x8A, + 0xEF, 0xD1, 0x43, 0x9E, 0x14, 0xA7, 0xF7, 0x0D, + 0x2D, 0x34, 0x41, 0x3D, 0x44, 0xA5, 0xC6, 0xE3, + 0x87, 0x78, 0xC2, 0xA7, 0x4F, 0xC5, 0x05, 0xF7, + 0xB4, 0x7F, 0xE2, 0x17, 0xE6, 0x55, 0x1C, 0xCF, + 0xC4, 0x2C, 0xFC, 0x09, 0x25, 0x38, 0x5B, 0x29, + 0x09, 0x77, 0xED, 0xCD, 0xF0, 0x73, 0x3B, 0x5A, + 0x89, 0x51, 0x56, 0x6E, 0xB5, 0xC7, 0x64, 0x80, + 0x65, 0x5C, 0xCE, 0x13, 0x9D, 0x2E, 0x7E, 0x84, + 0xA4, 0xDE, 0x3D, 0x52, 0xB8, 0xCB, 0x8F, 0x82, + 0x01, 0x3F, 0x6A, 0x22, 0x4B, 0xA3, 0xC0, 0x30, + 0x8A, 0xF1, 0xE6, 0xDD, 0x06, 0x7B, 0x18, 0xBD, + 0xD8, 0x27, 0x20, 0x16, 0xCD, 0x4D, 0x17, 0x77, + 0x56, 0xD4, 0x61, 0xC0, 0x1B, 0x0E, 0x8A, 0x6E, + 0x5F, 0xD8, 0x6D, 0x31, 0xD3, 0xC3, 0x02, 0x99, + 0x1A, 0x0C, 0xB9, 0x70, 0x4B, 0xDF, 0x8F, 0x65, + 0x45, 0x83, 0xC5, 0xA9, 0x71, 0xC1, 0xBB, 0x7A, + 0xFA, 0x21, 0x97, 0xFB, 0x23, 0x93, 0x7F, 0xB2, + 0x30, 0x8B, 0xA9, 0xD3, 0x0B, 0xDB, 0xA6, 0x66, + 0xEC, 0x37, 0x03, 0x6B, 0x30, 0x84, 0x44, 0x97, + 0x15, 0xAE, 0x19, 0x75, 0xAD, 0x1D, 0x01, 0xD7, + 0x57, 0xEC, 0x26, 0x5C, 0x84, 0x54, 0x9C, 0x4A, + 0xCA, 0x71, 0x4F, 0x35, 0xED, 0x3D, 0xD5, 0x03, + 0x83, 0x38, 0x22, 0x58, 0x80, 0x50, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x79, 0xB9, + 0x39, 0xE2, 0x54, 0x38, 0xE0, 0x50, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x79, 0xB9, + 0x39, 0xE2, 0x54, 0x38, 0xE0, 0x50, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x79, 0xB9, + 0x39, 0xE2, 0x7C, 0x19, 0xC1, 0x11, 0x55, 0x9C, + 0x1C, 0xA7, 0x03, 0x5F, 0x87, 0x37, 0x97, 0x41, + 0xC1, 0x7A, 0x7C, 0x10, 0xC8, 0x78, 0x64, 0xA3, + 0x23, 0x98, 0x82, 0xE3, 0x39, 0xE9, 0x79, 0xBE, + 0x3E, 0x85, 0xC3, 0xA2, 0x78, 0xA8, 0xB8, 0x76, + 0xF4, 0x4F, 0xF1, 0x92, 0x48, 0x98, 0x44, 0x83, + 0x03, 0xB8, 0x86, 0xF9, 0x23, 0xF3, 0x3F, 0xEA, + 0x68, 0xD3, 0x53, 0x7E, 0xA6, 0x97, 0x45, 0x80, + 0xB1, 0xDA, 0x69, 0xA7, 0xDF, 0x6C, 0x9D, 0xEC, + 0x69, 0x10, 0xED, 0x81, 0xDB, 0x02, 0x62, 0xC7, + 0x46, 0x9D, 0x0E, 0x60, 0xB8, 0x2D, 0x49, 0x89, + 0xA8, 0xC0, 0x73, 0xAE, 0xC2, 0x77, 0xF2, 0xA3, + 0x04, 0xC2, 0x84, 0xE8, 0x30, 0x80, 0xD6, 0x57, + 0xD7, 0x3D, 0x3E, 0x57, 0xAE, 0xA8, 0xCD, 0x24, + 0x77, 0xB1, 0xF7, 0x9B, 0x43, 0xF3, 0xA5, 0x24, + 0xA4, 0xCE, 0xC0, 0xA9, 0x40, 0x4B, 0x2E, 0xCF, + 0xF3, 0x2D, 0x1A, 0xCC, 0x11, 0x30, 0xE7, 0x22, + 0x03, 0x61, 0xD2, 0x17, 0x16, 0x24, 0x2D, 0xFD, + 0x54, 0xAC, 0xA3, 0x56, 0x93, 0xD3, 0x85, 0x04, + 0x84, 0x6E, 0x6D, 0x04, 0xFD, 0xF0, 0x95, 0x7C, + 0x6F, 0xA9, 0xEF, 0x83, 0x5B, 0xEB, 0x8B, 0x4B, + 0xCB, 0x10, 0xA6, 0xCA, 0x12, 0xA2, 0xC2, 0x02, + 0x82, 0x59, 0xEE, 0x82, 0x5E, 0xEE, 0x76, 0xA0, + 0x22, 0x99, +}; + +static unsigned char vfs5011_init_06[] = { /* 2855 B */ + 0x02, 0xB0, 0x00, 0x62, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x64, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x92, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0x83, 0xA7, 0x00, 0x5F, 0x82, 0xA7, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x00, 0x5F, 0x82, 0x27, 0x00, + 0xFF, 0x83, 0x27, 0x20, 0x5F, 0x82, 0x27, 0x20, + 0xFF, 0x8B, 0x27, 0x20, 0x60, 0x8A, 0x27, 0x20, + 0xFF, 0x93, 0x27, 0x20, 0x61, 0x92, 0x27, 0x20, + 0xFF, 0x9B, 0x27, 0x20, 0x62, 0x9A, 0x27, 0x20, + 0xFF, 0xA3, 0x27, 0x20, 0x63, 0xA2, 0x27, 0x20, + 0xFF, 0xAB, 0x27, 0x20, 0x64, 0xAA, 0x27, 0x20, + 0xFF, 0xB3, 0x27, 0x20, 0x65, 0xB2, 0x27, 0x20, + 0xFF, 0xBB, 0x27, 0x20, 0x66, 0xBA, 0x27, 0x20, + 0xFF, 0xC3, 0x27, 0x20, 0x67, 0xC2, 0x27, 0x20, + 0xFF, 0xCB, 0x27, 0x20, 0x68, 0xCA, 0x27, 0x20, + 0xFF, 0xD3, 0x27, 0x20, 0x69, 0xD2, 0x27, 0x20, + 0xFF, 0xDB, 0x27, 0x20, 0x6A, 0xDA, 0x27, 0x20, + 0xFF, 0xE3, 0x27, 0x20, 0x6B, 0xE2, 0x27, 0x20, + 0xFF, 0xEB, 0x27, 0x20, 0x6C, 0xEA, 0x27, 0x20, + 0xFF, 0xF3, 0x27, 0x20, 0x6D, 0xF2, 0x27, 0x20, + 0xFF, 0xFB, 0x27, 0x20, 0x6E, 0xFA, 0x27, 0x20, + 0xFF, 0x85, 0x27, 0x20, 0x6F, 0x84, 0x27, 0x20, + 0xFF, 0x8D, 0x27, 0x20, 0x70, 0x8C, 0x27, 0x20, + 0xFF, 0x95, 0x27, 0x20, 0x71, 0x94, 0x27, 0x20, + 0xFF, 0x9D, 0x27, 0x20, 0x72, 0x9C, 0x27, 0x20, + 0xFF, 0xA5, 0x27, 0x20, 0x73, 0xA4, 0x27, 0x20, + 0xFF, 0xAD, 0x27, 0x20, 0x74, 0xAC, 0x27, 0x20, + 0xFF, 0xB5, 0x27, 0x20, 0x75, 0xB4, 0x27, 0x20, + 0xFF, 0xBD, 0x27, 0x20, 0x76, 0xBC, 0x27, 0x20, + 0xFF, 0xC5, 0x27, 0x20, 0x77, 0xC4, 0x27, 0x20, + 0xFF, 0xCD, 0x27, 0x20, 0x78, 0xCC, 0x27, 0x20, + 0xFF, 0xD5, 0x27, 0x20, 0x79, 0xD4, 0x27, 0x20, + 0xFF, 0xDD, 0x27, 0x20, 0x7A, 0xDC, 0x27, 0x20, + 0xFF, 0xE5, 0x27, 0x20, 0x7B, 0xE4, 0x27, 0x20, + 0xFF, 0xED, 0x27, 0x20, 0x7C, 0xEC, 0x27, 0x20, + 0xFF, 0xF5, 0x27, 0x20, 0x7D, 0xF4, 0x27, 0x20, + 0xFF, 0xFD, 0x27, 0x20, 0x7E, 0xFC, 0x27, 0x20, + 0xFF, 0x87, 0x27, 0x20, 0x7F, 0x86, 0x27, 0x20, + 0xFF, 0x8F, 0x27, 0x20, 0x80, 0x8E, 0x27, 0x20, + 0xFF, 0x97, 0x27, 0x20, 0x81, 0x96, 0x27, 0x20, + 0xFF, 0x9F, 0x27, 0x20, 0x82, 0x9E, 0x27, 0x20, + 0xFF, 0xA7, 0x27, 0x20, 0x83, 0xA6, 0x27, 0x20, + 0xFF, 0xAF, 0x27, 0x20, 0x84, 0xAE, 0x27, 0x20, + 0xFF, 0xB7, 0x27, 0x20, 0x85, 0xB6, 0x27, 0x20, + 0xFF, 0xBF, 0x27, 0x20, 0x86, 0xBE, 0x27, 0x20, + 0xFF, 0xC7, 0x27, 0x20, 0x87, 0xC6, 0x27, 0x20, + 0xFF, 0xCF, 0x27, 0x20, 0x88, 0xCE, 0x27, 0x20, + 0xFF, 0xD7, 0x27, 0x20, 0x89, 0xD6, 0x27, 0x20, + 0xFF, 0xDF, 0x27, 0x20, 0x8A, 0xDE, 0x27, 0x20, + 0xFF, 0xE7, 0x27, 0x20, 0x8B, 0xE6, 0x27, 0x20, + 0xFF, 0xEF, 0x27, 0x20, 0x8C, 0xEE, 0x27, 0x20, + 0xFF, 0xF7, 0x27, 0x20, 0x8D, 0xF6, 0x27, 0x20, + 0xFF, 0xFF, 0x27, 0x20, 0x8E, 0xFE, 0x27, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x00, 0x0D, 0x00, + 0x78, 0x01, 0x50, 0x01, 0x00, 0x00, 0x0E, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x6E, + 0x00, 0x65, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, + 0x00, 0x6E, 0x00, 0x67, 0x00, 0x5C, 0x00, 0x70, + 0x00, 0x72, 0x00, 0x69, 0x00, 0x76, 0x03, 0x00, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x07, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x07, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x08, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x08, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x02, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x02, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x03, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x03, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x04, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x04, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x05, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x05, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x06, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x0C, 0x00, + 0x00, 0x38, 0x02, 0x06, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x03, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x04, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x04, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x05, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x05, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x06, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x07, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x08, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x08, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x09, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x38, 0x02, 0x09, + 0x00, 0x00, 0xFD, 0x00, 0xFF, 0xFF, 0x10, 0x00, + 0x00, 0x38, 0x00, 0x0A, 0x00, 0x00, 0xFD, 0x00, + 0xFF, 0xFF, 0x0E, 0x00, 0xE0, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x04, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x04, 0x01, 0x02, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x08, 0x01, 0x02, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x08, 0x01, 0x04, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x10, 0x01, 0x04, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x10, 0x01, 0x08, 0x01, 0x01, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x10, 0x01, 0x08, 0x01, 0x02, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x02, 0x1F, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x0F, 0x00, + 0x01, 0x00, 0x02, 0x10, 0x00, 0x01, 0x00, 0x01, + 0x11, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x0E, 0x15, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, +}; + +static unsigned char vfs5011_init_07[] = { /* 2503 B */ + 0x02, 0xB0, 0x00, 0x00, 0x01, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x40, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x03, 0x0D, 0x00, + 0x28, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x1C, 0x02, 0xB0, 0x01, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x1F, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x01, + 0x11, 0x00, 0x02, 0x00, 0x00, 0x01, 0x12, 0x00, + 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, +}; + +static unsigned char vfs5011_init_08[] = { /* 2516 B */ + 0x02, 0xB0, 0x00, 0x60, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x05, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x05, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x05, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x05, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x00, + 0x28, 0x00, 0x14, 0x00, 0x00, 0x38, 0x00, 0x00, + 0x6E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x8F, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, + 0x11, 0x00, 0x02, 0x00, 0x60, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, + 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x28, 0x00, 0x00, +}; + +static unsigned char vfs5011_init_09[] = { /* 2742 B */ + 0x02, 0xB0, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE7, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xFF, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xFF, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x30, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x80, 0xF2, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x00, 0x0D, 0x00, + 0x28, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x73, 0x00, 0x00, 0x10, 0x01, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0xE0, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x04, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x08, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, + 0x11, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x0E, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, + 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x28, 0x00, 0x00, +}; + +static unsigned char vfs5011_init_10[] = { /* 2612 B */ + 0x02, 0xB0, 0x00, 0x20, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE7, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xFF, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xFF, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x30, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0xFF, 0xF3, 0x47, 0x20, 0x80, 0xF2, 0x47, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x01, 0x0D, 0x00, + 0x28, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x1C, 0x02, 0xB0, 0x01, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, + 0x11, 0x00, 0x02, 0x00, 0x20, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, + 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x28, 0x00, 0x00, +}; + +static unsigned char vfs5011_init_11[] = { /* 2625 B */ + 0x02, 0xB0, 0x00, 0x20, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x01, 0x80, 0x4F, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE6, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xE7, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0xE8, 0x03, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x00, 0x3E, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x08, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x02, 0xA8, 0x02, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xFF, 0x07, 0x20, 0x8E, 0xFE, 0x07, 0x20, + 0xFF, 0xF7, 0x07, 0x20, 0x8D, 0xF6, 0x07, 0x20, + 0xFF, 0xEF, 0x07, 0x20, 0x8C, 0xEE, 0x07, 0x20, + 0xFF, 0xE7, 0x07, 0x20, 0x8B, 0xE6, 0x07, 0x20, + 0xFF, 0xDF, 0x07, 0x20, 0x8A, 0xDE, 0x07, 0x20, + 0xFF, 0xD7, 0x07, 0x20, 0x89, 0xD6, 0x07, 0x20, + 0xFF, 0xCF, 0x07, 0x20, 0x88, 0xCE, 0x07, 0x20, + 0xFF, 0xC7, 0x07, 0x20, 0x87, 0xC6, 0x07, 0x20, + 0xFF, 0xBF, 0x07, 0x20, 0x86, 0xBE, 0x07, 0x20, + 0xFF, 0xB7, 0x07, 0x20, 0x85, 0xB6, 0x07, 0x20, + 0xFF, 0xAF, 0x07, 0x20, 0x84, 0xAE, 0x07, 0x20, + 0xFF, 0xA7, 0x07, 0x20, 0x83, 0xA6, 0x07, 0x20, + 0xFF, 0x9F, 0x07, 0x20, 0x82, 0x9E, 0x07, 0x20, + 0xFF, 0x97, 0x07, 0x20, 0x81, 0x96, 0x07, 0x20, + 0xFF, 0x8F, 0x07, 0x20, 0x80, 0x8E, 0x07, 0x20, + 0xFF, 0x87, 0x07, 0x20, 0x7F, 0x86, 0x07, 0x20, + 0xFF, 0xFD, 0x07, 0x20, 0x7E, 0xFC, 0x07, 0x20, + 0xFF, 0xF5, 0x07, 0x20, 0x7D, 0xF4, 0x07, 0x20, + 0xFF, 0xED, 0x07, 0x20, 0x7C, 0xEC, 0x07, 0x20, + 0xFF, 0xE5, 0x07, 0x20, 0x7B, 0xE4, 0x07, 0x20, + 0xFF, 0xDD, 0x07, 0x20, 0x7A, 0xDC, 0x07, 0x20, + 0xFF, 0xD5, 0x07, 0x20, 0x79, 0xD4, 0x07, 0x20, + 0xFF, 0xCD, 0x07, 0x20, 0x78, 0xCC, 0x07, 0x20, + 0xFF, 0xC5, 0x07, 0x20, 0x77, 0xC4, 0x07, 0x20, + 0xFF, 0xBD, 0x07, 0x20, 0x76, 0xBC, 0x07, 0x20, + 0xFF, 0xB5, 0x07, 0x20, 0x75, 0xB4, 0x07, 0x20, + 0xFF, 0xAD, 0x07, 0x20, 0x74, 0xAC, 0x07, 0x20, + 0xFF, 0xA5, 0x07, 0x20, 0x73, 0xA4, 0x07, 0x20, + 0xFF, 0x9D, 0x07, 0x20, 0x72, 0x9C, 0x07, 0x20, + 0xFF, 0x95, 0x07, 0x20, 0x71, 0x94, 0x07, 0x20, + 0xFF, 0x8D, 0x07, 0x20, 0x70, 0x8C, 0x07, 0x20, + 0xFF, 0x85, 0x07, 0x20, 0x6F, 0x84, 0x07, 0x20, + 0xFF, 0xFB, 0x07, 0x20, 0x6E, 0xFA, 0x07, 0x20, + 0xFF, 0xF3, 0x07, 0x20, 0x6D, 0xF2, 0x07, 0x20, + 0xFF, 0xEB, 0x07, 0x20, 0x6C, 0xEA, 0x07, 0x20, + 0xFF, 0xE3, 0x07, 0x20, 0x6B, 0xE2, 0x07, 0x20, + 0xFF, 0xDB, 0x07, 0x20, 0x6A, 0xDA, 0x07, 0x20, + 0xFF, 0xD3, 0x07, 0x20, 0x69, 0xD2, 0x07, 0x20, + 0xFF, 0xCB, 0x07, 0x20, 0x68, 0xCA, 0x07, 0x20, + 0xFF, 0xC3, 0x07, 0x20, 0x67, 0xC2, 0x07, 0x20, + 0xFF, 0xBB, 0x07, 0x20, 0x66, 0xBA, 0x07, 0x20, + 0xFF, 0xB3, 0x07, 0x20, 0x65, 0xB2, 0x07, 0x20, + 0xFF, 0xAB, 0x07, 0x20, 0x64, 0xAA, 0x07, 0x20, + 0xFF, 0xA3, 0x07, 0x20, 0x63, 0xA2, 0x07, 0x20, + 0xFF, 0x9B, 0x07, 0x20, 0x62, 0x9A, 0x07, 0x20, + 0xFF, 0x93, 0x07, 0x20, 0x61, 0x92, 0x07, 0x20, + 0xFF, 0x8B, 0x07, 0x20, 0x60, 0x8A, 0x07, 0x20, + 0xFF, 0x83, 0x07, 0x20, 0x5F, 0x82, 0x07, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x01, 0x0D, 0x00, + 0x28, 0x00, 0x20, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0x20, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x1C, 0x02, 0xB0, 0x01, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x00, + 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x02, + 0x11, 0x00, 0x02, 0x00, 0x20, 0x00, 0x12, 0x00, + 0x01, 0x00, 0x01, 0x05, 0x00, 0x0E, 0x00, 0x0C, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, + 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, + 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, + 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, + 0x00, +}; + +static unsigned char vfs5011_init_12[] = { /* 2666 B */ + 0x02, 0xF0, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x11, 0x00, + 0x02, 0x00, 0x0E, 0x00, 0x13, 0x00, 0x04, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, + 0x1E, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x0A, 0x00, + 0x08, 0x00, 0xA8, 0x00, 0xE6, 0x82, 0xA0, 0x0A, + 0x26, 0x06, 0x07, 0x00, 0x3C, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0x78, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, + 0x5D, 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, + 0x5D, 0x00, 0x18, 0xA2, 0x55, 0x03, 0x20, 0x80, + 0x80, 0x00, 0xFF, 0x10, 0x0F, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, + 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, + 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, + 0x10, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, + 0x09, 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x44, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, + 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, + 0x00, 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, + 0x00, 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x20, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, + 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, + 0x00, 0x00, +}; + +static unsigned char vfs5011_init_13[] = { /* 57 B */ + 0x12, 0x90, 0x02, 0x00, 0x00, 0xFE, 0x03, 0x00, + 0x00, 0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, 0x5D, + 0x00, 0x18, 0xA2, 0x55, 0x03, 0xD3, 0xA2, 0x5D, + 0x00, 0x18, 0xA2, 0x55, 0x03, 0x20, 0xFF, 0x80, + 0x00, 0xFF, 0x04, 0x0F, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, + 0x00, +}; + +static unsigned char vfs5011_init_14[] = { /* 2561 B */ + 0x02, 0xF0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, 0xFD, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x10, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, + 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, + 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x20, + 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, 0x30, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, + 0x00, +}; + +static unsigned char vfs5011_cmd_27[] = { /* 1 B */ + 0x27, +}; + +static unsigned char vfs5011_init_15[] = { /* 3794 B */ + 0x06, 0x6B, 0x06, 0x6A, 0x76, 0xC8, 0x18, 0xD4, + 0x54, 0xEF, 0x71, 0x14, 0xCC, 0x1C, 0x58, 0x91, + 0x11, 0xAA, 0x80, 0xF4, 0x2C, 0xFC, 0x9F, 0x5F, + 0xDF, 0x04, 0x02, 0x62, 0xBA, 0x6A, 0x5A, 0x97, + 0x17, 0xCC, 0x46, 0x22, 0xFA, 0x2A, 0xBE, 0x03, + 0x87, 0x3C, 0x9E, 0xFE, 0x26, 0xF6, 0x96, 0x7E, + 0xFA, 0x11, 0x27, 0x66, 0xBA, 0x3A, 0x5A, 0xBA, + 0x3E, 0xD5, 0x4F, 0x03, 0xDF, 0x5F, 0x7F, 0x9F, + 0x1B, 0xF0, 0xA2, 0xEF, 0x33, 0xB3, 0xD3, 0x13, + 0x93, 0x70, 0xFA, 0x96, 0x4E, 0xC6, 0xA6, 0xC6, + 0x46, 0xA5, 0x2F, 0xE3, 0x3B, 0xB3, 0xD3, 0x33, + 0xB3, 0x50, 0xE8, 0xA4, 0x7C, 0xF4, 0x94, 0x14, + 0x94, 0x77, 0xC9, 0xE5, 0x3D, 0xB5, 0xD5, 0x75, + 0xF5, 0x16, 0xA8, 0xA4, 0x7C, 0xF4, 0x94, 0xD4, + 0x54, 0xB7, 0x09, 0xE5, 0x3D, 0xB5, 0x2D, 0xF4, + 0x74, 0xCF, 0x29, 0x5C, 0x84, 0x54, 0x14, 0xAA, + 0x2E, 0x95, 0xF7, 0xE0, 0x3C, 0xEC, 0x8C, 0x52, + 0xD6, 0x3D, 0x7B, 0x0E, 0xD6, 0x06, 0x82, 0x49, + 0xC9, 0x72, 0x7C, 0x18, 0xC0, 0x10, 0x10, 0xF6, + 0x72, 0xC9, 0xC3, 0xA8, 0x70, 0xA0, 0xD8, 0x77, + 0xF3, 0x48, 0x06, 0x04, 0xD8, 0x08, 0x90, 0x5B, + 0xDB, 0x60, 0x36, 0x43, 0x9B, 0x4B, 0xD4, 0xE3, + 0x9C, 0xB8, 0xF1, 0x72, 0x55, 0x1A, 0x8E, 0x57, + 0xD7, 0x6C, 0xDA, 0xBE, 0x66, 0xD6, 0xEA, 0x3D, + 0xBF, 0x04, 0xB2, 0xCE, 0x16, 0xA6, 0x06, 0xDE, + 0x5E, 0xE5, 0xB7, 0xC3, 0x1B, 0xCB, 0x47, 0x9F, + 0x1F, 0xA4, 0x3E, 0x5B, 0x83, 0x53, 0x53, 0x8A, + 0x0A, 0xB1, 0x93, 0xF9, 0x21, 0xF1, 0x31, 0xE6, + 0x64, 0xDF, 0x95, 0xE0, 0x38, 0xE8, 0xB4, 0x6D, + 0xED, 0x56, 0x1D, 0x8E, 0x56, 0xE6, 0x79, 0xB9, + 0xC6, 0xE2, 0x62, 0x4F, 0x97, 0x02, 0x40, 0x80, + 0x65, 0xB8, 0x0E, 0x07, 0xC2, 0x72, 0x37, 0xBE, + 0x3E, 0x00, 0xF2, 0xB8, 0xF1, 0x6D, 0x0E, 0x6F, + 0xC2, 0x1A, 0xA0, 0xC4, 0x95, 0x2F, 0xCD, 0x44, + 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, + 0x17, 0x7D, 0xE4, 0x8B, 0xFE, 0x4C, 0x0D, 0xE3, + 0x60, 0xFD, 0x4B, 0x27, 0x34, 0xA6, 0xCD, 0xB6, + 0x10, 0xC0, 0x7C, 0x98, 0x42, 0x72, 0x92, 0x26, + 0x21, 0x60, 0x26, 0x4C, 0x95, 0x25, 0xA0, 0x03, + 0xA6, 0x50, 0xEC, 0x9D, 0xB5, 0x05, 0x53, 0xD2, + 0x52, 0xA9, 0x7E, 0x12, 0x2F, 0x65, 0xFA, 0x1A, + 0x7C, 0xB4, 0x12, 0x5E, 0x86, 0x3A, 0x50, 0xF5, + 0x53, 0xAD, 0xBA, 0xE6, 0x3D, 0x3C, 0x6D, 0xAE, + 0xCB, 0x33, 0xAD, 0xDC, 0xF4, 0x44, 0x12, 0x93, + 0x13, 0xF9, 0x7D, 0x12, 0xEB, 0x68, 0x0B, 0xE2, + 0x21, 0xE7, 0xA1, 0xCD, 0x15, 0xA5, 0xF3, 0x72, + 0xF2, 0xAB, 0x1F, 0x7E, 0xAA, 0x01, 0xE1, 0xA1, + 0x25, 0xA8, 0x06, 0x6D, 0xB9, 0x0C, 0x60, 0xA6, + 0x64, 0xAD, 0x15, 0x65, 0xBA, 0x30, 0x14, 0x66, + 0x22, 0x78, 0xFC, 0x94, 0x4C, 0x4E, 0x25, 0x9B, + 0xD9, 0x06, 0xB1, 0xEA, 0x89, 0x35, 0x62, 0x1E, + 0x8F, 0x69, 0xD4, 0x7F, 0x1C, 0xA0, 0xFD, 0x31, + 0x77, 0xAD, 0x1B, 0x40, 0xA4, 0x10, 0xB7, 0xCC, + 0x4D, 0xAB, 0x16, 0xD7, 0x0C, 0x01, 0x62, 0x87, + 0xBF, 0x4C, 0x50, 0x5A, 0xD8, 0x3B, 0x50, 0xE7, + 0x2C, 0xB3, 0xB7, 0x1F, 0x46, 0xA0, 0x57, 0x6B, + 0x46, 0x98, 0x93, 0xFA, 0xC7, 0xC1, 0x89, 0x45, + 0xDE, 0xD7, 0xC3, 0xC3, 0xBB, 0xCF, 0xEE, 0xEE, + 0xA8, 0xB3, 0xDF, 0x61, 0x4B, 0xE6, 0x04, 0x04, + 0x40, 0xDA, 0xAC, 0x43, 0xDA, 0x9A, 0x15, 0x25, + 0x45, 0x7D, 0xEA, 0x0C, 0x3A, 0x7A, 0xD4, 0x87, + 0xC5, 0x43, 0x77, 0x1D, 0xC6, 0x76, 0xD4, 0xB6, + 0x5A, 0x4B, 0x3F, 0x91, 0x55, 0x98, 0xC2, 0xCE, + 0x8C, 0x5B, 0xED, 0x53, 0x99, 0x20, 0x6D, 0xA6, + 0xF1, 0x96, 0x21, 0x41, 0xBB, 0x16, 0x86, 0x46, + 0xC6, 0x1D, 0x9D, 0xB0, 0x68, 0x69, 0x3D, 0xFE, + 0xC6, 0x16, 0x2C, 0x2B, 0x51, 0x40, 0x40, 0x2A, + 0x01, 0xBF, 0xB3, 0xFF, 0x8A, 0x38, 0x3D, 0x51, + 0xF4, 0x32, 0x74, 0x18, 0xC0, 0x70, 0x26, 0xA7, + 0x27, 0x5D, 0xDE, 0xB1, 0xD8, 0x5E, 0x3D, 0x30, + 0xB2, 0x0C, 0xEC, 0xA5, 0xCC, 0x44, 0x27, 0xC7, + 0x6D, 0x16, 0x01, 0x5A, 0x81, 0xFC, 0x9E, 0x3B, + 0xEE, 0x10, 0x17, 0x41, 0x9A, 0x0A, 0x50, 0x30, + 0x72, 0x6A, 0xCC, 0x01, 0xE0, 0x53, 0x3F, 0xFD, + 0x54, 0x8C, 0x13, 0x6C, 0x9D, 0x0E, 0x47, 0xB4, + 0xD1, 0x59, 0xCA, 0x17, 0xF3, 0x40, 0x10, 0xEA, + 0xCA, 0xD3, 0xA6, 0xDA, 0xA3, 0x28, 0x4B, 0x6E, + 0xBC, 0x42, 0xF8, 0x9D, 0x75, 0xFF, 0x3F, 0xCD, + 0x8E, 0x45, 0xE8, 0x1D, 0xEC, 0x5F, 0x74, 0x87, + 0x61, 0x23, 0x63, 0xA2, 0x79, 0x7B, 0xBB, 0xDE, + 0x72, 0xE5, 0xB6, 0x7B, 0x8B, 0x9A, 0xC7, 0x04, + 0x35, 0xD0, 0x65, 0xCB, 0xD0, 0x44, 0x41, 0xD1, + 0x74, 0x1E, 0xE8, 0x87, 0x6F, 0xE5, 0x25, 0x44, + 0xFB, 0x23, 0xA7, 0x08, 0xF4, 0x89, 0xEA, 0xCF, + 0x1E, 0xE0, 0xE7, 0xC9, 0x12, 0x92, 0xC8, 0xA8, + 0x89, 0x13, 0xA6, 0x07, 0xDC, 0xC9, 0xFA, 0x1F, + 0x2E, 0xB1, 0x04, 0x58, 0xBA, 0xAA, 0x6B, 0xE8, + 0x6B, 0x7D, 0xC8, 0x01, 0x8B, 0x1E, 0xCF, 0x49, + 0xCA, 0x21, 0xAD, 0x61, 0x18, 0xED, 0x8E, 0x83, + 0x00, 0x3E, 0xD9, 0x90, 0x78, 0xE2, 0x22, 0xFF, + 0x8F, 0x54, 0xD4, 0xF9, 0x21, 0x10, 0x37, 0xF4, + 0xFC, 0x2F, 0x15, 0x31, 0x48, 0xB0, 0xD3, 0x36, + 0xC1, 0x32, 0x99, 0x05, 0xDD, 0x6D, 0x3B, 0xBA, + 0x3A, 0x60, 0x91, 0xFE, 0xAE, 0x16, 0xFA, 0x72, + 0x53, 0xC0, 0x75, 0xFC, 0x51, 0xC9, 0x0C, 0x38, + 0x99, 0x5F, 0x19, 0x75, 0xAD, 0x1D, 0x4B, 0xCA, + 0x4A, 0x3C, 0x88, 0x01, 0x40, 0xD2, 0x33, 0xB4, + 0x37, 0x64, 0xDA, 0x3A, 0xAA, 0xBB, 0x93, 0x50, + 0xF5, 0x5A, 0xC4, 0xB5, 0x9D, 0x2D, 0x7B, 0xFA, + 0x7A, 0x84, 0x17, 0x7B, 0x22, 0xD8, 0xBB, 0xEA, + 0x58, 0x80, 0x97, 0xB2, 0x69, 0x70, 0x49, 0x00, + 0x89, 0x4F, 0x09, 0x65, 0xBD, 0x0D, 0x5B, 0xDA, + 0x5A, 0xB0, 0x32, 0x5D, 0x89, 0x1E, 0x46, 0x85, + 0x54, 0xC4, 0x71, 0x8F, 0x54, 0xEC, 0xEE, 0x8F, + 0x7F, 0xAF, 0x90, 0xEA, 0x7A, 0xCC, 0x7D, 0xF1, + 0x72, 0xA5, 0x79, 0x19, 0xC6, 0xF4, 0x5D, 0x61, + 0xF7, 0x24, 0x98, 0xD2, 0x53, 0xEB, 0x26, 0xE4, + 0x01, 0x67, 0xF7, 0xB6, 0x64, 0xC9, 0x59, 0xF3, + 0x30, 0x59, 0xFC, 0x9B, 0xD1, 0x65, 0x05, 0xD3, + 0x68, 0xB8, 0x68, 0x7D, 0xB5, 0xC7, 0xB3, 0x8F, + 0x59, 0x2E, 0x92, 0x5C, 0xC7, 0x7F, 0x3D, 0xFE, + 0x73, 0x88, 0x1F, 0x77, 0xB2, 0xF2, 0x9E, 0x55, + 0x57, 0x8F, 0x34, 0x9A, 0x61, 0x0C, 0x7B, 0xD3, + 0x5C, 0x15, 0xAE, 0xC2, 0x16, 0xB4, 0xC2, 0x2B, + 0xA5, 0x75, 0x6A, 0xA4, 0x31, 0x81, 0xA7, 0x67, + 0xE7, 0x30, 0x84, 0x28, 0xD0, 0x60, 0xA2, 0x71, + 0xF9, 0xE0, 0x33, 0xFF, 0xAB, 0x01, 0x04, 0x22, + 0x84, 0x42, 0x04, 0x02, 0x99, 0xFB, 0x9F, 0x5F, + 0xB9, 0x7F, 0xF5, 0x21, 0xDB, 0xC6, 0xA5, 0x00, + 0x60, 0x9D, 0x8B, 0x07, 0xAB, 0x7D, 0x03, 0xE2, + 0xD3, 0x45, 0xF0, 0x6E, 0xBD, 0x0D, 0x4B, 0xA4, + 0x23, 0x8A, 0x77, 0x1B, 0xCF, 0x75, 0x30, 0x96, + 0x33, 0xE4, 0x6A, 0x94, 0x6F, 0x01, 0xA1, 0x41, + 0xC1, 0x88, 0x5B, 0x97, 0xCD, 0x3E, 0x56, 0xD0, + 0x53, 0x88, 0x9C, 0xE3, 0x3C, 0x00, 0x1A, 0xA8, + 0x6C, 0xB7, 0xA3, 0xDC, 0x03, 0x96, 0x14, 0xF2, + 0x7E, 0xB7, 0x1C, 0x80, 0xEA, 0x49, 0x21, 0x8B, + 0x48, 0x85, 0xF8, 0x93, 0x89, 0x3D, 0x5D, 0x5F, + 0x13, 0x33, 0x93, 0xC3, 0x1C, 0x4E, 0x2D, 0xE0, + 0xE2, 0x1D, 0x2A, 0x51, 0xE7, 0x07, 0xF5, 0x38, + 0xB8, 0x75, 0x4A, 0x2A, 0xFE, 0x5C, 0x37, 0x0E, + 0x7C, 0xEA, 0x5C, 0xB6, 0x7E, 0xCE, 0x2C, 0x25, + 0x5C, 0xD1, 0xFF, 0x66, 0x06, 0x94, 0x59, 0x9A, + 0x7F, 0x7D, 0xED, 0x21, 0x69, 0xAD, 0xC6, 0x9F, + 0x49, 0x7B, 0xC7, 0xA7, 0x74, 0xC8, 0xE4, 0xC6, + 0x65, 0x63, 0x07, 0xC9, 0x65, 0x0F, 0xBC, 0xBC, + 0x1C, 0xC7, 0xD3, 0xAC, 0x7C, 0x2E, 0x2B, 0x4B, + 0xB9, 0x3F, 0xF7, 0x59, 0xC2, 0x7A, 0x0C, 0x86, + 0xF4, 0x23, 0xFB, 0x75, 0xE9, 0x59, 0x9B, 0x48, + 0xC0, 0x7E, 0x13, 0x59, 0x07, 0x72, 0xED, 0x00, + 0x87, 0x50, 0xE9, 0x45, 0xBD, 0x0D, 0xCF, 0x1C, + 0x94, 0xCD, 0x1E, 0xD2, 0x1C, 0x36, 0xA5, 0x80, + 0xD9, 0x24, 0x8F, 0x13, 0xC7, 0x75, 0x53, 0x5B, + 0x24, 0x47, 0xD3, 0x12, 0xC9, 0x5C, 0xE8, 0x0E, + 0x2E, 0x65, 0xA7, 0xAD, 0x6C, 0xFB, 0x97, 0x5C, + 0x0E, 0xF6, 0x9D, 0x33, 0x49, 0x8D, 0x27, 0x24, + 0x64, 0x9F, 0x29, 0x97, 0x2A, 0x3A, 0xF8, 0x2B, + 0xA3, 0x0A, 0xE0, 0xF2, 0x96, 0x7C, 0x76, 0x55, + 0xD9, 0x6F, 0x0B, 0x29, 0xF1, 0xE3, 0x90, 0x58, + 0xBD, 0xB0, 0x20, 0xCA, 0x1B, 0xAB, 0xC7, 0x78, + 0xF4, 0x7B, 0x8F, 0xA0, 0x70, 0xAA, 0x89, 0xBB, + 0x7F, 0xA4, 0xA0, 0xDF, 0x0C, 0x20, 0x0B, 0x79, + 0xAD, 0x8A, 0x30, 0xA6, 0x72, 0x4A, 0xA8, 0x2C, + 0xAC, 0x12, 0x70, 0x3A, 0x70, 0xD4, 0x48, 0x1A, + 0x53, 0x79, 0x5D, 0x65, 0x41, 0xD3, 0xB0, 0x7D, + 0xDD, 0x27, 0x95, 0xE4, 0xCC, 0x51, 0x36, 0x70, + 0x2F, 0x0B, 0x1F, 0x67, 0x43, 0xE5, 0x5F, 0x77, + 0xFB, 0xA8, 0x9C, 0xB4, 0x6C, 0x6A, 0xB0, 0x60, + 0xEC, 0xCD, 0xDE, 0x63, 0x9D, 0x0F, 0x7B, 0x47, + 0xE5, 0xFC, 0xBB, 0xF5, 0x79, 0x35, 0x53, 0x0E, + 0x71, 0x4F, 0x29, 0x63, 0x96, 0x21, 0x07, 0x3B, + 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x0B, 0x5F, 0x9C, + 0x44, 0x9A, 0x6E, 0xA2, 0x8A, 0x70, 0x55, 0xA7, + 0x23, 0x78, 0xE8, 0xA7, 0x4E, 0xD8, 0xFB, 0x08, + 0xE9, 0x79, 0xCC, 0xD1, 0x45, 0xF6, 0x9A, 0xF2, + 0x54, 0xEC, 0x75, 0x7F, 0x24, 0x8A, 0xE6, 0x55, + 0x47, 0xB9, 0xD1, 0x7D, 0x85, 0x35, 0xC7, 0x61, + 0x41, 0xA8, 0x5A, 0xB6, 0xDC, 0x69, 0x04, 0x66, + 0xE1, 0x3A, 0x3C, 0xE1, 0x3D, 0x3D, 0xF5, 0xA6, + 0x84, 0x18, 0xAE, 0xDF, 0xF7, 0x5A, 0xCA, 0x06, + 0x95, 0x08, 0xBE, 0xD2, 0x06, 0x85, 0xD7, 0x53, + 0x53, 0x95, 0xD3, 0xB3, 0x38, 0x4A, 0x0F, 0x11, + 0x51, 0xAA, 0x1C, 0xB2, 0x0C, 0x1C, 0xBA, 0x89, + 0xF6, 0x2D, 0xAD, 0x80, 0x58, 0xD9, 0xF7, 0x34, + 0x95, 0x01, 0xB4, 0xF1, 0x3A, 0x97, 0x07, 0xC7, + 0x47, 0x9C, 0x1C, 0x31, 0xE9, 0xC8, 0x9C, 0x5F, + 0x47, 0x95, 0xAF, 0x6A, 0x10, 0x89, 0x34, 0x54, + 0x74, 0xBB, 0x2B, 0x7D, 0xA7, 0xF2, 0xD0, 0x31, + 0xAC, 0x87, 0x07, 0x2A, 0xF2, 0xE3, 0xD2, 0x11, + 0xB0, 0x21, 0x94, 0xC9, 0x23, 0x90, 0x61, 0xF1, + 0x72, 0x28, 0xCC, 0xA3, 0xF2, 0x6B, 0x22, 0xE1, + 0xC8, 0x4A, 0xE1, 0x7D, 0xA5, 0x15, 0x43, 0xC2, + 0x42, 0xB8, 0x5D, 0x32, 0x62, 0xF0, 0x57, 0xFF, + 0x62, 0x18, 0xFA, 0x95, 0x28, 0xD1, 0x99, 0xC8, + 0x1D, 0xC5, 0xB2, 0x88, 0x53, 0x52, 0x65, 0xA6, + 0x8E, 0x77, 0x79, 0x1E, 0x06, 0x1C, 0x6C, 0x3C, + 0x26, 0xED, 0xEB, 0x1D, 0x56, 0x7F, 0x3D, 0x58, + 0x11, 0xEF, 0x44, 0xD8, 0x00, 0xB0, 0xE6, 0x67, + 0xE7, 0x9D, 0x7F, 0x10, 0x2D, 0xDF, 0x97, 0xB6, + 0x6E, 0xB6, 0x41, 0x1F, 0xC4, 0x45, 0x76, 0xB5, + 0x39, 0xEE, 0x80, 0xCF, 0xE6, 0x01, 0x62, 0x15, + 0xF8, 0x01, 0x0A, 0x69, 0x79, 0xCD, 0x64, 0xAB, + 0x86, 0x5F, 0x68, 0x5D, 0x86, 0xD6, 0x2B, 0xCB, + 0xD2, 0x2A, 0x15, 0x7D, 0xC0, 0x38, 0x58, 0x29, + 0xF3, 0x2B, 0x35, 0x7A, 0xAE, 0x1C, 0xCC, 0xA6, + 0x06, 0x74, 0xE1, 0x90, 0xB8, 0x04, 0x6F, 0x69, + 0x1F, 0x3B, 0xBB, 0x96, 0x4E, 0xE2, 0x4A, 0x0D, + 0x1F, 0xC0, 0x57, 0x60, 0xBB, 0x16, 0x86, 0xEB, + 0x69, 0x97, 0xE3, 0xAA, 0x5F, 0xE5, 0x98, 0xA8, + 0x28, 0xF3, 0x73, 0x5E, 0x86, 0x47, 0x60, 0xA3, + 0xFF, 0x70, 0x4E, 0x25, 0x71, 0x89, 0x4C, 0x92, + 0x12, 0x8F, 0x38, 0x54, 0x2D, 0xD5, 0xB6, 0x53, + 0xEF, 0x1C, 0x02, 0x69, 0xBD, 0x04, 0xF6, 0x7C, + 0x64, 0x0D, 0x1B, 0x04, 0x96, 0x45, 0xE7, 0x87, + 0x73, 0xCF, 0x45, 0x3A, 0x5F, 0xED, 0x25, 0xE2, + 0xAF, 0x77, 0x8B, 0x4D, 0x37, 0x4D, 0x09, 0x6C, + 0xA9, 0x5A, 0x5E, 0x92, 0x39, 0x4F, 0x2A, 0xEA, + 0x2D, 0xCD, 0x6F, 0xBE, 0x64, 0x7C, 0x1B, 0x19, + 0x39, 0x96, 0x60, 0xC0, 0xD8, 0x22, 0xE8, 0x8A, + 0xC0, 0x3F, 0x6C, 0x43, 0xB3, 0xB1, 0x71, 0xC2, + 0xFE, 0x70, 0xA1, 0xF6, 0x26, 0x34, 0xF0, 0x35, + 0x50, 0x5A, 0xC8, 0xE2, 0x3D, 0x8D, 0x5F, 0x3F, + 0xCB, 0x77, 0x7A, 0x1E, 0x64, 0x70, 0x16, 0x33, + 0x63, 0x9C, 0xAC, 0xC3, 0x1B, 0xA7, 0xCD, 0xD5, + 0x52, 0x85, 0x2F, 0x81, 0x14, 0x3C, 0xB9, 0xB6, + 0x12, 0xEC, 0x5E, 0x32, 0x02, 0xB5, 0x37, 0xF9, + 0xE1, 0xF6, 0x0E, 0xC3, 0x53, 0xE0, 0x25, 0xDD, + 0x75, 0xB3, 0xF5, 0x99, 0x41, 0xF1, 0xA7, 0x26, + 0xA6, 0x4C, 0xBD, 0xD2, 0x32, 0x81, 0xC0, 0x5C, + 0xDF, 0x2D, 0xE8, 0x0F, 0x54, 0x76, 0xD5, 0x01, + 0x18, 0xA0, 0x8F, 0xB0, 0xE1, 0x62, 0x8B, 0x68, + 0xCA, 0xD3, 0x99, 0xDC, 0x47, 0xEA, 0x7A, 0xBA, + 0x3A, 0xE1, 0x61, 0x4C, 0x94, 0xC1, 0xB2, 0x72, + 0xEF, 0xC4, 0x44, 0x69, 0xB1, 0x0D, 0x27, 0x42, + 0xE2, 0x1B, 0x8C, 0xA7, 0x7C, 0x41, 0x2B, 0x73, + 0xF1, 0x26, 0x8A, 0x64, 0xD5, 0x42, 0x87, 0x58, + 0xFA, 0x5D, 0x37, 0x27, 0x11, 0xAD, 0xE5, 0x9D, + 0x1F, 0xC8, 0x69, 0xA7, 0x14, 0x8C, 0x5D, 0xD6, + 0x55, 0x4E, 0xD8, 0xB4, 0xFE, 0x65, 0xAD, 0xAD, + 0x0D, 0xD6, 0x10, 0xE5, 0x1D, 0x3F, 0x34, 0x5C, + 0x1C, 0xE7, 0x51, 0xCF, 0x3C, 0x24, 0x84, 0x64, + 0xE4, 0xBF, 0xF6, 0xBA, 0x90, 0x4B, 0x83, 0x83, + 0x23, 0xF8, 0x9C, 0xDB, 0xA9, 0xD9, 0x99, 0x59, + 0x39, 0x3F, 0x99, 0x27, 0x94, 0x8E, 0x2E, 0xCE, + 0x4E, 0x37, 0xAA, 0x6C, 0x74, 0xE4, 0x84, 0x84, + 0xAE, 0x65, 0x71, 0x76, 0x04, 0x15, 0x28, 0xEB, + 0xCE, 0x00, 0x94, 0xF4, 0x2F, 0x27, 0x45, 0x89, + 0x0F, 0xD8, 0x2B, 0xA7, 0x3C, 0x9D, 0xF1, 0x38, + 0x88, 0xB0, 0xF6, 0x7A, 0x4C, 0xED, 0x3D, 0x0E, + 0x2E, 0x97, 0x4E, 0x08, 0xDC, 0x73, 0xDB, 0x19, + 0x09, 0x7B, 0x3D, 0x4A, 0x0B, 0x2B, 0xDB, 0x6F, + 0x05, 0x12, 0x6E, 0xC8, 0xC2, 0x7E, 0x37, 0x75, + 0xF9, 0x08, 0x0C, 0x6C, 0x91, 0xA1, 0x49, 0x98, + 0xA8, 0xC0, 0x37, 0xE9, 0x7D, 0xE8, 0x58, 0x10, + 0xB0, 0xB3, 0x07, 0xD6, 0x06, 0x36, 0xE9, 0xAA, + 0xC0, 0xC6, 0xC0, 0x54, 0xCD, 0x8F, 0xA3, 0x49, + 0x13, 0x62, 0x56, 0x30, 0xC0, 0xC2, 0xEE, 0x07, + 0x07, 0x58, 0xAF, 0x41, 0xD3, 0x4B, 0x4D, 0xC4, + 0xFE, 0xAD, 0x19, 0xD8, 0x03, 0x39, 0xCA, 0x80, + 0xB4, 0xDD, 0x40, 0x06, 0x54, 0x6A, 0xBA, 0xC1, + 0xB1, 0xD0, 0xEE, 0x00, 0xD0, 0x47, 0xA5, 0x2C, + 0x44, 0x17, 0xA3, 0xC3, 0x10, 0x20, 0x93, 0xC3, + 0xC9, 0xE6, 0xA2, 0xE1, 0x13, 0x29, 0xA7, 0x97, + 0xE8, 0xC3, 0x8F, 0x0D, 0x17, 0xA9, 0xE3, 0xC1, + 0x4F, 0xBD, 0x8B, 0x2B, 0xE2, 0xB2, 0x1E, 0xFE, + 0xBC, 0x3A, 0xE0, 0xE9, 0x20, 0x90, 0xFC, 0x35, + 0xBE, 0x30, 0x3E, 0x50, 0x93, 0x10, 0x40, 0xB0, + 0x44, 0xAF, 0xFA, 0x66, 0x04, 0x70, 0x62, 0xCE, + 0x60, 0x5B, 0xAE, 0xD3, 0x5D, 0x58, 0xCD, 0xAF, + 0xE4, 0x2B, 0x1C, 0x2E, 0xF5, 0xD7, 0x9C, 0x79, + 0x6B, 0xDB, 0x44, 0xE8, 0x10, 0xA0, 0x48, 0x80, + 0x89, 0xD9, 0xCA, 0xF1, 0x09, 0xA4, 0x34, 0xF4, + 0x74, 0xAF, 0x2F, 0x02, 0xDA, 0x4B, 0x6C, 0xAF, + 0x87, 0x5E, 0x4A, 0xEC, 0x20, 0xB5, 0x8D, 0x6D, + 0x45, 0x9C, 0xA1, 0x67, 0x9A, 0xB9, 0xFE, 0x32, + 0xF8, 0xC1, 0xD8, 0x34, 0x3D, 0xC6, 0xA5, 0xA5, + 0x05, 0xDE, 0xAA, 0xEB, 0x87, 0xF7, 0xB7, 0x77, + 0x4F, 0x96, 0xC0, 0x60, 0xA8, 0xDA, 0xD7, 0xA3, + 0x91, 0x61, 0xF0, 0xF9, 0x29, 0xBB, 0x63, 0xA1, + 0x2D, 0xEC, 0xE8, 0xAF, 0x5F, 0x0A, 0x6D, 0x8F, + 0x12, 0x39, 0xB9, 0x94, 0x4C, 0xAD, 0x86, 0x45, + 0x05, 0xFE, 0x48, 0x66, 0x9B, 0x9F, 0x3F, 0xDF, + 0x5F, 0xB4, 0x46, 0x3A, 0xA2, 0x50, 0x10, 0x92, + 0x77, 0x18, 0xB3, 0x2F, 0xF7, 0x47, 0x11, 0x90, + 0x10, 0xC7, 0x72, 0x6C, 0x14, 0xD4, 0xE5, 0x62, + 0xE1, 0x36, 0x96, 0x42, 0x9F, 0x1F, 0xBC, 0x8C, + 0xBC, 0xC4, 0xD2, 0x6C, 0x9E, 0x04, 0xD4, 0xD8, + 0xF8, 0xF3, 0x98, 0x04, 0x06, 0x7A, 0x98, 0x54, + 0xF0, 0xCB, 0x3E, 0x43, 0xFD, 0x55, 0x09, 0x2B, + 0x81, 0x74, 0x10, 0x56, 0xBC, 0x47, 0x94, 0xB3, + 0x3E, 0xF2, 0xE6, 0x86, 0x76, 0xC6, 0xBD, 0x3D, + 0xBD, 0xD0, 0xC7, 0xDB, 0xB8, 0x18, 0xD8, 0xB8, + 0x0C, 0x67, 0x7B, 0x37, 0x4F, 0x5F, 0x4B, 0xCD, + 0x4D, 0x96, 0x2C, 0x4A, 0x20, 0x3F, 0xDF, 0x3A, + 0x43, 0x67, 0x69, 0x00, 0x62, 0x06, 0x94, 0x79, + 0xD7, 0x00, 0xAA, 0x36, 0x01, 0xA0, 0x30, 0x3E, + 0x2D, 0x34, 0xEF, 0xAD, 0x6E, 0xED, 0xBD, 0x4D, + 0xB9, 0x04, 0xF1, 0x3D, 0x6E, 0x75, 0xB0, 0xF5, + 0x52, 0x24, 0x90, 0x7D, 0xFB, 0x48, 0xE8, 0x08, + 0x88, 0xDB, 0x65, 0x80, 0x6A, 0x7F, 0x56, 0xB6, + 0x2B, 0x00, 0x80, 0xAD, 0x75, 0x44, 0x63, 0xA0, + 0x00, 0xB9, 0xFF, 0x1B, 0xCB, 0x70, 0x53, 0x13, + 0xA1, 0xEA, 0xDC, 0xE2, 0x9A, 0x58, 0x1D, 0xF7, + 0xF7, 0x4A, 0x5C, 0x40, 0xEF, 0xAF, 0xB5, 0x53, + 0x85, 0xBA, 0x08, 0x46, 0x9C, 0x0A, 0x28, 0x7B, + 0x8B, 0xD0, 0x44, 0x29, 0xD1, 0x49, 0x18, 0x92, + 0x30, 0xEB, 0x7F, 0x02, 0xFA, 0x6A, 0x3B, 0xD9, + 0x0A, 0xA1, 0x55, 0x1C, 0xEE, 0x1E, 0x3A, 0x0A, + 0xC0, 0x5D, 0xA9, 0xC1, 0x3F, 0x2E, 0x11, 0xD2, + 0xD2, 0x4D, 0xFA, 0xD6, 0x46, 0xC7, 0x01, 0xD5, + 0x59, 0x24, 0x50, 0x2F, 0xEB, 0xA9, 0xD5, 0xED, + 0xEF, 0x67, 0xA1, 0x8B, 0x51, 0xE1, 0x67, 0xB5, + 0x33, 0xE4, 0x50, 0x30, 0xE1, 0xC3, 0xF0, 0x40, + 0x60, 0x19, 0x0F, 0xCB, 0x19, 0x0B, 0x0E, 0xFC, + 0x61, 0x4A, 0xDE, 0xB0, 0x4D, 0x7B, 0xF4, 0xCB, + 0x4B, 0x90, 0x10, 0x3D, 0xE5, 0x59, 0x3B, 0xF7, + 0x72, 0xE8, 0x19, 0x76, 0xA2, 0x51, 0xF9, 0x3D, + 0x7D, 0x74, 0x52, 0xAC, 0x69, 0xB5, 0xC3, 0x5A, + 0xDD, 0x0D, 0x32, 0xDE, 0x86, 0xC2, 0x20, 0xBD, + 0x51, 0xDC, 0xE2, 0x88, 0x90, 0xD2, 0x12, 0x30, + 0x9F, 0x6E, 0x64, 0x16, 0xE8, 0x46, 0x09, 0xEF, + 0x41, 0xB6, 0x66, 0x34, 0xBB, 0x59, 0x56, 0xBC, + 0x1C, 0x55, 0x13, 0xBF, 0xFE, 0xEE, 0x2C, 0xE5, + 0x4F, 0x26, 0x99, 0xDC, 0x84, 0x9E, 0xEF, 0x9F, + 0xB5, 0x4E, 0xF4, 0x93, 0xE9, 0x04, 0x08, 0xE2, + 0xCE, 0x87, 0x38, 0x73, 0x39, 0xC3, 0x4B, 0x26, + 0xA4, 0x5A, 0x1F, 0x8C, 0x12, 0xA9, 0xC9, 0x12, + 0x2C, 0xD7, 0xC3, 0x5F, 0x47, 0x5D, 0x9D, 0xEF, + 0x00, 0xF1, 0xF7, 0x20, 0x08, 0x02, 0xC8, 0xBA, + 0x30, 0xC1, 0x95, 0xF3, 0x02, 0x32, 0xE9, 0x38, + 0x58, 0x38, 0xAE, 0x70, 0xF5, 0x29, 0x63, 0x1F, + 0x3D, 0xEC, 0x7D, 0xB3, 0x20, 0x78, 0xB5, 0x77, + 0xFB, 0x2B, 0x78, 0xFB, 0xDC, 0xA4, 0xC0, 0x2A, + 0x76, 0x3F, 0x84, 0x00, 0x74, 0x0D, 0x66, 0x5F, + 0x2D, 0xBB, 0xE5, 0x41, 0x9D, 0x07, 0xBB, 0x99, + 0x14, 0x27, 0x4D, 0xEF, 0x9A, 0x28, 0x44, 0x9F, + 0x3F, 0x66, 0x20, 0x8C, 0xC6, 0xD6, 0x24, 0xCD, + 0x67, 0x7C, 0x42, 0x8E, 0xC6, 0xEF, 0x7F, 0x25, + 0x2D, 0x74, 0xCA, 0x81, 0xDB, 0x26, 0xAE, 0xCB, + 0xA7, 0x83, 0xFD, 0x95, 0x46, 0xC5, 0xBE, 0x5C, + 0xFC, 0x07, 0xC5, 0xFF, 0x34, 0x70, 0x82, 0x6E, + 0xC7, 0x90, 0xAF, 0xC8, 0x99, 0xAB, 0xA7, 0x4E, + 0x02, 0xC1, 0x92, 0x22, 0x05, 0xA8, 0x38, 0xF8, + 0x78, 0xA3, 0x23, 0x0E, 0xD6, 0x27, 0x27, 0xE4, + 0x55, 0xEF, 0x5A, 0xBE, 0x22, 0x1B, 0xF9, 0x00, + 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, + 0x17, 0x6E, 0x1A, 0x66, 0x1B, 0x98, 0xD8, 0x89, + 0x69, 0xB1, 0x8F, 0x61, 0x30, 0xC9, 0xB4, 0x84, + 0x04, 0xDF, 0x5F, 0x72, 0xAA, 0xA7, 0xC5, 0x24, + 0xC6, 0x1E, 0x80, 0xEE, 0x3A, 0x06, 0xED, 0x8F, + 0xAA, 0x73, 0xED, 0x00, 0xBB, 0x08, 0xFA, 0xF8, + 0x68, 0x2A, 0xCE, 0x3B, 0xA1, 0x98, 0x9A, 0xD6, + 0x55, 0xB7, 0x93, 0xE2, 0xCA, 0x7A, 0x2C, 0xAD, + 0x2D, 0xC7, 0x13, 0x7C, 0x9C, 0x2F, 0xFD, 0x2E, + 0xB6, 0x61, 0xCB, 0xA0, 0x93, 0x39, 0xC8, 0x56, + 0xD5, 0xCE, 0xD3, 0x9F, 0xE5, 0x06, 0x7E, 0x7E, + 0xDE, 0x05, 0x2B, 0x4E, 0x14, 0xB7, 0xD1, 0xB3, + 0xF0, 0x3B, 0x17, 0xF3, 0xA2, 0x61, 0x64, 0x88, + 0x28, 0x41, 0xE4, 0x90, 0x5F, 0x04, 0x6A, 0x12, + 0x01, 0x56, 0x7B, 0x9F, 0x4C, 0x51, 0x33, 0x13, + 0x9B, 0x40, 0xDB, 0xBD, 0x78, 0x38, 0x54, 0x96, + 0x0B, 0x20, 0xA0, 0x8D, 0x55, 0xD4, 0xD6, 0x15, + 0xAD, 0x75, 0x71, 0x0F, 0xC3, 0xBB, 0x78, 0x10, + 0xB3, 0xA2, 0xAF, 0x7A, 0x01, 0x16, 0x4D, 0xDC, + 0xFC, 0xBC, 0xCA, 0x24, 0xEF, 0x47, 0xBE, 0xDD, + 0x4A, 0xF9, 0x64, 0xCA, 0xBA, 0xF5, 0x74, 0xD0, + 0x53, 0x70, 0x75, 0xD9, 0x21, 0x91, 0x23, 0xF0, + 0x68, 0x02, 0xFF, 0x90, 0xA8, 0xC5, 0xB5, 0x87, + 0x6C, 0x17, 0x73, 0x4C, 0x8C, 0xFC, 0xBC, 0x7C, + 0x5E, 0xAE, 0x98, 0x34, 0xCC, 0x7C, 0xDC, 0xB6, + 0x26, 0x5F, 0x82, 0x6E, 0xF0, 0x41, 0x21, 0x43, + 0x00, 0xCB, 0x58, 0x13, 0xEB, 0x9B, 0xDB, 0x1B, + 0x0A, 0x8F, 0x3A, 0xD4, 0x1F, 0xA9, 0x51, 0x98, + 0xBA, 0xA2, 0x04, 0xF2, 0xA2, 0x9B, 0x88, 0x2D, + 0x89, 0x72, 0x4C, 0xA3, 0xD6, 0x64, 0xE4, 0x2C, + 0xAC, 0x6A, 0x2C, 0x40, 0x98, 0x28, 0x7E, 0xFF, + 0x7F, 0xE6, 0xF8, 0x6B, 0x22, 0xF7, 0x94, 0xE5, + 0x07, 0xDF, 0x58, 0x7F, 0xA4, 0xAC, 0xC7, 0xC5, + 0x5E, 0x9D, 0x27, 0x66, 0x6E, 0x12, 0x52, 0x50, + 0x8B, 0x48, 0x3E, 0x72, 0xAA, 0xB8, 0xFB, 0x9B, + 0xB2, 0xD2, 0xA4, 0xE8, 0x30, 0x02, 0x41, 0x21, + 0x61, 0x9A, 0x2C, 0xD0, 0x80, 0x20, 0xD2, 0xB3, + 0x33, 0x78, 0x46, 0x0A, 0x50, 0x83, 0x43, 0x43, + 0xE3, 0x38, 0xAC, 0xE3, 0xBB, 0xCB, 0x8B, 0x4B, + 0x8B, 0x72, 0xD4, 0xFA, 0x86, 0x36, 0x16, 0xF4, + 0x54, 0xAD, 0x78, 0x94, 0x51, 0x11, 0x47, 0xC6, + 0x46, 0xFB, 0x79, 0x1D, 0x47, 0xF4, 0xB3, 0xB1, + 0x32, 0xCF, 0x1F, 0x4B, 0x99, 0x84, 0xE6, 0x9B, + 0x18, 0x0E, 0xBC, 0xF5, 0xB5, 0x27, 0x5A, 0x6A, + 0x42, 0xCA, 0xCE, 0x02, 0x21, 0x21, 0x8D, 0x5D, + 0x1F, 0x87, 0x17, 0xBB, 0x43, 0xF3, 0x01, 0xCB, + 0x47, 0x5C, 0xCA, 0xA6, 0xCE, 0xE7, 0x97, 0xC5, + 0x0F, 0xD8, 0x73, 0xEF, 0x37, 0x87, 0xFD, 0x3C, + 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0x51, 0x9C, + 0x1E, 0xA5, 0x17, 0x7A, 0xA2, 0x12, 0x72, 0xB2, + 0x32, 0xE9, 0xEF, 0x8D, 0x57, 0x87, 0xCD, 0x0F, + 0x8F, 0x54, 0xE2, 0x8E, 0x56, 0xE6, 0x66, 0xB4, + 0x36, 0x8D, 0x27, 0x4B, 0x9B, 0x2B, 0x36, 0xF2, + 0x0C, 0xD3, 0xE1, 0x9F, 0x45, 0x95, 0x81, 0x52, + 0xD0, 0x6B, 0x45, 0x3A, 0xE0, 0x30, 0xF0, 0x23, + 0xA1, 0x1A, 0x74, 0x0C, 0xD6, 0x06, 0x7E, 0xAB, + 0x29, 0x92, 0x14, 0x6E, 0xB4, 0x64, 0x30, 0xE5, + 0x67, 0xDC, 0xD2, 0xAB, 0x71, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x97, 0x40, + 0xC2, 0x79, 0xEB, 0x90, 0x4A, 0x9A, 0xEE, 0x36, + 0xB4, 0x0F, 0x19, 0x62, 0xB8, 0x68, 0x08, 0xC8, + 0x48, 0x93, 0x25, 0x49, 0x91, 0x21, 0x41, 0x81, + 0x01, 0xDA, 0xA0, 0xD4, 0x0C, 0xDC, 0x6C, 0xB4, + 0x34, 0x8F, 0xC1, 0xB4, 0x6C, 0xBC, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x78, 0xB8, + 0x38, 0xE3, 0x54, 0x38, 0xE1, 0x51, 0x30, 0xF8, + 0x38, 0xE3, 0x54, 0x39, 0xE0, 0x51, 0x70, 0xA0, + 0x24, 0xFD, 0x6A, 0x02, 0xFB, 0x4F, 0x0E, 0x4A, + 0xDA, 0x43, 0xE4, 0x99, 0x50, 0xF1, 0xD8, 0x3A, + 0x9E, 0x67, 0x98, 0xE6, 0x77, 0xD5, 0xFC, 0x6E, + 0xD7, 0x1E, 0xFD, 0x80, 0x0D, 0xAC, 0x99, 0x4C, + 0x99, 0x53, 0x4F, 0x09, 0x7B, 0xE1, 0x2B, 0x41, + 0x6B, 0x9A, 0x79, 0x40, 0xCD, 0x28, 0x1D, 0x88, + 0x5D, 0x53, 0xB0, 0x09, 0x84, 0xE1, 0x2B, 0x01, + 0x2B, 0x1E, 0x02, 0x80, 0xF2, 0xAC, 0x7A, 0x17, + 0x21, 0x17, 0x17, 0x96, 0xF8, 0xA5, 0x73, 0x6E, + 0x35, 0x33, 0x6B, 0xE9, 0xDF, 0x81, 0x3F, 0x84, + 0xEB, 0x8D, 0xE5, 0x72, 0x74, 0x3F, 0xE1, 0xCE, + 0xB5, 0x93, 0xDB, 0x49, 0x6F, 0x21, 0xBF, 0x88, + 0xB7, 0x93, 0xDB, 0x48, 0x6E, 0x21, 0xBE, 0x81, + 0xFE, 0xDA, 0x58, 0x2D, 0xF5, 0x25, 0x7D, 0xA4, + 0x24, 0x9F, 0xD5, 0xA0, 0x78, 0xA8, 0xFC, 0x3C, + 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0xB5, 0x75, + 0xF5, 0x2E, 0x98, 0xF4, 0x2C, 0x9C, 0xFC, 0x3C, + 0xBC, 0x67, 0xF9, 0x9C, 0x44, 0x94, 0xD0, 0x19, + 0x99, 0x22, 0x84, 0x58, 0x82, 0x32, 0x52, 0x88, + 0x08, 0xB3, 0x75, 0x18, 0xC0, 0x70, 0x6C, 0xAB, + 0x2B, 0x90, 0x9A, 0xFB, 0x21, 0xF1, 0xAD, 0x65, + 0xE5, 0x5E, 0xFC, 0x9E, 0x44, 0x94, 0x38, 0xF6, + 0x74, 0xCF, 0xED, 0x87, 0x5F, 0x8F, 0x4B, 0x84, + 0x06, 0xBD, 0x4F, 0x25, 0xFD, 0x2D, 0xC1, 0x0E, + 0x8C, 0x37, 0x71, 0x04, 0xDC, 0x0C, 0xB8, 0x77, + 0xF5, 0x4E, 0x48, 0x35, 0xEF, 0x3F, 0xE7, 0x2F, + 0xAF, 0x14, 0x82, 0xFC, 0x26, 0xF6, 0x2A, 0xED, + 0x6D, 0xD6, 0x34, 0x4A, 0x90, 0x40, 0xE8, 0x3A, + 0xB8, 0x03, 0x5D, 0x37, 0xEF, 0x3F, 0x3B, 0xE3, + 0x61, 0xDA, 0x2C, 0x4A, 0x92, 0x42, 0x14, 0x95, + 0x15, 0x4F, 0x7B, 0x11, 0x78, 0x48, 0x2E, 0xF2, + 0x78, 0x32, 0x05, 0x6F, 0x15, 0xEE, 0x8E, 0xC7, + 0x4E, 0xB0, 0x04, 0x68, 0x55, 0xE1, 0x81, 0xE4, + 0x66, 0xBD, 0xEE, 0x87, 0x5F, 0x0A, 0x62, 0xA2, + 0x07, 0xDF, 0x69, 0xA0, 0x71, 0xC1, 0x00, 0x43, + 0xC5, 0xAF, 0x9D, 0xF7, 0x8A, 0x60, 0x27, 0xFA, + 0x8A, 0x51, 0xD1, 0xFC, 0x24, 0xA5, 0x40, 0x86, + 0x27, 0x7A, 0xCA, 0x8F, 0x84, 0x29, 0xB9, 0x79, + 0xF9, 0x22, 0xA2, 0x8F, 0x57, 0xD6, 0x31, 0xF7, + 0x56, 0x05, 0xB5, 0xF0, 0x6B, 0xC6, 0x56, 0x96, + 0x16, 0xCD, 0x4D, 0x60, 0xB8, 0x39, 0xDC, 0x1A, + 0xBB, 0xE9, 0x59, 0x1C, 0x57, 0xFA, 0x6A, 0xAA, + 0x2A, 0xF1, 0x71, 0x5C, 0x84, 0x15, 0xF8, 0x3E, + 0x8F, 0xD8, 0x68, 0x95, 0xC7, 0x71, 0x90, 0xDB, + 0x5D, 0x0F, 0xF0, 0xB5, 0x6E, 0xC3, 0x53, 0x93, + 0x13, 0xC8, 0x48, 0x65, 0xBD, 0x9C, 0x72, 0xB4, + 0x38, 0xEB, 0xDF, 0xFA, 0x22, 0xF7, 0x96, 0x56, + 0x77, 0x3C, 0x8C, 0x51, 0x0E, 0xB8, 0x19, 0x56, + 0xD0, 0xC2, 0x7F, 0xBA, 0x39, 0x94, 0x04, 0xC4, + 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x6B, 0x9A, 0x5C, + 0xFD, 0xB4, 0x04, 0x41, 0x8A, 0x27, 0xB7, 0x77, + 0xF7, 0x2C, 0xAC, 0x81, 0x59, 0x68, 0x9C, 0x5A, + 0xEB, 0xA3, 0x13, 0x5E, 0x13, 0xA5, 0xEC, 0x0F, + 0x06, 0x8E, 0x25, 0xB9, 0x61, 0xD1, 0x87, 0x06, + 0x86, 0xCC, 0xEC, 0x86, 0xDF, 0xF8, 0x9E, 0xD7, + 0x7E, 0xC0, 0x76, 0x1A, 0xDF, 0x9F, 0xC9, 0x48, + 0xC8, 0xB2, 0x9C, 0xF6, 0x9C, 0x8C, 0x60, 0x08, + 0x82, 0x79, 0xAE, 0xC2, 0x92, 0x08, 0xD2, 0xA8, + 0xB4, 0x77, 0xCD, 0xBD, 0x69, 0x54, 0xD6, 0x3C, + 0x94, 0x8F, 0x19, 0x75, 0x7F, 0x81, 0xED, 0xEF, + 0x24, 0xD8, 0x4B, 0x80, 0x7B, 0xEB, 0x6D, 0xBE, + 0x2E, 0xD5, 0x63, 0x12, 0x3A, 0x8A, 0xEA, 0x2A, + 0xAA, 0x71, 0xC7, 0xAB, 0x73, 0xC3, 0xA3, 0x63, + 0xE3, 0x38, 0x8F, 0xE3, 0x3F, 0x8F, 0x8B, 0x51, + 0xD3, 0x68, +}; + +static unsigned char vfs5011_init_16[] = { /* 2565 B */ + 0x02, 0xF0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x17, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x0C, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x05, + 0x00, 0x0E, 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x14, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xC8, 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, + 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x00, 0x03, 0x00, 0x09, 0x00, + 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x28, 0x00, 0x00, +}; + +static unsigned char vfs5011_init_17[] = { /* 117 B */ + 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xF4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0xF4, 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, 0x20, 0xBF, 0x02, 0x00, +}; + +static unsigned char vfs5011_init_18[] = { /* 2903 B */ + 0x02, 0xF0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, 0xFD, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x10, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, + 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, + 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x20, + 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, 0x30, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, + 0x00, 0x18, 0x00, 0x52, 0x01, 0x08, 0x00, 0x05, + 0x00, 0x0A, 0x00, 0xFA, 0x00, 0x1E, 0x00, 0xC8, + 0x00, 0x00, 0x00, 0x9F, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0xFF, 0xF9, 0xFD, 0xFE, 0xFE, 0x00, 0xFD, + 0x02, 0x03, 0x02, 0x01, 0x01, 0xFF, 0x03, 0x06, + 0x0C, 0x08, 0x08, 0x0C, 0x06, 0x0A, 0x0B, 0x06, + 0x0B, 0x0A, 0x0C, 0x0A, 0x0A, 0x07, 0x02, 0x05, + 0x07, 0x06, 0x0A, 0x09, 0x09, 0x0C, 0x0C, 0x11, + 0x0B, 0x0D, 0x08, 0x07, 0x09, 0x09, 0x09, 0x08, + 0x06, 0x09, 0xFE, 0xFF, 0xFF, 0x01, 0x06, 0x01, + 0xFD, 0xFB, 0x00, 0x01, 0x04, 0x01, 0x02, 0x05, + 0x04, 0x00, 0x02, 0x02, 0x05, 0x07, 0x05, 0x03, + 0x05, 0x02, 0x0A, 0x06, 0x03, 0x04, 0x00, 0x01, + 0x02, 0x04, 0x01, 0x01, 0xFA, 0xF7, 0xFA, 0xF9, + 0xF6, 0xF7, 0xFD, 0xFE, 0x02, 0xFE, 0xFC, 0xF7, + 0xF9, 0xFB, 0xF7, 0xFB, 0xF5, 0xF8, 0xF8, 0xF9, + 0xEF, 0xEE, 0xF2, 0xEF, 0xF0, 0xED, 0xF2, 0xF7, + 0xF9, 0xFA, 0xF6, 0xF6, 0xF5, 0xF4, 0xF3, 0xEF, + 0xF1, 0xF5, 0xF4, 0xF1, 0xF5, 0xFA, 0xF8, 0xFA, + 0xF9, 0xFA, 0xFE, 0x01, 0x02, 0xFE, 0xFE, 0x03, + 0x01, 0xFC, 0xF9, 0xF7, 0xF6, 0xF4, 0xF9, 0xF7, + 0xF7, 0xF5, 0xF7, 0xFA, 0xFB, 0x00, 0xFC, 0xFD, + 0xFD, 0xF6, 0xF2, 0xF4, 0xED, 0xDC, 0xCE, 0xFF, + 0x05, 0x07, 0x08, 0x0E, 0x0E, 0x0F, 0x0A, 0x0C, + 0x06, 0x05, 0x05, 0xF6, 0xF2, 0xF1, 0xEF, 0xF4, + 0xF6, 0xF4, 0xF5, 0xF6, 0xF7, 0xF5, 0xF8, 0xF8, + 0xF8, 0xF2, 0xF7, 0xF3, 0xF0, 0xF3, 0xF5, 0xFD, + 0xFB, 0xFC, 0xF9, 0xF9, 0xFC, 0xFA, 0xF8, 0xFD, + 0x0B, 0x1C, 0x17, 0x13, 0x14, 0x0F, 0x0D, 0x0C, + 0x0B, 0x0B, 0x0F, 0x0C, 0x0E, 0x10, 0x0E, 0x11, + 0x12, 0x14, 0x1C, 0x1C, 0x20, 0x20, 0x24, 0xF4, + 0xF6, 0xF4, 0xF5, 0xF6, 0xF7, 0xF5, 0xF8, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +}; + +static unsigned char vfs5011_cmd_04[] = { /* 1 B */ + 0x04, +}; + +static unsigned char vfs5011_prepare_00[] = { /* 578 B */ + 0x06, 0x9C, 0xF1, 0x9D, 0x71, 0xC3, 0x13, 0xDF, + 0x5F, 0xE4, 0x7A, 0x1F, 0xC7, 0x17, 0x53, 0x9A, + 0x1A, 0xA1, 0xD7, 0xB6, 0x6E, 0xBE, 0xDF, 0x1F, + 0x9F, 0x44, 0x42, 0x22, 0xFA, 0x2A, 0x6A, 0xAB, + 0x2B, 0xF0, 0x56, 0x39, 0xE3, 0x7B, 0x53, 0x9A, + 0x1A, 0xA1, 0xDB, 0xBA, 0x62, 0xB2, 0xE4, 0x65, + 0xE5, 0xDB, 0x68, 0x04, 0x79, 0x98, 0xDE, 0x8F, + 0x23, 0xFB, 0xEC, 0xAD, 0x76, 0xCA, 0xA2, 0xEB, + 0x61, 0x38, 0xC7, 0xAB, 0x6E, 0x2E, 0x78, 0xF9, + 0x79, 0x13, 0x8A, 0xE5, 0x90, 0x22, 0x63, 0x8D, + 0x0E, 0x93, 0x25, 0x49, 0x5A, 0xC8, 0xA3, 0xD8, + 0x7E, 0xAE, 0x12, 0xF6, 0x2C, 0x1C, 0xFC, 0x48, + 0x4F, 0x0E, 0x48, 0x22, 0xFB, 0x4B, 0xCE, 0x7E, + 0xDB, 0x2D, 0x91, 0xE0, 0xC8, 0x78, 0x2E, 0xAF, + 0x2F, 0xD4, 0x03, 0x6F, 0x12, 0x59, 0xC6, 0x26, + 0x40, 0x88, 0x2E, 0x62, 0xBA, 0x06, 0x6C, 0xC9, + 0x7A, 0x84, 0x93, 0xCF, 0x14, 0x15, 0x44, 0x87, + 0xE2, 0x09, 0x97, 0xE6, 0xCE, 0x7E, 0x28, 0xA9, + 0x29, 0x53, 0xD7, 0xB8, 0xD1, 0x53, 0x30, 0x15, + 0x6E, 0x95, 0x3E, 0xA2, 0x7A, 0xCA, 0x9C, 0x1D, + 0x9D, 0xEB, 0x5F, 0x15, 0xEF, 0x48, 0x34, 0xCC, + 0xCB, 0x02, 0xA6, 0xD6, 0xA7, 0x80, 0xF2, 0x3F, + 0x7E, 0x96, 0x23, 0xAE, 0x42, 0xF1, 0x29, 0xF5, + 0xAD, 0x5A, 0x35, 0x57, 0x36, 0xAA, 0xAF, 0x97, + 0xE8, 0x1E, 0xA2, 0xD3, 0xFB, 0x4B, 0x1D, 0x9C, + 0x1C, 0x06, 0x84, 0xEB, 0x9E, 0x2C, 0xD4, 0x18, + 0x94, 0x44, 0x7E, 0x4B, 0x12, 0x91, 0xF2, 0x8B, + 0x07, 0x45, 0xDB, 0x52, 0xBB, 0x2E, 0x53, 0x63, + 0xE3, 0x38, 0xB8, 0x95, 0x4D, 0x9B, 0xCF, 0x07, + 0x05, 0xDD, 0x4C, 0xE2, 0x39, 0xAF, 0xA9, 0x51, + 0xDB, 0xAD, 0x19, 0xC8, 0x13, 0x6E, 0x0A, 0x2F, + 0xEA, 0x12, 0xB9, 0x25, 0x55, 0xB6, 0x64, 0x04, + 0x7F, 0x14, 0x6E, 0x12, 0x08, 0xFB, 0xBD, 0xBD, + 0x1D, 0xC6, 0xE2, 0x84, 0x50, 0x20, 0x60, 0xA0, + 0x90, 0xD2, 0x74, 0x8A, 0x18, 0xA4, 0xD9, 0xE9, + 0x69, 0xB2, 0x1E, 0x73, 0xAB, 0x1B, 0x7B, 0xBB, + 0x3B, 0xE0, 0x42, 0x23, 0xF9, 0x29, 0x49, 0x89, + 0x09, 0xD2, 0x4C, 0x29, 0xF1, 0x21, 0x65, 0xAC, + 0x2C, 0x97, 0x30, 0x6C, 0xB4, 0x04, 0xF4, 0x3D, + 0xBD, 0x06, 0xA0, 0xC6, 0x1E, 0xCE, 0x7E, 0xB3, + 0x33, 0x88, 0x2E, 0x43, 0x9B, 0x2B, 0x37, 0xF0, + 0x70, 0xCB, 0x91, 0xF1, 0x2B, 0xFB, 0x8B, 0x48, + 0xCA, 0x39, 0x97, 0xFB, 0x21, 0xB9, 0xCD, 0x0E, + 0x8C, 0x7F, 0x8D, 0xEC, 0x36, 0xE6, 0xEA, 0x27, + 0xA5, 0x1E, 0x40, 0x2A, 0xF2, 0x22, 0xCA, 0x07, + 0x85, 0x3E, 0xC8, 0xAE, 0x76, 0xA6, 0xF0, 0x71, + 0xF1, 0xAB, 0x6B, 0x04, 0x6D, 0xA9, 0xCA, 0x06, + 0x2C, 0x66, 0xA5, 0xCA, 0xB0, 0x4B, 0x2B, 0x62, + 0xEB, 0xD5, 0x61, 0x0D, 0xF0, 0x46, 0x26, 0xC3, + 0x44, 0x9F, 0x0C, 0x63, 0xBB, 0xAA, 0xBD, 0x7E, + 0xF2, 0x74, 0x00, 0x66, 0x2B, 0x7A, 0x62, 0xA1, + 0x07, 0x80, 0x33, 0x8D, 0x1F, 0xF7, 0x45, 0xCB, + 0x5E, 0x24, 0xEB, 0x84, 0xED, 0x27, 0x44, 0x61, + 0xFF, 0x0C, 0xA7, 0x3B, 0xE3, 0x53, 0x05, 0x84, + 0x04, 0xEE, 0x23, 0x4C, 0xB5, 0x79, 0x1A, 0xF3, + 0xA0, 0x66, 0x20, 0x4C, 0x94, 0x24, 0x72, 0xF3, + 0x73, 0x39, 0xF8, 0x97, 0xDD, 0x64, 0x54, 0xF2, + 0x6B, 0xBA, 0xAD, 0xBC, 0x67, 0x66, 0x78, 0xBB, + 0x5E, 0x6D, 0xFB, 0x8A, 0xA2, 0x74, 0x3D, 0xF5, + 0xD4, 0x72, 0xC7, 0x1A, 0xBD, 0x0E, 0x0B, 0x2C, + 0x8C, 0x4A, 0x0C, 0x60, 0xB8, 0x08, 0x5E, 0xDF, + 0x5F, 0x05, 0x33, 0x5C, 0xB5, 0x7E, 0x1D, 0xFC, + 0xFD, 0x25, 0xBA, 0x95, 0xC4, 0xA7, 0xDA, 0xEA, + 0x6A, 0xB1, 0x31, 0x1C, 0xC4, 0xE5, 0x07, 0xC4, + 0xC5, 0x9D, 0x28, 0xCD, 0x3C, 0xE9, 0x89, 0x49, + 0xD4, 0xFF, 0x7F, 0x52, 0x8A, 0x9B, 0x7F, 0xBC, + 0x8E, 0xF5, 0xCF, 0x0B, 0xD9, 0x49, 0x48, 0x88, + 0x80, 0x71, 0x7D, 0xAB, 0xEF, 0x47, 0x2B, 0xF7, + 0x7B, 0x2D, 0x79, 0x3F, 0xCF, 0xBF, 0xFF, 0x3F, + 0x6D, 0xF8, 0x42, 0xEC, 0x7F, 0xE8, 0xED, 0x42, + 0xE6, 0x1D, 0x4D, 0x32, 0xFA, 0x6A, 0x0A, 0xD7, + 0xA7, 0x7C, 0xCB, 0xA7, 0x7B, 0xCB, 0xBF, 0x71, + 0xF3, 0x48, +}; + +static unsigned char vfs5011_prepare_01[] = { /* 3794 B */ + 0x06, 0x6B, 0x06, 0x6A, 0x76, 0xC8, 0x18, 0xD4, + 0x54, 0xEF, 0x71, 0x14, 0xCC, 0x1C, 0x58, 0x91, + 0x11, 0xAA, 0x80, 0xF4, 0x2C, 0xFC, 0x9F, 0x5F, + 0xDF, 0x04, 0x02, 0x62, 0xBA, 0x6A, 0x5A, 0x97, + 0x17, 0xCC, 0x46, 0x22, 0xFA, 0x2A, 0xBE, 0x03, + 0x87, 0x3C, 0x9E, 0xFE, 0x26, 0xF6, 0x96, 0x7E, + 0xFA, 0x11, 0x27, 0x66, 0xBA, 0x3A, 0x5A, 0xBA, + 0x3E, 0xD5, 0x4F, 0x03, 0xDF, 0x5F, 0x7F, 0x9F, + 0x1B, 0xF0, 0xA2, 0xEF, 0x33, 0xB3, 0xD3, 0x13, + 0x93, 0x70, 0xFA, 0x96, 0x4E, 0xC6, 0xA6, 0xC6, + 0x46, 0xA5, 0x2F, 0xE3, 0x3B, 0xB3, 0xD3, 0x33, + 0xB3, 0x50, 0xE8, 0xA4, 0x7C, 0xF4, 0x94, 0x14, + 0x94, 0x77, 0xC9, 0xE5, 0x3D, 0xB5, 0xD5, 0x75, + 0xF5, 0x16, 0xA8, 0xA4, 0x7C, 0xF4, 0x94, 0xD4, + 0x54, 0xB7, 0x09, 0xE5, 0x3D, 0xB5, 0x2D, 0xF4, + 0x74, 0xCF, 0x29, 0x5C, 0x84, 0x54, 0x14, 0xAA, + 0x2E, 0x95, 0xF7, 0xE0, 0x3C, 0xEC, 0x8C, 0x52, + 0xD6, 0x3D, 0x7B, 0x0E, 0xD6, 0x06, 0x82, 0x49, + 0xC9, 0x72, 0x7C, 0x18, 0xC0, 0x10, 0x10, 0xF6, + 0x72, 0xC9, 0xC3, 0xA8, 0x70, 0xA0, 0xD8, 0x77, + 0xF3, 0x48, 0x06, 0x04, 0xD8, 0x08, 0x90, 0x5B, + 0xDB, 0x60, 0x36, 0x43, 0x9B, 0x4B, 0xD4, 0xE3, + 0x9C, 0xB8, 0xF1, 0x72, 0x55, 0x1A, 0x8E, 0x57, + 0xD7, 0x6C, 0xDA, 0xBE, 0x66, 0xD6, 0xEA, 0x3D, + 0xBF, 0x04, 0xB2, 0xCE, 0x16, 0xA6, 0x06, 0xDE, + 0x5E, 0xE5, 0xB7, 0xC3, 0x1B, 0xCB, 0x47, 0x9F, + 0x1F, 0xA4, 0x3E, 0x5B, 0x83, 0x53, 0x53, 0x8A, + 0x0A, 0xB1, 0x93, 0xF9, 0x21, 0xF1, 0x31, 0xE6, + 0x64, 0xDF, 0x95, 0xE0, 0x38, 0xE8, 0xB4, 0x6D, + 0xED, 0x56, 0x1D, 0x8E, 0x56, 0xE6, 0x79, 0xB9, + 0xC6, 0xE2, 0x62, 0x4F, 0x97, 0x02, 0x40, 0x80, + 0x65, 0xB8, 0x0E, 0x07, 0xC2, 0x72, 0x37, 0xBE, + 0x3E, 0x00, 0xF2, 0xB8, 0xF1, 0x6D, 0x0E, 0x6F, + 0xC2, 0x1A, 0xA0, 0xC4, 0x95, 0x2F, 0xCD, 0x44, + 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, + 0x17, 0x7D, 0xE4, 0x8B, 0xFE, 0x4C, 0x0D, 0xE3, + 0x60, 0xFD, 0x4B, 0x27, 0x34, 0xA6, 0xCD, 0xB6, + 0x10, 0xC0, 0x7C, 0x98, 0x42, 0x72, 0x92, 0x26, + 0x21, 0x60, 0x26, 0x4C, 0x95, 0x25, 0xA0, 0x03, + 0xA6, 0x50, 0xEC, 0x9D, 0xB5, 0x05, 0x53, 0xD2, + 0x52, 0xA9, 0x7E, 0x12, 0x2F, 0x65, 0xFA, 0x1A, + 0x7C, 0xB4, 0x12, 0x5E, 0x86, 0x3A, 0x50, 0xF5, + 0x53, 0xAD, 0xBA, 0xE6, 0x3D, 0x3C, 0x6D, 0xAE, + 0xCB, 0x33, 0xAD, 0xDC, 0xF4, 0x44, 0x12, 0x93, + 0x13, 0xF9, 0x7D, 0x12, 0xEB, 0x68, 0x0B, 0xE2, + 0x21, 0xE7, 0xA1, 0xCD, 0x15, 0xA5, 0xF3, 0x72, + 0xF2, 0xAB, 0x1F, 0x7E, 0xAA, 0x01, 0xE1, 0xA1, + 0x25, 0xA8, 0x06, 0x6D, 0xB9, 0x0C, 0x60, 0xA6, + 0x64, 0xAD, 0x15, 0x65, 0xBA, 0x30, 0x14, 0x66, + 0x22, 0x78, 0xFC, 0x94, 0x4C, 0x4E, 0x25, 0x9B, + 0xD9, 0x06, 0xB1, 0xEA, 0x89, 0x35, 0x62, 0x1E, + 0x8F, 0x69, 0xD4, 0x7F, 0x1C, 0xA0, 0xFD, 0x31, + 0x77, 0xAD, 0x1B, 0x40, 0xA4, 0x10, 0xB7, 0xCC, + 0x4D, 0xAB, 0x16, 0xD7, 0x0C, 0x01, 0x62, 0x87, + 0xBF, 0x4C, 0x50, 0x5A, 0xD8, 0x3B, 0x50, 0xE7, + 0x2C, 0xB3, 0xB7, 0x1F, 0x46, 0xA0, 0x57, 0x6B, + 0x46, 0x98, 0x93, 0xFA, 0xC7, 0xC1, 0x89, 0x45, + 0xDE, 0xD7, 0xC3, 0xC3, 0xBB, 0xCF, 0xEE, 0xEE, + 0xA8, 0xB3, 0xDF, 0x61, 0x4B, 0xE6, 0x04, 0x04, + 0x40, 0xDA, 0xAC, 0x43, 0xDA, 0x9A, 0x15, 0x25, + 0x45, 0x7D, 0xEA, 0x0C, 0x3A, 0x7A, 0xD4, 0x87, + 0xC5, 0x43, 0x77, 0x1D, 0xC6, 0x76, 0xD4, 0xB6, + 0x5A, 0x4B, 0x3F, 0x91, 0x55, 0x98, 0xC2, 0xCE, + 0x8C, 0x5B, 0xED, 0x53, 0x99, 0x20, 0x6D, 0xA6, + 0xF1, 0x96, 0x21, 0x41, 0xBB, 0x16, 0x86, 0x46, + 0xC6, 0x1D, 0x9D, 0xB0, 0x68, 0x69, 0x3D, 0xFE, + 0xC6, 0x16, 0x2C, 0x2B, 0x51, 0x40, 0x40, 0x2A, + 0x01, 0xBF, 0xB3, 0xFF, 0x8A, 0x38, 0x3D, 0x51, + 0xF4, 0x32, 0x74, 0x18, 0xC0, 0x70, 0x26, 0xA7, + 0x27, 0x5D, 0xDE, 0xB1, 0xD8, 0x5E, 0x3D, 0x30, + 0xB2, 0x0C, 0xEC, 0xA5, 0xCC, 0x44, 0x27, 0xC7, + 0x6D, 0x16, 0x01, 0x5A, 0x81, 0xFC, 0x9E, 0x3B, + 0xEE, 0x10, 0x17, 0x41, 0x9A, 0x0A, 0x50, 0x30, + 0x72, 0x6A, 0xCC, 0x01, 0xE0, 0x53, 0x3F, 0xFD, + 0x54, 0x8C, 0x13, 0x6C, 0x9D, 0x0E, 0x47, 0xB4, + 0xD1, 0x59, 0xCA, 0x17, 0xF3, 0x40, 0x10, 0xEA, + 0xCA, 0xD3, 0xA6, 0xDA, 0xA3, 0x28, 0x4B, 0x6E, + 0xBC, 0x42, 0xF8, 0x9D, 0x75, 0xFF, 0x3F, 0xCD, + 0x8E, 0x45, 0xE8, 0x1D, 0xEC, 0x5F, 0x74, 0x87, + 0x61, 0x23, 0x63, 0xA2, 0x79, 0x7B, 0xBB, 0xDE, + 0x72, 0xE5, 0xB6, 0x7B, 0x8B, 0x9A, 0xC7, 0x04, + 0x35, 0xD0, 0x65, 0xCB, 0xD0, 0x44, 0x41, 0xD1, + 0x74, 0x1E, 0xE8, 0x87, 0x6F, 0xE5, 0x25, 0x44, + 0xFB, 0x23, 0xA7, 0x08, 0xF4, 0x89, 0xEA, 0xCF, + 0x1E, 0xE0, 0xE7, 0xC9, 0x12, 0x92, 0xC8, 0xA8, + 0x89, 0x13, 0xA6, 0x07, 0xDC, 0xC9, 0xFA, 0x1F, + 0x2E, 0xB1, 0x04, 0x58, 0xBA, 0xAA, 0x6B, 0xE8, + 0x6B, 0x7D, 0xC8, 0x01, 0x8B, 0x1E, 0xCF, 0x49, + 0xCA, 0x21, 0xAD, 0x61, 0x18, 0xED, 0x8E, 0x83, + 0x00, 0x3E, 0xD9, 0x90, 0x78, 0xE2, 0x22, 0xFF, + 0x8F, 0x54, 0xD4, 0xF9, 0x21, 0x10, 0x37, 0xF4, + 0xFC, 0x2F, 0x15, 0x31, 0x48, 0xB0, 0xD3, 0x36, + 0xC1, 0x32, 0x99, 0x05, 0xDD, 0x6D, 0x3B, 0xBA, + 0x3A, 0x60, 0x91, 0xFE, 0xAE, 0x16, 0xFA, 0x72, + 0x53, 0xC0, 0x75, 0xFC, 0x51, 0xC9, 0x0C, 0x38, + 0x99, 0x5F, 0x19, 0x75, 0xAD, 0x1D, 0x4B, 0xCA, + 0x4A, 0x3C, 0x88, 0x01, 0x40, 0xD2, 0x33, 0xB4, + 0x37, 0x64, 0xDA, 0x3A, 0xAA, 0xBB, 0x93, 0x50, + 0xF5, 0x5A, 0xC4, 0xB5, 0x9D, 0x2D, 0x7B, 0xFA, + 0x7A, 0x84, 0x17, 0x7B, 0x22, 0xD8, 0xBB, 0xEA, + 0x58, 0x80, 0x97, 0xB2, 0x69, 0x70, 0x49, 0x00, + 0x89, 0x4F, 0x09, 0x65, 0xBD, 0x0D, 0x5B, 0xDA, + 0x5A, 0xB0, 0x32, 0x5D, 0x89, 0x1E, 0x46, 0x85, + 0x54, 0xC4, 0x71, 0x8F, 0x54, 0xEC, 0xEE, 0x8F, + 0x7F, 0xAF, 0x90, 0xEA, 0x7A, 0xCC, 0x7D, 0xF1, + 0x72, 0xA5, 0x79, 0x19, 0xC6, 0xF4, 0x5D, 0x61, + 0xF7, 0x24, 0x98, 0xD2, 0x53, 0xEB, 0x26, 0xE4, + 0x01, 0x67, 0xF7, 0xB6, 0x64, 0xC9, 0x59, 0xF3, + 0x30, 0x59, 0xFC, 0x9B, 0xD1, 0x65, 0x05, 0xD3, + 0x68, 0xB8, 0x68, 0x7D, 0xB5, 0xC7, 0xB3, 0x8F, + 0x59, 0x2E, 0x92, 0x5C, 0xC7, 0x7F, 0x3D, 0xFE, + 0x73, 0x88, 0x1F, 0x77, 0xB2, 0xF2, 0x9E, 0x55, + 0x57, 0x8F, 0x34, 0x9A, 0x61, 0x0C, 0x7B, 0xD3, + 0x5C, 0x15, 0xAE, 0xC2, 0x16, 0xB4, 0xC2, 0x2B, + 0xA5, 0x75, 0x6A, 0xA4, 0x31, 0x81, 0xA7, 0x67, + 0xE7, 0x30, 0x84, 0x28, 0xD0, 0x60, 0xA2, 0x71, + 0xF9, 0xE0, 0x33, 0xFF, 0xAB, 0x01, 0x04, 0x22, + 0x84, 0x42, 0x04, 0x02, 0x99, 0xFB, 0x9F, 0x5F, + 0xB9, 0x7F, 0xF5, 0x21, 0xDB, 0xC6, 0xA5, 0x00, + 0x60, 0x9D, 0x8B, 0x07, 0xAB, 0x7D, 0x03, 0xE2, + 0xD3, 0x45, 0xF0, 0x6E, 0xBD, 0x0D, 0x4B, 0xA4, + 0x23, 0x8A, 0x77, 0x1B, 0xCF, 0x75, 0x30, 0x96, + 0x33, 0xE4, 0x6A, 0x94, 0x6F, 0x01, 0xA1, 0x41, + 0xC1, 0x88, 0x5B, 0x97, 0xCD, 0x3E, 0x56, 0xD0, + 0x53, 0x88, 0x9C, 0xE3, 0x3C, 0x00, 0x1A, 0xA8, + 0x6C, 0xB7, 0xA3, 0xDC, 0x03, 0x96, 0x14, 0xF2, + 0x7E, 0xB7, 0x1C, 0x80, 0xEA, 0x49, 0x21, 0x8B, + 0x48, 0x85, 0xF8, 0x93, 0x89, 0x3D, 0x5D, 0x5F, + 0x13, 0x33, 0x93, 0xC3, 0x1C, 0x4E, 0x2D, 0xE0, + 0xE2, 0x1D, 0x2A, 0x51, 0xE7, 0x07, 0xF5, 0x38, + 0xB8, 0x75, 0x4A, 0x2A, 0xFE, 0x5C, 0x37, 0x0E, + 0x7C, 0xEA, 0x5C, 0xB6, 0x7E, 0xCE, 0x2C, 0x25, + 0x5C, 0xD1, 0xFF, 0x66, 0x06, 0x94, 0x59, 0x9A, + 0x7F, 0x7D, 0xED, 0x21, 0x69, 0xAD, 0xC6, 0x9F, + 0x49, 0x7B, 0xC7, 0xA7, 0x74, 0xC8, 0xE4, 0xC6, + 0x65, 0x63, 0x07, 0xC9, 0x65, 0x0F, 0xBC, 0xBC, + 0x1C, 0xC7, 0xD3, 0xAC, 0x7C, 0x2E, 0x2B, 0x4B, + 0xB9, 0x3F, 0xF7, 0x59, 0xC2, 0x7A, 0x0C, 0x86, + 0xF4, 0x23, 0xFB, 0x75, 0xE9, 0x59, 0x9B, 0x48, + 0xC0, 0x7E, 0x13, 0x59, 0x07, 0x72, 0xED, 0x00, + 0x87, 0x50, 0xE9, 0x45, 0xBD, 0x0D, 0xCF, 0x1C, + 0x94, 0xCD, 0x1E, 0xD2, 0x1C, 0x36, 0xA5, 0x80, + 0xD9, 0x24, 0x8F, 0x13, 0xC7, 0x75, 0x53, 0x5B, + 0x24, 0x47, 0xD3, 0x12, 0xC9, 0x5C, 0xE8, 0x0E, + 0x2E, 0x65, 0xA7, 0xAD, 0x6C, 0xFB, 0x97, 0x5C, + 0x0E, 0xF6, 0x9D, 0x33, 0x49, 0x8D, 0x27, 0x24, + 0x64, 0x9F, 0x29, 0x97, 0x2A, 0x3A, 0xF8, 0x2B, + 0xA3, 0x0A, 0xE0, 0xF2, 0x96, 0x7C, 0x76, 0x55, + 0xD9, 0x6F, 0x0B, 0x29, 0xF1, 0xE3, 0x90, 0x58, + 0xBD, 0xB0, 0x20, 0xCA, 0x1B, 0xAB, 0xC7, 0x78, + 0xF4, 0x7B, 0x8F, 0xA0, 0x70, 0xAA, 0x89, 0xBB, + 0x7F, 0xA4, 0xA0, 0xDF, 0x0C, 0x20, 0x0B, 0x79, + 0xAD, 0x8A, 0x30, 0xA6, 0x72, 0x4A, 0xA8, 0x2C, + 0xAC, 0x12, 0x70, 0x3A, 0x70, 0xD4, 0x48, 0x1A, + 0x53, 0x79, 0x5D, 0x65, 0x41, 0xD3, 0xB0, 0x7D, + 0xDD, 0x27, 0x95, 0xE4, 0xCC, 0x51, 0x36, 0x70, + 0x2F, 0x0B, 0x1F, 0x67, 0x43, 0xE5, 0x5F, 0x77, + 0xFB, 0xA8, 0x9C, 0xB4, 0x6C, 0x6A, 0xB0, 0x60, + 0xEC, 0xCD, 0xDE, 0x63, 0x9D, 0x0F, 0x7B, 0x47, + 0xE5, 0xFC, 0xBB, 0xF5, 0x79, 0x35, 0x53, 0x0E, + 0x71, 0x4F, 0x29, 0x63, 0x96, 0x21, 0x07, 0x3B, + 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x0B, 0x5F, 0x9C, + 0x44, 0x9A, 0x6E, 0xA2, 0x8A, 0x70, 0x55, 0xA7, + 0x23, 0x78, 0xE8, 0xA7, 0x4E, 0xD8, 0xFB, 0x08, + 0xE9, 0x79, 0xCC, 0xD1, 0x45, 0xF6, 0x9A, 0xF2, + 0x54, 0xEC, 0x75, 0x7F, 0x24, 0x8A, 0xE6, 0x55, + 0x47, 0xB9, 0xD1, 0x7D, 0x85, 0x35, 0xC7, 0x61, + 0x41, 0xA8, 0x5A, 0xB6, 0xDC, 0x69, 0x04, 0x66, + 0xE1, 0x3A, 0x3C, 0xE1, 0x3D, 0x3D, 0xF5, 0xA6, + 0x84, 0x18, 0xAE, 0xDF, 0xF7, 0x5A, 0xCA, 0x06, + 0x95, 0x08, 0xBE, 0xD2, 0x06, 0x85, 0xD7, 0x53, + 0x53, 0x95, 0xD3, 0xB3, 0x38, 0x4A, 0x0F, 0x11, + 0x51, 0xAA, 0x1C, 0xB2, 0x0C, 0x1C, 0xBA, 0x89, + 0xF6, 0x2D, 0xAD, 0x80, 0x58, 0xD9, 0xF7, 0x34, + 0x95, 0x01, 0xB4, 0xF1, 0x3A, 0x97, 0x07, 0xC7, + 0x47, 0x9C, 0x1C, 0x31, 0xE9, 0xC8, 0x9C, 0x5F, + 0x47, 0x95, 0xAF, 0x6A, 0x10, 0x89, 0x34, 0x54, + 0x74, 0xBB, 0x2B, 0x7D, 0xA7, 0xF2, 0xD0, 0x31, + 0xAC, 0x87, 0x07, 0x2A, 0xF2, 0xE3, 0xD2, 0x11, + 0xB0, 0x21, 0x94, 0xC9, 0x23, 0x90, 0x61, 0xF1, + 0x72, 0x28, 0xCC, 0xA3, 0xF2, 0x6B, 0x22, 0xE1, + 0xC8, 0x4A, 0xE1, 0x7D, 0xA5, 0x15, 0x43, 0xC2, + 0x42, 0xB8, 0x5D, 0x32, 0x62, 0xF0, 0x57, 0xFF, + 0x62, 0x18, 0xFA, 0x95, 0x28, 0xD1, 0x99, 0xC8, + 0x1D, 0xC5, 0xB2, 0x88, 0x53, 0x52, 0x65, 0xA6, + 0x8E, 0x77, 0x79, 0x1E, 0x06, 0x1C, 0x6C, 0x3C, + 0x26, 0xED, 0xEB, 0x1D, 0x56, 0x7F, 0x3D, 0x58, + 0x11, 0xEF, 0x44, 0xD8, 0x00, 0xB0, 0xE6, 0x67, + 0xE7, 0x9D, 0x7F, 0x10, 0x2D, 0xDF, 0x97, 0xB6, + 0x6E, 0xB6, 0x41, 0x1F, 0xC4, 0x45, 0x76, 0xB5, + 0x39, 0xEE, 0x80, 0xCF, 0xE6, 0x01, 0x62, 0x15, + 0xF8, 0x01, 0x0A, 0x69, 0x79, 0xCD, 0x64, 0xAB, + 0x86, 0x5F, 0x68, 0x5D, 0x86, 0xD6, 0x2B, 0xCB, + 0xD2, 0x2A, 0x15, 0x7D, 0xC0, 0x38, 0x58, 0x29, + 0xF3, 0x2B, 0x35, 0x7A, 0xAE, 0x1C, 0xCC, 0xA6, + 0x06, 0x74, 0xE1, 0x90, 0xB8, 0x04, 0x6F, 0x69, + 0x1F, 0x3B, 0xBB, 0x96, 0x4E, 0xE2, 0x4A, 0x0D, + 0x1F, 0xC0, 0x57, 0x60, 0xBB, 0x16, 0x86, 0xEB, + 0x69, 0x97, 0xE3, 0xAA, 0x5F, 0xE5, 0x98, 0xA8, + 0x28, 0xF3, 0x73, 0x5E, 0x86, 0x47, 0x60, 0xA3, + 0xFF, 0x70, 0x4E, 0x25, 0x71, 0x89, 0x4C, 0x92, + 0x12, 0x8F, 0x38, 0x54, 0x2D, 0xD5, 0xB6, 0x53, + 0xEF, 0x1C, 0x02, 0x69, 0xBD, 0x04, 0xF6, 0x7C, + 0x64, 0x0D, 0x1B, 0x04, 0x96, 0x45, 0xE7, 0x87, + 0x73, 0xCF, 0x45, 0x3A, 0x5F, 0xED, 0x25, 0xE2, + 0xAF, 0x77, 0x8B, 0x4D, 0x37, 0x4D, 0x09, 0x6C, + 0xA9, 0x5A, 0x5E, 0x92, 0x39, 0x4F, 0x2A, 0xEA, + 0x2D, 0xCD, 0x6F, 0xBE, 0x64, 0x7C, 0x1B, 0x19, + 0x39, 0x96, 0x60, 0xC0, 0xD8, 0x22, 0xE8, 0x8A, + 0xC0, 0x3F, 0x6C, 0x43, 0xB3, 0xB1, 0x71, 0xC2, + 0xFE, 0x70, 0xA1, 0xF6, 0x26, 0x34, 0xF0, 0x35, + 0x50, 0x5A, 0xC8, 0xE2, 0x3D, 0x8D, 0x5F, 0x3F, + 0xCB, 0x77, 0x7A, 0x1E, 0x64, 0x70, 0x16, 0x33, + 0x63, 0x9C, 0xAC, 0xC3, 0x1B, 0xA7, 0xCD, 0xD5, + 0x52, 0x85, 0x2F, 0x81, 0x14, 0x3C, 0xB9, 0xB6, + 0x12, 0xEC, 0x5E, 0x32, 0x02, 0xB5, 0x37, 0xF9, + 0xE1, 0xF6, 0x0E, 0xC3, 0x53, 0xE0, 0x25, 0xDD, + 0x75, 0xB3, 0xF5, 0x99, 0x41, 0xF1, 0xA7, 0x26, + 0xA6, 0x4C, 0xBD, 0xD2, 0x32, 0x81, 0xC0, 0x5C, + 0xDF, 0x2D, 0xE8, 0x0F, 0x54, 0x76, 0xD5, 0x01, + 0x18, 0xA0, 0x8F, 0xB0, 0xE1, 0x62, 0x8B, 0x68, + 0xCA, 0xD3, 0x99, 0xDC, 0x47, 0xEA, 0x7A, 0xBA, + 0x3A, 0xE1, 0x61, 0x4C, 0x94, 0xC1, 0xB2, 0x72, + 0xEF, 0xC4, 0x44, 0x69, 0xB1, 0x0D, 0x27, 0x42, + 0xE2, 0x1B, 0x8C, 0xA7, 0x7C, 0x41, 0x2B, 0x73, + 0xF1, 0x26, 0x8A, 0x64, 0xD5, 0x42, 0x87, 0x58, + 0xFA, 0x5D, 0x37, 0x27, 0x11, 0xAD, 0xE5, 0x9D, + 0x1F, 0xC8, 0x69, 0xA7, 0x14, 0x8C, 0x5D, 0xD6, + 0x55, 0x4E, 0xD8, 0xB4, 0xFE, 0x65, 0xAD, 0xAD, + 0x0D, 0xD6, 0x10, 0xE5, 0x1D, 0x3F, 0x34, 0x5C, + 0x1C, 0xE7, 0x51, 0xCF, 0x3C, 0x24, 0x84, 0x64, + 0xE4, 0xBF, 0xF6, 0xBA, 0x90, 0x4B, 0x83, 0x83, + 0x23, 0xF8, 0x9C, 0xDB, 0xA9, 0xD9, 0x99, 0x59, + 0x39, 0x3F, 0x99, 0x27, 0x94, 0x8E, 0x2E, 0xCE, + 0x4E, 0x37, 0xAA, 0x6C, 0x74, 0xE4, 0x84, 0x84, + 0xAE, 0x65, 0x71, 0x76, 0x04, 0x15, 0x28, 0xEB, + 0xCE, 0x00, 0x94, 0xF4, 0x2F, 0x27, 0x45, 0x89, + 0x0F, 0xD8, 0x2B, 0xA7, 0x3C, 0x9D, 0xF1, 0x38, + 0x88, 0xB0, 0xF6, 0x7A, 0x4C, 0xED, 0x3D, 0x0E, + 0x2E, 0x97, 0x4E, 0x08, 0xDC, 0x73, 0xDB, 0x19, + 0x09, 0x7B, 0x3D, 0x4A, 0x0B, 0x2B, 0xDB, 0x6F, + 0x05, 0x12, 0x6E, 0xC8, 0xC2, 0x7E, 0x37, 0x75, + 0xF9, 0x08, 0x0C, 0x6C, 0x91, 0xA1, 0x49, 0x98, + 0xA8, 0xC0, 0x37, 0xE9, 0x7D, 0xE8, 0x58, 0x10, + 0xB0, 0xB3, 0x07, 0xD6, 0x06, 0x36, 0xE9, 0xAA, + 0xC0, 0xC6, 0xC0, 0x54, 0xCD, 0x8F, 0xA3, 0x49, + 0x13, 0x62, 0x56, 0x30, 0xC0, 0xC2, 0xEE, 0x07, + 0x07, 0x58, 0xAF, 0x41, 0xD3, 0x4B, 0x4D, 0xC4, + 0xFE, 0xAD, 0x19, 0xD8, 0x03, 0x39, 0xCA, 0x80, + 0xB4, 0xDD, 0x40, 0x06, 0x54, 0x6A, 0xBA, 0xC1, + 0xB1, 0xD0, 0xEE, 0x00, 0xD0, 0x47, 0xA5, 0x2C, + 0x44, 0x17, 0xA3, 0xC3, 0x10, 0x20, 0x93, 0xC3, + 0xC9, 0xE6, 0xA2, 0xE1, 0x13, 0x29, 0xA7, 0x97, + 0xE8, 0xC3, 0x8F, 0x0D, 0x17, 0xA9, 0xE3, 0xC1, + 0x4F, 0xBD, 0x8B, 0x2B, 0xE2, 0xB2, 0x1E, 0xFE, + 0xBC, 0x3A, 0xE0, 0xE9, 0x20, 0x90, 0xFC, 0x35, + 0xBE, 0x30, 0x3E, 0x50, 0x93, 0x10, 0x40, 0xB0, + 0x44, 0xAF, 0xFA, 0x66, 0x04, 0x70, 0x62, 0xCE, + 0x60, 0x5B, 0xAE, 0xD3, 0x5D, 0x58, 0xCD, 0xAF, + 0xE4, 0x2B, 0x1C, 0x2E, 0xF5, 0xD7, 0x9C, 0x79, + 0x6B, 0xDB, 0x44, 0xE8, 0x10, 0xA0, 0x48, 0x80, + 0x89, 0xD9, 0xCA, 0xF1, 0x09, 0xA4, 0x34, 0xF4, + 0x74, 0xAF, 0x2F, 0x02, 0xDA, 0x4B, 0x6C, 0xAF, + 0x87, 0x5E, 0x4A, 0xEC, 0x20, 0xB5, 0x8D, 0x6D, + 0x45, 0x9C, 0xA1, 0x67, 0x9A, 0xB9, 0xFE, 0x32, + 0xF8, 0xC1, 0xD8, 0x34, 0x3D, 0xC6, 0xA5, 0xA5, + 0x05, 0xDE, 0xAA, 0xEB, 0x87, 0xF7, 0xB7, 0x77, + 0x4F, 0x96, 0xC0, 0x60, 0xA8, 0xDA, 0xD7, 0xA3, + 0x91, 0x61, 0xF0, 0xF9, 0x29, 0xBB, 0x63, 0xA1, + 0x2D, 0xEC, 0xE8, 0xAF, 0x5F, 0x0A, 0x6D, 0x8F, + 0x12, 0x39, 0xB9, 0x94, 0x4C, 0xAD, 0x86, 0x45, + 0x05, 0xFE, 0x48, 0x66, 0x9B, 0x9F, 0x3F, 0xDF, + 0x5F, 0xB4, 0x46, 0x3A, 0xA2, 0x50, 0x10, 0x92, + 0x77, 0x18, 0xB3, 0x2F, 0xF7, 0x47, 0x11, 0x90, + 0x10, 0xC7, 0x72, 0x6C, 0x14, 0xD4, 0xE5, 0x62, + 0xE1, 0x36, 0x96, 0x42, 0x9F, 0x1F, 0xBC, 0x8C, + 0xBC, 0xC4, 0xD2, 0x6C, 0x9E, 0x04, 0xD4, 0xD8, + 0xF8, 0xF3, 0x98, 0x04, 0x06, 0x7A, 0x98, 0x54, + 0xF0, 0xCB, 0x3E, 0x43, 0xFD, 0x55, 0x09, 0x2B, + 0x81, 0x74, 0x10, 0x56, 0xBC, 0x47, 0x94, 0xB3, + 0x3E, 0xF2, 0xE6, 0x86, 0x76, 0xC6, 0xBD, 0x3D, + 0xBD, 0xD0, 0xC7, 0xDB, 0xB8, 0x18, 0xD8, 0xB8, + 0x0C, 0x67, 0x7B, 0x37, 0x4F, 0x5F, 0x4B, 0xCD, + 0x4D, 0x96, 0x2C, 0x4A, 0x20, 0x3F, 0xDF, 0x3A, + 0x43, 0x67, 0x69, 0x00, 0x62, 0x06, 0x94, 0x79, + 0xD7, 0x00, 0xAA, 0x36, 0x01, 0xA0, 0x30, 0x3E, + 0x2D, 0x34, 0xEF, 0xAD, 0x6E, 0xED, 0xBD, 0x4D, + 0xB9, 0x04, 0xF1, 0x3D, 0x6E, 0x75, 0xB0, 0xF5, + 0x52, 0x24, 0x90, 0x7D, 0xFB, 0x48, 0xE8, 0x08, + 0x88, 0xDB, 0x65, 0x80, 0x6A, 0x7F, 0x56, 0xB6, + 0x2B, 0x00, 0x80, 0xAD, 0x75, 0x44, 0x63, 0xA0, + 0x00, 0xB9, 0xFF, 0x1B, 0xCB, 0x70, 0x53, 0x13, + 0xA1, 0xEA, 0xDC, 0xE2, 0x9A, 0x58, 0x1D, 0xF7, + 0xF7, 0x4A, 0x5C, 0x40, 0xEF, 0xAF, 0xB5, 0x53, + 0x85, 0xBA, 0x08, 0x46, 0x9C, 0x0A, 0x28, 0x7B, + 0x8B, 0xD0, 0x44, 0x29, 0xD1, 0x49, 0x18, 0x92, + 0x30, 0xEB, 0x7F, 0x02, 0xFA, 0x6A, 0x3B, 0xD9, + 0x0A, 0xA1, 0x55, 0x1C, 0xEE, 0x1E, 0x3A, 0x0A, + 0xC0, 0x5D, 0xA9, 0xC1, 0x3F, 0x2E, 0x11, 0xD2, + 0xD2, 0x4D, 0xFA, 0xD6, 0x46, 0xC7, 0x01, 0xD5, + 0x59, 0x24, 0x50, 0x2F, 0xEB, 0xA9, 0xD5, 0xED, + 0xEF, 0x67, 0xA1, 0x8B, 0x51, 0xE1, 0x67, 0xB5, + 0x33, 0xE4, 0x50, 0x30, 0xE1, 0xC3, 0xF0, 0x40, + 0x60, 0x19, 0x0F, 0xCB, 0x19, 0x0B, 0x0E, 0xFC, + 0x61, 0x4A, 0xDE, 0xB0, 0x4D, 0x7B, 0xF4, 0xCB, + 0x4B, 0x90, 0x10, 0x3D, 0xE5, 0x59, 0x3B, 0xF7, + 0x72, 0xE8, 0x19, 0x76, 0xA2, 0x51, 0xF9, 0x3D, + 0x7D, 0x74, 0x52, 0xAC, 0x69, 0xB5, 0xC3, 0x5A, + 0xDD, 0x0D, 0x32, 0xDE, 0x86, 0xC2, 0x20, 0xBD, + 0x51, 0xDC, 0xE2, 0x88, 0x90, 0xD2, 0x12, 0x30, + 0x9F, 0x6E, 0x64, 0x16, 0xE8, 0x46, 0x09, 0xEF, + 0x41, 0xB6, 0x66, 0x34, 0xBB, 0x59, 0x56, 0xBC, + 0x1C, 0x55, 0x13, 0xBF, 0xFE, 0xEE, 0x2C, 0xE5, + 0x4F, 0x26, 0x99, 0xDC, 0x84, 0x9E, 0xEF, 0x9F, + 0xB5, 0x4E, 0xF4, 0x93, 0xE9, 0x04, 0x08, 0xE2, + 0xCE, 0x87, 0x38, 0x73, 0x39, 0xC3, 0x4B, 0x26, + 0xA4, 0x5A, 0x1F, 0x8C, 0x12, 0xA9, 0xC9, 0x12, + 0x2C, 0xD7, 0xC3, 0x5F, 0x47, 0x5D, 0x9D, 0xEF, + 0x00, 0xF1, 0xF7, 0x20, 0x08, 0x02, 0xC8, 0xBA, + 0x30, 0xC1, 0x95, 0xF3, 0x02, 0x32, 0xE9, 0x38, + 0x58, 0x38, 0xAE, 0x70, 0xF5, 0x29, 0x63, 0x1F, + 0x3D, 0xEC, 0x7D, 0xB3, 0x20, 0x78, 0xB5, 0x77, + 0xFB, 0x2B, 0x78, 0xFB, 0xDC, 0xA4, 0xC0, 0x2A, + 0x76, 0x3F, 0x84, 0x00, 0x74, 0x0D, 0x66, 0x5F, + 0x2D, 0xBB, 0xE5, 0x41, 0x9D, 0x07, 0xBB, 0x99, + 0x14, 0x27, 0x4D, 0xEF, 0x9A, 0x28, 0x44, 0x9F, + 0x3F, 0x66, 0x20, 0x8C, 0xC6, 0xD6, 0x24, 0xCD, + 0x67, 0x7C, 0x42, 0x8E, 0xC6, 0xEF, 0x7F, 0x25, + 0x2D, 0x74, 0xCA, 0x81, 0xDB, 0x26, 0xAE, 0xCB, + 0xA7, 0x83, 0xFD, 0x95, 0x46, 0xC5, 0xBE, 0x5C, + 0xFC, 0x07, 0xC5, 0xFF, 0x34, 0x70, 0x82, 0x6E, + 0xC7, 0x90, 0xAF, 0xC8, 0x99, 0xAB, 0xA7, 0x4E, + 0x02, 0xC1, 0x92, 0x22, 0x05, 0xA8, 0x38, 0xF8, + 0x78, 0xA3, 0x23, 0x0E, 0xD6, 0x27, 0x27, 0xE4, + 0x55, 0xEF, 0x5A, 0xBE, 0x22, 0x1B, 0xF9, 0x00, + 0xC4, 0x02, 0x44, 0x28, 0xF0, 0x40, 0x16, 0x97, + 0x17, 0x6E, 0x1A, 0x66, 0x1B, 0x98, 0xD8, 0x89, + 0x69, 0xB1, 0x8F, 0x61, 0x30, 0xC9, 0xB4, 0x84, + 0x04, 0xDF, 0x5F, 0x72, 0xAA, 0xA7, 0xC5, 0x24, + 0xC6, 0x1E, 0x80, 0xEE, 0x3A, 0x06, 0xED, 0x8F, + 0xAA, 0x73, 0xED, 0x00, 0xBB, 0x08, 0xFA, 0xF8, + 0x68, 0x2A, 0xCE, 0x3B, 0xA1, 0x98, 0x9A, 0xD6, + 0x55, 0xB7, 0x93, 0xE2, 0xCA, 0x7A, 0x2C, 0xAD, + 0x2D, 0xC7, 0x13, 0x7C, 0x9C, 0x2F, 0xFD, 0x2E, + 0xB6, 0x61, 0xCB, 0xA0, 0x93, 0x39, 0xC8, 0x56, + 0xD5, 0xCE, 0xD3, 0x9F, 0xE5, 0x06, 0x7E, 0x7E, + 0xDE, 0x05, 0x2B, 0x4E, 0x14, 0xB7, 0xD1, 0xB3, + 0xF0, 0x3B, 0x17, 0xF3, 0xA2, 0x61, 0x64, 0x88, + 0x28, 0x41, 0xE4, 0x90, 0x5F, 0x04, 0x6A, 0x12, + 0x01, 0x56, 0x7B, 0x9F, 0x4C, 0x51, 0x33, 0x13, + 0x9B, 0x40, 0xDB, 0xBD, 0x78, 0x38, 0x54, 0x96, + 0x0B, 0x20, 0xA0, 0x8D, 0x55, 0xD4, 0xD6, 0x15, + 0xAD, 0x75, 0x71, 0x0F, 0xC3, 0xBB, 0x78, 0x10, + 0xB3, 0xA2, 0xAF, 0x7A, 0x01, 0x16, 0x4D, 0xDC, + 0xFC, 0xBC, 0xCA, 0x24, 0xEF, 0x47, 0xBE, 0xDD, + 0x4A, 0xF9, 0x64, 0xCA, 0xBA, 0xF5, 0x74, 0xD0, + 0x53, 0x70, 0x75, 0xD9, 0x21, 0x91, 0x23, 0xF0, + 0x68, 0x02, 0xFF, 0x90, 0xA8, 0xC5, 0xB5, 0x87, + 0x6C, 0x17, 0x73, 0x4C, 0x8C, 0xFC, 0xBC, 0x7C, + 0x5E, 0xAE, 0x98, 0x34, 0xCC, 0x7C, 0xDC, 0xB6, + 0x26, 0x5F, 0x82, 0x6E, 0xF0, 0x41, 0x21, 0x43, + 0x00, 0xCB, 0x58, 0x13, 0xEB, 0x9B, 0xDB, 0x1B, + 0x0A, 0x8F, 0x3A, 0xD4, 0x1F, 0xA9, 0x51, 0x98, + 0xBA, 0xA2, 0x04, 0xF2, 0xA2, 0x9B, 0x88, 0x2D, + 0x89, 0x72, 0x4C, 0xA3, 0xD6, 0x64, 0xE4, 0x2C, + 0xAC, 0x6A, 0x2C, 0x40, 0x98, 0x28, 0x7E, 0xFF, + 0x7F, 0xE6, 0xF8, 0x6B, 0x22, 0xF7, 0x94, 0xE5, + 0x07, 0xDF, 0x58, 0x7F, 0xA4, 0xAC, 0xC7, 0xC5, + 0x5E, 0x9D, 0x27, 0x66, 0x6E, 0x12, 0x52, 0x50, + 0x8B, 0x48, 0x3E, 0x72, 0xAA, 0xB8, 0xFB, 0x9B, + 0xB2, 0xD2, 0xA4, 0xE8, 0x30, 0x02, 0x41, 0x21, + 0x61, 0x9A, 0x2C, 0xD0, 0x80, 0x20, 0xD2, 0xB3, + 0x33, 0x78, 0x46, 0x0A, 0x50, 0x83, 0x43, 0x43, + 0xE3, 0x38, 0xAC, 0xE3, 0xBB, 0xCB, 0x8B, 0x4B, + 0x8B, 0x72, 0xD4, 0xFA, 0x86, 0x36, 0x16, 0xF4, + 0x54, 0xAD, 0x78, 0x94, 0x51, 0x11, 0x47, 0xC6, + 0x46, 0xFB, 0x79, 0x1D, 0x47, 0xF4, 0xB3, 0xB1, + 0x32, 0xCF, 0x1F, 0x4B, 0x99, 0x84, 0xE6, 0x9B, + 0x18, 0x0E, 0xBC, 0xF5, 0xB5, 0x27, 0x5A, 0x6A, + 0x42, 0xCA, 0xCE, 0x02, 0x21, 0x21, 0x8D, 0x5D, + 0x1F, 0x87, 0x17, 0xBB, 0x43, 0xF3, 0x01, 0xCB, + 0x47, 0x5C, 0xCA, 0xA6, 0xCE, 0xE7, 0x97, 0xC5, + 0x0F, 0xD8, 0x73, 0xEF, 0x37, 0x87, 0xFD, 0x3C, + 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0x51, 0x9C, + 0x1E, 0xA5, 0x17, 0x7A, 0xA2, 0x12, 0x72, 0xB2, + 0x32, 0xE9, 0xEF, 0x8D, 0x57, 0x87, 0xCD, 0x0F, + 0x8F, 0x54, 0xE2, 0x8E, 0x56, 0xE6, 0x66, 0xB4, + 0x36, 0x8D, 0x27, 0x4B, 0x9B, 0x2B, 0x36, 0xF2, + 0x0C, 0xD3, 0xE1, 0x9F, 0x45, 0x95, 0x81, 0x52, + 0xD0, 0x6B, 0x45, 0x3A, 0xE0, 0x30, 0xF0, 0x23, + 0xA1, 0x1A, 0x74, 0x0C, 0xD6, 0x06, 0x7E, 0xAB, + 0x29, 0x92, 0x14, 0x6E, 0xB4, 0x64, 0x30, 0xE5, + 0x67, 0xDC, 0xD2, 0xAB, 0x71, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x87, 0x47, + 0xC7, 0x1C, 0x5A, 0xC9, 0xEE, 0xA1, 0xC1, 0x01, + 0x81, 0x5A, 0x1C, 0x8F, 0xA8, 0xE7, 0x97, 0x40, + 0xC2, 0x79, 0xEB, 0x90, 0x4A, 0x9A, 0xEE, 0x36, + 0xB4, 0x0F, 0x19, 0x62, 0xB8, 0x68, 0x08, 0xC8, + 0x48, 0x93, 0x25, 0x49, 0x91, 0x21, 0x41, 0x81, + 0x01, 0xDA, 0xA0, 0xD4, 0x0C, 0xDC, 0x6C, 0xB4, + 0x34, 0x8F, 0xC1, 0xB4, 0x6C, 0xBC, 0x30, 0xF0, + 0x70, 0xAB, 0x1D, 0x71, 0xA9, 0x19, 0x78, 0xB8, + 0x38, 0xE3, 0x54, 0x38, 0xE1, 0x51, 0x30, 0xF8, + 0x38, 0xE3, 0x54, 0x39, 0xE0, 0x51, 0x70, 0xA0, + 0x24, 0xFD, 0x6A, 0x02, 0xFB, 0x4F, 0x0E, 0x4A, + 0xDA, 0x43, 0xE4, 0x99, 0x50, 0xF1, 0xD8, 0x3A, + 0x9E, 0x67, 0x98, 0xE6, 0x77, 0xD5, 0xFC, 0x6E, + 0xD7, 0x1E, 0xFD, 0x80, 0x0D, 0xAC, 0x99, 0x4C, + 0x99, 0x53, 0x4F, 0x09, 0x7B, 0xE1, 0x2B, 0x41, + 0x6B, 0x9A, 0x79, 0x40, 0xCD, 0x28, 0x1D, 0x88, + 0x5D, 0x53, 0xB0, 0x09, 0x84, 0xE1, 0x2B, 0x01, + 0x2B, 0x1E, 0x02, 0x80, 0xF2, 0xAC, 0x7A, 0x17, + 0x21, 0x17, 0x17, 0x96, 0xF8, 0xA5, 0x73, 0x6E, + 0x35, 0x33, 0x6B, 0xE9, 0xDF, 0x81, 0x3F, 0x84, + 0xEB, 0x8D, 0xE5, 0x72, 0x74, 0x3F, 0xE1, 0xCE, + 0xB5, 0x93, 0xDB, 0x49, 0x6F, 0x21, 0xBF, 0x88, + 0xB7, 0x93, 0xDB, 0x48, 0x6E, 0x21, 0xBE, 0x81, + 0xFE, 0xDA, 0x58, 0x2D, 0xF5, 0x25, 0x7D, 0xA4, + 0x24, 0x9F, 0xD5, 0xA0, 0x78, 0xA8, 0xFC, 0x3C, + 0xBC, 0x67, 0xD1, 0xBD, 0x65, 0xD5, 0xB5, 0x75, + 0xF5, 0x2E, 0x98, 0xF4, 0x2C, 0x9C, 0xFC, 0x3C, + 0xBC, 0x67, 0xF9, 0x9C, 0x44, 0x94, 0xD0, 0x19, + 0x99, 0x22, 0x84, 0x58, 0x82, 0x32, 0x52, 0x88, + 0x08, 0xB3, 0x75, 0x18, 0xC0, 0x70, 0x6C, 0xAB, + 0x2B, 0x90, 0x9A, 0xFB, 0x21, 0xF1, 0xAD, 0x65, + 0xE5, 0x5E, 0xFC, 0x9E, 0x44, 0x94, 0x38, 0xF6, + 0x74, 0xCF, 0xED, 0x87, 0x5F, 0x8F, 0x4B, 0x84, + 0x06, 0xBD, 0x4F, 0x25, 0xFD, 0x2D, 0xC1, 0x0E, + 0x8C, 0x37, 0x71, 0x04, 0xDC, 0x0C, 0xB8, 0x77, + 0xF5, 0x4E, 0x48, 0x35, 0xEF, 0x3F, 0xE7, 0x2F, + 0xAF, 0x14, 0x82, 0xFC, 0x26, 0xF6, 0x2A, 0xED, + 0x6D, 0xD6, 0x34, 0x4A, 0x90, 0x40, 0xE8, 0x3A, + 0xB8, 0x03, 0x5D, 0x37, 0xEF, 0x3F, 0x3B, 0xE3, + 0x61, 0xDA, 0x2C, 0x4A, 0x92, 0x42, 0x14, 0x95, + 0x15, 0x4F, 0x7B, 0x11, 0x78, 0x48, 0x2E, 0xF2, + 0x78, 0x32, 0x05, 0x6F, 0x15, 0xEE, 0x8E, 0xC7, + 0x4E, 0xB0, 0x04, 0x68, 0x55, 0xE1, 0x81, 0xE4, + 0x66, 0xBD, 0xEE, 0x87, 0x5F, 0x0A, 0x62, 0xA2, + 0x07, 0xDF, 0x69, 0xA0, 0x71, 0xC1, 0x00, 0x43, + 0xC5, 0xAF, 0x9D, 0xF7, 0x8A, 0x60, 0x27, 0xFA, + 0x8A, 0x51, 0xD1, 0xFC, 0x24, 0xA5, 0x40, 0x86, + 0x27, 0x7A, 0xCA, 0x8F, 0x84, 0x29, 0xB9, 0x79, + 0xF9, 0x22, 0xA2, 0x8F, 0x57, 0xD6, 0x31, 0xF7, + 0x56, 0x05, 0xB5, 0xF0, 0x6B, 0xC6, 0x56, 0x96, + 0x16, 0xCD, 0x4D, 0x60, 0xB8, 0x39, 0xDC, 0x1A, + 0xBB, 0xE9, 0x59, 0x1C, 0x57, 0xFA, 0x6A, 0xAA, + 0x2A, 0xF1, 0x71, 0x5C, 0x84, 0x15, 0xF8, 0x3E, + 0x8F, 0xD8, 0x68, 0x95, 0xC7, 0x71, 0x90, 0xDB, + 0x5D, 0x0F, 0xF0, 0xB5, 0x6E, 0xC3, 0x53, 0x93, + 0x13, 0xC8, 0x48, 0x65, 0xBD, 0x9C, 0x72, 0xB4, + 0x38, 0xEB, 0xDF, 0xFA, 0x22, 0xF7, 0x96, 0x56, + 0x77, 0x3C, 0x8C, 0x51, 0x0E, 0xB8, 0x19, 0x56, + 0xD0, 0xC2, 0x7F, 0xBA, 0x39, 0x94, 0x04, 0xC4, + 0x44, 0x9F, 0x1F, 0x32, 0xEA, 0x6B, 0x9A, 0x5C, + 0xFD, 0xB4, 0x04, 0x41, 0x8A, 0x27, 0xB7, 0x77, + 0xF7, 0x2C, 0xAC, 0x81, 0x59, 0x68, 0x9C, 0x5A, + 0xEB, 0xA3, 0x13, 0x5E, 0x13, 0xA5, 0xEC, 0x0F, + 0x06, 0x8E, 0x25, 0xB9, 0x61, 0xD1, 0x87, 0x06, + 0x86, 0xCC, 0xEC, 0x86, 0xDF, 0xF8, 0x9E, 0xD7, + 0x7E, 0xC0, 0x76, 0x1A, 0xDF, 0x9F, 0xC9, 0x48, + 0xC8, 0xB2, 0x9C, 0xF6, 0x9C, 0x8C, 0x60, 0x08, + 0x82, 0x79, 0xAE, 0xC2, 0x92, 0x08, 0xD2, 0xA8, + 0xB4, 0x77, 0xCD, 0xBD, 0x69, 0x54, 0xD6, 0x3C, + 0x94, 0x8F, 0x19, 0x75, 0x7F, 0x81, 0xED, 0xEF, + 0x24, 0xD8, 0x4B, 0x80, 0x7B, 0xEB, 0x6D, 0xBE, + 0x2E, 0xD5, 0x63, 0x12, 0x3A, 0x8A, 0xEA, 0x2A, + 0xAA, 0x71, 0xC7, 0xAB, 0x73, 0xC3, 0xA3, 0x63, + 0xE3, 0x38, 0x8F, 0xE3, 0x3F, 0x8F, 0x8B, 0x51, + 0xD3, 0x68, +}; + +static unsigned char vfs5011_prepare_02[] = { /* 2565 B */ + 0x02, 0xF0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x17, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, + 0x00, 0x0C, 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x05, + 0x00, 0x0E, 0x00, 0x10, 0x20, 0xFD, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, + 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x08, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x0C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x10, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x14, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xC8, 0x20, 0x04, 0x30, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x05, 0x00, 0x0E, 0x00, 0x14, 0x20, + 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x84, 0x00, 0x03, 0x00, 0x09, 0x00, + 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x90, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x07, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x07, 0x00, 0x00, 0x00, + 0x04, 0x15, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x28, 0x00, 0x00, +}; + +static unsigned char vfs5011_prepare_03[] = { /* 117 B */ + 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xF4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0xF4, 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, 0x20, 0xBF, 0x02, 0x00, +}; + +static unsigned char vfs5011_prepare_04[] = { /* 2903 B */ + 0x02, 0xF0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x18, 0x20, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x20, 0x04, 0x30, 0x08, + 0x00, 0x80, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x24, 0x20, 0x04, 0x30, 0x00, 0x00, 0xFF, 0x01, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x2C, 0x20, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x40, 0x20, 0x04, 0x30, 0xFF, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x20, 0x04, 0x30, 0xE5, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x20, 0x04, 0x30, + 0xEA, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x20, 0x04, 0x30, 0x0A, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x54, 0x20, + 0x04, 0x30, 0x01, 0xDE, 0x01, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x00, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, 0x04, + 0x30, 0x02, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x1C, 0x21, + 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x20, 0x21, 0x04, 0x30, 0x08, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x40, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x4C, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x58, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x5C, 0x21, 0x04, 0x30, 0x1F, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x60, 0x21, 0x04, 0x30, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x80, 0x21, 0x04, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x88, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x90, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x94, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x9C, 0x21, 0x04, 0x30, 0x1F, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, 0x21, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xC0, 0x21, 0x04, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xC8, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xCC, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xD0, 0x21, + 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xD4, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xD8, 0x21, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xDC, 0x21, 0x04, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xE0, 0x21, 0x04, 0x30, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xA0, + 0x20, 0x04, 0x30, 0xEF, 0xE1, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0xA4, 0x20, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0xB0, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0xC4, 0x20, + 0x04, 0x30, 0x14, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0xCC, 0x20, 0x04, 0x30, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x20, 0x04, + 0x30, 0x00, 0x00, 0x74, 0x01, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA8, 0x20, 0x04, 0x30, 0xFE, 0x21, + 0x74, 0x01, 0x04, 0x03, 0x00, 0x09, 0x00, 0x04, + 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x38, + 0x00, 0x15, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x0C, 0x00, 0x00, 0x38, 0x01, 0x03, 0x02, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, + 0x00, 0x38, 0x01, 0x07, 0x02, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x00, 0x38, 0x0C, + 0x0C, 0x05, 0x00, 0x04, 0x02, 0x00, 0x80, 0x05, + 0xFF, 0xF9, 0x87, 0x20, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x87, 0x00, + 0xBB, 0xF8, 0x87, 0x00, 0xBB, 0xF8, 0x07, 0x20, + 0xBA, 0xF8, 0x07, 0x20, 0xB9, 0xF8, 0x07, 0x20, + 0xB8, 0xF8, 0x07, 0x20, 0xB7, 0xF8, 0x07, 0x20, + 0xB6, 0xF8, 0x07, 0x20, 0xB5, 0xF8, 0x07, 0x20, + 0xB4, 0xF8, 0x07, 0x20, 0xB3, 0xF8, 0x07, 0x20, + 0xB2, 0xF8, 0x07, 0x20, 0xB1, 0xF8, 0x07, 0x22, + 0xB0, 0xF8, 0x07, 0x22, 0xAF, 0xF8, 0x07, 0x22, + 0xAE, 0xF8, 0x07, 0x22, 0xAD, 0xF8, 0x07, 0x22, + 0xAC, 0xF8, 0x07, 0x22, 0xAB, 0xF8, 0x07, 0x22, + 0xAA, 0xF8, 0x07, 0x22, 0xA9, 0xF8, 0x07, 0x22, + 0xA8, 0xF8, 0x07, 0x22, 0xA7, 0xF8, 0x07, 0x22, + 0xA6, 0xF8, 0x07, 0x22, 0xA5, 0xF8, 0x07, 0x22, + 0xA4, 0xF8, 0x07, 0x22, 0xA3, 0xF8, 0x07, 0x22, + 0xA2, 0xF8, 0x07, 0x22, 0xA1, 0xF8, 0x07, 0x22, + 0xA0, 0xF8, 0x07, 0x22, 0x9F, 0xF8, 0x07, 0x22, + 0x9E, 0xF8, 0x07, 0x22, 0x9D, 0xF8, 0x07, 0x22, + 0x9C, 0xF8, 0x07, 0x22, 0x9B, 0xF8, 0x07, 0x22, + 0x9A, 0xF8, 0x07, 0x22, 0x99, 0xF8, 0x07, 0x22, + 0x98, 0xF8, 0x07, 0x22, 0x97, 0xF8, 0x07, 0x22, + 0x96, 0xF8, 0x07, 0x22, 0x95, 0xF8, 0x07, 0x22, + 0x94, 0xF8, 0x07, 0x22, 0x93, 0xF8, 0x07, 0x22, + 0x92, 0xF8, 0x07, 0x22, 0x91, 0xF8, 0x07, 0x22, + 0x90, 0xF8, 0x07, 0x22, 0x8F, 0xF8, 0x07, 0x22, + 0x8E, 0xF8, 0x07, 0x22, 0x8D, 0xF8, 0x07, 0x22, + 0x8C, 0xF8, 0x07, 0x22, 0x8B, 0xF8, 0x07, 0x22, + 0x8A, 0xF8, 0x07, 0x22, 0x89, 0xF8, 0x07, 0x22, + 0x88, 0xF8, 0x07, 0x22, 0x87, 0xF8, 0x07, 0x22, + 0x86, 0xF8, 0x07, 0x22, 0x85, 0xF8, 0x07, 0x22, + 0x84, 0xF8, 0x07, 0x22, 0x83, 0xF8, 0x07, 0x22, + 0x82, 0xF8, 0x07, 0x22, 0x81, 0xF8, 0x07, 0x22, + 0x80, 0xF8, 0x07, 0x22, 0x7F, 0xF8, 0x07, 0x22, + 0x7E, 0xF8, 0x07, 0x22, 0x7D, 0xF8, 0x07, 0x22, + 0x7C, 0xF8, 0x07, 0x22, 0x7B, 0xF8, 0x07, 0x22, + 0x7A, 0xF8, 0x07, 0x22, 0x79, 0xF8, 0x07, 0x22, + 0x78, 0xF8, 0x07, 0x22, 0x77, 0xF8, 0x07, 0x22, + 0x76, 0xF8, 0x07, 0x22, 0x75, 0xF8, 0x07, 0x22, + 0x74, 0xF8, 0x07, 0x22, 0x73, 0xF8, 0x07, 0x22, + 0x72, 0xF8, 0x07, 0x22, 0x71, 0xF8, 0x07, 0x22, + 0x70, 0xF8, 0x07, 0x22, 0x6F, 0xF8, 0x07, 0x22, + 0x6E, 0xF8, 0x07, 0x22, 0x6D, 0xF8, 0x07, 0x22, + 0x6C, 0xF8, 0x07, 0x22, 0x6B, 0xF8, 0x07, 0x22, + 0x6A, 0xF8, 0x07, 0x22, 0x69, 0xF8, 0x07, 0x22, + 0x68, 0xF8, 0x07, 0x22, 0x67, 0xF8, 0x07, 0x22, + 0x66, 0xF8, 0x07, 0x22, 0x65, 0xF8, 0x07, 0x22, + 0x64, 0xF8, 0x07, 0x22, 0x63, 0xF8, 0x07, 0x22, + 0x62, 0xF8, 0x07, 0x22, 0x61, 0xF8, 0x07, 0x22, + 0x60, 0xF8, 0x07, 0x22, 0x5F, 0xF8, 0x07, 0x22, + 0x5E, 0xF8, 0x07, 0x22, 0x5D, 0xF8, 0x07, 0x22, + 0x5C, 0xF8, 0x07, 0x22, 0x5B, 0xF8, 0x07, 0x22, + 0x5A, 0xF8, 0x07, 0x22, 0x59, 0xF8, 0x07, 0x22, + 0x58, 0xF8, 0x07, 0x22, 0x57, 0xF8, 0x07, 0x22, + 0x56, 0xF8, 0x07, 0x22, 0x55, 0xF8, 0x07, 0x22, + 0x54, 0xF8, 0x07, 0x22, 0x53, 0xF8, 0x07, 0x22, + 0x52, 0xF8, 0x07, 0x22, 0x51, 0xF8, 0x07, 0x22, + 0x50, 0xF8, 0x07, 0x22, 0x4F, 0xF8, 0x07, 0x22, + 0x4E, 0xF8, 0x07, 0x22, 0x4D, 0xF8, 0x07, 0x22, + 0x4C, 0xF8, 0x07, 0x22, 0x4B, 0xF8, 0x07, 0x22, + 0x4A, 0xF8, 0x07, 0x22, 0x49, 0xF8, 0x07, 0x22, + 0x48, 0xF8, 0x07, 0x22, 0x47, 0xF8, 0x07, 0x22, + 0x46, 0xF8, 0x07, 0x22, 0x45, 0xF8, 0x07, 0x22, + 0x44, 0xF8, 0x07, 0x22, 0x43, 0xF8, 0x07, 0x22, + 0x42, 0xF8, 0x07, 0x22, 0x41, 0xF8, 0x07, 0x22, + 0x40, 0xF8, 0x07, 0x22, 0x3F, 0xF8, 0x07, 0x22, + 0x3E, 0xF8, 0x07, 0x22, 0x3D, 0xF8, 0x07, 0x22, + 0x3C, 0xF8, 0x07, 0x22, 0x3B, 0xF8, 0x07, 0x22, + 0x3A, 0xF8, 0x07, 0x22, 0x39, 0xF8, 0x07, 0x22, + 0x38, 0xF8, 0x07, 0x22, 0x37, 0xF8, 0x07, 0x22, + 0x36, 0xF8, 0x07, 0x22, 0x35, 0xF8, 0x07, 0x22, + 0x34, 0xF8, 0x07, 0x22, 0x33, 0xF8, 0x07, 0x22, + 0x32, 0xF8, 0x07, 0x22, 0x31, 0xF8, 0x07, 0x22, + 0x30, 0xF8, 0x07, 0x22, 0x2F, 0xF8, 0x07, 0x22, + 0x2E, 0xF8, 0x07, 0x22, 0x2D, 0xF8, 0x07, 0x22, + 0x2C, 0xF8, 0x07, 0x22, 0x2B, 0xF8, 0x07, 0x22, + 0x2A, 0xF8, 0x07, 0x22, 0x29, 0xF8, 0x07, 0x22, + 0x28, 0xF8, 0x07, 0x22, 0x27, 0xF8, 0x07, 0x22, + 0x26, 0xF8, 0x07, 0x22, 0x25, 0xF8, 0x07, 0x22, + 0x24, 0xF8, 0x07, 0x22, 0x23, 0xF8, 0x07, 0x20, + 0x22, 0xF8, 0x07, 0x20, 0x21, 0xF8, 0x07, 0x20, + 0x20, 0xF8, 0x07, 0x20, 0x1F, 0xF8, 0x07, 0x20, + 0x1E, 0xF8, 0x07, 0x20, 0x1D, 0xF8, 0x07, 0x20, + 0x1C, 0xF8, 0x07, 0x20, 0x1C, 0xF8, 0x07, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD7, 0xF8, 0xA7, 0x00, 0xD7, 0xF8, 0xA7, 0x00, + 0xD8, 0xF8, 0x27, 0x20, 0xD9, 0xF8, 0x27, 0x20, + 0xDA, 0xF8, 0x27, 0x20, 0xDB, 0xF8, 0x27, 0x20, + 0xDC, 0xF8, 0x27, 0x20, 0xDD, 0xF8, 0x27, 0x20, + 0xDE, 0xF8, 0x27, 0x20, 0xDF, 0xF8, 0x27, 0x20, + 0xE0, 0xF8, 0x27, 0x20, 0xE1, 0xF8, 0x27, 0x20, + 0xE2, 0xF8, 0x27, 0x20, 0xE3, 0xF8, 0x27, 0x20, + 0xE4, 0xF8, 0x27, 0x20, 0xE5, 0xF8, 0x27, 0x20, + 0xE6, 0xF8, 0x27, 0x20, 0xE7, 0xF8, 0x27, 0x20, + 0xE8, 0xF8, 0x27, 0x20, 0xE9, 0xF8, 0x27, 0x20, + 0xEA, 0xF8, 0x27, 0x20, 0xEB, 0xF8, 0x27, 0x20, + 0xEC, 0xF8, 0x27, 0x20, 0xED, 0xF8, 0x27, 0x20, + 0xEE, 0xF8, 0x27, 0x20, 0xEF, 0xF8, 0x27, 0x20, + 0xF0, 0xF8, 0x27, 0x20, 0xF1, 0xF8, 0x27, 0x20, + 0xF2, 0xF8, 0x27, 0x20, 0xF3, 0xF8, 0x27, 0x20, + 0xF4, 0xF8, 0x27, 0x20, 0xF5, 0xF8, 0x27, 0x20, + 0xF6, 0xF8, 0x27, 0x20, 0xF7, 0xF8, 0x27, 0x20, + 0xF8, 0xF8, 0x27, 0x20, 0xF9, 0xF8, 0x27, 0x20, + 0xFA, 0xF8, 0x27, 0x20, 0xFB, 0xF8, 0x27, 0x20, + 0xFC, 0xF8, 0x27, 0x20, 0xFD, 0xF8, 0x27, 0x20, + 0xFE, 0xF8, 0x27, 0x20, 0xFF, 0xF8, 0x27, 0x20, + 0x00, 0xF9, 0x27, 0x20, 0xD7, 0xF8, 0x27, 0x20, + 0x00, 0xF8, 0x27, 0x20, 0x01, 0xF8, 0x27, 0x20, + 0x02, 0xF8, 0x27, 0x20, 0x03, 0xF8, 0x27, 0x20, + 0x04, 0xF8, 0x27, 0x20, 0x05, 0xF8, 0x27, 0x20, + 0x06, 0xF8, 0x27, 0x20, 0x07, 0xF8, 0x27, 0x20, + 0x08, 0xF8, 0x27, 0x20, 0x09, 0xF8, 0x27, 0x20, + 0x0A, 0xF8, 0x27, 0x20, 0x0B, 0xF8, 0x27, 0x20, + 0x0C, 0xF8, 0x27, 0x20, 0x0D, 0xF8, 0x27, 0x20, + 0x0E, 0xF8, 0x27, 0x20, 0x0F, 0xF8, 0x27, 0x20, + 0x10, 0xF8, 0x27, 0x20, 0x11, 0xF8, 0x27, 0x20, + 0x12, 0xF8, 0x27, 0x20, 0x13, 0xF8, 0x27, 0x20, + 0x14, 0xF8, 0x27, 0x20, 0x15, 0xF8, 0x27, 0x20, + 0x15, 0xF8, 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, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x00, 0x08, 0x00, 0x10, 0x03, 0x18, 0x1C, + 0x10, 0x03, 0x18, 0x1C, 0x03, 0x00, 0x09, 0x00, + 0x00, 0x20, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x05, 0x00, 0x0E, 0x00, 0x0C, 0x20, 0xFD, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x10, + 0x20, 0xFD, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x05, 0x00, 0x00, 0x03, 0x00, 0x09, + 0x00, 0x04, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x08, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x0C, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x10, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x14, 0x21, 0x04, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0x18, 0x21, 0x04, 0x30, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x44, + 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x48, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x4C, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x50, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x54, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x58, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0xC8, 0x20, 0x04, + 0x30, 0x04, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, + 0x0E, 0x00, 0x14, 0x20, 0xFF, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, + 0x03, 0x00, 0x09, 0x00, 0x84, 0x21, 0x04, 0x30, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, + 0x00, 0x88, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x8C, 0x21, + 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x09, 0x00, 0x90, 0x21, 0x04, 0x30, 0x01, + 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, + 0x94, 0x21, 0x04, 0x30, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x00, 0x09, 0x00, 0x98, 0x21, 0x04, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, + 0x09, 0x00, 0xA0, 0x21, 0x04, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x09, 0x00, 0x20, + 0x21, 0x04, 0x30, 0x07, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x09, 0x00, 0x60, 0x21, 0x04, 0x30, + 0x07, 0x00, 0x00, 0x00, 0x04, 0x15, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x00, + 0x00, 0x18, 0x00, 0x52, 0x01, 0x08, 0x00, 0x05, + 0x00, 0x0A, 0x00, 0xFA, 0x00, 0x1E, 0x00, 0xC8, + 0x00, 0x00, 0x00, 0x9F, 0x00, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xFF, 0xFB, 0xF9, 0xFC, 0xFD, 0xFF, 0xFD, 0xFE, + 0x00, 0x01, 0x00, 0x00, 0x03, 0x01, 0x01, 0x02, + 0x06, 0x05, 0x05, 0x06, 0x05, 0x08, 0x0A, 0x06, + 0x09, 0x09, 0x06, 0x08, 0x05, 0x04, 0x03, 0x04, + 0x03, 0x05, 0x07, 0x07, 0x09, 0x05, 0x04, 0x03, + 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFF, 0x00, + 0xFF, 0x00, 0xFB, 0xFD, 0xFF, 0xFF, 0x01, 0xFF, + 0xFD, 0xFF, 0x01, 0x02, 0x01, 0xFE, 0xFF, 0x01, + 0xFE, 0xFC, 0x00, 0xFF, 0x01, 0x01, 0x00, 0x00, + 0xFF, 0xFF, 0x04, 0x03, 0x00, 0x01, 0xFE, 0x02, + 0x02, 0x03, 0x03, 0x00, 0xFF, 0xFA, 0xFB, 0xFC, + 0xFF, 0xFF, 0x02, 0xFF, 0x01, 0xFF, 0xFE, 0xFD, + 0xFF, 0xFE, 0xFB, 0xF9, 0xF9, 0xFC, 0xFC, 0xFC, + 0xF5, 0xF3, 0xF8, 0xF5, 0xF5, 0xF5, 0xF9, 0xFB, + 0xFE, 0xFC, 0xFA, 0xF8, 0xFC, 0xF9, 0xF7, 0xF6, + 0xF6, 0xF7, 0xFB, 0xF7, 0xF9, 0xF9, 0xF8, 0xF8, + 0xF1, 0xF6, 0xF9, 0xFC, 0xFE, 0xFC, 0xFE, 0x00, + 0xFB, 0xFE, 0xFC, 0xFC, 0xFC, 0xFB, 0xFD, 0xFB, + 0xFC, 0xFA, 0xFC, 0xFA, 0x01, 0x02, 0xFE, 0xFE, + 0xFC, 0xF7, 0xF4, 0xF4, 0xED, 0xE1, 0xD7, 0x01, + 0x04, 0x03, 0x04, 0x08, 0x0B, 0x09, 0x09, 0x09, + 0x05, 0x06, 0x08, 0x05, 0x03, 0x00, 0x00, 0x01, + 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFD, 0xFC, 0xFF, + 0x02, 0xFD, 0xFB, 0xFC, 0xFA, 0xFC, 0xFD, 0xFF, + 0xFF, 0xFC, 0xFC, 0xFB, 0xFC, 0xFE, 0xFF, 0x00, + 0x01, 0x0B, 0x09, 0x07, 0x06, 0x03, 0x06, 0x08, + 0x07, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0B, 0x0D, + 0x0E, 0x10, 0x15, 0x15, 0x19, 0x1B, 0x20, 0x01, + 0x00, 0xFF, 0xFF, 0xFE, 0xFD, 0xFD, 0xFC, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +}; + +#endif diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h index 6910b645..f640f58c 100644 --- a/libfprint/fp_internal.h +++ b/libfprint/fp_internal.h @@ -296,6 +296,9 @@ extern struct fp_img_driver vfs101_driver; #ifdef ENABLE_VFS301 extern struct fp_img_driver vfs301_driver; #endif +#ifdef ENABLE_VFS5011 +extern struct fp_img_driver vfs5011_driver; +#endif #ifdef ENABLE_UPEKTC_IMG extern struct fp_img_driver upektc_img_driver; #endif From a3c90f2b24434aa36f782aca3950fd89af01fce0 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Fri, 6 Sep 2013 16:31:15 +0300 Subject: [PATCH 18/19] upektc_img: handle 0x28 message better --- libfprint/drivers/upektc_img.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/libfprint/drivers/upektc_img.c b/libfprint/drivers/upektc_img.c index 9bf099d1..577d3ed0 100644 --- a/libfprint/drivers/upektc_img.c +++ b/libfprint/drivers/upektc_img.c @@ -267,7 +267,22 @@ static void capture_read_data_cb(struct libusb_transfer *transfer) switch (data[7]) { /* No finger */ case 0x28: - fpi_ssm_jump_to_state(ssm, CAPTURE_ACK_00_28); + fp_dbg("18th byte is %.2x\n", data[18]); + switch (data[18]) { + case 0x0c: + /* no finger */ + fpi_ssm_jump_to_state(ssm, CAPTURE_ACK_00_28); + break; + case 0x00: + /* finger is present! */ + fpi_ssm_jump_to_state(ssm, CAPTURE_ACK_00_28); + break; + default: + /* some error happened, cancel scan */ + fp_err("something bad happened, aborting scan :(\n"); + fpi_ssm_mark_aborted(ssm, FP_VERIFY_RETRY_REMOVE_FINGER); + break; + } break; /* Image frame with additional info */ case 0x2c: From ee32166267323ad6c66c022e18ef6af76a3a5423 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Tue, 3 Feb 2015 17:36:32 +0100 Subject: [PATCH 19/19] 0.6.0 --- NEWS | 19 +++++++++++++++++++ configure.ac | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index c9d2b9ce..26fdc064 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,25 @@ This file lists notable changes in each release. For the full history of all changes, see ChangeLog. +2015-02-03: v0.6.0 release + +* Drivers: + - Reduce duplication between AES3500 and AES4000 drivers and + add support for AES3500 device + - Add support for UPEK 147e:2020 and Upek Eikon 2 devices + - Add EgisTec ES603 driver + - Add VFS5011 driver + - Always perform 5 scans for image enrollment + - Better verification with AES1660 driver + - Better verification for a number of AES drivers + +* Library: + - Always use Pixman for image manipulation, gdk-pixbuf and ImageMagick + are not supported any more. + +* Udev rules: + - Fix warning when USB hub or system does not support power management + 2013-08-11: v0.5.1 release * Drivers diff --git a/configure.ac b/configure.ac index 67ef78d3..a9586aa9 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([libfprint], [0.5.1]) +AC_INIT([libfprint], [0.6.0]) AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz check-news subdir-objects]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([libfprint/core.c])