From 528699f942c2dbbde607e4ae0c56ab1703f98ef3 Mon Sep 17 00:00:00 2001 From: hax0kartik Date: Sat, 28 Nov 2020 18:46:20 +0530 Subject: [PATCH 001/116] Use ctzll + new font format for improving drawing speed --- fonts/default.zmfnt | Bin 0 -> 448872 bytes src/CMakeLists.txt | 2 +- src/zm_font.cpp | 27 + src/zm_font.h | 3368 +-------------------------- src/zm_image.cpp | 136 +- web/skins/classic/views/monitor.php | 6 +- 6 files changed, 123 insertions(+), 3416 deletions(-) create mode 100644 fonts/default.zmfnt create mode 100644 src/zm_font.cpp diff --git a/fonts/default.zmfnt b/fonts/default.zmfnt new file mode 100644 index 0000000000000000000000000000000000000000..aea4980cbf5d6d54d39d8df0df6f7c1792cfb447 GIT binary patch literal 448872 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 AR{#J2 literal 0 HcmV?d00001 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bf7bf0bc5..444f4c91f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,7 +4,7 @@ configure_file(zm_config_data.h.in "${CMAKE_CURRENT_BINARY_DIR}/zm_config_data.h" @ONLY) # Group together all the source files that are used by all the binaries (zmc, zma, zmu, zms etc) -set(ZM_BIN_SRC_FILES zm_box.cpp zm_buffer.cpp zm_camera.cpp zm_comms.cpp zm_config.cpp zm_coord.cpp zm_curl_camera.cpp zm.cpp zm_db.cpp zm_logger.cpp zm_event.cpp zm_frame.cpp zm_eventstream.cpp zm_exception.cpp zm_file_camera.cpp zm_ffmpeg_input.cpp zm_ffmpeg_camera.cpp zm_group.cpp zm_image.cpp zm_jpeg.cpp zm_libvlc_camera.cpp zm_libvnc_camera.cpp zm_local_camera.cpp zm_monitor.cpp zm_monitorstream.cpp zm_ffmpeg.cpp zm_mpeg.cpp zm_packet.cpp zm_packetqueue.cpp zm_poly.cpp zm_regexp.cpp zm_remote_camera.cpp zm_remote_camera_http.cpp zm_remote_camera_nvsocket.cpp zm_remote_camera_rtsp.cpp zm_rtp.cpp zm_rtp_ctrl.cpp zm_rtp_data.cpp zm_rtp_source.cpp zm_rtsp.cpp zm_rtsp_auth.cpp zm_sdp.cpp zm_signal.cpp zm_stream.cpp zm_swscale.cpp zm_thread.cpp zm_time.cpp zm_timer.cpp zm_user.cpp zm_utils.cpp zm_video.cpp zm_videostore.cpp zm_zone.cpp zm_storage.cpp zm_fifo.cpp zm_crypt.cpp) +set(ZM_BIN_SRC_FILES zm_box.cpp zm_buffer.cpp zm_camera.cpp zm_comms.cpp zm_config.cpp zm_coord.cpp zm_curl_camera.cpp zm.cpp zm_db.cpp zm_logger.cpp zm_event.cpp zm_frame.cpp zm_eventstream.cpp zm_exception.cpp zm_file_camera.cpp zm_ffmpeg_input.cpp zm_ffmpeg_camera.cpp zm_group.cpp zm_image.cpp zm_jpeg.cpp zm_libvlc_camera.cpp zm_libvnc_camera.cpp zm_local_camera.cpp zm_monitor.cpp zm_monitorstream.cpp zm_ffmpeg.cpp zm_font.cpp zm_mpeg.cpp zm_packet.cpp zm_packetqueue.cpp zm_poly.cpp zm_regexp.cpp zm_remote_camera.cpp zm_remote_camera_http.cpp zm_remote_camera_nvsocket.cpp zm_remote_camera_rtsp.cpp zm_rtp.cpp zm_rtp_ctrl.cpp zm_rtp_data.cpp zm_rtp_source.cpp zm_rtsp.cpp zm_rtsp_auth.cpp zm_sdp.cpp zm_signal.cpp zm_stream.cpp zm_swscale.cpp zm_thread.cpp zm_time.cpp zm_timer.cpp zm_user.cpp zm_utils.cpp zm_video.cpp zm_videostore.cpp zm_zone.cpp zm_storage.cpp zm_fifo.cpp zm_crypt.cpp) # A fix for cmake recompiling the source files for every target. diff --git a/src/zm_font.cpp b/src/zm_font.cpp new file mode 100644 index 000000000..e1fbde49c --- /dev/null +++ b/src/zm_font.cpp @@ -0,0 +1,27 @@ +#include +#include "zm.h" +#include "zm_font.h" +#include "zm_utils.h" + +int ZmFont::ReadFontFile( const std::string &loc ) { + + FILE *f = fopen(loc.c_str(), "rb"); + if( !f ) return -1; // FILE NOT FOUND + + font = (ZMFONT*)malloc(sizeof(ZMFONT)); + if(!font) + return -1; + fread(&font[0], 1, 8 + (sizeof(ZMFONT_BH) * 4), f); + // Todo Check magic + datasize = (font->header[3].idx * sizeof(uint64_t))+ (font->header[3].charHeight * font->header[3].numberofCodePoints * sizeof(uint64_t)); + font->data = (uint64_t*)malloc(datasize); + fread(&font->data[0], 1, datasize, f); + fclose(f); + return 0; +} + +uint64_t *ZmFont::GetBitmapDataForSize( const unsigned int size, uint16_t &charWidth, uint16_t &charHeight ) { + charWidth = font->header[size - 1].charWidth; + charHeight = font->header[size - 1].charHeight; + return &font->data[font->header[size - 1].idx]; +} \ No newline at end of file diff --git a/src/zm_font.h b/src/zm_font.h index cdad72dc4..6cf9c1692 100644 --- a/src/zm_font.h +++ b/src/zm_font.h @@ -1,3337 +1,33 @@ -/**********************************************/ -/* */ -/* Font file generated by rthelen */ -/* */ -/**********************************************/ - -static unsigned char fontdata[] = { - - /* 0 0x00 '^A' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 1 0x01 '^B' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 2 0x02 '^C' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 3 0x03 '^D' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 4 0x04 '^E' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 5 0x05 '^F' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 6 0x06 '^G' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 7 0x07 '^H' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 8 0x08 '^I' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 9 0x09 '^J' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 10 0x0a '^K' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 11 0x0b '^L' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 12 0x0c '^M' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 13 0x0d '^N' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 14 0x0e '^O' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 15 0x0f '^P' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 16 0x10 '^Q' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 17 0x11 '^R' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x54, /* 0 0 0 00 */ - 0x38, /* 00 000 */ - 0x54, /* 0 0 0 00 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 18 0x12 '^S' */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x50, /* 0 0 0000 */ - 0x50, /* 0 0 0000 */ - 0x20, /* 00 00000 */ - 0x20, /* 00 00000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 19 0x13 '^T' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x7c, /* 0 00 */ - 0x38, /* 00 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 20 0x14 '^U' */ - 0x18, /* 000 000 */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x7c, /* 0 00 */ - 0x78, /* 0 000 */ - 0x78, /* 0 000 */ - 0x7c, /* 0 00 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 21 0x15 '^V' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 22 0x16 '^W' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 23 0x17 '^X' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 24 0x18 '^Y' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 25 0x19 '^Z' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 26 0x1a '^[' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 27 0x1b '^\' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 28 0x1c '^]' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 29 0x1d '^^' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 30 0x1e '^_' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 31 0x1f '^`' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 32 0x20 ' ' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 33 0x21 '!' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 34 0x22 '"' */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 35 0x23 '#' */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x7c, /* 0 00 */ - 0x28, /* 00 0 000 */ - 0x7c, /* 0 00 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 36 0x24 '$' */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x54, /* 0 0 0 00 */ - 0x50, /* 0 0 0000 */ - 0x38, /* 00 000 */ - 0x14, /* 000 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x38, /* 00 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 37 0x25 '%' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x54, /* 0 0 0 00 */ - 0x58, /* 0 0 000 */ - 0x28, /* 00 0 000 */ - 0x34, /* 00 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x48, /* 0 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 38 0x26 '&' */ - 0x00, /* 00000000 */ - 0x30, /* 00 0000 */ - 0x48, /* 0 00 000 */ - 0x50, /* 0 0 0000 */ - 0x20, /* 00 00000 */ - 0x54, /* 0 0 0 00 */ - 0x48, /* 0 00 000 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 39 0x27 ''' */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 40 0x28 '(' */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x04, /* 00000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 41 0x29 ')' */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 42 0x2a '*' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x54, /* 0 0 0 00 */ - 0x38, /* 00 000 */ - 0x54, /* 0 0 0 00 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 43 0x2b '+' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x7c, /* 0 00 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 44 0x2c ',' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x30, /* 00 0000 */ - 0x30, /* 00 0000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x00, /* 00000000 */ - - /* 45 0x2d '-' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 46 0x2e '.' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 000 000 */ - 0x18, /* 000 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 47 0x2f '/' */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x20, /* 00 00000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x00, /* 00000000 */ - - /* 48 0x30 '0' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x54, /* 0 0 0 00 */ - 0x64, /* 0 00 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 49 0x31 '1' */ - 0x00, /* 00000000 */ - 0x08, /* 0000 000 */ - 0x18, /* 000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x1c, /* 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 50 0x32 '2' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 51 0x33 '3' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x04, /* 00000 00 */ - 0x18, /* 000 000 */ - 0x04, /* 00000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 52 0x34 '4' */ - 0x00, /* 00000000 */ - 0x08, /* 0000 000 */ - 0x18, /* 000 000 */ - 0x28, /* 00 0 000 */ - 0x48, /* 0 00 000 */ - 0x7c, /* 0 00 */ - 0x08, /* 0000 000 */ - 0x1c, /* 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 53 0x35 '5' */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x40, /* 0 000000 */ - 0x78, /* 0 000 */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 54 0x36 '6' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x40, /* 0 000000 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 55 0x37 '7' */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 56 0x38 '8' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 57 0x39 '9' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x3c, /* 00 00 */ - 0x04, /* 00000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 58 0x3a ':' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 000 000 */ - 0x18, /* 000 000 */ - 0x00, /* 00000000 */ - 0x18, /* 000 000 */ - 0x18, /* 000 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 59 0x3b ';' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x30, /* 00 0000 */ - 0x30, /* 00 0000 */ - 0x00, /* 00000000 */ - 0x30, /* 00 0000 */ - 0x30, /* 00 0000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x00, /* 00000000 */ - - /* 60 0x3c '<' */ - 0x00, /* 00000000 */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x04, /* 00000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 61 0x3d '=' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 62 0x3e '>' */ - 0x00, /* 00000000 */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 63 0x3f '?' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 64 0x40 '@' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x74, /* 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x78, /* 0 000 */ - 0x40, /* 0 000000 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 65 0x41 'A' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 66 0x42 'B' */ - 0x00, /* 00000000 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x78, /* 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 67 0x43 'C' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 68 0x44 'D' */ - 0x00, /* 00000000 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x78, /* 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 69 0x45 'E' */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x78, /* 0 000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 70 0x46 'F' */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x78, /* 0 000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 71 0x47 'G' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x40, /* 0 000000 */ - 0x4c, /* 0 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 72 0x48 'H' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 73 0x49 'I' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 74 0x4a 'J' */ - 0x00, /* 00000000 */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 75 0x4b 'K' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x48, /* 0 00 000 */ - 0x50, /* 0 0 0000 */ - 0x60, /* 0 00000 */ - 0x50, /* 0 0 0000 */ - 0x48, /* 0 00 000 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 76 0x4c 'L' */ - 0x00, /* 00000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 77 0x4d 'M' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x6c, /* 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 78 0x4e 'N' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x64, /* 0 00 00 */ - 0x54, /* 0 0 0 00 */ - 0x4c, /* 0 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 79 0x4f 'O' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 80 0x50 'P' */ - 0x00, /* 00000000 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x78, /* 0 000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 81 0x51 'Q' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x54, /* 0 0 0 00 */ - 0x38, /* 00 000 */ - 0x04, /* 00000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 82 0x52 'R' */ - 0x00, /* 00000000 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 83 0x53 'S' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x40, /* 0 000000 */ - 0x38, /* 00 000 */ - 0x04, /* 00000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 84 0x54 'T' */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 85 0x55 'U' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 86 0x56 'V' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x28, /* 00 0 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 87 0x57 'W' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x6c, /* 0 0 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 88 0x58 'X' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x28, /* 00 0 000 */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 89 0x59 'Y' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x28, /* 00 0 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 90 0x5a 'Z' */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x40, /* 0 000000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 91 0x5b '[' */ - 0x0c, /* 0000 00 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x0c, /* 0000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 92 0x5c '\' */ - 0x20, /* 00 00000 */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x02, /* 000000 0 */ - 0x02, /* 000000 0 */ - 0x00, /* 00000000 */ - - /* 93 0x5d ']' */ - 0x30, /* 00 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x30, /* 00 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 94 0x5e '^' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 95 0x5f '_' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 0 0 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 96 0x60 '`' */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 97 0x61 'a' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 98 0x62 'b' */ - 0x00, /* 00000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x78, /* 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 99 0x63 'c' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x40, /* 0 000000 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 100 0x64 'd' */ - 0x00, /* 00000000 */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 101 0x65 'e' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x40, /* 0 000000 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 102 0x66 'f' */ - 0x00, /* 00000000 */ - 0x0c, /* 0000 00 */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 103 0x67 'g' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x3c, /* 00 00 */ - 0x04, /* 00000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - - /* 104 0x68 'h' */ - 0x00, /* 00000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 105 0x69 'i' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x30, /* 00 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 106 0x6a 'j' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x30, /* 00 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x60, /* 0 00000 */ - 0x00, /* 00000000 */ - - /* 107 0x6b 'k' */ - 0x00, /* 00000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x48, /* 0 00 000 */ - 0x50, /* 0 0 0000 */ - 0x70, /* 0 0000 */ - 0x48, /* 0 00 000 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 108 0x6c 'l' */ - 0x00, /* 00000000 */ - 0x30, /* 00 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 109 0x6d 'm' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x78, /* 0 000 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 110 0x6e 'n' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x58, /* 0 0 000 */ - 0x64, /* 0 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 111 0x6f 'o' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 112 0x70 'p' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x78, /* 0 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x78, /* 0 000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x00, /* 00000000 */ - - /* 113 0x71 'q' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x3c, /* 00 00 */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x00, /* 00000000 */ - - /* 114 0x72 'r' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x58, /* 0 0 000 */ - 0x64, /* 0 00 00 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 115 0x73 's' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x40, /* 0 000000 */ - 0x38, /* 00 000 */ - 0x04, /* 00000 00 */ - 0x78, /* 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 116 0x74 't' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x0c, /* 0000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 117 0x75 'u' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 118 0x76 'v' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x28, /* 00 0 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 119 0x77 'w' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 120 0x78 'x' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x28, /* 00 0 000 */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 121 0x79 'y' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x3c, /* 00 00 */ - 0x04, /* 00000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - - /* 122 0x7a 'z' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 123 0x7b '{' */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x04, /* 00000 00 */ - 0x00, /* 00000000 */ - - /* 124 0x7c '|' */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 125 0x7d '}' */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x00, /* 00000000 */ - - /* 126 0x7e '~' */ - 0x00, /* 00000000 */ - 0x34, /* 00 0 00 */ - 0x58, /* 0 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 127 0x7f '^?' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 128 0x80 '\200' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 129 0x81 '\201' */ - 0x28, /* 00 0 000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 130 0x82 '\202' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 131 0x83 '\203' */ - 0x10, /* 000 0000 */ - 0x7c, /* 0 00 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x78, /* 0 000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 132 0x84 '\204' */ - 0x58, /* 0 0 000 */ - 0x44, /* 0 000 00 */ - 0x64, /* 0 00 00 */ - 0x54, /* 0 0 0 00 */ - 0x4c, /* 0 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 133 0x85 '\205' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 134 0x86 '\206' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 135 0x87 '\207' */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 136 0x88 '\210' */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 137 0x89 '\211' */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 138 0x8a '\212' */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 139 0x8b '\213' */ - 0x34, /* 00 0 00 */ - 0x58, /* 0 0 000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 140 0x8c '\214' */ - 0x18, /* 000 000 */ - 0x24, /* 00 00 00 */ - 0x18, /* 000 000 */ - 0x3c, /* 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 141 0x8d '\215' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x3c, /* 00 00 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x00, /* 00000000 */ - - /* 142 0x8e '\216' */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x40, /* 0 000000 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 143 0x8f '\217' */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x40, /* 0 000000 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 144 0x90 '\220' */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x40, /* 0 000000 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 145 0x91 '\221' */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x40, /* 0 000000 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 146 0x92 '\222' */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 147 0x93 '\223' */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 148 0x94 '\224' */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 149 0x95 '\225' */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 150 0x96 '\226' */ - 0x34, /* 00 0 00 */ - 0x58, /* 0 0 000 */ - 0x00, /* 00000000 */ - 0x58, /* 0 0 000 */ - 0x64, /* 0 00 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 151 0x97 '\227' */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 152 0x98 '\230' */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 153 0x99 '\231' */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 154 0x9a '\232' */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 155 0x9b '\233' */ - 0x34, /* 00 0 00 */ - 0x58, /* 0 0 000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 156 0x9c '\234' */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 157 0x9d '\235' */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 158 0x9e '\236' */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 159 0x9f '\237' */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x34, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 160 0xa0 '\240' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 161 0xa1 '\241' */ - 0x18, /* 000 000 */ - 0x24, /* 00 00 00 */ - 0x24, /* 00 00 00 */ - 0x18, /* 000 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 162 0xa2 '\242' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x54, /* 0 0 0 00 */ - 0x50, /* 0 0 0000 */ - 0x54, /* 0 0 0 00 */ - 0x38, /* 00 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 163 0xa3 '\243' */ - 0x30, /* 00 0000 */ - 0x48, /* 0 00 000 */ - 0x40, /* 0 000000 */ - 0x70, /* 0 0000 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x44, /* 0 000 00 */ - 0x78, /* 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 164 0xa4 '\244' */ - 0x44, /* 0 000 00 */ - 0x24, /* 00 00 00 */ - 0x50, /* 0 0 0000 */ - 0x48, /* 0 00 000 */ - 0x24, /* 00 00 00 */ - 0x14, /* 000 0 00 */ - 0x48, /* 0 00 000 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 165 0xa5 '\245' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x7c, /* 0 00 */ - 0x7c, /* 0 00 */ - 0x7c, /* 0 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 166 0xa6 '\246' */ - 0x3c, /* 00 00 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x3c, /* 00 00 */ - 0x14, /* 000 0 00 */ - 0x14, /* 000 0 00 */ - 0x14, /* 000 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 167 0xa7 '\247' */ - 0x18, /* 000 000 */ - 0x24, /* 00 00 00 */ - 0x44, /* 0 000 00 */ - 0x48, /* 0 00 000 */ - 0x48, /* 0 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x58, /* 0 0 000 */ - 0x40, /* 0 000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 168 0xa8 '\250' */ - 0x00, /* 00000000 */ - 0x70, /* 0 0000 */ - 0x08, /* 0000 000 */ - 0x64, /* 0 00 00 */ - 0x54, /* 0 0 0 00 */ - 0x64, /* 0 00 00 */ - 0x58, /* 0 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 169 0xa9 '\251' */ - 0x00, /* 00000000 */ - 0x70, /* 0 0000 */ - 0x08, /* 0000 000 */ - 0x34, /* 00 0 00 */ - 0x44, /* 0 000 00 */ - 0x34, /* 00 0 00 */ - 0x08, /* 0000 000 */ - 0x70, /* 0 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 170 0xaa '\252' */ - 0x00, /* 00000000 */ - 0x7a, /* 0 0 0 */ - 0x2e, /* 00 0 0 */ - 0x2e, /* 00 0 0 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 171 0xab '\253' */ - 0x00, /* 00000000 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 172 0xac '\254' */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 173 0xad '\255' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x08, /* 0000 000 */ - 0x7c, /* 0 00 */ - 0x10, /* 000 0000 */ - 0x7c, /* 0 00 */ - 0x20, /* 00 00000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 174 0xae '\256' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x50, /* 0 0 0000 */ - 0x50, /* 0 0 0000 */ - 0x78, /* 0 000 */ - 0x50, /* 0 0 0000 */ - 0x50, /* 0 0 0000 */ - 0x5c, /* 0 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 175 0xaf '\257' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x4c, /* 0 00 00 */ - 0x54, /* 0 0 0 00 */ - 0x64, /* 0 00 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 176 0xb0 '\260' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x6c, /* 0 0 00 */ - 0x54, /* 0 0 0 00 */ - 0x6c, /* 0 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 177 0xb1 '\261' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x7c, /* 0 00 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 178 0xb2 '\262' */ - 0x00, /* 00000000 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 179 0xb3 '\263' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x04, /* 00000 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x1c, /* 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 180 0xb4 '\264' */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x28, /* 00 0 000 */ - 0x7c, /* 0 00 */ - 0x10, /* 000 0000 */ - 0x7c, /* 0 00 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 181 0xb5 '\265' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x48, /* 0 00 000 */ - 0x48, /* 0 00 000 */ - 0x48, /* 0 00 000 */ - 0x48, /* 0 00 000 */ - 0x74, /* 0 0 00 */ - 0x40, /* 0 000000 */ - 0x40, /* 0 000000 */ - 0x00, /* 00000000 */ - - /* 182 0xb6 '\266' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x0c, /* 0000 00 */ - 0x14, /* 000 0 00 */ - 0x24, /* 00 00 00 */ - 0x24, /* 00 00 00 */ - 0x18, /* 000 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 183 0xb7 '\267' */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x24, /* 00 00 00 */ - 0x10, /* 000 0000 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x24, /* 00 00 00 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 184 0xb8 '\270' */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 185 0xb9 '\271' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 186 0xba '\272' */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x60, /* 0 00000 */ - 0x00, /* 00000000 */ - - /* 187 0xbb '\273' */ - 0x00, /* 00000000 */ - 0x1c, /* 000 00 */ - 0x24, /* 00 00 00 */ - 0x24, /* 00 00 00 */ - 0x1c, /* 000 00 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 188 0xbc '\274' */ - 0x00, /* 00000000 */ - 0x18, /* 000 000 */ - 0x24, /* 00 00 00 */ - 0x24, /* 00 00 00 */ - 0x18, /* 000 000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 189 0xbd '\275' */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x28, /* 00 0 000 */ - 0x6c, /* 0 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 190 0xbe '\276' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x54, /* 0 0 0 00 */ - 0x5c, /* 0 0 00 */ - 0x50, /* 0 0 0000 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 191 0xbf '\277' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x4c, /* 0 00 00 */ - 0x54, /* 0 0 0 00 */ - 0x64, /* 0 00 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 192 0xc0 '\300' */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x20, /* 00 00000 */ - 0x40, /* 0 000000 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 193 0xc1 '\301' */ - 0x00, /* 00000000 */ - 0x08, /* 0000 000 */ - 0x00, /* 00000000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x08, /* 0000 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 194 0xc2 '\302' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x04, /* 00000 00 */ - 0x04, /* 00000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 195 0xc3 '\303' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x0c, /* 0000 00 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x50, /* 0 0 0000 */ - 0x20, /* 00 00000 */ - 0x20, /* 00 00000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 196 0xc4 '\304' */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x60, /* 0 00000 */ - 0x00, /* 00000000 */ - - /* 197 0xc5 '\305' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x04, /* 00000 00 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x40, /* 0 000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 198 0xc6 '\306' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 199 0xc7 '\307' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x24, /* 00 00 00 */ - 0x48, /* 0 00 000 */ - 0x48, /* 0 00 000 */ - 0x24, /* 00 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 200 0xc8 '\310' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x48, /* 0 00 000 */ - 0x24, /* 00 00 00 */ - 0x24, /* 00 00 00 */ - 0x48, /* 0 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 201 0xc9 '\311' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x54, /* 0 0 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 202 0xca '\312' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 203 0xcb '\313' */ - 0x10, /* 000 0000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 204 0xcc '\314' */ - 0x58, /* 0 0 000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x7c, /* 0 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 205 0xcd '\315' */ - 0x58, /* 0 0 000 */ - 0x38, /* 00 000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 206 0xce '\316' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x50, /* 0 0 0000 */ - 0x50, /* 0 0 0000 */ - 0x58, /* 0 0 000 */ - 0x50, /* 0 0 0000 */ - 0x50, /* 0 0 0000 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 207 0xcf '\317' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x54, /* 0 0 0 00 */ - 0x5c, /* 0 0 00 */ - 0x50, /* 0 0 0000 */ - 0x2c, /* 00 0 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 208 0xd0 '\320' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 209 0xd1 '\321' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 0 0 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 210 0xd2 '\322' */ - 0x00, /* 00000000 */ - 0x14, /* 000 0 00 */ - 0x28, /* 00 0 000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 211 0xd3 '\323' */ - 0x00, /* 00000000 */ - 0x14, /* 000 0 00 */ - 0x14, /* 000 0 00 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 212 0xd4 '\324' */ - 0x00, /* 00000000 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x18, /* 000 000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 213 0xd5 '\325' */ - 0x00, /* 00000000 */ - 0x18, /* 000 000 */ - 0x08, /* 0000 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 214 0xd6 '\326' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x7c, /* 0 00 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 215 0xd7 '\327' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x10, /* 000 0000 */ - 0x28, /* 00 0 000 */ - 0x44, /* 0 000 00 */ - 0x28, /* 00 0 000 */ - 0x10, /* 000 0000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 216 0xd8 '\330' */ - 0x00, /* 00000000 */ - 0x28, /* 00 0 000 */ - 0x00, /* 00000000 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x44, /* 0 000 00 */ - 0x3c, /* 00 00 */ - 0x04, /* 00000 00 */ - 0x38, /* 00 000 */ - 0x00, /* 00000000 */ - - /* 217 0xd9 '\331' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 0 0 */ - 0x00, /* 00000000 */ - 0x7e, /* 0 0 */ - 0x00, /* 00000000 */ - 0x7e, /* 0 0 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 218 0xda '\332' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 219 0xdb '\333' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 220 0xdc '\334' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 221 0xdd '\335' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 222 0xde '\336' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 223 0xdf '\337' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 224 0xe0 '\340' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 225 0xe1 '\341' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 226 0xe2 '\342' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 227 0xe3 '\343' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 228 0xe4 '\344' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 229 0xe5 '\345' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 230 0xe6 '\346' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 231 0xe7 '\347' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 232 0xe8 '\350' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 233 0xe9 '\351' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 234 0xea '\352' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 235 0xeb '\353' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 236 0xec '\354' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 237 0xed '\355' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 238 0xee '\356' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 239 0xef '\357' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 240 0xf0 '\360' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 241 0xf1 '\361' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 242 0xf2 '\362' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 243 0xf3 '\363' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 244 0xf4 '\364' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 245 0xf5 '\365' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 246 0xf6 '\366' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 247 0xf7 '\367' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 248 0xf8 '\370' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 249 0xf9 '\371' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 250 0xfa '\372' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 251 0xfb '\373' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 252 0xfc '\374' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 253 0xfd '\375' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 254 0xfe '\376' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 255 0xff '\377' */ - 0x00, /* 00000000 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x3c, /* 00 00 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - +#ifndef ZM_FONT_H +#define ZM_FONT_H + +#include +#include + +struct ZMFONT_BH{ + uint16_t charHeight; // Height of every character + uint16_t charWidth; // Width of every character + uint32_t numberofCodePoints; // number of codepoints max 255 for now + uint32_t idx; // idx in data where data for the bitmap starts + uint32_t pad; // padding to round of the size }; + +struct ZMFONT { + char MAGIC[6]; //ZMFNT\0 + char pad[2]; + ZMFONT_BH header[4]; + uint64_t *data; +}; + +class ZmFont { + public: + int ReadFontFile( const std::string &loc ); + ZMFONT *GetFont(){ return font; } + uint64_t *GetBitmapDataForSize( const unsigned int size, uint16_t &charWidth, uint16_t &charHeight ); + + private: + size_t datasize = 0; + ZMFONT *font = nullptr; +}; + +#endif \ No newline at end of file diff --git a/src/zm_image.cpp b/src/zm_image.cpp index b2707dd52..9c5eaa16d 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -78,6 +78,9 @@ static deinterlace_4field_fptr_t fptr_deinterlace_4field_gray8; /* Pointer to image buffer memory copy function */ imgbufcpy_fptr_t fptr_imgbufcpy; +/* Font */ +static ZmFont font; + void Image::update_function_pointers() { /* Because many loops are unrolled and work on 16 colours/time or 4 pixels/time, we have to meet requirements */ if ( pixels % 16 || pixels % 12 ) { @@ -485,6 +488,11 @@ void Image::Initialise() { g_u_table = g_u_table_global; b_u_table = b_u_table_global; + Warning("Going to read font file"); + if ( font.ReadFontFile("/ZoneMinder/fonts/default.zmfnt") < 0) + Panic("Invalid font location."); + Warning("Font file read"); + initialised = true; } @@ -1869,8 +1877,11 @@ const Coord Image::centreCoord( const char *text, int size=1 ) const { line = text+index; line_no++; } - int x = (width - (max_line_len * ZM_CHAR_WIDTH * size) ) / 2; - int y = (height - (line_no * LINE_HEIGHT * size) ) / 2; + + uint16_t char_width, char_height; + font.GetBitmapDataForSize(size, char_width, char_height); + int x = (width - (max_line_len * char_width )) / 2; + int y = (height - (line_no * char_height) ) / 2; return Coord(x, y); } @@ -1916,7 +1927,10 @@ void Image::MaskPrivacy( const unsigned char *p_bitmask, const Rgb pixel_colour } /* RGB32 compatible: complete */ -void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int size, const Rgb fg_colour, const Rgb bg_colour ) +/* Bitmap decoding trick has been adopted from here: +https://lemire.me/blog/2018/02/21/iterating-over-set-bits-quickly/ +*/ +__attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int size, const Rgb fg_colour, const Rgb bg_colour ) { strncpy(text, p_text, sizeof(text)-1); @@ -1931,7 +1945,6 @@ void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int const uint8_t fg_b_col = BLUE_VAL_RGBA(fg_colour); const uint8_t fg_bw_col = fg_colour & 0xff; const Rgb fg_rgb_col = rgb_convert(fg_colour,subpixelorder); - const bool fg_trans = (fg_colour == RGB_TRANSPARENT); const uint8_t bg_r_col = RED_VAL_RGBA(bg_colour); const uint8_t bg_g_col = GREEN_VAL_RGBA(bg_colour); @@ -1939,22 +1952,20 @@ void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int const uint8_t bg_bw_col = bg_colour & 0xff; const Rgb bg_rgb_col = rgb_convert(bg_colour,subpixelorder); const bool bg_trans = (bg_colour == RGB_TRANSPARENT); - - int zm_text_bitmask = 0x80; - if ( size == 2 ) - zm_text_bitmask = 0x8000; + uint16_t char_width = 0, char_height = 0; + uint64_t *fontbitmap = font.GetBitmapDataForSize(size, char_width, char_height); while ( (index < text_len) && (line_len = strcspn(line, "\n")) ) { - unsigned int line_width = line_len * ZM_CHAR_WIDTH * size; + unsigned int line_width = line_len * char_width; unsigned int lo_line_x = coord.X(); - unsigned int lo_line_y = coord.Y() + (line_no * LINE_HEIGHT * size); + unsigned int lo_line_y = coord.Y() + (line_no * char_height); unsigned int min_line_x = 0; unsigned int max_line_x = width - line_width; unsigned int min_line_y = 0; - unsigned int max_line_y = height - (LINE_HEIGHT * size); + unsigned int max_line_y = height - char_height; if ( lo_line_x > max_line_x ) lo_line_x = max_line_x; @@ -1966,7 +1977,7 @@ void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int lo_line_y = min_line_y; unsigned int hi_line_x = lo_line_x + line_width; - unsigned int hi_line_y = lo_line_y + (LINE_HEIGHT * size); + unsigned int hi_line_y = lo_line_y + char_height; // Clip anything that runs off the right of the screen if ( hi_line_x > width ) @@ -1976,100 +1987,71 @@ void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int if ( colours == ZM_COLOUR_GRAY8 ) { unsigned char *ptr = &buffer[(lo_line_y*width)+lo_line_x]; - for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < (ZM_CHAR_HEIGHT * size); y++, r++, ptr += width ) { + for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < char_height; y++, r++, ptr += width ) { unsigned char *temp_ptr = ptr; for ( unsigned int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) { - int f; - if ( size == 2 ) { - if ( (line[c] * ZM_CHAR_HEIGHT * size) + r > sizeof(bigfontdata) ) { + if ( line[c] > 0xFF ) { Warning("Unsupported character %c in %s", line[c], line); continue; } - f = bigfontdata[(line[c] * ZM_CHAR_HEIGHT * size) + r]; - } else { - if ( (line[c] * ZM_CHAR_HEIGHT) + r > sizeof(fontdata) ) { - Warning("Unsupported character %c in %s", line[c], line); - continue; - } - f = fontdata[(line[c] * ZM_CHAR_HEIGHT) + r]; - } - for ( unsigned int i = 0; i < (ZM_CHAR_WIDTH * size) && x < hi_line_x; i++, x++, temp_ptr++ ) { - if ( f & (zm_text_bitmask >> i) ) { - if ( !fg_trans ) - *temp_ptr = fg_bw_col; - } else if ( !bg_trans ) { - *temp_ptr = bg_bw_col; - } + uint64_t f = fontbitmap[(line[c] * char_height) + r]; + if( !bg_trans ) memset(temp_ptr, bg_bw_col, char_width); + while(f != 0) + { + unsigned long long t = f & -f; + int idx = char_width - __builtin_ctzll(f>>2); + *(temp_ptr + idx) = fg_bw_col; + f ^= t; } + temp_ptr += char_width; } } } else if ( colours == ZM_COLOUR_RGB24 ) { unsigned int wc = width * colours; - unsigned char *ptr = &buffer[((lo_line_y*width)+lo_line_x)*colours]; - for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < (ZM_CHAR_HEIGHT * size); y++, r++, ptr += wc ) { + for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < char_height; y++, r++, ptr += wc ) { unsigned char *temp_ptr = ptr; for ( unsigned int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) { - int f; - if ( size == 2 ) { - if ( (line[c] * ZM_CHAR_HEIGHT * size) + r > sizeof(bigfontdata) ) { + if ( line[c] > 0xFF ) { Warning("Unsupported character %c in %s", line[c], line); continue; } - f = bigfontdata[(line[c] * ZM_CHAR_HEIGHT * size) + r]; - } else { - if ( (line[c] * ZM_CHAR_HEIGHT) + r > sizeof(fontdata) ) { - Warning("Unsupported character %c in %s", line[c], line); - continue; + uint64_t f = fontbitmap[(line[c] * char_height) + r]; + if( !bg_trans ) memset(temp_ptr, 0x0, char_width * colours); + while( f != 0 ) + { + uint64_t t = f & -f; + int idx = char_width - __builtin_ctzll(f >> 2); + RED_PTR_RGBA((temp_ptr + (idx*3))) = fg_r_col; + GREEN_PTR_RGBA((temp_ptr + (idx*3))) = fg_g_col; + BLUE_PTR_RGBA((temp_ptr + (idx*3))) = fg_b_col; + f ^= t; } - f = fontdata[(line[c] * ZM_CHAR_HEIGHT) + r]; - } - for ( unsigned int i = 0; i < (ZM_CHAR_WIDTH * size) && x < hi_line_x; i++, x++, temp_ptr += colours ) { - if ( f & (zm_text_bitmask >> i) ) { - if ( !fg_trans ) { - RED_PTR_RGBA(temp_ptr) = fg_r_col; - GREEN_PTR_RGBA(temp_ptr) = fg_g_col; - BLUE_PTR_RGBA(temp_ptr) = fg_b_col; - } - } else if ( !bg_trans ) { - RED_PTR_RGBA(temp_ptr) = bg_r_col; - GREEN_PTR_RGBA(temp_ptr) = bg_g_col; - BLUE_PTR_RGBA(temp_ptr) = bg_b_col; - } - } + temp_ptr += char_width * colours; } } } else if ( colours == ZM_COLOUR_RGB32 ) { unsigned int wc = width * colours; - uint8_t *ptr = &buffer[((lo_line_y*width)+lo_line_x)<<2]; - for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < (ZM_CHAR_HEIGHT * size); y++, r++, ptr += wc ) { + uint8_t *ptr = &buffer[((lo_line_y*width)+lo_line_x) << 2]; + for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < char_height; y++, r++, ptr += wc ) { Rgb* temp_ptr = (Rgb*)ptr; for ( unsigned int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) { - int f; - if ( size == 2 ) { - if ( (line[c] * ZM_CHAR_HEIGHT * size) + r > sizeof(bigfontdata) ) { + if ( line[c] > 0xFF ) { Warning("Unsupported character %c in %s", line[c], line); continue; } - f = bigfontdata[(line[c] * ZM_CHAR_HEIGHT * size) + r]; - } else { - if ( (line[c] * ZM_CHAR_HEIGHT) + r > sizeof(fontdata) ) { - Warning("Unsupported character %c in %s", line[c], line); - continue; + uint64_t f = fontbitmap[(line[c] * char_height) + r]; + if( !bg_trans ) memset((uint8_t *)temp_ptr, bg_rgb_col, char_width * colours); + while( f != 0 ) + { + uint64_t t = f & -f; + int idx = char_width - __builtin_ctzll(f >> 2); + *(temp_ptr + idx) = fg_rgb_col; + f ^= t; } - f = fontdata[(line[c] * ZM_CHAR_HEIGHT) + r]; + temp_ptr += char_width; } - for ( unsigned int i = 0; i < (ZM_CHAR_WIDTH * size) && x < hi_line_x; i++, x++, temp_ptr++ ) { - if ( f & (zm_text_bitmask >> i) ) { - if ( !fg_trans ) { - *temp_ptr = fg_rgb_col; - } - } else if ( !bg_trans ) { - *temp_ptr = bg_rgb_col; - } - } - } } } else { diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index 9b005627a..c84650ddd 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -369,8 +369,10 @@ $fastblendopts_alarm = array( ); $label_size = array( - 1 => translate('Default'), - 2 => translate('Large'), + 1 => translate('Small'), + 2 => translate('Default'), + 3 => translate('Large'), + 4 => translate('Extra Large'), ); $codecs = array( From 0a7b7b9661e837ef569b5d2c3fd51872aa0cf568 Mon Sep 17 00:00:00 2001 From: hax0kartik Date: Sat, 28 Nov 2020 19:44:45 +0530 Subject: [PATCH 002/116] Bound check values --- src/zm_font.cpp | 33 +++++++++++++++++++++++++++++---- src/zm_font.h | 1 + src/zm_image.cpp | 12 ++++++++---- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/zm_font.cpp b/src/zm_font.cpp index e1fbde49c..4f06dd53a 100644 --- a/src/zm_font.cpp +++ b/src/zm_font.cpp @@ -1,4 +1,7 @@ #include +#include +#include + #include "zm.h" #include "zm_font.h" #include "zm_utils.h" @@ -7,12 +10,28 @@ int ZmFont::ReadFontFile( const std::string &loc ) { FILE *f = fopen(loc.c_str(), "rb"); if( !f ) return -1; // FILE NOT FOUND + + struct stat st; + stat(loc.c_str(), &st); font = (ZMFONT*)malloc(sizeof(ZMFONT)); - if(!font) - return -1; - fread(&font[0], 1, 8 + (sizeof(ZMFONT_BH) * 4), f); - // Todo Check magic + if( !font ) + return -2; + fread(&font[0], 1, 8 + (sizeof(ZMFONT_BH) * 4), f); // MAGIC + pad + BitmapHeaders + + if(memcmp(font->MAGIC, "ZMFNT", 5) != 0) // Check whether magic is correct + return -3; + + for(int i = 0; i < 4; i++) + { + /* Character Width cannot be greater than 64, + height cannot be greater than 200(arbitary number which i have chosen shouldn't need more than this) and + idx should not be more than filesize + */ + if((font->header[i].charWidth > 64 && font->header[i].charWidth == 0) || (font->header[i].charHeight > 200 && font->header[i].charHeight == 0) || (font->header[i].idx > st.st_size)) + return -4; + } + datasize = (font->header[3].idx * sizeof(uint64_t))+ (font->header[3].charHeight * font->header[3].numberofCodePoints * sizeof(uint64_t)); font->data = (uint64_t*)malloc(datasize); fread(&font->data[0], 1, datasize, f); @@ -20,6 +39,12 @@ int ZmFont::ReadFontFile( const std::string &loc ) { return 0; } +void ZmFont::FreeData() +{ + if(font->data) free(font->data); + if(font) free(font); +} + uint64_t *ZmFont::GetBitmapDataForSize( const unsigned int size, uint16_t &charWidth, uint16_t &charHeight ) { charWidth = font->header[size - 1].charWidth; charHeight = font->header[size - 1].charHeight; diff --git a/src/zm_font.h b/src/zm_font.h index 6cf9c1692..ec85879ad 100644 --- a/src/zm_font.h +++ b/src/zm_font.h @@ -24,6 +24,7 @@ class ZmFont { int ReadFontFile( const std::string &loc ); ZMFONT *GetFont(){ return font; } uint64_t *GetBitmapDataForSize( const unsigned int size, uint16_t &charWidth, uint16_t &charHeight ); + void FreeData(); private: size_t datasize = 0; diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 9c5eaa16d..499b9b48a 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -295,6 +295,8 @@ void Image::Deinitialise() { sws_freeContext(sws_convert_context); sws_convert_context = nullptr; } + + font.FreeData(); } // end void Image::Deinitialise() void Image::Initialise() { @@ -488,11 +490,13 @@ void Image::Initialise() { g_u_table = g_u_table_global; b_u_table = b_u_table_global; - Warning("Going to read font file"); - if ( font.ReadFontFile("/ZoneMinder/fonts/default.zmfnt") < 0) + int res = font.ReadFontFile("/ZoneMinder/fonts/default.zmfnt"); + if( res == -1 ) { Panic("Invalid font location."); - Warning("Font file read"); - + } + else if( res == -3 || res == -4 ) { + Panic("Invalid font file."); + } initialised = true; } From b212b0e4507882af3b3565bae138f5c8e50d25c8 Mon Sep 17 00:00:00 2001 From: hax0kartik Date: Sat, 28 Nov 2020 20:18:17 +0530 Subject: [PATCH 003/116] Allow modifying font file location --- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in | 8 ++++++++ src/zm_image.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 98ed7fa69..4e9ae384d 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -3767,6 +3767,14 @@ our @options = ( type => $types{boolean}, category => 'logging', }, + { + name => 'ZM_FONT_FILE_LOCATION', + default => '/zoneminder/fonts/default.zmfnt', + description => 'Font file location', + help => 'This font is used for timestamp labels.', + type => $types{string}, + category => 'config', + }, ); our %options_hash = map { ( $_->{name}, $_ ) } @options; diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 499b9b48a..d86114c7d 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -490,7 +490,7 @@ void Image::Initialise() { g_u_table = g_u_table_global; b_u_table = b_u_table_global; - int res = font.ReadFontFile("/ZoneMinder/fonts/default.zmfnt"); + int res = font.ReadFontFile(config.font_file_location); if( res == -1 ) { Panic("Invalid font location."); } From bbeb599fced68df0932cf7c8219e4bbeba21c173 Mon Sep 17 00:00:00 2001 From: hax0kartik Date: Sat, 28 Nov 2020 20:28:34 +0530 Subject: [PATCH 004/116] Remove bigfont --- src/zm_bigfont.h | 6155 ---------------------------------------------- src/zm_image.cpp | 1 - 2 files changed, 6156 deletions(-) delete mode 100644 src/zm_bigfont.h diff --git a/src/zm_bigfont.h b/src/zm_bigfont.h deleted file mode 100644 index 96ba479dd..000000000 --- a/src/zm_bigfont.h +++ /dev/null @@ -1,6155 +0,0 @@ -/***********************************************************/ -/* */ -/* Font file generated by schrorg */ -/* based on the font file generated by rthelen */ -/* using utils/mk_bigfont.pl */ -/* */ -/***********************************************************/ - -static unsigned int bigfontdata[] = { - - /* 0 0x00 '^A' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 1 0x01 '^B' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 2 0x02 '^C' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 3 0x03 '^D' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 4 0x04 '^E' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 5 0x05 '^F' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 6 0x06 '^G' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 7 0x07 '^H' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 8 0x08 '^I' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 9 0x09 '^J' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 10 0x0a '^K' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 11 0x0b '^L' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 12 0x0c '^M' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 13 0x0d '^N' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 14 0x0e '^O' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 15 0x0f '^P' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 16 0x10 '^Q' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 17 0x11 '^R' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 18 0x12 '^S' */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 19 0x13 '^T' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 20 0x14 '^U' */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 21 0x15 '^V' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 22 0x16 '^W' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 23 0x17 '^X' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 24 0x18 '^Y' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 25 0x19 '^Z' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 26 0x1a '^[' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 27 0x1b '^\' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 28 0x1c '^]' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 29 0x1d '^^' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 30 0x1e '^_' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 31 0x1f '^`' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 32 0x20 ' ' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 33 0x21 '!' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 34 0x22 '"' */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 35 0x23 '#' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 36 0x24 '$' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 37 0x25 '%' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 38 0x26 '&' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 39 0x27 ''' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 40 0x28 '(' */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 41 0x29 ')' */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 42 0x2a '*' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 43 0x2b '+' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 44 0x2c ',' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 45 0x2d '-' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 46 0x2e '.' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 47 0x2f '/' */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 48 0x30 '0' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 49 0x31 '1' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x3f0, /* 000000 0000 */ - 0x3f0, /* 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 50 0x32 '2' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 51 0x33 '3' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 52 0x34 '4' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x3f0, /* 000000 0000 */ - 0x3f0, /* 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 53 0x35 '5' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 54 0x36 '6' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 55 0x37 '7' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 56 0x38 '8' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 57 0x39 '9' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 58 0x3a ':' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 59 0x3b ';' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 60 0x3c '<' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 61 0x3d '=' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 62 0x3e '>' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 63 0x3f '?' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 64 0x40 '@' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3f30, /* 00 00 0000 */ - 0x3f30, /* 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 65 0x41 'A' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 66 0x42 'B' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 67 0x43 'C' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 68 0x44 'D' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 69 0x45 'E' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 70 0x46 'F' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 71 0x47 'G' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 72 0x48 'H' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 73 0x49 'I' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 74 0x4a 'J' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 75 0x4b 'K' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3c00, /* 00 0000000000 */ - 0x3c00, /* 00 0000000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 76 0x4c 'L' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 77 0x4d 'M' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3cf0, /* 00 00 0000 */ - 0x3cf0, /* 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 78 0x4e 'N' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 79 0x4f 'O' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 80 0x50 'P' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 81 0x51 'Q' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 82 0x52 'R' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 83 0x53 'S' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 84 0x54 'T' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 85 0x55 'U' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 86 0x56 'V' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 87 0x57 'W' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3cf0, /* 00 00 0000 */ - 0x3cf0, /* 00 00 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 88 0x58 'X' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 89 0x59 'Y' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 90 0x5a 'Z' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 91 0x5b '[' */ - 0xf0, /* 00000000 0000 */ - 0xf0, /* 00000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xf0, /* 00000000 0000 */ - 0xf0, /* 00000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 92 0x5c '\' */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc, /* 000000000000 00 */ - 0xc, /* 000000000000 00 */ - 0xc, /* 000000000000 00 */ - 0xc, /* 000000000000 00 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 93 0x5d ']' */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 94 0x5e '^' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 95 0x5f '_' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ffc, /* 00 00 */ - 0x3ffc, /* 00 00 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 96 0x60 '`' */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 97 0x61 'a' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 98 0x62 'b' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 99 0x63 'c' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 100 0x64 'd' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 101 0x65 'e' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 102 0x66 'f' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf0, /* 00000000 0000 */ - 0xf0, /* 00000000 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 103 0x67 'g' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 104 0x68 'h' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 105 0x69 'i' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 106 0x6a 'j' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3c00, /* 00 0000000000 */ - 0x3c00, /* 00 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 107 0x6b 'k' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3f00, /* 00 00000000 */ - 0x3f00, /* 00 00000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 108 0x6c 'l' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 109 0x6d 'm' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 110 0x6e 'n' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 111 0x6f 'o' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 112 0x70 'p' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 113 0x71 'q' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 114 0x72 'r' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 115 0x73 's' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 116 0x74 't' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xf0, /* 00000000 0000 */ - 0xf0, /* 00000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 117 0x75 'u' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 118 0x76 'v' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 119 0x77 'w' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 120 0x78 'x' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 121 0x79 'y' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 122 0x7a 'z' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 123 0x7b '{' */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 124 0x7c '|' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 125 0x7d '}' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 126 0x7e '~' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 127 0x7f '^?' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 128 0x80 '\200' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 129 0x81 '\201' */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 130 0x82 '\202' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 131 0x83 '\203' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 132 0x84 '\204' */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 133 0x85 '\205' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 134 0x86 '\206' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 135 0x87 '\207' */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 136 0x88 '\210' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 137 0x89 '\211' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 138 0x8a '\212' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 139 0x8b '\213' */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 140 0x8c '\214' */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 141 0x8d '\215' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 142 0x8e '\216' */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 143 0x8f '\217' */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 144 0x90 '\220' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 145 0x91 '\221' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 146 0x92 '\222' */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 147 0x93 '\223' */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 148 0x94 '\224' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 149 0x95 '\225' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 150 0x96 '\226' */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 151 0x97 '\227' */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 152 0x98 '\230' */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 153 0x99 '\231' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 154 0x9a '\232' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 155 0x9b '\233' */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 156 0x9c '\234' */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 157 0x9d '\235' */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 158 0x9e '\236' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 159 0x9f '\237' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 160 0xa0 '\240' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 161 0xa1 '\241' */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 162 0xa2 '\242' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 163 0xa3 '\243' */ - 0xf00, /* 0000 00000000 */ - 0xf00, /* 0000 00000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3f00, /* 00 00000000 */ - 0x3f00, /* 00 00000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 164 0xa4 '\244' */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 165 0xa5 '\245' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 166 0xa6 '\246' */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 167 0xa7 '\247' */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 168 0xa8 '\250' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3f00, /* 00 00000000 */ - 0x3f00, /* 00 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 169 0xa9 '\251' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3f00, /* 00 00000000 */ - 0x3f00, /* 00 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xf30, /* 0000 00 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x3f00, /* 00 00000000 */ - 0x3f00, /* 00 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 170 0xaa '\252' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3fcc, /* 00 00 00 */ - 0x3fcc, /* 00 00 00 */ - 0xcfc, /* 0000 00 00 */ - 0xcfc, /* 0000 00 00 */ - 0xcfc, /* 0000 00 00 */ - 0xcfc, /* 0000 00 00 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 171 0xab '\253' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 172 0xac '\254' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 173 0xad '\255' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 174 0xae '\256' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3fc0, /* 00 000000 */ - 0x3fc0, /* 00 000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x33f0, /* 00 00 0000 */ - 0x33f0, /* 00 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 175 0xaf '\257' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 176 0xb0 '\260' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3cf0, /* 00 00 0000 */ - 0x3cf0, /* 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3cf0, /* 00 00 0000 */ - 0x3cf0, /* 00 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 177 0xb1 '\261' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 178 0xb2 '\262' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 179 0xb3 '\263' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3f0, /* 000000 0000 */ - 0x3f0, /* 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 180 0xb4 '\264' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 181 0xb5 '\265' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x3f30, /* 00 00 0000 */ - 0x3f30, /* 00 00 0000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 182 0xb6 '\266' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xf0, /* 00000000 0000 */ - 0xf0, /* 00000000 0000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 183 0xb7 '\267' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 184 0xb8 '\270' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 185 0xb9 '\271' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 186 0xba '\272' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3c00, /* 00 0000000000 */ - 0x3c00, /* 00 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 187 0xbb '\273' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3f0, /* 000000 0000 */ - 0x3f0, /* 000000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x3f0, /* 000000 0000 */ - 0x3f0, /* 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 188 0xbc '\274' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 189 0xbd '\275' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3cf0, /* 00 00 0000 */ - 0x3cf0, /* 00 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 190 0xbe '\276' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x33f0, /* 00 00 0000 */ - 0x33f0, /* 00 00 0000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 191 0xbf '\277' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x30f0, /* 00 0000 0000 */ - 0x30f0, /* 00 0000 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0x3c30, /* 00 0000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 192 0xc0 '\300' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 193 0xc1 '\301' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 194 0xc2 '\302' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 195 0xc3 '\303' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xf0, /* 00000000 0000 */ - 0xf0, /* 00000000 0000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0xc00, /* 0000 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 196 0xc4 '\304' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3c00, /* 00 0000000000 */ - 0x3c00, /* 00 0000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 197 0xc5 '\305' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3000, /* 00 000000000000 */ - 0x3000, /* 00 000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 198 0xc6 '\306' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 199 0xc7 '\307' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 200 0xc8 '\310' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0xc30, /* 0000 0000 0000 */ - 0x30c0, /* 00 0000 000000 */ - 0x30c0, /* 00 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 201 0xc9 '\311' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 202 0xca '\312' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 203 0xcb '\313' */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 204 0xcc '\314' */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 205 0xcd '\315' */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 206 0xce '\316' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x33c0, /* 00 00 000000 */ - 0x33c0, /* 00 00 000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 207 0xcf '\317' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3330, /* 00 00 00 0000 */ - 0x3330, /* 00 00 00 0000 */ - 0x33f0, /* 00 00 0000 */ - 0x33f0, /* 00 00 0000 */ - 0x3300, /* 00 00 00000000 */ - 0x3300, /* 00 00 00000000 */ - 0xcf0, /* 0000 00 0000 */ - 0xcf0, /* 0000 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 208 0xd0 '\320' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 209 0xd1 '\321' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ffc, /* 00 00 */ - 0x3ffc, /* 00 00 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 210 0xd2 '\322' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 211 0xd3 '\323' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0x330, /* 000000 00 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 212 0xd4 '\324' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 213 0xd5 '\325' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3c0, /* 000000 000000 */ - 0x3c0, /* 000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0xc0, /* 00000000 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 214 0xd6 '\326' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ff0, /* 00 0000 */ - 0x3ff0, /* 00 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 215 0xd7 '\327' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x300, /* 000000 00000000 */ - 0x300, /* 000000 00000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 216 0xd8 '\330' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xcc0, /* 0000 00 000000 */ - 0xcc0, /* 0000 00 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0x3030, /* 00 000000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x30, /* 0000000000 0000 */ - 0x30, /* 0000000000 0000 */ - 0xfc0, /* 0000 000000 */ - 0xfc0, /* 0000 000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 217 0xd9 '\331' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ffc, /* 00 00 */ - 0x3ffc, /* 00 00 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ffc, /* 00 00 */ - 0x3ffc, /* 00 00 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x3ffc, /* 00 00 */ - 0x3ffc, /* 00 00 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 218 0xda '\332' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 219 0xdb '\333' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 220 0xdc '\334' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 221 0xdd '\335' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 222 0xde '\336' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 223 0xdf '\337' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 224 0xe0 '\340' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 225 0xe1 '\341' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 226 0xe2 '\342' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 227 0xe3 '\343' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 228 0xe4 '\344' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 229 0xe5 '\345' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 230 0xe6 '\346' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 231 0xe7 '\347' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 232 0xe8 '\350' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 233 0xe9 '\351' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 234 0xea '\352' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 235 0xeb '\353' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 236 0xec '\354' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 237 0xed '\355' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 238 0xee '\356' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 239 0xef '\357' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 240 0xf0 '\360' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 241 0xf1 '\361' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 242 0xf2 '\362' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 243 0xf3 '\363' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 244 0xf4 '\364' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 245 0xf5 '\365' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 246 0xf6 '\366' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 247 0xf7 '\367' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 248 0xf8 '\370' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 249 0xf9 '\371' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 250 0xfa '\372' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 251 0xfb '\373' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 252 0xfc '\374' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 253 0xfd '\375' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 254 0xfe '\376' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - - /* 255 0xff '\377' */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0xff0, /* 0000 0000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - 0x0, /* 0000000000000000 */ - -}; diff --git a/src/zm_image.cpp b/src/zm_image.cpp index d86114c7d..6c48df94e 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -18,7 +18,6 @@ // #include "zm.h" #include "zm_font.h" -#include "zm_bigfont.h" #include "zm_image.h" #include "zm_utils.h" #include "zm_rgb.h" From 890a52605f9f87baaed4f12832fa9a693c0631a7 Mon Sep 17 00:00:00 2001 From: hax0kartik Date: Sun, 29 Nov 2020 10:25:06 +0530 Subject: [PATCH 005/116] Satisfy cpplint --- src/zm_font.cpp | 63 +++++++++++++++++++++++++++--------------------- src/zm_font.h | 34 ++++++++++++++------------ src/zm_image.cpp | 43 ++++++++++++++++----------------- 3 files changed, 76 insertions(+), 64 deletions(-) diff --git a/src/zm_font.cpp b/src/zm_font.cpp index 4f06dd53a..e8338dcdb 100644 --- a/src/zm_font.cpp +++ b/src/zm_font.cpp @@ -6,47 +6,56 @@ #include "zm_font.h" #include "zm_utils.h" -int ZmFont::ReadFontFile( const std::string &loc ) { - +int ZmFont::ReadFontFile(const std::string &loc) { FILE *f = fopen(loc.c_str(), "rb"); - if( !f ) return -1; // FILE NOT FOUND + if ( !f ) return -1; // FILE NOT FOUND struct stat st; stat(loc.c_str(), &st); - - font = (ZMFONT*)malloc(sizeof(ZMFONT)); - if( !font ) - return -2; - fread(&font[0], 1, 8 + (sizeof(ZMFONT_BH) * 4), f); // MAGIC + pad + BitmapHeaders - if(memcmp(font->MAGIC, "ZMFNT", 5) != 0) // Check whether magic is correct + font = new ZMFONT; + if ( !font ) + return -2; + + // MAGIC + pad + BitmapHeaders + fread(&font[0], 1, 8 + (sizeof(ZMFONT_BH) * 4), f); + + if ( memcmp(font->MAGIC, "ZMFNT", 5) != 0 ) // Check whether magic is correct return -3; - - for(int i = 0; i < 4; i++) - { - /* Character Width cannot be greater than 64, - height cannot be greater than 200(arbitary number which i have chosen shouldn't need more than this) and + + for ( int i = 0; i < 4; i++ ) { + /* Character Width cannot be greater than 64 as a row is represented as a uint64_t, + height cannot be greater than 200(arbitary number which i have chosen, shouldn't need more than this) and idx should not be more than filesize */ - if((font->header[i].charWidth > 64 && font->header[i].charWidth == 0) || (font->header[i].charHeight > 200 && font->header[i].charHeight == 0) || (font->header[i].idx > st.st_size)) - return -4; + if ( (font->header[i].charWidth > 64 && font->header[i].charWidth == 0) || \ + (font->header[i].charHeight > 200 && font->header[i].charHeight == 0) || \ + (font->header[i].idx > st.st_size) ) { + FreeData(); + return -4; + } } - datasize = (font->header[3].idx * sizeof(uint64_t))+ (font->header[3].charHeight * font->header[3].numberofCodePoints * sizeof(uint64_t)); - font->data = (uint64_t*)malloc(datasize); + datasize = st.st_size - (8 + sizeof(ZMFONT_BH) * 4); + + font->data = new uint64_t[datasize/sizeof(uint64_t)]; fread(&font->data[0], 1, datasize, f); fclose(f); return 0; } -void ZmFont::FreeData() -{ - if(font->data) free(font->data); - if(font) free(font); +void ZmFont::FreeData() { + if ( font->data ) { + delete[] font->data; + font->data = nullptr; + } + + if ( font ) { + delete font; + font = nullptr; + } } -uint64_t *ZmFont::GetBitmapDataForSize( const unsigned int size, uint16_t &charWidth, uint16_t &charHeight ) { - charWidth = font->header[size - 1].charWidth; - charHeight = font->header[size - 1].charHeight; - return &font->data[font->header[size - 1].idx]; -} \ No newline at end of file +uint64_t *ZmFont::GetBitmapData() { + return &font->data[font->header[size].idx]; +} diff --git a/src/zm_font.h b/src/zm_font.h index ec85879ad..03a452acc 100644 --- a/src/zm_font.h +++ b/src/zm_font.h @@ -5,30 +5,34 @@ #include struct ZMFONT_BH{ - uint16_t charHeight; // Height of every character - uint16_t charWidth; // Width of every character - uint32_t numberofCodePoints; // number of codepoints max 255 for now - uint32_t idx; // idx in data where data for the bitmap starts - uint32_t pad; // padding to round of the size + uint16_t charHeight; // Height of every character + uint16_t charWidth; // Width of every character + uint32_t numberofCodePoints; // number of codepoints max 255 for now + uint32_t idx; // idx in data where data for the bitmap starts + uint32_t pad; // padding to round of the size }; struct ZMFONT { - char MAGIC[6]; //ZMFNT\0 + char MAGIC[6]; // ZMFNT\0 char pad[2]; ZMFONT_BH header[4]; uint64_t *data; }; class ZmFont { - public: - int ReadFontFile( const std::string &loc ); - ZMFONT *GetFont(){ return font; } - uint64_t *GetBitmapDataForSize( const unsigned int size, uint16_t &charWidth, uint16_t &charHeight ); - void FreeData(); + public: + int ReadFontFile(const std::string &loc); + ZMFONT *GetFont() { return font; } + void SetFontSize(int _size) { size = _size; } + uint64_t *GetBitmapData(); + uint16_t GetCharWidth() { return font->header[size].charWidth; } + uint16_t GetCharHeight() { return font->header[size].charHeight; } + void FreeData(); - private: - size_t datasize = 0; - ZMFONT *font = nullptr; + private: + int size = 0; + size_t datasize = 0; + ZMFONT *font = nullptr; }; -#endif \ No newline at end of file +#endif diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 6c48df94e..4903c114d 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -1881,8 +1881,9 @@ const Coord Image::centreCoord( const char *text, int size=1 ) const { line_no++; } - uint16_t char_width, char_height; - font.GetBitmapDataForSize(size, char_width, char_height); + font.SetFontSize(size); + uint16_t char_width = font.GetCharWidth(); + uint16_t char_height = font.GetCharHeight(); int x = (width - (max_line_len * char_width )) / 2; int y = (height - (line_no * char_height) ) / 2; return Coord(x, y); @@ -1933,8 +1934,7 @@ void Image::MaskPrivacy( const unsigned char *p_bitmask, const Rgb pixel_colour /* Bitmap decoding trick has been adopted from here: https://lemire.me/blog/2018/02/21/iterating-over-set-bits-quickly/ */ -__attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int size, const Rgb fg_colour, const Rgb bg_colour ) -{ +__attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int size, const Rgb fg_colour, const Rgb bg_colour ) { strncpy(text, p_text, sizeof(text)-1); unsigned int index = 0; @@ -1947,19 +1947,21 @@ __attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Co const uint8_t fg_g_col = GREEN_VAL_RGBA(fg_colour); const uint8_t fg_b_col = BLUE_VAL_RGBA(fg_colour); const uint8_t fg_bw_col = fg_colour & 0xff; - const Rgb fg_rgb_col = rgb_convert(fg_colour,subpixelorder); + const Rgb fg_rgb_col = rgb_convert(fg_colour, subpixelorder); const uint8_t bg_r_col = RED_VAL_RGBA(bg_colour); const uint8_t bg_g_col = GREEN_VAL_RGBA(bg_colour); const uint8_t bg_b_col = BLUE_VAL_RGBA(bg_colour); const uint8_t bg_bw_col = bg_colour & 0xff; - const Rgb bg_rgb_col = rgb_convert(bg_colour,subpixelorder); + const Rgb bg_rgb_col = rgb_convert(bg_colour, subpixelorder); const bool bg_trans = (bg_colour == RGB_TRANSPARENT); - uint16_t char_width = 0, char_height = 0; - uint64_t *fontbitmap = font.GetBitmapDataForSize(size, char_width, char_height); + + font.SetFontSize(size); + const uint16_t char_width = font.GetCharWidth(); + const uint16_t char_height = font.GetCharHeight(); + const uint64_t *font_bitmap = font.GetBitmapData(); while ( (index < text_len) && (line_len = strcspn(line, "\n")) ) { - unsigned int line_width = line_len * char_width; unsigned int lo_line_x = coord.X(); @@ -1997,11 +1999,10 @@ __attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Co Warning("Unsupported character %c in %s", line[c], line); continue; } - uint64_t f = fontbitmap[(line[c] * char_height) + r]; - if( !bg_trans ) memset(temp_ptr, bg_bw_col, char_width); - while(f != 0) - { - unsigned long long t = f & -f; + uint64_t f = font_bitmap[(line[c] * char_height) + r]; + if ( !bg_trans ) memset(temp_ptr, bg_bw_col, char_width); + while ( f != 0 ) { + uint64_t t = f & -f; int idx = char_width - __builtin_ctzll(f>>2); *(temp_ptr + idx) = fg_bw_col; f ^= t; @@ -2019,10 +2020,9 @@ __attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Co Warning("Unsupported character %c in %s", line[c], line); continue; } - uint64_t f = fontbitmap[(line[c] * char_height) + r]; - if( !bg_trans ) memset(temp_ptr, 0x0, char_width * colours); - while( f != 0 ) - { + uint64_t f = font_bitmap[(line[c] * char_height) + r]; + if ( !bg_trans ) memset(temp_ptr, 0x0, char_width * colours); + while ( f != 0 ) { uint64_t t = f & -f; int idx = char_width - __builtin_ctzll(f >> 2); RED_PTR_RGBA((temp_ptr + (idx*3))) = fg_r_col; @@ -2044,10 +2044,9 @@ __attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Co Warning("Unsupported character %c in %s", line[c], line); continue; } - uint64_t f = fontbitmap[(line[c] * char_height) + r]; - if( !bg_trans ) memset((uint8_t *)temp_ptr, bg_rgb_col, char_width * colours); - while( f != 0 ) - { + uint64_t f = font_bitmap[(line[c] * char_height) + r]; + if ( !bg_trans ) memset((uint8_t *)temp_ptr, bg_rgb_col, char_width * colours); + while ( f != 0 ) { uint64_t t = f & -f; int idx = char_width - __builtin_ctzll(f >> 2); *(temp_ptr + idx) = fg_rgb_col; From 32e256364318bb23007cb6f61c84d70a4d9af3ea Mon Sep 17 00:00:00 2001 From: hax0kartik Date: Sun, 29 Nov 2020 10:53:20 +0530 Subject: [PATCH 006/116] Free font data when destructor is called --- src/zm_font.h | 1 + src/zm_image.cpp | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/zm_font.h b/src/zm_font.h index 03a452acc..ead3a6f81 100644 --- a/src/zm_font.h +++ b/src/zm_font.h @@ -21,6 +21,7 @@ struct ZMFONT { class ZmFont { public: + ~ZmFont() { FreeData(); } int ReadFontFile(const std::string &loc); ZMFONT *GetFont() { return font; } void SetFontSize(int _size) { size = _size; } diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 4903c114d..f96f54fef 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -294,8 +294,6 @@ void Image::Deinitialise() { sws_freeContext(sws_convert_context); sws_convert_context = nullptr; } - - font.FreeData(); } // end void Image::Deinitialise() void Image::Initialise() { From 67dac2651bdfe930f78a9eca1396f32614ecc8a7 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sun, 29 Nov 2020 17:06:07 -0500 Subject: [PATCH 007/116] Log an error with path when can't open video --- web/views/view_video.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/views/view_video.php b/web/views/view_video.php index c94f1d9b7..4717e5f96 100644 --- a/web/views/view_video.php +++ b/web/views/view_video.php @@ -55,7 +55,8 @@ if ( $errorText ) { die(); } -if ( ! ($fh = @fopen($path,'rb') ) ) { +if ( ! ($fh = @fopen($path, 'rb') ) ) { + ZM\Error('Can\'t open video at '.$path); header('HTTP/1.0 404 Not Found'); die(); } From d290ffc1b35a9a781282e884dce889b9c106fae2 Mon Sep 17 00:00:00 2001 From: hax0kartik Date: Mon, 30 Nov 2020 17:57:59 +0530 Subject: [PATCH 008/116] Set individual rgb components instead of memset which is wrong --- src/zm_font.cpp | 23 +++++++++++++++++------ src/zm_font.h | 3 +-- src/zm_image.cpp | 18 +++++++++++++----- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/zm_font.cpp b/src/zm_font.cpp index e8338dcdb..c2e01e76b 100644 --- a/src/zm_font.cpp +++ b/src/zm_font.cpp @@ -14,11 +14,14 @@ int ZmFont::ReadFontFile(const std::string &loc) { stat(loc.c_str(), &st); font = new ZMFONT; - if ( !font ) - return -2; // MAGIC + pad + BitmapHeaders - fread(&font[0], 1, 8 + (sizeof(ZMFONT_BH) * 4), f); + size_t readsize = fread(&font[0], 1, 8 + (sizeof(ZMFONT_BH) * 4), f); + if ( readsize < 8 + (sizeof(ZMFONT_BH) * 4) ) { + delete font; + font = nullptr; + return -2; // EOF reached, invalid file + } if ( memcmp(font->MAGIC, "ZMFNT", 5) != 0 ) // Check whether magic is correct return -3; @@ -31,7 +34,8 @@ int ZmFont::ReadFontFile(const std::string &loc) { if ( (font->header[i].charWidth > 64 && font->header[i].charWidth == 0) || \ (font->header[i].charHeight > 200 && font->header[i].charHeight == 0) || \ (font->header[i].idx > st.st_size) ) { - FreeData(); + delete font; + font = nullptr; return -4; } } @@ -39,12 +43,19 @@ int ZmFont::ReadFontFile(const std::string &loc) { datasize = st.st_size - (8 + sizeof(ZMFONT_BH) * 4); font->data = new uint64_t[datasize/sizeof(uint64_t)]; - fread(&font->data[0], 1, datasize, f); + readsize = fread(&font->data[0], 1, datasize, f); + if( readsize < datasize) { // Shouldn't happen + delete[] font->data; + font->data = nullptr; + delete font; + font = nullptr; + return -2; + } fclose(f); return 0; } -void ZmFont::FreeData() { +ZmFont::~ZmFont() { if ( font->data ) { delete[] font->data; font->data = nullptr; diff --git a/src/zm_font.h b/src/zm_font.h index ead3a6f81..8783026a6 100644 --- a/src/zm_font.h +++ b/src/zm_font.h @@ -21,14 +21,13 @@ struct ZMFONT { class ZmFont { public: - ~ZmFont() { FreeData(); } + ~ZmFont(); int ReadFontFile(const std::string &loc); ZMFONT *GetFont() { return font; } void SetFontSize(int _size) { size = _size; } uint64_t *GetBitmapData(); uint16_t GetCharWidth() { return font->header[size].charWidth; } uint16_t GetCharHeight() { return font->header[size].charHeight; } - void FreeData(); private: int size = 0; diff --git a/src/zm_image.cpp b/src/zm_image.cpp index f96f54fef..1318daafd 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -490,8 +490,7 @@ void Image::Initialise() { int res = font.ReadFontFile(config.font_file_location); if( res == -1 ) { Panic("Invalid font location."); - } - else if( res == -3 || res == -4 ) { + } else if( res == -2 || res == -3 || res == -4 ) { Panic("Invalid font file."); } initialised = true; @@ -1932,7 +1931,7 @@ void Image::MaskPrivacy( const unsigned char *p_bitmask, const Rgb pixel_colour /* Bitmap decoding trick has been adopted from here: https://lemire.me/blog/2018/02/21/iterating-over-set-bits-quickly/ */ -__attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int size, const Rgb fg_colour, const Rgb bg_colour ) { +void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int size, const Rgb fg_colour, const Rgb bg_colour ) { strncpy(text, p_text, sizeof(text)-1); unsigned int index = 0; @@ -2019,7 +2018,13 @@ __attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Co continue; } uint64_t f = font_bitmap[(line[c] * char_height) + r]; - if ( !bg_trans ) memset(temp_ptr, 0x0, char_width * colours); + if ( !bg_trans ) { + for( int i = 0; i < char_width; i++ ) { // We need to set individual r,g,b components + RED_PTR_RGBA((temp_ptr + (i*3))) = bg_r_col; + GREEN_PTR_RGBA((temp_ptr + (i*3))) = bg_g_col; + BLUE_PTR_RGBA((temp_ptr + (i*3))) = bg_b_col; + } + } while ( f != 0 ) { uint64_t t = f & -f; int idx = char_width - __builtin_ctzll(f >> 2); @@ -2043,7 +2048,10 @@ __attribute__ ((optimize(3))) void Image::Annotate( const char *p_text, const Co continue; } uint64_t f = font_bitmap[(line[c] * char_height) + r]; - if ( !bg_trans ) memset((uint8_t *)temp_ptr, bg_rgb_col, char_width * colours); + if ( !bg_trans ) { + for( int i = 0; i < char_width; i++ ) + *(temp_ptr + i) = bg_rgb_col; + } while ( f != 0 ) { uint64_t t = f & -f; int idx = char_width - __builtin_ctzll(f >> 2); From 7326af95a97e4debd290c20a91f87526417ec0c0 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 1 Dec 2020 09:21:25 -0500 Subject: [PATCH 009/116] Add ZM_FONTDIR as a place to store fonts for timestamping --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 310d194d2..8d1562554 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -148,6 +148,9 @@ set(ZM_CACHEDIR "/var/cache/zoneminder" CACHE PATH "Location of the web server cache busting files, default: /var/cache/zoneminder") set(ZM_CONTENTDIR "/var/lib/zoneminder" CACHE PATH "Location of dynamic content (events and images), default: /var/lib/zoneminder") +set(ZM_FONTDIR "${CMAKE_INSTALL_FULL_DATADIR}/zoneminder/fonts" CACHE PATH + "Location of the font files used for timestamping, default: /${CMAKE_INSTALL_DATADIR}/zoneminder/fonts") + set(ZM_DB_HOST "localhost" CACHE STRING "Hostname where ZoneMinder database located, default: localhost") set(ZM_DB_NAME "zm" CACHE STRING @@ -911,6 +914,7 @@ set(BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS_SAVED}") add_subdirectory(src) add_subdirectory(scripts) add_subdirectory(db) +add_subdirectory(fonts) add_subdirectory(web) add_subdirectory(misc) add_subdirectory(onvif) From d1c3864778578943997a091700b5fcb377595ae7 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 1 Dec 2020 09:21:54 -0500 Subject: [PATCH 010/116] Use the ZM_FONTDIR substitution instead of hardcoding a path --- scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 0291ab5cc..7df580d3a 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -3782,7 +3782,7 @@ our @options = ( }, { name => 'ZM_FONT_FILE_LOCATION', - default => '/zoneminder/fonts/default.zmfnt', + default => '@ZM_FONTDIR@/default.zmfnt', description => 'Font file location', help => 'This font is used for timestamp labels.', type => $types{string}, From 3c11b4f1514969507f9bcd6ea4e3ec49dee1df26 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 1 Dec 2020 09:35:24 -0500 Subject: [PATCH 011/116] Add CMakeLists so that fonts get installed --- fonts/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 fonts/CMakeLists.txt diff --git a/fonts/CMakeLists.txt b/fonts/CMakeLists.txt new file mode 100644 index 000000000..aa00d14db --- /dev/null +++ b/fonts/CMakeLists.txt @@ -0,0 +1,5 @@ +# Glob all database upgrade scripts +file(GLOB fontfileslist RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.zmfnt") +# Install the fonts +install(FILES ${fontfileslist} DESTINATION "${ZM_FONTDIR}") + From ff2981b9b307a1400decf4bc1bd6aaf6243d6ecd Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 1 Dec 2020 09:53:51 -0500 Subject: [PATCH 012/116] code style. Remove unused members. Make WriteFrameImage const --- src/zm_event.cpp | 5 ++- src/zm_event.h | 89 +++++++++++++++++++++++++++++++----------------- 2 files changed, 60 insertions(+), 34 deletions(-) diff --git a/src/zm_event.cpp b/src/zm_event.cpp index 0bb39a694..0de90365e 100644 --- a/src/zm_event.cpp +++ b/src/zm_event.cpp @@ -1,5 +1,5 @@ // -// ZoneMinder Event Class Implementation, $Date$, $Revision$ +// ZoneMinder Event Class Implementation // Copyright (C) 2001-2008 Philip Coombes // // This program is free software; you can redistribute it and/or @@ -79,7 +79,6 @@ Event::Event( start_time = now; } - unsigned int state_id = 0; zmDbRow dbrow; if ( dbrow.fetch("SELECT Id FROM States WHERE IsActive=1") ) { @@ -356,7 +355,7 @@ bool Event::WriteFrameImage( bool Event::WriteFrameVideo( const Image *image, const struct timeval timestamp, - VideoWriter* videow) { + VideoWriter* videow) const { const Image* frameimg = image; Image ts_image; diff --git a/src/zm_event.h b/src/zm_event.h index e8e1e567e..4de0f8af6 100644 --- a/src/zm_event.h +++ b/src/zm_event.h @@ -1,21 +1,21 @@ // // ZoneMinder Core Interfaces, $Date$, $Revision$ // Copyright (C) 2001-2008 Philip Coombes -// +// // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. -// +// // This program 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 General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// +// #ifndef ZM_EVENT_H #define ZM_EVENT_H @@ -45,25 +45,24 @@ class Zone; class Monitor; class EventStream; -#define MAX_PRE_ALARM_FRAMES 16 // Maximum number of prealarm frames that can be stored +// Maximum number of prealarm frames that can be stored +#define MAX_PRE_ALARM_FRAMES 16 typedef uint64_t event_id_t; - typedef enum { NORMAL=0, BULK, ALARM } FrameType; +typedef enum { NORMAL=0, BULK, ALARM } FrameType; #include "zm_frame.h" + // // Class describing events, i.e. captured periods of activity. // class Event { friend class EventStream; - protected: - static int sd; - - public: + public: typedef std::set StringSet; typedef std::map StringSetMap; - protected: + protected: static const char * frame_type_names[3]; struct PreAlarmData { @@ -103,13 +102,18 @@ class Event { int last_db_frame; Storage::Schemes scheme; - void createNotes( std::string ¬es ); + void createNotes(std::string ¬es); - public: - static bool OpenFrameSocket( int ); - static bool ValidateFrameSocket( int ); + public: + static bool OpenFrameSocket(int); + static bool ValidateFrameSocket(int); - Event( Monitor *p_monitor, struct timeval p_start_time, const std::string &p_cause, const StringSetMap &p_noteSetMap, bool p_videoEvent=false ); + Event( + Monitor *p_monitor, + struct timeval p_start_time, + const std::string &p_cause, + const StringSetMap &p_noteSetMap, + bool p_videoEvent=false); ~Event(); uint64_t Id() const { return id; } @@ -120,36 +124,54 @@ class Event { const struct timeval &StartTime() const { return start_time; } const struct timeval &EndTime() const { return end_time; } - bool SendFrameImage( const Image *image, bool alarm_frame=false ); - bool WriteFrameImage( Image *image, struct timeval timestamp, const char *event_file, bool alarm_frame=false ) const; - bool WriteFrameVideo( const Image *image, const struct timeval timestamp, VideoWriter* videow ); + bool SendFrameImage(const Image *image, bool alarm_frame=false); + bool WriteFrameImage( + Image *image, + struct timeval timestamp, + const char *event_file, + bool alarm_frame=false + ) const; + bool WriteFrameVideo( + const Image *image, + const struct timeval timestamp, + VideoWriter* videow + ) const; - void updateNotes( const StringSetMap &stringSetMap ); + void updateNotes(const StringSetMap &stringSetMap); - void AddFrames( int n_frames, Image **images, struct timeval **timestamps ); - void AddFrame( Image *image, struct timeval timestamp, int score=0, Image *alarm_image=nullptr ); + void AddFrames(int n_frames, Image **images, struct timeval **timestamps); + void AddFrame( + Image *image, + struct timeval timestamp, + int score=0, + Image *alarm_image=nullptr); - private: - void AddFramesInternal( int n_frames, int start_frame, Image **images, struct timeval **timestamps ); + private: + void AddFramesInternal( + int n_frames, + int start_frame, + Image **images, + struct timeval **timestamps); void WriteDbFrames(); void UpdateFramesDelta(double offset); bool SetPath(Storage *storage); - public: - static const char *getSubPath( struct tm *time ) { + public: + static const char *getSubPath(struct tm *time) { static char subpath[PATH_MAX] = ""; - snprintf(subpath, sizeof(subpath), "%02d/%02d/%02d/%02d/%02d/%02d", time->tm_year-100, time->tm_mon+1, time->tm_mday, time->tm_hour, time->tm_min, time->tm_sec); + snprintf(subpath, sizeof(subpath), "%02d/%02d/%02d/%02d/%02d/%02d", + time->tm_year-100, time->tm_mon+1, time->tm_mday, + time->tm_hour, time->tm_min, time->tm_sec); return subpath; } - static const char *getSubPath( time_t *time ) { - return Event::getSubPath( localtime( time ) ); + static const char *getSubPath(time_t *time) { + return Event::getSubPath(localtime(time)); } const char* getEventFile(void) const { return video_file.c_str(); } - public: static int PreAlarmCount() { return pre_alarm_count; } @@ -166,7 +188,12 @@ class Event { } pre_alarm_count = 0; } - static void AddPreAlarmFrame(Image *image, struct timeval timestamp, int score=0, Image *alarm_frame=nullptr) { + static void AddPreAlarmFrame( + Image *image, + struct timeval timestamp, + int score=0, + Image *alarm_frame=nullptr + ) { pre_alarm_data[pre_alarm_count].image = new Image(*image); pre_alarm_data[pre_alarm_count].timestamp = timestamp; pre_alarm_data[pre_alarm_count].score = score; From 051e361958ec78b9b4939bff1418c9b5d6123b21 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Tue, 1 Dec 2020 12:19:01 -0600 Subject: [PATCH 013/116] eslint --- web/skins/classic/views/js/event.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web/skins/classic/views/js/event.js b/web/skins/classic/views/js/event.js index 733322bc8..5550ee15c 100644 --- a/web/skins/classic/views/js/event.js +++ b/web/skins/classic/views/js/event.js @@ -1065,11 +1065,11 @@ function manageDelConfirmModalBtns() { } function getEvtStatsCookie() { - var cookie = 'zmEventStats' + var cookie = 'zmEventStats'; var stats = getCookie(cookie); if ( !stats ) { - stats = 'on' + stats = 'on'; setCookie(cookie, stats, 10*365); } return stats; @@ -1080,7 +1080,7 @@ function initPage() { getDelConfirmModal(); var stats = getEvtStatsCookie(); - if ( stats != 'on' ) table.toggle(false) + if ( stats != 'on' ) table.toggle(false); //FIXME prevent blocking...not sure what is happening or best way to unblock if ( $j('#videoobj').length ) { @@ -1239,7 +1239,7 @@ function initPage() { // Manage the Event STATISTICS Button document.getElementById("statsBtn").addEventListener("click", function onStatsClick(evt) { evt.preventDefault(); - var cookie = 'zmEventStats' + var cookie = 'zmEventStats'; // Toggle the visiblity of the stats table and write an appropriate cookie if ( table.is(':visible') ) { @@ -1247,7 +1247,7 @@ function initPage() { table.toggle(false); } else { setCookie(cookie, 'on', 10*365); - table.toggle(true); + table.toggle(true); } }); From ae7a706526d7b9f7fa7643da47fdfa983a6be891 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 1 Dec 2020 14:04:51 -0500 Subject: [PATCH 014/116] Handle minTime and maxTime being specified as either a timstamp or a datetime. Remove duplicated query building code. Reduce ram requirements when exporting logs. --- web/ajax/log.php | 127 +++++++++++++++++++---------------------------- 1 file changed, 50 insertions(+), 77 deletions(-) diff --git a/web/ajax/log.php b/web/ajax/log.php index 16f7ac573..5f749df6c 100644 --- a/web/ajax/log.php +++ b/web/ajax/log.php @@ -8,10 +8,6 @@ $filterFields = array('Component', 'ServerId', 'Pid', 'Level', 'File', 'Line'); function buildLogQuery($action) { global $filterFields; - $minTime = isset($_REQUEST['minTime']) ? $_REQUEST['minTime'] : NULL; - $maxTime = isset($_REQUEST['maxTime']) ? $_REQUEST['maxTime'] : NULL; - - $limit = 100; if ( isset($_REQUEST['limit']) ) { if ( ( !is_integer($_REQUEST['limit']) and !ctype_digit($_REQUEST['limit']) ) ) { ZM\Error('Invalid value for limit ' . $_REQUEST['limit']); @@ -33,11 +29,37 @@ function buildLogQuery($action) { $sql = $action.' FROM Logs'; $where = array(); $values = array(); + $limit = 100; + + $minTime = isset($_REQUEST['minTime']) ? $_REQUEST['minTime'] : NULL; + $maxTime = isset($_REQUEST['maxTime']) ? $_REQUEST['maxTime'] : NULL; + if ( !is_null($minTime) && !is_null($maxTime) && ($minTime > $maxTime) ) { + $tempTime = $minTime; + $minTime = $maxTime; + $maxTime = $tempTime; + } + if ( $minTime ) { - $where[] = 'TimeKey > ?'; + if ( preg_match('/^(\d+)(\.\d+)$/', $minTime) or preg_match('/^(\d+)$/', $minTime) ) { + # is a timestamp + } else if ( preg_match('/(.+)(\.\d+)/', $minTime, $matches) ) { + # This handles sub second precision in a date time + $minTime = strtotime($matches[1]).$matches[2]; + } else { + $minTime = strtotime($minTime); + } + $where[] = 'TimeKey >= ?'; $values[] = $minTime; - } elseif ( $maxTime ) { - $where[] = 'TimeKey < ?'; + } + if ( $maxTime ) { + if ( preg_match('/^(\d+)(\.\d+)$/', $maxTime) or preg_match('/^(\d+)$/', $maxTime) ) { + # is a timestamp + } else if ( preg_match('/(.+)(\.\d+)/', $maxTime, $matches) ) { + $maxTime = strtotime($matches[1]).$matches[2]; + } else { + $maxTime = strtotime($maxTime); + } + $where[] = 'TimeKey <= ?'; $values[] = $maxTime; } @@ -161,24 +183,7 @@ switch ( $_REQUEST['task'] ) { if ( !canView('System') ) ajaxError('Insufficient permissions to export logs'); - $minTime = isset($_POST['minTime']) ? $_POST['minTime'] : NULL; - $maxTime = isset($_POST['maxTime']) ? $_POST['maxTime'] : NULL; - if ( !is_null($minTime) && !is_null($maxTime) && ($minTime > $maxTime) ) { - $tempTime = $minTime; - $minTime = $maxTime; - $maxTime = $tempTime; - } - //$limit = isset($_POST['limit'])?$_POST['limit']:1000; - $filter = isset($_POST['filter'])?$_POST['filter']:array(); - $sortField = 'TimeKey'; - if ( isset($_POST['sortField']) ) { - if ( !in_array($_POST['sortField'], $filterFields) and ($_POST['sortField'] != 'TimeKey') ) { - ZM\Error('Invalid sort field '.$_POST['sortField']); - } else { - $sortField = $_POST['sortField']; - } - } - $sortOrder = (isset($_POST['sortOrder']) and $_POST['sortOrder']) == 'asc' ? 'asc' : 'desc'; + $query = buildLogQuery('SELECT *'); global $Servers; if ( !$Servers ) @@ -189,43 +194,6 @@ switch ( $_REQUEST['task'] ) { $servers_by_Id[$server->Id()] = $server; } - $sql = 'SELECT * FROM Logs'; - $where = array(); - $values = array(); - if ( $minTime ) { - if ( preg_match('/(.+)(\.\d+)/', $minTime, $matches) ) { - # This handles sub second precision - $minTime = strtotime($matches[1]).$matches[2]; - } else { - $minTime = strtotime($minTime); - } - $where[] = 'TimeKey >= ?'; - $values[] = $minTime; - } - if ( $maxTime ) { - if ( preg_match('/(.+)(\.\d+)/', $maxTime, $matches) ) { - $maxTime = strtotime($matches[1]).$matches[2]; - } else { - $maxTime = strtotime($maxTime); - } - $where[] = 'TimeKey <= ?'; - $values[] = $maxTime; - } - foreach ( $filter as $field=>$value ) { - if ( $value != '' ) { - if ( $field == 'Level' ) { - $where[] = $field.' <= ?'; - $values[] = $value; - } else { - $where[] = $field.' = ?'; - $values[] = $value; - } - } - } - if ( count($where) ) - $sql.= ' WHERE '.join(' AND ', $where); - $sql .= ' ORDER BY '.$sortField.' '.$sortOrder; - //$sql .= " limit ".dbEscape($limit); $format = isset($_POST['format']) ? $_POST['format'] : 'text'; switch ( $format ) { case 'text' : @@ -245,28 +213,27 @@ switch ( $_REQUEST['task'] ) { } $exportKey = substr(md5(rand()), 0, 8); $exportFile = 'zm-log.'.$exportExt; + $exportPath = ZM_DIR_EXPORTS.'/zm-log-'.$exportKey.'.'.$exportExt; // mkdir will generate a warning if it exists, but that is ok - error_reporting(0); + $old_error_reporting = error_reporting(0); if ( ! ( mkdir(ZM_DIR_EXPORTS) || file_exists(ZM_DIR_EXPORTS) ) ) { ZM\Fatal('Can\'t create exports dir at \''.ZM_DIR_EXPORTS.'\''); } - $exportPath = ZM_DIR_EXPORTS.'/zm-log-'.$exportKey.$exportExt; + error_reporting($old_error_reporting); + ZM\Logger::Debug("Exporting to $exportPath"); if ( !($exportFP = fopen($exportPath, 'w')) ) ZM\Fatal("Unable to open log export file $exportPath"); $logs = array(); - foreach ( dbFetchAll($sql, NULL, $values) as $log ) { - $log['DateTime'] = preg_replace('/^\d+/', strftime('%Y-%m-%d %H:%M:%S', intval($log['TimeKey'])), $log['TimeKey']); - $log['Server'] = ( $log['ServerId'] and isset($servers_by_Id[$log['ServerId']]) ) ? $servers_by_Id[$log['ServerId']]->Name() : ''; - $logs[] = $log; - } - ZM\Logger::Debug(count($logs).' lines being exported by '.$sql.implode(',', $values)); + $result = dbQuery($query['sql'], $query['values'], true); - switch( $format ) { + switch ( $format ) { case 'text' : { - foreach ( $logs as $log ) { + while ( $log = dbFetchNext($result) ) { + $log['DateTime'] = preg_replace('/^\d+/', strftime('%Y-%m-%d %H:%M:%S', intval($log['TimeKey'])), $log['TimeKey']); + $log['Server'] = ( $log['ServerId'] and isset($servers_by_Id[$log['ServerId']]) ) ? $servers_by_Id[$log['ServerId']]->Name() : ''; if ( $log['Line'] ) fprintf($exportFP, "%s %s[%d].%s-%s/%d [%s]\n", $log['DateTime'], $log['Component'], $log['Pid'], $log['Code'], $log['File'], $log['Line'], $log['Message']); @@ -289,7 +256,9 @@ switch ( $_REQUEST['task'] ) { translate('File'), translate('Line') )."\n"); - foreach ( $logs as $log ) { + while ( $log = dbFetchNext($result) ) { + $log['DateTime'] = preg_replace('/^\d+/', strftime('%Y-%m-%d %H:%M:%S', intval($log['TimeKey'])), $log['TimeKey']); + $log['Server'] = ( $log['ServerId'] and isset($servers_by_Id[$log['ServerId']]) ) ? $servers_by_Id[$log['ServerId']]->Name() : ''; fprintf($exportFP, "%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\n", $log['DateTime'], $log['Component'], $log['Server'], $log['Pid'], $log['Code'], $log['Message'], $log['File'], $log['Line']); } @@ -343,7 +312,9 @@ switch ( $_REQUEST['task'] ) { '.translate('DateTime').''.translate('Component').''.translate('Server').''.translate('Pid').''.translate('Level').''.translate('Message').''.translate('File').''.translate('Line').' '); - foreach ( $logs as $log ) { + while ( $log = dbFetchNext($result) ) { + $log['DateTime'] = preg_replace('/^\d+/', strftime('%Y-%m-%d %H:%M:%S', intval($log['TimeKey'])), $log['TimeKey']); + $log['Server'] = ( $log['ServerId'] and isset($servers_by_Id[$log['ServerId']]) ) ? $servers_by_Id[$log['ServerId']]->Name() : ''; $classLevel = $log['Level']; if ( $classLevel < ZM\Logger::FATAL ) { $classLevel = ZM\Logger::FATAL; @@ -387,7 +358,9 @@ switch ( $_REQUEST['task'] ) { ' ); - foreach ( $logs as $log ) { + while ( $log = dbFetchNext($result) ) { + $log['DateTime'] = preg_replace('/^\d+/', strftime('%Y-%m-%d %H:%M:%S', intval($log['TimeKey'])), $log['TimeKey']); + $log['Server'] = ( $log['ServerId'] and isset($servers_by_Id[$log['ServerId']]) ) ? $servers_by_Id[$log['ServerId']]->Name() : ''; fprintf( $exportFP, ' %s @@ -409,7 +382,7 @@ switch ( $_REQUEST['task'] ) { $exportExt = 'xml'; break; } - fclose( $exportFP ); + fclose($exportFP); ajaxResponse( array( 'key' => $exportKey, 'format' => $format, @@ -446,7 +419,7 @@ switch ( $_REQUEST['task'] ) { } $exportFile = 'zm-log.'.$exportExt; - $exportPath = ZM_DIR_EXPORTS.'/zm-log-'.$exportKey.$exportExt; + $exportPath = ZM_DIR_EXPORTS.'/zm-log-'.$exportKey.'.'.$exportExt; header('Pragma: public'); header('Expires: 0'); From baeb1dbd5b65cc2e5378554ba9239ba4a904d0e5 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 1 Dec 2020 14:07:23 -0500 Subject: [PATCH 015/116] Take an optional debug param in dbQuery --- web/includes/database.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/includes/database.php b/web/includes/database.php index 2fb2db108..637b20fa0 100644 --- a/web/includes/database.php +++ b/web/includes/database.php @@ -125,7 +125,7 @@ function dbEscape( $string ) { return $dbConn->quote($string); } -function dbQuery($sql, $params=NULL) { +function dbQuery($sql, $params=NULL, $debug = false) { global $dbConn; if ( dbLog($sql, true) ) return; @@ -142,7 +142,7 @@ function dbQuery($sql, $params=NULL) { return NULL; } } else { - if ( defined('ZM_DB_DEBUG') ) { + if ( defined('ZM_DB_DEBUG') or $debug ) { ZM\Logger::Debug("SQL: $sql values:" . ($params?implode(',',$params):'')); } $result = $dbConn->query($sql); @@ -151,7 +151,7 @@ function dbQuery($sql, $params=NULL) { return NULL; } } - if ( defined('ZM_DB_DEBUG') ) { + if ( defined('ZM_DB_DEBUG') or $debug ) { if ( $params ) ZM\Logger::Debug("SQL: $sql " . implode(',',$params) . ' rows: '.$result->rowCount()); else From 48775e2230603841fb205be44dfd3fd3a881162d Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 1 Dec 2020 14:24:41 -0500 Subject: [PATCH 016/116] Fix Clear Log by using minTime and maxTime as timestamps. Fix export including unselected filters. Can't just serialize the form asit may contain fields in teh querystring so you get an array of values instead of a single value --- web/skins/classic/views/js/log.js | 50 ++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/web/skins/classic/views/js/log.js b/web/skins/classic/views/js/log.js index f0aee7c00..2ad01e8fc 100644 --- a/web/skins/classic/views/js/log.js +++ b/web/skins/classic/views/js/log.js @@ -1,5 +1,12 @@ var logParms = 'view=request&request=log&task=query'; -var logReq = new Request.JSON( {url: thisUrl, method: 'post', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: logResponse} ); +var logReq = new Request.JSON( { + url: thisUrl, + method: 'post', + timeout: AJAX_TIMEOUT, + link: 'cancel', + onSuccess: logResponse +} ); + var logTimer = undefined; var logTable = undefined; @@ -171,18 +178,24 @@ function clearError() { function clearLog() { logReq.cancel(); + var clearReq = new Request.JSON({ + url: thisUrl, + method: 'post', + timeout: AJAX_TIMEOUT, + link: 'cancel', + onSuccess: clearResponse + }); var clearParms = 'view=request&request=log&task=delete'; - var clearReq = new Request.JSON({url: thisUrl, method: 'post', timeout: AJAX_TIMEOUT, link: 'cancel', onSuccess: clearResponse}); - var tbody = $(logTable).getElement('tbody'); - var rows = tbody.getElements('tr'); - if ( rows && rows.length ) { - var minTime = rows[0].getElement('td').get('text'); - clearParms += "&minTime="+encodeURIComponent(minTime); - var maxTime = rows[rows.length-1].getElement('td').get('text'); - clearParms += "&maxTime="+encodeURIComponent(maxTime); - } - var form = $('logForm'); - clearReq.send(clearParms+"&"+form.toQueryString()); + clearParms += "&minTime="+minLogTime; + clearParms += "&maxTime="+maxLogTime; + var filters =['Component', 'ServerId', 'Pid', 'Level', 'File', 'Line']; + filters.forEach(function(filter) { + var f = $j('#filter\\['+filter+'\\]'); + if ( f.val() ) { + clearParms += '&'+encodeURIComponent('filter[' + filter + ']')+'='+encodeURIComponent(f.val()); + } + }); + clearReq.send(clearParms); } function filterLog() { @@ -236,13 +249,21 @@ function exportRequest() { $('exportErrorText').set('text', ''); $('exportError').hide(); if ( form.validate() ) { + var exportReq = new Request.JSON({ + url: thisUrl, + method: 'post', + link: 'cancel', + onSuccess: exportResponse, + onFailure: exportFail + }); var exportParms = "view=request&request=log&task=export"; - var exportReq = new Request.JSON({url: thisUrl, method: 'post', link: 'cancel', onSuccess: exportResponse, onFailure: exportFail}); var selection = form.getElement('input[name=selector]:checked').get('value'); if ( selection == 'filter' || selection == 'current' ) { $$('#filters select').each( function( select ) { - exportParms += "&"+select.get('id')+"="+select.get('value'); + if ( select.get('value') ) { + exportParms += "&"+select.get('id')+"="+select.get('value'); + } } ); } @@ -250,6 +271,7 @@ function exportRequest() { var tbody = $(logTable).getElement( 'tbody' ); var rows = tbody.getElements( 'tr' ); if ( rows ) { + // Need to convert this to TimeKey var minTime = rows[0].getElement('td').get('text'); exportParms += "&minTime="+encodeURIComponent(minTime); var maxTime = rows[rows.length-1].getElement('td').get('text'); From 6da826d79c30d0d951c644dd4dd989a18bf95c2b Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Tue, 1 Dec 2020 13:29:43 -0600 Subject: [PATCH 017/116] fix typo --- web/ajax/status.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/web/ajax/status.php b/web/ajax/status.php index 994644afc..38570f8b3 100644 --- a/web/ajax/status.php +++ b/web/ajax/status.php @@ -330,18 +330,18 @@ function collectData() { foreach ( $postFuncs as $element=>$func ) $sqlData[$element] = eval('return( '.$func.'( $sqlData ) );'); $data[] = $sqlData; - if ( isset($limi) && ++$count >= $limit ) + if ( isset($limit) && ++$count >= $limit ) break; } # end foreach } # end if have limit == 1 } } - #ZM\Debug(print_r($data, true)); + #ZM\Warning(print_r($data, true)); return $data; } $data = collectData(); - +#Warning(print_r($data, true)); if ( !isset($_REQUEST['layout']) ) { $_REQUEST['layout'] = 'json'; } @@ -364,6 +364,7 @@ switch ( $_REQUEST['layout'] ) { $response = array( strtolower(validJsStr($_REQUEST['entity'])) => $data ); if ( isset($_REQUEST['loopback']) ) $response['loopback'] = validJsStr($_REQUEST['loopback']); + #ZM\Warning(print_r($response, true)); ajaxResponse($response); break; } From 347c64eb7d6de15915d3f8f64d80de3a74aa8294 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Tue, 1 Dec 2020 13:30:57 -0600 Subject: [PATCH 018/116] remove warning --- web/ajax/status.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/ajax/status.php b/web/ajax/status.php index 38570f8b3..da711b1f8 100644 --- a/web/ajax/status.php +++ b/web/ajax/status.php @@ -336,12 +336,12 @@ function collectData() { } # end if have limit == 1 } } - #ZM\Warning(print_r($data, true)); + #ZM\Debug(print_r($data, true)); return $data; } $data = collectData(); -#Warning(print_r($data, true)); + if ( !isset($_REQUEST['layout']) ) { $_REQUEST['layout'] = 'json'; } From 1ec13f3d06d472ceb50df6f325983c0e794d074f Mon Sep 17 00:00:00 2001 From: hax0kartik Date: Wed, 2 Dec 2020 09:44:49 +0530 Subject: [PATCH 019/116] Free font->data only when font itself is valid --- src/zm_font.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zm_font.cpp b/src/zm_font.cpp index c2e01e76b..77132e32e 100644 --- a/src/zm_font.cpp +++ b/src/zm_font.cpp @@ -56,7 +56,7 @@ int ZmFont::ReadFontFile(const std::string &loc) { } ZmFont::~ZmFont() { - if ( font->data ) { + if ( font && font->data ) { delete[] font->data; font->data = nullptr; } From 70689acf8d37cfbcc36d41234a6d39617d216fa5 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 2 Dec 2020 07:47:57 -0600 Subject: [PATCH 020/116] remove data-mobile-responsive, use table-responsive-sm instead --- web/skins/classic/views/controlcaps.php | 3 +-- web/skins/classic/views/devices.php | 3 +-- web/skins/classic/views/events.php | 1 - web/skins/classic/views/frames.php | 3 +-- web/skins/classic/views/log.php | 3 +-- web/skins/classic/views/stats.php | 4 +++- web/skins/classic/views/watch.php | 1 - 7 files changed, 7 insertions(+), 11 deletions(-) diff --git a/web/skins/classic/views/controlcaps.php b/web/skins/classic/views/controlcaps.php index 97da43e8e..a19f0e781 100644 --- a/web/skins/classic/views/controlcaps.php +++ b/web/skins/classic/views/controlcaps.php @@ -42,7 +42,7 @@ xhtmlHeaders(__FILE__, translate('ControlCaps')); -
+
-
+
Id()); -
+
Id()); data-toolbar="#toolbar" data-show-fullscreen="true" data-maintain-meta-data="true" - data-mobile-responsive="true" data-buttons-class="btn btn-normal" data-detail-view="true" data-detail-formatter="detailFormatter" diff --git a/web/skins/classic/views/log.php b/web/skins/classic/views/log.php index dcbb0fddc..88c3f0ccd 100644 --- a/web/skins/classic/views/log.php +++ b/web/skins/classic/views/log.php @@ -27,7 +27,7 @@ xhtmlHeaders(__FILE__, translate('SystemLog')); ?> -
+
 -  @@ -62,7 +62,6 @@ xhtmlHeaders(__FILE__, translate('SystemLog')); data-toolbar="#toolbar" data-show-fullscreen="true" data-maintain-meta-data="true" - data-mobile-responsive="true" data-buttons-class="btn btn-normal" data-show-jump-to="true" data-auto-refresh="true" diff --git a/web/skins/classic/views/stats.php b/web/skins/classic/views/stats.php index 2cd5c69e4..9eb032fd2 100644 --- a/web/skins/classic/views/stats.php +++ b/web/skins/classic/views/stats.php @@ -44,7 +44,9 @@ xhtmlHeaders(__FILE__, translate('Stats')." - ".$eid." - ".$fid );
