lhp: add DLO layout support

Add a dlo-based layout callback for use with lhp.

If lhp_dl_render() is used as the Lws Html/CSS parser callback, it
produces a display_list representation of the Html as DLOs, referencing the
appropriate CSS to drive the layout as best it can.

The display list can be rasterized on to an lws_display using the display's
state object

  lds->disp->blit(lds, (uint8_t *)&dl, &box);
This commit is contained in:
Andy Green 2021-12-29 19:24:05 +00:00
parent 3063fe84aa
commit 4a443c3e2e
16 changed files with 28236 additions and 49 deletions

View File

@ -132,6 +132,7 @@ if (LWS_WITH_SECURE_STREAMS_PROXY_API)
set(LWS_WITH_LWS_DSH 1)
set(LWS_WITH_UNIX_SOCK 1)
set(LWS_WITH_SYS_SMD 1)
set(LWS_WITH_SECURE_STREAMS 1)
endif()
if (NOT LWS_WITH_NETWORK)
@ -158,6 +159,7 @@ if (NOT LWS_WITH_NETWORK)
set(LWS_WITH_LWS_DSH 0)
set(LWS_WITH_THREADPOOL 0)
set(LWS_WITH_SYS_SMD 0)
set(LWS_WITH_LHP 0)
endif()
if (LWS_WITH_CGI)
@ -363,8 +365,10 @@ endif()
set(LWS_WITH_CLIENT 1)
if (LWS_WITHOUT_CLIENT)
set(LWS_WITH_CLIENT)
set(LWS_WITH_CLIENT 0)
set(LWS_WITH_SECURE_STREAMS 0)
set(LWS_WITH_SECURE_STREAMS_PROXY_API 0)
set(LWS_WITH_LHP 0)
endif()
set(LWS_WITH_SERVER 1)
if (LWS_WITHOUT_SERVER)
@ -381,6 +385,11 @@ if (LWS_WITH_OTA)
set(LWS_WITH_GZINFATE 1)
endif()
if (LWS_WITH_LHP)
set(LWS_WITH_CLIENT 1)
set(LWS_WITH_SECURE_STREAMS 1)
endif()
# using any abstract protocol enables LWS_WITH_ABSTRACT
#if (LWS_WITH_SMTP)

19
contrib/assets/LICENSE Normal file
View File

@ -0,0 +1,19 @@
## Asset Provanance and licenses
### bluecat.jpg.h
Licence: CC0
Source: https://commons.wikimedia.org/wiki/File:Startled_blue-eyed_cat_(Unsplash).jpg
Archive: https://archive.is/Bi4tR
### cat1.png.h
License: CC0
Source: https://commons.wikimedia.org/wiki/File:Cat_looking_outside_the_window.jpg
Archive: https://archive.is/Rocwf
### exclaim80.png.h & no-right.png.h
License: CC0
Source: andy@warmcat.com inkscape

1952
contrib/assets/bluecat.jpg.h Normal file

File diff suppressed because it is too large Load Diff

