Node.JS createWriteStream decode problem with Arduino ESP32-CAM HTTP POST

I am Wong, nice to meet you all, I definitely need your help to find the solution to my problem. I had spent 3 days with it and still unable to find a solution..

Long story short, I followed the Arduino AI development guide on DIY AI Camera with Google Vision & ESP32 CAM Module to build a Node.JS server to receive HTTP POST jpeg data.

When I print out the jpeg file size in Arduino IDE, it has the same file size when compared to my PC (Server side), which appears to be fine.

However, the problem is that the data I send out in Arduino ESP32-CAM cannot match the data received on the server side. The JPEG file cannot be opened by any software, and if I open the JPEG with Notepad++ with Encoding: UTF-8, the JPEG data seems to be garbage.


Tried to change the console.log to below, but the terminal screen also display garbage data

console.log(data.toString())

I hope someone can provide me guidance on which part of my program is wrong, I had spent 3 days with it and I cannot find out where the problem is. This should be a summer project for high school students, everything is ready except the JPEG file cannot transmit to PC (Server side) probably.

Thank you for your help! Much Appreciated..

This is my Node.JS Server Code hosted on my computer

var fs = require('fs');
const http = require('http');
const server = http.createServer();
const filePath = './resources/test.jpeg';

server.on('request', (request, response)=>{
    if(request.method == 'POST' && request.url === "/imageUpdate"){
        console.log(`--Trasmission Start--`)
        var ImageFile = fs.createWriteStream(filePath, {encoding: 'utf8'});
        request.on('data', function(data){
            console.log(data)
            ImageFile.write(data);
        });
 
        request.on('end',async function(){
            console.log(`--Trasmission End--`)
            ImageFile.end();
            const labels = await labelAPI();
            response.writeHead(200, {'Content-Type' : 'application/json'});
            response.end(JSON.stringify(labels));
        });
 
    }else{
        console.log("error");
        response.writeHead(405, {'Content-Type' : 'text/plain'});
        response.end();
    }
});
 
async function labelAPI() {
  var o = [];
  // Imports the Google Cloud client library
  const vision = require('@google-cloud/vision');
 
  // Creates a client
  const client = new vision.ImageAnnotatorClient();
 
  // Performs label detection on the image file
  const [result] = await client.labelDetection(filePath);
  const labels = result.labelAnnotations;
  
  labels.forEach(label => {
    o.push({description: label.description, score: label.score});
  });
  return o;
}
 
const port = 8888;
server.listen(port)
console.log(`Listening at ${port}`)

This is the Arduino program code runs on ESP32-CAM

#include "esp_camera.h"
#include <TJpg_Decoder.h>
#include <SPI.h>
#include <TFT_eSPI.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
/*#include <Base64.cpp>
#include <Base64.h>*/

#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27

#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22

#define GFXFF 1
#define FSB9 &FreeSerifBold9pt7b

TFT_eSPI tft = TFT_eSPI();

const char* ssid = "SSID";
const char* password = "123456";
const unsigned long timeout = 30000;  // 30 seconds

const int buttonPin = 4;  // the number of the pushbutton pin
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers
bool isNormalMode = true;

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
}

bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap) {
  // Stop further decoding as image is running off bottom of screen
  if (y >= tft.height()) return 0;

  // This function will clip the image block rendering automatically at the TFT boundaries
  tft.pushImage(x, y, w, h, bitmap);

  // This might work instead if you adapt the sketch to use the Adafruit_GFX library
  // tft.drawRGBBitmap(x, y, bitmap, w, h);

  // Return
  return 1;
}


void setup() {
  Serial.begin(115200);
  delay(1000);

  Serial.println();
  pinMode(buttonPin, INPUT);

  Serial.println("INIT DISPLAY");
  tft.begin();
  tft.setRotation(3);
  tft.setTextColor(0xFFFF, 0x0000);
  tft.fillScreen(TFT_YELLOW);
  tft.setFreeFont(FSB9);

  TJpgDec.setJpgScale(1);
  TJpgDec.setSwapBytes(true);
  TJpgDec.setCallback(tft_output);

  Serial.println("INIT CAMERA");
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  //init with high specs to pre-allocate larger buffers
  if (psramFound()) {
    config.frame_size = FRAMESIZE_QVGA;  // 320x240
    config.jpeg_quality = 5;
    config.fb_count = 1;
  } else {
    config.frame_size = FRAMESIZE_QVGA;
    config.jpeg_quality = 5;
    config.fb_count = 1;
  }

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  initWiFi();
}