- +
+ +
diff --git a/web/skins/classic/views/watch.php b/web/skins/classic/views/watch.php index bc891060e..79c7750a9 100644 --- a/web/skins/classic/views/watch.php +++ b/web/skins/classic/views/watch.php @@ -172,7 +172,6 @@ if ( canView('Events') && ($monitor->Type() != 'WebSite') ) { data-show-columns="true" data-show-export="true" data-uncheckAll="true" - data-mobile-responsive="true" data-buttons-class="btn btn-normal" data-auto-refresh="true" data-auto-refresh-silent="true" From f13533cab78a67ddd5ed7eece07fc0479a1b330d Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 2 Dec 2020 10:53:55 -0600 Subject: [PATCH 021/116] convert export functions to jquery --- web/skins/classic/views/js/export.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web/skins/classic/views/js/export.js b/web/skins/classic/views/js/export.js index a7db2c187..01bb3de3c 100644 --- a/web/skins/classic/views/js/export.js +++ b/web/skins/classic/views/js/export.js @@ -31,11 +31,11 @@ function startDownload(file) { function exportProgress() { if ( exportTimer ) { - var tickerText = $('exportProgressTicker').get('text'); + var tickerText = $j('#exportProgressTicker').text(); if ( tickerText.length < 1 || tickerText.length > 4 ) { - $('exportProgressTicker').set('text', '.'); + $j('#exportProgressTicker').text('.'); } else { - $('exportProgressTicker').appendText('.'); + $j('#exportProgressTicker').append('.'); } } } @@ -43,9 +43,9 @@ function exportProgress() { function exportResponse(respObj, respText) { clearInterval(exportTimer); if ( respObj.result != 'Ok' ) { - $('exportProgressTicker').set('text', respObj.message); + $j('#exportProgressTicker').text(respObj.message); } else { - $('exportProgressTicker').set('text', exportSucceededString); + $j('#exportProgressTicker').text(exportSucceededString); startDownload.pass(decodeURIComponent(respObj.exportFile)).delay(1500); } return; From aac47ed3616255ab062959a77621f891eb65fe82 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 2 Dec 2020 12:02:24 -0600 Subject: [PATCH 022/116] fixes to export functions --- web/skins/classic/includes/export_functions.php | 2 +- web/skins/classic/js/skin.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/web/skins/classic/includes/export_functions.php b/web/skins/classic/includes/export_functions.php index 27a346ba4..4fdf799ff 100644 --- a/web/skins/classic/includes/export_functions.php +++ b/web/skins/classic/includes/export_functions.php @@ -999,5 +999,5 @@ function exportEvents( unlink($monitorPath.'/'.$html_eventMaster); } - return '?view=archive%26type='.$exportFormat.'%26connkey='.$connkey; + return '?view=archive&type='.$exportFormat.'&connkey='.$connkey; } // end function exportEvents diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index 85449927c..7516553a4 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -830,10 +830,11 @@ function startDownload( exportFile ) { } function exportResponse(data, responseText) { - console.log(data); + console.log('exportResponse data: ' + JSON.stringify(data)); var generated = (data.result=='Ok') ? 1 : 0; - var exportFile = '?view=archive&type='+data.exportFormat+'&connkey='+data.connkey; + //var exportFile = '?view=archive&type='+data.exportFormat+'&connkey='+data.connkey; + var exportFile = data.exportFile; $j('#exportProgress').removeClass( 'text-warning' ); if ( generated ) { From 1c10cc492bc55742bbd5a0df0f88779b55f033fe Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 2 Dec 2020 13:15:32 -0500 Subject: [PATCH 023/116] Fix StartTime to StartDateTime --- web/skins/classic/includes/export_functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/includes/export_functions.php b/web/skins/classic/includes/export_functions.php index 4fdf799ff..ee48708d5 100644 --- a/web/skins/classic/includes/export_functions.php +++ b/web/skins/classic/includes/export_functions.php @@ -83,7 +83,7 @@ function exportEventDetail($event, $exportFrames, $exportImages) {
- + From d5df996bca43a43b992cb6e02927d6a071589914 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 2 Dec 2020 19:44:12 -0600 Subject: [PATCH 024/116] deploy animated thumbnails on watch view --- web/skins/classic/views/js/watch.js | 52 ++++++++++++++++++++----- web/skins/classic/views/js/watch.js.php | 2 + web/skins/classic/views/watch.php | 3 +- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index bff6246ea..8afccd78b 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -52,17 +52,14 @@ var params = // Called by bootstrap-table to retrieve zm event data function ajaxRequest(params) { - // Maintain legacy behavior of sorting by Id column only - delete params.data.order; - delete params.data.limit; - params.data.sort = 'Id desc'; - params.data.count = maxDisplayEvents; - params.data.id = monitorId; - if ( auth_hash ) params.data.auth = auth_hash; + // Maintain legacy behavior by statically setting these parameters + params.data.order = 'desc'; + params.data.limit = maxDisplayEvents; + params.data.sort = 'Id'; - $j.getJSON(thisUrl + '?view=request&request=status&entity=events', params.data) + $j.getJSON(thisUrl + '?view=request&request=events&task=query', params.data) .done(function(data) { - var rows = processRows(data.events); + var rows = processRows(data.rows); // rearrange the result into what bootstrap-table expects params.success({total: data.total, totalNotFiltered: data.totalNotFiltered, rows: rows}); }) @@ -74,17 +71,39 @@ function processRows(rows) { var eid = row.Id; var filterQuery = '&filter[Query][terms][0][attr]=MonitorId&filter[Query][terms][0][op]=%3d&filter[Query][terms][0][val]='+monitorId; + row.Delete = ''; row.Id = '' + eid + ''; row.Name = '' + row.Name + ''; row.Frames = '' + row.Frames + ''; row.AlarmFrames = '' + row.AlarmFrames + ''; row.MaxScore = '' + row.MaxScore + ''; - row.Delete = ''; + if ( LIST_THUMBS ) row.Thumbnail = '' + row.imgHtml + ''; }); return rows; } +function thumbnail_onmouseover(event) { + var img = event.target; + img.src = ''; + img.src = img.getAttribute('stream_src'); +} + +function thumbnail_onmouseout(event) { + var img = event.target; + img.src = ''; + img.src = img.getAttribute('still_src'); +} + +function initThumbAnimation() { + if ( ANIMATE_THUMBS ) { + $j('.colThumbnail img').each(function() { + this.addEventListener('mouseover', thumbnail_onmouseover, false); + this.addEventListener('mouseout', thumbnail_onmouseout, false); + }); + } +} + function showEvents() { $('ptzControls').addClass('hidden'); $('events').removeClass('hidden'); @@ -874,6 +893,19 @@ function initPage() { // Take appropriate action when the user clicks on a cell table.on('click-cell.bs.table', processClicks); + + // Some toolbar events break the thumbnail animation, so re-init eventlistener + table.on('all.bs.table', initThumbAnimation); + + // Update table links each time after new data is loaded + table.on('post-body.bs.table', function(data) { + var thumb_ndx = $j('#eventList tr th').filter(function() { + return $j(this).text().trim() == 'Thumbnail'; + }).index(); + var thmbClass = ANIMATE_THUMBS ? 'colThumbnail zoom' : 'colThumbnail'; + table.find("tr td:nth-child(" + (thumb_ndx+1) + ")").addClass(thmbClass); + }); + } // initPage // Kick everything off diff --git a/web/skins/classic/views/js/watch.js.php b/web/skins/classic/views/js/watch.js.php index 711b3d484..a61f0a8a8 100644 --- a/web/skins/classic/views/js/watch.js.php +++ b/web/skins/classic/views/js/watch.js.php @@ -50,6 +50,8 @@ var SCALE_BASE = ; var SOUND_ON_ALARM = ; var POPUP_ON_ALARM = ; +var LIST_THUMBS = ; +var ANIMATE_THUMBS = ; var streamMode = ""; var showMode = ""; diff --git a/web/skins/classic/views/watch.php b/web/skins/classic/views/watch.php index 79c7750a9..ae5790b77 100644 --- a/web/skins/classic/views/watch.php +++ b/web/skins/classic/views/watch.php @@ -182,6 +182,7 @@ if ( canView('Events') && ($monitor->Type() != 'WebSite') ) { + @@ -190,7 +191,7 @@ if ( canView('Events') && ($monitor->Type() != 'WebSite') ) { - + From a38c3922669a1190ea9d3d4d7b9c1ef3fcb90d07 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Thu, 3 Dec 2020 07:22:32 -0600 Subject: [PATCH 025/116] eslint --- web/skins/classic/views/js/watch.js | 1 - 1 file changed, 1 deletion(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 8afccd78b..92e024449 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -905,7 +905,6 @@ function initPage() { var thmbClass = ANIMATE_THUMBS ? 'colThumbnail zoom' : 'colThumbnail'; table.find("tr td:nth-child(" + (thumb_ndx+1) + ")").addClass(thmbClass); }); - } // initPage // Kick everything off From dd0cac35fe245a43885bd32ec7488a59f943a25b Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Thu, 3 Dec 2020 07:53:09 -0600 Subject: [PATCH 026/116] include filterquery in watch view event list ajax --- web/skins/classic/views/js/watch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 92e024449..0b560926c 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -7,6 +7,7 @@ var settingsBtn = $j('#settingsBtn'); var enableAlmBtn = $j('#enableAlmBtn'); var forceAlmBtn = $j('#forceAlmBtn'); var table = $j('#eventList'); +var filterQuery = '&filter[Query][terms][0][attr]=MonitorId&filter[Query][terms][0][op]=%3d&filter[Query][terms][0][val]='+monitorId; if ( monitorType != 'WebSite' ) { var streamCmdParms = 'view=request&request=stream&connkey='+connKey; @@ -57,7 +58,7 @@ function ajaxRequest(params) { params.data.limit = maxDisplayEvents; params.data.sort = 'Id'; - $j.getJSON(thisUrl + '?view=request&request=events&task=query', params.data) + $j.getJSON(thisUrl + '?view=request&request=events&task=query'+filterQuery, params.data) .done(function(data) { var rows = processRows(data.rows); // rearrange the result into what bootstrap-table expects @@ -69,7 +70,6 @@ function ajaxRequest(params) { function processRows(rows) { $j.each(rows, function(ndx, row) { var eid = row.Id; - var filterQuery = '&filter[Query][terms][0][attr]=MonitorId&filter[Query][terms][0][op]=%3d&filter[Query][terms][0][val]='+monitorId; row.Delete = ''; row.Id = '' + eid + ''; From 74fe47c4c54054d4c288e639876583bed96fb37e Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Thu, 3 Dec 2020 08:31:52 -0600 Subject: [PATCH 027/116] don't autorefresh watch view table --- web/skins/classic/views/js/watch.js | 3 ++- web/skins/classic/views/watch.php | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 0b560926c..2e29f028e 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -180,6 +180,7 @@ function setAlarmState( currentAlarmState ) { var oldAlarm = ( !isAlarmed && wasAlarmed ); if ( newAlarm ) { + table.bootstrapTable('refresh'); if ( SOUND_ON_ALARM ) { // Enable the alarm sound if ( !canPlayPauseAudio ) { @@ -193,6 +194,7 @@ function setAlarmState( currentAlarmState ) { } } if ( oldAlarm ) { // done with an event do a refresh + table.bootstrapTable('refresh'); if ( SOUND_ON_ALARM ) { // Disable alarm sound if ( !canPlayPauseAudio ) { @@ -201,7 +203,6 @@ function setAlarmState( currentAlarmState ) { $('MediaPlayer').Stop(); } } - table.bootstrapTable('refresh'); } lastAlarmState = alarmState; diff --git a/web/skins/classic/views/watch.php b/web/skins/classic/views/watch.php index ae5790b77..7c098f6f5 100644 --- a/web/skins/classic/views/watch.php +++ b/web/skins/classic/views/watch.php @@ -173,10 +173,6 @@ if ( canView('Events') && ($monitor->Type() != 'WebSite') ) { data-show-export="true" data-uncheckAll="true" data-buttons-class="btn btn-normal" - data-auto-refresh="true" - data-auto-refresh-silent="true" - data-show-refresh="true" - data-auto-refresh-interval="5" class="table-sm table-borderless" > From ce4d9cd6572257a4c4afc9d197bf51010b87bc05 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Thu, 3 Dec 2020 08:38:28 -0600 Subject: [PATCH 028/116] put back manual refresh button on watch view --- web/skins/classic/views/watch.php | 1 + 1 file changed, 1 insertion(+) diff --git a/web/skins/classic/views/watch.php b/web/skins/classic/views/watch.php index 7c098f6f5..a6c05cc06 100644 --- a/web/skins/classic/views/watch.php +++ b/web/skins/classic/views/watch.php @@ -173,6 +173,7 @@ if ( canView('Events') && ($monitor->Type() != 'WebSite') ) { data-show-export="true" data-uncheckAll="true" data-buttons-class="btn btn-normal" + data-show-refresh="true" class="table-sm table-borderless" > From 19122d0824b44a6b3433ed7d7b78dd945464d24b Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 10:25:59 -0500 Subject: [PATCH 029/116] Fix bandwidth dropdown clicking --- web/skins/classic/js/skin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index 85449927c..a22f48021 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -639,7 +639,7 @@ function delCookie(name) { } function bwClickFunction() { - $j("#dropdown_bandwidth a").click(function() { + $j(".dropdown-menu a").click(function() { var bwval = $j(this).data('pdsa-dropdown-val'); setCookie("zmBandwidth", bwval, 3600); getNavBar(); From 6877054feadfd9bdc359da48ebeb21549ad6ae9c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 11:17:41 -0500 Subject: [PATCH 030/116] Parse tree dumping should be debug not warning --- web/skins/classic/views/timeline.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/timeline.php b/web/skins/classic/views/timeline.php index c4f11d312..53ea0f03d 100644 --- a/web/skins/classic/views/timeline.php +++ b/web/skins/classic/views/timeline.php @@ -145,7 +145,7 @@ $tree = false; if ( isset($_REQUEST['filter']) ) { $filter = ZM\Filter::parse($_REQUEST['filter']); $tree = $filter->tree(); - ZM\Warning("Parse tree: " . print_r($tree,true)); + ZM\Debug('Parse tree: ' . print_r($tree,true)); } if ( isset($_REQUEST['range']) ) From b5e4d242ba3960ab5f68039aa00ddf50f2b44e03 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 11:23:25 -0500 Subject: [PATCH 031/116] Add zm_update-1.35.15.sql that will attempt to add EndTime term to stock filters. --- db/zm_update-1.35.15.sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 db/zm_update-1.35.15.sql diff --git a/db/zm_update-1.35.15.sql b/db/zm_update-1.35.15.sql new file mode 100644 index 000000000..040e8d706 --- /dev/null +++ b/db/zm_update-1.35.15.sql @@ -0,0 +1,12 @@ +/* +Add the EndTime IS NOT NULL term to the Update Disk Space Filter. +This will only work if they havn't modified the stock filter + */ +UPDATE Filters SET Query_json='{"terms":[{"attr":"DiskSpace","op":"IS","val":"NULL"},{"cnj":"and","obr":"0","attr":"EndDateTime","op":"IS NOT","val":"NULL","cbr":"0"}]}' WHERE Query_json='{"terms":[{"attr":"DiskSpace","op":"IS","val":"NULL"}]}'; + +/* +Add the EndTime IS NOT NULL term to the Purge When Full Filter. +This will only work if they havn't modified the stock filter . +This is important to prevent SQL Errors inserting into Frames table if PurgeWhenFull deletes in-progress events. + */ +UPDATE Filters SET Query_json='{"sort_field":"Id","terms":[{"val":0,"attr":"Archived","op":"="},{"cnj":"and","val":95,"attr":"DiskPercent","op":">="},{"cnj":"and","obr":"0","attr":"EndDateTime","op":"IS NOT","val":"NULL","cbr":"0"}],"limit":100,"sort_asc":1}' WHERE Query_json='{"sort_field":"Id","terms":[{"val":0,"attr":"Archived","op":"="},{"cnj":"and","val":95,"attr":"DiskPercent","op":">="}],"limit":100,"sort_asc":1}'; From 8ddde0d37734652ae1887882112f13a8383ab971 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 13:11:24 -0500 Subject: [PATCH 032/116] Update stock PurgeWhenFull and UpdateDiskSpace filters to add EndTime terms. Add FOREIGN KEYS to Groups_Monitors and Groups.ParentId --- db/zm_create.sql.in | 3 +++ db/zm_update-1.35.15.sql | 58 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/db/zm_create.sql.in b/db/zm_create.sql.in index 8cbd7866d..fc1a6a552 100644 --- a/db/zm_create.sql.in +++ b/db/zm_create.sql.in @@ -337,6 +337,7 @@ CREATE TABLE `Groups` ( `Id` int(10) unsigned NOT NULL auto_increment, `Name` varchar(64) NOT NULL default '', `ParentId` int(10) unsigned, + FOREIGN KEY (`ParentId`) REFERENCES `Groups` (`Id`) ON DELETE CASCADE, PRIMARY KEY (`Id`) ) ENGINE=@ZM_MYSQL_ENGINE@; @@ -348,7 +349,9 @@ DROP TABLE IF EXISTS `Groups_Monitors`; CREATE TABLE `Groups_Monitors` ( `Id` INT(10) unsigned NOT NULL auto_increment, `GroupId` int(10) unsigned NOT NULL, + FOREIGN KEY (`GroupId`) REFERENCES `Groups` (`Id`) ON DELETE CASCADE, `MonitorId` int(10) unsigned NOT NULL, + FOREIGN KEY (`MonitorId`) REFERENCES `Monitors` (`Id`) ON DELETE CASCADE, PRIMARY KEY (`Id`) ) ENGINE=@ZM_MYSQL_ENGINE@; diff --git a/db/zm_update-1.35.15.sql b/db/zm_update-1.35.15.sql index 040e8d706..65f4e5426 100644 --- a/db/zm_update-1.35.15.sql +++ b/db/zm_update-1.35.15.sql @@ -10,3 +10,61 @@ This will only work if they havn't modified the stock filter . This is important to prevent SQL Errors inserting into Frames table if PurgeWhenFull deletes in-progress events. */ UPDATE Filters SET Query_json='{"sort_field":"Id","terms":[{"val":0,"attr":"Archived","op":"="},{"cnj":"and","val":95,"attr":"DiskPercent","op":">="},{"cnj":"and","obr":"0","attr":"EndDateTime","op":"IS NOT","val":"NULL","cbr":"0"}],"limit":100,"sort_asc":1}' WHERE Query_json='{"sort_field":"Id","terms":[{"val":0,"attr":"Archived","op":"="},{"cnj":"and","val":95,"attr":"DiskPercent","op":">="}],"limit":100,"sort_asc":1}'; + +/* Add FOREIGN KEYS After deleting lost records */ +set @exist := (select count(*) FROM information_schema.key_column_usage where table_name='Groups_Monitors' and column_name='GroupId' and referenced_table_name='Groups' and referenced_column_name='Id'); + +set @sqlstmt := if( @exist > 1, "SELECT 'You have more than 1 FOREIGN KEY. Please do manual cleanup'", "SELECT 'Ok'"); +set @sqlstmt := if( @exist = 1, "SELECT 'FOREIGN KEY GroupId in Groups_Monitors already exists'", @sqlstmt); +set @sqlstmt := if( @exist = 0, "SELECT 'Adding foreign key for GroupId to Groups_Monitors'", @sqlstmt); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; + +set @sqlstmt := if( @exist = 0, "SELECT 'Deleting unlinked Groups_Monitors'", "SELECT '.'"); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; +set @sqlstmt := if( @exist = 0, "DELETE FROM `Groups_Monitors` WHERE `GroupId` NOT IN (SELECT `Id` FROM `Groups`)", "SELECT '.'"); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; +set @sqlstmt := if( @exist = 0, "ALTER TABLE `Groups_Monitors` ADD FOREIGN KEY (`GroupId`) REFERENCES `Groups` (`Id`) ON DELETE CASCADE", "SELECT '.'"); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; + +/* Add FOREIGN KEYS After deleting lost records */ +set @exist := (select count(*) FROM information_schema.key_column_usage where table_name='Groups_Monitors' and column_name='MonitorId' and referenced_table_name='Monitors' and referenced_column_name='Id'); + +set @sqlstmt := if( @exist > 1, "SELECT 'You have more than 1 FOREIGN KEY. Please do manual cleanup'", "SELECT 'Ok'"); +set @sqlstmt := if( @exist = 1, "SELECT 'FOREIGN KEY MonitorId in Groups_Monitors already exists'", @sqlstmt); +set @sqlstmt := if( @exist = 0, "SELECT 'Adding foreign key for MonitorId to Groups_Monitors'", @sqlstmt); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; + +set @sqlstmt := if( @exist = 0, "SELECT 'Deleting unlinked Groups_Monitors'", "SELECT '.'"); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; +set @sqlstmt := if( @exist = 0, "DELETE FROM `Groups_Monitors` WHERE `MonitorId` NOT IN (SELECT `Id` FROM `Monitors`)", "SELECT '.'"); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; +set @sqlstmt := if( @exist = 0, "ALTER TABLE `Groups_Monitors` ADD FOREIGN KEY (`MonitorId`) REFERENCES `Monitors` (`Id`) ON DELETE CASCADE", "SELECT '.'"); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; + +/* Add FOREIGN KEYS After deleting lost records */ +set @exist := (select count(*) FROM information_schema.key_column_usage where table_name='Groups' and column_name='ParentId' and referenced_table_name='Groups' and referenced_column_name='Id'); + +set @sqlstmt := if( @exist > 1, "SELECT 'You have more than 1 FOREIGN KEY. Please do manual cleanup'", "SELECT 'Ok'"); +set @sqlstmt := if( @exist = 1, "SELECT 'FOREIGN KEY ParentId in Groups already exists'", @sqlstmt); +set @sqlstmt := if( @exist = 0, "SELECT 'Adding foreign key for ParentId to Groups'", @sqlstmt); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; + +set @sqlstmt := if( @exist = 0, "SELECT 'Deleting unlinked Groups'", "SELECT '.'"); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; +set @sqlstmt := if( @exist = 0, "UPDATE `Groups` SET `ParentId` = NULL WHERE (ParentId IS NOT NULL) and ParentId NOT IN (SELECT * FROM(SELECT Id FROM `Groups`)tblTmp)", "SELECT '.'"); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; +set @sqlstmt := if( @exist = 0, "ALTER TABLE `Groups` ADD FOREIGN KEY (ParentId) REFERENCES `Groups` (Id) ON DELETE CASCADE", "SELECT '.'"); +PREPARE stmt FROM @sqlstmt; +EXECUTE stmt; + From 05bd6e1c568102d09f228ce50658151114e3d47f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 13:14:19 -0500 Subject: [PATCH 033/116] Fix editing groups causing a new Group to be added. You have to tell cakephp which Group you are saving. Also fix the resulting output to be the saved group, not a list of monitors. Fixes #3088 --- web/api/app/Controller/GroupsController.php | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/web/api/app/Controller/GroupsController.php b/web/api/app/Controller/GroupsController.php index f4185fe76..f7ed57637 100644 --- a/web/api/app/Controller/GroupsController.php +++ b/web/api/app/Controller/GroupsController.php @@ -116,23 +116,23 @@ class GroupsController extends AppController { throw new UnauthorizedException(__('Insufficient Privileges')); return; } + $this->Group->id = $id; if ( $this->Group->save($this->request->data) ) { - return $this->flash( - __('The group has been saved.'), - array('action' => 'index') - ); + $message = 'Saved'; } else { $message = 'Error'; + // if there is a validation message, use it + if ( !$this->group->validates() ) { + $message .= ': '.$this->Group->validationErrors; + } } - } else { - $options = array('conditions' => array('Group.' . $this->Group->primaryKey => $id)); - $this->request->data = $this->Group->find('first', $options); - } - $monitors = $this->Group->Monitor->find('list'); + } # end if post/put + + $group = $this->Group->findById($id); $this->set(array( 'message' => $message, - 'monitors'=> $monitors, - '_serialize' => array('message') + 'group' => $group, + '_serialize' => array('group') )); } From 1c45019eeba12347399e3d8fb8b21e5fea3cdc30 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 13:16:42 -0500 Subject: [PATCH 034/116] Bump version to 1.35.15 --- distros/redhat/zoneminder.spec | 2 +- version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/distros/redhat/zoneminder.spec b/distros/redhat/zoneminder.spec index c1d6283f2..6d2e2a88e 100644 --- a/distros/redhat/zoneminder.spec +++ b/distros/redhat/zoneminder.spec @@ -28,7 +28,7 @@ %global _hardened_build 1 Name: zoneminder -Version: 1.35.14 +Version: 1.35.15 Release: 1%{?dist} Summary: A camera monitoring and analysis tool Group: System Environment/Daemons diff --git a/version b/version index 31d4ef08d..aa76ce17f 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.35.14 +1.35.15 From 7ef34bce7b2e5170c1a1eff9cc8953c5581a3367 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 13:30:51 -0500 Subject: [PATCH 035/116] Include new fonts dir in install --- distros/ubuntu1604/zoneminder.dirs | 1 + distros/ubuntu1604/zoneminder.install | 1 + distros/ubuntu2004/zoneminder.dirs | 1 + distros/ubuntu2004/zoneminder.install | 1 + 4 files changed, 4 insertions(+) diff --git a/distros/ubuntu1604/zoneminder.dirs b/distros/ubuntu1604/zoneminder.dirs index 6db3d5a95..3c7237bf3 100644 --- a/distros/ubuntu1604/zoneminder.dirs +++ b/distros/ubuntu1604/zoneminder.dirs @@ -5,5 +5,6 @@ var/cache/zoneminder/images var/cache/zoneminder/temp var/cache/zoneminder/cache usr/share/zoneminder/db +usr/share/zoneminder/fonts etc/zm/ etc/zm/conf.d diff --git a/distros/ubuntu1604/zoneminder.install b/distros/ubuntu1604/zoneminder.install index 67b135de5..17364c744 100644 --- a/distros/ubuntu1604/zoneminder.install +++ b/distros/ubuntu1604/zoneminder.install @@ -5,6 +5,7 @@ usr/lib/zoneminder usr/share/polkit-1 usr/share/zoneminder/db usr/share/zoneminder/www +usr/share/zoneminder/fonts # libzoneminder-perl files: usr/share/man/man3 diff --git a/distros/ubuntu2004/zoneminder.dirs b/distros/ubuntu2004/zoneminder.dirs index 6db3d5a95..3c7237bf3 100644 --- a/distros/ubuntu2004/zoneminder.dirs +++ b/distros/ubuntu2004/zoneminder.dirs @@ -5,5 +5,6 @@ var/cache/zoneminder/images var/cache/zoneminder/temp var/cache/zoneminder/cache usr/share/zoneminder/db +usr/share/zoneminder/fonts etc/zm/ etc/zm/conf.d diff --git a/distros/ubuntu2004/zoneminder.install b/distros/ubuntu2004/zoneminder.install index 67b135de5..17364c744 100644 --- a/distros/ubuntu2004/zoneminder.install +++ b/distros/ubuntu2004/zoneminder.install @@ -5,6 +5,7 @@ usr/lib/zoneminder usr/share/polkit-1 usr/share/zoneminder/db usr/share/zoneminder/www +usr/share/zoneminder/fonts # libzoneminder-perl files: usr/share/man/man3 From cfd4c17953f660621fc84d51d6ef6f07c836caa5 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 13:35:12 -0500 Subject: [PATCH 036/116] Include invalid font path in the error message --- src/zm_image.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 0a74d19c8..f40fdf527 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -492,9 +492,9 @@ void Image::Initialise() { b_u_table = b_u_table_global; int res = font.ReadFontFile(config.font_file_location); - if( res == -1 ) { - Panic("Invalid font location."); - } else if( res == -2 || res == -3 || res == -4 ) { + if ( res == -1 ) { + Panic("Invalid font location: %s", config.font_file_location); + } else if ( res == -2 || res == -3 || res == -4 ) { Panic("Invalid font file."); } initialised = true; From e93de2a3a42299b0dfb852ed4cbcef8d934e60a4 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Thu, 3 Dec 2020 13:12:01 -0600 Subject: [PATCH 037/116] partial jquery convesion of watch.js --- web/skins/classic/views/js/watch.js | 70 ++++++++++++++--------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 2e29f028e..979641eec 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -105,31 +105,31 @@ function initThumbAnimation() { } function showEvents() { - $('ptzControls').addClass('hidden'); - $('events').removeClass('hidden'); - if ( $('eventsControl') ) { - $('eventsControl').addClass('hidden'); + $j('#ptzControls').addClass('hidden'); + $j('#events').removeClass('hidden'); + if ( $j('#eventsControl') ) { + $j('#eventsControl').addClass('hidden'); } - if ( $('controlControl') ) { - $('controlControl').removeClass('hidden'); + if ( $j('#controlControl') ) { + $j('#controlControl').removeClass('hidden'); } showMode = 'events'; } function showPtzControls() { - $('events').addClass('hidden'); - $('ptzControls').removeClass('hidden'); - if ( $('eventsControl') ) { - $('eventsControl').removeClass('hidden'); + $j('#events').addClass('hidden'); + $j('#ptzControls').removeClass('hidden'); + if ( $j('#eventsControl') ) { + $j('#eventsControl').removeClass('hidden'); } - if ( $('controlControl') ) { - $('controlControl').addClass('hidden'); + if ( $j('#controlControl') ) { + $j('#controlControl').addClass('hidden'); } showMode = 'control'; } function changeScale() { - var scale = $('scale').get('value'); + var scale = $j('#scale').val(); var newWidth; var newHeight; if ( scale == '0' || scale == 'auto' ) { @@ -166,11 +166,11 @@ function setAlarmState( currentAlarmState ) { } else if ( alarmState == STATE_ALERT ) { stateClass = 'alert'; } - $('stateValue').set('text', stateStrings[alarmState]); + $j('#stateValue').text(stateStrings[alarmState]); if ( stateClass ) { - $('stateValue').setProperty('class', stateClass); + $j('#stateValue').addClass(stateClass); } else { - $('stateValue').removeProperty('class'); + $j('#stateValue').removeClass(); } var isAlarmed = ( alarmState == STATE_ALARM || alarmState == STATE_ALERT ); @@ -227,11 +227,11 @@ function getStreamCmdResponse(respObj, respText) { // The get status command can get backed up, in which case we won't be able to get the semaphore and will exit. if ( respObj.status ) { streamStatus = respObj.status; - $('fpsValue').set('text', streamStatus.fps); + $j('#fpsValue').text(streamStatus.fps); setAlarmState(streamStatus.state); - $('levelValue').set('text', streamStatus.level); + $j('#levelValue').text(streamStatus.level); if ( streamStatus.level > 95 ) { $('levelValue').className = 'alarm'; } else if ( streamStatus.level > 80 ) { @@ -243,19 +243,19 @@ function getStreamCmdResponse(respObj, respText) { var delayString = secsToTime(streamStatus.delay); if ( streamStatus.paused == true ) { - $('modeValue').set('text', 'Paused'); - $('rate').addClass('hidden'); - $('delayValue').set('text', delayString); - $('delay').removeClass('hidden'); - $('level').removeClass('hidden'); + $j('#modeValue').text('Paused'); + $j('#rate').addClass('hidden'); + $j('#delayValue').text(delayString); + $j('#delay').removeClass('hidden'); + $j('#level').removeClass('hidden'); streamCmdPause(false); } else if ( streamStatus.delayed == true ) { - $('modeValue').set('text', 'Replay'); - $('rateValue').set('text', streamStatus.rate); - $('rate').removeClass('hidden'); - $('delayValue').set('text', delayString); - $('delay').removeClass('hidden'); - $('level').removeClass('hidden'); + $j('#modeValue').text('Replay'); + $j('#rateValue').text(streamStatus.rate); + $j('#rate').removeClass('hidden'); + $j('#delayValue').text(delayString); + $j('#delay').removeClass('hidden'); + $j('#level').removeClass('hidden'); if ( streamStatus.rate == 1 ) { streamCmdPlay(false); } else if ( streamStatus.rate > 0 ) { @@ -272,14 +272,14 @@ function getStreamCmdResponse(respObj, respText) { } } // rate } else { - $('modeValue').set( 'text', 'Live' ); - $('rate').addClass( 'hidden' ); - $('delay').addClass( 'hidden' ); - $('level').addClass( 'hidden' ); + $j('#modeValue').text( 'Live' ); + $j('#rate').addClass( 'hidden' ); + $j('#delay').addClass( 'hidden' ); + $j('#level').addClass( 'hidden' ); streamCmdPlay(false); } // end if paused or delayed - $('zoomValue').set('text', streamStatus.zoom); + $j('zoomValue').text(streamStatus.zoom); if ( streamStatus.zoom == '1.0' ) { setButtonState('zoomOutBtn', 'unavail'); } else { @@ -509,7 +509,7 @@ function getStatusCmdResponse(respObj, respText) { } if ( respObj.result == 'Ok' ) { - $('fpsValue').set('text', respObj.monitor.FrameRate); + $j('#fpsValue').text(respObj.monitor.FrameRate); setAlarmState(respObj.monitor.Status); } else { checkStreamForErrors('getStatusCmdResponse', respObj); From 6e64114ac3c508db582c1272df4f209fd570f24a Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 14:26:51 -0500 Subject: [PATCH 038/116] Skip row locking in UpdateDiskSpace if the filter is already locking rows --- scripts/zmfilter.pl.in | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/zmfilter.pl.in b/scripts/zmfilter.pl.in index 38873e348..e812a3bd9 100644 --- a/scripts/zmfilter.pl.in +++ b/scripts/zmfilter.pl.in @@ -381,8 +381,10 @@ sub checkFilter { } # end if AutoCopy if ( $filter->{UpdateDiskSpace} ) { - $ZoneMinder::Database::dbh->begin_work(); - $Event->lock_and_load(); + if ( $$filter{LockRows} ) { + $ZoneMinder::Database::dbh->begin_work(); + $Event->lock_and_load(); + } my $old_diskspace = $$Event{DiskSpace}; my $new_diskspace = $Event->DiskSpace(undef); @@ -394,7 +396,7 @@ sub checkFilter { ) { $Event->save(); } - $ZoneMinder::Database::dbh->commit(); + $ZoneMinder::Database::dbh->commit() if !$$filter{LockRows}; } # end if UpdateDiskSpace } # end foreach event ZoneMinder::Database::end_transaction($dbh, $in_transaction) if $$filter{LockRows}; From 5a489b3e99f2c902c3cb456d4f3cb677d3df9fc8 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 14:28:03 -0500 Subject: [PATCH 039/116] Fall back to whatever Storage Areas are in the db or ZM_DIR_EVENTS if not specified in getDIskPercent and getDiskBlocks. Fixes #3081 --- scripts/ZoneMinder/lib/ZoneMinder/Filter.pm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm index 0c78c33ca..84f51a493 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm @@ -92,11 +92,13 @@ sub Execute { } if ( $self->{HasDiskPercent} ) { - my $disk_percent = getDiskPercent($$self{Storage} ? $$self{Storage}->Path() : ()); + $$self{Storage} = ZoneMinder::Storage->find_one() if ! $$self{Storage}; + my $disk_percent = getDiskPercent($$self{Storage} ? $$self{Storage}->Path() : $Config{ZM_DIR_EVENTS}); $sql =~ s/zmDiskPercent/$disk_percent/g; } if ( $self->{HasDiskBlocks} ) { - my $disk_blocks = getDiskBlocks(); + $$self{Storage} = ZoneMinder::Storage->find_one() if ! $$self{Storage}; + my $disk_blocks = getDiskBlocks($$self{Storage} ? $$self{Storage}->Path() : $Config{ZM_DIR_EVENTS}); $sql =~ s/zmDiskBlocks/$disk_blocks/g; } if ( $self->{HasSystemLoad} ) { @@ -421,7 +423,7 @@ sub getDiskPercent { } sub getDiskBlocks { - my $command = 'df .'; + my $command = 'df ' . ($_[0] ? $_[0] : '.'); my $df = qx( $command ); my $space = -1; if ( $df =~ /\s(\d+)\s+\d+\s+\d+%/ms ) { From b30b4cd66a9d325bf8ff61be24eac7d57fb00528 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 14:28:03 -0500 Subject: [PATCH 040/116] Fall back to whatever Storage Areas are in the db or ZM_DIR_EVENTS if not specified in getDIskPercent and getDiskBlocks. Fixes #3081 --- scripts/ZoneMinder/lib/ZoneMinder/Filter.pm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm index 8704ed978..13c90d671 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Filter.pm @@ -98,11 +98,13 @@ sub Execute { my $sql = $self->Sql(undef); if ( $self->{HasDiskPercent} ) { - my $disk_percent = getDiskPercent($$self{Storage} ? $$self{Storage}->Path() : ()); + $$self{Storage} = ZoneMinder::Storage->find_one() if ! $$self{Storage}; + my $disk_percent = getDiskPercent($$self{Storage} ? $$self{Storage}->Path() : $Config{ZM_DIR_EVENTS}); $sql =~ s/zmDiskPercent/$disk_percent/g; } if ( $self->{HasDiskBlocks} ) { - my $disk_blocks = getDiskBlocks(); + $$self{Storage} = ZoneMinder::Storage->find_one() if ! $$self{Storage}; + my $disk_blocks = getDiskBlocks($$self{Storage} ? $$self{Storage}->Path() : $Config{ZM_DIR_EVENTS}); $sql =~ s/zmDiskBlocks/$disk_blocks/g; } if ( $self->{HasSystemLoad} ) { @@ -397,7 +399,7 @@ sub getDiskPercent { } sub getDiskBlocks { - my $command = 'df .'; + my $command = 'df ' . ($_[0] ? $_[0] : '.'); my $df = qx( $command ); my $space = -1; if ( $df =~ /\s(\d+)\s+\d+\s+\d+%/ms ) { From 330327ded0634d766fb9e4a247df09dc3a51d6f8 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 16:21:18 -0500 Subject: [PATCH 041/116] Improve code readability. Use a define for header size --- src/zm_font.cpp | 20 +++++++++++--------- src/zm_font.h | 4 +++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/zm_font.cpp b/src/zm_font.cpp index 77132e32e..3c1cc9aef 100644 --- a/src/zm_font.cpp +++ b/src/zm_font.cpp @@ -15,9 +15,11 @@ int ZmFont::ReadFontFile(const std::string &loc) { font = new ZMFONT; + size_t header_size = 8 + (sizeof(ZMFONT_BH) * NUM_FONT_SIZES); + // MAGIC + pad + BitmapHeaders - size_t readsize = fread(&font[0], 1, 8 + (sizeof(ZMFONT_BH) * 4), f); - if ( readsize < 8 + (sizeof(ZMFONT_BH) * 4) ) { + size_t readsize = fread(&font[0], 1, header_size, f); + if ( readsize < header_size ) { delete font; font = nullptr; return -2; // EOF reached, invalid file @@ -26,25 +28,25 @@ int ZmFont::ReadFontFile(const std::string &loc) { if ( memcmp(font->MAGIC, "ZMFNT", 5) != 0 ) // Check whether magic is correct return -3; - for ( int i = 0; i < 4; i++ ) { + for ( int i = 0; i < NUM_FONT_SIZES; i++ ) { /* Character Width cannot be greater than 64 as a row is represented as a uint64_t, height cannot be greater than 200(arbitary number which i have chosen, shouldn't need more than this) and idx should not be more than filesize */ - if ( (font->header[i].charWidth > 64 && font->header[i].charWidth == 0) || \ - (font->header[i].charHeight > 200 && font->header[i].charHeight == 0) || \ - (font->header[i].idx > st.st_size) ) { + if ( (font->header[i].charWidth > 64 && font->header[i].charWidth == 0) || + (font->header[i].charHeight > 200 && font->header[i].charHeight == 0) || + (font->header[i].idx > st.st_size) ) { delete font; font = nullptr; return -4; } - } + } // end foreach font size - datasize = st.st_size - (8 + sizeof(ZMFONT_BH) * 4); + datasize = st.st_size - header_size; font->data = new uint64_t[datasize/sizeof(uint64_t)]; readsize = fread(&font->data[0], 1, datasize, f); - if( readsize < datasize) { // Shouldn't happen + if ( readsize < datasize ) { // Shouldn't happen delete[] font->data; font->data = nullptr; delete font; diff --git a/src/zm_font.h b/src/zm_font.h index 8783026a6..4753129ff 100644 --- a/src/zm_font.h +++ b/src/zm_font.h @@ -4,6 +4,8 @@ #include #include +#define NUM_FONT_SIZES 4 + struct ZMFONT_BH{ uint16_t charHeight; // Height of every character uint16_t charWidth; // Width of every character @@ -15,7 +17,7 @@ struct ZMFONT_BH{ struct ZMFONT { char MAGIC[6]; // ZMFNT\0 char pad[2]; - ZMFONT_BH header[4]; + ZMFONT_BH header[NUM_FONT_SIZES]; uint64_t *data; }; From 1bbcf4ea31b56bcb434c8f080fb03acca7edd912 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 16:43:27 -0500 Subject: [PATCH 042/116] spacing and make assignments a little more readable/efficient maybe --- src/zm_image.cpp | 88 ++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/src/zm_image.cpp b/src/zm_image.cpp index f40fdf527..de5957d67 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -1935,7 +1935,13 @@ void Image::MaskPrivacy( const unsigned char *p_bitmask, const Rgb pixel_colour /* Bitmap decoding trick has been adopted from here: https://lemire.me/blog/2018/02/21/iterating-over-set-bits-quickly/ */ -void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int size, const Rgb fg_colour, const Rgb bg_colour ) { +void Image::Annotate( + const char *p_text, + const Coord &coord, + const unsigned int size, + const Rgb fg_colour, + const Rgb bg_colour + ) { strncpy(text, p_text, sizeof(text)-1); unsigned int index = 0; @@ -1970,7 +1976,7 @@ void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int unsigned int min_line_x = 0; unsigned int max_line_x = width - line_width; - unsigned int min_line_y = 0; + unsigned int min_line_y = 0; unsigned int max_line_y = height - char_height; if ( lo_line_x > max_line_x ) @@ -1997,9 +2003,9 @@ void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int unsigned char *temp_ptr = ptr; for ( unsigned int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) { if ( line[c] > 0xFF ) { - Warning("Unsupported character %c in %s", line[c], line); - continue; - } + Warning("Unsupported character %c in %s", line[c], line); + continue; + } uint64_t f = font_bitmap[(line[c] * char_height) + r]; if ( !bg_trans ) memset(temp_ptr, bg_bw_col, char_width); while ( f != 0 ) { @@ -2017,27 +2023,29 @@ void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int for ( unsigned int y = lo_line_y, r = 0; y < hi_line_y && r < char_height; y++, r++, ptr += wc ) { unsigned char *temp_ptr = ptr; for ( unsigned int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) { - if ( line[c] > 0xFF ) { - Warning("Unsupported character %c in %s", line[c], line); - continue; + if ( line[c] > 0xFF ) { + Warning("Unsupported character %c in %s", line[c], line); + continue; + } + uint64_t f = font_bitmap[(line[c] * char_height) + r]; + if ( !bg_trans ) { + for ( int i = 0; i < char_width; i++ ) { // We need to set individual r,g,b components + unsigned char *colour_ptr = temp_ptr + (i*3); + RED_PTR_RGBA(colour_ptr) = bg_r_col; + GREEN_PTR_RGBA(colour_ptr) = bg_g_col; + BLUE_PTR_RGBA(colour_ptr) = bg_b_col; } - uint64_t f = font_bitmap[(line[c] * char_height) + r]; - if ( !bg_trans ) { - for( int i = 0; i < char_width; i++ ) { // We need to set individual r,g,b components - RED_PTR_RGBA((temp_ptr + (i*3))) = bg_r_col; - GREEN_PTR_RGBA((temp_ptr + (i*3))) = bg_g_col; - BLUE_PTR_RGBA((temp_ptr + (i*3))) = bg_b_col; - } - } - while ( f != 0 ) { - uint64_t t = f & -f; - int idx = char_width - __builtin_ctzll(f >> 2); - RED_PTR_RGBA((temp_ptr + (idx*3))) = fg_r_col; - GREEN_PTR_RGBA((temp_ptr + (idx*3))) = fg_g_col; - BLUE_PTR_RGBA((temp_ptr + (idx*3))) = fg_b_col; - f ^= t; - } - temp_ptr += char_width * colours; + } + while ( f != 0 ) { + uint64_t t = f & -f; + int idx = char_width - __builtin_ctzll(f >> 2); + unsigned char *colour_ptr = temp_ptr + (idx*3); + RED_PTR_RGBA(colour_ptr) = fg_r_col; + GREEN_PTR_RGBA(colour_ptr) = fg_g_col; + BLUE_PTR_RGBA(colour_ptr) = fg_b_col; + f ^= t; + } + temp_ptr += char_width * colours; } } } else if ( colours == ZM_COLOUR_RGB32 ) { @@ -2048,22 +2056,22 @@ void Image::Annotate( const char *p_text, const Coord &coord, const unsigned int Rgb* temp_ptr = (Rgb*)ptr; for ( unsigned int x = lo_line_x, c = 0; x < hi_line_x && c < line_len; c++ ) { if ( line[c] > 0xFF ) { - Warning("Unsupported character %c in %s", line[c], line); - continue; - } - uint64_t f = font_bitmap[(line[c] * char_height) + r]; - if ( !bg_trans ) { - for( int i = 0; i < char_width; i++ ) - *(temp_ptr + i) = bg_rgb_col; - } - while ( f != 0 ) { - uint64_t t = f & -f; - int idx = char_width - __builtin_ctzll(f >> 2); - *(temp_ptr + idx) = fg_rgb_col; - f ^= t; - } - temp_ptr += char_width; + Warning("Unsupported character %c in %s", line[c], line); + continue; } + uint64_t f = font_bitmap[(line[c] * char_height) + r]; + if ( !bg_trans ) { + for ( int i = 0; i < char_width; i++ ) + *(temp_ptr + i) = bg_rgb_col; + } + while ( f != 0 ) { + uint64_t t = f & -f; + int idx = char_width - __builtin_ctzll(f >> 2); + *(temp_ptr + idx) = fg_rgb_col; + f ^= t; + } + temp_ptr += char_width; + } } } else { From b2e5df1854318c6b5ef1fe1d23154e93ded60682 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 3 Dec 2020 18:31:41 -0500 Subject: [PATCH 043/116] Need to -1 to size parameter when calling SetFontSize --- src/zm_image.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/zm_image.cpp b/src/zm_image.cpp index de5957d67..0a8312b93 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -1882,7 +1882,7 @@ const Coord Image::centreCoord( const char *text, int size=1 ) const { line_no++; } - font.SetFontSize(size); + font.SetFontSize(size-1); uint16_t char_width = font.GetCharWidth(); uint16_t char_height = font.GetCharHeight(); int x = (width - (max_line_len * char_width )) / 2; @@ -1963,10 +1963,11 @@ void Image::Annotate( const Rgb bg_rgb_col = rgb_convert(bg_colour, subpixelorder); const bool bg_trans = (bg_colour == RGB_TRANSPARENT); - font.SetFontSize(size); + font.SetFontSize(size-1); const uint16_t char_width = font.GetCharWidth(); const uint16_t char_height = font.GetCharHeight(); const uint64_t *font_bitmap = font.GetBitmapData(); + Debug(1, "Font size %d, char_width %d char_height %d", size, char_width, char_height); while ( (index < text_len) && (line_len = strcspn(line, "\n")) ) { unsigned int line_width = line_len * char_width; @@ -1975,6 +1976,7 @@ void Image::Annotate( unsigned int lo_line_y = coord.Y() + (line_no * char_height); unsigned int min_line_x = 0; + // FIXME What if line_width > width? unsigned int max_line_x = width - line_width; unsigned int min_line_y = 0; unsigned int max_line_y = height - char_height; From 8012438573e72f142ce72d7c946b17543d9f270e Mon Sep 17 00:00:00 2001 From: hax0kartik Date: Fri, 4 Dec 2020 05:22:54 +0530 Subject: [PATCH 044/116] Fix font rendering issue --- fonts/default.zmfnt | Bin 448872 -> 224472 bytes src/zm_image.cpp | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fonts/default.zmfnt b/fonts/default.zmfnt index aea4980cbf5d6d54d39d8df0df6f7c1792cfb447..e74a798a007b80ef897344b8536712cd1153ecc9 100644 GIT binary patch literal 224472 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 AR{#J2 diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 0a8312b93..b6926c1ff 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -2012,7 +2012,7 @@ void Image::Annotate( if ( !bg_trans ) memset(temp_ptr, bg_bw_col, char_width); while ( f != 0 ) { uint64_t t = f & -f; - int idx = char_width - __builtin_ctzll(f>>2); + int idx = char_width - __builtin_ctzll(f); *(temp_ptr + idx) = fg_bw_col; f ^= t; } @@ -2040,7 +2040,7 @@ void Image::Annotate( } while ( f != 0 ) { uint64_t t = f & -f; - int idx = char_width - __builtin_ctzll(f >> 2); + int idx = char_width - __builtin_ctzll(f); unsigned char *colour_ptr = temp_ptr + (idx*3); RED_PTR_RGBA(colour_ptr) = fg_r_col; GREEN_PTR_RGBA(colour_ptr) = fg_g_col; @@ -2068,7 +2068,7 @@ void Image::Annotate( } while ( f != 0 ) { uint64_t t = f & -f; - int idx = char_width - __builtin_ctzll(f >> 2); + int idx = char_width - __builtin_ctzll(f); *(temp_ptr + idx) = fg_rgb_col; f ^= t; } From 5665eb14f5779864495e1f0c0a761789ae899dce Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Thu, 3 Dec 2020 19:33:10 -0600 Subject: [PATCH 045/116] fix bw select again --- web/skins/classic/includes/functions.php | 10 +++++----- web/skins/classic/js/skin.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/skins/classic/includes/functions.php b/web/skins/classic/includes/functions.php index 56bddb722..ee819ab58 100644 --- a/web/skins/classic/includes/functions.php +++ b/web/skins/classic/includes/functions.php @@ -497,16 +497,16 @@ function getBandwidthHTML($bandwidth_options, $user) { } $result = ' @@ -202,24 +179,27 @@ for ( $monitor_i = 0; $monitor_i < count($displayMonitors); $monitor_i += 1 ) {
', array_map(function($group_id){ - $Group = new ZM\Group($group_id); - $Groups = $Group->Parents(); - array_push($Groups, $Group); - return implode(' > ', array_map(function($Group){ return ''.$Group->Name().''; }, $Groups )); + $Group = ZM\Group::find_one(array('Id'=>$group_id)); + if ( $Group ) { + $Groups = $Group->Parents(); + array_push( $Groups, $Group ); + } + return implode(' > ', array_map(function($Group){ return ''.validHtmlStr($Group->Name()).''; }, $Groups )); }, $Monitor->GroupIds())); + ?>
- + Date: Fri, 4 Dec 2020 15:28:26 -0500 Subject: [PATCH 048/116] use a common function for datetime changes. --- .../classic/views/js/report_event_audit.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/web/skins/classic/views/js/report_event_audit.js b/web/skins/classic/views/js/report_event_audit.js index d2224366a..755d80172 100644 --- a/web/skins/classic/views/js/report_event_audit.js +++ b/web/skins/classic/views/js/report_event_audit.js @@ -30,29 +30,28 @@ function changeDateTime(e) { window.location = uri; } +function datetime_change(newDate, oldData) { + if (newDate !== oldData.lastVal) { + changeDateTime(); + } +} + function initPage() { $j('#minTime').datetimepicker({ timeFormat: "HH:mm:ss", dateFormat: "yy-mm-dd", maxDate: +0, constrainInput: false, - onClose: function(newDate, oldData) { - if (newDate !== oldData.lastVal) { - changeDateTime(); - } - } + onClose: datetime_change }); + $j('#maxTime').datetimepicker({ timeFormat: "HH:mm:ss", dateFormat: "yy-mm-dd", minDate: $j('#minTime').val(), maxDate: +0, constrainInput: false, - onClose: function(newDate, oldData) { - if (newDate !== oldData.lastVal) { - changeDateTime(); - } - } + onClose: datetime_change }); } // Kick everything off From 0d0eac98befccc56168ff364cbd2a67a638f1d4d Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 4 Dec 2020 15:28:51 -0500 Subject: [PATCH 049/116] Move the form below the navbar because it has a form in it. Remove oninput from minTime and maxTime --- web/skins/classic/views/report_event_audit.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/web/skins/classic/views/report_event_audit.php b/web/skins/classic/views/report_event_audit.php index 212a8e602..be53c87b0 100644 --- a/web/skins/classic/views/report_event_audit.php +++ b/web/skins/classic/views/report_event_audit.php @@ -107,17 +107,16 @@ while ( $event = $result->fetch(PDO::FETCH_ASSOC) ) { ?> +
- -
- to - + to +
From 21aeccb5d09a8de7426eb07c971509c4bac83576 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Fri, 4 Dec 2020 14:35:39 -0600 Subject: [PATCH 050/116] centralize thumb animation js, add delay --- web/skins/classic/css/base/skin.css | 14 +----------- web/skins/classic/js/skin.js | 28 +++++++++++++++++++++++ web/skins/classic/js/skin.js.php | 2 ++ web/skins/classic/views/console.php | 4 ++-- web/skins/classic/views/js/console.js | 21 ----------------- web/skins/classic/views/js/console.js.php | 1 - web/skins/classic/views/js/events.js | 21 ----------------- web/skins/classic/views/js/events.js.php | 1 - web/skins/classic/views/js/watch.js | 24 +------------------ web/skins/classic/views/js/watch.js.php | 1 - 10 files changed, 34 insertions(+), 83 deletions(-) diff --git a/web/skins/classic/css/base/skin.css b/web/skins/classic/css/base/skin.css index ee7a8a471..217364152 100644 --- a/web/skins/classic/css/base/skin.css +++ b/web/skins/classic/css/base/skin.css @@ -728,23 +728,11 @@ li.search-choice { } .zoom { - padding: 50px; - transition: transform .2s; /* Animation */ - margin: 0 auto; -} - -.zoom:hover { transform-origin: 70% 50%; transform: scale(5); /* (arbitray zoom value - Note if the zoom is too large, it will go outside of the viewport) */ } -.zoom-right { - padding: 0px; - transition: transform .2s; /* Animation */ - margin: 0 auto; -} - -.zoom-right:hover { +.zoom-console { transform-origin: 0% 50%; transform: scale(5); /* (arbitray zoom value - Note if the zoom is too large, it will go outside of the viewport) */ } diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index cbe919318..4b66b1e71 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -889,3 +889,31 @@ function manageShutdownBtns(element) { }) .fail(logAjaxFail); } + +function thumbnail_onmouseover(event) { + timeout = setTimeout(function () { + var img = event.target; + var imgClass = ( currentView == 'console' ) ? 'zoom-console' : 'zoom-hover'; + img.src = ''; + img.src = img.getAttribute('stream_src'); + img.addClass(imgClass); + }, 350); +} + +function thumbnail_onmouseout(event) { + clearTimeout(timeout); + var img = event.target; + var imgClass = ( currentView == 'console' ) ? 'zoom-console' : 'zoom-hover'; + img.src = ''; + img.src = img.getAttribute('still_src'); + img.removeClass(imgClass); +} + +function initThumbAnimation() { + if ( ANIMATE_THUMBS ) { + $j('.colThumbnail img').each(function() { + this.addEventListener('mouseover', thumbnail_onmouseover, false); + this.addEventListener('mouseout', thumbnail_onmouseout, false); + }); + } +} diff --git a/web/skins/classic/js/skin.js.php b/web/skins/classic/js/skin.js.php index 6bf426454..1288a1e80 100644 --- a/web/skins/classic/js/skin.js.php +++ b/web/skins/classic/js/skin.js.php @@ -49,6 +49,8 @@ var canViewMonitors = ; var canEditGroups = ; +var ANIMATE_THUMBS = ; + var refreshParent = ViewHeight() / $Monitor->ViewWidth(); $options['width'] = ZM_WEB_LIST_THUMB_WIDTH; $options['height'] = ZM_WEB_LIST_THUMB_HEIGHT ? ZM_WEB_LIST_THUMB_HEIGHT : ZM_WEB_LIST_THUMB_WIDTH*$ratio_factor; @@ -309,7 +309,7 @@ for( $monitor_i = 0; $monitor_i < count($displayMonitors); $monitor_i += 1 ) { $thmbWidth = ( $options['width'] ) ? 'width:'.$options['width'].'px;' : ''; $thmbHeight = ( $options['height'] ) ? 'height:'.$options['height'].'px;' : ''; - $imgHTML = '
' : '>'; $imgHTML .= '; -var WEB_ANIMATE_THUMBS = ; "; var yesString = ""; var noString = ""; var WEB_LIST_THUMBS = ; -var WEB_ANIMATE_THUMBS = ; diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 979641eec..1ab86f225 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -83,27 +83,6 @@ function processRows(rows) { return rows; } -function thumbnail_onmouseover(event) { - var img = event.target; - img.src = ''; - img.src = img.getAttribute('stream_src'); -} - -function thumbnail_onmouseout(event) { - var img = event.target; - img.src = ''; - img.src = img.getAttribute('still_src'); -} - -function initThumbAnimation() { - if ( ANIMATE_THUMBS ) { - $j('.colThumbnail img').each(function() { - this.addEventListener('mouseover', thumbnail_onmouseover, false); - this.addEventListener('mouseout', thumbnail_onmouseout, false); - }); - } -} - function showEvents() { $j('#ptzControls').addClass('hidden'); $j('#events').removeClass('hidden'); @@ -903,8 +882,7 @@ function initPage() { var thumb_ndx = $j('#eventList tr th').filter(function() { return $j(this).text().trim() == 'Thumbnail'; }).index(); - var thmbClass = ANIMATE_THUMBS ? 'colThumbnail zoom' : 'colThumbnail'; - table.find("tr td:nth-child(" + (thumb_ndx+1) + ")").addClass(thmbClass); + table.find("tr td:nth-child(" + (thumb_ndx+1) + ")").addClass('colThumbnail'); }); } // initPage diff --git a/web/skins/classic/views/js/watch.js.php b/web/skins/classic/views/js/watch.js.php index a61f0a8a8..704ec01e2 100644 --- a/web/skins/classic/views/js/watch.js.php +++ b/web/skins/classic/views/js/watch.js.php @@ -51,7 +51,6 @@ var SCALE_BASE = ; var SOUND_ON_ALARM = ; var POPUP_ON_ALARM = ; var LIST_THUMBS = ; -var ANIMATE_THUMBS = ; var streamMode = ""; var showMode = ""; From 0bf39dc954196b285ce720ca15e7f01dc214796d Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Fri, 4 Dec 2020 14:44:05 -0600 Subject: [PATCH 051/116] fix setting the thumbnail class in events --- web/skins/classic/views/js/events.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/events.js b/web/skins/classic/views/js/events.js index 159dba682..0ea67a095 100644 --- a/web/skins/classic/views/js/events.js +++ b/web/skins/classic/views/js/events.js @@ -313,8 +313,7 @@ function initPage() { var thumb_ndx = $j('#eventTable tr th').filter(function() { return $j(this).text().trim() == 'Thumbnail'; }).index(); - var thmbClass = WEB_ANIMATE_THUMBS ? 'colThumbnail zoom' : 'colThumbnail'; - table.find("tr td:nth-child(" + (thumb_ndx+1) + ")").addClass(thmbClass); + table.find("tr td:nth-child(" + (thumb_ndx+1) + ")").addClass('colThumbnail'); }); table.bootstrapTable('resetSearch'); From ac069e6e5eb50afef1b19a26728dbe86bb2377b4 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Fri, 4 Dec 2020 14:47:13 -0600 Subject: [PATCH 052/116] fix zoom class in skins.js --- web/skins/classic/js/skin.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index 4b66b1e71..ec2953da0 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -893,7 +893,7 @@ function manageShutdownBtns(element) { function thumbnail_onmouseover(event) { timeout = setTimeout(function () { var img = event.target; - var imgClass = ( currentView == 'console' ) ? 'zoom-console' : 'zoom-hover'; + var imgClass = ( currentView == 'console' ) ? 'zoom-console' : 'zoom'; img.src = ''; img.src = img.getAttribute('stream_src'); img.addClass(imgClass); @@ -903,7 +903,7 @@ function thumbnail_onmouseover(event) { function thumbnail_onmouseout(event) { clearTimeout(timeout); var img = event.target; - var imgClass = ( currentView == 'console' ) ? 'zoom-console' : 'zoom-hover'; + var imgClass = ( currentView == 'console' ) ? 'zoom-console' : 'zoom'; img.src = ''; img.src = img.getAttribute('still_src'); img.removeClass(imgClass); From 7106cd43a7c806ed5045254285ba0b0c9b839f7e Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Fri, 4 Dec 2020 18:30:05 -0600 Subject: [PATCH 053/116] eslint --- web/skins/classic/js/skin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index ec2953da0..e4a9a9046 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -891,7 +891,7 @@ function manageShutdownBtns(element) { } function thumbnail_onmouseover(event) { - timeout = setTimeout(function () { + timeout = setTimeout(function() { var img = event.target; var imgClass = ( currentView == 'console' ) ? 'zoom-console' : 'zoom'; img.src = ''; From 9b8f63b36f1feba0aaf254ff1148c8d6124f32f4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 5 Dec 2020 10:23:29 -0500 Subject: [PATCH 054/116] EstimatedRamUse to Estimated Ram Use so we don't an en_gb translation --- web/skins/classic/views/monitor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index c84650ddd..aae5bddf1 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -991,7 +991,7 @@ include('_monitor_source_nvsocket.php');
- + Date: Sat, 5 Dec 2020 12:31:30 -0600 Subject: [PATCH 055/116] bw dropdown - match only on bwselect class --- web/skins/classic/js/skin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index e4a9a9046..3d59b0898 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -639,7 +639,7 @@ function delCookie(name) { } function bwClickFunction() { - $j(".dropdown-menu.bwselect").click(function() { + $j('.bwselect').click(function() { var bwval = $j(this).data('pdsa-dropdown-val'); setCookie("zmBandwidth", bwval, 3600); getNavBar(); From df35bd75a5b75d8f7b5429dbdbafd4ab836371b4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 5 Dec 2020 16:29:23 -0500 Subject: [PATCH 056/116] Escape column names for mysql 8 --- web/skins/classic/views/_monitor_filters.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/_monitor_filters.php b/web/skins/classic/views/_monitor_filters.php index 1531237b0..03a66e281 100644 --- a/web/skins/classic/views/_monitor_filters.php +++ b/web/skins/classic/views/_monitor_filters.php @@ -82,10 +82,10 @@ if ( $groupSql ) foreach ( array('ServerId','StorageId','Status','Function') as $filter ) { if ( isset($_SESSION[$filter]) ) { if ( is_array($_SESSION[$filter]) ) { - $conditions[] = $filter . ' IN ('.implode(',', array_map(function(){return '?';}, $_SESSION[$filter])). ')'; + $conditions[] = '`'.$filter . '` IN ('.implode(',', array_map(function(){return '?';}, $_SESSION[$filter])). ')'; $values = array_merge($values, $_SESSION[$filter]); } else { - $conditions[] = $filter . '=?'; + $conditions[] = '`'.$filter . '`=?'; $values[] = $_SESSION[$filter]; } } From fdbca4760f48f448c780e716fc2d562f70fd2786 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 5 Dec 2020 16:38:25 -0500 Subject: [PATCH 057/116] dbFetchAll should always return an array. Not null on error --- web/includes/database.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/includes/database.php b/web/includes/database.php index 637b20fa0..02715ed97 100644 --- a/web/includes/database.php +++ b/web/includes/database.php @@ -189,13 +189,13 @@ function dbFetchOne($sql, $col=false, $params=NULL) { } function dbFetchAll($sql, $col=false, $params=NULL) { + $dbRows = array(); $result = dbQuery($sql, $params); if ( ! $result ) { ZM\Error("SQL-ERR dbFetchAll no result, statement was '".$sql."'".($params ? 'params: '.join(',', $params) : '')); - return false; + return $dbRows; } - $dbRows = array(); while ( $dbRow = $result->fetch(PDO::FETCH_ASSOC) ) $dbRows[] = $col ? $dbRow[$col] : $dbRow; return $dbRows; From ea6478b8a03e0d96eff7c039f9a5d4099e6138a7 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 5 Dec 2020 16:38:53 -0500 Subject: [PATCH 058/116] Escape column names for mysql 8. Fixes #3092 --- web/skins/classic/views/_monitor_filters.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web/skins/classic/views/_monitor_filters.php b/web/skins/classic/views/_monitor_filters.php index f144c17fa..54308c649 100644 --- a/web/skins/classic/views/_monitor_filters.php +++ b/web/skins/classic/views/_monitor_filters.php @@ -80,10 +80,10 @@ if ( $groupSql ) foreach ( array('ServerId','StorageId','Status','Function') as $filter ) { if ( isset($_SESSION[$filter]) ) { if ( is_array($_SESSION[$filter]) ) { - $conditions[] = $filter . ' IN ('.implode(',', array_map(function(){return '?';}, $_SESSION[$filter])). ')'; + $conditions[] = '`'.$filter . '` IN ('.implode(',', array_map(function(){return '?';}, $_SESSION[$filter])). ')'; $values = array_merge($values, $_SESSION[$filter]); } else { - $conditions[] = $filter . '=?'; + $conditions[] = '`'.$filter . '`=?'; $values[] = $_SESSION[$filter]; } } @@ -249,9 +249,9 @@ $html .= ' 'multiple'=>'multiple', 'data-placeholder'=>'All', ) ); -# Repurpose this variable to be the list of MonitorIds as a result of all the filtering -$selected_monitor_ids = array_map(function($monitor_row){return $monitor_row['Id'];}, $displayMonitors); -$html .= ' + # Repurpose this variable to be the list of MonitorIds as a result of all the filtering + $selected_monitor_ids = array_map(function($monitor_row){return $monitor_row['Id'];}, $displayMonitors); + $html .= ' '; echo $html; ?> From 36b5702c502354cfd78b62353e956b95140dc805 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 5 Dec 2020 19:36:44 -0500 Subject: [PATCH 059/116] Increase LinkedMonitor debugging. Fix LinkedMonitors. Fixes #3091 --- src/zm_monitor.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 548ec10f1..f85edeaa9 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -366,12 +366,15 @@ Monitor::Monitor( purpose( p_purpose ), last_motion_score(0), camera( p_camera ), + event(0), n_zones( p_n_zones ), zones( p_zones ), timestamps( nullptr ), images( nullptr ), privacy_bitmask( nullptr ), - event_delete_thread(nullptr) + event_delete_thread(nullptr), + n_linked_monitors(0), + linked_monitors(nullptr) { if ( analysis_fps > 0.0 ) { uint64_t usec = round(1000000*pre_event_count/analysis_fps); @@ -532,7 +535,6 @@ Monitor::Monitor( start_time = last_fps_time = time( 0 ); - event = 0; Debug(1, "Monitor %s has function %d,\n" "label format = '%s', label X = %d, label Y = %d, label size = %d,\n" @@ -545,10 +547,6 @@ Monitor::Monitor( //Set video recording flag for event start constructor and easy reference in code videoRecording = ((GetOptVideoWriter() == H264PASSTHROUGH) && camera->SupportsNativeVideo()); - - n_linked_monitors = 0; - linked_monitors = nullptr; - } // Monitor::Monitor bool Monitor::connect() { @@ -1432,7 +1430,8 @@ bool Monitor::Analyse() { bool signal = shared_data->signal; bool signal_change = (signal != last_signal); - Debug(3, "Motion detection is enabled signal(%d) signal_change(%d)", signal, signal_change); + Debug(3, "Motion detection is enabled signal(%d) signal_change(%d) trigger state(%d)", + signal, signal_change, trigger_data->trigger_state); if ( trigger_data->trigger_state != TRIGGER_OFF ) { unsigned int score = 0; @@ -1511,7 +1510,11 @@ bool Monitor::Analyse() { for ( int i = 0; i < n_linked_monitors; i++ ) { // TODO: Shouldn't we try to connect? if ( linked_monitors[i]->isConnected() ) { + Debug(4, "Linked monitor %d %s is connected", + linked_monitors[i]->Id(), linked_monitors[i]->Name()); if ( linked_monitors[i]->hasAlarmed() ) { + Debug(4, "Linked monitor %d %s is alarmed", + linked_monitors[i]->Id(), linked_monitors[i]->Name()); if ( !event ) { if ( first_link ) { if ( cause.length() ) @@ -1522,6 +1525,9 @@ bool Monitor::Analyse() { } noteSet.insert(linked_monitors[i]->Name()); score += 50; + } else { + Debug(4, "Linked monitor %d %s is not alarmed", + linked_monitors[i]->Id(), linked_monitors[i]->Name()); } } else { Debug(1, "Linked monitor %d %d is not connected. Connecting.", i, linked_monitors[i]->Id()); @@ -1842,7 +1848,7 @@ bool Monitor::Analyse() { image_count++; return true; -} // end Monitor::Analyze +} // end Monitor::Analyse void Monitor::Reload() { Debug(1, "Reloading monitor %s", name); @@ -2018,7 +2024,7 @@ void Monitor::ReloadLinkedMonitors(const char *p_linked_monitors) { int n_monitors = mysql_num_rows(result); if ( n_monitors == 1 ) { MYSQL_ROW dbrow = mysql_fetch_row(result); - Debug(1, "Linking to monitor %d", link_ids[i]); + Debug(1, "Linking to monitor %d %s", atoi(dbrow[0]), dbrow[1]); linked_monitors[count++] = new MonitorLink(link_ids[i], dbrow[1]); } else { Warning("Can't link to monitor %d, invalid id, function or not enabled", link_ids[i]); From 6e17b04a7e901f7ad6546fb0dccd9cd7a7efbb36 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Mon, 7 Dec 2020 10:22:54 -0600 Subject: [PATCH 060/116] WIP continue jquery conversion of watch.js --- web/skins/classic/views/js/watch.js | 70 +++++++++++++++++------------ 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 1ab86f225..b58a8bc84 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -124,13 +124,14 @@ function changeScale() { Cookie.write('zmWatchScale'+monitorId, scale, {duration: 10*365, samesite: 'strict'}); - /*Stream could be an applet so can't use moo tools*/ - var streamImg = $('liveStream'+monitorId); + var streamImg = $j('#liveStream'+monitorId); if ( streamImg ) { - streamImg.style.width = newWidth + 'px'; - streamImg.style.height = newHeight + 'px'; + var oldSrc = streamImg.attr('src'); + var newSrc = oldSrc.replace(/scale=\d+/i, 'scale='+(scale== 'auto' ? autoScale : scale)); - streamImg.src = streamImg.src.replace(/scale=\d+/i, 'scale='+(scale== 'auto' ? autoScale : scale)); + streamImg.width( newWidth ); + streamImg.height( newHeight ); + streamImg.src = oldSrc; } else { console.error('No element found for liveStream'+monitorId); } @@ -163,9 +164,9 @@ function setAlarmState( currentAlarmState ) { if ( SOUND_ON_ALARM ) { // Enable the alarm sound if ( !canPlayPauseAudio ) { - $('alarmSound').removeClass('hidden'); + $j('#alarmSound').removeClass('hidden'); } else { - $('MediaPlayer').Play(); + $j('#MediaPlayer').trigger('play'); } } if ( POPUP_ON_ALARM ) { @@ -177,9 +178,9 @@ function setAlarmState( currentAlarmState ) { if ( SOUND_ON_ALARM ) { // Disable alarm sound if ( !canPlayPauseAudio ) { - $('alarmSound').addClass('hidden'); + $j('#alarmSound').addClass('hidden'); } else { - $('MediaPlayer').Stop(); + $j('#MediaPlayer').trigger('pause'); } } } @@ -211,13 +212,14 @@ function getStreamCmdResponse(respObj, respText) { setAlarmState(streamStatus.state); $j('#levelValue').text(streamStatus.level); + var newClass = 'ok'; if ( streamStatus.level > 95 ) { - $('levelValue').className = 'alarm'; + newClass = 'alarm'; } else if ( streamStatus.level > 80 ) { - $('levelValue').className = 'alert'; - } else { - $('levelValue').className = 'ok'; + newClass = 'alert'; } + $j('#levelValue').removeClass(); + $j('#levelValue').addClass(newClass); var delayString = secsToTime(streamStatus.delay); @@ -288,9 +290,11 @@ function getStreamCmdResponse(respObj, respText) { if ( streamStatus.auth ) { auth_hash = streamStatus.auth; // Try to reload the image stream. - var streamImg = $('liveStream'); + var streamImg = $j('#liveStream'+monitorId); if ( streamImg ) { - streamImg.src = streamImg.src.replace(/auth=\w+/i, 'auth='+streamStatus.auth); + var oldSrc = streamImg.attr('src'); + var newSrc = oldSrc.replace(/auth=\w+/i, 'auth='+streamStatus.auth); + streamImg.src = newSrc; } streamCmdParms = streamCmdParms.replace(/auth=\w+/i, 'auth='+streamStatus.auth); statusCmdParms = statusCmdParms.replace(/auth=\w+/i, 'auth='+streamStatus.auth); @@ -304,9 +308,12 @@ function getStreamCmdResponse(respObj, respText) { // If it's an auth error, we should reload the whole page. window.location.reload(); if ( 0 ) { - var streamImg = $('liveStream'+monitorId); + var streamImg = $j('#liveStream'+monitorId); if ( streamImg ) { - streamImg.src = streamImg.src.replace(/rand=\d+/i, 'rand='+Math.floor((Math.random() * 1000000) )); + var oldSrc = streamImg.attr('src'); + var newSrc = oldSrc.replace(/rand=\d+/i, 'rand='+Math.floor((Math.random() * 1000000) )); + + streamImg.src = newSrc; console.log('Changing livestream src to ' + streamImg.src); } else { console.log('Unable to find streamImg liveStream'); @@ -597,13 +604,15 @@ function controlCmd(event) { var locParms = ''; if ( event && (xtell || ytell) ) { var target = event.target; - var coords = $(target).getCoordinates(); + var offset = $j(target).offset(); + var width = $j(target).width(); + var height = $j(target).height(); - var x = event.pageX - coords.left; - var y = event.pageY - coords.top; + var x = event.pageX - offset.left; + var y = event.pageY - offset.top; if ( xtell ) { - var xge = parseInt((x*100)/coords.width); + var xge = parseInt((x*100)/width); if ( xtell == -1 ) { xge = 100 - xge; } else if ( xtell == 2 ) { @@ -612,7 +621,7 @@ function controlCmd(event) { locParms += '&xge='+xge; } if ( ytell ) { - var yge = parseInt((y*100)/coords.height); + var yge = parseInt((y*100)/height); if ( ytell == -1 ) { yge = 100 - yge; } else if ( ytell == 2 ) { @@ -643,9 +652,12 @@ function fetchImage( streamImage ) { } function handleClick( event ) { - var $target = $(event.target); - var scaleX = parseInt(monitorWidth / $target.getWidth()); - var scaleY = parseInt(monitorHeight / $target.getHeight()); + var target = event.target; + var width = $j(target).width(); + var height = $j(target).height(); + + var scaleX = parseInt(monitorWidth / width); + var scaleY = parseInt(monitorHeight / height); var x = (event.page.x - $target.getLeft()) * scaleX; var y = (event.page.y - $target.getTop()) * scaleY; @@ -664,11 +676,11 @@ function handleClick( event ) { function appletRefresh() { if ( streamStatus && (!streamStatus.paused && !streamStatus.delayed) ) { - var streamImg = $('liveStream'+monitorId); + var streamImg = $j('#liveStream'+monitorId); if ( streamImg ) { - var parent = streamImg.getParent(); - streamImg.dispose(); - streamImg.inject( parent ); + var parent = streamImg.parent(); + streamImg.remove(); + streamImg.append( parent ); } else { console.error("Nothing found for liveStream"+monitorId); } From 389ad22dcd9a7ef2a35fb8eb844013e6cb64853f Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Mon, 7 Dec 2020 10:36:14 -0600 Subject: [PATCH 061/116] watch.js - target not $target --- web/skins/classic/views/js/watch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index b58a8bc84..93e0d377e 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -658,8 +658,8 @@ function handleClick( event ) { var scaleX = parseInt(monitorWidth / width); var scaleY = parseInt(monitorHeight / height); - var x = (event.page.x - $target.getLeft()) * scaleX; - var y = (event.page.y - $target.getTop()) * scaleY; + var x = (event.page.x - target.getLeft()) * scaleX; + var y = (event.page.y - target.getTop()) * scaleY; if ( showMode == 'events' || !imageControlMode ) { if ( event.shift ) { From 1772d37c0871ff0920aba10969c381f36c635f42 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Mon, 7 Dec 2020 12:32:07 -0600 Subject: [PATCH 062/116] convert updatePresetLabels() to jquery --- web/skins/classic/views/js/watch.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 93e0d377e..b67e70c1a 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -722,15 +722,9 @@ function reloadWebSite() { } function updatePresetLabels() { - var form = $('ctrlPresetForm'); - var preset_ddm = form.elements['preset']; + var lblNdx = $j( '#ctrlPresetForm option:selected' ).val(); - var presetIndex = preset_ddm[preset_ddm.selectedIndex].value; - if ( labels[presetIndex] ) { - form.newLabel.value = labels[presetIndex]; - } else { - form.newLabel.value = ''; - } + $j('#newLabel').val(labels[lblNdx]); } function getCtrlPresetModal() { From 691f9a70f91144d4f5974ff1b63dad2430515bc5 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Mon, 7 Dec 2020 14:44:45 -0600 Subject: [PATCH 063/116] eslint --- web/skins/classic/views/js/watch.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index b67e70c1a..84c0382dd 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -131,7 +131,7 @@ function changeScale() { streamImg.width( newWidth ); streamImg.height( newHeight ); - streamImg.src = oldSrc; + streamImg.src = newSrc; } else { console.error('No element found for liveStream'+monitorId); } @@ -294,7 +294,7 @@ function getStreamCmdResponse(respObj, respText) { if ( streamImg ) { var oldSrc = streamImg.attr('src'); var newSrc = oldSrc.replace(/auth=\w+/i, 'auth='+streamStatus.auth); - streamImg.src = newSrc; + streamImg.src = newSrc; } streamCmdParms = streamCmdParms.replace(/auth=\w+/i, 'auth='+streamStatus.auth); statusCmdParms = statusCmdParms.replace(/auth=\w+/i, 'auth='+streamStatus.auth); @@ -655,7 +655,7 @@ function handleClick( event ) { var target = event.target; var width = $j(target).width(); var height = $j(target).height(); - + var scaleX = parseInt(monitorWidth / width); var scaleY = parseInt(monitorHeight / height); var x = (event.page.x - target.getLeft()) * scaleX; From b0f2ff6302f0d781d7f59ceaafaa607328f0b807 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 8 Dec 2020 10:21:55 -0500 Subject: [PATCH 064/116] Add Session cleaning --- scripts/zmstats.pl.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/zmstats.pl.in b/scripts/zmstats.pl.in index 8aef4ddc6..81fdd3129 100644 --- a/scripts/zmstats.pl.in +++ b/scripts/zmstats.pl.in @@ -91,6 +91,9 @@ while( 1 ) { } } # end if ZM_LOG_DATABASE_LIMIT + # Delete any sessions that are more ethan a week old. Limiting to 100 because mysql sucks + zmDbDo('DELETE FROM Sessions WHERE access < ? LIMIT 100', time - (60*60*24*7)); + sleep($Config{ZM_STATS_UPDATE_INTERVAL}); } # end while (1) From c156731f0be28a76977e29055ba350ed7f82f733 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 8 Dec 2020 10:33:25 -0500 Subject: [PATCH 065/116] Allow users with canView Events to view event list. Don't allow unarchive or delete if they don't have canEdit --- web/ajax/events.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/web/ajax/events.php b/web/ajax/events.php index 37e225527..b613fe10c 100644 --- a/web/ajax/events.php +++ b/web/ajax/events.php @@ -6,7 +6,7 @@ $data = array(); // INITIALIZE AND CHECK SANITY // -if ( !canEdit('Events') ) $message = 'Insufficient permissions for user '.$user['Username']; +if ( !canView('Events') ) $message = 'Insufficient permissions for user '.$user['Username']; if ( empty($_REQUEST['task']) ) { $message = 'Must specify a task'; @@ -74,10 +74,22 @@ if ( isset($_REQUEST['limit']) ) { switch ( $task ) { case 'archive' : + foreach ( $eids as $eid ) archiveRequest($task, $eid); + break; case 'unarchive' : + # The idea is that anyone can archive, but only people with Event Edit permission can unarchive.. + if ( !canEdit('Events') ) { + ajaxError('Insufficient permissions for user '.$user['Username']); + return; + } foreach ( $eids as $eid ) archiveRequest($task, $eid); break; case 'delete' : + if ( !canEdit('Events') ) { + ajaxError('Insufficient permissions for user '.$user['Username']); + return; + } + foreach ( $eids as $eid ) $data[] = deleteRequest($eid); break; case 'query' : From bfe5bb0249d366ee48be7894a109826d1f556fec Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 8 Dec 2020 11:19:22 -0500 Subject: [PATCH 066/116] Include code to handle when we are already logged in but trying to auth with a mismatched auth_hash --- web/includes/auth.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/web/includes/auth.php b/web/includes/auth.php index a4e1e4268..4084e8386 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -187,6 +187,26 @@ function getAuthUser($auth) { } // end if $auth == $authHash } // end foreach hour } // end foreach user + + if ( isset($_SESSION['username']) ) { + # In a multi-server case, we might be logged in as another user and so the auth hash didn't work + $sql = 'SELECT * FROM Users WHERE Enabled = 1 AND Username != ?'; + + foreach ( dbFetchAll($sql, NULL, $values) as $user ) { + $now = time(); + for ( $i = 0; $i < ZM_AUTH_HASH_TTL; $i++, $now -= 3600 ) { // Try for last TTL hours + $time = localtime($now); + $authKey = ZM_AUTH_HASH_SECRET.$user['Username'].$user['Password'].$remoteAddr.$time[2].$time[3].$time[4].$time[5]; + $authHash = md5($authKey); + + if ( $auth == $authHash ) { + return $user; + } // end if $auth == $authHash + } // end foreach hour + } // end foreach user + } // end if + } // end if using auth hash + } // end if using auth hash ZM\Error("Unable to authenticate user from auth hash '$auth'"); return null; From 84c7a117f5651023be66901589d156e46ccb21d7 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 8 Dec 2020 11:26:43 -0500 Subject: [PATCH 067/116] Use width and height attrs instead of css for rendering speed. Also alt doesn't need validHtmlStr because Event.Id will have no weird characters --- web/ajax/events.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/ajax/events.php b/web/ajax/events.php index b613fe10c..51949f84e 100644 --- a/web/ajax/events.php +++ b/web/ajax/events.php @@ -229,12 +229,12 @@ function queryRequest($filter, $search, $advsearch, $sort, $offset, $order, $lim $event = new ZM\Event($row); $scale = intval(5*100*ZM_WEB_LIST_THUMB_WIDTH / $event->Width()); - $imgSrc = $event->getThumbnailSrc(array(),'&'); + $imgSrc = $event->getThumbnailSrc(array(), '&'); $streamSrc = $event->getStreamSrc(array( 'mode'=>'jpeg', 'scale'=>$scale, 'maxfps'=>ZM_WEB_VIDEO_MAXFPS, 'replay'=>'single', 'rate'=>'400'), '&'); // Modify the row data as needed - $row['imgHtml'] = '' .validHtmlStr('Event ' .$event->Id()). ''; + $row['imgHtml'] = 'Event '.$event->Id().''; $row['Name'] = validHtmlStr($row['Name']); $row['Archived'] = $row['Archived'] ? translate('Yes') : translate('No'); $row['Emailed'] = $row['Emailed'] ? translate('Yes') : translate('No'); From 63e36340c6a9a52250e4863e7f532c3341c327f1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 8 Dec 2020 11:26:52 -0500 Subject: [PATCH 068/116] Remove extra } --- web/includes/auth.php | 1 - 1 file changed, 1 deletion(-) diff --git a/web/includes/auth.php b/web/includes/auth.php index 4084e8386..ced24ff9d 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -207,7 +207,6 @@ function getAuthUser($auth) { } // end if } // end if using auth hash - } // end if using auth hash ZM\Error("Unable to authenticate user from auth hash '$auth'"); return null; } // end getAuthUser($auth) From 63c483ba92545d707da75737489b0dcc068fefff Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 8 Dec 2020 11:27:18 -0500 Subject: [PATCH 069/116] canEditMonitors is set in skin.js.php --- web/skins/classic/views/js/watch.js.php | 1 - 1 file changed, 1 deletion(-) diff --git a/web/skins/classic/views/js/watch.js.php b/web/skins/classic/views/js/watch.js.php index 704ec01e2..d0ef131b6 100644 --- a/web/skins/classic/views/js/watch.js.php +++ b/web/skins/classic/views/js/watch.js.php @@ -73,7 +73,6 @@ var statusRefreshTimeout = ; var eventsRefreshTimeout = ; var imageRefreshTimeout = ; -var canEditMonitors = ; var canStreamNative = ; var canViewControl = ; From 69e540c10469ac2393c0ab4f3477255735caa15b Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Tue, 8 Dec 2020 14:25:48 -0600 Subject: [PATCH 070/116] deploy canView and canEdit js objects --- web/skins/classic/js/skin.js | 2 +- web/skins/classic/js/skin.js.php | 19 ++++++++------ web/skins/classic/views/js/controlcaps.js | 10 +++---- web/skins/classic/views/js/controlcaps.js.php | 1 - web/skins/classic/views/js/devices.js | 10 +++---- web/skins/classic/views/js/devices.js.php | 1 - web/skins/classic/views/js/event.js | 26 +++++++++---------- web/skins/classic/views/js/event.js.php | 1 - web/skins/classic/views/js/events.js | 26 +++++++++---------- web/skins/classic/views/js/groups.js | 4 +-- web/skins/classic/views/js/options.js | 8 +++--- web/skins/classic/views/js/options.js.php | 1 - web/skins/classic/views/js/watch.js | 10 +++---- web/skins/classic/views/js/watch.js.php | 1 - web/skins/classic/views/js/zone.js.php | 1 - 15 files changed, 59 insertions(+), 62 deletions(-) delete mode 100644 web/skins/classic/views/js/controlcaps.js.php delete mode 100644 web/skins/classic/views/js/devices.js.php diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index 3d59b0898..ebfa5c0fe 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -241,7 +241,7 @@ if ( currentView != 'none' && currentView != 'login' ) { $j(document).ready(function() { // Load the Logout and State modals into the dom $j('#logoutButton').click(clickLogout); - if ( canEditSystem ) $j('#stateModalBtn').click(getStateModal); + if ( canEdit.System ) $j('#stateModalBtn').click(getStateModal); // Trigger autorefresh of the widget bar stats on the navbar if ( $j('.navbar').length ) { diff --git a/web/skins/classic/js/skin.js.php b/web/skins/classic/js/skin.js.php index 1288a1e80..b10598235 100644 --- a/web/skins/classic/js/skin.js.php +++ b/web/skins/classic/js/skin.js.php @@ -40,14 +40,17 @@ var thisUrl = ''; var serverId = ''; -var canEditSystem = ; -var canViewSystem = ; -var canEditEvents = ; -var canViewEvents = ; -var canEditMonitors = ; -var canViewMonitors = ; - -var canEditGroups = ; +var canView = new Object(); +var canEdit = new Object(); + + canView[""] = ; + canEdit[""] = ; + var ANIMATE_THUMBS = ; diff --git a/web/skins/classic/views/js/controlcaps.js b/web/skins/classic/views/js/controlcaps.js index 75e6b8817..ff1b3af30 100644 --- a/web/skins/classic/views/js/controlcaps.js +++ b/web/skins/classic/views/js/controlcaps.js @@ -43,7 +43,7 @@ function getDelConfirmModal(key) { // Manage the DELETE CONFIRMATION modal button function manageDelConfirmModalBtns() { document.getElementById("delConfirmBtn").addEventListener("click", function onDelConfirmClick(evt) { - if ( ! canEditControl ) { + if ( ! canEdit.Control ) { enoperm(); return; } @@ -67,9 +67,9 @@ function initPage() { function() { selections = table.bootstrapTable('getSelections'); - addNewBtn.prop('disabled', (selections.length || !canEditControl)); - editBtn.prop('disabled', !((selections.length == 1) && canEditControl)); - deleteBtn.prop('disabled', !(selections.length && canEditControl)); + addNewBtn.prop('disabled', (selections.length || !canEdit.Control)); + editBtn.prop('disabled', !((selections.length == 1) && canEdit.Control)); + deleteBtn.prop('disabled', !(selections.length && canEdit.Control)); }); // Init the bootstrap-table @@ -92,7 +92,7 @@ function initPage() { // Manage the DELETE button document.getElementById("deleteBtn").addEventListener("click", function onDeleteClick(evt) { - if ( ! canEditControl ) { + if ( ! canEdit.Control ) { enoperm(); return; } diff --git a/web/skins/classic/views/js/controlcaps.js.php b/web/skins/classic/views/js/controlcaps.js.php deleted file mode 100644 index 6db74d130..000000000 --- a/web/skins/classic/views/js/controlcaps.js.php +++ /dev/null @@ -1 +0,0 @@ -var canEditControl = ; diff --git a/web/skins/classic/views/js/devices.js b/web/skins/classic/views/js/devices.js index a164835b4..5167b2018 100644 --- a/web/skins/classic/views/js/devices.js +++ b/web/skins/classic/views/js/devices.js @@ -42,7 +42,7 @@ function getDelConfirmModal(key) { // Manage the DELETE CONFIRMATION modal button function manageDelConfirmModalBtns() { document.getElementById("delConfirmBtn").addEventListener("click", function onDelConfirmClick(evt) { - if ( ! canEditDevice ) { + if ( ! canEdit.Device ) { enoperm(); return; } @@ -91,9 +91,9 @@ function initPage() { // Init the bootstrap-table table.bootstrapTable({icons: icons}); - if ( canEditDevice ) enableDeviceModal(); + if ( canEdit.Device ) enableDeviceModal(); - newDeviceBtn.prop('disabled', !canEditDevice); + newDeviceBtn.prop('disabled', !canEdit.Device); // Manage the BACK button document.getElementById("backBtn").addEventListener("click", function onBackClick(evt) { @@ -112,7 +112,7 @@ function initPage() { // Manage the DELETE button document.getElementById("deleteBtn").addEventListener("click", function onDeleteClick(evt) { - if ( ! canEditDevice ) { + if ( ! canEdit.Device ) { enoperm(); return; } @@ -130,7 +130,7 @@ function initPage() { function() { selections = table.bootstrapTable('getSelections'); - deleteBtn.prop('disabled', !(selections.length && canEditDevice)); + deleteBtn.prop('disabled', !(selections.length && canEdit.Device)); }); // Process mouse clicks on the table cells diff --git a/web/skins/classic/views/js/devices.js.php b/web/skins/classic/views/js/devices.js.php deleted file mode 100644 index f80541494..000000000 --- a/web/skins/classic/views/js/devices.js.php +++ /dev/null @@ -1 +0,0 @@ -var canEditDevice = ; diff --git a/web/skins/classic/views/js/event.js b/web/skins/classic/views/js/event.js index 5550ee15c..37ef5966c 100644 --- a/web/skins/classic/views/js/event.js +++ b/web/skins/classic/views/js/event.js @@ -598,8 +598,8 @@ function getEventResponse(respObj, respText) { $j('dataStorage').text( eventData.Storage ); // Refresh the status of the archive buttons - archiveBtn.prop('disabled', !(!eventData.Archived && canEditEvents)); - unarchiveBtn.prop('disabled', !(eventData.Archived && canEditEvents)); + archiveBtn.prop('disabled', !(!eventData.Archived && canEdit.Events)); + unarchiveBtn.prop('disabled', !(eventData.Archived && canEdit.Events)); history.replaceState(null, null, '?view=event&eid=' + eventData.Id + filterQuery + sortQuery); //if popup removed, check if this allows forward // Technically, events can be different sizes, so may need to update the size of the image, but it might be better to have it stay scaled... @@ -1045,7 +1045,7 @@ function getDelConfirmModal() { // Manage the DELETE CONFIRMATION modal button function manageDelConfirmModalBtns() { document.getElementById("delConfirmBtn").addEventListener("click", function onDelConfirmClick(evt) { - if ( ! canEditEvents ) { + if ( ! canEdit.Events ) { enoperm(); return; } @@ -1134,13 +1134,13 @@ function initPage() { }); // enable or disable buttons based on current selection and user rights - renameBtn.prop('disabled', !canEditEvents); - archiveBtn.prop('disabled', !(!eventData.Archived && canEditEvents)); - unarchiveBtn.prop('disabled', !(eventData.Archived && canEditEvents)); - editBtn.prop('disabled', !canEditEvents); - exportBtn.prop('disabled', !canViewEvents); - downloadBtn.prop('disabled', !canViewEvents); - deleteBtn.prop('disabled', !canEditEvents); + renameBtn.prop('disabled', !canEdit.Events); + archiveBtn.prop('disabled', !(!eventData.Archived && canEdit.Events)); + unarchiveBtn.prop('disabled', !(eventData.Archived && canEdit.Events)); + editBtn.prop('disabled', !canEdit.Events); + exportBtn.prop('disabled', !canView.Events); + downloadBtn.prop('disabled', !canView.Events); + deleteBtn.prop('disabled', !canEdit.Events); // Don't enable the back button if there is no previous zm page to go back to backBtn.prop('disabled', !document.referrer.length); @@ -1183,7 +1183,7 @@ function initPage() { // Manage the UNARCHIVE button document.getElementById("unarchiveBtn").addEventListener("click", function onUnarchiveClick(evt) { - if ( ! canEditEvents ) { + if ( ! canEdit.Events ) { enoperm(); return; } @@ -1198,7 +1198,7 @@ function initPage() { // Manage the EDIT button document.getElementById("editBtn").addEventListener("click", function onEditClick(evt) { - if ( ! canEditEvents ) { + if ( ! canEdit.Events ) { enoperm(); return; } @@ -1253,7 +1253,7 @@ function initPage() { // Manage the DELETE button document.getElementById("deleteBtn").addEventListener("click", function onDeleteClick(evt) { - if ( ! canEditEvents ) { + if ( ! canEdit.Events ) { enoperm(); return; } diff --git a/web/skins/classic/views/js/event.js.php b/web/skins/classic/views/js/event.js.php index d24b12c2f..05d9f5ffb 100644 --- a/web/skins/classic/views/js/event.js.php +++ b/web/skins/classic/views/js/event.js.php @@ -63,7 +63,6 @@ var rate = ''; // really only used when setting up initial pl var scale = ""; var LabelFormat = "LabelFormat())?>"; -var canEditEvents = ; var streamTimeout = ; var canStreamNative = ; diff --git a/web/skins/classic/views/js/events.js b/web/skins/classic/views/js/events.js index 0ea67a095..cabcc76ce 100644 --- a/web/skins/classic/views/js/events.js +++ b/web/skins/classic/views/js/events.js @@ -58,8 +58,8 @@ function processRows(rows) { row.Id = '' + eid + ''; row.Name = '' + row.Name + '' + '
' + archived + emailed + '
'; - if ( canEditMonitors ) row.Monitor = '' + row.Monitor + ''; - if ( canEditEvents ) row.Cause = '' + row.Cause + ''; + if ( canEdit.Monitors ) row.Monitor = '' + row.Monitor + ''; + if ( canEdit.Events ) row.Cause = '' + row.Cause + ''; if ( row.Notes.indexOf('detected:') >= 0 ) { row.Cause = row.Cause + '
' + row.Notes + '
'; } else if ( row.Notes != 'Forced Web: ' ) { @@ -105,7 +105,7 @@ function getDelConfirmModal() { // Manage the DELETE CONFIRMATION modal button function manageDelConfirmModalBtns() { document.getElementById("delConfirmBtn").addEventListener("click", function onDelConfirmClick(evt) { - if ( ! canEditEvents ) { + if ( ! canEdit.Events ) { enoperm(); return; } @@ -163,13 +163,13 @@ function initPage() { function() { selections = table.bootstrapTable('getSelections'); - viewBtn.prop('disabled', !(selections.length && canViewEvents)); - archiveBtn.prop('disabled', !(selections.length && canEditEvents)); - unarchiveBtn.prop('disabled', !(getArchivedSelections()) && canEditEvents); - editBtn.prop('disabled', !(selections.length && canEditEvents)); - exportBtn.prop('disabled', !(selections.length && canViewEvents)); - downloadBtn.prop('disabled', !(selections.length && canViewEvents)); - deleteBtn.prop('disabled', !(selections.length && canEditEvents)); + viewBtn.prop('disabled', !(selections.length && canView.Events)); + archiveBtn.prop('disabled', !(selections.length && canEdit.Events)); + unarchiveBtn.prop('disabled', !(getArchivedSelections()) && canEdit.Events); + editBtn.prop('disabled', !(selections.length && canEdit.Events)); + exportBtn.prop('disabled', !(selections.length && canView.Events)); + downloadBtn.prop('disabled', !(selections.length && canView.Events)); + deleteBtn.prop('disabled', !(selections.length && canEdit.Events)); }); // Don't enable the back button if there is no previous zm page to go back to @@ -228,7 +228,7 @@ function initPage() { // Manage the UNARCHIVE button document.getElementById("unarchiveBtn").addEventListener("click", function onUnarchiveClick(evt) { - if ( ! canEditEvents ) { + if ( ! canEdit.Events ) { enoperm(); return; } @@ -246,7 +246,7 @@ function initPage() { // Manage the EDIT button document.getElementById("editBtn").addEventListener("click", function onEditClick(evt) { - if ( ! canEditEvents ) { + if ( ! canEdit.Events ) { enoperm(); return; } @@ -292,7 +292,7 @@ function initPage() { // Manage the DELETE button document.getElementById("deleteBtn").addEventListener("click", function onDeleteClick(evt) { - if ( ! canEditEvents ) { + if ( ! canEdit.Events ) { enoperm(); return; } diff --git a/web/skins/classic/views/js/groups.js b/web/skins/classic/views/js/groups.js index e5b87ef02..571269ea4 100644 --- a/web/skins/classic/views/js/groups.js +++ b/web/skins/classic/views/js/groups.js @@ -50,7 +50,7 @@ function deleteGroup( element ) { } function configureButtons( element ) { - if ( canEditGroups ) { + if ( canEdit.Groups ) { var form = element.form; if ( element.checked ) { form.deleteBtn.disabled = (element.value == 0); @@ -64,7 +64,7 @@ function configModalBtns() { console.log("No groupForm found"); return; } - if ( !canEditGroups ) { + if ( !canEdit.Groups ) { console.log("Cannot edit groups"); form.elements['action'].disabled = disabled; return; diff --git a/web/skins/classic/views/js/options.js b/web/skins/classic/views/js/options.js index 96ede5a18..2566e2ab7 100644 --- a/web/skins/classic/views/js/options.js +++ b/web/skins/classic/views/js/options.js @@ -62,11 +62,11 @@ function initPage() { var NewStorageBtn = $j('#NewStorageBtn'); var NewServerBtn = $j('#NewServerBtn'); - if ( canEditSystem ) enableStorageModal(); - if ( canEditSystem ) enableServerModal(); + if ( canEdit.System ) enableStorageModal(); + if ( canEdit.System ) enableServerModal(); - NewStorageBtn.prop('disabled', !canEditSystem); - NewServerBtn.prop('disabled', !canEditSystem); + NewStorageBtn.prop('disabled', !canEdit.System); + NewServerBtn.prop('disabled', !canEdit.System); } $j(document).ready(function() { diff --git a/web/skins/classic/views/js/options.js.php b/web/skins/classic/views/js/options.js.php index 5281cde8c..49a4e94d3 100644 --- a/web/skins/classic/views/js/options.js.php +++ b/web/skins/classic/views/js/options.js.php @@ -4,4 +4,3 @@ if ( restartWarning ) { alert( "" ); } -var canEditSystem = ; diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 84c0382dd..6871095e6 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -267,7 +267,7 @@ function getStreamCmdResponse(respObj, respText) { setButtonState('zoomOutBtn', 'inactive'); } - if ( canEditMonitors ) { + if ( canEdit.Monitors ) { if ( streamStatus.enabled ) { enableAlmBtn.addClass('disabled'); enableAlmBtn.prop('title', disableAlarmsStr); @@ -285,7 +285,7 @@ function getStreamCmdResponse(respObj, respText) { forceAlmBtn.prop('disabled', true); } enableAlmBtn.prop('disabled', false); - } // end if canEditMonitors + } // end if canEdit.Monitors if ( streamStatus.auth ) { auth_hash = streamStatus.auth; @@ -772,7 +772,7 @@ function processClicks(event, field, value, row, $element) { // Manage the DELETE CONFIRMATION modal button function manageDelConfirmModalBtns() { document.getElementById("delConfirmBtn").addEventListener("click", function onDelConfirmClick(evt) { - if ( ! canEditEvents ) { + if ( ! canEdit.Events ) { enoperm(); return; } @@ -795,7 +795,7 @@ function manageDelConfirmModalBtns() { } function initPage() { - if ( canViewControl ) { + if ( canView.Control ) { // Load the PTZ Preset modal into the DOM if ( monitorControllable ) getCtrlPresetModal(); // Load the settings modal into the DOM @@ -866,7 +866,7 @@ function initPage() { }); // Only enable the settings button for local cameras - settingsBtn.prop('disabled', !canViewControl); + settingsBtn.prop('disabled', !canView.Control); if ( monitorType != 'Local' ) settingsBtn.hide(); // Init the bootstrap-table diff --git a/web/skins/classic/views/js/watch.js.php b/web/skins/classic/views/js/watch.js.php index d0ef131b6..444ae4edd 100644 --- a/web/skins/classic/views/js/watch.js.php +++ b/web/skins/classic/views/js/watch.js.php @@ -74,7 +74,6 @@ var eventsRefreshTimeout = ; var imageRefreshTimeout = ; var canStreamNative = ; -var canViewControl = ; var canPlayPauseAudio = Browser.ie; diff --git a/web/skins/classic/views/js/zone.js.php b/web/skins/classic/views/js/zone.js.php index 9fadea32c..dc9b823c2 100644 --- a/web/skins/classic/views/js/zone.js.php +++ b/web/skins/classic/views/js/zone.js.php @@ -128,7 +128,6 @@ var streamSrc = ""; var statusRefreshTimeout = ; var imageRefreshTimeout = ; -var canEditMonitors = ; var canStreamNative = ; var canPlayPauseAudio = Browser.ie; From 4e09a328367103182ae6f2158157af4530771f1d Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Tue, 8 Dec 2020 14:36:19 -0600 Subject: [PATCH 071/116] fix one canEdit --- web/skins/classic/views/js/console.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/js/console.js b/web/skins/classic/views/js/console.js index 4a64171aa..688d0d5ca 100644 --- a/web/skins/classic/views/js/console.js +++ b/web/skins/classic/views/js/console.js @@ -112,7 +112,7 @@ function reloadWindow() { function manageFunctionModal(evt) { evt.preventDefault(); - if ( !canEditEvents ) { + if ( !canEdit.Events ) { enoperm(); return; } From 951debab7fdb80536e84dece28b63d324fd5167b Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 9 Dec 2020 12:25:40 -0600 Subject: [PATCH 072/116] watch.js - replace mootools ajax w/ jquery --- web/skins/classic/views/js/watch.js | 212 +++++++++++++++------------- 1 file changed, 116 insertions(+), 96 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 6871095e6..d308af7a0 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -9,23 +9,6 @@ var forceAlmBtn = $j('#forceAlmBtn'); var table = $j('#eventList'); var filterQuery = '&filter[Query][terms][0][attr]=MonitorId&filter[Query][terms][0][op]=%3d&filter[Query][terms][0][val]='+monitorId; -if ( monitorType != 'WebSite' ) { - var streamCmdParms = 'view=request&request=stream&connkey='+connKey; - if ( auth_hash ) { - streamCmdParms += '&auth='+auth_hash; - } - var streamCmdReq = new Request.JSON( { - url: monitorUrl, - method: 'get', - timeout: AJAX_TIMEOUT, - link: 'chain', - onError: getStreamCmdError, - onSuccess: getStreamCmdResponse, - onFailure: getStreamCmdFailure - } ); - var streamCmdTimer = null; -} - /* This is the format of the json object sent by bootstrap-table @@ -194,10 +177,6 @@ function getStreamCmdError(text, error) { window.location.reload(); } -function getStreamCmdFailure(xhr) { - console.log(xhr); -} - function getStreamCmdResponse(respObj, respText) { watchdogOk('stream'); if ( streamCmdTimer ) { @@ -296,10 +275,7 @@ function getStreamCmdResponse(respObj, respText) { var newSrc = oldSrc.replace(/auth=\w+/i, 'auth='+streamStatus.auth); streamImg.src = newSrc; } - streamCmdParms = streamCmdParms.replace(/auth=\w+/i, 'auth='+streamStatus.auth); - statusCmdParms = statusCmdParms.replace(/auth=\w+/i, 'auth='+streamStatus.auth); table.bootstrapTable('refresh'); - controlParms = controlParms.replace(/auth=\w+/i, 'auth='+streamStatus.auth); } // end if have a new auth hash } // end if respObj.status } else { @@ -339,7 +315,10 @@ function streamCmdPause( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_PAUSE); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_PAUSE; + streamCmdReq(data); } } @@ -364,10 +343,21 @@ function streamCmdPlay( action ) { } } if ( action ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_PLAY); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_PLAY; + streamCmdReq(data); } } +function streamCmdReq(data) { + $j.getJSON(thisUrl + '?view=request&request=stream&connkey='+connKey, data) + .done(getStreamCmdResponse) + .fail(getStreamCmdError); + + var streamCmdTimer = null; +} + function streamCmdStop( action ) { setButtonState('pauseBtn', 'inactive'); setButtonState('playBtn', 'unavail'); @@ -379,7 +369,10 @@ function streamCmdStop( action ) { setButtonState('fastRevBtn', 'unavail'); } if ( action ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_STOP); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_STOP; + streamCmdReq(data); } setButtonState('stopBtn', 'unavail'); setButtonState('playBtn', 'active'); @@ -396,7 +389,10 @@ function streamCmdFastFwd( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_FASTFWD); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_FASTFWD; + streamCmdReq(data); } } @@ -411,7 +407,10 @@ function streamCmdSlowFwd( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_SLOWFWD); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_SLOWFWD; + streamCmdReq(data); } setButtonState('pauseBtn', 'active'); if ( monitorStreamReplayBuffer ) { @@ -430,7 +429,10 @@ function streamCmdSlowRev( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_SLOWREV); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_SLOWREV; + streamCmdReq(data); } setButtonState('pauseBtn', 'active'); if ( monitorStreamReplayBuffer ) { @@ -449,43 +451,51 @@ function streamCmdFastRev( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_FASTREV); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_FASTREV; + streamCmdReq(data); } } function streamCmdZoomIn( x, y ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_ZOOMIN+"&x="+x+"&y="+y); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.x = x; + data.y = y; + data.command = CMD_ZOOMIN; + streamCmdReq(data); } function streamCmdZoomOut() { - streamCmdReq.send(streamCmdParms+"&command="+CMD_ZOOMOUT); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_ZOOMOUT; + streamCmdReq(data); } function streamCmdScale( scale ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_SCALE+"&scale="+scale); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_SCALE; + data.scale = scale; + streamCmdReq(data); } function streamCmdPan( x, y ) { - streamCmdReq.send(streamCmdParms+"&command="+CMD_PAN+"&x="+x+"&y="+y); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.x = x; + data.y = y; + data.command = CMD_PAN; + streamCmdReq(data); } function streamCmdQuery() { - streamCmdReq.send(streamCmdParms+"&command="+CMD_QUERY); -} - -if ( monitorType != 'WebSite' ) { - var statusCmdParms = "view=request&request=status&entity=monitor&id="+monitorId+"&element[]=Status&element[]=FrameRate"; - if ( auth_hash ) { - statusCmdParms += '&auth='+auth_hash; - } - var statusCmdReq = new Request.JSON( { - url: monitorUrl, - method: 'get', - timeout: AJAX_TIMEOUT, - link: 'cancel', - onSuccess: getStatusCmdResponse - } ); - var statusCmdTimer = null; + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = CMD_QUERY; + streamCmdReq(data); } function getStatusCmdResponse(respObj, respText) { @@ -509,22 +519,24 @@ function getStatusCmdResponse(respObj, respText) { } function statusCmdQuery() { - statusCmdReq.send(statusCmdParms); + $j.getJSON(thisUrl + '?view=request&request=status&entity=monitor&element[]=Status&element[]=FrameRate&id='+monitorId) + .done(getStatusCmdResponse) + .fail(logAjaxFail); + + var streamCmdTimer = null; } -if ( monitorType != 'WebSite' ) { - var alarmCmdParms = 'view=request&request=alarm&id='+monitorId; - if ( auth_hash ) { - alarmCmdParms += '&auth='+auth_hash; - } - var alarmCmdReq = new Request.JSON( { - url: monitorUrl, - method: 'get', - timeout: AJAX_TIMEOUT, - link: 'cancel', - onSuccess: getAlarmCmdResponse, - onTimeout: streamCmdQuery - } ); +function alarmCmdReq(data) { + $j.getJSON(thisUrl + '?view=request&request=alarm&id='+monitorId, data) + .done(getAlarmCmdResponse) + .fail(function(jqxhr, textStatus, error) { + if(textstatus === "timeout") { + streamCmdQuery(); + } else { + logAjaxFail(jqxhr, textStatus, error); + } + }); + var alarmCmdFirst = true; } @@ -533,11 +545,17 @@ function getAlarmCmdResponse(respObj, respText) { } function cmdDisableAlarms() { - alarmCmdReq.send(alarmCmdParms+"&command=disableAlarms"); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = 'disableAlarms'; + alarmCmdReq(data); } function cmdEnableAlarms() { - alarmCmdReq.send(alarmCmdParms+"&command=enableAlarms"); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = 'enableAlarms'; + alarmCmdReq(data); } function cmdAlarm() { @@ -549,17 +567,19 @@ function cmdAlarm() { } function cmdForceAlarm() { - alarmCmdReq.send(alarmCmdParms+"&command=forceAlarm"); - if ( window.event ) { - window.event.preventDefault(); - } + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = 'forceAlarm'; + alarmCmdReq(data); + if ( window.event ) window.event.preventDefault(); } function cmdCancelForcedAlarm() { - alarmCmdReq.send(alarmCmdParms+"&command=cancelForcedAlarm"); - if ( window.event ) { - window.event.preventDefault(); - } + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.command = 'cancelForcedAlarm'; + alarmCmdReq(data); + if ( window.event ) window.event.preventDefault(); return false; } @@ -571,18 +591,10 @@ function cmdForce() { } } -if ( monitorType != 'WebSite' ) { - var controlParms = 'view=request&request=control&id='+monitorId; - if ( auth_hash ) { - controlParms += '&auth='+auth_hash; - } - var controlReq = new Request.JSON( { - url: monitorUrl, - method: 'post', - timeout: AJAX_TIMEOUT, - link: 'cancel', - onSuccess: getControlResponse - } ); +function controlReq(data) { + $j.getJSON(thisUrl + '?view=request&request=control&id='+monitorId, data) + .done(getControlResponse) + .fail(logAjaxFail); } function getControlResponse(respObj, respText) { @@ -601,7 +613,8 @@ function controlCmd(event) { xtell = button.getAttribute('data-xtell'); ytell = button.getAttribute('data-ytell'); - var locParms = ''; + var data = new Object(); + if ( event && (xtell || ytell) ) { var target = event.target; var offset = $j(target).offset(); @@ -618,7 +631,7 @@ function controlCmd(event) { } else if ( xtell == 2 ) { xge = 2*(50 - xge); } - locParms += '&xge='+xge; + data.xge = xge; } if ( ytell ) { var yge = parseInt((y*100)/height); @@ -627,21 +640,28 @@ function controlCmd(event) { } else if ( ytell == 2 ) { yge = 2*(50 - yge); } - locParms += '&yge='+yge; + data.yge = yge; } } - controlReq.send(controlParms+"&control="+control+locParms); + + if ( auth_hash ) data.auth = auth_hash; + data.control = control + controlReq(data); + if ( streamMode == 'single' ) { fetchImage.pass($('imageFeed').getElement('img')).delay(1000); } } function controlCmdImage( x, y ) { - var imageControlParms = controlParms; - imageControlParms += '&scale='+scale; - imageControlParms += '&control='+imageControlMode; - - controlReq.send( imageControlParms+"&x="+x+"&y="+y ); + var data = new Object(); + if ( auth_hash ) data.auth = auth_hash; + data.scale = scale; + data.control = imageControlMode; + data.x = x; + data.y = y; + controlReq(data); + if ( streamMode == 'single' ) { fetchImage.pass( $('imageFeed').getElement('img') ).delay( 1000 ); } From eb4b7f248d488a1ac73eb5d2f6c1cfc092c0e416 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sat, 5 Dec 2020 19:50:58 -0500 Subject: [PATCH 073/116] handle sort_field and limit not existing in _REQUEST --- web/includes/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index d5478b74f..c2072a706 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -1200,8 +1200,8 @@ function sortHeader($field, $querySep='&') { '?view='.$view, 'page=1'.(isset($_REQUEST['filter'])?$_REQUEST['filter']['query']:''), 'sort_field='.$field, - 'sort_asc='.($_REQUEST['sort_field'] == $field ? !$_REQUEST['sort_asc'] : 0), - 'limit='.validInt($_REQUEST['limit']), + 'sort_asc='.( ( isset($_REQUEST['sort_field']) and ( $_REQUEST['sort_field'] == $field ) ) ? !$_REQUEST['sort_asc'] : 0), + 'limit='.(isset($_REQUEST['limit']) ? validInt($_REQUEST['limit']) : ''), (isset($_REQUEST['eid']) ? 'eid='.$_REQUEST['eid'] : '' ), )); } From 5482d3b3d54001ecae4a154d2a6fd4dd9ffc0421 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 9 Dec 2020 17:56:09 -0500 Subject: [PATCH 074/116] Quiet error when calling logout when already logged out --- web/includes/auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/includes/auth.php b/web/includes/auth.php index ced24ff9d..5a95dec94 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -105,7 +105,7 @@ function validateUser($username='', $password='') { function userLogout() { global $user; - ZM\Info('User "'.$user['Username'].'" logged out'); + ZM\Info('User "'.($user?$user['Username']:'no one').'" logged out'); $user = null;// unset only clears the local variable zm_session_clear(); } From 026b8cfb0c7e63e8937c5a566d489d9eae92d2ee Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 9 Dec 2020 17:58:46 -0600 Subject: [PATCH 075/116] eslint --- web/skins/classic/views/js/watch.js | 47 ++++++++++++++--------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index d308af7a0..6aed02d63 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -1,3 +1,4 @@ +var streamCmdTimer = null; var streamStatus; var auth_hash; var alarmState = STATE_IDLE; @@ -315,7 +316,7 @@ function streamCmdPause( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_PAUSE; streamCmdReq(data); @@ -343,7 +344,7 @@ function streamCmdPlay( action ) { } } if ( action ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_PLAY; streamCmdReq(data); @@ -369,7 +370,7 @@ function streamCmdStop( action ) { setButtonState('fastRevBtn', 'unavail'); } if ( action ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_STOP; streamCmdReq(data); @@ -389,7 +390,7 @@ function streamCmdFastFwd( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_FASTFWD; streamCmdReq(data); @@ -407,7 +408,7 @@ function streamCmdSlowFwd( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_SLOWFWD; streamCmdReq(data); @@ -429,7 +430,7 @@ function streamCmdSlowRev( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_SLOWREV; streamCmdReq(data); @@ -451,7 +452,7 @@ function streamCmdFastRev( action ) { setButtonState('fastRevBtn', 'inactive'); } if ( action ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_FASTREV; streamCmdReq(data); @@ -459,7 +460,7 @@ function streamCmdFastRev( action ) { } function streamCmdZoomIn( x, y ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.x = x; data.y = y; @@ -468,22 +469,22 @@ function streamCmdZoomIn( x, y ) { } function streamCmdZoomOut() { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_ZOOMOUT; streamCmdReq(data); } function streamCmdScale( scale ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_SCALE; data.scale = scale; - streamCmdReq(data); + streamCmdReq(data); } function streamCmdPan( x, y ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.x = x; data.y = y; @@ -492,7 +493,7 @@ function streamCmdPan( x, y ) { } function streamCmdQuery() { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = CMD_QUERY; streamCmdReq(data); @@ -530,14 +531,12 @@ function alarmCmdReq(data) { $j.getJSON(thisUrl + '?view=request&request=alarm&id='+monitorId, data) .done(getAlarmCmdResponse) .fail(function(jqxhr, textStatus, error) { - if(textstatus === "timeout") { + if (textstatus === "timeout") { streamCmdQuery(); } else { logAjaxFail(jqxhr, textStatus, error); } }); - - var alarmCmdFirst = true; } function getAlarmCmdResponse(respObj, respText) { @@ -545,14 +544,14 @@ function getAlarmCmdResponse(respObj, respText) { } function cmdDisableAlarms() { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = 'disableAlarms'; alarmCmdReq(data); } function cmdEnableAlarms() { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = 'enableAlarms'; alarmCmdReq(data); @@ -567,7 +566,7 @@ function cmdAlarm() { } function cmdForceAlarm() { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = 'forceAlarm'; alarmCmdReq(data); @@ -575,7 +574,7 @@ function cmdForceAlarm() { } function cmdCancelForcedAlarm() { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.command = 'cancelForcedAlarm'; alarmCmdReq(data); @@ -613,7 +612,7 @@ function controlCmd(event) { xtell = button.getAttribute('data-xtell'); ytell = button.getAttribute('data-ytell'); - var data = new Object(); + var data = {}; if ( event && (xtell || ytell) ) { var target = event.target; @@ -645,7 +644,7 @@ function controlCmd(event) { } if ( auth_hash ) data.auth = auth_hash; - data.control = control + data.control = control; controlReq(data); if ( streamMode == 'single' ) { @@ -654,14 +653,14 @@ function controlCmd(event) { } function controlCmdImage( x, y ) { - var data = new Object(); + var data = {}; if ( auth_hash ) data.auth = auth_hash; data.scale = scale; data.control = imageControlMode; data.x = x; data.y = y; controlReq(data); - + if ( streamMode == 'single' ) { fetchImage.pass( $('imageFeed').getElement('img') ).delay( 1000 ); } From c43ffcf58f012cf431a47c9a007b5002b41c7352 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 9 Dec 2020 18:02:34 -0600 Subject: [PATCH 076/116] eslint --- web/skins/classic/js/skin.js.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/js/skin.js.php b/web/skins/classic/js/skin.js.php index b10598235..a15d32526 100644 --- a/web/skins/classic/js/skin.js.php +++ b/web/skins/classic/js/skin.js.php @@ -40,8 +40,8 @@ var thisUrl = ''; var serverId = ''; -var canView = new Object(); -var canEdit = new Object(); +var canView = {}; +var canEdit = {}; Date: Wed, 9 Dec 2020 18:19:10 -0600 Subject: [PATCH 077/116] don't set zoom class in frames.js --- web/skins/classic/views/js/frames.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/frames.js b/web/skins/classic/views/js/frames.js index 1451c6eeb..85c2a05ef 100644 --- a/web/skins/classic/views/js/frames.js +++ b/web/skins/classic/views/js/frames.js @@ -118,8 +118,7 @@ function initPage() { var thumb_ndx = $j('#framesTable tr th').filter(function() { return $j(this).text().trim() == 'Thumbnail'; }).index(); - var thmbClass = WEB_ANIMATE_THUMBS ? 'colThumbnail zoom' : 'colThumbnail'; - table.find("tr td:nth-child(" + (thumb_ndx+1) + ")").addClass(thmbClass); + table.find("tr td:nth-child(" + (thumb_ndx+1) + ")").addClass('colThumbnail'); }); } From e0ac68786f2b4ffdb3ab983f4dd0359c912b80e0 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 9 Dec 2020 18:48:58 -0600 Subject: [PATCH 078/116] remove unneeded thumb animation functions from frames.js --- web/skins/classic/views/js/frames.js | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/web/skins/classic/views/js/frames.js b/web/skins/classic/views/js/frames.js index 85c2a05ef..3e8517fd9 100644 --- a/web/skins/classic/views/js/frames.js +++ b/web/skins/classic/views/js/frames.js @@ -26,27 +26,6 @@ function processRows(rows) { return rows; } -function thumbnail_onmouseover(event) { - var img = event.target; - img.src = ''; - img.src = img.getAttribute('full_img_src'); -} - -function thumbnail_onmouseout(event) { - var img = event.target; - img.src = ''; - img.src = img.getAttribute('img_src'); -} - -function initThumbAnimation() { - if ( WEB_ANIMATE_THUMBS ) { - $j('.colThumbnail img').each(function() { - this.addEventListener('mouseover', thumbnail_onmouseover, false); - this.addEventListener('mouseout', thumbnail_onmouseout, false); - }); - } -} - function processClicks(event, field, value, row, $element) { if ( field == 'Score' ) { window.location.assign('?view=stats&eid='+row.EventId+'&fid='+row.FrameId); From 3a4cdb7e5041599675253b3315e653adf4629f50 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Wed, 9 Dec 2020 20:06:38 -0600 Subject: [PATCH 079/116] eslint --- web/skins/classic/views/js/watch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 6aed02d63..1fe53744e 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -356,7 +356,7 @@ function streamCmdReq(data) { .done(getStreamCmdResponse) .fail(getStreamCmdError); - var streamCmdTimer = null; + streamCmdTimer = null; } function streamCmdStop( action ) { @@ -524,7 +524,7 @@ function statusCmdQuery() { .done(getStatusCmdResponse) .fail(logAjaxFail); - var streamCmdTimer = null; + streamCmdTimer = null; } function alarmCmdReq(data) { From 9fb953bc848ade9a6302268aa27489dd5b68ef21 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Thu, 10 Dec 2020 07:24:48 -0600 Subject: [PATCH 080/116] set the right image attributes for frames view --- web/skins/classic/js/skin.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js index ebfa5c0fe..925018a12 100644 --- a/web/skins/classic/js/skin.js +++ b/web/skins/classic/js/skin.js @@ -894,8 +894,9 @@ function thumbnail_onmouseover(event) { timeout = setTimeout(function() { var img = event.target; var imgClass = ( currentView == 'console' ) ? 'zoom-console' : 'zoom'; + var imgAttr = ( currentView == 'frames' ) ? 'full_img_src' : 'stream_src'; img.src = ''; - img.src = img.getAttribute('stream_src'); + img.src = img.getAttribute(imgAttr); img.addClass(imgClass); }, 350); } @@ -904,8 +905,9 @@ function thumbnail_onmouseout(event) { clearTimeout(timeout); var img = event.target; var imgClass = ( currentView == 'console' ) ? 'zoom-console' : 'zoom'; + var imgAttr = ( currentView == 'frames' ) ? 'img_src' : 'still_src'; img.src = ''; - img.src = img.getAttribute('still_src'); + img.src = img.getAttribute(imgAttr); img.removeClass(imgClass); } From 37d4b3472f43ddb251f3433ec59126bb0f8cc60d Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 10 Dec 2020 13:43:16 -0500 Subject: [PATCH 081/116] Add useful help for function modal describing each mode and the purpose of the Enabled checkbox --- web/ajax/modals/function.php | 24 +++++++- web/lang/en_gb.php | 58 ++++++++++++++++++++ web/skins/classic/css/base/views/console.css | 3 + web/skins/classic/views/js/console.js | 11 ++++ 4 files changed, 93 insertions(+), 3 deletions(-) diff --git a/web/ajax/modals/function.php b/web/ajax/modals/function.php index e6bab2718..44e23b711 100644 --- a/web/ajax/modals/function.php +++ b/web/ajax/modals/function.php @@ -37,11 +37,29 @@ if ( !canEdit('Monitors') ) return; -
+
+
+
+ + +'.$OLANG['FUNCTION_DECODING_ENABLED']['Help'].'
'; + } +?> +
Monitor()->Name()) ?> (MonitorId() ?>)
Cause()) ?>
Notes()) ?>
StartTime())) ?>
StartDateTime())) ?>
Length() ?>
Frames() ?>
AlarmFrames() ?>
Server()->Name())?>Id()])?count($EventsByMonitor[$Monitor->Id()]['Events']):0 ?>Id()])?count($EventsByMonitor[$Monitor->Id()]['Events']):0 ?> link_to($FirstEvent->Id().' at '.$FirstEvent->StartDateTime()) : 'none'?> link_to($LastEvent->Id().' at '.$LastEvent->StartDateTime()) : 'none'?> - '.count($FileMissing).'' : '0' ?> + querystring().'">'.count($FileMissing).'' : '0' ?> - '.count($ZeroSize).'' : '0' ?> + querystring().'">'.count($ZeroSize).'' : '0' ?>
ImageBufferCount() * $monitor->Width() * $monitor->Height() * $monitor->Colours(), 0) ?>
@@ -512,11 +512,26 @@ switch ( $name ) { } echo htmlSelect('newMonitor[Function]', $function_options, $monitor->Function()); ?> +
+ $translated ) { + if ( isset($OLANG['FUNCTION_'.strtoupper($fn)]) ) { + echo '
'.$OLANG['FUNCTION_'.strtoupper($fn)]['Help'].'
'; + } + } +?> +
-
+ - + Type() != 'WebSite' ) { From 2e9f991211c15a134efe0680dab51877bd748afe Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 10 Dec 2020 14:32:44 -0500 Subject: [PATCH 090/116] give the label column in monitor view a min-width of 300px so that it is always large enough --- web/skins/classic/css/base/views/monitor.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/skins/classic/css/base/views/monitor.css b/web/skins/classic/css/base/views/monitor.css index 2cdc0c400..29af3612a 100644 --- a/web/skins/classic/css/base/views/monitor.css +++ b/web/skins/classic/css/base/views/monitor.css @@ -42,3 +42,6 @@ input[name="newMonitor[Height]"] { select.chosen { width: 100%; } +tr td:first-child { + min-width: 300px; +} From 06ecb3ccb1cf76eb6e04e133d2ac90533f58ccc4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 10 Dec 2020 14:39:14 -0500 Subject: [PATCH 091/116] Add update script to add DecodeEnabled --- db/zm_update-1.35.16.sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 db/zm_update-1.35.16.sql diff --git a/db/zm_update-1.35.16.sql b/db/zm_update-1.35.16.sql new file mode 100644 index 000000000..50c952bca --- /dev/null +++ b/db/zm_update-1.35.16.sql @@ -0,0 +1,12 @@ + +SET @s = (SELECT IF( + (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE() + AND table_name = 'Monitors' + AND column_name = 'DecodingEnabled' + ) > 0, + "SELECT 'Column DecodingEnabled already exists in Monitors'", + "ALTER TABLE Monitors ADD `DecodingEnabled` tinyint(3) unsigned NOT NULL default '1' AFTER `Enabled`" + )); + +PREPARE stmt FROM @s; +EXECUTE stmt; From eb00cf405af7782709880892e57727e6f8de99f4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 10 Dec 2020 15:14:37 -0500 Subject: [PATCH 092/116] Add DecodingEnabled to monitor view --- web/skins/classic/views/monitor.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index aae5bddf1..8af0f1238 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -502,6 +502,9 @@ switch ( $name ) { +Type() != 'WebSite' ) { +?> - + + + + Type() != 'WebSite' ) { + if ( isset($OLANG['FUNCTION_DECODING_ENABLED']) ) { + echo '
'.$OLANG['FUNCTION_DECODING_ENABLED']['Help'].'
'; + } ?> + +
- + From f89da79c277c0df908be43efaea76e1d69279d05 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 10 Dec 2020 16:25:24 -0500 Subject: [PATCH 097/116] Fix comparing empty arrays. explode on an empty string returns an array with a single element '' instead of an empty array --- web/includes/Object.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/includes/Object.php b/web/includes/Object.php index 148cb2bd3..5b630a1a7 100644 --- a/web/includes/Object.php +++ b/web/includes/Object.php @@ -250,8 +250,8 @@ class ZM_Object { } else if ( property_exists($this, $field) ) { $type = (array_key_exists($field, $this->defaults) && is_array($this->defaults[$field])) ? $this->defaults[$field]['type'] : 'scalar'; if ( $type == 'set' ) { - $old_value = is_array($this->$field) ? $this->$field : explode(',', $this->$field); - $new_value = is_array($value) ? $value : explode(',', $value); + $old_value = is_array($this->$field) ? $this->$field : ($this->$field ? explode(',', $this->$field) : array()); + $new_value = is_array($value) ? $value : ($value ? explode(',', $value) : array()); $diff = array_recursive_diff($old_value, $new_value); if ( count($diff) ) { From bfd16db34bc462b2abb06f10c723ef5ef77fa5fe Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 11 Dec 2020 09:33:36 -0500 Subject: [PATCH 098/116] add format padding so that right align file size strings will line up nicely. --- web/includes/functions.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index c2072a706..fe7d2ae77 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -2149,14 +2149,15 @@ function folder_size($dir) { } // end function folder_size function human_filesize($size, $precision = 2) { - $units = array('B','kB','MB','GB','TB','PB','EB','ZB','YB'); + $units = array('B ','kB','MB','GB','TB','PB','EB','ZB','YB'); $step = 1024; $i = 0; while (($size / $step) > 0.9) { $size = $size / $step; $i++; } - return round($size, $precision).$units[$i]; + # The idea is that we can right align this and have the digits columns line up nicely. + return sprintf('%.'.$precision.'f', round($size, $precision)).$units[$i]; } function csrf_startup() { From 77a35c18139da91426f1b2d8d19f320a9047219f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 11 Dec 2020 09:33:54 -0500 Subject: [PATCH 099/116] right align colDiskSpace so that digits line up nicely --- web/skins/classic/css/base/skin.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/skins/classic/css/base/skin.css b/web/skins/classic/css/base/skin.css index 217364152..f75ea26c6 100644 --- a/web/skins/classic/css/base/skin.css +++ b/web/skins/classic/css/base/skin.css @@ -741,3 +741,6 @@ a.flip { float: right; margin-right: -20px; } +#content table.major .colDiskSpace { + text-align: right; +} From 3483ee8db104cbabce76b5bb2f34e9ea822d9ec4 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 11 Dec 2020 09:34:50 -0500 Subject: [PATCH 100/116] clean up code a little by make an event_link string and using it. Fix the cause column not being a valid link. I think it used to popup an edit but it should just go to the event view --- web/skins/classic/views/export.php | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/web/skins/classic/views/export.php b/web/skins/classic/views/export.php index e234402f4..c9aef58a7 100644 --- a/web/skins/classic/views/export.php +++ b/web/skins/classic/views/export.php @@ -143,21 +143,22 @@ $event_count = 0; while ( $event_row = dbFetchNext($results) ) { $event = new ZM\Event($event_row); $scale = max(reScale(SCALE_BASE, $event->Monitor()->DefaultScale(), ZM_WEB_DEFAULT_SCALE), SCALE_BASE); + $event_link = '?view=event&eid='.$event->Id().$filterQuery.$sortQuery.'&page=1'; ?> Archived() ? ' class="archived"' : '' ?>> - - - + + + - - - + + + @@ -168,9 +169,7 @@ while ( $event_row = dbFetchNext($results) ) { echo ''; } unset($event); - echo ' - -'; + echo PHP_EOL.''.PHP_EOL; } # end foreach event ?> @@ -179,9 +178,7 @@ while ( $event_row = dbFetchNext($results) ) { - -'.human_filesize($disk_space_total).''.PHP_EOL; } ?> From c26fc1f36a215a6f8da773eb90abffa9644d230c Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 11 Dec 2020 09:42:35 -0500 Subject: [PATCH 101/116] Replace thisUrl with the export ajax request as a GET parameter, making it easier to find inlogs. --- web/skins/classic/views/js/export.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/web/skins/classic/views/js/export.js b/web/skins/classic/views/js/export.js index 01bb3de3c..264000ac5 100644 --- a/web/skins/classic/views/js/export.js +++ b/web/skins/classic/views/js/export.js @@ -64,12 +64,10 @@ function exportResponse(respObj, respText) { } function exportEvents( ) { - var parms = 'view=event&request=event&action=export'; - parms += '&'+$('contentForm').toQueryString(); var query = new Request.JSON( { - url: thisUrl, + url: '?view=event&request=event&action=export', method: 'post', - data: parms, + data: $('contentForm').toQueryString(), onSuccess: exportResponse } ); query.send(); From 51a862057f340df8e883043b806db66d77916b8f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 11 Dec 2020 09:49:43 -0500 Subject: [PATCH 102/116] Fix a link missing a quote --- web/skins/classic/views/export.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/web/skins/classic/views/export.php b/web/skins/classic/views/export.php index c9aef58a7..cddd8cb29 100644 --- a/web/skins/classic/views/export.php +++ b/web/skins/classic/views/export.php @@ -152,10 +152,9 @@ while ( $event_row = dbFetchNext($results) ) { - + +( $event->EndDateTime() ? ' until ' . strftime(STRF_FMT_DATETIME_SHORTER, strtotime($event->EndDateTime())) : '' ) ?> From 2f0df74c547c4d2e5038d7b85b4956c083a98f39 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sat, 12 Dec 2020 11:37:50 -0600 Subject: [PATCH 103/116] show the analyse image in frames view if it exists --- web/ajax/frames.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/web/ajax/frames.php b/web/ajax/frames.php index e85988dbc..e129200e7 100644 --- a/web/ajax/frames.php +++ b/web/ajax/frames.php @@ -161,15 +161,30 @@ function queryRequest($eid, $search, $advsearch, $sort, $offset, $order, $limit) $returned_rows = array(); foreach ( array_slice($filtered_rows, $offset, $limit) as $row ) { if ( ZM_WEB_LIST_THUMBS ) { + + # Build the path to the potential analysis image + $analImage = sprintf('%0'.ZM_EVENT_IMAGE_DIGITS.'d-analyse.jpg', $row['FrameId']); + $analPath = $Event->Path().'/'.$analImage; + $alarmFrame = $row['Type'] == 'Alarm'; + $hasAnalImage = $alarmFrame && file_exists($analPath) && filesize($analPath); + + # Our base img source component, which we will add on to $base_img_src = '?view=image&fid=' .$row['Id']; + + # if an analysis images exists, use it as the thumbnail + if ( $hasAnalImage ) $base_img_src .= '&show=analyse'; + + # Build the subcomponents needed for the image source $ratio_factor = $Monitor->ViewHeight() / $Monitor->ViewWidth(); $thmb_width = ZM_WEB_LIST_THUMB_WIDTH ? 'width='.ZM_WEB_LIST_THUMB_WIDTH : ''; $thmb_height = 'height="'.( ZM_WEB_LIST_THUMB_HEIGHT ? ZM_WEB_LIST_THUMB_HEIGHT : ZM_WEB_LIST_THUMB_WIDTH*$ratio_factor ) .'"'; $thmb_fn = 'filename=' .$Event->MonitorId(). '_' .$row['EventId']. '_' .$row['FrameId']. '.jpg'; + + # Assemble the scaled and unscaled image source image source components $img_src = join('&', array_filter(array($base_img_src, $thmb_width, $thmb_height, $thmb_fn))); $full_img_src = join('&', array_filter(array($base_img_src, $thmb_fn))); - $frame_src = '?view=frame&eid=' .$row['EventId']. '&fid=' .$row['FrameId']; + # finally, we assemble the the entire thumbnail img src structure, whew $row['Thumbnail'] = ''; } $returned_rows[] = $row; From 237335c02289fdae33be1724e2f16e82f591bf3e Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sat, 12 Dec 2020 12:45:36 -0600 Subject: [PATCH 104/116] watch.js - finish mootools replacement --- web/skins/classic/views/js/watch.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/web/skins/classic/views/js/watch.js b/web/skins/classic/views/js/watch.js index 1fe53744e..2773a2421 100644 --- a/web/skins/classic/views/js/watch.js +++ b/web/skins/classic/views/js/watch.js @@ -648,7 +648,7 @@ function controlCmd(event) { controlReq(data); if ( streamMode == 'single' ) { - fetchImage.pass($('imageFeed').getElement('img')).delay(1000); + setTimeout(fetchImage, 1000, $j('#imageFeed img')); } } @@ -662,12 +662,12 @@ function controlCmdImage( x, y ) { controlReq(data); if ( streamMode == 'single' ) { - fetchImage.pass( $('imageFeed').getElement('img') ).delay( 1000 ); + setTimeout(fetchImage, 1000, $j('#imageFeed img')); } } function fetchImage( streamImage ) { - streamImage.src = streamImage.src.replace(/rand=\d+/i, 'rand='+Math.floor((Math.random() * 1000000) )); + streamImage.attr('src', streamImage.attr('src').replace(/rand=\d+/i, 'rand='+Math.floor((Math.random() * 1000000) ))); } function handleClick( event ) { @@ -824,25 +824,25 @@ function initPage() { if ( monitorType != 'WebSite' ) { if ( streamMode == 'single' ) { statusCmdTimer = statusCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); - watchdogCheck.pass('status').periodical(statusRefreshTimeout*2); + setInterval(watchdogCheck, statusRefreshTimeout*2, 'status'); } else { streamCmdTimer = streamCmdQuery.delay( (Math.random()+0.1)*statusRefreshTimeout ); - watchdogCheck.pass('stream').periodical(statusRefreshTimeout*2); + setInterval(watchdogCheck, statusRefreshTimeout*2, 'stream'); } if ( canStreamNative || (streamMode == 'single') ) { - var streamImg = $('imageFeed').getElement('img'); + var streamImg = $j('#imageFeed img'); if ( !streamImg ) { - streamImg = $('imageFeed').getElement('object'); + streamImg = $j('#imageFeed object'); } if ( !streamImg ) { console.error('No streamImg found for imageFeed'); } else { if ( streamMode == 'single' ) { - streamImg.addEvent('click', fetchImage.pass(streamImg)); - fetchImage.pass(streamImg).periodical(imageRefreshTimeout); + streamImg.click(streamImg, fetchImage); + setInterval(fetchImage, imageRefreshTimeout, $j('#imageFeed img')); } else { - streamImg.addEvent('click', function(event) { + streamImg.click(function(event) { handleClick(event); }); } From 71d1607f69c0abae37ff8ee650f269be8a46c164 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sat, 12 Dec 2020 15:06:59 -0600 Subject: [PATCH 105/116] fix php -> js issue when $alarmframe was false --- web/skins/classic/views/frame.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/skins/classic/views/frame.php b/web/skins/classic/views/frame.php index dc9ef9c4f..c3fd22ccf 100644 --- a/web/skins/classic/views/frame.php +++ b/web/skins/classic/views/frame.php @@ -49,7 +49,7 @@ $prevFid = $fid-1; $nextFid = $fid+1; $lastFid = $maxFid; -$alarmFrame = $Frame->Type() == 'Alarm'; +$alarmFrame = ( $Frame->Type() == 'Alarm' ) ? 1 : 0; if ( isset($_REQUEST['scale']) ) { $scale = validNum($_REQUEST['scale']); From c24564e0cdd33e8e3e00770bb8d5dba32945dfce Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sun, 13 Dec 2020 13:20:26 -0600 Subject: [PATCH 106/116] insert frame stats into frame view --- web/ajax/stats.php | 25 +++++++++++++++++++++++-- web/skins/classic/views/frame.php | 10 +++++++++- web/skins/classic/views/js/frame.js | 21 +++++++++++++++++++++ web/skins/classic/views/js/frame.js.php | 12 ++++++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/web/ajax/stats.php b/web/ajax/stats.php index 3789ff448..06ce9d733 100644 --- a/web/ajax/stats.php +++ b/web/ajax/stats.php @@ -6,6 +6,7 @@ if ( empty($_REQUEST['fid']) ) ajaxError('Frame Id Not Provided'); $eid = $_REQUEST['eid']; $fid = $_REQUEST['fid']; $row = ( isset($_REQUEST['row']) ) ? $_REQUEST['row'] : ''; +$raw = isset($_REQUEST['raw']); $data = array(); // Not sure if this is required @@ -16,8 +17,28 @@ if ( ZM_OPT_USE_AUTH && (ZM_AUTH_RELAY == 'hashed') ) { } } -$data['html'] = getStatsTableHTML($eid, $fid, $row); -$data['id'] = '#contentStatsTable' .$row; +if ( $raw ) { + $sql = 'SELECT S.*,E.*,Z.Name AS ZoneName,Z.Units,Z.Area,M.Name AS MonitorName FROM Stats AS S LEFT JOIN Events AS E ON S.EventId = E.Id LEFT JOIN Zones AS Z ON S.ZoneId = Z.Id LEFT JOIN Monitors AS M ON E.MonitorId = M.Id WHERE S.EventId = ? AND S.FrameId = ? ORDER BY S.ZoneId'; + $stat = dbFetchOne( $sql, NULL, array( $eid, $fid ) ); + if ( $stat ) { + $stat['ZoneName'] = validHtmlStr($stat['ZoneName']); + $stat['PixelDiff'] = validHtmlStr($stat['PixelDiff']); + $stat['AlarmPixels'] = sprintf( "%d (%d%%)", $stat['AlarmPixels'], (100*$stat['AlarmPixels']/$stat['Area']) ); + $stat['FilterPixels'] = sprintf( "%d (%d%%)", $stat['FilterPixels'], (100*$stat['FilterPixels']/$stat['Area']) ); + $stat['BlobPixels'] = sprintf( "%d (%d%%)", $stat['BlobPixels'], (100*$stat['BlobPixels']/$stat['Area']) ); + $stat['Blobs'] = validHtmlStr($stat['Blobs']); + if ( $stat['Blobs'] > 1 ) { + $stat['BlobSizes'] = sprintf( "%d-%d (%d%%-%d%%)", $stat['MinBlobSize'], $stat['MaxBlobSize'], (100*$stat['MinBlobSize']/$stat['Area']), (100*$stat['MaxBlobSize']/$stat['Area']) ); + } else { + $stat['BlobSizes'] = sprintf( "%d (%d%%)", $stat['MinBlobSize'], 100*$stat['MinBlobSize']/$stat['Area'] ); + } + $stat['AlarmLimits'] = validHtmlStr($stat['MinX'].",".$stat['MinY']."-".$stat['MaxX'].",".$stat['MaxY']); + } + $data['raw'] = $stat; +} else { + $data['html'] = getStatsTableHTML($eid, $fid, $row); + $data['id'] = '#contentStatsTable' .$row; +} ajaxResponse($data); return; diff --git a/web/skins/classic/views/frame.php b/web/skins/classic/views/frame.php index c3fd22ccf..7895810d4 100644 --- a/web/skins/classic/views/frame.php +++ b/web/skins/classic/views/frame.php @@ -103,7 +103,14 @@ xhtmlHeaders(__FILE__, translate('Frame').' - '.$Event->Id().' - '.$Frame->Frame -
+
+ + +
Enabled() ? ' checked="checked"' : '' ?>/>Enabled() ? ' checked="checked"' : '' ?>/> +'.$OLANG['FUNCTION_ANALYSIS_ENABLED']['Help'].''; + } +?> +
Type()); ?>
@@ -515,12 +518,19 @@ switch ( $name ) {
Enabled() ? ' checked="checked"' : '' ?>/>
From f77292e6ccac9dbdeb3c8dfb216435a0a7664f26 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 10 Dec 2020 16:23:08 -0500 Subject: [PATCH 093/116] Move the decoding_enabled logic to constructor to save a few cycles --- src/zm_monitor.cpp | 14 +++++++++++++- src/zm_monitor.h | 11 ++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 5a01b7879..51b8ba12a 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -463,6 +463,18 @@ Monitor::Monitor( exit(-1); } + // Do this here to save a few cycles with all the comparisons + decoding_enabled = !( + ( function == RECORD or function == NODECT ) + and + ( savejpegs == 0 ) + and + ( videowriter == H264PASSTHROUGH ) + and + !decoding_enabled + ); + Debug(1, "Decoding enabled: %d", decoding_enabled); + memset(mem_ptr, 0, mem_size); shared_data->size = sizeof(SharedData); shared_data->active = enabled; @@ -1874,7 +1886,7 @@ void Monitor::Reload() { if ( !row ) { Error("Can't run query: %s", mysql_error(&dbconn)); return; - } + } if ( MYSQL_ROW dbrow = row->mysql_row() ) { int index = 0; function = (Function)atoi(dbrow[index++]); diff --git a/src/zm_monitor.h b/src/zm_monitor.h index ed2ce4cbf..2900af743 100644 --- a/src/zm_monitor.h +++ b/src/zm_monitor.h @@ -253,6 +253,7 @@ protected: CameraType type; Function function; // What the monitor is doing bool enabled; // Whether the monitor is enabled or asleep + bool decoding_enabled; // Whether the monitor will decode h264/h265 packets unsigned int width; // Normally the same as the camera, but not if partly rotated unsigned int height; // Normally the same as the camera, but not if partly rotated bool v4l_multi_buffer; @@ -447,15 +448,7 @@ public: return enabled; } inline bool DecodingEnabled() const { - return !( - ( monitor->GetFunction() == Monitor::RECORD or monitor->GetFunction() == Monitor::NODECT ) - and - ( monitor->GetOptSaveJPEGs() == 0 ) - and - ( monitor->GetOptVideoWriter() == Monitor::H264PASSTHROUGH ) - and - !decoding_enabled - ); + return decoding_enabled; } inline const char *EventPrefix() const { return event_prefix; } inline bool Ready() const { From da8d96dddac52582333c7fa0ce6c537bf3445977 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 10 Dec 2020 16:24:09 -0500 Subject: [PATCH 094/116] Don't pass types to changes, it doesn't do anything. Add DecodingEnabled to request --- web/includes/actions/monitor.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/includes/actions/monitor.php b/web/includes/actions/monitor.php index be17578cf..80f9083af 100644 --- a/web/includes/actions/monitor.php +++ b/web/includes/actions/monitor.php @@ -55,6 +55,7 @@ if ( $action == 'save' ) { 'Controllable' => 0, 'TrackMotion' => 0, 'Enabled' => 0, + 'DecodingEnabled' => 0, 'Exif' => 0, 'RTSPDescribe' => 0, 'V4LMultiBuffer' => '', @@ -82,7 +83,7 @@ if ( $action == 'save' ) { } } - $changes = $monitor->changes($_REQUEST['newMonitor'], $types); + $changes = $monitor->changes($_REQUEST['newMonitor']); $restart = false; if ( count($changes) ) { From c37433acfcb90f6c7692f5b2cbb3c657081318f1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 10 Dec 2020 16:24:33 -0500 Subject: [PATCH 095/116] show/hide DecodingEnabled depending on function --- web/skins/classic/views/js/monitor.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web/skins/classic/views/js/monitor.js b/web/skins/classic/views/js/monitor.js index 77876e7c9..ae6abacb0 100644 --- a/web/skins/classic/views/js/monitor.js +++ b/web/skins/classic/views/js/monitor.js @@ -155,6 +155,11 @@ function initPage() { } else { $j('#FunctionEnabled').show(); } + if ( this.value == 'Record' || this.value == 'Nodect' ) { + $j('#FunctionDecodingEnabled').show(); + } else { + $j('#FunctionDecodingEnabled').hide(); + } }; el.onchange(); }); From 8bda0b550474852c87525ab7b9ec4dab7329e995 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 10 Dec 2020 16:24:45 -0500 Subject: [PATCH 096/116] fix element name on DecodingEnabled --- web/skins/classic/views/monitor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index 740a1d7ba..3b854f4fe 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -538,13 +538,13 @@ switch ( $name ) {
DecodingEnabled() ? ' checked="checked"' : '' ?>/> '.$OLANG['FUNCTION_DECODING_ENABLED']['Help'].''; } ?> - +
- Id().($event->Archived()?'*':'') ?> + Id().($event->Archived()?'*':'') ?> Name()).($event->Archived()?'*':'') ?>MonitorId(), $event->MonitorName(), canEdit( 'Monitors' ) ) ?>Cause()), canEdit( 'Events' ), 'title="' .htmlspecialchars($event->Notes()). '" class="eDetailLink" data-eid=' .$event->Id(). '"') ?>Name()).($event->Archived()?'*':'') ?>MonitorId(), $event->MonitorName(), canEdit('Monitors')) ?>Cause()), canEdit('Events'), 'title="' .htmlspecialchars($event->Notes()). '" class="eDetailLink" data-eid=' .$event->Id(). '"') ?> StartDateTime())) . -( $event->EndDateTime() ? ' until ' . strftime(STRF_FMT_DATETIME_SHORTER, strtotime($event->EndDateTime()) ) : '' ) ?> +( $event->EndDateTime() ? ' until ' . strftime(STRF_FMT_DATETIME_SHORTER, strtotime($event->EndDateTime())) : '' ) ?> Length() ) ?>Id(), $event->Frames() ) ?>Id(), $event->AlarmFrames() ) ?>Length()) ?>Id(), $event->Frames()) ?>Id(), $event->AlarmFrames()) ?> TotScore() ?> AvgScore() ?> MaxScore() ?>'.human_filesize($event->DiskSpace()).'
events
Name()).($event->Archived()?'*':'') ?> MonitorId(), $event->MonitorName(), canEdit('Monitors')) ?>Cause()), canEdit('Events'), 'title="' .htmlspecialchars($event->Notes()). '" class="eDetailLink" data-eid=' .$event->Id(). '"') ?>Cause()), canView('Events'), 'title="' .htmlspecialchars($event->Notes()). '" class="eDetailLink" data-eid="'.$event->Id().'"') ?> StartDateTime())) . -( $event->EndDateTime() ? ' until ' . strftime(STRF_FMT_DATETIME_SHORTER, strtotime($event->EndDateTime())) : '' ) ?> - Length()) ?> Id(), $event->Frames()) ?> Id(), $event->AlarmFrames()) ?>
+ +
+ +