23399
contrib/assets/cat1.png.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,880 @@
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x47, 0x08, 0x06, 0x00, 0x00, 0x00, 0x90, 0xc2, 0xc0,
0x8e, 0x00, 0x00, 0x1c, 0x4d, 0x7a, 0x54, 0x58, 0x74, 0x52, 0x61, 0x77, 0x20, 0x70, 0x72, 0x6f,
0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x78, 0x69, 0x66, 0x00, 0x00,
0x78, 0xda, 0xad, 0x9b, 0x69, 0x76, 0x1c, 0xb7, 0x15, 0x85, 0xff, 0x63, 0x15, 0x59, 0x02, 0xe6,
0x61, 0x39, 0x18, 0xcf, 0xc9, 0x0e, 0xb2, 0xfc, 0x7c, 0x17, 0xd5, 0x4d, 0x89, 0x94, 0x6c, 0xcb,
0x96, 0xc9, 0x98, 0xa4, 0xc8, 0xea, 0x6a, 0xd4, 0x1b, 0xee, 0xf0, 0x80, 0x98, 0xfd, 0xbf, 0xff,
0x1e, 0xf3, 0x1f, 0x3e, 0x8a, 0xf7, 0xd5, 0xc4, 0x54, 0x6a, 0x6e, 0x39, 0x5b, 0x3e, 0x62, 0x8b,
0xcd, 0x77, 0x7e, 0xa8, 0xf6, 0xf9, 0xe8, 0xf7, 0xab, 0xb3, 0xf1, 0x7e, 0xbd, 0x1f, 0xe9, 0xf5,
0x27, 0xfe, 0xfd, 0xe9, 0xf7, 0x26, 0x96, 0xd7, 0x1f, 0x3c, 0xbf, 0x0a, 0x7c, 0x0f, 0xcf, 0x3f,
0x6b, 0x7e, 0x5d, 0xff, 0xfe, 0xbd, 0xfb, 0xb8, 0xc1, 0xf3, 0xad, 0xf3, 0x53, 0xfa, 0xee, 0x46,
0x75, 0xbe, 0xfe, 0x30, 0x3e, 0xff, 0xa1, 0xc5, 0xd7, 0xfd, 0xeb, 0x97, 0x1b, 0xf9, 0xe7, 0x5b,
0xd0, 0x8a, 0xf4, 0xf3, 0x7a, 0xdd, 0xa8, 0xbd, 0x6e, 0x14, 0xfc, 0xf3, 0x07, 0xf7, 0xba, 0x41,
0x7f, 0x1e, 0xcb, 0xe6, 0x56, 0xcb, 0xf7, 0x8f, 0x30, 0xf6, 0xf3, 0x7d, 0xbd, 0x1f, 0xb1, 0x3e,
0xff, 0x19, 0x7d, 0x89, 0xf5, 0xf3, 0xb2, 0x7f, 0xf8, 0x77, 0x21, 0x7a, 0x2b, 0xf1, 0x3e, 0xc1,
0xfb, 0x1d, 0x5c, 0xb0, 0x7c, 0xf5, 0x21, 0x3e, 0x0b, 0x08, 0xfa, 0xcf, 0x99, 0xd0, 0xf9, 0xa1,
0xf1, 0xd5, 0x85, 0xcc, 0x85, 0x36, 0x64, 0x7e, 0x8e, 0xfc, 0xab, 0xeb, 0xcf, 0xaf, 0x9b, 0x11,
0x90, 0x9f, 0xc5, 0xc9, 0x7e, 0xb7, 0x2a, 0xf3, 0x35, 0x2b, 0x1f, 0x3f, 0x7d, 0xc9, 0xca, 0x0e,
0x3f, 0x4f, 0x4a, 0xc8, 0xcf, 0x15, 0x86, 0x5f, 0x7c, 0x0e, 0x66, 0xfe, 0xf8, 0xfe, 0xd3, 0xdf,
0xbb, 0xf4, 0xe5, 0xf7, 0xaf, 0x1b, 0x9a, 0x1b, 0xe2, 0xef, 0xde, 0x39, 0xcc, 0xd7, 0x4f, 0xfe,
0xf3, 0xef, 0x4f, 0x77, 0xfd, 0xeb, 0xe3, 0xbc, 0xff, 0x3b, 0x67, 0x55, 0x73, 0xce, 0x7e, 0x9e,
0xae, 0xc7, 0x4c, 0x48, 0xf3, 0xeb, 0xa1, 0xde, 0x8f, 0x78, 0x7f, 0xe2, 0xc2, 0x41, 0xc8, 0xc3,
0x7d, 0x59, 0xe6, 0xb3, 0xf0, 0x5f, 0xe2, 0xe7, 0x72, 0x3f, 0x1b, 0x9f, 0xd5, 0x50, 0xbd, 0x93,
0x94, 0x2f, 0x3b, 0xed, 0xe0, 0x73, 0xba, 0xe6, 0x3c, 0x69, 0x39, 0x2e, 0xba, 0xe5, 0xba, 0x3b,
0x6e, 0xdf, 0xef, 0xd3, 0x4d, 0x96, 0x18, 0xfd, 0xf6, 0x85, 0xef, 0xde, 0x4f, 0x32, 0xa1, 0xdf,
0xd5, 0x50, 0x7c, 0xf3, 0x33, 0x58, 0x43, 0x7e, 0xa2, 0x3e, 0xdd, 0xf1, 0x85, 0xec, 0xad, 0x50,
0xc9, 0xd6, 0x24, 0xbd, 0x81, 0xdf, 0xfa, 0x8f, 0xb5, 0xb8, 0xfb, 0xbe, 0xed, 0xbe, 0xdd, 0x74,
0x95, 0x37, 0x5e, 0x8e, 0x2b, 0xbd, 0xe3, 0x66, 0x8e, 0x57, 0x78, 0xa3, 0x2f, 0xff, 0xc6, 0xe7,
0x1f, 0xde, 0xe8, 0x1c, 0x95, 0xbc, 0x73, 0x0a, 0xe6, 0x0e, 0x37, 0x56, 0x7c, 0xf5, 0x6a, 0x0a,
0x96, 0xa1, 0xcc, 0xe9, 0x2b, 0x57, 0x91, 0x10, 0x77, 0xde, 0x75, 0x94, 0x6e, 0x80, 0xdf, 0x9f,
0x5f, 0x3f, 0x94, 0xd7, 0x40, 0x06, 0xd3, 0x0d, 0x73, 0xe5, 0x01, 0xbb, 0x1d, 0xcf, 0x2d, 0x46,
0x72, 0xaf, 0xda, 0x52, 0x1d, 0x85, 0x9b, 0xe8, 0xc0, 0x85, 0x89, 0xef, 0x4f, 0xaf, 0xb9, 0xb2,
0x5e, 0x37, 0x20, 0x44, 0xbc, 0x77, 0x62, 0x31, 0x2e, 0x90, 0x01, 0x9b, 0x5d, 0x48, 0x2e, 0x3b,
0x0b, 0x08, 0x15, 0xe7, 0x88, 0x63, 0x25, 0x3f, 0x9d, 0x1b, 0x55, 0x9a, 0xc6, 0x0f, 0x52, 0xe0,
0x52, 0xf2, 0x8b, 0x55, 0xfa, 0x18, 0xe8, 0x96, 0xe2, 0xab, 0xd7, 0x7b, 0xf3, 0x9a, 0xe2, 0xee,
0xb5, 0x3e, 0xf9, 0xe7, 0xd7, 0x60, 0x16, 0x89, 0x48, 0x34, 0x53, 0x21, 0x35, 0xb4, 0x17, 0xb9,
0x8a, 0x00, 0x1b, 0xf5, 0x53, 0x62, 0xa5, 0x86, 0x7a, 0x0a, 0x29, 0xa6, 0x94, 0x72, 0x2a, 0xa9,
0xa6, 0x96, 0x7a, 0x0e, 0x39, 0xe6, 0x94, 0x73, 0x2e, 0x59, 0xe0, 0xd7, 0x4b, 0x28, 0xb1, 0xa4,
0x92, 0x4b, 0x29, 0xb5, 0xb4, 0xd2, 0x6b, 0xa8, 0xb1, 0xa6, 0x9a, 0x6b, 0xa9, 0xd5, 0xd4, 0x56,
0x7b, 0xf3, 0x2d, 0x00, 0x8e, 0xa9, 0xe5, 0x56, 0x5a, 0x6d, 0xad, 0xf5, 0xce, 0x9b, 0x76, 0xee,
0xdc, 0x79, 0x75, 0xe7, 0x82, 0xde, 0x87, 0x1f, 0x61, 0xc4, 0x91, 0x46, 0x1e, 0x65, 0xd4, 0xd1,
0x46, 0x9f, 0x94, 0xcf, 0x8c, 0x33, 0xcd, 0x3c, 0xcb, 0xac, 0x66, 0xb6, 0xd9, 0x97, 0x5f, 0x61,
0x81, 0x13, 0x2b, 0xaf, 0xb2, 0xea, 0x6a, 0xab, 0x6f, 0xb7, 0x29, 0xa5, 0x1d, 0x77, 0xda, 0x79,
0x97, 0x5d, 0x77, 0xdb, 0xfd, 0x50, 0x6a, 0x27, 0x9c, 0x78, 0xd2, 0xc9, 0xa7, 0x9c, 0x7a, 0xda,
0xe9, 0x1f, 0x59, 0x73, 0xe6, 0x49, 0xeb, 0x0f, 0x9f, 0xbf, 0x9e, 0x35, 0xf7, 0xce, 0x9a, 0xbf,
0x99, 0xd2, 0x85, 0xe5, 0x23, 0x6b, 0xbc, 0xb4, 0x94, 0xf7, 0x2d, 0x9c, 0xe0, 0x24, 0x29, 0x67,
0x64, 0xcc, 0x47, 0x47, 0xc6, 0x8b, 0x32, 0x40, 0x41, 0x7b, 0xe5, 0xcc, 0x56, 0x17, 0xa3, 0x37,
0x4a, 0x9d, 0x72, 0x66, 0x9b, 0xa7, 0x2b, 0x92, 0x67, 0x95, 0x49, 0xc9, 0x59, 0x4e, 0x19, 0x23,
0x83, 0x71, 0x3b, 0x9f, 0x8e, 0xfb, 0xc8, 0xdd, 0xb7, 0xcc, 0x7d, 0xca, 0x9b, 0x89, 0xf1, 0xb7,
0xf2, 0xe6, 0xdf, 0x99, 0x33, 0x4a, 0xdd, 0xbf, 0x91, 0x39, 0xa3, 0xd4, 0xfd, 0x41, 0xe6, 0x7e,
0xcc, 0xdb, 0x4f, 0xb2, 0xb6, 0x04, 0x77, 0xd3, 0x06, 0x73, 0x33, 0xa4, 0x36, 0x54, 0x50, 0x6d,
0xa0, 0xfd, 0xb8, 0x60, 0xd7, 0xee, 0x6b, 0x17, 0xa9, 0xfd, 0xe2, 0xf7, 0x3e, 0xcd, 0x6a, 0x44,
0x63, 0xee, 0x4e, 0x52, 0x6a, 0x5f, 0x39, 0x1c, 0x00, 0xcb, 0xef, 0xed, 0x43, 0xb1, 0x6e, 0x96,
0xb8, 0x0f, 0xb7, 0x4e, 0x74, 0x4f, 0x1f, 0x7d, 0x1f, 0xf8, 0xb7, 0xad, 0x10, 0x8b, 0x07, 0xa6,
0x56, 0x6b, 0x61, 0xf6, 0x96, 0x7d, 0x8e, 0xf0, 0x6a, 0x33, 0x8b, 0xa7, 0x98, 0x81, 0x6a, 0xdb,
0x33, 0x8f, 0xd0, 0x07, 0x4f, 0x53, 0x07, 0xc1, 0xdc, 0x69, 0x80, 0x7e, 0x75, 0xce, 0xe8, 0x7b,
0x22, 0xd6, 0x7b, 0xe4, 0x5d, 0xc7, 0x68, 0x84, 0xa0, 0xae, 0x3a, 0x13, 0x6d, 0x4b, 0x64, 0x7d,
0x2e, 0xfc, 0x79, 0x94, 0x32, 0xcd, 0x8c, 0x99, 0x14, 0xba, 0xb3, 0xc9, 0x7a, 0xe6, 0x2f, 0x63,
0xd6, 0xbc, 0x0f, 0x37, 0x3c, 0x71, 0xd4, 0x08, 0xfb, 0xd5, 0xce, 0xcb, 0x52, 0xf3, 0x96, 0x14,
0xed, 0xbd, 0x7c, 0xe0, 0x8a, 0xca, 0xa2, 0x5c, 0x16, 0x17, 0xed, 0xd3, 0xe2, 0x21, 0x18, 0xc9,
0xf4, 0x46, 0x40, 0x20, 0xa7, 0x46, 0x15, 0xb4, 0xe2, 0xe7, 0xc8, 0x61, 0x0e, 0x7f, 0x32, 0xcf,
0xc7, 0x83, 0xb5, 0x1a, 0x43, 0x49, 0xee, 0xf0, 0x17, 0x97, 0xd6, 0xb4, 0x79, 0xdb, 0x52, 0x77,
0x2c, 0x59, 0xa4, 0xd2, 0x49, 0x4d, 0x3b, 0x2c, 0x33, 0xc2, 0xbb, 0x66, 0xe6, 0xd5, 0x6b, 0x99,
0xad, 0x72, 0xbb, 0x14, 0x77, 0x6c, 0xf3, 0xac, 0x7d, 0xb8, 0xc5, 0xda, 0xa3, 0xce, 0x7e, 0x52,
0x6f, 0x29, 0x9e, 0xdc, 0xdc, 0x68, 0xa7, 0xf5, 0x9c, 0x53, 0xf5, 0x87, 0x37, 0xf7, 0x6e, 0x79,
0xca, 0x60, 0x8f, 0xf5, 0x8a, 0xb8, 0x59, 0x11, 0x3a, 0xea, 0xf7, 0x1f, 0xbf, 0xf5, 0xdd, 0xfc,
0xec, 0x0f, 0x21, 0x9d, 0x19, 0x9c, 0xf2, 0x05, 0xe9, 0x24, 0xb5, 0x38, 0xd4, 0xc6, 0xbf, 0xa2,
0xcd, 0xfd, 0xc4, 0xd4, 0xa7, 0x5b, 0x76, 0x90, 0x21, 0x56, 0xb8, 0x7d, 0x1e, 0x3d, 0xd5, 0xb5,
0xcd, 0x5e, 0x69, 0x52, 0xd1, 0xce, 0xc1, 0x3b, 0x2e, 0xd6, 0x99, 0x49, 0xbf, 0x3d, 0x69, 0x2f,
0x1e, 0xad, 0xf4, 0x31, 0x07, 0x85, 0xcb, 0xaa, 0x0b, 0xad, 0xb1, 0xe9, 0x0a, 0x68, 0xce, 0x03,
0x32, 0x85, 0x1b, 0x8d, 0x54, 0x62, 0x5e, 0x8b, 0x77, 0xa0, 0xd8, 0x8f, 0x19, 0x55, 0xab, 0xe8,
0x3b, 0x53, 0xf0, 0x79, 0xae, 0xde, 0xd3, 0x84, 0xe4, 0x6c, 0x88, 0xb9, 0xcf, 0x4e, 0x85, 0x11,
0xe6, 0x68, 0x67, 0x8e, 0x76, 0x73, 0x7f, 0x0a, 0xcd, 0xb6, 0x34, 0x79, 0x9f, 0xe4, 0x29, 0xae,
0xa9, 0x5a, 0xe8, 0x85, 0xee, 0x5c, 0xcb, 0xa4, 0x10, 0x67, 0x1b, 0xb1, 0x0f, 0x0a, 0xd3, 0xd3,
0x9a, 0xd4, 0x59, 0xb3, 0x81, 0xbb, 0xb3, 0x4a, 0x7a, 0xc7, 0x91, 0xaa, 0x13, 0xb9, 0x3d, 0x20,
0x9d, 0xe1, 0xc4, 0xe8, 0xe9, 0x3c, 0x97, 0x7c, 0xdd, 0xd3, 0x25, 0xd6, 0xd9, 0xf7, 0x6e, 0xa9,
0xd0, 0x7c, 0x86, 0x3e, 0x76, 0x85, 0x1a, 0x0d, 0x83, 0x37, 0xcb, 0xdb, 0x91, 0xfe, 0x7d, 0x52,
0x68, 0xb3, 0x79, 0xc9, 0xcb, 0x5d, 0x7a, 0x2a, 0xe0, 0x7e, 0x4e, 0xa7, 0xd6, 0x10, 0xd7, 0xa8,
0x2b, 0xd1, 0x6e, 0x75, 0x2f, 0x15, 0xc2, 0xa2, 0xc7, 0x13, 0xf1, 0x1b, 0xd3, 0x1b, 0xd6, 0x2d,
0x49, 0x06, 0xf6, 0xad, 0x3c, 0x72, 0x77, 0xdc, 0xc3, 0x97, 0x1d, 0xe7, 0xa1, 0xd3, 0xd1, 0x97,
0x67, 0xe5, 0xc3, 0x23, 0x51, 0x43, 0x40, 0x41, 0x8f, 0x83, 0x4a, 0x9d, 0xeb, 0x69, 0xc5, 0x43,
0x59, 0xcc, 0x5d, 0x5f, 0xfd, 0x66, 0x7e, 0xbd, 0x31, 0xff, 0xfc, 0x3b, 0x37, 0x02, 0x5f, 0x66,
0x38, 0x3d, 0x47, 0xde, 0x72, 0x9d, 0xd9, 0x6c, 0xa4, 0x11, 0x7c, 0xef, 0x33, 0x26, 0xe4, 0xc2,
0x44, 0xbc, 0x04, 0xa2, 0x46, 0xe7, 0xed, 0x91, 0xa2, 0x10, 0xa8, 0xc7, 0x15, 0xa9, 0xfd, 0x30,
0x04, 0x7e, 0x14, 0xfc, 0x21, 0xa4, 0xdb, 0xc4, 0x4a, 0xba, 0x7d, 0x19, 0x65, 0xf9, 0x31, 0xe6,
0x22, 0xb2, 0xa1, 0x02, 0x5e, 0x95, 0x0b, 0x40, 0xdb, 0x45, 0x0b, 0xfa, 0xe1, 0x63, 0x55, 0xf7,
0x82, 0xdd, 0x74, 0x87, 0xa5, 0x0c, 0xb8, 0x47, 0x09, 0xab, 0xf4, 0xde, 0x9d, 0x1b, 0x25, 0x85,
0xd5, 0xa6, 0x69, 0xc7, 0x83, 0x59, 0x1e, 0xf4, 0x6b, 0x04, 0x72, 0x5b, 0xb0, 0xef, 0x00, 0x66,
0x83, 0x6a, 0xa3, 0xf6, 0x1c, 0xc6, 0xa0, 0x65, 0x5e, 0x2a, 0x89, 0xca, 0x9f, 0x53, 0x43, 0x1c,
0xd9, 0x39, 0x1c, 0x37, 0x0b, 0x69, 0x4f, 0xc4, 0x32, 0x31, 0xe4, 0x85, 0x81, 0xee, 0x77, 0x30,
0x26, 0x3d, 0x1b, 0xe8, 0xa8, 0x3c, 0xda, 0xe4, 0x16, 0xae, 0xd1, 0x80, 0xe4, 0xdd, 0xcd, 0x43,
0x29, 0x93, 0x45, 0x9b, 0x80, 0xec, 0x42, 0xfe, 0xf3, 0x06, 0x42, 0x1a, 0x10, 0x13, 0xe9, 0x3d,
0x72, 0x96, 0xe8, 0x51, 0xd6, 0x1b, 0x7d, 0x31, 0xa3, 0xb0, 0x7a, 0xe0, 0x01, 0x68, 0x9f, 0xe0,
0x75, 0x96, 0x96, 0xa2, 0x59, 0xd2, 0xed, 0x61, 0x39, 0x88, 0x42, 0xcb, 0xf0, 0x9c, 0xa3, 0xa6,
0x5e, 0xca, 0x29, 0x8d, 0x47, 0x68, 0x84, 0xaf, 0x9e, 0x42, 0xa9, 0xb8, 0x6d, 0x4f, 0x59, 0x73,
0xbb, 0x60, 0xc0, 0xc2, 0x03, 0x01, 0x2c, 0x00, 0x8e, 0xc5, 0x54, 0x70, 0x2c, 0xe6, 0x86, 0xdb,
0x91, 0x5e, 0x21, 0xe7, 0xae, 0x50, 0x00, 0xa5, 0xbb, 0x0d, 0x48, 0xd3, 0x30, 0x55, 0x3a, 0x30,
0x14, 0xa8, 0xc5, 0xd5, 0x9c, 0x20, 0x39, 0x47, 0xd1, 0x81, 0x5c, 0xb9, 0x9b, 0x44, 0x73, 0x6d,
0x00, 0x29, 0x78, 0x9a, 0x91, 0xe0, 0x35, 0x38, 0x8c, 0xc4, 0x51, 0xd2, 0xb6, 0x86, 0x35, 0xa8,
0xdb, 0x6d, 0x89, 0x61, 0x5a, 0xb0, 0xdb, 0x22, 0x2e, 0x6e, 0x90, 0xd7, 0x11, 0x13, 0x80, 0x33,
0xe8, 0x0e, 0xda, 0x03, 0xf2, 0x83, 0xf1, 0x4c, 0xa8, 0xdc, 0x66, 0xc1, 0xa4, 0xc0, 0x60, 0x00,
0x68, 0x41, 0xe0, 0x63, 0xf7, 0x0e, 0xa3, 0x75, 0xae, 0x74, 0x81, 0xd4, 0x10, 0x16, 0x7f, 0x71,
0x01, 0x80, 0x3a, 0x92, 0x20, 0x6e, 0x81, 0xad, 0xc0, 0x73, 0x2f, 0x30, 0xde, 0xc8, 0xd4, 0xc0,
0x5e, 0x46, 0x02, 0x9c, 0xa6, 0x5e, 0x0b, 0x0c, 0xac, 0xed, 0x36, 0xbf, 0x03, 0xd7, 0xd4, 0xfc,
0x36, 0x8f, 0x45, 0xa2, 0x1b, 0x09, 0x0d, 0xc9, 0x2e, 0xdf, 0xcb, 0xab, 0x72, 0xb6, 0x5a, 0x05,
0x04, 0xa5, 0x27, 0xe9, 0x08, 0xea, 0xbe, 0x34, 0x80, 0x8d, 0xa8, 0x88, 0xcb, 0x82, 0x9f, 0x76,
0x47, 0x97, 0xb9, 0x59, 0x77, 0x3e, 0x50, 0x9f, 0x6e, 0xd2, 0x65, 0x78, 0xa3, 0xde, 0x77, 0xd1,
0x1a, 0x20, 0x98, 0x33, 0x0f, 0x0c, 0x52, 0xb7, 0xcb, 0xdc, 0x1c, 0x00, 0xc8, 0xa4, 0xb0, 0x00,
0xa3, 0x7d, 0x57, 0x33, 0x36, 0x0f, 0x19, 0x9e, 0x95, 0x77, 0x7b, 0xec, 0xfc, 0xe7, 0x2d, 0xf2,
0xe5, 0x0f, 0xe0, 0x19, 0xd2, 0x59, 0x1d, 0xe3, 0xc1, 0xc6, 0x5c, 0x47, 0x88, 0x0d, 0x1e, 0x50,
0x81, 0x7b, 0x88, 0x24, 0x08, 0xbe, 0xe1, 0x7f, 0x84, 0x38, 0xc2, 0xa6, 0x8c, 0x55, 0xd2, 0x81,
0xf5, 0xa6, 0xa1, 0x79, 0xd6, 0x00, 0x17, 0xe2, 0x0c, 0x79, 0x40, 0x17, 0xb9, 0x42, 0x53, 0x14,
0x7e, 0xe5, 0xd5, 0x2a, 0x9c, 0x6e, 0x69, 0x78, 0xa2, 0x02, 0x23, 0x1d, 0x08, 0x11, 0xf6, 0x6e,
0xab, 0x21, 0x6b, 0xc2, 0xd6, 0x63, 0x57, 0xa0, 0x0d, 0xb6, 0xcc, 0x02, 0xb6, 0x0a, 0x70, 0x38,
0x87, 0x30, 0xa1, 0x74, 0x50, 0xfe, 0x20, 0x65, 0x22, 0x20, 0x30, 0x1d, 0x79, 0x41, 0x25, 0xe4,
0xee, 0x0f, 0xb7, 0x9c, 0xf9, 0x90, 0x13, 0x3b, 0xb1, 0x1b, 0x83, 0xf8, 0x58, 0xa9, 0xd9, 0xbd,
0x4e, 0x5d, 0x31, 0x66, 0x8f, 0x42, 0x98, 0xa6, 0xae, 0x83, 0xde, 0xdd, 0x81, 0xa0, 0xc6, 0xdd,
0x69, 0x93, 0x88, 0xf4, 0x28, 0xb4, 0xe5, 0x0c, 0x1b, 0xb9, 0xbb, 0xd0, 0x35, 0x15, 0xbd, 0x50,
0xc1, 0x81, 0x3d, 0x37, 0x28, 0xe0, 0x51, 0x13, 0xbd, 0x87, 0xdb, 0xe5, 0x48, 0x15, 0x96, 0x6a,
0xf1, 0x8e, 0xd6, 0x64, 0xdf, 0xc8, 0x32, 0xdd, 0x2d, 0x61, 0xd4, 0x44, 0x85, 0x74, 0x35, 0xa9,
0x5e, 0xc9, 0x2d, 0x82, 0xb3, 0xa7, 0xa7, 0xff, 0x8e, 0xcb, 0xe8, 0x21, 0xc2, 0x41, 0x3d, 0xe4,
0x00, 0xb0, 0x40, 0x9c, 0xa4, 0x37, 0xd2, 0x2e, 0x5a, 0xd9, 0x04, 0x5f, 0x0d, 0x0f, 0x38, 0xa4,
0x83, 0x7c, 0xa7, 0xe8, 0x71, 0x2a, 0x5e, 0x52, 0x69, 0x04, 0xde, 0x25, 0x01, 0xd4, 0x19, 0x84,
0xb6, 0xe0, 0xc9, 0x09, 0x2a, 0xf6, 0xa0, 0x78, 0xf2, 0xe0, 0xb6, 0xb8, 0xb6, 0x47, 0x24, 0x62,
0x88, 0x22, 0x64, 0x82, 0xfa, 0xc6, 0xf0, 0x3c, 0xb6, 0x62, 0x99, 0x09, 0x9b, 0x73, 0x79, 0xf7,
0x49, 0x19, 0xad, 0x0a, 0x60, 0x73, 0x33, 0xa4, 0x48, 0x4d, 0xd4, 0x10, 0xb1, 0x8e, 0xa8, 0x25,
0xcf, 0x5b, 0x9f, 0x85, 0xf2, 0xe1, 0x01, 0xea, 0xf6, 0x92, 0x7f, 0x54, 0x72, 0xd3, 0x25, 0x65,
0x1b, 0x5f, 0x97, 0x03, 0x34, 0xa6, 0xba, 0x61, 0xd1, 0x48, 0x9d, 0x8a, 0xef, 0x28, 0xac, 0x6c,
0x91, 0x17, 0x8b, 0xb6, 0x9b, 0x30, 0x7b, 0x05, 0x4e, 0x80, 0xcd, 0x3e, 0xe0, 0x3b, 0xb2, 0x9a,
0x09, 0x4a, 0x45, 0x6b, 0x74, 0x89, 0x20, 0x29, 0x09, 0x1b, 0x8a, 0xc1, 0x70, 0xf1, 0xa0, 0x84,
0x2e, 0x77, 0xb1, 0x3c, 0xbd, 0x88, 0x5a, 0x2a, 0x73, 0x0e, 0x68, 0xcf, 0x15, 0xca, 0x1b, 0x5d,
0x41, 0xd3, 0xa5, 0xd3, 0x83, 0xd4, 0x05, 0x10, 0x00, 0x60, 0x6d, 0xb4, 0x51, 0x86, 0x86, 0xfc,
0x10, 0x2e, 0xbb, 0x11, 0x10, 0x11, 0x57, 0x14, 0xa3, 0x68, 0x1d, 0xff, 0x01, 0xb0, 0x74, 0x3b,
0x1c, 0xb7, 0x72, 0x5c, 0x21, 0x89, 0x5c, 0xf3, 0x4a, 0xc0, 0xcf, 0xc6, 0xf6, 0x4f, 0x18, 0x0d,
0x28, 0x16, 0x68, 0xba, 0x08, 0x92, 0x7f, 0xa1, 0x79, 0xf3, 0xeb, 0x42, 0x01, 0x48, 0x98, 0xbe,
0xa8, 0xe4, 0x5d, 0x6a, 0x53, 0xfa, 0x74, 0xc4, 0x9a, 0x59, 0x18, 0xaa, 0xb9, 0x45, 0xa3, 0x82,
0x27, 0x2f, 0x4b, 0x10, 0x81, 0xb4, 0x03, 0xa7, 0xe6, 0xa4, 0xba, 0xf3, 0x00, 0xf8, 0xf7, 0x08,
0x20, 0x72, 0x62, 0x2d, 0xa7, 0xb6, 0x83, 0x6a, 0x83, 0xc1, 0x5d, 0x9b, 0x80, 0xc1, 0x03, 0x54,
0x48, 0xbb, 0xa1, 0x0b, 0x5b, 0x1a, 0xde, 0x50, 0x1a, 0x22, 0xfd, 0xda, 0x82, 0xa8, 0xc1, 0x4b,
0x33, 0x41, 0x10, 0x07, 0xea, 0x99, 0xa5, 0x12, 0x8e, 0x9c, 0x10, 0x68, 0xa0, 0xd0, 0x76, 0x13,
0xba, 0x14, 0x3b, 0x7a, 0x09, 0x6f, 0x5a, 0x69, 0x8c, 0x75, 0x22, 0x4d, 0x44, 0x37, 0xb1, 0x3a,
0x23, 0xca, 0x0c, 0xf3, 0x8c, 0xeb, 0x90, 0x15, 0x99, 0x01, 0xc6, 0x27, 0xcc, 0x86, 0x4f, 0x24,
0x0c, 0x59, 0x30, 0x60, 0x77, 0xa4, 0xae, 0xa5, 0xea, 0x2f, 0xf4, 0x80, 0x8b, 0x35, 0x0e, 0xb0,
0xb6, 0x07, 0xe4, 0x49, 0x5e, 0x16, 0x49, 0xe6, 0x63, 0x32, 0x76, 0x23, 0x55, 0x81, 0x27, 0x54,
0x44, 0x58, 0x9d, 0xbb, 0x9f, 0x9a, 0x07, 0x25, 0x86, 0xc0, 0xcb, 0x09, 0x3d, 0x93, 0x62, 0x5d,
0x9d, 0x58, 0xa0, 0x6b, 0x2c, 0x52, 0x76, 0x78, 0xca, 0x1a, 0x6e, 0x2c, 0xf1, 0xc0, 0x61, 0x27,
0x2e, 0x7a, 0x9b, 0xd2, 0x06, 0x46, 0x80, 0x27, 0x49, 0x38, 0xf4, 0x82, 0x17, 0xf1, 0xf0, 0xe0,
0xc0, 0x16, 0x34, 0x53, 0x70, 0x26, 0x10, 0x03, 0xca, 0x01, 0xa1, 0x7a, 0xd1, 0x51, 0x18, 0xee,
0xf2, 0x11, 0xe5, 0x01, 0x23, 0x03, 0x7b, 0xb2, 0x1b, 0x55, 0x7d, 0x88, 0x88, 0xc4, 0xa8, 0x1b,
0x08, 0xfa, 0x24, 0x73, 0x0a, 0x32, 0xa4, 0x81, 0xbc, 0xe6, 0xbe, 0xf5, 0x08, 0xe4, 0x0a, 0x0f,
0x4d, 0x54, 0x41, 0x44, 0xae, 0x47, 0xec, 0x62, 0x58, 0xa8, 0xb7, 0xd8, 0x17, 0xec, 0x32, 0xa9,
0xe7, 0x9d, 0x07, 0xdd, 0x86, 0x3f, 0x41, 0xac, 0x6d, 0x13, 0xda, 0x26, 0xb6, 0x15, 0x91, 0xca,
0x43, 0xa1, 0x6b, 0xe0, 0x05, 0xdc, 0x48, 0x82, 0x54, 0x60, 0x6e, 0x4b, 0xdf, 0x45, 0x14, 0x14,
0xa6, 0xc0, 0x83, 0x20, 0x48, 0xde, 0x82, 0x35, 0xa3, 0xd0, 0x15, 0x68, 0xad, 0x04, 0x92, 0x18,
0xf7, 0x7f, 0xce, 0xcc, 0x01, 0xdc, 0x37, 0x3d, 0x14, 0xfc, 0x35, 0x69, 0x4f, 0xaa, 0x1b, 0x12,
0x44, 0xf5, 0xcf, 0x00, 0x4e, 0x87, 0x4e, 0x57, 0xa2, 0x6c, 0xa7, 0x6d, 0x92, 0x3b, 0x1b, 0xdc,
0xa0, 0xdd, 0xa0, 0x07, 0xa0, 0x07, 0xe4, 0x81, 0xdb, 0x17, 0x5c, 0x32, 0x9c, 0x35, 0x93, 0x20,
0xd1, 0x15, 0xf0, 0x80, 0xa4, 0x02, 0x55, 0x2d, 0x64, 0x20, 0xc4, 0x9b, 0xa5, 0x46, 0xc4, 0xa4,
0x4b, 0x4a, 0x58, 0xf1, 0x81, 0x0b, 0x6d, 0x01, 0xfe, 0x32, 0x8c, 0x07, 0xd2, 0xb8, 0x83, 0x4e,
0xde, 0x9e, 0x3a, 0x72, 0xdd, 0x62, 0x7c, 0x0c, 0xaa, 0x19, 0xce, 0x6f, 0x5e, 0x7a, 0x10, 0xee,
0x83, 0xa9, 0x6b, 0x26, 0x9f, 0x9e, 0x6c, 0xc1, 0x63, 0x40, 0x03, 0x86, 0xcf, 0x02, 0xcd, 0x16,
0x25, 0x16, 0x06, 0xaf, 0x5c, 0x6e, 0xea, 0xc5, 0x68, 0x42, 0xc9, 0xb7, 0x8d, 0x04, 0xd3, 0x64,
0x2e, 0x99, 0x6a, 0xc9, 0xd3, 0x0d, 0xac, 0xc5, 0x66, 0x71, 0xbf, 0x8e, 0x5c, 0xb5, 0xf4, 0x29,
0x22, 0x2e, 0x96, 0x96, 0x02, 0x1e, 0x46, 0x9a, 0x09, 0xed, 0x2a, 0x6c, 0x8d, 0x70, 0x0f, 0xa8,
0x80, 0x78, 0xf5, 0x63, 0x43, 0xb0, 0x2d, 0x21, 0x3d, 0x79, 0x6b, 0xf0, 0x28, 0x14, 0xf8, 0x7b,
0x49, 0x08, 0x8f, 0x59, 0xa8, 0x20, 0xe4, 0x03, 0x1e, 0xac, 0xb1, 0x6e, 0x5e, 0x4a, 0xac, 0x1b,
0x62, 0xa4, 0xb1, 0x5a, 0x81, 0x94, 0xa3, 0x18, 0x08, 0x4d, 0x05, 0x67, 0x2e, 0x31, 0x73, 0xbf,
0xc8, 0x42, 0x8b, 0x3d, 0x64, 0x4d, 0xed, 0x1d, 0x2e, 0x37, 0x93, 0xeb, 0x15, 0x0f, 0xc8, 0x78,
0x49, 0x6e, 0x52, 0x56, 0x94, 0x65, 0x3e, 0xe2, 0x49, 0x34, 0x73, 0xa0, 0x53, 0xe9, 0x05, 0xf4,
0x4a, 0x40, 0x39, 0xc2, 0xb7, 0x2e, 0x91, 0x4d, 0xfa, 0x96, 0x46, 0xc5, 0x05, 0x1a, 0x98, 0x8b,
0xe7, 0xa2, 0xae, 0xa4, 0x5e, 0x87, 0x1e, 0x9c, 0x35, 0x52, 0x06, 0x0b, 0xa4, 0x69, 0x63, 0x87,
0x3c, 0xb3, 0x5a, 0x30, 0x83, 0xaf, 0xaa, 0x7c, 0x30, 0x12, 0x86, 0xa3, 0x1e, 0x29, 0x28, 0x72,
0xe2, 0x34, 0xd0, 0x01, 0x55, 0x67, 0x37, 0xe0, 0x95, 0x66, 0x9a, 0x51, 0x61, 0x84, 0x66, 0x13,
0xc2, 0x15, 0xee, 0x2d, 0x2c, 0x83, 0xca, 0x25, 0x56, 0x88, 0x49, 0xcc, 0x5c, 0x62, 0xb9, 0x67,
0x49, 0xcc, 0x61, 0xa2, 0x9e, 0x15, 0x0f, 0xac, 0xe6, 0x77, 0xa8, 0x64, 0xfe, 0x86, 0x7d, 0x59,
0x24, 0x64, 0xa6, 0x07, 0x6a, 0x69, 0x93, 0x06, 0xfa, 0x08, 0xfa, 0xbc, 0xa5, 0x89, 0x2d, 0x2d,
0x02, 0x90, 0x53, 0xaf, 0xb2, 0x60, 0x2b, 0xce, 0x1d, 0x7b, 0x70, 0xc5, 0xe7, 0xbc, 0x2a, 0xa2,
0xdb, 0x23, 0xcd, 0x70, 0x2c, 0x5e, 0x5e, 0x10, 0xa9, 0xd7, 0x33, 0xe6, 0x1b, 0xa9, 0xdb, 0x69,
0x4f, 0x22, 0x80, 0xcf, 0xc0, 0x88, 0xcd, 0x7d, 0x7d, 0x86, 0xb1, 0x00, 0xa9, 0x95, 0xd1, 0x20,
0xa2, 0x69, 0x5f, 0x21, 0x4e, 0x89, 0x10, 0x57, 0x24, 0x1c, 0xc6, 0x2c, 0x05, 0xf8, 0xa8, 0x6b,
0xb2, 0x54, 0xa5, 0x6e, 0x79, 0x46, 0xc9, 0xb7, 0xe6, 0x30, 0x45, 0xc4, 0xf4, 0x40, 0x0f, 0x5e,
0x88, 0x8d, 0x5d, 0xcf, 0x11, 0x0a, 0xb4, 0x92, 0xc8, 0x56, 0x4c, 0xbf, 0xb2, 0x48, 0x40, 0xe3,
0x6d, 0xae, 0x53, 0x9b, 0x48, 0xf8, 0xc7, 0x88, 0x3a, 0x45, 0xd7, 0x21, 0x09, 0x71, 0xa0, 0x0d,
0x3d, 0x88, 0x40, 0xc4, 0x73, 0x94, 0xaa, 0xe9, 0x5e, 0x2f, 0x10, 0x54, 0x32, 0xac, 0xbb, 0x20,
0x0e, 0x26, 0xd5, 0x84, 0x3b, 0x24, 0x04, 0xa8, 0x09, 0xcc, 0x62, 0x92, 0xcf, 0xe7, 0xcd, 0x13,
0x0f, 0x44, 0x0f, 0x81, 0xb6, 0xf0, 0x37, 0x0a, 0x58, 0xbe, 0x4a, 0x56, 0x2e, 0x00, 0xb5, 0x20,
0xe6, 0xcc, 0x1e, 0x6d, 0x8b, 0x2e, 0x3f, 0xc6, 0x22, 0xfc, 0xf1, 0xd5, 0x23, 0x90, 0x6b, 0x54,
0x1f, 0x24, 0x1f, 0xce, 0xf1, 0xc4, 0xea, 0x8d, 0xcb, 0x40, 0x44, 0x41, 0x1f, 0x14, 0x2a, 0xdc,
0xd1, 0x89, 0x95, 0x97, 0x76, 0x3f, 0x65, 0xd2, 0xc5, 0x6b, 0x64, 0x5e, 0xe3, 0x90, 0x35, 0xcd,
0x0d, 0x72, 0x91, 0x5c, 0xc1, 0x62, 0x81, 0x70, 0x7b, 0x9e, 0x66, 0xf3, 0xa3, 0x95, 0xe2, 0xa5,
0x9e, 0xa4, 0x36, 0xcb, 0xe1, 0xfa, 0x3b, 0x1e, 0x11, 0x77, 0xe9, 0x53, 0xa1, 0x8a, 0x8f, 0x97,
0x18, 0x71, 0x0b, 0x83, 0x9f, 0x7c, 0x30, 0x74, 0x36, 0x44, 0x7e, 0xc7, 0x04, 0x20, 0x27, 0x88,
0x3c, 0x32, 0xc2, 0x05, 0x1c, 0x80, 0x33, 0x48, 0x3b, 0x11, 0x47, 0x64, 0xa0, 0xf8, 0xb6, 0xa5,
0x9e, 0xd1, 0x39, 0xa1, 0xd4, 0xe4, 0x49, 0x0a, 0xd1, 0x0f, 0x01, 0x5c, 0xb9, 0x86, 0x75, 0xa0,
0xb3, 0x79, 0xaf, 0x3a, 0xcb, 0x85, 0x75, 0xcc, 0x0a, 0x19, 0x05, 0x5f, 0x60, 0xc6, 0xb9, 0x51,
0xad, 0x3c, 0x97, 0x47, 0x54, 0xd2, 0xb4, 0x19, 0x9b, 0x83, 0xa0, 0xc9, 0xbc, 0x41, 0x13, 0xc4,
0xc7, 0xe3, 0x5f, 0x3d, 0x8c, 0xa4, 0x86, 0xc1, 0x4e, 0x35, 0x60, 0x1a, 0x48, 0xdf, 0x09, 0x14,
0xb8, 0x18, 0xf9, 0x90, 0x8e, 0x0c, 0x60, 0x0c, 0xb2, 0x7a, 0x04, 0x10, 0xfa, 0xc9, 0x8b, 0x03,
0x0e, 0x7d, 0xb0, 0x60, 0x43, 0x74, 0x68, 0x10, 0x29, 0xdb, 0x84, 0x52, 0xc1, 0x1e, 0x0e, 0x75,
0x57, 0x4e, 0xa6, 0x29, 0x53, 0xd7, 0x32, 0x1f, 0x8d, 0x03, 0xe8, 0x4a, 0xba, 0x24, 0x21, 0xe8,
0x36, 0x39, 0x25, 0x47, 0x19, 0xcb, 0x52, 0x6e, 0x8b, 0xce, 0x40, 0xef, 0x37, 0x99, 0x4a, 0xf0,
0xa5, 0x28, 0x6e, 0x08, 0x0b, 0xd2, 0xda, 0x33, 0x40, 0xd5, 0x0d, 0xe5, 0xd0, 0x13, 0xb2, 0x2f,
0x69, 0xa2, 0xb4, 0x24, 0xee, 0x67, 0x25, 0x18, 0x0b, 0x96, 0x40, 0x27, 0x1c, 0x52, 0x51, 0x36,
0x66, 0x6a, 0x96, 0xab, 0x30, 0x89, 0x67, 0x85, 0x26, 0x1e, 0x89, 0xe9, 0xe3, 0xa3, 0x31, 0x27,
0x20, 0x45, 0x41, 0x62, 0x0d, 0x7c, 0x3d, 0x01, 0x4b, 0x82, 0xfe, 0x89, 0xdb, 0x11, 0x63, 0x49,
0xeb, 0x06, 0x1f, 0xbe, 0xb2, 0x96, 0xc0, 0xc8, 0x47, 0x3b, 0xd8, 0x3f, 0xfe, 0x6e, 0x9e, 0x1f,
0x90, 0x91, 0xf4, 0xe4, 0xa4, 0xbf, 0x0b, 0x21, 0x3d, 0x59, 0x08, 0x92, 0x88, 0xf8, 0x82, 0xb0,
0x61, 0x7b, 0x3b, 0x1f, 0x96, 0xed, 0x1e, 0x9f, 0x96, 0x51, 0xb9, 0x84, 0x1d, 0xb3, 0x9b, 0x4f,
0xb1, 0xf8, 0x82, 0x14, 0x91, 0x0e, 0x86, 0x7e, 0xb3, 0xf0, 0xfd, 0x8c, 0xe7, 0x16, 0x14, 0x08,
0xe8, 0x08, 0xaf, 0x87, 0xdc, 0x61, 0x81, 0xc5, 0x72, 0xa8, 0x3a, 0x0d, 0xe8, 0x34, 0x6b, 0x43,
0x19, 0x6c, 0x7e, 0xe2, 0x7d, 0x28, 0xee, 0x49, 0x93, 0x20, 0x7f, 0x65, 0xda, 0xd1, 0x72, 0xb8,
0xa3, 0x75, 0xbc, 0x07, 0x0b, 0x91, 0xb5, 0xb4, 0x33, 0xe8, 0x4c, 0x03, 0x35, 0x42, 0xa5, 0x77,
0x47, 0x3f, 0x3b, 0xf4, 0xc4, 0xb1, 0xdf, 0x2c, 0x4d, 0x09, 0xe0, 0x10, 0x01, 0xa7, 0x98, 0x04,
0x26, 0x13, 0x0d, 0xb2, 0x20, 0xde, 0xe3, 0x51, 0x6c, 0x68, 0x4d, 0x99, 0xc1, 0x98, 0x41, 0xaa,
0x5c, 0x70, 0x99, 0x65, 0x00, 0x01, 0x19, 0x79, 0x86, 0xf1, 0xd1, 0x74, 0x0e, 0x17, 0x65, 0x87,
0x4b, 0x28, 0x39, 0xe1, 0x7b, 0x69, 0xa1, 0x5d, 0xb1, 0x02, 0x05, 0x93, 0x19, 0x68, 0x1c, 0x79,
0xd3, 0x71, 0x90, 0x40, 0x14, 0x40, 0x8d, 0x20, 0x01, 0x4d, 0x91, 0xc4, 0xa0, 0x53, 0x4a, 0xf1,
0xa9, 0xd0, 0x04, 0x0b, 0xf6, 0x65, 0x55, 0x2e, 0x2f, 0x57, 0x03, 0xfa, 0x04, 0x16, 0x89, 0x65,
0xe0, 0xc1, 0xb0, 0x1a, 0x43, 0x5a, 0x60, 0x67, 0xe0, 0xdb, 0x50, 0x85, 0xd4, 0xdd, 0x80, 0x50,
0x84, 0x1a, 0x58, 0x35, 0x52, 0x2b, 0x98, 0xc3, 0x9c, 0x73, 0x3d, 0x6c, 0x00, 0xcf, 0x2e, 0x64,
0x26, 0x2e, 0xc3, 0x6d, 0x59, 0x56, 0x24, 0x0d, 0x6f, 0x5d, 0xfc, 0xb5, 0x47, 0x85, 0x0b, 0xbd,
0x55, 0x9b, 0x18, 0x19, 0x95, 0x21, 0x33, 0x02, 0x5e, 0xc0, 0xfb, 0x18, 0x06, 0x68, 0x67, 0x6d,
0x3a, 0xfc, 0x4e, 0x36, 0x95, 0x21, 0x44, 0x37, 0xb1, 0x68, 0x5e, 0x76, 0xf0, 0xa0, 0xf7, 0x79,
0x12, 0x0d, 0xfa, 0x92, 0xde, 0x90, 0x6a, 0xf5, 0xcd, 0xf5, 0x1d, 0x4d, 0x95, 0xf6, 0xae, 0x12,
0x84, 0x78, 0x21, 0x02, 0xde, 0x61, 0xac, 0x0e, 0xbf, 0x80, 0xae, 0xe0, 0x05, 0x76, 0x20, 0x27,
0x69, 0x2f, 0xee, 0x36, 0x21, 0x84, 0x66, 0x65, 0xfa, 0x29, 0x6a, 0x1c, 0x33, 0xa8, 0x4a, 0x7c,
0x70, 0xec, 0xa0, 0x1f, 0x74, 0xe4, 0x50, 0x0e, 0x13, 0x91, 0xc2, 0x3b, 0xda, 0x83, 0x6b, 0x6e,
0x34, 0x22, 0x61, 0xb9, 0xa3, 0xdf, 0x8a, 0x83, 0xa1, 0xc6, 0xae, 0xc4, 0x44, 0xcc, 0x10, 0xf9,
0x89, 0x81, 0x41, 0x60, 0xce, 0x4c, 0x11, 0x60, 0x76, 0x11, 0x36, 0xc4, 0x69, 0xa6, 0xb3, 0x9d,
0x39, 0xc2, 0x37, 0x94, 0x18, 0x1f, 0x14, 0x19, 0x60, 0xef, 0x71, 0x38, 0x1d, 0x6b, 0x45, 0xf7,
0x01, 0x6f, 0x83, 0xee, 0xd0, 0xc8, 0xc6, 0xf6, 0x53, 0x44, 0xac, 0xac, 0x77, 0x49, 0x2c, 0x15,
0x38, 0x21, 0x48, 0x55, 0xe3, 0xec, 0x36, 0xda, 0x91, 0x47, 0xe3, 0x36, 0x60, 0x36, 0xaa, 0x7b,
0x69, 0xf8, 0x51, 0x2f, 0xad, 0x1e, 0xcc, 0x47, 0x58, 0x24, 0xeb, 0xdc, 0x01, 0x19, 0x55, 0x89,
0xe6, 0x39, 0x16, 0xfe, 0x44, 0x21, 0x74, 0xdf, 0x60, 0x0f, 0x8c, 0x19, 0x0a, 0xad, 0x9e, 0x3b,
0x65, 0x46, 0xab, 0x02, 0x23, 0x54, 0x34, 0x8e, 0x3a, 0x35, 0x64, 0x8c, 0xe6, 0xd9, 0xee, 0x78,
0x6c, 0x41, 0xc7, 0x10, 0xdc, 0xaa, 0x0d, 0x68, 0x3e, 0x5a, 0x38, 0x1d, 0x56, 0x0b, 0x81, 0x35,
0xa4, 0x41, 0xca, 0x11, 0x40, 0x02, 0xb2, 0xc9, 0x87, 0x4c, 0x78, 0xb1, 0x6e, 0x53, 0x90, 0xe8,
0xc2, 0x9d, 0xb1, 0x20, 0x4d, 0x3a, 0xa3, 0xc8, 0x6f, 0x05, 0x10, 0x23, 0x2b, 0x4e, 0x7b, 0xd3,
0x67, 0x28, 0xeb, 0x2d, 0xb2, 0x1e, 0x05, 0x78, 0xa7, 0xb0, 0x88, 0x10, 0x28, 0xb0, 0xb5, 0x2f,
0x54, 0x02, 0xb8, 0x41, 0xe0, 0x29, 0x91, 0x64, 0x86, 0x94, 0x95, 0xed, 0x17, 0xa4, 0x79, 0xd8,
0x1d, 0x7e, 0x65, 0xc2, 0xfb, 0xfd, 0x80, 0x37, 0x3f, 0x03, 0x5e, 0xf3, 0x65, 0xc2, 0xfb, 0xcc,
0x77, 0xd5, 0x4f, 0x35, 0x6b, 0xaa, 0x1b, 0xa1, 0xfc, 0x1e, 0x91, 0x84, 0x20, 0x6c, 0xa2, 0x0b,
0x25, 0x41, 0xe4, 0x59, 0x9e, 0xf9, 0x6e, 0x3d, 0x6a, 0xf1, 0xad, 0x19, 0xaf, 0xd1, 0x90, 0x77,
0x4d, 0xc8, 0x83, 0x57, 0x03, 0x92, 0x63, 0x62, 0x52, 0x81, 0xfb, 0x67, 0xc8, 0x5b, 0xf7, 0x78,
0xd6, 0x81, 0xa6, 0x44, 0x3a, 0xaa, 0x74, 0x91, 0xac, 0x85, 0xbc, 0x6d, 0xd0, 0x61, 0x1f, 0x0c,
0x19, 0x20, 0x52, 0x08, 0xce, 0x31, 0x08, 0x18, 0x4c, 0x21, 0xb6, 0x10, 0x19, 0x45, 0x3f, 0x44,
0xd4, 0x65, 0x5d, 0xf8, 0xa7, 0xee, 0x57, 0xbd, 0x6a, 0x61, 0xdc, 0xa9, 0x02, 0xba, 0x39, 0xe2,
0x02, 0xdc, 0x38, 0xa2, 0xf0, 0x78, 0xc7, 0x9b, 0x54, 0x44, 0x92, 0x7d, 0x41, 0xc0, 0xc7, 0x69,
0x96, 0xa5, 0xcd, 0xa0, 0xbb, 0x1a, 0x63, 0xd7, 0x7e, 0x5c, 0x86, 0x53, 0xd2, 0x94, 0x0d, 0x28,
0xd0, 0x8c, 0x8c, 0x68, 0xe4, 0x8d, 0x69, 0x2a, 0x60, 0xc1, 0x0a, 0x18, 0x34, 0x5a, 0x46, 0xfc,
0xe6, 0xe2, 0xe4, 0x74, 0xb6, 0x06, 0xa7, 0xd6, 0x36, 0x67, 0xc6, 0x6b, 0x6e, 0xd5, 0xd1, 0x44,
0xb6, 0xbe, 0x90, 0x93, 0x32, 0xaa, 0x67, 0x96, 0xb3, 0xec, 0x6d, 0xc8, 0x3c, 0x71, 0x55, 0xdd,
0xa2, 0x1c, 0xd0, 0x28, 0xd3, 0x7b, 0x44, 0x0b, 0x12, 0x44, 0xde, 0x80, 0xe5, 0xac, 0x67, 0x20,
0x64, 0x58, 0xfb, 0x96, 0x56, 0x67, 0x81, 0x28, 0x03, 0xe8, 0x34, 0x0b, 0x3f, 0x34, 0x8c, 0xc6,
0x89, 0xdb, 0x9b, 0x09, 0x60, 0xe2, 0x0c, 0xa9, 0x81, 0xc3, 0xab, 0x24, 0x13, 0xaa, 0xf6, 0x7a,
0xb1, 0x37, 0xbc, 0x19, 0x15, 0x6f, 0x17, 0x76, 0xf3, 0x18, 0x44, 0x21, 0x28, 0xd7, 0xb4, 0x73,
0xe2, 0x90, 0xb4, 0x9a, 0x80, 0xcb, 0xb3, 0xa1, 0xf2, 0x69, 0xa8, 0x0e, 0x86, 0x80, 0x2c, 0x54,
0x18, 0x85, 0x41, 0x48, 0xdb, 0x14, 0xde, 0x58, 0x64, 0x0d, 0xc4, 0xe0, 0xbd, 0xc5, 0x68, 0xe2,
0xce, 0x51, 0xe5, 0x9a, 0xb0, 0x17, 0x80, 0x04, 0x2f, 0xa0, 0xa1, 0xf1, 0xb2, 0x5f, 0x77, 0x0d,
0x8e, 0x63, 0xb1, 0xb5, 0x28, 0x4b, 0x08, 0x8b, 0x23, 0x1b, 0x8e, 0xce, 0xb5, 0x53, 0x43, 0xd4,
0x86, 0xf4, 0x62, 0x89, 0xd5, 0x43, 0x10, 0xbb, 0x99, 0x25, 0x60, 0xdd, 0x96, 0x07, 0xac, 0xe2,
0x53, 0x52, 0x4f, 0xb9, 0x52, 0xd6, 0x17, 0xf6, 0xd0, 0x38, 0x74, 0x95, 0x76, 0xc6, 0x11, 0xfd,
0x22, 0xc8, 0x8d, 0x07, 0x9b, 0x36, 0x68, 0x6b, 0x15, 0xad, 0xad, 0x20, 0x60, 0xac, 0xe8, 0x0c,
0xdf, 0x4c, 0x63, 0x19, 0x8b, 0x35, 0x3b, 0x2c, 0x15, 0x0f, 0xa0, 0x4d, 0x52, 0xa0, 0x9b, 0x2b,
0xc8, 0x16, 0x50, 0x53, 0xd1, 0x32, 0x47, 0xde, 0xa9, 0x79, 0x6a, 0x0c, 0x90, 0x97, 0xf4, 0x8f,
0xe2, 0xdd, 0x29, 0x0b, 0x08, 0x4d, 0xa0, 0xa1, 0xa9, 0xc3, 0x66, 0x8e, 0xb6, 0x07, 0xa4, 0x74,
0x3c, 0xe6, 0x69, 0xcb, 0xc1, 0xc3, 0x25, 0x94, 0x93, 0x04, 0x02, 0xf2, 0x40, 0x39, 0x21, 0xb1,
0x53, 0x15, 0x70, 0xc4, 0xd0, 0x94, 0x07, 0x54, 0x4b, 0xad, 0x20, 0x1f, 0x63, 0xa3, 0x93, 0xc1,
0x4d, 0x4a, 0xf5, 0xea, 0xec, 0xa4, 0x9d, 0x81, 0x3d, 0x25, 0x79, 0xc2, 0xd4, 0xb6, 0x4c, 0x4e,
0x0d, 0xfb, 0x77, 0x07, 0x3b, 0xf5, 0x22, 0x33, 0x86, 0x91, 0xb4, 0xbd, 0x88, 0x37, 0xd7, 0xf2,
0x51, 0x27, 0x3f, 0x32, 0xed, 0x82, 0xcf, 0x92, 0xb6, 0x1e, 0x48, 0x04, 0xbc, 0x3d, 0x56, 0x82,
0xc6, 0xf3, 0x71, 0x23, 0x20, 0x36, 0x41, 0x81, 0x09, 0xbf, 0x70, 0xbf, 0x44, 0x39, 0x60, 0x35,
0x10, 0x33, 0x57, 0x01, 0x5d, 0x50, 0xe4, 0x95, 0xa8, 0x60, 0xa3, 0x49, 0x78, 0x47, 0x3a, 0x05,
0xed, 0x9d, 0xe5, 0x80, 0x3a, 0xe3, 0xd9, 0x40, 0x78, 0x70, 0x5f, 0xd2, 0x27, 0x6c, 0x8d, 0x30,
0xf1, 0xc1, 0xd0, 0x43, 0x38, 0x68, 0x02, 0x52, 0x40, 0x5c, 0xa8, 0x90, 0x52, 0x90, 0xcc, 0x05,
0x63, 0xa3, 0x88, 0x75, 0x14, 0x1b, 0x9a, 0xa3, 0x40, 0xb9, 0xe4, 0x91, 0x6a, 0x44, 0x73, 0x6a,
0x12, 0x8b, 0xa3, 0x25, 0x6b, 0x28, 0xb0, 0x6f, 0x23, 0x7a, 0xd8, 0x07, 0x4e, 0xa5, 0x0c, 0xe2,
0xc6, 0x78, 0xc5, 0x34, 0x91, 0x54, 0x70, 0x3a, 0x66, 0x90, 0xfe, 0xc3, 0x6d, 0x1b, 0x39, 0xd8,
0x41, 0xe3, 0x16, 0x5f, 0x55, 0x2b, 0xac, 0x47, 0xbb, 0xed, 0xca, 0xac, 0x8e, 0x5a, 0x10, 0x73,
0x81, 0x19, 0x9d, 0xe7, 0x71, 0xf0, 0x91, 0x6b, 0x61, 0x36, 0x28, 0x0d, 0xd0, 0x91, 0x16, 0x5b,
0xc8, 0x5d, 0x8a, 0xaa, 0x43, 0x44, 0x46, 0xd3, 0x7f, 0xc9, 0xf1, 0xa5, 0x21, 0x54, 0x15, 0x29,
0xdf, 0xd9, 0xa6, 0x46, 0xbc, 0x6f, 0x55, 0xd3, 0x66, 0xfd, 0x50, 0xa5, 0xb2, 0xc0, 0x9a, 0x4e,
0xe2, 0x68, 0x03, 0x71, 0x2b, 0x07, 0x0d, 0x15, 0x72, 0x8e, 0x07, 0x07, 0xf9, 0x0c, 0x08, 0xa8,
0x78, 0x69, 0x52, 0xb0, 0xa1, 0xe2, 0xfc, 0x00, 0xd6, 0x33, 0x50, 0xf7, 0x28, 0x38, 0x16, 0x0b,
0x13, 0x77, 0x0d, 0x25, 0xb4, 0xdd, 0x46, 0x3b, 0x42, 0x35, 0x65, 0x21, 0x33, 0x9a, 0x05, 0xf4,
0xd0, 0xd9, 0xf8, 0x4d, 0x17, 0x0d, 0x90, 0xa6, 0x99, 0x55, 0x20, 0x48, 0xd0, 0x29, 0x4c, 0xc4,
0x8f, 0xb0, 0x19, 0xbd, 0x91, 0xc7, 0x82, 0x6e, 0x2a, 0x64, 0x47, 0x1e, 0xf5, 0xbc, 0x83, 0xd5,
0x9c, 0x82, 0xfd, 0x5c, 0xa4, 0x39, 0x4a, 0x25, 0x67, 0x0b, 0xe3, 0x23, 0xed, 0x68, 0x15, 0x34,
0xe4, 0x33, 0xb9, 0x78, 0x2d, 0xcc, 0x02, 0x47, 0x97, 0x97, 0x31, 0x6c, 0xf4, 0x35, 0x1d, 0x3a,
0x34, 0xc2, 0xca, 0x2d, 0x59, 0x98, 0x14, 0xcb, 0x3b, 0xbb, 0xc6, 0x76, 0x51, 0xc3, 0x04, 0x2e,
0x47, 0xd2, 0xc3, 0x49, 0x65, 0xba, 0x63, 0x60, 0x42, 0x70, 0xce, 0xf9, 0x13, 0x71, 0xf3, 0xd4,
0x66, 0x00, 0xfd, 0xc9, 0x03, 0x34, 0x3e, 0xb4, 0x87, 0xa8, 0x96, 0x47, 0x9e, 0x0c, 0x62, 0xc4,
0xa2, 0x56, 0xaf, 0xae, 0x90, 0x94, 0xa9, 0x53, 0x37, 0xed, 0x13, 0x2b, 0x18, 0xfd, 0x30, 0xe6,
0xa2, 0x2d, 0x40, 0xe2, 0xa2, 0xd9, 0x1a, 0x54, 0x10, 0xb2, 0x26, 0x07, 0x24, 0x71, 0x80, 0x8c,
0xb5, 0x52, 0x1d, 0x36, 0xc3, 0x06, 0xea, 0x1d, 0x54, 0xfd, 0xe8, 0x08, 0x03, 0x04, 0x2f, 0xd5,
0x1b, 0xb8, 0x5d, 0x24, 0x95, 0x16, 0x16, 0xa1, 0x6a, 0xf1, 0x15, 0x51, 0xf6, 0xbc, 0x4d, 0xb0,
0x70, 0x0f, 0xf0, 0xd6, 0x6f, 0x0a, 0x1d, 0xef, 0x88, 0x40, 0x21, 0x97, 0x90, 0xd5, 0x8a, 0xc0,
0x44, 0x04, 0x81, 0xf1, 0x2d, 0x10, 0x79, 0x69, 0x91, 0x90, 0xb7, 0x1e, 0x2e, 0x82, 0x52, 0xeb,
0x98, 0x63, 0xcd, 0xc4, 0x96, 0xdc, 0x5a, 0xa6, 0x43, 0x29, 0x13, 0xfc, 0x90, 0x6a, 0xb9, 0x68,
0xb7, 0x26, 0x83, 0x92, 0x91, 0x7c, 0x43, 0x7c, 0x47, 0xe9, 0xa0, 0xe5, 0xb4, 0xf9, 0x34, 0x34,
0x76, 0x1b, 0xd8, 0xad, 0xa5, 0x49, 0x1c, 0xb9, 0x82, 0x14, 0x0c, 0x0d, 0xf1, 0x65, 0x7b, 0x07,
0x9a, 0xc7, 0xd5, 0x75, 0xac, 0x7b, 0xd7, 0xc4, 0x09, 0xc1, 0xd6, 0x80, 0x8b, 0x06, 0x2e, 0x88,
0x92, 0xba, 0x86, 0x34, 0x74, 0xc8, 0x48, 0xc2, 0x30, 0xc2, 0x4e, 0x0b, 0x21, 0x81, 0xb1, 0xa2,
0x48, 0x2e, 0x6d, 0x12, 0x03, 0x7f, 0x8b, 0x80, 0xe6, 0xf6, 0xe2, 0x02, 0x74, 0x3a, 0xa0, 0xf0,
0xaa, 0xc3, 0x8f, 0xef, 0xa0, 0x32, 0xb6, 0xaf, 0x6a, 0x62, 0x8c, 0x10, 0x5e, 0xac, 0xd0, 0x7b,
0x1a, 0xcd, 0x3b, 0x6f, 0x14, 0xac, 0x8d, 0x38, 0x42, 0xbc, 0x50, 0x34, 0xd4, 0x1b, 0x3a, 0x54,
0xcf, 0x17, 0x72, 0xc8, 0x78, 0xdb, 0x7e, 0xc7, 0xef, 0x48, 0x46, 0x3a, 0x18, 0x42, 0x9c, 0x4e,
0x3b, 0x9f, 0xda, 0x91, 0x79, 0xcb, 0xee, 0xa5, 0xab, 0x08, 0x85, 0x89, 0x53, 0xe3, 0x72, 0x6d,
0x2e, 0x23, 0x74, 0x66, 0x03, 0x0a, 0xc1, 0x7d, 0xcc, 0xdf, 0xca, 0x03, 0xc3, 0x10, 0x10, 0x60,
0x78, 0xe5, 0x89, 0x28, 0x2d, 0xa2, 0x08, 0x68, 0x4c, 0xfa, 0xb6, 0xc0, 0x12, 0xe9, 0x6e, 0xc7,
0x6c, 0xb4, 0x28, 0x31, 0x3f, 0xcd, 0x04, 0x7f, 0x1e, 0xec, 0xe4, 0xa9, 0x4e, 0x99, 0x20, 0x3b,
0xfc, 0x90, 0x58, 0xc1, 0x00, 0x06, 0xb5, 0x2f, 0x8b, 0x60, 0x44, 0xca, 0x2e, 0x31, 0xb0, 0xe6,
0x51, 0x62, 0x6c, 0xaa, 0x72, 0xaa, 0xd8, 0x1a, 0xfd, 0xa8, 0x8d, 0xb1, 0x4a, 0x72, 0x8d, 0xd7,
0x99, 0x96, 0x74, 0xe5, 0x54, 0xa3, 0xd7, 0xd1, 0xad, 0x77, 0x72, 0x80, 0x3c, 0x4c, 0x8f, 0x1d,
0x44, 0x7d, 0xc1, 0xdf, 0x98, 0xe2, 0xca, 0xef, 0xa3, 0x0e, 0xe0, 0x80, 0xdf, 0xf1, 0x4a, 0xf2,
0x8c, 0x54, 0x9e, 0xc2, 0xcf, 0xd4, 0x91, 0x35, 0x5d, 0x2e, 0xa4, 0x47, 0x5f, 0xf9, 0xe8, 0x83,
0xa2, 0x8d, 0x78, 0x18, 0x32, 0xb9, 0x60, 0x07, 0x4d, 0xdb, 0xce, 0x82, 0x9e, 0xa5, 0xdd, 0x50,
0x8c, 0x2e, 0x13, 0x65, 0xa0, 0x16, 0x6f, 0x4b, 0x6d, 0xfa, 0xf2, 0x9a, 0x49, 0x4c, 0xcd, 0x46,
0x7e, 0x9c, 0x39, 0xc0, 0xa7, 0x43, 0x63, 0xa8, 0x16, 0x0e, 0xb8, 0x0b, 0x6b, 0x8a, 0x69, 0x59,
0x1b, 0xac, 0x81, 0x6c, 0xd0, 0x30, 0x88, 0x90, 0xc2, 0x2d, 0x28, 0x06, 0x6e, 0xa1, 0x91, 0x92,
0xd2, 0x68, 0x90, 0x22, 0xb2, 0xed, 0x94, 0xb3, 0xbb, 0x3b, 0xb8, 0x8e, 0xb7, 0xf3, 0xe2, 0x7e,
0x44, 0x42, 0x01, 0xbf, 0xb4, 0xdb, 0xd3, 0x44, 0x95, 0x1a, 0x8e, 0x10, 0x45, 0x04, 0x13, 0x72,
0x8e, 0x52, 0xe5, 0x1a, 0x2c, 0x2d, 0x39, 0xa6, 0x64, 0x69, 0x75, 0x53, 0x34, 0x6e, 0xd8, 0x6b,
0x69, 0x3f, 0x81, 0x02, 0x47, 0x35, 0x4a, 0xaa, 0x94, 0x49, 0x20, 0x88, 0xeb, 0xd1, 0xa0, 0xcd,
0x11, 0x6d, 0x89, 0x9c, 0xc6, 0x25, 0x0d, 0xd1, 0x4c, 0x05, 0x4c, 0x57, 0xd7, 0x1b, 0xdd, 0xd1,
0x8e, 0x3a, 0xa3, 0xf5, 0x07, 0x53, 0x15, 0xec, 0x24, 0x5c, 0xcd, 0x52, 0x42, 0x02, 0x04, 0xd1,
0xff, 0x27, 0xaa, 0x9d, 0x91, 0xcb, 0x33, 0x39, 0x5d, 0x00, 0x9c, 0x44, 0xa4, 0xd6, 0x33, 0x8d,
0xdd, 0x21, 0x18, 0xaf, 0xf1, 0x37, 0x3d, 0x8d, 0x05, 0x99, 0x3a, 0x27, 0x96, 0xd4, 0x79, 0x70,
0x2e, 0x55, 0x45, 0xcf, 0x27, 0xcd, 0xc8, 0xe8, 0xdf, 0x85, 0x89, 0x4a, 0x90, 0x42, 0xc2, 0x8b,
0xda, 0xa2, 0x4c, 0xc0, 0x29, 0x15, 0xba, 0x0b, 0x30, 0x12, 0x40, 0x97, 0xa5, 0xd8, 0xb0, 0xc7,
0x64, 0x97, 0x27, 0x51, 0x8f, 0x00, 0x15, 0x9b, 0x14, 0x4b, 0xa7, 0x67, 0xed, 0x4d, 0x15, 0x9b,
0xbd, 0xb0, 0x1d, 0x73, 0x70, 0x86, 0x4e, 0x47, 0x21, 0xc3, 0xb6, 0x3f, 0x84, 0x8c, 0xec, 0x23,
0x91, 0xd2, 0xd3, 0x51, 0x0e, 0xe5, 0x0f, 0xce, 0x23, 0xab, 0x31, 0x5f, 0x04, 0x27, 0x22, 0xda,
0x11, 0x47, 0x9e, 0x57, 0x65, 0xc0, 0xc3, 0x0e, 0x74, 0x06, 0xfd, 0x73, 0xc7, 0xf5, 0xf4, 0x4f,
0xc0, 0x20, 0x94, 0xd2, 0x11, 0xeb, 0xda, 0xa6, 0x82, 0x9c, 0xb5, 0xad, 0x49, 0xbf, 0x35, 0xe8,
0xca, 0x78, 0x8f, 0x7d, 0x7a, 0xed, 0x4e, 0xc1, 0xd3, 0x3a, 0x42, 0x40, 0xf0, 0xb5, 0x2b, 0x65,
0x35, 0x49, 0x5e, 0x1a, 0x2a, 0x34, 0x8b, 0x6b, 0xc2, 0x8c, 0x7a, 0x09, 0xbb, 0xe8, 0xae, 0xed,
0x6f, 0xdb, 0x75, 0x95, 0x1d, 0xaa, 0xfb, 0x6e, 0x4f, 0x99, 0x1f, 0xf7, 0xa7, 0x06, 0x11, 0x2c,
0xf7, 0x38, 0xc9, 0x5d, 0x75, 0xe4, 0x25, 0x97, 0xea, 0x21, 0xc8, 0x70, 0xf7, 0xab, 0x41, 0x5e,
0xcc, 0x31, 0x32, 0x4b, 0x3b, 0xc7, 0x1a, 0x35, 0xca, 0xe9, 0x18, 0xed, 0xc4, 0xc2, 0xeb, 0x0e,
0x97, 0x17, 0x51, 0xd4, 0x1d, 0x9d, 0xdc, 0x11, 0x23, 0xd0, 0x1a, 0xa5, 0x42, 0x8c, 0x32, 0xba,
0x9c, 0x22, 0x68, 0xfb, 0x0a, 0x55, 0x3a, 0x86, 0x56, 0x6d, 0x59, 0x27, 0x1e, 0xd6, 0xaa, 0x64,
0xca, 0xb5, 0x48, 0xfd, 0xf8, 0x61, 0x74, 0x68, 0x24, 0x17, 0xc4, 0x50, 0xe1, 0xa9, 0x97, 0x7f,
0x36, 0x54, 0x21, 0x48, 0x88, 0x0c, 0x66, 0xca, 0xf7, 0xe0, 0x46, 0x44, 0xf2, 0x0d, 0x80, 0xbb,
0x54, 0x50, 0xce, 0xeb, 0x7d, 0x78, 0x4f, 0x9d, 0x9c, 0x58, 0x23, 0x6a, 0xa4, 0xc5, 0x67, 0x32,
0x9d, 0x66, 0xc4, 0x87, 0x43, 0xf9, 0x2d, 0x68, 0x87, 0x5d, 0xde, 0xd5, 0x3a, 0xdd, 0xdc, 0x25,
0x19, 0x59, 0x87, 0x86, 0x3c, 0x68, 0x02, 0xdc, 0x74, 0x44, 0x10, 0x89, 0x51, 0x24, 0xc9, 0x91,
0xf4, 0xa8, 0xc9, 0x01, 0x61, 0x53, 0xd6, 0x25, 0xb9, 0x66, 0xa6, 0xdc, 0x6b, 0x72, 0x16, 0x15,
0x13, 0xb5, 0x67, 0x55, 0xa5, 0xfd, 0xa5, 0xae, 0x51, 0xf1, 0x8d, 0x3a, 0xd1, 0x8c, 0x03, 0xbd,
0xed, 0xbc, 0x86, 0xc5, 0x1a, 0xb6, 0x92, 0xf9, 0xe0, 0x57, 0x70, 0x85, 0x9e, 0x24, 0x4f, 0xc8,
0x66, 0x8d, 0xa0, 0x92, 0xc9, 0xc0, 0x51, 0x15, 0xcd, 0xf8, 0x4f, 0x5b, 0x51, 0x55, 0x96, 0xc4,
0xe3, 0xff, 0xc4, 0xf6, 0xfb, 0xb5, 0x0d, 0x98, 0x73, 0xfe, 0x0a, 0xbe, 0x3e, 0x10, 0x02, 0xdf,
0xd0, 0x47, 0xa1, 0xc2, 0x6b, 0xac, 0x1e, 0x35, 0x1c, 0x24, 0x7c, 0x35, 0x68, 0xbc, 0xe7, 0x13,
0x6c, 0x2b, 0xb8, 0x34, 0x1a, 0x5f, 0x4e, 0xb5, 0xe8, 0x80, 0x0d, 0xb9, 0xd5, 0xb1, 0x9b, 0x62,
0x51, 0xad, 0x15, 0x8e, 0xb3, 0xe0, 0x94, 0x4e, 0xb6, 0x20, 0xda, 0xa9, 0x6c, 0xbf, 0xce, 0x14,
0x31, 0xd2, 0xfd, 0x6a, 0xa4, 0x21, 0x6f, 0x12, 0x35, 0x75, 0xe1, 0xfa, 0xbb, 0x8b, 0x1c, 0x2a,
0xc2, 0x46, 0x1d, 0xcf, 0x9d, 0xea, 0xd0, 0x88, 0xa8, 0xf5, 0xa8, 0x21, 0x7c, 0x5e, 0x28, 0x7c,
0xca, 0xd9, 0x6f, 0x1b, 0x5b, 0x31, 0xd4, 0x61, 0xd7, 0xb1, 0x1d, 0x8a, 0x50, 0xce, 0x79, 0x59,
0x34, 0x0b, 0xbe, 0xb5, 0xbb, 0xdc, 0xe1, 0x4e, 0x3f, 0x3b, 0x6b, 0x45, 0x12, 0x21, 0x3e, 0x01,
0x6c, 0xac, 0x95, 0x54, 0xfa, 0x49, 0xe4, 0xa1, 0x0f, 0x50, 0xaf, 0x42, 0x41, 0x9a, 0x94, 0x03,
0x23, 0xf4, 0x27, 0x5c, 0x8c, 0xdd, 0x21, 0x9c, 0xc3, 0xf5, 0xb2, 0x26, 0x5c, 0xcd, 0x5d, 0xa0,
0x79, 0xdc, 0x84, 0x6d, 0x01, 0xdc, 0x94, 0xf1, 0x90, 0x2e, 0x84, 0x10, 0xe8, 0x4c, 0xae, 0xa7,
0xdd, 0x37, 0xa6, 0x9d, 0x07, 0xa1, 0x74, 0x77, 0xd6, 0xda, 0x0c, 0x9d, 0x52, 0x55, 0x18, 0x14,
0x8f, 0x26, 0xad, 0x35, 0xfb, 0x90, 0x75, 0xa6, 0x09, 0xe1, 0xfb, 0x0c, 0xb3, 0x91, 0x30, 0x58,
0xc5, 0xaf, 0x04, 0xf7, 0x41, 0x74, 0x95, 0x1e, 0xc6, 0xb7, 0x2e, 0xa3, 0x89, 0x05, 0xf0, 0xc4,
0x53, 0x81, 0xcc, 0x70, 0x73, 0x43, 0x4d, 0x65, 0x72, 0x1c, 0xbd, 0xc6, 0x0e, 0x79, 0x14, 0xba,
0x37, 0xbd, 0xb6, 0x01, 0x29, 0x10, 0x1d, 0xbb, 0x8a, 0x3a, 0x23, 0xe5, 0x9e, 0x7d, 0xc0, 0x79,
0x32, 0x0a, 0x7d, 0x84, 0x6a, 0x62, 0x6b, 0x9a, 0x7a, 0xa9, 0x04, 0xa3, 0x43, 0x48, 0xc9, 0xde,
0x5e, 0x38, 0xaf, 0xc4, 0x29, 0xe8, 0x5c, 0x95, 0x47, 0x9a, 0x3a, 0x6d, 0x08, 0x68, 0x68, 0x8b,
0x8c, 0xdb, 0x09, 0x91, 0x8a, 0x0a, 0x49, 0x78, 0xae, 0xa2, 0xd2, 0xa1, 0x74, 0xa7, 0x33, 0x52,
0xb3, 0x00, 0x34, 0xd1, 0x9c, 0xda, 0x82, 0xad, 0x3a, 0x72, 0x05, 0x31, 0x6a, 0x30, 0x42, 0xeb,
0x7b, 0x8a, 0x1d, 0x20, 0x98, 0x81, 0x10, 0x5b, 0x88, 0x0a, 0x21, 0x0a, 0x91, 0xe1, 0x3f, 0x5b,
0x85, 0x51, 0x43, 0xe8, 0x55, 0x8a, 0x95, 0x16, 0xca, 0x86, 0x35, 0x82, 0x68, 0x9b, 0xb2, 0xe2,
0xad, 0xd1, 0x08, 0xc8, 0x27, 0x6a, 0x8c, 0x57, 0x1c, 0x7c, 0x8c, 0xf6, 0xfc, 0x80, 0xfc, 0x95,
0xd2, 0xd9, 0x34, 0x89, 0x3d, 0xda, 0xac, 0xc6, 0x68, 0x74, 0xc1, 0x89, 0xd8, 0x16, 0xa6, 0xc4,
0x2b, 0x47, 0xd4, 0x90, 0xa1, 0xf7, 0xa7, 0xa3, 0x20, 0xa4, 0xa9, 0x41, 0xb1, 0x3b, 0x8d, 0xf6,
0x32, 0x21, 0x41, 0x33, 0x40, 0xd5, 0x38, 0x3d, 0x56, 0x42, 0x4f, 0x14, 0x56, 0xa3, 0xd2, 0xa3,
0xce, 0x21, 0x15, 0x10, 0x1d, 0xe3, 0x94, 0x75, 0xb6, 0x44, 0xc6, 0x3c, 0xb7, 0x80, 0xd0, 0x7a,
0x6d, 0xd9, 0x7d, 0xde, 0xb1, 0xb3, 0xcf, 0x9e, 0xdd, 0x92, 0x16, 0x47, 0x81, 0xdf, 0xcd, 0xdb,
0x1e, 0x60, 0x79, 0xae, 0xb3, 0xf4, 0x0c, 0xe0, 0x00, 0x22, 0x9d, 0x89, 0x24, 0x10, 0x5e, 0xa6,
0x7b, 0x6c, 0x48, 0xb4, 0x44, 0x9f, 0xce, 0xdc, 0x10, 0xe1, 0x5b, 0xfa, 0x4c, 0xe7, 0x00, 0x81,
0x8c, 0x1d, 0x29, 0x4d, 0xc8, 0x03, 0xa6, 0xbe, 0x9b, 0x16, 0x3b, 0x5b, 0x6d, 0x77, 0x62, 0xeb,
0x10, 0xc5, 0x74, 0x72, 0x24, 0x29, 0x51, 0x00, 0x41, 0x31, 0xe8, 0xa0, 0x77, 0xe3, 0x0d, 0x31,
0x24, 0x60, 0x17, 0x72, 0x16, 0xef, 0x8f, 0x54, 0xf1, 0x56, 0x3b, 0x50, 0x13, 0x91, 0xb0, 0x66,
0xd8, 0x29, 0x7f, 0xde, 0xa9, 0x3b, 0x15, 0x78, 0xaf, 0x77, 0xa7, 0x4e, 0xb3, 0x46, 0x9d, 0x40,
0xc9, 0x26, 0x6a, 0xa7, 0xae, 0xbc, 0x77, 0xea, 0x86, 0xa6, 0x70, 0xa2, 0x47, 0xa0, 0x9a, 0x75,
0x23, 0x13, 0xd4, 0x86, 0xa8, 0x00, 0xe9, 0x30, 0x2c, 0xa4, 0x95, 0x9c, 0xbf, 0xc7, 0xc6, 0xf1,
0x91, 0xda, 0x07, 0x01, 0xf4, 0xee, 0xa4, 0x49, 0xe7, 0x6a, 0x01, 0xf2, 0xec, 0xba, 0x0e, 0x7a,
0xa1, 0xe2, 0xf6, 0x2e, 0x3a, 0xe6, 0x85, 0x2a, 0xa0, 0x52, 0xe9, 0x33, 0x04, 0x3b, 0x70, 0x24,
0x14, 0x3f, 0xf3, 0x05, 0x26, 0xb8, 0xc4, 0x8d, 0x82, 0xf8, 0xe2, 0x7e, 0xcd, 0x87, 0x0d, 0xae,
0xd2, 0x03, 0x3a, 0xe6, 0x03, 0xf3, 0x75, 0x69, 0x36, 0xed, 0x96, 0x20, 0x7d, 0x50, 0x72, 0x08,
0x12, 0x0a, 0x9b, 0x67, 0x39, 0x99, 0xeb, 0x76, 0x82, 0x40, 0x90, 0xe1, 0x30, 0x8d, 0x4c, 0x81,
0x83, 0x82, 0xc0, 0x0e, 0xe3, 0x54, 0xa7, 0x50, 0x68, 0xd0, 0xd9, 0x8a, 0xa0, 0x0d, 0xac, 0xf6,
0x14, 0x2b, 0xaf, 0xbf, 0xee, 0xbe, 0x14, 0x0d, 0x34, 0x13, 0x8a, 0x63, 0x52, 0x02, 0xda, 0xea,
0x75, 0x3e, 0x03, 0xf4, 0x90, 0xd0, 0x56, 0xc8, 0x2c, 0x4d, 0x3a, 0xa1, 0x23, 0xab, 0xd1, 0x7b,
0xbb, 0x7b, 0x93, 0x81, 0x9a, 0x05, 0x6a, 0x06, 0x2f, 0xd2, 0x68, 0xb9, 0x82, 0x90, 0xea, 0x5b,
0xdc, 0x1b, 0x4c, 0x33, 0xcf, 0x9d, 0x50, 0x00, 0x21, 0x3f, 0x1f, 0xfb, 0x9a, 0xf7, 0x0f, 0x1a,
0xe1, 0xd0, 0x3e, 0xa0, 0x05, 0x85, 0x81, 0x51, 0x4e, 0x90, 0xd0, 0x69, 0x8d, 0x18, 0xa0, 0xf2,
0x94, 0x34, 0xfc, 0xdf, 0x4d, 0x1a, 0xae, 0x82, 0x24, 0xa0, 0x81, 0x6a, 0xee, 0xb8, 0x0f, 0xab,
0xf3, 0x08, 0x43, 0xee, 0x08, 0xd8, 0xa4, 0xae, 0x3d, 0xc6, 0xf4, 0x1e, 0x98, 0x43, 0x68, 0x7a,
0x96, 0x45, 0xfd, 0x21, 0x8b, 0xd0, 0x94, 0x5e, 0xc7, 0x51, 0xf6, 0x0a, 0xb2, 0xd8, 0x3a, 0x39,
0x35, 0x74, 0x94, 0xa5, 0x34, 0x62, 0x54, 0xd3, 0x0c, 0xfc, 0x4a, 0x3b, 0x83, 0x10, 0x91, 0x99,
0xad, 0x6a, 0x1b, 0x07, 0x2d, 0xdf, 0x54, 0x58, 0xcd, 0x02, 0xf0, 0x1b, 0x1d, 0x45, 0xc5, 0x36,
0x5a, 0xe8, 0xbc, 0xf5, 0x1d, 0x82, 0x74, 0xef, 0x67, 0x97, 0xac, 0x89, 0xb7, 0x71, 0x8f, 0x32,
0x25, 0x23, 0xcc, 0xaa, 0x7d, 0x01, 0x67, 0x3e, 0x6f, 0x93, 0xd1, 0x1d, 0xf7, 0xdc, 0xcd, 0xd4,
0x31, 0xa5, 0x29, 0x65, 0x4b, 0xeb, 0xe7, 0x1c, 0x34, 0x22, 0xa2, 0x37, 0xc0, 0xd8, 0xab, 0x6b,
0x8e, 0x2c, 0x05, 0x94, 0x85, 0xc6, 0x0a, 0x2b, 0x61, 0xc6, 0x51, 0x23, 0x51, 0x87, 0xa8, 0x68,
0x56, 0xb4, 0x04, 0x32, 0x2b, 0x6b, 0x2b, 0x0f, 0xb9, 0x57, 0xe1, 0xe1, 0x92, 0x74, 0x46, 0xc5,
0xe1, 0xeb, 0x00, 0xcb, 0xaa, 0x83, 0x80, 0xca, 0x04, 0x60, 0xb3, 0x72, 0xd5, 0x16, 0x59, 0xd3,
0xd4, 0x18, 0x8f, 0xd1, 0xe0, 0x9e, 0x94, 0xcd, 0x5c, 0x96, 0x5e, 0xf5, 0xb2, 0xf7, 0xd4, 0x24,
0x65, 0xed, 0x51, 0x76, 0x36, 0x0c, 0xab, 0xad, 0xff, 0x72, 0x0f, 0x36, 0x56, 0x47, 0xcd, 0x68,
0x4f, 0x4a, 0x72, 0x51, 0x9b, 0xeb, 0xd4, 0x8e, 0xa7, 0x81, 0x10, 0x29, 0x48, 0xa4, 0x8a, 0xd5,
0xa1, 0x15, 0x8d, 0x4e, 0x5b, 0x22, 0x21, 0x35, 0xad, 0x16, 0x41, 0xea, 0xdc, 0x85, 0xd5, 0x48,
0xe0, 0xb5, 0x25, 0xc5, 0x23, 0x02, 0xf5, 0x8e, 0x75, 0xe5, 0xac, 0xd1, 0x1c, 0xce, 0x0c, 0x3c,
0x9a, 0xbb, 0x10, 0x6f, 0xb8, 0x8b, 0xac, 0xf0, 0x56, 0xa0, 0xd0, 0x36, 0x72, 0xef, 0x32, 0x47,
0x28, 0x23, 0x24, 0x0c, 0x4c, 0x3d, 0x87, 0xe6, 0x26, 0x24, 0x44, 0xb3, 0x3c, 0x4a, 0x11, 0x6c,
0xbe, 0xbb, 0xa8, 0x56, 0xb3, 0x72, 0x89, 0x73, 0x3c, 0xfb, 0xec, 0xb0, 0xbf, 0xb7, 0x8d, 0x36,
0x00, 0x08, 0x4a, 0x83, 0x50, 0x0d, 0xed, 0x47, 0xd5, 0x2c, 0x8b, 0xfb, 0xd4, 0xc1, 0x90, 0x70,
0x8d, 0x9c, 0x4c, 0x38, 0xdf, 0xa7, 0x90, 0x4d, 0xd8, 0x84, 0xd1, 0xa6, 0x0e, 0xc4, 0xbe, 0x47,
0x53, 0x9c, 0xa3, 0x6d, 0xd4, 0xa2, 0x7f, 0x3b, 0x84, 0x20, 0x8c, 0x8c, 0x2a, 0x30, 0x0b, 0x9c,
0xf7, 0x18, 0x42, 0x32, 0x33, 0x86, 0x8e, 0x10, 0x20, 0x5f, 0x6f, 0xb6, 0xb9, 0x5c, 0x33, 0xd3,
0x7a, 0xed, 0x45, 0xd0, 0x9e, 0xfa, 0xa1, 0xe7, 0x86, 0x6e, 0x83, 0xa0, 0xd0, 0x41, 0x10, 0x59,
0x3f, 0x7a, 0xf9, 0xd0, 0xc6, 0xe5, 0x18, 0xe9, 0x22, 0x96, 0x41, 0x02, 0xb4, 0xbb, 0x4a, 0xad,
0xf8, 0xf3, 0x1c, 0x2b, 0xe1, 0x8a, 0x91, 0x75, 0xcc, 0xef, 0x1e, 0x0e, 0xe4, 0x6e, 0xaf, 0x65,
0xbd, 0x16, 0x05, 0xe6, 0x3f, 0xcb, 0x02, 0xd6, 0xb9, 0xd6, 0x9b, 0x3f, 0x7b, 0x2c, 0x4d, 0xa8,
0x8e, 0x76, 0x73, 0x7f, 0x7e, 0xe7, 0x4f, 0x8f, 0x6c, 0xbe, 0x3e, 0xf3, 0xbd, 0xfd, 0xe7, 0xbb,
0x3f, 0xf7, 0xfe, 0x8b, 0x3b, 0x9b, 0xbf, 0x5e, 0xf4, 0xaf, 0xad, 0xd9, 0x7c, 0xbb, 0x75, 0x6e,
0x5d, 0xf8, 0x6f, 0xaf, 0x33, 0xd6, 0x19, 0x01, 0x2e, 0xf0, 0xd0, 0xa6, 0xd7, 0xb1, 0x6d, 0x0d,
0x80, 0xc4, 0x93, 0x61, 0xe9, 0x2c, 0x18, 0xa2, 0x04, 0x75, 0x1f, 0xb6, 0xc6, 0x78, 0x3a, 0x59,
0x83, 0xd7, 0x34, 0x3a, 0x62, 0xbf, 0x34, 0x9a, 0x8f, 0x70, 0x3b, 0x3e, 0xf4, 0x68, 0x33, 0xce,
0x4e, 0xe7, 0xef, 0xda, 0x34, 0xb4, 0xed, 0x3f, 0x64, 0xe8, 0xbb, 0x04, 0x7d, 0xa4, 0xd6, 0x9c,
0x57, 0x66, 0xf1, 0x8c, 0x37, 0xb7, 0x3c, 0x98, 0xb2, 0x9b, 0x81, 0xb0, 0x81, 0x3b, 0x42, 0x61,
0x86, 0xfb, 0x5c, 0x74, 0x50, 0xc7, 0x10, 0x6d, 0xab, 0xc1, 0x95, 0x30, 0x3e, 0xea, 0x80, 0x82,
0xd6, 0xe0, 0x61, 0xda, 0x34, 0x4c, 0x9f, 0xea, 0xdd, 0x0a, 0x06, 0x21, 0xed, 0x45, 0x0b, 0xd2,
0xe5, 0x18, 0x95, 0x8a, 0xf2, 0x05, 0x13, 0xfc, 0xe2, 0x2d, 0xe9, 0x12, 0x58, 0x35, 0x55, 0x80,
0x43, 0xa7, 0x25, 0x75, 0xec, 0x1d, 0x44, 0xc7, 0xa0, 0x00, 0xb4, 0x7a, 0x6b, 0x45, 0xd9, 0xfc,
0x7e, 0x98, 0x9f, 0x28, 0x9b, 0x3f, 0xab, 0x8d, 0xbf, 0x53, 0x1a, 0xe6, 0xaf, 0xaa, 0xee, 0x57,
0x4b, 0xc3, 0xfc, 0x5e, 0x3d, 0x7f, 0x5b, 0xb3, 0xf9, 0xbd, 0x7a, 0xfe, 0xb6, 0x66, 0xf3, 0x6f,
0x04, 0x5a, 0x77, 0x46, 0xd6, 0xe0, 0x1a, 0xc2, 0xb4, 0xc0, 0x98, 0xd5, 0x19, 0x49, 0x8d, 0x08,
0x95, 0x56, 0xf7, 0x37, 0x5b, 0xc7, 0xfc, 0xf4, 0xbd, 0x12, 0xda, 0x16, 0xe6, 0xe8, 0x1d, 0x7f,
0xad, 0x11, 0x57, 0xd4, 0x11, 0xcb, 0xad, 0x73, 0x39, 0x90, 0x31, 0xa8, 0x6c, 0xef, 0x5e, 0xf4,
0xd1, 0x31, 0xbb, 0x30, 0xdb, 0x3d, 0x2b, 0x66, 0xfc, 0xc0, 0x32, 0x69, 0x5c, 0x88, 0x99, 0xe6,
0x3b, 0x36, 0x03, 0xc5, 0x35, 0xf3, 0xc2, 0xf0, 0x69, 0x03, 0x63, 0x0e, 0x16, 0xdc, 0xc4, 0x5c,
0x96, 0xb2, 0x85, 0xf3, 0xb7, 0x8e, 0x05, 0x3d, 0xbb, 0x75, 0xf8, 0x0a, 0x71, 0x1e, 0x08, 0x39,
0x06, 0xe6, 0xb8, 0xc0, 0x12, 0x4d, 0xf3, 0x41, 0x17, 0x79, 0xef, 0x8c, 0xe4, 0xee, 0x3d, 0xdd,
0x13, 0x66, 0x56, 0xdc, 0x3c, 0xc7, 0xfb, 0xe4, 0x2f, 0x1d, 0x63, 0xb5, 0x51, 0xe8, 0x64, 0xd1,
0x20, 0xb0, 0xa3, 0x33, 0xec, 0x68, 0x53, 0xed, 0x30, 0xaf, 0xa5, 0x4d, 0x28, 0x1d, 0x30, 0xa3,
0xcd, 0x9d, 0x0e, 0x98, 0xa1, 0x45, 0x92, 0x8c, 0xe0, 0x70, 0x3a, 0x71, 0x80, 0x54, 0x11, 0x9f,
0xd3, 0x45, 0x3a, 0xf9, 0x87, 0xe6, 0xc6, 0xaa, 0xd6, 0xf1, 0x0c, 0x19, 0xe4, 0xf2, 0xbf, 0xd3,
0x48, 0xe6, 0x5f, 0x38, 0xbf, 0xfc, 0xe7, 0x37, 0x6a, 0x60, 0xc9, 0x33, 0x5c, 0x69, 0x28, 0x11,
0xb2, 0xa4, 0xff, 0x93, 0xc0, 0xb8, 0x05, 0x79, 0xcb, 0x61, 0x41, 0x70, 0x77, 0x2c, 0xa2, 0x23,
0xa2, 0x07, 0x2b, 0x7a, 0xa4, 0x6e, 0xd1, 0x72, 0xe8, 0xc9, 0x72, 0x16, 0xee, 0x18, 0x92, 0xc0,
0x65, 0xfa, 0xd7, 0x6e, 0x71, 0x23, 0x14, 0xe1, 0x1f, 0x9f, 0xaa, 0xff, 0xfb, 0xdf, 0xc1, 0x6c,
0xc4, 0xc6, 0xed, 0x20, 0x38, 0xba, 0x6a, 0x44, 0x8b, 0xf6, 0x3f, 0x1b, 0x18, 0xd2, 0xd8, 0x6d,
0x24, 0xaa, 0xd7, 0xfb, 0x30, 0xa9, 0xbd, 0xfb, 0x38, 0x92, 0x3b, 0xc8, 0x0a, 0x08, 0xae, 0x99,
0xff, 0x03, 0x7c, 0xe0, 0x3d, 0x3e, 0x16, 0x8e, 0xfa, 0x4f, 0x00, 0x00, 0x01, 0x85, 0x69, 0x43,
0x43, 0x50, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x78,
0x9c, 0x7d, 0x91, 0x3d, 0x48, 0xc3, 0x40, 0x1c, 0xc5, 0x5f, 0x53, 0x8b, 0x1f, 0x54, 0x14, 0xec,
0x20, 0xe2, 0x90, 0xa1, 0x8a, 0x83, 0x85, 0xa2, 0x22, 0x8e, 0x5a, 0x85, 0x22, 0x54, 0x08, 0xb5,
0x42, 0xab, 0x0e, 0x26, 0x97, 0x7e, 0x41, 0x93, 0x86, 0x24, 0xc5, 0xc5, 0x51, 0x70, 0x2d, 0x38,
0xf8, 0xb1, 0x58, 0x75, 0x70, 0x71, 0xd6, 0xd5, 0xc1, 0x55, 0x10, 0x04, 0x3f, 0x40, 0xdc, 0xdc,
0x9c, 0x14, 0x5d, 0xa4, 0xc4, 0xff, 0x35, 0x85, 0x16, 0x31, 0x1e, 0x1c, 0xf7, 0xe3, 0xdd, 0xbd,
0xc7, 0xdd, 0x3b, 0x40, 0xa8, 0x95, 0x98, 0x66, 0x75, 0x44, 0x01, 0x4d, 0xb7, 0xcd, 0x64, 0x3c,
0x26, 0xa6, 0x33, 0xab, 0x62, 0xe7, 0x2b, 0xba, 0xd1, 0x8f, 0x00, 0xc6, 0x10, 0x95, 0x99, 0x65,
0xcc, 0x49, 0x52, 0x02, 0x9e, 0xe3, 0xeb, 0x1e, 0x3e, 0xbe, 0xde, 0x45, 0x78, 0x96, 0xf7, 0xb9,
0x3f, 0x47, 0xaf, 0x9a, 0xb5, 0x18, 0xe0, 0x13, 0x89, 0x67, 0x99, 0x61, 0xda, 0xc4, 0x1b, 0xc4,
0xd3, 0x9b, 0xb6, 0xc1, 0x79, 0x9f, 0x38, 0xc4, 0x0a, 0xb2, 0x4a, 0x7c, 0x4e, 0x3c, 0x6e, 0xd2,
0x05, 0x89, 0x1f, 0xb9, 0xae, 0xb8, 0xfc, 0xc6, 0x39, 0xdf, 0x60, 0x81, 0x67, 0x86, 0xcc, 0x54,
0x72, 0x9e, 0x38, 0x44, 0x2c, 0xe6, 0xdb, 0x58, 0x69, 0x63, 0x56, 0x30, 0x35, 0xe2, 0x29, 0xe2,
0xb0, 0xaa, 0xe9, 0x94, 0x2f, 0xa4, 0x5d, 0x56, 0x39, 0x6f, 0x71, 0xd6, 0x4a, 0x15, 0xd6, 0xbc,
0x27, 0x7f, 0x61, 0x30, 0xab, 0xaf, 0x2c, 0x73, 0x9d, 0xe6, 0x30, 0xe2, 0x58, 0xc4, 0x12, 0x24,
0x88, 0x50, 0x50, 0x41, 0x11, 0x25, 0xd8, 0x88, 0xd0, 0xaa, 0x93, 0x62, 0x21, 0x49, 0xfb, 0x31,
0x0f, 0xff, 0x50, 0xc3, 0x2f, 0x91, 0x4b, 0x21, 0x57, 0x11, 0x8c, 0x1c, 0x0b, 0x28, 0x43, 0x83,
0xdc, 0xf0, 0x83, 0xff, 0xc1, 0xef, 0x6e, 0xad, 0xdc, 0xe4, 0x84, 0x9b, 0x14, 0x8c, 0x01, 0x81,
0x17, 0xc7, 0xf9, 0x18, 0x01, 0x3a, 0x77, 0x81, 0x7a, 0xd5, 0x71, 0xbe, 0x8f, 0x1d, 0xa7, 0x7e,
0x02, 0xf8, 0x9f, 0x81, 0x2b, 0xbd, 0xe5, 0x2f, 0xd7, 0x80, 0x99, 0x4f, 0xd2, 0xab, 0x2d, 0x2d,
0x7c, 0x04, 0xf4, 0x6d, 0x03, 0x17, 0xd7, 0x2d, 0x4d, 0xd9, 0x03, 0x2e, 0x77, 0x80, 0xc1, 0x27,
0x43, 0x36, 0xe5, 0x86, 0xe4, 0xa7, 0x29, 0xe4, 0x72, 0xc0, 0xfb, 0x19, 0x7d, 0x53, 0x06, 0x18,
0xb8, 0x05, 0x7a, 0xd6, 0xdc, 0xde, 0x9a, 0xfb, 0x38, 0x7d, 0x00, 0x52, 0xd4, 0x55, 0xe2, 0x06,
0x38, 0x38, 0x04, 0x46, 0xf3, 0x94, 0xbd, 0xee, 0xf1, 0xee, 0xae, 0xf6, 0xde, 0xfe, 0x3d, 0xd3,
0xec, 0xef, 0x07, 0x93, 0x50, 0x72, 0xb4, 0xe4, 0x15, 0xae, 0xb9, 0x00, 0x00, 0x0d, 0x1a, 0x69,
0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65,
0x2e, 0x78, 0x6d, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b,
0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69,
0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72,
0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x0a, 0x3c,
0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a,
0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61,
0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20,
0x43, 0x6f, 0x72, 0x65, 0x20, 0x34, 0x2e, 0x34, 0x2e, 0x30, 0x2d, 0x45, 0x78, 0x69, 0x76, 0x32,
0x22, 0x3e, 0x0a, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c,
0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30,
0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d,
0x6e, 0x73, 0x23, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73,
0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f,
0x75, 0x74, 0x3d, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a,
0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73,
0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31,
0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e,
0x73, 0x3a, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70,
0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75,
0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x23, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78,
0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x64, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
0x70, 0x75, 0x72, 0x6c, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x63, 0x2f, 0x65, 0x6c, 0x65, 0x6d,
0x65, 0x6e, 0x74, 0x73, 0x2f, 0x31, 0x2e, 0x31, 0x2f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78,
0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x47, 0x49, 0x4d, 0x50, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x69, 0x6d, 0x70, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78,
0x6d, 0x70, 0x2f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74,
0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61,
0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e,
0x30, 0x2f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d,
0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f,
0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22,
0x0a, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65,
0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x67, 0x69, 0x6d, 0x70, 0x3a, 0x64, 0x6f, 0x63, 0x69, 0x64,
0x3a, 0x67, 0x69, 0x6d, 0x70, 0x3a, 0x36, 0x30, 0x31, 0x33, 0x66, 0x38, 0x35, 0x61, 0x2d, 0x34,
0x62, 0x65, 0x32, 0x2d, 0x34, 0x33, 0x39, 0x34, 0x2d, 0x39, 0x30, 0x63, 0x38, 0x2d, 0x62, 0x35,
0x64, 0x63, 0x39, 0x65, 0x36, 0x64, 0x31, 0x34, 0x39, 0x30, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x78,
0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d,
0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x33, 0x33, 0x35, 0x62, 0x66, 0x37, 0x37,
0x30, 0x2d, 0x61, 0x33, 0x66, 0x32, 0x2d, 0x34, 0x61, 0x31, 0x37, 0x2d, 0x62, 0x34, 0x34, 0x37,
0x2d, 0x64, 0x33, 0x35, 0x34, 0x38, 0x61, 0x63, 0x32, 0x31, 0x64, 0x38, 0x37, 0x22, 0x0a, 0x20,
0x20, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c,
0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e,
0x64, 0x69, 0x64, 0x3a, 0x38, 0x34, 0x35, 0x63, 0x66, 0x36, 0x32, 0x39, 0x2d, 0x36, 0x66, 0x62,
0x31, 0x2d, 0x34, 0x33, 0x63, 0x61, 0x2d, 0x39, 0x36, 0x34, 0x64, 0x2d, 0x33, 0x61, 0x64, 0x34,
0x62, 0x66, 0x38, 0x32, 0x63, 0x30, 0x33, 0x30, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x64, 0x63, 0x3a,
0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e,
0x67, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x3a, 0x41, 0x50, 0x49, 0x3d, 0x22,
0x32, 0x2e, 0x30, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x3a, 0x50, 0x6c, 0x61,
0x74, 0x66, 0x6f, 0x72, 0x6d, 0x3d, 0x22, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x22, 0x0a, 0x20, 0x20,
0x20, 0x47, 0x49, 0x4d, 0x50, 0x3a, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x3d,
0x22, 0x31, 0x36, 0x33, 0x31, 0x37, 0x37, 0x30, 0x38, 0x38, 0x33, 0x31, 0x33, 0x38, 0x32, 0x32,
0x30, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x3a, 0x56, 0x65, 0x72, 0x73, 0x69,
0x6f, 0x6e, 0x3d, 0x22, 0x32, 0x2e, 0x31, 0x30, 0x2e, 0x32, 0x34, 0x22, 0x0a, 0x20, 0x20, 0x20,
0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x3d, 0x22, 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61,
0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x47, 0x49, 0x4d, 0x50, 0x20, 0x32, 0x2e,
0x31, 0x30, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x48,
0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66,
0x3a, 0x53, 0x65, 0x71, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a,
0x6c, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3a, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x73, 0x61, 0x76, 0x65, 0x64, 0x22, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65,
0x64, 0x3d, 0x22, 0x2f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x45, 0x76,
0x74, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d,
0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x38, 0x39, 0x66, 0x65, 0x30, 0x34, 0x35, 0x35, 0x2d, 0x61,
0x33, 0x38, 0x64, 0x2d, 0x34, 0x34, 0x38, 0x30, 0x2d, 0x61, 0x66, 0x64, 0x66, 0x2d, 0x37, 0x66,
0x30, 0x30, 0x38, 0x64, 0x36, 0x65, 0x34, 0x34, 0x34, 0x30, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3a, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,
0x41, 0x67, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x47, 0x69, 0x6d, 0x70, 0x20, 0x32, 0x2e, 0x31, 0x30,
0x20, 0x28, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x73, 0x74, 0x45, 0x76, 0x74, 0x3a, 0x77, 0x68, 0x65, 0x6e, 0x3d, 0x22, 0x32, 0x30, 0x32, 0x31,
0x2d, 0x30, 0x39, 0x2d, 0x31, 0x36, 0x54, 0x30, 0x36, 0x3a, 0x34, 0x31, 0x3a, 0x32, 0x33, 0x2b,
0x30, 0x31, 0x3a, 0x30, 0x30, 0x22, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72,
0x64, 0x66, 0x3a, 0x53, 0x65, 0x71, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x78, 0x6d, 0x70,
0x4d, 0x4d, 0x3a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f,
0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e,
0x0a, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x0a, 0x3c, 0x2f, 0x78,
0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63,
0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x77, 0x22, 0x3f, 0x3e, 0xa1, 0x13, 0xf5,
0x5b, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9,
0x43, 0xbb, 0x7f, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00,
0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45,
0x07, 0xe5, 0x09, 0x10, 0x05, 0x29, 0x17, 0x16, 0x0a, 0xcd, 0xb8, 0x00, 0x00, 0x0b, 0x63, 0x49,
0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x9c, 0x6d, 0x70, 0x94, 0xd5, 0x15, 0xc7, 0x7f, 0xf7, 0x79,
0xf6, 0xd9, 0xb7, 0x24, 0x9b, 0x00, 0x1b, 0x10, 0x76, 0x9f, 0x45, 0x92, 0xdd, 0x44, 0x4a, 0x78,
0x11, 0x42, 0x88, 0x10, 0x86, 0x40, 0x05, 0xa2, 0x21, 0x48, 0x10, 0x05, 0x09, 0xb6, 0x62, 0xa4,
0xbc, 0xa8, 0x90, 0x10, 0x5e, 0x44, 0x5b, 0x3a, 0x52, 0x28, 0x8a, 0x63, 0x3b, 0xd3, 0x99, 0x4e,
0xa7, 0xd3, 0x99, 0xfa, 0x49, 0xb1, 0xd4, 0xa9, 0x9d, 0x71, 0x18, 0x68, 0x3b, 0x8d, 0x55, 0x27,
0x9d, 0x51, 0xab, 0x05, 0x85, 0x71, 0x28, 0x71, 0x9c, 0x49, 0xb4, 0x45, 0xb2, 0x1b, 0x20, 0x02,
0x4a, 0x4c, 0x72, 0xfb, 0x21, 0x11, 0x88, 0xd9, 0x7b, 0xb3, 0x09, 0x89, 0x84, 0x90, 0x33, 0x93,
0x0f, 0xbb, 0xcf, 0x79, 0xce, 0xbd, 0xf7, 0xbf, 0xe7, 0x9e, 0xfb, 0x3f, 0xe7, 0xde, 0x1b, 0xc1,
0x00, 0x93, 0xc6, 0x40, 0xa6, 0xd9, 0x66, 0x88, 0x52, 0x60, 0x1d, 0x30, 0x15, 0x10, 0xc0, 0x51,
0xe0, 0x77, 0x48, 0xf1, 0x07, 0xff, 0xa7, 0x27, 0x5b, 0x06, 0x52, 0x7f, 0xc5, 0x40, 0xea, 0xcc,
0xe9, 0x50, 0xa6, 0x65, 0x48, 0xf1, 0x6b, 0xe0, 0x11, 0x45, 0xdf, 0x5e, 0x42, 0xc8, 0x87, 0xfd,
0x75, 0x1f, 0x5f, 0x1a, 0x28, 0x7d, 0x36, 0x06, 0x12, 0x80, 0x86, 0x14, 0x1b, 0x81, 0x35, 0x9a,
0x1f, 0x76, 0x25, 0x52, 0x3c, 0x39, 0xe4, 0x81, 0x71, 0x24, 0x6a, 0x87, 0x6d, 0xe0, 0x03, 0x20,
0xad, 0x1b, 0xd5, 0x8b, 0xc0, 0x54, 0x7f, 0x7d, 0xed, 0x89, 0x21, 0x0f, 0xec, 0x2c, 0xbb, 0x13,
0x00, 0x0f, 0xc0, 0x0b, 0xec, 0x3d, 0x73, 0xcb, 0x38, 0x31, 0x04, 0xe0, 0x37, 0xde, 0x17, 0x0a,
0xdf, 0x01, 0xac, 0xe8, 0xc1, 0x2b, 0x8b, 0x5b, 0x2d, 0xf3, 0xce, 0xa1, 0x29, 0x0c, 0x44, 0x83,
0x11, 0x07, 0x42, 0x56, 0x03, 0xb3, 0x7b, 0xf8, 0xea, 0xfb, 0x48, 0x39, 0xd3, 0xff, 0xe9, 0xf5,
0x5d, 0x50, 0xae, 0xbf, 0x07, 0x0a, 0x79, 0x7f, 0x2f, 0xc0, 0x03, 0x98, 0x8a, 0x10, 0xab, 0x6f,
0x6a, 0x0f, 0x8c, 0x05, 0xc3, 0x3e, 0x29, 0x38, 0x0a, 0xdc, 0x1a, 0xbf, 0x77, 0x02, 0x1c, 0x26,
0x7c, 0xad, 0xa4, 0x7e, 0xa7, 0x04, 0x4c, 0x1c, 0x51, 0x5f, 0x1b, 0xbd, 0x29, 0x3d, 0x50, 0x0a,
0x36, 0x2b, 0xc1, 0x03, 0x5c, 0x5b, 0x2b, 0x70, 0xff, 0xf8, 0x09, 0x9d, 0x89, 0x5b, 0x24, 0x3c,
0x79, 0x53, 0x7a, 0x60, 0x2c, 0x14, 0x1e, 0x27, 0x25, 0x47, 0x00, 0x5f, 0xdc, 0x8e, 0xd9, 0x63,
0x48, 0xfd, 0xf3, 0x2b, 0x08, 0xcb, 0xe2, 0xec, 0xf2, 0x32, 0xe4, 0x47, 0xff, 0x51, 0x99, 0xfa,
0x12, 0xc4, 0x74, 0x7f, 0xfd, 0xc9, 0xe3, 0x37, 0x8d, 0x07, 0x36, 0xd8, 0x11, 0x21, 0x25, 0x3f,
0x53, 0x81, 0x07, 0xe0, 0xde, 0x56, 0x85, 0x99, 0x9e, 0x8e, 0x91, 0x96, 0x86, 0x67, 0x4b, 0x85,
0xce, 0x9c, 0x07, 0xe4, 0xde, 0x86, 0x31, 0xd9, 0xe2, 0xa6, 0x01, 0x50, 0x20, 0x0b, 0x80, 0xe5,
0xca, 0x4e, 0xcd, 0x9c, 0x8e, 0x67, 0xfe, 0xfc, 0x2b, 0x60, 0xce, 0x99, 0x83, 0x59, 0xa4, 0x65,
0x2d, 0xc5, 0xc2, 0x6c, 0xbd, 0xeb, 0xa6, 0x00, 0x30, 0x16, 0xca, 0xb4, 0x80, 0x7d, 0x80, 0x43,
0xc9, 0x94, 0x37, 0x57, 0x20, 0xbc, 0x9e, 0x2b, 0x80, 0x3b, 0x9d, 0x78, 0x1f, 0xdb, 0xd0, 0xbe,
0xa8, 0xa8, 0xc7, 0xf1, 0x6c, 0x2c, 0x18, 0xf1, 0x0c, 0x7a, 0x00, 0xa5, 0x14, 0x65, 0xc0, 0x0c,
0xd5, 0x73, 0xc7, 0x83, 0x2b, 0x70, 0x4d, 0x9b, 0xd6, 0xe5, 0x7b, 0x67, 0xce, 0x04, 0xac, 0xf5,
0xe5, 0x3a, 0xd3, 0x39, 0x52, 0xc8, 0x35, 0x83, 0x7a, 0x11, 0x89, 0xda, 0xe1, 0xb4, 0x8e, 0x7c,
0xd7, 0x8e, 0xab, 0x90, 0xe4, 0x25, 0xf5, 0xe0, 0xab, 0x38, 0x32, 0x32, 0xe2, 0x3e, 0x6e, 0xfd,
0xf4, 0x33, 0xce, 0x2d, 0x2e, 0x45, 0x46, 0xcf, 0x28, 0xc3, 0xab, 0x84, 0x89, 0xe9, 0xf5, 0xb5,
0x9f, 0x0f, 0x56, 0x0f, 0xdc, 0xa6, 0x04, 0x0f, 0x70, 0x55, 0x3c, 0xaa, 0x04, 0x0f, 0xc0, 0x0c,
0x06, 0x70, 0x6d, 0xde, 0xa4, 0xb3, 0x9f, 0x2e, 0x60, 0xe7, 0xa0, 0x9c, 0xc2, 0x51, 0x3b, 0x1c,
0x01, 0x36, 0x2a, 0xa7, 0x42, 0x28, 0x80, 0xf7, 0xbe, 0x65, 0xdd, 0xda, 0xf1, 0x2c, 0x5e, 0x8c,
0x91, 0x73, 0x9b, 0x4e, 0xa5, 0x3c, 0x6a, 0x87, 0xa7, 0x0c, 0x2a, 0x00, 0x1b, 0x42, 0xd9, 0x02,
0xd8, 0x03, 0x24, 0x29, 0x02, 0x23, 0x9e, 0x27, 0xb7, 0x63, 0x0c, 0x1f, 0xde, 0x7d, 0x87, 0x7d,
0x29, 0x78, 0xb6, 0x56, 0x81, 0x94, 0x4a, 0x47, 0x06, 0x9e, 0x89, 0x06, 0xc3, 0xe6, 0xa0, 0x01,
0x50, 0xc8, 0xd6, 0xb9, 0xc0, 0x52, 0xe5, 0xd4, 0x9c, 0x37, 0x1b, 0xf7, 0xbc, 0xb9, 0x09, 0xdb,
0x73, 0x15, 0xcc, 0xc2, 0x5c, 0x72, 0xb7, 0x4e, 0x65, 0x01, 0x82, 0x45, 0x83, 0x02, 0xc0, 0x58,
0x28, 0xeb, 0x1b, 0xda, 0x12, 0xdf, 0x23, 0x4c, 0x13, 0xef, 0xc6, 0xc7, 0x10, 0x6e, 0x77, 0xe2,
0x3f, 0x88, 0x65, 0x91, 0xb4, 0x6e, 0x1d, 0x38, 0x9d, 0xba, 0xc5, 0xf1, 0x99, 0x58, 0x30, 0xb3,
0xdf, 0x69, 0x4d, 0xbf, 0xbb, 0xf9, 0x36, 0xdf, 0xb0, 0x47, 0xd0, 0x94, 0xe9, 0xad, 0x87, 0xca,
0xf0, 0xae, 0x58, 0xde, 0x89, 0xe3, 0x9d, 0x3d, 0x7b, 0x96, 0x77, 0xdf, 0x7d, 0x97, 0xea, 0xea,
0x6a, 0x8e, 0x1c, 0x39, 0x42, 0x53, 0x53, 0x13, 0x3e, 0x9f, 0x0f, 0x8f, 0xe7, 0x0a, 0x1e, 0x66,
0xba, 0x9f, 0xd6, 0xe6, 0xaf, 0x68, 0x7d, 0xe7, 0x5f, 0xaa, 0xa6, 0xfd, 0x08, 0x71, 0x6e, 0x5f,
0x53, 0xe3, 0x3f, 0x6f, 0x58, 0x1a, 0x13, 0xb5, 0xc3, 0x23, 0x3a, 0x68, 0xcb, 0x98, 0xf8, 0x2b,
0x82, 0x9b, 0xd4, 0xbf, 0x1d, 0xc4, 0x11, 0x0a, 0xb5, 0xd3, 0x94, 0xd6, 0x56, 0x0e, 0x1f, 0x3e,
0xcc, 0x53, 0x4f, 0x3d, 0xc5, 0xd1, 0xa3, 0x47, 0x3b, 0xa9, 0x66, 0x67, 0x67, 0xb3, 0x77, 0xef,
0x5e, 0x4a, 0x4a, 0x4a, 0x70, 0x38, 0xda, 0x39, 0x78, 0xeb, 0xa9, 0x53, 0x9c, 0xbb, 0x6b, 0x31,
0x32, 0xa6, 0xa4, 0x35, 0x31, 0x60, 0xb2, 0xbf, 0xbe, 0xf6, 0xb3, 0x1b, 0x75, 0x0a, 0x3f, 0xa1,
0x04, 0x0f, 0x70, 0xef, 0xd8, 0x82, 0xc3, 0xb6, 0x3b, 0xd6, 0x11, 0xc9, 0xfe, 0xfd, 0xfb, 0x29,
0x29, 0x29, 0xe9, 0x02, 0x1e, 0xc0, 0x89, 0x13, 0x27, 0x58, 0xba, 0x74, 0x29, 0x2f, 0xbc, 0xf0,
0x02, 0xb2, 0x63, 0x01, 0x31, 0x6f, 0xb9, 0x05, 0xf7, 0x8e, 0xad, 0xba, 0xf6, 0x47, 0x00, 0x3f,
0x8d, 0x05, 0x33, 0xc5, 0x0d, 0xe7, 0x81, 0xd1, 0x50, 0xf8, 0x36, 0x24, 0xef, 0xd1, 0xbe, 0x87,
0xd1, 0xb5, 0xe1, 0xec, 0x30, 0x69, 0x07, 0x5e, 0xc2, 0x18, 0x36, 0x0c, 0x80, 0xe3, 0xc7, 0x8f,
0x93, 0x9f, 0x9f, 0xcf, 0xf9, 0xf3, 0xe7, 0xf5, 0x0b, 0x88, 0xcb, 0x45, 0x4d, 0x4d, 0x0d, 0xd3,
0x3a, 0xb2, 0x95, 0xb6, 0xf3, 0xe7, 0x39, 0xf7, 0xe0, 0x43, 0xb4, 0xbd, 0x77, 0x54, 0xf5, 0x4a,
0x33, 0x30, 0xd3, 0x5f, 0x5f, 0xfb, 0xde, 0x0d, 0xe3, 0x81, 0x9f, 0x8f, 0x9a, 0x28, 0x90, 0xec,
0x53, 0x81, 0x07, 0xe0, 0xd9, 0x52, 0x79, 0x19, 0x3c, 0x80, 0x03, 0x07, 0x0e, 0x74, 0x0b, 0x1e,
0xc0, 0xa5, 0x4b, 0x97, 0x78, 0xf1, 0xc5, 0x17, 0x2f, 0x7b, 0xa1, 0x91, 0x9c, 0x8c, 0xa7, 0x72,
0x93, 0x2e, 0x4f, 0x76, 0x02, 0xcf, 0x35, 0x04, 0x32, 0x8c, 0x1b, 0x06, 0x40, 0xd3, 0xf9, 0x65,
0x11, 0xa0, 0xe4, 0x19, 0xe6, 0xfc, 0xb9, 0xb8, 0x0b, 0x0b, 0x2f, 0x7f, 0xbe, 0x70, 0xe1, 0x02,
0xd5, 0xd5, 0xd5, 0x09, 0xdb, 0x3f, 0x74, 0xe8, 0x10, 0x4d, 0x4d, 0x4d, 0x57, 0x42, 0xc1, 0xcc,
0x3b, 0x70, 0x94, 0x6a, 0x59, 0xcb, 0x1c, 0x61, 0x18, 0xcb, 0x6e, 0x08, 0x00, 0x63, 0xc1, 0xb0,
0x1b, 0xd8, 0xab, 0x5c, 0xe1, 0xa5, 0x6c, 0xa7, 0x2d, 0xae, 0x2b, 0x14, 0xa4, 0xb9, 0xb9, 0x99,
0xba, 0xba, 0xba, 0x84, 0xdb, 0x38, 0x71, 0xe2, 0x04, 0x2d, 0x2d, 0x57, 0x95, 0xf9, 0x1d, 0x0e,
0xbc, 0xeb, 0xd7, 0x81, 0x69, 0xea, 0xc6, 0xb9, 0x3b, 0x66, 0x87, 0x93, 0x07, 0x3c, 0x80, 0x52,
0x50, 0x0e, 0x4c, 0x56, 0x3d, 0xb7, 0xd6, 0x97, 0xe3, 0x9c, 0x98, 0xd3, 0xb9, 0x86, 0x90, 0x94,
0xc4, 0xe4, 0xc9, 0x93, 0x13, 0x6e, 0xa3, 0xa0, 0xa0, 0xa0, 0x13, 0xa5, 0x01, 0xb0, 0xb2, 0x22,
0x38, 0x2b, 0x1f, 0xd5, 0xbd, 0x16, 0x91, 0xf0, 0xf8, 0x80, 0x06, 0x30, 0x16, 0x8a, 0xa4, 0xa3,
0x49, 0xe6, 0xc5, 0xf0, 0x34, 0xbc, 0x0f, 0xae, 0x02, 0xa3, 0x73, 0xb3, 0x4e, 0xa7, 0x93, 0xc2,
0xab, 0xa6, 0x74, 0x77, 0x32, 0x67, 0xce, 0x1c, 0xbc, 0xde, 0x6f, 0x85, 0x57, 0x21, 0xf0, 0xae,
0x58, 0x8e, 0x18, 0x33, 0x4a, 0xf7, 0xea, 0xf6, 0xa8, 0x1d, 0xb1, 0x07, 0x2c, 0x80, 0x52, 0xca,
0x9d, 0xc0, 0x48, 0xe5, 0x0a, 0x5a, 0x55, 0x71, 0x99, 0xb6, 0x7c, 0x5b, 0x6e, 0xbf, 0xfd, 0xf6,
0x84, 0xdb, 0xc9, 0xcf, 0xcf, 0x8f, 0x1f, 0x5b, 0x47, 0x8e, 0xc4, 0xbd, 0xad, 0x4a, 0xf7, 0x6a,
0x2a, 0xc8, 0xdd, 0x03, 0x12, 0xc0, 0xa8, 0x1d, 0x9e, 0x04, 0x28, 0x2b, 0x9e, 0xc6, 0x84, 0x6c,
0x3c, 0xf7, 0x94, 0x28, 0xdf, 0xcf, 0xcc, 0xcc, 0x24, 0x39, 0xb9, 0xfb, 0x10, 0x65, 0x59, 0x16,
0xd9, 0xd9, 0xd9, 0xea, 0x6a, 0x4d, 0xd1, 0x42, 0x8c, 0xfc, 0x5c, 0x9d, 0x89, 0x07, 0xa2, 0x76,
0x78, 0xe6, 0x80, 0x02, 0xb0, 0xd1, 0xce, 0x30, 0x3b, 0x16, 0x0e, 0x8f, 0xb2, 0xda, 0xb2, 0xb5,
0x0a, 0xc3, 0xa7, 0xdc, 0x43, 0x22, 0x10, 0x08, 0x30, 0x65, 0x4a, 0xf7, 0x55, 0xa8, 0xac, 0xac,
0x2c, 0x82, 0xc1, 0xa0, 0x9a, 0xd8, 0x7a, 0xbd, 0x78, 0x2b, 0x37, 0xe9, 0xaa, 0x35, 0x16, 0xf0,
0x4c, 0x63, 0x30, 0xcb, 0x31, 0x60, 0x00, 0x6c, 0xc3, 0xb8, 0x0b, 0x50, 0x6e, 0xea, 0x98, 0x25,
0x45, 0xb8, 0x0a, 0x66, 0xe9, 0xa9, 0x8f, 0x69, 0x52, 0x5a, 0x5a, 0xda, 0x6d, 0x5b, 0xcb, 0x96,
0x2d, 0xc3, 0xe5, 0x72, 0xe9, 0xc9, 0xf6, 0xf4, 0x5c, 0x1c, 0x2b, 0xef, 0xd3, 0xa9, 0xcc, 0x6e,
0x13, 0x6d, 0xf7, 0x0f, 0x08, 0x00, 0x63, 0x76, 0xd8, 0xd3, 0x51, 0x6d, 0x89, 0xcf, 0x64, 0x1d,
0x0e, 0xbc, 0x1b, 0xd6, 0x21, 0xd4, 0x95, 0x93, 0x1e, 0xc5, 0xc1, 0xdc, 0xdc, 0x5c, 0x84, 0xe8,
0x26, 0x81, 0x72, 0x38, 0xf0, 0xae, 0x29, 0x07, 0xb7, 0x16, 0xe8, 0x3d, 0x0d, 0x76, 0xc4, 0x77,
0xdd, 0x01, 0x94, 0xb0, 0x01, 0x18, 0xaf, 0x4c, 0x03, 0xd6, 0x95, 0xe3, 0x9c, 0x30, 0x21, 0x21,
0x5b, 0x99, 0x99, 0x99, 0x09, 0x4d, 0xe1, 0x44, 0xc4, 0x0a, 0x87, 0x71, 0x55, 0x3e, 0xa6, 0x53,
0xb9, 0x55, 0x20, 0xab, 0xae, 0x2b, 0x80, 0x51, 0x3b, 0x3c, 0xba, 0xa3, 0x60, 0x10, 0x3f, 0x1e,
0x8d, 0x18, 0x86, 0x77, 0x55, 0x99, 0x2e, 0xcd, 0xea, 0x24, 0x23, 0x47, 0x8e, 0x64, 0xc1, 0x82,
0x05, 0xca, 0xe7, 0x93, 0x26, 0x4d, 0xd2, 0xc6, 0xbf, 0x6f, 0x8b, 0xf7, 0xbe, 0x65, 0x88, 0x5b,
0xb5, 0xac, 0xa5, 0xa2, 0xc1, 0x0e, 0x8f, 0xbb, 0x9e, 0x1e, 0xb8, 0x13, 0xf0, 0x2b, 0x63, 0xd1,
0xf6, 0x2a, 0xcc, 0x31, 0xa3, 0x13, 0x36, 0xe6, 0x76, 0xbb, 0xb5, 0x7c, 0xb0, 0xb8, 0xb8, 0xb8,
0x2b, 0xff, 0xd3, 0x0d, 0xce, 0xef, 0xc7, 0xbd, 0xa5, 0x52, 0xa7, 0xe2, 0x13, 0xb0, 0xfb, 0xcc,
0x98, 0xde, 0x1f, 0xd6, 0x34, 0xae, 0xc1, 0xfb, 0xa6, 0x02, 0x0f, 0x2b, 0x0d, 0x4f, 0x9e, 0x80,
0xa7, 0xb8, 0xb8, 0xc7, 0x76, 0x73, 0x73, 0x73, 0x7b, 0xcc, 0xff, 0x74, 0xe2, 0x99, 0x7f, 0x27,
0xc6, 0x6c, 0xed, 0x7b, 0xcb, 0x5b, 0x4d, 0x73, 0xf6, 0x77, 0x0a, 0xe0, 0x99, 0x50, 0x96, 0x09,
0x3c, 0xdb, 0x51, 0xe9, 0x88, 0xdf, 0xf1, 0xad, 0x55, 0x18, 0x29, 0x3d, 0x4f, 0x3d, 0x23, 0x91,
0x08, 0x4e, 0xc5, 0x82, 0xa3, 0xe3, 0x7f, 0xca, 0x30, 0xe2, 0xf1, 0xe0, 0xad, 0xd0, 0x6e, 0x85,
0x9a, 0xc0, 0xb3, 0xa7, 0x83, 0x19, 0xd6, 0x77, 0x06, 0x60, 0xab, 0x6c, 0x5b, 0x02, 0xcc, 0x53,
0x2e, 0x82, 0xa5, 0x8b, 0x70, 0xcd, 0xbc, 0xa3, 0x57, 0xbf, 0xe8, 0xe8, 0xd1, 0xa3, 0x99, 0x31,
0x63, 0x46, 0xdc, 0x15, 0x3a, 0x10, 0x08, 0xf4, 0xca, 0xa6, 0x6b, 0xea, 0xed, 0x58, 0x3f, 0x78,
0x40, 0x9b, 0xdc, 0x18, 0xc2, 0x58, 0xf5, 0x9d, 0x00, 0x18, 0xb3, 0xc3, 0x49, 0xc0, 0xcf, 0x95,
0xef, 0x3a, 0x2d, 0xbc, 0xeb, 0xd7, 0x22, 0x1c, 0xbd, 0xe3, 0xa9, 0x2e, 0x97, 0x8b, 0x85, 0x0b,
0x17, 0x76, 0xf9, 0x7e, 0xee, 0xdc, 0xb9, 0x09, 0x65, 0x2a, 0x0a, 0x92, 0x89, 0xf7, 0xe1, 0xd5,
0x90, 0x9c, 0xa4, 0xd3, 0x7a, 0xba, 0xe3, 0xe4, 0x44, 0xff, 0x02, 0xd8, 0x51, 0xd1, 0x50, 0x72,
0x09, 0xe7, 0xa3, 0x6b, 0xb1, 0x7a, 0x31, 0xd5, 0xae, 0x96, 0x69, 0x71, 0xce, 0xc6, 0xcc, 0x9a,
0x35, 0xeb, 0x9a, 0x6c, 0x3a, 0x32, 0xc6, 0xe1, 0xaa, 0xd0, 0xd2, 0x1a, 0x1b, 0xd8, 0xde, 0xaf,
0x00, 0x46, 0x43, 0x61, 0x9b, 0xf6, 0xe3, 0x19, 0xf1, 0xe3, 0x4d, 0xfa, 0x08, 0xbc, 0x2b, 0x57,
0x24, 0x4c, 0x5b, 0x7a, 0xc2, 0xf5, 0xc6, 0x8f, 0x1f, 0x7f, 0xcd, 0x59, 0x83, 0x77, 0xd9, 0xbd,
0x88, 0x71, 0x5a, 0x5a, 0xf3, 0x78, 0xd4, 0x0e, 0x67, 0xf5, 0x9f, 0x07, 0x4a, 0x9e, 0x06, 0x86,
0x29, 0x69, 0xc8, 0x53, 0xdb, 0x31, 0x47, 0x8d, 0xba, 0xe6, 0x81, 0x06, 0x83, 0xc1, 0x4e, 0x59,
0x49, 0x20, 0x10, 0x60, 0xec, 0xd8, 0xb1, 0xd7, 0x9e, 0x76, 0x0d, 0x1f, 0x86, 0x67, 0xc7, 0x76,
0x5d, 0x9e, 0x9c, 0x04, 0xec, 0x69, 0x08, 0x64, 0x88, 0x3e, 0x07, 0x30, 0x6a, 0x87, 0xf3, 0x80,
0x32, 0xa5, 0xa1, 0x19, 0xd3, 0xf0, 0x2c, 0x5c, 0xd0, 0x27, 0x15, 0x0e, 0xcb, 0xb2, 0xb8, 0xf7,
0xde, 0x7b, 0x2f, 0x7f, 0x2e, 0x2b, 0x2b, 0xeb, 0x52, 0x40, 0xed, 0xad, 0xb8, 0xe7, 0x16, 0x62,
0xde, 0x59, 0xa8, 0x53, 0x29, 0x15, 0x86, 0x31, 0xaf, 0x4f, 0x01, 0x8c, 0x85, 0x32, 0x4d, 0xe0,
0x39, 0x25, 0x6d, 0x11, 0x02, 0x6f, 0xe5, 0x46, 0x44, 0x52, 0x52, 0x9f, 0x0c, 0x52, 0x08, 0xd1,
0x29, 0x0e, 0xe6, 0xe5, 0xe5, 0x75, 0x9f, 0xff, 0x26, 0x6a, 0xdb, 0xe5, 0xc2, 0xfb, 0xf8, 0xa3,
0xba, 0xf2, 0xbf, 0x09, 0xec, 0x8b, 0x05, 0x33, 0x9c, 0x7d, 0x06, 0xa0, 0x94, 0x42, 0x7b, 0x97,
0xc3, 0x71, 0xdf, 0x12, 0x5c, 0x79, 0x79, 0xf4, 0xa5, 0x44, 0x22, 0x91, 0x6b, 0xe2, 0x7f, 0x3a,
0x71, 0x4e, 0x99, 0x8c, 0xf5, 0xc3, 0x95, 0xda, 0xba, 0x86, 0x14, 0x46, 0x42, 0x77, 0x50, 0xba,
0xfd, 0x59, 0xa3, 0xa1, 0xb0, 0x0f, 0xc9, 0xbf, 0x81, 0x0c, 0x55, 0xe5, 0xc3, 0xf7, 0x97, 0xd7,
0xb0, 0x22, 0xe1, 0x3e, 0x1d, 0xe4, 0xc5, 0x8b, 0x17, 0x29, 0x2a, 0x2a, 0xa2, 0xb1, 0xb1, 0x91,
0x9a, 0x9a, 0x1a, 0x52, 0x53, 0x53, 0xfb, 0xd4, 0x7e, 0x4b, 0x5d, 0x3d, 0xe7, 0x16, 0x2e, 0x82,
0x0b, 0x17, 0x55, 0x2a, 0xff, 0x05, 0x26, 0xf9, 0xeb, 0x6b, 0x63, 0xdd, 0xb1, 0x70, 0xad, 0x6c,
0xf3, 0x0d, 0xdf, 0x86, 0xe6, 0x64, 0x95, 0x6b, 0x5b, 0x45, 0x7b, 0xec, 0x13, 0x7d, 0xbb, 0x47,
0x6f, 0x59, 0x16, 0x29, 0x29, 0x29, 0x14, 0x14, 0x14, 0x68, 0xd3, 0xbb, 0x5e, 0x2f, 0x28, 0x3e,
0x1f, 0x32, 0x25, 0x89, 0x96, 0xd7, 0xdf, 0x54, 0xa9, 0xa4, 0x00, 0xe6, 0xbe, 0xa6, 0xc6, 0xbf,
0xf6, 0xda, 0x03, 0xa3, 0x76, 0x78, 0x2c, 0xed, 0x67, 0x5b, 0xe2, 0xdf, 0xe5, 0x08, 0x05, 0x48,
0x7d, 0xf5, 0x8f, 0x98, 0xe9, 0xe9, 0xdc, 0x88, 0xd2, 0x76, 0xf6, 0x2c, 0x67, 0x97, 0xaf, 0x44,
0x7e, 0x74, 0x52, 0xa5, 0xf2, 0x25, 0xc8, 0x69, 0xfe, 0xfa, 0x8f, 0x3f, 0xea, 0x6d, 0x0c, 0xdc,
0x83, 0xee, 0x2e, 0xc7, 0xd6, 0xcd, 0x37, 0x2c, 0x78, 0x40, 0xfb, 0x1d, 0x94, 0x2a, 0x6d, 0xb5,
0xc6, 0x03, 0xe2, 0xd9, 0x2f, 0x02, 0xe3, 0x95, 0x8e, 0xe6, 0xd0, 0x78, 0x5f, 0x01, 0xa0, 0x2c,
0x7b, 0x1b, 0x33, 0xf3, 0xf0, 0x2c, 0x98, 0xdf, 0x2f, 0x03, 0x3b, 0x75, 0xea, 0x14, 0x07, 0x0f,
0x1e, 0xa4, 0xba, 0xba, 0x9a, 0xb6, 0xb6, 0x36, 0x0a, 0x0b, 0x0b, 0x29, 0x2e, 0x2e, 0xee, 0x51,
0x2d, 0x30, 0x61, 0x5a, 0x53, 0x38, 0x87, 0x4b, 0x45, 0xdf, 0xa7, 0xf5, 0xf0, 0xdf, 0x55, 0x2a,
0x77, 0x5f, 0x32, 0xbe, 0x2e, 0x02, 0x0e, 0x25, 0x3c, 0x85, 0x63, 0xa1, 0x88, 0x25, 0xa5, 0xfc,
0x07, 0x10, 0x7f, 0xf7, 0xaa, 0x4d, 0x92, 0xfc, 0xa7, 0xfd, 0xb8, 0xf2, 0xa6, 0xf7, 0xf9, 0x80,
0x8e, 0x1d, 0x3b, 0x46, 0x59, 0x59, 0x19, 0x1f, 0x7c, 0xf0, 0x41, 0x97, 0x55, 0xf9, 0xe5, 0x97,
0x5f, 0x66, 0xea, 0xd4, 0xa9, 0x7d, 0xde, 0x66, 0xf3, 0x87, 0x1f, 0xf2, 0x45, 0xf1, 0x52, 0x9d,
0xca, 0x51, 0x29, 0x44, 0x7e, 0x7a, 0xdd, 0xc9, 0xaf, 0x12, 0x9a, 0xc2, 0x52, 0xca, 0x15, 0x4a,
0xf0, 0x00, 0xc7, 0x43, 0x0f, 0xe0, 0x9a, 0xd6, 0xf7, 0x03, 0x39, 0x73, 0xe6, 0x0c, 0x1b, 0x36,
0x6c, 0xe8, 0x02, 0x1e, 0xc0, 0xc9, 0x93, 0x27, 0x29, 0x2f, 0x2f, 0xe7, 0xf4, 0xe9, 0xd3, 0x7d,
0xde, 0xae, 0x73, 0xc2, 0x04, 0xac, 0x0d, 0xda, 0x2b, 0x26, 0x93, 0x85, 0x94, 0xe5, 0x09, 0xc5,
0xc0, 0xa8, 0x9d, 0x99, 0x4a, 0xfb, 0xf5, 0xfb, 0xf8, 0x92, 0x9c, 0x44, 0xd2, 0xea, 0xd5, 0x3a,
0x22, 0xda, 0x6b, 0x79, 0xe7, 0x9d, 0x77, 0x78, 0xeb, 0xad, 0xb7, 0x94, 0xcf, 0x8f, 0x1c, 0x39,
0x42, 0x4d, 0x4d, 0x4d, 0x3f, 0x04, 0x43, 0x83, 0xa4, 0x55, 0x65, 0x88, 0x11, 0xc3, 0x74, 0x5a,
0x3b, 0x1b, 0xec, 0x48, 0x7a, 0x02, 0x1e, 0x28, 0xb6, 0x02, 0x21, 0x25, 0x6d, 0xd9, 0xb4, 0x01,
0x47, 0x66, 0x46, 0xbf, 0xc4, 0xbe, 0x4f, 0x3e, 0xf9, 0xa4, 0x5b, 0x9d, 0x9e, 0x1c, 0x42, 0xea,
0x51, 0xc5, 0x2b, 0x18, 0xc0, 0x55, 0xa5, 0x2d, 0xbc, 0x8e, 0x14, 0xc8, 0x9d, 0x5a, 0x00, 0xa3,
0x76, 0x38, 0x8c, 0xee, 0x2e, 0xc7, 0xd8, 0x60, 0x42, 0x77, 0x39, 0x7a, 0x5d, 0x72, 0x4a, 0xa0,
0x86, 0x68, 0x59, 0x56, 0xbf, 0xb5, 0xef, 0x59, 0xbc, 0x18, 0x63, 0xe2, 0xf7, 0x74, 0x2a, 0xe5,
0x1d, 0x27, 0x30, 0xba, 0x02, 0xd8, 0x68, 0x47, 0x44, 0xc7, 0xd4, 0x4d, 0x51, 0xe4, 0x73, 0x78,
0x76, 0x6c, 0x4b, 0xe8, 0x2e, 0x47, 0x6f, 0x25, 0x91, 0x13, 0x5a, 0x39, 0x39, 0x39, 0xfd, 0x47,
0x6b, 0x7c, 0x29, 0x78, 0xb6, 0x54, 0xea, 0xaa, 0x35, 0x1e, 0x60, 0xef, 0xe7, 0x76, 0xa6, 0xd9,
0x05, 0xc0, 0x36, 0xe4, 0x1c, 0x40, 0xe9, 0x5e, 0xe6, 0xdc, 0x9e, 0xdd, 0xe5, 0xe8, 0x2d, 0x80,
0x15, 0x15, 0xea, 0xbb, 0xc1, 0x6b, 0xd6, 0xac, 0x21, 0xaf, 0x8f, 0x73, 0xee, 0x2e, 0x21, 0x6a,
0xd6, 0x2c, 0xcc, 0x7b, 0xb4, 0x9b, 0x61, 0x77, 0x99, 0x42, 0xdc, 0xdd, 0x29, 0x95, 0x8b, 0xd9,
0x61, 0x0b, 0x38, 0x00, 0xc4, 0xdf, 0x74, 0x30, 0x0d, 0x92, 0x7f, 0xb1, 0x0f, 0x47, 0xc8, 0xee,
0xd7, 0xce, 0x9b, 0xa6, 0xc9, 0x8c, 0x19, 0x33, 0x68, 0x6e, 0x6e, 0xe6, 0xed, 0xb7, 0xdf, 0xee,
0xf4, 0x6c, 0xed, 0xda, 0xb5, 0xec, 0xda, 0xb5, 0x8b, 0xb4, 0xb4, 0xb4, 0x7e, 0xed, 0x83, 0x30,
0x4d, 0xcc, 0xb1, 0x63, 0xb9, 0x74, 0xe0, 0x15, 0x68, 0x6b, 0x53, 0x51, 0xbf, 0x29, 0xdb, 0x53,
0x87, 0xfd, 0x7e, 0x5f, 0xd3, 0x99, 0x16, 0xd1, 0x11, 0xfb, 0xd6, 0x00, 0xbf, 0x55, 0xf1, 0x42,
0x6b, 0xf5, 0x2a, 0x7c, 0x3f, 0xfd, 0x49, 0x97, 0x73, 0x7d, 0xfd, 0x25, 0x2d, 0x2d, 0x2d, 0x1c,
0x3b, 0x76, 0x8c, 0xba, 0xba, 0x3a, 0xa4, 0x94, 0xd8, 0xb6, 0x4d, 0x4e, 0x4e, 0x8e, 0x72, 0xb7,
0xae, 0xcf, 0x45, 0x4a, 0xbe, 0x78, 0xfe, 0x97, 0x34, 0xff, 0xea, 0x37, 0x3a, 0xad, 0x2d, 0xfe,
0xfa, 0xda, 0xe7, 0x45, 0xd4, 0x0e, 0x0f, 0xef, 0xc8, 0x77, 0xe3, 0x7b, 0x5f, 0x92, 0x97, 0xd4,
0xc3, 0xaf, 0xe1, 0x18, 0x1b, 0xe2, 0x66, 0x92, 0xd6, 0xff, 0x9d, 0xe2, 0xdc, 0xa2, 0x25, 0xc8,
0x06, 0x65, 0x31, 0x26, 0x8a, 0x64, 0x92, 0x83, 0xf6, 0xb3, 0x2d, 0xca, 0xfd, 0x42, 0xe7, 0xfa,
0x35, 0x18, 0xfe, 0x11, 0xb4, 0xa9, 0xcb, 0x3e, 0x83, 0x52, 0x84, 0xcf, 0x87, 0x73, 0xfd, 0x8f,
0xb8, 0xb4, 0x6b, 0xaf, 0x4a, 0xc5, 0x8f, 0xa0, 0x52, 0x44, 0xed, 0xf0, 0x87, 0x80, 0x7a, 0x69,
0xfb, 0xba, 0x45, 0xf7, 0x7f, 0x5b, 0x06, 0xb7, 0x58, 0x8e, 0xf6, 0x3f, 0x0d, 0x2d, 0x75, 0xa0,
0x2a, 0x94, 0x26, 0x6e, 0xe4, 0x66, 0x96, 0x90, 0x01, 0x9c, 0x1b, 0xc2, 0xa1, 0xd7, 0x72, 0xc1,
0x00, 0x5e, 0x1f, 0xc2, 0xa1, 0xd7, 0xf2, 0xba, 0x01, 0x3c, 0x0f, 0x7c, 0x39, 0x84, 0x45, 0x8f,
0xe5, 0x6b, 0xe0, 0x39, 0xc3, 0x5f, 0x5f, 0xfb, 0x3e, 0xed, 0xc7, 0x35, 0xbe, 0x1a, 0xc2, 0xa4,
0x47, 0xe0, 0x6d, 0xf1, 0xd7, 0xd7, 0xbe, 0x29, 0xae, 0x2a, 0x24, 0xe4, 0x03, 0x5b, 0x69, 0x3f,
0x75, 0x95, 0x36, 0x84, 0x51, 0x5c, 0x69, 0x02, 0xde, 0x00, 0x9e, 0xf7, 0xd7, 0xd7, 0xbe, 0x01,
0xf0, 0x7f, 0x8c, 0xb7, 0xca, 0x27, 0x1e, 0xb2, 0xf1, 0x09, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
,