void buttonEvent() {
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
        isNormalMode = !isNormalMode;

        //Additional Code
        if (!isNormalMode)
          sendingImage();
        //
      }
    }
  }
  lastButtonState = reading;
}

camera_fb_t* capture() {
  camera_fb_t* fb = NULL;
  esp_err_t res = ESP_OK;
  fb = esp_camera_fb_get();
  return fb;
}

void showingImage() {
  camera_fb_t* fb = capture();
  if (!fb || fb->format != PIXFORMAT_JPEG) {
    Serial.println("Camera capture failed");
    esp_camera_fb_return(fb);
    return;
  } else {
    TJpgDec.drawJpg(0, 0, (const uint8_t*)fb->buf, fb->len);
    esp_camera_fb_return(fb);
  }
}

void parsingResult(String response) {
  DynamicJsonDocument doc(1024);
  deserializeJson(doc, response);
  JsonArray array = doc.as<JsonArray>();
  int yPos = 4;
  for (JsonVariant v : array) {
    JsonObject object = v.as<JsonObject>();
    const char* description = object["description"];
    float score = object["score"];
    String label = "";
    label += description;
    label += ":";
    label += score;
    tft.drawString(label, 8, yPos, GFXFF);
    yPos += 16;
  }
}

void postingImage(camera_fb_t* fb) {
  HTTPClient client;
  Serial.print("Picture Height: ");
  Serial.print(fb->height);
  Serial.println("");  // write the Height
  Serial.print("Picture Weidth: ");
  Serial.print(fb->width);
  Serial.println("");  // write the Width
  Serial.print("Picture Size: ");
  Serial.print(fb->len);
  Serial.println("");  // write the Size
  Serial.print("Data Buffer: ");
  for (int i = 0; i < fb->len; i++) {
    Serial.write(',');
    Serial.print(fb->buf[i], DEC);
  }
  Serial.println();
  client.begin("http://192.168.175.1:8888/imageUpdate");
  client.addHeader("Content-Type", "image/jpeg");
  int httpResponseCode = client.POST(fb->buf, fb->len);
  if (httpResponseCode == 200) {
    String response = client.getString();
    parsingResult(response);
  } else {
    tft.drawString("Check Your Server!!!", 8, 4, GFXFF);
  }
  client.end();
}

void sendingImage() {
  camera_fb_t* fb = capture();
  if (!fb || fb->format != PIXFORMAT_JPEG) {
    Serial.println("Camera capture failed");
    esp_camera_fb_return(fb);
    return;
  } else {
    TJpgDec.drawJpg(0, 0, (const uint8_t*)fb->buf, fb->len);
    postingImage(fb);
    esp_camera_fb_return(fb);
  }
}

void loop() {
  buttonEvent();

  if (isNormalMode)
    showingImage();
}

This is part of my JPEG image data buffer on my Arduino IDE, it appears to be valid jpeg pixel

,255,216,255,224,0,16,74,70,73,70,0,1,1,1,0,0,0,0,0,0,255,219,0,67,0,5,3,4,4,4,3,5,4,4,4,6,5,5,6,8,13,8,8,7,7,8,15,11,12,9,13,18,16,19,19,18,16,18,17,20,23,29,24,20,21,27,22,17,18,25,34,25,27,30,31,32,33,32,19,24,35,38,35,31,38,29,32,32,31,255,219,0,67,1,5,6,6,8,7,8,15,8,8,15,31,21,18,21,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,255,196,0,31,0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,255,196,0,181,16,0

I hope someone could provide me guidance on how to solve this issue, I had spent more than 2 full days search for the internet but I cannot find someone else having the same problem with me.

Thank you!

That is expected for a file containing image data. Try opening it with an image display program instead.

Dear Sir

Thanks for your reply and help. I tried to open with other program but it does not show up image.

It said it doesnt support the format (As the photo attached in the original thread)

