Przeglądaj źródła

Version 1.2.11

- added support for Waveshare 5.65" 7-color e-paper display 600x448
- the unknown controller of this display doesn't support partial update, as far as known
- 7-color graphics support is available with class GxEPD2_7C
- 7-color graphics support requires paging even on ESP32
- 7-color graphics support causes heavy paging on Arduino UNO, gets very slow
- refresh is quite fast for a color e-paper display: 12 seconds
ZinggJM 6 lat temu
rodzic
commit
9cd2833eb0

+ 9 - 1
README.md

@@ -69,6 +69,7 @@
 - GDEW0371W7     3.7" b/w
 - GDEW042T2      4.2" b/w
 - GDEW042Z15     4.2" b/w/r
+- ACeP565        5.65" Waveshare 5.65" 7-color e-paper display 600x448
 - GDEW0583T7     5.83" b/w
 - GDEW0583T8     5.83" b/w 648x460
 - GDEW075T8      7.5" b/w
@@ -85,7 +86,14 @@
 - promotion panels from suppliers are welcome, to add support to GxEPD2
 - donation panels from users are welcome, to add support to GxEPD2
 
-### Version 1.2.10
+### Version 1.2.11
+- added support for Waveshare 5.65" 7-color e-paper display 600x448
+- the unknown controller of this display doesn't support partial update, as far as known
+- 7-color graphics support is available with class GxEPD2_7C
+- 7-color graphics support requires paging even on ESP32
+- 7-color graphics support causes heavy paging on Arduino UNO, gets very slow
+- refresh is quite fast for a color e-paper display: 12 seconds
+#### Version 1.2.10
 - added support for GDEH075Z90 7.5" b/w/r 880x528
 - the controller of GDEH075Z90 supports partial update, but refesh is full screen
 - the controller of GDEH075Z90 doesn't support differential update (not possible on 3-color anyway)

+ 97 - 4
examples/GxEPD2_Example/GxEPD2_Example.ino

@@ -59,6 +59,7 @@
 
 #include <GxEPD2_BW.h>
 #include <GxEPD2_3C.h>
+#include <GxEPD2_7C.h>
 #include <Fonts/FreeMonoBold9pt7b.h>
 
 #if defined (ESP8266)
@@ -95,6 +96,9 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
 //GxEPD2_3C < GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT / 4 > display(GxEPD2_750c_Z08(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075Z08 800x480
 //GxEPD2_3C < GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4 > display(GxEPD2_750c_Z90(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH075Z90 880x528
+// 7-color e-paper
+//GxEPD2_3C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 5.65" 7-color (3C graphics)
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 5.65" 7-color
 // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
 // HRDY -> 4, RST -> 2, CS -> SS(15), SCK -> SCK(14), MOSI -> MOSI(D7(13)), MISO -> MISO(D6(12)), GND -> GND, 5V -> 5V
 // note: 5V supply needs to be exact and strong; 5V pin of USB powered Wemos D1 mini doesn't work!
@@ -134,6 +138,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16));
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT / 4> display(GxEPD2_750c_Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW075Z08 800x480
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4> display(GxEPD2_750c_Z90(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH075Z90 880x528
+// 7-color e-paper
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // Waveshare 5.65" 7-color
 #endif
 
 #if defined(ESP32)
@@ -167,6 +173,9 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 2> display(GxEPD2_750c_Z90(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH075Z90 880x528
+// 7-color e-paper
+//GxEPD2_3C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // Waveshare 5.65" 7-color (3C graphics)
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // Waveshare 5.65" 7-color
 
 // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
 // HRDY -> 4, RST -> 16, CS -> SS(5), SCK -> SCK(18), MOSI -> MOSI(23), MISO -> MISO(19), GND -> GND, 5V -> 5V
@@ -215,6 +224,9 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1));
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW075Z08 800x480
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEH075Z90 880x528
+// 7-color e-paper
+#define MAX_HEIGHT_7C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) // 2 pixel per byte
+//GxEPD2_7C<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // Waveshare 5.65" 7-color
 #endif
 
 #if defined(__AVR)
@@ -255,6 +267,9 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH075Z90 880x528
+// 7-color e-paper
+#define MAX_HEIGHT_7C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) // 2 pixel per byte
+//GxEPD2_7C<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // Waveshare 5.65" 7-color
 
 // ***** for mapping of Waveshare Universal e-Paper Raw Panel Driver Shield for Arduino / NUCLEO *****
 // the RST line is not connected through level converter, but has a pull up resistor and a pull down diode to the Arduino pin; this is safe for 5V Arduino
@@ -292,6 +307,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7));
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z08 800x480
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); //GDEH075Z90 880x528
+// 7-color e-paper
+//GxEPD2_7C<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // Waveshare 5.65" 7-color
 
 // Waveshare 12.48 b/w SPI display board and frame or Good Display 12.48 b/w panel GDEW1248T3
 // general constructor for use with standard SPI pins, default SCK, MISO and MOSI, for UNO on UNO connectors
@@ -331,6 +348,7 @@
 #include "bitmaps/Bitmaps3c800x480.h" // 7.5"  b/w/r
 #include "bitmaps/Bitmaps3c880x528.h" // 7.5"  b/w/r
 #include "bitmaps/WS_Bitmaps800x600.h" // 6.0"  grey
+#include "bitmaps/WS_Bitmaps7c192x143.h" // 5.65" 7-color
 #endif
 #if defined(ESP32)
 #include "bitmaps/Bitmaps1304x984.h" // 12.48" b/w
@@ -378,6 +396,15 @@ void setup()
   showFont("FreeMonoBold9pt7b", &FreeMonoBold9pt7b);
   delay(1000);
   drawBitmaps();
+#if !defined(__AVR) // takes too long!
+  if (display.epd2.panel == GxEPD2::ACeP565)
+  {
+    //draw7colorlines();
+    //delay(2000);
+    draw7colors();
+    delay(4000);
+  }
+#endif
   if (display.epd2.hasPartialUpdate)
   {
     showPartialUpdate();
@@ -924,6 +951,9 @@ void drawBitmaps()
 #endif
 #ifdef _GxBitmaps3c880x528_H_
   drawBitmaps3c880x528();
+#endif
+#if defined(_WS_Bitmaps7c192x143_H_)
+  drawBitmaps7c192x143();
 #endif
   if ((display.epd2.WIDTH >= 200) && (display.epd2.HEIGHT >= 200))
   {
@@ -1038,8 +1068,8 @@ void drawBitmaps200x200()
         display.epd2.writeImageAgain(bitmaps[i], x, y, 200, 200, false, mirror_y, true);
       }
       delay(2000);
-      x += 40;
-      y += 40;
+      x += display.epd2.WIDTH / 4;
+      y += display.epd2.HEIGHT / 4;
       if ((x >= int16_t(display.epd2.WIDTH)) || (y >= int16_t(display.epd2.HEIGHT))) break;
     }
     if (!display.epd2.hasFastPartialUpdate) break; // comment out for full show
@@ -1476,8 +1506,8 @@ void drawBitmaps3c200x200()
         display.writeImage(bitmap_pairs[i].black, bitmap_pairs[i].red, x, y, 200, 200, false, false, true);
         display.refresh();
         delay(1000);
-        x += 40;
-        y += 40;
+        x += display.epd2.WIDTH / 4;
+        y += display.epd2.HEIGHT / 4;
         if ((x >= int16_t(display.epd2.WIDTH)) || (y >= int16_t(display.epd2.HEIGHT))) break;
       }
     }
@@ -1685,3 +1715,66 @@ void drawBitmaps3c880x528()
   }
 }
 #endif
+
+#if defined(_WS_Bitmaps7c192x143_H_)
+void drawBitmaps7c192x143()
+{
+  if (display.epd2.panel == GxEPD2::ACeP565)
+  {
+    display.drawNative(WS_Bitmap7c192x143, 0, (display.epd2.WIDTH - 192) / 2, (display.epd2.HEIGHT - 143) / 2, 192, 143, false, false, true);
+    delay(5000);
+  }
+}
+#endif
+
+void draw7colors()
+{
+  display.setRotation(0);
+  uint16_t h = display.height() / 7;
+  display.firstPage();
+  do
+  {
+    display.fillRect(0, 0, display.width(), h, GxEPD_BLACK);
+    display.fillRect(0, h, display.width(), h, GxEPD_WHITE);
+    display.fillRect(0, 2 * h, display.width(), h, GxEPD_GREEN);
+    display.fillRect(0, 3 * h, display.width(), h, GxEPD_BLUE);
+    display.fillRect(0, 4 * h, display.width(), h, GxEPD_RED);
+    display.fillRect(0, 5 * h, display.width(), h, GxEPD_YELLOW);
+    display.fillRect(0, 6 * h, display.width(), h, GxEPD_ORANGE);
+  }
+  while (display.nextPage());
+}
+
+void draw7colorlines()
+{
+  display.setRotation(0);
+  uint16_t h = 2;
+  display.firstPage();
+  do
+  {
+    uint16_t y = 0;
+    do
+    {
+      display.fillRect(0, y, display.width(), h, GxEPD_BLACK); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_WHITE); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_GREEN); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_WHITE); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_BLUE); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_WHITE); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_RED); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_WHITE); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_YELLOW); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_WHITE); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_ORANGE); y += h;
+      display.fillRect(0, y, display.width(), h, GxEPD_WHITE); y += h;
+    }
+    while ((y + 12 * h) < display.height());
+    //display.drawPixel(0, y, GxEPD_BLACK); display.drawPixel(10, y, GxEPD_GREEN);
+    //display.drawPixel(20, y, GxEPD_BLUE); display.drawPixel(30, y, GxEPD_RED);
+    //display.drawPixel(40, y, GxEPD_YELLOW); display.drawPixel(50, y, GxEPD_ORANGE);
+    display.fillRect(0, y, 2, 2, GxEPD_BLACK); display.fillRect(10, y, 2, 2, GxEPD_GREEN);
+    display.fillRect(20, y, 2, 2, GxEPD_BLUE); display.fillRect(30, y, 2, 2, GxEPD_RED);
+    display.fillRect(40, y, 2, 2, GxEPD_YELLOW); display.fillRect(50, y, 2, 2, GxEPD_ORANGE);
+  }
+  while (display.nextPage());
+}

+ 10 - 0
examples/GxEPD2_Example/GxEPD2_boards_added.h

@@ -52,6 +52,9 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH075Z90 880x528
+// 7-color e-paper
+#define MAX_HEIGHT_7C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) // 2 pixel per byte
+//GxEPD2_7C<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // Waveshare 5.65" 7-color
 #endif
 
 // Arduino MKR1000 or MKRZERO
@@ -94,6 +97,9 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5));
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075Z08 800x480
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH075Z90 880x528
+// 7-color e-paper
+#define MAX_HEIGHT_7C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) // 2 pixel per byte
+GxEPD2_7C<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // Waveshare 5.65" 7-color
 #endif
 
 // mapping suggestion for ESP32, e.g. LOLIN32 D32 PRO
@@ -131,6 +137,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075Z08 800x480
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT> display(GxEPD2_750c_Z90(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH075Z90 880x528
+// 7-color e-paper
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // Waveshare 5.65" 7-color
 // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
 // HRDY -> 4, RST -> 16, CS -> 5, SCK -> SCK(18), MOSI -> MOSI(23), MISO -> MISO(19), GND -> GND, 5V -> 5V
 // note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!
@@ -172,6 +180,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075Z08 800x480
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT> display(GxEPD2_750c_Z90(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH075Z90 880x528
+// 7-color e-paper
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // Waveshare 5.65" 7-color
 // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
 // HRDY -> 4, RST -> 16, CS -> SS(5), SCK -> SCK(18), MOSI -> MOSI(23), MISO -> MISO(19), GND -> GND, 5V -> 5V
 // note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!

+ 1 - 1
library.properties

@@ -1,5 +1,5 @@
 name=GxEPD2
-version=1.2.10
+version=1.2.11
 author=Jean-Marc Zingg
 maintainer=Jean-Marc Zingg
 sentence=Arduino Display Library for SPI E-Paper displays from Dalian Good Display and Waveshare. 

+ 12 - 5
src/GxEPD2.h

@@ -15,14 +15,20 @@
 #include <Arduino.h>
 #include <SPI.h>
 
+// color definitions for GxEPD and GxEPD2, values correspond to RGB565 values for TFTs
 #define GxEPD_BLACK     0x0000
-#define GxEPD_DARKGREY  0x7BEF      /* 128, 128, 128 */
-#define GxEPD_LIGHTGREY 0xC618      /* 192, 192, 192 */
 #define GxEPD_WHITE     0xFFFF
-#define GxEPD_RED       0xF800      /* 255,   0,   0 */
-
-#define GxEPD_YELLOW    GxEPD_RED
+// some controllers for b/w EPDs support grey levels
+#define GxEPD_DARKGREY  0x7BEF // 128, 128, 128
+#define GxEPD_LIGHTGREY 0xC618 // 192, 192, 192
+// values for 3-color or 7-color EPDs
+#define GxEPD_RED       0xF800 // 255,   0,   0
+#define GxEPD_YELLOW    0xFFE0 // 255, 255,   0 !!no longer same as GxEPD_RED!!
 #define GxEPD_COLORED   GxEPD_RED
+// values for 7-color EPDs only
+#define GxEPD_BLUE      0x001F //   0,   0, 255
+#define GxEPD_GREEN     0x07E0 //   0, 255,   0
+#define GxEPD_ORANGE    0xFD20 // 255, 165,   0
 
 class GxEPD2
 {
@@ -57,6 +63,7 @@ class GxEPD2
       GDEW027C44,  Waveshare_2_7_bwr = GDEW027C44,
       GDEW042Z15,  Waveshare_4_2_bwr = GDEW042Z15,
       GDEW0583Z21, Waveshare_5_83_bwr = GDEW0583Z21,
+      ACeP565,     Waveshare_5_65_7c = ACeP565,
       GDEW075Z09,  Waveshare_7_5_bwr = GDEW075Z09,
       GDEW075Z08,  Waveshare_7_5_bwr_Z08 = GDEW075Z08,
       GDEH075Z90,  Waveshare_7_5_bwr_Z90 = GDEH075Z90

+ 3 - 2
src/GxEPD2_3C.h

@@ -36,6 +36,7 @@
 #include "epd3c/GxEPD2_270c.h"
 #include "epd3c/GxEPD2_420c.h"
 #include "epd3c/GxEPD2_583c.h"
+#include "epd3c/GxEPD2_565c.h"
 #include "epd3c/GxEPD2_750c.h"
 #include "epd3c/GxEPD2_750c_Z08.h"
 #include "epd3c/GxEPD2_750c_Z90.h"
@@ -108,7 +109,7 @@ class GxEPD2_3C : public GxEPD2_GFX_BASE_CLASS
       _color_buffer[i] = (_color_buffer[i] | (1 << (7 - x % 8)));
       if (color == GxEPD_WHITE) return;
       else if (color == GxEPD_BLACK) _black_buffer[i] = (_black_buffer[i] & (0xFF ^ (1 << (7 - x % 8))));
-      else if (color == GxEPD_RED) _color_buffer[i] = (_color_buffer[i] & (0xFF ^ (1 << (7 - x % 8))));
+      else if ((color == GxEPD_RED) || (color == GxEPD_YELLOW)) _color_buffer[i] = (_color_buffer[i] & (0xFF ^ (1 << (7 - x % 8))));
     }
 
     void init(uint32_t serial_diag_bitrate = 0) // = 0 : disabled
@@ -138,7 +139,7 @@ class GxEPD2_3C : public GxEPD2_GFX_BASE_CLASS
       uint8_t red = 0xFF;
       if (color == GxEPD_WHITE);
       else if (color == GxEPD_BLACK) black = 0x00;
-      else if (color == GxEPD_RED) red = 0x00;
+      else if ((color == GxEPD_RED) || (color == GxEPD_YELLOW)) red = 0x00;
       for (uint16_t x = 0; x < sizeof(_black_buffer); x++)
       {
         _black_buffer[x] = black;

+ 501 - 0
src/GxEPD2_7C.h

@@ -0,0 +1,501 @@
+// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
+// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines!
+//
+// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#ifndef _GxEPD2_7C_H_
+#define _GxEPD2_7C_H_
+// uncomment next line to use class GFX of library GFX_Root instead of Adafruit_GFX
+//#include <GFX.h>
+
+#ifndef ENABLE_GxEPD2_GFX
+// default is off
+#define ENABLE_GxEPD2_GFX 0
+#endif
+
+#if ENABLE_GxEPD2_GFX
+#include "GxEPD2_GFX.h"
+#define GxEPD2_GFX_BASE_CLASS GxEPD2_GFX
+#elif defined(_GFX_H_)
+#define GxEPD2_GFX_BASE_CLASS GFX
+#else
+#include <Adafruit_GFX.h>
+#define GxEPD2_GFX_BASE_CLASS Adafruit_GFX
+#endif
+
+#include "GxEPD2_EPD.h"
+#include "epd3c/GxEPD2_565c.h"
+
+template<typename GxEPD2_Type, const uint16_t page_height>
+class GxEPD2_7C : public GxEPD2_GFX_BASE_CLASS
+{
+  public:
+    GxEPD2_Type epd2;
+#if ENABLE_GxEPD2_GFX
+    GxEPD2_7C(GxEPD2_Type epd2_instance) : GxEPD2_GFX_BASE_CLASS(epd2, GxEPD2_Type::WIDTH, GxEPD2_Type::HEIGHT), epd2(epd2_instance)
+#else
+    GxEPD2_7C(GxEPD2_Type epd2_instance) : GxEPD2_GFX_BASE_CLASS(GxEPD2_Type::WIDTH, GxEPD2_Type::HEIGHT), epd2(epd2_instance)
+#endif
+    {
+      _page_height = page_height;
+      _pages = (HEIGHT / _page_height) + ((HEIGHT % _page_height) > 0);
+      _using_partial_mode = false;
+      _current_page = 0;
+      setFullWindow();
+    }
+
+    uint16_t pages()
+    {
+      return _pages;
+    }
+
+    uint16_t pageHeight()
+    {
+      return _page_height;
+    }
+
+    bool mirror(bool m)
+    {
+      _swap_ (_mirror, m);
+      return m;
+    }
+
+    void drawPixel(int16_t x, int16_t y, uint16_t color)
+    {
+      if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) return;
+      if (_mirror) x = width() - x - 1;
+      // check rotation, move pixel around if necessary
+      switch (getRotation())
+      {
+        case 1:
+          _swap_(x, y);
+          x = WIDTH - x - 1;
+          break;
+        case 2:
+          x = WIDTH - x - 1;
+          y = HEIGHT - y - 1;
+          break;
+        case 3:
+          _swap_(x, y);
+          y = HEIGHT - y - 1;
+          break;
+      }
+      // transpose partial window to 0,0
+      x -= _pw_x;
+      y -= _pw_y;
+      // clip to (partial) window
+      if ((x < 0) || (x >= _pw_w) || (y < 0) || (y >= _pw_h)) return;
+      // adjust for current page
+      y -= _current_page * _page_height;
+      // check if in current page
+      if ((y < 0) || (y >= _page_height)) return;
+      uint32_t i = x / 2 + uint32_t(y) * (_pw_w / 2);
+      uint8_t pv = color7(color);
+      if (x & 1) _pixel_buffer[i] = (_pixel_buffer[i] & 0xF0) | pv;
+      else _pixel_buffer[i] = (_pixel_buffer[i] & 0x0F) | (pv << 4);
+    }
+
+    void init(uint32_t serial_diag_bitrate = 0) // = 0 : disabled
+    {
+      epd2.init(serial_diag_bitrate);
+      _using_partial_mode = false;
+      _current_page = 0;
+      setFullWindow();
+    }
+
+    // init method with additional parameters:
+    // initial false for re-init after processor deep sleep wake up, if display power supply was kept
+    // only relevant for b/w displays with fast partial update
+    // reset_duration = 20 is default; a value of 2 may help with "clever" reset circuit of newer boards from Waveshare
+    // pulldown_rst_mode true for alternate RST handling to avoid feeding 5V through RST pin
+    void init(uint32_t serial_diag_bitrate, bool initial, uint16_t reset_duration = 20, bool pulldown_rst_mode = false)
+    {
+      epd2.init(serial_diag_bitrate, initial, reset_duration, pulldown_rst_mode);
+      _using_partial_mode = false;
+      _current_page = 0;
+      setFullWindow();
+    }
+
+    void fillScreen(uint16_t color)
+    {
+      uint8_t pv = color7(color);
+      uint8_t pv2 = pv | pv << 4;
+      for (uint32_t x = 0; x < sizeof(_pixel_buffer); x++)
+      {
+        _pixel_buffer[x] = pv2;
+      }
+    }
+
+    // display buffer content to screen, useful for full screen buffer
+    void display(bool partial_update_mode = false)
+    {
+      epd2.writeNative(_pixel_buffer, 0, 0, 0, WIDTH, _page_height);
+      epd2.refresh(partial_update_mode);
+      if (!partial_update_mode) epd2.powerOff();
+    }
+
+    // display part of buffer content to screen, useful for full screen buffer
+    // displayWindow, use parameters according to actual rotation.
+    // x and w should be multiple of 8, for rotation 0 or 2,
+    // y and h should be multiple of 8, for rotation 1 or 3,
+    // else window is increased as needed,
+    // this is an addressing limitation of the e-paper controllers
+    void displayWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
+    {
+      x = gx_uint16_min(x, width());
+      y = gx_uint16_min(y, height());
+      w = gx_uint16_min(w, width() - x);
+      h = gx_uint16_min(h, height() - y);
+      _rotate(x, y, w, h);
+      epd2.writeNativePart(_pixel_buffer, 0, x, y, WIDTH, _page_height, x, y, w, h);
+      epd2.refresh(x, y, w, h);
+    }
+
+    void setFullWindow()
+    {
+      _using_partial_mode = false;
+      _pw_x = 0;
+      _pw_y = 0;
+      _pw_w = WIDTH;
+      _pw_h = HEIGHT;
+    }
+
+    // setPartialWindow, use parameters according to actual rotation.
+    // x and w should be multiple of 8, for rotation 0 or 2,
+    // y and h should be multiple of 8, for rotation 1 or 3,
+    // else window is increased as needed,
+    // this is an addressing limitation of the e-paper controllers
+    void setPartialWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h)
+    {
+      if (!epd2.hasPartialUpdate) return;
+      _pw_x = gx_uint16_min(x, width());
+      _pw_y = gx_uint16_min(y, height());
+      _pw_w = gx_uint16_min(w, width() - _pw_x);
+      _pw_h = gx_uint16_min(h, height() - _pw_y);
+      _rotate(_pw_x, _pw_y, _pw_w, _pw_h);
+      _using_partial_mode = true;
+      // make _pw_x, _pw_w multiple of 2
+      _pw_w += _pw_x % 2;
+      if (_pw_w % 2 > 0) _pw_w += 2 - _pw_w % 2;
+      _pw_x -= _pw_x % 2;
+    }
+
+    void firstPage()
+    {
+      fillScreen(GxEPD_WHITE);
+      _current_page = 0;
+      _second_phase = false;
+      epd2.setPaged(); // for GxEPD2_565c paged workaround
+    }
+
+    bool nextPage()
+    {
+      uint16_t page_ys = _current_page * _page_height;
+      if (_using_partial_mode)
+      {
+        //Serial.print("  nextPage("); Serial.print(_pw_x); Serial.print(", "); Serial.print(_pw_y); Serial.print(", ");
+        //Serial.print(_pw_w); Serial.print(", "); Serial.print(_pw_h); Serial.print(") P"); Serial.println(_current_page);
+        uint16_t page_ye = _current_page < (_pages - 1) ? page_ys + _page_height : HEIGHT;
+        uint16_t dest_ys = _pw_y + page_ys; // transposed
+        uint16_t dest_ye = gx_uint16_min(_pw_y + _pw_h, _pw_y + page_ye);
+        if (dest_ye > dest_ys)
+        {
+          //Serial.print("writeImage("); Serial.print(_pw_x); Serial.print(", "); Serial.print(dest_ys); Serial.print(", ");
+          //Serial.print(_pw_w); Serial.print(", "); Serial.print(dest_ye - dest_ys); Serial.println(")");
+          epd2.writeNative(_pixel_buffer, 0, _pw_x, dest_ys, _pw_w, dest_ye - dest_ys);
+        }
+        else
+        {
+          //Serial.print("writeImage("); Serial.print(_pw_x); Serial.print(", "); Serial.print(dest_ys); Serial.print(", ");
+          //Serial.print(_pw_w); Serial.print(", "); Serial.print(dest_ye - dest_ys); Serial.print(") skipped ");
+          //Serial.print(dest_ys); Serial.print(".."); Serial.println(dest_ye);
+        }
+        _current_page++;
+        if (_current_page == _pages)
+        {
+          _current_page = 0;
+          if (!_second_phase)
+          {
+            epd2.refresh(_pw_x, _pw_y, _pw_w, _pw_h);
+            if (epd2.hasFastPartialUpdate)
+            {
+              _second_phase = true;
+              return true;
+            }
+          }
+          return false;
+        }
+        fillScreen(GxEPD_WHITE);
+        return true;
+      }
+      else // full update
+      {
+        epd2.writeNative(_pixel_buffer, 0, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
+        _current_page++;
+        if (_current_page == _pages)
+        {
+          _current_page = 0;
+          if ((epd2.panel == GxEPD2::GDEW0154Z04) && (_pages > 1))
+          {
+            if (!_second_phase)
+            {
+              epd2.refresh(false); // full update after first phase
+              _second_phase = true;
+              fillScreen(GxEPD_WHITE);
+              return true;
+            }
+            else epd2.refresh(true); // partial update after second phase
+          } else epd2.refresh(false); // full update after only phase
+          epd2.powerOff();
+          return false;
+        }
+        fillScreen(GxEPD_WHITE);
+        return true;
+      }
+    }
+
+    // GxEPD style paged drawing; drawCallback() is called as many times as needed
+    void drawPaged(void (*drawCallback)(const void*), const void* pv)
+    {
+      if (_using_partial_mode)
+      {
+        for (_current_page = 0; _current_page < _pages; _current_page++)
+        {
+          uint16_t page_ys = _current_page * _page_height;
+          uint16_t page_ye = _current_page < (_pages - 1) ? page_ys + _page_height : HEIGHT;
+          uint16_t dest_ys = _pw_y + page_ys; // transposed
+          uint16_t dest_ye = gx_uint16_min(_pw_y + _pw_h, _pw_y + page_ye);
+          if (dest_ye > dest_ys)
+          {
+            fillScreen(GxEPD_WHITE);
+            drawCallback(pv);
+            epd2.writeNative(_pixel_buffer, 0, _pw_x, dest_ys, _pw_w, dest_ye - dest_ys);
+          }
+        }
+        epd2.refresh(_pw_x, _pw_y, _pw_w, _pw_h);
+      }
+      else // full update
+      {
+        epd2.setPaged(); // for GxEPD2_154c paged workaround
+        for (_current_page = 0; _current_page < _pages; _current_page++)
+        {
+          uint16_t page_ys = _current_page * _page_height;
+          fillScreen(GxEPD_WHITE);
+          drawCallback(pv);
+          epd2.writeNative(_pixel_buffer, 0, 0, page_ys, WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
+        }
+        epd2.refresh(false); // full update
+        epd2.powerOff();
+      }
+      _current_page = 0;
+    }
+
+    void drawInvertedBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color)
+    {
+      // taken from Adafruit_GFX.cpp, modified
+      int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte
+      uint8_t byte = 0;
+      for (int16_t j = 0; j < h; j++)
+      {
+        for (int16_t i = 0; i < w; i++ )
+        {
+          if (i & 7) byte <<= 1;
+          else
+          {
+#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
+            byte = pgm_read_byte(&bitmap[j * byteWidth + i / 8]);
+#else
+            byte = bitmap[j * byteWidth + i / 8];
+#endif
+          }
+          if (!(byte & 0x80))
+          {
+            drawPixel(x + i, y + j, color);
+          }
+        }
+      }
+    }
+
+    //  Support for Bitmaps (Sprites) to Controller Buffer and to Screen
+    void clearScreen(uint8_t value = 0xFF) // init controller memory and screen (default white)
+    {
+      epd2.clearScreen(value);
+    }
+    void writeScreenBuffer(uint8_t value = 0xFF) // init controller memory (default white)
+    {
+      epd2.writeScreenBuffer(value);
+    }
+    // write to controller memory, without screen refresh; x and w should be multiple of 8
+    void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false)
+    {
+      epd2.writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
+    }
+    void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                        int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false)
+    {
+      epd2.writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+    }
+    void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+    {
+      epd2.writeImage(black, color, x, y, w, h, invert, mirror_y, pgm);
+    }
+    void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h)
+    {
+      epd2.writeImage(black, color, x, y, w, h, false, false, false);
+    }
+    void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                        int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+    {
+      epd2.writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+    }
+    void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                        int16_t x, int16_t y, int16_t w, int16_t h)
+    {
+      epd2.writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, false, false, false);
+    }
+    // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8
+    void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+    {
+      epd2.writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
+    }
+    // write to controller memory, with screen refresh; x and w should be multiple of 8
+    void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false)
+    {
+      epd2.drawImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
+    }
+    void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                       int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false)
+    {
+      epd2.drawImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+    }
+    void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+    {
+      epd2.drawImage(black, color, x, y, w, h, invert, mirror_y, pgm);
+    }
+    void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h)
+    {
+      epd2.drawImage(black, color, x, y, w, h, false, false, false);
+    }
+    void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                       int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+    {
+      epd2.drawImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+    }
+    void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                       int16_t x, int16_t y, int16_t w, int16_t h)
+    {
+      epd2.drawImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, false, false, false);
+    }
+    // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8
+    void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+    {
+      epd2.drawNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
+    }
+    void refresh(bool partial_update_mode = false) // screen refresh from controller memory to full screen
+    {
+      epd2.refresh(partial_update_mode);
+      if (!partial_update_mode) epd2.powerOff();
+    }
+    void refresh(int16_t x, int16_t y, int16_t w, int16_t h) // screen refresh from controller memory, partial screen
+    {
+      epd2.refresh(x, y, w, h);
+    }
+    // turns off generation of panel driving voltages, avoids screen fading over time
+    void powerOff()
+    {
+      epd2.powerOff();
+    }
+    // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0)
+    void hibernate()
+    {
+      epd2.hibernate();
+    }
+  private:
+    template <typename T> static inline void
+    _swap_(T & a, T & b)
+    {
+      T t = a;
+      a = b;
+      b = t;
+    };
+    static inline uint16_t gx_uint16_min(uint16_t a, uint16_t b)
+    {
+      return (a < b ? a : b);
+    };
+    static inline uint16_t gx_uint16_max(uint16_t a, uint16_t b)
+    {
+      return (a > b ? a : b);
+    };
+    void _rotate(uint16_t& x, uint16_t& y, uint16_t& w, uint16_t& h)
+    {
+      switch (getRotation())
+      {
+        case 1:
+          _swap_(x, y);
+          _swap_(w, h);
+          x = WIDTH - x - w;
+          break;
+        case 2:
+          x = WIDTH - x - w;
+          y = HEIGHT - y - h;
+          break;
+        case 3:
+          _swap_(x, y);
+          _swap_(w, h);
+          y = HEIGHT - y - h;
+          break;
+      }
+    }
+    uint8_t color7(uint16_t color)
+    {
+      static uint16_t _prev_color = GxEPD_BLACK;
+      static uint8_t _prev_color7 = 0x00; // black
+      if (color == _prev_color) return _prev_color7;
+      uint8_t cv7 = 0x00;
+      switch (color)
+      {
+        case GxEPD_BLACK: cv7 = 0x00; break;
+        case GxEPD_WHITE: cv7 = 0x01; break;
+        case GxEPD_GREEN: cv7 = 0x02; break;
+        case GxEPD_BLUE:  cv7 = 0x03; break;
+        case GxEPD_RED:   cv7 = 0x04; break;
+        case GxEPD_YELLOW: cv7 = 0x05; break;
+        case GxEPD_ORANGE: cv7 = 0x06; break;
+        default:
+          {
+            uint16_t red = color & 0xF800;
+            uint16_t green = (color & 0x03C0) << 5;
+            uint16_t blue = (color & 0x001F) << 11;
+            if ((red < 0x8000) && (green < 0x8000) && (blue < 0x8000)) cv7 = 0x00; // black
+            else if ((red >= 0x8000) && (green >= 0x8000) && (blue >= 0x8000)) cv7 = 0x01; // white
+            else if ((green >= 0x8000) && (blue >= 0x8000)) cv7 = green > blue ? 0x02 : 0x03; // green, blue
+            else if ((red >= 0x8000) && (green >= 0x8000))
+            {
+              static const uint16_t y2o_lim = ((GxEPD_YELLOW - GxEPD_ORANGE) / 2 + (GxEPD_ORANGE & 0x03C0)) << 5;
+              cv7 = green > y2o_lim ? 0x05 : 0x06; // yellow, orange
+            }
+            else if (red >= 0x8000) cv7 = 0x04; // red
+            else if (green >= 0x8000) cv7 = 0x02; // green
+            else cv7 = 0x03; // blue
+          }
+      }
+      _prev_color = color;
+      _prev_color7 = cv7;
+      return cv7;
+    }
+  private:
+    uint8_t _pixel_buffer[(GxEPD2_Type::WIDTH / 2) * page_height];
+    bool _using_partial_mode, _second_phase, _mirror;
+    uint16_t _width_bytes, _pixel_bytes;
+    int16_t _current_page;
+    uint16_t _pages, _page_height;
+    uint16_t _pw_x, _pw_y, _pw_w, _pw_h;
+};
+
+#endif

