Hans63
Published © GPL3+

Internet Radio

Combined some examples to create a new, featured, project.

IntermediateFull instructions provided15 hours10,362
Internet Radio

Things used in this project

Hardware components

ESP32
×1
Rotary decoder
×1
IR set
×1
TFT display
×1
VS1053
×1

Story

Read more

Custom parts and enclosures

Case

3D printer files

Case 2

Case 3

Schematics

Schematics

To connect the dots....

Code

Internet Radio Code

Arduino
Main code - see download for all code
// internet_radio.ino
/* 
 internet radio; combined code from
 Simple_esp32_radio - https://www.hackster.io/mircemk/simple-esp32-internet-radio-with-oled-display-83e49d
 with 
 ESP-radio-github - https://github.com/Edzelf/Esp-radio 

 ESP32 libraries used:
  - ESP32 for Arduino - https://dl.espressif.com/dl/package_esp32_index.json (include in Menu | Preferences | Board managers)
  - Preferences       - https://github.com/espressif/arduino-esp32/blob/master/libraries/Preferences/src/Preferences.h
  - helloMp3.h        - included with code
  - radiostations.h   - included with code
  - WiFi.h            - WIFININA - to include via Library manager
  - HTTPClient.h      - https://github.com/espressif/arduino-esp32/blob/master/libraries/HTTPClient/src/HTTPClient.h
  - Adafruit_GFX      - https://github.com/adafruit/Adafruit-GFX-Library
  - Adafruit_ST7735.h - https://github.com/adafruit/Adafruit-ST7735-Library
  - SPI.h             - Part of ESP8266 Arduino default libraries.
  - Ticker.h          - https://github.com/sstaub/Ticker
  - esp_wifi.h        - https://github.com/madhephaestus/Esp32WifiManager
  - Arduino.h         - Part of ESP8266 Arduino default libraries.
  - IRremoteESP8266.h - https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
  - IRrecv.h          - https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
  - IRutils.h         - https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
  - VS1053.h          - https://github.com/baldram/ESP_VS1053_Library/tree/master/src

 hardware
  - ESP32             - https://www.aliexpress.com/item/32799253567.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO
  - Rotary decoder    - https://www.aliexpress.com/item/32969404416.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO
  - IR set            - https://www.aliexpress.com/item/32859719981.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO
  - TFT display       - https://www.aliexpress.com/item/32817839166.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO
  - VS1053            - https://www.aliexpress.com/item/32966454016.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO

If possible streaming info of artist and song title is shown. For some reason i've not been able to show this streaming information
for all streams.....
Please let me know if you are able to show more streaming info and I'd be honered if you will share the updated code with me!


*/

#include <Preferences.h>    //For reading and writing into the FLASH memory
#include "helloMp3.h"       // to say 'Hello' to listener
#include "radiostations.h"  // all streaming channels used in this player

// display
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <Ticker.h>
// ESP32
#include <esp_wifi.h>
#include <WiFi.h>
#include <HTTPClient.h>
// IR
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
// This ESP_VS1053_Library
#include <VS1053.h>

Preferences preferences; // instance to acces NVRAM

bool DEBUG = false;  // if "true" all info will be shown in serial monitor; id "false" no info is shown on serial monitor

// Rotary Encoder start
const int PinSW=5;   // Rotary Encoder Switch
const int PinDT=4;    // DATA signal
const int PinCLK=2;    // CLOCK signal
// Variables to debounce Rotary Encoder start
long TimeOfLastDebounce = 0;
int DelayofDebounce = 0.01;
unsigned long previousMillisrotating = 0;
unsigned long previousMillispressed = 0;
unsigned long interval = 2000;
// Store previous Pins state
int PreviousCLK;   
int PreviousDATA;
int rotary_step_counter = 0;
bool rotating = false;
bool pressed = false;
// Rotary Encoder end

// IR init start
unsigned long key_value = 0;
const uint16_t kRecvPin = 27; // An IR detector/demodulator is connected to GPIO pin 27
IRrecv irrecv(kRecvPin);
decode_results results;
unsigned long previousMillisIR = 0;
unsigned long IR_interval = 2000; // after 2 seconds no input : stop waiting and activate info received
bool IR_volume = false;
bool IR_station = false;
bool digitinput = false;
unsigned int IR_value, Nbr_chars;
//IR init end

// Display init start
// pin definition for ESP32 for display
// VCC - +5Volt
// Gnd - Gnd
#define TFT_CS   17
#define TFT_Rst  16
#define TFT_DC   15 // A0
// SDA - 23
// SCK - 18
// LED - backlight +5 Volt via Resistor
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_Rst);
// Display init end

// WiFi init start
//WiFi network info
char ssid[] = "hcg";    //  your network SSID (name) 
char pass[] = "!!snapper123hans";   // your network password
String LocalIP="";
int status = WL_IDLE_STATUS;
WiFiClient  client;
// WiFi init end

/* VS1053 player init start
VS1053 - connections detail
 XRST = EN (D3)
 MISO = D19
 MOSI = D23
 SCLK = D18
 VCC = 5V / 3.3 V
 Gnd = Gnd 
*/
// Wiring of VS1053 board (SPI connected in a standard way)
#define VS1053_CS    32 //32
#define VS1053_DCS   33  //33
#define VS1053_DREQ  35 //15
uint8_t mp3buff[32];   // vs1053 likes 32 bytes at a time
VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ);
int my_volume = 75; // volume level 0-100
// VS1053 init end

// data definitions for getting radio data and playing it start
#define RINGBFSIZ 20000                                     // Ringbuffer for smooth playing. 20000 bytes is 160 Kbits, about 1.5 seconds at 128kb bitrate.
uint8_t*         ringbuf ;                                  // Ringbuffer for VS1053
uint16_t         rbwindex = 0 ;                             // Fill pointer in ringbuffer
uint16_t         rbrindex = RINGBFSIZ - 1 ;                 // Emptypointer in ringbuffer
uint16_t         rcount = 0 ;                               // Number of bytes in ringbuffer

String           icystreamtitle ;                           // Streamtitle from metadata
String           icyname ;                                  // Icecast station name

enum datamode_t { INIT = 1, HEADER = 2, DATA = 4,
                  METADATA = 8, NoMETA = 16,
                  PLAYLISTHEADER = 32, PLAYLISTDATA = 64,
                  STOPREQD = 128, STOPPED = 256} ;          // State for datastream
datamode_t       datamode ;                                 // State of datastream                
bool             chunked = false ;                          // Station provides chunked transfer
int              chunkcount = 0 ;                           // Counter for chunked transfer
int              metaint = 0 ;                              // Number of databytes between metadata
int              bitrate ;                                  // Bitrate in kb/sec
uint32_t         totalcount = 0 ;                           // Counter mp3 data
String           metaline ;                                 // Readable line in metadata
int              datacount ;                                // Counter databytes before metadata
int              metacount ;                                // Number of bytes in metadata
int8_t           playlist_num = 0 ;                         // Nonzero for selection from playlist
char             newstreamtitle[150] = "";                  // storeStreamtitle from metadata
Ticker           tckr ;                                    // For timing 100 msec

int radioStation,old_radioStation,new_radioStation;
// data definitions for getting radio data and playing it end

// start music code
// Ringbuffer code start
//******************************************************************************************
// Ringbuffer (fifo) routines.                                                             *
//******************************************************************************************
//******************************************************************************************
//                              R I N G S P A C E                                          *
//******************************************************************************************
inline bool ringspace()
{
  return ( rcount < RINGBFSIZ ) ;     // True is at least one byte of free space is available
}

//******************************************************************************************
//                              R I N G A V A I L                                          *
//******************************************************************************************
inline uint16_t ringavail()
{
  return rcount ;                     // Return number of bytes available
}

