Subversion Repositories gelsvn

Rev

Rev 563 | Rev 627 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* ----------------------------------------------------------------------- *
 * This file is part of GEL, http://www.imm.dtu.dk/GEL
 * Copyright (C) the authors and DTU Informatics
 * For license and list of authors, see ../../doc/intro.pdf
 * ----------------------------------------------------------------------- */

/**
 * @file   Console.cpp
 * @author Anders Wang Kristensen <awk@imm.dtu.dk>
 * @date   Fri Oct 22 18:36:58 2011
 */

#include <GLGraphics/Console.h>
#include <GLGraphics/gel_glut.h>

#include <cstdarg>
#include <set>
#include <iostream> //cerr
#include <iterator> //back_inserter
#include <fstream>
#include <utility> //min

#include <GLGraphics/stb_image_aug.h>

static const char* history_filename = "history.txt";

static const int line_spacing = 13;
static const int char_spacing = 7;

using namespace GLGraphics;

//----------------------------------------------------------------------------

Console::Console() : m_history_index(0), m_caret(0),
                     m_id_counter(0), m_is_executing(false),
                     m_font(0)
{
    load_history();

    //register builtin commands
    void (Console::*help0)() = &Console::help;
    reg_cmd0("help",
             std::bind(help0, this), "Print list of commands.");

    void (Console::*help1)(const std::string&) = &Console::help;
    reg_cmd1<std::string>("help", std::bind(help1, this, std::placeholders::_1),
                          "Show help for specified command.");

    reg_cmd0("clear", std::bind(&Console::clear, this), "Clear console.");

    reg_cmd0("history", std::bind(&Console::history, this),
             "Show history of commands.");
    reg_cmd0("clear_history", std::bind(&Console::history, this),
             "Clear history of commands.");
    reg_cmd0("load_history", std::bind(&Console::load_history, this),
             "Load history of commands from file.");
    reg_cmd0("save_history", std::bind(&Console::save_history, this),
             "Save history of commands to file.");
}

Console::~Console() throw()
{
    save_history();
}

//----------------------------------------------------------------------------

void Console::load_history()
{
    std::ifstream ifs(history_filename);

    while (ifs.good())
    {
        std::string line;
        getline(ifs, line);
        if (!line.empty())
            m_history.push_back(std::move(line));
    }

    m_history_index = m_history.size();
}

void Console::save_history() const
{
    std::ofstream ofs(history_filename);
    if (!ofs)
        std::cerr << "Console: Unable to save history.";
    else
        for (auto it=m_history.begin(); it!=m_history.end(); ++it)
            ofs << *it << '\n';
}

void Console::clear_history()
{
    m_history.clear();
    m_history_index = 0;
}

//----------------------------------------------------------------------------

void Console::display()
{
    if (m_font == 0)
    {
        glGenTextures(1, &m_font);
        glBindTexture(GL_TEXTURE_2D, m_font);
        int width, height, components=1;
        unsigned char* data = stbi_load_from_memory(g_png_data,
            int(g_png_size), &width, &height, &components, 1);
        assert(data);
        unsigned char* p = data;
        unsigned char* q = data + width*(height-1);
        for (int h=0; h<height/2; ++h, q-=2*width)
            for (int w=0; w<width; ++w)
                std::swap(*p++, *q++);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA8, width, height, 0,
            GL_ALPHA, GL_UNSIGNED_BYTE, data);
        stbi_image_free(data);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glBindTexture(GL_TEXTURE_2D, 0);
    }

    //setup matrices
    int vp[4];
    glGetIntegerv(GL_VIEWPORT, vp);
    int width = vp[2];
    int height = vp[3];

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluOrtho2D(0, width, 0, height);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    //gray background + separator
    glPushAttrib(GL_COLOR_BUFFER_BIT);
    glPushAttrib(GL_ENABLE_BIT);
    glEnable(GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDisable(GL_LIGHTING);

    glColor4f(0.15f, 0.15f, 0.15f, 0.75f);
    glRecti(0, 0, width, height);
    glColor4f(0.7f, 0.7f, 0.7f, 0.75f);
    glRecti(0, 1, width, 2);
    glColor4f(0.5f, 0.5f, 0.5f, 0.75f);
    glRecti(0, 0, width, 1);

    glPopAttrib();
    glPopAttrib();

    int current = 3;

    //draw caret
    if (!m_is_executing)
    {
        const int cx = int(m_caret*char_spacing) + char_spacing + 1;
        glRecti(cx, current, cx+char_spacing, current+2);
    }

    //restore matrices
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();

    //draw command line
    if (!m_is_executing)
    {
        draw_textf(1, current,
                   0.9f, 0.9f, 0.9f,
                   ">%s", m_current_command.c_str());
        current += line_spacing;
    }

    //draw rest
    std::vector<std::string>::const_reverse_iterator it;
    for (it=m_buffer.rbegin(); it!=m_buffer.rend(); ++it)
    {
        draw_text(1, current,
                  0.75f, 0.75f, 0.75f,
                  it->c_str());
        current += line_spacing;

        if (current > height)
            break;
    }
}

//----------------------------------------------------------------------------

void Console::draw_text(int cx, int cy,
                        float r, float g, float b,
                        const char* buffer)
{
    //save OpenGL state
    glPushAttrib(GL_ENABLE_BIT);
    glPushAttrib(GL_COLOR_BUFFER_BIT);
    glPushAttrib(GL_DEPTH_BUFFER_BIT);

    //setup texture mapping + blending
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    //setup matrices
    int vp[4];
    glGetIntegerv(GL_VIEWPORT, vp);
    int width = vp[2];
    int height = vp[3];

    assert(width>0 && height>0);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluOrtho2D(0, width, 0, height);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    //color + texture
    glColor3f(r,g,b);
    glBindTexture(GL_TEXTURE_2D, m_font);

    glBegin(GL_QUADS);
    while (*buffer)
    {
        char c = *buffer++;

        if (c < 32)
            continue;

        int fx = (c & 0x0F) << 4;
        float txl = (fx +  4.f) / 256.f;
        float txr = (fx + 11.f) / 256.f;

        int fy = 15*16 - (c & 0xF0);
        float tyl = (fy +  0.f) / 256.f;
        float tyu = (fy + 15.f) / 256.f;

        glTexCoord2f(txl, tyl);
        glVertex2i(cx +  0, cy +  1);
        glTexCoord2f(txr, tyl);
        glVertex2i(cx + 7, cy +  1);
        glTexCoord2f(txr, tyu);
        glVertex2i(cx + 7, cy + 16);
        glTexCoord2f(txl, tyu);
        glVertex2i(cx +  0, cy + 16);

        cx += char_spacing;
    }
    glEnd();

    glBindTexture(GL_TEXTURE_2D, 0);

    //restore matrices
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();

    //and attributes
    glPopAttrib();
    glPopAttrib();
    glPopAttrib();
}

void Console::draw_textf(int x, int y,
                         float r, float g, float b,
                         const char* fmt, ...)
{
    //format text
    char buffer[1024];
    va_list arguments;
    va_start(arguments, fmt);
    vsnprintf(buffer, 1024, fmt, arguments);
    va_end(arguments);

    draw_text(x, y, r, g, b, buffer);
}

//----------------------------------------------------------------------------

void Console::tab_completion()
{
    if (m_current_command.empty())
        return;

    //search through command list..
    std::set<std::string> matches;
    command_map_t::const_iterator it1;
    for (it1=m_commands.begin(); it1!= m_commands.end(); ++it1)
    {
        std::string cmd = it1->first;
        if (cmd.find(m_current_command) != 0)
            continue;

        matches.insert(cmd);
    }

    if (matches.empty())
        return;

    if (matches.size() == 1)
    {
        m_current_command = *matches.begin() + " ";
        return;
    }

    //show possible matches
    std::stringstream ss;
    std::set<std::string>::const_iterator it2;
    for (it2=matches.begin(); it2!=matches.end(); ++it2)
        ss << *it2 << " ";
    print(ss.str().c_str());

    //find longest common prefix and set as current command
    it2 = matches.begin();
    std::string current = *it2++;
    for (; it2!=matches.end(); ++it2)
    {
        std::string::size_type n = 0;
        for (; n<(std::min)(current.size(), it2->size()); ++n)
             if (current.at(n) != it2->at(n))
                 break;

        current.resize(n);
    }

    m_current_command = current;
}

//----------------------------------------------------------------------------

void Console::keyboard(unsigned char key)
{
    switch (key)
    {
#ifdef __APPLE__
    case 0x7f: //apple's glut sends 127 (del) when backspace is pressed
#else

    case '\b': //backspace
#endif

        if (m_caret > 0)
        {
            //delete character before caret..
            m_current_command.erase(m_caret-1, 1);
            m_caret--;
        }
        break;

    case '\t': //tab
        tab_completion();
        m_caret = m_current_command.size();
        break;

    case '\r': //enter
        if (!m_current_command.empty())
        {
            std::string tmp = m_current_command;
            m_current_command.clear();
            m_caret = 0;
            printf(">%s", tmp.c_str());

            //add command to history..
            m_history.push_back(tmp);
            m_history_index = m_history.size();

            execute(tmp.c_str());
        }
        break;

    default:
        if (key>=' ' && key<0x7f) //127 == delete
        {
            m_current_command.insert(m_caret, 1, key);
            m_caret++;
        }
        break;
    }
}

void Console::special(int key)
{
    switch (key)
    {
    case GLUT_KEY_LEFT:
        if (m_caret > 0)
            m_caret -= 1;
        break;

    case GLUT_KEY_RIGHT:
        if (m_caret < m_current_command.size())
            m_caret += 1;
        break;

    case GLUT_KEY_HOME:
        m_caret = 0;
        break;

    case GLUT_KEY_END:
        m_caret = m_current_command.size();
        break;

    case GLUT_KEY_UP:
        if (!m_history.empty())
        {
            if (m_history_index > 0)
                m_history_index--;

            m_current_command = m_history[m_history_index];
            m_caret = m_current_command.size();
        }
        break;

    case GLUT_KEY_DOWN:
        if (m_history_index < m_history.size())
        {
            if (m_history_index < m_history.size()-1)
                m_history_index++;

            assert(m_history_index < m_history.size());
            m_current_command = m_history[m_history_index];
            m_caret = m_current_command.size();
        }
        break;
    }
}

//----------------------------------------------------------------------------