+ 903 - 0
src/bitmaps/WS_Bitmaps7c192x143.h

@@ -0,0 +1,903 @@
+/*****************************************************************************
+  | File      	:   ImageData.c
+  | Author      :   Waveshare team
+  | Function    :
+  ----------------
+  |	This version:   V1.1
+  | Date        :   2019-06-12
+  | Info        :
+
+  #
+  # Permission is hereby granted, free of charge, to any person obtaining a copy
+  # of this software and associated documnetation files (the "Software"), to deal
+  # in the Software without restriction, including without limitation the rights
+  # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  # copies of the Software, and to permit persons to  whom the Software is
+  # furished to do so, subject to the following conditions:
+  #
+  # The above copyright notice and this permission notice shall be included in
+  # all copies or substantial portions of the Software.
+  #
+  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  # THE SOFTWARE.
+  #
+
+******************************************************************************/
+
+#ifndef _WS_Bitmaps7c192x143_H_
+#define _WS_Bitmaps7c192x143_H_
+
+#if defined(ESP8266) || defined(ESP32)
+#include <pgmspace.h>
+#else
+#include <avr/pgmspace.h>
+#endif
+
+const unsigned char WS_Bitmap7c192x143[] PROGMEM =
+{
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x36, 0x6, 0x36, 0x36, 0x36, 0x36, 0x6, 0x36, 0x6,
+  0x36, 0x6, 0x36, 0x6, 0x36, 0x36, 0x0, 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x6, 0x36,
+  0x6, 0x36, 0x6, 0x36, 0x36, 0x6, 0x36, 0x6, 0x36, 0x6, 0x36, 0x36, 0x36, 0x6, 0x36, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x2, 0x36, 0x32, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
+  0x63, 0x63, 0x63, 0x63, 0x60, 0x23, 0x63, 0x23, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x3, 0x26,
+  0x36, 0x36, 0x36, 0x36, 0x23, 0x63, 0x63, 0x63, 0x63, 0x63, 0x60, 0x63, 0x26, 0x36, 0x2, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x12, 0x11, 0x12, 0x11, 0x21, 0x12, 0x11, 0x21, 0x11, 0x12, 0x11, 0x21, 0x12, 0x11, 0x21,
+  0x12, 0x13, 0x12, 0x16, 0x13, 0x12, 0x11, 0x31, 0x21, 0x31, 0x23, 0x12, 0x32, 0x13, 0x23, 0x21,
+  0x11, 0x11, 0x31, 0x11, 0x13, 0x11, 0x11, 0x36, 0x36, 0x36, 0x32, 0x63, 0x26, 0x36, 0x6, 0x36,
+  0x36, 0x6, 0x32, 0x63, 0x63, 0x66, 0x36, 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x6, 0x36,
+  0x36, 0x23, 0x62, 0x36, 0x36, 0x1, 0x6, 0x36, 0x6, 0x32, 0x36, 0x36, 0x63, 0x23, 0x63, 0x1,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x31, 0x11, 0x13, 0x11, 0x31, 0x21, 0x13, 0x12,
+  0x11, 0x31, 0x11, 0x31, 0x11, 0x13, 0x11, 0x13, 0x11, 0x12, 0x11, 0x31, 0x13, 0x11, 0x13, 0x11,
+  0x31, 0x11, 0x11, 0x12, 0x11, 0x11, 0x21, 0x21, 0x11, 0x21, 0x11, 0x61, 0x11, 0x21, 0x11, 0x31,
+  0x11, 0x21, 0x11, 0x12, 0x11, 0x11, 0x23, 0x60, 0x10, 0x23, 0x66, 0x36, 0x36, 0x36, 0x36, 0x6,
+  0x36, 0x36, 0x36, 0x36, 0x36, 0x32, 0x36, 0x6, 0x21, 0x11, 0x11, 0x11, 0x11, 0x10, 0x1, 0x36,
+  0x32, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x24, 0x36, 0x36, 0x36, 0x36, 0x0, 0x61,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x31, 0x16, 0x11, 0x11, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+  0x12, 0x11, 0x61, 0x11, 0x13, 0x11, 0x11, 0x11, 0x12, 0x13, 0x11, 0x11, 0x11, 0x13, 0x11, 0x12,
+  0x11, 0x21, 0x21, 0x31, 0x12, 0x13, 0x11, 0x11, 0x31, 0x11, 0x21, 0x21, 0x23, 0x11, 0x21, 0x21,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x32, 0x36, 0x36, 0x32, 0x36, 0x36, 0x6, 0x36, 0x36,
+  0x36, 0x6, 0x36, 0x6, 0x36, 0x36, 0x6, 0x30, 0x31, 0x11, 0x11, 0x11, 0x11, 0x36, 0x6, 0x32,
+  0x63, 0x60, 0x60, 0x63, 0x63, 0x63, 0x20, 0x63, 0x63, 0x63, 0x63, 0x62, 0x31, 0x6, 0x32, 0x36,
+  0x31, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x16, 0x11, 0x11, 0x21, 0x16, 0x11, 0x21, 0x13,
+  0x11, 0x11, 0x12, 0x16, 0x11, 0x11, 0x21, 0x21, 0x11, 0x11, 0x11, 0x12, 0x12, 0x11, 0x12, 0x11,
+  0x11, 0x13, 0x11, 0x11, 0x31, 0x11, 0x13, 0x21, 0x11, 0x31, 0x13, 0x13, 0x11, 0x13, 0x13, 0x61,
+  0x11, 0x31, 0x13, 0x11, 0x31, 0x11, 0x36, 0x6, 0x36, 0x23, 0x63, 0x62, 0x36, 0x36, 0x36, 0x32,
+  0x6, 0x36, 0x36, 0x36, 0x26, 0x36, 0x32, 0x6, 0x31, 0x11, 0x31, 0x11, 0x11, 0x23, 0x23, 0x63,
+  0x63, 0x63, 0x23, 0x62, 0x36, 0x26, 0x36, 0x36, 0x6, 0x36, 0x6, 0x36, 0x36, 0x1, 0x6, 0x2,
+  0x11, 0x11, 0x13, 0x11, 0x11, 0x11, 0x31, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13, 0x11, 0x11,
+  0x11, 0x61, 0x21, 0x11, 0x12, 0x11, 0x11, 0x13, 0x11, 0x21, 0x61, 0x21, 0x11, 0x12, 0x11, 0x31,
+  0x13, 0x11, 0x12, 0x11, 0x12, 0x12, 0x11, 0x16, 0x21, 0x11, 0x21, 0x12, 0x12, 0x12, 0x11, 0x21,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x36, 0x36, 0x32, 0x63, 0x63, 0x63, 0x60, 0x63, 0x63,
+  0x63, 0x20, 0x63, 0x63, 0x3, 0x26, 0x36, 0x30, 0x63, 0x11, 0x11, 0x31, 0x11, 0x60, 0x63, 0x26,
+  0x36, 0x36, 0x36, 0x36, 0x63, 0x3, 0x63, 0x63, 0x63, 0x63, 0x23, 0x63, 0x63, 0x23, 0x63, 0x63,
+  0x11, 0x31, 0x11, 0x11, 0x13, 0x11, 0x11, 0x11, 0x13, 0x11, 0x61, 0x13, 0x12, 0x11, 0x11, 0x21,
+  0x13, 0x11, 0x11, 0x12, 0x11, 0x31, 0x13, 0x11, 0x11, 0x31, 0x11, 0x16, 0x13, 0x11, 0x61, 0x12,
+  0x11, 0x21, 0x13, 0x12, 0x11, 0x11, 0x31, 0x11, 0x12, 0x16, 0x12, 0x11, 0x31, 0x61, 0x21, 0x31,
+  0x11, 0x21, 0x21, 0x16, 0x11, 0x11, 0x36, 0x32, 0x63, 0x63, 0x63, 0x63, 0x60, 0x63, 0x60, 0x63,
+  0x63, 0x63, 0x63, 0x60, 0x66, 0x36, 0x36, 0x32, 0x1, 0x11, 0x11, 0x11, 0x11, 0x30, 0x63, 0x63,
+  0x63, 0x26, 0x36, 0x36, 0x36, 0x66, 0x36, 0x36, 0x36, 0x36, 0x36, 0x6, 0x36, 0x36, 0x32, 0x36,
+  0x21, 0x11, 0x11, 0x13, 0x11, 0x11, 0x11, 0x21, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x11,
+  0x21, 0x13, 0x11, 0x31, 0x11, 0x11, 0x21, 0x12, 0x11, 0x11, 0x21, 0x31, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x21, 0x13, 0x16, 0x31, 0x12, 0x13, 0x11, 0x31, 0x21, 0x31, 0x12, 0x13, 0x11, 0x21,
+  0x11, 0x11, 0x11, 0x11, 0x13, 0x11, 0x16, 0x6, 0x32, 0x36, 0x32, 0x63, 0x63, 0x26, 0x36, 0x36,
+  0x36, 0x63, 0x60, 0x63, 0x63, 0x63, 0x23, 0x66, 0x0, 0x11, 0x11, 0x11, 0x11, 0x63, 0x62, 0x36,
+  0x23, 0x63, 0x42, 0x36, 0x36, 0x33, 0x62, 0x63, 0x26, 0x6, 0x36, 0x32, 0x60, 0x63, 0x60, 0x60,
+  0x31, 0x11, 0x12, 0x11, 0x11, 0x12, 0x11, 0x11, 0x11, 0x11, 0x31, 0x21, 0x11, 0x11, 0x31, 0x11,
+  0x11, 0x11, 0x21, 0x11, 0x31, 0x11, 0x11, 0x11, 0x31, 0x21, 0x11, 0x11, 0x21, 0x31, 0x21, 0x31,
+  0x21, 0x31, 0x12, 0x11, 0x11, 0x12, 0x11, 0x11, 0x21, 0x11, 0x31, 0x12, 0x11, 0x21, 0x21, 0x31,
+  0x11, 0x31, 0x13, 0x11, 0x21, 0x11, 0x32, 0x36, 0x36, 0x6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x6,
+  0x36, 0x36, 0x36, 0x36, 0x36, 0x6, 0x63, 0x23, 0x66, 0x11, 0x21, 0x11, 0x13, 0x2, 0x36, 0x36,
+  0x36, 0x6, 0x36, 0x6, 0x23, 0x66, 0x36, 0x36, 0x36, 0x36, 0x6, 0x36, 0x36, 0x32, 0x36, 0x30,
+  0x11, 0x11, 0x11, 0x16, 0x11, 0x11, 0x13, 0x11, 0x31, 0x21, 0x11, 0x11, 0x31, 0x12, 0x11, 0x21,
+  0x12, 0x11, 0x11, 0x11, 0x11, 0x21, 0x12, 0x11, 0x11, 0x13, 0x11, 0x21, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x61, 0x12, 0x12, 0x11, 0x31, 0x21, 0x31, 0x21, 0x11, 0x21, 0x31, 0x13, 0x13, 0x12,
+  0x11, 0x11, 0x11, 0x21, 0x11, 0x11, 0x10, 0x63, 0x60, 0x13, 0x26, 0x36, 0x36, 0x36, 0x36, 0x32,
+  0x63, 0x60, 0x63, 0x60, 0x63, 0x63, 0x36, 0x60, 0x30, 0x31, 0x11, 0x61, 0x11, 0x0, 0x63, 0x63,
+  0x63, 0x63, 0x23, 0x63, 0x63, 0x23, 0x63, 0x63, 0x60, 0x63, 0x63, 0x63, 0x63, 0x63, 0x62, 0x36,
+  0x2, 0x11, 0x31, 0x11, 0x11, 0x16, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13,
+  0x11, 0x13, 0x11, 0x21, 0x21, 0x11, 0x31, 0x16, 0x12, 0x11, 0x21, 0x11, 0x31, 0x21, 0x13, 0x12,
+  0x13, 0x12, 0x13, 0x11, 0x31, 0x21, 0x11, 0x11, 0x11, 0x31, 0x21, 0x31, 0x53, 0x11, 0x21, 0x61,
+  0x12, 0x11, 0x11, 0x11, 0x16, 0x11, 0x63, 0x23, 0x63, 0x60, 0x63, 0x62, 0x6, 0x36, 0x6, 0x36,
+  0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x63, 0x23, 0x60, 0x11, 0x11, 0x11, 0x11, 0x6, 0x32, 0x63,
+  0x20, 0x63, 0x60, 0x63, 0x63, 0x66, 0x6, 0x36, 0x3, 0x63, 0x60, 0x63, 0x60, 0x60, 0x63, 0x60,
+  0x31, 0x11, 0x11, 0x12, 0x13, 0x11, 0x11, 0x21, 0x11, 0x31, 0x16, 0x11, 0x12, 0x13, 0x11, 0x11,
+  0x11, 0x61, 0x11, 0x31, 0x11, 0x31, 0x11, 0x31, 0x11, 0x16, 0x11, 0x31, 0x11, 0x11, 0x31, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x13, 0x12, 0x31, 0x21, 0x11, 0x31, 0x11, 0x21, 0x21, 0x13, 0x12,
+  0x13, 0x11, 0x61, 0x13, 0x11, 0x11, 0x13, 0x42, 0x36, 0x23, 0x63, 0x63, 0x60, 0x63, 0x63, 0x63,
+  0x60, 0x10, 0x10, 0x63, 0x60, 0x63, 0x63, 0x63, 0x23, 0x61, 0x31, 0x13, 0x11, 0x6, 0x36, 0x36,
+  0x36, 0x6, 0x36, 0x36, 0x36, 0x3, 0x10, 0x63, 0x16, 0x6, 0x31, 0x6, 0x36, 0x32, 0x36, 0x32,
+  0x36, 0x11, 0x12, 0x11, 0x11, 0x11, 0x31, 0x11, 0x21, 0x12, 0x11, 0x31, 0x11, 0x11, 0x12, 0x11,
+  0x21, 0x12, 0x11, 0x16, 0x11, 0x12, 0x11, 0x12, 0x13, 0x11, 0x21, 0x11, 0x21, 0x21, 0x12, 0x16,
+  0x12, 0x13, 0x12, 0x13, 0x12, 0x11, 0x11, 0x11, 0x11, 0x21, 0x12, 0x13, 0x11, 0x13, 0x12, 0x11,
+  0x11, 0x12, 0x11, 0x11, 0x12, 0x11, 0x10, 0x63, 0x62, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x6,
+  0x36, 0x36, 0x36, 0x36, 0x3, 0x60, 0x23, 0x66, 0x36, 0x21, 0x11, 0x11, 0x16, 0x30, 0x23, 0x26,
+  0x3, 0x63, 0x63, 0x62, 0x36, 0x36, 0x6, 0x36, 0x3, 0x63, 0x60, 0x36, 0x6, 0x36, 0x63, 0x60,
+  0x62, 0x13, 0x11, 0x13, 0x12, 0x11, 0x11, 0x16, 0x11, 0x11, 0x12, 0x11, 0x13, 0x11, 0x11, 0x31,
+  0x11, 0x31, 0x11, 0x21, 0x12, 0x11, 0x11, 0x21, 0x11, 0x12, 0x11, 0x61, 0x13, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x21, 0x11, 0x11, 0x31, 0x21, 0x31, 0x63, 0x11, 0x21, 0x12, 0x13, 0x12, 0x11, 0x31,
+  0x11, 0x11, 0x31, 0x21, 0x11, 0x31, 0x12, 0x36, 0x36, 0x36, 0x32, 0x60, 0x63, 0x60, 0x63, 0x63,
+  0x60, 0x63, 0x60, 0x63, 0x66, 0x36, 0x34, 0x23, 0x60, 0x31, 0x11, 0x11, 0x11, 0x63, 0x63, 0x63,
+  0x63, 0x60, 0x6, 0x30, 0x63, 0x63, 0x63, 0x63, 0x66, 0x6, 0x36, 0x36, 0x32, 0x36, 0x32, 0x3,
+  0x63, 0x31, 0x23, 0x11, 0x11, 0x12, 0x11, 0x31, 0x11, 0x13, 0x11, 0x12, 0x11, 0x11, 0x21, 0x11,
+  0x11, 0x11, 0x13, 0x11, 0x13, 0x11, 0x21, 0x16, 0x12, 0x11, 0x13, 0x12, 0x11, 0x11, 0x21, 0x13,
+  0x21, 0x31, 0x11, 0x31, 0x21, 0x13, 0x11, 0x12, 0x11, 0x13, 0x11, 0x31, 0x12, 0x11, 0x31, 0x21,
+  0x11, 0x11, 0x11, 0x11, 0x31, 0x11, 0x10, 0x63, 0x23, 0x62, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+  0x36, 0x36, 0x32, 0x43, 0x63, 0x60, 0x60, 0x10, 0x63, 0x51, 0x11, 0x21, 0x12, 0x30, 0x63, 0x63,
+  0x60, 0x63, 0x63, 0x66, 0x36, 0x6, 0x36, 0x6, 0x33, 0x63, 0x60, 0x63, 0x60, 0x63, 0x26, 0x36,
+  0x2, 0x12, 0x31, 0x12, 0x11, 0x11, 0x11, 0x11, 0x21, 0x11, 0x11, 0x11, 0x12, 0x13, 0x11, 0x12,
+  0x13, 0x11, 0x21, 0x11, 0x11, 0x16, 0x13, 0x11, 0x13, 0x11, 0x61, 0x11, 0x11, 0x21, 0x31, 0x11,
+  0x11, 0x11, 0x21, 0x12, 0x11, 0x21, 0x12, 0x11, 0x12, 0x11, 0x23, 0x11, 0x21, 0x31, 0x21, 0x31,
+  0x11, 0x31, 0x21, 0x61, 0x11, 0x11, 0x16, 0x3, 0x66, 0x36, 0x63, 0x63, 0x63, 0x60, 0x63, 0x60,
+  0x63, 0x60, 0x63, 0x60, 0x60, 0x36, 0x3, 0x63, 0x23, 0x1, 0x13, 0x11, 0x11, 0x2, 0x36, 0x20,
+  0x63, 0x6, 0x36, 0x3, 0x63, 0x63, 0x63, 0x63, 0x60, 0x63, 0x63, 0x60, 0x63, 0x63, 0x63, 0x63,
+  0x63, 0x31, 0x23, 0x11, 0x31, 0x13, 0x12, 0x11, 0x16, 0x11, 0x12, 0x13, 0x11, 0x11, 0x13, 0x11,
+  0x11, 0x21, 0x11, 0x13, 0x12, 0x11, 0x11, 0x12, 0x11, 0x13, 0x11, 0x21, 0x31, 0x61, 0x11, 0x12,
+  0x11, 0x21, 0x16, 0x11, 0x13, 0x16, 0x11, 0x31, 0x31, 0x21, 0x11, 0x21, 0x31, 0x21, 0x11, 0x21,
+  0x12, 0x11, 0x11, 0x31, 0x11, 0x21, 0x13, 0x62, 0x33, 0x23, 0x60, 0x63, 0x60, 0x63, 0x24, 0x36,
+  0x36, 0x36, 0x36, 0x36, 0x36, 0x6, 0x36, 0x36, 0x36, 0x21, 0x11, 0x11, 0x11, 0x0, 0x63, 0x36,
+  0x36, 0x3, 0x60, 0x36, 0x23, 0x63, 0x60, 0x63, 0x63, 0x60, 0x63, 0x63, 0x60, 0x63, 0x63, 0x20,
+  0x63, 0x12, 0x31, 0x21, 0x11, 0x11, 0x11, 0x13, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16,
+  0x11, 0x11, 0x31, 0x11, 0x11, 0x13, 0x11, 0x11, 0x11, 0x21, 0x12, 0x11, 0x11, 0x11, 0x21, 0x31,
+  0x13, 0x11, 0x31, 0x21, 0x61, 0x12, 0x13, 0x11, 0x11, 0x31, 0x21, 0x13, 0x11, 0x61, 0x31, 0x13,
+  0x11, 0x11, 0x11, 0x12, 0x11, 0x11, 0x16, 0x30, 0x66, 0x36, 0x3, 0x63, 0x63, 0x63, 0x60, 0x63,
+  0x60, 0x26, 0x36, 0x6, 0x36, 0x36, 0x6, 0x36, 0x63, 0x1, 0x11, 0x11, 0x11, 0x63, 0x5, 0x36,
+  0x23, 0x60, 0x36, 0x6, 0x36, 0x63, 0x63, 0x60, 0x63, 0x63, 0x6, 0x36, 0x3, 0x63, 0x26, 0x36,
+  0x32, 0x31, 0x31, 0x31, 0x16, 0x11, 0x21, 0x11, 0x11, 0x13, 0x11, 0x61, 0x13, 0x12, 0x12, 0x11,
+  0x21, 0x31, 0x11, 0x21, 0x21, 0x11, 0x21, 0x21, 0x31, 0x11, 0x11, 0x13, 0x12, 0x11, 0x31, 0x11,
+  0x11, 0x21, 0x11, 0x13, 0x12, 0x11, 0x11, 0x21, 0x21, 0x13, 0x12, 0x11, 0x21, 0x31, 0x21, 0x21,
+  0x11, 0x13, 0x11, 0x11, 0x13, 0x11, 0x32, 0x6, 0x32, 0x63, 0x63, 0x60, 0x63, 0x60, 0x63, 0x63,
+  0x63, 0x63, 0x63, 0x63, 0x6, 0x30, 0x36, 0x2, 0x36, 0x1, 0x11, 0x21, 0x13, 0x60, 0x63, 0x23,
+  0x60, 0x63, 0x60, 0x63, 0x60, 0x36, 0x6, 0x36, 0x36, 0x6, 0x36, 0x6, 0x36, 0x2, 0x43, 0x60,
+  0x23, 0x16, 0x23, 0x11, 0x21, 0x11, 0x11, 0x11, 0x21, 0x11, 0x11, 0x11, 0x21, 0x11, 0x11, 0x13,
+  0x11, 0x11, 0x12, 0x11, 0x13, 0x11, 0x11, 0x31, 0x11, 0x31, 0x21, 0x11, 0x11, 0x31, 0x11, 0x21,
+  0x61, 0x13, 0x12, 0x11, 0x11, 0x31, 0x21, 0x13, 0x11, 0x21, 0x13, 0x12, 0x11, 0x21, 0x13, 0x11,
+  0x12, 0x11, 0x12, 0x11, 0x11, 0x11, 0x13, 0x63, 0x63, 0x63, 0x60, 0x63, 0x6, 0x36, 0x36, 0x6,
+  0x36, 0x36, 0x36, 0x6, 0x30, 0x66, 0x3, 0x63, 0x63, 0x63, 0x11, 0x11, 0x11, 0x10, 0x36, 0x36,
+  0x3, 0x60, 0x36, 0x36, 0x36, 0x36, 0x36, 0x32, 0x36, 0x36, 0x36, 0x30, 0x63, 0x63, 0x63, 0x23,
+  0x6, 0x13, 0x12, 0x31, 0x11, 0x13, 0x11, 0x31, 0x11, 0x21, 0x11, 0x31, 0x11, 0x11, 0x31, 0x11,
+  0x11, 0x21, 0x11, 0x16, 0x11, 0x13, 0x11, 0x11, 0x21, 0x11, 0x11, 0x61, 0x21, 0x11, 0x21, 0x11,
+  0x31, 0x11, 0x11, 0x31, 0x21, 0x11, 0x13, 0x11, 0x11, 0x16, 0x11, 0x11, 0x31, 0x13, 0x11, 0x21,
+  0x11, 0x11, 0x21, 0x13, 0x11, 0x12, 0x16, 0x32, 0x6, 0x32, 0x3, 0x6, 0x36, 0x6, 0x36, 0x36,
+  0x36, 0x6, 0x2, 0x36, 0x6, 0x30, 0x60, 0x63, 0x60, 0x1, 0x11, 0x31, 0x11, 0x30, 0x26, 0x36,
+  0x36, 0x0, 0x63, 0x60, 0x63, 0x62, 0x36, 0x4, 0x60, 0x36, 0x6, 0x36, 0x30, 0x63, 0x63, 0x60,
+  0x63, 0x21, 0x13, 0x12, 0x11, 0x21, 0x11, 0x11, 0x13, 0x11, 0x12, 0x11, 0x11, 0x21, 0x11, 0x21,
+  0x13, 0x11, 0x31, 0x31, 0x12, 0x11, 0x12, 0x11, 0x11, 0x21, 0x31, 0x11, 0x31, 0x16, 0x11, 0x31,
+  0x11, 0x21, 0x61, 0x11, 0x11, 0x31, 0x21, 0x12, 0x13, 0x12, 0x13, 0x21, 0x12, 0x31, 0x23, 0x13,
+  0x11, 0x31, 0x11, 0x11, 0x16, 0x11, 0x11, 0x3, 0x63, 0x63, 0x66, 0x36, 0x6, 0x36, 0x6, 0x36,
+  0x6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x32, 0x36, 0x1, 0x11, 0x11, 0x11, 0x16, 0x36, 0x32,
+  0x63, 0x63, 0x60, 0x36, 0x36, 0x43, 0x60, 0x10, 0x36, 0x63, 0x63, 0x60, 0x60, 0x63, 0x26, 0x36,
+  0x1, 0x36, 0x32, 0x61, 0x31, 0x11, 0x16, 0x12, 0x11, 0x13, 0x11, 0x11, 0x31, 0x11, 0x61, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x61, 0x11, 0x21, 0x13, 0x11, 0x11, 0x21, 0x12, 0x11, 0x21, 0x11,
+  0x21, 0x11, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11, 0x21, 0x13, 0x11, 0x11, 0x31, 0x11, 0x11, 0x21,
+  0x11, 0x11, 0x31, 0x12, 0x11, 0x11, 0x10, 0x60, 0x23, 0x66, 0x30, 0x6, 0x36, 0x30, 0x36, 0x6,
+  0x36, 0x36, 0x36, 0x6, 0x36, 0x0, 0x60, 0x36, 0x10, 0x31, 0x11, 0x11, 0x11, 0x0, 0x2, 0x36,
+  0x36, 0x0, 0x63, 0x60, 0x63, 0x24, 0x30, 0x36, 0x36, 0x30, 0x60, 0x63, 0x3, 0x63, 0x63, 0x23,
+  0x63, 0x21, 0x31, 0x31, 0x11, 0x13, 0x11, 0x11, 0x11, 0x11, 0x11, 0x31, 0x11, 0x31, 0x11, 0x31,
+  0x21, 0x12, 0x12, 0x11, 0x31, 0x11, 0x31, 0x11, 0x61, 0x12, 0x13, 0x11, 0x11, 0x13, 0x11, 0x12,
+  0x11, 0x31, 0x21, 0x11, 0x31, 0x13, 0x12, 0x31, 0x11, 0x21, 0x12, 0x13, 0x11, 0x26, 0x31, 0x61,
+  0x11, 0x21, 0x16, 0x11, 0x13, 0x12, 0x11, 0x36, 0x36, 0x36, 0x6, 0x36, 0x3, 0x66, 0x36, 0x36,
+  0x36, 0x6, 0x36, 0x36, 0x6, 0x36, 0x36, 0x6, 0x32, 0x60, 0x11, 0x13, 0x11, 0x13, 0x63, 0x63,
+  0x63, 0x63, 0x6, 0x3, 0x63, 0x63, 0x66, 0x6, 0x6, 0x6, 0x36, 0x30, 0x60, 0x32, 0x63, 0x60,
+  0x1, 0x33, 0x12, 0x32, 0x12, 0x11, 0x11, 0x31, 0x11, 0x21, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11,
+  0x13, 0x11, 0x11, 0x21, 0x11, 0x21, 0x11, 0x31, 0x11, 0x11, 0x11, 0x11, 0x13, 0x11, 0x13, 0x11,
+  0x11, 0x11, 0x11, 0x31, 0x12, 0x11, 0x11, 0x11, 0x61, 0x31, 0x13, 0x11, 0x21, 0x11, 0x13, 0x21,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x36, 0x6, 0x23, 0x63, 0x0, 0x66, 0x30, 0x60, 0x63,
+  0x60, 0x36, 0x6, 0x30, 0x63, 0x6, 0x3, 0x63, 0x60, 0x31, 0x11, 0x11, 0x11, 0x12, 0x0, 0x62,
+  0x36, 0x6, 0x3, 0x60, 0x63, 0x63, 0x63, 0x3, 0x63, 0x63, 0x60, 0x60, 0x60, 0x63, 0x63, 0x63,
+  0x63, 0x21, 0x31, 0x31, 0x11, 0x11, 0x11, 0x11, 0x16, 0x11, 0x11, 0x12, 0x11, 0x11, 0x11, 0x12,
+  0x11, 0x16, 0x13, 0x11, 0x12, 0x11, 0x21, 0x11, 0x21, 0x31, 0x12, 0x13, 0x11, 0x12, 0x11, 0x13,
+  0x12, 0x13, 0x11, 0x11, 0x11, 0x12, 0x13, 0x12, 0x13, 0x11, 0x21, 0x12, 0x13, 0x12, 0x12, 0x11,
+  0x12, 0x13, 0x12, 0x13, 0x11, 0x13, 0x11, 0x20, 0x36, 0x32, 0x36, 0x60, 0x36, 0x6, 0x36, 0x36,
+  0x36, 0x63, 0x63, 0x66, 0x30, 0x63, 0x6, 0x32, 0x36, 0x0, 0x11, 0x21, 0x11, 0x11, 0x6, 0x36,
+  0x1, 0x3, 0x60, 0x36, 0x36, 0x6, 0x6, 0x6, 0x6, 0x36, 0x36, 0x30, 0x36, 0x36, 0x36, 0x20,
+  0x60, 0x13, 0x23, 0x23, 0x11, 0x13, 0x12, 0x11, 0x13, 0x11, 0x13, 0x11, 0x11, 0x13, 0x11, 0x31,
+  0x11, 0x21, 0x11, 0x12, 0x11, 0x11, 0x16, 0x11, 0x11, 0x11, 0x13, 0x11, 0x12, 0x11, 0x12, 0x11,
+  0x11, 0x11, 0x21, 0x61, 0x21, 0x31, 0x11, 0x11, 0x11, 0x13, 0x12, 0x11, 0x21, 0x13, 0x11, 0x31,
+  0x11, 0x11, 0x11, 0x11, 0x12, 0x11, 0x11, 0x6, 0x32, 0x36, 0x63, 0x3, 0x63, 0x63, 0x63, 0x60,
+  0x63, 0x6, 0x36, 0x3, 0x60, 0x60, 0x63, 0x63, 0x62, 0x36, 0x11, 0x11, 0x61, 0x13, 0x63, 0x2,
+  0x36, 0x36, 0x3, 0x60, 0x6, 0x30, 0x36, 0x36, 0x30, 0x60, 0x3, 0x60, 0x60, 0x63, 0x23, 0x36,
+  0x32, 0x31, 0x31, 0x13, 0x11, 0x21, 0x11, 0x11, 0x21, 0x12, 0x11, 0x16, 0x12, 0x11, 0x12, 0x11,
+  0x61, 0x13, 0x11, 0x61, 0x31, 0x61, 0x31, 0x13, 0x12, 0x12, 0x11, 0x12, 0x11, 0x13, 0x11, 0x12,
+  0x13, 0x11, 0x11, 0x31, 0x11, 0x12, 0x12, 0x13, 0x12, 0x11, 0x13, 0x13, 0x11, 0x21, 0x23, 0x12,
+  0x11, 0x21, 0x13, 0x11, 0x11, 0x11, 0x11, 0x36, 0x6, 0x36, 0x36, 0x6, 0x6, 0x30, 0x60, 0x63,
+  0x6, 0x36, 0x3, 0x60, 0x60, 0x36, 0x0, 0x63, 0x63, 0x63, 0x11, 0x31, 0x11, 0x11, 0x20, 0x63,
+  0x63, 0x60, 0x6, 0x36, 0x36, 0x36, 0x60, 0x60, 0x36, 0x3, 0x60, 0x63, 0x3, 0x6, 0x36, 0x60,
+  0x63, 0x23, 0x12, 0x32, 0x61, 0x11, 0x11, 0x31, 0x11, 0x11, 0x61, 0x11, 0x11, 0x16, 0x11, 0x11,
+  0x11, 0x11, 0x21, 0x11, 0x11, 0x11, 0x12, 0x11, 0x11, 0x11, 0x16, 0x11, 0x16, 0x11, 0x11, 0x61,
+  0x11, 0x31, 0x21, 0x12, 0x13, 0x11, 0x13, 0x12, 0x11, 0x12, 0x11, 0x11, 0x21, 0x31, 0x12, 0x11,
+  0x16, 0x11, 0x11, 0x12, 0x13, 0x11, 0x21, 0x10, 0x6, 0x32, 0x63, 0x63, 0x6, 0x6, 0x36, 0x36,
+  0x63, 0x6, 0x36, 0x3, 0x63, 0x60, 0x36, 0x36, 0x23, 0x62, 0x11, 0x11, 0x13, 0x11, 0x30, 0x63,
+  0x62, 0x36, 0x3, 0x60, 0x6, 0x6, 0x30, 0x36, 0x6, 0x36, 0x6, 0x30, 0x66, 0x63, 0x26, 0x30,
+  0x36, 0x13, 0x23, 0x11, 0x11, 0x31, 0x21, 0x11, 0x11, 0x31, 0x11, 0x11, 0x31, 0x12, 0x11, 0x31,
+  0x21, 0x21, 0x11, 0x31, 0x21, 0x31, 0x11, 0x12, 0x13, 0x11, 0x31, 0x13, 0x11, 0x12, 0x13, 0x11,
+  0x21, 0x11, 0x11, 0x11, 0x12, 0x16, 0x11, 0x11, 0x13, 0x11, 0x31, 0x21, 0x31, 0x11, 0x31, 0x31,
+  0x13, 0x11, 0x21, 0x11, 0x11, 0x11, 0x11, 0x16, 0x23, 0x63, 0x63, 0x6, 0x3, 0x60, 0x63, 0x63,
+  0x6, 0x30, 0x63, 0x60, 0x6, 0x30, 0x60, 0x36, 0x36, 0x3, 0x11, 0x12, 0x11, 0x11, 0x16, 0x2,
+  0x3, 0x63, 0x60, 0x36, 0x3, 0x63, 0x6, 0x3, 0x60, 0x6, 0x30, 0x60, 0x30, 0x36, 0x32, 0x36,
+  0x23, 0x21, 0x32, 0x33, 0x21, 0x11, 0x16, 0x11, 0x21, 0x11, 0x21, 0x12, 0x11, 0x13, 0x11, 0x11,
+  0x11, 0x11, 0x31, 0x11, 0x11, 0x12, 0x13, 0x11, 0x11, 0x11, 0x12, 0x11, 0x13, 0x11, 0x11, 0x31,
+  0x11, 0x21, 0x32, 0x13, 0x11, 0x13, 0x12, 0x13, 0x11, 0x21, 0x16, 0x11, 0x12, 0x12, 0x11, 0x21,
+  0x11, 0x11, 0x13, 0x11, 0x21, 0x16, 0x13, 0x23, 0x6, 0x32, 0x36, 0x3, 0x6, 0x36, 0x30, 0x60,
+  0x63, 0x60, 0x6, 0x3, 0x63, 0x6, 0x30, 0x63, 0x63, 0x62, 0x11, 0x11, 0x11, 0x11, 0x10, 0x36,
+  0x36, 0x36, 0x0, 0x60, 0x36, 0x0, 0x63, 0x60, 0x3, 0x63, 0x6, 0x30, 0x60, 0x10, 0x63, 0x60,
+  0x36, 0x13, 0x13, 0x12, 0x11, 0x13, 0x11, 0x21, 0x11, 0x11, 0x11, 0x31, 0x11, 0x11, 0x12, 0x13,
+  0x11, 0x31, 0x11, 0x21, 0x11, 0x11, 0x11, 0x11, 0x31, 0x21, 0x11, 0x12, 0x11, 0x16, 0x11, 0x11,
+  0x21, 0x11, 0x11, 0x11, 0x12, 0x11, 0x21, 0x12, 0x16, 0x13, 0x12, 0x13, 0x16, 0x13, 0x12, 0x13,
+  0x11, 0x12, 0x11, 0x61, 0x13, 0x11, 0x11, 0x16, 0x36, 0x36, 0x63, 0x60, 0x60, 0x0, 0x63, 0x63,
+  0x0, 0x63, 0x63, 0x60, 0x60, 0x60, 0x60, 0x63, 0x26, 0x3, 0x11, 0x13, 0x11, 0x21, 0x11, 0x0,
+  0x36, 0x23, 0x60, 0x30, 0x60, 0x36, 0x0, 0x63, 0x66, 0x0, 0x60, 0x60, 0x6, 0x36, 0x36, 0x6,
+  0x32, 0x31, 0x32, 0x36, 0x31, 0x11, 0x11, 0x11, 0x31, 0x21, 0x31, 0x11, 0x11, 0x21, 0x11, 0x11,
+  0x11, 0x12, 0x11, 0x11, 0x31, 0x21, 0x31, 0x21, 0x11, 0x11, 0x13, 0x11, 0x12, 0x11, 0x21, 0x21,
+  0x13, 0x16, 0x13, 0x12, 0x11, 0x31, 0x11, 0x31, 0x12, 0x11, 0x11, 0x21, 0x31, 0x12, 0x13, 0x11,
+  0x12, 0x11, 0x11, 0x11, 0x11, 0x12, 0x11, 0x13, 0x6, 0x2, 0x36, 0x36, 0x30, 0x63, 0x60, 0x6,
+  0x63, 0x60, 0x6, 0x3, 0x6, 0x30, 0x36, 0x36, 0x36, 0x36, 0x11, 0x11, 0x11, 0x11, 0x12, 0x36,
+  0x6, 0x36, 0x36, 0x6, 0x30, 0x60, 0x63, 0x6, 0x3, 0x6, 0x30, 0x36, 0x30, 0x63, 0x23, 0x63,
+  0x24, 0x13, 0x21, 0x31, 0x11, 0x21, 0x13, 0x11, 0x11, 0x11, 0x11, 0x12, 0x13, 0x11, 0x31, 0x11,
+  0x21, 0x11, 0x13, 0x12, 0x11, 0x11, 0x11, 0x11, 0x21, 0x31, 0x21, 0x12, 0x13, 0x11, 0x31, 0x11,
+  0x31, 0x11, 0x21, 0x11, 0x13, 0x11, 0x31, 0x11, 0x21, 0x31, 0x23, 0x11, 0x21, 0x31, 0x12, 0x13,
+  0x13, 0x11, 0x21, 0x31, 0x21, 0x11, 0x21, 0x11, 0x2, 0x36, 0x32, 0x60, 0x63, 0x60, 0x36, 0x30,
+  0x36, 0x3, 0x63, 0x6, 0x30, 0x6, 0x0, 0x63, 0x20, 0x63, 0x11, 0x21, 0x61, 0x11, 0x11, 0x60,
+  0x32, 0x36, 0x36, 0x0, 0x6, 0x30, 0x36, 0x3, 0x60, 0x60, 0x6, 0x0, 0x63, 0x26, 0x36, 0x6,
+  0x32, 0x31, 0x32, 0x32, 0x31, 0x11, 0x11, 0x12, 0x11, 0x61, 0x21, 0x11, 0x11, 0x11, 0x11, 0x21,
+  0x13, 0x16, 0x11, 0x11, 0x11, 0x31, 0x21, 0x31, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x11, 0x61,
+  0x11, 0x21, 0x16, 0x12, 0x11, 0x12, 0x11, 0x21, 0x31, 0x13, 0x11, 0x13, 0x11, 0x21, 0x31, 0x21,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x31, 0x11, 0x11, 0x6, 0x63, 0x63, 0x63, 0x0, 0x6, 0x6, 0x6,
+  0x6, 0x36, 0x0, 0x63, 0x60, 0x63, 0x6, 0x36, 0x36, 0x32, 0x11, 0x11, 0x11, 0x31, 0x11, 0x10,
+  0x60, 0x62, 0x36, 0x36, 0x3, 0x60, 0x60, 0x36, 0x3, 0x63, 0x63, 0x6, 0x6, 0x36, 0x32, 0x36,
+  0x6, 0x32, 0x31, 0x31, 0x21, 0x13, 0x12, 0x11, 0x13, 0x11, 0x11, 0x31, 0x61, 0x21, 0x12, 0x11,
+  0x31, 0x11, 0x21, 0x61, 0x21, 0x11, 0x11, 0x11, 0x31, 0x21, 0x31, 0x31, 0x11, 0x11, 0x31, 0x21,
+  0x21, 0x31, 0x11, 0x31, 0x12, 0x11, 0x16, 0x11, 0x11, 0x21, 0x12, 0x12, 0x13, 0x11, 0x21, 0x31,
+  0x11, 0x21, 0x31, 0x12, 0x11, 0x11, 0x13, 0x11, 0x23, 0x63, 0x26, 0x36, 0x36, 0x3, 0x60, 0x36,
+  0x30, 0x60, 0x36, 0x0, 0x63, 0x6, 0x36, 0x23, 0x53, 0x60, 0x11, 0x31, 0x11, 0x11, 0x21, 0x11,
+  0x0, 0x36, 0x36, 0x3, 0x60, 0x3, 0x60, 0x60, 0x60, 0x6, 0x0, 0x63, 0x3, 0x63, 0x63, 0x60,
+  0x31, 0x31, 0x23, 0x13, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11, 0x61, 0x11, 0x11, 0x13, 0x11, 0x61,
+  0x11, 0x31, 0x11, 0x13, 0x11, 0x21, 0x31, 0x21, 0x11, 0x11, 0x11, 0x11, 0x31, 0x21, 0x11, 0x11,
+  0x11, 0x11, 0x21, 0x13, 0x11, 0x13, 0x12, 0x13, 0x21, 0x13, 0x11, 0x31, 0x12, 0x13, 0x12, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x13, 0x16, 0x11, 0x11, 0x10, 0x6, 0x36, 0x26, 0x6, 0x36, 0x3, 0x60,
+  0x6, 0x30, 0x60, 0x36, 0x0, 0x63, 0x6, 0x36, 0x36, 0x1, 0x11, 0x11, 0x12, 0x11, 0x11, 0x13,
+  0x63, 0x60, 0x23, 0x60, 0x6, 0x36, 0x3, 0x3, 0x63, 0x63, 0x6, 0x30, 0x66, 0x32, 0x63, 0x63,
+  0x23, 0x23, 0x13, 0x23, 0x11, 0x21, 0x11, 0x11, 0x21, 0x21, 0x11, 0x21, 0x21, 0x11, 0x11, 0x11,
+  0x12, 0x11, 0x21, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x31, 0x21, 0x21, 0x11, 0x11, 0x21, 0x31,
+  0x31, 0x61, 0x11, 0x11, 0x13, 0x11, 0x21, 0x11, 0x16, 0x11, 0x12, 0x11, 0x21, 0x12, 0x13, 0x12,
+  0x13, 0x11, 0x21, 0x31, 0x11, 0x11, 0x21, 0x11, 0x16, 0x32, 0x63, 0x36, 0x30, 0x0, 0x6, 0x6,
+  0x36, 0x6, 0x36, 0x3, 0x63, 0x6, 0x32, 0x36, 0x32, 0x3, 0x11, 0x11, 0x11, 0x11, 0x31, 0x11,
+  0x20, 0x63, 0x66, 0x36, 0x30, 0x63, 0x6, 0x6, 0x0, 0x6, 0x30, 0x60, 0x36, 0x36, 0x36, 0x20,
+  0x63, 0x13, 0x63, 0x12, 0x31, 0x11, 0x12, 0x11, 0x11, 0x11, 0x13, 0x11, 0x11, 0x61, 0x12, 0x13,
+  0x11, 0x11, 0x31, 0x21, 0x61, 0x31, 0x21, 0x31, 0x11, 0x11, 0x11, 0x16, 0x12, 0x13, 0x11, 0x12,
+  0x11, 0x11, 0x32, 0x12, 0x11, 0x21, 0x13, 0x21, 0x13, 0x12, 0x11, 0x31, 0x31, 0x31, 0x11, 0x31,
+  0x11, 0x16, 0x11, 0x11, 0x21, 0x12, 0x11, 0x31, 0x30, 0x63, 0x36, 0x23, 0x60, 0x63, 0x63, 0x3,
+  0x60, 0x36, 0x0, 0x60, 0x40, 0x60, 0x6, 0x36, 0x24, 0x35, 0x11, 0x21, 0x13, 0x11, 0x11, 0x11,
+  0x36, 0x3, 0x63, 0x60, 0x6, 0x0, 0x63, 0x63, 0x6, 0x30, 0x6, 0x3, 0x60, 0x23, 0x63, 0x6,
+  0x31, 0x23, 0x12, 0x36, 0x11, 0x13, 0x11, 0x16, 0x13, 0x11, 0x21, 0x13, 0x11, 0x13, 0x11, 0x11,
+  0x12, 0x11, 0x11, 0x13, 0x11, 0x11, 0x11, 0x12, 0x16, 0x13, 0x16, 0x11, 0x13, 0x11, 0x12, 0x11,
+  0x12, 0x13, 0x11, 0x13, 0x11, 0x16, 0x11, 0x11, 0x31, 0x13, 0x16, 0x11, 0x21, 0x16, 0x21, 0x12,
+  0x12, 0x11, 0x12, 0x11, 0x13, 0x11, 0x11, 0x11, 0x11, 0x6, 0x36, 0x36, 0x63, 0x60, 0x6, 0x6,
+  0x0, 0x60, 0x36, 0x36, 0x36, 0x3, 0x63, 0x63, 0x63, 0x63, 0x11, 0x11, 0x11, 0x11, 0x12, 0x11,
+  0x53, 0x6, 0x32, 0x36, 0x3, 0x63, 0x0, 0x6, 0x30, 0x6, 0x3, 0x60, 0x63, 0x66, 0x32, 0x63,
+  0x23, 0x13, 0x23, 0x13, 0x32, 0x11, 0x13, 0x11, 0x11, 0x31, 0x11, 0x11, 0x12, 0x11, 0x13, 0x16,
+  0x11, 0x13, 0x12, 0x11, 0x11, 0x21, 0x36, 0x11, 0x11, 0x21, 0x11, 0x32, 0x11, 0x12, 0x11, 0x61,
+  0x13, 0x11, 0x61, 0x11, 0x21, 0x31, 0x13, 0x12, 0x11, 0x21, 0x12, 0x13, 0x11, 0x31, 0x13, 0x11,
+  0x11, 0x13, 0x11, 0x13, 0x11, 0x13, 0x12, 0x11, 0x12, 0x36, 0x6, 0x32, 0x30, 0x3, 0x63, 0x3,
+  0x63, 0x63, 0x60, 0x0, 0x6, 0x36, 0x6, 0x23, 0x63, 0x21, 0x11, 0x31, 0x11, 0x21, 0x11, 0x11,
+  0x10, 0x63, 0x24, 0x63, 0x60, 0x6, 0x6, 0x30, 0x60, 0x63, 0x60, 0x3, 0x63, 0x63, 0x24, 0x36,
+  0x31, 0x32, 0x31, 0x32, 0x11, 0x11, 0x11, 0x12, 0x11, 0x11, 0x31, 0x12, 0x11, 0x12, 0x11, 0x11,
+  0x21, 0x11, 0x11, 0x12, 0x13, 0x11, 0x11, 0x13, 0x12, 0x11, 0x21, 0x11, 0x13, 0x11, 0x13, 0x12,
+  0x11, 0x12, 0x13, 0x11, 0x11, 0x12, 0x11, 0x11, 0x12, 0x11, 0x31, 0x12, 0x13, 0x12, 0x31, 0x23,
+  0x13, 0x11, 0x21, 0x11, 0x11, 0x11, 0x11, 0x21, 0x11, 0x63, 0x23, 0x63, 0x66, 0x6, 0x0, 0x60,
+  0x6, 0x0, 0x3, 0x66, 0x30, 0x0, 0x36, 0x36, 0x36, 0x6, 0x11, 0x11, 0x11, 0x11, 0x13, 0x11,
+  0x11, 0x20, 0x63, 0x36, 0x3, 0x60, 0x30, 0x60, 0x63, 0x0, 0x3, 0x60, 0x62, 0x36, 0x36, 0x0,
+  0x10, 0x13, 0x10, 0x13, 0x31, 0x61, 0x21, 0x11, 0x12, 0x11, 0x12, 0x11, 0x13, 0x11, 0x11, 0x21,
+  0x11, 0x31, 0x21, 0x31, 0x11, 0x13, 0x12, 0x11, 0x11, 0x11, 0x31, 0x12, 0x11, 0x13, 0x11, 0x11,
+  0x12, 0x11, 0x11, 0x26, 0x13, 0x11, 0x12, 0x13, 0x11, 0x31, 0x12, 0x31, 0x15, 0x31, 0x11, 0x11,
+  0x11, 0x11, 0x13, 0x11, 0x21, 0x61, 0x13, 0x11, 0x11, 0x30, 0x63, 0x62, 0x63, 0x63, 0x6, 0x30,
+  0x63, 0x6, 0x36, 0x3, 0x60, 0x63, 0x62, 0x36, 0x32, 0x31, 0x11, 0x16, 0x12, 0x16, 0x11, 0x11,
+  0x13, 0x3, 0x63, 0x53, 0x60, 0x3, 0x60, 0x30, 0x30, 0x63, 0x60, 0x3, 0x63, 0x60, 0x63, 0x2,
+  0x31, 0x32, 0x13, 0x12, 0x61, 0x11, 0x31, 0x16, 0x11, 0x12, 0x11, 0x16, 0x11, 0x13, 0x11, 0x13,
+  0x16, 0x11, 0x11, 0x11, 0x61, 0x11, 0x11, 0x12, 0x31, 0x31, 0x11, 0x21, 0x12, 0x11, 0x12, 0x13,
+  0x11, 0x31, 0x21, 0x11, 0x21, 0x13, 0x11, 0x31, 0x13, 0x12, 0x11, 0x11, 0x31, 0x12, 0x13, 0x21,
+  0x11, 0x21, 0x11, 0x11, 0x11, 0x12, 0x11, 0x11, 0x21, 0x13, 0x60, 0x63, 0x36, 0x6, 0x30, 0x63,
+  0x6, 0x30, 0x60, 0x60, 0x3, 0x6, 0x36, 0x23, 0x60, 0x63, 0x11, 0x11, 0x11, 0x31, 0x11, 0x21,
+  0x11, 0x10, 0x36, 0x32, 0x63, 0x60, 0x60, 0x60, 0x60, 0x6, 0x0, 0x63, 0x23, 0x63, 0x20, 0x63,
+  0x12, 0x31, 0x36, 0x13, 0x23, 0x11, 0x12, 0x11, 0x13, 0x11, 0x13, 0x11, 0x12, 0x11, 0x13, 0x11,
+  0x11, 0x13, 0x11, 0x31, 0x12, 0x12, 0x13, 0x11, 0x11, 0x11, 0x21, 0x16, 0x13, 0x12, 0x11, 0x21,
+  0x31, 0x11, 0x13, 0x13, 0x11, 0x21, 0x12, 0x11, 0x21, 0x11, 0x13, 0x12, 0x12, 0x13, 0x21, 0x31,
+  0x12, 0x11, 0x31, 0x21, 0x31, 0x11, 0x16, 0x13, 0x11, 0x20, 0x63, 0x23, 0x62, 0x36, 0x6, 0x0,
+  0x60, 0x6, 0x30, 0x36, 0x6, 0x3, 0x63, 0x60, 0x63, 0x21, 0x11, 0x31, 0x21, 0x11, 0x21, 0x11,
+  0x11, 0x60, 0x62, 0x36, 0x36, 0x3, 0x3, 0x63, 0x43, 0x60, 0x36, 0x36, 0x63, 0x63, 0x63, 0x63,
+  0x23, 0x13, 0x23, 0x23, 0x11, 0x11, 0x11, 0x13, 0x11, 0x16, 0x11, 0x12, 0x11, 0x12, 0x11, 0x12,
+  0x12, 0x11, 0x12, 0x11, 0x21, 0x13, 0x11, 0x12, 0x12, 0x13, 0x11, 0x31, 0x11, 0x11, 0x31, 0x11,
+  0x11, 0x21, 0x31, 0x11, 0x16, 0x11, 0x31, 0x12, 0x16, 0x23, 0x12, 0x11, 0x13, 0x11, 0x11, 0x12,
+  0x11, 0x61, 0x11, 0x11, 0x12, 0x13, 0x11, 0x11, 0x11, 0x11, 0x6, 0x36, 0x36, 0x36, 0x30, 0x36,
+  0x3, 0x60, 0x6, 0x4, 0x30, 0x63, 0x62, 0x36, 0x36, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13,
+  0x11, 0x12, 0x36, 0x36, 0x36, 0x6, 0x6, 0x0, 0x60, 0x36, 0x0, 0x63, 0x63, 0x26, 0x0, 0x23,
+  0x13, 0x13, 0x61, 0x31, 0x33, 0x11, 0x61, 0x11, 0x21, 0x11, 0x21, 0x11, 0x13, 0x11, 0x12, 0x11,
+  0x11, 0x13, 0x11, 0x11, 0x13, 0x11, 0x21, 0x11, 0x31, 0x11, 0x21, 0x11, 0x31, 0x21, 0x11, 0x31,
+  0x21, 0x11, 0x11, 0x12, 0x11, 0x21, 0x13, 0x11, 0x31, 0x11, 0x11, 0x13, 0x11, 0x21, 0x31, 0x31,
+  0x11, 0x11, 0x21, 0x61, 0x11, 0x11, 0x11, 0x31, 0x12, 0x13, 0x6, 0x36, 0x32, 0x63, 0x60, 0x60,
+  0x36, 0x3, 0x63, 0x6, 0x6, 0x36, 0x36, 0x32, 0x36, 0x31, 0x12, 0x11, 0x31, 0x13, 0x11, 0x11,
+  0x11, 0x13, 0x6, 0x23, 0x62, 0x36, 0x30, 0x6, 0x30, 0x60, 0x6, 0x32, 0x36, 0x3, 0x63, 0x63,
+  0x23, 0x21, 0x32, 0x32, 0x31, 0x12, 0x13, 0x11, 0x11, 0x21, 0x11, 0x31, 0x11, 0x13, 0x11, 0x13,
+  0x13, 0x11, 0x13, 0x13, 0x11, 0x11, 0x13, 0x11, 0x11, 0x61, 0x11, 0x31, 0x11, 0x31, 0x61, 0x11,
+  0x13, 0x12, 0x16, 0x13, 0x13, 0x11, 0x21, 0x12, 0x11, 0x31, 0x23, 0x12, 0x13, 0x11, 0x21, 0x21,
+  0x11, 0x31, 0x13, 0x11, 0x13, 0x11, 0x21, 0x21, 0x11, 0x12, 0x60, 0x2, 0x63, 0x23, 0x60, 0x36,
+  0x0, 0x60, 0x6, 0x30, 0x30, 0x2, 0x36, 0x6, 0x2, 0x1, 0x11, 0x11, 0x12, 0x11, 0x13, 0x11,
+  0x21, 0x11, 0x60, 0x36, 0x36, 0x36, 0x6, 0x30, 0x60, 0x36, 0x3, 0x64, 0x23, 0x63, 0x20, 0x63,
+  0x11, 0x32, 0x31, 0x31, 0x23, 0x11, 0x11, 0x11, 0x31, 0x11, 0x31, 0x12, 0x12, 0x11, 0x16, 0x11,
+  0x11, 0x12, 0x11, 0x11, 0x12, 0x13, 0x11, 0x12, 0x13, 0x11, 0x31, 0x11, 0x21, 0x11, 0x21, 0x32,
+  0x11, 0x11, 0x31, 0x11, 0x11, 0x13, 0x11, 0x31, 0x12, 0x13, 0x11, 0x16, 0x11, 0x21, 0x31, 0x31,
+  0x12, 0x11, 0x11, 0x12, 0x11, 0x12, 0x11, 0x11, 0x31, 0x11, 0x30, 0x13, 0x63, 0x66, 0x36, 0x0,
+  0x36, 0x30, 0x60, 0x6, 0x6, 0x36, 0x6, 0x36, 0x36, 0x61, 0x11, 0x31, 0x11, 0x11, 0x21, 0x11,
+  0x11, 0x11, 0x30, 0x62, 0x36, 0x36, 0x30, 0x6, 0x0, 0x60, 0x36, 0x30, 0x36, 0x6, 0x3, 0x12,
+  0x36, 0x31, 0x31, 0x32, 0x31, 0x11, 0x31, 0x21, 0x11, 0x12, 0x11, 0x11, 0x31, 0x11, 0x21, 0x12,
+  0x12, 0x11, 0x12, 0x12, 0x11, 0x31, 0x12, 0x13, 0x11, 0x12, 0x11, 0x21, 0x11, 0x21, 0x11, 0x11,
+  0x13, 0x12, 0x11, 0x21, 0x21, 0x21, 0x12, 0x11, 0x31, 0x11, 0x12, 0x31, 0x12, 0x13, 0x11, 0x12,
+  0x11, 0x21, 0x12, 0x11, 0x12, 0x11, 0x11, 0x31, 0x16, 0x11, 0x10, 0x6, 0x36, 0x32, 0x36, 0x36,
+  0x0, 0x60, 0x36, 0x36, 0x30, 0x63, 0x63, 0x23, 0x63, 0x31, 0x11, 0x11, 0x61, 0x11, 0x11, 0x13,
+  0x11, 0x21, 0x53, 0x63, 0x63, 0x26, 0x6, 0x3, 0x60, 0x30, 0x63, 0x62, 0x63, 0x23, 0x6, 0x31,
+  0x31, 0x23, 0x10, 0x13, 0x63, 0x21, 0x11, 0x12, 0x11, 0x31, 0x11, 0x11, 0x16, 0x11, 0x13, 0x11,
+  0x31, 0x13, 0x13, 0x11, 0x31, 0x11, 0x31, 0x11, 0x12, 0x11, 0x13, 0x11, 0x31, 0x13, 0x13, 0x16,
+  0x11, 0x11, 0x21, 0x13, 0x11, 0x16, 0x11, 0x11, 0x12, 0x12, 0x11, 0x21, 0x36, 0x21, 0x12, 0x31,
+  0x11, 0x13, 0x11, 0x13, 0x11, 0x13, 0x16, 0x11, 0x11, 0x21, 0x10, 0x63, 0x26, 0x36, 0x63, 0x60,
+  0x36, 0x3, 0x60, 0x0, 0x6, 0x32, 0x63, 0x60, 0x20, 0x11, 0x21, 0x11, 0x21, 0x31, 0x11, 0x11,
+  0x16, 0x11, 0x10, 0x6, 0x23, 0x63, 0x63, 0x6, 0x3, 0x60, 0x63, 0x23, 0x6, 0x36, 0x63, 0x23,
+  0x12, 0x31, 0x32, 0x31, 0x21, 0x11, 0x12, 0x11, 0x11, 0x11, 0x62, 0x13, 0x11, 0x13, 0x11, 0x11,
+  0x11, 0x31, 0x11, 0x16, 0x11, 0x21, 0x11, 0x61, 0x13, 0x11, 0x21, 0x13, 0x11, 0x21, 0x11, 0x21,
+  0x21, 0x31, 0x13, 0x11, 0x13, 0x11, 0x31, 0x31, 0x11, 0x13, 0x11, 0x11, 0x11, 0x11, 0x31, 0x12,
+  0x13, 0x11, 0x13, 0x11, 0x61, 0x11, 0x11, 0x31, 0x13, 0x11, 0x11, 0x3, 0x63, 0x63, 0x20, 0x10,
+  0x43, 0x6, 0x3, 0x60, 0x63, 0x63, 0x23, 0x63, 0x60, 0x21, 0x11, 0x31, 0x11, 0x12, 0x16, 0x12,
+  0x11, 0x11, 0x16, 0x3, 0x63, 0x62, 0x36, 0x3, 0x60, 0x0, 0x36, 0x6, 0x30, 0x63, 0x23, 0x12,
+  0x63, 0x62, 0x31, 0x23, 0x33, 0x13, 0x11, 0x11, 0x31, 0x21, 0x11, 0x11, 0x12, 0x11, 0x21, 0x12,
+  0x11, 0x12, 0x13, 0x11, 0x21, 0x11, 0x31, 0x12, 0x11, 0x31, 0x11, 0x11, 0x16, 0x11, 0x21, 0x11,
+  0x31, 0x16, 0x11, 0x12, 0x11, 0x21, 0x11, 0x11, 0x13, 0x11, 0x13, 0x13, 0x21, 0x32, 0x11, 0x11,
+  0x11, 0x12, 0x11, 0x12, 0x11, 0x21, 0x12, 0x11, 0x21, 0x13, 0x12, 0x6, 0x2, 0x36, 0x36, 0x36,
+  0x6, 0x0, 0x36, 0x3, 0x63, 0x63, 0x63, 0x62, 0x30, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x13, 0x6, 0x36, 0x36, 0x36, 0x6, 0x0, 0x63, 0x53, 0x63, 0x66, 0x30, 0x63, 0x13,
+  0x31, 0x31, 0x36, 0x31, 0x21, 0x21, 0x11, 0x31, 0x11, 0x11, 0x31, 0x13, 0x11, 0x11, 0x13, 0x11,
+  0x16, 0x11, 0x11, 0x21, 0x13, 0x11, 0x11, 0x21, 0x16, 0x11, 0x32, 0x12, 0x11, 0x31, 0x13, 0x11,
+  0x11, 0x21, 0x12, 0x11, 0x31, 0x11, 0x11, 0x16, 0x31, 0x63, 0x23, 0x63, 0x13, 0x26, 0x32, 0x31,
+  0x12, 0x11, 0x12, 0x11, 0x11, 0x13, 0x11, 0x21, 0x11, 0x11, 0x11, 0x60, 0x36, 0x2, 0x36, 0x23,
+  0x60, 0x36, 0x0, 0x60, 0x2, 0x36, 0x26, 0x30, 0x63, 0x61, 0x31, 0x11, 0x13, 0x11, 0x21, 0x31,
+  0x12, 0x13, 0x15, 0x30, 0x26, 0x32, 0x63, 0x3, 0x63, 0x6, 0x36, 0x2, 0x36, 0x2, 0x36, 0x21,
+  0x31, 0x23, 0x13, 0x26, 0x33, 0x11, 0x21, 0x11, 0x11, 0x31, 0x11, 0x11, 0x61, 0x21, 0x11, 0x13,
+  0x11, 0x31, 0x21, 0x13, 0x11, 0x31, 0x21, 0x13, 0x11, 0x21, 0x11, 0x31, 0x21, 0x12, 0x11, 0x31,
+  0x21, 0x13, 0x11, 0x31, 0x11, 0x61, 0x15, 0x11, 0x63, 0x23, 0x13, 0x23, 0x23, 0x13, 0x63, 0x23,
+  0x11, 0x13, 0x11, 0x13, 0x12, 0x11, 0x13, 0x11, 0x31, 0x21, 0x11, 0x32, 0x6, 0x36, 0x36, 0x36,
+  0x30, 0x60, 0x36, 0x30, 0x10, 0x63, 0x36, 0x6, 0x36, 0x11, 0x11, 0x23, 0x16, 0x13, 0x63, 0x53,
+  0x63, 0x62, 0x13, 0x60, 0x30, 0x63, 0x62, 0x60, 0x0, 0x61, 0x2, 0x36, 0x36, 0x30, 0x11, 0x33,
+  0x53, 0x13, 0x21, 0x31, 0x31, 0x13, 0x11, 0x21, 0x61, 0x12, 0x32, 0x11, 0x13, 0x11, 0x31, 0x21,
+  0x12, 0x11, 0x13, 0x11, 0x11, 0x11, 0x13, 0x11, 0x12, 0x11, 0x11, 0x11, 0x13, 0x11, 0x12, 0x11,
+  0x13, 0x11, 0x11, 0x11, 0x11, 0x11, 0x61, 0x36, 0x31, 0x36, 0x36, 0x36, 0x31, 0x30, 0x31, 0x31,
+  0x13, 0x11, 0x16, 0x11, 0x11, 0x12, 0x32, 0x33, 0x21, 0x11, 0x21, 0x63, 0x63, 0x63, 0x23, 0x63,
+  0x26, 0x36, 0x0, 0x63, 0x63, 0x26, 0x32, 0x36, 0x0, 0x32, 0x63, 0x10, 0x60, 0x6, 0x36, 0x6,
+  0x36, 0x36, 0x6, 0x36, 0x63, 0x63, 0x63, 0x36, 0x36, 0x36, 0x36, 0x6, 0x32, 0x6, 0x32, 0x13,
+  0x12, 0x31, 0x63, 0x23, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x63, 0x3, 0x11, 0x11, 0x11, 0x13,
+  0x11, 0x13, 0x11, 0x12, 0x12, 0x12, 0x11, 0x13, 0x11, 0x32, 0x13, 0x16, 0x11, 0x11, 0x31, 0x12,
+  0x11, 0x21, 0x32, 0x11, 0x31, 0x61, 0x36, 0x32, 0x36, 0x32, 0x32, 0x32, 0x36, 0x31, 0x23, 0x3,
+  0x11, 0x12, 0x11, 0x12, 0x13, 0x13, 0x63, 0x12, 0x33, 0x11, 0x11, 0x10, 0x2, 0x6, 0x36, 0x20,
+  0x63, 0x0, 0x43, 0x6, 0x36, 0x36, 0x6, 0x32, 0x36, 0x63, 0x60, 0x63, 0x63, 0x63, 0x60, 0x63,
+  0x20, 0x63, 0x63, 0x20, 0x2, 0x0, 0x63, 0x53, 0x63, 0x23, 0x63, 0x63, 0x24, 0x36, 0x26, 0x35,
+  0x31, 0x31, 0x31, 0x31, 0x23, 0x11, 0x21, 0x31, 0x13, 0x11, 0x11, 0x10, 0x21, 0x31, 0x21, 0x11,
+  0x12, 0x11, 0x12, 0x11, 0x31, 0x13, 0x11, 0x21, 0x16, 0x11, 0x11, 0x11, 0x21, 0x21, 0x11, 0x31,
+  0x11, 0x11, 0x11, 0x16, 0x16, 0x36, 0x36, 0x36, 0x32, 0x36, 0x33, 0x13, 0x63, 0x23, 0x36, 0x23,
+  0x12, 0x11, 0x31, 0x31, 0x11, 0x32, 0x32, 0x31, 0x31, 0x21, 0x31, 0x11, 0x36, 0x36, 0x36, 0x36,
+  0x36, 0x36, 0x6, 0x36, 0x2, 0x63, 0x63, 0x60, 0x63, 0x26, 0x31, 0x6, 0x32, 0x6, 0x23, 0x60,
+  0x63, 0x60, 0x60, 0x63, 0x63, 0x63, 0x2, 0x36, 0x6, 0x36, 0x23, 0x63, 0x60, 0x1, 0x31, 0x31,
+  0x31, 0x62, 0x36, 0x26, 0x31, 0x31, 0x11, 0x11, 0x11, 0x11, 0x21, 0x11, 0x12, 0x13, 0x12, 0x61,
+  0x11, 0x16, 0x11, 0x31, 0x16, 0x11, 0x31, 0x12, 0x11, 0x13, 0x12, 0x13, 0x11, 0x31, 0x61, 0x11,
+  0x61, 0x32, 0x13, 0x11, 0x33, 0x13, 0x23, 0x23, 0x36, 0x33, 0x63, 0x3, 0x23, 0x36, 0x3, 0x13,
+  0x11, 0x11, 0x11, 0x11, 0x21, 0x63, 0x13, 0x23, 0x23, 0x11, 0x11, 0x11, 0x60, 0x2, 0x36, 0x36,
+  0x32, 0x63, 0x0, 0x63, 0x23, 0x63, 0x26, 0x21, 0x16, 0x16, 0x26, 0x32, 0x63, 0x63, 0x6, 0x32,
+  0x36, 0x2, 0x36, 0x36, 0x23, 0x62, 0x63, 0x60, 0x10, 0x63, 0x63, 0x20, 0x63, 0x63, 0x12, 0x13,
+  0x53, 0x23, 0x13, 0x13, 0x10, 0x11, 0x12, 0x11, 0x31, 0x21, 0x31, 0x13, 0x11, 0x11, 0x13, 0x13,
+  0x13, 0x11, 0x13, 0x11, 0x11, 0x11, 0x11, 0x61, 0x31, 0x21, 0x11, 0x11, 0x11, 0x11, 0x31, 0x21,
+  0x31, 0x11, 0x11, 0x13, 0x12, 0x33, 0x63, 0x36, 0x23, 0x23, 0x23, 0x23, 0x63, 0x23, 0x32, 0x33,
+  0x13, 0x16, 0x12, 0x11, 0x11, 0x13, 0x23, 0x31, 0x31, 0x21, 0x12, 0x11, 0x16, 0x34, 0x23, 0x62,
+  0x36, 0x36, 0x63, 0x6, 0x36, 0x36, 0x63, 0x16, 0x11, 0x61, 0x11, 0x63, 0x64, 0x26, 0x36, 0x36,
+  0x63, 0x63, 0x62, 0x36, 0x36, 0x63, 0x16, 0x16, 0x36, 0x32, 0x36, 0x36, 0x3, 0x21, 0x13, 0x21,
+  0x31, 0x13, 0x12, 0x31, 0x32, 0x31, 0x31, 0x11, 0x11, 0x11, 0x11, 0x21, 0x11, 0x16, 0x11, 0x11,
+  0x61, 0x23, 0x11, 0x21, 0x21, 0x31, 0x21, 0x31, 0x11, 0x11, 0x13, 0x12, 0x13, 0x21, 0x11, 0x11,
+  0x11, 0x13, 0x12, 0x11, 0x36, 0x31, 0x36, 0x23, 0x31, 0x33, 0x63, 0x63, 0x23, 0x63, 0x63, 0x26,
+  0x11, 0x11, 0x11, 0x13, 0x11, 0x32, 0x36, 0x13, 0x23, 0x11, 0x31, 0x13, 0x13, 0x6, 0x36, 0x3,
+  0x60, 0x10, 0x23, 0x63, 0x6, 0x21, 0x11, 0x11, 0x16, 0x11, 0x63, 0x16, 0x10, 0x36, 0x26, 0x36,
+  0x32, 0x63, 0x63, 0x66, 0x35, 0x36, 0x63, 0x13, 0x51, 0x6, 0x36, 0x2, 0x36, 0x63, 0x63, 0x16,
+  0x12, 0x31, 0x63, 0x10, 0x13, 0x11, 0x11, 0x61, 0x11, 0x31, 0x16, 0x11, 0x13, 0x12, 0x11, 0x21,
+  0x11, 0x31, 0x23, 0x11, 0x13, 0x11, 0x11, 0x11, 0x21, 0x31, 0x21, 0x11, 0x11, 0x13, 0x12, 0x13,
+  0x12, 0x11, 0x11, 0x12, 0x31, 0x32, 0x32, 0x36, 0x33, 0x62, 0x32, 0x33, 0x63, 0x23, 0x13, 0x63,
+  0x11, 0x21, 0x13, 0x11, 0x12, 0x13, 0x13, 0x1, 0x36, 0x32, 0x11, 0x11, 0x11, 0x20, 0x63, 0x26,
+  0x36, 0x36, 0x36, 0x6, 0x1, 0x16, 0x16, 0x16, 0x11, 0x61, 0x11, 0x11, 0x31, 0x66, 0x36, 0x26,
+  0x36, 0x36, 0x26, 0x32, 0x60, 0x16, 0x21, 0x61, 0x11, 0x16, 0x26, 0x36, 0x0, 0x13, 0x16, 0x13,
+  0x11, 0x61, 0x32, 0x13, 0x62, 0x31, 0x21, 0x11, 0x21, 0x11, 0x13, 0x12, 0x11, 0x11, 0x31, 0x11,
+  0x31, 0x11, 0x11, 0x36, 0x11, 0x21, 0x31, 0x31, 0x11, 0x11, 0x11, 0x21, 0x31, 0x11, 0x13, 0x11,
+  0x13, 0x12, 0x13, 0x11, 0x32, 0x36, 0x33, 0x13, 0x62, 0x33, 0x36, 0x32, 0x36, 0x36, 0x32, 0x36,
+  0x11, 0x11, 0x21, 0x12, 0x13, 0x32, 0x32, 0x13, 0x23, 0x36, 0x31, 0x21, 0x11, 0x36, 0x6, 0x36,
+  0x32, 0x6, 0x32, 0x35, 0x11, 0x61, 0x11, 0x11, 0x16, 0x11, 0x16, 0x16, 0x16, 0x32, 0x63, 0x63,
+  0x62, 0x63, 0x63, 0x66, 0x31, 0x63, 0x16, 0x11, 0x61, 0x61, 0x13, 0x60, 0x36, 0x31, 0x23, 0x16,
+  0x13, 0x13, 0x16, 0x31, 0x23, 0x11, 0x11, 0x31, 0x11, 0x21, 0x31, 0x11, 0x31, 0x13, 0x11, 0x31,
+  0x11, 0x21, 0x61, 0x13, 0x11, 0x11, 0x11, 0x11, 0x31, 0x21, 0x31, 0x31, 0x11, 0x21, 0x11, 0x12,
+  0x11, 0x11, 0x11, 0x11, 0x63, 0x13, 0x62, 0x36, 0x33, 0x62, 0x36, 0x36, 0x32, 0x32, 0x36, 0x32,
+  0x11, 0x31, 0x11, 0x11, 0x11, 0x13, 0x23, 0x31, 0x31, 0x32, 0x31, 0x12, 0x11, 0x16, 0x3, 0x63,
+  0x66, 0x32, 0x36, 0x61, 0x61, 0x16, 0x16, 0x16, 0x11, 0x16, 0x11, 0x11, 0x21, 0x63, 0x13, 0x62,
+  0x63, 0x60, 0x63, 0x23, 0x62, 0x31, 0x61, 0x61, 0x11, 0x11, 0x61, 0x26, 0x32, 0x63, 0x13, 0x13,
+  0x23, 0x62, 0x31, 0x36, 0x36, 0x31, 0x21, 0x11, 0x31, 0x11, 0x11, 0x61, 0x11, 0x11, 0x11, 0x11,
+  0x21, 0x31, 0x12, 0x11, 0x31, 0x61, 0x31, 0x21, 0x11, 0x61, 0x11, 0x11, 0x31, 0x13, 0x12, 0x13,
+  0x12, 0x16, 0x13, 0x12, 0x13, 0x23, 0x13, 0x1, 0x1, 0x36, 0x32, 0x32, 0x31, 0x36, 0x32, 0x33,
+  0x12, 0x11, 0x31, 0x13, 0x10, 0x31, 0x31, 0x23, 0x23, 0x23, 0x11, 0x61, 0x13, 0x13, 0x20, 0x63,
+  0x23, 0x63, 0x61, 0x11, 0x11, 0x61, 0x11, 0x11, 0x16, 0x11, 0x16, 0x16, 0x16, 0x35, 0x66, 0x23,
+  0x63, 0x62, 0x66, 0x36, 0x63, 0x51, 0x61, 0x11, 0x61, 0x61, 0x11, 0x16, 0x6, 0x31, 0x26, 0x13,
+  0x16, 0x13, 0x12, 0x31, 0x13, 0x21, 0x11, 0x11, 0x11, 0x12, 0x11, 0x11, 0x13, 0x12, 0x12, 0x13,
+  0x11, 0x11, 0x31, 0x12, 0x61, 0x21, 0x11, 0x13, 0x12, 0x11, 0x31, 0x21, 0x11, 0x61, 0x11, 0x11,
+  0x13, 0x11, 0x21, 0x11, 0x32, 0x36, 0x36, 0x33, 0x23, 0x3, 0x36, 0x33, 0x63, 0x3, 0x23, 0x63,
+  0x11, 0x11, 0x12, 0x12, 0x31, 0x32, 0x3, 0x13, 0x13, 0x10, 0x32, 0x31, 0x11, 0x26, 0x36, 0x0,
+  0x63, 0x63, 0x61, 0x61, 0x61, 0x16, 0x16, 0x16, 0x11, 0x16, 0x11, 0x11, 0x11, 0x13, 0x13, 0x63,
+  0x65, 0x36, 0x32, 0x62, 0x1, 0x66, 0x11, 0x13, 0x11, 0x16, 0x16, 0x11, 0x62, 0x63, 0x13, 0x62,
+  0x13, 0x16, 0x31, 0x63, 0x21, 0x36, 0x13, 0x11, 0x21, 0x11, 0x13, 0x12, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x21, 0x11, 0x11, 0x13, 0x11, 0x13, 0x11, 0x11, 0x31, 0x11, 0x11, 0x21, 0x12, 0x13, 0x12,
+  0x11, 0x13, 0x11, 0x31, 0x13, 0x13, 0x23, 0x23, 0x32, 0x36, 0x23, 0x62, 0x33, 0x26, 0x31, 0x36,
+  0x11, 0x31, 0x11, 0x13, 0x10, 0x21, 0x32, 0x32, 0x13, 0x23, 0x63, 0x11, 0x21, 0x33, 0x63, 0x23,
+  0x60, 0x26, 0x11, 0x16, 0x11, 0x61, 0x11, 0x31, 0x16, 0x11, 0x16, 0x16, 0x16, 0x16, 0x62, 0x61,
+  0x63, 0x16, 0x36, 0x36, 0x36, 0x11, 0x16, 0x11, 0x51, 0x61, 0x11, 0x16, 0x13, 0x61, 0x21, 0x31,
+  0x31, 0x23, 0x13, 0x23, 0x13, 0x61, 0x11, 0x12, 0x11, 0x31, 0x11, 0x11, 0x16, 0x13, 0x13, 0x12,
+  0x13, 0x11, 0x61, 0x31, 0x31, 0x12, 0x11, 0x12, 0x11, 0x11, 0x21, 0x31, 0x13, 0x11, 0x31, 0x11,
+  0x11, 0x21, 0x11, 0x11, 0x32, 0x36, 0x33, 0x63, 0x63, 0x63, 0x31, 0x33, 0x63, 0x63, 0x32, 0x32,
+  0x11, 0x12, 0x11, 0x12, 0x31, 0x31, 0x31, 0x31, 0x36, 0x32, 0x32, 0x31, 0x11, 0x12, 0x30, 0x60,
+  0x36, 0x31, 0x16, 0x13, 0x16, 0x11, 0x61, 0x16, 0x11, 0x16, 0x11, 0x13, 0x11, 0x13, 0x13, 0x63,
+  0x26, 0x36, 0x26, 0x36, 0x10, 0x13, 0x11, 0x61, 0x61, 0x16, 0x16, 0x11, 0x11, 0x36, 0x36, 0x21,
+  0x61, 0x35, 0x31, 0x61, 0x1, 0x31, 0x21, 0x11, 0x11, 0x11, 0x31, 0x21, 0x31, 0x11, 0x11, 0x13,
+  0x11, 0x13, 0x11, 0x11, 0x53, 0x13, 0x16, 0x11, 0x62, 0x13, 0x11, 0x11, 0x11, 0x31, 0x11, 0x13,
+  0x13, 0x11, 0x31, 0x21, 0x11, 0x32, 0x32, 0x36, 0x32, 0x36, 0x23, 0x63, 0x23, 0x23, 0x63, 0x63,
+  0x11, 0x11, 0x13, 0x13, 0x13, 0x23, 0x23, 0x23, 0x23, 0x23, 0x36, 0x21, 0x31, 0x63, 0x6, 0x36,
+  0x26, 0x11, 0x61, 0x11, 0x11, 0x16, 0x11, 0x11, 0x63, 0x11, 0x16, 0x11, 0x16, 0x16, 0x26, 0x16,
+  0x16, 0x61, 0x36, 0x26, 0x36, 0x11, 0x51, 0x13, 0x11, 0x61, 0x11, 0x16, 0x10, 0x61, 0x31, 0x36,
+  0x32, 0x61, 0x32, 0x33, 0x10, 0x21, 0x11, 0x31, 0x61, 0x12, 0x11, 0x11, 0x11, 0x21, 0x21, 0x11,
+  0x12, 0x11, 0x12, 0x11, 0x31, 0x11, 0x12, 0x13, 0x11, 0x11, 0x13, 0x12, 0x11, 0x11, 0x21, 0x21,
+  0x11, 0x12, 0x11, 0x11, 0x33, 0x63, 0x63, 0x63, 0x23, 0x13, 0x36, 0x32, 0x36, 0x36, 0x32, 0x33,
+  0x12, 0x13, 0x11, 0x12, 0x36, 0x31, 0x33, 0x13, 0x13, 0x63, 0x23, 0x31, 0x11, 0x23, 0x23, 0x63,
+  0x63, 0x16, 0x16, 0x16, 0x16, 0x10, 0x36, 0x1, 0x11, 0x61, 0x31, 0x16, 0x11, 0x11, 0x61, 0x36,
+  0x31, 0x36, 0x63, 0x63, 0x62, 0x61, 0x13, 0x51, 0x11, 0x16, 0x16, 0x11, 0x11, 0x32, 0x61, 0x31,
+  0x11, 0x36, 0x16, 0x10, 0x13, 0x63, 0x11, 0x11, 0x13, 0x11, 0x11, 0x13, 0x11, 0x11, 0x13, 0x12,
+  0x13, 0x13, 0x11, 0x21, 0x10, 0x11, 0x11, 0x11, 0x13, 0x12, 0x11, 0x11, 0x21, 0x31, 0x13, 0x16,
+  0x12, 0x11, 0x21, 0x31, 0x12, 0x31, 0x32, 0x36, 0x36, 0x36, 0x13, 0x63, 0x63, 0x23, 0x63, 0x23,
+  0x11, 0x11, 0x12, 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x36, 0x32, 0x13, 0x36, 0x30, 0x62,
+  0x61, 0x61, 0x13, 0x11, 0x10, 0x0, 0x0, 0x0, 0x6, 0x11, 0x15, 0x61, 0x16, 0x13, 0x13, 0x61,
+  0x66, 0x26, 0x31, 0x62, 0x13, 0x16, 0x11, 0x16, 0x16, 0x11, 0x11, 0x16, 0x16, 0x16, 0x31, 0x21,
+  0x36, 0x13, 0x23, 0x16, 0x21, 0x31, 0x12, 0x11, 0x31, 0x11, 0x31, 0x11, 0x12, 0x31, 0x11, 0x13,
+  0x11, 0x11, 0x21, 0x31, 0x23, 0x12, 0x31, 0x21, 0x31, 0x11, 0x31, 0x61, 0x11, 0x11, 0x61, 0x12,
+  0x13, 0x11, 0x31, 0x11, 0x23, 0x10, 0x36, 0x33, 0x23, 0x23, 0x32, 0x31, 0x32, 0x36, 0x33, 0x63,
+  0x11, 0x61, 0x11, 0x12, 0x31, 0x31, 0x36, 0x31, 0x13, 0x63, 0x30, 0x13, 0x11, 0x23, 0x23, 0x63,
+  0x1, 0x16, 0x51, 0x10, 0x3, 0x6, 0x0, 0x0, 0x0, 0x6, 0x11, 0x16, 0x11, 0x16, 0x16, 0x26,
+  0x31, 0x36, 0x53, 0x63, 0x66, 0x11, 0x16, 0x11, 0x11, 0x26, 0x30, 0x1, 0x11, 0x36, 0x16, 0x36,
+  0x13, 0x16, 0x11, 0x31, 0x36, 0x21, 0x13, 0x11, 0x11, 0x21, 0x12, 0x16, 0x11, 0x13, 0x12, 0x11,
+  0x11, 0x11, 0x31, 0x11, 0x16, 0x11, 0x11, 0x31, 0x12, 0x11, 0x11, 0x13, 0x13, 0x21, 0x13, 0x11,
+  0x11, 0x61, 0x11, 0x21, 0x11, 0x33, 0x10, 0x36, 0x36, 0x30, 0x63, 0x3, 0x63, 0x36, 0x32, 0x36,
+  0x13, 0x11, 0x21, 0x33, 0x13, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x21, 0x12, 0x33, 0x63, 0x66,
+  0x11, 0x61, 0x11, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x11, 0x13, 0x11, 0x61, 0x36,
+  0x16, 0x61, 0x36, 0x26, 0x31, 0x16, 0x13, 0x11, 0x3, 0x0, 0x0, 0x0, 0x61, 0x16, 0x32, 0x11,
+  0x35, 0x31, 0x36, 0x12, 0x11, 0x31, 0x61, 0x11, 0x21, 0x11, 0x11, 0x31, 0x11, 0x11, 0x11, 0x11,
+  0x31, 0x21, 0x11, 0x13, 0x13, 0x11, 0x13, 0x11, 0x13, 0x13, 0x12, 0x11, 0x11, 0x11, 0x31, 0x13,
+  0x12, 0x13, 0x11, 0x31, 0x32, 0x36, 0x33, 0x23, 0x3, 0x26, 0x32, 0x36, 0x36, 0x23, 0x3, 0x63,
+  0x11, 0x11, 0x11, 0x12, 0x1, 0x36, 0x36, 0x31, 0x31, 0x30, 0x36, 0x33, 0x16, 0x10, 0x32, 0x30,
+  0x16, 0x11, 0x10, 0x0, 0x0, 0x0, 0x63, 0x61, 0x61, 0x60, 0x0, 0x16, 0x11, 0x61, 0x61, 0x61,
+  0x1, 0x36, 0x26, 0x31, 0x66, 0x16, 0x15, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x1, 0x31,
+  0x61, 0x16, 0x12, 0x36, 0x36, 0x23, 0x12, 0x11, 0x13, 0x11, 0x31, 0x11, 0x32, 0x11, 0x31, 0x31,
+  0x11, 0x13, 0x12, 0x11, 0x10, 0x13, 0x11, 0x12, 0x11, 0x11, 0x11, 0x31, 0x13, 0x11, 0x12, 0x11,
+  0x31, 0x11, 0x21, 0x11, 0x13, 0x13, 0x23, 0x63, 0x23, 0x32, 0x36, 0x23, 0x23, 0x63, 0x63, 0x23,
+  0x11, 0x21, 0x31, 0x32, 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x31, 0x12, 0x33, 0x26, 0x61,
+  0x16, 0x11, 0x0, 0x6, 0x0, 0x1, 0x11, 0x62, 0x11, 0x11, 0x30, 0x1, 0x15, 0x11, 0x63, 0x63,
+  0x16, 0x61, 0x36, 0x36, 0x31, 0x21, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x1, 0x61,
+  0x32, 0x31, 0x36, 0x31, 0x31, 0x31, 0x11, 0x31, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13, 0x11, 0x11,
+  0x21, 0x31, 0x11, 0x13, 0x12, 0x11, 0x12, 0x13, 0x11, 0x21, 0x31, 0x11, 0x21, 0x12, 0x11, 0x11,
+  0x11, 0x21, 0x13, 0x11, 0x21, 0x32, 0x30, 0x30, 0x36, 0x23, 0x36, 0x33, 0x63, 0x32, 0x32, 0x30,
+  0x11, 0x11, 0x12, 0x11, 0x32, 0x32, 0x31, 0x31, 0x33, 0x13, 0x63, 0x32, 0x11, 0x36, 0x33, 0x63,
+  0x61, 0x11, 0x0, 0x0, 0x6, 0x11, 0x0, 0x3, 0x0, 0x1, 0x11, 0x0, 0x11, 0x11, 0x21, 0x16,
+  0x62, 0x36, 0x61, 0x26, 0x26, 0x16, 0x16, 0x0, 0x61, 0x61, 0x13, 0x60, 0x0, 0x61, 0x63, 0x10,
+  0x16, 0x13, 0x21, 0x36, 0x23, 0x63, 0x11, 0x13, 0x16, 0x12, 0x13, 0x12, 0x13, 0x11, 0x12, 0x13,
+  0x11, 0x11, 0x13, 0x11, 0x13, 0x23, 0x11, 0x11, 0x13, 0x11, 0x11, 0x31, 0x11, 0x11, 0x31, 0x21,
+  0x31, 0x13, 0x11, 0x61, 0x13, 0x63, 0x63, 0x23, 0x63, 0x36, 0x30, 0x32, 0x30, 0x63, 0x3, 0x63,
+  0x13, 0x16, 0x11, 0x32, 0x31, 0x36, 0x32, 0x13, 0x21, 0x30, 0x32, 0x31, 0x13, 0x23, 0x26, 0x61,
+  0x11, 0x60, 0x0, 0x6, 0x11, 0x60, 0x3, 0x4, 0x30, 0x0, 0x11, 0x0, 0x11, 0x61, 0x16, 0x32,
+  0x31, 0x63, 0x10, 0x63, 0x11, 0x61, 0x30, 0x6, 0x30, 0x16, 0x11, 0x11, 0x0, 0x1, 0x6, 0x21,
+  0x31, 0x35, 0x36, 0x31, 0x36, 0x21, 0x16, 0x11, 0x11, 0x31, 0x11, 0x11, 0x11, 0x12, 0x11, 0x11,
+  0x13, 0x12, 0x11, 0x12, 0x16, 0x11, 0x13, 0x11, 0x21, 0x16, 0x12, 0x11, 0x31, 0x31, 0x11, 0x31,
+  0x11, 0x21, 0x12, 0x13, 0x11, 0x32, 0x36, 0x36, 0x32, 0x63, 0x23, 0x63, 0x63, 0x23, 0x63, 0x3,
+  0x11, 0x11, 0x21, 0x13, 0x13, 0x23, 0x61, 0x36, 0x33, 0x21, 0x30, 0x32, 0x16, 0x36, 0x36, 0x31,
+  0x61, 0x10, 0x6, 0x31, 0x11, 0x3, 0x1, 0x60, 0x36, 0x30, 0x1, 0x10, 0x1, 0x11, 0x61, 0x61,
+  0x63, 0x62, 0x63, 0x66, 0x31, 0x11, 0x60, 0x30, 0x0, 0x0, 0x1, 0x11, 0x10, 0x1, 0x10, 0x31,
+  0x61, 0x61, 0x31, 0x26, 0x31, 0x31, 0x31, 0x11, 0x21, 0x11, 0x12, 0x13, 0x16, 0x11, 0x36, 0x13,
+  0x11, 0x11, 0x61, 0x31, 0x13, 0x36, 0x11, 0x31, 0x13, 0x11, 0x31, 0x21, 0x11, 0x11, 0x21, 0x11,
+  0x61, 0x13, 0x11, 0x21, 0x12, 0x63, 0x23, 0x23, 0x63, 0x23, 0x63, 0x32, 0x36, 0x30, 0x32, 0x36,
+  0x12, 0x13, 0x11, 0x32, 0x32, 0x31, 0x32, 0x32, 0x31, 0x33, 0x23, 0x61, 0x13, 0x23, 0x26, 0x35,
+  0x11, 0x60, 0x0, 0x11, 0x10, 0x3, 0x61, 0x60, 0x0, 0x36, 0x6, 0x10, 0x1, 0x11, 0x61, 0x36,
+  0x35, 0x63, 0x62, 0x31, 0x61, 0x13, 0x0, 0x0, 0x36, 0x33, 0x0, 0x61, 0x16, 0x6, 0x63, 0x56,
+  0x32, 0x31, 0x63, 0x63, 0x10, 0x10, 0x11, 0x23, 0x11, 0x13, 0x11, 0x11, 0x11, 0x31, 0x11, 0x11,
+  0x12, 0x13, 0x11, 0x11, 0x16, 0x11, 0x21, 0x11, 0x31, 0x12, 0x11, 0x13, 0x12, 0x13, 0x11, 0x21,
+  0x31, 0x11, 0x13, 0x11, 0x31, 0x33, 0x63, 0x63, 0x32, 0x33, 0x32, 0x3, 0x63, 0x36, 0x36, 0x32,
+  0x13, 0x11, 0x12, 0x13, 0x16, 0x32, 0x33, 0x13, 0x23, 0x23, 0x32, 0x33, 0x11, 0x36, 0x30, 0x61,
+  0x61, 0x10, 0x36, 0x11, 0x60, 0x60, 0x0, 0x0, 0x0, 0x3, 0x30, 0x11, 0x6, 0x11, 0x16, 0x16,
+  0x53, 0x61, 0x36, 0x60, 0x16, 0x16, 0x0, 0x1, 0x60, 0x0, 0x63, 0x6, 0x11, 0x3, 0x16, 0x31,
+  0x16, 0x13, 0x13, 0x16, 0x23, 0x13, 0x11, 0x11, 0x11, 0x11, 0x11, 0x31, 0x21, 0x11, 0x13, 0x12,
+  0x11, 0x11, 0x13, 0x13, 0x12, 0x31, 0x13, 0x21, 0x11, 0x11, 0x13, 0x11, 0x11, 0x11, 0x13, 0x11,
+  0x13, 0x12, 0x11, 0x21, 0x11, 0x32, 0x32, 0x33, 0x63, 0x60, 0x63, 0x10, 0x36, 0x23, 0x23, 0x3,
+  0x11, 0x11, 0x11, 0x31, 0x33, 0x36, 0x32, 0x31, 0x31, 0x31, 0x3, 0x21, 0x12, 0x36, 0x61, 0x61,
+  0x11, 0x0, 0x61, 0x11, 0x3, 0x30, 0x0, 0x0, 0x0, 0x0, 0x60, 0x11, 0x6, 0x11, 0x32, 0x36,
+  0x31, 0x63, 0x66, 0x32, 0x11, 0x10, 0x0, 0x31, 0x60, 0x0, 0x30, 0x3, 0x11, 0x6, 0x10, 0x26,
+  0x31, 0x35, 0x21, 0x32, 0x31, 0x1, 0x21, 0x31, 0x13, 0x12, 0x11, 0x11, 0x11, 0x31, 0x21, 0x11,
+  0x31, 0x13, 0x11, 0x11, 0x13, 0x11, 0x31, 0x11, 0x31, 0x23, 0x11, 0x11, 0x31, 0x21, 0x31, 0x12,
+  0x11, 0x13, 0x11, 0x31, 0x21, 0x31, 0x33, 0x63, 0x23, 0x32, 0x30, 0x36, 0x32, 0x36, 0x36, 0x32,
+  0x11, 0x31, 0x21, 0x32, 0x12, 0x32, 0x36, 0x13, 0x23, 0x23, 0x26, 0x33, 0x63, 0x62, 0x30, 0x36,
+  0x11, 0x60, 0x36, 0x11, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x61, 0x3, 0x15, 0x11, 0x61,
+  0x63, 0x26, 0x32, 0x60, 0x16, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x11, 0x60, 0x11, 0x36,
+  0x12, 0x11, 0x63, 0x16, 0x13, 0x13, 0x11, 0x16, 0x11, 0x11, 0x31, 0x13, 0x11, 0x11, 0x31, 0x31,
+  0x16, 0x11, 0x11, 0x32, 0x11, 0x1, 0x11, 0x61, 0x11, 0x11, 0x21, 0x12, 0x13, 0x11, 0x11, 0x11,
+  0x32, 0x11, 0x21, 0x11, 0x31, 0x63, 0x23, 0x3, 0x63, 0x63, 0x36, 0x32, 0x33, 0x63, 0x3, 0x63,
+  0x11, 0x11, 0x13, 0x12, 0x33, 0x13, 0x13, 0x23, 0x13, 0x13, 0x33, 0x21, 0x30, 0x63, 0x66, 0x12,
+  0x11, 0x0, 0x11, 0x11, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x11, 0x6, 0x11, 0x66, 0x32,
+  0x36, 0x63, 0x66, 0x36, 0x11, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, 0x61, 0x63, 0x66, 0x63,
+  0x13, 0x63, 0x12, 0x13, 0x16, 0x35, 0x11, 0x11, 0x12, 0x11, 0x11, 0x21, 0x12, 0x13, 0x12, 0x36,
+  0x23, 0x11, 0x23, 0x13, 0x10, 0x31, 0x12, 0x13, 0x12, 0x16, 0x13, 0x11, 0x11, 0x13, 0x12, 0x13,
+  0x11, 0x11, 0x31, 0x16, 0x11, 0x32, 0x36, 0x32, 0x32, 0x32, 0x63, 0x3, 0x63, 0x3, 0x23, 0x23,
+  0x12, 0x16, 0x11, 0x36, 0x13, 0x23, 0x23, 0x13, 0x13, 0x23, 0x21, 0x33, 0x26, 0x30, 0x23, 0x1,
+  0x61, 0x10, 0x26, 0x11, 0x10, 0x30, 0x0, 0x0, 0x0, 0x6, 0x30, 0x11, 0x0, 0x11, 0x11, 0x16,
+  0x53, 0x62, 0x63, 0x23, 0x61, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x31, 0x10, 0x11, 0x20,
+  0x63, 0x16, 0x13, 0x61, 0x32, 0x31, 0x31, 0x13, 0x11, 0x31, 0x13, 0x11, 0x11, 0x11, 0x31, 0x31,
+  0x32, 0x63, 0x32, 0x10, 0x13, 0x21, 0x13, 0x11, 0x11, 0x31, 0x11, 0x13, 0x12, 0x11, 0x11, 0x11,
+  0x11, 0x31, 0x11, 0x31, 0x21, 0x31, 0x33, 0x63, 0x63, 0x63, 0x13, 0x13, 0x23, 0x26, 0x36, 0x30,
+  0x13, 0x11, 0x21, 0x21, 0x32, 0x31, 0x31, 0x32, 0x32, 0x13, 0x33, 0x23, 0x63, 0x62, 0x46, 0x61,
+  0x61, 0x60, 0x31, 0x11, 0x10, 0x4, 0x0, 0x0, 0x0, 0x3, 0x6, 0x11, 0x6, 0x11, 0x63, 0x63,
+  0x66, 0x36, 0x36, 0x63, 0x51, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x60, 0x61, 0x10, 0x61, 0x36,
+  0x35, 0x23, 0x16, 0x13, 0x11, 0x62, 0x11, 0x11, 0x11, 0x11, 0x61, 0x13, 0x13, 0x13, 0x23, 0x23,
+  0x13, 0x31, 0x13, 0x32, 0x31, 0x31, 0x61, 0x12, 0x13, 0x11, 0x31, 0x11, 0x11, 0x31, 0x31, 0x16,
+  0x12, 0x11, 0x21, 0x11, 0x13, 0x10, 0x23, 0x32, 0x31, 0x32, 0x36, 0x36, 0x36, 0x33, 0x63, 0x13,
+  0x11, 0x11, 0x31, 0x32, 0x13, 0x23, 0x10, 0x13, 0x13, 0x23, 0x26, 0x36, 0x6, 0x3, 0x23, 0x63,
+  0x61, 0x16, 0x6, 0x11, 0x11, 0x3, 0x33, 0x0, 0x3, 0x63, 0x1, 0x11, 0x2, 0x11, 0x11, 0x61,
+  0x35, 0x36, 0x23, 0x63, 0x61, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0x33, 0x61, 0x53, 0x1, 0x62,
+  0x36, 0x36, 0x23, 0x21, 0x1, 0x31, 0x31, 0x13, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x31, 0x32,
+  0x31, 0x32, 0x1, 0x31, 0x23, 0x23, 0x11, 0x13, 0x11, 0x21, 0x11, 0x21, 0x31, 0x11, 0x11, 0x31,
+  0x11, 0x31, 0x12, 0x13, 0x11, 0x31, 0x32, 0x36, 0x30, 0x36, 0x33, 0x23, 0x31, 0x61, 0x32, 0x36,
+  0x23, 0x23, 0x11, 0x31, 0x32, 0x36, 0x32, 0x32, 0x31, 0x31, 0x33, 0x20, 0x63, 0x66, 0x36, 0x32,
+  0x11, 0x61, 0x0, 0x11, 0x11, 0x60, 0x6, 0x36, 0x36, 0x30, 0x11, 0x16, 0x36, 0x16, 0x10, 0x10,
+  0x62, 0x63, 0x63, 0x26, 0x11, 0x30, 0x6, 0x30, 0x0, 0x0, 0x3, 0x0, 0x11, 0x60, 0x11, 0x6,
+  0x6, 0x32, 0x36, 0x13, 0x12, 0x13, 0x11, 0x11, 0x11, 0x13, 0x12, 0x16, 0x12, 0x13, 0x13, 0x63,
+  0x12, 0x31, 0x32, 0x31, 0x36, 0x31, 0x12, 0x11, 0x11, 0x13, 0x11, 0x31, 0x11, 0x21, 0x21, 0x11,
+  0x31, 0x11, 0x61, 0x11, 0x21, 0x13, 0x36, 0x32, 0x32, 0x13, 0x66, 0x36, 0x16, 0x13, 0x61, 0x36,
+  0x63, 0x63, 0x23, 0x23, 0x63, 0x10, 0x13, 0x13, 0x23, 0x23, 0x23, 0x63, 0x60, 0x36, 0x32, 0x60,
+  0x63, 0x11, 0x10, 0x6, 0x11, 0x11, 0x0, 0x3, 0x0, 0x61, 0x11, 0x15, 0x36, 0x11, 0x61, 0x1,
+  0x63, 0x61, 0x6, 0x30, 0x1, 0x10, 0x3, 0x0, 0x0, 0x3, 0x63, 0x6, 0x11, 0x10, 0x36, 0x13,
+  0x63, 0x60, 0x23, 0x61, 0x13, 0x12, 0x11, 0x21, 0x13, 0x11, 0x11, 0x11, 0x13, 0x11, 0x23, 0x12,
+  0x36, 0x31, 0x36, 0x23, 0x13, 0x23, 0x11, 0x32, 0x13, 0x11, 0x21, 0x16, 0x11, 0x31, 0x13, 0x21,
+  0x12, 0x13, 0x11, 0x31, 0x11, 0x31, 0x32, 0x33, 0x63, 0x63, 0x13, 0x13, 0x63, 0x61, 0x36, 0x16,
+  0x32, 0x30, 0x6, 0x0, 0x23, 0x3, 0x21, 0x36, 0x31, 0x36, 0x36, 0x2, 0x6, 0x6, 0x6, 0x36,
+  0x35, 0x61, 0x61, 0x0, 0x31, 0x11, 0x11, 0x66, 0x11, 0x11, 0x16, 0x10, 0x61, 0x13, 0x16, 0x10,
+  0x36, 0x10, 0x63, 0x66, 0x11, 0x60, 0x0, 0x43, 0x63, 0x63, 0x40, 0x61, 0x16, 0x0, 0x15, 0x36,
+  0x20, 0x63, 0x61, 0x11, 0x35, 0x13, 0x11, 0x13, 0x11, 0x11, 0x31, 0x31, 0x11, 0x13, 0x13, 0x23,
+  0x13, 0x12, 0x31, 0x31, 0x32, 0x31, 0x11, 0x11, 0x11, 0x11, 0x13, 0x11, 0x13, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x21, 0x21, 0x31, 0x23, 0x63, 0x63, 0x32, 0x32, 0x30, 0x30, 0x36, 0x33, 0x63, 0x63,
+  0x63, 0x2, 0x3, 0x63, 0x2, 0x36, 0x3, 0x23, 0x63, 0x23, 0x23, 0x63, 0x63, 0x23, 0x63, 0x62,
+  0x66, 0x36, 0x31, 0x16, 0x0, 0x61, 0x11, 0x11, 0x11, 0x16, 0x11, 0x36, 0x36, 0x16, 0x13, 0x61,
+  0x62, 0x6, 0x36, 0x23, 0x6, 0x16, 0x6, 0x0, 0x0, 0x30, 0x1, 0x11, 0x11, 0x36, 0x16, 0x6,
+  0x36, 0x32, 0x36, 0x32, 0x13, 0x16, 0x13, 0x11, 0x11, 0x21, 0x11, 0x11, 0x31, 0x12, 0x13, 0x13,
+  0x61, 0x36, 0x13, 0x10, 0x13, 0x63, 0x13, 0x11, 0x31, 0x13, 0x11, 0x12, 0x11, 0x13, 0x13, 0x11,
+  0x31, 0x31, 0x13, 0x11, 0x11, 0x13, 0x13, 0x23, 0x63, 0x63, 0x23, 0x12, 0x33, 0x26, 0x33, 0x23,
+  0x30, 0x63, 0x6, 0x0, 0x3, 0x0, 0x36, 0x2, 0x30, 0x36, 0x36, 0x0, 0x63, 0x66, 0x26, 0x36,
+  0x36, 0x26, 0x16, 0x31, 0x16, 0x36, 0x1, 0x61, 0x16, 0x11, 0x36, 0x21, 0x11, 0x63, 0x26, 0x10,
+  0x36, 0x31, 0x6, 0x36, 0x63, 0x11, 0x31, 0x11, 0x63, 0x61, 0x11, 0x16, 0x30, 0x61, 0x36, 0x36,
+  0x36, 0x6, 0x0, 0x6, 0x31, 0x23, 0x26, 0x11, 0x21, 0x11, 0x11, 0x21, 0x11, 0x23, 0x13, 0x16,
+  0x13, 0x12, 0x31, 0x31, 0x32, 0x31, 0x11, 0x21, 0x11, 0x31, 0x63, 0x13, 0x11, 0x21, 0x11, 0x12,
+  0x11, 0x11, 0x11, 0x12, 0x13, 0x13, 0x23, 0x36, 0x32, 0x31, 0x36, 0x33, 0x62, 0x33, 0x23, 0x63,
+  0x32, 0x0, 0x3, 0x20, 0x60, 0x60, 0x2, 0x30, 0x2, 0x32, 0x36, 0x36, 0x2, 0x3, 0x63, 0x26,
+  0x36, 0x36, 0x32, 0x66, 0x36, 0x11, 0x63, 0x61, 0x31, 0x61, 0x61, 0x36, 0x53, 0x16, 0x16, 0x1,
+  0x62, 0x63, 0x60, 0x63, 0x26, 0x36, 0x16, 0x61, 0x11, 0x11, 0x16, 0x16, 0x1, 0x23, 0x62, 0x36,
+  0x26, 0x36, 0x3, 0x0, 0x0, 0x6, 0x31, 0x31, 0x13, 0x11, 0x31, 0x13, 0x11, 0x11, 0x35, 0x31,
+  0x31, 0x11, 0x61, 0x61, 0x31, 0x63, 0x21, 0x11, 0x31, 0x12, 0x11, 0x11, 0x13, 0x12, 0x16, 0x11,
+  0x31, 0x21, 0x31, 0x13, 0x11, 0x21, 0x36, 0x32, 0x33, 0x63, 0x63, 0x23, 0x36, 0x36, 0x36, 0x33,
+  0x63, 0x32, 0x30, 0x3, 0x0, 0x3, 0x60, 0x6, 0x30, 0x3, 0x60, 0x23, 0x63, 0x66, 0x36, 0x63,
+  0x62, 0x36, 0x66, 0x36, 0x26, 0x36, 0x21, 0x63, 0x56, 0x31, 0x62, 0x61, 0x36, 0x63, 0x63, 0x10,
+  0x36, 0x36, 0x2, 0x36, 0x6, 0x26, 0x13, 0x16, 0x16, 0x16, 0x10, 0x63, 0x16, 0x36, 0x63, 0x60,
+  0x36, 0x32, 0x0, 0x20, 0x60, 0x32, 0x31, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13, 0x16, 0x11, 0x11,
+  0x11, 0x61, 0x31, 0x13, 0x16, 0x32, 0x11, 0x31, 0x61, 0x61, 0x31, 0x23, 0x11, 0x11, 0x31, 0x13,
+  0x11, 0x11, 0x11, 0x61, 0x11, 0x33, 0x13, 0x23, 0x16, 0x32, 0x31, 0x36, 0x33, 0x23, 0x32, 0x36,
+  0x36, 0x0, 0x6, 0x0, 0x2, 0x0, 0x0, 0x30, 0x23, 0x62, 0x36, 0x36, 0x6, 0x30, 0x63, 0x26,
+  0x36, 0x62, 0x31, 0x66, 0x36, 0x53, 0x63, 0x65, 0x31, 0x26, 0x31, 0x31, 0x61, 0x21, 0x61, 0x65,
+  0x36, 0x26, 0x36, 0x36, 0x33, 0x63, 0x65, 0x31, 0x36, 0x13, 0x61, 0x26, 0x36, 0x63, 0x26, 0x36,
+  0x60, 0x63, 0x60, 0x63, 0x0, 0x63, 0x62, 0x13, 0x16, 0x11, 0x61, 0x21, 0x11, 0x12, 0x61, 0x31,
+  0x61, 0x31, 0x13, 0x61, 0x11, 0x36, 0x31, 0x11, 0x11, 0x11, 0x13, 0x61, 0x16, 0x31, 0x13, 0x11,
+  0x11, 0x31, 0x21, 0x13, 0x12, 0x11, 0x31, 0x36, 0x33, 0x13, 0x23, 0x23, 0x23, 0x13, 0x63, 0x23,
+  0x13, 0x23, 0x60, 0x30, 0x3, 0x0, 0x6, 0x6, 0x36, 0x23, 0x60, 0x63, 0x23, 0x62, 0x66, 0x63,
+  0x66, 0x36, 0x60, 0x36, 0x63, 0x66, 0x35, 0x63, 0x66, 0x61, 0x66, 0x16, 0x13, 0x66, 0x36, 0x31,
+  0x66, 0x33, 0x66, 0x6, 0x26, 0x63, 0x53, 0x56, 0x21, 0x36, 0x10, 0x63, 0x56, 0x36, 0x63, 0x62,
+  0x36, 0x36, 0x3, 0x0, 0x20, 0x2, 0x36, 0x11, 0x11, 0x13, 0x11, 0x13, 0x11, 0x13, 0x13, 0x16,
+  0x31, 0x16, 0x31, 0x13, 0x23, 0x63, 0x11, 0x63, 0x13, 0x23, 0x61, 0x13, 0x31, 0x11, 0x31, 0x12,
+  0x16, 0x11, 0x31, 0x11, 0x13, 0x13, 0x23, 0x31, 0x32, 0x36, 0x33, 0x13, 0x63, 0x23, 0x23, 0x63,
+  0x36, 0x32, 0x30, 0x20, 0x60, 0x6, 0x30, 0x32, 0x3, 0x3, 0x23, 0x20, 0x66, 0x36, 0x36, 0x35,
+  0x36, 0x13, 0x61, 0x63, 0x26, 0x31, 0x61, 0x21, 0x11, 0x13, 0x11, 0x16, 0x11, 0x10, 0x61, 0x66,
+  0x31, 0x62, 0x63, 0x61, 0x63, 0x66, 0x35, 0x36, 0x36, 0x53, 0x63, 0x16, 0x36, 0x26, 0x36, 0x63,
+  0x62, 0x63, 0x26, 0x3, 0x63, 0x60, 0x63, 0x32, 0x12, 0x11, 0x11, 0x11, 0x12, 0x11, 0x11, 0x61,
+  0x21, 0x31, 0x13, 0x21, 0x31, 0x23, 0x11, 0x11, 0x61, 0x31, 0x31, 0x31, 0x12, 0x31, 0x11, 0x13,
+  0x11, 0x21, 0x13, 0x12, 0x11, 0x31, 0x31, 0x32, 0x31, 0x31, 0x36, 0x32, 0x36, 0x31, 0x32, 0x33,
+  0x13, 0x23, 0x63, 0x0, 0x0, 0x0, 0x2, 0x6, 0x36, 0x2, 0x36, 0x6, 0x32, 0x63, 0x62, 0x66,
+  0x16, 0x66, 0x23, 0x61, 0x61, 0x66, 0x13, 0x61, 0x63, 0x16, 0x11, 0x61, 0x16, 0x16, 0x0, 0x1,
+  0x66, 0x36, 0x61, 0x63, 0x66, 0x36, 0x16, 0x16, 0x35, 0x31, 0x61, 0x63, 0x53, 0x13, 0x62, 0x36,
+  0x63, 0x63, 0x63, 0x2, 0x0, 0x13, 0x23, 0x51, 0x11, 0x11, 0x12, 0x11, 0x31, 0x13, 0x13, 0x13,
+  0x16, 0x11, 0x31, 0x13, 0x13, 0x31, 0x23, 0x13, 0x13, 0x11, 0x32, 0x12, 0x31, 0x31, 0x21, 0x31,
+  0x13, 0x11, 0x11, 0x11, 0x12, 0x31, 0x32, 0x36, 0x32, 0x32, 0x32, 0x33, 0x13, 0x23, 0x63, 0x32,
+  0x13, 0x63, 0x20, 0x6, 0x32, 0x6, 0x30, 0x0, 0x0, 0x30, 0x63, 0x63, 0x63, 0x66, 0x36, 0x36,
+  0x32, 0x31, 0x61, 0x66, 0x31, 0x32, 0x61, 0x61, 0x26, 0x36, 0x16, 0x11, 0x11, 0x11, 0x10, 0x3,
+  0x66, 0x63, 0x43, 0x66, 0x0, 0x16, 0x12, 0x11, 0x61, 0x61, 0x63, 0x26, 0x16, 0x61, 0x63, 0x53,
+  0x63, 0x62, 0x6, 0x3, 0x60, 0x3, 0x60, 0x36, 0x31, 0x11, 0x31, 0x11, 0x11, 0x11, 0x16, 0x11,
+  0x31, 0x36, 0x13, 0x61, 0x61, 0x63, 0x11, 0x13, 0x21, 0x63, 0x11, 0x31, 0x12, 0x13, 0x11, 0x11,
+  0x11, 0x11, 0x21, 0x21, 0x31, 0x12, 0x31, 0x31, 0x36, 0x31, 0x36, 0x32, 0x33, 0x33, 0x36, 0x33,
+  0x32, 0x32, 0x36, 0x30, 0x0, 0x30, 0x6, 0x32, 0x31, 0x23, 0x32, 0x6, 0x36, 0x32, 0x66, 0x16,
+  0x61, 0x66, 0x36, 0x31, 0x66, 0x16, 0x16, 0x13, 0x60, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10,
+  0x63, 0x66, 0x66, 0x30, 0x31, 0x11, 0x11, 0x61, 0x13, 0x12, 0x61, 0x63, 0x63, 0x63, 0x66, 0x63,
+  0x62, 0x63, 0x63, 0x66, 0x30, 0x20, 0x0, 0x20, 0x11, 0x31, 0x11, 0x16, 0x13, 0x12, 0x31, 0x31,
+  0x61, 0x11, 0x35, 0x31, 0x32, 0x33, 0x23, 0x21, 0x31, 0x31, 0x23, 0x13, 0x13, 0x11, 0x13, 0x21,
+  0x21, 0x31, 0x13, 0x11, 0x12, 0x31, 0x36, 0x32, 0x33, 0x63, 0x3, 0x33, 0x32, 0x32, 0x33, 0x32,
+  0x13, 0x13, 0x20, 0x0, 0x36, 0x32, 0x30, 0x3, 0x23, 0x61, 0x36, 0x36, 0x32, 0x66, 0x36, 0x1,
+  0x36, 0x31, 0x62, 0x16, 0x16, 0x13, 0x16, 0x16, 0x61, 0x6, 0x16, 0x16, 0x11, 0x61, 0x11, 0x11,
+  0x16, 0x63, 0x63, 0x65, 0x16, 0x11, 0x61, 0x16, 0x11, 0x61, 0x16, 0x11, 0x61, 0x26, 0x13, 0x65,
+  0x36, 0x36, 0x2, 0x32, 0x53, 0x63, 0x60, 0x3, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13,
+  0x16, 0x31, 0x61, 0x13, 0x13, 0x16, 0x31, 0x36, 0x32, 0x31, 0x31, 0x61, 0x31, 0x23, 0x11, 0x31,
+  0x11, 0x13, 0x11, 0x13, 0x11, 0x13, 0x63, 0x3, 0x60, 0x0, 0x63, 0x23, 0x63, 0x33, 0x32, 0x33,
+  0x32, 0x36, 0x30, 0x32, 0x2, 0x36, 0x2, 0x36, 0x31, 0x32, 0x32, 0x36, 0x6, 0x36, 0x16, 0x35,
+  0x62, 0x66, 0x31, 0x63, 0x61, 0x61, 0x61, 0x61, 0x11, 0x0, 0x11, 0x11, 0x16, 0x11, 0x61, 0x61,
+  0x61, 0x10, 0x61, 0x11, 0x61, 0x11, 0x11, 0x11, 0x16, 0x11, 0x61, 0x31, 0x63, 0x61, 0x36, 0x23,
+  0x63, 0x62, 0x36, 0x36, 0x31, 0x1, 0x23, 0x60, 0x26, 0x31, 0x21, 0x31, 0x11, 0x31, 0x63, 0x11,
+  0x61, 0x13, 0x13, 0x26, 0x31, 0x30, 0x13, 0x13, 0x16, 0x13, 0x16, 0x31, 0x21, 0x31, 0x16, 0x11,
+  0x31, 0x21, 0x12, 0x31, 0x63, 0x0, 0x30, 0x60, 0x0, 0x0, 0x3, 0x32, 0x32, 0x32, 0x33, 0x3,
+  0x13, 0x23, 0x60, 0x0, 0x36, 0x30, 0x36, 0x0, 0x23, 0x13, 0x13, 0x6, 0x36, 0x36, 0x1, 0x53,
+  0x16, 0x31, 0x66, 0x16, 0x13, 0x65, 0x31, 0x11, 0x61, 0x10, 0x6, 0x16, 0x11, 0x11, 0x16, 0x11,
+  0x16, 0x13, 0x61, 0x66, 0x11, 0x16, 0x16, 0x16, 0x16, 0x13, 0x11, 0x16, 0x11, 0x36, 0x16, 0x36,
+  0x53, 0x63, 0x60, 0x23, 0x62, 0x36, 0x36, 0x0, 0x31, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13,
+  0x13, 0x61, 0x61, 0x63, 0x10, 0x13, 0x21, 0x35, 0x33, 0x21, 0x31, 0x21, 0x31, 0x13, 0x21, 0x11,
+  0x13, 0x11, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x33, 0x33, 0x33, 0x33, 0x23,
+  0x32, 0x36, 0x30, 0x0, 0x0, 0x2, 0x30, 0x36, 0x31, 0x32, 0x31, 0x32, 0x6, 0x26, 0x31, 0x6,
+  0x63, 0x16, 0x21, 0x35, 0x35, 0x16, 0x16, 0x16, 0x11, 0x10, 0x0, 0x0, 0x6, 0x63, 0x61, 0x36,
+  0x36, 0x6, 0x6, 0x11, 0x16, 0x11, 0x11, 0x36, 0x31, 0x11, 0x61, 0x61, 0x61, 0x61, 0x1, 0x63,
+  0x62, 0x63, 0x63, 0x61, 0x3, 0x60, 0x30, 0x32, 0x61, 0x11, 0x31, 0x11, 0x31, 0x11, 0x31, 0x61,
+  0x11, 0x13, 0x13, 0x31, 0x1, 0x30, 0x13, 0x12, 0x31, 0x63, 0x13, 0x13, 0x11, 0x31, 0x13, 0x23,
+  0x12, 0x10, 0x0, 0x36, 0x0, 0x60, 0x63, 0x63, 0x11, 0x0, 0x3, 0x32, 0x32, 0x32, 0x32, 0x33,
+  0x13, 0x13, 0x20, 0x0, 0x0, 0x6, 0x2, 0x3, 0x62, 0x31, 0x32, 0x36, 0x36, 0x32, 0x66, 0x13,
+  0x61, 0x61, 0x36, 0x16, 0x16, 0x61, 0x61, 0x61, 0x11, 0x11, 0x0, 0x0, 0x13, 0x6, 0x0, 0x6,
+  0x3, 0x61, 0x10, 0x6, 0x36, 0x6, 0x36, 0x6, 0x12, 0x66, 0x11, 0x11, 0x31, 0x61, 0x63, 0x53,
+  0x63, 0x62, 0x36, 0x3, 0x26, 0x32, 0x6, 0x0, 0x0, 0x1, 0x16, 0x12, 0x11, 0x31, 0x61, 0x36,
+  0x30, 0x36, 0x21, 0x6, 0x30, 0x63, 0x1, 0x31, 0x13, 0x12, 0x16, 0x11, 0x31, 0x21, 0x21, 0x15,
+  0x31, 0x13, 0x4, 0x0, 0x36, 0x31, 0x36, 0x31, 0x3, 0x14, 0x2, 0x33, 0x23, 0x33, 0x33, 0x3,
+  0x32, 0x32, 0x30, 0x0, 0x63, 0x3, 0x0, 0x32, 0x33, 0x13, 0x23, 0x13, 0x23, 0x66, 0x31, 0x5,
+  0x16, 0x26, 0x61, 0x63, 0x16, 0x13, 0x16, 0x11, 0x61, 0x11, 0x60, 0x6, 0x11, 0x11, 0x61, 0x11,
+  0x11, 0x13, 0x11, 0x13, 0x51, 0x36, 0x0, 0x11, 0x61, 0x31, 0x16, 0x61, 0x16, 0x13, 0x16, 0x16,
+  0x23, 0x63, 0x0, 0x60, 0x63, 0x6, 0x0, 0x0, 0x30, 0x3, 0x3, 0x30, 0x30, 0x23, 0x3, 0x0,
+  0x6, 0x0, 0x30, 0x3, 0x2, 0x32, 0x36, 0x13, 0x11, 0x11, 0x11, 0x12, 0x11, 0x31, 0x31, 0x23,
+  0x12, 0x36, 0x3, 0x63, 0x60, 0x3, 0x2, 0x0, 0x0, 0x63, 0x3, 0x32, 0x33, 0x23, 0x23, 0x30,
+  0x63, 0x63, 0x60, 0x3, 0x2, 0x6, 0x0, 0x0, 0x63, 0x23, 0x63, 0x23, 0x36, 0x36, 0x36, 0x63,
+  0x63, 0x13, 0x53, 0x61, 0x61, 0x61, 0x61, 0x61, 0x11, 0x11, 0x10, 0x0, 0x16, 0x16, 0x36, 0x11,
+  0x11, 0x66, 0x16, 0x16, 0x11, 0x11, 0x3, 0x61, 0x31, 0x51, 0x31, 0x16, 0x13, 0x16, 0x53, 0x63,
+  0x66, 0x36, 0x0, 0x36, 0x2, 0x0, 0x30, 0x0, 0x0, 0x60, 0x21, 0x6, 0x6, 0x0, 0x16, 0x10,
+  0x3, 0x0, 0x0, 0x6, 0x0, 0x34, 0x23, 0x21, 0x21, 0x11, 0x11, 0x11, 0x21, 0x12, 0x13, 0x11,
+  0x31, 0x13, 0x0, 0x60, 0x3, 0x60, 0x36, 0x36, 0x0, 0x63, 0x6, 0x33, 0x23, 0x33, 0x3, 0x23,
+  0x30, 0x32, 0x30, 0x6, 0x0, 0x30, 0x0, 0x60, 0x2, 0x36, 0x32, 0x36, 0x30, 0x62, 0x66, 0x16,
+  0x16, 0x61, 0x61, 0x16, 0x23, 0x16, 0x11, 0x61, 0x61, 0x11, 0x11, 0x60, 0x1, 0x13, 0x11, 0x26,
+  0x63, 0x63, 0x10, 0x63, 0x16, 0x60, 0x61, 0x16, 0x16, 0x16, 0x16, 0x13, 0x16, 0x12, 0x31, 0x62,
+  0x63, 0x60, 0x0, 0x23, 0x6, 0x13, 0x60, 0x0, 0x60, 0x3, 0x11, 0x63, 0x0, 0x36, 0x13, 0x20,
+  0x30, 0x60, 0x63, 0x63, 0x21, 0x13, 0x31, 0x11, 0x13, 0x13, 0x1, 0x31, 0x61, 0x21, 0x31, 0x23,
+  0x12, 0x30, 0x60, 0x3, 0x16, 0x0, 0x63, 0x13, 0x3, 0x2, 0x3, 0x33, 0x33, 0x23, 0x33, 0x3,
+  0x21, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x34, 0x32, 0x36, 0x33, 0x23, 0x33, 0x36, 0x32,
+  0x63, 0x10, 0x16, 0x61, 0x61, 0x61, 0x61, 0x61, 0x11, 0x61, 0x11, 0x11, 0x0, 0x2, 0x61, 0x11,
+  0x11, 0x11, 0x11, 0x21, 0x11, 0x63, 0x16, 0x13, 0x16, 0x13, 0x11, 0x61, 0x65, 0x31, 0x66, 0x36,
+  0x36, 0x0, 0x3, 0x6, 0x13, 0x62, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x3, 0x11, 0x10,
+  0x60, 0x0, 0x0, 0x13, 0x13, 0x21, 0x23, 0x10, 0x36, 0x6, 0x0, 0x3, 0x3, 0x32, 0x36, 0x32,
+  0x33, 0x0, 0x0, 0x2, 0x31, 0x33, 0x1, 0x31, 0x10, 0x36, 0x3, 0x23, 0x23, 0x32, 0x32, 0x33,
+  0x33, 0x6, 0x30, 0x0, 0x0, 0x63, 0x0, 0x3, 0x0, 0x36, 0x32, 0x36, 0x30, 0x60, 0x10, 0x61,
+  0x35, 0x61, 0x63, 0x16, 0x31, 0x62, 0x16, 0x11, 0x61, 0x11, 0x11, 0x11, 0x11, 0x63, 0x0, 0x0,
+  0x0, 0x61, 0x63, 0x61, 0x0, 0x16, 0x16, 0x35, 0x16, 0x16, 0x10, 0x13, 0x13, 0x56, 0x31, 0x6,
+  0x10, 0x0, 0x6, 0x2, 0x36, 0x36, 0x30, 0x0, 0x6, 0x0, 0x11, 0x10, 0x3, 0x6, 0x30, 0x30,
+  0x30, 0x30, 0x32, 0x32, 0x13, 0x13, 0x0, 0x0, 0x0, 0x30, 0x20, 0x60, 0x20, 0x63, 0x63, 0x13,
+  0x60, 0x63, 0x0, 0x63, 0x13, 0x60, 0x21, 0x31, 0x30, 0x13, 0x0, 0x33, 0x33, 0x23, 0x33, 0x32,
+  0x26, 0x32, 0x36, 0x0, 0x0, 0x0, 0x1, 0x6, 0x32, 0x32, 0x36, 0x33, 0x23, 0x33, 0x23, 0x60,
+  0x61, 0x1, 0x61, 0x26, 0x16, 0x13, 0x61, 0x61, 0x11, 0x61, 0x61, 0x61, 0x11, 0x11, 0x11, 0x16,
+  0x66, 0x36, 0x36, 0x63, 0x61, 0x31, 0x61, 0x11, 0x61, 0x31, 0x61, 0x61, 0x65, 0x31, 0x66, 0x36,
+  0x30, 0x0, 0x0, 0x30, 0x36, 0x21, 0x60, 0x30, 0x0, 0x60, 0x3, 0x12, 0x36, 0x3, 0x63, 0x0,
+  0x0, 0x2, 0x3, 0x63, 0x32, 0x1, 0x36, 0x3, 0x62, 0x16, 0x13, 0x63, 0x63, 0x23, 0x21, 0x1,
+  0x32, 0x0, 0x4, 0x0, 0x13, 0x10, 0x33, 0x12, 0x10, 0x36, 0x3, 0x23, 0x23, 0x33, 0x32, 0x33,
+  0x33, 0x23, 0x0, 0x3, 0x0, 0x63, 0x20, 0x3, 0x23, 0x63, 0x23, 0x2, 0x30, 0x60, 0x3, 0x63,
+  0x10, 0x66, 0x31, 0x61, 0x61, 0x66, 0x16, 0x16, 0x16, 0x11, 0x11, 0x11, 0x61, 0x15, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x31, 0x66, 0x13, 0x51, 0x36, 0x26, 0x31, 0x66, 0x32, 0x63,
+  0x0, 0x0, 0x6, 0x6, 0x6, 0x13, 0x3, 0x60, 0x63, 0x0, 0x6, 0x33, 0x30, 0x32, 0x30, 0x63,
+  0x23, 0x60, 0x6, 0x2, 0x63, 0x63, 0x20, 0x62, 0x61, 0x31, 0x2, 0x0, 0x26, 0x13, 0x13, 0x13,
+  0x23, 0x6, 0x3, 0x1, 0x61, 0x3, 0x61, 0x36, 0x36, 0x36, 0x3, 0x33, 0x32, 0x32, 0x33, 0x32,
+  0x23, 0x63, 0x60, 0x0, 0x0, 0x0, 0x36, 0x0, 0x32, 0x36, 0x32, 0x3, 0x60, 0x32, 0x0, 0x6,
+  0x36, 0x31, 0x66, 0x31, 0x63, 0x16, 0x16, 0x16, 0x11, 0x16, 0x16, 0x11, 0x11, 0x61, 0x11, 0x61,
+  0x11, 0x61, 0x61, 0x66, 0x31, 0x61, 0x16, 0x13, 0x61, 0x66, 0x13, 0x16, 0x16, 0x32, 0x63, 0x20,
+  0x0, 0x6, 0x30, 0x3, 0x23, 0x63, 0x62, 0x13, 0x60, 0x36, 0x3, 0x60, 0x32, 0x33, 0x63, 0x3,
+  0x0, 0x3, 0x63, 0x3, 0x0, 0x30, 0x36, 0x30, 0x30, 0x23, 0x61, 0x16, 0x13, 0x11, 0x16, 0x11,
+  0x66, 0x3, 0x6, 0x1, 0x33, 0x60, 0x2, 0x13, 0x10, 0x23, 0x0, 0x12, 0x33, 0x23, 0x32, 0x33,
+  0x36, 0x0, 0x0, 0x0, 0x0, 0x23, 0x60, 0x30, 0x63, 0x0, 0x3, 0x63, 0x0, 0x3, 0x3, 0x0,
+  0x2, 0x63, 0x63, 0x56, 0x16, 0x13, 0x16, 0x16, 0x16, 0x11, 0x11, 0x16, 0x11, 0x11, 0x61, 0x11,
+  0x61, 0x16, 0x13, 0x11, 0x16, 0x16, 0x13, 0x16, 0x12, 0x31, 0x62, 0x63, 0x63, 0x66, 0x30, 0x43,
+  0x6, 0x0, 0x2, 0x31, 0x36, 0x32, 0x33, 0x13, 0x23, 0x63, 0x63, 0x3, 0x63, 0x0, 0x32, 0x36,
+  0x3, 0x60, 0x0, 0x60, 0x63, 0x62, 0x36, 0x35, 0x11, 0x61, 0x11, 0x11, 0x16, 0x11, 0x61, 0x13,
+  0x13, 0x6, 0x6, 0x36, 0x36, 0x30, 0x36, 0x32, 0x0, 0x36, 0x3, 0x33, 0x32, 0x33, 0x23, 0x32,
+  0x23, 0x32, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, 0x6, 0x32, 0x0, 0x2, 0x36, 0x32, 0x6, 0x0,
+  0x3, 0x60, 0x15, 0x31, 0x36, 0x55, 0x31, 0x61, 0x61, 0x16, 0x16, 0x11, 0x61, 0x61, 0x16, 0x16,
+  0x16, 0x16, 0x15, 0x31, 0x62, 0x13, 0x61, 0x61, 0x36, 0x16, 0x31, 0x61, 0x62, 0x36, 0x3, 0x60,
+  0x0, 0x0, 0x36, 0x13, 0x23, 0x63, 0x6, 0x36, 0x6, 0x36, 0x6, 0x32, 0x33, 0x23, 0x63, 0x3,
+  0x60, 0x11, 0x11, 0x13, 0x0, 0x36, 0x2, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13, 0x21, 0x13, 0x11,
+  0x61, 0x6, 0x36, 0x0, 0x0, 0x0, 0x63, 0x43, 0x0, 0x63, 0x6, 0x32, 0x33, 0x23, 0x32, 0x33,
+  0x36, 0x20, 0x60, 0x6, 0x0, 0x63, 0x0, 0x60, 0x20, 0x0, 0x36, 0x30, 0x2, 0x6, 0x30, 0x0,
+  0x0, 0x0, 0x3, 0x66, 0x26, 0x31, 0x61, 0x21, 0x61, 0x61, 0x11, 0x11, 0x11, 0x11, 0x61, 0x16,
+  0x13, 0x11, 0x36, 0x16, 0x11, 0x61, 0x16, 0x31, 0x61, 0x62, 0x66, 0x36, 0x33, 0x60, 0x36, 0x23,
+  0x60, 0x36, 0x1, 0x30, 0x60, 0x60, 0x23, 0x6, 0x36, 0x63, 0x63, 0x63, 0x60, 0x36, 0x36, 0x6,
+  0x32, 0x11, 0x11, 0x10, 0x60, 0x62, 0x36, 0x11, 0x16, 0x11, 0x11, 0x11, 0x16, 0x11, 0x11, 0x16,
+  0x12, 0x63, 0x66, 0x36, 0x6, 0x0, 0x0, 0x0, 0x0, 0x36, 0x3, 0x23, 0x13, 0x33, 0x23, 0x32,
+  0x63, 0x36, 0x30, 0x3, 0x3, 0x0, 0x60, 0x0, 0x30, 0x0, 0x0, 0x6, 0x0, 0x0, 0x20, 0x36,
+  0x0, 0x0, 0x0, 0x3, 0x63, 0x62, 0x63, 0x61, 0x31, 0x61, 0x61, 0x61, 0x61, 0x61, 0x16, 0x16,
+  0x11, 0x66, 0x11, 0x61, 0x36, 0x13, 0x61, 0x26, 0x13, 0x63, 0x13, 0x60, 0x20, 0x36, 0x26, 0x36,
+  0x6, 0x3, 0x2, 0x6, 0x32, 0x36, 0x36, 0x63, 0x63, 0x63, 0x53, 0x63, 0x13, 0x63, 0x63, 0x30,
+  0x36, 0x11, 0x11, 0x13, 0x20, 0x31, 0x3, 0x16, 0x11, 0x11, 0x11, 0x11, 0x11, 0x61, 0x16, 0x11,
+  0x11, 0x16, 0x1, 0x6, 0x36, 0x36, 0x6, 0x30, 0x40, 0x1, 0x0, 0x33, 0x32, 0x0, 0x32, 0x33,
+  0x32, 0x3, 0x20, 0x63, 0x26, 0x32, 0x30, 0x36, 0x0, 0x63, 0x2, 0x30, 0x3, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x63, 0x63, 0x61, 0x63, 0x56, 0x31, 0x61, 0x61, 0x16, 0x16, 0x31, 0x31,
+  0x36, 0x13, 0x10, 0x16, 0x16, 0x35, 0x13, 0x63, 0x66, 0x13, 0x60, 0x23, 0x6, 0x0, 0x36, 0x32,
+  0x3, 0x6, 0x6, 0x36, 0x36, 0x36, 0x62, 0x35, 0x6, 0x66, 0x63, 0x63, 0x63, 0x63, 0x23, 0x63,
+  0x61, 0x11, 0x11, 0x16, 0x36, 0x6, 0x1, 0x61, 0x11, 0x61, 0x11, 0x11, 0x16, 0x11, 0x11, 0x16,
+  0x13, 0x66, 0x16, 0x36, 0x31, 0x0, 0x3, 0x63, 0x63, 0x1, 0x3, 0x12, 0x30, 0x0, 0x33, 0x23,
+  0x3, 0x60, 0x3, 0x6, 0x32, 0x36, 0x6, 0x32, 0x3, 0x26, 0x0, 0x0, 0x60, 0x0, 0x30, 0x0,
+  0x0, 0x0, 0x6, 0x0, 0x2, 0x36, 0x3, 0x66, 0x36, 0x50, 0x10, 0x13, 0x61, 0x36, 0x16, 0x16,
+  0x53, 0x26, 0x61, 0x32, 0x36, 0x16, 0x36, 0x66, 0x23, 0x60, 0x10, 0x36, 0x3, 0x65, 0x30, 0x63,
+  0x6, 0x32, 0x30, 0x16, 0x16, 0x61, 0x36, 0x61, 0x63, 0x63, 0x66, 0x13, 0x61, 0x31, 0x63, 0x26,
+  0x36, 0x11, 0x11, 0x11, 0x0, 0x31, 0x60, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x26, 0x36, 0x60, 0x16, 0x36, 0x6, 0x32, 0x36, 0x36, 0x0, 0x33, 0x3, 0x60, 0x0, 0x33,
+  0x0, 0x30, 0x60, 0x3, 0x0, 0x63, 0x23, 0x3, 0x6, 0x13, 0x3, 0x60, 0x30, 0x60, 0x60, 0x36,
+  0x36, 0x30, 0x63, 0x0, 0x30, 0x60, 0x32, 0x3, 0x63, 0x23, 0x63, 0x66, 0x23, 0x51, 0x6, 0x31,
+  0x61, 0x61, 0x36, 0x66, 0x16, 0x32, 0x63, 0x23, 0x36, 0x32, 0x30, 0x63, 0x26, 0x36, 0x6, 0x30,
+  0x60, 0x6, 0x35, 0x16, 0x31, 0x61, 0x61, 0x61, 0x35, 0x61, 0x66, 0x35, 0x13, 0x66, 0x31, 0x63,
+  0x16, 0x11, 0x11, 0x16, 0x6, 0x2, 0x36, 0x11, 0x61, 0x11, 0x11, 0x11, 0x16, 0x21, 0x61, 0x16,
+  0x11, 0x61, 0x66, 0x36, 0x13, 0x10, 0x31, 0x21, 0x32, 0x36, 0x30, 0x23, 0x0, 0x3, 0x63, 0x26,
+  0x6, 0x0, 0x30, 0x0, 0x60, 0x30, 0x0, 0x63, 0x23, 0x1, 0x2, 0x0, 0x0, 0x3, 0x6, 0x0,
+  0x2, 0x63, 0x0, 0x0, 0x60, 0x6, 0x4, 0x2, 0x6, 0x36, 0x6, 0x3, 0x60, 0x6, 0x31, 0x6,
+  0x3, 0x63, 0x60, 0x36, 0x32, 0x63, 0x6, 0x36, 0x23, 0x63, 0x53, 0x66, 0x36, 0x36, 0x30, 0x63,
+  0x6, 0x30, 0x6, 0x11, 0x61, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x61, 0x61, 0x66, 0x16,
+  0x31, 0x11, 0x11, 0x16, 0x30, 0x34, 0x23, 0x63, 0x12, 0x16, 0x11, 0x61, 0x61, 0x31, 0x61, 0x21,
+  0x61, 0x36, 0x36, 0x63, 0x1, 0x36, 0x3, 0x13, 0x11, 0x3, 0x60, 0x31, 0x60, 0x0, 0x3, 0x33,
+  0x0, 0x2, 0x0, 0x60, 0x3, 0x60, 0x30, 0x36, 0x30, 0x63, 0x3, 0x0, 0x30, 0x20, 0x3, 0x0,
+  0x36, 0x30, 0x60, 0x63, 0x23, 0x63, 0x2, 0x36, 0x30, 0x6, 0x30, 0x23, 0x0, 0x30, 0x0, 0x0,
+  0x0, 0x0, 0x3, 0x60, 0x6, 0x36, 0x32, 0x30, 0x36, 0x36, 0x61, 0x63, 0x16, 0x23, 0x60, 0x20,
+  0x63, 0x6, 0x31, 0x11, 0x11, 0x61, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x36,
+  0x66, 0x11, 0x11, 0x16, 0x0, 0x60, 0x36, 0x21, 0x61, 0x11, 0x16, 0x11, 0x11, 0x61, 0x12, 0x13,
+  0x12, 0x66, 0x66, 0x36, 0x61, 0x36, 0x6, 0x31, 0x13, 0x1, 0x0, 0x32, 0x30, 0x3, 0x6, 0x23,
+  0x32, 0x3, 0x60, 0x3, 0x20, 0x30, 0x60, 0x23, 0x62, 0x31, 0x66, 0x36, 0x4, 0x36, 0x6, 0x6,
+  0x0, 0x63, 0x63, 0x61, 0x0, 0x30, 0x63, 0x60, 0x6, 0x30, 0x63, 0x60, 0x0, 0x60, 0x0, 0x0,
+  0x0, 0x3, 0x60, 0x6, 0x30, 0x23, 0x63, 0x66, 0x30, 0x23, 0x61, 0x26, 0x11, 0x42, 0x63, 0x32,
+  0x36, 0x32, 0x60, 0x11, 0x61, 0x11, 0x31, 0x61, 0x66, 0x16, 0x16, 0x16, 0x31, 0x63, 0x16, 0x13,
+  0x16, 0x11, 0x11, 0x13, 0x60, 0x1, 0x66, 0x31, 0x16, 0x11, 0x11, 0x11, 0x11, 0x16, 0x11, 0x11,
+  0x11, 0x60, 0x36, 0x63, 0x23, 0x60, 0x3, 0x26, 0x31, 0x3, 0x60, 0x3, 0x0, 0x0, 0x0, 0x3,
+  0x6, 0x36, 0x30, 0x63, 0x63, 0x60, 0x36, 0x36, 0x3, 0x10, 0x30, 0x60, 0x63, 0x60, 0x63, 0x66,
+  0x61, 0x66, 0x16, 0x10, 0x6, 0x6, 0x30, 0x3, 0x63, 0x20, 0x32, 0x0, 0x6, 0x30, 0x0, 0x0,
+  0x0, 0x6, 0x3, 0x3, 0x0, 0x61, 0x26, 0x32, 0x61, 0x36, 0x13, 0x63, 0x30, 0x36, 0x36, 0x3,
+  0x60, 0x36, 0x31, 0x16, 0x16, 0x66, 0x66, 0x36, 0x63, 0x66, 0x63, 0x66, 0x16, 0x31, 0x63, 0x61,
+  0x63, 0x11, 0x11, 0x16, 0x30, 0x36, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x11, 0x16, 0x16,
+  0x13, 0x63, 0x60, 0x36, 0x36, 0x36, 0x36, 0x33, 0x63, 0x6, 0x30, 0x60, 0x0, 0x6, 0x30, 0x6,
+  0x36, 0x30, 0x6, 0x36, 0x6, 0x36, 0x63, 0x63, 0x66, 0x66, 0x61, 0x61, 0x66, 0x61, 0x65, 0x31,
+  0x66, 0x15, 0x61, 0x60, 0x36, 0x36, 0x23, 0x62, 0x0, 0x6, 0x36, 0x0, 0x0, 0x6, 0x0, 0x0,
+  0x0, 0x3, 0x0, 0x60, 0x60, 0x36, 0x11, 0x11, 0x16, 0x13, 0x26, 0x36, 0x65, 0x36, 0x32, 0x36,
+  0x32, 0x32, 0x6, 0x11, 0x61, 0x32, 0x36, 0x63, 0x66, 0x13, 0x66, 0x13, 0x61, 0x63, 0x61, 0x63,
+  0x66, 0x11, 0x11, 0x16, 0x60, 0x2, 0x60, 0x6, 0x63, 0x66, 0x11, 0x66, 0x11, 0x16, 0x13, 0x13,
+  0x61, 0x26, 0x6, 0x60, 0x1, 0x36, 0x0, 0x66, 0x36, 0x3, 0x60, 0x36, 0x0, 0x30, 0x63, 0x3,
+  0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x16, 0x31, 0x66, 0x16, 0x61, 0x66, 0x66, 0x66,
+  0x61, 0x66, 0x66, 0x30, 0x63, 0x2, 0x34, 0x3, 0x63, 0x63, 0x60, 0x3, 0x0, 0x60, 0x0, 0x0,
+  0x0, 0x60, 0x2, 0x30, 0x23, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x13, 0x12, 0x63, 0x63,
+  0x60, 0x63, 0x63, 0x56, 0x36, 0x63, 0x63, 0x26, 0x36, 0x36, 0x13, 0x66, 0x13, 0x61, 0x36, 0x36,
+  0x31, 0x66, 0x61, 0x63, 0x0, 0x63, 0x3, 0x63, 0x26, 0x63, 0x66, 0x31, 0x60, 0x63, 0x66, 0x66,
+  0x3, 0x43, 0x0, 0x36, 0x6, 0x30, 0x0, 0x33, 0x0, 0x6, 0x30, 0x3, 0x6, 0x0, 0x30, 0x63,
+  0x66, 0x66, 0x16, 0x66, 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x16, 0x66, 0x16, 0x16, 0x61, 0x61,
+  0x66, 0x66, 0x36, 0x66, 0x51, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, 0x60, 0x3, 0x60, 0x0,
+  0x3, 0x0, 0x30, 0x6, 0x36, 0x30, 0x61, 0x66, 0x16, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12,
+  0x16, 0x16, 0x36, 0x3, 0x63, 0x6, 0x36, 0x36, 0x3, 0x60, 0x0, 0x63, 0x6, 0x36, 0x36, 0x32,
+  0x63, 0x63, 0x63, 0x62, 0x63, 0x0, 0x42, 0x6, 0x36, 0x36, 0x26, 0x60, 0x61, 0x66, 0x63, 0x63,
+  0x60, 0x6, 0x6, 0x4, 0x30, 0x6, 0x6, 0x6, 0x36, 0x3, 0x60, 0x60, 0x3, 0x0, 0x63, 0x0,
+  0x66, 0x36, 0x66, 0x36, 0x66, 0x66, 0x31, 0x66, 0x66, 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+  0x63, 0x63, 0x61, 0x11, 0x56, 0x3, 0x63, 0x63, 0x60, 0x6, 0x3, 0x20, 0x63, 0x0, 0x0, 0x60,
+  0x0, 0x6, 0x6, 0x36, 0x0, 0x66, 0x36, 0x11, 0x36, 0x66, 0x61, 0x61, 0x15, 0x16, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x26, 0x13, 0x20, 0x30, 0x36, 0x3, 0x60, 0x36, 0x32, 0x6, 0x32, 0x6,
+  0x36, 0x60, 0x60, 0x63, 0x0, 0x6, 0x30, 0x30, 0x0, 0x60, 0x36, 0x36, 0x63, 0x66, 0x36, 0x60,
+  0x60, 0x0, 0x0, 0x36, 0x36, 0x36, 0x36, 0x31, 0x1, 0x36, 0x3, 0x0, 0x0, 0x60, 0x0, 0x23,
+  0x61, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x63,
+  0x60, 0x0, 0x16, 0x50, 0x63, 0x2, 0x0, 0x23, 0x63, 0x20, 0x36, 0x32, 0x36, 0x36, 0x0, 0x0,
+  0x6, 0x0, 0x0, 0x0, 0x30, 0x32, 0x60, 0x1, 0x11, 0x11, 0x36, 0x36, 0x11, 0x11, 0x11, 0x66,
+  0x61, 0x61, 0x11, 0x11, 0x11, 0x16, 0x16, 0x66, 0x26, 0x6, 0x36, 0x60, 0x6, 0x30, 0x60, 0x30,
+  0x3, 0x60, 0x63, 0x66, 0x60, 0x0, 0x0, 0x60, 0x60, 0x3, 0x62, 0x63, 0x66, 0x36, 0x60, 0x60,
+  0x30, 0x60, 0x6, 0x3, 0x63, 0x11, 0x31, 0x21, 0x31, 0x31, 0x6, 0x0, 0x0, 0x3, 0x63, 0x0,
+  0x66, 0x61, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, 0x31, 0x31, 0x31, 0x36,
+  0x30, 0x36, 0x26, 0x3, 0x0, 0x63, 0x63, 0x60, 0x2, 0x36, 0x36, 0x6, 0x36, 0x30, 0x0, 0x0,
+  0x0, 0x30, 0x6, 0x35, 0x62, 0x3, 0x3, 0x6, 0x11, 0x11, 0x11, 0x11, 0x16, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x61, 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x10, 0x23, 0x32, 0x63, 0x62, 0x36, 0x36,
+  0x6, 0x3, 0x60, 0x0, 0x3, 0x6, 0x36, 0x30, 0x63, 0x66, 0x3, 0x60, 0x60, 0x60, 0x60, 0x63,
+  0x60, 0x0, 0x0, 0x6, 0x6, 0x30, 0x36, 0x33, 0x6, 0x30, 0x0, 0x6, 0x30, 0x60, 0x0, 0x60,
+  0x66, 0x66, 0x66, 0x66, 0x66, 0x61, 0x66, 0x36, 0x16, 0x66, 0x13, 0x13, 0x66, 0x36, 0x36, 0x30,
+  0x60, 0x63, 0x3, 0x6, 0x36, 0x3, 0x20, 0x63, 0x63, 0x60, 0x23, 0x63, 0x23, 0x60, 0x0, 0x0,
+  0x0, 0x60, 0x36, 0x16, 0x61, 0x66, 0x2, 0x30, 0x1, 0x11, 0x11, 0x11, 0x11, 0x61, 0x61, 0x61,
+  0x11, 0x11, 0x11, 0x51, 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x15, 0x13, 0x13, 0x63, 0x60, 0x63,
+  0x63, 0x60, 0x3, 0x60, 0x60, 0x30, 0x60, 0x2, 0x6, 0x23, 0x66, 0x6, 0x36, 0x6, 0x36, 0x0,
+  0x0, 0x6, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x60, 0x3, 0x0, 0x63, 0x0, 0x0, 0x30,
+  0x66, 0x66, 0x63, 0x66, 0x66, 0x36, 0x61, 0x61, 0x36, 0x31, 0x36, 0x36, 0x13, 0x61, 0x36, 0x0,
+  0x30, 0x36, 0x6, 0x2, 0x3, 0x24, 0x3, 0x60, 0x36, 0x33, 0x63, 0x6, 0x36, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x61, 0x0, 0x10, 0x16, 0x63, 0x0, 0x61, 0x16, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16,
+  0x16, 0x16, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x26,
+  0x36, 0x32, 0x36, 0x3, 0x60, 0x62, 0x36, 0x31, 0x61, 0x36, 0x21, 0x35, 0x26, 0x32, 0x6, 0x36,
+  0x6, 0x30, 0x36, 0x30, 0x60, 0x6, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x32, 0x63, 0x60, 0x26,
+  0x63, 0x66, 0x66, 0x66, 0x36, 0x66, 0x36, 0x36, 0x36, 0x36, 0x31, 0x63, 0x36, 0x31, 0x3, 0x63,
+  0x26, 0x3, 0x3, 0x63, 0x6, 0x3, 0x60, 0x36, 0x0, 0x60, 0x6, 0x30, 0x6, 0x30, 0x60, 0x0,
+  0x3, 0x0, 0x1, 0x66, 0x66, 0x1, 0x60, 0x60, 0x1, 0x11, 0x61, 0x66, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x61, 0x66, 0x16, 0x16, 0x11, 0x11, 0x11, 0x15, 0x16, 0x16, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x63, 0x66, 0x32, 0x36, 0x32, 0x66, 0x30, 0x13, 0x60, 0x16, 0x36, 0x36, 0x30, 0x23,
+  0x63, 0x6, 0x0, 0x63, 0x0, 0x3, 0x6, 0x0, 0x3, 0x0, 0x60, 0x60, 0x63, 0x0, 0x36, 0x30,
+  0x66, 0x63, 0x63, 0x13, 0x61, 0x33, 0x13, 0x63, 0x61, 0x36, 0x36, 0x36, 0x61, 0x36, 0x6, 0x6,
+  0x30, 0x6, 0x20, 0x6, 0x3, 0x6, 0x26, 0x61, 0x26, 0x16, 0x63, 0x26, 0x32, 0x0, 0x0, 0x0,
+  0x0, 0x60, 0x66, 0x6, 0x32, 0x66, 0x3, 0x3, 0x0, 0x11, 0x11, 0x11, 0x66, 0x61, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x66, 0x16, 0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x61, 0x61,
+  0x11, 0x11, 0x11, 0x11, 0x16, 0x61, 0x63, 0x63, 0x66, 0x36, 0x31, 0x30, 0x10, 0x10, 0x16, 0x36,
+  0x32, 0x63, 0x23, 0x60, 0x63, 0x60, 0x3, 0x6, 0x36, 0x6, 0x30, 0x30, 0x0, 0x60, 0x0, 0x36,
+  0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x66, 0x36, 0x36, 0x32, 0x60, 0x13, 0x63, 0x60, 0x30, 0x36,
+  0x6, 0x30, 0x36, 0x3, 0x66, 0x61, 0x61, 0x66, 0x16, 0x61, 0x56, 0x30, 0x36, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x16, 0x32, 0x66, 0x1, 0x0, 0x6, 0x0, 0x11, 0x11, 0x11, 0x11, 0x13, 0x60, 0x16,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x61, 0x66, 0x66, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16,
+  0x66, 0x66, 0x15, 0x11, 0x11, 0x11, 0x11, 0x12, 0x11, 0x62, 0x60, 0x66, 0x32, 0x36, 0x33, 0x63,
+  0x63, 0x13, 0x63, 0x23, 0x62, 0x31, 0x36, 0x23, 0x63, 0x23, 0x60, 0x63, 0x23, 0x3, 0x60, 0x20,
+  0x63, 0x16, 0x36, 0x36, 0x23, 0x61, 0x3, 0x13, 0x63, 0x63, 0x63, 0x63, 0x26, 0x30, 0x20, 0x63,
+  0x2, 0x36, 0x6, 0x36, 0x51, 0x66, 0x16, 0x56, 0x61, 0x66, 0x30, 0x6, 0x3, 0x0, 0x60, 0x0,
+  0x0, 0x0, 0x62, 0x66, 0x36, 0x62, 0x6, 0x3, 0x0, 0x61, 0x11, 0x11, 0x11, 0x11, 0x16, 0x63,
+  0x66, 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x31, 0x66, 0x61, 0x61, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x61, 0x66, 0x66, 0x16, 0x16, 0x11, 0x11, 0x11, 0x11, 0x13, 0x66, 0x36, 0x26, 0x23,
+  0x62, 0x36, 0x31, 0x31, 0x31, 0x6, 0x23, 0x13, 0x23, 0x63, 0x23, 0x63, 0x60, 0x26, 0x32, 0x36,
+  0x36, 0x1, 0x36, 0x13, 0x66, 0x30, 0x10, 0x63, 0x26, 0x36, 0x36, 0x36, 0x30, 0x3, 0x63, 0x63,
+  0x60, 0x63, 0x20, 0x0, 0x16, 0x16, 0x66, 0x36, 0x0, 0x30, 0x63, 0x63, 0x26, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x36, 0x36, 0x26, 0x36, 0x3, 0x0, 0x6, 0x31, 0x11, 0x11, 0x11, 0x11, 0x11, 0x15,
+  0x32, 0x30, 0x63, 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x63, 0x66, 0x36, 0x16, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x66, 0x16, 0x66, 0x16, 0x16, 0x11, 0x11, 0x11, 0x11, 0x31, 0x61,
+  0x36, 0x11, 0x61, 0x62, 0x63, 0x13, 0x13, 0x63, 0x61, 0x36, 0x31, 0x32, 0x31, 0x33, 0x63, 0x63,
+  0x63, 0x63, 0x62, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x31, 0x6, 0x36, 0x6, 0x30, 0x6,
+  0x3, 0x60, 0x6, 0x36, 0x20, 0x0, 0x30, 0x3, 0x2, 0x6, 0x30, 0x3, 0x63, 0x0, 0x0, 0x0,
+  0x0, 0x3, 0x0, 0x16, 0x36, 0x0, 0x0, 0x60, 0x30, 0x21, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+  0x16, 0x61, 0x66, 0x63, 0x66, 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x63, 0x63, 0x66,
+  0x61, 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x36, 0x63, 0x66, 0x16, 0x15, 0x11, 0x11,
+  0x51, 0x11, 0x13, 0x11, 0x31, 0x23, 0x10, 0x13, 0x23, 0x13, 0x10, 0x13, 0x63, 0x61, 0x32, 0x31,
+  0x63, 0x13, 0x63, 0x63, 0x63, 0x26, 0x36, 0x36, 0x36, 0x1, 0x6, 0x30, 0x23, 0x3, 0x6, 0x23,
+  0x60, 0x30, 0x36, 0x0, 0x36, 0x30, 0x23, 0x26, 0x36, 0x30, 0x23, 0x60, 0x6, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x60, 0x6, 0x60, 0x3, 0x63, 0x6, 0x6, 0x6, 0x61, 0x61, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x16, 0x13, 0x66, 0x32, 0x36, 0x36, 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x31,
+  0x3, 0x60, 0x60, 0x61, 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x36, 0x63, 0x66, 0x61,
+  0x16, 0x16, 0x11, 0x61, 0x11, 0x11, 0x11, 0x11, 0x61, 0x62, 0x13, 0x63, 0x13, 0x23, 0x16, 0x36,
+  0x63, 0x60, 0x63, 0x63, 0x63, 0x63, 0x62, 0x36, 0x32, 0x36, 0x36, 0x6, 0x30, 0x62, 0x3, 0x0,
+  0x63, 0x20, 0x60, 0x36, 0x3, 0x60, 0x60, 0x3, 0x60, 0x6, 0x36, 0x3, 0x23, 0x6, 0x63, 0x66,
+  0x6, 0x6, 0x30, 0x3, 0x0, 0x36, 0x26, 0x3, 0x1, 0x1, 0x61, 0x61, 0x61, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x63, 0x66, 0x63, 0x62, 0x36, 0x66, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x16,
+  0x61, 0x63, 0x13, 0x63, 0x63, 0x66, 0x16, 0x11, 0x11, 0x11, 0x11, 0x11, 0x51, 0x61, 0x63, 0x63,
+  0x61, 0x61, 0x61, 0x16, 0x61, 0x66, 0x16, 0x31, 0x13, 0x13, 0x16, 0x12, 0x61, 0x36, 0x23, 0x13,
+  0x32, 0x36, 0x32, 0x63, 0x26, 0x31, 0x36, 0x23, 0x63, 0x63, 0x6, 0x15, 0x60, 0x36, 0x6, 0x63,
+  0x6, 0x0, 0x2, 0x3, 0x2, 0x3, 0x63, 0x60, 0x6, 0x36, 0x0, 0x63, 0x60, 0x63, 0x65, 0x2,
+  0x61, 0x60, 0x63, 0x60, 0x6, 0x0, 0x2, 0x60, 0x6, 0x1, 0x66, 0x16, 0x16, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x13, 0x66, 0x36, 0x63, 0x63, 0x6, 0x61, 0x11, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x16, 0x61, 0x66, 0x26, 0x36, 0x36, 0x36, 0x66, 0x16, 0x11, 0x11, 0x11, 0x11, 0x11, 0x61,
+  0x66, 0x36, 0x30, 0x61, 0x36, 0x11, 0x61, 0x16, 0x16, 0x11, 0x61, 0x61, 0x36, 0x13, 0x11, 0x36,
+  0x63, 0x63, 0x10, 0x36, 0x63, 0x10, 0x63, 0x36, 0x36, 0x32, 0x63, 0x50, 0x30, 0x63, 0x3, 0x2,
+  0x3, 0x0, 0x0, 0x6, 0x6, 0x36, 0x0, 0x63, 0x63, 0x2, 0x36, 0x30, 0x6, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x30, 0x35, 0x30, 0x63, 0x61, 0x6, 0x11, 0x66, 0x16, 0x16, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x15, 0x11, 0x63, 0x66, 0x32, 0x63, 0x20, 0x61, 0x61, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x12, 0x13, 0x16, 0x16, 0x26, 0x36, 0x36, 0x35, 0x66, 0x16, 0x11, 0x11, 0x11, 0x11,
+  0x11, 0x11, 0x61, 0x63, 0x66, 0x36, 0x36, 0x61, 0x61, 0x61, 0x61, 0x31, 0x61, 0x61, 0x63, 0x51,
+  0x26, 0x36, 0x36, 0x13, 0x16, 0x36, 0x36, 0x60, 0x23, 0x63, 0x1, 0x60, 0x63, 0x2, 0x66, 0x3,
+  0x60, 0x6, 0x3, 0x0, 0x30, 0x0, 0x63, 0x2, 0x6, 0x36, 0x0, 0x63, 0x23, 0x6, 0x0, 0x0,
+  0x0, 0x6, 0x30, 0x36, 0x6, 0x0, 0x63, 0x62, 0x6, 0x10, 0x16, 0x11, 0x66, 0x16, 0x16, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x36, 0x63, 0x66, 0x36, 0x0, 0x36, 0x16, 0x11, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x16, 0x16, 0x31, 0x61, 0x61, 0x1, 0x36, 0x1, 0x66, 0x16, 0x15, 0x11,
+  0x11, 0x11, 0x11, 0x11, 0x11, 0x66, 0x16, 0x36, 0x36, 0x36, 0x31, 0x61, 0x61, 0x36, 0x11, 0x36,
+};
+
+#endif