View File

@ -0,0 +1,257 @@
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, 0x08, 0x06, 0x00, 0x00, 0x00, 0x8e, 0x11, 0xf2,
0xad, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x04, 0xd8, 0x00, 0x00, 0x04,
0xd8, 0x01, 0xae, 0xaf, 0x4b, 0x3e, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f,
0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63,
0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, 0x00, 0x0f, 0x82, 0x49,
0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9d, 0x7b, 0x7c, 0x54, 0x45, 0x96, 0xc7, 0xbf, 0x75, 0xbb,
0xf3, 0x4e, 0x87, 0x10, 0xc3, 0x23, 0x24, 0x84, 0x44, 0x02, 0x09, 0x89, 0x22, 0x88, 0xa8, 0xb8,
0xca, 0x88, 0x38, 0xf2, 0x10, 0x67, 0x75, 0x9c, 0x64, 0x3e, 0xc8, 0x4a, 0x70, 0xc4, 0x75, 0xfd,
0x88, 0x33, 0xea, 0x32, 0xeb, 0x67, 0x60, 0x5d, 0x76, 0x06, 0xe2, 0xf8, 0x00, 0xc7, 0x5d, 0x56,
0x74, 0x18, 0xcd, 0xca, 0x2c, 0x2a, 0xca, 0xa0, 0xb2, 0xea, 0x8c, 0xe2, 0xa0, 0xeb, 0x73, 0xf4,
0x83, 0x88, 0x20, 0x79, 0x63, 0x08, 0xe9, 0x4e, 0x48, 0x23, 0x8f, 0x74, 0x24, 0xa4, 0x3b, 0xdd,
0x7d, 0x6b, 0xff, 0xc8, 0x83, 0xc4, 0xa4, 0xeb, 0xde, 0xdb, 0xe9, 0x0e, 0x33, 0xbf, 0xbf, 0x3a,
0x5d, 0xe7, 0x9c, 0x3a, 0xf9, 0xa5, 0x6e, 0xd5, 0xb9, 0xa7, 0x4e, 0x55, 0x04, 0xe7, 0x10, 0x75,
0x79, 0x79, 0x29, 0x41, 0x5b, 0xc7, 0x0c, 0x34, 0x31, 0x53, 0x08, 0x26, 0x22, 0x19, 0x07, 0x64,
0x01, 0x63, 0x05, 0xc4, 0xf5, 0xc8, 0x49, 0x48, 0x01, 0x8e, 0x01, 0xdf, 0x00, 0x4d, 0x08, 0xe9,
0x16, 0x52, 0x54, 0x82, 0xbe, 0x2f, 0x28, 0xc5, 0xbe, 0x29, 0xd5, 0x4d, 0x27, 0xce, 0xd1, 0xaf,
0x80, 0x18, 0xce, 0xce, 0xea, 0xf2, 0xf2, 0xe2, 0x82, 0x71, 0xde, 0x39, 0x04, 0xc5, 0x8d, 0x42,
0x93, 0xdf, 0x43, 0x32, 0x19, 0xd0, 0x86, 0x6e, 0x59, 0x36, 0x20, 0xc4, 0x2e, 0x4d, 0xd7, 0xdf,
0x88, 0x3f, 0xad, 0xfd, 0x79, 0xbc, 0xcb, 0xd5, 0x31, 0x74, 0x9b, 0xe6, 0x10, 0x75, 0x02, 0x25,
0x88, 0xea, 0x82, 0xf1, 0xd7, 0x69, 0x42, 0xbf, 0x0d, 0xc4, 0x02, 0xba, 0x46, 0x53, 0x34, 0xfb,
0x3b, 0x23, 0x60, 0x17, 0xf0, 0xbb, 0xc9, 0x55, 0xae, 0xb7, 0x04, 0xe8, 0xd1, 0xec, 0x2f, 0x6a,
0x04, 0x56, 0xe7, 0xa7, 0x3b, 0x84, 0x88, 0x2f, 0x45, 0xb0, 0x02, 0xc8, 0x8f, 0x56, 0x3f, 0x4a,
0x08, 0xea, 0x85, 0xe4, 0x69, 0xbf, 0xc6, 0xb3, 0x45, 0x15, 0xae, 0x93, 0xd1, 0xe9, 0x22, 0xc2,
0x38, 0x9c, 0x93, 0x13, 0xef, 0x4f, 0x08, 0xdc, 0x23, 0x61, 0x15, 0x90, 0x1a, 0x69, 0xfb, 0x61,
0xa2, 0x0d, 0x21, 0x1f, 0x71, 0x24, 0xc8, 0x27, 0xc6, 0xed, 0x6d, 0x3e, 0x13, 0x49, 0xc3, 0x11,
0x23, 0x50, 0x82, 0xa8, 0x2b, 0xc8, 0x5a, 0x2c, 0x05, 0x0f, 0x01, 0x13, 0x22, 0x65, 0x37, 0xc2,
0x68, 0x06, 0xd6, 0x4c, 0xae, 0x72, 0x95, 0x47, 0xea, 0xd1, 0x8e, 0x08, 0x81, 0x5f, 0x17, 0x8d,
0xcb, 0x0e, 0xea, 0xda, 0x16, 0x09, 0x57, 0x47, 0xc2, 0x5e, 0xf4, 0x21, 0x3f, 0x12, 0x41, 0x5b,
0xe9, 0xe4, 0xda, 0xc6, 0xfa, 0xa1, 0x5a, 0x1a, 0xf2, 0x0a, 0x58, 0x5d, 0x98, 0x59, 0x1c, 0xd0,
0xb5, 0x7d, 0x7f, 0x3b, 0xe4, 0x01, 0x88, 0x2b, 0x75, 0x9b, 0xfe, 0x55, 0xf5, 0x94, 0xac, 0x9f,
0xc9, 0x21, 0x0e, 0xa2, 0xb0, 0x95, 0x0f, 0xe7, 0xe4, 0xc4, 0x77, 0x26, 0x04, 0x36, 0x03, 0xb7,
0x0e, 0xc9, 0x01, 0x9b, 0x9d, 0xf8, 0x8b, 0xa6, 0x13, 0x3b, 0xa9, 0x80, 0xd8, 0xf1, 0xd9, 0xc4,
0x64, 0x65, 0x63, 0xcf, 0x18, 0x87, 0x96, 0xec, 0x40, 0xd8, 0x63, 0xba, 0x84, 0xa4, 0x4e, 0xe0,
0xc4, 0x71, 0x82, 0x27, 0x4f, 0x10, 0x70, 0xb7, 0xd0, 0xd9, 0x50, 0x8f, 0xf7, 0xab, 0x2f, 0xf1,
0x55, 0x57, 0x20, 0x7d, 0xbe, 0xa1, 0x74, 0x0f, 0xf0, 0x8a, 0x37, 0xc6, 0xbf, 0xf4, 0xa2, 0x03,
0xee, 0xf6, 0xb0, 0xfc, 0x0f, 0x47, 0xa9, 0xaa, 0x20, 0xf3, 0x3c, 0x4d, 0xf0, 0x1a, 0x88, 0x2b,
0xc3, 0xd1, 0xb7, 0x67, 0x64, 0xe2, 0x98, 0xbf, 0x88, 0xc4, 0xcb, 0xff, 0x8e, 0x84, 0x19, 0x97,
0xa2, 0x25, 0x26, 0x85, 0x63, 0x06, 0x19, 0x08, 0xe0, 0xab, 0x3a, 0xc8, 0xe9, 0xdd, 0xbb, 0x38,
0xfd, 0xf6, 0x1b, 0x74, 0x1e, 0x39, 0x1c, 0x96, 0x1d, 0xe0, 0xf3, 0x20, 0xb6, 0x1f, 0x14, 0x56,
0x1d, 0x39, 0x6a, 0x55, 0xd1, 0x32, 0x81, 0x75, 0x17, 0x8c, 0x9f, 0xa8, 0x07, 0xe5, 0x9b, 0x58,
0x0d, 0x4d, 0x34, 0x8d, 0xe4, 0x6b, 0xae, 0x23, 0x75, 0xc9, 0x32, 0x12, 0x67, 0xce, 0x02, 0x2d,
0x02, 0xf1, 0xf3, 0x77, 0xe0, 0xab, 0xae, 0xc0, 0xb3, 0xe3, 0x25, 0x3c, 0x3b, 0xb6, 0x21, 0xbd,
0xd6, 0x62, 0x69, 0x09, 0x8d, 0x52, 0xb2, 0x68, 0x4a, 0xb5, 0xeb, 0x2b, 0x2b, 0x7a, 0x96, 0x08,
0x3c, 0x54, 0x94, 0x95, 0x17, 0xd4, 0xf9, 0x10, 0x18, 0x6b, 0x5a, 0xc9, 0x66, 0x23, 0xe5, 0x07,
0x3f, 0x24, 0xed, 0x8e, 0x15, 0xc4, 0xe6, 0x9c, 0x6f, 0xa5, 0xbb, 0xb0, 0x11, 0x3c, 0x75, 0x92,
0xd6, 0xad, 0xe5, 0xb4, 0xbe, 0xb0, 0x85, 0xa0, 0xa7, 0xd5, 0x8a, 0x6a, 0xab, 0x86, 0x3e, 0x77,
0x52, 0x55, 0xf3, 0x17, 0x66, 0x15, 0x4c, 0x13, 0x58, 0x9d, 0x3f, 0x7e, 0x9c, 0xd0, 0xe4, 0x47,
0x40, 0xae, 0x59, 0x9d, 0xa4, 0x39, 0xdf, 0x67, 0xd4, 0x3f, 0xff, 0x82, 0xd8, 0xf3, 0x27, 0x99,
0x55, 0x89, 0x28, 0x82, 0x6d, 0x1e, 0x8e, 0xaf, 0x2f, 0xc3, 0xb3, 0x63, 0x1b, 0x48, 0x69, 0x56,
0xed, 0x84, 0xd4, 0xb9, 0xa6, 0xa0, 0xc6, 0x75, 0xc0, 0x8c, 0xb0, 0x29, 0x02, 0x2b, 0x8a, 0xb2,
0xd2, 0x62, 0x74, 0xde, 0x97, 0x70, 0x81, 0x19, 0x79, 0xdb, 0x79, 0xe9, 0x8c, 0x7e, 0x70, 0x1d,
0x8e, 0xeb, 0xae, 0x37, 0x23, 0x1e, 0x36, 0xda, 0xda, 0xda, 0x48, 0x49, 0x31, 0x7e, 0x33, 0xec,
0xf8, 0x62, 0x0f, 0xee, 0x35, 0x0f, 0xd0, 0xf9, 0x75, 0x9d, 0x39, 0xc3, 0x92, 0x63, 0x52, 0xda,
0x2e, 0x2f, 0xa8, 0x31, 0x9e, 0x54, 0x0d, 0x27, 0xa2, 0xf7, 0xae, 0xc6, 0x6e, 0xd7, 0x79, 0xcd,
0x2c, 0x79, 0x89, 0x97, 0x5d, 0x41, 0xce, 0xce, 0x77, 0xa2, 0x4e, 0x1e, 0xc0, 0x63, 0x8f, 0x3d,
0xc6, 0xaa, 0x55, 0xab, 0xf0, 0x7a, 0xbd, 0x4a, 0xb9, 0x84, 0x8b, 0x67, 0x32, 0x61, 0xfb, 0x1f,
0x71, 0x5c, 0xff, 0xf7, 0xe6, 0x0c, 0x0b, 0x46, 0x0b, 0x2d, 0xf8, 0x7a, 0x5d, 0x5e, 0x9e, 0xe1,
0x5f, 0xc7, 0x90, 0xc0, 0x0c, 0x77, 0xd6, 0x43, 0xc0, 0x55, 0xe6, 0x7a, 0x86, 0x40, 0xcb, 0x51,
0xa4, 0x3f, 0x60, 0x56, 0x7c, 0x48, 0x70, 0xbb, 0xdd, 0x6c, 0xd8, 0xb0, 0x81, 0xe9, 0xd3, 0xa7,
0xf3, 0xfe, 0xfb, 0xef, 0x2b, 0x65, 0x45, 0x7c, 0x3c, 0x19, 0x8f, 0x6e, 0x24, 0xfd, 0x67, 0xff,
0x02, 0xc2, 0xd4, 0x83, 0x57, 0xa4, 0xc7, 0x78, 0x5f, 0x94, 0x06, 0x1c, 0x29, 0x1b, 0x6b, 0x0b,
0x32, 0x17, 0x09, 0x58, 0x69, 0xa6, 0xb7, 0x1e, 0x74, 0x1e, 0x39, 0x8c, 0x6b, 0x59, 0x09, 0x01,
0x77, 0x8b, 0x15, 0xb5, 0xb0, 0x20, 0xbb, 0xe7, 0xb5, 0xfa, 0xfa, 0x7a, 0xe6, 0xcf, 0x9f, 0xcf,
0x7d, 0xf7, 0xdd, 0x47, 0x7b, 0xbb, 0x22, 0x9c, 0x13, 0x82, 0xb4, 0x3b, 0xef, 0x61, 0xcc, 0x9a,
0x87, 0xcc, 0x46, 0x01, 0x0b, 0xeb, 0x0a, 0xc7, 0xdf, 0xaf, 0x12, 0x08, 0x69, 0xa5, 0x72, 0xca,
0x84, 0x0c, 0x84, 0xf8, 0x3d, 0x61, 0x84, 0x3a, 0xc3, 0x45, 0x62, 0x30, 0x18, 0xec, 0xfd, 0xac,
0xeb, 0x3a, 0x9b, 0x36, 0x6d, 0xe2, 0xd2, 0x4b, 0x2f, 0xe5, 0xb3, 0xcf, 0x3e, 0x53, 0xea, 0x8d,
0x28, 0xf9, 0x07, 0xc6, 0xfc, 0x9b, 0x39, 0x12, 0xa5, 0x94, 0x65, 0xd5, 0xf9, 0xe3, 0x2f, 0x09,
0xd5, 0x1e, 0xd2, 0x82, 0x8d, 0xc0, 0x6f, 0x24, 0x8c, 0x34, 0xec, 0x21, 0x04, 0x86, 0x83, 0xc4,
0xbe, 0x04, 0xf6, 0xe0, 0xd0, 0xa1, 0x43, 0xcc, 0x99, 0x33, 0x87, 0xd5, 0xab, 0x57, 0xd3, 0xd9,
0xd9, 0x19, 0x52, 0x77, 0x44, 0xc9, 0x12, 0x46, 0xaf, 0x5e, 0x6b, 0xa6, 0x9b, 0x58, 0xa1, 0xc9,
0xe7, 0x3e, 0x9f, 0x31, 0x23, 0x66, 0xb0, 0xc6, 0x41, 0x09, 0xac, 0x2b, 0x18, 0x7f, 0x1d, 0x88,
0x1f, 0x9b, 0xb1, 0xae, 0x42, 0xb4, 0x49, 0x0c, 0x04, 0x06, 0x9f, 0x6b, 0x83, 0xc1, 0x20, 0xeb,
0xd7, 0xaf, 0x67, 0xd6, 0xac, 0x59, 0xec, 0xdf, 0xbf, 0x3f, 0xa4, 0x7e, 0xea, 0xe2, 0xa5, 0xa4,
0xdd, 0x7e, 0x97, 0x99, 0xae, 0x8a, 0x52, 0xce, 0xb8, 0xef, 0x1d, 0xac, 0x61, 0x00, 0x81, 0x9f,
0xcf, 0x98, 0x11, 0xa3, 0x0b, 0xf9, 0xa4, 0x91, 0xc5, 0xb8, 0x29, 0x17, 0x10, 0x7f, 0xc1, 0x45,
0x86, 0x3d, 0x47, 0x93, 0xc4, 0xc1, 0x46, 0x60, 0x5f, 0x1c, 0x3c, 0x78, 0x90, 0xd9, 0xb3, 0x67,
0xb3, 0x7e, 0xfd, 0xfa, 0x90, 0xb2, 0xe9, 0xf7, 0xff, 0xc2, 0x54, 0xc4, 0x20, 0x61, 0x4d, 0x5d,
0x5e, 0x66, 0xd6, 0x77, 0xbf, 0x1f, 0x40, 0xa0, 0xa3, 0xdd, 0xbd, 0x0c, 0xc8, 0x53, 0x19, 0xb3,
0xa5, 0x8e, 0x24, 0xf3, 0xc9, 0x72, 0xb2, 0x9e, 0x7d, 0xe1, 0x9c, 0x92, 0x18, 0x6a, 0x04, 0xf6,
0x85, 0xd7, 0xeb, 0x65, 0xf5, 0xea, 0xd5, 0xcc, 0x9d, 0x3b, 0x97, 0xc3, 0x87, 0x07, 0x09, 0xeb,
0x84, 0x60, 0x4c, 0xd9, 0x7a, 0x33, 0x6f, 0x49, 0x49, 0xc1, 0x18, 0x6d, 0xf5, 0x00, 0xf5, 0xbe,
0x3f, 0x54, 0x14, 0x15, 0xc5, 0xda, 0x75, 0x4f, 0x2d, 0x06, 0x09, 0xd1, 0x8c, 0x0d, 0x9b, 0x70,
0x2c, 0xb8, 0x01, 0x00, 0xfd, 0xdb, 0x36, 0x5c, 0xb7, 0xdf, 0x82, 0xf7, 0x60, 0xe8, 0x47, 0xa5,
0x07, 0xf6, 0xec, 0x5c, 0x5e, 0x9c, 0x71, 0x15, 0xcd, 0xad, 0x96, 0x5e, 0xaf, 0x42, 0x62, 0xd7,
0xae, 0x5d, 0x34, 0x36, 0x36, 0x9a, 0x96, 0x1f, 0x39, 0x72, 0x24, 0x1b, 0x37, 0x6e, 0xa4, 0xb8,
0xb8, 0x78, 0x40, 0x9b, 0xaf, 0xa6, 0x92, 0xc6, 0xe2, 0xeb, 0x91, 0xea, 0x3f, 0x4a, 0xa7, 0xd4,
0x6d, 0x05, 0x7d, 0x03, 0xec, 0x7e, 0x04, 0xd6, 0x16, 0x64, 0xfd, 0xa3, 0x14, 0xfc, 0x56, 0x65,
0x21, 0xe9, 0xca, 0xef, 0x91, 0xb9, 0x79, 0x6b, 0xbf, 0xef, 0xac, 0x90, 0x78, 0x7c, 0x4c, 0x26,
0xa5, 0x8d, 0xdf, 0xd0, 0xe8, 0x72, 0x19, 0xca, 0x46, 0x0b, 0x37, 0xdf, 0x7c, 0x33, 0x4f, 0x3e,
0xf9, 0x24, 0x23, 0x47, 0xf6, 0x5f, 0x23, 0xbf, 0x59, 0x5f, 0xc6, 0xa9, 0xf2, 0xa7, 0x95, 0xba,
0x12, 0xf1, 0x74, 0x41, 0x95, 0xb3, 0x77, 0xe2, 0xec, 0x47, 0x60, 0xcd, 0x94, 0xac, 0x03, 0xc0,
0x85, 0x21, 0xb5, 0x35, 0x8d, 0x09, 0x7f, 0xf8, 0x23, 0x71, 0x05, 0x45, 0x03, 0x9a, 0xfe, 0xd6,
0x48, 0xcc, 0xce, 0xce, 0xa6, 0xbc, 0xbc, 0x9c, 0xab, 0xae, 0x3a, 0xfb, 0x8e, 0xa0, 0x9f, 0x69,
0xa7, 0x61, 0xc1, 0x6c, 0x02, 0xdf, 0x1c, 0x53, 0xa9, 0xb6, 0xdb, 0x7d, 0xb1, 0x99, 0x13, 0xeb,
0xeb, 0x3d, 0xd0, 0x67, 0x0e, 0xac, 0x2d, 0xcc, 0xba, 0x0c, 0x15, 0x79, 0x80, 0x63, 0xc1, 0x0d,
0x83, 0x92, 0x07, 0xa0, 0x39, 0x52, 0x4c, 0xcf, 0x89, 0xe9, 0xee, 0x26, 0x9e, 0x1d, 0x9f, 0x4e,
0x56, 0x46, 0x86, 0xa1, 0x6c, 0xb4, 0xd0, 0xd8, 0xd8, 0xc8, 0xbc, 0x79, 0xf3, 0x58, 0xbb, 0x76,
0x6d, 0xef, 0x02, 0xa3, 0x25, 0x26, 0x91, 0x76, 0xc7, 0xdd, 0x46, 0xaa, 0x49, 0xfe, 0x38, 0xdf,
0x6d, 0x3d, 0x3f, 0xf4, 0x12, 0x28, 0x25, 0xcb, 0x95, 0x6a, 0x42, 0x90, 0xb6, 0x5c, 0x6d, 0xdc,
0x0a, 0x89, 0x63, 0x8f, 0x35, 0xf3, 0x3f, 0xb9, 0x63, 0xc9, 0xce, 0x1a, 0xb0, 0xb0, 0x0d, 0x1b,
0x82, 0xc1, 0x20, 0xeb, 0xd6, 0xad, 0x63, 0xfe, 0xfc, 0xf9, 0xb4, 0xb4, 0x74, 0x2d, 0x70, 0x23,
0x8a, 0x97, 0x60, 0x1f, 0x35, 0x5a, 0xa9, 0x27, 0xa4, 0x58, 0xd6, 0xf3, 0x59, 0x83, 0xae, 0xd0,
0x05, 0x18, 0x38, 0xb3, 0xf6, 0x41, 0xd2, 0xec, 0x6b, 0x88, 0xcb, 0x9f, 0x62, 0xe8, 0x54, 0x0f,
0x89, 0xb6, 0x42, 0xe5, 0x60, 0x06, 0xce, 0x8e, 0xc4, 0xcc, 0xb1, 0xe6, 0xd3, 0x8b, 0xd1, 0xc0,
0x07, 0x1f, 0x7c, 0xc0, 0x9a, 0x35, 0x6b, 0x00, 0x10, 0x71, 0x71, 0x8c, 0x28, 0x59, 0xa2, 0x56,
0x10, 0x5c, 0x54, 0x9d, 0x3f, 0x2e, 0x1f, 0xba, 0x09, 0x4c, 0xf6, 0xb6, 0x5c, 0x05, 0x8c, 0x50,
0xe9, 0xa4, 0xde, 0x52, 0x6a, 0xda, 0x21, 0xcd, 0x91, 0xc2, 0x96, 0x49, 0x53, 0xa9, 0xc9, 0xcc,
0x31, 0x94, 0x1d, 0x7b, 0xac, 0x99, 0xad, 0xe7, 0x67, 0x9c, 0xb3, 0x91, 0x18, 0x1f, 0x1f, 0x4f,
0x59, 0x59, 0x19, 0x4f, 0x3d, 0xf5, 0x54, 0xef, 0x77, 0x23, 0x8a, 0x97, 0x20, 0x6c, 0x76, 0xa5,
0x9e, 0xa6, 0xd9, 0x8a, 0xa1, 0x9b, 0x40, 0x21, 0x51, 0x46, 0x92, 0xf6, 0x31, 0x63, 0x49, 0xba,
0x62, 0xb6, 0x25, 0xc7, 0xda, 0x3a, 0xbc, 0x2c, 0xdf, 0x5f, 0x43, 0xcd, 0x78, 0xe3, 0x2c, 0x74,
0xba, 0xbb, 0x89, 0x2d, 0xd9, 0xa3, 0x86, 0x9d, 0xc4, 0xc2, 0xc2, 0x42, 0x3e, 0xfc, 0xf0, 0x43,
0x56, 0xae, 0x5c, 0x89, 0xd6, 0xe7, 0xbd, 0xd8, 0x3e, 0x7a, 0x0c, 0x09, 0x97, 0xce, 0x52, 0xea,
0x4a, 0xe4, 0x02, 0xe8, 0x99, 0x03, 0xa5, 0x98, 0xaf, 0x12, 0x76, 0x2c, 0xb8, 0x01, 0x6c, 0x36,
0xcb, 0x0e, 0xb6, 0x7a, 0x3c, 0xdc, 0xfe, 0x45, 0xa5, 0xa9, 0x91, 0x98, 0xee, 0x6e, 0xe2, 0xb9,
0xec, 0xf4, 0x61, 0x21, 0x51, 0x08, 0xc1, 0xdd, 0x77, 0xdf, 0xcd, 0xa7, 0x9f, 0x7e, 0xca, 0xd4,
0xa9, 0x53, 0x07, 0x95, 0x71, 0xcc, 0x33, 0x7c, 0x3b, 0x99, 0x59, 0x51, 0x34, 0x2a, 0x59, 0xeb,
0x4e, 0x1a, 0x2a, 0x27, 0xb7, 0xa4, 0xd9, 0xd7, 0x84, 0xe7, 0x29, 0xe0, 0x69, 0x6b, 0xe3, 0xf6,
0x2f, 0xab, 0x4d, 0x91, 0x38, 0xca, 0xdd, 0x1c, 0x75, 0x12, 0x47, 0x8f, 0x1e, 0xcd, 0xce, 0x9d,
0x3b, 0x79, 0xfc, 0xf1, 0xc7, 0x89, 0x8b, 0x8b, 0x0b, 0x29, 0x67, 0xe2, 0x77, 0x8e, 0xb1, 0x11,
0x77, 0xa5, 0x5d, 0xc6, 0xf8, 0xa6, 0xa1, 0x48, 0x59, 0x69, 0x89, 0x49, 0x24, 0xcc, 0xb8, 0x2c,
0x3c, 0x6f, 0xbb, 0xe1, 0x69, 0x6b, 0x63, 0xf9, 0xfe, 0x1a, 0xca, 0xa7, 0x15, 0x30, 0xc9, 0xa5,
0xce, 0x92, 0x8f, 0x72, 0x37, 0xf3, 0x52, 0xee, 0x78, 0x82, 0xbf, 0x7d, 0x1a, 0xdd, 0x91, 0xd2,
0x2f, 0xbf, 0x77, 0xfa, 0xf4, 0x69, 0xfc, 0x7e, 0x3f, 0xd0, 0xb5, 0x82, 0x3e, 0xfc, 0xf0, 0xc3,
0x54, 0x54, 0x54, 0x98, 0xf6, 0xe3, 0xa6, 0x9b, 0x6e, 0x62, 0xd3, 0xa6, 0x4d, 0xa4, 0xa5, 0xa5,
0x19, 0xca, 0xda, 0xc7, 0x66, 0x10, 0x93, 0x9d, 0x83, 0xbf, 0xb1, 0x21, 0xa4, 0x8c, 0xa6, 0x73,
0xa1, 0x5d, 0x47, 0xbf, 0x58, 0x28, 0x52, 0x7e, 0x71, 0x45, 0x17, 0x22, 0x62, 0x06, 0xcd, 0xe4,
0x58, 0x42, 0xab, 0xc7, 0xc3, 0x6d, 0xfb, 0xaa, 0x78, 0x66, 0x5a, 0x01, 0x05, 0x4d, 0xa1, 0x9d,
0x02, 0x48, 0x6e, 0x76, 0x12, 0xbb, 0x61, 0x2d, 0x59, 0xcf, 0xbd, 0x8c, 0x7d, 0x4c, 0xe8, 0x15,
0x7a, 0xdb, 0xb6, 0x6d, 0xa6, 0x08, 0x4c, 0x4c, 0x4c, 0x64, 0xed, 0xda, 0xb5, 0xac, 0x58, 0xb1,
0xc2, 0x92, 0xcf, 0x09, 0x17, 0xcf, 0x54, 0x12, 0x28, 0x91, 0x39, 0x9a, 0x40, 0x14, 0xaa, 0x8c,
0xc4, 0x9b, 0x08, 0x47, 0xcc, 0xc2, 0xd3, 0xd6, 0xc6, 0xf2, 0x2f, 0xab, 0xa9, 0x36, 0xf1, 0x38,
0x9b, 0x49, 0x40, 0xd8, 0xed, 0xea, 0x95, 0x12, 0x60, 0xe6, 0xcc, 0x99, 0xec, 0xd9, 0xb3, 0xc7,
0x32, 0x79, 0x00, 0x71, 0x93, 0x8d, 0xc2, 0x36, 0x91, 0xa3, 0x01, 0x99, 0x2a, 0x91, 0xd8, 0xdc,
0x89, 0x96, 0x3b, 0x56, 0x21, 0x92, 0x24, 0xc6, 0x28, 0x9e, 0x0c, 0x9b, 0xcd, 0xc6, 0xca, 0x95,
0x2b, 0x79, 0xef, 0xbd, 0xf7, 0xc8, 0xcb, 0x53, 0x26, 0x97, 0x42, 0x22, 0x36, 0x6f, 0xb2, 0x5a,
0x40, 0x92, 0xa9, 0xd1, 0x55, 0x93, 0x1c, 0x12, 0x46, 0x51, 0x79, 0x38, 0xf0, 0xb4, 0xb5, 0x71,
0x87, 0xc9, 0x10, 0xa7, 0xf3, 0xc8, 0x61, 0x9c, 0xa5, 0xc5, 0x04, 0x5a, 0x06, 0x56, 0x5d, 0x84,
0x22, 0x30, 0x27, 0x27, 0x87, 0xdd, 0xbb, 0x77, 0x53, 0x56, 0x56, 0xa6, 0x24, 0xd9, 0x08, 0x31,
0xe3, 0xc6, 0xa9, 0x05, 0x04, 0x49, 0x1a, 0x52, 0x5d, 0x65, 0x60, 0x4b, 0x3b, 0x2f, 0x6c, 0x07,
0x54, 0x68, 0xf5, 0x78, 0x58, 0xbe, 0xaf, 0x0a, 0x77, 0xae, 0xf1, 0xa6, 0xbb, 0xbf, 0xb1, 0x01,
0xe7, 0xb2, 0x92, 0x01, 0x24, 0x0e, 0x96, 0x0f, 0x5c, 0xb2, 0x64, 0x09, 0x7b, 0xf6, 0xec, 0x61,
0xd6, 0x2c, 0x75, 0x1c, 0x67, 0x06, 0xf6, 0x51, 0x86, 0x6f, 0x48, 0x49, 0x1a, 0x82, 0x44, 0x95,
0x84, 0x50, 0x2c, 0xf5, 0x43, 0x45, 0xab, 0xc7, 0x83, 0xef, 0xae, 0xfb, 0x89, 0x9f, 0x3a, 0xdd,
0x50, 0xd6, 0xdf, 0xd8, 0x80, 0xf3, 0xd6, 0x1f, 0xe2, 0x6f, 0x3a, 0x9b, 0xc1, 0xf1, 0xf5, 0xa9,
0xcc, 0x4a, 0x4d, 0x4d, 0x65, 0xeb, 0xd6, 0xad, 0x94, 0x97, 0x97, 0x9b, 0xda, 0x6c, 0x37, 0x03,
0x2d, 0x39, 0xd9, 0x68, 0x0b, 0x34, 0x51, 0x33, 0xda, 0xf7, 0x44, 0xb3, 0x1e, 0x40, 0x5b, 0x81,
0x48, 0x48, 0x20, 0xeb, 0x77, 0x5b, 0x4d, 0x25, 0x20, 0xfc, 0x4d, 0x2e, 0x5c, 0xb7, 0x2f, 0x26,
0xd0, 0xd2, 0x0c, 0x40, 0x6b, 0x77, 0x62, 0xf6, 0xda, 0x6b, 0xaf, 0x65, 0xef, 0xde, 0xbd, 0x83,
0x26, 0x4a, 0x87, 0xe6, 0x9c, 0x30, 0x1a, 0x40, 0x89, 0x9a, 0x00, 0xf5, 0x52, 0x66, 0x6e, 0x13,
0x7a, 0x48, 0xb0, 0x92, 0xc5, 0xf1, 0x37, 0x36, 0xe0, 0x2c, 0x2d, 0x21, 0xd0, 0xd2, 0xcc, 0xf4,
0xe9, 0xd3, 0xd9, 0xb9, 0x73, 0x27, 0x6f, 0xbe, 0xf9, 0x26, 0x59, 0x51, 0x0a, 0xbe, 0x85, 0x50,
0x8e, 0x2f, 0xa9, 0x01, 0xca, 0x9d, 0x19, 0x79, 0x26, 0xac, 0xba, 0x43, 0xcb, 0xb0, 0x44, 0xa2,
0xf3, 0x08, 0xce, 0xd2, 0x12, 0x1e, 0xba, 0xff, 0x5e, 0xe6, 0xcf, 0x57, 0xbe, 0x85, 0x0e, 0x0d,
0x52, 0xa2, 0xfb, 0x94, 0x65, 0x23, 0x9d, 0x1a, 0x70, 0x4a, 0x25, 0xa1, 0xab, 0x76, 0xfa, 0x23,
0x0c, 0xeb, 0x24, 0x16, 0x13, 0x38, 0xda, 0x14, 0x35, 0x7f, 0xf4, 0x8e, 0x33, 0xa0, 0x87, 0xae,
0x45, 0x17, 0xe0, 0xd7, 0x00, 0xe5, 0x31, 0xa9, 0xe0, 0xe9, 0xb6, 0x48, 0xfb, 0xa5, 0x84, 0x35,
0x12, 0x1b, 0xbb, 0x56, 0xe7, 0x28, 0x91, 0x18, 0x38, 0xe6, 0x56, 0xb6, 0x4b, 0x89, 0x5f, 0x13,
0x06, 0x04, 0xfa, 0x9d, 0xe6, 0x77, 0xbd, 0x22, 0x05, 0xcb, 0x24, 0x96, 0x16, 0xe3, 0x6f, 0x8e,
0xfc, 0xfe, 0x4a, 0xc0, 0xad, 0xae, 0xf8, 0x15, 0x02, 0x8f, 0x06, 0x28, 0x4b, 0xfd, 0xfd, 0x87,
0xbf, 0x8e, 0xa4, 0x4f, 0xa6, 0xd1, 0x45, 0xe2, 0x8b, 0xe6, 0x42, 0x1c, 0x97, 0x13, 0xe7, 0xad,
0x3f, 0x8a, 0xf8, 0x1f, 0xbb, 0xf3, 0x50, 0xad, 0xb2, 0x5d, 0x4a, 0x9c, 0x9a, 0x94, 0x42, 0xf9,
0x36, 0xde, 0xd9, 0x30, 0xe4, 0xa3, 0x14, 0x61, 0x43, 0x73, 0x38, 0x4c, 0x87, 0x38, 0x81, 0xa3,
0x4d, 0xb8, 0x7e, 0xf2, 0xe3, 0x88, 0x8e, 0x44, 0x5f, 0x4d, 0x95, 0x5a, 0x40, 0xd0, 0xac, 0x49,
0x9b, 0xac, 0x54, 0xc9, 0x78, 0x2b, 0xbf, 0x8a, 0xc4, 0x51, 0x82, 0xb0, 0x61, 0xe9, 0x71, 0x6e,
0x72, 0xe1, 0x2a, 0x2d, 0xee, 0x17, 0x6c, 0x0f, 0x05, 0xde, 0x03, 0xfb, 0x94, 0xed, 0x12, 0xd9,
0xa0, 0xe9, 0xba, 0x4d, 0xb9, 0x91, 0x2b, 0xbd, 0x5e, 0x3a, 0xbe, 0xdc, 0x1b, 0x11, 0x87, 0xc2,
0xc5, 0xb9, 0x20, 0x31, 0x78, 0xf2, 0x38, 0xbe, 0xba, 0x1a, 0xa5, 0x8c, 0x40, 0xfc, 0x45, 0x2b,
0xac, 0x3a, 0x72, 0x14, 0x41, 0xb5, 0x4a, 0xf0, 0xcc, 0x67, 0x1f, 0x0f, 0xc9, 0x99, 0x48, 0xc0,
0x12, 0x89, 0xcd, 0xdd, 0x24, 0xba, 0x9c, 0x61, 0xf7, 0xd7, 0xfe, 0xc9, 0x87, 0x46, 0x85, 0xe9,
0xba, 0xdd, 0x17, 0xfb, 0x71, 0xf7, 0x9e, 0x88, 0x7c, 0x57, 0x25, 0x79, 0xfa, 0xad, 0x37, 0xc2,
0x76, 0x24, 0x92, 0xb0, 0x4c, 0xe2, 0xb2, 0x92, 0xb0, 0x49, 0x3c, 0xfd, 0xa7, 0xd7, 0x95, 0xed,
0x02, 0xf6, 0x4d, 0xac, 0xaf, 0xf7, 0x74, 0xef, 0xca, 0x89, 0xdd, 0x2a, 0xe1, 0xce, 0x86, 0x7a,
0x3a, 0xf6, 0x7d, 0x1e, 0x96, 0x23, 0x91, 0x86, 0x55, 0x12, 0x9d, 0xa5, 0xc5, 0x96, 0x57, 0xe7,
0xa0, 0xa7, 0x95, 0xf6, 0x8f, 0xd5, 0x35, 0xd7, 0x52, 0xf2, 0x3a, 0x74, 0x27, 0x12, 0x3a, 0x62,
0xfd, 0x6f, 0x03, 0xa7, 0x55, 0x0a, 0x6d, 0xaf, 0x6d, 0xb7, 0xe4, 0x44, 0x34, 0x61, 0x85, 0xc4,
0xc0, 0xd1, 0x26, 0x9c, 0xcb, 0x4a, 0x2c, 0x91, 0xd8, 0xb6, 0x63, 0x1b, 0x52, 0x51, 0xdd, 0x0a,
0x80, 0x4d, 0xbe, 0x06, 0xdd, 0x04, 0x76, 0x1f, 0xb4, 0x7b, 0x55, 0x69, 0xf4, 0x7f, 0x77, 0x18,
0x46, 0xe6, 0xc3, 0x09, 0xcb, 0x24, 0x96, 0x16, 0xe3, 0x77, 0x1e, 0x31, 0x94, 0x95, 0xc1, 0x00,
0xad, 0x2f, 0x6e, 0x31, 0x12, 0xab, 0xcd, 0xaf, 0x68, 0xda, 0x0f, 0x7d, 0x52, 0x59, 0xba, 0x14,
0xcf, 0x2b, 0x0d, 0xfb, 0x7c, 0x9c, 0x7a, 0xf6, 0x29, 0x95, 0xc8, 0xb0, 0xa3, 0x37, 0xd8, 0xbe,
0x70, 0x9a, 0xa1, 0x6c, 0xa0, 0xa5, 0x19, 0xe7, 0xd2, 0x62, 0xe5, 0x26, 0x11, 0x40, 0xdb, 0xab,
0xdb, 0x0d, 0x57, 0x70, 0x01, 0xcf, 0xf4, 0xfa, 0xd0, 0xf3, 0xa1, 0xa0, 0xda, 0xf9, 0x67, 0x40,
0xb9, 0xe7, 0xd8, 0xba, 0xfd, 0xf9, 0xde, 0x5c, 0xdc, 0x5f, 0x0b, 0x34, 0x87, 0x83, 0xac, 0x67,
0x9e, 0x37, 0x37, 0x12, 0xdd, 0x47, 0x71, 0x96, 0x96, 0x84, 0x24, 0x51, 0xfa, 0x7c, 0x9c, 0x78,
0xea, 0x3f, 0x8c, 0xcc, 0x74, 0x6a, 0x31, 0xfe, 0xde, 0x21, 0xda, 0x4b, 0xa0, 0x80, 0x20, 0x88,
0x0d, 0x2a, 0x4d, 0xe9, 0xf5, 0xe2, 0x5e, 0xfb, 0xaf, 0x86, 0x8e, 0x0e, 0x37, 0x2c, 0x3d, 0xce,
0x0a, 0x12, 0x4f, 0x6e, 0xde, 0x68, 0x9c, 0x98, 0x10, 0xf2, 0x85, 0xbc, 0x03, 0xee, 0xde, 0x02,
0xc2, 0x7e, 0xd9, 0x42, 0x47, 0x62, 0xf0, 0xbf, 0x91, 0xa8, 0xab, 0x0b, 0xdf, 0x7b, 0x87, 0x6f,
0xdf, 0xfe, 0xeb, 0x08, 0x6b, 0xfa, 0xe2, 0x2c, 0x89, 0x83, 0x97, 0x6a, 0xf4, 0x45, 0x0f, 0x89,
0x7d, 0xcf, 0x17, 0x77, 0xd6, 0x1f, 0xe2, 0xa4, 0xf1, 0x14, 0x15, 0x94, 0x41, 0xf9, 0x70, 0xbf,
0x7e, 0xfb, 0xfe, 0xd0, 0x7d, 0xa3, 0xc5, 0x6f, 0x8c, 0xac, 0x1c, 0x5b, 0xfb, 0xe0, 0xa0, 0xbb,
0x64, 0xe7, 0x1a, 0xbd, 0x73, 0xa2, 0x49, 0x12, 0x5d, 0xcb, 0xba, 0x48, 0x94, 0x7e, 0x3f, 0x2d,
0x0f, 0xfc, 0xd4, 0x78, 0xe5, 0x85, 0x97, 0x0b, 0x6a, 0x9a, 0xfb, 0xbd, 0x9e, 0x0c, 0xc8, 0x57,
0xc7, 0x7a, 0xed, 0x4f, 0x60, 0x30, 0x17, 0x06, 0x4f, 0x1e, 0xa7, 0xf9, 0xde, 0x3b, 0xcd, 0x74,
0x38, 0xec, 0xb0, 0x46, 0x62, 0x0b, 0xae, 0x65, 0x25, 0xb8, 0xd7, 0x3c, 0x80, 0xb7, 0xc2, 0xf0,
0x9c, 0x75, 0x87, 0x2e, 0xed, 0xab, 0x06, 0xf4, 0xf7, 0xdd, 0x2f, 0x72, 0x1b, 0x1a, 0xbc, 0x42,
0x1a, 0x9f, 0x8f, 0xf3, 0x1e, 0xd8, 0xc7, 0xb1, 0xb2, 0x07, 0x0d, 0x9d, 0x3c, 0x17, 0xb0, 0x4a,
0xa2, 0xa9, 0x18, 0x57, 0xf0, 0xe8, 0x94, 0xea, 0x86, 0x86, 0x01, 0x7d, 0x0d, 0x26, 0x3b, 0xb9,
0xda, 0xf5, 0x0a, 0xc8, 0x77, 0x8c, 0x6c, 0x7a, 0xb6, 0xbf, 0xc0, 0xf1, 0x27, 0x1e, 0x31, 0xee,
0xfc, 0x1c, 0xc0, 0x0a, 0x89, 0x26, 0x50, 0xeb, 0x48, 0xd0, 0x1f, 0x1d, 0xb4, 0x9f, 0x90, 0x0e,
0xf8, 0xf9, 0x09, 0x06, 0xd9, 0x6a, 0x80, 0x93, 0x9b, 0xff, 0x8b, 0x93, 0x9b, 0x37, 0x0e, 0xc1,
0xb7, 0xe8, 0xa1, 0x8b, 0xc4, 0x6d, 0xa6, 0xe2, 0x44, 0x05, 0x02, 0x42, 0xb0, 0x34, 0xd4, 0x8d,
0x47, 0xca, 0x3d, 0xcb, 0xda, 0x82, 0xac, 0x9b, 0xa5, 0xe0, 0x0f, 0x66, 0x7a, 0x49, 0xbb, 0xf3,
0x1e, 0xd2, 0x7f, 0xfa, 0xf3, 0xde, 0x6d, 0xd0, 0x4f, 0x3e, 0xf9, 0x84, 0xca, 0x4a, 0x65, 0xaa,
0x11, 0x80, 0x85, 0x0b, 0x17, 0x32, 0xce, 0xa8, 0x84, 0x62, 0x88, 0xe8, 0x3a, 0x82, 0xb1, 0x18,
0xef, 0x41, 0x53, 0xa7, 0xf8, 0xfb, 0x43, 0xf0, 0xab, 0xfc, 0x4a, 0xd7, 0x9a, 0xd0, 0xcd, 0x06,
0xa8, 0x99, 0x92, 0xb5, 0x19, 0xb8, 0xc3, 0x4c, 0x5f, 0x29, 0x37, 0x16, 0x33, 0xe6, 0x97, 0x8f,
0x44, 0xa4, 0x1c, 0x2e, 0xd2, 0x08, 0x93, 0xc4, 0x3f, 0x4d, 0xae, 0x72, 0xdd, 0x20, 0x14, 0x5b,
0xbf, 0x86, 0x07, 0x66, 0x03, 0xda, 0x88, 0x15, 0x02, 0xfe, 0xcf, 0x4c, 0x6f, 0x6d, 0xaf, 0x6d,
0xc7, 0x79, 0xeb, 0xcd, 0x51, 0xd9, 0xe0, 0x19, 0x2a, 0x44, 0x62, 0x22, 0x09, 0x33, 0x2d, 0xd5,
0xcb, 0xd4, 0xc6, 0xc6, 0xd9, 0x6f, 0x51, 0x91, 0x07, 0x26, 0x0f, 0x53, 0x1f, 0xb8, 0x30, 0x7b,
0x64, 0x5c, 0x20, 0xf8, 0x31, 0x08, 0xe3, 0x73, 0x0e, 0x80, 0x6d, 0x44, 0x2a, 0xa3, 0xff, 0xfd,
0xd7, 0x38, 0xe6, 0x2d, 0x32, 0x23, 0x1e, 0x75, 0xf8, 0x6a, 0x2a, 0x71, 0x3f, 0xf8, 0x73, 0x0b,
0xa3, 0x4f, 0xba, 0x6d, 0x9a, 0xb8, 0x32, 0xaf, 0xc2, 0x75, 0xc8, 0x48, 0xd2, 0xc2, 0xb5, 0x27,
0x13, 0x72, 0x85, 0x16, 0xfc, 0x08, 0x30, 0x3d, 0x61, 0x25, 0xcf, 0xf9, 0x3e, 0xa3, 0x1f, 0x2c,
0xc3, 0x3e, 0xf6, 0xdc, 0x9c, 0x48, 0x0a, 0x7a, 0x5a, 0x39, 0xf1, 0x9f, 0x8f, 0xd1, 0xfa, 0xf2,
0xf3, 0x60, 0x70, 0x34, 0xb6, 0x0f, 0x5a, 0xd1, 0xe4, 0xd5, 0x3d, 0xd9, 0x16, 0x23, 0x58, 0xbe,
0x78, 0x27, 0xa0, 0xb3, 0x5b, 0x40, 0xb6, 0x59, 0x1d, 0x11, 0x1f, 0x4f, 0xea, 0x2d, 0xcb, 0x48,
0xbb, 0xe3, 0x6e, 0x6c, 0x23, 0x86, 0xe7, 0x3a, 0x41, 0xfd, 0x4c, 0x3b, 0x6d, 0xaf, 0xbc, 0xc4,
0x89, 0x4d, 0x4f, 0x10, 0x6c, 0x55, 0x16, 0x5e, 0x7c, 0x17, 0xad, 0x9a, 0x94, 0x0b, 0x27, 0x55,
0x37, 0xfd, 0xc5, 0xac, 0x82, 0xe5, 0xca, 0xa1, 0xaa, 0x82, 0x9c, 0x1c, 0x4d, 0x0b, 0xec, 0x46,
0x62, 0xe9, 0x1a, 0x22, 0x2d, 0x29, 0x99, 0x94, 0x1b, 0x7f, 0x44, 0xea, 0xe2, 0x52, 0x62, 0xcf,
0x0f, 0xaf, 0x62, 0xd4, 0x08, 0x7e, 0xe7, 0x11, 0x5a, 0x9f, 0x7f, 0x0e, 0xcf, 0xab, 0x2f, 0xa1,
0x7f, 0xfb, 0xad, 0x45, 0x6d, 0xe9, 0x46, 0x63, 0x9e, 0xd9, 0x91, 0xd7, 0x83, 0xb0, 0x4a, 0xaf,
0x2a, 0xa7, 0x4c, 0xc8, 0xb0, 0x11, 0x7c, 0x05, 0xb8, 0xdc, 0xb2, 0xb2, 0x10, 0xc4, 0x4f, 0x9d,
0x8e, 0xe3, 0xba, 0x85, 0x24, 0xcf, 0x9d, 0x47, 0x4c, 0x76, 0x4e, 0x38, 0x2e, 0x74, 0x41, 0x4a,
0x7c, 0x35, 0x95, 0xb4, 0x7f, 0xf0, 0x2e, 0xed, 0xef, 0xbf, 0x4b, 0xc7, 0xfe, 0x2f, 0x94, 0xb5,
0x2c, 0x0a, 0xd4, 0x06, 0x61, 0x51, 0x61, 0x95, 0xcb, 0xe4, 0xcd, 0x3c, 0x67, 0x11, 0x76, 0xed,
0x5a, 0x5d, 0x5e, 0x5e, 0x9c, 0x1e, 0xe3, 0xdb, 0x0c, 0x72, 0x69, 0xb8, 0x36, 0xa0, 0xfb, 0x54,
0xd0, 0x25, 0x97, 0x11, 0x57, 0x50, 0x44, 0x6c, 0xee, 0x44, 0x62, 0x73, 0xcf, 0xc7, 0x3e, 0x6a,
0x0c, 0x9a, 0xa3, 0x7f, 0x91, 0xa4, 0xfe, 0x6d, 0x1b, 0xfe, 0xe6, 0x26, 0x3a, 0xeb, 0x0f, 0xe1,
0xab, 0xa9, 0xa2, 0xf3, 0x50, 0x0d, 0xde, 0x83, 0xfb, 0x87, 0x9e, 0x25, 0x97, 0xbc, 0x15, 0x1b,
0x6f, 0x5f, 0x9c, 0xfb, 0x65, 0x43, 0x58, 0xa7, 0xc0, 0x87, 0x5c, 0xfc, 0x57, 0x5d, 0x98, 0xf9,
0x4f, 0x42, 0x8a, 0xf5, 0x40, 0x78, 0x77, 0xd8, 0x85, 0x80, 0x88, 0x89, 0xc1, 0x96, 0x96, 0x0e,
0x52, 0x27, 0x78, 0xf2, 0x84, 0xd1, 0x49, 0xf2, 0x70, 0x10, 0x40, 0xb2, 0x6e, 0x72, 0xb5, 0x6b,
0x9d, 0x51, 0xa8, 0xa2, 0x42, 0x44, 0xaa, 0x27, 0xbb, 0x6f, 0x75, 0xdb, 0x02, 0x5c, 0x11, 0x09,
0x7b, 0xc3, 0x80, 0x5a, 0x21, 0x58, 0x3a, 0xb9, 0xd2, 0xa5, 0xbe, 0x60, 0xc6, 0x04, 0x22, 0x79,
0x09, 0xad, 0xad, 0xae, 0x30, 0x73, 0xb9, 0xd4, 0xc5, 0xaf, 0x10, 0x44, 0xbe, 0xb4, 0x3f, 0x32,
0xe8, 0x90, 0x88, 0x5f, 0xc7, 0x75, 0xd8, 0x1e, 0xcb, 0x6d, 0x68, 0x50, 0x5f, 0xb8, 0x65, 0x12,
0x11, 0xaf, 0xdf, 0xad, 0xcb, 0xcb, 0x4b, 0x91, 0x31, 0xde, 0x55, 0x12, 0x56, 0x10, 0xe1, 0xc7,
0x7a, 0x08, 0x08, 0x20, 0xe4, 0x56, 0x5d, 0x8f, 0xf9, 0xe5, 0x60, 0x29, 0xa9, 0xa1, 0x20, 0x6a,
0x05, 0xd0, 0x5d, 0x57, 0xe6, 0x89, 0xbb, 0x24, 0x72, 0x05, 0x56, 0x2e, 0x6c, 0x8c, 0x2c, 0xda,
0x81, 0x17, 0x34, 0x9b, 0x78, 0x64, 0xd2, 0x41, 0x67, 0x54, 0xea, 0xf4, 0xa2, 0x5e, 0x41, 0xde,
0x75, 0x7f, 0x7e, 0xc7, 0x0d, 0x42, 0x17, 0x4b, 0x80, 0x05, 0xf4, 0xf9, 0x27, 0x03, 0xd1, 0x82,
0x80, 0xbd, 0x08, 0xb6, 0xd8, 0xbc, 0xb1, 0xbf, 0xef, 0xb9, 0x1c, 0x22, 0x8a, 0x7d, 0x0d, 0x1f,
0x0e, 0x4f, 0xcb, 0x49, 0xf5, 0x75, 0x06, 0x16, 0x09, 0x29, 0xae, 0x45, 0xca, 0xb9, 0x08, 0xf5,
0x29, 0x29, 0xb3, 0xe8, 0xba, 0x3f, 0x5f, 0x7c, 0x22, 0x04, 0x6f, 0xeb, 0x41, 0x6d, 0x87, 0x99,
0x8b, 0x13, 0x23, 0x85, 0x61, 0x25, 0xf0, 0xbb, 0xa8, 0xce, 0x1f, 0x97, 0x8f, 0x4d, 0xbb, 0x04,
0xc9, 0x45, 0x02, 0x39, 0x0d, 0x44, 0x81, 0x80, 0x64, 0x09, 0x0e, 0xba, 0x8e, 0x5f, 0x78, 0x04,
0xe8, 0x52, 0xe2, 0x47, 0xd0, 0x0a, 0x9c, 0x42, 0x72, 0x4a, 0xc0, 0x09, 0xa9, 0x89, 0x46, 0xa1,
0xcb, 0x06, 0xa9, 0x89, 0xaa, 0x80, 0x48, 0xf9, 0xac, 0xa8, 0xa2, 0xe2, 0x9c, 0x6c, 0xd0, 0xfc,
0x3f, 0x32, 0xec, 0x46, 0x2b, 0xb5, 0x8e, 0xcd, 0x89, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
0x44, 0xae, 0x42, 0x60, 0x82
,