//******************************************************************************************
//                                P U T R I N G                                            *
//******************************************************************************************
void putring ( uint8_t b )                 // Put one byte in the ringbuffer
{
  // No check on available space.  See ringspace()
  *(ringbuf + rbwindex) = b ;         // Put byte in ringbuffer
  if ( ++rbwindex == RINGBFSIZ )      // Increment pointer and
  {
    rbwindex = 0 ;                    // wrap at end
  }
  rcount++ ;                          // Count number of bytes in the ringbuffer
}

//******************************************************************************************
//                                G E T R I N G                                            *
//******************************************************************************************
uint8_t getring()
{
  // Assume there is always something in the bufferpace.  See ringavail()
  if ( ++rbrindex == RINGBFSIZ )      // Increment pointer and
  {
    rbrindex = 0 ;                    // wrap at end
  }
  rcount-- ;                          // Count is now one less
  return *(ringbuf + rbrindex) ;      // return the oldest byte
}

//******************************************************************************************
//                               E M P T Y R I N G                                         *
//******************************************************************************************
void emptyring()
{
  rbwindex = 0 ;                      // Reset ringbuffer administration
  rbrindex = RINGBFSIZ - 1 ;
  rcount = 0 ;
}
// Ringbuffer code end

// data evaluation to find streaming info and play music start
//******************************************************************************************
//                            C H K H D R L I N E                                          *
//******************************************************************************************
// Check if a line in the header is a reasonable headerline.                               *
// Normally it should contain something like "icy-xxxx:abcdef".                            *
//******************************************************************************************
bool chkhdrline ( const char* str )
{
  char    b ;                                         // Byte examined
  int     len = 0 ;                                   // Lengte van de string

  while ( ( b = *str++ ) )                            // Search to end of string
  {
    len++ ;                                           // Update string length
    if ( ! isalpha ( b ) )                            // Alpha (a-z, A-Z)
    {
      if ( b != '-' )                                 // Minus sign is allowed
      {
        if ( b == ':' )                               // Found a colon?
        {
          return ( ( len > 5 ) && ( len < 50 ) ) ;    // Yes, okay if length is okay
        }
        else
        {
          return false ;                              // Not a legal character
        }
      }
    }
  }
  return false ;                                      // End of string without colon
}

//******************************************************************************************
//                           H A N D L E B Y T E _ C H                                     *
//******************************************************************************************
// Handle the next byte of data from server.                                               *
// Chunked transfer encoding aware. Chunk extensions are not supported.                    *
//******************************************************************************************
void handlebyte_ch ( uint8_t b, bool force )
{
  static int  chunksize = 0 ;                         // Chunkcount read from stream

  if ( chunked && !force && 
       ( datamode & ( DATA |                          // Test op DATA handling
                      METADATA |
                      PLAYLISTDATA ) ) )
  {
    if ( chunkcount == 0 )                            // Expecting a new chunkcount?
    {
       if ( b == '\r' )                               // Skip CR
       {
         return ;      
       }
       else if ( b == '\n' )                          // LF ?
       {
         chunkcount = chunksize ;                     // Yes, set new count
         chunksize = 0 ;                              // For next decode
         return ;
       }
       // We have received a hexadecimal character.  Decode it and add to the result.
       b = toupper ( b ) - '0' ;                      // Be sure we have uppercase
       if ( b > 9 )
       {
         b = b - 7 ;                                  // Translate A..F to 10..15
       }
       chunksize = ( chunksize << 4 ) + b ;
    }
    else
    {
      handlebyte ( b, force ) ;                       // Normal data byte
      chunkcount-- ;                                  // Update count to next chunksize block
    }
  }
  else
  {
    handlebyte ( b, force ) ;                         // Normal handling of this byte
  }
}

//******************************************************************************************
//                           H A N D L E B Y T E                                           *
//******************************************************************************************
// Handle the next byte of data from server.                                               *
// This byte will be send to the VS1053 most of the time.                                  *
// Note that the buffer the data chunk must start at an address that is a muttiple of 4.   *
// Set force to true if chunkbuffer must be flushed.                                       *
//******************************************************************************************
void handlebyte ( uint8_t b, bool force )
{
  static uint16_t  playlistcnt ;                       // Counter to find right entry in playlist
  static bool      firstmetabyte ;                     // True if first metabyte (counter)
  static int       LFcount ;                           // Detection of end of header
  static __attribute__((aligned(4))) uint8_t buf[32] ; // Buffer for chunk
  static int       bufcnt = 0 ;                        // Data in chunk
  static bool      firstchunk = true ;                 // First chunk as input
  String           lcml ;                              // Lower case metaline
  String           ct ;                                // Contents type
  static bool      ctseen = false ;                    // First line of header seen or not
  int              inx ;                               // Pointer in metaline
  int              i ;                                 // Loop control

  if ( datamode == INIT )                              // Initialize for header receive
  {
    ctseen = false ;                                   // Contents type not seen yet
    metaint = 0 ;                                      // No metaint found
    LFcount = 0 ;                                      // For detection end of header
    bitrate = 0 ;                                      // Bitrate still unknown
    if (DEBUG == true) Serial.println ( "Switch to HEADER" ) ;
    datamode = HEADER ;                                // Handle header
    totalcount = 0 ;                                   // Reset totalcount
    metaline = "" ;                                    // No metadata yet
    firstchunk = true ;                                // First chunk expected
  }
  if ( datamode == DATA )                              // Handle next byte of MP3/Ogg data
  {
    buf[bufcnt++] = b ;                                // Save byte in chunkbuffer
    if ( bufcnt == sizeof(buf) || force )              // Buffer full?
    {
      if ( firstchunk )
      {
        firstchunk = false ;
        if (DEBUG == true) {
          Serial.println ( "First chunk:" ) ;            // Header for printout of first chunk
          for ( i = 0 ; i < 32 ; i += 8 )                // Print 4 lines
          { Serial.printf ( "%02X %02X %02X %02X %02X %02X %02X %02X",
                            buf[i], buf[i + 1], buf[i + 2], buf[i + 3],
                            buf[i + 4], buf[i + 5], buf[i + 6], buf[i + 7] ) ;
            Serial.println ("");
          }  
        }
      }
      player.playChunk ( buf, bufcnt ) ;               // Yes, send to player
      bufcnt = 0 ;                                     // Reset count
    }
    totalcount++ ;                                     // Count number of bytes, ignore overflow
    if ( metaint != 0 )                                // No METADATA on Ogg streams or mp3 files
    {
      if ( --datacount == 0 )                          // End of datablock?
      {
        if ( bufcnt )                                  // Yes, still data in buffer?
        {
          player.playChunk ( buf, bufcnt ) ;           // Yes, send to player
          bufcnt = 0 ;                                 // Reset count
        }
        if (DEBUG == true)  Serial.println ( "Switch to METADATA" ) ;
        datamode = METADATA ;
        firstmetabyte = true ;                         // Expecting first metabyte (counter)
      }
    } else {     
          if (DEBUG == true)  Serial.println("Switching to NoMeta"); 
          datamode = NoMETA;
          station_connect(radioStation); 
    }
    return ;
  }
  if ( datamode == HEADER )                            // Handle next byte of MP3 header
  {
    if ( ( b > 0x7F ) ||                               // Ignore unprintable characters
         ( b == '\r' ) ||                              // Ignore CR
         ( b == '\0' ) )                               // Ignore NULL
    {
      // Yes, ignore
    }
    else if ( b == '\n' )                              // Linefeed ?
    {
      LFcount++ ;                                      // Count linefeeds

      if ( chkhdrline ( metaline.c_str() ) )           // Reasonable input?
      {
        lcml = metaline ;                              // Use lower case for compare
        lcml.toLowerCase() ;
        if (DEBUG == true) {
          Serial.println("metaline :");
          Serial.printf ( metaline.c_str() ) ;           // Yes, Show it
          Serial.println("");
        }  
        if ( lcml.indexOf ( "content-type" ) >= 0 )    // Line with "Content-Type: xxxx/yyy"
        {
          ctseen = true ;                              // Yes, remember seeing this
          ct = metaline.substring ( 14 ) ;             // Set contentstype. Not used yet
          if (DEBUG == true) {
            Serial.printf ( "%s seen.", ct.c_str() ) ;
            Serial.println("");
          }  
        }
        if ( lcml.startsWith ( "icy-br:" ) )
        {
          bitrate = metaline.substring(7).toInt() ;    // Found bitrate tag, read the bitrate
          if ( bitrate == 0 )                          // For Ogg br is like "Quality 2"
          {
            bitrate = 87 ;                             // Dummy bitrate
          }
        }
        else if ( lcml.startsWith ( "icy-metaint:" ) )
        {
          metaint = metaline.substring(12).toInt() ;   // Found metaint tag, read the value
        }
        else if ( lcml.startsWith ( "icy-name:" ) )
        {
          icyname = metaline.substring(9) ;            // Get station name
          icyname.trim() ;                             // Remove leading and trailing spaces
          if (DEBUG == true) {
            Serial.println(icyname);       
            Serial.println("");
          }  
        }
        else if ( lcml.startsWith ( "transfer-encoding:" ) )
        {
          // Station provides chunked transfer
          if ( lcml.endsWith ( "chunked" ) )
          {
            chunked = true ;                           // Remember chunked transfer mode
            chunkcount = 0 ;                           // Expect chunkcount in DATA
          }
        }
      }
      metaline = "" ;                                  // Reset this line
      if ( ( LFcount == 2 ) && ctseen )                // Some data seen and a double LF? ( ( LFcount == 2 ) && ctseen )
      {
        if (DEBUG == true) {
          Serial.printf ( "Switch to DATA, bitrate is %d"     // Show bitrate
                           ", metaint is %d",                  // and metaint
                            bitrate, metaint ) ;
          Serial.println("");
        }  
        datamode = DATA ;                              // Expecting data now
        datacount = metaint ;                          // Number of bytes before first metadata
        bufcnt = 0 ;                                   // Reset buffer count
        player.startSong() ;                           // Start a new song
       }
    }
    else
    {
      metaline += (char)b ;                            // Normal character, put new char in metaline
      LFcount = 0 ;                                    // Reset double CRLF detection
    }
    return ;
  }
  if ( datamode == METADATA )                          // Handle next byte of metadata
  {
    if ( firstmetabyte )                               // First byte of metadata?
    {
      firstmetabyte = false ;                          // Not the first anymore
      metacount = b * 16 + 1 ;                         // New count for metadata including length byte
      if ( metacount > 1 )
      {
        if (DEBUG == true)  Serial.printf ( "Metadata block %d bytes",
                   metacount - 1 ) ;                   // Most of the time there are zero bytes of metadata
      }
      metaline = "" ;                                  // Set to empty
    }
    else
    {
      metaline += (char)b ;                            // Normal character, put new char in metaline
    }
    if ( --metacount == 0 )
    {
      if ( metaline.length() )                         // Any info present?
      {
        // metaline contains artist and song name.  For example:
        // "StreamTitle='Don McLean - American Pie';StreamUrl='';"
        // Sometimes it is just other info like:
        // "StreamTitle='60s 03 05 Magic60s';StreamUrl='';"
        // Isolate the StreamTitle, remove leading and trailing quotes if present.
        showstreamtitle ( metaline.c_str(),false ) ;         // Show artist and title if present in metadata
      }
      if ( metaline.length() > 1500 )                  // Unlikely metaline length?
      {
        if (DEBUG == true)  Serial.printf ( "Metadata block too long! Skipping all Metadata from now on." ) ;
        metaint = 0 ;                                  // Probably no metadata
        metaline = "" ;                                // Do not waste memory on this
      }
      datacount = metaint ;                            // Reset data count
      bufcnt = 0 ;                                     // Reset buffer count
      if (DEBUG == true) Serial.println ( "Switch to DATA" ) ; 
      datamode = DATA ;                                // Expecting data
    }
  }
}
// end song tilte code