void Console::execute(const char* buffer)
{
    //split into command arg0 arg1 ..
    std::vector<std::string> tmp;

    try {
        tmp = parse_cmdline(buffer);
    }
    catch (std::exception& e)
    {
        printf("Error: %s", e.what());
        return;
    }

    if (tmp.empty())
        return;

    const std::string command_name = std::move(tmp[0]);
    std::vector<std::string> args;
    std::move(tmp.begin()+1, tmp.end(), std::back_inserter(args));

    //find commands with matching names
    std::pair<command_map_t::const_iterator,command_map_t::const_iterator> rng;
    rng = m_commands.equal_range(command_name);

     //find command with right number of arguments and execute
    command_map_t::const_iterator it;
     for (it=rng.first; it!=rng.second; ++it)
     {
         size_t arity = it->second->arity();
         if (arity!=any_arity && arity!=args.size())
             continue;

         m_is_executing = true;

         try {
             it->second->execute(args);
         }
         catch (std::exception& e)
         {
             printf("Error: %s", e.what());
         }
         catch (...)
         {
             printf("Unknown exception.");
         }

         m_is_executing = false;

         return;
     }

    //didn't find a matching command: error!
     if (rng.first == rng.second)
         printf("Syntax error: Command '%s' not found.", command_name.c_str());
     else
        printf("Syntax error: Command '%s' with %u arguments not found.",
            command_name.c_str(), args.size());
}

void Console::executef(const char* format, ...)
{
    //format text
    char buffer[1024];
    va_list arguments;
    va_start(arguments, format);
    vsprintf(buffer, format, arguments);
    va_end(arguments);

    execute(buffer);
}

//----------------------------------------------------------------------------

std::vector<std::string> Console::parse_cmdline(const char* buffer) const
{
    std::string str(buffer);
    std::vector<std::string> tmp;
    size_t curr = 0;
    while (true)
    {
        //eat whitespace, nom nom nom
        size_t start = str.find_first_not_of(' ', curr);
        if (start == std::string::npos)
            break;

        //grouping delimiters, note: doesn't have nesting
        const char delim[] = { '[' ,']', '(', ')', '{', '}', '"', '"'};
        const size_t n = sizeof(delim) / sizeof(delim[0]);

        char c = ' ';
        for (size_t i=0; i<n; i+=2)
        {
            if (str[start] != delim[i])
                continue;

            c = delim[i+1];

            if (c == '"')
                start++;
            break;
        }

        //find closing character
        size_t end = str.find_first_of(c, start+1);

        //done?
        if (end == std::string::npos)
        {
            if (c != ' ')
            {
                std::stringstream ss;
                ss << "Missing closing '" << c << "' in expression.";
                throw std::invalid_argument(ss.str());
            }

            tmp.push_back(str.substr(start, end));
            break;
        }

        //don't include '"' or trailing ' '
        if (c=='"' || c==' ')
            end--;

        size_t len = end - start + 1;
        tmp.push_back(str.substr(start, len));

        if (c=='"' || c==' ')
            end++;

        curr = end+1;
    }

    return tmp;
}

//----------------------------------------------------------------------------

void Console::print(const char* buffer)
{
    std::string tmp(buffer);

    //parse into multiple lines
    size_t curr = 0;
    while (curr < tmp.length())
    {
        //TODO: handle '\t'
        size_t end = tmp.find('\n', curr);

        if (end == std::string::npos)
        {
            m_buffer.push_back(tmp.substr(curr, end));
            break;
        }

        size_t len = end-curr;
        m_buffer.push_back(tmp.substr(curr, len));
        curr = end + 1;
    }
}

void Console::printf(const char* format, ...)
{
    //format text
    char buffer[1024];
    va_list args;
    va_start(args, format);
    vsprintf(buffer, format, args);
    va_end(args);

    print(buffer);
}

void Console::newline()
{
    m_buffer.push_back("");
}

//----------------------------------------------------------------------------

Console::cmd_token Console::add_command(const std::string& name,
                                        std::unique_ptr<command_base>&& ptr)
{
    auto it = m_commands.insert(std::make_pair(name, std::move(ptr)));
    return it->second->get_id();
}

void Console::remove_command(cmd_token id)
{
    for (auto it=m_commands.begin(); it!=m_commands.end(); ++it)
    {
        if (it->second->get_id() != id)
            continue;

        m_commands.erase(it);
        return;
    }

    assert(false);
}

//----------------------------------------------------------------------------

const char* Console::get_name(cmd_token id) const
{
    for (auto it=m_commands.begin(); it!=m_commands.end(); ++it)
    {
        if (it->second->get_id() != id)
            continue;

        return it->first.c_str();
    }

    assert(false);
    return NULL;
}

const char* Console::get_help(cmd_token id) const
{
    for (auto it=m_commands.begin(); it!=m_commands.end(); ++it)
    {
        if (it->second->get_id() != id)
            continue;

        return it->second->get_help();
    }

    assert(false);
    return NULL;
}

//----------------------------------------------------------------------------

void Console::clear()
{
    m_buffer.clear();
}

void Console::history()
{
    printf("Printing history:");
    std::vector<std::string>::const_iterator it;
    for (it=m_history.begin(); it!=m_history.end(); ++it)
        printf("  %s", it->c_str());
}

void Console::help()
{
    printf("Printing list of commands:");

    command_map_t::const_iterator it = m_commands.begin();
    while (it != m_commands.end())
    {
        int n = 0;
        std::string prev = it->first;
        do
        {
            ++n;
            ++it;
        }
        while (it!=m_commands.end() && it->first==prev);

        printf("  %s(%i)", prev.c_str(), n);
    }
}

void Console::help(const std::string& cmd)
{
    std::pair<command_map_t::const_iterator,command_map_t::const_iterator> rng;
    rng = m_commands.equal_range(cmd);

    if (rng.first == rng.second)
    {
        printf("Command '%s' not found.", cmd.c_str());
        return;
    }

    printf("Printing help for command(s) '%s':", cmd.c_str());

    for (command_map_t::const_iterator it=rng.first; it!=rng.second; ++it)
    {
        std::stringstream ss;
        if (it->second->arity() != any_arity)
            for (size_t i=0; i<it->second->arity(); ++i)
                ss << "arg" << i << " ";
        else
            ss << "arg0, arg1, .., argN";

        printf("  %s %s: %s",
            it->first.c_str(), ss.str().c_str(),
            it->second->get_help());
    }
}

//----------------------------------------------------------------------------