This project suppose to be a 20 hours class for high school students, and I am responsible to try to build it first.

I have experience in writing C program (or similar syntax) and electronic hardware, but not NodeJS and Java, so when it comes to fix the corrupt images...I do not know how to do.

The file IS a valid .jpg file on the ESP32, so there is a problem with transmission, or how the file is written out and accessed on the other end.

Compare the size in bytes and contents of the file at both ends.

Thanks again.
I will try to investigate tomorrow.
Perhaps printing the file size in serial monitor and compares the file size in my computer(server side).

But it is strange...Many people follows the tutorial from website and youtube..and none of them have the same issue as mine.

There are some update, it is confirmed that the size of the image file are identical on the ESP32-CAM itself and computer (Server Side).

The data buffer at ESP32-CAM itself also looks fine, but the data I received at the computer (Server Side) seems corrupt? Could someone provide me guidance on how to fix it? Thank you.

Code for Arduino Program

#include "esp_camera.h"
#include <TJpg_Decoder.h>
#include <SPI.h>
#include <TFT_eSPI.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Base64.cpp>
#include <Base64.h>

#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27

#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22

#define GFXFF 1
#define FSB9 &FreeSerifBold9pt7b

TFT_eSPI tft = TFT_eSPI();

const char* ssid = "Henry";
const char* password = "63487353";
const unsigned long timeout = 30000;  // 30 seconds

const int buttonPin = 4;  // the number of the pushbutton pin
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers
bool isNormalMode = true;

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
}

bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap) {
  // Stop further decoding as image is running off bottom of screen
  if (y >= tft.height()) return 0;

  // This function will clip the image block rendering automatically at the TFT boundaries
  tft.pushImage(x, y, w, h, bitmap);

  // This might work instead if you adapt the sketch to use the Adafruit_GFX library
  // tft.drawRGBBitmap(x, y, bitmap, w, h);

  // Return
  return 1;
}


void setup() {
  Serial.begin(115200);
  delay(1000);

  Serial.println();
  pinMode(buttonPin, INPUT);

  Serial.println("INIT DISPLAY");
  tft.begin();
  tft.setRotation(3);
  tft.setTextColor(0xFFFF, 0x0000);
  tft.fillScreen(TFT_YELLOW);
  tft.setFreeFont(FSB9);

  TJpgDec.setJpgScale(1);
  TJpgDec.setSwapBytes(true);
  TJpgDec.setCallback(tft_output);

  Serial.println("INIT CAMERA");
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  //init with high specs to pre-allocate larger buffers
  if (psramFound()) {
    config.frame_size = FRAMESIZE_QVGA;  // 320x240
    config.jpeg_quality = 5;
    config.fb_count = 1;
  } else {
    config.frame_size = FRAMESIZE_QVGA;
    config.jpeg_quality = 5;
    config.fb_count = 1;
  }

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  initWiFi();
}


void buttonEvent() {
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
        isNormalMode = !isNormalMode;

        //Additional Code
        if (!isNormalMode)
          sendingImage();
        //
      }
    }
  }
  lastButtonState = reading;
}

camera_fb_t* capture() {
  camera_fb_t* fb = NULL;
  esp_err_t res = ESP_OK;
  fb = esp_camera_fb_get();
  return fb;
}

void showingImage() {
  camera_fb_t* fb = capture();
  if (!fb || fb->format != PIXFORMAT_JPEG) {
    Serial.println("Camera capture failed");
    esp_camera_fb_return(fb);
    return;
  } else {
    TJpgDec.drawJpg(0, 0, (const uint8_t*)fb->buf, fb->len);
    esp_camera_fb_return(fb);
  }
}

void parsingResult(String response) {
  DynamicJsonDocument doc(1024);
  deserializeJson(doc, response);
  JsonArray array = doc.as<JsonArray>();
  int yPos = 4;
  for (JsonVariant v : array) {
    JsonObject object = v.as<JsonObject>();
    const char* description = object["description"];
    float score = object["score"];
    String label = "";
    label += description;
    label += ":";
    label += score;
    tft.drawString(label, 8, yPos, GFXFF);
    yPos += 16;
  }
}

