aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Makefile19
-rw-r--r--chglog9
-rw-r--r--inc/cub3d.h16
-rw-r--r--inc/cub3d_defines.h125
-rw-r--r--inc/cub3d_structs.h44
-rw-r--r--map/map_one.cub16
-rw-r--r--media/img/first_aid.xpm857
-rw-r--r--media/sound/sfx/death_screen.wavbin1459980 -> 1255372 bytes
-rw-r--r--media/sound/sfx/footstep_one.wavbin0 -> 24298 bytes
-rw-r--r--media/sound/sfx/footstep_two.wavbin0 -> 25562 bytes
-rw-r--r--media/sound/sfx/next_lvl.wavbin792004 -> 547516 bytes
-rw-r--r--media/sound/sfx/scream_one.wavbin26392 -> 24112 bytes
-rw-r--r--media/sound/sfx/scream_two.wavbin34140 -> 28996 bytes
-rw-r--r--media/sound/sfx/trap.wavbin108532 -> 60508 bytes
-rw-r--r--src/ft_check_map_line.c4
-rw-r--r--src/ft_check_missing.c29
-rw-r--r--src/ft_death_screen.c3
-rw-r--r--src/ft_draw_heals.c109
-rw-r--r--src/ft_draw_heals_extra.c43
-rw-r--r--src/ft_draw_hud.c73
-rw-r--r--src/ft_draw_map.c4
-rw-r--r--src/ft_draw_scene.c20
-rw-r--r--src/ft_draw_sprite.c1
-rw-r--r--src/ft_draw_textures.c1
-rw-r--r--src/ft_draw_traps.c1
-rw-r--r--src/ft_error.c9
-rw-r--r--src/ft_exit.c110
-rw-r--r--src/ft_find_item.c53
-rw-r--r--src/ft_floor_cast.c22
-rw-r--r--src/ft_free_words.c8
-rw-r--r--src/ft_get_fps_count.c38
-rw-r--r--src/ft_get_heal_spawn.c45
-rw-r--r--src/ft_get_map.c18
-rw-r--r--src/ft_get_music.c7
-rw-r--r--src/ft_get_path_nl.c2
-rw-r--r--src/ft_get_player_spawn.c1
-rw-r--r--src/ft_get_skybox.c2
-rw-r--r--src/ft_get_sprite.c2
-rw-r--r--src/ft_get_sprite_spawns.c5
-rw-r--r--src/ft_get_tex.c8
-rw-r--r--src/ft_get_tex_extra.c4
-rw-r--r--src/ft_get_tex_nl.c2
-rw-r--r--src/ft_get_traps.c8
-rw-r--r--src/ft_hooks_and_loops.c2
-rw-r--r--src/ft_init_lists.c13
-rw-r--r--src/ft_init_map.c11
-rw-r--r--src/ft_init_sfx.c40
-rw-r--r--src/ft_init_sprites.c34
-rw-r--r--src/ft_init_winlx.c2
-rw-r--r--src/ft_key_loop.c28
-rw-r--r--src/ft_music.c26
-rw-r--r--src/ft_parse_map.c8
-rw-r--r--src/ft_raycasting.c5
-rw-r--r--src/ft_save_to_bmp.c10
-rw-r--r--src/ft_sfx_death.c27
-rw-r--r--src/ft_sfx_footstep.c48
-rw-r--r--src/ft_sfx_new_level.c27
-rw-r--r--src/ft_sfx_pain.c52
-rw-r--r--src/ft_sfx_trap.c42
-rw-r--r--src/ft_suffer_animation.c4
-rw-r--r--src/ft_tex_init.c15
-rw-r--r--src/ft_warp_level.c61
-rw-r--r--src/main.c1
63 files changed, 1797 insertions, 377 deletions
diff --git a/Makefile b/Makefile
index dd8d982..33a509d 100644
--- a/Makefile
+++ b/Makefile
@@ -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 ===============================================#
diff --git a/chglog b/chglog
deleted file mode 100644
index 3aad597..0000000
--- a/chglog
+++ /dev/null
@@ -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
index 61cf33d..5ee6f4d 100644
--- a/media/sound/sfx/death_screen.wav
+++ b/media/sound/sfx/death_screen.wav
Binary files differ
diff --git a/media/sound/sfx/footstep_one.wav b/media/sound/sfx/footstep_one.wav
new file mode 100644
index 0000000..898363e
--- /dev/null
+++ b/media/sound/sfx/footstep_one.wav
Binary files differ
diff --git a/media/sound/sfx/footstep_two.wav b/media/sound/sfx/footstep_two.wav
new file mode 100644
index 0000000..01781e1
--- /dev/null
+++ b/media/sound/sfx/footstep_two.wav
Binary files differ
diff --git a/media/sound/sfx/next_lvl.wav b/media/sound/sfx/next_lvl.wav
index 64cbc31..2b73389 100644
--- a/media/sound/sfx/next_lvl.wav
+++ b/media/sound/sfx/next_lvl.wav
Binary files differ
diff --git a/media/sound/sfx/scream_one.wav b/media/sound/sfx/scream_one.wav
index df9fc78..0bdab05 100644
--- a/media/sound/sfx/scream_one.wav
+++ b/media/sound/sfx/scream_one.wav
Binary files differ
diff --git a/media/sound/sfx/scream_two.wav b/media/sound/sfx/scream_two.wav
index 1d4ff78..3ccb161 100644
--- a/media/sound/sfx/scream_two.wav
+++ b/media/sound/sfx/scream_two.wav
Binary files differ
diff --git a/media/sound/sfx/trap.wav b/media/sound/sfx/trap.wav
index 7d237e5..ae41e07 100644
--- a/media/sound/sfx/trap.wav
+++ b/media/sound/sfx/trap.wav
Binary files differ
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);
}
diff --git a/src/main.c b/src/main.c
index d1ff470..a1c9a8c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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[])