View File

@ -808,6 +808,9 @@ struct lws_context_creation_info {
* proxy. NULL means to use the default wsi-based client support */
#endif
#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)
#endif
int rlimit_nofile;
/**< 0 = inherit the initial ulimit for files / sockets from the startup
* environment. Nonzero = try to set the limit for this process.

View File

@ -1014,11 +1014,13 @@ lws_create_vhost(struct lws_context *context,
lwsl_vhost_err(vh, "lws_context_init_server_ssl failed");
goto bail1;
}
#if defined(LWS_WITH_CLIENT)
if (lws_fi(&vh->fic, "vh_create_ssl_cli") ||
lws_context_init_client_ssl(info, vh)) {
lwsl_vhost_err(vh, "lws_context_init_client_ssl failed");
goto bail1;
}
#endif
#if defined(LWS_WITH_SERVER)
lws_context_lock(context, __func__);
if (lws_fi(&vh->fic, "vh_create_srv_init"))

View File

@ -178,6 +178,14 @@ _realloc(void *ptr, size_t size, const char *reason)
allocated -= malloc_usable_size(ptr);
#endif
free(ptr);
#if defined(LWS_PLAT_FREERTOS)
lwsl_debug("%s: free heap %d\n", __func__,
#if defined(LWS_AMAZON_RTOS)
(unsigned int)xPortGetFreeHeapSize() - (int)size);
#else
(unsigned int)esp_get_free_heap_size() - (int)size);
#endif
#endif
}
return NULL;

View File

@ -82,20 +82,26 @@ if (LWS_WITH_DLO)
misc/dlo/dlo-font-mcufont.c
misc/dlo/dlo-text.c)
if (LWS_WITH_UPNG)
list(APPEND SOURCES
misc/dlo/dlo-png.c)
endif()
if (LWS_WITH_SECURE_STREAMS AND LWS_WITH_CLIENT)
list(APPEND SOURCES
misc/dlo/dlo-ss.c)
endif()
if (LWS_WITH_JPEG)
list(APPEND SOURCES
misc/dlo/dlo-jpeg.c)
endif()
if (LWS_WITH_UPNG AND LWS_WITH_SECURE_STREAMS AND LWS_WITH_CLIENT)
list(APPEND SOURCES
misc/dlo/dlo-png.c)
endif()
if (LWS_WITH_SECURE_STREAMS)
list(APPEND SOURCES
misc/dlo/dlo-ss.c)
endif()
if (LWS_WITH_JPEG AND LWS_WITH_SECURE_STREAMS AND LWS_WITH_CLIENT)
list(APPEND SOURCES
misc/dlo/dlo-jpeg.c)
endif()
if (LWS_WITH_LHP AND LWS_WITH_DLO AND LWS_WITH_SECURE_STREAMS AND LWS_WITH_CLIENT)
list(APPEND SOURCES
misc/dlo/dlo-lhp.c
)
endif()
endif() #dlo

976
lib/misc/dlo/dlo-lhp.c Normal file
View File

@ -0,0 +1,976 @@
/*
* lws abstract display
*
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*
* Display List LHP layout
*
* The basic flow is logical elements exist in a stack as they are parsed, the
* job of lhp_displaylist_layout() is to translate these into a tree of DLOs,
* having parent-child relationships with (x,y) of the DLO box being an offset
* into a local origin formed from the DLO parent box (which in turn may be
* a child with its origin defined by its parent, etc).
*
* The element stack only exists while it and its parent elements are being
* parsed, it goes out of scope as the element ends. So we must create related
* DLOs by stream-parsing, while we still have everything relevant to hand.
*
* This gets us out of having to run around fixing up DLO (x,y) as we do the
* layout, since the DLO parent-child relationships are static even if their
* content size isn't.
*
*
*/
#include <private-lib-core.h>
#include "private-lib-drivers-display-dlo.h"
/*
* HTML Elements we can deal with for layout
*/
enum {
/* 0 is no match */
LHP_ELEM_BR = 1,
LHP_ELEM_DIV,
LHP_ELEM_TABLE,
LHP_ELEM_TR,
LHP_ELEM_TD,
LHP_ELEM_IMG,
};
static const struct {
const char *elem;
uint8_t elem_len;
} elems[] = {
{ "br", 2 },
{ "div", 3 },
{ "table", 5 },
{ "tr", 2 },
{ "td", 2 },
{ "img", 3 },
};
/*
* Newline moves the psb->cury to cover text that was already placed using the
* old psb->cury as to top of it. So a final newline on the last line of text
* does not create an extra blank line.
*/
static const lws_fx_t two = { 2,0 };
static void
newline(lhp_ctx_t *ctx, lhp_pstack_t *psb, lhp_pstack_t *ps,
lws_displaylist_t *dl)
{
int16_t group_baseline = 9999, group_height = 0;
lws_fx_t line_height = { 0, 0 }, w, add, ew, t1;
const struct lcsp_atr *a;
lws_dlo_t *dlo, *d, *d1;
int t = 0;
if (!psb || !ps) {
lwsl_err("%s: psb/ps NULL!\n", __func__);
return;
}
dlo = (lws_dlo_t *)psb->dlo;
lws_fx_add(&w, lws_csp_px(ps->css_padding[CCPAS_LEFT], ps),
lws_csp_px(ps->css_padding[CCPAS_RIGHT], ps));
if (lws_fx_comp(&w, &psb->widest) > 0)
psb->widest = w;
if (!dlo || !dlo->children.tail)
return;
d = lws_container_of(dlo->children.tail, lws_dlo_t, list);
/*
* We may be at the end of a line of text
*
* Figure out the biggest height on the line, and the total width
*/
while (d) {
t |= d->_destroy == lws_display_dlo_text_destroy;
/* find the "worst" height on the line */
if (lws_fx_comp(&d->box.h, &line_height) > 0)
line_height = d->box.h;
if (d->_destroy == lws_display_dlo_text_destroy) {
lws_dlo_text_t *text = lws_container_of(d,
lws_dlo_text_t, dlo.list);
if (text->font_y_baseline < group_baseline)
group_baseline = text->font_y_baseline;
if (text->font_height > group_height)
group_height = text->font_height;
}
if (!d->flag_runon)
break;
d = lws_container_of(d->list.prev, lws_dlo_t, list);
};
/* mark the related text dlos with information about group bl and h,
* offset box y to align to group baseline if necessary */
d1 = d;
while (d) {
if (d->_destroy == lws_display_dlo_text_destroy) {
lws_dlo_text_t *t1 = lws_container_of(d1,
lws_dlo_text_t, dlo.list);
lws_fx_t ft;
t1->group_height = group_height;
t1->group_y_baseline = group_baseline;
ft.whole = (t1->font_height - t1->font_y_baseline) -
(group_height - group_baseline);
ft.frac = 0;
lws_fx_sub(&t1->dlo.box.y, &t1->dlo.box.y, &ft);
}
if (!d1->list.next)
break;
d1 = lws_container_of(d1->list.next, lws_dlo_t, list);
};
w = psb->curx;
ew = ctx->ic.wh_px[0];
if (psb->css_width && psb->css_width->unit != LCSP_UNIT_NONE)
ew = *lws_csp_px(psb->css_width, psb);
lws_fx_sub(&ew, &ew, lws_csp_px(ps->css_margin[CCPAS_RIGHT], ps));
lws_fx_sub(&ew, &ew, lws_csp_px(ps->css_padding[CCPAS_RIGHT], ps));
if (lws_fx_comp(&w, &psb->widest) > 0)
psb->widest = w;
if (!t) /* no textual children to newline (eg, <div></div>) */
return;
/*
* now is our chance to fix up dlos that are part of the line for
* text-align rule of the container.
*/
a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_TEXT_ALIGN);
if (a) {
switch (a->propval) {
case LCSP_PROPVAL_CENTER:
add = *lws_csp_px(ps->css_padding[CCPAS_LEFT], ps);
lws_fx_sub(&t1, &ew, &w);
lws_fx_div(&t1, &t1, &two);
lws_fx_add(&add, &add, &t1);
goto fixup;
case LCSP_PROPVAL_RIGHT:
lws_fx_sub(&add, &ew, &w);
lws_fx_sub(&add, &add, &d->box.x);
fixup:
lws_fx_add(&t1, &add, &w);
if (lws_fx_comp(&t1, &psb->widest) > 0)
psb->widest = t1;
do {
lws_fx_add(&d->box.x, &d->box.x, &add);
if (!d->list.next)
break;
d = lws_container_of(d->list.next, lws_dlo_t,
list);
} while (1);
break;
default:
break;
}
}
lws_fx_add(&psb->cury, &psb->cury, &line_height);
lws_fx_set(psb->curx, 0, 0);
psb->dlo_set_curx = NULL;
psb->dlo_set_cury = NULL;
psb->runon = 0;
}
void
lhp_set_dlo_padding_margin(lhp_pstack_t *ps, lws_dlo_t *dlo)
{
int n;
for (n = 0; n < 4; n ++) {
dlo->margin[n] = *lws_csp_px(ps->css_margin[n], ps);
dlo->padding[n] = *lws_csp_px(ps->css_padding[n], ps);
}
}
void
lhp_set_dlo_adjust_to_contents(lhp_pstack_t *ps)
{
lhp_pstack_t *psb = lws_container_of(ps->list.prev, lhp_pstack_t, list);
lws_dlo_dim_t dim;
lws_dlo_contents(ps->dlo, &dim);
lws_display_dlo_adjust_dims(ps->dlo, &dim);
if (lws_fx_comp(&dim.w, &psb->widest) > 0)
psb->widest = dim.w;
if (lws_fx_comp(&dim.h, &psb->deepest) > 0)
psb->deepest = dim.h;
}
static void
runon(lhp_pstack_t *ps, lws_dlo_t *dlo)
{
dlo->flag_runon = (uint8_t)(ps->runon & 1);
ps->runon = 1;
}
/*
* Handle end-of-div, table, tr, td retrospective dlo dimension adjustment
*/
int
lws_lhp_dlo_adjust_div_type_element(lhp_ctx_t *ctx, lhp_pstack_t *psb,
lhp_pstack_t *pst, lhp_pstack_t *ps,
int elem_match)
{
lws_dlo_rect_t *rect = (lws_dlo_rect_t *)ps->dlo;
lws_fx_t t1, w, wd;
char rd = 0;
/* need this to get bottom clearance for next block */
lws_fx_add(&ps->cury, &ps->cury,
lws_csp_px(ps->css_padding[CCPAS_BOTTOM], ps));
if (psb && ps->dlo &&
ps->css_margin[CCPAS_LEFT]->propval == LCSP_PROPVAL_AUTO &&
ps->css_margin[CCPAS_RIGHT]->propval == LCSP_PROPVAL_AUTO) {
lws_dlo_rect_t *re = (lws_dlo_rect_t *)ps->dlo;
/* h-center a div... find the available h space first */
w = ctx->ic.wh_px[LWS_LHPREF_WIDTH];
if (psb->css_width &&
psb->css_width->propval != LCSP_PROPVAL_AUTO)
w = *lws_csp_px(psb->css_width, psb);
lws_fx_sub(&t1, &w, &re->dlo.box.w);
lws_fx_div(&t1, &t1, &two);
lws_fx_sub(&wd, &t1, &re->dlo.box.x);
lws_fx_add(&re->dlo.box.x, &re->dlo.box.x, &wd);
}
/* fix up the dimensions of div rectangle */
if (!rect) {
lwsl_notice("%s: elem %d: NO RECT\n", __func__, elem_match);
return 1;
}
lhp_set_dlo_adjust_to_contents(ps);
/* if a td, deal with columnar changes in width */
if (ps->dlo->col_list.owner) {
lhp_table_col_t *tc = lws_container_of(
ps->dlo->col_list.owner,
lhp_table_col_t, col_dlos);
lws_fx_t wdelta, ow;
ow = tc->width;
lws_fx_set(tc->width, 0, 0);
/* discover the new width of column */
lws_start_foreach_dll(struct lws_dll2 *, c1,
lws_dll2_get_head(&tc->col_dlos)) {
lws_dlo_t *dloc = lws_container_of(c1,
lws_dlo_t, col_list);
if (lws_fx_comp(&dloc->box.w, &tc->width) > 0)
tc->width = dloc->box.w;
} lws_end_foreach_dll(c1);
/* new width - old column width */
lws_fx_sub(&wdelta, &tc->width, &ow);
/*
* Update all dlos in our column (except
* ourselves) with the increased column width
*/
lws_start_foreach_dll(struct lws_dll2 *, cold,
lws_dll2_get_head(&tc->col_dlos)) {
lws_dlo_t *dloc = lws_container_of(cold,
lws_dlo_t, col_list);
if (dloc != &rect->dlo)
/* we already did this for the
* affected dlo */
lws_fx_add(&dloc->box.w,
&dloc->box.w, &wdelta);
rd = 1;
/* ... and then all of their row-mates
* to the right also need their
* x adjusting then */
while (dloc->row_list.next) {
dloc = lws_container_of(
dloc->row_list.next,
lws_dlo_t, row_list);
lws_fx_add(&dloc->box.x,
&dloc->box.x, &wdelta);
}
} lws_end_foreach_dll(cold);
}
/* if a td, deal with row changes in height */
if (ps->dlo->row_list.owner) {
lhp_table_row_t *tr = lws_container_of(
ps->dlo->row_list.owner,
lhp_table_row_t, row_dlos);
lws_fx_t hdelta, oh;
oh = tr->height;
lws_fx_set(tr->height, 0, 0);
/* discover the new width of column */
lws_start_foreach_dll(struct lws_dll2 *, r1,
lws_dll2_get_head(&tr->row_dlos)) {
lws_dlo_t *dlor = lws_container_of(r1,
lws_dlo_t, row_list);
if (lws_fx_comp(&dlor->box.h, &tr->height) > 0)
tr->height = dlor->box.h;
} lws_end_foreach_dll(r1);
/* new height - old row height */
lws_fx_sub(&hdelta, &tr->height, &oh);
/*
* Update all dlos in our row (except
* ourselves) with the increased row height
*/
lws_start_foreach_dll(struct lws_dll2 *, rold,
lws_dll2_get_head(&tr->row_dlos)) {
lws_dlo_t *dlor = lws_container_of(rold,
lws_dlo_t, row_list);
if (dlor != &rect->dlo)
/* we already did this for the
* affected dlo */
lws_fx_add(&dlor->box.h,
&dlor->box.h, &hdelta);
/* ... so all of their col-mates below
* also need their y adjusting then */
while (dlor->col_list.next) {
dlor = lws_container_of(
dlor->col_list.next,
lws_dlo_t, col_list);
lws_fx_add(&dlor->box.y,
&dlor->box.y, &hdelta);
}
rd = 1;
} lws_end_foreach_dll(rold);
}
/*
* Row dimensions have to be reassessed?
*/
if (rd) {
lws_start_foreach_dll(struct lws_dll2 *, ro,
lws_dll2_get_head(&pst->dlo->children)) {
lws_dlo_t *dlo = lws_container_of(ro, lws_dlo_t, list);
lws_dlo_dim_t dim;
lws_dlo_contents(dlo, &dim);
lws_display_dlo_adjust_dims(dlo, &dim);
} lws_end_foreach_dll(ro);
}
if (psb && ps->css_position->propval != LCSP_PROPVAL_ABSOLUTE) {
/* parent should account for our margin */
if (elem_match == LHP_ELEM_DIV) {
lws_fx_add(&psb->curx, &psb->curx, &ps->widest);
/* now we applied ps->widest, reset it */
lws_fx_set(ps->widest, 0, 0);
psb->dlo_set_curx = ps->dlo;
} else {
/* needed for margin between table cells */
lws_fx_add(&psb->curx, &psb->curx, lws_csp_px(ps->css_margin[CCPAS_LEFT], ps));
lws_fx_add(&psb->curx, &psb->curx, lws_csp_px(ps->css_margin[CCPAS_RIGHT], ps));
}
if (elem_match != LHP_ELEM_TD) {
if (ps->css_display->propval != LCSP_PROPVAL_INLINE_BLOCK) {
lws_fx_add(&psb->cury, &psb->cury, &ps->dlo->box.h);
psb->dlo_set_cury = ps->dlo;
}
// lws_fx_add(&psb->cury, &psb->cury, &ps->dlo->margin[CCPAS_BOTTOM]);
} else
ps->widest = ps->dlo->box.w;
}
return 0;
}
/*
* Generic LHP displaylist object layout callback... converts html elements
* into DLOs on the display list
*/
lws_stateful_ret_t
lhp_displaylist_layout(lhp_ctx_t *ctx, char reason)
{
lhp_pstack_t *psb = NULL, *pst = NULL, *psp = NULL,
*ps = lws_container_of(ctx->stack.tail, lhp_pstack_t, list);
struct lws_context *cx = (struct lws_context *)ctx->user1;
lws_dl_rend_t *drt = (lws_dl_rend_t *)ctx->user;
lws_fx_t br[4], t1, indent, ox, w, h;
const lws_display_font_t *f = NULL;
lhp_table_col_t *tcol = NULL;
lhp_table_row_t *trow = NULL;
lws_dlo_t *abut_x, *abut_y;
uint32_t col = 0xff000000;
lws_dlo_text_t *txt;
const lcsp_atr_t *a;
lws_dlo_image_t u;
const char *pname;
char lastm = 0;
int elem_match;
lws_box_t box;
char url[128];
int n, s = 0;
/* default font choice */
lws_font_choice_t fc = {
.family_name = "term, serif",
.fixed_height = 16,
.weight = 400,
};
if (!ps->font) {
a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_FONT_SIZE);
if (a)
fc.fixed_height = (uint16_t)a->u.i.whole;
a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_FONT_FAMILY);
if (a)
fc.family_name = (const char *)&a[1];
a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_FONT_WEIGHT);
if (a) {
switch (a->propval) {
case LCSP_PROPVAL_BOLD:
fc.weight = 700;
break;
case LCSP_PROPVAL_BOLDER:
fc.weight = 800;
break;
default:
if (a->u.i.whole)
fc.weight = (uint16_t)a->u.i.whole;
break;
}
}
ps->font = lws_font_choose(cx, &fc);
}
f = ps->font;
psb = lws_css_get_parent_block(ctx, ps);
elem_match = 0;
for (n = 0; n < (int)LWS_ARRAY_SIZE(elems); n++)
if (ctx->npos == elems[n].elem_len &&
!memcmp(ctx->buf, elems[n].elem, elems[n].elem_len))
elem_match = n + 1;
switch (reason) {
case LHPCB_CONSTRUCTED:
case LHPCB_DESTRUCTED:
case LHPCB_COMPLETE:
case LHPCB_FAILED:
break;
case LHPCB_ELEMENT_START:
switch (elem_match) {
case LHP_ELEM_BR:
newline(ctx, psb, ps, drt->dl);
break;
case LHP_ELEM_TR:
if (!psb)
break;
pst = ps;
while (pst && !pst->is_table)
pst = lws_css_get_parent_block(ctx, pst);
if (!pst) {
lwsl_err("%s: td: no table found\n", __func__);
break;
}
pst->curx.whole = 0;
pst->curx.frac = 0;
psb->dlo_set_curx = NULL;
trow = lws_zalloc(sizeof(*trow), __func__);
if (!trow) {
lwsl_err("%s: OOM\n", __func__);
return LWS_SRET_FATAL;
}
lws_dll2_add_tail(&trow->list, &pst->dlo->table_rows);
trow = NULL;
pst->td_idx = 0;
goto do_rect;
case LHP_ELEM_TD:
if (!psb) {
lwsl_err("%s: td: no psb found\n", __func__);
break;
}
pst = ps;
while (pst && !pst->is_table)
pst = lws_css_get_parent_block(ctx, pst);
if (!pst) {
lwsl_err("%s: td: no table found\n", __func__);
break;
}
if (pst->td_idx >= (int)pst->dlo->table_cols.count) {
tcol = lws_zalloc(sizeof(*tcol), __func__);
if (!tcol) {
lwsl_err("%s: OOM\n", __func__);
return LWS_SRET_FATAL;
}
lws_dll2_add_tail(&tcol->list, &pst->dlo->table_cols);
} else {
tcol = lws_container_of(pst->dlo->table_cols.head, lhp_table_col_t, list);
n = pst->td_idx;
while (n--)
tcol = lws_container_of(tcol->list.next, lhp_table_col_t, list);
}
if (pst->dlo->table_rows.tail)
trow = lws_container_of(pst->dlo->table_rows.tail, lhp_table_row_t, list);
goto do_rect;
case LHP_ELEM_TABLE:
ps->is_table = 1;
/* fallthru */
case LHP_ELEM_DIV:
do_rect:
lws_fx_set(box.x, 0, 0);
lws_fx_set(box.y, 0, 0);
lws_fx_set(box.h, 0, 0);
lws_fx_set(box.w, 0, 0);
abut_x = NULL;
abut_y = NULL;
if (ps->css_position->propval == LCSP_PROPVAL_ABSOLUTE) {
box.x = *lws_csp_px(ps->css_pos[CCPAS_LEFT], ps);
box.y = *lws_csp_px(ps->css_pos[CCPAS_TOP], ps);
} else {
if (psb) {
/* margin adjusts our child box origin */
lws_fx_add(&box.x, &psb->curx,
lws_csp_px(ps->css_margin[CCPAS_LEFT], ps));
box.y = psb->cury;
abut_x = psb->dlo_set_curx;
abut_y = psb->dlo_set_cury;
//lws_fx_add(&box.y, &psb->cury,
// lws_csp_px(ps->css_margin[CCPAS_TOP], ps));
}
}
/* If there's an explicit width, try to go with that */
if (ps->css_width &&
ps->css_width->unit != LCSP_UNIT_NONE &&
lws_fx_comp(lws_csp_px(ps->css_width, ps), &box.w) < 0)
box.w = *lws_csp_px(ps->css_width, ps);
/* !!! we rely on this being nonzero to not infinite loop at text layout */
lws_fx_add(&box.w, &box.w,
lws_csp_px(ps->css_padding[CCPAS_LEFT], ps));
lws_fx_add(&box.w, &box.w,
lws_csp_px(ps->css_padding[CCPAS_RIGHT], ps));
ps->drt.w = box.w;
ps->curx = *lws_csp_px(ps->css_padding[CCPAS_LEFT], ps);
ps->cury = *lws_csp_px(ps->css_padding[CCPAS_TOP], ps);
memset(br, 0, sizeof(br));
if (ps->css_border_radius[0])
br[0] = *lws_csp_px(ps->css_border_radius[0], ps);
if (ps->css_border_radius[1])
br[1] = *lws_csp_px(ps->css_border_radius[1], ps);
if (ps->css_border_radius[2])
br[2] = *lws_csp_px(ps->css_border_radius[2], ps);
if (ps->css_border_radius[3])
br[3] = *lws_csp_px(ps->css_border_radius[3], ps);
psp = lws_container_of(ps->list.prev, lhp_pstack_t, list);
ps->dlo = (lws_dlo_t *)lws_display_dlo_rect_new(drt->dl,
ps->css_position->propval == LCSP_PROPVAL_ABSOLUTE ? NULL : psp->dlo,
&box, br, ps->css_background_color ?
ps->css_background_color->u.rgba : 0);
if (!ps->dlo) {
lwsl_err("%s: FAILED to create rect\n", __func__);
return LWS_SRET_FATAL;
}
ps->dlo->abut_x = abut_x;
ps->dlo->abut_y = abut_y;
if (psb)
lws_fx_add(&psb->curx, &psb->curx,
lws_csp_px(ps->css_margin[CCPAS_RIGHT], ps));
if (tcol)
lws_dll2_add_tail(&ps->dlo->col_list, &tcol->col_dlos);
if (trow)
lws_dll2_add_tail(&ps->dlo->row_list, &trow->row_dlos);
lws_lhp_tag_dlo_id(ctx, ps, ps->dlo);
lhp_set_dlo_padding_margin(ps, ps->dlo);
break;
case LHP_ELEM_IMG:
pname = lws_html_get_atr(ps, "src", 3);
if (!psb)
break;
if (ps->css_position->propval == LCSP_PROPVAL_ABSOLUTE) {
box.x = *lws_csp_px(ps->css_pos[CCPAS_LEFT], ps);
box.y = *lws_csp_px(ps->css_pos[CCPAS_TOP], ps);
} else {
box.x = psb->curx;
box.y = psb->cury;
}
lws_fx_set(box.x, 0, 0);
lws_fx_set(box.y, 0, 0);
if (psb) {
lws_fx_add(&box.x, &box.x,
lws_csp_px(psb->css_margin[CCPAS_LEFT], psb));
lws_fx_add(&box.y, &box.y,
lws_csp_px(psb->css_margin[CCPAS_TOP], psb));
}
box.h = ctx->ic.wh_px[1]; /* placeholder */
lws_fx_sub(&box.w, &ctx->ic.wh_px[0], &box.x);
if (ps->css_width &&
lws_fx_comp(lws_csp_px(ps->css_width, ps), &box.w) > 0)
box.w = *lws_csp_px(ps->css_width, ps);
if (lws_http_rel_to_url(url, sizeof(url),
ctx->base_url, pname))
break;
if (lws_dlo_ss_find(cx, url, &u))
break;
lws_lhp_tag_dlo_id(ctx, ps, (lws_dlo_t *)(u.u.dlo_jpeg));
w = *lws_csp_px(lws_css_cascade_get_prop_atr(ctx,
LCSP_PROP_WIDTH), ps);
h = *lws_csp_px(lws_css_cascade_get_prop_atr(ctx,
LCSP_PROP_HEIGHT), ps);
if (!w.whole || !h.whole) {
w = ((lws_dlo_t *)(u.u.dlo_jpeg))->box.w;
h = ((lws_dlo_t *)(u.u.dlo_jpeg))->box.w;
}
if (psb) {
lws_fx_add(&psb->curx, &psb->curx, &w);
lws_fx_add(&psb->cury, &psb->cury, &h);
psb->dlo_set_curx = ps->dlo;
psb->dlo_set_cury = ps->dlo;
if (lws_fx_comp(&psb->curx, &psb->widest) > 0)
psb->widest = psb->curx;
}
break;
default:
break;
}
break;
case LHPCB_ELEMENT_END:
if (ctx->npos == 2 && ctx->buf[0] == 'h' &&
ctx->buf[1] > '0' && ctx->buf[1] <= '6') {
if (!psb)
break;
newline(ctx, psb, ps, drt->dl);
lws_fx_add(&psb->cury, &psb->cury,
lws_csp_px(ps->css_padding[CCPAS_BOTTOM], ps));
lws_fx_add(&psb->cury, &psb->cury,
lws_csp_px(ps->css_margin[CCPAS_BOTTOM], ps));
break;
}
switch (elem_match) {
case LHP_ELEM_TR:
pst = ps;
while (pst && !pst->is_table)
pst = lws_css_get_parent_block(ctx, pst);
if (!pst) {
lwsl_err("%s: /td: no table\n", __func__);
break;
}
pst->tr_idx++;
pst->td_idx = 0;
goto do_end_rect;
case LHP_ELEM_TD:
pst = ps;
while (pst && !pst->is_table)
pst = lws_css_get_parent_block(ctx, pst);
if (!pst) {
lwsl_err("%s: /td: no table\n", __func__);
break;
}
pst->td_idx++;
goto do_end_rect;
/* fallthru */
case LHP_ELEM_TABLE:
case LHP_ELEM_DIV:
do_end_rect:
ox = ps->curx;
if (lws_fx_comp(&ox, &ps->widest) > 0)
ps->widest = ox;
newline(ctx, ps, ps, drt->dl);
if (lws_lhp_dlo_adjust_div_type_element(ctx, psb, pst, ps, elem_match))
break;
if (lws_fx_comp(&ps->curx, &ps->widest) > 0)
ps->widest = ps->curx;
/* move parent on according to used area plus bottom margin */
if (psb && ps->css_position->propval != LCSP_PROPVAL_ABSOLUTE) {
switch (ps->css_display->propval) {
case LCSP_PROPVAL_BLOCK:
case LCSP_PROPVAL_TABLE:
case LCSP_PROPVAL_TABLE_ROW:
lws_fx_set(psb->curx, 0, 0);
psb->dlo_set_curx = NULL;
if (ps->css_display->propval == LCSP_PROPVAL_TABLE_ROW)
break;
lws_fx_add(&psb->cury, &psb->cury, lws_csp_px(ps->css_margin[CCPAS_BOTTOM], ps));
break;
case LCSP_PROPVAL_INLINE_BLOCK:
//lws_fx_add(&psb->cury, &psb->cury, lws_csp_px(ps->css_margin[CCPAS_BOTTOM], ps));
lws_fx_add(&psb->curx, &psb->curx, &ps->widest);
lws_fx_add(&psb->curx, &psb->curx, lws_csp_px(ps->css_margin[CCPAS_RIGHT], ps));
lws_fx_set(ps->widest, 0, 0);
psb->dlo_set_curx = ps->dlo;
psb->dlo_set_cury = ps->dlo;
break;
default:
lws_fx_add(&psb->curx, &psb->curx, &ps->widest);
psb->dlo_set_curx = ps->dlo;
break;
}
if (lws_fx_comp(&psb->curx, &psb->widest) > 0)
psb->widest = psb->curx;
}
ps->dlo = NULL;
break;
default:
break;
}
break;
case LHPCB_CONTENT:
if (!ps->css_display ||
ps->css_display->propval == LCSP_PROPVAL_NONE)
break;
if (ps->css_color)
col = ps->css_color->u.rgba;
a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_FONT_SIZE);
if (a)
fc.fixed_height = (uint16_t)a->u.i.whole;
a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_FONT_FAMILY);
if (a)
fc.family_name = (const char *)&a[1];
for (n = 0; n < ctx->npos; n++)
if (ctx->buf[n] == '\n')
s++;
if (s == ctx->npos)
return 0;
/*
* Let's not deal with things off the bottom of the display
* surface.
*/
if (psb && psb->cury.whole > ctx->ic.wh_px[LWS_LHPREF_HEIGHT].whole)
return 0;
if (!psb)
return 0;
f = lws_font_choose(cx, &fc);
n = s;
while (n < ctx->npos) {
int m;
lws_fx_set(box.x, 0, 0);
lws_fx_set(box.y, 0, 0);
lws_fx_set(box.w, 0, 0);
if (n == s && !(psb->runon & 1)) {
lws_fx_set(indent, 0, 0);
} else
indent = psb->curx;
lws_fx_add(&box.x, &indent,
lws_csp_px(ps->css_padding[CCPAS_LEFT], ps));
lws_fx_add(&box.y, &box.y, &psb->cury);
box.h.whole = (int32_t)f->choice.fixed_height;
box.h.frac = 0;
if (psb->css_width &&
(psb->css_width->propval == LCSP_PROPVAL_AUTO ||
ps->css_width->propval == LCSP_PROPVAL_AUTO)) {
//lws_fx_sub(&box.w, &ctx->ic.wh_px[0], &box.x);
box.w = ctx->ic.wh_px[0];
} else {
lws_fx_sub(&t1, &psb->drt.w,
lws_csp_px(psb->css_padding[CCPAS_LEFT], psb));
lws_fx_sub(&box.w, &t1,
lws_csp_px(psb->css_padding[CCPAS_RIGHT], psb));
}
if (!box.w.whole)
lws_fx_sub(&box.w, &ctx->ic.wh_px[0], &box.x);
assert(psb);
txt = lws_display_dlo_text_new(drt->dl,
(lws_dlo_t *)psb->dlo, &box, f);
if (!txt) {
lwsl_err("%s: failed to alloc text\n", __func__);
return 1;
}
runon(psb, &txt->dlo);
txt->flags |= LWSDLO_TEXT_FLAG_WRAP;
lhp_set_dlo_padding_margin(ps, &txt->dlo);
// a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_TEXT_ALIGN);
//lwsl_hexdump_notice(ctx->buf + n, (size_t)(ctx->npos - n));
m = lws_display_dlo_text_update(txt, col, indent,
ctx->buf + n,
(size_t)(ctx->npos - n));
if (m < 0) {
lwsl_err("text_update ret %d\n", m);
break;
}
if (m == 2 && lastm)
return 0;
lastm = m == 2;
n = (int)((size_t)n + txt->text_len);
txt->dlo.box.w = txt->bounding_box.w;
txt->dlo.box.h = txt->bounding_box.h;
lws_fx_add(&psb->curx, &psb->curx, &txt->bounding_box.w);
psb->dlo_set_curx = &txt->dlo;
//lwsl_user("%s: bounding width %d, m: %d, text %.*s\n",
// __func__, txt->bounding_box.w.whole, m,
// ctx->npos, ctx->buf);
if (m > 0) { /* wrapping */
newline(ctx, psb, ps, drt->dl);
lws_fx_set(ps->curx, 0, 0);
lws_fx_set(psb->curx, 0, 0);
psb->dlo_set_curx = NULL;
lws_fx_add(&ps->cury, &ps->cury, &txt->bounding_box.h);
psb->dlo_set_cury = &txt->dlo;
}
}
break;
case LHPCB_COMMENT:
break;
}
return 0;
}