//******************************************************************************************
//                                  T I M E R 1 0 S E C                                    *
//******************************************************************************************
// Extra watchdog.  Called every 10 seconds.                                               *
// If totalcount has not been changed, there is a problem and playing will stop.           *
// Note that a "yield()" within this routine or in called functions will cause a crash!    *
//******************************************************************************************
void timer10sec()
{
  static uint32_t oldtotalcount = 7321 ;          // Needed foor change detection
  static uint8_t  morethanonce = 0 ;              // Counter for succesive fails
  static uint8_t  t600 = 0 ;                      // Counter for 10 minutes
  if (DEBUG == true) Serial.println("timer10sec");

  if ( datamode & ( INIT | HEADER | DATA |        // Test op playing
                    METADATA | NoMETA ) )
  {
    if ( totalcount == oldtotalcount )            // Still playing?
    {
      if (DEBUG == true) Serial.println ( "No data input" ) ;              // No data detected!
      if ( morethanonce > 10 )                    // Happened too many times?
      {
        if (DEBUG == true) Serial.println ( "Going to restart connection" ) ;
        datamode = INIT ; 
        station_connect(radioStation); 
        if (DEBUG == true) Serial.println ( "Switch to INIT" ) ;             

      }
      morethanonce++ ;                            // Count the fails
    }
    else
    {
      if ( morethanonce )                         // Recovered from data loss?
      {
        if (DEBUG == true) Serial.println ( "Recovered from dataloss" ) ;
        morethanonce = 0 ;                        // Data see, reset failcounter
      }
      oldtotalcount = totalcount ;                // Save for comparison in next cycle
    }
    if ( t600++ == 60 )                           // 10 minutes over?
    {
      t600 = 0 ;                                  // Yes, reset counter
      if (DEBUG == true) Serial.println ( "10 minutes over" ) ;
//      publishIP() ;                               // Re-publish IP
    }
  }
}
// data evaluation to find streaming info and play music end

void setup () {
// Start display
   tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
   tft.fillScreen(ST7735_BLACK);  
   tft.setRotation(1);
   display_Title();   
// rotary decoder
   pinMode (PinCLK, INPUT_PULLUP);                  // Set pinA (Clk) as input
   pinMode (PinDT, INPUT_PULLUP);                   // Set pinB as input
   // Put current pins state in variables
   PreviousCLK=digitalRead(PinCLK);
   PreviousDATA=digitalRead(PinDT);
   // Set the Switch pin to use Arduino PULLUP resistors
   pinMode(PinSW, INPUT_PULLUP);

// IR Start
   irrecv.enableIRIn();  // Start the receiver
// IR end

// play part buffer and timer initialisation
   ringbuf = (uint8_t *) malloc ( RINGBFSIZ ) ;         // Create ring buffer
   tckr.attach ( 10.0, timer10sec ) ;                   // Every 10 sec

// start serial port
   Serial.begin(115200);

// get data from ESP NVRAM
   preferences.begin("my-app", false);
   radioStation = preferences.getUInt("radioStation", 0);
   my_volume    = preferences.getUInt("Volume",70); 

// initialize SPI bus;
   SPI.begin();

// initialize VS1053 player
    player.begin();
//    player.switchToMp3Mode(); // optional, some boards require this
    player.setVolume(my_volume);

// connect tot FiFi
   WiFi.begin(ssid, pass);
   while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    if (DEBUG == true)  Serial.print(".");
   }
   if (DEBUG == true) {
     Serial.println("WiFi connected");  
     Serial.print("IP address:");  
   }  
   LocalIP=WiFi.localIP().toString();
   if (DEBUG == true) Serial.println(LocalIP);
   display_Connectto();
   displayIP();
   display_Volume(my_volume);
   
// store staion for later reference
   old_radioStation=radioStation;
   if (DEBUG == true)  Serial.printf("Current radioStation value: %u\n", radioStation);
   delay(100);
// play 'HELLO' text   
   player.playChunk(hello2, sizeof(hello2)); //VS1053 is wake up & running
// connect to stored station   
   if (DEBUG == true) Serial.println ( "Switch to INIT" ) ;
   datamode = INIT ; 
   station_connect(radioStation); 
   display_Station(radioStation);
}