', $Event->Id(), $Frame->FrameId(), $scale, ( $show=='anal'?'capt':'anal' ) ); @@ -152,6 +159,7 @@ if ( file_exists($rImagePath) ) { class="" />

+
diff --git a/web/skins/classic/views/js/frame.js b/web/skins/classic/views/js/frame.js index e91796f6a..a5cab581e 100644 --- a/web/skins/classic/views/js/frame.js +++ b/web/skins/classic/views/js/frame.js @@ -40,6 +40,24 @@ document.addEventListener('DOMContentLoaded', function onDCL() { document.getElementById('scaleControl').addEventListener('change', changeScale); }); +function getStat(params) { + $j.getJSON(thisUrl + '?view=request&request=stats&raw=true', params) + .done(function(data) { + var stat = data.raw; + + $j('#frameStatsTable').empty().append(''); + $j.each( statHeaderStrings, function( key ) { + var th = $j('').addClass('text-right').text(statHeaderStrings[key]); + var tdString = ( stat ) ? stat[key] : 'n/a'; + var td = $j('').text(tdString); + var row = $j('').append(th, td); + + $j('#frameStatsTable tbody').append(row); + }); + }) + .fail(logAjaxFail); +} + function initPage() { var backBtn = $j('#backBtn'); @@ -65,6 +83,9 @@ function initPage() { evt.preventDefault(); window.location.href = thisUrl+'?view=stats&eid='+eid+'&fid='+fid; }); + + // Load the frame stats + getStat({eid:eid, fid:fid}); } $j(document).ready(function() { diff --git a/web/skins/classic/views/js/frame.js.php b/web/skins/classic/views/js/frame.js.php index 9bd2f4236..bf1c237c7 100644 --- a/web/skins/classic/views/js/frame.js.php +++ b/web/skins/classic/views/js/frame.js.php @@ -13,3 +13,15 @@ var eid = ; var fid = ; var record_event_stats = ; var alarmFrame = ; + +var statHeaderStrings = {}; +statHeaderStrings.ZoneName = ""; +statHeaderStrings.PixelDiff = ""; +statHeaderStrings.AlarmPixels = ""; +statHeaderStrings.FilterPixels = ""; +statHeaderStrings.BlobPixels = ""; +statHeaderStrings.Blobs = ""; +statHeaderStrings.BlobSizes = ""; +statHeaderStrings.AlarmLimits = ""; +statHeaderStrings.Score = ""; + From 882447317a087c0d849609f3ba9915331e47fbdd Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sun, 13 Dec 2020 14:42:39 -0600 Subject: [PATCH 107/116] eslint --- web/skins/classic/views/js/frame.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/skins/classic/views/js/frame.js b/web/skins/classic/views/js/frame.js index a5cab581e..dc66cd80f 100644 --- a/web/skins/classic/views/js/frame.js +++ b/web/skins/classic/views/js/frame.js @@ -84,8 +84,8 @@ function initPage() { window.location.href = thisUrl+'?view=stats&eid='+eid+'&fid='+fid; }); - // Load the frame stats - getStat({eid:eid, fid:fid}); + // Load the frame stats + getStat({eid: eid, fid: fid}); } $j(document).ready(function() { From 48c63093943732e890bc7ebb9787985b4a79266c Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sun, 13 Dec 2020 15:01:47 -0600 Subject: [PATCH 108/116] add emailed & archived status to event view --- web/skins/classic/views/event.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index 08ad9eacb..ee49f5841 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -221,6 +221,14 @@ if ( !$Event->Id() ) { + + + Archived ? translate('Yes') : translate('No') ?> + + + + Emailed ? translate('Yes') : translate('No') ?> + From 43d0b0fd558fddcd3976c3f02888326bc51bf8f6 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 11 Dec 2020 11:43:17 -0500 Subject: [PATCH 109/116] Add D1-PAL resolution --- web/skins/classic/views/monitor.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/skins/classic/views/monitor.php b/web/skins/classic/views/monitor.php index 3b854f4fe..814ea4333 100644 --- a/web/skins/classic/views/monitor.php +++ b/web/skins/classic/views/monitor.php @@ -850,11 +850,13 @@ include('_monitor_source_nvsocket.php'); '320x240'=>'320x240', '320x200'=>'320x200', '352x240'=>'352x240 CIF', + '352x480'=>'352x480', '640x480'=>'640x480', '640x400'=>'640x400', '704x240'=>'704x240 2CIF', '704x480'=>'704x480 4CIF', '720x480'=>'720x480 D1', + '720x576'=>'720x576 D1 PAL', '1280x720'=>'1280x720 720p', '1280x800'=>'1280x800', '1280x960'=>'1280x960 960p', From 4ae47659df0487e9959392be217b59e86c989303 Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Sun, 13 Dec 2020 21:19:38 -0600 Subject: [PATCH 110/116] use js to build event stats --- web/skins/classic/views/event.php | 69 +------------------------ web/skins/classic/views/js/event.js | 15 ++++++ web/skins/classic/views/js/event.js.php | 33 ++++++++++-- 3 files changed, 46 insertions(+), 71 deletions(-) diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index ee49f5841..6e98edf73 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -131,8 +131,6 @@ if ( !$Event->Id() ) { } else { if ( !file_exists($Event->Path()) ) echo '
Event was not found at '.$Event->Path().'. It is unlikely that playback will be possible.
'; - - $storage = validHtmlStr($Event->Storage()->Name()).( $Event->SecondaryStorageId() ? ', '.validHtmlStr($Event->SecondaryStorage()->Name()) : '' ); ?> @@ -164,72 +162,7 @@ if ( !$Event->Id() ) {
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Id() ?>
Name() ?>
Id() ?>
Name()) ?>
Cause()) ?>
StartDateTime())) ?>
Length().'s' ?>
Frames() ?>
AlarmFrames() ?>
TotScore() ?>
AvgScore() ?>
MaxScore() ?>
DiskSpace(null)) ?>
Archived ? translate('Yes') : translate('No') ?>
Emailed ? translate('Yes') : translate('No') ?>
diff --git a/web/skins/classic/views/js/event.js b/web/skins/classic/views/js/event.js index 37ef5966c..21dfd49eb 100644 --- a/web/skins/classic/views/js/event.js +++ b/web/skins/classic/views/js/event.js @@ -1075,10 +1075,25 @@ function getEvtStatsCookie() { return stats; } +function getStat() { + table.empty().append(''); + $j.each( eventDataStrings, function( key ) { + var th = $j('').addClass('text-right').text(eventDataStrings[key]); + var tdString = ( eventData ) ? eventData[key] : 'n/a'; + var td = $j('').text(tdString); + var row = $j('').append(th, td); + + $j('#eventStatsTable tbody').append(row); + }); +} + function initPage() { // Load the delete confirmation modal into the DOM getDelConfirmModal(); + // Load the event stats + getStat(); + var stats = getEvtStatsCookie(); if ( stats != 'on' ) table.toggle(false); diff --git a/web/skins/classic/views/js/event.js.php b/web/skins/classic/views/js/event.js.php index 05d9f5ffb..6c0504ea6 100644 --- a/web/skins/classic/views/js/event.js.php +++ b/web/skins/classic/views/js/event.js.php @@ -42,17 +42,44 @@ var eventData = { Id: 'Id() ?>', Name: 'Name() ?>', MonitorId: 'MonitorId() ?>', + MonitorName: 'Name()) ?>', + Cause: 'Cause()) ?>', Width: 'Width() ?>', Height: 'Height() ?>', Length: 'Length() ?>', StartDateTime: 'StartDateTime() ?>', + StartDateTimeFmt: 'StartDateTime())) ?>', EndDateTime: 'EndDateTime() ?>', Frames: 'Frames() ?>', - MonitorName: 'Name()) ?>', + AlarmFrames: 'AlarmFrames() ?>', + TotScore: 'TotScore() ?>', + AvgScore: 'AvgScore() ?>', + MaxScore: 'MaxScore() ?>', DiskSpace: 'DiskSpace(null)) ?>', - Storage: 'Storage()->Name()).( $Event->SecondaryStorageId() ? ', '.validHtmlStr($Event->SecondaryStorage()->Name()) : '' ) ?>', - Archived: Archived?'true':'false' ?> + Storage: 'Storage()->Name()).( $Event->SecondaryStorageId() ? ', '.validHtmlStr($Event->SecondaryStorage()->Name()) : '' ) ?>', + Archived: 'Archived ? translate('Yes') : translate('No') ?>', + Emailed: 'Emailed ? translate('Yes') : translate('No') ?>' }; + +var eventDataStrings = { + Id: '', + Name: '', + MonitorId: '', + MonitorName: '', + Cause: '', + StartDateTimeFmt: '', + Length: '', + Frames: '', + AlarmFrames: '', + TotScore: '', + AvgScore: '', + MaxScore: '', + DiskSpace: '', + Storage: '', + Archived: '', + Emailed: '' +}; + var monitorUrl = 'Storage()->Server()->UrlToIndex(); ?>'; var filterQuery = ''; From a5b945f97a8c11bd89acb672fb738cb7124fa51c Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Mon, 14 Dec 2020 06:55:45 -0600 Subject: [PATCH 111/116] touch up event view stat list --- web/skins/classic/views/event.php | 2 +- web/skins/classic/views/js/event.js | 2 +- web/skins/classic/views/js/event.js.php | 10 ++++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/web/skins/classic/views/event.php b/web/skins/classic/views/event.php index 6e98edf73..e50624a4d 100644 --- a/web/skins/classic/views/event.php +++ b/web/skins/classic/views/event.php @@ -162,7 +162,7 @@ if ( !$Event->Id() ) {
- +
diff --git a/web/skins/classic/views/js/event.js b/web/skins/classic/views/js/event.js index 21dfd49eb..6c96af62e 100644 --- a/web/skins/classic/views/js/event.js +++ b/web/skins/classic/views/js/event.js @@ -1079,7 +1079,7 @@ function getStat() { table.empty().append(''); $j.each( eventDataStrings, function( key ) { var th = $j('').addClass('text-right').text(eventDataStrings[key]); - var tdString = ( eventData ) ? eventData[key] : 'n/a'; + var tdString = ( eventData[key].length ) ? eventData[key] : 'n/a'; var td = $j('').text(tdString); var row = $j('').append(th, td); diff --git a/web/skins/classic/views/js/event.js.php b/web/skins/classic/views/js/event.js.php index 6c0504ea6..989682296 100644 --- a/web/skins/classic/views/js/event.js.php +++ b/web/skins/classic/views/js/event.js.php @@ -57,8 +57,10 @@ var eventData = { MaxScore: 'MaxScore() ?>', DiskSpace: 'DiskSpace(null)) ?>', Storage: 'Storage()->Name()).( $Event->SecondaryStorageId() ? ', '.validHtmlStr($Event->SecondaryStorage()->Name()) : '' ) ?>', - Archived: 'Archived ? translate('Yes') : translate('No') ?>', - Emailed: 'Emailed ? translate('Yes') : translate('No') ?>' + ArchivedStr: 'Archived ? translate('Yes') : translate('No') ?>', + EmailedStr: 'Emailed ? translate('Yes') : translate('No') ?>', + Archived: Archived?'true':'false' ?>, + Emailed: Emailed?'true':'false' ?> }; var eventDataStrings = { @@ -76,8 +78,8 @@ var eventDataStrings = { MaxScore: '', DiskSpace: '', Storage: '', - Archived: '', - Emailed: '' + ArchivedStr: '', + EmailedStr: '' }; var monitorUrl = 'Storage()->Server()->UrlToIndex(); ?>'; From 191e2133375793ba146e4a2b89e04a6448cf21be Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Mon, 14 Dec 2020 10:02:43 -0600 Subject: [PATCH 112/116] upgrade to jquery 3.5.1, use minified javascripts --- web/skins/classic/includes/functions.php | 4 +- web/skins/classic/js/jquery-2.2.4.js | 9814 --------------------- web/skins/classic/js/jquery-3.5.1.min.js | 2 + web/skins/classic/js/jquery-3.5.1.min.map | 1 + web/skins/classic/js/jquery.js | 1 - web/skins/classic/js/jquery.js.URL | 1 - web/skins/classic/js/jquery.min.js | 1 + web/skins/classic/js/jquery.min.js.URL | 1 + 8 files changed, 7 insertions(+), 9818 deletions(-) delete mode 100644 web/skins/classic/js/jquery-2.2.4.js create mode 100644 web/skins/classic/js/jquery-3.5.1.min.js create mode 100644 web/skins/classic/js/jquery-3.5.1.min.map delete mode 120000 web/skins/classic/js/jquery.js delete mode 100644 web/skins/classic/js/jquery.js.URL create mode 120000 web/skins/classic/js/jquery.min.js create mode 100644 web/skins/classic/js/jquery.min.js.URL diff --git a/web/skins/classic/includes/functions.php b/web/skins/classic/includes/functions.php index ee819ab58..e7b952a4a 100644 --- a/web/skins/classic/includes/functions.php +++ b/web/skins/classic/includes/functions.php @@ -871,8 +871,8 @@ function xhtmlFooter() { - - + + = 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = jQuery.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - // adding 1 corrects loss of precision from parseFloat (#15100) - var realStringObj = obj && obj.toString(); - return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; - }, - - isPlainObject: function( obj ) { - var key; - - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call( obj, "constructor" ) && - !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) { - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android<4.0, iOS<6 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf( "use strict" ) === 1 ) { - script = document.createElement( "script" ); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE9-11+ - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android<4.1 - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -// JSHint would error on this code due to the Symbol not being defined in ES5. -// Defining this global in .jshintrc would create a danger of using the global -// unguarded in another place, it seems safer to just disable JSHint for these -// three lines. -/* jshint ignore: start */ -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} -/* jshint ignore: end */ - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: iOS 8.2 (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.2.1 - * http://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2015-10-17 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // http://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, nidselect, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; - while ( i-- ) { - groups[i] = nidselect + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, parent, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( (parent = document.defaultView) && parent.top !== parent ) { - // Support: IE 11 - if ( parent.addEventListener ) { - parent.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( document.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var m = context.getElementById( id ); - return m ? [ m ] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - docElem.appendChild( div ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibing-combinator selector` fails - if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( (oldCache = uniqueCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - } ); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, - len = this.length, - ret = [], - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - // Support: Blackberry 4.6 - // gEBID returns nodes no longer in the document (#6963) - if ( elem && elem.parentNode ) { - - // Inject the element directly into the jQuery object - this.length = 1; - this[ 0 ] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( pos ? - pos.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnotwhite = ( /\S+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], - [ "notify", "progress", jQuery.Callbacks( "memory" ) ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this === promise ? newDefer.promise() : this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( function() { - - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || - ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. - // If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // Add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .progress( updateFunc( i, progressContexts, progressValues ) ) - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ); - } else { - --remaining; - } - } - } - - // If we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -} ); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } - } -} ); - -/** - * The ready event handler and self cleanup method - */ -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called - // after the browser event has already occurred. - // Support: IE9-10 only - // Older IE sometimes signals "interactive" too soon - if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); - } - } - return readyList.promise( obj ); -}; - -// Kick off the DOM ready check even if the user does not -jQuery.ready.promise(); - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - len ? fn( elems[ 0 ], key ) : emptyGet; -}; -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - /* jshint -W018 */ - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - register: function( owner, initial ) { - var value = initial || {}; - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable, non-writable property - // configurability must be true to allow the property to be - // deleted with the delete operator - } else { - Object.defineProperty( owner, this.expando, { - value: value, - writable: true, - configurable: true - } ); - } - return owner[ this.expando ]; - }, - cache: function( owner ) { - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( !acceptData( owner ) ) { - return {}; - } - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - owner[ this.expando ] && owner[ this.expando ][ key ]; - }, - access: function( owner, key, value ) { - var stored; - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase( key ) ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key === undefined ) { - this.register( owner ); - - } else { - - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( rnotwhite ) || [] ); - } - } - - i = name.length; - - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <= 35-45+ - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://code.google.com/p/chromium/issues/detail?id=378607 - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data, camelKey; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // with the key as-is - data = dataUser.get( elem, key ) || - - // Try to find dashed key if it exists (gh-2779) - // This is for 2.2.x only - dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() ); - - if ( data !== undefined ) { - return data; - } - - camelKey = jQuery.camelCase( key ); - - // Attempt to get data from the cache - // with the key camelized - data = dataUser.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - camelKey = jQuery.camelCase( key ); - this.each( function() { - - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = dataUser.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - dataUser.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf( "-" ) > -1 && data !== undefined ) { - dataUser.set( this, key, value ); - } - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || - !jQuery.contains( elem.ownerDocument, elem ); - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { return tween.cur(); } : - function() { return jQuery.css( elem, prop, "" ); }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([\w:-]+)/ ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE9 - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -// Support: IE9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE9-11+ - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== "undefined" ? - context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0-4.3, Safari<=5.1 - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Safari<=5.1, Android<4.2 - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<=11+ - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE9 -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Support (at least): Chrome, IE9 - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // - // Support: Firefox<=42+ - // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) - if ( delegateCount && cur.nodeType && - ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push( { elem: cur, handlers: matches } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + - "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split( " " ), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " + - "screenX screenY toElement" ).split( " " ), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + - ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + - ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome<28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android<4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://code.google.com/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, - - // Support: IE 10-11, Edge 10240+ - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName( "tbody" )[ 0 ] || - elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android<4.1, PhantomJS<2 - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <= 35-45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <= 35-45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - - // Keep domManip exposed until 3.0 (gh-2225) - domManip: domManip, - - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because push.apply(_, arraylike) throws - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); - - -var iframe, - elemdisplay = { - - // Support: Firefox - // We have to pre-define these values for FF (#10227) - HTML: "block", - BODY: "block" - }; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ - -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - display = jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = ( iframe || jQuery( "