View File

@ -34,6 +34,7 @@ LWS_SS_USER_TYPEDEF
lws_sorted_usec_list_t sul; /* used for initial metadata cb */
lws_dlo_image_t u; /* we use the lws_flow_t in here */
lws_dll2_t active_asset_list; /*cx->active_assets*/
uint8_t type; /* LWSDLOSS_TYPE_ */
char url[96];
} dloss_t;
@ -47,24 +48,40 @@ lws_lhp_image_dimensions_cb(lws_sorted_usec_list_t *sul)
dloss_t *m = lws_container_of(sul, dloss_t, sul);
lws_display_render_state_t *rs = lws_container_of(m->ssevsul,
lws_display_render_state_t, sul);
lws_dlo_dim_t dim;
lws_dlo_t *dlo = &m->u.u.dlo_png->dlo;
if (m->u.failed) {
m->u.u.dlo_png->dlo.box.w.whole = -1;
m->u.u.dlo_png->dlo.box.h.whole = -1;
dlo->box.w.whole = -1;
dlo->box.h.whole = -1;
lwsl_notice("%s: Failing %s\n", __func__, m->url);
} else {
m->u.u.dlo_png->dlo.box.w.whole = (int32_t)lws_dlo_image_width(&m->u);
m->u.u.dlo_png->dlo.box.h.whole = (int32_t)lws_dlo_image_height(&m->u);
dlo->box.w.whole = (int32_t)lws_dlo_image_width(&m->u);
dlo->box.h.whole = (int32_t)lws_dlo_image_height(&m->u);
lwsl_notice("%s: setting dlo box %d x %d\n", __func__,
(int)m->u.u.dlo_png->dlo.box.w.whole, (int)m->u.u.dlo_png->dlo.box.h.whole);
lwsl_err("%s: setting dlo box %d x %d\n", __func__,
(int)dlo->box.w.whole, (int)dlo->box.h.whole);
#if 1
lws_dlo_contents(dlo, &dim);
lws_display_dlo_adjust_dims(dlo, &dim);
if (dlo->list.owner) {
dlo = lws_container_of(dlo->list.owner, lws_dlo_t, children);
lws_dlo_contents(dlo, &dim);
lws_display_dlo_adjust_dims(dlo, &dim);
}
#endif
}
if (rs->html != 1) {
lws_sul_schedule(lws_ss_get_context(m->ss), 0, m->ssevsul, m->on_rx, 1);
return;
}
/* we are resuming the html parsing */
lws_lhp_ss_html_parse_from_lhp(m->lhp);
}
/* secure streams payload interface */
@ -77,6 +94,28 @@ dloss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
lwsl_info("%s: %u\n", __func__, (unsigned int)len);
if (m->type == LWSDLOSS_TYPE_CSS) {
m->lhp->finish_css = !!(flags & LWSSS_FLAG_EOM);
m->lhp->is_css = 1;
r = lws_lhp_parse(m->lhp, &buf, &len);
m->lhp->is_css = 0;
if (flags & LWSSS_FLAG_EOM)
lws_dll2_remove(&m->active_asset_list);
if (r & LWS_SRET_FATAL)
return LWSSSSRET_DISCONNECT_ME;
if (r & LWS_SRET_AWAIT_RETRY) {
lwsl_warn("%s: returning to await retry\n", __func__);
if (!m->lhp->await_css_done)
lws_sul_schedule(lws_ss_get_context(m->ss), 0,
m->lhp->sshtmlevsul,
m->lhp->sshtmlevcb, 1);
}
goto okie;
}
/* .flow is at the same offset in both dlo_jpeg and dlo_png */
if (len &&
@ -116,7 +155,7 @@ dloss_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
return LWSSSSRET_OK;
}
okie:
lws_sul_schedule(lws_ss_get_context(m->ss), 0, m->ssevsul, m->on_rx, 1);
return LWSSSSRET_OK;
@ -133,6 +172,7 @@ dloss_state(void *userobj, void *sh, lws_ss_constate_t state,
break;
case LWSSSCS_DESTROYING:
lws_sul_cancel(&m->sul);
lws_dll2_remove(&m->active_asset_list);
break;
@ -143,7 +183,7 @@ dloss_state(void *userobj, void *sh, lws_ss_constate_t state,
return LWSSSSRET_OK;
}
static LWS_SS_INFO("default", dloss_t)
static LWS_SS_INFO("__default", dloss_t)
.rx = dloss_rx,
.state = dloss_state
};
@ -171,20 +211,20 @@ lws_dlo_ss_find(struct lws_context *cx, const char *url, lws_dlo_image_t *u)
return 1; /* not found */
}
lws_dlo_t *
lws_dlo_ss_create(lws_dlo_ss_create_info_t *i)
int
lws_dlo_ss_create(lws_dlo_ss_create_info_t *i, lws_dlo_t **pdlo)
{
lws_dlo_jpeg_t *dlo_jpeg = NULL;
lws_dlo_png_t *dlo_png = NULL;
size_t ul = strlen(i->url);
struct lws_ss_handle *h;
lws_dlo_t *dlo = NULL;
lws_ss_info_t ssi;
dloss_t *dloss;
lws_dlo_t *dlo;
char type;
uint8_t type;
if (ul < 5)
return NULL;
return 1;
if (!strcmp(i->url + ul - 4, ".png"))
type = LWSDLOSS_TYPE_PNG;
@ -193,13 +233,18 @@ lws_dlo_ss_create(lws_dlo_ss_create_info_t *i)
!strcmp(i->url + ul - 5, ".jpeg"))
type = LWSDLOSS_TYPE_JPEG;
else
return NULL;
if (!strcmp(i->url + ul - 4, ".css"))
type = LWSDLOSS_TYPE_CSS;
else {
lwsl_err("%s: unknown file type %s\n", __func__, i->url);
return 1;
}
switch (type) {
case LWSDLOSS_TYPE_PNG:
dlo_png = lws_display_dlo_png_new(i->dl, i->dlo_parent, i->box);
if (!dlo_png)
return NULL;
return 1;
i->u->u.dlo_png = dlo_png;
@ -216,7 +261,7 @@ lws_dlo_ss_create(lws_dlo_ss_create_info_t *i)
case LWSDLOSS_TYPE_JPEG:
dlo_jpeg = lws_display_dlo_jpeg_new(i->dl, i->dlo_parent, i->box);
if (!dlo_jpeg)
return NULL;
return 1;
i->u->u.dlo_jpeg = dlo_jpeg;
@ -238,7 +283,7 @@ lws_dlo_ss_create(lws_dlo_ss_create_info_t *i)
if (lws_ss_create(i->cx, 0, &ssi, (void *)dlo, &h, NULL, NULL)) {
lwsl_notice("%s: unable to create ss\n", __func__);
return NULL;
return 1;
}
dloss = (dloss_t *)lws_ss_to_user_object(h);
@ -246,6 +291,8 @@ lws_dlo_ss_create(lws_dlo_ss_create_info_t *i)
dloss->on_rx = i->on_rx;
dloss->ssevsul = i->on_rx_sul;
dloss->lhp = i->lhp;
dloss->type = type;
lws_strncpy(dloss->url, i->url, sizeof(dloss->url));
switch (type) {
@ -261,17 +308,23 @@ lws_dlo_ss_create(lws_dlo_ss_create_info_t *i)
break;
}
if (lws_ss_alloc_set_metadata(h, "endpoint", i->url, ul))
if (lws_ss_alloc_set_metadata(h, "endpoint", i->url, ul)) {
lwsl_err("%s: unable to set endpoint\n", __func__);
goto fail;
}
if (lws_ss_client_connect(dloss->ss))
if (lws_ss_client_connect(dloss->ss)) {
lwsl_err("%s: unable to do client connection\n", __func__);
goto fail;
}
lws_dll2_add_tail(&dloss->active_asset_list, &i->cx->active_assets);
lwsl_notice("%s: starting %s (dlo %p)\n", __func__, i->url, dlo);
return dlo;
*pdlo = dlo;
return 0;
fail:
lws_ss_destroy(&h);
@ -285,5 +338,5 @@ fail:
break;
}
return NULL;
return 1;
}

