New upstream version 2.7.0
Markus Koschany
2 years ago
0 | name: Build | |
1 | ||
2 | on: [push] | |
3 | ||
4 | jobs: | |
5 | ci_job: | |
6 | runs-on: ubuntu-latest | |
7 | name: Test that the game can be compiled | |
8 | steps: | |
9 | - name: Check Out Repo | |
10 | uses: actions/checkout@v2 | |
11 | - name: Check lint | |
12 | run: bash source/misc/lint/runLint.sh | |
13 | - name: Test Fedora 25 | |
14 | run: docker build -f source/misc/docker/Dockerfile.Fedora25build . -t blockattack_test | |
15 | - name: Test Windows MXE | |
16 | run: docker build -f source/misc/docker/Dockerfile.WindoesBuild . -t blockattack_test |
12 | 12 | !.dockerignore |
13 | 13 | *.patch |
14 | 14 | Game/blockattack* |
15 | Game/mods/1.3.0.bricks.data | |
15 | 16 | cmake_install.cmake |
16 | 17 | CMake* |
17 | 18 | -CMakeLists.txt |
0 | sudo: required | |
1 | ||
2 | language: cpp | |
3 | ||
4 | services: | |
5 | - docker | |
6 | ||
7 | ||
8 | script: ./travis_build.script | |
9 | ||
10 | notifications: | |
11 | email: false |
0 | # Changelog | |
1 | ||
2 | ||
3 | ## [2.7.0] - 2021-10-23 | |
4 | ||
5 | ### Added | |
6 | - Volume for sound effect and music is now stored in the configFile | |
7 | - Menu for changing music and sound volume | |
8 | ||
9 | ### Changed | |
10 | - Linux icons have been converted to png (patch by pinotree) | |
11 | - Now requires Ubuntu 18.04 or later (or equivalent) | |
12 | - utfcpp is now an embedded library | |
13 | - Dialog boxes now uses contructed textures thus reducing tearing on some renderers | |
14 | - Garbage blocks now uses constructed textures thus reducing tearing on some renderers | |
15 | - Screen shot feature now works with hardware render | |
16 | - Update library versions for the compiled version: | |
17 | - SDL2: 2.0.12 to 2.0.16 | |
18 | ||
19 | ### Removed | |
20 | - Linux standalone build no longer includes 32 bit binary | |
21 | ||
22 | ## [2.6.0] - 2020-09-26 | |
23 | ||
24 | ### Added | |
25 | - Patch by bmwiedemann for sorting in the data file. Should make builds reproducible | |
26 | - Virtual keyboard on the enter name screen allowing using a mouse or a gamepad to type. | |
27 | ||
28 | ### Changed | |
29 | - Modified the controller keybind. "B" is now Cancel instead of "Y" | |
30 | - Update embedded Cerial from 1.2.2 to 1.3.0 | |
31 | - Update library versions for the compiled version: | |
32 | - SDL2: 2.0.9 to 2.0.12 | |
33 | - SDL2_image: 2.0.4 to 2.0.5 | |
34 | - SDL2_ttf: 2.0.14 to 2.0.15 | |
35 | - physfs: 2.0.3 to 3.0.2 | |
36 | ||
37 | ## [2.5.0+1] - 2019-07-04 | |
38 | ||
39 | Not given a version number as the build environment is not part of the project. | |
40 | Given a +1 to show that the build environment has changed | |
41 | ||
42 | ### Fixed | |
43 | - New Windows build environment to prevent a crash on Windows 10 1809 | |
44 | ||
45 | ## [2.5.0] - 2019-05-25 | |
46 | ||
47 | ### Added | |
48 | - Option to always use the software renderer | |
49 | - Automatically start in software render the first time after a crash | |
50 | - Widescreen support. Only used in fullscreen by default. | |
51 | - Appstream metadata | |
52 | ||
53 | ### Fixed | |
54 | - Fixed the search order in archives | |
55 | - Screenshot feature no longer crashes in hardware acceleration. Still only works in software mode | |
56 | ||
57 | ## [2.4.0] - 2019-03-10 | |
58 | ||
59 | ## Added | |
60 | - Different starting speeds for Endless | |
61 | - Dumps the about page info to "about.txt" when viewed | |
62 | - Default player 1 name is now fetched from the OS | |
63 | ||
64 | ## Changed | |
65 | - Minor code cleanup | |
66 | - Improved "About" page with technical information | |
67 | - Improved Unicode support (--homepath can now be used with Unicode chars) (Windows only) | |
68 | ||
69 | ## Removed | |
70 | - Support for any Windows operating systems before Windows 7 (Windows only) | |
71 | ||
72 | ## Fixed | |
73 | - Build against SDL 2.0.9 fixing some scaling problems and improving gamepad support (Windows only) | |
74 | ||
75 | ## [2.3.0] - 2018-07-01 | |
76 | ||
77 | ## Changed | |
78 | - Several keyboard keys are now translatable | |
79 | - Window size is now restored on next startup | |
80 | - The back-button on the gamepad now goes back in menus | |
81 | - Gamepad L2 and R2 can now be used to push lines | |
82 | - Game Over, Winner and Draw are now translatable | |
83 | ||
84 | ## [2.2.0] - 2018-05-20 | |
85 | ||
86 | ## Added | |
87 | - Help menu with rule explanations | |
88 | ||
89 | ## Changed | |
90 | - New font system | |
91 | - Better scaling | |
92 | - Works out of the box on Windows with high resolution displays | |
93 | ||
94 | ## [2.1.2] - 2018-01-12 | |
95 | ||
96 | ### Fixed | |
97 | - The Windows version would not save correctly if "My Games" did not already exist in the Documents folder. | |
98 | ||
99 | ## [2.1.1] - 2017-04-01 | |
100 | ||
101 | This has the first gameplay change in a long time. In the previous version the rise would stop | |
102 | while clearing. It could stop for several seconds. This is no longer the case. The time is now | |
103 | bound and will lower as the game progresses. | |
104 | ||
105 | The update of the model has also been changed. This should make it more smooth in some of the | |
106 | high speed Stage Clear levels. | |
107 | ||
108 | ### Added | |
109 | - Docker files are now provided to make compiling even easier | |
110 | ||
111 | ### Changed | |
112 | - There is now an upper limit on how long the rise will stop | |
113 | - The internal updated of the game has been updated from 20 times a second to 100 times a second | |
114 | - Menu fonts have been changed | |
115 | - Window is now resizeable by default | |
116 | - Code cleanup | |
117 | - Translation strings changed | |
118 | - Updated libraries | |
119 | ||
120 | ### Removed | |
121 | * jsoncpp is no longer a dependency | |
122 | ||
123 | ## [2.1.0] - 2017-04-01 [YANKED] | |
124 | ||
125 | ## [2.0.1] - 2016-10-01 | |
126 | ||
127 | ### Fixed | |
128 | - The "Get Ready" animation used the wrong sprite | |
129 | - My homepath was hardcoded in the Makefile (Linux only) | |
130 | ||
131 | ||
132 | ## [2.0.0] - 2016-05-01 | |
133 | ||
134 | ### Added | |
135 | - TTF font support | |
136 | - gettext based translation support (includes a Danish translation) | |
137 | ||
138 | ### Changed | |
139 | - Uses SDL2. This means textures and sprites instead of old surfaces. | |
140 | - New config file format | |
141 | - Linux saves are now stored under $HOME/.local/share/blockattack | |
142 | - New keyboard and game controller friendly menu system | |
143 | - Better behind the scenes handling | |
144 | - Now uses a CMake build system | |
145 | - Better game controller support (although limited to SDL2 supported controllers) | |
146 | - Better mouse play | |
147 | - More modern icon | |
148 | - Old config and some saves are lost then converting to 2.0.0+ | |
149 | ||
150 | ### Removed | |
151 | - Replay functionality | |
152 | - Network support | |
153 | - Including dependency on Enet | |
154 | - Themes support | |
155 | - Support for non-SDL2 game controllers | |
156 | ||
157 | ||
158 | ## [2.0.0-SNAPSHOT-2016-03-20] - 2016-03-20 | |
159 | ||
160 | Preview release for SDL2 support | |
161 | ||
162 | ## [1.4.2] - 2014-09-11 | |
163 | ||
164 | ### Fixed | |
165 | - The Windows uninstaller now works on Vista/7/8 (Windows only) | |
166 | ||
167 | ## [1.4.1] - 2009-11-19 | |
168 | ||
169 | ### Added | |
170 | - PhysFS is now a requirement | |
171 | - Theme support | |
172 | ||
173 | ## [1.4.0] - 2009-04-07 | |
174 | ||
175 | ### Changed | |
176 | - New graphics by Qubodup | |
177 | ||
178 | ## [1.3.2] - 2008-01-17 | |
179 | ||
180 | ### Changed | |
181 | - Enet updated from 1.0 to 1.1 | |
182 | ||
183 | ## [1.3.1] - 2007-01-17 | |
184 | ||
185 | ### Fixed | |
186 | - Windows 9x know works again (Windows only) | |
187 | - Puzzle mode has been fixed (Windows only) | |
188 | ||
189 | ## [1.3.0] - 2006-08-29 | |
190 | ||
191 | ### Added | |
192 | - gray garbage blocks | |
193 | - "." can be entered while typing an IP address | |
194 | ||
195 | ## [1.2.2] - 2006-08-09 | |
196 | ||
197 | ### Added | |
198 | - 64 bit support | |
199 | ||
200 | ## [1.2.0] - 2006-06-19 | |
201 | ||
202 | ### Added | |
203 | - Network play | |
204 | - Ability to save replays up to 5 minutes long | |
205 | ||
206 | ## [1.1.2] - 2005-11-20 | |
207 | ||
208 | ### Added | |
209 | - Small numbers while chaining | |
210 | ||
211 | ## [1.1.1] - 2005-10-29 | |
212 | ||
213 | ### Added | |
214 | - Handicap in multiplayer matches | |
215 | - Basic AI | |
216 | ||
217 | ### Changed | |
218 | - Now always uses software surfaces | |
219 | - Better puzzle management | |
220 | - Better controls | |
221 | - New Makefile | |
222 | - Now hosted on blockattack.sf.net | |
223 | ||
224 | ### Removed | |
225 | - Windows 9x support | |
226 | ||
227 | ## [1.1.0] - 2005-06-12 | |
228 | ||
229 | ### Changed | |
230 | - Radically changed gameplay | |
231 | - Blocks no longer falls instantly | |
232 | - Blocks will not match while falling | |
233 | - Chains give more points | |
234 | - Combos give less points | |
235 | ||
236 | ## [1.0.6] - 2005-05-08 | |
237 | ||
238 | ### Added | |
239 | - Mouse play | |
240 | - Joypad support | |
241 | ||
242 | ### Changed | |
243 | - Renamed to "Block Attack - Rise of the Blocks" | |
244 | ||
245 | ## [1.0.5] - 2005-05-02 | |
246 | First non beta release |
0 | cmake_minimum_required(VERSION 2.8.7) | |
0 | cmake_minimum_required(VERSION 3.5.1...3.18.4) | |
1 | 1 | project (blockattack) |
2 | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${blockattack_SOURCE_DIR}/source/misc/cmake") | |
3 | 2 | set(BIN_DIR ${blockattack_SOURCE_DIR}/Game) |
4 | 3 | |
5 | SET(CPACK_PACKAGE_VERSION "2.6.0") | |
4 | SET(CPACK_PACKAGE_VERSION "2.7.0") | |
6 | 5 | SET(CPACK_PACKAGE_VERSION_MAJOR "2") |
7 | SET(CPACK_PACKAGE_VERSION_MINOR "6") | |
6 | SET(CPACK_PACKAGE_VERSION_MINOR "7") | |
8 | 7 | SET(CPACK_PACKAGE_VERSION_PATCH "0") |
9 | 8 | SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Block Attack - Rise of the Blocks ${CPACK_PACKAGE_VERSION}") |
10 | 9 | SET(CPACK_PACKAGE_VENDOR "Poul Sander") |
57 | 56 | set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} -g -DDEBUG") |
58 | 57 | set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -O2") |
59 | 58 | |
60 | #Newer versions of gcc fails for Cereal. | |
61 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-implicit-fallthrough") | |
62 | ||
63 | 59 | #Setup SDL2 |
64 | 60 | find_package(SDL2 REQUIRED) |
65 | include_directories(${SDL2_INCLUDE_DIR}) | |
61 | include_directories(${SDL2_INCLUDE_DIRS}) | |
66 | 62 | |
67 | 63 | #Setup things that use pkg-config |
68 | 64 | find_package(PkgConfig REQUIRED) |
90 | 86 | |
91 | 87 | #building/compiling/linking |
92 | 88 | add_executable(blockattack ${GUI_TYPE} ${SOURCES} ${RES_FILES}) |
93 | target_link_libraries( blockattack ${SDL2_LIBRARY}) | |
89 | target_link_libraries( blockattack ${SDL2_LIBRARIES}) | |
94 | 90 | target_link_libraries( blockattack physfs) |
95 | 91 | target_link_libraries( blockattack ${SDL2MIXER_LIBRARIES} ${SDL2IMAGE_LIBRARIES} ${SDL2TTF_LIBRARIES}) |
96 | 92 | target_link_libraries( blockattack ${Boost_LIBRARIES} ) |
102 | 98 | install(FILES man/blockattack.6.gz DESTINATION ${INSTALL_MAN_DIR} ) |
103 | 99 | install(FILES source/misc/blockattack.desktop DESTINATION ${INSTALL_APPLICATIONS_DIR} ) |
104 | 100 | install(FILES source/misc/net.blockattack.game.metainfo.xml DESTINATION ${INSTALL_METAINFO_DIR} ) |
105 | install(FILES source/misc/icons/blockattack16.xpm DESTINATION "${INSTALL_ICONS_DIR}/16x16/apps" RENAME blockattack.xpm ) | |
106 | install(FILES source/misc/icons/blockattack48.xpm DESTINATION "${INSTALL_ICONS_DIR}/48x48/apps" RENAME blockattack.xpm ) | |
107 | install(FILES source/misc/icons/blockattack128.xpm DESTINATION "${INSTALL_ICONS_DIR}/128x128/apps" RENAME blockattack.xpm ) | |
108 | install(FILES source/misc/icons/blockattack256.xpm DESTINATION "${INSTALL_ICONS_DIR}/256x256/apps" RENAME blockattack.xpm ) | |
109 | install(FILES source/misc/icons/blockattack64.xpm DESTINATION "${INSTALL_ICONS_DIR}/64x64/apps" RENAME blockattack.xpm ) | |
110 | install(FILES source/misc/icons/blockattack32.xpm DESTINATION "${INSTALL_ICONS_DIR}/32x32/apps" RENAME blockattack.xpm ) | |
101 | install(FILES source/misc/icons/blockattack16.png DESTINATION "${INSTALL_ICONS_DIR}/16x16/apps" RENAME blockattack.png ) | |
102 | install(FILES source/misc/icons/blockattack48.png DESTINATION "${INSTALL_ICONS_DIR}/48x48/apps" RENAME blockattack.png ) | |
103 | install(FILES source/misc/icons/blockattack128.png DESTINATION "${INSTALL_ICONS_DIR}/128x128/apps" RENAME blockattack.png ) | |
104 | install(FILES source/misc/icons/blockattack256.png DESTINATION "${INSTALL_ICONS_DIR}/256x256/apps" RENAME blockattack.png ) | |
105 | install(FILES source/misc/icons/blockattack64.png DESTINATION "${INSTALL_ICONS_DIR}/64x64/apps" RENAME blockattack.png ) | |
106 | install(FILES source/misc/icons/blockattack32.png DESTINATION "${INSTALL_ICONS_DIR}/32x32/apps" RENAME blockattack.png ) | |
111 | 107 | install(DIRECTORY source/misc/translation/locale/ DESTINATION "${INSTALL_LOCALE_DIR}") |
0 | { | |
1 | "name" : "1.3.0.bricks", | |
2 | "description" : "Uses the bricks from version 1.3.0", | |
3 | "sprites" : "bricks1.3.0" | |
4 | } |
0 | { | |
1 | ||
2 | "block_blue" : { | |
3 | "texture" : "bricks130", | |
4 | "topx" : 0, | |
5 | "topy" : 0, | |
6 | "height" : 50, | |
7 | "width" : 50, | |
8 | "number_of_frames" : 1, | |
9 | "frame_time" : 1 | |
10 | }, | |
11 | ||
12 | "block_green" : { | |
13 | "texture" : "bricks130", | |
14 | "topx" : 50, | |
15 | "topy" : 0, | |
16 | "height" : 50, | |
17 | "width" : 50, | |
18 | "number_of_frames" : 1, | |
19 | "frame_time" : 1 | |
20 | }, | |
21 | ||
22 | "block_gray" : { | |
23 | "texture" : "bricks130", | |
24 | "topx" : 100, | |
25 | "topy" : 0, | |
26 | "height" : 50, | |
27 | "width" : 50, | |
28 | "number_of_frames" : 1, | |
29 | "frame_time" : 1 | |
30 | }, | |
31 | ||
32 | "block_purple" : { | |
33 | "texture" : "bricks130", | |
34 | "topx" : 150, | |
35 | "topy" : 0, | |
36 | "height" : 50, | |
37 | "width" : 50, | |
38 | "number_of_frames" : 1, | |
39 | "frame_time" : 1 | |
40 | }, | |
41 | ||
42 | "block_red" : { | |
43 | "texture" : "bricks130", | |
44 | "topx" : 200, | |
45 | "topy" : 0, | |
46 | "height" : 50, | |
47 | "width" : 50, | |
48 | "number_of_frames" : 1, | |
49 | "frame_time" : 1 | |
50 | }, | |
51 | ||
52 | "block_turkish" : { | |
53 | "texture" : "bricks130", | |
54 | "topx" : 250, | |
55 | "topy" : 0, | |
56 | "height" : 50, | |
57 | "width" : 50, | |
58 | "number_of_frames" : 1, | |
59 | "frame_time" : 1 | |
60 | }, | |
61 | ||
62 | "block_yellow" : { | |
63 | "texture" : "bricks130", | |
64 | "topx" : 300, | |
65 | "topy" : 0, | |
66 | "height" : 50, | |
67 | "width" : 50, | |
68 | "number_of_frames" : 1, | |
69 | "frame_time" : 1 | |
70 | } | |
71 | ||
72 | } |
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 | This is an empty file | |
1 | ||
2 | It needs to be here so the theme 'default' can be selected from the menu | |
3 | ||
4 | Custom themes should be placed as directories next to this file |
0 | # blockattack-game [![Build Status](https://travis-ci.org/blockattack/blockattack-game.svg?branch=master)](https://travis-ci.org/blockattack/blockattack-game) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/0dfba60f2ce9484a828bd7c112f50089)](https://www.codacy.com/app/github_43/blockattack-game?utm_source=github.com&utm_medium=referral&utm_content=blockattack/blockattack-game&utm_campaign=Badge_Grade) [![Coverity Status](https://scan.coverity.com/projects/8278/badge.svg)](https://scan.coverity.com/projects/8278) [![license](https://img.shields.io/github/license/blockattack/blockattack-game.svg)]() | |
0 | # blockattack-game ![Build status](https://github.com/blockattack/blockattack-game/actions/workflows/main.yml/badge.svg) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/044d09ab34be4a1fa93e31d9585adacf)](https://www.codacy.com/gh/blockattack/blockattack-game/dashboard?utm_source=github.com&utm_medium=referral&utm_content=blockattack/blockattack-game&utm_campaign=Badge_Grade) [![license](https://img.shields.io/github/license/blockattack/blockattack-game.svg)]() | |
1 | 1 | Block Attack - Rise of the Blocks - the game<br/> |
2 | 2 | A Tetris Attack Clone under the GPL. |
3 | 3 | |
16 | 16 | * libphysfs |
17 | 17 | * libboost (only needed for compiling) |
18 | 18 | * libboost-program-options |
19 | * libutfcpp (only needed for compiling) | |
20 | 19 | |
21 | 20 | ## Building |
22 | 21 | The only supported build method is using the CMake<br/> |
44 | 43 | ``` |
45 | 44 | sdl2 sdl2_image sdl2_mixer sdl2_ttf physfs libtool gettext freetype zlib boost |
46 | 45 | ``` |
47 | and libutfcpp copied from "source/misc/travis_help/utf8_v2_3_4/source/" to "/path/to/mxe/usr/lib/gcc/i686-w64-mingw32.static/4.9.3/include" | |
48 | 46 | |
49 | 47 | Compiled with: |
50 | 48 | ``` |
55 | 53 | |
56 | 54 | As getting a C++ project with many dependencies to compile can be a daunting task then I have provided a couple of Docker images that can perform a build. Both for Windows and Linux. |
57 | 55 | |
56 | The project should at all time be able to compile on the oldest and latest supported version of Ubuntu. This is tested with Docker. | |
57 | ||
58 | 58 | On a fresh checkout you can use: |
59 | 59 | ``` |
60 | docker build -f source/misc/docker/Dockerfile.Ubuntu16.04build . -t blockattack_test | |
60 | docker build -f source/misc/docker/Dockerfile.Ubuntu18.04build . -t blockattack_test | |
61 | 61 | ``` |
62 | 62 | and |
63 | 63 | ``` |
65 | 65 | ``` |
66 | 66 | |
67 | 67 | ## Source Structure |
68 | This project is a bit unconversionel because I didn't know any better at the time. | |
68 | This project is a bit unconventional because I didn't know any better at the time. | |
69 | 69 | |
70 | 70 | * Game - The output is placed here |
71 | 71 | * man - The manual file and the script to generate it. May be moved to source/misc at some point |
0 | This is Block Attack - Rise of the Blocks - version 2.6.0 | |
1 | ||
2 | The main focus of this release is improved controller support. | |
3 | ||
4 | Changes since 2.5.0: | |
5 | ||
6 | Modified the controller keybind. "B" is now Cancel instead of "Y" | |
7 | There is a virtual keyboard on the enter name screen allowing using a mouse or a gamepad to type. | |
8 | Added patch by bmwiedemann for sorting in the data file | |
9 | Update embedded Cerial from 1.2.2 to 1.3.0 | |
10 | Update library versions for the compiled Linux version: | |
11 | * SDL2: 2.0.9 to 2.0.12 | |
12 | * SDL2_image: 2.0.4 to 2.0.5 | |
13 | * SDL2_ttf: 2.0.14 to 2.0.15 | |
14 | * physfs: 2.0.3 to 3.0.2 | |
15 |
0 | 0 | .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13. |
1 | .TH BLOCKATTACK "6" "September 2020" "blockattack 2.6.0" "Games" | |
1 | .TH BLOCKATTACK "6" "October 2021" "blockattack 2.7.0" "Games" | |
2 | 2 | .SH NAME |
3 | 3 | blockattack \- a puzzle game inspired by Tetris Attack |
4 | 4 | .SH SYNOPSIS |
5 | 5 | .B blockattack |
6 | 6 | [\fI\,OPTION\/\fR]... |
7 | 7 | .SH DESCRIPTION |
8 | Block Attack \- Rise of the blocks 2.6.0 | |
8 | Block Attack \- Rise of the blocks 2.7.0 | |
9 | 9 | .PP |
10 | 10 | Block Attack \- Rise of the Blocks is a puzzle/blockfall game inspired by Tetris Attack for the SNES. |
11 | 11 | .PP |
56 | 56 | .TP |
57 | 57 | \fB\-\-homepath\fR arg |
58 | 58 | Set the home folder where settings are saved. The directory will be created if it does not exist. Default: "$HOME/.local/share/blockattack" |
59 | .TP | |
60 | \fB\-m\fR [ \fB\-\-mod\fR ] arg | |
61 | Loads a mod. Later mods have preference | |
59 | 62 | .SH EXAMPLES |
60 | 63 | .TP |
61 | 64 | blockattack |
0 | 0 | #!/bin/bash |
1 | 1 | set -e |
2 | 2 | zip -9jX Game/blockattack.data source/AUTH |
3 | cd Game/data | |
4 | zip -9X $(find ../blockattack.data * | sort) -x \*svn* | |
5 | cd ../../man | |
3 | pushd Game/data | |
4 | zip -9X $(find ../blockattack.data ./* | sort) -x \*svn* | |
5 | popd | |
6 | pushd Game/mods/1.3.0.bricks_unpacked.data/ | |
7 | zip -9X ../1.3.0.bricks.data $(find ./* | sort) | |
8 | popd | |
9 | pushd man | |
6 | 10 | gzip -9n -c blockattack.man > blockattack.6.gz |
7 | cd ../source/misc/translation/ | |
11 | popd | |
12 | pushd source/misc/translation/ | |
8 | 13 | ./build_mo_all.sh |
14 | popd | |
9 | 15 | |
10 | 16 | exit 0 |
97 | 97 | return; |
98 | 98 | } |
99 | 99 | match = true; |
100 | x = (mousex-topx) / 50; | |
101 | y = (50*12+topy-mousey-pixels) / 50; | |
100 | x = (mousex-topx) / bsize; | |
101 | y = (bsize*12+topy-mousey-pixels) / bsize; | |
102 | 102 | } |
103 | 103 | |
104 | 104 | bool IsInTheBoard(int mousex, int mousey) const { |
105 | if (mousex < topx || mousex > topx+50*6 || mousey < topy || mousey > topy+50*12) { | |
105 | if (mousex < topx || mousex > topx+bsize*6 || mousey < topy || mousey > topy+bsize*12) { | |
106 | 106 | return false; |
107 | 107 | } |
108 | 108 | return true; |
109 | 109 | } |
110 | 110 | |
111 | 111 | bool IsUnderTheBoard(int mousex, int mousey) const { |
112 | if (mousex < topx || mousex > topx+50*6 || mousey < topy+50*12) { | |
112 | if (mousex < topx || mousex > topx+bsize*6 || mousey < topy+bsize*12) { | |
113 | 113 | return false; |
114 | 114 | } |
115 | 115 | return true; |
165 | 165 | Mix_PlayChannel(1, applause.get(), 0); |
166 | 166 | } |
167 | 167 | private: |
168 | ||
169 | /** | |
170 | This crops "dstrect" and "srcrect" to fit inside "bounds" | |
171 | dstrect and srcrect are modified in place. | |
172 | */ | |
173 | void CropTexture(SDL_Rect& dstrect, SDL_Rect& srcrect, const SDL_Rect& bounds) const { | |
174 | if (dstrect.x > bounds.x+bounds.w) { | |
175 | dstrect = {0,0,0,0}; | |
176 | return; | |
177 | } | |
178 | if (dstrect.y > bounds.y+bounds.h) { | |
179 | dstrect = {0,0,0,0}; | |
180 | return; | |
181 | } | |
182 | if (dstrect.x+dstrect.w < bounds.x) { | |
183 | dstrect = {0,0,0,0}; | |
184 | return; | |
185 | } | |
186 | if (dstrect.y+dstrect.h < bounds.y) { | |
187 | dstrect = {0,0,0,0}; | |
188 | return; | |
189 | } | |
190 | if (dstrect.x < bounds.x) { | |
191 | Sint16 absDiff = bounds.x-dstrect.x; | |
192 | dstrect.x+=absDiff; | |
193 | srcrect.x+=absDiff; | |
194 | dstrect.w-=absDiff; | |
195 | srcrect.w-=absDiff; | |
196 | } | |
197 | if (dstrect.y < bounds.y) { | |
198 | Sint16 absDiff = bounds.y-dstrect.y; | |
199 | dstrect.y+=absDiff; | |
200 | srcrect.y+=absDiff; | |
201 | dstrect.h-=absDiff; | |
202 | srcrect.h-=absDiff; | |
203 | } | |
204 | if (dstrect.x+dstrect.w > bounds.x+bounds.w) { | |
205 | Sint16 absDiff = dstrect.x+dstrect.w-(bounds.x+bounds.w); | |
206 | dstrect.w -= absDiff; | |
207 | srcrect.w -= absDiff; | |
208 | } | |
209 | if (dstrect.y+dstrect.h > bounds.y+bounds.h) { | |
210 | Sint16 absDiff = dstrect.y+dstrect.h-(bounds.y+bounds.h); | |
211 | dstrect.h -= absDiff; | |
212 | srcrect.h -= absDiff; | |
213 | } | |
214 | } | |
215 | ||
216 | /** | |
217 | * Creates a new texture for a garabge block of size size_x*size_y at x,y and crops it. | |
218 | * Also sets globalData.screen to point to the texture, so Draw now draws on the Texture. | |
219 | */ | |
220 | SDL_Texture* CreateGarbageTexture(int x, int y, int size_x, int size_y, SDL_Rect& dstrect, SDL_Rect& srcrect) const { | |
221 | dstrect = { x, y, size_x*bsize, size_y*bsize }; | |
222 | srcrect = { 0, 0, size_x*bsize, size_y*bsize }; | |
223 | SDL_Rect bound = {topx, topy, backBoard.GetWidth(), backBoard.GetHeight()}; | |
224 | CropTexture (dstrect, srcrect, bound); | |
225 | SDL_Texture* mTexture = SDL_CreateTexture( globalData.screen, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, size_x*bsize, size_y*bsize ); | |
226 | SDL_SetRenderTarget( globalData.screen, mTexture ); | |
227 | ||
228 | SDL_SetRenderDrawBlendMode(globalData.screen, SDL_BLENDMODE_NONE); | |
229 | SDL_SetTextureBlendMode(mTexture, SDL_BLENDMODE_BLEND); | |
230 | SDL_SetRenderDrawColor(globalData.screen, 0, 0, 0, 0); | |
231 | SDL_RenderFillRect(globalData.screen, NULL); | |
232 | SDL_SetRenderDrawBlendMode(globalData.screen, SDL_BLENDMODE_BLEND); | |
233 | return mTexture; | |
234 | } | |
235 | ||
236 | /** | |
237 | Paints a garbage block of size size_x*size_y (size in blocks) at x,y (coordinates in pixels). | |
238 | The garbage block will be painted on an internal texture and rendered to screen to protect against tearing. | |
239 | The result will be cropped to the playable area. | |
240 | */ | |
241 | void PaintGarbageBlock(int x, int y, int size_x, int size_y) const { | |
242 | SDL_Rect dstrect ; | |
243 | SDL_Rect srcrect ; | |
244 | SDL_Texture* mTexture = CreateGarbageTexture(x, y, size_x, size_y, dstrect, srcrect); | |
245 | const Sint32 draw_time = SDL_GetTicks(); | |
246 | ||
247 | if (size_y == 1) { | |
248 | //single line | |
249 | garbageML.Draw(globalData.screen, draw_time, 0, 0); | |
250 | for (int i = 1; i < size_x-1; ++i) { | |
251 | garbageM.Draw(globalData.screen, draw_time, i*bsize, 0); | |
252 | } | |
253 | garbageMR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, 0); | |
254 | } | |
255 | if (size_y > 1) { | |
256 | // Top line | |
257 | garbageTL.Draw(globalData.screen, draw_time, 0, 0); | |
258 | for (int i = 1; i < size_x-1; ++i) { | |
259 | garbageT.Draw(globalData.screen, draw_time, i*bsize, 0); | |
260 | } | |
261 | garbageTR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, 0); | |
262 | // Middle lines (if any) | |
263 | for (int j=1; j < size_y-1; ++j) { | |
264 | garbageL.Draw(globalData.screen, draw_time, 0, j*bsize); | |
265 | for (int i = 1; i < size_x-1; ++i) { | |
266 | garbageFill.Draw(globalData.screen, draw_time, i*bsize, j*bsize); | |
267 | } | |
268 | garbageR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, j*bsize); | |
269 | } | |
270 | //Buttom line | |
271 | garbageBL.Draw(globalData.screen, draw_time, 0, (size_y-1)*bsize); | |
272 | for (int i = 1; i < size_x-1; ++i) { | |
273 | garbageB.Draw(globalData.screen, draw_time, i*bsize, (size_y-1)*bsize); | |
274 | } | |
275 | garbageBR.Draw(globalData.screen, draw_time, (size_x-1)*bsize, (size_y-1)*bsize); | |
276 | } | |
277 | ||
278 | SDL_SetRenderTarget( globalData.screen, nullptr ); | |
279 | SDL_RenderCopy( globalData.screen, mTexture, &srcrect, &dstrect ); | |
280 | SDL_DestroyTexture(mTexture); | |
281 | } | |
282 | ||
283 | /** | |
284 | Paints a grey garbage block of size size_x (size in blocks, always 6) at x,y (coordinates in pixels). | |
285 | The result will be cropped to the playable area. | |
286 | */ | |
287 | void PaintGreyGarbageBlock(int x, int y, int size_x) const { | |
288 | const int size_y = bsize; | |
289 | SDL_Rect dstrect ; | |
290 | SDL_Rect srcrect ; | |
291 | SDL_Texture* mTexture = CreateGarbageTexture(x, y, size_x, size_y, dstrect, srcrect); | |
292 | const Sint32 draw_time = SDL_GetTicks(); | |
293 | ||
294 | for (int j=0; j < size_y; ++j) { | |
295 | if (j==0) { | |
296 | garbageGML.Draw(globalData.screen, draw_time, j*bsize, 0); | |
297 | } | |
298 | else if (j==5) { | |
299 | garbageGMR.Draw(globalData.screen, draw_time, j*bsize, 0); | |
300 | } | |
301 | else { | |
302 | garbageGM.Draw(globalData.screen, draw_time, j*bsize, 0); | |
303 | } | |
304 | } | |
305 | ||
306 | SDL_SetRenderTarget( globalData.screen, nullptr ); | |
307 | SDL_RenderCopy( globalData.screen, mTexture, &srcrect, &dstrect ); | |
308 | SDL_DestroyTexture(mTexture); | |
309 | } | |
310 | ||
311 | std::pair<int, int> getGarbageSize(int topx, int topy) const { | |
312 | int size_x = 0; | |
313 | int size_y = 0; | |
314 | int number = board[topx][topy]; | |
315 | for (int i=topy; i < 30 ; ++i) { | |
316 | if(number == board[topx][i]) { | |
317 | ++size_y; | |
318 | } | |
319 | } | |
320 | for (int i=topx; i < 7 ; ++i) { | |
321 | if(number == board[i][topy]) { | |
322 | ++size_x; | |
323 | } | |
324 | } | |
325 | return std::make_pair(size_x, size_y); | |
326 | } | |
327 | ||
168 | 328 | //Draws all the bricks to the board (including garbage) |
169 | 329 | void PaintBricks() const { |
330 | int lastGarbageNumber = 0; | |
170 | 331 | for (int i=0; i<13; ++i) { |
171 | 332 | for (int j=0; j<6; ++j) { |
172 | 333 | int basicBrick = board[j][i]%10; //The basic brick, stored on the least significant digit |
181 | 342 | |
182 | 343 | } |
183 | 344 | if ((board[j][i]/1000000)%10==1) { |
184 | int left, right, over, under; | |
185 | 345 | int number = board[j][i]; |
186 | if (j<1) { | |
187 | left = -1; | |
346 | if (number != lastGarbageNumber) { | |
347 | const auto& garbage_size = getGarbageSize(j, i); | |
348 | lastGarbageNumber = number; | |
349 | PaintGarbageBlock(topx+j*bsize, topy+12*bsize-i*bsize-(garbage_size.second-1)*bsize -pixels, garbage_size.first, garbage_size.second); | |
188 | 350 | } |
189 | else { | |
190 | left = board[j-1][i]; | |
191 | } | |
192 | if (j>=5) { | |
193 | right = -1; | |
194 | } | |
195 | else { | |
196 | right = board[j+1][i]; | |
197 | } | |
198 | if (i>28) { | |
199 | over = -1; | |
200 | } | |
201 | else { | |
202 | over = board[j][i+1]; | |
203 | } | |
204 | if (i<1) { | |
205 | under = -1; | |
206 | } | |
207 | else { | |
208 | under = board[j][i-1]; | |
209 | } | |
210 | if ((left == number)&&(right == number)&&(over == number)&&(under == number)) { | |
211 | DrawImgBoardBounded(garbageFill, j*bsize, bsize*12-i*bsize-pixels); | |
212 | } | |
213 | if ((left != number)&&(right == number)&&(over == number)&&(under == number)) { | |
214 | DrawImgBoardBounded(garbageL, j*bsize, bsize*12-i*bsize-pixels); | |
215 | } | |
216 | if ((left == number)&&(right != number)&&(over == number)&&(under == number)) { | |
217 | DrawImgBoardBounded(garbageR, j*bsize, bsize*12-i*bsize-pixels); | |
218 | } | |
219 | if ((left == number)&&(right == number)&&(over != number)&&(under == number)) { | |
220 | DrawImgBoardBounded(garbageT, j*bsize, bsize*12-i*bsize-pixels); | |
221 | } | |
222 | if ((left == number)&&(right == number)&&(over == number)&&(under != number)) { | |
223 | DrawImgBoardBounded(garbageB, j*bsize, bsize*12-i*bsize-pixels); | |
224 | } | |
225 | if ((left != number)&&(right == number)&&(over != number)&&(under == number)) { | |
226 | DrawImgBoardBounded(garbageTL, j*bsize, bsize*12-i*bsize-pixels); | |
227 | } | |
228 | if ((left != number)&&(right == number)&&(over == number)&&(under != number)) { | |
229 | DrawImgBoardBounded(garbageBL, j*bsize, bsize*12-i*bsize-pixels); | |
230 | } | |
231 | if ((left == number)&&(right != number)&&(over != number)&&(under == number)) { | |
232 | DrawImgBoardBounded(garbageTR, j*bsize, bsize*12-i*bsize-pixels); | |
233 | } | |
234 | if ((left == number)&&(right != number)&&(over == number)&&(under != number)) { | |
235 | DrawImgBoardBounded(garbageBR, j*bsize, bsize*12-i*bsize-pixels); | |
236 | } | |
237 | if ((left == number)&&(right != number)&&(over != number)&&(under != number)) { | |
238 | DrawImgBoardBounded(garbageMR, j*bsize, bsize*12-i*bsize-pixels); | |
239 | } | |
240 | if ((left == number)&&(right == number)&&(over != number)&&(under != number)) { | |
241 | DrawImgBoardBounded(garbageM, j*bsize, bsize*12-i*bsize-pixels); | |
242 | } | |
243 | if ((left != number)&&(right == number)&&(over != number)&&(under != number)) { | |
244 | DrawImgBoardBounded(garbageML, j*bsize, bsize*12-i*bsize-pixels); | |
245 | } | |
246 | 351 | } |
247 | 352 | if ((board[j][i]/1000000)%10==2) { |
248 | if (j==0) { | |
249 | DrawImgBoardBounded(garbageGML, j*bsize, bsize*12-i*bsize-pixels); | |
250 | } | |
251 | else if (j==5) { | |
252 | DrawImgBoardBounded(garbageGMR, j*bsize, bsize*12-i*bsize-pixels); | |
253 | } | |
254 | else { | |
255 | DrawImgBoardBounded(garbageGM, j*bsize, bsize*12-i*bsize-pixels); | |
353 | int number = board[j][i]; | |
354 | if (number != lastGarbageNumber) { | |
355 | const auto& garbage_size = getGarbageSize(j, i); | |
356 | lastGarbageNumber = number; | |
357 | PaintGreyGarbageBlock(topx+j*bsize, topy+12*bsize-i*bsize-(garbage_size.second-1)*bsize -pixels, garbage_size.first); | |
256 | 358 | } |
257 | 359 | } |
258 | 360 | } |
26 | 26 | #include "ReadKeyboard.h" |
27 | 27 | #include "utf8.h" |
28 | 28 | #include "MenuSystem.h" |
29 | #include <unordered_map> | |
29 | 30 | |
30 | 31 | static void setButtonFont(const sago::SagoDataHolder* holder, sago::SagoTextField& field, const char* text) { |
31 | 32 | field.SetHolder(holder); |
36 | 37 | field.SetText(text); |
37 | 38 | } |
38 | 39 | |
40 | ||
41 | // Cache for DrawRect | |
42 | static std::unordered_map<std::string, SDL_Texture*> draw_rect_cache; | |
43 | static Uint64 draw_rect_cache_version=0; | |
44 | ||
45 | static void draw_rect_cache_clear() { | |
46 | for (auto&& it: draw_rect_cache) { | |
47 | SDL_DestroyTexture(it.second); | |
48 | } | |
49 | draw_rect_cache.clear(); | |
50 | } | |
51 | ||
52 | ||
39 | 53 | static void DrawRect(SDL_Renderer* target, int topx, int topy, int height, int width, const std::string& name) { |
40 | 54 | const int size = 32; |
41 | SDL_Rect bounds_ns = {topx, topy+size, width, height-2*size}; //bounds for south | |
42 | SDL_Rect bounds_e = {topx, topy, width-size, height}; | |
55 | SDL_Rect dstrect = { topx, topy, width, height }; | |
56 | std::string key_name = SPrintStringF("%s-%d-%d", name.c_str(),width, height); | |
57 | Uint64 new_version = globalData.spriteHolder->GetDataHolder().getVersion(); | |
58 | if (draw_rect_cache_version != new_version) { | |
59 | draw_rect_cache_clear(); | |
60 | draw_rect_cache_version = new_version; | |
61 | } | |
62 | if (draw_rect_cache.find(key_name) != draw_rect_cache.end()) { | |
63 | SDL_RenderCopy( target, draw_rect_cache[key_name], NULL, &dstrect ); | |
64 | return; | |
65 | } | |
66 | SDL_Rect bounds_ns = {0, size, width, height-2*size}; //bounds for south | |
67 | SDL_Rect bounds_e = {0, 0, width-size, height}; | |
68 | SDL_Texture* mTexture = SDL_CreateTexture( target, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, width, height ); | |
69 | draw_rect_cache[key_name] = mTexture; | |
70 | SDL_SetRenderTarget( target, mTexture ); | |
71 | ||
72 | SDL_SetRenderDrawBlendMode(target, SDL_BLENDMODE_NONE); | |
73 | SDL_SetTextureBlendMode(mTexture, SDL_BLENDMODE_BLEND); | |
74 | SDL_SetRenderDrawColor(target, 0, 0, 0, 0); | |
75 | SDL_RenderFillRect(target, NULL); | |
76 | SDL_SetRenderDrawBlendMode(target, SDL_BLENDMODE_BLEND); | |
77 | ||
43 | 78 | const sago::SagoSprite& n = globalData.spriteHolder->GetSprite(name+"n"); |
44 | 79 | const sago::SagoSprite& s = globalData.spriteHolder->GetSprite(name+"s"); |
45 | 80 | const sago::SagoSprite& e = globalData.spriteHolder->GetSprite(name+"e"); |
46 | 81 | const sago::SagoSprite& w = globalData.spriteHolder->GetSprite(name+"w"); |
47 | 82 | const sago::SagoSprite& fill = globalData.spriteHolder->GetSprite(name+"fill"); |
48 | 83 | for (int i = 1; i < width/size; ++i) { |
49 | n.DrawBounded(target, SDL_GetTicks(), topx+i*size, topy, bounds_e); | |
84 | n.DrawBounded(target, SDL_GetTicks(), i*size, 0, bounds_e); | |
50 | 85 | for (int j = 1; j < height/size; ++j) { |
51 | w.DrawBounded(target, SDL_GetTicks(), topx, topy+j*size, bounds_ns); | |
52 | fill.Draw(target, SDL_GetTicks(),topx+i*size, topy+j*size); | |
53 | e.DrawBounded(target, SDL_GetTicks(), topx+width-size, topy+j*size, bounds_ns); | |
54 | } | |
55 | s.DrawBounded(target, SDL_GetTicks(), topx+i*size, topy+height-size, bounds_e); | |
86 | w.DrawBounded(target, SDL_GetTicks(), 0, j*size, bounds_ns); | |
87 | fill.Draw(target, SDL_GetTicks(),i*size, j*size); | |
88 | e.DrawBounded(target, SDL_GetTicks(), width-size, j*size, bounds_ns); | |
89 | } | |
90 | s.DrawBounded(target, SDL_GetTicks(), i*size, height-size, bounds_e); | |
56 | 91 | } |
57 | 92 | //Corners |
58 | 93 | const sago::SagoSprite& nw = globalData.spriteHolder->GetSprite(name+"nw"); |
59 | 94 | const sago::SagoSprite& ne = globalData.spriteHolder->GetSprite(name+"ne"); |
60 | 95 | const sago::SagoSprite& se = globalData.spriteHolder->GetSprite(name+"se"); |
61 | 96 | const sago::SagoSprite& sw = globalData.spriteHolder->GetSprite(name+"sw"); |
62 | nw.Draw(target, SDL_GetTicks(), topx, topy); | |
63 | ne.Draw(target, SDL_GetTicks(), topx+width-size, topy); | |
64 | se.Draw(target, SDL_GetTicks(), topx+width-size, topy+height-size); | |
65 | sw.Draw(target, SDL_GetTicks(), topx, topy+height-size); | |
97 | nw.Draw(target, SDL_GetTicks(), 0, 0); | |
98 | ne.Draw(target, SDL_GetTicks(), width-size, 0); | |
99 | se.Draw(target, SDL_GetTicks(), width-size, height-size); | |
100 | sw.Draw(target, SDL_GetTicks(), 0, height-size); | |
101 | SDL_SetRenderTarget( target, nullptr ); | |
102 | SDL_RenderCopy( target, mTexture, NULL, &dstrect ); | |
66 | 103 | } |
67 | 104 | |
68 | 105 | static void DrawRectWhite(SDL_Renderer* target, int topx, int topy, int height, int width) { |
85 | 85 | DrawBackground(target); |
86 | 86 | const sago::SagoSprite& gamepad = globalData.spriteHolder->GetSprite("help_controller"); |
87 | 87 | gamepad.Draw(target, SDL_GetTicks(), globalData.xsize/2-480/2, 100); |
88 | SDL_SetRenderDrawColor(target, 0, 0, 0, SDL_ALPHA_OPAQUE); | |
88 | 89 | SDL_RenderDrawLine(target, 100+OFFSETX, 210, globalData.xsize/2-480/2+130, 210); |
89 | 90 | SDL_RenderDrawLine(target, 100+OFFSETX, 298, globalData.xsize/2-480/2+158, 298); |
90 | 91 | SDL_RenderDrawLine(target, 100+OFFSETX, 210, 100+OFFSETX, 400); |
165 | 165 | |
166 | 166 | void HelpHowtoState::Draw(SDL_Renderer* target) { |
167 | 167 | DrawBackground(target); |
168 | SDL_SetRenderDrawColor(target, 0, 0, 0, SDL_ALPHA_OPAQUE); | |
168 | 169 | RenderRowOfBricks(target, switchAnimation.brickStr, 50, 50); |
169 | 170 | globalData.spriteHolder->GetSprite("cursor").Draw(target, SDL_GetTicks(), 50+switchAnimation.cursorPos*50, 50); |
170 | 171 | switchAnimationField.Draw(target, 50 +150+30, 50+25, sago::SagoTextField::Alignment::left, sago::SagoTextField::VerticalAlignment::center); |
1 | 1 | ========================================== |
2 | 2 | Included in Block Attack - Rise of the Blocks. |
3 | 3 | |
4 | http://USCiLab.github.com/cereal | |
4 | https://uscilab.github.io/cereal/ | |
5 | 5 | |
6 | 6 | See LICENSE for more information |
7 | 7 |
0 | // Copyright 2006 Nemanja Trifunovic | |
1 | ||
2 | /* | |
3 | Permission is hereby granted, free of charge, to any person or organization | |
4 | obtaining a copy of the software and accompanying documentation covered by | |
5 | this license (the "Software") to use, reproduce, display, distribute, | |
6 | execute, and transmit the Software, and to prepare derivative works of the | |
7 | Software, and to permit third-parties to whom the Software is furnished to | |
8 | do so, all subject to the following: | |
9 | ||
10 | The copyright notices in the Software and this entire statement, including | |
11 | the above license grant, this restriction and the following disclaimer, | |
12 | must be included in all copies of the Software, in whole or in part, and | |
13 | all derivative works of the Software, unless such copies or derivative | |
14 | works are solely in the form of machine-executable object code generated by | |
15 | a source language processor. | |
16 | ||
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | |
20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | |
21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | |
22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
23 | DEALINGS IN THE SOFTWARE. | |
24 | */ | |
25 | ||
26 | ||
27 | #ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
28 | #define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
29 | ||
30 | #include "core.h" | |
31 | #include <stdexcept> | |
32 | ||
33 | namespace utf8 | |
34 | { | |
35 | // Base for the exceptions that may be thrown from the library | |
36 | class exception : public ::std::exception { | |
37 | }; | |
38 | ||
39 | // Exceptions that may be thrown from the library functions. | |
40 | class invalid_code_point : public exception { | |
41 | uint32_t cp; | |
42 | public: | |
43 | invalid_code_point(uint32_t cp) : cp(cp) {} | |
44 | virtual const char* what() const throw() { return "Invalid code point"; } | |
45 | uint32_t code_point() const {return cp;} | |
46 | }; | |
47 | ||
48 | class invalid_utf8 : public exception { | |
49 | uint8_t u8; | |
50 | public: | |
51 | invalid_utf8 (uint8_t u) : u8(u) {} | |
52 | virtual const char* what() const throw() { return "Invalid UTF-8"; } | |
53 | uint8_t utf8_octet() const {return u8;} | |
54 | }; | |
55 | ||
56 | class invalid_utf16 : public exception { | |
57 | uint16_t u16; | |
58 | public: | |
59 | invalid_utf16 (uint16_t u) : u16(u) {} | |
60 | virtual const char* what() const throw() { return "Invalid UTF-16"; } | |
61 | uint16_t utf16_word() const {return u16;} | |
62 | }; | |
63 | ||
64 | class not_enough_room : public exception { | |
65 | public: | |
66 | virtual const char* what() const throw() { return "Not enough space"; } | |
67 | }; | |
68 | ||
69 | /// The library API - functions intended to be called by the users | |
70 | ||
71 | template <typename octet_iterator> | |
72 | octet_iterator append(uint32_t cp, octet_iterator result) | |
73 | { | |
74 | if (!utf8::internal::is_code_point_valid(cp)) | |
75 | throw invalid_code_point(cp); | |
76 | ||
77 | if (cp < 0x80) // one octet | |
78 | *(result++) = static_cast<uint8_t>(cp); | |
79 | else if (cp < 0x800) { // two octets | |
80 | *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0); | |
81 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
82 | } | |
83 | else if (cp < 0x10000) { // three octets | |
84 | *(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0); | |
85 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); | |
86 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
87 | } | |
88 | else { // four octets | |
89 | *(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0); | |
90 | *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f) | 0x80); | |
91 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); | |
92 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
93 | } | |
94 | return result; | |
95 | } | |
96 | ||
97 | template <typename octet_iterator, typename output_iterator> | |
98 | output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) | |
99 | { | |
100 | while (start != end) { | |
101 | octet_iterator sequence_start = start; | |
102 | internal::utf_error err_code = utf8::internal::validate_next(start, end); | |
103 | switch (err_code) { | |
104 | case internal::UTF8_OK : | |
105 | for (octet_iterator it = sequence_start; it != start; ++it) | |
106 | *out++ = *it; | |
107 | break; | |
108 | case internal::NOT_ENOUGH_ROOM: | |
109 | throw not_enough_room(); | |
110 | case internal::INVALID_LEAD: | |
111 | out = utf8::append (replacement, out); | |
112 | ++start; | |
113 | break; | |
114 | case internal::INCOMPLETE_SEQUENCE: | |
115 | case internal::OVERLONG_SEQUENCE: | |
116 | case internal::INVALID_CODE_POINT: | |
117 | out = utf8::append (replacement, out); | |
118 | ++start; | |
119 | // just one replacement mark for the sequence | |
120 | while (start != end && utf8::internal::is_trail(*start)) | |
121 | ++start; | |
122 | break; | |
123 | } | |
124 | } | |
125 | return out; | |
126 | } | |
127 | ||
128 | template <typename octet_iterator, typename output_iterator> | |
129 | inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) | |
130 | { | |
131 | static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); | |
132 | return utf8::replace_invalid(start, end, out, replacement_marker); | |
133 | } | |
134 | ||
135 | template <typename octet_iterator> | |
136 | uint32_t next(octet_iterator& it, octet_iterator end) | |
137 | { | |
138 | uint32_t cp = 0; | |
139 | internal::utf_error err_code = utf8::internal::validate_next(it, end, cp); | |
140 | switch (err_code) { | |
141 | case internal::UTF8_OK : | |
142 | break; | |
143 | case internal::NOT_ENOUGH_ROOM : | |
144 | throw not_enough_room(); | |
145 | case internal::INVALID_LEAD : | |
146 | case internal::INCOMPLETE_SEQUENCE : | |
147 | case internal::OVERLONG_SEQUENCE : | |
148 | throw invalid_utf8(*it); | |
149 | case internal::INVALID_CODE_POINT : | |
150 | throw invalid_code_point(cp); | |
151 | } | |
152 | return cp; | |
153 | } | |
154 | ||
155 | template <typename octet_iterator> | |
156 | uint32_t peek_next(octet_iterator it, octet_iterator end) | |
157 | { | |
158 | return utf8::next(it, end); | |
159 | } | |
160 | ||
161 | template <typename octet_iterator> | |
162 | uint32_t prior(octet_iterator& it, octet_iterator start) | |
163 | { | |
164 | // can't do much if it == start | |
165 | if (it == start) | |
166 | throw not_enough_room(); | |
167 | ||
168 | octet_iterator end = it; | |
169 | // Go back until we hit either a lead octet or start | |
170 | while (utf8::internal::is_trail(*(--it))) | |
171 | if (it == start) | |
172 | throw invalid_utf8(*it); // error - no lead byte in the sequence | |
173 | return utf8::peek_next(it, end); | |
174 | } | |
175 | ||
176 | /// Deprecated in versions that include "prior" | |
177 | template <typename octet_iterator> | |
178 | uint32_t previous(octet_iterator& it, octet_iterator pass_start) | |
179 | { | |
180 | octet_iterator end = it; | |
181 | while (utf8::internal::is_trail(*(--it))) | |
182 | if (it == pass_start) | |
183 | throw invalid_utf8(*it); // error - no lead byte in the sequence | |
184 | octet_iterator temp = it; | |
185 | return utf8::next(temp, end); | |
186 | } | |
187 | ||
188 | template <typename octet_iterator, typename distance_type> | |
189 | void advance (octet_iterator& it, distance_type n, octet_iterator end) | |
190 | { | |
191 | for (distance_type i = 0; i < n; ++i) | |
192 | utf8::next(it, end); | |
193 | } | |
194 | ||
195 | template <typename octet_iterator> | |
196 | typename std::iterator_traits<octet_iterator>::difference_type | |
197 | distance (octet_iterator first, octet_iterator last) | |
198 | { | |
199 | typename std::iterator_traits<octet_iterator>::difference_type dist; | |
200 | for (dist = 0; first < last; ++dist) | |
201 | utf8::next(first, last); | |
202 | return dist; | |
203 | } | |
204 | ||
205 | template <typename u16bit_iterator, typename octet_iterator> | |
206 | octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) | |
207 | { | |
208 | while (start != end) { | |
209 | uint32_t cp = utf8::internal::mask16(*start++); | |
210 | // Take care of surrogate pairs first | |
211 | if (utf8::internal::is_lead_surrogate(cp)) { | |
212 | if (start != end) { | |
213 | uint32_t trail_surrogate = utf8::internal::mask16(*start++); | |
214 | if (utf8::internal::is_trail_surrogate(trail_surrogate)) | |
215 | cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; | |
216 | else | |
217 | throw invalid_utf16(static_cast<uint16_t>(trail_surrogate)); | |
218 | } | |
219 | else | |
220 | throw invalid_utf16(static_cast<uint16_t>(cp)); | |
221 | ||
222 | } | |
223 | // Lone trail surrogate | |
224 | else if (utf8::internal::is_trail_surrogate(cp)) | |
225 | throw invalid_utf16(static_cast<uint16_t>(cp)); | |
226 | ||
227 | result = utf8::append(cp, result); | |
228 | } | |
229 | return result; | |
230 | } | |
231 | ||
232 | template <typename u16bit_iterator, typename octet_iterator> | |
233 | u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) | |
234 | { | |
235 | while (start != end) { | |
236 | uint32_t cp = utf8::next(start, end); | |
237 | if (cp > 0xffff) { //make a surrogate pair | |
238 | *result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET); | |
239 | *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); | |
240 | } | |
241 | else | |
242 | *result++ = static_cast<uint16_t>(cp); | |
243 | } | |
244 | return result; | |
245 | } | |
246 | ||
247 | template <typename octet_iterator, typename u32bit_iterator> | |
248 | octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) | |
249 | { | |
250 | while (start != end) | |
251 | result = utf8::append(*(start++), result); | |
252 | ||
253 | return result; | |
254 | } | |
255 | ||
256 | template <typename octet_iterator, typename u32bit_iterator> | |
257 | u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) | |
258 | { | |
259 | while (start != end) | |
260 | (*result++) = utf8::next(start, end); | |
261 | ||
262 | return result; | |
263 | } | |
264 | ||
265 | // The iterator class | |
266 | template <typename octet_iterator> | |
267 | class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> { | |
268 | octet_iterator it; | |
269 | octet_iterator range_start; | |
270 | octet_iterator range_end; | |
271 | public: | |
272 | iterator () {} | |
273 | explicit iterator (const octet_iterator& octet_it, | |
274 | const octet_iterator& range_start, | |
275 | const octet_iterator& range_end) : | |
276 | it(octet_it), range_start(range_start), range_end(range_end) | |
277 | { | |
278 | if (it < range_start || it > range_end) | |
279 | throw std::out_of_range("Invalid utf-8 iterator position"); | |
280 | } | |
281 | // the default "big three" are OK | |
282 | octet_iterator base () const { return it; } | |
283 | uint32_t operator * () const | |
284 | { | |
285 | octet_iterator temp = it; | |
286 | return utf8::next(temp, range_end); | |
287 | } | |
288 | bool operator == (const iterator& rhs) const | |
289 | { | |
290 | if (range_start != rhs.range_start || range_end != rhs.range_end) | |
291 | throw std::logic_error("Comparing utf-8 iterators defined with different ranges"); | |
292 | return (it == rhs.it); | |
293 | } | |
294 | bool operator != (const iterator& rhs) const | |
295 | { | |
296 | return !(operator == (rhs)); | |
297 | } | |
298 | iterator& operator ++ () | |
299 | { | |
300 | utf8::next(it, range_end); | |
301 | return *this; | |
302 | } | |
303 | iterator operator ++ (int) | |
304 | { | |
305 | iterator temp = *this; | |
306 | utf8::next(it, range_end); | |
307 | return temp; | |
308 | } | |
309 | iterator& operator -- () | |
310 | { | |
311 | utf8::prior(it, range_start); | |
312 | return *this; | |
313 | } | |
314 | iterator operator -- (int) | |
315 | { | |
316 | iterator temp = *this; | |
317 | utf8::prior(it, range_start); | |
318 | return temp; | |
319 | } | |
320 | }; // class iterator | |
321 | ||
322 | } // namespace utf8 | |
323 | ||
324 | #endif //header guard | |
325 | ||
326 |
0 | // Copyright 2006 Nemanja Trifunovic | |
1 | ||
2 | /* | |
3 | Permission is hereby granted, free of charge, to any person or organization | |
4 | obtaining a copy of the software and accompanying documentation covered by | |
5 | this license (the "Software") to use, reproduce, display, distribute, | |
6 | execute, and transmit the Software, and to prepare derivative works of the | |
7 | Software, and to permit third-parties to whom the Software is furnished to | |
8 | do so, all subject to the following: | |
9 | ||
10 | The copyright notices in the Software and this entire statement, including | |
11 | the above license grant, this restriction and the following disclaimer, | |
12 | must be included in all copies of the Software, in whole or in part, and | |
13 | all derivative works of the Software, unless such copies or derivative | |
14 | works are solely in the form of machine-executable object code generated by | |
15 | a source language processor. | |
16 | ||
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | |
20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | |
21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | |
22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
23 | DEALINGS IN THE SOFTWARE. | |
24 | */ | |
25 | ||
26 | ||
27 | #ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
28 | #define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
29 | ||
30 | #include <iterator> | |
31 | ||
32 | namespace utf8 | |
33 | { | |
34 | // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers | |
35 | // You may need to change them to match your system. | |
36 | // These typedefs have the same names as ones from cstdint, or boost/cstdint | |
37 | typedef unsigned char uint8_t; | |
38 | typedef unsigned short uint16_t; | |
39 | typedef unsigned int uint32_t; | |
40 | ||
41 | // Helper code - not intended to be directly called by the library users. May be changed at any time | |
42 | namespace internal | |
43 | { | |
44 | // Unicode constants | |
45 | // Leading (high) surrogates: 0xd800 - 0xdbff | |
46 | // Trailing (low) surrogates: 0xdc00 - 0xdfff | |
47 | const uint16_t LEAD_SURROGATE_MIN = 0xd800u; | |
48 | const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; | |
49 | const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; | |
50 | const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; | |
51 | const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10); | |
52 | const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN; | |
53 | ||
54 | // Maximum valid value for a Unicode code point | |
55 | const uint32_t CODE_POINT_MAX = 0x0010ffffu; | |
56 | ||
57 | template<typename octet_type> | |
58 | inline uint8_t mask8(octet_type oc) | |
59 | { | |
60 | return static_cast<uint8_t>(0xff & oc); | |
61 | } | |
62 | template<typename u16_type> | |
63 | inline uint16_t mask16(u16_type oc) | |
64 | { | |
65 | return static_cast<uint16_t>(0xffff & oc); | |
66 | } | |
67 | template<typename octet_type> | |
68 | inline bool is_trail(octet_type oc) | |
69 | { | |
70 | return ((utf8::internal::mask8(oc) >> 6) == 0x2); | |
71 | } | |
72 | ||
73 | template <typename u16> | |
74 | inline bool is_lead_surrogate(u16 cp) | |
75 | { | |
76 | return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX); | |
77 | } | |
78 | ||
79 | template <typename u16> | |
80 | inline bool is_trail_surrogate(u16 cp) | |
81 | { | |
82 | return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); | |
83 | } | |
84 | ||
85 | template <typename u16> | |
86 | inline bool is_surrogate(u16 cp) | |
87 | { | |
88 | return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); | |
89 | } | |
90 | ||
91 | template <typename u32> | |
92 | inline bool is_code_point_valid(u32 cp) | |
93 | { | |
94 | return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp)); | |
95 | } | |
96 | ||
97 | template <typename octet_iterator> | |
98 | inline typename std::iterator_traits<octet_iterator>::difference_type | |
99 | sequence_length(octet_iterator lead_it) | |
100 | { | |
101 | uint8_t lead = utf8::internal::mask8(*lead_it); | |
102 | if (lead < 0x80) | |
103 | return 1; | |
104 | else if ((lead >> 5) == 0x6) | |
105 | return 2; | |
106 | else if ((lead >> 4) == 0xe) | |
107 | return 3; | |
108 | else if ((lead >> 3) == 0x1e) | |
109 | return 4; | |
110 | else | |
111 | return 0; | |
112 | } | |
113 | ||
114 | template <typename octet_difference_type> | |
115 | inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length) | |
116 | { | |
117 | if (cp < 0x80) { | |
118 | if (length != 1) | |
119 | return true; | |
120 | } | |
121 | else if (cp < 0x800) { | |
122 | if (length != 2) | |
123 | return true; | |
124 | } | |
125 | else if (cp < 0x10000) { | |
126 | if (length != 3) | |
127 | return true; | |
128 | } | |
129 | ||
130 | return false; | |
131 | } | |
132 | ||
133 | enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT}; | |
134 | ||
135 | /// Helper for get_sequence_x | |
136 | template <typename octet_iterator> | |
137 | utf_error increase_safely(octet_iterator& it, octet_iterator end) | |
138 | { | |
139 | if (++it == end) | |
140 | return NOT_ENOUGH_ROOM; | |
141 | ||
142 | if (!utf8::internal::is_trail(*it)) | |
143 | return INCOMPLETE_SEQUENCE; | |
144 | ||
145 | return UTF8_OK; | |
146 | } | |
147 | ||
148 | #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;} | |
149 | ||
150 | /// get_sequence_x functions decode utf-8 sequences of the length x | |
151 | template <typename octet_iterator> | |
152 | utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
153 | { | |
154 | if (it == end) | |
155 | return NOT_ENOUGH_ROOM; | |
156 | ||
157 | code_point = utf8::internal::mask8(*it); | |
158 | ||
159 | return UTF8_OK; | |
160 | } | |
161 | ||
162 | template <typename octet_iterator> | |
163 | utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
164 | { | |
165 | if (it == end) | |
166 | return NOT_ENOUGH_ROOM; | |
167 | ||
168 | code_point = utf8::internal::mask8(*it); | |
169 | ||
170 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
171 | ||
172 | code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f); | |
173 | ||
174 | return UTF8_OK; | |
175 | } | |
176 | ||
177 | template <typename octet_iterator> | |
178 | utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
179 | { | |
180 | if (it == end) | |
181 | return NOT_ENOUGH_ROOM; | |
182 | ||
183 | code_point = utf8::internal::mask8(*it); | |
184 | ||
185 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
186 | ||
187 | code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); | |
188 | ||
189 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
190 | ||
191 | code_point += (*it) & 0x3f; | |
192 | ||
193 | return UTF8_OK; | |
194 | } | |
195 | ||
196 | template <typename octet_iterator> | |
197 | utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
198 | { | |
199 | if (it == end) | |
200 | return NOT_ENOUGH_ROOM; | |
201 | ||
202 | code_point = utf8::internal::mask8(*it); | |
203 | ||
204 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
205 | ||
206 | code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); | |
207 | ||
208 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
209 | ||
210 | code_point += (utf8::internal::mask8(*it) << 6) & 0xfff; | |
211 | ||
212 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
213 | ||
214 | code_point += (*it) & 0x3f; | |
215 | ||
216 | return UTF8_OK; | |
217 | } | |
218 | ||
219 | #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR | |
220 | ||
221 | template <typename octet_iterator> | |
222 | utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
223 | { | |
224 | // Save the original value of it so we can go back in case of failure | |
225 | // Of course, it does not make much sense with i.e. stream iterators | |
226 | octet_iterator original_it = it; | |
227 | ||
228 | uint32_t cp = 0; | |
229 | // Determine the sequence length based on the lead octet | |
230 | typedef typename std::iterator_traits<octet_iterator>::difference_type octet_difference_type; | |
231 | const octet_difference_type length = utf8::internal::sequence_length(it); | |
232 | ||
233 | // Get trail octets and calculate the code point | |
234 | utf_error err = UTF8_OK; | |
235 | switch (length) { | |
236 | case 0: | |
237 | return INVALID_LEAD; | |
238 | case 1: | |
239 | err = utf8::internal::get_sequence_1(it, end, cp); | |
240 | break; | |
241 | case 2: | |
242 | err = utf8::internal::get_sequence_2(it, end, cp); | |
243 | break; | |
244 | case 3: | |
245 | err = utf8::internal::get_sequence_3(it, end, cp); | |
246 | break; | |
247 | case 4: | |
248 | err = utf8::internal::get_sequence_4(it, end, cp); | |
249 | break; | |
250 | } | |
251 | ||
252 | if (err == UTF8_OK) { | |
253 | // Decoding succeeded. Now, security checks... | |
254 | if (utf8::internal::is_code_point_valid(cp)) { | |
255 | if (!utf8::internal::is_overlong_sequence(cp, length)){ | |
256 | // Passed! Return here. | |
257 | code_point = cp; | |
258 | ++it; | |
259 | return UTF8_OK; | |
260 | } | |
261 | else | |
262 | err = OVERLONG_SEQUENCE; | |
263 | } | |
264 | else | |
265 | err = INVALID_CODE_POINT; | |
266 | } | |
267 | ||
268 | // Failure branch - restore the original value of the iterator | |
269 | it = original_it; | |
270 | return err; | |
271 | } | |
272 | ||
273 | template <typename octet_iterator> | |
274 | inline utf_error validate_next(octet_iterator& it, octet_iterator end) { | |
275 | uint32_t ignored; | |
276 | return utf8::internal::validate_next(it, end, ignored); | |
277 | } | |
278 | ||
279 | } // namespace internal | |
280 | ||
281 | /// The library API - functions intended to be called by the users | |
282 | ||
283 | // Byte order mark | |
284 | const uint8_t bom[] = {0xef, 0xbb, 0xbf}; | |
285 | ||
286 | template <typename octet_iterator> | |
287 | octet_iterator find_invalid(octet_iterator start, octet_iterator end) | |
288 | { | |
289 | octet_iterator result = start; | |
290 | while (result != end) { | |
291 | utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end); | |
292 | if (err_code != internal::UTF8_OK) | |
293 | return result; | |
294 | } | |
295 | return result; | |
296 | } | |
297 | ||
298 | template <typename octet_iterator> | |
299 | inline bool is_valid(octet_iterator start, octet_iterator end) | |
300 | { | |
301 | return (utf8::find_invalid(start, end) == end); | |
302 | } | |
303 | ||
304 | template <typename octet_iterator> | |
305 | inline bool starts_with_bom (octet_iterator it, octet_iterator end) | |
306 | { | |
307 | return ( | |
308 | ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) && | |
309 | ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) && | |
310 | ((it != end) && (utf8::internal::mask8(*it)) == bom[2]) | |
311 | ); | |
312 | } | |
313 | ||
314 | //Deprecated in release 2.3 | |
315 | template <typename octet_iterator> | |
316 | inline bool is_bom (octet_iterator it) | |
317 | { | |
318 | return ( | |
319 | (utf8::internal::mask8(*it++)) == bom[0] && | |
320 | (utf8::internal::mask8(*it++)) == bom[1] && | |
321 | (utf8::internal::mask8(*it)) == bom[2] | |
322 | ); | |
323 | } | |
324 | } // namespace utf8 | |
325 | ||
326 | #endif // header guard | |
327 | ||
328 |
0 | // Copyright 2006 Nemanja Trifunovic | |
1 | ||
2 | /* | |
3 | Permission is hereby granted, free of charge, to any person or organization | |
4 | obtaining a copy of the software and accompanying documentation covered by | |
5 | this license (the "Software") to use, reproduce, display, distribute, | |
6 | execute, and transmit the Software, and to prepare derivative works of the | |
7 | Software, and to permit third-parties to whom the Software is furnished to | |
8 | do so, all subject to the following: | |
9 | ||
10 | The copyright notices in the Software and this entire statement, including | |
11 | the above license grant, this restriction and the following disclaimer, | |
12 | must be included in all copies of the Software, in whole or in part, and | |
13 | all derivative works of the Software, unless such copies or derivative | |
14 | works are solely in the form of machine-executable object code generated by | |
15 | a source language processor. | |
16 | ||
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | |
20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | |
21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | |
22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
23 | DEALINGS IN THE SOFTWARE. | |
24 | */ | |
25 | ||
26 | ||
27 | #ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
28 | #define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
29 | ||
30 | #include "core.h" | |
31 | ||
32 | namespace utf8 | |
33 | { | |
34 | namespace unchecked | |
35 | { | |
36 | template <typename octet_iterator> | |
37 | octet_iterator append(uint32_t cp, octet_iterator result) | |
38 | { | |
39 | if (cp < 0x80) // one octet | |
40 | *(result++) = static_cast<uint8_t>(cp); | |
41 | else if (cp < 0x800) { // two octets | |
42 | *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0); | |
43 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
44 | } | |
45 | else if (cp < 0x10000) { // three octets | |
46 | *(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0); | |
47 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); | |
48 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
49 | } | |
50 | else { // four octets | |
51 | *(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0); | |
52 | *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80); | |
53 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); | |
54 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
55 | } | |
56 | return result; | |
57 | } | |
58 | ||
59 | template <typename octet_iterator> | |
60 | uint32_t next(octet_iterator& it) | |
61 | { | |
62 | uint32_t cp = utf8::internal::mask8(*it); | |
63 | typename std::iterator_traits<octet_iterator>::difference_type length = utf8::internal::sequence_length(it); | |
64 | switch (length) { | |
65 | case 1: | |
66 | break; | |
67 | case 2: | |
68 | it++; | |
69 | cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f); | |
70 | break; | |
71 | case 3: | |
72 | ++it; | |
73 | cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); | |
74 | ++it; | |
75 | cp += (*it) & 0x3f; | |
76 | break; | |
77 | case 4: | |
78 | ++it; | |
79 | cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); | |
80 | ++it; | |
81 | cp += (utf8::internal::mask8(*it) << 6) & 0xfff; | |
82 | ++it; | |
83 | cp += (*it) & 0x3f; | |
84 | break; | |
85 | } | |
86 | ++it; | |
87 | return cp; | |
88 | } | |
89 | ||
90 | template <typename octet_iterator> | |
91 | uint32_t peek_next(octet_iterator it) | |
92 | { | |
93 | return utf8::unchecked::next(it); | |
94 | } | |
95 | ||
96 | template <typename octet_iterator> | |
97 | uint32_t prior(octet_iterator& it) | |
98 | { | |
99 | while (utf8::internal::is_trail(*(--it))) ; | |
100 | octet_iterator temp = it; | |
101 | return utf8::unchecked::next(temp); | |
102 | } | |
103 | ||
104 | // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous) | |
105 | template <typename octet_iterator> | |
106 | inline uint32_t previous(octet_iterator& it) | |
107 | { | |
108 | return utf8::unchecked::prior(it); | |
109 | } | |
110 | ||
111 | template <typename octet_iterator, typename distance_type> | |
112 | void advance (octet_iterator& it, distance_type n) | |
113 | { | |
114 | for (distance_type i = 0; i < n; ++i) | |
115 | utf8::unchecked::next(it); | |
116 | } | |
117 | ||
118 | template <typename octet_iterator> | |
119 | typename std::iterator_traits<octet_iterator>::difference_type | |
120 | distance (octet_iterator first, octet_iterator last) | |
121 | { | |
122 | typename std::iterator_traits<octet_iterator>::difference_type dist; | |
123 | for (dist = 0; first < last; ++dist) | |
124 | utf8::unchecked::next(first); | |
125 | return dist; | |
126 | } | |
127 | ||
128 | template <typename u16bit_iterator, typename octet_iterator> | |
129 | octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) | |
130 | { | |
131 | while (start != end) { | |
132 | uint32_t cp = utf8::internal::mask16(*start++); | |
133 | // Take care of surrogate pairs first | |
134 | if (utf8::internal::is_lead_surrogate(cp)) { | |
135 | uint32_t trail_surrogate = utf8::internal::mask16(*start++); | |
136 | cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; | |
137 | } | |
138 | result = utf8::unchecked::append(cp, result); | |
139 | } | |
140 | return result; | |
141 | } | |
142 | ||
143 | template <typename u16bit_iterator, typename octet_iterator> | |
144 | u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) | |
145 | { | |
146 | while (start < end) { | |
147 | uint32_t cp = utf8::unchecked::next(start); | |
148 | if (cp > 0xffff) { //make a surrogate pair | |
149 | *result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET); | |
150 | *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); | |
151 | } | |
152 | else | |
153 | *result++ = static_cast<uint16_t>(cp); | |
154 | } | |
155 | return result; | |
156 | } | |
157 | ||
158 | template <typename octet_iterator, typename u32bit_iterator> | |
159 | octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) | |
160 | { | |
161 | while (start != end) | |
162 | result = utf8::unchecked::append(*(start++), result); | |
163 | ||
164 | return result; | |
165 | } | |
166 | ||
167 | template <typename octet_iterator, typename u32bit_iterator> | |
168 | u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) | |
169 | { | |
170 | while (start < end) | |
171 | (*result++) = utf8::unchecked::next(start); | |
172 | ||
173 | return result; | |
174 | } | |
175 | ||
176 | // The iterator class | |
177 | template <typename octet_iterator> | |
178 | class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> { | |
179 | octet_iterator it; | |
180 | public: | |
181 | iterator () {} | |
182 | explicit iterator (const octet_iterator& octet_it): it(octet_it) {} | |
183 | // the default "big three" are OK | |
184 | octet_iterator base () const { return it; } | |
185 | uint32_t operator * () const | |
186 | { | |
187 | octet_iterator temp = it; | |
188 | return utf8::unchecked::next(temp); | |
189 | } | |
190 | bool operator == (const iterator& rhs) const | |
191 | { | |
192 | return (it == rhs.it); | |
193 | } | |
194 | bool operator != (const iterator& rhs) const | |
195 | { | |
196 | return !(operator == (rhs)); | |
197 | } | |
198 | iterator& operator ++ () | |
199 | { | |
200 | ::std::advance(it, utf8::internal::sequence_length(it)); | |
201 | return *this; | |
202 | } | |
203 | iterator operator ++ (int) | |
204 | { | |
205 | iterator temp = *this; | |
206 | ::std::advance(it, utf8::internal::sequence_length(it)); | |
207 | return temp; | |
208 | } | |
209 | iterator& operator -- () | |
210 | { | |
211 | utf8::unchecked::prior(it); | |
212 | return *this; | |
213 | } | |
214 | iterator operator -- (int) | |
215 | { | |
216 | iterator temp = *this; | |
217 | utf8::unchecked::prior(it); | |
218 | return temp; | |
219 | } | |
220 | }; // class iterator | |
221 | ||
222 | } // namespace utf8::unchecked | |
223 | } // namespace utf8 | |
224 | ||
225 | ||
226 | #endif // header guard | |
227 |
0 | // Copyright 2006 Nemanja Trifunovic | |
1 | ||
2 | /* | |
3 | Permission is hereby granted, free of charge, to any person or organization | |
4 | obtaining a copy of the software and accompanying documentation covered by | |
5 | this license (the "Software") to use, reproduce, display, distribute, | |
6 | execute, and transmit the Software, and to prepare derivative works of the | |
7 | Software, and to permit third-parties to whom the Software is furnished to | |
8 | do so, all subject to the following: | |
9 | ||
10 | The copyright notices in the Software and this entire statement, including | |
11 | the above license grant, this restriction and the following disclaimer, | |
12 | must be included in all copies of the Software, in whole or in part, and | |
13 | all derivative works of the Software, unless such copies or derivative | |
14 | works are solely in the form of machine-executable object code generated by | |
15 | a source language processor. | |
16 | ||
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | |
20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | |
21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | |
22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
23 | DEALINGS IN THE SOFTWARE. | |
24 | */ | |
25 | ||
26 | ||
27 | #ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
28 | #define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
29 | ||
30 | #include "utf8/checked.h" | |
31 | #include "utf8/unchecked.h" | |
32 | ||
33 | #endif // header guard |
58 | 58 | return labels[text].get(); |
59 | 59 | } |
60 | 60 | |
61 | Button::Button(const Button& b) : action{b.action}, label{b.label}, marked{b.marked} { | |
61 | Button::Button(const Button& b) : action{b.action}, popOnRun{b.popOnRun}, label{b.label}, marked{b.marked} { | |
62 | 62 | } |
63 | 63 | |
64 | 64 | Button& Button::operator=(const Button& other) { |
65 | 65 | action = other.action; |
66 | 66 | label = other.label; |
67 | 67 | marked = other.marked; |
68 | popOnRun = other.popOnRun; | |
68 | 69 | return *this; |
69 | 70 | } |
70 | 71 | |
100 | 101 | globalData.spriteHolder->GetSprite(menu_unmarked).Draw(globalData.screen, SDL_GetTicks(), b.x, b.y); |
101 | 102 | } |
102 | 103 | |
103 | standardButton.getLabel(b.label)->Draw(globalData.screen, b.x+standardButton.xsize/2,b.y+standardButton.ysize/2, | |
104 | standardButton.getLabel(b.getLabel())->Draw(globalData.screen, b.x+standardButton.xsize/2,b.y+standardButton.ysize/2, | |
104 | 105 | sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center); |
105 | 106 | } |
106 | 107 |
52 | 52 | { |
53 | 53 | private: |
54 | 54 | //Pointer to a callback function. |
55 | void (*action)(void); | |
55 | void (*action)(void) = nullptr; | |
56 | 56 | |
57 | 57 | //If true the menu should also be closed then the button is clicked |
58 | 58 | bool popOnRun = false; |
59 | 59 | |
60 | public: | |
61 | 60 | //The label. This is written on the button |
62 | 61 | std::string label; |
62 | public: | |
63 | 63 | //Is the button marked? |
64 | 64 | bool marked = false; |
65 | 65 | //Where is the button on the screen |
80 | 80 | virtual void doAction(); //Run the callback function |
81 | 81 | void setPopOnRun(bool popOnRun); |
82 | 82 | bool isPopOnRun() const; |
83 | virtual const std::string& getLabel() const {return this->label; }; | |
83 | 84 | |
84 | 85 | //May hold any other information the callback might need |
85 | 86 | int iGeneric1 = 0; |
0 | /* | |
1 | =========================================================================== | |
2 | blockattack - Block Attack - Rise of the Blocks | |
3 | Copyright (C) 2005-2020 Poul Sander | |
4 | ||
5 | This program is free software: you can redistribute it and/or modify | |
6 | it under the terms of the GNU General Public License as published by | |
7 | the Free Software Foundation, either version 2 of the License, or | |
8 | (at your option) any later version. | |
9 | ||
10 | This program is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this program. If not, see http://www.gnu.org/licenses/ | |
17 | ||
18 | Source information and contacts persons can be found at | |
19 | https://blockattack.net | |
20 | =========================================================================== | |
21 | */ | |
22 | ||
23 | #include "ModConfigMenuState.hpp" | |
24 | #include "MenuSystem.h" | |
25 | #include "global.hpp" | |
26 | #include "MenuSystem.h" | |
27 | #include "sago/SagoMisc.hpp" | |
28 | #include "os.hpp" | |
29 | #include <boost/algorithm/string/predicate.hpp> | |
30 | ||
31 | const int buttonOffset = 160; | |
32 | extern sago::SagoSprite bExit; | |
33 | ||
34 | bool sort_mods_enabled_order (const Mod& i,const Mod& j) { | |
35 | if (i.enabled && !j.enabled) { | |
36 | //Enabled mods always goes before disabled ones | |
37 | return true; | |
38 | } | |
39 | if (i.enabled) { | |
40 | return i.order < j.order; | |
41 | } | |
42 | return i.name < j.name; | |
43 | } | |
44 | ||
45 | static void initMods(std::vector<Mod>& mod_list) { | |
46 | for (size_t i=0; i < globalData.modList.size(); ++i) { | |
47 | for (Mod& m : mod_list) { | |
48 | if (m.name == globalData.modList[i]) { | |
49 | m.order = i; | |
50 | m.enabled = true; | |
51 | } | |
52 | } | |
53 | } | |
54 | std::sort(mod_list.begin(), mod_list.end(), sort_mods_enabled_order); | |
55 | } | |
56 | ||
57 | static void appendMods(const std::vector<std::string>& mod_files, const std::string& dir, std::vector<Mod>& mods_available) { | |
58 | for (const std::string& mod : mod_files) { | |
59 | if (!boost::ends_with(mod, ".data")) { | |
60 | continue; | |
61 | } | |
62 | Mod m; | |
63 | m.name = mod.substr(0, mod.length()-5); | |
64 | m.filename = dir + "/" + mod; | |
65 | mods_available.push_back(m); | |
66 | } | |
67 | } | |
68 | ||
69 | ||
70 | ModConfigMenuState::ModConfigMenuState() { | |
71 | mods_available.clear(); | |
72 | std::string baseMods = std::string(PHYSFS_getBaseDir())+ "/mods"; | |
73 | std::vector<std::string> baseModFiles = OsGetDirFileList(baseMods); | |
74 | appendMods(baseModFiles, baseMods, mods_available); | |
75 | std::string userMods = getPathToSaveFiles()+"/mods"; | |
76 | std::vector<std::string> userModFiles = OsGetDirFileList(userMods); | |
77 | appendMods(userModFiles, userMods, mods_available); | |
78 | initMods(mods_available); | |
79 | } | |
80 | ||
81 | ModConfigMenuState::~ModConfigMenuState() {} | |
82 | ||
83 | bool ModConfigMenuState::IsActive() { | |
84 | return isActive; | |
85 | } | |
86 | ||
87 | void ModConfigMenuState::Draw(SDL_Renderer* target) { | |
88 | DrawBackground(target); | |
89 | standardButton.getLabel(_("Mod config"))->Draw(target, 50, 50); | |
90 | for (size_t i = 0; i < mods_available.size(); ++i) { | |
91 | standardButton.getLabel(mods_available[i].name)->Draw(target, 60, 160+30*i); | |
92 | standardButton.getLabel(mods_available[i].enabled ? _("Yes") : _("No"))->Draw(target, 600, 160+30*i); | |
93 | if (mods_available[i].enabled) { | |
94 | standardButton.getLabel(std::to_string(mods_available[i].order))->Draw(target, 700, 160+30*i); | |
95 | } | |
96 | } | |
97 | bExit.Draw(globalData.screen, SDL_GetTicks(), globalData.xsize-buttonOffset, globalData.ysize-buttonOffset); | |
98 | } | |
99 | ||
100 | void ModConfigMenuState::ProcessInput(const SDL_Event& event, bool& processed) { | |
101 | if (isEscapeEvent(event)) { | |
102 | isActive = false; | |
103 | processed = true; | |
104 | } | |
105 | } | |
106 | ||
107 | void ModConfigMenuState::Update() { | |
108 | // If the mouse button is released, make bMouseUp equal true | |
109 | if ( !(SDL_GetMouseState(nullptr, nullptr)&SDL_BUTTON(1)) ) { | |
110 | bMouseUp=true; | |
111 | } | |
112 | ||
113 | if (SDL_GetMouseState(nullptr,nullptr)&SDL_BUTTON(1) && bMouseUp) { | |
114 | bMouseUp = false; | |
115 | ||
116 | //The Score button: | |
117 | if ((globalData.mousex>globalData.xsize-buttonOffset) && (globalData.mousex<globalData.xsize-buttonOffset+bExit.GetWidth()) | |
118 | && (globalData.mousey>globalData.ysize-buttonOffset) && (globalData.mousey<globalData.ysize-buttonOffset+bExit.GetHeight())) { | |
119 | isActive = false; | |
120 | } | |
121 | ||
122 | } | |
123 | } |
0 | /* | |
1 | =========================================================================== | |
2 | blockattack - Block Attack - Rise of the Blocks | |
3 | Copyright (C) 2005-2020 Poul Sander | |
4 | ||
5 | This program is free software: you can redistribute it and/or modify | |
6 | it under the terms of the GNU General Public License as published by | |
7 | the Free Software Foundation, either version 2 of the License, or | |
8 | (at your option) any later version. | |
9 | ||
10 | This program is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this program. If not, see http://www.gnu.org/licenses/ | |
17 | ||
18 | Source information and contacts persons can be found at | |
19 | https://blockattack.net | |
20 | =========================================================================== | |
21 | */ | |
22 | ||
23 | #ifndef MODCONFIG_HPP | |
24 | #define MODCONFIG_HPP | |
25 | ||
26 | #include "sago/GameStateInterface.hpp" | |
27 | #include "sago/SagoTextField.hpp" | |
28 | #include "sago/SagoTextBox.hpp" | |
29 | #include "global.hpp" | |
30 | #include "common.h" | |
31 | ||
32 | struct Mod { | |
33 | std::string name; | |
34 | std::string filename; | |
35 | bool enabled = false; | |
36 | int order = 0; | |
37 | }; | |
38 | ||
39 | /** | |
40 | * This will one day be the menu to configure mods. | |
41 | * This will need to be able to scan the filesystem for mods | |
42 | */ | |
43 | class ModConfigMenuState : public sago::GameStateInterface { | |
44 | public: | |
45 | ModConfigMenuState(); | |
46 | ModConfigMenuState(const ModConfigMenuState& orig) = delete; | |
47 | virtual ~ModConfigMenuState(); | |
48 | ||
49 | bool IsActive() override; | |
50 | void Draw(SDL_Renderer* target) override; | |
51 | void ProcessInput(const SDL_Event& event, bool &processed) override; | |
52 | void Update() override; | |
53 | ||
54 | private: | |
55 | bool isActive = true; | |
56 | bool bMouseUp = true; | |
57 | std::vector<Mod> mods_available; | |
58 | }; | |
59 | ||
60 | #endif /* MODCONFIG_HPP */ |
0 | /* | |
1 | =========================================================================== | |
2 | blockattack - Block Attack - Rise of the Blocks | |
3 | Copyright (C) 2005-2020 Poul Sander | |
4 | ||
5 | This program is free software: you can redistribute it and/or modify | |
6 | it under the terms of the GNU General Public License as published by | |
7 | the Free Software Foundation, either version 2 of the License, or | |
8 | (at your option) any later version. | |
9 | ||
10 | This program is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this program. If not, see http://www.gnu.org/licenses/ | |
17 | ||
18 | Source information and contacts persons can be found at | |
19 | http://blockattack.net | |
20 | =========================================================================== | |
21 | */ | |
22 | ||
23 | #include "ModInfo.hpp" | |
24 | #include "sago/SagoMisc.hpp" | |
25 | #include "rapidjson/document.h" | |
26 | #include <iostream> | |
27 | #include <sstream> | |
28 | #include <boost/algorithm/string.hpp> | |
29 | ||
30 | void ModInfo::InitModList(const std::vector<std::string>& modlist) { | |
31 | this->mod_list = modlist; | |
32 | sprite_filename_list.clear(); | |
33 | for (const std::string& s : mod_list) { | |
34 | std::string filename_info = std::string("modinfo/") + s + ".json"; | |
35 | if (sago::FileExists(filename_info.c_str())) { | |
36 | std::string content = sago::GetFileContent(filename_info.c_str()); | |
37 | rapidjson::Document document; | |
38 | document.Parse(content.c_str()); | |
39 | if ( !document.IsObject() ) { | |
40 | std::cerr << "Failed to parse: " << filename_info << "\n"; | |
41 | continue; | |
42 | } | |
43 | const auto& t = document.GetObject().FindMember("sprites"); | |
44 | if (t != document.MemberEnd() && t->value.IsString()) { | |
45 | std::string sprites = t->value.GetString(); | |
46 | std::vector<std::string> sprites_vector; | |
47 | boost::split(sprites_vector, sprites, boost::is_any_of(",")); | |
48 | sprite_filename_list.insert(sprite_filename_list.end(), sprites_vector.begin(), sprites_vector.end()); | |
49 | } | |
50 | } | |
51 | } | |
52 | } | |
53 | ||
54 | void ModInfo::ParseModFile(const std::string& content) { | |
55 | std::istringstream ss(content); | |
56 | std::string line; | |
57 | while (std::getline(ss, line)) { | |
58 | std::vector<std::string> line_vector; | |
59 | boost::split(line_vector, line, boost::is_any_of(",")); | |
60 | if (line_vector.size() < 2) { | |
61 | std::cerr << "skipping " << line << "\n"; | |
62 | continue; | |
63 | } | |
64 | if (line_vector[1] == "1") { | |
65 | this->mod_list.push_back(line_vector[0]); | |
66 | } | |
67 | } | |
68 | InitModList(this->mod_list); | |
69 | } | |
70 | ||
71 | const std::vector<std::string>& ModInfo::getModList() { | |
72 | return this->mod_list; | |
73 | } | |
74 | ||
75 | const std::vector<std::string>& ModInfo::getModSpriteFiles() { | |
76 | return this->sprite_filename_list; | |
77 | } |
0 | /* | |
1 | =========================================================================== | |
2 | blockattack - Block Attack - Rise of the Blocks | |
3 | Copyright (C) 2005-2020 Poul Sander | |
4 | ||
5 | This program is free software: you can redistribute it and/or modify | |
6 | it under the terms of the GNU General Public License as published by | |
7 | the Free Software Foundation, either version 2 of the License, or | |
8 | (at your option) any later version. | |
9 | ||
10 | This program is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this program. If not, see http://www.gnu.org/licenses/ | |
17 | ||
18 | Source information and contacts persons can be found at | |
19 | http://blockattack.net | |
20 | =========================================================================== | |
21 | */ | |
22 | ||
23 | ||
24 | #ifndef MODINFO_HPP | |
25 | #define MODINFO_HPP | |
26 | ||
27 | #include <string> | |
28 | #include <vector> | |
29 | ||
30 | class ModInfo { | |
31 | public: | |
32 | ModInfo() = default; | |
33 | void InitModList(const std::vector<std::string>& modlist); | |
34 | void ParseModFile(const std::string& content); | |
35 | const std::vector<std::string>& getModList(); | |
36 | const std::vector<std::string>& getModSpriteFiles(); | |
37 | private: | |
38 | std::vector<std::string> mod_list; | |
39 | std::vector<std::string> sprite_filename_list; | |
40 | }; | |
41 | ||
42 | #endif⏎ |
30 | 30 | #include "TextManager.hpp" |
31 | 31 | #include "ExplosionManager.hpp" |
32 | 32 | #include "sago/SagoTextField.hpp" |
33 | #include "ModInfo.hpp" | |
33 | 34 | |
34 | 35 | void MainMenu(); |
35 | 36 | void SafeModeMenu(); |
74 | 75 | bool alwaysSixteenNine = false; |
75 | 76 | int verboseLevel = 0; |
76 | 77 | std::unique_ptr<sago::SagoSpriteHolder> spriteHolder; |
78 | std::vector<std::string> modList; | |
79 | ModInfo modinfo; | |
77 | 80 | |
78 | 81 | TextManager theTextManager; |
79 | 82 |
63 | 63 | #define PACKAGE "blockattack_roftb" |
64 | 64 | #endif |
65 | 65 | |
66 | #define MODLIST_TXT "mod_list.txt" | |
67 | ||
66 | 68 | #include "highscore.h" //Stores highscores |
67 | 69 | #include "ReadKeyboard.h" //Reads text from keyboard |
68 | 70 | #include "stats.h" //Saves general stats |
70 | 72 | |
71 | 73 | #include "common.h" |
72 | 74 | #include "gamecontroller.h" |
75 | #include <boost/algorithm/string.hpp> | |
73 | 76 | #include <boost/program_options.hpp> |
74 | 77 | #include <fstream> |
75 | 78 | #include "levelselect.hpp" |
87 | 90 | paths.push_back((std::string)SHAREDIR+"/blockattack.data"); |
88 | 91 | paths.push_back((std::string)PHYSFS_getBaseDir()+"/blockattack.data"); |
89 | 92 | paths.push_back((std::string)PHYSFS_getBaseDir()+"/data"); |
93 | } | |
94 | ||
95 | static void FsSearchPathModAppend(std::vector<std::string>& paths, const std::vector<std::string>& modlist) { | |
96 | for (const std::string& mod : modlist) { | |
97 | std::string filename = std::string(SHAREDIR)+"/mods/"+mod+".data"; | |
98 | paths.push_back(filename); | |
99 | filename = std::string(PHYSFS_getBaseDir())+"/mods/"+mod+".data"; | |
100 | paths.push_back(filename); | |
101 | } | |
90 | 102 | } |
91 | 103 | |
92 | 104 | static void PhysFsSetSearchPath(const std::vector<std::string>& paths, const std::string& savepath) { |
209 | 221 | globalData.typingChunk = holder.GetDataHolder().getSoundHandler("typing"); |
210 | 222 | counterChunk = holder.GetDataHolder().getSoundHandler("counter"); |
211 | 223 | counterFinalChunk = holder.GetDataHolder().getSoundHandler("counter_final"); |
212 | const int soundVolume = 84; //0-128 | |
224 | Config::getInstance()->setDefault("volume_sound", "24"); //0-128 | |
225 | int soundVolume = Config::getInstance()->getInt("volume_sound"); | |
213 | 226 | Mix_VolumeChunk(boing.get(), soundVolume); |
214 | 227 | Mix_VolumeChunk(applause.get(), soundVolume); |
215 | 228 | Mix_VolumeChunk(photoClick.get(), soundVolume); |
263 | 276 | SDL_RenderSetLogicalSize(globalData.screen, globalData.xsize, globalData.ysize); |
264 | 277 | dataHolder.invalidateAll(globalData.screen); |
265 | 278 | globalData.spriteHolder.reset(new sago::SagoSpriteHolder( dataHolder ) ); |
279 | globalData.spriteHolder->ReadSprites(globalData.modinfo.getModSpriteFiles()); | |
266 | 280 | InitImages(*(globalData.spriteHolder.get()) ); |
267 | 281 | SDL_ShowCursor(SDL_DISABLE); |
268 | 282 | } |
333 | 347 | std::cout << "Saving screenshot" << "\n"; |
334 | 348 | } |
335 | 349 | int rightNow = (int)time(nullptr); |
336 | SDL_Surface* infoSurface = SDL_GetWindowSurface(sdlWindow); | |
337 | if (!infoSurface) { | |
338 | std::cerr << "Could not get infoSurface. No screenshot written. Be aware that the screenshot feature only works with software render\n"; | |
339 | return; | |
340 | } | |
341 | std::vector<char> pixels(infoSurface->w * infoSurface->h * infoSurface->format->BytesPerPixel); | |
342 | int errorCode = SDL_RenderReadPixels(globalData.screen, &infoSurface->clip_rect, infoSurface->format->format, static_cast<void*>(pixels.data()), infoSurface->w * infoSurface->format->BytesPerPixel); | |
343 | if (errorCode) { | |
344 | SDL_FreeSurface(infoSurface); | |
345 | std::cerr << "Could not do SDL_RenderReadPixels. Error code: " << errorCode << ". No screenshot written\n"; | |
346 | return; | |
347 | } | |
348 | SDL_Surface* sreenshotSurface = SDL_CreateRGBSurfaceFrom(static_cast<void*>(pixels.data()), infoSurface->w, infoSurface->h, infoSurface->format->BitsPerPixel, infoSurface->w * infoSurface->format->BytesPerPixel, infoSurface->format->Rmask, infoSurface->format->Gmask, infoSurface->format->Bmask, infoSurface->format->Amask); | |
349 | SDL_FreeSurface(infoSurface); | |
350 | if (!sreenshotSurface) { | |
351 | std::cerr << "Could not get sreenshotSurface. No screenshot written\n"; | |
352 | return; | |
353 | } | |
350 | int w, h; | |
351 | SDL_GetRendererOutputSize(globalData.screen, &w, &h); | |
352 | SDL_Surface *sreenshotSurface = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000); | |
353 | SDL_RenderReadPixels(globalData.screen, NULL, SDL_PIXELFORMAT_ARGB8888, sreenshotSurface->pixels, sreenshotSurface->pitch); | |
354 | 354 | OsCreateFolder(pathToScreenShots()); |
355 | 355 | std::string buf = pathToScreenShots() + "/screenshot"+std::to_string(rightNow)+".bmp"; |
356 | 356 | SDL_SaveBMP(sreenshotSurface, buf.c_str()); |
865 | 865 | "Default: \"%s\"", LOCALEDIR).c_str()) |
866 | 866 | ("homepath", boost::program_options::value<std::string>(), SPrintStringF("Set the home folder where settings are saved. The directory will be created if it does not exist." |
867 | 867 | " Default: \"%s\"", getPathToSaveFiles().c_str()).c_str()) |
868 | ("mod,m", boost::program_options::value<std::vector<std::string> >(), "Loads a mod. Later mods have preference") | |
868 | 869 | |
869 | 870 | ; |
870 | 871 | boost::program_options::variables_map vm; |
956 | 957 | if (vm.count("play-replay")) { |
957 | 958 | globalData.replayArgument = vm["play-replay"].as<std::string>(); |
958 | 959 | } |
959 | ||
960 | } | |
960 | if (vm.count("mod")) { | |
961 | globalData.modList = vm["mod"].as<std::vector<std::string> >(); | |
962 | } | |
963 | ||
964 | } | |
965 | ||
966 | //Physfs 2.0.z does not have PHYSFS_unmount | |
967 | #if (PHYSFS_VER_MAJOR <= 2) && (PHYSFS_VER_MINOR < 1) | |
968 | #define PHYSFS_unmount PHYSFS_removeFromSearchPath | |
969 | #endif | |
961 | 970 | |
962 | 971 | //Warning: the arguments to main must be "int argc, char* argv[]" NO CONST! or SDL_main will fail to find it |
963 | 972 | int main(int argc, char* argv[]) { |
978 | 987 | ParseArguments(argc, argv, config); |
979 | 988 | OsCreateSaveFolder(); |
980 | 989 | PhysFsSetSearchPath(config.search_paths, config.savepath); |
990 | /*if (globalData.modList.empty() && sago::FileExists(MODLIST_TXT)) { | |
991 | std::string modString = sago::GetFileContent(MODLIST_TXT); | |
992 | boost::split(globalData.modList, modString, boost::is_any_of(",")); | |
993 | }*/ | |
994 | globalData.modinfo.InitModList(globalData.modList); | |
995 | if (sago::FileExists(MODLIST_TXT)) { | |
996 | globalData.modinfo.ParseModFile(sago::GetFileContent(MODLIST_TXT)); | |
997 | globalData.modList = globalData.modinfo.getModList(); | |
998 | } | |
999 | std::cout << "Mod list: "; | |
1000 | for (const std::string& s : globalData.modList) { | |
1001 | std::cout << s << ","; | |
1002 | } | |
1003 | std::cout << "\n"; | |
1004 | if (globalData.modList.size()>0) { | |
1005 | PHYSFS_unmount(config.savepath.c_str()); | |
1006 | FsSearchPathModAppend(config.search_paths, globalData.modList); | |
1007 | PhysFsSetSearchPath(config.search_paths, config.savepath); | |
1008 | } | |
981 | 1009 | //Os create folders must be after the parameters because they can change the home folder |
982 | 1010 | PhysFsCreateFolders(); |
983 | 1011 | bool gameShutdownProperly = true; |
1014 | 1042 | globalData.NoSound = true; //Tries to stop all sound from playing/loading |
1015 | 1043 | } |
1016 | 1044 | } |
1045 | Config::getInstance()->setDefault("volume_music", "20"); //0-128 | |
1017 | 1046 | |
1018 | 1047 | |
1019 | 1048 | if (globalData.verboseLevel) { |
1244 | 1273 | std::cout << SPrintStringF("Block Attack - Rise of the Blocks ran for: %i hours %i mins and %i secs", ct.hours, ct.minutes, ct.seconds) << "\n"; |
1245 | 1274 | } |
1246 | 1275 | |
1276 | /*std::string modListString; | |
1277 | if (globalData.modList.size()>0) { | |
1278 | modListString = globalData.modList.at(0); | |
1279 | for (size_t i = 1; i < globalData.modList.size(); ++i) { | |
1280 | modListString += std::string(",")+globalData.modList[i]; | |
1281 | } | |
1282 | }*/ | |
1247 | 1283 | ct = TimeHandler::addTime("totalTime",ct); |
1248 | 1284 | if (globalData.verboseLevel) { |
1249 | 1285 | std::cout << "Total run time is now: " << ct.days << " days " << ct.hours << " hours " << ct.minutes << " mins and " << ct.seconds << " secs" << "\n"; |
1250 | } | |
1251 | ||
1286 | //std::cout << "Mods loaded: " << modListString << "\n"; | |
1287 | } | |
1288 | //sago::WriteFileContent(MODLIST_TXT, modListString); | |
1252 | 1289 | Stats::getInstance()->save(); |
1253 | 1290 | Config::getInstance()->save(); |
1254 | 1291 | } |
1699 | 1736 | if ((!globalData.NoSound)&&(!Mix_PlayingMusic())&&(globalData.MusicEnabled)&&(!bNearDeath)) { |
1700 | 1737 | // then starts playing it. |
1701 | 1738 | Mix_PlayMusic(bgMusic.get(), -1); //music loop |
1702 | Mix_VolumeMusic((MIX_MAX_VOLUME*3)/10); | |
1739 | int musicVolume = Config::getInstance()->getInt("volume_music"); | |
1740 | Mix_VolumeMusic(musicVolume); | |
1703 | 1741 | } |
1704 | 1742 | |
1705 | 1743 | if (bNearDeath!=bNearDeathPrev) { |
1744 | int musicVolume = Config::getInstance()->getInt("volume_music"); | |
1706 | 1745 | if (bNearDeath) { |
1707 | 1746 | if (!globalData.NoSound &&(globalData.MusicEnabled)) { |
1708 | 1747 | Mix_PlayMusic(highbeatMusic.get(), 1); |
1709 | Mix_VolumeMusic((MIX_MAX_VOLUME*5)/10); | |
1748 | Mix_VolumeMusic(musicVolume); | |
1710 | 1749 | } |
1711 | 1750 | } |
1712 | 1751 | else { |
1713 | 1752 | if (!globalData.NoSound &&(globalData.MusicEnabled)) { |
1714 | 1753 | Mix_PlayMusic(bgMusic.get(), -1); |
1715 | Mix_VolumeMusic((MIX_MAX_VOLUME*3)/10); | |
1754 | Mix_VolumeMusic(musicVolume); | |
1716 | 1755 | } |
1717 | 1756 | } |
1718 | 1757 | } |
28 | 28 | #include "HelpGamepadState.hpp" |
29 | 29 | #include "HelpAboutState.hpp" |
30 | 30 | #include "ShowFileState.hpp" |
31 | #include "ModConfigMenuState.hpp" | |
31 | 32 | |
32 | 33 | |
33 | 34 | #if 0 |
101 | 102 | std::string m_keyname; |
102 | 103 | public: |
103 | 104 | Button_changekey(SDL_Keycode* key, const char* keyname); |
104 | void doAction(); | |
105 | virtual void doAction() override; | |
105 | 106 | }; |
106 | 107 | |
107 | 108 | |
126 | 127 | } |
127 | 128 | } |
128 | 129 | setLabel(m_keyname+" : "+getKeyName(*m_key2change)); |
130 | } | |
131 | ||
132 | class Button_confirmVolume : public Button { | |
133 | private: | |
134 | std::string cvar=""; | |
135 | mutable std::string volumeLabel; /*used for cache*/ | |
136 | public: | |
137 | explicit Button_confirmVolume(const char* cvar); | |
138 | virtual void doAction() override { /*Do nothing. Equal to choose "back". */ }; | |
139 | virtual const std::string& getLabel() const override; | |
140 | }; | |
141 | ||
142 | Button_confirmVolume::Button_confirmVolume(const char* cvar) : cvar{cvar} { | |
143 | this->setPopOnRun(true); | |
144 | } | |
145 | ||
146 | const std::string& Button_confirmVolume::getLabel() const { | |
147 | int volumePct = Config::getInstance()->getInt(cvar)*100.0/MIX_MAX_VOLUME; | |
148 | this->volumeLabel = SPrintStringF(_("Volume: %d%%"), volumePct); // std::string(_("Volume: "))+ std::to_string(volumePct)+"%" ; | |
149 | return volumeLabel; | |
150 | } | |
151 | ||
152 | class Button_increaseVolume : public Button { | |
153 | private: | |
154 | std::string cvar=""; | |
155 | int incrementValue = 1; | |
156 | int lowerLimit = 0; | |
157 | int upperLimit = MIX_MAX_VOLUME; | |
158 | public: | |
159 | Button_increaseVolume(const char* cvar, int incrementValue); | |
160 | virtual void doAction() override; | |
161 | }; | |
162 | ||
163 | Button_increaseVolume::Button_increaseVolume(const char* cvar, int incrementValue) | |
164 | : cvar{cvar},incrementValue{incrementValue} { | |
165 | char prefix = '+'; | |
166 | double value = incrementValue; | |
167 | if (incrementValue<0) { | |
168 | prefix = '-'; | |
169 | value = -incrementValue; | |
170 | } | |
171 | value = value*100.0/MIX_MAX_VOLUME; | |
172 | setLabel(SPrintStringF("%c%.2f", prefix, value)); | |
173 | } | |
174 | ||
175 | void Button_increaseVolume::doAction() { | |
176 | int newValue = Config::getInstance()->getInt(cvar)+incrementValue; | |
177 | if (newValue<lowerLimit) { | |
178 | newValue = lowerLimit; | |
179 | } | |
180 | if (newValue>upperLimit) { | |
181 | newValue = upperLimit; | |
182 | } | |
183 | Config::getInstance()->setInt(cvar, newValue); | |
184 | } | |
185 | ||
186 | class Button_testSound : public Button { | |
187 | public: | |
188 | Button_testSound(); | |
189 | virtual void doAction() override; | |
190 | }; | |
191 | ||
192 | Button_testSound::Button_testSound() { | |
193 | setLabel(_("Test sound")); | |
194 | } | |
195 | ||
196 | void Button_testSound::doAction() { | |
197 | sago::SoundHandler testSound = globalData.spriteHolder->GetDataHolder().getSoundHandler("pop"); | |
198 | Mix_VolumeChunk(testSound.get(), Config::getInstance()->getInt("volume_sound")); | |
199 | Mix_PlayChannel(1, testSound.get(), 0); | |
200 | } | |
201 | ||
202 | class Button_testMusic : public Button { | |
203 | public: | |
204 | Button_testMusic(); | |
205 | virtual void doAction() override; | |
206 | }; | |
207 | ||
208 | Button_testMusic::Button_testMusic() { | |
209 | setLabel(_("Test music")); | |
210 | } | |
211 | ||
212 | void Button_testMusic::doAction() { | |
213 | Mix_VolumeMusic(Config::getInstance()->getInt("volume_music")); | |
214 | sago::MusicHandler bgMusic = globalData.spriteHolder->GetDataHolder().getMusicHandler("bgmusic"); | |
215 | Mix_PlayMusic(bgMusic.get(), -1); | |
129 | 216 | } |
130 | 217 | |
131 | 218 | void InitMenues() { |
210 | 297 | : _("Always use software render: Off")); |
211 | 298 | } |
212 | 299 | |
300 | static void runSetMusicVolume(const char* cvar, const char* header) { | |
301 | Menu volumeMenu(globalData.screen, header, true); | |
302 | Button_confirmVolume bConfirm(cvar); | |
303 | Button_increaseVolume plus5(cvar, 5); | |
304 | Button_increaseVolume minus5(cvar, -5); | |
305 | Button_increaseVolume plus1(cvar, 1); | |
306 | Button_increaseVolume minus1(cvar, -1); | |
307 | volumeMenu.addButton(&bConfirm); | |
308 | volumeMenu.addButton(&plus5); | |
309 | volumeMenu.addButton(&minus5); | |
310 | volumeMenu.addButton(&plus1); | |
311 | volumeMenu.addButton(&minus1); | |
312 | Button_testSound bTestSound; | |
313 | volumeMenu.addButton(&bTestSound); | |
314 | Button_testMusic bTestMusic; | |
315 | volumeMenu.addButton(&bTestMusic); | |
316 | RunGameState(volumeMenu); | |
317 | } | |
318 | ||
213 | 319 | static void SetMusicLabel (Button* b) { |
214 | b->setLabel(globalData.MusicEnabled? _("Music: On") : _("Music: Off") ); | |
320 | if (globalData.MusicEnabled) { | |
321 | double volume = Config::getInstance()->getInt("volume_music"); | |
322 | int volumePct = volume*100.0/MIX_MAX_VOLUME; | |
323 | b->setLabel(std::string(_("Music: "))+ std::to_string(volumePct)+"%" ); | |
324 | } | |
325 | else { | |
326 | b->setLabel(_("Music: Off") ); | |
327 | } | |
215 | 328 | } |
216 | 329 | |
217 | 330 | static void SetSoundLabel (Button* b) { |
218 | b->setLabel(globalData.SoundEnabled? _("Sound: On") : _("Sound: Off") ); | |
331 | if (globalData.SoundEnabled) { | |
332 | double volume = Config::getInstance()->getInt("volume_sound"); | |
333 | int volumePct = volume*100.0/MIX_MAX_VOLUME; | |
334 | b->setLabel(std::string(_("Sound: "))+ std::to_string(volumePct)+"%" ); | |
335 | } | |
336 | else { | |
337 | b->setLabel(_("Sound: Off") ); | |
338 | } | |
219 | 339 | } |
220 | 340 | |
221 | 341 | static void SetFullscreenLabel (Button* b) { |
231 | 351 | |
232 | 352 | class MusicButton : public Button { |
233 | 353 | virtual void doAction() override { |
234 | globalData.MusicEnabled = !globalData.MusicEnabled; | |
354 | runSetMusicVolume("volume_music", _("Music volume")); | |
355 | globalData.MusicEnabled = (Config::getInstance()->getInt("volume_music") != 0); | |
235 | 356 | SetMusicLabel(this); |
236 | 357 | } |
237 | 358 | }; |
238 | 359 | |
239 | 360 | class SoundButton : public Button { |
240 | 361 | virtual void doAction() override { |
241 | globalData.SoundEnabled = !globalData.SoundEnabled; | |
362 | runSetMusicVolume("volume_sound", _("Sound volume")); | |
363 | globalData.MusicEnabled = (Config::getInstance()->getInt("volume_sound") != 0); | |
242 | 364 | SetSoundLabel(this); |
243 | 365 | } |
244 | 366 | }; |
292 | 414 | ChangeKeysMenu(2); |
293 | 415 | } |
294 | 416 | |
295 | static void ConfigureMenu() { | |
296 | Menu cm(globalData.screen,_("Configuration"),true); | |
297 | Button bPlayer1Name,bPlayer2Name; | |
417 | static void PlayerConfigMenu() { | |
418 | Menu pcm(globalData.screen,_("Player configuration"),true); | |
419 | Button bPlayer1Name, bPlayer2Name; | |
298 | 420 | Button bPlayer1Keys, bPlayer2Keys; |
299 | AlwaysSoftwareRenderButton bSoftware; | |
300 | MusicButton bMusic; | |
301 | SoundButton bSound; | |
302 | FullscreenButton buttonFullscreen; | |
303 | SetAlwaysSoftwareLabel(&bSoftware); | |
304 | SetMusicLabel(&bMusic); | |
305 | SetSoundLabel(&bSound); | |
306 | SetFullscreenLabel(&buttonFullscreen); | |
307 | 421 | bPlayer1Name.setAction(buttonActionPlayer1Name); |
308 | 422 | bPlayer1Name.setLabel(_("Change player 1's name") ); |
309 | 423 | bPlayer2Name.setAction(buttonActionPlayer2Name); |
312 | 426 | bPlayer1Keys.setLabel(_("Change player 1's keys") ); |
313 | 427 | bPlayer2Keys.setAction(ChangeKeysMenu2); |
314 | 428 | bPlayer2Keys.setLabel(_("Change player 2's keys") ); |
429 | pcm.addButton(&bPlayer1Name); | |
430 | pcm.addButton(&bPlayer2Name); | |
431 | pcm.addButton(&bPlayer1Keys); | |
432 | pcm.addButton(&bPlayer2Keys); | |
433 | RunGameState(pcm); | |
434 | } | |
435 | ||
436 | static void runModConfigMenu() { | |
437 | ModConfigMenuState modmenu; | |
438 | RunGameState(modmenu); | |
439 | } | |
440 | ||
441 | static void ConfigureMenu() { | |
442 | Menu cm(globalData.screen,_("Configuration"),true); | |
443 | AlwaysSoftwareRenderButton bSoftware; | |
444 | MusicButton bMusic; | |
445 | SoundButton bSound; | |
446 | FullscreenButton buttonFullscreen; | |
447 | Button bPlayerConfig; | |
448 | Button bModConfig; | |
449 | bPlayerConfig.setLabel(_("Player configuration") ); | |
450 | bPlayerConfig.setAction(PlayerConfigMenu); | |
451 | bModConfig.setLabel(_("Configure mods")); | |
452 | bModConfig.setAction(&runModConfigMenu); | |
453 | SetAlwaysSoftwareLabel(&bSoftware); | |
454 | SetMusicLabel(&bMusic); | |
455 | SetSoundLabel(&bSound); | |
456 | SetFullscreenLabel(&buttonFullscreen); | |
315 | 457 | cm.addButton(&bMusic); |
316 | 458 | cm.addButton(&bSound); |
317 | 459 | cm.addButton(&bSoftware); |
318 | 460 | cm.addButton(&buttonFullscreen); |
319 | cm.addButton(&bPlayer1Name); | |
320 | cm.addButton(&bPlayer2Name); | |
321 | cm.addButton(&bPlayer1Keys); | |
322 | cm.addButton(&bPlayer2Keys); | |
461 | cm.addButton(&bPlayerConfig); | |
462 | cm.addButton(&bModConfig); | |
323 | 463 | RunGameState(cm); |
324 | 464 | } |
325 | 465 |
31 | 31 | #include <pwd.h> |
32 | 32 | #include <unistd.h> |
33 | 33 | #endif |
34 | ||
35 | #include <dirent.h> | |
34 | 36 | |
35 | 37 | static sago::PlatformFolders pf; |
36 | 38 | |
131 | 133 | std::string path = getPathToSaveFiles(); |
132 | 134 | OsCreateFolder(path); |
133 | 135 | } |
136 | ||
137 | std::vector<std::string> OsGetDirFileList(const std::string& path) { | |
138 | //At the moment dirent.h is used for all OS. Should have a Unicode version on Windows. | |
139 | std::vector<std::string> ret; | |
140 | DIR* dir = opendir(path.c_str()); | |
141 | if (dir) { | |
142 | struct dirent* ent; | |
143 | while ((ent = readdir (dir)) ) { | |
144 | if (ent->d_name[0] == '.') { | |
145 | continue; | |
146 | } | |
147 | ret.push_back(ent->d_name); | |
148 | } | |
149 | closedir (dir); | |
150 | } | |
151 | else { | |
152 | std::cerr << "Failed to list: " << path+"/" << "\n"; | |
153 | } | |
154 | return ret; | |
155 | } |
28 | 28 | #include "shlobj.h" |
29 | 29 | #endif |
30 | 30 | #include <string> |
31 | #include <vector> | |
31 | 32 | |
32 | 33 | std::string getPathToSaveFiles(); |
33 | #if defined(_WIN32) | |
34 | std::string getMyDocumentsPath(); | |
35 | #endif | |
36 | 34 | |
37 | 35 | std::string defaultPlayerName(); |
38 | 36 | |
42 | 40 | |
43 | 41 | bool OsPathIsRelative(const std::string& path); |
44 | 42 | |
43 | /** | |
44 | * Create a folder | |
45 | * The folder path is created recursively | |
46 | * Fails silently if failing to create the path | |
47 | * @param path The folder to create | |
48 | */ | |
45 | 49 | void OsCreateFolder(const std::string& path); |
46 | 50 | |
51 | /** | |
52 | * Lists the content of a directory. | |
53 | * Ignores files starting with a dot (".") | |
54 | * | |
55 | * @param path The path to list | |
56 | * @return std::vector<std::string> Files names in directory | |
57 | */ | |
58 | std::vector<std::string> OsGetDirFileList(const std::string& path); | |
59 | ||
47 | 60 | #endif /* OS_HPP */ |
35 | 35 | * @return true if active |
36 | 36 | */ |
37 | 37 | virtual bool IsActive() = 0; |
38 | ||
38 | ||
39 | 39 | /** |
40 | 40 | * Tells the state to draw itself to target |
41 | 41 | * @param target The RenderWindow to draw to |
42 | 42 | */ |
43 | 43 | virtual void Draw(SDL_Renderer* target) = 0; |
44 | ||
45 | virtual void ProcessInput(const SDL_Event& event, bool &processed) = 0; | |
46 | ||
44 | ||
45 | virtual void ProcessInput(const SDL_Event& event, bool& processed) = 0; | |
46 | ||
47 | 47 | virtual void Update() {} |
48 | ||
48 | ||
49 | 49 | virtual ~GameStateInterface() {} |
50 | 50 | }; |
51 | 51 |
244 | 244 | return data->version; |
245 | 245 | } |
246 | 246 | |
247 | TextureHandler::TextureHandler(const SagoDataHolder* holder, const std::string &textureName) { | |
247 | TextureHandler::TextureHandler(const SagoDataHolder* holder, const std::string& textureName) { | |
248 | 248 | this->holder = holder; |
249 | 249 | this->version = 0; |
250 | 250 | this->textureName = textureName; |
291 | 291 | } |
292 | 292 | |
293 | 293 | |
294 | TextureHandler SagoDataHolder::getTextureHandler(const std::string &textureName) const { | |
294 | TextureHandler SagoDataHolder::getTextureHandler(const std::string& textureName) const { | |
295 | 295 | return TextureHandler(this, textureName); |
296 | 296 | } |
297 | 297 | |
298 | MusicHandler SagoDataHolder::getMusicHandler(const std::string &musicName) const { | |
298 | MusicHandler SagoDataHolder::getMusicHandler(const std::string& musicName) const { | |
299 | 299 | return MusicHandler(this, musicName); |
300 | 300 | } |
301 | 301 | |
302 | SoundHandler SagoDataHolder::getSoundHandler(const std::string &soundName) const { | |
302 | SoundHandler SagoDataHolder::getSoundHandler(const std::string& soundName) const { | |
303 | 303 | return SoundHandler(this, soundName); |
304 | 304 | } |
305 | 305 |
29 | 29 | #include <string> |
30 | 30 | |
31 | 31 | #ifndef TEXTUREHOLDER_HPP |
32 | #define TEXTUREHOLDER_HPP | |
32 | #define TEXTUREHOLDER_HPP | |
33 | 33 | |
34 | 34 | namespace sago { |
35 | 35 | |
38 | 38 | class TextureHandler { |
39 | 39 | public: |
40 | 40 | TextureHandler() {}; |
41 | TextureHandler(const SagoDataHolder* holder, const std::string &textureName); | |
41 | TextureHandler(const SagoDataHolder* holder, const std::string& textureName); | |
42 | 42 | SDL_Texture* get(); |
43 | 43 | private: |
44 | 44 | std::string textureName; |
51 | 51 | class MusicHandler final { |
52 | 52 | public: |
53 | 53 | MusicHandler() {}; |
54 | MusicHandler(const SagoDataHolder* holder, const std::string &musicName); | |
54 | MusicHandler(const SagoDataHolder* holder, const std::string& musicName); | |
55 | 55 | Mix_Music* get(); |
56 | 56 | private: |
57 | 57 | std::string musicName; |
64 | 64 | class SoundHandler final { |
65 | 65 | public: |
66 | 66 | SoundHandler() {}; |
67 | SoundHandler(const SagoDataHolder* holder, const std::string &soundName); | |
67 | SoundHandler(const SagoDataHolder* holder, const std::string& soundName); | |
68 | 68 | Mix_Chunk* get(); |
69 | 69 | private: |
70 | 70 | std::string soundName; |
87 | 87 | * @param textureName Name of the texture |
88 | 88 | * @return Pointer to the loaded texture |
89 | 89 | */ |
90 | SDL_Texture* getTexturePtr(const std::string &textureName) const; | |
90 | SDL_Texture* getTexturePtr(const std::string& textureName) const; | |
91 | 91 | |
92 | TextureHandler getTextureHandler(const std::string &textureName) const; | |
93 | TTF_Font* getFontPtr(const std::string &fontName, int ptsize) const; | |
94 | Mix_Music* getMusicPtr(const std::string &musicName) const; | |
95 | MusicHandler getMusicHandler(const std::string &musicName) const; | |
96 | Mix_Chunk* getSoundPtr(const std::string &soundName) const; | |
97 | SoundHandler getSoundHandler(const std::string &soundName) const; | |
92 | TextureHandler getTextureHandler(const std::string& textureName) const; | |
93 | TTF_Font* getFontPtr(const std::string& fontName, int ptsize) const; | |
94 | Mix_Music* getMusicPtr(const std::string& musicName) const; | |
95 | MusicHandler getMusicHandler(const std::string& musicName) const; | |
96 | Mix_Chunk* getSoundPtr(const std::string& soundName) const; | |
97 | SoundHandler getSoundHandler(const std::string& soundName) const; | |
98 | 98 | void setVerbose(bool value); |
99 | 99 | |
100 | 100 | /** |
116 | 116 | * @return A globally unique number. |
117 | 117 | */ |
118 | 118 | Uint64 getVersion() const; |
119 | ||
119 | ||
120 | 120 | ~SagoDataHolder(); |
121 | 121 | private: |
122 | 122 | SagoDataHolder(const SagoDataHolder& base) = delete; |
123 | 123 | SagoDataHolder& operator=(const SagoDataHolder& base) = delete; |
124 | 124 | struct SagoDataHolderData; |
125 | mutable SagoDataHolderData *data; | |
125 | mutable SagoDataHolderData* data; | |
126 | 126 | }; |
127 | 127 | |
128 | 128 | } //namespace sago |
129 | 129 | |
130 | #endif /* TEXTUREHOLDER_HPP */ | |
130 | #endif /* TEXTUREHOLDER_HPP */ | |
131 | 131 |
22 | 22 | */ |
23 | 23 | |
24 | 24 | #ifndef SAGOMISC_HPP |
25 | #define SAGOMISC_HPP | |
25 | #define SAGOMISC_HPP | |
26 | 26 | |
27 | 27 | #include <vector> |
28 | 28 | #include <string> |
30 | 30 | |
31 | 31 | namespace sago { |
32 | 32 | |
33 | /** | |
34 | * Returns a vector with all filenames in a given directory. | |
35 | * PHYSFS must be setup before hand. The directory is relative to the PHYSFS base | |
36 | * @param dir The directory to list | |
37 | * @return A vector with the filenames in the given directory. If empty the directory was empty or did not exist | |
38 | */ | |
39 | std::vector<std::string> GetFileList(const char* dir); | |
33 | /** | |
34 | * Returns a vector with all filenames in a given directory. | |
35 | * PHYSFS must be setup before hand. The directory is relative to the PHYSFS base | |
36 | * @param dir The directory to list | |
37 | * @return A vector with the filenames in the given directory. If empty the directory was empty or did not exist | |
38 | */ | |
39 | std::vector<std::string> GetFileList(const char* dir); | |
40 | 40 | |
41 | /** | |
42 | * Reads an entire file into memory. | |
43 | * PHYSFS must be setup before hand | |
44 | * @param filename The file to read | |
45 | * @param dest The unique pointer in which the bytes will be written | |
46 | * @param bytes Number of bytes written | |
47 | * @return The content of the file. If empty either the file was empty, did not exist or could not be opened | |
48 | */ | |
49 | void ReadBytesFromFile(const char* filename, std::unique_ptr<char[]>& dest, unsigned int& bytes); | |
41 | /** | |
42 | * Reads an entire file into memory. | |
43 | * PHYSFS must be setup before hand | |
44 | * @param filename The file to read | |
45 | * @param dest The unique pointer in which the bytes will be written | |
46 | * @param bytes Number of bytes written | |
47 | * @return The content of the file. If empty either the file was empty, did not exist or could not be opened | |
48 | */ | |
49 | void ReadBytesFromFile(const char* filename, std::unique_ptr<char[]>& dest, unsigned int& bytes); | |
50 | 50 | |
51 | /** | |
52 | * Reads an entire file into memory. | |
53 | * PHYSFS must be setup before hand | |
54 | * @param filename The file to read | |
55 | * @return The content of the file. If empty either the file was empty, did not exist or could not be opened | |
56 | */ | |
57 | std::string GetFileContent(const char* filename); | |
51 | /** | |
52 | * Reads an entire file into memory. | |
53 | * PHYSFS must be setup before hand | |
54 | * @param filename The file to read | |
55 | * @return The content of the file. If empty either the file was empty, did not exist or could not be opened | |
56 | */ | |
57 | std::string GetFileContent(const char* filename); | |
58 | 58 | |
59 | /** | |
60 | * Reads an entire file into memory. | |
61 | * PHYSFS must be setup before hand | |
62 | * @param filename The file to read | |
63 | * @return The content of the file. If empty either the file was empty, did not exist or could not be opened | |
64 | */ | |
65 | inline std::string GetFileContent(const std::string& filename) { return GetFileContent(filename.c_str()); }; | |
59 | /** | |
60 | * Reads an entire file into memory. | |
61 | * PHYSFS must be setup before hand | |
62 | * @param filename The file to read | |
63 | * @return The content of the file. If empty either the file was empty, did not exist or could not be opened | |
64 | */ | |
65 | inline std::string GetFileContent(const std::string& filename) { | |
66 | return GetFileContent(filename.c_str()); | |
67 | }; | |
66 | 68 | |
67 | bool FileExists(const char* filename); | |
69 | bool FileExists(const char* filename); | |
68 | 70 | |
69 | void WriteFileContent(const char* filename, const std::string& content); | |
71 | void WriteFileContent(const char* filename, const std::string& content); | |
70 | 72 | |
71 | /** | |
72 | * This functions converts a string on a best effort basis | |
73 | * Unlike atol this does NOT cause undefined behavior if out of range | |
74 | * @param c_string A string that may contain a number | |
75 | * @return A number between LONG_MIN and LONG_MAX (both inclusive) | |
76 | */ | |
77 | long int StrToLong(const char* c_string); | |
73 | /** | |
74 | * This functions converts a string on a best effort basis | |
75 | * Unlike atol this does NOT cause undefined behavior if out of range | |
76 | * @param c_string A string that may contain a number | |
77 | * @return A number between LONG_MIN and LONG_MAX (both inclusive) | |
78 | */ | |
79 | long int StrToLong(const char* c_string); | |
78 | 80 | |
79 | 81 | } //namespace sago |
80 | 82 | |
81 | #endif /* SAGOMISC_HPP */ | |
83 | #endif /* SAGOMISC_HPP */ | |
82 | 84 |
25 | 25 | #define SAGOMISCSDL2_HPP |
26 | 26 | |
27 | 27 | namespace sago { |
28 | ||
29 | /** | |
30 | * Writes an error message to the screen and aborts the program | |
31 | * @param errorMsg The message displayed in a pop-up box to the user. | |
32 | */ | |
33 | void SagoFatalError(const char* errorMsg); | |
34 | ||
35 | /** | |
36 | * Writes an error message to the screen and aborts the program | |
37 | * @param fmt A printf-style format string | |
38 | * @param ... Parameters to the format string | |
39 | */ | |
40 | void SagoFatalErrorF(const char* fmt, ...) __attribute__ ((format (printf, 1, 2))); | |
41 | ||
28 | ||
29 | /** | |
30 | * Writes an error message to the screen and aborts the program | |
31 | * @param errorMsg The message displayed in a pop-up box to the user. | |
32 | */ | |
33 | void SagoFatalError(const char* errorMsg); | |
34 | ||
35 | /** | |
36 | * Writes an error message to the screen and aborts the program | |
37 | * @param fmt A printf-style format string | |
38 | * @param ... Parameters to the format string | |
39 | */ | |
40 | void SagoFatalErrorF(const char* fmt, ...) __attribute__ ((format (printf, 1, 2))); | |
41 | ||
42 | 42 | } |
43 | 43 | |
44 | 44 | #endif /* SAGOMISCSDL2_HPP */ |
22 | 22 | */ |
23 | 23 | |
24 | 24 | #ifndef SAGOSPRITE_HPP |
25 | #define SAGOSPRITE_HPP | |
25 | #define SAGOSPRITE_HPP | |
26 | 26 | |
27 | 27 | #include "SagoDataHolder.hpp" |
28 | 28 | |
31 | 31 | class SagoSprite final { |
32 | 32 | public: |
33 | 33 | SagoSprite(); |
34 | SagoSprite(const SagoDataHolder &texHolder, const std::string &texture,const SDL_Rect& initImage,const int animationFrames, const int animationFrameLength); | |
34 | SagoSprite(const SagoDataHolder& texHolder, const std::string& texture,const SDL_Rect& initImage,const int animationFrames, const int animationFrameLength); | |
35 | 35 | |
36 | 36 | /** |
37 | 37 | * Draws the sprite to a given render window |
58 | 58 | * @param frameTime The time in milliseonds since gamestart. Used to determen the place in the animation |
59 | 59 | * @param x Place to draw the sprite |
60 | 60 | * @param y Place to draw the sprite |
61 | * @param part the part of the sprite that should be drawn. | |
61 | * @param part the part of the sprite that should be drawn. | |
62 | 62 | */ |
63 | 63 | void Draw(SDL_Renderer* target, Sint32 frameTime, int x, int y, const SDL_Rect& part) const; |
64 | 64 | |
71 | 71 | * @param bounds A recagular area that we must not draw outside. |
72 | 72 | */ |
73 | 73 | void DrawBounded(SDL_Renderer* target, Sint32 frameTime, int x, int y, const SDL_Rect& bounds) const; |
74 | ||
74 | ||
75 | 75 | /** |
76 | 76 | * Draws the sprite to a given render window |
77 | 77 | * @param target The render window to draw on |
83 | 83 | |
84 | 84 | void DrawScaled(SDL_Renderer* target, Sint32 frameTime, int x, int y, int w, int h) const; |
85 | 85 | void DrawScaledAndRotated(SDL_Renderer* target, Sint32 frameTime, int x, int y, int w, int h, |
86 | const double angleRadian, const SDL_Point* center, const SDL_RendererFlip flip) const; | |
86 | const double angleRadian, const SDL_Point* center, const SDL_RendererFlip flip) const; | |
87 | 87 | |
88 | 88 | /** |
89 | 89 | * Set a different origin. Normally it is the top left cornor. But in some cases you might want to center the origin or tranform it for other reasons |
90 | * @param newOrigin the coordinates that should be the new origin. Call with {0,0} to reset to default | |
90 | * @param newOrigin the coordinates that should be the new origin. Call with {0,0} to reset to default | |
91 | 91 | */ |
92 | 92 | void SetOrigin(const SDL_Rect& newOrigin); |
93 | 93 | SagoSprite(const SagoSprite& base); |
97 | 97 | ~SagoSprite(); |
98 | 98 | private: |
99 | 99 | struct SagoSpriteData; |
100 | SagoSpriteData *data; | |
100 | SagoSpriteData* data; | |
101 | 101 | }; |
102 | 102 | |
103 | 103 | } |
104 | 104 | |
105 | #endif /* SAGOSPRITE_HPP */ | |
105 | #endif /* SAGOSPRITE_HPP */ | |
106 | 106 |
130 | 130 | } |
131 | 131 | } |
132 | 132 | |
133 | void SagoSpriteHolder::ReadSprites(const std::vector<std::string>& extra_sprites) { | |
134 | for (std::string item : extra_sprites) { | |
135 | item+=".sprite"; | |
136 | ReadSpriteFile(item); | |
137 | } | |
138 | } | |
139 | ||
133 | 140 | const sago::SagoSprite& SagoSpriteHolder::GetSprite(const std::string& spritename) const { |
134 | 141 | std::unordered_map<std::string,std::shared_ptr<sago::SagoSprite>>::const_iterator got = data->sprites.find (spritename); |
135 | 142 | if ( got == data->sprites.end() ) { |
22 | 22 | */ |
23 | 23 | |
24 | 24 | #ifndef SAGOSPRITEHOLDER_HPP |
25 | #define SAGOSPRITEHOLDER_HPP | |
25 | #define SAGOSPRITEHOLDER_HPP | |
26 | 26 | |
27 | 27 | #include "SagoDataHolder.hpp" |
28 | 28 | #include "SagoSprite.hpp" |
29 | #include <vector> | |
29 | 30 | |
30 | 31 | namespace sago { |
31 | 32 | |
32 | 33 | class SagoSpriteHolder final { |
33 | 34 | public: |
34 | explicit SagoSpriteHolder(const SagoDataHolder &texHolder); | |
35 | explicit SagoSpriteHolder(const SagoDataHolder& texHolder); | |
35 | 36 | ~SagoSpriteHolder(); |
37 | /** | |
38 | * Reads all the sprites from the "sprites" directory in alphabetical order | |
39 | **/ | |
36 | 40 | void ReadSprites(); |
37 | const sago::SagoSprite& GetSprite(const std::string &spritename) const; | |
41 | /** | |
42 | * Reads an additional sprites. Used to append mod data. | |
43 | **/ | |
44 | void ReadSprites(const std::vector<std::string>& extra_sprites); | |
45 | const sago::SagoSprite& GetSprite(const std::string& spritename) const; | |
38 | 46 | const SagoDataHolder& GetDataHolder() const; |
39 | 47 | private: |
40 | 48 | SagoSpriteHolder(const SagoSpriteHolder& base) = delete; |
41 | 49 | SagoSpriteHolder& operator=(const SagoSpriteHolder& base) = delete; |
42 | void ReadSpriteFile(const std::string &filename); | |
50 | void ReadSpriteFile(const std::string& filename); | |
43 | 51 | struct SagoSpriteHolderData; |
44 | SagoSpriteHolderData *data; | |
52 | SagoSpriteHolderData* data; | |
45 | 53 | }; |
46 | 54 | |
47 | 55 | } |
48 | 56 | |
49 | #endif /* SAGOSPRITEHOLDER_HPP */ | |
57 | #endif /* SAGOSPRITEHOLDER_HPP */ | |
50 | 58 |
160 | 160 | std::cerr << "FATAL: SagoTextBox::UpdateCache - DataHolder not set!\n"; |
161 | 161 | abort(); |
162 | 162 | } |
163 | TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize); | |
163 | TTF_Font* font = data->tex->getFontPtr(data->fontName, data->fontSize); | |
164 | 164 | const char delim = '\n'; |
165 | 165 | const std::string& s = data->text; |
166 | 166 | auto start = 0U; |
167 | 167 | auto end = s.find(delim); |
168 | 168 | data->lines.clear(); |
169 | while (end != std::string::npos) | |
170 | { | |
169 | while (end != std::string::npos) { | |
171 | 170 | const std::string& theSubString = s.substr(start, end - start); |
172 | 171 | SplitAndAppendLineToCache(font, theSubString); |
173 | 172 | start = end + 1; |
181 | 180 | if (data->text != data->renderedText) { |
182 | 181 | UpdateCache(); |
183 | 182 | } |
184 | TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize); | |
183 | TTF_Font* font = data->tex->getFontPtr(data->fontName, data->fontSize); | |
185 | 184 | int lineSkip = TTF_FontLineSkip(font); |
186 | 185 | for (size_t i = 0; i < data->lines.size(); ++i) { |
187 | 186 | data->lines[i].Draw(target, x, y+i*lineSkip, alignment); |
37 | 37 | void SetText(const char* text); |
38 | 38 | void SetText(const std::string& text); |
39 | 39 | void SetColor(const SDL_Color& color); |
40 | ||
40 | ||
41 | 41 | /** |
42 | 42 | * Set the name of the font. Must be known to the data holder. |
43 | 43 | * The name could for instance be "freeserif". |
46 | 46 | void SetFont(const char* fontName); |
47 | 47 | void SetFontSize(int fontSize); |
48 | 48 | void SetOutline(int outlineSize, const SDL_Color& color); |
49 | ||
49 | ||
50 | 50 | /** |
51 | 51 | * Sets the max width to generate. SagoTextBox will insert line breaks to keep the width below this number. |
52 | 52 | * Outline is not included in the width: If you have a 2 pixels outline the rendere may go 2 pixels beyond. |
64 | 64 | SagoTextBox(const SagoTextBox& orig) = delete; |
65 | 65 | SagoTextBox& operator=(const SagoTextBox& base) = delete; |
66 | 66 | struct SagoTextBoxData; |
67 | SagoTextBoxData *data; | |
67 | SagoTextBoxData* data; | |
68 | 68 | }; |
69 | 69 | |
70 | 70 | } //namespace sago |
27 | 27 | |
28 | 28 | namespace sago { |
29 | 29 | |
30 | class OutlineHandler { | |
31 | TTF_Font* font; | |
32 | int originalOutline = 0; | |
33 | int targetOutline; | |
34 | bool doChange = false; | |
35 | public: | |
36 | OutlineHandler(TTF_Font* font, int outline) : font{font}, targetOutline{outline} { | |
37 | originalOutline = TTF_GetFontOutline(font); | |
38 | if (originalOutline == targetOutline) { | |
39 | return; | |
40 | } | |
41 | doChange = true; | |
42 | TTF_SetFontOutline(font, targetOutline); | |
43 | }; | |
44 | ||
45 | void reset() { | |
46 | if (doChange) { | |
47 | TTF_SetFontOutline(font,originalOutline); | |
48 | doChange = false; | |
49 | } | |
50 | } | |
51 | ||
52 | ~OutlineHandler() { | |
53 | reset(); | |
54 | } | |
55 | private: | |
56 | OutlineHandler(const OutlineHandler& orig) = delete; | |
57 | OutlineHandler& operator=(const OutlineHandler& base) = delete; | |
30 | class OutlineHandler { | |
31 | TTF_Font* font; | |
32 | int originalOutline = 0; | |
33 | int targetOutline; | |
34 | bool doChange = false; | |
35 | public: | |
36 | OutlineHandler(TTF_Font* font, int outline) : font{font}, targetOutline{outline} { | |
37 | originalOutline = TTF_GetFontOutline(font); | |
38 | if (originalOutline == targetOutline) { | |
39 | return; | |
40 | } | |
41 | doChange = true; | |
42 | TTF_SetFontOutline(font, targetOutline); | |
58 | 43 | }; |
59 | ||
44 | ||
45 | void reset() { | |
46 | if (doChange) { | |
47 | TTF_SetFontOutline(font,originalOutline); | |
48 | doChange = false; | |
49 | } | |
50 | } | |
51 | ||
52 | ~OutlineHandler() { | |
53 | reset(); | |
54 | } | |
55 | private: | |
56 | OutlineHandler(const OutlineHandler& orig) = delete; | |
57 | OutlineHandler& operator=(const OutlineHandler& base) = delete; | |
58 | }; | |
59 | ||
60 | 60 | struct SagoTextField::SagoTextFieldData { |
61 | 61 | const sago::SagoDataHolder* tex = nullptr; |
62 | 62 | SDL_Surface* textSurface = nullptr; |
72 | 72 | std::string renderedText = ""; |
73 | 73 | Uint64 renderedVersion = 0; |
74 | 74 | }; |
75 | ||
75 | ||
76 | 76 | SagoTextField::SagoTextField() { |
77 | 77 | data = new SagoTextFieldData(); |
78 | 78 | } |
92 | 92 | data->textSurface = nullptr; |
93 | 93 | data->texture = nullptr; |
94 | 94 | return *this; |
95 | } catch (...) { | |
95 | } | |
96 | catch (...) { | |
96 | 97 | delete data; |
97 | 98 | throw; |
98 | 99 | } |
99 | 100 | } |
100 | 101 | |
101 | 102 | SagoTextField::~SagoTextField() { |
102 | if(!data) { | |
103 | if (!data) { | |
103 | 104 | return; |
104 | 105 | } |
105 | 106 | ClearCache(); |
164 | 165 | abort(); |
165 | 166 | } |
166 | 167 | ClearCache(); |
167 | TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize); | |
168 | TTF_Font* font = data->tex->getFontPtr(data->fontName, data->fontSize); | |
168 | 169 | data->textSurface = TTF_RenderUTF8_Blended (font, data->text.c_str(), data->color); |
169 | 170 | data->texture = SDL_CreateTextureFromSurface(target, data->textSurface); |
170 | 171 | if (data->outline > 0) { |
178 | 179 | } |
179 | 180 | |
180 | 181 | void SagoTextField::GetRenderedSize(const char* text, int* w, int* h) { |
181 | TTF_Font *font = data->tex->getFontPtr(data->fontName, data->fontSize); | |
182 | TTF_Font* font = data->tex->getFontPtr(data->fontName, data->fontSize); | |
182 | 183 | int ret = TTF_SizeUTF8(font, text, w, h); |
183 | 184 | if (ret) { |
184 | 185 | if (w) { |
32 | 32 | * This is a text field. |
33 | 33 | * It represents a line of text to be drawn on screen. It is not possible to have line breaks. |
34 | 34 | * If line breaks are needed use SagoTextBox instead. |
35 | * | |
35 | * | |
36 | 36 | * This object renderes to a texture and cahces the texture. The texture will be automatically refreshed if the text changes, the SagoDataHolder is invalidated or ClearCache is called. |
37 | 37 | * Normally all values will be set at the beginning before text is drawn. |
38 | 38 | * SetHolder MUST be called before the field is drawn! |
48 | 48 | /** |
49 | 49 | * This method creates a copy of a given font. |
50 | 50 | * The cache will not be copied. |
51 | * This is ALMOST like the "= operator" but given its own name to prevent implicit calling. | |
51 | * This is ALMOST like the "= operator" but given its own name to prevent implicit calling. | |
52 | 52 | * @param base The object to copy from |
53 | 53 | * @return A reference to this object. |
54 | 54 | */ |
127 | 127 | private: |
128 | 128 | SagoTextField(const SagoTextField& orig) = delete; |
129 | 129 | struct SagoTextFieldData; |
130 | SagoTextFieldData *data; | |
130 | SagoTextFieldData* data; | |
131 | 131 | }; |
132 | 132 | |
133 | 133 | } //namespace sago |
29 | 29 | #define GAMENAME "blockattack" |
30 | 30 | |
31 | 31 | #ifndef VERSION_NUMBER |
32 | #define VERSION_NUMBER "2.6.0" | |
32 | #define VERSION_NUMBER "2.7.0" | |
33 | 33 | #endif |
0 | 0 | #! /bin/bash |
1 | 1 | astyle -t -j -y -c -k1 -z2 -A2 --pad-header ../../code/*.cpp |
2 | astyle -t -j -y -c -k1 -z2 -A2 --pad-header ../../code/sago/*.cpp | |
3 | astyle -t -j -y -c -k1 -z2 -A2 --pad-header ../../code/sago/*.hpp |
0 | # - Try to find SDL2 | |
1 | # Once done, this will define | |
2 | # | |
3 | # SDL2_FOUND - system has SDL2 | |
4 | # SDL2_INCLUDE_DIRS - the SDL2 include directories | |
5 | # SDL2_LIBRARIES - link these to use SDL2 | |
6 | # SDL2_SDL_LIBRARY - only libSDL2 | |
7 | # SDL2_SDLmain_LIBRARY - only libSDL2main | |
8 | # SDL2_SOURCES - add this in the source file list of your target (hack for OSX) | |
9 | # | |
10 | # See documentation on how to write CMake scripts at | |
11 | # http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries | |
12 | ||
13 | include(LibFindMacros) | |
14 | libfind_pkg_detect(SDL2 sdl2 FIND_PATH SDL.h PATH_SUFFIXES SDL2 FIND_LIBRARY SDL2) | |
15 | ||
16 | # Process others than OSX with native SDL normally | |
17 | if(NOT "${SDL2_SDL_LIBRARY}" MATCHES "framework") | |
18 | if(MINGW) | |
19 | set(MINGW32_LIBRARY mingw32) | |
20 | set(SDL2_PROCESS_LIBS ${SDL2_PROCESS_LIBS} MINGW32_LIBRARY) | |
21 | endif() | |
22 | find_library(SDL2_SDLmain_LIBRARY | |
23 | NAMES libSDL2main.a SDL2main | |
24 | HINTS ${SDL2_PKGCONF_LIBRARY_DIRS} | |
25 | ) | |
26 | if (SDL2_SDLmain_LIBRARY) | |
27 | set(SDL2_PROCESS_LIBS ${SDL2_PROCESS_LIBS} SDL2_SDLmain_LIBRARY) | |
28 | endif() | |
29 | set(SDL2_PROCESS_LIBS ${SDL2_PROCESS_LIBS} SDL2_SDL_LIBRARY) | |
30 | endif() | |
31 | ||
32 | libfind_process(SDL2) | |
33 | ||
34 | # Special processing for OSX native SDL | |
35 | if("${SDL2_SDL_LIBRARY}" MATCHES "SDL.framework") | |
36 | set(SDL2_SOURCES "osx/SDLmain.m") | |
37 | set(SDL2_LIBRARIES "-framework SDL2") | |
38 | endif() | |
39 | ||
40 | # All OSX versions need Cocoa | |
41 | if(APPLE) | |
42 | set(SDL2_LIBRARIES ${SDL2_LIBRARIES} "-framework Cocoa") | |
43 | endif(APPLE) | |
44 | ||
45 |
0 | # Version 2.2 | |
1 | # Public Domain, originally written by Lasse Kärkkäinen <tronic> | |
2 | # Maintained at https://github.com/Tronic/cmake-modules | |
3 | # Please send your improvements as pull requests on Github. | |
4 | ||
5 | # Find another package and make it a dependency of the current package. | |
6 | # This also automatically forwards the "REQUIRED" argument. | |
7 | # Usage: libfind_package(<prefix> <another package> [extra args to find_package]) | |
8 | macro (libfind_package PREFIX PKG) | |
9 | set(${PREFIX}_args ${PKG} ${ARGN}) | |
10 | if (${PREFIX}_FIND_REQUIRED) | |
11 | set(${PREFIX}_args ${${PREFIX}_args} REQUIRED) | |
12 | endif() | |
13 | find_package(${${PREFIX}_args}) | |
14 | set(${PREFIX}_DEPENDENCIES ${${PREFIX}_DEPENDENCIES};${PKG}) | |
15 | unset(${PREFIX}_args) | |
16 | endmacro() | |
17 | ||
18 | # A simple wrapper to make pkg-config searches a bit easier. | |
19 | # Works the same as CMake's internal pkg_check_modules but is always quiet. | |
20 | macro (libfind_pkg_check_modules) | |
21 | find_package(PkgConfig QUIET) | |
22 | if (PKG_CONFIG_FOUND) | |
23 | pkg_check_modules(${ARGN} QUIET) | |
24 | endif() | |
25 | endmacro() | |
26 | ||
27 | # Avoid useless copy&pasta by doing what most simple libraries do anyway: | |
28 | # pkg-config, find headers, find library. | |
29 | # Usage: libfind_pkg_detect(<prefix> <pkg-config args> FIND_PATH <name> [other args] FIND_LIBRARY <name> [other args]) | |
30 | # E.g. libfind_pkg_detect(SDL2 sdl2 FIND_PATH SDL.h PATH_SUFFIXES SDL2 FIND_LIBRARY SDL2) | |
31 | function (libfind_pkg_detect PREFIX) | |
32 | # Parse arguments | |
33 | set(argname pkgargs) | |
34 | foreach (i ${ARGN}) | |
35 | if ("${i}" STREQUAL "FIND_PATH") | |
36 | set(argname pathargs) | |
37 | elseif ("${i}" STREQUAL "FIND_LIBRARY") | |
38 | set(argname libraryargs) | |
39 | else() | |
40 | set(${argname} ${${argname}} ${i}) | |
41 | endif() | |
42 | endforeach() | |
43 | if (NOT pkgargs) | |
44 | message(FATAL_ERROR "libfind_pkg_detect requires at least a pkg_config package name to be passed.") | |
45 | endif() | |
46 | # Find library | |
47 | libfind_pkg_check_modules(${PREFIX}_PKGCONF ${pkgargs}) | |
48 | if (pathargs) | |
49 | find_path(${PREFIX}_INCLUDE_DIR NAMES ${pathargs} HINTS ${${PREFIX}_PKGCONF_INCLUDE_DIRS}) | |
50 | endif() | |
51 | if (libraryargs) | |
52 | find_library(${PREFIX}_LIBRARY NAMES ${libraryargs} HINTS ${${PREFIX}_PKGCONF_LIBRARY_DIRS}) | |
53 | endif() | |
54 | endfunction() | |
55 | ||
56 | # Extracts a version #define from a version.h file, output stored to <PREFIX>_VERSION. | |
57 | # Usage: libfind_version_header(Foobar foobar/version.h FOOBAR_VERSION_STR) | |
58 | # Fourth argument "QUIET" may be used for silently testing different define names. | |
59 | # This function does nothing if the version variable is already defined. | |
60 | function (libfind_version_header PREFIX VERSION_H DEFINE_NAME) | |
61 | # Skip processing if we already have a version or if the include dir was not found | |
62 | if (${PREFIX}_VERSION OR NOT ${PREFIX}_INCLUDE_DIR) | |
63 | return() | |
64 | endif() | |
65 | set(quiet ${${PREFIX}_FIND_QUIETLY}) | |
66 | # Process optional arguments | |
67 | foreach(arg ${ARGN}) | |
68 | if (arg STREQUAL "QUIET") | |
69 | set(quiet TRUE) | |
70 | else() | |
71 | message(AUTHOR_WARNING "Unknown argument ${arg} to libfind_version_header ignored.") | |
72 | endif() | |
73 | endforeach() | |
74 | # Read the header and parse for version number | |
75 | set(filename "${${PREFIX}_INCLUDE_DIR}/${VERSION_H}") | |
76 | if (NOT EXISTS ${filename}) | |
77 | if (NOT quiet) | |
78 | message(AUTHOR_WARNING "Unable to find ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}") | |
79 | endif() | |
80 | return() | |
81 | endif() | |
82 | file(READ "${filename}" header) | |
83 | string(REGEX REPLACE ".*#[ \t]*define[ \t]*${DEFINE_NAME}[ \t]*\"([^\n]*)\".*" "\\1" match "${header}") | |
84 | # No regex match? | |
85 | if (match STREQUAL header) | |
86 | if (NOT quiet) | |
87 | message(AUTHOR_WARNING "Unable to find \#define ${DEFINE_NAME} \"<version>\" from ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}") | |
88 | endif() | |
89 | return() | |
90 | endif() | |
91 | # Export the version string | |
92 | set(${PREFIX}_VERSION "${match}" PARENT_SCOPE) | |
93 | endfunction() | |
94 | ||
95 | # Do the final processing once the paths have been detected. | |
96 | # If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain | |
97 | # all the variables, each of which contain one include directory. | |
98 | # Ditto for ${PREFIX}_PROCESS_LIBS and library files. | |
99 | # Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES. | |
100 | # Also handles errors in case library detection was required, etc. | |
101 | function (libfind_process PREFIX) | |
102 | # Skip processing if already processed during this configuration run | |
103 | if (${PREFIX}_FOUND) | |
104 | return() | |
105 | endif() | |
106 | ||
107 | set(found TRUE) # Start with the assumption that the package was found | |
108 | ||
109 | # Did we find any files? Did we miss includes? These are for formatting better error messages. | |
110 | set(some_files FALSE) | |
111 | set(missing_headers FALSE) | |
112 | ||
113 | # Shorthands for some variables that we need often | |
114 | set(quiet ${${PREFIX}_FIND_QUIETLY}) | |
115 | set(required ${${PREFIX}_FIND_REQUIRED}) | |
116 | set(exactver ${${PREFIX}_FIND_VERSION_EXACT}) | |
117 | set(findver "${${PREFIX}_FIND_VERSION}") | |
118 | set(version "${${PREFIX}_VERSION}") | |
119 | ||
120 | # Lists of config option names (all, includes, libs) | |
121 | unset(configopts) | |
122 | set(includeopts ${${PREFIX}_PROCESS_INCLUDES}) | |
123 | set(libraryopts ${${PREFIX}_PROCESS_LIBS}) | |
124 | ||
125 | # Process deps to add to | |
126 | foreach (i ${PREFIX} ${${PREFIX}_DEPENDENCIES}) | |
127 | if (DEFINED ${i}_INCLUDE_OPTS OR DEFINED ${i}_LIBRARY_OPTS) | |
128 | # The package seems to export option lists that we can use, woohoo! | |
129 | list(APPEND includeopts ${${i}_INCLUDE_OPTS}) | |
130 | list(APPEND libraryopts ${${i}_LIBRARY_OPTS}) | |
131 | else() | |
132 | # If plural forms don't exist or they equal singular forms | |
133 | if ((NOT DEFINED ${i}_INCLUDE_DIRS AND NOT DEFINED ${i}_LIBRARIES) OR | |
134 | ({i}_INCLUDE_DIR STREQUAL ${i}_INCLUDE_DIRS AND ${i}_LIBRARY STREQUAL ${i}_LIBRARIES)) | |
135 | # Singular forms can be used | |
136 | if (DEFINED ${i}_INCLUDE_DIR) | |
137 | list(APPEND includeopts ${i}_INCLUDE_DIR) | |
138 | endif() | |
139 | if (DEFINED ${i}_LIBRARY) | |
140 | list(APPEND libraryopts ${i}_LIBRARY) | |
141 | endif() | |
142 | else() | |
143 | # Oh no, we don't know the option names | |
144 | message(FATAL_ERROR "We couldn't determine config variable names for ${i} includes and libs. Aieeh!") | |
145 | endif() | |
146 | endif() | |
147 | endforeach() | |
148 | ||
149 | if (includeopts) | |
150 | list(REMOVE_DUPLICATES includeopts) | |
151 | endif() | |
152 | ||
153 | if (libraryopts) | |
154 | list(REMOVE_DUPLICATES libraryopts) | |
155 | endif() | |
156 | ||
157 | string(REGEX REPLACE ".*[ ;]([^ ;]*(_INCLUDE_DIRS|_LIBRARIES))" "\\1" tmp "${includeopts} ${libraryopts}") | |
158 | if (NOT tmp STREQUAL "${includeopts} ${libraryopts}") | |
159 | message(AUTHOR_WARNING "Plural form ${tmp} found in config options of ${PREFIX}. This works as before but is now deprecated. Please only use singular forms INCLUDE_DIR and LIBRARY, and update your find scripts for LibFindMacros > 2.0 automatic dependency system (most often you can simply remove the PROCESS variables entirely).") | |
160 | endif() | |
161 | ||
162 | # Include/library names separated by spaces (notice: not CMake lists) | |
163 | unset(includes) | |
164 | unset(libs) | |
165 | ||
166 | # Process all includes and set found false if any are missing | |
167 | foreach (i ${includeopts}) | |
168 | list(APPEND configopts ${i}) | |
169 | if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND") | |
170 | list(APPEND includes "${${i}}") | |
171 | else() | |
172 | set(found FALSE) | |
173 | set(missing_headers TRUE) | |
174 | endif() | |
175 | endforeach() | |
176 | ||
177 | # Process all libraries and set found false if any are missing | |
178 | foreach (i ${libraryopts}) | |
179 | list(APPEND configopts ${i}) | |
180 | if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND") | |
181 | list(APPEND libs "${${i}}") | |
182 | else() | |
183 | set (found FALSE) | |
184 | endif() | |
185 | endforeach() | |
186 | ||
187 | # Version checks | |
188 | if (found AND findver) | |
189 | if (NOT version) | |
190 | message(WARNING "The find module for ${PREFIX} does not provide version information, so we'll just assume that it is OK. Please fix the module or remove package version requirements to get rid of this warning.") | |
191 | elseif (version VERSION_LESS findver OR (exactver AND NOT version VERSION_EQUAL findver)) | |
192 | set(found FALSE) | |
193 | set(version_unsuitable TRUE) | |
194 | endif() | |
195 | endif() | |
196 | ||
197 | # If all-OK, hide all config options, export variables, print status and exit | |
198 | if (found) | |
199 | foreach (i ${configopts}) | |
200 | mark_as_advanced(${i}) | |
201 | endforeach() | |
202 | if (NOT quiet) | |
203 | message(STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") | |
204 | if (LIBFIND_DEBUG) | |
205 | message(STATUS " ${PREFIX}_DEPENDENCIES=${${PREFIX}_DEPENDENCIES}") | |
206 | message(STATUS " ${PREFIX}_INCLUDE_OPTS=${includeopts}") | |
207 | message(STATUS " ${PREFIX}_INCLUDE_DIRS=${includes}") | |
208 | message(STATUS " ${PREFIX}_LIBRARY_OPTS=${libraryopts}") | |
209 | message(STATUS " ${PREFIX}_LIBRARIES=${libs}") | |
210 | endif() | |
211 | set (${PREFIX}_INCLUDE_OPTS ${includeopts} PARENT_SCOPE) | |
212 | set (${PREFIX}_LIBRARY_OPTS ${libraryopts} PARENT_SCOPE) | |
213 | set (${PREFIX}_INCLUDE_DIRS ${includes} PARENT_SCOPE) | |
214 | set (${PREFIX}_LIBRARIES ${libs} PARENT_SCOPE) | |
215 | set (${PREFIX}_FOUND TRUE PARENT_SCOPE) | |
216 | endif() | |
217 | return() | |
218 | endif() | |
219 | ||
220 | # Format messages for debug info and the type of error | |
221 | set(vars "Relevant CMake configuration variables:\n") | |
222 | foreach (i ${configopts}) | |
223 | mark_as_advanced(CLEAR ${i}) | |
224 | set(val ${${i}}) | |
225 | if ("${val}" STREQUAL "${i}-NOTFOUND") | |
226 | set (val "<not found>") | |
227 | elseif (val AND NOT EXISTS ${val}) | |
228 | set (val "${val} (does not exist)") | |
229 | else() | |
230 | set(some_files TRUE) | |
231 | endif() | |
232 | set(vars "${vars} ${i}=${val}\n") | |
233 | endforeach() | |
234 | set(vars "${vars}You may use CMake GUI, cmake -D or ccmake to modify the values. Delete CMakeCache.txt to discard all values and force full re-detection if necessary.\n") | |
235 | if (version_unsuitable) | |
236 | set(msg "${PREFIX} ${${PREFIX}_VERSION} was found but") | |
237 | if (exactver) | |
238 | set(msg "${msg} only version ${findver} is acceptable.") | |
239 | else() | |
240 | set(msg "${msg} version ${findver} is the minimum requirement.") | |
241 | endif() | |
242 | else() | |
243 | if (missing_headers) | |
244 | set(msg "We could not find development headers for ${PREFIX}. Do you have the necessary dev package installed?") | |
245 | elseif (some_files) | |
246 | set(msg "We only found some files of ${PREFIX}, not all of them. Perhaps your installation is incomplete or maybe we just didn't look in the right place?") | |
247 | if(findver) | |
248 | set(msg "${msg} This could also be caused by incompatible version (if it helps, at least ${PREFIX} ${findver} should work).") | |
249 | endif() | |
250 | else() | |
251 | set(msg "We were unable to find package ${PREFIX}.") | |
252 | endif() | |
253 | endif() | |
254 | ||
255 | # Fatal error out if REQUIRED | |
256 | if (required) | |
257 | set(msg "REQUIRED PACKAGE NOT FOUND\n${msg} This package is REQUIRED and you need to install it or adjust CMake configuration in order to continue building ${CMAKE_PROJECT_NAME}.") | |
258 | message(FATAL_ERROR "${msg}\n${vars}") | |
259 | endif() | |
260 | # Otherwise just print a nasty warning | |
261 | if (NOT quiet) | |
262 | message(WARNING "WARNING: MISSING PACKAGE\n${msg} This package is NOT REQUIRED and you may ignore this warning but by doing so you may miss some functionality of ${CMAKE_PROJECT_NAME}. \n${vars}") | |
263 | endif() | |
264 | endfunction() | |
265 | ||
266 |
6 | 6 | boost-devel \ |
7 | 7 | physfs-devel \ |
8 | 8 | SDL2_image-devel SDL2_ttf-devel SDL2_mixer-devel \ |
9 | utf8cpp-devel \ | |
10 | 9 | findutils \ |
11 | 10 | gettext \ |
12 | 11 | zip \ |
14 | 13 | |
15 | 14 | COPY . /staging/blockattack-game |
16 | 15 | |
17 | ENV BLOCKATTACK_VERSION 2.6.0 | |
16 | ENV BLOCKATTACK_VERSION 2.7.0 | |
18 | 17 | |
19 | 18 | RUN cd /staging/blockattack-game && \ |
20 | 19 | ./packdata.sh && \ |
6 | 6 | boost-devel \ |
7 | 7 | physfs-devel \ |
8 | 8 | SDL2_image-devel SDL2_ttf-devel SDL2_mixer-devel \ |
9 | utf8cpp-devel \ | |
10 | 9 | findutils \ |
11 | 10 | gettext \ |
12 | 11 | zip \ |
14 | 13 | |
15 | 14 | COPY . /staging/blockattack-game |
16 | 15 | |
17 | ENV BLOCKATTACK_VERSION 2.6.0 | |
16 | ENV BLOCKATTACK_VERSION 2.7.0 | |
18 | 17 | |
19 | 18 | RUN cd /staging/blockattack-game && \ |
20 | 19 | ./packdata.sh && \ |
0 | FROM ubuntu:12.04 | |
1 | ||
2 | RUN apt-get update && apt-get install -y build-essential cmake pkg-config libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libpng12-dev zip gettext | |
3 | ||
4 | RUN apt-get update && apt-get install -y python-software-properties && \ | |
5 | add-apt-repository ppa:ubuntu-toolchain-r/test && \ | |
6 | apt-get update && \ | |
7 | apt-get install -y gcc-4.8 g++-4.8 && \ | |
8 | update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 && \ | |
9 | update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50 | |
10 | ||
11 | COPY source/misc/standalone/compile_requirements.sh / | |
12 | RUN /compile_requirements.sh | |
13 | ||
14 | ||
15 | ||
16 | COPY . /staging/blockattack-game | |
17 | ||
18 | ENV BLOCKATTACK_VERSION 2.6.0 | |
19 | ||
20 | RUN cd /staging/blockattack-game && \ | |
21 | ./packdata.sh && \ | |
22 | cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/ && \ | |
23 | cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/sago/ && \ | |
24 | cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/ && \ | |
25 | cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/sago/ && \ | |
26 | cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make |
0 | FROM ubuntu:14.04 | |
1 | ||
2 | RUN apt-get update && apt-get install -yy build-essential libphysfs-dev libboost-dev cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libboost-program-options-dev libutfcpp-dev zip gettext | |
3 | ||
4 | RUN mkdir -p /staging/blockattack-game | |
5 | ||
6 | COPY . /staging/blockattack-game | |
7 | ||
8 | ENV BLOCKATTACK_VERSION 2.6.0 | |
9 | ||
10 | RUN cd /staging/blockattack-game && \ | |
11 | ./packdata.sh && \ | |
12 | cmake . && \ | |
13 | make |
0 | FROM ubuntu:14.04 | |
1 | ||
2 | RUN apt-get update && apt-get install -y build-essential libboost-dev cmake pkg-config libboost-program-options-dev libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libutfcpp-dev zip gettext | |
3 | ||
4 | COPY source/misc/standalone/compile_requirements.sh / | |
5 | RUN /compile_requirements.sh | |
6 | ||
7 | COPY . /staging/blockattack-game | |
8 | ||
9 | ENV BLOCKATTACK_VERSION 2.6.0 | |
10 | ||
11 | RUN cd /staging/blockattack-game && \ | |
12 | ./packdata.sh && \ | |
13 | cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make |
0 | FROM ioft/i386-ubuntu:14.04 | |
1 | ||
2 | RUN apt-get update && apt-get install -y build-essential libboost-dev cmake pkg-config libboost-program-options-dev libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libutfcpp-dev zip gettext | |
3 | ||
4 | COPY source/misc/standalone/compile_requirements.sh / | |
5 | RUN /compile_requirements.sh | |
6 | ||
7 | COPY . /staging/blockattack-game | |
8 | ||
9 | ENV BLOCKATTACK_VERSION 2.6.0 | |
10 | ||
11 | RUN cd /staging/blockattack-game && \ | |
12 | ./packdata.sh && \ | |
13 | cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make |
0 | FROM ubuntu:16.04 | |
1 | ||
2 | RUN apt-get update && apt-get install -yy build-essential libphysfs-dev libboost-dev cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libboost-program-options-dev libutfcpp-dev zip gettext | |
3 | ||
4 | RUN mkdir -p /staging/blockattack-game | |
5 | ||
6 | COPY . /staging/blockattack-game | |
7 | ||
8 | ENV BLOCKATTACK_VERSION 2.6.0 | |
9 | ||
10 | RUN cd /staging/blockattack-game && \ | |
11 | ./packdata.sh && \ | |
12 | cmake . && \ | |
13 | make |
0 | FROM ubuntu:16.04 | |
1 | ||
2 | RUN apt-get update && apt-get install -y build-essential cmake pkg-config libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libpng12-dev zip gettext | |
3 | ||
4 | RUN apt-get update && apt-get install -y python-software-properties && \ | |
5 | apt-get update && \ | |
6 | apt-get install -y gcc-4.8 g++-4.8 && \ | |
7 | update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 && \ | |
8 | update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50 | |
9 | ||
10 | COPY source/misc/standalone/compile_requirements.sh / | |
11 | RUN /compile_requirements.sh | |
12 | ||
13 | ||
14 | ||
15 | COPY . /staging/blockattack-game | |
16 | ||
17 | ENV BLOCKATTACK_VERSION 2.7.0 | |
18 | ||
19 | RUN cd /staging/blockattack-game && \ | |
20 | ./packdata.sh && \ | |
21 | cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make |
0 | FROM ioft/i386-ubuntu:16.04 | |
1 | ||
2 | RUN apt-get update && apt-get install -y build-essential cmake pkg-config libfreetype6-dev libvorbis-dev libgl1-mesa-dev libpulse-dev libpng12-dev zip gettext | |
3 | ||
4 | RUN apt-get update && apt-get install -y python-software-properties software-properties-common && \ | |
5 | add-apt-repository ppa:ubuntu-toolchain-r/test && \ | |
6 | apt-get update && \ | |
7 | apt-get install -y gcc-4.8 g++-4.8 && \ | |
8 | update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 && \ | |
9 | update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50 | |
10 | ||
11 | COPY source/misc/standalone/compile_requirements.sh / | |
12 | RUN /compile_requirements.sh | |
13 | ||
14 | ||
15 | ||
16 | COPY . /staging/blockattack-game | |
17 | ||
18 | ENV BLOCKATTACK_VERSION 2.3.0 | |
19 | ||
20 | RUN cd /staging/blockattack-game && \ | |
21 | ./packdata.sh && \ | |
22 | cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make |
0 | FROM ubuntu:18.04 | |
1 | ||
2 | RUN apt-get update && apt-get install -yy build-essential libphysfs-dev libboost-dev cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libboost-program-options-dev libutfcpp-dev zip gettext | |
3 | ||
4 | RUN mkdir -p /staging/blockattack-game | |
5 | ||
6 | COPY . /staging/blockattack-game | |
7 | ||
8 | ENV BLOCKATTACK_VERSION 2.7.0 | |
9 | ||
10 | RUN cd /staging/blockattack-game && \ | |
11 | ./packdata.sh && \ | |
12 | cmake . && \ | |
13 | make |
0 | FROM ubuntu:20.04 | |
1 | ||
2 | # Set timezone to UTC. This prevents apt-get install SOME-PACKAGES from asking for timezone during setup | |
3 | ENV TZ=UTC | |
4 | RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone | |
5 | ||
6 | ||
7 | RUN apt-get update && apt-get install -yy build-essential libphysfs-dev libboost-dev cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libboost-program-options-dev libutfcpp-dev zip gettext | |
8 | ||
9 | RUN mkdir -p /staging/blockattack-game | |
10 | ||
11 | COPY . /staging/blockattack-game | |
12 | ||
13 | ENV BLOCKATTACK_VERSION 2.7.0 | |
14 | ||
15 | RUN cd /staging/blockattack-game && \ | |
16 | ./packdata.sh && \ | |
17 | cmake . && \ | |
18 | make |
7 | 7 | |
8 | 8 | COPY . /staging/blockattack-game |
9 | 9 | |
10 | ENV BLOCKATTACK_VERSION 2.6.0 | |
10 | ENV BLOCKATTACK_VERSION 2.7.0 | |
11 | 11 | |
12 | 12 | RUN cd /staging/blockattack-game && \ |
13 | 13 | ./packdata.sh && \ |
14 | cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/Libs/include/ && \ | |
15 | cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/Libs/include/ && \ | |
16 | 14 | i686-w64-mingw32.static-cmake . && \ |
17 | 15 | make && \ |
18 | 16 | cd windows\ installer/ && \ |
23 | 21 | cp /staging/blockattack-game/Game/blockattack.data ./ && \ |
24 | 22 | cp /staging/blockattack-game/Game/blockattack.exe ./ && \ |
25 | 23 | cp /staging/blockattack-game/COPYING ./COPYING.txt && \ |
24 | mkdir -p mods && cp /staging/blockattack-game/Game/mods/1.3.0.bricks.data ./mods/ && \ | |
26 | 25 | cp -r /staging/blockattack-game/source/misc/translation/locale ./ && \ |
27 | 26 | echo "[InternetShortcut]" > "Block Attack - Rise Of the Blocks.url" && \ |
28 | 27 | echo "URL=https://blockattack.net" >> "Block Attack - Rise Of the Blocks.url" && \ |
Binary diff not shown
0 | /* XPM */ | |
1 | static char *blockattack128[] = { | |
2 | /* columns rows colors chars-per-pixel */ | |
3 | "128 128 102 2 ", | |
4 | " c #654500", | |
5 | ". c #644600", | |
6 | "X c #654600", | |
7 | "o c #654700", | |
8 | "O c #664600", | |
9 | "+ c #664700", | |
10 | "@ c #735200", | |
11 | "# c #745300", | |
12 | "$ c #755400", | |
13 | "% c #765500", | |
14 | "& c #775500", | |
15 | "* c #775600", | |
16 | "= c #876400", | |
17 | "- c #886500", | |
18 | "; c #896500", | |
19 | ": c #896600", | |
20 | "> c #8C6700", | |
21 | ", c #8B6800", | |
22 | "< c #A57E00", | |
23 | "1 c #A67F00", | |
24 | "2 c #A78000", | |
25 | "3 c #A88100", | |
26 | "4 c #C19600", | |
27 | "5 c #C19700", | |
28 | "6 c #C29800", | |
29 | "7 c #C39800", | |
30 | "8 c #C49900", | |
31 | "9 c #CDA200", | |
32 | "0 c #CEA200", | |
33 | "q c #CFA300", | |
34 | "w c #DEB100", | |
35 | "e c #DFB100", | |
36 | "r c #E0B100", | |
37 | "t c #E0B200", | |
38 | "y c #EABB00", | |
39 | "u c #EBBB00", | |
40 | "i c #ECBC00", | |
41 | "p c #ECBD00", | |
42 | "a c #F1C100", | |
43 | "s c #F2C100", | |
44 | "d c #F2C200", | |
45 | "f c #F3C200", | |
46 | "g c #FAC900", | |
47 | "h c #FBC900", | |
48 | "j c #FDCB00", | |
49 | "k c #FDCC00", | |
50 | "l c #FFCD00", | |
51 | "z c #FFCE00", | |
52 | "x c #FFCF00", | |
53 | "c c #FFD000", | |
54 | "v c #FED100", | |
55 | "b c #FFD100", | |
56 | "n c #FED200", | |
57 | "m c #FED300", | |
58 | "M c #FED400", | |
59 | "N c #FED500", | |
60 | "B c #FED600", | |
61 | "V c #FED700", | |
62 | "C c #FDD900", | |
63 | "Z c #FDDA00", | |
64 | "A c #FDDB00", | |
65 | "S c #FDDC00", | |
66 | "D c #FDDD00", | |
67 | "F c #FDDE00", | |
68 | "G c #FCDF00", | |
69 | "H c #FDDF00", | |
70 | "J c #FCE000", | |
71 | "K c #FCE100", | |
72 | "L c #FCE200", | |
73 | "P c #FCE300", | |
74 | "I c #FBE600", | |
75 | "U c #FBE700", | |
76 | "Y c #FCE400", | |
77 | "T c #FCE500", | |
78 | "R c #FCE600", | |
79 | "E c #FBE800", | |
80 | "W c #FBEA00", | |
81 | "Q c #FBEB00", | |
82 | "! c #FBEC00", | |
83 | "~ c #FAED00", | |
84 | "^ c #FBED00", | |
85 | "/ c #FAEE00", | |
86 | "( c #FAEF00", | |
87 | ") c #FAF000", | |
88 | "_ c #FAF100", | |
89 | "` c #FAF200", | |
90 | "' c #FAF300", | |
91 | "] c #F9F400", | |
92 | "[ c #F9F500", | |
93 | "{ c #FAF400", | |
94 | "} c #F9F600", | |
95 | "| c #F9F700", | |
96 | " . c #F9F800", | |
97 | ".. c #F9F900", | |
98 | "X. c #F9FA00", | |
99 | "o. c #F8FB00", | |
100 | "O. c #F9FB00", | |
101 | "+. c #F8FC00", | |
102 | "@. c #F8FD00", | |
103 | "#. c #F8FE00", | |
104 | "$. c #F8FF00", | |
105 | "%. c None", | |
106 | /* pixels */ | |
107 | "%.%.%.%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.%.%.%.", | |
108 | "%.%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.%.", | |
109 | "%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.", | |
110 | "%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.", | |
111 | "%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.", | |
112 | "%.X X X X X X X X X X % 2 q e 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 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 e q 2 % X X X X X X X X X X %.", | |
113 | "%.X X X X X X X X # 5 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 6 % X X X X X X X X %.", | |
114 | "X X X X X X X X : a l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l a > X X X X X X X X ", | |
115 | "X X X X X X X : 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 : X X X X X X X ", | |
116 | "X X X X X X % a l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l a # X X X X X X ", | |
117 | "X X X X X X 8 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 5 X X X X X X ", | |
118 | "X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l % X X X X X ", | |
119 | "X X X X X 3 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X X ", | |
120 | "X X X X X q l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l q X X X X X ", | |
121 | "X X X X X 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 l l l l l l l l e X X X X X ", | |
122 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X X ", | |
123 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
124 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
125 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
126 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
127 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
128 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
129 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
130 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
131 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
132 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
133 | "X X X X X 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 l l l l l l l 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
134 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N #.#.#.#.N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
135 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
136 | "X X X X X 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 l l l l l 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 #.#.#.#.#.#.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 l l l l l l l l l l l l l l l l l l l p X X X X X ", | |
137 | "X X X X X 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 l l l l 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
138 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.#.} l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
139 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l R #.#.#.#.#.$.$.$.$.$.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 l l l 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 X X X X ", | |
140 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l m #.#.#.#.#.#.$.$.$.$.$.$.m l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
141 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l ' #.#.#.#.#.#.$.$.$.$.$.$./ l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
142 | "X X X X X 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 l 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 l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
143 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.$.$.$.$.$.$.$.} l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
144 | "X X X X X 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 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 #.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.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 p X X X X X ", | |
145 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l m #.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.O.m l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
146 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l / #.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$./ l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
147 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l Z #.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.Z l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
148 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.} l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
149 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l R #.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.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 l l l l l l l l l l l l l l l l l l l l l p X X X X X ", | |
150 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.N l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
151 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l } #.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.} l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
152 | "X X X X X 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 l l l l l l l l l l l l l l l l l l Z ' #.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.' Z l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
153 | "X X X X X 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 l l l l l l l l l l l l l l N P / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.O./ P N l l l l l l l l l l l l l l l 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 X X X X ", | |
154 | "X X X X X 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 l l l l l l l l l l Z P / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.O.' I Z m l l l l l l l l l l 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 X X X X ", | |
155 | "X X X X X 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 l l l l l m H E } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.} E P m l l l l l l 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 X X X X ", | |
156 | "X X X X X 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 l m H / O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.O.^ 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 p X X X X X ", | |
157 | "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l m P } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.' P m 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 X X X X ", | |
158 | "X X X X X p l l l l l l l l l l l l l l l l l l l l l m / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.#./ m l l l l l l l l l l l l l l l l l l l l l p X X X X X ", | |
159 | "X X X X X p l l l l l l l l l l l l l l l l l l l l l R #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.R l l l l l l l l l l l l l l l l l l l l l p X X X X X ", | |
160 | "X X X X X p l l l l l l l l l l l l l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.m l l l l l l l l l l l l l l l l l l l l l p X X X X X ", | |
161 | "X X X X X p l l l l l l l l l l l l l l l l l l l l l l R #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.P l l l l l l l l l l l l l l l l l l l l l l p X X X X X ", | |
162 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l p X X X X X ", | |
163 | "X X X X X p l l l l l l l l l l l l l l l l l l l l l l l m O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.O.m 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 X X X X ", | |
164 | "X X X X X 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 Z #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.Z 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 X X X X ", | |
165 | "X X X X X 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 P #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.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 p X X X X X ", | |
166 | "X X X X X 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 l E #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.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 p X X X X X ", | |
167 | "X X X X X 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 l m / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.$.$./ l l l 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 X X X X ", | |
168 | "X X X X X 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 l l m } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.$.} m l l l 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 X X X X ", | |
169 | "X X X X X 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 l l l m O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.O.m l l l l 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 X X X X ", | |
170 | "X X X X X 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 l l l l m #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.#.N l l l l l 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 X X X X ", | |
171 | "X X X X X 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 l l l l l Z #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.#.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 p X X X X X ", | |
172 | "X X X X X 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 l l l l l l P #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.#.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 p X X X X X ", | |
173 | "X X X X X 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 l l l l l l l I #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#.#.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 p X X X X X ", | |
174 | "X X X X X 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 l l l l l l l l / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.#./ l l l l l l l l l 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 X X X X ", | |
175 | "X X X X X 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 l l l l l l l l l } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.} l l l l l l l l l l 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 X X X X ", | |
176 | "X X X X X 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 l l l l l l l l l m O.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.O.m l l l l l l l l l l 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 X X X X ", | |
177 | "X X X X X 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 l l l l l l l l l l H #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.Z l l l l l l l l l l l 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 X X X X ", | |
178 | "X X X X X 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 l l l l l l l l l l l 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 p X X X X X ", | |
179 | "X X X X X 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 l l l l l l l l l l l } #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.} l l l l l l l l l l l l 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 X X X X ", | |
180 | "X X X X X 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 l l l l l l l l l l l 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 p X X X X X ", | |
181 | "X X X X X 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 l l l l l l l l l l l #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.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 p X X X X X ", | |
182 | "X X X X X 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 l l l l l l l l l l l #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.l l l l l l l l l l l l 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 X X X X ", | |
183 | "X X X X X 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 l l l l l l l l l l m #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.m l l l l l l l l l l l 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 X X X X ", | |
184 | "X X X X X 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 l l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.m l l l l l l l l l l l 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 X X X X ", | |
185 | "X X X X X 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 l l l l l l l l l l Z #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.N l l l l l l l l l l l 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 X X X X ", | |
186 | "X X X X X 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 l l l l l l l l l l H #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.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 p X X X X X ", | |
187 | "X X X X X 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 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 l l l l l l l l l l l l l l l l l l l l l p X X X X X ", | |
188 | "X X X X X 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 l l l l l l l l l l I #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.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 p X X X X X ", | |
189 | "X X X X X 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 l l l l l l l l l 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 p X X X X X ", | |
190 | "X X X X X 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 l l l l l l l l l l / #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$./ l l l l l l l l l l l 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 X X X X ", | |
191 | "X X X X X 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 l l l l l l l l l l ' #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.$.$.} l l l l l l l l l l l 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 X X X X ", | |
192 | "X X X X X 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 l l l l l l l l l l 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 p X X X X X ", | |
193 | "X X X X X 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 l l l l l l l l l l #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.l l l l l l l l l l l 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 X X X X ", | |
194 | "X X X X X 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 l l l l l l l l l l #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.} P N N 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 l l l l l l l l l l p X X X X X ", | |
195 | "X X X X X 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 l l l l l l l l l m #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.$./ N l l l l l l N E $.$.$.$.$.$.$.$.$.$.$.#.#.#.#.#.#.#.m l l l l l l l l l l 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 X X X X ", | |
196 | "X X X X X 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 l l l l l l l l l m #.#.#.#.#.#.#.#.#.#.#.#.#.#.#.O.I l l l l l l l l l l l m G } $.$.$.$.$.$.$.$.#.#.#.#.#.#.#.m l l l l l l l l l l 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 X X X X ", | |
197 | "X X X X X 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 l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.#.#.#.' H l l l l l l l l l l l l l l l l Z ' $.$.$.$.$.$.#.#.#.#.#.#.#.N l l l l l l l l l l 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 X X X X ", | |
198 | "X X X X X 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 l l l l l l l l l N #.#.#.#.#.#.#.#.#.#.O./ N l l l l l l l l l l l l l l l l l l l l N E $.$.$.$.#.#.#.#.#.#.#.N l l l l l l l l l l 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 X X X X ", | |
199 | "X X X X X 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 l l l l l l l l l m $.$.$.#.#.#.#.#.} R m l l l l l l l l l l l l l l l l l l l l l l l l m H } $.#.#.#.#.#.#.#.m l l l l l l l l l l 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 X X X X ", | |
200 | "X X X X X 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 l l l l l l l l l m $.$.$.#.#.#.^ Z l l l l l l 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 / #.#.#.#.#.#.l l l l l l l l l l l 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 X X X X ", | |
201 | "X X X X X 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 l l l l l l l l l l } #.O./ 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 l l l l l l l l l l m H / #.#.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 p X X X X X ", | |
202 | "X X X X X 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 l l l l l l l l l l m N l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l N m l l l l l l l l l l l 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 X X X X ", | |
203 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
204 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
205 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
206 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
207 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
208 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
209 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
210 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
211 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
212 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
213 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
214 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
215 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
216 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
217 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
218 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
219 | "X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 o X X ", | |
220 | "X X X X X 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 l l l l l l l l e . X X ", | |
221 | "X X X X X q l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l q X X X X ", | |
222 | "X X X X X 1 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 X X X X ", | |
223 | "X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l % X X X X X ", | |
224 | "X X X X X X 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 5 X X X X X X ", | |
225 | "X X X X X X # a l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l a @ X X X X X o ", | |
226 | "X X X X X X X = 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 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 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 = X X X X X X ", | |
227 | "X X X X X X X X = a l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l f , X X X X X X ", | |
228 | "%.X X X X X X X X # 5 l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l 5 # X o . X X X X X %.", | |
229 | "%.X X X X X X X X X X % 1 q w 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 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 e q 1 % X X X X X X X X X X %.", | |
230 | "%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.", | |
231 | "%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X . . o X X X X X X X X X %.%.%.", | |
232 | "%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.", | |
233 | "%.%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X %.%.%.%.%.", | |
234 | "%.%.%.%.%.%.%.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X o X X %.%.%.%.%.%.%." | |
235 | }; |
Binary diff not shown
0 | /* XPM */ | |
1 | static char *blockattack16[] = { | |
2 | /* columns rows colors chars-per-pixel */ | |
3 | "16 16 19 1 ", | |
4 | " c #644600", | |
5 | ". c #664600", | |
6 | "X c #886500", | |
7 | "o c #896600", | |
8 | "O c #987300", | |
9 | "+ c #9D7700", | |
10 | "@ c #FFCD00", | |
11 | "# c #FFD000", | |
12 | "$ c #FED400", | |
13 | "% c #FDDB00", | |
14 | "& c #FDDC00", | |
15 | "* c #FCE500", | |
16 | "= c #FBED00", | |
17 | "- c #FAF000", | |
18 | "; c #F9F700", | |
19 | ": c #F9F900", | |
20 | "> c #F9FA00", | |
21 | ", c #F8FE00", | |
22 | "< c #F8FF00", | |
23 | /* pixels */ | |
24 | ".oOOOOOOOOOOOOo.", | |
25 | "o@@@@@@@@@@@@@@o", | |
26 | "+@@@@@@@@@@@@@@+", | |
27 | "+@@@@@@&%@@@@@@+", | |
28 | "+@@@@@#>>#@@@@@+", | |
29 | "+@@@@$=<<=@@@@@+", | |
30 | "+@@&><<<<<<>%@@+", | |
31 | "+@@@;<<<<<<>@@@+", | |
32 | "+@@@#>,,<>>#@@@+", | |
33 | "+@@@@>,,,,>@@@@+", | |
34 | "+@@@@;,,,,>@@@@+", | |
35 | "+@@@@-*#@*-@@@@+", | |
36 | "+@@@@@@@@@@@@@@+", | |
37 | "+@@@@@@@@@@@@@@+", | |
38 | "X@@@@@@@@@@@@@@X", | |
39 | " XOOOOOOOOOOOOX " | |
40 | }; |
Binary diff not shown
0 | /* XPM */ | |
1 | static char *blockattack256[] = { | |
2 | /* columns rows colors chars-per-pixel */ | |
3 | "256 256 122 2 ", | |
4 | " c #654500", | |
5 | ". c #644600", | |
6 | "X c #654600", | |
7 | "o c #644700", | |
8 | "O c #654700", | |
9 | "+ c #664600", | |
10 | "@ c #664700", | |
11 | "# c #704F00", | |
12 | "$ c #705000", | |
13 | "% c #715100", | |
14 | "& c #725100", | |
15 | "* c #725200", | |
16 | "= c #735200", | |
17 | "- c #745300", | |
18 | "; c #785600", | |
19 | ": c #785700", | |
20 | "> c #795800", | |
21 | ", c #7A5800", | |
22 | "< c #7B5900", | |
23 | "1 c #957000", | |
24 | "2 c #977100", | |
25 | "3 c #A47D00", | |
26 | "4 c #A57E00", | |
27 | "5 c #A67F00", | |
28 | "6 c #A78000", | |
29 | "7 c #A88100", | |
30 | "8 c #A98100", | |
31 | "9 c #A98200", | |
32 | "0 c #AF8700", | |
33 | "q c #B08800", | |
34 | "w c #B18800", | |
35 | "e c #BA9000", | |
36 | "r c #BB9100", | |
37 | "t c #BB9200", | |
38 | "y c #BD9300", | |
39 | "u c #C69B00", | |
40 | "i c #C79C00", | |
41 | "p c #CFA300", | |
42 | "a c #D0A300", | |
43 | "s c #D0A400", | |
44 | "d c #D1A500", | |
45 | "f c #D2A600", | |
46 | "g c #D3A600", | |
47 | "h c #D6A900", | |
48 | "j c #D8AC00", | |
49 | "k c #DAAD00", | |
50 | "l c #DEB000", | |
51 | "z c #DEB100", | |
52 | "x c #E0B100", | |
53 | "c c #E0B200", | |
54 | "v c #E7B900", | |
55 | "b c #E8B800", | |
56 | "n c #E9B900", | |
57 | "m c #EABB00", | |
58 | "M c #EEBE00", | |
59 | "N c #EFBE00", | |
60 | "B c #EFBF00", | |
61 | "V c #F5C400", | |
62 | "C c #F6C500", | |
63 | "Z c #F8C700", | |
64 | "A c #F9C800", | |
65 | "S c #FAC800", | |
66 | "D c #FECC00", | |
67 | "F c #FFCD00", | |
68 | "G c #FFCE00", | |
69 | "H c #FFCF00", | |
70 | "J c #FFD000", | |
71 | "K c #FED100", | |
72 | "L c #FFD100", | |
73 | "P c #FED200", | |
74 | "I c #FED300", | |
75 | "U c #FED400", | |
76 | "Y c #FED500", | |
77 | "T c #FED600", | |
78 | "R c #FED700", | |
79 | "E c #FDD800", | |
80 | "W c #FDD900", | |
81 | "Q c #FED800", | |
82 | "! c #FDDA00", | |
83 | "~ c #FDDB00", | |
84 | "^ c #FDDC00", | |
85 | "/ c #FDDD00", | |
86 | "( c #FDDE00", | |
87 | ") c #FCDF00", | |
88 | "_ c #FDDF00", | |
89 | "` c #FCE000", | |
90 | "' c #FCE100", | |
91 | "] c #FCE200", | |
92 | "[ c #FCE300", | |
93 | "{ c #FBE600", | |
94 | "} c #FBE700", | |
95 | "| c #FCE400", | |
96 | " . c #FCE500", | |
97 | ".. c #FCE600", | |
98 | "X. c #FBE800", | |
99 | "o. c #FBE900", | |
100 | "O. c #FBEA00", | |
101 | "+. c #FBEB00", | |
102 | "@. c #FBEC00", | |
103 | "#. c #FAED00", | |
104 | "$. c #FBED00", | |
105 | "%. c #FAEE00", | |
106 | "&. c #FAEF00", | |
107 | "*. c #FAF000", | |
108 | "=. c #FAF100", | |
109 | "-. c #FAF200", | |
110 | ";. c #FAF300", | |
111 | ":. c #F9F400", | |
112 | ">. c #F9F500", | |
113 | ",. c #FAF400", | |
114 | "<. c #F9F600", | |
115 | "1. c #F9F700", | |
116 | "2. c #F9F800", | |
117 | "3. c #F9F900", | |
118 | "4. c #F9FA00", | |
119 | "5. c #F8FB00", | |
120 | "6. c #F9FB00", | |
121 | "7. c #F8FC00", | |
122 | "8. c #F8FD00", | |
123 | "9. c #F8FE00", | |
124 | "0. c #F8FF00", | |
125 | "q. c None", | |
126 | /* pixels */ | |
127 | "q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O O q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.", | |
128 | "q.q.q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 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 O q.q.q.q.q.q.q.q.q.q.q.q.q.", | |
129 | "q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.q.q.", | |
130 | "q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.", | |
131 | "q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.", | |
132 | "q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.", | |
133 | "q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.", | |
134 | "q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.", | |
135 | "q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.", | |
136 | "q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O O X X X X X X X X X X X X X X X X X X X X X X X q.q.q.", | |
137 | "q.q.q.X X X X X X X X X X X X X X X X X X X X @ X $ 2 w i s h h h h h h j h h h h j h h h h h h h h h h h h j h h h h h h j h h j h h j h h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h j h h h h h h j h h j h h j h h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h j h h h h h h j h h j h h j h h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h j h h h h h h j h h j h h j h h h h h h h h h h h h h h s i w 2 $ X X O X X X X X X X X X X X X X X X X X X X q.q.q.", | |
138 | "q.q.X X X X X X X X X X X X X X X X X X X X $ 7 c D D D J D J D D D D D D D D J D D D D D J D D D D J D D D D D D D D J D D D D D D D D D D D J D D J D D D D D D D D D D J D D D D D D D J D D D D J D D D D D D D D J D D D D D D D D D D D J D D J D D D J D D D D D D J D D D D D D D J D D D D J D D D D D D D D J D D D D D D D D D D D J D D J D D D D D D D D D D J D D D D D D D J D D D D J D D D D D D D D J D D D D D D D D D D D J D D J D D D J D D J D D D D D c 7 $ X X X X X X X X X X X X X X X X X X X X q.q.", | |
139 | "q.q.X X X X X X X X X X X X X X X X X X - y S D D D D D D D D D J D D D J D D D D D J D D D J D D D D J J D D D J D J D D D D D D D D D D J D J D D D J D J D J D D J D D D J D D D J D D D J D D D D J J D D D J D J D D D D D D D D D D J D J D D D J D D D D D D J D D D J D D D J D D D J D D D D J J D D D J D J D D D D D D D D D D J D J D D D J D J D J D D J D D D J D D D J D D D J D D D D J J D D D J D J D D D D D D D D D D J D J D D D J D D D D D D J D D D J D D S y - O X X X X X X X X X X X X X X X X X q.q.", | |
140 | "q.X X X X X X X X X X X X X X X O O O 7 C D J D D J D J J D J D D D D J D D D J D J D D D J D D J D D D D D D J D D D D D J D J J D J D D D D D J D D D D D D D D J D D D J D D D J D D D J D D J D D D D D D J D D D D D J D J J D J D D D D D J D D D J D J D D J D D D J D D D J D D D J D D J D D D D D D J D D D D D J D J J D J D D D D D J D D D D D D D D J D D D J D D D J D D D J D D J D D D D D D J D D D D D J D J J D J D D D D D J D D D J D J D D J D D D J D D D D D Z 6 O O O X X X X X X X X X X X X X X X q.", | |
141 | "q.X X X X X X X X X X X X X X X O $ h D D D J D J D D D D D D J J D J D J D J D D D D D D D D D D J D J J D J D D D J D J D D D D D D J D J D D D J D J D J D D D D D D D D D D D D D D D D D D D J D J J D J D D D J D J D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J J D J D D D J D J D D D D D D J D J D D D J D J D J D D D D D D D D D D D D D D D D D D D J D J J D J D D D J D J D D D D D D J D J D D D J D J D D D J D D D D D D D D J D J D D g $ O X X X X X X X X X X X X X X X q.", | |
142 | "q.X X X X X X X X X X X X X X X - m D D D J D D D D D J J D D D D D D D D D D D D J D J D J D J D D D D D D D D D J D D D D D J J D D D D D J D D D D D D D J D D J D J D J D J D J D J D J D J D D D D D D D D D J D D D D D J J D D D D D J D D D D D J D D D D J D J D J D J D J D J D J D J D D D D D D D D D J D D D D D J J D D D D D J D D D D D D D J D D J D J D J D J D J D J D J D J D D D D D D D D D J D D D D D J J D D D D D J D D D D D J D D D D J D J D J D J D D D D D D m , X X X X X X X X X X X X X X X q.", | |
143 | "O X X X X X X X X X X X X X O , V D D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D D D V , X X X X X X X X X X X X X X X ", | |
144 | "X X X X X X X X X X X X X X $ m D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D v $ X X X X X X X X X X X X X X ", | |
145 | "X X X X X X X X X X X X X O s D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J J D D s X X X X X X X X X X X X X X ", | |
146 | "X X X X X X X X X X X X X 6 D D D D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D D D D D 4 X X X X X X X X X X X X X ", | |
147 | "X X X X X X X X X X X X - C D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D D D D D J J D D D J D C - X X X X X X X X X X X X ", | |
148 | "X X X X X X X X X X X X y J D J D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D J D J D D D D D D J D D D t X X X X X X X X X X X X ", | |
149 | "X X X X X X X X X X O - S D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J J D J D J D J S $ X X X X X X X X X X X ", | |
150 | "X X X X X X X X X X X 9 D D D J D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D 6 O X X X X X X X X X X ", | |
151 | "X X X X X X X X X X X c D D J D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J J D D D D D J D J D J D z O X X X X X X X X X X ", | |
152 | "X X X X X X X X X X $ D D J D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D D D D J D J D D D D D D D $ X X X X X X X X X X ", | |
153 | "X X X X X X X X X X 2 D D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D D J D J J D J D D D D D D D J D D 2 X X X X X X X X X X ", | |
154 | "X X X X X X X X X O w D D J D J D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D J D D D D D D D D D D J D J D J D D D 0 X X X X X X X X X X ", | |
155 | "X X X X X X X X X X i D J D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J J D D D J D J D D D D D D i O X X X X X X X X X ", | |
156 | "X X X X X X X X X X g D D D D J D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D D D D J D D D D D J D J D s O X X X X X X X X X ", | |
157 | "X X X X X X X X X X k D J D J D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J J D J D D D J D J D D D D k X X X X X X X X X X ", | |
158 | "X X X X X X X X X X k D D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D D D D D D D D D D J D D D D D J D k X X X X X X X X X X ", | |
159 | "X X X X X X X X X X l D D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D J D D D D D J D D D D D J D D D D D J D l X X X X X X X X X X ", | |
160 | "X X X X X X X X X o k D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ", | |
161 | "X X X X X X X X X X k D D J D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ", | |
162 | "X X X X X X X X X X l D D D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D J D J D D D D D J D D D J D J D D D D D D k X X X X X X X X X X ", | |
163 | "X X X X X X X X X X k D D D D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D J D D D J D D D D D J D J D J D D D l X X X X X X X X X X ", | |
164 | "X X X X X X X X X X k D J D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D J D D D J D J D D D D D D D J D D k X X X X X X X X X X ", | |
165 | "X X X X X X X X X X k D D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D J D D D J D J D D D J D J D D D D D D D k o X X X X X X X X X ", | |
166 | "X X X X X X X X X X l D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D J D D D D D J D D D D D J D J D J D D l X X X X X X X X X X ", | |
167 | "X X X X X X X X X X k D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D J D D D D D D D J D D D D J D J D D k X X X X X X X X X X ", | |
168 | "X X X X X X X X X X k D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D J D D D J D J D J D D D J D J D D D D D D k X X X X X X X X X X ", | |
169 | "X X X X X X X X X X k J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D J D J D D D J D J D J D D D J D D J D D l X X X X X X X X X X ", | |
170 | "X X X X X X X X X X k D J D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D D J D D D D D D D J D D D D J D D D k X X X X X X X X X X ", | |
171 | "X X X X X X X X X X k D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D J D D D J D D D J D D D J D D D D D D J k X X X X X X X X X X ", | |
172 | "X X X X X X X X X X k D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D J D D D J D D D J D D D J D D J D J D k X X X X X X X X X X ", | |
173 | "X X X X X X X X X X k J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ", | |
174 | "X X X X X X X X X X k D D D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D J D J D J D J D J D J D J D J D D D D J D k X X X X X X X X X X ", | |
175 | "X X X X X X X X X X k D D D D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D J D J D D D J D J D D J D J D J D D J D J D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ", | |
176 | "X X X X X X X X X X l D D J D J J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D J D D D D D J D D D D D D D D D D D J D D D D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ", | |
177 | "X X X X X X X X X X k D J D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D D J D J D D D J D D J D D D D J D D D J D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ", | |
178 | "X X X X X X X X X X k D D D D J J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D J D J D D D D D J D D D D J &.=.J D D D J D D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ", | |
179 | "X X X X X X X X X X k D D D D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D J D D D D D J D D D J T 3.0.0.3.T D J D J D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ", | |
180 | "X X X X X X X X X O k J D J D J J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D D J D D D J D J D D D D T 3.0.0.0.0.3.J D D D D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ", | |
181 | "X X X X X X X X X X k D J D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D D J D D D J D J J 1.0.0.0.0.0.0.1.J D J D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ", | |
182 | "X X X X X X X X X X k D D D D J J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D D J D J D D D J D D D $.0.0.0.0.0.0.0.0.&.J D D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ", | |
183 | "X X X X X X X X X X k D D D D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D D J D J D D D D D / 0.0.0.0.0.0.0.0.0.0./ D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ", | |
184 | "X X X X X X X X X X l D D J D J J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D J D D D D D J D J 0.0.0.0.0.0.0.0.0.0.0.3.T D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ", | |
185 | "X X X X X X X X X X k D J D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D D D D J D J D D =.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ", | |
186 | "X X X X X X X X X X k D D D D J J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D J D J D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0./ J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ", | |
187 | "X X X X X X X X X X k D D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D J D J D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ", | |
188 | "X X X X X X X X X O k J D J D J J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D J D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ", | |
189 | "X X X X X X X X X X k D J D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ", | |
190 | "X X X X X X X X X X k D D D D J J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D J D D D T 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ", | |
191 | "X X X X X X X X X X k D D J D D D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D D J X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J k X X X X X X X X X X ", | |
192 | "X X X X X X X X X X k D D D J D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D D J D J D J D J D J D J D J D J D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D k X X X X X X X X X X ", | |
193 | "X X X X X X X X X X k J D D D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D J D D D D J D D D J D D D J D D D J J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D k X X X X X X X X X X ", | |
194 | "X X X X X X X X X X k D J D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D J D J ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D D D J D D D J D D D J D D D J D D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D k X X X X X X X X X X ", | |
195 | "X X X X X X X X X X k D J D J D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D D D J D D D J D J D J D D D J D J J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D k X X X X X X X X X X ", | |
196 | "X X X X X X X X X X k D D D D D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D D D J D D D D D D D J D D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D k X X X X X X X X X X ", | |
197 | "X X X X X X X X X X l D D D J D D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D J ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D D J D D D D D D D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D J k O X X X X X X X X X ", | |
198 | "X X X X X X X X X X k D D J D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.D J D J D D D J D J D J D D D J D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D k X X X X X X X X X X ", | |
199 | "X X X X X X X X X X k D J D D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D D ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D J D D D D D D J D J D D D J J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D J D D k X X X X X X X X X X ", | |
200 | "X X X X X X X X X X k D D D D J D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D D J D J D D D D J D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D D D k X X X X X X X X X X ", | |
201 | "X X X X X X X X X X k D J D J D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D D J D D D D J D D D J D J J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D l X X X X X X X X X X ", | |
202 | "X X X X X X X X X X k J D D D D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D J D D J D D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D D D k X X X X X X X X X X ", | |
203 | "X X X X X X X X X X k D D D J D D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D D D D D D J D J D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J k X X X X X X X X X X ", | |
204 | "X X X X X X X X X X l D D J D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D J D J D D D D D J D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D J D J D D D D J D J D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D k X X X X X X X X X X ", | |
205 | "X X X X X X X X X X k D D D D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J J D D D D J D D D D D J J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ", | |
206 | "X X X X X X X X X X k D D J D J D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D D J D D J D J D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D k X X X X X X X X X X ", | |
207 | "X X X X X X X X X X l D D J D J D D D J D D D D D J D D D D D J D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D J D D D D D J D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D J D J D D D J D J J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ", | |
208 | "X X X X X X X X X o k D D D D D J D D D J D J D D D J D J D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D J D J D J D J D J D J D J D J D D J D D D D D J D D D D D J D D D D J D J D D D J D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D D D J D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ", | |
209 | "X X X X X X X X X X k D D J D D D J D J D D D J D D D D D J D J D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J J D D D J D D D J D D D J D D D D D D D D J D D D J D J D D D D J D J D D D D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D J D D D D D J D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ", | |
210 | "X X X X X X X X X X l D D D J D D D D D J D D D J D J D D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D D D D J D D D J D D D J D D D J J D J D D D J D D D D D J D J D D D D D D J D J J J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D J D J D D D J D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ", | |
211 | "X X X X X X X X X X k D D D D D D J D D D J D D D J D J D D D J D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J J D J D D D J D J D J D D D J D D D D J D D D J D D D D D J D D J D D D J D J D D $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D D D J D D D J J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ", | |
212 | "X X X X X X X X X X k D J D J D D D J D D D J D D D D D J D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D D D D J D D D D D D D J D D J D D D J D D D J D J D D D J D D D D J D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! J D D D J D D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ", | |
213 | "X X X X X X X X X X k D D D D J D D D D D D D D D J D D D J D J D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D J D D D D D D D J D D D D D D J D J D J D J D D D J D D D D J D J D D D D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D D J D J D J J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ", | |
214 | "X X X X X X X X X X l D J D D D J D J D J D J D D D J D D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D J D D D J D J D J D D D J D J D D D D D D D D J D D D J D J D D D D D D J D o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.o.D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ", | |
215 | "X X X X X X X X X X k D D J D D D J D J D J D J D J D D D D D J D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J J D D D J D J D D D J D J D D D D D D D D D D D D D D J D J D D D J D J D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D J D J D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ", | |
216 | "X X X X X X X X X X k D D D J D D D D D D D D D D D J D J D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D D D D J D D D D D J D D D D D J D J D J D J D J J D D D D D J D D D D D J J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.T D D D D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ", | |
217 | "X X X X X X X X X X k J D D D D D J D D D J D D D D D D D J D J D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J J D J D D D J D D D D D J D J D J D D D J D D D D J D J D D D D D J D D J 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.J D J D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ", | |
218 | "X X X X X X X X X X k D J D J D D D J D D D J D J D J D D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D D J D J D D D ! &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&./ D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ", | |
219 | "X X X X X X X X X X k D D J D J D D D J D D D D D J D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D T ` &.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=...! D D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ", | |
220 | "X X X X X X X X X X k D D D D D J D D D J D J D D D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D J D J D D D D D J D D D J D J D D D D D D D D J D ! ` =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.=.` T J D J D J D D D D D D J D D D J D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ", | |
221 | "X X X X X X X X X X k J D J D D D J D J D D D J D J D D D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J J D D D D D J D D D D D J D D D D D J D D J ! { =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.o./ J D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ", | |
222 | "X X X X X X X X X X k D D D J D D D D D J D D D D D J D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D J D J D D D J D J D D D D D T ` $.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.&...! D D J D J D D D J D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ", | |
223 | "X X X X X X X X X X k D D D D D D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J J D J D D D D D D J D D J ! ..=.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.=...! J D D D D D D D D J D D D D J D J D J D J D D D D D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J k X X X X X X X X X X ", | |
224 | "X X X X X X X X X X l D D J D J J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D J D J / o.=.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.X.` T D D D D D D D D D D D D D D D D J D J D J D J D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D k X X X X X X X X X X ", | |
225 | "X X X X X X X X X X k D J D D D D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D D D D J D J ` &.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.&.` J J D D D D J D D D J D D D D D J D D D J D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D D k X X X X X X X X X X ", | |
226 | "X X X X X X X X X X k D D D D J J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D D D J ! X.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.&./ J D D J D D D J D J D D D J D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D k X X X X X X X X X X ", | |
227 | "X X X X X X X X X X k D D D D D D D D D D J D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D T ..=.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1...J D D D D D D J D D D J D J D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D k X X X X X X X X X X ", | |
228 | "X X X X X X X X X O k J D J D J J D J D D D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J ` 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1...J D D D D J D D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D k X X X X X X X X X X ", | |
229 | "X X X X X X X X X X k D J D D D D D D J D J D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D T &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.T D D D D D J D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D J k O X X X X X X X X X ", | |
230 | "X X X X X X X X X X k D D D D J J D D D D D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D J D D D J D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D k X X X X X X X X X X ", | |
231 | "X X X X X X X X X X k D D D D D D D D D D J D D D J D J D J D J D J D J D J D J D J D D D D D J J D D D D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D D J D D D J D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D D k X X X X X X X X X X ", | |
232 | "X X X X X X X X X X l D D J D J J D J D D D J D D D D D D D D D D D D D D D D D D D J D J D D D D D D J D J D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D D D J D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D k X X X X X X X X X X ", | |
233 | "X X X X X X X X X X k D J D D D D D D J D D D D D J D D D J D D D J D D D J D D D D D D D J D J J D J D D D D X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D J D D J D J D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D l X X X X X X X X X X ", | |
234 | "X X X X X X X X X X k D D D D J J D D D J D J D D D J D D D J D D D J D D D J D J D J D D D D D D D D D D J D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D k X X X X X X X X X X ", | |
235 | "X X X X X X X X X X k D D D D D D D D D D J D J D D D J D D D D D D D J D D D D D J D J D D D J J D D D J D J D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ J D D D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J k X X X X X X X X X X ", | |
236 | "X X X X X X X X X O k J D J D J J D J D D D D D J D D D J D J D J D D D J D J D D D D D J D D D D D D J D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D k X X X X X X X X X X ", | |
237 | "X X X X X X X X X X k D J D D D D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J J D J D D D J D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ", | |
238 | "X X X X X X X X X X k D D D D J J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D D D D D D J D D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D J D D D D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D k X X X X X X X X X X ", | |
239 | "X X X X X X X X X X k D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D J X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D D J D D D J D J D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ", | |
240 | "X X X X X X X X X X k D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D D J D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.J D D D J D D D D D J D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ", | |
241 | "X X X X X X X X X X k J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D D J 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D D J D J D J D D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ", | |
242 | "X X X X X X X X X X k D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D D J D J D T 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D J D D D D D D D J D J D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ", | |
243 | "X X X X X X X X X X k D J D J D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D J D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D J D D D D D D D J D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ", | |
244 | "X X X X X X X X X X k D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D D J D D D D D ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D J D D D J D J D J D D D J D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ", | |
245 | "X X X X X X X X X X l D D D J D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D D J D D D o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D D D D D D D D D D D J D D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ", | |
246 | "X X X X X X X X X X k D D J D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D D J D J D D J D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.J D D J D J D J D J D D D J D J D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ", | |
247 | "X X X X X X X X X X k D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D D D D D D D D D D D D J D J D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ", | |
248 | "X X X X X X X X X X k D D D D J J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.T D J J D J D J D J D J D D D D D J D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ", | |
249 | "X X X X X X X X X X k D J D J D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D D J D D D J D J D J D D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ", | |
250 | "X X X X X X X X X X k J D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D J D D D J D D D D D D D J D J D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ", | |
251 | "X X X X X X X X X X k D D D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` J D D D D D J D D D J D J D D D D D J D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ", | |
252 | "X X X X X X X X X X l D D J D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D J D J D D D J D D D D D J D J D D D J D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ", | |
253 | "X X X X X X X X X X k D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D D J D D D D D J D D D D D J D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ", | |
254 | "X X X X X X X X X X k D D J D J J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D J =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D J D J D D D J D J D D D J D J D D D J D J D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ", | |
255 | "X X X X X X X X X X l D D J D J J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D J D J D J D J J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J k X X X X X X X X X X ", | |
256 | "X X X X X X X X X o k D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.T D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D k X X X X X X X X X X ", | |
257 | "X X X X X X X X X X k D D J D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D J D D D J D D D J ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D k X X X X X X X X X X ", | |
258 | "X X X X X X X X X X l D D D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D J D D D J D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D k X X X X X X X X X X ", | |
259 | "X X X X X X X X X X k D D D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D J D D D D D D D J ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J k X X X X X X X X X X ", | |
260 | "X X X X X X X X X X k D J D J D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J J D D D J D J D J D D D J X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.{ J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D k X X X X X X X X X X ", | |
261 | "X X X X X X X X X X k D D D D J J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D J D J D D D J D J D J D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D D k X X X X X X X X X X ", | |
262 | "X X X X X X X X X X l D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D J D D D D D D D D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D l X X X X X X X X X X ", | |
263 | "X X X X X X X X X X k D D J D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D J D D D D D J D D J D J D D T 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D J D J D D k X X X X X X X X X X ", | |
264 | "X X X X X X X X X X k D D D J D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D J D J D D D D J D D D D D J ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D D D D k X X X X X X X X X X ", | |
265 | "X X X X X X X X X X k J D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D D J D J D D D D J D J D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D J D D l X X X X X X X X X X ", | |
266 | "X X X X X X X X X X k D J D J D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J J D J D D D D D D J D J D D D D D D o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D J D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D J D D D k X X X X X X X X X X ", | |
267 | "X X X X X X X X X X k D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D J D J D D D J D D J D D D D D D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D D D D D J k X X X X X X X X X X ", | |
268 | "X X X X X X X X X X k D D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D J D D D D J D D D J D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! J D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D J D J D k X X X X X X X X X X ", | |
269 | "X X X X X X X X X X l D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D J D D D J D J D D D D J D D D J D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D k X X X X X X X X X X ", | |
270 | "X X X X X X X X X X k D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D J D D D D D D J D J D D D J D D D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D k X X X X X X X X X X ", | |
271 | "X X X X X X X X X X k D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D J D D D D D J D D D D D J J D D D $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D J D D J D J D J D J D J D J D J D J J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ", | |
272 | "X X X X X X X X X X l D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J J D D D J D J D D D J D J D D D D D D J $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D J D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ", | |
273 | "X X X X X X X X X X k D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D J D J D D D J D D D D D J D J J D J D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D D D D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ", | |
274 | "X X X X X X X X X X k D D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D J D D D J D J D D D D D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D J D J D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ", | |
275 | "X X X X X X X X X X k D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D J D D D J D D D J D J D D D J J D D D 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D D D J D D D D D D D J D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ", | |
276 | "X X X X X X X X X O k J D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D J D D D J D D D D D J D D D D D D J 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D J J D D D J D J D J D D D J D J D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ", | |
277 | "X X X X X X X X X X k D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D J D D D J D J J D D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.J D J D D J D J D D D J D J D J D D D J J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ", | |
278 | "X X X X X X X X X X k D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J J D J D J D J D D D J D D D D D D D D D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D D D D D D D D J D D D D D D D J D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ", | |
279 | "X X X X X X X X X X k D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D J D J D J D J D J D D D D D J D D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D D D D J D D D D D J D D D D D J D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ", | |
280 | "X X X X X X X X X X l D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D J D J D D D J D J T 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D J D D D J D J D D D J D J D D D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ", | |
281 | "X X X X X X X X X X k D J D D D J D J D D D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D J D D D J D D D D D D D J D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D J D D D D D J D J D D D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ", | |
282 | "X X X X X X X X X X k D D D D J D D D D D J D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D J D D D J D J D J D D D D D J D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D D J D J D D D D D J D D D J D J D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ", | |
283 | "X X X X X X X X X X k D D D D D J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D J D D D D D J D J D D D J D D J ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D D J D J D J D D D J D D D D D J D J J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ", | |
284 | "X X X X X X X X X O k J D J D J D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J J D D D J D J D D D D D J D D D D J D X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D D D D D D D J D D D J D J D D D D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ", | |
285 | "X X X X X X X X X X k D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D J D J D D D J D J D D D J D J D D D $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.D D J D J D D D J D J D D D J D J D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ", | |
286 | "X X X X X X X X X X k D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D D J D D D D D J D D D D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D J D D D D D J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ", | |
287 | "X X X X X X X X X X k D D J D D D D D J D D D D D J D D D D D J J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D J D D D D D J D D D D D J D D D D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.D D D D D D D D J D D D D D J D D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J k X X X X X X X X X X ", | |
288 | "X X X X X X X X X X k D D D J D J D D D J D J D D D J D J D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D J D J D D D J D J D D D J D J D D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.D D J J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D k X X X X X X X X X X ", | |
289 | "X X X X X X X X X X k J D D D D D J D J D D D J D D D D D J D J J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D D D D J D J D D D J D D D D D D D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D D D D D D J D D D D D J D J D D D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D D k X X X X X X X X X X ", | |
290 | "X X X X X X X X X X k D J D J D D D D D J D D D J D J D D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J J D J D D D D D J D D D J D J D J D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D J J D D D J D J D D D D D J D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D k X X X X X X X X X X ", | |
291 | "X X X X X X X X X X k D J D J D D J D D D J D D D J D J D D D J J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D J D J D D D J D D D D D J D J D D T 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D D D D D J D J D J D D D J D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D k X X X X X X X X X X ", | |
292 | "X X X X X X X X X X k D D D D D D D J D D D J D D D D D J D D D D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D J D D D J D J D D D D D J D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D J D J D D D D D D D J D D D J D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D k X X X X X X X X X X ", | |
293 | "X X X X X X X X X X l D D D J D D D D D D D D D D J D D D J D J J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D J D D D J D J D D D J D J D D D J ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D D J D J D D D D D D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D J k O X X X X X X X X X ", | |
294 | "X X X X X X X X X X k D D J D D J D J D J D J D D D J D D D D D D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D D J D D D D D J D D D D D J D D D ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...D J J D D D D D J D J D J D J D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D k X X X X X X X X X X ", | |
295 | "X X X X X X X X X X k D J D D D D J D J D J D J D J D D D D D J J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D D D J D D D D D D D J D D D D D D { 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.D D D D D D D J D D D J D J D J D J D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D D k X X X X X X X X X X ", | |
296 | "X X X X X X X X X X k D D D D J D D D D D D D D D D J D J D D D D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J J D D D J D J D J D D D J D J D D D &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.J D J D J D D D J D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D k X X X X X X X X X X ", | |
297 | "X X X X X X X X X X k D J D J D D J D D D J D D D D D D D J D J J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D J D J D D D J D J D J D D D J D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.D D D D D J D D D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D l X X X X X X X X X X ", | |
298 | "X X X X X X X X X X k J D D D D D D J D D D J D J D J D D D D D D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D D J D D D D D D D J D D D D D =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.J D J D D D J D J D D D J D D D J D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D k X X X X X X X X X X ", | |
299 | "X X X X X X X X X X k D D D J D D D D J D D D D D J D J D D D J J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D J D D D J D D D J D D D J D D J D 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.D D D D D D D J D J D D D J D D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J k X X X X X X X X X X ", | |
300 | "X X X X X X X X X X l D D J D D J D D D J D J D D D D D J D D D D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D D J D D D J D D D J D D D J D D D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.D D J D J D D D D D J D D D J D J D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D k X X X X X X X X X X ", | |
301 | "X X X X X X X X X X k D D D D D D J D J D D D J D J D D D J D J J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&./ T T ` &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.D J D D D J D J D D D J D J D D D J D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ", | |
302 | "X X X X X X X X X X k D D J D J D D D D J D D D D D J D D D D D D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J J D J D J D J D J D J D J D J D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.` J D D D D D D D ` =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D J D D D D D J D D D D D J D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D k X X X X X X X X X X ", | |
303 | "X X X X X X X X X X l D D J D J D D D J D D D D D J D D D D D J J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D J 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.$.! D J D J D J D D J D D D T X.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.J D D J D D D D D J D D D D D J D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ", | |
304 | "X X X X X X X X X o k D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.` J D D D D D D D D D J D D D J D D D ` 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D J D J D D D J D J D D D J D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ", | |
305 | "X X X X X X X X X X k D D J D D D J D J D D D J D D D D D J D J J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.! D D D D D D D D J D D D D D D D J D J J D D ! &.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.T D D D D D D J D J D D D J D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ", | |
306 | "X X X X X X X X X X l D D D J D D D D D J D D D J D J D D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.X.T D D D D J D D J D D D J D D J D J D D D D D D D J D J ..3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D J D J D D D D D J D D D J D J D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ", | |
307 | "X X X X X X X X X X k D D D D D D J D D D J D D D J D J D D D J J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3...D D D D D D J D J D J D D D D D D J D J D D D J D D J D D D D J / 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D J D J D D D J D D D D D J D J D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ", | |
308 | "X X X X X X X X X X k D J D J D D D J D D D J D D D D D J D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D / 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.=.! D J D D D J D J D D D D D D J D J D D D D D J D D D D J D D D J D D D D ! =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D D J D D D J D J D D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ", | |
309 | "X X X X X X X X X X k D D D D J D D D D D D D D D J D D D J D J J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.{ T D D J D J D D D D D D D D D J D D D D J D J D D D J D J D D D D J D D D D D D D J o.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.` D D J D D D J D J D D D J D J D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ", | |
310 | "X X X X X X X X X X l D J D D D J D J D J D J D D D J D D D D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3.` J D D D D D D D D D J D J D J D J D D J D D D D D J D D D D D D J D J D D J D J D D J D D J ` 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D J D D D D D J D D D D D J D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ", | |
311 | "X X X X X X X X X X k D D J D D D J D J D J D J D J D D D D D J J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D ` 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.&.! D J D J D J D J D D D J D D D D D D D D D D J D D D D D J D D D D D D D J D D D D D J D D D J D J D ! $.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D D D D J D D D D D D D J D D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ", | |
312 | "X X X X X X X X X X k D D D J D D D D D D D D D D D J D J D D D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.3...J D J D D D D D D D D D D J D D D J D J J D J D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D D J ..0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0./ D J D D D J D J D J D D D J D J D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ", | |
313 | "X X X X X X X X X X k J D D D D D J D D D J D D D D D D D J D J J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D ! 0.0.0.0.0.0.0.0.0.0.0.0.0.0.=./ J D D D D D D D J D D D J D D D D D J D D D D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D D D D D D D J / =.0.0.0.0.0.0.0.0.0.0.0.0.0.0.! D D J D J D D D J D J D J D D D J D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ", | |
314 | "X X X X X X X X X X k D J D J D D D J D D D J D J D J D D D D D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D T 0.0.0.0.0.0.0.0.0.0.0.3.` J J D D D D D J D D J D D D J D D D J D J D D D J J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D J D D J D D D D D J J ` 1.0.0.0.0.0.0.0.0.0.0.0.J D D D D D J D D D D D D D J D D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ", | |
315 | "X X X X X X X X X X k D D J D J D D D J D D D D D J D J D D D J J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D 0.0.0.0.0.0.0.0.0.$.T D D J J D D D J D J D D D D D J D D D J D J D D D D D D D D D D J D J D J D D D J D D D J D D D J D D D D D J D D D J J D D D J D D D D D D ! X.0.0.0.0.0.0.0.0.3.J D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ", | |
316 | "X X X X X X X X X X k D D D D D J D D D J D J D D D D D J D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D X.0.0.0.0.1...! D D D D D D D D D J D D D D D J D J D D D J D D D D D J D J J D J D D D D D D D J D D D J D D D J D D D J D J D D D J D D D D D D J D D D J J D D D D D ! X.1.0.0.0.0.X.D D D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ", | |
317 | "X X X X X X X X X X k J D J D D D J D J D D D J D J D D D J D J J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D ` ` ! J D D D D D D J D J J D J D D D J D J D D D J D J D D D J D J D D D D D D J D J D D D D D D D D D D D D D D D D D D D J D J D J D J J D J D J D J D D J D J D D D D D J ! ` / J D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ", | |
318 | "X X X X X X X X X X k D D D J D D D D D J D D D D D J D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D J D D J D D J D D D D D D D D D D J D D D D D J D D D D D J D D D D D J J D D D D D J D J D J D J D J D J D J D J D J D D D D D D D D D D D D D D D D D D D D D D J D J D D D D D D D J J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ", | |
319 | "X X X X X X X X X X k D D D D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J k X X X X X X X X X X ", | |
320 | "X X X X X X X X X X l D D J D J J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D k X X X X X X X X X X ", | |
321 | "X X X X X X X X X X k D J D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D k X X X X X X X X X X ", | |
322 | "X X X X X X X X X X k D D D D J J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D k X X X X X X X X X X ", | |
323 | "X X X X X X X X X X k D D D D D D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D k X X X X X X X X X X ", | |
324 | "X X X X X X X X X O k J D J D J J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D k X X X X X X X X X X ", | |
325 | "X X X X X X X X X X k D J D D D D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D J k O X X X X X X X X X ", | |
326 | "X X X X X X X X X X k D D D D J J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D k X X X X X X X X X X ", | |
327 | "X X X X X X X X X X k D D D D D D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D J D J D D k X X X X X X X X X X ", | |
328 | "X X X X X X X X X X l D D J D J J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D D D D D k X X X X X X X X X X ", | |
329 | "X X X X X X X X X X k D J D D D D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D J D D l X X X X X X X X X X ", | |
330 | "X X X X X X X X X X k D D D D J J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D D D k X X X X X X X X X X ", | |
331 | "X X X X X X X X X X k D D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D D D D D J k X X X X X X X X X X ", | |
332 | "X X X X X X X X X O k J D J D J J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D J D J D k X X X X X X X X X X ", | |
333 | "X X X X X X X X X X k D J D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D J D D D D k X X X X X X X X X X ", | |
334 | "X X X X X X X X X X k D D D D J J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D D D J D k X X X X X X X X X X ", | |
335 | "X X X X X X X X X X k D D J D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J k X X X X X X X X X X ", | |
336 | "X X X X X X X X X X k D D D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D k X X X X X X X X X X ", | |
337 | "X X X X X X X X X X k J D D D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D D k X X X X X X X X X X ", | |
338 | "X X X X X X X X X X k D J D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D k X X X X X X X X X X ", | |
339 | "X X X X X X X X X X k D J D J D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D k X X X X X X X X X X ", | |
340 | "X X X X X X X X X X k D D D D D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D k X X X X X X X X X X ", | |
341 | "X X X X X X X X X X l D D D J D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D J k O X X X X X X X X X ", | |
342 | "X X X X X X X X X X k D D J D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D k X X X X X X X X X X ", | |
343 | "X X X X X X X X X X k D J D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D D k X X X X X X X X X X ", | |
344 | "X X X X X X X X X X k D D D D J J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D k X X X X X X X X X X ", | |
345 | "X X X X X X X X X X k D J D J D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D l X X X X X X X X X X ", | |
346 | "X X X X X X X X X X k J D D D D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D k X X X X X X X X X X ", | |
347 | "X X X X X X X X X X k D D D J D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J k X X X X X X X X X X ", | |
348 | "X X X X X X X X X X l D D J D D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D k X X X X X X X X X X ", | |
349 | "X X X X X X X X X X k D D D D D D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D D k X X X X X X X X X X ", | |
350 | "X X X X X X X X X X k D D J D J J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D k X X X X X X X X X X ", | |
351 | "X X X X X X X X X X k D D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D J D D J D D D D D D D D D D J D D D D D J D l o X X X X X X X X X ", | |
352 | "X X X X X X X X X X k J D J D J D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D J D D D J D J J D J D D D J D J D D D D k X X X X X X X X X X ", | |
353 | "X X X X X X X X X X s D J D D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D D D D J D D D D D D J D D D D D J D J D s X X X X X X X X X X ", | |
354 | "X X X X X X X X X X i J D D D J D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D D J D D J D J D D D J J D D D J D J D D D D D D i X X X X X X X X X X ", | |
355 | "X X X X X X X X X X w D D D J D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D J D D D J D D D J D J D D D J D D D D D J D J D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D J D D D D D D D D D D J D J D J D D D w X X X X X X X X X X ", | |
356 | "X X X X X X X X X X 2 D D J D D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D D D J D D D J D D D D D J D D D J D J D D D D D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D D D D J D J J D J D D D D D D D J D D 2 X X X X X X X X X X ", | |
357 | "X X X X X X X X X X $ D D D D D D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D D D D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D J D D D J D J D J D D D J D D J D J D D D D D D J D J D D D D D D D $ O X X X X X X X X X ", | |
358 | "X X X X X X X X X X O c D J D J D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D J D J D J D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D D D J D D D D D D D J D D D D J D D D D D J J D D D D D J D J D J D z X X X X X X X X X X X ", | |
359 | "X X X X X X X X X X X 7 D D D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D J D D D D D D D J D D D D D J D J D J D J D J D D D D D J D D D D D J D D D J D J D J D J D D D J D D D D D D D J D D D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D D D D D J D D D D D D D D D D D J D D D 6 X X X X X X X X X X X ", | |
360 | "X X X X X X X X X X X $ S D D J D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D J D D D J D J D J D D D J D J D D D D D D D D D D D J D J D D D J D J D D D J D D D D D D D D D J D D D J D J D J D D D J D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D J D D J D J D D D J D J D J J D J D D D D Z $ X X X X X X X X X X X ", | |
361 | "X X X X X X X X X X X X y D J D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D D J D J D D D J D J D J D D D J D J D D D J D D D D D D D J D J D D D J D D D D D J D D D J D D D J D J D D D J D J D J D D D J D D D D D J D J D D D J D D D D D D D D D J D J D D D J D D D D J D D D J D J D J D D D D D D J D D D t X X X X X X X X X X X X ", | |
362 | "X X X X X X X X X X X X - C D D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D D J D D D D D D D J D D D D D J D D D J D J D J D D D D D J D D D J D J D D D J D D D J D D D D D J D D D D D D D J D D D J D J D D D D D J D D D J D J D J D J D D D D D J D D D J D J D D D D J D D D D D D D J J D D D D J C $ X X X X X X X X X X X X ", | |
363 | "X X X X X X X X X X X X X 6 D D D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D J D D D J D D D J D D D J D D D D D J D D D D D J D J D D D J D D D D D J D J D D D J D D D D D J D D D J D D D J D D D J D D D J D J D D D J D D D D D J D J D J D J D D D J D D D D D J D J D D J D D D J D D D J D D D D D D J 4 X X X X X X X X X X X X X ", | |
364 | "X X X X X X X X X X X X X X p D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D D J D D D J D D D J D D D J D J D D D J D J D D D D D J D D D J D J D D D D D J D D D J D J D D D J D D D J D D D J D D D J D D D D D J D D D J D J D D D D D D D D D J D D D J D J D D D D D D J D D D J D D D J D D D J D D D g X X X X X X X X X X X X X X ", | |
365 | "X X X X X X X X X X X X X X $ m D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D D J D J D D D J D J D D D J D J D D D J D J D D D J D J D D D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D J D D D J D J D D D J D J D D D D D D D D D D D D D D D D D D v $ X X X X X X X X X X X X X o ", | |
366 | "O X X X X X X X X X X X X X X - V D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D J D J D J D J D J D J D J D J D D D D D J D D D D D J D D D D D J D D D D D J D D D D D J D D D J D J D J D J D J D J D J D J D D D J D D D D D J D D D D D J D D D J D D D D D J D D D D D J D D J D J D J D J D J D J D J D V ; X X X X X X X X X X X X X X X ", | |
367 | "q.X X X X X X X X X X X X X X X , v D J D D D J D J D D D D D D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J J D D D D D J D D D D D D D D D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J J D D D D D J D D D D D D D D D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J J D D D D D J D D D D D D D D D J D J D J D J D J D J D J D J D D D D J D D D D D J D D D D D J J D D D D D J D D D D D D D D D D D D D D D D D D D D D D D m < X X X X X X X X X X X X X X X q.", | |
368 | "q.X X X X X X X X X X X X X X X X $ s D J D D D D D J D J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J J D J D D D D D D D D D D D D D D D D D J D D D J D J D D D J D J D D D D D D J D J D D D J D J J D J D J D J D J D J D J D J D D s # X X X X X X X X X X X X X X X X q.", | |
369 | "q.O X X X X X X X X X X X X X X X X O 4 C D D J D D D D D D D J D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J J D J D D D D D J D D D D D D J D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J J D J D D D D D J D D D D D D J D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J J D J D D D D D J D D D D D D J D D J D D D J D D D J D D D J D D J D J D D D J D D D D D J D J J D J D D D D D J D D D D D D J D D D J D D D J D D D C 4 O X X X X X X X X X X X X X X X X X q.", | |
370 | "q.q.X X X X X X X X X X X X X X X X X X $ y S D J D J D J D D D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D D J D J D D D J J D D D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D D J D J D D D J J D D D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D D J D J D D D J J D D D D J D D D J D D D J D D D J D D D D D D J D D D J D J D D D D D D D D D D J D J D D D J J D D D J D D D J D D D D S y $ X X X X X X X X X X X X X X X X X X q.q.", | |
371 | "q.q.X X X X X X X X X X X X X X X X X X X X $ 7 z D D D D D D D D D J D D D D D D D J D D D D D D J D D D J D D J D D D D D D D D D D D J D D D D D D D D J D D D D J D D D D D D D J D D D D D D J D D D J D D J D D D D D D D D D D D J D D D D D D D D J D D D D J D D D D D D D J D D D D D D J D D D J D D J D D D D D D D D D D D D D D D D D D D D J D D D D J D D D J D D D J D D D D D D J D D D J D D J D D D D D D D D D D D D D D D D D D D D J D D D D D J D D D z 6 $ X X X X X X X X X X X X X X X X X X X X q.q.", | |
372 | "q.q.q.X X X X X X X X X X X X X X X X X X X X X X $ 2 0 i s h h h h h h h h j h h h h h h h j h h h h h h h h h h h h h j h h j h h j h h h h h h j h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h h j h h j h h j h h h h h h j h h h h h h h h h h h h j h h h h h h h j h h h h h h h h h h h h h j h h j h h j h h h j h h j h h h h h h h h h h h h h h h h h h h h j h h h h h h h h h h h h h j h h j h h j h j h h h h j h h h h h h h h s i 0 2 $ X O X X X X X X X X X X X X X X X X X X X X q.q.q.", | |
373 | "q.q.q.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 O X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X O 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 O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.", | |
374 | "q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.", | |
375 | "q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.", | |
376 | "q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.", | |
377 | "q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.", | |
378 | "q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.", | |
379 | "q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.", | |
380 | "q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.q.q.", | |
381 | "q.q.q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.q.q.q.q.", | |
382 | "q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q." | |
383 | }; |
Binary diff not shown
0 | /* XPM */ | |
1 | static char *blockattack32[] = { | |
2 | /* columns rows colors chars-per-pixel */ | |
3 | "32 32 46 1 ", | |
4 | " c #644600", | |
5 | ". c #654600", | |
6 | "X c #906C00", | |
7 | "o c #916D00", | |
8 | "O c #C99D00", | |
9 | "+ c #C99E00", | |
10 | "@ c #D4A700", | |
11 | "# c #D6A900", | |
12 | "$ c #FECC00", | |
13 | "% c #FFCD00", | |
14 | "& c #FFCE00", | |
15 | "* c #FFCF00", | |
16 | "= c #FFD000", | |
17 | "- c #FED200", | |
18 | "; c #FED400", | |
19 | ": c #FED700", | |
20 | "> c #FDD800", | |
21 | ", c #FED800", | |
22 | "< c #FDDC00", | |
23 | "1 c #FDDD00", | |
24 | "2 c #FDDE00", | |
25 | "3 c #FCDF00", | |
26 | "4 c #FBE700", | |
27 | "5 c #FCE500", | |
28 | "6 c #FCE600", | |
29 | "7 c #FBE800", | |
30 | "8 c #FBE900", | |
31 | "9 c #FBEA00", | |
32 | "0 c #FBEB00", | |
33 | "q c #FBEC00", | |
34 | "w c #FAED00", | |
35 | "e c #FBED00", | |
36 | "r c #FAF000", | |
37 | "t c #FAF100", | |
38 | "y c #FAF200", | |
39 | "u c #F9F400", | |
40 | "i c #F9F500", | |
41 | "p c #FAF400", | |
42 | "a c #F9F800", | |
43 | "s c #F9F900", | |
44 | "d c #F9FA00", | |
45 | "f c #F9FB00", | |
46 | "g c #F8FD00", | |
47 | "h c #F8FE00", | |
48 | "j c #F8FF00", | |
49 | "k c None", | |
50 | /* pixels */ | |
51 | "k..............................k", | |
52 | "..o+########################+X..", | |
53 | ".o%%%%%%%%%%%%%%%%%%%%%%%%%%%%X.", | |
54 | ".+%%%%%%%%%%%%%%%%%%%%%%%%%%%%+.", | |
55 | ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.", | |
56 | ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.", | |
57 | ".@%%%%%%%%%%%%%,,%%%%%%%%%%%%%@.", | |
58 | ".@%%%%%%%%%%%%-dd-%%%%%%%%%%%%@.", | |
59 | ".@%%%%%%%%%%%%0hh0%%%%%%%%%%%%@.", | |
60 | ".@%%%%%%%%%%%,hhhh,%%%%%%%%%%%@.", | |
61 | ".@%%%%%%%%%%%ihhhhi%%%%%%%%%%%@.", | |
62 | ".@%%%%%%%%-3thhhhhhq3-%%%%%%%%@.", | |
63 | ".@%%%%%30dhhhhhhhhhhhhdq3%%%%%@.", | |
64 | ".@%%%%%dhhhhhhhhhhhhhhhhd%%%%%@.", | |
65 | ".@%%%%%:hhhhhhhhhhhhhhhh:%%%%%@.", | |
66 | ".@%%%%%%3hhhhhhhhhhhhhh3%%%%%%@.", | |
67 | ".@%%%%%%%5hhhhhhhhhhhh5%%%%%%%#.", | |
68 | ".@%%%%%%%%thhhhhhhhhht%%%%%%%%@.", | |
69 | ".@%%%%%%%%5hhhhhhhhhh5%%%%%%%%@.", | |
70 | ".@%%%%%%%%9hhhhhhhhhh0%%%%%%%%@.", | |
71 | ".@%%%%%%%%qjhhhhhhhhhq%%%%%%%%@.", | |
72 | ".@%%%%%%%%tjhhhhhhhhht%%%%%%%%@.", | |
73 | ".@%%%%%%%%ihht3%%3thht%%%%%%%%@.", | |
74 | ".@%%%%%%%%04-%$%%%%-00%%%%%%%%@.", | |
75 | ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.", | |
76 | ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.", | |
77 | ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.", | |
78 | ".@%%%%%%%%%%%%%%%%%%%%%%%%%%%%@.", | |
79 | ".+%%%%%%%%%%%%%%%%%%%%%%%%%%%%O ", | |
80 | ".X%%%%%%%%%%%%%%%%%%%%%%%%%%%%X.", | |
81 | "..o+########################+o..", | |
82 | "k..............................k" | |
83 | }; |
Binary diff not shown
0 | /* XPM */ | |
1 | static char *blockattack48[] = { | |
2 | /* columns rows colors chars-per-pixel */ | |
3 | "48 48 54 1 ", | |
4 | " c #654600", | |
5 | ". c #654700", | |
6 | "X c #6C4C00", | |
7 | "o c #6D4C00", | |
8 | "O c #6C4D00", | |
9 | "+ c #6F4F00", | |
10 | "@ c #715100", | |
11 | "# c #8D6A00", | |
12 | "$ c #8E6A00", | |
13 | "% c #8F6A00", | |
14 | "& c #8F6B00", | |
15 | "* c #E5B600", | |
16 | "= c #E6B700", | |
17 | "- c #E7B800", | |
18 | "; c #FECC00", | |
19 | ": c #FFCD00", | |
20 | "> c #FFCE00", | |
21 | ", c #FFCF00", | |
22 | "< c #FFD000", | |
23 | "1 c #FED100", | |
24 | "2 c #FED200", | |
25 | "3 c #FED300", | |
26 | "4 c #FED400", | |
27 | "5 c #FED500", | |
28 | "6 c #FDD800", | |
29 | "7 c #FDD900", | |
30 | "8 c #FED800", | |
31 | "9 c #FDDA00", | |
32 | "0 c #FDDC00", | |
33 | "q c #FDDE00", | |
34 | "w c #FDDF00", | |
35 | "e c #FCE000", | |
36 | "r c #FCE200", | |
37 | "t c #FCE300", | |
38 | "y c #FBE600", | |
39 | "u c #FBE700", | |
40 | "i c #FCE400", | |
41 | "p c #FCE600", | |
42 | "a c #FBE800", | |
43 | "s c #FBE900", | |
44 | "d c #FBEA00", | |
45 | "f c #FBEB00", | |
46 | "g c #FAEE00", | |
47 | "h c #FAEF00", | |
48 | "j c #FAF000", | |
49 | "k c #FAF100", | |
50 | "l c #F9F500", | |
51 | "z c #FAF400", | |
52 | "x c #F9F600", | |
53 | "c c #F9F800", | |
54 | "v c #F8FC00", | |
55 | "b c #F8FE00", | |
56 | "n c #F8FF00", | |
57 | "m c None", | |
58 | /* pixels */ | |
59 | "mm mm", | |
60 | "m O@O++++++++++++++++++++++++++++++++++O m", | |
61 | " &-<;;;<;;;<;<;;;;;<;;;<;<;;;;;<;;;<;<;<;-& ", | |
62 | " &;;;;;;;<;;;;;<;<;;;<;;;;;<;<;;;<;;;;;;;;;;& ", | |
63 | " -;;;;;;<;<;;;;;;;<;;;<;;;;;<;;;<;<;;;;;<;;;- ", | |
64 | " O<;;<;<;;;;<;<;<;;;<;;;<;<;;;<;;;;;<;<;;;<;<;O ", | |
65 | " @<;<;;;;<;;;;;<;<;<;<;<;;;<;;;;;<;;;;;<;;;;;<@ ", | |
66 | " @;;;;;<;;<;<;;;;;;;;;;;<;;;<;<;;;<;<;;;<;<;;;@ ", | |
67 | " @;;;<;<;<;;;<;<;<;<;<;;;;;;;;;<;<;<;;;<;;;;;;@ ", | |
68 | " @;;;;;;;;<;;;;;;;;;;;;55;<;<;;;;;;;<;;;<;<;<;@ ", | |
69 | ".@<;;<;;;;;;;<;;;<;;;<;cc<;;;<;<;<;;;<;<;;;<;;@ ", | |
70 | ".@;;;;<;<;<;;;<;;;<;;;fnnf;;;;;;;;<;;;;;<;;;<;@ ", | |
71 | ".@;<;;;<;;;<;;;<;;;<;9nnnn9;;;;<;<;<;;;;;<;;;<@ ", | |
72 | " @;;<;;;<;;;<;;;<;;;;xnnnnx;<;;;;;;;<;<;;;<;;;@ ", | |
73 | " @;<;<;<;<;<;<;<;;;<rnnnnnnr;<;<;<;;;;;<;;;;;<@ ", | |
74 | " @;;;;;;;;;;;;;;;<;<nnnnnnnn5;;;;;<;<;;;<;<;;;@ ", | |
75 | ".@;<;<;<<;;;;<;;<;;knnnnnnnnk;;;;;;;;<;;<;<;;<@ ", | |
76 | ".@;;;;;;;;;;;;;<qscnnnnnnnnnncfq<;<;;;;<;;;;;;@ ", | |
77 | " @;;;<;;;;;<rfcnnnnnnnnnnnnnnnnnnxfq<;;;;;<;;<@ ", | |
78 | " @<;;;<;;<pnnnnnnnnnnnnnnnnnnnnnnnnnnp;;;<;;;;@ ", | |
79 | " @;;;;;;;;qnnnnnnnnnnnnnnnnnnnnnnnnnnq<;<;;;<;@ ", | |
80 | " @<;<;<;;<;pnnnnnnnnnnnnnnnnnnnnnnnnp;;;;;;<;;@.", | |
81 | " @;;;;;<;<;;hnnnnnnnnnnnnnnnnnnnnnnk;;<;<;<;<;@.", | |
82 | " @<;<;;;;;;;;xnnnnnnnnnnnnnnnnnnnnx<;;;;;;;;;;@.", | |
83 | " @;<;<;;;<;<;<xnnnnnnnnnnnnnnnnnnx<;;;<;;;;;;;@ ", | |
84 | " @;;;;<;;;;;<;5nnnnnnnnnnnnnnnnnn5;;;<;;<;<;<;@ ", | |
85 | " @;<;;;;;<;;;<;rnnnnnnnnnnnnnnnnr;<;;;;;;;;<;;@ ", | |
86 | " @;;<;<;;;<;;;;9nnnnnnnnnnnnnnnn9;;;;<;<<;;;<;@ ", | |
87 | " @;;;<;;;<;<;;;9nnnnnnnnnnnnnnnn9;;;;;;;;<;;;<@ ", | |
88 | " @<;;;<;;;;;<;;qnnnnnnnnnnnnnnnnq;;<<;<;;;<;;;@ ", | |
89 | " @;<;;;;;<;;;;;pnnnnnnnnnnnnnnnnr;;;;;;<;;;;;<@ ", | |
90 | " @;;<;<;;;<;<;;pnnnnnnnnnnnnnnnnf;<;<;;;<;<;;;@ ", | |
91 | " @;;;<;<;;;<;<;fnnnnnnnxxnnnnnnnf;;;;<;<;;;<;<@ ", | |
92 | " @<;;;;;<;;;;;;knnnncf5<;5pnnnnnh;;;;;;;<;;;;;@ ", | |
93 | " @;;;<;;;<;<;;;knnxp<;<;<;;<rxnnk<;<;<;;;<;<;;@ ", | |
94 | " @<;;;<;;;;;;;;rp9;;;;;;;;;;;;9fr;;;;;<;;;;;<;@ ", | |
95 | " @;<;;;<<;<;;;;;;<;<;;;;;;<;;;<;;;;<;;;<;;;;;<@ ", | |
96 | " @;;<;;;;;;;;<;<;;;;<;<;;<;;;<;;;;;;<;;;<;<;;;@ ", | |
97 | " @;<;<;<;;<;<;;;;<;;;;;<;;;;;;;;;<;<;<;<;;;<;;@ ", | |
98 | " @;;;;;;;<;;;;;<;;<;<;;;;<;<;<;<;;;;;;;;<;;;<;@ ", | |
99 | ".@;;<;<;;;<;;;;;;<;<;;;<;<;<;<;<;;;;;;;;;;;<;<@ ", | |
100 | ".@;<;;;;;<;;;<;<;;;;<;;;;;;;;;;;<;<;<;<;<;;;;;@ ", | |
101 | ".O;;;;<;;;;;<;;;;<;;;<;<;<;;;<;;;;;<;;;<;<;<;;O ", | |
102 | " -;;<;;;<;<;;;<;;<;;;;;;;<;;;<;<;;;<;;;;;;;;= ", | |
103 | " &;;;;;;;;;;;;;;<;<;;;;;;;<;;;;;<;;;<;<;;;;;& ", | |
104 | " &-;;<;<;;;<;<;;;;<;<;<;;;;;<;;;<;;;;;<;;=&. .", | |
105 | "m O++@+++++@+++++++++++@+++@O++++++++++O m", | |
106 | "mm . .mm" | |
107 | }; |
Binary diff not shown
0 | /* XPM */ | |
1 | static char *blockattack64[] = { | |
2 | /* columns rows colors chars-per-pixel */ | |
3 | "64 64 64 1 ", | |
4 | " c #654500", | |
5 | ". c #644600", | |
6 | "X c #654600", | |
7 | "o c #694A00", | |
8 | "O c #6A4A00", | |
9 | "+ c #8F6A00", | |
10 | "@ c #8F6B00", | |
11 | "# c #906C00", | |
12 | "$ c #936F00", | |
13 | "% c #957000", | |
14 | "& c #967100", | |
15 | "* c #A57E00", | |
16 | "= c #A67F00", | |
17 | "- c #A78000", | |
18 | "; c #A98200", | |
19 | ": c #AD8500", | |
20 | "> c #EFBE00", | |
21 | ", c #EFBF00", | |
22 | "< c #F0C000", | |
23 | "1 c #FECC00", | |
24 | "2 c #FFCD00", | |
25 | "3 c #FFCE00", | |
26 | "4 c #FFCF00", | |
27 | "5 c #FFD000", | |
28 | "6 c #FED100", | |
29 | "7 c #FED200", | |
30 | "8 c #FED300", | |
31 | "9 c #FED400", | |
32 | "0 c #FED600", | |
33 | "q c #FED700", | |
34 | "w c #FDD800", | |
35 | "e c #FDD900", | |
36 | "r c #FDDA00", | |
37 | "t c #FDDB00", | |
38 | "y c #FDDC00", | |
39 | "u c #FDDD00", | |
40 | "i c #FDDE00", | |
41 | "p c #FCE100", | |
42 | "a c #FCE200", | |
43 | "s c #FCE300", | |
44 | "d c #FBE600", | |
45 | "f c #FBE700", | |
46 | "g c #FCE400", | |
47 | "h c #FCE500", | |
48 | "j c #FCE600", | |
49 | "k c #FBE800", | |
50 | "l c #FBE900", | |
51 | "z c #FBEA00", | |
52 | "x c #FBEB00", | |
53 | "c c #FAEF00", | |
54 | "v c #FAF000", | |
55 | "b c #FAF100", | |
56 | "n c #FAF200", | |
57 | "m c #F9F400", | |
58 | "M c #F9F500", | |
59 | "N c #FAF400", | |
60 | "B c #F9F600", | |
61 | "V c #F9F700", | |
62 | "C c #F9F900", | |
63 | "Z c #F9FA00", | |
64 | "A c #F8FD00", | |
65 | "S c #F8FE00", | |
66 | "D c #F8FF00", | |
67 | "F c None", | |
68 | /* pixels */ | |
69 | "FFF...XXXX...XXX...XXX...XXX...XXX...XXX...XXX...XXX...XXXXXXFFF", | |
70 | "FF....XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXXX.XXFF", | |
71 | "FX...O#=::::::::::::::::::::::::::::::::::::::::::::::::;#O.XXXF", | |
72 | ".XX.&<2222222222222222222222222222222222222222222222222222,$XXXX", | |
73 | "XX.&22222222222222222222222222222222222222222222222222222221&..X", | |
74 | "XXO<22222222222222222222222222222222222222222222222222222222,OXX", | |
75 | "XX#2222222222222222222222222222222222222222222222222222222221#XX", | |
76 | "XX=2222222222222222222222222222222222222222222222222222222222=XX", | |
77 | "..;2222222222222222222222222222222222222222222222222222222222;..", | |
78 | "..;2222222222222222222222222222222222222222222222222222222222;..", | |
79 | ".X;2222222222222222222222222222222222222222222222222222222222;.X", | |
80 | "XX;2222222222222222222222222222222222222222222222222222222222;XX", | |
81 | "XX;2222222222222222222222222222272222222222222222222222222222;..", | |
82 | "XX;2222222222222222222222222222MM2222222222222222222222222222;..", | |
83 | "..;222222222222222222222222222kDDk222222222222222222222222222;.X", | |
84 | "..;22222222222222222222222222tDDDDt22222222222222222222222222;XX", | |
85 | ".X;22222222222222222222222227MDDDDM22222222222222222222222222;..", | |
86 | "XX;2222222222222222222222222gDDDDDDg2222222222222222222222222;..", | |
87 | "XX;2222222222222222222222229DDDDDDDD7222222222222222222222222;.X", | |
88 | "XX;222222222222222222222222xDDDDDDDDx222222222222222222222222;XX", | |
89 | "..;22222222222222222222222tDDDDDDDDDDt22222222222222222222222;..", | |
90 | "..;22222222222222222222227CDDDDDDDDDDC72222222222222222222222;..", | |
91 | ".X;2222222222222222222227xDDDDDDDDDDDDx7222222222222222222222;.X", | |
92 | "XX;222222222222222227ykMDDDDDDDDDDDDDDDDMky722222222222222222;XX", | |
93 | "XX;22222222222227yxCDDDDDDDDDDDDDDDDDDDDDDDDMxy72222222222222;..", | |
94 | "XX;22222222222gMDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDMs22222222222;..", | |
95 | "..;22222222229DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD72222222222;.X", | |
96 | "..;22222222222zDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDk22222222222;XX", | |
97 | ".X;222222222222MDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDM222222222222;..", | |
98 | "XX;2222222222227CDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC7222222222222;..", | |
99 | "XX;22222222222229DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD92222222222222;.X", | |
100 | "XX;22222222222222yDDDDDDDDDDDDDDDDDDDDDDDDDDDDy22222222222222;XX", | |
101 | "..;222222222222222aDDDDDDDDDDDDDDDDDDDDDDDDDDa222222222222222;..", | |
102 | "..;2222222222222222kDDDDDDDDDDDDDDDDDDDDDDDDg2222222222222222-..", | |
103 | "..;22222222222222222xDDDDDDDDDDDDDDDDDDDDDDb22222222222222222;..", | |
104 | "..;222222222222222227DDDDDDDDDDDDDDDDDDDDDD722222222222222222;.O", | |
105 | "O.;222222222222222222DDDDDDDDDDDDDDDDDDDDDD222222222222222222;..", | |
106 | "..;222222222222222221DDDDDDDDDDDDDDDDDDDDDD122222222222222222;..", | |
107 | "..;222222222222222227DDDDDDDDDDDDDDDDDDDDDD722222222222222222;.X", | |
108 | "..;222222222222222229DDDDDDDDDDDDDDDDDDDDDD922222222222222222;XX", | |
109 | ".X;22222222222222222tDDDDDDDDDDDDDDDDDDDDDDt22222222222222222;..", | |
110 | "XX;22222222222222222yDDDDDDDDDDDDDDDDDDDDDDy22222222222222222;..", | |
111 | "XX;22222222222222222aDDDDDDDDDDDDDDDDDDDDDDa22222222222222222;.X", | |
112 | "XX;22222222222222222aDDDDDDDDDDxxDDDDDDDDDDa22222222222222222;XX", | |
113 | "..;22222222222222222gDDDDDDDMs2227aCDDDDDDDg22222222222222222;..", | |
114 | "..;22222222222222222kDDDDDxy22222222yxDDDDDk22222222222222222;..", | |
115 | ".X;22222222222222222kDDCg92222222222227gCDDg22222222222222222;.X", | |
116 | "XX;222222222222222229gt222222222222222222tgt22222222222222222;XX", | |
117 | "XX;2222222222222222222222222222222222222222222222222222222222;..", | |
118 | "XX;2222222222222222222222222222222222222222222222222222222222;..", | |
119 | "..;2222222222222222222222222222222222222222222222222222222222;.X", | |
120 | "..;2222222222222222222222222222222222222222222222222222222222;XX", | |
121 | ".X;2222222222222222222222222222222222222222222222222222222222;..", | |
122 | "XX;2222222222222222222222222222222222222222222222222222222222;..", | |
123 | "XX;2222222222222222222222222222222222222222222222222222222222;.X", | |
124 | "XX;2222222222222222222222222222222222222222222222222222222222;XX", | |
125 | "..=2222222222222222222222222222222222222222222222222222222222=..", | |
126 | "..#2222222222222222222222222222222222222222222222222222222222+..", | |
127 | "XXO,22222222222222222222222222222222222222222222222222222222,O..", | |
128 | "XX.$12222222222222222222222222222222222222222222222222222222$XX.", | |
129 | "XXXX&,2222222222222222222222222222222222222222222222222211,$.XXX", | |
130 | "FXXX.O#=::::::::::::::::::::::::::::::::::::::::::::::::=#OXXXXF", | |
131 | "FFXXXXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXX..XXXXFF", | |
132 | "FFFXXXX...XXX...XXX...XXX...XXX...XXX...XXX...XXX...XXXXXXXXXFFF" | |
133 | }; |
4 | 4 | # Move to script's directory |
5 | 5 | cd "`dirname "$0"`" |
6 | 6 | |
7 | # Get the kernel/architecture information | |
8 | ARCH=`uname -m` | |
9 | ||
10 | # Set the libpath and pick the proper binary | |
11 | if [ "$ARCH" == "x86_64" ]; then | |
12 | export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./x86_64/ | |
13 | ./x86_64/blockattack "$@" | |
14 | else | |
15 | export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./x86/ | |
16 | ./x86/blockattack "$@" | |
17 | fi | |
7 | export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./x86_64/ | |
8 | ./x86_64/blockattack "$@" |
9 | 9 | |
10 | 10 | rm -rf staging |
11 | 11 | mkdir -p staging/$ARCHIVENAME/x86_64 |
12 | mkdir -p staging/$ARCHIVENAME/x86 | |
13 | 12 | mkdir -p staging/$ARCHIVENAME/docs |
13 | mkdir -p staging/$ARCHIVENAME/mods | |
14 | 14 | cp blockattack_standalone_launcher staging/$ARCHIVENAME/blockattack |
15 | 15 | cp README.txt staging/$ARCHIVENAME/README |
16 | 16 | chmod +x staging/$ARCHIVENAME/blockattack |
17 | 17 | |
18 | 18 | cd ../../.. |
19 | 19 | |
20 | docker build -f source/misc/docker/Dockerfile.Ubuntu12.04build_Standalone . -t blockattack_test | |
20 | docker build -f source/misc/docker/Dockerfile.Ubuntu16.04build_Standalone . -t blockattack_test | |
21 | 21 | |
22 | 22 | echo Copying to: $(pwd)/source/misc/standalone/staging/$ARCHIVENAME |
23 | 23 | |
32 | 32 | |
33 | 33 | docker run -it --rm -v $(pwd)/source/misc/standalone/staging/$ARCHIVENAME/:/output blockattack_test /bin/bash -c "cp -r /staging/blockattack-game/source/misc/translation/locale /output/ && \ |
34 | 34 | cp /staging/blockattack-game/Game/blockattack.data /output/ && \ |
35 | cp /staging/blockattack-game/Game/mods/1.3.0.bricks.data /output/mods/ && \ | |
35 | 36 | cp -r /staging/blockattack-game/source/misc/icons /output/ && \ |
36 | 37 | cp /staging/blockattack-game/COPYING /output/ && \ |
37 | 38 | cp /staging/blockattack-game/man/blockattack.man /output/docs/ && \ |
38 | 39 | cp /staging/blockattack-game/README.md /output/docs/README_ORG.md && \ |
39 | 40 | chown -R 1000 /output" |
40 | 41 | |
41 | scp source/misc/standalone/compile_requirements.sh blockattack_build:/ | |
42 | scp source/misc/standalone/install_requirements.sh blockattack_build:/ | |
43 | ssh blockattack_build /install_requirements.sh | |
44 | ssh blockattack_build /compile_requirements.sh | |
45 | ssh blockattack_build rm -rf /staging/blockattack-game | |
46 | scp -r . blockattack_build:/staging/blockattack-game | |
47 | ssh blockattack_build rm -f /staging/blockattack-game/CMakeCache.txt | |
48 | ||
49 | ssh blockattack_build "BLOCKATTACK_VERSION=2.2.0-SNAPSHOT && cd /staging/blockattack-game && \ | |
50 | ./packdata.sh && \ | |
51 | cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/ && \ | |
52 | cp source/misc/travis_help/utf8_v2_3_4/source/utf8.h source/code/sago/ && \ | |
53 | cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/ && \ | |
54 | cp -r source/misc/travis_help/utf8_v2_3_4/source/utf8 source/code/sago/ && \ | |
55 | cmake -D Boost_USE_STATIC_LIBS=ON -D INSTALL_DATA_DIR=. -D CMAKE_INSTALL_PREFIX=. -D STANDALONE=1 . && make clean && make" | |
56 | ||
57 | OUTPUT=$(pwd)/source/misc/standalone/staging/$ARCHIVENAME/ | |
58 | ||
59 | scp blockattack_build:/staging/blockattack-game/Game/blockattack $OUTPUT/x86/ && \ | |
60 | scp blockattack_build:/usr/local/lib/libSDL2-2.0.so.0 $OUTPUT/x86/ && \ | |
61 | scp blockattack_build:/usr/local/lib/libphysfs.so.1 $OUTPUT/x86/ && \ | |
62 | scp blockattack_build:/usr/local/lib/libSDL2_mixer-2.0.so.0 $OUTPUT/x86/ && \ | |
63 | scp blockattack_build:/usr/local/lib/libSDL2_ttf-2.0.so.0 $OUTPUT/x86/ && \ | |
64 | scp blockattack_build:/usr/lib/i386-linux-gnu/libfreetype.so.6 $OUTPUT/x86/ && \ | |
65 | scp blockattack_build:/lib/i386-linux-gnu/libpng12.so.0 $OUTPUT/x86/ && \ | |
66 | scp blockattack_build:/usr/local/lib/libSDL2_image-2.0.so.0 $OUTPUT/x86/ | |
67 | ||
68 | 42 | exit 0 |
69 | ||
70 | docker build -f source/misc/docker/Dockerfile.Ubuntu12.04build_Standalone32 . -t blockattack_test | |
71 | ||
72 | docker run -it --rm -v $(pwd)/source/misc/standalone/staging/$ARCHIVENAME/:/output blockattack_test /bin/bash -c "cp /staging/blockattack-game/Game/blockattack /output/x86/ && \ | |
73 | cp /usr/local/lib/libSDL2-2.0.so.0 /output/x86/ && \ | |
74 | cp /usr/local/lib/libphysfs.so.1 /output/x86/ && \ | |
75 | cp /usr/local/lib/libSDL2_mixer-2.0.so.0 /output/x86/ && \ | |
76 | cp /usr/local/lib/libSDL2_ttf-2.0.so.0 /output/x86/ && \ | |
77 | cp /usr/lib/i386-linux-gnu/libfreetype.so.6 /output/x86/ && \ | |
78 | cp /lib/i386-linux-gnu/libpng12.so.0 /output/x86/ && \ | |
79 | cp /usr/local/lib/libSDL2_image-2.0.so.0 /output/x86/" | |
80 | ||
81 | cd source/misc/standalone/staging/ | |
82 | tar -cvjSf "$ARCHIVENAME.tar.bz2" "$ARCHIVENAME" |
1 | 1 | set -e |
2 | 2 | set -x |
3 | 3 | |
4 | mkdir -p /staging/deps && cd /staging/deps && curl https://libsdl.org/release/SDL2-2.0.12.tar.gz | tar -zx && cd SDL2-2.0.12 && ls -lrt | |
5 | cd /staging/deps/SDL2-2.0.12 && ./configure --enable-shared --enable-static && make && make install | |
4 | mkdir -p /staging/deps && cd /staging/deps && curl https://libsdl.org/release/SDL2-2.0.16.tar.gz | tar -zx && cd SDL2-2.0.16 && ls -lrt | |
5 | cd /staging/deps/SDL2-2.0.16 && ./configure --enable-shared --enable-static && make && make install | |
6 | 6 | |
7 | 7 | #https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.5.tar.gz |
8 | 8 | mkdir -p /staging/deps && cd /staging/deps && curl https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.5.tar.gz | tar -zx && cd SDL2_image-2.0.5 && ls -lrt |
6 | 6 | msgstr "" |
7 | 7 | "Project-Id-Version: \n" |
8 | 8 | "Report-Msgid-Bugs-To: \n" |
9 | "POT-Creation-Date: 2020-06-27 14:06+0200\n" | |
10 | "PO-Revision-Date: 2020-06-27 14:08+0200\n" | |
9 | "POT-Creation-Date: 2021-10-18 21:20+0200\n" | |
10 | "PO-Revision-Date: 2021-10-18 21:21+0200\n" | |
11 | 11 | "Last-Translator: Poul Sander <poul@poulsander.com>\n" |
12 | 12 | "Language-Team: \n" |
13 | 13 | "Language: da\n" |
14 | 14 | "MIME-Version: 1.0\n" |
15 | 15 | "Content-Type: text/plain; charset=UTF-8\n" |
16 | 16 | "Content-Transfer-Encoding: 8bit\n" |
17 | "X-Generator: Poedit 2.0.6\n" | |
17 | "X-Generator: Poedit 2.3\n" | |
18 | 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
19 | 19 | |
20 | #: ../../code/DialogBox.cpp:94 | |
20 | #: ../../code/DialogBox.cpp:131 | |
21 | 21 | msgid "Enter to accept" |
22 | 22 | msgstr "Bekræft med Enter" |
23 | 23 | |
24 | #: ../../code/DialogBox.cpp:95 | |
24 | #: ../../code/DialogBox.cpp:132 | |
25 | 25 | msgid "Esc to cancel" |
26 | 26 | msgstr "Annuller med Esc" |
27 | 27 | |
28 | #: ../../code/HelpAboutState.cpp:68 | |
28 | #: ../../code/HelpAboutState.cpp:62 | |
29 | 29 | msgid "No audio driver" |
30 | 30 | msgstr "Ingen lyd driver" |
31 | 31 | |
32 | #: ../../code/HelpAboutState.cpp:71 | |
32 | #: ../../code/HelpAboutState.cpp:65 | |
33 | 33 | msgid "Name:" |
34 | 34 | msgstr "Navn:" |
35 | 35 | |
36 | #: ../../code/HelpAboutState.cpp:71 ../../code/main.cpp:329 | |
36 | #: ../../code/HelpAboutState.cpp:65 ../../code/main.cpp:337 | |
37 | 37 | msgid "Block Attack - Rise of the Blocks" |
38 | 38 | msgstr "Block Attack - Blokkenes opstand" |
39 | 39 | |
40 | #: ../../code/HelpAboutState.cpp:72 | |
40 | #: ../../code/HelpAboutState.cpp:66 | |
41 | 41 | msgid "Original name:" |
42 | 42 | msgstr "Originalt navn:" |
43 | 43 | |
44 | #: ../../code/HelpAboutState.cpp:73 | |
44 | #: ../../code/HelpAboutState.cpp:67 | |
45 | 45 | msgid "Version:" |
46 | 46 | msgstr "Version:" |
47 | 47 | |
48 | #: ../../code/HelpAboutState.cpp:74 | |
48 | #: ../../code/HelpAboutState.cpp:68 | |
49 | 49 | msgid "Homepage:" |
50 | 50 | msgstr "Hjemmeside:" |
51 | 51 | |
52 | #: ../../code/HelpAboutState.cpp:75 | |
52 | #: ../../code/HelpAboutState.cpp:69 | |
53 | 53 | msgid "Github page:" |
54 | 54 | msgstr "Github side:" |
55 | 55 | |
56 | #: ../../code/HelpAboutState.cpp:76 | |
56 | #: ../../code/HelpAboutState.cpp:70 | |
57 | 57 | msgid "SDL render:" |
58 | 58 | msgstr "SDL render:" |
59 | 59 | |
60 | #: ../../code/HelpAboutState.cpp:77 | |
60 | #: ../../code/HelpAboutState.cpp:71 | |
61 | 61 | msgid "SDL audio driver:" |
62 | 62 | msgstr "SDL lyd driver:" |
63 | 63 | |
64 | #: ../../code/HelpAboutState.cpp:78 | |
64 | #: ../../code/HelpAboutState.cpp:72 | |
65 | 65 | msgid "SDL compiled version:" |
66 | 66 | msgstr "SDL kompileret version:" |
67 | 67 | |
68 | #: ../../code/HelpAboutState.cpp:79 | |
68 | #: ../../code/HelpAboutState.cpp:73 | |
69 | 69 | msgid "SDL linked version:" |
70 | 70 | msgstr "SDL lænket version:" |
71 | 71 | |
72 | #: ../../code/HelpAboutState.cpp:80 | |
72 | #: ../../code/HelpAboutState.cpp:74 | |
73 | 73 | msgid "Save folder:" |
74 | 74 | msgstr "Mappe til gemte spil:" |
75 | 75 | |
76 | #: ../../code/HelpAboutState.cpp:81 | |
76 | #: ../../code/HelpAboutState.cpp:75 | |
77 | 77 | msgid "Locale:" |
78 | 78 | msgstr "Lokalitet:" |
79 | 79 | |
80 | #: ../../code/HelpAboutState.cpp:82 ../../code/menudef.cpp:414 | |
80 | #: ../../code/HelpAboutState.cpp:76 ../../code/menudef.cpp:549 | |
81 | 81 | msgid "About" |
82 | 82 | msgstr "Om" |
83 | 83 | |
84 | #: ../../code/HelpGamepadState.cpp:52 | |
85 | msgid "Move cursor" | |
86 | msgstr "Flyt markøren" | |
87 | ||
88 | #: ../../code/HelpGamepadState.cpp:53 | |
89 | msgid "Push line" | |
90 | msgstr "Skub linje" | |
91 | ||
92 | #: ../../code/HelpGamepadState.cpp:54 | |
93 | msgid "Back (Menu)" | |
94 | msgstr "Tilbage (Menu)" | |
95 | ||
96 | #: ../../code/HelpGamepadState.cpp:55 | |
97 | msgid "Switch" | |
98 | msgstr "Skift" | |
99 | ||
100 | #: ../../code/HelpGamepadState.cpp:56 | |
101 | msgid "Confirm" | |
102 | msgstr "Bekræft" | |
103 | ||
104 | #: ../../code/HelpGamepadState.cpp:57 | |
84 | #: ../../code/HelpGamepadState.cpp:35 | |
105 | 85 | msgid "" |
106 | 86 | "Only SDL2 compatible controllers are supported!\n" |
107 | 87 | "Supported controllers: " |
109 | 89 | "Kun SDL2 kompatible kontrollere er understøttet!\n" |
110 | 90 | "Understøttede kontrollere: " |
111 | 91 | |
92 | #: ../../code/HelpGamepadState.cpp:47 | |
93 | msgid "Move cursor" | |
94 | msgstr "Flyt markøren" | |
95 | ||
96 | #: ../../code/HelpGamepadState.cpp:48 | |
97 | msgid "Push line" | |
98 | msgstr "Skub linje" | |
99 | ||
100 | #: ../../code/HelpGamepadState.cpp:49 | |
101 | msgid "Back (Menu)" | |
102 | msgstr "Tilbage (Menu)" | |
103 | ||
104 | #: ../../code/HelpGamepadState.cpp:50 | |
105 | msgid "Switch" | |
106 | msgstr "Skift" | |
107 | ||
108 | #: ../../code/HelpGamepadState.cpp:51 | |
109 | msgid "Confirm" | |
110 | msgstr "Bekræft" | |
111 | ||
112 | 112 | #: ../../code/HelpHowtoState.cpp:125 |
113 | 113 | msgid "Switch block horizontally" |
114 | 114 | msgstr "Skift blokke horisontalt" |
129 | 129 | msgid "Create a chain effect" |
130 | 130 | msgstr "Lav en kæde effekt" |
131 | 131 | |
132 | #: ../../code/levelselect.cpp:86 | |
132 | #: ../../code/levelselect.cpp:84 | |
133 | 133 | msgid "Select Puzzle" |
134 | 134 | msgstr "Vælg gåde" |
135 | 135 | |
136 | #: ../../code/levelselect.cpp:89 | |
136 | #: ../../code/levelselect.cpp:87 | |
137 | 137 | msgid "Stage Clear Level Select" |
138 | 138 | msgstr "Vælg Stage Clear-bane" |
139 | 139 | |
140 | #: ../../code/levelselect.cpp:195 | |
140 | #: ../../code/levelselect.cpp:193 | |
141 | 141 | #, c-format |
142 | 142 | msgid "Best score: %i" |
143 | 143 | msgstr "Bedste resultat: %i" |
144 | 144 | |
145 | #: ../../code/levelselect.cpp:196 | |
145 | #: ../../code/levelselect.cpp:194 | |
146 | 146 | #, c-format |
147 | 147 | msgid "Time used: %s" |
148 | 148 | msgstr "Tid brugt: %s" |
149 | 149 | |
150 | #: ../../code/levelselect.cpp:199 | |
150 | #: ../../code/levelselect.cpp:197 | |
151 | 151 | #, c-format |
152 | 152 | msgid "Time used: %d : %02d" |
153 | 153 | msgstr "Tid brugt: %d : %02d" |
154 | 154 | |
155 | #: ../../code/levelselect.cpp:204 | |
155 | #: ../../code/levelselect.cpp:202 | |
156 | 156 | #, c-format |
157 | 157 | msgid "Total score: %i in %i:%02i" |
158 | 158 | msgstr "Sammenlagt: %i på %i:%02i" |
159 | 159 | |
160 | #: ../../code/main.cpp:158 | |
160 | #: ../../code/main.cpp:164 | |
161 | 161 | msgid "GAME OVER" |
162 | 162 | msgstr "SPILLET ER SLUT" |
163 | 163 | |
164 | #: ../../code/main.cpp:159 | |
164 | #: ../../code/main.cpp:165 | |
165 | 165 | msgid "WINNER" |
166 | 166 | msgstr "VINDER" |
167 | 167 | |
168 | #: ../../code/main.cpp:160 | |
168 | #: ../../code/main.cpp:166 | |
169 | 169 | msgid "DRAW" |
170 | 170 | msgstr "UAFGJORT" |
171 | 171 | |
172 | #: ../../code/main.cpp:497 ../../code/main.cpp:628 | |
172 | #: ../../code/main.cpp:491 ../../code/main.cpp:622 | |
173 | 173 | msgid "AI" |
174 | 174 | msgstr "Computer" |
175 | 175 | |
176 | #: ../../code/main.cpp:500 | |
176 | #: ../../code/main.cpp:494 | |
177 | 177 | msgid "Playing field" |
178 | 178 | msgstr "Spilleflade" |
179 | 179 | |
180 | #: ../../code/main.cpp:574 | |
180 | #: ../../code/main.cpp:568 | |
181 | 181 | msgid "Time Trial" |
182 | 182 | msgstr "På tid" |
183 | 183 | |
184 | #: ../../code/main.cpp:575 | |
184 | #: ../../code/main.cpp:569 | |
185 | 185 | msgid "Score as much as possible in 2 minutes" |
186 | 186 | msgstr "Se hvor mange point du kan opnå på 2 minutter" |
187 | 187 | |
188 | #: ../../code/main.cpp:579 | |
188 | #: ../../code/main.cpp:573 | |
189 | 189 | msgid "Stage Clear" |
190 | 190 | msgstr "Stage Clear" |
191 | 191 | |
192 | #: ../../code/main.cpp:580 | |
192 | #: ../../code/main.cpp:574 | |
193 | 193 | msgid "You must clear a number of lines. Speed is rapidly increased." |
194 | 194 | msgstr "Fjern et specifik antal linjer. Hastigheden stiger hurtigt." |
195 | 195 | |
196 | #: ../../code/main.cpp:583 | |
196 | #: ../../code/main.cpp:577 | |
197 | 197 | msgid "Puzzle" |
198 | 198 | msgstr "Gåde" |
199 | 199 | |
200 | #: ../../code/main.cpp:584 | |
200 | #: ../../code/main.cpp:578 | |
201 | 201 | msgid "Clear the entire board with a limited number of moves." |
202 | 202 | msgstr "Fjern alle blokke med et begrænset antal flyt." |
203 | 203 | |
204 | #: ../../code/main.cpp:587 | |
204 | #: ../../code/main.cpp:581 | |
205 | 205 | msgid "Endless" |
206 | 206 | msgstr "Evighed" |
207 | 207 | |
208 | #: ../../code/main.cpp:588 | |
208 | #: ../../code/main.cpp:582 | |
209 | 209 | msgid "Score as much as possible. No time limit." |
210 | 210 | msgstr "Opnå så mange point som muligt. Ingen tidsbegrænsning." |
211 | 211 | |
212 | #: ../../code/main.cpp:598 | |
212 | #: ../../code/main.cpp:592 | |
213 | 213 | msgid "Objective:" |
214 | 214 | msgstr "Formål:" |
215 | 215 | |
216 | #: ../../code/main.cpp:608 | |
216 | #: ../../code/main.cpp:602 | |
217 | 217 | msgid "Movement keys:" |
218 | 218 | msgstr "Bevægelsestaster:" |
219 | 219 | |
220 | #: ../../code/main.cpp:610 | |
220 | #: ../../code/main.cpp:604 | |
221 | 221 | msgid "Switch: " |
222 | 222 | msgstr "Skift: " |
223 | 223 | |
224 | #: ../../code/main.cpp:612 | |
224 | #: ../../code/main.cpp:606 | |
225 | 225 | msgid "Restart: " |
226 | 226 | msgstr "Genstart: " |
227 | 227 | |
228 | #: ../../code/main.cpp:615 | |
228 | #: ../../code/main.cpp:609 | |
229 | 229 | msgid "Push line: " |
230 | 230 | msgstr "Skub linje: " |
231 | 231 | |
232 | #: ../../code/main.cpp:1050 | |
232 | #: ../../code/main.cpp:1073 | |
233 | 233 | msgid "Player 2" |
234 | 234 | msgstr "Spiller 2" |
235 | 235 | |
236 | #: ../../code/menudef.cpp:62 | |
236 | #: ../../code/menudef.cpp:59 | |
237 | 237 | msgid "Up arrow" |
238 | 238 | msgstr "Pil op" |
239 | 239 | |
240 | #: ../../code/menudef.cpp:65 | |
240 | #: ../../code/menudef.cpp:62 | |
241 | 241 | msgid "Down arrow" |
242 | 242 | msgstr "Pil ned" |
243 | 243 | |
244 | #: ../../code/menudef.cpp:68 | |
244 | #: ../../code/menudef.cpp:65 | |
245 | 245 | msgid "Left arrow" |
246 | 246 | msgstr "Pil venstre" |
247 | 247 | |
248 | #: ../../code/menudef.cpp:71 | |
248 | #: ../../code/menudef.cpp:68 | |
249 | 249 | msgid "Right arrow" |
250 | 250 | msgstr "Pil højre" |
251 | 251 | |
252 | #: ../../code/menudef.cpp:74 | |
252 | #: ../../code/menudef.cpp:71 | |
253 | 253 | msgid "Right Ctrl" |
254 | 254 | msgstr "Højre Ctrl" |
255 | 255 | |
256 | #: ../../code/menudef.cpp:77 | |
256 | #: ../../code/menudef.cpp:74 | |
257 | 257 | msgid "Left Ctrl" |
258 | 258 | msgstr "Venstre Ctrl" |
259 | 259 | |
260 | #: ../../code/menudef.cpp:80 | |
260 | #: ../../code/menudef.cpp:77 | |
261 | 261 | msgid "Right shift" |
262 | 262 | msgstr "Højre skift" |
263 | 263 | |
264 | #: ../../code/menudef.cpp:83 | |
264 | #: ../../code/menudef.cpp:80 | |
265 | 265 | msgid "Left shift" |
266 | 266 | msgstr "Venstre skift" |
267 | 267 | |
268 | #: ../../code/menudef.cpp:86 | |
268 | #: ../../code/menudef.cpp:83 | |
269 | 269 | msgid "Right alt" |
270 | 270 | msgstr "AltGr" |
271 | 271 | |
272 | #: ../../code/menudef.cpp:89 | |
272 | #: ../../code/menudef.cpp:86 | |
273 | 273 | msgid "Left alt" |
274 | 274 | msgstr "Alt" |
275 | 275 | |
276 | #: ../../code/menudef.cpp:92 | |
276 | #: ../../code/menudef.cpp:89 | |
277 | 277 | msgid "Return" |
278 | 278 | msgstr "Enter" |
279 | 279 | |
280 | #: ../../code/menudef.cpp:95 | |
280 | #: ../../code/menudef.cpp:92 | |
281 | 281 | msgid "Space" |
282 | 282 | msgstr "Mellemrum" |
283 | 283 | |
284 | #: ../../code/menudef.cpp:162 | |
284 | #: ../../code/menudef.cpp:149 | |
285 | #, c-format | |
286 | msgid "Volume: %d%%" | |
287 | msgstr "Lydstyrke: %d%%" | |
288 | ||
289 | #: ../../code/menudef.cpp:194 | |
290 | msgid "Test sound" | |
291 | msgstr "Test lydeffekter" | |
292 | ||
293 | #: ../../code/menudef.cpp:210 | |
294 | msgid "Test music" | |
295 | msgstr "Test musik" | |
296 | ||
297 | #: ../../code/menudef.cpp:244 | |
285 | 298 | msgid "Single Player Endless" |
286 | 299 | msgstr "En spiller - Evighed" |
287 | 300 | |
288 | #: ../../code/menudef.cpp:169 | |
301 | #: ../../code/menudef.cpp:251 | |
289 | 302 | msgid "Slow" |
290 | 303 | msgstr "Langsom" |
291 | 304 | |
292 | #: ../../code/menudef.cpp:170 | |
305 | #: ../../code/menudef.cpp:252 | |
293 | 306 | msgid "Fast" |
294 | 307 | msgstr "Hurtig" |
295 | 308 | |
296 | #: ../../code/menudef.cpp:171 | |
309 | #: ../../code/menudef.cpp:253 | |
297 | 310 | msgid "Faster" |
298 | 311 | msgstr "Hurtigere" |
299 | 312 | |
300 | #: ../../code/menudef.cpp:172 | |
313 | #: ../../code/menudef.cpp:254 | |
301 | 314 | msgid "Even faster" |
302 | 315 | msgstr "Endnu hurtigere" |
303 | 316 | |
304 | #: ../../code/menudef.cpp:173 | |
317 | #: ../../code/menudef.cpp:255 | |
305 | 318 | msgid "Fastest" |
306 | 319 | msgstr "Hurtigst" |
307 | 320 | |
308 | #: ../../code/menudef.cpp:215 | |
321 | #: ../../code/menudef.cpp:297 | |
309 | 322 | msgid "Always use software render: On" |
310 | 323 | msgstr "Brug altid software tilstand: Til" |
311 | 324 | |
312 | #: ../../code/menudef.cpp:216 | |
325 | #: ../../code/menudef.cpp:298 | |
313 | 326 | msgid "Always use software render: Off" |
314 | 327 | msgstr "Brug altid software tilstand: Fra" |
315 | 328 | |
316 | #: ../../code/menudef.cpp:220 | |
317 | msgid "Music: On" | |
318 | msgstr "Musik: Til" | |
319 | ||
320 | #: ../../code/menudef.cpp:220 | |
329 | #: ../../code/menudef.cpp:324 | |
330 | msgid "Music: " | |
331 | msgstr "Musik: " | |
332 | ||
333 | #: ../../code/menudef.cpp:327 | |
321 | 334 | msgid "Music: Off" |
322 | 335 | msgstr "Musik: Fra" |
323 | 336 | |
324 | #: ../../code/menudef.cpp:224 | |
325 | msgid "Sound: On" | |
326 | msgstr "Lyd: Til" | |
327 | ||
328 | #: ../../code/menudef.cpp:224 | |
337 | #: ../../code/menudef.cpp:335 | |
338 | msgid "Sound: " | |
339 | msgstr "Lyd: " | |
340 | ||
341 | #: ../../code/menudef.cpp:338 | |
329 | 342 | msgid "Sound: Off" |
330 | 343 | msgstr "Lyd: Fra" |
331 | 344 | |
332 | #: ../../code/menudef.cpp:228 | |
345 | #: ../../code/menudef.cpp:343 | |
333 | 346 | msgid "Fullscreen: On" |
334 | 347 | msgstr "Fuldskærm: Til" |
335 | 348 | |
336 | #: ../../code/menudef.cpp:228 | |
349 | #: ../../code/menudef.cpp:343 | |
337 | 350 | msgid "Fullscreen: Off" |
338 | 351 | msgstr "Fuldskærm: Fra" |
339 | 352 | |
340 | #: ../../code/menudef.cpp:261 | |
353 | #: ../../code/menudef.cpp:355 | |
354 | msgid "Music volume" | |
355 | msgstr "Musik lydstyrke" | |
356 | ||
357 | #: ../../code/menudef.cpp:363 | |
358 | msgid "Sound volume" | |
359 | msgstr "Effekt lydstyrke" | |
360 | ||
361 | #: ../../code/menudef.cpp:378 | |
341 | 362 | msgid "Enter player 1 name:" |
342 | 363 | msgstr "Indtast navnet på spiller 1:" |
343 | 364 | |
344 | #: ../../code/menudef.cpp:267 | |
365 | #: ../../code/menudef.cpp:384 | |
345 | 366 | msgid "Enter player 2 name:" |
346 | 367 | msgstr "Indtast navnet på spiller 2:" |
347 | 368 | |
348 | #: ../../code/menudef.cpp:277 | |
369 | #: ../../code/menudef.cpp:394 | |
349 | 370 | msgid "Change key bindings" |
350 | 371 | msgstr "Skift taster" |
351 | 372 | |
352 | #: ../../code/menudef.cpp:278 | |
373 | #: ../../code/menudef.cpp:395 | |
353 | 374 | msgid "Left" |
354 | 375 | msgstr "Venstre" |
355 | 376 | |
356 | #: ../../code/menudef.cpp:279 | |
377 | #: ../../code/menudef.cpp:396 | |
357 | 378 | msgid "Right" |
358 | 379 | msgstr "Højre" |
359 | 380 | |
360 | #: ../../code/menudef.cpp:280 | |
381 | #: ../../code/menudef.cpp:397 | |
361 | 382 | msgid "Up" |
362 | 383 | msgstr "Op" |
363 | 384 | |
364 | #: ../../code/menudef.cpp:281 | |
385 | #: ../../code/menudef.cpp:398 | |
365 | 386 | msgid "Down" |
366 | 387 | msgstr "Ned" |
367 | 388 | |
368 | #: ../../code/menudef.cpp:282 | |
389 | #: ../../code/menudef.cpp:399 | |
369 | 390 | msgid "Push" |
370 | 391 | msgstr "Skub" |
371 | 392 | |
372 | #: ../../code/menudef.cpp:283 | |
393 | #: ../../code/menudef.cpp:400 | |
373 | 394 | msgid "Change" |
374 | 395 | msgstr "Skift" |
375 | 396 | |
376 | #: ../../code/menudef.cpp:302 | |
397 | #: ../../code/menudef.cpp:419 ../../code/menudef.cpp:450 | |
398 | msgid "Player configuration" | |
399 | msgstr "Spiller konfiguration" | |
400 | ||
401 | #: ../../code/menudef.cpp:423 | |
402 | msgid "Change player 1's name" | |
403 | msgstr "Skift navn på spiller 1" | |
404 | ||
405 | #: ../../code/menudef.cpp:425 | |
406 | msgid "Change player 2's name" | |
407 | msgstr "Skift navn på spiller 2" | |
408 | ||
409 | #: ../../code/menudef.cpp:427 | |
410 | msgid "Change player 1's keys" | |
411 | msgstr "Tildel taster til spiller 1" | |
412 | ||
413 | #: ../../code/menudef.cpp:429 | |
414 | msgid "Change player 2's keys" | |
415 | msgstr "Tildel taster til spiller 2" | |
416 | ||
417 | #: ../../code/menudef.cpp:443 | |
377 | 418 | msgid "Configuration" |
378 | 419 | msgstr "Konfiguration" |
379 | 420 | |
380 | #: ../../code/menudef.cpp:314 | |
381 | msgid "Change player 1's name" | |
382 | msgstr "Skift navn på spiller 1" | |
383 | ||
384 | #: ../../code/menudef.cpp:316 | |
385 | msgid "Change player 2's name" | |
386 | msgstr "Skift navn på spiller 2" | |
387 | ||
388 | #: ../../code/menudef.cpp:318 | |
389 | msgid "Change player 1's keys" | |
390 | msgstr "Tildel taster til spiller 1" | |
391 | ||
392 | #: ../../code/menudef.cpp:320 | |
393 | msgid "Change player 2's keys" | |
394 | msgstr "Tildel taster til spiller 2" | |
395 | ||
396 | #: ../../code/menudef.cpp:333 | |
421 | #: ../../code/menudef.cpp:452 | |
422 | msgid "Configure mods" | |
423 | msgstr "Mods" | |
424 | ||
425 | #: ../../code/menudef.cpp:468 | |
397 | 426 | msgid "Single player VS" |
398 | 427 | msgstr "En spiller - VS" |
399 | 428 | |
400 | #: ../../code/menudef.cpp:349 | |
429 | #: ../../code/menudef.cpp:484 | |
401 | 430 | msgid "Very easy" |
402 | 431 | msgstr "Meget let" |
403 | 432 | |
404 | #: ../../code/menudef.cpp:350 | |
433 | #: ../../code/menudef.cpp:485 | |
405 | 434 | msgid "Easy" |
406 | 435 | msgstr "Let" |
407 | 436 | |
408 | #: ../../code/menudef.cpp:351 | |
437 | #: ../../code/menudef.cpp:486 | |
409 | 438 | msgid "Below normal" |
410 | 439 | msgstr "Under normal" |
411 | 440 | |
412 | #: ../../code/menudef.cpp:352 | |
441 | #: ../../code/menudef.cpp:487 | |
413 | 442 | msgid "Normal" |
414 | 443 | msgstr "Normal" |
415 | 444 | |
416 | #: ../../code/menudef.cpp:353 | |
445 | #: ../../code/menudef.cpp:488 | |
417 | 446 | msgid "Above normal" |
418 | 447 | msgstr "Over normal" |
419 | 448 | |
420 | #: ../../code/menudef.cpp:354 | |
449 | #: ../../code/menudef.cpp:489 | |
421 | 450 | msgid "Hard" |
422 | 451 | msgstr "Svær" |
423 | 452 | |
424 | #: ../../code/menudef.cpp:355 | |
453 | #: ../../code/menudef.cpp:490 | |
425 | 454 | msgid "Hardest" |
426 | 455 | msgstr "Meget svær" |
427 | 456 | |
428 | #: ../../code/menudef.cpp:367 | |
457 | #: ../../code/menudef.cpp:502 | |
429 | 458 | msgid "Multiplayer" |
430 | 459 | msgstr "Flerspiller" |
431 | 460 | |
432 | #: ../../code/menudef.cpp:369 | |
461 | #: ../../code/menudef.cpp:504 | |
433 | 462 | msgid "Two player - time trial" |
434 | 463 | msgstr "To spillere - På tid" |
435 | 464 | |
436 | #: ../../code/menudef.cpp:371 | |
465 | #: ../../code/menudef.cpp:506 | |
437 | 466 | msgid "Two player - vs" |
438 | 467 | msgstr "To spillere - VS" |
439 | 468 | |
440 | #: ../../code/menudef.cpp:395 ../../code/menudef.cpp:410 | |
469 | #: ../../code/menudef.cpp:530 ../../code/menudef.cpp:545 | |
441 | 470 | msgid "Credits" |
442 | 471 | msgstr "Bidragydere" |
443 | 472 | |
444 | #: ../../code/menudef.cpp:400 ../../code/menudef.cpp:471 | |
473 | #: ../../code/menudef.cpp:535 ../../code/menudef.cpp:608 | |
445 | 474 | msgid "Help" |
446 | 475 | msgstr "Hjælp" |
447 | 476 | |
448 | #: ../../code/menudef.cpp:402 | |
477 | #: ../../code/menudef.cpp:537 | |
449 | 478 | msgid "How to" |
450 | 479 | msgstr "Guide" |
451 | 480 | |
452 | #: ../../code/menudef.cpp:406 | |
481 | #: ../../code/menudef.cpp:541 | |
453 | 482 | msgid "Gamepad" |
454 | 483 | msgstr "Spilkontroller" |
455 | 484 | |
456 | #: ../../code/menudef.cpp:421 ../../code/menudef.cpp:463 | |
485 | #: ../../code/menudef.cpp:556 ../../code/menudef.cpp:600 | |
457 | 486 | msgid "Single player" |
458 | 487 | msgstr "Enkeltspiller" |
459 | 488 | |
460 | #: ../../code/menudef.cpp:423 | |
489 | #: ../../code/menudef.cpp:558 | |
461 | 490 | msgid "Single player - endless" |
462 | 491 | msgstr "En spiller - Evighed" |
463 | 492 | |
464 | #: ../../code/menudef.cpp:425 | |
493 | #: ../../code/menudef.cpp:560 | |
465 | 494 | msgid "Single player - time trial" |
466 | 495 | msgstr "En spiller - På tid" |
467 | 496 | |
468 | #: ../../code/menudef.cpp:427 | |
497 | #: ../../code/menudef.cpp:562 | |
469 | 498 | msgid "Single player - stage clear" |
470 | 499 | msgstr "En spiller - Stage Clear" |
471 | 500 | |
472 | #: ../../code/menudef.cpp:429 | |
501 | #: ../../code/menudef.cpp:564 | |
473 | 502 | msgid "Single player - puzzle mode" |
474 | 503 | msgstr "En spiller - Gåde" |
475 | 504 | |
476 | #: ../../code/menudef.cpp:431 | |
505 | #: ../../code/menudef.cpp:566 | |
477 | 506 | msgid "Single player - vs" |
478 | 507 | msgstr "En spiller - VS" |
479 | 508 | |
480 | #: ../../code/menudef.cpp:446 | |
509 | #: ../../code/menudef.cpp:581 | |
481 | 510 | msgid "Game did not shutdown as it should" |
482 | 511 | msgstr "Spillet blev ikke afsluttet korrekt" |
483 | 512 | |
484 | #: ../../code/menudef.cpp:449 | |
513 | #: ../../code/menudef.cpp:584 | |
485 | 514 | msgid "Use software renderer this time" |
486 | 515 | msgstr "Brug software tilstand denne gang" |
487 | 516 | |
488 | #: ../../code/menudef.cpp:450 | |
517 | #: ../../code/menudef.cpp:585 | |
489 | 518 | msgid "Always use software renderer" |
490 | 519 | msgstr "Start altid i software tilstand" |
491 | 520 | |
492 | #: ../../code/menudef.cpp:461 | |
521 | #: ../../code/menudef.cpp:598 | |
493 | 522 | msgid "Block Attack - Rise of the blocks" |
494 | 523 | msgstr "Block Attack - Blokkenes opstand" |
495 | 524 | |
496 | #: ../../code/menudef.cpp:465 | |
525 | #: ../../code/menudef.cpp:602 | |
497 | 526 | msgid "Multi player" |
498 | 527 | msgstr "Flere spillere" |
499 | 528 | |
500 | #: ../../code/menudef.cpp:467 | |
529 | #: ../../code/menudef.cpp:604 | |
501 | 530 | msgid "Configure" |
502 | 531 | msgstr "Instillinger" |
503 | 532 | |
504 | #: ../../code/menudef.cpp:469 | |
533 | #: ../../code/menudef.cpp:606 | |
505 | 534 | msgid "Highscores" |
506 | 535 | msgstr "Bedste resultater" |
507 | 536 | |
508 | #: ../../code/MenuSystem.cpp:159 ../../code/MenuSystem.cpp:167 | |
509 | #: ../../code/MenuSystem.cpp:179 ../../code/ScoresDisplay.cpp:220 | |
537 | #: ../../code/MenuSystem.cpp:147 ../../code/MenuSystem.cpp:152 | |
538 | #: ../../code/MenuSystem.cpp:161 ../../code/ScoresDisplay.cpp:220 | |
510 | 539 | msgid "Back" |
511 | 540 | msgstr "Tilbage" |
512 | 541 | |
513 | #: ../../code/MenuSystem.cpp:170 ../../code/MenuSystem.cpp:182 | |
542 | #: ../../code/MenuSystem.cpp:155 ../../code/MenuSystem.cpp:164 | |
514 | 543 | msgid "Exit" |
515 | 544 | msgstr "Afslut" |
516 | 545 | |
517 | #: ../../code/os.cpp:101 | |
546 | #: ../../code/ModConfigMenuState.cpp:90 | |
547 | msgid "Mod config" | |
548 | msgstr "Mods" | |
549 | ||
550 | #: ../../code/ModConfigMenuState.cpp:93 | |
551 | msgid "Yes" | |
552 | msgstr "Ja" | |
553 | ||
554 | #: ../../code/ModConfigMenuState.cpp:93 | |
555 | msgid "No" | |
556 | msgstr "Nej" | |
557 | ||
558 | #: ../../code/os.cpp:103 | |
518 | 559 | msgid "Player 1" |
519 | 560 | msgstr "Spiller 1" |
520 | 561 | |
623 | 664 | msgid "Skip" |
624 | 665 | msgstr "Spring over" |
625 | 666 | |
626 | #: ../../code/BlockGameSdl.inc:328 | |
667 | #: ../../code/BlockGameSdl.inc:420 | |
627 | 668 | msgid "Moves left: " |
628 | 669 | msgstr "Træk tilbage: " |
629 | 670 | |
630 | #: ../../code/BlockGameSdl.inc:351 | |
671 | #: ../../code/BlockGameSdl.inc:443 | |
631 | 672 | msgid "Last puzzle" |
632 | 673 | msgstr "Sidste gåde" |
633 | 674 | |
634 | #: ../../code/BlockGameSdl.inc:371 | |
675 | #: ../../code/BlockGameSdl.inc:463 | |
635 | 676 | msgid "Last stage" |
636 | 677 | msgstr "Sidste bane" |
637 | 678 | |
643 | 684 | #, c-format |
644 | 685 | msgid "Showing content of: %s" |
645 | 686 | msgstr "Viser indhold af: %s" |
687 | ||
688 | #, fuzzy | |
689 | #~| msgid "Sound: Off" | |
690 | #~ msgid "Volume: Off" | |
691 | #~ msgstr "Lyd: Fra" |
7 | 7 | msgstr "" |
8 | 8 | "Project-Id-Version: PACKAGE VERSION\n" |
9 | 9 | "Report-Msgid-Bugs-To: \n" |
10 | "POT-Creation-Date: 2020-06-27 14:06+0200\n" | |
10 | "POT-Creation-Date: 2021-10-18 21:20+0200\n" | |
11 | 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
12 | 12 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
13 | 13 | "Language-Team: LANGUAGE <LL@li.org>\n" |
16 | 16 | "Content-Type: text/plain; charset=CHARSET\n" |
17 | 17 | "Content-Transfer-Encoding: 8bit\n" |
18 | 18 | |
19 | #: ../../code/DialogBox.cpp:94 | |
19 | #: ../../code/DialogBox.cpp:131 | |
20 | 20 | msgid "Enter to accept" |
21 | 21 | msgstr "" |
22 | 22 | |
23 | #: ../../code/DialogBox.cpp:95 | |
23 | #: ../../code/DialogBox.cpp:132 | |
24 | 24 | msgid "Esc to cancel" |
25 | 25 | msgstr "" |
26 | 26 | |
27 | #: ../../code/HelpAboutState.cpp:62 | |
28 | msgid "No audio driver" | |
29 | msgstr "" | |
30 | ||
31 | #: ../../code/HelpAboutState.cpp:65 | |
32 | msgid "Name:" | |
33 | msgstr "" | |
34 | ||
35 | #: ../../code/HelpAboutState.cpp:65 ../../code/main.cpp:337 | |
36 | msgid "Block Attack - Rise of the Blocks" | |
37 | msgstr "" | |
38 | ||
39 | #: ../../code/HelpAboutState.cpp:66 | |
40 | msgid "Original name:" | |
41 | msgstr "" | |
42 | ||
43 | #: ../../code/HelpAboutState.cpp:67 | |
44 | msgid "Version:" | |
45 | msgstr "" | |
46 | ||
27 | 47 | #: ../../code/HelpAboutState.cpp:68 |
28 | msgid "No audio driver" | |
48 | msgid "Homepage:" | |
49 | msgstr "" | |
50 | ||
51 | #: ../../code/HelpAboutState.cpp:69 | |
52 | msgid "Github page:" | |
53 | msgstr "" | |
54 | ||
55 | #: ../../code/HelpAboutState.cpp:70 | |
56 | msgid "SDL render:" | |
29 | 57 | msgstr "" |
30 | 58 | |
31 | 59 | #: ../../code/HelpAboutState.cpp:71 |
32 | msgid "Name:" | |
33 | msgstr "" | |
34 | ||
35 | #: ../../code/HelpAboutState.cpp:71 ../../code/main.cpp:329 | |
36 | msgid "Block Attack - Rise of the Blocks" | |
60 | msgid "SDL audio driver:" | |
37 | 61 | msgstr "" |
38 | 62 | |
39 | 63 | #: ../../code/HelpAboutState.cpp:72 |
40 | msgid "Original name:" | |
64 | msgid "SDL compiled version:" | |
41 | 65 | msgstr "" |
42 | 66 | |
43 | 67 | #: ../../code/HelpAboutState.cpp:73 |
44 | msgid "Version:" | |
68 | msgid "SDL linked version:" | |
45 | 69 | msgstr "" |
46 | 70 | |
47 | 71 | #: ../../code/HelpAboutState.cpp:74 |
48 | msgid "Homepage:" | |
72 | msgid "Save folder:" | |
49 | 73 | msgstr "" |
50 | 74 | |
51 | 75 | #: ../../code/HelpAboutState.cpp:75 |
52 | msgid "Github page:" | |
53 | msgstr "" | |
54 | ||
55 | #: ../../code/HelpAboutState.cpp:76 | |
56 | msgid "SDL render:" | |
57 | msgstr "" | |
58 | ||
59 | #: ../../code/HelpAboutState.cpp:77 | |
60 | msgid "SDL audio driver:" | |
61 | msgstr "" | |
62 | ||
63 | #: ../../code/HelpAboutState.cpp:78 | |
64 | msgid "SDL compiled version:" | |
65 | msgstr "" | |
66 | ||
67 | #: ../../code/HelpAboutState.cpp:79 | |
68 | msgid "SDL linked version:" | |
69 | msgstr "" | |
70 | ||
71 | #: ../../code/HelpAboutState.cpp:80 | |
72 | msgid "Save folder:" | |
73 | msgstr "" | |
74 | ||
75 | #: ../../code/HelpAboutState.cpp:81 | |
76 | 76 | msgid "Locale:" |
77 | 77 | msgstr "" |
78 | 78 | |
79 | #: ../../code/HelpAboutState.cpp:82 ../../code/menudef.cpp:414 | |
79 | #: ../../code/HelpAboutState.cpp:76 ../../code/menudef.cpp:549 | |
80 | 80 | msgid "About" |
81 | 81 | msgstr "" |
82 | 82 | |
83 | #: ../../code/HelpGamepadState.cpp:52 | |
84 | msgid "Move cursor" | |
85 | msgstr "" | |
86 | ||
87 | #: ../../code/HelpGamepadState.cpp:53 | |
88 | msgid "Push line" | |
89 | msgstr "" | |
90 | ||
91 | #: ../../code/HelpGamepadState.cpp:54 | |
92 | msgid "Back (Menu)" | |
93 | msgstr "" | |
94 | ||
95 | #: ../../code/HelpGamepadState.cpp:55 | |
96 | msgid "Switch" | |
97 | msgstr "" | |
98 | ||
99 | #: ../../code/HelpGamepadState.cpp:56 | |
100 | msgid "Confirm" | |
101 | msgstr "" | |
102 | ||
103 | #: ../../code/HelpGamepadState.cpp:57 | |
83 | #: ../../code/HelpGamepadState.cpp:35 | |
104 | 84 | msgid "" |
105 | 85 | "Only SDL2 compatible controllers are supported!\n" |
106 | 86 | "Supported controllers: " |
107 | 87 | msgstr "" |
108 | 88 | |
89 | #: ../../code/HelpGamepadState.cpp:47 | |
90 | msgid "Move cursor" | |
91 | msgstr "" | |
92 | ||
93 | #: ../../code/HelpGamepadState.cpp:48 | |
94 | msgid "Push line" | |
95 | msgstr "" | |
96 | ||
97 | #: ../../code/HelpGamepadState.cpp:49 | |
98 | msgid "Back (Menu)" | |
99 | msgstr "" | |
100 | ||
101 | #: ../../code/HelpGamepadState.cpp:50 | |
102 | msgid "Switch" | |
103 | msgstr "" | |
104 | ||
105 | #: ../../code/HelpGamepadState.cpp:51 | |
106 | msgid "Confirm" | |
107 | msgstr "" | |
108 | ||
109 | 109 | #: ../../code/HelpHowtoState.cpp:125 |
110 | 110 | msgid "Switch block horizontally" |
111 | 111 | msgstr "" |
126 | 126 | msgid "Create a chain effect" |
127 | 127 | msgstr "" |
128 | 128 | |
129 | #: ../../code/levelselect.cpp:86 | |
129 | #: ../../code/levelselect.cpp:84 | |
130 | 130 | msgid "Select Puzzle" |
131 | 131 | msgstr "" |
132 | 132 | |
133 | #: ../../code/levelselect.cpp:89 | |
133 | #: ../../code/levelselect.cpp:87 | |
134 | 134 | msgid "Stage Clear Level Select" |
135 | 135 | msgstr "" |
136 | 136 | |
137 | #: ../../code/levelselect.cpp:195 | |
137 | #: ../../code/levelselect.cpp:193 | |
138 | 138 | #, c-format |
139 | 139 | msgid "Best score: %i" |
140 | 140 | msgstr "" |
141 | 141 | |
142 | #: ../../code/levelselect.cpp:196 | |
142 | #: ../../code/levelselect.cpp:194 | |
143 | 143 | #, c-format |
144 | 144 | msgid "Time used: %s" |
145 | 145 | msgstr "" |
146 | 146 | |
147 | #: ../../code/levelselect.cpp:199 | |
147 | #: ../../code/levelselect.cpp:197 | |
148 | 148 | #, c-format |
149 | 149 | msgid "Time used: %d : %02d" |
150 | 150 | msgstr "" |
151 | 151 | |
152 | #: ../../code/levelselect.cpp:204 | |
152 | #: ../../code/levelselect.cpp:202 | |
153 | 153 | #, c-format |
154 | 154 | msgid "Total score: %i in %i:%02i" |
155 | 155 | msgstr "" |
156 | 156 | |
157 | #: ../../code/main.cpp:158 | |
157 | #: ../../code/main.cpp:164 | |
158 | 158 | msgid "GAME OVER" |
159 | 159 | msgstr "" |
160 | 160 | |
161 | #: ../../code/main.cpp:159 | |
161 | #: ../../code/main.cpp:165 | |
162 | 162 | msgid "WINNER" |
163 | 163 | msgstr "" |
164 | 164 | |
165 | #: ../../code/main.cpp:160 | |
165 | #: ../../code/main.cpp:166 | |
166 | 166 | msgid "DRAW" |
167 | 167 | msgstr "" |
168 | 168 | |
169 | #: ../../code/main.cpp:497 ../../code/main.cpp:628 | |
169 | #: ../../code/main.cpp:491 ../../code/main.cpp:622 | |
170 | 170 | msgid "AI" |
171 | 171 | msgstr "" |
172 | 172 | |
173 | #: ../../code/main.cpp:500 | |
173 | #: ../../code/main.cpp:494 | |
174 | 174 | msgid "Playing field" |
175 | 175 | msgstr "" |
176 | 176 | |
177 | #: ../../code/main.cpp:568 | |
178 | msgid "Time Trial" | |
179 | msgstr "" | |
180 | ||
181 | #: ../../code/main.cpp:569 | |
182 | msgid "Score as much as possible in 2 minutes" | |
183 | msgstr "" | |
184 | ||
185 | #: ../../code/main.cpp:573 | |
186 | msgid "Stage Clear" | |
187 | msgstr "" | |
188 | ||
177 | 189 | #: ../../code/main.cpp:574 |
178 | msgid "Time Trial" | |
179 | msgstr "" | |
180 | ||
181 | #: ../../code/main.cpp:575 | |
182 | msgid "Score as much as possible in 2 minutes" | |
183 | msgstr "" | |
184 | ||
185 | #: ../../code/main.cpp:579 | |
186 | msgid "Stage Clear" | |
187 | msgstr "" | |
188 | ||
189 | #: ../../code/main.cpp:580 | |
190 | 190 | msgid "You must clear a number of lines. Speed is rapidly increased." |
191 | 191 | msgstr "" |
192 | 192 | |
193 | #: ../../code/main.cpp:583 | |
193 | #: ../../code/main.cpp:577 | |
194 | 194 | msgid "Puzzle" |
195 | 195 | msgstr "" |
196 | 196 | |
197 | #: ../../code/main.cpp:584 | |
197 | #: ../../code/main.cpp:578 | |
198 | 198 | msgid "Clear the entire board with a limited number of moves." |
199 | 199 | msgstr "" |
200 | 200 | |
201 | #: ../../code/main.cpp:587 | |
201 | #: ../../code/main.cpp:581 | |
202 | 202 | msgid "Endless" |
203 | 203 | msgstr "" |
204 | 204 | |
205 | #: ../../code/main.cpp:588 | |
205 | #: ../../code/main.cpp:582 | |
206 | 206 | msgid "Score as much as possible. No time limit." |
207 | 207 | msgstr "" |
208 | 208 | |
209 | #: ../../code/main.cpp:598 | |
209 | #: ../../code/main.cpp:592 | |
210 | 210 | msgid "Objective:" |
211 | 211 | msgstr "" |
212 | 212 | |
213 | #: ../../code/main.cpp:608 | |
213 | #: ../../code/main.cpp:602 | |
214 | 214 | msgid "Movement keys:" |
215 | 215 | msgstr "" |
216 | 216 | |
217 | #: ../../code/main.cpp:610 | |
217 | #: ../../code/main.cpp:604 | |
218 | 218 | msgid "Switch: " |
219 | 219 | msgstr "" |
220 | 220 | |
221 | #: ../../code/main.cpp:612 | |
221 | #: ../../code/main.cpp:606 | |
222 | 222 | msgid "Restart: " |
223 | 223 | msgstr "" |
224 | 224 | |
225 | #: ../../code/main.cpp:615 | |
225 | #: ../../code/main.cpp:609 | |
226 | 226 | msgid "Push line: " |
227 | 227 | msgstr "" |
228 | 228 | |
229 | #: ../../code/main.cpp:1050 | |
229 | #: ../../code/main.cpp:1073 | |
230 | 230 | msgid "Player 2" |
231 | 231 | msgstr "" |
232 | 232 | |
233 | #: ../../code/menudef.cpp:59 | |
234 | msgid "Up arrow" | |
235 | msgstr "" | |
236 | ||
233 | 237 | #: ../../code/menudef.cpp:62 |
234 | msgid "Up arrow" | |
238 | msgid "Down arrow" | |
235 | 239 | msgstr "" |
236 | 240 | |
237 | 241 | #: ../../code/menudef.cpp:65 |
238 | msgid "Down arrow" | |
242 | msgid "Left arrow" | |
239 | 243 | msgstr "" |
240 | 244 | |
241 | 245 | #: ../../code/menudef.cpp:68 |
242 | msgid "Left arrow" | |
246 | msgid "Right arrow" | |
243 | 247 | msgstr "" |
244 | 248 | |
245 | 249 | #: ../../code/menudef.cpp:71 |
246 | msgid "Right arrow" | |
250 | msgid "Right Ctrl" | |
247 | 251 | msgstr "" |
248 | 252 | |
249 | 253 | #: ../../code/menudef.cpp:74 |
250 | msgid "Right Ctrl" | |
254 | msgid "Left Ctrl" | |
251 | 255 | msgstr "" |
252 | 256 | |
253 | 257 | #: ../../code/menudef.cpp:77 |
254 | msgid "Left Ctrl" | |
258 | msgid "Right shift" | |
255 | 259 | msgstr "" |
256 | 260 | |
257 | 261 | #: ../../code/menudef.cpp:80 |
258 | msgid "Right shift" | |
262 | msgid "Left shift" | |
259 | 263 | msgstr "" |
260 | 264 | |
261 | 265 | #: ../../code/menudef.cpp:83 |
262 | msgid "Left shift" | |
266 | msgid "Right alt" | |
263 | 267 | msgstr "" |
264 | 268 | |
265 | 269 | #: ../../code/menudef.cpp:86 |
266 | msgid "Right alt" | |
270 | msgid "Left alt" | |
267 | 271 | msgstr "" |
268 | 272 | |
269 | 273 | #: ../../code/menudef.cpp:89 |
270 | msgid "Left alt" | |
274 | msgid "Return" | |
271 | 275 | msgstr "" |
272 | 276 | |
273 | 277 | #: ../../code/menudef.cpp:92 |
274 | msgid "Return" | |
275 | msgstr "" | |
276 | ||
277 | #: ../../code/menudef.cpp:95 | |
278 | 278 | msgid "Space" |
279 | 279 | msgstr "" |
280 | 280 | |
281 | #: ../../code/menudef.cpp:162 | |
281 | #: ../../code/menudef.cpp:149 | |
282 | #, c-format | |
283 | msgid "Volume: %d%%" | |
284 | msgstr "" | |
285 | ||
286 | #: ../../code/menudef.cpp:194 | |
287 | msgid "Test sound" | |
288 | msgstr "" | |
289 | ||
290 | #: ../../code/menudef.cpp:210 | |
291 | msgid "Test music" | |
292 | msgstr "" | |
293 | ||
294 | #: ../../code/menudef.cpp:244 | |
282 | 295 | msgid "Single Player Endless" |
283 | 296 | msgstr "" |
284 | 297 | |
285 | #: ../../code/menudef.cpp:169 | |
298 | #: ../../code/menudef.cpp:251 | |
286 | 299 | msgid "Slow" |
287 | 300 | msgstr "" |
288 | 301 | |
289 | #: ../../code/menudef.cpp:170 | |
302 | #: ../../code/menudef.cpp:252 | |
290 | 303 | msgid "Fast" |
291 | 304 | msgstr "" |
292 | 305 | |
293 | #: ../../code/menudef.cpp:171 | |
306 | #: ../../code/menudef.cpp:253 | |
294 | 307 | msgid "Faster" |
295 | 308 | msgstr "" |
296 | 309 | |
297 | #: ../../code/menudef.cpp:172 | |
310 | #: ../../code/menudef.cpp:254 | |
298 | 311 | msgid "Even faster" |
299 | 312 | msgstr "" |
300 | 313 | |
301 | #: ../../code/menudef.cpp:173 | |
314 | #: ../../code/menudef.cpp:255 | |
302 | 315 | msgid "Fastest" |
303 | 316 | msgstr "" |
304 | 317 | |
305 | #: ../../code/menudef.cpp:215 | |
318 | #: ../../code/menudef.cpp:297 | |
306 | 319 | msgid "Always use software render: On" |
307 | 320 | msgstr "" |
308 | 321 | |
309 | #: ../../code/menudef.cpp:216 | |
322 | #: ../../code/menudef.cpp:298 | |
310 | 323 | msgid "Always use software render: Off" |
311 | 324 | msgstr "" |
312 | 325 | |
313 | #: ../../code/menudef.cpp:220 | |
314 | msgid "Music: On" | |
315 | msgstr "" | |
316 | ||
317 | #: ../../code/menudef.cpp:220 | |
326 | #: ../../code/menudef.cpp:324 | |
327 | msgid "Music: " | |
328 | msgstr "" | |
329 | ||
330 | #: ../../code/menudef.cpp:327 | |
318 | 331 | msgid "Music: Off" |
319 | 332 | msgstr "" |
320 | 333 | |
321 | #: ../../code/menudef.cpp:224 | |
322 | msgid "Sound: On" | |
323 | msgstr "" | |
324 | ||
325 | #: ../../code/menudef.cpp:224 | |
334 | #: ../../code/menudef.cpp:335 | |
335 | msgid "Sound: " | |
336 | msgstr "" | |
337 | ||
338 | #: ../../code/menudef.cpp:338 | |
326 | 339 | msgid "Sound: Off" |
327 | 340 | msgstr "" |
328 | 341 | |
329 | #: ../../code/menudef.cpp:228 | |
342 | #: ../../code/menudef.cpp:343 | |
330 | 343 | msgid "Fullscreen: On" |
331 | 344 | msgstr "" |
332 | 345 | |
333 | #: ../../code/menudef.cpp:228 | |
346 | #: ../../code/menudef.cpp:343 | |
334 | 347 | msgid "Fullscreen: Off" |
335 | 348 | msgstr "" |
336 | 349 | |
337 | #: ../../code/menudef.cpp:261 | |
350 | #: ../../code/menudef.cpp:355 | |
351 | msgid "Music volume" | |
352 | msgstr "" | |
353 | ||
354 | #: ../../code/menudef.cpp:363 | |
355 | msgid "Sound volume" | |
356 | msgstr "" | |
357 | ||
358 | #: ../../code/menudef.cpp:378 | |
338 | 359 | msgid "Enter player 1 name:" |
339 | 360 | msgstr "" |
340 | 361 | |
341 | #: ../../code/menudef.cpp:267 | |
362 | #: ../../code/menudef.cpp:384 | |
342 | 363 | msgid "Enter player 2 name:" |
343 | 364 | msgstr "" |
344 | 365 | |
345 | #: ../../code/menudef.cpp:277 | |
366 | #: ../../code/menudef.cpp:394 | |
346 | 367 | msgid "Change key bindings" |
347 | 368 | msgstr "" |
348 | 369 | |
349 | #: ../../code/menudef.cpp:278 | |
370 | #: ../../code/menudef.cpp:395 | |
350 | 371 | msgid "Left" |
351 | 372 | msgstr "" |
352 | 373 | |
353 | #: ../../code/menudef.cpp:279 | |
374 | #: ../../code/menudef.cpp:396 | |
354 | 375 | msgid "Right" |
355 | 376 | msgstr "" |
356 | 377 | |
357 | #: ../../code/menudef.cpp:280 | |
378 | #: ../../code/menudef.cpp:397 | |
358 | 379 | msgid "Up" |
359 | 380 | msgstr "" |
360 | 381 | |
361 | #: ../../code/menudef.cpp:281 | |
382 | #: ../../code/menudef.cpp:398 | |
362 | 383 | msgid "Down" |
363 | 384 | msgstr "" |
364 | 385 | |
365 | #: ../../code/menudef.cpp:282 | |
386 | #: ../../code/menudef.cpp:399 | |
366 | 387 | msgid "Push" |
367 | 388 | msgstr "" |
368 | 389 | |
369 | #: ../../code/menudef.cpp:283 | |
390 | #: ../../code/menudef.cpp:400 | |
370 | 391 | msgid "Change" |
371 | 392 | msgstr "" |
372 | 393 | |
373 | #: ../../code/menudef.cpp:302 | |
394 | #: ../../code/menudef.cpp:419 ../../code/menudef.cpp:450 | |
395 | msgid "Player configuration" | |
396 | msgstr "" | |
397 | ||
398 | #: ../../code/menudef.cpp:423 | |
399 | msgid "Change player 1's name" | |
400 | msgstr "" | |
401 | ||
402 | #: ../../code/menudef.cpp:425 | |
403 | msgid "Change player 2's name" | |
404 | msgstr "" | |
405 | ||
406 | #: ../../code/menudef.cpp:427 | |
407 | msgid "Change player 1's keys" | |
408 | msgstr "" | |
409 | ||
410 | #: ../../code/menudef.cpp:429 | |
411 | msgid "Change player 2's keys" | |
412 | msgstr "" | |
413 | ||
414 | #: ../../code/menudef.cpp:443 | |
374 | 415 | msgid "Configuration" |
375 | 416 | msgstr "" |
376 | 417 | |
377 | #: ../../code/menudef.cpp:314 | |
378 | msgid "Change player 1's name" | |
379 | msgstr "" | |
380 | ||
381 | #: ../../code/menudef.cpp:316 | |
382 | msgid "Change player 2's name" | |
383 | msgstr "" | |
384 | ||
385 | #: ../../code/menudef.cpp:318 | |
386 | msgid "Change player 1's keys" | |
387 | msgstr "" | |
388 | ||
389 | #: ../../code/menudef.cpp:320 | |
390 | msgid "Change player 2's keys" | |
391 | msgstr "" | |
392 | ||
393 | #: ../../code/menudef.cpp:333 | |
418 | #: ../../code/menudef.cpp:452 | |
419 | msgid "Configure mods" | |
420 | msgstr "" | |
421 | ||
422 | #: ../../code/menudef.cpp:468 | |
394 | 423 | msgid "Single player VS" |
395 | 424 | msgstr "" |
396 | 425 | |
397 | #: ../../code/menudef.cpp:349 | |
426 | #: ../../code/menudef.cpp:484 | |
398 | 427 | msgid "Very easy" |
399 | 428 | msgstr "" |
400 | 429 | |
401 | #: ../../code/menudef.cpp:350 | |
430 | #: ../../code/menudef.cpp:485 | |
402 | 431 | msgid "Easy" |
403 | 432 | msgstr "" |
404 | 433 | |
405 | #: ../../code/menudef.cpp:351 | |
434 | #: ../../code/menudef.cpp:486 | |
406 | 435 | msgid "Below normal" |
407 | 436 | msgstr "" |
408 | 437 | |
409 | #: ../../code/menudef.cpp:352 | |
438 | #: ../../code/menudef.cpp:487 | |
410 | 439 | msgid "Normal" |
411 | 440 | msgstr "" |
412 | 441 | |
413 | #: ../../code/menudef.cpp:353 | |
442 | #: ../../code/menudef.cpp:488 | |
414 | 443 | msgid "Above normal" |
415 | 444 | msgstr "" |
416 | 445 | |
417 | #: ../../code/menudef.cpp:354 | |
446 | #: ../../code/menudef.cpp:489 | |
418 | 447 | msgid "Hard" |
419 | 448 | msgstr "" |
420 | 449 | |
421 | #: ../../code/menudef.cpp:355 | |
450 | #: ../../code/menudef.cpp:490 | |
422 | 451 | msgid "Hardest" |
423 | 452 | msgstr "" |
424 | 453 | |
425 | #: ../../code/menudef.cpp:367 | |
454 | #: ../../code/menudef.cpp:502 | |
426 | 455 | msgid "Multiplayer" |
427 | 456 | msgstr "" |
428 | 457 | |
429 | #: ../../code/menudef.cpp:369 | |
458 | #: ../../code/menudef.cpp:504 | |
430 | 459 | msgid "Two player - time trial" |
431 | 460 | msgstr "" |
432 | 461 | |
433 | #: ../../code/menudef.cpp:371 | |
462 | #: ../../code/menudef.cpp:506 | |
434 | 463 | msgid "Two player - vs" |
435 | 464 | msgstr "" |
436 | 465 | |
437 | #: ../../code/menudef.cpp:395 ../../code/menudef.cpp:410 | |
466 | #: ../../code/menudef.cpp:530 ../../code/menudef.cpp:545 | |
438 | 467 | msgid "Credits" |
439 | 468 | msgstr "" |
440 | 469 | |
441 | #: ../../code/menudef.cpp:400 ../../code/menudef.cpp:471 | |
470 | #: ../../code/menudef.cpp:535 ../../code/menudef.cpp:608 | |
442 | 471 | msgid "Help" |
443 | 472 | msgstr "" |
444 | 473 | |
445 | #: ../../code/menudef.cpp:402 | |
474 | #: ../../code/menudef.cpp:537 | |
446 | 475 | msgid "How to" |
447 | 476 | msgstr "" |
448 | 477 | |
449 | #: ../../code/menudef.cpp:406 | |
478 | #: ../../code/menudef.cpp:541 | |
450 | 479 | msgid "Gamepad" |
451 | 480 | msgstr "" |
452 | 481 | |
453 | #: ../../code/menudef.cpp:421 ../../code/menudef.cpp:463 | |
482 | #: ../../code/menudef.cpp:556 ../../code/menudef.cpp:600 | |
454 | 483 | msgid "Single player" |
455 | 484 | msgstr "" |
456 | 485 | |
457 | #: ../../code/menudef.cpp:423 | |
486 | #: ../../code/menudef.cpp:558 | |
458 | 487 | msgid "Single player - endless" |
459 | 488 | msgstr "" |
460 | 489 | |
461 | #: ../../code/menudef.cpp:425 | |
490 | #: ../../code/menudef.cpp:560 | |
462 | 491 | msgid "Single player - time trial" |
463 | 492 | msgstr "" |
464 | 493 | |
465 | #: ../../code/menudef.cpp:427 | |
494 | #: ../../code/menudef.cpp:562 | |
466 | 495 | msgid "Single player - stage clear" |
467 | 496 | msgstr "" |
468 | 497 | |
469 | #: ../../code/menudef.cpp:429 | |
498 | #: ../../code/menudef.cpp:564 | |
470 | 499 | msgid "Single player - puzzle mode" |
471 | 500 | msgstr "" |
472 | 501 | |
473 | #: ../../code/menudef.cpp:431 | |
502 | #: ../../code/menudef.cpp:566 | |
474 | 503 | msgid "Single player - vs" |
475 | 504 | msgstr "" |
476 | 505 | |
477 | #: ../../code/menudef.cpp:446 | |
506 | #: ../../code/menudef.cpp:581 | |
478 | 507 | msgid "Game did not shutdown as it should" |
479 | 508 | msgstr "" |
480 | 509 | |
481 | #: ../../code/menudef.cpp:449 | |
510 | #: ../../code/menudef.cpp:584 | |
482 | 511 | msgid "Use software renderer this time" |
483 | 512 | msgstr "" |
484 | 513 | |
485 | #: ../../code/menudef.cpp:450 | |
514 | #: ../../code/menudef.cpp:585 | |
486 | 515 | msgid "Always use software renderer" |
487 | 516 | msgstr "" |
488 | 517 | |
489 | #: ../../code/menudef.cpp:461 | |
518 | #: ../../code/menudef.cpp:598 | |
490 | 519 | msgid "Block Attack - Rise of the blocks" |
491 | 520 | msgstr "" |
492 | 521 | |
493 | #: ../../code/menudef.cpp:465 | |
522 | #: ../../code/menudef.cpp:602 | |
494 | 523 | msgid "Multi player" |
495 | 524 | msgstr "" |
496 | 525 | |
497 | #: ../../code/menudef.cpp:467 | |
526 | #: ../../code/menudef.cpp:604 | |
498 | 527 | msgid "Configure" |
499 | 528 | msgstr "" |
500 | 529 | |
501 | #: ../../code/menudef.cpp:469 | |
530 | #: ../../code/menudef.cpp:606 | |
502 | 531 | msgid "Highscores" |
503 | 532 | msgstr "" |
504 | 533 | |
505 | #: ../../code/MenuSystem.cpp:159 ../../code/MenuSystem.cpp:167 | |
506 | #: ../../code/MenuSystem.cpp:179 ../../code/ScoresDisplay.cpp:220 | |
534 | #: ../../code/MenuSystem.cpp:147 ../../code/MenuSystem.cpp:152 | |
535 | #: ../../code/MenuSystem.cpp:161 ../../code/ScoresDisplay.cpp:220 | |
507 | 536 | msgid "Back" |
508 | 537 | msgstr "" |
509 | 538 | |
510 | #: ../../code/MenuSystem.cpp:170 ../../code/MenuSystem.cpp:182 | |
539 | #: ../../code/MenuSystem.cpp:155 ../../code/MenuSystem.cpp:164 | |
511 | 540 | msgid "Exit" |
512 | 541 | msgstr "" |
513 | 542 | |
514 | #: ../../code/os.cpp:101 | |
543 | #: ../../code/ModConfigMenuState.cpp:90 | |
544 | msgid "Mod config" | |
545 | msgstr "" | |
546 | ||
547 | #: ../../code/ModConfigMenuState.cpp:93 | |
548 | msgid "Yes" | |
549 | msgstr "" | |
550 | ||
551 | #: ../../code/ModConfigMenuState.cpp:93 | |
552 | msgid "No" | |
553 | msgstr "" | |
554 | ||
555 | #: ../../code/os.cpp:103 | |
515 | 556 | msgid "Player 1" |
516 | 557 | msgstr "" |
517 | 558 | |
620 | 661 | msgid "Skip" |
621 | 662 | msgstr "" |
622 | 663 | |
623 | #: ../../code/BlockGameSdl.inc:328 | |
664 | #: ../../code/BlockGameSdl.inc:420 | |
624 | 665 | msgid "Moves left: " |
625 | 666 | msgstr "" |
626 | 667 | |
627 | #: ../../code/BlockGameSdl.inc:351 | |
668 | #: ../../code/BlockGameSdl.inc:443 | |
628 | 669 | msgid "Last puzzle" |
629 | 670 | msgstr "" |
630 | 671 | |
631 | #: ../../code/BlockGameSdl.inc:371 | |
672 | #: ../../code/BlockGameSdl.inc:463 | |
632 | 673 | msgid "Last stage" |
633 | 674 | msgstr "" |
634 | 675 |
0 | // Copyright 2006 Nemanja Trifunovic | |
1 | ||
2 | /* | |
3 | Permission is hereby granted, free of charge, to any person or organization | |
4 | obtaining a copy of the software and accompanying documentation covered by | |
5 | this license (the "Software") to use, reproduce, display, distribute, | |
6 | execute, and transmit the Software, and to prepare derivative works of the | |
7 | Software, and to permit third-parties to whom the Software is furnished to | |
8 | do so, all subject to the following: | |
9 | ||
10 | The copyright notices in the Software and this entire statement, including | |
11 | the above license grant, this restriction and the following disclaimer, | |
12 | must be included in all copies of the Software, in whole or in part, and | |
13 | all derivative works of the Software, unless such copies or derivative | |
14 | works are solely in the form of machine-executable object code generated by | |
15 | a source language processor. | |
16 | ||
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | |
20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | |
21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | |
22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
23 | DEALINGS IN THE SOFTWARE. | |
24 | */ | |
25 | ||
26 | ||
27 | #ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
28 | #define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
29 | ||
30 | #include "core.h" | |
31 | #include <stdexcept> | |
32 | ||
33 | namespace utf8 | |
34 | { | |
35 | // Base for the exceptions that may be thrown from the library | |
36 | class exception : public ::std::exception { | |
37 | }; | |
38 | ||
39 | // Exceptions that may be thrown from the library functions. | |
40 | class invalid_code_point : public exception { | |
41 | uint32_t cp; | |
42 | public: | |
43 | invalid_code_point(uint32_t cp) : cp(cp) {} | |
44 | virtual const char* what() const throw() { return "Invalid code point"; } | |
45 | uint32_t code_point() const {return cp;} | |
46 | }; | |
47 | ||
48 | class invalid_utf8 : public exception { | |
49 | uint8_t u8; | |
50 | public: | |
51 | invalid_utf8 (uint8_t u) : u8(u) {} | |
52 | virtual const char* what() const throw() { return "Invalid UTF-8"; } | |
53 | uint8_t utf8_octet() const {return u8;} | |
54 | }; | |
55 | ||
56 | class invalid_utf16 : public exception { | |
57 | uint16_t u16; | |
58 | public: | |
59 | invalid_utf16 (uint16_t u) : u16(u) {} | |
60 | virtual const char* what() const throw() { return "Invalid UTF-16"; } | |
61 | uint16_t utf16_word() const {return u16;} | |
62 | }; | |
63 | ||
64 | class not_enough_room : public exception { | |
65 | public: | |
66 | virtual const char* what() const throw() { return "Not enough space"; } | |
67 | }; | |
68 | ||
69 | /// The library API - functions intended to be called by the users | |
70 | ||
71 | template <typename octet_iterator> | |
72 | octet_iterator append(uint32_t cp, octet_iterator result) | |
73 | { | |
74 | if (!utf8::internal::is_code_point_valid(cp)) | |
75 | throw invalid_code_point(cp); | |
76 | ||
77 | if (cp < 0x80) // one octet | |
78 | *(result++) = static_cast<uint8_t>(cp); | |
79 | else if (cp < 0x800) { // two octets | |
80 | *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0); | |
81 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
82 | } | |
83 | else if (cp < 0x10000) { // three octets | |
84 | *(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0); | |
85 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); | |
86 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
87 | } | |
88 | else { // four octets | |
89 | *(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0); | |
90 | *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f) | 0x80); | |
91 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); | |
92 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
93 | } | |
94 | return result; | |
95 | } | |
96 | ||
97 | template <typename octet_iterator, typename output_iterator> | |
98 | output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) | |
99 | { | |
100 | while (start != end) { | |
101 | octet_iterator sequence_start = start; | |
102 | internal::utf_error err_code = utf8::internal::validate_next(start, end); | |
103 | switch (err_code) { | |
104 | case internal::UTF8_OK : | |
105 | for (octet_iterator it = sequence_start; it != start; ++it) | |
106 | *out++ = *it; | |
107 | break; | |
108 | case internal::NOT_ENOUGH_ROOM: | |
109 | throw not_enough_room(); | |
110 | case internal::INVALID_LEAD: | |
111 | out = utf8::append (replacement, out); | |
112 | ++start; | |
113 | break; | |
114 | case internal::INCOMPLETE_SEQUENCE: | |
115 | case internal::OVERLONG_SEQUENCE: | |
116 | case internal::INVALID_CODE_POINT: | |
117 | out = utf8::append (replacement, out); | |
118 | ++start; | |
119 | // just one replacement mark for the sequence | |
120 | while (start != end && utf8::internal::is_trail(*start)) | |
121 | ++start; | |
122 | break; | |
123 | } | |
124 | } | |
125 | return out; | |
126 | } | |
127 | ||
128 | template <typename octet_iterator, typename output_iterator> | |
129 | inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) | |
130 | { | |
131 | static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); | |
132 | return utf8::replace_invalid(start, end, out, replacement_marker); | |
133 | } | |
134 | ||
135 | template <typename octet_iterator> | |
136 | uint32_t next(octet_iterator& it, octet_iterator end) | |
137 | { | |
138 | uint32_t cp = 0; | |
139 | internal::utf_error err_code = utf8::internal::validate_next(it, end, cp); | |
140 | switch (err_code) { | |
141 | case internal::UTF8_OK : | |
142 | break; | |
143 | case internal::NOT_ENOUGH_ROOM : | |
144 | throw not_enough_room(); | |
145 | case internal::INVALID_LEAD : | |
146 | case internal::INCOMPLETE_SEQUENCE : | |
147 | case internal::OVERLONG_SEQUENCE : | |
148 | throw invalid_utf8(*it); | |
149 | case internal::INVALID_CODE_POINT : | |
150 | throw invalid_code_point(cp); | |
151 | } | |
152 | return cp; | |
153 | } | |
154 | ||
155 | template <typename octet_iterator> | |
156 | uint32_t peek_next(octet_iterator it, octet_iterator end) | |
157 | { | |
158 | return utf8::next(it, end); | |
159 | } | |
160 | ||
161 | template <typename octet_iterator> | |
162 | uint32_t prior(octet_iterator& it, octet_iterator start) | |
163 | { | |
164 | // can't do much if it == start | |
165 | if (it == start) | |
166 | throw not_enough_room(); | |
167 | ||
168 | octet_iterator end = it; | |
169 | // Go back until we hit either a lead octet or start | |
170 | while (utf8::internal::is_trail(*(--it))) | |
171 | if (it == start) | |
172 | throw invalid_utf8(*it); // error - no lead byte in the sequence | |
173 | return utf8::peek_next(it, end); | |
174 | } | |
175 | ||
176 | /// Deprecated in versions that include "prior" | |
177 | template <typename octet_iterator> | |
178 | uint32_t previous(octet_iterator& it, octet_iterator pass_start) | |
179 | { | |
180 | octet_iterator end = it; | |
181 | while (utf8::internal::is_trail(*(--it))) | |
182 | if (it == pass_start) | |
183 | throw invalid_utf8(*it); // error - no lead byte in the sequence | |
184 | octet_iterator temp = it; | |
185 | return utf8::next(temp, end); | |
186 | } | |
187 | ||
188 | template <typename octet_iterator, typename distance_type> | |
189 | void advance (octet_iterator& it, distance_type n, octet_iterator end) | |
190 | { | |
191 | for (distance_type i = 0; i < n; ++i) | |
192 | utf8::next(it, end); | |
193 | } | |
194 | ||
195 | template <typename octet_iterator> | |
196 | typename std::iterator_traits<octet_iterator>::difference_type | |
197 | distance (octet_iterator first, octet_iterator last) | |
198 | { | |
199 | typename std::iterator_traits<octet_iterator>::difference_type dist; | |
200 | for (dist = 0; first < last; ++dist) | |
201 | utf8::next(first, last); | |
202 | return dist; | |
203 | } | |
204 | ||
205 | template <typename u16bit_iterator, typename octet_iterator> | |
206 | octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) | |
207 | { | |
208 | while (start != end) { | |
209 | uint32_t cp = utf8::internal::mask16(*start++); | |
210 | // Take care of surrogate pairs first | |
211 | if (utf8::internal::is_lead_surrogate(cp)) { | |
212 | if (start != end) { | |
213 | uint32_t trail_surrogate = utf8::internal::mask16(*start++); | |
214 | if (utf8::internal::is_trail_surrogate(trail_surrogate)) | |
215 | cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; | |
216 | else | |
217 | throw invalid_utf16(static_cast<uint16_t>(trail_surrogate)); | |
218 | } | |
219 | else | |
220 | throw invalid_utf16(static_cast<uint16_t>(cp)); | |
221 | ||
222 | } | |
223 | // Lone trail surrogate | |
224 | else if (utf8::internal::is_trail_surrogate(cp)) | |
225 | throw invalid_utf16(static_cast<uint16_t>(cp)); | |
226 | ||
227 | result = utf8::append(cp, result); | |
228 | } | |
229 | return result; | |
230 | } | |
231 | ||
232 | template <typename u16bit_iterator, typename octet_iterator> | |
233 | u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) | |
234 | { | |
235 | while (start != end) { | |
236 | uint32_t cp = utf8::next(start, end); | |
237 | if (cp > 0xffff) { //make a surrogate pair | |
238 | *result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET); | |
239 | *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); | |
240 | } | |
241 | else | |
242 | *result++ = static_cast<uint16_t>(cp); | |
243 | } | |
244 | return result; | |
245 | } | |
246 | ||
247 | template <typename octet_iterator, typename u32bit_iterator> | |
248 | octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) | |
249 | { | |
250 | while (start != end) | |
251 | result = utf8::append(*(start++), result); | |
252 | ||
253 | return result; | |
254 | } | |
255 | ||
256 | template <typename octet_iterator, typename u32bit_iterator> | |
257 | u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) | |
258 | { | |
259 | while (start != end) | |
260 | (*result++) = utf8::next(start, end); | |
261 | ||
262 | return result; | |
263 | } | |
264 | ||
265 | // The iterator class | |
266 | template <typename octet_iterator> | |
267 | class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> { | |
268 | octet_iterator it; | |
269 | octet_iterator range_start; | |
270 | octet_iterator range_end; | |
271 | public: | |
272 | iterator () {} | |
273 | explicit iterator (const octet_iterator& octet_it, | |
274 | const octet_iterator& range_start, | |
275 | const octet_iterator& range_end) : | |
276 | it(octet_it), range_start(range_start), range_end(range_end) | |
277 | { | |
278 | if (it < range_start || it > range_end) | |
279 | throw std::out_of_range("Invalid utf-8 iterator position"); | |
280 | } | |
281 | // the default "big three" are OK | |
282 | octet_iterator base () const { return it; } | |
283 | uint32_t operator * () const | |
284 | { | |
285 | octet_iterator temp = it; | |
286 | return utf8::next(temp, range_end); | |
287 | } | |
288 | bool operator == (const iterator& rhs) const | |
289 | { | |
290 | if (range_start != rhs.range_start || range_end != rhs.range_end) | |
291 | throw std::logic_error("Comparing utf-8 iterators defined with different ranges"); | |
292 | return (it == rhs.it); | |
293 | } | |
294 | bool operator != (const iterator& rhs) const | |
295 | { | |
296 | return !(operator == (rhs)); | |
297 | } | |
298 | iterator& operator ++ () | |
299 | { | |
300 | utf8::next(it, range_end); | |
301 | return *this; | |
302 | } | |
303 | iterator operator ++ (int) | |
304 | { | |
305 | iterator temp = *this; | |
306 | utf8::next(it, range_end); | |
307 | return temp; | |
308 | } | |
309 | iterator& operator -- () | |
310 | { | |
311 | utf8::prior(it, range_start); | |
312 | return *this; | |
313 | } | |
314 | iterator operator -- (int) | |
315 | { | |
316 | iterator temp = *this; | |
317 | utf8::prior(it, range_start); | |
318 | return temp; | |
319 | } | |
320 | }; // class iterator | |
321 | ||
322 | } // namespace utf8 | |
323 | ||
324 | #endif //header guard | |
325 | ||
326 |
0 | // Copyright 2006 Nemanja Trifunovic | |
1 | ||
2 | /* | |
3 | Permission is hereby granted, free of charge, to any person or organization | |
4 | obtaining a copy of the software and accompanying documentation covered by | |
5 | this license (the "Software") to use, reproduce, display, distribute, | |
6 | execute, and transmit the Software, and to prepare derivative works of the | |
7 | Software, and to permit third-parties to whom the Software is furnished to | |
8 | do so, all subject to the following: | |
9 | ||
10 | The copyright notices in the Software and this entire statement, including | |
11 | the above license grant, this restriction and the following disclaimer, | |
12 | must be included in all copies of the Software, in whole or in part, and | |
13 | all derivative works of the Software, unless such copies or derivative | |
14 | works are solely in the form of machine-executable object code generated by | |
15 | a source language processor. | |
16 | ||
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | |
20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | |
21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | |
22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
23 | DEALINGS IN THE SOFTWARE. | |
24 | */ | |
25 | ||
26 | ||
27 | #ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
28 | #define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
29 | ||
30 | #include <iterator> | |
31 | ||
32 | namespace utf8 | |
33 | { | |
34 | // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers | |
35 | // You may need to change them to match your system. | |
36 | // These typedefs have the same names as ones from cstdint, or boost/cstdint | |
37 | typedef unsigned char uint8_t; | |
38 | typedef unsigned short uint16_t; | |
39 | typedef unsigned int uint32_t; | |
40 | ||
41 | // Helper code - not intended to be directly called by the library users. May be changed at any time | |
42 | namespace internal | |
43 | { | |
44 | // Unicode constants | |
45 | // Leading (high) surrogates: 0xd800 - 0xdbff | |
46 | // Trailing (low) surrogates: 0xdc00 - 0xdfff | |
47 | const uint16_t LEAD_SURROGATE_MIN = 0xd800u; | |
48 | const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; | |
49 | const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; | |
50 | const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; | |
51 | const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10); | |
52 | const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN; | |
53 | ||
54 | // Maximum valid value for a Unicode code point | |
55 | const uint32_t CODE_POINT_MAX = 0x0010ffffu; | |
56 | ||
57 | template<typename octet_type> | |
58 | inline uint8_t mask8(octet_type oc) | |
59 | { | |
60 | return static_cast<uint8_t>(0xff & oc); | |
61 | } | |
62 | template<typename u16_type> | |
63 | inline uint16_t mask16(u16_type oc) | |
64 | { | |
65 | return static_cast<uint16_t>(0xffff & oc); | |
66 | } | |
67 | template<typename octet_type> | |
68 | inline bool is_trail(octet_type oc) | |
69 | { | |
70 | return ((utf8::internal::mask8(oc) >> 6) == 0x2); | |
71 | } | |
72 | ||
73 | template <typename u16> | |
74 | inline bool is_lead_surrogate(u16 cp) | |
75 | { | |
76 | return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX); | |
77 | } | |
78 | ||
79 | template <typename u16> | |
80 | inline bool is_trail_surrogate(u16 cp) | |
81 | { | |
82 | return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); | |
83 | } | |
84 | ||
85 | template <typename u16> | |
86 | inline bool is_surrogate(u16 cp) | |
87 | { | |
88 | return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); | |
89 | } | |
90 | ||
91 | template <typename u32> | |
92 | inline bool is_code_point_valid(u32 cp) | |
93 | { | |
94 | return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp)); | |
95 | } | |
96 | ||
97 | template <typename octet_iterator> | |
98 | inline typename std::iterator_traits<octet_iterator>::difference_type | |
99 | sequence_length(octet_iterator lead_it) | |
100 | { | |
101 | uint8_t lead = utf8::internal::mask8(*lead_it); | |
102 | if (lead < 0x80) | |
103 | return 1; | |
104 | else if ((lead >> 5) == 0x6) | |
105 | return 2; | |
106 | else if ((lead >> 4) == 0xe) | |
107 | return 3; | |
108 | else if ((lead >> 3) == 0x1e) | |
109 | return 4; | |
110 | else | |
111 | return 0; | |
112 | } | |
113 | ||
114 | template <typename octet_difference_type> | |
115 | inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length) | |
116 | { | |
117 | if (cp < 0x80) { | |
118 | if (length != 1) | |
119 | return true; | |
120 | } | |
121 | else if (cp < 0x800) { | |
122 | if (length != 2) | |
123 | return true; | |
124 | } | |
125 | else if (cp < 0x10000) { | |
126 | if (length != 3) | |
127 | return true; | |
128 | } | |
129 | ||
130 | return false; | |
131 | } | |
132 | ||
133 | enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT}; | |
134 | ||
135 | /// Helper for get_sequence_x | |
136 | template <typename octet_iterator> | |
137 | utf_error increase_safely(octet_iterator& it, octet_iterator end) | |
138 | { | |
139 | if (++it == end) | |
140 | return NOT_ENOUGH_ROOM; | |
141 | ||
142 | if (!utf8::internal::is_trail(*it)) | |
143 | return INCOMPLETE_SEQUENCE; | |
144 | ||
145 | return UTF8_OK; | |
146 | } | |
147 | ||
148 | #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;} | |
149 | ||
150 | /// get_sequence_x functions decode utf-8 sequences of the length x | |
151 | template <typename octet_iterator> | |
152 | utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
153 | { | |
154 | if (it == end) | |
155 | return NOT_ENOUGH_ROOM; | |
156 | ||
157 | code_point = utf8::internal::mask8(*it); | |
158 | ||
159 | return UTF8_OK; | |
160 | } | |
161 | ||
162 | template <typename octet_iterator> | |
163 | utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
164 | { | |
165 | if (it == end) | |
166 | return NOT_ENOUGH_ROOM; | |
167 | ||
168 | code_point = utf8::internal::mask8(*it); | |
169 | ||
170 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
171 | ||
172 | code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f); | |
173 | ||
174 | return UTF8_OK; | |
175 | } | |
176 | ||
177 | template <typename octet_iterator> | |
178 | utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
179 | { | |
180 | if (it == end) | |
181 | return NOT_ENOUGH_ROOM; | |
182 | ||
183 | code_point = utf8::internal::mask8(*it); | |
184 | ||
185 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
186 | ||
187 | code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); | |
188 | ||
189 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
190 | ||
191 | code_point += (*it) & 0x3f; | |
192 | ||
193 | return UTF8_OK; | |
194 | } | |
195 | ||
196 | template <typename octet_iterator> | |
197 | utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
198 | { | |
199 | if (it == end) | |
200 | return NOT_ENOUGH_ROOM; | |
201 | ||
202 | code_point = utf8::internal::mask8(*it); | |
203 | ||
204 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
205 | ||
206 | code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); | |
207 | ||
208 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
209 | ||
210 | code_point += (utf8::internal::mask8(*it) << 6) & 0xfff; | |
211 | ||
212 | UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) | |
213 | ||
214 | code_point += (*it) & 0x3f; | |
215 | ||
216 | return UTF8_OK; | |
217 | } | |
218 | ||
219 | #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR | |
220 | ||
221 | template <typename octet_iterator> | |
222 | utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) | |
223 | { | |
224 | // Save the original value of it so we can go back in case of failure | |
225 | // Of course, it does not make much sense with i.e. stream iterators | |
226 | octet_iterator original_it = it; | |
227 | ||
228 | uint32_t cp = 0; | |
229 | // Determine the sequence length based on the lead octet | |
230 | typedef typename std::iterator_traits<octet_iterator>::difference_type octet_difference_type; | |
231 | const octet_difference_type length = utf8::internal::sequence_length(it); | |
232 | ||
233 | // Get trail octets and calculate the code point | |
234 | utf_error err = UTF8_OK; | |
235 | switch (length) { | |
236 | case 0: | |
237 | return INVALID_LEAD; | |
238 | case 1: | |
239 | err = utf8::internal::get_sequence_1(it, end, cp); | |
240 | break; | |
241 | case 2: | |
242 | err = utf8::internal::get_sequence_2(it, end, cp); | |
243 | break; | |
244 | case 3: | |
245 | err = utf8::internal::get_sequence_3(it, end, cp); | |
246 | break; | |
247 | case 4: | |
248 | err = utf8::internal::get_sequence_4(it, end, cp); | |
249 | break; | |
250 | } | |
251 | ||
252 | if (err == UTF8_OK) { | |
253 | // Decoding succeeded. Now, security checks... | |
254 | if (utf8::internal::is_code_point_valid(cp)) { | |
255 | if (!utf8::internal::is_overlong_sequence(cp, length)){ | |
256 | // Passed! Return here. | |
257 | code_point = cp; | |
258 | ++it; | |
259 | return UTF8_OK; | |
260 | } | |
261 | else | |
262 | err = OVERLONG_SEQUENCE; | |
263 | } | |
264 | else | |
265 | err = INVALID_CODE_POINT; | |
266 | } | |
267 | ||
268 | // Failure branch - restore the original value of the iterator | |
269 | it = original_it; | |
270 | return err; | |
271 | } | |
272 | ||
273 | template <typename octet_iterator> | |
274 | inline utf_error validate_next(octet_iterator& it, octet_iterator end) { | |
275 | uint32_t ignored; | |
276 | return utf8::internal::validate_next(it, end, ignored); | |
277 | } | |
278 | ||
279 | } // namespace internal | |
280 | ||
281 | /// The library API - functions intended to be called by the users | |
282 | ||
283 | // Byte order mark | |
284 | const uint8_t bom[] = {0xef, 0xbb, 0xbf}; | |
285 | ||
286 | template <typename octet_iterator> | |
287 | octet_iterator find_invalid(octet_iterator start, octet_iterator end) | |
288 | { | |
289 | octet_iterator result = start; | |
290 | while (result != end) { | |
291 | utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end); | |
292 | if (err_code != internal::UTF8_OK) | |
293 | return result; | |
294 | } | |
295 | return result; | |
296 | } | |
297 | ||
298 | template <typename octet_iterator> | |
299 | inline bool is_valid(octet_iterator start, octet_iterator end) | |
300 | { | |
301 | return (utf8::find_invalid(start, end) == end); | |
302 | } | |
303 | ||
304 | template <typename octet_iterator> | |
305 | inline bool starts_with_bom (octet_iterator it, octet_iterator end) | |
306 | { | |
307 | return ( | |
308 | ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) && | |
309 | ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) && | |
310 | ((it != end) && (utf8::internal::mask8(*it)) == bom[2]) | |
311 | ); | |
312 | } | |
313 | ||
314 | //Deprecated in release 2.3 | |
315 | template <typename octet_iterator> | |
316 | inline bool is_bom (octet_iterator it) | |
317 | { | |
318 | return ( | |
319 | (utf8::internal::mask8(*it++)) == bom[0] && | |
320 | (utf8::internal::mask8(*it++)) == bom[1] && | |
321 | (utf8::internal::mask8(*it)) == bom[2] | |
322 | ); | |
323 | } | |
324 | } // namespace utf8 | |
325 | ||
326 | #endif // header guard | |
327 | ||
328 |
0 | // Copyright 2006 Nemanja Trifunovic | |
1 | ||
2 | /* | |
3 | Permission is hereby granted, free of charge, to any person or organization | |
4 | obtaining a copy of the software and accompanying documentation covered by | |
5 | this license (the "Software") to use, reproduce, display, distribute, | |
6 | execute, and transmit the Software, and to prepare derivative works of the | |
7 | Software, and to permit third-parties to whom the Software is furnished to | |
8 | do so, all subject to the following: | |
9 | ||
10 | The copyright notices in the Software and this entire statement, including | |
11 | the above license grant, this restriction and the following disclaimer, | |
12 | must be included in all copies of the Software, in whole or in part, and | |
13 | all derivative works of the Software, unless such copies or derivative | |
14 | works are solely in the form of machine-executable object code generated by | |
15 | a source language processor. | |
16 | ||
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | |
20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | |
21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | |
22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
23 | DEALINGS IN THE SOFTWARE. | |
24 | */ | |
25 | ||
26 | ||
27 | #ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
28 | #define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
29 | ||
30 | #include "core.h" | |
31 | ||
32 | namespace utf8 | |
33 | { | |
34 | namespace unchecked | |
35 | { | |
36 | template <typename octet_iterator> | |
37 | octet_iterator append(uint32_t cp, octet_iterator result) | |
38 | { | |
39 | if (cp < 0x80) // one octet | |
40 | *(result++) = static_cast<uint8_t>(cp); | |
41 | else if (cp < 0x800) { // two octets | |
42 | *(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0); | |
43 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
44 | } | |
45 | else if (cp < 0x10000) { // three octets | |
46 | *(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0); | |
47 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); | |
48 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
49 | } | |
50 | else { // four octets | |
51 | *(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0); | |
52 | *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80); | |
53 | *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80); | |
54 | *(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80); | |
55 | } | |
56 | return result; | |
57 | } | |
58 | ||
59 | template <typename octet_iterator> | |
60 | uint32_t next(octet_iterator& it) | |
61 | { | |
62 | uint32_t cp = utf8::internal::mask8(*it); | |
63 | typename std::iterator_traits<octet_iterator>::difference_type length = utf8::internal::sequence_length(it); | |
64 | switch (length) { | |
65 | case 1: | |
66 | break; | |
67 | case 2: | |
68 | it++; | |
69 | cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f); | |
70 | break; | |
71 | case 3: | |
72 | ++it; | |
73 | cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); | |
74 | ++it; | |
75 | cp += (*it) & 0x3f; | |
76 | break; | |
77 | case 4: | |
78 | ++it; | |
79 | cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); | |
80 | ++it; | |
81 | cp += (utf8::internal::mask8(*it) << 6) & 0xfff; | |
82 | ++it; | |
83 | cp += (*it) & 0x3f; | |
84 | break; | |
85 | } | |
86 | ++it; | |
87 | return cp; | |
88 | } | |
89 | ||
90 | template <typename octet_iterator> | |
91 | uint32_t peek_next(octet_iterator it) | |
92 | { | |
93 | return utf8::unchecked::next(it); | |
94 | } | |
95 | ||
96 | template <typename octet_iterator> | |
97 | uint32_t prior(octet_iterator& it) | |
98 | { | |
99 | while (utf8::internal::is_trail(*(--it))) ; | |
100 | octet_iterator temp = it; | |
101 | return utf8::unchecked::next(temp); | |
102 | } | |
103 | ||
104 | // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous) | |
105 | template <typename octet_iterator> | |
106 | inline uint32_t previous(octet_iterator& it) | |
107 | { | |
108 | return utf8::unchecked::prior(it); | |
109 | } | |
110 | ||
111 | template <typename octet_iterator, typename distance_type> | |
112 | void advance (octet_iterator& it, distance_type n) | |
113 | { | |
114 | for (distance_type i = 0; i < n; ++i) | |
115 | utf8::unchecked::next(it); | |
116 | } | |
117 | ||
118 | template <typename octet_iterator> | |
119 | typename std::iterator_traits<octet_iterator>::difference_type | |
120 | distance (octet_iterator first, octet_iterator last) | |
121 | { | |
122 | typename std::iterator_traits<octet_iterator>::difference_type dist; | |
123 | for (dist = 0; first < last; ++dist) | |
124 | utf8::unchecked::next(first); | |
125 | return dist; | |
126 | } | |
127 | ||
128 | template <typename u16bit_iterator, typename octet_iterator> | |
129 | octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) | |
130 | { | |
131 | while (start != end) { | |
132 | uint32_t cp = utf8::internal::mask16(*start++); | |
133 | // Take care of surrogate pairs first | |
134 | if (utf8::internal::is_lead_surrogate(cp)) { | |
135 | uint32_t trail_surrogate = utf8::internal::mask16(*start++); | |
136 | cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; | |
137 | } | |
138 | result = utf8::unchecked::append(cp, result); | |
139 | } | |
140 | return result; | |
141 | } | |
142 | ||
143 | template <typename u16bit_iterator, typename octet_iterator> | |
144 | u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) | |
145 | { | |
146 | while (start < end) { | |
147 | uint32_t cp = utf8::unchecked::next(start); | |
148 | if (cp > 0xffff) { //make a surrogate pair | |
149 | *result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET); | |
150 | *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); | |
151 | } | |
152 | else | |
153 | *result++ = static_cast<uint16_t>(cp); | |
154 | } | |
155 | return result; | |
156 | } | |
157 | ||
158 | template <typename octet_iterator, typename u32bit_iterator> | |
159 | octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) | |
160 | { | |
161 | while (start != end) | |
162 | result = utf8::unchecked::append(*(start++), result); | |
163 | ||
164 | return result; | |
165 | } | |
166 | ||
167 | template <typename octet_iterator, typename u32bit_iterator> | |
168 | u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) | |
169 | { | |
170 | while (start < end) | |
171 | (*result++) = utf8::unchecked::next(start); | |
172 | ||
173 | return result; | |
174 | } | |
175 | ||
176 | // The iterator class | |
177 | template <typename octet_iterator> | |
178 | class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> { | |
179 | octet_iterator it; | |
180 | public: | |
181 | iterator () {} | |
182 | explicit iterator (const octet_iterator& octet_it): it(octet_it) {} | |
183 | // the default "big three" are OK | |
184 | octet_iterator base () const { return it; } | |
185 | uint32_t operator * () const | |
186 | { | |
187 | octet_iterator temp = it; | |
188 | return utf8::unchecked::next(temp); | |
189 | } | |
190 | bool operator == (const iterator& rhs) const | |
191 | { | |
192 | return (it == rhs.it); | |
193 | } | |
194 | bool operator != (const iterator& rhs) const | |
195 | { | |
196 | return !(operator == (rhs)); | |
197 | } | |
198 | iterator& operator ++ () | |
199 | { | |
200 | ::std::advance(it, utf8::internal::sequence_length(it)); | |
201 | return *this; | |
202 | } | |
203 | iterator operator ++ (int) | |
204 | { | |
205 | iterator temp = *this; | |
206 | ::std::advance(it, utf8::internal::sequence_length(it)); | |
207 | return temp; | |
208 | } | |
209 | iterator& operator -- () | |
210 | { | |
211 | utf8::unchecked::prior(it); | |
212 | return *this; | |
213 | } | |
214 | iterator operator -- (int) | |
215 | { | |
216 | iterator temp = *this; | |
217 | utf8::unchecked::prior(it); | |
218 | return temp; | |
219 | } | |
220 | }; // class iterator | |
221 | ||
222 | } // namespace utf8::unchecked | |
223 | } // namespace utf8 | |
224 | ||
225 | ||
226 | #endif // header guard | |
227 |
0 | // Copyright 2006 Nemanja Trifunovic | |
1 | ||
2 | /* | |
3 | Permission is hereby granted, free of charge, to any person or organization | |
4 | obtaining a copy of the software and accompanying documentation covered by | |
5 | this license (the "Software") to use, reproduce, display, distribute, | |
6 | execute, and transmit the Software, and to prepare derivative works of the | |
7 | Software, and to permit third-parties to whom the Software is furnished to | |
8 | do so, all subject to the following: | |
9 | ||
10 | The copyright notices in the Software and this entire statement, including | |
11 | the above license grant, this restriction and the following disclaimer, | |
12 | must be included in all copies of the Software, in whole or in part, and | |
13 | all derivative works of the Software, unless such copies or derivative | |
14 | works are solely in the form of machine-executable object code generated by | |
15 | a source language processor. | |
16 | ||
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT | |
20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE | |
21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, | |
22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
23 | DEALINGS IN THE SOFTWARE. | |
24 | */ | |
25 | ||
26 | ||
27 | #ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
28 | #define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 | |
29 | ||
30 | #include "utf8/checked.h" | |
31 | #include "utf8/unchecked.h" | |
32 | ||
33 | #endif // header guard |
0 | #! /bin/bash | |
1 | set -e | |
2 | ||
3 | # First check for formatting errors | |
4 | bash source/misc/lint/runLint.sh | |
5 | ||
6 | docker build -f source/misc/docker/Dockerfile.Fedora25build . -t blockattack_test | |
7 | #docker build -f source/misc/docker/Dockerfile.Ubuntu14.04build . -t blockattack_test | |
8 | docker build -f source/misc/docker/Dockerfile.WindoesBuild . -t blockattack_test |
1 | 1 | |
2 | 2 | ; HM NIS Edit Wizard helper defines |
3 | 3 | !define PRODUCT_NAME "Block Attack - Rise Of the Blocks" |
4 | !define PRODUCT_VERSION "2.6.0" | |
4 | !define PRODUCT_VERSION "2.7.0" | |
5 | 5 | !define PRODUCT_PUBLISHER "Poul Sander" |
6 | 6 | !define PRODUCT_WEB_SITE "http://www.blockattack.net" |
7 | 7 | !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\blockattack.exe" |
61 | 61 | File "..\Game\blockattack.data" |
62 | 62 | SetOutPath "$INSTDIR" |
63 | 63 | File "..\Game\COPYING.TXT" |
64 | SetOutPath "$INSTDIR\mods" | |
65 | File "..\Game\mods\1.3.0.bricks.data" | |
64 | 66 | SetOutPath "$INSTDIR\locale\da\LC_MESSAGES" |
65 | 67 | File "../source/misc/translation/locale/da/LC_MESSAGES/blockattack_roftb.mo" |
66 | 68 | SetOutPath "$INSTDIR" |
222 | 224 | Delete "$INSTDIR\gfx\iDraw.png" |
223 | 225 | Delete "$INSTDIR\gfx\bOff.png" |
224 | 226 | Delete "$INSTDIR\gfx\mouse.png" |
227 | Delete "$INSTDIR\mods\1.3.0.bricks.data" | |
225 | 228 | Delete "$INSTDIR\music\bgMusic.ogg" |
226 | 229 | Delete "$INSTDIR\music\highbeat.ogg" |
227 | 230 | Delete "$INSTDIR\res\puzzle.levels" |
271 | 274 | RMDir "$INSTDIR\gfx\animations" |
272 | 275 | RMDir "$INSTDIR\gfx" |
273 | 276 | RMDir "$INSTDIR\docs" |
277 | RMDir "$INSTDIR\mods" | |
274 | 278 | RMDir /r "$INSTDIR\locale" |
275 | 279 | RMDir "$INSTDIR" |
276 | 280 |