void postingImage(camera_fb_t* fb) {
  HTTPClient client;
  Serial.print("Picture Height: ");
  Serial.print(fb->height);
  Serial.println("");  // write the height
  Serial.print("Picture Weidth: ");
  Serial.print(fb->width);
  Serial.println("");  // write the height
  Serial.print("Picture Size: ");
  Serial.print(fb->len);
  Serial.println("");  // write the height
  Serial.print("Data Buffer: ");
  for (int i = 0; i < fb->len; i++) {
    Serial.write(',');
    Serial.print(fb->buf[i]);
  }
  Serial.println();
  client.begin("http://192.168.175.1:8888/imageUpdate");
  client.addHeader("Content-Type", "image/jpeg");
  int httpResponseCode = client.POST(fb->buf, fb->len);
  if (httpResponseCode == 200) {
    String response = client.getString();
    parsingResult(response);
  } else {
    tft.drawString("Check Your Server!!!", 8, 4, GFXFF);
  }
  client.end();
}

void sendingImage() {
  camera_fb_t* fb = capture();
  if (!fb || fb->format != PIXFORMAT_JPEG) {
    Serial.println("Camera capture failed");
    esp_camera_fb_return(fb);
    return;
  } else {
    TJpgDec.drawJpg(0, 0, (const uint8_t*)fb->buf, fb->len);
    postingImage(fb);
    esp_camera_fb_return(fb);
  }
}

void loop() {
  buttonEvent();

  if (isNormalMode)
    showingImage();
}

Part of the Serial Monitor Output