+ 629 - 0
src/epd3c/GxEPD2_565c.cpp

@@ -0,0 +1,629 @@
+// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
+// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines!
+//
+// based on Demo Example from Good Display: http://www.e-paper-display.com/download_detail/downloadsId=808.html
+// Panel: 5.65inch ACeP 7-Color E-Paper : https://www.waveshare.com/product/displays/e-paper/5.65inch-e-paper-module-f.htm
+// Controller: unknonw
+// initcode extracted from Waveshare library file epd5in65f.cpp available here: https://www.waveshare.com/wiki/5.65inch_e-Paper_Module_(F)
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#include "GxEPD2_565c.h"
+
+GxEPD2_565c::GxEPD2_565c(int8_t cs, int8_t dc, int8_t rst, int8_t busy) :
+  GxEPD2_EPD(cs, dc, rst, busy, LOW, 25000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate)
+{
+  _paged = false;
+}
+
+void GxEPD2_565c::clearScreen(uint8_t value)
+{
+  clearScreen(value, 0xFF);
+}
+
+void GxEPD2_565c::clearScreen(uint8_t black_value, uint8_t color_value)
+{
+  writeScreenBuffer(black_value, color_value);
+  _Update_Full();
+}
+
+void GxEPD2_565c::writeScreenBuffer(uint8_t value)
+{
+  writeScreenBuffer(value, 0xFF);
+}
+
+void GxEPD2_565c::writeScreenBuffer(uint8_t black_value, uint8_t color_value)
+{
+  _initial_write = false; // initial full screen buffer clean done
+  _Init_Full();
+  _writeCommand(0x10);
+  _startTransfer();
+  for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 2; i++)
+  {
+    _transfer(0x11);
+  }
+  _endTransfer();
+}
+
+void GxEPD2_565c::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  //Serial.print("writeImage("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", ");
+  //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")");
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+  if (_paged && (x == 0) && (w == WIDTH) && (h < HEIGHT))
+  {
+    //Serial.println("paged");
+    for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(h) / 8; i++)
+    {
+      uint8_t data = bitmap[i];
+      for (int16_t k = 0; k < 4; k++)
+      {
+        uint8_t data2 = (data & 0x80 ? 0x10 : 0x00) | (data & 0x40 ? 0x01 : 0x00);
+        data <<= 2;
+        _transfer(data2);
+      }
+    }
+    if (y + h == HEIGHT) // last page
+    {
+      _endTransfer();
+      //Serial.println("paged ended");
+      _paged = false;
+    }
+  }
+  else
+  {
+    _paged = false;
+    int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded
+    x -= x % 8; // byte boundary
+    w = wb * 8; // byte boundary
+    if ((w <= 0) || (h <= 0)) return;
+    _Init_Full();
+    _writeCommand(0x10);
+    _startTransfer();
+    for (int16_t i = 0; i < HEIGHT; i++)
+    {
+      for (int16_t j = 0; j < WIDTH; j += 8)
+      {
+        uint8_t data = 0xFF;
+        if ((j >= x) && (j <= x + w) && (i >= y) && (i < y + h))
+        {
+          uint32_t idx = mirror_y ? (j - x) / 8 + uint32_t((h - 1 - (i - y))) * wb : (j - x) / 8 + uint32_t(i - y) * wb;
+          if (pgm)
+          {
+#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
+            data = pgm_read_byte(&bitmap[idx]);
+#else
+            data = bitmap[idx];
+#endif
+          }
+          else
+          {
+            data = bitmap[idx];
+          }
+          if (invert) data = ~data;
+        }
+        for (int16_t k = 0; k < 4; k++)
+        {
+          uint8_t data2 = (data & 0x80 ? 0x10 : 0x00) | (data & 0x40 ? 0x01 : 0x00);
+          data <<= 2;
+          _transfer(data2);
+        }
+      }
+    }
+    _endTransfer();
+  }
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+}
+
+void GxEPD2_565c::writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  if (!black && !color) return;
+  if (!color) return writeImage(black, x, y, w, h, invert, mirror_y, pgm);
+  //Serial.print("writeImage("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", ");
+  //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")");
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+  if (_paged && (x == 0) && (w == WIDTH) && (h < HEIGHT))
+  {
+    //Serial.println("paged");
+    for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(h) / 8; i++)
+    {
+      uint8_t black_data = black[i];
+      uint8_t color_data = color[i];
+      for (int16_t k = 0; k < 4; k++)
+      {
+        uint8_t out_data = 0x00;
+        for (int16_t l = 0; l < 2; l++)
+        {
+          out_data <<= 4;
+          if (!(color_data & 0x80)) out_data |= 0x04;
+          else out_data |= black_data & 0x80 ? 0x01 : 0x00;
+          black_data <<= 1;
+          color_data <<= 1;
+        }
+        _transfer(out_data);
+      }
+    }
+    if (y + h == HEIGHT) // last page
+    {
+      _endTransfer();
+      //Serial.println("paged ended");
+      _paged = false;
+    }
+  }
+  else
+  {
+    _paged = false;
+    int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded
+    x -= x % 8; // byte boundary
+    w = wb * 8; // byte boundary
+    if ((w <= 0) || (h <= 0)) return;
+    _Init_Full();
+    _writeCommand(0x10);
+    _startTransfer();
+    for (int16_t i = 0; i < HEIGHT; i++)
+    {
+      for (int16_t j = 0; j < WIDTH; j += 8)
+      {
+        uint8_t black_data = 0xFF, color_data = 0xFF;
+        if ((j >= x) && (j < x + w) && (i >= y) && (i < y + h))
+        {
+          uint32_t idx = mirror_y ? (j - x) / 8 + uint32_t((h - 1 - (i - y))) * wb : (j - x) / 8 + uint32_t(i - y) * wb;
+          if (pgm)
+          {
+#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
+            black_data = pgm_read_byte(&black[idx]);
+            color_data = pgm_read_byte(&color[idx]);
+#else
+            black_data = black[idx];
+            color_data = color[idx];
+#endif
+          }
+          else
+          {
+            black_data = black[idx];
+            color_data = color[idx];
+          }
+          if (invert)
+          {
+            black_data = ~black_data;
+            color_data = ~color_data;
+          }
+        }
+        for (int16_t k = 0; k < 4; k++)
+        {
+          uint8_t out_data = 0x00;
+          for (int16_t l = 0; l < 2; l++)
+          {
+            out_data <<= 4;
+            if (!(color_data & 0x80)) out_data |= 0x04;
+            else out_data |= black_data & 0x80 ? 0x01 : 0x00;
+            black_data <<= 1;
+            color_data <<= 1;
+          }
+          _transfer(out_data);
+        }
+      }
+    }
+    _endTransfer();
+  }
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+}
+
+void GxEPD2_565c::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                                 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+  if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return;
+  if ((x_part < 0) || (x_part >= w_bitmap)) return;
+  if ((y_part < 0) || (y_part >= h_bitmap)) return;
+  int16_t wb_bitmap = (w_bitmap + 7) / 8; // width bytes, bitmaps are padded
+  x_part -= x_part % 8; // byte boundary
+  w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit
+  h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit
+  x -= x % 8; // byte boundary
+  w = 8 * ((w + 7) / 8); // byte boundary, bitmaps are padded
+  int16_t x1 = x < 0 ? 0 : x; // limit
+  int16_t y1 = y < 0 ? 0 : y; // limit
+  int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
+  int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
+  int16_t dx = x1 - x;
+  int16_t dy = y1 - y;
+  w1 -= dx;
+  h1 -= dy;
+  if ((w1 <= 0) || (h1 <= 0)) return;
+  _Init_Full();
+  _writeCommand(0x10);
+  _startTransfer();
+  for (int16_t i = 0; i < HEIGHT; i++)
+  {
+    for (int16_t j = 0; j < WIDTH; j += 8)
+    {
+      uint8_t data = 0xFF;
+      if ((j >= x1) && (j < x1 + w) && (i >= y1) && (i < y1 + h))
+      {
+        // use wb_bitmap, h_bitmap of bitmap for index!
+        uint32_t idx = mirror_y ? (x_part + j - x1) / 8 + uint32_t((h_bitmap - 1 - (y_part + i - y1))) * wb_bitmap : (x_part + j - x1) / 8 + uint32_t(y_part + i - y1) * wb_bitmap;
+        if (pgm)
+        {
+#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
+          data = pgm_read_byte(&bitmap[idx]);
+#else
+          data = bitmap[idx];
+#endif
+        }
+        else
+        {
+          data = bitmap[idx];
+        }
+        if (invert) data = ~data;
+      }
+      for (int16_t k = 0; k < 4; k++)
+      {
+        uint8_t data2 = (data & 0x80 ? 0x10 : 0x00) | (data & 0x40 ? 0x01 : 0x00);
+        data <<= 2;
+        _transfer(data2);
+      }
+    }
+  }
+  _endTransfer();
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+}
+
+void GxEPD2_565c::writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                                 int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  //Serial.print("writeImagePart("); Serial.print(x_part); Serial.print(", "); Serial.print(y_part); Serial.print(", ");
+  //Serial.print(w_bitmap); Serial.print(", "); Serial.print(h_bitmap); Serial.print(", ");
+  //Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", ");
+  //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")");
+  if (!black && !color) return;
+  if (!color) return writeImagePart(black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+  if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return;
+  if ((x_part < 0) || (x_part >= w_bitmap)) return;
+  if ((y_part < 0) || (y_part >= h_bitmap)) return;
+  int16_t wb_bitmap = (w_bitmap + 7) / 8; // width bytes, bitmaps are padded
+  x_part -= x_part % 8; // byte boundary
+  w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit
+  h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit
+  x -= x % 8; // byte boundary
+  w = 8 * ((w + 7) / 8); // byte boundary, bitmaps are padded
+  int16_t x1 = x < 0 ? 0 : x; // limit
+  int16_t y1 = y < 0 ? 0 : y; // limit
+  int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
+  int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
+  int16_t dx = x1 - x;
+  int16_t dy = y1 - y;
+  w1 -= dx;
+  h1 -= dy;
+  if ((w1 <= 0) || (h1 <= 0)) return;
+  _Init_Full();
+  _writeCommand(0x10);
+  _startTransfer();
+  for (int16_t i = 0; i < HEIGHT; i++)
+  {
+    for (int16_t j = 0; j < WIDTH; j += 8)
+    {
+      uint8_t black_data = 0xFF, color_data = 0xFF;
+      if ((j >= x1) && (j < x1 + w) && (i >= y1) && (i < y1 + h))
+      {
+        // use wb_bitmap, h_bitmap of bitmap for index!
+        uint32_t idx = mirror_y ? (x_part + j - x1) / 8 + uint32_t((h_bitmap - 1 - (y_part + i - y1))) * wb_bitmap : (x_part + j - x1) / 8 + uint32_t(y_part + i - y1) * wb_bitmap;
+        if (pgm)
+        {
+#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
+          black_data = pgm_read_byte(&black[idx]);
+          color_data = pgm_read_byte(&color[idx]);
+#else
+          black_data = black[idx];
+          color_data = color[idx];
+#endif
+        }
+        else
+        {
+          black_data = black[idx];
+          color_data = color[idx];
+        }
+        if (invert)
+        {
+          black_data = ~black_data;
+          color_data = ~color_data;
+        }
+      }
+      for (int16_t k = 0; k < 4; k++)
+      {
+        uint8_t out_data = 0x00;
+        for (int16_t l = 0; l < 2; l++)
+        {
+          out_data <<= 4;
+          if (!(color_data & 0x80)) out_data |= 0x04;
+          else out_data |= black_data & 0x80 ? 0x01 : 0x00;
+          black_data <<= 1;
+          color_data <<= 1;
+        }
+        _transfer(out_data);
+      }
+    }
+  }
+  _endTransfer();
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+}
+
+void GxEPD2_565c::writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  if (data1)
+  {
+    //Serial.print("writeNative("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", ");
+    //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")");
+    delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+    if (_paged && (x == 0) && (w == WIDTH) && (h < HEIGHT))
+    {
+      //Serial.println("paged");
+      for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(h) / 2; i++)
+      {
+        uint8_t data = data1[i];
+        _transfer(data);
+      }
+      if (y + h == HEIGHT) // last page
+      {
+        _endTransfer();
+        //Serial.println("paged ended");
+        _paged = false;
+      }
+    }
+    else
+    {
+      _paged = false;
+      int16_t wb = (w + 1) / 2; // width bytes, bitmaps are padded
+      x -= x % 2; // byte boundary
+      w = wb * 2; // byte boundary
+      if ((w <= 0) || (h <= 0)) return;
+      _Init_Full();
+      _writeCommand(0x10);
+      _startTransfer();
+      for (int16_t i = 0; i < HEIGHT; i++)
+      {
+        for (int16_t j = 0; j < WIDTH; j += 2)
+        {
+          uint8_t data = 0x11;
+          if (data1)
+          {
+            if ((j >= x) && (j < x + w) && (i >= y) && (i < y + h))
+            {
+              uint32_t idx = mirror_y ? (j - x) / 2 + uint32_t((h - 1 - (i - y))) * wb : (j - x) / 2 + uint32_t(i - y) * wb;
+              if (pgm)
+              {
+#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
+                data = pgm_read_byte(&data1[idx]);
+#else
+                data = data1[idx];
+#endif
+              }
+              else
+              {
+                data = data1[idx];
+              }
+              if (invert) data = ~data;
+            }
+          }
+          _transfer(data);
+        }
+      }
+      _endTransfer();
+    }
+    delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+  }
+}
+
+void GxEPD2_565c::writeNativePart(const uint8_t* data1, const uint8_t* data2, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                                  int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  //Serial.print("writeNativePart("); Serial.print(x_part); Serial.print(", "); Serial.print(y_part); Serial.print(", ");
+  //Serial.print(w_bitmap); Serial.print(", "); Serial.print(h_bitmap); Serial.print(", ");
+  //Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", ");
+  //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")");
+  if (!data1) return;
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+  if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return;
+  if ((x_part < 0) || (x_part >= w_bitmap)) return;
+  if ((y_part < 0) || (y_part >= h_bitmap)) return;
+  int16_t wb_bitmap = (w_bitmap + 1) / 2; // width bytes, bitmaps are padded
+  x_part -= x_part % 2; // byte boundary
+  w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit
+  h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit
+  x -= x % 2; // byte boundary
+  w = 2 * ((w + 1) / 2); // byte boundary, bitmaps are padded
+  int16_t x1 = x < 0 ? 0 : x; // limit
+  int16_t y1 = y < 0 ? 0 : y; // limit
+  int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit
+  int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit
+  int16_t dx = x1 - x;
+  int16_t dy = y1 - y;
+  w1 -= dx;
+  h1 -= dy;
+  if ((w1 <= 0) || (h1 <= 0)) return;
+  _Init_Full();
+  _writeCommand(0x10);
+  _startTransfer();
+  for (int16_t i = 0; i < HEIGHT; i++)
+  {
+    for (int16_t j = 0; j < WIDTH; j += 2)
+    {
+      uint8_t data = 0x11;
+      if ((j >= x1) && (j < x1 + w) && (i >= y1) && (i < y1 + h))
+      {
+        // use wb_bitmap, h_bitmap of bitmap for index!
+        uint32_t idx = mirror_y ? (x_part + j - x1) / 2 + uint32_t((h_bitmap - 1 - (y_part + i - y1))) * wb_bitmap : (x_part + j - x1) / 2 + uint32_t(y_part + i - y1) * wb_bitmap;
+        if (pgm)
+        {
+#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
+          data = pgm_read_byte(&data1[idx]);
+#else
+          data = data1[idx];
+#endif
+        }
+        else
+        {
+          data = data1[idx];
+        }
+        if (invert) data = ~data;
+      }
+      _transfer(data);
+    }
+  }
+  _endTransfer();
+  delay(1); // yield() to avoid WDT on ESP8266 and ESP32
+}
+
+void GxEPD2_565c::drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+}
+
+void GxEPD2_565c::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                                int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+}
+
+void GxEPD2_565c::drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  writeImage(black, color, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+}
+
+void GxEPD2_565c::drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                                int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+}
+
+void GxEPD2_565c::drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm);
+  refresh(x, y, w, h);
+}
+
+void GxEPD2_565c::refresh(bool partial_update_mode)
+{
+  if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT);
+  else _Update_Full();
+}
+
+void GxEPD2_565c::refresh(int16_t x, int16_t y, int16_t w, int16_t h)
+{
+  _Update_Part();
+}
+
+void GxEPD2_565c::powerOff()
+{
+  _PowerOff();
+}
+
+void GxEPD2_565c::hibernate()
+{
+  _PowerOff();
+  if (_rst >= 0)
+  {
+    _writeCommand(0x07); // deep sleep
+    _writeData(0xA5);    // control code
+    _hibernating = true;
+  }
+}
+
+void GxEPD2_565c::setPaged()
+{
+  _paged = true;
+  _Init_Full();
+  _writeCommand(0x10);
+  _startTransfer();
+}
+
+void GxEPD2_565c::_PowerOn()
+{
+  if (!_power_is_on)
+  {
+    _writeCommand(0x04);
+    _waitWhileBusy("_PowerOn", power_on_time);
+  }
+  _power_is_on = true;
+}
+
+void GxEPD2_565c::_PowerOff()
+{
+  if (_power_is_on)
+  {
+    _writeCommand(0x02);
+    _waitWhileBusy("_PowerOff", power_off_time);
+  }
+  _power_is_on = false;
+  _using_partial_mode = false;
+}
+
+void GxEPD2_565c::_InitDisplay()
+{
+  if (_hibernating) _reset();
+  _writeCommand(0x00); // Panel Settings
+  _writeData(0xEF);
+  _writeData(0x08);
+  _writeCommand(0x01); // Power Settings
+  _writeData(0x37);
+  _writeData(0x00);
+  _writeData(0x23);
+  _writeData(0x23);
+  _writeCommand(0x03); // Power Off Sequence
+  _writeData(0x00);
+  _writeCommand(0x06); // Booster Soft Start
+  _writeData(0xC7);
+  _writeData(0xC7);
+  _writeData(0x1D);
+  _writeCommand(0x30); // PLL Control
+  _writeData(0x3C);    // 50 Hz
+  _writeCommand(0x40); // Temperature Sensor Command
+  _writeData(0x00);    // ??
+  _writeCommand(0x50); // VCOM and Data Interval Setting
+  _writeData(0x37);    // white border
+  _writeCommand(0x60); // undocumented
+  _writeData(0x22);
+  _writeCommand(0x61); // Resolution Setting
+  _writeData(0x02);
+  _writeData(0x58);
+  _writeData(0x01);
+  _writeData(0xC0);
+  _writeCommand(0xE3); // undocumented
+  _writeData(0xAA);
+  delay(100);
+  _writeCommand(0x50); // VCOM and Data Interval Setting
+  _writeData(0x37);    // white border
+}
+
+void GxEPD2_565c::_Init_Full()
+{
+  _InitDisplay();
+  _PowerOn();
+}
+
+void GxEPD2_565c::_Init_Part()
+{
+  _InitDisplay();
+  _PowerOn();
+}
+
+void GxEPD2_565c::_Update_Full()
+{
+  _writeCommand(0x12); // Display Refresh
+  _waitWhileBusy("_Update_Full", full_refresh_time);
+}
+
+void GxEPD2_565c::_Update_Part()
+{
+  _writeCommand(0x12); // Display Refresh
+  _waitWhileBusy("_Update_Part", partial_refresh_time);
+}

