diff options
63 files changed, 1797 insertions, 377 deletions
@@ -93,10 +93,18 @@ SRCS_NAME += ft_draw_life_bar.c SRCS_NAME += ft_del_extra_sprites.c SRCS_NAME += ft_init_sfx.c SRCS_NAME += ft_sfx_death.c -SRCS_NAME += ft_sfx_trap.c +SRCS_NAME += ft_sfx_footstep.c SRCS_NAME += ft_sfx_new_level.c +SRCS_NAME += ft_sfx_pain.c +SRCS_NAME += ft_sfx_trap.c SRCS_NAME += ft_death_screen.c SRCS_NAME += ft_death_hooks.c +SRCS_NAME += ft_init_sprites.c +SRCS_NAME += ft_get_fps_count.c +SRCS_NAME += ft_get_heal_spawn.c +SRCS_NAME += ft_draw_heals.c +SRCS_NAME += ft_draw_heals_extra.c +SRCS_NAME += ft_find_item.c #--------------------------------------------------------------------------------------------------# SRCS = $(addprefix ${SRCS_DIR},${SRCS_NAME}) #--------------------------------------------------------------------------------------------------# @@ -179,10 +187,11 @@ else @$(MAKE) --no-print-directory -C ${LFT_DIR} all endif ifeq (${OS}, Darwin) - ${CC} ${CFLAGS} -o $@ ${OBJS} -L${LFT_DIR} -L${MLX_DIR} -lft -lmlx -lm \ + ${CC} ${CFLAGS} -o $@ ${OBJS} -L${LFT_DIR} -L${MLX_DIR} -lft -lmlx -lm -lpthread \ -framework OpenGL -framework AppKit else - ${CC} ${CFLAGS} -o $@ ${OBJS} -L${LFT_DIR} -L${MLX_GNU_DIR} -lft -lX11 -lXext -lmlx -lm -lbsd + ${CC} ${CFLAGS} -o $@ ${OBJS} -L${LFT_DIR} -L${MLX_GNU_DIR} -lft -lX11 -lXext -lmlx -lm -lbsd \ +-lpthread endif #--------------------------------------------------------------------------------------------------# all: ${NAME} @@ -206,8 +215,10 @@ endif #--------------------------------------------------------------------------------------------------# re: fclean all #--------------------------------------------------------------------------------------------------# +bonus: all +#--------------------------------------------------------------------------------------------------# run: all @./${NAME} "map/map_one.cub" #--------------------------------------------------------------------------------------------------# -.PHONY: all clean clean fclean re run default +.PHONY: all clean clean fclean re bonus run default #============================================== EOF ===============================================# @@ -1,9 +0,0 @@ -garder : -modifs a ft_draw_sprites et ft_draw_sprites_extra -sort sprites ajoutes au header - -virer : -map - -probleme : -les sprites differents se chevauchent, ca va finir par marcher diff --git a/inc/cub3d.h b/inc/cub3d.h index a7f6b7d..fa42b4f 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -17,6 +17,7 @@ #include <cub3d_structs.h> #include <stddef.h> #include <stdint.h> +#include <time.h> /* ** ====== STRUCTS ====== @@ -35,6 +36,7 @@ t_bmp_file ft_init_bmp(void); t_bmp_info ft_init_bmp_info(void); t_rgb ft_hex_to_og_rgb(uint32_t color); int8_t ft_init_sfx(t_sfx *sfx); +int8_t ft_init_sprites(t_sprite ***sprites); /* ** ====== HOOKS ====== @@ -82,6 +84,8 @@ void ft_calc_sprite(t_cub *cl); void ft_draw_sprite(t_cub *cl, t_sprite *sprite); void ft_calc_trap(t_cub *cl); void ft_draw_traps(t_cub *cl, t_sprite *sprite); +void ft_calc_heal(t_cub *cl); +void ft_draw_heals(t_cub *cl, t_sprite *sprite); void ft_draw_skybox(t_cub *cl); void ft_macos_suffer_animation(t_cub *cl); void ft_linux_suffer_animation(t_cub *cl); @@ -116,6 +120,7 @@ size_t ft_get_map_h(char **map); size_t ft_get_map_w(char **map); void ft_get_sprite_spawn(t_cub *clist); void ft_get_trap_spawn(t_cub *clist); +void ft_get_heal_spawn(t_cub *clist); int8_t ft_check_map_line(char *line, uint8_t l, t_cub *clist); int8_t ft_check_ext(const char *filep, const char *ext); int8_t ft_check_not_found(const char *path); @@ -150,8 +155,15 @@ void ft_floor_cast_inits(uint16_t y, t_ray *rl, t_cub *cl); */ void ft_sfx_death(t_cub *cl); -void ft_sfx_trap(t_cub *cl); +void ft_sfx_footstep(t_cub *cl); void ft_sfx_new_level(t_cub *cl); +void ft_sfx_pain(t_cub *cl); +void ft_sfx_trap(t_cub *cl); +void *ft_sfx_death_thread(void *vargp); +void *ft_sfx_footstep_thread(void *vargp); +void *ft_sfx_new_lvl_thread(void *vargp); +void *ft_sfx_pain_thread(void *vargp); +void *ft_sfx_trap_thread(void *vargp); /* ** ====== OTHER ====== @@ -171,5 +183,7 @@ uint32_t ft_rgb_to_hex(t_rgb rgb); t_bmp_rgb ft_hex_to_rgb(uint32_t color); uint32_t ft_darken(t_rgb rgb, t_cub *cl); void ft_death_screen(t_cub *cl); +void ft_get_fps_count(clock_t delta_time, t_cub *cl); +void ft_find_item(t_player *pl, t_map *ml, t_cub *cl); # endif diff --git a/inc/cub3d_defines.h b/inc/cub3d_defines.h index 0cd15fa..e82fef5 100644 --- a/inc/cub3d_defines.h +++ b/inc/cub3d_defines.h @@ -16,6 +16,17 @@ /* ** ====== RETURN VALUES ====== */ + +/* +** ret vals: +** 1: no argv[1] +** 2: failed structs init +** 3: failed mlx init +** 4: map error +** 5: no map +** 6: read error +*/ + enum { FT_RET_FINE, @@ -31,16 +42,6 @@ enum } retvals; /* -** ret vals: -** 1: no argv[1] -** 2: failed structs init -** 3: failed mlx init -** 4: map error -** 5: no map -** 6: read error -*/ - -/* ** ====== OS ====== */ @@ -67,7 +68,7 @@ enum # define FT_F1_KEY 122 # define FT_TAB_KEY 48 # define FT_ESC_KEY 53 -/* TODO macOS return key */ +/* TODO: macOS return key */ # else # define FT_W_KEY 119 # define FT_A_KEY 97 @@ -86,11 +87,15 @@ enum */ # define FT_SFX_DEATH_PATH "./media/sound/sfx/death_screen.wav" +# define FT_SFX_FS_ONE_PATH "./media/sound/sfx/footstep_one.wav" +# define FT_SFX_FS_TWO_PATH "./media/sound/sfx/footstep_two.wav" # define FT_SFX_N_LVL_PATH "./media/sound/sfx/next_lvl.wav" # define FT_SFX_SCR_ONE_PATH "./media/sound/sfx/scream_one.wav" # define FT_SFX_SCR_TWO_PATH "./media/sound/sfx/scream_two.wav" # define FT_SFX_TRAP_PATH "./media/sound/sfx/trap.wav" # define FT_DEATH_SCREEN_PATH "./media/img/death_screen.xpm" +# define FT_HUD_BACK_PATH "./media/img/plate_small.xpm" +# define FT_HEAL_PACK_PATH "./media/img/first_aid.xpm" /* ** ====== SOUNDS ====== @@ -114,7 +119,7 @@ enum ** ====== COLLISION ====== */ -# define FT_COLL_MULT 0.225 +# define FT_COLL_MULT 0.3 /* ** ====== SCREEN ====== @@ -129,12 +134,13 @@ enum */ # define FT_CHRST_VALID_PARSE "RNSEWFCLMT" -# define FT_CHRST_MAP_ENTRY "0123456789NSEWLT " +# define FT_CHRST_MAP_ENTRY "0123456789NSEWLT+ " # define FT_CHRST_SPRITES "23456789" # define FT_CHRST_SPAWN "NSEW" -# define FT_CHRST_MAP_NON_WALL "023456789NESWLT" +# define FT_CHRST_MAP_NON_WALL "023456789NESWLT+" # define FT_CHRST_COLLISION "123456789 " # define FT_CHRST_DETECT "1L" +# define FT_CHRST_ITEM "+!@" /* ** ====== BMP ====== @@ -148,43 +154,45 @@ enum ** ====== MAP ERROR MSG ====== */ -# define FT_ERR_ALLOCATE "Allocation error" -# define FT_ERR_READ "read error" -# define FT_ERR_ARGS "too many or to few arguments" -# define FT_ERR_ARGV "Bad arguments" -# define FT_ERR_RES_SMALL "resolution is too small, 50x50 minimum pls" -# define FT_ERR_RES_ALPHA "resolution should be digits only" -# define FT_ERR_SH_ALPHA "shadow amount should be digits only" -# define FT_ERR_SH_RANGE "shadow should be set between 0 - 20" -# define FT_ERR_NOT_A_CUB "given map is not a .cub" -# define FT_ERR_NOT_A_XPM "given texture is not a .xpm" -# define FT_ERR_NOT_A_WAV "given sound file is not a .wav" -# define FT_ERR_COLOR_ALPHA "colors should be digits only" -# define FT_ERR_COLOR_MAX "colors should be maximum 255" -# define FT_ERR_COLOR_ARGS "colors should be three numbers with commas" -# define FT_ERR_SPRITE_DUMB "bad sprite order" -# define FT_ERR_UNFINISHED "no map" -# define FT_ERR_MAP_LEN "map length inconsistency" -# define FT_ERR_ILL_ENTRY "illegal map entry" -# define FT_ERR_ALR_SET "duplicate entry" -# define FT_ERR_ILL_MAP "map contains illegal char" -# define FT_ERR_MULT_SPAWN "multiple spawn points" -# define FT_ERR_MULT_NLVL "multiple spawn new level access points" -# define FT_ERR_NO_MAP "No map" -# define FT_ERR_MAP_WALLS "bad space or map is not surrounded by walls" -# define FT_ERR_MAP_EMPL "empty line in map" -# define FT_ERR_MAP_L_L "last line is invalid" -# define FT_ERR_RD_NO "could not find north side texture file" -# define FT_ERR_RD_SO "could not find south side texture file" -# define FT_ERR_RD_EA "could not find east side texture file" -# define FT_ERR_RD_WE "could not find west side texture file" -# define FT_ERR_RD_SP "could not find sprite texture file" -# define FT_ERR_RD_SB "could not find skybox file" -# define FT_ERR_RD_NL_TEX "could not find next level texture file" -# define FT_ERR_RD_NL_MAP "could not find next level map file" -# define FT_ERR_RD_MUSIC "could not find music file" -# define FT_ERR_RD_TRAP "could not find trap texture file" -# define FT_ERR_WR_BMP "could not export to bmp" +# define FT_ERR_ALLOCATE "Allocation error" +# define FT_ERR_READ "read error" +# define FT_ERR_ARGS "too many or to few arguments" +# define FT_ERR_ARGV "Bad arguments" +# define FT_ERR_RES_SMALL "resolution is too small, 50x50 minimum pls" +# define FT_ERR_RES_ALPHA "resolution should be digits only" +# define FT_ERR_SH_ALPHA "shadow amount should be digits only" +# define FT_ERR_SH_RANGE "shadow should be set between 0 - 20" +# define FT_ERR_NOT_A_CUB "given map is not a .cub" +# define FT_ERR_NOT_A_XPM "given texture is not a .xpm" +# define FT_ERR_NOT_A_WAV "given sound file is not a .wav" +# define FT_ERR_COLOR_ALPHA "colors should be digits only" +# define FT_ERR_COLOR_MAX "colors should be maximum 255" +# define FT_ERR_COLOR_ARGS "colors should be three numbers with commas" +# define FT_ERR_SPRITE_DUMB "bad sprite order" +# define FT_ERR_UNFINISHED "no map" +# define FT_ERR_MAP_LEN "map length inconsistency" +# define FT_ERR_ILL_ENTRY "illegal map entry" +# define FT_ERR_ALR_SET "duplicate entry" +# define FT_ERR_ILL_MAP "map contains illegal char" +# define FT_ERR_MULT_SPAWN "multiple spawn points" +# define FT_ERR_MULT_NLVL "multiple spawn new level access points" +# define FT_ERR_NO_MAP "No map" +# define FT_ERR_MAP_WALLS "bad space or map is not surrounded by walls" +# define FT_ERR_MAP_EMPL "empty line in map" +# define FT_ERR_MAP_L_L "last line is invalid" +# define FT_ERR_RD_NO "could not find north side texture file" +# define FT_ERR_RD_SO "could not find south side texture file" +# define FT_ERR_RD_EA "could not find east side texture file" +# define FT_ERR_RD_WE "could not find west side texture file" +# define FT_ERR_RD_SP "could not find sprite texture file" +# define FT_ERR_RD_SB "could not find skybox file" +# define FT_ERR_RD_NL_TEX "could not find next level texture file" +# define FT_ERR_RD_NL_MAP "could not find next level map file" +# define FT_ERR_RD_MUSIC "could not find music file" +# define FT_ERR_RD_TRAP "could not find trap texture file" +# define FT_ERR_WR_BMP "could not export to bmp" +# define FT_ERR_TOO_MUCH_HEALS "too much heal packs, limit is 64" +# define FT_ERR_TOO_MUCH_TRAPS "too much traps, limit is 512" /* ** ====== MISSING ERROR MSG ====== @@ -203,17 +211,20 @@ enum # define FT_ERR_MISS_CEIL_C "ceiling color" # define FT_ERR_MISS_PLAYER_SPAWN "player spawn" # define FT_ERR_MISS_TRAP "traps" -# define FT_ERR_MISS_SFX_DEATH "missing sound effect death" -# define FT_ERR_MISS_SFX_N_LVL "missing sound effect new level" -# define FT_ERR_MISS_SFX_SCR_ONE "missing sound effect scream one" -# define FT_ERR_MISS_SFX_SCR_TWO "missing sound effect scream two" -# define FT_ERR_MISS_SFX_TRAP "missing sound effect trap" -# define FT_ERR_MISS_DEATH_SCREEN "missing death screen image" +# define FT_ERR_MISS_SFX_DEATH "sound effect death" +# define FT_ERR_MISS_SFX_N_LVL "sound effect new level" +# define FT_ERR_MISS_SFX_SCR_ONE "sound effect scream one" +# define FT_ERR_MISS_SFX_SCR_TWO "sound effect scream two" +# define FT_ERR_MISS_SFX_TRAP "sound effect trap" +# define FT_ERR_MISS_DEATH_SCREEN "death screen image" +# define FT_ERR_MISS_HUD_BACK "HUD background image" +# define FT_ERR_MISS_HEAL_PACK "heal pack image" /* ** ====== OTHER ====== */ # define FT_PARSE_END_RET 25 +# define FT_HEAL_PACK_AMOUNT 10 # endif diff --git a/inc/cub3d_structs.h b/inc/cub3d_structs.h index 29c6ac7..fc3eead 100644 --- a/inc/cub3d_structs.h +++ b/inc/cub3d_structs.h @@ -14,9 +14,9 @@ # define CUB3D_STRUCTS_H #include <stddef.h> -#include <stdlib.h> #include <stdint.h> #include <sys/types.h> +#include <pthread.h> typedef struct s_win { @@ -57,15 +57,23 @@ typedef struct s_bmp_info typedef struct s_sfx { - char **death; - char **new_lvl; - char **pain_one; - char **pain_two; - char **trap; - pid_t death_pid; - pid_t new_lvl_pid; - pid_t pain_pid; - pid_t trap_pid; + char *death; + char *footstep_one; + char *footstep_two; + char *new_lvl; + char *pain_one; + char *pain_two; + char *trap; + pthread_t death_tid; + pthread_t footstep_tid; + pthread_t new_lvl_tid; + pthread_t pain_tid; + pthread_t trap_tid; + pthread_mutex_t death_mutex; + pthread_mutex_t footstep_mutex; + pthread_mutex_t new_lvl_mutex; + pthread_mutex_t pain_mutex; + pthread_mutex_t trap_mutex; } t_sfx; typedef struct s_bmp_rgb @@ -105,8 +113,8 @@ typedef struct s_sprite int32_t y; int32_t tex_x; int32_t tex_y; - int32_t s_pos_x; - int32_t s_pos_y; + uint64_t s_pos_x; + uint64_t s_pos_y; double spritex; double spritey; int32_t spriteheight; @@ -189,7 +197,6 @@ typedef struct s_map char *mapl; char **sprite_path; char **map; - char **mcmd_words; int8_t x_step; int8_t y_step; size_t map_w; @@ -199,7 +206,9 @@ typedef struct s_map uint8_t sprite_var; int32_t sprite_order[8][4096]; int32_t traps_nbr; + int32_t heals_nbr; int32_t traps_order[512]; + int32_t heals_order[64]; size_t line_chk; size_t map_start; uint8_t isspawn; @@ -209,6 +218,7 @@ typedef struct s_map uint8_t isctex; uint8_t isskybox; uint8_t istraps; + uint8_t isheals; uint8_t darklvl; uint8_t scale; int8_t topsp; @@ -230,7 +240,8 @@ typedef struct s_cub char *const *envp; char errmsg[64]; int32_t key_input[5]; - pid_t mpid; + char fps_count[9]; + pthread_t mtid; int (*key_ptr[6])(struct s_cub*); int8_t (*get_ptr[14])(char**, struct s_cub*); char ref[22][3]; @@ -242,9 +253,10 @@ typedef struct s_cub struct s_img death_screen; struct s_rgb f_rgb; struct s_rgb c_rgb; - struct s_img tlist[16]; - struct s_sprite sprites[8][4096]; + struct s_img tlist[18]; + struct s_sprite **sprites; struct s_sprite traps[512]; + struct s_sprite heals[64]; struct s_sfx sfx; } t_cub; diff --git a/map/map_one.cub b/map/map_one.cub index d9adb38..625fe15 100644 --- a/map/map_one.cub +++ b/map/map_one.cub @@ -1,4 +1,4 @@ -R 800 800 +R 1600 1000 NO ./media/img/wood_wall_1.xpm SO ./media/img/wood_wall_1.xpm @@ -10,16 +10,16 @@ C ./media/img/wood_ceil.xpm F ./media/img/parquet.xpm S3 ./media/img/pylon.xpm -S4 ./media/img/larry.xpm -S5 ./media/img/wood_chest.xpm - +S4 ./media/img/wood_chest.xpm T ./media/img/spikes.xpm SH 2 -111111111111111111 -100000000001222211 -10000000E001333311 + + 1111111 +111111111111000001 +100000000000222201 +10000E000000333301 100000000000444401 100100000000000001 101100000111000001 @@ -28,7 +28,7 @@ SH 2 1001001 100001 1011001 100001 111101111111110111 -120500001101010111 +100400001101010111 100000000000000011 100000000000000011 11T000001101000111 diff --git a/media/img/first_aid.xpm b/media/img/first_aid.xpm new file mode 100644 index 0000000..dd1b907 --- /dev/null +++ b/media/img/first_aid.xpm @@ -0,0 +1,857 @@ +/* XPM */ +static char *first_aid[] = { +/* columns rows colors chars-per-pixel */ +"600 600 251 2 ", +" c #000000", +". c #0A0606", +"X c #090907", +"o c #070808", +"O c #0C0B0B", +"+ c #120D0C", +"@ c #1A0B0B", +"# c #12100F", +"$ c #19110E", +"% c #0F1011", +"& c #141412", +"* c #191514", +"= c #181817", +"- c #1A1816", +"; c #1C1B1A", +": c #260E0E", +"> c #2E0F0F", +", c #291717", +"< c #221C1C", +"1 c #371617", +"2 c #23211E", +"3 c #39211F", +"4 c #311F21", +"5 c #1F2021", +"6 c #242323", +"7 c #2A2423", +"8 c #2B2926", +"9 c #2D2C2B", +"0 c #2E2F2F", +"q c #382727", +"w c #342D2C", +"e c #32312E", +"r c #333332", +"t c #3A3938", +"y c #4E090E", +"u c #490D11", +"i c #530D11", +"p c #5B0D13", +"a c #461618", +"s c #541216", +"d c #5B1216", +"f c #5A161B", +"g c #6B060C", +"h c #76080E", +"j c #650E13", +"k c #750A11", +"l c #7C0A12", +"z c #64141A", +"x c #67161B", +"c c #6C151C", +"v c #76161B", +"b c #73151C", +"n c #7B141B", +"m c #46201F", +"M c #521D21", +"N c #6A1B21", +"B c #761B22", +"V c #472728", +"C c #562527", +"Z c #512F32", +"A c #463837", +"S c #5A3639", +"D c #662629", +"F c #752A2E", +"G c #683738", +"H c #79373A", +"J c #46413F", +"K c #3F3F40", +"L c #4A3F40", +"P c #723B41", +"I c #494847", +"U c #544E4C", +"Y c #5A5858", +"T c #704F51", +"R c #696062", +"E c #696767", +"W c #746D6C", +"Q c #777676", +"! c #85080F", +"~ c #840C14", +"^ c #8C0D15", +"/ c #860F18", +"( c #8C0F18", +") c #930C15", +"_ c #9B0D15", +"` c #930F19", +"' c #9C0E19", +"] c #891317", +"[ c #85131A", +"{ c #8C111A", +"} c #931115", +"| c #9B1115", +" . c #94111A", +".. c #9C121B", +"X. c #99191E", +"o. c #A60D18", +"O. c #B40F19", +"+. c #A41518", +"@. c #A4131D", +"#. c #AB131E", +"$. c #B3141E", +"%. c #BB131E", +"&. c #BA191E", +"*. c #861620", +"=. c #841B22", +"-. c #8B1C23", +";. c #9B1923", +":. c #A61520", +">. c #AC1621", +",. c #A41B23", +"<. c #AD1924", +"1. c #A61F29", +"2. c #AD1E29", +"3. c #B31622", +"4. c #B91723", +"5. c #B51925", +"6. c #BA1A26", +"7. c #B61C29", +"8. c #BB1C29", +"9. c #87262A", +"0. c #972329", +"q. c #8F2D32", +"w. c #86363B", +"e. c #9A333B", +"r. c #A72228", +"t. c #AB222B", +"y. c #B4222C", +"u. c #B8252A", +"i. c #BC212D", +"p. c #AB2B35", +"a. c #A92B36", +"s. c #BC2531", +"d. c #B62935", +"f. c #B42A35", +"g. c #A6333B", +"h. c #AC343C", +"j. c #B5343D", +"k. c #C2141F", +"l. c #C31622", +"z. c #C21A25", +"x. c #CB1A25", +"c. c #C21D2B", +"v. c #CB1E2B", +"b. c #D21E27", +"n. c #C71F30", +"m. c #C6262B", +"M. c #C5212E", +"N. c #CA222E", +"B. c #D62227", +"V. c #D3222D", +"C. c #DA232C", +"Z. c #C52330", +"A. c #CA2331", +"S. c #C52B33", +"D. c #CC2B33", +"F. c #C72D39", +"G. c #D22633", +"H. c #DB2531", +"J. c #D42A35", +"K. c #DB2B36", +"L. c #D52738", +"P. c #D52C39", +"I. c #DC2D39", +"U. c #CC3137", +"Y. c #D93236", +"T. c #D4323B", +"R. c #DC323B", +"E. c #E2282E", +"W. c #E42D32", +"Q. c #E92F31", +"!. c #E22E3A", +"~. c #E53239", +"^. c #E3323D", +"/. c #8F3B43", +"(. c #AC3A44", +"). c #B63944", +"_. c #CA3A46", +"`. c #D93843", +"'. c #E53541", +"]. c #E93441", +"[. c #E53943", +"{. c #E63946", +"}. c #90494E", +"|. c #AA424A", +" X c #B7444C", +".X c #AC4A55", +"XX c #B94A54", +"oX c #AD525B", +"OX c #B8545A", +"+X c #895C61", +"@X c #AC5864", +"#X c #B65A64", +"$X c #8B7473", +"%X c #AE646A", +"&X c #B8656B", +"*X c #B96B72", +"=X c #BA7578", +"-X c #C4434C", +";X c #C9444E", +":X c #CA4953", +">X c #C5555B", +",X c #C55A64", +"<X c #C76D71", +"1X c #C47379", +"2X c #8A837D", +"3X c #7E7F80", +"4X c #B87D82", +"5X c #C67C83", +"6X c #898887", +"7X c #958889", +"8X c #979796", +"9X c #BB8488", +"0X c #A19C9B", +"qX c #A7A19E", +"wX c #9FA1A0", +"eX c #A9A7A6", +"rX c #B3ABA9", +"tX c #B7B6B5", +"yX c #C5878A", +"uX c #D48B8F", +"iX c #C98E92", +"pX c #C99698", +"aX c #D7949A", +"sX c #D59DA2", +"dX c #CCA5A5", +"fX c #D7A6A9", +"gX c #CDAEB0", +"hX c #D8AEB1", +"jX c #D7B5B8", +"kX c #E3B7BA", +"lX c #DCBEC3", +"zX c #DCC3C4", +"xX c #DCC6C8", +"cX c #DECBCC", +"vX c #DAD2D2", +"bX c #E1CACA", +"nX c #E2CED1", +"mX c #E3D3D4", +"MX c #E6DBDB", +"NX c #E8DADC", +"BX c #EAE0E0", +"VX c #EDE3E3", +"CX c #ECE8E8", +"ZX c #F4E6E7", +"AX c #F5E8E9", +"SX c #F4ECEC", +"DX c #F3EFF0", +"FX c #F5F3F3", +"GX c #FAF5F5", +"HX c #F8F8F7", +"JX c #FDFDFD", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" o o O 6 % o o ", +" X = 6 8 t r r t t e r r r ; o ", +" O 8 r t t e e 9 9 9 9 9 0 0 t t 0 & ", +" 6 t r e 8 8 8 9 8 e e 9 0 0 e e e r r 5 o ", +" O 9 e 8 8 0 r t t 0 e r e t t r e 9 e 0 9 0 6 ", +" o r e 2 ; 8 r 0 t 9 = = = ; e r 9 0 0 e 9 8 9 0 8 o ", +" o 9 9 ; ; ; t & o O 9 8 ; 6 6 0 t O ", +" < 9 - = & 6 8 & e # # = 2 0 9 o ", +" & r - = = - t = 9 & % + + ; r 6 ", +" 7 < & & = = r O 8 2 # O + % = t & ", +" ; 8 * = & = ; r ; e + & + O O 5 9 o ", +" o 9 * & * * * 5 0 O 9 & # # O + # 9 = ", +" = 9 * * = & & 5 6 o 8 * & & # # # * 9 o ", +" 8 < & & & & = 5 6 9 2 & & # # # # 9 ; ", +" O 9 * * = & = & 6 6 ; 9 & * & & + & ; 9 ", +" ; 7 * = * - - - 9 6 O 8 = & & & $ $ # 9 o ", +" 8 ; * - - - - - 9 ; & w = - - & & $ # 5 ; ", +" & 9 * * * $ - - - 9 & % 8 - ; - - & & * = 9 X ", +" 9 < * * * * * & - r % O 9 ; ; - - ; - - * 9 & ", +" & w * * # & * * * = 0 O o 9 = & $ & = * * * < 0 ", +" 7 < $ * * * * & * = t O o e $ # # # # * & + & 9 o ", +" . 8 * # & & & * & & = 0 o X o e $ + + + + X + + + 0 = ", +" * e + $ * @ * : : , 1 t w q q q q q q w w w w w q w w = + $ J 2 @ @ @ + + + X % ; 6 ", +" X # q C z B F 0.0.a.y.d.d.).-X-X-X X_.-X-X-X;X;X:X:X;X:X;X).h.(.).d.f.f.t.0.B B f a 1 q X X ", +" # 7 S T P |.).T.T.K.K.K.K.H.K.K.!.K.W.K.K.K.K.K.K.K.I.I.!.!.R.I.I.I.~.R.~.!.W.~.!.!.^.^.'.`.`.-X}.P Z < O ", +" o + q S H (.)._.`.R.P.I.K.K.K.Y.Y.K.K.K.K.I.I.K.K.K.Y.K.I.R.!.R.I.I.I.R.R.I.~.~.^.R.R.R.T.I.!.!.!.!.].'.].].{.`.;X/.P A ; o ", +" o q H /.).`.R.K.K.H.K.K.K.Y.P.T.R.T.R.T.R.R.I.K.I.I.I.K.K.K.K.K.R.K.K.I.^.R.R.R.R.I.K.!.I.I.~.R.'.!.!.!.!.^.^.].].{.].].{.`.XX/.S 7 % ", +" o < S /.j.T.I.K.K.J.J.K.J.K.R.R.R.T.`.R.R.R.I.I.R.R.I.~.I.I.I.I.K.K.K.K.K.K.K.K.K.!.R.^.!.~.I.!.!.!.!.I.I.!.].!.!.!.^.^.].].].].].].].{._.(.P q O ", +" o < G g.S.P.K.J.J.K.P.G.J.Y.T.T.R.Y.R.R.T.R.Y.R.R.R.R.W.R.^.R.'.R.^.I.I.W.K.K.K.K.K.K.K.K.~.!.R.R.^.!.!.E.!.I.!.!.!.`.'.].!.!.!.].'.!.].].].].].{.;X(.S 7 O ", +" < G |.F.D.J.J.T.J.J.K.P.T.T.R.R.T.R.`.^.;X`.R.`.^.R.R.R.T.R.R.R.'.^.[.^.^.~.W.R.Y.K.K.K.K.I.K.I.!.!.^.^.^.I.I.I.I.!.I.!.'.'.'.^.!.K.!.!.].'.].].].].].].'.:X/.Z = o ", +" * Z e.F.D.D.P.Y.Y.T.T.T.R.R.R.R.R.`.^.R.R.~.Y.R.Y.R.R.R.I.Y.Y.I.T.Y.Y.Y.R.~.~.R.^.^.~.!.I.I.Y.I.R.R.R.^.~.`.R.'.I.!.!.!.!.!.R.!.'.'.].'.I.!.I.!.!.!.].].'.].].].]._..XS ; ", +" o q w.j.U.U.D.U.T.T.T.R.T.T.R.R.Y.R.I.Y.J.K.Y.B.Y.R.`.R.`.[.[.~.~.^.^.^.[.^.[.^.^.'.'.'.'.[.[.'.[.{.{.[.[.'.[.^.'.[.R.R.I.~.!.I.!.I.^.^.^.'.'.'.I.!.!.I.!.!.!.!.].'.].].!.`..XS = ", +" * G g.F.S.U.F.U.T.T.T.T.R.Y.R.T.T.T.U.U.T.Y.;X`.[.[.{.{.{.{.[.[.[.{.{.{.{.{.[.[.{.[.[.'.'.'.^.'.^.'.~.'.^.'.~.'.^.~.~.~.~.^.^.^.^.'.'.~.^.I.I.'.'.'.'.!.I.H.!.!.!.!.].!.!.].!.!.`./.q o ", +" o q w.j.s.S.S.D.U.T.T.T.T.R.T.U.U.U.U.T.T.T.R.R.`.R.`.R.{.[.'.'.~.[.{.{.~.{.[.~.'.].'.'.^.^.~.'.^.^.'.^.'.'.'.'.].'.'.'.'.~.^.~.~.!.!.!.~.~.'.'.'.!.'.I.'.'.I.'.!.!.!.!.!.!.!.!.!.].!.'.).S & ", +" # G (.y.s.s.S.F.U.U.T.T.T.U.S.m.U.U.T.T.J.Y.J.J.T.G.J.Y.R.^.^.!.'.[.^.^.~.{.~.{.{.[.'.'.'.'.^.'.^.'.^.^.^.'.'.'.'.'.[.'.'.{.[.{.'.'.^.^.^.!.I.!.!.!.'.'.'.!.'.'.'.'.!.!.!.!.H.!.!.!.].!.!.'._.P * ", +" < H a.7.y.u.i.S.S.S.D.D.m.m.S.D.J.D.J.V.G.G.V.V.N.N.J.R.~.^.~.'.~.].[.^.].^.'.'.].].[.'.^.^.^.^.^.[.~.'.^.'.'.^.[.^.^.^.'.[.[.[.].[.{.].].'.[.^.~.!.!.!.!.!.^.'.[.[.{.[.^.R.^.I.K.K.K.!.!.!.~.!.P.(.q X ", +" q w.u.y.y.d.s.S.S.m.m.u.u.u.D.D.G.D.V.N.V.V.N.C.G.K.^.^.~.^.^.^.^.^.R.R.R.R.T.P.D.D.D.A.m.m.s.s.m.i.u.u.8.8.u.i.i.i.M.A.D.D.D.J.P.R.R.'.`.{.{.[.[.{.'.'.!.!.!.!.!.I.~.{.{.[.[.[.^.^.K.K.W.!.!.!.!.I.I.).L o ", +" o A e.y.3.7.y.u.s.m.m.f.&.u.m.D.N.V.N.B.m.V.J.K.I.R.R.R.I.K.J.D.Z.i.8.5.5.@.@.+.| ..| ..| ....@.@.#.<.3.y.7.7.7.u.6.6.y.7.7.5.3.<.3.#.>.<.<.5.5.u.M.Z.D.L.P.R.R.^.'.^.^.!.!.'.'.{.`.{.^.^.I.R.W.!.!.!.!.!.I.).S o ", +" o m e.3.3.2.y.d.s.m.m.u.r.M.m.m.A.B.N.V.G.K.I.T.G.D.m.6.3.@...| .) ) ) ..@.,.<.7.i.Z.D.A.G.G.P.T.P.Y.J.P.P.P.I.I.T.^.R.I.!.I.'.I.^.`.^.P.P.D.S.m.M.i.7.3.@.$.<.5.y.i.D.J.R.I.R.'.'.[.'.'.`.^.^.P.P.K.W.!.!.I.K._.Z X ", +" V 0.y.$.<.u.d.u.m.u.r.u.m.N.N.N.N.V.K.Y.J.m.8.<...) ) ) | @.#.y.s.Z.Z.D.P.P.T.I.K.P.P.L.L.L.J.G.L.A.m.Z.M.M.A.A.N.N.A.G.D.A.D.A.L.L.L.P.P.!.'.^.!.~.'.'.'.'.I.D.Z.u.5.>.@.:.<.8.S.D.T.R.'.'.^.R.I.T.T.G.!.!.!.I.L.).S o ", +" o V 0.3.3.$.y.u.u.u.t.<.i.m.m.N.V.V.P.D.m.$.+.) ) ) @.>.5.8.A.A.G.G.G.G.G.L.A.A.G.J.P.A.A.A.N.N.A.A.A.M.M.c.c.z.8.A.M.c.c.c.c.Z.n.A.Z.A.v.A.A.L.L.J.L.L.K.P.I.I.I.I.'.I.^.P.J.N.8.:.@.@.>.7.Z.D.R.R.^.~.J.G.m.Y.!.!.W.K.).V ", +" q e.3.3.$.r.u.u.d.r.&.u.m.N.N.G.P.m.4.@.) ..<.5.8.M.M.8.>.6.8.c.M.M.M.A.A.A.N.N.N.A.A.A.c.c.n.M.A.Z.Z.A.Z.M.Z.c.6.6.8.8.c.c.c.c.8.c.c.c.c.n.Z.A.Z.A.A.A.G.A.L.A.A.L.L.L.L.P.T.I.'.L.K.A.8.>.' :.<.u.D.P.~.K.G.m.U.R.!.K.P.(.4 ", +" 2 q.<.3.3.u.f.u.r.t.u.m.m.N.N.G.m.6.@.+.7.M.A.c.7.6.8.8.6.>.:.>.7.6.6.c.c.M.N.c.n.M.N.A.A.A.c.c.c.c.A.A.c.A.A.A.Z.c.8.6.8.8.8.8.i.8.8.c.c.c.c.c.c.n.M.A.A.A.A.Z.A.A.n.Z.A.N.A.A.L.D.L.J.P.P.J.D.8.#.....<.i.Y.R.Y.M.S.T.R.I.`.(.; ", +" O F r.#.3.2.u.u.t.,.y.M.m.m.D.M.4.:.3.m.L.G.N.v.c.3.>.<.8.4.3.:.>.3.5.7.8.8.c.c.n.n.c.N.A.A.A.c.c.z.c.c.Z.n.Z.Z.A.A.M.7.8.8.8.8.6.6.8.8.8.8.c.8.7.c.c.v.c.Z.Z.c.n.M.n.n.n.n.c.n.A.A.L.A.L.L.L.J.J.L.P.Z.8.@.' :.u.G.R.m.u.U.T.!.T.H % ", +" o V r.&.#.t.u.u.r.,.y.m.N.D.m.6.>.6.D.K.G.G.V.N.N.c.6.4.3.7.8.4.3.>.>.3.5.7.8.8.c.c.c.c.M.M.N.A.A.N.c.c.M.M.Z.M.Z.Z.Z.A.c.c.c.c.8.c.8.z.8.c.c.z.c.c.c.n.c.A.c.n.A.A.A.A.Z.A.n.A.A.A.A.A.A.F.A.D.L.L.L.D.A.A.Z.8.@...;.i.D.G.D.U.T.P.T.P O ", +" q q.#.<.<.u.u.r.r.y.i.M.A.M.$.5.D.I.K.V.N.A.N.v.n.A.c.8.4.4.4.4.3.<.<.3.3.4.8.8.8.8.c.c.c.c.M.N.A.A.v.c.M.M.c.M.M.M.M.c.Z.Z.c.c.c.c.c.8.8.c.c.8.c.c.Z.Z.M.A.A.A.A.Z.A.A.Z.A.A.Z.N.N.D.A.Z.A.A.Z.L.Z.A.Z.Z.Z.c.Z.M.7.+.) ..y.J.D.D.J.P._.S o ", +" & H :.>.#.r.r.r.;.u.m.m.N.7.7.Z.P.G.N.A.N.A.A.M.A.A.A.A.c.8.8.8.7.4.>.3.3.3.5.7.4.4.8.8.c.c.M.v.c.N.N.A.N.N.N.M.i.i.M.A.A.Z.A.v.c.c.c.c.c.z.8.8.c.c.c.c.c.c.Z.A.A.A.A.A.A.A.Z.A.N.N.A.Z.A.Z.F.A.Z.Z.Z.s.M.M.c.A.D.A.A.M.5...` :.S.T.D.D.P.XXq ", +" o S 0.#.<.u.r.<.,.r.m.A.i.y.i.P.K.G.n.v.c.Z.v.c.M.c.A.A.n.n.c.x.8.4.5.3.3.2.3.3.3.3.8.8.4.7.z.c.c.v.M.N.N.N.N.N.c.M.M.M.M.Z.A.M.c.M.c.c.c.c.c.8.8.c.c.8.8.c.c.Z.Z.A.A.A.A.A.Z.Z.A.Z.A.Z.A.Z.Z.A.Z.Z.Z.c.M.M.M.A.J.L.A.A.A.M.i.<.) .y.D.G.V._.}.& ", +" < q.@.@.<.r.r.,.r.M.M.6.7.D.L.A.v.c.n.n.n.c.Z.c.M.Z.N.A.A.n.n.c.c.8.7.7.3.3.3.2.3.7.7.3.8.6.8.c.c.c.M.M.M.M.n.N.A.M.i.Z.M.N.N.A.Z.Z.c.M.c.c.8.8.c.8.c.8.c.c.c.c.c.Z.N.c.A.N.A.A.A.Z.M.M.M.Z.Z.Z.Z.Z.Z.Z.Z.Z.A.D.L.L.A.A.A.N.A.M.7...^ :.S.G.A._.S ", +" X G ,.+.,.r.r.,.@.m.i.5.8.J.A.v.c.c.c.i.c.c.c.c.c.Z.A.c.v.A.n.n.n.c.8.4.5.3.2.3.3.3.3.<.5.7.6.6.c.c.v.M.M.M.N.M.N.M.M.M.A.N.Z.A.A.A.n.c.c.c.c.c.c.c.8.8.c.8.c.c.c.A.M.Z.M.A.Z.A.Z.M.M.M.M.M.Z.Z.Z.i.s.c.n.Z.A.A.D.G.D.A.D.A.D.A.m.Z.i.:.^ ..s.L.L.(.* ", +" A q.@.#.t.r.r.;.u.i.5.S.G.n.c.c.c.c.c.8.c.c.A.c.c.n.c.c.A.n.n.n.n.n.c.8.7.3.7.3.3.<.3.7.<.7.6.6.6.c.c.c.M.c.A.c.M.M.c.M.A.M.A.A.A.A.A.M.M.M.M.c.A.c.c.c.c.8.c.c.c.c.M.N.M.c.A.Z.Z.Z.M.M.M.Z.n.Z.n.Z.Z.c.n.A.A.A.A.A.A.A.A.A.n.Z.Z.Z.M.i.5.^ .i.A._.S o ", +" O H @.:.r.r.,.,.r.&.u.A.A.n.c.c.8.z.8.8.8.8.c.c.n.n.Z.Z.n.A.n.A.N.M.n.c.c.6.6.7.3.7.3.3.3.3.<.3.7.6.8.c.c.c.N.Z.v.Z.c.A.N.Z.A.Z.A.A.Z.Z.Z.M.M.v.M.c.c.c.c.8.c.8.c.c.A.Z.A.c.A.A.Z.A.Z.A.Z.M.Z.M.Z.i.c.Z.c.Z.A.A.A.Z.Z.A.Z.Z.A.n.n.s.n.s.8.7.2.( ( i._./.= o ", +" A q.@.,.r.,.#.&.&.u.m.n.n.c.4.8.8.4.8.8.c.c.c.c.n.n.c.Z.c.n.A.M.A.A.c.c.8.8.6.6.<.<.>.<.7.3.7.3.7.6.8.c.c.c.M.c.N.c.A.c.A.v.A.Z.A.N.A.A.M.A.c.c.N.c.M.c.c.c.8.c.c.c.M.c.A.v.Z.Z.A.n.c.c.M.Z.Z.M.Z.Z.Z.c.Z.A.Z.n.A.Z.Z.Z.Z.Z.Z.n.n.s.8.8.7.>.7.3.( ..8.).V ", +" o H X.,.,.r.#.u.$.y.M.z.8.8.8.4.8.8.8.8.8.8.8.c.c.c.n.c.Z.n.A.Z.A.A.A.c.n.c.8.6.7.<.<.3.3.3.7.3.3.7.8.8.8.c.c.c.n.v.M.v.Z.c.A.A.A.A.A.N.A.M.N.M.M.c.c.c.c.c.z.c.c.c.M.M.Z.Z.Z.Z.A.Z.Z.A.Z.Z.Z.Z.Z.Z.M.Z.A.A.A.A.Z.Z.c.Z.s.M.8.Z.n.i.n.8.8.7.7.>.<.>.( ;.)./.O ", +" q q...,.r.<.3.#.y.M.c.6.4.5.7.8.6.z.8.8.8.4.8.c.c.c.c.n.n.c.v.c.n.c.n.v.c.n.z.6.4.3.4.3.3.>.3.3.3.3.6.6.6.z.c.c.c.n.c.c.v.c.v.N.v.A.A.Z.c.N.N.c.c.N.c.c.c.c.c.8.c.c.c.c.c.v.c.c.n.n.Z.v.n.c.c.c.c.c.i.c.c.A.A.M.Z.Z.Z.c.c.M.8.i.7.7.7.8.8.8.7.3.>.<.>.( 2.(.< ", +" X G 0.X.r.,.y.<.7.c.6.7.7.7.7.8.7.4.8.8.8.4.8.c.8.z.c.8.z.F.:X>X:X:X:X:X:X:X:X:X-XXX-X-X X).).XX). X X-X_. X-X-X-X;X;X;X;X:X;X:X;X;X;X;X:X:X;X;X;X;X;X;X;X-X-X-X-X-X;X;X:X:X:X:X:X:X:X:X:X>X:X:X>X>X,X>X,X,XT.Z.Z.i.n.i.n.i.c.i.i.n.7.7.8.8.8.7.3.>.:.7.....).S o ", +" < q.X.r.,.3.$.7.8.6.4.5.5.3.4.<.6.8.8.4.8.c.4.4.c.8.8.8.4.,XZXGXDXDXGXDXDXSXGXSXDXAXSXAXSXDXSXSXSXAXAXAXAXAXAXAXAXZXZXAXAXZXAXAXAXAXAXAXAXZXZXAXAXZXAXZXZXZXZXZXZXZXZXAXAXAXAXAXGXGXFXGXSXSXFXGXGXGXGXGXGXGX>Xc.c.i.n.8.8.8.i.i.i.7.8.7.7.8.8.8.7.>.>.7.i.` 2.P o ", +" o S 0.;.r.t.#.y.8.4.5.3.5.5.3.3.6.7.4.8.8.4.8.8.8.8.8.8.z.4.<XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX>Xv.c.n.i.i.8.i.8.8.7.7.7.7.7.7.8.8.7.3.>.7.i.2.;./.; ", +" & H X.r.<.#.#.5.3.3.3.3.5.5.5.5.7.6.8.4.8.4.4.c.4.8.8.6.8.6.<XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX>Xc.c.i.8.8.i.8.8.7.8.8.7.7.7.7.n.8.7.>.>.7.8.i.@.d.Z ", +" 7 q.;.1.:.@.<.3.3.>.>.3.>.7.3.3.7.4.5.4.8.8.8.c.4.8.8.8.8.4.<XJXJXJXAXmXNXNXNXMXFXJXFXVXBXGXJXFXBXNXMXBXBXDXJXJXJXJXSXcXxXMXHXJXJXCXNXMXNXmXmXmXZXJXJXJXJXJXJXGXmXnXBXJXJXJXJXMXxXNXJXJXmXzXxXbXxXVXJXJXJXJXGX>X8.i.i.i.8.8.7.8.7.7.7.7.8.8.8.8.8.7.>.>.7.i.n.2.2.P o ", +" o S 0.1.:.' :.<.:.>.>.>.>.7.3.7.7.4.7.4.8.4.8.8.8.c.4.8.4.8.4.<XJXJXJXpXj.).).).(.fXJXbX|.XXNXJXxX|.h.(.(.(.oXcXJXJXjX.Xg.a.h.4XSXJX9Xh.).).(.(.h.*XGXJXJXJXJXJXjX).d.&XGXJXJXJX=Xd.4XJXJX=Xd.f.f.f.XXjXJXJXJXGX>X8.8.8.i.i.7.7.8.7.7.7.7.7.8.7.n.8.7.>.>.3.7.i.i.>.(.7 ", +" = w.X.:. .' :.:.:.:.>.>.>.>.3.3.7.3.7.7.8.8.8.8.4.8.8.c.4.8.4.<XJXJXJXaX8._.yXuXpXmXJXbXs.j.NXJXlXa.u.4XpX X<.&XJXSX.Xt.iXgX Xg.jXJXiXXX Xi.i. XOXiXJXJXJXJXJXGX*Xs.Z.).nXJXJXGX*X8.1XHXJX<X8.>XaX#XZ.).BXJXJXGX,X8.8.i.i.7.i.7.8.7.7.7.7.8.7.7.n.7.7.7.>.3.7.i.s.2.d.S ", +" q q.@...` :.:.:.:.:.>.>.3.7.3.>.3.4.7.5.4.4.8.8.8.8.8.8.8.8.4.<XJXJXJXiX8.#XAXAXFXJXJXbXs.j.nXJXzXd.j.cXFX*X3.@XHXVX|.8.*XgXgXxXCXJXHXGXxXj.d.jXHXHXJXJXJXJXJXMX). X=X8.iXJXJXGX*Xi.1XJXJX<X8.5XJXNX).d.fXJXJXGX>X8.8.7.8.8.7.7.7.7.8.7.7.s.7.7.8.7.7.3.>.3.7.i.i.i.7./.& ", +" X C 0.+.` ` :.@.:.:.:.>.>.>.>.>.3.3.7.>.5.4.4.4.8.8.8.8.8.4.8.4.<XGXJXJXiXi.S. XXX&XFXJXxXs._.mXJXjXh.s.OXOXd.(.gXJXHXdXj.7.5.h.1XBXJXJXJXmX).y.lXJXJXJXJXJXJXJXsXy.5XzXd.XXAXJXJX*Xi.4XJXJX<X8.5XJXFXOX8.iXJXJXGX>X8.7.8.7.8.7.8.7.7.7.7.8.s.n.8.8.8.7.7.>.>.2.i.s.8.7.a.Z ", +" * H X...( :.:.@.@.:.:.>.>.7.3.3.2.3.3.7.5.7.7.7.4.8.8.4.8.8.8.4.<XJXJXJXuXM.).1X5XpXFXJXzXi._.mXJXzXd.s.OXj.y.yXGXJXJXFXcXpX&Xj.7.4XJXJXJXmX).d.lXJXJXJXJXJXJXGX#Xi.yXjX).d.jXJXGX*X8.5XJXHX*X8.5XJXFXXX7.iXJXJXGX>X4.i.7.8.7.7.7.8.7.8.7.n.7.7.n.8.i.8.4.7.4.7.7.8.s.2.7.P O ", +" q 0.@.} ' :.:.@.:.@.:.:.:.>.>.3.>.3.3.3.5.7.7.8.8.8.4.8.8.8.8.5.1XJXJXJXpXc.,XJXJXJXJXJXbXZ.j.NXJXzXf.).cXpXt.h.zXJXmX*X=XVXGX=X8.#XFXJXJXmX).y.jXJXJXJXJXJXJXxXj.M.y.t.s.8.1XJXJX*X8.1XJXHX=X8.1XCXfXd.d.lXJXJXFX>X7.8.7.7.7.7.7.7.8.s.7.7.7.n.8.n.8.8.7.4.3.7.7.s.s.7.2.(.< ", +" . S 0.X. .:.@.@.:.:.:.:.:.:.:.>.>.>.2.3.3.3.3.3.7.4.8.8.7.4.4.4.4.<XJXJXJXuXz.#XFXJXJXJXJXbXZ.).NXJXzXf.f.nXCXXX3.*XFXNX|.5.&XyX Xy.pXJXJXJXmXj.d.jXJXJXJXJXJXJXyXu.XXaXsX1Xd.).NXGX*X8.=XHXHX*X8.j.).d.f.1XGXJXJXFX>X7.7.8.7.7.7.8.8.7.8.n.8.8.8.8.i.8.8.7.8.7.7.8.8.i.i.<.a.V ", +" - H @.} @.>.:.@.:.>.:.@.>.:.>.>.>.>.>.3.>.3.3.7.4.5.7.7.3.<.6.4.4.<XJXJXJXgX#X5XFXJXJXJXJXmX,X*XVXJXmX&X&XNXJXgXOX%XMXJXlX&X X).OXiXSXJXJXJXVX*X&XcXJXJXJXJXJXFX9X&XgXJXJXVX*X&XcXHXpX#XdXJXJXpX*X*X*X*XfXDXJXJXJXGX>X3.8.7.8.7.6.8.8.8.i.i.8.8.n.8.8.n.8.8.7.7.7.8.s.8.7.>.<.G X ", +" 7 q.+.} <.7.5.>.#.>.:.:.:.@.>.o.>.:.>.>.>.3.3.>.7.7.3.7.7.7.5.3.3.1XJXJXJXGXFXFXJXJXJXJXJXJXFXFXJXJXHXFXSXGXJXHXFXFXGXJXJXHXAXVXSXJXJXJXJXJXHXFXFXJXJXJXJXJXJXHXGXGXHXJXJXJXFXFXHXJXHXHXGXJXJXJXHXGXJXJXJXJXJXJXJXGX>X3.6.7.7.7.6.7.7.7.i.8.8.8.8.8.i.i.i.7.7.7.7.7.s.s.s.>.@./.* ", +" A 0. . .<.4.3.3.>.>.>.>.:.:.@.@.:.:.:.>.>.>.>.>.3.4.3.7.3.7.3.3.>.<XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX>X7.6.6.7.8.7.7.i.8.8.8.8.8.8.8.i.i.8.8.7.4.i.i.i.i.s.>. .g.q ", +" X G X.} X.$.5.7.5.3.>.>.:.>.:.@.>.@.:.:.>.>.>.>.>.7.>.3.3.3.7.3.4.3.1XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXJXJXJXJXGXOX3.6.7.7.6.7.8.7.i.8.8.4.7.8.8.8.i.8.8.7.7.7.8.s.8.i.:.` a.Z ", +" = F :.` :.3.7.4.3.3.3.>.:.:.:.@.#.>.:.:.:.>.:.>.<.3.<.<.7.7.4.3.<.3.XXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXjXkXhXhXhXhXhXhXhXhXhXhXhXfXfXhXfXfXfXfXfXfXfXfXsXsXfXfXsXsXsXsXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaX5XaXaXaXuXuXuXj.3.7.7.7.8.7.8.8.8.8.8.7.7.7.8.7.7.8.7.7.7.8.7.8.7.i.:.( 2.P O ", +" 9 q...' >.<.3.7.<.4.3.>.:.@.@.:.:.@.>.>.@.:.:.>.>.:.>.3.3.3.3.<.3.7.7.8.s.s.s.Z.s.S.s.S.s.Z.i.i.8.i.5.8.7.7.7.7.7.7.8.8.8.8.8.8.u.6.8.8.7.7.6.7.5.4.7.7.z.i.6.6.c.z.8.7.8.4.6.5.<.6.4.3.3.4.4.3.4.4.4.7.n.8.6.4.7.3.3.6.7.5.7.i.8.8.7.8.8.i.8.8.4.8.7.7.8.7.7.7.7.7.7.i.i.i.>.^ #./.< ", +" V 0.X...<.3.3.3.7.7.3.>.>.#.:.#.@.>.:.>.>.:.@.@.:.>.3.3.5.<.<.3.7.3.4.7.8.8.8.8.c.c.c.c.8.c.8.z.6.6.4.5.3.3.3.3.7.4.4.8.8.8.6.6.6.6.4.5.5.5.7.5.4.5.6.8.8.8.8.8.8.8.8.4.7.7.7.8.8.7.7.8.7.8.8.8.z.8.8.8.8.8.6.7.7.7.7.7.7.7.7.i.7.s.8.8.8.8.8.8.8.5.7.7.5.4.7.4.7.8.i.i.8.i.>.^ @.(.q ", +" O G { .:.<.<.<.3.<.3.3.3.:.:.@.@.>.:.>.:.@.>.@.:.>.>.>.3.<.5.5.3.3.7.7.5.7.4.8.M.8.c.i.c.c.8.8.8.8.6.4.7.6.4.3.7.3.4.4.8.4.8.8.8.6.6.6.6.4.7.5.7.6.5.6.6.8.8.8.8.6.z.8.8.8.8.7.<.4.7.7.8.3.3.8.8.8.8.8.8.8.7.7.6.7.7.7.7.7.7.7.7.8.8.8.n.8.i.8.8.8.7.7.5.5.7.4.7.3.7.7.i.i.i.>.^ ` 7.G o ", +" = H ] ^ ,.<.3.3.3.<.4.4.>.<.>.:.#.>.>.#.:.#.@.>.@.>.>.>.>.>.>.3.7.3.3.7.7.8.8.c.8.c.c.8.c.8.c.c.8.8.4.8.8.7.4.3.7.4.7.8.4.7.8.6.8.6.6.6.4.6.7.6.4.7.4.4.8.8.8.8.8.8.8.8.8.4.7.8.7.<.6.6.7.7.8.4.8.8.8.8.8.7.8.7.7.7.6.7.7.7.7.8.8.8.c.i.c.i.c.8.8.i.8.7.7.7.5.4.7.7.7.i.7.8.8.<.( ..2./.& ", +" 7 9.] { :.<.3.7.3.4.<.7.<.3.>.>.:.>.@.:.>.:.#.:.>.>.>.>.>.>.>.>.7.7.7.4.7.8.8.8.c.8.8.c.8.c.c.c.8.c.4.4.4.7.3.4.3.3.7.7.4.8.4.6.8.6.4.6.7.5.4.5.4.4.7.4.7.8.8.4.8.8.8.4.5.5.8.3.7.4.7.7.7.4.7.7.8.8.8.8.8.7.7.8.7.7.6.7.6.8.8.8.8.c.8.n.c.n.c.n.i.8.8.8.8.7.8.7.4.8.8.i.d.8.d.5.^ .2.(.4 ", +" q 9.~ { <.3.5.3.4.7.3.4.3.3.3.>.>.:.#.:.:.>.:.:.>.@.#.:.>.>.>.>.3.3.7.7.7.7.4.c.c.c.c.c.l.c.8.z.8.8.8.4.7.3.3.3.3.3.4.8.8.8.8.6.z.6.7.7.5.5.5.3.6.<.<.4.8.4.8.8.4.8.7.8.5.4.8.8.4.4.7.7.8.7.7.8.8.8.8.8.8.7.7.7.7.7.<.6.6.8.6.8.8.n.n.c.c.c.c.n.n.n.8.i.8.i.5.7.4.7.i.i.i.8.7.7.( ` >.a.Z ", +" X S [ ~ .:.>.5.6.8.8.4.8.3.7.7.3.3.>.>.>.>.@.#.#.:.>.:.>.:.>.>.>.>.>.4.4.7.4.4.4.8.c.8.c.c.c.c.c.c.c.8.5.3.3.3.>.3.3.5.7.4.4.8.8.8.6.6.4.4.4.$.3.3.4.4.3.4.8.4.4.8.4.8.8.5.7.7.3.7.3.7.5.7.4.3.4.8.8.7.4.7.7.7.<.7.7.7.6.6.6.8.8.n.n.i.Z.Z.c.n.s.n.8.8.8.8.7.7.7.7.8.7.n.7.8.8.7.` ( 1.7.H O ", +" & G ] [ ( @.<.7.6.6.z.8.8.4.4.4.4.7.<.>.>.>.:.@.:.:.>.:.:.:.:.:.>.>.>.>.5.5.4.4.8.8.c.c.c.c.c.c.c.c.c.4.4.3.3.:.>.3.3.4.7.8.8.6.6.6.6.7.4.5.5.5.7.3.3.3.4.3.6.6.7.8.4.4.4.7.4.7.8.5.5.5.3.7.5.4.8.7.8.8.4.5.7.7.8.3.<.8.7.6.u.8.8.c.M.c.c.c.c.Z.8.8.n.i.8.8.8.8.4.8.8.8.7.s.7.7.5.' ( 1.7./.: ", +" * F ] ~ { X.@.<.7.6.6.8.z.z.c.4.4.4.4.4.>.>.>.@.:.o.:.o.o.:.@.@.o.#.>.>.3.3.7.5.4.8.8.8.c.c.c.c.c.c.c.4.8.3.>.$.$.>.3.5.4.4.8.6.4.8.4.4.4.3.5.5.3.4.7.4.3.4.7.4.4.7.4.7.7.4.4.7.5.5.5.5.7.5.4.7.8.4.7.4.7.7.5.5.7.4.3.8.6.6.8.c.c.c.c.c.Z.i.Z.8.i.i.7.8.8.8.8.4.8.8.8.8.s.7.7.7.7.' ( :.2.(.q ", +" < 9.] [ { ..@.<.<.7.4.8.8.8.8.8.8.8.4.3.4.>.>.@.:.o.:.:.:.@.o.:.#.@.:.>.>.3.5.5.8.4.4.c.c.c.c.n.c.c.c.c.4.3.3.3.>.3.5.5.4.8.8.4.4.6.6.4.3.4.3.4.4.7.4.3.4.4.4.3.4.3.7.7.4.4.7.5.5.5.5.4.5.5.7.8.7.7.7.7.7.5.5.5.5.5.7.8.6.8.8.z.c.Z.c.Z.c.i.i.8.i.8.8.7.8.8.8.8.8.8.i.i.i.7.7.i.7...` ..2.y.S ", +" q 9.[ k { X.X.:.>.3.6.6.8.l.4.c.8.4.8.4.3.3.>.>.:.>.>.>.o.:.@.@.@.@.@.:.>.3.5.5.5.4.8.l.8.l.c.c.c.A.c.c.8.4.4.>.3.:.3.3.4.4.6.4.6.4.7.4.4.$.4.4.4.3.4.4.4.7.4.7.4.4.8.4.4.7.4.5.5.5.5.8.4.4.5.7.7.7.4.4.7.3.5.5.5.5.7.8.8.8.c.c.M.c.Z.n.c.c.c.i.8.8.7.8.8.8.8.8.8.8.8.8.i.i.7.7.i...( ;.2.s.H O ", +" S [ ~ ~ / ;...@.:.>.3.8.4.c.8.8.8.4.4.8.5.5.3.>.>.#.>.>.>.:.o.:.o.:.:.>.>.>.>.3.3.4.7.8.4.c.c.c.c.c.c.c.c.4.4.>.>.O.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.3.4.4.3.4.4.4.4.8.4.8.4.4.3.4.4.4.5.5.4.4.7.7.7.3.3.3.3.7.4.7.8.n.8.8.n.n.n.c.n.n.i.c.8.8.8.8.8.i.8.c.4.4.8.8.i.i.8.7.7.7.7.@.( ' 2.s.q.& o ", +" o G { n l / .....@.>.<.<.4.8.4.8.l.c.c.8.8.4.5.3.>.>.#.>.>.>.:.:.:.@.o.:.:.>.3.>.3.4.4.8.8.4.4.c.n.v.n.n.c.l.4.5.>.3.3.3.4.4.4.4.c.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.5.5.4.8.4.4.3.3.7.7.8.8.8.8.8.n.c.c.c.c.i.c.c.i.8.8.8.8.8.8.8.4.4.8.c.8.i.i.8.7.d.7.7.o.( ' 1.7.(.4 ", +" O G { n l / ...;.@.@.>.3.3.8.8.8.8.c.4.c.8.8.4.5.3.>.>.>.>.>.>.:.o.@.o.:.>.O.>.3.3.4.4.4.4.4.c.v.c.c.v.v.c.c.4.4.O.>.3.4.7.l.4.n.4.4.4.4.4.4.4.4.4.4.4.3.4.3.3.3.3.4.4.4.4.4.4.8.4.4.4.3.5.4.8.8.7.4.3.7.4.3.4.8.8.8.8.8.c.c.c.n.n.c.n.c.i.8.n.8.8.8.8.8.8.8.4.8.8.8.i.7.7.7.7.7.7.@.( ` 2.7.d.V ", +" + F { k l / . ...;.@.:.<.3.3.8.4.c.c.c.c.c.8.4.4.4.4.3.>.>.3.>.>.:.@.@.:.>.>.>.3.>.7.3.4.4.c.c.l.l.c.c.c.n.c.4.4.3.3.4.4.4.4.4.4.c.4.c.8.4.4.l.4.4.4.4.4.3.4.>.3.>.>.4.4.l.4.n.4.4.4.4.3.4.5.5.4.4.4.3.4.4.8.n.c.n.8.n.l.c.c.8.c.c.c.i.i.i.c.8.8.8.8.8.8.8.4.8.4.8.8.8.8.7.7.7.7.7.@.( ` :.2.d.P o ", +" < H { l l / ` .....@.:.>.>.3.7.8.8.c.c.c.c.c.4.4.4.3.>.3.3.3.>.>.>.:.@.:.o.>.>.3.3.3.4.4.4.4.4.6.4.c.n.c.n.l.l.4.4.4.4.4.4.4.4.c.8.z.l.4.l.6.4.4.4.4.4.4.O.4.4.O.O.3.O.4.4.4.n.4.8.%.%.4.4.4.4.4.3.4.4.4.8.n.n.n.n.c.c.c.c.c.c.c.c.c.c.c.i.c.c.8.8.8.8.4.8.4.7.4.8.7.7.7.7.7.7.7.7.@.( ` @.2.5./.O ", +" < F } k k / . .;...@.@.:.:.3.3.7.4.c.c.c.c.c.c.4.4.3.>.3.3.3.3.3.>.o.@.o.>.>.>.>.$.3.3.4.4.8.l.6.4.4.4.n.c.c.l.4.3.O.3.3.4.4.4.4.8.x.c.x.l.4.4.%.4.O.4.O.O.4.4.O.3.O.3.3.4.4.l.l.c.4.4.4.4.$.4.4.3.4.4.4.4.8.l.n.c.c.c.c.c.c.l.n.c.c.c.i.c.i.i.8.8.8.c.8.4.8.3.7.7.s.8.7.8.8.d.7.7.@.( ` :.2.7./.& ", +" 2 9.] k k ( ( ` ' ..@.@.:.>.>.3.3.5.4.8.n.z.c.c.c.8.4.4.3.3.3.7.3.3.>.o.:.o.>.>.3.$.>.$.$.4.4.6.l.4.4.4.4.l.l.l.l.%.%.4.4.4.l.l.n.x.v.v.v.v.c.c.x.v.n.c.c.n.n.l.c.l.l.l.l.l.l.n.n.v.l.4.4.O.%.$.$.4.4.4.4.n.n.4.c.n.c.l.c.c.c.c.l.n.c.c.i.8.8.8.c.n.8.8.4.4.4.3.3.8.s.s.8.8.8.7.7.7.@.^ ` :.2.7.(.< ", +" , 9.{ h h / ( ` ;...' @.:.:.>.3.3.5.4.4.c.c.c.c.4.8.4.4.3.3.7.3.7.4.>.>.>.>.:.>.O.#.#.>.3.3.4.4.4.4.4.l.c.n.n.n.n.n.n.c.c.n.l.4.l.4.4.l.4.%.%.%.%.O.O.O.k.O.l.O.l.l.n.l.n.l.n.l.l.v.v.V.v.x.c.l.4.4.4.n.l.l.n.n.c.n.c.n.c.c.c.8.n.c.i.n.c.8.8.c.n.n.n.8.4.4.4.3.7.7.8.8.n.8.8.7.7.7.o.^ ( @.2.7.a.V ", +" q -.( k g / ` ` ......@.:.>.>.>.>.3.7.4.8.c.c.c.c.c.8.4.5.3.3.3.4.3.>.>.>.#.o.:.>.#.#.#.#.O.7.6.c.z.z.l.&.6.&.%.&.O.O.O.O.&.O.%.O.O.O.O.O.O.O.O.$.O.&.O.&.k.k.l.l.x.x.b.v.v.x.x.l.k.k.%.%.k.k.k.x.x.v.v.V.v.v.v.v.n.n.n.c.c.c.c.c.c.c.i.8.8.z.Z.A.n.n.c.4.4.3.3.3.7.7.s.n.7.7.7.7.8.@.^ ^ @.<.s.d.Z ", +" q -.` k k / ( ` ........@.:.#.>.>.>.3.3.8.8.c.c.c.l.4.8.4.3.3.>.3.4.3.4.O.O.>.#.#.$.$.4.4.4.4.O.#.#.$.O.&.%.6.k.k.l.l.l.c.z.k.z.z.z.6.z.z.z.&.k.&.k.k.x.k.x.x.N.B.b.V.b.H.b.C.b.x.x.k.k.k.k.k.k.4.x.l.x.x.b.v.N.b.v.V.v.v.v.c.c.c.c.8.8.c.c.c.A.n.c.n.c.8.3.3.>.3.3.7.8.8.8.7.7.7.<.@.^ ) @.<.7.d.H o ", +" S *.*.h k / ( ` .....;.:.@.#.>.>.>.3.3.7.4.8.c.c.c.c.4.4.4.>.3.>.>.3.3.4.4.4.4.4.%.o.o.o.o.o.o.O.%.%.l.m.N.D.D.D.S.A.n.F.S.m.D.D.S.U.U.U.U.S.J.U.D.D.U.S.U.U.U.U.L.A.G.D.D.D.L.A.D.B.l.N.x.l.x.B.b.V.H.H.H.H.V.x.x.l.x.n.v.v.z.l.c.c.c.c.c.A.n.n.n.c.c.8.4.7.3.3.3.7.8.n.8.7.7.3.<.@.^ ) ..2.7.7.H O ", +" . Z { ( l g / ` ` .. .....@.@.>.>.>.>.>.>.3.3.8.8.x.c.c.c.4.3.3.#.>.3.4.4.4.4.o.o.' o.o.o.o.O.O.4.8.S.U.D.S.D.D.D.J.K.K.W.!.W.W.W.Q.Q.W.W.Q.W.Q.Q.W.W.Q.W.Q.W.Q.~.W.].!.W.K.W.~.~.K.Y.Y.Y.Y.Y.D.G.D.G.H.L.K.E.!.H.C.b.x.l.l.4.x.n.v.c.c.c.n.A.v.c.c.c.c.n.8.8.3.3.3.3.7.8.8.8.4.7.7.3.o.) ) @.2.7.s./.+ ", +" O G ( { l g / ` ' ;. .....;.o.:.>.3.3.>.>.3.3.5.6.z.c.c.c.4.4.4.4.4.4.O.o.O.o.o.o.o.O.O.%.k.z.m.u.S.U.J.R.E.W.Q.Q.Q.W.Q.E.W.E.E.C.C.B.B.b.b.b.E.b.B.B.b.b.b.B.b.b.b.k.B.k.b.B.B.B.B.C.C.E.C.C.W.W.W.I.Y.R.T.T.T.T.J.C.b.x.l.k.l.%.k.c.v.n.n.V.n.c.n.c.c.c.c.8.4.4.5.3.3.7.7.n.7.7.3.4.@.^ ) ..2.7.i.e.& ", +" = w.*.` l g / ( ` ... .' ....@.:.:.>.3.>.3.<.5.4.6.4.l.l.c.4.4.4.o.o.o.4.v.l.k.4.k.6.x.N.N.D.J.K.W.W.W.W.W.W.K.K.K.K.K.K.J.H.L.K.J.J.Y.P.P.L.K.L.P.J.R.J.C.J.G.C.C.K.K.K.L.G.V.D.C.N.G.B.B.B.x.B.B.b.C.C.W.W.W.Y.`.`.V.H.b.x.x.x.l.k.%.l.v.n.n.c.z.c.n.c.n.n.n.8.4.3.3.3.7.8.7.3.7.<.o.) ) ..<.7.y.a.4 ", +" & H *.( l g l ( ` . .` . .' @.@.:.>.3.3.>.>.3.3.6.4.c.8.4.O.o.o.o.o.4.x.v.x.x.v.v.B.B.J.Y.Y.H.K.J.G.A.m.i.8.7.5.<.:.>.>.:.@.@.@...@.@.@...@.:.:.:.@.<.#.<.<.<.<.3.6.y.7.7.8.i.u.m.Z.Z.D.D.D.J.P.J.G.J.C.B.b.b.H.H.H.!.'.G.V.b.H.H.H.b.k.%.x.n.v.n.Z.n.A.A.n.n.n.4.8.8.7.7.8.8.7.7.4.@.) .@.>.7.y.a.4 ", +" = 9.( { l g / ( ` ;. . . . .......:.:.>.>.3.>.3.3.3.c.n.3.o.o.o.k.l.k.k.l.x.x.x.v.b.V.G.N.M.i.$.#.@...) ) ) ) ) ) _ _ _ _ ..' ' ' o.o.| o.@.o.@.@.o.o.' +.| ' ' | ' ' _ _ ' ..' ' ' ..' ....+.@.>.<.7.u.M.D.L.L.H.L.b.C.H.W.I.D.v.K.!.H.x.l.%.%.n.G.A.G.A.A.n.n.n.n.n.n.n.8.n.4.3.7.4.@.) ' ..:.7.y.d.V ", +" < 9.[ { l g l ( ` . .` .' ' ;...:.@.>.>.>.<.>.3.7.4.o._ _ $.n.V.b.b.l.O.O.v.n.v.c.6.>.@.) ) ) ' @.#.>.4.8.4.6.6.8.c.z.z.c.z.c.c.c.c.c.c.z.6.5.7.c.M.m.v.m.c.v.z.c.c.z.z.6.6.3.3.3.$.<.#.#.@.@.o.' ' ' ..:.@.>.8.n.G.J.H.C.C.~.P.G.H.H.H.b.x.k.%.c.G.G.n.n.A.A.G.G.N.N.N.Z.8.7.5.7.3.@._ ` ..:.7.y.d.S o ", +" 7 9.[ { ! g ~ ( ..... . .*.` ' ....:.@.>.>.$.<.7.3.o._ ' o.o.O.v.l.c.4.4.A.7.4.@.' ) ` o.>.4.6.z.6.8.l.z.8.c.z.c.z.8.c.8.6.8.z.c.c.8.z.8.6.6.$.#.5.6.c.v.v.n.c.c.c.z.c.c.c.v.c.M.c.c.c.8.z.8.6.6.6.6.4.4.<.@.@.' ' ..5.i.D.J.H.E.E.H.H.H.H.V.b.x.l.l.G.G.n.n.G.G.A.A.A.c.c.8.8.7.7.5.>.| ' ' >.<.s.s.P o ", +" V 9.{ { ~ g l ` ` ;.......` ` .....' :.:.>.3.5.#.' _ o.#.$.%.%.%.3.8.c.4.@.` ) ' :.3.8.6.6.4.6.6.6.4.8.8.7.4.7.6.6.6.8.6.6.6.6.6.6.6.6.7.4.4.5.#.>.4.6.c.c.n.c.z.c.6.6.8.c.z.c.c.m.M.c.c.z.c.c.c.8.8.4.8.3.>.>.7.>.:... ...5.M.L.L.E.E.E.H.H.H.V.v.l.x.n.V.A.G.A.n.Z.n.i.8.7.8.6.6.7.>...' ..:.7.7.i.G o ", +" S 9.] { ~ g l ^ ` ` ........;.' ..` ' ' @.#.$.o.o.$.O.O.4.O.O.4.4.8.>.' ( ' #.3.8.4.4.4.4.3.7.5.3.4.7.3.4.3.4.5.7.3.7.6.4.7.3.7.3.7.7.6.5.7.4.3.>.#.>.6.6.z.c.c.c.8.6.6.6.6.c.c.z.z.c.c.c.c.z.c.8.8.8.8.8.4.>.o.#.>.7.7.5.@.....1.8.L.H.E.H.H.H.C.V.v.l.l.V.G.n.n.v.n.c.i.s.7.7.7.5.3.$.@.' ..:.<.7.i.H o ", +" C [ ( ( ^ g l ( ` ' ;.@.@.' .... .' ` ..o.@.o.#.&.k.k.%.O.#.4.8.3.' ( ' >.7.7.4.4.5.3.3.3.3.3.3.3.>.3.3.3.3.3.3.3.3.3.3.5.3.3.3.3.3.3.3.7.5.5.3.<.#.>.3.7.8.8.c.8.c.6.4.6.4.6.6.8.z.c.c.c.c.z.8.8.6.8.4.8.4.4.>.@.#.>.3.7.4.8.5.@.' #.i.L.H.W.H.C.C.b.V.v.v.n.v.c.c.8.i.8.8.8.7.5.5.6.#.@.@.@.:.5.7.i.w.. ", +" O T [ / ` ! g l ( ` ` ' :.@.@.;.' ;...` ;.@._ #.4.z.z.z.l.4.4.3...^ ' >.4.7.4.4.3.3.3.3.>.3.3.>.3.<.3.3.>.3.3.<.3.>.3.3.3.3.$.3.3.3.<.3.7.5.5.3.3.$.#.>.3.4.8.8.c.c.c.8.8.7.<.7.7.8.8.8.M.8.c.8.8.8.8.8.8.8.8.4.4.>.@.#.#.<.3.7.4.8.7.#.' :.c.L.K.E.b.V.b.C.b.x.n.c.8.8.8.8.8.8.7.5.5.5.3.@.' ' :.<.7.i./.* ", +" X G [ / *.~ g k / ` ..' @.:.@.' .. .` ' @.) ' @.#.4.z.N.z.4.:.) ' >.3.7.3.3.3.>.3.3.3.>.3.3.>.>.3.>.3.3.3.>.3.3.>.3.3.$.<.<.$.3.>.>.3.>.3.3.5.3.3.<.$.3.3.3.7.8.n.c.c.8.8.6.4.4.3.8.8.6.z.i.c.8.8.8.8.8.8.8.8.8.7.3.#.#.@.:.<.3.5.8.8.8.8.:...2.n.L.H.H.C.H.V.v.z.c.8.6.6.8.7.7.7.5.5.5.$.@.@...:.<.y.i.a.< ", +" & H { ( ` ~ g l ( ` ..' @.@.@... . . .' ^ ^ ) _ ' #.3.4.&.' ^ @.<.4.3.3.3.3.>.3.3.>.3.3.>.>.>.>.>.3.#.>.>.3.3.>.3.>.$.#.3.#.3.>.3.3.>.3.<.3.3.3.<.$.$.3.3.7.4.4.c.4.c.c.z.4.8.7.4.8.8.8.8.8.8.8.6.6.8.8.8.8.8.8.8.4.3.#.#.#.:.>.<.3.6.8.8.8.8.o.;.i.L.H.H.H.b.v.l.l.8.7.7.7.8.y.5.3.3.$.5.:.@.:.:.<.7.s.a.4 ", +" + F [ / { ~ g h ^ ^ ' ' @.@...' ` ` ' ) _ _ ) ) ) @.3.#.) ) #.3.3.>.3.>.$.3.>.3.>.3.>.>.>.>.>.#.#.$.>.O.#.3.$.3.>.>.>.3.#.$.<.$.3.<.<.$.3.3.3.3.3.3.<.3.3.5.4.6.8.6.c.c.8.8.8.4.4.8.8.8.8.z.8.8.6.8.8.8.8.8.z.8.8.8.3.>.>.#.#.:.>.$.3.7.7.8.8.8.>.' 1.Z.L.H.x.v.x.%.z.8.6.7.7.7.7.>.#.5.$.<.@.@.@.>.7.y.a.4 ", +" + H [ ( { ~ h l ^ ( ' @.@.@.@...` ` ) ) #.&.#.) ' <.#.` ..>.5.3.3.>.>.>.>.>.3.3.>.>.3.3.3.3.>.>.>.>.#.>.>.$.>.3.>.>.3.#.3.<.$.3.3.3.3.<.3.3.3.3.<.3.3.3.5.$.5.6.8.8.c.c.c.z.8.8.8.8.4.4.8.8.8.8.8.8.8.6.8.8.8.8.8.7.8.4.>.>.:.>.>.3.>.3.7.7.8.c.c.4.' ;.i.L.b.V.V.x.6.c.6.5.7.7.3.$.3.5.5.$.<.:.:.>.2.s.d.V ", +" < w./ / ( / h l ~ ( ' ..@.:.o.' ' ) ! ' #.#.o.o.#.@.) ..>.3.3.3.>.#.#.#.>.3.>.>.3.>.3.3.>.>.>.$.>.#.>.3.#.>.>.3.>.3.>.<.$.3.3.<.3.3.3.3.<.3.3.3.$.3.$.3.3.3.5.6.8.c.8.c.8.z.8.8.8.8.8.8.8.8.8.c.8.8.8.8.8.z.8.8.c.8.4.4.<.>.>.#.#.:.>.>.3.3.8.8.8.c.8.@. .7.D.H.C.b.l.z.8.7.6.7.$.>.<.6.$.<.<.>.>.:.<.7.d.Z ", +" $ F n / *./ g l / ` ` ..@.:.@.@.` ~ ) ..#._ ..$.#.) @.5.3.3.>.>.>.#.#.#.>.>.>.>.#.>.>.3.3.3.>.>.#.>.>.#.#.>.>.>.3.>.3.3.<.<.<.<.<.3.3.3.$.5.$.$.3.<.5.3.3.5.5.4.6.6.8.8.c.8.8.8.8.4.7.8.8.8.i.8.c.8.8.8.8.8.8.8.8.8.4.4.3.4.>.>.>.>.3.3.3.7.7.8.8.8.n.8.:.' 7.A.H.H.b.4.c.8.7.7.3.3.5.5.5.3.<.7.<.3.<.y.d.P ", +" 7 q./ [ ( ~ h l / ` ...:.@.@.o.! ! ) ) +._ #.#.) @.3.3.>.>.3.>.>.>.#.#.>.>.>.$.>.>.$.>.3.>.>.>.>.#.#.#.>.$.>.3.>.>.3.3.<.$.y.$.$.$.3.4.5.5.5.3.3.3.3.3.3.5.5.4.6.6.z.8.8.4.8.4.4.8.4.8.8.4.8.8.c.8.c.z.8.8.8.8.4.8.8.4.4.3.3.3.>.>.>.>.3.5.5.3.8.8.8.8.c.:. .7.G.H.E.x.z.c.8.3.<.<.4.$.7.5.2.5.5.<.3.y.d.P ", +" < 9./ { ( l h h ^ ` .;...@.@.) h ) #.#._ #.#.) @.>.3.3.3.3.3.3.>.#.#.#.>.#.>.>.>.$.>.3.>.3.3.>.3.>.>.>.>.>.>.>.3.3.<.3.3.<.#.3.y.$.u.$.5.5.$.3.3.3.3.5.$.3.&.5.4.u.6.8.6.4.8.8.8.8.8.5.8.7.8.8.8.8.8.8.8.8.8.8.8.8.8.6.8.7.3.>.>.3.>.>.3.3.<.7.5.7.8.8.c.c.@.X.i.J.H.H.c.8.3.3.>.5.4.3.3.5.5.5.5.7.7.7.s.G ", +" A 9./ ( { l h l ( ^ .........! ! #.#._ @.#.| @.>.>.3.3.>.5.>.3.>.#.#.>.#.>.>.>.#.$.>.>.3.3.>.3.>.3.#.$.>.3.3.3.>.3.3.3.<.$.3.3.3.$.3.$.5.$.u.5.3.5.&.3.3.3.3.5.5.7.6.6.6.8.8.8.8.7.5.8.7.8.8.8.8.8.8.8.8.8.4.8.7.8.8.6.6.4.3.3.3.>.3.>.>.<.3.3.5.7.8.8.c.c.8...@.s.G.H.v.7.3.>.3.4.4.$.3.5.5.7.5.7.6.i.d.P ", +" V =./ ( ( ~ l l ( ` . .....) l ^ #.o.@.>.) ..>.#.3.3.3.3.3.5.3.>.@.>.:.>.>.>.>.>.>.>.3.>.>.3.>.3.>.3.>.$.3.>.3.3.3.3.5.3.$.y.3.3.3.5.5.5.3.$.5.3.3.$.y.3.3.3.5.5.4.6.6.6.3.8.8.3.8.5.3.7.8.4.8.8.c.8.8.8.8.8.8.7.7.8.8.7.8.7.3.3.>.3.3.>.3.<.3.3.3.8.i.c.c.c.8...<.Z.C.V.8.3.4.7.<.7.3.3.3.y.7.7.6.u.i.s.D o ", +" V [ [ { ] ~ h ~ ^ ( ` .' .^ / @.#.#.>.@.) :.3.3.3.3.3.3.3.5.>.3.>.>.#.>.>.$.>.>.>.>.3.>.3.<.3.<.>.3.<.3.3.<.3.3.3.3.3.3.7.3.3.3.3.4.5.5.$.$.5.5.3.7.$.$.$.3.5.5.5.5.6.6.6.6.5.6.7.6.5.6.6.6.u.6.8.8.8.8.6.6.6.7.8.8.8.8.8.4.8.3.3.<.>.3.3.3.3.<.3.7.8.8.M.c.c.6...2.D.V.M.4.8.6.6.5.5.3.5.3.5.7.i.7.i.i.P o ", +" . Z [ / { { ~ h l ( ( ( ` .` ! ' >.O.#.@.^ :.:.>.>.>.3.3.5.3.5.3.$.>.>.#.#.>.#.>.@.3.3.3.3.>.3.3.5.3.3.3.<.3.3.5.<.5.5.3.3.<.3.4.3.5.3.$.5.5.5.$.5.3.3.3.y.$.u.$.5.5.6.u.5.5.7.u.4.6.5.6.5.7.7.6.6.6.i.8.8.6.i.6.6.7.8.8.8.4.4.4.8.7.7.5.3.<.<.>.3.3.7.8.8.8.8.c.c.>.:.i.N.B.z.6.z.6.6.4.5.3.7.7.7.7.i.i.8./.o ", +" o G [ [ { ^ ~ l ~ ^ ( ( ` ` ( ( >.#.#.>.) ' #.>.>.>.3.3.3.3.3.5.4.3.>.3.>.>.>.>.>.3.3.>.>.3.>.3.3.<.3.5.4.:.3.3.5.<.5.<.5.5.5.3.3.7.5.7.5.7.3.3.5.5.3.3.3.$.3.3.3.y.&.5.6.6.5.&.7.6.7.5.5.6.6.5.6.6.6.6.6.6.6.6.8.4.6.6.8.4.8.8.8.7.4.7.5.<.5.3.3.3.3.7.7.8.8.M.c.c.c.:.<.Z.V.M.8.6.6.7.8.3.3.7.8.7.7.7.i.i.9.O ", +" . G { [ { ^ / h ~ ( ^ ) ` ' ( :.$.#.:.' ) #.>.:.3.>.>.4.5.3.5.5.3.3.3.3.>.>.#.>.>.>.>.5.3.3.3.3.3.3.5.5.4.5.3.5.3.3.3.3.5.5.4.3.4.3.4.3.3.5.3.$.3.3.3.3.3.3.3.3.5.3.3.6.5.4.6.5.5.6.5.6.5.7.5.5.7.6.8.7.6.i.6.6.8.8.8.8.8.8.8.8.8.8.4.7.5.3.5.>.>.3.<.8.6.8.c.8.8.8.c.8...i.G.N.z.6.5.6.3.3.3.5.8.7.7.7.7.i.(.5 ", +" O H [ / { ] ~ l ~ ^ ) ( .^ ..$.#.@.@.^ @.@.:.>.>.3.3.3.3.5.5.5.5.3.3.:.3.3.#.>.3.3.>.>.3.3.3.5.3.3.7.5.4.3.3.3.3.3.3.3.3.3.<.4.3.7.3.3.3.5.$.$.$.$.3.3.3.3.$.3.3.y.5.5.5.5.6.6.6.5.6.5.7.5.4.7.7.6.6.7.8.8.8.8.8.6.6.6.6.8.6.6.8.8.8.7.6.6.7.3.3.<.3.7.6.8.8.8.8.i.c.c.#.:.M.N.z.4.5.$.4.4.7.7.7.7.7.7.2.i.e.* ", +" & F / [ { { / l / ^ ^ ^ ] .#.$.#.o.` ` :.:.>.>.>.>.<.5.5.5.5.4.4.5.4.3.3.>.3.3.>.3.3.5.<.3.5.>.3.3.3.8.7.3.<.7.3.<.3.5.3.4.7.7.<.4.5.4.$.y.3.u.3.y.3.3.3.3.3.3.3.3.5.5.u.6.7.6.6.7.5.6.6.5.7.4.7.7.7.6.6.8.8.8.8.8.6.8.z.6.8.8.8.4.6.8.7.7.7.7.7.5.5.7.7.8.8.7.8.8.8.c.8.+.y.m.N.5.5.5.8.4.7.7.7.i.7.7.7.i.a., ", +" & F / / { { ~ l / / ^ ^ ^ @.$.o.@.@.) @.:.#.>.>.>.3.>.3.3.5.8.5.4.8.5.5.3.3.>.3.3.>.<.3.<.>.5.3.5.5.3.8.3.7.7.4.5.3.3.3.3.3.3.<.3.<.<.5.3.3.3.$.y.$.3.$.<.y.$.3.3.3.y.7.4.6.6.y.6.7.u.6.7.6.7.6.4.5.6.7.6.6.8.8.8.8.8.8.8.6.8.8.8.8.6.7.7.8.7.7.7.4.7.6.8.6.8.8.8.8.8.M.M.$.<.M.B.&.4.4.4.4.7.7.7.7.7.7.7.s.(.7 ", +" # F / / { { / l / ^ ^ / .>.#.' @.' ) :.#.:.:.>.>.>.>.5.7.5.5.8.5.8.5.5.5.3.3.3.>.3.3.3.3.3.3.5.3.5.3.3.8.8.<.4.3.3.3.3.<.3.3.3.3.3.7.3.$.3.7.7.5.$.3.3.$.3.<.$.3.3.5.6.u.6.6.7.6.8.7.6.7.6.7.6.7.6.7.6.6.u.8.z.z.6.6.6.6.8.8.6.8.8.7.7.7.8.8.7.6.6.8.6.6.u.6.7.8.8.8.8.i.6.@.7.m.M.4.6.8.8.7.8.8.7.7.7.7.7.p., ", +" 7 w./ { { { ^ l / / ^ ] @.<.+.| :.^ @.:.#.>.:.>.>.>.>.5.3.3.5.5.4.7.7.7.5.5.7.5.5.3.3.<.3.<.3.3.3.3.7.7.7.6.7.5.5.$.3.3.3.3.3.7.3.3.<.4.3.3.3.4.$.5.5.5.3.3.3.<.3.5.5.7.6.6.6.y.6.6.7.7.6.6.6.7.8.7.6.6.6.8.i.z.6.6.8.8.8.8.8.8.8.6.8.8.u.8.8.8.6.6.u.7.8.u.8.7.8.7.8.8.8.M.#.<.M.m.z.8.4.8.8.8.i.8.8.i.i.i.a.* ", +" < 9./ ( { { ( ~ / ^ ] .<.<.| ....) :.:.>.>.#.:.>.>.>.3.3.7.5.8.4.8.7.4.6.5.5.4.5.3.5.5.5.3.7.<.<.7.3.3.6.4.6.7.5.3.5.<.<.3.3.3.<.3.7.3.<.7.3.3.5.5.3.3.3.3.3.$.3.3.5.7.6.8.8.7.7.8.6.7.7.7.7.6.6.6.6.8.8.8.8.8.8.8.6.6.i.8.z.6.u.6.6.8.8.8.8.6.6.6.6.6.8.8.i.7.8.8.8.8.8.c.6.@.6.M.z.6.8.8.8.8.Z.8.s.8.i.i.(.: ", +" q 9.] [ { { / / / / ^ @.r.| ..@.) ' :.:.>.>.>.>.>.>.>.<.:.3.5.5.5.5.4.4.7.6.4.5.5.3.7.3.5.3.<.3.>.3.7.7.7.7.6.6.7.5.5.3.5.5.3.<.<.3.<.7.5.<.3.5.y.3.3.$.<.3.3.3.3.5.5.6.8.8.6.6.7.7.6.6.6.7.u.6.8.6.8.8.z.8.6.6.8.8.u.6.8.8.6.u.i.8.i.8.i.8.8.8.6.y.8.6.7.8.8.8.8.8.8.8.8.c.c.@.<.m.z.&.4.8.8.i.n.c.8.c.i.i.a.7 ", +" V 9.] / { ( ^ / [ ^ } ,.+.| ..@.^ @.#.#.@.>.>.:.>.>.>.>.>.3.3.5.4.5.7.8.6.7.6.7.5.5.3.3.3.5.3.3.7.3.7.>.7.7.8.7.4.5.5.3.<.<.3.3.3.3.<.3.<.5.3.5.3.$.y.$.3.3.<.<.5.5.7.7.7.7.7.8.8.7.7.6.7.8.8.6.u.8.c.8.i.6.8.8.6.6.6.6.6.8.8.8.8.7.8.8.8.8.8.8.6.7.7.6.8.7.7.i.8.i.8.8.8.8.M.#.@.M.m.6.4.8.6.8.i.i.c.i.i.s.d.}.; ", +" q =.( ( { { ( / ] ] X.0.| } @...) @.:.:.>.@.>.:.>.>.>.@.>.>.<.5.7.5.4.8.8.6.7.7.7.3.3.3.5.3.2.3.3.3.7.3.7.7.6.6.6.7.5.5.5.5.<.5.5.5.5.<.7.3.5.5.<.7.3.y.3.3.<.3.3.7.7.6.7.6.8.8.8.8.7.7.6.8.6.8.8.6.8.8.6.z.i.8.8.6.5.6.8.i.6.8.8.8.8.8.8.8.8.8.7.7.6.7.6.7.8.8.7.8.8.8.8.8.Z.7.| u.6.z.8.8.7.i.i.8.i.i.i.i.y.+XY ; ", +" V *.[ { ( { ( / ] } +.} | } @.^ ..@.#.:.>.>.>.:.@.>.>.>.>.>.3.7.5.5.7.7.6.6.6.6.8.8.7.7.5.3.7.7.7.>.>.7.7.y.6.8.6.7.7.5.7.5.3.3.7.3.5.5.7.5.5.5.3.7.$.y.5.2.<.3.5.5.7.7.8.u.7.7.8.7.i.8.8.8.i.6.8.8.m.i.z.i.i.z.i.6.6.y.6.8.8.8.8.8.8.8.7.6.7.6.6.7.7.7.7.7.6.8.6.7.6.8.8.u.8.8...3.i.m.8.8.7.8.i.i.i.8.s.8.d.$X$XY ", +" a { { { ( [ { / ] | X.} | } #.^ ..#.@.:.>.>.>.>.>.>.>.>.>.>.>.<.<.1.1.1.r.r.r.2.1.1.1.2.2.2.t.2.1.2.2.2.3.3.5.$.5.3.3.3.<.3.3.3.3.<.7.5.<.5.5.3.3.5.5.3.5.3.3.5.$.r.7.y.8.7.8.8.8.8.8.8.6.8.u.6.8.8.8.8.8.8.8.8.u.8.6.4.8.u.i.u.u.8.6.8.7.7.7.6.7.u.7.7.6.7.6.7.7.6.7.8.8.8.8.M.#.:.8.z.c.6.8.8.8.7.8.8.i.i.d.$X2X$XO ", +" o G 9.{ ( { { ( / ] X.} | ) | +.^ :.@.:.:.:.@.:.#.>.#.>.:.>.>.>.>.&XxXxXxXbXzXzXbXlXbXlXlXjXlXjXgXfXdXdXpXpXyXyXyXyXyXyX5X5X=X*X*X&X#X#XXXXX X X.X X|.|. X|.g.g.a.a.a.a.a.a.h.h.).).|. X X X>XOX>X&X,X,X&X>X>XXX X X X X Xj.j.j.h.(.h.h.h.(.h.h.p.7.6.6.6.7.6.7.6.<.6.7.7.6.6.i.M.$...8.6.m.8.7.7.7.5.5.7.8.i.d.$XW 6X7 ", +" o S { { { ( .{ ( ] X.} | ) @.' ( :.o.:.o.:.>.:.#.>.:.:.>.:.:.>.1.9XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXHXHXFXFXFXFXFXAXFXSXSXSXSXCXBXmXmXmXmXmXMXNXBXZXAXSXSXSXDXGXGXGXGXHXHXHXHXGXGXDXFXSXSXAXVXZXBXVXNXVXBXVXVXVXCX9X<.7.4.7.7.7.7.4.5.5.5.6.5.u.8.8.8...7.4.m.u.6.7.7.3.<.7.8.i.2.+X0XeXI ", +" o G { { { { ( { ( } X.} | ) @.^ ' :.:.:.>.:.:.>.@.:.>.>.o.:.>.>.:.9XHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX<.7.7.7.<.7.7.4.5.3.5.5.7.6.6.8.c...<.8.u.d.6.6.8.3.<.<.7.i.i.-.7XVXW o ", +" o T { { { ` ` ( ( } ] | | ) @./ ' :.:.:.:.@.#.@.>.:.>.>.:.:.>.:.:.9XHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXpX3.7.7.7.3.7.<.7.5.3.3.5.3.7.7.8.c.@...8.&.s.6.6.8.8.5.3.7.i.y.;.R gX3XO ", +" o G { { { *.*.[ ( | ! | | .@.( @.:.o.:.:.@.@.@.>.:.:.@.>.@.:.>.;.9XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiX5.7.8.7.7.3.7.4.5.3.3.>.3.5.7.6.c.>.` u.&.m.d.6.6.6.6.<.7.i.s.q.$XwXrXr ", +" o G { ( ( ` { { ( ;.^ | ) ' ..^ :.o.:.:.:.:.#.:.:.@.#.:.:.>.:.:.:.4XJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXJXJXJXJXJXJXJXJXJXHXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiX2.7.8.7.8.7.6.7.3.3.<.3.3.3.3.7.8.5.| 5.$.m.d.8.8.8.6.5.7.i.y.q.eXrXtXY ", +" o G *.[ [ ( .[ ( { ^ | ) ..' ` :.>.:.:.o.@.@.>.@.:.#.:.>.:.:.:.@.4XJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXHXJXHXJXJXJXJXJXJXJXJXJXHXJXJXJXJXHXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX9X7.7.7.7.8.3.3.7.7.3.5.3.3.3.3.5.6.8. .5.&.6.d.6.8.6.6.7.7.7.7.H 8X7XeX6XO ", +" o D { { ( [ ` .{ X.} +.) :.^ ( >.>.>.:.>.@.:.@.:.@.:.:.#.:.@.:.@.4XHXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXFXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXHXJXJXJXJXJXJXJXJXJXJX9X7.7.7.8.8.6.7.3.5.3.5.>.3.3.$.3.3.7.@.<.7.&.d.6.8.8.6.6.7.8.s.q.T R 0X7X9 ", +" o D { { ( ( *.{ .{ } | ) :.^ ` :.>.>.>.>.>.#.@.>.:.#.:.:.:.>.:.:.4XHXJXHXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX=X7.7.8.7.6.6.6.7.6.7.5.3.3.3.5.3.$.7.@.@.8.$.u.s.8.4.6.6.8.8.s.e.$XR 8X7XU ", +" o D { [ [ { { { { } | | ) :.^ ' :.>.>.>.>.>.:.>.:.#.:.:.>.:.:.:.:.=XJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXFXdXiXpXiXiXpXiXpXsXdXdXjXgXvXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXHXJXJXJXJXJXJX=Xt.7.6.7.8.7.8.8.7.5.4.3.4.<.7.4.>.7.>.' 6.O.u.d.8.z.8.8.7.i.u.a.$XY 8XwX6X& ", +" o D [ { { { { { } } | | ) #.^ @.:.>.>.>.>.>.>.#.:.:.:.:.:.:.:.:.:.=XHXJXHXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXMXe.#.#.#.#.#.>.:.,.<.,.t.1..XSXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHX9X5.7.6.7.7.8.7.5.4.8.7.8.6.6.<.3.$.3.<.` y.&.u.u.6.i.8.6.8.8.i.1.C K 6XCXMXr ", +" + G { [ [ { .] X.} } | ` :.^ #.#.:.>.>.:.>.:.#.:.#.:.>.:.:.:.:...*XHXJXJXHXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXHXJXJXJXHXJXMXg.2.t.2.3.2.<.<.3.<.<.<.<.|.SXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHX9Xy.7.6.8.3.8.8.5.8.7.4.7.6.6.6.7.3.3.7.' y.O.u.d.i.c.8.6.7.s.s.;.> I 3XHXDXQ X ", +" r w.{ { { { { ] X.] | +. .#.` @.:.>.>.>.:.:.#.:.>.:.:.:.:.:.:.;.;.=XHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXMXg.5.3.3.<.3.<.3.7.<.<.<.,.|.SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXHX=X7.7.7.7.7.8.8.5.8.7.7.7.7.6.7.6.4.4.7.' 3.&.&.u.u.z.8.8.8.8.7.n , t E vXHXwXo ", +" Y /.( { [ { -.{ .{ | +.| #.` >.>.>.#.#.>.:.>.:.:.:.>.:.:.:.>.:.:.*XHXHXHXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXMXg.5.<.5.<.<.3.<.<.<.<.<.3.|.FXJXJXJXJXJXJXJXJXJXHXJXJXJXHXJXHXJXJXJXJXJXJXJXJXJXJXHXJXHXJXJXJXJXHX=X7.7.3.7.8.8.3.8.4.<.8.4.4.7.8.8.8.8.c.' <.6.&.u.s.i.i.8.7.i.2.u w U I Q 8Xt ", +" ; Q H ~ { { { { { X. .| | | @.` >.<.>.$.>.>.<.>.>.>.:.:.>.:.:.:.:.:.*XHXHXJXJXJXJXHXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXMXg.3.7.5.5.3.5.5.5.5.3.<.3..XFXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJX*X7.8.8.8.4.7.8.7.8.8.7.8.7.8.8.8.8.8.c.' @.6.&.u.d.8.8.7.8.y.<.> A E K O O ", +" A E f [ [ { { { { -.] +._ ' @.` <.3.3.3.3.>.<.>.>.>.>.,.:.>.:.:.:.:.&XHXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXMXa.7.5.5.5.7.5.5.<.5.7.3.:.oXFXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX*X7.8.8.7.8.7.7.7.7.3.8.3.3.8.6.8.i.8.c.' ..6.%.i.t.8.8.8.7.8.;.> I Q I ", +" o I I 1 j n ] { { { X.] +._ ' @.) >.3.7.7.3.<.3.<.:.>.>.>.>.:.>.:.:.@.%XHXHXHXJXJXJXJXJXJXJXJXGXJXJXJXJXJXJXJXJXJXGXJXJXJXJXHXJXJXJXJXJXJXJXJXGXMXa.5.7.5.3.7.<.5.5.<.<.<.>.oXFXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHX*X7.7.8.3.7.8.7.4.8.3.5.8.3.8.8.8.8.8.c.:. .6.O.8.p.7.7.7.7.8.;., I Q U o ", +" = U I & > p n ] ] ] ] ] +.| | +.} <.#.3.5.3.7.<.<.<.<.<.>.:.>.>.:.,.:.#XHXJXJXJXJXJXJXHXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXHXJXJXJXJXJXHXJXJXJXJXJXJXnXp.5.5.5.5.2.<.5.7.2.3.7.>.@XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHX=X5.7.7.6.7.7.6.7.3.6.6.7.6.6.6.6.z.8.c.#.` 7.$.u.u.y.7.3.7.8.b 4 t W U O ", +" K Q I = & : u d j l X.] +.| +...] <.3.7.5.5.5.5.5.3.<.<.:.>.>.:.<.,...@XHXHXJXHXJXJXHXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcXa.7.5.5.5.5.5.7.3.3.3.3.>.%XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHX*Xy.7.u.6.6.7.4.7.5.5.7.7.7.6.8.8.8.8.i.<.) 7.O.6.u.7.7.@.:.=.a 8 t E U X ", +" & E R K = = = = $ > s v } +.} +.' .@.<.<.3.<.5.7.7.<.<.<.<.:.<.:.,.,.:.@XFXHXJXHXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcXa.7.7.2.5.5.5.5.5.<.2.3.>.&XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX&X7.8.6.7.4.7.4.7.4.&.7.6.8.8.8.8.8.8.8.4.) 7.#.u.u.y.X.b s 4 6 8 7 E U X ", +" 6 E Y K & = & & = = $ N } +.} +. . .@.,.<.3.8.5.3.3.3.3.3.<.<.<.:.<.:.;.@XHXHXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXmXa.7.5.7.5.7.5.5.<.5.3.2.>.%XJXJXGXJXGXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXHXJXHXJXJXJXHXJXJXJXJXJXJX*X7.8.6.7.7.7.5.4.5.7.6.6.8.z.8.6.8.8.8.4.) 7.%.&.d.-.a , 5 < 6 4 0 Y 9 o ", +" o 0 E E Q - & - & & & * x } +.} ,...` :.<.>.5.5.5.3.7.<.5.<.<.<.<.:.:.:.:.@XFXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXHXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXnXp.7.5.5.5.5.5.3.5.5.<.5.3.%XJXJXJXJXJXJXJXJXJXHXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX9X7.u.6.6.7.4.4.3.7.3.8.8.8.8.8.6.6.6.6.8.} 5.&.&.f.[ 2 2 < < 5 4 V E 6 ", +" 2 6X4XY E 3 * & & & & $ B } +.} #.) ..:.:.<.>.3.<.<.5.5.<.8.3.3.3.>.>.<.:.@XDXHXJXJXHXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXHXJXcXp.3.3.5.5.5.7.5.<.5.5.3.>.%XFXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX9X7.8.7.6.4.7.3.7.4.4.8.8.8.8.6.6.6.6.4.8.} 3.#.u.u.9., ; 5 ; < 4 M R 0 ", +" I 6XE 6XE M 1 > , $ $ $ B } +.} @.) ..>.<.>.3.>.5.5.5.5.5.5.5.5.7.<.<.<.:.@XDXJXHXJXHXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXnXa.7.5.5.<.7.5.5.5.5.3.<.:.*XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXyX7.8.7.6.7.3.4.8.7.4.8.8.8.8.8.6.6.8.8.8.| <.$.&.u.0.4 ; = 4 M a C R K ", +" % Q Q K U E C u y u a , V n ] +.} #. ...@.>.>.<.>.5.3.5.5.5.5.5.3.<.<.>.<.:.@XFXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXbXa.7.5.5.3.5.5.5.5.<.5.3.>.*XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX2.7.7.6.3.3.3.<.4.8.8.8.8.8.8.8.6.8.c.c.) 7.#.6.u.r.a 3 a z c x m E K ", +" 5 U = % & K S i y i f G $XF } +.} #.` ;.:.>.>.>.<.<.<.5.3.7.3.3.3.7.3.3.>.:.@XFXJXHXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXnXa.3.7.5.5.7.4.<.<.3.3.<.>.*XJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdX2.8.7.7.5.5.5.7.4.6.8.c.8.8.z.4.8.6.z.c.) <.$.6.u.y.n B v c =.v 1 U I ", +" = 8 & % ; 5 ; m i p y R rXrXrXq.+.} +.( :.:.>.>.<.3.3.3.3.2.3.7.3.7.3.5.<.>.1.@XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcXa.5.3.3.3.5.7.<.7.4.7.<.>.4XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX5.8.5.3.5.5.5.6.6.8.i.8.c.8.8.8.8.6.c.c...<.$.&.u.6.,.=.v v B N M I Y o ", +" = 8 & & 0 3XW = a p y p W qXvX0Xq.+.| r.` o.:.>.>.<.3.>.:.3.<.3.7.3.3.5.5.7.5.:.@XGXJXGXJXHXJXJXJXJXJXJXJXJXHXJXJXHXCXZXCXCXSXCXZXVXMXVXVXVXCXVXCXVXCXCXCXgXt.5.5.3.5.3.4.5.3.3.3.3.:.5XJXHXJXJXJXJXJXJXJXJXJXHXJXJXHXFXGXHXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX5.6.5.5.5.4.5.4.6.8.8.8.8.8.8.8.8.4.c.c.| <.$.&.5.y.,.=.B n n B N A I o ", +" o 6 & O 5 Y wXY = 1 p p i 7X2XrXqX0.+.| +.^ @.>.>.>.<.>.<.3.7.3.2.3.5.5.5.5.5.7.>.#XGXJXJXJXJXFXJXJXJXJXJXJXJXJXJXJXcXoX(.|.(.|.(.(.(.h.(.h.h.(.h.(.(.h.(.h.h.7.5.5.5.5.5.<.3.3.7.<.7.3.(.*X=X9X4X9X9X9X9XyX9X9X4X1X*X*X&X&X*X9XSXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpXt.u.5.&.5.5.5.y.6.u.8.z.8.z.8.8.8.z.c.c...:.+.&.u.4.1.9.-.n B b c L I o ", +" o 9 = O ; 3XE 8XQ 2 < d y p 8XqX$XF ,.+.} +.^ ;.>.3.<.3.>.<.>.<.<.3.<.2.3.7.7.5.5.3.@XFXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXjX1.7.7.3.<.7.<.5.<.5.7.3.5.<.<.3.3.7.3.5.y.5.5.5.5.<.4.3.<.<.3.<.4.>.,.:.<.3.<.<.5.<.<.7.7.7.7.7.7.8.8.7.h.NXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiX7.6.7.3.5.5.5.6.8.6.c.6.8.c.8.8.8.8.z.M...:.$.&.u.5.<.[ *.=.b B B S I % ", +" = 8 % O K tX6XQ Q 2 > i j p T rX+X=.+.+.| +.^ o.:.>.>.>.>.>.>.>.>.3.3.3.3.3.<.5.7.>.#XFXJXJXJXHXJXJXJXJXJXJXJXJXHXJXJXjXt.7.7.5.7.7.2.5.5.5.7.5.5.5.y.3.y.3.7.7.3.5.5.3.3.7.7.<.7.3.5.7.3.<.<.<.3.7.5.5.6.7.6.6.7.8.8.7.6.u.8.8.a.mXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX9X7.7.4.7.5.5.4.6.8.8.8.u.8.i.6.8.4.8.M.M.@.;.$.&.u.u.7.-.-.B B B N T I ; ", +" 9 & & % E 8XwX3XQ - 1 d p p T eXw.X.+.+.| +.( :.>.>.>.3.>.>.>.<.>.>.<.3.3.2.<.5.5.>.#XHXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXjXp.7.7.7.7.7.5.2.5.7.5.5.5.5.5.5.5.5.5.5.5.<.5.5.5.5.3.3.<.3.3.7.<.3.<.5.5.5.5.5.7.7.7.<.8.7.7.8.7.7.u.u.a.nXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX9X7.7.5.5.3.7.7.7.6.u.8.8.u.8.6.6.4.i.M.c...;.4.%.u.6.<.-.*.*.B n B U U < ", +" & 6 # O 6 8XtXwXW E 8 , s p p P rXH X.&.| | +.( :.>.>.>.>.>.>.>.<.:.2.>.<.5.:.5.<.5.<.&XHXHXJXJXHXJXJXJXJXJXJXJXJXJXJXJXjXt.7.7.5.5.<.5.5.7.5.5.2.5.5.5.5.6.5.5.5.5.5.5.5.5.3.3.4.7.<.3.<.7.5.3.3.3.<.3.5.5.6.7.7.8.6.8.i.8.8.6.8.p.nXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX9Xy.7.5.5.5.3.5.7.7.6.y.8.8.7.7.6.6.i.8.c.+...6.&.6.5.7.;.=.B N c B R Y t ", +" 8 = # X I eX8XeX8X6XJ : s p p T eXH ] +.o...+.` :.3.3.>.>.>.>.>.>.>.>.>.<.<.<.<.<.<.<.&XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXjXt.7.7.5.5.u.5.7.7.5.7.2.3.5.5.5.7.7.7.5.5.5.5.3.3.3.3.3.5.2.3.5.<.5.<.3.3.<.5.5.5.5.7.7.8.7.7.6.8.i.i.i.a.mXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX9Xy.y.5.3.3.2.3.5.y.7.8.u.7.u.6.6.8.8.i.i.+...&.z.6.7.4.*.*.B c b N T Q K X ", +" 9 $ O O E eXtX8X2XY ; : u j p U eXH ] +.| @...` >.>.3.3.3.>.>.>.>.>.>.>.>.3.<.>.<.<.<.*XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXt.7.7.7.5.5.y.5.5.5.5.7.7.7.5.7.6.5.5.7.5.7.5.7.7.5.3.3.5.3.3.5.3.5.3.3.5.5.3.3.7.7.7.7.8.8.6.8.7.8.8.i.a.nXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX9X5.5.5.<.$.3.<.3.5.u.u.6.8.7.7.7.7.i.M.M.@...u.&.8.7.4.1.-.*.z N B T 6XR O ", +" 6 # # O Q eXeXeXtXW 8 , f p j H eXH n | } @.| .>.<.5.3.3.3.>.>.>.:.>.>.<.>.>.>.<.>.>.*XGXJXGXGXJXJXJXJXJXGXJXJXJXJXJXJXgXr.8.7.5.5.7.5.5.7.5.5.5.7.7.7.7.7.7.4.7.5.5.5.7.5.3.3.3.3.<.3.3.3.5.3.3.3.<.3.3.5.7.7.6.8.8.u.8.8.8.i.c.d.mXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX9Xy.7.7.3.3.t.#.$.5.5.7.7.y.8.7.8.7.8.8.M.<.{ 6.z.i.6.3.;.=.-.B c B W 3XY = ", +" . 8 O X O Q tX8XeX6X2Xe , s d j T eX}.n } ) @.| .:.5.7.7.5.3.>.>.3.3.:.>.<.>.>.>.>.<.>.&XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXr.7.7.7.7.5.y.5.5.3.5.7.5.7.5.6.5.5.5.3.7.7.5.5.3.5.5.y.3.3.5.3.7.<.3.3.7.3.5.5.5.7.7.6.6.u.8.8.8.8.i.8.j.mXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXyX6.6.7.3.$.$.u.y.5.7.7.y.8.i.7.7.8.8.i.M.t.X.6.z.u.8.>.1.0.=.c N B T 8XY = ", +" o 8 # # o E wXeXeXtXwXJ : f d j T rXw.x } } @.} ..>.3.7.4.7.5.3.3.<.3.>.>.>.>.>.3.<.<.:.@XFXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXgXr.7.7.5.6.7.7.5.7.7.5.5.3.u.6.6.y.5.7.5.7.5.5.5.5.3.3.3.5.5.5.2.3.5.3.3.<.7.<.5.6.7.8.6.8.8.8.8.i.i.8.8.a.NXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXyXy.8.6.5.3.3.3.3.3.7.7.7.7.8.8.7.u.6.c.M.3. .6.k.i.8.>.:.=.B B z B W 7XQ 5 ", +" . 8 # O o I tX8XeX8X8XQ , s j j T rX}.k ] ! #.} ..:.>.7.7.4.5.5.2.3.>.>.>.<.3.>.<.:.>.>.@XFXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXhXt.8.u.7.6.7.7.7.7.5.y.5.5.&.y.6.8.u.7.7.7.7.6.3.7.5.7.5.5.5.5.5.3.<.7.<.<.3.5.5.7.8.u.8.i.i.i.8.8.8.i.c.).mXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiX7.8.6.7.3.&.5.5.3.&.5.4.6.7.6.u.8.8.8.M.y.+.u.&.i.8.#.7.0.B z N B T 8XW = ", +" 6 & O O r 3XtX8XrXeXQ , s j p T wX}.n { ] @.` ..>.3.>.3.5.5.5.7.3.3.3.<.>.<.>.3.>.>.>.@XGXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXgXr.&.y.&.5.2.3.5.5.:.<.<.$.y.3.7.7.3.>.3.7.6.7.7.7.4.5.7.5.$.3.3.5.<.>.>.>.<.:.<.7.<.<.7.7.7.i.7.<.7.5.i.a.mXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiX7.8.7.5.5.5.5.$.5.5.4.5.7.6.6.6.8.6.i.Z.8.@.6.#.7.i.#.2.*.n z N B +X6XQ & ", +" 8 = O O % R 8X8X8X8X6XJ a p c P eX}.! .} <.} @.:.>.7.3.7.5.4.7.7.7.5.5.5.5.3.<.<.:.>..XDXJXGXJXJXJXJXJXJXJXJXJXJXHXJXJXzX%X&X&X&X*X=X=X=X=X=X=X*X*X*X=X=X=X=XyXOX2.7.6.3.7.5.7.3.5.5.y.3.3.oXyXpXpXpXsXpXpXpXpXsXfXfXsXiX5XiXsXsXhXFXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiX7.8.6.6.5.5.$.5.5.5.5.5.5.5.6.6.7.4.8.c.M.@.y.3.i.7.#.7.0.B f N B R 6X6X6 ", +" ; 2 O O X 6 6XtXeXwX6XU 1 z p F 4X+Xl { ` #.} @.2.>.3.3.7.7.4.7.4.3.3.7.3.7.>.<.<.<.>.oXSXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXHXFXJXJXHXJXJXHXJXJXHXJXJXHXJXJXJXJXdXy.7.3.7.3.5.3.5.5.5.7.3.2.dXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiX6.M.6.6.4.5.5.5.5.4.7.5.5.7.4.4.4.8.8.n.i.@.6.6.Z.s.#.7.-.B N z B T 8XQ r ", +" * 9 + O O & Q 8XwX8XwXE , s j z $X+X~ { ` #.} @.>.3.7.3.7.3.7.7.4.7.3.4.7.7.7.3.<.>.>.oXFXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdX7.7.7.5.4.5.5.5.5.5.3.7.1.jXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiXy.8.6.6.5.5.$.5.7.6.4.5.4.4.4.7.4.4.8.8.z.@.6.5.u.8.>.<.r.=.N N B T 8X7X9 ", +" o 9 # O O % 9 6X8X8X8XW , s p j F [ ( .` >.^ :.>.>.3.3.7.7.3.4.4.7.7.7.3.3.7.<.3.<.>.oXFXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXt.6.6.7.7.5.5.5.5.5.3.3.t.lXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX5.8.i.8.6.7.7.4.5.6.4.6.4.8.8.7.8.8.n.n.M.@.7.5.Z.8.3.<.;.B N z B +XwXQ 5 ", +" 8 < # X # # t 8XwX8XQ < u p b j / ( } ..@.^ :.>.>.7.>.3.3.7.7.3.7.3.5.7.3.3.5.5.3.<..XDXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXt.7.5.5.5.7.5.5.5.5.7.<.t.zXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX5.m.i.6.6.6.6.8.4.4.6.6.8.4.4.8.4.8.8.n.8.@.7.5.i.8.>.<.1.*.c N b T 8XQ % ", +" + r + O O # % I 8X8XQ , a d p l / / .` @.^ :.2.>.3.3.3.7.7.3.7.7.3.5.5.7.5.<.7.<.:.|.CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXdXy.7.7.3.5.5.7.5.5.5.<.3.t.zXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpXy.8.i.6.z.8.8.6.8.8.4.4.8.4.8.7.8.8.c.c.i.o.7.8.u.8.4.>.;.B N z B T wXU o ", +" r < O O # % = Q 8XQ , u d b b ~ / .' ' ^ :.:.>.3.7.3.>.3.7.4.7.7.5.5.5.5.5.3.3.>..XFXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXt.7.7.4.5.6.7.5.5.5.3.2.a.xXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXy.i.k.i.8.8.6.6.4.8.8.8.4.8.8.8.8.c.c.n.c.@.<.8.8.8.7.:.7.-.B z B R 3XI ", +" + e + O % & % ; W Q , u d p n ~ ( ....@.( :.>.3.3.7.>.7.3.3.4.3.4.4.7.4.5.3.7.7.<..XAXJXJXJXJXHXJXHXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXdXy.7.7.4.5.5.5.7.<.5.3.5.a.zXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX5.M.u.m.8.8.4.8.8.8.8.4.4.8.4.8.8.c.i.n.n.o.<.8.8.8.4.@.1.B b x N T Q 0 ", +" 8 7 + # & % % ; J q s d j n ] ( ` ..' ( :.>.>.2.3.>.3.>.3.7.7.7.4.5.5.7.3.7.<.<.(.CXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXy.7.7.5.5.5.5.5.5.5.5.5.t.zXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpXy.i.8.6.8.8.6.8.8.8.8.8.8.4.8.8.8.c.c.c.8.@.<.8.i.6.5.@.2.*.N b x T E 6 ", +" O r $ # = % # # & q s d d n ! { .....^ +.>.<.3.<.>.3.3.8.3.7.5.5.5.5.7.<.5.7.>.(.FXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXy.7.6.5.4.5.7.5.5.5.5.3.a.xXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX7.i.8.8.8.8.8.8.8.8.8.8.8.6.8.8.c.8.c.c.n.@.@.c.8.8.7.o.7.=.c N M T E 9 ", +" = 8 + & % # # # 1 s d j n ! ] .....} >.<.3.<.3.<.<.<.3.7.4.5.8.5.5.5.7.5.3.>..XDXJXJXJXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXJXJXJXJXHXJXJXJXJXJXpXy.7.7.4.5.5.5.$.5.5.3.3.a.xXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpXu.i.c.8.8.c.8.8.8.8.4.z.4.8.4.8.c.c.c.c.c.#.@.i.8.i.8.' 2.=.x N M T E 5 ", +" r 6 # & # & & > s j j n ! { .....) :.>.<.3.3.<.<.3.3.3.7.5.7.3.5.7.5.5.5.<.(.CXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX7.7.7.5.7.5.5.5.3.5.7.7.g.nXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX3.i.M.c.c.8.8.8.z.8.8.8.6.8.6.c.7.c.8.A.n.@.@.i.n.8.7.' 7.=.z c f L R & ", +" 9 t = & # & & 1 d p x ] ! .` @.` .<.>.5.3.<.5.3.5.7.3.5.5.4.4.7.3.7.5.5.3.oXDXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX7.6.7.7.7.4.5.5.5.5.3.7.a.cXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiXu.M.8.8.8.8.z.6.8.8.6.z.z.8.z.8.c.c.c.n.n.>...n.8.8.i.' t.=.N b M L Y o ", +" & = 9 ; O & # & + , s x j b l { ` ....` :.>.<.4.3.<.<.3.3.7.4.7.3.3.3.7.7.5.5.>.#XFXJXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJX9Xd.y.7.7.7.5.5.5.5.7.5.5.g.mXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiXu.M.i.8.8.z.z.8.8.8.8.8.8.l.4.c.c.c.n.n.n.>.' 8.i.7.8.o.7.=.x c N A 9 ", +" o ; t 6 % o X & & # & > d p j { ~ ^ .+.) .>.<.3.5.3.7.5.<.3.3.3.3.7.4.7.3.5.5.5.<.oXDXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpXy.8.8.7.7.5.5.5.5.5.5.5.g.mXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpXy.i.c.z.8.8.6.8.8.z.8.z.8.4.c.8.8.n.n.n.n.>.' n.i.7.i.o.t.=.N N N V & ", +" O 8 6 # X X X o O & # % > f j j n ~ .} @.} ..>.<.5.5.7.7.5.5.3.7.7.4.7.3.3.3.7.<.3.3.OXFXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXpX7.7.6.7.u.5.4.5.6.5.5.5.h.mXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXiX6.i.z.8.c.8.8.8.c.8.8.8.8.8.c.4.8.n.c.n.n.3...i.8.i.8.' 2.B N N N 3 ", +" & r 5 O X X X X o O & & # 1 f s p [ l { .@.} ..:.>.<.3.3.5.5.3.7.3.3.4.7.7.3.3.3.3.7.3.@XFXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXpXy.8.6.7.4.6.6.u.5.5.7.<.(.mXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpXy.M.i.8.6.z.8.c.8.z.z.8.4.c.8.c.8.8.c.c.n.5.' 8.n.8.i.@.7.-.N z N V ", +" o 8 = X X X X . o X # & # , s d x n ~ } .@.` ..>.>.3.<.<.3.3.8.3.4.7.5.4.4.5.5.<.7.3.3.@XFXJXJXJXJXJXJXHXJXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX5.u.6.6.7.5.5.&.3.5.3.$.h.MXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpX7.i.i.z.c.8.8.4.c.8.8.8.c.8.l.8.c.c.c.n.n.8.' i.c.i.i.' 2.*.x N N q ", +" o 2 & O X X X X X . o . % & # : f d d ~ ~ ] .@.} ..>.<.<.<.7.7.3.3.3.7.4.5.5.5.5.5.<.3.<.3.oXDXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXgXOXOXOXOXOXOXOXOXXX.X|.|..XMXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXy.c.M.8.8.l.c.n.l.8.l.8.8.c.c.c.c.8.c.c.n.4.' c.i.8.c.' 2.=.N f N q ", +" & 7 O O X X X X X X . . O & # : s s z [ ~ { .+.` ;.>.<.3.3.3.3.3.7.7.4.5.5.5.5.5.5.3.4.7.>.XXDXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXHXGXHXHXGXGXGXDXFXDXDXCXCXCXHXJXJXJXJXJXJXJXJXJXHXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXpXy.c.M.8.4.n.c.4.8.c.4.8.c.c.c.8.c.8.c.n.A.8.@.i.8.8.i.#.y.=.N N D t ", +" 5 ; O O X X X X X X . o o & # * a d p n ~ { .+.) :.>.<.<.3.3.3.3.7.3.7.5.5.7.8.5.4.3.4.7.4.(.DXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXy.c.8.M.8.l.8.l.8.c.n.l.c.4.4.c.8.c.c.c.n.8.' c.c.i.8.' 7.=.c N M < ", +" 8 2 O X X X X . . . X o O & * a s z ] ~ ^ .@.) @.>.<.3.3.3.<.7.<.3.<.3.7.3.8.7.3.7.3.7.7.(.ZXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXt.c.8.8.c.c.c.l.c.4.c.c.8.8.8.4.c.c.c.n.n.8.@.i.8.i.8.@.y.0.c N C ; ", +" r 6 O X X X X X . . . X # & & , a f p n l . .+.` :.>.<.<.3.3.<.3.3.7.4.7.4.8.3.7.7.8.3.7.3..XSXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXHXJXJXJXJXJXHXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdX7.c.c.z.c.4.c.8.8.l.c.4.c.l.c.c.c.c.n.c.A.8.' i.8.8.8.o.2.-.B f Z & ", +" o t 8 O X X X X X X . O X X < a s j ] ~ { ..@.` @.>.3.3.<.3.3.<.3.3.3.7.5.7.3.3.8.3.8.8.3.oXFXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdX5.i.c.8.c.4.8.l.8.c.c.l.l.8.c.c.c.n.c.n.n.8.:.n.c.8.8...8.0.N N V O ", +" X w 2 & O X O X O X X . = 1 d d n l ` ...} #.<.<.3.3.4.7.3.3.8.3.3.8.3.7.8.3.7.7.3.5.OXSXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdX2.c.8.z.c.8.c.8.c.c.4.4.c.8.4.c.c.8.c.l.c.8.:.c.i.7.8.@.2.-.B C V O ", +" O J 2 & # X X & . + a a z ] ! { ....` :.>.>.3.3.3.$.y.3.7.5.5.5.5.5.6.$.5.5.5.5..XFXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdX7.8.c.8.8.l.c.4.c.c.4.l.4.c.c.c.8.c.c.c.n.c.>.8.n.8.8.' y.r.N C q ", +" X J 2 = & O = = o 1 s d n l .....` >.<.3.<.3.3.3.$.#.3.3.5.5.5.5.6.7.5.5.5.4.).fXjXjXjXjXjXjXjXjXjXjXjXjXhXfXfXsXfXpXsXiXiXiXyXiXyXpXsXfXhXdXgXhXjXjXjXjXlXzXxXxXlXcXcXmXmXMXmXMXNXNXBXNXVXVXNXBXVXNXNXBXMXNXMXmXcXnXnXbXcXzXcXxXxXnXnXmXmXmXmXcXcXzXzXzXzX=X7.8.8.8.8.8.4.c.l.8.c.8.c.4.l.8.c.c.c.n.c.c.:.8.8.7.8.' 7.-.B C 7 ", +" % I 2 = & = - > s j ] ~ { } ..} <.3.<.3.3.$.<.y.3.5.3.3.5.5.5.5.7.5.7.5.6.7.7.2.2.2.<.y.y.t.7.2.y.7.7.7.2.2.2.<.<.<.<.<.3.5.5.$.#.7.<.7.<.5.y.3.y.7.2.t.t.a.t.t.a.a.h.g.j.(.(.(.(.(.h.(.(.).(.h.(.(.(.(.(.(.h.a.h.h.p.a.a.p.p.p.p.a.p.h.p.h.p.d.a.y.d.y.y.8.6.8.8.c.l.8.4.4.c.8.l.c.c.c.4.8.c.c.c.v.n.o.n.8.i.8.' 2.0.N C < ", +" & Y 2 = = & & $ s d n l ..... .:.<.3.<.3.y.$.$.3.3.7.7.3.5.4.5.5.5.5.5.5.7.7.7.4.6.7.7.7.6.7.6.y.7.7.6.7.6.7.4.5.7.7.5.7.7.7.u.5.6.3.7.6.5.7.5.6.6.7.6.6.3.4.3.7.7.5.7.5.4.7.4.3.5.4.3.5.5.5.u.6.6.6.8.6.6.6.6.6.4.8.8.8.6.7.3.4.7.5.5.4.4.7.6.6.6.5.7.6.6.6.8.z.4.c.8.c.c.8.8.8.4.8.l.c.8.c.c.c.c.c.>.c.n.8.8.' 2.-.B V ; ", +" - R 8 = & # & X , a f { ~ ^ ..| ..<.3.<.<.3.5.3.3.3.$.3.5.5.5.5.5.4.5.5.5.5.5.7.6.5.4.4.4.7.7.5.5.6.7.7.6.7.6.6.5.u.5.5.4.5.5.5.5.6.7.3.5.5.6.5.5.5.5.5.5.6.3.4.5.5.5.5.5.5.5.6.$.5.5.5.$.5.5.5.3.y.7.6.8.6.6.6.6.8.6.6.6.6.5.5.6.5.6.5.5.7.4.6.5.5.6.5.5.6.4.6.4.6.4.8.4.n.4.c.8.l.4.c.4.4.8.l.c.c.n.A.:.8.i.7.8.' 2.0.N V O ", +" - Y e = = & & & X + a d [ ~ .X.....5.3.3.3.<.5.5.<.3.5.5.3.3.3.4.5.5.3.&.u.4.5.7.6.5.3.7.7.7.5.6.7.7.6.7.4.7.5.u.6.5.4.7.5.4.5.7.6.5.6.7.4.5.5.&.5.4.&.5.5.5.7.3.4.5.7.3.5.$.&.5.4.5.5.5.5.5.3.&.&.6.6.6.6.6.8.6.u.6.6.6.&.5.5.&.4.4.6.$.5.5.4.5.6.$.6.4.4.4.4.6.6.4.4.8.4.4.8.4.4.8.c.4.c.c.c.c.c.c.c.c.@.n.n.5.8.' 7.9.N w & ", +" 2 U w = & & & % o . y d ~ ~ .....X.$.>.>.5.5.3.3.<.3.3.5.5.5.5.5.5.6.5.6.5.7.4.6.6.5.7.7.7.7.6.4.5.5.7.4.7.7.6.6.5.6.6.5.6.6.5.&.5.4.4.5.5.5.4.5.5.5.5.5.5.$.5.$.5.5.5.5.5.5.5.5.5.5.4.5.$.&.5.&.3.5.4.6.6.6.6.6.6.6.6.6.4.5.6.&.4.5.&.5.6.&.6.5.5.5.3.4.4.4.6.6.6.6.8.8.4.8.l.4.c.8.c.l.4.c.c.c.c.c.c.c.@.8.c.8.7.) <.-.F w o ", +" 6 J 8 = & = & & X + V f n ~ .......3.5.3.5.5.5.3.$.3.3.$.5.5.5.5.4.5.6.5.6.4.5.5.5.$.4.3.4.3.7.5.6.6.4.5.5.3.5.4.u.6.5.5.6.5.6.6.5.&.5.7.4.6.4.6.4.6.5.5.5.6.4.5.4.4.6.5.$.$.5.4.&.5.5.5.5.5.5.5.3.7.4.6.6.6.4.6.6.6.6.4.6.&.6.4.4.4.6.$.5.6.$.6.5.$.3.3.7.6.4.4.6.4.4.4.c.4.8.8.8.l.4.c.c.c.4.c.c.c.c.z.@.i.i.3.7.) 2.*.N t O ", +" 6 J e = & & & % % & + m d [ ~ ...| ..<.$.<.$.y.5.5.3.5.3.3.y.$.5.5.5.5.4.7.4.6.5.6.5.5.&.5.5.6.u.5.6.5.5.5.&.5.5.6.6.5.4.6.5.6.5.6.5.u.6.6.6.5.6.6.5.4.4.$.5.5.6.4.4.4.4.5.5.4.5.5.5.5.5.5.3.&.&.5.$.5.5.6.6.&.6.6.6.6.6.6.6.4.6.4.4.4.4.&.5.4.4.4.3.3.5.4.5.4.4.6.6.8.c.4.l.8.l.4.c.c.4.c.c.4.c.4.c.c.c.z.@.8.i.6.7.^ 1.[ F 0 o ", +" 8 E 2 = = & % & + & O o 1 x [ ~ .X.| @.3.3.3.<.3.&.5.3.$.3.3.3.3.5.5.5.5.5.5.6.5.5.5.4.5.5.5.6.5.&.6.5.5.5.4.6.6.6.6.5.u.5.7.5.6.5.u.6.6.6.6.6.6.6.6.4.4.6.6.5.4.&.5.4.5.4.5.5.$.4.4.5.3.$.5.5.$.3.6.5.5.5.4.6.4.4.&.6.6.4.6.6.6.4.4.4.4.6.5.4.4.6.4.4.4.4.5.6.4.4.4.4.4.4.8.8.4.4.c.4.c.c.4.4.c.8.l.c.c.c.8.:.8.8.3.5.^ <.[ C 7 ", +" r 6Xw = = & & & & = & o 1 d [ / .X...@.<.<.$.3.3.3.7.$.5.$.$.$.$.$.5.5.5.7.5.5.4.6.&.5.7.5.5.5.6.5.6.5.6.6.5.6.6.6.6.4.6.4.6.6.5.6.5.6.6.6.&.6.6.6.6.6.7.6.6.6.6.5.4.4.5.5.4.4.4.$.6.&.3.5.$.5.5.3.5.$.6.5.5.6.6.%.6.6.6.4.4.6.l.8.4.6.4.4.5.6.6.6.6.6.6.4.5.4.6.4.8.l.4.l.4.l.8.c.4.4.4.c.8.c.l.4.n.4.c.z.8.' Z.u.3.$.^ :.n /.r ", +" 9 6Xe = & # & # & ; & O o 1 f [ ~ .@.+...5.3.<.3.$.5.5.5.$.3.<.y.$.5.5.6.$.5.6.5.7.5.u.5.4.5.6.6.5.6.5.6.5.5.6.5.6.&.6.6.6.u.6.6.6.6.6.4.6.5.6.6.6.6.4.4.5.4.6.6.&.6.4.6.4.&.5.6.4.6.$.3.3.$.5.5.$.5.5.5.$.4.4.4.4.6.4.z.6.4.l.6.6.4.6.6.4.6.6.6.4.4.4.6.4.5.4.4.6.4.4.8.6.8.4.4.8.8.4.c.c.l.l.c.4.c.c.c.c.c.7.:.s.6.7.>.^ :.n S ; ", +" X e W J = & & & & = - & X o 3 s [ ^ . .@.:.3.3.3.<.3.5.5.$.5.$.#.#.3.$.3.5.3.$.6.5.5.6.5.7.3.&.u.4.5.5.6.5.6.6.5.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.4.6.6.&.4.6.6.4.4.5.4.&.5.5.5.5.5.5.4.6.5.$.5.&.5.4.4.4.6.4.8.6.z.z.4.4.8.8.4.4.4.4.4.6.6.8.4.4.4.4.z.6.6.6.6.4.8.c.4.4.8.4.c.8.c.l.8.c.c.c.c.z.4.:.Z.7.6.,.~ ,.b P & ", +" # Y W = & # & - = = O o V f n ~ .X.@.@.3.<.3.3.3.5.5.6.5.y.$.y.3.3.3.3.5.5.7.5.&.&.6.5.&.5.5.6.5.6.5.6.4.$.6.5.5.6.6.7.4.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.&.6.4.6.4.6.7.6.6.3.5.4.4.4.&.4.$.5.$.5.5.4.3.4.4.4.6.4.5.6.6.6.8.4.l.4.4.4.4.8.8.6.4.6.4.4.4.6.6.4.6.4.6.4.4.4.4.4.4.c.4.c.4.c.c.c.c.4.c.l.c.>...Z.8.8.@.^ ;.B S & ", +" O Q 2X2 & & & ; = & o , s [ ^ . .>.+.<.3.<.<.$.5.5.5.$.$.$.$.3.3.3.3.3.4.$.5.5.5.5.4.6.5.6.6.5.5.6.6.6.6.6.6.4.4.6.5.4.6.4.6.5.6.6.6.6.6.4.6.u.6.6.6.6.7.4.6.6.6.6.6.4.4.6.6.5.4.4.$.4.3.4.4.5.5.$.$.6.4.4.&.4.5.5.4.6.6.6.6.6.4.4.4.4.6.z.6.8.z.8.4.8.8.6.6.6.6.6.4.l.4.4.4.4.4.c.4.4.c.c.l.4.c.c.c.c.c.#.@.Z.i.i.` . .B T & ", +" r 8XQ J & & & ; * O $ f n ^ . .<.@.<.3.3.3.$.$.5.6.u.3.$.<.3.<.3.5.5.5.5.$.$.5.5.5.4.4.4.4.&.6.6.6.6.$.6.4.5.6.5.6.6.&.6.5.6.6.5.4.6.6.6.6.6.4.7.8.6.6.6.6.6.6.4.6.6.4.6.6.6.4.4.4.4.4.5.5.%.$.5.5.$.5.5.5.$.4.4.4.4.4.6.6.4.4.8.8.4.6.&.6.8.8.4.4.4.4.6.6.6.6.6.6.6.8.4.4.8.4.c.c.l.4.c.8.c.n.c.c.c.c.@.>.8.i.8.! @.[ D V ", +" O Y U U = & = - & X o a ] ] .} <.@.:.4.3.3.$.5.5.$.&.3.3.<.3.3.3.>.3.3.3.$.3.3.3.5.4.4.4.6.4.6.4.6.6.4.6.5.5.4.6.&.6.4.5.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.4.6.6.7.4.8.4.4.6.4.4.4.4.3.$.$.5.$.4.$.5.3.4.$.4.4.4.4.4.4.4.4.4.4.3.4.4.4.7.4.6.6.4.4.8.8.4.l.4.6.l.c.4.%.c.4.4.c.4.c.8.c.8.c.c.c.c.c...5.i.i.3.~ ,.b B $ ", +" 6 E E A ; - & + X 1 v ^ } .X.#.@.3.>.3.3.$.5.6.5.3.<.3.<.3.3.3.3.3.3.3.3.3.$.$.5.5.5.5.6.6.5.5.6.4.6.6.6.4.5.4.5.4.7.5.4.4.&.4.6.4.4.6.6.4.6.6.6.6.6.6.7.6.6.6.6.6.6.4.4.6.4.4.4.4.7.4.4.5.5.5.5.5.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.6.6.4.4.4.4.8.6.4.4.4.4.4.4.c.c.4.l.4.l.4.c.c.x.c.c.6...i.M.i.@.^ ,.x a ", +" * Y R U 2 - # X 1 v ^ .^ .$.+.>.3.<.3.$.5.5.5.3.<.<.3.5.5.3.3.3.$.4.3.3.$.3.3.$.5.3.3.5.5.5.6.6.6.6.&.&.5.5.4.3.4.5.6.7.4.&.4.5.4.6.6.4.6.6.4.6.6.6.6.6.4.4.6.4.4.4.4.6.8.4.4.4.4.4.5.5.$.$.6.4.3.4.3.4.$.3.4.4.4.4.4.4.4.4.3.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.6.4.4.4.c.4.l.c.4.c.4.l.c.c.l.c.c.#.@.8.i.M.} .. .b 1 ", +" o 6 t U e * & X @ c ] ] . .,.@.:.3.>.5.5.5.$.3.$.$.$.3.5.3.$.3.3.3.$.#.$.<.3.3.5.3.5.4.3.3.&.$.$.6.6.$.4.4.4.5.&.5.5.4.5.5.5.3.5.5.&.5.7.4.5.4.6.5.4.4.4.4.4.4.4.7.4.4.4.6.4.4.6.4.4.$.6.$.5.$.$.4.4.$.4.3.4.3.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.c.c.4.c.4.4.c.4.c.4.c.c.8.c.c.o.5.M.i.6.) <.{ c @ ", +" . t J * * X s . . .{ :.#.' :.3.>.3.5.3.3.$.3.<.3.>.3.$.3.$.3.$.$.3.$.>.3.$.5.3.5.5.$.$.y.5.5.5.5.5.4.5.5.5.4.5.4.5.4.3.3.$.6.6.4.4.6.4.4.4.$.4.5.4.4.4.3.4.4.4.4.4.4.4.4.4.5.4.$.4.4.$.4.4.4.$.4.$.4.4.4.4.4.3.4.4.3.4.3.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.c.4.c.4.c.l.4.c.4.l.c.z.c.c.3.#.z.i.i.<._ <.| *.. ", +" O J t 8 a ] .( ( { >.o.' #.>.5.$.$.3.>.>.3.3.3.3.$.3.3.3.3.3.>.3.$.4.$.3.3.3.3.3.3.$.$.5.5.5.5.$.5.$.$.5.$.$.3.3.4.3.&.4.4.6.4.5.5.&.$.4.$.&.5.3.4.4.4.4.3.4.3.3.4.3.4.4.$.4.$.5.5.4.4.5.5.4.4.3.3.4.4.3.4.4.4.O.4.4.3.4.4.3.4.3.4.4.4.4.4.4.4.3.4.3.4.4.4.4.c.c.4.c.4.c.c.4.8.l.4.' 5.i.8.8...:... .1 ", +" - J - : n { ` ] ^ ;.6.o._ #.$.$.$.3.3.3.3.3.3.3.3.$.3.$.3.>.3.3.3.>.3.3.3.3.$.3.3.3.5.$.3.$.$.5.5.$.3.$.3.3.3.8.4.4.5.$.4.$.$.5.4.5.6.&.$.4.%.4.4.3.4.3.4.3.4.4.4.4.5.$.&.$.4.4.5.$.&.5.4.5.$.4.4.$.$.4.3.4.4.4.3.4.4.3.4.4.4.3.4.3.4.3.3.3.3.4.$.4.%.3.4.4.c.4.4.8.4.c.c.4.8.>.' >.8.7.6.<._ <.' j . ", +" + v ^ ) ` ( ^ :.3.o.` #.$.$.<.3.>.3.$.$.$.3.3.3.3.$.3.3.$.$.3.$.$.$.3.3.3.3.3.5.$.$.3.3.$.5.5.3.$.3.4.4.3.3.3.5.$.5.5.5.&.3.4.$.5.3.4.3.4.3.5.3.4.3.4.4.$.3.4.$.5.5.4.5.$.$.4.3.$.5.%.4.3.4.3.4.$.$.4.4.3.3.4.4.4.%.3.4.3.4.4.4.4.4.4.$.4.$.4.3.4.4.c.4.4.c.l.c.4.l.4.o.` >.8.6.7.5...:.:.[ : ", +" + B ] ( .^ ] / :.7.$._ o.#.>.>.$.$.$.3.3.3.$.3.$.3.$.3.$.4.$.$.$.$.3.3.3.5.3.$.3.<.$.3.$.3.3.3.3.4.3.3.3.3.4.3.$.3.3.3.3.$.3.5.$.%.3.3.4.$.4.4.3.3.4.4.3.3.3.3.3.4.$.3.4.$.4.3.4.4.$.3.$.4.3.O.3.3.4.4.4.4.4.3.4.4.$.4.3.4.4.4.4.3.$.4.$.4.$.3.3.4.4.4.4.4.8.8.4.>.' ' 3.8.7.7.3.' ' 5. .M ", +" O D ^ ^ ` ^ ^ ~ ~ ..<.4.o._ ' o.@.#.#.#.$.$.$.$.>.$.#.#.>.$.o.>.>.#.#.#.#.>.>.$.$.$.#.#.$.>.$.#.$.#.>.$.$.>.$.$.3.$.#.$.$.3.$.5.$.$.$.$.3.$.3.$.$.$.$.$.#.3.O.4.O.$.$.$.$.3.4.4.$.$.>.$.3.$.$.$.4.3.4.$.$.3.O.4.$.4.4.4.4.3.3.4.3.%.5.&.$.$.3.4.4.3.4.3.4.3.>.#.' ' $.3.4.3.3.<...' <.;.u o ", +" V ^ ! ] ] ^ ^ / { .@.>.3.>.o.' _ _ ` _ _ ` ' _ ' _ _ ) ) ) ) _ ) ) ) ) ) ) ) ) ) ) _ ) _ _ _ ' o.o.o.o.o.o.@.#.O.o.@.o.#.o.#.#.#.#.O.O.$.#.O.#.#.#.#.o.O.#.#.o.o.O.o.>.#.#.#.O.#.O.>.O.>.O.#.$.O.>.o.$.$.$.$.$.$.$.$.$.$.>.$.$.3.3.3.3.3.3.O.#.o.' o.` ' ) @.>.8.8.5.3.3.#.) ' 7.;.1 ", +" + N ! k ^ ] / ( { ( ( ` @.<.3.3.$.3.#.#.#.#.@.o.@.@.@.@.#.#.#.#.@.#.@.#.@.@.@.@.@.@.' ' _ ' ' ) ) ) ) ) ` ^ ) ) ) ! ) ) ) ^ ) ) ) ! ) ) _ ) ) ) ) ) _ _ ' ' ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ` ) ) ' ) ` ) ) ) ) ) ) ) _ ) _ ) ) ) _ ) _ ) ( ) ' ' ' @.>.4.8.5.4.5.>.:.` ) @.7.r.a ", +" > ] l ~ ^ ` ` ( { ` ( { ...:.>.$.#.>.>.3.>.>.>.:.>.:.>.<.>.>.:.#.#.>.>.>.@.#.>.:.>.>.>.<.3.>.>.>.>.>.>.3.>.>.3.>.>.#.#.#.3.<.5.<.>.3.5.5.4.3.6.8.8.8.8.4.3.>.3.>.>.3.>.3.>.>.>.>.#.#.#.@.>.:.o.>.:.>.#.>.:.>.>.>.>.>.>.>.>.>.>.>.#.3.3.5.3.3.7.3.3.<.<.<.<.>.:.' ' ` ..:.5.*.a + ", +" u ] ~ ! ( ` ` ` ( ( ( ( { ( ` ` ..@.@.>.>.>.>.3.3.3.4.3.4.3.3.4.3.3.3.<.3.3.3.3.3.>.>.>.>.>.>.>.>.>.>.>.#.#.:.#.:.@.@.>.7.7.7.6.4.6.6.6.8.7.6.7.8.7.8.7.3.>.>.>.3.>.>.3.3.>.3.5.3.4.5.5.5.3.5.5.3.3.7.7.7.7.7.7.4.7.3.4.5.5.3.3.3.<.<.<.>.:...' ' ' ' ' ' .` ' :.<.7.1.x @ ", +" . x ] ] ~ / ( *.^ ( ( ( ( ~ ~ ~ ~ ~ ^ / ^ / ^ ^ ` ;.;...' ;.@.:.#.#.#.#.#.>.>.3.3.3.>.3.3.3.3.3.3.3.3.5.3.3.4.3.3.5.3.>.$.<.3.3.>.<.3.3.3.3.3.3.3.4.3.>.3.3.4.5.3.3.>.>.3.3.3.3.3.3.4.>.>.>.3.3.3.3.<.<.<.<.>.>.:.>.:.:.:.:... . .] ~ ! ~ ~ ^ ^ . ...:.>.:.:.1.<.;.9.V o ", +" . a [ ` ! ! ~ ~ ~ ^ ~ ~ ~ l l ~ k h g g g g p g g g g k l l ~ ~ n ~ ~ ~ ( ( ( ( . ...' ;.' ....@.@.@.@.@.:.:.>.:.>.#.<.#.:.>.<.>.>.<.1.>.:.:.:. . .;.:.:.1.:.,.,.;.{ ;...;...;.;. .;.;.;.*.*.{ { ( ( / / / / / ~ ( / ^ ] ^ ^ . . .......;.:.@.:.:.;.;.0.-.9.F 1 . ", +" > c [ ` ^ ~ l l k h l h g h g h g k k k k k k l k k g g j j c j j j d x d d f x f d f x x x x j x c c b b k b k b b k v b b b b c c c c x x f f f D D x D D M f C M M C N C C C f C C M C f C f M f s s s s s i y y y y y p p p p p j u u y u > u a 1 1 # o ", +" . > s b =.[ { { ^ ^ ~ { ~ [ n n v v c x f f f f a a a a a a a V 1 V a 1 , : , a C C a 1 1 a 1 a a 1 1 1 1 1 1 1 1 1 1 1 : : : : : : : : , $ @ $ $ @ @ @ @ @ @ @ + + + @ @ @ @ . . . . . X X . X o o o o . ", +" X @ , > > a a a a 1 1 a 1 : : , : + . X + . . X o o . o . o . ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/media/sound/sfx/death_screen.wav b/media/sound/sfx/death_screen.wav Binary files differindex 61cf33d..5ee6f4d 100644 --- a/media/sound/sfx/death_screen.wav +++ b/media/sound/sfx/death_screen.wav diff --git a/media/sound/sfx/footstep_one.wav b/media/sound/sfx/footstep_one.wav Binary files differnew file mode 100644 index 0000000..898363e --- /dev/null +++ b/media/sound/sfx/footstep_one.wav diff --git a/media/sound/sfx/footstep_two.wav b/media/sound/sfx/footstep_two.wav Binary files differnew file mode 100644 index 0000000..01781e1 --- /dev/null +++ b/media/sound/sfx/footstep_two.wav diff --git a/media/sound/sfx/next_lvl.wav b/media/sound/sfx/next_lvl.wav Binary files differindex 64cbc31..2b73389 100644 --- a/media/sound/sfx/next_lvl.wav +++ b/media/sound/sfx/next_lvl.wav diff --git a/media/sound/sfx/scream_one.wav b/media/sound/sfx/scream_one.wav Binary files differindex df9fc78..0bdab05 100644 --- a/media/sound/sfx/scream_one.wav +++ b/media/sound/sfx/scream_one.wav diff --git a/media/sound/sfx/scream_two.wav b/media/sound/sfx/scream_two.wav Binary files differindex 1d4ff78..3ccb161 100644 --- a/media/sound/sfx/scream_two.wav +++ b/media/sound/sfx/scream_two.wav diff --git a/media/sound/sfx/trap.wav b/media/sound/sfx/trap.wav Binary files differindex 7d237e5..ae41e07 100644 --- a/media/sound/sfx/trap.wav +++ b/media/sound/sfx/trap.wav diff --git a/src/ft_check_map_line.c b/src/ft_check_map_line.c index b9fd636..50464a9 100644 --- a/src/ft_check_map_line.c +++ b/src/ft_check_map_line.c @@ -37,8 +37,8 @@ static int8_t ft_sprintf(clist->errmsg, FT_ERR_MULT_NLVL); return (-1); } - if (line[i] == 'T') - clist->mlist.istraps = 1; + clist->mlist.istraps = (line[i] == 'T') ? (1) : (clist->mlist.istraps); + clist->mlist.isheals = (line[i] == '+') ? (1) : (clist->mlist.isheals); ft_get_topsp(line[i], clist); return (0); } diff --git a/src/ft_check_missing.c b/src/ft_check_missing.c index a17bdea..6bf41ab 100644 --- a/src/ft_check_missing.c +++ b/src/ft_check_missing.c @@ -14,15 +14,6 @@ #include <cub3d.h> #include <unistd.h> -int - ft_missing_error(const char *err, t_cub *clist) -{ - ft_dprintf(STDERR_FILENO, "Error\n"); - ft_dprintf(STDERR_FILENO, - "\033[1;31m%s %s\033[0m\n", FT_ERR_MISS_ELEMENT, err); - return (ft_exit(FT_ERR_MISSING, clist)); -} - static int ft_check_missing_sfx(t_cub *clist) { @@ -60,6 +51,21 @@ static int } static int + ft_check_missing_tex_defines(t_cub *clist) +{ + if (ft_check_not_found(FT_DEATH_SCREEN_PATH) < 0 || + ft_check_ext(FT_DEATH_SCREEN_PATH, ".xpm") < 0) + return (ft_missing_error(FT_ERR_MISS_DEATH_SCREEN, clist)); + if (ft_check_not_found(FT_HUD_BACK_PATH) < 0 || + ft_check_ext(FT_HUD_BACK_PATH, ".xpm") < 0) + return (ft_missing_error(FT_ERR_MISS_HUD_BACK, clist)); + if (ft_check_not_found(FT_HEAL_PACK_PATH) < 0 || + ft_check_ext(FT_HEAL_PACK_PATH, ".xpm") < 0) + return (ft_missing_error(FT_ERR_MISS_HEAL_PACK, clist)); + return (ft_check_missing_sprites(clist)); +} + +static int ft_check_missing_norme(t_cub *clist) { if (!clist->mlist.isftex) @@ -82,10 +88,7 @@ static int return (ft_missing_error(FT_ERR_MISS_NLVL_PATH, clist)); if (clist->mlist.istraps && !clist->mlist.traps_path[0]) return (ft_missing_error(FT_ERR_MISS_TRAP, clist)); - if (ft_check_not_found(FT_DEATH_SCREEN_PATH) < 0 || - ft_check_ext(FT_DEATH_SCREEN_PATH, ".xpm") < 0) - return (ft_missing_error(FT_ERR_MISS_DEATH_SCREEN, clist)); - return (ft_check_missing_sprites(clist)); + return (ft_check_missing_tex_defines(clist)); } int diff --git a/src/ft_death_screen.c b/src/ft_death_screen.c index cc299d1..55a61cb 100644 --- a/src/ft_death_screen.c +++ b/src/ft_death_screen.c @@ -25,10 +25,10 @@ static void while (y < (int32_t)cl->wlist.y_size) { x = 0; + cl->death_screen.tex_y = ((y * y_ratio) >> 16); while (x < (int32_t)cl->wlist.x_size) { cl->death_screen.tex_x = ((x * x_ratio) >> 16); - cl->death_screen.tex_y = ((y * y_ratio) >> 16); cl->img.ptr[x * 4 + (cl->img.sizeline * y)] = (uint8_t)cl->death_screen.ptr[cl->death_screen.tex_x * 4 + 4 * cl->death_screen.img_w * cl->death_screen.tex_y]; @@ -38,7 +38,6 @@ static void cl->img.ptr[x * 4 + (cl->img.sizeline * y) + 2] = (uint8_t)cl->death_screen.ptr[cl->death_screen.tex_x * 4 + 4 * cl->death_screen.img_w * cl->death_screen.tex_y + 2]; - cl->img.ptr[x * 4 + cl->wlist.x_size * y + 3] = (char)0; x++; } y++; diff --git a/src/ft_draw_heals.c b/src/ft_draw_heals.c new file mode 100644 index 0000000..bc1e1b2 --- /dev/null +++ b/src/ft_draw_heals.c @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_draw_heals.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/24 20:22:45 by rbousset #+# #+# */ +/* Updated: 2020/03/09 18:56:01 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <cub3d.h> +#include <stdint.h> +#include <stdlib.h> +#include <math.h> + +static void + ft_sort_heals_norme(float *dist_tab, int32_t it, t_cub *cl) +{ + uint32_t tmp; + + tmp = 0; + if (dist_tab[it] > dist_tab[it + 1]) + { + tmp = dist_tab[it]; + dist_tab[it] = dist_tab[it + 1]; + dist_tab[it + 1] = tmp; + tmp = cl->mlist.heals_order[it]; + cl->mlist.heals_order[it] = cl->mlist.heals_order[it + 1]; + cl->mlist.heals_order[it + 1] = tmp; + it = 0; + } +} + +void + ft_sort_heals(t_cub *cl) +{ + float dist_tab[4096]; + int32_t it; + + it = 0; + while (it < cl->mlist.heals_nbr) + { + dist_tab[it] = ((cl->plist.pos_x - cl->heals[it].s_pos_x) * + (cl->plist.pos_x - cl->heals[it].s_pos_x) + + (cl->plist.pos_y - cl->heals[it].s_pos_y) * + (cl->plist.pos_y - cl->heals[it].s_pos_y)); + cl->mlist.heals_order[it] = it; + it++; + } + it = 0; + while (it < cl->mlist.heals_nbr) + { + ft_sort_heals_norme(dist_tab, it, cl); + } +} + +static void + ft_put_heal(t_sprite *sprite, t_cub *cl) +{ + float dist; + float calc; + + if ((dist = cl->rlist.wall_dist_tab[sprite->x]) <= 0) + dist = 0.0001; + calc = (dist * 0.1 * cl->mlist.darklvl); + calc = (calc >= 255) ? (255) : (calc); + calc = (calc < 1) ? (1) : (calc); + cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline)] = + (uint8_t)cl->tlist[17].ptr[sprite->tex_x * 4 + 4 * + cl->tlist[17].img_h * sprite->tex_y] / calc; + cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 1] = + (uint8_t)cl->tlist[17].ptr[sprite->tex_x * 4 + 4 * + cl->tlist[17].img_h * sprite->tex_y + 1] / calc; + cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 2] = + (uint8_t)cl->tlist[17].ptr[sprite->tex_x * 4 + 4 * + cl->tlist[17].img_h * sprite->tex_y + 2] / calc; +} + +void + ft_draw_heals(t_cub *cl, t_sprite *sprite) +{ + int32_t d; + + sprite->x = sprite->drawstartx; + while (sprite->x < sprite->drawendx) + { + sprite->tex_x = (int32_t)((sprite->x - (-sprite->spritewidth / 2 + + sprite->spritescreenx)) + * cl->tlist[17].img_w / sprite->spritewidth); + sprite->y = sprite->drawstarty; + while (sprite->y < sprite->drawendy) + { + d = sprite->y * 256 - cl->wlist.y_size * 128 + + sprite->spriteheight * 128; + sprite->tex_y = ((d * cl->tlist[17].img_h / 2) / + sprite->spriteheight) / 128; + if (sprite->transformy > 0 + && cl->tlist[17].ptr[sprite->tex_x * 4 + 4 * + cl->tlist[17].img_h * sprite->tex_y] + && cl->rlist.wall_dist_tab[sprite->x] > sprite->transformy) + ft_put_heal(sprite, cl); + sprite->y++; + } + sprite->x++; + } +} diff --git a/src/ft_draw_heals_extra.c b/src/ft_draw_heals_extra.c new file mode 100644 index 0000000..62c64b0 --- /dev/null +++ b/src/ft_draw_heals_extra.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_draw_heals_extra.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/24 20:22:45 by rbousset #+# #+# */ +/* Updated: 2020/03/09 18:56:01 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <cub3d.h> +#include <stdint.h> +#include <stdlib.h> +#include <math.h> + +void + ft_calc_heal(t_cub *cl) +{ + t_sprite sprite; + int32_t i; + + i = 0; + while (i < cl->mlist.heals_nbr) + { + sprite = cl->heals[i]; + sprite.spritey = sprite.s_pos_x - (cl->plist.pos_x - 0.5); + sprite.spritex = sprite.s_pos_y - (cl->plist.pos_y - 0.5); + sprite.invdet = 1.0 / (cl->plist.plane_x * cl->plist.dir_y + - cl->plist.dir_x * cl->plist.plane_y); + sprite.transformx = sprite.invdet * (cl->plist.dir_y * sprite.spritex + - cl->plist.dir_x * sprite.spritey); + sprite.transformy = sprite.invdet * (-cl->plist.plane_y * sprite.spritex + + cl->plist.plane_x * sprite.spritey); + sprite.spritescreenx = (int)(cl->wlist.x_size / 2) * + (1 + sprite.transformx / sprite.transformy); + ft_sprite_h_w(cl, &sprite); + ft_draw_heals(cl, &sprite); + i++; + } +} diff --git a/src/ft_draw_hud.c b/src/ft_draw_hud.c index eb329c6..121e85e 100644 --- a/src/ft_draw_hud.c +++ b/src/ft_draw_hud.c @@ -14,31 +14,44 @@ #include <stdint.h> static void - ft_draw_life_back(t_win *wl, t_cub *cl) + ft_put_image_back_to_ptr(uint16_t y, uint16_t x, t_cub *cl) { - const uint16_t scl = cl->mlist.scale; - uint32_t x; - uint32_t y; - int32_t col; + const uint32_t col = 0x00d2d4d6; - col = 0x00353535; - x = (cl->mlist.map_w * scl) + 20; - y = wl->y_size - (cl->mlist.map_h * scl) - 20; - while (x < ((cl->mlist.map_w * scl) + 20) + (3 * scl)) + *(cl->img.ptr + x * 4 + (cl->img.sizeline * y)) = + (uint8_t)*(cl->tlist[16].ptr + cl->tlist[16].tex_x * 4 + 4 * + cl->tlist[16].img_w * cl->tlist[16].tex_y) & col; + *(cl->img.ptr + x * 4 + (cl->img.sizeline * y) + 1) = + (uint8_t)*(cl->tlist[16].ptr + cl->tlist[16].tex_x * 4 + 4 * + cl->tlist[16].img_w * cl->tlist[16].tex_y + 1) & col; + *(cl->img.ptr + x * 4 + (cl->img.sizeline * y) + 2) = + (uint8_t)*(cl->tlist[16].ptr + cl->tlist[16].tex_x * 4 + 4 * + cl->tlist[16].img_w * cl->tlist[16].tex_y + 2) & col; +} + +static void + ft_draw_minimap_back_image(uint16_t h, uint16_t w, t_cub *cl) +{ + int32_t x_ratio; + int32_t y_ratio; + int16_t x; + int16_t y; + + x_ratio = (int)((cl->tlist[16].img_w << 16) / w) + 1; + y_ratio = (int)((cl->tlist[16].img_h << 16) / h) + 1; + y = cl->wlist.y_size - (cl->mlist.map_h * cl->mlist.scale) - 20; + while (y < (int32_t)cl->wlist.y_size) { - while (y < wl->y_size) + x = 0; + cl->tlist[16].tex_y = (y * y_ratio) >> 16; + while (x < (uint16_t)((cl->mlist.map_w + * cl->mlist.scale) + 20 + (3 * cl->mlist.scale))) { - *(int*)(cl->img.ptr + (x * 4 + (y * cl->img.sizeline))) = col; - if (!(y % 3)) - { - if (col < 0x00aaaaaa) - col += 0x00010101; - } - y++; + cl->tlist[16].tex_x = (x * x_ratio) >> 16; + ft_put_image_back_to_ptr(y, x, cl); + x++; } - col = 0x00353535; - y = wl->y_size - (cl->mlist.map_h * scl) - 20; - x++; + y++; } } @@ -46,29 +59,18 @@ static void ft_draw_minimap_back(size_t map_h, size_t map_w, t_win *wl, t_cub *cl) { const uint16_t scl = cl->mlist.scale; - uint32_t x; - uint32_t y; - int32_t col; + uint16_t x; + uint16_t y; - col = 0x00353535; x = 0; y = wl->y_size - (map_h * scl) - 20; - while (x < (map_w * scl) + 20) + while (x < (map_w * scl) + 20 + (3 * scl)) { while (y < wl->y_size) - { - *(int*)(cl->img.ptr + (x * 4 + (y * cl->img.sizeline))) = col; - if (!(y % 3)) - { - if (col < 0x00aaaaaa) - col += 0x00010101; - } y++; - } - col = 0x00353535; - y = wl->y_size - (map_h * scl) - 20; x++; } + ft_draw_minimap_back_image(y, x, cl); } static void @@ -107,7 +109,6 @@ int8_t ft_draw_minimap_back(clist->mlist.map_h, clist->mlist.map_w, &clist->wlist, clist); ft_draw_map(clist->mlist.map, clist); - ft_draw_life_back(&clist->wlist, clist); ft_draw_life_bar(&clist->wlist, clist); if (clist->mlist.isnlvl) { diff --git a/src/ft_draw_map.c b/src/ft_draw_map.c index 5d37566..286f69d 100644 --- a/src/ft_draw_map.c +++ b/src/ft_draw_map.c @@ -31,7 +31,7 @@ static void ft_draw_circle( (scale / 2) + (x * (scale)), - ft_y_offset(clist) - (scale) + (y * (scale)), + ft_y_offset(clist) - (scale + 9) + (y * (scale)), 0x009843fa, clist); } @@ -52,7 +52,7 @@ void if (ft_ischarset("1", map[y][x])) ft_draw_square(scale + 9 + (x * (scale)), ft_y_offset(clist) - 9 + (y * (scale)), 0x00ca5422, clist); - else if (map[y][x] == '2') + else if (ft_ischarset(FT_CHRST_SPRITES, map[y][x])) ft_draw_square(scale + 9 + (x * (scale)), ft_y_offset(clist) - 9 + (y * (scale)), 0x0033ccff, clist); else if (ft_ischarset(FT_CHRST_MAP_NON_WALL, map[y][x])) diff --git a/src/ft_draw_scene.c b/src/ft_draw_scene.c index 1edef2a..86009f6 100644 --- a/src/ft_draw_scene.c +++ b/src/ft_draw_scene.c @@ -13,8 +13,19 @@ #include <libft.h> #include <cub3d.h> #include <mlx.h> +#include <stdlib.h> #include <stdint.h> +static void + ft_put_fps(t_cub *clist) +{ + mlx_string_put(clist->wlist.wlx, + clist->wlist.winptr, + 10, 20, + 0x00eeeeee, + clist->fps_count); +} + static int8_t ft_put_stage(t_cub *clist) { @@ -34,7 +45,7 @@ static int8_t (uint32_t)x, y, 0x002288da, str); - ft_memdel((void**)&str); + ft_memdel((void*)&str); return (0); } @@ -60,9 +71,12 @@ void clist->wlist.winptr, clist->img.img, 0, 0); if (FT_OS == 2) mlx_destroy_image(clist->wlist.wlx, clist->img.img); - if (clist->ishud && clist->mlist.isnlvl) - if (ft_put_stage(clist) < 0) + if (clist->ishud) + { + ft_put_fps(clist); + if (clist->mlist.isnlvl && ft_put_stage(clist) < 0) ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, clist); + } } void diff --git a/src/ft_draw_sprite.c b/src/ft_draw_sprite.c index cb9a573..5fc28d3 100644 --- a/src/ft_draw_sprite.c +++ b/src/ft_draw_sprite.c @@ -85,7 +85,6 @@ static void cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 2] = (uint8_t)cl->tlist[sprite->current_sprite].ptr[sprite->tex_x * 4 + 4 * cl->tlist[sprite->current_sprite].img_h * sprite->tex_y + 2] / calc; - cl->img.ptr[sprite->x * 4 + cl->wlist.x_size * sprite->y + 3] = (char)0; } void diff --git a/src/ft_draw_textures.c b/src/ft_draw_textures.c index 5fc3bdd..dcd36e7 100644 --- a/src/ft_draw_textures.c +++ b/src/ft_draw_textures.c @@ -41,7 +41,6 @@ void ft_draw_texture(t_cub *cl, int x, int y, int tex_y) cl->img.ptr[x * 4 + (cl->img.sizeline * y) + 2] = (uint8_t)cl->tlist[cl->w_side].ptr[cl->tlist[cl->w_side].tex_x * 4 + 4 * cl->tlist[cl->w_side].img_h * tex_y + 2] / calc; - cl->img.ptr[x * 4 + cl->wlist.x_size * y + 3] = (char)0; } void ft_choose_tex(t_cub *clist) diff --git a/src/ft_draw_traps.c b/src/ft_draw_traps.c index f1acc20..71e8fe8 100644 --- a/src/ft_draw_traps.c +++ b/src/ft_draw_traps.c @@ -77,7 +77,6 @@ static void cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 2] = (uint8_t)cl->tlist[15].ptr[sprite->tex_x * 4 + 4 * cl->tlist[15].img_h * sprite->tex_y + 2] / calc; - cl->img.ptr[sprite->x * 4 + cl->wlist.x_size * sprite->y + 3] = (char)0; } void diff --git a/src/ft_error.c b/src/ft_error.c index 87be01e..0f2bc97 100644 --- a/src/ft_error.c +++ b/src/ft_error.c @@ -34,3 +34,12 @@ int errmsg); return (ft_exit(FT_RET_MAP_ERR, clist)); } + +int + ft_missing_error(const char *err, t_cub *clist) +{ + ft_dprintf(STDERR_FILENO, "Error\n"); + ft_dprintf(STDERR_FILENO, + "\033[1;31m%s %s\033[0m\n", FT_ERR_MISS_ELEMENT, err); + return (ft_exit(FT_ERR_MISSING, clist)); +} diff --git a/src/ft_exit.c b/src/ft_exit.c index 80fd734..390f234 100644 --- a/src/ft_exit.c +++ b/src/ft_exit.c @@ -15,39 +15,52 @@ #include <mlx.h> #include <stddef.h> #include <stdlib.h> -#include <signal.h> -#include <sys/types.h> -#include <sys/wait.h> #include <stdint.h> +#include <pthread.h> + +static void + ft_free_some_extras(t_cub *clist) +{ + uint8_t i; + + i = 0; + while (i < 8) + { + ft_memdel((void*)&clist->sprites[i]); + i++; + } + ft_memdel((void*)&clist->sprites); + ft_memdel((void*)&clist); +} static void ft_free_lists(t_cub *clist) { - ft_memdel((void**)&clist->mlist.filename); - ft_memdel((void**)&clist->mlist.no_tex_path); - ft_memdel((void**)&clist->mlist.so_tex_path); - ft_memdel((void**)&clist->mlist.ea_tex_path); - ft_memdel((void**)&clist->mlist.we_tex_path); - ft_memdel((void**)&clist->mlist.nl_tex_path); - ft_memdel((void**)&clist->mlist.fl_tex_path); - ft_memdel((void**)&clist->mlist.ce_tex_path); - ft_memdel((void**)&clist->mlist.nlevel_path); - ft_memdel((void**)&clist->mlist.skybox_path); - ft_memdel((void**)&clist->mlist.traps_path); - ft_memdel((void**)&clist->mlist.music_path); - ft_memdel((void**)&clist->mlist.music_cmd); - ft_memdel((void**)&clist->mlist.mapl); + ft_memdel((void*)&clist->mlist.filename); + ft_memdel((void*)&clist->mlist.no_tex_path); + ft_memdel((void*)&clist->mlist.so_tex_path); + ft_memdel((void*)&clist->mlist.ea_tex_path); + ft_memdel((void*)&clist->mlist.we_tex_path); + ft_memdel((void*)&clist->mlist.nl_tex_path); + ft_memdel((void*)&clist->mlist.fl_tex_path); + ft_memdel((void*)&clist->mlist.ce_tex_path); + ft_memdel((void*)&clist->mlist.nlevel_path); + ft_memdel((void*)&clist->mlist.skybox_path); + ft_memdel((void*)&clist->mlist.traps_path); + ft_memdel((void*)&clist->mlist.music_path); + ft_memdel((void*)&clist->mlist.music_cmd); + ft_memdel((void*)&clist->mlist.mapl); ft_free_words(clist->mlist.map); - ft_free_words(clist->mlist.mcmd_words); - ft_free_words(clist->sfx.death); - ft_free_words(clist->sfx.pain_one); - ft_free_words(clist->sfx.pain_two); - ft_free_words(clist->sfx.new_lvl); - ft_free_words(clist->sfx.trap); + ft_memdel((void*)&clist->sfx.death); + ft_memdel((void*)&clist->sfx.footstep_one); + ft_memdel((void*)&clist->sfx.footstep_two); + ft_memdel((void*)&clist->sfx.new_lvl); + ft_memdel((void*)&clist->sfx.pain_one); + ft_memdel((void*)&clist->sfx.pain_two); + ft_memdel((void*)&clist->sfx.trap); ft_free_sprites(clist->mlist.sprite_path); if (!clist->wlist.inited) - ft_memdel((void**)&clist->wlist.winptr); - ft_memdel((void**)&clist); + ft_memdel((void*)&clist->wlist.winptr); } static void @@ -71,29 +84,36 @@ static void mlx_destroy_image(clist->wlist.wlx, clist->tlist[7].img); if (clist->mlist.istraps && clist->tlist[15].img) mlx_destroy_image(clist->wlist.wlx, clist->tlist[15].img); + if (clist->tlist[16].img) + mlx_destroy_image(clist->wlist.wlx, clist->tlist[16].img); + if (clist->mlist.isheals && clist->tlist[17].img) + mlx_destroy_image(clist->wlist.wlx, clist->tlist[17].img); ft_del_extra_sprites(clist); } static void - ft_kill_forks(t_cub *clist) + ft_cancel_threads(t_cub *clist) { - pid_t tmp; - - if (!(tmp = waitpid(clist->mpid, NULL, WNOHANG))) - kill(clist->mpid, SIGTERM); - wait(&clist->mpid); - if (!(tmp = waitpid(clist->sfx.death_pid, NULL, WNOHANG))) - kill(clist->sfx.death_pid, SIGTERM); - wait(&clist->sfx.death_pid); - if (!(tmp = waitpid(clist->sfx.new_lvl_pid, NULL, WNOHANG))) - kill(clist->sfx.new_lvl_pid, SIGTERM); - wait(&clist->sfx.new_lvl_pid); - if (!(tmp = waitpid(clist->sfx.pain_pid, NULL, WNOHANG))) - kill(clist->sfx.pain_pid, SIGTERM); - wait(&clist->sfx.pain_pid); - if (!(tmp = waitpid(clist->sfx.trap_pid, NULL, WNOHANG))) - kill(clist->sfx.trap_pid, SIGTERM); - wait(&clist->sfx.trap_pid); + if (clist->isoldmus && clist->wlist.inited) + { + pthread_cancel(clist->mtid); + pthread_join(clist->mtid, NULL); + } + pthread_mutex_unlock(&clist->sfx.death_mutex); + pthread_cancel(clist->sfx.death_tid); + pthread_join(clist->sfx.death_tid, NULL); + pthread_mutex_unlock(&clist->sfx.footstep_mutex); + pthread_cancel(clist->sfx.footstep_tid); + pthread_join(clist->sfx.footstep_tid, NULL); + pthread_mutex_unlock(&clist->sfx.new_lvl_mutex); + pthread_cancel(clist->sfx.new_lvl_tid); + pthread_join(clist->sfx.new_lvl_tid, NULL); + pthread_mutex_unlock(&clist->sfx.pain_mutex); + pthread_cancel(clist->sfx.pain_tid); + pthread_join(clist->sfx.pain_tid, NULL); + pthread_mutex_unlock(&clist->sfx.trap_mutex); + pthread_cancel(clist->sfx.trap_tid); + pthread_join(clist->sfx.trap_tid, NULL); } int @@ -106,10 +126,10 @@ int if (FT_OS == 1) mlx_destroy_image(clist->wlist.wlx, clist->img.img); mlx_destroy_window(clist->wlist.wlx, clist->wlist.winptr); - clist->wlist.winptr = NULL; } - ft_kill_forks(clist); + ft_cancel_threads(clist); ft_free_lists(clist); + ft_free_some_extras(clist); ft_printf("Exiting program\n"); exit(exit_code); return (0); diff --git a/src/ft_find_item.c b/src/ft_find_item.c new file mode 100644 index 0000000..d00b62d --- /dev/null +++ b/src/ft_find_item.c @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_find_item.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/17 20:06:26 by rbousset #+# #+# */ +/* Updated: 2020/02/17 20:06:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <cub3d.h> +#include <stdint.h> + +static uint16_t + ft_fetch_heals_id(uint64_t pos_y, uint64_t pos_x, t_cub *cl) +{ + uint16_t id; + + id = 0; + while (id <= 64) + { + if (cl->heals[id].s_pos_y == pos_y && cl->heals[id].s_pos_x == pos_x) + return (id); + id++; + } + return (0); +} + +void + ft_find_item(t_player *pl, t_map *ml, t_cub *cl) +{ + uint16_t id; + + if (ft_ischarset(FT_CHRST_ITEM, + ml->map[(uint64_t)pl->pos_y][(uint64_t)pl->pos_x])) + { + if (ml->map[(uint64_t)pl->pos_y][(uint64_t)pl->pos_x] == '+' + && pl->life < 100) + { + pl->life += FT_HEAL_PACK_AMOUNT; + pl->life = (pl->life > 100) ? (100) : (pl->life); + ml->map[(uint64_t)pl->pos_y][(uint64_t)pl->pos_x] = '0'; + id = ft_fetch_heals_id((uint64_t)pl->pos_y, + (uint64_t)pl->pos_x, cl); + cl->heals[id].s_pos_x = 0; + cl->heals[id].s_pos_y = 0; + /* TODO: ft_sfx_heal(3) */ + } + } +} diff --git a/src/ft_floor_cast.c b/src/ft_floor_cast.c index 92dcb07..160a2c1 100644 --- a/src/ft_floor_cast.c +++ b/src/ft_floor_cast.c @@ -25,30 +25,30 @@ static void { float dist; float calc; - t_rgb rgb; dist = (cl->rlist.row_dist > 0) ? (cl->rlist.row_dist) : (0.0001); calc = (dist * 0.1 * cl->mlist.darklvl); calc = (calc >= 255) ? (255) : (calc); calc = (calc < 1) ? (1) : (calc); calc = (cl->mlist.darklvl > 0) ? (calc) : (1); - rgb.r = (uint8_t)cl->tlist[tid].ptr[cl->tlist[tid].tex_x * 4 + 4 * - cl->tlist[tid].img_h * cl->tlist[tid].tex_y + 2] / calc; - rgb.g = (uint8_t)cl->tlist[tid].ptr[cl->tlist[tid].tex_x * 4 + 4 * - cl->tlist[tid].img_h * cl->tlist[tid].tex_y + 1] / calc; - rgb.b = (uint8_t)cl->tlist[tid].ptr[cl->tlist[tid].tex_x * 4 + 4 * - cl->tlist[tid].img_h * cl->tlist[tid].tex_y] / calc; - *(int*)(cl->img.ptr + - (x * 4 + (y * cl->img.sizeline))) = ft_rgb_to_hex(rgb); + *(cl->img.ptr + x * 4 + (cl->img.sizeline * y)) = + (uint8_t)*(cl->tlist[tid].ptr + cl->tlist[tid].tex_x * 4 + 4 * + cl->tlist[tid].img_w * cl->tlist[tid].tex_y) / calc; + *(cl->img.ptr + x * 4 + (cl->img.sizeline * y) + 1) = + (uint8_t)*(cl->tlist[tid].ptr + cl->tlist[tid].tex_x * 4 + 4 * + cl->tlist[tid].img_w * cl->tlist[tid].tex_y + 1) / calc; + *(cl->img.ptr + x * 4 + (cl->img.sizeline * y) + 2) = + (uint8_t)*(cl->tlist[tid].ptr + cl->tlist[tid].tex_x * 4 + 4 * + cl->tlist[tid].img_w * cl->tlist[tid].tex_y + 2) / calc; } static void ft_set_tex_xy(uint8_t tid, t_ray *rl, t_cub *cl) { cl->tlist[tid].tex_y = (int32_t)(cl->tlist[tid].img_w - * (rl->x_floor - rl->x_cell)) % (cl->tlist[tid].img_w); + * (rl->x_floor - rl->x_cell)); cl->tlist[tid].tex_x = (int32_t)(cl->tlist[tid].img_h - * (rl->y_floor - rl->y_cell)) % (cl->tlist[tid].img_h); + * (rl->y_floor - rl->y_cell)); cl->tlist[tid].tex_x = (cl->tlist[tid].tex_x > 0) ? (cl->tlist[tid].tex_x) : (-cl->tlist[tid].tex_x); cl->tlist[tid].tex_y = (cl->tlist[tid].tex_y > 0) diff --git a/src/ft_free_words.c b/src/ft_free_words.c index a90b959..3ca01c8 100644 --- a/src/ft_free_words.c +++ b/src/ft_free_words.c @@ -20,10 +20,10 @@ uint8_t i = 0; while (i < 9) { - ft_memdel((void**)&sprites[i]); + ft_memdel((void*)&sprites[i]); i++; } - ft_memdel((void**)&sprites); + ft_memdel((void*)&sprites); return (0); } @@ -35,9 +35,9 @@ uint8_t i = 0; while (words[i]) { - ft_memdel((void**)&words[i]); + ft_memdel((void*)&words[i]); i++; } - ft_memdel((void**)&words); + ft_memdel((void*)&words); return (0); } diff --git a/src/ft_get_fps_count.c b/src/ft_get_fps_count.c new file mode 100644 index 0000000..16306c1 --- /dev/null +++ b/src/ft_get_fps_count.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_key_loop.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/17 20:06:26 by rbousset #+# #+# */ +/* Updated: 2020/02/17 20:06:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <cub3d.h> +#include <stddef.h> +#include <stdint.h> +#include <time.h> + +static float + ft_clock_to_ms(clock_t ticks) +{ + return ((ticks / (float)CLOCKS_PER_SEC) * 1000.0); +} + +#include <stdio.h> + +void + ft_get_fps_count(clock_t dt, t_cub *cl) +{ + static clock_t curr_time = 0; + + curr_time += dt; + if (dt > 0 && ft_clock_to_ms(curr_time) > 1000.0) + { + ft_sprintf(cl->fps_count, "fps: %ld", (uint32_t)CLOCKS_PER_SEC / dt); + curr_time -= CLOCKS_PER_SEC; + } +} diff --git a/src/ft_get_heal_spawn.c b/src/ft_get_heal_spawn.c new file mode 100644 index 0000000..142709b --- /dev/null +++ b/src/ft_get_heal_spawn.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_get_traps.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/28 18:24:52 by rbousset #+# #+# */ +/* Updated: 2020/02/28 18:24:56 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <cub3d.h> +#include <stdint.h> + +void + ft_get_heal_spawn(t_cub *clist) +{ + size_t x; + size_t y; + uint8_t i; + + x = 1; + y = 1; + i = 0; + while (clist->mlist.map[y]) + { + while (clist->mlist.map[y][x]) + { + if (clist->mlist.map[y][x] == '+') + { + clist->mlist.heals_nbr++; + if (clist->mlist.heals_nbr > 64) + ft_map_error(FT_ERR_TOO_MUCH_HEALS, clist); + clist->heals[i].s_pos_x = x; + clist->heals[i].s_pos_y = y; + i++; + } + x++; + } + x = 1; + y++; + } +} diff --git a/src/ft_get_map.c b/src/ft_get_map.c index 08c9734..8602ce3 100644 --- a/src/ft_get_map.c +++ b/src/ft_get_map.c @@ -58,22 +58,22 @@ int clist->mlist.map_start = clist->mlist.line_chk; if (!line[0]) { - ft_memdel((void**)&line); + ft_memdel((void*)&line); ft_sprintf(clist->errmsg, FT_ERR_READ); return (-1); } if (ft_check_map_line(line, 1, clist) < 0) { - ft_memdel((void**)&line); + ft_memdel((void*)&line); return (-1); } - ft_memdel((void**)&clist->mlist.mapl); + ft_memdel((void*)&clist->mlist.mapl); if (ft_cat_mapl(line, clist) < 0) { - ft_memdel((void**)&line); + ft_memdel((void*)&line); return (-1); } - ft_memdel((void**)&line); + ft_memdel((void*)&line); return (1); } @@ -92,17 +92,17 @@ int { if (!line[0]) ft_sprintf(clist->errmsg, FT_ERR_MAP_EMPL); - ft_memdel((void**)&line); + ft_memdel((void*)&line); return (-1); } - ft_memdel((void**)&line); + ft_memdel((void*)&line); } - ft_memdel((void**)&line); + ft_memdel((void*)&line); clist->mlist.mapl[clist->mlist.mapl_len - 1] = '\0'; ft_free_words(clist->mlist.map); clist->mlist.map = ft_split(clist->mlist.mapl, '\n'); clist->mlist.map_h = ft_get_map_h(clist->mlist.map); clist->mlist.map_w = ft_get_map_w(clist->mlist.map); - ft_memdel((void**)&clist->mlist.mapl); + ft_memdel((void*)&clist->mlist.mapl); return (0); } diff --git a/src/ft_get_music.c b/src/ft_get_music.c index 7a8d36f..cf105a3 100644 --- a/src/ft_get_music.c +++ b/src/ft_get_music.c @@ -22,14 +22,11 @@ static int8_t len = ft_strlen(mlist->music_path); len += ft_strlen(FT_SND_CMD) - 2; - ft_memdel((void**)&mlist->music_cmd); + ft_memdel((void*)&mlist->music_cmd); if (!(mlist->music_cmd = (char *)malloc((len + 1) * sizeof(char)))) return (-1); ft_sprintf(mlist->music_cmd, FT_SND_CMD, mlist->music_path); - ft_free_words(mlist->mcmd_words); - if (!(mlist->mcmd_words = ft_split(mlist->music_cmd, ' '))) - return (-1); return (0); } @@ -46,7 +43,7 @@ int8_t ft_sprintf(clist->errmsg, FT_ERR_NOT_A_WAV); return (-1); } - ft_memdel((void**)&clist->mlist.music_path); + ft_memdel((void*)&clist->mlist.music_path); if (!(clist->mlist.music_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, FT_ERR_ALLOCATE); diff --git a/src/ft_get_path_nl.c b/src/ft_get_path_nl.c index 68de5c6..38f5b36 100644 --- a/src/ft_get_path_nl.c +++ b/src/ft_get_path_nl.c @@ -27,7 +27,7 @@ int8_t ft_sprintf(clist->errmsg, FT_ERR_NOT_A_CUB); return (-1); } - ft_memdel((void**)&clist->mlist.nlevel_path); + ft_memdel((void*)&clist->mlist.nlevel_path); if (!(clist->mlist.nlevel_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, FT_ERR_ALLOCATE); diff --git a/src/ft_get_player_spawn.c b/src/ft_get_player_spawn.c index ef2edd9..1ba6437 100644 --- a/src/ft_get_player_spawn.c +++ b/src/ft_get_player_spawn.c @@ -84,6 +84,7 @@ void ft_get_start_side(clist->mlist.map[y][x], plist); ft_get_sprite_spawn(clist); ft_get_trap_spawn(clist); + ft_get_heal_spawn(clist); return ; } x++; diff --git a/src/ft_get_skybox.c b/src/ft_get_skybox.c index d2f1f02..1e55b85 100644 --- a/src/ft_get_skybox.c +++ b/src/ft_get_skybox.c @@ -27,7 +27,7 @@ int8_t ft_sprintf(clist->errmsg, FT_ERR_NOT_A_XPM); return (-1); } - ft_memdel((void**)&clist->mlist.skybox_path); + ft_memdel((void*)&clist->mlist.skybox_path); if (!(clist->mlist.skybox_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, FT_ERR_ALLOCATE); diff --git a/src/ft_get_sprite.c b/src/ft_get_sprite.c index ed44d9b..5a5ecd0 100644 --- a/src/ft_get_sprite.c +++ b/src/ft_get_sprite.c @@ -53,7 +53,7 @@ static int8_t static int8_t ft_get_sprite_norme(int8_t id, char **words, t_cub *clist) { - ft_memdel((void**)&clist->mlist.sprite_path[id]); + ft_memdel((void*)&clist->mlist.sprite_path[id]); if (!(clist->mlist.sprite_path[id] = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, FT_ERR_ALLOCATE); diff --git a/src/ft_get_sprite_spawns.c b/src/ft_get_sprite_spawns.c index e0b37b5..d7b6677 100644 --- a/src/ft_get_sprite_spawns.c +++ b/src/ft_get_sprite_spawns.c @@ -19,7 +19,7 @@ void ft_get_next_sprite(t_cub *clist, int s_n, char c, size_t x) { size_t y; - uint8_t i; + int16_t i; y = 0; i = 0; @@ -37,7 +37,8 @@ void } x = 0; } - if (clist->sprites[s_n][i - 1].s_pos_x != 0) + if (clist->sprites[s_n][(i - 1 < 0) ? (0) : (i - 1)].s_pos_x != 0 + && s_n + 1 < 7) { ft_get_next_sprite(clist, s_n + 1, c + 1, 0); } diff --git a/src/ft_get_tex.c b/src/ft_get_tex.c index f8a817c..21096eb 100644 --- a/src/ft_get_tex.c +++ b/src/ft_get_tex.c @@ -27,7 +27,7 @@ int8_t ft_sprintf(clist->errmsg, "%s", FT_ERR_NOT_A_XPM); return (-1); } - ft_memdel((void**)&clist->mlist.no_tex_path); + ft_memdel((void*)&clist->mlist.no_tex_path); if (!(clist->mlist.no_tex_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, "%s", FT_ERR_ALLOCATE); @@ -54,7 +54,7 @@ int8_t ft_sprintf(clist->errmsg, "%s", FT_ERR_NOT_A_XPM); return (-1); } - ft_memdel((void**)&clist->mlist.so_tex_path); + ft_memdel((void*)&clist->mlist.so_tex_path); if (!(clist->mlist.so_tex_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, "%s", FT_ERR_ALLOCATE); @@ -81,7 +81,7 @@ int8_t ft_sprintf(clist->errmsg, "%s", FT_ERR_NOT_A_XPM); return (-1); } - ft_memdel((void**)&clist->mlist.ea_tex_path); + ft_memdel((void*)&clist->mlist.ea_tex_path); if (!(clist->mlist.ea_tex_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, "%s", FT_ERR_ALLOCATE); @@ -108,7 +108,7 @@ int8_t ft_sprintf(clist->errmsg, "%s", FT_ERR_NOT_A_XPM); return (-1); } - ft_memdel((void**)&clist->mlist.we_tex_path); + ft_memdel((void*)&clist->mlist.we_tex_path); if (!(clist->mlist.we_tex_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, "%s", FT_ERR_ALLOCATE); diff --git a/src/ft_get_tex_extra.c b/src/ft_get_tex_extra.c index 25f9c23..77f053b 100644 --- a/src/ft_get_tex_extra.c +++ b/src/ft_get_tex_extra.c @@ -26,7 +26,7 @@ int8_t ft_sprintf(clist->errmsg, "%s", FT_ERR_NOT_A_XPM); return (-1); } - ft_memdel((void**)&clist->mlist.fl_tex_path); + ft_memdel((void*)&clist->mlist.fl_tex_path); if (!(clist->mlist.fl_tex_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, "%s", FT_ERR_ALLOCATE); @@ -54,7 +54,7 @@ int8_t ft_sprintf(clist->errmsg, "%s", FT_ERR_NOT_A_XPM); return (-1); } - ft_memdel((void**)&clist->mlist.ce_tex_path); + ft_memdel((void*)&clist->mlist.ce_tex_path); if (!(clist->mlist.ce_tex_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, "%s", FT_ERR_ALLOCATE); diff --git a/src/ft_get_tex_nl.c b/src/ft_get_tex_nl.c index bb071f7..0931df1 100644 --- a/src/ft_get_tex_nl.c +++ b/src/ft_get_tex_nl.c @@ -27,7 +27,7 @@ int8_t ft_sprintf(clist->errmsg, "%s", FT_ERR_NOT_A_XPM); return (-1); } - ft_memdel((void**)&clist->mlist.nl_tex_path); + ft_memdel((void*)&clist->mlist.nl_tex_path); if (!(clist->mlist.nl_tex_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, "%s", FT_ERR_ALLOCATE); diff --git a/src/ft_get_traps.c b/src/ft_get_traps.c index 0235bb5..fef3179 100644 --- a/src/ft_get_traps.c +++ b/src/ft_get_traps.c @@ -1,7 +1,7 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_get_tex_nl.c :+: :+: :+: */ +/* ft_get_traps.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ @@ -19,7 +19,7 @@ void { size_t x; size_t y; - uint8_t i; + uint16_t i; x = 1; y = 1; @@ -31,6 +31,8 @@ void if (clist->mlist.map[y][x] == 'T') { clist->mlist.traps_nbr++; + if (clist->mlist.traps_nbr > 512) + ft_map_error(FT_ERR_TOO_MUCH_TRAPS, clist); clist->traps[i].s_pos_x = x; clist->traps[i].s_pos_y = y; i++; @@ -55,7 +57,7 @@ int8_t ft_sprintf(clist->errmsg, "%s", FT_ERR_NOT_A_XPM); return (-1); } - ft_memdel((void**)&clist->mlist.traps_path); + ft_memdel((void*)&clist->mlist.traps_path); if (!(clist->mlist.traps_path = ft_strdup(*(words + 1)))) { ft_sprintf(clist->errmsg, "%s", FT_ERR_ALLOCATE); diff --git a/src/ft_hooks_and_loops.c b/src/ft_hooks_and_loops.c index b8bdd36..9293496 100644 --- a/src/ft_hooks_and_loops.c +++ b/src/ft_hooks_and_loops.c @@ -15,7 +15,7 @@ #include <mlx.h> void - ft_hooks_and_loops(t_win *wl, t_cub *cl) +ft_hooks_and_loops(t_win *wl, t_cub *cl) { mlx_hook(wl->winptr, 2, (1L << 0), ft_key_event, cl); mlx_hook(wl->winptr, 3, (1L << 1), ft_key_release, cl); diff --git a/src/ft_init_lists.c b/src/ft_init_lists.c index 3e4dc96..99ebd65 100644 --- a/src/ft_init_lists.c +++ b/src/ft_init_lists.c @@ -11,7 +11,6 @@ /* ************************************************************************** */ #include <libft.h> -#include <mlx.h> #include <cub3d.h> #include <stddef.h> #include <stdlib.h> @@ -72,7 +71,7 @@ static int8_t i = -1; while (++i < 5) cl->key_input[i] = -1; - cl->mpid = 0; + cl->mtid = 0; cl->ishud = 0; cl->isoldmus = 0; cl->doicast = 1; @@ -85,22 +84,18 @@ static int8_t cl->walltexgood = 0; ft_init_funptr(cl); ft_init_ref(cl); + if (ft_init_sprites(&cl->sprites) < 0) + return (-1); return (0); } int8_t ft_init_cub3d(t_cub *clist) { - uint8_t i; if (ft_init_cub(clist) < 0) return (-1); if (ft_init_win(&clist->wlist) < 0) return (-1); - i = 0; - while (i < 9) - { - ft_bzero(clist->sprites[i], 4096); - i++; - } + ft_sprintf(clist->fps_count, "fps: 60"); return (0); } diff --git a/src/ft_init_map.c b/src/ft_init_map.c index 4ee8def..37fc858 100644 --- a/src/ft_init_map.c +++ b/src/ft_init_map.c @@ -34,15 +34,13 @@ static int8_t !(mlist->music_cmd = (char*)ft_calloc(1, sizeof(char))) || !(mlist->mapl = (char*)ft_calloc(1, sizeof(char))) || !(mlist->map = (char**)ft_calloc(2, sizeof(char*))) || - !(mlist->map[0] = (char*)ft_calloc(1, sizeof(char))) || - !(mlist->mcmd_words = (char**)ft_calloc(2, sizeof(char*))) || - !(mlist->mcmd_words[0] = (char*)ft_calloc(1, sizeof(char)))) + !(mlist->map[0] = (char*)ft_calloc(1, sizeof(char)))) return (-1); return (0); } static int8_t - ft_calloc_sprites(t_map *mlist) + ft_calloc_sprites_path(t_map *mlist) { uint8_t i; @@ -76,8 +74,7 @@ int8_t if (ft_init_map_callocs(mlist) < 0) return (-1); mlist->map[1] = 0; - mlist->mcmd_words[1] = 0; - if (ft_calloc_sprites(mlist) < 0) + if (ft_calloc_sprites_path(mlist) < 0) return (-1); mlist->map_w = 0; mlist->map_h = 0; @@ -93,7 +90,9 @@ int8_t mlist->ismusic = 0; mlist->isskybox = 0; mlist->istraps = 0; + mlist->isheals = 0; mlist->traps_nbr = 0; + mlist->heals_nbr = 0; mlist->darklvl = 0; return (ft_init_map_norme(mlist)); } diff --git a/src/ft_init_sfx.c b/src/ft_init_sfx.c index 9049250..35ab57d 100644 --- a/src/ft_init_sfx.c +++ b/src/ft_init_sfx.c @@ -17,39 +17,41 @@ #include <stdlib.h> #include <stdint.h> #include <unistd.h> +#include <pthread.h> static int8_t - ft_split_sfx(char ***target, const char *path) + ft_init_sfx_cmd(char **target, const char *path) { uint8_t len; - char *tmp; len = ft_strlen(path); len += ft_strlen(FT_SND_CMD) - 2; - if (!(tmp = (char *)malloc((len + 1) * sizeof(char)))) + if (!(*target = (char *)malloc((len + 1) * sizeof(char)))) return (-1); - ft_sprintf(tmp, FT_SND_CMD, path); - if (!(*target = ft_split(tmp, ' '))) - { - ft_memdel((void**)&tmp); - return (-1); - } - ft_memdel((void**)&tmp); + ft_sprintf(*target, FT_SND_CMD, path); return (0); } int8_t ft_init_sfx(t_sfx *sfx) { - sfx->death_pid = 0; - sfx->new_lvl_pid = 0; - sfx->pain_pid = 0; - sfx->trap_pid = 0; - if (ft_split_sfx(&sfx->death, FT_SFX_DEATH_PATH) < 0 || - ft_split_sfx(&sfx->new_lvl, FT_SFX_N_LVL_PATH) < 0 || - ft_split_sfx(&sfx->pain_one, FT_SFX_SCR_ONE_PATH) < 0 || - ft_split_sfx(&sfx->pain_two, FT_SFX_SCR_TWO_PATH) < 0 || - ft_split_sfx(&sfx->trap, FT_SFX_TRAP_PATH) < 0) + if (ft_init_sfx_cmd(&sfx->death, FT_SFX_DEATH_PATH) < 0 || + ft_init_sfx_cmd(&sfx->footstep_one, FT_SFX_FS_ONE_PATH) < 0 || + ft_init_sfx_cmd(&sfx->footstep_two, FT_SFX_FS_TWO_PATH) < 0 || + ft_init_sfx_cmd(&sfx->new_lvl, FT_SFX_N_LVL_PATH) < 0 || + ft_init_sfx_cmd(&sfx->pain_one, FT_SFX_SCR_ONE_PATH) < 0 || + ft_init_sfx_cmd(&sfx->pain_two, FT_SFX_SCR_TWO_PATH) < 0 || + ft_init_sfx_cmd(&sfx->trap, FT_SFX_TRAP_PATH) < 0) return (-1); + pthread_mutex_init(&sfx->death_mutex, NULL); + pthread_mutex_init(&sfx->footstep_mutex, NULL); + pthread_mutex_init(&sfx->new_lvl_mutex, NULL); + pthread_mutex_init(&sfx->pain_mutex, NULL); + pthread_mutex_init(&sfx->trap_mutex, NULL); + pthread_create(&sfx->death_tid, NULL, ft_sfx_death_thread, sfx); + pthread_create(&sfx->footstep_tid, NULL, ft_sfx_footstep_thread, sfx); + pthread_create(&sfx->new_lvl_tid, NULL, ft_sfx_new_lvl_thread, sfx); + pthread_create(&sfx->pain_tid, NULL, ft_sfx_pain_thread, sfx); + pthread_create(&sfx->trap_tid, NULL, ft_sfx_trap_thread, sfx); return (0); } diff --git a/src/ft_init_sprites.c b/src/ft_init_sprites.c new file mode 100644 index 0000000..4fc9aed --- /dev/null +++ b/src/ft_init_sprites.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_init_lists.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:28:53 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:28:53 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <cub3d.h> +#include <stddef.h> +#include <stdlib.h> +#include <stdint.h> + +int8_t + ft_init_sprites(t_sprite ***sprites) +{ + uint8_t i; + + if (!(*sprites = (t_sprite**)ft_calloc(8, sizeof(t_sprite*)))) + return (-1); + i = 0; + while (i < 8) + { + if (!(*((*sprites) + i) = (t_sprite*)ft_calloc(4096, sizeof(t_sprite)))) + return (-1); + i++; + } + return (0); +} diff --git a/src/ft_init_winlx.c b/src/ft_init_winlx.c index dee4009..59d0b58 100644 --- a/src/ft_init_winlx.c +++ b/src/ft_init_winlx.c @@ -26,7 +26,7 @@ int int ft_init_winptr(t_cub *clist) { - ft_memdel((void**)&clist->wlist.winptr); + ft_memdel((void*)&clist->wlist.winptr); if (!(clist->wlist.winptr = mlx_new_window(clist->wlist.wlx, clist->wlist.x_size, clist->wlist.y_size, "Cub3D"))) return (-1); diff --git a/src/ft_key_loop.c b/src/ft_key_loop.c index c16655e..e0177e2 100644 --- a/src/ft_key_loop.c +++ b/src/ft_key_loop.c @@ -13,8 +13,9 @@ #include <libft.h> #include <cub3d.h> #include <mlx.h> -#include <stdint.h> #include <stddef.h> +#include <stdint.h> +#include <time.h> static uint64_t ft_find_x(int32_t key, const t_player *pl) @@ -77,25 +78,32 @@ int uint8_t i; const float old_y = cl->plist.pos_y; const float old_x = cl->plist.pos_x; + clock_t begin_frame; + begin_frame = clock(); i = 0; while (i < 5 && cl->key_input[i] != -1 && cl->key_input[i] <= 5) { cl->key_ptr[cl->key_input[i]](cl); - ft_collision(old_y, old_x, cl->key_input[i], cl); - if (cl->mlist.isnlvl) + if (cl->key_input[i] >= 0 && cl->key_input[i] <= 3) { - if ((uint32_t)cl->plist.pos_x == cl->mlist.nlx && - (uint32_t)cl->plist.pos_y == cl->mlist.nly) + ft_sfx_footstep(cl); + ft_collision(old_y, old_x, cl->key_input[i], cl); + ft_find_item(&cl->plist, &cl->mlist, cl); + if (cl->mlist.isnlvl) { - ft_sfx_new_level(cl); - return ((ft_warp_level(cl->mlist.nlevel_path, cl) < 0) ? - (ft_exit(FT_RET_FAILED_STRUCTS, cl)) : (0)); + if ((uint32_t)cl->plist.pos_x == cl->mlist.nlx && + (uint32_t)cl->plist.pos_y == cl->mlist.nly) + { + ft_sfx_new_level(cl); + return ((ft_warp_level(cl->mlist.nlevel_path, cl) < 0) ? + (ft_exit(FT_RET_FAILED_STRUCTS, cl)) : (0)); + } } } i++; } - if (cl->key_input[0] != -1) - ft_draw_scene(cl); + ft_draw_scene(cl); + ft_get_fps_count(clock() - begin_frame, cl); return (0); } diff --git a/src/ft_music.c b/src/ft_music.c index 234f86e..7a2d800 100644 --- a/src/ft_music.c +++ b/src/ft_music.c @@ -11,21 +11,29 @@ /* ************************************************************************** */ #include <cub3d.h> -#include <unistd.h> +#include <stddef.h> +#include <stdlib.h> +#include <pthread.h> -void - ft_music_fork(char **mcmd_words, char *const envp[]) +static void + *ft_music_thread(void *vargp) { - execve(*(mcmd_words + 0), mcmd_words, envp); + t_cub *cl; + + if (FT_OS == 1) + pthread_setcancelstate(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + else + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + cl = (t_cub *)vargp; + while (1) + if (system(cl->mlist.music_cmd) != 0) + pthread_exit(NULL); + return(NULL); } void ft_enable_music(t_cub *cl) { cl->isoldmus = 1; - cl->mpid = fork(); - if (cl->mpid == 0) - { - ft_music_fork(cl->mlist.mcmd_words, cl->envp); - } + pthread_create(&cl->mtid, NULL, ft_music_thread, cl); } diff --git a/src/ft_parse_map.c b/src/ft_parse_map.c index f1df73d..79c00d2 100644 --- a/src/ft_parse_map.c +++ b/src/ft_parse_map.c @@ -42,7 +42,7 @@ static void static int8_t ft_error_here(const char *errmsg, char *line, t_cub *clist) { - ft_memdel((void**)&line); + ft_memdel((void*)&line); return (ft_map_error(errmsg, clist)); } @@ -60,7 +60,7 @@ static int8_t return (ft_error_here(FT_ERR_UNFINISHED, line, clist)); if (!line[0]) { - ft_memdel((void**)&line); + ft_memdel((void*)&line); return (ft_parse_it(fd, clist)); } if (ft_ischarset("1 ", line[0])) @@ -70,14 +70,14 @@ static int8_t return (ft_error_here(FT_ERR_ILL_ENTRY, line, clist)); if ((ret = ft_select_get(words, clist)) == FT_PARSE_END_RET) return ((ft_get_map_first_line(line, clist) < 0) ? (-1) : (25)); - ft_memdel((void**)&line); + ft_memdel((void*)&line); return (ret); } void ft_save_name(const char *map_path, t_cub *clist) { - ft_memdel((void**)&clist->mlist.filename); + ft_memdel((void*)&clist->mlist.filename); if (!(clist->mlist.filename = (char*)malloc((ft_strlen(map_path) + 1) * sizeof(char)))) ft_error(FT_RET_ALLOC_ERR, FT_ERR_ALLOCATE, clist); diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index 743dc36..2d7df79 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -106,7 +106,8 @@ void } ft_floor_cast(cl); ft_calc_sprite(cl); + ft_calc_heal(cl); ft_calc_trap(cl); - ft_memdel((void**)&cl->rlist.wall_dist_tab); - ft_memdel((void**)&cl->rlist.wall_bz); + ft_memdel((void*)&cl->rlist.wall_dist_tab); + ft_memdel((void*)&cl->rlist.wall_bz); } diff --git a/src/ft_save_to_bmp.c b/src/ft_save_to_bmp.c index ae3a2b6..1737226 100644 --- a/src/ft_save_to_bmp.c +++ b/src/ft_save_to_bmp.c @@ -111,16 +111,16 @@ int8_t return (-1); if (!(bmp = ft_convert_image_to_bmp(cl->img, cl))) { - ft_memdel((void**)&fname); + ft_memdel((void*)&fname); return (-1); } if (ft_write_bmp(fname, cl->wlist.y_size, cl->wlist.x_size, bmp) < 0) { - ft_memdel((void**)&bmp); - ft_memdel((void**)&fname); + ft_memdel((void*)&bmp); + ft_memdel((void*)&fname); return (-1); } - ft_memdel((void**)&bmp); - ft_memdel((void**)&fname); + ft_memdel((void*)&bmp); + ft_memdel((void*)&fname); return (0); } diff --git a/src/ft_sfx_death.c b/src/ft_sfx_death.c index 2566358..32ad6fe 100644 --- a/src/ft_sfx_death.c +++ b/src/ft_sfx_death.c @@ -11,14 +11,31 @@ /* ************************************************************************** */ #include <cub3d.h> -#include <unistd.h> +#include <stdlib.h> +#include <pthread.h> void - ft_sfx_death(t_cub *cl) + *ft_sfx_death_thread(void *vargp) { - cl->sfx.death_pid = fork(); - if (cl->sfx.death_pid == 0) + t_sfx *sfx; + + if (FT_OS == 1) + pthread_setcancelstate(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + else + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + sfx = (t_sfx *)vargp; + pthread_mutex_lock(&sfx->death_mutex); + while (1) { - execve(*(cl->sfx.death + 0), cl->sfx.death, cl->envp); + pthread_mutex_lock(&sfx->death_mutex); + if (system(sfx->death)) + pthread_exit(NULL); } + return (NULL); +} + +void + ft_sfx_death(t_cub *cl) +{ + pthread_mutex_unlock(&cl->sfx.death_mutex); } diff --git a/src/ft_sfx_footstep.c b/src/ft_sfx_footstep.c new file mode 100644 index 0000000..c0c9ffe --- /dev/null +++ b/src/ft_sfx_footstep.c @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sfx_footstep.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/24 17:17:54 by rbousset #+# #+# */ +/* Updated: 2020/02/24 17:17:56 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <cub3d.h> +#include <stdlib.h> +#include <pthread.h> + +void + *ft_sfx_footstep_thread(void *vargp) +{ + t_sfx *sfx; + static uint8_t ref = 0; + + if (FT_OS == 1) + pthread_setcancelstate(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + else + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + sfx = (t_sfx *)vargp; + pthread_mutex_lock(&sfx->footstep_mutex); + while (1) + { + ref = (ref > 201) ? (0) : (ref + 1); + pthread_mutex_lock(&sfx->footstep_mutex); + if (ref % 2) + { + if (system(sfx->footstep_one)) + pthread_exit(NULL); + } + else if (system(sfx->footstep_two)) + pthread_exit(NULL); + } + return (NULL); +} + +void + ft_sfx_footstep(t_cub *cl) +{ + pthread_mutex_unlock(&cl->sfx.footstep_mutex); +} diff --git a/src/ft_sfx_new_level.c b/src/ft_sfx_new_level.c index 05e9059..2cde15c 100644 --- a/src/ft_sfx_new_level.c +++ b/src/ft_sfx_new_level.c @@ -11,14 +11,31 @@ /* ************************************************************************** */ #include <cub3d.h> -#include <unistd.h> +#include <stdlib.h> +#include <pthread.h> void - ft_sfx_new_level(t_cub *cl) + *ft_sfx_new_lvl_thread(void *vargp) { - cl->sfx.new_lvl_pid = fork(); - if (cl->sfx.new_lvl_pid == 0) + t_sfx *sfx; + + if (FT_OS == 1) + pthread_setcancelstate(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + else + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + sfx = (t_sfx *)vargp; + pthread_mutex_lock(&sfx->new_lvl_mutex); + while (1) { - execve(*(cl->sfx.new_lvl + 0), cl->sfx.new_lvl, cl->envp); + pthread_mutex_lock(&sfx->new_lvl_mutex); + if (system(sfx->new_lvl)) + pthread_exit(NULL); } + return (NULL); +} + +void + ft_sfx_new_level(t_cub *cl) +{ + pthread_mutex_unlock(&cl->sfx.new_lvl_mutex); } diff --git a/src/ft_sfx_pain.c b/src/ft_sfx_pain.c new file mode 100644 index 0000000..68340c5 --- /dev/null +++ b/src/ft_sfx_pain.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sfx_trap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/24 17:17:54 by rbousset #+# #+# */ +/* Updated: 2020/02/24 17:17:56 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <cub3d.h> +#include <stdlib.h> +#include <pthread.h> + +void + *ft_sfx_pain_thread(void *vargp) +{ + t_sfx *sfx; + static uint8_t ref = 0; + + if (FT_OS == 1) + pthread_setcancelstate(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + else + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + sfx = (t_sfx *)vargp; + pthread_mutex_lock(&sfx->pain_mutex); + while (1) + { + pthread_mutex_lock(&sfx->pain_mutex); + ref = (ref > 201) ? (0) : (ref + 1); + if (ref % 3) + { + if (system(sfx->pain_one)) + pthread_exit(NULL); + } + else if (system(sfx->pain_two)) + pthread_exit(NULL); + } + return (NULL); +} + +void + ft_sfx_pain(t_cub *cl) +{ + static uint8_t ref = 0; + + ref = (ref > 201) ? (0) : (ref + 1); + if (ref % 2) + pthread_mutex_unlock(&cl->sfx.pain_mutex); +} diff --git a/src/ft_sfx_trap.c b/src/ft_sfx_trap.c index 1499ecf..a395450 100644 --- a/src/ft_sfx_trap.c +++ b/src/ft_sfx_trap.c @@ -10,40 +10,32 @@ /* */ /* ************************************************************************** */ -#include <libft.h> #include <cub3d.h> -#include <unistd.h> -#include <stdint.h> +#include <stdlib.h> +#include <pthread.h> -static void - ft_sfx_pain(t_cub *cl) +void + *ft_sfx_trap_thread(void *vargp) { - static uint8_t ref = 0; + t_sfx *sfx; - ref += 1; - if (ref > 201) - ref = 0; - if (ref % 2) + if (FT_OS == 1) + pthread_setcancelstate(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + else + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + sfx = (t_sfx *)vargp; + pthread_mutex_lock(&sfx->trap_mutex); + while (1) { - cl->sfx.pain_pid = fork(); - if (cl->sfx.pain_pid == 0) - { - if (ref % 3) - execve(*(cl->sfx.pain_one + 0), cl->sfx.pain_one, cl->envp); - else - execve(*(cl->sfx.pain_two + 0), cl->sfx.pain_two, cl->envp); - } + pthread_mutex_lock(&sfx->trap_mutex); + if (system(sfx->trap)) + pthread_exit(NULL); } + return (NULL); } void ft_sfx_trap(t_cub *cl) { - cl->sfx.trap_pid = fork(); - if (cl->sfx.trap_pid == 0) - execve(*(cl->sfx.trap + 0), cl->sfx.trap, cl->envp); - else - { - ft_sfx_pain(cl); - } + pthread_mutex_unlock(&cl->sfx.trap_mutex); } diff --git a/src/ft_suffer_animation.c b/src/ft_suffer_animation.c index d08fa54..a0a21a5 100644 --- a/src/ft_suffer_animation.c +++ b/src/ft_suffer_animation.c @@ -14,7 +14,6 @@ #include <cub3d.h> #include <mlx.h> #include <stdint.h> -#include <unistd.h> void ft_linux_suffer_animation(t_cub *cl) @@ -44,7 +43,10 @@ void ft_death_screen(cl); } else + { ft_sfx_trap(cl); + ft_sfx_pain(cl); + } } void diff --git a/src/ft_tex_init.c b/src/ft_tex_init.c index 298fbfc..6486e87 100644 --- a/src/ft_tex_init.c +++ b/src/ft_tex_init.c @@ -35,6 +35,8 @@ ** 13 : sprite 8 ** 14 : sprite 9 ** 15 : trap +** 16 : HUD back +** 17 : heal pack */ static void @@ -72,11 +74,13 @@ static void cl->tlist[7].ptr = mlx_get_data_addr(cl->tlist[7].img, &cl->tlist[7].bpp, &cl->tlist[7].sizeline, &cl->tlist[7].endian); } + cl->tlist[16].img = mlx_xpm_file_to_image(cl->wlist.wlx, + FT_HUD_BACK_PATH, &cl->tlist[16].img_w, &cl->tlist[16].img_h); + cl->tlist[16].ptr = mlx_get_data_addr(cl->tlist[16].img, + &cl->tlist[16].bpp, &cl->tlist[16].sizeline, &cl->tlist[16].endian); cl->walltexgood = 1; if (cl->mlist.sprite_var > 1) - { ft_next_sprite_init(cl); - } } static void @@ -103,6 +107,13 @@ static void cl->tlist[15].ptr = mlx_get_data_addr(cl->tlist[15].img, &cl->tlist[15].bpp, &cl->tlist[15].sizeline, &cl->tlist[15].endian); } + if (cl->mlist.isheals) + { + cl->tlist[17].img = mlx_xpm_file_to_image(cl->wlist.wlx, + FT_HEAL_PACK_PATH, &cl->tlist[17].img_w, &cl->tlist[17].img_h); + cl->tlist[17].ptr = mlx_get_data_addr(cl->tlist[17].img, + &cl->tlist[17].bpp, &cl->tlist[17].sizeline, &cl->tlist[17].endian); + } ft_wall_tex_init_norme_bis(cl); } diff --git a/src/ft_warp_level.c b/src/ft_warp_level.c index 56d4d67..a2b6006 100644 --- a/src/ft_warp_level.c +++ b/src/ft_warp_level.c @@ -23,41 +23,36 @@ static void ft_del_map(t_map *ml) { - ft_memdel((void**)&ml->filename); - ft_memdel((void**)&ml->no_tex_path); - ft_memdel((void**)&ml->so_tex_path); - ft_memdel((void**)&ml->ea_tex_path); - ft_memdel((void**)&ml->we_tex_path); - ft_memdel((void**)&ml->nl_tex_path); - ft_memdel((void**)&ml->fl_tex_path); - ft_memdel((void**)&ml->ce_tex_path); - ft_memdel((void**)&ml->nlevel_path); - ft_memdel((void**)&ml->skybox_path); - ft_memdel((void**)&ml->traps_path); - ft_memdel((void**)&ml->music_path); - ft_memdel((void**)&ml->music_cmd); - ft_memdel((void**)&ml->mapl); + ft_memdel((void*)&ml->filename); + ft_memdel((void*)&ml->no_tex_path); + ft_memdel((void*)&ml->so_tex_path); + ft_memdel((void*)&ml->ea_tex_path); + ft_memdel((void*)&ml->we_tex_path); + ft_memdel((void*)&ml->nl_tex_path); + ft_memdel((void*)&ml->fl_tex_path); + ft_memdel((void*)&ml->ce_tex_path); + ft_memdel((void*)&ml->nlevel_path); + ft_memdel((void*)&ml->skybox_path); + ft_memdel((void*)&ml->traps_path); + ft_memdel((void*)&ml->music_path); + ft_memdel((void*)&ml->music_cmd); + ft_memdel((void*)&ml->mapl); ft_free_sprites(ml->sprite_path); ft_free_words(ml->map); - ft_free_words(ml->mcmd_words); } static void ft_del_some(t_cub *cl) { - uint8_t i; + int8_t i; cl->plist = ft_init_player(); cl->f_rgb = ft_init_rgb(); cl->c_rgb = ft_init_rgb(); cl->rlist = ft_init_s_ray(); - i = 0; - while (i < 5) - { + i = -1; + while (++i < 5) mlx_destroy_image(cl->wlist.wlx, cl->tlist[i].img); - cl->tlist[i].ptr = NULL; - i++; - } if (cl->mlist.isnlvl && cl->tlist[5].img) mlx_destroy_image(cl->wlist.wlx, cl->tlist[5].img); if (cl->mlist.isftex && cl->tlist[6].img) @@ -66,7 +61,15 @@ static void mlx_destroy_image(cl->wlist.wlx, cl->tlist[7].img); if (cl->mlist.istraps && cl->tlist[15].img) mlx_destroy_image(cl->wlist.wlx, cl->tlist[15].img); + if (cl->tlist[16].img) + mlx_destroy_image(cl->wlist.wlx, cl->tlist[16].img); + if (cl->mlist.isheals && cl->tlist[17].img) + mlx_destroy_image(cl->wlist.wlx, cl->tlist[17].img); ft_del_extra_sprites(cl); + i = -1; + while (++i < 8) + ft_memdel((void*)&cl->sprites[i]); + ft_memdel((void*)&cl->sprites); } static void @@ -74,15 +77,15 @@ static void { if (isoldmus && !cl->mlist.ismusic) { - kill(cl->mpid, SIGTERM); - wait(&cl->mpid); + pthread_cancel(cl->mtid); + pthread_join(cl->mtid, NULL); cl->isoldmus = 0; } else if (isoldmus && cl->mlist.ismusic && ft_strncmp(tmp_mup, cl->mlist.music_path, ft_strlen(tmp_mup) + 1)) { - kill(cl->mpid, SIGTERM); - wait(&cl->mpid); + pthread_cancel(cl->mtid); + pthread_join(cl->mtid, NULL); ft_enable_music(cl); } else if (isoldmus && cl->mlist.ismusic @@ -104,13 +107,15 @@ int8_t tmp_mup = ft_strdup(cl->mlist.music_path); ft_del_some(cl); ft_del_map(&cl->mlist); + if (ft_init_sprites(&cl->sprites) < 0) + return (-1); if (ft_init_map(&cl->mlist) < 0) return (-1); ft_parse_map(next_path, cl); ft_treat_music(isoldmus, tmp_mup, cl); if (isoldmus) - ft_memdel((void**)&tmp_mup); + ft_memdel((void*)&tmp_mup); ft_wall_tex_init(cl); - ft_memdel((void**)&next_path); + ft_memdel((void*)&next_path); return (0); } @@ -13,6 +13,7 @@ #include <libft.h> #include <mlx.h> #include <cub3d.h> +#include <stdlib.h> int main(int argc, const char *argv[], char *const envp[]) |