const unsigned char Console::g_png_data[] = {

    0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D,
    0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
    0x08, 0x03, 0x00, 0x00, 0x00, 0x6B, 0xAC, 0x58, 0x54, 0x00, 0x00, 0x00,
    0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00,
    0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC,
    0x61, 0x05, 0x00, 0x00, 0x03, 0x00, 0x50, 0x4C, 0x54, 0x45, 0x00, 0x00,
    0x00, 0x3A, 0x3A, 0x3A, 0x66, 0x66, 0x66, 0x90, 0x90, 0x90, 0xB6, 0xB6,
    0xB6, 0xDB, 0xDB, 0xDB, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x75,
    0x62, 0x5B, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
    0x0E, 0xC3, 0x00, 0x00, 0x0E, 0xC3, 0x01, 0xC7, 0x6F, 0xA8, 0x64, 0x00,
    0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6F, 0x66, 0x74, 0x77,
    0x61, 0x72, 0x65, 0x00, 0x50, 0x61, 0x69, 0x6E, 0x74, 0x2E, 0x4E, 0x45,
    0x54, 0x20, 0x76, 0x33, 0x2E, 0x35, 0x2E, 0x38, 0x37, 0x3B, 0x80, 0x5D,
    0x00, 0x00, 0x13, 0x3D, 0x49, 0x44, 0x41, 0x54, 0x78, 0x5E, 0xED, 0x5D,
    0xD9, 0x72, 0xDB, 0x30, 0x0C, 0xB4, 0x75, 0xFD, 0xFF, 0x27, 0x77, 0x41,
    0x77, 0x6A, 0xEC, 0x42, 0x25, 0x82, 0x52, 0x8E, 0x93, 0x94, 0x99, 0xC9,
    0x03, 0x2D, 0x89, 0xC7, 0x12, 0x24, 0x71, 0xF3, 0x76, 0x9B, 0x7F, 0x13,
    0x81, 0x89, 0xC0, 0x44, 0x60, 0x22, 0xA0, 0x08, 0x1C, 0xC7, 0x4E, 0x3F,
    0x7D, 0x76, 0x39, 0x9B, 0x91, 0xAC, 0x3F, 0xD5, 0xF1, 0x84, 0xF6, 0xB6,
    0xDB, 0x4A, 0xBF, 0x7D, 0x76, 0x39, 0x03, 0x20, 0xEB, 0x8F, 0x7E, 0x5F,
    0x7D, 0xFF, 0x96, 0x7D, 0xF0, 0xEA, 0xE7, 0x13, 0x80, 0x04, 0x81, 0x6C,
    0x02, 0x26, 0x05, 0x08, 0x02, 0x55, 0xC0, 0xE6, 0x12, 0xC8, 0x10, 0x7B,
    0xF5, 0xF3, 0xB9, 0x07, 0xBC, 0x7B, 0x0F, 0xC8, 0xCE, 0xD9, 0x57, 0x3F,
    0xCF, 0x28, 0x20, 0x6B, 0x7F, 0x98, 0x0F, 0xC8, 0x3A, 0x30, 0x9F, 0x4F,
    0x04, 0x26, 0x02, 0x13, 0x81, 0x89, 0xC0, 0x44, 0xE0, 0x07, 0x21, 0x90,
    0x9D, 0xAB, 0x5F, 0xFD, 0xF9, 0xF0, 0x54, 0xBC, 0x9A, 0xB5, 0x7D, 0x75,
    0xFD, 0x13, 0x80, 0x51, 0x04, 0x5E, 0x3D, 0x43, 0xAF, 0xAE, 0x7F, 0x74,
    0xFC, 0x6F, 0x17, 0x7F, 0x47, 0x01, 0x9A, 0x00, 0x8C, 0x22, 0x30, 0x3A,
    0x03, 0xEF, 0xFE, 0x7E, 0x74, 0xFC, 0x73, 0x09, 0x7C, 0xF5, 0x73, 0x3E,
    0xEB, 0xDF, 0x30, 0x05, 0xCC, 0x0A, 0x26, 0x02, 0x13, 0x81, 0x89, 0xC0,
    0x44, 0x60, 0x22, 0xF0, 0x44, 0x60, 0x65, 0xEB, 0xF8, 0xBE, 0x2D, 0xC7,
    0xBD, 0x8B, 0xCF, 0xE6, 0x1F, 0xAF, 0x66, 0x5C, 0xDF, 0x9C, 0x7D, 0x79,
    0x3D, 0x8E, 0x85, 0x3E, 0x5F, 0x8F, 0xA0, 0xB8, 0xF6, 0x3F, 0xAC, 0x6C,
    0x9B, 0xBE, 0xDD, 0xEE, 0xFA, 0xC3, 0xF0, 0x64, 0xAD, 0x5B, 0xB7, 0x0A,
    0x01, 0x60, 0xDB, 0xEE, 0x04, 0xC0, 0x7D, 0xBB, 0xED, 0x7E, 0x44, 0xDB,
    0x41, 0x23, 0x3C, 0x6E, 0xDB, 0xB2, 0xB8, 0x06, 0xEE, 0xC7, 0x6D, 0x61,
    0x44, 0x17, 0x05, 0x80, 0xAA, 0xBB, 0xDD, 0x18, 0xAF, 0xFB, 0xB1, 0xAC,
    0xFB, 0xC5, 0x10, 0xEC, 0xFD, 0x09, 0xF5, 0xDD, 0x07, 0x52, 0xDB, 0x8A,
    0x31, 0xB8, 0x3F, 0x3C, 0xF6, 0x15, 0x00, 0x2E, 0x7A, 0x6C, 0x00, 0xF8,
    0x1F, 0xEE, 0xFB, 0x8D, 0xBF, 0x57, 0x3C, 0x6E, 0x3A, 0x1F, 0x82, 0xD7,
    0x6D, 0x17, 0x02, 0x94, 0xFE, 0xD5, 0xE9, 0x41, 0x1B, 0xD0, 0x1A, 0xFA,
    0x0D, 0xEC, 0x98, 0xF0, 0xE3, 0x78, 0x4E, 0xC9, 0xBA, 0x61, 0x88, 0xEE,
    0x6F, 0x3B, 0x76, 0xBF, 0x00, 0x6C, 0x42, 0xB7, 0x3E, 0xC5, 0x85, 0x05,
    0x46, 0x14, 0x11, 0x29, 0x60, 0x18, 0x80, 0x8D, 0x97, 0x64, 0x40, 0x30,
    0x69, 0x00, 0x6B, 0x94, 0xA7, 0xFC, 0x90, 0xF1, 0x09, 0xC0, 0xAB, 0x3E,
    0x97, 0x06, 0xE3, 0x7C, 0x08, 0x49, 0xE8, 0x1E, 0x30, 0x0A, 0x00, 0x4F,
    0xD8, 0x09, 0x01, 0x25, 0x0D, 0x6C, 0x8B, 0xD4, 0xB0, 0xC8, 0x2E, 0x77,
    0x60, 0xDB, 0x7B, 0x2E, 0xB2, 0x75, 0xDF, 0x0E, 0x46, 0x4C, 0x01, 0x08,
    0xF4, 0xD1, 0x25, 0xD1, 0x07, 0x05, 0x76, 0x16, 0xB1, 0xED, 0x49, 0xDD,
    0x35, 0xCE, 0x04, 0x5A, 0x5D, 0x41, 0xF7, 0xD6, 0x3E, 0xB5, 0xB0, 0x2E,
    0xB4, 0xE8, 0xD7, 0x75, 0xBF, 0xBB, 0x9D, 0x1C, 0xAF, 0xEE, 0x3B, 0xEF,
    0x82, 0xDC, 0x66, 0xC4, 0x3B, 0x59, 0xA3, 0xA3, 0x14, 0x10, 0x0E, 0x21,
    0xC5, 0x40, 0x4E, 0x01, 0x7D, 0xBC, 0xDF, 0x75, 0x97, 0xC4, 0x36, 0xFD,
    0x7C, 0x09, 0xE4, 0x41, 0x00, 0xD8, 0x82, 0x76, 0x5B, 0x46, 0x04, 0x3C,
    0x5D, 0x02, 0xD9, 0x1E, 0x05, 0x0A, 0xEB, 0x9F, 0xD2, 0xFC, 0x3C, 0x1C,
    0xB3, 0xE1, 0xE3, 0x04, 0x80, 0xE3, 0x46, 0x55, 0x18, 0xC5, 0xF9, 0x16,
    0x30, 0xE3, 0x58, 0x02, 0x0E, 0x10, 0xDB, 0x32, 0xBB, 0x08, 0xF4, 0x37,
    0xC1, 0x13, 0xC4, 0x64, 0xCD, 0xAC, 0xC2, 0x67, 0x84, 0x19, 0x63, 0x00,
    0x12, 0xA6, 0xA6, 0xBA, 0x24, 0xF0, 0x7E, 0x8F, 0xBE, 0x3F, 0x52, 0x5D,
    0x76, 0x0C, 0x66, 0x75, 0x04, 0xBE, 0xA2, 0xCF, 0xE5, 0xF4, 0x8F, 0xA4,
    0xAC, 0xB1, 0xB3, 0xE7, 0xA3, 0x00, 0x30, 0x5F, 0xA5, 0x8C, 0x50, 0xDA,
    0x23, 0x65, 0x13, 0xD2, 0x0F, 0xBE, 0xE0, 0x0B, 0x44, 0xA3, 0xD9, 0x29,
    0xFD, 0x05, 0xFB, 0x3F, 0xBB, 0x34, 0x11, 0x98, 0x08, 0x4C, 0x04, 0xBE,
    0x0F, 0x02, 0xE0, 0xDC, 0xB9, 0xB3, 0x60, 0x5B, 0xE8, 0x20, 0x03, 0xB3,
    0x4B, 0x2F, 0xE8, 0x73, 0x30, 0x36, 0x72, 0xF0, 0xED, 0x24, 0xFE, 0x1A,
    0x63, 0x44, 0xE2, 0x16, 0x58, 0x25, 0x27, 0xCF, 0x37, 0xC6, 0xC9, 0x7F,
    0x20, 0xFA, 0x84, 0x1B, 0xCA, 0xD7, 0x1F, 0xD5, 0x32, 0x22, 0x5F, 0x34,
    0x36, 0xC2, 0xB3, 0x22, 0xCB, 0xCE, 0xE2, 0x3B, 0xF4, 0x1F, 0x37, 0x55,
    0x48, 0x70, 0x79, 0x23, 0x5E, 0x54, 0x84, 0xFF, 0xF8, 0x31, 0x1A, 0xF7,
    0xDC, 0xAF, 0xF1, 0xD5, 0xBE, 0x6C, 0x7D, 0xA9, 0x8A, 0x2B, 0xA2, 0x51,
    0xE1, 0x09, 0x3E, 0xD1, 0x7E, 0x50, 0xFF, 0xAD, 0x31, 0x9A, 0x42, 0xD5,
    0x5F, 0xA0, 0x3A, 0x15, 0xE8, 0xA9, 0x41, 0x41, 0x4C, 0x01, 0x38, 0x93,
    0x6C, 0xFC, 0xF7, 0xA6, 0x6E, 0xF2, 0x03, 0x36, 0x36, 0x80, 0xBF, 0x51,
    0x5E, 0x3F, 0xF0, 0xFE, 0x5D, 0x46, 0xFB, 0x4C, 0x12, 0xA1, 0xFE, 0xA3,
    0x00, 0x5E, 0xDD, 0xCB, 0x8F, 0x61, 0x0E, 0x99, 0x55, 0xC3, 0x1A, 0x22,
    0x0D, 0xD5, 0x71, 0xA7, 0x0F, 0x4C, 0x5C, 0xF4, 0x4B, 0x04, 0xC2, 0xA1,
    0x8A, 0xA7, 0x82, 0x09, 0xAF, 0x18, 0x03, 0x9B, 0xA5, 0xC7, 0x04, 0x00,
    0xD1, 0x58, 0x62, 0xC5, 0xF2, 0x12, 0x43, 0x75, 0xBC, 0xA4, 0x76, 0x5E,
    0xC2, 0xFB, 0x82, 0x15, 0xDB, 0x07, 0x20, 0x68, 0x74, 0xFC, 0x0F, 0x98,
    0xB1, 0x48, 0xF5, 0xAE, 0x45, 0x03, 0x57, 0x46, 0xAC, 0x1A, 0x1F, 0x96,
    0x16, 0x81, 0x57, 0x22, 0x8E, 0x75, 0x16, 0xF4, 0xF9, 0x5E, 0xBC, 0xB1,
    0xCE, 0x8A, 0x15, 0x42, 0x1B, 0x3A, 0x28, 0xAB, 0x5E, 0x76, 0x49, 0x01,
    0x90, 0xD7, 0xF0, 0x6F, 0xFD, 0x00, 0x6B, 0x2D, 0xFD, 0x00, 0x9A, 0xE8,
    0x48, 0x35, 0xF2, 0xF0, 0x6C, 0xCD, 0xAB, 0x38, 0x93, 0x68, 0x6D, 0x79,
    0x94, 0x36, 0x81, 0xEE, 0x2F, 0xA7, 0x00, 0x01, 0xC9, 0x66, 0x87, 0xA7,
    0x58, 0x26, 0x34, 0x8E, 0x5F, 0x37, 0xA9, 0x40, 0x01, 0x7E, 0x8D, 0xD8,
    0x43, 0x1E, 0xB2, 0x74, 0x18, 0xED, 0xCB, 0x8C, 0xB3, 0x16, 0x1A, 0xC7,
    0x02, 0x77, 0xD9, 0xA6, 0x8C, 0xFE, 0x8A, 0x7B, 0x80, 0x6E, 0xE9, 0x72,
    0xCC, 0x61, 0x89, 0xD3, 0x1A, 0x52, 0x44, 0xED, 0xB9, 0x68, 0xA9, 0xC3,
    0x1E, 0x40, 0xCF, 0xAD, 0x02, 0x9A, 0xA2, 0x70, 0x88, 0xD2, 0x73, 0x23,
    0x29, 0x1D, 0xB0, 0x9E, 0xDB, 0xAA, 0xD4, 0xAC, 0x9D, 0x02, 0x57, 0x2B,
    0xD9, 0x3F, 0x9D, 0x05, 0x12, 0x02, 0xF9, 0xF4, 0xF6, 0xDF, 0xDD, 0xE0,
    0x4F, 0x90, 0xFF, 0xDF, 0x8D, 0xE1, 0x6C, 0x7F, 0x22, 0x30, 0x11, 0x98,
    0x08, 0x38, 0x04, 0x02, 0xAF, 0xFE, 0x9F, 0xA1, 0x03, 0xBE, 0x80, 0x59,
    0x39, 0xE6, 0xB4, 0x1A, 0x63, 0xC4, 0x8C, 0x17, 0x49, 0x3B, 0x26, 0xCE,
    0x93, 0xB0, 0x61, 0xEF, 0xFB, 0x1F, 0xB4, 0xDC, 0x98, 0xE7, 0x67, 0x85,
    0x26, 0x09, 0xFA, 0xF6, 0x5B, 0x7B, 0xFA, 0xBD, 0x63, 0xFD, 0x4C, 0x7C,
    0x26, 0x17, 0x0B, 0x11, 0x77, 0x8D, 0xEF, 0xF7, 0xCF, 0x03, 0xAB, 0xAF,
    0x8C, 0x59, 0xB3, 0x73, 0xAD, 0x9E, 0xB7, 0xDA, 0xC9, 0xF2, 0x63, 0xCF,
    0x3D, 0xAB, 0x0C, 0x73, 0x35, 0xC1, 0xD1, 0xC4, 0x69, 0xEA, 0xB0, 0x10,
    0x90, 0xF0, 0x75, 0x67, 0xDF, 0x07, 0x07, 0x04, 0xAD, 0x82, 0x01, 0x60,
    0xD1, 0x41, 0x00, 0xD8, 0x51, 0xDE, 0xDC, 0x6F, 0x9B, 0x4C, 0x70, 0xD3,
    0x7F, 0x78, 0x66, 0x74, 0xBF, 0x63, 0x0E, 0x17, 0xC7, 0xBC, 0x2E, 0x2B,
    0x59, 0x7F, 0x1B, 0x00, 0xDE, 0xE3, 0x45, 0xD4, 0x35, 0x8F, 0x19, 0x74,
    0x3D, 0x54, 0x4B, 0x9D, 0x32, 0xB6, 0xA7, 0xDF, 0xFB, 0x11, 0x47, 0xE3,
    0xA7, 0xAF, 0x1E, 0x4F, 0x59, 0x16, 0x50, 0x00, 0xD0, 0x7F, 0xA8, 0x28,
    0xFE, 0x54, 0xB8, 0x61, 0xB4, 0x1E, 0xE0, 0xC6, 0x36, 0xFB, 0x1A, 0x76,
    0xBC, 0xBD, 0x7B, 0x00, 0xE0, 0xF1, 0xE3, 0xEB, 0x34, 0x92, 0x24, 0xC0,
    0x44, 0x10, 0x68, 0xE0, 0x10, 0x00, 0x22, 0x2C, 0x18, 0x49, 0xBB, 0x6F,
    0xD0, 0x01, 0x6C, 0x3A, 0x6E, 0x09, 0x04, 0xF9, 0x3D, 0x03, 0x40, 0x2C,
    0x27, 0x0A, 0x80, 0xD1, 0x2B, 0x01, 0xB0, 0x2E, 0x1E, 0x80, 0xD6, 0x55,
    0x27, 0x3C, 0xDC, 0xB7, 0x75, 0x5D, 0x36, 0x07, 0x40, 0x93, 0xDE, 0x3C,
    0x41, 0xD8, 0x9A, 0x73, 0x08, 0xA8, 0x28, 0x11, 0x01, 0xE8, 0x2F, 0x01,
    0x6B, 0xDB, 0x77, 0x48, 0xF7, 0x00, 0x08, 0xC7, 0x41, 0x25, 0x48, 0x14,
    0xA0, 0xEA, 0x15, 0x01, 0x00, 0xB6, 0x5B, 0x01, 0x00, 0x70, 0x38, 0xC0,
    0x15, 0x80, 0x65, 0xC5, 0xE8, 0x57, 0x07, 0x40, 0x93, 0xFE, 0xDC, 0x80,
    0xAD, 0x3B, 0x7E, 0x4D, 0xA8, 0x76, 0x24, 0x0C, 0x20, 0x5B, 0x02, 0xB2,
    0xE9, 0x95, 0x01, 0x10, 0x9F, 0x2D, 0x22, 0x57, 0x23, 0x46, 0xC3, 0xDF,
    0x11, 0x09, 0xEA, 0xDF, 0xFC, 0xA6, 0xA8, 0x4B, 0xC0, 0x00, 0xD8, 0xF0,
    0xFF, 0x67, 0xDA, 0xDA, 0x0B, 0x0E, 0xD5, 0xB6, 0xEB, 0x92, 0xD7, 0x57,
    0xDC, 0x04, 0x79, 0xD7, 0xEE, 0x53, 0x80, 0x69, 0xB0, 0x2A, 0x14, 0x70,
    0x5F, 0x58, 0x5F, 0x82, 0xFE, 0x74, 0x37, 0xC1, 0x13, 0x00, 0xEE, 0x5E,
    0xE7, 0x69, 0xD4, 0x4C, 0xFE, 0x0C, 0xF0, 0xE9, 0x82, 0x5F, 0xD3, 0x9F,
    0x4E, 0x3F, 0xFA, 0xE6, 0xA6, 0x59, 0xF7, 0x00, 0x34, 0x1F, 0x8E, 0x41,
    0xD6, 0x11, 0xEA, 0x31, 0x26, 0x80, 0xE8, 0xF7, 0xD9, 0x31, 0x88, 0x3D,
    0xDA, 0x2B, 0x40, 0x1E, 0xC7, 0xA0, 0xFB, 0xA5, 0xF9, 0xCC, 0x68, 0xFF,
    0x9F, 0x93, 0x64, 0x14, 0x46, 0x2A, 0x15, 0xD4, 0x47, 0x1A, 0x89, 0xD4,
    0x61, 0xE4, 0xA7, 0xB3, 0x45, 0x0D, 0xA1, 0x9F, 0x3E, 0xC8, 0xEE, 0xF8,
    0x40, 0x42, 0xFF, 0x37, 0x00, 0xFF, 0xF5, 0xEC, 0xCF, 0xC1, 0x4F, 0x04,
    0x26, 0x02, 0xDF, 0x0E, 0x01, 0x31, 0x1C, 0x04, 0xAB, 0x0C, 0x5B, 0xE3,
    0xF3, 0xE1, 0x05, 0x79, 0x5F, 0xE4, 0xE5, 0xC0, 0x08, 0xD9, 0x73, 0xC7,
    0x0C, 0xAA, 0xEF, 0xAE, 0xB0, 0xB6, 0xBF, 0x19, 0xAB, 0x27, 0xAB, 0xA4,
    0x9C, 0x9A, 0x89, 0xD2, 0x4E, 0x44, 0x7E, 0x08, 0x96, 0x4E, 0xE0, 0x08,
    0xA6, 0x2E, 0xF5, 0x75, 0x8E, 0x5E, 0x65, 0xE2, 0x0B, 0xCA, 0x96, 0xC1,
    0x80, 0x48, 0xE3, 0xAC, 0x3C, 0xEF, 0x2F, 0xF2, 0xB2, 0x99, 0xCE, 0xBC,
    0x00, 0x14, 0x0D, 0x97, 0x2C, 0xBC, 0x28, 0x6F, 0xAF, 0xBC, 0x77, 0x1B,
    0xA0, 0xEF, 0x34, 0xD0, 0xD4, 0xFA, 0xB5, 0x0D, 0x1A, 0xA3, 0x02, 0x10,
    0x9D, 0xBF, 0x19, 0x00, 0x13, 0xF7, 0x7A, 0x74, 0xD0, 0x84, 0x1D, 0xC7,
    0x0E, 0xB6, 0xCE, 0x38, 0x56, 0xD3, 0x00, 0xF0, 0xB2, 0x40, 0x15, 0x80,
    0x66, 0xFC, 0xF4, 0xD2, 0xA4, 0x02, 0xB0, 0x88, 0x31, 0xD8, 0xEC, 0xF5,
    0x6C, 0xFC, 0x63, 0x84, 0xC3, 0x80, 0x83, 0x07, 0x04, 0x0F, 0x18, 0x8F,
    0xBB, 0xDC, 0x6E, 0x53, 0x78, 0xB8, 0x0E, 0x36, 0xF2, 0x76, 0xF2, 0xB2,
    0x75, 0x9E, 0x94, 0x40, 0xBB, 0x9A, 0x06, 0xFB, 0x14, 0x60, 0xE0, 0x7A,
    0x85, 0x4A, 0xF3, 0xB5, 0xA6, 0x28, 0x23, 0x31, 0xF5, 0x00, 0x10, 0x61,
    0xCC, 0xB8, 0xFF, 0x01, 0x80, 0x20, 0x3E, 0x13, 0x00, 0x56, 0x59, 0xD7,
    0xDC, 0xAE, 0x6B, 0x3C, 0x00, 0x10, 0x8D, 0xA1, 0x02, 0x41, 0x1F, 0x00,
    0x03, 0xD3, 0xCF, 0x28, 0x84, 0x4F, 0x8E, 0xB9, 0x81, 0x7E, 0x44, 0x0D,
    0xF6, 0x4C, 0xB1, 0xB2, 0xC8, 0x23, 0xC9, 0xAB, 0xB5, 0x38, 0xF7, 0x07,
    0xF7, 0x0D, 0x28, 0x7E, 0x27, 0x4B, 0x80, 0x1D, 0x48, 0xF0, 0x31, 0xCB,
    0xA3, 0x09, 0x00, 0x90, 0xB5, 0xBD, 0xF4, 0x05, 0x00, 0x16, 0xAF, 0xB2,
    0xC2, 0xF4, 0x48, 0x18, 0x99, 0xF4, 0xC8, 0x9C, 0x94, 0xFC, 0x5F, 0xB6,
    0xE6, 0x59, 0x9F, 0xF3, 0x81, 0x53, 0x40, 0xEA, 0xB7, 0xDE, 0xF8, 0x25,
    0xD1, 0x36, 0x41, 0x7D, 0x87, 0xE4, 0x49, 0xEE, 0x70, 0x93, 0xB7, 0xFD,
    0xFB, 0xF7, 0x83, 0x7C, 0x9E, 0x36, 0xD3, 0x50, 0xF8, 0xF8, 0x02, 0x8B,
    0xA8, 0xA0, 0x5D, 0x4A, 0x00, 0xD0, 0x25, 0x7E, 0x12, 0xF1, 0x22, 0x6B,
    0x7C, 0x8C, 0x02, 0xCC, 0x4D, 0xCD, 0x8F, 0xCF, 0x00, 0xF0, 0x6E, 0x38,
    0x1A, 0x1F, 0x10, 0x54, 0x58, 0x38, 0x17, 0xD9, 0x03, 0x80, 0x5D, 0xB0,
    0x8C, 0x9C, 0xFC, 0x2F, 0xB6, 0xA3, 0xB0, 0x93, 0x87, 0x00, 0xAA, 0x3A,
    0xC3, 0x13, 0x00, 0xC4, 0xAB, 0xAC, 0x06, 0x40, 0xA4, 0x91, 0x2C, 0xAA,
    0x2C, 0xA7, 0xAA, 0x97, 0xBE, 0x71, 0x02, 0x80, 0x30, 0x43, 0xA3, 0x00,
    0x7C, 0x82, 0xAB, 0xE2, 0x08, 0x42, 0x69, 0xD0, 0x17, 0x47, 0xB4, 0x8C,
    0x34, 0xF5, 0x35, 0xBF, 0x8D, 0x3E, 0x34, 0x72, 0x68, 0x04, 0x17, 0x1E,
    0xDA, 0xF3, 0xDB, 0x8A, 0x52, 0x5F, 0xD7, 0xAF, 0x39, 0xD2, 0xD9, 0xAB,
    0x89, 0xC0, 0x44, 0xE0, 0x53, 0x10, 0x48, 0x36, 0x84, 0x8F, 0xC4, 0x69,
    0xF6, 0x3D, 0x3B, 0x6D, 0xD7, 0xFA, 0x7B, 0x2C, 0x6B, 0xAC, 0x3F, 0xE4,
    0x17, 0xA0, 0x1F, 0xA2, 0x57, 0xA6, 0xFA, 0x15, 0x96, 0x51, 0xEB, 0x07,
    0x77, 0x8F, 0x03, 0xD0, 0x77, 0x7E, 0x1F, 0x06, 0xE0, 0xC4, 0xBB, 0xBD,
    0x0C, 0x41, 0x26, 0x2E, 0x67, 0x15, 0xF6, 0x29, 0xA0, 0xEB, 0xC7, 0x79,
    0x62, 0x0A, 0xED, 0xB7, 0x16, 0x7D, 0xD9, 0xE3, 0x2F, 0x59, 0x7F, 0xFB,
    0xCF, 0xC5, 0x23, 0x04, 0xC2, 0x9B, 0x50, 0xB0, 0x98, 0xBE, 0x4C, 0x65,
    0xE3, 0x79, 0x7F, 0xD1, 0x28, 0x35, 0x8D, 0x91, 0x7F, 0xDE, 0x78, 0xE9,
    0xE7, 0x92, 0x08, 0xF5, 0x93, 0xFF, 0x88, 0xE9, 0x2A, 0xF8, 0x07, 0x1B,
    0x6E, 0x2F, 0xBE, 0x01, 0xA2, 0x15, 0x85, 0xEE, 0x2E, 0x9B, 0xB8, 0x00,
    0xA9, 0x87, 0xC8, 0x19, 0x1A, 0x14, 0x41, 0x02, 0x61, 0x95, 0xE4, 0x69,
    0x11, 0x5E, 0x43, 0xC4, 0x89, 0x28, 0x40, 0x48, 0xB9, 0x60, 0x92, 0xA4,
    0x39, 0x67, 0x7B, 0xF3, 0x3B, 0xEA, 0xEB, 0x3A, 0x6B, 0xB3, 0xBE, 0xC6,
    0x08, 0x5E, 0x14, 0x12, 0x4C, 0x01, 0x2D, 0xE5, 0x89, 0x37, 0xEE, 0x4A,
    0xFD, 0x6A, 0x1C, 0x8D, 0xE3, 0x17, 0xA7, 0x1F, 0xD5, 0x18, 0xA9, 0xA4,
    0x60, 0x83, 0x21, 0x8D, 0x51, 0x60, 0xB4, 0x78, 0x09, 0x04, 0x00, 0xC4,
    0xFA, 0x2C, 0xE3, 0xB5, 0xFE, 0xA9, 0x33, 0xB6, 0xF8, 0x4A, 0x0B, 0x00,
    0x10, 0xB6, 0x7B, 0xD6, 0xED, 0x87, 0x8A, 0xAE, 0xB3, 0x08, 0x54, 0x05,
    0x56, 0x05, 0x20, 0x6E, 0x79, 0x9A, 0x23, 0x45, 0xA4, 0xCD, 0x32, 0x00,
    0x1A, 0x5D, 0x70, 0x31, 0x00, 0x46, 0x22, 0x7E, 0xCD, 0x66, 0x4E, 0x52,
    0xCD, 0x05, 0xC7, 0xAD, 0xF1, 0x18, 0xCB, 0xCD, 0x00, 0xA8, 0xA8, 0xA6,
    0xFE, 0x07, 0x39, 0x05, 0xB0, 0x93, 0x98, 0xBE, 0xBF, 0x27, 0x14, 0x90,
    0x2F, 0x01, 0x53, 0x81, 0xD1, 0x80, 0x62, 0x58, 0x1D, 0x6D, 0x6A, 0xD8,
    0x63, 0xE8, 0x28, 0xB3, 0x4D, 0x86, 0x14, 0x1C, 0x91, 0x02, 0x14, 0x60,
    0x76, 0xC0, 0x90, 0x5D, 0x2F, 0xEE, 0x01, 0x10, 0x57, 0x9F, 0x9B, 0xE8,
    0x23, 0x64, 0xE5, 0x49, 0xD2, 0x19, 0x00, 0xAA, 0xEF, 0x18, 0x3B, 0x31,
    0xFE, 0xE1, 0xEB, 0xB6, 0xE1, 0xD5, 0x92, 0x18, 0x5C, 0x7D, 0xCE, 0xFD,
    0x43, 0xAF, 0x2F, 0xFC, 0xC4, 0x00, 0xA8, 0xA5, 0x3C, 0x08, 0x51, 0x7B,
    0x17, 0xF6, 0xE6, 0x0D, 0x55, 0x35, 0x92, 0xED, 0x67, 0x72, 0xA2, 0x5E,
    0x7D, 0xE4, 0xD8, 0x7E, 0xC3, 0x30, 0x66, 0x93, 0x13, 0x81, 0x89, 0xC0,
    0x97, 0x41, 0xE0, 0x23, 0xF2, 0xEA, 0x97, 0xE9, 0xEC, 0x25, 0x1D, 0x91,
    0xF0, 0x7C, 0x35, 0xA4, 0x24, 0x69, 0x85, 0x2E, 0xE9, 0x82, 0xAF, 0xE4,
    0xD3, 0x4F, 0xE9, 0x90, 0x77, 0x48, 0xEC, 0x56, 0x89, 0x5D, 0x03, 0xC7,
    0x50, 0xE1, 0x10, 0xFA, 0x00, 0x5C, 0x9F, 0x0E, 0x80, 0x4A, 0x1B, 0x61,
    0x09, 0xF4, 0x7D, 0x3F, 0xEF, 0xCB, 0x42, 0x00, 0x9C, 0xCA, 0xCB, 0x1E,
    0x53, 0x13, 0xAF, 0x55, 0xDE, 0x57, 0x4F, 0x55, 0x71, 0xAE, 0xF6, 0x73,
    0x24, 0xC6, 0xD6, 0xE0, 0x31, 0x62, 0x6E, 0xAC, 0xDE, 0xF4, 0x66, 0xEF,
    0xFB, 0xF8, 0x83, 0xC6, 0x37, 0xD0, 0x1C, 0x5F, 0x0D, 0x80, 0xC8, 0xFB,
    0x2A, 0xDF, 0x37, 0xE9, 0xDB, 0x63, 0xAA, 0xF8, 0x0A, 0x05, 0xA8, 0x70,
    0xD3, 0x6C, 0x8B, 0x6E, 0x00, 0x87, 0xF9, 0x07, 0x78, 0xF1, 0x00, 0xAC,
    0x21, 0xB9, 0xC3, 0xAB, 0x71, 0x15, 0x44, 0xC8, 0xB6, 0x46, 0xF5, 0x89,
    0x89, 0x14, 0xC0, 0xD9, 0x10, 0xCC, 0xDA, 0xEB, 0x24, 0xE8, 0x48, 0x01,
    0xD1, 0x7F, 0x9F, 0x56, 0x99, 0x0E, 0x58, 0xCD, 0xF9, 0x09, 0x00, 0x36,
    0x3A, 0x3F, 0x5E, 0x44, 0xA8, 0x90, 0xBC, 0x6E, 0xFA, 0x1D, 0x12, 0xF0,
    0xED, 0x7D, 0x5E, 0xA4, 0x6C, 0x8B, 0x0E, 0x7B, 0x5C, 0x3C, 0x05, 0x7C,
    0x02, 0x06, 0x33, 0xC6, 0x53, 0x85, 0xC3, 0x00, 0x98, 0xF3, 0xB5, 0xEF,
    0x71, 0x06, 0xC0, 0xCA, 0x21, 0x38, 0xE6, 0x9D, 0x2F, 0xFE, 0xEE, 0x2A,
    0x2F, 0xCB, 0x88, 0x74, 0xC6, 0x55, 0xC7, 0xD8, 0xA7, 0x00, 0x80, 0xC9,
    0x39, 0x2D, 0xCF, 0x00, 0xF0, 0x2A, 0x29, 0x95, 0xEF, 0xCF, 0xB4, 0x27,
    0xBC, 0x0F, 0xF3, 0xA6, 0x0A, 0xBC, 0x49, 0x3F, 0x80, 0x68, 0x0B, 0x71,
    0x59, 0x59, 0x8D, 0x06, 0x9E, 0x7F, 0x96, 0xB4, 0x95, 0x66, 0x1C, 0x4A,
    0x2D, 0xBF, 0xF7, 0xFA, 0x70, 0x9E, 0xF6, 0xFB, 0xE8, 0x1E, 0x20, 0xA7,
    0x40, 0x70, 0x83, 0x53, 0xF9, 0x3E, 0x44, 0x7D, 0x89, 0xD6, 0xD2, 0xD2,
    0x07, 0x52, 0x50, 0x11, 0xEB, 0x13, 0xC4, 0x5B, 0xBF, 0x6D, 0x78, 0xDE,
    0xE1, 0xE2, 0x11, 0xE6, 0xE6, 0x11, 0xE0, 0x84, 0x09, 0x6D, 0x13, 0xA4,
    0x45, 0x30, 0x08, 0x80, 0x1E, 0x6C, 0x67, 0x7C, 0x54, 0x29, 0x85, 0xC5,
    0x07, 0x4E, 0xCA, 0xDA, 0x2B, 0x59, 0x12, 0x9D, 0x9F, 0x0E, 0x40, 0xAA,
    0x2C, 0x18, 0x64, 0x84, 0xBE, 0x3A, 0x05, 0x7C, 0x80, 0x4F, 0x93, 0x63,
    0xE3, 0xDD, 0xAC, 0x70, 0x8D, 0xBE, 0xE7, 0xDB, 0x13, 0x81, 0x2A, 0x02,
    0x1B, 0x52, 0x3D, 0x55, 0xBF, 0xF1, 0xEF, 0x8F, 0x7E, 0x3F, 0xD2, 0xF6,
    0x35, 0xDF, 0x66, 0x79, 0x83, 0xB3, 0x56, 0x46, 0xBF, 0x8F, 0xF5, 0x53,
    0xEA, 0xEC, 0xAC, 0xF9, 0x18, 0x0A, 0xAB, 0x07, 0x2F, 0xFB, 0x03, 0x04,
    0x57, 0xE4, 0xBC, 0x81, 0xD1, 0x37, 0x8C, 0xF3, 0x29, 0xD5, 0x51, 0x94,
    0xA7, 0x75, 0xC0, 0xCA, 0xE9, 0x12, 0x89, 0xDB, 0xED, 0x05, 0xDC, 0x19,
    0x89, 0x4F, 0x08, 0x3D, 0x0D, 0xE6, 0xE7, 0xF8, 0x79, 0xDF, 0x85, 0xC2,
    0xD8, 0xB2, 0xAE, 0x43, 0x7D, 0x38, 0x38, 0xA5, 0x87, 0x7D, 0xF0, 0x34,
    0x21, 0x42, 0x48, 0x90, 0x20, 0x9F, 0x37, 0x0A, 0x70, 0x3A, 0x8D, 0x13,
    0x4F, 0x6F, 0x62, 0x95, 0xC1, 0xC6, 0x67, 0x9C, 0x13, 0x09, 0x83, 0xA1,
    0xB7, 0x41, 0xDC, 0x4E, 0x89, 0xA1, 0xAA, 0x83, 0x4B, 0x28, 0x20, 0xB6,
    0xB7, 0x7B, 0xF9, 0xFF, 0x24, 0x3E, 0x81, 0x23, 0x5F, 0x39, 0x1D, 0xE1,
    0x59, 0xEF, 0xFB, 0x1D, 0xAE, 0x26, 0xA6, 0xD2, 0xE8, 0xF2, 0x14, 0xAF,
    0xE0, 0x03, 0x92, 0xF5, 0x47, 0x56, 0x98, 0x6E, 0x0A, 0x72, 0xE1, 0x87,
    0x49, 0xFB, 0x5D, 0xD7, 0xC8, 0xBE, 0x31, 0x1C, 0x4F, 0x55, 0xE1, 0x92,
    0x8E, 0x28, 0xA5, 0x38, 0xA9, 0xA1, 0x44, 0x01, 0xA7, 0x09, 0x28, 0xC9,
    0xD8, 0xCA, 0x09, 0x14, 0x35, 0x1E, 0xE3, 0xA4, 0xF7, 0x59, 0xAA, 0xEA,
    0xBE, 0x0B, 0xCF, 0x49, 0x85, 0xD5, 0x0F, 0x18, 0x80, 0x6C, 0x0F, 0xC0,
    0x2D, 0x35, 0x41, 0x6D, 0x29, 0xF1, 0x09, 0xB5, 0x25, 0xA0, 0xF1, 0x06,
    0x61, 0x44, 0x69, 0xFA, 0x46, 0x3D, 0x47, 0x85, 0x44, 0xB1, 0x60, 0xBD,
    0x7C, 0x0F, 0xE9, 0x1F, 0x23, 0xE8, 0xE9, 0x5D, 0xFB, 0x4B, 0x60, 0x87,
    0x2D, 0x74, 0x11, 0x1D, 0x80, 0xDE, 0x7B, 0x43, 0x97, 0xDC, 0x64, 0x9B,
    0x60, 0x72, 0xA5, 0x0C, 0xF0, 0xD0, 0x80, 0x7A, 0x85, 0x48, 0xF2, 0xF7,
    0xAB, 0x16, 0x18, 0xA3, 0xF7, 0x33, 0x34, 0x0A, 0x80, 0x52, 0x40, 0x8C,
    0x4F, 0x08, 0xC7, 0x46, 0x77, 0x11, 0x9F, 0x64, 0x98, 0x4C, 0x17, 0xB9,
    0xAE, 0x61, 0xE6, 0x44, 0x43, 0x4C, 0x1B, 0x52, 0x3A, 0x94, 0x0E, 0xC6,
    0x6A, 0xFB, 0xEF, 0x7E, 0x9F, 0x83, 0xBA, 0xB0, 0x3E, 0x99, 0x6B, 0x82,
    0xB6, 0xE6, 0x7A, 0x5E, 0xF3, 0xDD, 0x63, 0x9E, 0xED, 0x4F, 0x04, 0x26,
    0x02, 0x13, 0x81, 0x1F, 0x8B, 0xC0, 0x8E, 0xCC, 0x5A, 0x89, 0x79, 0x98,
    0x2D, 0x3F, 0xBA, 0xC9, 0xC3, 0x49, 0x8F, 0xE2, 0xFC, 0x84, 0x11, 0x2A,
    0x03, 0xB7, 0x1D, 0x6B, 0xF7, 0x46, 0xC1, 0x51, 0x8D, 0x4E, 0xFD, 0x7B,
    0x8D, 0xB7, 0xE7, 0xB0, 0x46, 0x49, 0xCE, 0xD6, 0xC2, 0x4C, 0x87, 0x74,
    0x56, 0x50, 0x00, 0xB8, 0x93, 0xD5, 0x2E, 0x2E, 0x83, 0x3B, 0xF4, 0xDF,
    0x0D, 0x25, 0x65, 0x80, 0x79, 0x02, 0x43, 0x7E, 0x82, 0x33, 0x5E, 0x5F,
    0xD8, 0x1A, 0x1E, 0x1E, 0xC6, 0xCB, 0x2A, 0x1C, 0x08, 0xE4, 0x57, 0x32,
    0x42, 0xB8, 0xB9, 0x6C, 0xC3, 0xA4, 0x75, 0xC6, 0x39, 0xA4, 0x21, 0x6C,
    0x9E, 0xEF, 0x09, 0xF7, 0x2F, 0xB9, 0xBB, 0x25, 0xBA, 0x1D, 0x66, 0x2C,
    0xCA, 0x89, 0x18, 0x19, 0xA1, 0x44, 0x38, 0x4D, 0xA6, 0x10, 0x89, 0xDD,
    0x40, 0x72, 0x3E, 0x81, 0xA1, 0xFA, 0x15, 0x72, 0xF7, 0x1B, 0xC9, 0x74,
    0x38, 0xD1, 0xE0, 0x5F, 0x10, 0xF3, 0x13, 0xD4, 0x89, 0xAA, 0xFB, 0x45,
    0x7A, 0xDD, 0x5D, 0xB1, 0xBD, 0x38, 0xE1, 0x14, 0x6B, 0x8D, 0x9B, 0xDD,
    0xEC, 0x92, 0xCB, 0x6E, 0xA5, 0x62, 0x5F, 0x7F, 0xB1, 0xE5, 0x4F, 0x00,
    0x10, 0x61, 0xE4, 0x91, 0xBB, 0xBD, 0x12, 0xB9, 0xA9, 0xFE, 0x08, 0x72,
    0xFF, 0x02, 0xAE, 0x34, 0x55, 0xEF, 0x6C, 0x05, 0x43, 0xE8, 0xE3, 0xE5,
    0x9C, 0xFB, 0xD8, 0x12, 0x38, 0xD3, 0x68, 0xC4, 0x84, 0xFC, 0x7F, 0xDE,
    0x82, 0x6C, 0x9A, 0xED, 0x40, 0xA9, 0x47, 0x49, 0x91, 0x24, 0xDF, 0xF0,
    0xBA, 0xF8, 0x23, 0x50, 0x0F, 0x0E, 0x2C, 0x81, 0xEE, 0xB1, 0x1E, 0xFC,
    0x0B, 0xAA, 0x3A, 0xCD, 0x37, 0x0C, 0xD8, 0x37, 0xA9, 0x41, 0x53, 0x51,
    0x5B, 0x01, 0xB5, 0x7A, 0x47, 0xAF, 0x1F, 0xFD, 0x0B, 0xBE, 0x19, 0x00,
    0x6F, 0xC6, 0x7F, 0x36, 0x3F, 0x11, 0x98, 0x08, 0x4C, 0x04, 0x26, 0x02,
    0x83, 0x08, 0x7C, 0xFF, 0x63, 0x27, 0xB5, 0xAD, 0xF4, 0x11, 0x12, 0x00,
    0xFA, 0xE9, 0x04, 0x06, 0xC1, 0x3E, 0xF9, 0x5C, 0xAF, 0x0B, 0xFC, 0x87,
    0x16, 0x64, 0x04, 0x60, 0xBD, 0x9D, 0xEC, 0x11, 0xD2, 0xE7, 0x69, 0xB6,
    0x79, 0x35, 0x8E, 0xAA, 0xA8, 0xBB, 0x23, 0x57, 0x36, 0x99, 0x7A, 0xC4,
    0x11, 0x53, 0x9C, 0xD5, 0xAB, 0xFD, 0xB7, 0xCE, 0xD3, 0x00, 0x4C, 0x74,
    0x28, 0x55, 0x62, 0x33, 0xE6, 0xFD, 0x07, 0x30, 0x62, 0x4F, 0x12, 0x8D,
    0xD3, 0xF2, 0xCF, 0xC5, 0x39, 0x3A, 0x66, 0x9A, 0xEA, 0x3B, 0x23, 0x98,
    0xDB, 0xAE, 0xE6, 0x90, 0xA8, 0x75, 0x98, 0x47, 0xB7, 0x21, 0xB1, 0x76,
    0x9E, 0x7A, 0x88, 0xBE, 0x61, 0x79, 0x1B, 0xD3, 0xC3, 0xD2, 0x84, 0xCE,
    0xA0, 0xE6, 0x02, 0x5B, 0x76, 0x11, 0x37, 0x83, 0x1F, 0x5F, 0x77, 0x3C,
    0x07, 0x14, 0x44, 0x3E, 0xD7, 0xB9, 0x79, 0xE2, 0xD2, 0x07, 0x10, 0x7F,
    0x2A, 0x31, 0x1A, 0x1B, 0x12, 0x2A, 0x66, 0xE2, 0x92, 0x10, 0x44, 0xB8,
    0x0D, 0x8E, 0xCC, 0x8B, 0x9C, 0xCA, 0xFB, 0xE1, 0x6A, 0xCF, 0x01, 0xD1,
    0x7D, 0x71, 0x13, 0xE8, 0xC8, 0xFD, 0x70, 0xD4, 0xFC, 0xB2, 0xB7, 0x80,
    0x03, 0x47, 0x25, 0x26, 0x5E, 0xFB, 0x57, 0xEC, 0x82, 0x82, 0x82, 0x4B,
    0x4F, 0x58, 0x02, 0x25, 0xF2, 0xC7, 0xCB, 0x96, 0xAD, 0x9F, 0xBE, 0x39,
    0xA3, 0x00, 0xD7, 0xA1, 0xD4, 0xFC, 0x6D, 0x01, 0x14, 0x7F, 0xD7, 0xE0,
    0xFC, 0x06, 0xE0, 0xEF, 0xB9, 0xAE, 0x31, 0x20, 0xA2, 0xB0, 0x66, 0x3C,
    0xD5, 0x0C, 0x15, 0x5E, 0x3C, 0xAC, 0x6F, 0x82, 0x4C, 0xB2, 0xD0, 0x22,
    0x76, 0x01, 0x08, 0x7B, 0x40, 0x96, 0x15, 0x04, 0xD1, 0x0C, 0x3D, 0x92,
    0x84, 0x46, 0x94, 0x97, 0x80, 0x91, 0x1C, 0x5D, 0x81, 0x12, 0x29, 0xE0,
    0xE2, 0x83, 0x56, 0xAA, 0x53, 0x85, 0x8B, 0x50, 0x40, 0x7A, 0x4B, 0x4C,
    0x00, 0xA4, 0xEF, 0x65, 0x97, 0x06, 0x57, 0xDB, 0x9A, 0x93, 0x5D, 0xE4,
    0xB5, 0x00, 0xC8, 0x00, 0xDA, 0x1E, 0xD0, 0x35, 0x87, 0xE7, 0x2E, 0x31,
    0x5D, 0x0D, 0x86, 0xAE, 0xF9, 0xEA, 0x9A, 0x1D, 0x7F, 0x3F, 0x38, 0x32,
    0x96, 0x9C, 0xE8, 0x62, 0xFB, 0x71, 0x7E, 0x32, 0xCB, 0xCC, 0xF8, 0x18,
    0x86, 0x6A, 0x50, 0xAD, 0x39, 0x5D, 0x42, 0xF4, 0x0F, 0x35, 0x47, 0x1F,
    0xA1, 0xC2, 0x26, 0xFE, 0x0F, 0xED, 0x0D, 0x7F, 0x92, 0x3A, 0x0D, 0x15,
    0x5B, 0xB8, 0x78, 0x85, 0x16, 0x5B, 0x9F, 0xAF, 0x4F, 0x04, 0x26, 0x02,
    0x13, 0x81, 0x44, 0x5C, 0x4F, 0x2E, 0x59, 0x51, 0x4F, 0x5C, 0xF0, 0x31,
    0x72, 0x2E, 0x22, 0x1B, 0x78, 0xA7, 0x09, 0x13, 0x66, 0x4A, 0x6E, 0x74,
    0xB5, 0xB7, 0x9B, 0xE7, 0xAC, 0xF3, 0xDE, 0xD5, 0x72, 0x73, 0x76, 0xE8,
    0x7A, 0xF7, 0x46, 0xF1, 0x55, 0xBB, 0xAB, 0xE6, 0x7F, 0xE1, 0x64, 0xE5,
    0xF6, 0x73, 0x15, 0xAD, 0x80, 0x6F, 0x49, 0x1C, 0xDD, 0xE5, 0x14, 0x02,
    0x27, 0xDA, 0xBB, 0x05, 0xC7, 0xAE, 0xD6, 0xF3, 0xE7, 0x8C, 0x96, 0x4D,
    0xB0, 0xEA, 0x9F, 0x43, 0x39, 0x00, 0xE1, 0xF6, 0xF6, 0x0A, 0x67, 0x04,
    0x02, 0xAA, 0x01, 0x40, 0x37, 0x9B, 0x01, 0x4D, 0x0C, 0xB0, 0xEB, 0xED,
    0xAA, 0xE9, 0xF3, 0xA5, 0x6C, 0x7E, 0xAE, 0x7D, 0x7D, 0x82, 0x20, 0xDC,
    0xA4, 0x2B, 0x62, 0xD5, 0x02, 0x81, 0x77, 0x7D, 0x6C, 0x9A, 0x34, 0xEB,
    0xA6, 0xCC, 0x14, 0x3A, 0x25, 0x0A, 0x50, 0x00, 0x24, 0x9A, 0xBC, 0x5D,
    0x9E, 0x46, 0xE2, 0x31, 0x04, 0xFE, 0x5E, 0x19, 0xFE, 0x16, 0xC2, 0x78,
    0x25, 0x77, 0x95, 0xAB, 0xAC, 0x66, 0xCC, 0x3F, 0x7B, 0xAC, 0x74, 0x49,
    0x52, 0x01, 0x80, 0x87, 0x8A, 0x00, 0x90, 0x98, 0xA7, 0xD5, 0xBF, 0x40,
    0x97, 0x00, 0x3A, 0x13, 0xC2, 0xB5, 0x45, 0xA5, 0x40, 0x78, 0x1C, 0xE1,
    0x8A, 0x8D, 0x22, 0x00, 0xC5, 0x43, 0x24, 0x00, 0x80, 0xEF, 0x99, 0x02,
    0x06, 0xED, 0xF3, 0xA8, 0x8C, 0x37, 0xA1, 0x03, 0x12, 0xB9, 0xEF, 0x24,
    0x3C, 0x46, 0x98, 0x82, 0xE5, 0x79, 0x3A, 0xA0, 0xA2, 0x02, 0x49, 0xEA,
    0xCB, 0x01, 0x48, 0x3B, 0xC0, 0x2F, 0x28, 0x05, 0x2A, 0x05, 0xAC, 0x2B,
    0xDD, 0x27, 0xD8, 0xB4, 0x49, 0x9E, 0xE8, 0x71, 0x99, 0xA0, 0xE8, 0x18,
    0x73, 0x07, 0xFA, 0x62, 0x17, 0x95, 0x00, 0x39, 0x7F, 0x40, 0xA0, 0x80,
    0x91, 0xDA, 0xDB, 0x89, 0x46, 0x6B, 0x1E, 0x04, 0x41, 0x5A, 0x59, 0xA3,
    0x36, 0xFF, 0x82, 0x3E, 0x37, 0x87, 0x92, 0xAE, 0x3F, 0xC1, 0xA8, 0x7F,
    0xBD, 0xE9, 0x4F, 0x94, 0x31, 0x18, 0xA3, 0xA9, 0x3E, 0x60, 0x36, 0x1A,
    0xB9, 0x52, 0x13, 0x5D, 0x70, 0xD7, 0xFA, 0xC8, 0x73, 0xBE, 0x30, 0x65,
    0x6C, 0x32, 0x4E, 0xBF, 0x0E, 0x67, 0x2E, 0x2E, 0x54, 0x19, 0xCF, 0x5C,
    0x7C, 0x61, 0x47, 0x5F, 0xAD, 0x8C, 0x08, 0x00, 0x60, 0x3E, 0xFA, 0x8C,
    0xE0, 0xF0, 0x7D, 0x08, 0x35, 0x74, 0x92, 0x7B, 0x97, 0x6A, 0x95, 0x9D,
    0xBC, 0xFD, 0xF5, 0xA5, 0x7F, 0x4A, 0x3B, 0x3C, 0x3C, 0xDE, 0x59, 0xC1,
    0xF7, 0x47, 0xC0, 0x67, 0x1D, 0x7A, 0x8C, 0x46, 0xC2, 0xC4, 0xC4, 0x75,
    0x36, 0xF3, 0xEE, 0x86, 0x69, 0xAB, 0x94, 0xAC, 0xAC, 0xDA, 0xBE, 0x22,
    0x3E, 0xFA, 0x3D, 0x5F, 0xAD, 0x6E, 0xB5, 0x8B, 0x74, 0xA7, 0xEE, 0xE6,
    0xEC, 0xDD, 0x6D, 0x99, 0xB3, 0x25, 0x98, 0xD5, 0xDF, 0x63, 0xFD, 0x11,
    0xFA, 0xD0, 0x33, 0x22, 0x69, 0x3F, 0xF8, 0xFB, 0x8F, 0x7E, 0xFF, 0x91,
    0x3E, 0x96, 0xDE, 0x29, 0x52, 0x40, 0xA9, 0xEE, 0x97, 0xBC, 0x2C, 0x24,
    0x4E, 0x69, 0x8B, 0xAD, 0xC1, 0xD1, 0xE7, 0x9A, 0x69, 0xD9, 0xA4, 0x4D,
    0x37, 0x10, 0xB5, 0xED, 0x15, 0xCB, 0x59, 0x78, 0x7E, 0xF6, 0x1C, 0x3D,
    0xE1, 0x54, 0x57, 0x2F, 0x28, 0xF3, 0x75, 0x81, 0x2A, 0x8B, 0xA9, 0xB0,
    0x5E, 0x2D, 0xA7, 0xD1, 0xE9, 0x99, 0xA5, 0x6A, 0xE1, 0x64, 0x67, 0xB7,
    0xCB, 0xCB, 0x2C, 0x8F, 0x07, 0x5F, 0xF5, 0xEA, 0x80, 0x83, 0x76, 0x23,
    0x1D, 0xA0, 0x66, 0x9C, 0x94, 0x32, 0x58, 0x55, 0x12, 0x8F, 0xAE, 0x2F,
    0x43, 0xC2, 0x77, 0x97, 0xBB, 0xAB, 0x3A, 0x29, 0x78, 0x98, 0xA8, 0xC7,
    0x49, 0x52, 0x1E, 0xA5, 0x00, 0x75, 0x70, 0xB8, 0xBC, 0x8C, 0xD0, 0x5A,
    0xB2, 0x6E, 0x07, 0x00, 0x64, 0x63, 0xAB, 0x52, 0xC4, 0x28, 0x00, 0x9A,
    0x11, 0xE2, 0x15, 0x65, 0x09, 0x77, 0xE7, 0x11, 0x57, 0x07, 0x7C, 0xF5,
    0x12, 0x68, 0xE6, 0x7E, 0xB7, 0x06, 0xAE, 0x2E, 0x4B, 0x42, 0x4B, 0x7F,
    0xC3, 0xEC, 0x03, 0x88, 0x37, 0x03, 0xF0, 0x3B, 0xC9, 0xE9, 0x9F, 0x7D,
    0xE1, 0xEA, 0xB2, 0xED, 0x79, 0x6C, 0x59, 0xD0, 0x00, 0x80, 0xE2, 0xB1,
    0xA7, 0x39, 0x3F, 0xB2, 0x63, 0x2E, 0x7B, 0xFE, 0x12, 0xCE, 0xA2, 0x5F,
    0xE9, 0x2B, 0xD5, 0x23, 0x6F, 0x18, 0x4E, 0xBD, 0xC9, 0x4F, 0x96, 0xFF,
    0xEB, 0x1D, 0x9C, 0x5F, 0x4C, 0x04, 0xFE, 0x6F, 0x04, 0x54, 0xDE, 0xAF,
    0xCA, 0xDB, 0xA9, 0xBE, 0x20, 0x81, 0xB7, 0xDA, 0x5E, 0xAC, 0x4E, 0xF4,
    0x19, 0xD5, 0xE9, 0x54, 0x79, 0x3F, 0xE8, 0x74, 0x07, 0xF5, 0x05, 0x69,
    0x7F, 0x46, 0xE5, 0xFB, 0xBE, 0xB5, 0x3A, 0x6D, 0xFE, 0x1D, 0x2F, 0xD0,
    0x55, 0xE4, 0xAF, 0xEE, 0x80, 0x3A, 0x5F, 0xAB, 0xFF, 0x82, 0x49, 0xFF,
    0xE4, 0x8D, 0x7D, 0xF6, 0x81, 0xEF, 0x64, 0xF5, 0xB9, 0x0E, 0xD0, 0xBE,
    0x77, 0x3A, 0x34, 0xF5, 0x3C, 0x2D, 0x96, 0x43, 0x7E, 0x00, 0x95, 0x15,
    0x43, 0xF2, 0xB1, 0xC6, 0xAA, 0x39, 0x01, 0x71, 0x43, 0x6C, 0xB6, 0x07,
    0xA0, 0x65, 0x9B, 0xF7, 0xE9, 0xF3, 0x47, 0xCB, 0x12, 0xC0, 0x80, 0xFA,
    0x29, 0xFC, 0xBD, 0x38, 0xE0, 0x66, 0x06, 0xF3, 0xFD, 0xD5, 0xFC, 0x00,
    0x8D, 0x13, 0x74, 0xA0, 0xDB, 0x78, 0xC9, 0xDB, 0xD7, 0x7E, 0xF0, 0x4A,
    0xBD, 0x4D, 0x52, 0x44, 0x3C, 0x6E, 0x67, 0x7B, 0x4E, 0xD1, 0x68, 0x19,
    0xE9, 0xFA, 0x49, 0x87, 0x08, 0xBC, 0x11, 0x32, 0xF2, 0xAC, 0x7F, 0x14,
    0x00, 0xBD, 0xED, 0xBE, 0x19, 0x6B, 0xDD, 0x04, 0x62, 0xBC, 0xE4, 0x7B,
    0xFD, 0x08, 0x20, 0x71, 0x3F, 0x6D, 0xEB, 0x0A, 0x2D, 0xE7, 0x13, 0xB2,
    0xD6, 0x37, 0x07, 0xD9, 0x68, 0xD9, 0x8C, 0x93, 0x5E, 0x3A, 0x44, 0x01,
    0xE9, 0xEF, 0x9F, 0xBF, 0x0C, 0x03, 0x00, 0xC3, 0xA4, 0xD7, 0x78, 0x18,
    0x00, 0x44, 0x21, 0xEA, 0xAE, 0xD1, 0xDE, 0xE6, 0x19, 0x40, 0x36, 0xB8,
    0x17, 0x02, 0x20, 0x5A, 0xF7, 0xC3, 0x52, 0xC7, 0x5D, 0x09, 0x80, 0x24,
    0x7D, 0x31, 0x00, 0xBC, 0x35, 0x0C, 0xE3, 0x65, 0x07, 0x85, 0xC7, 0x12,
    0x78, 0x0E, 0xB8, 0x99, 0x9F, 0x5D, 0x79, 0x94, 0xE4, 0xF5, 0x7B, 0x78,
    0x37, 0x90, 0xB9, 0x1E, 0x01, 0x36, 0xE4, 0xF2, 0x31, 0x4C, 0x01, 0xA2,
    0x20, 0xD1, 0xEC, 0xF9, 0x36, 0x5E, 0x72, 0xC3, 0x6A, 0x9B, 0x82, 0xDF,
    0x04, 0xB1, 0x07, 0xFA, 0x3B, 0x3D, 0x75, 0x53, 0x19, 0x2D, 0xDB, 0xA6,
    0x4A, 0x33, 0x02, 0xD3, 0x29, 0xAD, 0x51, 0xB9, 0x62, 0xA3, 0xB5, 0xE7,
    0x7D, 0x8E, 0x92, 0xB2, 0x06, 0x69, 0x05, 0xDF, 0x77, 0x99, 0xF0, 0x16,
    0x93, 0x24, 0x41, 0x61, 0x4C, 0x23, 0x9A, 0x6E, 0x70, 0xB4, 0xAC, 0xC7,
    0xA0, 0xD6, 0x07, 0x8F, 0x10, 0xB2, 0x26, 0x57, 0xCB, 0x4A, 0x01, 0xA2,
    0x02, 0x45, 0x40, 0xD6, 0xE5, 0x29, 0x2E, 0xC6, 0x58, 0x97, 0x4F, 0xE5,
    0x82, 0xC6, 0xBA, 0x3A, 0xBF, 0x9E, 0x08, 0x4C, 0x04, 0x26, 0x02, 0x13,
    0x81, 0x1C, 0x81, 0xEF, 0x66, 0x1E, 0x8F, 0x3E, 0x5C, 0xE2, 0xE6, 0x27,
    0x7E, 0x96, 0x99, 0xC6, 0xE7, 0xDE, 0x4F, 0x0F, 0x18, 0x00, 0xAC, 0xB6,
    0xAF, 0x15, 0x8C, 0x7E, 0x3F, 0xEE, 0x21, 0x22, 0xF1, 0xFF, 0x55, 0x17,
    0x99, 0xAA, 0xC6, 0x49, 0xF3, 0x0D, 0x0C, 0x7F, 0x9F, 0xD3, 0xF4, 0x0F,
    0x7F, 0x43, 0x14, 0x06, 0xCD, 0xF4, 0xE4, 0x87, 0x3C, 0x58, 0x06, 0x27,
    0xBB, 0x31, 0x95, 0x4A, 0xB4, 0x77, 0x55, 0xA3, 0xA4, 0xEF, 0x4B, 0x77,
    0xAD, 0xFF, 0x34, 0x63, 0x59, 0xD9, 0x5E, 0x56, 0xA7, 0x85, 0x6B, 0xCB,
    0x30, 0x85, 0x79, 0x03, 0xB9, 0xE4, 0xFD, 0x6A, 0xF1, 0xFD, 0x5E, 0xE3,
    0x54, 0x2C, 0xC7, 0xCB, 0xDA, 0x35, 0xBD, 0x42, 0x56, 0xB6, 0x00, 0x05,
    0x8D, 0xBF, 0xBF, 0xB0, 0xFC, 0x88, 0x40, 0x79, 0x2A, 0x3C, 0xD4, 0x32,
    0x38, 0x6A, 0x8E, 0x1F, 0x06, 0xC0, 0x3A, 0x44, 0xB7, 0xCD, 0x5F, 0x5B,
    0xB6, 0x7C, 0x7F, 0x24, 0x8F, 0x29, 0x00, 0x1A, 0xD0, 0x55, 0x2D, 0x0F,
    0x03, 0x60, 0xF2, 0xB6, 0xDE, 0xE9, 0x71, 0x61, 0x19, 0xEE, 0xFA, 0x7A,
    0x7D, 0x1E, 0x47, 0xF0, 0x84, 0x90, 0x34, 0xCD, 0x0D, 0x90, 0x94, 0x87,
    0x01, 0x68, 0xE1, 0x06, 0x7E, 0x8E, 0x2E, 0x2E, 0x5B, 0x4A, 0x14, 0xD2,
    0x7B, 0x9B, 0x8A, 0xC6, 0xB7, 0xA7, 0x0A, 0x89, 0x62, 0xB9, 0xB9, 0x1B,
    0x38, 0x90, 0xAA, 0xE5, 0x37, 0x1C, 0x71, 0xD3, 0x3F, 0xA0, 0x12, 0x76,
    0xF8, 0x86, 0x09, 0x9A, 0x4D, 0x4E, 0x04, 0x26, 0x02, 0x13, 0x81, 0xFF,
    0x0A, 0x01, 0x3B, 0x38, 0x39, 0x9D, 0x1D, 0x0B, 0xF4, 0x55, 0x79, 0x3B,
    0xD3, 0x17, 0x64, 0xE0, 0x56, 0xDB, 0x8B, 0xF5, 0x91, 0x3E, 0x23, 0x0F,
    0xE2, 0x82, 0xB8, 0x46, 0x21, 0x2E, 0x97, 0x7B, 0x88, 0xA8, 0xBE, 0x20,
    0xF6, 0x98, 0x99, 0xBD, 0xAA, 0x87, 0x88, 0xD6, 0xCF, 0x1E, 0x22, 0x01,
    0x80, 0xA0, 0x4F, 0x60, 0x4B, 0x55, 0x36, 0x3F, 0x17, 0x3C, 0x0F, 0x81,
    0x7B, 0xF9, 0x24, 0x0D, 0xB4, 0x9A, 0x57, 0x2E, 0x37, 0x3A, 0x2E, 0x9B,
    0x90, 0xC4, 0xA8, 0xBC, 0xAE, 0xDF, 0xEB, 0xF5, 0x06, 0x92, 0x3A, 0x4B,
    0x83, 0xAF, 0xAB, 0x65, 0xCB, 0xBD, 0xEF, 0xFD, 0x0D, 0x90, 0x3E, 0x80,
    0x48, 0x5C, 0x9F, 0x37, 0x59, 0xDC, 0x13, 0x9D, 0x25, 0xFB, 0x93, 0xCB,
    0xD8, 0xA3, 0xF1, 0xD2, 0x3B, 0x1C, 0xC8, 0x8D, 0x0D, 0x99, 0xF1, 0x54,
    0x27, 0x13, 0xEF, 0x53, 0x84, 0x7F, 0x75, 0xC0, 0xE1, 0x7D, 0x95, 0x66,
    0x31, 0x1E, 0xF2, 0x70, 0x91, 0xE7, 0x0F, 0x17, 0x13, 0x51, 0x48, 0x78,
    0xE1, 0xE8, 0x61, 0xDE, 0x7E, 0x76, 0x7B, 0xB8, 0xDC, 0x84, 0x17, 0xEF,
    0x71, 0x82, 0x21, 0xB8, 0xFA, 0x47, 0x01, 0x30, 0x5F, 0x07, 0x1F, 0x00,
    0xA2, 0x0E, 0x12, 0xFA, 0xBC, 0x29, 0x6B, 0x3E, 0x13, 0x00, 0xA5, 0x00,
    0x64, 0x90, 0xA4, 0x24, 0x1F, 0xC3, 0x00, 0xC0, 0xC3, 0xA5, 0xE7, 0x21,
    0x82, 0xFC, 0x02, 0xBC, 0x2D, 0x18, 0x79, 0x78, 0x25, 0x44, 0xC8, 0x01,
    0x52, 0x24, 0xF1, 0x7C, 0x09, 0x48, 0xCA, 0x4E, 0x38, 0x23, 0x08, 0x89,
    0x52, 0xFE, 0x01, 0x2C, 0xD1, 0x52, 0xD9, 0xBC, 0x1D, 0xFC, 0xA9, 0xDE,
    0x3C, 0x44, 0x48, 0x25, 0xC3, 0xCF, 0x9B, 0x37, 0xBF, 0x22, 0xA6, 0x39,
    0x2B, 0xC9, 0x5E, 0x3F, 0xEC, 0x1F, 0x20, 0xA7, 0xC0, 0x89, 0x7F, 0x00,
    0xB5, 0x8F, 0x3D, 0xB9, 0x54, 0x56, 0x17, 0x19, 0x2C, 0x38, 0x8E, 0x5E,
    0x1F, 0x4C, 0xE1, 0x31, 0x70, 0x22, 0x9D, 0x7F, 0x9A, 0x5D, 0x09, 0x5A,
    0x6E, 0x90, 0x95, 0x6A, 0xF1, 0x18, 0xAC, 0xDE, 0x99, 0x5A, 0xEE, 0xC0,
    0x9B, 0x3F, 0x10, 0x1D, 0xDB, 0x49, 0x3E, 0x83, 0x37, 0x77, 0xF0, 0xC5,
    0xCD, 0x6B, 0x86, 0x10, 0x05, 0xC0, 0x3F, 0xFF, 0x05, 0x6D, 0x80, 0x60,
    0x8A, 0x5F, 0xA6, 0xA3, 0x36, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E,
    0x44, 0xAE, 0x42, 0x60, 0x82,
};

const size_t Console::g_png_size = 5849;