// update radiostation after new input from IR or rotary decoder
void change_radiostation(){ 
   new_radioStation=radioStation;
   if(old_radioStation != new_radioStation) {
     if (DEBUG == true) {
       Serial.printf("Set radioStation to new_value: %u\n", radioStation);
       Serial.println ( "Switch to INIT" ) ;             
     }  
     player.softReset(); 
     datamode = INIT ; 
   }  
   station_connect(new_radioStation); 
   preferences.putUInt("radioStation",new_radioStation); // save station in nvram
   display_Station(new_radioStation);
   old_radioStation = new_radioStation;
}

// update volume after new input from IR or rotary decoder
void change_volume(){ 
   player.setVolume(my_volume);
   if (DEBUG == true)  Serial.printf("Volume: %u\n", my_volume);
   preferences.putUInt("Volume",my_volume); 
   display_Volume(my_volume);
   player.startSong();
}

// rotary extra code start
// update display information on volume or station after IR or rotary switch change
void update_vol_or_station(){ 
  if (rotating != true){
    rotating = true;
    if (DEBUG == true) Serial.println("rotating = true");
    if (pressed != true) rotary_step_counter = radioStation;  
  }
  previousMillisrotating = millis();
  if (pressed == true) { 
    previousMillispressed = millis();
    if (rotary_step_counter >= 101) rotary_step_counter = 100; 
    if (rotary_step_counter <= 0) rotary_step_counter = 0; 
    if (DEBUG == true) {
      Serial.print("Volume = ");
      Serial.println(rotary_step_counter);
    }  
    display_Volume(rotary_step_counter);
  } else {
    if(rotary_step_counter==nbrStations) rotary_step_counter=0;
    if (rotary_step_counter <= -1) rotary_step_counter=nbrStations-1;
    if (DEBUG == true) {
      Serial.print("Station = ");
      Serial.println(rotary_step_counter);
    }  
    display_Station(rotary_step_counter);
  }
}

// Check if Rotary Encoder was moved
void check_rotary() {
 if ((PreviousCLK == 0) && (PreviousDATA == 1)) {
    if ((digitalRead(PinCLK) == 1) && (digitalRead(PinDT) == 0)) {
      rotary_step_counter++;
      update_vol_or_station();
    }
    if ((digitalRead(PinCLK) == 1) && (digitalRead(PinDT) == 1)) {
      rotary_step_counter--;
      update_vol_or_station();
    }
  }
if ((PreviousCLK == 1) && (PreviousDATA == 1)) {
    if ((digitalRead(PinCLK) == 0) && (digitalRead(PinDT) == 1)) {
      rotary_step_counter++;
      update_vol_or_station();
    }
    if ((digitalRead(PinCLK) == 0) && (digitalRead(PinDT) == 0)) {
      rotary_step_counter--;
      update_vol_or_station();
    }
  }  
}
// rotary extra code end

// IR code start
// show debug info on serial monitor
void check_for_input(){
    if (IR_value >= 0) {
      if (IR_volume == true){
         if (DEBUG == true) {
           Serial.print("Volume update naar : ");       
           Serial.println(IR_value);
         }  
      }
      if (IR_station == true){
         if (DEBUG == true) {
           Serial.print("Station update naar : ");       
           Serial.println(IR_value);
         }  
       }
    }
}

// if IR receives digit ('0' .. '9') without leading '#' or '*' act on it as input for volume
void setdigitinput(){
    previousMillisIR  = millis();
    if (DEBUG == true) Serial.println("IR actief zonder keuze -> volume");
    IR_volume = true;
    digitinput = true;
    IR_value = 0; 
    Nbr_chars = 0;  
    display_Volume(my_volume);
}

// Set volume to new value in player
void Update_volume(){
    if (DEBUG == true) {
      Serial.println("Update_volume()");    
      Serial.print("Volume update naar : ");       
      Serial.println(my_volume);   
    }  
    change_volume(); 
}

// Set station to new value in player
void Update_Station(){
    if (DEBUG == true) {
      Serial.println("Update_Station()");    
      Serial.print("Station update naar : ");       
      Serial.println(radioStation);
    }  
    change_radiostation();
}
// IR code end

void process_IR_Digit(int digit) {
   if (DEBUG == true) {
       Serial.print("digit 1 : ");
       Serial.println(digit);
       Serial.print("Nbr_chars 1 : ");
       Serial.println(Nbr_chars);
   }
   if (Nbr_chars == 0) { 
     Serial.println("clear IR_Value and my_volume; volume was set to 100 and new input was detected; so we start over again ");
     IR_value = 0;
     my_volume = 0;
   }
   if (DEBUG == true) {
       Serial.print("digit 2 : ");
       Serial.println(digit);
       Serial.print("Nbr_chars 2 : ");
       Serial.println(Nbr_chars);
}
   if ((IR_volume == false) && (IR_station == false)) {
     if (DEBUG == true) {
       Serial.println(" - setdigitinput");
       Serial.println(digit);
     }  
     setdigitinput();
   }
   if (Nbr_chars = 0) {
     IR_value = digit;
     Nbr_chars++;
   } else {
     if (Nbr_chars = 1) {
       IR_value = 10 * IR_value + digit;
       Nbr_chars++;
     }
   }  
}

