diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..79b3c94
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..5460d3a
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/so_long.iml b/.idea/so_long.iml
new file mode 100644
index 0000000..f08604b
--- /dev/null
+++ b/.idea/so_long.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b9f7323
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,63 @@
+# **************************************************************************** #
+# #
+# ::: :::::::: #
+# Makefile :+: :+: :+: #
+# +:+ +:+ +:+ #
+# By: jbadaire +#+ +:+ +#+ #
+# +#+#+#+#+#+ +#+ #
+# Created: 2023/01/17 17:54:42 by jbadaire #+# #+# #
+# Updated: 2023/01/17 17:54:46 by jbadaire ### ########lyon.fr #
+# #
+# **************************************************************************** #
+
+NAME = so_long.out
+MAKE_LIBFT = make -C libft
+
+MLX = minilibx-linux/libmlx_Linux.a
+MAKE_MLX = make -C minilibx-linux
+
+MLX_FLAGS = -L./minilibx-linux -l:libmlx.a -L/usr/lib -Imlx_linux -lXext -lX11 -lm -lz
+
+SRCS = main.c \
+ collectible_utils.c \
+ frees.c \
+ maps_utils.c \
+ player.c \
+ rectangle_check.c \
+ utils.c \
+ graphics_utils.c
+
+LIBFT_FLAGS = -L./libft -l:libft.a
+OBJ_DIRECTORY = ./.obj/
+
+
+CC = cc
+
+FLAGS = -c -Wall -Wextra -Werror
+
+INCLUDES = ./headers/so_long.h
+
+OBJS = $(addprefix $(OBJ_DIRECTORY), $(SRCS:.c=.o))
+
+$(NAME): $(OBJ_DIRECTORY) $(OBJS)
+ $(MAKE_MLX)
+ $(MAKE_LIBFT)
+ $(CC) $(OBJS) $(LIBFT_FLAGS) $(MLX_FLAGS) -o $(NAME)
+
+$(OBJ_DIRECTORY)%.o: %.c
+ mkdir -p minilibx-linux
+ $(CC) $(FLAGS) $< -o $@
+
+$(OBJ_DIRECTORY):
+ mkdir -p $(OBJ_DIRECTORY)
+
+all : $(NAME)
+
+clean :
+ $(RM) $(NAME)
+ rm -rf $(OBJ_DIRECTORY)
+
+fclean : clean
+ rm -rf $(NAME)
+
+re : fclean all
\ No newline at end of file
diff --git a/collectible_utils.c b/collectible_utils.c
new file mode 100644
index 0000000..6774bc2
--- /dev/null
+++ b/collectible_utils.c
@@ -0,0 +1,101 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* collectible_utils.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/03 03:24:55 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 03:47:04 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "so_long.h"
+
+t_list *load_collectibles(t_data data) {
+ size_t pos_x;
+ size_t pos_y;
+ t_list *list;
+ t_collectible *collectible;
+
+ pos_x = 0;
+ pos_y = 0;
+ list = malloc(sizeof (t_list));
+ if(!list)
+ return (NULL);
+
+ while (pos_y < data.lenght_y) {
+ while (pos_x < ft_strlen(data.map[0])) {
+ if (data.map[pos_y][pos_x] == 'C') {
+ t_location location;
+ location.x = ++pos_x;
+ location.y = ++pos_y;
+ collectible = create_collectible(location);
+ if(!collectible)
+ return (NULL);
+ ft_lstadd_front(&list, ft_lstnew(collectible));
+ }
+ pos_x++;
+ }
+ pos_x = 0;
+ pos_y++;
+ }
+ return (list);
+
+}
+
+
+t_collectible *create_collectible(t_location location)
+{
+ t_collectible *collectible;
+
+ collectible = malloc(sizeof(t_collectible *));
+ if(!collectible)
+ return (NULL);
+ collectible->location.x = location.x;
+ collectible->location.y = location.y;
+ collectible->collected = _false;
+ return (collectible);
+}
+
+int count_collectibles(t_list *collectibles, t_boolean only_uncollected)
+{
+ t_list *collectibles_copy;
+ t_collectible *col;
+ int count;
+
+ collectibles_copy = collectibles;
+ count = 0;
+ col = NULL;
+ while (collectibles_copy->next != NULL) {
+ collectibles_copy = collectibles_copy->next;
+
+ if(only_uncollected) {
+ col = ((t_collectible*) collectibles_copy->content);
+ if(!col->collected)
+ {
+ count++;
+ continue;
+ }
+ }
+ count++;
+ }
+ return (count);
+}
+
+void update_collectible(t_list **collectibles, t_location location, t_boolean collected)
+{
+ t_list *collectibles_copy;
+ t_collectible *collectible;
+
+ collectibles_copy = *collectibles;
+ while (collectibles_copy->next)
+ {
+ collectible = ((t_collectible*) collectibles_copy->content);
+ if(collectible->location.x == location.x && collectible->location.y == location.y) {
+ collectible->collected = collected;
+ break;
+ }
+ collectibles_copy = collectibles_copy->next;
+ }
+}
\ No newline at end of file
diff --git a/frees.c b/frees.c
new file mode 100644
index 0000000..165350a
--- /dev/null
+++ b/frees.c
@@ -0,0 +1,44 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* frees.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/03 10:21:10 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 10:54:19 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "so_long.h"
+
+void free_map(t_data data) {
+ size_t lenght_y;
+
+ lenght_y = 0;
+ while (data.lenght_y < lenght_y) {
+ free(data.map[lenght_y]);
+ lenght_y++;
+ }
+ free(data.map);
+}
+
+void free_collectibles(t_list **collectibles) {
+
+ t_list *list;
+ t_list *copy;
+
+ list = *collectibles;
+ copy = list;
+ while (copy->next)
+ {
+ if(copy->next == NULL) {
+ free(list->content);
+ copy = list;
+ }
+ copy = copy->next;
+
+ }
+ free(list->content);
+ free(list);
+}
\ No newline at end of file
diff --git a/graphics_utils.c b/graphics_utils.c
new file mode 100644
index 0000000..9ea8b88
--- /dev/null
+++ b/graphics_utils.c
@@ -0,0 +1,48 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* graphics_utils.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/03 12:56:12 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 15:33:57 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "so_long.h"
+#include "minilibx-linux/mlx.h"
+
+void *load_texture(char *path, void *mlx) {
+
+ void *img;
+ char *relative_path = path;
+ int img_width;
+ int img_height;
+
+ img = mlx_xpm_file_to_image(mlx, relative_path, &img_width, &img_height);
+ return (img);
+}
+
+void draw_type(void *mlx, void *mlx_window, void *texture, t_data data, char c)
+{
+ size_t index_y;
+ size_t index_x;
+
+ index_y = 0;
+ index_x = 0;
+ while (index_y < data.lenght_y) {
+ while (index_x < ft_strlen(data.map[index_y])) {
+ if (data.map[index_y][index_x] == c)
+ mlx_put_image_to_window(mlx, mlx_window, texture, index_x * 128, index_y * 128);
+ index_x++;
+ }
+ index_x=0;
+ index_y++;
+ }
+}
+
+void destroy_texture() {
+
+}
+
diff --git a/libft/Makefile b/libft/Makefile
new file mode 100755
index 0000000..c0445c5
--- /dev/null
+++ b/libft/Makefile
@@ -0,0 +1,89 @@
+# **************************************************************************** #
+# #
+# ::: :::::::: #
+# Makefile :+: :+: :+: #
+# +:+ +:+ +:+ #
+# By: jbadaire +#+ +:+ +#+ #
+# +#+#+#+#+#+ +#+ #
+# Created: 2023/01/17 17:54:42 by jbadaire #+# #+# #
+# Updated: 2023/01/17 17:54:46 by jbadaire ### ########lyon.fr #
+# #
+# **************************************************************************** #
+
+NAME = libft.a
+RM = rm -rf
+CC = cc
+FLAGS = -Wall -Wextra -Werror -g
+OBJ_DIRECTORY = ./.obj/
+INCLUDE = libft.h
+
+SRCS = \
+ ft_bzero.c \
+ ft_isalnum.c \
+ ft_isalpha.c \
+ ft_isascii.c \
+ ft_isdigit.c \
+ ft_isprint.c \
+ ft_memset.c \
+ ft_strlen.c \
+ ft_strlcat.c \
+ ft_tolower.c \
+ ft_toupper.c \
+ ft_strrchr.c \
+ ft_strchr.c \
+ ft_strncmp.c \
+ ft_memchr.c \
+ ft_memcmp.c \
+ ft_strnstr.c \
+ ft_atoi.c \
+ ft_calloc.c \
+ ft_strdup.c \
+ ft_memcpy.c \
+ ft_memmove.c \
+ ft_strlcpy.c \
+ ft_substr.c \
+ ft_strjoin.c \
+ ft_strtrim.c \
+ ft_split.c \
+ ft_itoa.c \
+ ft_putchar_fd.c\
+ ft_putstr_fd.c \
+ ft_putendl_fd.c\
+ ft_striteri.c\
+ ft_strmapi.c\
+ ft_putnbr_fd.c \
+ ft_lstnew.c \
+ ft_lstadd_front.c\
+ ft_lstsize.c \
+ ft_lstlast.c \
+ ft_lstadd_back.c \
+ ft_lstdelone.c \
+ ft_lstclear.c \
+ ft_lstiter.c \
+ get_next_line.c \
+ get_next_line_utils.c \
+
+all: $(NAME)
+
+so: $(all)
+
+OBJS = $(addprefix $(OBJ_DIRECTORY), $(SRCS:.c=.o))
+
+$(NAME): $(OBJ_DIRECTORY) $(OBJS) $(INCLUDE)
+ ar -rcs $(NAME) $(OBJS)
+
+$(OBJ_DIRECTORY)%.o:%.c $(INCLUDE)
+ $(CC) $(FLAGS) -I. -c $< -o $@
+
+$(OBJ_DIRECTORY):
+ mkdir -p $(OBJ_DIRECTORY)
+
+clean:
+ $(RM) $(OBJ_DIRECTORY)
+
+fclean: clean
+ $(RM) $(NAME) *.out *.gch *.o .so
+
+re: fclean $(NAME)
+
+.PHONY: fclean clean all re
diff --git a/libft/ft_atoi.c b/libft/ft_atoi.c
new file mode 100644
index 0000000..d51426c
--- /dev/null
+++ b/libft/ft_atoi.c
@@ -0,0 +1,52 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_atoi.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:31:47 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:11:31 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+static int ft_is_space(int character)
+{
+ return ((character >= 9 && character <= 13) || character == ' ');
+}
+
+static int ft_is_sign(int character)
+{
+ return (character == '+' || character == '-');
+}
+
+int ft_atoi(const char *nptr)
+{
+ int index;
+ int result;
+ int is_pos;
+
+ index = 0;
+ is_pos = 1;
+ result = 0;
+ while (ft_is_space(nptr[index]))
+ index++;
+ while (ft_is_sign(nptr[index]))
+ {
+ if (index > 0 && ft_is_sign(nptr[index -1]))
+ return (0);
+ if (nptr[index++] == '-')
+ is_pos = 0;
+ }
+ while (ft_isdigit(nptr[index]))
+ {
+ if (result != ((result * 10 + (is_pos * (nptr[index] - '0'))) / 10))
+ return ((int)((is_pos + 1) / 2 / -1));
+ result = result * 10 + (nptr[index++] - 48);
+ }
+ if (!is_pos)
+ result = 0 - result;
+ return (result);
+}
diff --git a/libft/ft_bzero.c b/libft/ft_bzero.c
new file mode 100644
index 0000000..51a184d
--- /dev/null
+++ b/libft/ft_bzero.c
@@ -0,0 +1,27 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_bzero.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:31:42 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:31:42 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_bzero(void *s, size_t n)
+{
+ size_t index;
+ char *chars;
+
+ index = 0;
+ chars = (char *)s;
+ while (index < n)
+ {
+ chars[index] = '\0';
+ index++;
+ }
+}
diff --git a/libft/ft_calloc.c b/libft/ft_calloc.c
new file mode 100644
index 0000000..0fcec79
--- /dev/null
+++ b/libft/ft_calloc.c
@@ -0,0 +1,27 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_calloc.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:31:38 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:57:42 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include
+#include
+
+void *ft_calloc(size_t count, size_t size)
+{
+ void *t;
+
+ if (count > 0 && size > SIZE_MAX / count)
+ return (0);
+ t = malloc(count * size);
+ if (t != NULL)
+ ft_bzero(t, count * size);
+ return (t);
+}
diff --git a/libft/ft_isalnum.c b/libft/ft_isalnum.c
new file mode 100644
index 0000000..dc1407d
--- /dev/null
+++ b/libft/ft_isalnum.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isalnum.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:31:32 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:31:32 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_isalnum(int c)
+{
+ return (ft_isalpha(c) || ft_isdigit(c));
+}
diff --git a/libft/ft_isalpha.c b/libft/ft_isalpha.c
new file mode 100644
index 0000000..6fe22f4
--- /dev/null
+++ b/libft/ft_isalpha.c
@@ -0,0 +1,16 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isalpha.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:31:28 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:31:28 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isalpha(int c)
+{
+ return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
+}
diff --git a/libft/ft_isascii.c b/libft/ft_isascii.c
new file mode 100644
index 0000000..3166f70
--- /dev/null
+++ b/libft/ft_isascii.c
@@ -0,0 +1,16 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isascii.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:31:23 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:31:23 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isascii(int c)
+{
+ return (c >= 0 && c <= 127);
+}
diff --git a/libft/ft_isdigit.c b/libft/ft_isdigit.c
new file mode 100644
index 0000000..44360bd
--- /dev/null
+++ b/libft/ft_isdigit.c
@@ -0,0 +1,16 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isdigit.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:31:18 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:31:18 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isdigit(int c)
+{
+ return (c >= '0' && c <= '9');
+}
diff --git a/libft/ft_isprint.c b/libft/ft_isprint.c
new file mode 100644
index 0000000..742c53e
--- /dev/null
+++ b/libft/ft_isprint.c
@@ -0,0 +1,16 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_isprint.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:31:12 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:31:12 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+int ft_isprint(int c)
+{
+ return (c >= 32 && c <= 126);
+}
diff --git a/libft/ft_itoa.c b/libft/ft_itoa.c
new file mode 100644
index 0000000..44aff90
--- /dev/null
+++ b/libft/ft_itoa.c
@@ -0,0 +1,56 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_itoa.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:14:43 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:14:59 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+static int ft_count_size(long int number)
+{
+ int index;
+
+ if (number == 0)
+ return (1);
+ index = 0;
+ while (number)
+ {
+ number = number / 10;
+ index++;
+ }
+ return (index);
+}
+
+char *ft_itoa(int n)
+{
+ long nb;
+ int is_transformed;
+ int mlc_size;
+ char *mlc;
+
+ nb = n;
+ is_transformed = 0;
+ if (n < 0)
+ {
+ nb = (long) n * -1;
+ is_transformed = 1;
+ }
+ mlc_size = ft_count_size(nb) + is_transformed;
+ mlc = ft_calloc(mlc_size + 1, sizeof(char));
+ if (!mlc)
+ return (0);
+ while (mlc_size)
+ {
+ mlc[--mlc_size] = nb % 10 + '0';
+ nb = nb / 10;
+ }
+ if (n < 0)
+ mlc[mlc_size] = '-';
+ return (mlc);
+}
diff --git a/libft/ft_lstadd_back.c b/libft/ft_lstadd_back.c
new file mode 100644
index 0000000..7ce597e
--- /dev/null
+++ b/libft/ft_lstadd_back.c
@@ -0,0 +1,28 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstadd_back.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:15:18 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:17:00 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_lstadd_back(t_list **lst, t_list *new)
+{
+ t_list *tmp;
+
+ tmp = *lst;
+ if (!tmp)
+ {
+ *lst = new;
+ return ;
+ }
+ while (tmp->next)
+ tmp = tmp->next;
+ tmp->next = new;
+}
diff --git a/libft/ft_lstadd_front.c b/libft/ft_lstadd_front.c
new file mode 100644
index 0000000..5a98dce
--- /dev/null
+++ b/libft/ft_lstadd_front.c
@@ -0,0 +1,19 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstadd_front.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:15:42 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:17:07 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_lstadd_front(t_list **lst, t_list *new)
+{
+ new->next = *lst;
+ *lst = new;
+}
diff --git a/libft/ft_lstclear.c b/libft/ft_lstclear.c
new file mode 100644
index 0000000..a727511
--- /dev/null
+++ b/libft/ft_lstclear.c
@@ -0,0 +1,27 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstclear.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:16:00 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:17:17 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include "stdlib.h"
+
+void ft_lstclear(t_list **lst, void (*del)(void *))
+{
+ t_list *tmp;
+
+ while (*lst)
+ {
+ del((*lst)->content);
+ tmp = (*lst)->next;
+ free(*lst);
+ *lst = tmp;
+ }
+}
diff --git a/libft/ft_lstdelone.c b/libft/ft_lstdelone.c
new file mode 100644
index 0000000..2bc207f
--- /dev/null
+++ b/libft/ft_lstdelone.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstdelone.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:16:31 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:17:26 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include "stdlib.h"
+
+void ft_lstdelone(t_list *lst, void (*del)(void *))
+{
+ del(lst->content);
+ free(lst);
+}
diff --git a/libft/ft_lstiter.c b/libft/ft_lstiter.c
new file mode 100644
index 0000000..82bbb48
--- /dev/null
+++ b/libft/ft_lstiter.c
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstiter.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:17:45 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:17:52 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_lstiter(t_list *lst, void (*f)(void *))
+{
+ if (!lst)
+ return ;
+ while (lst)
+ {
+ f(lst->content);
+ lst = lst->next;
+ }
+}
diff --git a/libft/ft_lstlast.c b/libft/ft_lstlast.c
new file mode 100644
index 0000000..22dfbc4
--- /dev/null
+++ b/libft/ft_lstlast.c
@@ -0,0 +1,34 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstlast.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/03 10:49:43 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 10:49:43 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstlast.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:18:29 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:18:42 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+t_list *ft_lstlast(t_list *lst)
+{
+ if (!lst)
+ return (lst);
+ while (lst->next)
+ lst = lst->next;
+ return (lst);
+}
diff --git a/libft/ft_lstnew.c b/libft/ft_lstnew.c
new file mode 100644
index 0000000..a866190
--- /dev/null
+++ b/libft/ft_lstnew.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstnew.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:19:10 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:19:23 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include
+
+t_list *ft_lstnew(void *content)
+{
+ t_list *list;
+
+ list = malloc(sizeof (t_list));
+ if (!list)
+ return (0);
+ list->content = content;
+ list->next = NULL;
+ return (list);
+}
diff --git a/libft/ft_lstsize.c b/libft/ft_lstsize.c
new file mode 100644
index 0000000..45e2840
--- /dev/null
+++ b/libft/ft_lstsize.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_lstsize.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:19:37 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:20:14 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_lstsize(t_list *lst)
+{
+ int index;
+
+ index = 0;
+ while (lst)
+ {
+ lst = lst->next;
+ index++;
+ }
+ return (index);
+}
diff --git a/libft/ft_memchr.c b/libft/ft_memchr.c
new file mode 100644
index 0000000..0742044
--- /dev/null
+++ b/libft/ft_memchr.c
@@ -0,0 +1,29 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memchr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:20:40 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:42:55 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_memchr(const void *s, int c, size_t n)
+{
+ unsigned char *chars;
+ size_t index;
+
+ chars = (unsigned char *) s;
+ index = 0;
+ while (index < n)
+ {
+ if (chars[index] == (unsigned char )c)
+ return (chars + index);
+ index++;
+ }
+ return (0);
+}
diff --git a/libft/ft_memcmp.c b/libft/ft_memcmp.c
new file mode 100644
index 0000000..217b1ca
--- /dev/null
+++ b/libft/ft_memcmp.c
@@ -0,0 +1,34 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memcmp.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:44:22 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:44:26 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_memcmp(const void *s1, const void *s2, size_t n)
+{
+ int index;
+ unsigned char *s1_char;
+ unsigned char *s2_char;
+
+ if (s1 == s2 || n == 0)
+ return (0);
+ s1_char = ((unsigned char *) s1);
+ s2_char = ((unsigned char *) s2);
+ index = 0;
+ while (index < (int)n)
+ {
+ if (s1_char[index] == s2_char[index])
+ index++;
+ else
+ return (s1_char[index] - s2_char[index]);
+ }
+ return (0);
+}
diff --git a/libft/ft_memcpy.c b/libft/ft_memcpy.c
new file mode 100644
index 0000000..d27c8dc
--- /dev/null
+++ b/libft/ft_memcpy.c
@@ -0,0 +1,28 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memcpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:45:43 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:45:55 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_memcpy(void *dest, const void *src, size_t n)
+{
+ size_t index;
+
+ if (!dest && !src)
+ return (0);
+ index = 0;
+ while (n > index)
+ {
+ ((char *)dest)[index] = ((char *) src)[index];
+ index++;
+ }
+ return (dest);
+}
diff --git a/libft/ft_memmove.c b/libft/ft_memmove.c
new file mode 100644
index 0000000..881b771
--- /dev/null
+++ b/libft/ft_memmove.c
@@ -0,0 +1,35 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memmove.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:46:06 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:46:15 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_memmove(void *dest, const void *src, size_t n)
+{
+ char *tmp_dest;
+ const char *tmp_src;
+
+ tmp_dest = dest;
+ tmp_src = src;
+ if (tmp_dest == tmp_src)
+ return (dest);
+ if (tmp_dest < tmp_src)
+ while (n--)
+ *tmp_dest++ = *tmp_src++;
+ else
+ {
+ tmp_dest += n;
+ tmp_src += n;
+ while (n--)
+ *--tmp_dest = *--tmp_src;
+ }
+ return (dest);
+}
diff --git a/libft/ft_memset.c b/libft/ft_memset.c
new file mode 100644
index 0000000..2f78c05
--- /dev/null
+++ b/libft/ft_memset.c
@@ -0,0 +1,26 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_memset.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:31:02 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:31:55 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void *ft_memset(void *s, int c, size_t n)
+{
+ size_t index;
+
+ index = 1;
+ while (index <= n)
+ {
+ ((char *) s)[index -1] = (char) c;
+ index++;
+ }
+ return (s);
+}
diff --git a/libft/ft_putchar_fd.c b/libft/ft_putchar_fd.c
new file mode 100644
index 0000000..6377159
--- /dev/null
+++ b/libft/ft_putchar_fd.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putchar_fd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:30:56 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:30:56 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include
+
+void ft_putchar_fd(char c, int fd)
+{
+ write(fd, &c, 1);
+}
diff --git a/libft/ft_putendl_fd.c b/libft/ft_putendl_fd.c
new file mode 100644
index 0000000..db56157
--- /dev/null
+++ b/libft/ft_putendl_fd.c
@@ -0,0 +1,19 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putendl_fd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:30:49 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:30:49 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putendl_fd(char *s, int fd)
+{
+ ft_putstr_fd(s, fd);
+ ft_putchar_fd('\n', fd);
+}
diff --git a/libft/ft_putnbr_fd.c b/libft/ft_putnbr_fd.c
new file mode 100644
index 0000000..a252fff
--- /dev/null
+++ b/libft/ft_putnbr_fd.c
@@ -0,0 +1,37 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putnbr_fd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:30:42 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 17:05:37 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include "unistd.h"
+
+void ft_putnbr_fd(int n, int fd)
+{
+ unsigned int nb;
+ char ch;
+
+ nb = (unsigned int)n;
+ if (n < 0)
+ {
+ nb = nb * -1;
+ write (fd, "-", 1);
+ }
+ if (nb <= 9)
+ {
+ ch = nb + '0';
+ write(fd, &ch, 1);
+ }
+ if (nb > 9)
+ {
+ ft_putnbr_fd(nb / 10, fd);
+ ft_putnbr_fd(nb % 10, fd);
+ }
+}
diff --git a/libft/ft_putstr_fd.c b/libft/ft_putstr_fd.c
new file mode 100644
index 0000000..fa218c1
--- /dev/null
+++ b/libft/ft_putstr_fd.c
@@ -0,0 +1,27 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_putstr_fd.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:30:32 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:33:24 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+void ft_putstr_fd(char *s, int fd)
+{
+ int index;
+
+ if (!s)
+ return ;
+ index = 0;
+ while (s[index] != '\0')
+ {
+ ft_putchar_fd(s[index], fd);
+ index++;
+ }
+}
diff --git a/libft/ft_split.c b/libft/ft_split.c
new file mode 100644
index 0000000..5df377f
--- /dev/null
+++ b/libft/ft_split.c
@@ -0,0 +1,102 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_split.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/11 10:26:30 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:48:18 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include
+
+static int count_delimiter(const char *string, char delimiter)
+{
+ int index;
+ int delimiters;
+
+ index = 0;
+ delimiters = 0;
+ while (string[index])
+ {
+ while (string[index] == delimiter)
+ index++;
+ if (string[index])
+ {
+ while (string[index] && string[index] != delimiter)
+ index++;
+ delimiters++;
+ }
+ }
+ return (delimiters);
+}
+
+static void ft_free(char **words_list)
+{
+ int index;
+
+ index = 0;
+ while (words_list[index])
+ free(words_list[index++]);
+ free(words_list);
+}
+
+static char **fill_array(const char *s, char c, char **words_list)
+{
+ int i;
+ int delimiters;
+ int word_s;
+
+ i = 0;
+ delimiters = 0;
+ while (s[i])
+ {
+ word_s = 0;
+ if (s[i] != c && i + word_s < (int) ft_strlen(s))
+ {
+ while (s[i + word_s] != c && i + word_s < (int) ft_strlen(s))
+ word_s++;
+ words_list[delimiters] = ft_substr(s, ((unsigned int) i), word_s);
+ if (!words_list[delimiters])
+ {
+ ft_free(words_list);
+ return (NULL);
+ }
+ i = i + word_s -1;
+ delimiters++;
+ }
+ i++;
+ }
+ return (words_list);
+}
+
+char **ft_split(char const *s, char c)
+{
+ char **words_list;
+ int count_delimiters;
+
+ if (!s)
+ return (NULL);
+ count_delimiters = count_delimiter(s, c);
+ words_list = ft_calloc(count_delimiters + 1, sizeof(char *));
+ if (!words_list)
+ return (NULL);
+ return (fill_array(s, c, words_list));
+}
+
+//#include
+//int main(void)
+//{
+// char **t = ft_split(NULL, ' ');
+// int index = 0;
+//
+// while(t[index])
+// {
+// printf("%s--\n", t[index]);
+// index++;
+// }
+// return (0);
+//}
diff --git a/libft/ft_strchr.c b/libft/ft_strchr.c
new file mode 100644
index 0000000..c6c890a
--- /dev/null
+++ b/libft/ft_strchr.c
@@ -0,0 +1,29 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strchr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:30:28 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 16:52:20 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strchr(const char *s, int c)
+{
+ size_t index;
+
+ index = 0;
+ if ((char)c == '\0')
+ return ((char *) &s[ft_strlen(s)]);
+ while ((char)s[index])
+ {
+ if ((char)s[index] == (char)c)
+ return ((char *) s + index);
+ index++;
+ }
+ return (NULL);
+}
diff --git a/libft/ft_strdup.c b/libft/ft_strdup.c
new file mode 100644
index 0000000..268cc3e
--- /dev/null
+++ b/libft/ft_strdup.c
@@ -0,0 +1,32 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strdup.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:30:23 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:30:23 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include
+#include "libft.h"
+
+char *ft_strdup(const char *source)
+{
+ void *v;
+ int index;
+
+ v = malloc(ft_strlen(source) + 1 * sizeof (char));
+ if (!v)
+ return (v);
+ index = 0;
+ while (source[index])
+ {
+ ((char *)v)[index] = source[index];
+ index++;
+ }
+ ((char *)v)[index] = '\0';
+ return (v);
+}
diff --git a/libft/ft_striteri.c b/libft/ft_striteri.c
new file mode 100644
index 0000000..476f673
--- /dev/null
+++ b/libft/ft_striteri.c
@@ -0,0 +1,23 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_striteri.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:48:52 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:49:04 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+void ft_striteri(char *s, void (*f)(unsigned int, char*))
+{
+ int index;
+
+ index = 0;
+ while (s[index])
+ {
+ f(index, &s[index]);
+ index++;
+ }
+}
diff --git a/libft/ft_strjoin.c b/libft/ft_strjoin.c
new file mode 100644
index 0000000..4c76c60
--- /dev/null
+++ b/libft/ft_strjoin.c
@@ -0,0 +1,44 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strjoin.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:30:19 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:30:19 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include
+#include "libft.h"
+
+static int ft_fill(void **mlc, char const *text, int mlc_index)
+{
+ int index;
+
+ index = 0;
+ while (text[index])
+ {
+ ((char *)mlc)[mlc_index] = text[index];
+ index++;
+ mlc_index++;
+ }
+ return (mlc_index);
+}
+
+char *ft_strjoin(char const *s1, char const *s2)
+{
+ void *mlc;
+ int size;
+
+ if (!s1 || !s2)
+ return (NULL);
+ mlc = malloc(sizeof(char ) * (ft_strlen(s1) + ft_strlen(s2)) + 1);
+ if (!mlc)
+ return (NULL);
+ size = ft_fill(mlc, s1, 0);
+ size = ft_fill(mlc, s2, size);
+ ((char *) mlc)[size] = '\0';
+ return ((char *) mlc);
+}
diff --git a/libft/ft_strlcat.c b/libft/ft_strlcat.c
new file mode 100644
index 0000000..3948610
--- /dev/null
+++ b/libft/ft_strlcat.c
@@ -0,0 +1,34 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strlcat.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:30:14 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 16:41:59 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+size_t ft_strlcat(char *dst, const char *src, size_t size)
+{
+ size_t index;
+ size_t dst_size;
+
+ index = 0;
+ dst_size = ft_strlen(dst);
+ if (size < dst_size)
+ return (ft_strlen(src) + size);
+ if (size <= 0)
+ return (ft_strlen(src));
+ while (src[index] && dst_size < size - 1)
+ {
+ dst[dst_size] = src[index];
+ dst_size++;
+ index++;
+ }
+ dst[dst_size] = '\0';
+ return (dst_size + ft_strlen(&src[index]));
+}
diff --git a/libft/ft_strlcpy.c b/libft/ft_strlcpy.c
new file mode 100644
index 0000000..d4a52ad
--- /dev/null
+++ b/libft/ft_strlcpy.c
@@ -0,0 +1,29 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strlcpy.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:29:27 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:29:27 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+size_t ft_strlcpy(char *dst, const char *src, size_t size)
+{
+ size_t index;
+
+ if (size == 0)
+ return (ft_strlen (src));
+ index = 0;
+ while (src[index] && index < size -1)
+ {
+ dst[index] = src[index];
+ index++;
+ }
+ dst[index] = '\0';
+ return (ft_strlen (src));
+}
diff --git a/libft/ft_strlen.c b/libft/ft_strlen.c
new file mode 100644
index 0000000..c5209dd
--- /dev/null
+++ b/libft/ft_strlen.c
@@ -0,0 +1,23 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strlen.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:29:20 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:31:55 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+size_t ft_strlen(const char *s)
+{
+ size_t index;
+
+ index = 0;
+ while (s[index])
+ index++;
+ return (index);
+}
diff --git a/libft/ft_strmapi.c b/libft/ft_strmapi.c
new file mode 100644
index 0000000..091a481
--- /dev/null
+++ b/libft/ft_strmapi.c
@@ -0,0 +1,32 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strmapi.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/17 17:49:43 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:49:46 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include
+
+char *ft_strmapi(char const *s, char (*f)(unsigned int, char))
+{
+ unsigned int index;
+ char *mlc;
+
+ index = 0;
+ mlc = malloc(sizeof(char) * ft_strlen(s) + 1);
+ if (!mlc)
+ return (NULL);
+ while (s[index])
+ {
+ mlc[index] = f(index, s[index]);
+ index++;
+ }
+ mlc[index] = '\0';
+ return (mlc);
+}
diff --git a/libft/ft_strncmp.c b/libft/ft_strncmp.c
new file mode 100644
index 0000000..1c539ef
--- /dev/null
+++ b/libft/ft_strncmp.c
@@ -0,0 +1,31 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strncmp.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:29:12 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:29:12 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_strncmp(const char *s1, const char *s2, size_t n)
+{
+ size_t index;
+ unsigned char t1;
+ unsigned char t2;
+
+ index = 0;
+ while ((s1[index] || s2[index]) && index < n)
+ {
+ t1 = s1[index];
+ t2 = s2[index];
+ if (t1 < t2 || t1 > t2)
+ return (t1 - t2);
+ index++;
+ }
+ return (0);
+}
diff --git a/libft/ft_strnstr.c b/libft/ft_strnstr.c
new file mode 100644
index 0000000..11b4706
--- /dev/null
+++ b/libft/ft_strnstr.c
@@ -0,0 +1,40 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strnstr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:29:02 by jbadaire #+# #+# */
+/* Updated: 2023/10/02 23:21:24 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strnstr(const char *haystack, const char *needle, size_t len)
+{
+ size_t text_index;
+ size_t word_index;
+
+ text_index = 0;
+ word_index = 0;
+ if (needle[0] == 0 || haystack == needle)
+ return ((char *) haystack);
+ while (haystack[text_index] && text_index < len)
+ {
+ if (haystack[text_index] && haystack[text_index] == needle[word_index])
+ {
+ while (haystack[text_index + word_index] == needle[word_index])
+ {
+ if (++word_index + text_index > len)
+ return (NULL);
+ if (needle[word_index] == '\0')
+ return ((char *) &haystack[text_index]);
+ }
+ word_index = 0;
+ }
+ text_index++;
+ }
+ return (NULL);
+}
diff --git a/libft/ft_strrchr.c b/libft/ft_strrchr.c
new file mode 100644
index 0000000..55830d1
--- /dev/null
+++ b/libft/ft_strrchr.c
@@ -0,0 +1,29 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strrchr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:28:54 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:50:41 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+char *ft_strrchr(const char *s, int c)
+{
+ int index;
+
+ index = (int)ft_strlen(s);
+ while (index >= 0)
+ {
+ if ((unsigned char )s[index] == (char)c)
+ {
+ return ((char *) s + index);
+ }
+ index--;
+ }
+ return (NULL);
+}
diff --git a/libft/ft_strtrim.c b/libft/ft_strtrim.c
new file mode 100644
index 0000000..e2c37b6
--- /dev/null
+++ b/libft/ft_strtrim.c
@@ -0,0 +1,34 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strtrim.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/01/11 10:08:19 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:50:54 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+#include
+
+char *ft_strtrim(char const *s1, char const *set)
+{
+ int s_start;
+ int s_end;
+ char *mlc;
+
+ s_start = 0;
+ s_end = (int)ft_strlen(s1);
+ while (s_start < s_end && ft_strchr(set, s1[s_start]) != NULL)
+ s_start++;
+ while (s_end > s_start && ft_strchr(set, s1[s_end - 1]) != NULL)
+ s_end--;
+ mlc = malloc(sizeof(char) * s_end - s_start + 1);
+ if (!mlc)
+ return (NULL);
+ ft_memcpy(mlc, s1 + s_start, s_end - s_start);
+ mlc[s_end - s_start] = *"\0";
+ return (mlc);
+}
diff --git a/libft/ft_substr.c b/libft/ft_substr.c
new file mode 100644
index 0000000..1261743
--- /dev/null
+++ b/libft/ft_substr.c
@@ -0,0 +1,41 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_substr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:28:46 by jbadaire #+# #+# */
+/* Updated: 2023/01/17 17:51:18 by jbadaire ### ########lyon.fr */
+/* */
+/* ************************************************************************** */
+
+#include
+#include "libft.h"
+
+char *ft_substr(char const *s, unsigned int start, size_t len)
+{
+ char *mlc;
+ size_t index;
+ size_t s_size;
+
+ if (!s || s[0] == '\0')
+ return (ft_strdup(""));
+ s_size = ft_strlen(s);
+ if (start >= s_size)
+ return (ft_strdup(""));
+ if (len > (s_size - start))
+ len = s_size - start;
+ mlc = malloc(sizeof (char) * (len + 1));
+ if (!mlc)
+ return (NULL);
+ index = 0;
+ while (s[index] && index < len)
+ {
+ mlc[index] = s[start];
+ start++;
+ index++;
+ }
+ mlc[index] = '\0';
+ return (mlc);
+}
diff --git a/libft/ft_tolower.c b/libft/ft_tolower.c
new file mode 100644
index 0000000..8380ef2
--- /dev/null
+++ b/libft/ft_tolower.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_tolower.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:28:27 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:28:27 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_tolower(int c)
+{
+ if (c >= 65 && c <= 90)
+ return (c + 32);
+ return (c);
+}
diff --git a/libft/ft_toupper.c b/libft/ft_toupper.c
new file mode 100644
index 0000000..56460e4
--- /dev/null
+++ b/libft/ft_toupper.c
@@ -0,0 +1,20 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_toupper.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/24 14:28:16 by jbadaire #+# #+# */
+/* Updated: 2022/11/24 14:28:16 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+int ft_toupper(int c)
+{
+ if (c >= 97 && c <= 122)
+ return (c - 32);
+ return (c);
+}
diff --git a/libft/get_next_line.c b/libft/get_next_line.c
new file mode 100644
index 0000000..4e815cc
--- /dev/null
+++ b/libft/get_next_line.c
@@ -0,0 +1,45 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* get_next_line.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/05/04 12:38:42 by jbadaire #+# #+# */
+/* Updated: 2023/09/07 13:20:30 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+/**
+ * The function reads a file descriptor,
+ * and returns the next line of text from the file.
+ *
+ * @param file_descriptor The file descriptor is an integer,
+ * value that represents an open file in the operating system. It
+ * is used to read or write data to/from the file. In this case,
+ * the function `get_next_line` takes a file descriptor as a
+ * parameter to read data from a file.
+ *
+ * @return The function `get_next_line` is returning a pointer to,
+ * a string that contains the next line from the file
+ * associated with the given file descriptor.
+ */
+char *get_next_line(int file_descriptor)
+{
+ static char buffer[BUFFER_SIZE + 1];
+ int chars_readed;
+ char *returned_line;
+
+ chars_readed = BUFFER_SIZE;
+ returned_line = NULL;
+ while (chars_readed > 0)
+ {
+ if (ft_has_new_line(buffer, &returned_line))
+ return (returned_line);
+ chars_readed = read(file_descriptor, buffer, BUFFER_SIZE);
+ }
+ returned_line = ft_growth_line(returned_line, buffer, chars_readed);
+ return (returned_line);
+}
diff --git a/libft/get_next_line_utils.c b/libft/get_next_line_utils.c
new file mode 100644
index 0000000..59ee108
--- /dev/null
+++ b/libft/get_next_line_utils.c
@@ -0,0 +1,165 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* get_next_line_utils.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/05/04 12:37:57 by jbadaire #+# #+# */
+/* Updated: 2023/09/07 13:45:53 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft.h"
+
+/**
+ * The function shifts the contents of a buffer by a given length,
+ * and fills the remaining space with zeros.
+ *
+ * @param buffer A pointer to a character array
+ * (string) that represents a buffer.
+ * @param len The length of the portion of the buffer
+ * that needs to be switched/moved to the beginning of the buffer.
+ */
+void ft_mem_switch(char *buffer, int len)
+{
+ int index;
+
+ index = 0;
+ while (index + len < BUFFER_SIZE)
+ {
+ buffer[index] = buffer[len + index];
+ index++;
+ }
+ ft_fill_of_zero(buffer, index);
+}
+
+/**
+ * The function fills a character buffer with null characters
+ * starting from a given index until the end of the buffer or
+ * until a non-null character is encountered.
+ *
+ * @param buffer A pointer to a character array
+ * (string) that needs to be filled with null characters.
+ * @param index The parameter "index" is an integer
+ * variable that represents the starting index of the buffer array where
+ * the function will start filling with null characters ('\0').
+ */
+void ft_fill_of_zero(char *buffer, int index)
+{
+ while (buffer[index] && index < BUFFER_SIZE)
+ buffer[index++] = '\0';
+}
+
+/**
+ * The function concatenates two strings and returns the result.
+ *
+ * @param ch_readed A pointer to a string that
+ * has already been allocated and contains some characters.
+ * @param buf The buffer parameter is a pointer to a
+ * character array that contains the characters to be added to the
+ * r_line.
+ * @param nb_of_char nb_of_char is the number
+ * of characters to be added to the string.
+ * @param len_line The length of the string "r_line".
+ *
+ * @return a pointer to a newly allocated string that
+ * is the concatenation of the input strings `r_line` and `buffer`.
+ */
+char *ft_str_join(char *r_line, char *buf, int nb_of_char, int len_line)
+{
+ int index;
+ char *result;
+
+ if (len_line + nb_of_char <= 0)
+ return (NULL);
+ result = malloc((len_line + nb_of_char + 1) * sizeof(char));
+ if (!result)
+ return (NULL);
+ index = 0;
+ while (r_line && r_line[index])
+ {
+ result[index] = r_line[index];
+ index++;
+ }
+ while (index < (len_line + nb_of_char))
+ {
+ result[index] = *buf;
+ index++;
+ buf++;
+ }
+ return (result[index] = '\0', result);
+}
+
+/**
+ * The function takes in a string, a buffer, and the number of characters read,
+ * and returns a new string that is the concatenation of the two input strings.
+ *
+ * @param returned_line The parameter `returned_line` is a pointer
+ * to a character array that represents the line that has
+ * been read from a file or input stream.
+ * It may be NULL if no line has been read yet.
+ *
+ * @param buffer The buffer parameter is a pointer to a character array
+ * that contains the data read from a file or input stream.
+ *
+ * @param chars_readed The parameter `chars_readed` is an integer that represents
+ * the number of characters read from a file
+ * or input stream by a function. It is used in the function `ft_increase_line`
+ * to determine how many characters to append to
+ * the `returned_line` string. If `chars_readed` is
+ *
+ * @return a pointer to a character, which is the updated string
+ * after concatenating the previous string (returned_line)
+ * with the new string (buffer) using the ft_str_join function.
+ * Before returning the updated string, the function also
+ * frees the memory allocated for the previous string using the free function.
+ */
+char *ft_growth_line(char *returned_line, char *buffer, int chars_readed)
+{
+ char *result;
+ int index;
+
+ index = 0;
+ if (chars_readed == -1)
+ return (free(returned_line), NULL);
+ if (returned_line)
+ while (returned_line[index])
+ index++;
+ result = ft_str_join(returned_line, buffer, chars_readed, index);
+ return (free(returned_line), result);
+}
+
+/**
+ * The function checks if a given buffer contains a new line
+ * character and returns a boolean value,
+ * while also increasing the line count and switching memory if necessary.
+ *
+ * @param buffer A pointer to a character array (string) that contains
+ * the input buffer to be searched for a new line character.
+ *
+ * @param returned_line A pointer to a pointer to a char,
+ * which will be used to store the line that is extracted from the buffer.
+ *
+ * @return an enum value of either `_true` or `_false`,
+ * depending on whether a new line character was found in the `buffer` parameter.
+ * Additionally, the function is modifying the `returned_line` parameter
+ * by increasing its size and copying the contents of `buffer` up to the
+ * new line character (if it exists).
+ */
+enum t_boolean ft_has_new_line(char *buffer, char **returned_line)
+{
+ int index;
+ enum t_boolean is_new_line;
+
+ index = 0;
+ is_new_line = _false;
+ while (buffer[index] && buffer[index] != '\n')
+ index++;
+ if (buffer[index] == '\n')
+ is_new_line = _true;
+ *returned_line = ft_growth_line(*returned_line, buffer, ++index);
+ if (returned_line == NULL)
+ return (_false);
+ return (ft_mem_switch(buffer, index), is_new_line);
+}
diff --git a/libft/libft.h b/libft/libft.h
new file mode 100644
index 0000000..66497a0
--- /dev/null
+++ b/libft/libft.h
@@ -0,0 +1,93 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* libft.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jimmy +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2022/11/14 16:20:20 by jbadaire #+# #+# */
+/* Updated: 2023/10/02 23:28:41 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef LIBFT_H
+# define LIBFT_H
+
+# include
+# include "stdlib.h"
+# include "unistd.h"
+
+# ifndef BUFFER_SIZE
+# define BUFFER_SIZE 4
+# endif
+
+int ft_isalpha(int c);
+int ft_isdigit(int c);
+int ft_isalnum(int c);
+int ft_isascii(int c);
+int ft_isprint(int c);
+int ft_toupper(int c);
+int ft_tolower(int c);
+int ft_strncmp(const char *s1, const char *s2, size_t n);
+int ft_atoi(const char *nptr);
+int ft_memcmp(const void *s1, const void *s2, size_t n);
+
+size_t ft_strlen(const char *s);
+size_t ft_strlcat(char *dst, const char *src, size_t size);
+size_t ft_strlcpy(char *dst, const char *src, size_t size);
+
+void *ft_memset(void *s, int c, size_t n);
+void *ft_memmove(void *dest, const void *src, size_t n);
+void ft_bzero(void *s, size_t n);
+void *ft_memcpy(void *dest, const void *src, size_t n);
+void *ft_calloc(size_t count, size_t size);
+void ft_putchar_fd(char c, int fd);
+void ft_putstr_fd(char *s, int fd);
+void ft_putendl_fd(char *s, int fd);
+void ft_putnbr_fd(int n, int fd);
+void *ft_memchr(const void *s, int c, size_t n);
+void ft_striteri(char *s, void (*f)(unsigned int, char*));
+
+char *ft_strchr(const char *s, int c);
+char *ft_strrchr(const char *s, int c);
+char *ft_strnstr(const char *hs, const char *needle, size_t len);
+char *ft_strdup(const char *source);
+char *ft_substr(char const *s, unsigned int start, size_t len);
+char *ft_strjoin(char const *s1, char const *s2);
+char *ft_strtrim(char const *s1, char const *set);
+char *ft_strtrim(char const *s1, char const *set);
+char *ft_itoa(int n);
+char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
+char **ft_split(char const *s, char c);
+/* BONUS PART */
+typedef struct s_list
+{
+ void *content;
+ struct s_list *next;
+} t_list;
+
+t_list *ft_lstnew(void *content);
+void ft_lstadd_front(t_list **lst, t_list *new);
+void ft_lstadd_back(t_list **lst, t_list *new);
+int ft_lstsize(t_list *lst);
+t_list *ft_lstlast(t_list *lst);
+void ft_lstdelone(t_list *lst, void (*del)(void*));
+void ft_lstclear(t_list **lst, void (*del)(void*));
+void ft_lstiter(t_list *lst, void (*f)(void *));
+
+/* GNL PART */
+
+typedef enum t_boolean
+{
+ _false,
+ _true
+} t_boolean;
+
+enum t_boolean ft_has_new_line(char *buffer, char **returned_line);
+
+void ft_mem_switch(char *buffer, int len);
+void ft_fill_of_zero(char *buffer, int index);
+char *ft_str_join(char *r_line, char *buf, int ch_read, int l_line);
+char *ft_growth_line(char *r_line, char *buf, int ch_readed);
+char *get_next_line(int file_descriptor);
+#endif
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..1689c67
--- /dev/null
+++ b/main.c
@@ -0,0 +1,84 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* main.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/02 16:19:55 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 15:45:24 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "so_long.h"
+#include "stdio.h"
+#include "minilibx-linux/mlx.h"
+
+
+int main() {
+
+ t_data data = load_map("/home/jimmy/CLionProjects/so_long/maps/1.ber");
+ t_data *copy_map = clone(data);
+
+ int collectibles;
+ int exit;
+
+ collectibles = 0;
+ exit = 0;
+
+ printf("Is Rectangle: %b", is_rectangle(data));
+ t_location start_location = find_element(data, 'P');
+ printf("\nStart location %zu %zu", start_location.x, start_location.y);
+ t_location exit_location = find_element(data, 'E');
+ printf("\nExit location %zu %zu", exit_location.x, exit_location.y);
+ t_list *list = load_collectibles(data);
+ t_list *copy = list;
+ while (copy->next != NULL) {
+ t_collectible *col = ((t_collectible *) copy->content);
+ printf("\nCollectible: X %zu : Y %zu collected %b", col->location.x, col->location.y, col->collected);
+ copy = copy->next;
+ }
+
+ printf("\nCollectibles Count: %d", count_collectibles(list, _false));
+ printf("\nIs closed: %b", is_closed(data));
+
+ is_solvable(*copy_map, start_location.x, start_location.y);
+ printf("\nSolvable ");
+ size_t index = 0;
+ while (index < data.lenght_y) {
+ printf("\nCopyMAP: %s", copy_map->map[index]);
+ index++;
+ }
+
+ collectibles = count_element(*copy_map, 'C');
+ exit = count_element(*copy_map, 'E');
+ printf("\nStruct error : %b", collectibles != 0 || exit != 0);
+
+ void *mlx;
+
+ mlx = mlx_init();
+ if(!mlx) {
+ return (0);
+ }
+
+ void *window = mlx_new_window(mlx, 1500, 800, "Hello world!");
+
+ void *wall = load_texture("./textures/wall.xpm", mlx);
+ void *grass = load_texture("./textures/grass.xpm", mlx);
+ void *collectible = load_texture("./textures/collectible.xpm", mlx);
+ void *ext = load_texture("./textures/exit.xpm", mlx);
+ void *player = load_texture("./textures/player.xpm", mlx);
+
+ draw_type(mlx, window, wall, data, '1');
+ draw_type(mlx, window, grass, data, '0');
+ draw_type(mlx, window, collectible, data, 'C');
+ draw_type(mlx, window, ext, data, 'E');
+ draw_type(mlx, window, player, data, 'P');
+
+
+ //mlx_hook(window, 2, 1L << 0, on_player_move, &data);
+
+ mlx_loop(mlx);
+
+ return 0;
+}
diff --git a/maps/1.ber b/maps/1.ber
new file mode 100644
index 0000000..915d05c
--- /dev/null
+++ b/maps/1.ber
@@ -0,0 +1,5 @@
+1111111
+10C00P1
+1000001
+10000E1
+1111111
\ No newline at end of file
diff --git a/maps_utils.c b/maps_utils.c
new file mode 100644
index 0000000..ff3ac4e
--- /dev/null
+++ b/maps_utils.c
@@ -0,0 +1,57 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* maps_utils.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/02 18:09:47 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 10:41:46 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+#include "so_long.h"
+#include
+
+t_data load_map(char *path) {
+ size_t index;
+ size_t y;
+ int fd;
+ t_data data;
+
+ index = 0;
+ y = 0;
+ fd = open(path, O_RDONLY);
+ while (get_next_line(fd) != NULL)
+ index++;
+ data.map = malloc((index) * sizeof(char *));
+ if (!data.map)
+ return (data);
+ close(fd);
+ fd = open(path, O_RDONLY);
+ while (y != index) {
+ data.map[y] = ft_strtrim(get_next_line(fd), "\n");
+ y++;
+ }
+ return (data.lenght_y = y, data);
+}
+
+void is_solvable(t_data data, size_t x, size_t y)
+{
+
+ char character;
+ if(data.map[y] == NULL || y > data.lenght_y)
+ return;
+ character = data.map[y][x];
+ if (character == 'O')
+ return ;
+ if (character == '0' || character == 'C' || character == 'P' || character == 'E')
+ {
+ data.map[y][x] = 'O';
+ is_solvable(data, x - 1, y);
+ is_solvable(data, x + 1, y);
+ is_solvable(data, x, y + 1);
+ is_solvable(data,x, y - 1);
+ }
+ return ;
+
+}
\ No newline at end of file
diff --git a/minilibx-linux/.github/workflows/ci.yml b/minilibx-linux/.github/workflows/ci.yml
new file mode 100644
index 0000000..8c880cb
--- /dev/null
+++ b/minilibx-linux/.github/workflows/ci.yml
@@ -0,0 +1,88 @@
+name: Build
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ build:
+
+ runs-on: ${{ matrix.os }}
+ env:
+ DISPLAY: ":99"
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest, macos-latest]
+
+ timeout-minutes: 20
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install mlx dependencies
+ run: |
+ set -x
+ if [ "$RUNNER_OS" == "Linux" ]; then
+ sudo apt-get update -qq
+ sudo apt-get install -y -qq gcc make xorg libxext-dev libbsd-dev
+ elif [ "$RUNNER_OS" == "macOS" ]; then
+ brew install xquartz
+ echo "/usr/X11/bin" >> $GITHUB_PATH
+ else
+ echo "$RUNNER_OS not supported"
+ exit 1
+ fi
+ - name: Setup x11 headless testing environment
+ run: |
+ set -x
+ if [ "$RUNNER_OS" == "Linux" ]; then
+ sudo apt-get install xvfb xdotool valgrind
+ Xvfb $DISPLAY -screen 0 1280x1024x24 &
+ elif [ "$RUNNER_OS" == "macOS" ]; then
+ brew install xdotool
+ defaults write org.x.X11 enable_test_extensions -boolean true
+ sudo Xvfb $DISPLAY -screen 0 1280x1024x24 &
+ else
+ echo "$RUNNER_OS not supported"
+ exit 1
+ fi
+ - name: Run ./configure
+ run: ./configure
+
+ - name: make check Linux
+ if: matrix.os == 'ubuntu-latest'
+ run: make -f Makefile.gen check
+ - name: make check MacOS
+ continue-on-error: true
+ if: matrix.os == 'macos-latest'
+ run: make -f Makefile.gen check
+ # Didn't find a way to simulate inputs on Macos. libxdo seem to no longer work on macos.
+ # It can be partially fixed writing proper unit-tests, thus avoiding the need of libxdo.
+
+ - name: Check leaks from binary "test/mlx-test"
+ run: |
+ cd test
+ if [ "$RUNNER_OS" == "Linux" ]; then
+ echo "Info: Still reachable doesn't matter. Valgrind will return success on thoses reports.
+ It is fine, we searching for lost pointers. Valgrind will return exit status 42 if any block is lost."
+ valgrind --leak-check=full --show-leak-kinds=definite,indirect,possible --errors-for-leak-kinds=definite,indirect,possible --error-exitcode=42 ./mlx-test > /dev/null &
+ PID=$!
+ sleep 30
+ xdotool search --name Title3 windowfocus key Escape
+ xdotool search --name Title2 windowfocus key Escape
+ wait $PID
+ elif [ "$RUNNER_OS" == "macOS" ]; then
+ MallocStackLoggingNoCompact=1
+ ./mlx-test &
+ sleep 30
+ leaks mlx-test
+ pkill mlx-test
+ fi
+
+ - name: Norminette, just for fun
+ continue-on-error: true
+ run: |
+ pip3 install Norminette
+ norminette *.c *.h
+ norminette --version
diff --git a/minilibx-linux/.gitignore b/minilibx-linux/.gitignore
new file mode 100644
index 0000000..9595e5f
--- /dev/null
+++ b/minilibx-linux/.gitignore
@@ -0,0 +1,67 @@
+## Mlx related
+Makefile.gen
+/test/mlx-test
+
+## Editor
+.vscode/*
+*~
+\#*\#
+
+## Other
+.DS_STORE
+
+
+
+## Template from https://github.com/github/gitignore
+# Prerequisites
+*.d
+
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Linker output
+*.ilk
+*.map
+*.exp
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+*.su
+*.idb
+*.pdb
+
+# Kernel Module Compile Results
+*.mod*
+*.cmd
+.tmp_versions/
+modules.order
+Module.symvers
+Mkfile.old
+dkms.conf
\ No newline at end of file
diff --git a/minilibx-linux/LICENSE b/minilibx-linux/LICENSE
new file mode 100644
index 0000000..ed2de25
--- /dev/null
+++ b/minilibx-linux/LICENSE
@@ -0,0 +1,25 @@
+BSD 2-Clause License
+
+Copyright (c) 2021, Ecole 42
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/minilibx-linux/Makefile b/minilibx-linux/Makefile
new file mode 100644
index 0000000..5c418c5
--- /dev/null
+++ b/minilibx-linux/Makefile
@@ -0,0 +1,22 @@
+##
+## Makefile for MiniLibX in /home/boulon/work/c/raytraceur/minilibx
+##
+## Made by Olivier Crouzet
+## Login
+##
+## Started on Tue Oct 5 15:56:43 2004 Olivier Crouzet
+## Last update Tue May 15 15:44:41 2007 Olivier Crouzet
+##
+
+## Please use configure script
+
+
+all : do_configure
+
+do_configure :
+ ./configure
+
+clean :
+ ./configure clean
+
+re : clean all
diff --git a/minilibx-linux/Makefile.mk b/minilibx-linux/Makefile.mk
new file mode 100644
index 0000000..1bae8df
--- /dev/null
+++ b/minilibx-linux/Makefile.mk
@@ -0,0 +1,66 @@
+##
+## Makefile for MiniLibX in /home/boulon/work/c/raytraceur/minilibx
+##
+## Made by Olivier Crouzet
+## Login
+##
+## Started on Tue Oct 5 15:56:43 2004 Olivier Crouzet
+## Last update Tue May 15 15:41:20 2007 Olivier Crouzet
+##
+
+## Please use configure script
+
+
+INC =%%%%
+
+UNAME = $(shell uname)
+CC = gcc
+ifeq ($(UNAME),FreeBSD)
+ CC = clang
+endif
+
+NAME = libmlx.a
+NAME_UNAME = libmlx_$(UNAME).a
+
+SRC = mlx_init.c mlx_new_window.c mlx_pixel_put.c mlx_loop.c \
+ mlx_mouse_hook.c mlx_key_hook.c mlx_expose_hook.c mlx_loop_hook.c \
+ mlx_int_anti_resize_win.c mlx_int_do_nothing.c \
+ mlx_int_wait_first_expose.c mlx_int_get_visual.c \
+ mlx_flush_event.c mlx_string_put.c mlx_set_font.c \
+ mlx_new_image.c mlx_get_data_addr.c \
+ mlx_put_image_to_window.c mlx_get_color_value.c mlx_clear_window.c \
+ mlx_xpm.c mlx_int_str_to_wordtab.c mlx_destroy_window.c \
+ mlx_int_param_event.c mlx_int_set_win_event_mask.c mlx_hook.c \
+ mlx_rgb.c mlx_destroy_image.c mlx_mouse.c mlx_screen_size.c \
+ mlx_destroy_display.c
+
+OBJ_DIR = obj
+OBJ = $(addprefix $(OBJ_DIR)/,$(SRC:%.c=%.o))
+CFLAGS = -O3 -I$(INC)
+
+all : $(NAME)
+
+$(OBJ_DIR)/%.o: %.c
+ @mkdir -p $(OBJ_DIR)
+ $(CC) $(CFLAGS) $(IFLAGS) -c $< -o $@
+
+$(NAME) : $(OBJ)
+ ar -r $(NAME) $(OBJ)
+ ranlib $(NAME)
+ cp $(NAME) $(NAME_UNAME)
+
+check: all
+ @test/run_tests.sh
+
+show:
+ @printf "NAME : $(NAME)\n"
+ @printf "NAME_UNAME : $(NAME_UNAME)\n"
+ @printf "CC : $(CC)\n"
+ @printf "CFLAGS : $(CFLAGS)\n"
+ @printf "SRC :\n $(SRC)\n"
+ @printf "OBJ :\n $(OBJ)\n"
+
+clean :
+ rm -rf $(OBJ_DIR)/ $(NAME) $(NAME_UNAME) *~ core *.core
+
+.PHONY: all check show clean
diff --git a/minilibx-linux/README.md b/minilibx-linux/README.md
new file mode 100755
index 0000000..cb60744
--- /dev/null
+++ b/minilibx-linux/README.md
@@ -0,0 +1,55 @@
+[![Build](https://github.com/42Paris/minilibx-linux/actions/workflows/ci.yml/badge.svg)](https://github.com/42Paris/minilibx-linux/actions/workflows/ci.yml)
+
+This is the MinilibX, a simple X-Window (X11R6) programming API
+in C, designed for students, suitable for X-beginners.
+
+
+Contents
+
+ - source code in C to create the mlx library
+ - man pages (in man/ directory)
+ - a test program (in test/ directory) is built
+ with the library
+ - a public include file mlx.h
+ - a tiny configure script to generate an appropriate Makefile.gen
+
+Requirements for Linux
+
+ - MinilibX only support TrueColor visual type (8,15,16,24 or 32 bits depth)
+ - gcc
+ - make
+ - X11 include files (package xorg)
+ - XShm extension must be present (package libxext-dev)
+ - Utility functions from BSD systems - development files (package libbsd-dev)
+ - **e.g. _sudo apt-get install gcc make xorg libxext-dev libbsd-dev_ (Debian/Ubuntu)**
+
+Requirements for MacOS
+ - [Xquartz](https://www.xquartz.org/)
+
+```bash
+➜ ~ Brew install Xquartz
+➜ ~ reboot
+➜ ~ xeyes # run an hello world X11 app
+```
+
+MlX Color Opacity / Transparency / Alpha (32 bits depth)
+ - 0xFF (fully transparent) or 0x00 (fully opaque)
+
+Compile MinilibX
+
+ - run ./configure or make
+ both will make a few tests, create Makefile.gen
+ and then automatically run make on this generated Makefile.gen .
+ libmlx.a and libmlx_$(HOSTTYPE).a are created.
+ test/mlx-test binary is also created.
+
+
+Install MinilibX
+
+ - no installation script is provided. You may want to install
+ - libmlx.a and/or libmlx_$(HOSTTYPE).a in /usr/X11/lib or /usr/local/lib
+ - mlx.h in /usr/X11/include or /usr/local/include
+ - man/man3/mlx*.1 in /usr/X11/man/man3 or /usr/local/man/man3
+
+
+ Olivier CROUZET - 2014-01-06 -
diff --git a/minilibx-linux/configure b/minilibx-linux/configure
new file mode 100755
index 0000000..18d1e4d
--- /dev/null
+++ b/minilibx-linux/configure
@@ -0,0 +1,126 @@
+#!/usr/bin/env sh
+
+set -e
+
+BOLD="\033[1m"
+RESET="\033[0m"
+LIGHT_RED="\033[91m"
+LIGHT_GREEN="\033[92m"
+LIGHT_CYAN="\033[96m"
+
+logging(){
+ local type=$1; shift
+ printf "${LIGHT_CYAN}${BOLD}configure${RESET} [%b] : %b\n" "$type" "$*"
+}
+log_info(){
+ logging "${LIGHT_GREEN}info${RESET}" "$@"
+}
+log_error(){
+ logging "${LIGHT_RED}error${RESET}" "$@" >&2
+}
+
+# find and print x11 header path
+get_xlib_include_path(){
+ local result=""
+
+ for inc in \
+ /usr/X11/include \
+ /usr/X11R6/include \
+ /usr/X11R5/include \
+ /usr/X11R4/include \
+ \
+ /usr/include \
+ /usr/include/X11 \
+ /usr/include/X11R6 \
+ /usr/include/X11R5 \
+ /usr/include/X11R4 \
+ \
+ /usr/local/X11/include \
+ /usr/local/X11R6/include \
+ /usr/local/X11R5/include \
+ /usr/local/X11R4/include \
+ \
+ /usr/local/include/X11 \
+ /usr/local/include/X11R6 \
+ /usr/local/include/X11R5 \
+ /usr/local/include/X11R4 \
+ \
+ /usr/X386/include \
+ /usr/x386/include \
+ /usr/XFree86/include/X11 \
+ \
+ /usr/local/include \
+ /usr/athena/include \
+ /usr/local/x11r5/include \
+ /usr/lpp/Xamples/include \
+ \
+ /usr/openwin/include \
+ /usr/openwin/share/include
+ do
+ if [ -f "$inc/X11/Xlib.h" -a -f "$inc/X11/extensions/XShm.h" ]; then
+ result=$inc
+ break
+ fi
+ done
+ echo $result
+}
+
+show_help(){
+cat < Makefile.gen
+ cat Makefile.mk | grep -v %%%% >> Makefile.gen
+ log_info 'Generate "test/makefile.gen" from template "test/makefile.mk"'
+ echo "INC=$xlib_inc" > test/Makefile.gen
+ cat test/Makefile.mk | grep -v %%%% >> test/Makefile.gen
+
+ log_info 'Execute "make all" from file "makefile.gen"'
+ ${MAKE} -f Makefile.gen all
+ log_info 'Execute "make all" from file "test/makefile.gen"'
+ (cd test ; ${MAKE} -f Makefile.gen all )
+}
+
+main "$@"
diff --git a/minilibx-linux/man/man1/mlx.1 b/minilibx-linux/man/man1/mlx.1
new file mode 100644
index 0000000..9ad0ac1
--- /dev/null
+++ b/minilibx-linux/man/man1/mlx.1
@@ -0,0 +1,93 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Simple X-Window Interface Library for students
+.SH SYNOPSYS
+#include
+
+.nf
+.I void *
+.fi
+.B mlx_init
+();
+
+.SH DESCRIPTION
+MiniLibX is an easy way to create graphical software,
+without any X-Window programming knowledge. It provides
+simple window creation, a drawing tool, image and basic events
+management.
+
+.SH X-WINDOW CONCEPT
+
+X-Window is a network-oriented graphical system for Unix.
+It is based on two main parts:
+.br
+On one side, your software wants to draw something on the screen and/or
+get keyboard & mouse entries.
+.br
+On the other side, the X-Server manages the screen, keyboard and mouse
+(It is often refered to as a "display").
+.br
+A network connection must be established between these two entities to send
+drawing orders (from the software to the X-Server), and keyboard/mouse
+events (from the X-Server to the software).
+
+.SH INCLUDE FILE
+.B mlx.h
+should be included for a correct use of the MiniLibX API.
+It only contains function prototypes, no structure is needed.
+
+.SH LIBRARY FUNCTIONS
+.P
+First of all, you need to initialize the connection
+between your software and the display.
+Once this connection is established, you'll be able to
+use other MiniLibX functions to send the X-Server messages,
+like "I want to draw a yellow pixel in this window" or "did the
+user hit a key?".
+.P
+The
+.B mlx_init
+function will create this connection. No parameters are needed, ant it will
+return a
+.I "void *"
+identifier, used for further calls to the library routines.
+.P
+All other MiniLibX functions are described in the following man pages:
+
+.TP 20
+.B mlx_new_window
+: manage windows
+.TP 20
+.B mlx_pixel_put
+: draw inside window
+.TP 20
+.B mlx_new_image
+: manipulate images
+.TP 20
+.B mlx_loop
+: handle keyboard or mouse events
+
+.SH LINKING MiniLibX
+To use MiniLibX functions, you'll need to link
+your software with several libraries, including the MiniLibX library itself.
+To do this, simply add the following arguments at linking time:
+
+.B -lmlx -lXext -lX11
+
+You may also need to specify the path to these libraries, using
+the
+.B -L
+flag.
+
+
+.SH RETURN VALUES
+If
+.B mlx_init()
+fails to set up the connection to the X server, it will return NULL, otherwise
+a non-null pointer is returned as a connection identifier.
+
+.SH SEE ALSO
+mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3)
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/man/man1/mlx_loop.1 b/minilibx-linux/man/man1/mlx_loop.1
new file mode 100644
index 0000000..3397ce2
--- /dev/null
+++ b/minilibx-linux/man/man1/mlx_loop.1
@@ -0,0 +1,141 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Handle events
+.SH SYNOPSYS
+
+.nf
+.I int
+.fi
+.B mlx_loop
+(
+.I void *mlx_ptr
+);
+
+.nf
+.I int
+.fi
+.B mlx_key_hook
+(
+.I void *win_ptr, int (*funct_ptr)(), void *param
+);
+
+.nf
+.I int
+.fi
+.B mlx_mouse_hook
+(
+.I void *win_ptr, int (*funct_ptr)(), void *param
+);
+
+.nf
+.I int
+.fi
+.B mlx_expose_hook
+(
+.I void *win_ptr, int (*funct_ptr)(), void *param
+);
+
+.nf
+.I int
+.fi
+.B mlx_loop_hook
+(
+.I void *mlx_ptr, int (*funct_ptr)(), void *param
+);
+
+.SH X-WINDOW EVENTS
+
+The X-Window system is bi-directionnal. On one hand, the program sends orders to
+the screen to display pixels, images, and so on. On the other hand,
+it can get information from the keyboard and mouse associated to
+the screen. To do so, the program receives "events" from the keyboard or the
+mouse.
+
+.SH DESCRIPTION
+
+To receive events, you must use
+.B mlx_loop
+(). This function never returns. It is an infinite loop that waits for
+an event, and then calls a user-defined function associated with this event.
+A single parameter is needed, the connection identifier
+.I mlx_ptr
+(see the
+.B mlx manual).
+
+You can assign different functions to the three following events:
+.br
+- A key is pressed
+.br
+- The mouse button is pressed
+.br
+- A part of the window should be re-drawn
+(this is called an "expose" event, and it is your program's job to handle it).
+.br
+
+Each window can define a different function for the same event.
+
+The three functions
+.B mlx_key_hook
+(),
+.B mlx_mouse_hook
+() and
+.B mlx_expose_hook
+() work exactly the same way.
+.I funct_ptr
+is a pointer to the function you want to be called
+when an event occurs. This assignment is specific to the window defined by the
+.I win_ptr
+identifier. The
+.I param
+adress will be passed to the function everytime it is called, and should be
+used to store the parameters it might need.
+
+The syntax for the
+.B mlx_loop_hook
+() function is identical to the previous ones, but the given function will be
+called when no event occurs.
+
+When it catches an event, the MiniLibX calls the corresponding function
+with fixed parameters:
+.nf
+
+ expose_hook(void *param);
+ key_hook(int keycode,void *param);
+ mouse_hook(int button,int x,int y,void *param);
+ loop_hook(void *param);
+
+.fi
+These function names are arbitrary. They here are used to distinguish
+parameters according to the event. These functions are NOT part of the
+MiniLibX.
+
+.I param
+is the address specified in the mlx_*_hook calls. This address is never
+used nor modified by the MiniLibX. On key and mouse events, additional
+information is passed:
+.I keycode
+tells you which key is pressed (look for the X11 include file "keysymdef.h"),
+(
+.I x
+,
+.I y
+) are the coordinates of the mouse click in the window, and
+.I button
+tells you which mouse button was pressed.
+
+.SH GOING FURTHER WITH EVENTS
+The MiniLibX provides a much generic access to all X-Window events. The
+.I mlx.h
+include define
+.B mlx_hook()
+in the same manner mlx_*_hook functions work. The event and mask values
+will be taken from the X11 include file "X.h".
+
+See source code of mlx_int_param_event.c to find out how the MiniLibX will
+call your own function for a specific event.
+
+.SH SEE ALSO
+mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3)
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/man/man1/mlx_new_image.1 b/minilibx-linux/man/man1/mlx_new_image.1
new file mode 100644
index 0000000..f2160a2
--- /dev/null
+++ b/minilibx-linux/man/man1/mlx_new_image.1
@@ -0,0 +1,192 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Manipulating images
+.SH SYNOPSYS
+
+.nf
+.I void *
+.fi
+.B mlx_new_image
+(
+.I void *mlx_ptr, int width, int height
+);
+
+.nf
+.I char *
+.fi
+.B mlx_get_data_addr
+(
+.I void *img_ptr, int *bits_per_pixel, int *size_line, int *endian
+);
+
+.nf
+.I int
+.fi
+.B mlx_put_image_to_window
+(
+.I void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y
+);
+
+.nf
+.I unsigned int
+.fi
+.B mlx_get_color_value
+(
+.I void *mlx_ptr, int color
+);
+
+.nf
+.I void *
+.fi
+.B mlx_xpm_to_image
+(
+.I void *mlx_ptr, char **xpm_data, int *width, int *height
+);
+
+.nf
+.I void *
+.fi
+.B mlx_xpm_file_to_image
+(
+.I void *mlx_ptr, char *filename, int *width, int *height
+);
+
+.nf
+.I int
+.fi
+.B mlx_destroy_image
+(
+.I void *mlx_ptr, void *img_ptr
+);
+
+
+.SH DESCRIPTION
+
+.B mlx_new_image
+() creates a new image in memory. It returns a
+.I void *
+identifier needed to manipulate this image later. It only needs
+the size of the image to be created, using the
+.I width
+and
+.I height
+parameters, and the
+.I mlx_ptr
+connection identifier (see the
+.B mlx
+manual).
+
+The user can draw inside the image (see below), and
+can dump the image inside a specified window at any time to
+display it on the screen. This is done using
+.B mlx_put_image_to_window
+(). Three identifiers are needed here, for the connection to the
+display, the window to use, and the image (respectively
+.I mlx_ptr
+,
+.I win_ptr
+and
+.I img_ptr
+). The (
+.I x
+,
+.I y
+) coordinates define where the image should be placed in the window.
+
+.B mlx_get_data_addr
+() returns information about the created image, allowing a user
+to modify it later. The
+.I img_ptr
+parameter specifies the image to use. The three next parameters should
+be the addresses of three different valid integers.
+.I bits_per_pixel
+will be filled with the number of bits needed to represent a pixel color
+(also called the depth of the image).
+.I size_line
+is the number of bytes used to store one line of the image in memory.
+This information is needed to move from one line to another in the image.
+.I endian
+tells you wether the pixel color in the image needs to be stored in
+little endian (
+.I endian
+== 0), or big endian (
+.I endian
+== 1).
+
+.B mlx_get_data_addr
+returns a
+.I char *
+address that represents the begining of the memory area where the image
+is stored. From this adress, the first
+.I bits_per_pixel
+bits represent the color of the first pixel in the first line of
+the image. The second group of
+.I bits_per_pixel
+bits represent the second pixel of the first line, and so on.
+Add
+.I size_line
+to the adress to get the begining of the second line. You can reach any
+pixels of the image that way.
+
+.B mlx_destroy_image
+destroys the given image (
+.I img_ptr
+).
+
+.SH STORING COLOR INSIDE IMAGES
+
+Depending on the display, the number of bits used to store a pixel color
+can change. The user usually represents a color in RGB mode, using
+one byte for each component (see
+.B mlx_pixel_put
+manual). This must be translated to fit the
+.I bits_per_pixel
+requirement of the image, and make the color understandable to the X-Server.
+That is the purpose of the
+.B mlx_get_color_value
+() function. It takes a standard RGB
+.I color
+parameter, and returns an
+.I unsigned int
+value.
+The
+.I bits_per_pixel
+least significant bits of this value can be stored in the image.
+
+Keep in mind that the least significant bits position depends on the local
+computer's endian. If the endian of the image (in fact the endian of
+the X-Server's computer) differs from the local endian, then the value should
+be transformed before being used.
+
+.SH XPM IMAGES
+
+The
+.B mlx_xpm_to_image
+() and
+.B mlx_xpm_file_to_image
+() functions will create a new image the same way.
+They will fill it using the specified
+.I xpm_data
+or
+.I filename
+, depending on which function is used.
+Note that MiniLibX does not use the standard
+Xpm library to deal with xpm images. You may not be able to
+read all types of xpm images. It however handles transparency.
+
+.SH RETURN VALUES
+The three functions that create images,
+.B mlx_new_image()
+,
+.B mlx_xpm_to_image()
+and
+.B mlx_xpm_file_to_image()
+, will return NULL if an error occurs. Otherwise they return a non-null pointer
+as an image identifier.
+
+
+.SH SEE ALSO
+mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_loop(3)
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/man/man1/mlx_new_window.1 b/minilibx-linux/man/man1/mlx_new_window.1
new file mode 100644
index 0000000..90f6d47
--- /dev/null
+++ b/minilibx-linux/man/man1/mlx_new_window.1
@@ -0,0 +1,79 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Managing windows
+.SH SYNOPSYS
+
+.nf
+.I void *
+.fi
+.B mlx_new_window
+(
+.I void *mlx_ptr, int size_x, int size_y, char *title
+);
+
+.nf
+.I int
+.fi
+.B mlx_clear_window
+(
+.I void *mlx_ptr, void *win_ptr
+);
+
+.nf
+.I int
+.fi
+.B mlx_destroy_window
+(
+.I void *mlx_ptr, void *win_ptr
+);
+
+
+.SH DESCRIPTION
+The
+.B mlx_new_window
+() function creates a new window on the screen, using the
+.I size_x
+and
+.I size_y
+parameters to determine its size, and
+.I title
+as the text that should be displayed in the window's title bar.
+The
+.I mlx_ptr
+parameter is the connection identifier returned by
+.B mlx_init
+() (see the
+.B mlx
+man page).
+.B mlx_new_window
+() returns a
+.I void *
+window identifier that can be used by other MiniLibX calls.
+Note that the MiniLibX
+can handle an arbitrary number of separate windows.
+
+.B mlx_clear_window
+() and
+.B mlx_destroy_window
+() respectively clear (in black) and destroy the given window. They both have
+the same parameters:
+.I mlx_ptr
+is the screen connection identifier, and
+.I win_ptr
+is a window identifier.
+
+.SH RETURN VALUES
+If
+.B mlx_new_window()
+fails to create a new window (for wathever reason), it will return NULL,
+otherwise a non-null pointer is returned as a window identifier.
+.B mlx_clear_window
+and
+.B mlx_destroy_window
+right now return nothing.
+
+.SH SEE ALSO
+mlx(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3)
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/man/man1/mlx_pixel_put.1 b/minilibx-linux/man/man1/mlx_pixel_put.1
new file mode 100644
index 0000000..258df58
--- /dev/null
+++ b/minilibx-linux/man/man1/mlx_pixel_put.1
@@ -0,0 +1,84 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Drawing inside windows
+.SH SYNOPSYS
+
+.nf
+.I int
+.fi
+.B mlx_pixel_put
+(
+.I void *mlx_ptr, void *win_ptr, int x, int y, int color
+);
+
+.nf
+.I int
+.fi
+.B mlx_string_put
+(
+.I void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string
+);
+
+
+.SH DESCRIPTION
+The
+.B mlx_pixel_put
+() function draws a defined pixel in the window
+.I win_ptr
+using the (
+.I x
+,
+.I y
+) coordinates, and the specified
+.I color
+\&. The origin (0,0) is the upper left corner of the window, the x and y axis
+respectively pointing right and down. The connection
+identifier,
+.I mlx_ptr
+, is needed (see the
+.B mlx
+man page).
+
+Parameters for
+.B mlx_string_put
+() have the same meaning. Instead of a simple pixel, the specified
+.I string
+will be displayed at (
+.I x
+,
+.I y
+).
+
+In both functions, it is impossible to display anything outside the
+specified window, nor display in another window in front of the selected one.
+
+.SH COLOR MANAGEMENT
+The
+.I color
+parameter has an integer type. The displayed color needs to be encoded
+in this integer, following a defined scheme. All displayable colors
+can be split in 3 basic colors: red, green and blue. Three associated
+values, in the 0-255 range, represent how much of each color is mixed up
+to create the original color. Theses three values must be set inside the
+integer to display the right color. The three least significant bytes of
+this integer are filled as shown in the picture below:
+
+.TS
+allbox;
+c s s s s
+r c c c c.
+Color Integer
+Interpretation \[*a] R G B
+Bit numbers 31..24 23..16 15..8 7..0
+.TE
+
+While filling the integer, make sure you avoid endian problems. Remember
+that the "blue" byte should always be the least significant one.
+
+
+.SH SEE ALSO
+mlx(3), mlx_new_window(3), mlx_new_image(3), mlx_loop(3)
+
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/man/man3/mlx.3 b/minilibx-linux/man/man3/mlx.3
new file mode 100644
index 0000000..9ad0ac1
--- /dev/null
+++ b/minilibx-linux/man/man3/mlx.3
@@ -0,0 +1,93 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Simple X-Window Interface Library for students
+.SH SYNOPSYS
+#include
+
+.nf
+.I void *
+.fi
+.B mlx_init
+();
+
+.SH DESCRIPTION
+MiniLibX is an easy way to create graphical software,
+without any X-Window programming knowledge. It provides
+simple window creation, a drawing tool, image and basic events
+management.
+
+.SH X-WINDOW CONCEPT
+
+X-Window is a network-oriented graphical system for Unix.
+It is based on two main parts:
+.br
+On one side, your software wants to draw something on the screen and/or
+get keyboard & mouse entries.
+.br
+On the other side, the X-Server manages the screen, keyboard and mouse
+(It is often refered to as a "display").
+.br
+A network connection must be established between these two entities to send
+drawing orders (from the software to the X-Server), and keyboard/mouse
+events (from the X-Server to the software).
+
+.SH INCLUDE FILE
+.B mlx.h
+should be included for a correct use of the MiniLibX API.
+It only contains function prototypes, no structure is needed.
+
+.SH LIBRARY FUNCTIONS
+.P
+First of all, you need to initialize the connection
+between your software and the display.
+Once this connection is established, you'll be able to
+use other MiniLibX functions to send the X-Server messages,
+like "I want to draw a yellow pixel in this window" or "did the
+user hit a key?".
+.P
+The
+.B mlx_init
+function will create this connection. No parameters are needed, ant it will
+return a
+.I "void *"
+identifier, used for further calls to the library routines.
+.P
+All other MiniLibX functions are described in the following man pages:
+
+.TP 20
+.B mlx_new_window
+: manage windows
+.TP 20
+.B mlx_pixel_put
+: draw inside window
+.TP 20
+.B mlx_new_image
+: manipulate images
+.TP 20
+.B mlx_loop
+: handle keyboard or mouse events
+
+.SH LINKING MiniLibX
+To use MiniLibX functions, you'll need to link
+your software with several libraries, including the MiniLibX library itself.
+To do this, simply add the following arguments at linking time:
+
+.B -lmlx -lXext -lX11
+
+You may also need to specify the path to these libraries, using
+the
+.B -L
+flag.
+
+
+.SH RETURN VALUES
+If
+.B mlx_init()
+fails to set up the connection to the X server, it will return NULL, otherwise
+a non-null pointer is returned as a connection identifier.
+
+.SH SEE ALSO
+mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3)
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/man/man3/mlx_loop.3 b/minilibx-linux/man/man3/mlx_loop.3
new file mode 100644
index 0000000..3397ce2
--- /dev/null
+++ b/minilibx-linux/man/man3/mlx_loop.3
@@ -0,0 +1,141 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Handle events
+.SH SYNOPSYS
+
+.nf
+.I int
+.fi
+.B mlx_loop
+(
+.I void *mlx_ptr
+);
+
+.nf
+.I int
+.fi
+.B mlx_key_hook
+(
+.I void *win_ptr, int (*funct_ptr)(), void *param
+);
+
+.nf
+.I int
+.fi
+.B mlx_mouse_hook
+(
+.I void *win_ptr, int (*funct_ptr)(), void *param
+);
+
+.nf
+.I int
+.fi
+.B mlx_expose_hook
+(
+.I void *win_ptr, int (*funct_ptr)(), void *param
+);
+
+.nf
+.I int
+.fi
+.B mlx_loop_hook
+(
+.I void *mlx_ptr, int (*funct_ptr)(), void *param
+);
+
+.SH X-WINDOW EVENTS
+
+The X-Window system is bi-directionnal. On one hand, the program sends orders to
+the screen to display pixels, images, and so on. On the other hand,
+it can get information from the keyboard and mouse associated to
+the screen. To do so, the program receives "events" from the keyboard or the
+mouse.
+
+.SH DESCRIPTION
+
+To receive events, you must use
+.B mlx_loop
+(). This function never returns. It is an infinite loop that waits for
+an event, and then calls a user-defined function associated with this event.
+A single parameter is needed, the connection identifier
+.I mlx_ptr
+(see the
+.B mlx manual).
+
+You can assign different functions to the three following events:
+.br
+- A key is pressed
+.br
+- The mouse button is pressed
+.br
+- A part of the window should be re-drawn
+(this is called an "expose" event, and it is your program's job to handle it).
+.br
+
+Each window can define a different function for the same event.
+
+The three functions
+.B mlx_key_hook
+(),
+.B mlx_mouse_hook
+() and
+.B mlx_expose_hook
+() work exactly the same way.
+.I funct_ptr
+is a pointer to the function you want to be called
+when an event occurs. This assignment is specific to the window defined by the
+.I win_ptr
+identifier. The
+.I param
+adress will be passed to the function everytime it is called, and should be
+used to store the parameters it might need.
+
+The syntax for the
+.B mlx_loop_hook
+() function is identical to the previous ones, but the given function will be
+called when no event occurs.
+
+When it catches an event, the MiniLibX calls the corresponding function
+with fixed parameters:
+.nf
+
+ expose_hook(void *param);
+ key_hook(int keycode,void *param);
+ mouse_hook(int button,int x,int y,void *param);
+ loop_hook(void *param);
+
+.fi
+These function names are arbitrary. They here are used to distinguish
+parameters according to the event. These functions are NOT part of the
+MiniLibX.
+
+.I param
+is the address specified in the mlx_*_hook calls. This address is never
+used nor modified by the MiniLibX. On key and mouse events, additional
+information is passed:
+.I keycode
+tells you which key is pressed (look for the X11 include file "keysymdef.h"),
+(
+.I x
+,
+.I y
+) are the coordinates of the mouse click in the window, and
+.I button
+tells you which mouse button was pressed.
+
+.SH GOING FURTHER WITH EVENTS
+The MiniLibX provides a much generic access to all X-Window events. The
+.I mlx.h
+include define
+.B mlx_hook()
+in the same manner mlx_*_hook functions work. The event and mask values
+will be taken from the X11 include file "X.h".
+
+See source code of mlx_int_param_event.c to find out how the MiniLibX will
+call your own function for a specific event.
+
+.SH SEE ALSO
+mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_new_image(3)
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/man/man3/mlx_new_image.3 b/minilibx-linux/man/man3/mlx_new_image.3
new file mode 100644
index 0000000..f2160a2
--- /dev/null
+++ b/minilibx-linux/man/man3/mlx_new_image.3
@@ -0,0 +1,192 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Manipulating images
+.SH SYNOPSYS
+
+.nf
+.I void *
+.fi
+.B mlx_new_image
+(
+.I void *mlx_ptr, int width, int height
+);
+
+.nf
+.I char *
+.fi
+.B mlx_get_data_addr
+(
+.I void *img_ptr, int *bits_per_pixel, int *size_line, int *endian
+);
+
+.nf
+.I int
+.fi
+.B mlx_put_image_to_window
+(
+.I void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y
+);
+
+.nf
+.I unsigned int
+.fi
+.B mlx_get_color_value
+(
+.I void *mlx_ptr, int color
+);
+
+.nf
+.I void *
+.fi
+.B mlx_xpm_to_image
+(
+.I void *mlx_ptr, char **xpm_data, int *width, int *height
+);
+
+.nf
+.I void *
+.fi
+.B mlx_xpm_file_to_image
+(
+.I void *mlx_ptr, char *filename, int *width, int *height
+);
+
+.nf
+.I int
+.fi
+.B mlx_destroy_image
+(
+.I void *mlx_ptr, void *img_ptr
+);
+
+
+.SH DESCRIPTION
+
+.B mlx_new_image
+() creates a new image in memory. It returns a
+.I void *
+identifier needed to manipulate this image later. It only needs
+the size of the image to be created, using the
+.I width
+and
+.I height
+parameters, and the
+.I mlx_ptr
+connection identifier (see the
+.B mlx
+manual).
+
+The user can draw inside the image (see below), and
+can dump the image inside a specified window at any time to
+display it on the screen. This is done using
+.B mlx_put_image_to_window
+(). Three identifiers are needed here, for the connection to the
+display, the window to use, and the image (respectively
+.I mlx_ptr
+,
+.I win_ptr
+and
+.I img_ptr
+). The (
+.I x
+,
+.I y
+) coordinates define where the image should be placed in the window.
+
+.B mlx_get_data_addr
+() returns information about the created image, allowing a user
+to modify it later. The
+.I img_ptr
+parameter specifies the image to use. The three next parameters should
+be the addresses of three different valid integers.
+.I bits_per_pixel
+will be filled with the number of bits needed to represent a pixel color
+(also called the depth of the image).
+.I size_line
+is the number of bytes used to store one line of the image in memory.
+This information is needed to move from one line to another in the image.
+.I endian
+tells you wether the pixel color in the image needs to be stored in
+little endian (
+.I endian
+== 0), or big endian (
+.I endian
+== 1).
+
+.B mlx_get_data_addr
+returns a
+.I char *
+address that represents the begining of the memory area where the image
+is stored. From this adress, the first
+.I bits_per_pixel
+bits represent the color of the first pixel in the first line of
+the image. The second group of
+.I bits_per_pixel
+bits represent the second pixel of the first line, and so on.
+Add
+.I size_line
+to the adress to get the begining of the second line. You can reach any
+pixels of the image that way.
+
+.B mlx_destroy_image
+destroys the given image (
+.I img_ptr
+).
+
+.SH STORING COLOR INSIDE IMAGES
+
+Depending on the display, the number of bits used to store a pixel color
+can change. The user usually represents a color in RGB mode, using
+one byte for each component (see
+.B mlx_pixel_put
+manual). This must be translated to fit the
+.I bits_per_pixel
+requirement of the image, and make the color understandable to the X-Server.
+That is the purpose of the
+.B mlx_get_color_value
+() function. It takes a standard RGB
+.I color
+parameter, and returns an
+.I unsigned int
+value.
+The
+.I bits_per_pixel
+least significant bits of this value can be stored in the image.
+
+Keep in mind that the least significant bits position depends on the local
+computer's endian. If the endian of the image (in fact the endian of
+the X-Server's computer) differs from the local endian, then the value should
+be transformed before being used.
+
+.SH XPM IMAGES
+
+The
+.B mlx_xpm_to_image
+() and
+.B mlx_xpm_file_to_image
+() functions will create a new image the same way.
+They will fill it using the specified
+.I xpm_data
+or
+.I filename
+, depending on which function is used.
+Note that MiniLibX does not use the standard
+Xpm library to deal with xpm images. You may not be able to
+read all types of xpm images. It however handles transparency.
+
+.SH RETURN VALUES
+The three functions that create images,
+.B mlx_new_image()
+,
+.B mlx_xpm_to_image()
+and
+.B mlx_xpm_file_to_image()
+, will return NULL if an error occurs. Otherwise they return a non-null pointer
+as an image identifier.
+
+
+.SH SEE ALSO
+mlx(3), mlx_new_window(3), mlx_pixel_put(3), mlx_loop(3)
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/man/man3/mlx_new_window.3 b/minilibx-linux/man/man3/mlx_new_window.3
new file mode 100644
index 0000000..90f6d47
--- /dev/null
+++ b/minilibx-linux/man/man3/mlx_new_window.3
@@ -0,0 +1,79 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Managing windows
+.SH SYNOPSYS
+
+.nf
+.I void *
+.fi
+.B mlx_new_window
+(
+.I void *mlx_ptr, int size_x, int size_y, char *title
+);
+
+.nf
+.I int
+.fi
+.B mlx_clear_window
+(
+.I void *mlx_ptr, void *win_ptr
+);
+
+.nf
+.I int
+.fi
+.B mlx_destroy_window
+(
+.I void *mlx_ptr, void *win_ptr
+);
+
+
+.SH DESCRIPTION
+The
+.B mlx_new_window
+() function creates a new window on the screen, using the
+.I size_x
+and
+.I size_y
+parameters to determine its size, and
+.I title
+as the text that should be displayed in the window's title bar.
+The
+.I mlx_ptr
+parameter is the connection identifier returned by
+.B mlx_init
+() (see the
+.B mlx
+man page).
+.B mlx_new_window
+() returns a
+.I void *
+window identifier that can be used by other MiniLibX calls.
+Note that the MiniLibX
+can handle an arbitrary number of separate windows.
+
+.B mlx_clear_window
+() and
+.B mlx_destroy_window
+() respectively clear (in black) and destroy the given window. They both have
+the same parameters:
+.I mlx_ptr
+is the screen connection identifier, and
+.I win_ptr
+is a window identifier.
+
+.SH RETURN VALUES
+If
+.B mlx_new_window()
+fails to create a new window (for wathever reason), it will return NULL,
+otherwise a non-null pointer is returned as a window identifier.
+.B mlx_clear_window
+and
+.B mlx_destroy_window
+right now return nothing.
+
+.SH SEE ALSO
+mlx(3), mlx_pixel_put(3), mlx_new_image(3), mlx_loop(3)
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/man/man3/mlx_pixel_put.3 b/minilibx-linux/man/man3/mlx_pixel_put.3
new file mode 100644
index 0000000..f4d131e
--- /dev/null
+++ b/minilibx-linux/man/man3/mlx_pixel_put.3
@@ -0,0 +1,81 @@
+.TH MiniLibX 3 "September 19, 2002"
+.SH NAME
+MiniLibX - Drawing inside windows
+.SH SYNOPSYS
+
+.nf
+.I int
+.fi
+.B mlx_pixel_put
+(
+.I void *mlx_ptr, void *win_ptr, int x, int y, int color
+);
+
+.nf
+.I int
+.fi
+.B mlx_string_put
+(
+.I void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string
+);
+
+
+.SH DESCRIPTION
+The
+.B mlx_pixel_put
+() function draws a defined pixel in the window
+.I win_ptr
+using the (
+.I x
+,
+.I y
+) coordinates, and the specified
+.I color
+\&. The origin (0,0) is the upper left corner of the window, the x and y axis
+respectively pointing right and down. The connection
+identifier,
+.I mlx_ptr
+, is needed (see the
+.B mlx
+man page).
+
+Parameters for
+.B mlx_string_put
+() have the same meaning. Instead of a simple pixel, the specified
+.I string
+will be displayed at (
+.I x
+,
+.I y
+).
+
+In both functions, it is impossible to display anything outside the
+specified window, nor display in another window in front of the selected one.
+
+.SH COLOR MANAGEMENT
+The
+.I color
+parameter has an integer type. The displayed color needs to be encoded
+in this integer, following a defined scheme. All displayable colors
+can be split in 3 basic colors: red, green and blue. Three associated
+values, in the 0-255 range, represent how much of each color is mixed up
+to create the original color. Theses three values must be set inside the
+integer to display the right color. The three least significant bytes of
+this integer are filled as shown in the picture below:
+
+.nf
+ | 0 | R | G | B | color integer
+ +---+---+---+---+
+.fi
+
+
+While filling the integer, make sure you avoid endian problems. Remember
+that the "blue" byte should always be the least significant one.
+
+
+.SH SEE ALSO
+mlx(3), mlx_new_window(3), mlx_new_image(3), mlx_loop(3)
+
+
+.SH AUTHOR
+Copyright ol@ - 2002-2014 - Olivier Crouzet
diff --git a/minilibx-linux/mlx.h b/minilibx-linux/mlx.h
new file mode 100644
index 0000000..b323412
--- /dev/null
+++ b/minilibx-linux/mlx.h
@@ -0,0 +1,139 @@
+/*
+** mlx.h for MinilibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Mon Jul 31 16:37:50 2000 Charlie Root
+** Last update Tue May 15 16:23:28 2007 Olivier Crouzet
+*/
+
+/*
+** MinilibX - Please report bugs
+*/
+
+
+/*
+** FR msg - FR msg - FR msg
+**
+** La MinilibX utilise 2 librairies supplementaires qu'il
+** est necessaire de rajouter a la compilation :
+** -lmlx -lXext -lX11
+**
+** La MinilibX permet le chargement des images de type Xpm.
+** Notez que cette implementation est incomplete.
+** Merci de communiquer tout probleme de chargement d'image
+** de ce type.
+*/
+
+
+#ifndef MLX_H
+
+#define MLX_H
+
+
+void *mlx_init();
+/*
+** needed before everything else.
+** return (void *)0 if failed
+*/
+
+
+/*
+** Basic actions
+*/
+
+void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title);
+/*
+** return void *0 if failed
+*/
+int mlx_clear_window(void *mlx_ptr, void *win_ptr);
+int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color);
+/*
+** origin for x & y is top left corner of the window
+** y down is positive
+** color is 0x00RRGGBB
+*/
+
+
+/*
+** Image stuff
+*/
+
+void *mlx_new_image(void *mlx_ptr,int width,int height);
+/*
+** return void *0 if failed
+** obsolete : image2 data is stored using bit planes
+** void *mlx_new_image2(void *mlx_ptr,int width,int height);
+*/
+char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel,
+ int *size_line, int *endian);
+/*
+** endian : 0 = sever X is little endian, 1 = big endian
+** for mlx_new_image2, 2nd arg of mlx_get_data_addr is number_of_planes
+*/
+int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr,
+ int x, int y);
+int mlx_get_color_value(void *mlx_ptr, int color);
+
+
+/*
+** dealing with Events
+*/
+
+int mlx_mouse_hook (void *win_ptr, int (*funct_ptr)(), void *param);
+int mlx_key_hook (void *win_ptr, int (*funct_ptr)(), void *param);
+int mlx_expose_hook (void *win_ptr, int (*funct_ptr)(), void *param);
+
+int mlx_loop_hook (void *mlx_ptr, int (*funct_ptr)(), void *param);
+int mlx_loop (void *mlx_ptr);
+int mlx_loop_end (void *mlx_ptr);
+
+/*
+** hook funct are called as follow :
+**
+** expose_hook(void *param);
+** key_hook(int keycode, void *param);
+** mouse_hook(int button, int x,int y, void *param);
+** loop_hook(void *param);
+**
+*/
+
+
+/*
+** Usually asked...
+*/
+
+int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color,
+ char *string);
+void mlx_set_font(void *mlx_ptr, void *win_ptr, char *name);
+void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data,
+ int *width, int *height);
+void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename,
+ int *width, int *height);
+int mlx_destroy_window(void *mlx_ptr, void *win_ptr);
+
+int mlx_destroy_image(void *mlx_ptr, void *img_ptr);
+
+int mlx_destroy_display(void *mlx_ptr);
+
+/*
+** generic hook system for all events, and minilibX functions that
+** can be hooked. Some macro and defines from X11/X.h are needed here.
+*/
+
+int mlx_hook(void *win_ptr, int x_event, int x_mask,
+ int (*funct)(), void *param);
+
+int mlx_do_key_autorepeatoff(void *mlx_ptr);
+int mlx_do_key_autorepeaton(void *mlx_ptr);
+int mlx_do_sync(void *mlx_ptr);
+
+int mlx_mouse_get_pos(void *mlx_ptr, void *win_ptr, int *x, int *y);
+int mlx_mouse_move(void *mlx_ptr, void *win_ptr, int x, int y);
+int mlx_mouse_hide(void *mlx_ptr, void *win_ptr);
+int mlx_mouse_show(void *mlx_ptr, void *win_ptr);
+
+int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey);
+
+#endif /* MLX_H */
diff --git a/minilibx-linux/mlx_clear_window.c b/minilibx-linux/mlx_clear_window.c
new file mode 100644
index 0000000..f621090
--- /dev/null
+++ b/minilibx-linux/mlx_clear_window.c
@@ -0,0 +1,21 @@
+/*
+** mlx_clear_window.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Thu Sep 7 19:46:15 2000 Charlie Root
+** Last update Tue Sep 25 17:11:19 2001 Charlie Root
+*/
+
+
+
+#include "mlx_int.h"
+
+
+int mlx_clear_window(t_xvar *xvar,t_win_list *win)
+{
+ XClearWindow(xvar->display,win->window);
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+}
diff --git a/minilibx-linux/mlx_destroy_display.c b/minilibx-linux/mlx_destroy_display.c
new file mode 100644
index 0000000..d2970b8
--- /dev/null
+++ b/minilibx-linux/mlx_destroy_display.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* mlx_destroy_display.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: mg +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/10/03 18:56:35 by mg #+# #+# */
+/* Updated: 2020/10/04 01:55:35 by mg ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "mlx_int.h"
+
+int mlx_destroy_display(t_xvar *xvar)
+{
+ XCloseDisplay(xvar->display);
+}
diff --git a/minilibx-linux/mlx_destroy_image.c b/minilibx-linux/mlx_destroy_image.c
new file mode 100644
index 0000000..afd4d1a
--- /dev/null
+++ b/minilibx-linux/mlx_destroy_image.c
@@ -0,0 +1,31 @@
+/*
+** mlx_destroy_image.c for MinilibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Tue Mar 12 10:25:15 2002 Charlie Root
+** Last update Tue May 15 16:45:54 2007 Olivier Crouzet
+*/
+
+
+#include "mlx_int.h"
+
+
+int mlx_destroy_image(t_xvar *xvar, t_img *img)
+{
+ if (img->type == MLX_TYPE_SHM_PIXMAP ||
+ img->type == MLX_TYPE_SHM)
+ {
+ XShmDetach(xvar->display, &(img->shm));
+ shmdt(img->shm.shmaddr);
+ /* shmctl IPC_RMID already done */
+ }
+ XDestroyImage(img->image); /* For image & shm-image. Also free img->data */
+ XFreePixmap(xvar->display, img->pix);
+ if (img->gc)
+ XFreeGC(xvar->display, img->gc);
+ free(img);
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+}
diff --git a/minilibx-linux/mlx_destroy_window.c b/minilibx-linux/mlx_destroy_window.c
new file mode 100644
index 0000000..464790c
--- /dev/null
+++ b/minilibx-linux/mlx_destroy_window.c
@@ -0,0 +1,38 @@
+/*
+** mlx_destroy_window.c for MinilibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Tue Mar 12 10:25:15 2002 Charlie Root
+** Last update Tue May 15 16:46:08 2007 Olivier Crouzet
+*/
+
+
+#include "mlx_int.h"
+
+
+int mlx_destroy_window(t_xvar *xvar,t_win_list *win)
+{
+ t_win_list *w;
+ t_win_list *prev;
+ t_win_list first;
+
+ first.next = xvar->win_list;
+ prev = &first;
+ w = prev->next;
+ while (w)
+ {
+ if (w==win)
+ prev->next = w->next;
+ else
+ prev = w;
+ w = w->next;
+ }
+ xvar->win_list = first.next;
+ XDestroyWindow(xvar->display,win->window);
+ XFreeGC(xvar->display,win->gc);
+ free(win);
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+}
diff --git a/minilibx-linux/mlx_expose_hook.c b/minilibx-linux/mlx_expose_hook.c
new file mode 100644
index 0000000..b00b675
--- /dev/null
+++ b/minilibx-linux/mlx_expose_hook.c
@@ -0,0 +1,22 @@
+/*
+** mlx_expose_hook.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Thu Aug 3 11:49:06 2000 Charlie Root
+** Last update Fri Feb 23 17:07:42 2001 Charlie Root
+*/
+
+
+#include "mlx_int.h"
+
+
+
+
+int mlx_expose_hook(t_win_list *win,int (*funct)(),void *param)
+{
+ win->hooks[Expose].hook = funct;
+ win->hooks[Expose].param = param;
+ win->hooks[Expose].mask = ExposureMask;
+}
diff --git a/minilibx-linux/mlx_ext_randr.c b/minilibx-linux/mlx_ext_randr.c
new file mode 100644
index 0000000..34ddb91
--- /dev/null
+++ b/minilibx-linux/mlx_ext_randr.c
@@ -0,0 +1,104 @@
+
+
+
+#include "mlx_int.h"
+
+#include
+#include
+
+/* global for independant extension */
+
+RRMode saved_mode = 0;
+
+
+int mlx_ext_fullscreen(t_xvar *xvar, t_win_list *win, int fullscreen)
+{
+ XWindowAttributes watt;
+ int i;
+ int j;
+ XRRScreenResources *res;
+ XRROutputInfo *o_info;
+ XRRCrtcInfo *crtc;
+ RRMode mode_candidate;
+ int idx_output;
+ int idx_candidate;
+
+ if (!XGetWindowAttributes(xvar->display, win->window, &watt))
+ return (0);
+
+ res = XRRGetScreenResources(xvar->display, xvar->root);
+ o_info = NULL;
+ idx_output = -1;
+ i = res->noutput;
+ while (i--)
+ {
+ o_info = XRRGetOutputInfo(xvar->display, res, res->outputs[i]);
+ if (o_info->connection == RR_Connected)
+ {
+ idx_output = i;
+ i = 0;
+ }
+ else
+ XRRFreeOutputInfo(o_info);
+ }
+ if (!o_info)
+ {
+ XRRFreeScreenResources(res);
+ return (0);
+ }
+
+ idx_candidate = -1;
+ i = o_info->nmode;
+ while (i--)
+ {
+ j = res->nmode;
+ while (j--)
+ if (res->modes[j].id == o_info->modes[i])
+ if (res->modes[j].width >= watt.width && res->modes[j].height >= watt.height &&
+ (idx_candidate == -1 || res->modes[idx_candidate].width > res->modes[j].width ||
+ res->modes[idx_candidate].height > res->modes[j].height) )
+ idx_candidate = i;
+ }
+ if (idx_candidate < 0)
+ {
+ XRRFreeOutputInfo(o_info);
+ XRRFreeScreenResources(res);
+ return (0);
+ }
+ if (!fullscreen && saved_mode == -1)
+ idx_candidate = 0; /* if no clue, uses first mode, usually part of npreferred */
+ mode_candidate = o_info->modes[idx_candidate];
+ if (!fullscreen)
+ mode_candidate = saved_mode;
+
+ crtc = XRRGetCrtcInfo(xvar->display, res, o_info->crtc);
+ saved_mode = crtc->mode;
+
+ i = XRRSetCrtcConfig(xvar->display, res, o_info->crtc, CurrentTime, 0, 0, mode_candidate,
+ crtc->rotation, &res->outputs[idx_output], 1);
+ if (fullscreen)
+ printf("found mode : %d x %d\n Status %d\n", res->modes[idx_candidate].width, res->modes[idx_candidate].height, i);
+ else
+ printf("back previous mode\n");
+
+ XMoveWindow(xvar->display, win->window, 0, 0);
+ XMapRaised(xvar->display, win->window);
+
+ if (fullscreen)
+ {
+ // XGrabPointer(xvar->display, win->window, True, 0, GrabModeAsync, GrabModeAsync, win->window, 0L, CurrentTime);
+ XGrabKeyboard(xvar->display, win->window, False, GrabModeAsync, GrabModeAsync, CurrentTime);
+ }
+ else
+ {
+ XUngrabPointer(xvar->display, CurrentTime);
+ XUngrabKeyboard(xvar->display, CurrentTime);
+ }
+
+ XSync(xvar->display, False);
+ sleep(1);
+
+ XRRFreeCrtcInfo(crtc);
+ XRRFreeOutputInfo(o_info);
+ XRRFreeScreenResources(res);
+}
diff --git a/minilibx-linux/mlx_flush_event.c b/minilibx-linux/mlx_flush_event.c
new file mode 100644
index 0000000..1e586ad
--- /dev/null
+++ b/minilibx-linux/mlx_flush_event.c
@@ -0,0 +1,25 @@
+/*
+** mlx_flush_event.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Wed Aug 2 18:58:11 2000 Charlie Root
+** Last update Fri Feb 23 17:08:48 2001 Charlie Root
+*/
+
+
+#include "mlx_int.h"
+
+
+
+
+int mlx_flush_event(t_xvar *xvar)
+{
+ XEvent ev;
+
+ while (XPending(xvar->display))
+ {
+ XNextEvent(xvar->display,&ev);
+ }
+}
diff --git a/minilibx-linux/mlx_get_color_value.c b/minilibx-linux/mlx_get_color_value.c
new file mode 100644
index 0000000..b620970
--- /dev/null
+++ b/minilibx-linux/mlx_get_color_value.c
@@ -0,0 +1,33 @@
+/*
+** mlx_get_color_value.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Mon Jul 31 19:01:33 2000 Charlie Root
+** Last update Thu Oct 4 15:04:13 2001 Charlie Root
+*/
+
+
+#include "mlx_int.h"
+
+
+int mlx_get_color_value(t_xvar *xvar,int color)
+{
+ return(mlx_int_get_good_color(xvar,color));
+}
+
+int mlx_int_get_good_color(t_xvar *xvar,int color)
+{
+ XColor xc;
+
+ if (xvar->depth>=24)
+ return (color);
+ xc.red = (color>>8)&0xFF00;
+ xc.green = color&0xFF00;
+ xc.blue = (color<<8)&0xFF00;
+ xc.pixel = ((xc.red>>(16-xvar->decrgb[1]))<decrgb[0])+
+ ((xc.green>>(16-xvar->decrgb[3]))<decrgb[2])+
+ ((xc.blue>>(16-xvar->decrgb[5]))<decrgb[4]);
+ return (xc.pixel);
+}
diff --git a/minilibx-linux/mlx_get_data_addr.c b/minilibx-linux/mlx_get_data_addr.c
new file mode 100644
index 0000000..45e7a85
--- /dev/null
+++ b/minilibx-linux/mlx_get_data_addr.c
@@ -0,0 +1,23 @@
+/*
+** mlx_get_data_addr.c for MiniLibX in raytraceur
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Mon Aug 14 15:45:57 2000 Charlie Root
+** Last update Thu Sep 27 19:05:25 2001 Charlie Root
+*/
+
+
+
+#include "mlx_int.h"
+
+
+char *mlx_get_data_addr(t_img *img,int *bits_per_pixel,
+ int *size_line,int *endian)
+{
+ *bits_per_pixel = img->bpp;
+ *size_line = img->size_line;
+ *endian = img->image->byte_order;
+ return (img->data);
+}
diff --git a/minilibx-linux/mlx_hook.c b/minilibx-linux/mlx_hook.c
new file mode 100644
index 0000000..98e509a
--- /dev/null
+++ b/minilibx-linux/mlx_hook.c
@@ -0,0 +1,40 @@
+/*
+** mlx_hook.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Thu Aug 3 11:49:06 2000 Charlie Root
+** Last update Fri Jan 28 17:05:28 2005 Olivier Crouzet
+*/
+
+
+#include "mlx_int.h"
+
+
+
+
+int mlx_hook(t_win_list *win, int x_event, int x_mask,
+ int (*funct)(),void *param)
+{
+ win->hooks[x_event].hook = funct;
+ win->hooks[x_event].param = param;
+ win->hooks[x_event].mask = x_mask;
+}
+
+
+int mlx_do_key_autorepeatoff(t_xvar *xvar)
+{
+ XAutoRepeatOff(xvar->display);
+}
+
+int mlx_do_key_autorepeaton(t_xvar *xvar)
+{
+ XAutoRepeatOn(xvar->display);
+}
+
+
+int mlx_do_sync(t_xvar *xvar)
+{
+ XSync(xvar->display, False);
+}
diff --git a/minilibx-linux/mlx_init.c b/minilibx-linux/mlx_init.c
new file mode 100644
index 0000000..c9d7463
--- /dev/null
+++ b/minilibx-linux/mlx_init.c
@@ -0,0 +1,99 @@
+/*
+** mlx_init.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Mon Jul 31 16:52:42 2000 Charlie Root
+** Last update Fri Jan 28 17:05:09 2005 Olivier Crouzet
+*/
+
+
+#include "mlx_int.h"
+
+
+
+void *mlx_init()
+{
+ t_xvar *xvar;
+
+ if (!(xvar = malloc(sizeof(*xvar))))
+ return ((void*)0);
+ if ((xvar->display = XOpenDisplay("")) == 0)
+ {
+ free(xvar);
+ return ((void*)0);
+ }
+ xvar->screen = DefaultScreen(xvar->display);
+ xvar->root = DefaultRootWindow(xvar->display);
+ xvar->cmap = DefaultColormap(xvar->display,xvar->screen);
+ xvar->depth = DefaultDepth(xvar->display,xvar->screen);
+ if (mlx_int_get_visual(xvar)==-1)
+ {
+ printf(ERR_NO_TRUECOLOR);
+ exit(1);
+ }
+ xvar->win_list = 0;
+ xvar->loop_hook = 0;
+ xvar->loop_param = (void *)0;
+ xvar->do_flush = 1;
+ xvar->wm_delete_window = XInternAtom (xvar->display, "WM_DELETE_WINDOW", False);
+ xvar->wm_protocols = XInternAtom (xvar->display, "WM_PROTOCOLS", False);
+ mlx_int_deal_shm(xvar);
+ if (xvar->private_cmap)
+ xvar->cmap = XCreateColormap(xvar->display,xvar->root,
+ xvar->visual,AllocNone);
+ mlx_int_rgb_conversion(xvar);
+ xvar->end_loop = 0;
+ return (xvar);
+}
+
+
+/*
+** pshm_format of -1 : Not XYBitmap|XYPixmap|ZPixmap
+** alpha libX need a check of the DISPLAY env var, or shm is allowed
+** in remote Xserver connections.
+*/
+
+int mlx_int_deal_shm(t_xvar *xvar)
+{
+ int use_pshm;
+ int bidon;
+ char *dpy;
+ char buff[33];
+
+ xvar->use_xshm = XShmQueryVersion(xvar->display,&bidon,&bidon,&(use_pshm));
+ if (xvar->use_xshm && use_pshm)
+ xvar->pshm_format = XShmPixmapFormat(xvar->display);
+ else
+ xvar->pshm_format = -1;
+ gethostname(buff,32);
+ dpy = getenv(ENV_DISPLAY);
+ if (dpy && strlen(dpy) && *dpy!=':' && strncmp(dpy,buff,strlen(buff)) &&
+ strncmp(dpy,LOCALHOST,strlen(LOCALHOST)) )
+ {
+ xvar->pshm_format = -1;
+ xvar->use_xshm = 0;
+ }
+}
+
+/*
+** TrueColor Visual is needed to have *_mask correctly set
+*/
+
+int mlx_int_rgb_conversion(t_xvar *xvar)
+{
+ bzero(xvar->decrgb,sizeof(int)*6);
+ while (!(xvar->visual->red_mask&1))
+ { xvar->visual->red_mask >>= 1; xvar->decrgb[0] ++; }
+ while (xvar->visual->red_mask&1)
+ { xvar->visual->red_mask >>= 1; xvar->decrgb[1] ++; }
+ while (!(xvar->visual->green_mask&1))
+ { xvar->visual->green_mask >>= 1; xvar->decrgb[2] ++; }
+ while (xvar->visual->green_mask&1)
+ { xvar->visual->green_mask >>= 1; xvar->decrgb[3] ++; }
+ while (!(xvar->visual->blue_mask&1))
+ { xvar->visual->blue_mask >>= 1; xvar->decrgb[4] ++; }
+ while (xvar->visual->blue_mask&1)
+ { xvar->visual->blue_mask >>= 1; xvar->decrgb[5] ++; }
+}
diff --git a/minilibx-linux/mlx_int.h b/minilibx-linux/mlx_int.h
new file mode 100644
index 0000000..c49d1b7
--- /dev/null
+++ b/minilibx-linux/mlx_int.h
@@ -0,0 +1,140 @@
+/*
+** mlx_int.h for mlx in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Mon Jul 31 16:45:48 2000 Charlie Root
+** Last update Wed May 25 16:44:16 2011 Olivier Crouzet
+*/
+
+
+
+/*
+** Internal settings for MiniLibX
+*/
+
+#ifndef MLX_INT_H
+
+# define MLX_INT_H
+
+# include
+# include
+# include
+# include
+# include
+# include
+# include
+# include
+# include
+# include
+# include
+# include
+/* #include */
+
+
+# define MLX_TYPE_SHM_PIXMAP 3
+# define MLX_TYPE_SHM 2
+# define MLX_TYPE_XIMAGE 1
+
+# define MLX_MAX_EVENT LASTEvent
+
+
+# define ENV_DISPLAY "DISPLAY"
+# define LOCALHOST "localhost"
+# define ERR_NO_TRUECOLOR "MinilibX Error : No TrueColor Visual available.\n"
+# define WARN_SHM_ATTACH "MinilibX Warning : X server can't attach shared memory.\n"
+
+
+typedef struct s_xpm_col
+{
+ int name;
+ int col;
+} t_xpm_col;
+
+
+struct s_col_name
+{
+ char *name;
+ int color;
+};
+
+typedef struct s_event_list
+{
+ int mask;
+ int (*hook)();
+ void *param;
+} t_event_list;
+
+
+typedef struct s_win_list
+{
+ Window window;
+ GC gc;
+ struct s_win_list *next;
+ int (*mouse_hook)();
+ int (*key_hook)();
+ int (*expose_hook)();
+ void *mouse_param;
+ void *key_param;
+ void *expose_param;
+ t_event_list hooks[MLX_MAX_EVENT];
+} t_win_list;
+
+
+typedef struct s_img
+{
+ XImage *image;
+ Pixmap pix;
+ GC gc;
+ int size_line;
+ int bpp;
+ int width;
+ int height;
+ int type;
+ int format;
+ char *data;
+ XShmSegmentInfo shm;
+} t_img;
+
+typedef struct s_xvar
+{
+ Display *display;
+ Window root;
+ int screen;
+ int depth;
+ Visual *visual;
+ Colormap cmap;
+ int private_cmap;
+ t_win_list *win_list;
+ int (*loop_hook)();
+ void *loop_param;
+ int use_xshm;
+ int pshm_format;
+ int do_flush;
+ int decrgb[6];
+ Atom wm_delete_window;
+ Atom wm_protocols;
+ int end_loop;
+} t_xvar;
+
+
+int mlx_int_do_nothing();
+int mlx_get_color_value();
+int mlx_int_get_good_color();
+int mlx_int_find_in_pcm();
+int mlx_int_anti_resize_win();
+int mlx_int_wait_first_expose();
+int mlx_int_rgb_conversion();
+int mlx_int_deal_shm();
+void *mlx_int_new_xshm_image();
+char **mlx_int_str_to_wordtab();
+void *mlx_new_image();
+int shm_att_pb();
+int mlx_int_get_visual(t_xvar *xvar);
+int mlx_int_set_win_event_mask(t_xvar *xvar);
+int mlx_int_str_str_cote(char *str,char *find,int len);
+int mlx_int_str_str(char *str,char *find,int len);
+
+
+#endif
diff --git a/minilibx-linux/mlx_int_anti_resize_win.c b/minilibx-linux/mlx_int_anti_resize_win.c
new file mode 100644
index 0000000..2f20b44
--- /dev/null
+++ b/minilibx-linux/mlx_int_anti_resize_win.c
@@ -0,0 +1,28 @@
+/*
+** mlx_int_anti_resize_win.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Tue Aug 8 14:31:05 2000 Charlie Root
+** Last update Tue Sep 25 15:56:58 2001 Charlie Root
+*/
+
+#include "mlx_int.h"
+
+
+int mlx_int_anti_resize_win(t_xvar *xvar,Window win,int w,int h)
+{
+ XSizeHints hints;
+ long toto;
+
+ XGetWMNormalHints(xvar->display,win,&hints,&toto);
+ hints.width = w;
+ hints.height = h;
+ hints.min_width = w;
+ hints.min_height = h;
+ hints.max_width = w;
+ hints.max_height = h;
+ hints.flags = PPosition | PSize | PMinSize | PMaxSize;
+ XSetWMNormalHints(xvar->display,win,&hints);
+}
diff --git a/minilibx-linux/mlx_int_do_nothing.c b/minilibx-linux/mlx_int_do_nothing.c
new file mode 100644
index 0000000..49524e4
--- /dev/null
+++ b/minilibx-linux/mlx_int_do_nothing.c
@@ -0,0 +1,16 @@
+/*
+** mlx_int_do_nothing.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Tue Aug 8 12:58:24 2000 Charlie Root
+** Last update Tue Sep 25 15:56:22 2001 Charlie Root
+*/
+
+
+
+int mlx_int_do_nothing(void *param)
+{
+
+}
diff --git a/minilibx-linux/mlx_int_get_visual.c b/minilibx-linux/mlx_int_get_visual.c
new file mode 100644
index 0000000..440a7ca
--- /dev/null
+++ b/minilibx-linux/mlx_int_get_visual.c
@@ -0,0 +1,39 @@
+/*
+** mlx_int_get_visual.c for MinilibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Wed Oct 3 17:01:51 2001 Charlie Root
+** Last update Thu Oct 4 15:00:45 2001 Charlie Root
+*/
+
+
+
+#include "mlx_int.h"
+
+
+/*
+** We need a private colormap for non-default Visual.
+*/
+
+
+int mlx_int_get_visual(t_xvar *xvar)
+{
+ XVisualInfo *vi;
+ XVisualInfo template;
+ int nb_item;
+
+ xvar->private_cmap = 0;
+ xvar->visual = DefaultVisual(xvar->display,xvar->screen);
+ if (xvar->visual->class == TrueColor)
+ return (0);
+ template.class = TrueColor;
+ template.depth = xvar->depth;
+ if (!(vi = XGetVisualInfo(xvar->display,VisualDepthMask|VisualClassMask,
+ &template,&nb_item)) )
+ return (-1);
+ xvar->visual = vi->visual;
+ xvar->private_cmap = 1;
+ return (0);
+}
diff --git a/minilibx-linux/mlx_int_param_event.c b/minilibx-linux/mlx_int_param_event.c
new file mode 100644
index 0000000..8756a22
--- /dev/null
+++ b/minilibx-linux/mlx_int_param_event.c
@@ -0,0 +1,100 @@
+/*
+** mlx_int_param_event.c for MinilibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Mon Jul 31 16:37:50 2000 Charlie Root
+** Last update Wed Oct 6 13:14:52 2004 Olivier Crouzet
+*/
+
+#include "mlx_int.h"
+
+int mlx_int_param_undef()
+{
+}
+
+int mlx_int_param_KeyPress(t_xvar *xvar, XEvent *ev, t_win_list *win)
+{
+ win->hooks[KeyPress].hook(XkbKeycodeToKeysym(xvar->display,
+ ev->xkey.keycode, 0, 0),
+ win->hooks[KeyPress].param);
+}
+
+int mlx_int_param_KeyRelease(t_xvar *xvar, XEvent *ev, t_win_list *win)
+{
+ win->hooks[KeyRelease].hook(XkbKeycodeToKeysym(xvar->display,
+ ev->xkey.keycode, 0, 0),
+ win->hooks[KeyRelease].param);
+}
+
+int mlx_int_param_ButtonPress(t_xvar *xvar, XEvent *ev, t_win_list *win)
+{
+ win->hooks[ButtonPress].hook(ev->xbutton.button,ev->xbutton.x,ev->xbutton.y,
+ win->hooks[ButtonPress].param);
+}
+
+int mlx_int_param_ButtonRelease(t_xvar *xvar, XEvent *ev, t_win_list *win)
+{
+ win->hooks[ButtonRelease].hook(ev->xbutton.button,
+ ev->xbutton.x, ev->xbutton.y,
+ win->hooks[ButtonRelease].param);
+}
+
+int mlx_int_param_MotionNotify(t_xvar *xvar, XEvent *ev, t_win_list *win)
+{
+ win->hooks[MotionNotify].hook(ev->xbutton.x,ev->xbutton.y,
+ win->hooks[MotionNotify].param);
+}
+
+int mlx_int_param_Expose(t_xvar *xvar, XEvent *ev, t_win_list *win)
+{
+ if (!ev->xexpose.count)
+ win->hooks[Expose].hook(win->hooks[Expose].param);
+}
+
+
+int mlx_int_param_generic(t_xvar *xvar, XEvent *ev, t_win_list *win)
+{
+ win->hooks[ev->type].hook(win->hooks[ev->type].param);
+}
+
+int (*(mlx_int_param_event[]))() =
+{
+ mlx_int_param_undef, /* 0 */
+ mlx_int_param_undef,
+ mlx_int_param_KeyPress,
+ mlx_int_param_KeyRelease, /* 3 */
+ mlx_int_param_ButtonPress,
+ mlx_int_param_ButtonRelease,
+ mlx_int_param_MotionNotify, /* 6 */
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_Expose, /* 12 */
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic,
+ mlx_int_param_generic
+};
diff --git a/minilibx-linux/mlx_int_set_win_event_mask.c b/minilibx-linux/mlx_int_set_win_event_mask.c
new file mode 100644
index 0000000..55650cd
--- /dev/null
+++ b/minilibx-linux/mlx_int_set_win_event_mask.c
@@ -0,0 +1,34 @@
+/*
+** mlx_int_set_win_event_mask.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Thu Aug 3 11:49:06 2000 Charlie Root
+** Last update Fri Feb 23 17:07:42 2001 Charlie Root
+*/
+
+
+#include "mlx_int.h"
+
+
+
+
+int mlx_int_set_win_event_mask(t_xvar *xvar)
+{
+ t_win_list *win;
+ int mask;
+ int i;
+ XSetWindowAttributes xwa;
+
+ win = xvar->win_list;
+ while (win)
+ {
+ xwa.event_mask = 0;
+ i = MLX_MAX_EVENT;
+ while (i--)
+ xwa.event_mask |= win->hooks[i].mask;
+ XChangeWindowAttributes(xvar->display, win->window, CWEventMask, &xwa);
+ win = win->next;
+ }
+}
diff --git a/minilibx-linux/mlx_int_str_to_wordtab.c b/minilibx-linux/mlx_int_str_to_wordtab.c
new file mode 100644
index 0000000..7f92089
--- /dev/null
+++ b/minilibx-linux/mlx_int_str_to_wordtab.c
@@ -0,0 +1,113 @@
+/*
+** mlx_int_str_to_wordtab.c for MinilibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Wed Sep 13 11:36:09 2000 Charlie Root
+** Last update Fri Dec 14 11:02:09 2001 Charlie Root
+*/
+
+
+#include "mlx_int.h"
+
+
+int mlx_int_str_str(char *str,char *find,int len)
+{
+ int len_f;
+ int pos;
+ char *s;
+ char *f;
+
+ len_f = strlen(find);
+ if (len_f>len)
+ return (-1);
+ pos = 0;
+ while (*(str+len_f-1))
+ {
+ s = str;
+ f = find;
+ while (*(f++) == *(s++))
+ if (!*f)
+ return (pos);
+ str ++;
+ pos ++;
+ }
+ return (-1);
+}
+
+
+
+int mlx_int_str_str_cote(char *str,char *find,int len)
+{
+ int len_f;
+ int pos;
+ char *s;
+ char *f;
+ int cote;
+
+ len_f = strlen(find);
+ if (len_f>len)
+ return (-1);
+ cote = 0;
+ pos = 0;
+ while (*(str+len_f-1))
+ {
+ if (*str=='"')
+ cote = 1-cote;
+ if (!cote)
+ {
+ s = str;
+ f = find;
+ while (*(f++) == *(s++))
+ if (!*f)
+ return (pos);
+ }
+ str ++;
+ pos ++;
+ }
+ return (-1);
+}
+
+
+char **mlx_int_str_to_wordtab(char *str)
+{
+ char **tab;
+ int pos;
+ int nb_word;
+ int len;
+
+ len = strlen(str);
+ nb_word = 0;
+ pos = 0;
+ while (pos
+**
+** Started on Tue Oct 17 09:26:45 2000 olivier crouzet
+** Last update Fri Feb 23 17:27:10 2001 Charlie Root
+*/
+
+
+
+#include "mlx_int.h"
+
+
+
+int mlx_int_wait_first_expose(t_xvar *xvar,Window win)
+{
+ XEvent ev;
+
+ XWindowEvent(xvar->display,win,ExposureMask,&ev);
+ XPutBackEvent(xvar->display,&ev);
+}
diff --git a/minilibx-linux/mlx_key_hook.c b/minilibx-linux/mlx_key_hook.c
new file mode 100644
index 0000000..eea6484
--- /dev/null
+++ b/minilibx-linux/mlx_key_hook.c
@@ -0,0 +1,22 @@
+/*
+** mlx_key_hook.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Thu Aug 3 11:49:06 2000 Charlie Root
+** Last update Fri Feb 23 17:10:09 2001 Charlie Root
+*/
+
+
+#include "mlx_int.h"
+
+
+
+
+int mlx_key_hook(t_win_list *win,int (*funct)(),void *param)
+{
+ win->hooks[KeyRelease].hook = funct;
+ win->hooks[KeyRelease].param = param;
+ win->hooks[KeyRelease].mask = KeyReleaseMask;
+}
diff --git a/minilibx-linux/mlx_lib_xpm.c b/minilibx-linux/mlx_lib_xpm.c
new file mode 100644
index 0000000..b8cf184
--- /dev/null
+++ b/minilibx-linux/mlx_lib_xpm.c
@@ -0,0 +1,96 @@
+/*
+** mlx_xpm.c for minilibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Fri Dec 8 11:07:24 2000 Charlie Root
+** Last update Thu Oct 4 16:00:22 2001 Charlie Root
+*/
+
+
+#include "mlx_int.h"
+
+
+
+
+void *mlx_int_xpm_f_image(t_xvar *xvar,int *width,int *height,
+ int (*xpm_func)(),void *param)
+{
+ XImage *img1;
+ XImage *img2;
+ t_img *im2;
+ XpmAttributes xpm_att;
+
+ xpm_att.visual = xvar->visual;
+ xpm_att.colormap = xvar->cmap;
+ xpm_att.depth = xvar->depth;
+ xpm_att.bitmap_format = ZPixmap;
+ xpm_att.valuemask = XpmDepth|XpmBitmapFormat|XpmVisual|XpmColormap;
+ if (xpm_func(xvar->display,param,&img1,&img2,&xpm_att))
+ return ((void *)0);
+ if (img2)
+ XDestroyImage(img2);
+
+ if (!(im2 = (void *)mlx_new_image(xvar,img1->width,img1->height)))
+ {
+ XDestroyImage(img1);
+ return ((void *)0);
+ }
+ *width = img1->width;
+ *height = img1->height;
+ if (mlx_int_egal_img(im2->image,img1))
+ {
+ bcopy(img1->data,im2->data,img1->height*img1->bytes_per_line);
+ XDestroyImage(img1);
+ return (im2);
+ }
+ if (im2->type==MLX_TYPE_SHM_PIXMAP)
+ {
+ XFreePixmap(xvar->display,im2->pix);
+ im2->pix = XCreatePixmap(xvar->display,xvar->root,
+ *width,*height,xvar->depth);
+ }
+ if (im2->type>MLX_TYPE_XIMAGE)
+ {
+ XShmDetach(xvar->display,&(im2->shm));
+ shmdt(im2->data);
+ }
+ XDestroyImage(im2->image);
+ im2->image = img1;
+ im2->data = img1->data;
+ im2->type = MLX_TYPE_XIMAGE;
+ im2->size_line = img1->bytes_per_line;
+ im2->bpp = img1->bits_per_pixel;
+ return (im2);
+}
+
+
+int mlx_int_egal_img(XImage *img1,XImage *img2)
+{
+ if (img1->width!=img2->width || img1->height!=img2->height ||
+ img1->xoffset!=img2->xoffset || img1->format!=img2->format ||
+ img1->byte_order!=img2->byte_order ||
+ img1->bitmap_unit!=img2->bitmap_unit ||
+ img1->bitmap_bit_order!=img2->bitmap_bit_order ||
+ img1->bitmap_pad!=img2->bitmap_pad || img1->depth!=img2->depth ||
+ img1->bytes_per_line!=img2->bytes_per_line ||
+ img1->bits_per_pixel!=img2->bits_per_pixel ||
+ img1->red_mask!=img2->red_mask || img1->green_mask!=img2->green_mask ||
+ img1->blue_mask!=img2->blue_mask )
+ return (0);
+ return (1);
+}
+
+
+void *mlx_xpm_file_to_image(t_xvar *xvar,char *filename,
+ int *width,int *height)
+{
+ return (mlx_int_xpm_f_image(xvar,width,height,XpmReadFileToImage,filename));
+}
+
+
+void *mlx_xpm_to_image(t_xvar *xvar,char **data,int *width,int *height)
+{
+ return (mlx_int_xpm_f_image(xvar,width,height,XpmCreateImageFromData,(void *)data));
+}
diff --git a/minilibx-linux/mlx_loop.c b/minilibx-linux/mlx_loop.c
new file mode 100644
index 0000000..cc4e119
--- /dev/null
+++ b/minilibx-linux/mlx_loop.c
@@ -0,0 +1,63 @@
+/*
+** mlx_loop.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Wed Aug 2 18:58:11 2000 Charlie Root
+** Last update Fri Sep 30 14:47:41 2005 Olivier Crouzet
+*/
+
+
+#include "mlx_int.h"
+
+extern int (*(mlx_int_param_event[]))();
+
+static int win_count(t_xvar *xvar)
+{
+ int i;
+ t_win_list *win;
+
+ i = 0;
+ win = xvar->win_list;
+ while (win)
+ {
+ win = win->next;
+ ++i;
+ }
+ return (i);
+}
+
+int mlx_loop_end(t_xvar *xvar)
+{
+ xvar->end_loop = 1;
+ return (1);
+}
+
+int mlx_loop(t_xvar *xvar)
+{
+ XEvent ev;
+ t_win_list *win;
+
+ mlx_int_set_win_event_mask(xvar);
+ xvar->do_flush = 0;
+ while (win_count(xvar) && !xvar->end_loop)
+ {
+ while (!xvar->end_loop && (!xvar->loop_hook || XPending(xvar->display)))
+ {
+ XNextEvent(xvar->display,&ev);
+ win = xvar->win_list;
+ while (win && (win->window!=ev.xany.window))
+ win = win->next;
+
+ if (win && ev.type == ClientMessage && ev.xclient.message_type == xvar->wm_protocols && ev.xclient.data.l[0] == xvar->wm_delete_window && win->hooks[DestroyNotify].hook)
+ win->hooks[DestroyNotify].hook(win->hooks[DestroyNotify].param);
+ if (win && ev.type < MLX_MAX_EVENT && win->hooks[ev.type].hook)
+ mlx_int_param_event[ev.type](xvar, &ev, win);
+ }
+ XSync(xvar->display, False);
+ if (xvar->loop_hook)
+ xvar->loop_hook(xvar->loop_param);
+ }
+ return (0);
+}
diff --git a/minilibx-linux/mlx_loop_hook.c b/minilibx-linux/mlx_loop_hook.c
new file mode 100644
index 0000000..1f8b9ed
--- /dev/null
+++ b/minilibx-linux/mlx_loop_hook.c
@@ -0,0 +1,21 @@
+/*
+** mlx_loop_hook.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Thu Aug 3 11:49:06 2000 Charlie Root
+** Last update Fri Feb 23 17:11:39 2001 Charlie Root
+*/
+
+
+#include "mlx_int.h"
+
+
+
+
+int mlx_loop_hook(t_xvar *xvar,int (*funct)(),void *param)
+{
+ xvar->loop_hook = funct;
+ xvar->loop_param = param;
+}
diff --git a/minilibx-linux/mlx_mouse.c b/minilibx-linux/mlx_mouse.c
new file mode 100644
index 0000000..ce0d4c9
--- /dev/null
+++ b/minilibx-linux/mlx_mouse.c
@@ -0,0 +1,48 @@
+#include "mlx_int.h"
+
+int mlx_mouse_move(t_xvar *xvar, t_win_list *win, int x, int y)
+{
+ XWarpPointer(xvar->display, None, win->window, 0, 0, 0, 0, x, y);
+ return (0);
+}
+
+int mlx_mouse_hide(t_xvar *xvar, t_win_list *win)
+{
+ static char data[1] = {0};
+ Cursor cursor;
+ Pixmap blank;
+ XColor dummy;
+
+ blank = XCreateBitmapFromData(xvar->display, win->window, data, 1, 1);
+ cursor = XCreatePixmapCursor(xvar->display, blank, blank, &dummy, &dummy, 0, 0);
+ XDefineCursor(xvar->display, win->window, cursor);
+ XFreePixmap(xvar->display, blank);
+ XFreeCursor(xvar->display, cursor);
+}
+
+int mlx_mouse_show(t_xvar *xvar, t_win_list *win)
+{
+ XUndefineCursor(xvar->display, win->window);
+}
+
+/*
+** Queries the position of the mouse pointer relative to the origin of the
+** specified window and saves it to the provided location.
+**
+** If the pointer is not on the same screen as the specified window, both
+** win_x_return and win_y_return are set to zero and the function returns 0.
+*/
+
+int mlx_mouse_get_pos(t_xvar *xvar, t_win_list *win, \
+ int *win_x_return, int *win_y_return)
+{
+ Window root_return;
+ Window child_return;
+ int root_x_return;
+ int root_y_return;
+ unsigned mask_return;
+
+ return (XQueryPointer(xvar->display, win->window, \
+ &root_return, &child_return, &root_x_return, &root_y_return, \
+ win_x_return, win_y_return, &mask_return));
+}
diff --git a/minilibx-linux/mlx_mouse_hook.c b/minilibx-linux/mlx_mouse_hook.c
new file mode 100644
index 0000000..cb567ab
--- /dev/null
+++ b/minilibx-linux/mlx_mouse_hook.c
@@ -0,0 +1,22 @@
+/*
+** mlx_mouse_hook.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Thu Aug 3 11:49:06 2000 Charlie Root
+** Last update Fri Feb 23 17:11:05 2001 Charlie Root
+*/
+
+
+#include "mlx_int.h"
+
+
+
+
+int mlx_mouse_hook(t_win_list *win,int (*funct)(),void *param)
+{
+ win->hooks[ButtonPress].hook = funct;
+ win->hooks[ButtonPress].param = param;
+ win->hooks[ButtonPress].mask = ButtonPressMask;
+}
diff --git a/minilibx-linux/mlx_new_image.c b/minilibx-linux/mlx_new_image.c
new file mode 100644
index 0000000..d2cbfc1
--- /dev/null
+++ b/minilibx-linux/mlx_new_image.c
@@ -0,0 +1,159 @@
+/*
+** mlx_new_image.c for MiniLibX in raytraceur
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Mon Aug 14 15:29:14 2000 Charlie Root
+** Last update Wed May 25 16:46:31 2011 Olivier Crouzet
+*/
+
+
+
+
+#include "mlx_int.h"
+
+/*
+** To handle X errors
+*/
+
+#define X_ShmAttach 1
+
+int mlx_X_error;
+
+int shm_att_pb(Display *d,XErrorEvent *ev)
+{
+ if (ev->request_code==146 && ev->minor_code==X_ShmAttach)
+ write(2,WARN_SHM_ATTACH,strlen(WARN_SHM_ATTACH));
+ mlx_X_error = 1;
+}
+
+
+/*
+** Data malloc : width+32 ( bitmap_pad=32 ), *4 = *32 / 8bit
+*/
+
+
+void *mlx_int_new_xshm_image(t_xvar *xvar,int width,int height,int format)
+{
+ t_img *img;
+ int (*save_handler)();
+
+ if (!(img = malloc(sizeof(*img))))
+ return ((void *)0);
+ bzero(img,sizeof(*img));
+ img->data = 0;
+ img->image = XShmCreateImage(xvar->display,xvar->visual,xvar->depth,
+ format,img->data,&(img->shm),width,height);
+ if (!img->image)
+ {
+ free(img);
+ return ((void *)0);
+ }
+ img->width = width;
+ img->height = height;
+ img->size_line = img->image->bytes_per_line;
+ img->bpp = img->image->bits_per_pixel;
+ img->format = format;
+ img->shm.shmid = shmget(IPC_PRIVATE,(width+32)*height*4,IPC_CREAT|0777);
+ if (img->shm.shmid==-1)
+ {
+ XDestroyImage(img->image);
+ free(img);
+ return ((void *)0);
+ }
+ img->data = img->shm.shmaddr = img->image->data = shmat(img->shm.shmid,0,0);
+ if (img->data==(void *)-1)
+ {
+ shmctl(img->shm.shmid,IPC_RMID,0);
+ XDestroyImage(img->image);
+ free(img);
+ return ((void *)0);
+ }
+ img->shm.readOnly = False;
+ mlx_X_error = 0;
+ save_handler = XSetErrorHandler(shm_att_pb);
+ if (!XShmAttach(xvar->display,&(img->shm)) ||
+ 0&XSync(xvar->display,False) || mlx_X_error)
+ {
+ XSetErrorHandler(save_handler);
+ shmdt(img->data);
+ shmctl(img->shm.shmid,IPC_RMID,0);
+ XDestroyImage(img->image);
+ free(img);
+ return ((void *)0);
+ }
+ XSetErrorHandler(save_handler);
+ shmctl(img->shm.shmid,IPC_RMID,0);
+ if (xvar->pshm_format==format)
+ {
+ img->pix = XShmCreatePixmap(xvar->display,xvar->root,img->shm.shmaddr,
+ &(img->shm),width,height,xvar->depth);
+ img->type = MLX_TYPE_SHM_PIXMAP;
+ }
+ else
+ {
+ img->pix = XCreatePixmap(xvar->display,xvar->root,
+ width,height,xvar->depth);
+ img->type = MLX_TYPE_SHM;
+ }
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+ return (img);
+}
+
+
+
+void *mlx_int_new_image(t_xvar *xvar,int width, int height,int format)
+{
+ t_img *img;
+
+ if (!(img = malloc(sizeof(*img))))
+ return ((void *)0);
+ if (!(img->data = malloc((width+32)*height*4)))
+ {
+ free(img);
+ return ((void *)0);
+ }
+ bzero(img->data,(width+32)*height*4);
+ img->image = XCreateImage(xvar->display,xvar->visual,xvar->depth,format,0,
+ img->data,width,height,32,0);
+ if (!img->image)
+ {
+ free(img->data);
+ free(img);
+ return ((void *)0);
+ }
+ img->gc = 0;
+ img->size_line = img->image->bytes_per_line;
+ img->bpp = img->image->bits_per_pixel;
+ img->width = width;
+ img->height = height;
+ img->pix = XCreatePixmap(xvar->display,xvar->root,width,height,xvar->depth);
+ img->format = format;
+ img->type = MLX_TYPE_XIMAGE;
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+ return (img);
+}
+
+
+void *mlx_new_image(t_xvar *xvar,int width, int height)
+{
+ t_img *img;
+
+ if (xvar->use_xshm)
+ if (img = mlx_int_new_xshm_image(xvar,width,height,ZPixmap))
+ return (img);
+ return (mlx_int_new_image(xvar,width,height,ZPixmap));
+}
+
+void *mlx_new_image2(t_xvar *xvar,int width, int height)
+{
+ t_img *img;
+
+ if (xvar->use_xshm)
+ if (img = mlx_int_new_xshm_image(xvar,width,height,XYPixmap))
+ return (img);
+ return (mlx_int_new_image(xvar,width,height,XYPixmap));
+}
diff --git a/minilibx-linux/mlx_new_window.c b/minilibx-linux/mlx_new_window.c
new file mode 100644
index 0000000..3f05914
--- /dev/null
+++ b/minilibx-linux/mlx_new_window.c
@@ -0,0 +1,62 @@
+/*
+** mlx_new_window.c for MiniLibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Mon Jul 31 17:29:02 2000 Charlie Root
+** Last update Thu Oct 4 15:44:43 2001 Charlie Root
+*/
+
+
+/*
+** We do not use White/BlackPixel macro, TrueColor Visual make sure
+** 0 is black & -1 is white
+**
+** With mlx_int_wait_first_expose, no flush is needed.
+*/
+
+#include "mlx_int.h"
+
+
+void *mlx_new_window(t_xvar *xvar,int size_x,int size_y,char *title)
+{
+ t_win_list *new_win;
+ XSetWindowAttributes xswa;
+ XGCValues xgcv;
+
+ xswa.background_pixel = 0;
+ xswa.border_pixel = -1;
+ xswa.colormap = xvar->cmap;
+ /*
+ xswa.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask |
+ KeyPressMask | KeyReleaseMask | StructureNotifyMask;
+ */
+ /* xswa.event_mask = ExposureMask; */
+ xswa.event_mask = 0xFFFFFF; /* all events */
+ if (!(new_win = malloc(sizeof(*new_win))))
+ return ((void *)0);
+ new_win->window = XCreateWindow(xvar->display,xvar->root,0,0,size_x,size_y,
+ 0,CopyFromParent,InputOutput,xvar->visual,
+ CWEventMask|CWBackPixel|CWBorderPixel|
+ CWColormap,&xswa);
+ mlx_int_anti_resize_win(xvar,new_win->window,size_x,size_y);
+ XStoreName(xvar->display,new_win->window,title);
+ XSetWMProtocols(xvar->display, new_win->window, &(xvar->wm_delete_window), 1);
+ xgcv.foreground = -1;
+ xgcv.function = GXcopy;
+ xgcv.plane_mask = AllPlanes;
+ new_win->gc = XCreateGC(xvar->display,new_win->window,
+ GCFunction|GCPlaneMask|GCForeground,&xgcv);
+ new_win->next = xvar->win_list;
+ xvar->win_list = new_win;
+ /*
+ new_win->mouse_hook = mlx_int_do_nothing;
+ new_win->key_hook = mlx_int_do_nothing;
+ new_win->expose_hook = mlx_int_do_nothing;
+ */
+ bzero(&(new_win->hooks), sizeof(new_win->hooks));
+ XMapRaised(xvar->display,new_win->window);
+ mlx_int_wait_first_expose(xvar,new_win->window);
+ return (new_win);
+}
diff --git a/minilibx-linux/mlx_pixel_put.c b/minilibx-linux/mlx_pixel_put.c
new file mode 100644
index 0000000..c411f36
--- /dev/null
+++ b/minilibx-linux/mlx_pixel_put.c
@@ -0,0 +1,26 @@
+/*
+ ** mlx_pixel_put.c for MiniLibX in
+ **
+ ** Made by Charlie Root
+ ** Login
+ **
+ ** Started on Mon Jul 31 19:01:33 2000 Charlie Root
+** Last update Tue Sep 25 17:09:49 2001 Charlie Root
+ */
+
+
+#include "mlx_int.h"
+
+
+
+int mlx_pixel_put(t_xvar *xvar,t_win_list *win,
+ int x,int y,int color)
+{
+ XGCValues xgcv;
+
+ xgcv.foreground = mlx_int_get_good_color(xvar,color);
+ XChangeGC(xvar->display,win->gc,GCForeground,&xgcv);
+ XDrawPoint(xvar->display,win->window,win->gc,x,y);
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+}
diff --git a/minilibx-linux/mlx_put_image_to_window.c b/minilibx-linux/mlx_put_image_to_window.c
new file mode 100644
index 0000000..86ba3f4
--- /dev/null
+++ b/minilibx-linux/mlx_put_image_to_window.c
@@ -0,0 +1,37 @@
+/*
+** mlx_put_image_to_window.c for MiniLibX in raytraceur
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Mon Aug 14 15:55:49 2000 Charlie Root
+** Last update Sun Oct 2 09:53:00 2005 Olivier Crouzet
+*/
+
+
+
+#include "mlx_int.h"
+
+
+int mlx_put_image_to_window(t_xvar *xvar,t_win_list *win,t_img *img,
+ int x,int y)
+{
+ GC gc;
+
+ gc = win->gc;
+ if (img->gc)
+ {
+ gc = img->gc;
+ XSetClipOrigin(xvar->display, gc, x, y);
+ }
+ if (img->type==MLX_TYPE_SHM)
+ XShmPutImage(xvar->display,img->pix, win->gc, img->image,0,0,0,0,
+ img->width,img->height,False);
+ if (img->type==MLX_TYPE_XIMAGE)
+ XPutImage(xvar->display,img->pix, win->gc, img->image,0,0,0,0,
+ img->width,img->height);
+ XCopyArea(xvar->display,img->pix,win->window, gc,
+ 0,0,img->width,img->height,x,y);
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+}
diff --git a/minilibx-linux/mlx_rgb.c b/minilibx-linux/mlx_rgb.c
new file mode 100644
index 0000000..0cfccf6
--- /dev/null
+++ b/minilibx-linux/mlx_rgb.c
@@ -0,0 +1,764 @@
+/*
+** This is a generated file with rgb2c.pl and rgb.txt from
+** the XFree86 distribution.
+*/
+
+#include "mlx_int.h"
+
+struct s_col_name mlx_col_name[] =
+{
+ { "snow" , 0xfffafa },
+ { "ghost white" , 0xf8f8ff },
+ { "ghostwhite" , 0xf8f8ff },
+ { "white smoke" , 0xf5f5f5 },
+ { "whitesmoke" , 0xf5f5f5 },
+ { "gainsboro" , 0xdcdcdc },
+ { "floral white" , 0xfffaf0 },
+ { "floralwhite" , 0xfffaf0 },
+ { "old lace" , 0xfdf5e6 },
+ { "oldlace" , 0xfdf5e6 },
+ { "linen" , 0xfaf0e6 },
+ { "antique white" , 0xfaebd7 },
+ { "antiquewhite" , 0xfaebd7 },
+ { "papaya whip" , 0xffefd5 },
+ { "papayawhip" , 0xffefd5 },
+ { "blanched almond" , 0xffebcd },
+ { "blanchedalmond" , 0xffebcd },
+ { "bisque" , 0xffe4c4 },
+ { "peach puff" , 0xffdab9 },
+ { "peachpuff" , 0xffdab9 },
+ { "navajo white" , 0xffdead },
+ { "navajowhite" , 0xffdead },
+ { "moccasin" , 0xffe4b5 },
+ { "cornsilk" , 0xfff8dc },
+ { "ivory" , 0xfffff0 },
+ { "lemon chiffon" , 0xfffacd },
+ { "lemonchiffon" , 0xfffacd },
+ { "seashell" , 0xfff5ee },
+ { "honeydew" , 0xf0fff0 },
+ { "mint cream" , 0xf5fffa },
+ { "mintcream" , 0xf5fffa },
+ { "azure" , 0xf0ffff },
+ { "alice blue" , 0xf0f8ff },
+ { "aliceblue" , 0xf0f8ff },
+ { "lavender" , 0xe6e6fa },
+ { "lavender blush" , 0xfff0f5 },
+ { "lavenderblush" , 0xfff0f5 },
+ { "misty rose" , 0xffe4e1 },
+ { "mistyrose" , 0xffe4e1 },
+ { "white" , 0xffffff },
+ { "black" , 0x0 },
+ { "dark slate" , 0x2f4f4f },
+ { "darkslategray" , 0x2f4f4f },
+ { "dark slate" , 0x2f4f4f },
+ { "darkslategrey" , 0x2f4f4f },
+ { "dim gray" , 0x696969 },
+ { "dimgray" , 0x696969 },
+ { "dim grey" , 0x696969 },
+ { "dimgrey" , 0x696969 },
+ { "slate gray" , 0x708090 },
+ { "slategray" , 0x708090 },
+ { "slate grey" , 0x708090 },
+ { "slategrey" , 0x708090 },
+ { "light slate" , 0x778899 },
+ { "lightslategray" , 0x778899 },
+ { "light slate" , 0x778899 },
+ { "lightslategrey" , 0x778899 },
+ { "gray" , 0xbebebe },
+ { "grey" , 0xbebebe },
+ { "light grey" , 0xd3d3d3 },
+ { "lightgrey" , 0xd3d3d3 },
+ { "light gray" , 0xd3d3d3 },
+ { "lightgray" , 0xd3d3d3 },
+ { "midnight blue" , 0x191970 },
+ { "midnightblue" , 0x191970 },
+ { "navy" , 0x80 },
+ { "navy blue" , 0x80 },
+ { "navyblue" , 0x80 },
+ { "cornflower blue" , 0x6495ed },
+ { "cornflowerblue" , 0x6495ed },
+ { "dark slate" , 0x483d8b },
+ { "darkslateblue" , 0x483d8b },
+ { "slate blue" , 0x6a5acd },
+ { "slateblue" , 0x6a5acd },
+ { "medium slate" , 0x7b68ee },
+ { "mediumslateblue" , 0x7b68ee },
+ { "light slate" , 0x8470ff },
+ { "lightslateblue" , 0x8470ff },
+ { "medium blue" , 0xcd },
+ { "mediumblue" , 0xcd },
+ { "royal blue" , 0x4169e1 },
+ { "royalblue" , 0x4169e1 },
+ { "blue" , 0xff },
+ { "dodger blue" , 0x1e90ff },
+ { "dodgerblue" , 0x1e90ff },
+ { "deep sky" , 0xbfff },
+ { "deepskyblue" , 0xbfff },
+ { "sky blue" , 0x87ceeb },
+ { "skyblue" , 0x87ceeb },
+ { "light sky" , 0x87cefa },
+ { "lightskyblue" , 0x87cefa },
+ { "steel blue" , 0x4682b4 },
+ { "steelblue" , 0x4682b4 },
+ { "light steel" , 0xb0c4de },
+ { "lightsteelblue" , 0xb0c4de },
+ { "light blue" , 0xadd8e6 },
+ { "lightblue" , 0xadd8e6 },
+ { "powder blue" , 0xb0e0e6 },
+ { "powderblue" , 0xb0e0e6 },
+ { "pale turquoise" , 0xafeeee },
+ { "paleturquoise" , 0xafeeee },
+ { "dark turquoise" , 0xced1 },
+ { "darkturquoise" , 0xced1 },
+ { "medium turquoise" , 0x48d1cc },
+ { "mediumturquoise" , 0x48d1cc },
+ { "turquoise" , 0x40e0d0 },
+ { "cyan" , 0xffff },
+ { "light cyan" , 0xe0ffff },
+ { "lightcyan" , 0xe0ffff },
+ { "cadet blue" , 0x5f9ea0 },
+ { "cadetblue" , 0x5f9ea0 },
+ { "medium aquamarine" , 0x66cdaa },
+ { "mediumaquamarine" , 0x66cdaa },
+ { "aquamarine" , 0x7fffd4 },
+ { "dark green" , 0x6400 },
+ { "darkgreen" , 0x6400 },
+ { "dark olive" , 0x556b2f },
+ { "darkolivegreen" , 0x556b2f },
+ { "dark sea" , 0x8fbc8f },
+ { "darkseagreen" , 0x8fbc8f },
+ { "sea green" , 0x2e8b57 },
+ { "seagreen" , 0x2e8b57 },
+ { "medium sea" , 0x3cb371 },
+ { "mediumseagreen" , 0x3cb371 },
+ { "light sea" , 0x20b2aa },
+ { "lightseagreen" , 0x20b2aa },
+ { "pale green" , 0x98fb98 },
+ { "palegreen" , 0x98fb98 },
+ { "spring green" , 0xff7f },
+ { "springgreen" , 0xff7f },
+ { "lawn green" , 0x7cfc00 },
+ { "lawngreen" , 0x7cfc00 },
+ { "green" , 0xff00 },
+ { "chartreuse" , 0x7fff00 },
+ { "medium spring" , 0xfa9a },
+ { "mediumspringgreen" , 0xfa9a },
+ { "green yellow" , 0xadff2f },
+ { "greenyellow" , 0xadff2f },
+ { "lime green" , 0x32cd32 },
+ { "limegreen" , 0x32cd32 },
+ { "yellow green" , 0x9acd32 },
+ { "yellowgreen" , 0x9acd32 },
+ { "forest green" , 0x228b22 },
+ { "forestgreen" , 0x228b22 },
+ { "olive drab" , 0x6b8e23 },
+ { "olivedrab" , 0x6b8e23 },
+ { "dark khaki" , 0xbdb76b },
+ { "darkkhaki" , 0xbdb76b },
+ { "khaki" , 0xf0e68c },
+ { "pale goldenrod" , 0xeee8aa },
+ { "palegoldenrod" , 0xeee8aa },
+ { "light goldenrod" , 0xfafad2 },
+ { "lightgoldenrodyellow" , 0xfafad2 },
+ { "light yellow" , 0xffffe0 },
+ { "lightyellow" , 0xffffe0 },
+ { "yellow" , 0xffff00 },
+ { "gold" , 0xffd700 },
+ { "light goldenrod" , 0xeedd82 },
+ { "lightgoldenrod" , 0xeedd82 },
+ { "goldenrod" , 0xdaa520 },
+ { "dark goldenrod" , 0xb8860b },
+ { "darkgoldenrod" , 0xb8860b },
+ { "rosy brown" , 0xbc8f8f },
+ { "rosybrown" , 0xbc8f8f },
+ { "indian red" , 0xcd5c5c },
+ { "indianred" , 0xcd5c5c },
+ { "saddle brown" , 0x8b4513 },
+ { "saddlebrown" , 0x8b4513 },
+ { "sienna" , 0xa0522d },
+ { "peru" , 0xcd853f },
+ { "burlywood" , 0xdeb887 },
+ { "beige" , 0xf5f5dc },
+ { "wheat" , 0xf5deb3 },
+ { "sandy brown" , 0xf4a460 },
+ { "sandybrown" , 0xf4a460 },
+ { "tan" , 0xd2b48c },
+ { "chocolate" , 0xd2691e },
+ { "firebrick" , 0xb22222 },
+ { "brown" , 0xa52a2a },
+ { "dark salmon" , 0xe9967a },
+ { "darksalmon" , 0xe9967a },
+ { "salmon" , 0xfa8072 },
+ { "light salmon" , 0xffa07a },
+ { "lightsalmon" , 0xffa07a },
+ { "orange" , 0xffa500 },
+ { "dark orange" , 0xff8c00 },
+ { "darkorange" , 0xff8c00 },
+ { "coral" , 0xff7f50 },
+ { "light coral" , 0xf08080 },
+ { "lightcoral" , 0xf08080 },
+ { "tomato" , 0xff6347 },
+ { "orange red" , 0xff4500 },
+ { "orangered" , 0xff4500 },
+ { "red" , 0xff0000 },
+ { "hot pink" , 0xff69b4 },
+ { "hotpink" , 0xff69b4 },
+ { "deep pink" , 0xff1493 },
+ { "deeppink" , 0xff1493 },
+ { "pink" , 0xffc0cb },
+ { "light pink" , 0xffb6c1 },
+ { "lightpink" , 0xffb6c1 },
+ { "pale violet" , 0xdb7093 },
+ { "palevioletred" , 0xdb7093 },
+ { "maroon" , 0xb03060 },
+ { "medium violet" , 0xc71585 },
+ { "mediumvioletred" , 0xc71585 },
+ { "violet red" , 0xd02090 },
+ { "violetred" , 0xd02090 },
+ { "magenta" , 0xff00ff },
+ { "violet" , 0xee82ee },
+ { "plum" , 0xdda0dd },
+ { "orchid" , 0xda70d6 },
+ { "medium orchid" , 0xba55d3 },
+ { "mediumorchid" , 0xba55d3 },
+ { "dark orchid" , 0x9932cc },
+ { "darkorchid" , 0x9932cc },
+ { "dark violet" , 0x9400d3 },
+ { "darkviolet" , 0x9400d3 },
+ { "blue violet" , 0x8a2be2 },
+ { "blueviolet" , 0x8a2be2 },
+ { "purple" , 0xa020f0 },
+ { "medium purple" , 0x9370db },
+ { "mediumpurple" , 0x9370db },
+ { "thistle" , 0xd8bfd8 },
+ { "snow1" , 0xfffafa },
+ { "snow2" , 0xeee9e9 },
+ { "snow3" , 0xcdc9c9 },
+ { "snow4" , 0x8b8989 },
+ { "seashell1" , 0xfff5ee },
+ { "seashell2" , 0xeee5de },
+ { "seashell3" , 0xcdc5bf },
+ { "seashell4" , 0x8b8682 },
+ { "antiquewhite1" , 0xffefdb },
+ { "antiquewhite2" , 0xeedfcc },
+ { "antiquewhite3" , 0xcdc0b0 },
+ { "antiquewhite4" , 0x8b8378 },
+ { "bisque1" , 0xffe4c4 },
+ { "bisque2" , 0xeed5b7 },
+ { "bisque3" , 0xcdb79e },
+ { "bisque4" , 0x8b7d6b },
+ { "peachpuff1" , 0xffdab9 },
+ { "peachpuff2" , 0xeecbad },
+ { "peachpuff3" , 0xcdaf95 },
+ { "peachpuff4" , 0x8b7765 },
+ { "navajowhite1" , 0xffdead },
+ { "navajowhite2" , 0xeecfa1 },
+ { "navajowhite3" , 0xcdb38b },
+ { "navajowhite4" , 0x8b795e },
+ { "lemonchiffon1" , 0xfffacd },
+ { "lemonchiffon2" , 0xeee9bf },
+ { "lemonchiffon3" , 0xcdc9a5 },
+ { "lemonchiffon4" , 0x8b8970 },
+ { "cornsilk1" , 0xfff8dc },
+ { "cornsilk2" , 0xeee8cd },
+ { "cornsilk3" , 0xcdc8b1 },
+ { "cornsilk4" , 0x8b8878 },
+ { "ivory1" , 0xfffff0 },
+ { "ivory2" , 0xeeeee0 },
+ { "ivory3" , 0xcdcdc1 },
+ { "ivory4" , 0x8b8b83 },
+ { "honeydew1" , 0xf0fff0 },
+ { "honeydew2" , 0xe0eee0 },
+ { "honeydew3" , 0xc1cdc1 },
+ { "honeydew4" , 0x838b83 },
+ { "lavenderblush1" , 0xfff0f5 },
+ { "lavenderblush2" , 0xeee0e5 },
+ { "lavenderblush3" , 0xcdc1c5 },
+ { "lavenderblush4" , 0x8b8386 },
+ { "mistyrose1" , 0xffe4e1 },
+ { "mistyrose2" , 0xeed5d2 },
+ { "mistyrose3" , 0xcdb7b5 },
+ { "mistyrose4" , 0x8b7d7b },
+ { "azure1" , 0xf0ffff },
+ { "azure2" , 0xe0eeee },
+ { "azure3" , 0xc1cdcd },
+ { "azure4" , 0x838b8b },
+ { "slateblue1" , 0x836fff },
+ { "slateblue2" , 0x7a67ee },
+ { "slateblue3" , 0x6959cd },
+ { "slateblue4" , 0x473c8b },
+ { "royalblue1" , 0x4876ff },
+ { "royalblue2" , 0x436eee },
+ { "royalblue3" , 0x3a5fcd },
+ { "royalblue4" , 0x27408b },
+ { "blue1" , 0xff },
+ { "blue2" , 0xee },
+ { "blue3" , 0xcd },
+ { "blue4" , 0x8b },
+ { "dodgerblue1" , 0x1e90ff },
+ { "dodgerblue2" , 0x1c86ee },
+ { "dodgerblue3" , 0x1874cd },
+ { "dodgerblue4" , 0x104e8b },
+ { "steelblue1" , 0x63b8ff },
+ { "steelblue2" , 0x5cacee },
+ { "steelblue3" , 0x4f94cd },
+ { "steelblue4" , 0x36648b },
+ { "deepskyblue1" , 0xbfff },
+ { "deepskyblue2" , 0xb2ee },
+ { "deepskyblue3" , 0x9acd },
+ { "deepskyblue4" , 0x688b },
+ { "skyblue1" , 0x87ceff },
+ { "skyblue2" , 0x7ec0ee },
+ { "skyblue3" , 0x6ca6cd },
+ { "skyblue4" , 0x4a708b },
+ { "lightskyblue1" , 0xb0e2ff },
+ { "lightskyblue2" , 0xa4d3ee },
+ { "lightskyblue3" , 0x8db6cd },
+ { "lightskyblue4" , 0x607b8b },
+ { "slategray1" , 0xc6e2ff },
+ { "slategray2" , 0xb9d3ee },
+ { "slategray3" , 0x9fb6cd },
+ { "slategray4" , 0x6c7b8b },
+ { "lightsteelblue1" , 0xcae1ff },
+ { "lightsteelblue2" , 0xbcd2ee },
+ { "lightsteelblue3" , 0xa2b5cd },
+ { "lightsteelblue4" , 0x6e7b8b },
+ { "lightblue1" , 0xbfefff },
+ { "lightblue2" , 0xb2dfee },
+ { "lightblue3" , 0x9ac0cd },
+ { "lightblue4" , 0x68838b },
+ { "lightcyan1" , 0xe0ffff },
+ { "lightcyan2" , 0xd1eeee },
+ { "lightcyan3" , 0xb4cdcd },
+ { "lightcyan4" , 0x7a8b8b },
+ { "paleturquoise1" , 0xbbffff },
+ { "paleturquoise2" , 0xaeeeee },
+ { "paleturquoise3" , 0x96cdcd },
+ { "paleturquoise4" , 0x668b8b },
+ { "cadetblue1" , 0x98f5ff },
+ { "cadetblue2" , 0x8ee5ee },
+ { "cadetblue3" , 0x7ac5cd },
+ { "cadetblue4" , 0x53868b },
+ { "turquoise1" , 0xf5ff },
+ { "turquoise2" , 0xe5ee },
+ { "turquoise3" , 0xc5cd },
+ { "turquoise4" , 0x868b },
+ { "cyan1" , 0xffff },
+ { "cyan2" , 0xeeee },
+ { "cyan3" , 0xcdcd },
+ { "cyan4" , 0x8b8b },
+ { "darkslategray1" , 0x97ffff },
+ { "darkslategray2" , 0x8deeee },
+ { "darkslategray3" , 0x79cdcd },
+ { "darkslategray4" , 0x528b8b },
+ { "aquamarine1" , 0x7fffd4 },
+ { "aquamarine2" , 0x76eec6 },
+ { "aquamarine3" , 0x66cdaa },
+ { "aquamarine4" , 0x458b74 },
+ { "darkseagreen1" , 0xc1ffc1 },
+ { "darkseagreen2" , 0xb4eeb4 },
+ { "darkseagreen3" , 0x9bcd9b },
+ { "darkseagreen4" , 0x698b69 },
+ { "seagreen1" , 0x54ff9f },
+ { "seagreen2" , 0x4eee94 },
+ { "seagreen3" , 0x43cd80 },
+ { "seagreen4" , 0x2e8b57 },
+ { "palegreen1" , 0x9aff9a },
+ { "palegreen2" , 0x90ee90 },
+ { "palegreen3" , 0x7ccd7c },
+ { "palegreen4" , 0x548b54 },
+ { "springgreen1" , 0xff7f },
+ { "springgreen2" , 0xee76 },
+ { "springgreen3" , 0xcd66 },
+ { "springgreen4" , 0x8b45 },
+ { "green1" , 0xff00 },
+ { "green2" , 0xee00 },
+ { "green3" , 0xcd00 },
+ { "green4" , 0x8b00 },
+ { "chartreuse1" , 0x7fff00 },
+ { "chartreuse2" , 0x76ee00 },
+ { "chartreuse3" , 0x66cd00 },
+ { "chartreuse4" , 0x458b00 },
+ { "olivedrab1" , 0xc0ff3e },
+ { "olivedrab2" , 0xb3ee3a },
+ { "olivedrab3" , 0x9acd32 },
+ { "olivedrab4" , 0x698b22 },
+ { "darkolivegreen1" , 0xcaff70 },
+ { "darkolivegreen2" , 0xbcee68 },
+ { "darkolivegreen3" , 0xa2cd5a },
+ { "darkolivegreen4" , 0x6e8b3d },
+ { "khaki1" , 0xfff68f },
+ { "khaki2" , 0xeee685 },
+ { "khaki3" , 0xcdc673 },
+ { "khaki4" , 0x8b864e },
+ { "lightgoldenrod1" , 0xffec8b },
+ { "lightgoldenrod2" , 0xeedc82 },
+ { "lightgoldenrod3" , 0xcdbe70 },
+ { "lightgoldenrod4" , 0x8b814c },
+ { "lightyellow1" , 0xffffe0 },
+ { "lightyellow2" , 0xeeeed1 },
+ { "lightyellow3" , 0xcdcdb4 },
+ { "lightyellow4" , 0x8b8b7a },
+ { "yellow1" , 0xffff00 },
+ { "yellow2" , 0xeeee00 },
+ { "yellow3" , 0xcdcd00 },
+ { "yellow4" , 0x8b8b00 },
+ { "gold1" , 0xffd700 },
+ { "gold2" , 0xeec900 },
+ { "gold3" , 0xcdad00 },
+ { "gold4" , 0x8b7500 },
+ { "goldenrod1" , 0xffc125 },
+ { "goldenrod2" , 0xeeb422 },
+ { "goldenrod3" , 0xcd9b1d },
+ { "goldenrod4" , 0x8b6914 },
+ { "darkgoldenrod1" , 0xffb90f },
+ { "darkgoldenrod2" , 0xeead0e },
+ { "darkgoldenrod3" , 0xcd950c },
+ { "darkgoldenrod4" , 0x8b6508 },
+ { "rosybrown1" , 0xffc1c1 },
+ { "rosybrown2" , 0xeeb4b4 },
+ { "rosybrown3" , 0xcd9b9b },
+ { "rosybrown4" , 0x8b6969 },
+ { "indianred1" , 0xff6a6a },
+ { "indianred2" , 0xee6363 },
+ { "indianred3" , 0xcd5555 },
+ { "indianred4" , 0x8b3a3a },
+ { "sienna1" , 0xff8247 },
+ { "sienna2" , 0xee7942 },
+ { "sienna3" , 0xcd6839 },
+ { "sienna4" , 0x8b4726 },
+ { "burlywood1" , 0xffd39b },
+ { "burlywood2" , 0xeec591 },
+ { "burlywood3" , 0xcdaa7d },
+ { "burlywood4" , 0x8b7355 },
+ { "wheat1" , 0xffe7ba },
+ { "wheat2" , 0xeed8ae },
+ { "wheat3" , 0xcdba96 },
+ { "wheat4" , 0x8b7e66 },
+ { "tan1" , 0xffa54f },
+ { "tan2" , 0xee9a49 },
+ { "tan3" , 0xcd853f },
+ { "tan4" , 0x8b5a2b },
+ { "chocolate1" , 0xff7f24 },
+ { "chocolate2" , 0xee7621 },
+ { "chocolate3" , 0xcd661d },
+ { "chocolate4" , 0x8b4513 },
+ { "firebrick1" , 0xff3030 },
+ { "firebrick2" , 0xee2c2c },
+ { "firebrick3" , 0xcd2626 },
+ { "firebrick4" , 0x8b1a1a },
+ { "brown1" , 0xff4040 },
+ { "brown2" , 0xee3b3b },
+ { "brown3" , 0xcd3333 },
+ { "brown4" , 0x8b2323 },
+ { "salmon1" , 0xff8c69 },
+ { "salmon2" , 0xee8262 },
+ { "salmon3" , 0xcd7054 },
+ { "salmon4" , 0x8b4c39 },
+ { "lightsalmon1" , 0xffa07a },
+ { "lightsalmon2" , 0xee9572 },
+ { "lightsalmon3" , 0xcd8162 },
+ { "lightsalmon4" , 0x8b5742 },
+ { "orange1" , 0xffa500 },
+ { "orange2" , 0xee9a00 },
+ { "orange3" , 0xcd8500 },
+ { "orange4" , 0x8b5a00 },
+ { "darkorange1" , 0xff7f00 },
+ { "darkorange2" , 0xee7600 },
+ { "darkorange3" , 0xcd6600 },
+ { "darkorange4" , 0x8b4500 },
+ { "coral1" , 0xff7256 },
+ { "coral2" , 0xee6a50 },
+ { "coral3" , 0xcd5b45 },
+ { "coral4" , 0x8b3e2f },
+ { "tomato1" , 0xff6347 },
+ { "tomato2" , 0xee5c42 },
+ { "tomato3" , 0xcd4f39 },
+ { "tomato4" , 0x8b3626 },
+ { "orangered1" , 0xff4500 },
+ { "orangered2" , 0xee4000 },
+ { "orangered3" , 0xcd3700 },
+ { "orangered4" , 0x8b2500 },
+ { "red1" , 0xff0000 },
+ { "red2" , 0xee0000 },
+ { "red3" , 0xcd0000 },
+ { "red4" , 0x8b0000 },
+ { "deeppink1" , 0xff1493 },
+ { "deeppink2" , 0xee1289 },
+ { "deeppink3" , 0xcd1076 },
+ { "deeppink4" , 0x8b0a50 },
+ { "hotpink1" , 0xff6eb4 },
+ { "hotpink2" , 0xee6aa7 },
+ { "hotpink3" , 0xcd6090 },
+ { "hotpink4" , 0x8b3a62 },
+ { "pink1" , 0xffb5c5 },
+ { "pink2" , 0xeea9b8 },
+ { "pink3" , 0xcd919e },
+ { "pink4" , 0x8b636c },
+ { "lightpink1" , 0xffaeb9 },
+ { "lightpink2" , 0xeea2ad },
+ { "lightpink3" , 0xcd8c95 },
+ { "lightpink4" , 0x8b5f65 },
+ { "palevioletred1" , 0xff82ab },
+ { "palevioletred2" , 0xee799f },
+ { "palevioletred3" , 0xcd6889 },
+ { "palevioletred4" , 0x8b475d },
+ { "maroon1" , 0xff34b3 },
+ { "maroon2" , 0xee30a7 },
+ { "maroon3" , 0xcd2990 },
+ { "maroon4" , 0x8b1c62 },
+ { "violetred1" , 0xff3e96 },
+ { "violetred2" , 0xee3a8c },
+ { "violetred3" , 0xcd3278 },
+ { "violetred4" , 0x8b2252 },
+ { "magenta1" , 0xff00ff },
+ { "magenta2" , 0xee00ee },
+ { "magenta3" , 0xcd00cd },
+ { "magenta4" , 0x8b008b },
+ { "orchid1" , 0xff83fa },
+ { "orchid2" , 0xee7ae9 },
+ { "orchid3" , 0xcd69c9 },
+ { "orchid4" , 0x8b4789 },
+ { "plum1" , 0xffbbff },
+ { "plum2" , 0xeeaeee },
+ { "plum3" , 0xcd96cd },
+ { "plum4" , 0x8b668b },
+ { "mediumorchid1" , 0xe066ff },
+ { "mediumorchid2" , 0xd15fee },
+ { "mediumorchid3" , 0xb452cd },
+ { "mediumorchid4" , 0x7a378b },
+ { "darkorchid1" , 0xbf3eff },
+ { "darkorchid2" , 0xb23aee },
+ { "darkorchid3" , 0x9a32cd },
+ { "darkorchid4" , 0x68228b },
+ { "purple1" , 0x9b30ff },
+ { "purple2" , 0x912cee },
+ { "purple3" , 0x7d26cd },
+ { "purple4" , 0x551a8b },
+ { "mediumpurple1" , 0xab82ff },
+ { "mediumpurple2" , 0x9f79ee },
+ { "mediumpurple3" , 0x8968cd },
+ { "mediumpurple4" , 0x5d478b },
+ { "thistle1" , 0xffe1ff },
+ { "thistle2" , 0xeed2ee },
+ { "thistle3" , 0xcdb5cd },
+ { "thistle4" , 0x8b7b8b },
+ { "gray0" , 0x0 },
+ { "grey0" , 0x0 },
+ { "gray1" , 0x30303 },
+ { "grey1" , 0x30303 },
+ { "gray2" , 0x50505 },
+ { "grey2" , 0x50505 },
+ { "gray3" , 0x80808 },
+ { "grey3" , 0x80808 },
+ { "gray4" , 0xa0a0a },
+ { "grey4" , 0xa0a0a },
+ { "gray5" , 0xd0d0d },
+ { "grey5" , 0xd0d0d },
+ { "gray6" , 0xf0f0f },
+ { "grey6" , 0xf0f0f },
+ { "gray7" , 0x121212 },
+ { "grey7" , 0x121212 },
+ { "gray8" , 0x141414 },
+ { "grey8" , 0x141414 },
+ { "gray9" , 0x171717 },
+ { "grey9" , 0x171717 },
+ { "gray10" , 0x1a1a1a },
+ { "grey10" , 0x1a1a1a },
+ { "gray11" , 0x1c1c1c },
+ { "grey11" , 0x1c1c1c },
+ { "gray12" , 0x1f1f1f },
+ { "grey12" , 0x1f1f1f },
+ { "gray13" , 0x212121 },
+ { "grey13" , 0x212121 },
+ { "gray14" , 0x242424 },
+ { "grey14" , 0x242424 },
+ { "gray15" , 0x262626 },
+ { "grey15" , 0x262626 },
+ { "gray16" , 0x292929 },
+ { "grey16" , 0x292929 },
+ { "gray17" , 0x2b2b2b },
+ { "grey17" , 0x2b2b2b },
+ { "gray18" , 0x2e2e2e },
+ { "grey18" , 0x2e2e2e },
+ { "gray19" , 0x303030 },
+ { "grey19" , 0x303030 },
+ { "gray20" , 0x333333 },
+ { "grey20" , 0x333333 },
+ { "gray21" , 0x363636 },
+ { "grey21" , 0x363636 },
+ { "gray22" , 0x383838 },
+ { "grey22" , 0x383838 },
+ { "gray23" , 0x3b3b3b },
+ { "grey23" , 0x3b3b3b },
+ { "gray24" , 0x3d3d3d },
+ { "grey24" , 0x3d3d3d },
+ { "gray25" , 0x404040 },
+ { "grey25" , 0x404040 },
+ { "gray26" , 0x424242 },
+ { "grey26" , 0x424242 },
+ { "gray27" , 0x454545 },
+ { "grey27" , 0x454545 },
+ { "gray28" , 0x474747 },
+ { "grey28" , 0x474747 },
+ { "gray29" , 0x4a4a4a },
+ { "grey29" , 0x4a4a4a },
+ { "gray30" , 0x4d4d4d },
+ { "grey30" , 0x4d4d4d },
+ { "gray31" , 0x4f4f4f },
+ { "grey31" , 0x4f4f4f },
+ { "gray32" , 0x525252 },
+ { "grey32" , 0x525252 },
+ { "gray33" , 0x545454 },
+ { "grey33" , 0x545454 },
+ { "gray34" , 0x575757 },
+ { "grey34" , 0x575757 },
+ { "gray35" , 0x595959 },
+ { "grey35" , 0x595959 },
+ { "gray36" , 0x5c5c5c },
+ { "grey36" , 0x5c5c5c },
+ { "gray37" , 0x5e5e5e },
+ { "grey37" , 0x5e5e5e },
+ { "gray38" , 0x616161 },
+ { "grey38" , 0x616161 },
+ { "gray39" , 0x636363 },
+ { "grey39" , 0x636363 },
+ { "gray40" , 0x666666 },
+ { "grey40" , 0x666666 },
+ { "gray41" , 0x696969 },
+ { "grey41" , 0x696969 },
+ { "gray42" , 0x6b6b6b },
+ { "grey42" , 0x6b6b6b },
+ { "gray43" , 0x6e6e6e },
+ { "grey43" , 0x6e6e6e },
+ { "gray44" , 0x707070 },
+ { "grey44" , 0x707070 },
+ { "gray45" , 0x737373 },
+ { "grey45" , 0x737373 },
+ { "gray46" , 0x757575 },
+ { "grey46" , 0x757575 },
+ { "gray47" , 0x787878 },
+ { "grey47" , 0x787878 },
+ { "gray48" , 0x7a7a7a },
+ { "grey48" , 0x7a7a7a },
+ { "gray49" , 0x7d7d7d },
+ { "grey49" , 0x7d7d7d },
+ { "gray50" , 0x7f7f7f },
+ { "grey50" , 0x7f7f7f },
+ { "gray51" , 0x828282 },
+ { "grey51" , 0x828282 },
+ { "gray52" , 0x858585 },
+ { "grey52" , 0x858585 },
+ { "gray53" , 0x878787 },
+ { "grey53" , 0x878787 },
+ { "gray54" , 0x8a8a8a },
+ { "grey54" , 0x8a8a8a },
+ { "gray55" , 0x8c8c8c },
+ { "grey55" , 0x8c8c8c },
+ { "gray56" , 0x8f8f8f },
+ { "grey56" , 0x8f8f8f },
+ { "gray57" , 0x919191 },
+ { "grey57" , 0x919191 },
+ { "gray58" , 0x949494 },
+ { "grey58" , 0x949494 },
+ { "gray59" , 0x969696 },
+ { "grey59" , 0x969696 },
+ { "gray60" , 0x999999 },
+ { "grey60" , 0x999999 },
+ { "gray61" , 0x9c9c9c },
+ { "grey61" , 0x9c9c9c },
+ { "gray62" , 0x9e9e9e },
+ { "grey62" , 0x9e9e9e },
+ { "gray63" , 0xa1a1a1 },
+ { "grey63" , 0xa1a1a1 },
+ { "gray64" , 0xa3a3a3 },
+ { "grey64" , 0xa3a3a3 },
+ { "gray65" , 0xa6a6a6 },
+ { "grey65" , 0xa6a6a6 },
+ { "gray66" , 0xa8a8a8 },
+ { "grey66" , 0xa8a8a8 },
+ { "gray67" , 0xababab },
+ { "grey67" , 0xababab },
+ { "gray68" , 0xadadad },
+ { "grey68" , 0xadadad },
+ { "gray69" , 0xb0b0b0 },
+ { "grey69" , 0xb0b0b0 },
+ { "gray70" , 0xb3b3b3 },
+ { "grey70" , 0xb3b3b3 },
+ { "gray71" , 0xb5b5b5 },
+ { "grey71" , 0xb5b5b5 },
+ { "gray72" , 0xb8b8b8 },
+ { "grey72" , 0xb8b8b8 },
+ { "gray73" , 0xbababa },
+ { "grey73" , 0xbababa },
+ { "gray74" , 0xbdbdbd },
+ { "grey74" , 0xbdbdbd },
+ { "gray75" , 0xbfbfbf },
+ { "grey75" , 0xbfbfbf },
+ { "gray76" , 0xc2c2c2 },
+ { "grey76" , 0xc2c2c2 },
+ { "gray77" , 0xc4c4c4 },
+ { "grey77" , 0xc4c4c4 },
+ { "gray78" , 0xc7c7c7 },
+ { "grey78" , 0xc7c7c7 },
+ { "gray79" , 0xc9c9c9 },
+ { "grey79" , 0xc9c9c9 },
+ { "gray80" , 0xcccccc },
+ { "grey80" , 0xcccccc },
+ { "gray81" , 0xcfcfcf },
+ { "grey81" , 0xcfcfcf },
+ { "gray82" , 0xd1d1d1 },
+ { "grey82" , 0xd1d1d1 },
+ { "gray83" , 0xd4d4d4 },
+ { "grey83" , 0xd4d4d4 },
+ { "gray84" , 0xd6d6d6 },
+ { "grey84" , 0xd6d6d6 },
+ { "gray85" , 0xd9d9d9 },
+ { "grey85" , 0xd9d9d9 },
+ { "gray86" , 0xdbdbdb },
+ { "grey86" , 0xdbdbdb },
+ { "gray87" , 0xdedede },
+ { "grey87" , 0xdedede },
+ { "gray88" , 0xe0e0e0 },
+ { "grey88" , 0xe0e0e0 },
+ { "gray89" , 0xe3e3e3 },
+ { "grey89" , 0xe3e3e3 },
+ { "gray90" , 0xe5e5e5 },
+ { "grey90" , 0xe5e5e5 },
+ { "gray91" , 0xe8e8e8 },
+ { "grey91" , 0xe8e8e8 },
+ { "gray92" , 0xebebeb },
+ { "grey92" , 0xebebeb },
+ { "gray93" , 0xededed },
+ { "grey93" , 0xededed },
+ { "gray94" , 0xf0f0f0 },
+ { "grey94" , 0xf0f0f0 },
+ { "gray95" , 0xf2f2f2 },
+ { "grey95" , 0xf2f2f2 },
+ { "gray96" , 0xf5f5f5 },
+ { "grey96" , 0xf5f5f5 },
+ { "gray97" , 0xf7f7f7 },
+ { "grey97" , 0xf7f7f7 },
+ { "gray98" , 0xfafafa },
+ { "grey98" , 0xfafafa },
+ { "gray99" , 0xfcfcfc },
+ { "grey99" , 0xfcfcfc },
+ { "gray100" , 0xffffff },
+ { "grey100" , 0xffffff },
+ { "dark grey" , 0xa9a9a9 },
+ { "darkgrey" , 0xa9a9a9 },
+ { "dark gray" , 0xa9a9a9 },
+ { "darkgray" , 0xa9a9a9 },
+ { "dark blue" , 0x8b },
+ { "darkblue" , 0x8b },
+ { "dark cyan" , 0x8b8b },
+ { "darkcyan" , 0x8b8b },
+ { "dark magenta" , 0x8b008b },
+ { "darkmagenta" , 0x8b008b },
+ { "dark red" , 0x8b0000 },
+ { "darkred" , 0x8b0000 },
+ { "light green" , 0x90ee90 },
+ { "lightgreen" , 0x90ee90 },
+ { "none", -1 },
+ { 0, 0 }
+};
diff --git a/minilibx-linux/mlx_screen_size.c b/minilibx-linux/mlx_screen_size.c
new file mode 100644
index 0000000..835730d
--- /dev/null
+++ b/minilibx-linux/mlx_screen_size.c
@@ -0,0 +1,13 @@
+#include "mlx_int.h"
+
+int mlx_get_screen_size(void *mlx_ptr, int *sizex, int *sizey)
+{
+ XWindowAttributes xwAttr;
+ Status ret;
+ t_xvar *xvar;
+
+ xvar = mlx_ptr;
+ ret = XGetWindowAttributes(xvar->display, xvar->root, &xwAttr);
+ (*sizex) = xwAttr.width;
+ (*sizey) = xwAttr.height;
+}
diff --git a/minilibx-linux/mlx_set_font.c b/minilibx-linux/mlx_set_font.c
new file mode 100644
index 0000000..111e3b8
--- /dev/null
+++ b/minilibx-linux/mlx_set_font.c
@@ -0,0 +1,30 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* mlx_set_font.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: amalliar +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/09/30 13:30:47 by amalliar #+# #+# */
+/* Updated: 2020/09/30 17:08:36 by amalliar ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "mlx_int.h"
+
+/*
+** Allows to specify the font that will be used by mlx_string_put.
+**
+** Note: only fixed-width bitmap fonts are supported by Xlib, refer to xfontsel
+** utility to get valid font names for this function.
+*/
+
+void mlx_set_font(t_xvar *xvar, t_win_list *win, char *name)
+{
+ static Font font = 0;
+
+ if (font)
+ XUnloadFont(xvar->display, font);
+ font = XLoadFont(xvar->display, name);
+ XSetFont(xvar->display, win->gc, font);
+}
diff --git a/minilibx-linux/mlx_string_put.c b/minilibx-linux/mlx_string_put.c
new file mode 100644
index 0000000..8492a09
--- /dev/null
+++ b/minilibx-linux/mlx_string_put.c
@@ -0,0 +1,26 @@
+/*
+ ** mlx_string_put.c for MiniLibX in
+ **
+ ** Made by Charlie Root
+ ** Login
+ **
+ ** Started on Mon Jul 31 19:01:33 2000 Charlie Root
+** Last update Tue Sep 25 17:11:47 2001 Charlie Root
+ */
+
+
+#include "mlx_int.h"
+
+
+
+int mlx_string_put(t_xvar *xvar,t_win_list *win,
+ int x,int y,int color,char *string)
+{
+ XGCValues xgcv;
+
+ xgcv.foreground = mlx_int_get_good_color(xvar,color);
+ XChangeGC(xvar->display,win->gc,GCForeground,&xgcv);
+ XDrawString(xvar->display,win->window,win->gc,x,y,string,strlen(string));
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+}
diff --git a/minilibx-linux/mlx_xpm.c b/minilibx-linux/mlx_xpm.c
new file mode 100644
index 0000000..688cc94
--- /dev/null
+++ b/minilibx-linux/mlx_xpm.c
@@ -0,0 +1,345 @@
+/*
+ ** xpm-read.c for MinilibX in
+ **
+ ** Made by Charlie Root
+ ** Login
+ **
+ ** Started on Tue Dec 11 15:25:27 2001 olivier crouzet
+ ** Last update Sat Oct 1 14:56:13 2005 Olivier Crouzet
+ */
+
+
+#include "mlx_int.h"
+
+extern struct s_col_name mlx_col_name[];
+
+
+#define RETURN { if (colors) free(colors); if (tab) free(tab); \
+ tab = (void *)0; if (colors_direct) free(colors_direct); \
+ if (img) {XDestroyImage(img->image); \
+ XFreePixmap(xvar->display,img->pix);free(img);} \
+ return ((void *)0);}
+
+
+
+
+char *mlx_int_get_line(char *ptr,int *pos,int size)
+{
+ int pos2;
+ int pos3;
+ int pos4;
+
+ if ((pos2 = mlx_int_str_str(ptr+*pos,"\"",size-*pos))==-1)
+ return ((char *)0);
+ if ((pos3 = mlx_int_str_str(ptr+*pos+pos2+1,"\"",size-*pos-pos2-1))==-1)
+ return ((char *)0);
+ *(ptr+*pos+pos2) = 0;
+ *(ptr+*pos+pos2+1+pos3) = 0;
+ pos4 = *pos+pos2+1;
+ *pos += pos2+pos3+2;
+ return (ptr+pos4);
+}
+
+
+unsigned int strlcpy_is_not_posix(char *dest, char *src, unsigned int size)
+{
+ unsigned count;
+ unsigned i;
+
+ count = 0;
+ while (src[count] != '\0')
+ ++count;
+ i = 0;
+ while (src[i] != '\0' && i < (size - 1))
+ {
+ dest[i] = src[i];
+ ++i;
+ }
+ dest[i] = '\0';
+ return (count);
+}
+
+char *mlx_int_static_line(char **xpm_data,int *pos,int size)
+{
+ static char *copy = 0;
+ static int len = 0;
+ int len2;
+ char *str;
+
+ str = xpm_data[(*pos)++];
+ if ((len2 = strlen(str))>len)
+ {
+ if (copy)
+ free(copy);
+ if (!(copy = malloc(len2+1)))
+ return ((char *)0);
+ len = len2;
+ }
+ strlcpy_is_not_posix(copy, str, len2);
+
+ return (copy);
+}
+
+
+int mlx_int_get_col_name(char *str,int size)
+{
+ int result;
+
+ result = 0;
+ while (size--)
+ result = (result<<8)+*(str++);
+
+ return (result);
+}
+
+int mlx_int_get_text_rgb(char *name, char *end)
+{
+ int i;
+ char buff[64];
+
+ if (*name == '#')
+ return (strtol(name+1,0,16));
+ if (end)
+ {
+ snprintf(buff, 64, "%s %s", name, end);
+ name = buff;
+ }
+ i = 0;
+ while (mlx_col_name[i].name)
+ {
+ if (!strcasecmp(mlx_col_name[i].name, name))
+ return (mlx_col_name[i].color);
+ i ++;
+ }
+ return (0);
+}
+
+
+int mlx_int_xpm_set_pixel(t_img *img, char *data, int opp, int col, int x)
+{
+ int dec;
+
+ dec = opp;
+ while (dec--)
+ {
+ if (img->image->byte_order)
+ *(data+x*opp+dec) = col&0xFF;
+ else
+ *(data+x*opp+opp-dec-1) = col&0xFF;
+ col >>= 8;
+ }
+}
+
+
+void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)())
+{
+ int pos;
+ char *line;
+ char **tab;
+ char *data;
+ char *clip_data;
+ int nc;
+ int opp;
+ int cpp;
+ int col;
+ int rgb_col;
+ int col_name;
+ int method;
+ int x;
+ int i;
+ int j;
+ t_img *img;
+ t_xpm_col *colors;
+ int *colors_direct;
+ int width;
+ int height;
+ XImage *clip_img;
+ XGCValues xgcv;
+ Pixmap clip_pix;
+
+ colors = 0;
+ colors_direct = 0;
+ img = 0;
+ tab = 0;
+ pos = 0;
+ if (!(line = f(info,&pos,info_size)) ||
+ !(tab = mlx_int_str_to_wordtab(line)) || !(width = atoi(tab[0])) ||
+ !(height = atoi(tab[1])) || !(nc = atoi(tab[2])) ||
+ !(cpp = atoi(tab[3])) )
+ RETURN;
+ free(tab);
+ tab = 0;
+
+ method = 0;
+ if (cpp<=2)
+ {
+ method = 1;
+ if (!(colors_direct = malloc((cpp==2?65536:256)*sizeof(int))))
+ RETURN;
+ }
+ else
+ if (!(colors = malloc(nc*sizeof(*colors))))
+ RETURN;
+
+ clip_data = 0;
+
+ i = nc;
+ while (i--)
+ {
+ if (!(line = f(info,&pos,info_size)) ||
+ !(tab = mlx_int_str_to_wordtab(line+cpp)) )
+ RETURN;
+ j = 0;
+ while (tab[j] && strcmp(tab[j++],"c"));
+
+ if (!tab[j])
+ RETURN;
+ rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]);
+ /*
+ if ((rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]))==-1)
+ {
+ if (!(clip_data = malloc(4*width*height)) || ok, nice size ..
+ !(clip_img = XCreateImage(xvar->display, xvar->visual,
+ 1, XYPixmap, 0, clip_data,
+ width, height, 8, (width+7)/8)) )
+ RETURN;
+ memset(clip_data, 0xFF, 4*width*height);
+ }
+ */
+ if (method)
+ colors_direct[mlx_int_get_col_name(line,cpp)] = rgb_col;
+ // rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col;
+ else
+ {
+ colors[i].name = mlx_int_get_col_name(line,cpp);
+ colors[i].col = rgb_col; //rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col;
+ }
+ free(tab);
+ tab = (void *)0;
+ }
+
+ if (!(img = mlx_new_image(xvar,width,height)))
+ RETURN;
+ opp = img->bpp/8;
+
+
+ i = height;
+ data = img->data;
+ while (i--)
+ {
+ if (!(line = f(info,&pos,info_size)))
+ RETURN;
+ x = 0;
+ while (xsize_line;
+ }
+ /*
+ if (clip_data)
+ {
+ if (!(clip_pix = XCreatePixmap(xvar->display, xvar->root,
+ width, height, 1)) )
+ RETURN;
+ img->gc = XCreateGC(xvar->display, clip_pix, 0, &xgcv);
+ XPutImage(xvar->display, clip_pix, img->gc, clip_img,
+ 0, 0, 0, 0, width, height);
+ XFreeGC(xvar->display, img->gc);
+ xgcv.clip_mask = clip_pix;
+ xgcv.function = GXcopy;
+ xgcv.plane_mask = AllPlanes;
+ img->gc = XCreateGC(xvar->display, xvar->root, GCClipMask|GCFunction|
+ GCPlaneMask, &xgcv);
+ XSync(xvar->display, False);
+ XDestroyImage(clip_img);
+ }
+ */
+ if (colors)
+ free(colors);
+ if (colors_direct)
+ free(colors_direct);
+ return (img);
+}
+
+
+int mlx_int_file_get_rid_comment(char *ptr, int size)
+{
+ int com_begin;
+ int com_end;
+
+ while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1)
+ {
+ com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2);
+ memset(ptr+com_begin,' ',com_end+4);
+ }
+ while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1)
+ {
+ com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2);
+ memset(ptr+com_begin,' ',com_end+3);
+ }
+}
+
+
+void *mlx_xpm_file_to_image(t_xvar *xvar,char *file,int *width,int *height)
+{
+ int fd;
+ int size;
+ char *ptr;
+ t_img *img;
+
+ fd = -1;
+ if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 ||
+ (ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))==
+ (void *)MAP_FAILED)
+ {
+ if (fd>=0)
+ close(fd);
+ return ((void *)0);
+ }
+ mlx_int_file_get_rid_comment(ptr, size);
+ if (img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line))
+ {
+ *width = img->width;
+ *height = img->height;
+ }
+ munmap(ptr,size);
+ close(fd);
+ return (img);
+}
+
+void *mlx_xpm_to_image(t_xvar *xvar,char **xpm_data,int *width,int *height)
+{
+ t_img *img;
+
+ if (img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line))
+ {
+ *width = img->width;
+ *height = img->height;
+ }
+ return (img);
+}
diff --git a/minilibx-linux/mlx_xpm.c.ok b/minilibx-linux/mlx_xpm.c.ok
new file mode 100644
index 0000000..225ea3c
--- /dev/null
+++ b/minilibx-linux/mlx_xpm.c.ok
@@ -0,0 +1,310 @@
+/*
+** xpm-read.c for MinilibX in
+**
+** Made by Charlie Root
+** Login
+**
+** Started on Tue Dec 11 15:25:27 2001 olivier crouzet
+** Last update Sat Oct 1 14:40:55 2005 Olivier Crouzet
+*/
+
+
+#include "mlx_int.h"
+
+extern struct s_col_name mlx_col_name[];
+
+
+#define RETURN { if (colors) free(colors); if (tab) free(tab); \
+ if (colors_direct) free(colors_direct); \
+ if (img) {XDestroyImage(img->image); \
+ XFreePixmap(xvar->display,img->pix);free(img);} \
+ return ((void *)0);}
+
+
+
+
+char *mlx_int_get_line(char *ptr,int *pos,int size)
+{
+ int pos2;
+ int pos3;
+ int pos4;
+
+ if ((pos2 = mlx_int_str_str(ptr+*pos,"\"",size-*pos))==-1)
+ return ((char *)0);
+ if ((pos3 = mlx_int_str_str(ptr+*pos+pos2+1,"\"",size-*pos-pos2-1))==-1)
+ return ((char *)0);
+ *(ptr+*pos+pos2) = 0;
+ *(ptr+*pos+pos2+1+pos3) = 0;
+ pos4 = *pos+pos2+1;
+ *pos += pos2+pos3+2;
+ return (ptr+pos4);
+}
+
+
+
+char *mlx_int_static_line(char **xpm_data,int *pos,int size)
+{
+ static char *copy = 0;
+ static int len = 0;
+ int len2;
+ char *str;
+
+ str = xpm_data[(*pos)++];
+ if ((len2 = strlen(str))>len)
+ {
+ if (copy)
+ free(copy);
+ if (!(copy = malloc(len2+1)))
+ return ((char *)0);
+ len = len2;
+ }
+ /* strcpy(copy,str); */
+ strlcpy(copy, str, len2+1);
+ return (copy);
+}
+
+
+int mlx_int_get_col_name(char *str,int size)
+{
+ int result;
+
+ result = 0;
+ while (size--)
+ result = (result<<8)+*(str++);
+ return (result);
+}
+
+int mlx_int_get_text_rgb(char *name)
+{
+ int i;
+
+ if (*name == '#')
+ return (strtol(name+1,0,16));
+ i = 0;
+ while (mlx_col_name[i].name)
+ {
+ if (!strcasecmp(mlx_col_name[i].name, name))
+ return (mlx_col_name[i].color);
+ i ++;
+ }
+ return (0);
+}
+
+
+int mlx_int_xpm_set_pixel(t_img *img, char *data, int opp, int col, int x)
+{
+ int dec;
+
+ dec = opp;
+ while (dec--)
+ {
+ if (img->image->byte_order)
+ *(data+x*opp+dec) = col&0xFF;
+ else
+ *(data+x*opp+opp-dec-1) = col&0xFF;
+ col >>= 8;
+ }
+}
+
+
+void *mlx_int_parse_xpm(t_xvar *xvar,void *info,int info_size,char *(*f)())
+{
+ int pos;
+ char *line;
+ char **tab;
+ char *data;
+ char *clip_data;
+ int nc;
+ int opp;
+ int cpp;
+ int col;
+ int rgb_col;
+ int col_name;
+ int method;
+ int x;
+ int i;
+ int j;
+ t_img *img;
+ t_xpm_col *colors;
+ int *colors_direct;
+ int width;
+ int height;
+ XImage *clip_img;
+ XGCValues xgcv;
+ Pixmap clip_pix;
+
+ colors = 0;
+ colors_direct = 0;
+ img = 0;
+ tab = 0;
+ pos = 0;
+ if (!(line = f(info,&pos,info_size)) ||
+ !(tab = mlx_int_str_to_wordtab(line)) || !(width = atoi(tab[0])) ||
+ !(height = atoi(tab[1])) || !(nc = atoi(tab[2])) ||
+ !(cpp = atoi(tab[3])) )
+ RETURN;
+ free(tab);
+ tab = 0;
+
+ method = 0;
+ if (cpp<=2)
+ {
+ method = 1;
+ if (!(colors_direct = malloc((cpp==2?65536:256)*sizeof(int))))
+ RETURN;
+ }
+ else
+ if (!(colors = malloc(nc*sizeof(*colors))))
+ RETURN;
+
+ clip_data = 0;
+
+ i = nc;
+ while (i--)
+ {
+ if (!(line = f(info,&pos,info_size)) ||
+ !(tab = mlx_int_str_to_wordtab(line+cpp)) )
+ RETURN;
+ j = 0;
+ while (tab[j] && strcmp(tab[j++],"c"));
+ if (!tab[j])
+ RETURN;
+
+ if ((rgb_col = mlx_int_get_text_rgb(tab[j]))==-1)
+ {
+ if (!(clip_data = malloc(4*width*height)) || /* ok, nice size .. */
+ !(clip_img = XCreateImage(xvar->display, xvar->visual,
+ 1, XYPixmap, 0, clip_data,
+ width, height, 8, (width+7)/8)) )
+ RETURN;
+ memset(clip_data, 0xFF, 4*width*height);
+ }
+
+ if (method)
+ colors_direct[mlx_int_get_col_name(line,cpp)] =
+ rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col;
+ else
+ {
+ colors[i].name = mlx_int_get_col_name(line,cpp);
+ colors[i].col = rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col;
+ }
+ free(tab);
+ }
+
+ if (!(img = mlx_new_image(xvar,width,height)))
+ RETURN;
+ opp = img->bpp/8;
+
+
+ i = height;
+ data = img->data;
+ while (i--)
+ {
+ if (!(line = f(info,&pos,info_size)))
+ RETURN;
+ x = 0;
+ while (xsize_line;
+ }
+ if (clip_data)
+ {
+ if (!(clip_pix = XCreatePixmap(xvar->display, xvar->root,
+ width, height, 1)) )
+ RETURN;
+ img->gc = XCreateGC(xvar->display, clip_pix, 0, &xgcv);
+ XPutImage(xvar->display, clip_pix, img->gc, clip_img,
+ 0, 0, 0, 0, width, height);
+ XFreeGC(xvar->display, img->gc);
+ xgcv.clip_mask = clip_pix;
+ xgcv.function = GXcopy;
+ xgcv.plane_mask = AllPlanes;
+ img->gc = XCreateGC(xvar->display, xvar->root, GCClipMask|GCFunction|
+ GCPlaneMask, &xgcv);
+ XSync(xvar->display, False);
+ XDestroyImage(clip_img);
+ }
+ if (colors)
+ free(colors);
+ if (colors_direct)
+ free(colors_direct);
+ return (img);
+}
+
+
+int mlx_int_file_get_rid_comment(char *ptr, int size)
+{
+ int com_begin;
+ int com_end;
+
+ while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1)
+ {
+ com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2);
+ memset(ptr+com_begin,' ',com_end+4);
+ }
+ while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1)
+ {
+ com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2);
+ memset(ptr+com_begin,' ',com_end+3);
+ }
+}
+
+
+void *mlx_xpm_file_to_image(t_xvar *xvar,char *file,int *width,int *height)
+{
+ int fd;
+ int size;
+ char *ptr;
+ t_img *img;
+
+ fd = -1;
+ if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 ||
+ (ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))==
+ (void *)MAP_FAILED)
+ {
+ if (fd>=0)
+ close(fd);
+ return ((void *)0);
+ }
+ mlx_int_file_get_rid_comment(ptr, size);
+ if (img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line))
+ {
+ *width = img->width;
+ *height = img->height;
+ }
+ munmap(ptr,size);
+ close(fd);
+ return (img);
+}
+
+void *mlx_xpm_to_image(t_xvar *xvar,char **xpm_data,int *width,int *height)
+{
+ t_img *img;
+
+ if (img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line))
+ {
+ *width = img->width;
+ *height = img->height;
+ }
+ return (img);
+}
diff --git a/minilibx-linux/rgb2c.pl b/minilibx-linux/rgb2c.pl
new file mode 100755
index 0000000..9ef39a0
--- /dev/null
+++ b/minilibx-linux/rgb2c.pl
@@ -0,0 +1,38 @@
+#!/usr/bin/perl
+#
+## rgb2c.pl for MiniLibX in /home/boulon/work/c/raytraceur/minilibx
+##
+## Made by Olivier Crouzet
+## Login
+##
+## Started on Tue Oct 5 16:33:46 2004 Olivier Crouzet
+## Last update Tue Oct 5 16:36:11 2004 Olivier Crouzet
+##
+
+
+#
+# Generate a .c file with encoded colors, from the XFree86 rgb.txt file.
+#
+
+open(RGB, "/usr/X11/lib/X11/rgb.txt");
+
+
+printf("/*\n** This is a generated file with rgb2c.pl and rgb.txt from\n");
+printf("** the XFree86 distribution.\n*/\n\n");
+printf("struct s_col_name mlx_col_name[] =\n{\n");
+
+while ()
+{
+ @tab = split;
+ if ($tab[0] ne "!")
+ {
+ $color = $tab[3];
+ if ("$tab[4]" ne "")
+ {
+ $color = "$tab[3] $tab[4]";
+ }
+ printf(" { \"%s\" , 0x%x },\n", $color, $tab[0]*65536+$tab[1]*256+$tab[2]);
+ }
+}
+
+printf(" { 0, 0 }\n};\n");
diff --git a/minilibx-linux/test/Makefile.mk b/minilibx-linux/test/Makefile.mk
new file mode 100644
index 0000000..256235b
--- /dev/null
+++ b/minilibx-linux/test/Makefile.mk
@@ -0,0 +1,45 @@
+
+INC=%%%%
+
+INCLIB=$(INC)/../lib
+
+UNAME := $(shell uname)
+
+CFLAGS= -I$(INC) -O3 -I.. -g
+
+NAME= mlx-test
+SRC = main.c
+OBJ = $(SRC:%.c=%.o)
+
+LFLAGS = -L.. -lmlx -L$(INCLIB) -lXext -lX11 -lm
+
+ifeq ($(UNAME), Darwin)
+ # mac
+ CC = clang
+else ifeq ($(UNAME), FreeBSD)
+ # FreeBSD
+ CC = clang
+else
+ #Linux and others...
+ CC = gcc
+ LFLAGS += -lbsd
+endif
+
+all: $(NAME)
+
+$(NAME): $(OBJ)
+ $(CC) -o $(NAME) $(OBJ) $(LFLAGS)
+
+show:
+ @printf "UNAME : $(UNAME)\n"
+ @printf "NAME : $(NAME)\n"
+ @printf "CC : $(CC)\n"
+ @printf "CFLAGS : $(CFLAGS)\n"
+ @printf "LFLAGS : $(LFLAGS)\n"
+ @printf "SRC :\n $(SRC)\n"
+ @printf "OBJ :\n $(OBJ)\n"
+
+clean:
+ rm -f $(NAME) $(OBJ) *~ core *.core
+
+re: clean all
diff --git a/minilibx-linux/test/main.c b/minilibx-linux/test/main.c
new file mode 100644
index 0000000..578eaae
--- /dev/null
+++ b/minilibx-linux/test/main.c
@@ -0,0 +1,287 @@
+
+#include "mlx.h"
+#include "mlx_int.h"
+
+#define WIN1_SX 242
+#define WIN1_SY 242
+#define IM1_SX 42
+#define IM1_SY 42
+#define IM3_SX 242
+#define IM3_SY 242
+
+void *mlx;
+void *win1;
+void *win2;
+void *win3;
+void *im1;
+void *im2;
+void *im3;
+void *im4;
+int bpp1;
+int bpp2;
+int bpp3;
+int bpp4;
+int sl1;
+int sl2;
+int sl3;
+int sl4;
+int endian1;
+int endian2;
+int endian3;
+int endian4;
+char *data1;
+char *data2;
+char *data3;
+char *data4;
+int xpm1_x;
+int xpm1_y;
+
+int local_endian;
+
+int color_map_1(void *win,int w,int h);
+int color_map_2(unsigned char *data,int bpp,int sl,int w,int h,int endian, int type);
+
+int expose_win1(void *p)
+{
+ mlx_put_image_to_window(mlx,win1,im3,0,0);
+}
+
+int expose_win2(void *p)
+{
+ mlx_put_image_to_window(mlx,win2,im4,0,0);
+ mlx_put_image_to_window(mlx,win2,im2,0,0);
+}
+
+int key_win1(int key,void *p)
+{
+ printf("Key in Win1 : %d\n",key);
+ if (key==0xFF1B)
+ exit(0);
+}
+
+int key_win2(int key,void *p)
+{
+ printf("Key in Win2 : %d\n",key);
+ if (key==0xFF1B)
+ exit(0);
+}
+
+int key_win3(int key,void *p)
+{
+ printf("Key in Win3 : %d\n",key);
+ if (key==0xFF1B)
+ mlx_destroy_window(mlx,win3);
+}
+
+int mouse_win1(int button,int x,int y, void *p)
+{
+ printf("Mouse in Win1, button %d at %dx%d.\n",button,x,y);
+}
+
+int mouse_win2(int button,int x,int y, void *p)
+{
+ printf("Mouse in Win2, button %d at %dx%d.\n",button,x,y);
+}
+
+int mouse_win3(int x,int y, void *p)
+{
+ printf("Mouse moving in Win3, at %dx%d.\n",x,y);
+}
+
+
+int main()
+{
+ int a;
+
+ printf("MinilibX Test Program\n");
+ a = 0x11223344;
+ if (((unsigned char *)&a)[0] == 0x11)
+ local_endian = 1;
+ else
+ local_endian = 0;
+ printf(" => Local Endian : %d\n",local_endian);
+
+ printf(" => Connection ...");
+ if (!(mlx = mlx_init()))
+ {
+ printf(" !! KO !!\n");
+ exit(1);
+ }
+ printf("OK (use_xshm %d pshm_format %d)\n",((t_xvar *)mlx)->use_xshm,((t_xvar *)mlx)->pshm_format);
+
+ printf(" => Window1 %dx%d \"Title 1\" ...",WIN1_SX,WIN1_SY);
+ if (!(win1 = mlx_new_window(mlx,WIN1_SX,WIN1_SY,"Title1")))
+ {
+ printf(" !! KO !!\n");
+ exit(1);
+ }
+ printf("OK\n");
+
+ printf(" => Colormap sans event ...");
+ color_map_1(win1,WIN1_SX,WIN1_SY);
+ printf("OK\n");
+ sleep(2);
+
+ printf(" => Clear Window ...");
+ mlx_clear_window(mlx,win1);
+ printf("OK\n");
+ sleep(2);
+
+ printf(" => Image1 ZPixmap %dx%d ...",IM1_SX,IM1_SY);
+ if (!(im1 = mlx_new_image(mlx,IM1_SX,IM1_SY)))
+ {
+ printf(" !! KO !!\n");
+ exit(1);
+ }
+ data1 = mlx_get_data_addr(im1,&bpp1,&sl1,&endian1);
+ printf("OK (bpp1: %d, sizeline1: %d endian: %d type: %d)\n",bpp1,sl1,endian1,
+ ((t_img *)im1)->type);
+
+ printf(" => Fill Image1 ...");
+ color_map_2(data1,bpp1,sl1,IM1_SX,IM1_SY,endian1, 1);
+ printf("OK (pixmap : %d)\n",(int)((t_img *)im1)->pix);
+
+ printf(" => Put Image1 ...");
+ mlx_put_image_to_window(mlx,win1,im1,20,20);
+ printf("OK\n");
+ sleep(2);
+
+ printf(" => Destroy Image1 ... ");
+ mlx_destroy_image(mlx, im1);
+ printf("OK\n");
+ sleep(2);
+
+ printf(" => Image3 ZPixmap %dx%d ...",IM3_SX,IM3_SY);
+ if (!(im3 = mlx_new_image(mlx,IM3_SX,IM3_SY)))
+ {
+ printf(" !! KO !!\n");
+ exit(1);
+ }
+ data3 = mlx_get_data_addr(im3,&bpp3,&sl3,&endian3);
+ printf("OK (bpp3 %d, sizeline3 %d endian3 %d type %d)\n",bpp3,sl3,endian3,
+ ((t_img *)im3)->type);
+
+ printf(" => Fill Image3 ...");
+ color_map_2(data3,bpp3,sl3,IM3_SX,IM3_SY,endian3, 1);
+ printf("OK (pixmap : %d)\n",(int)((t_img *)im3)->pix);
+
+ printf(" => Put Image3 ...");
+ mlx_put_image_to_window(mlx,win1,im3,20,20);
+ printf("OK\n");
+ sleep(2);
+
+ printf(" => String ...");
+ mlx_string_put(mlx,win1,5,WIN1_SY/2,0xFF99FF,"String output");
+ mlx_string_put(mlx,win1,15,WIN1_SY/2+20,0x00FFFF,"MinilibX test");
+ printf("OK\n");
+ sleep(2);
+
+ printf(" => Xpm from file ...");
+ if (!(im2 = mlx_xpm_file_to_image(mlx,"open.xpm",&xpm1_x,&xpm1_y)))
+ {
+ printf(" !! KO !!\n");
+ exit(1);
+ }
+ data2 = mlx_get_data_addr(im2,&bpp2,&sl2,&endian2);
+ printf("OK (xpm %dx%d)(img bpp2: %d, sizeline2: %d endian: %d type: %d)\n",
+ xpm1_x,xpm1_y,bpp2,sl2,endian2,((t_img *)im2)->type);
+ sleep(2);
+
+ printf(" => Put xpm ...");
+ mlx_put_image_to_window(mlx,win1,im2,0,0);
+ mlx_put_image_to_window(mlx,win1,im2,100,100);
+ printf("OK\n");
+ sleep(2);
+
+ printf(" => 2nd window,");
+ win2 = mlx_new_window(mlx,WIN1_SX,WIN1_SY,"Title2");
+ if (!(im4 = mlx_new_image(mlx,IM3_SX, IM3_SY)))
+ {
+ printf(" !! KO !!\n");
+ exit(1);
+ }
+ data4 = mlx_get_data_addr(im4,&bpp4,&sl4,&endian4);
+ color_map_2(data4,bpp4,sl4,IM3_SX,IM3_SY,endian4, 2);
+
+ printf(" 3rd window, Installing hooks ...");
+ win3 = mlx_new_window(mlx,WIN1_SX,WIN1_SY,"Title3");
+ mlx_expose_hook(win1,expose_win1,0);
+ mlx_mouse_hook(win1,mouse_win1,0);
+ mlx_key_hook(win1,key_win1,0);
+ mlx_expose_hook(win2,expose_win2,0);
+ mlx_mouse_hook(win2,mouse_win2,0);
+ mlx_key_hook(win2,key_win2,0);
+ mlx_key_hook(win3,key_win3,0);
+
+ mlx_hook(win3, MotionNotify, PointerMotionMask, mouse_win3, 0);
+
+ printf("OK\nNow in Loop. Just play. Esc in 3 to destroy, 1&2 to quit.\n");
+
+ mlx_loop(mlx);
+}
+
+
+int color_map_1(void *win,int w,int h)
+{
+ int x;
+ int y;
+ int color;
+
+ x = w;
+ while (x--)
+ {
+ y = h;
+ while (y--)
+ {
+ color = (x*255)/w+((((w-x)*255)/w)<<16)+(((y*255)/h)<<8);
+ mlx_pixel_put(mlx,win,x,y,color);
+ }
+ }
+}
+
+
+int color_map_2(unsigned char *data,int bpp,int sl,int w,int h,int endian, int type)
+{
+ int x;
+ int y;
+ int opp;
+ int dec;
+ int color;
+ int color2;
+ unsigned char *ptr;
+
+ opp = bpp/8;
+ printf("(opp : %d) ",opp);
+ y = h;
+ while (y--)
+ {
+ ptr = data+y*sl;
+ x = w;
+ while (x--)
+ {
+ if (type==2)
+ color = (y*255)/w+((((w-x)*255)/w)<<16)
+ +(((y*255)/h)<<8);
+ else
+ color = (x*255)/w+((((w-x)*255)/w)<<16)+(((y*255)/h)<<8);
+ color2 = mlx_get_color_value(mlx,color);
+ dec = opp;
+ while (dec--)
+ if (endian==local_endian)
+ {
+ if (endian)
+ *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[4-opp+dec];
+ else
+ *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[dec];
+ }
+ else
+ {
+ if (endian)
+ *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[opp-1-dec];
+ else
+ *(ptr+x*opp+dec) = ((unsigned char *)(&color2))[3-dec];
+ }
+ }
+ }
+
+}
diff --git a/minilibx-linux/test/new_win.c b/minilibx-linux/test/new_win.c
new file mode 100644
index 0000000..62bed4b
--- /dev/null
+++ b/minilibx-linux/test/new_win.c
@@ -0,0 +1,31 @@
+
+
+
+#include "mlx.h"
+
+
+void *mlx;
+void *win1;
+void *win2;
+
+
+
+int gere_mouse(int x,int y,int button,void*toto)
+{
+ printf("Mouse event - new win\n");
+ mlx_destroy_window(mlx,win1);
+ win1 = mlx_new_window(mlx,random()%500,random()%500,"new win");
+ mlx_mouse_hook(win1,gere_mouse,0);
+}
+
+
+int main()
+{
+ srandom(time(0));
+ mlx = mlx_init();
+ win1 = mlx_new_window(mlx,300,300,"win1");
+ win2 = mlx_new_window(mlx,600,600,"win2");
+ mlx_mouse_hook(win1,gere_mouse,0);
+ mlx_mouse_hook(win2,gere_mouse,0);
+ mlx_loop(mlx);
+}
diff --git a/minilibx-linux/test/open.xpm b/minilibx-linux/test/open.xpm
new file mode 100644
index 0000000..87be371
--- /dev/null
+++ b/minilibx-linux/test/open.xpm
@@ -0,0 +1,1439 @@
+/* XPM */
+static char * open30_2_xpm[] = {
+"64 64 1372 2",
+" c None",
+". c #08090D",
+"+ c #1A1E23",
+"@ c #1F2124",
+"# c #060809",
+"$ c #1A1E21",
+"% c #4F606C",
+"& c #3D4145",
+"* c #868D93",
+"= c #454E56",
+"- c #627481",
+"; c #667C8A",
+"> c #2D3031",
+", c #D7E1E7",
+"' c #4D5157",
+") c #8997A5",
+"! c #282E31",
+"~ c #333B41",
+"{ c #A5C6DB",
+"] c #718C9B",
+"^ c #000000",
+"/ c #181B1F",
+"( c #262828",
+"_ c #D2DEE7",
+": c #B8C5D0",
+"< c #151719",
+"[ c #08090B",
+"} c #272B30",
+"| c #2D3037",
+"1 c #26282C",
+"2 c #1A1D1F",
+"3 c #B1CADB",
+"4 c #56646E",
+"5 c #080809",
+"6 c #080A0C",
+"7 c #1E2126",
+"8 c #98B7C9",
+"9 c #A2CAE2",
+"0 c #7FA1B5",
+"a c #06080A",
+"b c #252729",
+"c c #A7ADB2",
+"d c #272B2E",
+"e c #1E2023",
+"f c #C8D8E5",
+"g c #C9DDED",
+"h c #8996A3",
+"i c #6B7782",
+"j c #C7DFF0",
+"k c #CCE0F0",
+"l c #AFC1CF",
+"m c #47535B",
+"n c #B0D3E8",
+"o c #7E99A9",
+"p c #738493",
+"q c #97B4C7",
+"r c #53606A",
+"s c #6E8996",
+"t c #A1CBE3",
+"u c #9CC6DE",
+"v c #90B5CB",
+"w c #171D22",
+"x c #1E2629",
+"y c #020202",
+"z c #ABB3BA",
+"A c #BBC4C8",
+"B c #222323",
+"C c #141617",
+"D c #5D6164",
+"E c #ACB5BC",
+"F c #676D74",
+"G c #BDD4E5",
+"H c #B3D1E7",
+"I c #B0D1E7",
+"J c #728A99",
+"K c #94AEBF",
+"L c #B1D1E7",
+"M c #505C64",
+"N c #7B98A9",
+"O c #A1CBE0",
+"P c #99C3D9",
+"Q c #475863",
+"R c #A0C9DE",
+"S c #9CC6DA",
+"T c #9ECAE1",
+"U c #9CC5DD",
+"V c #9AC4DC",
+"W c #263137",
+"X c #3C4A55",
+"Y c #658190",
+"Z c #66686B",
+"` c #7D8085",
+" . c #363839",
+".. c #797E81",
+"+. c #D2DBE1",
+"@. c #DDE9F4",
+"#. c #CADEEF",
+"$. c #778593",
+"%. c #AED0E5",
+"&. c #9EC9DE",
+"*. c #9EC8DF",
+"=. c #9BC1D8",
+"-. c #9EC8DE",
+";. c #6B8596",
+">. c #9BC5DC",
+",. c #9BC6DF",
+"'. c #9CC5DC",
+"). c #688595",
+"!. c #6B8698",
+"~. c #9CC4DC",
+"{. c #9BC4DC",
+"]. c #9DC5DD",
+"^. c #647D8C",
+"/. c #485864",
+"(. c #161A1D",
+"_. c #36444C",
+":. c #95BDD5",
+"<. c #566E7E",
+"[. c #A4AAAD",
+"}. c #E9F2F7",
+"|. c #DEEAF6",
+"1. c #B5D4E9",
+"2. c #A9CFE3",
+"3. c #90B3C9",
+"4. c #9FCAE1",
+"5. c #9BC4DD",
+"6. c #7490A2",
+"7. c #99C2DB",
+"8. c #81A5BA",
+"9. c #9CC5DE",
+"0. c #98C1DA",
+"a. c #5F7889",
+"b. c #96BFD8",
+"c. c #44545F",
+"d. c #565A5E",
+"e. c #DFE6EC",
+"f. c #E6EEF7",
+"g. c #D6E4F2",
+"h. c #BFD6E9",
+"i. c #A9CCE3",
+"j. c #9FC8DD",
+"k. c #9DC6DD",
+"l. c #9CC4DD",
+"m. c #7D9FB0",
+"n. c #98C0D6",
+"o. c #9AC5DD",
+"p. c #97BFD8",
+"q. c #9BC5DF",
+"r. c #2D3840",
+"s. c #626567",
+"t. c #E7ECF5",
+"u. c #E1EAF5",
+"v. c #CEE3F3",
+"w. c #B7D6EA",
+"x. c #A4CBE0",
+"y. c #8AAFC5",
+"z. c #647F90",
+"A. c #648092",
+"B. c #89B0C7",
+"C. c #9CC6DF",
+"D. c #5D7486",
+"E. c #7B9BAF",
+"F. c #84A8BF",
+"G. c #9BC5DD",
+"H. c #96BED5",
+"I. c #4B5D69",
+"J. c #9BC5DE",
+"K. c #536B77",
+"L. c #2E3B41",
+"M. c #1B2124",
+"N. c #3F4F58",
+"O. c #4D5152",
+"P. c #E7EEF3",
+"Q. c #E2EAF5",
+"R. c #CEE2F2",
+"S. c #BAD5E9",
+"T. c #9DC2D7",
+"U. c #5C7281",
+"V. c #232A31",
+"W. c #08090A",
+"X. c #121418",
+"Y. c #131619",
+"Z. c #131719",
+"`. c #87ACC3",
+" + c #7B9BAE",
+".+ c #87ADC3",
+"++ c #8FB5CB",
+"@+ c #678295",
+"#+ c #96C0D8",
+"$+ c #607787",
+"%+ c #6B8595",
+"&+ c #96C1DB",
+"*+ c #6A8595",
+"=+ c #35424A",
+"-+ c #7090A1",
+";+ c #15191C",
+">+ c #2D3033",
+",+ c #DDE5EB",
+"'+ c #D2E3F1",
+")+ c #BAD7EB",
+"!+ c #A9CFE5",
+"~+ c #272F35",
+"{+ c #1C2227",
+"]+ c #4F697B",
+"^+ c #6B8FA9",
+"/+ c #759CB6",
+"(+ c #7BA0BB",
+"_+ c #80A5BC",
+":+ c #88B0C8",
+"<+ c #96C3DB",
+"[+ c #8FB6CD",
+"}+ c #80A1B3",
+"|+ c #556876",
+"1+ c #96BFD7",
+"2+ c #566B77",
+"3+ c #93B8CD",
+"4+ c #637A8D",
+"5+ c #9DC6DE",
+"6+ c #8FB4CA",
+"7+ c #55697A",
+"8+ c #6F8F9F",
+"9+ c #91BDD5",
+"0+ c #283239",
+"a+ c #050406",
+"b+ c #767B80",
+"c+ c #BDC6CE",
+"d+ c #D4E5F3",
+"e+ c #C1D7EA",
+"f+ c #A7CDE4",
+"g+ c #9FC9DE",
+"h+ c #668596",
+"i+ c #6D90AA",
+"j+ c #5C7994",
+"k+ c #60849F",
+"l+ c #6286A1",
+"m+ c #688CA8",
+"n+ c #7298B2",
+"o+ c #82A8C2",
+"p+ c #8FBAD5",
+"q+ c #96C2DB",
+"r+ c #89ADC4",
+"s+ c #96BED6",
+"t+ c #99C2DA",
+"u+ c #6C899A",
+"v+ c #92BBD2",
+"w+ c #9AC4DD",
+"x+ c #5B717D",
+"y+ c #9EC6DE",
+"z+ c #8BB1C9",
+"A+ c #718EA0",
+"B+ c #94C3DB",
+"C+ c #536B78",
+"D+ c #3E505F",
+"E+ c #4E6373",
+"F+ c #2C333C",
+"G+ c #070708",
+"H+ c #040404",
+"I+ c #1A1C1E",
+"J+ c #202326",
+"K+ c #050606",
+"L+ c #23292E",
+"M+ c #A1C0D4",
+"N+ c #9FC9DD",
+"O+ c #97C2DB",
+"P+ c #80A8C1",
+"Q+ c #668AA6",
+"R+ c #4B5D72",
+"S+ c #4C647A",
+"T+ c #5F80A0",
+"U+ c #60859E",
+"V+ c #678AA6",
+"W+ c #739BB5",
+"X+ c #85AEC7",
+"Y+ c #92BDD7",
+"Z+ c #96BFD5",
+"`+ c #627B8A",
+" @ c #89B1C9",
+".@ c #2B353C",
+"+@ c #7597B2",
+"@@ c #779CB8",
+"#@ c #52697C",
+"$@ c #1D2328",
+"%@ c #445663",
+"&@ c #5E7A8D",
+"*@ c #252F37",
+"=@ c #090909",
+"-@ c #859BB2",
+";@ c #859DB8",
+">@ c #6E8396",
+",@ c #252C33",
+"'@ c #9CC4D7",
+")@ c #92C0D9",
+"!@ c #79A0BA",
+"~@ c #6487A3",
+"{@ c #566979",
+"]@ c #8CB0C2",
+"^@ c #51697C",
+"/@ c #60849D",
+"(@ c #6D8EAC",
+"_@ c #7BA0BC",
+":@ c #8AB4CE",
+"<@ c #95C2DB",
+"[@ c #9AC5DC",
+"}@ c #95C1DA",
+"|@ c #607B8C",
+"1@ c #597488",
+"2@ c #7EA6BF",
+"3@ c #597587",
+"4@ c #455664",
+"5@ c #668598",
+"6@ c #82A9C4",
+"7@ c #617F92",
+"8@ c #1A2328",
+"9@ c #2B3137",
+"0@ c #728FAC",
+"a@ c #51657B",
+"b@ c #6B8AA8",
+"c@ c #8EAEC7",
+"d@ c #A8C8E2",
+"e@ c #92BDD6",
+"f@ c #769DBA",
+"g@ c #526E87",
+"h@ c #7490A0",
+"i@ c #A6CDE4",
+"j@ c #97BFD4",
+"k@ c #55697D",
+"l@ c #6286A0",
+"m@ c #7399B3",
+"n@ c #84ACC5",
+"o@ c #92BFD9",
+"p@ c #99C4DC",
+"q@ c #94C0DA",
+"r@ c #4F6575",
+"s@ c #7DA5BF",
+"t@ c #7FA2BC",
+"u@ c #8FB6CE",
+"v@ c #95C3DB",
+"w@ c #8EB8D2",
+"x@ c #6A879D",
+"y@ c #111318",
+"z@ c #252A30",
+"A@ c #81868C",
+"B@ c #A5ABAD",
+"C@ c #70767C",
+"D@ c #38434F",
+"E@ c #637F9B",
+"F@ c #516980",
+"G@ c #799AB5",
+"H@ c #A5C3D9",
+"I@ c #93BDD6",
+"J@ c #779EBA",
+"K@ c #445A6B",
+"L@ c #93B5C9",
+"M@ c #B6D3E8",
+"N@ c #AECFE4",
+"O@ c #95BDD2",
+"P@ c #52687A",
+"Q@ c #6486A3",
+"R@ c #7092B0",
+"S@ c #90BCD6",
+"T@ c #97C4DC",
+"U@ c #A0C9E0",
+"V@ c #99C5DD",
+"W@ c #86AEC6",
+"X@ c #8FBAD4",
+"Y@ c #91BDD6",
+"Z@ c #7094AC",
+"`@ c #2A353E",
+" # c #0B0E10",
+".# c #888D90",
+"+# c #787D82",
+"@# c #465360",
+"## c #56697F",
+"$# c #A6CADD",
+"%# c #5A7382",
+" c #6C8CAA",
+"*# c #A5BED3",
+"=# c #A7CAE0",
+"-# c #94C1DA",
+";# c #7EA4BF",
+"># c #415160",
+",# c #9DC3D5",
+"'# c #B3CFE1",
+")# c #AAC3D4",
+"!# c #A8CDE4",
+"~# c #89ACBE",
+"{# c #567088",
+"]# c #6C91AC",
+"^# c #81A7C2",
+"/# c #96C4DC",
+"(# c #85A9BD",
+"_# c #708C9B",
+":# c #5A6E7B",
+"<# c #6C8695",
+"[# c #97C3DB",
+"}# c #8BB5CE",
+"|# c #425461",
+"1# c #63819E",
+"2# c #415465",
+"3# c #0B0D0E",
+"4# c #607387",
+"5# c #687D8C",
+"6# c #B8D6E9",
+"7# c #7893A2",
+"8# c #576F85",
+"9# c #A7BACF",
+"0# c #B0CEE5",
+"a# c #98C4DC",
+"b# c #88B1CA",
+"c# c #36444E",
+"d# c #8FA0AD",
+"e# c #73818D",
+"f# c #596D81",
+"g# c #B4D0E4",
+"h# c #A3CDE2",
+"i# c #658296",
+"j# c #6A8DAB",
+"k# c #7BA5C0",
+"l# c #94BAD2",
+"m# c #6D899B",
+"n# c #99C3DC",
+"o# c #8EB9D2",
+"p# c #7AA0BA",
+"q# c #6C8FAB",
+"r# c #6484A1",
+"s# c #1F252C",
+"t# c #121619",
+"u# c #7E96B0",
+"v# c #7A8A96",
+"w# c #BCD7EA",
+"x# c #A0C5D9",
+"y# c #3C4B57",
+"z# c #A9BACD",
+"A# c #BCD5E8",
+"B# c #84A6BA",
+"C# c #8EA1AE",
+"D# c #CFD1D4",
+"E# c #ECF6FA",
+"F# c #ABB7C2",
+"G# c #556F84",
+"H# c #57626A",
+"I# c #5C7078",
+"J# c #6C8AA7",
+"K# c #80A6C0",
+"L# c #91B8D0",
+"M# c #94BFD8",
+"N# c #87B0CA",
+"O# c #7CA2BB",
+"P# c #7097AF",
+"Q# c #495E6F",
+"R# c #0C0E11",
+"S# c #3A3F43",
+"T# c #8AA3BB",
+"U# c #778592",
+"V# c #C0D8EB",
+"W# c #B3D5E9",
+"X# c #404A53",
+"Y# c #B2C2D3",
+"Z# c #96A1AC",
+"`# c #9DB2C3",
+" $ c #AEBECE",
+".$ c #EDEFF3",
+"+$ c #F7FAFC",
+"@$ c #B6BFC7",
+"#$ c #556E85",
+"$$ c #121314",
+"%$ c #2B2E2F",
+"&$ c #555A5E",
+"*$ c #3B4C5B",
+"=$ c #6F8EA4",
+"-$ c #92BED8",
+";$ c #9DC7DF",
+">$ c #87ACC1",
+",$ c #546A78",
+"'$ c #516874",
+")$ c #4E6570",
+"!$ c #4D6271",
+"~$ c #4C6271",
+"{$ c #4E677A",
+"]$ c #38454E",
+"^$ c #6C7278",
+"/$ c #86A1B6",
+"($ c #5C656C",
+"_$ c #A4B0BA",
+":$ c #555D64",
+"<$ c #657178",
+"[$ c #A6B0B5",
+"}$ c #939CA1",
+"|$ c #D4E4F1",
+"1$ c #A0BACE",
+"2$ c #B9C7D7",
+"3$ c #F6F7F9",
+"4$ c #C6CED1",
+"5$ c #506A7C",
+"6$ c #060607",
+"7$ c #676A6B",
+"8$ c #91999F",
+"9$ c #7CA3BE",
+"0$ c #96BCD4",
+"a$ c #5B717E",
+"b$ c #4B5F6C",
+"c$ c #455864",
+"d$ c #5B717F",
+"e$ c #81A5B9",
+"f$ c #98C4DD",
+"g$ c #93BFD8",
+"h$ c #87B1CA",
+"i$ c #7BA1BC",
+"j$ c #5A7489",
+"k$ c #222A33",
+"l$ c #838A92",
+"m$ c #9DADBC",
+"n$ c #ECF0F5",
+"o$ c #F1F9FB",
+"p$ c #818A8D",
+"q$ c #4A5155",
+"r$ c #6A6F72",
+"s$ c #7E898F",
+"t$ c #E6F1F7",
+"u$ c #CADCED",
+"v$ c #A0B7CC",
+"w$ c #C6D1DF",
+"x$ c #AFB3B4",
+"y$ c #5F707D",
+"z$ c #CBCFD1",
+"A$ c #F4F5F6",
+"B$ c #66737F",
+"C$ c #87B2CB",
+"D$ c #90B7CD",
+"E$ c #596E7B",
+"F$ c #586F7E",
+"G$ c #8BB0C8",
+"H$ c #91BED6",
+"I$ c #83ADC7",
+"J$ c #6D8EA7",
+"K$ c #3F5161",
+"L$ c #2D3A45",
+"M$ c #1F2020",
+"N$ c #BDC5CC",
+"O$ c #E0EDF5",
+"P$ c #BBCAD8",
+"Q$ c #E1E4E7",
+"R$ c #5E6368",
+"S$ c #5B5F62",
+"T$ c #D9E7F3",
+"U$ c #A4C3D6",
+"V$ c #89A3B3",
+"W$ c #7B91A1",
+"X$ c #627990",
+"Y$ c #42505A",
+"Z$ c #CACCCE",
+"`$ c #F9F9F9",
+" % c #FDFDFD",
+".% c #BCBEC0",
+"+% c #5C7689",
+"@% c #8DB9D3",
+"#% c #8FB5CC",
+"$% c #536471",
+"%% c #98C1D9",
+"&% c #91BED7",
+"*% c #81AAC5",
+"=% c #597386",
+"-% c #41535F",
+";% c #6486A2",
+">% c #4D667D",
+",% c #070809",
+"'% c #44484E",
+")% c #BEC8D0",
+"!% c #8096A6",
+"~% c #516473",
+"{% c #A9ACAF",
+"]% c #8B8F91",
+"^% c #A8B3BD",
+"/% c #C5DAEB",
+"(% c #9FC8E1",
+"_% c #8FBCD6",
+":% c #81A8C2",
+"<% c #6C90AC",
+"[% c #56728C",
+"}% c #585B5F",
+"|% c #CBCDCD",
+"1% c #C1C3C6",
+"2% c #4F565F",
+"3% c #82ABC3",
+"4% c #93BCD3",
+"5% c #95BED7",
+"6% c #8EB9D3",
+"7% c #5B788B",
+"8% c #627E91",
+"9% c #7FA7C1",
+"0% c #6C91AB",
+"a% c #546F87",
+"b% c #6F7376",
+"c% c #D5E2EF",
+"d% c #A9C4D8",
+"e% c #81A1BA",
+"f% c #333940",
+"g% c #5F6B76",
+"h% c #C0D5E8",
+"i% c #AACCE2",
+"j% c #8EB8D3",
+"k% c #7FA5BF",
+"l% c #7095B0",
+"m% c #4E697E",
+"n% c #07090A",
+"o% c #0D0F10",
+"p% c #7193A6",
+"q% c #96C3DC",
+"r% c #8EBCD7",
+"s% c #91BDD7",
+"t% c #8FBBD6",
+"u% c #7699AD",
+"v% c #4D626F",
+"w% c #252D33",
+"x% c #101215",
+"y% c #0C0D0E",
+"z% c #0A0C0E",
+"A% c #06090A",
+"B% c #7F8488",
+"C% c #D7E3F1",
+"D% c #B6D0E4",
+"E% c #A3C2D7",
+"F% c #596872",
+"G% c #A9BED0",
+"H% c #B4D0E5",
+"I% c #9EC8DC",
+"J% c #8FB9D4",
+"K% c #85ADC7",
+"L% c #7FA4BE",
+"M% c #4B606F",
+"N% c #4E6372",
+"O% c #89B6D0",
+"P% c #92C1DA",
+"Q% c #9DC7DD",
+"R% c #95C0DA",
+"S% c #94BED8",
+"T% c #8BB8D1",
+"U% c #7AA0B9",
+"V% c #4E667A",
+"W% c #344151",
+"X% c #0C0D0F",
+"Y% c #8A8F92",
+"Z% c #D4E6F5",
+"`% c #BCD5E9",
+" & c #8599A5",
+".& c #939DA6",
+"+& c #C4DAEB",
+"@& c #89A6B9",
+"#& c #7D9FB5",
+"$& c #98C3DC",
+"%& c #95C0D9",
+"&& c #7CA2B9",
+"*& c #7697AE",
+"=& c #698498",
+"-& c #7394A8",
+";& c #9EC7DF",
+">& c #8DB1C4",
+",& c #6B8594",
+"'& c #50636C",
+")& c #50626C",
+"!& c #7F9FB1",
+"~& c #93B8D0",
+"{& c #627A88",
+"]& c #90B6CC",
+"^& c #93BDD7",
+"/& c #87AFC9",
+"(& c #7291A7",
+"_& c #384651",
+":& c #121618",
+"<& c #12171B",
+"[& c #4F6986",
+"}& c #597998",
+"|& c #324052",
+"1& c #969CA1",
+"2& c #D6E6F5",
+"3& c #C6DCEE",
+"4& c #505A64",
+"5& c #82929F",
+"6& c #99ABBB",
+"7& c #A1B9CA",
+"8& c #87A0B0",
+"9& c #718EA1",
+"0& c #8DB2C9",
+"a& c #8BAEC4",
+"b& c #586D7D",
+"c& c #97C0D9",
+"d& c #8DB3C9",
+"e& c #95B8CD",
+"f& c #9DC0D6",
+"g& c #6F8B9C",
+"h& c #354249",
+"i& c #464E54",
+"j& c #8A98A5",
+"k& c #AABAC7",
+"l& c #86939E",
+"m& c #41494F",
+"n& c #4A5861",
+"o& c #97C1DA",
+"p& c #5E7888",
+"q& c #5C7482",
+"r& c #88ACC2",
+"s& c #91BFD7",
+"t& c #799CB5",
+"u& c #47596A",
+"v& c #0D0F12",
+"w& c #1A2127",
+"x& c #56778D",
+"y& c #688BA9",
+"z& c #5D7F9E",
+"A& c #547391",
+"B& c #0E1013",
+"C& c #9DA6AB",
+"D& c #C8DCED",
+"E& c #7A8996",
+"F& c #B5CEE0",
+"G& c #BCDBEC",
+"H& c #B9D5EA",
+"I& c #8BA2B2",
+"J& c #6C8A9D",
+"K& c #97BFD7",
+"L& c #3E4E59",
+"M& c #92B5CB",
+"N& c #535F68",
+"O& c #454F56",
+"P& c #6F7C87",
+"Q& c #ABC0D1",
+"R& c #C7DCEE",
+"S& c #C5DBED",
+"T& c #C2D7EA",
+"U& c #BFD8EA",
+"V& c #BCD7EB",
+"W& c #62717B",
+"X& c #5B6F7B",
+"Y& c #95C3DC",
+"Z& c #8BB2C9",
+"`& c #485761",
+" * c #42525F",
+".* c #6686A1",
+"+* c #587896",
+"@* c #1B2129",
+"#* c #5C7A94",
+"$* c #7DA2BD",
+"%* c #84AEC7",
+"&* c #749BB5",
+"** c #5C7E9C",
+"=* c #27343F",
+"-* c #A4A9B2",
+";* c #D9E7F4",
+">* c #C8DBEC",
+",* c #B1C8DA",
+"'* c #5D6C76",
+")* c #A8C5D8",
+"!* c #A6BDD0",
+"~* c #B9D6EA",
+"{* c #B9D4E9",
+"]* c #8198A8",
+"^* c #8AADC3",
+"/* c #8CB1CA",
+"(* c #96C2D8",
+"_* c #A3C7DF",
+":* c #ADCDE3",
+"<* c #ABD0E4",
+"[* c #ADCFE3",
+"}* c #AACEE4",
+"|* c #A4CDE3",
+"1* c #A1CBE1",
+"2* c #A3CCE3",
+"3* c #A2C9DF",
+"4* c #41515A",
+"5* c #81A2B5",
+"6* c #94C0D7",
+"7* c #5E7789",
+"8* c #526777",
+"9* c #516777",
+"0* c #6B8CA5",
+"a* c #759CBA",
+"b* c #658AA5",
+"c* c #587798",
+"d* c #1B242B",
+"e* c #0E1110",
+"f* c #101214",
+"g* c #202931",
+"h* c #59758E",
+"i* c #799FBB",
+"j* c #84B1CA",
+"k* c #86ACC6",
+"l* c #354758",
+"m* c #A0A6AE",
+"n* c #DAE6F2",
+"o* c #C4DCEE",
+"p* c #B4D2E8",
+"q* c #3E4A53",
+"r* c #698091",
+"s* c #5D7581",
+"t* c #A3CAE0",
+"u* c #A6CFE5",
+"v* c #A5CCE5",
+"w* c #718A9C",
+"x* c #98C3DB",
+"y* c #83ABC7",
+"z* c #2E3B46",
+"A* c #33414A",
+"B* c #678398",
+"C* c #8AB3CE",
+"D* c #93BED7",
+"E* c #97C4DB",
+"F* c #42525E",
+"G* c #88ACC0",
+"H* c #789EB9",
+"I* c #7A9FBB",
+"J* c #7EA2BD",
+"K* c #779DB5",
+"L* c #577081",
+"M* c #5B7B9B",
+"N* c #1D2229",
+"O* c #547390",
+"P* c #54728D",
+"Q* c #6082A0",
+"R* c #688EA9",
+"S* c #6689A7",
+"T* c #6086A0",
+"U* c #6285A1",
+"V* c #6B8DAA",
+"W* c #718FAB",
+"X* c #3E5568",
+"Y* c #969DA1",
+"Z* c #DBE8F4",
+"`* c #95ACBD",
+" = c #758B9A",
+".= c #A4C9DE",
+"+= c #698190",
+"@= c #667E8A",
+"#= c #7D99AA",
+"$= c #7B9BAD",
+"%= c #6F8C9A",
+"&= c #536976",
+"*= c #84ADC6",
+"== c #6D92AD",
+"-= c #62829E",
+";= c #43576A",
+">= c #2F3B46",
+",= c #5C788A",
+"'= c #86AFC8",
+")= c #93BED8",
+"!= c #93BAD5",
+"~= c #93BAD2",
+"{= c #92BCD4",
+"]= c #7EA2B6",
+"^= c #3D4D56",
+"/= c #485B67",
+"(= c #7596A9",
+"_= c #8CBBD4",
+":= c #90BCD5",
+"<= c #91BFD9",
+"[= c #789BAD",
+"}= c #465B6A",
+"|= c #59789A",
+"1= c #5D7F9D",
+"2= c #5E839C",
+"3= c #59799A",
+"4= c #415569",
+"5= c #2D3A46",
+"6= c #2E3B49",
+"7= c #4A647C",
+"8= c #587690",
+"9= c #39485A",
+"0= c #7F8589",
+"a= c #D9E8F5",
+"b= c #CCDEEE",
+"c= c #8597A5",
+"d= c #B3D2E3",
+"e= c #9BB3C4",
+"f= c #B2CEE1",
+"g= c #B2D1E7",
+"h= c #ABCFE6",
+"i= c #94B7CB",
+"j= c #495C6A",
+"k= c #688498",
+"l= c #617B8A",
+"m= c #85ADC8",
+"n= c #78A0B9",
+"o= c #62819B",
+"p= c #2E3843",
+"q= c #485A6C",
+"r= c #67889C",
+"s= c #8AB5CF",
+"t= c #8EB9D1",
+"u= c #6C899B",
+"v= c #6E91A7",
+"w= c #678399",
+"x= c #6888A1",
+"y= c #323E48",
+"z= c #5B7585",
+"A= c #98C5DD",
+"B= c #83ACC1",
+"C= c #2D373F",
+"D= c #4B637C",
+"E= c #567694",
+"F= c #26313C",
+"G= c #15191F",
+"H= c #4D647A",
+"I= c #252F39",
+"J= c #5D6163",
+"K= c #DDE9F5",
+"L= c #CEDFEE",
+"M= c #8898A5",
+"N= c #B0CBDC",
+"O= c #BFDAEC",
+"P= c #BFDBEC",
+"Q= c #BBDAEC",
+"R= c #BAD7EA",
+"S= c #6B808F",
+"T= c #7297B0",
+"U= c #8CB8D1",
+"V= c #95C1D9",
+"W= c #91BCD6",
+"X= c #86AEC8",
+"Y= c #7496B3",
+"Z= c #6587A2",
+"`= c #384958",
+" - c #323F4B",
+".- c #546A7C",
+"+- c #6C88A1",
+"@- c #779AB1",
+"#- c #658297",
+"$- c #3B4A58",
+"%- c #33404B",
+"&- c #202830",
+"*- c #577287",
+"=- c #86B1CC",
+"-- c #86ACC0",
+";- c #6E8797",
+">- c #9CC7DF",
+",- c #92BCD5",
+"'- c #91BCD5",
+")- c #8EB6CE",
+"!- c #344453",
+"~- c #263039",
+"{- c #364452",
+"]- c #2B3643",
+"^- c #2A2D2E",
+"/- c #E1EBF4",
+"(- c #D2E4F3",
+"_- c #A0B2C3",
+":- c #8094A1",
+"<- c #BAD8EB",
+"[- c #B8D6EA",
+"}- c #485A6A",
+"|- c #789FB9",
+"1- c #90BBD3",
+"2- c #94C4DC",
+"3- c #88B3CD",
+"4- c #7A9EB9",
+"5- c #698BA8",
+"6- c #4D677C",
+"7- c #151A1E",
+"8- c #1A2125",
+"9- c #171C21",
+"0- c #1D2329",
+"a- c #1D262E",
+"b- c #486073",
+"c- c #6A8CAA",
+"d- c #7CA2BE",
+"e- c #90BDD7",
+"f- c #9AC5DE",
+"g- c #7493A2",
+"h- c #708B99",
+"i- c #8CB7D1",
+"j- c #7494AB",
+"k- c #68889F",
+"l- c #6A8FA5",
+"m- c #7BA2BC",
+"n- c #171D21",
+"o- c #1D262F",
+"p- c #212B36",
+"q- c #09090B",
+"r- c #BBC2C9",
+"s- c #D4E4F2",
+"t- c #C1D9EB",
+"u- c #44515A",
+"v- c #92B5C9",
+"w- c #6B8795",
+"x- c #4E687E",
+"y- c #7EA6C0",
+"z- c #91BED8",
+"A- c #93BFD9",
+"B- c #8CB5D0",
+"C- c #7DA4BE",
+"D- c #6F92AE",
+"E- c #6687A5",
+"F- c #526C85",
+"G- c #415669",
+"H- c #384655",
+"I- c #6589A4",
+"J- c #6E92AE",
+"K- c #80A8C2",
+"L- c #92BCD6",
+"M- c #91BFD8",
+"N- c #799AAF",
+"O- c #6A8796",
+"P- c #81AAC3",
+"Q- c #577187",
+"R- c #1F2930",
+"S- c #192027",
+"T- c #1B2227",
+"U- c #0D1010",
+"V- c #0E1012",
+"W- c #070709",
+"X- c #5C6062",
+"Y- c #DCE8F3",
+"Z- c #C4DCEF",
+"`- c #9BB3C6",
+" ; c #3A424F",
+".; c #313A44",
+"+; c #35424C",
+"@; c #374655",
+"#; c #6E91AD",
+"$; c #87B2CC",
+"%; c #799EBA",
+"&; c #618298",
+"*; c #7095AF",
+"=; c #435663",
+"-; c #80A7C0",
+";; c #95C4DC",
+">; c #779CB3",
+",; c #526D7E",
+"'; c #516A7A",
+"); c #526B7B",
+"!; c #465764",
+"~; c #34414E",
+"{; c #5C7E9A",
+"]; c #2B3741",
+"^; c #4B657F",
+"/; c #5C7D9C",
+"(; c #557088",
+"_; c #0F0F10",
+":; c #B9C2CA",
+"<; c #CCDFEF",
+"[; c #B4CDE1",
+"}; c #8DAEC8",
+"|; c #6F93AE",
+"1; c #678CA6",
+"2; c #6E92AF",
+"3; c #81A8C1",
+"4; c #8FBBD5",
+"5; c #8DB9D2",
+"6; c #6D8FA2",
+"7; c #586F82",
+"8; c #394851",
+"9; c #86B0C6",
+"0; c #85AFC8",
+"a; c #6F94AF",
+"b; c #698DA8",
+"c; c #6889A7",
+"d; c #5E7E9F",
+"e; c #475D75",
+"f; c #2E3C4A",
+"g; c #5D7E9D",
+"h; c #405465",
+"i; c #36393B",
+"j; c #D7E5F1",
+"k; c #A4C5DC",
+"l; c #668496",
+"m; c #7595AB",
+"n; c #7798AE",
+"o; c #97C2DA",
+"p; c #789DB3",
+"q; c #8BB1C8",
+"r; c #93C0D9",
+"s; c #8BB5CF",
+"t; c #85AFC9",
+"u; c #82AAC6",
+"v; c #5F7C95",
+"w; c #1E252C",
+"x; c #54728E",
+"y; c #587899",
+"z; c #5A7B9B",
+"A; c #2D3843",
+"B; c #798086",
+"C; c #D1E3F1",
+"D; c #B7D3E8",
+"E; c #7E98AB",
+"F; c #181C1F",
+"G; c #46525F",
+"H; c #80A1B8",
+"I; c #99C3DB",
+"J; c #85ACC2",
+"K; c #21272D",
+"L; c #0A0B0D",
+"M; c #53718C",
+"N; c #577797",
+"O; c #1B2229",
+"P; c #0D0E0F",
+"Q; c #B3BDC4",
+"R; c #CADDED",
+"S; c #B4D3E7",
+"T; c #2B3339",
+"U; c #2F3840",
+"V; c #7899AC",
+"W; c #93C1D9",
+"X; c #8FBCD5",
+"Y; c #8BB6D1",
+"Z; c #8DB8D2",
+"`; c #92BFD8",
+" > c #678092",
+".> c #547089",
+"+> c #5C7F9B",
+"@> c #1F262E",
+"#> c #202223",
+"$> c #B1BECB",
+"%> c #C3D9EB",
+"&> c #7B8D99",
+"*> c #708B9A",
+"=> c #85ABC1",
+"-> c #7FA3BA",
+";> c #92BBD3",
+">> c #7CA0B4",
+",> c #97BDD4",
+"'> c #657E8F",
+")> c #93BDD4",
+"!> c #88ADC7",
+"~> c #6F94AE",
+"{> c #526A7E",
+"]> c #65849B",
+"^> c #799DBB",
+"/> c #84AFC9",
+"(> c #8FB9D2",
+"_> c #323C45",
+":> c #516C84",
+"<> c #658AA4",
+"[> c #5B7C9B",
+"}> c #2E3A49",
+"|> c #2A3038",
+"1> c #252D3A",
+"2> c #1B1E20",
+"3> c #ADBFCF",
+"4> c #C0D6E7",
+"5> c #B0CDE2",
+"6> c #8EB3C9",
+"7> c #526975",
+"8> c #6B899D",
+"9> c #597183",
+"0> c #90BAD5",
+"a> c #94C2DA",
+"b> c #82ABC5",
+"c> c #495E6E",
+"d> c #82A8C3",
+"e> c #81A4BA",
+"f> c #7594A5",
+"g> c #87ABC3",
+"h> c #4D6573",
+"i> c #6689A6",
+"j> c #526E85",
+"k> c #243037",
+"l> c #607B96",
+"m> c #7699B6",
+"n> c #789EB5",
+"o> c #303D48",
+"p> c #7498B4",
+"q> c #7094AF",
+"r> c #597792",
+"s> c #242F39",
+"t> c #1A1D25",
+"u> c #374553",
+"v> c #4D677D",
+"w> c #14191E",
+"x> c #040505",
+"y> c #171A1D",
+"z> c #8A9FAD",
+"A> c #BCD9EC",
+"B> c #B5D3E7",
+"C> c #A2CAE1",
+"D> c #9DC7DE",
+"E> c #9EC7DD",
+"F> c #3B4A57",
+"G> c #455867",
+"H> c #98C2DB",
+"I> c #85B0CC",
+"J> c #7496B2",
+"K> c #4C606F",
+"L> c #6E8EA3",
+"M> c #7EA0B6",
+"N> c #91BBD3",
+"O> c #8DB7D1",
+"P> c #90BAD4",
+"Q> c #96C1DA",
+"R> c #3B4853",
+"S> c #688AA5",
+"T> c #4C657A",
+"U> c #1B2026",
+"V> c #2B3C44",
+"W> c #5F7A90",
+"X> c #587284",
+"Y> c #536978",
+"Z> c #88B1CC",
+"`> c #759AB8",
+" , c #617E9A",
+"., c #556F85",
+"+, c #20272E",
+"@, c #323D48",
+"#, c #333E4A",
+"$, c #060707",
+"%, c #4A5159",
+"&, c #ACC3D5",
+"*, c #ACCFE5",
+"=, c #5A6874",
+"-, c #AACDE1",
+";, c #9CC6DC",
+">, c #35414C",
+",, c #769AB2",
+"', c #80AAC5",
+"), c #6F92AB",
+"!, c #38464F",
+"~, c #7EA4B9",
+"{, c #97C3DC",
+"], c #7A9FB6",
+"^, c #3F505C",
+"/, c #6D8DA6",
+"(, c #1E282E",
+"_, c #080909",
+":, c #090A0C",
+"<, c #344452",
+"[, c #3B4857",
+"}, c #7799AE",
+"|, c #8DB6D1",
+"1, c #66869E",
+"2, c #3D4957",
+"3, c #536C84",
+"4, c #353F4C",
+"5, c #111215",
+"6, c #65727E",
+"7, c #A6BCCD",
+"8, c #5D6972",
+"9, c #AED0E6",
+"0, c #99C5DC",
+"a, c #8DB5D0",
+"b, c #8DB5CE",
+"c, c #90BBD5",
+"d, c #84AAC5",
+"e, c #8EBBD5",
+"f, c #80A7C1",
+"g, c #6C8DA2",
+"h, c #85AFC6",
+"i, c #61839B",
+"j, c #374352",
+"k, c #576D83",
+"l, c #80A6C1",
+"m, c #81A4BB",
+"n, c #111315",
+"o, c #111418",
+"p, c #4C6378",
+"q, c #33424C",
+"r, c #37454D",
+"s, c #8DB4CF",
+"t, c #7397B3",
+"u, c #3A495A",
+"v, c #0D0F13",
+"w, c #27303A",
+"x, c #272E36",
+"y, c #0F1012",
+"z, c #90A4B2",
+"A, c #A8CBE2",
+"B, c #91BCD4",
+"C, c #80ABC3",
+"D, c #567083",
+"E, c #67899D",
+"F, c #94C2DB",
+"G, c #95C1DB",
+"H, c #779CB2",
+"I, c #60849E",
+"J, c #64849F",
+"K, c #1A1F22",
+"L, c #405061",
+"M, c #79A1BD",
+"N, c #324051",
+"O, c #6183A1",
+"P, c #6B8FAD",
+"Q, c #6485A2",
+"R, c #34444F",
+"S, c #060606",
+"T, c #2D3339",
+"U, c #B2CBDF",
+"V, c #94BCD5",
+"W, c #7DA2BA",
+"X, c #3F5264",
+"Y, c #5A7991",
+"Z, c #7195B3",
+"`, c #7BA5BD",
+" ' c #81AAC6",
+".' c #88B2CC",
+"+' c #8EBBD4",
+"@' c #8AB2CC",
+"#' c #82ADC7",
+"$' c #7092A5",
+"%' c #95C2DA",
+"&' c #41525F",
+"*' c #6387A3",
+"=' c #475F72",
+"-' c #21282F",
+";' c #5B7288",
+">' c #0D0F11",
+",' c #0B0E11",
+"'' c #212C36",
+")' c #26323C",
+"!' c #161B20",
+"~' c #55616D",
+"{' c #9BB9D0",
+"]' c #799EB6",
+"^' c #27313A",
+"/' c #1A222B",
+"(' c #5D7E99",
+"_' c #6587A4",
+":' c #6789A6",
+"<' c #6B8EAB",
+"[' c #628097",
+"}' c #6D8B9D",
+"|' c #769AAF",
+"1' c #6E91A9",
+"2' c #6C8EAD",
+"3' c #6E91AF",
+"4' c #3C4D59",
+"5' c #8BB1CB",
+"6' c #232D32",
+"7' c #13171B",
+"8' c #232B32",
+"9' c #839AAF",
+"0' c #789BB3",
+"a' c #283138",
+"b' c #0C0E0F",
+"c' c #242B33",
+"d' c #3D4D5B",
+"e' c #435768",
+"f' c #4B6176",
+"g' c #283137",
+"h' c #8DB4CC",
+"i' c #41535E",
+"j' c #405362",
+"k' c #3C4F60",
+"l' c #3C4E5B",
+"m' c #2B353E",
+"n' c #526876",
+"o' c #92BAD3",
+"p' c #1B1F23",
+"q' c #31383F",
+"r' c #7F9CB6",
+"s' c #21292F",
+"t' c #29333F",
+"u' c #1F252E",
+"v' c #090A0E",
+"w' c #4D626E",
+"x' c #96BDD3",
+"y' c #191D20",
+"z' c #13181B",
+"A' c #80A4BC",
+"B' c #1B2027",
+"C' c #5D7182",
+"D' c #2C383F",
+"E' c #364857",
+"F' c #1A2028",
+"G' c #333F49",
+"H' c #7FA2B5",
+"I' c #4A5E6E",
+"J' c #232E35",
+"K' c #252D35",
+"L' c #2F3A41",
+"M' c #0A0B0E",
+"N' c #14191D",
+"O' c #5A717F",
+"P' c #212931",
+"Q' c #222B34",
+"R' c #101216",
+"S' c #21272B",
+" ",
+" ",
+" ",
+" . ",
+" + ",
+" @ # $ % ",
+" & * = - ; ",
+" > , ' ) ! ~ { ] ",
+" ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a ",
+" b c d e f g h i j k l m n o p q r s t u v w x ",
+" y z A B C D E F G H I J K L M N O P Q R S T U U V W X Y ",
+" Z ` ...+.@.#.$.%.O &.*.=.-.;.>.,.'.).!.~.~.~.{.].^./.(._.:.<. ",
+" b [.}.|.#.1.2.3.4.{.~.~.~.~.5.6.5.~.7.8.{.~.~.~.~.9.0.a.b.].c. ",
+" d.e.f.g.h.i.j.k.{.~.~.~.~.l.~.m.% n.~.o.{.{.~.~.~.~.p.V 9.~.q.r. ",
+" s.t.u.v.w.x.u y.z.A.B.5.~.~.5.C.D.E.F.~.~.G.~.~.~.G.H.I.J.~.~.J.K.L. M.N. ",
+" O.P.Q.R.S.T.U.V.W.X.Y.Z.`.~.~.5. +.+++@+U ~.~.~.~.~.#+$+%+,.~.~.G.&+*+=+-+;+ ",
+" >+,+Q.'+)+!+~+{+]+^+/+(+_+:+<+~.[+}+U 9.|+5.~.~.~.~.1+2+3+4+5+~.].6+7+8+9+0+ ",
+" a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+5.U ~.U r+s+~.~.~.t+u+v+w+x+y+~.z+A+t+B+C+D+E+ F+G+ ",
+" H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+V ~.~.~.~.U ~.~.~.o.9.{.Z+`+9.~.~.~.V @.@+@@@#@ $@%@&@*@ ",
+" =@-@;@>@,@'@'.)@!@~@{@]@^@/@l+(@_@:@<@~.~.~.U {.~.~.~.{.~.~.{.[@~.~.~.~.}@|@1@2@3@4@5@6@7@8@ ",
+" 9@0@a@b@c@d@-.e@f@g@h@i@j@k@l@V+m@n@o@p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.q@r@s@t@u@v@w@x@y@ ",
+"z@A@B@C@D@E@X F@G@H@R I@J@K@L@M@N@O@P@Q@R@o+S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.9.U@V@W@X@<+V Y@Z@`@ # ",
+" .#+#@###$#%#*#=#-#;#>#,#'#)#!#~#{#]#^#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.U (#_#:#<#p@{.[#}#|#1#2# ",
+" 3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.l#m#9.{.~.n#o#p#q#r#s# ",
+" t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#% J#K#S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.L#0.l.~.~.{.M#N#O#P#Q#R# ",
+" S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$a#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.o.o.;$9.G.~.>$,$'$)$!$~${$]$ ",
+" ^$/$($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$:+<+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.G.0$a$b$c$d$e$f$g$h$i$j$k$ ",
+" [ l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$M#p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.;$D$E$F$G$H$I$J$K$L$ ",
+" M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%<+{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.#%$%%%p@&%*%=%-%;%>%,% ",
+" '%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%3%-$T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.4%5%U p@6%7%8%9%0%a%y ",
+" b%c%d%e%f%g%h%i%G.[#j%k%l%m%n%o%p%@%q%{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.~.~.~.~.~.V G.}@r%s%t%u%v%w%M.x%y%z%A% ",
+" B%C%D%E%F%G%H%I%V o.<@J%K%L%M%N%O%P%p@~.~.~.~.~.~.~.~.~.U ~.~.U 9.Q%{.~.~.~.~.~.{.%%U {.~.~.{.v@R%S%T%U%V%W% X%$ ",
+" Y%Z%`% &.&+&@&U ~.{.$&%&&&*&=&-&T@~.~.~.~.~.~.~.~.~.~.~.;&>&,&'&)&!&5+~.~.~.~.{.~&{&]&9.~.p@^&/&(&_&:& <&[&}&|& ",
+" 1&2&3&4&5&6&7&8&9&l.~.{.V 0&a&b&c&~.~.~.~.~.~.~.5.d&e&f&g&h&i&j&k&l&m&n&~.~.G.~.~.~.o&p&q&r&s&t&u&v& w&x&y&z&A&B& ",
+" C&2&D&E&F&G&G&H&I&J&U ~.~.U K&L&,.~.~.~.~.~.~.~.U M&N&O&P&Q&R&S&T&U&V&W&X&].{.~.~.{./#Y&Z&`& *.*+*@* (.#*$*%*&***=* ",
+" -*;*>*,*'*)*!*~*{*]*^*~.5.{.5./*U ~.~.~.~.~.~.{.[#(*_*:*<*[*[*}*|*1*2*3*4*5*U ~.~.6*7*8*9*0*a*b*c*d*e*f*g*h*i*%*j*k*<%l* ",
+" m*n*o*p*q*r*s*t*u*v*w*1+~.~.~.~.~.~.~.~.~.~.~.x*y*z*A*B*C*D*E*V U ~.G.~.:.F*G*l.{.R%X+H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X* ",
+" Y*Z*D&`* =.=+=@=#=$=%=&={.~.~.~.~.~.~.~.~.~.~.<+*===-=;=>=,='=)=[#p@!=~={=]=^=/=(=a#&%_=:=<=-#[=}=k$|=1=2=3=4=5=6=7=8=9= ",
+" 0=a=b=c=d=e=f=g=h=i=j=k=l=5.~.~.~.~.~.~.~.~.~.V -$m=n===o=p=q=r=s=t=:+u=v=w=x=y=z=A=J.V U ~.V [#B=C=D=1=E=F= G=H=I= ",
+" J=K=L=M=N=O=P=Q=R=S=T=U=V=5.U ~.~.~.~.~.~.~.~.~.{.x*W=X=Y=Z=`= -.-+-@-#-$-%-&-*-=---;->-9.x*)=,-'-)-c.!-~- {-]- ",
+" ^-/-(-_-:-<-<-[-%.}-|-1-T@~.{.~.~.~.~.~.~.~.~.~.~.V 2-^&3-4-5-6-7-8-9-0-a-b-c-d-e-f-g-h-V@i-j-k-l-T=m-7@n- o-p- ",
+" q-r-s-t-u-v-!+2*w-x-y-z-V ~.~.~.~.~.~.~.~.~.~.~.~.~.~./#A-B-C-D-E-F-G-H-I-J-K-L-<@M-W=N-O-P-Q-R-<&S-T-U-V- W- ",
+" X-Y-Z-`- ;.;+;@;#;$;q+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~./#v@W=N#%;&;*;=;-;s=-#;;>;,;';);!;~;{;];^;/;(;H+ ",
+" _;:;<;[;};|;1;2;3;4;{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.T@-#5;6;7;8;9;[#V <+0;a;b;c;E-d;e;f;|=g;h; ",
+" i;j;V#k;F.l;m;n;o;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.{.p@S@s=p;q;~.~.{.r;s;t;u;~$v;w;x;y;z;A; ",
+" H+B;C;D;E;F;G;H;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.U ~.~.V E*E*V ~.~.~.{.T@/#I;J;K;L;M;y;N;O; ",
+" P;Q;R;S;T;U;~.{.~.~.~.~.~.~.~.~.l.U {.p@~.~.{.V ~.~.5+V;].~.~.~.~.{.{.p@W;X;Y;Z;`;/# >W..>+>N;@> ",
+" #>$>%>&>*>G.~.~.~.~.~.~.~.~.{.`.=>V=->;>~.n##&>>T@,>'>].~.~.~.~.~.)>!>i$~>{>]>^>/>(>_>:><>[>}> |>1> ",
+" 2>3>4>5>U@U ~.~.~.~.~.~.~.{.6>7>8>9>0>a#a>b>c>d>e>f>~.~.~.V ~.~.g>h>i>1=j>,%k>l>m>n>o>p>q>r>s>t>u>v>w> ",
+" x>y>z>A>B>C>5+D>E>~.~.~.~.{.%&F>G>3;s%{.H>I>J>K>L>M>~.V N>O>P>x*Q>R>S>T>U> X%V>W>X>Y>Z>P-`> ,.,+, ",
+" @,#,$,%,&,1.*,=,-,;,{.p@V {.X@>,,,Z;V ~.5.`;',),!,~,~.{,],^,/,/&-$F$(,_, :,<,[,},<@|,1,2, ",
+" B&3,4, 5,6,7,8,9,0,`;a,b,B+c,d,s=<+~.~.~.a#e,f,g,h,V -#9$i,j,k,l,m,n, o,p,q,r,s,t,u,v, ",
+" w,x, y,z,A,B,C,D,E,o@F,G,<+~.~.~.~.~.;;P>j%}@p@H,]#I,J,K,L,M,=+ N,O,P,Q,R,S, ",
+" T,U,V,W,X,Y,Z,`, '.'+'x*~.{.O+@%@'#'$'%'a#&'*'='-' ~;;'>' ,''')'!' ",
+" ~'{']'^'/'('_'_':'<'['}'{.V |'1'2'3'4'5'}@6'7' 8'K; ",
+" v&9'0'a' b'c'd'e'f'1@g'h'G.i'j'k'l'm'n'o'p' y ",
+" q'r's' t'u'H+ v'w'x'y' z'A'B' ",
+" C'D' E'F' G'H' I'J' ",
+" K'L' M' N'O' P'Q' ",
+" R' S' ",
+" ",
+" ",
+" ",
+" "};
diff --git a/minilibx-linux/test/open24.xpm b/minilibx-linux/test/open24.xpm
new file mode 100644
index 0000000..f363254
--- /dev/null
+++ b/minilibx-linux/test/open24.xpm
@@ -0,0 +1,230 @@
+/* XPM */
+static char *open[] = {
+/* width height num_colors chars_per_pixel */
+" 45 55 168 2",
+/* colors */
+".. s None c None",
+".# c #450304",
+".a c #ce7e7c",
+".b c #b94344",
+".c c #b65254",
+".d c #780204",
+".e c #b04c4c",
+".f c #b00204",
+".g c #8a8a64",
+".h c #969a24",
+".i c #b6b60c",
+".j c #cac614",
+".k c #cece34",
+".l c #cace54",
+".m c #caca94",
+".n c #c24e4c",
+".o c #aa0204",
+".p c #9e4244",
+".q c #bc0204",
+".r c #a40204",
+".s c #9e262c",
+".t c #8c3a3c",
+".u c #5c1414",
+".v c #5b0204",
+".w c #700204",
+".x c #722214",
+".y c #b52624",
+".z c #8e3234",
+".A c #b60204",
+".B c #c20204",
+".C c #860204",
+".D c #560304",
+".E c #800204",
+".F c #9e0204",
+".G c #920204",
+".H c #620204",
+".I c #a41314",
+".J c #996a6c",
+".K c #920d09",
+".L c #c80204",
+".M c #690204",
+".N c #980204",
+".O c #984c4c",
+".P c #e2dedc",
+".Q c #ae5e5c",
+".R c #bc6a6c",
+".S c #a21a1c",
+".T c #8a0a04",
+".U c #671e1c",
+".V c #941b1c",
+".W c #b8b4b4",
+".X c #e8e6e4",
+".Y c #ccb4b4",
+".Z c #c07c7c",
+".0 c #f3f2eb",
+".1 c #b49696",
+".2 c #521614",
+".3 c #9e5a5c",
+".4 c #d4d4d4",
+".5 c #a7a5a1",
+".6 c #dec4c4",
+".7 c #e4d6d4",
+".8 c #f4f2f4",
+".9 c #cccac4",
+"#. c #9a161c",
+"## c #8c0204",
+"#a c #862c2c",
+"#b c #7e5e5c",
+"#c c #a39694",
+"#d c #6b6667",
+"#e c #322624",
+"#f c #b09e9c",
+"#g c #b23234",
+"#h c #500304",
+"#i c #222224",
+"#j c #2e322c",
+"#k c #925c5c",
+"#l c #721a1c",
+"#m c #6e6e6c",
+"#n c #0a0a0c",
+"#o c #b2b2b4",
+"#p c #8e6264",
+"#q c #884444",
+"#r c #8c5c5c",
+"#s c #121214",
+"#t c #b2aeac",
+"#u c #c21e1c",
+"#v c #6e0e0c",
+"#w c #623e3c",
+"#x c #b64e4c",
+"#y c #bc3634",
+"#z c #624e1c",
+"#A c #6e727c",
+"#B c #824e4c",
+"#C c #8b8d87",
+"#D c #a09674",
+"#E c #766844",
+"#F c #7a663c",
+"#G c #828c90",
+"#H c #beb6a4",
+"#I c #3a0204",
+"#J c #8e9298",
+"#K c #562529",
+"#L c #7c3838",
+"#M c #bab294",
+"#N c #7e4644",
+"#O c #929a9c",
+"#P c #762a2c",
+"#Q c #a60e0c",
+"#R c #ae1e1c",
+"#S c #460a0c",
+"#T c #a6aaa4",
+"#U c #6a4a4c",
+"#V c #784c50",
+"#W c #761214",
+"#X c #9e1e1c",
+"#Y c #988c90",
+"#Z c #821e1c",
+"#0 c #7a1618",
+"#1 c #7a6e74",
+"#2 c #7e7a77",
+"#3 c #808688",
+"#4 c #828284",
+"#5 c #828279",
+"#6 c #827a64",
+"#7 c #7e765c",
+"#8 c #864a34",
+"#9 c #825a44",
+"a. c #766e54",
+"a# c #7e7e74",
+"aa c #806464",
+"ab c #7e724c",
+"ac c #766634",
+"ad c #765a2c",
+"ae c #8e7e54",
+"af c #a69e8c",
+"ag c #c7c2ac",
+"ah c #9a2a1c",
+"ai c #aa3a3c",
+"aj c #979894",
+"ak c #70684c",
+"al c #62522c",
+"am c #6e5e3c",
+"an c #92866c",
+"ao c #968e6c",
+"ap c #826e54",
+"aq c #84765c",
+"ar c #86522c",
+"as c #7e4624",
+"at c #7e3614",
+"au c #6e5254",
+"av c #712e2c",
+"aw c #7a5654",
+"ax c #82727c",
+"ay c #a63634",
+"az c #8a6a6c",
+"aA c #863534",
+"aB c #5c1a18",
+"aC c #6a2c2c",
+"aD c #5e0e14",
+"aE c #868684",
+"aF c #922624",
+"aG c #901614",
+"aH c #c21614",
+"aI c #520e0c",
+"aJ c #805654",
+"aK c #b00c0c",
+"aL c #c2221c",
+/* pixels */
+"..........................................................................................",
+"..........................................................................................",
+".....................................#.a.#................................................",
+"...................................#.b.c.#.#.#.#...........#.d............................",
+".................................#.e.f.f.#.g.h.i.j.k.l.m...f.n............................",
+".................................d.f.o.f.#.#.#.d.d.#.#.#...f.f.d..........................",
+".................................p.q.q.r.s.t.u.v.w.x.d.d.#.d.r.y.d........................",
+".................................z.A.B.q.C.D.E.F.G.E.H.E.I.F.q.A.d........................",
+".................................J.G.f.G.w.K.f.L.B.B.r.M.f.B.L.A.d........................",
+".................................d.w.N.M.O.P.Q.B.B.o.R.S.E.q.q.T.d........................",
+".................................d.U.M.V.W.X.Y.q.B.Z.0.1.E.r.N.d..........................",
+".................................d.2.r.3.4.5.6.A.f.7.8.9#.###a.#..........................",
+"................................#b.d.L#c#d#e#f.N.V.5#d.4#g.E.d............................",
+"...............................d#h.r.L#f#i#j#k.M#l#m#n#o.b.r.d............................",
+"...............................d#h##.q#g#p#q##.q.N#r#s#t#u.q#v.#..........................",
+"..............#j................#w.w.C.r.q##.r.B.f.T#x#y.L.r.M.d..........................",
+"............#j#z#j#A#A#j.........d.D.r.M.C.f.r.r.r.q.B.C.N.E#B............................",
+"..........#j#C#D#E#z#F#G#j.......d.d.#.G##.w.M.M.C.C.d.G.r.u.d............................",
+"....................#E#H#C#j.........d#I.w.F.f.o.o.o.N.M.#.d..............................",
+"......................#E#j#J#j......#K.M.#.#.v.w.M.v.##h.H#L.d............................",
+"..........................#M#j.......v.F.q.r.d.w.w.C.E.M.v.M#N.d..........................",
+"..........................#E#O#j#j#K##.f.L.L.L.B.q.f##.M.v.w.w#P.d.#...d.d................",
+"............................#C#E.#.v.o.B.L.L.q.q.q.q.N.M.D#h.M.N.r#Q#R#S.H.J.#............",
+"............................#j#T#U.C.q.q.o.G.F.f.q.A.N.d.v.v##.o.q.L.r.C.A###k............",
+"..............................#C#V.N.A.N.f.q.F.C.E.f.F.E.H#n#W.K.I#X#a.z.V.q.d#p.d........",
+"................................#Y.r.K#Z.K.q.A.G.w#0#b#1#2#3#4#5#5#6#6#7#8.q.G#9..........",
+"..................#j#oa..5#j..#J#Ja##4#4aa.o.A##.E.xabacadae#Daf#M#Magah.r.qai.#..........",
+"................aja#akalamanaoapaqaaarasat.r.o.E.w.T.T.E.H.#...........#.d.d.#............",
+"...........E....#j#j#C#M#j#n#naa#V.O.f.N.F.q.G.d.w.r.C.d.H.#...............#..............",
+"...........#.F.F.J#n#n#n#n#n#nauav#p.q.N.d.d.w.M.F.F.E.d.U................................",
+".........E.F.E.E.d.z#n.d#n#n#naw.Uax.r##.d.w.D.M.r.N.E.w.d................................",
+".........E.F.......d.Fay.E.F#naz.2#A.D#h.r.f.w##.r##.d.H.M................................",
+".........F.#...........E.E.F.baAaB#A.#.E.f.r.w.N.N.E.waC.#................................",
+".........F.#...............d.F.E#K#d.H.G.F.G.w.N##.d.D.#..................................",
+".........F.#....................#Aau.v.E##.w.E.E.w.H.d.......d..av.d......................",
+".........E.#..................#j#GaC.M.H.M.d.d.w.H.#.d.d.#aC.w.C##.E.d....................",
+"...........F.................5#O...#aD.w.d.w.H.D.M######.G.F.o.f.o.N.3....................",
+"...........F.E...........5aEakak.....#.##h#h.v.N.o.f.q.L.L.L.L.L.q.faF....................",
+"...........E.E......#E#C.5aq#j.....#.v.N.F.d.N.r.F.r.F#Q.I.o.q.L.L.L.y....................",
+".............E.....................#.E.B.qaG.d.d.d.....#.#.....d#x.b......................",
+".............E.F...................E.w.L.LaG.#............................................",
+"...............E.E.................EaA.q.qaG.#............................................",
+"...............E.F.E.................E.r.r#Z.#............................................",
+".................E.F.E...............E.G.NaA..............................................",
+".................E#uaH.................w.dav..............................................",
+"...................E.E.............EaI.M.w.v.#............................................",
+"...................................E.D.d.E.waJ............................................",
+".....................................C.N.N##.M............................................",
+"..................................#W.f.q.A.f.G#q..........................................",
+".....................................q.L.L.L.q.V.#........................................",
+"...................................#.daK.q.qaL.d..........................................",
+".......................................#.#.#..............................................",
+"..........................................................................................",
+"..........................................................................................",
+".........................................................................................."
+};
diff --git a/minilibx-linux/test/open30.xpm b/minilibx-linux/test/open30.xpm
new file mode 100644
index 0000000..87be371
--- /dev/null
+++ b/minilibx-linux/test/open30.xpm
@@ -0,0 +1,1439 @@
+/* XPM */
+static char * open30_2_xpm[] = {
+"64 64 1372 2",
+" c None",
+". c #08090D",
+"+ c #1A1E23",
+"@ c #1F2124",
+"# c #060809",
+"$ c #1A1E21",
+"% c #4F606C",
+"& c #3D4145",
+"* c #868D93",
+"= c #454E56",
+"- c #627481",
+"; c #667C8A",
+"> c #2D3031",
+", c #D7E1E7",
+"' c #4D5157",
+") c #8997A5",
+"! c #282E31",
+"~ c #333B41",
+"{ c #A5C6DB",
+"] c #718C9B",
+"^ c #000000",
+"/ c #181B1F",
+"( c #262828",
+"_ c #D2DEE7",
+": c #B8C5D0",
+"< c #151719",
+"[ c #08090B",
+"} c #272B30",
+"| c #2D3037",
+"1 c #26282C",
+"2 c #1A1D1F",
+"3 c #B1CADB",
+"4 c #56646E",
+"5 c #080809",
+"6 c #080A0C",
+"7 c #1E2126",
+"8 c #98B7C9",
+"9 c #A2CAE2",
+"0 c #7FA1B5",
+"a c #06080A",
+"b c #252729",
+"c c #A7ADB2",
+"d c #272B2E",
+"e c #1E2023",
+"f c #C8D8E5",
+"g c #C9DDED",
+"h c #8996A3",
+"i c #6B7782",
+"j c #C7DFF0",
+"k c #CCE0F0",
+"l c #AFC1CF",
+"m c #47535B",
+"n c #B0D3E8",
+"o c #7E99A9",
+"p c #738493",
+"q c #97B4C7",
+"r c #53606A",
+"s c #6E8996",
+"t c #A1CBE3",
+"u c #9CC6DE",
+"v c #90B5CB",
+"w c #171D22",
+"x c #1E2629",
+"y c #020202",
+"z c #ABB3BA",
+"A c #BBC4C8",
+"B c #222323",
+"C c #141617",
+"D c #5D6164",
+"E c #ACB5BC",
+"F c #676D74",
+"G c #BDD4E5",
+"H c #B3D1E7",
+"I c #B0D1E7",
+"J c #728A99",
+"K c #94AEBF",
+"L c #B1D1E7",
+"M c #505C64",
+"N c #7B98A9",
+"O c #A1CBE0",
+"P c #99C3D9",
+"Q c #475863",
+"R c #A0C9DE",
+"S c #9CC6DA",
+"T c #9ECAE1",
+"U c #9CC5DD",
+"V c #9AC4DC",
+"W c #263137",
+"X c #3C4A55",
+"Y c #658190",
+"Z c #66686B",
+"` c #7D8085",
+" . c #363839",
+".. c #797E81",
+"+. c #D2DBE1",
+"@. c #DDE9F4",
+"#. c #CADEEF",
+"$. c #778593",
+"%. c #AED0E5",
+"&. c #9EC9DE",
+"*. c #9EC8DF",
+"=. c #9BC1D8",
+"-. c #9EC8DE",
+";. c #6B8596",
+">. c #9BC5DC",
+",. c #9BC6DF",
+"'. c #9CC5DC",
+"). c #688595",
+"!. c #6B8698",
+"~. c #9CC4DC",
+"{. c #9BC4DC",
+"]. c #9DC5DD",
+"^. c #647D8C",
+"/. c #485864",
+"(. c #161A1D",
+"_. c #36444C",
+":. c #95BDD5",
+"<. c #566E7E",
+"[. c #A4AAAD",
+"}. c #E9F2F7",
+"|. c #DEEAF6",
+"1. c #B5D4E9",
+"2. c #A9CFE3",
+"3. c #90B3C9",
+"4. c #9FCAE1",
+"5. c #9BC4DD",
+"6. c #7490A2",
+"7. c #99C2DB",
+"8. c #81A5BA",
+"9. c #9CC5DE",
+"0. c #98C1DA",
+"a. c #5F7889",
+"b. c #96BFD8",
+"c. c #44545F",
+"d. c #565A5E",
+"e. c #DFE6EC",
+"f. c #E6EEF7",
+"g. c #D6E4F2",
+"h. c #BFD6E9",
+"i. c #A9CCE3",
+"j. c #9FC8DD",
+"k. c #9DC6DD",
+"l. c #9CC4DD",
+"m. c #7D9FB0",
+"n. c #98C0D6",
+"o. c #9AC5DD",
+"p. c #97BFD8",
+"q. c #9BC5DF",
+"r. c #2D3840",
+"s. c #626567",
+"t. c #E7ECF5",
+"u. c #E1EAF5",
+"v. c #CEE3F3",
+"w. c #B7D6EA",
+"x. c #A4CBE0",
+"y. c #8AAFC5",
+"z. c #647F90",
+"A. c #648092",
+"B. c #89B0C7",
+"C. c #9CC6DF",
+"D. c #5D7486",
+"E. c #7B9BAF",
+"F. c #84A8BF",
+"G. c #9BC5DD",
+"H. c #96BED5",
+"I. c #4B5D69",
+"J. c #9BC5DE",
+"K. c #536B77",
+"L. c #2E3B41",
+"M. c #1B2124",
+"N. c #3F4F58",
+"O. c #4D5152",
+"P. c #E7EEF3",
+"Q. c #E2EAF5",
+"R. c #CEE2F2",
+"S. c #BAD5E9",
+"T. c #9DC2D7",
+"U. c #5C7281",
+"V. c #232A31",
+"W. c #08090A",
+"X. c #121418",
+"Y. c #131619",
+"Z. c #131719",
+"`. c #87ACC3",
+" + c #7B9BAE",
+".+ c #87ADC3",
+"++ c #8FB5CB",
+"@+ c #678295",
+"#+ c #96C0D8",
+"$+ c #607787",
+"%+ c #6B8595",
+"&+ c #96C1DB",
+"*+ c #6A8595",
+"=+ c #35424A",
+"-+ c #7090A1",
+";+ c #15191C",
+">+ c #2D3033",
+",+ c #DDE5EB",
+"'+ c #D2E3F1",
+")+ c #BAD7EB",
+"!+ c #A9CFE5",
+"~+ c #272F35",
+"{+ c #1C2227",
+"]+ c #4F697B",
+"^+ c #6B8FA9",
+"/+ c #759CB6",
+"(+ c #7BA0BB",
+"_+ c #80A5BC",
+":+ c #88B0C8",
+"<+ c #96C3DB",
+"[+ c #8FB6CD",
+"}+ c #80A1B3",
+"|+ c #556876",
+"1+ c #96BFD7",
+"2+ c #566B77",
+"3+ c #93B8CD",
+"4+ c #637A8D",
+"5+ c #9DC6DE",
+"6+ c #8FB4CA",
+"7+ c #55697A",
+"8+ c #6F8F9F",
+"9+ c #91BDD5",
+"0+ c #283239",
+"a+ c #050406",
+"b+ c #767B80",
+"c+ c #BDC6CE",
+"d+ c #D4E5F3",
+"e+ c #C1D7EA",
+"f+ c #A7CDE4",
+"g+ c #9FC9DE",
+"h+ c #668596",
+"i+ c #6D90AA",
+"j+ c #5C7994",
+"k+ c #60849F",
+"l+ c #6286A1",
+"m+ c #688CA8",
+"n+ c #7298B2",
+"o+ c #82A8C2",
+"p+ c #8FBAD5",
+"q+ c #96C2DB",
+"r+ c #89ADC4",
+"s+ c #96BED6",
+"t+ c #99C2DA",
+"u+ c #6C899A",
+"v+ c #92BBD2",
+"w+ c #9AC4DD",
+"x+ c #5B717D",
+"y+ c #9EC6DE",
+"z+ c #8BB1C9",
+"A+ c #718EA0",
+"B+ c #94C3DB",
+"C+ c #536B78",
+"D+ c #3E505F",
+"E+ c #4E6373",
+"F+ c #2C333C",
+"G+ c #070708",
+"H+ c #040404",
+"I+ c #1A1C1E",
+"J+ c #202326",
+"K+ c #050606",
+"L+ c #23292E",
+"M+ c #A1C0D4",
+"N+ c #9FC9DD",
+"O+ c #97C2DB",
+"P+ c #80A8C1",
+"Q+ c #668AA6",
+"R+ c #4B5D72",
+"S+ c #4C647A",
+"T+ c #5F80A0",
+"U+ c #60859E",
+"V+ c #678AA6",
+"W+ c #739BB5",
+"X+ c #85AEC7",
+"Y+ c #92BDD7",
+"Z+ c #96BFD5",
+"`+ c #627B8A",
+" @ c #89B1C9",
+".@ c #2B353C",
+"+@ c #7597B2",
+"@@ c #779CB8",
+"#@ c #52697C",
+"$@ c #1D2328",
+"%@ c #445663",
+"&@ c #5E7A8D",
+"*@ c #252F37",
+"=@ c #090909",
+"-@ c #859BB2",
+";@ c #859DB8",
+">@ c #6E8396",
+",@ c #252C33",
+"'@ c #9CC4D7",
+")@ c #92C0D9",
+"!@ c #79A0BA",
+"~@ c #6487A3",
+"{@ c #566979",
+"]@ c #8CB0C2",
+"^@ c #51697C",
+"/@ c #60849D",
+"(@ c #6D8EAC",
+"_@ c #7BA0BC",
+":@ c #8AB4CE",
+"<@ c #95C2DB",
+"[@ c #9AC5DC",
+"}@ c #95C1DA",
+"|@ c #607B8C",
+"1@ c #597488",
+"2@ c #7EA6BF",
+"3@ c #597587",
+"4@ c #455664",
+"5@ c #668598",
+"6@ c #82A9C4",
+"7@ c #617F92",
+"8@ c #1A2328",
+"9@ c #2B3137",
+"0@ c #728FAC",
+"a@ c #51657B",
+"b@ c #6B8AA8",
+"c@ c #8EAEC7",
+"d@ c #A8C8E2",
+"e@ c #92BDD6",
+"f@ c #769DBA",
+"g@ c #526E87",
+"h@ c #7490A0",
+"i@ c #A6CDE4",
+"j@ c #97BFD4",
+"k@ c #55697D",
+"l@ c #6286A0",
+"m@ c #7399B3",
+"n@ c #84ACC5",
+"o@ c #92BFD9",
+"p@ c #99C4DC",
+"q@ c #94C0DA",
+"r@ c #4F6575",
+"s@ c #7DA5BF",
+"t@ c #7FA2BC",
+"u@ c #8FB6CE",
+"v@ c #95C3DB",
+"w@ c #8EB8D2",
+"x@ c #6A879D",
+"y@ c #111318",
+"z@ c #252A30",
+"A@ c #81868C",
+"B@ c #A5ABAD",
+"C@ c #70767C",
+"D@ c #38434F",
+"E@ c #637F9B",
+"F@ c #516980",
+"G@ c #799AB5",
+"H@ c #A5C3D9",
+"I@ c #93BDD6",
+"J@ c #779EBA",
+"K@ c #445A6B",
+"L@ c #93B5C9",
+"M@ c #B6D3E8",
+"N@ c #AECFE4",
+"O@ c #95BDD2",
+"P@ c #52687A",
+"Q@ c #6486A3",
+"R@ c #7092B0",
+"S@ c #90BCD6",
+"T@ c #97C4DC",
+"U@ c #A0C9E0",
+"V@ c #99C5DD",
+"W@ c #86AEC6",
+"X@ c #8FBAD4",
+"Y@ c #91BDD6",
+"Z@ c #7094AC",
+"`@ c #2A353E",
+" # c #0B0E10",
+".# c #888D90",
+"+# c #787D82",
+"@# c #465360",
+"## c #56697F",
+"$# c #A6CADD",
+"%# c #5A7382",
+" c #6C8CAA",
+"*# c #A5BED3",
+"=# c #A7CAE0",
+"-# c #94C1DA",
+";# c #7EA4BF",
+"># c #415160",
+",# c #9DC3D5",
+"'# c #B3CFE1",
+")# c #AAC3D4",
+"!# c #A8CDE4",
+"~# c #89ACBE",
+"{# c #567088",
+"]# c #6C91AC",
+"^# c #81A7C2",
+"/# c #96C4DC",
+"(# c #85A9BD",
+"_# c #708C9B",
+":# c #5A6E7B",
+"<# c #6C8695",
+"[# c #97C3DB",
+"}# c #8BB5CE",
+"|# c #425461",
+"1# c #63819E",
+"2# c #415465",
+"3# c #0B0D0E",
+"4# c #607387",
+"5# c #687D8C",
+"6# c #B8D6E9",
+"7# c #7893A2",
+"8# c #576F85",
+"9# c #A7BACF",
+"0# c #B0CEE5",
+"a# c #98C4DC",
+"b# c #88B1CA",
+"c# c #36444E",
+"d# c #8FA0AD",
+"e# c #73818D",
+"f# c #596D81",
+"g# c #B4D0E4",
+"h# c #A3CDE2",
+"i# c #658296",
+"j# c #6A8DAB",
+"k# c #7BA5C0",
+"l# c #94BAD2",
+"m# c #6D899B",
+"n# c #99C3DC",
+"o# c #8EB9D2",
+"p# c #7AA0BA",
+"q# c #6C8FAB",
+"r# c #6484A1",
+"s# c #1F252C",
+"t# c #121619",
+"u# c #7E96B0",
+"v# c #7A8A96",
+"w# c #BCD7EA",
+"x# c #A0C5D9",
+"y# c #3C4B57",
+"z# c #A9BACD",
+"A# c #BCD5E8",
+"B# c #84A6BA",
+"C# c #8EA1AE",
+"D# c #CFD1D4",
+"E# c #ECF6FA",
+"F# c #ABB7C2",
+"G# c #556F84",
+"H# c #57626A",
+"I# c #5C7078",
+"J# c #6C8AA7",
+"K# c #80A6C0",
+"L# c #91B8D0",
+"M# c #94BFD8",
+"N# c #87B0CA",
+"O# c #7CA2BB",
+"P# c #7097AF",
+"Q# c #495E6F",
+"R# c #0C0E11",
+"S# c #3A3F43",
+"T# c #8AA3BB",
+"U# c #778592",
+"V# c #C0D8EB",
+"W# c #B3D5E9",
+"X# c #404A53",
+"Y# c #B2C2D3",
+"Z# c #96A1AC",
+"`# c #9DB2C3",
+" $ c #AEBECE",
+".$ c #EDEFF3",
+"+$ c #F7FAFC",
+"@$ c #B6BFC7",
+"#$ c #556E85",
+"$$ c #121314",
+"%$ c #2B2E2F",
+"&$ c #555A5E",
+"*$ c #3B4C5B",
+"=$ c #6F8EA4",
+"-$ c #92BED8",
+";$ c #9DC7DF",
+">$ c #87ACC1",
+",$ c #546A78",
+"'$ c #516874",
+")$ c #4E6570",
+"!$ c #4D6271",
+"~$ c #4C6271",
+"{$ c #4E677A",
+"]$ c #38454E",
+"^$ c #6C7278",
+"/$ c #86A1B6",
+"($ c #5C656C",
+"_$ c #A4B0BA",
+":$ c #555D64",
+"<$ c #657178",
+"[$ c #A6B0B5",
+"}$ c #939CA1",
+"|$ c #D4E4F1",
+"1$ c #A0BACE",
+"2$ c #B9C7D7",
+"3$ c #F6F7F9",
+"4$ c #C6CED1",
+"5$ c #506A7C",
+"6$ c #060607",
+"7$ c #676A6B",
+"8$ c #91999F",
+"9$ c #7CA3BE",
+"0$ c #96BCD4",
+"a$ c #5B717E",
+"b$ c #4B5F6C",
+"c$ c #455864",
+"d$ c #5B717F",
+"e$ c #81A5B9",
+"f$ c #98C4DD",
+"g$ c #93BFD8",
+"h$ c #87B1CA",
+"i$ c #7BA1BC",
+"j$ c #5A7489",
+"k$ c #222A33",
+"l$ c #838A92",
+"m$ c #9DADBC",
+"n$ c #ECF0F5",
+"o$ c #F1F9FB",
+"p$ c #818A8D",
+"q$ c #4A5155",
+"r$ c #6A6F72",
+"s$ c #7E898F",
+"t$ c #E6F1F7",
+"u$ c #CADCED",
+"v$ c #A0B7CC",
+"w$ c #C6D1DF",
+"x$ c #AFB3B4",
+"y$ c #5F707D",
+"z$ c #CBCFD1",
+"A$ c #F4F5F6",
+"B$ c #66737F",
+"C$ c #87B2CB",
+"D$ c #90B7CD",
+"E$ c #596E7B",
+"F$ c #586F7E",
+"G$ c #8BB0C8",
+"H$ c #91BED6",
+"I$ c #83ADC7",
+"J$ c #6D8EA7",
+"K$ c #3F5161",
+"L$ c #2D3A45",
+"M$ c #1F2020",
+"N$ c #BDC5CC",
+"O$ c #E0EDF5",
+"P$ c #BBCAD8",
+"Q$ c #E1E4E7",
+"R$ c #5E6368",
+"S$ c #5B5F62",
+"T$ c #D9E7F3",
+"U$ c #A4C3D6",
+"V$ c #89A3B3",
+"W$ c #7B91A1",
+"X$ c #627990",
+"Y$ c #42505A",
+"Z$ c #CACCCE",
+"`$ c #F9F9F9",
+" % c #FDFDFD",
+".% c #BCBEC0",
+"+% c #5C7689",
+"@% c #8DB9D3",
+"#% c #8FB5CC",
+"$% c #536471",
+"%% c #98C1D9",
+"&% c #91BED7",
+"*% c #81AAC5",
+"=% c #597386",
+"-% c #41535F",
+";% c #6486A2",
+">% c #4D667D",
+",% c #070809",
+"'% c #44484E",
+")% c #BEC8D0",
+"!% c #8096A6",
+"~% c #516473",
+"{% c #A9ACAF",
+"]% c #8B8F91",
+"^% c #A8B3BD",
+"/% c #C5DAEB",
+"(% c #9FC8E1",
+"_% c #8FBCD6",
+":% c #81A8C2",
+"<% c #6C90AC",
+"[% c #56728C",
+"}% c #585B5F",
+"|% c #CBCDCD",
+"1% c #C1C3C6",
+"2% c #4F565F",
+"3% c #82ABC3",
+"4% c #93BCD3",
+"5% c #95BED7",
+"6% c #8EB9D3",
+"7% c #5B788B",
+"8% c #627E91",
+"9% c #7FA7C1",
+"0% c #6C91AB",
+"a% c #546F87",
+"b% c #6F7376",
+"c% c #D5E2EF",
+"d% c #A9C4D8",
+"e% c #81A1BA",
+"f% c #333940",
+"g% c #5F6B76",
+"h% c #C0D5E8",
+"i% c #AACCE2",
+"j% c #8EB8D3",
+"k% c #7FA5BF",
+"l% c #7095B0",
+"m% c #4E697E",
+"n% c #07090A",
+"o% c #0D0F10",
+"p% c #7193A6",
+"q% c #96C3DC",
+"r% c #8EBCD7",
+"s% c #91BDD7",
+"t% c #8FBBD6",
+"u% c #7699AD",
+"v% c #4D626F",
+"w% c #252D33",
+"x% c #101215",
+"y% c #0C0D0E",
+"z% c #0A0C0E",
+"A% c #06090A",
+"B% c #7F8488",
+"C% c #D7E3F1",
+"D% c #B6D0E4",
+"E% c #A3C2D7",
+"F% c #596872",
+"G% c #A9BED0",
+"H% c #B4D0E5",
+"I% c #9EC8DC",
+"J% c #8FB9D4",
+"K% c #85ADC7",
+"L% c #7FA4BE",
+"M% c #4B606F",
+"N% c #4E6372",
+"O% c #89B6D0",
+"P% c #92C1DA",
+"Q% c #9DC7DD",
+"R% c #95C0DA",
+"S% c #94BED8",
+"T% c #8BB8D1",
+"U% c #7AA0B9",
+"V% c #4E667A",
+"W% c #344151",
+"X% c #0C0D0F",
+"Y% c #8A8F92",
+"Z% c #D4E6F5",
+"`% c #BCD5E9",
+" & c #8599A5",
+".& c #939DA6",
+"+& c #C4DAEB",
+"@& c #89A6B9",
+"#& c #7D9FB5",
+"$& c #98C3DC",
+"%& c #95C0D9",
+"&& c #7CA2B9",
+"*& c #7697AE",
+"=& c #698498",
+"-& c #7394A8",
+";& c #9EC7DF",
+">& c #8DB1C4",
+",& c #6B8594",
+"'& c #50636C",
+")& c #50626C",
+"!& c #7F9FB1",
+"~& c #93B8D0",
+"{& c #627A88",
+"]& c #90B6CC",
+"^& c #93BDD7",
+"/& c #87AFC9",
+"(& c #7291A7",
+"_& c #384651",
+":& c #121618",
+"<& c #12171B",
+"[& c #4F6986",
+"}& c #597998",
+"|& c #324052",
+"1& c #969CA1",
+"2& c #D6E6F5",
+"3& c #C6DCEE",
+"4& c #505A64",
+"5& c #82929F",
+"6& c #99ABBB",
+"7& c #A1B9CA",
+"8& c #87A0B0",
+"9& c #718EA1",
+"0& c #8DB2C9",
+"a& c #8BAEC4",
+"b& c #586D7D",
+"c& c #97C0D9",
+"d& c #8DB3C9",
+"e& c #95B8CD",
+"f& c #9DC0D6",
+"g& c #6F8B9C",
+"h& c #354249",
+"i& c #464E54",
+"j& c #8A98A5",
+"k& c #AABAC7",
+"l& c #86939E",
+"m& c #41494F",
+"n& c #4A5861",
+"o& c #97C1DA",
+"p& c #5E7888",
+"q& c #5C7482",
+"r& c #88ACC2",
+"s& c #91BFD7",
+"t& c #799CB5",
+"u& c #47596A",
+"v& c #0D0F12",
+"w& c #1A2127",
+"x& c #56778D",
+"y& c #688BA9",
+"z& c #5D7F9E",
+"A& c #547391",
+"B& c #0E1013",
+"C& c #9DA6AB",
+"D& c #C8DCED",
+"E& c #7A8996",
+"F& c #B5CEE0",
+"G& c #BCDBEC",
+"H& c #B9D5EA",
+"I& c #8BA2B2",
+"J& c #6C8A9D",
+"K& c #97BFD7",
+"L& c #3E4E59",
+"M& c #92B5CB",
+"N& c #535F68",
+"O& c #454F56",
+"P& c #6F7C87",
+"Q& c #ABC0D1",
+"R& c #C7DCEE",
+"S& c #C5DBED",
+"T& c #C2D7EA",
+"U& c #BFD8EA",
+"V& c #BCD7EB",
+"W& c #62717B",
+"X& c #5B6F7B",
+"Y& c #95C3DC",
+"Z& c #8BB2C9",
+"`& c #485761",
+" * c #42525F",
+".* c #6686A1",
+"+* c #587896",
+"@* c #1B2129",
+"#* c #5C7A94",
+"$* c #7DA2BD",
+"%* c #84AEC7",
+"&* c #749BB5",
+"** c #5C7E9C",
+"=* c #27343F",
+"-* c #A4A9B2",
+";* c #D9E7F4",
+">* c #C8DBEC",
+",* c #B1C8DA",
+"'* c #5D6C76",
+")* c #A8C5D8",
+"!* c #A6BDD0",
+"~* c #B9D6EA",
+"{* c #B9D4E9",
+"]* c #8198A8",
+"^* c #8AADC3",
+"/* c #8CB1CA",
+"(* c #96C2D8",
+"_* c #A3C7DF",
+":* c #ADCDE3",
+"<* c #ABD0E4",
+"[* c #ADCFE3",
+"}* c #AACEE4",
+"|* c #A4CDE3",
+"1* c #A1CBE1",
+"2* c #A3CCE3",
+"3* c #A2C9DF",
+"4* c #41515A",
+"5* c #81A2B5",
+"6* c #94C0D7",
+"7* c #5E7789",
+"8* c #526777",
+"9* c #516777",
+"0* c #6B8CA5",
+"a* c #759CBA",
+"b* c #658AA5",
+"c* c #587798",
+"d* c #1B242B",
+"e* c #0E1110",
+"f* c #101214",
+"g* c #202931",
+"h* c #59758E",
+"i* c #799FBB",
+"j* c #84B1CA",
+"k* c #86ACC6",
+"l* c #354758",
+"m* c #A0A6AE",
+"n* c #DAE6F2",
+"o* c #C4DCEE",
+"p* c #B4D2E8",
+"q* c #3E4A53",
+"r* c #698091",
+"s* c #5D7581",
+"t* c #A3CAE0",
+"u* c #A6CFE5",
+"v* c #A5CCE5",
+"w* c #718A9C",
+"x* c #98C3DB",
+"y* c #83ABC7",
+"z* c #2E3B46",
+"A* c #33414A",
+"B* c #678398",
+"C* c #8AB3CE",
+"D* c #93BED7",
+"E* c #97C4DB",
+"F* c #42525E",
+"G* c #88ACC0",
+"H* c #789EB9",
+"I* c #7A9FBB",
+"J* c #7EA2BD",
+"K* c #779DB5",
+"L* c #577081",
+"M* c #5B7B9B",
+"N* c #1D2229",
+"O* c #547390",
+"P* c #54728D",
+"Q* c #6082A0",
+"R* c #688EA9",
+"S* c #6689A7",
+"T* c #6086A0",
+"U* c #6285A1",
+"V* c #6B8DAA",
+"W* c #718FAB",
+"X* c #3E5568",
+"Y* c #969DA1",
+"Z* c #DBE8F4",
+"`* c #95ACBD",
+" = c #758B9A",
+".= c #A4C9DE",
+"+= c #698190",
+"@= c #667E8A",
+"#= c #7D99AA",
+"$= c #7B9BAD",
+"%= c #6F8C9A",
+"&= c #536976",
+"*= c #84ADC6",
+"== c #6D92AD",
+"-= c #62829E",
+";= c #43576A",
+">= c #2F3B46",
+",= c #5C788A",
+"'= c #86AFC8",
+")= c #93BED8",
+"!= c #93BAD5",
+"~= c #93BAD2",
+"{= c #92BCD4",
+"]= c #7EA2B6",
+"^= c #3D4D56",
+"/= c #485B67",
+"(= c #7596A9",
+"_= c #8CBBD4",
+":= c #90BCD5",
+"<= c #91BFD9",
+"[= c #789BAD",
+"}= c #465B6A",
+"|= c #59789A",
+"1= c #5D7F9D",
+"2= c #5E839C",
+"3= c #59799A",
+"4= c #415569",
+"5= c #2D3A46",
+"6= c #2E3B49",
+"7= c #4A647C",
+"8= c #587690",
+"9= c #39485A",
+"0= c #7F8589",
+"a= c #D9E8F5",
+"b= c #CCDEEE",
+"c= c #8597A5",
+"d= c #B3D2E3",
+"e= c #9BB3C4",
+"f= c #B2CEE1",
+"g= c #B2D1E7",
+"h= c #ABCFE6",
+"i= c #94B7CB",
+"j= c #495C6A",
+"k= c #688498",
+"l= c #617B8A",
+"m= c #85ADC8",
+"n= c #78A0B9",
+"o= c #62819B",
+"p= c #2E3843",
+"q= c #485A6C",
+"r= c #67889C",
+"s= c #8AB5CF",
+"t= c #8EB9D1",
+"u= c #6C899B",
+"v= c #6E91A7",
+"w= c #678399",
+"x= c #6888A1",
+"y= c #323E48",
+"z= c #5B7585",
+"A= c #98C5DD",
+"B= c #83ACC1",
+"C= c #2D373F",
+"D= c #4B637C",
+"E= c #567694",
+"F= c #26313C",
+"G= c #15191F",
+"H= c #4D647A",
+"I= c #252F39",
+"J= c #5D6163",
+"K= c #DDE9F5",
+"L= c #CEDFEE",
+"M= c #8898A5",
+"N= c #B0CBDC",
+"O= c #BFDAEC",
+"P= c #BFDBEC",
+"Q= c #BBDAEC",
+"R= c #BAD7EA",
+"S= c #6B808F",
+"T= c #7297B0",
+"U= c #8CB8D1",
+"V= c #95C1D9",
+"W= c #91BCD6",
+"X= c #86AEC8",
+"Y= c #7496B3",
+"Z= c #6587A2",
+"`= c #384958",
+" - c #323F4B",
+".- c #546A7C",
+"+- c #6C88A1",
+"@- c #779AB1",
+"#- c #658297",
+"$- c #3B4A58",
+"%- c #33404B",
+"&- c #202830",
+"*- c #577287",
+"=- c #86B1CC",
+"-- c #86ACC0",
+";- c #6E8797",
+">- c #9CC7DF",
+",- c #92BCD5",
+"'- c #91BCD5",
+")- c #8EB6CE",
+"!- c #344453",
+"~- c #263039",
+"{- c #364452",
+"]- c #2B3643",
+"^- c #2A2D2E",
+"/- c #E1EBF4",
+"(- c #D2E4F3",
+"_- c #A0B2C3",
+":- c #8094A1",
+"<- c #BAD8EB",
+"[- c #B8D6EA",
+"}- c #485A6A",
+"|- c #789FB9",
+"1- c #90BBD3",
+"2- c #94C4DC",
+"3- c #88B3CD",
+"4- c #7A9EB9",
+"5- c #698BA8",
+"6- c #4D677C",
+"7- c #151A1E",
+"8- c #1A2125",
+"9- c #171C21",
+"0- c #1D2329",
+"a- c #1D262E",
+"b- c #486073",
+"c- c #6A8CAA",
+"d- c #7CA2BE",
+"e- c #90BDD7",
+"f- c #9AC5DE",
+"g- c #7493A2",
+"h- c #708B99",
+"i- c #8CB7D1",
+"j- c #7494AB",
+"k- c #68889F",
+"l- c #6A8FA5",
+"m- c #7BA2BC",
+"n- c #171D21",
+"o- c #1D262F",
+"p- c #212B36",
+"q- c #09090B",
+"r- c #BBC2C9",
+"s- c #D4E4F2",
+"t- c #C1D9EB",
+"u- c #44515A",
+"v- c #92B5C9",
+"w- c #6B8795",
+"x- c #4E687E",
+"y- c #7EA6C0",
+"z- c #91BED8",
+"A- c #93BFD9",
+"B- c #8CB5D0",
+"C- c #7DA4BE",
+"D- c #6F92AE",
+"E- c #6687A5",
+"F- c #526C85",
+"G- c #415669",
+"H- c #384655",
+"I- c #6589A4",
+"J- c #6E92AE",
+"K- c #80A8C2",
+"L- c #92BCD6",
+"M- c #91BFD8",
+"N- c #799AAF",
+"O- c #6A8796",
+"P- c #81AAC3",
+"Q- c #577187",
+"R- c #1F2930",
+"S- c #192027",
+"T- c #1B2227",
+"U- c #0D1010",
+"V- c #0E1012",
+"W- c #070709",
+"X- c #5C6062",
+"Y- c #DCE8F3",
+"Z- c #C4DCEF",
+"`- c #9BB3C6",
+" ; c #3A424F",
+".; c #313A44",
+"+; c #35424C",
+"@; c #374655",
+"#; c #6E91AD",
+"$; c #87B2CC",
+"%; c #799EBA",
+"&; c #618298",
+"*; c #7095AF",
+"=; c #435663",
+"-; c #80A7C0",
+";; c #95C4DC",
+">; c #779CB3",
+",; c #526D7E",
+"'; c #516A7A",
+"); c #526B7B",
+"!; c #465764",
+"~; c #34414E",
+"{; c #5C7E9A",
+"]; c #2B3741",
+"^; c #4B657F",
+"/; c #5C7D9C",
+"(; c #557088",
+"_; c #0F0F10",
+":; c #B9C2CA",
+"<; c #CCDFEF",
+"[; c #B4CDE1",
+"}; c #8DAEC8",
+"|; c #6F93AE",
+"1; c #678CA6",
+"2; c #6E92AF",
+"3; c #81A8C1",
+"4; c #8FBBD5",
+"5; c #8DB9D2",
+"6; c #6D8FA2",
+"7; c #586F82",
+"8; c #394851",
+"9; c #86B0C6",
+"0; c #85AFC8",
+"a; c #6F94AF",
+"b; c #698DA8",
+"c; c #6889A7",
+"d; c #5E7E9F",
+"e; c #475D75",
+"f; c #2E3C4A",
+"g; c #5D7E9D",
+"h; c #405465",
+"i; c #36393B",
+"j; c #D7E5F1",
+"k; c #A4C5DC",
+"l; c #668496",
+"m; c #7595AB",
+"n; c #7798AE",
+"o; c #97C2DA",
+"p; c #789DB3",
+"q; c #8BB1C8",
+"r; c #93C0D9",
+"s; c #8BB5CF",
+"t; c #85AFC9",
+"u; c #82AAC6",
+"v; c #5F7C95",
+"w; c #1E252C",
+"x; c #54728E",
+"y; c #587899",
+"z; c #5A7B9B",
+"A; c #2D3843",
+"B; c #798086",
+"C; c #D1E3F1",
+"D; c #B7D3E8",
+"E; c #7E98AB",
+"F; c #181C1F",
+"G; c #46525F",
+"H; c #80A1B8",
+"I; c #99C3DB",
+"J; c #85ACC2",
+"K; c #21272D",
+"L; c #0A0B0D",
+"M; c #53718C",
+"N; c #577797",
+"O; c #1B2229",
+"P; c #0D0E0F",
+"Q; c #B3BDC4",
+"R; c #CADDED",
+"S; c #B4D3E7",
+"T; c #2B3339",
+"U; c #2F3840",
+"V; c #7899AC",
+"W; c #93C1D9",
+"X; c #8FBCD5",
+"Y; c #8BB6D1",
+"Z; c #8DB8D2",
+"`; c #92BFD8",
+" > c #678092",
+".> c #547089",
+"+> c #5C7F9B",
+"@> c #1F262E",
+"#> c #202223",
+"$> c #B1BECB",
+"%> c #C3D9EB",
+"&> c #7B8D99",
+"*> c #708B9A",
+"=> c #85ABC1",
+"-> c #7FA3BA",
+";> c #92BBD3",
+">> c #7CA0B4",
+",> c #97BDD4",
+"'> c #657E8F",
+")> c #93BDD4",
+"!> c #88ADC7",
+"~> c #6F94AE",
+"{> c #526A7E",
+"]> c #65849B",
+"^> c #799DBB",
+"/> c #84AFC9",
+"(> c #8FB9D2",
+"_> c #323C45",
+":> c #516C84",
+"<> c #658AA4",
+"[> c #5B7C9B",
+"}> c #2E3A49",
+"|> c #2A3038",
+"1> c #252D3A",
+"2> c #1B1E20",
+"3> c #ADBFCF",
+"4> c #C0D6E7",
+"5> c #B0CDE2",
+"6> c #8EB3C9",
+"7> c #526975",
+"8> c #6B899D",
+"9> c #597183",
+"0> c #90BAD5",
+"a> c #94C2DA",
+"b> c #82ABC5",
+"c> c #495E6E",
+"d> c #82A8C3",
+"e> c #81A4BA",
+"f> c #7594A5",
+"g> c #87ABC3",
+"h> c #4D6573",
+"i> c #6689A6",
+"j> c #526E85",
+"k> c #243037",
+"l> c #607B96",
+"m> c #7699B6",
+"n> c #789EB5",
+"o> c #303D48",
+"p> c #7498B4",
+"q> c #7094AF",
+"r> c #597792",
+"s> c #242F39",
+"t> c #1A1D25",
+"u> c #374553",
+"v> c #4D677D",
+"w> c #14191E",
+"x> c #040505",
+"y> c #171A1D",
+"z> c #8A9FAD",
+"A> c #BCD9EC",
+"B> c #B5D3E7",
+"C> c #A2CAE1",
+"D> c #9DC7DE",
+"E> c #9EC7DD",
+"F> c #3B4A57",
+"G> c #455867",
+"H> c #98C2DB",
+"I> c #85B0CC",
+"J> c #7496B2",
+"K> c #4C606F",
+"L> c #6E8EA3",
+"M> c #7EA0B6",
+"N> c #91BBD3",
+"O> c #8DB7D1",
+"P> c #90BAD4",
+"Q> c #96C1DA",
+"R> c #3B4853",
+"S> c #688AA5",
+"T> c #4C657A",
+"U> c #1B2026",
+"V> c #2B3C44",
+"W> c #5F7A90",
+"X> c #587284",
+"Y> c #536978",
+"Z> c #88B1CC",
+"`> c #759AB8",
+" , c #617E9A",
+"., c #556F85",
+"+, c #20272E",
+"@, c #323D48",
+"#, c #333E4A",
+"$, c #060707",
+"%, c #4A5159",
+"&, c #ACC3D5",
+"*, c #ACCFE5",
+"=, c #5A6874",
+"-, c #AACDE1",
+";, c #9CC6DC",
+">, c #35414C",
+",, c #769AB2",
+"', c #80AAC5",
+"), c #6F92AB",
+"!, c #38464F",
+"~, c #7EA4B9",
+"{, c #97C3DC",
+"], c #7A9FB6",
+"^, c #3F505C",
+"/, c #6D8DA6",
+"(, c #1E282E",
+"_, c #080909",
+":, c #090A0C",
+"<, c #344452",
+"[, c #3B4857",
+"}, c #7799AE",
+"|, c #8DB6D1",
+"1, c #66869E",
+"2, c #3D4957",
+"3, c #536C84",
+"4, c #353F4C",
+"5, c #111215",
+"6, c #65727E",
+"7, c #A6BCCD",
+"8, c #5D6972",
+"9, c #AED0E6",
+"0, c #99C5DC",
+"a, c #8DB5D0",
+"b, c #8DB5CE",
+"c, c #90BBD5",
+"d, c #84AAC5",
+"e, c #8EBBD5",
+"f, c #80A7C1",
+"g, c #6C8DA2",
+"h, c #85AFC6",
+"i, c #61839B",
+"j, c #374352",
+"k, c #576D83",
+"l, c #80A6C1",
+"m, c #81A4BB",
+"n, c #111315",
+"o, c #111418",
+"p, c #4C6378",
+"q, c #33424C",
+"r, c #37454D",
+"s, c #8DB4CF",
+"t, c #7397B3",
+"u, c #3A495A",
+"v, c #0D0F13",
+"w, c #27303A",
+"x, c #272E36",
+"y, c #0F1012",
+"z, c #90A4B2",
+"A, c #A8CBE2",
+"B, c #91BCD4",
+"C, c #80ABC3",
+"D, c #567083",
+"E, c #67899D",
+"F, c #94C2DB",
+"G, c #95C1DB",
+"H, c #779CB2",
+"I, c #60849E",
+"J, c #64849F",
+"K, c #1A1F22",
+"L, c #405061",
+"M, c #79A1BD",
+"N, c #324051",
+"O, c #6183A1",
+"P, c #6B8FAD",
+"Q, c #6485A2",
+"R, c #34444F",
+"S, c #060606",
+"T, c #2D3339",
+"U, c #B2CBDF",
+"V, c #94BCD5",
+"W, c #7DA2BA",
+"X, c #3F5264",
+"Y, c #5A7991",
+"Z, c #7195B3",
+"`, c #7BA5BD",
+" ' c #81AAC6",
+".' c #88B2CC",
+"+' c #8EBBD4",
+"@' c #8AB2CC",
+"#' c #82ADC7",
+"$' c #7092A5",
+"%' c #95C2DA",
+"&' c #41525F",
+"*' c #6387A3",
+"=' c #475F72",
+"-' c #21282F",
+";' c #5B7288",
+">' c #0D0F11",
+",' c #0B0E11",
+"'' c #212C36",
+")' c #26323C",
+"!' c #161B20",
+"~' c #55616D",
+"{' c #9BB9D0",
+"]' c #799EB6",
+"^' c #27313A",
+"/' c #1A222B",
+"(' c #5D7E99",
+"_' c #6587A4",
+":' c #6789A6",
+"<' c #6B8EAB",
+"[' c #628097",
+"}' c #6D8B9D",
+"|' c #769AAF",
+"1' c #6E91A9",
+"2' c #6C8EAD",
+"3' c #6E91AF",
+"4' c #3C4D59",
+"5' c #8BB1CB",
+"6' c #232D32",
+"7' c #13171B",
+"8' c #232B32",
+"9' c #839AAF",
+"0' c #789BB3",
+"a' c #283138",
+"b' c #0C0E0F",
+"c' c #242B33",
+"d' c #3D4D5B",
+"e' c #435768",
+"f' c #4B6176",
+"g' c #283137",
+"h' c #8DB4CC",
+"i' c #41535E",
+"j' c #405362",
+"k' c #3C4F60",
+"l' c #3C4E5B",
+"m' c #2B353E",
+"n' c #526876",
+"o' c #92BAD3",
+"p' c #1B1F23",
+"q' c #31383F",
+"r' c #7F9CB6",
+"s' c #21292F",
+"t' c #29333F",
+"u' c #1F252E",
+"v' c #090A0E",
+"w' c #4D626E",
+"x' c #96BDD3",
+"y' c #191D20",
+"z' c #13181B",
+"A' c #80A4BC",
+"B' c #1B2027",
+"C' c #5D7182",
+"D' c #2C383F",
+"E' c #364857",
+"F' c #1A2028",
+"G' c #333F49",
+"H' c #7FA2B5",
+"I' c #4A5E6E",
+"J' c #232E35",
+"K' c #252D35",
+"L' c #2F3A41",
+"M' c #0A0B0E",
+"N' c #14191D",
+"O' c #5A717F",
+"P' c #212931",
+"Q' c #222B34",
+"R' c #101216",
+"S' c #21272B",
+" ",
+" ",
+" ",
+" . ",
+" + ",
+" @ # $ % ",
+" & * = - ; ",
+" > , ' ) ! ~ { ] ",
+" ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a ",
+" b c d e f g h i j k l m n o p q r s t u v w x ",
+" y z A B C D E F G H I J K L M N O P Q R S T U U V W X Y ",
+" Z ` ...+.@.#.$.%.O &.*.=.-.;.>.,.'.).!.~.~.~.{.].^./.(._.:.<. ",
+" b [.}.|.#.1.2.3.4.{.~.~.~.~.5.6.5.~.7.8.{.~.~.~.~.9.0.a.b.].c. ",
+" d.e.f.g.h.i.j.k.{.~.~.~.~.l.~.m.% n.~.o.{.{.~.~.~.~.p.V 9.~.q.r. ",
+" s.t.u.v.w.x.u y.z.A.B.5.~.~.5.C.D.E.F.~.~.G.~.~.~.G.H.I.J.~.~.J.K.L. M.N. ",
+" O.P.Q.R.S.T.U.V.W.X.Y.Z.`.~.~.5. +.+++@+U ~.~.~.~.~.#+$+%+,.~.~.G.&+*+=+-+;+ ",
+" >+,+Q.'+)+!+~+{+]+^+/+(+_+:+<+~.[+}+U 9.|+5.~.~.~.~.1+2+3+4+5+~.].6+7+8+9+0+ ",
+" a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+5.U ~.U r+s+~.~.~.t+u+v+w+x+y+~.z+A+t+B+C+D+E+ F+G+ ",
+" H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+V ~.~.~.~.U ~.~.~.o.9.{.Z+`+9.~.~.~.V @.@+@@@#@ $@%@&@*@ ",
+" =@-@;@>@,@'@'.)@!@~@{@]@^@/@l+(@_@:@<@~.~.~.U {.~.~.~.{.~.~.{.[@~.~.~.~.}@|@1@2@3@4@5@6@7@8@ ",
+" 9@0@a@b@c@d@-.e@f@g@h@i@j@k@l@V+m@n@o@p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.q@r@s@t@u@v@w@x@y@ ",
+"z@A@B@C@D@E@X F@G@H@R I@J@K@L@M@N@O@P@Q@R@o+S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.9.U@V@W@X@<+V Y@Z@`@ # ",
+" .#+#@###$#%#*#=#-#;#>#,#'#)#!#~#{#]#^#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.U (#_#:#<#p@{.[#}#|#1#2# ",
+" 3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#S@/#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.l#m#9.{.~.n#o#p#q#r#s# ",
+" t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#% J#K#S@T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.L#0.l.~.~.{.M#N#O#P#Q#R# ",
+" S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$a#~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.o.o.;$9.G.~.>$,$'$)$!$~${$]$ ",
+" ^$/$($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$:+<+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.G.0$a$b$c$d$e$f$g$h$i$j$k$ ",
+" [ l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$M#p@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.;$D$E$F$G$H$I$J$K$L$ ",
+" M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%<+{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.#%$%%%p@&%*%=%-%;%>%,% ",
+" '%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%3%-$T@~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.4%5%U p@6%7%8%9%0%a%y ",
+" b%c%d%e%f%g%h%i%G.[#j%k%l%m%n%o%p%@%q%{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.~.~.~.~.~.V G.}@r%s%t%u%v%w%M.x%y%z%A% ",
+" B%C%D%E%F%G%H%I%V o.<@J%K%L%M%N%O%P%p@~.~.~.~.~.~.~.~.~.U ~.~.U 9.Q%{.~.~.~.~.~.{.%%U {.~.~.{.v@R%S%T%U%V%W% X%$ ",
+" Y%Z%`% &.&+&@&U ~.{.$&%&&&*&=&-&T@~.~.~.~.~.~.~.~.~.~.~.;&>&,&'&)&!&5+~.~.~.~.{.~&{&]&9.~.p@^&/&(&_&:& <&[&}&|& ",
+" 1&2&3&4&5&6&7&8&9&l.~.{.V 0&a&b&c&~.~.~.~.~.~.~.5.d&e&f&g&h&i&j&k&l&m&n&~.~.G.~.~.~.o&p&q&r&s&t&u&v& w&x&y&z&A&B& ",
+" C&2&D&E&F&G&G&H&I&J&U ~.~.U K&L&,.~.~.~.~.~.~.~.U M&N&O&P&Q&R&S&T&U&V&W&X&].{.~.~.{./#Y&Z&`& *.*+*@* (.#*$*%*&***=* ",
+" -*;*>*,*'*)*!*~*{*]*^*~.5.{.5./*U ~.~.~.~.~.~.{.[#(*_*:*<*[*[*}*|*1*2*3*4*5*U ~.~.6*7*8*9*0*a*b*c*d*e*f*g*h*i*%*j*k*<%l* ",
+" m*n*o*p*q*r*s*t*u*v*w*1+~.~.~.~.~.~.~.~.~.~.~.x*y*z*A*B*C*D*E*V U ~.G.~.:.F*G*l.{.R%X+H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X* ",
+" Y*Z*D&`* =.=+=@=#=$=%=&={.~.~.~.~.~.~.~.~.~.~.<+*===-=;=>=,='=)=[#p@!=~={=]=^=/=(=a#&%_=:=<=-#[=}=k$|=1=2=3=4=5=6=7=8=9= ",
+" 0=a=b=c=d=e=f=g=h=i=j=k=l=5.~.~.~.~.~.~.~.~.~.V -$m=n===o=p=q=r=s=t=:+u=v=w=x=y=z=A=J.V U ~.V [#B=C=D=1=E=F= G=H=I= ",
+" J=K=L=M=N=O=P=Q=R=S=T=U=V=5.U ~.~.~.~.~.~.~.~.~.{.x*W=X=Y=Z=`= -.-+-@-#-$-%-&-*-=---;->-9.x*)=,-'-)-c.!-~- {-]- ",
+" ^-/-(-_-:-<-<-[-%.}-|-1-T@~.{.~.~.~.~.~.~.~.~.~.~.V 2-^&3-4-5-6-7-8-9-0-a-b-c-d-e-f-g-h-V@i-j-k-l-T=m-7@n- o-p- ",
+" q-r-s-t-u-v-!+2*w-x-y-z-V ~.~.~.~.~.~.~.~.~.~.~.~.~.~./#A-B-C-D-E-F-G-H-I-J-K-L-<@M-W=N-O-P-Q-R-<&S-T-U-V- W- ",
+" X-Y-Z-`- ;.;+;@;#;$;q+~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~./#v@W=N#%;&;*;=;-;s=-#;;>;,;';);!;~;{;];^;/;(;H+ ",
+" _;:;<;[;};|;1;2;3;4;{.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.T@-#5;6;7;8;9;[#V <+0;a;b;c;E-d;e;f;|=g;h; ",
+" i;j;V#k;F.l;m;n;o;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.~.{.p@S@s=p;q;~.~.{.r;s;t;u;~$v;w;x;y;z;A; ",
+" H+B;C;D;E;F;G;H;~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.{.U ~.~.V E*E*V ~.~.~.{.T@/#I;J;K;L;M;y;N;O; ",
+" P;Q;R;S;T;U;~.{.~.~.~.~.~.~.~.~.l.U {.p@~.~.{.V ~.~.5+V;].~.~.~.~.{.{.p@W;X;Y;Z;`;/# >W..>+>N;@> ",
+" #>$>%>&>*>G.~.~.~.~.~.~.~.~.{.`.=>V=->;>~.n##&>>T@,>'>].~.~.~.~.~.)>!>i$~>{>]>^>/>(>_>:><>[>}> |>1> ",
+" 2>3>4>5>U@U ~.~.~.~.~.~.~.{.6>7>8>9>0>a#a>b>c>d>e>f>~.~.~.V ~.~.g>h>i>1=j>,%k>l>m>n>o>p>q>r>s>t>u>v>w> ",
+" x>y>z>A>B>C>5+D>E>~.~.~.~.{.%&F>G>3;s%{.H>I>J>K>L>M>~.V N>O>P>x*Q>R>S>T>U> X%V>W>X>Y>Z>P-`> ,.,+, ",
+" @,#,$,%,&,1.*,=,-,;,{.p@V {.X@>,,,Z;V ~.5.`;',),!,~,~.{,],^,/,/&-$F$(,_, :,<,[,},<@|,1,2, ",
+" B&3,4, 5,6,7,8,9,0,`;a,b,B+c,d,s=<+~.~.~.a#e,f,g,h,V -#9$i,j,k,l,m,n, o,p,q,r,s,t,u,v, ",
+" w,x, y,z,A,B,C,D,E,o@F,G,<+~.~.~.~.~.;;P>j%}@p@H,]#I,J,K,L,M,=+ N,O,P,Q,R,S, ",
+" T,U,V,W,X,Y,Z,`, '.'+'x*~.{.O+@%@'#'$'%'a#&'*'='-' ~;;'>' ,''')'!' ",
+" ~'{']'^'/'('_'_':'<'['}'{.V |'1'2'3'4'5'}@6'7' 8'K; ",
+" v&9'0'a' b'c'd'e'f'1@g'h'G.i'j'k'l'm'n'o'p' y ",
+" q'r's' t'u'H+ v'w'x'y' z'A'B' ",
+" C'D' E'F' G'H' I'J' ",
+" K'L' M' N'O' P'Q' ",
+" R' S' ",
+" ",
+" ",
+" ",
+" "};
diff --git a/minilibx-linux/test/run_tests.sh b/minilibx-linux/test/run_tests.sh
new file mode 100755
index 0000000..d33cd5e
--- /dev/null
+++ b/minilibx-linux/test/run_tests.sh
@@ -0,0 +1,94 @@
+#!/usr/bin/env sh
+
+# This very basic script simulate user inputs for the CI
+# Feel free to update, improve or remove it if proper
+# intergration tests and/or unit tests are added.
+
+set -e
+
+BOLD="\033[1m"
+RESET="\033[0m"
+LIGHT_RED="\033[91m"
+LIGHT_GREEN="\033[92m"
+LIGHT_CYAN="\033[96m"
+
+logging(){
+ local type=$1; shift
+ printf "${LIGHT_CYAN}${BOLD}run_tests${RESET} [%b] : %b\n" "$type" "$*"
+}
+log_info(){
+ logging "${LIGHT_GREEN}info${RESET}" "$@"
+}
+log_error(){
+ logging "${LIGHT_RED}error${RESET}" "$@" >&2
+ exit 1
+}
+
+
+PID=""
+
+# to properly kill child process executed in background on exit
+at_exit() {
+ status=$?
+ [ $status -eq 0 ] && log_info "Seem all went well" && exit 0
+ # Code for non-zero exit:
+ if ! kill -s TERM "$PID" 2>/dev/null || ! wait "$PID" ; then
+ log_error "Pid [$PID] died with status $status "
+ fi
+ log_error "Something went wrong. Pid [$PID] has been killed. Status code $status"
+}
+# to properly quit from ctrl+c (SIGINT Signal)
+sigint_handler(){
+ kill -s TERM "$PID"
+ wait
+ log_info "Tests abort"
+ exit 1
+}
+
+# look at test/main.c and run ./mlx-test to understand what this function does
+test_default_main(){
+ ${MAKE} -f Makefile.gen all
+ ./mlx-test &
+ PID="$!"
+ log_info "./mlx-test running in background, pid:" $PID
+
+ i=25 # waiting 25s mlx-test to be ready for inputs.
+ while [ $i -gt 0 ]; do
+ if ! ps -p $PID > /dev/null ; then
+ wait $PID
+ fi
+ log_info "countdown" $i
+ sleep 1
+ i=$((i - 1))
+ done
+ log_info "Ready to \"just play\" using xdotool"
+ wid1=$(xdotool search --name Title1)
+ wid2=$(xdotool search --name Title2)
+ wid3=$(xdotool search --name Title3)
+
+ xdotool windowfocus $wid3
+ log_info "Focus Win3: Testing move mouse 100 100"
+ xdotool mousemove 100 100
+ log_info "Focus Win3: Testing move mouse 200 200"
+ xdotool mousemove 200 200
+ log_info "Focus Win3: Pressing escape to destroy window \"Win3\""
+ xdotool key Escape
+
+ log_info "Focus Win2: Pressing escape to stop program"
+ xdotool windowfocus $wid2
+ xdotool key Escape
+}
+
+main(){
+ case $(uname) in
+ FreeBSD) MAKE=gmake ;;
+ *) MAKE=make ;;
+ esac
+ cd $(dirname $0)
+ trap at_exit EXIT
+ trap sigint_handler INT
+
+ test_default_main
+}
+
+main "$@"
diff --git a/player.c b/player.c
new file mode 100644
index 0000000..d877e21
--- /dev/null
+++ b/player.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* player.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/03 10:22:53 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 15:24:01 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "so_long.h"
+#include "stdio.h"
+
+int on_player_move(int keycode, t_data *data)
+{
+ (void) data;
+
+ printf("PRINT:%d", keycode);
+ return 0;
+}
\ No newline at end of file
diff --git a/rectangle_check.c b/rectangle_check.c
new file mode 100644
index 0000000..2f4129f
--- /dev/null
+++ b/rectangle_check.c
@@ -0,0 +1,92 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* rectangle_check.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/03 01:27:59 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 05:34:04 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "so_long.h"
+
+t_boolean is_rectangle(t_data data) {
+ return (is_horizontal_rectangle(data) || is_vertical_rectangle(data));
+}
+
+t_boolean is_horizontal_rectangle(t_data data) {
+ size_t x_lenght;
+ size_t y_index;
+
+ x_lenght = ft_strlen(data.map[0]);
+ y_index = 0;
+
+ while (y_index < data.lenght_y && data.map[y_index]) {
+ if (ft_strlen(data.map[y_index]) != x_lenght)
+ return (_false);
+ y_index++;
+ }
+
+ if (x_lenght <= y_index)
+ return (_false);
+
+ return (_true);
+}
+
+t_boolean is_vertical_rectangle(t_data data) {
+ size_t x_index;
+ size_t y_index;
+
+ size_t x_lenght;
+ size_t y_lenght;
+
+ x_index = 0;
+ y_index = 0;
+
+ x_lenght = ft_strlen(data.map[0]);
+ y_lenght = data.lenght_y;
+
+ while (x_index < x_lenght) {
+ while (x_index < x_lenght && y_index < y_lenght && data.map[y_index][x_index])
+ y_index++;
+ if (y_index != y_lenght)
+ return (_false);
+ y_index = 0;
+ x_index++;
+ }
+ y_index = 0;
+ while (y_index < y_lenght)
+ if (data.map[y_index] && ft_strlen(data.map[y_index++]) != x_lenght)
+ return (_false);
+ if (x_index >= y_lenght)
+ return (_false);
+ return (_true);
+}
+
+
+t_boolean is_closed(t_data data) {
+
+ size_t x_lenght;
+ size_t x_index;
+ size_t y_index;
+
+ x_lenght = ft_strlen(data.map[0]);
+ x_index = 0;
+ y_index = 0;
+
+ while (x_index < x_lenght) {
+ if (data.map[0][x_index] != '1' || data.map[data.lenght_y - 1][x_index] != '1')
+ return (_false);
+ x_index++;
+ }
+
+ while (y_index < data.lenght_y) {
+ if (data.map[y_index][0] != '1' || data.map[y_index][x_lenght - 1] != '1')
+ return (_false);
+ y_index++;
+ }
+
+ return (_true);
+}
diff --git a/so_long.h b/so_long.h
new file mode 100644
index 0000000..0d1084a
--- /dev/null
+++ b/so_long.h
@@ -0,0 +1,64 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* so_long.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/02 17:59:52 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 11:29:39 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+
+
+#ifndef SO_LONG_H
+# define SO_LONG_H
+
+# include "libft/libft.h"
+# include "stdlib.h"
+
+typedef struct s_data {
+
+ char **map;
+ size_t lenght_y;
+
+} t_data;
+
+typedef struct s_location {
+
+ size_t x;
+ size_t y;
+
+} t_location;
+
+typedef struct s_collectible {
+
+ t_location location;
+ t_boolean collected;
+
+} t_collectible;
+
+
+t_data load_map(char *path);
+t_boolean is_horizontal_rectangle(t_data data);
+t_boolean is_vertical_rectangle(t_data data);
+t_boolean is_rectangle(t_data data);
+t_boolean is_closed(t_data data);
+
+t_list *load_collectibles(t_data data);
+t_collectible *create_collectible(t_location location);
+int count_collectibles(t_list *collectibles, t_boolean only_uncollected);
+void update_collectible(t_list **collectibles, t_location location, t_boolean collected);
+void free_collectibles(t_list **collectibles);
+
+void is_solvable(t_data data, size_t x, size_t y);
+t_data *clone(t_data data);
+int count_element(t_data data, char type);
+void *load_texture(char *path, void *mlx);
+void draw_type(void *mlx, void *mlx_window, void *texture, t_data data, char c);
+int on_player_move(int keycode, t_data *data);
+void free_map(t_data data);
+t_location find_element(t_data data, char type);
+
+#endif
diff --git a/textures/collectible.xpm b/textures/collectible.xpm
new file mode 100644
index 0000000..089f7d9
--- /dev/null
+++ b/textures/collectible.xpm
@@ -0,0 +1,265 @@
+/* XPM */
+static char *result[] = {
+/* columns rows colors chars-per-pixel */
+"128 128 131 2 ",
+" c #150000",
+". c #1E0502",
+"X c #250602",
+"o c #260B04",
+"O c #2A0B04",
+"+ c #370B04",
+"@ c #390E07",
+"# c #261606",
+"$ c #2D1006",
+"% c #221907",
+"& c #271C08",
+"* c #341607",
+"= c #361308",
+"- c #381308",
+"; c #2F1411",
+": c #301611",
+"> c #252C0A",
+", c #292D0B",
+"< c #29350D",
+"1 c #2A3B0E",
+"2 c #3E2824",
+"3 c #411712",
+"4 c #4E280D",
+"5 c #542C0E",
+"6 c #5B2D0E",
+"7 c #5A310F",
+"8 c #5D3310",
+"9 c #5B3C11",
+"0 c #663611",
+"q c #643811",
+"w c #6D3F13",
+"e c #753217",
+"r c #7F351A",
+"t c #402423",
+"y c #402824",
+"u c #4E2822",
+"i c #27420F",
+"p c #2B4310",
+"a c #2E6717",
+"s c #2F6E19",
+"d c #3D6418",
+"f c #2E741A",
+"g c #2F791B",
+"h c #327C1C",
+"j c #367921",
+"k c #554212",
+"l c #524C14",
+"z c #485E17",
+"x c #734314",
+"c c #7C4916",
+"v c #446218",
+"b c #416919",
+"n c #544240",
+"m c #594541",
+"M c #66534F",
+"N c #635151",
+"B c #873A1C",
+"V c #8D3C1D",
+"C c #903E1D",
+"Z c #B2261A",
+"A c #C4291D",
+"S c #C92C1E",
+"D c #D32B1F",
+"F c #D82C1F",
+"G c #DB2D20",
+"H c #EB3022",
+"J c #FF3325",
+"K c #96401F",
+"L c #8B541A",
+"P c #975D1C",
+"I c #9A5F1D",
+"U c #A2651F",
+"Y c #A7691F",
+"T c #9F4522",
+"R c #84572C",
+"E c #855B34",
+"W c #A14623",
+"Q c #A54823",
+"! c #A84924",
+"~ c #A76920",
+"^ c #AA6B20",
+"/ c #B77423",
+"( c #BB7724",
+") c #BD7824",
+"_ c #C17B25",
+"` c #857674",
+"' c #867876",
+"] c #887A77",
+"[ c #2F871E",
+"{ c #2F8A1E",
+"} c #31861E",
+"| c #31891E",
+" . c #318E20",
+".. c #329421",
+"X. c #339D23",
+"o. c #33A224",
+"O. c #34AB26",
+"+. c #34B027",
+"@. c #35B528",
+"#. c #35BD29",
+"$. c #36C42B",
+"%. c #37CD2D",
+"&. c #37D12E",
+"*. c #38D42F",
+"=. c #38D730",
+"-. c #39DC31",
+";. c #CA8127",
+":. c #CE8428",
+">. c #D38729",
+",. c #D88C2A",
+"<. c #DF912C",
+"1. c #ED9B2F",
+"2. c #EF9D30",
+"3. c #F39F30",
+"4. c #EDA034",
+"5. c #EDA73B",
+"6. c #EDAA3E",
+"7. c #F5A131",
+"8. c #FBA532",
+"9. c #8D807D",
+"0. c #EDAF44",
+"q. c #ECB247",
+"w. c #ECB449",
+"e. c #ECB94E",
+"r. c #ECBE53",
+"t. c #ECC055",
+"y. c #ECC55B",
+"u. c #ECC85E",
+"i. c #ECCA60",
+"p. c #978B88",
+"a. c None",
+/* pixels */
+": o o o o o o o o ( 4.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.0.u.u.u.u.u.u.u.i.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.y.u.u.u.u.u.u.u.y.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.3.~ . o o o o o o o y ",
+"; o o o o o o o o ( 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.q.u.u.u.u.u.u.u.u.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.y.u.u.u.u.u.u.u.y.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.7.~ . o o o o o o X y ",
+"* X o o o o o o o ( 2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.q.u.u.u.u.u.u.u.i.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.y.u.u.u.u.u.y.u.y.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.7.~ . o o o o o o X 2 ",
+"; o o o o o o o X / 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.q.i.u.u.u.u.u.u.u.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.y.u.u.u.u.u.u.u.y.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.7.~ . o o o o o o o 2 ",
+": o o o o o o o X ( 7.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.q.i.u.u.u.u.u.u.u.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.1.1.1.1.1.1.1.1.1.y.y.u.u.y.u.u.u.y.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.~ . o o o o o o X 2 ",
+": o o o o o o o o ) 7.2.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.q.i.u.u.u.u.u.u.u.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.y.u.u.u.u.u.u.u.y.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.7.~ . o o o o o o X y ",
+": X o o o o o o o / 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.q.u.u.u.u.u.u.u.u.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.y.y.u.u.u.u.u.u.y.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.7.~ . o o o o o o o 2 ",
+": o o o o o o o o / 3.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.q.i.u.u.u.u.u.u.u.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.y.y.u.u.u.u.u.u.y.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.7.~ . o o o o o o X 2 ",
+": X o o o o o o o ( 7.2.1.1.1.1.1.1.1.1.2.2.2.2.1.1.1.q.y.y.y.y.y.y.u.y.q.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.y.y.y.y.u.y.y.y.y.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.7.~ . o o o o o o o y ",
+": o o o o o o o o ( 2.2.1.1.1.1.1.1.q.r.r.r.r.r.r.r.t.0.2.4.4.4.4.4.4.4.1.1.1.1.1.1.1.1.1.4.t.t.t.t.t.t.t.t.w.1.1.1.1.1.1.1.1.1.4.4.4.4.4.4.4.4.4.1.1.1.1.1.1.1.1.1.w.t.t.r.t.t.t.t.t.5.1.1.1.1.1.1.1.1.0.r.r.t.r.t.t.r.t.0.1.1.1.1.2.1.2.7.~ . o o o o o o o y ",
+"; o o o o o o o o / 3.2.1.1.1.1.1.1.e.i.i.u.i.y.y.i.i.0.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.i.u.u.u.y.u.u.u.r.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.i.u.u.u.u.y.u.u.6.1.1.1.1.1.1.1.1.w.i.u.u.u.u.u.u.u.w.1.1.1.1.1.1.2.3.~ X o o o o o o X y ",
+": o O o o o o o o / 3.2.1.2.1.1.1.1.e.i.u.u.i.y.y.u.i.0.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.u.u.u.u.u.u.u.u.r.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.r.i.u.u.u.u.u.u.y.4.1.1.1.1.1.1.1.1.w.i.u.u.u.u.u.u.u.0.1.1.1.1.1.2.2.3.~ . o o o o o o X y ",
+": o o o o o o o o / 2.1.2.1.1.1.1.1.q.i.i.y.i.i.u.i.i.0.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.u.u.u.u.u.u.u.u.r.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.e.i.u.u.u.u.u.u.u.6.1.1.1.1.1.1.1.1.0.u.u.u.u.u.u.u.u.w.1.1.1.1.1.1.1.7.~ . o o o o o o o y ",
+"* X o o o o o o o ) 2.2.1.1.1.1.1.1.e.i.y.i.y.i.u.y.i.0.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.u.u.u.u.u.u.u.u.r.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.e.u.u.u.u.u.u.u.u.6.1.1.1.1.1.1.1.1.q.u.u.u.u.u.u.u.i.w.1.1.1.1.1.1.1.7.~ . o o o o o o X y ",
+"; X o o o o o o X ( 7.2.1.1.1.1.1.1.e.i.y.i.y.i.u.y.u.0.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.u.u.u.u.u.u.u.u.t.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.i.u.u.u.u.u.u.u.6.1.1.1.1.1.1.1.1.q.i.u.u.u.u.u.u.i.w.1.1.1.1.1.1.1.7.Y . o o o o o o X 2 ",
+"; o o o o o o o o ( 3.2.1.1.1.1.1.1.e.i.i.y.i.y.i.i.y.6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.u.u.u.u.u.u.u.u.r.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.r.u.u.u.u.u.u.u.u.6.1.1.1.1.1.1.1.1.w.i.u.u.u.u.u.u.i.w.1.1.2.1.1.1.1.7.Y o o o o o o o X 2 ",
+"; o o o o o o o o ( 3.1.1.1.1.1.1.1.q.i.u.u.u.u.u.u.i.q.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.5.u.u.u.u.u.u.u.u.r.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.e.u.u.u.u.u.u.u.u.6.1.1.1.1.1.1.1.1.w.u.u.u.u.u.u.u.u.q.1.1.1.1.1.1.2.3.~ X o o o o o o X y ",
+": o o o o o o o o ( 3.1.1.1.1.1.1.1.e.i.u.i.u.u.u.u.i.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.u.u.u.u.u.i.u.i.r.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.u.u.u.u.u.u.y.u.6.1.1.1.1.1.1.1.1.w.u.u.y.u.u.u.u.u.q.1.1.1.1.1.1.2.3.~ . o o o o o o X y ",
+": o o o o o o o o ( 3.1.1.1.1.1.1.1.e.y.u.y.u.u.y.i.u.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.y.y.y.y.i.y.y.y.r.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.e.y.y.y.y.y.y.y.y.6.1.1.1.1.1.1.1.1.q.u.y.y.y.y.y.y.u.q.1.1.1.1.1.1.2.3.~ . o o o o o o o 2 ",
+"; o o o o o o o o ( 7.1.1.1.1.1.1.1.1.1.4.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.4.1.1.1.5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.4.4.4.4.4.4.4.4.1.1.1.1.1.1.1.1.1.2.4.4.1.4.4.4.4.4.4.1.1.1.1.1.1.2.7.~ . o o o o o o X 2 ",
+"; o o o o o o X o ( 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.2.~ . o o o o o o o 2 ",
+": o o o o o o o o / 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.3.~ . o o o o o o X 2 ",
+"* o o o o o o o o ( 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.~ X o o o o o o X 2 ",
+"; o o o o o o o o ( 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.~ . o o o o o o X y ",
+"; o o o o o o o o ( 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.7.~ X o o o o o O o 2 ",
+"; o o o o o o o o ( 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.7.~ . o o o o o O o y ",
+"; o o o o o o o o ( 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.2.2.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.7.Y . o o o o o o X 2 ",
+": o o o o o o o o ) 7.1.1.4.2.2.2.2.2.2.2.2.2.2.1.1.1.1.2.2.1.2.1.3.1.1.2.2.3.2.2.2.2.2.2.2.4.4.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.1.1.4.2.2.1.1.2.3.2.2.2.2.2.1.2.2.1.1.2.2.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.7.Y . o o o o o o o 2 ",
+"= o o o o o o o o Y <.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.>.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.<.I X o o o o o o X 2 ",
+": o o o o o o o o $ * * * * * * * * * * * * * * * * * * * * * * * $ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * $ * * * * * * * * * * * * * * * $ * * * * * * * $ * * * * * * * * * * * * * * * * * * * * * * * * * * $ o o o o o o o X y ",
+": o o o o o o o o o o o o . o o . o o o X . o o o . . o o X X o o o o . o o o . o o o o o . o . o o o . o o X . . 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 o o o o o . o o o o . X o o o o . o o o . . o o o o . o o o o o o o o o o o 2 ",
+": X 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 o o X 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 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 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 o o o o o o o o o o o o o o o X 2 ",
+": 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 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 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 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 o o o o o o o o o o o o o o o o o o o X y ",
+": 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 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 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 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 o o o o # o o o o o o o o o o o o o o o o y ",
+": X 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 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 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 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 o o o o o o o o o o o o o o o o o o o X y ",
+": 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 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 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 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 o o o o o o o o o o o o o o o o o o o X y ",
+": 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 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 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 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 o o o o o o o o o o o o o o o o o o o o 2 ",
+"; X o o X o o X o o . o o o o o . X X o o o o o o o o X . o o o o o o o o o o . o o o . o o o o o X o o . o o o X o o o . o o o o o . o o . o . o o o o o o o . o o o o o X o . o X # . X o o o o o . o o o o o o . o o o X o . o o X o o o o X o X o o X o . 2 ",
+"- - @ @ @ @ @ @ @ @ @ @ @ @ = @ @ @ @ @ @ @ + + - @ @ @ = - @ @ @ @ @ @ @ @ @ @ : @ @ @ @ @ @ @ @ @ @ @ - + - + - @ @ @ @ @ @ @ @ @ = @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ = @ @ @ @ @ @ @ = @ @ @ @ + - @ @ @ @ @ @ @ @ @ @ @ - @ @ @ @ @ @ @ = = @ @ = @ + - + - + u ",
+"G H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H S ",
+"H J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J G ",
+"H J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J G ",
+"H J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J G ",
+"H J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J D ",
+"H J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J G ",
+"H J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J D ",
+"H J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J D ",
+"H J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J G ",
+"A G G D D G D D F F D F D D F D D D F D D F D D D D D D D D D D G D G G D G D D D D D D D D D D D D D D D D D D F F D F D D F F G G D D G G D G D D G G D G D D F D D F D D F D D F D D D D D D D G S G D D D F F F D F F F D F D G D D G D D G D D G G D G D Z ",
+"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 O O O O O o X O o o o o X 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 o o O $ o o O o o o X 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 O o o o o o o o O o o o o $ $ o o o o O o X 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 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 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 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 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 ",
+"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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 o o X 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 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 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 o o o o o o o ",
+"o o X 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 o X o o o . # o o o o o . o o o o o o o . o o . o o o o o o o X o o o o X o o o X o X # . 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 o o o o o . o o o o o o o o X o o . o ",
+"= - = - - - - * - - * - - - - - - - * * - - - - - - * - - - - - - - = - - - - - - - * - - - - * - - * - - - - * - - * - - - - - * - - - * * - - - - - - - - = = - - - * * - - - - - * - - - - - * - - - - - * - - - - - - - - - - - - - = - - - - - - - - * * * ",
+"T W T T T T W T Q T T T T T T K T T T W W Q K W Q Q K W K W Q K T T W T T T T T T T T T T T W T T T T T T T W T W T T T W W W K T T T T T T T W W T T T T T T T T T T W W K Q W W K Q K Q K T T W T T T T T T T W Q K W K W K Q T T T T T T T W T T T T W T W V ",
+"T W ! Q ! ! Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ! Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ! Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ! C ",
+"T W Q Q Q Q T Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q W W Q Q Q Q Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q Q Q Q ! V ",
+"T W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q W Q Q Q T Q Q Q Q Q Q Q Q Q Q Q Q Q Q ! V ",
+"T W Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ! V ",
+"T Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q W Q Q Q W Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W ! Q W Q Q Q W Q Q Q Q Q Q Q Q T Q Q Q Q Q Q Q Q W Q W ! Q Q Q Q Q Q Q Q Q W Q Q Q Q Q W Q Q Q Q Q Q W ! Q Q Q Q ! V ",
+"T Q Q Q Q Q Q Q Q Q Q W W Q ! ! W Q ! Q W Q ! ! Q Q Q Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ! W ! Q Q Q Q Q Q Q Q Q Q Q Q Q ! Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ! Q W Q Q Q W ! ! W Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q W Q Q ! V ",
+"T Q Q Q T Q Q Q W Q W ! ! W ! W Q Q Q Q ! Q W Q Q Q Q Q Q W Q Q T Q Q Q Q T Q Q Q Q W Q Q Q W Q W ! Q W W ! Q W Q Q Q Q Q Q Q Q Q Q Q Q Q W ! W Q Q W Q Q Q Q W Q Q Q Q Q Q Q Q Q Q T Q W Q Q W ! W ! W W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ! W Q Q Q Q ! ! ! V ",
+"T Q Q Q Q Q Q Q ! ! ! ! ! ! W ! ! ! Q ! Q ! Q Q ! ! Q ! ! ! ! ! ! ! ! Q ! ! Q Q Q ! ! ! ! ! ! Q Q ! ! Q ! ! ! W Q Q ! Q Q Q Q Q Q Q Q Q Q ! ! Q ! ! ! ! Q ! ! ! ! Q ! ! ! Q ! Q Q Q ! ! ! ! ! Q ! ! ! ! ! ! Q ! ! Q ! Q Q Q ! Q Q ! ! Q ! Q ! Q ! Q Q ! ! ! ! V ",
+"r B B B B B B B B B B B V V B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B V B B B B B B B B B B B B B B B V B B B B B B B B B B B B B B B B B B B B B B B B B V V B B B B B B B B B B B B B B B B B B B B B B B V B B B B B B B B B B B B B B B e ",
+"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 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 o o o o o o o o o o o o o o o o o o o o X # . o o o o o o o . o o o o o o o o o o X # . 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 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 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 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 o o o o o o o o . . o o # X o o o o X 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 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 o o o o o o o o o o o o o o o o o o o o o o X # 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 o X # 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 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 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 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 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 $ 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 o o o o o o O o o o X o o o o o o o o o o o o O o O o o o o o o ",
+"o X O o o o O O X X X O X X X X O X X O o o X o X X X X o X X X O X X o o o O O O X X X X o X X X X X X o o X o X o X o O X X O O O o X X X X O X X X X o o X X X X X X X X X X o X X o O X X X o o X X X X X X o o O X O X o X o o X X o o X X X X o o o o X X ",
+"< < < 1 1 1 < 1 1 1 1 1 1 1 1 1 1 1 < 1 1 1 1 1 1 1 1 1 1 1 1 1 < 1 1 1 1 1 < 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 < 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 < 1 1 1 1 1 1 1 < 1 < 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 , ",
+"#.&.&.%.%.%.&.&.%.%.&.%.&.&.%.%.&.%.&.%.%.%.&.&.%.%.%.&.%.&.%.%.%.&.%.&.%.%.%.&.%.%.%.%.&.&.%.%.%.&.&.%.%.%.&.&.%.%.%.%.%.%.%.%.&.%.%.&.%.%.&.%.&.&.%.%.&.%.&.&.%.%.&.%.&.&.%.&.%.%.&.&.%.%.%.%.&.&.%.&.&.&.&.%.&.%.&.%.%.&.&.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.=.O.",
+"#.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.O.",
+"#.=.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.$.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.$.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.O.",
+"#.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.O.",
+"#.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.O.",
+"#.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.O.",
+"#.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.$.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.O.",
+"#.&.%.%.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.%.&.%.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.O.",
+"$.=.=.&.&.&.&.&.&.%.%.%.%.%.%.%.%.%.&.*.*.*.*.&.&.&.*.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.&.&.*.&.&.*.*.&.&.&.*.*.*.*.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.=.&.=.%.*.&.&.%.%.%.%.%.%.$.%.%.%.%.%.%.%.%.%.%.%.&.&.&.=.=.%.=.=.&.=.&.=.&.=.&.=.=.=.O.",
+"h } } } } } } } } #.%.%.%.%.%.%.%.%.X. .j [ .j } } } O.&.%.%.%.%.%.%.&.%.%.%.%.%.%.%.%.%.+. .j } | } } } } } } } } } } } } | | $.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%... . .j . .h .h +.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.O.} } } } } } } } | } .h . .h .} j ",
+": X X X X X X X X X.&.%.%.%.%.%.%.=.1 X X X X X X X X a *.%.%.%.%.%.%.$.%.%.%.%.%.%.%.%.=. .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 .&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.g X X X X X X X X X o X X X X X X X t ",
+": X o o X o o o O X.&.%.%.%.%.%.%.%.1 X o o o o o o X s *.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.j X X O o o o o o o o o o o o o o X & #.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%., X o o o o o o X } =.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.=.h X o o o o o o o O o X o o o o o X t ",
+": o o o O o o o X X.&.%.%.%.%.%.%.=.p X o o o o o o X s *.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*. .X o o o o o o o o o o o o o o o o & @.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%., X o o o o o X X } &.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.h X X o o o o o o O o O o o o o o X y ",
+": o o o o o o o O X.*.%.%.%.%.%.%.&.p X o o o O o o X s *.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.[ X o o o o o o o o o o o o o o o o & #.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%., X O O o o o o X } =.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.=.h X o o o o o o o o o o o o o o o X y ",
+": X o o o o o O o X.*.%.%.%.%.%.%.=.p X o o o o o o X s *.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.[ X o o O o o o O o o o o o o o o X & #.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%., O o o o o o o X } =.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.f X o o o o o o o o o o o o o o o X y ",
+"* o o o o o o o X X.&.%.%.%.%.%.%.%.1 X o o o o o o X s *.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.h X o o o o O o o o o o o o o o o X & #.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%., X o o o o o o X } &.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.=.h X X o O o o o o o o o o o o o o X 2 ",
+": o o o o o o O o X.&.%.%.%.%.%.%.=.p X o o o o o o X s *.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*. .X o o o o O o o o o o o o O o o o & @.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%., X o o o o o o X .=.%.%.%.%.%.&.$.%.%.%.%.%.%.%.&.&.g X o o o o o o o o o o o o o o o X y ",
+": X o o o O o o o X.&.%.%.%.%.%.%.&.p X o o o o o o X a *.&.&.%.&.&.%.&.%.%.%.%.%.%.%.%.=.} X o o o o o o o o o o o o o o o o & #.&.%.&.%.%.%.%.%.%.%.%.%.%.&.$.%.%., X o o o o o o X } &.&.&.&.%.%.$.&.%.%.%.%.%.%.%.%.=.g X X o o o o o o o o o o o o o o o 2 ",
+": o o o o o o o o o.-.=.=.&.=.=.&.=.1 X . . . o . . . s -.*.&.&.&.&.&.&.=.&.=.=.=.&.&.=.-.} . . . X . . X . . . . . . o . . X % #.=.&.&.=.&.=.=.=.&.=.=.=.&.=.=.*.&.> . X . . X X . . | -.&.&.&.%.=.=.&.=.&.&.=.&.=.=.&.-.g . X X . . . X . X o o o o o o o o y ",
+": X o o o o o o X a .} } } } h } [ l 0 q q q q q q q z } } } } } } } } } } } h h } } } } d 0 q q q q q q q q q q q q q q q q 9 h } .j } h .h } } h } } } .} } } k q q q q q q q 0 b | } } } } } } } h . .h } } } } [ v 0 0 q q q q q q 4 o o o o o o o o 2 ",
+": o o o o o o o o X X o X X X X X . ^ 8.3.3.3.3.2.7.8.c . X X X X X X X X X X X X X X X . 6 3.3.3.3.3.3.3.3.3.7.3.3.3.7.3.3.7.>.O X X X X X X X X X X X X X X X X X ( 8.3.3.2.7.2.2.7.0 X X X X X X X X X X X X X X X o . w 8.3.2.7.2.7.3.8.^ . o o o o o o X 2 ",
+": o o o o o o o o o o o o o o o o . ^ 7.2.1.1.1.1.1.7.c . o o o o o o o o o o o o o O o X 8 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.:.+ o o o o O o o X o o o o o o o o . / 7.1.1.1.1.1.1.7.0 . o o o o O o o O o o o o o o o . x 7.1.1.1.1.1.1.7.~ . o o o o o o o 2 ",
+": o o o o o o o O o o o O o o o o . ^ 7.1.1.1.1.1.1.7.c . X o o o O O o o o o o o o o o . 7 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.:.$ X o o o o o o o o o o o o o o o X / 3.1.1.1.1.1.1.7.q . o o o o o o o X o o o o o o o x 7.1.1.1.1.1.1.7.~ . o o o o o o X 2 ",
+": o o o o o O o o o o o o o o o o . ~ 7.1.1.2.1.1.1.7.c X o o o o o o o o o o o o o o o . 8 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.:.$ o o o o o o o o O o o o o o o o . / 7.1.1.1.1.1.1.2.q . o O o o o o o o o o o o o o o . x 7.1.1.1.1.1.1.7.Y . o o o o o o X 2 ",
+"* o o o o O o o o o o o o o o o o . ^ 7.1.1.1.1.2.1.7.c . o o o o o o o o o o o o o o o . 8 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.:.$ o o o o o o o o o o o o o o o o o / 7.1.1.1.1.1.1.7.q . o o o o o o o o o O o o o o o . x 7.1.1.1.1.1.1.7.~ X o o o o o o X y ",
+"; o o o o o o o o O o o o o o o o . ~ 7.1.1.1.1.1.1.7.c . o o o o o o o o o o o o o o o . 7 3.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.7.:.$ o o o o o o o o o o o o o o o o o / 7.2.1.1.1.2.1.3.q . o o o o o o o o o o o o o o o . x 7.1.1.1.1.1.2.7.~ . o o o o o o o y ",
+"; o o o o o o o o O o o o o o o o . ^ 7.1.1.1.1.1.1.7.c . o o o o o o o o o o o o o o o . 7 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.:.$ X o o o o o o o o o o o o o o o . / 3.1.1.1.1.1.1.3.0 . o o o o o o O o o o o o o o o . x 7.2.1.1.1.1.2.7.~ . o o o o o o o y ",
+": o o o o o o o o o o o o o o o o . ~ 7.1.1.1.1.1.1.7.c . o o o o o o o o o o o o o O o . 7 3.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.2.:.$ o o o o o o o o o o o o o o o o . / 7.1.1.1.1.1.1.3.0 . o o o o o o o o o o o o o o o . x 3.1.1.1.1.1.2.3.~ X o o o o o o X y ",
+": X o o o o o o o X . . . . . . Y 7.1.1.1.1.1.1.7.x . . . . . . . . . . . . . . . 5 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.;.o . . . . . . . . . . . . . . X . . / 3.1.2.1.1.1.1.3.8 . . . . . . X X . . . X . . . w 3.2.1.1.1.2.2.7.~ . o o o o o o o y ",
+": o o o o o o o o 8 x w w w w x x q ;.4.1.1.1.1.1.1.7.U w x w w x w w x x w w w x x w w q L 7.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.,.x w w w x x w w w w w w w w w w w w _ 2.1.1.1.1.1.1.3.P q w w w w w w w w w w w w w w w q ~ 3.1.1.2.1.1.1.7.~ . o o o o o o X y ",
+"; X o o o o o o o ) 8.7.7.7.7.7.7.7.2.1.1.1.1.2.1.1.1.2.7.7.7.7.7.3.3.7.4.7.7.7.7.7.7.7.7.2.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.3.7.7.3.7.7.7.4.7.7.7.7.7.7.7.3.7.7.3.1.1.1.1.1.1.1.1.3.7.7.7.3.7.7.3.3.7.7.3.3.7.7.3.3.3.2.1.1.1.1.1.1.1.7.~ . o o o o o o X y ",
+": o o o o o o o o ( 7.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.2.1.1.1.1.2.2.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.3.1.1.2.2.2.1.1.2.1.1.1.2.2.1.1.2.1.1.1.1.1.1.1.1.7.Y . o o o o o o o 2 ",
+": o o o o o o o o ( 2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.2.1.1.1.2.2.1.1.2.2.1.1.2.2.1.1.2.1.1.1.1.1.1.1.1.7.~ X o o o o o o X 2 ",
+": o o o o o o o o / 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.3.~ . o o o o o o X y ",
+": o o o o o o X o / 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.7.~ . o o o o o o o y ",
+": o o o o o o o o / 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.7.~ . o o o o o o X 2 ",
+"; o o o o o o o o ) 3.1.1.1.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.2.1.1.1.1.2.1.1.1.1.1.1.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.1.1.1.1.1.2.7.~ . o o o o o o X 2 ",
+": o o o o o o o o ( 7.2.2.2.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.2.2.1.2.2.2.2.1.1.2.1.1.1.1.1.1.2.2.1.2.2.1.2.1.2.2.1.2.2.2.2.1.1.2.1.1.1.2.1.2.1.1.1.1.2.1.1.2.2.1.2.2.2.2.2.1.1.2.2.1.1.2.2.1.2.1.1.2.1.1.1.1.2.1.1.2.2.1.2.1.1.2.1.1.2.~ X o o o o o o X 2 ",
+"; o o o o o o X X ) 8.7.7.7.3.3.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.3.7.3.7.7.7.7.3.3.7.3.7.3.3.3.3.3.3.3.7.7.3.7.3.3.7.7.7.3.7.7.3.7.7.7.3.7.7.3.7.3.3.3.3.7.7.7.3.3.7.3.7.3.7.3.3.7.7.7.7.7.3.7.3.7.7.3.7.7.3.7.7.3.7.7.7.8.~ . o o o o o o o 2 ",
+"] ] ] ] ] ] ] ] ` R L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L E ' ] ] ] ] ] ] ` p.",
+"a.a.a.a.a.a.a.a.a.n . . . . . . . . . . . . . . . . . . . . . . . . . . . . X . . . . . . . . . . . . . . . . . . . . . . . X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . X . . . . . . N a.a.a.a.a.a.a.a.a.",
+"a.a.a.a.a.a.a.a.a.m 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 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 o o o o o o o o o X o o o o o o o o o o o o o o o o o o o o o o o X o o o o o o o o o o o o o o o o o o o o o M a.a.a.a.a.a.a.a.a.",
+"a.a.a.a.a.a.a.a.a.m 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 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 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 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 o M a.a.a.a.a.a.a.a.a.",
+"a.a.a.a.a.a.a.a.a.m 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 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 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 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 o o o X M a.a.a.a.a.a.a.a.a.",
+"a.a.a.a.a.a.a.a.a.m 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 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 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 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 o o o M a.a.a.a.a.a.a.a.a.",
+"a.a.a.a.a.a.a.a.a.m 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 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 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 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 o M a.a.a.a.a.a.a.a.a.",
+"a.a.a.a.a.a.a.a.a.m 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 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 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 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 X M a.a.a.a.a.a.a.a.a.",
+"a.a.a.a.a.a.a.a.a.m 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 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 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 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 O o o M a.a.a.a.a.a.a.a.a.",
+"a.a.a.a.a.a.a.a.a.m 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 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 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 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 o M a.a.a.a.a.a.a.a.a."
+};
diff --git a/textures/exit.xpm b/textures/exit.xpm
new file mode 100644
index 0000000..791262c
--- /dev/null
+++ b/textures/exit.xpm
@@ -0,0 +1,266 @@
+/* XPM */
+static char *result[] = {
+/* columns rows colors chars-per-pixel */
+"128 128 132 2 ",
+" c #EF3A0D",
+". c #EF3B11",
+"X c #F03B25",
+"o c #EF4113",
+"O c #EF4A1A",
+"+ c #F04616",
+"@ c #F04B16",
+"# c #F0471F",
+"$ c #F04C1D",
+"% c #F1531E",
+"& c #F25A1C",
+"* c #F04625",
+"= c #F04C25",
+"- c #F0452C",
+"; c #F04D2A",
+": c #F05325",
+"> c #F15927",
+", c #F0552C",
+"< c #F15A2C",
+"1 c #F24333",
+"2 c #F14E32",
+"3 c #F14B39",
+"4 c #F15631",
+"5 c #F15A34",
+"6 c #F1533B",
+"7 c #F15E3B",
+"8 c #F2612E",
+"9 c #F26332",
+"0 c #F26836",
+"q c #F1603E",
+"w c #F2693D",
+"e c #F25642",
+"r c #F25C42",
+"t c #F35B4D",
+"y c #F16241",
+"u c #F26A44",
+"i c #F2654A",
+"p c #F26C4B",
+"a c #F27247",
+"s c #F3724D",
+"d c #F47A4D",
+"f c #F36550",
+"g c #F36E52",
+"h c #F46A5B",
+"j c #F37453",
+"k c #F37A55",
+"l c #F3765A",
+"z c #F37A5C",
+"x c #F47363",
+"c c #F47D63",
+"v c #F4746C",
+"b c #F57C6D",
+"n c #F67C71",
+"m c #F48057",
+"M c #F4825D",
+"N c #F48364",
+"B c #F58966",
+"V c #F4856A",
+"C c #F58A6C",
+"Z c #F6916E",
+"A c #F58673",
+"S c #F58D74",
+"D c #F6817B",
+"F c #F58D7A",
+"G c #F59274",
+"H c #F69977",
+"J c #F5937C",
+"K c #F6997C",
+"L c #F78F82",
+"P c #F78D88",
+"I c #F69582",
+"U c #F69A84",
+"Y c #F6948A",
+"T c #F69C8A",
+"R c #F89D8D",
+"E c #F79492",
+"W c #F79E93",
+"Q c #F89997",
+"! c #F79F9B",
+"~ c #F89E9A",
+"^ c #F7A086",
+"/ c #F8A082",
+"( c #F7A28D",
+") c #F8A28F",
+"_ c #F7A591",
+"` c #F8A294",
+"' c #F7A994",
+"] c #F8AB95",
+"[ c #F7A599",
+"{ c #F9A39E",
+"} c #F7AB9C",
+"| c #F8AD9C",
+" . c #F7B19F",
+".. c #F8B29D",
+"X. c #F9A5A0",
+"o. c #F7AEA2",
+"O. c #F8ACA3",
+"+. c #F9ACAA",
+"@. c #F7B1A3",
+"#. c #F8B4A4",
+"$. c #F9B9A5",
+"%. c #F7B4AA",
+"&. c #F8B5AA",
+"*. c #F9BBAD",
+"=. c #F9BDB3",
+"-. c #F9BEB9",
+";. c #F9C1AE",
+":. c #F9C2B4",
+">. c #FAC8B3",
+",. c #F9C4BB",
+"<. c #FAC9BD",
+"1. c #FAC6C1",
+"2. c #FACCC3",
+"3. c #FACEC9",
+"4. c #FBD1C6",
+"5. c #FBD3CC",
+"6. c #FCD9CE",
+"7. c #FBD6D1",
+"8. c #FBDAD4",
+"9. c #FCDEDA",
+"0. c #FDE2D6",
+"q. c #FCE2DD",
+"w. c #FDE8DF",
+"e. c #FCE6E2",
+"r. c #FDE9E4",
+"t. c #FDECEA",
+"y. c #FEF0EC",
+"u. c #FDEFF1",
+"i. c #FEF4F4",
+"p. c #FEF8F6",
+"a. c #FEF7F8",
+"s. c #FFFEFE",
+/* pixels */
+"q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q q 7 q 7 y q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q q 7 q 7 y q q q q q q q q q q q 7 7 y q y q q ",
+"q q q q q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y 7 7 y q y y 7 y q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y q q q q q q q q q y 7 7 y q y q q q 7 y 7 ",
+"q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y 7 q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q q q q q q q q q q y q q q q q q q q ",
+"q q q q q q q q q q q q q q q q q q q q q 7 q q q q q q 7 q q q q q q q q q q q q q q y y 7 q y 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y 7 q 7 7 y 7 y 7 q y 7 ",
+"q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 y q q q 7 q q q q q q y y q q q q q 7 5 5 q q q q q 5 7 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 y q q q q q q q y 7 y q ",
+"q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y 7 q q 7 q q y q q q q q q , = ; q q q q a k m 8 7 q q 5 u y 0 q q q q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q y 7 q q q q q q 7 q ",
+"q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q q q q q q y q y y 7 y 7 q q q q q y J @.=.a 5 q 5 2.t.t.o.4 q 7 0 r.9.9.l 7 q q q 7 7 4 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q q q q q y 7 y q q q q q q q y q ",
+"q y q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q 7 q q q q q q q q q 8 8.5.>.l 5 y > ;.8.8.' 5 q 5 j i.7.8.u 7 q 5 ,.4.< G i q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q ",
+"q q q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y 7 q 7 y 7 y 7 q q q q y = :.u.4.d 5 y : ;.1.7.' 4 q 5 S i.<.#.y q q 7 9.s.[ r.l 7 7 7 7 5 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q y 7 q q q q q q q q ",
+"7 y q y q 7 q q q q q q q q q q q q q 7 q q q q q q q q q q q q q q q q q q q q 7 7 u 7 7 y 7 y q q q q y : $.<.= 5 y 7 , U S p ..7 q 5 V 6.5.2.u q 5 V q.1.i.7.q q 7 7 S =.I y 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q y q q q q q q q q q y 7 ",
+"7 q q 7 q q q y q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 j ,.p 7 7 y 7 q q q q 7 7 z S q y 7 7 y 7 q 5 5 q q q q < < 4 q q 5 V *.l y.,.5 q 5 C t.3.t.' 4 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y q q q q q 7 q q q ",
+"y q q y y 7 q 7 q q q q q q q q q q q q q q q q q q 7 r q q q q q q q q 7 7 q q q y q.T ; u 7 q q q q 7 y 7 5 < 7 7 y y y 7 y y y q y q y y q q q q q q 5 < S V q 7 7 %.5.o w V 7 y q q 5 q y q q q q q q q q q q q q q q q q q q q q q q 7 7 q q q q q y q y 7 ",
+"q q q 7 y q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 5 7 y q 4 ( r.1.9.l 6 q q q q q q y y 7 q 5 < , ; ; = * ; * , : > 4 7 7 q q q q q 5 5 7 y 7 J t.:.U 7 q q 7 +.G : < q q q q q q q q q q q q q q q q q q q q q y q q q q y q q q y q q ",
+"y 7 q q 7 q q y q q q q y 7 q q q q q q q q q q q q q q q q q q q q 7 s 0.@.7 5 q 7 g 8.*.c y 7 q q y q q 4 ; < < 6 s J / ( ' } } } } ' ( U G s 6 8 < ; 5 q q q y 7 7 7 A =.^ 7 q 4 M i.C u K y 7 q q q q q q q q q q q q q q q q q q q 7 q 7 y q 7 q y q 7 7 q ",
+"q y q y y 7 y 7 q q q q q q q q q q q q q q q q q q q q q q q q q q 5 u t.t.3.a 5 y q y 5 5 q y y 5 4 , 4 B ( ,.e.a.a.s.a.s.s.s.s.s.s.s.s.s.s.a.i.e.,.R B 4 4 , 7 q y 7 5 5 7 7 7 5 2.t.9.q.,.7 q q q q q q q q q 7 q q q q q q q q q q q q q y 7 y q 7 q q y q ",
+"q 7 q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q 5 q q q 0 q.u.q.,.7 7 y 7 q q 7 4 , s I 2.u.a.a.s.a.a.s.s.a.a.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.t.1.I s , 5 7 7 7 7 y 7 q <.y ' p.l 5 q q q q q q q q q q q q q q q q q q q q y 7 q 7 q q q y 7 y 7 q ",
+"q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 5 z c 5 7 7 q q.@.= 4 q 7 y q 5 7 j _ 6.p.s.s.s.s.s.s.s.s.a.i.t.q.8.4.3.4.5.8.q.t.i.a.s.s.s.s.s.s.s.s.p.6.` j 5 5 q q q 7 < 4 =.*.< q q q q q q q q q q q q q q q q q q q q q y 7 y 7 y 7 y 7 y 7 y 7 ",
+"q q 7 q q q q q q q q q q q q q q q q q q q q q q q q 7 q < H e.u 5 7 y G p 7 q 7 q 5 7 J 1.i.s.s.s.s.s.s.a.r.,._ H j 4 < < < 4 5 5 < < < < 5 s J _ ,.r.a.s.s.s.s.s.s.i.1.J q 4 7 q q q u u 7 q q q q q q q q q q q q q q q q q q q q q 7 y 7 y 7 y 7 y 7 y 7 y ",
+"q q q q q q q q q q q q q q q q 7 q q q q q q q q q q q o.7.o.t.2.7 7 7 < 7 q q , w I 7.s.s.s.s.s.s.t.,.( j 9 4 ; < 5 q q 7 q q 7 7 q q q q q 5 > ; 5 5 j ( ,.y.s.s.s.s.s.s.7.U 0 4 q q 5 7 q q q q q q q y 5 7 q q q q q q q q q y 7 y y 7 y 7 y 7 y 7 y 7 y 7 ",
+"q q q q q q q q q q q q q q q q r q q q q q q q q q q 5 T s.8.8.a.N 5 y y q 5 4 S 8.s.a.s.s.s.i.<.J w 4 > 5 7 7 y q q 5 5 8 < 4 q q q q q q q y y y y 5 5 > < w K ,.p.s.s.s.s.s.7.S 5 5 r q q q q q q q q 7 S p 5 q q q q q q q q 7 q q 7 y 7 y 7 y 7 y 7 y 7 y ",
+"q q q q q q q q q q q q q q q q q q q q q q q q 5 q q q > *.8.s a 7 7 y 7 , k 3.a.a.s.s.s.q.} l < 4 7 q y y 7 y q q 4 s :.r.9.S , 7 w 5 4 < < 4 q q q q 7 y q 7 > 5 k o.q.s.s.s.s.s.3.s , q q q q q q q 7 5 ,.9.p 5 q q q q q q q 7 y 7 y 7 y 7 q q q q y y 7 y ",
+"q q q q q q q q q q q q q q q q q q q q q q r 5 p 5 q q 5 i %.g 4 q y 5 9 ' i.s.s.s.s.9.^ i 5 5 y q q q 7 y y 7 q 5 V t.s.s.s.s.@.r ; l :.e.4.C , q q q y q q q r q 5 5 i ( 9.s.s.s.s.i.' 8 5 q q q q q q , o.a.q.p 7 q q q q q 7 y 7 y 7 y 7 y q q q q 7 7 y 7 ",
+"q q q q q q q q q q q q q q q q q q q q q q q 5 2.} - q y 7 5 7 q q , g 6.s.s.s.s.e.U y 5 7 7 y q q q q y 7 y y , z i.s.s.s.s.s.s.t.5.i.s.s.s.s.' - q q 7 y q q q q q q 5 5 y T e.s.s.s.s.7.j , q q q q 5 _ t.A I u 7 q q q q q y 7 y 7 y 7 y 7 q q q q q y 7 y ",
+"q q q q q q q q q q q q q q q q q q q q q q q 5 j r.! 4 7 7 y 7 q < Z i.s.s.s.p.` 7 5 7 7 y y 7 q q q q 7 y 7 , x i.s.s.s.6.:.s.s.s.s.s.s.s.s.s.s.{ ; 7 y 7 q q q q q q q 7 7 5 7 ` a.s.s.s.y.G 4 7 q 7 7 ' Z 4 5 q q q q q q q 7 y 7 y 7 y 7 y q q q y 7 7 y 7 ",
+"q q q q q q q q q q q q q q q q q q q q 7 7 y 7 4 j t.N 5 q q 5 5 $.s.s.s.s.8.k * 7 q q q q q q q q q q q 7 5 G 9.y.s.s.,.C A D a.s.s.s.s.7.{ ' %.e.@.4 7 y 7 q q q q q q q q q 7 * l 8.s.s.s.s.@.7 5 y q 4 5 q q q 7 5 5 7 q q q q q q q q q q q q q q q q q q ",
+"q q q q 7 q q q q q q q q q q q q q q 7 y i 5 7 y 5 w q q q 4 g 3.s.s.s.s.@.5 5 y q q q q q q q q q q q 7 4 J 8.q.} a.5.{ a.s.P -.s.s.s.3.I 3.q.,.} -.} y 7 q q q q q q q q q q q q 5 9 .s.s.s.s.2.p 4 q q q q q 4 7 N T j 7 q q q q q q q q q q q q q q q q q ",
+"q q q q q q q q q q q q q q q q q q 7 i 2.<.l 5 q q q q y < l q.s.s.s.t.S , 7 y q q q q q q q q q q q 7 q ' i.s.s.' 5.X.t.s.s.,.D s.s.t.S e.s.s.s.s.9.,.T r 7 q q q q q q q q q q q q 7 , G t.s.s.s.q.l 4 y q q 7 ( 9.t.s.T 4 q q q q q q q q q q q q q q q q q ",
+"q q q q q q q q q q q q q q q q q q 5 *.8.7.t.S 5 q q q , z t.s.s.s.8.j , q 7 7 q q q q q w q q q q 7 y -.s.s.s.s.e.%.r.s.i.s.y.l 9.r.} *.s.s.s.s.s.s.a.7.J 5 7 q q 7 7 r q q q q q q q q , j 8.s.s.s.t.z , y q 5 ( 7.i.9.y 7 q q q q q q q q q q q q q q q q q ",
+"q q q q q q q q q q q q q q q q q q 5 5.%.+.a.@.5 q 7 , k t.s.s.s.<.u < q q q q q q q q 7 > q g q 7 7 ,.s.s.s.s.s.s.s.s.s.r.t.s.{ n ( U a.s.s.s.s.s.s.s.s.t.J < q 7 c g 5 7 q q q q q q q q 5 u 2.s.s.s.r.z 4 q q , u i.' : q q q q q q q q q q q q q q q q q q ",
+"7 q q q q q q q q q q q q q q q q q 7 U t.e.8.p 7 q 5 l t.s.s.s.*.7 5 y q q q q q q q 5 q ' U y 7 , =.s.s.s.s.s.s.s.s.s.s.a.3.r.s.7.4.i.s.s.s.s.s.s.s.s.s.s.a.( : 7 l T l w 5 y q q q q q q y 5 q *.s.s.s.r.k 4 q q u *.p 7 q q y q q q q q q q q q q q q q q q ",
+"q q q q q q q q q q q q q q q q q q q 7 c J p 7 7 7 g q.s.s.s.*.5 7 q q q q q q r q 5 S U ` i 7 - &.s.s.s.s.s.s.s.s.s.s.s.s.i.%.8.r.i.s.s.s.s.s.s.s.s.s.s.s.s.s.} - 7 8 } ;.u > q r q q q q q q 7 5 *.s.s.s.q.p 5 q q 7 q y 7 : * 4 q q q q q q q q q q q q q q ",
+"q q q q q q q q q q q q q q q 5 , 7 q 7 5 5 7 q 7 7 4.s.s.s.*.5 7 q q q q q q q 7 5 c ;.j < 7 - +.s.s.s.s.s.s.s.s.s.s.s.s.s.s.i.z V s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.! - q q q . .> 5 y q q q q q q 7 5 *.s.s.s.4.7 7 q q q q 7 .7.S , q q q q q q q q q q q q q ",
+"q q q q q 7 y 7 y q q q 7 q 5 j ..y 8 q q q 7 y 5 *.s.s.s.,.5 7 q q q q q q q 5 u 2.C O 7 q 4 #.s.s.s.s.s.s.s.a.p.s.s.s.s.s.s.-.J D 1.s.s.s.s.s.s.i.a.s.s.s.s.s.s.s.} , 7 7 5 j ^ z 4 q q q q q q q 7 5 <.s.s.s.*.5 q q q 4 ;.7.A u.l 5 7 y 7 y 7 y q q q q q q ",
+"q q q q q q q q 7 q y 7 y q 7 p 3.e.I y q q y ; U s.s.s.8.u 7 q q q q q q q 5 I J u < q 7 q =.s.s.s.s.s.s.s.s.s.q.t.s.s.s.s.*.F i.t.A ,.s.s.s.s.r.r.s.s.s.s.s.s.s.s.s.#.7 7 q 4 b $.u 5 q q q q q q q 5 u 8.s.s.s.K ; q q < 5.@.. %.' , y 7 y 7 y 7 q q q q q q ",
+"q q q q 7 y 7 q y 7 y q q q 7 7 > ^ q.l 5 y 5 k i.s.s.t.s 4 y q q q q q q q j ;.s 4 q 7 y ,.s.s.s.s.s.s.s.s.s.s.a.4.e.s.s.$.S i.s.s.t.A :.s.s.8.7.s.s.s.s.s.s.s.s.s.s.s.$.r 7 7 4 , :.( , q q q q q q q 4 s r.s.s.i.k 5 q 9 S t.J u q q 7 y 7 y 7 q q q q q q q ",
+"q q q q q q y q q q q q q y y 7 q 5 i 7 q 5 5 9.s.s.a.S , q q q q q q q < @.@., 5 y 7 y ,.s.s.s.s.s.s.s.s.s.s.s.s.a.,.8.#.N t.s.s.s.s.r.N :.7.,.a.s.s.s.s.s.s.s.s.s.s.s.s.*.7 7 q 7 i K T y q q q q q q q 4 S a.s.s.9.5 7 q 4 C N 5 q q y 7 y 7 y q q q q q q q ",
+"q q q q q q 7 y q q q q 7 = : y y q 7 q 7 , .s.s.s.} < y q q q q q q 7 S T g 7 7 7 7 ,.s.s.s.s.s.s.s.s.s.s.s.s.s.s.a.C j t.s.s.s.s.s.s.r.y J s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.*.7 0 r 7 q 1.J = q q q q q q q , .s.s.s. ., q q 4 5 y q 5 5 7 y y q q q q q q q q ",
+"q q q q q q q q q q q 7 p :.( = , y q q 5 z a.s.s.5.8 7 q q q q q q : I 2.5 5 q 7 4 =.s.s.s.s.s.s.s.a.i.s.s.s.s.s.s._ k { 2.s.s.s.s.s.s.:.( j $.s.s.s.s.s.s.i.a.s.s.s.s.s.s.s.&., 7 q 7 0 T _ 5 q q q q q q 7 9 7.s.s.a.z 5 q q q q 5 m N 5 7 7 q q q q q q q q ",
+"q q q q q q q y q q 7 , @.e.u.2.( , y q 5 5.s.s.p.s 5 q q q q q q 7 F U y q q q - &.s.s.s.s.s.s.s.s.s.e.e.s.s.s.s.K w e.a.Y *.s.s.s.s.] U a.8.w ' s.s.s.s.e.t.s.s.s.s.s.s.s.s.s.} * q q 5 p =.a 5 q q q q q y 5 s a.s.s.5.4 7 q q , @.r.t.@.8 y q q q q q q q q ",
+"q q q q 7 y q 7 q q 7 j t.e.q.H s 5 y , K s.s.s.U ; q q q q q q 7 q ,.a 5 q q - +.s.s.s.s.s.s.s.s.s.s.s.5.9.s.s.C & q.s.s.u.b X.s.s.Q n a.s.s.5.% ^ s.s.7.8.s.s.s.s.s.s.s.s.s.s.s.{ - q q 7 , *.z 7 q q q q q q ; U s.s.s.H 4 y 7 w a.p z r.z 5 q q q q q q q q ",
+"q q q q q q q q q q 7 y B 5.w.B 4 y 7 y q.a.s.9., q 7 y y 7 7 q u _ < 5 y 7 4 &.s.s.s.s.s.s.s.s.s.s.s.s.s.,.5.J > 0.s.s.s.s.t.h X.W v i.s.s.s.s.4.O ^ 7.3.s.s.s.s.s.s.s.s.s.s.s.s.s.o., 7 y 4 x T 5 q q q q q q 7 4 8.s.s.q.y 7 q 8 8._ ( r.l 5 q q q q q q q q ",
+"q q q q q q q q q q q q 4 : Z C 5 q 4 _ s.s.s.J 4 y y 7 7 y 7 , S ' 4 7 7 q =.s.s.s.s.s.s.s.s.s.s.s.s.s.s.i.l = q.s.s.s.s.s.s.w., y i.s.s.s.s.s.s.5.# V s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.#.7 7 q , V ., y q q q q q 4 J s.s.s.T 5 q 5 M 9.8.S 5 q q q q q q q q q ",
+"q q q q q q y q q q y y y q 5 7 y 7 p 9.s.s.8.7 7 7 7 y y y 5 J V ; y 7 7 ,.s.s.s.s.s.s.s.a.i.s.s.s.s.s.a.I g I ,.s.s.s.s.s.a.U N l ' s.s.s.s.s.s.-.T i [ s.s.s.s.s.s.i.s.s.s.s.s.s.s.s.&.5 7 q 6 o.y 7 q q q q q q q 8.s.s.9.u 7 q 5 , 4 5 q q q q q q q q q q ",
+"q q q q q q 7 y q 7 : : , q q 7 y 4 T s.s.s.I 5 y 7 y 7 7 q : :.l 7 7 7 ,.s.s.s.s.s.s.s.s.s.e.r.s.s.s.a.T i q.a.A &.s.s.s.a.K s t.q.u _ s.s.s.s.[ T s.4.7 ' s.s.s.s.e.t.s.s.s.s.s.s.s.s.s.o.7 7 q 4 <.u 7 q q q q q 4 I s.s.s.T 4 q q q q q q 7 q q q q q q q q ",
+"q q q q y 7 y 7 q 7 ' :.F 7 q q q q 5.s.a.q.y 7 y 7 y 7 y 5 K z 4 7 7 ,.s.s.s.s.s.s.s.s.s.s.s.5.7.s.s.U y 9.s.s.i.b } s.a.H j r.s.s.8.w ` s.s.( K i.s.s.3.r ( s.s.4.8.s.s.s.s.s.s.s.s.s.s.s. .5 7 5 T V 5 q q q q q 7 y q.s.s.5.q 7 y q 7 , 5 w 5 q q q q q q q ",
+"q q q q 7 y 7 y 5 [ r.*.t.V 5 q 5 N s.s.s.[ 5 y 7 y 7 y q 8 1.g 7 4 =.s.s.s.s.s.s.s.s.s.s.s.s.s.<.<.I y 8.s.s.s.s.i.v ' K a e.s.s.s.s.q.u ( R Z p.s.s.s.s.4.5 ` ,.2.s.s.s.s.s.s.s.s.s.s.s.s.s.| 4 7 q *.k 5 q q q q y 4 [ s.s.a.N 5 q 7 j J @.u.I 5 q q q q q q ",
+"q q q q y 7 y 7 5 5.[ . 9._ 5 y 4 @.s.s.t.s 7 7 y 7 y 7 5 J z 7 2 $.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.u 4 9.s.s.s.s.s.s.t.5 5 e.s.s.s.s.s.s.8.% u p.s.s.s.s.s.s.4., j s.s.s.s.s.s.s.s.s.s.s.s.s.s.s._ : 5 T H , q q q q q 5 s t.s.s.@.4 y 4 F 9.7.8.8.5 7 q q q q q ",
+"q q q q 7 y 7 7 5 } q.%.e.z 5 7 w q.s.a.=.5 7 y 7 y 7 7 u 5.u - +.s.s.s.s.s.s.s.s.y.s.s.s.s.s.a.V : J X.s.s.s.s.s.i.B w g I s.s.s.s.s.p.C j 0 J s.s.s.s.s.s.~ G > G s.s.s.s.s.s.y.s.s.s.s.s.s.s.s.( ; 7 ( s 7 q q q q q 4 :.s.s.q.7 7 5 c e.t.-.-.7 q q q q q q ",
+"q q q q q q q q q 5 F ' M 5 y 5 k a.s.a.S < 7 y q q q 7 z j ; %.s.s.s.s.s.s.s.s.s.r.9.s.s.s.a.S $ 5.s.P ` s.s.s.i.d 9 q.u.i G s.s.s.a.x s i.7.5 S s.s.s.s.P E s.<.@ J s.s.s.s.9.t.s.s.s.s.s.s.s.s.s.' @ ' ( ; y q q q y < S s.s.s.k 5 y 5 / ;.i ; q q q q q q q ",
+"q q q q q 7 q q y q 4 ; 5 y y ; @.a.s.e.y q 7 y q y 7 p 5.g *.s.s.s.s.s.s.s.s.s.s.s.8.7.s.a.I 5 5.s.s.a.F _ s.a.M 0 9.s.s.t.i C s.i.x h i.s.s.8., G a.s.I Y s.s.s.2.< _ s.s.4.q.s.s.s.s.s.s.s.s.s.s.s.} > S u q y q q q q y e.s.s. .= y q 5 , 7 y q 7 q q q q q ",
+"q q q q q q q 7 5 5 5 5 5 4 4 O 6.s.s.*.$ 5 5 5 4 5 , 7 L ,.a.s.s.s.s.s.s.s.s.s.s.s.s.5.1.I y 9.s.s.s.s.i.A T B 8 9.s.s.s.s.r.u C x h y.s.s.s.s.5.% C K I s.s.s.s.s.2.5 ( 1.7.s.s.s.s.s.s.s.s.s.s.s.a.s.} -.S : 4 4 4 4 4 O *.s.s.5.# 4 4 4 5 5 4 5 q q q q q q ",
+"q q q q q q y 5 V J J J J J F T a.s.s.%.S F J J J J J S =.a.a.s.s.s.s.s.s.s.s.s.s.s.s.s.%.F 9.s.s.s.s.s.s.t.U C q.s.s.s.s.s.s.9.A S t.s.s.s.s.s.s.5.V T i.s.s.s.s.s.s.4.F -.s.s.s.s.s.s.s.s.s.s.s.s.a.a.s.2._ S J J J I K S %.s.s.a.T J J J J I J V 7 q q q q q ",
+"y 7 y 7 q q , *.a.s.s.a.s.a.s.a.s.s.s.a.s.a.a.a.s.a.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.a.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.a.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.a.s.s.a.s.s.s.a.s.s.s.s.a.a.a.a.a.a.a.a.*.: q q q q ",
+"q q q q q y < r.s.s.s.s.s.s.s.s.s.s.s.s.a.a.s.a.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.a.a.a.a.s.s.a.a.r.> q q q q ",
+"q 7 y q 7 y < w.s.s.s.s.s.a.s.s.s.s.s.s.s.s.s.s.s.a.s.s.s.a.s.s.s.a.s.p.s.s.s.a.s.s.a.s.s.s.s.s.s.a.s.s.a.s.s.a.s.a.s.s.s.a.s.s.s.s.a.s.s.s.a.s.s.a.s.a.s.s.s.a.s.p.s.s.s.a.s.a.s.s.a.s.s.s.a.s.s.s.s.a.s.a.s.a.s.a.a.s.s.a.a.s.s.s.s.s.a.a.a.a.a.s.w.< q q q q ",
+"q y 7 q q w > r.s.s.:.z V N S i.s.s.` c N V V V V V N V V V V V V V V V V V V V V V V V V N V V V V V V V V V V V V N V V V V V N V V V N V V V V V V V V V V V V V V V V V V V V V V V V V V V N V V V V V V V V V V V V V N ` s.s.u.S C C M ,.s.s.w.< q q q q ",
+"q y q q q q 8 w.s.s...O 5 , p a.s.s.g ; 5 7 5 5 5 5 4 ; , 4 4 , , 4 5 5 5 5 4 , , 5 5 , ; , , , , , , , , 4 5 5 7 5 5 7 4 5 5 5 5 5 5 5 5 4 , , 4 4 , , , 4 7 4 5 5 5 4 , , 4 4 4 , 4 4 5 5 5 5 5 5 , , 4 4 4 , 4 5 5 5 5 5 , j s.s.s.u 4 5 O ..s.s.w.> q q q q ",
+"q 7 y 7 q y > r.s.s...: y 4 l s.s.i.a 5 q q 7 y 7 7 l } 5.q.9.7.#.c 5 7 q 7 p ( V 4 A 5.4.5.4.4.4.4.4.4.5.} 7 q 7 7 g ,.q 7 y q r q y r 5 g _ 5.q.q.8.#.c 7 7 r q r 7 y J ,.8.q.8.<.I i 5 q y q 7 7 V :.9.9.9.*.V 7 q q q q 5 d p.s.s.j 5 q > ..s.s.w.< q q q q ",
+"7 q q q q q 8 r.s.s...: r 5 G s.a.q.w 7 q q 7 7 5 ' u.s.s.s.s.s.s.a.=.y 5 5 $.s.p.; I s.s.s.s.s.s.s.s.s.s.2.7 7 q 5 ` s.U 4 q y q q q 5 I e.s.s.s.s.s.s.p.%.y 7 y 5 z 7.s.s.s.s.s.s.s.9.A 5 r q 5 I p.s.s.s.s.s.p.( 5 q q q q q q.s.s.G 4 q : ..s.s.e.> q q q q ",
+"y q y 7 7 w > w.s.s...% y < } s.s.5.= y q q q , } s.s.s.s.s.s.s.s.s.s.2.q 4 ' a.s.1 I s.s.s.s.s.s.s.s.s.s.2.7 q 7 u q.s.9.0 7 7 q q 5 J a.s.s.s.s.s.s.s.s.s.&.q 4 l e.s.s.s.s.s.s.s.s.s.i.S 5 5 p i.s.s.s.s.s.s.s.U 5 q q q r * 5.s.s.} 4 y % ..s.s.w.< q q q q ",
+"q q q 7 y y > r.s.s...> y : *.s.s.2.= y 7 y < N s.s.s.s.3._ T ,.i.s.s.s.@.4 5 ,.9., z ' ` T e.s.s.a.@.) ' S 7 7 4 J s.s.s.J 4 y q 7 j t.s.s.s.7.` T :.p.s.y.` q , 5.s.s.s.r.%.I } q.s.s.s.r.j , K s.s.s.*.l T q.' , r q q q y * 2.s.s.*.: y : ..s.s.w.< q q q q ",
+"7 q q y q y > r.s.s...% y % :.s.s.:.: 7 y 7 , 4.s.s.s.} 5 4 5 , F a.s.s.t.a < I l 5 7 5 5 = 5.s.s.i.u , 4 7 y 7 2 9.s.s.s.7.9 q q 5 ` s.s.s.1.w 4 5 > U 2.c 5 5 V s.s.s.q.s 4 5 4 y 5.s.s.s.[ O U s.s.s.' O O u 7 q q q q y y : >.s.s.>.% y > ..s.s.w.> r q q q ",
+"y 7 y 7 q y < w.s.s. .: y : <.s.s.*.: y 7 7 7 s.s.s.e.8 5 y y 7 , =.s.s.s.U 5 7 7 y 7 y y : 5.s.s.a.a 5 r q y 4 b s.s.s.s.s.S 4 7 7 5.s.s.a.c 4 q q q q y 5 q = *.s.s.s.J : q q q 5 N a.s.s.5.5 m s.s.s.s.9.o.a : 5 q q q q y : :.s.s.<.: y % .s.s.w.< q q q q ",
+"q q q q q q > r.s.s. .: y : <.s.s.:.: 7 y 7 a s.s.s.:.< 7 7 7 y 5 U s.s.s.} 4 q 7 7 y 7 y ; 5.s.s.i.a 5 7 q q ; 5.s.s.s.s.s.2.7 7 y e.s.s.e.p 7 q q q q q q y X 3.s.s.p.l 8 r q q q p r.s.s.r.i : ,.s.s.s.s.s.s.,.e 5 q q q y % *.s.s.<.: y : .s.s.q.< q q q q ",
+"7 q 7 q 7 y 8 w.s.s...: y : <.s.s.;.: y y 5 a s.s.s.*.< q q y 7 5 J s.s.s.o.4 y q q q q q , 5.s.s.i.a 5 q y 4 V s.s.i.=.s.s.a.V 5 y e.s.s.e.i 7 q q 7 y 7 7 y X 3.s.s.i.k 4 q q q q i e.s.s.r.u 7 3 *.a.s.s.s.s.s.9.7 7 7 r y : *.s.s.,.: y : ..s.s.w.> q q q q ",
+"y q y q 7 w > w.s.s...% y : <.s.s.*.: q r 5 u s.s.s.8., q q y y , @.s.s.s.( 4 7 q q q q y : 5.s.s.p.a 5 q q , 5.s.s.=.7 t.s.s.2.7 q 7.s.s.p.k 5 r q 7 7 y 7 7 = ,.s.s.s.B 4 y q q 5 l i.s.s.9.y q 5 : s ..q.s.s.s.s.( , y q y : :.s.s.<.: y : .s.s.w.< q q q q ",
+"q q 7 y y y 8 w.s.s...: y : >.s.s.:.: y q q 7 9.s.s.a.T 4 5 5 < d i.s.s.i.j 7 7 q q q q y : 5.s.s.i.a 4 q 4 N s.s.s.Y g 2.s.s.a.z , @.s.s.s.=.5 5 5 < l 3.U 7 < Z s.s.s.5.u 4 5 5 < :.s.s.s.@.5 5 y S , O , T a.s.s.%.* y q y : >.s.s.>.: u > ..s.s.w.> 7 q q q ",
+"y 7 q q 7 y > r.s.s...: y : =.s.s.<.= y q q ; I s.s.s.p.@.z k U e.s.s.s.=.8 7 y q q q 7 y , 5.s.s.a.d 5 q 4 2.s.s.s.i.y.i.s.s.s.;.= z i.s.s.s.,.M k J 9.a.s.1.p < q.s.s.s.7.S k N <.s.s.s.i.l 4 l 5.a.} l s I s.s.s.%.* q q y = 2.s.s.=.% y % ..s.s.w.< r q q q ",
+"q 7 y q q q < w.s.s. .> y , #.s.s.5.* q q q q , ,.s.s.s.s.s.a.s.s.s.s.q.s 5 y 7 q q q q y , 4.s.s.a.a 5 5 N a.s.s.s.s.s.s.s.s.s.p.w , [ s.s.s.s.s.a.s.a.s.s.9.g , N p.s.s.s.s.i.s.s.s.s.s.` , j t.s.s.s.u.t.a.s.s.s.K > w q y * 4.s.s.#., y : ..s.s.w.< q q q q ",
+"q q 7 q q y < w.s.s...: y 5 K s.s.0.8 q q q q 7 9 ,.s.s.s.s.s.s.s.s.7.z 5 q 7 y q q q q y : 5.s.s.a.a 7 5 2.s.s.i.8.8.8.7.q.s.s.s.#.: 7 @.a.s.s.s.s.s.a.s.9.z 5 q 4 J y.s.s.s.s.s.s.s.p.' 5 7 5 @.a.s.s.s.s.s.s.s.4.5 7 q q q 5 9.s.s.K 4 y % ..s.s.w.> y q q q ",
+"q q y q q q > r.s.s...% y 4 z s.s.y.p 5 q q q q 7 7 J 3.t.a.a.t.5.W u 5 y r 7 y q y q 7 y , ,.t.r.w.a , l e.r.t._ 4 q 7 7 q 5.t.r.q.p 5 5 V 1.e.a.a.u.q.+.g 5 y r q 5 z %.q.i.s.p.e.*.x 6 7 7 7 5 A ,.t.a.s.a.e.%.y 7 r q q 5 a y.s.s.l 4 y : ..s.s.w.< q q q q ",
+"7 y 7 q q w < e.s.s...% 7 4 j a.s.a.j 5 7 7 7 7 q q 5 5 i c M s 7 5 5 r 7 7 7 7 7 7 7 7 7 q u i i i r 7 u i i u 7 7 7 7 q 5 y i p p y q q 5 6 u c M j 7 5 4 q q 7 7 q 5 5 q j c z y 5 5 q q q q 7 5 7 y c c z u 5 5 q 5 q q 5 j s.s.s.s 4 r % .s.s.w.< q q q q ",
+"y q q q 7 y < w.s.s.&., 9 8 s i.s.s.b 4 9 8 9 9 9 9 9 8 8 < < 8 9 9 9 9 9 8 9 9 9 9 9 8 9 9 8 8 8 8 9 9 8 8 8 8 9 9 8 9 9 8 8 8 8 8 9 9 9 8 9 8 < < < 9 9 9 9 9 9 9 9 8 9 8 < 8 8 8 9 9 9 8 9 9 9 9 9 8 8 < 8 8 9 9 8 9 9 9 < b s.s.i.s 8 9 : &.s.s.w.> q q q q ",
+"q q y 7 y y < e.s.s.i.y.t.y.t.s.s.s.p.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.t.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.t.y.y.y.y.t.y.y.y.y.y.y.y.y.y.p.s.s.a.y.y.y.y.i.s.s.w.< q q q q ",
+"7 q 7 q 7 y > r.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.e.> q q q q ",
+"y q y q q w < 4.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.4., y q q q ",
+"q q q q q q 7 u 2.s.s.s.s.s.s.s.s.s.s.,.( _ ( ' _ _ _ @.O._ ( _ _ _ ( _ ( ' _ ( _ _ ( ' _ _ _ _ _ _ _ _ _ _ ( ' _ _ _ _ _ _ _ _ ( ' ( ' _ _ _ _ _ ' ( _ ( ' ( _ ` ( _ _ _ _ _ _ ( ' ( ' _ _ _ _ ( _ ' ( _ ( ( ' ( _ _ _ ' ( ,.s.s.s.s.s.s.s.s.s.s.<.u 5 q q q q ",
+"q q q q q q q 5 5 _ i.s.s.s.s.s.s.s.s. .O : : : : : = A T O > : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : , : > : : , % : : : O @.s.s.s.s.s.s.s.s.i._ 5 5 q q q q q ",
+"q q q q q q q q 7 4 N 7.s.s.s.s.s.s.s.8.< q y q w y 5 l o.q y y y y y y q y y y y r y y y y y y y q y y y y y q y y y y y y y y y y y q q y y y y q q y y y y q y y y y y q y y y 7 q y q y y q y y y 7 u 7.j 7 q q y y q < 8.s.s.s.s.s.s.s.8.c 4 7 q q q q q q ",
+"q q q q q q q q q q 5 q | s.s.s.s.s.s.i.N 5 q q q q q 4 J S 5 q q q q q q q q y 7 y 7 q q 7 7 q y 7 q q 7 q q q q q 7 q q 7 q 7 q q q q q q q q q q q q q q q q q y 7 7 y 7 q q q 7 7 q q q q q 7 7 7 7 a U 7 q q q q q 5 N a.s.s.s.s.s.s.| q 5 q y q q q q q q ",
+"q q q q q 7 y 7 y q q 7 4 z q.s.s.s.s.s.} < y q q q r 5 C =.5 q q q q q y 7 7 4 u 5 q q q q q q q q q q q q q q q q q q q q 7 q q q q q q q q q q q q q q q q q q q q q q q q q 2 g u 7 q q q q q q 7 y *.a 7 q q q q r < .s.s.s.s.s.q.c > 7 q q q q q q q q q ",
+"q q q q q y q q q q 7 r q , 6 ;.s.s.s.s.e.w 5 q q q q q : z c 7 q q q q 7 7 7 @.e.a 4 7 q q q q q q q q q q q q q q q q q y y q q q q q q q q q q q q q q q q q q q q q q q q 4 s i.*., q q q q q q 7 l %.5 q q q q q 5 y e.s.s.s.s.;.6 , q r q q q q q q q q q ",
+"q q 7 q q 7 q q 7 q 7 4 7 u 5 ; F i.s.s.s.J 4 q q q q q 4 S ,.5 q q q q 4 p 2.s.s.9.w 7 q q q q q q q q q q q q q q q 7 q 7 q q q q q q q q q q q q q q q q q q q q q q q q 5 y q.s.a.k 4 q q q q 7 y o.0 7 y q q q q 4 K s.s.s.y.L - 7 7 7 q r q q q q q q q q ",
+"q q q q q y 7 q y q w S :.7.p 7 , l t.s.s.3.7 q q q q q y 5 S c 7 q q 5 N 9.s.%.b s.@., q q q q q q q q q q q q q q q q q y 7 q q q q q q q q q q q q q q q q q q q q q q q q 3.s.H i.<.4 q q q q 5 c :.5 q q q q q q q 3.s.s.e.z , q 5 j j 7 7 q q q q q q q q ",
+"q q q q q q q q q q ,.i.t.t.I 5 q 4 ' s.s.a.V 5 y q q q q 5 l 3.< q 5 V i.s.( 5 O 4.e.w 7 0 r q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q r 5 : , ,.` = ;.s.V 4 q q q 0 } 7 5 r q q q q 5 V a.s.s.' , q 7 S t.t.*.u q q q q q q q q ",
+"q q q q q q q q q q z ' u.u.%.5 q 7 j t.s.s.1.5 q q q q q q 5 V V 5 7 p 7.a.N : 6 r.9.4 y q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y 8 u U ( V > 5 z a.7.8 q y , S } , q q q q q q 7 1.s.s.t.j 7 q 7 5.} x u.S 5 q q q q q q q ",
+"q q q q q q q q q q 5 5.2.%.l 7 q q 5 #.s.s.s.N 5 q q q q q q , <.j 5 5 j q.a.3.r.s.T < 2.2.w 4 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 g 8.s.s.a.U 4 5 *.e.u 7 4 b A 5 q q q q q y 5 N a.s.s.@.5 q 7 j y.,.Y r.l 5 q q q q q q q ",
+"q q q q q q q q r 5 q R w 4 7 7 q q 7 j t.s.s.<., q q q q q q 5 s F r 7 5 j ,.i.e.R : } s.s.q.a 4 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y q y 5 %.a.G g 7.s.f 5 l N 5 7 , ,.g 5 y q q q q y > <.s.s.t.g 5 q q q c *.y.,.5 q q q q q q q q ",
+"q q q q q q q q q q q 7 7 q q q q q q < ' s.s.s.b 4 q q q q q q 5 I ;.> q 5 8 9 9 , J s.8.c t.i.k , 5 q q q q q q q q q q q q q q q q q q q q q q q q q q q q 5 : > , 2.e.8 , r a.%., 7 7 q 8 ( a 5 q q q q q r , b s.s.s.' < q q r q 5 5 y u q q q q q q q q q ",
+"q q q q q q q q q q q q q q q 5 q q q 7 q e.s.s.w.< 7 y q q q q q 7 c S q q r 7 5 l y.a.p.R i *.i ' z 5 7 q r 7 q q q q q q q q q q q q q q q q q q q q q r 5 S 2.<.N ^ s.' , q p.;.: q r > J %.7 y q q q q q 7 8 w.s.s.q.q 7 q q 7 q q q 7 7 q q q q q q q q q ",
+"q q q q q q q q q q q q q 7 7 J 7.k 5 q > J s.s.s.*.: q q q q q q 7 q <.I 4 q q 4 5.s._ ' s.[ + V s.s.=.g 7 7 7 q q q q q q q q q q q q q q q q q q 5 5 q 8 T s.9.e.s.T 3.s.5.9.s.g 5 q 5 } U 4 q q q q q q q > =.s.s.s.J 4 q q 5 q 5 q y q q q q q q q q q q q ",
+"q q q q q q q q q q q q 7 l 1.s.t.<.5 q q > ,.s.s.s.J 4 q q q q q q 7 7 I ( q q 7 B q.y.J C l , q.e.%.p.5.q p w q q q q q q q q q q q q q q q q 7 5 l c 5 > q.8.5 w e.e.s @.e.8.S 4 q q c %.s 7 q q q q q q 4 J s.s.s.<.< q 7 5 o.q.' 7 q q q q q q q q q q q q ",
+"q q q q q q q q q q q q 5 M i.5.q.e.k 5 y 5 p t.s.s.t.k 5 q q q q q q 5 s :.N 5 q 4 s 7.a.S = K s.[ ,.s.z =.5.y 7 y 9 q 5 7 q 5 5 5 5 7 q q q q *.i.i.} : q.5.5 4 U s.N O u 5 4 7 4 ` *.4 5 r q q q q y 5 s u.s.s.t.u 5 y 5 ^ r.T t.I 4 y q q q q q q q q q q ",
+"q q q q q q q q q q q q q > =.7.#.z q q q r > J s.s.s.7.y 7 q q q q q y 5 4 X.#.4 7 5 p [ j 9 e.s.t.2.i.q.z t.6.5 7 %.5.p o.U 5 q U *.K u 7 r 4 V s.-.q.i.u @.s.S # _ s.M 5 7 q q 5 K F s 5 q q q q q q 7 y 7.s.s.s.G 4 y y % 3.$. <.*.> q q q q q q q q q q q ",
+"q q q q q q q q q q q q q 5 s U 4 5 q q q q q > *.s.s.s.;.< q q q q q q q 7 p S J p 5 q 5 5 U s.@.=.r.8.V x s.[ 4 y q.q.t p.,., 2.s.9.s.5.q 7 5 c ,.6 5.e.w u q.a.8.s.1.q q q 5 , I %.< q q q q q q q q < ;.s.s.s.*., q q q 5 S t.5.r.s 5 r q q q 7 q q q q q q ",
+"q q q q q q q q q q q q q q q 7 q q q q y q q 7 5 7.s.s.s.[ : q q q q q q q q , T $.5 , y 7 p I y 5 p y : @.s.V 5 j s.@.y s.@.; s.q.f S } u 5 y 7 4 z a.' o 4 g *.5.' u 5 q : l 2.s 7 q q q q q q q q , ' s.s.s.7.5 7 q q q q 7 V } l 5 q q q q q r q q q q q q ",
+"q q q q q q q q q q q q q q q q 7 y 7 4 : < 7 y 5 j t.a.a.s.T 4 q q q q q q q q 5 q *.( % 5 q 5 q q 7 7 : *.s.N o _ s.C k s.[ # 3.s.p.4.I < q q 7 5 .a. .,.z 4 5 4 5 7 7 q I J M 5 q q q q q q q q 4 T s.s.s.r.g 5 q q q q 7 7 7 5 7 7 q 7 y 7 y q q q 7 q 7 y ",
+"q q q q q q q q q q q q 7 q y 7 q y l F ;.*.y y y 4 M u.a.s.s.I 4 q q q q q q q q 5 q m [ S 5 5 q q q q 5 N s.e.;.p.e.4 T s.U 5 x J @.t.a.c 5 q 7 y r.a.i.4.c 5 y q 5 y z ( .q 4 q q q q q q q q 4 I s.s.s.i.c 5 7 q 5 y 5 7 7 7 y y 7 q q q q 7 q y 7 y q q q ",
+"q q q q q q q q q q q q y q 7 q 5 S u.s.a.9.u q q y 4 F p.s.s.a.T > q q q q q q q q 0 4 N _ R V 7 5 q q q 5 B 7.y.5.l : } s.S 9 i.8.J 7.a.M 5 y 7 p :.J u : 7 q 5 y j ( <.u : 7 y q q q q q q 7 , T a.s.s.i.G 4 r q q } q.=.g 7 7 y 7 y 7 y q q y 7 y q y 7 7 y ",
+"q 7 q q q q q q q q q q q q y q 7 7 l 3.a.S 4 q q q q 4 U p.s.s.s.[ < 7 q q q q q q q q 5 > S %.F S q 5 7 r < , y 5 5 5 T 5.z 4 J q.u.e.( 7 q q y 7 , , 7 5 5 q y W ,.g 5 7 y 7 q q q q q q 7 < ' s.s.s.p.U 4 q q 5 S t.D 7.*.5 y 7 y 7 q q q q q q q q q q q q ",
+"y 7 y 7 q q q q q q q q q 7 y 7 y 7 , %.2.5 7 q q q q q 4 T p.s.s.s.=.y 5 q q q q q q q q q 5 : N ,.F ` u : 5 7 5 q y y 5 : 7 q 5 7 l q 4 7 y 7 y 7 7 5 7 z j :.[ p y 7 q y 7 y q q q q y 5 y =.s.s.s.p.T 5 7 q q 4 [ 3.* :.1., 7 y 7 y 7 y q q 7 q 7 q q q q 7 ",
+"q q q q q q q q q q q q q q q q 7 y 7 N l 7 q q 7 5 5 y q , J p.s.s.s.5.a 4 q q q q q q q q q q 5 < j @.T *.U u p 5 : 5 5 7 7 5 7 5 5 5 5 7 4 7 , q s ( I 2.J l 7 5 7 q 7 q y 7 q q q y , p 5.s.s.s.i.K 4 7 q q 7 7 l 9.e.q.V 7 y 7 y 7 y 7 q 7 y q y q 7 y q y ",
+"q 7 q q q q q q q q q q q q y q y 7 y 7 7 q q 7 < =.M 5 7 q 4 C t.s.s.s.t.S 4 5 y 7 q q q q q q y q 5 5 y F V } -.z *.V a g u a 9 a w u p j _ c . .J } p q 7 7 q q q q q q q q q y 5 , S r.s.s.s.t.V 4 q r 5 5 y q 7 j I z 5 q 7 y 7 y 7 y 7 y q q 7 y 7 q q 7 ",
+"q y y 7 q q q q q q q q q q 7 q 7 y 7 7 q q 7 > ,.8.u 7 y y 7 4 j 8.s.s.s.a.$.< 4 q q q q q q q q q q q q 5 5 q u g I V %.' T 3.k 1.^ ^ :.A _ z c i q 5 7 7 q q q q q q q q q q q , 9 %.s.s.s.s.7.j 4 q y > N c 5 q 7 7 4 7 q q y 7 y 7 y 7 y 7 7 q q q y q q y ",
+"q q q q q q q q q q q 7 q q 7 q y 7 y 7 y 7 5 >.q.- 5 y q q q y 5 q $.s.s.s.s.0.c ; 5 y q q q q q q q q q q y 7 7 7 5 7 5 7 7 q q 7 q 5 5 7 5 7 7 7 7 q q q q q q q q q q q q 5 , c 8.s.s.s.s.*.q 5 q q , C e.=.y q q q q q q q q q q q q q q q y q q q q q q q ",
+"7 y y 7 q q 7 y 7 y q y y 7 y q 7 y 7 y 7 7 7 U r.c 5 q q q q q q 7 > J y.s.s.s.s.>.k 5 5 q q q q q q q y 7 7 q y q 7 7 q q q q q q q q r q q q q q q q q q q q q q q q q 5 5 k :.s.s.s.s.u.J : 7 q q 7 g t.e.t.G 5 q q q q q q q q q q q q q q q q q q q q q q ",
+"7 q q q q q q q 7 q q 7 q q q y y 7 y 7 y 7 q = T ,., q 7 7 7 y q q q 4 j 4.s.s.s.s.i.*.c 7 4 q y q q q q q q y y 7 y 7 q q q q q q q q q q q q q q q q q q q q q y q 5 5 c =.a.s.s.s.s.3.s , q q q q q 7 K a.#.> q q q q q q q q q q q q q q q q q q q q q q q ",
+"y q y 7 q q q q y q q y y 7 q 7 7 y 7 y 7 y q q 5 8 q y y 4 T *.5 q q q 5 4 T r.s.s.s.s.i.,.S q , 5 q y y 7 q 7 q q q y q q q q q q q q q q q q q q q y q q y 7 5 , q S ,.i.s.s.s.s.r.U , 5 y q q q q q q , _ 8.f q q q q q q q q q q q q q q q q q q q q q q q ",
+"q q q q q q q q q q q 7 y q q q y 7 y 7 q q q q q q q q 5 z u.H 5 q q q q q , u #.i.s.s.s.s.s.7._ g 5 , 5 7 7 q y 7 y 7 y 7 q q q q q q q q q q q q y y 7 7 : 5 p _ 8.a.s.s.s.s.i.@.u , q q q q q q q q q 7 5 l q q q q q q q q q q q q q q q q q q q q q q q q ",
+"q 7 q q q q q q y 7 q q 7 q q y 7 y 7 y q q q q q q q 7 q w.:.; q q q q 7 7 r 7 > j *.i.s.s.s.s.s.u.2._ k 7 , : 5 7 7 7 7 y q q y q q q q q q q q 4 : : 7 j ' 2.i.s.s.s.s.s.i.*.k , 5 y q 7 q q q q q q q q q 5 q q q q q q q q q q q q q q q q q q q q q q q q ",
+"q q q q q q q q q y q y y 7 y 7 y 7 y 7 q q q q q q q 7 u <.t.S 5 r q q p 9 7 7 y 5 4 l %.r.s.s.s.s.s.s.p.q.;.( C 5 5 8 5 : = ; , = ; ; ; 5 < 8 7 B ( *.q.p.s.s.s.s.s.s.r.@.z 4 5 q q 4 4 9 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q ",
+"q q q q q q q q q 7 q 7 q q q q 7 y 7 y q q q q q q q q q 5 ' @.5 q q 7 ,.T : 7 7 q 7 7 5 p I 4.i.s.s.s.s.s.s.s.s.i.e.7.:.} _ W ^ T ` W ' ;.8.e.u.s.s.s.s.s.s.s.s.u.2.I g 4 7 7 q q 7 z <. ., q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q ",
+"q y q q q q q q q q q q q q q q y 7 y 7 q q q q q q q q q 7 5 7 q q y 4 #.5.2.K 5 7 q q q 7 4 5 g H <.t.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.t.<.J p 7 5 7 q q q q 7 p q.r.,.M 7 q q q q q q q q q q q q q q q q q q q q q 7 q q q q q q q q q q ",
+"q 7 q y 7 y 7 q q q q q q q q q 7 y 7 y q q q q q q q q q q y q q q q < ;.t.T 5 7 y q q q q q q 7 , , , N R 2.t.p.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.a.t.4.T N , , 4 5 7 q q 7 5 q q q u :.e.q.r.u 5 q q q q q q q q q q q q q q y q q q q q q q q q q q q q q q q ",
+"7 y q 7 y q 7 y q q q q q q q q y 7 y 7 q q q q q q q q 7 y 7 y q q 5 l e.V = q q q q q q q q q 7 q y q , , < 4 u G T _ $.2.7.q.9.9.q.7.2.$.' ^ G u 4 , ; 4 7 q y q q 7 5 u .g 5 y 5 q @.r.:.7 y q q q q q q q q q q q q q q 7 q q q q q q q q q q q q q q q q ",
+"q q q y 7 q q q q q q q q q q q 7 y 7 y q q q q q q q q y 7 y 7 q q q y j y q q q q q q q q q 5 w 4 5 q q r 7 7 7 , , = , 5 9 < 8 8 < 8 5 , ; ; , 7 7 q q q 7 q q y 5 J _ 8 e.T 4 q q u ( J 5 7 q q q q q q q q q q q q q q q y q q q q q q q q q q q q q q q q ",
+"7 q 7 y 7 y q y q q q 7 7 q q q y q q q 7 y q q q q q q 7 y 7 y q q q 7 7 7 q q q q q q q q 4 V 5.=.l 5 7 y 7 7 7 q w q q q q 7 y q 7 7 y y 7 y q q q q 5 q 9 5 q q 5 I e., [ 7.q q q q ; 4 q q q q q q q q q q q q q q 7 y q 7 q 7 q q q q q q 7 q 7 q q q q 7 ",
+"y q q q q q q 7 q q q y q q q q 7 q y 7 q q q q q q q q y 7 y 7 q q q q 7 q q q q q q q 7 y , .s.9.o., y 7 y j 5 5 q 7 q y 5 < , 7 y 7 y 7 5 7 q q q q U 8.8.V 5 q 5 i 9.-.2.3.7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y q y q q q q y ",
+"q q q 7 7 y y 7 y 7 q 7 q q q q y 7 y q 7 q 7 q q q q q q q q q q q q q q q q q q q q q y 7 p [ 3.r.j 5 7 7 y r.q.4.l 5 y 4 k G G y 7 y q 5 ( c 7 q 7 c t.} -.7.q q y 5 F 3.,.l 5 q q q q q q q q q q q q q q q q q q q 7 y 7 q q q q q q q q q q q 7 y 7 q q 7 ",
+"q q q q q q q q q q q y q q q q q q q q y q q q q q q q q q q q q q q q q q q q q q q q 7 7 a 9.e.i.s 5 7 7 s a.9.5.r 0 y = #.t.q.:.< 7 q < 9._ 4 q 4 S t.r z t.p q q y 5 y 5 5 y r q q q q q q q q q q q q q q q q q q q q y q q q q q q q q q 7 q q q y q q y ",
+"q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 y G V 5 y q 4 T p.2./ , q y = #.t.t.=.> q q 5 1.} 5 y 7 y 1.t.t.' 5 y y 7 y 7 q q 7 q 7 q q q q q q q q q q q q q q q q q q 7 7 y y 7 y 7 q y q y q q q q q q q q ",
+"q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 4 5 q q y < H 6.q..., q q : *.=.3.} ; q y < ..-.4 q q 7 8 a q 6 7 q 7 y q q y 7 y q y q q q q q q q q q q q q q y 7 7 y q y q q q q q q q 7 q 7 q q q q q q q q ",
+"q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q q q q q q q q q q q q q q q y 7 q q q 5 4 q w 7 q q 4 K C p &.9 q q 5 l z q q q q q 7 7 q q q q q q 7 y q q q 7 y q 7 q q q q q q q q q q q q q y q q q q q 7 q q 7 y q q q q q q q q q q ",
+"q q q q q q q q q q q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 7 q q q y , 4 5 ; q q q y 5 5 q q q q q q q q q q q q q q q q y 7 q q q y q q q q q q q q q q y 7 q 7 7 y 7 y q y y 7 q q q y q q q q q q q q ",
+"q y q y q 7 y q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q y q y q q q q q q q q q q q q q q q q q q q q q q q q 7 y q q q q q q q q q q q q q q q 7 q q q q q q q q q q 7 y 7 7 q 7 q q q q q ",
+"q 7 q 7 q q 7 q q q q q q q q q q q q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q q q q q q q q q q q q q q q y q q q q q 7 q q q q y q q y q y q q q q q ",
+"q 7 q q q y y q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 q q q q q q q q q q q q q q q q q q q y q q q q q q q q 7 q q q q q q q q q q q q q q q q q 7 q q q q 7 y y 7 q 7 ",
+"q y y 7 q 7 q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q 7 y 7 q q q q q q q q q q q q q q q q q q q q q q q q q q y 7 q y 7 q q q q q y "
+};
diff --git a/textures/grass.xpm b/textures/grass.xpm
new file mode 100644
index 0000000..34ce858
--- /dev/null
+++ b/textures/grass.xpm
@@ -0,0 +1,312 @@
+/* XPM */
+static char *result[] = {
+/* columns rows colors chars-per-pixel */
+"128 128 178 2 ",
+" c #72960F",
+". c #759A0E",
+"X c #799E0F",
+"o c #729613",
+"O c #759A13",
+"+ c #799E13",
+"@ c #769918",
+"# c #7B9F19",
+"$ c #7CA30E",
+"% c #7DA313",
+"& c #7DA218",
+"* c #85AF04",
+"= c #86AD0E",
+"- c #84B106",
+"; c #86B20C",
+": c #8AB30E",
+"> c #80A713",
+", c #84AC12",
+"< c #88AF14",
+"1 c #83A81B",
+"2 c #88AF18",
+"3 c #9EAE14",
+"4 c #87B411",
+"5 c #8BB312",
+"6 c #8DB916",
+"7 c #8DB51A",
+"8 c #8EBC19",
+"9 c #93B215",
+"0 c #90BA17",
+"q c #90B71D",
+"w c #9AB21A",
+"e c #9DB61A",
+"r c #91BE1B",
+"t c #A5AC16",
+"y c #ABA916",
+"u c #B3A816",
+"i c #BAA619",
+"p c #B8A81A",
+"a c #A3B11D",
+"s c #90B722",
+"d c #92B923",
+"f c #96BB2B",
+"g c #9ABE33",
+"h c #9EBF38",
+"j c #AAAF23",
+"k c #B2AE20",
+"l c #B6AF2C",
+"z c #BFAF2F",
+"x c #A4B221",
+"c c #AAB626",
+"v c #B5B42A",
+"b c #D69B17",
+"n c #D59C1A",
+"m c #DD9B1B",
+"M c #F68A0A",
+"N c #F58D13",
+"B c #EC951A",
+"V c #E2991C",
+"C c #F09317",
+"Z c #F3931C",
+"A c #C7A118",
+"S c #E99E2C",
+"D c #F79221",
+"F c #F4992A",
+"G c #F59F35",
+"H c #FC9A35",
+"J c #C6AC29",
+"K c #D8A52B",
+"L c #D6AE3A",
+"P c #DAAC3C",
+"I c #E7A639",
+"U c #EFA53C",
+"Y c #E3A93E",
+"T c #F1A236",
+"R c #F4A23C",
+"E c #93C11D",
+"W c #96C421",
+"Q c #98C723",
+"! c #9AC32B",
+"~ c #9DC92E",
+"^ c #9EC03C",
+"/ c #A0C23E",
+"( c #9BB65C",
+") c #AABF76",
+"_ c #DBAC40",
+"` c #E9AA45",
+"' c #F3A643",
+"] c #F8A444",
+"[ c #F0AA47",
+"{ c #FCA74E",
+"} c #F3AA4D",
+"| c #F9A94D",
+" . c #F3AE51",
+".. c #FBAA52",
+"X. c #EBB256",
+"o. c #F7B057",
+"O. c #F9B15C",
+"+. c #EAB860",
+"@. c #F7B461",
+"#. c #FDB266",
+"$. c #EBBD70",
+"%. c #F2BC76",
+"&. c #FABF7C",
+"*. c #A4C346",
+"=. c #A5C64B",
+"-. c #A8C74D",
+";. c #AAC953",
+":. c #ACC95A",
+">. c #B0CD5E",
+",. c #B5CE65",
+"<. c #B3CE6A",
+"1. c #B5D16C",
+"2. c #B7D272",
+"3. c #BAD375",
+"4. c #BDD479",
+"5. c #D0C76F",
+"6. c #DCCA7C",
+"7. c #E9C26F",
+"8. c #E8C67E",
+"9. c #BFD682",
+"0. c #C1D783",
+"q. c #C2D985",
+"w. c #C6DB8E",
+"e. c #CADB8E",
+"r. c #DED18C",
+"t. c #C7DD90",
+"y. c #CADD93",
+"u. c #CBDD9C",
+"i. c #DDD495",
+"p. c #D0DE9E",
+"a. c #E8CE8C",
+"s. c #F5C886",
+"d. c #F9C688",
+"f. c #ECCF94",
+"g. c #F6CB96",
+"h. c #FCCF9F",
+"j. c #E6D99C",
+"k. c #F3D19C",
+"l. c #D0E29D",
+"z. c #D3DFA0",
+"x. c #EBD9A6",
+"c. c #EADCAC",
+"v. c #FAD3A5",
+"b. c #F5D7A8",
+"n. c #FBD7AC",
+"m. c #F8D9AF",
+"M. c #FBDAB5",
+"N. c #FADFB9",
+"B. c #D2E3A6",
+"V. c #D4E3AA",
+"C. c #D7E6B0",
+"Z. c #DAE7B5",
+"A. c #D9EAB7",
+"S. c #DEEBBB",
+"D. c #E3E5B1",
+"F. c #F4E0BC",
+"G. c #FBDFC5",
+"H. c #DDEBC1",
+"J. c #EAE5C5",
+"K. c #E0ECC3",
+"L. c #E3EECC",
+"P. c #E9EFCD",
+"I. c #F7E6C8",
+"U. c #FBE5CD",
+"Y. c #F7E9CD",
+"T. c #E7F0CF",
+"R. c #F7EED6",
+"E. c #FBEDDB",
+"W. c #E7F3D7",
+"Q. c #EAF2D4",
+"!. c #ECF2DB",
+"~. c #F2F3DD",
+"^. c #F2F6E4",
+"/. c #FBF3E7",
+"(. c #F5F9EB",
+"). c #FBF9EF",
+"_. c #F5FBF1",
+"`. c #FEFFFE",
+/* pixels */
+"5 5 : - 1.).b.5.`.`.9.; 4 5 5 5 5 5 5 5 5 5 < : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 O 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : : : 9 E 6 5 5 5 5 5 5 r 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 6 4 5 5 5 5 4 E E 8 E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 : g z.Z.+.N R !._.1.; 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < + o 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 < E Q 0 5 5 5 5 5 0 E r 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 6 r 6 5 5 5 5 5 W E E E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 - w.`.`.O.N U 9.^ 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 O @ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 Q 5 5 5 5 5 5 0 Q r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ; E E E E 5 5 5 5 5 8 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 : h p.T.E.$.F.`.5.= 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 > % 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r 4 5 5 5 5 5 5 W 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 4 8 r E E : 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 : - B.`.(.(.`.~.q 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 : < : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 5 5 5 5 5 5 5 5 5 5 5 4 4 5 i y = : ; 4 6 6 4 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 : l.`.S.0.^.z.5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 4 5 t t B S x e 4 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 f 3.g : q 9 : 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 6 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 , 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 4 m Z G ' { ` 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 ",
+"5 5 5 4 4 ; : 5 : < 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 E 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 , @ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 3 S M.v.I z 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 6 E W 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < O O 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 x | O.H b : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : E E 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 o % 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 z p m V 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 8 4 5 5 5 5 5 5 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 & > 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 E 5 w 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 = X < < : 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 4 5 5 5 5 5 5 5 5 5 5 5 4 6 5 5 5 9 5 5 5 5 5 5 5 5 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 E 6 5 5 5 5 5 5 5 5 4 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 % + . $ 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 6 E E 8 6 5 5 5 5 5 5 5 5 5 5 r 0 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 E W E ; : 5 5 5 5 5 5 < > $ < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < . X > 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 E E W r : 5 5 5 5 5 5 5 5 E r E W 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 6 4 5 5 5 5 5 5 5 4 6 W 4 4 5 5 5 5 5 5 5 . X . = 5 5 5 5 5 5 5 5 5 5 5 5 5 5 > 5 < 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 E 8 6 5 5 < 5 5 5 5 5 5 5 r E 0 r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 r 6 r 5 5 5 5 5 5 5 5 6 8 4 4 5 5 5 5 5 5 5 % . O O 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : : : 9 5 5 5 5 5 5 ",
+"5 5 5 5 < + 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 Q E r W : 5 5 5 5 5 5 5 5 5 5 6 5 5 5 5 5 5 5 5 < 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"< 5 5 5 1 O < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r r r 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"% 5 5 5 O o , : 5 5 5 4 6 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 4 6 E 5 5 5 5 5 5 5 5 ",
+"+ 5 5 5 < o 5 5 5 5 5 8 E 8 E 5 9 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : $ < 5 5 5 5 5 5 5 5 5 5 5 5 5 A p 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 < : 5 5 5 5 5 5 5 5 5 5 E W 5 5 5 5 5 5 5 5 ",
+"> 5 5 5 5 , 5 5 5 5 5 E E E E 6 : 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 X O % . 5 5 5 5 5 5 5 5 4 5 t t Z V x x 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 W E 5 5 5 5 5 5 5 5 ",
+"< 5 5 5 5 5 5 5 5 5 5 6 E 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < + 5 5 5 5 5 5 5 5 5 5 5 5 5 O O . O 5 5 5 5 5 5 5 5 4 3 Z Z F H | } w 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r 6 5 5 5 5 5 5 5 5 ",
+"W 5 5 5 5 5 5 5 5 5 5 4 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : : % O < 5 5 5 5 5 5 5 5 5 5 5 5 > > < 5 5 5 5 5 5 5 5 4 5 : u F G.n.' L 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"E 5 5 5 5 5 5 5 5 5 5 4 W 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 E 5 5 O o , 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 ; ; : 4 l | 8...n 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"4 5 5 5 5 5 5 5 5 5 5 r E E 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 W Q 5 5 5 o < 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 1.e.f - k ` K C D 3 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 9 W 8 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r E 4 5 5 < 5 : > , 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 : - 5 Q.`.;.4 4 5 5 t i 9 4 5 5 5 5 5 5 < 9 5 5 5 5 5 5 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 6 r 4 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 8 8 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r 5 5 5 5 5 > # + 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : g t.w.6.a.u.W.C.r 5 4 4 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 E 5 5 5 < . % ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 = 4 : 5 5 5 5 5 5 5 5 5 5 5 > o % 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 0.`.`.] M k.`.Q.d ; 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 r 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 W E 4 5 < o . O ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 % & 5 5 5 5 5 5 5 5 5 5 5 5 5 O < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 f 0.u.8...N.W.*.: 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : < 5 5 5 5 5 5 5 5 5 5 5 5 Q 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < E E 5 5 5 O % % ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 & O % : 5 5 5 5 5 5 5 5 5 5 5 5 < < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : * -.`.^._.`.;.: 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 d r 0 : < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 0 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 o > 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : ^ T.,.*.4.f : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 0 Q 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 % 1 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 : : 6 < 5 : : 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 0 5 5 5 5 0 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 < 5 5 5 5 5 5 % < 5 5 5 5 5 5 5 5 5 5 5 > > , 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 : E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 r 4 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 % O 4 5 5 5 5 5 5 5 5 5 5 X + < 5 5 5 5 < 5 : 6 : 5 5 5 5 5 5 5 5 r E 0 < 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 r W 4 6 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 O o 2 5 5 5 5 5 5 5 5 5 5 > O O . < 5 5 5 5 5 5 r r E E 5 5 5 5 5 5 5 0 Q 0 5 5 5 5 5 5 5 5 5 5 5 5 , > + , 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"9 5 5 5 5 5 5 5 5 5 5 < 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 W W W W 6 8 4 4 5 5 5 5 5 5 5 5 5 5 5 % % 5 5 5 5 5 5 5 5 5 5 5 : % 5 5 5 9 5 5 5 5 4 r E E E 5 5 5 5 5 5 5 5 r 0 5 5 5 5 5 5 5 5 5 5 5 5 . O : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 6 4 4 5 5 5 5 r W W 8 E W 4 6 5 5 5 5 5 4 4 5 4 5 5 , , 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 r 8 4 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 X + + X 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 W 5 4 5 5 5 5 5 0 r r 6 0 4 5 5 5 5 5 5 6 r 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 9 5 5 5 5 E W 8 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 E r r E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 9 5 5 5 5 5 5 5 5 5 5 5 5 6 W 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 E E E E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 E r r E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 4 5 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 6 E 8 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 : E r W E 5 5 5 5 5 5 5 5 5 9 : 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 E E E 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 6 r 6 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 4 4 E 6 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 6 E 8 8 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < : 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 8 E 8 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 5 5 5 5 5 5 5 5 5 5 5 5 6 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 6 Q 8 5 5 5 5 5 5 5 5 5 5 5 5 < 9 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 W r 8 r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 4 W 6 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 W E W W 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < % X > < : 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 ",
+"5 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 4 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 O X . O , 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 $ + X < 5 5 5 5 5 5 5 5 5 5 5 5 5 4 6 W 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 : 9 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 : 5 5 5 5 5 5 5 5 9 5 5 5 5 5 E E E 8 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 % > 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 Q r r 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : X , , 5 ",
+"5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 % O + 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 O X o 5 ",
+"5 5 5 3 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 5 : < o > 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 9 5 5 5 5 5 5 5 : 5 5 : 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 < 5 5 5 9 : 5 O O . X 5 ",
+"5 4 t D u 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + , < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 = 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 = , 5 5 : ",
+"t n n N K P v 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 > O % + : 5 5 5 5 5 5 5 5 5 5 8 8 E 6 0 5 5 5 5 5 5 5 5 5 5 5 5 9 + , 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"t B H d.#..._ Q 0 5 5 5 5 5 5 5 5 5 5 5 5 5 r r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . O o : 5 5 5 5 5 5 5 5 5 5 8 E E E 6 5 5 5 5 5 5 5 5 5 5 5 5 , # 1 ; : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"4 J o.U.#.J e E 5 5 5 5 5 5 5 5 5 5 5 5 5 0 Q E : 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 : $ + > = 5 5 5 5 5 5 5 5 5 5 5 5 E 0 0 6 : 5 5 5 5 5 5 5 5 5 5 5 $ ) H.<.q.4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 L .T D n 4 4 4 5 5 5 5 5 5 5 5 5 5 5 4 4 E r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : ( k.%.t.4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"4 c c t V A 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : B.m.s.W.f : 5 5 5 5 5 5 5 5 5 5 5 5 5 6 E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"E E 8 ; 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 f B.!.0.f : 5 5 5 5 5 5 5 5 5 5 5 5 5 r W 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 ",
+"6 W 8 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : d g = 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r W 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 E 5 5 5 5 5 ",
+"5 r 8 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < > 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : : 5 5 5 5 5 5 4 4 4 4 5 5 5 5 5 5 5 E 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 E E 4 5 5 5 5 ",
+"5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 > o 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 8 E r 6 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 W E : 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 O o 5 E 6 8 5 5 5 5 5 5 5 : 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 8 E E W 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 E E ; ; 4 4 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 > > E W E E 4 5 5 5 5 5 < 9 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 E 8 8 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 ; : 5 d 6 6 5 ",
+"5 4 4 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 9 , , E E r 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 : < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9.S.W W 4 ",
+"5 4 4 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 : : 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ; :.H.x.D.Q r 5 ",
+"5 5 r 0 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 4 5 5 5 5 5 5 5 5 5 5 5 < 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : =.R.F f.H.7 5 ",
+": r E r 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 8 E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 ; 9.^.U.w.:.5 5 ",
+"5 5 E E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 E E 6 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 : 5 5 5 5 5 5 5 5 5 4 5 5 5 q : 5 5 5 5 q *.L.=.- 4 5 ",
+"5 5 8 E < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 9 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 E W 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 < > O > = 5 5 5 4 5 5 z.K.f : 5 5 5 5 < 6 5 5 5 5 ",
+"5 5 ; 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 W 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 X + o > 5 5 7 4 - / `.`.4.; 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < + % < 5 5 4 ^ >.:.(.).<.s 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 q W.`.J.} U i.^.V.5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5.^.v.N N x.`.!.q : 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 q K./.X.s.0.2.*.: 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 0 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 9 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ; :.`.`.!.`.Q.5 ; 5 5 : 5 5 5 5 : 5 ",
+"5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r 5 5 5 5 5 5 5 5 5 5 5 6 E E r r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : h L.u.C.`.~.r 5 5 5 5 5 % 5 : 5 5 ",
+"5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 6 E 6 5 5 5 5 5 5 5 5 5 5 4 E E E E 5 5 5 5 5 5 5 5 5 5 5 5 5 r r 5 5 5 5 5 5 5 5 5 5 5 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 5 5 5 5 5 5 5 5 : 5 : g e.,.5 5 5 5 < O O + . 5 5 ",
+"5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 E E 0 5 5 5 5 5 5 5 5 5 4 4 E 8 5 1 : 5 5 5 5 5 5 5 5 5 5 : 6 W W 5 5 5 5 5 5 5 5 5 5 5 E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r E 8 r 5 5 5 5 5 5 5 5 : : ; ; : 5 5 5 5 o O O . 5 5 ",
+"5 5 5 5 5 5 5 < , 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 < 5 5 5 5 5 5 E E 5 < 5 5 5 5 5 5 5 5 5 4 4 4 % O 9 5 5 5 5 5 5 5 5 5 5 5 0 W r 5 5 5 5 5 5 5 5 5 5 Q Q 5 5 5 5 5 5 5 5 : < 5 5 5 5 < 5 5 5 5 5 5 5 4 W E E E 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : = > < 5 5 5 ",
+"5 5 5 5 5 5 < # > 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r 5 5 5 5 5 5 5 5 5 5 5 5 5 < o O 5 5 5 5 5 5 5 5 5 5 5 < : r 0 5 5 5 5 5 5 5 5 5 5 r E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 8 8 6 9 5 5 5 5 5 5 5 5 5 5 5 5 6 6 4 4 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 > o + 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 O > 5 5 5 5 5 5 5 9 5 5 5 5 5 4 5 4 5 5 5 5 5 5 5 5 5 6 r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 8 E 8 6 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 < o > 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 > < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r W W E 6 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 + 5 : 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r 0 0 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 8 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 : 0 > , 0 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 4 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 % < 5 5 5 5 5 5 5 5 5 5 5 5 E E E E 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 > @ > 9 5 5 5 5 4 8 6 6 : 5 5 5 5 5 5 5 5 5 r 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 4 4 5 6 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < # % 5 5 5 5 5 5 5 5 5 5 4 5 r 8 E Q 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + o > 5 5 5 5 4 E E E E 5 5 : 5 5 5 5 5 6 r E E 8 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : = % 9 5 5 5 5 5 5 5 5 5 5 5 9 5 ",
+"5 4 4 r r 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 > o & W 4 6 5 5 5 5 5 5 5 5 5 4 8 4 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : > O 5 5 5 5 6 5 E E 6 r 6 5 5 5 5 5 5 5 6 E E E r : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 > % # 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 4 W E E E 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 4 + 7 E E r : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 < > 5 5 E E E E 0 2 $ 1 5 5 5 5 5 5 5 5 4 r 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 > o + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 4 4 W r r r : 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 2 8 8 E q 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r E E E 0 + @ > 5 5 5 5 5 5 5 5 5 4 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 o < 5 5 5 5 5 5 5 5 5 4 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 0 0 5 5 > @ < 5 5 5 5 5 5 5 5 5 5 4 5 , O : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : > : 5 5 5 5 5 5 5 5 5 6 0 4 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 % 5 5 5 5 5 5 5 5 5 5 5 : 4 + o = 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 8 W r 8 5 ",
+"5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 *.h $ ( <.5 < 5 5 5 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 E W W 0 4 ",
+"5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 : 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 Q.!.9.`.(.d ; 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r 5 4 6 5 ",
+"5 W : 6 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ; ^ H.M.@.I.q.: 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 4 5 ",
+"W E r E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 < 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : h (.`. .N 7.3.7 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"W r r 8 5 5 5 5 : < 5 5 5 5 5 5 5 6 r E 8 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 < 9 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 d y.P.Y.r.!.`.^ : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"8 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 E 8 E W 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < : 5 5 5 5 5 5 5 5 5 5 ; Z.`.q.;.4.q ; 5 5 5 5 5 5 5 5 5 5 < 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"; 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r E 8 8 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 : *.0.q ; ; : : 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : ; 5 : 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 E 8 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 8 E E 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 r E 6 5 5 5 5 5 5 5 5 5 4 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 4 5 W r 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 8 E E W 6 5 5 5 5 5 5 8 r 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < O 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 6 E : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 9 : 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 4 6 E 8 E 4 5 5 5 5 5 E r E W 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < # O , : 9 5 5 5 5 5 5 : : : 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 5 5 5 5 5 5 8 E r E 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 : 4 < = 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + o = : 5 5 5 5 5 : = :.y.q ; 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 X . $ % : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 @ < : 5 5 5 5 5 : : t.`.=.d 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 O X o 9 5 : < 5 5 5 5 5 5 5 5 5 5 5 5 9 5 < 5 5 5 5 5 : ! A.j.[ c.!.d : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < : 5 5 5 5 5 5 5 5 ",
+"5 : 5 % % > > 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 ~ B.F.R i.1.6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 , = + < < : 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 : 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 >.`.~.^.d 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 8 5 5 5 5 5 5 5 5 5 5 5 5 5 % X O . > 5 5 5 5 5 5 5 5 < 9 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 9 : 5 < 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 g 3.,.u.7 : : 5 % > 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 6 E r : 5 5 5 5 5 5 5 5 5 5 5 9 = O , 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 < 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : = ; 4 4 5 5 > + % 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r E r : 5 5 5 5 5 5 5 5 5 5 5 5 : , 5 < 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 < 5 5 5 9 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < o % 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 W 4 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 O 1 : 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 4 8 6 5 5 t y 4 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : < : 5 5 5 5 5 < : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 5 V Z 9 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 : < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 9 m V B D Y ` a 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 A Z &.v.| | c 4 5 5 5 5 5 5 5 5 5 5 5 5 ; r 6 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : ",
+"5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : w U g.h.S a 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 E E < % 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"6 8 5 ; 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 j | ' Z Z t 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 Q E > @ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"8 E 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 9 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 x 9 u V t 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 r r O , 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 5 5 5 5 5 5 9 : 5 5 5 5 5 5 5 5 ",
+"W W 5 5 5 5 5 5 : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 8 > @ 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 9 < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ",
+"E E 5 5 5 5 5 5 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : 4 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 : : 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 5 5 5 < > 5 5 5 5 5 5 5 5 : 9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 < 5 5 5 5 5 5 5 5 5 "
+};
diff --git a/textures/player.xpm b/textures/player.xpm
new file mode 100644
index 0000000..b2c4a21
--- /dev/null
+++ b/textures/player.xpm
@@ -0,0 +1,390 @@
+/* XPM */
+static char *result[] = {
+/* columns rows colors chars-per-pixel */
+"128 128 256 2 ",
+" c #010202",
+". c #0B0503",
+"X c #040C05",
+"o c #070909",
+"O c #0D0B0C",
+"+ c #130808",
+"@ c #07160B",
+"# c #09140A",
+"$ c #16170C",
+"% c #0D0E13",
+"& c #170B13",
+"* c #091815",
+"= c #121212",
+"- c #1A191A",
+"; c #280F0E",
+": c #22161A",
+"> c #381B13",
+", c #10220B",
+"< c #0B2319",
+"1 c #132815",
+"2 c #193819",
+"3 c #2F3015",
+"4 c #1C1A21",
+"5 c #321927",
+"6 c #0D2D25",
+"7 c #142A25",
+"8 c #16392A",
+"9 c #183B34",
+"0 c #2A2728",
+"q c #302D2F",
+"w c #373536",
+"e c #43160E",
+"r c #491B14",
+"t c #50281A",
+"y c #6C310F",
+"u c #753C03",
+"i c #481A2D",
+"p c #551E37",
+"a c #572733",
+"s c #44383A",
+"d c #6A3822",
+"f c #72312E",
+"g c #1D461C",
+"h c #334A14",
+"j c #1C4930",
+"k c #1B4739",
+"l c #254B25",
+"z c #285728",
+"x c #2D4F37",
+"c c #2C632B",
+"v c #316B2E",
+"b c #2D6638",
+"n c #346C33",
+"m c #377738",
+"M c #565E18",
+"N c #75450A",
+"B c #714B0E",
+"V c #556E10",
+"C c #47512F",
+"Z c #3F2840",
+"A c #51374D",
+"S c #72284A",
+"D c #772A4C",
+"F c #1B4B45",
+"G c #1E5544",
+"H c #314946",
+"J c #235848",
+"K c #25644C",
+"L c #2A6849",
+"P c #347848",
+"I c #286853",
+"U c #386A53",
+"Y c #2B7457",
+"T c #2E7A5B",
+"R c #317D58",
+"E c #2E7D60",
+"W c #464545",
+"Q c #564749",
+"! c #4C5C5E",
+"~ c #545150",
+"^ c #5C5B5B",
+"/ c #665155",
+"( c #6B655D",
+") c #674667",
+"_ c #755471",
+"` c #506C67",
+"' c #706D6D",
+"] c #A2250D",
+"[ c #93382C",
+"{ c #A53E2E",
+"} c #A73E37",
+"| c #CD0000",
+" . c #D5090A",
+".. c #DD2122",
+"X. c #86501B",
+"o. c #904B30",
+"O. c #AF4934",
+"+. c #B84633",
+"@. c #A95938",
+"#. c #BC633E",
+"$. c #C1573A",
+"%. c #8F354D",
+"&. c #832F54",
+"*. c #A73E40",
+"=. c #A85B4C",
+"-. c #8A7078",
+";. c #C25E50",
+":. c #CA6A44",
+">. c #D26D48",
+",. c #DA7348",
+"<. c #E2764A",
+"1. c #E4784B",
+"2. c #EB7C4D",
+"3. c #F17F4F",
+"4. c #2F8F10",
+"5. c #29A318",
+"6. c #3E843C",
+"7. c #759A0E",
+"8. c #6A8813",
+"9. c #729513",
+"0. c #759A13",
+"q. c #799E13",
+"w. c #77981A",
+"e. c #7CA20F",
+"r. c #7DA313",
+"t. c #7FA813",
+"y. c #4F9525",
+"u. c #41893E",
+"i. c #618D27",
+"p. c #3C8749",
+"a. c #378655",
+"s. c #3B8C54",
+"d. c #34835A",
+"f. c #3E9255",
+"g. c #318260",
+"h. c #428E46",
+"j. c #459343",
+"k. c #499A46",
+"l. c #44944B",
+"z. c #469A4E",
+"x. c #499E4C",
+"c. c #429552",
+"v. c #469B52",
+"b. c #459C54",
+"n. c #4CA649",
+"m. c #4EA54B",
+"M. c #51A74B",
+"N. c #51AA4D",
+"B. c #4AA353",
+"V. c #57AC52",
+"C. c #54B151",
+"Z. c #68B25B",
+"A. c #658571",
+"S. c #72B567",
+"D. c #8CAE0F",
+"F. c #86B20C",
+"G. c #8AB30E",
+"H. c #85AC12",
+"J. c #84A916",
+"K. c #87B411",
+"L. c #8BB312",
+"P. c #8DB916",
+"I. c #8CB41A",
+"U. c #8EBC19",
+"Y. c #93B519",
+"T. c #91BE1B",
+"R. c #A8AC18",
+"E. c #829F38",
+"W. c #89AA29",
+"Q. c #92B726",
+"!. c #99BB34",
+"~. c #ADB326",
+"^. c #D99B1B",
+"/. c #F09319",
+"(. c #C7A118",
+"). c #ED942C",
+"_. c #CFAC30",
+"`. c #EEA43B",
+"'. c #93C11E",
+"]. c #96C421",
+"[. c #9BC52C",
+"{. c #9DC13D",
+"}. c #A0C13F",
+"|. c #98A264",
+" X c #C88844",
+".X c #F1894B",
+"XX c #F19E4A",
+"oX c #F6A84C",
+"OX c #F1AB52",
+"+X c #D19965",
+"@X c #F5AD63",
+"#X c #ECB56F",
+"$X c #F7B467",
+"%X c #F6B26B",
+"&X c #F4B675",
+"*X c #A9C854",
+"=X c #87C271",
+"-X c #B8D271",
+";X c #F9D053",
+":X c #D0C76F",
+">X c #FDD965",
+",X c #FCCF7B",
+".%.O.+.r 1 k.X 6.M.n.N.6.# CXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX0 c N.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.B.T # k f.m.n.I X L.L.L.G.L.L.L.L.L.G.H.t.D.L.L.L.",
+"L.L.L.L.L.L.L.q.J.L.L.L.L.L.L.L.L.- @.2.1.1.1.:.%.} [ r o 1 J l.M.m.x.L o CXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXSXW J p.M.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.v.@ G f.m.M.h.# L.L.L.L.P.P.L.K.I.L.L.K.L.L.L.L.",
+"L.L.L.L.L.L.J.9.q.D.L.L.L.L.L.L.G.d #.1.1.1.1.1.=.*.} [ & o p.B.M.M.p.k Q SXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXKXSX# b m.M.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.M.@ k s.x.M.k.X L.L.L.T.T.'.U.P.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.H.w.H.L.L.L.L.L.L.L.F.>.2.1.1.1.1.1.3.%.[ %.p # n.N.M.N.v : aXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXbX- 6.N.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.@ k T a.M.n.# L.L.D.T.T.].'.P.G.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.q.H.L.L.L.L.L.L.L.H.:.2.<.1.1.1.1.2.e i p * Y n.m.M.M.c - iXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXHXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXHXfX* K z.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.$ k T s.M.u.# L.L.L.P.T.U.P.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.V ,..X<.1.1.1.1.1.@.a ; @ v.m.m.M.M.v : iXFXHXHXHXHXHXHXHXHXHXFXHXHXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXHXHXHXHXLXbX p.N.n.m.m.m.n.m.m.m.m.m.m.m.m.m.m.m.m.N.m.@ x g.a.N.k., L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.+ :.<.<.1.1.1.1.2..Xd 1 m.m.m.m.N.v - pXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXCX7X1 k.m.m.m.m.m.m.m.m.m.m.m.m.z.m.m.m.m.m.m.m.@ 8 I s.M.k.h L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.V >.1.1.1.1.1.1.1.3.d , m.m.m.m.N.v : iXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXFXSX$X%X%X%X%X@X$XMXHXHXHXHXHXHXHXLX8XX g.m.m.m.m.m.m.m.m.m.m.m.m.x.T n.m.m.m.m.m.m.* 8 s.N.j.V L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.J.:.1.1.1.1.1.1.1.1.>.f , m.m.m.m.N.v : iXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXHXHXHXHXFXnXtXlXlXlXlXlXlXlXlXlXlXzXFXHXHXHXHXPX0XX z.m.m.m.m.m.m.m.m.m.N.N.b.d.z.n.m.m.m.m.m.m.@ c l 2 C.k.8.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.I.K.L.L.L.L.L.L.L.L.L.L.:.2.1.1.1.1.1.1.1.1.o.@ N.m.m.v.v.v : pXFXHXHXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXKXMX&XlXtXlXzX&X&X&XtX#X&X&X$X&XtXnXKXHXLX0X~ c n.m.m.m.m.m.m.m.m.m.v.m c f.m.m.m.m.m.m.m.f.@ m 6.l z x.9.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.K.K.K.K.K.K.K.L.L.L.L.L.L.L.L.K.#.,.1.1.1.1.1.1.,.2.[ < m.m.m.R f.v : iXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXnXtXzX&XzX&XtXlX@X#XzX%XZXlX$XtXtX%XnXHXCX( g C.n.m.m.m.m.m.m.m.m.j.P 9 1 M.m.m.m.m.m.m.n.T o n C.m , m J.H.J.L.L.L.D.L.L.L.L.L.L.L.L.L.L.",
+"L.L.K.T.T.P.P.P.L.L.L.L.L.L.L.L.L.- @.2.1.1.1.1.1.1.2.o.@ N.m.N.L P v : aXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXMXtXzX&X%XCX&X$X%XzX&X%X%XtXtX%X%X$X$X%XHXA g N.n.n.m.m.m.m.m.m.m.N.1 8 d.m.m.m.m.m.m.m.m.T # v N.N.6.= r.q.q.G.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"P.K.K.].T.'.'.L.L.L.L.L.L.L.L.L.L.: @.2.1.1.1.1.<..X.Xo.@ s.m.N.8 c v - aXdXSXHXHXHXHXHXHXFXHXHXHXFXHXHXHXHXHXHXKXnX&XzX&XtXtX&X&X$X$XCXtX%XtXtX@X%XtXtX$XMX/ b u.M.n.n.m.m.m.n.N.N.d.2 x J I a.M.n.m.M.m.m.m.k.1 n k.M.N.n.m w.9.q.K.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.K.T.T.T.T.L.L.L.L.L.L.D.L.L.L.8.@.3.2.2.1.2.1.@.o.t % I m.N.1 z m 0 -.9XZXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXzX@X@X@X#X#X@X@X@X@X#X#X@X#X&X@X@X%X&XtX8Xl 6.C.M.m.m.m.m.n.n.p.c k 8 k J d.c.m.m.m.m.m.m.p. u.N.m.m.m.k.h 9.H.K.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.P.L.L.L.L.L.L.L.L.L.L.L.L.L.I.@.,.>.>.>.>.,.> . % F m.N.2 l f.9 . 8XZXFXHXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXtXXXXXXXXXXXXXXXXXXXXXXXXXXXOXOXOX@X@X#XX 6.N.m.m.m.m.m.m.n.p.F . . . 7 Y Y m.m.m.m.m.v.K @ u.N.M.m.m.k.# H.D.L.L.L.L.L.L.L.L.L.P.T.L.P.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.w O . . o . S D D p # n.N.1 z B.G O 9XpXVXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXtX.X X X X X X X X X X X X X X X X X X- I n.m.m.m.m.m.m.N.f.j & S S } { { t @ N.N.m.m.N.6.# u.M.m.m.m.M.k. L.L.L.L.L.L.L.L.L.L.T.T.].'.P.D.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.W.C & p i i i D %.*.f X p.N.2 @ c p.O 9XuXCXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXnX XN u N N u y u u u N u u y y u N u X p.m.m.m.m.m.m.m.N.z s @.;.;.r > [ [ y i 2 P m.m.x.L o k.M.m.m.m.m.x.m J.L.L.L.L.L.L.L.L.L.P.].'.T.U.L.",
+"L.K.P.G.K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.' 5 %.&.%.%.f f [ y > x P q : 0 v O 4XuXNXAXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXFX#.X.X.u N N B N B B V V V N N N X.B X k.m.n.m.m.m.m.m.B.1 y .X3.,.r > f } *.D . K f.x.p.k 2 x.M.n.m.m.m.m.V.9.L.L.L.L.L.L.L.L.L.L.T.P.K.P.L.",
+"P.'.G.P.L.L.L.L.L.L.L.L.L.L.L.P.L.L.H.( r O.&.{ } ; . > >.. p &.p & _ wXyXNXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXhXn.5.V M V N B B B B V 5.4.4.M B B B o.@ k.m.m.m.m.n.m.m.d.6 d 3.1.1.2.2.=.D %.[ + K T T j * m.m.m.m.m.m.m.n.M.8.L.L.L.L.L.L.L.L.L.L.G.L.K.K.L.",
+"T.'.T.'.L.L.L.L.L.L.L.L.L.L.L.L.K.K.I.% . + . + + o.:.$.:.:.X p D &.i # K - 4XuXiXbXHXHXHXHXHXHXHXHXHXHXFXHXHXHXZ.hX=Xi.4.4.4.w.V y.5.y.V y y y 5.5.y.h L n.M.s.f.m.m.m.m.1 f ,.1.1.2.<.<.<.f > +.[ = K j 2 j.m.m.m.m.m.m.m.m.m.V L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"].T.T.U.G.L.L.L.L.L.L.L.L.L.D.L.P.U.w r d d f d f :.3.1..X:.. S &.D S 5 8 -.wXuXaXVXHXHXHXHXHXHXHXHXHXHXHXHXHXHXKXzX+.X.] 4.] ..] V ] .. .| | N 4.X.e c.m.m.Y p.N.m.n.N.@ o.3.1.1.<.<.<.2.#.f [ O.i 0 8 b N.m.m.m.m.m.m.m.m.M.h L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"P.P.L.L.L.L.L.L.L.L.L.L.L.L.L.L.K.'.U.o.,..X.X2..X1.1.1.1.>.> p D D &.S _ wXuXyXpXAXHXHXHXHXFXHXHXHXHXHXHXHXHXMX@X .| .] | .| | | | .| | | ] | ; m.m.M.b P n.n.m.h.1 @.2.1.1.1.1.1.1.2.>.%.{ %.& j f.n.m.m.m.m.m.m.m.m.m.2 G.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.K.U.Q.( a 3.1.<.1.1.1.1.1.1.,.; p &.&.S _ 5XuXuXuXiXFXHXHXHXHXHXHXHXHXHXHXHXMX;X>XoX).).XX)./.).).).^.`.).).).`.oX1 M.m.N.1 l N.m.k.X #.1.1.1.1.1.1.1.1.1.;.&.} &.& l N.m.m.m.m.m.m.m.m.m.M.V L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.K.!.-.d 1.<.1.1.1.1.1.1.1.; p &.S q rX - -.aXuXuXuXdXAXLXHXHXHXHXHXHXHXHXHXMX;X;XOXzXtX&X>X;X;X>X>X>X>X>X;X>XOX#X, M.M.2 c l.N.N.k.o @.2.1.1.1.1.1.1.1.1.:.&.{ O.; z N.m.m.m.m.m.m.m.m.m.N.7.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.P.> .X,.1.1.1.1.1.1.1.$ i S s -.H.W.^ ( 4XpXuXuXeXfXSXHXHXHXHXHXHXHXHXHXGX;XOXXXtXnXtX&X,X;X;X>X>X>X>XOXlXlX+X@ v.M.# n N.m.m.p.o #.1.1.1.1.<.1.1.1.1.$.p { O.; z C.m.m.m.m.m.m.m.m.m.l.e.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.W.t ,.<.1.1.1.1.1.1.1.; p 5 ' L.L.L.L.' A yXuXuXuXeXVXFXFXHXHXHXHXHXHXHXHXxX@X)..X#X#X#X%X@X;X;X;X>X>XXXXX#X+X= Y j.O v N.m.x.K + #.1.1.1.1.1.1.1.1.2.@.+ { +.; z C.m.m.m.m.m.m.m.m.n.T H.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.I.L.; ,.1.1.1.1.1.1.,.; ' D.I.L.L.L.L.7Xs aXiXuXuXuXpXdXKXHXHXHXHXHXHXHXMXSXnXzXzXzXzXzXzXnX>X;X>XnXzXgX+X+X_ X . m N.N.u.$ :.<.1.1.1.1.1.1.1.1.1.@.+ { +.; z N.m.m.m.m.m.m.M.n.n.T D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.P.L.& 1.1.1.1.1.1.1.2.; ' !.L.L.L.L.L.L.!.-.Q iXuXuXuXyXaXfXfXFXKXHXHXHXHXHXHXHXHXHXHXHXFXHXHXxX>XMXHXHXdXuXeX2XA A O J B.B.L . ,.3.1.1.1.1.1.1.1.1.1.@.+ { } ; z N.m.m.m.m.m.m.n.M.n.d.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.D.Q.C @.<.1.1.1.1.1.@.C L.L.L.L.L.L.L.L.P.K.W -.eXuXyXuXyXyXeXCXZXZXAXHXHXHXHXHXHXHXHXHXHXHXHXxXMXHXHXHXNXiXuXeX5X5Xq 9 L m k 0 @.@.>.1.1.1.1.1.1.1.2.@.+ { &.; z N.m.m.m.m.m.m.n.n.f.K L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.= #.1.<.,.1.:.X L.L.L.L.L.L.L.L.L.K.L.L.= 8XeXyXyXuXuXuXuXuXyXfXHXHXHXHXHXFXHXHXHXHXHXHXHXHXHXHXHXHXfXuXuXiXiX3X5 o 4 #..X@.; > L.L.L.L.L.L.L.L.L.L.I.L.L.D.0 _ eXpXuXuXuXuXuXuXpXaXaXaXaXaXVXKXHXHXHXKXHXHXHXKXHXHXHXFXFXCXeXpXeX ; d .X3.1.1.1.2.@.+ { ; k c.M.M.m.m.m.n.n.z.L 4 }.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.G.L.L.L.L.D.L.L.L.L.L.L.L.L.L.L.L.P.I.I.r.0.f f / |.W.L.L.L.L.G.F.L.L.L.L.L.L.L.L.L.A Q _ 9XuXuXuXyXuXyXyXuXyXyXyXdXbXbXVXVXbXNXbXVXbXVXVXVXVXVXNXiXyXuXwX3X3X3X.o.; { + . 8 T R x.B.T T Y Y J q.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.G.7.7.q.J.G.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.w.L.G.L.L.L.L.L.G.G.kXUX*XT.K.L.L.L.L.L.L.L.L.L.$ & [ } } } &.p > e & ; { ; f [ > 9 E E T T I 9 W !.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.G.L.e.J.H.J.G.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.I.L.L.L.L.L.L.L.[.mXMX`.xX-XK.P.L.L.L.L.L.L.L.L.L.L.J.( ^ ~ A ) -._ 5X5X5X9X5XpXiXaXuXuXaXuXuX9X9X5X5X5X_ A ~ ^ L.L.: 2.1.d t f [ } %.%.i O . f [ . [ +.r < Y I I I k H P.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.G.I.L.G.Y.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.T.*XUXGXPXQ.t.K.L.L.L.L.L.L.L.L.L.L.L.L.L.I.0.= = + ) 1.1..Xd . > { { { %.; r +.[ . [ +.r * F F F F - L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.G.L.!.-X-XcXQ.G.L.L.r.J.L.L.L.L.L.L.L.L.L.L.L.L.L.D.L.J.7.9.8.V V h h $ $ h M V V 8.9.q.J.P.L.L.L.K.t ,.1.1.1.,.,.o.. . { +.e e +.{ . [ +.r * J F o K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.D.L.L.L.L.L.L.L.L.L.L.G.G.K.F.F.G.L.L.J.w.r.L.L.L.L.L.L.L.L.L.L.L.L.L.G.L.L.D.L.L.Y.D.D.D.'.'.L.F.L.G.D.L.L.L.L.L.L.L.P.t .X1.1.1.1.2.:.o.o.r e i f %.f . f *.> o < 4 H.I.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.H.9.r.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.G.G.P.'.G.L.L.K.K.L.L.L.L.L.L.L.J.t 2.1.1.1.1.<.1.3.1.+ + p &.D S . S &.5 - A J.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.7.J.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.G.D.L.T.L.L.L.R.R.L.L.L.L.L.L.L.E.t 3.1.1.1.1.1.1.1.,.+ p &.&.&.S o S &.5 ( K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.D.D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.I.L.D.^./.Y.G.F.P.K.K.L.L.t 2.1.1.1.1.1.1.2.<.+ p &.p & o O + ' !.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.^./././.`.oX~.K.G.L.L.E.t 3.1.1.1.1.1.1.>.d 5 D p ; 4 L.L.D.W.Q.D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.(./.,XnXOXoX~.K.L.L.L.J.t 2.1.1.1.1.1.2.#. S D i 0 J.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.D.",
+"L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.Y.`.lXzX).~.G.L.L.L.L.L.t .X1.1.1.1.1.1.:. o t.K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"P.U.L.K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.~.oXoX/./.R.K.L.L.L.L.L.L.> t <.3.2..X#.> U.J.9.G.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"T.'.K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.R.Y.R.^.R.G.L.L.L.L.L.!.L.L.o.o.o.o.d o i.U.9.w.D.I.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"].'.K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.D.L.L.L.L.L.L.K.L.L.Y.Y.L.L.L.L.L.L.L.L.L.L.D.e.M V H.L.Q.T.J.9.L.L.L.L.L.L.L.L.L.L.L.L.Y.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.",
+"'.T.L.L.L.L.L.L.L.D.Y.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.K.K.I.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.G.D.L.L.L.L.L.L.L.L.L.L.L.G.L.L.L.L.L.L.H.J.L.L.L.L.L.L.L.L.L.L.L.D.D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L."
+};
diff --git a/textures/wall.xpm b/textures/wall.xpm
new file mode 100644
index 0000000..d754e24
--- /dev/null
+++ b/textures/wall.xpm
@@ -0,0 +1,347 @@
+/* XPM */
+static char *result[] = {
+/* columns rows colors chars-per-pixel */
+"128 128 213 2 ",
+" c #030303",
+". c #06050B",
+"X c #0A080A",
+"o c #0C0B0B",
+"O c #110E0D",
+"+ c #14120E",
+"@ c #0D0C13",
+"# c #0B0A15",
+"$ c #110E12",
+"% c #110E19",
+"& c #151314",
+"* c #191615",
+"= c #171817",
+"- c #1B1916",
+"; c #15131B",
+": c #1A161B",
+"> c #1C1A1C",
+", c #201D1D",
+"< c #22211B",
+"1 c #151321",
+"2 c #1A1623",
+"3 c #1D1B23",
+"4 c #1E1B29",
+"5 c #211D23",
+"6 c #221E2A",
+"7 c #241D32",
+"8 c #242225",
+"9 c #292726",
+"0 c #25222B",
+"q c #29262C",
+"w c #2C292D",
+"e c #312F2C",
+"r c #262331",
+"t c #2A2633",
+"y c #2D2B34",
+"u c #2C263B",
+"i c #2D2A3B",
+"p c #312E35",
+"a c #322E3B",
+"s c #333135",
+"d c #35333C",
+"f c #39353D",
+"g c #3A393D",
+"h c #2A2644",
+"j c #332E41",
+"k c #352F48",
+"l c #363342",
+"z c #3A3543",
+"x c #3D3B44",
+"c c #37334D",
+"v c #3B354B",
+"b c #3E3B4A",
+"n c #3B3454",
+"m c #3E3952",
+"M c #3F3B58",
+"N c #413D44",
+"B c #423D4C",
+"V c #433E53",
+"C c #443B5B",
+"Z c #424145",
+"A c #484344",
+"S c #45424C",
+"D c #49464E",
+"F c #4A494C",
+"G c #464252",
+"H c #4A4555",
+"J c #4C4A55",
+"K c #464059",
+"L c #4C465A",
+"P c #4D495B",
+"I c #514D56",
+"U c #50475E",
+"Y c #514B5C",
+"T c #545456",
+"R c #55525D",
+"E c #59545D",
+"W c #5A595E",
+"Q c #4D4760",
+"! c #4F4A61",
+"~ c #524D62",
+"^ c #554F67",
+"/ c #565263",
+"( c #5A5464",
+") c #5C5965",
+"_ c #575268",
+"` c #5D566B",
+"' c #5D596B",
+"] c #5F5771",
+"[ c #5F5B71",
+"{ c #615D65",
+"} c #60576D",
+"| c #615C6D",
+" . c #615C71",
+".. c #645E79",
+"X. c #646466",
+"o. c #64626D",
+"O. c #69656E",
+"+. c #656173",
+"@. c #696575",
+"#. c #6C6975",
+"$. c #666378",
+"%. c #6B667A",
+"&. c #6D697A",
+"*. c #716C75",
+"=. c #726E7E",
+"-. c #757479",
+";. c #75727D",
+":. c #7B7B7D",
+">. c #736F81",
+",. c #757182",
+"<. c #797484",
+"1. c #7D7B85",
+"2. c #767289",
+"3. c #7B7589",
+"4. c #7E7A8A",
+"5. c #817C85",
+"6. c #817C8D",
+"7. c #837D92",
+"8. c #828285",
+"9. c #85838D",
+"0. c #89848E",
+"q. c #8A8A8C",
+"w. c #868295",
+"e. c #898596",
+"r. c #8D8A95",
+"t. c #868298",
+"y. c #8A849A",
+"u. c #8E8A9C",
+"i. c #918C99",
+"p. c #918B9D",
+"a. c #939395",
+"s. c #94919D",
+"d. c #98949C",
+"f. c #9B9B9E",
+"g. c #8E85A0",
+"h. c #8F8AA0",
+"j. c #918CA1",
+"k. c #968EA7",
+"l. c #9793A4",
+"z. c #9993A5",
+"x. c #9D9AA5",
+"c. c #9693A9",
+"v. c #9B95A9",
+"b. c #9E9BAB",
+"n. c #9F9CB0",
+"m. c #A19CA6",
+"M. c #A19DAD",
+"N. c #A19CB1",
+"B. c #A1A1A4",
+"V. c #A4A1AD",
+"C. c #A8A5AE",
+"Z. c #AAAAAD",
+"A. c #A5A2B1",
+"S. c #AAA5B4",
+"D. c #ACA9B4",
+"F. c #A6A3B9",
+"G. c #ADA5BA",
+"H. c #AEAAB9",
+"J. c #B0AFB5",
+"K. c #B2ADBC",
+"L. c #B4B4B6",
+"P. c #B5B1BE",
+"I. c #B9B6BE",
+"U. c #BBBABC",
+"Y. c #B4AEC1",
+"T. c #B6B2C0",
+"R. c #B9B5C3",
+"E. c #BDBBC3",
+"W. c #BAB5C9",
+"Q. c #BEBBCA",
+"!. c #C2BDC6",
+"~. c #C1BDCB",
+"^. c #C3BDD1",
+"/. c #C2C2C5",
+"(. c #C5C3CB",
+"). c #C9C6CE",
+"_. c #CCCBCE",
+"`. c #C6C2D2",
+"'. c #C9C6D4",
+"]. c #CECDD3",
+"[. c #CCC6DB",
+"{. c #CFCCD9",
+"}. c #D0CFD5",
+"|. c #D1CEDA",
+" X c #D1D1D4",
+".X c #D4D3DA",
+"XX c #D9D6DE",
+"oX c #D7D8D9",
+"OX c #D9D9DC",
+"+X c #D3CDE1",
+"@X c #D6D1E2",
+"#X c #D9D5E2",
+"$X c #DDDBE3",
+"%X c #DAD5E8",
+"&X c #DEDAE9",
+"*X c #E1DDE6",
+"=X c #E3DEEA",
+"-X c #E4DFF3",
+";X c #E3E2E6",
+":X c #E5E3EB",
+">X c #E9E6ED",
+",X c #EBE9EE",
+".T G P P J J G = g _.}. X X].}.}.}.}.}.}.].}.}.}.}. X}.}.}. X].]. X}.}.}.}.}.}.}.}.}.}. XoXU.X.q g ]..X X X}.}.}.}.}.}.].}.}.}.}.}.}. X X}.oXo.G P J P P P P P P T s = b P G 1.8X$X].}.}.}.|.}.}.}.}.}.|.",
+"|.}.}.}.}.}.}.|.}.}.}.|.}.}.}.|.{.}.}.}.{.}.}.}.oXQ.r.$.G P P P P P T 3 g _.}. X X}.}.}.}.}.}.}. X X}.}.]. X}.}.]. X X X}.}.}.}.].}.}.}.}.}.}. XoXV.) g 8 (..X}. X].}.}.}.}.}.}.}.}.}.}. X X]. X}.6XC.h _ P P P P P P P P d = g T J G 2X2X}.|.|.}.}.}.}.}.].].}.",
+"}.}.}.}.}.}.}.}.}..X.X{..X{.}.}.{..X}.}..X}.}.}.].c.1.' P P P P J P J 8 g }.]. X X}.}.}.}.}.}. X}.}. X].}. X}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}. X}.oXr.W S 3 /..X}.}.}.}.}.}.}.}.}. X}.}.}.}.]. X]. X;X$X! M P P P P K P P P Z = 0 P P b _.9XoX|.|.}.}.}.|.|.}.}.}.",
+"}.}.}.}.}.}.{.}.}.{.{.}.}.}.{.}.{.{.}.{.}.}.}.}.F.9.,.P J P P P P G J 0 g }.}. X}.}.}.}.}.}.}.].}.}. X}.}.].}.}.}.}.}.}.].}.}.}.}.}.}.}.}.}.}.$X;X' X.J 4 E.oX}.}.}.}.}.}.}.}.}. X].}.}.}. X]. X X X8X2.c P P G P P P ! P S = = Z P b s.9X;X}.}.}.|.}.|.}.}.].}.",
+"}.}.}.}.}.{.}.}.{..X}.}.}.}.}.}.}.}.}.}.}.}.}.U.q.q.$.P P P J J P P T 0 Z X X X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.]. X}.}. X X}.}.}.}.}.}.}.].&X9XB./ o.T 3 L.oX}.}.}.}.}.}.}.}.}.}.}.}.}.}. X].]. X_.2XQ.b J P P K ! ! P P K y = w J b [ 6X9X}.}.}.}.}.}. X].}. X",
+"oX}.}.}.}..X}.}.}.}..X{.}.{.}.}..X}.{.}.}.}.(.u.t.2.[ P P J P P P J P y g X}. X].}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.]. X}.}.}.&X0X.X) ) [ / 1 Z.oX].}.}.}.}.}.}.}.}.}.}.}.}.}.]. X X X XoX3XX.M ! G P P P P P P G 3 = r P G Q.9X$X}.|.}.}.}.}.].}. X",
+"].}.}.}.}.}.}.}.}.{..X}..X{.{.{.}.F.Q.}.}.}.n.8.8.&.[ P J P P P P J P y x X}.}. X X}.}.]. X X X}.}.}.}.]. X}.}.}.}.}.}.}.}.}.}.].].}.}.:X0X2X<.W ' ' ) 1 s.oX}.}.}.}.}.}.}.}.}.]. X}.}.}.}.].].}. X_.;X.Xh G P P P P P P P P d 3 = i l 1.8X8X.X|.}.|.}.}.}.}.}.",
+"}.}.}.}.}.}.}.}.}.}.{.}.}.}.}.oXc.a..X{.}.P.w.q.2.$._ P M P P P P J R y x X}. X}.}.}.}.}.}.].}.}.}. X].}.}.}.}.}.}.}.}.}.}.}.}.].]..X2X0X2X8.R [ X.' X.r +..X}.}.}.|.}.}.}.}.}.}.}.}.}.}. X X}.}.}. X_.,XL.y P P K P P P P P P Z i 1 r i ].9X,X].}.|.}.}.}.}. X",
+"oX].}.].}.}.}.}.}.}.}.{.}.}.oXF.W (.}.{.W.t.w.t.2.$._ P P P P P P P R y Z X X X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.].}.}.}.}.].OX6X0X:X1.R [ ) [ ) o.d g _.|.|..X.X}.|.}.}.}.}.}.}.}.}.}.}.}.}.}. X X X2XB.i P ! P P P P J P P G g 4 1 / 2X9X$X|.}.}.}.}. X X",
+"]. X].}.}.}.}.}.}.}.}.}.}.oX/.Z q.oX.X`.u.t.t.4.&.&._ P P P P P P P P y Z X X X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X X}.].}. X:X9X0X}.,.R o.{ [ X.[ [ Z 4 A..X{.}.|.}..X}.}..X}.}.}.}.}.}.}.}.}.}.}. X}.}.:Xa.h P G P P P P P P P P b 4 i c.8X8X$X}.}.}.]. X].",
+" X].].}.}.}.}.}.}.}.}.{.{.`.$.Z W..X(.t.q.t.u.2.$.&._ P P P P P P P P s J oX}.].}.}.}.}.}.}. X X}.}.}.}.}.}.}.]. X}.}. X}._.#X4X0X0XD.) ) ' X.' ' [ ' X.J # X.].{.{.].}.}.{.|.{.}.}.}.}.}.}.}.}.}.}.}.}.}.].].:XV.h G P P P J P P J P P i l G b.9X9X:X}.}.}.}.}.",
+" X X].].}.}.}.].].].}.oX;Xc.g $.}.T.a.9.t.t.t.&.$.&._ P P P P P P P P d :.$X}. X}.}.}.}.}.}.}. X].}.}.}.}.}.}. X X X].].}.;X0X0X.Xt.P [ [ ' ' [ X.[ ' [ R # F B.}..X'.].].].}.}.}.}.}.}.}.}.}.]._.}.].}.].]. X;X9X_.$.S P J P P P P P J G l T G u.6X9X2X$X}.].}.",
+"oX}.}.oX}.}.oX;X-X-X-X%XoX8.M X.c.t.9.t.t.t.t.&.$.&.[ P P P P P P P J d f.;X]. X}.}.}.}.}.}. X X X X}.}. X X]. X].]. X$X6X0X2XV.o._ [ o.[ [ ' ' X.[ X.[ / ; x a.L..$.&.$./ P ! P P P P P i d s.r.9.r.c.x.x.x.l.s.u.t.w.t.h.h.k.h.j.y.K.0XV.( [ [ +.[ [ [ [ [ [ [ ' [ [ o.[ o.F X.f.c.c.s.c.s.c.c.l.l.c.c.c.c.l.l.s.c.s.c.c.s.c.f.a.c.c.c.oX! M ! P P P P P g g ! P ' t.t.w.9.t.t.",
+"q.t.t.t.t.t.t.t.t.t.9.t.t.t.t.t.w.w.w.w.w.w.t.1.$.$.>.) M P P P P P P y d s.a.u.r.r.r.r.w.r.u.u.h.h.h.h.h.h.h.h.u.Y.0Xb.` .[ [ ' .[ . . . . .[ [ [ [ [ F X ) c.s.c.f.c.c.s.f.s.c.s.s.l.s.l.c.c.s.f.c.c.s.c.s.c.c.a.a.}.P c ! ! P P P P s i P P _ t.u.t.t.t.t.",
+"4.t.t.t.t.t.t.t.t.t.t.t.w.w.w.t.w.w.t.w.w.t.t.2.$.$.$.' P P P P P P P y d s.s.u.u.u.a.r.u.u.h.h.j.p.j.j.k.h.h.h.u.H.0Xl.` [ [ . . .[ .[ . .[ [ [ +.[ o.J o J c.f.c.l.s.c.s.c.c.c.s.c.l.s.l.s.s.c.s.s.c.s.c.c.a.c.c.a. X' M ! ! P ! P P r s P M ' t.t.t.t.t.t.",
+"t.t.t.t.t.t.t.t.t.4.t.t.t.t.w.w.t.w.w.t.r.t.t.&.&.&.$.' P P P P P P P r j s.a.u.u.u.r.u.u.u.h.h.u.j.p.u.h.h.h.k.y.S.0Xs._ ] .[ | . .[ .[ [ .[ [ [ [ [ R & Z l.l.c.s.l.l.l.l.l.l.c.c.f.c.l.c.c.c.c.c.s.c.c.s.c.c.c.u. X' c ! ! P ! ! P 0 i T P [ t.t.t.q.t.t.",
+"w.t.t.t.t.t.t.t.t.t.t.t.t.t.q.t.t.w.w.w.t.w.2.&.$.&.$.o.P P P K P ! P r s c.u.u.u.i.p.p.s.u.j.h.p.h.j.j.j.j.h.j.h.A.0Xs.` [ [ [ [ .[ .[ .[ .[ [ [ [ [ T = w a.f.c.c.c.l.l.c.l.f.c.c.l.l.l.l.f.c.c.s.c.c.s.c.c.f.c.u.]./ M ! P ! ! P M 8 s J P [ u.t.t.w.t.t.",
+"9.w.t.t.t.t.t.t.9.t.t.t.t.t.t.t.w.t.t.w.w.2.$.&.&.$.$.$.! P P P P P ! 0 s u.s.u.u.i.i.p.u.u.u.j.j.u.u.j.h.h.j.h.h.b.0Xx.` [ ..[ | [ .[ . . .[ [ [ o.[ +.l = = r.c.c.s.s.c.s.c.s.c.c.s.l.l.l.l.c.c.s.c.c.f.c.s.c.c.c.a.Q./ M ! ! M P ! F < 0 J M $.h.t.w.t.t.t.",
+"w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.1.&.&.$.$.&.$.$./ P P P P ! ! 0 i u.u.h.p.p.p.p.p.p.j.u.j.j.j.h.j.h.h.j.h.c.9Xb.` [ [ . .' [ . .[ . .[ [ ' +.L 3 > O :.c.c.s.s.c.f.c.l.l.s.c.l.l.c.s.s.c.c.s.s.c.c.s.c.a.c.c.t.! ! ! ! P ! ! Z = 8 Z P $.h.t.t.t.t.t.",
+"9.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.7.,.$.&.$.$.$.$.$.&.' P P P P P P 4 y s.s.h.p.p.p.p.i.u.j.j.u.j.h.j.h.j.j.h.h.l.9XV.^ [ [ [ | .[ .[ | [ ' [ ' +.I 8 > , & R b.c.c.c.s.c.c.s.c.s.c.l.l.c.l.s.c.c.c.f.c.s.c.c.c.f.c.$.M ! ! P ! P P l = = g T &.u.t.t.t.9.t.",
+"9.w.w.t.t.t.t.t.t.t.t.t.t.t.t.c.w.>.&.#.$.$.$.&.&.$.$.$.[ L L P U U U 7 a m.7.z.p.p.k.i.p.p.p.p.h.p.h.j.j.h.h.j.g.i.4XP.^ } } . .[ [ .' | [ | .o.J 5 > - * & 0 t.n.c.c.c.l.l.l.s.c.l.l.l.s.c.c.c.f.c.s.c.s.c.c.c.f.t.P ! ! P P ! P Y q * , , g 4.h.t.t.t.w.r.",
+"9.w.w.t.t.t.t.t.t.t.t.t.t.t.t.X.y J $.$.#.&.&.$.$.$.&.&.[ L L P U U U 5 p 7.m.7.p.p.7.p.p.p.k.p.p.j.j.u.h.j.j.h.j.r.*X(.^ .... .' . . . . . .' { Y > = - > 9 q = 0 1.b.c.c.x.c.c.c.c.l.c.s.c.c.s.c.c.s.c.c.c.s.f.c.u./ M P ! P Q P P H 6 , + + 3 P ,.9.t.t.9.r.",
+"t.q.t.t.t.t.t.t.t.t.t.q.1.W s < d [ $.%.$.$.&.&.&.$.%.%.$.P L P U U U q t 7.7.m.7.p.p.p.p.p.p.p.j.u.p.h.j.h.j.j.p.e..X|._ . . . .[ .[ . . . .) 8 & 8 d J ) ) S 0 3 #.r.7.4.t.y.s.s.l.c.x.x.x.x.c.c.c.c.b.n.b.c.4./ K ! P ! P P Q Q V , , 9 q = = = w T #.:.9.",
+"$.$.2.1.1.8.1.1.:.[ T c 3 3 g W &.#.#.$.#.$.$.#.$.&.%.%.%.! L P E C U p f 7.v.7.p.p.i.i.p.p.k.7.j.u.j.p.h.j.j.h.j.w.^.=X_ .. . .| .[ . .| .) 0 & 8 I { | ) ) ' X.S ; 3 j P P P P / ' +.&.2.4.4.9.w.9.r.t.4.2.[ P G P P ! P P Q P L B , ; I O.F = = + o @ = g ",
+"8 4 3 3 8 8 8 3 3 3 3 d T $.&.&.%.%.%.#.$.&.$.&.&.$.&.&.%.^ L P C E U a t 7.z.d.i.p.7.p.p.p.p.p.h.p.h.j.j.h.j.h.j.e.I.5X} } . .| .| .| | ) 5 = 8 Y ' ' ' ' ) ) ' 1.9.J q 3 d P P J G G G G P P P P P ! P G G G P P K P ! K P P P P x , : } *.*.| N 5 > = @ ; ",
+"Z b c g g g Z Z T X.o.&.&.&.$.&.%.%.%.%.%.%.$.%.$.&.$.%.%./ P P E C U N p 7.7.z.7.i.z.p.p.p.p.p.p.j.j.u.h.j.h.j.j.e.A.8X&.} .} | | .| $.) 3 > = J ' ' ( ' ) ' ' ( 4.A.B.r.) 6 ; t b J P P R P P J P G P J J P P P P P P P P P P P J y * : | %.%.&.&...R S b S ",
+"X.#.&.&.&.&.&.&.&.&.&.&.$.>.&.$.%.%.%.%.%.%.%.%.$.&.&.&.%.^ P L U U U B 7 7.z.7.z.k.z.p.p.p.k.7.j.u.p.h.j.h.j.h.j.y.l.2Xp.` ..} [ | | +.( : > ; z ' ) ` ' ' ' ' ' / 3.A.x.V.S.l.&.s % 4 d H ~ P P P P J P P P K P P G P P K P P J P J 8 * q ..%.%.%.>...>.%.&.&.",
+"$.$.&.&.&.$.&.&.$.$.$.$.$.&.&.&.%.%.%.%.%.%.%.$.&.$.&.&.%.^ L P U U E V f 5.z.k.d.7.7.p.i.p.p.k.j.u.j.j.h.j.h.j.j.j.e.XXK.^ } } .' | I ; = > 6 / ' ` ` ' ' ) ' ' ) u.V.B.b.V.V.A.b.1.b 3 ; t S J P P P P K P P P P P P P P P P P J D 8 + f %.>.%.%.%.%.%.%.#.&.",
+"X.&.&.&.$.&.$.#.#.%.%.%.%.%.%.%.%.%.%.%.>.%.%.%.%.%.%.%.%.^ L P U U U U N =.z.i.z.7.z.d.7.z.v.7.v.7.z.7.z.v.k.7.7.v.7.^.^.U @... .{ S 3 > = > G | ` ' _ ' ' ' [ R 3.XXx.M.M.M.x.M.V.C.M.9.Y 4 @ 6 d S P ! P P P K P P P L P P J J J D 8 O I *.%.%.%...5.] 5.] >.",
+"X.$.&.#.$.#.$.&.%.%.%.%.%.%.%.%.%.%.%.%.$.%.%.%.%.%.%.&.%.P P P J U Y Y B } k.i.7.z.7.z.z.7.7.m.z.v.v.7.k.7.k.v.z.v.k.m.|.O.} } ' x & ; 5 * N | ` ` ` ` ' ) ' ' P w..%.>.] >.] ....",
+"$.$.-.$.&.$.$.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.$.L L P U U U Y N E p.p.7.v.i.z.d.7.v.7.7.7.v.v.k.v.7.z.v.7.m.7.J.<.} O.z = 8 s 8 & D | ' ` ` ` ' ' ' ' L w.2XA.M.M.M.M.m.M.M.M.M.B.A.A.l.=.a # @ 3 s P R G J P L L J P J E s O f *.%.%.%...>.5.%.%...*.",
+"X.&.$.&.&.&.$.#.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%. .L L L J U J Y V V r.p.d.7.i.7.7.m.7.m.v.z.z.7.k.7.k.z.7.d.d.7.d.5.V e * 8 S G , $ I | ` ' ` ' ' ' ' ' P w.6XD.b.N.M.M.M.M.M.M.M.M.M.B.V.V.x.<.Z = # 0 P ' / P J P P J R J * + B =.&.%.%.>...%.%.%.%.*.",
+"X.$.&.$.#.&.&.#.%.%.%.%.$.&.&.&.%...%.%.%.>...%.%.%.%.%.^ L P Q I U U I C 6 *.z.z.i.z.d.p.p.r.r.7.7.7.7.7.6.5.5.;.*.*.} V q * * 5 A I J w + J } _ ' [ _ ' ' ` ' ~ 4.6XR.v.N.N.n.M.M.M.M.M.M.M.M.b.B.V.A.M.r.R 3 # 0 J T J J I I F > = = 9 X.#.%.5.%.%.%.5.5.] %.",
+"X.#.&.&.$.$.#.$.%.%.%.%.>.&.$.$.%.>.%.%.%.%.%.%.%.%.%...P L L L U C I U Y 0 a 7.7.6.O.V B f u u p 7 q , - * , , , 5 9 q e q 6 f H Y U U s O D } [ ` ' ' ' ` ' ' / ,.2X!.v.N.N.N.M.M.M.M.M.M.M.m.M.M.M.b.V.V.V.s.o.0 . @ q s e 9 - * < < = 8 I %...%.%.%.] ..%.%.",
+"$.#.&.$.&.$.$.&.%.%.%.$.$.$.>.$.%.%.%.%.%.%.%.%.%.%.%.^ L L P P I U U I V 5 : ( >.*.( V V H D B A H V I D E } *.5.7.7.d.z.d.>.C H J U Y N O N { ' ` ' ` ' ` ` [ / %.6X'.k.N.N.N.M.N.M.b.M.M.b.M.n.b.M.M.M.M.M.A.A.s.#.g & X + - < < < - * - d U %.=.=.%.%.%.%.",
+"X.#.&.&.$.&.&.#.$.%.%.>.%.$.$.&.%.%.%.%.%.%.%.%.%.%.` L L L P P I V U C N } 7.7.i.z.m.m.v.m.z.m.S.7.v.v.v.N.v.v.v.v.m.v.z.N.k.O.H U U Y N , f } ' ' ` ' ] ' ` ` ` | ,X@Xv.N.N.N.M.M.M.M.M.M.M.M.b.V.b.B.b.V.b.b.b.V.F.B.8.X.J g , & o o o = - = , u U @.=.%.@.%.",
+"X.$.-.$.>.$.$.&.&.>.$.$.&.&.&.$.%.%.%.%.%.%.%.%.%...L L P P P P Y U V E e.v.v.d.z.p.d.k.d.z.z.d.z.z.z.z.z.z.k.k.v.z.v.z.z.z.v.7.U Y U Y V , w } ` ' ` ) ` ' ` ' ` / &X*Xv.n.N.n.N.N.M.M.N.M.b.V.V.b.b.M.M.V.b.M.M.M.V.V.V.A.A.b.z.p.7.=.E N w , , + O 9 U } *.*.",
+"$.$.&.&.$.$.$.$.$.&.>.$.$.&.$.&.%.%.%.%.%.%.%.%.%.~ L Y P P Q P Y B } p.v.k.l.l.s.z.z.z.z.z.z.z.v.z.z.z.z.z.z.k.k.v.z.z.z.z.v.k.O.C Y U I 5 , } ' ` ` ` ` ' ' ` ' L .X>Xb.n.N.N.N.N.N.N.M.N.N.b.M.M.V.M.M.b.M.M.M.M.b.M.M.M.M.N.N.N.N.G.N.M.z.7.*.I f * O , V O.",
+"X.$.-.$.>.>.$.$.$.&.$.$.&.$.&.$...>.%.%.%.%.%.%._ L L ! ~ ~ L B N ..p.z.l.l.l.z.j.z.z.s.l.l.l.l.z.z.z.z.z.l.z.z.z.z.k.z.z.k.z.v.5.C Y U U p * Y ' ` } ` ` ' ` ' | H /.,XN.N.N.N.b.N.N.b.N.N.M.M.M.V.b.M.M.M.M.M.V.b.N.b.n.M.M.M.N.M.M.N.M.M.N.S.C.S.m.6.*.N % 6 ",
+"i / $.&.&.&.&.>.>.&.$.&.$.&.&.&.%.%.%.%.%.%.%._ P P P Y K l a ( 7.m.z.z.l.l.l.l.l.z.z.z.l.l.z.l.z.z.z.d.l.l.l.l.z.z.k.z.z.z.k.v.7.^ C U U N * D ' ' ' ` ` ` ' ` .H J.5XF.b.N.N.N.N.N.N.N.n.N.M.M.N.n.M.b.M.M.M.N.M.M.M.M.M.M.N.M.M.M.M.M.M.M.M.m.m.M.S.V.C.7.*.",
+"/ r 4 J &.&.>.$.>.$.$.$.&.$.&.$.%.%.%.%.%.%.` L P ~ L i i P 6.x.m.k.l.l.l.z.l.l.l.l.z.l.l.l.l.l.z.k.z.k.k.d.l.l.z.k.z.k.z.k.k.v.v.} C U U H * f | ` } ` ` ' ` ] ' P l.9XH.n.N.N.N.N.n.N.N.N.b.N.b.A.M.N.A.M.N.M.M.M.M.M.M.M.N.M.M.M.N.M.M.M.M.M.M.M.N.m.M.m.M.C.",
+"n.q.T 4 4 G +.&.>.>.>.&.&.&.&.&.%.%.%.%.%.| P L V t 6 ) 4.x.z.j.p.z.l.l.z.z.z.c.l.l.l.l.l.l.l.l.z.d.z.z.d.z.l.l.l.l.z.k.z.z.k.v.m.=.C U U J 5 7 | | } ` ` ' ' ' [ / w.9XW.v.N.N.N.N.M.N.N.M.A.b.N.b.M.M.b.N.V.M.V.N.M.N.M.M.M.M.M.M.M.M.M.N.M.N.M.M.M.M.M.M.M.M.",
+"B.F.B.u.G = 3 Z / $.&.&.$.$.&.$.%.%.%.&. .L l t r ' w.l.l.l.l.l.z.z.l.l.k.l.l.l.l.l.l.l.l.l.l.l.z.d.z.k.z.z.z.p.l.z.z.z.k.k.z.z.7.5.U U U U q 5 E } ` ` _ ' _ [ ' ` =.9XQ.v.n.N.N.N.N.N.n.N.M.n.M.M.b.N.N.b.b.n.M.M.N.M.N.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.m.m.M.",
+"n.B.n.F.B.X.4 1 1 l T $.>.&.$.&.%.%.&.| a i b %.p.x.l.l.l.d.l.l.l.l.l.l.l.z.k.l.l.z.l.l.v.l.l.l.z.z.d.z.z.z.z.z.l.l.z.z.z.z.k.z.N.5.E U U Y f : D } ` ` [ ` ] ' ' ` ` 8X'.b.N.N.N.N.N.b.N.N.M.b.A.M.A.b.M.V.N.M.M.M.M.M.M.M.M.N.M.M.M.N.M.M.M.M.M.M.M.M.M.M.M.M.",
+"B.V.V.b.V.u./ S 8 & = q J X.&.@. .Y u d R <.v.M.x.d.l.l.l.d.l.l.l.l.l.l.l.x.k.l.l.l.l.l.c.l.l.l.z.z.z.z.7.d.z.z.N.7.v.k.7.G.7.G.v.6.C U U U N , N } } } } } } } } ` Y $X#XM.M.M.M.M.M.M.N.M.N.M.M.b.M.M.N.b.N.M.A.b.n.M.M.M.M.M.N.A.b.N.b.N.n.V.b.N.M.M.M.n.b.M.",
+"b.b.V.V.b.c.o.) ( D = = + = y s 6 x =.r.x.m.l.d.s.z.l.d.l.l.l.l.l.l.l.l.l.c.k.l.z.l.l.l.x.l.l.z.k.z.d.z.N.z.z.v.v.z.k.v.G.7.G.7.v.%.U C U E U 5 6 } } } } } } } } ` P '.,XM.b.M.M.M.M.n.b.V.M.M.b.A.M.N.b.A.V.M.M.M.M.M.b.N.N.b.M.b.M.M.V.M.M.M.N.M.M.N.M.V.M.M.",
+"B.n.b.b.b.V.,./ ' ) I 8 = > Z +.w.l.v.l.l.l.l.l.l.l.l.z.l.d.l.l.l.l.c.l.l.k.v.l.l.l.l.l.l.l.k.l.k.z.z.z.v.z.z.z.z.z.k.v.v.7.G.N.k.O.C U U U U p : E } } } } } } } ` / D.9XS.M.M.b.M.M.M.b.N.M.M.N.b.N.b.N.b.b.N.b.N.M.M.A.V.b.A.M.M.M.N.b.N.N.M.b.N.M.M.M.N.V.n.",
+"B.V.V.b.b.V.r./ ) ) { A + x c.c.x.s.p.l.s.l.d.l.z.l.l.l.l.l.l.l.l.l.l.l.c.k.k.l.l.l.l.l.l.l.l.l.d.k.z.d.z.z.z.z.7.z.S.7.v.G.7.G.7.U U U U U U N * C } } } } } } ` ' ( r.0XK.x.M.N.N.M.M.M.n.V.N.N.V.b.A.M.V.M.n.A.b.M.N.b.N.N.b.V.n.b.V.A.b.M.M.A.b.M.M.M.N.n.n.",
+"b.b.n.V.M.M.b.[ ( ) ) ) 3 Z c.c.l.l.l.l.z.d.l.l.l.f.l.l.l.l.l.l.l.l.l.l.l.k.k.l.l.z.l.l.l.l.l.l.d.z.z.z.7.G.m.v.m.S.v.v.G.7.G.7.O.U U U U U I D 5 a { } } } } } } ` E ;.8X!.x.M.M.M.M.M.b.A.n.b.A.b.M.M.M.b.N.M.N.M.b.N.b.V.N.b.n.b.N.M.M.N.b.N.M.M.n.M.N.N.N.N.",
+"b.V.B.n.b.b.V.1./ ' ' ) F w l.x.l.l.l.l.l.l.x.l.z.l.l.l.z.l.l.l.x.l.l.z.l.x.c.l.l.l.l.l.l.l.l.l.z.z.s.z.S.7.7.M.m.7.G.7.7.G.7.6.C U U U I U C I t 5 } } } } } ` } ` ( { >XXXv.M.A.M.M.M.N.b.V.M.b.n.V.M.n.V.N.M.b.V.A.b.N.N.M.A.M.N.b.A.b.V.A.b.M.M.M.M.M.n.N.N.",
+"B.V.n.n.V.n.A.e._ ) ) ' ) 3 r.x.x.l.z.l.v.l.l.z.l.l.l.l.l.l.z.l.l.l.l.l.l.k.z.l.l.l.l.l.l.l.l.l.l.p.z.z.S.v.m.m.v.N.v.7.N.7.=.H U U C U U U U U N % C { } } ` } } } ( ` OX2Xx.V.b.b.N.N.N.M.b.N.n.M.M.M.M.M.M.b.b.N.M.M.b.A.M.b.M.N.N.b.n.M.N.N.A.b.M.M.M.n.n.N.",
+"B.n.V.n.b.n.A.l.[ _ ' ) ' x / x.d.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.c.l.l.l.l.l.l.l.l.l.z.l.x.k.l.l.z.z.z.7.S.7.7.v.7.v.S.7.*.U U E 6.=.U C U I I C 7 f } ( } ( } ` { | E !.9XC.M.M.M.A.b.M.M.A.b.M.M.N.M.M.N.b.A.A.b.N.M.N.b.M.M.V.b.M.M.M.M.V.b.M.n.M.M.N.N.N.N.",
+"b.n.n.B.n.n.Z.b.$.) ' _ [ J y l.x.l.l.l.l.l.x.l.l.l.l.l.l.l.l.l.l.l.l.z.l.l.z.l.l.l.l.l.l.l.l.l.l.l.l.l.z.l.l.x.z.z.d.v.5.C U ..7.G.7.>.H C H U E p 2 ^ } } { } ' { | I m.0XR.v.N.N.M.M.M.M.N.M.N.b.N.V.n.M.N.N.M.A.b.N.M.b.A.N.M.M.N.b.b.M.A.N.M.M.b.N.N.N.n.N.",
+"B.n.n.V.n.n.n.n.,._ ' [ [ _ d ,.v.l.l.l.l.l.l.l.l.l.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.k.l.l.l.l.z.l.l.l.l.l.l.z.z.z.6.C V <.7.G.7.G.7.E H U U U B 2 N } } { } } ` } I 5.9X|.x.M.b.M.M.M.M.M.M.b.A.N.b.b.V.V.b.M.b.M.N.N.b.b.N.n.M.M.A.A.N.b.b.M.M.A.b.M.N.N.N.",
+"B.V.n.n.n.b.V.n.4._ [ _ ' o.d G x.l.l.j.l.l.l.z.l.l.l.l.c.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.x.l.l.l.l.z.l.z.l.l.l.l.z.z.7.U C >.z.v.7.G.G.v.5.C U U U I q 7 E } } } } } } ( { >X>XM.b.M.M.N.N.b.M.M.M.N.b.A.b.N.M.N.V.N.M.M.N.V.M.N.V.b.N.b.b.N.A.b.N.b.N.N.M.N.N.n.",
+"b.n.b.n.n.V.n.A.t._ ' [ _ [ K t w.z.l.l.j.l.l.l.z.l.l.l.z.l.l.z.l.l.l.x.l.z.l.l.x.k.l.l.l.l.l.l.l.l.l.l.z.l.l.l.m.7.} C 5.v.k.z.G.7.7.v.7.^ H U U U N 2 N { } } } } } | Y /.8XK.x.M.M.M.M.N.M.N.M.M.N.b.n.V.M.b.n.b.A.b.b.A.b.M.M.N.M.M.M.M.M.M.b.A.V.b.n.N.N.N.",
+"B.n.n.n.n.n.V.A.t.' _ ' ' ' ' 2 ) v.s.l.l.l.l.z.l.l.l.l.l.l.l.l.z.l.l.l.l.l.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.m.>.C 6.z.z.z.z.7.7.S.v.v.5.C C U U U 5 6 E } } ] } ` .R i.0X'.x.b.N.M.N.M.M.M.b.A.V.b.N.b.V.n.b.N.M.M.N.V.N.M.M.b.n.M.M.M.n.N.M.N.M.M.M.N.N.N.",
+"n.B.n.V.B.n.n.A.r.[ ' _ ' ' ' b 6 i.l.l.d.l.l.l.l.l.l.l.l.l.l.z.c.l.l.l.l.l.l.l.l.l.l.z.l.l.l.l.l.l.z.l.l.l.l.z.7.( 6.v.z.z.k.k.G.v.v.k.N.7.U U U U U z * N } } ] } } } | ( ,X;XM.M.M.M.M.M.M.M.N.b.N.M.b.A.M.M.b.V.N.b.n.b.b.A.M.A.M.M.M.M.V.b.b.M.M.M.N.N.N.n.",
+"B.n.B.n.V.n.n.V.u.[ ' _ ' _ ) / ; %.v.s.l.l.d.l.l.l.l.l.z.l.l.l.l.l.l.z.l.l.l.l.z.l.l.l.l.l.l.l.l.c.l.l.l.l.l.z.7.7.v.z.z.z.k.z.k.z.k.v.z.7.E U D U U A - < } } ` } } } | H T.9XP.b.M.M.M.M.M.M.M.N.V.M.N.M.N.M.N.N.M.A.M.N.V.b.V.N.M.b.N.M.N.M.A.b.M.n.M.N.N.N.",
+"V.V.n.n.n.V.n.n.r.[ _ ' ' ' ) ) y d d.l.s.d.l.l.l.l.x.l.l.l.l.l.c.l.l.l.l.l.z.l.l.l.l.l.z.l.l.l.l.x.l.z.l.l.l.l.z.z.k.z.k.z.z.z.z.k.z.z.z.k.*.C U U U U e * N } ` } } } ` ~ <.9X].x.b.M.M.M.M.M.M.M.b.n.M.M.M.M.M.M.M.b.M.M.b.N.b.N.b.A.b.A.b.M.M.N.M.M.M.N.n.N.",
+"B.V.n.n.n.n.B.A.u.' _ ' ' ' _ ) J ; <.l.s.s.l.d.l.l.l.l.l.l.l.l.l.l.l.l.l.z.l.l.l.c.l.l.l.z.l.l.l.l.x.l.l.l.l.l.l.z.z.k.v.z.z.k.z.z.k.z.z.v.^.U C C Y I B , 9 { } } } } } } ^ ^.3XM.M.M.M.M.M.M.M.M.N.M.N.V.M.M.N.N.m.N.M.M.M.M.N.b.N.M.A.b.N.M.M.b.M.M.N.N.N.N.",
+"b.n.n.V.V.n.n.A.w.' ' ' ' _ ' ) ) 6 b x.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.x.l.l.l.l.l.z.l.l.l.l.l.l.l.l.z.z.k.v.z.z.z.k.z.z.k.m.-X} V U I U I e + V } ( } } } ( E 7.9X!.m.M.M.M.M.M.M.M.M.M.M.M.M.N.N.m.N.N.M.N.M.M.b.A.M.M.b.M.M.N.b.A.N.b.M.n.n.N.",
+"B.n.n.n.n.n.n.V.,./ ' ' _ ' ' _ { b 4 9.x.l.s.s.l.l.l.l.l.x.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.z.z.z.k.z.z.k.k.z.z.k.z.z.z.v.1X>.N U U U U A + p } } ( ( } { } } @X=Xm.m.M.M.M.M.M.m.m.M.M.M.N.N.m.N.M.N.M.M.N.M.M.M.N.b.b.N.M.n.N.N.M.A.M.n.N.N.",
+"n.B.n.V.B.n.n.x.$.' ' _ [ _ ' ' ) / ; X.f.l.l.l.l.d.l.l.l.l.l.l.x.l.l.l.l.z.l.l.l.l.l.l.l.l.z.l.l.l.z.l.l.l.l.l.l.z.z.k.k.z.z.z.k.z.z.z.z.N.5X7.B U H I U V 9 - E } } } } } } U p.9XR.z.M.M.M.M.M.M.M.M.M.M.m.N.N.N.M.M.M.N.M.v.M.N.b.A.V.N.M.b.V.b.N.b.N.N.N.N.",
+"B.n.n.V.n.n.n.w./ _ ' ' ' ' ' ' ' ) r y a.l.l.s.d.l.d.l.l.l.l.l.l.l.l.l.l.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.z.z.z.k.z.z.k.z.k.z.z.z.m.5XG.V U U U U E f + N } } } } ( } } U ^.8XG.m.M.M.M.M.M.M.M.N.N.m.N.m.N.v.N.N.m.N.S.M.N.M.M.N.M.N.V.b.M.N.b.M.N.n.N.",
+"B.V.V.n.n.V.n.&./ [ _ _ ' _ _ ' ) ) b # 1.x.l.l.l.l.l.l.l.l.l.l.l.z.l.l.l.l.z.x.z.x.l.l.z.z.l.l.j.l.l.l.l.c.l.z.l.l.z.z.z.k.k.z.z.z.z.v.7.S.9XG.V I U U U Y B , 9 } } } } } ( } } %.>X4XK.m.M.M.m.M.M.M.N.m.N.N.S.N.N.N.N.N.N.m.M.M.M.n.M.M.M.N.A.M.M.A.N.N.N.N.",
+"b.b.n.n.V.n.9./ _ ' ' ' ' ' ' [ ' / l # o.l.s.x.l.l.l.l.l.x.l.l.l.l.l.l.l.l.p.j.j.j.j.l.l.l.j.l.l.s.l.l.l.l.l.l.l.l.z.z.k.z.k.z.k.z.k.k.k.z.9XG.C U I U U U Y 9 : ( } ( ` } } } } ^ 5.1X5X!.m.m.M.M.M.M.N.N.N.N.N.N.N.N.N.m.m.N.M.V.n.b.M.n.b.b.b.N.b.N.N.N.N.b.",
+"B.n.n.n.F.w./ / ) ' ' ) ' ' ) ! x 3 ; ; Z d.l.s.d.l.d.l.l.l.s.l.s.p.d.l.l.A.K.P.P.I.P.P.K.D.M.b.v.x.s.s.s.i.i.p.p.s.k.z.z.k.M.k.k.v.v.v.k.m.9Xm.V H U H U U Y f : V } ( ` ` } ( } } Q 6.1X9X[.N.m.M.N.M.N.m.m.N.N.N.N.m.N.N.N.N.M.M.b.A.M.V.n.V.N.M.M.M.M.N.N.N.",
+"b.B.n.n.t.' / ' [ / ) ' ) P i = . g e = 0 a.l.l.d.l.d.l.l.s.s.i.s.S.!.XX5X9X9X8X9X9X0X0X0X0X0X9X2X;X*X.X].!.K.S.M.x.p.p.u.h.j.j.k.k.k.k.j.~.0X6.v U U U U U U B : N } } } } E } ( ( } U 5.^.9X%XG.v.S.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.m.M.M.M.M.M.M.M.M.",
+"A.F.c.2.[ ' ' ' [ ' ) J s = = Z 1.oXF 1 4 9.x.l.l.l.l.l.s.s.M./.;X8X1X~.z.%.~ L P ~ ' =.w.l.S.E.|.:X8X0X0X0X0X9X6X,X*X.X'.E.I.D.V.m.m.C.!.9X8X| B U J U U U U J 6 t E } } } } } } } } } E } !.9X4X^.v.v.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.M.N.M.M.N.N.M.M.M.N.",
+"a.2.[ / _ [ [ ' ) J r = = T r.B.E.;XJ i > 4.c.s.l.l.p.l.C.XX9X4XL.<.B l V B V H H H P J J G N a t v ( ,.e.M.Q.*X5X9X0X0X0X0X0X0X9X6X4X9X0X0X!.V Y U U U U U U U e 5 E } E } } } } ( } } } { E 7.*X9X1X!.N.v.N.N.N.N.N.V.N.N.N.N.N.m.N.N.N.N.N.N.M.N.M.M.N.V.V.N.",
+"T ) ) ' [ [ ) G r = 0 W u.A.F.c.E.oXP B 3 o.f.c.s.r.v.XX0XOXe.Z . # 6 0 0 0 q r 0 8 8 9 q y x S J P L G c i c ~ $.<.l.H.'.OX:X2X6X9X4X4X*XK.( H Y U L U U U ~ U p - C } } } } E } } } } } } } U } m.*X9X*X!.G.v.v.v.N.v.v.N.S.N.v.G.N.v.G.N.N.v.M.z.m.M.N.S.v.7.",
+"R ) ) [ X.J r = i ) s.F.A.n.B.c.K..XP P t G x.z.l.~.4XXX+.y 4 p B D D Y ) { { | ) Y D N g p 5 & @ ; 9 f Z J R J V b B L P Y / / ( ( ` H H H V Y Y U U U L U U U z * I } } } } } } } } } } } } { } U } d.%X5X1X=X|.!.K.S.V.v.7.m.v.7.G.v.N.v.N.G.Y.!.!.Y.N.<.} } ",
+"/ ) ) F 0 @ 0 $.c.F.n.n.n.b.n.n.S.].P P b d p.x.~.`.#.2 t v ) e.e.e.r.r.u.r.u.u.u.y.r.r.9.w.1.#.{ T d > & @ 0 d z F J J Y P L G V V C V C Q ~ P U J L L Y L U E N * N } E } } } } ( { } } } ( } } O.} U U <.S.XX1X5X6X9X5X5X5X=X%X=X=X1X1X1X1X*X[.!.7.*.} E { } ",
+"J F 4 = 9 X.a.A.F.b.n.n.n.n.n.n.M.}.R K P i b J R t r P P P _ 6.e.w.w.e.e.w.e.w.e.9.e.e.$.6.e.r.e.e.e.7.,.o.I s 8 w y 9 9 d Z G Y Y Y Y ~ R ~ Y Y Y Y Y I Y Y B q * p } } } } } } } } } E } } } } E } E } { D U O.5.i.S.!.^.[.).[.).^.Y.m.7.5.*.U V I } } { { } ",
+"3 @ i X.f.A.A.n.n.B.B.V.n.n.n.B.b..XP V P S 1 ; d Y ~ L ! m ` D.6.e.w.w.w.w.w.w.9.e.9.e.| | w.e.t.e.e.e.e.y.e.e.6.;.o.J N d y 0 ; : , y a z x B B D N N f t , $ O * , N E E E E E } { } { } { } } } { } } } } } E U U C E E E U E } E U U U U } } } } } { } { } ",
+"s o.c.Z.F.n.B.n.V.B.n.n.n.B.A.B.B.$XP c ! J i 3 J P K P ! c / oXw.w.w.w.w.w.0.w.w.9.w.w.+.B ( <.e.y.y.y.t.y.y.y.y.y.u.y.y.w.6.;.o.E J Z z s y q 0 q a N J ~ P x a 5 : : * * 7 u t j N U V C ` } } O.} } } E } } } } } { } E E E } } } } } } } O.} } } } O.E U N ",
+"B.V.n.B.B.b.B.n.n.n.n.n.n.n.n.n.c.oXJ M ! P x = d / P P ! M ! .Xx.7.w.w.w.w.e.w.0.w.9.e.%.l L L &.t.e.e.y.t.t.t.y.t.y.y.y.e.y.y.r.e.u.e.r.e.9.9.0.0.7.7.7.u.u.g.7.7.7.7.%.} } ..B p 7 k 9 5 j N B V U E { } } { } } } } } } } } } } } } } } } } } } U H f p $ O ",
+"f.b.b.n.n.B.n.n.n.B.n.n.A.n.n.B.f.oX/ M ! ! J 0 0 P P K P P M (.Q.3.e.e.e.w.e.w.0.w.w.w.,.l P P P &.t.e.y.t.y.t.t.y.t.y.y.t.y.t.t.y.y.y.e.e.t.e.e.y.7.u.u.7.g.g.7.7.N.7.7.7.7.7.7.7.7.7.6.5.>.O.} } E } ( E U U U U U } E } } } } } U E U I A A p q 5 5 : O p *.",
+"B.B.B.n.B.n.n.B.n.B.n.B.B.n.B.n.c.;X$.m ! P P g 3 Z P P ! R h n.+X,.w.w.w.w.0.w.w.w.9.e.4.z P L J L 2.y.y.y.t.y.y.t.y.y.y.y.t.y.y.t.y.e.t.e.t.t.7.e.u.g.7.g.7.y.7.7.7.7.7.7.N.7.7.7.7.7.7.7.7.k.7.i.7.7.7.7.5.<.*.*.*.} U B u 6 : 2 , , * * * * - * * O q } z.G.",
+"x.B.n.B.n.n.n.V.n.B.n.n.n.F.n.n.f.$Xr.M ! ! P G 8 d P P P / h r.#X3.e.w.w.y.e.7.w.w.w.w.6.S G J P L ` 7.t.t.y.7.t.t.y.t.t.t.y.7.t.y.y.t.y.y.t.y.y.7.y.y.y.t.y.g.7.7.7.G.7.v.7.7.7.7.7.7.7.7.k.7.7.7.7.7.7.7.7.7.7.7.7.N.7.7.6.<.} V , * - - - < * + 5 O.d.S.m.S.",
+"B.n.B.n.n.n.B.n.n.n.A.n.n.B.n.B.c.oXb.M ! P P T y d P P P ! i t.%X3.y.w.w.7.y.e.e.w.w.0.e.H d Y H P L 2.t.t.t.y.y.y.7.y.7.y.t.y.t.w.t.t.t.t.t.t.y.y.y.7.t.y.t.7.7.7.7.7.7.7.7.7.N.7.N.7.7.7.7.6.7.7.7.7.v.G.G.Y.K.G.G.7.7.*.} } E I E 9 * < - + 9 O.7.S.N.m.N.N.",
+"b.b.n.n.n.B.n.n.n.B.B.n.n.B.B.n.x.}.T.M P P P R l s P P ! ~ i y.@X2.y.y.e.7.y.w.w.0.w.w.r.P t Y J P L +.y.t.t.y.t.7.y.7.y.y.t.t.y.t.t.y.t.t.7.y.g.7.y.y.g.7.y.t.G.7.7.7.7.7.7.7.6.6.7.7.r.M.G.^.%X%X+X[.^.G.z.6.} U U H ^ U A D I I A < , O < { 7.Y.N.S.S.N.N.m.",
+"B.n.n.n.n.V.n.n.n.n.n.n.n.n.n.n.x.].}.c P P P ! Z y P P P ~ i y.+X2.w.7.e.y.7.e.w.w.e.w.r.| r I H J P ` 7.y.y.7.t.t.y.t.t.t.y.7.7.t.y.7.t.y.g.g.7.7.7.7.7.7.4.7.7.7.7.7.7.m.G.Y.).*X1X5X9X>X#XY.v.7.%.U u 7 j U H U U I U U U U A e O O , } 7.K.S.S.S.N.v.m.N.N.",
+"b.b.b.n.n.n.n.n.n.n.n.n.n.B.n.n.x.(.&Xj P J P ~ b d P P P / i j.`.3.y.y.e.w.y.w.w.w.w.w.r.=.r B P J P P 6.4.7.w.e.e.e.w.e.y.7.e.t.7.7.7.7.7.4.7.w.e.i.l.x.A.K.!.+X%X*X1X5X9X9X9X=X[.J.y. .( U k u j A U U Y U U U U U I I I A a < < A } g.G.G.v.m.S.N.N.N.v.S.v.",
+"b.n.n.n.n.Z.n.B.B.n.F.B.n.n.n.n.x.R.3Xc P P P Y B d P L P P l n.^.2.t.7.y.7.7.e.w.w.e.e.e.4.r l P P P G 6.W.A.z.e.e.9.w.w.w.w.w.e.j.l.x.F.T.~.[.#X:X,X6X9X0X0X0X5X5X3X+XR.m.<.~ v n C C n C L Y E U U U U H U J H H I N f 9 * * E 5.d.G.G.G.m.G.m.m.m.m.m.S.v.G.",
+"b.B.n.n.n.n.n.n.F.B.n.n.B.F.n.F.c.I.9X) J P P ! b g P L P ! m Y.K.6.w.w.y.y.e.y.e.w.w.7.e.w.a r J J Y B / $X0X0X9X9X8X5X5X5X5X3X9X0X0X0X9X7X9X9X9X9X9X6X;X].K.v.7.%.U k h v C Y L Q P P U L L H A U U U J H D N f e 5 , * - U d.m.m.G.v.m.m.v.m.N.N.m.S.S.v.N.S.",
+"b.n.n.n.n.n.n.n.n.n.n.n.n.n.n.B.x.J.9X-.G P P ~ z l P P P P G W.F.7.y.y.w.7.w.7.e.7.w.e.w.e.! % B P P J S ' x.K.~.~.)./.!.E.T.H.N.s.e.;.#.o.' { { o.{ | ( L v u C C U ^ ^ Q Q ~ ! P Y J U J I Y U U C N N p e , , + * , + E S.C.m.m.v.G.m.m.G.m.m.N.N.m.v.S.N.v.",
+"b.n.n.n.n.F.Z.n.n.n.B.n.n.F.n.n.x.J.9Xu.b P P P d v P L P L L ^.n.7.7.7.w.y.w.y.e.e.7.y.w.y.%.% y J P J P b b S S B b V V V V V V m V v v v c v v c c v K P ~ ^ ~ ~ P Y ~ ~ ( ( / Y R P J G x d e : O O O X X + , + , , 9 -.M.M.m.m.S.m.m.v.m.m.m.m.m.m.m.S.v.G.",
+"b.B.n.n.n.n.n.n.n.n.n.n.n.n.n.n.b.V.6Xf.l ~ P ! a x P L ! L P [.c.7.y.y.7.7.e.y.7.y.7.e.y.y.>.6 : N P J P L L H V L L L L L L L P P ! ~ ~ ~ ! P Y ~ Y L H V b x x x x z f a y y q 4 : 3 8 5 5 8 N U E { { *.0.f s s 6 $ N *.v.V.S.m.m.m.G.v.G.v.G.v.G.v.S.v.m.m.",
+"b.n.n.n.n.n.n.n.n.F.n.n.n.n.B.n.x.T.7Xx.l P P L i N P L ! G ^ [.u.7.7.w.y.e.w.7.w.t.y.w.t.t.%.d : 5 b P Y P P P P Y P ~ P P P P L H G S b f y a q 4 3 r i y q 0 4 4 8 r p x D ) ;.9.s.x.V.D.H.K.K.I.Y.Y.R.=XR.B U R f O N O.p.N.m.v.G.m.G.v.m.m.v.m.m.G.N.m.N.G.",
+"b.n.B.n.n.n.n.n.n.B.n.n.n.n.n.n.F.2X9X#.V P P P y B P L ! m ` {.7.y.y.e.y.7.y.7.e.e.y.7.e.3.P D 3 = 5 y l z z v c v l i t 4 2 1 ; @ $ @ o ; = @ 8 W -.8.a.l.x.x.x.x.M.M.D.P.W.R.E.R.R.R.R.R.W.R.Y.K.G.!.=XS.V U I Y D O E { 6.V.G.G.m.m.m.v.G.v.G.m.m.v.G.N.v.N.",
+"x.n.n.n.F.n.n.F.A.n.n.n.n.b.x.T.6X0XR.B J ! P J t S P P ! n ^ |.7.y.7.t.w.w.w.e.7.e.7.e.6.P H J w - = O ; 1 2 4 a B G H J ) / R ) ) ) o.O.y @ y x.R.T.R.I.T.R.R.R.T.R.T.T.T.T.T.T.T.T.Y.Y.H.H.T.W.'..H.W.j P ~ U U U u E } *.z.G.m.v.m.m.G.z.G.G.G.z.z.v.G.G.v.",
+"b.n.n.F.n.c.c.b.b.T.}.6X9X8X(.-.' [ +.! P P P S t J K ! ! n ,.:X7.y.y.e.e.y.t.7.j.-XW.C P P G 3 q r.l.p..X3X[.R.K.K.P.K.K.T.T.R.Y.T.P.Y.T.T.,.r.Q.T.T.Y.T.P.Y.P.K.K.K.K.T.!.#X3X6X2X@XH.9.&.&.#.#.&.@.4.%Xv P ~ U U U j U *.O.z.m.m.v.G.z.G.m.m.z.m.m.G.m.v.v.G.",
+"b.b.b.b.c.F.E..X2X9X0X2X/.4./ ) +.+.+./ J P P b i L P ! ! M 3.2Xw.y.t.t.7.y.4.x.2X~.G P L P a : <.l.h.u.r.Q.8X5X#X`.`.~.T.R.T.T.T.T.T.T.E.R.t.w.R.K.K.K.H.H.H.K.Q.`.XX=X3X2XXXQ.M.4.@.+.#.=.=.=.=.;.&.7.+Xv P P U Y Y N C *.O.z.G.v.G.z.m.G.G.z.G.m.m.m.G.z.m.G.",
+"x.b.b.T..X2X0X0X9X$XV.,.[ ) $.$.+.o.+.P P P P l a P P P ! M ,.6Xe.y.y.y.7.y.Q.8XH.K H L P G @ Y c.h.u.u.u.r.V. X9X9X9X9XS.l.v.b.M.M.b.l.w.,.( @.R.|.[.|.{.#X&X.>.>.>.>.=.=.=.>.&.D.4.G P U U U U N N } O.7.m.m.G.z.G.G.z.G.m.G.m.G.v.G.v.v.",
+"9X9X8XoXL.w.[ / ' o.o.o.+.o.o.+.+.[ +.) P P ! d l P P ! ! H P .X:XA.P.#X9X|.%.j P L P J x ; +.l.j.j.h.p.p.p.p.p.u.7.u.2XY.Q ..[ | | | | | .( H #.%.+.o. .+.%.&.;.,.<.,.;.=.=.=.=.>.=.,.>.>.=.>.=.>.=.l.L L L H U U Y k N *.} i.G.m.v.G.z.m.m.m.m.z.v.G.m.z.m.G.",
+"].b.1.[ ) ) o.+.+.o.[ o.+.+.o.$.+.+.+.' P P P y l P Q P Q ~ H +.}.5X5X[.4.G B P L J P H : l u.j.j.p.u.j.p.p.u.p.p.u.v.6XI.Q .. .| . . .' | ' B | <.;.>.,.;.,.,.,.=.=.=.=.=.&.;.=.=.&.>.=.>.>.=.>.>.,.` P P L P L U Y l f ..} 7.S.m.N.m.M.M.M.V.G.v.v.m.G.!.*X1X",
+"T / o.[ +.$.+.+.+.[ +.+.+.+.$.$.+.+.+. .P P P t b P P P Y P J G v P B l b B Y J P P P a # <.j.j.j.u.j.p.u.j.u.j.j.y.b.9XR.L .[ ' .` ' .| ..z P ,.,.>.>.,.,.>.,.,.;.>.>.=.>.=.>.>.,.,.>.,.&.,.&.>.+.H L P P L U J Y a p ..} 5.m.S.N.N.M.M.M.m.k.m.R.%X1X1X1X!.",
+") [ +.+.+.o.+.+.+.+.$.[ $.+.$.$.+.+.+. .! P P t b P ! ! Y P P P J H L L P ~ P P P I x % ( k.j.u.j.j.u.h.h.j.j.j.j.y.b.9XI.! ..[ .] [ [ ' . .B B ;.>.,.,.>.>.,.,.&.&.,.&.,.=.>.&.,.>.&.&.,.,.&.>.=.~ H P ! P L H U U t y O. .O.7.m.V.m.m.m.C.G.^.+X=X+XG.5.} E ",
+") o.o.+.+.+.+.+.+.+.+.+.+.+.+.$.$. .+.+./ P K r B P ! P P P P Y P P P P P P P P P S 2 a g.k.j.u.u.j.j.p.j.h.j.h.h.y.A.0XI.P ..' ' [ ] [ [ [ ..P v =.,.>.=.,.>.>.,.,.,.=.,.&.&.,.&.,.=.,.&.,.,.&.,.+.P J P L P P U J U 7 q | O.} } >.6.7.7.G.|.@XY.k.>.} U } } *.",
+"X.o.[ +.+.[ +.+.[ $.+.+.$.$.$.+.$.+.$.$._ Q G 7 V Q P P P P P P P P L P P L H P G ; 0 1.l.h.u.h.h.h.h.j.h.h.h.h.h.y.F.0XP.Q ..] .[ ] [ [ [ ._ i %.,.>.=.>.>.>.>.>.&.>.,.&.>.;.,.=.>.&.=.=.>.=.&.( P H P L P P U I B , 9 } O.O.@.} @.} } 6.*.} } } } } *...O...",
+"' $.o.[ +.+.[ +.+.+.$.$.[ $.[ $.$.$.+...` P G 4 G P ! Y L P L P L P P L L P ! G 3 y 8.u.u.p.u.h.h.h.u.h.h.h.h.h.h.y.Y.0XL.Q ..[ [ ] [ ] [ ] ' [ 7 | ,.&.>.;.>.=.=.>.,.=.=.,.&.,.=.=.;.,.=.=.=.,.@.Y H L P P P J U U f , , } O.O.@.@.@.@.O.O.} | O.O.O.O.O.O.} @.",
+"' [ [ +.[ $.+.$.[ $.$.$.$.$...$.$...+.$.' L V 2 G L Y P P Y L L P P P P P P v 4 / r.s.u.u.u.p.u.u.j.u.h.h.h.h.h.h.e.T.0XK.P ..` ' [ [ [ [ ' [ ' i b =.=.;.;.=.;.;.;.&.;.=.=.;.&.&.;.&.,.;.=.=.&.) J J P J P J J C N 2 , * N O.} O...@...*.O.O.O.} O.O.O.O.O.O.*.",
+"X.o.[ [ o.+.[ o.+.+.[ $.[ [ +.+.$.[ +.+...^ b 5 S H H P J H J L L J G B b y t &.s.j.u.u.p.u.p.p.u.p.p.u.j.p.h.p.j.u.W.0XS.L ..[ ' ' ] ] [ [ . .G 6 G o.%.#.%.%.&.#.&.&.#.%.#.&.&.%.#.%.%.#.#.@.P G H H H H H S f 9 5 5 , 9 p a a f N N N V D V I U E E E E E } "
+};
diff --git a/utils.c b/utils.c
new file mode 100644
index 0000000..5e502e6
--- /dev/null
+++ b/utils.c
@@ -0,0 +1,81 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* utils.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: jbadaire +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2023/10/03 10:24:01 by jbadaire #+# #+# */
+/* Updated: 2023/10/03 10:37:46 by jbadaire ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "so_long.h"
+
+t_location find_element(t_data data, char type) {
+ size_t pos_x;
+ size_t pos_y;
+ t_location location;
+
+ pos_x = 0;
+ pos_y = 0;
+ location.x = -1;
+ location.y = -1;
+ while (pos_y < data.lenght_y) {
+ while (pos_x < ft_strlen(data.map[0])) {
+ if (data.map[pos_y][pos_x] == type) {
+ location.x = ++pos_x;
+ location.y = ++pos_y;
+ return (location);
+ }
+ pos_x++;
+ }
+ pos_x = 0;
+ pos_y++;
+ }
+ return (location);
+}
+
+int count_element(t_data data, char type)
+{
+ size_t pos_x;
+ size_t pos_y;
+ int count;
+
+ pos_x = 0;
+ pos_y = 0;
+ count = 0;
+ while (pos_y < data.lenght_y) {
+ while (pos_x < ft_strlen(data.map[0])) {
+ if (data.map[pos_y][pos_x] == type)
+ count++;
+
+ pos_x++;
+ }
+ pos_x = 0;
+ pos_y++;
+ }
+ return (count);
+}
+
+t_data *clone(t_data data) {
+ t_data *clone;
+ size_t index;
+ char **content;
+
+ clone = malloc(sizeof(t_data));
+ if(!clone)
+ return (NULL);
+ clone->lenght_y = data.lenght_y;
+ index = 0;
+ content = malloc(sizeof(char *) * clone->lenght_y);
+ if(!content)
+ return (NULL);
+
+ while (index < clone->lenght_y) {
+ content[index] = ft_strdup(data.map[index]);
+ index++;
+ }
+ clone->map = content;
+ return (clone);
+}
\ No newline at end of file