Embed Opera Boot as the default BIOS

Store the ROM as a compressed static blob and load it directly into
ROM memory. Keep Opera Boot first and default in BIOS settings while
preserving external BIOS selection and load errors.
This commit is contained in:
Antonio SJ Musumeci authored and trapexit committed 2026-10-12 19:17:46 -05:00
1 parent 5a09dc47c1
commit 684926fe20
9 files changed
+871 -62

No files matched your search

+3
View File
@@ -644,6 +644,9 @@ else
$(LD) $(fpic) $(LINKOUT) $@ $^ $(LDFLAGS) $(LIBS)
endif
$(CORE_DIR)/libopera/opera_bios.o: $(CORE_DIR)/libopera/opera_bios.h \
$(CORE_DIR)/opera_boot.h
%.o: %.c
$(CC) -c $(OBJOUT)$@ $< $(CFLAGS)
+18 -3
View File
@@ -6,12 +6,11 @@ FreeDO, to libretro. The fork/rename occurred due to the original 4DO
project being dormant and to differenciate the project due to new
development and focus.
One of several BIOS ROMs must be placed into your RetroArch / libretro
"System Directory" folder. "norsa" versions have the RSA encryption
check disabled which should allow unsigned software to run.
## ROMS
| Filename | Hash |
| ------------------------- | ------------------------------------ |
| opera-boot.bin | Build-dependent (external ROM) |
| panafz1.bin | md5:f47264dd47fe30f73ab3c010015c155b |
| panafz1j.bin | md5:a496cfdded3da562759be3561317b605 |
| panafz1j-norsa.bin | md5:f6c71de7470d16abe4f71b1444883dc8 |
@@ -30,3 +29,19 @@ For certain Japanese games a second "Kanji" ROM is necessary.
| panafz1-kanji.bin | md5:b8dc97f778a6245c58e064b0312e8281 |
| panafz1j-kanji.bin | md5:c23fb5d5e6bb1c240d02cf968972be37 |
| panafz10ja-anvil-kanji.bin | md5:428577250f43edc902ea239c50d2240d |
### opera-boot.bin
Opera includes **Opera Boot (Built-in)** as its first BIOS setting and default
(`opera-boot-internal`). Its compressed ROM is embedded in the core, so no
external BIOS file is required.
Supported BIOS ROMs placed in the RetroArch / libretro **System Directory**
appear after the built-in option and can be selected normally. This includes
`opera-boot.bin`, shown separately as **Opera Boot (System)**. "norsa" versions
have the RSA encryption check disabled, allowing unsigned software to run.
More details about the opera-boot boot ROM can be found at:
https://github.com/trapexit/opera-boot
+73
View File
@@ -1,7 +1,35 @@
// Owns the BIOS registry and direct decompression of embedded Opera Boot.
#include "opera_bios.h"
#include <zlib.h>
#include "opera_boot.h"
static const opera_bios_t BIOSES[] =
{
{
NULL,
"Opera Boot (Built-in)",
OPERA_BOOT_ROM_BYTES,
'X',
NULL,
NULL,
{0},
{0},
{0}
},
{
"opera-boot.bin",
"Opera Boot (System)",
OPERA_BOOT_ROM_BYTES,
'X',
NULL,
NULL,
{0},
{0},
{0}
},
{
"panafz1.bin",
"Panasonic FZ-1 (U)",
@@ -194,6 +222,51 @@ opera_bios_end(void)
return &BIOSES[sizeof(BIOSES) / sizeof(BIOSES[0]) - 1];
}
const
opera_bios_t *
opera_bios_builtin(void)
{
return &BIOSES[0];
}
int
opera_bios_load_builtin(uint8_t *data_,
size_t capacity_)
{
int rv;
int end_rv;
z_stream stream = {0};
if((data_ == NULL) || (capacity_ < OPERA_BOOT_ROM_BYTES))
return -1;
// zlib's input type is mutable for compatibility; inflate does not write it.
stream.next_in = (Bytef *)OPERA_BOOT_ZLIB;
stream.avail_in = sizeof(OPERA_BOOT_ZLIB);
stream.next_out = data_;
stream.avail_out = OPERA_BOOT_ROM_BYTES;
rv = inflateInit(&stream);
if(rv != Z_OK)
return -1;
rv = inflate(&stream,Z_FINISH);
if((rv != Z_STREAM_END) ||
(stream.total_in != sizeof(OPERA_BOOT_ZLIB)) ||
(stream.total_out != OPERA_BOOT_ROM_BYTES))
rv = -1;
else
rv = OPERA_BOOT_ROM_BYTES;
end_rv = inflateEnd(&stream);
if(end_rv != Z_OK)
return -1;
return rv;
}
const
opera_bios_t*
opera_bios_font_begin(void)
+14 -4
View File
@@ -1,10 +1,13 @@
#ifndef LIBOPERA_BIOS_H_INCLUDED
#define LIBOPERA_BIOS_H_INCLUDED
#pragma once
#include <stddef.h>
#include <stdint.h>
#define OPERA_BIOS_BUILTIN_ID "opera-boot-internal"
struct opera_bios_s
{
// External file basename; NULL for the built-in Opera Boot descriptor.
const char *filename;
const char *name;
uint32_t size;
@@ -21,7 +24,14 @@ typedef struct opera_bios_s opera_bios_t;
const opera_bios_t *opera_bios_begin(void);
const opera_bios_t *opera_bios_end(void);
// Returns the immutable embedded Opera Boot descriptor, also the first BIOS entry.
const opera_bios_t *opera_bios_builtin(void);
// Writes original on-disk bytes to caller-owned, non-NULL data_.
// capacity_ must cover opera_bios_builtin()->size. Returns bytes written or -1;
// on failure output may be partial. Bytes beyond that size are left untouched.
// The caller owns zero padding and host byte-order conversion.
int opera_bios_load_builtin(uint8_t *data_, size_t capacity_);
const opera_bios_t *opera_bios_font_begin(void);
const opera_bios_t *opera_bios_font_end(void);
#endif /* LIBOPERA_BIOS_H_INCLUDED */
+28 -31
View File
@@ -41,9 +41,10 @@ static struct retro_core_option_v2_definition option_defs_us_v2[] =
"opera_bios",
"BIOS (rom1)",
NULL,
"Select system BIOS."
" Only ROMS present in the system directory are listed."
" Changes take affect at core start/restart.",
"Select system BIOS. Embedded Opera Boot is always available and is the default."
" Opera Boot in the system directory is available as a separate file-backed option."
" Other ROMs are listed only when present in the system directory and load from those files."
" Changes take effect at core start/restart.",
NULL,
"system",
{
@@ -366,9 +367,10 @@ static struct retro_core_option_definition option_defs_us[] =
{
"opera_bios",
"BIOS (rom1)",
"Select system BIOS."
" Only ROMS present in the system directory are listed."
" Changes take affect at core start/restart.",
"Select system BIOS. Embedded Opera Boot is always available and is the default."
" Opera Boot in the system directory is available as a separate file-backed option."
" Other ROMs are listed only when present in the system directory and load from those files."
" Changes take effect at core start/restart.",
{
{ NULL, NULL }, /* This is set dynamically */
},
@@ -745,43 +747,38 @@ file_exists_in_system_directory(const char *filename)
}
static
const char *
set_bios_values(struct retro_core_option_value *values)
const
char *
set_bios_values(struct retro_core_option_value *values_)
{
size_t i = 0;
const opera_bios_t *bios = NULL;
size_t i = 1;
const opera_bios_t *bios;
if(!values)
if(values_ == NULL)
return NULL;
/* Loop through all recognised bios files */
bios = opera_bios_builtin();
values_[0].value = OPERA_BIOS_BUILTIN_ID;
values_[0].label = bios->name;
for(bios = opera_bios_begin(); bios != opera_bios_end(); bios++)
{
/* Sanity check */
if(i >= RETRO_NUM_CORE_OPTION_VALUES_MAX - 1)
if(bios == opera_bios_builtin())
continue;
if(i >= (RETRO_NUM_CORE_OPTION_VALUES_MAX - 1))
break;
if(!file_exists_in_system_directory(bios->filename))
continue;
if(file_exists_in_system_directory(bios->filename))
{
values[i].value = bios->filename;
values[i].label = bios->name;
i++;
}
}
/* Handle 'no files found' condition */
if(i == 0)
{
values[i].value = bios_disabled_str;
values[i].label = NULL;
values_[i].value = bios->filename;
values_[i].label = bios->name;
i++;
}
/* Add proper null termination */
values[i].value = NULL;
values[i].label = NULL;
values_[i].value = NULL;
values_[i].label = NULL;
return values[0].value;
return values_[0].value;
}
static
+622
View File
@@ -0,0 +1,622 @@
#pragma once
#include <stdint.h>
// Generated by tools/embed_boot_rom.py; do not edit by hand.
// Source: opera-boot project: https://github.com/trapexit/opera-boot
// Source license: GPL-2.0-only.
// Source bytes: 131072; CRC32: dacb21ad.
// Source SHA256: 6cbd0664c36e64c315b699b43dfc27c176597ef8f393279f199986fa5b6ba3bb.
// Compression: zlib wrapper, level 9; compressed bytes: 7270.
enum { OPERA_BOOT_ROM_BYTES = 131072 };
static const uint8_t OPERA_BOOT_ZLIB[] =
{
0x78, 0xda, 0xed, 0x9c, 0x7b, 0x70, 0x1c, 0xc5, 0x9d, 0xc7, 0x7b, 0x66,
0x77, 0xa5, 0x95, 0xbc, 0xf2, 0x8e, 0x5e, 0x41, 0xd8, 0x06, 0x8d, 0x1e,
0x18, 0x61, 0xac, 0x64, 0x6d, 0x0c, 0x38, 0x0e, 0x86, 0x95, 0xb1, 0x09,
0x10, 0x03, 0x6b, 0x03, 0x89, 0xc3, 0xe9, 0x12, 0xbd, 0xd6, 0xb6, 0x0a,
0xd9, 0x12, 0x5a, 0x99, 0x98, 0xe3, 0x2a, 0x37, 0xab, 0x07, 0x7e, 0x63,
0xc9, 0x0f, 0xb8, 0x80, 0x41, 0x8b, 0xc1, 0x75, 0x1c, 0x07, 0x57, 0x0e,
0x09, 0x55, 0x94, 0x83, 0xef, 0xd6, 0x3c, 0x0a, 0x92, 0x00, 0xb1, 0x89,
0x8f, 0x3c, 0xce, 0x70, 0xb3, 0xb3, 0x1a, 0x24, 0x6c, 0x02, 0x4a, 0x80,
0x60, 0x8c, 0xed, 0xbd, 0xef, 0xaf, 0x67, 0x56, 0x96, 0x8d, 0x49, 0x8a,
0x3f, 0xae, 0xea, 0xae, 0xee, 0xf7, 0xa9, 0x1a, 0x4d, 0xcf, 0x74, 0x4f,
0xf7, 0xaf, 0xdf, 0xbf, 0xee, 0xfe, 0xad, 0xec, 0xf2, 0x51, 0xaf, 0x47,
0x08, 0x7f, 0x3a, 0xa1, 0xfd, 0x3a, 0x55, 0x31, 0xaa, 0xa4, 0x13, 0xe2,
0x0a, 0xb8, 0x85, 0x6d, 0x68, 0x02, 0xee, 0x59, 0x76, 0xbf, 0x2e, 0xec,
0xc1, 0x99, 0x5d, 0xa9, 0xc5, 0xc2, 0x33, 0x49, 0x88, 0x42, 0x7b, 0x50,
0x6d, 0xb3, 0xfb, 0xe1, 0x57, 0x28, 0xc2, 0xf9, 0x42, 0x78, 0x11, 0x26,
0x4c, 0x61, 0xd2, 0x8b, 0x85, 0xc0, 0xb3, 0x48, 0xed, 0x1e, 0x55, 0xf1,
0xae, 0xc6, 0xee, 0x0f, 0xd3, 0x77, 0xf3, 0x53, 0xb7, 0x08, 0x0f, 0xde,
0x7b, 0x8e, 0x08, 0xf1, 0xdd, 0x54, 0x62, 0x7f, 0x9e, 0x75, 0xc3, 0x7e,
0x2d, 0x95, 0x18, 0xf5, 0xda, 0x83, 0x45, 0xd5, 0xf6, 0x80, 0x40, 0x1a,
0x53, 0x2f, 0xb1, 0xbb, 0xe9, 0x2e, 0x74, 0x3b, 0x2e, 0xef, 0x82, 0xd2,
0x4f, 0x27, 0x10, 0x67, 0x22, 0x84, 0x2b, 0x89, 0xeb, 0x5a, 0x65, 0x24,
0xa1, 0x4d, 0x4c, 0x45, 0x84, 0x77, 0x4f, 0x26, 0x73, 0x9c, 0xc2, 0xd8,
0x83, 0x85, 0xef, 0xd9, 0x83, 0x15, 0xb8, 0x66, 0xbc, 0x37, 0x64, 0x68,
0x5e, 0xe7, 0xd2, 0xbd, 0xa7, 0xdc, 0x74, 0x85, 0xe4, 0x95, 0x4e, 0x4c,
0x51, 0x11, 0xf6, 0x15, 0x84, 0x7d, 0x65, 0x68, 0x8b, 0xf0, 0x0e, 0xc5,
0x85, 0xd7, 0xba, 0x39, 0xe4, 0xfd, 0x45, 0x26, 0xf3, 0x99, 0x94, 0x75,
0xb0, 0x70, 0x87, 0x9b, 0xdf, 0xe9, 0x70, 0x3f, 0xee, 0xba, 0x43, 0x70,
0x27, 0xc6, 0xca, 0x61, 0xb0, 0xb0, 0x83, 0xdc, 0xc8, 0xc7, 0x2c, 0x3c,
0xcf, 0x76, 0xdd, 0xd5, 0x63, 0x79, 0x0a, 0x6a, 0x22, 0x95, 0x88, 0xe4,
0x59, 0x0b, 0x96, 0x28, 0xe9, 0x7d, 0x22, 0x98, 0x36, 0x44, 0x21, 0xca,
0x13, 0xef, 0xf6, 0xfb, 0xdc, 0xe7, 0x22, 0x7a, 0xb6, 0x16, 0xdc, 0xa6,
0x8c, 0x7b, 0x57, 0x7c, 0x96, 0x77, 0xe7, 0x9c, 0xe5, 0xdd, 0xe4, 0xf1,
0xef, 0xa8, 0x9e, 0xb2, 0xe9, 0x42, 0x86, 0xa9, 0xa9, 0x84, 0x19, 0x4c,
0x27, 0x8e, 0xab, 0xe4, 0x3e, 0x8c, 0x3c, 0xd9, 0x83, 0xe2, 0x3d, 0xbb,
0x1f, 0x75, 0x91, 0x28, 0xd2, 0x2d, 0x45, 0xcb, 0x41, 0x59, 0x22, 0x7c,
0x61, 0x51, 0x2a, 0x31, 0x50, 0x81, 0xbb, 0x7c, 0x47, 0xcf, 0xe6, 0x3a,
0x7a, 0x7e, 0x20, 0x0f, 0xf5, 0x31, 0x11, 0xdf, 0x3c, 0x67, 0x0f, 0x86,
0x9e, 0x43, 0x7d, 0x28, 0x54, 0xbf, 0xa6, 0xa2, 0x79, 0xd2, 0x89, 0xb0,
0x6a, 0xf7, 0x27, 0x85, 0x19, 0x48, 0x7a, 0xd2, 0xf5, 0xc1, 0x79, 0xd3,
0x84, 0xc8, 0x4d, 0xd5, 0x0b, 0x05, 0x77, 0xc5, 0xba, 0x25, 0xac, 0xa0,
0x5e, 0x7d, 0xa9, 0x84, 0x16, 0xb0, 0x16, 0xeb, 0xca, 0xa4, 0x4c, 0xe6,
0xa3, 0xc3, 0x78, 0x8f, 0xba, 0x53, 0x28, 0x3e, 0xaa, 0x43, 0xba, 0xbf,
0x5b, 0x1b, 0x56, 0x20, 0xd7, 0xf2, 0x91, 0xbd, 0x86, 0x82, 0x34, 0x96,
0x20, 0x8d, 0x25, 0xd9, 0xf8, 0xed, 0x41, 0x3d, 0x92, 0x8d, 0x9f, 0xe2,
0xcd, 0x87, 0xec, 0xe3, 0xe2, 0x3b, 0x4a, 0xdf, 0xef, 0xce, 0xd5, 0x9e,
0xf2, 0x84, 0x45, 0x8d, 0x47, 0x19, 0x15, 0xc8, 0xdb, 0x49, 0xb4, 0xaf,
0x89, 0xd6, 0x8d, 0xd4, 0x66, 0x75, 0xb4, 0xb6, 0xb9, 0x6b, 0x3d, 0x42,
0x13, 0xd4, 0x7e, 0x3d, 0x21, 0xe1, 0x45, 0xb8, 0x59, 0x10, 0x31, 0x23,
0x44, 0xe0, 0xc6, 0x74, 0x22, 0xe7, 0x12, 0x94, 0x01, 0xea, 0x5e, 0xcf,
0x31, 0xd5, 0x99, 0x3a, 0xc9, 0x65, 0xaa, 0x8a, 0x9e, 0x4a, 0xa0, 0x5e,
0x12, 0x97, 0xe0, 0x2a, 0xac, 0x32, 0xe3, 0xf4, 0x9c, 0x2f, 0xe5, 0xb4,
0x6b, 0x4d, 0xef, 0x91, 0x4c, 0xe6, 0x8f, 0x96, 0x91, 0xeb, 0x19, 0x7a,
0x68, 0xd4, 0x9b, 0x4a, 0xcc, 0xaa, 0xa3, 0xfc, 0xd8, 0x49, 0x4d, 0x19,
0x4a, 0x86, 0x54, 0x92, 0x69, 0x9a, 0x94, 0xcf, 0x09, 0x6b, 0xa9, 0x26,
0xf2, 0xa9, 0xef, 0x34, 0xbb, 0x2b, 0x54, 0xf3, 0xde, 0xaa, 0x6e, 0xfb,
0xa1, 0xa4, 0xd7, 0xec, 0xd6, 0xe2, 0xa9, 0x44, 0xf5, 0x42, 0x7c, 0xe7,
0x31, 0x0d, 0x33, 0x6e, 0xbf, 0x9e, 0x54, 0xec, 0xd7, 0x75, 0x61, 0xc5,
0x35, 0x15, 0x75, 0xe4, 0x49, 0x7f, 0x4f, 0x08, 0xeb, 0xea, 0x90, 0xb2,
0x3e, 0x93, 0xf9, 0x84, 0xd2, 0x78, 0xb7, 0xf6, 0x6a, 0xe4, 0x31, 0x82,
0xf6, 0x75, 0x97, 0x6a, 0x7d, 0xb3, 0x83, 0xfa, 0x1e, 0x64, 0x69, 0x40,
0xbc, 0x61, 0xf4, 0x21, 0x03, 0xef, 0xfb, 0x8d, 0xe1, 0x37, 0x2b, 0x1e,
0xb7, 0xfc, 0x5a, 0x6e, 0xaa, 0x48, 0xf9, 0x7a, 0x91, 0x21, 0x14, 0xf4,
0xc1, 0xbc, 0x74, 0x44, 0xf6, 0xb5, 0x5c, 0x6b, 0xad, 0x56, 0x6f, 0xd6,
0x51, 0x39, 0x87, 0x70, 0x51, 0x5d, 0xe8, 0x5e, 0x7b, 0x53, 0x87, 0x40,
0x3e, 0xde, 0xa4, 0xb8, 0xac, 0xb5, 0x86, 0x92, 0x5e, 0x22, 0xd6, 0xce,
0xc9, 0x64, 0xfe, 0xe0, 0x7e, 0xe3, 0xb3, 0x1a, 0xb4, 0xa1, 0xb3, 0x84,
0xff, 0xc5, 0xc8, 0xde, 0x9e, 0xa3, 0xef, 0xd6, 0xde, 0x74, 0x1c, 0xee,
0xe7, 0x52, 0x48, 0xdb, 0x1e, 0xac, 0x43, 0x3b, 0xbf, 0xf8, 0x5b, 0x54,
0x8f, 0x78, 0xf7, 0x33, 0x7b, 0xf0, 0x8e, 0x9a, 0x34, 0x64, 0x1d, 0x3a,
0xd8, 0xa0, 0x58, 0x7d, 0xfd, 0xd3, 0x91, 0xc7, 0x80, 0x7d, 0x50, 0x20,
0x5f, 0x7a, 0x9e, 0xb9, 0x26, 0x69, 0xd8, 0x87, 0x42, 0xc2, 0x3e, 0x94,
0x54, 0x52, 0x1b, 0x67, 0x79, 0xec, 0x4d, 0x70, 0x1f, 0x0c, 0x29, 0xf0,
0x17, 0x96, 0xa1, 0xf5, 0x23, 0x2d, 0x3f, 0xe2, 0xf8, 0xb1, 0xd5, 0x1b,
0xf6, 0xc0, 0x9d, 0x43, 0xb2, 0x58, 0xd7, 0x34, 0x28, 0xe8, 0x7f, 0xef,
0x5b, 0x7d, 0x11, 0x25, 0x7d, 0xab, 0x68, 0x40, 0xbf, 0x1e, 0x41, 0x5a,
0xbd, 0xf6, 0x26, 0x0d, 0x75, 0xd6, 0xbf, 0x23, 0x9d, 0x68, 0x80, 0x0c,
0xda, 0xb3, 0xe6, 0x52, 0xe5, 0x1e, 0xd3, 0x48, 0x28, 0x69, 0x59, 0x4e,
0x61, 0x31, 0xfc, 0x7b, 0x92, 0xdb, 0xab, 0xa5, 0x35, 0x61, 0x20, 0x3f,
0x9a, 0x79, 0x8f, 0x92, 0x63, 0x3f, 0xa4, 0x79, 0x4d, 0x43, 0x78, 0xcd,
0xf8, 0x8f, 0x11, 0xa6, 0x03, 0xd7, 0xd7, 0x55, 0x2a, 0x67, 0x73, 0x8d,
0xe2, 0x33, 0x0d, 0x3d, 0x8f, 0xe4, 0xc1, 0x58, 0xe2, 0x25, 0x39, 0xd0,
0xbe, 0x26, 0x40, 0x96, 0x7b, 0xad, 0x35, 0x28, 0xef, 0xef, 0xc8, 0xf1,
0xe4, 0x43, 0xc8, 0xa5, 0xa4, 0x6f, 0x91, 0xee, 0x61, 0x57, 0x9e, 0x5c,
0xb8, 0xd3, 0xd6, 0x3d, 0x0d, 0x4a, 0xfa, 0xdb, 0xc2, 0x03, 0xf7, 0x21,
0x7b, 0x30, 0x12, 0xa2, 0xf4, 0xcd, 0x5e, 0x15, 0x69, 0x69, 0x3e, 0x8a,
0xcb, 0xea, 0xd5, 0x9f, 0x47, 0x5c, 0x9b, 0xdc, 0xef, 0xe9, 0x9b, 0x4f,
0x46, 0xf6, 0x6e, 0x3e, 0xee, 0x11, 0xbe, 0x21, 0x5c, 0x87, 0x3c, 0x22,
0x77, 0x3e, 0xee, 0x2d, 0x1d, 0x68, 0xa9, 0x41, 0xa1, 0x08, 0xef, 0x1d,
0x2f, 0x07, 0xc4, 0x1a, 0x51, 0xf1, 0xe2, 0x5a, 0xbc, 0xf0, 0x1b, 0x8a,
0xf0, 0xaf, 0xaf, 0xe9, 0x57, 0xd6, 0x1a, 0x4d, 0x95, 0x1b, 0x5e, 0x9e,
0xde, 0xe1, 0xdf, 0x11, 0x33, 0xb4, 0xfc, 0x86, 0x84, 0x58, 0x67, 0xe8,
0x15, 0xeb, 0x6b, 0x9e, 0xf6, 0x07, 0x2b, 0xd7, 0x09, 0xad, 0xe8, 0x91,
0x2b, 0x8e, 0xae, 0xff, 0x37, 0xbd, 0x6e, 0xc3, 0xaf, 0x12, 0xab, 0xfd,
0x3b, 0xf1, 0xa2, 0xaa, 0xb2, 0x52, 0x6c, 0x34, 0xf4, 0xf8, 0x7a, 0xbf,
0xbe, 0x16, 0x2f, 0x74, 0xff, 0xbc, 0xea, 0x4a, 0xb1, 0xd6, 0xa8, 0x50,
0x3b, 0x73, 0xf5, 0xd5, 0xc1, 0x29, 0x1d, 0x49, 0xef, 0xa7, 0xbf, 0xda,
0xa1, 0xbc, 0x2c, 0x62, 0x43, 0xa2, 0xed, 0x9a, 0x12, 0xed, 0x1f, 0x2a,
0xae, 0x5f, 0xac, 0x04, 0x15, 0xa1, 0x4c, 0xf4, 0x08, 0xa5, 0xc0, 0x27,
0x94, 0x40, 0xae, 0x50, 0x26, 0xe4, 0xa1, 0xb3, 0x4d, 0x10, 0x4a, 0x5e,
0x81, 0x50, 0xfc, 0x90, 0x2c, 0xb7, 0x50, 0x28, 0x39, 0xc5, 0x42, 0xf1,
0x95, 0x0a, 0xc5, 0x7b, 0x8e, 0x50, 0x3c, 0xe7, 0x0a, 0x45, 0x9d, 0x2c,
0x14, 0xe5, 0x3c, 0x48, 0x5d, 0xee, 0xdc, 0xe9, 0x99, 0xde, 0x93, 0x3f,
0x85, 0xa3, 0xf0, 0xf4, 0x1d, 0x7d, 0x4f, 0xf1, 0x50, 0x7c, 0x14, 0x2f,
0xc5, 0x4f, 0xe9, 0x50, 0x7a, 0x48, 0x97, 0x02, 0x2b, 0xf8, 0xf8, 0xd4,
0xa5, 0x9c, 0xf7, 0xe5, 0xaf, 0xf1, 0xdf, 0x23, 0x3e, 0x41, 0x49, 0xa8,
0x48, 0x52, 0x45, 0xf2, 0x2a, 0xc4, 0x50, 0x21, 0x8e, 0x0a, 0x1f, 0x15,
0xe2, 0x39, 0x97, 0xe7, 0xdc, 0xd3, 0x2f, 0x75, 0xb2, 0x73, 0x9d, 0xf9,
0x3e, 0x1b, 0x9e, 0xbe, 0xa5, 0x38, 0x28, 0x2e, 0x8a, 0x93, 0xe2, 0x46,
0x1a, 0xc2, 0x05, 0xd9, 0xf2, 0x20, 0xbc, 0x07, 0xd2, 0x78, 0x50, 0x24,
0xce, 0x9d, 0x9e, 0xf1, 0x5e, 0x8c, 0x6a, 0x5a, 0x87, 0xa6, 0x8d, 0x9a,
0xfd, 0x84, 0xd9, 0x20, 0x6f, 0x0d, 0x82, 0x61, 0x18, 0x86, 0x61, 0x18,
0xe6, 0x7f, 0x27, 0x9a, 0x3e, 0xe6, 0x92, 0xeb, 0x29, 0x21, 0xd4, 0xd3,
0xfd, 0x67, 0x64, 0x35, 0x20, 0x93, 0xfe, 0x70, 0x81, 0x31, 0x0c, 0xc3,
0x30, 0x0c, 0xc3, 0x30, 0x0c, 0xc3, 0x30, 0xcc, 0xff, 0x41, 0x70, 0x8e,
0x97, 0x77, 0x58, 0xe4, 0x5c, 0x8b, 0xeb, 0x9b, 0xb8, 0x70, 0x76, 0x99,
0x73, 0x1d, 0xae, 0x6b, 0xe0, 0x35, 0x01, 0xf7, 0xf9, 0xb8, 0xae, 0xc6,
0x35, 0x0f, 0xd7, 0xf7, 0x71, 0x7e, 0x2e, 0x46, 0x7a, 0xe8, 0x5c, 0x6e,
0x3f, 0xce, 0xe0, 0x77, 0xe3, 0xfc, 0xdb, 0x5f, 0x8a, 0xf3, 0xdc, 0xf7,
0x46, 0xb6, 0x36, 0xb8, 0x67, 0xbd, 0x91, 0xab, 0x70, 0xa6, 0x3b, 0x62,
0x6f, 0x09, 0x89, 0x77, 0x6b, 0x61, 0x53, 0xf0, 0x42, 0xc8, 0x6b, 0x77,
0x87, 0x84, 0xb5, 0x59, 0x68, 0x38, 0xdb, 0x0b, 0xd3, 0xf9, 0x3e, 0xce,
0x80, 0x5f, 0x85, 0x3b, 0xe4, 0x9e, 0xab, 0x87, 0xb3, 0xb6, 0x06, 0x23,
0x7b, 0x85, 0x1f, 0xdf, 0x3e, 0x49, 0xe1, 0x47, 0xf6, 0x46, 0xae, 0xa2,
0xf8, 0x9c, 0xb3, 0xd0, 0x0e, 0x9c, 0x31, 0x1a, 0x38, 0x37, 0x1c, 0x15,
0x23, 0x46, 0xfb, 0x28, 0xce, 0x04, 0xfb, 0xb3, 0x76, 0x02, 0x14, 0x66,
0xa4, 0xbf, 0x7d, 0x14, 0x67, 0x71, 0x8a, 0x73, 0x86, 0xad, 0x77, 0xd9,
0x5b, 0xc6, 0x6c, 0x11, 0x34, 0xe7, 0x0c, 0x58, 0xd3, 0xdd, 0x34, 0xf4,
0x54, 0x10, 0xdf, 0x25, 0x45, 0x2e, 0xce, 0xd3, 0x3d, 0xce, 0xd9, 0xbc,
0x50, 0xe9, 0x5c, 0xf8, 0x30, 0x9d, 0x8f, 0x22, 0x0e, 0x94, 0x85, 0x0f,
0x77, 0x95, 0xce, 0x6f, 0x71, 0xf7, 0x38, 0xe7, 0xd9, 0xc2, 0x0b, 0xff,
0x0c, 0xce, 0x0d, 0x27, 0x1e, 0x11, 0x39, 0x17, 0xd0, 0x19, 0xb4, 0x10,
0x97, 0x1b, 0x42, 0x5c, 0x45, 0xa7, 0x78, 0x02, 0x67, 0xce, 0xbd, 0x74,
0x3e, 0x8d, 0xa3, 0x77, 0x9c, 0x9b, 0x26, 0x95, 0x53, 0xf6, 0x0b, 0x21,
0x3d, 0xb5, 0x1b, 0xe7, 0xc1, 0xf1, 0xf2, 0x9d, 0xa9, 0xdd, 0x7a, 0x77,
0x6a, 0x91, 0x08, 0xe8, 0x75, 0x5a, 0xc0, 0x84, 0x3f, 0x6c, 0x0f, 0xe8,
0x7c, 0xfb, 0x13, 0x27, 0x8f, 0x74, 0x36, 0x8f, 0xf0, 0x8b, 0x1c, 0xfb,
0x09, 0x57, 0x16, 0xc8, 0x46, 0x67, 0xc6, 0xf2, 0xfc, 0x5c, 0x3b, 0x23,
0x4c, 0xc0, 0xac, 0x0c, 0x0b, 0xcb, 0x5b, 0xa7, 0xa6, 0x7a, 0x6f, 0xda,
0x99, 0x9e, 0x29, 0xc4, 0xbc, 0x26, 0xe4, 0x19, 0xfb, 0x34, 0xf3, 0x1a,
0xe5, 0x59, 0xed, 0x5b, 0x69, 0x9c, 0x82, 0xcf, 0x6b, 0x80, 0x1c, 0x25,
0x42, 0x29, 0x6a, 0xa4, 0xb2, 0x35, 0xb4, 0x6c, 0x9c, 0xe4, 0x4e, 0x49,
0xdb, 0x0a, 0x2d, 0x1f, 0x69, 0xbd, 0xe1, 0xc6, 0x2f, 0x2c, 0xb5, 0x4e,
0x1d, 0x8b, 0x0b, 0x7e, 0x88, 0xe7, 0x97, 0xe9, 0x12, 0x45, 0x2d, 0x42,
0x3c, 0x63, 0x71, 0x20, 0x7d, 0x8f, 0xcc, 0x9f, 0x63, 0x9b, 0xa1, 0xc8,
0x73, 0xfe, 0x24, 0x9d, 0x3f, 0xf7, 0xa4, 0x7a, 0xae, 0x4a, 0xa0, 0x3c,
0x0d, 0xc4, 0xd5, 0x9d, 0xba, 0x59, 0x28, 0x3a, 0xce, 0x5f, 0xab, 0xba,
0x75, 0xc5, 0xda, 0x88, 0x32, 0xa9, 0x17, 0x3a, 0xce, 0x46, 0x3f, 0xa6,
0xf2, 0xce, 0xda, 0x06, 0xa4, 0x13, 0xbe, 0x02, 0xdb, 0x28, 0x15, 0x76,
0xbf, 0x2f, 0x6c, 0x09, 0x91, 0x71, 0xde, 0x5f, 0x5a, 0x60, 0x6f, 0xd5,
0x66, 0xa5, 0x12, 0xd3, 0x70, 0x8e, 0x3e, 0x6d, 0x27, 0xd5, 0x87, 0xf3,
0x3c, 0x09, 0xcf, 0x93, 0x1e, 0x41, 0x19, 0xaa, 0xb0, 0x11, 0x38, 0x46,
0xe5, 0x61, 0x45, 0x04, 0x9d, 0xc7, 0x7f, 0xe2, 0xd6, 0x7b, 0x0d, 0xc9,
0xf3, 0xee, 0x16, 0xe1, 0x41, 0xfb, 0xf1, 0x53, 0x3c, 0xf2, 0xec, 0x7e,
0xeb, 0x4b, 0xc9, 0xa1, 0x64, 0x52, 0xb1, 0x16, 0x69, 0xf2, 0xec, 0x1e,
0x76, 0x26, 0x5e, 0x0a, 0x8f, 0xba, 0xda, 0x81, 0x7c, 0x8f, 0xda, 0xe5,
0x11, 0x94, 0xcb, 0xc2, 0x3c, 0x3a, 0x33, 0xb6, 0xfb, 0x3a, 0x84, 0xd5,
0x7b, 0xed, 0xdc, 0xb4, 0xd9, 0xe0, 0x9c, 0x9f, 0x6b, 0x42, 0x83, 0x5c,
0x3a, 0xce, 0xdb, 0xe5, 0x79, 0x75, 0xe9, 0x76, 0xe1, 0x2f, 0xc6, 0x7d,
0x32, 0x9d, 0x0b, 0xc3, 0xf6, 0x01, 0xf5, 0xf7, 0x31, 0xd2, 0x98, 0x78,
0x86, 0x1f, 0xce, 0x89, 0x43, 0xb0, 0x9f, 0xb9, 0xa0, 0xc0, 0xde, 0x8e,
0x72, 0x8a, 0x08, 0xed, 0xd2, 0x2d, 0xa5, 0xc6, 0xe5, 0x2f, 0x68, 0x38,
0x07, 0x87, 0x3c, 0x7d, 0x82, 0xe2, 0xfe, 0x77, 0xf9, 0xbd, 0xa0, 0x36,
0x2b, 0x72, 0x50, 0xae, 0xa3, 0x94, 0x16, 0xe2, 0xfb, 0x13, 0x9e, 0x73,
0xe9, 0x19, 0xf2, 0x1d, 0x84, 0x7c, 0x21, 0x6b, 0x93, 0x19, 0x18, 0x79,
0x38, 0xac, 0xc1, 0xb6, 0xa0, 0x24, 0x9d, 0xb8, 0xb5, 0xc0, 0xee, 0xf3,
0x19, 0x76, 0x5f, 0x29, 0xae, 0x0b, 0x70, 0x5d, 0x8a, 0x6b, 0x01, 0x2e,
0x1b, 0xd7, 0x4b, 0xc6, 0xc8, 0xde, 0x70, 0x08, 0xf5, 0xf9, 0x73, 0xbb,
0x5c, 0x0c, 0x91, 0xed, 0x87, 0x7b, 0xde, 0xef, 0x25, 0x19, 0xb6, 0x97,
0x6b, 0x4b, 0xfa, 0xd1, 0x67, 0xb6, 0xa3, 0xcc, 0x06, 0xa8, 0x9c, 0x4d,
0xe1, 0xf6, 0xd7, 0x3a, 0x94, 0x41, 0x21, 0xe2, 0x6e, 0xcb, 0x23, 0x7b,
0x03, 0x3b, 0x6e, 0xf8, 0xad, 0x7b, 0x96, 0xcf, 0x75, 0xd2, 0xea, 0x13,
0xf2, 0xac, 0xde, 0xec, 0xa0, 0x31, 0x42, 0x96, 0x77, 0x3e, 0xd9, 0xff,
0x6c, 0x2f, 0x21, 0xdb, 0x1f, 0x83, 0xea, 0xc1, 0xde, 0x4e, 0x75, 0x17,
0xce, 0xa4, 0x7b, 0x05, 0x64, 0xf0, 0x85, 0xed, 0xed, 0x5e, 0x0d, 0xfe,
0x25, 0x29, 0xe4, 0x35, 0xad, 0xe5, 0xa9, 0x93, 0x33, 0x27, 0x8f, 0xe1,
0xdb, 0x1c, 0x84, 0x33, 0x90, 0x6f, 0xd4, 0x21, 0xda, 0xed, 0xb7, 0x1b,
0xb2, 0x79, 0x47, 0x5e, 0xe3, 0xa3, 0x68, 0xa3, 0x94, 0xf7, 0x3f, 0xd3,
0x79, 0x3a, 0x3d, 0x23, 0xdf, 0x13, 0x1d, 0xbb, 0x1f, 0xd9, 0x0e, 0xc5,
0xc8, 0x26, 0x94, 0x71, 0x42, 0x74, 0xe3, 0xfb, 0x3d, 0x94, 0x27, 0x75,
0xd3, 0xfe, 0x80, 0xf7, 0x21, 0xd3, 0x8b, 0xf4, 0x5f, 0x2c, 0x46, 0x3e,
0x50, 0x5e, 0x13, 0xbf, 0xe0, 0x1b, 0x15, 0xdf, 0x3c, 0xe5, 0xfa, 0x9f,
0x7f, 0xa6, 0x3f, 0xc9, 0x82, 0x30, 0x1b, 0x10, 0xe6, 0xb1, 0xb4, 0xa9,
0xcb, 0xf2, 0x82, 0x5c, 0xf4, 0xcd, 0xbf, 0x52, 0x7d, 0xe4, 0x3b, 0x32,
0x52, 0x7f, 0x39, 0xdf, 0x2e, 0xaf, 0x9c, 0x8d, 0x72, 0xda, 0x21, 0xed,
0x8e, 0x30, 0xb6, 0xc1, 0x0e, 0xc9, 0x73, 0xf9, 0x81, 0x90, 0xa8, 0x42,
0x9c, 0xc3, 0x2f, 0x86, 0x64, 0xdd, 0xe2, 0x7b, 0x3f, 0xec, 0x2c, 0x3e,
0xa1, 0x30, 0xa8, 0x87, 0x3f, 0xfe, 0x85, 0x34, 0x37, 0x21, 0x8d, 0x35,
0x67, 0xa4, 0x39, 0xf0, 0xf9, 0x34, 0xd5, 0x27, 0xdd, 0x7a, 0x54, 0xfa,
0xca, 0xd5, 0xb2, 0xbe, 0xfd, 0x42, 0xd9, 0x4a, 0xe9, 0xbf, 0xe8, 0x8c,
0x7d, 0x48, 0xe3, 0x63, 0x4a, 0x03, 0x71, 0x2a, 0xee, 0x78, 0x23, 0xd3,
0x72, 0xd2, 0xa1, 0x34, 0xc5, 0x46, 0xc4, 0xbb, 0xe2, 0x8c, 0x74, 0x7e,
0xf0, 0xf9, 0x74, 0xaa, 0x4a, 0xec, 0xf2, 0xa2, 0xd5, 0x7f, 0x25, 0x6f,
0x81, 0x33, 0xf2, 0xf6, 0x43, 0xd8, 0xad, 0x20, 0xdd, 0xf2, 0xa8, 0x15,
0x9f, 0x44, 0xf6, 0x2a, 0x68, 0xd7, 0x27, 0xd1, 0x17, 0x1b, 0x84, 0xd9,
0xa0, 0x0a, 0x13, 0xa6, 0x0d, 0xf2, 0x3e, 0xbf, 0x8e, 0xda, 0x10, 0xec,
0x39, 0xb4, 0x6f, 0xc1, 0xff, 0x03, 0xb3, 0xa1, 0x48, 0x98, 0xf1, 0x42,
0xc5, 0x9c, 0x0f, 0xbb, 0x98, 0xf2, 0xe2, 0x8d, 0xb0, 0x2f, 0x51, 0xed,
0xb8, 0xee, 0xb7, 0xe3, 0x11, 0xef, 0x38, 0x9b, 0x2f, 0x85, 0xf2, 0x60,
0x09, 0x3d, 0x83, 0xf4, 0x34, 0x2b, 0x10, 0xca, 0x58, 0x39, 0x5a, 0x06,
0xb2, 0xcf, 0x19, 0x97, 0x17, 0x0f, 0x9e, 0xe7, 0x53, 0x5e, 0x68, 0x3c,
0x92, 0x76, 0x67, 0x4e, 0x7e, 0x7e, 0x78, 0x38, 0x73, 0xf2, 0x0f, 0x64,
0x9f, 0x63, 0xef, 0x77, 0xe3, 0x5b, 0x24, 0x6d, 0x66, 0x72, 0xd0, 0x2f,
0x43, 0x94, 0x86, 0x69, 0x20, 0x6d, 0xd8, 0xa9, 0x0c, 0xff, 0x1a, 0xf6,
0x3b, 0xf5, 0x62, 0x62, 0xb6, 0x2c, 0xc8, 0x1e, 0x07, 0x76, 0x3a, 0x0a,
0xc2, 0xfb, 0x90, 0xd7, 0x8f, 0x69, 0x3e, 0xa0, 0x77, 0x42, 0x5c, 0xa0,
0xc3, 0x4e, 0x07, 0xf3, 0x4e, 0xff, 0x2d, 0x94, 0x4f, 0x67, 0x4e, 0x8a,
0xa8, 0x34, 0x66, 0x0c, 0xff, 0x48, 0xc9, 0xc5, 0x98, 0x0a, 0x7b, 0x10,
0x23, 0xc7, 0xb5, 0x71, 0x79, 0x96, 0xe4, 0xdb, 0x23, 0xed, 0xa2, 0x04,
0xd9, 0x13, 0x1d, 0xa2, 0xe7, 0x62, 0xc8, 0x58, 0xda, 0x67, 0x88, 0xb2,
0xbd, 0x3d, 0xa3, 0x59, 0xbb, 0x13, 0xa4, 0xf1, 0x41, 0x5a, 0xb6, 0xdf,
0x1e, 0xf4, 0xf7, 0x0b, 0x6a, 0x9c, 0x71, 0x98, 0xe2, 0x27, 0x79, 0x34,
0xfa, 0x76, 0x17, 0x7d, 0xfb, 0x28, 0x8d, 0xb7, 0xa6, 0x26, 0x9e, 0x70,
0xe6, 0x6a, 0xdf, 0xf0, 0xc1, 0x4a, 0x83, 0xe6, 0x37, 0x3f, 0xc6, 0x63,
0xb7, 0x6e, 0xc2, 0x88, 0xeb, 0x53, 0xfa, 0xce, 0x19, 0xe7, 0x51, 0x6f,
0xfb, 0x9f, 0xef, 0xc1, 0x98, 0x4b, 0xe5, 0xe2, 0x27, 0xbb, 0x2a, 0x61,
0x3c, 0xdf, 0xe3, 0x43, 0x9e, 0x95, 0x7a, 0x6c, 0xee, 0x1b, 0x6a, 0x0f,
0x8d, 0xdb, 0x56, 0x4f, 0x48, 0x49, 0xdf, 0x2c, 0xbf, 0xfd, 0x30, 0x3b,
0x97, 0xa6, 0x12, 0x15, 0x95, 0xd4, 0xd7, 0x87, 0x06, 0x1c, 0xbb, 0xb9,
0xf1, 0x36, 0x4f, 0xb0, 0x97, 0xaa, 0xa0, 0xb8, 0xe1, 0x2f, 0xa4, 0x9f,
0x33, 0xa6, 0x1e, 0x27, 0x3f, 0x2b, 0x8c, 0xf1, 0xc1, 0x98, 0x80, 0xb1,
0xdd, 0x97, 0x70, 0xc6, 0xf1, 0x2f, 0x67, 0x7b, 0x45, 0xe3, 0x10, 0xd9,
0x41, 0x39, 0xf3, 0xe7, 0x6a, 0x9a, 0x7b, 0xde, 0xb7, 0xc2, 0x65, 0xf9,
0x69, 0x18, 0xf5, 0xb8, 0xf9, 0xf0, 0x51, 0x3e, 0xd6, 0xa3, 0xde, 0x11,
0x47, 0x00, 0xfe, 0x56, 0x6a, 0x91, 0xcf, 0x80, 0x1d, 0x9a, 0x6a, 0x6d,
0x0e, 0x9e, 0x73, 0x04, 0x53, 0x37, 0xe4, 0x2a, 0x80, 0x6e, 0xb1, 0xdc,
0x36, 0x92, 0x7e, 0x37, 0xcc, 0xef, 0x9c, 0xfe, 0xd6, 0x40, 0x32, 0xe7,
0x53, 0x7d, 0x52, 0xfb, 0x37, 0xfb, 0x04, 0xea, 0x4a, 0xcb, 0x85, 0xfb,
0x06, 0x2a, 0xdf, 0x27, 0x9c, 0xfa, 0x97, 0x63, 0x8f, 0xb5, 0xe6, 0x6e,
0x95, 0x6c, 0x7e, 0x52, 0xdf, 0x96, 0xf5, 0xf3, 0x27, 0x2a, 0x17, 0x7a,
0xdf, 0xde, 0x11, 0xed, 0x6c, 0xac, 0x6d, 0x6a, 0x6f, 0xef, 0x9a, 0xa3,
0x37, 0x35, 0xb6, 0xc4, 0x5a, 0xff, 0x2e, 0x5a, 0x90, 0x2f, 0xb5, 0xa7,
0xa9, 0x8f, 0xdb, 0xe5, 0xa1, 0x80, 0x3d, 0x98, 0x2c, 0xb3, 0xb7, 0xea,
0x62, 0x78, 0xa3, 0xd2, 0x6d, 0x6e, 0xdc, 0xd7, 0x6d, 0x6f, 0xd4, 0xbc,
0x56, 0xb7, 0xa6, 0xd8, 0x3d, 0x8e, 0x0d, 0x1c, 0xc2, 0x0d, 0xc1, 0xb6,
0x0a, 0x63, 0x6d, 0x72, 0x36, 0xe4, 0xa1, 0x31, 0x36, 0xdf, 0xde, 0x91,
0xa0, 0xb9, 0xe0, 0xa7, 0xd2, 0xd6, 0x6a, 0x07, 0x6c, 0x89, 0x8c, 0x25,
0x94, 0xef, 0x27, 0xd3, 0x89, 0xb2, 0x7c, 0x33, 0xbe, 0xdd, 0xa0, 0x77,
0xd4, 0xef, 0x66, 0x6e, 0x0e, 0x5e, 0x39, 0x47, 0x88, 0x0b, 0x53, 0x89,
0xdd, 0x01, 0xc8, 0xe5, 0x43, 0x19, 0xa8, 0xe6, 0x02, 0xd8, 0xf4, 0x2d,
0x12, 0x5e, 0x69, 0x87, 0xb7, 0x39, 0x78, 0x19, 0xf2, 0x57, 0x6e, 0xdf,
0x27, 0xb2, 0x7d, 0xc3, 0x67, 0x3f, 0x28, 0xa8, 0x1f, 0xe7, 0xab, 0x9b,
0x83, 0x5f, 0x83, 0x9c, 0x65, 0x4e, 0x3e, 0x36, 0x8f, 0xe2, 0x1b, 0x3f,
0xe2, 0x9b, 0x86, 0xf8, 0x8a, 0xad, 0x7b, 0x34, 0xaf, 0x3d, 0x80, 0xf1,
0x38, 0xde, 0xe1, 0x85, 0xed, 0x92, 0x51, 0x15, 0xf1, 0x2b, 0x78, 0x1f,
0xc0, 0x77, 0x7e, 0xc4, 0x9b, 0x6f, 0x5e, 0x0b, 0xd9, 0x91, 0xc6, 0x1c,
0xb2, 0xf9, 0x8b, 0x88, 0x3c, 0x2a, 0x6b, 0xd8, 0x3d, 0x79, 0xd3, 0x8b,
0xfc, 0xf9, 0x52, 0x86, 0x35, 0x0d, 0x5e, 0x92, 0xe7, 0x01, 0xa7, 0x0e,
0x4a, 0x51, 0x07, 0xeb, 0x48, 0x6f, 0xb2, 0x37, 0x08, 0xaf, 0xfd, 0xa0,
0xd4, 0x55, 0xfc, 0x73, 0x48, 0x7f, 0x32, 0x9d, 0xb4, 0xdd, 0x36, 0xfd,
0x93, 0x94, 0xd4, 0x17, 0x74, 0xaf, 0x5b, 0x07, 0x4d, 0xc8, 0x67, 0x99,
0xbd, 0x43, 0x2b, 0x31, 0xe3, 0x1a, 0x95, 0x83, 0x4e, 0x77, 0x73, 0x23,
0xe6, 0xca, 0x0d, 0x52, 0xef, 0x7a, 0xfe, 0x8c, 0xb2, 0xef, 0x8c, 0x36,
0x3b, 0x45, 0x2f, 0xfb, 0x78, 0xb9, 0xb2, 0xd6, 0x1d, 0x23, 0xfd, 0x95,
0x9b, 0x83, 0x39, 0xd5, 0x98, 0x17, 0xa6, 0x09, 0x65, 0x59, 0x3a, 0x31,
0x19, 0xfa, 0x5b, 0x1e, 0x8d, 0x11, 0xf7, 0x0f, 0xe1, 0xdd, 0x61, 0xe1,
0x3b, 0x31, 0x3e, 0x9e, 0x15, 0xad, 0xb1, 0xe6, 0xa5, 0xab, 0xda, 0xda,
0x28, 0x26, 0x9a, 0x67, 0xa5, 0x7e, 0x58, 0xbe, 0xe8, 0x49, 0xbb, 0xbc,
0xee, 0xb7, 0xa4, 0x0f, 0x0f, 0x6f, 0x57, 0xe2, 0x66, 0x5f, 0x61, 0xdc,
0x1e, 0x80, 0x7d, 0xdc, 0x80, 0xe6, 0x47, 0x33, 0x54, 0x51, 0x16, 0x62,
0xf6, 0x5e, 0x23, 0x44, 0xf6, 0x76, 0x88, 0xf7, 0x1b, 0x64, 0xa7, 0x68,
0x6f, 0x83, 0x2e, 0x17, 0x4f, 0xd2, 0x38, 0x22, 0xd0, 0x5e, 0xfe, 0x88,
0xfe, 0x07, 0x9b, 0x51, 0x51, 0x23, 0xe3, 0x1b, 0x08, 0xa1, 0x3f, 0x57,
0xe8, 0x18, 0xc7, 0xa7, 0xa7, 0x9f, 0xaf, 0xce, 0xa4, 0xbb, 0xab, 0x0f,
0xdb, 0x06, 0xda, 0x4a, 0x5c, 0x27, 0x5d, 0x58, 0x81, 0x3e, 0xaa, 0x39,
0x6d, 0x43, 0xfd, 0x29, 0x74, 0x5a, 0x5d, 0x8e, 0xbf, 0xa4, 0x1f, 0x97,
0x17, 0xd5, 0x23, 0x5d, 0x8d, 0xfa, 0x78, 0xe9, 0x80, 0x1e, 0x28, 0x35,
0x74, 0xad, 0x34, 0x2e, 0xdc, 0xb0, 0x53, 0x9f, 0x83, 0xbc, 0x41, 0x84,
0x0f, 0xa3, 0xcd, 0x16, 0x8c, 0x0c, 0x44, 0x02, 0x23, 0x46, 0x04, 0xed,
0x2f, 0x44, 0x36, 0xa9, 0x62, 0xf8, 0xd7, 0x9a, 0x18, 0x7e, 0xa8, 0x42,
0x98, 0xf3, 0xa0, 0x1f, 0xcd, 0xd3, 0xfd, 0xd4, 0x9f, 0xc7, 0xd2, 0x8e,
0xeb, 0xd9, 0xb1, 0x9c, 0xda, 0xf6, 0x47, 0x90, 0x15, 0xda, 0xf0, 0x05,
0x57, 0xe0, 0x9a, 0x4d, 0xba, 0x90, 0x33, 0xf6, 0x74, 0xa0, 0x2f, 0x34,
0xa0, 0x1f, 0x47, 0xa8, 0xec, 0x86, 0xa0, 0x4b, 0xac, 0xa6, 0x31, 0xd4,
0x36, 0x70, 0x95, 0xab, 0x1f, 0xd1, 0x38, 0x04, 0xb7, 0xe6, 0xe8, 0x6e,
0xda, 0x42, 0x5c, 0x6d, 0xb8, 0xe6, 0xe3, 0x6a, 0xb1, 0xbb, 0xc3, 0x35,
0xd0, 0x03, 0xc9, 0xa6, 0x50, 0xf6, 0x2f, 0x1a, 0xff, 0xa0, 0x93, 0x8c,
0x1e, 0xce, 0x9c, 0x28, 0xa0, 0xb1, 0x0d, 0x36, 0xa0, 0x93, 0x2c, 0xa3,
0x6c, 0x82, 0x15, 0xbe, 0x0c, 0xb6, 0xb8, 0xfa, 0x2d, 0xce, 0x98, 0x13,
0x56, 0x86, 0xb7, 0xec, 0x13, 0xc3, 0xf1, 0x7d, 0x59, 0xd9, 0xbe, 0x0a,
0x3d, 0xf1, 0x18, 0xc6, 0x25, 0xea, 0xf3, 0x79, 0xe8, 0x57, 0x21, 0x99,
0xaf, 0x43, 0x3a, 0xe6, 0x8d, 0x0a, 0xd5, 0xde, 0x62, 0x0a, 0xf3, 0x5e,
0x13, 0x3a, 0x9e, 0x99, 0x0d, 0x9f, 0xb7, 0x47, 0xce, 0x4b, 0x18, 0x6f,
0x8c, 0x05, 0x06, 0x8d, 0x7f, 0xc8, 0xcf, 0x42, 0x94, 0x93, 0xf7, 0x7f,
0xda, 0xfe, 0x93, 0xe6, 0xa9, 0x54, 0x62, 0x66, 0xb1, 0xa9, 0x28, 0x5b,
0x50, 0x57, 0xfe, 0x2d, 0x4d, 0x49, 0xff, 0xfd, 0xfb, 0x95, 0x47, 0xb6,
0x28, 0x7a, 0x6e, 0xff, 0x42, 0x5d, 0x1d, 0x48, 0xa8, 0x21, 0xb2, 0x41,
0x44, 0xff, 0x80, 0x7d, 0xed, 0xf3, 0x15, 0xb0, 0xb9, 0x0d, 0x5a, 0x4d,
0xba, 0x66, 0xce, 0x23, 0xfb, 0x58, 0x3d, 0x80, 0x79, 0xa8, 0xdb, 0x3e,
0x24, 0x5c, 0x9b, 0x49, 0x2f, 0x64, 0x50, 0x42, 0xe8, 0x2a, 0x32, 0x6d,
0xea, 0xc7, 0x4f, 0x37, 0xc8, 0x39, 0x2d, 0xe9, 0xdc, 0x69, 0x8c, 0xbc,
0x09, 0x63, 0x6d, 0x87, 0x3b, 0xff, 0x18, 0xaa, 0x33, 0xe7, 0x66, 0x0e,
0x38, 0xf6, 0xa3, 0x63, 0x76, 0x9a, 0x78, 0x0e, 0xe7, 0x62, 0x7e, 0x11,
0xc5, 0x4b, 0x1c, 0x3d, 0x01, 0xe5, 0x38, 0x0d, 0x36, 0x8c, 0x65, 0x55,
0xe7, 0x08, 0x8f, 0x07, 0x61, 0xf2, 0x9d, 0x79, 0xe4, 0x02, 0xb3, 0x57,
0x57, 0xec, 0x37, 0x74, 0x65, 0xf8, 0xb7, 0xc8, 0x87, 0x63, 0xdb, 0xad,
0xbb, 0xf3, 0x5f, 0x2e, 0xcd, 0xf5, 0xf6, 0x41, 0x4d, 0x73, 0xd7, 0x1b,
0x93, 0x70, 0xd7, 0xde, 0xa8, 0xd3, 0x95, 0x03, 0x85, 0x42, 0x45, 0xb8,
0xaf, 0xd8, 0x07, 0x93, 0x41, 0xfb, 0xa0, 0x3e, 0x31, 0xb5, 0xb1, 0x5a,
0x95, 0xed, 0x74, 0x5b, 0x28, 0x50, 0x98, 0x98, 0x5d, 0x55, 0xec, 0xd4,
0xdb, 0x44, 0x53, 0x55, 0x07, 0x52, 0x89, 0xd4, 0x4e, 0xab, 0x5b, 0xf7,
0xd0, 0x3c, 0x83, 0x76, 0xf1, 0x28, 0xb5, 0x45, 0xeb, 0x9a, 0x64, 0x19,
0xd2, 0x0a, 0xd8, 0x9b, 0x4c, 0xb1, 0xfd, 0x21, 0x53, 0x6c, 0x41, 0xf9,
0xf4, 0x7b, 0x3c, 0x0f, 0xcb, 0xf2, 0xba, 0x59, 0xec, 0x44, 0x59, 0xd1,
0x58, 0x41, 0xf6, 0xdd, 0xf8, 0x46, 0xd1, 0xac, 0x30, 0xe4, 0x49, 0xf8,
0x15, 0xcc, 0x99, 0x65, 0x47, 0x32, 0xc7, 0xff, 0x2b, 0x95, 0x48, 0x08,
0x27, 0x6d, 0xe8, 0x38, 0x28, 0x33, 0xab, 0xa1, 0xc0, 0x47, 0x63, 0x8a,
0xbd, 0x09, 0x63, 0xce, 0x36, 0x8c, 0x5d, 0x09, 0xbf, 0x6e, 0x35, 0x88,
0x51, 0x57, 0x87, 0x53, 0x8a, 0x9c, 0x36, 0x22, 0x9e, 0x41, 0x5a, 0x54,
0x8e, 0xbb, 0x2f, 0xec, 0x78, 0x98, 0xe6, 0x66, 0x7b, 0x5b, 0x43, 0x80,
0x74, 0x94, 0x54, 0x62, 0xf9, 0x54, 0x94, 0xcd, 0xa8, 0xd9, 0x77, 0xb3,
0xf1, 0x7b, 0x41, 0x6b, 0xd1, 0x86, 0x51, 0x27, 0x7e, 0x6d, 0xa2, 0x4c,
0x17, 0xf3, 0x5a, 0x6a, 0x63, 0x09, 0xca, 0xa4, 0x00, 0xeb, 0xc2, 0x7e,
0x81, 0x30, 0xa5, 0x28, 0xbb, 0x49, 0xf6, 0x43, 0xd4, 0xae, 0x0c, 0x61,
0xae, 0xdb, 0x0d, 0x79, 0x50, 0xa7, 0x6b, 0xb5, 0x75, 0xa4, 0xcf, 0x22,
0xdd, 0xd5, 0xa8, 0xc3, 0x07, 0x30, 0x86, 0x2b, 0x56, 0x1d, 0xea, 0x19,
0xba, 0x5b, 0x1c, 0x79, 0x81, 0xff, 0x06, 0xb3, 0x4f, 0x8b, 0xdb, 0xfb,
0x28, 0x5f, 0x5e, 0xdd, 0xb5, 0xcb, 0x55, 0xf1, 0x4c, 0xe3, 0xc6, 0xfb,
0xd6, 0xba, 0x7e, 0x65, 0x7c, 0xbe, 0x68, 0xbc, 0x85, 0x8d, 0xb0, 0x8d,
0xb4, 0xce, 0xc9, 0xa6, 0x85, 0x7c, 0x8d, 0x4f, 0x6f, 0x83, 0x9b, 0x5e,
0xfd, 0x17, 0xa4, 0xb7, 0xee, 0xaf, 0xa5, 0x97, 0xfe, 0x6e, 0x01, 0xe9,
0x39, 0xc3, 0x36, 0xca, 0xc6, 0xea, 0xab, 0xf7, 0xc1, 0x1e, 0x17, 0x63,
0x7a, 0xc7, 0xbd, 0x28, 0x0f, 0x01, 0xbb, 0xdc, 0xbd, 0x72, 0x3d, 0x9c,
0xc9, 0x3c, 0x28, 0xc7, 0xd9, 0x41, 0x3d, 0x6c, 0x19, 0x21, 0x39, 0xae,
0x0d, 0x6f, 0xdd, 0x87, 0x3e, 0x9b, 0x92, 0xba, 0x13, 0xda, 0x82, 0xdf,
0x6d, 0x33, 0x7e, 0xf4, 0xc3, 0xa3, 0x18, 0x97, 0xa6, 0xa0, 0xcf, 0x45,
0x68, 0xcc, 0x24, 0x59, 0xa0, 0x9b, 0x29, 0x5e, 0x6a, 0xcf, 0x68, 0x87,
0x8e, 0x2e, 0x75, 0x61, 0x03, 0x8d, 0x61, 0x64, 0xf3, 0x2f, 0xd7, 0x14,
0xb4, 0x26, 0xea, 0xc6, 0x98, 0xb2, 0xdf, 0x59, 0xdb, 0x4e, 0x92, 0x6b,
0x3b, 0xb9, 0x9e, 0xab, 0x46, 0x5a, 0x53, 0xd2, 0x89, 0xcb, 0x2e, 0x49,
0x25, 0xf6, 0x85, 0xac, 0x40, 0x32, 0x38, 0xfc, 0x46, 0x32, 0x60, 0xf7,
0x24, 0x05, 0xf2, 0xe9, 0xa5, 0xb0, 0x4f, 0xb8, 0xf6, 0xe1, 0x88, 0x4f,
0xc3, 0xf8, 0x72, 0xa5, 0xab, 0x5b, 0x0b, 0xfb, 0x35, 0x9a, 0xeb, 0x23,
0xf9, 0xae, 0xde, 0x89, 0x39, 0xf5, 0xf8, 0x22, 0xd3, 0x28, 0x84, 0x2e,
0xaa, 0x39, 0xeb, 0x8f, 0x05, 0x11, 0xd9, 0x26, 0x20, 0x77, 0x68, 0xf8,
0x35, 0xcd, 0x57, 0x7c, 0xab, 0x4c, 0xf7, 0x43, 0x73, 0x93, 0xa0, 0xb6,
0xf4, 0x5b, 0x8c, 0x21, 0x57, 0x52, 0x9e, 0xd1, 0x66, 0x49, 0x5f, 0x38,
0x88, 0x78, 0x3c, 0x72, 0x0e, 0x41, 0x7d, 0x8c, 0x7b, 0xff, 0x3a, 0xe6,
0x3c, 0x1a, 0x23, 0x5f, 0x1d, 0xe7, 0x7f, 0x20, 0xb4, 0x5a, 0xce, 0x27,
0xa4, 0xc7, 0x51, 0x98, 0xdf, 0xb9, 0x61, 0x5e, 0x70, 0xc7, 0x42, 0x0d,
0x61, 0x0e, 0x7e, 0x55, 0xc8, 0x30, 0x18, 0xb3, 0xb5, 0x08, 0xc6, 0x01,
0x8c, 0xe1, 0x9a, 0x7f, 0xa4, 0x5b, 0xf3, 0xa3, 0xad, 0xeb, 0xc8, 0xd7,
0xf7, 0xd6, 0xd3, 0x1e, 0x44, 0x44, 0x54, 0x62, 0x3d, 0x59, 0x5f, 0xfa,
0x9a, 0xab, 0x3b, 0xbe, 0x26, 0x75, 0x58, 0x1f, 0xcd, 0x13, 0xc3, 0x07,
0x2a, 0x69, 0xbd, 0x1c, 0xb4, 0x5f, 0xd3, 0xd5, 0xe1, 0x03, 0x32, 0xbf,
0xa4, 0x13, 0x15, 0x20, 0x9d, 0x7f, 0x86, 0xec, 0x01, 0x94, 0xc7, 0x6c,
0x5c, 0xd5, 0x48, 0xa3, 0xc3, 0x59, 0x1b, 0x44, 0x74, 0x59, 0xd6, 0xb7,
0x46, 0x68, 0xfd, 0xe6, 0x31, 0x7b, 0x35, 0x9f, 0xbd, 0x48, 0xd6, 0x99,
0xc0, 0x1a, 0xea, 0x53, 0x7c, 0xf7, 0x20, 0xe4, 0x24, 0xdd, 0xe3, 0x47,
0xae, 0xae, 0xa4, 0x0e, 0x1f, 0x14, 0x39, 0x78, 0xfe, 0x0f, 0x57, 0x17,
0xa2, 0x76, 0x72, 0x0c, 0x61, 0xa0, 0x5f, 0x87, 0x3b, 0x90, 0x87, 0xcd,
0x95, 0xc8, 0x43, 0x25, 0x26, 0x4f, 0xb9, 0x86, 0x1e, 0xec, 0xd8, 0x46,
0x7a, 0x3f, 0xad, 0x07, 0xac, 0x35, 0x5a, 0x0d, 0xf6, 0x7a, 0xd6, 0x92,
0xfd, 0x3a, 0xbe, 0x7f, 0x1b, 0xcf, 0x7e, 0x7c, 0x37, 0x15, 0xee, 0xff,
0xb4, 0xef, 0xd7, 0xae, 0x85, 0xfb, 0x62, 0x5a, 0x93, 0xd9, 0xbf, 0xd1,
0x72, 0xe0, 0xfe, 0x1a, 0xad, 0xbd, 0xe0, 0xce, 0x85, 0x7b, 0x06, 0xdc,
0xff, 0x84, 0x30, 0x11, 0xb8, 0x43, 0x70, 0x3f, 0x0c, 0xf7, 0x42, 0xf7,
0x3d, 0xc9, 0x77, 0x09, 0xee, 0x77, 0x60, 0x5e, 0xc9, 0x71, 0xdf, 0xdd,
0x07, 0xb7, 0x0f, 0xee, 0xcb, 0xe1, 0xde, 0x4a, 0xba, 0x05, 0xdc, 0xb3,
0xe1, 0xee, 0xc7, 0xbd, 0xc6, 0x99, 0x77, 0x32, 0x51, 0xb4, 0x37, 0x63,
0xfc, 0xbc, 0xdf, 0x82, 0x79, 0x5f, 0x6f, 0x6d, 0x89, 0xae, 0xec, 0x6a,
0x5d, 0xda, 0x1a, 0xed, 0x9c, 0x4b, 0x7a, 0xc4, 0xe7, 0xfc, 0x9b, 0xdb,
0x57, 0xac, 0x40, 0x88, 0xc6, 0xce, 0xbb, 0xce, 0xee, 0xbf, 0x6a, 0x65,
0xeb, 0x1d, 0xab, 0xa2, 0xb5, 0xad, 0x2d, 0x73, 0x85, 0x1e, 0xeb, 0xea,
0x5c, 0xd5, 0xdc, 0xb5, 0xaa, 0x33, 0x5a, 0x7b, 0x67, 0xb4, 0x33, 0xd6,
0xda, 0xbe, 0x12, 0xef, 0x96, 0xb6, 0x35, 0x2e, 0x8b, 0xe1, 0xde, 0xd4,
0xd6, 0xde, 0x7c, 0x7b, 0x6d, 0x73, 0xfb, 0xaa, 0x95, 0x5d, 0x14, 0x91,
0xfb, 0x4c, 0xba, 0xa3, 0x8c, 0x97, 0x74, 0x8f, 0xcf, 0xc5, 0xdd, 0xd5,
0xd9, 0x88, 0x30, 0x4b, 0x5b, 0x3b, 0x63, 0x5d, 0xb5, 0x32, 0x3c, 0xe2,
0x69, 0x6b, 0x6c, 0x8a, 0xb6, 0x65, 0x9f, 0x10, 0x4f, 0x57, 0x63, 0x53,
0x5b, 0xf4, 0xd4, 0x33, 0xe9, 0x2f, 0x64, 0xcf, 0xef, 0x96, 0xbb, 0x5c,
0x9b, 0xa0, 0x1c, 0xa6, 0x52, 0xbb, 0xc4, 0xbd, 0x1a, 0xba, 0x9d, 0x80,
0x1e, 0xa8, 0x93, 0x1e, 0x88, 0x71, 0x0d, 0xe1, 0x82, 0x55, 0x78, 0xbf,
0x10, 0x6e, 0xc5, 0x75, 0x5f, 0xe7, 0xde, 0xcf, 0xc5, 0x3b, 0x0f, 0xd9,
0xf4, 0x93, 0x6e, 0x0c, 0xb7, 0xd7, 0xba, 0x29, 0x78, 0x29, 0xdc, 0x75,
0x70, 0x53, 0x59, 0x9f, 0x07, 0xf7, 0x95, 0x18, 0x67, 0xfd, 0x64, 0xff,
0xee, 0x3e, 0xcf, 0xb2, 0xb7, 0xe1, 0xf7, 0x1a, 0x9b, 0x83, 0xe5, 0x70,
0xcf, 0x40, 0xf8, 0xcb, 0xdd, 0x7d, 0x88, 0x9c, 0xf1, 0x79, 0xeb, 0x6a,
0x5c, 0xa6, 0x53, 0x9e, 0x49, 0xf1, 0x8a, 0xb5, 0xae, 0x5c, 0xa6, 0xd7,
0xb4, 0x77, 0x74, 0xa1, 0xb4, 0x1a, 0xdb, 0x2e, 0x92, 0xca, 0x9c, 0x1e,
0x5b, 0xd5, 0x14, 0xbb, 0x2b, 0xd6, 0x15, 0x5d, 0x81, 0xfc, 0x76, 0xdd,
0xd5, 0x41, 0x25, 0xa4, 0x8f, 0x95, 0xa8, 0x70, 0xde, 0xd5, 0xc6, 0x3a,
0xa2, 0xcd, 0xa8, 0xb7, 0x66, 0x84, 0x69, 0x6c, 0x8a, 0xb5, 0xb7, 0xad,
0xea, 0xc2, 0xbb, 0x68, 0x73, 0x57, 0xbb, 0xac, 0x48, 0x9d, 0x4a, 0xb6,
0xb6, 0xe9, 0xae, 0xae, 0x68, 0x4c, 0x96, 0x6f, 0x56, 0xa7, 0xa1, 0x76,
0x5e, 0xb4, 0x39, 0x38, 0x19, 0x7b, 0x11, 0x29, 0xfa, 0x0d, 0x81, 0x3d,
0xd8, 0xf0, 0x18, 0xda, 0xec, 0x63, 0x68, 0xe7, 0x45, 0x6e, 0x1b, 0xba,
0x10, 0xb2, 0xab, 0xa9, 0x5b, 0x85, 0x17, 0xe5, 0x74, 0x31, 0xad, 0x07,
0xa1, 0x4b, 0xd6, 0xce, 0x94, 0xed, 0xec, 0xe4, 0xc1, 0xe1, 0xfb, 0x0a,
0xfb, 0x9c, 0x36, 0x77, 0x32, 0x83, 0xdf, 0x1a, 0xf4, 0x61, 0x3f, 0x91,
0xca, 0x05, 0x79, 0x3f, 0xf9, 0x31, 0xee, 0x31, 0xdc, 0x7f, 0x49, 0xbf,
0x19, 0xb0, 0xef, 0xc7, 0x3c, 0x7d, 0xab, 0x1c, 0x5f, 0xdf, 0xa5, 0x3d,
0x9c, 0x33, 0xf5, 0x4d, 0x3d, 0xd6, 0xbe, 0xaa, 0xb3, 0x39, 0x3a, 0xb7,
0x33, 0x1a, 0x93, 0x2d, 0x50, 0xef, 0x8c, 0x76, 0xb4, 0x35, 0x36, 0x47,
0xa9, 0xad, 0xe9, 0x35, 0x6d, 0xd1, 0x65, 0x8d, 0xcd, 0x77, 0x39, 0x01,
0x51, 0x5a, 0x17, 0xb9, 0xcb, 0x0b, 0xac, 0x1b, 0x68, 0x8d, 0x31, 0x3e,
0xae, 0xd6, 0x15, 0x8d, 0xcb, 0xa2, 0x7a, 0xeb, 0xca, 0x96, 0xe8, 0x6a,
0x99, 0x4f, 0xbd, 0xb3, 0xbd, 0x2d, 0x3a, 0xf7, 0xf6, 0x68, 0xe7, 0xca,
0x68, 0xdb, 0xa9, 0xe7, 0x9b, 0x6e, 0xd6, 0xa3, 0xab, 0xa3, 0xcd, 0xab,
0x64, 0x63, 0x71, 0xdf, 0x51, 0xe4, 0xf0, 0x6f, 0x89, 0xc6, 0xba, 0x5a,
0x57, 0x36, 0x76, 0xb9, 0x65, 0x4b, 0xe3, 0x95, 0xfc, 0xad, 0x56, 0xbf,
0xdc, 0x2b, 0x32, 0x90, 0xef, 0xc0, 0x1c, 0xd2, 0xbd, 0xb6, 0x69, 0x25,
0xc8, 0x37, 0xe6, 0xdd, 0x93, 0x3f, 0x83, 0xbb, 0x0c, 0xee, 0xf3, 0xe1,
0x7e, 0x16, 0x6e, 0xdd, 0x75, 0x3f, 0x83, 0xfc, 0xff, 0xc4, 0x19, 0xd7,
0x4e, 0xae, 0x1f, 0x2f, 0xa3, 0x23, 0x8d, 0x5e, 0x77, 0xdd, 0x35, 0xfa,
0x8a, 0x68, 0x57, 0x63, 0x4b, 0x63, 0x57, 0x23, 0xba, 0x4d, 0xe3, 0x9d,
0x8d, 0xad, 0x6d, 0x24, 0x8f, 0x5e, 0x13, 0x5b, 0xde, 0xde, 0xd9, 0xe5,
0x64, 0x85, 0xb2, 0xfa, 0x05, 0xdf, 0x2e, 0xbe, 0x69, 0x5c, 0x7d, 0xea,
0x8b, 0xbf, 0x33, 0xf6, 0xa4, 0xdf, 0x76, 0xdd, 0x98, 0xdb, 0x91, 0x5f,
0xce, 0x09, 0xbb, 0xb1, 0x46, 0xf1, 0x40, 0xb6, 0x42, 0xc8, 0xb6, 0x94,
0xda, 0xa4, 0xfc, 0x8d, 0x4a, 0x3f, 0xfd, 0x06, 0x25, 0x6c, 0x38, 0x63,
0xcf, 0xc9, 0x06, 0xb4, 0xe5, 0x52, 0xb4, 0xf1, 0x12, 0xb8, 0xb7, 0x41,
0xfe, 0x34, 0xee, 0x7f, 0x43, 0xcf, 0xc8, 0x7b, 0xd9, 0xd3, 0x9b, 0x83,
0x17, 0xed, 0xdc, 0x1c, 0xbc, 0xd4, 0xcd, 0xd3, 0xad, 0x67, 0x91, 0xcb,
0x6d, 0x95, 0x5f, 0x3e, 0x5f, 0xf4, 0xb7, 0xb6, 0xb1, 0x73, 0x59, 0x4c,
0xaf, 0x9b, 0x77, 0xdd, 0xd9, 0xbe, 0x72, 0x13, 0x58, 0x1e, 0x6d, 0x6c,
0x89, 0x76, 0x3a, 0x0d, 0xe0, 0x8b, 0xd3, 0x9f, 0xfb, 0xc5, 0x71, 0xcf,
0x9d, 0x8f, 0x7a, 0x5e, 0x48, 0x83, 0x86, 0xde, 0x79, 0xd9, 0xdc, 0xd0,
0xea, 0x10, 0x31, 0x23, 0x14, 0xfa, 0x4b, 0xf2, 0xcc, 0x9d, 0x87, 0xa7,
0xf9, 0x94, 0x9d, 0xf1, 0x9f, 0xcc, 0x20, 0x21, 0xd2, 0x89, 0xd2, 0x02,
0xfc, 0x4e, 0x0f, 0x7b, 0xb0, 0xf9, 0xd8, 0xdb, 0xcd, 0x4f, 0xa0, 0x9c,
0xf2, 0x69, 0x3e, 0xc0, 0xbd, 0x60, 0x9a, 0x3b, 0x07, 0x9f, 0x25, 0x4c,
0xc1, 0x03, 0xee, 0x5c, 0x2e, 0xd7, 0x0a, 0xfd, 0x95, 0x58, 0x07, 0x95,
0x09, 0x5a, 0xfb, 0xe0, 0xb7, 0x82, 0xbd, 0xb8, 0x07, 0xe8, 0x37, 0x69,
0xb8, 0x63, 0xef, 0x51, 0x9f, 0x6b, 0x1b, 0x15, 0xf8, 0x6d, 0x5d, 0x45,
0x57, 0x3a, 0x51, 0x9d, 0xb1, 0x8d, 0x4a, 0xf8, 0x55, 0xc7, 0x70, 0xc7,
0x3e, 0xee, 0x57, 0x4b, 0x71, 0xd7, 0xa1, 0x4f, 0x04, 0xd2, 0xfb, 0x50,
0xc7, 0x71, 0x9c, 0x21, 0x18, 0x5a, 0xaf, 0xd4, 0x11, 0xca, 0xfd, 0xf8,
0xed, 0x98, 0x56, 0x42, 0xfd, 0x9b, 0xf6, 0x33, 0xe0, 0x0e, 0xa4, 0xe3,
0x7a, 0x58, 0xca, 0x12, 0x47, 0x1a, 0xfd, 0x48, 0x2b, 0x5e, 0x99, 0xdd,
0xfb, 0x2f, 0x39, 0xa5, 0xb7, 0x4f, 0xa5, 0xb9, 0xe4, 0xe7, 0xf6, 0x16,
0xac, 0xaf, 0xb5, 0x3c, 0x9a, 0x57, 0xbd, 0xd2, 0x6d, 0xe4, 0x41, 0x17,
0x91, 0x7b, 0x38, 0xbf, 0xc4, 0xf8, 0xf5, 0x67, 0xdc, 0x93, 0xce, 0xfb,
0x7c, 0x95, 0xde, 0x0f, 0x39, 0x7a, 0x8c, 0xfb, 0xdb, 0x36, 0x47, 0x27,
0xc7, 0xda, 0xd6, 0x7d, 0x0e, 0x29, 0x56, 0xcf, 0x6c, 0xd2, 0xbf, 0x3c,
0x45, 0xe1, 0x57, 0xd4, 0xe2, 0x7a, 0xf4, 0x25, 0x53, 0x97, 0x71, 0x3b,
0x6b, 0x41, 0x6d, 0x36, 0xc9, 0x59, 0xbc, 0x48, 0xee, 0xa1, 0x2a, 0xd9,
0x7d, 0x70, 0x0a, 0x4f, 0x7b, 0x59, 0xb4, 0x47, 0x85, 0x79, 0xfe, 0x0a,
0xe8, 0x4b, 0x33, 0x65, 0x7c, 0x78, 0x2e, 0x1d, 0x14, 0x5e, 0xdf, 0xa0,
0xbb, 0x5f, 0x8d, 0x1f, 0xc1, 0x08, 0x55, 0x55, 0xa5, 0x7e, 0xd3, 0x2f,
0x6a, 0xa0, 0x37, 0x19, 0xd0, 0x99, 0x4a, 0xed, 0xfd, 0xa2, 0x24, 0x15,
0xf7, 0x8e, 0xad, 0x5f, 0xdc, 0x79, 0x60, 0x3a, 0xed, 0xa3, 0x1c, 0xc9,
0x9c, 0xd8, 0x85, 0x75, 0x94, 0xef, 0xd2, 0x41, 0x2d, 0x14, 0xea, 0x51,
0x3c, 0x21, 0xe8, 0x5a, 0xdf, 0xc8, 0x9c, 0x48, 0xa0, 0x1f, 0xe4, 0xc1,
0xef, 0x61, 0x67, 0x8f, 0xe4, 0xc4, 0x63, 0x74, 0x9e, 0x51, 0x90, 0x3f,
0xbe, 0x65, 0xdc, 0xb2, 0xb8, 0x2e, 0x42, 0xc3, 0xf5, 0xd4, 0xb0, 0xde,
0xd6, 0x39, 0x36, 0x96, 0xd2, 0x3e, 0xb0, 0xb5, 0xe6, 0xfb, 0x2f, 0x65,
0xf7, 0x54, 0x8e, 0x64, 0x8e, 0x6d, 0x73, 0xf7, 0xba, 0x02, 0x96, 0xd0,
0x0c, 0x99, 0x3f, 0x0d, 0xbf, 0x05, 0xed, 0x75, 0x7e, 0x9b, 0x46, 0xfa,
0x37, 0xe9, 0x2e, 0x65, 0x18, 0x0b, 0xe9, 0xb7, 0x66, 0x47, 0x32, 0x9f,
0x95, 0xb9, 0xbf, 0xa7, 0x8a, 0xd0, 0xde, 0x57, 0x76, 0xaf, 0x5b, 0xee,
0x73, 0xdf, 0xb0, 0xbf, 0x4c, 0xea, 0x66, 0x9b, 0x84, 0x86, 0x78, 0xb7,
0x52, 0xbc, 0xbb, 0xde, 0x12, 0x85, 0x69, 0x33, 0x22, 0x1e, 0x85, 0xdb,
0xf7, 0x96, 0x28, 0xf2, 0x44, 0xc6, 0xca, 0xce, 0x87, 0x7e, 0x7d, 0xbe,
0xfd, 0x96, 0x28, 0xa6, 0xbd, 0xd1, 0x3d, 0xb2, 0x9d, 0x91, 0xfe, 0x73,
0x6c, 0xa7, 0xfb, 0x9d, 0x78, 0x14, 0xbf, 0x0d, 0xa3, 0xdf, 0x23, 0x5a,
0xf2, 0xb7, 0x64, 0xb4, 0xef, 0x73, 0xec, 0xa7, 0xae, 0x5f, 0x0e, 0xfc,
0xf2, 0xe0, 0xf7, 0x07, 0x7c, 0x9f, 0x03, 0x19, 0x69, 0x1f, 0xf9, 0x30,
0xdc, 0xf9, 0xf6, 0x5b, 0xda, 0x84, 0xb1, 0xbd, 0x4b, 0xda, 0x8b, 0x78,
0x4b, 0xe4, 0x9d, 0xb6, 0x97, 0x19, 0x57, 0x04, 0xe5, 0x8d, 0xea, 0xc0,
0xda, 0xb4, 0xbf, 0x8c, 0xd6, 0xfa, 0x34, 0xf6, 0xe0, 0x19, 0xed, 0x74,
0x41, 0x81, 0xdd, 0xeb, 0x43, 0xdb, 0x13, 0x17, 0x5a, 0x46, 0x00, 0xba,
0xd3, 0xb1, 0xb7, 0x64, 0x5d, 0x39, 0xef, 0x0e, 0x63, 0x6f, 0x2c, 0xcf,
0x19, 0x53, 0x8e, 0xfd, 0x86, 0xf6, 0x81, 0x90, 0x5f, 0xec, 0xb9, 0xee,
0x32, 0x9d, 0xf9, 0x68, 0xcb, 0x12, 0x7b, 0x3d, 0xad, 0xe1, 0xfc, 0x8a,
0xbd, 0x8e, 0xce, 0xc7, 0x9e, 0x5e, 0x48, 0x32, 0x63, 0xff, 0x03, 0x6b,
0xee, 0x6b, 0x5f, 0xb1, 0x37, 0x44, 0xfc, 0xf6, 0x86, 0x30, 0xd6, 0xa6,
0xc7, 0x8a, 0xe5, 0xba, 0x70, 0x73, 0x70, 0x23, 0xca, 0x7c, 0x0d, 0xce,
0x17, 0xd0, 0x0e, 0x5e, 0x3c, 0x91, 0xae, 0xcf, 0x2f, 0xb7, 0x07, 0x9b,
0x66, 0xd1, 0xba, 0x0b, 0xe5, 0x47, 0x6b, 0xd8, 0xad, 0xee, 0x3e, 0x50,
0xbe, 0x5d, 0x3e, 0xa1, 0x8b, 0x74, 0x4c, 0x1a, 0x1f, 0x69, 0x2f, 0x1f,
0x71, 0xbc, 0x9a, 0xdd, 0x3f, 0x75, 0x9e, 0x4f, 0xe4, 0x3a, 0xcf, 0x0a,
0xe9, 0xab, 0xa4, 0x4b, 0x15, 0x43, 0x5f, 0x2e, 0x46, 0x3c, 0xd4, 0x0f,
0xe2, 0x6e, 0x7a, 0x3f, 0x40, 0x7a, 0xb7, 0x63, 0x1d, 0x82, 0xfe, 0x22,
0xf4, 0x09, 0x99, 0x63, 0x55, 0x4e, 0x3d, 0x65, 0xfa, 0x5d, 0xff, 0x55,
0xf0, 0x6f, 0xb6, 0x36, 0xe9, 0x01, 0xfc, 0x0e, 0x4f, 0xb3, 0xcb, 0xf3,
0xfe, 0x1e, 0xe9, 0x3c, 0xed, 0xfa, 0x75, 0xc1, 0xaf, 0x1e, 0xdf, 0x06,
0x2c, 0xc3, 0xa0, 0x7d, 0x4d, 0xbf, 0x2b, 0xc7, 0x0b, 0xf0, 0x57, 0xe1,
0xdf, 0x09, 0xff, 0x5b, 0xe4, 0x39, 0x43, 0x42, 0xcf, 0x45, 0x5f, 0x09,
0xc2, 0xef, 0xf5, 0xd4, 0xee, 0x08, 0xe9, 0x2c, 0x1d, 0xc8, 0xd3, 0x0d,
0xae, 0x9f, 0xe6, 0xfa, 0xbd, 0x9c, 0xda, 0x1d, 0x26, 0xf9, 0x73, 0xdc,
0xf7, 0x41, 0xf7, 0xfd, 0x3e, 0x7a, 0x8f, 0x6f, 0x96, 0xe3, 0x9b, 0xb0,
0xeb, 0x77, 0x8e, 0xeb, 0xb7, 0x27, 0xb5, 0xbb, 0x43, 0x94, 0xde, 0x2f,
0xb4, 0xd2, 0x0d, 0x38, 0x63, 0x3c, 0x28, 0xd7, 0x84, 0x41, 0xb9, 0x76,
0xe9, 0x83, 0xee, 0x3d, 0x40, 0xbf, 0xd5, 0xa4, 0xfc, 0xa2, 0xce, 0x1c,
0x99, 0xff, 0x16, 0x32, 0x41, 0x37, 0xfd, 0x6c, 0x29, 0xed, 0x1b, 0x5a,
0xbd, 0xa7, 0x85, 0x39, 0xe8, 0x86, 0xb9, 0x0d, 0x61, 0xa0, 0xd7, 0x7e,
0x96, 0xe7, 0x3e, 0xd7, 0xe3, 0xb9, 0xd2, 0x4d, 0xb7, 0xc4, 0x4d, 0x77,
0x07, 0xe9, 0xc5, 0xf2, 0x7c, 0xe8, 0x3e, 0x2d, 0x50, 0xec, 0xac, 0xa5,
0x73, 0xb1, 0x4f, 0xe7, 0x77, 0xe3, 0xda, 0x47, 0x7e, 0x3e, 0xf8, 0xf9,
0x06, 0x2b, 0xae, 0xf5, 0x24, 0xfc, 0xf9, 0x13, 0x32, 0xc7, 0x7d, 0x67,
0xc8, 0xf4, 0xac, 0x1b, 0xff, 0xec, 0x3d, 0x54, 0x9f, 0x3f, 0x42, 0xdb,
0x73, 0xf6, 0x5a, 0x51, 0x96, 0x3e, 0xec, 0x5d, 0xf8, 0x84, 0x6c, 0x33,
0x0f, 0xd0, 0x5e, 0xe2, 0xb1, 0x77, 0xdc, 0xfd, 0xcc, 0x05, 0xe8, 0xe3,
0x57, 0xa1, 0x1e, 0x77, 0x41, 0x7e, 0xb4, 0xa2, 0xa9, 0x4f, 0x42, 0x0f,
0xae, 0x1e, 0xdf, 0xc3, 0x57, 0xb6, 0xaf, 0x6e, 0x5a, 0x15, 0xcb, 0xea,
0x18, 0x5f, 0x33, 0x4e, 0xf7, 0x23, 0x4d, 0xd4, 0xf1, 0x3b, 0xfd, 0x7d,
0xd7, 0x25, 0x2d, 0xed, 0x67, 0x7b, 0x2f, 0x15, 0xd4, 0xcf, 0xcd, 0x57,
0x2b, 0x31, 0xa7, 0x75, 0x9d, 0x31, 0xe7, 0xac, 0x6c, 0x6f, 0x8f, 0x9d,
0xa9, 0xf7, 0xae, 0x6c, 0x5f, 0x71, 0xd6, 0xf4, 0xda, 0x63, 0x9d, 0x98,
0x09, 0x3f, 0xff, 0x9e, 0x42, 0x67, 0x7d, 0x3e, 0xb7, 0xa7, 0xd7, 0xda,
0x95, 0xdd, 0x97, 0xad, 0x3f, 0x3d, 0x2e, 0xc7, 0x07, 0x6d, 0x73, 0x09,
0xfa, 0x83, 0x7f, 0xb8, 0x7f, 0x60, 0x3d, 0xda, 0x24, 0xce, 0xd5, 0x34,
0x8c, 0x81, 0xc7, 0x5f, 0xa3, 0x77, 0xae, 0x2e, 0x58, 0x87, 0x3e, 0x31,
0xcd, 0x7d, 0xa6, 0x35, 0xc5, 0x95, 0x78, 0x9e, 0xea, 0x3e, 0xd3, 0xda,
0xe3, 0x0a, 0x3c, 0x57, 0xba, 0xcf, 0xb4, 0x6e, 0x99, 0x83, 0xe7, 0xf3,
0xb1, 0xdf, 0xe9, 0x77, 0xdc, 0xc7, 0xef, 0x84, 0x4e, 0x41, 0xf7, 0x6b,
0xb2, 0xed, 0xac, 0x18, 0xe3, 0xbf, 0x47, 0xfe, 0x26, 0x5a, 0x60, 0x8d,
0x75, 0xe2, 0xbb, 0x76, 0xf9, 0x75, 0x87, 0xcc, 0x5e, 0x65, 0x3d, 0xed,
0xdb, 0xe0, 0x79, 0xd0, 0x19, 0x1b, 0x4f, 0xbc, 0x86, 0xef, 0x67, 0xe2,
0xbb, 0xd9, 0xb8, 0x7f, 0x03, 0xf7, 0xcb, 0xf0, 0x1e, 0xe3, 0xf4, 0xf1,
0x2b, 0x10, 0xdf, 0x8d, 0xb8, 0xcf, 0xa4, 0xb6, 0x07, 0x5d, 0xa5, 0xce,
0xe9, 0x63, 0xc1, 0x85, 0x76, 0xf9, 0xf4, 0x21, 0xcc, 0x6b, 0x98, 0xbb,
0xb0, 0x66, 0xea, 0x0e, 0xd5, 0xc0, 0xed, 0xb7, 0xcb, 0xcb, 0x97, 0xcb,
0xfd, 0xb2, 0xad, 0xa7, 0xed, 0xa9, 0xd1, 0xda, 0xfc, 0x98, 0xb5, 0x8e,
0xe6, 0x0c, 0x51, 0x62, 0x6f, 0x0b, 0x51, 0x9b, 0x2c, 0x7b, 0x14, 0x32,
0xed, 0x8c, 0x4f, 0x51, 0x1e, 0x49, 0xe8, 0x13, 0x28, 0xad, 0x9f, 0x24,
0xa6, 0xd0, 0x38, 0x79, 0x1c, 0x63, 0x5b, 0x09, 0xed, 0xd7, 0xde, 0x84,
0xbd, 0x1c, 0x47, 0x63, 0x14, 0x22, 0x06, 0x4d, 0x35, 0xb6, 0x5c, 0x08,
0x14, 0xa9, 0xd4, 0xe0, 0xdb, 0x57, 0xc6, 0x4e, 0x5f, 0xbb, 0x44, 0xef,
0x6c, 0x6d, 0x8e, 0xea, 0xe3, 0xbc, 0x4f, 0xd7, 0x4f, 0x96, 0x37, 0xae,
0x6c, 0x69, 0x5f, 0xba, 0x14, 0x9a, 0x6d, 0xe7, 0xb2, 0x68, 0xd7, 0x5c,
0xb9, 0xd4, 0x81, 0x86, 0xea, 0xa8, 0x34, 0x67, 0xd1, 0x4b, 0x74, 0x77,
0x7f, 0x17, 0xf2, 0xfc, 0x0b, 0xed, 0xa7, 0x1e, 0xc9, 0x1c, 0xcd, 0x9e,
0x67, 0x92, 0x7e, 0x87, 0x7d, 0x8f, 0xcf, 0xde, 0x47, 0x59, 0x0c, 0xd2,
0x59, 0x04, 0xee, 0x4f, 0xa0, 0xfc, 0x3e, 0x73, 0xd6, 0xe0, 0xc7, 0xa8,
0xad, 0x87, 0x4e, 0x93, 0xad, 0xb1, 0x49, 0x36, 0x0a, 0x39, 0x37, 0x0a,
0xfa, 0x1d, 0x3b, 0xd6, 0x43, 0x4a, 0xd2, 0xe3, 0xc1, 0xdd, 0x53, 0x24,
0x3c, 0x0a, 0xf6, 0xa5, 0xe0, 0x4d, 0x67, 0xfe, 0x39, 0x43, 0x03, 0x49,
0xef, 0x50, 0x4f, 0xf2, 0xb4, 0x73, 0x8f, 0xa1, 0x03, 0x49, 0x65, 0xe8,
0x05, 0x9c, 0x21, 0x9f, 0xf9, 0xfb, 0x6f, 0x45, 0xc3, 0x99, 0xf5, 0xab,
0xd8, 0x1f, 0x7a, 0x05, 0xd7, 0x8b, 0xb8, 0x92, 0x8a, 0x93, 0x86, 0xf3,
0x3b, 0x6f, 0x27, 0xee, 0x42, 0x8a, 0x9b, 0xec, 0x0a, 0x9c, 0x78, 0xdd,
0x33, 0x13, 0xd2, 0x25, 0x86, 0x5e, 0xd0, 0xb2, 0x71, 0xca, 0x67, 0xe8,
0x2b, 0x25, 0xd8, 0x63, 0x29, 0x19, 0x89, 0x43, 0x67, 0xed, 0x46, 0xbd,
0x66, 0x75, 0x96, 0x7e, 0x7d, 0x0a, 0xde, 0x97, 0x41, 0xa7, 0xf1, 0xda,
0x71, 0xfc, 0xae, 0xba, 0x5b, 0xea, 0x33, 0x53, 0x9c, 0x33, 0x19, 0x8d,
0xf4, 0x81, 0x12, 0x2b, 0xae, 0xd3, 0xbe, 0x9a, 0x28, 0xc5, 0xff, 0x61,
0xa0, 0xf3, 0xb0, 0xd2, 0x47, 0xf4, 0x92, 0xd2, 0x6e, 0xcd, 0x3b, 0x2e,
0xcc, 0x14, 0x84, 0x29, 0x71, 0xc3, 0x78, 0x65, 0x98, 0xb8, 0x3e, 0xa5,
0x28, 0xae, 0x95, 0x21, 0x9c, 0x6b, 0x47, 0x81, 0x33, 0x32, 0xb8, 0x71,
0xf7, 0x50, 0xbb, 0x92, 0x69, 0xef, 0x26, 0x99, 0xb0, 0x0f, 0x4f, 0xf5,
0x01, 0xbb, 0x0a, 0xe8, 0x2b, 0x6a, 0xe9, 0x1b, 0xc9, 0xfc, 0xd2, 0x03,
0xa1, 0xfc, 0xc2, 0x7a, 0xe1, 0xc1, 0x3e, 0xd1, 0xa7, 0xd0, 0x91, 0x20,
0x17, 0x5d, 0xba, 0xb4, 0xe3, 0xb0, 0xdd, 0x74, 0x1d, 0xb9, 0x45, 0x89,
0xfb, 0xad, 0xf7, 0xcc, 0x6f, 0xf7, 0x38, 0xdf, 0x0a, 0xe4, 0xd7, 0x27,
0xdb, 0xb1, 0x2b, 0xc7, 0xd8, 0x7e, 0x33, 0xfe, 0x97, 0x03, 0xe9, 0x55,
0x76, 0x92, 0xce, 0xf3, 0x43, 0x2a, 0xee, 0x79, 0x76, 0x52, 0xc7, 0xde,
0x4e, 0xc8, 0x80, 0x7b, 0x02, 0xed, 0x9f, 0x93, 0x8d, 0x05, 0xed, 0xa9,
0xe3, 0x37, 0xe6, 0x65, 0x94, 0xd6, 0x88, 0x21, 0x72, 0x30, 0x3e, 0x42,
0x66, 0xad, 0x24, 0x5b, 0x46, 0xe9, 0xc4, 0x57, 0x26, 0x59, 0xf1, 0xa2,
0x93, 0xf4, 0xff, 0x20, 0xb0, 0x7f, 0x52, 0x4d, 0x7b, 0x4b, 0x24, 0xa7,
0x65, 0x48, 0xdd, 0x40, 0x0c, 0x6f, 0x99, 0x91, 0xed, 0x27, 0x13, 0x87,
0xe2, 0x21, 0xda, 0x1b, 0x3f, 0xe6, 0x94, 0xdb, 0xa8, 0x1f, 0xe3, 0x48,
0xcb, 0x6d, 0xc4, 0x29, 0x73, 0x99, 0x94, 0x73, 0x33, 0x3e, 0xf4, 0x06,
0xb4, 0x12, 0xd4, 0x32, 0xc2, 0x78, 0xca, 0x70, 0xa1, 0xc9, 0x7a, 0xb0,
0xf7, 0x3c, 0x5f, 0x13, 0xd3, 0xe1, 0x4d, 0xd7, 0xc5, 0xe2, 0x1f, 0x29,
0xa4, 0xe2, 0xf7, 0xfb, 0x55, 0x4d, 0xd3, 0x3c, 0xe7, 0x9e, 0x7b, 0xae,
0xb7, 0xa2, 0xa2, 0xc2, 0x77, 0xd1, 0x45, 0x17, 0xe5, 0xcc, 0x98, 0x31,
0x23, 0x77, 0xce, 0x9c, 0x39, 0xfe, 0x79, 0xf3, 0xe6, 0xe5, 0x5d, 0x7f,
0xfd, 0xf5, 0xf9, 0x8b, 0x17, 0x2f, 0x9e, 0x80, 0x64, 0x02, 0xcd, 0xcd,
0xcd, 0x05, 0xb7, 0xdf, 0x7e, 0xfb, 0xc4, 0x58, 0x2c, 0x16, 0xbc, 0xfb,
0xee, 0xbb, 0xb5, 0xde, 0xde, 0xde, 0xc2, 0x8d, 0x1b, 0x37, 0x16, 0x6d,
0xdb, 0xb6, 0xad, 0x78, 0xc7, 0x8e, 0x1d, 0x25, 0xbb, 0x76, 0xed, 0x2a,
0x7d, 0xea, 0xa9, 0xa7, 0xbe, 0xf2, 0xcc, 0x33, 0xcf, 0x9c, 0xb3, 0x77,
0xef, 0xde, 0xb2, 0x97, 0x5e, 0x7a, 0xe9, 0xdc, 0xd7, 0x5f, 0x7f, 0x7d,
0xd2, 0x9b, 0x6f, 0xbe, 0x39, 0xf9, 0xed, 0xb7, 0xdf, 0x9e, 0xf2, 0xce,
0x3b, 0xef, 0x9c, 0xf7, 0xc1, 0x07, 0x1f, 0x9c, 0x7f, 0xf4, 0xe8, 0xd1,
0x72, 0xd8, 0xac, 0x60, 0x6f, 0x5a, 0x49, 0x2a, 0x90, 0xa6, 0xc2, 0xf8,
0x60, 0x9c, 0x5c, 0x8f, 0xcb, 0x2c, 0x9c, 0x7a, 0xc6, 0x6f, 0xbb, 0x3d,
0x17, 0xd6, 0x5c, 0x74, 0xf1, 0xf4, 0x5a, 0x3c, 0x86, 0x66, 0xcc, 0xbc,
0x64, 0xd6, 0xa5, 0x97, 0x5d, 0x3e, 0xfb, 0xeb, 0x75, 0xf3, 0xae, 0x9e,
0xbf, 0x80, 0xec, 0x80, 0xce, 0xfa, 0xae, 0x1e, 0xab, 0x84, 0xb1, 0x52,
0x59, 0xb5, 0xb2, 0x65, 0xa9, 0x68, 0x6c, 0x69, 0xe9, 0x14, 0x1d, 0xe8,
0x6e, 0x82, 0xfa, 0x1c, 0xbd, 0xae, 0x8b, 0x44, 0x6e, 0xbe, 0x7a, 0xf1,
0x8d, 0xb4, 0x5b, 0x34, 0x22, 0x44, 0x15, 0xac, 0x52, 0xaa, 0x51, 0x5e,
0xd5, 0xd8, 0x99, 0xae, 0x42, 0xc9, 0x57, 0x61, 0xeb, 0xb2, 0x0a, 0x36,
0x34, 0x55, 0xcf, 0xe1, 0xdd, 0x14, 0x5c, 0xfd, 0x8e, 0x75, 0x89, 0x07,
0xb6, 0x35, 0x5e, 0xb2, 0xac, 0xf9, 0x88, 0xad, 0xb3, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61, 0x18, 0x86, 0x61,
0x18, 0xe6, 0xff, 0x27, 0xff, 0x0d, 0xb8, 0x1e, 0xba, 0x41,
};
+51 -21
View File
@@ -36,6 +36,7 @@
#include "retro_miscellaneous.h"
#include "streams/file_stream.h"
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <stdint.h>
@@ -279,14 +280,19 @@ opera_lr_opts_get_bios(opera_lr_opts_t *opts_)
const char *val;
const opera_bios_t *bios;
opts_->bios = NULL;
opts_->bios = opera_bios_builtin();
val = getval("bios");
if(val == NULL)
return;
if(strcmp(val,OPERA_BIOS_BUILTIN_ID) == 0)
return;
for(bios = opera_bios_begin(); bios != opera_bios_end(); bios++)
{
if(bios == opera_bios_builtin())
continue;
if(strcmp(bios->filename,val))
continue;
@@ -295,37 +301,61 @@ opera_lr_opts_get_bios(opera_lr_opts_t *opts_)
}
}
static
int64_t
_load_bios_rom(const opera_bios_t *bios_)
{
int64_t rv;
assert(bios_ != NULL);
if(bios_ == opera_bios_builtin())
{
// Memory initialization provides fresh zeroed ROM1, including its unused tail.
rv = opera_bios_load_builtin(ROM1,ROM1_SIZE);
if(rv < 0)
retro_log_printf_cb(RETRO_LOG_ERROR,
"[Opera]: unable to decompress built-in BIOS ROM - %s\n",
bios_->name);
else
retro_log_printf_cb(RETRO_LOG_INFO,
"[Opera]: loaded built-in BIOS ROM - %s\n",
bios_->name);
return rv;
}
rv = read_file_from_system_directory(bios_->filename,ROM1,ROM1_SIZE);
if(rv < 0)
retro_log_printf_cb(RETRO_LOG_ERROR,
"[Opera]: unable to find or load BIOS ROM - %s\n",
bios_->filename);
else
retro_log_printf_cb(RETRO_LOG_INFO,
"[Opera]: loaded BIOS ROM - %s\n",
bios_->filename);
return rv;
}
static
void
opera_lr_opts_set_bios(opera_lr_opts_t const *opts_)
{
int64_t rv;
const opera_bios_t *bios;
if(g_OPTS.initialized_opera)
return;
if(opts_->bios == NULL)
{
retro_log_printf_cb(RETRO_LOG_ERROR,"[Opera]: no BIOS ROM found\n");
return;
}
rv = read_file_from_system_directory(opts_->bios->filename,ROM1,ROM1_SIZE);
if(rv < 0)
{
retro_log_printf_cb(RETRO_LOG_ERROR,
"[Opera]: unable to find or load BIOS ROM - %s\n",
opts_->bios->filename);
return;
}
retro_log_printf_cb(RETRO_LOG_INFO,
"[Opera]: loaded BIOS ROM - %s\n",
opts_->bios->filename);
bios = (opts_->bios == NULL) ? opera_bios_builtin() : opts_->bios;
if(_load_bios_rom(bios) < 0)
return;
opera_mem_rom1_byteswap32_if_le();
g_OPTS.bios = opts_->bios;
g_OPTS.bios = bios;
}
static
+51
View File
@@ -0,0 +1,51 @@
#!/usr/bin/env python3
"""Regenerate the private Opera Boot header; not required for normal builds."""
import argparse
import hashlib
from pathlib import Path
import zlib
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"rom", nargs="?", type=Path, default=Path("opera-boot.bin"),
help="source ROM (default: opera-boot.bin)",
)
parser.add_argument(
"output", nargs="?", type=Path, default=Path("opera_boot.h"),
help="destination header (default: opera_boot.h)",
)
args = parser.parse_args()
source = args.rom.read_bytes()
compressed = zlib.compress(source, level=9)
rows = [
"#pragma once",
"",
"#include <stdint.h>",
"",
"// Generated by tools/embed_boot_rom.py; do not edit by hand.",
"// Source: opera-boot project: https://github.com/trapexit/opera-boot",
"// Source license: GPL-2.0-only.",
f"// Source bytes: {len(source)}; CRC32: {zlib.crc32(source):08x}.",
f"// Source SHA256: {hashlib.sha256(source).hexdigest()}.",
f"// Compression: zlib wrapper, level 9; compressed bytes: {len(compressed)}.",
"",
f"enum {{ OPERA_BOOT_ROM_BYTES = {len(source)} }};",
"",
"static const uint8_t OPERA_BOOT_ZLIB[] =",
" {",
]
for offset in range(0, len(compressed), 12):
row = ", ".join(f"0x{byte:02x}" for byte in compressed[offset:offset + 12])
rows.append(f" {row},")
rows.extend([" };", ""])
args.output.write_text("\n".join(rows), encoding="utf-8", newline="\n")
print(f"{len(source)} source bytes -> {len(compressed)} compressed bytes")
print(f"SHA256 {hashlib.sha256(source).hexdigest()}")
if __name__ == "__main__":
main()
+11 -3
View File
@@ -430,6 +430,8 @@ struct core_api_t
static const rom_entry_t BIOS_ROMS[] =
{
// Opera Boot is build-dependent: zero CRC permits only a basename+size match.
{ "opera-boot.bin", "Opera Boot (System)", 131072, 0 },
{ "panafz1.bin", "Panasonic FZ-1 (U)", 1048576, 0xc8c8ff89 },
{ "panafz1j.bin", "Panasonic FZ-1 (J)", 1048576, 0xd9493adc },
{ "panafz1j-norsa.bin", "Panasonic FZ-1 (J) [No RSA]", 1048576, 0x82ce67c6 },
@@ -1181,6 +1183,8 @@ _print_bios_list(FILE *f_)
BIOS_ROMS[i].size,
BIOS_ROMS[i].crc32,
BIOS_ROMS[i].name);
if(BIOS_ROMS[i].crc32 == 0)
fprintf(f_, " build-dependent CRC; requires this filename and size\n");
resolved = _resolve_rom_request(BIOS_ROMS[i].filename);
if(resolved != NULL)
@@ -2358,7 +2362,9 @@ _find_rom_by_hash(const rom_entry_t *entries_,
{
while(entries_->filename != NULL)
{
if((entries_->size == size_) && (entries_->crc32 == crc_))
if((entries_->crc32 != 0) &&
(entries_->size == size_) &&
(entries_->crc32 == crc_))
return entries_;
entries_++;
}
@@ -2405,6 +2411,8 @@ _stage_rom(const char *source_path_,
by_base = _find_rom_by_basename(entries_, source_path_);
by_hash = _find_rom_by_hash(entries_, size, crc);
if((by_base != NULL) && (by_base->crc32 == 0) && (by_base->size == size))
by_hash = by_base;
if((by_base != NULL) && (by_hash != by_base))
{
@@ -2446,8 +2454,8 @@ _stage_rom(const char *source_path_,
uint64_t target_size;
if((_file_crc32_and_size(target, &target_crc, &target_size) != 0) ||
(target_size != entry->size) ||
(target_crc != entry->crc32))
(target_size != size) ||
(target_crc != crc))
{
_report_error("staged %s ROM already exists with different content: %s\n",
kind_, target);