void loop() {
   // IR code start
   unsigned long currentMillis = millis();
   if ( (IR_volume == true) || (IR_station == true)) {
     if (currentMillis - previousMillisIR >= IR_interval) {
      if (DEBUG == true) Serial.println("currentMillis - previousMillisIR >= IR_interval"); 
       if (digitinput == true){
         check_for_input(); 
         if (IR_volume == true) {
          my_volume = IR_value;  
         } else {
          radioStation = IR_value;
         }
       }  
       IR_value = 0; 
       Nbr_chars = 0;  
       digitinput = false; 
       if (DEBUG == true) {
         Serial.println("Took to long after last key input; use input end start waiting for new input on IR"); 
         Serial.print("Volume 0 : ");
         Serial.println(my_volume);
         Serial.print("Radiostation 0 : ");
         Serial.println(radioStation);    
       }  
       if (IR_volume == true) { Update_volume();  }
       if (IR_station == true) { Update_Station(); }
       IR_volume = false;
       IR_station = false;
     }  
   }
   if (irrecv.decode(&results)){
        if (results.value == 0XFFFFFFFF) // repeat
         results.value = key_value;
        previousMillisIR  = millis();
        switch(results.value){
          case 0xFF38C7:  // OK pressed; activate value entered to player        
            if (DEBUG == true) Serial.println("OK");
            if (digitinput == true){
              if (DEBUG == true){
                Serial.print("OK : ");
                Serial.println(IR_value);
              }  
              check_for_input();
              if (IR_volume == true) {
                my_volume = IR_value;  
              } else {
                radioStation = IR_value;
              }
            }  
            digitinput = false; 
            IR_value = 0; 
            Nbr_chars = 0;  
            if (DEBUG == true) { 
              Serial.println("Update IR data to player");
              Serial.print("Volume 1 : ");
              Serial.println(my_volume);
              Serial.print("Radiostation 1 : ");
              Serial.println(radioStation);   
            }  
            if (IR_volume == true) { Update_volume(); }
            if (IR_station == true) { Update_Station(); }
            IR_volume = false;
            IR_station = false;
          break ;    
          case 0xFF18E7:
           if (DEBUG == true) Serial.println("Volume Up (Up)");
           IR_volume = true;
           digitinput = false;
           my_volume++;
           if (my_volume >= 101) my_volume = 100;
           if (DEBUG == true)  {
             Serial.print("Volume 2 : ");  
             Serial.println(my_volume); 
           }  
           display_Volume(my_volume);
           break ;
          case 0xFF10EF:
           if (DEBUG == true) Serial.println("Station terug (Left)");
           IR_station = true;
           digitinput = false;
           radioStation--;
           if (radioStation < 0){
            radioStation = nbrStations-1;
           }
           display_Station(radioStation);
           break ;
          case 0xFF5AA5:
           if (DEBUG == true) Serial.println("Station vooruit (Right)");
           IR_station = true;
           digitinput = false;
           radioStation++;
           if (radioStation >= nbrStations) radioStation = 0;
           if (DEBUG == true) {
             Serial.print("Radiostation 3 : ");
             Serial.println(radioStation);          
           }  
           display_Station(radioStation);
           break ;
          case 0xFF4AB5:
           if (DEBUG == true) Serial.println("Volume Down (Down)");
           IR_volume = true;
           digitinput = false;
           my_volume--;
           if (my_volume < 0) my_volume = 0;
           if (DEBUG == true) {
             Serial.print("Volume 3 : ");
             Serial.println(my_volume); 
           }  
           display_Volume(my_volume);
           break ;                     
          case 0xFFA25D:
            process_IR_Digit(1);
            break;
          case 0xFF629D:
            process_IR_Digit(2);
            break;
          case 0xFFE21D:
            process_IR_Digit(3);
          break;
          case 0xFF22DD:
            process_IR_Digit(4);
            break;
          case 0xFF02FD:
            process_IR_Digit(5);
            break ;  
          case 0xFFC23D:
            process_IR_Digit(6);
            break ;               
          case 0xFFE01F:
            process_IR_Digit(7);
            break ;  
          case 0xFFA857:
            process_IR_Digit(8);
           break ;  
          case 0xFF906F:
            process_IR_Digit(9);
           break ;  
          case 0xFF9867:
            process_IR_Digit(0);
           break ; 
          case 0xFF6897:
            if (DEBUG == true) Serial.println("* - volume");
            if ((IR_volume == false) && (IR_station == false)) {
              if (DEBUG == true) {
                Serial.println(" - setdigitinput");
                Serial.println("*");
              }  
              setdigitinput();
            }
            IR_volume = true;
            IR_station = false; 
            IR_value = 0; 
            Nbr_chars = 0;  
            display_Volume(my_volume);
            break ;  
          case 0xFFB04F:
            if (DEBUG == true) Serial.println("# - station");
            if ((IR_volume == false) && (IR_station == false)) {
              if (DEBUG == true) {
                Serial.println(" - setdigitinput");
                Serial.println("#");
              }  
              setdigitinput();
            }
            IR_volume = false;
            IR_station = true;   
            IR_value = 0; 
            Nbr_chars = 0;           
            display_Station(radioStation); 
            break ;
        }
   // do check on entered data to keep it in right value 0 <-> 100 for volume; 0 <-> nbrStations-1 for stations and update player
   if (digitinput == true) {
     if (DEBUG == true) {
       Serial.print("IR_value 1 : ");
       Serial.println(IR_value);   
     }  
     if (IR_station == true) {
       if (DEBUG == true) Serial.println("IR_station == true");   
       if (IR_value >= nbrStations) {
        if (DEBUG == true) Serial.println("IR_value >= nbrStations");   
        IR_value = 0;
       } else {
        if (IR_value < 0) {
        if (DEBUG == true) Serial.println("IR_value < 0");   
        IR_value = nbrStations-1;
        }        
       }     
       radioStation = IR_value;
       if (DEBUG == true)  {
         Serial.print("Radiostation 2 : ");
         Serial.println(radioStation); 
       }  
       display_Station(radioStation);  
     }
     if (IR_volume == true) {
       if (DEBUG == true) Serial.println("IR_volume == true");   
       if (IR_value > 100) {
        if (DEBUG == true) Serial.println("IR_value > 100");   
        IR_value = 100;
        Nbr_chars = 0; 
       } else {
         if (IR_value < 0) {
           if (DEBUG == true) Serial.println("IR_value < 0");   
           IR_value = 0;       
         }
       }
       my_volume = IR_value;
       if (DEBUG == true) {
...

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

Preferences.h

Arduino
library to store data on ESP32
// Preferences.h
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef _PREFERENCES_H_
#define _PREFERENCES_H_

#include "Arduino.h"

class Preferences {
    protected:
        uint32_t _handle;
        bool _started;
        bool _readOnly;
    public:
        Preferences();
        ~Preferences();

        bool begin(const char * name, bool readOnly=false);
        void end();

        bool clear();
        bool remove(const char * key);

        size_t putChar(const char* key, int8_t value);
        size_t putUChar(const char* key, uint8_t value);
        size_t putShort(const char* key, int16_t value);
        size_t putUShort(const char* key, uint16_t value);
        size_t putInt(const char* key, int32_t value);
        size_t putUInt(const char* key, uint32_t value);
        size_t putLong(const char* key, int32_t value);
        size_t putULong(const char* key, uint32_t value);
        size_t putLong64(const char* key, int64_t value);
        size_t putULong64(const char* key, uint64_t value);
        size_t putFloat(const char* key, float_t value);
        size_t putDouble(const char* key, double_t value);
        size_t putBool(const char* key, bool value);
        size_t putString(const char* key, const char* value);
        size_t putString(const char* key, String value);
        size_t putBytes(const char* key, const void* value, size_t len);

        int8_t getChar(const char* key, int8_t defaultValue = 0);
        uint8_t getUChar(const char* key, uint8_t defaultValue = 0);
        int16_t getShort(const char* key, int16_t defaultValue = 0);
        uint16_t getUShort(const char* key, uint16_t defaultValue = 0);
        int32_t getInt(const char* key, int32_t defaultValue = 0);
        uint32_t getUInt(const char* key, uint32_t defaultValue = 0);
        int32_t getLong(const char* key, int32_t defaultValue = 0);
        uint32_t getULong(const char* key, uint32_t defaultValue = 0);
        int64_t getLong64(const char* key, int64_t defaultValue = 0);
        uint64_t getULong64(const char* key, uint64_t defaultValue = 0);
        float_t getFloat(const char* key, float_t defaultValue = NAN);
        double_t getDouble(const char* key, double_t defaultValue = NAN);
        bool getBool(const char* key, bool defaultValue = false);
        size_t getString(const char* key, char* value, size_t maxLen);
        String getString(const char* key, String defaultValue = String());
	size_t getBytesLength(const char* key);
        size_t getBytes(const char* key, void * buf, size_t maxLen);
        size_t freeEntries();
};

#endif

helloMp3.h

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





unsigned char hello2[] = {
  0xFF,0xF2,0x40,0xC0,0x19,0xB7,0x00,0x14,0x02,0xE6,0x5C, /* ..@.......\ */
  0x01,0x92,0x68,0x01,0xF1,0x5E,0x03,0x08,0xF0,0x24,0x80, /* ..h..^...$. */
  0x05,0x9E,0x20,0xC6,0xFC,0x12,0x32,0x5C,0xBF,0xF9,0xB9, /* .. ...2\... */
  0x20,0x4A,0x7F,0x85,0xEC,0x4C,0xCD,0xC7,0x27,0xFE,0x5C, /*  J...L..'.\ */
  0x34,0x25,0xCB,0xE6,0xFF,0xFF,0x8E,0x42,0xE1,0xA0,0x5E, /* 4%.....B..^ */
  0xCA,0x6E,0x30,0x9F,0xFF,0xF8,0xC2,0x12,0x84,0xB9,0x7C, /* .n0.......| */
  0xDC,0x61,0x09,0x4A,0x7F,0xFF,0xFF,0xF9,0x7D,0x32,0x51, /* .a.J....}2Q */
  0x09,0x7C,0xE1,0xA5,0x6E,0xB4,0xFF,0xFF,0xFF,0xFF,0xD3, /* .|..n...... */
  0x34,0x41,0x91,0xF0,0x11,0x8F,0x00,0x0F,0x81,0x9C,0x10, /* 4A......... */
  0xEE,0x59,0xCE,0x56,0x67,0xFF,0xF2,0x42,0xC0,0xEC,0x53, /* .Y.Vg..B..S */
  0x09,0x15,0xF9,0xAA,0xA8,0x0D,0xD9,0x40,0x00,0xCA,0x34, /* .......@..4 */
  0x53,0xD9,0x18,0xAB,0x7D,0xF7,0x89,0x3F,0x11,0x38,0x94, /* S...}..?.8. */
  0x82,0x59,0x93,0x20,0x6A,0x0C,0xEE,0x8E,0x58,0xFA,0x38, /* .Y. j...X.8 */
  0x82,0xCA,0xF0,0x58,0xBB,0xDA,0x0C,0x50,0x56,0x1F,0xBB, /* ...X...PV.. */
  0x18,0x5D,0x8B,0x9F,0xDA,0x71,0x4F,0xFF,0xBD,0xFE,0xEF, /* .]...qO.... */
  0x69,0x36,0x86,0x3C,0x50,0xBB,0x0A,0x07,0x89,0x54,0xF0, /* i6.<P....T. */
  0x88,0x9F,0x90,0x95,0x30,0x94,0x2E,0x7E,0xF0,0x64,0x96, /* ....0..~.d. */
  0x79,0x08,0x3E,0x20,0x97,0x28,0x34,0x9C,0x09,0x7F,0xD2, /* y.> .(4.... */
  0xC0,0x01,0x75,0xF8,0x05,0x6B,0x5F,0x41,0x17,0x0B,0xE7, /* ..u..k_A... */
  0xFF,0xF2,0x40,0xC0,0x61,0xE5,0x0B,0x16,0x09,0xC6,0xC5, /* ..@.a...... */
  0x74,0x7B,0xCC,0x94,0x7A,0xF7,0x80,0x76,0xB2,0xD2,0xF8, /* t{..z..v... */
  0x39,0x06,0x38,0xFD,0x71,0xC5,0xDE,0x3A,0x38,0xBF,0xD5, /* 9.8.q..:8.. */
  0xF7,0x12,0x37,0xCB,0xF5,0x63,0x0C,0x9B,0xCE,0x77,0x25, /* ..7..c...w% */
  0xED,0xFB,0x3D,0x6B,0x35,0xF9,0x6D,0xD7,0xF9,0x2C,0xD1, /* ..=k5.m..,. */
  0x97,0x15,0x87,0x93,0xA4,0x49,0x4A,0x18,0x16,0x07,0xA1, /* .....IJ.... */
  0x60,0xF7,0x52,0x94,0xDB,0x02,0x16,0x70,0xB2,0xD8,0x80, /* `.R....p... */
  0x30,0xC2,0x94,0x40,0x81,0x74,0x5A,0x19,0x7A,0x80,0x60, /* 0..@.tZ.z.` */
  0x41,0x21,0x46,0x95,0xD5,0xC4,0x40,0xD2,0x01,0xC0,0x01, /* A!F...@.... */
  0xDA,0xD9,0xA0,0xB1,0x01,0xFF,0xF2,0x42,0xC0,0x82,0x10, /* .......B... */
  0x0B,0x12,0xF9,0x9E,0xC9,0x7E,0x7A,0xC6,0x95,0x55,0x09, /* .....~z..U. */
  0x8B,0x19,0x5E,0x8B,0x26,0xCA,0xEB,0x68,0x8A,0x05,0x8F, /* ..^.&..h... */
  0x36,0xA5,0xA5,0x03,0xB8,0x9C,0xED,0x24,0x51,0x59,0x90, /* 6......$QY. */
  0xF6,0xC5,0x7D,0xB5,0xAD,0xAF,0xF6,0x3B,0x18,0xEF,0x3F, /* ..}....;..? */
  0xFF,0xFF,0x4E,0xDE,0x16,0x66,0x0B,0xAA,0x33,0x23,0xDD, /* ..N..f..3#. */
  0x9C,0x4E,0x6E,0x55,0x22,0x9D,0xA2,0x40,0xA6,0x36,0x31, /* .NnU"..@.61 */
  0x69,0xA5,0xE1,0xD9,0x7F,0xF7,0xC6,0xCC,0x48,0x00,0x0E, /* i.......H.. */
  0x90,0x16,0x00,0x0F,0xDE,0x6E,0x80,0x11,0x0C,0x9A,0x4F, /* .....n....O */
  0x56,0xDB,0x88,0xD3,0xB2,0x1C,0x00,0xE0,0x2E,0x3E,0xAC, /* V........>. */
  0xFF,0xF2,0x40,0xC0,0x1C,0xE5,0x19,0x13,0x31,0x4E,0xCD, /* ..@.....1N. */
  0x9E,0xC3,0x06,0x71,0x03,0x85,0xE5,0xB5,0x6D,0x88,0x50, /* ...q....m.P */
  0x8E,0x0E,0x17,0x3B,0x19,0xFB,0x4E,0x3B,0x99,0xEF,0x4C, /* ...;..N;..L */
  0x9E,0xF7,0x7B,0x31,0x7C,0x3C,0x5F,0xFF,0xF4,0xF8,0xE3, /* ..{1|<_.... */
  0x92,0x42,0x07,0x8E,0x83,0x8E,0x0F,0x05,0x08,0x91,0xA3, /* .B......... */
  0x16,0xE2,0xDF,0xB7,0x62,0x60,0x48,0x31,0x3C,0xFF,0xD4, /* ....b`H1<.. */
  0x9E,0x0C,0x68,0x00,0x77,0x54,0xE3,0x1E,0x05,0xC5,0xF8, /* ..h.wT..... */
  0xEA,0x8D,0x82,0x9D,0x08,0xA9,0x06,0x8D,0x1E,0x5D,0x7C, /* .........]| */
  0x7F,0x08,0xC0,0x50,0x45,0x42,0xD0,0x36,0xF8,0xB2,0x4D, /* ...PEB.6..M */
  0x53,0x0C,0x80,0x3B,0x4D,0xFF,0xF2,0x42,0xC0,0x2F,0x3C, /* S..;M..B./< */
  0x25,0x19,0x29,0xFE,0xBC,0x2E,0xC4,0xD0,0x99,0x4C,0x48, /* %.)......LH */
  0xB0,0x9C,0x49,0xD2,0x1A,0x2D,0x02,0xC2,0x79,0x69,0x16, /* ..I..-..yi. */
  0x92,0xA8,0xC5,0xAB,0x45,0x5A,0x68,0xE8,0x75,0x57,0xCD, /* ....EZh.uW. */
  0xF1,0xB9,0xAA,0x13,0x88,0xE4,0x87,0x42,0x15,0xB3,0x58, /* .......B..X */
  0xF5,0xA3,0x46,0xB1,0xCF,0xD3,0x59,0x7E,0xBA,0xB5,0xA7, /* ..F...Y~... */
  0x6B,0x0B,0x17,0x57,0x6B,0x5C,0x4A,0xCD,0x53,0x76,0x2A, /* k..Wk\J.Sv* */
  0x1D,0x28,0xC5,0x1C,0x76,0x5C,0xDD,0x0A,0x00,0x4B,0xC0, /* .(..v\...K. */
  0x1B,0xCA,0xA8,0xE9,0x81,0x5B,0xA6,0xDC,0xA4,0x59,0x13, /* .....[...Y. */
  0xFC,0xBA,0x8F,0x98,0x79,0x44,0x25,0xC9,0x35,0x38,0xCA, /* ....yD%.58. */
  0xFF,0xF2,0x40,0xC0,0xB9,0x7D,0x1A,0x13,0x79,0x6A,0xC8, /* ..@..}..yj. */
  0x3E,0xC4,0x46,0x94,0x8D,0x3C,0x67,0x85,0xB1,0xA8,0x89, /* >.F..<g.... */
  0xC0,0xF2,0xE6,0x2F,0x9D,0x7C,0xC9,0xB4,0xBE,0xCF,0xE1, /* .../.|..... */
  0x7D,0xFE,0x1F,0x03,0x00,0x12,0x84,0x72,0x8C,0xE7,0xD8, /* }......r... */
  0x5E,0xC9,0xA9,0x01,0xBA,0x9B,0xC4,0x10,0x5C,0x70,0x2E, /* ^.......\p. */
  0x6C,0x48,0xE7,0x8C,0x15,0x0B,0x06,0x01,0xE5,0xFF,0xFF, /* lH......... */
  0xD4,0x0D,0x00,0x0F,0xCE,0x58,0x95,0x61,0xA8,0x9E,0x7B, /* .....X.a..{ */
  0x19,0x98,0xB0,0xF0,0xC6,0x72,0x82,0xD5,0x27,0x06,0x47, /* .....r..'.G */
  0x41,0x22,0x0F,0x65,0x93,0xC9,0x8A,0x09,0x19,0x48,0x1B, /* A".e.....H. */
  0xBD,0xD6,0x64,0x1A,0xAC,0xFF,0xF2,0x42,0xC0,0xF1,0x11, /* ..d....B... */
  0x25,0x14,0x22,0x06,0xBC,0x0E,0xD4,0x4E,0x99,0x90,0xA8, /* %."....N... */
  0xD8,0xB7,0xAD,0x5D,0x3E,0xAF,0x6E,0xBE,0x66,0x83,0xA4, /* ...]>.n.f.. */
  0xE3,0xC2,0xE0,0x29,0x43,0x87,0x5F,0x4F,0x27,0x9C,0x2C, /* ...)C._O'., */
  0xD0,0x91,0xF3,0x87,0x9B,0x54,0xED,0xD1,0xB4,0xF3,0x39, /* .....T....9 */
  0x87,0x22,0x06,0x86,0x0D,0x71,0xE4,0x6F,0x2A,0x08,0x04, /* ."...q.o*.. */
  0xC0,0x03,0x2A,0xB1,0xE2,0x05,0x4D,0x64,0xA1,0x9C,0xA6, /* ..*...Md... */
  0x0D,0x41,0xA6,0xF2,0x7A,0xC1,0x30,0xC3,0x38,0x26,0x09, /* .A..z.0.8&. */
  0x50,0x08,0xC4,0xF6,0x30,0x0C,0xA6,0xA9,0x17,0x00,0x13, /* P...0...... */
  0x0C,0xDC,0xC4,0x2F,0x28,0xEB,0x3F,0xCD,0x7A,0x3D,0x2F, /* .../(.?.z=/ */
  0xFF,0xF2,0x40,0xC0,0x18,0x6F,0x2E,0x13,0xA1,0xF2,0xBC, /* ..@..o..... */
  0x36,0xCB,0x4E,0x99,0x6E,0xFC,0xEE,0xC5,0xF0,0xA0,0xB7, /* 6.N.n...... */
  0x92,0xD4,0xEE,0x79,0x7C,0x50,0x5D,0xE5,0x04,0x94,0xA9, /* ...y|P].... */
  0x76,0xCF,0x6C,0x70,0xDD,0x0D,0xD4,0xEE,0xED,0x98,0xE8, /* v.lp....... */
  0xC8,0x35,0x36,0x7A,0x0C,0x05,0x80,0x03,0xBC,0xBE,0x91, /* .56z....... */
  0x00,0x7C,0xAE,0x65,0xB8,0x91,0xA3,0x33,0xBA,0x68,0x60, /* .|.e...3.h` */
  0xD4,0x1A,0x66,0xF8,0x43,0xA0,0x20,0x89,0xE7,0x80,0xD8, /* ..f.C. .... */
  0x1E,0x4F,0xA0,0x04,0x60,0x06,0x0A,0xA4,0x91,0x24,0xFA, /* .O..`....$. */
  0x9F,0x57,0x53,0xF4,0x7A,0xDB,0x5F,0x56,0xE3,0x6E,0x0B, /* .WS.z._V.n. */
  0x8B,0x3A,0x1C,0xF9,0x5E,0xFF,0xF2,0x42,0xC0,0xB1,0x00, /* .:..^..B... */
  0x38,0x14,0x09,0xEE,0xB4,0x36,0xD3,0x4E,0x99,0xA4,0x78, /* 8....6.N..x */
  0x94,0x73,0xC4,0x66,0x30,0xF5,0xEA,0xDB,0xBA,0x67,0x67, /* .s.f0....gg */
  0x95,0x6B,0xAB,0x68,0x5D,0x08,0xA1,0x39,0x56,0xAB,0x1E, /* .k.h]..9V.. */
  0xD5,0x03,0xE8,0x01,0x70,0x00,0xB3,0x93,0x33,0x19,0x8C, /* ....p...3.. */
  0x61,0x8F,0xBB,0x5D,0x24,0x12,0x63,0xD3,0x4B,0x5D,0x91, /* a..]$.c.K]. */
  0x08,0x43,0x22,0x56,0x1A,0xC5,0x10,0x21,0x84,0xA8,0xEA, /* .C"V...!... */
  0x80,0xBF,0x16,0x8E,0x3D,0x46,0x18,0x9C,0x6E,0x9A,0x91, /* ....=F..n.. */
  0xE6,0xC9,0x6F,0xD2,0x7D,0x27,0xD7,0xE9,0x6B,0xFF,0x0A, /* ..o.}'..k.. */
  0x03,0x43,0x89,0xD5,0xBF,0x52,0x97,0x0A,0x25,0x95,0x0D, /* .C...R..%.. */
  0xFF,0xF2,0x40,0xC0,0xF5,0xC3,0x41,0x13,0x81,0xEE,0xA8, /* ..@...A.... */
  0x5E,0xD3,0x44,0x98,0xFC,0xCF,0x97,0xF9,0x58,0xB5,0x33, /* ^.D.....X.3 */
  0xB1,0x85,0x47,0x86,0xD7,0x98,0x01,0x3B,0xA3,0x4F,0x7E, /* ..G....;.O~ */
  0x04,0xA6,0xC3,0x39,0x21,0x70,0x27,0x62,0xB5,0x18,0x10, /* ...9!p'b... */
  0x09,0x99,0x00,0x8B,0x7E,0xF2,0xBF,0x52,0x18,0x26,0x30, /* ....~..R.&0 */
  0x1C,0xB0,0x01,0x49,0x30,0xE0,0xC3,0x11,0x46,0x05,0xCC, /* ...I0...F.. */
  0x49,0x14,0x28,0xB2,0xED,0x4B,0x57,0x5A,0x2F,0xB7,0x46, /* I.(..KWZ/.F */
  0x63,0x34,0xD2,0xDA,0x9F,0x56,0x32,0xB7,0xA2,0x25,0xFF, /* c4...V2..%. */
  0x94,0x28,0x33,0x7F,0x3B,0xC4,0x50,0xEC,0xB1,0xE2,0x26, /* .(3.;.P...& */
  0xA1,0xB7,0x07,0x7F,0xFB,0xFF,0xF2,0x42,0xC0,0x67,0x6A, /* .......B.gj */
  0x4C,0x13,0xF9,0x6A,0x90,0x7E,0xDB,0x44,0x94,0x3F,0xFF, /* L..j.~.D.?. */
  0x14,0xD6,0x2A,0xFF,0xFF,0xC1,0x34,0x8C,0x48,0x22,0x00, /* ..*...4.H". */
  0x06,0x8F,0x21,0xFD,0x64,0x60,0x04,0x92,0x42,0xEA,0x74, /* ..!.d`..B.t */
  0x32,0x37,0xAA,0x5A,0x9F,0x67,0x01,0x8B,0x3F,0x37,0x31, /* 27.Z.g..?71 */
  0xDD,0x06,0x3C,0x01,0x34,0x30,0xE0,0x5C,0x78,0x78,0xCB, /* ..<.40.\xx. */
  0xD6,0xF1,0x31,0x8A,0x69,0x61,0x93,0x92,0x42,0xCE,0x4B, /* ..1.ia..B.K */
  0xC5,0x02,0x4E,0x73,0xC6,0x24,0x30,0xCD,0x08,0x66,0xC6, /* ..Ns.$0..f. */
  0x35,0xAB,0xA2,0x3D,0x2F,0xB3,0xBD,0x34,0x87,0x13,0xEE, /* 5..=/..4... */
  0x71,0x45,0x68,0xFA,0xEA,0x05,0x84,0x41,0x36,0x4C,0x9A, /* qEh....A6L. */
  0xFF,0xF2,0x40,0xC0,0xC9,0x92,0x56,0x13,0xD0,0x6E,0x70, /* ..@...V..np */
  0x54,0xD3,0xCC,0x28,0x06,0xD7,0x0E,0xA4,0x1D,0x9C,0x9D, /* T..(....... */
  0xD9,0xA9,0x88,0x7B,0xB5,0xA3,0x56,0xB7,0x4B,0x4B,0x5A, /* ...{..V.KKZ */
  0x9B,0x2C,0xA9,0xAD,0x6F,0x99,0x6C,0xC0,0x4C,0x14,0x14, /* .,..o.l.L.. */
  0xEF,0xB4,0x20,0x91,0x5F,0xBC,0x81,0x41,0x41,0x5D,0xD4, /* .. ._..AA]. */
  0x20,0xBD,0x05,0x1A,0x6F,0xE2,0x68,0x56,0x41,0x41,0x57, /*  ...o.hVAAW */
  0xF9,0xBF,0x89,0x82,0x8E,0xC7,0x8F,0x0A,0x0A,0x09,0x37, /* ..........7 */
  0xF1,0x05,0x0A,0x0A,0x0A,0x0A,0x09,0x05,0x37,0xFF,0x10, /* ........7.. */
  0x50,0x50,0x53,0x65,0xFF,0xFF,0xFD,0x75,0xDF,0xFF,0xFF, /* PPSe...u... */
  0x68,0x4F,0xFF,0x84,0x70,0xFF,0xF2,0x42,0xC0,0x27,0x50, /* hO..p..B.'P */
  0x5F,0x17,0xE8,0x82,0x3C,0x11,0x58,0x18,0x01,0x55,0x48, /* _...<.X..UH */
  0xBC,0x52,0xFC,0x4A,0x4C,0x3C,0xD5,0xF6,0x11,0x2D,0xBF, /* .R.JL<...-. */
  0xEA,0x03,0x5C,0x57,0x29,0xBF,0xC3,0x75,0x1C,0xE6,0xDD, /* ..\W)..u... */
  0xBF,0xED,0xEF,0xD0,0x98,0x77,0x71,0x95,0x73,0xFF,0xED, /* .....wq.s.. */
  0x54,0xBE,0xD5,0xEE,0xAE,0xC2,0xD5,0x0B,0xFF,0xF1,0x97, /* T.......... */
  0x8A,0xE4,0x42,0x09,0x99,0xB1,0xEA,0x94,0xDC,0x78,0xB5, /* ..B......x. */
  0x34,0x0F,0xF1,0x8F,0xFC,0x15,0xF6,0xFA,0xB1,0x47,0xA9, /* 4........G. */
  0x6C,0x67,0x43,0x8B,0xF2,0x76,0x22,0xED,0xDA,0x85,0xBA, /* lgC..v".... */
  0x2F,0xC7,0xF9,0xCF,0xFC,0xDB,0x46,0x2E,0x50,0x0A,0x84, /* /.....F.P.. */
  0xFF,0xF2,0x40,0xC0,0xC6,0x4A,0x59,0x28,0x2B,0x19,0xE0, /* ..@..JY(+.. */
  0x01,0x89,0x78,0x00,0x52,0x85,0x3C,0x8E,0x54,0x9A,0x48, /* ..x.R.<.T.H */
  0x5A,0x72,0x32,0x94,0xBF,0x43,0x4F,0x24,0x53,0x4B,0xEC, /* Zr2..CO$SK. */
  0x4B,0x99,0x0E,0x66,0x1F,0xFF,0xCE,0x7F,0xFF,0x3F,0x10, /* K..f.....?. */
  0xAE,0x82,0x62,0x71,0x34,0x18,0x59,0x9B,0x51,0xC7,0x59, /* ..bq4.Y.Q.Y */
  0xCE,0xEE,0xA5,0xFE,0x02,0xBB,0x30,0x91,0x49,0xD5,0x4B, /* ......0.I.K */
  0xF3,0xDC,0x9A,0xA9,0x57,0x8E,0x72,0x10,0xC0,0x5D,0x60, /* ....W.r..]` */
  0x67,0xFC,0x7D,0xD6,0xBA,0xDD,0xB3,0x8B,0x5A,0x0A,0x4C, /* g.}.....Z.L */
  0x41,0x4D,0x45,0x33,0x2E,0x39,0x33,0xAA,0xAA,0xAA,0xAA, /* AME3.93.... */
  0xAA,0xAA,0xAA,0xAA,0xAA,0x54,0x41,0x47,0x48,0x65,0x6C, /* .....TAGHel */
  0x6C,0x6F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* lo          */
  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /*             */
  0x20,0x20,0x20,0x20,0x20,0x50,0x61,0x6E,0x75,0x2D,0x4B, /*      Panu-K */
  0x72,0x69,0x73,0x74,0x69,0x61,0x6E,0x20,0x50,0x6F,0x69, /* ristian Poi */
  0x6B,0x73,0x61,0x6C,0x6F,0x20,0x20,0x20,0x20,0x20,0x20, /* ksalo       */
  0x20,0x20,0x56,0x53,0x44,0x53,0x50,0x20,0x54,0x65,0x73, /*   VSDSP Tes */
  0x74,0x69,0x6E,0x67,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* ting        */
  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /*             */
  0x20,0x20,0x20,0x4D,0x50,0x33,0x20,0x48,0x65,0x6C,0x6C, /*    MP3 Hell */
  0x6F,0x2C,0x20,0x57,0x6F,0x72,0x6C,0x64,0x21,0x20,0x20, /* o, World!   */
  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /*             */
  0x00, /* . */
};

radiostations.h

Arduino
Updated file
// Number of radio stations 28-11-2021
const int nbrStations = 14;
// Radio Stations - main URL
char *host[nbrStations] = {"icecast.omroep.nl",
                           "icecast.omroep.nl",
                           "icecast.omroep.nl",
                           "icecast.omroep.nl",
                           "icecast.omroep.nl",
                           "21233.live.streamtheworld.com",
                           "22553.live.streamtheworld.com",
                           "icecast-qmusicnl-cdp.triple-it.nl",
                           "22593.live.streamtheworld.com",
                           "20873.live.streamtheworld.com",
                           "25683.live.streamtheworld.com",
                           "22593.live.streamtheworld.com",
                           "rva.ice.infomaniak.ch",
                           "stream.gal.io"};
// Radio Stations - part following main URL
char *path[nbrStations] = {"/radio1-bb-mp3",
                           "/radio2-bb-mp3",
                           "/3fm-bb-mp3",
                           "/radio4-bb-mp3",
                           "/radio5-bb-mp3",
                           "/100PNL_MP3_SC?",
                           "/RADIO538.mp3",
                           "/Qmusic_nl_live_96.mp3",
                           "/RADIO10.mp3",
                           "/VERONICA.mp3",
                           "/SKYRADIO.mp3",
                           "/SLAM_MP3_SC",
                           "/rva-high.mp3",
                           "/arrow"};
// Radio Stations - port number
int   port[nbrStations] = {80,80,80,80,80,80,80,80,80,80,80,80,80,80};
// Radio Stations - info shown on display
char *sname[nbrStations] = {"Radio 1",
                            "Radio 2",
                            "Radio 3",
                            "Radio 4",
                            "Radio 5",
                            "100% NL",
                            "RADIO 538",
                            "QMusic",
                            "Radio 10",
                            "Veronica",
                            "Sky Radio",
                            "Slam",
                            "RVA",
                            "Arrow Classic Rock"};

Credits

Hans63

Hans63

3 projects • 5 followers
I started programming innpascal and for 6800 and z80 cpu's and upgraded my TRS-80. Some years ago I began with Arduino and it is fun.

Comments