12:47:18.471 -> Picture Height: 240
12:47:18.471 -> Picture Weidth: 320
12:47:18.471 -> Picture Size: 11796
12:47:18.471 -> Data Buffer: ,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,8,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,255,196,0,31,0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,255,196,0,181,16,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125,1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250,255,196,0,31,1,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,255,196,0,181,17,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119,0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250,255,192,0,17,8,0,240,1,64,3,1,33,0,2,17,1,3,17,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,165,57,191,119,98,225,66,17,177,239,246,54,86,81,91,167,145,105,28,75,140,225,69,97,120,159,72,211,3,155,211,111,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,78,152,255,0,190,5,62,101,213,28,159,87,137,96,89,196,58,42,127,223,2,164,72,20,117,84,63,240,26,223,125,138,142,26,147,232,73,177,63,184,63,42,225,62,54,243,225,189,54,223,28,79,169,67,27,123,140,49,173,98,249,53,234,63,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,8,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,38,180,211,73,192,134,3,81,23,114,221,40,156,39,196,139,107,63,244,120,197,180,99,114,54,113,236,69,84,248,91,167,90,54,173,44,143,105,19,227,143,154,186,155,247,108,99,236,210,216,236,111,96,178,55,82,21,181,79,189,199,90,172,246,246,157,173,35,172,208,253,146,60,195,197,139,105,115,226,11,143,220,70,209,199,132,81,216,96,115,88,242,91,90,172,100,253,157,43,169,212,103,55,177,140,76,203,187,104,188,149,253,210,131,186,160,91,104,114,127,119,79,125,67,125,203,16,218,193,222,221,107,79,77,181,181,243,163,253,202,159,152,15,214,159,55,187,98,249,32,125,155,240,122,206,214,47,12,36,145,219,70,143,234,5,119,53,201,167,97,253,86,155,220,40,160,143,168,208,236,20,85,115,50,190,169,71,176,81,71,51,15,169,209,236,124,239,26,99,168,171,81,138,230,229,208,135,169,159,175,63,203,4,39,163,203,147,248,85,235,38,82,64,127,152,99,159,113,87,175,40,207,109,240,179,180,158,27,211,101,119,46,100,183,71,201,247,25,172,175,30,51,11,92,39,222,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,36,148,254,11,138,246,74,81,216,2,138,160,10,41,1,149,226,166,219,163,57,255,0,105,127,157,120,174,147,255,0,33,123,50,126,235,222,64,159,153,172,43,45,13,41,238,118,90,182,133,253,163,98,209,165,207,144,201,243,127,189,237,92,115,105,55,48,202,96,217,185,189,171,24,75,221,27,220,228,62,45,105,207,166,46,148,243,14,102,73,0,252,214,162,248,83,108,193,46,174,186,171,191,203,255,0,1,24,53,217,246,12,141,114,219,134,239,90,134,89,150,4,105,228,56,88,198,243,248,84,161,51,201,193,121,51,35,143,153,201,99,248,154,171,122,74,133,31,222,56,174,150,209,131,101,27,213,249,113,138,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,87,91,92,198,225,69,49,133,20,0,81,64,31,62,39,222,53,102,49,89,158,113,143,169,254,243,82,183,96,216,9,159,207,34,175,193,143,37,207,76,12,255,0,187,239,76,221,30,229,225,146,15,135,180,253,174,31,108,8,187,135,124,12,86,39,141,78,110,160,79,86,2,177,108,222,87,50,97,5,245,221,50,49,158,103,221,248,40,205,117,186,77,249,146,246,234,202,69,199,148,223,39,184,197,105,186,185,205,228,106,209,78,38,145,122,133,121,63,197,127,222,252,73,208,227,255,0,159,125,54,229,255,0,239,167,142,180,55,25,240,201,124,207,136,69,251,71,97,49,252,76,145,87,173,212,68,166,20,85,136,40,160,12,63,28,54,207,14,92,26,241,123,219,152,180,245,183,212,36,207,151,6,169,110,199,30,131,53,148,215,54,136,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,25,181,109,31,93,210,172,31,79,190,142,123,155,73,182,249,105,253,198,234,106,79,7,36,118,126,23,59,15,206,96,118,252,78,107,162,214,138,185,157,250,21,152,214,79,138,229,242,244,27,159,250,104,60,175,206,182,91,148,246,56,78,59,86,85,244,153,213,86,49,252,32,86,138,58,152,189,136,181,17,133,81,250,85,116,233,90,104,204,239,98,212,60,227,210,181,180,229,255,0,72,143,31,222,20,167,30,193,167,67,236,159,133,99,30,17,130,186,186,230,71,66,10,41,148,20,80,1,69,0,124,253,29,88,28,12,212,36,174,112,24,164,238,212,100,143,25,42,5,116,122,102,159,43,58,170,38,120,249,63,46,148,165,161,183,67,213,60,10,165,124,49,108,172,165,78,233,56,63,245,209,171,27,196,242,121,154,156,0,117,229,171,23,29,77,165,34,142,134,173,47,142,109,63,233,141,172,207,250,168,174,250,52,88,249,238,106,158,134,27,146,209,90,34,150,225,94,75,227,199,243,190,38,203,255,0,78,218,122,39,230,196,211,158,199,74,46,252,31,136,62,189,172,92,247,142,24,163,31,240,38,115,94,155,77,8,40,170,3,207,62,59,120,199,81,240,135,134,172,223,68,150,4,213,47,46,150,40,252,248,247,141,131,151,53,201,124,46,248,173,226,141,115,199,58,126,129,173,91,233,255,0,103,187,73,127,123,2,50,176,101,92,129,91,114,167,18,116,61,47,199,210,255,0,196,173,237,72,251,240,74,255,0,144,2,188,63,198,82,127,197,55,129,222,253,63,64,245,204,190,49,75,99,142,102,170,238,5,116,156,228,82,157,177,116,233,93,166,157,155,125,26,24,207,7,201,92,254,85,156,223,66,225,169,92,181,115,158,55,185,30,77,173,159,247,216,203,255,0,124,241,73,35,118,115,79,133,25,172,8,166,18,223,249,222,164,226,174,40,202,94,100,250,135,44,181,18,46,7,74,171,114,187,24,150,33,81,222,180,244,241,137,144,143,90,219,161,169,246,87,195,37,219,225,43,95,122,233,235,136,220,40,166,1,69,0,20,80,7,128,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,146,223,84,214,237,45,102,140,110,104,228,147,230,21,162,87,32,243,31,137,80,216,120,170,254,222,233,239,230,123,5,27,237,182,244,249,149,121,172,15,15,120,70,45,47,196,26,94,187,6,169,33,75,57,196,196,47,222,101,238,181,173,165,111,116,193,84,81,126,241,220,248,215,198,154,69,220,42,177,173,194,177,134,69,249,211,24,249,163,175,35,241,22,173,111,115,165,90,67,17,59,133,195,202,223,76,26,197,211,146,145,167,50,113,48,26,116,168,204,201,90,89,216,195,208,138,98,30,38,10,123,87,103,43,98,221,87,208,1,250,86,82,54,130,41,238,174,71,196,242,121,186,185,92,255,0,171,64,63,173,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,180,250,87,75,92,134,161,69,48,10,40,0,162,128,60,187,91,240,172,144,41,188,211,243,44,95,197,31,117,174,110,239,228,135,39,177,167,45,238,112,67,93,206,111,68,148,188,43,40,224,200,75,253,107,189,240,174,164,246,253,0,43,198,248,143,127,122,198,107,161,208,117,90,108,223,101,183,107,184,155,49,76,118,238,244,199,106,201,184,152,73,119,51,103,211,25,172,99,166,165,62,198,183,195,196,15,22,167,113,215,125,214,223,251,229,64,174,142,87,39,90,182,128,116,88,158,67,250,10,217,234,71,82,253,21,102,157,2,188,103,85,96,254,35,241,68,253,154,243,103,253,243,26,138,150,244,28,14,187,224,252,91,116,141,66,111,249,233,119,252,149,69,119,21,161,103,148,120,243,226,7,136,180,191,30,157,19,73,138,207,236,144,170,121,166,100,98,196,183,53,226,62,39,186,184,213,188,65,127,171,106,24,150,234,238,79,152,250,1,192,21,211,164,116,57,238,206,166,211,80,158,79,13,105,70,89,29,219,96,95,152,244,29,42,236,26,220,54,174,35,158,57,100,93,159,36,105,222,170,47,67,25,70,229,95,16,92,195,119,100,39,138,39,132,21,251,143,213,77,112,215,31,44,48,251,169,167,45,70,175,98,29,249,234,41,56,244,169,29,237,168,236,98,54,35,174,43,170,158,66,120,205,97,81,117,54,129,6,254,121,53,194,79,116,39,185,158,115,252,82,31,240,172,226,105,38,145,157,168,190,253,162,160,211,135,250,80,197,116,197,117,50,243,46,106,67,230,76,122,84,10,132,154,55,29,137,211,229,25,205,89,211,70,110,144,255,0,180,40,217,1,246,151,195,209,143,9,217,255,0,187,93,5,115,27,5,20,192,40,160,2,138,0,241,61,35,226,78,145,165,234,2,202,125,93,53,27,25,56,18,103,231,181,111,74,208,241,182,163,224,221,99,78,105,52,223,17,217,71,168,50,253,223,51,1,206,218,166,173,45,143,53,41,110,112,122,110,213,183,30,89,12,128,237,56,231,28,214,213,148,219,48,119,255,0,186,107,6,206,179,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,143,231,38,171,115,218,109,74,236,143,251,252,194,162,123,21,13,25,232,31,9,135,252,82,33,191,189,115,55,254,134,69,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,56,249,171,155,185,17,191,148,10,243,182,174,226,217,88,141,150,53,224,138,49,15,97,77,218,196,92,121,141,25,118,175,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,105,201,230,171,105,195,253,39,31,141,106,103,212,179,126,167,114,238,168,99,7,154,96,244,99,228,244,171,154,106,127,164,196,191,237,143,231,87,127,116,168,110,125,163,224,49,143,11,89,251,173,110,215,25,176,81,76,2,138,0,40,160,15,143,53,93,30,104,203,75,0,200,172,118,118,57,138,230,48,113,254,207,74,75,91,179,153,238,105,104,247,82,216,220,41,141,134,195,247,129,239,93,85,158,167,28,163,2,179,243,54,232,92,91,191,102,167,199,122,221,139,126,116,1,110,215,88,191,130,61,182,215,211,194,190,138,245,118,223,196,218,250,125,221,98,231,241,32,213,123,163,183,82,228,30,52,241,58,31,249,11,110,255,0,126,21,53,109,124,123,226,136,241,251,219,73,127,223,139,21,55,45,88,183,105,241,19,196,111,115,20,79,101,166,176,102,0,145,230,10,195,177,93,158,27,135,63,199,35,191,230,236,104,147,79,64,229,177,217,248,23,95,176,211,124,61,107,99,35,97,179,51,146,123,126,240,154,233,225,241,14,155,42,134,142,117,96,125,26,162,58,24,79,87,115,153,241,175,141,239,180,157,78,214,29,42,218,214,234,41,33,47,39,154,228,96,231,138,242,239,21,195,15,136,47,47,175,36,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,70,126,156,214,68,118,42,160,131,36,103,254,5,90,93,91,148,134,174,107,79,100,201,225,148,194,126,225,183,21,97,208,215,63,169,91,108,100,5,113,197,85,54,14,44,167,50,3,223,154,103,150,51,91,92,207,144,158,205,127,210,99,31,237,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,126,113,86,244,213,6,232,96,127,9,165,56,190,134,86,125,73,239,191,214,1,80,40,171,138,176,61,198,255,0,30,51,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,172,219,155,168,124,198,81,46,222,122,3,138,217,51,61,128,62,83,27,139,125,78,106,11,175,51,236,210,108,235,138,143,51,75,28,46,167,121,3,6,200,36,149,192,226,176,229,231,45,180,125,107,178,156,116,185,206,247,61,227,79,135,236,255,0,7,252,43,6,62,253,137,152,231,213,182,214,236,186,60,18,68,12,150,209,177,101,4,229,107,158,79,149,154,37,115,30,239,195,86,77,159,244,68,252,171,34,243,193,246,14,57,183,101,247,6,173,84,20,162,80,79,7,71,29,202,201,20,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,8,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,197,24,54,183,18,106,154,146,90,249,130,39,156,236,143,253,236,112,42,236,105,167,15,15,105,26,219,229,154,218,239,236,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,177,177,225,162,102,191,58,107,191,238,47,227,104,10,255,0,181,143,144,215,81,21,199,157,225,191,13,120,134,241,247,203,99,168,125,134,235,63,243,207,56,172,165,239,61,10,71,53,117,104,246,90,149,221,156,163,230,134,103,95,215,138,213,240,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,238,219,248,86,102,219,254,233,57,20,65,216,108,142,46,57,173,221,30,231,203,209,239,48,126,120,46,109,238,211,219,4,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,175,105,254,243,173,79,217,53,142,231,214,148,86,96,20,83,0,162,128,10,40,3,227,209,210,140,86,27,59,155,48,81,182,156,50,199,20,45,68,205,59,88,246,70,22,174,70,189,171,185,105,19,18,218,0,139,76,105,51,197,52,13,143,87,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,8,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,8,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,106,206,156,234,146,25,36,53,173,153,153,62,169,168,6,66,131,59,120,21,137,185,55,124,196,214,169,21,177,111,79,222,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,67,122,137,190,103,115,102,114,154,244,129,180,157,21,152,99,247,18,31,206,74,196,221,142,212,212,116,185,55,92,218,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,8,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,162,102,247,46,175,205,30,49,93,71,195,111,249,28,52,192,127,189,254,21,133,109,141,233,239,161,245,165,21,129,97,69,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,177,90,222,105,50,201,204,118,177,74,79,252,9,243,80,105,48,73,120,171,231,125,251,171,173,188,247,44,126,106,193,190,88,155,35,95,196,44,6,161,226,7,31,234,237,45,210,201,125,139,237,174,74,53,119,89,124,161,150,84,103,199,208,102,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,24,65,85,110,109,17,79,239,165,1,189,1,172,209,93,76,249,4,8,220,54,106,53,185,17,55,203,31,227,154,190,183,101,61,119,34,146,236,158,112,106,27,130,100,249,223,167,210,186,47,101,112,138,232,66,65,231,32,211,14,208,122,102,148,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,175,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,10,238,255,255,255,255,255,255,255,255,255,255,255