View File

@ -44,9 +44,22 @@ lws_display_dl_init(lws_displaylist_t *dl, lws_display_state_t *ds)
int
lws_display_dlo_add(lws_displaylist_t *dl, lws_dlo_t *dlo_parent, lws_dlo_t *dlo)
{
lws_dll2_add_tail(&dlo->list, dlo_parent ? &dlo_parent->children : &dl->dl);
if (!dlo_parent && !dl->dl.head) {
lws_dll2_add_tail(&dlo->list, &dl->dl);
return 9;
return 0;
}
if (!dlo_parent) {
if (!dl->dl.head)
return 0;
dlo_parent = lws_container_of(dl->dl.head, lws_dlo_t, list);
}
lws_dll2_add_tail(&dlo->list, &dlo_parent->children);
return 0;
}
void
@ -99,6 +112,185 @@ lws_surface_set_px(const lws_surface_info_t *ic, uint8_t *line, int x,
*line = rgb[2];
}
/*
* Recursively find out the total width and height of the contents of a DLO
*/
void
lws_dlo_contents(lws_dlo_t *parent, lws_dlo_dim_t *dim)
{
lws_display_render_stack_t st[12]; /* DLO child stack */
lws_dll2_t *d;
lws_fx_t t1;
int sp = 0;
dim->w.whole = 0;
dim->w.frac = 0;
dim->h.whole = 0;
dim->h.frac = 0;
if (!parent)
return;
d = lws_dll2_get_head(&parent->children);
if (!d)
return;
memset(&st, 0, sizeof(st));
st[0].dlo = lws_container_of(d, lws_dlo_t, list);
st[0].co.w.whole = 0;
st[0].co.w.frac = 0;
st[0].co.h.whole = 0;
st[0].co.h.frac = 0;
/* We are collecting worst dlo->box.x + dlo->box.w and .y + .h */
while (sp || st[0].dlo) {
lws_dlo_t *dlo = st[sp].dlo;
if (!dlo) {
if (!sp) {
lwsl_err("%s: underflow\n", __func__);
return;
}
if (lws_fx_comp(&st[sp].co.w, &st[sp - 1].co.w) > 0)
st[sp - 1].co.w = st[sp].co.w;
if (lws_fx_comp(&st[sp].co.h, &st[sp - 1].co.h) > 0)
st[sp - 1].co.h = st[sp].co.h;
// lwsl_notice("sp %d: passing back w: %d, h: %d\n", sp, st[sp - 1].co.w.whole, st[sp - 1].co.h.whole);
sp--;
continue;
}
lws_fx_add(&t1, &dlo->box.w, &dlo->box.x);
// lws_fx_add(&t1, &t1, &dlo->margin[CCPAS_LEFT]);
lws_fx_add(&t1, &t1, &dlo->padding[CCPAS_LEFT]);
// lws_fx_add(&t1, &t1, &dlo->padding[CCPAS_RIGHT]);
// lws_fx_add(&t1, &t1, &dlo->margin[CCPAS_RIGHT]);
if (lws_fx_comp(&t1, &st[sp].co.w) > 0)
st[sp].co.w = t1;
lws_fx_add(&t1, &dlo->box.h, &dlo->box.y);
// lws_fx_add(&t1, &t1, &dlo->margin[CCPAS_TOP]);
lws_fx_add(&t1, &t1, &dlo->padding[CCPAS_TOP]);
// lws_fx_add(&t1, &t1, &dlo->padding[CCPAS_BOTTOM]);
// lws_fx_add(&t1, &t1, &dlo->margin[CCPAS_BOTTOM]);
if (lws_fx_comp(&t1, &st[sp].co.h) > 0)
st[sp].co.h = t1;
d = dlo->list.next;
if (d)
st[sp].dlo = lws_container_of(d, lws_dlo_t, list);
else
st[sp].dlo = NULL;
/* go into any children */
if (dlo->children.head) {
if (++sp == LWS_ARRAY_SIZE(st)) {
lwsl_err("%s: DLO stack overflow\n", __func__);
return;
}
st[sp].dlo = lws_container_of(
dlo->children.head, lws_dlo_t, list);
st[sp].co.w.whole = 0;
st[sp].co.h.whole = 0;
st[sp].co.w.frac = 0;
st[sp].co.h.frac = 0;
}
}
dim->w = st[0].co.w;
dim->h = st[0].co.h;
if (parent->col_list.owner) {
lhp_table_col_t *tc = lws_container_of(parent->col_list.owner,
lhp_table_col_t, col_dlos);
if (lws_fx_comp(&dim->w, &tc->width) < 0) {
// lws_fx_add(&t1, &tc->width, &parent->padding[CCPAS_LEFT]);
// lws_fx_add(&dim->w, &tc->width, &parent->padding[CCPAS_RIGHT]);
dim->w = tc->width;
}
}
if (parent->row_list.owner) {
lhp_table_row_t *tr = lws_container_of(parent->row_list.owner,
lhp_table_row_t, row_dlos);
if (lws_fx_comp(&dim->h, &tr->height) < 0) {
// lws_fx_add(&t1, &tr->height, &parent->padding[CCPAS_TOP]);
lws_fx_add(&dim->h, &tr->height, &parent->padding[CCPAS_BOTTOM]);
// dim->h = tr->height;
}
}
/*
lwsl_user("%s: dlo %p: FINAL w:%d -> %d h:%d -> %d\n", __func__, parent,
parent->box.w.whole, dim->w.whole,
parent->box.h.whole, dim->h.whole);
*/
}
/*
* Some DLO is changing height, adjust its height, and that of everybody below.
*/
void
lws_display_dlo_adjust_dims(lws_dlo_t *dlo, lws_dlo_dim_t *dim)
{
lws_dlo_dim_t delta;
if (!dim->w.whole && !dim->h.whole)
return;
/* adjust the target's width / height */
lws_fx_sub(&delta.w, &dim->w, &dlo->box.w);
lws_fx_sub(&delta.h, &dim->h, &dlo->box.h);
dlo->box.w = dim->w;
dlo->box.h = dim->h;
// lwsl_notice("%s: dlo %p: delta w:%d h:%d\n", __func__, dlo, delta.w.whole, delta.h.whole);
/* move peers below him accordingly */
do {
lws_dlo_t *dp = lws_container_of(dlo->list.owner, lws_dlo_t, children);
if (!dlo->list.owner)
break;
/*
* Adjust y pos of siblings below us
*/
do {
dlo = lws_container_of(dlo->list.next, lws_dlo_t, list);
if (dlo) {
//lwsl_notice("%s: dlo %p: adj y %d -> %d\n", __func__, dlo, dlo->box.y.whole, dlo->box.y.whole + delta.h.whole);
lws_fx_add(&dlo->box.y, &dlo->box.y, &delta.h);
}
} while (dlo);
/* go up parent chain until toplevel adjusting height of
* parent siblings below parent */
if (dp->flag_toplevel)
break;
dlo = dp;
//lwsl_notice("%s: dlo %p: adj h by %d\n", __func__, dlo, delta.h.whole);
lws_fx_add(&dlo->box.h, &dlo->box.h, &delta.h);
} while (1);
}
//#if defined(_DEBUG)
void
@ -149,10 +341,14 @@ lws_display_dl_dump(lws_displaylist_t *dl)
(unsigned int)dlo->dc, (unsigned int)text->text_len,
(int)text->text_len, text->text ? text->text : "(empty)");
}
#if defined(LWS_WITH_NETWORK) && defined(LWS_WITH_UPNG) && defined(LWS_WITH_CLIENT)
else if (dlo->_destroy == lws_display_dlo_png_destroy)
lws_snprintf(dt, sizeof(dt), "png");
#endif
#if defined(LWS_WITH_NETWORK) && defined(LWS_WITH_JPEG) && defined(LWS_WITH_CLIENT)
else if (dlo->_destroy == lws_display_dlo_jpeg_destroy)
lws_snprintf(dt, sizeof(dt), "jpeg");
#endif
lws_fx_string(&dlo->box.x, b[0], sizeof(b[0]));
lws_fx_string(&dlo->box.y, b[1], sizeof(b[1]));
@ -163,8 +359,15 @@ lws_display_dl_dump(lws_displaylist_t *dl)
lws_fx_string(&co.w, b1[2], sizeof(b1[2]));
lws_fx_string(&co.h, b1[3], sizeof(b1[3]));
lwsl_dlodump("%.*s box: (%s, %s) [%s x %s], co: (%s, %s) [%s x %s], %s\n",
sp, ind, b[0], b[1], b[2], b[3], b1[0], b1[1], b1[2], b1[3], dt);
lwsl_dlodump("%.*s %p box: (%s, %s) [%s x %s], co: (%s, %s) [%s x %s], %s\n",
sp, ind, dlo, b[0], b[1], b[2], b[3],
b1[0], b1[1], b1[2], b1[3], dt);
d = dlo->list.next;
if (d)
st[sp].dlo = lws_container_of(d, lws_dlo_t, list);
else
st[sp].dlo = NULL;
/* go into any children */
@ -173,17 +376,11 @@ lws_display_dl_dump(lws_displaylist_t *dl)
lwsl_err("%s: DLO stack overflow\n", __func__);
return;
}
st[sp++].dlo = lws_container_of(
st[++sp].dlo = lws_container_of(
dlo->children.head, lws_dlo_t, list);
st[sp].co = co;
continue;
}
d = dlo->list.next;
if (d)
st[sp].dlo = lws_container_of(d, lws_dlo_t, list);
else
st[sp].dlo = NULL;
}
}
//#endif
@ -370,6 +567,28 @@ lws_display_list_render_line(lws_display_render_state_t *rs)
return LWS_SRET_OK;
}
static int
dlo_clean_table_rows(lws_dll2_t *d, void *user)
{
lhp_table_row_t *r = lws_container_of(d, lhp_table_row_t, list);
lws_dll2_remove(d);
lws_free(r);
return 0;
}
static int
dlo_clean_table_cols(lws_dll2_t *d, void *user)
{
lhp_table_col_t *c = lws_container_of(d, lhp_table_col_t, list);
lws_dll2_remove(d);
lws_free(c);
return 0;
}
void
lws_display_dlo_destroy(lws_dlo_t **r)
{
@ -377,6 +596,8 @@ lws_display_dlo_destroy(lws_dlo_t **r)
return;
lws_dll2_remove(&(*r)->list);
lws_dll2_remove(&(*r)->col_list);
lws_dll2_remove(&(*r)->row_list);
while ((*r)->children.head) {
lws_dlo_t *d = lws_container_of((*r)->children.head,
@ -385,6 +606,9 @@ lws_display_dlo_destroy(lws_dlo_t **r)
lws_display_dlo_destroy(&d);
}
lws_dll2_foreach_safe(&(*r)->table_cols, NULL, dlo_clean_table_cols);
lws_dll2_foreach_safe(&(*r)->table_rows, NULL, dlo_clean_table_rows);
if ((*r)->_destroy)
(*r)->_destroy(*r);
@ -405,7 +629,7 @@ lws_display_list_destroy(lws_displaylist_t *dl)
}
}
int
lws_dlo_filesystem_t *
lws_dlo_file_register(struct lws_context *cx, const lws_dlo_filesystem_t *f)
{
const lws_dlo_filesystem_t *b;
@ -414,19 +638,21 @@ lws_dlo_file_register(struct lws_context *cx, const lws_dlo_filesystem_t *f)
b = lws_dlo_file_choose(cx, f->name);
if (b) {
lwsl_err("%s: dlo file %s already exists\n", __func__, b->name);
lwsl_err("%s: dlo file %s already exists %p\n", __func__, b->name, b);
lws_dlo_file_unregister((lws_dlo_filesystem_t **)&b);
}
a = lws_malloc(sizeof(*a), __func__);
if (!a)
return 1;
return NULL;
*a = *f;
lws_dll2_clear(&a->list);
lws_dll2_add_tail(&a->list, &cx->dlo_file);
return 0;
lwsl_err("%s: dlo file %s registered at %p\n", __func__, a->name, a);
return a;
}
/*
@ -443,6 +669,19 @@ lws_dlo_file_unregister(lws_dlo_filesystem_t **f)
lws_free_set_NULL(*f);
}
void
lws_dlo_file_unregister_by_name(struct lws_context *cx, const char *name)
{
lws_dlo_filesystem_t *a;
a = (lws_dlo_filesystem_t *)lws_dlo_file_choose(cx, name);
if (!a)
return;
lws_dll2_remove(&a->list);
lws_free_set_NULL(a);
}
static int
_lws_dlo_file_destroy(struct lws_dll2 *d, void *user)
{

View File

@ -0,0 +1,26 @@
project(lws-api-test-lhp-dlo C)
cmake_minimum_required(VERSION 2.8.12)
find_package(libwebsockets CONFIG REQUIRED)
list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR})
include(CheckCSourceCompiles)
include(LwsCheckRequirements)
set(SAMP lws-api-test-lhp-dlo)
set(SRCS main.c )
set(requirements 1)
require_lws_config(LWS_WITH_UPNG 1 requirements)
require_lws_config(LWS_WITH_LHP 1 requirements)
require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements)
if (requirements)
add_executable(${SAMP} ${SRCS})
if (websockets_shared)
target_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS})
add_dependencies(${SAMP} websockets_shared)
else()
target_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS})
endif()
endif()

View File

@ -0,0 +1,245 @@
/*
* lws-api-test-lhp-dlo
*
* Written in 2010-2022 by Andy Green <andy@warmcat.com>
*
* This file is made available under the Creative Commons CC0 1.0
* Universal Public Domain Dedication.
*/
#include <libwebsockets.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
//#define SEVENCOL
struct lws_context *cx;
LWS_SS_USER_TYPEDEF
lws_flow_t flow;
lhp_ctx_t lhp; /* html ss owns html parser */
lws_dl_rend_t drt;
lws_sorted_usec_list_t sul;
lws_display_render_state_t *rs;
} htmlss_t;
static lws_display_render_state_t rs;
static const uint8_t fira_c_r_10[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Regular10.mcufont.h"
};
static const uint8_t fira_c_r_12[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Regular12.mcufont.h"
};
static const uint8_t fira_c_r_14[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Regular14.mcufont.h"
};
static const uint8_t fira_c_r_16[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Regular16.mcufont.h"
};
static const uint8_t fira_c_r_20[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Regular20.mcufont.h"
};
static const uint8_t fira_c_r_24[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Regular24.mcufont.h"
};
static const uint8_t fira_c_r_32[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Regular32.mcufont.h"
};
static const uint8_t fira_c_b_10[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Bold10.mcufont.h"
};
static const uint8_t fira_c_b_12[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Bold12.mcufont.h"
};
static const uint8_t fira_c_b_14[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Bold14.mcufont.h"
};
static const uint8_t fira_c_b_16[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Bold16.mcufont.h"
};
static const uint8_t fira_c_b_20[] = {
#include "../contrib/mcufont/fonts/FiraSansCondensed-Bold20.mcufont.h"
};
#if defined(SEVENCOL)
static const lws_display_colour_t palette[] = {
LWSDC_RGBA(0, 0, 0, 255), /* black */
LWSDC_RGBA(255, 255, 255, 255), /* white */
LWSDC_RGBA(0, 255, 0, 255), /* green */
LWSDC_RGBA(0, 0, 255, 255), /* blue */
LWSDC_RGBA(255, 0, 0, 255), /* red */
LWSDC_RGBA(255, 255, 0, 255), /* yellow */
LWSDC_RGBA(255, 127, 0, 255), /* orange */
};
#endif
static const lws_surface_info_t ic = {
.wh_px = { { 600,0 }, { 448,0 } },
.wh_mm = { { 114,5000000 }, { 82,5000000 } },
#if defined(SEVENCOL)
.palette = palette,
.palette_depth = LWS_ARRAY_SIZE(palette),
.type = LWSSURF_PALETTE,
#else
.type = LWSSURF_TRUECOLOR32,
#endif
.greyscale = 0
};
int fdin = 0, fdout = 1;
#if defined(SEVENCOL)
static void
expand(uint8_t nyb, uint8_t *rgba)
{
*rgba++ = LWSDC_R(palette[nyb]);
*rgba++ = LWSDC_G(palette[nyb]);
*rgba++ = LWSDC_B(palette[nyb]);
*rgba++ = 255;
}
#endif
static void
render(lws_sorted_usec_list_t *sul)
{
lws_display_render_state_t *rs = lws_container_of(sul,
lws_display_render_state_t, sul);
size_t lbuflen = (size_t)rs->ic->wh_px[0].whole *
(rs->ic->greyscale ? 1 : 3);
lws_stateful_ret_t r;
if (!rs->line) {
lws_display_dl_dump(&rs->displaylist);
/* allocate one line of RGB output pixels to render into */
rs->line = malloc(lbuflen);
if (!rs->line) {
lwsl_err("%s: OOM\n", __func__);
/* !!! cleanup */
return;
}
memset(rs->line, 0, lbuflen);
rs->curr = 0;
}
while (rs->curr != rs->lowest_id_y) {
r = lws_display_list_render_line(rs);
if (r) {
/* eg, waiting for more jpg or whatever */
lwsl_info("%s: leaving %d\n", __func__, r);
return;
}
#if defined(SEVENCOL)
/* convert from paletteized result to RGBA for dump purposes */
{
uint8_t dump[2048 * 4];
int n;
for (n = 0; n < rs->box.w.whole; n += 2) {
expand(rs->line[(n >> 1)] >> 4, dump + (4 * n));
expand(rs->line[(n >> 1)] & 0xf, dump + (4 * (n + 1)));
}
write(fdout, dump, (size_t)rs->box.w.whole * 4);
}
#else
#if defined(WIN32)
if (write(fdout, rs->line, (unsigned int)lbuflen) < 0) {
#else
if (write(fdout, rs->line, lbuflen) < 0) {
#endif
#endif
lwsl_err("%s: unable to write\n", __func__);
}
rs->curr++;
}
free(rs->line);
lws_display_list_destroy(&rs->displaylist);
lws_default_loop_exit(cx);
}
static void
sigint_handler(int sig)
{
lws_default_loop_exit(cx);
}
int
main(int argc, const char **argv)
{
struct lws_context_creation_info info;
int result = 0;
const char *p;
signal(SIGINT, sigint_handler);
memset(&info, 0, sizeof info);
lws_cmdline_option_handle_builtin(argc, argv, &info);
lwsl_user("LWS LHP DLO test tool\n");
if ((p = lws_cmdline_option(argc, argv, "--stdout"))) {
fdout = open(p, LWS_O_WRONLY | LWS_O_CREAT | LWS_O_TRUNC, 0600);
if (fdout < 0) {
result = 1;
lwsl_err("%s: unable to open stdout file\n", __func__);
goto bail;
}
}
info.port = CONTEXT_PORT_NO_LISTEN;
info.options |= LWS_SERVER_OPTION_EXPLICIT_VHOSTS |
LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |
LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW;
cx = lws_create_context(&info);
if (!cx)
goto bail;
/* register the available fonts */
lws_font_register(cx, fira_c_r_10, sizeof(fira_c_r_10));
lws_font_register(cx, fira_c_r_12, sizeof(fira_c_r_12));
lws_font_register(cx, fira_c_r_14, sizeof(fira_c_r_14));
lws_font_register(cx, fira_c_r_16, sizeof(fira_c_r_16));
lws_font_register(cx, fira_c_r_20, sizeof(fira_c_r_20));
lws_font_register(cx, fira_c_r_24, sizeof(fira_c_r_24));
lws_font_register(cx, fira_c_r_32, sizeof(fira_c_r_32));
lws_font_register(cx, fira_c_b_10, sizeof(fira_c_b_10));
lws_font_register(cx, fira_c_b_12, sizeof(fira_c_b_12));
lws_font_register(cx, fira_c_b_14, sizeof(fira_c_b_14));
lws_font_register(cx, fira_c_b_16, sizeof(fira_c_b_16));
lws_font_register(cx, fira_c_b_20, sizeof(fira_c_b_20));
rs.ic = &ic;
/* create the SS to the html using the URL on argv[1] */
if (lws_lhp_ss_browse(cx, &rs, argv[1], render)) {
lws_context_destroy(cx);
goto bail;
}
lws_context_default_loop_run_destroy(cx);
if (fdout != 1)
close(fdout);
bail:
lwsl_user("Completed: %s\n", result ? "FAIL" : "PASS");
return result;
}

View File

@ -0,0 +1,113 @@
<!doctype html>
<html>
<head>
<title>Test html</title>
<meta charset="utf-8" />
</head>
<style>
body { font-family: sun; font-size: 12px;
background-image: "bluecat.jpg" }
h1 { font-family: sans; font-size: 32px; text-align: right; margin-bottom: 12px; color:#000; }
b { font-weight:700 }
.mydiv { position: absolute;
width: 200px; top:360px; left: 16px; border-radius: 8px;
background-color: #ff0;
padding-top:4px; padding-bottom:4px;
margin-top:8px; margin-bottom:8px;
color: #000; text-align: center;
font-family: sans; font-size: 10px }
.rundiv { position: relative; border-radius: 8px;
background-color: #0000ffff;
padding-top:4px; padding-bottom:4px;
padding-left:8px; padding-right:8px;
margin-top:9px; margin-bottom:9px;
margin-left:18px; margin-right:18px;
color: #fff; text-align: left;
font-family: sans; font-size: 16px;
border-top-left-radius: 16px;
border-top-right-radius: 16px;
border-bottom-left-radius: 16px;
border-bottom-right-radius: 16px;
}
.cdiv { display: inline; width: 33.3%; color: #ff0;
padding-top:4px; padding-bottom:4px;
margin-top:8px; margin-bottom:8px;
margin-left: auto; margin-right:auto;
background-color: #cc0000a0;
text-align: center;
font-family: sans; font-size: 14px }
.circ {
position: absolute; top: 60px; left: 500px;
background-color: #404000;
width: 48px; height: 48px;
padding-top:0px; padding-bottom:0px;
padding-right:0px; padding-left:0px;
margin-top:0px; margin-bottom:0px;
margin-left:0px; margin-right:0px;
border-top-left-radius: 24px;
border-top-right-radius: 24px;
border-bottom-left-radius: 24px;
border-bottom-right-radius: 24px;
}
.cov {
top: 130px;
border-top-left-radius: 0px;
border-top-right-radius: 12px;
border-bottom-left-radius: 24px;
border-bottom-right-radius: 6px;
}
.icon { position: absolute; top:340px; left: 500px; }
.icon2 { position: absolute; top:250px; left: 500px; }
.contain { margin-left: 12px }
.x { display: block; padding-left: 6px; padding-right: 6px; padding-top: 6px; padding-bottom: 6px; color: #000}
.a { background-color: #ff0000; }
.b { background-color: #ffa500; }
.c { background-color: #ffff00; }
.d { background-color: #008000; }
.e { background-color: #0000ff; }
.f { background-color: #00ff00; }
.g { background-color: #ff00ff; }
.row { }
.m { width=33% }
</style>
<body>
<h1>libwebsockets.org</h1>
<div class="rundiv">This is some text flowing in an auto width div on body.<br>
Mixed CSS types in a line: <b>bold</b>, normal</div>
<div class="rundiv">Another div like the one before.</div>
<div><div class="cdiv">First</div><div class="cdiv">Second</div></div>
<div class="icon"><img src="exclaim.png"></div>
<div class="icon2"><img src="no-right.png"></div>
<div class="mydiv">Well, some text in an abs div that is <b>too long</b> to comfortably fit on one line, even with the smallest font.</div>
<div class="circ"></div>
<div class="circ cov"></div>
Something after the div<br>
<div class="contain">
<div class="x a">
<div class="x b">
<div class="x c">
<div class="x d">
<div class="x e">
<div class="x f">
<div class="x g">
hello
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="cdiv">cdiv 33% width<br>blah blah</div>
<!--<div class="mydiv">a<b>b</b></div> -->
</body>
</html>