+ 78 - 0
src/epd3c/GxEPD2_565c.h

@@ -0,0 +1,78 @@
+// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
+// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines!
+//
+// based on Demo Example from Good Display: http://www.e-paper-display.com/download_detail/downloadsId=808.html
+// Panel: 5.65inch ACeP 7-Color E-Paper : https://www.waveshare.com/product/displays/e-paper/5.65inch-e-paper-module-f.htm
+// Controller: unknonw
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#ifndef _GxEPD2_565c_H_
+#define _GxEPD2_565c_H_
+
+#include "../GxEPD2_EPD.h"
+
+class GxEPD2_565c : public GxEPD2_EPD
+{
+  public:
+    // attributes
+    static const uint16_t WIDTH = 600;
+    static const uint16_t HEIGHT = 448;
+    static const GxEPD2::Panel panel = GxEPD2::ACeP565;
+    static const bool hasColor = true;
+    static const bool hasPartialUpdate = false;
+    static const bool hasFastPartialUpdate = false;
+    static const uint16_t power_on_time = 100; // ms, e.g. 96001us
+    static const uint16_t power_off_time = 100; // ms, e.g. 60001us
+    static const uint16_t full_refresh_time = 12000; // ms, e.g. 11354001us
+    static const uint16_t partial_refresh_time = 12000; // ms, e.g. 11354001us
+    // constructor
+    GxEPD2_565c(int8_t cs, int8_t dc, int8_t rst, int8_t busy);
+    // methods (virtual)
+    //  Support for Bitmaps (Sprites) to Controller Buffer and to Screen
+    void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white)
+    void clearScreen(uint8_t black_value, uint8_t color_value); // init controller memory and screen
+    void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white)
+    void writeScreenBuffer(uint8_t black_value, uint8_t color_value); // init controller memory
+    // write to controller memory, without screen refresh; x and w should be multiple of 8
+    void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                        int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                        int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8
+    void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void writeNativePart(const uint8_t* data1, const uint8_t* data2, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                        int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    // write to controller memory, with screen refresh; x and w should be multiple of 8
+    void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                       int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+                       int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8
+    void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen
+    void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen
+    void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time
+    void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0)
+    void setPaged(); // for GxEPD2_154c and GxEPD2_565c paged workaround
+  private:
+    void _PowerOn();
+    void _PowerOff();
+    void _InitDisplay();
+    void _Init_Full();
+    void _Init_Part();
+    void _Update_Full();
+    void _Update_Part();
+  private:
+    bool _paged;
+};
+
+#endif