Code for Node JS server

var fs = require('fs');
const http = require('http');
const server = http.createServer();
const filePath = './resources/test.jpeg';
 
server.on('request', (request, response)=>{
    if(request.method == 'POST' && request.url === "/imageUpdate"){
		console.log(`Trasmission Start`)
        var ImageFile = fs.createWriteStream(filePath);
        request.on('data', function(data){
			console.log(data)
            ImageFile.write(data);
        });
 
        request.on('end',async function(){
			console.log(`Trasmission End`)
            ImageFile.end();
            const labels = await labelAPI();
            response.writeHead(200, {'Content-Type' : 'application/json'});
            response.end(JSON.stringify(labels));
        });
 
    }else{
        console.log("error");
        response.writeHead(405, {'Content-Type' : 'text/plain'});
        response.end();
    }
});
 
async function labelAPI() {
  var o = [];
  // Imports the Google Cloud client library
  const vision = require('@google-cloud/vision');
 
  // Creates a client
  const client = new vision.ImageAnnotatorClient();
 
  // Performs label detection on the image file
  const [result] = await client.labelDetection(filePath);
  const labels = result.labelAnnotations;
  
  labels.forEach(label => {
    o.push({description: label.description, score: label.score});
  });
  return o;
}
 
const port = 8888;
server.listen(port)
console.log(`Listening at ${port}`)

