From: hgn Date: Tue, 18 Mar 2025 15:31:23 +0000 (+0000) Subject: filebrowser X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=58b318418dac66f6cda73857aba48e1f42c1acb6;p=vg.git filebrowser --- diff --git a/src/fonts/vg_font_thin_3.png b/src/fonts/vg_font_thin_3.png index d3239dd..e729ffa 100644 Binary files a/src/fonts/vg_font_thin_3.png and b/src/fonts/vg_font_thin_3.png differ diff --git a/src/fonts/vg_font_thin_3.xcf b/src/fonts/vg_font_thin_3.xcf index 66e8368..a68c8ed 100644 Binary files a/src/fonts/vg_font_thin_3.xcf and b/src/fonts/vg_font_thin_3.xcf differ diff --git a/vg_build_font.h b/vg_build_font.h index e743b46..5a03155 100644 --- a/vg_build_font.h +++ b/vg_build_font.h @@ -94,8 +94,7 @@ void vg_build_font_sheet( FILE *fp, char *name, const char *source ) void vg_build_default_font(void) { FILE *fp = fopen( "vg/vg_default_font.gc", "w" ); - vg_build_font_sheet( fp, "vg_default_font_sheet", - "vg/src/fonts/vg_font_thin_3.png" ); + vg_build_font_sheet( fp, "vg_default_font_sheet", "vg/src/fonts/vg_font_thin_3.png" ); vg_font_face small = { .name = "vgf_default_small", @@ -111,7 +110,7 @@ void vg_build_default_font(void) vg_build_font_face_run( &small, 'a', 'z', 0, 28 ); vg_build_font_face_run( &small, '0', '9', 208,14 ); vg_build_font_face_run( &small, 0x7f, 0xa4, 0,42 ); - vg_build_font_face_run( &small, 0xb0, 0xb3, 208,28 ); + vg_build_font_face_run( &small, 0xb0, 0xbe, 208,28 ); vg_build_write_font_face( fp, &small ); vg_font_face large = @@ -129,7 +128,7 @@ void vg_build_default_font(void) vg_build_font_face_run( &large, 'a', 'z', 0, 98 ); vg_build_font_face_run( &large, '0', '9', 312,77 ); vg_build_font_face_run( &large, 0x7f, 0xa4, 0,119 ); - vg_build_font_face_run( &large, 0xb0, 0xb3, 312,98 ); + vg_build_font_face_run( &large, 0xb0, 0xbe, 312,98 ); vg_build_write_font_face( fp, &large ); vg_font_face title = diff --git a/vg_console.c b/vg_console.c index e857942..f9f56bb 100644 --- a/vg_console.c +++ b/vg_console.c @@ -7,8 +7,7 @@ struct vg_console vg_console; -void vg_console_reg_var( const char *alias, void *ptr, enum vg_var_dtype type, - u32 flags ) +void vg_console_reg_var( const char *alias, void *ptr, enum vg_var_dtype type, u32 flags ) { VG_ASSERT( vg_thread_purpose() != k_thread_purpose_main ); VG_ASSERT( vg_console.var_count < VG_ARRAY_LEN(vg_console.vars) ); @@ -504,7 +503,7 @@ void console_suggest_prev( ui_context *ctx ) } } -static void _vg_console_on_update( ui_context *ctx, char *buf, u32 len ) +static void _vg_console_on_update( ui_context *ctx, char *buf, u32 len, void *userdata ) { if( buf == vg_console.input ) { @@ -523,7 +522,7 @@ static void console_history_get( char* buf, int entry_num ) strcpy( buf, vg_console.history[ pick ] ); } -static void _vg_console_on_up( ui_context *ctx, char *buf, u32 len ) +static void _vg_console_on_up( ui_context *ctx, char *buf, u32 len, void *userdata ) { if( buf == vg_console.input ) { @@ -550,7 +549,7 @@ static void _vg_console_on_up( ui_context *ctx, char *buf, u32 len ) } } -static void _vg_console_on_down( ui_context *ctx, char *buf, u32 len ) +static void _vg_console_on_down( ui_context *ctx, char *buf, u32 len, void *userdata ) { if( buf == vg_console.input ) { @@ -564,7 +563,7 @@ static void _vg_console_on_down( ui_context *ctx, char *buf, u32 len ) } } -static void _vg_console_on_enter( ui_context *ctx, char *buf, u32 len ) +static void _vg_console_on_enter( ui_context *ctx, char *buf, u32 len, void *userdata ) { if( buf == vg_console.input ) { diff --git a/vg_engine.c b/vg_engine.c index e9151a5..4a971f5 100644 --- a/vg_engine.c +++ b/vg_engine.c @@ -124,7 +124,7 @@ void vg_auto_shader_register(void); /* created from codegen */ static void _vg_load_full( void *data ) { vg_info(" Copyright . . . -----, ,----- ,---. .---. \n" ); -vg_info(" 2021-2024 |\\ /| | / | | | | /| \n" ); +vg_info(" 2021-2025 |\\ /| | / | | | | /| \n" ); vg_info(" | \\ / | +-- / +----- +---' | / | \n" ); vg_info(" | \\ / | | / | | \\ | / | \n" ); vg_info(" | \\/ | | / | | \\ | / | \n" ); @@ -892,7 +892,7 @@ static void vg_settings_ui_draw_diff( ui_context *ctx, ui_rect orig ) /* i32 settings * ------------------------------------------------------------------------- */ -static void vg_settings_ui_int( ui_context *ctx, char *buf, u32 len ) +static void vg_settings_ui_int( ui_context *ctx, char *buf, u32 len, void *userdata ) { for( u32 i=0, j=0; ihandle = SDL_GameControllerOpen( index ); controller->instance_id = instance_id; - if( controller->handle ){ + if( controller->handle ) + { vg_success( " . opened SDL_JoystickID[%d] as controller '%s' at index #%d\n", instance_id, name, vg_id ); @@ -66,11 +68,11 @@ static int vg_open_gamecontroller( Sint32 index ) for( u32 i=0; i< SDL_CONTROLLER_AXIS_MAX; i++ ) controller->axises[i] = 0.0f; - if( vg_input.active_controller_index == -2 ){ + if( vg_input.active_controller_index == -2 ) + { vg_input.active_controller_index = vg_id; vg_input.display_input_method = k_input_method_controller; - vg_input.display_input_type = - SDL_GameControllerGetType( controller->handle ); + vg_input.display_input_type = SDL_GameControllerGetType( controller->handle ); } return vg_id; @@ -103,8 +105,7 @@ void vg_input_device_event( SDL_Event *ev ) } } else if( ev->type == SDL_CONTROLLERDEVICEREMOVED ){ - vg_info( "SDL_CONTROLLERDEVICEREMOVED | instance_id: %d\n", - ev->cdevice.which ); + vg_info( "SDL_CONTROLLERDEVICEREMOVED | instance_id: %d\n", ev->cdevice.which ); for( int i=0; i 64.0f ) + { + moved_mouse = 1; + vg_input.hidden_mouse_travel = 0.0f; + } + + if( vg_input.display_input_method != k_input_method_kbm ) + { + if( pressed_key ) { vg_input.display_input_method = k_input_method_kbm; - vg_info( "display_input: k_input_method_kbm (mouse click)\n" ); + vg_info( "display_input: k_input_method_kbm (keyboard %d)\n", pressed_id ); } - vg_input.hidden_mouse_travel += v2_length( vg.mouse_delta ); - if( vg_input.hidden_mouse_travel > 64.0f ) + if( moved_mouse ) { vg_input.display_input_method = k_input_method_kbm; - vg_input.hidden_mouse_travel = 0.0f; vg_info( "display_input: k_input_method_kbm (mouse move)\n" ); } + + if( clicked_mouse ) + { + vg_input.display_input_method = k_input_method_kbm; + vg_info( "display_input: k_input_method_kbm (mouse click)\n" ); + } } else vg_input.hidden_mouse_travel = 0.0f; @@ -254,9 +269,8 @@ void async_vg_input_init( void *payload, u32 size ) vg_info( "%d: %s [controller: %d]\n", i, name, is_controller ); - if( is_controller ){ + if( is_controller ) vg_open_gamecontroller( i ); - } } } @@ -268,10 +282,12 @@ void vg_input_init(void) void vg_input_free(void) { - for( int i=0; ihandle ){ + if( controller->handle ) + { SDL_GameControllerClose( controller->handle ); controller->handle = NULL; } @@ -540,8 +556,10 @@ void vg_input_string( vg_str *str, vg_input_op *ops, int glyphs ) next_code:; vg_input_op op = ops[ pc ++ ]; - if( (op == vg_keyboard) || (op == vg_mouse) ){ - if( (vg_input.display_input_method == k_input_method_kbm) && visible ){ + if( (op == vg_keyboard) || (op == vg_mouse) ) + { + if( (vg_input.display_input_method == k_input_method_kbm) && visible ) + { applicable = 1; if( op == vg_keyboard ) @@ -552,9 +570,10 @@ next_code:; else applicable = 0; pc ++; } - else if( (op == vg_joy_button) || (op == vg_joy_axis) ){ - if( (vg_input.display_input_method == k_input_method_controller) - && visible ){ + else if( (op == vg_joy_button) || (op == vg_joy_axis) ) + { + if( (vg_input.display_input_method == k_input_method_controller) && visible ) + { applicable = 1; if( op == vg_joy_button ) @@ -565,9 +584,10 @@ next_code:; else applicable = 0; pc ++; } - else if( (op == vg_joy_ls) || (op == vg_joy_rs) ){ - if( (vg_input.display_input_method == k_input_method_controller) - && visible ){ + else if( (op == vg_joy_ls) || (op == vg_joy_rs) ) + { + if( (vg_input.display_input_method == k_input_method_controller) && visible ) + { applicable = 1; vg_joy_string( str, op, glyphs ); } diff --git a/vg_io.c b/vg_io.c index b100992..da4dd39 100644 --- a/vg_io.c +++ b/vg_io.c @@ -7,7 +7,15 @@ #include #include -int vg_dir_open( vg_dir *dir, const char *name ) +const char *dir_open_result_str[] = +{ + [k_dir_open_none] = "None", + [k_dir_open_ok] = "OK", + [k_dir_open_path_too_long] = "Path too long", + [k_dir_open_invalid_path] = "Invalid path" +}; + +enum dir_open_result vg_dir_open( vg_dir *dir, const char *name ) { #ifdef _WIN32 char q_buf[4096]; @@ -15,23 +23,28 @@ int vg_dir_open( vg_dir *dir, const char *name ) vg_strnull( &q, q_buf, 4096 ); vg_strcat( &q, name ); vg_strcat( &q, "/*" ); - if( !vg_strgood(&q) ) return 0; + if( !vg_strgood(&q) ) + return k_dir_open_path_too_long; vg_info( "FindFirstFile( '%s' )\n", q.buffer ); dir->h = FindFirstFile( q.buffer, &dir->data ); - if( dir->h == INVALID_HANDLE_VALUE ){ - if( GetLastError() == ERROR_FILE_NOT_FOUND ){ + if( dir->h == INVALID_HANDLE_VALUE ) + { + if( GetLastError() == ERROR_FILE_NOT_FOUND ) + { dir->index = 0; - return 1; + return k_dir_open_ok; } - else return 0; + else + return k_dir_open_invalid_path; } #else dir->h = opendir( name ); - if( !dir->h ) return 0; + if( !dir->h ) + return k_dir_open_invalid_path; #endif dir->index = 1; - return 1; + return k_dir_open_ok; } const char *vg_dir_entry_name( vg_dir *dir ) @@ -43,41 +56,56 @@ const char *vg_dir_entry_name( vg_dir *dir ) #endif } -int vg_dirskip( vg_dir *dir ) +static int vg_dirskip( vg_dir *dir ) { const char *s = vg_dir_entry_name(dir); #ifdef _WIN32 - if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) return 1; + if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) + return 1; #endif - if( s[0] == '.' ){ - if( s[1] == '\0' ) return 1; - else if( s[1] == '.' ){ - if( s[2] == '\0' ) return 1; + if( s[0] == '.' ) + { + if( s[1] == '\0' ) + return 1; + else if( s[1] == '.' ) + { + if( s[2] == '\0' ) + return 1; } } return 0; } -int vg_dir_next_entry( vg_dir *dir ) +bool vg_dir_next_entry( vg_dir *dir ) { #ifdef _WIN32 - if( dir->index == 0 ) return 0; - if( dir->index > 1 ) { + if( dir->index == 0 ) + return 0; + + if( dir->index > 1 ) + { dir->index ++; - if( !FindNextFile( dir->h, &dir->data ) ) return 0; + if( !FindNextFile( dir->h, &dir->data ) ) + return 0; } - while( vg_dirskip(dir) ){ + while( vg_dirskip(dir) ) + { dir->index ++; - if( !FindNextFile( dir->h, &dir->data ) ) return 0; + if( !FindNextFile( dir->h, &dir->data ) ) + return 0; } - if( dir->index == 1 ) dir->index ++; + if( dir->index == 1 ) + dir->index ++; return 1; #else - while( (dir->data = readdir(dir->h)) ){ + while( (dir->data = readdir(dir->h)) ) + { dir->index ++; - if( !vg_dirskip(dir) ) break; + if( !vg_dirskip(dir) ) + break; } - if( dir->data ) return 1; + if( dir->data ) + return 1; else return 0; #endif } @@ -87,12 +115,13 @@ enum vg_entry_type vg_dir_entry_type( vg_dir *dir ) #ifdef _WIN32 if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) return k_vg_entry_type_dir; - return k_vg_entry_type_file; /* sketchy? */ + else + return k_vg_entry_type_file; /* sketchy? */ #else if( dir->data->d_type == DT_DIR ) return k_vg_entry_type_dir; if( dir->data->d_type == DT_REG ) return k_vg_entry_type_file; #endif - return 0; + return k_vg_entry_type_unknown; } void vg_dir_close( vg_dir *dir ) diff --git a/vg_io.h b/vg_io.h index 0991f0e..8f81365 100644 --- a/vg_io.h +++ b/vg_io.h @@ -29,10 +29,18 @@ enum vg_entry_type{ k_vg_entry_type_dir }; -int vg_dir_open( vg_dir *dir, const char *name ); +enum dir_open_result +{ + k_dir_open_none, + k_dir_open_ok, + k_dir_open_path_too_long, + k_dir_open_invalid_path +}; +extern const char *dir_open_result_str[]; +enum dir_open_result vg_dir_open( vg_dir *dir, const char *name ); + const char *vg_dir_entry_name( vg_dir *dir ); -int vg_dirskip( vg_dir *dir ); -int vg_dir_next_entry( vg_dir *dir ); +bool vg_dir_next_entry( vg_dir *dir ); enum vg_entry_type vg_dir_entry_type( vg_dir *dir ); void vg_dir_close( vg_dir *dir ); diff --git a/vg_pxfont_thin.h b/vg_pxfont_thin.h index 96a6bc1..e796af6 100644 --- a/vg_pxfont_thin.h +++ b/vg_pxfont_thin.h @@ -1,71 +1,961 @@ -/* Font buffer generated from source file: 'src/fonts/vg_font_thin.png' */ -0xc3002800,0x8000020,0x8100000,0,0,0,0,0, -0x81102800,0x1c000020,0x10080010,0x2,0x3c103c7c,0x407c387c,0x38380000,0, -0x102822,0x22202020,0x20040010,0x2,0x46304208,0x48404404,0x44440000,0x38, -0x100022,0x20525000,0x20045410,0x4,0x46504210,0x48404008,0x44440000,0x8001044, -0x10007f,0x20245000,0x200438fe,0x8,0x4a100420,0x48404008,0x44441010,0x10000804, -0x100022,0x1c086000,0x20043810,0x8,0x5a100878,0x48787810,0x7c3c0000,0x20000404, -0x100022,0x2109400,0x20045410,0x3c0010,0x52101004,0x3c044410,0x44040000,0x403c0208, -0x22,0x2248800,0x20040010,0x20,0x62102004,0x8044420,0x44040000,0x40000210, -0x7f,0x224a9400,0x10080000,0x20,0x62104004,0x8444420,0x44440010,0x203c0400, -0x100022,0x1c046200,0x8100000,0x10002000,0x3c7c7e78,0x8383820,0x38381010,0x10000810, -0x22,0x8000000,0,0x20000000,0,0,0x20,0x8001000, +/* Font buffer generated from source file: 'vg/src/fonts/vg_font_thin_3.png' */ +0xc3002800,0x8000020,0x8100000,0,0x3c003c18,0x100018,0,0, +0,0,0,0,0,0,0,0, +0x81102800,0x1c000020,0x10080010,0x2,0x20800424,0x180c18,0x30000000,0, +0x18000000,0,0,0,0,0,0,0, +0x102822,0x22202020,0x20040010,0x2,0x20800442,0x81018,0x8000000,0x38, +0x24000000,0,0,0,0,0,0,0, +0x100022,0x20525000,0x20045410,0x4,0x20400400,0x1018,0x8000000,0x8001044, +0x440000fe,0x10380000,0,0,0,0,0,0, +0x10007f,0x20245000,0x200438fe,0x8,0x20200400,0x2018,0x4621010,0x10000804, +0x440000fe,0x387c0000,0,0,0,0,0,0, +0x100022,0x1c086000,0x20043810,0x8,0x20200400,0x4018,0x2920000,0x20000404, +0x540000fe,0x38fe0000,0,0,0,0,0,0, +0x100022,0x2109400,0x20045410,0x3c0010,0x20100400,0x4018,0x28c0000,0x403c0208, +0x540000fe,0x7cfe0000,0,0,0,0,0,0, +0x22,0x2248800,0x20040010,0x20,0x20080400,0x2018,0x4000000,0x40000210, +0x5c0000fe,0x7cfe0000,0,0,0,0,0,0, +0x7f,0x224a9400,0x10080000,0x20,0x20080400,0x1018,0x8000010,0x203c0400, +0xfe,0xfe7c0000,0,0,0,0,0,0, +0x100022,0x1c046200,0x8100000,0x10002000,0x20000400,0x1018,0x8001010,0x10000810, +0xfe,0xfe380000,0,0,0,0,0,0, +0x22,0x8000000,0,0x20000000,0x3c003c00,0xff000c00,0x30000020,0x8001000, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0x81000000,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, 0xc3000000,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x3c,0x3c1800, -0x1818303c,0x707c3838,0x447c7844,0x4044443c,0x7838387c,0xfe428282,0x8282fe20,0x80042400, -0x24244840,0x48404044,0x44100848,0x40444442,0x44444482,0x10428282,0x82820220,0x80044200, -0x44244840,0x44404040,0x44100848,0x40aa6442,0x44444480,0x10424492,0x44820420,0x40040000, -0x44424840,0x44404040,0x44100850,0x40aa5442,0x44444480,0x10424492,0x28820820,0x20040000, -0x54427840,0x4478705c,0x7c100860,0x40aa5442,0x7854787c,0x10424492,0x107e1020,0x20040000, -0x547e4440,0x44404044,0x44100850,0x40924c42,0x404c4402,0x104228aa,0x28022020,0x10040000, -0x5c424440,0x44404044,0x44100848,0x40924c42,0x40444402,0x104228aa,0x44024020,0x8040000, -0x424440,0x48404044,0x44101048,0x40924442,0x40424482,0x104228aa,0x82828020,0x8040000, -0x42783c,0x707c4038,0x447c6044,0x7c82443c,0x403a447c,0x103c1044,0x827cfe20,0x40000, -0,0,0,0,0,0,0x3c,0x3c00ff, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0x10000000,0,0,0,0,0,0,0x18000000, -0x18004000,0x4000000,0x40000040,0x60000000,0,0x40000000,0xc,0x18300000, -0x8004000,0x4003800,0x40100840,0x20000000,0,0x40000000,0x10,0x18080000, -0x4000,0x4004400,0x40000040,0x20000000,0,0x40000000,0x10,0x180800fe, -0x38783c,0x3c384038,0x78303848,0x206c3838,0x3838383c,0x78444282,0x44447c20,0x18046282, -0x44440,0x44444044,0x44100850,0x20924444,0x44444440,0x40444292,0x28440840,0x18029282, -0x3c4440,0x44447844,0x44100860,0x20924444,0x44444038,0x40442492,0x10441040,0x18028c82, -0x444440,0x44784044,0x44100860,0x20824444,0x44444004,0x40442492,0x28442020,0x18040082, -0x444440,0x44404044,0x44100850,0x20824444,0x64444044,0x404424aa,0x44444010,0x18080082, -0x3c783c,0x3c3c403c,0x44380848,0x1c824438,0x583c4038,0x38381844,0x443c7c10,0x180800fe, -0,0x4004,0x800,0,0x40040000,0,0x4000c,0x300000, -0,0x4004,0x3000,0,0x40060000,0,0x80000,0, -0,0x8078,0,0,0x40040000,0,0x700000,0, +0x18303c70,0x7c383844,0x7c784440,0x44443c78,0x38787cfe,0x42828282,0x82fe3c10,0x3c7c407c, +0x387c3838,0,0,0,0,0,0,0, +0x24484048,0x40404444,0x10084840,0x44444244,0x44448210,0x42828282,0x82024630,0x42084840, +0x44044444,0,0,0,0,0,0,0, +0x24484044,0x40404044,0x10084840,0xaa644244,0x44448010,0x42449244,0x82044650,0x42104840, +0x40084444,0,0,0,0,0,0,0, +0x42484044,0x40404044,0x10085040,0xaa544244,0x44448010,0x42449228,0x82084a10,0x4204840, +0x40084444,0,0,0,0,0,0,0, +0x42784044,0x78705c7c,0x10086040,0xaa544278,0x54787c10,0x42449210,0x7e105a10,0x8784878, +0x78107c3c,0,0,0,0,0,0,0, +0x7e444044,0x40404444,0x10085040,0x924c4240,0x4c440210,0x4228aa28,0x2205210,0x10043c04, +0x44104404,0,0,0,0,0,0,0, +0x42444044,0x40404444,0x10084840,0x924c4240,0x44440210,0x4228aa44,0x2406210,0x20040804, +0x44204404,0,0,0,0,0,0,0, +0x42444048,0x40404444,0x10104840,0x92444240,0x42448210,0x4228aa82,0x82806210,0x40040844, +0x44204444,0,0,0,0,0,0,0, +0x42783c70,0x7c403844,0x7c60447c,0x82443c40,0x3a447c10,0x3c104482,0x7cfe3c7c,0x7e780838, +0x38203838,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x400004,0x40,0x4060,0,0x40,0,0x4,0x7000000, +0,0,0,0,0,0,0,0, +0x400004,0x380040,0x10084020,0,0x40,0,0x3008,0x73000000, +0,0,0,0,0,0,0,0, +0x400004,0x440040,0x4020,0,0x40,0,0x4810,0x4500606c, +0x98000000,0,0,0,0,0,0,0, +0x38783c3c,0x38403878,0x30384820,0x6c383838,0x38383c78,0x44428244,0x447c4810,0x4806706c, +0xe4e00000,0,0,0,0,0,0,0, +0x4444044,0x44404444,0x10085020,0x92444444,0x44444040,0x44429228,0x44083010,0x420c786c, +0xe2900000,0,0,0,0,0,0,0, +0x3c444044,0x44784444,0x10086020,0x92444444,0x44403840,0x44249210,0x4410000e,0x42d87c6c, +0xf28e0000,0,0,0,0,0,0,0, +0x44444044,0x78404444,0x10086020,0x82444444,0x44400440,0x44249228,0x44200000,0x7e70786c, +0x2820000,0,0,0,0,0,0,0, +0x44444044,0x40404444,0x10085020,0x82444464,0x44404440,0x4424aa44,0x44400000,0x20706c, +0x44820000,0,0,0,0,0,0,0, +0x3c783c3c,0x3c403c44,0x3808481c,0x82443858,0x3c403838,0x38184444,0x3c7c0000,0x606c, +0x38fe0000,0,0,0,0,0,0,0, +0,0x400400,0x80000,0x40,0x4000000,0,0x4000000,0, +0,0,0,0,0,0,0,0, +0,0x400400,0x300000,0x40,0x6000000,0,0x8000000,0, +0,0,0,0,0,0,0,0, +0,0x807800,0,0x40,0x4000000,0,0x70000000,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0x1818,0x1818,0x7c1e3c3c,0,0,0, +0,0xdc000000,0,0,0,0,0,0, +0xfe103882,0x82441060,0x3c002424,0x3c002424,0x82214242,0x18001800,0,0x1000, +0xe80000,0x90000000,0,0,0,0,0,0, +0x82284444,0x44442890,0x42000000,0x42000000,0x80010000,0x38181c7e,0x3c7c6c6c,0x6c6c2810, +0xdca80000,0xdc6c0000,0,0,0,0,0,0, +0x82288228,0x28284490,0x52521052,0x5a5a185a,0xaedd8868,0x783c1e7e,0x40eaae,0xee828228, +0x88e80022,0x84aa0000,0,0,0,0,0,0, +0x82448210,0x101044f0,0x52911091,0x52911091,0xa4898888,0x787e1e3c,0x3c5eeaae,0xee101044, +0xc8ae0042,0xdcaa0000,0,0,0,0,0,0, +0x82448228,0x28107c88,0x5a5a185a,0x52521052,0xb4898e8e,0x387e1c18,0x12eaae,0xee929282, +0x429e,0xaa0000,0,0,0,0,0,0, +0x82824444,0x44108288,0x42000000,0x42000000,0x80018a8a,0x18001800,0x3c1eeeee,0xee1000ee, +0xd0e04240,0x70ee0000,0,0,0,0,0,0, +0xfefe3882,0x821082f0,0x3c002424,0x3c002424,0x80016e8e,0,0x8282,0x8282aa28, +0x90407e20,0x40820000,0,0,0,0,0,0, +0,0,0x1818,0x1818,0,0,0,0x1038, +0x9c400000,0x70000000,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xe0700000,0,0,0,0,0,0,0x800000, +0x80000000,0,0,0,0,0,0,0, +0x8010800a,0x200,0x100,0x2008000,0,0,0x1f80001f,0x81400000, +0xc0070040,0x38000000,0,0,0,0,0,0, +0x8010800a,0x703,0x100,0x4004000,0,0x4,0x10040000,0x82200000, +0x60080040,0x4000000,0,0x1e0,0,0,0,0, +0x800a,0x1040884,0x80380100,0x8002000,0,0x8,0x10020000,0x84100000, +0x20080040,0x4000000,0,0x210,0,0,0,0, +0x8000,0x1041044,0x84440000,0x8002000,0x400000,0x8,0x10020000,0x80000000, +0x80040,0x4000000,0,0x408,0,0xc03,0xf0000000,0, +0x8000,0x1041004,0x88440000,0x10001008,0x400000,0x10,0x10010000,0x80000000, +0x80040,0x4000000,0x200,0x80408,0x1e000000,0xffc1e07,0xf8000000,0, +0x8000,0x7ff1003,0x10440000,0x1000102a,0x400000,0x20,0x10008000,0x80000000, +0x100040,0x2038408,0x800400,0x40008,0x21000000,0xffc1e0f,0xfc000000,0, +0x8000,0x1040800,0x20440000,0x1000101c,0x400000,0x20,0x10008000,0x80000000, +0x100040,0x2044400,0x800,0x20008,0x40800000,0xffc3f0f,0xfc000000,0, +0x8000,0x1040700,0x40780000,0x1000101c,0x7fc0001,0xf8000040,0x10004000,0x80000000, +0x600040,0x1842400,0x1000,0x10010,0x4c800000,0xffc3f0f,0xfc000000,0, +0x8000,0x1040080,0x80880000,0x1000102a,0x400000,0x80,0x10002000,0x80000000, +0x100040,0x2041800,0x2001,0xf8008060,0x52800000,0xffc7f8f,0xfc000000,0, +0x8000,0x1040041,0x18850000,0x10001008,0x400000,0x80,0x10002000,0x80000000, +0x100040,0x2000000,0x4000,0x4080,0x52800000,0xffc7f8f,0xfc000000,0, +0,0x1040042,0x24820000,0x10001000,0x400000,0x100,0x10001000,0x80000000, +0x80040,0x4000000,0x2000,0x8000,0x52800000,0xffc7f8f,0xfc000000,0, +0x80100000,0x7ff1044,0x24850000,0x8002000,0x400000,0x200,0x10000800,0x80000000, +0x80040,0x4000000,0x1001,0xf8010000,0x52800000,0xffcffcf,0xfc000000,0, +0x80108000,0x1040880,0x24888000,0x8002000,0xc00,0x180200,0x10000800,0x80000000, +0x80040,0x4000000,0x800800,0x20080,0x4d000000,0xffcffc7,0xf8000000,0, +0xe0708000,0x1040700,0x18704000,0x4004000,0x800,0x180400,0x10000400,0x80000000, +0x80040,0x4000008,0x800400,0x40080,0,0xffcffc3,0xf0000000,0, +0,0x1040200,0,0x2008000,0x1000,0,0x1f80001f,0x8000fff0, +0x70000,0x38000000,0x1000200,0x80000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xc03e01f,0x87c07f83,0xf01f0410,0x7f07e041,0x84006304,0x81e07e0,0x1c07e01f,0x8ff84088, +0x8808808,0x808ffc1e,0xc01e07,0xf84007f8,0x1f07f81e,0x1e00000,0,0, +0x12041020,0x4204004,0x208410,0x8002042,0x4009486,0x8210410,0x22041020,0x40804088, +0x8808808,0x80800421,0x1402100,0x10420400,0x20800821,0x2100000,0,0, +0x21041040,0x4104004,0x400410,0x8002042,0x4009486,0x8408408,0x41040840,0x804084, +0x10808410,0x80800842,0x82404080,0x20420400,0x40001040,0x84080000,0,0, +0x21041040,0x4104004,0x400410,0x8002044,0x4009485,0x8408408,0x41040840,0x804084, +0x10888220,0x80801042,0x80404080,0x40420400,0x40002040,0x84080000,0,0, +0x40841040,0x4104004,0x400410,0x8002048,0x4009485,0x8408408,0x41040840,0x804084, +0x10888140,0x80802044,0x80400080,0x80420400,0x40002021,0x4080000,0,0, +0x4087e040,0x4104004,0x400410,0x8002070,0x4009484,0x88408410,0x49041020,0x804084, +0x10888080,0x41804044,0x80400101,0x4207e0,0x5e00401e,0x4080000,0,0, +0x40841040,0x4107e07,0xe04f87f0,0x8002070,0x4009484,0xc84087e0,0x4507e01f,0x804084, +0x10888080,0x3e808048,0x80400203,0xe0220010,0x61004021,0x2180000,0,0, +0x7f840840,0x4104004,0x408410,0x8002048,0x4008884,0x48408400,0x43041000,0x80804082, +0x20948080,0x810048,0x80400400,0x101f8008,0x40808040,0x81e80000,0,0, +0x40840840,0x4104004,0x408410,0x8002044,0x4008884,0x28408400,0x41040800,0x40804082, +0x20948140,0x820050,0x80400800,0x8020008,0x40808040,0x80080000,0,0, +0x40840840,0x4104004,0x408410,0x8002042,0x4008884,0x28408400,0x40840800,0x40804082, +0x20948220,0x840050,0x80401000,0x8020008,0x40810040,0x80080000,0,0, +0x40840840,0x4104004,0x408410,0x8002042,0x4008884,0x18408400,0x40040800,0x40804082, +0x20948410,0x80880060,0x80402000,0x8020408,0x40810040,0x80080000,0,0, +0x40841020,0x4204004,0x210410,0x8004041,0x2008084,0x18210400,0x22040840,0x80802101, +0x40948808,0x41080021,0x404000,0x10020210,0x21010021,0x4100000,0,0, +0x4087e01f,0x87c07f84,0x1e0410,0x7f078040,0x81f88084,0x81e0400,0x1c04083f,0x801e00, +0x80630808,0x3e0ffc1e,0x3f87f87,0xe00201e0,0x1e01001e,0x3e00000,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x40000,0x80000,0x400,0x40,0x6000000,0,0,0x2000000, +0,0,0x80000,0,0,0,0,0, +0x40000,0x80000,0x400,0x40,0x2000000,0,0,0x2000000, +0,0,0x1001e0,0,0,0,0,0, +0x40000,0x80001,0xe0000400,0x4002040,0x2000000,0,0,0x2000000, +0,0xc,0x207c60,0,0,0,0,0, +0x40000,0x80002,0x10000400,0x40,0x2000000,0,0,0x2000000, +0,0x12,0x4060a0,0,0,0,0,0, +0x40000,0x80004,0x8000400,0x40,0x2000000,0,0,0x2000000, +0,0x12,0x806120,0x83803b8,0xf000000,0,0,0, +0x3e05e01e,0x1e81e04,0x1e85c0,0xc00e042,0x2003b85,0xe01e05e0,0x1e85f03f,0x3f04084, +0x4808410,0x4087f80c,0x806200,0x1c3c03b8,0x90877000,0,0,0, +0x1061021,0x2182104,0x218620,0x4002044,0x2004446,0x10210610,0x21860840,0x82004084, +0x4808410,0x40801000,0x806040,0x383e03b8,0xe0488800,0,0,0, +0x1040840,0x84084084,0x408410,0x4002048,0x2004444,0x8408408,0x40840040,0x2004082, +0x8888220,0x40802000,0x406044,0x703f03b8,0xe0484800,0,0,0, +0x3d040840,0x4084087,0xe0408410,0x4002070,0x2004444,0x8408408,0x4084003e,0x2004082, +0x8888140,0x40804000,0x3c604e,0xe03f83b8,0xf0483c00,0,0,0, +0x43040840,0x4087f04,0x408410,0x4002050,0x2004444,0x8408408,0x40840001,0x2004081, +0x10888080,0x40808000,0x7fc7,0xc03f83b8,0xf8480400,0,0,0, +0x41040840,0x4084004,0x408410,0x4002048,0x2004044,0x8408408,0x40840000,0x82004081, +0x10888140,0x40810000,0x7fc3,0x803f03b8,0x480400,0,0,0, +0x41040840,0x84084004,0x408410,0x4002044,0x2004044,0x8408408,0x40840000,0x82004081, +0x10948220,0x40820000,0x1,0x3e03b8,0x20480400,0,0,0, +0x43061021,0x2182084,0x218410,0x4002042,0x1004044,0x8210610,0x21840041,0x1002100, +0xa0a28410,0x21840000,0,0x3c03b8,0x10880400,0,0,0, +0x3c85e01e,0x1e81f04,0x1e8410,0xe002041,0xf04044,0x81e05e0,0x1e84003e,0xf01e00, +0x40410410,0x1e87f800,0,0x3803b8,0xf0ffc00,0,0,0, +0,0x4,0x8000,0x2000,0,0x400,0x800000,0, +0,0x800000,0,0,0,0,0,0, +0,0x4,0x8000,0x4000,0,0x400,0x800000,0, +0,0x800000,0,0,0,0,0,0, +0,0x4,0x410000,0x18000,0,0x400,0xc00000,0, +0,0x41000000,0,0,0,0,0,0, +0,0x8,0x3e0000,0,0,0x400,0x800000,0, +0,0x3e000000,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0x4,0x400000,0x40040,0,0, +0,0,0,0,0,0,0,0, +0xc03f,0x804804c,0xc0c07f0,0x1f00000a,0xa01f00,0xa00a0,0x3f81fc3f,0xc3fc0e00, +0x1c0000,0,0,0,0,0,0,0, +0xffc1e07f,0x8c0cc0ce,0x1c1e0ff8,0x20800011,0x1102080,0x110110,0x40420240,0x24021e00, +0x1e0000,0,0,0x80000,0,0,0,0, +0xffc1e0e1,0xc6186186,0x18330c18,0x40400000,0x4040,0,0x40420240,0x24023e00, +0xe01f07fc,0x1f87f873,0x87387387,0x701400c0,0x1b800000,0x7,0x38000000,0, +0xc0c330c0,0xc3303303,0x30330c18,0x48428808,0x2884642,0x68060268,0x40000200,0x7e01, +0xf01f87fc,0x400f2,0x493cf3c8,0x8808120,0x21000000,0x9,0x24000000,0, +0xc0c330c0,0xc1e01e03,0xf0618c38,0x48448408,0x4844844,0x84080484,0x5381ba11,0xd07e03, +0xf81f87fc,0x400f2,0x493cf3c8,0x8808210,0x21000000,0x1040009,0x24000000,0, +0xc0c618c0,0xc0c00c01,0xe0618ff8,0x48488208,0x8824848,0x82080882,0x51021211,0x1107e07, +0xfc1f83f8,0x1f84fcf2,0x493cf3c0,0x80080408,0x19024e00,0x2042669,0x24000000,0, +0xc0c618c0,0xc1e01e00,0xc0ffcffc,0x48448408,0x4844844,0x84080484,0x51021211,0xc11c3e07, +0xfc1f01f0,0x84f2,0x493cf3c8,0x88888804,0x54400,0x4044889,0x24000000,0, +0xc0c618c0,0xc3303300,0xc0ffcc0c,0x4e426806,0x2684842,0x88080288,0x51021211,0x41141e07, +0xfc1e00e0,0x84f2,0x493cf3c8,0x88888804,0x1a054400,0x8f86489,0x24000000,0, +0xc0cc0ce1,0xc6186180,0xc0c0cc0c,0x40400000,0x4040,0,0x4d02120d,0xc11c0e00, +0x1c0000,0x1f80fcf3,0xcf3cf3c0,0x80000f3c,0x22074440,0x4400428f,0x3c000000,0, +0xffcffc7f,0x8c0cc0c0,0xc0c0cffc,0x20800011,0x1102080,0x110110,0x40000200,0, +0,0x80,0x48048048,0x8808120,0x22053440,0x42002c68,0x4000000,0, +0xffcffc3f,0x8048040,0xc0c0c7f8,0x1f00000a,0xa01f00,0xa00a0,0x40000200,0, +0,0x80,0x48048048,0x8948120,0x2180007f,0xc1000008,0x4000000,0, +0,0,0,0x4,0x400000,0x40040,0,0, +0,0,0,0x801e0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xfc003f00,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xc000,0, +0xfc003f00,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x1e000,0, +0xc0000300,0xf00001ce,0,0xc0000,0,0x30000,0xc0000,0xc0000000, +0,0,0,0,0x3ffc000,0x3ff,0xc003f000,0, +0xc0000300,0xf00001ce,0,0xc0000,0,0x30000,0x1c0000,0xe0000000, +0,0,0,0,0x3ffc000,0x3ff,0xc0073800,0, +0xc0000300,0xf00001ce,0,0x3f000f,0,0x30000,0x380000,0x70000000, +0,0,0,0x70,0x3ffc030,0x3ff,0xc00e1c00,0, +0xc0000300,0xf00001ce,0,0x7f801f,0x80000000,0x30000,0x700000,0x38000000, +0,0,0,0xf0,0x3800038,0x1,0xc01c0e00,0, +0,0xf00000cc,0x38070,0xffc03f,0xc0000fc0,0x30000,0xe00000,0x1c000000, +0,0,0,0xe0,0x380003c,0x1,0xc0380700,0, +0,0xf00000cc,0x38070,0x1e1e039,0xc0001fc0,0x30000,0xe00000,0x1c000000, +0,0,0,0x1c0,0x380001c,0x1,0xc0300300,0, +0,0xf0000000,0x38070,0x3c0f039,0xc0303ff0,0,0x1c00000,0xe000000, +0x3000,0,0,0x1c0,0x380001e,0x1,0xc0000000,0, +0,0xf0000000,0x38070,0x3807039,0xc0703870,0,0x1c00000,0xe000000, +0x3000,0,0,0x380,0x380000e,0x1,0xc0000000,0, +0,0xf0000000,0x38070,0x3800039,0xc0f03870,0,0x3c00000,0xf0000c0, +0x3000,0,0,0x380,0x380000f,0x1,0xc0000000,0, +0,0xf0000000,0x38070,0x380003f,0xc1e03870,0,0x3800000,0x70000c0, +0x3000,0,0,0x700,0x3800007,0x80000001,0xc0000000,0, +0,0xf0000000,0x3fffff,0x380001f,0x83c03870,0,0x3800000,0x7000ccc, +0x3000,0,0,0xe00,0x3800003,0xc0000001,0xc0000000,0, +0,0xf0000000,0x3fffff,0x380000f,0x7803870,0,0x3800000,0x7000ccc, +0x3000,0,0,0xe00,0x3800001,0xc0000001,0xc0000000,0, +0,0xf0000000,0x3fffff,0x3c00000,0xf003870,0,0x3800000,0x70003f0, +0x3000,0,0,0x1c00,0x3800000,0xe0000001,0xc0000000,0, +0,0xf0000000,0x38070,0x3e00000,0x1e003ff0,0,0x3800000,0x70003f0, +0x3000,0,0,0x1c00,0x3800000,0xe0000001,0xc0000000,0, +0,0xf0000000,0x38070,0x1ff8000,0x3c003fc0,0,0x3800000,0x70003f0, +0x3ffff0,0x3,0xffc00000,0x3800,0x3800000,0x70000001,0xc0000000,0, +0,0xf0000000,0x38070,0xffc000,0x78007fc0,0,0x3800000,0x70003f0, +0x3ffff0,0x3,0xffc00000,0x7000,0x3800000,0x38000001,0xc0000000,0, +0,0xf0000000,0x38070,0x7fe000,0xf000f9e0,0,0x3800000,0x7000ccc, +0x3000,0,0,0x7000,0x3800000,0x3c000001,0xc0000000,0, +0,0x60000000,0x38070,0xf001,0xe000f0f0,0,0x3800000,0x7000ccc, +0x3000,0,0,0xe000,0x3800000,0x1c000001,0xc0000000,0, +0,0x60000000,0x38070,0x7003,0xc3c0e07b,0,0x3800000,0x70000c0, +0x3000,0,0,0xe000,0x3800000,0xe000001,0xc0000000,0, +0,0x60000000,0x38070,0x7007,0x87e0e03f,0,0x3800000,0x70000c0, +0x3000,0,0,0x1c000,0x3800000,0xe000001,0xc0000000,0, +0,0x60000000,0x38070,0x700f,0xff0e01f,0,0x3c00000,0xf000000, +0x3000,0,0,0x3c000,0x3800000,0x7000001,0xc0000000,0, +0,0,0x3fffff,0x701e,0xe70e01f,0,0x3c00000,0xf000000, +0x3000,0,0,0x38000,0x3800000,0x3800001,0xc0000000,0, +0xc0000300,0,0x3fffff,0x380703c,0xe70e03f,0x80000000,0x1c00000,0xe000000, +0x3000,0,0,0x70000,0x3800000,0x1c00001,0xc0000000,0, +0xc0000300,0,0x3fffff,0x3c0f038,0xe70e07b,0xc0000000,0x1c00000,0xe000000, +0x3000,0,0,0x70000,0x3800000,0x1c00001,0xc0000000,0, +0xc0000300,0x60000000,0x38070,0x1e1f030,0xe70f0f1,0xe0000000,0xe00000,0x1c000000, +0,0xf00000,0x180,0xe0000,0x3800000,0xe00001,0xc0000000,0, +0xc0000300,0xf0000000,0x38070,0xffe000,0xff07fe0,0xf0000000,0xe00000,0x1c000000, +0,0xf00000,0x3c0,0xe0000,0x3800000,0xe00001,0xc0000000,0, +0xfc003f00,0xf0000000,0x38070,0x7fc000,0x7e07fc0,0x70000000,0x700000,0x38000000, +0,0xe00000,0x3c0,0x1c0000,0x3800000,0x700001,0xc0000000,0, +0xfc003f00,0x60000000,0x38070,0x3f8000,0x3c01f00,0x30000000,0x380000,0x70000000, +0,0x1c00000,0x180,0x1c0000,0x3ffc000,0x3003ff,0xc0000000,0, +0,0,0x38070,0xc0000,0,0,0x1c0000,0xe0000000, +0,0x3800000,0,0,0x3ffc000,0x3ff,0xc0000000,0xffffff00, +0,0,0x38070,0xc0000,0,0,0xc0000,0xc0000000, +0,0x3000000,0,0,0x3ffc000,0x3ff,0xc0000000,0xffffff00, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xc00000,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xe00000,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xf00000,0x3f000070,0xfc000,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0xf80000,0x7f000070,0xfe000,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x7c0000,0xff000070,0xff000,0,0,0,0,0x3fc, +0,0,0,0,0,0,0,0, +0x1c0000,0xf0000070,0xf000,0,0,0,0,0x7fe, +0,0,0,0,0,0,0,0, +0xc0000,0xe0000070,0x7000,0,0,0,0,0xfff, +0,0,0,0,0,0x30000030,0,0, +0,0xe0000070,0x7000,0,0,0,0,0x1e07, +0x80000000,0,0,0,0,0x78000078,0,0, +0,0xe0000070,0x7800,0,0,0,0,0x3c03, +0xc0000000,0,0,0xf000,0x3fc0000,0xfc0000fc,0x3ff00,0, +0x1,0xe0000070,0x7800,0,0,0,0,0x3801, +0xc0000000,0,0,0x1f800,0xfff0001,0xce0001ce,0x7ff80,0, +0x1,0xe0000070,0x7800,0,0,0xc00,0,0xc0003801, +0xc003fc00,0,0xffff,0xf003fc00,0x1fff8003,0x87000387,0xe01c0,0, +0x1,0xc0000070,0x3800,0,0,0x1c00,0,0xe0003801, +0xc007fe00,0,0xffff,0xf003fc00,0x3fffc003,0x3000303,0x1c00e0,0, +0x3,0xc0000070,0x3c00,0xfc07000,0xc00000c0,0x3800,0,0x70000001, +0xc00e0700,0,0xffff,0xf007fe00,0x7fffe000,0,0x380070,0, +0x3,0x80000070,0x1c00,0x1fe07001,0xe00001e0,0x7000,0,0x38000001, +0xc01c0380,0,0xffff,0xf007fe00,0x7fffe000,0,0x300030,0, +0x7,0x80000070,0x1e00,0x3ff07001,0xe00001e0,0xe000,0,0x1c000001, +0xc03801c0,0,0xffff,0xf00fff00,0xfffff000,0xc0000cc0,0xc0303c30,0xc3cc000, +0x3f,0x80000070,0x1fc0,0x38787000,0xc00000c0,0x1c000,0,0xe000003, +0xc03000c0,0,0xffff,0xf00fff00,0xfffff000,0xc0001cc0,0xe0307c30,0x1c7ce000, +0x3e,0x70,0x7c0,0x383c7000,0,0x38000,0,0x7000007, +0x8030f0c0,0,0xffff,0xf01fff80,0xfffff000,0xc00038c0,0x7030e030,0x38e07000, +0x3e,0x70,0x7c0,0x381ff000,0,0x70000,0,0x380007f, +0x31f8c0,0,0xffff,0xf01fff80,0xfffff000,0xc00070c0,0x3830c030,0x70c03800, +0x7,0x80000070,0x1e00,0x380fe000,0,0xe0000,0x3ffc000,0x1c000fe, +0x339cc0,0,0xffff,0xf03fffc0,0xfffff000,0xc000e0c0,0x1c30c030,0xe0c01c00, +0x3,0x80000070,0x1c00,0x3807c000,0,0x1c0000,0x3ffc000,0xe001fc, +0x330cc0,0,0xffff,0xf03fffc0,0xfffff000,0xc000e0c0,0x1c30c030,0xe0c01c00, +0x3,0x80000070,0x1c00,0,0,0x380000,0,0x7001e0, +0x330cc0,0,0xffff,0xf03fffc0,0xfffff000,0xc00070c0,0x3830c030,0x70c03800, +0x3,0xc0000070,0x3c00,0,0,0x380000,0,0x7001e0, +0x330cc0,0,0xffff,0xf07fffe0,0xfffff000,0xe00038e0,0x7030c030,0x38c07000, +0x1,0xc0000070,0x3800,0,0,0x1c0000,0,0xe000c0, +0x330cc0,0,0xffff,0xf07fffe0,0xfffff000,0x7c001c7c,0xe030c030,0x1cc0e000, +0x1,0xe0000070,0x7800,0,0,0xe0000,0,0x1c00000, +0x330cc0,0,0xffff,0xf07fffe0,0xfffff000,0x3c000c3c,0xc030c030,0xcc0c000, +0x1,0xe0000070,0x7800,0,0,0x70000,0x3ffc000,0x3800000, +0x330cc0,0,0xffff,0xf0fffff0,0x7fffe000,0,0x300030,0, +0,0xe0000070,0x7800,0,0,0x38000,0x3ffc000,0x7000000, +0x339cc0,0,0xffff,0xf0fffff0,0x7fffe000,0,0x380070,0, +0,0xe0000070,0x7000,0,0xc00001e0,0x1c000,0,0xe0000c0, +0x31ff80,0,0xffff,0xf0fffff0,0x3fffc003,0x3000303,0x1c00e0,0, +0,0xe0000070,0x7000,0x1,0xe00001e0,0xe000,0,0x1c0001e0, +0x30f300,0,0xffff,0xf0fffff0,0x1fff8003,0x87000387,0xe01c0,0, +0,0xf0000070,0xf000,0x1,0xe00001c0,0x7000,0,0x380001e0, +0,0,0xffff,0xf0fffff0,0xfff0001,0xce0001ce,0x7ff80,0, +0,0xff000070,0xff000,0,0xc0000380,0x3800,0,0x700000c0, +0,0,0xffff,0xf0fffff0,0x3fc0000,0xfc0000fc,0x3ff00,0, +0,0x7f000000,0xfe000,0,0x700,0x1c00,0,0xe0000000, +0,0,0,0,0,0x78000078,0,0, +0,0x3f000000,0xfc000,0,0x600,0xc00,0,0xc0000000, +0,0,0,0,0,0x30000030,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x1f0003f,0xfe001fff,0x3ffe00,0x1fff001f,0xff001ffe,0x3c0780,0xfff0000,0x38003c0f, +0x801c0000,0xf003c038,0x3803ffe,0x3ffe00,0x3ffe003f,0xfc001ffe,0x7fff00,0x3c1f0000, +0x1f8003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c0f, +0x803c0000,0xf807c03c,0x7803fff,0x3fff00,0x3fff003f,0xfe003ffe,0x7fff00,0x3e1f0000, +0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c1f, +0x3c0000,0xf807c03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7fff00,0x3e1f0000, +0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xffe0000,0x3c003c1f, +0x3c0000,0xfc0fc03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7ffe00,0x3e1f0000, +0x3fc003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3e, +0x3c0000,0xfc0fc03e,0x7803c0f,0x3c1f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fc003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3e, +0x3c0000,0xfc0fc03f,0x7803c0f,0x3c0f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fc003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3c, +0x3c0000,0xfe1fc03f,0x7803c0f,0x3c0f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xfe1fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c78, +0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x7de003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79e003c,0x1f803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003cf0, +0x3c0000,0xffffc03f,0xc7803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79e003f,0xff003c00,0x3c0f00,0x3c00003e,0x3c00,0x3fff80,0xf00000,0x3c003cf0, +0x3c0000,0xffffc03f,0xc7803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79f003f,0xfe003c00,0x3c0f00,0x3ffc003e,0x3c00,0x3fff80,0xf00000,0x3c003df0, +0x3c0000,0xf7f7c03f,0xc7803c0f,0x3e1f00,0x3c0f003e,0x1f003ffc,0x1e000,0x3e1f0000, +0x79f003f,0xff003c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003de0, +0x3c0000,0xf7f7c03f,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, +0xf8f003f,0xff803c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003fe0, +0x3c0000,0xf7f7c03d,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, +0xf0f003c,0xf803c00,0x3c0f00,0x3ffc003f,0xf0003c1e,0x3e0780,0xf00000,0x3c003de0, +0x3c0000,0xf3e7c03d,0xf7803c0f,0x3fff00,0x3c0f003f,0xfc001ffe,0x1e000,0x3e1f0000, +0xfef003c,0x7803c00,0x3c0f00,0x3ffc003f,0xf0003c1e,0x3e0780,0xf00000,0x3c003df0, +0x3c0000,0xf3e7c03d,0xf7803c0f,0x3fff00,0x3c0f003f,0xfe00001e,0x1e000,0x3e1f0000, +0xfef003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf0, +0x3c0000,0xf3e7c03c,0xf7803c0f,0x3c0000,0x3c0f003c,0x3f00001e,0x1e000,0x3e1f0000, +0xfcf803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f8f803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f87803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c78, +0x3c0000,0xf1c7c03c,0x7f803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f87803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xf087c03c,0x7f803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f07803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c3c, +0x3c0000,0xf007c03c,0x3f803c0f,0x3c0000,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x1f07c03c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c3e, +0x3c0000,0xf007c03c,0x3f803c0f,0x3c0000,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3e07c03c,0xf803e00,0x3c0f00,0x3e00003e,0x3e1e,0x3e0780,0xf00000,0x7c003c3e, +0x3e0000,0xf007c03c,0x3f803e0f,0x3c0000,0x3e0f003c,0x1f003e3e,0x1e000,0x3e1f0000, +0x3e07c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0x7ff0007,0xfc003c1f, +0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3e03c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c1f, +0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3c03c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c0f, +0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3c03e03f,0xff001fff,0x3ffe00,0x1fff003e,0x1ffe,0x3e0780,0xfff0007,0xf8003c0f, +0x803ffe00,0xf007c03c,0xf801fff,0x3c0000,0x1fff003c,0x1f003ffc,0x1e000,0x3ffe0000, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x1f8003f,0xfe001fff,0x3ffe00,0x1fff001f,0xff001ffe,0x3c0780,0xfff0000,0x38003c0f, +0x801c0000,0xf003c038,0x3803ffe,0x3ffe00,0x3ffe003f,0xfc001ffe,0x7fff00,0x3c1f0000, +0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c0f, +0x803c0000,0xf807c03c,0x7803fff,0x3fff00,0x3fff003f,0xfe003ffe,0x7fff00,0x3e1f0000, +0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c1f, +0x3c0000,0xfc0fc03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7fff00,0x3e1f0000, +0x3fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xffe0000,0x3c003c1f, +0x3c0000,0xfc0fc03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7ffe00,0x3e1f0000, +0x3fc003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3e, +0x3c0000,0xfc0fc03f,0x7803c0f,0x3c1f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3c, +0x3c0000,0xfe1fc03f,0x7803c0f,0x3c0f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x7de003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c78, +0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79e003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xffffc03f,0xc7803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, +0x79f003f,0xff003c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003cf0, +0x3c0000,0xffffc03f,0xc7803c0f,0x3fff00,0x3c0f003c,0x1f003ffe,0x1e000,0x3e1f0000, +0x79f003f,0xff003c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003df0, +0x3c0000,0xf7f7c03f,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, +0xf8f003f,0xff803c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003fe0, +0x3c0000,0xf7f7c03d,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, +0xf0f003f,0xff803c00,0x3c0f00,0x3ffc003f,0xf0003c1e,0x3fff80,0xf00000,0x3c003ff0, +0x3c0000,0xf3e7c03d,0xf7803c0f,0x3fff00,0x3c0f003f,0xfc001ffe,0x1e000,0x3e1f0000, +0xfef803c,0xf803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003df0, +0x3c0000,0xf3e7c03c,0xf7803c0f,0x3c0000,0x3c0f003f,0xfe00001e,0x1e000,0x3e1f0000, +0xfcf803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x3f00001e,0x1e000,0x3e1f0000, +0x1f8f803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, +0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f87803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xf1c7c03c,0x7f803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, +0x1f07c03c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c7c, +0x3c0000,0xf007c03c,0x3f803c0f,0x3c0000,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, +0x1f07c03c,0xf803e00,0x3c0f00,0x3e00003e,0x3e1e,0x3e0780,0xf00000,0x3c003c3e, +0x3e0000,0xf007c03c,0x3f803e0f,0x3c0000,0x3e0f003c,0x1f003e3e,0x1e000,0x3e1f0000, +0x3e07c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0x7ff0000,0x7c003c3f, +0x3ffe00,0xf007c03c,0x3f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3e07e03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c1f, +0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3c03e03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c1f, +0x803ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, +0x3c03e03f,0xff001fff,0x3ffe00,0x1fff003e,0x1ffe,0x3e0780,0xfff0007,0xf8003c0f, +0x803ffe00,0xf007c03c,0xf801fff,0x3c0000,0x1fff003c,0x1f003ffc,0x1e000,0x3ffe0000, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0x3c0000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x3c03e07c,0x7c07c07,0xc03c03c0,0x1fff803f,0xfc0007f0,0xffc00,0x3ff00003,0xe0003ffc, +0x1ffe00,0x3ff8001f,0xfc000ffe,0,0,0,0,0, +0x3c03e07c,0x7c07c07,0xc03e07c0,0x1fff803f,0xfe0007f8,0x1ffe00,0x3ff80003,0xc0003ffc, +0x3ffe00,0x3ffc003f,0xfe001fff,0,0,0,0,0, +0x3c03e07c,0x7c07c07,0xc03e07c0,0x1fff803f,0xfe0007f8,0x1ffe00,0x3ff80003,0xc0003ffc, +0x3ffe00,0x3ffc003f,0xfe001fff,0,0,0,0,0, +0x3c03e07c,0x7c03e0f,0x801f0f80,0x1fff803f,0xfe0007f8,0x1ffe00,0x3ff80003,0xc0003ffc, +0x3ffe00,0x3ffc003f,0xfe001fff,0,0,0,0,0, +0x3e03e07c,0x7c03e0f,0x801f0f80,0xfff803c,0x1e0007f8,0x1e3e00,0xf80003,0xc0003c00, +0x3c0000,0x78003c,0x1e001e0f,0x3000,0x300000,0,0,0, +0x1e03c07c,0x7c01f1f,0xf0f00,0xf003c,0x1e0000f8,0x1e3e00,0x780007,0xc0003c00, +0x3c0000,0x78003c,0x1e001e0f,0x7800,0x780000,0,0,0, +0x1e07c07c,0x7c01f1f,0xf9f00,0x1f003c,0x1e0000f8,0x1e7e00,0x780007,0xc0003c00, +0x3c0000,0x78003c,0x1e001e0f,0xfc00,0xfc000f,0xffc003ff,0xf00ffff0,0xffff000, +0x1e07c07c,0x7800fbe,0xf9f00,0x1f003c,0x1e0000f8,0x7c00,0x780007,0x80003c00, +0x3c0000,0xf8003c,0x1e001e0f,0x1ce00,0x1ce001f,0xffe007ff,0xf81ffff8,0x1ffff800, +0x1f07c07c,0x7800fbe,0x79e00,0x3e003c,0x1e0000f8,0x7c00,0x780007,0x80003c00, +0x3c0000,0xf0003c,0x1e001e0f,0x38700,0x3870038,0x700e00,0x1c38001c,0x38001c00, +0xf07803c,0x7800ffe,0x7fe00,0x3e003c,0x1e0000f8,0xfc00,0x780007,0x80003c00, +0x3c0000,0xf0003c,0x1e001e0f,0x30300,0x3030030,0x300c00,0xc30000c,0x30000c00, +0xf07803e,0x4f8007fc,0x7fe00,0x7c003c,0x1e0000f8,0xf800,0xff80007,0x80003ff8, +0x3c0000,0xf0003f,0xfe001e0f,0,0x30,0x300c00,0xc30000c,0x30000c00, +0xf0f803e,0x4f8007fc,0x3fc00,0x7c003c,0x1e0000f8,0x1f800,0xff8000f,0x80003ffc, +0x3c0000,0xf0001f,0xfc001e0f,0,0x30,0x300c00,0xc30000c,0x30000c00, +0xf0f003e,0x4f8007fc,0x3fc00,0xf8003c,0x1e0000f8,0x1f000,0xff0000f,0x80003ffc, +0x3ffc00,0x1e0001f,0xfc001fff,0x3c00,0xc3cc030,0,0xc000000,0, +0xf8f003e,0xef8003f8,0x1f800,0xf8003c,0x1e0000f8,0x1f000,0xff8000f,0x3ffc, +0x3ffe00,0x1e0003f,0xfe001fff,0x7c00,0x1c7ce030,0,0xc000000,0, +0x78f003e,0xef8003f8,0x1f800,0x1f0003c,0x1e0000f8,0x3f000,0xff8000f,0x3c, +0x3ffe00,0x1e0003c,0x1e001fff,0xe000,0x38e07033,0xfc003cf,0xcc030300,0xf30000, +0x78f003e,0xef0003f8,0xf000,0x1f0003c,0x1e0000f8,0x3e000,0x78000f,0x3c, +0x3ffe00,0x1e0003c,0x1e000fff,0xc000,0x70c03833,0xfc007cf,0xcc030300,0x1f30000, +0x78f003e,0xef0003f8,0xf000,0x3e0003c,0x1e0000f8,0x7e000,0x78000f,0x3c, +0x3c1e00,0x3e0003c,0x1e00000f,0xc000,0xe0c01c33,0x3000e03,0xc030300,0x3830000, +0x79e001f,0xff0007fc,0xf000,0x3e0003c,0x1e0000f8,0x7e000,0x78001f,0x3c, +0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0xe0c01c33,0x3000c03,0xc030300,0x3030000, +0x7de001f,0xff0007fc,0xf000,0x3c0003c,0x1e0000f8,0x7c000,0x78001f,0x3c, +0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0x70c03833,0x3000c03,0xc0303e0,0x303e000, +0x3de001f,0xff000ffc,0xf000,0x7c0003c,0x1e0000f8,0xfc000,0x78001e,0x3c, +0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0x38c07033,0x3000c03,0xc0303f0,0x303f000, +0x3de001f,0xff000fbe,0xf000,0x780003c,0x1e0000f8,0xf8000,0x78001e,0x3c, +0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0x1cc0e033,0x3000c03,0xc030330,0x3033000, +0x3de001f,0xff000fbe,0xf000,0xf80003c,0x1e0000f8,0x1f8000,0x78001e,0x3c00003c, +0x3c1e00,0x780003c,0x1e00000f,0xc000,0xcc0c033,0x83000c03,0xc038330,0x3033000, +0x3fc001f,0xff001f1f,0xf000,0xf80003c,0x1e0000f8,0x1f8000,0x78001e,0x3e00003c, +0x3c1e00,0x780003c,0x1e00000f,0,0x31,0xf3000c03,0xc01f3f0,0x303f000, +0x3fc001f,0xbe001f1f,0xf000,0x1f00003c,0x1e0000f8,0x1f0000,0x78001e,0x3e00003c, +0x3c1e00,0x780003c,0x1e00000f,0,0x30,0xf3000c03,0xc00f1e0,0x301e000, +0x1fc001f,0xbe003e0f,0x8000f000,0x1fff003c,0x1e0000f8,0x3f0000,0xf8003e,0x3e00003c, +0x3c1e00,0x780003c,0x1e00000f,0x30300,0x3030030,0,0xc000000,0, +0x1fc000f,0xbe003e0f,0x8000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff8003f,0xfe003ffc, +0x3ffe00,0xf00003f,0xfe000fff,0x38700,0x3870030,0,0xc000000,0, +0x1fc000f,0x1e003c07,0x8000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff8003f,0xfe003ffc, +0x3ffe00,0xf00003f,0xfe001fff,0x1ce00,0x1ce0030,0,0xc000000,0, +0x1f8000f,0x1e007c07,0xc000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff8003f,0xfe003ffc, +0x3ffe00,0xf00003f,0xfe001fff,0xfc00,0xfc0030,0,0xc000000,0, +0x1f8000e,0x1e007c07,0xc000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff0003f,0xfe003ffc, +0x3ffe00,0xf00001f,0xfc001ffe,0x7800,0x780000,0,0,0, +0,0,0,0,0,0,0,0x3e000000, +0,0,0,0x3000,0x300000,0,0,0, +0,0,0,0,0,0,0,0x3e000000, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0x3c01e07c,0x7c07c07,0xc03c03c0,0x3fff0000,0xf0,0xfff00,0xc00030c0,0x30f000, +0xf000f000,0x3fff0003,0xff000000,0xfc00,0x3,0xf0000000,0,0, +0x3c01e07c,0x7c07c07,0xc03c03c0,0x3fff0000,0x1f8,0x1fff80,0xe00070e0,0x70f801, +0xf001f800,0x7fff8007,0xff800000,0x1fc00,0x3,0xf8000000,0,0, +0x3c01e07c,0x7c07c07,0xc03e07c0,0x3fff00ff,0xfff003fc,0x3fffc0,0xf000f0f0,0xf0f801, +0xf003fc00,0xffffc00e,0x1c00000,0x3fc00,0x3,0xfc000000,0,0, +0x3c01e07c,0x7c07e0f,0xc03e07c0,0x3fff00ff,0xfff003fc,0x7fffe0,0xf801f0f8,0x1f0fc03, +0xf007fe00,0xffffc01c,0xe00000,0x7fc00,0x3,0xfe000000,0,0, +0x3c01e07c,0x7c03e0f,0x801f0f80,0x1f00ff,0xfff007fe,0xfc03f0,0x7c03e07c,0x3e07c03, +0xe00fff00,0xf00fc038,0x700000,0xffc00,0xfc0003,0xff003fff,0xf003ffc0,0x3fffc000, +0x3e03e07c,0x7c03f1f,0x801f0f80,0x1f00ff,0xfff007fe,0xf801f0,0x3e07c03e,0x7c03e07, +0xc00f9f00,0xf007c030,0x300000,0x1ffc00,0x1fe0003,0xff803fff,0xf003ffc0,0x3fffc000, +0x1e03c07c,0x7c01f1f,0xf0f00,0x3e00f0,0xf00f9f,0xf000f0,0x1f0f801f,0xf801f0f, +0x801f0f80,0xf003c030,0xc0300cc0,0xc03ffc00,0x3ff0003,0xffc03fff,0xf0000000,0x30000000, +0x1e03c07c,0x7c00fbe,0xf9f00,0x3e00f0,0xf00f0f,0xf000f0,0xf9f000f,0x9f000f9f, +0x1f0f80,0xf003c030,0xc0301cc0,0xe03ffc00,0x7ff8003,0xffc03fff,0xf0000000,0x30000000, +0x1f07c07c,0x7c00fbe,0x79e00,0x7c00f0,0xf01f0f,0x80f000f0,0x7fe0007,0xfe0007fe, +0x3e07c0,0xf007c030,0xc03038c0,0x703ffc00,0xfffc003,0xffc03fff,0xf0000000,0x30000000, +0xf07803c,0x78007fc,0x7fe00,0x7c00f0,0xf01f0f,0x80f000f0,0x3fc0003,0xfc0003fc, +0x3e07c0,0xf00fc030,0xc03070c0,0x383ffc00,0x1fffe003,0xffc03fff,0xf0000000,0x30000000, +0xf07803e,0x4f8007fc,0x3fc00,0xf800f0,0xf03e07,0xc0f000f0,0x1f80001,0xf80001f8, +0x7c03e0,0xffff8030,0xc030e0c0,0x1c3ffc00,0x3ffff003,0xffc01fff,0xe003ffc0,0x30fff000, +0xf07803e,0x4f8003f8,0x3fc00,0x1f000f0,0xf03e07,0xc0f000f0,0x1f80001,0xf80000f0, +0x7c03e0,0xffff8030,0xc030e0c0,0x1c3ffc00,0x3ffff003,0xffc00fff,0xc003ffc0,0x30fff000, +0xf8f803e,0x4f8003f8,0x1f800,0x1f000f0,0xf03e07,0xc0f000f0,0x3fc0003,0xfc0000f0, +0xfffff0,0xffffe030,0xc03070c0,0x381ffc00,0x3ffff003,0xff8007ff,0x80000000,0xc03000, +0x78f003e,0xef8003f8,0x1f800,0x3e000f0,0xf07c03,0xe0f000f0,0x7fe0007,0xfe0000f0, +0xfffff0,0xfffff030,0xc03038e0,0x700ffc00,0x3ffff003,0xff0003ff,0,0xc03000, +0x78f003e,0xef0007fc,0xf000,0x7c000f0,0xf07c03,0xe0f000f0,0xf9f000f,0x9f0000f0, +0xfffff0,0xf001f030,0xfc301c7c,0xe007fc00,0x3ffff003,0xfe0001fe,0,0xc03000, +0x78f001f,0xff0007fc,0xf000,0x7c000f0,0xf0fc03,0xf0f000f0,0x1f0f801f,0xf8000f0, +0xfffff0,0xf000f030,0x7c300c3c,0xc003fc00,0x3ffff003,0xfc0000fc,0,0xc03000, +0x7df001f,0xff000ffe,0xf000,0xf8000f0,0xf0f801,0xf0f801f0,0x3e07c03e,0x7c000f0, +0xf000f0,0xf000f030,0x300000,0x1fc00,0x3,0xf8000000,0x3ffc0,0xfff000, +0x3de001f,0xff001fbf,0xf000,0x1f8000f0,0xf0f801,0xf0fc03f0,0x7c03e07c,0x3e000f0, +0xf000f0,0xf001f038,0x700000,0xfc00,0x3,0xf0000000,0x3ffc0,0xfff000, +0x3de001f,0xff001f1f,0xf000,0x1f0000ff,0xfff0ffff,0xf07fffe0,0xf801f0f8,0x1f000f0, +0xf000f0,0xfffff01c,0xe00000,0,0,0,0,0, +0x3fe001f,0xff003f1f,0x8000f000,0x3fff00ff,0xfff0ffff,0xf03fffc0,0xf000f0f0,0xf000f0, +0xf000f0,0xfffff00e,0x1c00000,0,0,0,0,0, +0x3fe001f,0xbf007e0f,0xc000f000,0x3fff00ff,0xfff0ffff,0xf01fff80,0xe00070e0,0x7000f0, +0xf000f0,0x7fffe007,0xff800000,0,0,0,0,0, +0x1fc000f,0xbe007e0f,0xc000f000,0x3fff00ff,0xfff0ffff,0xf00fff00,0xc00030c0,0x3000f0, +0xf000f0,0x3fffc003,0xff000000,0,0,0,0,0, +0x1fc000f,0x1e007c07,0xc000f000,0x3fff0000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0xf00000,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x3fc0000,0xc00000,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x39c0000,0x1c00000,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x70e0000,0x3800003,0xfc000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x6060000,0x7000003,0xfc000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x6060000,0xe003ff0,0x3c000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x70e0000,0x1c003ff0,0x7c000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x39c0000,0x38003c00,0xec000000,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0x3fc0000,0x70003c01,0xcc000000,0,0,0,0, +0,0,0,0xc00000,0,0,0,0, +0,0xf00000,0xe0003c03,0x8c000000,0,0,0,0, +0,0,0,0x1e00000,0,0,0,0, +0,0,0xc0003c07,0xc000000,0,0,0,0, +0x3f0fc03f,0xfc03f0f,0xc03f3f00,0x3f00000,0xf00003cf,0xc0000000,0,0, +0x3f0fc0,0,0xc0003c0e,0,0,0,0,0, +0x7f0fe07f,0xfe07f0f,0xe03f3f00,0x3300001,0xf80007cf,0xc0000000,0,0, +0x7f0fe0,0,0xc0003c0c,0,0,0,0,0, +0xff0c70e3,0xff0ff0f,0xf0c000c0,0xc000c003,0x9c000e03,0,0,0, +0xe30c70,0,0xc0003c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c000c0,0xc000c007,0xe000c03,0,0,0, +0xc30c30,0,0xe0003c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c000c0,0xc000c00e,0x7000c03,0,0x3,0x300000, +0xc30c30,0,0x70003c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c000c0,0xc000c01c,0x3800e03,0,0x7,0x300000, +0xc30c30,0,0x38003c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf000c000,0xc00038,0x1c007c3,0xc30fc,0xe,0x301c7c, +0x3cc30c30,0,0x1ff03c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf000c000,0xc00070,0xe003c3,0x1e30fc,0x1c,0x303cfc, +0x7cc30c30,0,0xff03c00,0x30000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0e0,0x700000,0x3f3030,0x38,0x3030c0, +0xe0c30c30,0,0x3fff,0xf0000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0c0,0x300000,0x333030,0x70,0x7030e0, +0xc0c30c30,0,0x3fff,0xf0000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0c0,0x3003cc,0x333030,0xe0,0xffe03c70, +0xc0c30c30,0,0x3fff,0xf0000000,0,0,0,0, +0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0c0,0x3007cc,0x333030,0xe0,0xffc03c38, +0xc0c30c30,0,0x3fff,0xf0000000,0,0,0,0, +0xff0ff0ff,0xff0ff0f,0xf000c000,0xff,0xff00e0c,0x3f3030,0x30003070,0x301c, +0xc0ff0ff0,0,0,0,0,0,0,0, +0xff0ff0ff,0xff0ff0f,0xf000c000,0xff,0xff00c0c,0x3f3830,0x30003038,0x300c, +0xe0ff0ff0,0,0,0,0,0,0,0, +0xc00030c0,0x30c000,0x30c000c0,0xc000c003,0xc000c0c,0x331f30,0x3000301c,0x3cfc, +0x7cc00030,0,0,0,0,0,0,0, +0xc00030c0,0x30c000,0x30c000c0,0xc000c003,0xc000c0e,0x330f30,0x3000300e,0x1cf8, +0x3cc00030,0,0,0,0,0,0,0, +0xc00030c0,0x30c000,0x30c000c0,0xc330c003,0xc000c07,0xc0000000,0x3ffff007,0, +0xc00030,0,0,0,0,0,0,0, +0xc00030c0,0x30c000,0x30c000c0,0xc3f0c003,0xc000c03,0xc0000000,0x3ffff003,0, +0xc00030,0,0,0,0,0,0,0, +0,0,0,0x1e00003,0xfc000000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0xc00003,0xfc000000,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0,0,0x181800,0x18187c,0x1e3c3c00,0,0,0, -0x10388282,0x4410603c,0x24243c,0x242482,0x21424218,0x180000,0,0x100000, -0x28444444,0x44289042,0x42,0x80,0x1000038,0x181c7e3c,0x7c6c6c6c,0x6c2810dc, -0x28822828,0x28449052,0x5210525a,0x5a185aae,0xdd886878,0x3c1e7e00,0x40eaaeee,0x82822888, -0x44821010,0x1044f052,0x91109152,0x911091a4,0x89888878,0x7e1e3c3c,0x5eeaaeee,0x101044c8, -0x44822828,0x107c885a,0x5a185a52,0x521052b4,0x898e8e38,0x7e1c1800,0x12eaaeee,0x92928200, -0x82444444,0x10828842,0x42,0x80,0x18a8a18,0x18003c,0x1eeeeeee,0x1000eed0, -0xfe388282,0x1082f03c,0x24243c,0x242480,0x16e8e00,0,0x828282,0x82aa2890, -0,0,0x181800,0x181800,0,0,0,0x10389c, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0,0x40700,0,0,0,0,0,0, -0xdc,0x87300,0,0,0,0,0,0, -0xe8000090,0x1045fe,0x10380000,0,0,0,0,0, -0xa80000dc,0x6c1048fe,0x387c0000,0,0,0,0,0, -0xe8002284,0xaa1042fe,0x38fe0000,0,0,0,0,0, -0xae0042dc,0xaa0e42fe,0x7cfe0000,0,0,0,0,0, -0x429e00,0xaa007efe,0x7cfe0000,0,0,0,0,0, -0xe0424070,0xee0000fe,0xfe7c0000,0,0,0,0,0, -0x407e2040,0x820000fe,0xfe380000,0,0,0,0,0, -0x40000070,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, @@ -83,22 +973,6 @@ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0xe0700000,0,0,0,0,0,0,0, -0x8010800a,0x200,0x100,0x2008000,0,0,0,0, -0x8010800a,0x703,0x100,0x4004000,0,0x4,0x1e00c01e,0x7f84000, -0x800a,0x1040884,0x80380100,0x8002000,0,0x8,0x21014021,0x104200, -0x8000,0x1041044,0x84440000,0x8002000,0x400000,0x8,0x42824040,0x80204200, -0x8000,0x1041004,0x88440000,0x10001008,0x400000,0x10,0x42804040,0x80404200, -0x8000,0x7ff1003,0x10440000,0x1000102a,0x400000,0x20,0x44804000,0x80804200, -0x8000,0x1040800,0x20440000,0x1000101c,0x400000,0x20,0x44804001,0x1004200, -0x8000,0x1040700,0x40780000,0x1000101c,0x7fc0001,0xf8000040,0x48804002,0x3e02200, -0x8000,0x1040080,0x80880000,0x1000102a,0x400000,0x80,0x48804004,0x101f80, -0x8000,0x1040041,0x18850000,0x10001008,0x400000,0x80,0x50804008,0x80200, -0,0x1040042,0x24820000,0x10001000,0x400000,0x100,0x50804010,0x80200, -0x80100000,0x7ff1044,0x24850000,0x8002000,0x400000,0x200,0x60804020,0x80200, -0x80108000,0x1040880,0x24888000,0x8002000,0xc00,0x180200,0x21004040,0x100200, -0xe0708000,0x1040700,0x18704000,0x4004000,0x800,0x180400,0x1e03f87f,0x87e00200, -0,0x1040200,0,0x2008000,0x1000,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, @@ -106,125 +980,19 @@ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0x7f81f07f,0x81e01e00,0,0x1e,0xc03,0xe01f87c0,0x7f83f01f,0x4107f00, -0x40020800,0x82102100,0,0x21,0x1204,0x10200420,0x40040020,0x84100800, -0x40040001,0x4084080,0,0x40,0x80002104,0x10400410,0x40040040,0x4100800, -0x40040002,0x4084080,0x20,0x8040,0x81e02104,0x10400410,0x40040040,0x4100800, -0x40040002,0x2104080,0x80080040,0x4000,0x82104084,0x10400410,0x40040040,0x4100800, -0x7e05e004,0x1e04080,0x80,0x2000,0x84084087,0xe0400410,0x40040040,0x4100800, -0x1061004,0x2102180,0x100,0x1001,0x4c84084,0x10400410,0x7e07e04f,0x87f00800, -0x840808,0x4081e80,0x200,0x1f800806,0x5287f84,0x8400410,0x40040040,0x84100800, -0x840808,0x4080080,0x400,0x408,0x5284084,0x8400410,0x40040040,0x84100800, -0x840810,0x4080080,0x200,0x800,0x5284084,0x8400410,0x40040040,0x84100800, -0x40840810,0x4080080,0x100,0x1f801000,0x5284084,0x8400410,0x40040040,0x84100800, -0x21021010,0x2104100,0x80080,0x2008,0x4d04084,0x10200420,0x40040021,0x4100800, -0x1e01e010,0x1e03e00,0x80080040,0x4008,0x4087,0xe01f87c0,0x7f84001e,0x4107f00, -0,0,0x100020,0x8000,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x800, -0,0,0,0,0,0,0x1f800,0x1f81400, -0x7e041840,0x6304081,0xe07e01c0,0x3e01f8ff,0x84088088,0x8808808,0xffc10040,0x82200, -0x2042040,0x9486082,0x10410220,0x41020408,0x4088088,0x8808808,0x410020,0x84100, -0x2042040,0x9486084,0x8408410,0x40840008,0x4084108,0x8410808,0x810020,0x80000, -0x2044040,0x9485084,0x8408410,0x40840008,0x4084108,0x88220808,0x1010010,0x80000, -0x2048040,0x9485084,0x8408410,0x40840008,0x4084108,0x88140808,0x2010008,0x80000, -0x2070040,0x9484884,0x8410490,0x41020008,0x4084108,0x88080418,0x4010008,0x80000, -0x2070040,0x9484c84,0x87e0450,0x7e01f008,0x4084108,0x880803e8,0x8010004,0x80000, -0x2048040,0x8884484,0x8400430,0x41000808,0x4082209,0x48080008,0x10010002,0x80000, -0x2044040,0x8884284,0x8400410,0x40800408,0x4082209,0x48140008,0x20010002,0x80000, -0x2042040,0x8884284,0x8400408,0x40800408,0x4082209,0x48220008,0x40010001,0x80000, -0x2042040,0x8884184,0x8400400,0x40800408,0x4082209,0x48410808,0x80010000,0x80080000, -0x4041020,0x8084182,0x10400220,0x40840808,0x2101409,0x48808410,0x80010000,0x80080000, -0x7804081f,0x88084081,0xe04001c0,0x4083f008,0x1e00806,0x308083e0,0xffc10000,0x40080000, -0,0,0,0,0,0,0x1f800,0x1f80000, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0x8000,0,0,0,0,0,0,0, -0xc000,0x4000000,0x8000000,0x40000,0x4006,0,0,0, -0x6000,0x4000000,0x8000000,0x40000,0x4002,0,0,0, -0x2000,0x4000000,0x80001e0,0x40004,0x204002,0,0,0, -0,0x4000000,0x8000210,0x40000,0x4002,0,0,0, -0,0x4000000,0x8000408,0x40000,0x4002,0,0,0, -0x3e,0x5e01e01,0xe81e0400,0x1e85c00c,0xe04202,0x3b85e0,0x1e05e01e,0x85f03f00, -0x1,0x6102102,0x18210400,0x21862004,0x204402,0x444610,0x21061021,0x86084080, -0x1,0x4084084,0x8408400,0x40841004,0x204802,0x444408,0x40840840,0x84004000, -0x3d,0x4084004,0x84087e0,0x40841004,0x207002,0x444408,0x40840840,0x84003e00, -0x43,0x4084004,0x87f0400,0x40841004,0x205002,0x444408,0x40840840,0x84000100, -0x41,0x4084004,0x8400400,0x40841004,0x204802,0x404408,0x40840840,0x84000080, -0x41,0x4084084,0x8400400,0x40841004,0x204402,0x404408,0x40840840,0x84000080, -0x43,0x6102102,0x18208400,0x21841004,0x204201,0x404408,0x21061021,0x84004100, -0x3c,0x85e01e01,0xe81f0400,0x1e84100e,0x204100,0xf0404408,0x1e05e01e,0x84003e00, -0xfff00000,0,0x400,0x800000,0x200000,0,0x40000,0x80000000, -0,0,0x400,0x800000,0x400000,0,0x40000,0x80000000, -0,0,0x400,0x41000000,0x1800000,0,0x40000,0xc0000000, -0,0,0x800,0x3e000000,0,0,0x40000,0x80000000, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -0x40000000,0,0x70,0x4038000,0,0,0,0, -0x40000000,0,0x80,0x4004000,0,0,0,0, -0x40000000,0,0x80,0x4004000,0,0,0,0, -0x40000000,0,0x80,0x4004000,0xc03,0xf0804804,0xc0c0c07f,0x1f00000, -0x40000000,0,0x80,0x4004000,0xffc1e07,0xf8c0cc0c,0xe1c1e0ff,0x82080000, -0x7e040840,0x48084104,0x87f8100,0x4002038,0x4ffc1e0e,0x1c618618,0x618330c1,0x84040000, -0x40040840,0x48084104,0x8010100,0x4002044,0x4c0c330c,0xc330330,0x330330c1,0x84842880, -0x40040820,0x88882204,0x8020600,0x4001842,0x4c0c330c,0xc1e01e0,0x3f0618c3,0x84844840, -0x40040820,0x88881404,0x8040100,0x4002041,0x8c0c618c,0xc0c00c0,0x1e0618ff,0x84848820, -0x40040811,0x8880804,0x8080100,0x4002000,0xc0c618c,0xc1e01e0,0xc0ffcff,0xc4844840, -0x40040811,0x8881404,0x8100080,0x4004000,0xc0c618c,0xc330330,0xc0ffcc0,0xc4e42680, -0x40040811,0x9482204,0x8200080,0x4004000,0xc0cc0ce,0x1c618618,0xc0c0cc0,0xc4040000, -0x2002100a,0xa284102,0x18400080,0x4004000,0xffcffc7,0xf8c0cc0c,0xc0c0cff,0xc2080000, -0x1e01e004,0x4104101,0xe87f8080,0x4004000,0xffcffc3,0xf0804804,0xc0c0c7f,0x81f00000, -0,0,0x8000070,0x38000,0,0,0,0, -0,0,0x8000000,0,0,0,0,0, -0,0x4,0x10000000,0,0,0,0,0, -0,0x3,0xe0000000,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x4004000,0x400,0x40000000,0,0,0,0,0, -0xa00a01f,0xa00,0xa03f81fc,0x3fc3fc0e,0x1c00,0,0,0, -0x11011020,0x80001101,0x10404202,0x4024021e,0x1e00,0,0,0x800, -0x40,0x40000000,0x404202,0x4024023e,0xe01f07,0xfc1f87f8,0x73873873,0x87701400, -0x8028846,0x42680602,0x68400002,0x7e,0x1f01f87,0xfc000400,0xf2493cf3,0xc8088080, -0x8048448,0x44840804,0x845381ba,0x1100d07e,0x3f81f87,0xfc000400,0xf2493cf3,0xc8088080, -0x8088248,0x48820808,0x82510212,0x1101107e,0x7fc1f83,0xf81f84fc,0xf2493cf3,0xc0800800, -0x8048448,0x44840804,0x84510212,0x11c11c3e,0x7fc1f01,0xf0000084,0xf2493cf3,0xc8888880, -0x6026848,0x42880802,0x88510212,0x1141141e,0x7fc1e00,0xe0000084,0xf2493cf3,0xc8888880, -0x40,0x40000000,0x4d0212,0xdc11c0e,0x1c00,0x1f80fc,0xf3cf3cf3,0xc0800000, -0x11011020,0x80001101,0x10400002,0,0,0,0x80480480,0x48088080, -0xa00a01f,0xa00,0xa0400002,0,0,0,0x80480480,0x48089480, -0x4004000,0x400,0x40000000,0,0,0,0,0x800, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0x8,0,0,0,0,0, -0,0,0x10,0x1e00000,0,0,0,0, -0,0,0x20,0x7c600000,0,0,0,0, -0,0,0x40,0x60a0000c,0x3f00000,0,0,0, -0,0,0x80,0x612ffc1e,0x7f80000,0,0,0, -0xc01b800,0,0x738080,0x620ffc1e,0xffc0000,0,0,0, -0x12021000,0,0x924080,0x604ffc3f,0xffc0000,0,0,0, -0x21021000,0x1040,0x924040,0x604ffc3f,0xffc0000,0,0,0, -0x40819024,0xe0002042,0x6692403c,0x604ffc7f,0x8ffc0000,0,0,0, -0x80400054,0x40004044,0x88924000,0x7fcffc7f,0x8ffc0000,0,0,0, -0x8041a054,0x40008f86,0x48924000,0x7fcffc7f,0x8ffc0000,0,0,0, -0xf3c22074,0x44044004,0x28f3c000,0xffcff,0xcffc0000,0,0,0, -0x12022053,0x44042002,0xc6804000,0xffcff,0xc7f80000,0,0,0, -0x12021800,0x7fc1000,0x804000,0xffcff,0xc3f00000,0,0,0, -0x1e000000,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, diff --git a/vg_render.c b/vg_render.c index a1fc499..477d470 100644 --- a/vg_render.c +++ b/vg_render.c @@ -1,11 +1,45 @@ #include "vg_render.h" -#include "shaders/blit.h" + +#ifdef VG_3D #include "shaders/blitblur.h" +#endif -struct vg_postprocess vg_postprocess = +static struct vg_shader _shader_blit = { + .name = "[vg] blit texture", + .vs = { + .orig_file = NULL, + .static_src = + "layout (location=0) in vec2 a_co;" + "" + "uniform vec2 uInverseRatio;" + "out vec2 aUv;" + "" + "void main(){" + "gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);" + "aUv = a_co * uInverseRatio;" + "}", + }, + .fs = { + .orig_file = NULL, + .static_src = + "uniform sampler2D uTexMain;" + "out vec4 FragColor;" + "" + "in vec2 aUv;" + "" + "void main(){" + "FragColor = texture( uTexMain, aUv );" + "}" + } +}; + +struct vg_postprocess _vg_postprocess = +{ +#ifdef VG_3D .blur_effect = 1, .blur_strength = 0.3f, +#endif }; struct vg_render _vg_render = @@ -21,28 +55,26 @@ static void vg_async_postprocess_init( void *payload, u32 size ) 0.00f,0.00f, 1.00f,0.00f, 1.00f,1.00f, }; - glGenVertexArrays( 1, &vg_postprocess.quad_vao ); - glGenBuffers( 1, &vg_postprocess.quad_vbo ); - glBindVertexArray( vg_postprocess.quad_vao ); - glBindBuffer( GL_ARRAY_BUFFER, vg_postprocess.quad_vbo ); + glGenVertexArrays( 1, &_vg_postprocess.quad_vao ); + glGenBuffers( 1, &_vg_postprocess.quad_vbo ); + glBindVertexArray( _vg_postprocess.quad_vao ); + glBindBuffer( GL_ARRAY_BUFFER, _vg_postprocess.quad_vbo ); glBufferData( GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW ); - glBindVertexArray( vg_postprocess.quad_vao ); + glBindVertexArray( _vg_postprocess.quad_vao ); glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, sizeof(f32)*2, (void*)0 ); glEnableVertexAttribArray( 0 ); + vg_compile_shader( &_shader_blit ); } void vg_render_init(void) { vg_async_call( vg_async_postprocess_init, NULL, 0 ); - vg_console_reg_var( "render_scale", &_vg_render.scale, - k_var_dtype_f32, VG_VAR_PERSISTENT ); + vg_console_reg_var( "render_scale", &_vg_render.scale, k_var_dtype_f32, VG_VAR_PERSISTENT ); #ifdef VG_3D - vg_console_reg_var( "blur_strength", &vg_postprocess.blur_strength, - k_var_dtype_f32, 0 ); - vg_console_reg_var( "blur_effect", &vg_postprocess.blur_effect, - k_var_dtype_i32, VG_VAR_PERSISTENT ); + vg_console_reg_var( "blur_strength", &_vg_postprocess.blur_strength, k_var_dtype_f32, 0 ); + vg_console_reg_var( "blur_effect", &_vg_postprocess.blur_effect, k_var_dtype_i32, VG_VAR_PERSISTENT ); void *alloc = vg_mem.rtmemory; @@ -130,7 +162,7 @@ void vg_render_init(void) void vg_render_fullscreen_quad(void) { - glBindVertexArray( vg_postprocess.quad_vao ); + glBindVertexArray( _vg_postprocess.quad_vao ); glDrawArrays( GL_TRIANGLES, 0, 6 ); } @@ -143,27 +175,29 @@ void vg_postprocess_to_screen( vg_framebuffer *fb ) glBindFramebuffer( GL_FRAMEBUFFER, 0 ); glViewport( 0,0, vg.window_x, vg.window_y ); - glDisable(GL_BLEND); + glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); + glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA); + glBlendEquation(GL_FUNC_ADD); v2f inverse; vg_framebuffer_inverse_ratio( fb, inverse ); #ifdef VG_3D - if( vg_postprocess.blur_effect ) + if( _vg_postprocess.blur_effect ) { shader_blitblur_use(); shader_blitblur_uTexMain( 0 ); shader_blitblur_uTexMotion( 1 ); f32 s = vg.time_frame_delta*60.0; - shader_blitblur_uBlurStrength( vg_postprocess.blur_strength / s ); + shader_blitblur_uBlurStrength( _vg_postprocess.blur_strength / s ); shader_blitblur_uInverseRatio( inverse ); inverse[0] -= 0.0001f; inverse[1] -= 0.0001f; shader_blitblur_uClampUv( inverse ); - shader_blitblur_uOverrideDir( vg_postprocess.motion_blur_override ); + shader_blitblur_uOverrideDir( _vg_postprocess.motion_blur_override ); vg_framebuffer_bind_texture( fb, 0, 0 ); vg_framebuffer_bind_texture( fb, 1, 1 ); @@ -171,9 +205,9 @@ void vg_postprocess_to_screen( vg_framebuffer *fb ) else #endif { - shader_blit_use(); - shader_blit_uTexMain( 0 ); - shader_blit_uInverseRatio( inverse ); + glUseProgram( _shader_blit.id ); + glUniform1i( glGetUniformLocation( _shader_blit.id, "uTexMain" ), 0 ); + glUniform2fv( glGetUniformLocation( _shader_blit.id, "uInverseRatio" ), 1, vg_ui.bg_inverse_ratio ); vg_framebuffer_bind_texture( fb, 0, 0 ); } diff --git a/vg_render.h b/vg_render.h index 9e9db99..8f401ea 100644 --- a/vg_render.h +++ b/vg_render.h @@ -13,7 +13,7 @@ struct vg_postprocess v2f motion_blur_override; #endif } -extern vg_postprocess; +extern _vg_postprocess; struct vg_render { diff --git a/vg_ui/filebrowser.c b/vg_ui/filebrowser.c new file mode 100644 index 0000000..399a522 --- /dev/null +++ b/vg_ui/filebrowser.c @@ -0,0 +1,397 @@ +#include "vg/vg_ui/filebrowser.h" + +void vg_filebrowser_init( struct vg_filebrowser *browser ) +{ + browser->open_result = k_dir_open_none; + browser->view_top_entry = NULL; + browser->whole_list = NULL; + browser->selected_entry = NULL; + browser->current_path[0] = '\0'; + browser->entry_count = 0; + browser->view_top_index = 0; + browser->slider_value = 0.0f; + browser->mode = k_filebrowser_mode_pick_file; + browser->filter = 0; +} + +void filebrowser_textbox_callback( ui_context *ctx, char *buffer, u32 len, void *userdata ) +{ + struct vg_filebrowser *browser = userdata; + vg_filebrowser_free_entries( browser ); + vg_filebrowser_populate( browser ); +} + +enum filebrowser_action vg_filebrowser_ui( ui_context *ctx, ui_rect root_rect, struct vg_filebrowser *browser ) +{ + enum filebrowser_action result_action = k_filebrowser_action_none; + + ui_rect panel; + rect_copy( root_rect, panel ); + ui_rect_pad( panel, (ui_px[2]){8,8} ); + + ui_rect top_bar, box_refresh, box_up, bottom_bar; + ui_standard_widget( ctx, panel, top_bar, 1 ); + + ui_px height = ui_standard_widget_height( ctx, 1 ); + ui_split( panel, k_ui_axis_h, -height, ctx->padding, panel, bottom_bar ); + + ui_split( top_bar, k_ui_axis_v, 24, 1, box_refresh, top_bar ); + ui_split( top_bar, k_ui_axis_v, 24, 1, box_up, top_bar ); + + struct ui_textbox_callbacks callbacks = + { + .enter = filebrowser_textbox_callback, + .up = NULL, + .down = NULL, + .change = NULL, + .escape = NULL, + .userdata = browser + }; + + ctx->text_encoding = k_ui_text_encoding_utf8; + ui_textbox( ctx, top_bar, NULL, browser->current_path, sizeof(browser->current_path)-1, 1, 0, &callbacks ); + ctx->text_encoding = k_ui_text_encoding_ascii_vg_extended; + + ctx->font = &vgf_default_large; + if( ui_button_text( ctx, box_refresh, "\xb6", 1 ) == k_ui_button_click ) + { + vg_filebrowser_free_entries( browser ); + vg_filebrowser_populate( browser ); + } + + if( ui_button_text( ctx, box_up, "\xb8", 1 ) == k_ui_button_click ) + { + vg_str str = + { + .buffer = browser->current_path, + .i = strlen( browser->current_path ), + .len = sizeof(browser->current_path)-1 + }; + + char *sep = vg_strch( &str, '/' ); + if( sep ) + { + sep[0] = '\0'; + vg_filebrowser_free_entries( browser ); + vg_filebrowser_populate( browser ); + } + } + ctx->font = &vgf_default_small; + + if( browser->open_result == k_dir_open_none ) + { + ui_text( ctx, panel, "...", 1, k_ui_align_middle_center, 0 ); + } + else if( browser->open_result == k_dir_open_ok ) + { + ui_rect list_panel, scrollbar; + ui_split( panel, k_ui_axis_v, -16, 8, list_panel, scrollbar ); + u32 max_view = (list_panel[3]-2) / 24; + + /* scrollbar */ + f32 t; + enum ui_button_state state = ui_slider_base( ctx, scrollbar, k_ui_axis_v, 0, + browser->entry_count+1, &browser->slider_value, &t ); + enum ui_button_state mask_using = k_ui_button_holding_inside | + k_ui_button_holding_outside | + k_ui_button_click; + if( state & mask_using ) + { + u32 target = browser->slider_value, + index = browser->view_top_index; + + while( index != target ) + { + struct vg_filebrowser_entry *new_top; + if( index < target ) + { + new_top = browser->view_top_entry->prev; + index ++; + } + else + { + new_top = browser->view_top_entry->next; + index --; + } + + if( new_top ) + { + browser->view_top_entry = new_top; + browser->view_top_index = index; + } + else break; + } + } + + ui_fill( ctx, scrollbar, ui_colour( ctx, k_ui_bg ) ); + ui_outline( ctx, scrollbar, -1, ui_colour(ctx, k_ui_bg+2), 0 ); + + ui_rect bar; + rect_copy( scrollbar, bar ); + bar[3] = (f32)scrollbar[3] * vg_minf(((f32)max_view / (f32)(browser->entry_count+1)), 1.0f); + bar[1] = scrollbar[1] + (f32)scrollbar[3] * ((f32)browser->view_top_index / (f32)(browser->entry_count+1)); + + ui_rect bar_top; + rect_copy( bar, bar_top ); + bar_top[3] = 1; + + ui_clip( scrollbar, bar, bar ); + ui_fill( ctx, bar, ui_colour( ctx, k_ui_bg+1 ) ); + ui_fill( ctx, bar_top, ui_colour( ctx, k_ui_fg ) ); + + /* entries */ + ui_fill( ctx, list_panel, ui_colour( ctx, k_ui_bg+3 ) ); + ui_rect entry_box = { list_panel[0]+1, list_panel[1]+1, list_panel[2]-2, 24 }; + struct vg_filebrowser_entry *entry = browser->view_top_entry; + + bool reload_next_time = 0; + + for( u32 i=0; iselected_entry ) + { + ui_fill( ctx, entry_box, ui_colour( ctx, k_ui_bg ) ); + ui_outline( ctx, entry_box, -1, ui_colour( ctx, k_ui_orange ), 0 ); + } + else + { + enum ui_button_state click_state = k_ui_button_none; + click_state = ui_colourbutton( ctx, entry_box, k_ui_bg+2+(i&0x1), 0, 0 ); + + if( click_state == k_ui_button_click ) + { + if( entry->type == k_vg_entry_type_dir ) + { + u32 cur_len = strlen( browser->current_path ); + if( (cur_len + strlen( entry->name ) + 2) > sizeof(browser->current_path) ) + vg_fatal_error( "Max path size exceeded." ); + else + { + strcat( browser->current_path, "/" ); + strcat( browser->current_path, entry->name ); + reload_next_time = 1; + } + } + else + { + browser->selected_entry = entry; + } + } + else if( click_state != k_ui_button_none ) + { + text_colour = ui_colour( ctx, k_ui_bg ); + } + } + + ui_rect icon_box, label_box; + ui_split( entry_box, k_ui_axis_v, 24, 0, icon_box, label_box ); + + ctx->font = &vgf_default_large; + if( entry->type == k_vg_entry_type_dir ) + { + ui_text( ctx, icon_box, "\xb7", 1, k_ui_align_middle_center, 0 ); + } + else + { + if( entry->media_type != 0 ) + { + const struct + { + const char *icon_str; + enum ui_scheme_colour colour; + } + scheme[] = + { + [k_media_type_image] = { "\xb9", k_ui_green }, + [k_media_type_video] = { "\xba", k_ui_blue }, + [k_media_type_audio] = { "\xbb", k_ui_purple }, + [k_media_type_text ] = { "\xbc", k_ui_yellow } + }; + + ui_text( ctx, icon_box, scheme[entry->media_type].icon_str, 1, + k_ui_align_middle_center, ui_colour(ctx,scheme[entry->media_type].colour) ); + } + } + ctx->font = &vgf_default_small; + + ctx->text_encoding = k_ui_text_encoding_utf8; + ui_text( ctx, label_box, entry->name, 1, k_ui_align_middle_left, 0 ); + ctx->text_encoding = k_ui_text_encoding_ascii_vg_extended; + + entry_box[1] += entry_box[3]; + entry = entry->prev; + } + else + break; + } + + if( reload_next_time ) + { + vg_filebrowser_free_entries( browser ); + vg_filebrowser_populate( browser ); + } + + ui_rect ok_box, cancel_box; + ui_split( bottom_bar, k_ui_axis_v, -120, ctx->padding, bottom_bar, ok_box ); + ui_split( bottom_bar, k_ui_axis_v, -80, ctx->padding, bottom_bar, cancel_box ); + + if( ui_button_text( ctx, cancel_box, "Cancel", 1 ) == k_ui_button_click ) + { + result_action = k_filebrowser_action_escape; + } + + if( browser->selected_entry ) + { + if( ui_button_text( ctx, ok_box, "OK", 1 ) == k_ui_button_click ) + { + result_action = k_filebrowser_action_accept; + } + } + else + { + ui_fill( ctx, ok_box, ui_colour( ctx, k_ui_bg ) ); + ui_text( ctx, ok_box, "OK", 1, k_ui_align_middle_center, ui_colour( ctx, k_ui_bg+4 ) ); + } + } + else + { + ui_text( ctx, panel, dir_open_result_str[browser->open_result], 1, k_ui_align_middle_center, + ui_colour(ctx,k_ui_yellow) ); + } + + return result_action; +} + +void vg_filebrowser_free_entries( struct vg_filebrowser *browser ) +{ + struct vg_filebrowser_entry *entry = browser->whole_list; + + while( entry ) + { + struct vg_filebrowser_entry *prev = entry->prev; + + free( entry ); + entry = prev; + } + + browser->whole_list = NULL; + browser->view_top_entry = NULL; + browser->selected_entry = NULL; + browser->entry_count = 0; + browser->view_top_index = 0; + browser->slider_value = 0.0f; +} + +void vg_filebrowser_populate( struct vg_filebrowser *browser ) +{ + VG_ASSERT( browser->whole_list == NULL ); + + vg_dir dir; + browser->open_result = vg_dir_open( &dir, browser->current_path ); + browser->entry_count = 0; + browser->view_top_index = 0; + browser->slider_value = 0.0f; + + struct vg_filebrowser_entry *folder_list_head = NULL, + *folder_list_tail = NULL, + *file_list_head = NULL; + + if( browser->open_result != k_dir_open_ok ) + return; + + while( vg_dir_next_entry( &dir ) ) + { + enum vg_entry_type type = vg_dir_entry_type( &dir ); + if( type == k_vg_entry_type_unknown ) + continue; + + const char *entry_name = vg_dir_entry_name( &dir ); + + enum vg_media_type media_type = k_media_type_none; + if( type == k_vg_entry_type_file ) + { + const char *ch = entry_name, *ext = NULL; + while( *ch ) + { + if( *ch == '.' ) + ext = (ch+1); + + ch ++; + } + + if( ext ) + { + if( !strcmp( ext, "jpg" ) || !strcmp( ext, "jpeg" ) || !strcmp( ext, "png" ) || !strcmp( ext, "tga" ) || + !strcmp( ext, "bmp" ) ) + { + media_type = k_media_type_image; + } + else if( !strcmp( ext, "mp4" ) || !strcmp( ext, "mkv" ) || !strcmp( ext, "mov" ) ) + { + media_type = k_media_type_video; + } + else if( !strcmp( ext, "opus" ) || !strcmp( ext, "ogg" ) || !strcmp( ext, "mp3" ) || !strcmp( ext, "wav" ) ) + { + media_type = k_media_type_audio; + } + else if( !strcmp( ext, "txt" ) || !strcmp( ext, "conf" ) || !strcmp( ext, "cfg" ) || !strcmp( ext, "c" ) || + !strcmp( ext, "h" ) || !strcmp( ext, "py" ) || !strcmp( ext, "sh" ) || !strcmp( ext, "gitignore" )) + { + media_type = k_media_type_text; + } + } + + if( browser->filter ) + { + if( !((0x1 << media_type) & browser->filter) ) + continue; + } + } + + u32 len = strlen( entry_name ); + struct vg_filebrowser_entry *entry = malloc( sizeof(struct vg_filebrowser_entry) + len + 1 ); + entry->next = NULL; + entry->type = type; + entry->media_type = media_type; + strcpy( entry->name, entry_name ); + + if( type == k_vg_entry_type_dir ) + { + entry->prev = folder_list_head; + if( folder_list_head ) + folder_list_head->next = entry; + else + folder_list_tail = entry; + folder_list_head = entry; + } + else if( type == k_vg_entry_type_file ) + { + entry->prev = file_list_head; + if( file_list_head ) + file_list_head->next = entry; + file_list_head = entry; + } + + browser->entry_count ++; + } + vg_dir_close( &dir ); + + if( folder_list_head ) + { + browser->whole_list = folder_list_head; + folder_list_tail->prev = file_list_head; + + if( file_list_head ) + file_list_head->next = folder_list_tail; + } + else + { + browser->whole_list = file_list_head; + } + + browser->view_top_entry = browser->whole_list; +} diff --git a/vg_ui/filebrowser.h b/vg_ui/filebrowser.h new file mode 100644 index 0000000..ef552d5 --- /dev/null +++ b/vg_ui/filebrowser.h @@ -0,0 +1,51 @@ +#pragma once +#include "vg/vg_ui/imgui.h" + +struct vg_filebrowser_entry +{ + struct vg_filebrowser_entry *prev, *next; + + enum vg_entry_type type; + enum vg_media_type + { + k_media_type_none = 0, + k_media_type_image = 1, + k_media_type_video = 2, + k_media_type_audio = 3, + k_media_type_text = 4 + } + media_type; + + char name[]; +}; + +enum filebrowser_action +{ + k_filebrowser_action_none, + k_filebrowser_action_escape, + k_filebrowser_action_accept +}; + +struct vg_filebrowser +{ + char current_path[ 4096 ]; + enum dir_open_result open_result; + + struct vg_filebrowser_entry *whole_list, *view_top_entry, *selected_entry; + u32 entry_count, view_top_index; + f32 slider_value; + + enum filebrowser_mode + { + k_filebrowser_mode_pick_folder, + k_filebrowser_mode_pick_file, + } + mode; + + u32 filter; +}; + +void vg_filebrowser_init( struct vg_filebrowser *browser ); +enum filebrowser_action vg_filebrowser_ui( ui_context *ctx, ui_rect root_rect, struct vg_filebrowser *browser ); +void vg_filebrowser_populate( struct vg_filebrowser *browser ); +void vg_filebrowser_free_entries( struct vg_filebrowser *browser ); diff --git a/vg_ui/imgui.c b/vg_ui/imgui.c index dbcbe5e..ab0915b 100644 --- a/vg_ui/imgui.c +++ b/vg_ui/imgui.c @@ -19,6 +19,7 @@ void ui_init( ui_context *ctx, ctx->max_indices = indices_max; ctx->cur_indice = 0; ctx->indice_start = 0; + ctx->text_encoding = k_ui_text_encoding_ascii_vg_extended; if( !verts_buf || !indices_buf ) exit(0); @@ -345,7 +346,7 @@ ui_px ui_text_line_width( ui_context *ctx, const char *str ) if( c == 'm' ) break; } - + if( c == 0 ) break; else continue; } @@ -447,7 +448,8 @@ u32 ui_ntext( ui_context *ctx, ui_px glow_text = 0; ui_rect text_cursor; - if( colour == 0 ) colour = ui_colour(ctx, k_ui_fg ); + if( colour == 0 ) + colour = ui_colour( ctx, k_ui_fg ); colour &= 0x00ffffff; @@ -471,8 +473,28 @@ u32 ui_ntext( ui_context *ctx, text_cursor[1] += (rect[3]-height)/2; } + u32 utf8_counter = 0; + while( (c = *(_c ++)) ) { + if( ctx->text_encoding == k_ui_text_encoding_utf8 ) + { + if( utf8_counter ) + { + c = 0xbe; + utf8_counter --; + } + else + { + if ( (c & 0xe0) == 0xc0 ) utf8_counter = 1; + else if( (c & 0xf0) == 0xe0 ) utf8_counter = 2; + else if( (c & 0xf8) == 0xf0 ) utf8_counter = 3; + + if( utf8_counter ) + c = 0xbd; + } + } + if( printed_chars >= len ) { printed_chars = 0; @@ -557,6 +579,12 @@ u32 ui_ntext( ui_context *ctx, _c ++; continue; } + else if( c == '\x07' ) + { + glow_text = 0; + colour = ui_colour( ctx, k_ui_fg ) & 0x00ffffff; + continue; + } else if( c == '\t' ) { text_cursor[0] += ctx->font->sx*scale*4; @@ -606,12 +634,10 @@ ui_px ui_standard_widget_height( ui_context *ctx, ui_px count ) return (count * ctx->font->sy + 18) * ctx->scale; } -void ui_standard_widget( ui_context *ctx, - ui_rect inout_panel, ui_rect out_rect, ui_px count ) +void ui_standard_widget( ui_context *ctx, ui_rect inout_panel, ui_rect out_rect, ui_px count ) { ui_px height = ui_standard_widget_height( ctx, count ); - ui_split( inout_panel, k_ui_axis_h, height, ctx->padding, - out_rect, inout_panel ); + ui_split( inout_panel, k_ui_axis_h, height, ctx->padding, out_rect, inout_panel ); } void ui_info( ui_context *ctx, ui_rect inout_panel, const char *text ) @@ -636,7 +662,7 @@ void ui_defocus_all( ui_context *ctx ) { ctx->stop_text_input(); if( ctx->textbox.callbacks.escape ) - ctx->textbox.callbacks.escape( ctx ); + ctx->textbox.callbacks.escape( ctx, ctx->textbox.callbacks.userdata ); } ctx->focused_control_id = NULL; @@ -697,8 +723,7 @@ enum ui_button_state ui_colourbutton( ui_context *ctx, ui_rect rect, u32 col_base = ctx->scheme[ colour ], col_highlight = ctx->scheme[ hi_colour? hi_colour: k_ui_fg ], - col_hover = ctx->scheme[ hover_colour? hover_colour: - colour + k_ui_brighter ]; + col_hover = ctx->scheme[ hover_colour? hover_colour: colour + k_ui_brighter ]; if( state == k_ui_button_click ) { @@ -975,19 +1000,18 @@ static void ui_enum_post( ui_context *ctx ) * ----------------------------------------------------------------------------- */ -enum ui_button_state ui_slider_base( ui_context *ctx, - ui_rect box, f32 min, f32 max, f32 *value, f32 *out_t ) +enum ui_button_state ui_slider_base( ui_context *ctx, ui_rect box, enum ui_axis axis, + f32 min, f32 max, f32 *value, f32 *out_t ) { - enum ui_button_state mask_using = - k_ui_button_holding_inside | - k_ui_button_holding_outside | - k_ui_button_click, + enum ui_button_state mask_using = k_ui_button_holding_inside | + k_ui_button_holding_outside | + k_ui_button_click, state = ui_button_base( ctx, box ); f32 t; if( state & mask_using ) { - t = vg_clampf( (f32)(ctx->mouse[0] - box[0]) / (f32)( box[2] ), 0,1 ); + t = vg_clampf( (f32)(ctx->mouse[axis] - box[axis]) / (f32)( box[2+axis] ), 0,1 ); *value = vg_lerpf( min, max, t ); } else @@ -1018,14 +1042,11 @@ bool ui_slider_standard( ui_context *ctx, k_ui_button_holding_outside | k_ui_button_click, mask_brighter = mask_using | k_ui_button_hover, - state = ui_slider_base( ctx, box, min, max, value, &t ); + state = ui_slider_base( ctx, box, k_ui_axis_h, min, max, value, &t ); ui_rect line = { box[0], box[1], t * (f32)box[2], box[3] }; - ui_fill( ctx, line, - ui_colour(ctx,state&mask_brighter? k_ui_bg+4: k_ui_bg+2) ); - - ui_fill( ctx, (ui_rect){ box[0]+line[2], box[1], box[2]-line[2], box[3] }, - ui_colour(ctx, k_ui_bg ) ); + ui_fill( ctx, line, ui_colour(ctx,state&mask_brighter? k_ui_bg+4: k_ui_bg+2) ); + ui_fill( ctx, (ui_rect){ box[0]+line[2], box[1], box[2]-line[2], box[3] }, ui_colour(ctx, k_ui_bg ) ); ui_outline( ctx, box, 1, ui_colour(ctx,state? k_ui_fg+3: k_ui_bg+3), 0 ); ui_slider_text( ctx, box, NULL, *value ); @@ -1216,7 +1237,7 @@ static void _ui_textbox_change_callback( ui_context *ctx ) { if( ctx->textbox.callbacks.change ) { - ctx->textbox.callbacks.change( ctx, ctx->textbuf, ctx->textbox.len ); + ctx->textbox.callbacks.change( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); /* we gave permission to modify the buffer in this callback so.. */ int len = strlen( ctx->textbuf ); @@ -1333,7 +1354,7 @@ void _ui_textbox_up( ui_context *ctx ) { if( ctx->textbox.callbacks.up ) { - ctx->textbox.callbacks.up( ctx, ctx->textbuf, ctx->textbox.len ); + ctx->textbox.callbacks.up( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); } } } @@ -1397,7 +1418,7 @@ void _ui_textbox_down( ui_context *ctx ) { if( ctx->textbox.callbacks.down ) { - ctx->textbox.callbacks.down( ctx, ctx->textbuf, ctx->textbox.len ); + ctx->textbox.callbacks.down( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); } } } @@ -1509,7 +1530,7 @@ void _ui_textbox_enter( ui_context *ctx ) ui_ignore_input_frames( ctx, 2 ); if( ctx->textbox.callbacks.enter ) - ctx->textbox.callbacks.enter( ctx, ctx->textbuf, ctx->textbox.len ); + ctx->textbox.callbacks.enter( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); if( ctx->focused_control_type != k_ui_control_textbox ) return; @@ -1823,6 +1844,7 @@ int ui_textbox( ui_context *ctx, ui_rect inout_panel, const char *label, ctx->textbox.callbacks.down = NULL; ctx->textbox.callbacks.up = NULL; ctx->textbox.callbacks.enter = NULL; + ctx->textbox.callbacks.userdata = NULL; } ctx->start_text_input(); diff --git a/vg_ui/imgui.h b/vg_ui/imgui.h index a5504e8..8279b9b 100644 --- a/vg_ui/imgui.h +++ b/vg_ui/imgui.h @@ -142,11 +142,12 @@ struct ui_context struct ui_textbox_callbacks { - void (*enter)( ui_context *ctx, char *, u32 ), - (*up)( ui_context *ctx, char *, u32 ), - (*down)( ui_context *ctx, char *, u32 ), - (*change)( ui_context *ctx, char *, u32 ), - (*escape)( ui_context *ctx ); + void (*enter)( ui_context *ctx, char *, u32, void * ), + (*up)( ui_context *ctx, char *, u32, void * ), + (*down)( ui_context *ctx, char *, u32, void * ), + (*change)( ui_context *ctx, char *, u32, void * ), + (*escape)( ui_context *ctx, void * ); + void *userdata; } callbacks; } @@ -201,6 +202,13 @@ struct ui_context } cursor; + enum ui_text_encoding + { + k_ui_text_encoding_ascii_vg_extended, + k_ui_text_encoding_utf8 + } + text_encoding; + ui_px widget_height, scale, padding; void (*render_batch)(ui_context *ctx, ui_batch *batch, @@ -247,10 +255,8 @@ void ui_outline( ui_context *ctx, ui_rect rect, ui_px thickness, u32 colour, u32 /* rect controls */ void rect_copy( ui_rect a, ui_rect b ); -void ui_split( ui_rect rect, enum ui_axis other, ui_px width, ui_px gap, - ui_rect l, ui_rect r ); -void ui_split_ratio( ui_rect rect, enum ui_axis dir, float ratio, - ui_px gap, ui_rect l, ui_rect r ); +void ui_split( ui_rect rect, enum ui_axis other, ui_px width, ui_px gap, ui_rect l, ui_rect r ); +void ui_split_ratio( ui_rect rect, enum ui_axis dir, float ratio, ui_px gap, ui_rect l, ui_rect r ); void ui_rect_pad( ui_rect rect, ui_px pad[2] ); int ui_clip( ui_rect parent, ui_rect child, ui_rect clipped ); int ui_inside_rect( ui_rect rect, ui_px co[2] ); @@ -327,7 +333,7 @@ void ui_enum( ui_context *ctx, ui_rect inout_panel, const char *str_label, enum ui_button_state ui_slider_base( ui_context *ctx, - ui_rect box, f32 min, f32 max, f32 *value, f32 *out_t ); + ui_rect box, enum ui_axis axis, f32 min, f32 max, f32 *value, f32 *out_t ); void ui_slider_text( ui_context *ctx, ui_rect box, const char *format, f32 value ); bool ui_slider_standard( ui_context *ctx,