Kutluhan Aktar
Published © CC BY

A study on VLM-driven ceiling fan airflow analysis w/ Unity

Utilizing VLMs to determine dual fan configurations for optimum cooling based on LiDAR-oriented real-time airflow simulations on Unity.

ExpertFull instructions provided199

Things used in this project

Hardware components

Qualcomm Dragonwing™ IQ-9075 EVK
Qualcomm Dragonwing™ IQ-9075 EVK
×1
RPLIDAR A1M8-R6 LiDAR Scanner
×1
Custom PCB (4-layer)
×1
Arduino Nano 33 BLE
Arduino Nano 33 BLE
×1
BTS7960B DC Motor Driver Module
×2
RS775 12V DC Motor (12000 rpm)
×2
A4988 Stepper Motor Driver Module
×4
Nema 17 (17HS3401) Stepper Motor
×4
KY-040 Rotary Encoder Module
×2
LM393 Optical Motor Speed Module
×2
100 nF Ceramic Disc Capacitor
×4
Grove - Triple Color E-Ink Display (1.54")
×1
2 Channel Relay Module
×1
CrowVision 11.6'' TouchScreen Module (1366x768)
×1
UGREEN 5-in-1 100W USB-C Hub
×1
12V 29A Enclosed Switching Power Supply (MT-350-12)
×1
4 Pole Power Distribution Block (4x7 125A)
×1
Copper Cable (2 x 1.5 mm²)
×1
Copper Cable (2 x 0.75 mm²)
×1
Insulated Ring Crimp Terminals
×1
Male Plug (grounded)
×1
Female Plug (grounded)
×1
2700K Amber Vintage LED Filament Bulb
×2
Black E27 Threaded Lamp Holder
×2
KF2EDGR-5.08-2P Vertical Screw Terminal
×3
M2 Screws, Nuts, and Washers
×1
Machine Screw, M3
Machine Screw, M3
×1
Jumper wires (generic)
Jumper wires (generic)
×1
Bambu Lab A1 Combo
×1
IKEA LACK Table (Black 55x55 cm)
×1

Software apps and online services

Arduino IDE
Arduino IDE
Unity
Unity
MIT App Inventor 2
MIT App Inventor 2
KiCad
KiCad
Fusion
Autodesk Fusion
Thonny
Notepad++
Bambu Studio

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Custom parts and enclosures

Mobile application (APK)

Mobile application (AIA)

Fan controller PCB (Gerber)

Fan controller PCB (Fabrication)

Mechanical components (STL)

Mechanical components (OBJ)

Schematics

Project diagram

Generated by Google Gemini.

Pin connections layout

Generated by Google Gemini.

Code

unity_dragonwing_ceiling_fan_mechanical_control.ino

Arduino
         /////////////////////////////////////////////  
        //   A study on VLM-driven ceiling fan     //
       //       airflow analysis w/ Unity         //
      //             ---------------             //
     //          (Arduino Nano 33 BLE)          //           
    //             by Kutluhan Aktar           // 
   //                                         //
///////////////////////////////////////////////
//
//
//
// Utilizing VLMs to determine dual fan configurations for optimum cooling based on LiDAR-oriented real-time airflow simulations on Unity.
//
// For more information:
// https://www.kutluhanaktar.com/projects/A_study_on_VLM_driven_ceiling_fan_airflow_analysis_w_Unity
//
//
// Connections
// Arduino Nano 33 BLE :
//                                BTS7960B DC Motor Driver (40A) [First]
// 5V      ------------------------ VCC
// GND     ------------------------ GND
// D2      ------------------------ R_PWM
// D3      ------------------------ L_PWM
// 3.3V    ------------------------ R_EN
// 3.3V    ------------------------ L_EN
//                                BTS7960B DC Motor Driver (40A) [Second]
// 5V      ------------------------ VCC
// GND     ------------------------ GND
// D4      ------------------------ R_PWM
// D5      ------------------------ L_PWM
// 3.3V    ------------------------ R_EN
// 3.3V    ------------------------ L_EN
//                                A4988 Driver Module [First]
// 3.3V    ------------------------ VDD
// GND     ------------------------ GND
// D6      ------------------------ DIR
// D7      ------------------------ STEP
//                                A4988 Driver Module [Second]
// 3.3V    ------------------------ VDD
// GND     ------------------------ GND
// D8      ------------------------ DIR
// D9      ------------------------ STEP
//                                A4988 Driver Module [Third]
// 3.3V    ------------------------ VDD
// GND     ------------------------ GND
// D10     ------------------------ DIR
// D11     ------------------------ STEP
//                                A4988 Driver Module [Fourth]
// 3.3V    ------------------------ VDD
// GND     ------------------------ GND
// D12     ------------------------ DIR
// D13     ------------------------ STEP
//                                Grove - Triple Color E-Ink Display (1.54")
// GND     ------------------------ GND
// 3.3V    ------------------------ VCC
// TX      ------------------------ RX
// RX      ------------------------ TX
//                                2 Channel Relay Module
// GND     ------------------------ GND
// A6      ------------------------ IN1
// A7      ------------------------ IN2
// 5V      ------------------------ VCC
//                                KY-040 Rotary Encoder Module [First]
// GND     ------------------------ GND
// 3.3V    ------------------------ +
// A1      ------------------------ DT
// A0      ------------------------ CLK
//                                KY-040 Rotary Encoder Module [Second]
// GND     ------------------------ GND
// 3.3V    ------------------------ +
// A3      ------------------------ DT
// A2      ------------------------ CLK
//                                Motor Speed Sensor (LM393 Optical) [First]
// GND     ------------------------ GND
// A4      ------------------------ OUT
// 3.3V    ------------------------ VCC
//                                Motor Speed Sensor (LM393 Optical) [Second]
// GND     ------------------------ GND
// A5      ------------------------ OUT
// 3.3V    ------------------------ VCC


// Include the required libraries:
#include <ArduinoBLE.h>

// Import the custom interfaces to show them on the Grove - triple color e-ink display.
#include "interfaces.h"

// Declare the BLE service hosted by this device.
BLEService ceiling_fan("9755c88d-cae7-43c6-9013-16d456e05bf6");

// Declare BLE data characteristics and allow the remote device (central) to write, read, or notify.
BLEByteCharacteristic first_fan_speed("9756c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);
BLEByteCharacteristic first_fan_vertical("9757c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);
BLEByteCharacteristic first_fan_horizontal("9758c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);
BLEByteCharacteristic second_fan_speed("9759c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);
BLEByteCharacteristic second_fan_vertical("9760c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);
BLEByteCharacteristic second_fan_horizontal("9761c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);
BLEByteCharacteristic first_light("9762c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);
BLEByteCharacteristic second_light("9763c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);
BLEShortCharacteristic first_fan_status("9764c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLENotify);
BLEShortCharacteristic second_fan_status("9765c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLENotify);
BLEByteCharacteristic homing_status("9766c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);
BLEByteCharacteristic active_procedures("9767c88d-cae7-43c6-9013-16d456e05bf6", BLERead | BLEWrite);

// Define the motor speed sensor (LM393 Optical) pin configurations.
#define first_speed_sensor       A4
#define second_speed_sensor      A5

// Define the 2 channel relay module pin configurations.
#define relay_IN1                A6
#define relay_IN2                A7

// Declare a struct containing RS775 DC motor (12V - 12000 rpm) configurations.
struct fan_motors {
  static constexpr int motor_num = 2;
  int pins[motor_num][2] = {
    {D2, D3}, // R_PWM, L_PWM
    {D4, D5}
  };
  int speed_level[5] = {0, 50, 120, 180, 255};
  int first_motor_speed = 0,
      second_motor_speed = 0;
  float homing_angle_buffer[motor_num] = {0, 0};
  volatile boolean horizontally_homed[motor_num] = {false, false};
};

// Declare a struct containing Nema 17 (17HS3401) stepper motor configurations.
struct gear_motors {
  static constexpr int motor_num = 4;
  int pins[motor_num][2] = {
    {D6, D7}, // DIR, STEP
    {D8, D9},
    {D10, D11},
    {D12, D13}
  };
  int speed = 12000,
      stepsPerRevolution = 200;
  float oneDegreeStepX = 0.2;
  int oneDegreeAccX = 10;
  float oneDegreeStepY = 0.5;
  int oneDegreeAccY = 5;
  
      
};

// Declare a struct containing rotary encoder configurations.
struct encoder {
  static constexpr int encoder_num = 2;
  int pins[encoder_num][2] = {
    {A0, A1}, // CLK, DT
    {A2, A3}
  };
  volatile long ticks[encoder_num] = {0, 0};
  long last_ticks[encoder_num] = {0, 0};
  float angle[encoder_num] = {0, 0};
  const float ticks_per_rev = 20.0,
              gear_ratio = 2;
  volatile boolean buffer_given = false;
};

// Define data holders.
struct fan_motors fan_motors;
struct gear_motors gear_motors;
struct encoder encoder;
String current_first_motor_task = "idle",
       current_second_motor_task = "idle",
       latest_performed_task = "idle";
volatile boolean screen_active = true,
                 screen_change = false,
                 ble_phone_con = false,
                 ble_computer_con = false,
                 unity_active = false;


void setup() {

  Serial.begin(115200);
  delay(1000);

  // Initiate the hardware serial port (Serial1) to communicate with the triple color e-ink display.
  Serial1.begin(230400); 
  delay(1000);
  
  // Register pin configurations.
  pinMode(first_speed_sensor, INPUT_PULLUP); pinMode(second_speed_sensor, INPUT_PULLUP);
  pinMode(relay_IN1, OUTPUT); pinMode(relay_IN2, OUTPUT); digitalWrite(relay_IN1, HIGH); digitalWrite(relay_IN2, HIGH);

  // Initial pin configurations for the BTS7960B DC motor drivers to make RS775 DC motors idle at execution.
  for(int i=0; i<fan_motors.motor_num; i++){
    pinMode(fan_motors.pins[i][0], OUTPUT); analogWrite(fan_motors.pins[i][0], 0);
    pinMode(fan_motors.pins[i][1], OUTPUT); analogWrite(fan_motors.pins[i][1], 0);
  }

  // Initial pin configurations to activate the A4988 driver modules.
   for(int i=0; i<gear_motors.motor_num; i++){
    pinMode(gear_motors.pins[i][0], OUTPUT);
    pinMode(gear_motors.pins[i][1], OUTPUT);
  }

  // Initial pin configurations for the rotary encoders.
  for(int i=0; i<encoder.encoder_num; i++){
    pinMode(encoder.pins[i][0], INPUT_PULLUP);
    pinMode(encoder.pins[i][1], INPUT_PULLUP);
  }  

  // Show the default states on the triple color e-ink display.
  if(screen_active) show_screen_e_ink(ble_phone_con, ble_computer_con, unity_active);

  // Initiate the BLE communication procedure.
  while(!BLE.begin()){
    Serial.println("BLE initialization is failed!");
  }
  Serial.println("\nBLE initialization is successful!\n");
  // Print this peripheral device's address information:
  Serial.print("MAC Address: "); Serial.println(BLE.address());
  Serial.print("Service UUID Address: "); Serial.println(ceiling_fan.uuid()); Serial.println();

  // Set the local name this peripheral advertises, which will be shown to central devices.
  BLE.setLocalName("Dragonwing Ceiling Fan");
  // Set the primary service UUID.
  BLE.setAdvertisedService(ceiling_fan);
  // Add the declared BLE data characteristics to the defined primary service.
  ceiling_fan.addCharacteristic(first_fan_speed);
  ceiling_fan.addCharacteristic(first_fan_vertical);
  ceiling_fan.addCharacteristic(first_fan_horizontal);
  ceiling_fan.addCharacteristic(second_fan_speed);
  ceiling_fan.addCharacteristic(second_fan_vertical);
  ceiling_fan.addCharacteristic(second_fan_horizontal);
  ceiling_fan.addCharacteristic(first_light);
  ceiling_fan.addCharacteristic(second_light);
  ceiling_fan.addCharacteristic(first_fan_status);
  ceiling_fan.addCharacteristic(second_fan_status);
  ceiling_fan.addCharacteristic(homing_status);
  ceiling_fan.addCharacteristic(active_procedures);
  // Register the primary service.
  BLE.addService(ceiling_fan);

  // Assign event handlers for connected and disconnected central devices to/from this peripheral.
  BLE.setEventHandler(BLEConnected, blePeripheralConnectHandler);
  BLE.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler);

  // Assign event handlers for the BLE data characteristics modified (written) by the connected central device.
  // Then, perform the requested task accordingly.
  first_fan_speed.setEventHandler(BLEWritten, perform_tasks_via_BLE);
  first_fan_vertical.setEventHandler(BLEWritten, perform_tasks_via_BLE);
  first_fan_horizontal.setEventHandler(BLEWritten, perform_tasks_via_BLE);
  second_fan_speed.setEventHandler(BLEWritten, perform_tasks_via_BLE);
  second_fan_vertical.setEventHandler(BLEWritten, perform_tasks_via_BLE);
  second_fan_horizontal.setEventHandler(BLEWritten, perform_tasks_via_BLE);
  first_light.setEventHandler(BLEWritten, perform_tasks_via_BLE);
  second_light.setEventHandler(BLEWritten, perform_tasks_via_BLE);
  homing_status.setEventHandler(BLEWritten, perform_tasks_via_BLE);
  active_procedures.setEventHandler(BLEWritten, perform_tasks_via_BLE);

  // Start advertising with the concluded device settings.
  BLE.advertise();
  Serial.println(("BLE connection is active, waiting for the central device..."));
  delay(5000);

  // Attach seperate interrupt handlers for the rotary encoders.
  attachInterrupt(digitalPinToInterrupt(encoder.pins[0][0]), []() { obtain_encoder_values(encoder.pins[0][0], encoder.pins[0][1], encoder.ticks[0]); }, CHANGE); // Using lambda to pass variables.
  attachInterrupt(digitalPinToInterrupt(encoder.pins[1][0]), []() { obtain_encoder_values(encoder.pins[1][0], encoder.pins[1][1], encoder.ticks[1]); }, CHANGE);

}

void loop() {

  // Estimate the angle (0 - 360) values of the rotary encoders.
   for(int i=0; i<encoder.encoder_num; i++){
    if(encoder.ticks[i] != encoder.last_ticks[i]){
        encoder.last_ticks[i] = encoder.ticks[i];
        float raw_angle = (encoder.ticks[i] / encoder.ticks_per_rev) * 360.0 / encoder.gear_ratio;
        // Remove the provided horizontal motor buffer angle to zero the encoder position based on the homing speed sensor position.
        encoder.angle[i] = fmod(raw_angle - fan_motors.homing_angle_buffer[i], 360.0);
        if(encoder.angle[i] < 0) encoder.angle[i] += 360.0;
        // After estimating the angle successfully, update the fan status information over BLE.
        int16_t angle = (int16_t)encoder.angle[i];
        if(i == 0){ first_fan_status.writeValue(angle); }
        else if(i == 1){ second_fan_status.writeValue(angle); }
    }   
  }

  // Once the motor buffer angles are set, update the fan status information over BLE immediately, which lets the user see the zeroed encoder angle values without turning encoder knobs.
  if(encoder.buffer_given){
    for(int i=0; i<encoder.encoder_num; i++){
      // Estimate the current angle to precisely zero the encoder position.
      float raw_angle = (encoder.ticks[i] / encoder.ticks_per_rev) * 360.0 / encoder.gear_ratio;
      encoder.angle[i] = fmod(raw_angle - fan_motors.homing_angle_buffer[i], 360.0);
      if(encoder.angle[i] < 0) encoder.angle[i] += 360.0;      
    }
    first_fan_status.writeValue((int16_t)encoder.angle[0]); second_fan_status.writeValue((int16_t)encoder.angle[1]);
    encoder.buffer_given = false;
  }

  // Once the motor speed sensors detect the homing pins, update the fan status information immediately.
  if(digitalRead(first_speed_sensor) && !fan_motors.horizontally_homed[0]){
    first_fan_status.writeValue(-1);
    fan_motors.horizontally_homed[0] = true;
  }else if(!digitalRead(first_speed_sensor) && fan_motors.horizontally_homed[0]){
    first_fan_status.writeValue(-2);
    fan_motors.horizontally_homed[0] = false;
  }
  if(digitalRead(second_speed_sensor) && !fan_motors.horizontally_homed[1]){
    second_fan_status.writeValue(-1);
    fan_motors.horizontally_homed[1] = true;
  }else if(!digitalRead(second_speed_sensor) && fan_motors.horizontally_homed[1]){
    second_fan_status.writeValue(-2);
    fan_motors.horizontally_homed[1] = false;
  }    
 
  // Once the operation states change, update the triple color e-ink display.
  if(screen_change && screen_active){
    show_screen_e_ink(ble_phone_con, ble_computer_con, unity_active);
    screen_change = false;
  }

  // To avoid interruption issues, seperate task from the primary BLE poll loop.
  /* First (Left) ceiling fan motor tasks. */
  if(current_first_motor_task != "idle"){
    if(current_first_motor_task == "one_degree_down" && latest_performed_task != "one_degree_down"){
      driver_bevel_gear_move(0, gear_motors.oneDegreeStepY, gear_motors.oneDegreeAccY, "TD", "D_R");
      latest_performed_task = "one_degree_down";
    }
    if(current_first_motor_task == "one_degree_up" && latest_performed_task != "one_degree_up"){
      driver_bevel_gear_move(0, gear_motors.oneDegreeStepY, gear_motors.oneDegreeAccY, "TD", "U_L");
      latest_performed_task = "one_degree_up";
    }    
    if(current_first_motor_task == "one_degree_right" && latest_performed_task != "one_degree_right"){
      driver_bevel_gear_move(0, gear_motors.oneDegreeStepX, gear_motors.oneDegreeAccX, "OP", "D_R");
      latest_performed_task = "one_degree_right";
    } 
    if(current_first_motor_task == "one_degree_left" && latest_performed_task != "one_degree_left"){
      driver_bevel_gear_move(0, gear_motors.oneDegreeStepX, gear_motors.oneDegreeAccX, "OP", "U_L");
      latest_performed_task = "one_degree_left";
    }
    if(current_first_motor_task == "speed_update"){
      analogWrite(fan_motors.pins[0][0], fan_motors.first_motor_speed);
      analogWrite(fan_motors.pins[0][1], 0);
    }
    current_first_motor_task = "idle";
    delay(200);                 
  }

  /* Second (Right) ceiling fan motor tasks. */
  if(current_second_motor_task != "idle"){
    if(current_second_motor_task == "one_degree_down" && latest_performed_task != "one_degree_down"){
      driver_bevel_gear_move(2, gear_motors.oneDegreeStepY, gear_motors.oneDegreeAccY, "TD", "D_R");
      latest_performed_task = "one_degree_down";
    }
    if(current_second_motor_task == "one_degree_up" && latest_performed_task != "one_degree_up"){
      driver_bevel_gear_move(2, gear_motors.oneDegreeStepY, gear_motors.oneDegreeAccY, "TD", "U_L");
      latest_performed_task = "one_degree_up";
    }    
    if(current_second_motor_task == "one_degree_right" && latest_performed_task != "one_degree_right"){
      driver_bevel_gear_move(2, gear_motors.oneDegreeStepX, gear_motors.oneDegreeAccX, "OP", "D_R");
      latest_performed_task = "one_degree_right";
    } 
    if(current_second_motor_task == "one_degree_left" && latest_performed_task != "one_degree_left"){
      driver_bevel_gear_move(2, gear_motors.oneDegreeStepX, gear_motors.oneDegreeAccX, "OP", "U_L");
      latest_performed_task = "one_degree_left";
    }
    if(current_second_motor_task == "speed_update"){
      analogWrite(fan_motors.pins[1][0], 0);
      analogWrite(fan_motors.pins[1][1], fan_motors.second_motor_speed);
    }
    current_second_motor_task = "idle";
    delay(200);                 
  }  

  // Initiate the built-in loop of the BLE class (poll) to process BLE events.
  BLE.poll();

}

void driver_bevel_gear_move(int gear_set, float step_number, int acc, String _state, String _dir){
  /*
      Move the requested driver bevel gear set by controlling the rotation of the associated stepper motors.
      Gear Set State:
        Tandem [TD]: rotate the target stepper motors at the same direction at the same speed.
        Opposite [OP]: rotate the target stepper motors at opposite directions at the same speed.
      Gear Set Direction:
        Up or Left [U_L]: if the gear state is tandem, mechanism moves left. if the gear state is opposite, the mechanism moves up.
        Down or Right [D_R]: if the gear state is tandem, mechanism moves right. if the gear state is opposite, the mechanism moves down.
      Gear Set Numbers:
        0: First (Left) ceiling fan driver bevel gears.
        2: Second (Right) ceiling fan driver bevel gears.
  */
  if(_state == "TD" && _dir == "U_L"){
    digitalWrite(gear_motors.pins[gear_set][0], LOW);
    digitalWrite(gear_motors.pins[gear_set+1][0], HIGH);
  }
  else if(_state == "TD" && _dir == "D_R"){
    digitalWrite(gear_motors.pins[gear_set][0], HIGH);
    digitalWrite(gear_motors.pins[gear_set+1][0], LOW);
  }  
  if(_state == "OP" && _dir == "U_L"){
    digitalWrite(gear_motors.pins[gear_set][0], HIGH);
    digitalWrite(gear_motors.pins[gear_set+1][0], HIGH);
  }
  else if(_state == "OP" && _dir == "D_R"){
    digitalWrite(gear_motors.pins[gear_set][0], LOW);
    digitalWrite(gear_motors.pins[gear_set+1][0], LOW);
  } 

  // Calculate the total rotation number to achieve the requested step number based on the defined revolution number.
  float rotation_number = gear_motors.stepsPerRevolution * step_number;
  // Then, rotate the target stepper motors accordingly.
  for(int i = 0; i < (int)rotation_number; i++){
    digitalWrite(gear_motors.pins[gear_set][1], HIGH);
    digitalWrite(gear_motors.pins[gear_set+1][1], HIGH);
    delayMicroseconds(gear_motors.speed/acc);
    digitalWrite(gear_motors.pins[gear_set][1], LOW);
    digitalWrite(gear_motors.pins[gear_set+1][1], LOW);
    delayMicroseconds(gear_motors.speed/acc);
  }  

}

void obtain_encoder_values(int clkPin, int dtPin, volatile long &ticks){
  // Update the tick value of the given rotary encoder.
  if(digitalRead(clkPin) != digitalRead(dtPin)){
    ticks++;
  }else{
    ticks--;
  }
}

void perform_tasks_via_BLE(BLEDevice central, BLECharacteristic characteristic){
  /* First (Left) ceiling fan motor configurations. */
  if(characteristic.uuid() == first_fan_vertical.uuid()){
    // Adjust the vertical angle of the target ceiling fan base.
    switch(first_fan_vertical.value()){
      case 1:
        current_first_motor_task = "one_degree_down";
      break;
      case 2:
        current_first_motor_task = "one_degree_up";
      break;     
    }
  }
  if(characteristic.uuid() == first_fan_horizontal.uuid()){
    // Adjust the horizontal angle of the target ceiling fan base.
    switch(first_fan_horizontal.value()){
      case 1:
        current_first_motor_task = "one_degree_right";
      break;
      case 2:
        current_first_motor_task = "one_degree_left";
      break;     
    }
  }  
  if(characteristic.uuid() == first_fan_speed.uuid()){
    // Rotate the target ceiling fan motor according to the given fan motor speed.
    current_first_motor_task = "speed_update";
    fan_motors.first_motor_speed = fan_motors.speed_level[first_fan_speed.value()];
    // Clear configurations.
    if(first_fan_speed.value() == 0) latest_performed_task = "idle";
  }

  /* Second (Right) ceiling fan motor configurations. */
  if(characteristic.uuid() == second_fan_vertical.uuid()){
    // Adjust the vertical angle of the target ceiling fan base.
    switch(second_fan_vertical.value()){
      case 1:
        current_second_motor_task = "one_degree_down";
      break;
      case 2:
        current_second_motor_task = "one_degree_up";
      break;     
    }
  }
  if(characteristic.uuid() == second_fan_horizontal.uuid()){
    // Adjust the horizontal angle of the target ceiling fan base.
    switch(second_fan_horizontal.value()){
      case 1:
        current_second_motor_task = "one_degree_right";
      break;
      case 2:
        current_second_motor_task = "one_degree_left";
      break;     
    }
  }  
  if(characteristic.uuid() == second_fan_speed.uuid()){
    // Rotate the target ceiling fan motor according to the given fan motor speed.
    current_second_motor_task = "speed_update";
    fan_motors.second_motor_speed = fan_motors.speed_level[second_fan_speed.value()];
    // Clear configurations.
    if(second_fan_speed.value() == 0) latest_performed_task = "idle";
  }

  /* Cooling fan homing adjustments. */
  if(characteristic.uuid() == homing_status.uuid()){
    switch(homing_status.value()){
      case 1:
        for(int i=0; i<fan_motors.motor_num; i++){
          fan_motors.homing_angle_buffer[i] = encoder.angle[i];
          encoder.buffer_given = true;
        }
      break;    
    }
  } 

  /* Dual ceiling lights configurations. */
  if(characteristic.uuid() == first_light.uuid()){
    // Change the state of the target ceiling light.
    digitalWrite(relay_IN1, first_light.value()-1);
  }
  if(characteristic.uuid() == second_light.uuid()){
    // Change the state of the target ceiling light.
    digitalWrite(relay_IN2, second_light.value()-1);
  }

  /* Screen configurations by the connected device type. */
  if(characteristic.uuid() == active_procedures.uuid()){
    switch(active_procedures.value()){
      case 1:
        ble_phone_con = true;
      break;
      case 2:
        ble_phone_con = false;
      break;
      case 3:
        unity_active = true;
      break;
      case 4:
        unity_active = false;
      break;                 
    }
    screen_change = true;    
  }      
  
}

void show_screen_e_ink(bool phone_ble, bool computer_ble, bool unity_analysis){
  // Interface configurations. 
  e_ink_send_begin();
  delay(2000);  
  if(phone_ble && computer_ble && unity_analysis){
    e_ink_write_image_picture(black_layer_bg, red_layer_all);
  }else if(!phone_ble && computer_ble && unity_analysis){
    e_ink_write_image_picture(black_layer_bg, red_layer_computer_unity);
  }else if(phone_ble && computer_ble && !unity_analysis){
    e_ink_write_image_picture(black_layer_bg, red_layer_phone_computer);
  }else if(phone_ble && !computer_ble && !unity_analysis){
    e_ink_write_image_picture(black_layer_bg, red_layer_phone);
  }else if(!phone_ble && computer_ble && !unity_analysis){
    e_ink_write_image_picture(black_layer_bg, red_layer_computer);
  }else if(!phone_ble && !computer_ble && !unity_analysis){
    e_ink_write_image_picture(black_layer_bg, red_layer_none);
  }  
  delay(2000);
}

void e_ink_serial_send_data(const uint8_t* data, uint32_t data_len){
    for (int i = 0; i < data_len; i++) {
        Serial1.write(pgm_read_byte(&data[i]));
    }
}

void e_ink_write_image_picture(const uint8_t* black_buffer, const uint8_t* red_buffer){
    for (int i = 0; i < 38; i++) {
        e_ink_serial_send_data(&black_buffer[i * 76], 76);
        delay(70);
    }
    delay(70);
    for (int i = 0; i < 38; i++) {
        e_ink_serial_send_data(&red_buffer[i * 76], 76);
        delay(70);
    }
}

void e_ink_send_begin(){
    char str = 'a';
    Serial1.write(str);
    while(1) {
        if (Serial1.available() > 0) {
            delay(10);
            char str1 = Serial1.read();
            //Serial.print(str1);
            if (str1 == 'b') {
                Serial.println("\nE-ink: Screen update success!");
                break;
            }
        }
    }
}

void blePeripheralConnectHandler(BLEDevice central) {
  // Central connected event handler:
  Serial.print("\nConnected event, central: ");
  Serial.println(central.address());
}

void blePeripheralDisconnectHandler(BLEDevice central) {
  // Central disconnected event handler:
  Serial.print("\nDisconnected event, central: ");
  Serial.println(central.address());
}

interfaces.h

C Header File
// Declare the built-in e-ink display interfaces as two seperate buffers  black and red.
PROGMEM const unsigned char black_layer_bg[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xFE, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xEF, 0x80, 0x1F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xE7, 0x80, 0x1F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03,
0xE3, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xF8, 0x03, 0x69, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x2D, 0xC0, 0x1F, 0x06, 0x38, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x8B, 0xC0, 0x1F, 0x32, 0x39, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xC7, 0xC0, 0x1F, 0x32,
0x39, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xC7,
0xC0, 0x1F, 0x06, 0x38, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0x03, 0x8B, 0xC0, 0x1F, 0x32, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x2D, 0xC0, 0x1F, 0x32, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x69, 0xC0, 0x1F, 0x32, 0x39, 0xF3, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xE3, 0xC0, 0x1F, 0x06, 0x08,
0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xE7, 0x80,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0x01, 0xEF, 0x80, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xF8, 0x00, 0xFE, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x1F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00,
0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF,
0x1F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFC, 0xFF, 0x67, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xE2, 0x03, 0x98, 0x41, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xC9, 0x67, 0x87, 0x0D, 0x3F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xC1, 0x67, 0x98, 0x0D, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCF, 0x67,
0x99, 0x0D, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFC, 0x21, 0x63, 0x98, 0x0D, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x37, 0xE7, 0xFE, 0x1F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x9F,
0xE7, 0x9E, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFC, 0x94, 0x00, 0x0E, 0x70, 0x86, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x34, 0xA4, 0x9E, 0x1C, 0x92, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x34, 0x24, 0x9E, 0x70, 0x93, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x95, 0xE4, 0x9E, 0x64, 0x92,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x94, 0x04,
0x8E, 0x70, 0x92, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFD, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF,
0x9F, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0xFE,
0x67, 0xFF, 0xE7, 0x9F, 0x99, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xCF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF,
0xFF, 0x39, 0xFF, 0xE7, 0xFF, 0xC3, 0xFF, 0x99, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xCF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x02, 0x00, 0x67, 0xC3, 0x90, 0x09, 0x86, 0x64, 0xF9, 0x30, 0x30,
0xC9, 0x90, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x12, 0x26, 0x67, 0xD9, 0x91, 0x99, 0x32, 0x44,
0xF9, 0x31, 0x3E, 0x49, 0x87, 0x93, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x32, 0x27, 0x0F, 0x99, 0x93,
0x99, 0x32, 0x44, 0xF9, 0x33, 0x30, 0x4C, 0x31, 0x91, 0xFF, 0xFF, 0xFF, 0xFF, 0x39, 0x32, 0x27,
0x0F, 0x81, 0x93, 0x99, 0x33, 0x15, 0xF0, 0x13, 0x26, 0x4C, 0x38, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF,
0x33, 0x32, 0x27, 0x0F, 0x38, 0x93, 0x99, 0x33, 0x11, 0xF3, 0x93, 0x24, 0x4C, 0x2C, 0x96, 0x7F,
0xFF, 0xFF, 0xFF, 0x87, 0x32, 0x23, 0x9F, 0x3C, 0x93, 0x99, 0x87, 0x11, 0xF3, 0x93, 0x30, 0x4E,
0x71, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
};

PROGMEM const unsigned char red_layer_all[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xC1,
0xC0, 0xC1, 0xF8, 0xC0, 0x27, 0xC3, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF,
0xFE, 0x01, 0x80, 0xC0, 0xC0, 0xF8, 0xC0, 0x27, 0x01, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01,
0xFF, 0xFF, 0xFF, 0xFE, 0x79, 0x9C, 0xCF, 0xCC, 0xF2, 0xF9, 0xE7, 0x3C, 0xC3, 0xBF, 0xFF, 0xFF,
0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0x9C, 0xCF, 0xCC, 0xF6, 0x79, 0xE6, 0x7C, 0xCB,
0xBF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x80, 0xC1, 0xC0, 0xF6, 0x79,
0xE6, 0x7C, 0xC9, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x83, 0xC1,
0xC1, 0xE7, 0x79, 0xE6, 0x7C, 0xCD, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x30, 0x3F, 0xFF, 0xFF, 0xFC,
0xF9, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x7C, 0xCC, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x67, 0xBF,
0xFF, 0xFF, 0xFE, 0x79, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x3C, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF,
0x80, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0x9F, 0xC0, 0xCE, 0x4F, 0xB9, 0xE7, 0x01, 0xCE, 0x3F,
0xFF, 0xFF, 0xDF, 0x81, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x87, 0x9F, 0xC0, 0xCE, 0x4F, 0x99, 0xE7,
0x83, 0xCF, 0x3F, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xE1, 0xFF, 0x87, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xF9,
0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x81, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0xF8, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, 0xC0, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x87, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00,
0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xC0, 0x00, 0x01, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x1C, 0xE0, 0x33, 0xCF, 0x1F, 0xFF,
0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x10, 0x18, 0x60, 0x33,
0xCC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xDE,
0x79, 0x7C, 0xF3, 0xCC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF,
0xFF, 0xF9, 0xFE, 0x7B, 0x7C, 0xF3, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1E, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x73, 0x3C, 0xF3, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0x00, 0x7C, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x73, 0x3C, 0xF3, 0xCF, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x01, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x70, 0x1C, 0xF3, 0xCF,
0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9E, 0x60,
0x1C, 0xF3, 0xCD, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0x1E, 0x67, 0x9C, 0xF8, 0x1C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x6F, 0xCC, 0xFC, 0x3E, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xE0,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xFF,
0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xF0, 0xF3, 0xFF, 0xFF, 0x06, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x79, 0xFF, 0xFE, 0x3F, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x66, 0xFF, 0xFC, 0x7F, 0xE3, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xDA, 0x7F, 0xFC, 0x7F, 0xE3,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xED, 0x7F,
0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xE1, 0xF5, 0xBF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF1, 0xFA, 0xBF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFA, 0xBF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, 0xBF, 0xF8, 0xFC, 0xF1, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7E, 0xBF, 0xF8,
0xFC, 0x71, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
0x3B, 0xFF, 0xFC, 0x7E, 0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x11, 0xFF, 0xFC, 0x3E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFE, 0x1E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x82, 0x7F, 0xFF, 0xC0,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1,
0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x83, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xFD, 0xF1, 0xFB, 0xE3, 0xF7, 0xCF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFB, 0xF9, 0xF7, 0xF3, 0xEF, 0xCF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xFB, 0xF9, 0xF7,
0xF3, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC,
0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFD, 0xFC, 0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0xF9, 0xFB, 0xF3, 0xF7, 0xEF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7B, 0xFC, 0xE7, 0xF9, 0xCF, 0xF3, 0x9F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFE, 0x0F, 0xFC, 0x1F,
0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFE, 0x0F,
0xFC, 0x1F, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x01, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0xF1, 0xFB, 0xE3, 0xF7, 0xC7, 0xEF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF9, 0xF3, 0xF3, 0xE7, 0xE7, 0xDF, 0xCF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFD, 0xF7, 0xF3, 0xEF, 0xE7, 0xDF, 0xCF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFD, 0xF7, 0xF3, 0xEF,
0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFD,
0xF7, 0xF3, 0xEF, 0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFD, 0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0xF9, 0xEF, 0xF3, 0xDF, 0xE7, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xF0, 0x7F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x9F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x12, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xDF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x0F, 0xD1, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x1E, 0xF9, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x01, 0xF8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x3C, 0xE2, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x0C, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xDF, 0xE4, 0xC7, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC0, 0x1A, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x03, 0xEE, 0xCF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1E, 0xFE,
0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xE0, 0x7B, 0xBF, 0x9E, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF0, 0xFB, 0x7D, 0xBE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF3, 0x7F, 0x7C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x7F, 0xF0, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x77, 0x00,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x67, 0x78, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xE7, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x27, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCF, 0x30, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x8F, 0x38, 0x0D, 0x9F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F,
0x1F, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0x1F, 0x9F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0x8A, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0x87, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x87,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xC7, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
};

PROGMEM const unsigned char red_layer_computer_unity[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xC1,
0xC0, 0xC1, 0xF8, 0xC0, 0x27, 0xC3, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF,
0xFE, 0x01, 0x80, 0xC0, 0xC0, 0xF8, 0xC0, 0x27, 0x01, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01,
0xFF, 0xFF, 0xFF, 0xFE, 0x79, 0x9C, 0xCF, 0xCC, 0xF2, 0xF9, 0xE7, 0x3C, 0xC3, 0xBF, 0xFF, 0xFF,
0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0x9C, 0xCF, 0xCC, 0xF6, 0x79, 0xE6, 0x7C, 0xCB,
0xBF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x80, 0xC1, 0xC0, 0xF6, 0x79,
0xE6, 0x7C, 0xC9, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x83, 0xC1,
0xC1, 0xE7, 0x79, 0xE6, 0x7C, 0xCD, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x30, 0x3F, 0xFF, 0xFF, 0xFC,
0xF9, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x7C, 0xCC, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x67, 0xBF,
0xFF, 0xFF, 0xFE, 0x79, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x3C, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF,
0x80, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0x9F, 0xC0, 0xCE, 0x4F, 0xB9, 0xE7, 0x01, 0xCE, 0x3F,
0xFF, 0xFF, 0xDF, 0x81, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x87, 0x9F, 0xC0, 0xCE, 0x4F, 0x99, 0xE7,
0x83, 0xCF, 0x3F, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xE1, 0xFF, 0x87, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xF9,
0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x81, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0xF8, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, 0xC0, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x87, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00,
0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xC0, 0x00, 0x01, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x1C, 0xE0, 0x33, 0xCF, 0x1F, 0xFF,
0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x10, 0x18, 0x60, 0x33,
0xCC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xDE,
0x79, 0x7C, 0xF3, 0xCC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF,
0xFF, 0xF9, 0xFE, 0x7B, 0x7C, 0xF3, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1E, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x73, 0x3C, 0xF3, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0x00, 0x7C, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x73, 0x3C, 0xF3, 0xCF, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x01, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x70, 0x1C, 0xF3, 0xCF,
0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9E, 0x60,
0x1C, 0xF3, 0xCD, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0x1E, 0x67, 0x9C, 0xF8, 0x1C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x6F, 0xCC, 0xFC, 0x3E, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xE3, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xE3,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFC, 0xF1, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0xFC, 0x71, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0x7E, 0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x83, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xFD, 0xF1, 0xFB, 0xE3, 0xF7, 0xCF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFB, 0xF9, 0xF7, 0xF3, 0xEF, 0xCF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xFB, 0xF9, 0xF7,
0xF3, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC,
0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFD, 0xFC, 0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0xF9, 0xFB, 0xF3, 0xF7, 0xEF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7B, 0xFC, 0xE7, 0xF9, 0xCF, 0xF3, 0x9F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFE, 0x0F, 0xFC, 0x1F,
0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFE, 0x0F,
0xFC, 0x1F, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x01, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0xF1, 0xFB, 0xE3, 0xF7, 0xC7, 0xEF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF9, 0xF3, 0xF3, 0xE7, 0xE7, 0xDF, 0xCF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFD, 0xF7, 0xF3, 0xEF, 0xE7, 0xDF, 0xCF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFD, 0xF7, 0xF3, 0xEF,
0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFD,
0xF7, 0xF3, 0xEF, 0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFD, 0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0xF9, 0xEF, 0xF3, 0xDF, 0xE7, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xF0, 0x7F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x9F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x12, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xDF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x0F, 0xD1, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x1E, 0xF9, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x01, 0xF8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x3C, 0xE2, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x0C, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xDF, 0xE4, 0xC7, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC0, 0x1A, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x03, 0xEE, 0xCF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1E, 0xFE,
0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xE0, 0x7B, 0xBF, 0x9E, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF0, 0xFB, 0x7D, 0xBE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF3, 0x7F, 0x7C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x7F, 0xF0, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x77, 0x00,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x67, 0x78, 0x0F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xE7, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x27, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCF, 0x30, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x8F, 0x38, 0x0D, 0x9F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F,
0x1F, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0x1F, 0x9F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x0F, 0x8A, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0x87, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x87,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xC7, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
};

PROGMEM const unsigned char red_layer_phone_computer[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xC1,
0xC0, 0xC1, 0xF8, 0xC0, 0x27, 0xC3, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF,
0xFE, 0x01, 0x80, 0xC0, 0xC0, 0xF8, 0xC0, 0x27, 0x01, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01,
0xFF, 0xFF, 0xFF, 0xFE, 0x79, 0x9C, 0xCF, 0xCC, 0xF2, 0xF9, 0xE7, 0x3C, 0xC3, 0xBF, 0xFF, 0xFF,
0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0x9C, 0xCF, 0xCC, 0xF6, 0x79, 0xE6, 0x7C, 0xCB,
0xBF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x80, 0xC1, 0xC0, 0xF6, 0x79,
0xE6, 0x7C, 0xC9, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x83, 0xC1,
0xC1, 0xE7, 0x79, 0xE6, 0x7C, 0xCD, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x30, 0x3F, 0xFF, 0xFF, 0xFC,
0xF9, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x7C, 0xCC, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x67, 0xBF,
0xFF, 0xFF, 0xFE, 0x79, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x3C, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF,
0x80, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0x9F, 0xC0, 0xCE, 0x4F, 0xB9, 0xE7, 0x01, 0xCE, 0x3F,
0xFF, 0xFF, 0xDF, 0x81, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x87, 0x9F, 0xC0, 0xCE, 0x4F, 0x99, 0xE7,
0x83, 0xCF, 0x3F, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xE1, 0xFF, 0x87, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xF9,
0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x81, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0xF8, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, 0xC0, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x87, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00,
0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xC0, 0x00, 0x01, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x1C, 0xE0, 0x33, 0xCF, 0x1F, 0xFF,
0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x10, 0x18, 0x60, 0x33,
0xCC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xDE,
0x79, 0x7C, 0xF3, 0xCC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF,
0xFF, 0xF9, 0xFE, 0x7B, 0x7C, 0xF3, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1E, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x73, 0x3C, 0xF3, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0x00, 0x7C, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x73, 0x3C, 0xF3, 0xCF, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x01, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x70, 0x1C, 0xF3, 0xCF,
0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9E, 0x60,
0x1C, 0xF3, 0xCD, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0x1E, 0x67, 0x9C, 0xF8, 0x1C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x6F, 0xCC, 0xFC, 0x3E, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xE0,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xFF,
0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xF0, 0xF3, 0xFF, 0xFF, 0x06, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x79, 0xFF, 0xFE, 0x3F, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x66, 0xFF, 0xFC, 0x7F, 0xE3, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xDA, 0x7F, 0xFC, 0x7F, 0xE3,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xED, 0x7F,
0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xE1, 0xF5, 0xBF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF1, 0xFA, 0xBF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFA, 0xBF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, 0xBF, 0xF8, 0xFC, 0xF1, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7E, 0xBF, 0xF8,
0xFC, 0x71, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
0x3B, 0xFF, 0xFC, 0x7E, 0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x11, 0xFF, 0xFC, 0x3E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFE, 0x1E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x82, 0x7F, 0xFF, 0xC0,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1,
0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x83, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xFD, 0xF1, 0xFB, 0xE3, 0xF7, 0xCF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFB, 0xF9, 0xF7, 0xF3, 0xEF, 0xCF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xFB, 0xF9, 0xF7,
0xF3, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC,
0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFD, 0xFC, 0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0xF9, 0xFB, 0xF3, 0xF7, 0xEF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7B, 0xFC, 0xE7, 0xF9, 0xCF, 0xF3, 0x9F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFE, 0x0F, 0xFC, 0x1F,
0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFE, 0x0F,
0xFC, 0x1F, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x01, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0xF1, 0xFB, 0xE3, 0xF7, 0xC7, 0xEF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF9, 0xF3, 0xF3, 0xE7, 0xE7, 0xDF, 0xCF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFD, 0xF7, 0xF3, 0xEF, 0xE7, 0xDF, 0xCF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFD, 0xF7, 0xF3, 0xEF,
0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFD,
0xF7, 0xF3, 0xEF, 0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFD, 0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0xF9, 0xEF, 0xF3, 0xDF, 0xE7, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xF0, 0x7F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x9F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x12, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
};

PROGMEM const unsigned char red_layer_phone[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xC1,
0xC0, 0xC1, 0xF8, 0xC0, 0x27, 0xC3, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF,
0xFE, 0x01, 0x80, 0xC0, 0xC0, 0xF8, 0xC0, 0x27, 0x01, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01,
0xFF, 0xFF, 0xFF, 0xFE, 0x79, 0x9C, 0xCF, 0xCC, 0xF2, 0xF9, 0xE7, 0x3C, 0xC3, 0xBF, 0xFF, 0xFF,
0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0x9C, 0xCF, 0xCC, 0xF6, 0x79, 0xE6, 0x7C, 0xCB,
0xBF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x80, 0xC1, 0xC0, 0xF6, 0x79,
0xE6, 0x7C, 0xC9, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x83, 0xC1,
0xC1, 0xE7, 0x79, 0xE6, 0x7C, 0xCD, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x30, 0x3F, 0xFF, 0xFF, 0xFC,
0xF9, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x7C, 0xCC, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x67, 0xBF,
0xFF, 0xFF, 0xFE, 0x79, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x3C, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF,
0x80, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0x9F, 0xC0, 0xCE, 0x4F, 0xB9, 0xE7, 0x01, 0xCE, 0x3F,
0xFF, 0xFF, 0xDF, 0x81, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x87, 0x9F, 0xC0, 0xCE, 0x4F, 0x99, 0xE7,
0x83, 0xCF, 0x3F, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xE1, 0xFF, 0x87, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xF9,
0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x81, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0xF8, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, 0xC0, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x87, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00,
0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xC0, 0x00, 0x01, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x1C, 0xE0, 0x33, 0xCF, 0x1F, 0xFF,
0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x10, 0x18, 0x60, 0x33,
0xCC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xDE,
0x79, 0x7C, 0xF3, 0xCC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF,
0xFF, 0xF9, 0xFE, 0x7B, 0x7C, 0xF3, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1E, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x73, 0x3C, 0xF3, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0x00, 0x7C, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x73, 0x3C, 0xF3, 0xCF, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x01, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x70, 0x1C, 0xF3, 0xCF,
0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9E, 0x60,
0x1C, 0xF3, 0xCD, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0x1E, 0x67, 0x9C, 0xF8, 0x1C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x6F, 0xCC, 0xFC, 0x3E, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xF0, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xDA, 0x7F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xED, 0x7F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xE1, 0xF5, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF1, 0xFA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7E, 0xBF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x82, 0x7F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x83, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xFD, 0xF1, 0xFB, 0xE3, 0xF7, 0xCF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFB, 0xF9, 0xF7, 0xF3, 0xEF, 0xCF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC, 0xFB, 0xF9, 0xF7,
0xF3, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFC,
0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFD, 0xFC, 0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD, 0xF9, 0xFB, 0xF3, 0xF7, 0xEF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7B, 0xFC, 0xE7, 0xF9, 0xCF, 0xF3, 0x9F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFE, 0x0F, 0xFC, 0x1F,
0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFE, 0x0F,
0xFC, 0x1F, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x01, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0xF1, 0xFB, 0xE3, 0xF7, 0xC7, 0xEF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF9, 0xF3, 0xF3, 0xE7, 0xE7, 0xDF, 0xCF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFD, 0xF7, 0xF3, 0xEF, 0xE7, 0xDF, 0xCF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFD, 0xF7, 0xF3, 0xEF,
0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFD,
0xF7, 0xF3, 0xEF, 0xE7, 0xDF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFD, 0xFB, 0xFB, 0xF7, 0xF7, 0xEF, 0xCF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF7, 0xF9, 0xEF, 0xF3, 0xDF, 0xE7, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xF0, 0x7F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x1F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x9F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x12, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
};

PROGMEM const unsigned char red_layer_computer[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xC1,
0xC0, 0xC1, 0xF8, 0xC0, 0x27, 0xC3, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF,
0xFE, 0x01, 0x80, 0xC0, 0xC0, 0xF8, 0xC0, 0x27, 0x01, 0xC7, 0xBF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01,
0xFF, 0xFF, 0xFF, 0xFE, 0x79, 0x9C, 0xCF, 0xCC, 0xF2, 0xF9, 0xE7, 0x3C, 0xC3, 0xBF, 0xFF, 0xFF,
0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0x9C, 0xCF, 0xCC, 0xF6, 0x79, 0xE6, 0x7C, 0xCB,
0xBF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x80, 0xC1, 0xC0, 0xF6, 0x79,
0xE6, 0x7C, 0xC9, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0xFC, 0x83, 0xC1,
0xC1, 0xE7, 0x79, 0xE6, 0x7C, 0xCD, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x30, 0x3F, 0xFF, 0xFF, 0xFC,
0xF9, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x7C, 0xCC, 0xBF, 0xFF, 0xFF, 0xFF, 0x80, 0x67, 0xBF,
0xFF, 0xFF, 0xFE, 0x79, 0x9F, 0xCF, 0xCC, 0xE0, 0x39, 0xE6, 0x3C, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF,
0x80, 0xDF, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0x9F, 0xC0, 0xCE, 0x4F, 0xB9, 0xE7, 0x01, 0xCE, 0x3F,
0xFF, 0xFF, 0xDF, 0x81, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0x87, 0x9F, 0xC0, 0xCE, 0x4F, 0x99, 0xE7,
0x83, 0xCF, 0x3F, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xE1, 0xFF, 0x87, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xF9,
0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x81, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0xF8, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x0F, 0xC0, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x87, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00,
0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xC0, 0x00, 0x01, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x1C, 0xE0, 0x33, 0xCF, 0x1F, 0xFF,
0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x10, 0x18, 0x60, 0x33,
0xCC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x07, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xDE,
0x79, 0x7C, 0xF3, 0xCC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0x3F, 0xFF, 0xFF, 0xFF,
0xFF, 0xF9, 0xFE, 0x7B, 0x7C, 0xF3, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1E, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x73, 0x3C, 0xF3, 0xCE, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0x00, 0x7C, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x73, 0x3C, 0xF3, 0xCF, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0x01, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x70, 0x1C, 0xF3, 0xCF,
0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x9E, 0x60,
0x1C, 0xF3, 0xCD, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0x1E, 0x67, 0x9C, 0xF8, 0x1C, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFC, 0x7E, 0x6F, 0xCC, 0xFC, 0x3E, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xE3, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xE3,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFC, 0xF1, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0xFC, 0x71, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0x7E, 0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3E, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
...

This file has been truncated, please download it to see its full contents.

index.html

HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
	<!--link to icon -->
	<link rel="icon" type="image/png"  href="{{ url_for('static', filename='icon.png') }}">	
    <title>VLM-driven Airflow Analysis</title>
    <style>
        * { box-sizing: border-box; }
        
        body { 
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 
            background: #0f172a; 
            color: #f8fafc; 
            margin: 0; 
            padding: 1rem; 
        }
        
        .container { 
            max-width: 900px; 
            margin: 0 auto; 
            background: #1e293b; 
            padding: 1.5rem; 
            border-radius: 12px; 
            box-shadow: 0 10px 25px rgba(0,0,0,0.5); 
        }
        
        h1 { 
            margin-top: 0; 
            color: #38bdf8; 
            font-size: 1.5rem; 
            line-height: 1.25;
        }

        h3 {
            font-size: 1.1rem;
        }
        
        .status { 
            display: flex; 
            flex-wrap: wrap;
            gap: 0.5rem; 
            margin-bottom: 1.25rem; 
        }
        
        .badge { 
            background: #334155; 
            padding: 0.5rem 0.75rem; 
            border-radius: 6px; 
            font-size: 0.8rem; 
            border: 1px solid #475569; 
            flex: 1 1 auto;
            text-align: center;
        }
        
        .badge span { color: #4ade80; font-weight: bold; }
        
        .section-label { font-weight: bold; font-size: 0.9rem; margin-bottom: 0.5rem; display: block; }

        .form-group { display: flex; flex-direction: column; gap: 0.4rem; margin-bottom: 1.25rem; }
        
        /* Font-size 16px prevents iOS Safari auto-zoom on touch */
        select, textarea { 
            width: 100%; 
            background: #0f172a; 
            border: 1px solid #475569; 
            color: #fff; 
            padding: 0.75rem; 
            border-radius: 6px; 
            font-size: 1rem; 
            -webkit-appearance: none;
        }
        select:focus, textarea:focus { outline: none; border-color: #38bdf8; }
        textarea { resize: vertical; min-height: 70px; }

        /* Responsive 16 Frame Options Grid */
        .frame-grid {
            display: grid;
            grid-template-columns: repeat(4, 1fr);
            gap: 0.6rem;
            margin-bottom: 1.25rem;
        }

        .frame-card {
            background: #0f172a;
            border: 1px solid #334155;
            border-radius: 6px;
            padding: 0.75rem 0.6rem;
            cursor: pointer;
            transition: all 0.2s ease;
            text-align: left;
            position: relative;
            -webkit-tap-highlight-color: transparent;
        }

        .frame-card:hover {
            border-color: #38bdf8;
            background: #1e293b;
        }

        .frame-card.selected {
            border-color: #38bdf8;
            background: rgba(56, 189, 248, 0.12);
            box-shadow: 0 0 0 1px #38bdf8;
        }

        .frame-card .card-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 0.25rem;
        }

        .frame-card .frame-count {
            color: #38bdf8;
            font-weight: bold;
            font-size: 0.85rem;
        }

        .frame-card .frame-fps {
            font-size: 0.68rem;
            background: #334155;
            padding: 2px 4px;
            border-radius: 3px;
            color: #cbd5e1;
        }

        .frame-card .attr-title {
            font-size: 0.75rem;
            font-weight: 600;
            color: #f1f5f9;
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
        }

        .frame-card .attr-desc {
            font-size: 0.68rem;
            color: #94a3b8;
            margin-top: 2px;
            line-height: 1.15;
        }

        button { 
            background: #0284c7; 
            color: white; 
            border: none; 
            padding: 0.55rem 1rem; 
            font-size: 0.88rem; 
            font-weight: 600; 
            border-radius: 6px; 
            cursor: pointer; 
            transition: background 0.2s; 
            width: 100%; 
            min-height: 38px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        button:hover { background: #0369a1; }
        button:active { background: #075985; }
        button:disabled { background: #475569; cursor: not-allowed; }
        
        #output { 
            margin-top: 1.25rem; 
            background: #0f172a; 
            border: 1px solid #334155; 
            padding: 1rem; 
            border-radius: 6px; 
            white-space: pre-wrap; 
            min-height: 100px; 
            font-family: monospace; 
            font-size: 0.85rem;
            line-height: 1.5; 
            color: #e2e8f0; 
            overflow-x: auto;
        }
        
        .video-container { margin-top: 1.5rem; display: none; }
        .video-wrapper { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; border-radius: 6px; border: 1px solid #334155; background: #0f172a; }
        .video-wrapper video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; }

        .spinner { aspect-ratio: 1/1; display: inline-block; width: 16px; height: 16px; border: 2px solid rgba(255,255,255,.3); border-radius: 50%; border-top-color: #fff; animation: spin 1s ease-in-out infinite; margin-right: 8px; vertical-align: middle; }
        @keyframes spin { to { transform: rotate(360deg); } }

        /* Tablet Breakpoint */
        @media (max-width: 768px) {
            body { padding: 0.5rem; }
            .container { padding: 1rem; }
            .frame-grid { grid-template-columns: repeat(2, 1fr); }
            h1 { font-size: 1.35rem; }
        }

        /* Mobile Phone Breakpoint */
        @media (max-width: 480px) {
            .frame-grid { grid-template-columns: 1fr; }
            .badge { width: 100%; text-align: left; }
            .status { flex-direction: column; }
            button {
                font-size: 0.82rem;
                padding: 0.5rem 0.75rem;
                min-height: 38px;
            }		
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>VLM-driven Ceiling Fan Airflow Analysis with Unity</h1>
        
        <div class="status">
            <div class="badge">RPLIDAR A1 UDP: <span>Streaming (5005)</span></div>
            <div class="badge">Unity Frame Server: <span>Active (8080)</span></div>
            <div class="badge">VLM Docker Container : <span>Active (9001)</span></div>
        </div>

        <div class="form-group">
            <label for="modelSelect" class="section-label">Select VLM model:</label>
            <select id="modelSelect">
                <option value="qwen2_5_vl_7b_instruct" selected>Qwen2.5-VL-7B-Instruct</option>
                <option value="qwen3_vl_8b_instruct">Qwen3-VL-8B-Instruct</option>
            </select>
        </div>

        <span class="section-label">Select the ceiling fan airflow state represented by the frame number:</span>
        <div class="frame-grid" id="frameGrid">
            <!-- 16 Configurable Options -->
            <div class="frame-card" selected-frame="1" dispersion-state="1" fan-strength="1">
                <div class="card-header"><span class="frame-count">1st Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 1</div>
                <div class="attr-desc">Fan strength: 1</div>
            </div>
            <div class="frame-card" selected-frame="2" dispersion-state="2" fan-strength="1">
                <div class="card-header"><span class="frame-count">2nd Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 2</div>
                <div class="attr-desc">Fan strength: 1</div>
            </div>
            <div class="frame-card" selected-frame="3" dispersion-state="3" fan-strength="1">
                <div class="card-header"><span class="frame-count">3rd Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 3</div>
                <div class="attr-desc">Fan strength: 1</div>
            </div>
            <div class="frame-card" selected-frame="4" dispersion-state="4" fan-strength="1">
                <div class="card-header"><span class="frame-count">4th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 4</div>
                <div class="attr-desc">Fan strength: 1</div>
            </div>
            <div class="frame-card" selected-frame="5" dispersion-state="1" fan-strength="2">
                <div class="card-header"><span class="frame-count">5th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 1</div>
                <div class="attr-desc">Fan strength: 2</div>
            </div>
            <div class="frame-card" selected-frame="6" dispersion-state="2" fan-strength="2">
                <div class="card-header"><span class="frame-count">6th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 2</div>
                <div class="attr-desc">Fan strength: 2</div>
            </div>
            <div class="frame-card" selected-frame="7" dispersion-state="3" fan-strength="2">
                <div class="card-header"><span class="frame-count">7th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 3</div>
                <div class="attr-desc">Fan strength: 2</div>
            </div>
            <div class="frame-card" selected-frame="8" dispersion-state="4" fan-strength="2">
                <div class="card-header"><span class="frame-count">8th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 4</div>
                <div class="attr-desc">Fan strength: 2</div>
            </div>
            <div class="frame-card" selected-frame="9" dispersion-state="1" fan-strength="3">
                <div class="card-header"><span class="frame-count">9th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 1</div>
                <div class="attr-desc">Fan strength: 3</div>
            </div>
            <div class="frame-card" selected-frame="10" dispersion-state="2" fan-strength="3">
                <div class="card-header"><span class="frame-count">10th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 2</div>
                <div class="attr-desc">Fan strength: 3</div>
            </div>
            <div class="frame-card" selected-frame="11" dispersion-state="3" fan-strength="3">
                <div class="card-header"><span class="frame-count">11th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 3</div>
                <div class="attr-desc">Fan strength: 3</div>
            </div>
            <div class="frame-card" selected-frame="12" dispersion-state="4" fan-strength="3">
                <div class="card-header"><span class="frame-count">12th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 4</div>
                <div class="attr-desc">Fan strength: 3</div>
            </div>
            <div class="frame-card" selected-frame="13" dispersion-state="1" fan-strength="4">
                <div class="card-header"><span class="frame-count">13th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 1</div>
                <div class="attr-desc">Fan strength: 4</div>
            </div>
            <div class="frame-card" selected-frame="14" dispersion-state="2" fan-strength="4">
                <div class="card-header"><span class="frame-count">14th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 2</div>
                <div class="attr-desc">Fan strength: 4</div>
            </div>
            <div class="frame-card" selected-frame="15" dispersion-state="3" fan-strength="4">
                <div class="card-header"><span class="frame-count">15th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 3</div>
                <div class="attr-desc">Fan strength: 4</div>
            </div>
            <div class="frame-card" selected-frame="16" dispersion-state="4" fan-strength="4">
                <div class="card-header"><span class="frame-count">16th Frame</span><span class="frame-fps">1 FPS</span></div>
                <div class="attr-title">Dispersion state: 4</div>
                <div class="attr-desc">Fan strength: 4</div>
            </div>			

        </div>

        <div class="form-group">
            <label for="prompt" class="section-label">Enter VLM prompt:</label>
            <textarea id="prompt" rows="6" placeholder="Please select a ceiling fan airflow state to provide an image (frame) to the selected VLM model! You can use the generated prompt or enter a specific query."></textarea>
        </div>
        
        <button id="triggerBtn" onclick="runAnalysis()">Obtain Unity Frames & Analyze</button>

        <h3>VLM Analysis Output</h3>
        <div id="output">By clicking the button above, initiate capturing frame instances from Unity and run model inference on the selected frame of the produced Unity video...</div>

        <!-- Video Player Section -->
        <div id="videoContainer" class="video-container">
            <h3>Recorded Unity Frame Sequence (Video)</h3>
            <div class="video-wrapper">
				<video id="videoFrameCon" controls muted playsinline >
				  <source id="videoFrame" src="" type="video/mp4">
				</video>
            </div>
        </div>
    </div>

    <script>
	    const prompt_container = document.getElementById('prompt');
	    // Define the dispersion states' vertical and horizontal angle conditions.
		const dispersion_angles = [
			[90, 180],
			[60, 90],
			[30, 0],
			[0, 180]
		];
		// Given frame attributes.
        let givenFrameNumber = 0;
		let givenFrameTitle = "";
        let givenFanStrength = 0;
		let givenDispersionState = 0;
		let vlm_prompt = "";

        // Frame state option configurations.
        document.querySelectorAll('.frame-card').forEach(card => {
            card.addEventListener('click', () => {
                document.querySelectorAll('.frame-card').forEach(c => c.classList.remove('selected'));
                card.classList.add('selected');
                givenFrameNumber = parseInt(card.getAttribute('selected-frame'), 10);
				givenFrameTitle = card.querySelector(".frame-count")?.innerText;
                givenFanStrength = parseInt(card.getAttribute('fan-strength'), 10);
                givenDispersionState = parseInt(card.getAttribute('dispersion-state'), 10);
				// Update the VLM prompt (input) according to the given ceiling fan airflow parameters.
				vlm_prompt = `The picture represents a ceiling fan airflow simulation. Blue trails indicate lower-energy, while red indicates higher-energy. Orange points represent obstacles in the room. Ceiling fans have four fan strength levels and are able to move 180 vertically and 360 horizontally. In the frame, fan strength is ${givenFanStrength}, and the fans are at ${dispersion_angles[givenDispersionState-1][0]} vertical and ${dispersion_angles[givenDispersionState-1][1]} horizontal. Based on the room layout and airflow, suggest the optimal ceiling fan strength and angles for efficient cooling.`
                prompt_container.innerText = vlm_prompt;
            });
        });

        async function runAnalysis() {
		    // Pass the necessary inference and prompt information to the backend (Flask server).
            const btn = document.getElementById('triggerBtn');
            const output = document.getElementById('output');
            const videoContainer = document.getElementById('videoContainer');
            const videoFrame = document.getElementById('videoFrame');
            const videoFrameCon = document.getElementById('videoFrameCon');
            const model = document.getElementById('modelSelect').value;

            btn.disabled = true;
            btn.innerHTML = `<span class="spinner"></span> Analyzing ceiling fan airflow state [${givenFrameTitle}] with ${model}...`;
            output.innerText = `Requesting frame instances from Unity...\nThis may take a few seconds.`;
            
            videoContainer.style.display = "none";
            videoFrame.src = "";

            try {
			    // Make an HTTP POST request to the Flask server to pass inference variables.
                const response = await fetch('/api/analyze', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({
                        inference_info: {					
							prompt: vlm_prompt,
							model: model,
							selected_frame: givenFrameNumber
						}
                    })
                });

                const data = await response.json();
                if (data.status === 'success') {
                    output.innerText = data.result;
                    // Create the file path according to the Flask server rendering requirements.
					const video_file_name = data.video_file_name;
					const videoSrc = `/static/unity_airflow_videos/${video_file_name}`;
                    videoFrame.src = videoSrc;
                    videoContainer.style.display = "block";
					// Play the dynamically updated video source.
					videoFrameCon.load();
					videoFrameCon.play().catch(err => console.log("Autoplay blocked:", err));
                } else {
                    output.innerText = "Error: " + data.message;
                }
            } catch (err) {
                output.innerText = "Request Failed: " + err.message;
            } finally {
                btn.disabled = false;
                btn.innerHTML = 'Obtain Unity Frames & Analyze';
            }
        }
    </script>
</body>
</html>

app.py

Python
# A study on VLM-driven ceiling fan airflow analysis w/ Unity
#
# Dragonwing IQ-9075 EVK
#
# By Kutluhan Aktar


import os
import cv2
import time
import numpy as np
import subprocess
import json
import socket
import base64
from threading import Thread
import requests
from flask import Flask, render_template, jsonify, request
from rplidar import RPLidar

class unity_lidar_vlm_data_hub():
    def __init__(self):
        # Declare the necessary RPLIDAR A1 lidar information, including the port the Unity application listening to obtain the generated lidar points. 
        self.rplidar = {"port": "/dev/ttyUSB0", "udp_port": 5005, "active": True}
        # Declare the necessary Unity application information, including its lightweight HTTP server for frame generation.
        unity_ip = "0.0.0.0"
        self.unity = {"ip": unity_ip, "get_frame_api": f"http://{unity_ip}:8080/get_video_frames/"}
        # Declare the API endpoint for the Qualcomm LLM/VLM Docker container.
        self.qualcomm_vlm_port = 9001
        self.qualcomm_vlm_api = f"http://localhost:{self.qualcomm_vlm_port}/v1/chat/completions"
        
    def lidar_point_generator(self):
        # Obtain the scan points continuously generated by the RPLIDAR A1.
        try:
            lidar = RPLidar(self.rplidar["port"])
            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            print("RPLIDAR A1 streaming data to {}:{}...".format(self.unity["ip"], self.rplidar["udp_port"]))
            # Modify the scan points and pass them to the associated WebSocket.
            for scan in lidar.iter_scans():
                if not self.rplidar["active"]:
                    break
                points = [{"a": round(deg, 2), "d": round(dist, 2)} for _, deg, dist in scan]
                payload = json.dumps({"pts": points}).encode('utf-8')
                sock.sendto(payload, (self.unity["ip"], self.rplidar["udp_port"]))
        # Debugging and stopping the point generation.        
        except Exception as e:
            print(f"[RPLIDAR A1 ERROR] {e}")
        finally:
            print("[RPLIDAR A1] Stopping motor and disconnecting...")
            try:
                lidar.stop()
                lidar.stop_motor()
                lidar.disconnect()
            except:
                pass
    
    def run_point_generator(self):
        # Declare and initialize a Python thread for the continuous RPLIDAR A1 scan point generation.
        self.rplidar_thread = Thread(target=self.lidar_point_generator, daemon=True)
        self.rplidar_thread.start()
        
    def halt_point_generator(self):
        self.rplidar["active"] = False
        if hasattr(self, 'rplidar_thread'):
            self.rplidar_thread.join(timeout=3)       
 
    def obtain_frames_from_unity(self, frame_num, fps, save_as_video):
        # Make an HTTP GET request to the provided HTTP server by the Unity application to obtain consecutive video frames.
        params = {"count": frame_num, "fps": fps}
        response = requests.get(self.unity["get_frame_api"], params=params, timeout=240)
        # If successfull, pass the obtained frames in the JSON format.
        if response.status_code == 200:
            raw_frames = response.json().get("frames", [])
            print("Video frames obtained from the Unity app! Total: {}".format(len(raw_frames)))
            # Save the received frames as a video if enabled.
            if save_as_video and len(raw_frames) > 0:
                self.save_frames_as_video(raw_frames, fps)
            return [f"data:image/jpeg;base64,{f}" for f in raw_frames]
        else:
            raise Exception(f"Unity frame request failed: {response.status_code}")
        
    def save_frames_as_video(self, base64_frames, fps):
        # If requested, save the obtained frames as a video file for further inspection.
        try:
            timestamp = int(time.time())
            self.video_file_name = f"capture_{timestamp}.mp4"
            file_path = os.path.join("./static/unity_airflow_videos", self.video_file_name)
            temp_file_path = "./static/unity_airflow_videos/temp.mp4"
            # Decode the first frame to get dimensions.
            first_frame_bytes = base64.b64decode(base64_frames[0])
            first_frame_np = np.frombuffer(first_frame_bytes, dtype=np.uint8)
            first_img = cv2.imdecode(first_frame_np, cv2.IMREAD_COLOR)
            height, width, _ = first_img.shape
            # Initialize the VideoWriter class with the mp4v codec.
            fourcc = cv2.VideoWriter_fourcc(*'mp4v')
            video_writer = cv2.VideoWriter(temp_file_path, fourcc, fps, (width, height))
            # Process each received Unity application frame as a temporary file.
            for b64_str in base64_frames:
                img_bytes = base64.b64decode(b64_str)
                img_np = np.frombuffer(img_bytes, dtype=np.uint8)
                img = cv2.imdecode(img_np, cv2.IMREAD_COLOR)
                if img is not None:
                    video_writer.write(img)
            # Complete the temporary file saving process.
            video_writer.release()
            # Convert the saved temporary file in the mp4v codec to the H264 codec in order to make it browser-friendly.
            cmd = ['ffmpeg', '-y', '-i', temp_file_path, '-vcodec', 'libx264', '-pix_fmt', 'yuv420p', file_path]
            subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
            # Remove the temporary file.
            if os.path.exists(temp_file_path):
                os.remove(temp_file_path)           
            print(f"Unity airflow analysis video saved successfully: {file_path}")
        except Exception as e:
            print(f"Failed to save video: {e}")

    def vlm_airflow_analysis(self, prompt, vlm_model,  target_frame):
        # Request frames from the Unity application.
        frames = self.obtain_frames_from_unity(frame_num=16, fps=1, save_as_video=True)
        # Generate the VLM input with the obtained Unity frames.
        vlm_input = [{"type": "text", "text": prompt}]
        # Only pass the requested frame [1 - 16] to avoid model context buffer overflow, which is 2048.
        vlm_input.append({
            "type": "image_url",
            "image_url": {"url": frames[target_frame-1]}
        })
        payload = {
            "model": vlm_model,
            "messages": [{"role": "user", "content": vlm_input}]
        }
        # Make an HTTP POST request to the provided Qualcomm Docker container API.
        response = requests.post(self.qualcomm_vlm_api, json=payload, timeout=240)
        if response.status_code == 200:
            return response.json()["choices"][0]["message"]["content"]
        else:
            raise Exception(f"Model endpoint returned {response.status_code}: {response.text}")
 
    def flask_app_config(self, app):
        # Integrate the custom Flask app to this class.
        @app.route('/')
        def home():
            return render_template('index.html', unity_ip=self.unity["ip"])
        @app.route('/api/analyze', methods=['POST'])
        def trigger_analysis():
            data = request.get_json() or {}
            inference_info = data.get('inference_info')
            try:
                result = self.vlm_airflow_analysis(inference_info["prompt"], inference_info["model"], inference_info["selected_frame"])
                return jsonify({"status": "success", "result": result, "video_file_name": self.video_file_name})
            except Exception as e:
                return jsonify({"status": "error", "message": str(e)}), 500        
            
# Declare the Flask application, which will serve as the VLM user inferface on the Bluetooth-enabled Android application.
flask_app = Flask(__name__)            
        
# Define the unity_lidar_vlm_data_hub class object.        
unity_lidar_vlm_data_hub_obj = unity_lidar_vlm_data_hub()

# Integrate the class object to the given Flask application.
unity_lidar_vlm_data_hub_obj.flask_app_config(flask_app)

# Main thread fo VLM-based airflow analysis on Unity application frames.
if __name__ == "__main__":
    # Start the RPLIDAR A1 scan point generator.
    unity_lidar_vlm_data_hub_obj.run_point_generator()
    # Execute the given Flask app and halt the point generator once the app stopped working.
    try:
        flask_app.run(host='0.0.0.0', port=5000, debug=False)
    finally:
        unity_lidar_vlm_data_hub_obj.halt_point_generator()
        

CameraController.cs

C#
using UnityEngine;
using UnityEngine.InputSystem;

public class CameraController : MonoBehaviour
{
    [Header("Movement Settings")]
    public float moveSpeed = 15.0f;
    public float shiftMultiplier = 2.5f;

    [Header("Zoom Settings")]
    public float zoomSpeed = 20.0f;
    public float minZoom = 2.0f;
    public float maxZoom = 80.0f;

    [Header("Elevation Settings")]
    public float verticalSpeed = 10.0f;

    private Camera cam;

    void Start()
    {
        cam = GetComponent<Camera>();
        if (cam == null)
        {
            cam = Camera.main;
        }
    }

    void Update()
    {
        if (Keyboard.current == null) return;

        HandleMovement();
        HandleZoom();
    }

    private void HandleMovement()
    {
        // Check Shift Key for speed boost
        bool isShiftPressed = Keyboard.current.leftShiftKey.isPressed;
        float currentSpeed = isShiftPressed ? moveSpeed * shiftMultiplier : moveSpeed;

        Vector3 moveDirection = Vector3.zero;

        // A / D or Left / Right Arrows (Pan Left / Right)
        if (Keyboard.current.aKey.isPressed || Keyboard.current.leftArrowKey.isPressed) moveDirection += Vector3.left;
        if (Keyboard.current.dKey.isPressed || Keyboard.current.rightArrowKey.isPressed) moveDirection += Vector3.right;

        // W / S or Up / Down Arrows (Pan Forward / Backward across world Z-axis)
        if (Keyboard.current.wKey.isPressed || Keyboard.current.upArrowKey.isPressed) moveDirection += Vector3.forward;
        if (Keyboard.current.sKey.isPressed || Keyboard.current.downArrowKey.isPressed) moveDirection += Vector3.back;

        // Apply movement relative to world coordinates so angle doesn't affect speed
        transform.position += moveDirection.normalized * currentSpeed * Time.deltaTime;

        // R / F (Elevation Up / Down across world Y-axis)
        if (Keyboard.current.rKey.isPressed)
        {
            transform.position += Vector3.up * verticalSpeed * Time.deltaTime;
        }
        if (Keyboard.current.fKey.isPressed)
        {
            transform.position += Vector3.down * verticalSpeed * Time.deltaTime;
        }
    }

    private void HandleZoom()
    {
        // Q (Zoom In) / E (Zoom Out)
        float zoomDelta = 0f;

        if (Keyboard.current.qKey.isPressed) zoomDelta -= 1f;
        if (Keyboard.current.eKey.isPressed) zoomDelta += 1f;

        if (cam.orthographic)
        {
            cam.orthographicSize += zoomDelta * zoomSpeed * Time.deltaTime;
            cam.orthographicSize = Mathf.Clamp(cam.orthographicSize, minZoom, maxZoom);
        }
        else
        {
            cam.fieldOfView += zoomDelta * zoomSpeed * Time.deltaTime;
            cam.fieldOfView = Mathf.Clamp(cam.fieldOfView, minZoom, maxZoom);
        }
    }
}

LidarReceiver.cs

C#
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine;

[RequireComponent(typeof(ParticleSystem))]
public class LidarReceiver : MonoBehaviour 
{
    [Header("Network Settings")]
    public int port = 5005;

    [Header("Scaling & Visuals")]
    public float distanceScale = 5.0f;
    public float particleSize = 0.4f;
    public Color particleColor = Color.cyan;

    [Header("3D Vertical Wall Settings")]
    [Tooltip("Total vertical height of the wall (in meters).")]
    public float wallHeight = 4.0f; 
    
    [Tooltip("Number of vertical particles stacked at each LiDAR point to visualize the wall height.")]
    public int verticalStackCount = 5; 
    
    public float wallColliderRadius = 0.4f;

    private UdpClient udpClient;
    private ParticleSystem particleSys;
    private ParticleSystem.Particle[] particles;
    private readonly ConcurrentQueue<Vector3[]> scanQueue = new ConcurrentQueue<Vector3[]>();

    private GameObject colliderHolder;
    private readonly List<CapsuleCollider> colliderPool = new List<CapsuleCollider>();

    [System.Serializable]
    public class PointData { public float a; public float d; }

    [System.Serializable]
    public class ScanPacket { public PointData[] pts; }

    void Start() 
    {
        particleSys = GetComponent<ParticleSystem>();
        SetupParticleSystem();

        colliderHolder = new GameObject("LiDAR_3D_Vertical_Walls");
        colliderHolder.transform.SetParent(transform, false);

        try 
        {
            udpClient = new UdpClient(port);
            udpClient.BeginReceive(OnDataReceived, null);
            Debug.Log($"<color=green>[LIDAR] Listening on Port {port}</color>");
        }
        catch (Exception e)
        {
            Debug.LogError($"[LIDAR] Bind Error: {e.Message}");
        }
    }

    void Update()
    {
        if (scanQueue.TryDequeue(out Vector3[] latestPositions))
        {
            RenderExtrudedParticles(latestPositions);
            UpdateCapsuleColliders(latestPositions);
        }
    }

    // 1. Visually extrude particles vertically so you can see the 3D wall
    private void RenderExtrudedParticles(Vector3[] positions)
    {
        int totalParticlesNeeded = positions.Length * verticalStackCount;

        if (particles == null || particles.Length < totalParticlesNeeded)
        {
            particles = new ParticleSystem.Particle[totalParticlesNeeded];
        }

        Vector3 origin = transform.position;
        float yStep = wallHeight / Mathf.Max(1, verticalStackCount - 1);
        float yStart = -wallHeight * 0.5f; // Center wall vertically around 0

        int particleIdx = 0;
        for (int i = 0; i < positions.Length; i++)
        {
            for (int y = 0; y < verticalStackCount; y++)
            {
                Vector3 pos = positions[i];
                pos.y = yStart + (y * yStep);

                particles[particleIdx].position = origin + pos;
                particles[particleIdx].startColor = particleColor;
                particles[particleIdx].startSize = particleSize;
                particles[particleIdx].remainingLifetime = 1000f;
                particles[particleIdx].velocity = Vector3.zero;

                particleIdx++;
            }
        }

        particleSys.SetParticles(particles, totalParticlesNeeded);
    }

    // 2. Generate Capsule Colliders stretched on the Y-axis for airflow collision
    private void UpdateCapsuleColliders(Vector3[] positions)
    {
        while (colliderPool.Count < positions.Length)
        {
            GameObject colObj = new GameObject($"WallColumn_{colliderPool.Count}");
            colObj.transform.SetParent(colliderHolder.transform, false);
            
            CapsuleCollider cc = colObj.AddComponent<CapsuleCollider>();
            cc.direction = 1; // 1 = Y-axis direction
            colliderPool.Add(cc);
        }

        Vector3 origin = transform.position;

        for (int i = 0; i < colliderPool.Count; i++)
        {
            if (i < positions.Length)
            {
                colliderPool[i].gameObject.SetActive(true);
                
                // Position capsule at center of the wall height
                colliderPool[i].transform.position = origin + positions[i];
                
                // Configure physical column dimensions
                colliderPool[i].height = wallHeight;
                colliderPool[i].radius = wallColliderRadius;
            }
            else
            {
                colliderPool[i].gameObject.SetActive(false);
            }
        }
    }

    private void SetupParticleSystem()
    {
        var main = particleSys.main;
        main.loop = false;
        main.playOnAwake = false;
        main.startSpeed = 0f;
        main.startLifetime = 1000f;
        main.maxParticles = 20000;
        main.simulationSpace = ParticleSystemSimulationSpace.World;

        var emission = particleSys.emission;
        emission.enabled = false;

        var shape = particleSys.shape;
        shape.enabled = false;

        var collision = particleSys.collision;
        collision.enabled = false;

        var renderer = GetComponent<ParticleSystemRenderer>();
        if (renderer.sharedMaterial == null)
        {
            Shader defaultShader = Shader.Find("Particles/Standard Unlit") ?? Shader.Find("Sprites/Default");
            if (defaultShader != null)
            {
                renderer.sharedMaterial = new Material(defaultShader);
            }
        }
    }

    private void OnDataReceived(IAsyncResult ar) 
    {
        try 
        {
            if (udpClient == null || udpClient.Client == null || !udpClient.Client.IsBound) return;

            IPEndPoint ip = new IPEndPoint(IPAddress.Any, port);
            byte[] bytes = udpClient.EndReceive(ar, ref ip);
            string json = Encoding.UTF8.GetString(bytes);

            ScanPacket packet = JsonUtility.FromJson<ScanPacket>(json);
            if (packet != null && packet.pts != null && packet.pts.Length > 0)
            {
                Vector3[] parsedPositions = new Vector3[packet.pts.Length];
                for (int i = 0; i < packet.pts.Length; i++)
                {
                    float rad = packet.pts[i].a * Mathf.Deg2Rad;
                    float dist = (packet.pts[i].d / 1000f) * distanceScale;
                    
                    parsedPositions[i] = new Vector3(Mathf.Sin(rad) * dist, 0f, Mathf.Cos(rad) * dist);
                }
                scanQueue.Enqueue(parsedPositions);
            }

            udpClient.BeginReceive(OnDataReceived, null);
        }
        catch (ObjectDisposedException) { }
        catch (Exception e)
        {
            Debug.LogError($"[LIDAR] Receive Error: {e.Message}");
        }
    }

    void OnDestroy() 
    {
        if (udpClient != null)
        {
            udpClient.Close();
            udpClient = null;
        }
    }
}

LidarThreadDispatcher.cs

C#
using System;
using System.Collections.Generic;
using UnityEngine;

public class LidarThreadDispatcher : MonoBehaviour
{
    private static readonly Queue<Action> ExecutionQueue = new Queue<Action>();
    private static LidarThreadDispatcher _instance;

    void Awake()
    {
        if (_instance == null) _instance = this;
    }

    void Update()
    {
        lock (ExecutionQueue)
        {
            while (ExecutionQueue.Count > 0)
            {
                ExecutionQueue.Dequeue()?.Invoke();
            }
        }
    }

    public static void ExecuteOnMainThread(Action action)
    {
        if (action == null) return;
        lock (ExecutionQueue)
        {
            ExecutionQueue.Enqueue(action);
        }
    }
}

UnityMultiFrameServer.cs

C#
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using UnityEngine;

public class UnityMultiFrameServer : MonoBehaviour
{
    [Header("Server Configuration")]
    public int port = 8080;

    [Header("Capture Settings")]
    public Camera captureCamera;
    public int targetWidth = 640;
    public int targetHeight = 360;
    [Range(10, 100)] public int jpegQuality = 70;

    private HttpListener httpListener;
    private RenderTexture renderTexture;
    private Texture2D texture2D;
    private Rect readRect;

    // Recording task state
    private bool isRecordingRequested = false;
    private int requestedFrameCount = 72;
    private float requestedFps = 15f;
    private TaskCompletionSource<List<string>> recordingTaskSource;

    void Start()
    {
        if (captureCamera == null) captureCamera = Camera.main;

        renderTexture = new RenderTexture(targetWidth, targetHeight, 24, RenderTextureFormat.ARGB32);
        texture2D = new Texture2D(targetWidth, targetHeight, TextureFormat.RGB24, false);
        readRect = new Rect(0, 0, targetWidth, targetHeight);

        StartHttpServer();
    }

    private void StartHttpServer()
    {
        httpListener = new HttpListener();
        httpListener.Prefixes.Add($"http://*:{port}/get_video_frames/");
        httpListener.Start();
        Task.Run(ListenForRequests);
        Debug.Log($"Unity Video Server listening on http://localhost:{port}/get_video_frames/");
    }

    private async Task ListenForRequests()
    {
        while (httpListener != null && httpListener.IsListening)
        {
            try
            {
                var context = await httpListener.GetContextAsync();
                
                // Parse parameters from query: ?count=72&fps=15
                string countParam = context.Request.QueryString["count"];
                string fpsParam = context.Request.QueryString["fps"];

                if (!int.TryParse(countParam, out requestedFrameCount)) requestedFrameCount = 72;
                if (!float.TryParse(fpsParam, out requestedFps)) requestedFps = 15f;

                // Trigger Main-Thread sequence recording
                recordingTaskSource = new TaskCompletionSource<List<string>>();
                isRecordingRequested = true;

                // Wait until frame sequence finishes capturing
                List<string> base64Frames = await recordingTaskSource.Task;

                // Construct JSON response array
                string jsonResponse = "{\"frames\":[\"" + string.Join("\",\"", base64Frames) + "\"]}";
                byte[] buffer = System.Text.Encoding.UTF8.GetBytes(jsonResponse);

                context.Response.ContentType = "application/json";
                context.Response.ContentLength64 = buffer.Length;
                await context.Response.OutputStream.WriteAsync(buffer, 0, buffer.Length);
                context.Response.OutputStream.Close();
            }
            catch (ObjectDisposedException)
            {
                // Expected when httpListener.Stop() or Close() is called during shutdown
                break;
            }
            catch (HttpListenerException ex) when (ex.ErrorCode == 995) // ERROR_OPERATION_ABORTED
            {
                // Expected when listener stops while waiting
                break;
            }
            catch (Exception ex)
            {
                Debug.LogError($"HTTP Server Error: {ex.Message}");
            }
        }
    }

    void Update()
    {
        if (isRecordingRequested)
        {
            isRecordingRequested = false;
            StartCoroutine(CaptureFrameSequence(requestedFrameCount, requestedFps));
        }
    }

    private IEnumerator CaptureFrameSequence(int count, float fps)
    {
        List<string> frames = new List<string>(count);
        float interval = 1.0f / fps;

        for (int i = 0; i < count; i++)
        {
            yield return new WaitForEndOfFrame();

            // Render camera frame
            RenderTexture prevActive = RenderTexture.active;
            captureCamera.targetTexture = renderTexture;
            captureCamera.Render();

            RenderTexture.active = renderTexture;
            texture2D.ReadPixels(readRect, 0, 0);
            texture2D.Apply();

            captureCamera.targetTexture = null;
            RenderTexture.active = prevActive;

            // Encode to Base64 JPEG string
            byte[] jpegBytes = texture2D.EncodeToJPG(jpegQuality);
            string base64Str = Convert.ToBase64String(jpegBytes);
            frames.Add(base64Str);

            // Wait for interval before grabbing next frame
            yield return new WaitForSeconds(interval);
        }

        recordingTaskSource?.SetResult(frames);
    }

    private void OnDestroy()
    {
        if (httpListener != null)
        {
            if (httpListener.IsListening)
            {
                httpListener.Stop();
            }
            httpListener.Close();
            httpListener = null;
        }

        if (renderTexture != null)
        {
            renderTexture.Release();
            Destroy(renderTexture);
        }

        if (texture2D != null)
        {
            Destroy(texture2D);
        }
    }
}

A-study-on-VLM-driven-ceiling-fan-airflow-analysis-w-Unity

Credits

Kutluhan Aktar
88 projects • 355 followers
🤖 Independent Researcher | Product, AI, and Software Developer | Maker | Proof-of-Concept Solutions

Comments