check IsNormalMode, I see it checked and being set to false in buttonEvent but don't see where it gets flipped backed to true??
does the image display on the screen properly??

~q

Thanks for your reply.
Yes it does display normally on TFT screen.

I can confirm the program flow do actually goes to the code that it transmit the jpeg to my PC (Server side), I know it cause I have added printIn in the code and I can see the debug message on Serial Monitor..
Just have no idea why do the PC (server side) will receive corrupt jpeg data.

kind of thinking not switching that bool back, maybe it's trying to send again and mucking things up..
not sure about all the json, could be a simple encoding issue somewhere too..
i got jpegs saving into blobs fields on a database server, works great, but i send and recv raw data..
NARDS

good luck.. ~q

Dear qubits-us

Thanks for your reply, it is an interesting finding on the status of the bool.
I will try to modify the code setting the bool back to true and see what happens by tomorrow.

It is late in my country now.

Also thanks for providing your example!

After I change the code of client.addHeader to
client.addHeader("Content-Type", "image/jpeg; charset=UTF-8");

Serial.println();
  client.begin("http://192.168.41.182:8888/imageUpdate");
  client.addHeader("Content-Type", "image/jpeg; charset=UTF-8");
  int httpResponseCode = client.POST(fb->buf, fb->len);
  if (httpResponseCode == 200) {
    String response = client.getString();
    parsingResult(response);
  } else {
    tft.drawString("Check Your Server!!!", 8, 4, GFXFF);
  }

I tried to setting back the bool again but didn't work...
Also tried another notebook to host the server, also didnt work...The data received on the node js server side are messed up..

I hope someone could help...

Thank you

then issue probably is in the Node.Js
I've forgotten more than i know about java but that file stream does not look correct..
check this on StackOverflow..

Writing image to local server..

kind of backwards not a server but pretty sure your data will come in chunks too, have to assemble them..

good luck.. ~q

Thank you!!
Will try again tomorrow!

I went to that page. What is an "ARD"?

ards and esps are short for Arduino's and ESP32's..
currently working with esps only got 1 ard that has network..
wanted one of the new giga's but all sold out, bummer..

still working on it, but seems to working pretty good..
getting big.. :slight_smile:

shhh.. don't tell..

My colleague who have programming experience had performed testing, he write a very similar program and host a server with his computer.
Afterwards, he send a jpeg file to the local server, it turns out to be there are no corrupt data and the jpeg can be open successfully.

With this finding, it seems that the problem on my server receive corrupt jpeg data is on the sender side (Arduino program).

How come all other amateur Arduino user who also followed the same tutorial did not encount the same problem with me ... Seems I am the only one.

soOo many pop ups on that tutorial page you posted, didn't stay long, just quick down to the code..
the only other thing that i noticed is the reduction in..

 config.jpeg_quality = 5;

got mine at 10 and 12 as does your tutorial..
not sure if that's an issue??

the image will be broken down into smaller packets depending on your systems MTU value usually about 1,500 bytes which is why I was thinking it was in the js code..

sorry.. ~q

I had tried various value of jepg quality (5-63), none of it work, data received on the server side still rubbish, but it is confirmed that changing the value and set frame buffer to 1 could fix the broken image issue.

Thank you qubits, you are always trying to help :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.