From 3ec388b553250a07b0f470fd6077bd8107815f8f Mon Sep 17 00:00:00 2001 From: FractumSeraph <8539982+FractumSeraph@users.noreply.github.com> Date: Mon, 12 Oct 2026 23:49:45 -0500 Subject: [PATCH 1/4] Maps named for their hash without renaming their files A Custom Edition map's level is named for its hash (custom_maps\_<8 digits>), so that two versions of a map have two names and a game always loads the host's. Until now the map file in custom_maps was renamed to that name. A player's map files are theirs, and other programs use them by name (Halo Custom Edition, map managers, a server's playlists), so the file now keeps its name, and the game remembers its hash instead: - map_share_files.c remembers the digits of each map it hashed by its folder, name, size and time, and keeps them in the save root (z:\map_hashes.txt), so that a map is hashed once until its file changes, as when it was renamed. map_share_name_digits gives a file's digits, hashing it then if it was not hashed yet. - A host's level is named custom_maps\_ as before (map_share_level_name_hash): nothing on the wire changes, and network version 28's builds (build-201) play with it either way. - custom_edition_map_path finds .map for _ when that file's digits are those. Maps renamed by earlier builds keep working. A name too long to keep whole with the digits is cut short to fit, as the renaming did, and finds the file whose name starts so and whose digits they are. - The maps of a Custom Edition install's folder are hashed in the background too (they are still not shared), so that a game on one does not hash it while joining. The digits are kept only if the file did not change while it was hashed, map_hashes.txt is written once the hashing is done, and it holds as many maps as the map lists. - The menus sort the maps by their names without the hash, so that two versions of a map are always told apart. Checked: the Linux CI steps in Docker; the web build and its tests; the Windows release build. End to end on Linux in Docker, on the loopback: this build hosts chaosgulch (its file not renamed) and build-201's client downloads it by map sharing and plays; build-201 hosts and this build's client does the same, and plays the downloaded copy on a second join; a ChupathingyCE-based dedicated server (version 28, hash names) sends it to this build's client; a second run of a host hashes nothing again (map_hashes.txt). No map file of this build's changed. Co-Authored-By: Claude Opus 5.5 --- docs/custom_edition_caches.md | 12 +- port/linux/NETCODE.md | 11 +- port/linux/README.md | 13 +- port/linux/game/custom_edition_cache.c | 90 ++++++- port/linux/game/custom_edition_cache.h | 8 +- port/linux/game/custom_edition_maps.c | 31 ++- port/linux/game/map_share.h | 20 +- port/linux/game/map_share_files.c | 350 +++++++++++++++++++------ 8 files changed, 413 insertions(+), 122 deletions(-) diff --git a/docs/custom_edition_caches.md b/docs/custom_edition_caches.md index 215b51b7b7..40ae7d0df0 100644 --- a/docs/custom_edition_caches.md +++ b/docs/custom_edition_caches.md @@ -34,11 +34,13 @@ games, progress, the next level). The game engine keeps 63 characters of a level name, so a map whose file name is longer than 51 is not listed. A map in `custom_maps` is named for its contents once the map lists (or a -host picking it) find it: `hugeass.map` becomes `hugeass_0e2b3ee4.map`, the -first 8 hexadecimal digits of its hash after `_`, its `.bmp` and `.txt` -renamed with it (`port/linux/game/map_share_files.c`; the name is cut short -to keep the level name within 63 characters). A network game's level name -then says which version of the map it is on, a player without it downloads +host picking it) find it: a game on `hugeass.map` is on the level +`custom_maps\hugeass_0e2b3ee4`, the first 8 hexadecimal digits of its hash +after `_` (`port/linux/game/map_share_files.c`; a name too long to keep the +level name within 63 characters with them is left without). The file keeps +its name: no map is renamed, and the level finds `hugeass.map` by its hash +(`custom_edition_cache.c`). A network game's level name then says which +version of the map it is on, a player without it downloads it under that name (`port/linux/NETCODE.md`, "Map sharing"), and two versions of a map keep apart. A level name without the hash (a saved last map, a test's) finds the one map of that name in `custom_maps`. The menus diff --git a/port/linux/NETCODE.md b/port/linux/NETCODE.md index 69f1214517..eafc95c4e1 100644 --- a/port/linux/NETCODE.md +++ b/port/linux/NETCODE.md @@ -341,10 +341,13 @@ a pregame keep-alive every five seconds from the host A client may join a game on a Custom Edition map it does not have (`port/linux/game/map_share.c`, `map_share_files.c`). Every map in the custom_maps folder is named for its contents: once the map lists (or a host -picking it) find it, `hugeass.map` is renamed `hugeass_<8 hex digits>.map`, -the first digits of its hash, with its picture and description, so a game's -level name (`custom_maps\hugeass_0e2b3ee4`) says which version of the map it -is, and two versions never meet. A file's hash is BLAKE2b's (32 bytes) of a +picking it) find `hugeass.map`, it is hashed, and a game on it is on the +level `custom_maps\hugeass_<8 hex digits>`, the first digits of its hash, so +the level name says which version of the map it is, and two versions never +meet. The file keeps its name (no map is renamed: other programs and +installs use the folder too); the level finds it by the hash +(`custom_edition_cache.c`), and a map downloaded is written under the level's +name, beside any other version. A file's hash is BLAKE2b's (32 bytes) of a label, its size and the BLAKE2b hashes of its pieces (256 KiB each). The menus show a map without its hash, unless two versions are listed. diff --git a/port/linux/README.md b/port/linux/README.md index 3c3f117735..b7b7a8d412 100644 --- a/port/linux/README.md +++ b/port/linux/README.md @@ -792,12 +792,15 @@ UPLOAD LIMIT in Settings > Network Setup > Map Sharing). Set these lower on a slow connection. DOWNLOAD MAPS there (`network.map_download`) turns downloading off: you then leave a game whose map you do not have. -The name of each map in `custom_maps` ends with the start of its hash: when -the map lists find `hugeass.map`, the game renames it `hugeass_0e2b3ee4.map` -(and its picture and description). Thus two versions of a map have different -names, and a game always loads the version of the host. The menus show the +A game names each map in `custom_maps` with the start of its hash: when it +hosts `hugeass.map`, the game is on `hugeass_0e2b3ee4`. The game works the +hash out from the file, which keeps its name (no map is renamed), once: +it keeps the hash in `map_hashes.txt` in the save root until the file +changes. Thus two versions of a map have different names, and a game always +loads the version of the host. A downloaded map is written as `hugeass_0e2b3ee4.map`, +beside any other version you have, which stays as it is. The menus show the map without the hash, and with it only when you have two versions of the -map. The downloaded map has the same name. A download that stops leaves a +map. A download that stops leaves a `.part` file in `custom_maps`; the next download of that map continues from it. Maps in the folder of a Halo Custom Edition install (`paths.custom_edition`) keep their names, and the host does not share them. diff --git a/port/linux/game/custom_edition_cache.c b/port/linux/game/custom_edition_cache.c index 1dc4159572..c55293ea65 100644 --- a/port/linux/game/custom_edition_cache.c +++ b/port/linux/game/custom_edition_cache.c @@ -211,8 +211,8 @@ static boolean maps_folder_has( /* The custom_maps folder's one map named _.map, for a name without the hash its file has: its file name (without the extension) in -`hashed` (MAP_PATH_SIZE characters). Maps there are named for their hash as -the map lists find them (map_share_name_map), so a level name of before (a +`hashed` (MAP_PATH_SIZE characters). Downloaded maps are named so, and +earlier builds renamed every map so, so a level name without the hash (a saved last map, a test's) still finds its map; FALSE if there are more. */ static boolean maps_folder_hashed_name( char const *name, @@ -258,9 +258,63 @@ static boolean maps_folder_hashed_name( return count == 1; } +/* a map file of the folder whose name starts with base (a name cut short +to fit a level name with its hash: map_share_level_name_hash) and whose +hash's digits are digits, into path */ +static boolean maps_folder_digits_find( + char const *folder, + char const *base, + char const *digits, + char *path) +{ + char pattern[MAP_PATH_SIZE]; + char found_digits[MAP_SHARE_NAME_DIGITS + 1]; + WIN32_FIND_DATAA data; + HANDLE find; + boolean found = FALSE; + + /* (no install: its folder not looked in, which would be made) */ + if ((folder == maps_folder(1) && !custom_edition_install_present()) || strchr(base, '*') || strchr(base, '?') || + strlen(folder) + strlen(base) + 2 + 4 >= MAP_PATH_SIZE) + { + return FALSE; + } + sprintf(pattern, "%s%s*%s", folder, base, MAP_FILE_EXTENSION); + find = FindFirstFileA(pattern, &data); + if (find == INVALID_HANDLE_VALUE) + return FALSE; + do + { + char file[sizeof(data.cFileName) + 1]; + size_t length; + + memcpy(file, data.cFileName, sizeof(data.cFileName)); + file[sizeof(data.cFileName)] = 0; + length = strlen(file); + if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || length <= strlen(MAP_FILE_EXTENSION) || + length - strlen(MAP_FILE_EXTENSION) <= strlen(base)) + { + continue; + } + file[length - strlen(MAP_FILE_EXTENSION)] = 0; + if (!map_share_name_hashed(file) && map_share_name_digits(folder, file, found_digits) && + !_stricmp(found_digits, digits) && maps_folder_has(folder, file, MAP_FILE_EXTENSION, path)) + { + found = TRUE; + break; + } + } while (FindNextFileA(find, &data)); + CloseHandle(find); + + return found; +} + /* the file that holds the map `map_name` names (a level name or a file name): \.map (custom_maps' _.map for -a name without the hash, if it has one map of that name) */ +a name without the hash, if it has one map of that name; for a name with +the hash, .map without it whose hash it is, as no map is renamed for +its hash: map_share_name_digits, or for a name cut short to fit the hash, +.map that starts with it) */ static boolean custom_edition_map_path( char const *map_name, char *path) @@ -276,6 +330,36 @@ static boolean custom_edition_map_path( return TRUE; } } + if (map_share_name_hashed(name)) + { + short base_length = map_share_name_base_length(name); + char digits[MAP_SHARE_NAME_DIGITS + 1]; + + if (base_length <= 0 || base_length >= MAP_PATH_SIZE) + return FALSE; + memcpy(hashed, name, (size_t)base_length); + hashed[base_length] = 0; + for (folder = 0; folder < NUMBER_OF_MAPS_FOLDERS; folder++) + { + if (maps_folder_has(maps_folder(folder), hashed, MAP_FILE_EXTENSION, path) && + map_share_name_digits(maps_folder(folder), hashed, digits) && + !_stricmp(digits, name + base_length + 1)) + { + return TRUE; + } + } + /* (a name cut short to fit the level name: map_share_level_name_hash) */ + if (base_length == CUSTOM_EDITION_MAXIMUM_LEVEL_NAME_LENGTH - (short)(sizeof(CUSTOM_EDITION_LEVEL_NAME_PREFIX) - 1) - + MAP_SHARE_NAME_DIGITS - 1) + { + for (folder = 0; folder < NUMBER_OF_MAPS_FOLDERS; folder++) + { + if (maps_folder_digits_find(maps_folder(folder), hashed, name + base_length + 1, path)) + return TRUE; + } + } + return FALSE; + } return maps_folder_hashed_name(name, hashed) && maps_folder_has(maps_folder(0), hashed, MAP_FILE_EXTENSION, path); diff --git a/port/linux/game/custom_edition_cache.h b/port/linux/game/custom_edition_cache.h index c2bfc3eb0c..a9e0d093e6 100644 --- a/port/linux/game/custom_edition_cache.h +++ b/port/linux/game/custom_edition_cache.h @@ -86,9 +86,11 @@ cache. */ unsigned long custom_edition_map_checksum( char const *level_name); /* The file of the map `map_name` (a level name or a file name) in the -Custom Edition maps folders, into `path` (256 characters): the custom_maps -folder's map named for its hash (_.map, map_share.h) for a name -without it, if there is one map of that name. FALSE if none. */ +Custom Edition maps folders, into `path` (256 characters). A name with its +map's hash (_, map_share.h) finds _.map, or the +.map whose hash it is (maps are not renamed for their hash); a name +without it, the custom_maps folder's _.map if there is one map +of that name. FALSE if none. */ boolean custom_edition_map_file_path( char const *map_name, char *path); diff --git a/port/linux/game/custom_edition_maps.c b/port/linux/game/custom_edition_maps.c index 85253e5db0..3163a4cc13 100644 --- a/port/linux/game/custom_edition_maps.c +++ b/port/linux/game/custom_edition_maps.c @@ -15,10 +15,11 @@ A map's level name is custom_maps\ (CUSTOM_EDITION_LEVEL_NAME_PREFIX), which the cache loader reads from the custom maps folders alone: a map named as one of the game's own levels (a30.map, bloodgulch.map) is listed and played as itself. The game engine keeps 63 characters of a level name, so a -map whose name is longer than 51 is skipped. A map in the custom_maps folder -is named for its hash (_.map) once it has been found: a network -game's level name then says which version of the map it is on, and a player -without it can download it (map_share.h). The menus show the name without +map whose name is longer than 51 is skipped. A network game's level name +has the first digits of its map's hash after the name (custom_maps\_, +map_share.h), worked out from the file, which keeps its name: it then says +which version of the map the game is on, and a player without it can +download it (written as _.map). The menus show the name without the hash, unless two versions of a map are listed. Each map can have, beside it in its folder: @@ -389,7 +390,7 @@ static void custom_edition_map_add( csprintf(map->level_name, "%s%s", CUSTOM_EDITION_LEVEL_NAME_PREFIX, name); display_name_make(name, FALSE, map->display_name); custom_edition_map_description_read(map); - /* (named for its hash, renamed: map_share_files.c) */ + /* (its hash worked out, once, for a game's level name: map_share_files.c) */ if (!map_share_name_hashed(name)) map_share_name_map(folder, name); @@ -400,13 +401,25 @@ static int custom_edition_map_compare( void const *first, void const *second) { - return (int)csstrcasecmp( - ((struct custom_edition_map const *)first)->name, - ((struct custom_edition_map const *)second)->name); + char const *first_name = ((struct custom_edition_map const *)first)->name; + char const *second_name = ((struct custom_edition_map const *)second)->name; + short first_length = map_share_name_base_length(first_name); + short second_length = map_share_name_base_length(second_name); + int result; + + /* (by the name without its hash first, so that the versions of a map are + side by side: custom_edition_maps_tell_versions_apart) */ + result = _strnicmp(first_name, second_name, (size_t)MIN(first_length, second_length)); + if (result) + return result; + if (first_length != second_length) + return first_length < second_length ? -1 : 1; + return (int)csstrcasecmp(first_name, second_name); } /* Two versions of a map (its name the same but for its hash) listed: each -shown with its hash, to tell them apart. The maps are sorted by name. */ +shown with its hash, to tell them apart. The maps are sorted by their names +without the hash (custom_edition_map_compare), so versions are side by side. */ static void custom_edition_maps_tell_versions_apart( struct custom_edition_map *maps, short count) diff --git a/port/linux/game/map_share.h b/port/linux/game/map_share.h index 6c26df8d7a..02e0af4da4 100644 --- a/port/linux/game/map_share.h +++ b/port/linux/game/map_share.h @@ -61,19 +61,25 @@ short map_share_name_base_length( /* The map lists found the map file .map, a Custom Edition map, whose name is not its hash's: in the custom_maps folder it is hashed, -on a thread of its own, and renamed _.map, with its picture and -description beside it (.bmp, .txt); the map lists are scanned -again once it has been (custom_edition_maps_look_again). Not while the map -is loaded (a file in use is not renamed on Windows): it is asked for again. */ +on a thread of its own, and the digits it is named by remembered while the +file stays the same. No file is renamed (map_share_name_digits). */ void map_share_name_map( char const *folder, char const *name); +/* The digits of the hash the map file .map is named by (a +level of it is custom_maps\_), into digits +(MAP_SHARE_NAME_DIGITS + 1 characters): remembered, or hashed now (a +fraction of a second); FALSE if it cannot be read. */ +boolean map_share_name_digits( + char const *folder, + char const *name, + char *digits); /* A host's game is on the level `level_name` (a buffer of `size`): a Custom Edition map's named without its hash (custom_maps\hugeass, a saved -last map's or a test's) is named with it (custom_maps\hugeass_1a2b3c4d), the -map's file renamed for its hash first if it has not been yet, so that the -players can download it (network_server_manager.c). */ +last map's or a test's) is named with it (custom_maps\hugeass_1a2b3c4d), its +file hashed where it is and never renamed, so that the players can download +it (network_server_manager.c). */ void map_share_level_name_hash( char *level_name, long size); diff --git a/port/linux/game/map_share_files.c b/port/linux/game/map_share_files.c index ff299483f0..336c8c0fa7 100644 --- a/port/linux/game/map_share_files.c +++ b/port/linux/game/map_share_files.c @@ -44,10 +44,12 @@ enum /* the files hashed for sharing at once: a game's map and its three resource maps, a download's, and the last few games' */ MAXIMUM_SHARE_FILES = 16, - /* the maps waiting to be named, and those named or given up on this - run (not looked at again) */ + /* the maps waiting to be hashed for their names, and those hashed or + given up on (not hashed again while their files stay the same; those + hashed kept in NAMED_FILE for the next runs) */ MAXIMUM_NAMING_QUEUE = 64, - MAXIMUM_NAMED = 1024, + /* (every map the map lists hold) */ + MAXIMUM_NAMED = CUSTOM_EDITION_MAPS_MAXIMUM, /* the longest map file name the map lists take (custom_edition_maps.c: the level name, custom_maps\ and it, kept whole by the game engine) */ MAXIMUM_MAP_NAME_LENGTH = CUSTOM_EDITION_MAXIMUM_LEVEL_NAME_LENGTH - (sizeof(CUSTOM_EDITION_LEVEL_NAME_PREFIX) - 1), @@ -56,6 +58,13 @@ enum MAXIMUM_FILE_BYTES = 0x7FFFFFFF, }; +/* the maps hashed for their names, kept from one run to the next (in the +save root: a line a file, its naming_key, size, time and digits, in hexadecimal +and decimal), so that a map is hashed once as long as its file stays the +same, as when the maps were renamed for their hash */ +#define NAMED_FILE "z:\\map_hashes.txt" +#define NAMED_FILE_FORMAT "# OpenCE map hashes 1" + /* what a hash is of: these bytes, the file's size (4 bytes, little-endian) and its pieces' hashes */ static char const file_hash_label[] = "OpenCE map 1"; @@ -90,6 +99,22 @@ struct naming { char folder[MAP_SHARE_PATH_SIZE]; char name[MAP_SHARE_PATH_SIZE]; + /* the file's size and time before it was hashed: its digits are kept + only if they are the same after (a file being copied over is hashed + again once it is whole) */ + unsigned long size; + unsigned long modified; +}; + +/* a map file hashed for its name: by its folder and name (naming_key), its +size and when it was written then, and the digits it is named by (none: +it could not be read) */ +struct named +{ + unsigned long key; + unsigned long size; + unsigned long modified; + char digits[MAP_SHARE_NAME_DIGITS + 1]; }; struct map_share_files_globals @@ -110,7 +135,13 @@ struct map_share_files_globals short naming_count; struct naming naming_queue[MAXIMUM_NAMING_QUEUE]; long named_count; - unsigned long named_hashes[MAXIMUM_NAMED]; + struct named named[MAXIMUM_NAMED]; + boolean named_loaded; + /* digits worked out since NAMED_FILE was written */ + boolean named_dirty; + /* a map the queue had no room for: the map lists offer theirs again + once it is empty */ + boolean naming_overflowed; /* the pieces asked for, and what was found for their owner */ boolean pieces_wanted; @@ -457,27 +488,149 @@ static unsigned long naming_key( return key; } -static boolean naming_known( - unsigned long key) +/* the maps hashed in earlier runs (NAMED_FILE), once */ +static void named_load( + void) { struct map_share_files_globals *globals = &map_share_files_globals; + char line[128]; + FILE *stream; + + if (globals->named_loaded) + return; + globals->named_loaded = TRUE; + stream = fopen(NAMED_FILE, "rb"); + if (!stream) + return; + if (fgets(line, sizeof(line), stream) && !csstrncmp(line, NAMED_FILE_FORMAT, csstrlen(NAMED_FILE_FORMAT))) + { + while (globals->named_count < MAXIMUM_NAMED && fgets(line, sizeof(line), stream)) + { + struct named *named = &globals->named[globals->named_count]; + char digits[16]; + short index; + + csmemset(named, 0, sizeof(*named)); + if (sscanf(line, "%lx %lu %lu %15s", &named->key, &named->size, &named->modified, digits) != 4 || + csstrlen(digits) != MAP_SHARE_NAME_DIGITS) + { + continue; + } + for (index = 0; index < MAP_SHARE_NAME_DIGITS; index++) + { + if (!((digits[index] >= '0' && digits[index] <= '9') || (digits[index] >= 'a' && digits[index] <= 'f'))) + break; + } + if (index < MAP_SHARE_NAME_DIGITS) + continue; + csstrcpy(named->digits, digits); + globals->named_count++; + } + } + fclose(stream); +} + +/* the maps hashed kept for the next runs (NAMED_FILE): those given up on +are tried again then */ +static void named_save( + void) +{ + struct map_share_files_globals *globals = &map_share_files_globals; + FILE *stream = fopen(NAMED_FILE, "wb"); long index; + if (!stream) + return; + fprintf(stream, "%s\n", NAMED_FILE_FORMAT); for (index = 0; index < globals->named_count; index++) { - if (globals->named_hashes[index] == key) - return TRUE; + struct named const *named = &globals->named[index]; + + if (named->digits[0]) + fprintf(stream, "%08lx %lu %lu %s\n", named->key, named->size, named->modified, named->digits); } - return FALSE; + fclose(stream); } +/* the map file's entry, if it was hashed (or given up on) as it is now +(its size and time the same) */ +static struct named *naming_find( + char const *folder, + char const *name) +{ + struct map_share_files_globals *globals = &map_share_files_globals; + unsigned long key = naming_key(folder, name); + char path[MAP_SHARE_PATH_SIZE]; + unsigned long size, modified; + long index; + + named_load(); + if (csstrlen(folder) + csstrlen(name) + 4 >= MAP_SHARE_PATH_SIZE) + return NULL; + csprintf(path, "%s%s.map", folder, name); + if (!file_stamp(path, &size, &modified)) + return NULL; + for (index = 0; index < globals->named_count; index++) + { + struct named *named = &globals->named[index]; + + if (named->key == key && named->size == size && named->modified == modified) + return named; + } + return NULL; +} + +/* the hash's digits of the map file .map remembered (none: +it could not be read), as the file was when hashed (size, modified): its +entry of before (another version) replaced */ static void naming_remember( - unsigned long key) + char const *folder, + char const *name, + unsigned long size, + unsigned long modified, + char const *digits) { struct map_share_files_globals *globals = &map_share_files_globals; + unsigned long key = naming_key(folder, name); + struct named *named = NULL; + long index; - if (globals->named_count < MAXIMUM_NAMED) - globals->named_hashes[globals->named_count++] = key; + named_load(); + for (index = 0; index < globals->named_count && !named; index++) + { + if (globals->named[index].key == key) + named = &globals->named[index]; + } + if (!named) + { + /* (when full, the oldest goes) */ + if (globals->named_count == MAXIMUM_NAMED) + { + csmemmove(&globals->named[0], &globals->named[1], (MAXIMUM_NAMED - 1) * sizeof(globals->named[0])); + globals->named_count--; + } + named = &globals->named[globals->named_count++]; + csmemset(named, 0, sizeof(*named)); + named->key = key; + } + named->size = size; + named->modified = modified; + csstrncpy(named->digits, digits, MAP_SHARE_NAME_DIGITS); + named->digits[MAP_SHARE_NAME_DIGITS] = 0; + if (named->digits[0]) + globals->named_dirty = TRUE; +} + +/* the naming's file's size and time now, into it; FALSE if it is not there */ +static boolean naming_stamp( + struct naming *naming) +{ + char path[MAP_SHARE_PATH_SIZE]; + + if (csstrlen(naming->folder) + csstrlen(naming->name) + 4 >= MAP_SHARE_PATH_SIZE) + return FALSE; + csprintf(path, "%s%s.map", naming->folder, naming->name); + return file_stamp(path, &naming->size, &naming->modified); } void map_share_name_map( @@ -485,13 +638,15 @@ void map_share_name_map( char const *name) { struct map_share_files_globals *globals = &map_share_files_globals; - unsigned long key = naming_key(folder, name); short index; - /* (the custom_maps folder's alone: an install of Custom Edition is - left as it is, for Custom Edition) */ - if (csstrcasecmp(folder, CUSTOM_EDITION_MAP_DIRECTORY) || map_share_name_hashed(name) || naming_known(key)) + /* (the maps folders': a game's level name finds an install of Custom + Edition's maps by their hash too, though they are not shared) */ + if ((csstrcasecmp(folder, CUSTOM_EDITION_MAP_DIRECTORY) && csstrcasecmp(folder, CUSTOM_EDITION_INSTALL_MAP_DIRECTORY)) || + map_share_name_hashed(name) || naming_find(folder, name)) + { return; + } for (index = 0; index < globals->naming_count; index++) { if (!csstrcasecmp(globals->naming_queue[index].name, name) && @@ -506,116 +661,123 @@ void map_share_name_map( return; } if (globals->naming_count == MAXIMUM_NAMING_QUEUE) + { + globals->naming_overflowed = TRUE; return; + } + csmemset(&globals->naming_queue[globals->naming_count], 0, sizeof(globals->naming_queue[0])); csstrncpy(globals->naming_queue[globals->naming_count].folder, folder, MAP_SHARE_PATH_SIZE - 1); csstrncpy(globals->naming_queue[globals->naming_count].name, name, MAP_SHARE_PATH_SIZE - 1); - globals->naming_count++; -} - -/* renamed , if it is there -and that is not */ -static boolean rename_beside( - char const *folder, - char const *from, - char const *to, - char const *extension) -{ - char from_path[MAP_SHARE_PATH_SIZE]; - char to_path[MAP_SHARE_PATH_SIZE]; - - if (csstrlen(folder) + csstrlen(from) + csstrlen(extension) >= MAP_SHARE_PATH_SIZE || - csstrlen(folder) + csstrlen(to) + csstrlen(extension) >= MAP_SHARE_PATH_SIZE) - { - return FALSE; - } - csprintf(from_path, "%s%s%s", folder, from, extension); - csprintf(to_path, "%s%s%s", folder, to, extension); - return MoveFileA(from_path, to_path) != 0; + if (naming_stamp(&globals->naming_queue[globals->naming_count])) + globals->naming_count++; } -/* a map hashed: renamed _.map (the name cut short to fit the -map lists), with its picture and description */ +/* a map hashed: the digits it is named by remembered (its file is not +renamed: a player's maps are theirs, and other programs use them) */ static void naming_finish( struct naming const *naming, struct hash_job const *job) { char digits[MAP_SHARE_NAME_DIGITS + 1]; - char hashed[MAP_SHARE_PATH_SIZE]; - char path[MAP_SHARE_PATH_SIZE]; - short base_length = (short)csstrlen(naming->name); - char const *loaded = custom_edition_cache_loaded_path(); + struct naming now = *naming; - csprintf(path, "%s%s.map", naming->folder, naming->name); - /* (in use: named another time) */ - if (loaded && !csstrcasecmp(loaded, path)) - return; - naming_remember(naming_key(naming->folder, naming->name)); if (job->failed) { - error(_error_silent, "map sharing: '%s' could not be read to name it for its hash", path); + error(_error_silent, "map sharing: '%s%s.map' could not be read to name it for its hash", naming->folder, + naming->name); + naming_remember(naming->folder, naming->name, naming->size, naming->modified, ""); return; } - map_share_hash_digits(job->hash, digits); - base_length = (short)MIN(base_length, MAXIMUM_MAP_NAME_LENGTH - MAP_SHARE_NAME_DIGITS - 1); - csmemcpy(hashed, naming->name, base_length); - csprintf(hashed + base_length, "_%s", digits); - if (!rename_beside(naming->folder, naming->name, hashed, ".map")) + /* (changed while it was hashed: hashed again when it is next asked for) */ + if (!naming_stamp(&now) || now.size != naming->size || now.modified != naming->modified) { - error(_error_silent, "map sharing: '%s' was not renamed %s.map (that file exists, or this one is in use)", - path, hashed); + error(_error_silent, "map sharing: '%s%s.map' changed while it was hashed", naming->folder, naming->name); return; } - rename_beside(naming->folder, naming->name, hashed, ".bmp"); - rename_beside(naming->folder, naming->name, hashed, ".txt"); - error(_error_silent, "map sharing: %s.map is now %s.map, named for its hash", naming->name, hashed); - custom_edition_maps_look_again(); + map_share_hash_digits(job->hash, digits); + naming_remember(naming->folder, naming->name, naming->size, naming->modified, digits); +} + +boolean map_share_name_digits( + char const *folder, + char const *name, + char *digits) +{ + struct named *named = naming_find(folder, name); + struct naming naming; + struct hash_job job; + + if (!named) + { + /* (hashed here: a map's hash takes a fraction of a second) */ + if (csstrlen(folder) + csstrlen(name) + 4 >= MAP_SHARE_PATH_SIZE) + return FALSE; + csmemset(&naming, 0, sizeof(naming)); + csmemset(&job, 0, sizeof(job)); + csstrncpy(naming.folder, folder, sizeof(naming.folder) - 1); + csstrncpy(naming.name, name, sizeof(naming.name) - 1); + if (!naming_stamp(&naming)) + return FALSE; + csprintf(job.path, "%s%s.map", folder, name); + hash_job_run(&job); + naming_finish(&naming, &job); + free(job.piece_hashes); + named = naming_find(folder, name); + } + if (!named || !named->digits[0]) + return FALSE; + csstrcpy(digits, named->digits); + return TRUE; } void map_share_level_name_hash( char *level_name, long size) { - struct naming naming; - struct hash_job job; char path[MAP_SHARE_PATH_SIZE]; + char file[MAP_SHARE_PATH_SIZE]; + char digits[MAP_SHARE_NAME_DIGITS + 1]; char const *name; - char const *hashed; + size_t length; if (!level_name || !custom_edition_level_name(level_name)) return; name = tag_name_strip_path(level_name); if (map_share_name_hashed(name) || !custom_edition_map_file_path(level_name, path)) return; - /* (the file's own name, which may have its hash already) */ - hashed = tag_name_strip_path(path); + /* (the custom_maps folder's alone: an install of Custom Edition's maps + are not shared) */ if (_strnicmp(path, CUSTOM_EDITION_MAP_DIRECTORY, csstrlen(CUSTOM_EDITION_MAP_DIRECTORY)) || strchr(path + csstrlen(CUSTOM_EDITION_MAP_DIRECTORY), '\\')) { return; } - if (!map_share_name_hashed(name) && csstrlen(hashed) > 4 && csstrlen(hashed) - 4 == csstrlen(name) && - !_strnicmp(hashed, name, csstrlen(name))) + /* the file's own name, which may have its hash already (a map downloaded, + or renamed by an earlier build) */ + length = csstrlen(path + csstrlen(CUSTOM_EDITION_MAP_DIRECTORY)); + if (length <= 4 || length - 4 >= sizeof(file)) + return; + csprintf(file, "%.*s", (int)(length - 4), path + csstrlen(CUSTOM_EDITION_MAP_DIRECTORY)); + if (map_share_name_hashed(file)) { - /* named now: hashed here (a map's hash takes a fraction of a second - to work out) and renamed, unless it is loaded */ - csmemset(&naming, 0, sizeof(naming)); - csmemset(&job, 0, sizeof(job)); - csstrncpy(naming.folder, CUSTOM_EDITION_MAP_DIRECTORY, sizeof(naming.folder) - 1); - csstrncpy(naming.name, name, sizeof(naming.name) - 1); - csstrncpy(job.path, path, sizeof(job.path) - 1); - hash_job_run(&job); - naming_finish(&naming, &job); - free(job.piece_hashes); - if (!custom_edition_map_file_path(level_name, path)) + if (csstrlen(CUSTOM_EDITION_LEVEL_NAME_PREFIX) + csstrlen(file) < (unsigned long)size) + csprintf(level_name, "%s%s", CUSTOM_EDITION_LEVEL_NAME_PREFIX, file); + } + else + { + /* named for its hash, the file as it is (custom_edition_cache.c finds + .map for _ by the hash); a name too long to be kept + whole with the hash cut short to fit, as the maps were renamed before + (custom_edition_cache.c finds the file whose name starts so) */ + short base_length = (short)MIN(csstrlen(file), MAXIMUM_MAP_NAME_LENGTH - MAP_SHARE_NAME_DIGITS - 1); + + if (csstrlen(CUSTOM_EDITION_LEVEL_NAME_PREFIX) + base_length + 1 + MAP_SHARE_NAME_DIGITS >= (unsigned long)size || + !map_share_name_digits(CUSTOM_EDITION_MAP_DIRECTORY, file, digits)) + { return; - hashed = tag_name_strip_path(path); + } + csprintf(level_name, "%s%.*s_%s", CUSTOM_EDITION_LEVEL_NAME_PREFIX, (int)base_length, file, digits); } - /* the level name of the file found: custom_maps\_ */ - if (csstrlen(hashed) <= 4 || csstrlen(CUSTOM_EDITION_LEVEL_NAME_PREFIX) + csstrlen(hashed) - 4 >= (unsigned long)size) - return; - csprintf(level_name, "%s%.*s", CUSTOM_EDITION_LEVEL_NAME_PREFIX, (int)(csstrlen(hashed) - 4), hashed); - if (!map_share_name_hashed(tag_name_strip_path(level_name))) - return; error(_error_silent, "map sharing: the game's map is %s", level_name); } @@ -627,6 +789,22 @@ void map_share_files_update( struct map_share_files_globals *globals = &map_share_files_globals; short index; + /* (the maps hashed kept once no more are waiting, not after each; and + the map lists asked for the maps there was no room for) */ + if (!globals->naming_count && globals->job_type != _hash_job_name) + { + if (globals->named_dirty) + { + named_save(); + globals->named_dirty = FALSE; + } + if (globals->naming_overflowed) + { + globals->naming_overflowed = FALSE; + custom_edition_maps_look_again(); + } + } + if (globals->thread) { if (!thread_has_exited(globals->thread)) From 41824b81ad8e8da2cce36b2a7548a844820f139e Mon Sep 17 00:00:00 2001 From: FractumSeraph <8539982+FractumSeraph@users.noreply.github.com> Date: Mon, 12 Oct 2026 23:49:52 -0500 Subject: [PATCH 2/4] Halo's loading screen draws, with the Xbox's own picture or clouds The loading screen (interface/progress_bar.c: a light sweeping from left to right over a picture, with a glowing trail) drew nothing: it uses the fixed-function pipeline (SetVertexShader with 0), which d3d8_gl.c did not have, and its picture, loading.tga, is on no retail disc. - d3d8_gl.c draws fixed-function immediate-mode draws with a vertex shader of its own (nv2a_fixed_function_glsl), positions transformed by the world, view and projection matrices; and keeps a front buffer (a 640x480 render target taking the middle of the frame at BlockUntilVerticalBlank) for GetBackBuffer with -1, the frame before, whose blur makes the light's trail. The screen is drawn in the middle 640 columns, as the menus are on a wide screen. - After it, the rasterizer's caches of the device's states and of its vertex shader are made the device's again (rasterizer_forget_hardware_state, rasterizer_vertex_shader_runtime_forget): it sets them itself; and SelectVertexShader (a packed program) always leaves the fixed-function pipeline. - On OpenGL ES (Android, the web) the fixed-function shader turns Direct3D's clip space as the others do (HALO_GLES); without OpenGL (debug.null_renderer) it is not compiled. - The picture is the Xbox's own: the retail default.xbe holds it (320 by 240, runs of 4-bit greys after its width and height), and importing a disc image now writes it into the maps folder as loading.tga: port/linux/src/ xiso.c, the Android app's XisoExtractor.java and the web page's xiso-worker.js. Without one (a maps folder copied by hand) the light sweeps over clouds the game makes. No game data is in the repository. - progress_bar.c also has a mode a download screen over the menus can use (a share given, from 0, drawn over the menus, and let go of). - A picture that cannot be written whole is not left cut short (the loading screen would read past it). Checked: port/web/tests/xiso.test.js takes the picture out of made-up executables (and an image's default.xbe); the Java decoder gives the same bytes as the JavaScript one; xiso.c's picture from a Rev 2 disc image matched a separate decoder's byte for byte; the Linux CI steps and the web build and its tests in Docker; the Windows release build. Co-Authored-By: Claude Opus 5.5 --- .../java/com/halo/decomp/XisoExtractor.java | 93 +++++++++ port/linux/src/d3d8_gl.c | 192 +++++++++++++++++- port/linux/src/nv2a_vsh.c | 38 ++++ port/linux/src/xgpu.h | 3 + port/linux/src/xiso.c | 107 +++++++++- port/web/site/xiso-worker.js | 71 ++++++- port/web/tests/xiso.test.js | 87 +++++++- source/interface/progress_bar.c | 181 ++++++++++++++--- source/interface/progress_bar.h | 6 + source/rasterizer/xbox/rasterizer_xbox.c | 15 ++ .../xbox/rasterizer_xbox_internal.h | 7 + .../rasterizer_xbox_vertex_shaders_runtime.c | 11 + 12 files changed, 772 insertions(+), 39 deletions(-) diff --git a/port/android/app/src/main/java/com/halo/decomp/XisoExtractor.java b/port/android/app/src/main/java/com/halo/decomp/XisoExtractor.java index 95ce93729a..2be2b3bf32 100644 --- a/port/android/app/src/main/java/com/halo/decomp/XisoExtractor.java +++ b/port/android/app/src/main/java/com/halo/decomp/XisoExtractor.java @@ -29,6 +29,11 @@ * The files are written to maps.partial first and moved into maps once they * all are, so an interrupted extraction never leaves maps/ui.map behind. * + * The loading screen's picture, which the retail disc has no file of, is + * taken out of the image's default.xbe and written beside the maps as the + * loading.tga the game reads (loadingPicture, as xiso.c's + * write_loading_picture); without it the loading screen makes clouds. + * * Some parts of this code are copyright in@fishtank.com. This product * includes software developed by in <in@fishtank.com>. * @@ -76,6 +81,12 @@ final class XisoExtractor { private static final int MAXIMUM_FILES = 256; private static final int COPY_BUFFER_SIZE = 1 << 20; private static final byte[] VOLUME_MAGIC = "MICROSOFT*XBOX*MEDIA".getBytes(StandardCharsets.US_ASCII); + /* the loading screen's picture (source/interface/progress_bar.c) */ + private static final int LOADING_WIDTH = 320; + private static final int LOADING_HEIGHT = 240; + private static final int TGA_HEADER_SIZE = 18; + private static final long MAXIMUM_XBE_SIZE = 64 << 20; + private static final String LOADING_PICTURE = "loading.tga"; /* where the game partition starts: a plain image, and whole-disc images (extract-xiso's GLOBAL, XGD3 and XGD1 offsets) */ @@ -213,11 +224,88 @@ private static void walk(ByteBuffer table, long offset, int depth, boolean direc walk(table, right, depth + 1, directories, out, visited); } + /** + * The loading screen's picture out of a default.xbe, as the TGA the game + * reads (uncompressed, 24 bits, rows from the bottom), or null. The + * executable holds it, 320 by 240, as runs of 4-bit greys (a byte each: + * the grey's high four bits in its low nibble, the run's length in its high + * one) after the width and height as 32-bit numbers: found by those two + * numbers followed by runs that fill the picture exactly. + */ + static byte[] loadingPicture(byte[] xbe) { + int pixels = LOADING_WIDTH * LOADING_HEIGHT; + byte[] greys = new byte[pixels]; + ByteBuffer words = ByteBuffer.wrap(xbe).order(ByteOrder.LITTLE_ENDIAN); + boolean found = false; + + for (int at = 0; at + 8 <= xbe.length && !found; at++) { + if (words.getInt(at) != LOADING_WIDTH || words.getInt(at + 4) != LOADING_HEIGHT) + continue; + int pixel = 0; + for (int next = at + 8; next < xbe.length && pixel < pixels; next++) { + int run = (xbe[next] & 0xFF) >> 4; + + if (run == 0 || pixel + run > pixels) + break; + java.util.Arrays.fill(greys, pixel, pixel + run, (byte) ((xbe[next] & 0x0F) << 4)); + pixel += run; + } + found = pixel == pixels; + } + if (!found) + return null; + byte[] tga = new byte[TGA_HEADER_SIZE + pixels * 3]; + tga[2] = 2; + tga[12] = (byte) (LOADING_WIDTH & 0xFF); + tga[13] = (byte) (LOADING_WIDTH >> 8); + tga[14] = (byte) (LOADING_HEIGHT & 0xFF); + tga[15] = (byte) (LOADING_HEIGHT >> 8); + tga[16] = 24; + for (int y = 0; y < LOADING_HEIGHT; y++) { + for (int x = 0; x < LOADING_WIDTH; x++) { + int out = TGA_HEADER_SIZE + (y * LOADING_WIDTH + x) * 3; + byte grey = greys[(LOADING_HEIGHT - 1 - y) * LOADING_WIDTH + x]; + + tga[out] = tga[out + 1] = tga[out + 2] = grey; + } + } + return tga; + } + + /** writes the root's default.xbe's loading picture into folder; whether it did */ + private boolean writeLoadingPicture(ByteBuffer rootTable, File folder) { + List rootFiles = new ArrayList<>(); + walk(rootTable, 0, 0, false, rootFiles, new int[1]); + for (Entry file : rootFiles) { + if (!file.name.equalsIgnoreCase("default.xbe") || file.size <= 0 || file.size > MAXIMUM_XBE_SIZE) + continue; + File picture = new File(folder, LOADING_PICTURE); + try { + ByteBuffer xbe = ByteBuffer.allocate((int) file.size); + readAt(partition + file.sector * SECTOR_SIZE, xbe); + byte[] tga = loadingPicture(xbe.array()); + if (tga == null) + return false; + try (FileOutputStream out = new FileOutputStream(picture)) { + out.write(tga); + } + return true; + } catch (IOException | OutOfMemoryError e) { + /* (no picture, rather than one cut short, which the loading + screen would read past: it makes clouds) */ + picture.delete(); + return false; + } + } + return false; + } + private void extract(File destination, Progress progress) throws IOException { long[] root = findVolume(); /* the root's maps folder */ ByteBuffer table = readDirectory(root[0], root[1], "The disc image's file system is damaged."); + ByteBuffer rootTable = table; List directories = new ArrayList<>(); walk(table, 0, 0, true, directories, new int[1]); Entry maps = null; @@ -234,9 +322,11 @@ private void extract(File destination, Progress progress) throws IOException { walk(table, 0, 0, false, files, new int[1]); long total = 0; boolean hasUi = false; + boolean hasLoading = false; for (Entry file : files) { total += file.size; hasUi |= file.name.equalsIgnoreCase("ui.map"); + hasLoading |= file.name.equalsIgnoreCase(LOADING_PICTURE); } if (!hasUi) throw new ExtractException("The disc image's maps folder has no ui.map: it is not a Halo disc."); @@ -274,6 +364,9 @@ private void extract(File destination, Progress progress) throws IOException { } } + if (!hasLoading && writeLoadingPicture(rootTable, partial)) + files.add(new Entry(LOADING_PICTURE, 0, 0)); + /* (the maps folder may be there, empty: the app makes it for adb) */ if (!finished.isDirectory() && !finished.mkdirs()) throw new ExtractException("Could not create " + finished + "."); diff --git a/port/linux/src/d3d8_gl.c b/port/linux/src/d3d8_gl.c index 9e260d75d8..0862959c0a 100644 --- a/port/linux/src/d3d8_gl.c +++ b/port/linux/src/d3d8_gl.c @@ -500,6 +500,12 @@ struct gl_device { D3DPRESENT_PARAMETERS presentation; D3DSurface back_buffer; + /* the frame shown last, as the loading screen reads it (GetBackBuffer + with -1: front_buffer_ready); the frame it was last asked for in, and + the frame its picture was last taken in (front_buffer_take), each + 1 */ + D3DSurface front_buffer; + unsigned long front_buffer_asked; + unsigned long front_buffer_taken; D3DSurface depth_buffer; D3DSurface *render_target; D3DSurface *depth_stencil; @@ -510,6 +516,9 @@ struct gl_device D3DSHADERCONSTANTMODE shader_constant_mode; struct vertex_shader_object *vertex_shader; + /* SetVertexShader chose the fixed-function pipeline (with 0): the + loading screen's draws (fixed_function_program) */ + BOOL fixed_function; struct vertex_shader_object *program_slots[VERTEX_PROGRAM_SLOTS]; unsigned long program_address; float constants[XGPU_VERTEX_CONSTANT_COUNT][4]; @@ -1164,10 +1173,16 @@ void WINAPI D3DDevice_SetVerticalBlankCallback(D3DCALLBACK callback) vertical_blank_start(); } +static void front_buffer_take(void); + void WINAPI D3DDevice_BlockUntilVerticalBlank(void) { unsigned long count; + /* (the loading screen's last call: its frame, for the next frame's + trails) */ + front_buffer_take(); + vertical_blank_start(); pthread_mutex_lock(&vertical_blank_lock); count = vertical_blank_count; @@ -2124,10 +2139,19 @@ void WINAPI D3DDevice_GetDeviceCaps(D3DCAPS8 *caps) caps->MaxPixelShaderValue = 1.0f; } +static BOOL front_buffer_ready(void); + void WINAPI D3DDevice_GetBackBuffer(INT back_buffer, D3DBACKBUFFER_TYPE type, D3DSurface **result) { - (void)back_buffer; (void)type; + /* -1: the front buffer, the frame shown last, which the loading screen + blurs into its light's trails (progress_bar.c) */ + if (back_buffer == -1 && front_buffer_ready()) + { + device.front_buffer.Common++; + *result = &device.front_buffer; + return; + } /* like Direct3D, the caller gets a reference it must release */ device.back_buffer.Common++; *result = &device.back_buffer; @@ -2660,7 +2684,13 @@ void WINAPI D3DDevice_SetVertexShader(DWORD handle) device.vertex_shader = object; device.program_address = 0; device.program_slots[0] = object; + device.fixed_function = FALSE; } + /* 0: the fixed-function pipeline, which only the loading screen uses + (progress_bar.c). Another handle that is no shader (NONE, of a shader + that could not be made) changes nothing, as before */ + else if (!handle) + device.fixed_function = TRUE; } void WINAPI D3DDevice_LoadVertexShader(DWORD handle, DWORD address) @@ -2673,6 +2703,9 @@ void WINAPI D3DDevice_SelectVertexShader(DWORD handle, DWORD address) { struct vertex_shader_object *object = vertex_shader_from_handle(handle); + /* (a program, loaded or packed at the address: never the fixed-function + pipeline, which SetVertexShader with 0 sets) */ + device.fixed_function = FALSE; if (object) device.vertex_shader = object; if (address < VERTEX_PROGRAM_SLOTS) @@ -2706,6 +2739,51 @@ static struct vertex_shader_object *current_program(void) return program ? program : device.vertex_shader; } +/* the fixed-function pipeline as a program (SetVertexShader with 0): its +immediate-mode draws only, whose positions D3DDevice_End +transforms by the world, view and projection matrices (nv2a_fixed_function_glsl). +Draws from vertex buffers have no declaration to read them by, and are not +drawn (no game draw makes one). */ +static struct vertex_shader_object *fixed_function_program(void) +{ + static struct vertex_shader_object program; + static DWORD no_instructions[4]; + + if (!program.instructions) + { + char *source = nv2a_fixed_function_glsl(); + + program.signature = VERTEX_SHADER_SIGNATURE; + program.instructions = no_instructions; + program.shader[1] = xgpu_compile_shader(GL_VERTEX_SHADER, source, "fixed-function vertex"); + /* (vertex_shader_get: neither variant compiled from instructions) */ + program.shaders_tried = 1 | 2; + free(source); + } + return &program; +} + +/* a position in immediate mode by the fixed-function pipeline's transforms: +Direct3D's row vectors, times world, view, then projection */ +static void fixed_function_transform(float *position) +{ + static const D3DTRANSFORMSTATETYPE order[3] = { D3DTS_WORLD, D3DTS_VIEW, D3DTS_PROJECTION }; + int which, column; + + for (which = 0; which < 3; which++) + { + const D3DMATRIX *matrix = &device.transforms[order[which]]; + float in[4]; + + memcpy(in, position, sizeof(in)); + for (column = 0; column < 4; column++) + { + position[column] = in[0] * matrix->m[0][column] + in[1] * matrix->m[1][column] + + in[2] * matrix->m[2][column] + in[3] * matrix->m[3][column]; + } + } +} + /* ---------- program cache */ /* size is a multiple of 4 */ @@ -3737,14 +3815,19 @@ static unsigned long model_light_register(int light) static struct program_entry *prepare_draw(BOOL immediate) { - struct vertex_shader_object *program = current_program(); + /* (the fixed-function program compiled only with OpenGL there: not by + the null renderer) */ + struct vertex_shader_object *program = !device.gl_ready ? NULL : + device.fixed_function ? fixed_function_program() : current_program(); struct nv2a_pixel_shader_key key; struct program_entry *entry; struct draw_uniforms uniforms; BOOL has_depth = FALSE; int stage; - if (!device.gl_ready || !program || !device.vertex_shader || !program->instructions) + /* (the fixed-function pipeline's draws: immediate mode's only) */ + if (!device.gl_ready || !program || !(device.vertex_shader || device.fixed_function) || !program->instructions || + (device.fixed_function && !immediate)) { stats.skipped_no_program++; return NULL; @@ -5313,6 +5396,12 @@ void WINAPI D3DDevice_End(void) device.immediate_active = FALSE; if (!count || !prepare_draw(TRUE)) return; + /* (the fixed-function pipeline's: positions into clip space) */ + if (device.fixed_function) + { + for (index = 0; index < count; index++) + fixed_function_transform(device.immediate_vertices + index * XGPU_VERTEX_ATTRIBUTE_COUNT * 4); + } trace_draw("immediate", type, count, device.immediate_vertices); #ifdef HALO_WEB vertex_array_cache_bind(NULL); @@ -5830,6 +5919,103 @@ static void visibility_copy_batch(void) } #endif +/* ---------- the front buffer + +The Xbox's front buffer is the frame on the screen, which the loading screen +reads back (GetBackBuffer with -1, progress_bar.c) and draws again blurred, +a little larger and fainter, under each new frame: the trails of its light. +Here it is a render target of the menus' 640x480, which takes the 640 +columns in the middle of the frame (where the loading screen draws, as the +menus do on a wide screen) once the loading screen has drawn it, while the +screen asks for it: at its BlockUntilVerticalBlank, its last call, so that +what is drawn over it after (the download screen's words) leaves no trail. */ + +enum +{ + FRONT_BUFFER_WIDTH = 640, + FRONT_BUFFER_HEIGHT = 480, +}; + +/* the front buffer, made the first time it is asked for, and black when the +frame before did not take its picture (a loading screen's first frame) */ +static BOOL front_buffer_ready(void) +{ + /* (its memory could not be had: not asked for again each frame) */ + static BOOL failed; + struct render_target_entry *front; + + if (!device.gl_ready || failed) + return FALSE; + if (!device.front_buffer.Data) + { + d3d8_surface_initialize(&device.front_buffer, D3DFMT_LIN_A8R8G8B8, FRONT_BUFFER_WIDTH, FRONT_BUFFER_HEIGHT); + if (!device.front_buffer.Data) + { + failed = TRUE; + return FALSE; + } + } + front = render_target_get(&device.front_buffer); + if (!front) + return FALSE; + if (device.front_buffer_taken != device.frame) + { + GLuint framebuffer; + + draw_flush(); + framebuffer = framebuffer_get(front->target.texture, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer); + glDisable(GL_SCISSOR_TEST); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + gl_check_errors("front buffer clear"); + xgpu_gl_state_invalidate(); + /* (drawn into, as a draw marks a target: the latest of its memory's) */ + front->last_rendered = device.frame + 1; + front->target.written = ++render_target_write_serial; + } + device.front_buffer_asked = device.frame + 1; + return TRUE; +} + +/* the frame as the loading screen has drawn it into the front buffer, when +this frame asked for it (D3DDevice_BlockUntilVerticalBlank) */ +static void front_buffer_take(void) +{ + struct render_target_entry *back_buffer, *front; + GLuint read, draw; + GLint width, left; + + if (!device.gl_ready || !device.front_buffer.Data || device.front_buffer_asked != device.frame + 1) + return; + back_buffer = render_target_get(&device.back_buffer); + front = render_target_get(&device.front_buffer); + if (!back_buffer || !front) + return; + draw_flush(); + render_target_resolve(&back_buffer->target); + read = framebuffer_get(back_buffer->target.texture, 0); + draw = framebuffer_get(front->target.texture, 0); + width = (GLint)(FRONT_BUFFER_WIDTH * back_buffer->target.scale[0] + 0.5f); + left = ((GLint)back_buffer->target.gl_width - width) / 2; + if (left < 0) + { + left = 0; + width = (GLint)back_buffer->target.gl_width; + } + glBindFramebuffer(GL_READ_FRAMEBUFFER, read); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, draw); + glDisable(GL_SCISSOR_TEST); + glBlitFramebuffer(left, 0, left + width, (GLint)back_buffer->target.gl_height, 0, 0, + (GLint)front->target.gl_width, (GLint)front->target.gl_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); + gl_check_errors("front buffer copy"); + xgpu_gl_state_invalidate(); + front->last_rendered = device.frame + 1; + front->target.written = ++render_target_write_serial; + device.front_buffer_taken = device.frame + 1; +} + void WINAPI D3DDevice_Present(CONST RECT *source_rectangle, CONST RECT *destination_rectangle, void *unused, void *unused2) { diff --git a/port/linux/src/nv2a_vsh.c b/port/linux/src/nv2a_vsh.c index 20df75e047..99a2c58a9c 100644 --- a/port/linux/src/nv2a_vsh.c +++ b/port/linux/src/nv2a_vsh.c @@ -586,3 +586,41 @@ char *nv2a_vertex_shader_to_glsl(const DWORD *instructions, unsigned long instru ); return text.buffer; } + +/* The fixed-function pipeline's vertex shader, for the draws that select it +(SetVertexShader with 0): only the loading screen's +(progress_bar.c), which gives each vertex its position, diffuse color and +up to four texture coordinates in immediate mode. d3d8_gl.c transforms the +positions by the world, view and projection matrices before the draw, so the +position here is already in Direct3D's clip space. */ +char *nv2a_fixed_function_glsl(void) +{ + struct xgpu_text text = { 0 }; + unsigned long index; + +#ifdef HALO_GLES + xgpu_text_append(&text, "#version %s\n", xgpu_capabilities.shading_language); +#endif + xgpu_text_append(&text, "%s", shader_prologue); + for (index = 0; index < XGPU_VERTEX_ATTRIBUTE_COUNT; index++) + xgpu_text_append(&text, "layout(location = %lu) in vec4 v%lu_in;\n", index, index); + xgpu_text_append(&text, + "void main()\n{\n" + "\tgl_Position = v0_in;\n" +#ifdef HALO_GLES + "\tgl_Position.y = -gl_Position.y;\n" + "\tgl_Position.z = 2.0 * gl_Position.z - gl_Position.w;\n" +#endif + "\tgl_PointSize = 1.0;\n" + "\txD0 = clamp(v3_in, 0.0, 1.0);\n" + "\txD1 = clamp(v4_in, 0.0, 1.0);\n" + "\txB0 = vec4(0.0, 0.0, 0.0, 1.0);\n" + "\txB1 = vec4(0.0, 0.0, 0.0, 1.0);\n" + "\txT0 = v9_in;\n" + "\txT1 = v10_in;\n" + "\txT2 = v11_in;\n" + "\txT3 = v12_in;\n" + "\txFog = 1.0;\n" + "}\n"); + return text.buffer; +} diff --git a/port/linux/src/xgpu.h b/port/linux/src/xgpu.h index 6e5058ea0c..b617dd2cab 100644 --- a/port/linux/src/xgpu.h +++ b/port/linux/src/xgpu.h @@ -99,6 +99,9 @@ lights the diffuse color for each pixel (nv2a_pixel_shader_key per_pixel_lighting). Returns a malloc'd string. */ char *nv2a_vertex_shader_to_glsl(const DWORD *instructions, unsigned long instruction_count, unsigned long packed_attribute_mask, const struct nv2a_vertex_lighting *lighting); +/* the fixed-function pipeline's vertex shader (the loading screen's draws): +positions already in clip space. Returns a malloc'd string. */ +char *nv2a_fixed_function_glsl(void); /* ---------- pixel shaders */ diff --git a/port/linux/src/xiso.c b/port/linux/src/xiso.c index 84fae910c9..29a08f3a3b 100644 --- a/port/linux/src/xiso.c +++ b/port/linux/src/xiso.c @@ -316,11 +316,102 @@ static int copy_file(struct xiso_image *image, const struct xiso_file *file, con return 1; } +/* The loading screen's picture (source/interface/progress_bar.c reads it as +maps/loading.tga). The retail game has no such file: its default.xbe holds +the picture, 320 by 240, as runs of 4-bit greys (a byte each: the grey's +high four bits in its low nibble, the run's length in its high one) after +the width and height as 32-bit numbers, and its loading screen decodes them +into the texture. Found by those two numbers followed by runs that fill the +picture exactly, and written into the maps folder as the uncompressed 24-bit +TGA progress_bar.c reads (port/web/site/xiso-worker.js does the same). Nothing is +written when it is not found: the loading screen then makes its own. */ +static void write_loading_picture(struct xiso_image *image, const struct xiso_file *xbe, const char *folder) +{ + enum + { + WIDTH = 320, + HEIGHT = 240, + PIXELS = WIDTH * HEIGHT, + TGA_HEADER_SIZE = 18, + MAXIMUM_XBE_SIZE = 64 << 20, + }; + unsigned char *data = NULL, *greys = NULL, *tga = NULL; + unsigned long at, next, pixel = 0; + char path[1300]; + int output, y, x; + + if (!xbe->size || xbe->size > MAXIMUM_XBE_SIZE) + return; + data = malloc(xbe->size); + greys = malloc(PIXELS); + tga = malloc(TGA_HEADER_SIZE + PIXELS * 3); + if (!data || !greys || !tga || + !read_at(image, image->partition + (unsigned long long)xbe->sector * SECTOR_SIZE, data, xbe->size)) + { + goto done; + } + for (at = 0; at + 8 <= xbe->size && pixel != PIXELS; at++) + { + if (read_u32(data + at) != WIDTH || read_u32(data + at + 4) != HEIGHT) + continue; + for (pixel = 0, next = at + 8; next < xbe->size && pixel < PIXELS; next++) + { + unsigned long run = data[next] >> 4; + + if (!run || pixel + run > PIXELS) + break; + memset(greys + pixel, (data[next] & 0x0F) << 4, run); + pixel += run; + } + } + if (pixel != PIXELS) + goto done; + memset(tga, 0, TGA_HEADER_SIZE); + tga[2] = 2; + tga[12] = WIDTH & 0xFF; + tga[13] = WIDTH >> 8; + tga[14] = HEIGHT & 0xFF; + tga[15] = HEIGHT >> 8; + tga[16] = 24; + /* (rows from the bottom; blue, green and red each the grey) */ + for (y = 0; y < HEIGHT; y++) + { + for (x = 0; x < WIDTH; x++) + { + unsigned char *out = tga + TGA_HEADER_SIZE + ((unsigned long)y * WIDTH + x) * 3; + + out[0] = out[1] = out[2] = greys[(unsigned long)(HEIGHT - 1 - y) * WIDTH + x]; + } + } + snprintf(path, sizeof(path), "%s/loading.tga", folder); + output = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_NOFOLLOW, 0644); + if (output >= 0) + { + int whole = write(output, tga, TGA_HEADER_SIZE + PIXELS * 3) == TGA_HEADER_SIZE + PIXELS * 3; + + if (close(output) != 0) + whole = 0; + /* (none rather than one cut short, which the loading screen would + read past) */ + if (whole) + platform_log("extracting maps/loading.tga (the loading screen's picture, from default.xbe)"); + else + unlink(path); + } + +done: + free(data); + free(greys); + free(tga); +} + int xiso_extract_maps(const char *image_path, const char *destination, xiso_progress_proc progress, void *context, char *error, int error_size) { struct xiso_image image; struct xiso_file *entries = NULL; + /* the root's default.xbe (the loading screen's picture) */ + struct xiso_file xbe; unsigned char *table = NULL; unsigned char *buffer = NULL; unsigned long root_sector, root_size; @@ -351,6 +442,17 @@ int xiso_extract_maps(const char *image_path, const char *destination, xiso_prog fail(&image, "The disc image's file system is damaged.%s", NULL); goto done; } + memset(&xbe, 0, sizeof(xbe)); + { + struct directory_walk walk = { table, root_size, entries, 0, MAXIMUM_FILES, 0, 0 }; + + walk_directory(&walk, 0, 0); + for (index = 0; index < walk.entry_count; index++) + { + if (names_match(entries[index].name, "default.xbe")) + xbe = entries[index]; + } + } { struct directory_walk walk = { table, root_size, entries, 0, MAXIMUM_FILES, 0, 1 }; @@ -375,13 +477,14 @@ int xiso_extract_maps(const char *image_path, const char *destination, xiso_prog /* its files */ { struct directory_walk walk = { table, root_size, entries, 0, MAXIMUM_FILES, 0, 0 }; - int has_ui = 0; + int has_ui = 0, has_loading = 0; walk_directory(&walk, 0, 0); for (index = 0; index < walk.entry_count; index++) { total += entries[index].size; has_ui |= names_match(entries[index].name, "ui.map"); + has_loading |= names_match(entries[index].name, "loading.tga"); } if (!has_ui) { @@ -398,6 +501,8 @@ int xiso_extract_maps(const char *image_path, const char *destination, xiso_prog if (!copy_file(&image, &entries[index], path, buffer, &done, total, progress, context)) goto done; } + if (!has_loading) + write_loading_picture(&image, &xbe, partial); if (rename(partial, final) != 0) { fail(&image, "Could not create %s.", final); diff --git a/port/web/site/xiso-worker.js b/port/web/site/xiso-worker.js index 4aaaa49f53..c64a50a50c 100644 --- a/port/web/site/xiso-worker.js +++ b/port/web/site/xiso-worker.js @@ -25,6 +25,11 @@ Each map is checked as the game checks it when it loads it (cache_files.c): "head" and "foot" signatures, the Xbox's cache version, and the build of a retail disc (01.10.12.2276) or of this decompilation's (01.01.14.2342). +The loading screen's picture, which the retail disc has no file of, is +taken out of the image's default.xbe and written beside the maps as the +loading.tga the game reads (loadingPicture; xiso.c's write_loading_picture +does the same). Without it the loading screen makes clouds of its own. + Messages from the page: { type: 'image', file } or { type: 'folder', files } (a maps folder's File objects). To the page: { type: 'progress', file, done, total }, then { type: 'done', files, bytes } or { type: 'error', message }. @@ -45,6 +50,11 @@ const COPY_CHUNK = 4 * 1024 * 1024; const MAP_HEADER_SIZE = 0x800; const CACHE_VERSION = 5; const BUILDS = ['01.10.12.2276', '01.01.14.2342']; +// the loading screen's picture (source/interface/progress_bar.c) +const LOADING_WIDTH = 320; +const LOADING_HEIGHT = 240; +const TGA_HEADER_SIZE = 18; +const MAXIMUM_XBE_SIZE = 64 * 1024 * 1024; // written last: the page starts the game only when it is there const COMPLETE_MARKER = '.complete'; @@ -156,22 +166,77 @@ async function checkedFiles(candidates) { return files; } +// The loading screen's picture out of a default.xbe, as the TGA the game +// reads (uncompressed, 24 bits, rows from the bottom), or null. The +// executable holds it, 320 by 240, as runs of 4-bit greys (a byte each: the +// grey's high four bits in its low nibble, the run's length in its high one) +// after the width and height as 32-bit numbers: found by those two numbers +// followed by runs that fill the picture exactly. +function loadingPicture(xbe) { + const pixels = LOADING_WIDTH * LOADING_HEIGHT; + const greys = new Uint8Array(pixels); + let found = false; + for (let at = 0; at + 8 <= xbe.length && !found; at++) { + if (u32(xbe, at) !== LOADING_WIDTH || u32(xbe, at + 4) !== LOADING_HEIGHT) continue; + let pixel = 0; + for (let next = at + 8; next < xbe.length && pixel < pixels; next++) { + const run = xbe[next] >> 4; + if (!run || pixel + run > pixels) break; + greys.fill((xbe[next] & 0x0F) << 4, pixel, pixel + run); + pixel += run; + } + found = pixel === pixels; + } + if (!found) return null; + const tga = new Uint8Array(TGA_HEADER_SIZE + pixels * 3); + tga[2] = 2; + tga[12] = LOADING_WIDTH & 0xFF; + tga[13] = LOADING_WIDTH >> 8; + tga[14] = LOADING_HEIGHT & 0xFF; + tga[15] = LOADING_HEIGHT >> 8; + tga[16] = 24; + for (let y = 0; y < LOADING_HEIGHT; y++) { + const row = greys.subarray((LOADING_HEIGHT - 1 - y) * LOADING_WIDTH, (LOADING_HEIGHT - y) * LOADING_WIDTH); + for (let x = 0; x < LOADING_WIDTH; x++) { + const out = TGA_HEADER_SIZE + (y * LOADING_WIDTH + x) * 3; + tga[out] = tga[out + 1] = tga[out + 2] = row[x]; + } + } + return tga; +} + +// the root's default.xbe's loading picture, as a file to copy, or null +async function loadingPictureFile(file, volume, rootEntries) { + const xbe = rootEntries.find((entry) => !entry.directory && entry.name.toLowerCase() === 'default.xbe'); + if (!xbe || !xbe.size || xbe.size > MAXIMUM_XBE_SIZE) return null; + const offset = volume.partition + xbe.sector * SECTOR_SIZE; + if (offset + xbe.size > file.size) return null; + const tga = loadingPicture(await readAt(file, offset, xbe.size)); + return tga && { name: 'loading.tga', size: tga.length, read: async (at, size) => tga.subarray(at, at + size) }; +} + async function imageFiles(file) { const volume = await findVolume(file); if (!volume) throw new Error('This file is not an Xbox disc image (no XDVDFS volume was found).'); const root = await readDirectory(file, volume, volume.rootSector, volume.rootSize); if (!root) throw new Error("The disc image's file system is damaged."); - const maps = walkDirectory(root).find((entry) => entry.directory && entry.name.toLowerCase() === 'maps'); + const rootEntries = walkDirectory(root); + const maps = rootEntries.find((entry) => entry.directory && entry.name.toLowerCase() === 'maps'); if (!maps) throw new Error('The disc image has no maps folder: it is not a Halo disc.'); const table = await readDirectory(file, volume, maps.sector, maps.size); if (!table) throw new Error("The disc image's maps folder is damaged."); - return checkedFiles(walkDirectory(table).filter((entry) => !entry.directory).map((entry) => { + const files = await checkedFiles(walkDirectory(table).filter((entry) => !entry.directory).map((entry) => { const offset = volume.partition + entry.sector * SECTOR_SIZE; if (offset + entry.size > file.size) { throw new Error(`The disc image ends before ${entry.name} does: is it complete?`); } return { name: entry.name, size: entry.size, read: (at, size) => readAt(file, offset + at, Math.min(size, entry.size - at)) }; })); + if (!files.some((entry) => entry.name.toLowerCase() === 'loading.tga')) { + const picture = await loadingPictureFile(file, volume, rootEntries); + if (picture) files.push(picture); + } + return files; } async function folderFiles(list) { @@ -250,5 +315,5 @@ if (typeof onmessage !== 'undefined' || typeof WorkerGlobalScope !== 'undefined' // (for the tests: port/web/tests) if (typeof module !== 'undefined') { - module.exports = { findVolume, walkDirectory, mapProblem, imageFiles, folderFiles, plainName }; + module.exports = { findVolume, walkDirectory, mapProblem, imageFiles, folderFiles, plainName, loadingPicture }; } diff --git a/port/web/tests/xiso.test.js b/port/web/tests/xiso.test.js index 5d22e1cd15..f20b4d4e28 100644 --- a/port/web/tests/xiso.test.js +++ b/port/web/tests/xiso.test.js @@ -61,9 +61,9 @@ function directoryTable(entries) { return table; } -// an image: its maps folder's files, where its game partition starts, and -// other entries of its root -function image({ maps, partition = 0, rootEntries = [] }) { +// an image: its maps folder's files, where its game partition starts, its +// default.xbe and other entries of its root +function image({ maps, partition = 0, rootEntries = [], xbe = new Uint8Array(100) }) { const chunks = new Map(); let nextSector = 0x30; const allocate = (bytes) => { @@ -76,7 +76,7 @@ function image({ maps, partition = 0, rootEntries = [] }) { const mapsTable = directoryTable(mapEntries); const mapsSector = allocate(mapsTable); const root = directoryTable([{ name: 'maps', directory: true, sector: mapsSector, size: mapsTable.length }, - { name: 'default.xbe', sector: allocate(new Uint8Array(100)), size: 100 }, ...rootEntries]); + { name: 'default.xbe', sector: allocate(xbe), size: xbe.length }, ...rootEntries]); const rootSector = allocate(root); const size = partition + nextSector * SECTOR; const bytes = new Uint8Array(size); @@ -168,3 +168,82 @@ test('a maps folder chosen as files is checked as an image is', async () => { assert.deepStrictEqual(result.map((file) => file.name).sort(), ['a10.map', 'bloodgulch.map', 'loading.tga', 'ui.map']); await assert.rejects(xiso.folderFiles(files.filter((file) => file.name !== 'ui.map')), /no ui\.map/); }); + +// the loading screen's picture (xiso-worker.js's loadingPicture): made-up +// executables holding a picture of grey bands as the retail one holds its own +const LOADING_WIDTH = 320; +const LOADING_HEIGHT = 240; +const loadingSizes = new Uint8Array([64, 1, 0, 0, 240, 0, 0, 0]); +const loadingGreys = Uint8Array.from({ length: LOADING_WIDTH * LOADING_HEIGHT }, + (_, pixel) => ((Math.floor(pixel / LOADING_WIDTH / 15) % 16) << 4)); + +// greys (multiples of 16) as the executable's runs: a byte each, the run's +// length in the high nibble, the grey's high bits in the low one +function loadingRuns(greys) { + const out = []; + for (let at = 0; at < greys.length;) { + let length = 1; + while (at + length < greys.length && greys[at + length] === greys[at] && length < 15) length++; + out.push(length << 4 | greys[at] >> 4); + at += length; + } + return Uint8Array.from(out); +} + +function concatenate(...parts) { + const out = new Uint8Array(parts.reduce((sum, part) => sum + part.length, 0)); + let at = 0; + for (const part of parts) { + out.set(part, at); + at += part.length; + } + return out; +} + +// (another 320, 240 before it, whose runs do not fill a picture) +const loadingXbe = concatenate(new Uint8Array(1000).fill(0xCC), loadingSizes, new Uint8Array([0x10, 0x00]), + new Uint8Array(64).fill(0x90), loadingSizes, loadingRuns(loadingGreys), new Uint8Array(1000).fill(0xCC)); + +test("the loading screen's picture is found in default.xbe and written as the TGA the game reads", () => { + const tga = xiso.loadingPicture(loadingXbe); + assert.ok(tga); + // (progress_bar.c: an uncompressed 24-bit picture of 320 by 240) + assert.strictEqual(tga[2], 2); + assert.strictEqual(tga[16], 24); + assert.strictEqual(tga[12] | tga[13] << 8, LOADING_WIDTH); + assert.strictEqual(tga[14] | tga[15] << 8, LOADING_HEIGHT); + assert.strictEqual(tga.length, 18 + LOADING_WIDTH * LOADING_HEIGHT * 3); + // (rows from the bottom, the grey in each channel) + for (const y of [0, 100, LOADING_HEIGHT - 1]) { + const row = tga.subarray(18 + (LOADING_HEIGHT - 1 - y) * LOADING_WIDTH * 3, 18 + (LOADING_HEIGHT - y) * LOADING_WIDTH * 3); + for (let x = 0; x < LOADING_WIDTH; x += 37) { + const grey = loadingGreys[y * LOADING_WIDTH + x]; + assert.deepStrictEqual([...row.subarray(x * 3, x * 3 + 3)], [grey, grey, grey]); + } + } +}); + +test('runs that do not fill the picture exactly are not it', () => { + const runs = loadingRuns(loadingGreys); + assert.strictEqual(xiso.loadingPicture(new Uint8Array(100).fill(0xCC)), null); + assert.strictEqual(xiso.loadingPicture(concatenate(loadingSizes, runs.subarray(0, -1))), null); + // (a run past the picture's end: its last 15 pixels as 14 and then 2) + assert.strictEqual(xiso.loadingPicture(concatenate(loadingSizes, runs.subarray(0, -1), new Uint8Array([0xE0, 0x20]))), null); + // (a run of none) + assert.strictEqual(xiso.loadingPicture(concatenate(loadingSizes, runs.subarray(0, -1), new Uint8Array([0x00, 0xF0]))), null); +}); + +test("an image whose maps folder has no loading.tga gets one from its default.xbe; one that has one keeps it", async () => { + const maps = goodMaps.filter((map) => map.name !== 'loading.tga'); + const files = await xiso.imageFiles(image({ maps, xbe: loadingXbe })); + const picture = files.find((file) => file.name === 'loading.tga'); + assert.ok(picture); + assert.strictEqual(picture.size, 18 + LOADING_WIDTH * LOADING_HEIGHT * 3); + assert.deepStrictEqual([...(await picture.read(0, 18))], [...xiso.loadingPicture(loadingXbe).subarray(0, 18)]); + const kept = await xiso.imageFiles(image({ maps: goodMaps, xbe: loadingXbe })); + assert.strictEqual(kept.filter((file) => file.name === 'loading.tga').length, 1); + assert.strictEqual(kept.find((file) => file.name === 'loading.tga').size, 50); + // (no picture in the executable: none, and the game makes clouds) + const none = await xiso.imageFiles(image({ maps })); + assert.ok(!none.some((file) => file.name === 'loading.tga')); +}); diff --git a/source/interface/progress_bar.c b/source/interface/progress_bar.c index 1e0a3ac934..48adecafc8 100644 --- a/source/interface/progress_bar.c +++ b/source/interface/progress_bar.c @@ -302,6 +302,9 @@ static void this_is_awful( static void progress_bar_render( real progress); +/* port: progress_bar_eachframe's release, a function of its own */ +static void progress_bar_let_go( + void); void tgaLoadHeader( FILE *file, @@ -313,11 +316,18 @@ void tgaLoadImageData( /* ---------- globals */ +/* port: rasterizer_xbox.c's (rasterizer_xbox_internal.h, which this file +does not include) */ +void rasterizer_forget_hardware_state( + void); + extern struct pixel_shader_definition blur_shader; extern struct pixel_shader_definition regular_shader; extern unsigned long current_time; static boolean progress_bar_rendering_enabled= TRUE; +/* port: a map's download shows the screen (progress_bar_download_display) */ +static boolean progress_bar_downloading= FALSE; /* the compressed monk chant played behind the loading screen */ byte compressed_monk_tone[18396]= @@ -1774,7 +1784,6 @@ void progress_bar_eachframe( void) { unsigned long time= GetTickCount(); - long sound_index; if (progress_bar_restart) { @@ -1783,50 +1792,85 @@ void progress_bar_eachframe( progress_bar_mode.state= 1; } - if (time - progress_bar_globals.start_time>1000) + /* port: (not while a map's download shows the screen over the menus, + whose frames come here) */ + if (time - progress_bar_globals.start_time>1000 && !progress_bar_downloading) + progress_bar_let_go(); + + return; +} + +/* port: the textures and sounds the screen made, let go of (as +progress_bar_eachframe did once a load was over; the original released +texture0 twice there, the second time already NULL: left out) */ +static void progress_bar_let_go( + void) +{ + long sound_index; + + last_t= 0; + if (progress_bar_mode.texture0) { - last_t= 0; - if (progress_bar_mode.texture0) - { - IDirect3DTexture8_Release(progress_bar_mode.texture0); - progress_bar_mode.texture0= NULL; - } - if (progress_bar_mode.texture1) - { - IDirect3DTexture8_Release(progress_bar_mode.texture1); - progress_bar_mode.texture1= NULL; - } - if (progress_bar_mode.texture0) + IDirect3DTexture8_Release(progress_bar_mode.texture0); + progress_bar_mode.texture0= NULL; + } + if (progress_bar_mode.texture1) + { + IDirect3DTexture8_Release(progress_bar_mode.texture1); + progress_bar_mode.texture1= NULL; + } + for (sound_index= 0; sound_index=0.f) && (progress<=1.f)); - if (progress_bar_mode.active && progress>0.f) + if ((progress_bar_mode.active || progress_bar_downloading) && progress>0.f) { if (!progress_bar_mode.texture0) { progress_bar_make_stuff_ready(); - progress_bar_globals.initial_progress= progress; + /* port: a download's screen sweeps from its start, 0 (it may + first be drawn at 1, its files there and being checked: 0/0) */ + progress_bar_globals.initial_progress= progress_bar_downloading ? 0.f : progress; } if (progress_bar_rendering_enabled) @@ -2029,7 +2073,15 @@ static void progress_bar_render( IDirect3DDevice8_GetTransform(global_d3d_device, D3DTS_PROJECTION, &progress_bar_globals.saved_projection); IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_WORLD, &progress_bar_globals.world); IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_VIEW, &progress_bar_globals.view); - IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_PROJECTION, &progress_bar_globals.projection); + /* port: on a wide screen, the 640 columns in its middle, as the menus are + drawn (the frame before, which the trails are, is those columns: + d3d8_gl.c's front buffer) */ + { + D3DXMATRIX projection= progress_bar_globals.projection; + + projection._11*= 640.f/(real)halo_screen_width(); + IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_PROJECTION, &projection); + } IDirect3DDevice8_SetRenderState(global_d3d_device, D3DRS_ALPHABLENDENABLE, TRUE); IDirect3DDevice8_SetRenderState(global_d3d_device, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); IDirect3DDevice8_SetRenderState(global_d3d_device, D3DRS_DESTBLEND, D3DBLEND_ONE); @@ -2087,6 +2139,9 @@ static void progress_bar_render( IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_VIEW, &progress_bar_globals.saved_view); IDirect3DDevice8_SetTransform(global_d3d_device, D3DTS_PROJECTION, &progress_bar_globals.saved_projection); IDirect3DDevice8_BlockUntilVerticalBlank(global_d3d_device); + /* port: the rasterizer's caches of the device's states learn what was + set here */ + rasterizer_forget_hardware_state(); return; } @@ -2232,6 +2287,66 @@ static void progress_bar_make_stuff_ready( return; } +/* port: a value of the clouds' lattice, 0 to 1, the same at every run */ +static real progress_bar_cloud_lattice( + long x, + long y) +{ + unsigned long hash= (unsigned long)x*374761393u + (unsigned long)y*668265263u; + + hash= (hash ^ (hash>>13))*1274126177u; + hash^= hash>>16; + + return (real)(hash & 0xffff)/65535.f; +} + +/* port: soft clouds, four octaves of smoothed value noise that wrap at the +picture's edges, as loading.tga intensities (tgaLoadImageData's tint) */ +static void progress_bar_make_clouds( + unsigned long *pixels, + long width, + long height) +{ + long x, y; + + for (y= 0; y1.f) + value= 1.f; + intensity= (unsigned long)(value*255.f); + pixels[y*width + x]= ((intensity<<9) | (intensity & ~1))<<7 | intensity>>2; + } + } + + return; +} + static void progress_bar_load_loading_texture( IDirect3DTexture8 **texture) { @@ -2241,6 +2356,8 @@ static void progress_bar_load_loading_texture( struct tga_image image; D3DLOCKED_RECT locked_rect; unsigned long *pixels; + /* port: whether a picture was read (else the clouds, below) */ + boolean loaded= FALSE; FILE *file; IDirect3DDevice8_CreateTexture(global_d3d_device, 320, 240, 1, 0, D3DFMT_LIN_A8B8G8R8, 0, texture); @@ -2263,9 +2380,17 @@ static void progress_bar_load_loading_texture( { image.pixels= pixels; tgaLoadImageData(file, &image); + loaded= TRUE; } fclose(file); } + /* port: no loading.tga (no disc has one as a file: the retail + default.xbe holds the picture, which importing a disc writes as + loading.tga, port/linux/src/xiso.c and port/web/site/xiso-worker.js): the + picture the light sweeps over is made here, clouds, tinted as a + loading.tga's grey would be */ + if (!loaded) + progress_bar_make_clouds(pixels, 320, 240); IDirect3DTexture8_UnlockRect(*texture, 0); return; diff --git a/source/interface/progress_bar.h b/source/interface/progress_bar.h index 819f508fa7..d8470eed52 100644 --- a/source/interface/progress_bar.h +++ b/source/interface/progress_bar.h @@ -39,6 +39,12 @@ void progress_bar_display( real progress); boolean progress_bar_is_stuff_ready( void); +/* port: the screen of a map's download over the menus +(port/linux/game/download_screen.c) */ +void progress_bar_download_display( + real progress); +void progress_bar_download_end( + void); /* ---------- globals */ diff --git a/source/rasterizer/xbox/rasterizer_xbox.c b/source/rasterizer/xbox/rasterizer_xbox.c index 30ac278eaf..2af3c5a676 100644 --- a/source/rasterizer/xbox/rasterizer_xbox.c +++ b/source/rasterizer/xbox/rasterizer_xbox.c @@ -2868,6 +2868,21 @@ void rasterizer_set_vertex_shader( return; } +/* port: the loading screen (progress_bar.c) sets the device's vertex shader +(the fixed-function pipeline), render states and texture stage states +itself, not through these caches: after it, the next draw sets its vertex +shader again, and the smart states' shadows are the device's (on the Xbox +only a map's load followed it; the screen of a map's download is drawn +over the menus, every frame) */ +void rasterizer_forget_hardware_state( + void) +{ + rasterizer_state_cache.vertex_shader_index = INVALID_RASTERIZER_HARDWARE_STATE; + rasterizer_vertex_shader_runtime_forget(); + SetupSmartStates(); + return; +} + typedef char verify_rasterizer_xbox_push_buffer_size_offset[ diff --git a/source/rasterizer/xbox/rasterizer_xbox_internal.h b/source/rasterizer/xbox/rasterizer_xbox_internal.h index 25726def0d..4617bd9129 100644 --- a/source/rasterizer/xbox/rasterizer_xbox_internal.h +++ b/source/rasterizer/xbox/rasterizer_xbox_internal.h @@ -70,6 +70,13 @@ void rasterizer_set_frustum_z( real z_far); void rasterizer_set_vertex_shader( short vertex_shader_index); +/* port: after the loading screen's own device states (progress_bar.c) */ +void rasterizer_forget_hardware_state( + void); +/* port: rasterizer_xbox_vertex_shaders_runtime.c's selected shader +forgotten, with it */ +void rasterizer_vertex_shader_runtime_forget( + void); void *rasterizer_get_bitmap_default_hardware_format( struct bitmap_data const *bitmap); void rasterizer_filthy_bitmap_default_initialize( diff --git a/source/rasterizer/xbox/rasterizer_xbox_vertex_shaders_runtime.c b/source/rasterizer/xbox/rasterizer_xbox_vertex_shaders_runtime.c index 35fb1da509..2f4aea98ae 100644 --- a/source/rasterizer/xbox/rasterizer_xbox_vertex_shaders_runtime.c +++ b/source/rasterizer/xbox/rasterizer_xbox_vertex_shaders_runtime.c @@ -159,6 +159,17 @@ static struct rasterizer_vertex_shader_runtime_globals vertex_shader_runtime_glo /* ---------- public code */ +/* port: the vertex shader the device has is no longer known (the loading +screen set the fixed-function pipeline itself: progress_bar.c, +rasterizer_forget_hardware_state); the next permutation set is selected */ +void rasterizer_vertex_shader_runtime_forget( + void) +{ + vertex_shader_runtime_globals.current_vertex_shader_index = NONE; + + return; +} + void rasterizer_set_vertex_shader_permutation( short vertex_shader_index, short vertex_type, From 8f4af7f0beab9f9a9ebd8a934a5131274e88b985 Mon Sep 17 00:00:00 2001 From: FractumSeraph <8539982+FractumSeraph@users.noreply.github.com> Date: Mon, 12 Oct 2026 23:50:15 -0500 Subject: [PATCH 3/4] Custom Edition maps a host does not send downloaded from the community's archives Map sharing downloads a missing map from the game's players. When the host does not send it (SHARE MAPS off, a build that names its maps without their hash, or a game seen in the games list before joining), the game now downloads it from the zips its authors published, on HaloNet's map repository and HaloMaps, else from a web seed, and checks every byte against an index of the maps before it uses it. Design and details in docs/map_downloads.md. - The index (port/assets/network/map_index.txt, tools/map_index.py): 5,829 maps and the three resource maps, by file name and header checksum (the map version the host already sends), with each one's size and the info hash of its single-file torrent, and for 5,826 of them the archives' zips that hold it. The builds put it next to the game. - The archives (port/linux/src/map_archives.c, maps.archives): HaloNet's zip by its URL, HaloMaps's as its Download button fetches it, then the web seeds (maps.web_seeds), over HTTPS with the self-updater's download (update_request in update.h: a POST, a user agent and a stop flag added to posix_update.c and win32_update.c). The map is taken out of its zip (map_archives_zip.c: every offset checked, and its CRC), and a file is used only once its info hash is the index's (map_archives_verify, with map_sha1.c); one that is not is thrown away and the next source tried. - The downloads (port/linux/src/map_downloads.c, maps.downloads): one file at a time, polled each frame from main.c's loop. A map goes into custom_maps as _.map, the name map sharing gives that version, beside any other version; a resource map keeps its name and is written only when none is there. No file is ever replaced or renamed (the name is taken with O_EXCL before the rename on POSIX). - The hooks: a host declining map sharing's request (map_share.c, download_offered) and a level map sharing cannot download (cache_files_map_present) start a download, and the player joins again once it is there; joining a game from the games list whose map is missing waits for its download and joins by itself (menu_functions.c). custom_edition_cache_files_missing says which files are missing. - A host's level named custom_maps\ alone, whose version is not the player's .map, plays the version beside it whose header checksum is the host's (custom_edition_cache.c; custom_edition_map_version_forget once the player leaves). - The download screen (port/linux/game/download_screen.c, maps.download_screen): Halo's loading screen over the menus at the download's share, the map's name over it, B to stop it; the menus go on behind it. With it off, the games list's status line shows the download. - tools/map_download_check.c runs the unzip and the check alone (ninja linux builds it): tools/test_map_download_check.py. - The web build leaves the downloads out (port/web/src/web_map_downloads.c), and Android has no HTTPS of its platform layer: neither downloads. Nothing goes over the game's connections: no network version of its own. Checked: - The Linux CI steps in Docker (tools/ci_build.py linux release): the test step's pytest list, with tools/test_map_index.py and the new tools/test_map_download_check.py (335 passed), and test_light_storage. - The web CI steps in Docker (emsdk 6.0.10): ci_build.py web release and tools/test_web_build.py; node --test port/web/tests. - The Windows release built with clang-cl and MSVC 2019's libraries (ci_build.py windows release), and run on Windows: a host with map sharing off and a client without the map on the loopback; the map came from the web seed (WinHTTP), and again from HaloMaps alone, was the index's, went in as ChaosGulch_7cac43f9.map and was played on the second join; the host's chaosgulch.map unchanged. - End to end on Linux in Docker, two or three machines on the loopback, with OpenCE build-201 and a ChupathingyCE-based dedicated server (version 28, plain level names when set to): - this build hosts (hash name, its file not renamed) and build-201's client downloads the map by map sharing and plays; build-201 hosts and this build's client does the same, and plays it again on a second join; - a host with map sharing off: the client's map came from the web seed (chaosgulch), and from HaloNet's zip beside the client's own other version of battlecity_lvl1; each the host's byte for byte, played on the second join, the client's own files unchanged; - a server naming its level custom_maps\chaosgulch, the client having another version: the host's came from HaloMaps's zip as ChaosGulch_7cac43f9.map, and the second join played it (chosen by its header checksum); - an index whose info hash is not the file's: the web seed's download refused, nothing written; - map_hashes.txt: a second run of a host hashes nothing again; - the download screen recorded on a virtual display: the light sweeping over the Xbox's picture as paradis_perdu (126 MB) came from the web seed, "from the web seed", the share counting up, B=STOP. - No map file was renamed or changed by this build in any run (build-201's host renames its own for its hash, as it does). Co-Authored-By: Claude Opus 5.5 --- .github/workflows/build.yml | 2 +- AGENTS.md | 9 +- docs/map_downloads.md | 177 + port/assets/network/map_index.txt | 5836 +++++++++++++++++ port/linux/README.md | 26 +- port/linux/game/custom_edition_cache.c | 181 + port/linux/game/custom_edition_cache.h | 19 + port/linux/game/download_screen.c | 173 + port/linux/game/map_share.c | 21 +- port/linux/game/menu_functions.c | 113 +- port/linux/include/halo_linux_source_fixups.h | 8 + port/linux/src/map_archives.c | 600 ++ port/linux/src/map_archives.h | 68 + port/linux/src/map_archives_zip.c | 410 ++ port/linux/src/map_downloads.c | 767 +++ port/linux/src/map_downloads.h | 43 + port/linux/src/map_sha1.c | 140 + port/linux/src/map_sha1.h | 30 + port/linux/src/port_config.c | 27 + port/linux/src/posix_update.c | 71 +- port/linux/src/update.h | 10 +- port/web/src/web_map_downloads.c | 46 + port/windows/src/win32_update.c | 35 +- source/cache/cache_files.c | 13 + source/interface/ui_widget.c | 19 +- .../ui_widget_event_handler_functions.c | 11 + source/main/main.c | 3 + source/networking/network_client_manager.c | 3 + tools/ci_build.py | 4 + tools/linux_build.py | 57 +- tools/map_download_check.c | 68 + tools/map_download_check_xbox.c | 48 + tools/map_index.py | 585 ++ tools/test_map_download_check.py | 109 + tools/test_map_index.py | 183 + tools/web_build.py | 8 + tools/windows_build.py | 5 +- 37 files changed, 9893 insertions(+), 35 deletions(-) create mode 100644 docs/map_downloads.md create mode 100644 port/assets/network/map_index.txt create mode 100644 port/linux/game/download_screen.c create mode 100644 port/linux/src/map_archives.c create mode 100644 port/linux/src/map_archives.h create mode 100644 port/linux/src/map_archives_zip.c create mode 100644 port/linux/src/map_downloads.c create mode 100644 port/linux/src/map_downloads.h create mode 100644 port/linux/src/map_sha1.c create mode 100644 port/linux/src/map_sha1.h create mode 100644 port/web/src/web_map_downloads.c create mode 100644 tools/map_download_check.c create mode 100644 tools/map_download_check_xbox.c create mode 100644 tools/map_index.py create mode 100644 tools/test_map_download_check.py create mode 100644 tools/test_map_index.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 457a7e4464..0f09f73325 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -91,7 +91,7 @@ jobs: - name: Test run: | - python -m pytest -q tools/test_linux_port.py tools/test_host_watch_hash.py tools/test_touch_menu.py tools/harness tools/test_profile.py + python -m pytest -q tools/test_linux_port.py tools/test_host_watch_hash.py tools/test_touch_menu.py tools/harness tools/test_profile.py tools/test_map_index.py tools/test_map_download_check.py python tools/test_light_storage.py - name: Compile cache diff --git a/AGENTS.md b/AGENTS.md index abdbea8854..7f02c809b0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,7 +26,7 @@ end. | `port/third_party/` | Vendored libraries, each with a README naming its upstream, version and checksum | | `port/tools/` | Stand-alone tools (`cache_file_report.c`) | | `tools/` | Build scripts (`linux_build.py`, `windows_build.py`, `android_build.py`, `web_build.py`, `ci_build.py`, `web_serve.py`), generators (`ce_menus.py`, `port_settings.py`, `hud_assets.py`, `title_assets.py`, `embed_assets.py`, `xdk_headers.py`) and tests | -| `docs/` | Longer design notes (`custom_edition_caches.md`) | +| `docs/` | Longer design notes (`custom_edition_caches.md`, `map_downloads.md`) | | `pgo/` | Profile-guided optimisation profiles | | `assets/` | Game data for local runs (gitignored: `maps/`, `custom_maps/`) | | `.github/workflows/` | CI: builds every platform on each push, publishes releases from `main` | @@ -85,6 +85,7 @@ setting (`game.custom_edition`), checked at run time with python -m pytest -q tools/harness tools/test_touch_menu.py # the engine's functions in a fake world python -m pytest -q tools/test_linux_port.py # the build, the maps' checks (needs assets/maps) python -m pytest -q tools/test_cache_file_formats.py tools/test_bmp_files.py tools/test_profile.py +python -m pytest -q tools/test_map_index.py tools/test_map_download_check.py # the map downloads' index and checks python tools/test_touch_layout.py # the Android touch layout (JDK 17+) python tools/test_light_storage.py python tools/test_death_timing.py @@ -176,7 +177,10 @@ Custom Edition maps live in the data root's `custom_maps` folder with added: a map that needs them is refused, and one that only carries OpenSauce's header runs as stock Custom Edition runs it. Map files are untrusted input: read them through bounds-checked readers. See -`docs/custom_edition_caches.md`. +`docs/custom_edition_caches.md`. A map that a host does not send is +downloaded from the community's archives and checked against +`port/assets/network/map_index.txt` (`docs/map_downloads.md`); no player's +map file is ever replaced or renamed. ### Settings @@ -216,6 +220,7 @@ as documentation of file formats, never copied. | [port/web/README.md](port/web/README.md) | The web build, the page, the game data in the browser, limits, how it operates, hosting on GitHub Pages | | [port/include/xdk/README.md](port/include/xdk/README.md) | How the SDK declarations were written and are checked | | [docs/custom_edition_caches.md](docs/custom_edition_caches.md) | Loading and converting Custom Edition maps, and the evidence for each layout | +| [docs/map_downloads.md](docs/map_downloads.md) | Custom Edition maps downloaded from the community's archives, the index of the maps, `tools/map_index.py` | | [port/assets/menus/README.md](port/assets/menus/README.md) | The menu files' format and how to write them again | | [port/assets/menus/NON_HANDDRAWN.md](port/assets/menus/NON_HANDDRAWN.md) | Menu pictures that are not redraws | | [port/assets/menus/UNWIRED.md](port/assets/menus/UNWIRED.md) | Menu functions that do nothing yet | diff --git a/docs/map_downloads.md b/docs/map_downloads.md new file mode 100644 index 0000000000..fc771436ad --- /dev/null +++ b/docs/map_downloads.md @@ -0,0 +1,177 @@ +# Custom Edition maps from the community's archives + +Map sharing (`port/linux/README.md`, "Map sharing") sends a player who joins +without the game's Custom Edition map the host's copy. Some hosts do not +send it: a host with SHARE MAPS off (`network.map_share = false`), a build +that names its maps without their hash (a level of `custom_maps\` +alone, which map sharing does not download), or a game seen in the server +browser before joining. For those, the game downloads the map from the +community's archives instead, the zips the maps' authors published, and +checks every byte against an index of the maps before it uses it. + +There are some 6,000 Custom Edition maps, over 500 GB. Nobody needs them +all: a player downloads the one map a game is on, from its zip. + +Nothing of this goes over the game's own connections, so it needs no +network version of its own (`port/linux/NETCODE.md`). A client looks the +host's map up by the name and version (the header checksum) that the +game's advertisement and settings already carry. + +## For players + +Nothing to set up. The download starts by itself: + +- when you join a game from the games list (LAN, Direct Link or the server + browser) whose map you do not have, under a name map sharing does not + download. The join goes ahead by itself once the map is there; +- when you join a game whose host does not send its map. You leave the + game, with a message that the map is being downloaded. Join again when it + is there. + +While it downloads, Halo's loading screen covers the menus, its light +sweeping from left to right as the map comes, with the map's name and how +much has come ("Downloading hugeass.map from HaloNet: 34 MB of 92 MB"). +B stops the download. With `maps.download_screen = false` the menus stay +up, and the status line of the games list shows the download instead. + +The loading screen's picture is the Xbox's own (the Halo ring and +LOADING...). Importing a disc image writes it into the maps folder as +`loading.tga`: the retail disc has no such file, and its `default.xbe` +holds the picture, which `port/linux/src/xiso.c`, the Android app's +`XisoExtractor.java` and the web page's `xiso-worker.js` take out. Without +one, from a maps folder copied by hand, the light sweeps over clouds that +the game makes. + +A map comes from the first of these that has it: + +1. The zips of HaloNet's map repository (maps.halonet.net) and of HaloMaps + (halomaps.org), in `maps.archives`'s order. The map is taken out of its + zip. +2. The web seeds (`maps.web_seeds`): folders on web servers that hold the + maps under their file names. The default is a seed box's folder that + holds every map of the index. + +A map that is not the index's version once downloaded (from a zip or a web +seed) is thrown away, and the next source is tried. + +Custom Edition's `bitmaps.map`, `sounds.map` and `loc.map`, which every +Custom Edition map needs, are downloaded the same way when missing. + +No map already there is ever replaced, renamed or changed. A downloaded map +is written to `custom_maps` as `_.map`, the name map sharing +gives that version (`hugeass_0e2b3ee4.map`), beside any other version that +you have. A resource map keeps its own name, and is written only when none +is there. A download goes to `custom_maps/downloads` until it is checked. + +When a host names its map without the hash (`custom_maps\hugeass`) and your +`hugeass.map` is another version (another header checksum), the game plays +the version beside it whose header checksum is the host's +(`custom_edition_cache_present`, `port/linux/game/custom_edition_cache.c`). + +The Linux and Windows builds download from the archives over HTTPS, with +the self-updater's HTTPS (`update.h`). The Android build and the web build +do not download from the archives: Android has no HTTPS of the platform +layer yet, and a web page fetches what it plays itself +(`port/web/src/web_map_downloads.c`). + +The settings, in `config.toml` (`port/linux/README.md` has every setting): + +| Setting | Default | Meaning | +| --- | --- | --- | +| `maps.downloads` | `true` | Download a map that is missing, and that the host does not send, from the archives. `false`: never. | +| `maps.download_screen` | `true` | Halo's loading screen over the menus while a map downloads (B stops it). `false`: the menus stay up, with the status line. | +| `maps.archives` | `"halonet,halomaps"` | The archives a missing map is taken from first, out of the zip that holds it, in this order: `halonet` (maps.halonet.net), `halomaps` (halomaps.org). Empty: none. Linux and Windows. | +| `maps.web_seeds` | `"https://halomaps.fractumseraph.net/maps/"` | Comma-separated `https://` folders that hold the maps under their file names, tried after the archives. Empty: none. Linux and Windows. | +| `maps.index` | `"map_index.txt"` | The index of the maps, next to `config.toml` unless a full path. | + +Nothing is downloaded while Custom Edition maps cannot be played +(`game.custom_edition`). + +## How a map is known: the index + +`port/assets/network/map_index.txt` lists every map, one a line, +tab-separated: the file name, the header checksum, the size, the piece +length and the info hash, then a column for each archive's zip that holds +it: `halonet:` (https://maps.halonet.net/maps/) or `halomaps:` (https://halomaps.org/hce/detail.cfm?fid=). The Linux and Windows builds put it next to the game as +`map_index.txt`. It was made from the halomaps.org and HaloNet archives +(5,829 maps, with the three resource maps) by `tools/map_index.py`. + +A host's game carries the map file's header checksum as the map version +(`cache_files_map_version`, `source/cache/cache_files.c`), which a client +checks its own copy against. So a map is known here by its file name and +that checksum, and two versions of a map with one name are two entries. The +three resource maps have a checksum of 0 and are found by name. A map +named for its hash (`hugeass_0e2b3ee4`) is looked up without the hash. A +host's version that is not in the index is not downloaded. + +The piece length and info hash are those of a single-file BitTorrent v1 +torrent of the map whose info dictionary is exactly `{length, name, piece +length, pieces}`, in that order. A machine that has the file can make the +info hash from the index line alone: the game hashes each piece of a +download with SHA-1 (`port/linux/src/map_sha1.c`), and then the info +dictionary, and the download is the index's only if that hash is the +index's (`map_archives_verify`, `port/linux/src/map_archives_zip.c`). The +same torrents can be seeded by any BitTorrent client, and a seed box that +seeds them can serve its folder as a web seed. + +To make the index from folders of maps: + +``` +python tools/map_index.py make --maps [--maps ...] + --resource-maps --torrents +``` + +which writes `.torrent` files (for seed boxes) and merges the +entries into the index, remembering the files hashed in +`/.map_torrents_cache.json` so that a rerun hashes only new +ones. `python tools/map_index.py check` checks an index against its +torrent files. The archives' columns come from copies of their zips: + +``` +python tools/map_index.py sources --halonet --halomaps +``` + +with HaloNet's zips under their names and HaloMaps's named +`-.zip`. A zip holds a map when one of its files has the +map's name (in any folder), size and header checksum. + +## How it operates + +- `port/linux/src/map_downloads.c` reads the index, takes the game's + requests (`map_downloads_fetch`: the level, its version and the files + missing), downloads the files one at a time, and puts each in place. + `map_downloads_poll` runs it each frame (`source/main/main.c`). +- `port/linux/src/map_archives.c` fetches one file on a thread of its own: + HaloNet's zip, HaloMaps's (its page gives a token that its form takes, + as a browser's download does), then the web seeds, with the + self-updater's HTTPS (`update_request`, `update.h`). A download that + stops starts again from the start next time. +- `port/linux/src/map_archives_zip.c` takes a map out of a zip (stored or + deflated, with zlib) and checks a file against the index's info hash. +- `custom_edition_cache_files_missing` (`port/linux/game/custom_edition_cache.c`) + says which files a level needs that are not there: the map, when no copy + of the host's version is there, and the resource maps. +- The game asks for a download when map sharing cannot have the map + (`cache_files_map_present`, `source/cache/cache_files.c`), when a host + declines map sharing's request (`download_offered`, + `port/linux/game/map_share.c`), and when a game in the games list is + joined (`ui_widget_port_join_map_fetch`, `port/linux/game/menu_functions.c`). +- `port/linux/game/download_screen.c` draws the loading screen over the + menus (`source/interface/progress_bar.c`). + +Map files and zips are untrusted input: the zip reader checks every offset +and size against the file, writes nothing but the one file asked for, and +nothing is used before its info hash is the index's. + +## Tests + +- `tools/test_map_index.py` tests the index tool with made-up maps. +- `tools/test_map_download_check.py` runs `build/linux/map_download_check` + (`tools/map_download_check.c`, which `ninja linux` builds): a map taken out + of made-up zips, damaged zips refused, and a file checked against the + info hash that `tools/map_index.py` gives it, other files refused. It + also checks that the committed index starts as the game reads it. + +Neither needs game data or the network. diff --git a/port/assets/network/map_index.txt b/port/assets/network/map_index.txt new file mode 100644 index 0000000000..95b0fe7dcc --- /dev/null +++ b/port/assets/network/map_index.txt @@ -0,0 +1,5836 @@ +# halo map index v1 +# The Custom Edition maps (tools/map_index.py): each line a map, +# tab-separated: file name, header checksum (the map version a host sends; 0 for +# the resource maps, matched by name alone), size in bytes, piece length, info hash, +# then the map archives' zips that hold it (halonet:, halomaps:). +# A map's single-file torrent has info = {length, name, piece length, pieces}: a +# download is checked against its info hash (port/linux/src/map_archives.c). +''H3''_prisioner.map 38A1F1A5 95348399 262144 b5c5f4daa91b617761cf203e14609382688a9d94 halomaps:5988 +(!V1¡)-(HR)Floodinthebase.map 5475464E 256799462 262144 a0e8663211bb1f141fd7e40194fbe717dfe96f01 halomaps:6762 +(182) Zombies.map EF22A88F 32327989 262144 50e111ac1983a47f48808d0c304cbca758cbf40c halomaps:4791 +(182)_Chatroom_V2.map 0A718F72 62203403 262144 d32fc6c156cf2d7fa8d2f774a2bed27bdec5f813 halomaps:4891 +(182)_Hanger.map 82D8BC77 93403359 262144 c89764abedc39aff336ea2007154d56c8d70d03f halomaps:4892 +(182)_Zombies_ME.map 653C4F58 81438856 262144 f21b9b45cee776a942b458939afe38760f32efb2 halomaps:4850 +(182)_Zombies_V2.map 88EC2753 67410229 262144 8bd411704ffff3f359114aea6420efeb827c14a5 halomaps:4893 +(182)_Zombies_V3.map 53F27056 60627237 262144 d571c699c108b2ec33125a69f87e2b629d22d113 halomaps:4894 +(arbiter)VS(elite).map 3A831BB2 60873239 262144 882946d933f47678b3ead714d6660a3160a6ef8a halomaps:6763 +(CSK)Gulch.map 3A0BA64C 98629640 262144 1ede0c2dfea22daa1603ac6b6480023184f7f3ed halomaps:5364 +(DMC)PokemonStadium.map B27B19AA 48722606 262144 4654b80800950bb27db349862f08c4483873a677 halomaps:4283 +(H2)bloodgulch.map FD3A4A1C 107756739 262144 6623e0274e0b725c821265440a09a6b907373356 halomaps:6764 +(H3)-Battle_field.map D1C65D76 164423477 262144 ac57e32743fd431d2ceeafec952fc2234371bc7a halomaps:5555 +(H3)_Guardians.map 4F82DC57 395466083 524288 98bfe69315afcb97407167ee00518040d055bb61 halonet:(H3)_Guardians.zip +(h3)_precipice_gulch.map 73683B95 71627905 262144 b95d8dd39e3b679afb79592398a68ca6bcf9345e halomaps:5943 +(h3)_swampthing.map 2696E7ED 70374896 262144 dca05890e37e0ace62e5b7672642b88d8392123a halomaps:5978 +(H4)Batalla Total.map CD361D68 262244820 262144 44840fdee9e94a6efb5d1cbfbc286f1712bd81f2 halonet:(H4)Batalla Total.zip +(H4)Duelo-Spartan.map 946BC1C1 210790601 262144 95eb25ad4135c92192c245828525f94fa7a394ce halonet:(H4)Duelo-Spartan.zip +(H4)Prisoner.map 13D42E11 213192212 262144 71146184fca12fc57d507e8585a150d19a456019 halonet:(H4)Prisoner.zip +(H4)Rojos-vs-Azules.map 51A170E9 317704623 262144 692c03f8d31f7d041a98e34bcac2d05807f2c443 halonet:(H4)Rojos-vs-Azules.zip +(H4)Sanctified.map 717129AD 311624121 262144 55520f0bdcc9c5b2a77edba5072121a03c013ed1 halonet:(H4)Sanctified.zip +(H4)Spartans-Vs-Elites.map 0C7955EF 224255922 262144 2f2895a874f3d843e8ac95ffba6afdf5f95b0ad2 halonet:(H4)Spartans-Vs-Elites.zip +(H4)Wizard.map 436E6FE1 217836361 262144 c78774f3705a6031791e2581e8269229be822634 halonet:(H4)Wizard.zip +(H5)Rat-Spartan.map 1293883E 361324663 262144 aca819948ac828d2fab5d2841acfb8934bbd77d3 halonet:(H5)Rat-Spartan.zip +(H5)Rojos-Vs-Azules.map 1FBE5820 369149247 262144 40c850bff9cb8233142a3c0e9bc0876e34f984d6 halonet:(H5)Rojos-Vs-Azules.zip +(HR)Covenant-vs-flood.map 7BE2FC55 239992705 262144 bb30519be8c8aa0084ec67a93b1e0663e892b041 halonet:(HR)Covenant-vs-flood.zip +(HR)Emilie-Vs-Covenant.map 4CF13B7D 349205993 262144 3b79446c6b382df7be3fef3c2a3a21f4738982b0 halonet:(HR)Emilie-Vs-Covenant.zip +(hr)floodinthebase.map 5475464E 256799462 262144 140b1b9fc93a582ae02be8b9576766d37c72f465 halonet:(hr)floodinthebase.zip +(HR)Kat-Vs-Covenant.map 8FD94FBF 350818905 262144 cb2d78a8dd52f89714d344d622980ce6a3387604 halonet:(HR)Kat-Vs-Covenant.zip +(HR)Marines-Vs-Covenant.map 860E7BB1 374416590 262144 5d15c991753c02aaf9791295cf83fa92f1653d19 halonet:(HR)Marines-Vs-Covenant.zip +(HR)Noble1-vs-Covenant.map D1CC2E1B 254262021 262144 54861d7062fcbc3e2109b2148168b52d7ad02d3b halonet:(HR)Noble1-vs-Covenant.zip +(HR)Noble6-vs-Covenant.map 8B65EAE4 299582958 262144 3ad5a7d2d6f5f52a15b717263135bcb7eb3259dd halonet:(HR)Noble6-vs-Covenant.zip +(HR)Noble6-vs-flood.map 60E85E7A 312378503 262144 3fb2388f37509f8a4e2d6e0be614d7b9470bdbcb halonet:(HR)Noble6-vs-flood.zip +(HR)Survivor-Emile.map 635D2F68 284092698 262144 f273191a41e0dbff9e1ff042f09d8a96603a9ca6 halonet:(HR)Survivor-Emile.zip +(SHY)_ALPHA_CANYON.map BF9D6F67 209330979 262144 8f5a696b7402fa23f6d29a2813617dd0b1e5d7f4 halonet:(SHY)_ALPHA_CANYON.zip +(V2)EMILE-Vs-Covenant.map 00ED38A1 344880311 262144 34063e829739aac129a386a2a4140c7a6c90c1f4 halonet:(V2)EMILE-Vs-Covenant.zip +-ib-portent.map 6433A981 63348231 262144 298860d2abeb3b293051876e9b4ce4b2fb709fc1 halomaps:2880 +-ib-portent_v2.map 0F546F22 56192999 262144 2be60602dba99cb2cf0971f6cbc13de041a59013 halomaps:2901 +-IB-school.map 26F5172E 58537179 262144 68d62b2707977234802729c7d150b9fb45f48991 halomaps:2832 +-IB-~Zanzibar.map 55AC0ED3 105673495 262144 d48350d2a4fe3ec687f43e806cb17cb9a07fc9c7 halomaps:2833 +01_chamber.map 64B2281E 130046694 262144 637ec0c7714679b33ee28fbd4f9dc6d5bd78f833 halonet:01_chamber.zip +10khalothemebeta.map 9D2DEC11 23648804 262144 7c1f187976566f40ef46ef3c0f3737fab702e38f halonet:10khalothemebeta.zip +10kPoaThemeBeta.map F2F656B2 17750340 262144 49d1a7748e1f876d6555cafc2b3b2222d6e435a8 halonet:10kPoaThemeBeta.zip +10kTRBeta1.map 70F80298 27812832 262144 e7ecf02ef7756458147c6e6353f1a738ca293d69 halonet:10kTRBeta1.zip +123fight.map 4F7B4AB7 44447151 262144 1719727ac81dcc2a8a4ddda4082f17a6435deda9 halomaps:5755 +123FT.map D68E8C9C 133795937 262144 5fc9e2222c41f20644986e065c9c9f253062626c halomaps:6244 +123ground.map 9FA07FD4 115057282 262144 af156fce98037a469da8255624d69b2ffa4e0e30 halomaps:5518 +1337 Uber Gulch.map E14AAE49 16174000 262144 7862568280b22d5a5b20df2a9063a4a71e1a0e37 halomaps:2586 +1bloodgulch.map C0E1D983 16610796 262144 db2c89639e432a01f8f9d9ef4f0c832ba666e4e3 halomaps:1703 +1st.map 5C529782 30828479 262144 818d49377005b9016851fe47edff0c5b73ecc5b1 halomaps:2769 +2 to 4 sum.map 462567E6 31824248 262144 fac2c71073cd48107158afd137c61ed51a79580c halomaps:6989 +2 to 6 sum.map DD3C7366 126408087 262144 23294870fcf5c5febd667ecf32e7d64f9d1cdade halomaps:6990 +2 to 8 sum.map C5AF1F7F 130659408 262144 1da768289c9970b7e53aaef2b3cbf32ee6e4e6cc halomaps:6991 +240692.map 72E0C3A1 56089085 262144 4bcdc3f288b39c88fec52a4c888d55a3981e4e6a halomaps:5365 +2hblood.map EEC0BE4C 387975109 262144 a624772331d89a294b51d5d1dddea5765298185c halonet:2hblood.zip +2nd_dankest_christmas.map C5A81E34 55185839 262144 24a779a137928bd90be20fbb932eaa96f19409e4 halonet:2nd_dankest_christmas.zip +3Tiers.map 5DB7EA0E 22590613 262144 e5f7df56b187e129bab1ad4496103a9094ffddce halomaps:4731 +4d-61-70.map 8EEF7EEA 55615545 262144 dd0bcf411e9da6b32e21f513aea8e2143783f854 halomaps:3285 +4seasons.map 0964362E 19000204 262144 057cc8ec66ca928e4a3335a7b40f0e6c59af4e3c halonet:4seasons.zip +77th.map B4B9BF94 124437173 262144 ccd0ebc07a1228f4d3e7aa244380c3e36c99f7f2 halomaps:4611 +7Streak-TuTv2.map 4A4BCB49 120519901 262144 46760c59957b6acbad2c70f59a733b7669d3e4d9 halomaps:5932 +=ac=timberland.map 32F33845 14528292 262144 4ac973137bede1570bac8e7628da9e43297c0e87 halomaps:2747 +=GYD=maps.map 3FDCF80B 38899029 262144 d52433207cf7ec5480096038e6f52502b7bfebf6 halomaps:7072 +=NE= Coagulation Final.map B9A1C640 65950551 262144 4acf90ef72e47644cd526e30a0ab454261162823 halomaps:3810 +=ne=coagulation_version1.2.map A8C873B6 73308744 262144 e4ebb5cb15c8c4371ad93bec56aa0d1cf4c91c09 halomaps:3623 +[)H3(]Adrenalina.map A2735F03 238274017 262144 482ada3a84134efc9520f87d40e43a92966ef3bd halomaps:5859 +[)H3(]Batalla_Final.map 741297B8 307534914 262144 5315f7bc6a2231a4a9c00c2518a63ed3d5b87209 halomaps:5860 +[)H3(]Battle=Batalla.map 16E52588 375125691 262144 3405f2058047ca8e7c4d32a04a315794467d16ca halomaps:5874 +[)H3(]colossus.map E27ABD32 322361529 262144 687a5b9dc3e7f93484f51c16919896431af4ea28 halomaps:5981 +[)H3(]Highlands.map 995DD4FC 399230142 524288 0d5982a8c7f88de3b037d9d01b548f5b1f437f3f halomaps:5972 +[)H3(]Pinnacle.map 3A63D2D1 291474262 262144 d93ba4a3e6b37e08960393caf7a555064649e3f6 halomaps:5861 +[)H3(]Sand_Ghost.map 20BF9E9C 348021717 262144 d7f5c90be29f9f48bf9252d77bc5895f488bc14c halomaps:5974 +[)H3(]Sandtrap_Ice.map 7E5AB433 397181944 524288 a8cb371390c7e085948a6ffaa55de2425cdd6628 halomaps:5917 +[10]DEMO.map 778F0DB8 112150914 262144 40ef7056df6868e6d387a980f4da220c6cb227bf halomaps:6205 +[2507] Obelisco.map D4DA9EE4 402388154 524288 501e15a16f2451547e2396141c70d8c141b44d52 halomaps:6694 +[]EMS[]_Blood_ODST.map 243F1D8B 133078613 262144 da52e6ba9f65146500aa365209ab557ce0a7ea31 halomaps:6359 +[]H3[]Beavercreek.map A7645E1A 213783384 262144 05924ab2294657d4ef2c8b5462d3781ada60cda9 halomaps:5827 +[]H3[]carousel.map 66605E62 206494316 262144 4a03a065389783fdb19cd53429fb36f14565437d halomaps:5828 +[]h3[]Christmas.map C74231B9 130776861 262144 339dbc4ee09c0122f66afda52243d15150ea436d halomaps:5973 +[]H3[]Danger_Mountain.map 56B6FB85 217761268 262144 b94b23ece0a2dcb86e30c9358c5ca955b1104ccf halomaps:5829 +[]H3[]Desert.map 38559489 200469193 262144 9db677209889ab083ac0a9cb1f2523b0eab62608 halomaps:5830 +[]H3[]Géminis.map 8406C7B2 224936334 262144 c15e3e033d18fd5bf3b07bc32d41ad77c5486983 halomaps:5831 +[AMT]agonia_eterna.map 52525A07 334162610 262144 9d805c9673a9fb2df768782bdadebc4c37f14850 halonet:[AMT]agonia_eterna.zip +[AMT]Death_Desolation.map E8F56E5B 251410099 262144 21207e351041c3115ad923803a1420561c49a1f3 halonet:[AMT]Death_Desolation.zip +[AMT]HE-Coagulation.map D21A338F 331946098 262144 c5fc240144738f4c17edc46fc8412fa10c15e26f halonet:[AMT]HE-Coagulation.zip +[AMT]Hr-Master_Garden.map D8542935 319814914 262144 1d49b99affcaed65a5e0dce18b3fb1c1c82af280 halonet:[AMT]Hr-Master_Garden.zip +[AMT]Playa_asesina.map D587F3D3 287982228 262144 42416f815c19a16d7f50389dd3b188089523d248 halonet:[AMT]Playa_asesina.zip +[AMT]rapid_fire.map FA870E45 308349980 262144 e8faff75a86eaec2c729c93cee1f21bdcdd738eb halonet:[AMT]rapid_fire.zip +[AMT]survival_attack.map EB69B56A 335885926 262144 66900eb1113bd23debc7a0914dfaba77e6f5cd98 halonet:[AMT]survival_attack.zip +[asmt]covenant_garden.map 96949690 229912029 262144 1af75539ccb207c2c8980d67903f579304ec99c9 halomaps:6255 +[asmt]index4127.map AD438610 187179869 262144 e044ede1c6b8538a2e0f8db46f1b7c673a0a952b halomaps:6256 +[Btm]_h3_bloodgulch.map D890EE53 124008837 262144 63bf591ea87c60b087d49198fec0c65242de4a3e halomaps:6285 +[CEA]icefields.map 3C4E11AC 189023886 262144 5a2253a3120b8b4c1f6523adde0c333436bb7d56 halonet:[CEA]icefields.zip +[CEX]Hex_Zone.map 57FD8907 100297547 262144 62ed02f1c4b3b1b19fddc09ce84610929e33cff4 halonet:[CEX]Hex_Zone.zip +[CEX]Ice_Land.map C51671BF 113429130 262144 887fdc3df83465b007c69b577cb23e83e307f5a9 halonet:[CEX]Ice_Land.zip +[CEX]SideWinder.map 73B2406F 98441284 262144 caeb51c69802c8dd5ed106639e3869ab4a169806 halonet:[CEX]SideWinder.zip +[CoD]Templo-En-Guerra.map 40B093C3 227210807 262144 c2e80b800c8098530dde8a02418b41d15cb07af8 halomaps:6481 +[cs117]_coagulation.map 9ADF9DBE 384675622 262144 1a2e9aba7a67e4ecba4c6fab42cc42b2cefc8ce7 halonet:[cs117]_coagulation.zip +[cs117]_heretic.map BF9EBBE4 319213273 262144 d4a42f1cfbbf5789aa00697778a5928c528c0dd2 halonet:[cs117]_heretic.zip +[cs117]_heretic_ai_bots.map 3D330231 373120512 262144 adab5cbb327c34584c07d937577c95b4530c2cc2 halonet:[cs117]_heretic_ai_bots.zip +[Cs117]_Narrows.map D15B1A58 322313848 262144 3b24a3e7a20dbac8ee4688bcc33e7067b78826a2 halonet:[Cs117]_Narrows.zip +[Cs117]_portent.map 5C3D75B4 397421015 524288 426d628d6007f17cce7ae1e131cee0129474dcee halonet:[Cs117]_portent.zip +[Cs117]floorak.map 57E81C77 230678787 262144 3a54165bea3f65bda139e9250257b8921a060e8c halonet:[Cs117]floorak.zip +[dumb_ai]_h2_turf.map B1E53A51 92922070 262144 21657a2c4d63ed3a3248dc6661ed47a44ff64c12 halomaps:6325 +[EAN]Chaos-race-ai.map FE49FEB7 184753414 262144 90b41d6b880e134e226f24fe9a839863d24db7ed halonet:[EAN]Chaos-race-ai.zip +[EAN]Zoocaut.map 6003ACE5 259080841 262144 4437e2a7c09fe82eda7bb1ec496d92cfe20290ad halonet:[EAN]Zoocaut.zip +[FBI]bloodgulch.map D90332B5 140976959 262144 cf19597fe8fc34b7185635b86ee4c49114c211be halomaps:6483 +[FBI]Derelict.map E7A90E77 93439677 262144 67451a0a7c55f002479f9152a55ff51f8534e395 halomaps:6521 +[glory].map 13739664 59120360 262144 09ce58f3f5469b2d4e12be2fd11a562cfabb158b halomaps:5712 +[H2]_ascension.map 580EB06D 95136246 262144 e0c5e0e258943a2dde07dd9927e5d816cbf6f90e halomaps:4881 +[H2]_beavercreek.map 39766546 83119294 262144 0ef3bb81410502de8cdce353e25421f668cca5be halomaps:4882 +[H2]_coagulation.map 4F5B9353 107964790 262144 1300eca16555f0be98140f9ed549d5e83b92b878 halomaps:4883 +[H2]_Ivory_Tower.map 5B0A052A 130477195 262144 726a5e6782b64920e36d4ffa782759fd6fb984bc halomaps:5204 +[H2]_Lockout.map 955A6C43 86738698 262144 a3d8dc3db92ff56c49c8976a491915a2287cf7b9 halomaps:5271 +[H2]_New_mombassa.map 3C9B6D2E 118991398 262144 b0b6b33d25e4f90d5acbec630834d5c831c886b8 halomaps:4884 +[H2]_sanctuary.map 36A5FC45 109509622 262144 d236f0a0b6a1ef71abffe9c48f20d75aecccc720 halomaps:4885 +[H2]_Turf.map 50EE1551 110411058 262144 b10131e6e490ff6e51a13dfdf8564ddb4aecf479 halomaps:5205 +[H2]_warlock.map BB1294D8 95434882 262144 039bf91bb6368bbc642007b06937305bbbb96d89 halomaps:4886 +[H2]_Zanzibar.map 00DEC884 121732478 262144 5945a510bd7379a2b4e374c120690abcf8e30b4d halomaps:4887 +[H2]Beavercreek.map 55C3900B 67180229 262144 961860ee2629fae558858d3f54f78c41d7db77a3 halomaps:6564 +[h2]desolation.map EA6F20EA 91740481 262144 9eed1825ea76beaebee7672a7b95b6e0dcea2c39 halomaps:6933 +[h2]Firefight_Ascension.map 96DFE189 231258006 262144 bb1fe6b71f1c15b8d82e7fbdfe00b269a9e23c85 halonet:[h2]Firefight_Ascension.zip +[H2]Tutorial.map CCE97488 79082119 262144 0bd30b676091c9e0fd789388e8f3dbdcc4c296f2 halonet:[H2]Tutorial.zip +[h3] core.map 96559B3D 175968496 262144 d6aed5d0719b7ee18a2e0b0c7086bec9f312ff2a halomaps:6484 +[H3] Imposing V2.map FE30AAFC 199136076 262144 366bcc23307fe5b2eac62824e0c67a196686ba37 halomaps:6498 +[h3]-odst-bloodgulch.map C5175AB8 129396341 262144 7ab6f6f5e76b5ef301db453645e7e4e23b220e1c halomaps:6326 +[H3]_ODST_Firefight_Airlock.map 635E0688 264747263 262144 ee8880bc2cf645d768e3b254ea0f32f5c16cd722 halomaps:6584 +[H3]_odst_island_invation_42.map 0AC96D26 174531792 262144 df9ba6caeb15deb4b1487a4047ba241dcf98ccf8 halomaps:6258 +[h3]_sandtrap.map 0B658200 177920893 262144 0e60b85a091666efc0ebe8ce4747fae150943745 halomaps:5274 +[h3]_sandtrap_race.map 54305FF8 181331647 262144 9f7328b4a2847598ae7e32434731a7b67f00b6a9 halomaps:5302 +[h3]_snowgulch.map 9B542F57 397466444 524288 21b4ac3184823f9f88e7f3ba88dc6cabd164a0d1 halonet:[h3]_snowgulch.zip +[H3]_Turf.map A3478351 121055387 262144 4b21ba75af6bbb03422e54073faadf97d56c3681 halomaps:5261 +[H3]_valhalla.map BE77B7CE 108480138 262144 17e08a03844385b040c80665e70e4cdd49e615c6 halomaps:6207 +[h3]Ancient_Sanctuary.map 7A8C9665 129363218 262144 a40a6a3302f2b09031c22ccddd0c6d372270c550 halomaps:5760 +[H3]Beavercreek.map 42B88EF4 238648613 262144 2cd10997cfce79455c203e65c1ae412769be9283 halomaps:5524 +[h3]bloodgulch-legend.map 306C821A 142652754 262144 7e922ba0bd3ee557fada5fc0ab66b5a7632ce0eb halomaps:5824 +[H3]Bloodgulch.map B9775E1D 258916678 262144 a5f814d66df328945e70682eccd4b25a4be854a3 halomaps:5525 +[H3]Bloodgulch_Ds.map B9775E1D 259023588 262144 524b941d1e5083f98741327a7652cebca7c50d1e halomaps:7086 +[H3]bloodgulchK.map 7C06C0F8 127247996 262144 d9a2ac45ddba979735e83da98f0a48521e45f1c4 halomaps:5670 +[H3]camp_of_death.map 05FFA545 332117497 262144 0d4e2bd8f42b8d95c0abdb85a78fc8ef28a19b26 halomaps:6370 +[H3]City.map 04E3DCCD 158684230 262144 bd3c7536d8457262f36d91b7bb833832a2f544e4 halomaps:5550 +[H3]Coagulation.map 764FADB3 299625381 262144 25700b8cb67fa8980fb854e066e7c04960374a36 halomaps:5435 +[H3]Coagulation_v2.map D70DCBD3 302225022 262144 3e3aba8108d8ceef2a7f4ac557a580b385da2dcd halonet:[H3]Coagulation_v2.zip +[H3]Cold_v1.map 503E7147 123410907 262144 3c93e9362c70501dafb7d48b44a714c4c7fd1429 halomaps:5739 +[H3]Damnation.map ADDE7F43 268914165 262144 1806c6d1e181f4a77a95178d66af09a39f9a2690 halomaps:5715 +[h3]DarkCreek.map C063FA08 217559505 262144 43486eb63f50cb82b3f68ebb2d7ca69ba5f992ce halomaps:5813 +[h3]darkwar.map 90397C04 203970394 262144 3318991d0606cfc44db7a7ce28e66b77de8d0f70 halomaps:6566 +[H3]Death_Island.map 37E7247D 274466047 262144 e838b1190e569953aaaf6fb64e1b95a424f1408d halomaps:5716 +[h3]deltaruins_ice.map C9CB5A99 322026812 262144 84493f51824b9ae7c6546f0bbbbc5aa3c1449a42 halomaps:6257 +[h3]Derelict.map 959799C6 114333111 262144 2cf045bee85ddc9c1626d9bcbabea498c01df457 halomaps:5761 +[H3]Desertwinder.map 2F529F34 306219138 262144 5ed4c9c73f8e8e115e982eb0ba44601ff2cfa703 halomaps:5643 +[H3]Down_Ruins.map 42E2C714 298304506 262144 d7c5b434ffd20913cf2ab232b7ce9a4e6393d740 halomaps:6073 +[h3]elite_gulch.map 488241F7 227655680 262144 8e8c4658a0e97764c2e17afa77299440db710e2b halomaps:5745 +[h3]field.map 6CD1ACFA 187091823 262144 f44bd826fe832e2919218492018b9a72c7802299 halomaps:5544 +[h3]GreenGulch.map B25CA3DE 161131514 262144 f6c204fb8c7a050b24e645a54b659e056ee69e8e halomaps:5789 +[h3]greenwinder.map F9D445B2 122436148 262144 c7dcee7b2ff659a1025f3728e20bea7917dfec9e halomaps:5762 +[H3]Ground-Battle.map F7C00B46 177723326 262144 858f962fa4285a4daf408aec3f0c85ea41767423 halomaps:5825 +[H3]Guardian_Beta0.3.map B9A26A19 289746267 262144 d693c60863eb9209d2776a1f5898996b5de1db8c halonet:[H3]Guardian_Beta0.3.zip +[H3]hangemhigh_ice.map E5ABC163 281083650 262144 c38094ab13457663e73594af01549232a68b6434 halomaps:6240 +[H3]Ice.map 267CF77C 234497964 262144 ab0f904097ab2a8db10697a756f03381a05d5a74 halomaps:5573 +[H3]Ice_Coagulation.map 0AFA9197 216531478 262144 4d02ebe95ef2c0aba19f42211cf7c88e3f5cf30b halomaps:6123 +[h3]icefields.map F0838495 243844093 262144 cce7cce761d3adf81260a1e4bda66b2264de135f halomaps:5629 +[H3]Island_of_Halo_(Fixed).map 1488FD47 130693988 262144 c3f283e9640ef79bbdc66fd36c418bd0b8e69ecf halomaps:6104 +[h3]lac_chapter1.map E662743B 314063834 262144 1dd494ce18424cfe0ab4dfbdca539c6ff6ee138c halomaps:6259 +[H3]Last_Resort.map 80D91095 306662740 262144 83485dfe30ad00f4f4dfed639553c921080de706 halonet:[H3]Last_Resort.zip +[H3]Narrows.map DFFD8EF0 158849200 262144 ce985e67325a798fec86635c4098706fdeea3eb4 halomaps:5551 +[h3]new_mombasa.map 2B6103EE 130623190 262144 180f3a7d94e687cff876fd82b5cd6242431ea81f halonet:[h3]new_mombasa.zip +[H3]peril.map 5831718C 168398857 262144 1df630688d0a3f0a86c1d04b8deeb3be273c5e47 halomaps:5552 +[H3]Represa.map 4C0A43CB 324060526 262144 69915ab31e4cb5561c31d86350334032b612a56f halomaps:6074 +[H3]Ruins.map 01D044EC 169070794 262144 1b0fc1a9387f7d16a6041ca5ab13af8dca2d2626 halomaps:5553 +[H3]Sand-Of-Warriors.map 1203B9D5 154425296 262144 8f63bcd4460f947b21bdc8a7a07aac5f1e21ffb3 halomaps:5826 +[H3]Sandtrap_v1.map EA88B0F3 329058309 262144 497cb60968e44b76196c5acae16da8b5eccd4fab halomaps:5554 +[h3]Sandtrap_v2.map 7F9A51E9 345661991 262144 72ac86f938cbb2507fa864e15062e2230ed836e9 halonet:[h3]Sandtrap_v2.zip +[h3]silent_lexicon.map 8EEDD77B 114672137 262144 8101d5c65ed85ce1e73b153ebc52885ff0c8675a halomaps:5293 +[h3]sniper_beavercreek.map 8C496541 92180298 262144 30adee756261990c833d728413184c25b100d5bb halomaps:6052 +[h3]sniper_ratrace.map 64A09C09 84629814 262144 36a1e544c33183a347c0553672676e486deda176 halomaps:6075 +[h3]Stiftung.map 3E956E8A 188399676 262144 dcadb1661fdfb0370a174d7a811d9a0c673f5ed7 halomaps:5626 +[H3]Stronghold.map 0FFAA6CB 176318196 262144 d56be124e0cb8240bc59d087c304e2908cc1c1b0 halomaps:5495 +[H3]The_rush.map 08708DFE 252546313 262144 a0d4f264106fd872228bf0ae65e3c6a09c6cf764 halomaps:5520 +[H3]Trench.map 11CCD718 142288034 262144 de58f1d17abea3d505d1558490a3fbc6accb2882 halomaps:5533 +[h3]valhalla.map 4A6B7967 226839379 262144 8558a2aba4c1bdb6f9b706e201235d520453ff89 halomaps:5574 +[H3]War_island.map 28EF12C6 140597562 262144 15077cf7773fbb10b2f4f4c2e0a481792d6d2256 halomaps:5447 +[h3]wizard.map 04BBC059 93535577 262144 6370913090c99e74fb53c2d24d568f7d6038ec69 halomaps:5747 +[h3]zanzibar.map B874B38E 292381692 262144 66fcf0602d4a07511527dd21901bdae26b82efb9 halomaps:6304 +[h3_elite]siege.map B28C5041 210516679 262144 a0ff1282722c1919343b246c49106909a1874be3 halomaps:6208 +[h3_ODST]seclusion.map 4206B5FF 225444781 262144 e8f58669b8dfcdfa96c0a4bbacaf9d59922f7f25 halomaps:6209 +[H3Astyle]Ancient_Sanctuary.map 09C88C6F 226164482 262144 2e8cc3a0a965210180fd056729f0d930567ec317 halomaps:6206 +[H3D]_ascencion.map 6F845BFF 138066923 262144 b20fec1daac74a31bdaaddf63ea050040eede1af halomaps:5443 +[H3D]_brujeria.map 0C1F1478 135019367 262144 79fccbc7ec9980140f3d252dae100dbb59e97d49 halomaps:5444 +[H3D]_cyclotron.map 6D3D640F 176302000 262144 fb1442092ef015650d7baccb78b30a1b8fb06fc6 halomaps:5445 +[H3D]_santuario.map E78563B8 179859468 262144 ffa75e09ed3bbef679305dbad7a6f81f09551276 halomaps:5446 +[H3DARIX]Beaver_Creek_v2.map 83051406 131673663 262144 e85c764513181b2a4eb7421da3b5686ab0149303 halomaps:6565 +[H3Style]containment.map 3AB7EAC9 228196302 262144 9b1688fdaa60636a0a5adfb5bfb71b2e80c14aa2 halomaps:5993 +[H4-beta]re-damnation.map D9C7D38E 216225755 262144 9d2aeae9557d2a37684f2491ca243c4fe89cc3b3 halomaps:6583 +[H4]_infinity_v2.map 6E698DBF 219568972 262144 bcae3f8232a267c5321d239cb264699088b41149 halonet:[H4]_infinity_v2.zip +[H4]_Lockout.map 48C397E6 224182853 262144 049a64064cabb69044b491ecf96f504d02f19f37 halonet:[H4]_Lockout.zip +[h4]_pegasus.map 3B60B15D 131152118 262144 229d4b3b6f33c5cef88842e60851bab93e9fbc5c halomaps:7129 +[H4]Beta_hidden_passage.map 408FC356 400544816 524288 fe87dc9f37c1ffcf78aa161d944a663f0e27d86f halonet:[H4]Beta_hidden_passage.zip +[H4]Bloodgulch.map C564C8AD 260110790 262144 98ef94176248bd1f3e43bdb8c995f1a26f6fb1f5 halomaps:6768 +[H4]Composerv2.313.map 6C227EB3 260646430 262144 6aa868e94a9d9c50da66528161d9dc27b56aa83c halonet:[H4]Composerv2.313.zip +[H4]Eterno-Retorno.map D9E1A570 254738939 262144 b1de68c54c737a1ee7901de48add6b3d4ff77778 halonet:[H4]Eterno-Retorno.zip +[H4]Snowcast.map 6B49AAFE 281025334 262144 de5436b70b3dabe43cd49553246053ff32448930 halonet:[H4]Snowcast.zip +[H4_Sky]AsVerIsland.map C4DA3060 338832482 262144 147ed0c544a988be129c328dc7a0a19d4e71aa81 halonet:[H4_Sky]AsVerIsland.zip +[h5]Thunder-beta.map 9A28A470 248869023 262144 68910da245885ed6c76b64d40714d6b1d6fd2708 halonet:[h5]Thunder-beta.zip +[HACE]Clans_Eaters.map 92B03279 341619478 262144 fee622ce793b16219229723b1cf096809b79a6ab halomaps:6180 +[halo2]ascension.map C4650A78 168858802 262144 ce22ec8d56dfac2b5d79ac8c2b5d84ab35d8505d halonet:[halo2]ascension.zip +[halo2]Coagulation.map F734E609 183904153 262144 e1317120879903a60cb2c6f91d24b739e713679d halonet:[halo2]Coagulation.zip +[halo2]Colossus.map 388A84AC 228928857 262144 19a394835af642173a3775e7827b7bee0e5db579 halonet:[halo2]Colossus.zip +[halo2]flood_revelacion.map 5A435E01 224546793 262144 b07f6befb057f582a7ce4f9a0bec71b2e327cde5 halonet:[halo2]flood_revelacion.zip +[halo2]Hang_Ville_high.map 1F06EC82 189497026 262144 2644ec452be08d5b4febe554bf80bb36ebbd46ac halonet:[halo2]Hang_Ville_high.zip +[halo2]Midship.map AFC3C807 234446339 262144 30a7f8980f297c1c9c3e844422f27eecd0e59824 halonet:[halo2]Midship.zip +[halo2]snowcast.map 7DCE122B 121914357 262144 a3e56fc83bc8a7682f93d3181b949ab6630c8bab halonet:[halo2]snowcast.zip +[halo2]terra.map 4A321759 131958239 262144 62eef3e9e6d3ffacd38d6e7dc3e6d4eb43d4468e halomaps:6934 +[halo3]desolation.map E725AEFB 294039852 262144 fd877f4989e073fc15a48cd46ee17d92cd859eb4 halonet:[halo3]desolation.zip +[halo3]flood_revelacion.map C5FBE97A 351512281 262144 e140e48768f360af0c52eaa4979ea3b97de6978b halonet:[halo3]flood_revelacion.zip +[halo3]nueva_bloodgulch.map 0CC2F26E 245565444 262144 7408e6f427e0ba0f9e3cd86b2db68f5c45c80d4c halonet:[halo3]nueva_bloodgulch.zip +[halo4-reach]re-beavercreek.map 3309D18A 265680151 262144 3f45a934ef1480fe3646d21f5d795f1f7b93aede halonet:[halo4-reach]re-beavercreek.zip +[halo4-reach]re-dangercanyon.map 98174E80 299156117 262144 fe944eaa43734b15daa8a67b4578804f2ecd939a halonet:[halo4-reach]re-dangercanyon.zip +[halo4-reach]re-prisoner.map 26DEA553 255148407 262144 a39430b94add9f89b5c02be2b634b98401a431de halomaps:6684 +[halo4-reach]re-wizard.map 41F608F4 228659656 262144 6d8818369a5b911f6f25e83c9627a14038a39431 halonet:[halo4-reach]re-wizard.zip +[hmc]zanzibar.map D2806004 54719290 262144 73facc0acca302929cdf72aef1f745141a142dcf halomaps:3329 +[hmr]covetornvv1.map 65EAF44E 266583999 262144 d60697c917080dbe2b5cba2985071c01c1f66577 halonet:[hmr]covetornvv1.zip +[hmr]landtornv1.map 1735154F 234316489 262144 b61eb9c431ca427505df615f6857a9ea51919970 halonet:[hmr]landtornv1.zip +[HNET]Social_Club.map D5B75599 60269040 262144 e3e3e5f79b85663eda95f4e1c954b91de7002f5b halonet:[HNET]Social_Club.zip +[Hr-Elite]Distorsion.map E3F000DB 297061896 262144 cc3ab4b80c3523506622f5f8882fc41da33ace42 halonet:[Hr-Elite]Distorsion.zip +[HR-Z-5]Desolate.map 4DD84945 228821627 262144 42fc692e9063a02a5cde321826ab6093cd9a8b24 halomaps:6327 +[Hr-Z-5]Peril-of-War.map CE7BCC04 256938727 262144 f5d3f983226945625771e4d6ec3dfa269ec8caa9 halomaps:6348 +[HR-Z-5]Pinnacle_Storm.map 291C0122 269612384 262144 7de57b6dea2cd22373f1099bebdef710e827645a halomaps:6328 +[HR-Z-5]Requiem-UNSC.map E776AFC9 299545534 262144 55f5fbfff82c866ab2526a0ec5a25b348133dbb4 halomaps:6329 +[HR]-Sangre.map 6B533D8E 273891250 262144 2c60a504fbd2526d783e6ff40f31e44c47cd85ba halonet:[HR]-Sangre.zip +[HR]_blood_reach.map F499A9E8 168920713 262144 45b2f8baad290a1e2501f6cbadbddd6f4f8cc7e7 halomaps:6294 +[HR]_New_Alexandria.map 2243658E 163653141 262144 5b8c48271d71bce6ce17ae1b3ec926d87176ffcf halomaps:6330 +[hr]_sali_creek.map 5C1370B1 69030988 262144 8d3b5f984e574c52722118d5cdbfee620340b696 halomaps:6076 +[HR]_Unearthed.map 6F8F0CAC 389334393 262144 dc3fa5af034ca3c2ab3d79b0ad6b3d24ca67d7aa halonet:[HR]_Unearthed.zip +[HR]_Zealot.map FD52DFD9 393379057 262144 da9f6869199dcf5a8aa2105034a826ebf9862312 halomaps:6770 +[Hr]Alldev.map DF4E2139 356739525 262144 0733072ba497a556f172ca5856d9190152fd781c halonet:[Hr]Alldev.zip +[HR]Anyversary.map 461E7C18 132566003 262144 01529bab01d09f0a63c45d070929b96ddb7dfd2b halonet:[HR]Anyversary.zip +[Hr]Dark_base.map 85CFDA31 128130350 262144 9ba8c4bc40d0ee1b413a48aa683dccefdecca33a halomaps:6769 +[hr]Dia_soleado_beta.map 67D5296C 320114693 262144 515015dd967e6fbf3a255330ca04c9e3898ab74f halonet:[hr]Dia_soleado_beta.zip +[HR]Forest_Treacherous.map C1D0B3C2 324038559 262144 52c7d4bbcba1d4e5c07d6ef90d2577bf74919b36 halomaps:6567 +[Hr]Gladeador.map FFFA0D94 322522511 262144 ce1115c01ded889b4adb0ae8692366fc39e309b7 halonet:[Hr]Gladeador.zip +[Hr]Hechicero.map 459A7AD4 348397260 262144 026987349234b403d42b4acb061c3417fc63e92d halonet:[Hr]Hechicero.zip +[Hr]Hemorrhage[HKÑ].map 3ADD3B54 279027792 262144 432ff73f2a9ce77f6a47db67ecfd71ac9c6f1d11 halomaps:6461 +[Hr]Maurix-Tribute-Smoke.map 9AC29694 328718750 262144 12f3527202eba963764a7e74ac3f4645c270969e halomaps:6568 +[Hr]Valle-Peligroso[HKÑ].map 7A25C842 293470592 262144 e6d6f82d9be56eb442534cb161e35e4ad951c5f4 halomaps:6462 +[Hr_Z-5]Herejia.map 89F05AAA 254310748 262144 b9728dfe2fea83ccecf17e520605100897b7ea3e halomaps:6349 +[HSP]The-Pit.map 4329F197 192273494 262144 4c80842ca3ed0b02b05b910439a87bb7e37dfde7 halomaps:5300 +[NMT]DEJAVU.map 31D7A70B 160461325 262144 549fd7b54be776585455c6f01b7904a5d8086bfb halonet:[NMT]DEJAVU.zip +[ODST]_vertigo.map 4E3AD3FA 181405649 262144 fda890bcc8f45ddb52c0a8a3160bbc6720b83ab1 halomaps:5334 +[ODST]Ambry_ce.map 8C773639 257793232 262144 a1c54ee099608be5ebe788707055729b08644091 halomaps:6295 +[ODST]Contaminación-H3.map 803FA65B 262552241 262144 b503677294605ce1dd4443f72c969ab1c80908db halomaps:6371 +[ODST]hangemhigh.map F7284B2B 199743691 262144 e8d6bcf437008020efc0c270d6021e55cbd5b4ba halomaps:6143 +[ODST]Terminal(Z-5).map 958FBE1F 263942482 262144 33d9c911f889ec8d86b18cadd4240d909884367e halomaps:6372 +[ODST]upliftreserve.map 310F8AE1 213502582 262144 cbf94134325b51a7c019bbc30b5ed6bbb286cde3 halomaps:6405 +[ODST_Rebels]Portent.map 653D95B2 227185136 262144 16883b90d9a57832b17e8ab59bc874bf756725bb halomaps:6296 +[OHC3]_HangEmHigh.map EF6656CE 113744704 262144 2c5c95108e338ea95d166831161e3ac99c154243 halomaps:5335 +[pmt]coagulationcmo.map 322D7037 270409108 262144 9615c6756f2293b2d7831e318294be2b43ac3616 halonet:[pmt]coagulationcmo.zip +[pmt]h4_nostalguia.map CF6874E0 394033769 524288 7034e512a79377b32f7f202d1137894b80f319d1 halonet:[pmt]h4_nostalguia.zip +[pmt]soldier_zero.map 99E36BA0 116971360 262144 6a0ad567500b90a52d4134d1032f4ef4865ed221 halomaps:7099 +[RDX-ELITE]_Warlock.map D203356E 83276552 262144 db96293fa6841b77f34697d76cea845e9ef4dfed halomaps:6581 +[RDX-ELITE]Swamp_Creek.map 153F06CD 89322674 262144 385ef86f9d470b9d932cd824f88820f4464c7e64 halomaps:6582 +[RMT]-Oni_in_attack.map 5B687E5E 318891059 262144 c9e0cc11242aa61bef452352ae99718c6d2e5239 halomaps:6757 +[RMT]_Wizard.map 56CA568E 105667202 262144 679c4261bdcc69a925b0970e7076f1492b615be4 halomaps:6580 +[RMT]Ascension.map 566EDC9C 262865445 262144 5e9a235605586e18e215e572160182f441551da2 halonet:[RMT]Ascension.zip +[rmt]axterion.map 58357E11 16713416 262144 5a5df18380958e0be236e4c9a5a227c2b75b3ad3 halomaps:6736 +[RMT]covenant.map D71B6367 220336098 262144 533aba4ffa2e8104f50d490e1f8c83308cedbc83 halonet:[RMT]covenant.zip +[RMT]extreme.map A0DC75EA 141626730 262144 545561c20a8e20903a634bb2675429156191b0ce halonet:[RMT]extreme.zip +[SDM]H3-Winter.map 3BD61619 117710431 262144 c82d996f8a58ee825c631dbd1a2acbf28118481c halomaps:6305 +[SDM]HR-NEW_BLOOD_FL.map 39092C88 125556617 262144 9ffeef60205a7e2c832358fbf088e4907773c620 halomaps:6522 +[SDM]HR-POWERHOUSE.map CF83EC54 156710507 262144 745a785eefabfd4e46161d9d6a80884703268574 halomaps:6026 +[solitario].map 7373507B 123659563 262144 ac75111dce7ade4d0496ecb695564732e3c900c9 halomaps:6479 +[StarLagoon].map E81F6581 231249969 262144 4c93bb6599c6a580e00288d7de1ace4a6c7c09da halomaps:7081 +[TMM]_HR_Nieve_De_Invierno.map F961DD21 401490112 524288 2bb723d0893a725ea7afbbb23db61af7cf3f1d66 halonet:[TMM]_HR_Nieve_De_Invierno.zip +[TMM]_HR_Pinnacle.map 065050CB 401978314 524288 34e2072c0685e92bd31bdd8b0642c25c6a84e4d3 halomaps:6712 +[tmm]_lumoria.map 38B9090A 75389927 262144 db4a60254e779e1711b531bc067f4817b8563dff halonet:[tmm]_lumoria.zip +[TMM]Box.map 8FEEDA34 324937933 262144 f46312416dc71f12c24380d2b9a4e0e88920197f halomaps:6523 +[TMM]Guardia.map 98EDAEAA 398930183 524288 2b389aff001713103c2641a6af124fd396f139a7 halomaps:6524 +[TMM]H3_CONDENADO.map C1443513 350614845 262144 301238964d566e25ee36c3a9fa39e5d6c91784e9 halomaps:6373 +[TMM]HR-_CITY_OF_WAR.map B4B12706 280650419 262144 ad7469a1bc8823398696da766b44851b33733155 halomaps:6579 +[TMM]HR-BASE_SWORD.map 7A44E6DD 349526789 262144 a49f8a0e87a14b1955d295fda837066418020b23 halomaps:6525 +[TMM]HR-Camtrack-Battle.map 15A54269 395038460 524288 b3d76ee00a6d247a91c336e542a05972f07ce642 halonet:[TMM]HR-Camtrack-Battle.zip +[TMM]HR-COAGULATION.map D5EAA74E 246382531 262144 c09f877c1652576934885642e7591ea3a64d0fb7 halomaps:6499 +[TMM]HR-Dangerous_Quarentine.map 4A82D8EC 336430382 262144 ca7017fbc4334afecc3770d0bf4dc07bb6bb6ec5 halomaps:6685 +[TMM]HR-Epic_War.map 7BDF2BD8 307971504 262144 b3a61f5de4165a9642e44acf242b54988cf43ff5 halonet:[TMM]HR-Epic_War.zip +[TMM]HR-EXODO.map AA51A6ED 297420193 262144 bf19df57111d469e40f5b893d0c2f657cf99f30b halomaps:6526 +[TMM]HR-FABRICA_ABANDONADA.map E256B6A5 316002170 262144 859c268a8502888f1a86fb579c59de9a60d6d601 halomaps:6351 +[TMM]HR-Firefight-Airlock.map ADCB1453 257343889 262144 32c99b25ed16cd3706fee3e5e69263f00b4fb246 halonet:[TMM]HR-Firefight-Airlock.zip +[TMM]HR-Firefight-Airlock_v2.map 5C37A6FB 359831062 262144 7e9ad0abbc95ac7e88bc0d40369ddb7c030ee67b halomaps:6686 +[TMM]HR-Imperial.map B33624A3 321472260 262144 8c925ffaf499ed8961c809e36a494e8c056bf97b halomaps:6527 +[TMM]HR-ORBITAL.map B4BC2194 314141484 262144 72cc26658c146583fb7a68a5cf4132bbcdc706a9 halonet:[TMM]HR-ORBITAL.zip +[TMM]HR-SMOK3_FOREVER.map FE19DB90 316202193 262144 659f5bc6e20f29638cb67a16f34ea78d38d5b8f6 halonet:[TMM]HR-SMOK3_FOREVER.zip +[TMM]HR_INVACION.map D3282680 261525008 262144 8ae211b582d5f6c87ad2554dcf01bdf81392d039 halonet:[TMM]HR_INVACION.zip +[TMM]THANKS.map F484B64E 247234051 262144 eca6c63a2168189c668e4ee082c3f1cc2edf0f6e halonet:[TMM]THANKS.zip +[tmm]vientohelado.map 48223DD0 156891535 262144 72a4115dad66a251d1f57d00633fab5640358a57 halonet:[tmm]vientohelado.zip +[UMT]H3Elite_Flood-Tombs.map 84D83F53 306985186 262144 53cdd27a8ca547264a98a1e40f57f6c01fab2c51 halonet:[UMT]H3Elite_Flood-Tombs.zip +[UMT]octagon.map A26BFAB5 238897114 262144 362257a093e278a7e8be3e4c3da5eaaf1da9c4f0 halonet:[UMT]octagon.zip +[xXx] BEST MAP FINAL.map D19E9855 569658 262144 ba98ab292f7229e7709f3b65d8b33c245ea80b3c halonet:[xXx] BEST MAP FINAL.zip +[xXx] BEST MAP.map 974A9ED6 10273379 262144 294080a81c4edd989065ec8d75402cabe0f5a93c halonet:[xXx] BEST MAP.zip +[xXx] BEST WEEABOO MAP.map B5652116 9627745 262144 6bbdd0cebb77c8d3414a0c2f28b1c14a873889a0 halonet:[xXx] BEST WEEABOO MAP.zip +[Z-5]-Arroyo_del_valle.map BB468D64 147011951 262144 474d41478f58a0ab17633cc9989816e155d18a04 halomaps:6210 +[Z-5]-Campo-Sangriento.map 8818E151 162409067 262144 c0400e083faed7bbec5390a20383e560efc5e317 halomaps:6144 +[Z-5]-ChillOut_Alpha.map E2558B47 312759912 262144 1ccd8d8cb1026abf1d96e2c3d70533877ad208f2 halomaps:6286 +[Z-5]-H3_Reclusión.map A2F3C3F8 308753383 262144 bcebc69e0b184ef2d8d6be9d6f7ba37e1db3d965 halomaps:6211 +[Z-5]_Carrera-Mortal.map D14711C5 119090241 262144 7d5cd265d310ab1653de801f2f74c35625fa56d4 halomaps:6145 +[Z-5]_Ejecucion.map 24556F17 69986374 262144 31ed174c03eca663b71a8736a41ed7075b8a6cd0 halomaps:6146 +a day in the life of killer5000.map 3CE88295 17312172 262144 0ffcfedf04f92197d2eb0bfb47aca4613791d911 halonet:a day in the life of killer5000.zip +a-small-race-track.map 12A61039 31195511 262144 2c9057bb2ed89afaa1747d45fc3efd2dffd78171 halomaps:4996 +a.map D8D79C9E 35101221 262144 346bfbb77255a77314339114caa2d82be3322745 halomaps:5275 +a.t.c.s.xl.map E7592C69 13681048 262144 482e7228070480dd7ea15918d07abab923bb1e68 halomaps:1944 +a10.map B38A6A40 380768877 262144 0f0833e04ef908db94b7bea93df0609a6388ad3c halomaps:6761 +a10a.map 047C6580 116954080 262144 aecc72e4aad28b47aabdae5f06a37b37f0496f19 halomaps:4452 +a10av2.map F9B4EE68 131064153 262144 40bf1c27f7178f3a2d9558eee4c86daae6c408a9 halomaps:4505 +a10opening.map 601F9A70 24011460 262144 7e5fed31bc5116ab38f86c6de64e215d5bf1cafe halomaps:6765 +a10STH_movie.map 96EDDF8E 124017374 262144 fea58e69149db5aa3be0a638a1f01de8c58513b5 halomaps:3454 +a30.map F85A54F2 397315371 524288 4648b3d3c805c22c343426bbb6f859271d82885d halomaps:6929 +a30_b.map 4FF01AAB 47652554 262144 fd52370423c472ea82b6923a8fed320057974754 halomaps:1765 +a30_b_elite.map 2F4FC641 47653975 262144 41debdcb9bab8cec6eb9109b2ab73de60111e195 halomaps:1008 +a30_infinity.map 5ED5F39F 153837881 262144 27c9181c966e15dee7e3d299f8eab90bdfec5f04 halonet:a30_infinity.zip +a30multi.map 30DB39A8 39192386 262144 b7e244528633740169509f9c0fbeca800e11bae3 halomaps:2575 +a30playground.map F0078391 123808751 262144 e6e469181035bbcce3e6fdeb06999d2379c9509f halomaps:4758 +A50-BK-MLT.map 00000000 92372695 262144 fd5b59f930756558ae48a4a4bbc51bba0a59999c halonet:A50-BK-MLT.zip +a50.map 917E38EE 400023586 524288 ead7cdb99cdf447843ba8dfdcda890fa13da53eb halomaps:6272 halomaps:7051 +a501.map AD850A54 202909086 262144 5f8c5a9fc23fe88085864f13df3311f7b42f3903 halonet:a501.zip +a50_modified-v1.5.map D439FC67 162501110 262144 04008ae322c46869f80407cb4bfc9341802ea999 halomaps:3668 +a50_modified.map 72DE0CD5 161259456 262144 d8ac7b414f3fe9e296ca7c066ff18f52ab567a30 halomaps:3569 +a50_mp.map 6FC48A6F 49218388 262144 e48b56d32918b668679da25e006e4245ce8c56d7 halomaps:5956 +a50_mp_bk_v1.map AF840E53 161654800 262144 303c08635f54242df63fa8a161f91a8fff1318d0 halonet:a50_mp_bk_v1.zip +a50sth_movie.map D4760DD9 122473397 262144 f80cf3a8b50c151285b706e2a17f47a0bf5ba315 halomaps:3455 +A_City_Divided.map 63FADB3E 346419572 262144 082ff67eb9d7681cf13c0df1d09ae5e056d75f14 halonet:A_City_Divided.zip +A_Salting_Action.map CC0E1184 21812016 262144 13323fda64152271020e836111d59b990b6f76a5 halomaps:3113 +abandond_city_404.map A7E68F9B 46875795 262144 f598d909e5a85064875b84c203dbe613951c957c halomaps:1440 +Abandoned Turf.map 9B18FDBB 74088308 262144 0474381c910ffc4378662960c291a93a6df5a424 halomaps:4536 +abandoned.map 094DE1E5 27855961 262144 854ce20119369536d153fc4f1b7d5a935d804123 halomaps:2282 +abandoned_airball_ai.map A4126BFE 73660495 262144 5aef3c6dbba0f4594f9c12ab7a108ddc0bcabee6 halomaps:5780 +abandoned_city.map E91DDA1C 18280816 262144 9a6bb8e3289486b63a678d2e94947de1a4852a03 halomaps:5913 +abandoned_quarry.map 0349C409 20277239 262144 9d08ede89e4cb8b357b89a08c6a1146d791a01c6 halomaps:3974 +abandoned_sinister_grave.map 2F1CB903 17146892 262144 311ea60b60904cde3f76f48f9eaeeb9a30adf42f halomaps:3890 +abandoned_tourney.map B97B5FC4 29154289 262144 314f95a74952e782c563a2b3ea683144a827e975 halomaps:2554 +AbandonedTerritory.map 7EF43ABF 41596835 262144 bad3b471e998983dab4c91234998cb8731464c55 halomaps:4111 +Abandonment-BK.map 00000000 182853762 262144 2366a97ac7c272581cc8a289c7447ffa5e3dcf9b halonet:Abandonment-BK.zip +Abandonment.map 54E5D099 19670792 262144 46a23698587b2d4188cbd24ff9170ae9d654bd74 halomaps:4759 +aboveandbelow.map 8069B12F 25494706 262144 03c8002b9e0f578b1cebad936bdbe55d7f57eff6 halomaps:682 +abridgetofar.map E9AEA759 31376922 262144 77ea0d517fa85421f6a722193d8c404fe7ebd867 halomaps:1327 +Absolute_Zero.map 65C178D5 23738693 262144 230de9319aeae609188944209ce2cbc7dfaa26d0 halomaps:4186 +aburrido.map BE776E51 220433608 262144 8e9965f3fff2c950535601885d5d17241d80d270 halomaps:6137 +abyss.map EC9036A0 37938259 262144 e7e93ac2cdcbe4e2bfc1a7b527bb282d67d88bc4 halomaps:556 +abyss_beta_1.map 2C524FCD 38959809 262144 bed73032802e88e6626a79de61675f944efd0e1c halomaps:485 +Abyss_Redemption.map FC0D2422 89902934 262144 f83d553e9ef4af0b34a0e1ac5638144d8cfe7469 halomaps:4705 +acoball.map 34540954 15184121 262144 2a810aa318d5cd8b907312c822a189900332f807 halomaps:4963 +acoballarena.map 28C2C120 22277699 262144 f23b2ce4f0f9d07d3e884d2d1d6897875ad6e526 halomaps:5366 +acrophobia.map 718551FE 63961898 262144 15b9c9f27056d9143b68206a19a42857320022cb halomaps:1878 +act3.map 4005530E 83740039 262144 55086d2894accc9df2ceea004b4ba611421464b7 halomaps:5121 +acydmap.map E886E958 12836392 262144 44d57f4bf84a7061181f3f5a29c9a092d9b0fa0d halomaps:597 +adoddw_underworld.map 127F5727 31886492 262144 f919ef4ae02b8832d12c0b674303dad41aaf9584 halomaps:7100 +adolifatobia.map A16D5C84 46851063 262144 680dfae3847dd6eebce304edab1a074ab9006e82 halomaps:3375 +Adrift.map 8BA1A93E 308490853 262144 8e8147cb415c85468f64f8d0f65342bd11266174 halonet:Adrift.zip +advanced_bloodgulch.map 7B309554 13936092 262144 7b417196b91c04c07ba1ff65fc10586a1501b874 halomaps:6364 +Advantage_Point_West.map ECFBB3CE 17065768 262144 1f6fe2d57751a9b720b694b092debe1c405e73ba halomaps:201 +adventure.map C2778451 82701615 262144 5e4f10fd5975f441c84dd968a2992650d32d7cc4 halomaps:5286 +ae_mp_egypt_V1.map 14461E0B 43682534 262144 be119b62f0e26c68eae987255fe00b628a5cf897 halomaps:5243 +aerial-assault.map 63267B9B 27814731 262144 7d84ff679dc730401e4d4d33d47ef2b22a89e73d halomaps:4272 +aero.map 0AD81D15 19423956 262144 99e77427302aa319791d59da014bbcdfa21d719d halomaps:3099 +aerorace.map 80DC8278 29622215 262144 e6a139906eb6ac29c831b8e73926ba925fc72d18 halomaps:4977 +aerorace2.map 89FCE0EB 28754936 262144 484586a19e0e085c3e21576390c6befecbc1a1c3 halomaps:5317 +Aerorace2_Fixed.map 92E6B8F4 28755048 262144 ff333a25aa9182e7e8861454b8b2e27aba768fdc halomaps:5367 +aftermath.map 21791840 24741788 262144 767b83a71f6224416a23a20da3570874d427b140 halomaps:1065 +aftermathbeta.map 3FEF6CB6 18056897 262144 1607a1ee466a957684617d12c2a6845d00fd6afd halomaps:993 +agamemnon.map 1AF5A8FE 16115310 262144 e1317d3d9658f8221fc639ee5954e6e75a74b640 halomaps:3376 +AGN-Tornia.map C1366A04 68888002 262144 e65f421d48d17e5018c6bf79f7f27599a7f1cf7d halomaps:4793 +AI-Tum[H3].map 47B66AE5 118238299 262144 ff9d99c6a1c0ff491c6a70606ca47223360773e5 halomaps:6618 +ai.map 5B3289EB 14484032 262144 7d581a565aa7b3fdeff682c1125268eed9ac7f38 halomaps:202 +ai_battlecreek.map 5E5C20B2 55905581 262144 70a65585bf604aee3f48d9f503a36fffee3e7271 halomaps:4005 +ai_beavercreek.map 08078E79 58785067 262144 6247929b9424eec3cd176214ae137f3b160f39a7 halomaps:4523 +AI_beavercreek_Flood_FtD.map 4A688BC1 71999210 262144 49743476cf05baea94fa0a67596160e7181f6d21 halomaps:4646 +AI_beavercreek_Flood_FtDV2.map 4AA2C33D 79871626 262144 94a9c9be93e16c930de74c7a13e8b94c0a5aa541 halomaps:4647 +AI_CREEK.map B030113C 33329914 262144 e830a52f6432ce31c04c673fd10a46f6202d249d halomaps:2166 +ai_map_final.map 6403EACD 23879288 262144 33d103f0bba9385dd73f81419ea620c2b7180379 halomaps:3390 +ai_mombassa.map EDCBDE8B 50726291 262144 1b0e34ae997f4a53bf030639c0e716e5a88bb56e halomaps:3837 +ai_new_snow.map F0D65048 71847971 262144 3c355ed1e29afcfa43d980860a87b818a97c2745 halomaps:2988 +ai_ratrace.map 99681BF5 44445610 262144 a8f2d5c01a3965e493cd2202c1329348c25f6004 halomaps:5636 +ai_sync.map C594B884 22518656 262144 32ef5ff30407f4f42d7796833087c76389f30e49 halomaps:5989 +ai_takeover.map 937FA7E6 89887969 262144 c0845c532ebb7e8d47a479a14fecdfcb892d038c halomaps:4425 +ai_takeover_2.map CAA398E8 101589177 262144 6ab48654ea7b33bcf7afe0b26ce5572e737a0ce1 halomaps:4453 +ai_test1.map 99BC7D54 29790963 262144 9b3aee02524fc4640420403e0057df2f4789ecac halonet:ai_test1.zip +ai_test2.map 1A4A2D8A 29981888 262144 f8631875e693d03c597ffae6f82561d0769c95d2 halonet:ai_test2.zip +AI_Timberland_FtD.map C2DE2F54 15631816 262144 e6ec54eefed9422928261f80443e110733dbecb9 halomaps:4648 +aibattle.map 44402629 73087589 262144 b98026fe41fd3ac07c18e7f329e47310bb5f7c94 halomaps:3871 +aibeavercreek.map 4844B836 13822552 262144 a24dd6a4048d665391343699781d649830e5b2ca halomaps:1897 +aibombfieldbeta.map 09845A3C 24108496 262144 ac8640b41335209b3ed8d651e2a5a7e794ad7bed halomaps:1581 +aicreek beta1.map B0335D2F 13104208 262144 b3d471d026dc4c68b0e3ea66970f40276ccb0a30 halomaps:1978 +aicreek.map 165636B0 58988419 262144 b75ec7cca2b3c4aa64077cd6094b3e23c5d473bb halomaps:2813 +aigulch.map 791AB2F7 13305344 262144 414f0f0b9202863dee5ae3fd8895dbd9a5e2a12b halomaps:1038 +Aigulchv1.map 12FE21A2 112447114 262144 4a535a5df5c6fd2ec9976d185c1dee2862a7388a halomaps:3042 +AigulchV2.map 35664350 75600434 262144 99117dc56fdaa17f48ee38a4fe4cd2ca82ef41b7 halomaps:3078 +ailevel.map B2DF7009 15954122 262144 df7e8e57d3a427785dabcf5498676111537b9761 halomaps:3643 +aimania.map 26C3C8BE 46427527 262144 3b30980ef89f7dcff6c9b7d05627ce34a073d788 halomaps:3136 +Air_Battle_Canyon.map 96D603F4 69196684 262144 e9a299170d3b710ce74fec53faf783be2db4d23d halomaps:4303 +air_combats.map FF9947F8 58478452 262144 05e3270048337914e9d7a11f271b312653f78216 halomaps:3377 +airball.map 6203C1A4 20581713 262144 78e8253ead371f047ac68551aac78cce3230577b halomaps:3112 +airball_mod.map 54C226F1 27616581 262144 8c09a42c490d10cf01d00997b4112a989efd37ee halomaps:3137 +airbase_09.map 7E939D54 31485082 262144 0d9500538e30495854be264ab78ea978b403e257 halonet:airbase_09.zip +airborne_aco.map B0A4344E 29829629 262144 cf0842a4f364b4ef4780c8104a50f31411b0e913 halomaps:4997 +airfightbeta.map F3D13354 31617726 262144 1652321b1d02fbbfe6d30004557558cfe4d7c4d1 halomaps:3975 +Airfights-up-up.map D054EC1B 323289483 262144 7f5e699130d68bf1a23377cb87a52a202b5fe227 halonet:Airfights-up-up.zip +airlock.map 03ED11D5 17918528 262144 7ff089371f36426bcddffa28665a271d58fd0333 halomaps:5068 +airservatory-uplifted.map BD07DF7A 47545239 262144 a818258f25534b998580dafb2e6e75392876af69 halomaps:4461 +airstrike.map D933BFFF 26404412 262144 3b6b987ed9ea0e115432d4e3486d8bfb9e6f7ab4 halomaps:2979 +airstrike2.map 71F10690 31410330 262144 8463ea301db86eee6cc4b6330989753d030bfdbf halomaps:3138 +airwar.map 6371A9C8 47930210 262144 002addad4e4353bad64c3c56e81ce13604c82597 halomaps:6554 +airwars.map 02496AA7 45826185 262144 ea6a218e190ca13c250f895196a4b5f1983260bf halomaps:4357 +AIsnipers.map B1A26F53 44250862 262144 37a8b3253cf3d5dc159865cfe19309a9324f1e71 halomaps:4225 +aitcr.map 1DE030DA 97118656 262144 ccbffd7868271ad7be89151c09bff3e71b040ba4 halomaps:3490 +AiWarGulchBETA.map 2B627B03 70539466 262144 16e5cf7c424c395ac4fbfd7718c0805e023459dc halomaps:4051 +AiWarOfGulchBETA.map B8650413 70756870 262144 bc51d8f764af0989d3fb7f308e27b05f03f1c665 halomaps:4069 +aiweagulch.map AD400F0B 85644553 262144 823149d265d8269b75c656571fe979d983068dae halomaps:5556 +alasis.map D769D6B5 26951222 262144 162ee3a9c74308027e9bfddd34c83ede3ad63938 halomaps:3378 +Alaska.map 43AD8061 400872512 524288 3461cb07dfc4d8ca5afc696891a13cd215e0bd48 halonet:Alaska.zip +alberca.map 49F18A18 111611596 262144 f20fbf65feb28c057fa6a4a2ce683dd794bfa4d4 halonet:alberca.zip +alberca_v2.map D019DC40 147533785 262144 2df2820626e1a19da3ee0be87667d5f8b020a217 halonet:alberca_v2.zip +Alektorophobia.map 3537274D 17276752 262144 93f0941d1139dcbd0da9e4f4035a0686c7bd53d9 halomaps:1945 +alerion.map 6AA848F5 26616979 262144 35a2d79c706e499bef4534bb9a4cd9ff85e97db5 halomaps:6450 +alexey.map E74090E1 48958336 262144 33c24feb7d7008bc7ac0ab072ffb8ee4ce9fc7e2 halomaps:6308 +Alice-Gulch.map 5EA3D576 95598098 262144 92f61f74287efb113e5481442e21952d4217b213 halonet:Alice-Gulch.zip +alivah-pb1.0.map 5C0322E8 131923523 262144 dcd45926756a8de3c2221ce598e605ce69107a7c halonet:alivah-pb1.0.zip +alivah.map B0D3E958 119601716 262144 daf1204c792fc57c3ea6a7225268a58c7f3ef752 halomaps:6953 +all_out.map 2C2291A6 16329416 262144 cd837ec80f5eba59b49db6abf258a012452cf6d8 halomaps:3744 +alliance.map 45C5A924 79334219 262144 2eb89b4035fc47d5f516408f0b138242dbdf48a6 halomaps:3079 +alone.map 9CC355EB 24887356 262144 1493aa9c83c9ca6f68849f50d92fd1e8bba9dfcf halomaps:6992 +aloneisland.map 63766CA2 45209815 262144 03a5f255f6b91f4dacb80bbdda122ce085ed1e7f halomaps:1844 +alonewinder.map 0B3EF33E 36684948 262144 ce208b7e2041ee7b930d8bd99a7637a970b757ef halomaps:1822 +alpha halo b.map 7491DFDE 110066752 262144 1a3913132624514ab706c7a0c662a45cc8b2164b halomaps:6533 +alpha.map 8B79C1D9 15072148 262144 1594cd14c26e1aceeec3a8f4896d8e44690978d8 halomaps:3456 +alpha_bridge.map 2611014E 32835556 262144 24c65964ded6a9a47ad6ac1d7b5cfe07ff35b158 halomaps:5142 +alpha_m00kweapons.map 8DD77C5E 30117229 262144 e9a326a002febc1e526dc50e2b50ade7978da9a4 halomaps:3544 +alpha_oot.map A6EC64DE 31774206 262144 bd326381e467f9439b30e5b242a840bbf92fdbe9 halomaps:6228 +alpha_oot_race.map DF5CEEAA 32007954 262144 c8772dcdc50970acfee131596fba720a8520960c halonet:alpha_oot_race.zip +alphat1_compound.map 11D035FB 42647964 262144 6c34e0f94049c0f92a3aeaaa7ebb833bd20d5f1b halomaps:5673 +alpine.map 7ADF1DB3 62644912 262144 b3ea298bd6811199334e1e521054a238a1b97a21 halonet:alpine.zip +alt-b30_time_splitters_2.map 0B14E71C 113853131 262144 f2736394c1498cb93ba0bcbbd99de75c9ff2bcbb halomaps:5958 +Alta_Baja.map 9A33F242 116924065 262144 cfa4e770e78e3186efa48afd9b936022cb155888 halonet:Alta_Baja.zip +alter1.map 9C0CC1BD 50314575 262144 ecd07471959383c0a3e39ca19f43e848a4db09f6 halomaps:4834 +alter2.map 8104089E 95358740 262144 022fc4efae3e47642380423f788e5bbd4f120d85 halomaps:5037 +AM_house2.map 1000F69F 96656745 262144 6ce53ea197e3f649674beff94ed5c742c705af57 halomaps:3783 +amaranth.map 7AA7EAE8 17988589 262144 9b9e65bfb10486d81a55be8272651bfbe6c3258e halomaps:1021 +Ambry_CE.map C34F1DEE 95333756 262144 7a52f20c46d6d2354085721190f6e256d3b3b720 halomaps:5414 +ambry_ceclan.map 42298BBD 118771566 262144 28a970801761e900c2fa6dc74282983c820ace1e halomaps:5449 +Ambush-4.map 00000000 378530027 262144 4e37c074ad9ffa87904bd9372573c5e0daa0726d halonet:Ambush-4.zip +Ambush-Live.map 00000000 270562173 262144 b0f75f54bf0534e1ace4410b49f599098bac1666 halonet:Ambush-Live.zip +Ambush.map 2E11EF43 123073752 262144 7dc78e6c1fea4d51780c5c787c482166898f8e61 halomaps:3426 +ambush_2.map A8E53735 80690662 262144 a14853e446f5f1f9f84dfa1aa84c0326be0e5fc5 halomaps:5213 +ambush_3.....map 00000000 356612947 262144 52aabba1e94ea77254aa8271835844c65d11b73a halonet:ambush_3.....zip +ambush_3.map 00000000 356612947 262144 22b5dd7045d08bf720a8796157f0e9472166750f halonet:ambush_3.zip +Ambush_No_Way.map 1F9610BC 291885556 262144 fa1ffcae243f34e29d1dabc28a85ab174fa4c427 halonet:Ambush_No_Way.zip +Ambush_Your_Way.map 9652D33B 297054760 262144 e94b3fbaae02c8b940015a8637bc8aff3884f6f9 halonet:Ambush_Your_Way.zip +americans_vs_deutsche.map B275FB74 38449702 262144 f0b131b2abe47550e074e3767199c7fb8658e5dc halonet:americans_vs_deutsche.zip +amplitude.map 276C10B0 14097832 262144 02fca484232ebf8678a1fda04218b143ea1d5f5a halomaps:1823 +amysroom_beta.map 2A8F93F1 13031712 262144 fc4af21842768e3d7f5d89e06dba37fd20f0beda halomaps:1802 +ancient-carousel.map 4E41534C 18600704 262144 a1e66f2fe8e2708733aa9563a3158aafb3c85ee9 halomaps:5701 +ancient.map 8F3F2A35 18654068 262144 c17460cd1eeec9f4500b988696f30eabe5a15fe1 halomaps:1433 +ancient_evils_test_map.map 640FAC4F 47792344 262144 fc6ab721404c96a317947d788b212a1ddaea2688 halomaps:4794 +ancient_forces.map 46C22036 80982456 262144 fab8a8b03b0742a17afbc592b3fe6118a3b95b0f halomaps:6121 +ancient_forest.map 220BAFE1 28153916 262144 4d3e7ce223144a33780cc03c8bd97d6a31847330 halomaps:4240 +ancient_sanctuary_beta.map 49EC1489 25090576 262144 19ce37617561456767aa64b80ae1392c44663c4e halomaps:3934 +ancientcanyon.map 0932AD40 14377144 262144 79ed8c3f30988574fdd4146cc8671cf3d0cabc3b halomaps:5214 +And_You_Thought_War_Was_Easy.map 5D03C8F2 109126958 262144 6570c3b76b19fef65a07732c8380f616d7d2451d halomaps:5627 +And_You_Thought_War_Was_Easyv2.map 7C346CD6 126390931 262144 7d9f3c29b76415121c3276b9b911870c601f9889 halomaps:5702 +angel_island_pre_alpha.map D9916310 69729288 262144 72e64f4a0de28acf4af19cf73e6d75b82128d2a2 halomaps:4549 +anger_ai.map 9CB88DBB 86955385 262144 7c6b1d2e201f540135d5273284ae0f41660caf35 halomaps:5038 +anguish.map 0926473E 18876096 262144 fccca46355b0f1c29c7c8cd5ee3b4b01af495b01 halomaps:2335 +Angular.map 67C61E6C 22822773 262144 e446dcd1f6faaf96bbbdd39949eb5e128effd4b9 halomaps:4187 +anomaly.map 4AD258E5 13907336 262144 362e4fa94c285611e8399b3fa535aae8d7ab00a3 halomaps:4088 +Another_World.map 37B23A95 48928777 262144 d816e411aa3aa3256017394dcc74faac90e5304a halonet:Another_World.zip +Ant Man.map BF134338 179255333 262144 8ca74c413a1f9c7620789d6a78815ac7a64e2814 halonet:Ant Man.zip +antfarm.map 661CD346 166326601 262144 0f9e477bf7a1c03d785dbce6c40b27d23f9a3982 halonet:antfarm.zip +antfarm_sfw.map C1B49FE2 160277746 262144 41498639d237d13683ea3ad2fdf61412adc06446 halonet:antfarm_sfw.zip +Antimatter-Gulch.map 6A3D6420 288539848 262144 fa70072f9f5c0ef7ca6aa3a7fe0149a9116456ba halonet:Antimatter-Gulch.zip +anxiety.map 299106D2 22498520 262144 dc67c26becab705a12c5571096d520a5ccab12bd halomaps:1276 +AoTCR.map 9BA16CCF 119551586 262144 1819d761772ffd1272be96c0038bc269490f8e5e halomaps:4912 +aperture.map 1EFFA725 225321866 262144 d2d16544ddfdfb6237105451929b4b50dbf702cc halomaps:6993 +Apex-Base-War.map 53054B2E 102608718 262144 898c26fd8cd177c99045e6213f88d3cb5fcdc3d9 halomaps:6586 +apocalypsehugeassV2.map CBE0CDE2 52701680 262144 5afb0ddc67ccff95277edabae7854c04afc48beb halomaps:1582 +apocalypsehugeassV3.map 35BB3EE2 67705060 262144 be6718bbf93583da9a6f19e57d458f440c88cded halomaps:2419 +apocolypsehugeass.map 92373689 56291512 262144 d098ebdd7844f1b417bece28dd17d6896abf1445 halomaps:1548 +apparition.map D1232303 76012310 262144 1575dfe256f69ae6f939b4c625c5df2ca0e5864c halomaps:3624 +AQ-18253.map 8FA14789 41462318 262144 c0b15c511ffbf6dab96f13ac00093e0608cf337d halomaps:4337 +aquarii_ce.map 06D3FED9 61176884 262144 dffdb0893989fdc456c3222e233bccd7c0bc82f2 halomaps:5110 +aquarii_final.map BCF1D6BE 56943681 262144 70931317a6f9f5b3fcf9e51234708c4a0b201459 halomaps:6775 +aquatek.map 8ED376D6 15352100 262144 c684a7e1224e4d58134a1a6bcdabd97a53418a65 halomaps:3283 +arachnoid_alpha-0-ai.map 04A2AF46 84653820 262144 2cc8047656111bdb810dab2f7d6150c67044577a halomaps:6994 +arachnoid_alpha-0.map 5C7D7AAE 72758721 262144 3ceab005fef752456d46ad43ed094d829988951b halomaps:6995 +Arbiter(vs)Masterchief.map FFFA6F4C 111084690 262144 9e8232b2dbcfc34ef5c3053732de296f48fb414d halonet:Arbiter(vs)Masterchief.zip +arctic_battleground.map 0E469CDB 20459812 262144 e4ad809b2fc0b53b4f2fe4c9365bd72472b0cd08 halomaps:1318 +arctic_canyon.map 22F56BF3 17870744 262144 6e3d9e0704ca38a4f3e71001dab7759047f416bc halomaps:708 +arctic_wasteland.map 4483440C 50689881 262144 44acad9220f3b693b5a0490ae4a3effe5365bdc6 halomaps:1673 +arctic_wasteland_V2.map B05D6BAC 52241081 262144 851d399b6604514df39a364eae22aa9a472cc09a halomaps:1695 +area49.map 1D5DE208 75931973 262144 cbddace2ce98c3d0c4fc4ba2682bf90813204fa9 halomaps:3838 +area50.map C8057EBD 24474322 262144 18d9556b189c969d9183d91b2c81efe87bac0468 halomaps:3839 +area50_revamped.map 20D515D9 26280438 262144 c97195c89fc3e5233a2dc274b327a9c9f9e586d9 halomaps:3907 +area51.map 217AD954 133713233 262144 95f285ca85b1d58aa1660a8cff12c6a808b10120 halomaps:3872 +area51_alpha.map B51C2261 25183208 262144 d5a469e6f4cc460e0beb105599962411f98598ee halomaps:868 +area52.map 154FF79B 38582391 262144 97c3ed268bd367ecba7684b9293d25fb22c0993c halomaps:923 +area53.map DA83A7E5 46329042 262144 825336074da12d4fd5e53e18d87d0cf19ce4f708 halomaps:939 +area53_rescarified.map 51FB92F2 98471187 262144 160eec70119b1fe29e745bb01f609f6f77cb27e6 halomaps:3840 +area53_rescarified_V2.map 6E45921B 99145127 262144 6ecc2234624601e30663008fe14d82596c66757b halomaps:3841 +area53_Revamped.map 54EFAA36 106801334 262144 c7b1e4429fdb1d1196e8ce84ddeb8405fd24929d halomaps:2814 +area54.map F21EF75D 74640329 262144 87b134e84c64d23febf525e340531a213adbd8ab halomaps:1028 +area54_v2.map 82559694 71216957 262144 98e8e69b3cd5ae6ac22105e35e342a8b80019640 halonet:area54_v2.zip +area54revamped.map 17D1F223 107127076 262144 8c389dc9fb14e6a697284107ada5088099f3bf7f halomaps:4273 +area54revamped_v2.map CC952B5C 102033752 262144 83069105cfe2a8468e9b5d7d29fb1c73c64a02ef halonet:area54revamped_v2.zip +area55.map 80237CEB 46117456 262144 9ba7f5a5acd980e9aeeedaf0f921809d160509ac halomaps:1075 +area55_revamped.map C93FB363 54225250 262144 e3bae2b61a03e9b07ab958bd6510a60d8b77eb95 halomaps:3908 +area_b.map BE24059B 27030725 262144 07b72a9076aefaa68bf4e659fe43d4e3e9fca7c2 halomaps:6776 +area_maze.map D1F87A61 44251650 262144 c2c7d0813d1968aa6fdc60909d468c2bc157fce7 halomaps:2206 +Arena-Brawl.map D0B22EFB 58223778 262144 ad8437aae3f3e3e11c6c1a64155d2ccb47d4f465 halomaps:4188 +arena.map 097C7B9B 23601444 262144 cae68e5ca1113288f7fefb491ff902639e308a1c halomaps:1304 +arena_small.map FCF04E82 12325304 262144 6fd86b4dd03612546cdd4ec6e7860c0198f50a14 halomaps:2151 +arial-combat.map 8C341161 119429715 262144 f15d8a512328db5ad51733adecf2510efd659821 halomaps:5768 +aribgulch.map 89C1193E 13924304 262144 1ca0ec686c04d6a3cc5369ddbe1ac8eece6cdb36 halomaps:4284 +arid_crusade.map 0536021B 130355031 262144 e273490419a1f8b8a7a6a73d24cfe8f9537e3f16 halomaps:6365 +arida_map.map D217F0A4 86277997 262144 aabb4adface2f4b223d5cdf827a15076d5514818 halomaps:3559 +Armageddon.map BBF92E72 34211920 262144 638560e2a10ae9ae7c9258fe62c331d39c95bbf6 halomaps:4006 +armas.map 2CA79EF5 101182584 262144 89928f7fb3b928cf16d1000d11e9868517b74508 halomaps:6014 +armaspinki.map 46A7CE8C 19140657 262144 44c4f7265a6070e940295fccd470d116027ed3f6 halomaps:6749 +armor_lock.map 6619E4A1 112281018 262144 55332b1f90c749cee2fa6e95a9702d6552235455 halomaps:5888 +armor_lock_mp.map 36742169 17046056 262144 64bb6b9e578e56f92627568c5540116b8e3ea54e halomaps:5887 +array.map EC6E94C5 14092528 262144 acc11057bbf243540cbcac814e71538184bd9d52 halomaps:4089 +arrival.map F4BFAF51 40360828 262144 8dc33d968060cc19a56e74f19d9bb64de8870e38 halonet:arrival.zip +arrival_fixed.map A8EE4268 40348768 262144 94bfdcb30ca7c1d55cbe7139a1e437e7ee80d88b halonet:arrival_fixed.zip +arrow.map 357A8AD6 16721604 262144 a4e39cbb21dc9b161f9134b71d95ddf444222a56 halomaps:2329 +artificial_safari.map FBA2D54F 34341051 262144 46cbbc1417f2aed36022dbec4a4659fdba736d89 halomaps:4052 +artillery_zone.map E762ABCC 34851382 262144 0b3d3a3d530b6580498f4dd012137a57825184a9 halomaps:3391 +ascend.map 27AC7998 20983268 262144 dc5a890a882fe035b565bd2a592f3aa3eea2d039 halonet:ascend.zip +ascenion.map 5E1ED181 17490869 262144 3fa34d80005f612dcc25adcc5c3a96a8f0ce3ae1 halomaps:1314 +Ascension-BK.map 00000000 180133224 262144 3552ecac78527b0fa2e873fa7204b1136aa857f3 halonet:Ascension-BK.zip +ascension-hce.map 6A1220B6 33296995 262144 a98cf5da6c2c3a0c7949f3dbfd7eac0ef8a84102 halomaps:3368 +Ascension.map FA0D6A25 17423473 262144 94c951b41b94714fac5816c0f62db09acea895ae halomaps:1280 +ascension_classic.map 65D3F32D 26010424 262144 d80f549ede3f0a9408c66bd28e592e15b9bce594 halomaps:4851 +ascension_firefight_beta.map 91A825A6 78427525 262144 0ac8679f6f9092975092de36083f59effe495e96 halomaps:4796 +Ascension_Revamped.map E9878FF9 113078620 262144 e4303824e5d62f42d2cda1883caca8bd951c7456 halonet:Ascension_Revamped.zip +ascetic.map FAFC15F2 154551320 262144 61f5b026b6181277518aa7c6c207a8463081bc67 halonet:ascetic.zip +Asencion jakex.map B6334E7E 196941634 262144 c2395440afe747917872258964c6493a0f8be945 halomaps:7112 +asencion_8.map 8B839F9F 272053839 262144 70ab0309f9cecb38c471f890973c2132f38edfc0 halonet:asencion_8.zip +asencion_forge_world!!.map 1880EEC9 264720868 262144 aeb030f1f8a2b05ad47baca6b165905f0597a8b3 halonet:asencion_forge_world!!.zip +asencion_world_20.map D3A0A729 304474076 262144 5f6dabae1e1c064ea9e506edad8ec003898fbeb0 halonet:asencion_world_20.zip +asgard.map ECF24657 70728629 262144 6adc5bf3893e6a5b6cf46b73379da4ba554872e3 halomaps:3235 +asis.map ADFA229A 36782358 262144 489e880a74c9055d7a60eaf0c7fc2e813dce881a halomaps:3286 +asismod.map B2DC0260 52062017 262144 e621db35ebae7e702ef477343cb72a94794c2393 halomaps:2675 +ASP_Delta_Ruins.map 3A9DF031 71290520 262144 7e48f88d286af8098273a43f596c2f2429f3f83f halomaps:4706 +asrai.map 8FC1B0C6 21597004 262144 64ca5044e1c28a4b4ff50167b6e1853a5a3ab1da halomaps:3379 +Assasination_Covenant.map 73C5E21A 62831886 262144 e6d179bcafcc514bb57a1bec4517131f5deda5d3 halomaps:5085 +assault_control.map 1EE679D9 107398309 262144 a0b1e8e420079e92d3918a5de61e0ca1f305d192 halonet:assault_control.zip +Assault_on_Damnation.map 1F59A4C5 67807187 262144 60d12a1534f18db10f4bf463c3c2376e117a84a2 halomaps:3043 +Assault_on_Gephy.map D4DB17CD 34868308 262144 4d41249f75192c8baba21e86c0b57a58fe092893 halomaps:2848 +Assault_on_Hangemhigh.map 2E63C2B0 24675819 262144 82abe96c29bacbe0176c6cfa566befdc1ae7c15f halomaps:3215 +Assault_on_Longest.map 1CAB6F0C 50810358 262144 a8cd633a9f7605ca7fc8d1cd1ce3207c5edeeaed halomaps:3174 +assault_on_prisoner.map A48A8859 58152145 262144 3e03b922fd6ae530c2236caa2a907cd9ba5d6a4b halomaps:3249 +assault_on_the_aa_gun.map 798D94B2 328386516 262144 08ae4194eaad5cd64b1ae8a5697d447165384caf halomaps:6996 +Assault_On_The_Covenant.map E663A554 82068119 262144 ddb790b5f2ab8c5e04a43c1a1ec56eaa42dda041 halomaps:4852 +assault_on_wizard.map D63512B0 61579854 262144 ed66b1c0cdaa249e1bba320307f7525599d0a3ae halomaps:3191 +assault_the_aa_gunv2.map 0DA00030 381326673 262144 7da741f77d36eb0c376dacfccd203c50379ae1b9 halomaps:7043 +assault_valley.map AC34EC17 20334552 262144 d81deadfbc24abbaa02a5e8bc397e68f797cd9a8 halomaps:413 +Assaut-room_mp.map F1C12D3C 54783460 262144 ebc3e4695cfec610a711b7fa92a75c9602c3afa5 halomaps:5459 +asterisk.map 23E10122 24989491 262144 631207609b0ef84b904afcd0381fccf57e025f0c halomaps:3784 +asteroid.map B5FADF37 14997368 262144 2b7610d4469af3b5b9cbe09e7f4097f2bef6eaf3 halomaps:379 +astronomical.map 7CF95F78 38376283 262144 0956c7cec34ef9f2a1066b85ef70247996efcbdd halomaps:2317 +asylum.map ED5C062F 268805154 262144 9727891d50bce479b54a460775d576faf526e62e halomaps:6708 +asylum_v2.map ED5C062F 268880455 262144 7769581ebfb254d4ae01131a3bfa785735c5ed51 halomaps:7029 +asylum_v3.map 2B5E9281 396116835 524288 3acc04e5c6671f68a143c560f26c42feecee1742 halonet:asylum_v3.zip +atack_in_uncs_base.map A9207745 116207142 262144 0dcf2ef64df64ef26b2f7a454d702590d10efb89 halomaps:5539 +atack_in_uncs_base_noai.map BD4D7385 48192004 262144 318aeedd950dc1b3213d022753b0fa5550910aca halonet:atack_in_uncs_base_noai.zip +atalanta.map F972444B 17971240 262144 879ac773218767da459552086658776927892233 halomaps:203 +AtaleOfSwordsbeta.map E15389EA 15346777 262144 4c61e2b29ef39ffe2b22b2610307662a578ff10a halomaps:2034 +atephobia.map 34D594D1 21621856 262144 65b55a550f623efe0da4a0b51ccf46dae7b0192c halomaps:978 +atephobia__V2.map AEFD482E 22668164 262144 b249fe0366412376ecf3a51a2a4e72205be56234 halomaps:2555 +atephobic.map C582984A 27583121 262144 ef84991b2b3fd924d01681b5fe8fcad18725be59 halomaps:4853 +atest2.map 9AE70F6D 131350692 262144 58161f625715dc48198fcbc8f97ad6fe6f5001f6 halonet:atest2.zip +atestb.map 0FE825DD 73880354 262144 846ac271e2ecdcc81f25ac1120f453f89f4750ea halomaps:6088 +atomic.map 683399B0 23344947 262144 8ef30cb6219dfee78714ee9885a2f6bbfab92c7d halomaps:4911 +Atraves_de_las_bestias.map 6C70ADFB 25061289 262144 723ebc5d42639f9bf52dee3c7579e57076c62115 halonet:Atraves_de_las_bestias.zip +atrium.map B198D647 13193464 262144 88f56cfbba93ee8bba16ad9edf94a0ea46d68d45 halomaps:2420 +attack.map FE14A2E8 132827583 262144 3f44a8a85448c30d060dd5d0379f2d1122ad62fa halomaps:3745 +attack_of_the_rockmonsters.map A7CC9256 26276947 262144 dba84b68ff9946f8e4f9c37fb2496a6515c34768 halomaps:4524 +Attack_on_Covenant_Base.map 1BC65B88 147332187 262144 ec72441ec57a912391608ff3929545aacf8584f3 halomaps:3999 +attack_on_covenant_base2.map 7BC50474 98962917 262144 f39351bb0bed2fddf478a223eeb11fe9b2076d9b halomaps:4000 +Attack_on_Danger_Canyon.map EB046226 92945927 262144 121953b724f859832d33da2ce96aa18aafab85c3 halomaps:5623 +attack_on_halo.map 67D4BA94 33098118 262144 b27a2ff7b63411c34520353b6991155c03e55886 halomaps:4189 +attack_on_reviewers.map 367B7D2F 86252351 262144 f3371c7d38f184d0094e6d1894b2630943398dbe halomaps:6780 +atv_offroad_fury-track.map 74A316BC 58089398 262144 ab77ecfb073cb8c30f30945c178c9a79d485487c halomaps:1922 +atvstadium.map 583A6ACC 18533583 262144 947db3ee3b32804eede03fc944429afb42e48111 halomaps:3709 +augerer_ai_war.map EDDECA5B 65527461 262144 bb13fb4472b52a0f7b510e7e6f580b82e15db465 halomaps:3625 +augery.map 56014495 75925758 262144 a9d661859a35c6d7c8d677d48a57cd354fef6f28 halomaps:2384 +augurer.map 894926E2 18248264 262144 54f41673c5e1be4716a5485d28bc1c9d184f77d1 halomaps:3575 +augurer_v2.map 23B73842 16185824 262144 4e2ee37f48842580cdc56bce06026d0200813b0c halonet:augurer_v2.zip +augury.map C19444D8 18539453 262144 bf5e9e1d6c0bd2e3c557a1cbcd26b8783c0b6533 halomaps:1052 +autumn down beta.map 4CA0FD58 130919205 262144 d0074630832602174f8e4b1337f929ea90728288 halonet:autumn down beta.zip +Autumn Down.map 523CB699 133527197 262144 574f389db2bf7f4f0a5adfc081cc2dc3410d6226 halomaps:6819 +autumn.map C20016C1 132881975 262144 7fc88354a87918b3795762e5b1c6538aa059fe57 halomaps:5730 +autumn_ship_defense.map 3D04DE8A 92414369 262144 1ac1df92d20b2e0f170551cb6839143d2ab33eb8 halonet:autumn_ship_defense.zip +autumn_slay.map B2F4CDBF 37430248 262144 758920d628a45e89b1d7c230f0ea7c5571f3bd78 halomaps:380 +autumn_slay_reborn.map 036FD073 37168424 262144 06900031c0be1ea5d11bf815447090b50c40b1d4 halomaps:4462 +avalanche.map 7BC6C70D 60955148 262144 06c60b6ac689aaa9f26349b1f41ad836da26b054 halomaps:3909 +avalanche_interstate_BETA1.map 9F9E1B91 21689896 262144 e15bee6318a1947e495364c93159eb30830bb2cb halomaps:1461 +Awakening.map D5109225 307545087 262144 b27daeff0760a329094f47c3f3d5d07e6c2f9e16 halonet:Awakening.zip +Awakening_beta.map A43A13F2 31528388 262144 81fd17158c8d7e003144bf5a8ec6f2e65a251eb1 halomaps:533 +AWM_flood_attacks.map CBDDFDFC 64194818 262144 47ca4fb1d832b0891df1fd8bd0a835174032230a halomaps:4895 +azera.map EFDD37A8 126110712 262144 ce46ed326cea88d0204a5778576da06301338931 halomaps:6309 +azerty.map 88D8C014 48833999 262144 4fd0e566811c4db97d246d945f778b52a67682c0 halomaps:6513 +B-30-Cartographer.map B7EEEE7B 81498196 262144 a127d639d1959d59ebd1ca78439cc7cf22b33eef halonet:B-30-Cartographer.zip +B._Creek_duke_N_edition.map F6A7A866 113390471 262144 f9bcdef9d6fb2cdcd5a26f1cc61cc99f340221ce halomaps:3626 +b101.map BEB545A5 14166936 262144 f75f34fc316d370274013df197847fc831ada58d halomaps:4317 +b2b..map 08CBB625 33309807 262144 efb9e6db5d391ef7c496e2c34d42f6820e32cfd6 halomaps:2207 +B30-Cartographer.map 819FC0F3 81239804 262144 edc46542e45fcc00a0d281640f336a8fa60ec51e halonet:B30-Cartographer.zip +B30-Cartographer_v3.map 15E31FA1 64368134 262144 dabec006e0ea10d3371cda06d4898dc7487cc86f halonet:B30-Cartographer_v3.zip +b30.map A9106460 124261149 262144 4e9cae1c78342abc6c25aed5283a12d082b37b4d halomaps:6658 +b30_cartographer_multi.map B1F80CE5 80275672 262144 2987e5ca5572ad8491d23fcc2c6f3d0b7c286c38 halonet:b30_cartographer_multi.zip +b30_deathisland.map AF840E53 355551570 262144 c3e7b245347b3ae942d20d1c59e50f9a0f63abf5 halonet:b30_deathisland.zip +b30_elefant.map 8DE72254 160731746 262144 f9b02c129b65b4556c9516e54c1cde853a9e04ec halonet:b30_elefant.zip +B30_Halo3.map A4CCF750 241885217 262144 05a9596806fac6bf1ccc092cf21ea28a55e142fd halomaps:5325 +b30_mpz.map 9A8CBE2F 134439372 262144 5625cca869c555dc43ccf054f1a71974d251030a halomaps:5111 +b30_time_splitter_2.map F5A8208F 111984660 262144 9483f175ac94c81009ccfd209a678be8ec9fa023 halomaps:5599 +b30_Warfare.map 8D0A4C8B 78271366 262144 69297c6bc5a20c4762bfcc611f7d594c54da5fba halomaps:4732 +b30b_ai.map E4CB5B8E 98686250 262144 8403aaae12a3cd9209de4f4888f5bd1e889efc8d halomaps:6820 +b30coop.map F82F2D71 121559186 262144 9ca9323561bbf49b9bf5fc5040e7ccdf1b237fee halomaps:2598 +b30multi.map B10BD58B 107082657 262144 f7e87f3048e887304b7837baed89b7c230422d56 halomaps:5263 +b40-arena-v2.map 273337BD 101285568 262144 d4613b4d4998df7da6b69e720747dccc9bdd32a9 halomaps:5460 +b40-arena.map 28FE0A6B 78257381 262144 1be0ffeec61c5de4254db3ad019af9274dab4179 halomaps:4835 +b40.map 254FC9E2 190209235 262144 0a4d982cfcfddd738a772b342bd82432b3214e49 halomaps:6659 +b40_firefight.map 809B83DA 220265933 262144 d696a91cd85b9740a204feaf1df6698d82150be9 halomaps:5169 +b40_modified_v4.map FEE57A92 198042914 262144 65b230a8f06992f2a24629028fa64058b382e1d1 halomaps:3842 +back_cycle_ai.map 44C5BBE1 72543723 262144 57260260413534db1061e0443df6aae7a4c29238 halomaps:2035 +back_cycle_v3.map AB2597DB 27610996 262144 06200135ee8c53266fdb316fb319027914b5e744 halomaps:2036 +back_cycleV2.map C93289F5 18851105 262144 e49a452b1ebec1486ce06a5436285be6d0c5efe7 halomaps:1946 +backlash.map 2BF90D5B 16368020 262144 db3b8a35c4d0089aad7f26de1aa6294ca4214061 halomaps:324 +backpack_gulch.map C36F9C89 28087592 262144 456d43444be4d7c033da2ee47afea3e4c983d84f halomaps:2524 +backstab.map A53EA630 36884692 262144 d1b5a0aafb5219b0310ac8c8fe91644d81be7e9d halomaps:2862 +backstabv2.map 998F227B 36884692 262144 1e4edf228c5151b21d84754cd187f884223b2d97 halomaps:2898 +backwash.map AC740721 21200628 262144 a4def966e00a8ff8342fedb4f28636507d663344 halonet:backwash.zip +bacon.map 72AFAB71 17032414 262144 c6ce45e186a8b9939e09f401f5a5d630a3771229 halomaps:1017 +Bacons_race_track_v2.map 73404B41 26278360 262144 85c9689b94ae21087566993a9d18e908213775ed halomaps:1574 +bacons_race_track_v3.map A46C6DE2 23275540 262144 82d76904b85089e8dd45b9547a828dfd9ff82917 halomaps:2167 +baconsracetrack.map CB4CC18D 16885772 262144 1be55fe4b6cf5b9b1ca5a5dd9a63bd09983bfd3c halomaps:1150 +Badass-Bigass.map 986D849A 275199590 262144 1a67e6a4fd2b65344366bba85c423aa2b15e8a93 halonet:Badass-Bigass.zip +Badass-Bigass_ce.map 0327FAFA 278092982 262144 800ae24ac89c6cce9a2a4a821520b84dd42f74e5 halonet:Badass-Bigass_ce.zip +baddreams.map 6DC40C27 28090645 262144 fb6effb2813750a347f4314c29d18c99546a7133 halomaps:4090 +baddreams_pt2.map B5F29405 52344271 262144 4147ace15dae0502db826cc20859febad3e4513d halomaps:4112 +badlander_beta.map 98F22CC4 42621149 262144 b8fcfbbc5a844f4d70d4e442cce2d0d00535b11c halomaps:2074 +Badlands.map B9822E46 133021046 262144 4708fadfda10b4567a5bd56eb96a4c025bfc676f halonet:Badlands.zip +badlands3.map D43FD056 14127688 262144 1482d40d80fffdc8f54cf66885ef3ea3814b7b41 halomaps:200 +ball55.map FD958082 27029856 262144 2d6265ad121a0e61fa4fa210e9476e2b81a03baf halomaps:2915 +Ballyhoo.map 351E6D29 14113076 262144 e5b572ad3942e6169add02a56ec5ecebd1afb9bc halonet:Ballyhoo.zip +bang'em'high.map A4225445 35198144 262144 7f0265488f4fd76edd889eb2853390624f158fbe halomaps:1054 +banshee.map 1BA6236F 113399499 262144 b350f641645c79f6ce9193bc21aa3ec99fc107d6 halonet:banshee.zip +banshee_assault.map CB56E383 22194826 262144 af70c11c3da81c92589e9c818e0c1b46de76c8cd halomaps:3677 +banshee_assault_v2.map 417BAFC1 75443091 262144 963dda42f86c443ea5c0af073e821d05ffe6b450 halomaps:3693 +banshee_fight.map FAD9E761 13566868 262144 c79c3f14da920d21b0597285edd0264f3eb5a17a halomaps:5604 +banshee_lands.map 6B0345FD 12508496 262144 34e888cc33cc818546df076c4a1369d43a0041b9 halomaps:290 +banshee_map.map 28EC892C 37924493 262144 84d4d01d42a862e6124d24032d1598cf92d367ee halonet:banshee_map.zip +banshee_wars.map 76DEE919 83982350 262144 f0e831b0f8cf968e8590f87934c75d7056e7e1d7 halomaps:6366 +bansheemadness.map 48F5906C 12778260 262144 9d08efd1c28dbbebb9daa1cca18ad16b517bf24e halomaps:291 +barrel.map B5245B01 87431999 262144 536dcccdfcfe92d1cb84250ed092ee7de932b075 halomaps:6192 +base2base.map 3A4E2F32 37371008 262144 ef976c6857a76c6baab29ff44ac52244784cd4da halomaps:2947 +base_havoc_beta.map AD697F79 38637978 262144 b1e23b00df7da761adb15329d896b8067326e374 halomaps:5101 +base_to_base_beta.map 83E13B99 18481039 262144 2029898b81680d879e10074a292fd1183c363301 halomaps:3250 +bases.map 89020731 22946016 262144 610ece070d28f6e2984928a821cf44cdbb37d250 halomaps:3545 +basic.map FE3595FA 50009032 262144 449945f2ff88cb4f229cd03cb7a4f9af538d26af halomaps:2362 +basic_beta.map 94261EB7 16341298 262144 e85e793edca335461f7a27d3ebd7e81d88fc442c halomaps:5848 +basin.map E5572CA1 22776500 262144 5cb70ad847fdc222229e6e83c9df3ddd0e590740 halomaps:3036 +Basis.map 1406E97B 20473913 262144 ad23e32b9b52119f6bc32b630ed7eef086704a63 halomaps:1472 +Batalla-Spartan.map 95E4CBFF 369659775 262144 27d85b96ced6e1911291b5245309df0c77bbfeca halonet:Batalla-Spartan.zip +batalla_vhmt.map 7CCEF439 22904434 262144 ea38768f3841e56deb7967fde2f31d2ef3de450e halomaps:4007 +batman.map 7DE030D4 30740728 262144 b76c2c550695e0ac657e721ddd0b87d9d5f17a4d halomaps:1862 +batman2.map DF84DBDE 46308624 262144 7d76c0ce2e3f2d23a7fa6895cd34fdf3f9b77f0b halomaps:1863 +battle.map 6A01FD75 29883812 262144 7511b427d644464614b2380f5991d9cc3077b352 halomaps:2628 +battle4blood.map DAB2F785 88258913 262144 575fc876c306418a5c1677c8d67d8b28fb45e4e1 halomaps:6916 +Battle_Action.map 1C49DC1D 45663045 262144 a17528919f73553b7a1312fa2c6cbc43b10fc908 halomaps:4438 +Battle_Arena.map E65296CF 328181588 262144 df34ca6fdee9c36ba909319375234b1709964875 halonet:Battle_Arena.zip +Battle_Canyon.map CA4815D0 289045121 262144 037cd2bfc08b4bae20067b8052b815384fd40780 halomaps:6954 +battle_coast.map 41E8E41B 55895382 262144 2719dddc25cd08bc1285bfc9f86706f97e25441e halomaps:3726 +Battle_Creek_Unseen.map BCB4E320 117483582 262144 9e1a6b6e9fa99a3e28c398cd2b4241a48134f3b2 halonet:Battle_Creek_Unseen.zip +Battle_Cruiser.map 237C0ACC 130873320 262144 23b914cc70b8298ab66644cf1315921e253c3ce5 halomaps:4916 +Battle_For_Victory.map C1548F94 54622650 262144 ea635c032c3c8bfe17a899399376c9bc75f4fd7d halomaps:5010 +battle_forest.map D2836625 15247244 262144 2348fcc0b8fb5ffa6a83e84dadc61131cb54a298 halomaps:292 +Battle_In_Winder.map 53F984EC 42864132 262144 061686a083a6fe71de77535c2749b6ff69719cf6 halomaps:4426 +battle_night.map D85A66CD 59256436 262144 4f4288684e1d5729cb36246b28ef613fde1e8252 halonet:battle_night.zip +battle_of_gettysburg.map A11CBD6B 54081510 262144 a356aa3704ea0e8e3fe4af9ac45922c1d60a5ba5 halomaps:4649 +Battle_Of_Infinity_V1.0.map FEE02802 85577036 262144 2b0a589388e94a6761b2c411db6e11afd5e860d3 halomaps:7091 +battle_ravine.map AE55F2DB 13181100 262144 67ae6b9438c03d576ef910db8ea6867137ecf63b halomaps:2825 +battle_team.map 2F7F4563 49624410 262144 2077599041e3a658a20df4b4d4791bb9dc47150d halomaps:4928 +battlearena.map 45C2C48E 16630569 262144 4fba7c868544b1ce87fde420109718acdc58006f halomaps:1462 +battlecanyon_beta.map A82CC3DE 44977499 262144 dc38fcfeca5ac5b0d9be24cf9f1c2229a9674bbb halomaps:2724 +BattleCanyon_Final.map 2B3D040E 67625584 262144 0188a6c3ffdd1e0ed94f5147b20a1797178904ab halomaps:2676 +BattleCanyonV1.0.map 04FCEF24 87934830 262144 77a6ff3494a139569235bff3686e2f7112ba7bc9 halomaps:7090 +battlecity_lvl1.map 544FAAA5 9384192 262144 31e6d3d1f389cb302debf872dce982399d2f2fd8 halonet:battlecity_lvl1.zip +battlecity_lvl22.map 7282D825 9403743 262144 f4988d0972f1643bb603de0f7f489c05e018c4d2 halonet:battlecity_lvl22.zip +battlecity_lvl9.map 0A207E98 9405160 262144 bac1da771871045f334a855f00114924c7511139 halonet:battlecity_lvl9.zip +BattleCraft.map 08A5A846 85869645 262144 0f7ff9c8e187c8d4468c91549eebd827f83305fb halomaps:6777 +battlecraft[hac2-re-release].map 08A5A846 85869645 262144 9f24931360b07f66885b4854e56d35d4ceb1e67e halonet:battlecraft[hac2-re-release].zip +battlecraft_hd.map 9B405B6D 242933365 262144 2c41dcbf3346c9af7d639dc8cd00a1ef67698f31 halonet:battlecraft_hd.zip +battlecreek,v2.map 26D43B1C 241048876 262144 c753ff300136fd1c4760f8b8b806ed09efd9e302 halonet:battlecreek,v2.zip +battlecreek_ai.map 73F6E86D 288180761 262144 e7d128574a7fce3ff8b34febab67d9db0ba2aefc halonet:battlecreek_ai.zip +battlecreek_anniversary.map 2FBB40E0 274202757 262144 3dda2728c990eef633ddf989f40f73a64d5be8ec halomaps:7124 +battlecreek_v2.map 31FDD3F9 60078790 262144 dab0c51b68184377a5a5e2d73c1a8322d9576779 halomaps:4506 +battlecreek_v3.map 2C27FEDB 77576646 262144 055351f86dc7992a5922a51f3257a1f192d452c4 halomaps:5086 +battlefield.map F594A0E9 13955160 262144 f42f323dcf420e94a4f6972eb94dd83140dc35e9 halomaps:2899 +Battlefield_Final.map 53F07754 73286189 262144 9b2ea71d63550d9c3f1cd4bc1a5edb55434ea503 halomaps:4927 +battlefieldhalov2.map E367B764 99623258 262144 77837cbe801a86072f9203446b860188e9e68d0d halomaps:5461 +battleforbloodgulch.map 7BE5AC75 107558710 262144 fd8f1d4d26e87e7dbca435ea97a196fb84d49820 halomaps:4854 +battlefront.map 39A19C55 13763844 262144 1dc3fe360cf034623502ad708afa15bdb4b1c7c3 halomaps:2863 +battleground.map 11438FC4 12796412 262144 3b4084bfd72a70c81ef9c35eebf55033f48f2e6d halomaps:3059 +BattleGulch.map B7F7036B 26606338 262144 28140d2e800ceea59c46e67b350cf5757238ff21 halomaps:2534 +battlegulch_ai.map 82D15558 64291478 262144 afb496815dda887b8d924f1777de9a9c2ffde82d halonet:battlegulch_ai.zip +BattleGulch_V2.map BE65AF1E 29960073 262144 92f465f1570a393c860416cee5d00c3b9c19b574 halomaps:2576 +BattleGulch_V2_CHAOS.map A2F3EA45 29960077 262144 abf87c7336a28145aee1a617281de2159d4254cb halomaps:2577 +battlegulchV2.map CF15936D 29067661 262144 69031b38873e1b2baca92d1f1bbaf03f445349f8 halomaps:4797 +battlegulchV4.map E6DA9C79 35507175 262144 cf54762bac3a0081880d183d5f3b32ab05c1b70b halomaps:4836 +BattleGultch.map E3A230FB 65959345 262144 2a3deb27de27e0223a94bf02dc8ec1fbfa1d1bc0 halomaps:2629 +battleing_arena.map 60E0DE8D 16919897 262144 cedf05546b244ff90e47ffd4511a22ba60e3cc89 halomaps:964 +battleisland.map 5FB67858 13879780 262144 3527211c8a709c8fbbc4c50fe994304be1801400 halomaps:1178 +battleland.map FA185037 40935202 262144 5cd7b8fe66c39852346ffc080033806f7df673af halomaps:5998 +battleofbunkerhill.map 209C5B74 28371712 262144 19e058a247261bf3e21b50fbbf71de8078d75372 halomaps:2190 +battleon.map 304EEE6C 13992592 262144 e59b91801b51db17277ca93b9586fc7a6aaf5652 halomaps:2948 +battlepyramid.map B12C0AE1 14521608 262144 e716f26632b3c15ba9be62b234e7ec34a06ea2cd halomaps:4707 +battlesidegulch.map 1EDA56AC 22617759 262144 85e9bdb0f3111a3b376d25051519d5dcfd69ed6a halonet:battlesidegulch.zip +battlesidegulch2.map BEE8C3FB 22617759 262144 7ba322ad6fddfc29aff81f7e73fe7e875e8a9cd6 halonet:battlesidegulch2.zip +battlesidegulch_ai.map D3A356A6 86836576 262144 a1afb65749ce4cbe288579bca8c7632fb5ee8b5f halonet:battlesidegulch_ai.zip +battlesidegulch_sp.map 51489633 107093245 262144 23c70f2ce6c2a9f5d1d688210ebf54dbaaf9019f halonet:battlesidegulch_sp.zip +BattleWinder.map 23D1FC83 34560563 262144 94a2fb0bb2a3673f3c128d77647ae6f77a3ddafe halomaps:2824 +battlezone.map 83BCF160 24951765 262144 c45143db22ddc95d08d9682c8bc375adb4a8c8c0 halomaps:1139 +battlezone_v1.map 6BC2C80E 24955861 262144 a58854261ff45860d11ae91484a134cd74806329 halomaps:1140 +BattleZoneAI.map 92F98B41 19288644 262144 b3d2f5ce3b9013dcd8977c59bcae9bee952b8dcf halomaps:828 +battlezonev1.map 5540B9D5 17199188 262144 968431ff8827e07362bee971bce3fe899032b740 halomaps:829 +BAZ_Canyon.map E41BA3C5 21168831 262144 efa6ee4f8ce2006a8d20a85979961c2c559cb946 halonet:BAZ_Canyon.zip +bbb.map 55F479E7 72643025 262144 718ec09d759e14efc9d9b0b75bc95e4bcfb99674 halonet:bbb.zip +bc_carousel_mp.map 04D053B4 30090084 262144 b279249e5bd800e881d8cd437e5b1e9182e891d8 halomaps:5215 +bc_clearing_ground_mp.map 0AF94747 115851468 262144 f5049553b1dbf9a1e17e7f14fa5ed3fd9280fdcd halomaps:7092 +bc_distribution2_mp.map 60CFE48E 32506912 262144 94e9fc5b3ab6802f58ce9bb46a4cff3b5807ba3d halomaps:4489 +bc_distribution_mp.map AF0B2488 30132540 262144 e9a154cdc3eeaaf1c1babf6b1c4985534dc6dc5f halomaps:4082 +bc_matzors_temple_mp.map F7639E21 28213212 262144 a4b0a02bd6ed345e9faafd07b583569c0c0b7f1f halomaps:5957 +bc_raceway_ce3.map BE1EDA19 40256641 262144 63aec70face0800f373c8848daf55896f1a5d5fa halonet:bc_raceway_ce3.zip +bc_raceway_final_bfm_mp.map B1FAD533 42428750 262144 bf703a33e34d40278ae5f91c1bba00265502d9be halonet:bc_raceway_final_bfm_mp.zip +bc_raceway_final_mp.map 40E6E51B 40575522 262144 61cdde5715b7c0a3555ab6dc6a60cbea29795d97 halomaps:4665 +bc_raceway_mp.map F9DB03EC 28656473 262144 23337869a9ff2519a802dceb3f55196a15a85ea1 halomaps:4593 +bc_raceway_snowV.map 785E1D69 43636302 262144 77cd688c93d6f267ccedf6bd55dcb6c39a36cb9b halomaps:4998 +bc_rpgv0.4.map 6FE95499 129388215 262144 66d02d52d5ac36b74716fcd978c21e958ba6eb3e halomaps:6060 +bc_rpgv0.5beta.map 7FFE9A9C 134016864 262144 6dcbad173fe201ea712368bc8a985153859ba2a4 halomaps:6108 +bc_rpgv0.6beta.map 5955DD68 133839587 262144 a8dee45b28f7eae6af02ff49fb7dad0fc5f2ad4f halomaps:6138 +bc_rpgv0.7beta.map A529B007 147228550 262144 803073dce4add3227d45e6c3d91b91dab53f0040 halomaps:6472 +bc_spooky_hollow_mp.map 48065AEE 73979262 262144 963eb9515cef6ec2b047dac98cc1d6feb9f35771 halomaps:6245 +beach.map 7882244F 19937949 262144 9dd621f5417942821d79c56a763e02cd62c77784 halomaps:973 +Beach_Assault.map 37255DBB 15978580 262144 e086a9e82fa6ca2d2d6b9d72f6c6ecf3f00ffd79 halomaps:293 halomaps:382 +beach_assault_ai.map FB164605 85810757 262144 4fdf760c86bca2de69e435a4c3f0c4cff0390db5 halomaps:5295 +beach_relax.map CD59B6E0 35450509 262144 7592b13d1860a2d3c8ab55e670d31cabd6fe481d halomaps:3843 +Beach_Resort.map 1E7A410F 165074526 262144 7ff2d1b17177ddf5d3c7d0598cfc1e17659095a3 halonet:Beach_Resort.zip +beachasultmod.map 37255DBB 15978580 262144 4b96be5c0b26396114a2063ece1761a0545d1e80 halomaps:1315 +beachrun.map 209FD0E2 32953603 262144 6231824e859ee8692da35c1e0fb2cd1a7d702a84 halomaps:1583 +Bear's_Turf_final.map F01CEF3F 59353353 262144 ab931080b2348626628f0ca0004b712cd3e75e60 halomaps:4565 +Beaver Creek V2.map AE806987 36316462 262144 80b4464897d244e3356da1713cbe5f271c50acf4 halomaps:1749 +Beaver Creek.map 0246CB75 36223658 262144 932ad63f680603fbdd57cb2d72a5e05818a59a14 halomaps:1742 +beaverai.map E229DD94 28879837 262144 81b4157c6b9e016c3509ec7dc3483da08a510198 halomaps:4896 +beavercreek.map 07B3876A 13097000 262144 7de27aa9bb3b3018d92a0c5b1457020ca1f6d818 halomaps:4772 +beavercreek2507.map 5C240ADD 124942728 262144 b7dfd806bc8e24bc0b269cef3395ae046c415489 halomaps:6423 +beavercreek_beta.map B108C3F6 486438016 524288 de23148a18e6cc15531efb32f1d8b732999d2f52 halonet:beavercreek_beta.zip +beavercreek_rev_beta.map 3BEA0E1B 506480532 524288 dd6d9b2649b56c7afa995c5afee1d32b8b810521 halonet:beavercreek_rev_beta.zip +beavercreek_rm.map 07B3876A 337478100 262144 91371a5d70ce0aaec02948d610a51fdc6b7d199a halonet:beavercreek_rm.zip +beavercreek_swords.map C9D16102 18911901 262144 a9bda40ca7df49c043d6dfb37532ae6ada9f2b7b halomaps:2330 +beavercreek_tmcc.map 6FB5B38F 38661728 262144 e97438555297be97c5616c0efdd604bb7ea0d347 halonet:beavercreek_tmcc.zip +beavercreekmod.map 26D43B1C 71225417 262144 ed4e85f8097f3a73c17a0053047114ccc7061386 halonet:beavercreekmod.zip +beavercreekswords.map 3D49C5B4 14807605 262144 3d3d467a3fb974fb9d0ce23d210ef7852713fce5 halomaps:6955 +beaverreach.map 9CC818F0 130876163 262144 b9d987132c1321f14afe7f4a30b3dd7b5f4c24bb halomaps:6451 +BeaverStream.map 4BE75764 55504549 262144 fb2814b7e1e4b4e7dcfe255b3e06b1f2f8150a63 halomaps:1458 +beginer.map ED5E1B45 15048908 262144 e8e3612ae6a322807a46a8030660f253ba9780ce halomaps:2742 +beginner.map C430F8C6 17031996 262144 80730feb577a8517206cabf7096e94f22a9dcd18 halomaps:2770 +Beguiled-v1.map 00000000 252347706 262144 74a45cd5bfd2c1ec0b42baada90ffbd91ed2761f halonet:Beguiled-v1.zip +below_zero_ai.map 124806A2 74736368 262144 424ae2468344a613f329086874db5b693448e648 halomaps:3311 +Bender_town.map 8736E37B 31461690 262144 8a7edb92f4d5a5b6d3e57b84a56b3e2c3a6a733b halomaps:5143 +Benecia-Colony-pb2.map 00000000 255612942 262144 10b82b80e5a22e9b93099ac984737523129e02ee halonet:Benecia-Colony-pb2.zip +beryl.map 6F6202A6 63503775 262144 38828b54cc6dbefba948d477911f57f174aaecc3 halomaps:1652 +Beryl_Rescue.map FD5ED68A 65699178 262144 807f4fc697ff917eec835249e86f171d261f5c8b halomaps:2535 +Beta_Alpha.map 4C157FAB 279947749 262144 71897041b01df90a9ecba749a1c6589958db5d42 halonet:Beta_Alpha.zip +Beta_Canyon.map F199E15D 297893861 262144 4a2f59acd00561c7a588aa364c19e61dab2a236f halonet:Beta_Canyon.zip +Beta_Caro.map 63D420F3 396465014 524288 bf259e0bfb8189b20d0234412a034f167b0c3b63 halonet:Beta_Caro.zip +Beta_Chillout.map EDF6EA7D 379268947 262144 37d712b8d1a72f894595a70af140927aa23c0bd2 halonet:Beta_Chillout.zip +Beta_Coagulation.map 004FE5FD 284473978 262144 526cd14796bf2f8f58b21dc001a83549a9fd550a halonet:Beta_Coagulation.zip +Beta_Creek.map 24729DC7 338148626 262144 c8b8f56ea3914b194133156e7b49e9693a6dfadc halonet:Beta_Creek.zip +Beta_Damn.map 7C3FA987 214846694 262144 7757855558e3bcd106d43f102abefaff952ca7d6 halonet:Beta_Damn.zip +Beta_Fields.map 31B861FB 269705958 262144 c3f32e1ddd913d0d9bf221efebc50ccb15274d83 halonet:Beta_Fields.zip +Beta_Gulch.map F2B285AC 338919507 262144 2475fba6bfe7910dba4eb0c780f857176c2e8245 halonet:Beta_Gulch.zip +Beta_Hangem.map 7DD102BD 389234847 262144 4277be4a6cb42d48cd172b0438263b03dc32e0ec halonet:Beta_Hangem.zip +Beta_Infinity.map C895A5EE 289438790 262144 d919170fe0e1f7c913c52a029bd639194c70e6ac halonet:Beta_Infinity.zip +Beta_Island.map 0140EF45 295382387 262144 4c6a4be969d6a58b776faa8483fd7669325323e4 halonet:Beta_Island.zip +Beta_Priso.map 5FFB20DE 195674783 262144 c7e87576c1d1950176a07839375005860b52fd37 halonet:Beta_Priso.zip +Beta_Race.map 003B96B2 351911550 262144 524e5183a6ccfd87514fb241feb2fc5ef7540128 halonet:Beta_Race.zip +Beta_Stronghold.map 9EB4896D 240099945 262144 4c10ec61d43d1720821c6c9440ff6e0d581967b1 halonet:Beta_Stronghold.zip +Beta_Winder.map 0D438087 372436276 262144 78c15492a9ddc9fdc143cdcceb815e22663967c7 halonet:Beta_Winder.zip +Beta_Wizard.map D40391EF 357833481 262144 f9825235b281dbe142ecba7547eb9945850c759c halonet:Beta_Wizard.zip +Better_Bigass.map C7455EC7 165078044 262144 be3438cd3ab4f11c327ea6d866d18eb650d4befd halonet:Better_Bigass.zip +betterw.map 98B38CE1 15215236 262144 fdbbdc78f0f8987eb586591715fcbc7bb928f13a halomaps:204 +beyond_infinite_v7.map 02090784 23124044 262144 0c39d0fd3c7bfa5bf1e93c0fd8902ba37165fec0 halomaps:3251 +bfm_final.map C70B8954 16085864 262144 0eb9b34351d65022f31af41b1ae8d3e90f8cb780 halomaps:3546 +bfmdeathrace.map 46F7BF13 18158476 262144 05d21f05aed02db725b299740d7e8674cbf562b4 halomaps:4897 +BG-COVID-19.map 571B9E3D 134120055 262144 4b9f12e0937003f167d5dedec47898f8bd76d0f6 halonet:BG-COVID-19.zip +BG-Sorrow.map 20E4896E 17980809 262144 4a8ff68240ef8ec54a872182e08e46d9f2ce1a2b halomaps:1292 +bg-sorrow_update1.map CE82BB0B 71567081 262144 acb83330a0cf15508fecd1eae84a39d02f5ea990 halomaps:2083 +bg-sorrow_update2.map 557969CA 73040933 262144 232519e795d7e084a58eaa1d0e50491960bb1f3a halomaps:2120 +BG-Sorrow_update3.map 370D4234 71176730 262144 654af813057d1c4d7ad4dc5680f14de02fc004c8 halonet:BG-Sorrow_update3.zip +bg_flood_test1.map B7CFBECE 28573406 262144 727a51ede3b8317aaad1971b97ed2eca77338c71 halonet:bg_flood_test1.zip +bg_flood_test2.map 10322756 28573407 262144 d6ed84bdd0b74ce1a6f9e1573472bec2fa667975 halonet:bg_flood_test2.zip +BG_Turrets.map 5EA3D576 75724011 262144 107a4c0e1f86efa417af22e4c17e98b707d79884 halonet:BG_Turrets.zip +bgcops.map A37DFF89 19186931 262144 34b355dcd9b31759dbd769810a901087066553ce halomaps:5415 +bgi01.map 0515BAF4 24222630 262144 6159cf15c50b8995f37f1dd9cf64695d424a2be2 halomaps:3252 +BGooe.map CD05E1C7 45872503 262144 2e69c88772c3225c39074ec642b6a353c8f9a9af halomaps:3935 +bgpcmod.map A5D532B0 13947152 262144 f0d67c213db32f5a50f53a7e1085df605eedc178 halomaps:2152 +bgw3.map B8918FC5 78324625 262144 0025fc2bb813cd5afd7729114354578186b7eb6e halomaps:4548 +bgw4.map 364A2CC7 66392828 262144 b31098010be509f77b3ee0514457cf8f3eca2608 halomaps:4550 +bgw5.map 120B04DC 78325581 262144 9d30633c5a844dbe71c7c90c674e89a3a43efecd halomaps:4551 +big snowy map.map 63FF2996 107571473 262144 9b7c6754ec478403b031ea82b47578dba3221e8e halomaps:6821 +big.map 4A185A84 17674680 262144 c6b88d79d2dc352c9ed3a70e0007883f5c95eb62 halomaps:834 +big_boys_toys.map DA0EFF1E 29679861 262144 344eec3baa8237541453969796ae95e6b64aa983 halomaps:5999 +big_canyon.map BB360980 14062700 262144 569c714d2f1a62f58163dea24ab1ccb28bb832be halomaps:1769 +big_canyon_2.map 53965F4B 15919632 262144 42f69a82a3b7b77a52353a92c71d50d018166122 halomaps:1864 +big_canyon_3.map 63D592D4 28679082 262144 3ca1b2861aaec10d39858c295b9c165f081b0d35 halomaps:1947 +big_pool.map C6CA3B55 41330137 262144 e41b1f1b6e9e2ac805d423443412179437f55994 halomaps:4008 +Big_Sky_Ranch.map 975AC905 35913147 262144 c0dabecc283cc1c5b4b27ea8ed01adcd864404fb halomaps:2556 +big_thing.map FA4BFCD2 59475048 262144 95b4ea1672eb421f14054b94dc9683bf14370d9f halomaps:3694 +bigass-2021.map 7E276618 131345651 262144 fd9bd7909fa6c324e12af15fd46e64860e589ae9 halonet:bigass-2021.zip +Bigass.map CD5B1E48 188434561 262144 1ab11d1e2279eec481fd8b8da8c8e313d8543026 halomaps:7067 +Bigass.v3.map 54C6BCA9 238208444 262144 f7a8727897ad754376e1d439f5d85b9fbb52a9f5 halonet:Bigass.v3.zip +Bigass_Bigtits.map 4A4560A4 223126764 262144 fd8a442cc8ad841f70d43c71c0d2adf622d35618 halonet:Bigass_Bigtits.zip +Bigass_BUG.map 015869EF 200992219 262144 6d5f71b6513bab4d99d939e88e039d9736816e7c halonet:Bigass_BUG.zip +bigass_deathisland.map AF840E53 344143892 262144 d1b8bad3269f08885881bd929b39f7ba261699e0 halonet:bigass_deathisland.zip +bigass_island_bk.map AF840E53 344143892 262144 bdc272f6839bbae25948d306ec5063162c50bba5 halonet:bigass_island_bk.zip +bigass_mod29.map 9B5811F1 265752553 262144 66431946df9ae6ae87c96c6f713fa3324e50a069 halonet:bigass_mod29.zip +bigass_mod30.map B8BA3B4E 287176068 262144 43a671d700ddffa305a0de7dad7dd8c30daa5afe halonet:bigass_mod30.zip +Bigass_New_Year.map 9E120E56 231837468 262144 8b1fee92dfe3cdc501be898b5c9ff5946fb8b6c7 halonet:Bigass_New_Year.zip +Bigass_No_Mas.map 07210E46 222039308 262144 c6beaac2c489a47eebae01555ef8e94c5abebc40 halonet:Bigass_No_Mas.zip +Bigass_Una_Mas.map 12004626 222949502 262144 c9bd205913c20615c31f2500560d7f06932f5661 halonet:Bigass_Una_Mas.zip +bigassv1,71.map EA2B5297 87597456 262144 8ffd4ecdf03aad9b62d3288e0dc1e9883e1ae250 halonet:bigassv1,71.zip +bigassv1,7_special_ltd_edition.map 49940B30 81756240 262144 fd9ada5f082ad1920efca75087bc36a9bac31b1d halonet:bigassv1,7_special_ltd_edition.zip +bigassV1,81.map 2E52D20D 97542469 262144 3571fb8b4bce75e47e5750f945b10983d8b56dbb halonet:bigassV1,81.zip +bigassv2,069.map E2D16FF0 128138776 262144 34b449a98885db11f26a5905315d030c4d77078d halonet:bigassv2,069.zip +bigassv2,071.map 95C0A5A3 128060684 262144 0b8a1bd9125001c7e83cbf72d0a6ea272ae4474f halonet:bigassv2,071.zip +bigassv2,072.map 1910CED4 121049204 262144 c5dbad3de8b39f5c9fafcbe27aad688d47772bb8 halonet:bigassv2,072.zip +bigassv2,104.map 8082B5A2 141357525 262144 35af8808da3a54821a1373cbc6412bfdad97f032 halomaps:6997 +bigassv2,107snow.map 8077BAE2 202720557 262144 fb99c9a5d0ab66082be32010c76df04d9db93841 halonet:bigassv2,107snow.zip +bigassv2,113.map C0CD5432 171489145 262144 8fcfd4b97ef89339deef07880958170fd7f31b92 halomaps:7068 +bigassv2,pro.map 00000000 191459835 262144 1df9b76c68ec19b22f977f32b0519ad8fadfa086 halonet:bigassv2,pro.zip +bigassvv1111.map DD8CBDF7 232519650 262144 f6e2af26340ea0bc888f69249f1ef3ca348757e2 halonet:bigassvv1111.zip +BigGiantBattle2.map 0DB34CDB 198173913 262144 fdbbcb0efcd93f8c83d392c03f04cac46057abbb halomaps:6322 +BigGiantBattleV2.map A25E416E 180471678 262144 e1b9a39922aa9583bce39ba6a6ee9867cd491eb2 halomaps:6323 +Bighill.map 9223AF87 15796848 262144 0d30583bff3b317d1571c837ea7caa940b0d5eaa halomaps:2748 +bighill2.map 0C8BE247 16383924 262144 153f3e0227fce9366dbc0f038f066039e81c0969 halomaps:2826 +bighill2a.i.map CF72366B 62113480 262144 d4ae807cb451a19398a7afda2c904d482ddb1c99 halomaps:2827 +bighill2v2.map CBCB8186 25683131 262144 99f5fa66b9f4c20ad1089e5546d804c2f657a708 halomaps:2828 +bighillai.map 06A4C154 65950271 262144 7a52fb68779a208d285801e04e0aa16c320977dd halomaps:2771 +bigtits.map 17FE457A 330641487 262144 be2e95d442b7b6cd11045c933205e8cbe349473f halonet:bigtits.zip +bigvalley.map 00E12BD3 94856764 262144 f1adf53921f40fe00af37139ece5e8b668bfc6c3 halomaps:3287 +bigvalley2.map 5D29A028 96951140 262144 a7b27cac4b7efafdd1696db637f54b5ef64303f6 halomaps:3526 +bio_dome.map FB4D5790 12974300 262144 3ea1bde8c71414d0d9acbe16bce5a87187bea040 halomaps:1792 +BIO_SPHINX_117.map 8AB83FF6 18258016 262144 a93667a351e60ce0b5841c09e91f5e845aec39c2 halomaps:4676 +biohalo.map 718F0B10 75879311 262144 8e2a6731ddb5fcbabe4d82a70e9f28db892ad1c4 halomaps:1575 +biohalo_alpha4.map C8FD14FE 18445632 262144 de0c4dfb47e716914f0082c63b4e337197564adc halomaps:1187 +Biped_invasion.map F678B07C 15371233 262144 230c8d1fa7af83b513b2378b87e685b00e1cf531 halomaps:5218 +birdcage-plus.map 9D771767 175101822 262144 46279b439c2dc02c23503202b441a664039bcae6 halonet:birdcage-plus.zip +birthday_bash.map DD158D88 14106024 262144 59bdd533b00583e13c00459ecbbad7acb2f329b6 halomaps:482 +Bitch_Slap.map BA5BACBC 196062060 262144 8c649c63751f302c9486c77af2ce6e3ce421a249 halonet:Bitch_Slap.zip +bitmaps.map 00000000 123547749 262144 6efcb9d7c76abe0195f542c315f83868b3a6dc9d halomaps:1478 halomaps:6560 +bitterai.map 68C729D0 41598651 262144 f30720e4cc1496642dd74daded274f2bdbb53709 halomaps:2140 +BK-Abandonment.map 00000000 241646737 262144 810fd972fb8a0332f531de14c3df91a731e9d826 halonet:BK-Abandonment.zip +BK-Badass-Bigass_ce.map BCE3CB88 277693574 262144 fb202c371e18d4609b2c26fb84b00aac61827421 halonet:BK-Badass-Bigass_ce.zip +BK-Bigass-Mania_ce.map 5809FEA3 277176378 262144 7ecbd95c4089eed4233489535b605130e384ac2b halonet:BK-Bigass-Mania_ce.zip +bk-camtrack-arena-gold.map 00000000 148677597 262144 adc21078837c3e8251d7f06f4470e1ef9acc36d8 halonet:bk-camtrack-arena-gold.zip +bk-dead-to-rights.map 00000000 232477141 262144 ce0be318d16d895e27e8044739ce7381d211c4ab halonet:bk-dead-to-rights.zip +bk-g3-augur.map 00000000 269785671 262144 3aefd338c37573c750b98b509c63767bc09bb5fe halonet:bk-g3-augur.zip +BK-Lostcove.map 00000000 224392599 262144 dff2797c6d3c1e8095f179ce8931d2b3f040780c halonet:BK-Lostcove.zip +bk-orange-valley.map 00000000 230586701 262144 0a06c3d13d2ff157af777af6557aa401dff584f1 halonet:bk-orange-valley.zip +BK-Pirate-Island.map 00000000 184063420 262144 8065fce058057b29e92e22c8904b3ffc384ffec2 halonet:BK-Pirate-Island.zip +BK-Volcanoez.map AF840E53 122218415 262144 9e6d8440d73705b4627c69b342e00067c43bbcca halonet:BK-Volcanoez.zip +BK_Amnesty.map 569B04D9 142886276 262144 c4782441cc82f04dea1ee95bc5ce73cc23c05470 halonet:BK_Amnesty.zip +BK_Battle_Creek.map 122DD3AF 102734805 262144 e2fab0c69043597a5879864e5ac7694ac4ac9a6b halonet:BK_Battle_Creek.zip +BK_Carousel_Zombie.map E7E27133 33938272 262144 7cf2e7b8a73fc67b05879641c907ad0c576be62b halonet:BK_Carousel_Zombie.zip +BK_Coagulation.map 69CC8F2F 190962227 262144 fd1d4563f4d39c31c15ea60ee06e7ba72effea8a halonet:BK_Coagulation.zip +BK_Crossguard.map C8726F53 17000536 262144 0fa0f10a64996be55c2771107a2ff4542d61c1e2 halonet:BK_Crossguard.zip +BK_Double_Gulch.map E7DCC5AA 141985817 262144 d9e3b24404b7e934a7f9c862497afb18948e25d6 halonet:BK_Double_Gulch.zip +BK_Immure.map 00000000 161781141 262144 e49099849ea302288600bd7c2a28332e4f51e6d3 halonet:BK_Immure.zip +BK_infint.map 98C04D61 23119620 262144 34e815440f79c32dbcbefca9bba4a2c10e933313 halonet:BK_infint.zip +BK_Octagon.map 54DB0DC7 27116384 262144 360622cfe990f20c57db62ba15591c31a785edd6 halonet:BK_Octagon.zip +BK_Serenity_Lake.map F0B8CFC5 207072294 262144 717f8402a4cfd15f798b9944f7628e66b8ec897a halonet:BK_Serenity_Lake.zip +BK_Sidewinder.map 8478DB2A 14785216 262144 0d49a2b1bcc11701602e823043145305aa5db80d halonet:BK_Sidewinder.zip +Black Virus Infection.map 1D060A1A 16884580 262144 2dd9a56ef6c9b4269417836e6468627d9e5ddb6f halomaps:5585 +black.map 94A00EA0 20075608 262144 0442e31287bc54b65470c67a9f6e4da03171f7c1 halomaps:2037 +black_forest.map 0B29FAEE 14032200 262144 1db1d9ca245e823fcde9a6248630866087757a65 halomaps:3678 +blackcrypt.map 336D3162 28790308 262144 b1fc0bd6b24ab2ac91148b9458f11d5074821d8e halomaps:4009 +BlackDeth.map A9E0BDC2 125202878 262144 a94ebe67f65d9eecc27edb8ffc4ce6975b633893 halomaps:6324 +BlackIsland.map 8F00B132 129407880 262144 61e0be25dccb9ca5d39463356fe22e16123aa0ba halomaps:6514 +blackmoon.map 952C7D40 17518396 262144 e3de022403e37b8cf3fce855b38e5293c7a87441 halonet:blackmoon.zip +blah.map F408E667 49112653 262144 3fe3045c38c83918062194f4c13fff0e2935427d halomaps:6015 +blamitemines.map 000736D5 26598528 262144 559da12fb8cfbce138538102f4261041c8fda60d halonet:blamitemines.zip +Blasphemy.map B0E48AE7 88882108 262144 58c477b23273b03cbe8117cc9ba905ec7e31e206 halonet:Blasphemy.zip +blast1.map B1590B60 49373505 262144 17d46f5b4fcb4a2fc30116f4f7468e791a0f4f4a halomaps:5769 +blast1_odst.map 6E945F3D 112995568 262144 ed6746a3dfcc1400271d36ecf89fdfad1ddb5d3f halomaps:5837 +blastback.map D3461E9F 13407244 262144 b79d3568aea8bfe234cbeb0b8e8d71ba31a0d49e halomaps:5501 +blastburn.map 27FFA580 14232445 262144 d8e5f89f696f1ebeb1f67da0255a4cf82917fca3 halomaps:3288 +bleakdesolation.map 911275B6 302312450 262144 8f67f29f857c7a9a7acf69033167bc50f064c238 halonet:bleakdesolation.zip +bleakdesolation_ai_bots.map E9BB0606 349915418 262144 b9f7de70cfbd895b8cd395035d9800bb04d95dc5 halonet:bleakdesolation_ai_bots.zip +Bleakness.map 531E3429 205449668 262144 52570f4b2ea7cc1fcb5bde80e5403d1003250fa9 halomaps:7093 +bliss.map 8DE0B875 38755213 262144 d2b040474fc0d92542e9322710a216aab474568e halomaps:4760 +Blitzkrieg.map 600D2D05 159305049 262144 85198447f315a7455e91ce04ccfe723430f50c7d halonet:Blitzkrieg.zip +Blizzard-242.map CFDF355C 80125059 262144 8049e6ce45b06acc267e97c845dbca4ebdbc1b81 halomaps:3380 +blizzard.map 0490721B 15679808 262144 beba82fa02ad9c52cd8a8b554585f4988383dc32 halomaps:338 +blizzard_chill.map 2034A1C8 74042869 262144 13eb466085a0f288982af59395fd2457c594babe halomaps:4761 +blizzard_in_hugeass.map D8E06843 50253236 262144 27bb67a9d4b1c07bbbf6208ddf3b94b4586aa87a halomaps:3060 +BLN-Raven-VS.-Eliten.map F082202F 27048430 262144 193f19178c6973368fe6b6a14242805859d63790 halomaps:3504 +Block Fort.map 909AB6B4 16289140 262144 b9516870cb786aa3be60624b0456068509a6f9c4 halomaps:294 +blockfort.map 67E22F10 25048240 262144 31f8f41447267094644b63881d9904cede8e89b4 halomaps:2178 +Blockfort__Race.map EAFABEBF 17101256 262144 c21efdf3fcf4a8d500b4451fadab9b40361d1b27 halomaps:2743 +Blood Gorge 2.map BD09DF1E 294563265 262144 66ab4da9b637b850c1d734a88853295ea84469fe halonet:Blood Gorge 2.zip +Blood Gorge.map 4C7777C2 294562401 262144 fc1ae8accb3b511cc314672112405d25917f64ff halonet:Blood Gorge.zip +blood legend v3.map FE65A3F0 78330417 262144 67cfd08f8e696e00bef2bffbf416b24d2bc4906a halonet:blood legend v3.zip +Blood-Giant-Wars.map 9D6D9EED 128853723 262144 4fb86f2357e98770bf28584917180fa24b365d29 halomaps:3957 +blood2.map 484194D6 21410893 262144 f2fc7e68344c1cc2b2ad649534878707c6c94590 halomaps:4274 +blood_covenant_classic.map 5B18805C 122273676 262144 d611877ce53123efcd05ed2a3a3b1c54e68405a5 halonet:blood_covenant_classic.zip +blood_covenantv2.map 18F46675 201518284 262144 b64cf0983de47db1bbce714c67bcbd5626c5726a halonet:blood_covenantv2.zip +blood_covenantv3.map 83A81FA1 208709200 262144 1d5fa9abef0f1c3d8f2f7a8d13b81737c5dbdcd6 halonet:blood_covenantv3.zip +blood_creek.map 02F43A80 58199419 262144 81174daa2c2c820edb5f3ca705e4c18620a8615a halomaps:3493 +blood_creek_campus_pb1.map 465D4754 103139814 262144 9df1ea05731c8e0ce5fe17701799c3311e67adda halomaps:5087 +blood_creek_campus_pb2.map 5656B955 159577835 262144 991f7e24b4e92c55f20ebbc911ed2f2a851816c9 halomaps:5990 +blood_creek_rc1.map 1C177810 81736009 262144 dd5480681ef23f13aa87f864accebd764190a6bf halomaps:3392 +blood_creek_rc2.map 8F86D1C0 95049371 262144 0a070ceafa23d524e43709243691bc2118505589 halomaps:3577 +blood_flow.map C227605C 396021187 524288 cb516edbffaa8b71550f3165e6448e861e470ffc halonet:blood_flow.zip +Blood_Glade.map 064784C8 13183076 262144 33066527e1eca3ac9dd061ff11f7cac8128f94fb halomaps:4104 +blood_gulch_h3.map 128C3DC1 31225475 262144 2035593a0076b0e69b4e4be8e31a559547b5cf84 halomaps:2234 +Blood_Gulch_Storm.map 8CE31BA4 16035909 262144 453eb0f17ec035476957cd5eb0faaa04e44406f6 halomaps:3312 +blood_of_the_gulch.map 0F38C842 56507946 262144 febf1340294ec02b19b4bf8e74e4d3a9a6eb5035 halomaps:3061 +blood_patrol_v2.map A000310C 82367174 262144 643e83a63972ad685778d42c62ac485ab900153a halomaps:2300 +blood_pool.map E19A06C1 75022856 262144 f033aba31c2ba24e593a8cde691c5f1c41c22aec halomaps:5923 +Blood_Rocket.map 71A0A0F4 14598098 262144 43700261b44630a64e4c43bf20a19aad4d058b5a halomaps:3457 +blood_vhmt_gulch.map 80672A61 15052687 262144 4f1e09277fcc71c3fecccf137d740e177fca8121 halomaps:4651 +Blood_War_AI.map 5BF43137 54841198 262144 7649a64f17c2546fa4edb1e94727e45ed12252ba halomaps:5502 +bloodcanyon.map 6840D5D1 16516156 262144 a3f77755fc48dcc45381ca2fdc12fac7fb88957b halomaps:205 +blooddareffik.map 0AC8A628 50112340 262144 30243a25e0ccbcf1791046bfcea007130eaef225 halomaps:6750 +bloodead.map F1E43F79 81897657 262144 3d39b8ce17a7ff6fbaf87e13adbe1bae5c0d257a halomaps:5484 +bloodempire.map 4DE1C5CB 20226404 262144 beabcaf4861760d6285eeceb175e3daac0cb6942 halomaps:2121 +bloodencounter.map 40DC63A9 131865423 262144 ff75e49b014da0626e7a35164aea657ae17177e3 halomaps:6367 +BloodFast.map 1B85FE82 62311769 262144 5df3177ce8f8b7d9339bb6521bf7f446f6a48d8b halomaps:4612 +bloodforest.map B533ED2C 16331012 262144 330083178e5bfe017067a7bd53df1538a02d67f0 halomaps:2490 +bloodgaigher.map 46565F26 49792487 262144 82286fb732a2cc15bd3118f37e8684498d513bbf halomaps:2829 +bloodgaigred.map 0AA74F8C 23977808 262144 52bb7601984f5cd70b55b5e9d5ea1bbefc967f68 halomaps:3547 +bloodgiant.map 307708A9 41279745 262144 69d5912dfa8b92190fe88699be040e0e49ba1003 halomaps:1647 +Bloodgiant_Public_Beta_2.0.map 61625A27 38336529 262144 268ebfb630e6c5b033cade4ce97bc388bcbe591f halomaps:1665 +bloodgiant_public_beta_3.0.map 99BCDE72 43129653 262144 d0c5b596a1d1eae1de9f993e87173de5160b3f89 halomaps:1674 +bloodgod.map 7B309554 73921762 262144 a95fe5aebad0e0fe46ee10bef26fa7fa43786dec halomaps:1988 +bloodground_aco.map D28AE55B 26044281 262144 9d9b295deb0e8dabeeb66970702f7d1c4428a711 halomaps:4964 +bloodgrunts.map 8AE3AEDF 59932725 262144 bc025d24a14b92a8357a37d3ada5372bdddccc03 halomaps:4708 +bloodgulch night.map C05D6436 13998732 262144 763bccec29dce25d2e8cc23544d65a5a908447d2 halomaps:6670 +Bloodgulch Overkill v1.map 84145D5E 13956372 262144 7a8f60c7e590010e349f55668b347b1249912f71 halomaps:4439 +bloodgulch-camtrackarena.v2.map E7715BC6 62954316 262144 331724ab4ee481220f12f1a96f35f76ed113c200 halonet:bloodgulch-camtrackarena.v2.zip +bloodgulch-intervention.map 6D025D5A 92951273 262144 48ed70797822cc00c01001a53a3c013b66725e59 halomaps:4999 +bloodgulch-intervention_beta2.map CACDC7B4 109837108 262144 34c943b24cfa0fff8ab768e7b7a76e5f15d0f0b6 halomaps:5041 +bloodgulch-newweaps.map A9347691 51656820 262144 4198a11d1f7671dfa5b73df340991654a5327857 halomaps:5586 +bloodgulch-odst-ai.map A609570C 16779932 262144 b0ddb4f60fa6a07ada0fd950f6ff28e5ef2289da halomaps:4650 +bloodgulch-rail.map 91B9E601 15641424 262144 f264067b9c465858ee42ed73777f5cadfc5b05b9 halomaps:349 +bloodgulch.map 7B309554 13936092 262144 384911e8361a36a6aa69bbb076060540c55545ee halomaps:4773 +bloodgulch2.map A892596F 17480296 262144 e60b665e947ee13999def853382f50883ea7dd09 halomaps:206 +bloodgulch2_bk_v1.map 5EA3D576 268709880 262144 b9472362c89aaa893ada8f2b784a4883202e8b71 halonet:bloodgulch2_bk_v1.zip +bloodgulch2_bk_v2.map 5EA3D576 268709880 262144 1362a761b0b980943edc6dae81a083e1f58a0680 halonet:bloodgulch2_bk_v2.zip +bloodgulch2cse.map 4FEFCF1D 62796159 262144 6fa46b16029a198ceddebf1833890c6d696e0958 halomaps:2557 +bloodgulch343.map 14261BF7 87927004 262144 c1343f4a49dfe30b7288988dad6d1a70b3dfefe9 halomaps:6956 +bloodgulch_60fps.map 6E209CAA 33469316 262144 71c3045c4c4fd5152ce2843c56a93e7ca14a8a97 halonet:bloodgulch_60fps.zip +BloodGulch_AI#2.map 669CDC57 80478275 262144 1763eed45fcc7e4025feba2998955b31c3fd8907 halomaps:2815 +bloodgulch_ai.map EB3ED34B 55827874 262144 7eb9b028d05449d99882495a403650f622c775b5 halomaps:2256 +bloodgulch_anniversary.map 2910C500 290362443 262144 f59520e91ea52a050894afccd5158090d7c83a29 halonet:bloodgulch_anniversary.zip +bloodgulch_bamf.map CE01C3CB 49523675 262144 1d2306ef68a022b6e063797df00e93d033c9d8c8 halomaps:4102 +bloodgulch_base.map 59B36260 33605820 262144 355430ce8702a039de05e447dcba080b4b19b3f7 halomaps:4709 +bloodgulch_battlefield.map 31203DCE 84282137 262144 ac059bd2a076200fda8a79e26999b57f47235b36 halomaps:5485 +bloodgulch_battlefield_v2_chief.map 891A928C 73155643 262144 3d4106c6bd7032d2028941bc548ef31c18ada386 halomaps:6044 +bloodgulch_battlezone.map FC378A9B 46563032 262144 d2a4a823bbcd01f689d35b8c34b699a264851d70 halomaps:4226 +bloodgulch_battlezonev2.map 1CA800C1 63153120 262144 1b08f005d0c40047d3c89bb48bded62e37738afb halomaps:4245 +Bloodgulch_City.map 3E428A0A 91728966 262144 7e7575dd4726c1cf543ec28bb30382c68253835a halomaps:6778 +Bloodgulch_Enhanced.map 53D04AE6 16919784 262144 588924c44f4fda8483bde69e9df5e862e42066a5 halomaps:5059 +Bloodgulch_Enhanced_fixed.map E9AD5C38 73824358 262144 4d30a8ca74c0bb593b9d388ed1d51bcbd436062c halomaps:5276 +bloodgulch_extreme_2.map 077D292A 59603209 262144 bdcfc27b8a8ed942cf201ad34e3b6ddb6075b97b halonet:bloodgulch_extreme_2.zip +bloodgulch_firefight.map E266B39A 106254099 262144 ab9273e0562413a4839d1455f7832a5c9ab4d0f4 halomaps:5014 +bloodgulch_fl_a10_mod.map 5D336473 28004930 262144 9ba5608623808ab2989275c9e3f0766dd092b0ae halomaps:5296 +bloodgulch_H3_pistol.map 93FA18C5 23107148 262144 c9f1636e720245dc6ef10fa6955eb968ecfa8f43 halomaps:5416 +bloodgulch_h4x.map A2479AAE 18695249 262144 9df0e162ecac1dcca82db2e89c19b9e58ef08a0d halomaps:1555 +bloodgulch_improved.map C6D13987 102240256 262144 59877622737017f0ebc83f1cd3652ca307be5b34 halomaps:5683 +bloodgulch_marines_vs_covenant.map 13859E4A 73559807 262144 8d4861aa5049c02754338787c7de07bcb58b8389 halonet:bloodgulch_marines_vs_covenant.zip +bloodgulch_mix.map A6AA52D3 58819164 262144 803a36b45f07f644fc0618ffab58baec7881b5fb halomaps:5184 +bloodgulch_mix_2.map 9443F404 63184980 262144 9a83f6ba253e6e268dedf6f8fa9beda7cd435d28 halomaps:5185 +bloodgulch_mw.map B436CDE1 119908297 262144 46c8596432fd9a4d81bbc496f07f6f1880a397cd halonet:bloodgulch_mw.zip +bloodgulch_mw_beta8.map C4F383BD 128484557 262144 4748238d8eebcd5694c4efd06e8b996b762796e7 halonet:bloodgulch_mw_beta8.zip +bloodgulch_nightfire.map 279E490C 41490715 262144 7d6e1ee84b0d93ef8fda084635088bbba4ebeb75 halomaps:4917 +Bloodgulch_Paintball.map 00000000 96977164 262144 24baa2e055b34ed9f2843cb6c39339b9e576d7fa halonet:Bloodgulch_Paintball.zip +bloodgulch_rm.map 7B309554 321254040 262144 cad0ab725a8da051184eb82ab9e0d782bd5acfda halonet:bloodgulch_rm.zip +bloodgulch_scrims.map 12A333C4 36175979 262144 70e9de2b6169cbf5d836365f30f12612f24527e8 halomaps:7113 +bloodgulch_snow_no_ai_v1.map B8BA837C 77655115 262144 0deed74788d74aedf7c7e8557a816af438e4384e halomaps:6193 +bloodgulch_survival.map 3A92358F 64658688 262144 217f8e833097bbb0406c5af1170581d0e65dd995 halomaps:6177 +bloodgulch_tmcc.map E33F9238 37200720 262144 0b100ccf0f5e04bdb0ec5d229dec05cf437fd24f halonet:bloodgulch_tmcc.zip +bloodgulchblindado.map BE52CA25 14924311 262144 ba38c1f54f2b293878522e3a9ff8e7bb97fdbbbc halomaps:6109 +bloodgulchcool.map 8B1A553F 23454112 262144 644eec0a4df8a9743d36923fdf5bfb16b6cc3fe6 halomaps:5770 +bloodgulchcovenant.map 23FB3DE4 16636142 262144 389aabf0b9b665d3433b489b53d12b7c3f2fef18 halomaps:5349 +bloodgulchcovenant_V2.map 39D00CBD 23462786 262144 bba4eb93f6cac1945e6566efae33a6a92e7db311 halomaps:5395 +bloodgulchedit.map FDD80EAD 19647360 262144 c3c0b8f4a3f26c3f703511aa1db9f5a3f1a1021f halomaps:3476 +bloodgulchflames.map FC51B8CF 104948804 262144 69f9a099c40364e89876a59985e1b7d4eac134f4 halomaps:6016 +bloodgulchhuman.map D02D887F 19016236 262144 9d5b74712fe18e65b6a6e6a27e83c9ade5e5db88 halomaps:5350 +bloodgulchhuman_V2.map 6F27DCB4 22779183 262144 08f213e8e09ca580ca1ca0517318bfd3976a66f6 halomaps:5396 +bloodgulchi.map 4EF3913D 74839950 262144 e5cdee21e6466097b08670c1fd37fca27d6e7477 halomaps:3987 +bloodgulchmod.map 5EA3D576 71090520 262144 6acf5f81cabfdf887de1d82de56d21a9e1316f98 halonet:bloodgulchmod.zip +bloodgulchmods.map 22F1A537 62947092 262144 2bd154dfd59f01980edeb8eaf52b9c252ff312f2 halomaps:4929 +bloodgulchmx.map BC4B426B 70622950 262144 e85d1705569185be444bfb5c6c81b0def1192ba8 halomaps:5013 +bloodgulchrpgfinalmaybe.map 9F061D68 121770771 262144 98b75683b8b60d7ff0455ff1c27c546c204d4d1d halomaps:2421 +bloodgulchsp.map 4D134185 106185835 262144 2bd8025e80c63ed1dd3b459dfdd5affc4e1d87a8 halomaps:4934 +bloodgulchvs.map DE01482D 18718374 262144 855c9c2660e00987855869b6b9f436cc4a9dfb30 halomaps:5183 +bloodgulchvs_V2.map 653FAEE9 23219629 262144 2ec2173d4de37ce5b03d2fb309a2fc18c8b9ce86 halomaps:5397 +bloodgulchwar.map 3B02DF63 50344130 262144 0a8f364fe301e726234f6119bef867340113bfca halomaps:3253 +bloodgulchwarfare.map 61BDE8C9 38220033 262144 844044815e51e68aebce9db70e9716a00f1041ad halomaps:5056 +bloodhillV2.map 128313C2 31337532 262144 d71201c3b853a98c34e4dca31c37fdcd04159fb5 halonet:bloodhillV2.zip +bloodislands.map EA388642 18112200 262144 f8ec645dfb36daca85228aa132c0db02f343fe9d halomaps:175 +bloodlock_0818161.map B7C2FC39 13289584 262144 d208a7b34e9c84563dada95cc385df9efe8d9792 halonet:bloodlock_0818161.zip +bloodlock_0908161.map 0C770809 12788008 262144 c9a891388956eb39517960ed6f4615dae31b455a halonet:bloodlock_0908161.zip +bloodlust_h123.map 81C27E68 68116376 262144 10cfbf963c67f1b7c24b5f43bab79fa15698c79c halomaps:4762 +bloodmod.map A7DF659B 33865129 262144 309844d4a8498bd47ab005b6c6bf20def54ce77a halomaps:2542 +bloodmod2.map C1389DB9 34085095 262144 96414bdf5c0f0fa982738eef743bea206ea4f1d1 halomaps:3436 +BloodRage.map 06B41B62 128612147 262144 fcdad8f4e623fb47e8445543a24d5274d56d5e9c halomaps:6671 +bloodrot.map 69068AC7 14176668 262144 d52e9c23678158d0262a105469d920d8d2578464 halomaps:372 +bloodsand.map 22F38868 15291188 262144 8a37cd6ebbc7b492b824cddd42aac6401a85aba2 halomaps:5771 +bloodshed_sync_alpha3.map 3D4D97A1 43196687 262144 0f04567a2c55f5f1c22e332c0583085cf18b46c7 halonet:bloodshed_sync_alpha3.zip +bloodshed_sync_beta.map 82A2A6FF 40684595 262144 df8fd666ed810d86bf7c345ecbd0140475a0493d halonet:bloodshed_sync_beta.zip +bloodsphinx.map 2F6F51BD 40726441 262144 4b293745b87cb0c498be99f1c2b40224bb6120bc halomaps:4930 +bloodsword.map F3A2ED96 15551893 262144 8dbb596c1af1c8aa1cff6454b40e966ee6cf8192 halomaps:6957 +bloodwar.m.map 57649DFF 22329257 262144 5a82d9daa4f06c4b97fafd29dbd5c34a3de07747 halomaps:5122 +bloodwar.map 25CF3BBA 31210941 262144 1f5f9cfe2f47c5447776ead09fde524f79831c21 halomaps:4798 +Bloody Gulchy.map 671B7518 27904552 262144 2f03ca8842a58e66fe67cad02104ee784ade2dd6 halomaps:3114 +Bloodyhell.map 79BF50E9 20264294 262144 7c7fdbec9224e17b05e3f916d192bbf33f202b04 halomaps:2491 +bloodykills_ai_map.map 1FD5A9B8 50406838 262144 8d02fdcfaf8849b00d4594ddb1255f11b1ece035 halomaps:3576 +bloodynightmarerace.map CB0D453F 21474072 262144 55e18e3d92f0e13cf0b325da4c286a657a3f333a halomaps:1783 +blowalpha.map 20CCABC8 13295288 262144 7393ce3da87b35a3253e403ae41fdad1892315d7 halomaps:862 +BLUE.map 2892F85C 36562545 262144 8b43b6e4cf396c08506b8b679347228095080ddf halomaps:4070 +bluescreen_map.map 892B0AF2 13109268 262144 2877b716f45f323de153b8b61d49190a449c5c57 halomaps:1995 +BMT-alasis.map 37634CAC 43797491 262144 4d9f93f59e1edf1ad0c99e4894576965601bd99d halomaps:3393 +Bmt-Coagulation.map D451B29C 98409211 262144 c8bc92176d9ab7d470209c65ee0b829bc73a6760 halomaps:4140 +bmt_ascension.map 9F89F06E 48753145 262144 a027d4624290548cf25fe449b94fbc4062a79b21 halomaps:4855 +BMT_New_Mombasa.map 7031A954 74938991 262144 3557949d329f3305efad910eb87a0d950b825db9 halomaps:4856 +bntraining.map 575E9549 23601983 262144 4b30fca6ac738ff3a505ba59668e2c817657a4f5 halomaps:1785 +boardin_gepho_aco.map 59C1C8BE 17745116 262144 fe873cda32ee50e202baae55b0dee594ce850873 halomaps:4931 +boarding-pass.map 68ED1AE7 17145404 262144 57ebe5112c426ee2dc3c047b93827f5a8e741cdd halonet:boarding-pass.zip +boarding_ai.map 3111422B 21350764 262144 df55521e1e874a453cad2ba71dfcaf89ecb838e1 halomaps:4857 +boardingaction.map F4DEEF94 13960504 262144 a850470c38bf3fd8eff191ffa330d4bf211f5fe0 halomaps:4774 +boardingaction2702.map C101D344 121739343 262144 74e6ecb415ffda67835e4e5be3a75b28f3421601 halomaps:6424 +boardingaction_grav.map F4DEEF94 13961109 262144 a76d668e92f722f515e19c7f5eaae8957ff5ea49 halonet:boardingaction_grav.zip +boardingaction_grav_2.map F4DEEF94 13962253 262144 cc761660c8f30949d913b9c3bfb03488330e9013 halonet:boardingaction_grav_2.zip +boardingaction_grav_3.map F4DEEF94 13962254 262144 898a616216f10393f021a857ddc2fc97c04bf4d8 halonet:boardingaction_grav_3.zip +boardingaction_grav_6.map F4DEEF94 13962961 262144 b669519b761bc9bbb045b0960373001dbd4ec0f8 halonet:boardingaction_grav_6.zip +boardingaction_pp edition.map 7E706156 16596760 262144 a5bb10f4666e763ad8360cae18ab829ee186315f halonet:boardingaction_pp edition.zip +boardingaction_rm.map F4DEEF94 313468872 262144 3599c31771f1f19064ab9ee876f8c3805e02f58c halonet:boardingaction_rm.zip +boardingaction_tmcc.map 82BA8990 39568804 262144 00636b3cf680ec294fdb8ded941f9dcf0a138170 halonet:boardingaction_tmcc.zip +boat_test4.map 878E5EC6 40964830 262144 2696cd334f60c3999127cec1d5a2616788d9b10f halonet:boat_test4.zip +bob_omb_battlefield.map 69179117 31973360 262144 15e348dc39a74aba3990c1f6cfe8862709872c37 halomaps:1328 +Bond-Girls-and-Goldeneye.map 00000000 90722080 262144 df71bec4f88d16ca510e58e103ee541a760507d7 halonet:Bond-Girls-and-Goldeneye.zip +Bond_James_Bond.map 3B947150 96729076 262144 377ad550217414ec75f3680d884233eb5f5be015 halonet:Bond_James_Bond.zip +Bongo-bong.map A13C6E3D 44300953 262144 2a69814b2bc8b4a9e6adc019b0b93c9ec270dbc8 halonet:Bongo-bong.zip +boogie.map FA158B24 28392732 262144 de7949f46acabb1603ef9cf78d7c16fc55e9ad84 halomaps:2830 +boomboom_example.map D4360395 14114864 262144 ea5e3537e0a4d19fb2f6b88a4a96f9acbba8b6d9 halomaps:2492 +boombox.map 2BF0DEEF 22622103 262144 846da7b84af1b3618b41c45a2719a98c081f8a26 halomaps:2168 +boomgauchos.map 9BAA8960 34728033 262144 2c60829acf2c2c58118ea2e9ee7cb4b1fa25b1c0 halomaps:3844 +boomgulch.map 83497AC7 24691452 262144 87d5767d91cb13e8c69917583dbbcbefb384820a halomaps:2677 +boostglush.map 7F15DB80 18699268 262144 23730bb444b8acde8be1b54497cbb877e1838818 halomaps:2678 +bootcamp.map 9863C75B 116059661 262144 3a80cb895ce95b44324819843877fce9af8c8265 halomaps:2786 +booty_butt.map 174DE061 36265362 262144 b077fbba785b14c97f78b7a928fa7b5736308937 halomaps:1865 +booty_butt2.map 70651154 76144576 262144 7f0bc237f2da3976248b6de23cb38bf48d0b8bd0 halomaps:2208 +booyam-beta.map 3425EF0E 104563099 262144 1ca69e5fa8318ac712b33f5cc38a454436a5b45b halonet:booyam-beta.zip +Booyam_Fixed.map 0120B8CE 269169491 262144 5bd6ff270b5768ee65be52efbaec1b6513de7b8f halonet:Booyam_Fixed.zip +bordingerra.map ED3F7871 54571426 262144 62e103a850496354d156526f1cac7b2fe5007ead halomaps:6319 +Borg_part1.map ABF97054 89008825 262144 46afeeb817767386d1656c0192cf6534a1bf60c1 halomaps:3045 +BornIA.map E10B1A27 237865491 262144 32cbfde98f8fd45c942c10297e2cd6e75941681b halonet:BornIA.zip +bosque_gulch.map 0E8BD120 56444304 262144 3c09068650c340da0b82308a3c1264b574b0d6e0 halomaps:6000 +boss_grounds.map DC069CC4 19658176 262144 002b111a075ca94b103b795efcf8d1cfa83ea157 halomaps:5220 +bot.map FF2A4207 86681629 262144 2e02bbb74ec45b7ee120114bd9d15ca654c1773a halomaps:6320 +bots_in_bloodgulchV1.map 7C588F76 106449060 262144 0fcded471c576402d5eb7a22250d774e9fd22ced halomaps:6672 +bounce_arena.map E7BFB8AD 14664140 262144 3a26dca3facf2ec4becff533a2cc64ac5e4398bd halomaps:4799 +bounce_arena_2.map 552CEDDB 42882724 262144 2cc1f3c77dfd55b47c9fcc02e7fe8a64f64c302d halonet:bounce_arena_2.zip +Bouncey.map 03A40643 139968501 262144 2d54fd700a27cb9a8b544294fd149dff707cea6c halomaps:7105 +bountyGulchTribute.map 9CC66912 26615172 262144 c456a83023f654e4f0eb9d363234749511016646 halonet:bountyGulchTribute.zip +bowling.map DB0DC4CE 14890540 262144 075d0f63ab7f3aff2267ea98811eee3a31881a29 halomaps:1866 +bowling1.map 55D11B75 14874224 262144 c6d326e7ddcdca876f6b2bd365a86f45585d185d halomaps:1867 +boxedin.map 4C5ABB62 12865936 262144 c6d0f53cdfbb920164d3168f02ea02959bb241fc halomaps:517 +BoxMap.map 1A0D0D35 13344796 262144 5844e5a2207b048c24ae522ea222d15a425020b7 halomaps:207 +boxx.map 0573288B 13580032 262144 a4b7d848c5209501447f906b415c2a1e4de61fb7 halomaps:1242 +brace.map EC0F207D 24716930 262144 df5a11a15b330b0ac62a2925a66997c285c02777 halomaps:2816 +bravo_base.map 67A57052 26209741 262144 4ff0905ebc340a4f1ad6c59d7b8722472bdf92ac halomaps:4677 +bravofix.map E13ED35E 14463368 262144 9b9ad5bbf4961512d1e1548d49ac28be25b37874 halomaps:5221 +brawl.map 6DD233FA 12958688 262144 ba5d34cc430fa485beea282115243ab29eb13686 halomaps:4594 +breach.map CC11B8B7 13061720 262144 53023e33dc0b3584e25a7f5026850704df81ae64 halomaps:2587 +breach_n_clear.map 376701C5 137950119 262144 20122d6afecf0749a6b2b2a8c67d65c5bd6636d2 halonet:breach_n_clear.zip +Breaking_Bad.map 75112A88 236617941 262144 0a43557d5d14f543842fc99e1d951b083dd29c4b halonet:Breaking_Bad.zip +Briar_Patch.map 0D12BB0A 385702778 262144 f3e0d5ea7fc923ba3d596d82278224983b9200cf halonet:Briar_Patch.zip +bridge.map 53C04443 15246124 262144 20833c05240e8557fb52c4206d888cdbde72f894 halomaps:501 +Bridge_crossing.map D2E56584 23202532 262144 5f0c3a84301af11a3064403ae0fdabffe1e21ca3 halomaps:975 +bridge_war.map 05724E1A 75993889 262144 c172b44b44bac280f75767d2e2e6f85b9680e2db halomaps:6425 +bridgebreach_weapons.map B4E6317D 82296155 262144 c1fb2b875def41c442963f5d4fedcd15fb9d8f9d halomaps:3695 +Bring-Out-Your-Dead.map 00000000 199493008 262144 708b9fdfa601d5b7332d37d0f3f6b26ffe85f0c2 halonet:Bring-Out-Your-Dead.zip +broadsword.map 97C34B4A 18004236 262144 b2be0f2ace9cb4f53ec370dfc0dec3d629229eca halomaps:295 +broadsword_race.map 8AF7D807 18422204 262144 1a81203827fb71556140ab774c370a84c3cc703b halomaps:5012 +Broken Bridge Final.map 6DC86E2D 38325277 262144 93699fa598c5eba1405ccbfd804fec5ab9524dba halomaps:1594 +Broken_bridge_alpha.map C28B588E 17038792 262144 b84394f545cbe366b009c69c087e07c40efa44fe halomaps:1558 +brokendawn.map EA1AEB75 75057698 262144 c883102c359794aacc020d37b0edc374c97b0887 halomaps:6822 +brokenrift.map 9919905D 23588500 262144 67f8c6267d8496e8345bf9dd1b3a6b690e9a9496 halomaps:452 +brulante-fin.map D9421321 225859391 262144 a2474aeb3635643c3b7ec276c8e8b9a0db1c1a11 halomaps:7094 +brumal.map 5821F586 21913084 262144 f2c9eac5efba321c0fbe279a829cc71052f620c7 halonet:brumal.zip +Brutality.map 20D4C91F 112094963 262144 a33aa5ae5edefc492192a69311b6f38918c64b41 halonet:Brutality.zip +Brute-special-ops_online-ai.map 40E70525 87873547 262144 bd48c345d3fdb389d0b84a8aa8c2261ad32d0ad7 halomaps:6249 +BSA121BETAv2.1.map 0232BE13 94848172 262144 265b042c884657ec236f5c0636c52a9b57c4c582 halomaps:5222 +BTC_gulch.map CAD5973A 48091907 262144 18d011c50eeb9bf588aee93966ff86713720b9b1 halomaps:2630 +BTC_hangemhigh.map 1BEF1AFE 15030086 262144 6076ecf16e0c1b958f78db82fa15486ab97785f7 halomaps:2679 +Bug_Canyon.map AB331D41 61828560 262144 396e5b5466cd104caa9dacce1c59b22e9e102251 halonet:Bug_Canyon.zip +Bug_Invasion.map 3FAC53A1 121444698 262144 bca45144b4dda36840334abc04a05d5cc708aba9 halonet:Bug_Invasion.zip +Bug_Invasion_2.map 2E645355 121456150 262144 59467c296848554d2236cdb73c1ba64525743c40 halonet:Bug_Invasion_2.zip +Bug_Winder.map 68C6B237 62216715 262144 0153f5b3aa8295f7557d018f1cb9aec05d30b702 halonet:Bug_Winder.zip +Bugs_Be_Gone.map 30BA7164 257585199 262144 9d97c1e32e9bdb3d276bd1dfeb78be9311f1badd halonet:Bugs_Be_Gone.zip +builtforspam.map C0BC380F 12892832 262144 039a9baa32dc32b42c2db1f7455bd643f13a3a37 halomaps:759 +buisness_center.map C65D4F46 173018565 262144 021e4f0322c7b6a3c446d4dd56681b1825a95294 halonet:buisness_center.zip +bumper-hog-BG.map A08A6892 13942904 262144 d418b2b1f8ccd7b27b5370dd1612bda5b4fa5bbd halomaps:3710 +bumper_cars.map 63F9A4CC 24331940 262144 30dabd467e2c04224d51031fa29f02902c5d9ddd halomaps:5011 +Bumper_Cars_V2.map 37FC641B 38579936 262144 235904b310b7782d1e5776a105082f19fe706946 halomaps:5557 +bumpyhills.map F0B28A9E 13699800 262144 e41f84fa66b5e9653b2a3721434a05d79652af10 halomaps:1715 +bune.map 21F06788 18796244 262144 e995469ab864886802168fded45015c59ee93e4b halomaps:3595 +bunker.map 9F89E989 13320140 262144 e1a33d6147bf11703901044d465e7a0f4bf716dc halomaps:853 +bunker_holdout.map 336B26E7 50574736 262144 2bcb46022b3171b66874e5f7e0e4b8b4ac85dc9d halomaps:5040 +Burial-mounds-forward-into-time.map 1EA80C0A 86979526 262144 4d2f40d58a062dd386baf12fb80d15131a598b5b halomaps:6268 +burial_mounds v1.map CAAE4BB7 129404285 262144 f1766d04350be1b23bc349093bf86b99d1627433 halomaps:6741 +burial_mounds_classic.map 23F62B4B 33526032 262144 b33782fc3fab4d3b3012310e9804ffd8ed8d5d3a halomaps:5145 +burialgrounds.map 91F7A674 15403516 262144 934be422104d2866beea39231c403d945ac6fbde halomaps:1503 +burialmounds.map 03D97D6C 48162491 262144 4d0227e5b7440b89d7cdb47dac5f89bbe632af36 halomaps:3062 +burialmounds_classic.map CEDCA076 27026844 262144 5955f08cb36ac68a7e937823074d4f96bd07708a halomaps:4858 +Burn_Notice.map C4E69DAA 132851812 262144 6c6816d4a083986aa16fcc32105ecccaa925a336 halonet:Burn_Notice.zip +burning_grave.map E5E3B8B7 28462660 262144 dd7aee6c9adce281f88c5ce3f850570a428c1b14 halomaps:3958 +Burning_Tower.map 2B2FA349 321044672 262144 e216fab8e21461a44c096410eec306b51aa0d1da halonet:Burning_Tower.zip +Burnout_v3.map F9466570 15839701 262144 de2867c47d1996b63357b4e2fc4a28b5cffa77aa halomaps:2543 +burnout_v4.map A8977B20 18992800 262144 d25f93592e41278f038ee0ad7a87a37d161d59e2 halomaps:2680 +burnside.map 9703175E 40662788 262144 756a9fda50aea0ebb4b3524242c02ab7b8aba380 halomaps:945 +buro2.map A652DFDD 17059456 262144 141829ec38855ecbb909652e4129f0c06359cbf0 halomaps:3679 +buryemlow.map 21B45467 68056116 262144 3383b0d97d2164ca26ce3fbc8aa8d065b9aae973 halomaps:1463 +bussacap.map 8E85CF35 56101373 262144 bd3dc59a2342613b7dc64e01f778dc1bdb023f2b halomaps:1960 +buster_rifle.map 53102620 14443336 262144 85fb4ac4894461b6f4e2ac8d79e01493f09e85ca halomaps:1750 +Butter.map 4B483FFD 81521417 262144 72fc6bccf49d5b545eae300d8907b431187205ff halonet:Butter.zip +bz2.map 2F3A1240 14388840 262144 ec296fb7f1fde8c90e09b3f5b8ac4959c8b85c18 halomaps:3394 +C-V-M_deltaruins.map AA81CA83 79944043 262144 54772cec73c0fedb4e8465477ce2d434ef70701e halomaps:6858 +C-V-M_gephyrophobia.map 995D3A20 70328345 262144 f13cf745f06fd55df655b47ed75e8a0a34cc845b halomaps:6859 +C-V-M_hangemhigh.map B41AB263 66882633 262144 7568b24cb0614ae4450605864ee69e398229d03d halomaps:6860 +C-V-M_snowcast.map 3D50B6C6 79821100 262144 29d1d1e1fff678175a0c0c04fdd7c3affeb8e630 halomaps:6779 +c10.map 3113B208 168096245 262144 f17b87f5bdec9fd3d6476acc234252d9e810a6e6 halomaps:6660 +c10_explosive_ahoy-multiplayer.map EFFC56EB 36057948 262144 7eb3d55f8f6754230185f3c96cc7050502cad191 halomaps:5731 +c10_explosive_ahoy-v2.map F3970288 159676523 262144 2b5eb9fba09f36036d42ed29f0d4925bbd6983b3 halomaps:5489 +c10_mp.map A5E11D3E 61036516 262144 ac3c721e05023179ae3976a8cb292adaf05e319a halomaps:3578 +c10STH_movie.map 72AE781B 119233132 262144 087a771e198a5845e3fa940b574b431f2cc8e97b halomaps:3395 +c10sth_movie2.map 0A2B33E3 111515374 262144 8547542443167e465bca6256a764bd351be5ad4d halomaps:3396 +c10sth_movie3.map 991C9C9E 116709236 262144 f6a86c28b65477e7fa1a9cfdfb5967d33bd4885b halomaps:3397 +c20.map 0311C340 137242427 262144 92f8daed0b007e63c168b56d5761464295a9f64a halomaps:6692 +c20_all_fl_mods.map 0C04158C 162467274 262144 093838039f0df658f86b0a16c733feb6f4853d77 halomaps:5575 +C3LL.map 24765428 21391109 262144 f63ac6825263c62ce84cb11365d4cc5a84ee8739 halomaps:629 +c40.map 1674F31C 160161132 262144 52e8993b03146700bfc930c73a91e7fa74017e67 halomaps:6832 +c40b_bs0.map FC0F942E 29241189 262144 ec2f4254ad6b0bf3b2b7ae838199e6d4747196b1 halomaps:2631 +c90.map 26F1F43D 114922786 262144 62dde03cbc1d8dbe299e41bf7aced362c382f2d2 halomaps:5417 +c_garden.map 58899430 14265750 262144 5c46b311ec2c24848bfde5e48851cbb84c96ff64 halomaps:4616 +C_INFIERNO_1.map 82ABDAB0 28305601 262144 5db4a5ffeb8a518013b5dca9fceec93a8dfa5847 halomaps:5089 +C_INFIERNO_2.map 81D0F23B 24103993 262144 03de95c699c91bd09801228e34a534d9b40b011b halomaps:5090 +C_INFIERNO_3.map 051A9ABD 25485085 262144 4b4f1adb30cdd792f46af301a321b0a1cd0b71e2 halomaps:5091 +C_V_M_FINAL.map 70467685 89520580 262144 fd39d4e060be543b0de4164730560bcd82509918 halomaps:2337 +cafeteria.map D72BAA18 15398132 262144 0fdf2eb1c6b33acc222b9c314679465e31a10104 halomaps:1193 +CalibrationX.map 2B8361CC 19224112 262144 febf93690c736fe2d235f8abf8cba62bdf289aee halomaps:1679 +Call_of_Duty_MW2-LVL5.map FC8C2B79 129672989 262144 a151ef1f5983c0bd500d16b462be3a790e7b394d halomaps:6017 +Call_Sign_Foehammer.map 028747BE 357331816 262144 e35e2c7d55d8a2f3ad241b4640ff4fa5a7000580 halonet:Call_Sign_Foehammer.zip +callofdutyworldatwar-L1.map 08F76867 68969545 262144 b40ebd307d58a85e086562c9ff3d9663cd11929f halomaps:4595 +callofdutyworldatwar-l2.map 2E0C90BF 101573324 262144 0e3b1418b6888a5afb8e4b9ea70b6e2effdb936b halomaps:4965 +camden_place.map 8E82B439 73573779 262144 a36ebb3c842b9e47583e37c0b6e4c33daede374f halomaps:6018 +camo.map 33AE279C 14995704 262144 38bee4a3ac8395734531cd3e95a121c505546430 halomaps:1464 +camoteam2.map 69D352EF 12474484 262144 1a8ee76c1f420a49e074975ab8b15a7ddc7a64fb halomaps:3398 +camp.map 4333588B 58467987 262144 8d070fd9341a57255c98ffce447f09ff7ce2c995 halomaps:5781 +campagne2.map 8996420E 113573254 262144 d24e309c789145e6b6b8ba2793f0b73583a55899 halomaps:5151 +campo.map 8DF84892 70096927 262144 7912b99894beb13c16982d5ff39a5c7a2f9081d9 halomaps:6061 +campo_(v2).map 07CE8F74 111509662 262144 2d1084f3134e0e52be075ab8eca844a44ea1b35c halomaps:6139 +Campo_de_batalla.map A6938775 114348009 262144 33b176585806d808aee9c945ca2065f22d73962c halomaps:6587 +Campo_de_Entrenamiento.map E37A77A7 385033214 262144 d560412dc8092e0e8bdce7fd174b15c3eeb5724d halonet:Campo_de_Entrenamiento.zip +Camtrack-Arena-FX.map B23900B3 17234964 262144 4d225a162a914b60794deda76b998c0112020f13 halomaps:1624 +Camtrack-Arena-FX02.map 5D703A74 26667080 262144 8b0a72ee0f693cac68bfb3fb8be684c5bbc7b152 halomaps:4463 +Camtrack-Arena-Race.map 34C34FD3 17282072 262144 7cc74f07c3be24e6cea5031a3d28db76136b52c0 halomaps:4318 +camtrack_INTENSE.map E844C834 117960033 262144 296b099d64f16f72df5697fa95b6e3bf144d1549 halomaps:4613 +CamtrackArena.map EA779F2E 16381776 262144 9e1cfe941e22309281bbc42e660488fae78dd18e halomaps:208 +camtrackarenafixed.map DADCD2F0 16400664 262144 a341ea294bc3b6b206899b2710847d475ffb78cc halomaps:4464 +cannonscore_beta.map 815DE6F2 14754040 262144 2052d7b27945ae54e215d8ae1f583dfeabf1ceed halomaps:1803 +canopy.map 7E706156 185439884 262144 dca12b8e1cc8be5a987234f2974d58004c42c520 halonet:canopy.zip +canyon1.map 4BDFFDDC 106433769 262144 38b6d8f1c2c1a62c91dc7708ba96add455f81807 halomaps:3746 +canyon117.map A4681E1B 12892788 262144 9ea8166a957ebf80b55fcebf558ec03e0597dd3d halomaps:2881 +canyon2.map 5D2F8AB6 50619075 262144 fc3450776462c1c18dbf41cbda3c43bffb4bc257 halomaps:3747 +canyon_assault.map 2F600E6F 49920368 262144 a116ba44a163a68a646183d6873e38e986cf6929 halomaps:3217 +canyon_beta.map 38C26106 15433928 262144 38a67ab75105a843344ba72234d456c7c0dafcff halomaps:863 +canyon_complex___ALPHA.map 332320DA 57345321 262144 c8136f67603da6720cc31672c95a098ae105ddd8 halomaps:6299 +Canyon_XY.map 556F0D42 13567084 262144 b646831865dd47a464e441caea75bce37f1782aa halomaps:4614 +canyonfever.map 20D31E9E 26749850 262144 59913ca644020d438bb94ce9fa73b268f7a7bb3c halomaps:2544 +CaosGulch!.map 6E844523 13510740 262144 cf26dcfff726c9aafc9579a035706a0033ee33d1 halomaps:3458 +CaosGulch2.map 7B309554 13936092 262144 b62d25088fe6c5066a88d42f4442caf2e78f3d49 halomaps:1696 +Capital_Plaza.map A7CB042D 28330682 262144 ac3ad9e9ed6ac07aa70f80b422f3356af2cc64a8 halonet:Capital_Plaza.zip +captus.map 427A8072 136778571 262144 c7bc4b0e69bad67ea6a811f1f5b4a41356d6d79a halomaps:4615 +carljohnsons.map D672F14E 43987108 262144 70e06a7238057384b6d93a57199d416154a887be halonet:carljohnsons.zip +carnage_springs.map 6139BA86 18225400 262144 24eadb3817228afbb6683af828f0792a9d12b841 halomaps:2762 +carnage_springsv2.map 697CAE34 16595977 262144 19dc4b3c522f1f82e457a764cee1ec8b8a35113f halomaps:2980 +carnagehills.map E5979528 14386476 262144 5e2e30bfe44d14dd4700d704efc9d0d1ad875141 halomaps:366 +carousel.map 9C301A08 12643728 262144 67556f9d81afd5171fb1ceb9248f46445705a7f9 halomaps:4775 +carousel_rm.map 9C301A08 294874784 262144 9d461e1dd63593acf08983685d2f079ae3275383 halonet:carousel_rm.zip +carousel_tmcc.map EE8C395C 35744004 262144 3ed84bd4285327242455238d3fa1cea5012bd5ff halonet:carousel_tmcc.zip +Cartographer.map DD0C01F8 117085059 262144 9fd51fcb49b59e42f50e84390dc32ca0a59a87aa halomaps:6089 +Cartographer_v3,1.map F5BB508E 64095994 262144 695ff5fd27031d14f03135219f14a82c98e1d106 halonet:Cartographer_v3,1.zip +Cartographer_v3,2.map 64066B54 100967635 262144 c1a0d547c7692a64165e8a9438d930baf3cc36ee halonet:Cartographer_v3,2.zip +Cartographer_v3,3.map 4224A2F8 100977215 262144 6beb8583e7f512b1b73c0e0dc658feb3fff693b7 halonet:Cartographer_v3,3.zip +cartographer_v4,0.map E76E9C66 216687691 262144 23c51d1c85cb06f6033020516fea78934360be53 halonet:cartographer_v4,0.zip +cartographer_v4,1.map 5D35563C 216688123 262144 482031463d6f57a5a303de773033061bfd160c10 halonet:cartographer_v4,1.zip +casdeltha.map 0070FD3F 86654917 262144 e51a83846a6b2cbdbb3eb7dfdaaba5fa4968882c halonet:casdeltha.zip +castle.map 5316B490 19363516 262144 eb99d45875a0385d7309446ac190cea1ef4a091e halomaps:947 +castle_blackpool.map 86FC06E8 24668912 262144 340851ce0a3648e58f572b9f4d54b73ff54c6de8 halomaps:1039 +castle_island.map 665B8C50 42433811 262144 bcdcebf27c32017ce03b118ed2a85a2b19c0cdb3 halomaps:4113 +Castle_Keep.map B6C8DB0A 332160401 262144 7c27e84272b8c650ce58cd8f05b606f88cc0461f halonet:Castle_Keep.zip +castle_mp.map 3099566B 43351319 262144 7cab98445c31ae05f1b48480763a126f615260fe halomaps:3873 +casualty_isle.map B94CC1EF 24453412 262144 59313e82e7a2e5d7338f75a0f477a6200fd7862b halomaps:1861 +casualty_isle__V2.map 3E4A68A7 23845152 262144 a1bd8ccb776a36307f4db7089edb0690b60f2576 halomaps:2545 +casualty_isle_classic.map D747A884 23124680 262144 cf7af3d59a1f2d7b451a71ea988c8ba0996d9d6f halonet:casualty_isle_classic.zip +casualty_isle_classic_fix.map 3D7C0A8D 22630344 262144 6c308903ddd914dea7ad95b9fc872dfb9a646882 halonet:casualty_isle_classic_fix.zip +casualtygorge.map 9016FA99 17928476 262144 31aaa5583024b0a642f7780069c86b4a9555c89b halomaps:182 +cat_cage.map C4A5DFD0 47228365 262144 7b7c181f5918a9f44cad4bbc2d1d77e96c170abb halonet:cat_cage.zip +cat_cage_final_beta_nov_2017.map D4A4AC64 54297548 262144 e39f8d9b9e26b28a07f240c2b1ad2f1384cff59c halonet:cat_cage_final_beta_nov_2017.zip +Cat_House.map CCC7C0C8 210467513 262144 3f7bdbd7230d465774a14ca08a1db46d252ecefe halonet:Cat_House.zip +Catacombs.map D94225B6 366681730 262144 02d30434f2fb7fe3d5e2ac035de7cc66b9ccebfc halonet:Catacombs.zip +cave.map CE179B66 14934652 262144 1173f285acbbdbf17a8a79cd9ce811edf8c4cb4c halomaps:359 +cave_madness.map 54FC655C 37858856 262144 6cdfdaa5ddd001e13ceb77e768988f7539cb4b2a halomaps:6229 +CB_beavercreek.map 0FAD46AA 16071868 262144 db691bffc4a992d7952040f51d63d3ee261eac7c halomaps:3009 +CB_bloodgulch.map 5FD5F228 22551370 262144 6ca86ce02adc54ed422833f3c9960d899224660f halomaps:2981 +CB_boardingaction.map 38B74351 24915542 262144 a0f77c57c781b343188c330b6534493f619c4a8f halomaps:3010 +CB_carousel.map 57ABCCEB 23462162 262144 080790b78f511a3219cf45add4e433c3bd05e019 halomaps:3011 +CB_chillout.map 34B545CE 24385318 262144 33979bae0234b336df983721e35e256304c5bce1 halomaps:3012 +CB_damnation.map D639817F 25644050 262144 dcd3bdb7553bbcb2b6fd8ab939ee74663718ea28 halomaps:3013 +CB_dangercanyon.map E5297342 26814114 262144 9f4ce26faac7e93abc060468539129d3de0482d6 halomaps:3014 +CB_deathisland.map E2A39B49 29816886 262144 3880ee8359d827983325e394beac326bbcd59540 halomaps:3015 +CB_gephyrophobia.map 75E4B042 27238146 262144 7e525ac68c56d1586bc09b0b2cc53f7c5e20fdac halomaps:3016 +CB_hangemhigh.map 2D62D1BA 24391922 262144 f2764a96bac5326d3a50d5bc68f3b32714cafa27 halomaps:3017 +CB_icefields.map 9AE58C68 27513474 262144 d0bf225d48392dfb3fb7321ba049a12be95c857d halomaps:3018 +CB_infinity.map 0527749D 33723846 262144 70f04a44b656339606e55a222f1e79525d54cb0b halomaps:3019 +CB_longest.map 9EE20A59 24180118 262144 2305c11ee59d40b01fea995c60f8f4490cd7efe9 halomaps:3020 +CB_prisoner.map DC9EAEAF 24113230 262144 10a60bbe4cd5b33659483e57a2a9e446850bed18 halomaps:3021 +CB_putput.map 87B1B121 25832390 262144 b771f7951c51c0b1ada52d001b1997239a52fc88 halomaps:3022 +CB_ratrace.map 71CE0CA8 19554690 262144 93954f3e2c3f8b37f1abd3e761409e33bd2bd86c halomaps:3023 +CB_sidewinder.map 5EEE8D44 26499886 262144 80633b4079ef5f2177a0f5841f23c2389227222c halomaps:3024 +CB_timberland.map 38E49101 26343478 262144 810d13cc9fecf331f057bd58c7dbd9370492a345 halomaps:3025 +CB_wizard.map FD86606E 24387422 262144 366d71f460425d6d9385d936b0db3361b229d6be halomaps:3026 +CB_Yoyorast_Island.map 337601BD 42009526 262144 b2d55d501bb6d5a402c879dd4f5bda41dc0b5524 halomaps:3027 +ccf.map F97A5DCB 22426297 262144 697ed378dac79d060397789d42f83b0ab829d4ba halomaps:1090 +CE3_Stages.map CAB57C13 91296991 262144 327e95a0d61504f5b48fc2b0d4b90db2788621b0 halonet:CE3_Stages.zip +ce3_stages_0.7.map 79DB03EC 89456556 262144 bf459e4a506706e782b1f4acf38908fe3dd3bddd halonet:ce3_stages_0.7.zip +Ceaseless.map 9B6F6DF0 13797345 262144 bc03d367d9baf72d0b0a33a06ff2e99bf193cebc halomaps:1903 +Cel-BloodGulch.map CD7A5ADD 35057812 262144 add3fcaa3880af389a47232adbf72f782ffcb5fb halomaps:1879 +celebration_island.map 0935BD1A 129319491 262144 4a5ebcd92b42e02eded2aa269e9c85e40667cfec halomaps:5742 +celer_exile.map FF720227 167080250 262144 63d04a94e84af511c276b116b17b6b7a6df25bd5 halomaps:6005 +celer_exile_odst.map C6513835 163836310 262144 7548935084eeadb90bac69025576dea7d3ca61cc halomaps:6006 +cell.map 83365673 20948708 262144 aff119fc07c05af06813eecb407711ee8a8eb1bf halomaps:471 +cell2.map F929B31C 20924440 262144 fa6d1ef850939963aca3ac024eba9a636ac287a9 halomaps:571 +cenotaph_beta.map 62FAA10C 17679652 262144 fb42f0d34e9823bb4cd7a7ead6a7eeee579ff40f halonet:cenotaph_beta.zip +cenotaph_beta2.map 84739E4D 17569168 262144 6711ebd677c16fed9b6d82284ae3b76bf2658e57 halonet:cenotaph_beta2.zip +cenotaph_beta3.map E7A40D21 18056928 262144 0241f1fb14ae990bfa454dc4c8b34bbbd19d4849 halonet:cenotaph_beta3.zip +cenotaph_beta5.map BBFAED57 19513584 262144 96ef040a2e28f1eaf87589f8d3ada0457a5a2f83 halonet:cenotaph_beta5.zip +cenotaph_ce32016.map 56D2D140 19752156 262144 94259541120a387856ef7634ee03754d5bec62d4 halonet:cenotaph_ce32016.zip +Centaur.map 625F4A7B 27146584 262144 a187c8250e208e9c106037ffc9bf5b2893fa577f halomaps:1201 +Centaur_Fixed.map 46CFF32B 294508279 262144 78463ad96f3a02bc3661e8b31faedb98dcdba483 halonet:Centaur_Fixed.zip +Centre_Controle.map C79AE5CA 30212731 262144 a5ecd1bee8451a03e115a1ec263df09841ee5665 halomaps:7018 +centre_flood.map DB75BFAE 23920126 262144 f3830af46038514f1fef2152c54c7908a1503e63 halomaps:5000 +centro_de_nave.map 581DBA86 70185880 262144 0cf8a34cfd39c49ff3ee37681e34023443489af4 halomaps:7082 +cerazine.map 05A099E4 126519714 262144 0b30956bae233a1952e3cc90f6e5ac79ec807743 halomaps:6368 +cerazine_v2.map 377B9EBE 133037359 262144 2221dc76139386bdcad5b2eb097f8524453d3e9e halomaps:6473 +Ceti_Alpha.map 9D38DBD9 220890163 262144 eb10c19242ccb82f4050d702a26ca8c92e4df801 halonet:Ceti_Alpha.zip +cgpb1-10rc5.map A43B9BF0 112026221 262144 d15a19263110f4752be0dcf3606a102d13da723a halonet:cgpb1-10rc5.zip +cgpb1-5.map 93D1B672 102376143 262144 9f917819ece94cdfd8351c83cc5586f4f260d233 halonet:cgpb1-5.zip +cgpb1-8ce3.map 26BDABAB 110548097 262144 409415331cc0894c84a877245635adf93cc6bd52 halonet:cgpb1-8ce3.zip +cgpb1.map 6F0161C1 82556189 262144 3dc7d9617de7a659b43eef838710f4c2ceb71379 halonet:cgpb1.zip +CH3MT_Bloodgulch.map 2BD5521C 20299456 262144 2c5bcb9f4e5543538d77b2501ffb7ad446c28dab halomaps:3477 +chainguntest heavy weps.map FC7F7328 18276588 262144 320fcda60dd4a742173eb7062a5b52175fc61339 halomaps:3139 +chainspawning_test.map 4380F364 15945322 262144 1477c1b8d5d750cbeee9471fbf4968c65e2a3e9a halomaps:1948 +chamber.map E457CA7C 13144020 262144 90c48b8049a0cd19b4a5a74a0550f544b427741a halomaps:2726 +changemhigh2.map 46A66541 307141770 262144 466aaaebae626c7025ef644c5739230258fbc570 halonet:changemhigh2.zip +chaoillusion_beta.map 125DB304 15244636 262144 982aaaeaccdcedd87b249ec5552d9e04122b69e0 halomaps:1793 +chaoriders.map F1FE49E2 17625028 262144 e80f2d3deb642a5afa8e57a02750e7fa1b264c97 halomaps:4710 +chaos.map 1D1DFE4A 16761956 262144 2e80d3c1f68496b0a4b181c3ec7857d9ccedfae7 halomaps:211 +Chaos_Canyonv2.map C410CD74 15165396 262144 c0ec7418a62a3543a3de3ad552d5d9e45cdd1b3f halomaps:1113 +Chaos_School.map 38725220 51731278 262144 cddc9794df8c1e1772cdd473a5bb2fc37359cbc7 halomaps:2834 +chaos_zanzibar.map 6A8DA14F 68414258 262144 57802c8d60a75fd249f2ccadc6ad8feb4c3c5f41 halomaps:1114 +chaosanctuary_beta.map CB7092C7 13072196 262144 f433e1d3365fe8804f47c679911a695694d9adfc halomaps:1804 +ChaosCanyon.map 3BC48D14 16311398 262144 d6b4cf2a51f2ba41dd951b2edc489bcf4b3854b9 halomaps:3459 +ChaosCreek.map E123400B 20810184 262144 9506949e5ba28e1d2891c2a3719db3c10eae5a91 halomaps:3505 +ChaosGulch.map 7B309554 13936092 262144 30975bdfca90cdb1303aa9007421becfc01d4c0d halomaps:955 +ChaosGulch_by_MohamadV2.map B37BC6BF 17322192 262144 5067cc0884e16aa50be28cf36df0cd710bc0938f halomaps:3494 +ChaosGulchv2.map 85D2A6A4 13552868 262144 74d383f1636ccb6436297df16e2bc8145416b69e halomaps:2787 +ChaosGulchV3!!!.map FF4D38F8 15149026 262144 ac68fde71bee6aac2d43f56963c926d6f613325d halomaps:3460 +ChaosGulchV4!!!.map 60FDEF19 13559896 262144 0e055d497145189ef2d0dd95b9d884e4d8e47294 halomaps:3461 +ChaosGulchV5!!!.map B11E8AF1 13549680 262144 208e69dcb466a26d8d85e0beab173be139ce16e0 halomaps:3462 +ChaosHangV1.00.map 93C7C02B 13301666 262144 9d68449c4d2ddca9c0f2480352af69741c260e81 halomaps:3463 +ChaosHangV2.00.map 8748E6C4 13300830 262144 de9b498ee9cde3337f05278134e012e1a074b1a3 halomaps:3464 +ChaosHangV3.00.map 91A9CC7D 13301326 262144 6d0e27b35affee319b6d607f469e249f85fe90b7 halomaps:3465 +ChaosHangV4.00.map E7903EB6 14258566 262144 6c852acc5b78da1cabf08437f5c687770713d3f0 halomaps:3466 +ChaosHigh.map A7C8B9C6 12727888 262144 e8d70731ba23eeeb8663d4ca226d6d43268d8b24 halomaps:1102 +Chaosity.map 0E7F7FE7 18330556 262144 7bce864687318389468acc8f64f0d1cbe890e17c halomaps:1112 +ChaosLand.map 54446470 14690920 262144 9e37830aa0aa8564056061b6cab20f6c6f535065 halomaps:1103 +ChaosPhobia.map D2872165 15579312 262144 e928d088f7d2d43157feabd44e4c2785a62fe5b9 halomaps:1104 +chaosticgulch.map 0DB02038 14652172 262144 16d8b4739d74022bc0b4161cc033d336b85f717e halomaps:4190 +ChaosWinder.map BD95CF55 14840596 262144 93651bfbb81be4768e7b8ba40b04333712679142 halomaps:1105 +ChaosWorldGulch.map 2650AA6F 17253620 262144 07bc58d80b07c759c4e83f5592e79f27154df549 halomaps:3495 +Chaos forest.map C1A8EB4F 75314500 262144 08c644dc5859fa1cea6aaf0028ccbdbe7f9f7f85 halomaps:2965 +chargebeta.map BABB21E1 13601216 262144 426062b3af831cd5438a12ead3ce3b8671719ecd halomaps:3845 +chase.map 783415A3 125268379 262144 341920673da5e12894f070925016afffbaa06866 halonet:chase.zip +chasm_wars.map EFF6B9C4 58304768 262144 c4503570a34d58a1c46dddd896cb572f7e461d47 halomaps:3404 +chasm_wars_beta_2.map 72293D2E 53674389 262144 991bf916206fbd9ebaa2f0790ace2d4bcb71a2ad halomaps:3427 +chasm_wars_pb3.map D08BFC73 65833420 262144 ba0ccb9b4576002de15b537fb6ff8b3c4fba7627 halomaps:3440 +Checkers.map 3C3F899F 24793914 262144 f73f7de08d6751dd1a5f9f2f120ea34605c9ea3f halomaps:3381 +chibby.map 6663CFE8 14270296 262144 b371176b1b8cace43f29f4f30bd76663de8d01d0 halomaps:367 +Chica_Desnuda.map 00000000 229740284 262144 0a0c565af6f68de7d63ee33df53b7dd69cac0e4c halonet:Chica_Desnuda.zip +chicha2.map AC67E73A 26912388 262144 69ac2c476c42674d45ea85951f25d443fc7bc70c halomaps:4898 +chido.map 6EA7BB32 21203885 262144 d5e30ff83aff43ae1b1a1a48ecb29e24bd05159f halomaps:3910 +Chill_Zone.map FB2B2065 38204589 262144 d143a2e63d48711b5c9800861481c26f1fbd32dd halomaps:4763 +chiller.map 69AE9AC6 18224248 262144 a2dfd1c6fec743f9286b3a50a8b395aca944b3d0 halomaps:1723 +chillin.map 5B98A47C 105162051 262144 dffa2ff732cd9bc389c1b57ed76f9896b240e09e halomaps:6452 +Chillout-Wesker_Edition.map BDAED333 20544144 262144 ab32ff2ddf7938e9443a3e218a0a09c9b2b4d95d halomaps:5223 +chillout.map 93C53C27 12721124 262144 e1801d7f22f522509ffe29619f5c8e9227f50f43 halomaps:4776 +chillout_infected.map 6B026917 29487628 262144 fc3c379da1b45583566ba1f459d605cf7d3fd042 halomaps:3631 +chillout_pp edition.map 7E706156 15367388 262144 72cb3a65fc2c9aead5761e32354f2fe2bb821922 halonet:chillout_pp edition.zip +chillout_rm.map 93C53C27 296933144 262144 c4c050dba7544fe18b15a398cf53786548a5f45d halonet:chillout_rm.zip +chillout_tmcc.map 984E6E43 36493280 262144 ba8a8bc7af1686356a94dce93f03ef480560b47c halonet:chillout_tmcc.zip +chimberland.map A02A11BB 15626726 262144 1de943ce3df7240c637ebde63d07e78a2aa5be0e halomaps:3696 +chiron-md69.map E47884DF 15098544 262144 8b43b0a2ab657953324703ea9e04c342ce19decc halonet:chiron-md69.zip +choke_point.map FC18D8A0 131981233 262144 23bf86d23024fb8c23ff70e513aa5e92a0c41ab5 halonet:choke_point.zip +chopchop.map 789AE7D7 17927173 262144 81485ff7d85c2ca0509819186cc8064ae7f7ef8b halomaps:889 +Chorizo.map 00000000 108177225 262144 e60aa203b24025a795274514864f3cef425f44d3 halonet:Chorizo.zip +chosen-path.map 71635B59 75795759 262144 2e055def96e0a3bea1696839c7032e725c43d596 halomaps:1577 +chozo.map 9B8389D8 57286312 262144 5426960de6e6d024c479e73e24c29b11204d6158 halomaps:1923 +Chris - Haloball.map 4EEAEC85 59374952 262144 381b2c826e4f62b154316289538d2273c29f51fb halomaps:5959 +Chris - High Tide.map 6510B0F3 49921464 262144 29c98623b8a8bf74293ea6b9726fedcef2e0f568 halomaps:4668 +christmas_halo.map C387DCFD 35153968 262144 481008b8035c09b800d7641b497ce34ddd0597c4 halomaps:3399 +christmas_halo_remix.map 407B72EF 32532699 262144 3157b43bbd76ea5029b6b040bc86c51a73b25ce9 halomaps:4227 +Christmas_yoyorast_island_alpha.map 0BC62453 89643097 262144 77f30e29ce49d0798b5047fa47a4eb31bae22006 halomaps:4319 +Christmas_yoyorast_island_beta.map 9295313E 90909265 262144 200c43eaab8594441f55135de32e522a445681e1 halomaps:4275 +Christmas_yoyorast_island_final.map BCBD8E5E 40346014 262144 2b3b44e705727a05a8999947034bc4914a37acdf halomaps:4596 +chronic_response_beta.map BB7CE2B1 66621022 262144 9680213f912e3c0bd414361d1f8a3d420817bd98 halomaps:5587 +chronic_response_beta_v1.map 7E4C686B 98105584 262144 9f4a3d1be72a7ab73bb0fa18d9eaaf4ad7281b30 halomaps:5605 +chronopolis rpg marine version7.map CCCC310B 134165590 262144 ead06a7de59eac7e0923f9f9e0585be95a88621d halonet:chronopolis rpg marine version7.zip +chronopolis rpg marine version8.map BC062C2D 131805698 262144 ceb846719d9a0ebda5361ede82e5d90c8086b375 halonet:chronopolis rpg marine version8.zip +chronopolis-firefight.map F07FCBBF 291577753 262144 e8d6f9e3f7245dc9f9debf6d29e96e661a0e52e1 halomaps:6861 +Chronopolis_C3_Public_Beta0.2.map 99B2DC47 44628424 262144 4b5bf8ec81ef845d38f9b0bf0019a552091ebe56 halomaps:1625 +chronopolis_c3_public_beta0.3.map ED0B8005 51009548 262144 ace7ecb9e013654f5222a3738141b007c25b9da8 halomaps:3527 +Chronopolis_C3_Public_Beta0.4.map 0123612A 91519172 262144 e3278ebda552545be8d68cfd26b57622d7cc5dee halomaps:6917 +Chronopolis_C3_Public_Beta0.5.map 2DEF3591 92185640 262144 c34a5ad9a331b68f10c38f5c2d1bba4f35d693c9 halomaps:6918 +Chronopolis_C3_Public_Beta0.6.map 08F500C7 91517160 262144 3b767e4b4a755c580f54462713d689500b8d7bc3 halomaps:6919 +Chronopolis_C3_Public_Beta0.7.map AEA43964 93098948 262144 3663ab22920f4da6a79b03f496e2d99e9b5634f8 halomaps:6920 +Chronopolis_Mod.map 7233D85D 47128404 262144 0bb7f4e5b3a3ece926b135c10bdd63be4e190b9e halomaps:3605 +Chronopolis_Mod_2.map 332B5123 47985940 262144 cefa0f010940ec0cc99d5b5bef00e9f8400b1749 halomaps:3657 +CHT's_Coagulation_mod.map D851650D 79992206 262144 2e924a8e076f7ee4cb638b74be3730680fa6c2f3 halomaps:3496 +CHT_Coagulation_PB2.map 2C8C22BB 85386407 262144 d8f218f35d69e1b19589f68aecc69127d569b9e1 halomaps:3528 +church.map C06014ED 132237945 262144 f02d7443b4709af17cb09328b3ee15ed1cb33c39 halomaps:3135 +ChutesAndLadders.map 171FB0E1 12508528 262144 988b945157529a6d21b52d6394e039a16b845a36 halomaps:296 +circlepit.map C144BB3A 14490412 262144 0fa9a65fecc66fd4a725d0b73eebbc5d2cfa1d42 halomaps:3289 +circumference.map A09C633B 17231298 262144 9ee3decf13a2bafc4b2857435839f15bdd2116ac halomaps:2835 +citohiger.map 3E863EC3 119220350 262144 0e5e1f8d06ede85aaab8b1a39f10817a0c6e4fa1 halomaps:4666 +citohigher_helljumpers.map 37DB5F98 83167810 262144 1cc5f6fc418a2d263e6d868f1cc8ad672f283339 halomaps:4711 +citta.map 9BCED4DD 25223200 262144 1ed941e54369291a1f03b033ab935e0a692c5f42 halomaps:3529 +city-assault.map D56706F4 16524272 262144 e9f3ffba36addce29f9d900f03b3a1a52a5b774f halomaps:523 +city.map 5E4AB205 16770008 262144 a8e3b17d7204cb41fe3cfe6d8f7180b911281667 halomaps:212 +city2000.map 864E0082 71309390 262144 ed60fb4e5621454a6c50bbd4e965aacb41cbff42 halomaps:2788 +city2001.map C08CFEC1 77629381 262144 27bdc23b02dd482d8498ff6ff9c3c9e6cd02fcfd halomaps:3163 +city2001_v2.map 70970818 54242409 262144 cf472460fab1eba05bfb6936eb334e6eda0917d6 halonet:city2001_v2.zip +city2002.map 3DCF4D52 29583092 262144 30cdba68a0a45508b305be682383d60ad6a546d6 halomaps:3313 +city2010.map D109778C 67057426 262144 9683dfb4c7b736e1f57724b3eca4ea5f265a1466 halomaps:5368 +City_17.map 1F36B6A4 73035452 262144 517399f66a7ed3859df86d24807f7d3b5e2d7a12 halomaps:2681 +City_Dweller.map 5203398F 325237456 262144 76f9c9cf1ef9e881facc229885b676fbf6432d08 halonet:City_Dweller.zip +city_race.map F9672E2F 21124136 262144 33d7a9c9fa5d2c78e598b56aa2f0b9a4d7011a87 halomaps:3988 +Citygulch-online.map C4FD2F21 36504383 262144 73e80650d07ad2410fa26b729425a4bf573b9dcc halomaps:6269 +Citygulch.map 6A95022B 35148863 262144 03cfbbc68ffae8baf80c8d3eff16e6e653f4ea6c halomaps:6998 +Citygulch_Night.map CE4F038D 33569131 262144 e1c2ebeed65cd4537223e45cbdb7155d3e29480e halomaps:6958 +Citygulch_Space.map 490976C2 33566671 262144 0e8aa842094513b3d0b35b88264f046ad086177b halomaps:6999 +Citygulch_Storm.map 7D8EDD94 53497527 262144 abe53f10a4837d671d6bf4a2b03899f733bc1753 halomaps:6959 +Citygulch_Stormv2.map 7BC64FE2 58041519 262144 14a91b8f53dfa6084dd37d106d9d29bae7986298 halomaps:6960 +Citygulch_Stormv3.map 9EC00010 41310831 262144 30ba693e85816888d12732ff6c09341c28577e22 halomaps:6961 +Citygulch_Stormv4.map D2F237FA 40377887 262144 b91f1ee88e6467f5e63c12d79a17d8010c3c0fb7 halomaps:6962 +Citygulch_v2.map CAEB403D 33574087 262144 16f5d82be50a9707458957711686dbe2602b22fa halomaps:6963 +Cityscape-Adrenaline.map 866451D1 63886062 262144 2644cffff3d623ab1c766c92c5001beac27fcd4a halomaps:2836 +cityscape-beta.v1.map BEB5061D 64169693 262144 8caceb7c0d6ac7ff051b20804f3d11824d856df9 halomaps:4932 +cityscape-classic.map A9D12EC7 53946405 262144 b9b5bf662a09fc05e37f85e1bc9236cef132bd54 halomaps:1949 +CityScape_beta.map CF4C1608 27265060 262144 42712d9b38240fad65bc9438bda39c33c860d9d9 halomaps:910 +ciudad.map 2CBCE718 79713061 262144 6e93ba4dc656bc01b05f208a661c52c8f000732f halomaps:6733 +Ciudad_del_Diablo.map 3FCAC7B1 119147789 262144 941ead85fffa78031c87f39c31d32201b57e6709 halonet:Ciudad_del_Diablo.zip +ClamDan Arena.map 20633D40 23585348 262144 890e34116e795ec8ab5849d443520b82b620f17a halomaps:3080 +Clan@Reach.map F810C7F2 178767274 262144 2526f309871f9a90b6e8fda6d12d9cbb45bc6357 halomaps:6570 +clan[h3m]_stronghold.map 296F3276 190293628 262144 c79fcb7cb46ee6ce7b5bf89cca6fdde4c6b3f1e5 halomaps:5667 +clantss.map 6D8125BD 35148491 262144 7c45d550316a37b15ccf39ec3797b12b2ee23ed9 halomaps:6515 +clanxd.map 58DF51A3 27283823 262144 b070a30d483143c4c679663d678da0cec5cfcd89 halomaps:4764 +Clarity.map 628A481F 182193117 262144 aab7819281a9be2d03aa64da4f466ba059f25581 halonet:Clarity.zip +Classic Coagulation.map CB4C70D9 33348228 262144 299fac8cf0cdb57154b21b545751b444bd882f75 halomaps:1261 +claustrophobia.map E53E8329 28428040 262144 22303f64f10d7920d1029cbdf0b46aa2b0f8196c halomaps:213 +Claustrophobia2.map 2200E649 30412545 262144 3869dc604356361aa429d46c9c0e1c4758a1a0ad halomaps:620 +claustrophobia_tourney.map AFD673FF 44029569 262144 86ed6127e7703678e41b6078a255d063193fc848 halomaps:2508 +cleanup.map 6C10A0C4 107084270 262144 6a01a7e3b41a4b909dec737bf44c494925de8514 halomaps:2318 +clicksion.map 52DF407B 16492984 262144 56f756424f4e16ad74845fa63f77a0ee80b9f924 halomaps:1293 +cliff_shrine_beta.map 1ED56ABB 19170663 262144 050942338c8a516ebaca83fe9e97f40f50fcc904 halomaps:6673 +Cliffedge.map 4563DA45 41256296 262144 fe627d4188f74599beffeb4e2513df3de586be7e halomaps:2599 +cliffhanger.map F27650B1 27242431 262144 016f292deb802e00eb68202b693ef100431f69be halomaps:4298 +cliffhanging.map FFCA822E 100207904 262144 a393dad1f2de00581d86d1088e96bd22ec9218b3 halomaps:6823 +cliffrun.map A0A307CE 25739536 262144 b7e3f4d2de7a1bb8662a126f7e730bf061331137 halomaps:2600 +cliffs_to_win.map 4A759B85 40780666 262144 7837040adc456c1957ad24bceb32851acfa09a93 halomaps:4151 +cliffside.map 227F340C 15205504 262144 74b9a0d30b5ef496a99542f42499680afc50ae08 halomaps:3665 +Cliffzone.map EEBF938E 19081020 262144 9a7180113295683eb3d24dff9f7f248621b0b283 halomaps:4652 +cloneisland-waterday.map 48CA82BF 110756313 262144 b6ad5e23b593c6458615e78501f433e7cba573ba halomaps:4653 +cloneisland.map 81B41F88 49071516 262144 50063f7e2c032645e6db26e17d54bbf3d6e32472 halomaps:4633 +closecall.map 593C1555 14411816 262144 2f3dbf16b46b3943e498394a80be5a5b0248d26e halomaps:1794 +CloseOut.map 2874C3CE 74921786 262144 a2fcbd3211ab708b642e8186e10a0493bf1cf418 halomaps:4141 +club.map 64ED0C56 21565928 262144 84d57d9cde13393cb094938ad0f2ea2a93fb70b1 halomaps:4933 +CMO-Anniversary.map 1F36F404 223740110 262144 13638b9d569fc5fd6720d9c4883d45a288b1ef50 halomaps:6964 +cmt-like-grove-v2.map 179F233D 78410964 262144 335c72504c773c384cd67b880d6d0d314bc7cbc0 halomaps:4800 +cmt-like-grove.map 843E4F5F 73916519 262144 db0e2d6e85a572ccdc36a6e0340766802803fe72 halomaps:4765 +cmt_abandonedm.map 107E00CA 116779723 262144 19d07fcbc0057fdeb8ed6cc79cedf56fa7f1b0b7 halomaps:5303 +cmt_cliffrun.map F4A044B2 58477126 262144 57a904710e984cdcbb00c86cd0501e015b8fdee6 halomaps:5305 +CMT_Coagulation_CE.map E33F6E9D 106980679 262144 871ccba2ef65ada163a70ef4221952b2074dfc96 halomaps:2380 +CMT_Dissolusion.map 3CF5626D 109112718 262144 f2748d4514b0a8a22f7dd63c13511d41f99753ef halomaps:2381 +cmt_fragment.map 744E8271 119007719 262144 270ea5b053b6631352856c0fa3241b17cfffa32a halomaps:2382 +CMT_Fragment_v3.map 711614DD 134231471 262144 643c2dc79f60f0a887f380b9700b859e73861954 halomaps:7050 +CMT_G3_Augur.map 3BD61619 117710431 262144 ee86c69b9ae72930cb4ea89d49b473d7d925c088 halomaps:5398 +CMT_G3_MouseTrap.map 6EAF54E2 122298965 262144 0548ccc2a7b2be1adc6a7120d5b323f8338bfc64 halomaps:5399 +CMT_G3_Ruins.map 337F71A0 107882049 262144 986f695a12e1a048306117b843da5b6cf0bb4d5d halomaps:5400 +CMT_G3_Tags.map 03059AB8 95226685 262144 08cca7e9e1aa748b540cdd856685b402c1861ff2 halomaps:5388 +CMT_G3_Vestigial.map F4CA2A51 109628813 262144 a9c177c3408dde6b230a6ce7524363c0fddde053 halomaps:5401 +cmt_icy_swamps.map 4179839B 103153079 262144 1f594ac7a162a7f0ae825c3478aee234b4a9df2b halomaps:2383 +CMT_Iron_Tomb.map 6DB70AA5 122133806 262144 41d1f66b0f3d05f44cfb6c8fff232e8286ac798a halomaps:5306 +CMT_Ivory_Tower.map FE5C5F2B 90310248 262144 95a0bcf0701d061b73b1716f09281657fed627aa halomaps:5307 +CMT_JungleWarfare.map 8D0B964C 77168217 262144 08993810fdec25a06341878a1af40a9e768efc61 halomaps:5308 +cmt_rc1_grove.map B0F0A97F 124867621 262144 bdb4f19c9a7923667a1a1ca6610816d61ef978d4 halomaps:3911 +Cmt_RC3B_fragment.map 399E102F 133217418 262144 efe8cfbe259516752e937c32e9e16fac2ff105c3 halomaps:2336 +cmt_Snow_Grove.map 61B1C859 131301829 262144 7b068068e7565aa224e2ce4cc35972a62d2eec05 halomaps:2731 +cmt_snow_grove_v2.map 1F5C029A 133600509 262144 c32875f259438e6f0a1d41e57f6cc4a62a66798c halomaps:5001 +CMT_Snowtorn_Cove.map 9A74CA13 130199020 262144 740ccf5697e91c30cb55dc5192432a2a9ade46a0 halomaps:5309 +cmt_tags_unplayable.map CD04CDD2 269208574 262144 7afaf50a98dc0147737341329ab61ed84a52cf3c halomaps:5144 +cmt_tensity.map 5BB7D2F7 111352197 262144 7b15f00d510028a799acb588e4b7280ac36085ac halomaps:2734 +CMT_V2_Dissolution.map E540BF18 125764878 262144 93f670a83e3605e815cc1b71f310730d659419e3 halomaps:2735 +cmt_v2_fragment.map 711614DD 134149182 262144 1e20818d753b6b16e47b1ee4675e907224a0b17d halomaps:2732 +cmt_vestige.map 58DCE25B 105387659 262144 dae4e8fd1b5ff5532d15a82256e14e680e69103c halomaps:5310 +CnR_Island.map 1383F990 58294150 262144 380333b314ec3b48ec1791b7c846ee6f302defe8 halomaps:5003 +co2-plus.map 1257CDC1 114610523 262144 40c25f973e114eae2f871724da6280851557ab74 halonet:co2-plus.zip +CO_Challenge01.map 5A421BF4 29729529 262144 cd730cc9520f9e7d2bf0e5ce0935b9edff55f98d halomaps:6141 +coag.map 6D18623B 290241795 262144 ae1e939339986c7fc7f9bdb6a9344e4b6512073b halonet:coag.zip +coagul.map 15ECC930 144410444 262144 88910658a92e4eb97b40d10a8d1493de0b8e9d90 halonet:coagul.zip +coagulation-hce.map AEC1ECC8 57758575 262144 ffa9e3d3d4d83d79c9660536f506cd2ca2befa9c halomaps:3400 +Coagulation_Gulch-Final.map D2A732C5 41793470 262144 097aa84f9dcbb2497ef5c63e654496f23de3ba5c halomaps:1860 +coagulation_gulch.map 7FBAB407 42978280 262144 246449c80f5d1082b41690f2137ce84070978b0e halomaps:1824 +coagulation_gulch_fixed.map 87C9FDC2 41172746 262144 fce36326e4b49bde9cc4e1595342980f4cb869dd halomaps:1845 +coagulation_ver3.map 00000000 250295976 262144 94dca0dd76a2152ed50160999191e01bd7cafe9b halonet:coagulation_ver3.zip +CoagulationAIbeta.map 8B284FE0 21883836 262144 1436961abad4346be1e7958c8fd47542a7a03b50 halomaps:1559 +coagulationheltdark.map A199B8CB 196341169 262144 7121f7634eb84aed46d2803c80d3aec49921f3fe halomaps:6090 +coalition.map DAF67D22 14981040 262144 9ef0faca1ee27e3bdf631be31268ebe69404dd4f halomaps:1067 +coastal_canyon-2.0.map 3FE30637 90898079 262144 b0b82291b784a72239eebbe53c5ca7152572d7b7 halomaps:6388 +cod.map 2234E5E4 45485211 262144 e717b216528db0ef1bb29edacb576068530ffe4e halomaps:5588 +codenamedrain.map C22B3F74 12828700 262144 38c3ecb9e3b1d848a597eb2d2ec0774092ee7972 halomaps:2982 +codeshafts_map.map 7158766F 27952723 262144 007a5e0ea5b5c15b52d7af99617b56d513249c52 halomaps:4580 +codmw2-lvl5-beta.map C8B4A1E2 120557776 262144 565d4fc31659cf3dff90e70834a05120151d1398 halomaps:6001 +codwaw-L3.map 2F304EA2 81956703 262144 680b1eb03519ea15b344cf4629c883f4716c3ded halomaps:5088 +codwaw-Level-4.map A3427C37 99505969 262144 4563cad58ab8d03cc083c9233be3ee7fa0999bdf halomaps:5224 +codyfields.map 2047069E 22895056 262144 6832787f6a02559f30571ba2e190e56c7d545d63 halomaps:4246 +codygulch.map 27744227 26957502 262144 7eb82ba4210efa22936ebc4f9d4ec9032c3151dc halomaps:5225 +codygulch1.map 5B5A1A3B 27788839 262144 c7369d3c10efa22548c9b420c0667d1452411895 halomaps:5226 +codygulch2.map 7DFF1547 16207034 262144 e03122e87f0722c3ef906ad4e355aaf2c432b424 halomaps:5227 +COF-gulch.map 22177C9C 60714787 262144 3f27673cdcaa3118d82d1a13ed89f756db3abb20 halomaps:4978 +cof-gulchbiped.map A37B2A43 60121227 262144 5b9818a19b4b70c919a715921a0d52dd99cc2b13 halomaps:4979 +cogworks_final.map 77381691 90577838 262144 9034591e4c8aab8d71e67493f838488fa2185fa9 halomaps:5351 +cold bridge beta.map C3E0CE7E 184049690 262144 5b0cb0ed8f8079728daf28f8d5975bc05f395d1d halonet:cold bridge beta.zip +cold_bridge_Beta.map 1E469282 209641510 262144 8bce1f179a06a2c43de6f5d4c722524022a8deda halonet:cold_bridge_Beta.zip +cold_island.map D8F0E313 14367452 262144 67dc2e3ed4f9401e89f6ff8c1da639f792dee0f9 halomaps:4581 +cold_shoulder.map A15D07B2 53327632 262144 0eea85ac99cddc40797479815d761be878b1cbd6 halonet:cold_shoulder.zip +Cold_Steel.map EC96B53E 19367660 262144 72d7871c1a03671a6bdbb69fe7a5a917fffa54d7 halomaps:339 +Cold_Valley.map AE353A3C 72191582 262144 379c868f09ec01881bac62cd3665468b95809100 halomaps:4525 +cold_war.map CC0343FA 35213768 262144 449ec38b5749d98c43e17a8b5f77905165512524 halomaps:2493 +Coldaphobia.map 6AFDC9D5 51360591 262144 4880bb3baba0f7da648ea3ea7d49c9873a6ab066 halomaps:5663 +Coldaphobia_2.map 678918EA 80425097 262144 7a3fd5a58e4c2b1b0fdead95dd961ae6c575843e halomaps:5684 +Coldfire.map A891C950 19332912 262144 699504a9e20061936ec1ea109ebb5ef1160a1b73 halomaps:3606 +coldgulch.map FB785517 82620711 262144 d9e56c2abff6c783a27c2fbdb4cc7183ee0125c6 halomaps:1454 +coldpine.map 3B22C1AE 21169972 262144 760d455642a6906243b1fcd0b79234124ba0710c halomaps:2900 +ColdRush.map 74E906D4 71088470 262144 54fdd118d8d1850fb4ffc093eea79fb64df3252f halomaps:1115 +coldsnap.map 94ED459F 79925558 262144 324a7da33b364f9a04799816bc23d1551ed45e60 halomaps:1770 +coldsnapv2.map 27718324 98890894 262144 225cc6a6f0e3d1b4048175223adea816b10089cd halomaps:2179 +coldsnapwar.map EF46FD26 74673847 262144 baecfe056e50114573852d63d8fd1bb6d0fedfcf halomaps:4320 +coldsnapwar_endgame.map A4B38F94 95052827 262144 713c48d2abbf8b2e096fc0138edaf95d097e2f50 halomaps:5558 +coldsun.map A9E5773F 59493858 262144 5b2b8d33df8869781fae79e35c2e4316e460280f halonet:coldsun.zip +colin-blood's-mega-gulch.map ECCEE0C1 32499922 262144 81fdbeb678c977ff6b630ea50e690895c36abaeb halomaps:4321 +coliseo.map C521987D 112552905 262144 ef43ecf2cdd4dcad928c87f1d1a0911890783bb7 halomaps:6588 +coliseum.map BF58B6FC 12307016 262144 3bbcf9c4ee5c3511289d750f9785d5cb586a5adf halomaps:214 +Collide_Beta_1.map D757CF75 13630192 262144 bc45d577fb123091ed30cf5ba125876eeaff53ad halomaps:2916 +Colmena_de_Abejas.map 48B11795 240567033 262144 5eddfe7c5578d215428939329b6daf395cff7f02 halonet:Colmena_de_Abejas.zip +colonia_screamer.map 5D0F9455 96518369 262144 d85ac8eb3bcf08552853afbc60ccfb4454fc0950 halonet:colonia_screamer.zip +colonia_screamer_v2.map E15ED012 151398017 262144 903105f5d092268c324c7a8fccd50f06b0e129a5 halonet:colonia_screamer_v2.zip +colossus.map F3E5CC6B 25874332 262144 4689e750431fdb9d246c63092f13fbc0c4b66507 halomaps:7000 +colossus_beta.map 9C43C566 20833720 262144 2efa7c960f0497ed62d31b47bff30d7ca1d8d3de halomaps:5589 +columbia_gorge_beta.map 6180097E 27710748 262144 9c5b17d0b8a9e79656b350af52429a9644e8c2be halomaps:424 +columbia_gorge_race.map F2855681 28505052 262144 7f487b608813d718d855065a3da9d7dc832ebae7 halonet:columbia_gorge_race.zip +coluseum.map D97848D3 90640631 262144 304d55701df92f12bd3e574916e0b07174ec9355 halomaps:2283 +coluseumii.map AEDE325A 126119032 262144 b5d7f378cab6f23250e0a43d2d7a14283be2ce4c halomaps:3333 +combat.map 72B45C26 21757253 262144 43680f57f5c2fbff6da522406ad903b570f15cd6 halomaps:5914 +combat_arena.map 8FB7EF3F 50898233 262144 60794edb5b54854cbf74c701eecd2a53c2d90fd1 halomaps:6140 +Combat_training.map 0B7EC9CE 89750993 262144 21450814f89e7b274052ecf60322216d660fc287 halomaps:4304 +complex.map 6F592840 14151560 262144 4fa78622e3e29a402bff270776c8071483761b3f halomaps:353 +complexx.map 912E666E 27602985 262144 3ed340324ac110a654cb430fddb4910470931352 halomaps:2983 +Concat.map 3BEB5C6B 18493637 262144 d2a5d34399c4aa8ef64f24b90e0d4277c12df97b halomaps:1020 +concealed.map 1F81249F 17230865 262144 e6462715d53c1620a76a4d89143ced8056884b58 halomaps:520 +Concealed_Custom.map 223456B4 20512135 262144 242e09cf585381341e5f77819686a44ee26b8054 halonet:Concealed_Custom.zip +concept_test.map E9FE17A6 13810308 262144 871dd8568f7631b02d5480c3afdb5aa515b0d09a halonet:concept_test.zip +Conception.map 1B8109AE 21811444 262144 bb075c04898b35c99f88e83e53fd3366e3b9ba06 halomaps:1329 +condemed.map 270C3D49 14107600 262144 19f13aa5d7464eaa685f1ae2ca13fbedbefe74b9 halomaps:1924 +condemed_2.map 902B3B9A 17125880 262144 c2ea8b5cb7a91064df73aed627c13669f80645a0 halomaps:2494 +Condemned.map ED339B4D 97454992 262144 f7acded974fbfbb22b3456e24dfc14f490ea8da5 halonet:Condemned.zip +Condemned_v3,1.map 3D0E2470 50828092 262144 ea77e8ff084d2dc0cc8eeedf83fedd7e301baa71 halonet:Condemned_v3,1.zip +confined.map AAC033A7 54737488 262144 88b24e1d3f0fdc2651ed49eab8fbea286a5d2cd7 halomaps:3254 +Conflict.map 19716E73 109831113 262144 0558ee83fafc48740745a2fafbc0fdf8bb67e0c2 halomaps:6091 +Conflict_Canyon.map FFA97B38 101355341 262144 5522e8f01495d0f3f7f3cbe7eb1f13e1a5b7cd1b halomaps:5522 +Conflicted.map BBFBAF4A 320248395 262144 b4a6fbc7d4a54fa9e12df9dafda21ce6626675c2 halonet:Conflicted.zip +Conflicted_2.map 01423B41 350363693 262144 4fdbe0438684d94cc695131b5ead6f2f530904fd halonet:Conflicted_2.zip +confused.map 9FCEE2E3 12921708 262144 1128d4aa2d6b807d980757d2b07f127c69868c9c halomaps:337 +confusion.map D5A8D9C1 16725118 262144 1a4657cc8682bc92c7fef213ed494d341bdd9d16 halomaps:1305 +congestion.map BE3201EE 19049848 262144 861af91f93f5633bd8917012c85dd4b021fe9fd7 halomaps:2966 +Connemara.map 05CCF4D2 23928944 262144 aa51d5117e8fab4239379a5b0603b926ed2d4628 halomaps:5060 +conspire.map A9F1BF2F 28889128 262144 f32841fd11de00c204be76e4adf489238be7a2ed halomaps:3314 +contact.map 03AAD7BC 100833375 262144 a7f6b89149f73c3539165ceb80b6502187a07a7c halomaps:3579 +containment_beta02.map 7A80FA2B 26981135 262144 63b3e3ff5395f216386cca8ef3a681e930c82e45 halomaps:2422 +containment_segment.map A2EF485F 131879063 262144 719821e8fb4b50e5e0df1ae94f01de150fc28fae halonet:containment_segment.zip +containmentisland.map 31DDD46A 161140294 262144 7ce19ae6c52acbc3c7ed6e4b3b7886eb940c9719 halomaps:4490 +contamination_publicbeta.map D6BB0186 388882745 262144 8006675f65c7a36f5c9fd5ceb975695257e152d2 halonet:contamination_publicbeta.zip +contemplationbeta.map D7EC9DA5 42675665 262144 9e1e477787a07dbe5959cfcaa81755d9b9d642fe halomaps:3290 +contortion.map 745F6EFF 17074216 262144 26b905224aa5a6147aa4e65aedc67cd278536481 halomaps:463 +Controlcombat.map 1894F04A 61925135 262144 a3096e939cd01a6b5a416867cf8427bbe47ec54f halomaps:2359 +convoluted_complex.map 4B034597 13135396 262144 3a8aa0d79ef3f0fc5461ddb7615e178d47a97c28 halomaps:1925 +cool.map A99C78F4 36451078 262144 2b3e740efcfc08cd4060ce8e337fe099e73ae610 halomaps:2153 +Cool_Forest.map F433994E 354817140 262144 45467cba1b6ec1d542cb468b2e7517478e52f273 halonet:Cool_Forest.zip +coombo_wars_m-1.map FD35EA2F 57927821 262144 f942382780ea60d7f41ccfa570ab344f5dc5a56b halomaps:4491 +cop_gulch_mp.map 2107930B 74128992 262144 e01c7e33fae08edb424a3cdc408c213ad0c3d373 halomaps:2154 +copsandrobbersrpg.map DEB2DFCE 92374419 262144 625dc3e820d04d3e09bf6e0d41199ea31602f14c halomaps:5235 +cordiovexa.map 700565DF 17713640 262144 4c9426c374c4d004b30844341402bd38d7dbd74d halomaps:1151 +cordiovexa_final.map BBE32977 38892178 262144 80c122ca77f657affa644f111a4defb0a9448555 halomaps:1330 +corot.map 53D7A020 64559421 262144 83b4703684ae793cc760deca76058e7cb0ff2432 halomaps:5944 +corrupted.map DF459050 17175608 262144 75999a94129dd990fd26e92e8e6ac76eb4d28c4b halomaps:1279 +corrupted_nocamp.map E91D545A 16654380 262144 29ab77c1da1de88e261737b7ab69547b36eb4f5b halonet:corrupted_nocamp.zip +Cortana's Destiny.map 260E427E 31192816 262144 d9f5bf4a31c6fa411674c8f8447d5b1223da1b64 halomaps:4801 +Counter.map 38D459EC 39300317 262144 5de2c29ad806c0ac9849504abbf581002eaabf1b halomaps:3401 +counter_attack.map 6E043BFB 95196309 262144 4dc3c193ec9a8c63d7bc9ec514389eee461ca628 halomaps:4010 +counter_attack2.map 02395B30 106918968 262144 a073691ec82c07fdf1c4f85c83eb1ed78b3c9104 halomaps:4935 +COURTYARD.map 85E8E3DC 372780253 262144 805cf5804c8899ea73f65ffa48844cd93538b633 halonet:COURTYARD.zip +Cov._vs_UNSC_Blood_Gulch.map 2B4FCBAF 36023364 262144 8299ffde24a06b475b256f63c4ceb60fb3c65238 halomaps:3874 +cov_vs_humans.map 87F7E11D 50054434 262144 a3147d9aa0806e5f5ce18b6ad175af8363470107 halomaps:6092 +covanant_canyon.map 673469C9 17566962 262144 e91e108f56d8be06ef92b2a269250b06805a4f23 halomaps:215 +cove-island 1.1 by-skynetinc.map 6C890CB2 77677495 262144 eb2d954f872b5b7e6e9f60f2e65edfec4f1bc71a halomaps:4678 +cove-island.map BA42215F 27943031 262144 10b03bc7107c7dec4fa1f7fd30bb308e291dbbf2 halomaps:2155 +Covenant Arena.map 53F32E65 26290007 262144 77bd44e8136b7952c1d1cd901c77f4fc926953e8 halomaps:4191 +covenant carbine.map 7DF99214 27899808 262144 f03131719ee95bab03309dd9a1b64d0d61cdf88a halonet:covenant carbine.zip +Covenant's Canyon Public Beta 1.map DEC64849 183202752 262144 7c0bcb8a1810f36fa41235a54f37cfac9cdf415a halomaps:3804 +Covenant's_Canyon_PB2.map 0AC2E3EB 232392038 262144 085a7447eb70ad1968b05d330d3140b337e59c3c halomaps:4899 +covenant-rebellion.map 8AA8C79D 384504440 262144 7ff061bfe95ed1a9dae3d128c6e690c80d084626 halonet:covenant-rebellion.zip +Covenant.map 54861E65 36070967 262144 5cc38c4a7c984b982d3ea26e9658701266447313 halomaps:1036 +covenant_battle_menu.map 079667FC 24476102 262144 b05127dfa07000549fe4a9db6d7bc15f6f954e2f halomaps:3206 +covenant_desert.map C19E975E 83257962 262144 62468e2037f09ff61005adf8f834d83e58270141 halomaps:5624 +covenant_hugeass.map 9BBF380F 51378063 262144 993f06442d942bc61017384cdd16dc08a0ce9585 halomaps:6357 +covenant_outpost.map 9DA2FC4F 70351385 262144 154aaeae236d43b1d07050c6991db630009a969f halomaps:6300 +Covenant_V_Marines.map E9219B9A 106719809 262144 3f58d7cc5572aa2b793dea831ff14c0bb75d1d75 halomaps:2063 +Covenant_V_Marines_Beta_5.map FADA2FCA 111421130 262144 217513d5e0c47f73b08613696d601139847c37bd halomaps:2084 +covenant_war_1.0.map C9AF104A 52771279 262144 272a74763b863adb407c76fea8932da939c67f55 halomaps:2864 +covenantbase.map 45454938 85114424 262144 8407ce956f39f2202d993413f963e0b66e8a9b2f halomaps:3192 +covenantbasev1.1.map 8699BE17 82028968 262144 452650385fafb216d644ad377c441b853c67b54f halomaps:3989 +covenantcourtyard.map D0A6AE8F 14592178 262144 4c2f1c873f2e030b5da0fa3b626ffd5d33a6d116 halomaps:216 +covenantgulch.map A7FB5456 265604987 262144 c5cac81e26b52fdcc247d6b2d5a5c5a8be3fcf19 halonet:covenantgulch.zip +covenantgulch_v2.map 9D6AF64E 38813545 262144 a40005145a71eed2f592d7f9d0afa87153e05a3e halomaps:5889 +covenantlaststand.map 00A9FFAA 86693004 262144 cb56c089b6d111b82fd9fd528869e9e23b0176b0 halomaps:4400 +covenantphobia.map 5E6CBFFB 32263803 262144 0541c266c070562a22e6c152508c98758606a3af halomaps:5685 +covenants_last_stand.map F6E059FD 79085368 262144 819bcfb51e794f0a00bf686197986eca9c6ec9a8 halomaps:3596 +Covenantwinder.map 08D73AEB 71585266 262144 f4d9a6c8f6825200c8ea06b3eb747e3611acc575 halomaps:2700 +covenent_vs_flood.map 1274D409 40336036 262144 f5d2bd90df108c9a9ed25c30da7866aa85ca0f51 halomaps:7030 +covenent_vs_flood_beta1.map 7B1CC54A 40330088 262144 80e0e14f2288530e2a25c75c55def6efc532b3d3 halomaps:7019 +covenent_vs_flood_final.map E7BA8907 73568688 262144 d7781685c08b9612f6c36a9bf3d026b6a66c635d halomaps:7114 +CovenentWoods.map 54446470 14690920 262144 aaa0d33c2935d0df55baa938060d7ac7d5fbe084 halomaps:1195 +covenieye.map 9B822231 31121347 262144 62c5b4c4d3513da823b291213d4d098c5fb93852 halomaps:2528 +covercanyon.map D8A85139 14010120 262144 e1db0d7bf226ac9b37b80659930a9dc19c1d53af halomaps:210 +CoverCanyon2.map BC5937CF 16536912 262144 c97d9fe0054ce59423645d9c6aca895b33d1acd6 halomaps:217 +covevmarinebeta1.map 9CC5DB0F 75478307 262144 a4eb5157095fdcae8fbc6edcef8b44c05da2a20a halomaps:2038 +covevmarinebeta2.map 58F54443 77425231 262144 60039efd38e23c662f66196913319c271636e1b3 halomaps:2051 +covevmarinebeta3.map BD6A298F 72324257 262144 121f83b1b47dc16381cf4a38652d4d2439572401 halomaps:2064 +COVID-19-Wynder.map 5F151974 119958818 262144 158a0e4838118eb5f0dceb065a8575fa852a3a96 halonet:COVID-19-Wynder.zip +covid-gephy-19.map D0FFE7E8 132404365 262144 d3e714b626a130f4da827393f212bd0a84343336 halonet:covid-gephy-19.zip +COVID-Gulch.map 31A49A14 132917390 262144 f6ed2c3935505af16ddb0f3d38e4265e22a7b1f3 halonet:COVID-Gulch.zip +covid-island.map 4FBC86FC 132855340 262144 8929a3cd663058b7ec53908a4116145befe9fee8 halonet:covid-island.zip +covie-cruser.map 4F1480ED 26678878 262144 49e70dbcd33e4e66ef39b87ba787133b8f058495 halomaps:2361 +Covie_Assault_Beta.map E8A1FE68 93993603 262144 2a8d55d33aa8e560b2f0d724829c717546c25dab halomaps:3349 +Covie_Assault_Final.map B42952BD 82914488 262144 9344db0643d2f186a61bce6efcbe423c022f5d73 halomaps:3369 +Covie_Gulch_BETA.map DFD73AB3 22512395 262144 d4bfa43a287923e3383a343d4d6364eb2f0d832e halomaps:2967 +covie_vs_humans_beta.map BB398091 39752261 262144 5248bfac16f75732aa8b1ccd961788c96b32bdcd halomaps:4712 +CovieArena.map 85B1B044 13514692 262144 aedcc5eedb828d384aef8cac289c3ce5072e7b15 halomaps:1091 +coviecafe.map AF793193 13135220 262144 3004cee2a09829be7c8aff8797993208b2784434 halomaps:1950 +coviecenter.map 78ACF3D9 87702239 262144 a63b3c770314220f9618b80e9fc82a2e92f55409 halomaps:5671 +Covvzombiez.map 5122A8CE 46367434 262144 28d46cf30421136ca42940dbe982025d64ce43ea halomaps:4552 +covy_hangar.map FEEAB42D 50170794 262144 383aeb393e5d3809a2ed12c29939a2b6c7b58d3e halomaps:4131 +CoW_Final.map EF0FAA76 29846526 262144 d9f36aaf274051d1f7647b0860307eb01e6add92 halomaps:2882 +cr-1.map 3A2BA041 17013164 262144 ebf315a5a2eb0d2eb5de40cb1b91feda002a34aa halomaps:2728 +cracked.map A66915F3 13852240 262144 36b862e38b799c3868eea1392031c8f92f1138c0 halomaps:1683 +cracks_stack.map 8A8F1581 18704984 262144 fb3eebb6b755be4bf3e222cb111f293e470cd91d halomaps:2363 +cracks_stack1.1.map DF3C5C60 62929090 262144 5d26a8b6f29eb9e48d90e72fb572e92588b24140 halomaps:2495 +cradle.map BFD9D654 17031472 262144 dc937a479487a56d77f6885a3f0473e48e69cc43 halomaps:3063 +crag.map 86334116 60471997 262144 fd4ff1137a563407fe0ead94dfba4edf0713f020 halomaps:5418 +crandorcanyon.map AF022710 19426016 262144 a5f061d5fbb506dd89c1c9270129243980c281dc halomaps:2423 +crap.map BC7A27AE 14094184 262144 3e3134cf5629a3a97881b8a0191d2a22ea3d1512 halomaps:218 +crappy_valhalla.map 7FE145CD 21802168 262144 0ff51e6e1936a5a9b2b146b5a26a2c8e1d5e9d90 halomaps:3402 +Crash_gulch.map 00D0A995 73750255 262144 e7f6ea7e30672ee00508d707de09d0eb0cdf5b5d halomaps:6142 +crashtest0,1.map C79DF598 41108747 262144 4195c9635c2df6d52d305bb75a7055468f8f8aec halonet:crashtest0,1.zip +crater.map DB8CD6D9 13249412 262144 9b2571ee4a399f30468f7bd592e8242177fdd2b9 halomaps:2180 +crater_lake.map B2BF64FE 34993864 262144 4d376f96487ad3d9a0fc6ab78c2a0620bfe9f518 halomaps:6110 +crater_pit.map 327DE50D 13792960 262144 282d46fdc08c67f81bdbbbbb0329497dc45d6e01 halomaps:1996 +craterpit_final.map 10665913 13805240 262144 ae331c4d8db2e8534fc4dc239af464046d4cd3df halomaps:2012 +craze.map 47B80F23 12884422 262144 5964279c893318e5053a9a98ad14cdb673395235 halomaps:1504 +crazy.map 81E3EFFF 19410492 262144 d69777968f6c0c793abb515a9b9ed4b2f7877a6e halomaps:496 +CrazyGulch.map 7B309554 13936092 262144 2e24b4960a3bdf35252d1abadd88cd231c8e4436 halomaps:1116 +CrazyMap.map 8E3491E8 13652442 262144 76171db14fb42243a7667fa6abdcb526439a839b halomaps:1194 +crazymodv.1.map 3E755ED6 14904616 262144 9e5357dbc455f72599ff37ea875243414a7d1404 halomaps:2817 +CrazyWoodLand.map 77F90B03 19031500 262144 22cd7c4e2094ce7f1f7e85243718f19194136f1c halomaps:1224 +crazyzanzibar.map 6A8DA14F 68414258 262144 e7d8382af6c3e144b5ef000cb55d842a4f308bce halomaps:1117 +CRC_Derelict.map A971E023 31507347 262144 6a37feecc073aea79ffc52a6f3bb51d229ac8708 halomaps:3064 +Creature-forest-co-op.map 9369DC04 79167784 262144 ed4df4c25fb5fb2b8a56e33cd6eb25776653683e halomaps:6277 +creepswar.map C8A9C0F3 83127555 262144 9613457074188dc6421e62f9c006fceec41522be halomaps:6862 +crematoria.map C3482332 21510106 262144 2120164ca02af91e3e760fa95bc9989c6b0e8b6d halomaps:2039 +crevis.map 47AB380E 47737655 262144 73ed94643db4a0440e6b2eb352d42955407e805c halomaps:5015 +crevis_flood.map B7348AF5 51844033 262144 d719910b263e0805a548c837f89eee458c4e3ba3 halomaps:5016 +crevis_overflow.map 889D320F 55531147 262144 81dfd707d424be6ac1afeb4645fad865aac28683 halomaps:5463 +Crimson_Woods.map A9FA572C 24643915 262144 653f0f004396cfe590f26a0fc8edb2655e013c6a halomaps:595 +Critical.map FA7524B2 34765208 262144 ca5739330256acda37ad143518a6e1ebde74749e halonet:Critical.zip +Critical_Mass.map 3C7EB329 283599565 262144 c8b5aef97e531a48abace0f265826ae1908a4a52 halonet:Critical_Mass.zip +Critical_v2,0.map 482AB2E8 44974880 262144 d872e492755428a2858c8943aef5da94087a564c halonet:Critical_v2,0.zip +Cross Bridge-beta de halo 5.map F2CBE8D1 227821868 262144 5b7b70da3dc94ec5bd62b6387d605ceea20135b8 halonet:Cross Bridge-beta de halo 5.zip +Cross Bridge.map 07DA990B 256164714 262144 616c0326c8657b0785d9d8528f0cf3dbfa2b6311 halonet:Cross Bridge.zip +Cross Bridge1.map 07DA990B 256164714 262144 e60789b21cf33772a09a13104f4ee9f83d4a7aa4 halonet:Cross Bridge1.zip +cross.map 81BF1735 14637260 262144 80bb3b8984103f9696ad008a4023b959b1aa5900 halomaps:817 +crossfade.map 292D427B 13712724 262144 3c05311860fc7598cf35217fbdc00d594520f210 halomaps:431 +crossfire.map 6C47031B 22542054 262144 e4dc503cd0462827714a14a4d1945e5a251f09c7 halomaps:2682 +Crossguard.map FC55F727 17009052 262144 757ca939b9542906c876551379220042f32af0a8 halonet:Crossguard.zip +crossview.map 58AA4288 48965068 262144 d55f316f02b1ccf7b3690762bdaf0283f1501420 halonet:crossview.zip +crowd_control.map B010B0DE 316575810 262144 da47a4e75fe5c66b35de7186d68c8996ce57f863 halomaps:6474 +crunch.map E2AEEE87 23600618 262144 b3b4360aedd9e9ad284b8ef317edcc5598dccfdd halomaps:2865 +cryophobia.map 32B6F5D1 62769429 262144 6a3849f5f0ddfb1873c8131947fca6437aa93818 halomaps:3431 +cryptnosys.map 2EEFCE2F 22564804 262144 c514f9e0d155e45444b10a863542e210efcf66b2 halomaps:3315 +crysalis.map 56E426F3 27345684 262144 b732025ebf9a07618fabe10bd1252801e6d467f7 halomaps:3291 +crysis.map 751F3F75 15288116 262144 cff52cb36ca0e895b2079494c78c1bb7452050ee halomaps:5112 +cs-v2.map 3F5C92FF 45680766 262144 f4cd53cb8cd1071c1ca635f05f5f04a429835d47 halomaps:1024 +csg-wizard.map 52A8739B 12792048 262144 1c39ef1c8bacce5da47570e91177a78afd62594a halomaps:4669 +CSMT_Golden-Fire.map 34236FE4 93312877 262144 d86068d92d5a7f10e4d2d0f837718fab7fb7a33e halomaps:4427 +css_beta.map AE8FDA31 38061580 262144 698b8ed26faf3bb5f8b29ffcca1771bd070508cd halomaps:1459 +CSV2_insatiable.map 0DF074EB 133272284 262144 0694a06fa1f6f56d2d357055263544f3f6232ab3 halomaps:4713 +CTF GOLDfinal.map 081F3C8B 34724127 262144 8ec2a70ed04124d2791bdbc9ab20885d4316937e halomaps:2525 +CTF GOLDV2.map 13DD6214 51506987 262144 2071ce8171cb92ea73695fec43b88334d326e747 halomaps:2496 +Ctf-#1.map FC3ADF26 12988212 262144 77cf6a148229db07a59e9819b6581df1119bae91 halomaps:7115 +Ctf-Battle-#1.map CB05E549 12519696 262144 7296c0952b84792bb1716721328c0fd8192b9ddf halomaps:7101 +CTF-Face.map 34D9D4B8 15862098 262144 e997de339d4744d26e7feef26c79716d4802490b halomaps:300 +ctf_backlash.map 87309211 16801835 262144 17c41af09c2813417d67dee9604d549722f884c9 halomaps:4714 +ctfsingles_v.01.map E42A60C5 12442936 262144 225333be29c9c3e2ab32090b63a96184c10fed16 halomaps:2126 +cubacity.map FCF36E70 20097572 262144 27081a07ac600bab656b7ecc389db7459dacb189 halonet:cubacity.zip +cube.map AC51E006 12598882 262144 74ecaab410ab818e5e6b7e16751ef20eea7a51d6 halomaps:305 +cubemap_test_v2.map A934C953 89008842 262144 25021bb094d966163a2bf79f43570cd5d55f709f halomaps:4285 +cubix.map E6B35F82 20368273 262144 49df94b971ee43e6f6e178a95ee9ed803b7dcc9d halomaps:3081 +curio_caverns.map 1D8A59B2 50577055 262144 9e64fb3794a6dd5a1221073ce7d988a6d0bf8707 halomaps:1491 +curiocaverns.map 5371B251 49797853 262144 2f502c08514cb39306aff3e0e4fc3385d7aaa716 halomaps:1486 +cursed-beavercreek.map 93D8B303 132730460 262144 16b39daa10aeeafce64ae529ba0320b7f02dd622 halonet:cursed-beavercreek.zip +cursed-bloodgulch.map 915363F4 133305224 262144 267899b8580e531b91a3cfdb0808d4699bce92ce halonet:cursed-bloodgulch.zip +cursed-chillout.map 8F9AFBCF 133510752 262144 b5d8aa612632fb8298ee65df5b5f947276b87e29 halonet:cursed-chillout.zip +cursed-damnation.map 8DBA1807 135126044 262144 353bc16f785180a4e2193a56ef6ee91cd1be9cbe halonet:cursed-damnation.zip +cursed-deathisland.map 776DDC71 137289904 262144 b687817da54514e201bda0a0411fa406d0dcc079 halonet:cursed-deathisland.zip +cursed-derelict.map 2F55C2AE 137403200 262144 cb091893867aa8bd3e7e131d3061719644ff6e77 halonet:cursed-derelict.zip +cursed-hangemhigh.map 740ECA21 136106504 262144 114fd964dde8329d3438b9e2aabc9b2e61e01cb9 halonet:cursed-hangemhigh.zip +cursed-sidewinder.map 2006CCEC 187345048 262144 0dbb7a6e31309de048b36b97fa63f9dc6849addf halonet:cursed-sidewinder.zip +cursed-wizard.map 3C8A9590 134347836 262144 a76b0afdfcbe38f06d69116a92d8d1221ddf5242 halonet:cursed-wizard.zip +Cursed_Island.map AF840E53 242180991 262144 6e3d5e84ca287be4c17a406e4bbda30b54a32ee4 halonet:Cursed_Island.zip +customgulch.map BACB6089 20817184 262144 688a83bdcb07f998d68e11a053dafc7b9f5f05e1 halomaps:3936 +CutthroatCreek.map 9DB9ED6D 61537225 262144 9d6ffc799a9e1edc32ec9bd7a4b68804ccf483ae halomaps:4526 +cyan_city.map 8202026C 21431248 262144 532e95d1d135bd319fe4100ef5173c62ec96f5db halomaps:308 +cyberdyneb2.map 626F4397 132869960 262144 4fcef930334f18602c50d644abe43919b6e462c9 halomaps:6900 +cycle.map 2424E66F 13257236 262144 c6fe5c94dc97a941436dede92864a9cfb0cfba78 halomaps:1898 +cylindrical.map 1B1288A3 19831048 262144 c1a1c2a38d541f154b259dcb3ef1514e9d3f1702 halomaps:4286 +CñR_Infinity.map 02AB1F30 95035345 262144 2fae66942f1292757590efdf73faaf5cef2ee303 halomaps:5002 +d20.map BCE8E65D 138793801 262144 bd057a34bc996da4712ad884be0d88ce9f1bf216 halomaps:6661 +d40.map 35212B44 221165392 262144 71de2c9e45ae8cbea3fe35a117b01bc45280f77a halomaps:6705 +d40_race.map 562632C4 119370083 262144 2e81ab36dec593e16602710eeec4bb052bd8aef6 halomaps:7116 +da_battle_ground.map 9CE3FA51 15552688 262144 ab9b1852fb64fb9bdd524f8531a0f60855de5c67 halomaps:5273 +daglash.map FE2E831D 76406838 262144 9f54a5279bec06a1293e934a24c65587fb4f634c halomaps:7117 +dairon.map 393C7F14 24643415 262144 70a69b8dd7b2310be6c013bebfb55aee648c7453 halomaps:6619 +Dam Assault Pre-Alpha.map 91E20C92 24525124 262144 eae473a5660d8b8c4f1221ae00df7cc3254eed34 halomaps:2968 +Dam Defense Beta v0.3.map 3A902D9D 26915740 262144 0eb0c6d24186dab555e097e5e1d1b0a9bb80e5fb halomaps:3029 +DAM_Public_BetA1.map 1F9F8A0D 31424967 262144 2732631db1eba26c20ac90d4a1a45fd47d80904f halomaps:4053 +damnation-night.map F693B23A 114824056 262144 60e53f073acd0be815cc60caabfcfdd3ac3357d4 halomaps:6674 +damnation.map 0FBA059D 14006880 262144 9324485e0546fcd245d18759c427873308c6ea12 halomaps:4777 +damnation_elites.map FE31380D 18673448 262144 928150ef762528854338766aae55c3c56ad9c766 halomaps:2601 +damnation_elites_h3.map 08E13A09 87665431 262144 f52f127325a711cd05d741aef0baa2df554b3652 halomaps:5960 +damnation_elitesv2.map A772E5C8 24979245 262144 b69c6d37657d71c469614ca9968c9aa624ec068d halomaps:6007 +damnation_rm.map 0FBA059D 309467884 262144 9356dffbb9a5c4ac3dd2d4750d837153ec559747 halonet:damnation_rm.zip +damnation_tmcc.map F4EEF8D0 41198200 262144 edd290f49592f00db253c71772c5d9e76ccdd78b halonet:damnation_tmcc.zip +damnationai.map C3AEA5BC 38730388 262144 cd06bf40ed80d055c772b56792912a38e9c54496 halomaps:3607 +damnationedit.map 8344976B 22368448 262144 6df4c852e55e5b9dbfa26a76bb845b00329201a0 halomaps:3580 +damnationwar.map 9D7B0952 88126342 262144 be02a1c792c9f3e4aa20593a4db22a066b107519 halomaps:6863 +damone.map 5DA5626A 209448131 262144 2e41f888c594fb12daf415ad6515919ee7d529fd halonet:damone.zip +dance.map 832B3944 25225549 262144 02a93f7c20d391a8441306887ec9e8986ef5bbd3 halomaps:3181 +danger canyon v2.map AFB5292C 128058547 262144 7ef3c91743e51bcb021c8634cb54bccf95353c6d halomaps:6516 +Danger-COVID-19.map A4334311 133149316 262144 822fa117ce4ed865bbef6d50ede4e6ed5b6e6d8d halonet:Danger-COVID-19.zip +danger_ai.map 02DE5DF7 86016758 262144 da078ab9508a44c3d99b9d4eca963e255d79a6dd halomaps:2301 +danger_ai_2.map 5D49F91B 74243119 262144 0e9487242e2f06766b7dc025b215c64824aff16a halomaps:2302 +dANGER_AI_3.map E5342575 70745028 262144 ca7d6938dcd3a79e1089d7d619cb643a2c8ea409 halomaps:2358 +danger_metal_canyon.map 11859156 19648412 262144 5acd0feda68eb87378bd08f8fe7000f28cf88f87 halomaps:3847 +danger_nobyon_beta.map C410CD74 15165396 262144 d2a60d9b64e55e9bcc67d9d8c79b8baa2650e679 halomaps:1040 +danger_zone.map 1572F79E 13414580 262144 15d729b341310e607626522b49bf0710f32d77b1 halomaps:2236 +dangerbots.map C8885E76 70607952 262144 efbee48315f2a23d103c6b21fd364848352075bf halomaps:5352 +dangercanyon.map C410CD74 15165396 262144 e788b066e366f037156f8d5d155d1cbfedda491e halomaps:4778 +dangercanyon2.map 3C1F0C9C 20706960 262144 8d43b4444066af3a5a5ccb7c3195812beb4bb9df halomaps:3846 +dangercanyon_ai.map EED319BF 41701976 262144 e9531b6f8811a4367c764e58dc48828d748d370e halomaps:3046 +dangercanyon_attack.map 2F88245F 35326769 262144 9c150b5d6281ad0ec3c6505a35d82f1c633bc200 halomaps:3506 +dangercanyon_rm.map C410CD74 336720288 262144 fface5130464f3a5bb08f5b03c075c509fb827b9 halonet:dangercanyon_rm.zip +dangercanyon_tmcc.map B52F93CC 39975300 262144 eea79a7cfa142293d1a887c14b9c30cd9ef8210a halonet:dangercanyon_tmcc.zip +DangerCanyonFX.map ADD68344 25916461 262144 d6776ad7111ab37b05a076a12618c19aee988178 halomaps:1179 +dangercanyonmod.map E3BC80BB 76815820 262144 2fa2c9c16e6103fa0f69d7f687f7bcaf02549fef halonet:dangercanyonmod.zip +DangerFloodCanyon.map E10173C8 72866934 262144 e73ad23d81819b86ac01e35f8fec5644f3b35f4d halomaps:3140 +dangerforest.map 1F5D06FE 34563710 262144 45b4226e01264a606c2341bf8de498044d1ba6ea halomaps:3608 +dangerforest2.map 51E8F047 38192135 262144 14ec61b7af590a37e283f71194d0f7e8442b9d28 halomaps:3680 +dangermod.map 867716F8 23089676 262144 d71324a6f56d421f390fd3d29bd3323aa1d77a2b halomaps:2389 +dangerouscanyon.map E3BC80BB 76607716 262144 24349a93ede5447a8343e0a1fed1af1aa3fb2297 halonet:dangerouscanyon.zip +dangervalley.map ACB609A9 75568296 262144 4b534cb41a5fcde248e3db5885083fd89fd47f3a halomaps:4229 +dankest_christmas.map 614FC9EB 37911315 262144 ddb102fbebfed19989884a342cac4b667a486133 halonet:dankest_christmas.zip +dar.map 3E52FA09 47471850 262144 f451494f51ebfdb519b992b2bc0253062261c117 halomaps:5464 +Dark Matter.map CE40C228 316889020 262144 0407f959e9067f8647501e7333b61ef8a96a201f halonet:Dark Matter.zip +dark-forest.map 4FD54760 14953200 262144 b55994b572dbb59817b8b823ea234504e777aa77 halonet:dark-forest.zip +dark.map 77F0BBED 13308908 262144 bdc822af25662cdddef1905e0456ad04e510642a halomaps:1595 +dark_beta.map 57B0A744 12117920 262144 dbd4ec823a23c30b5a0b0bf9130ced964c0ba7a9 halomaps:2715 +Dark_ChaosGulch!.map FC1563EB 25308084 262144 7d23c97ea470fa205d373b7a5107a95174b8c3a4 halomaps:3507 +dark_inverted_star.map 8DB2A4F6 43355933 262144 ee797adc36963ce53c9f7248eef14b4eec6fd875 halonet:dark_inverted_star.zip +Dark_Splinter.map 3EB00E38 15187800 262144 687c4f6b75030bcfdcefb9c44c5125eb7f6a8b28 halomaps:3141 +dark_swamp.map A084DD8E 19636251 262144 ac5106cfe22557c0a2938a1db23962d0b157f162 halomaps:3976 +Darkest_Hour.map D91154FD 134152111 262144 fc2e2dcbda103101903ea414ab024ff90d4c21ad halonet:Darkest_Hour.zip +darkfootball.map 6C6E0FD3 16663752 262144 06745ade413857524fbc2b5a4ded6505d31a5d47 halomaps:219 +darkinclusion.map 4952F2C9 221561134 262144 bfec2f2309505302a1f42685a3bb23ab99173459 halonet:darkinclusion.zip +darkness.map 1DAA2939 54741482 262144 bbbb37fac284fd90c3a5162e9ecf8e9b415d882e halomaps:6093 +darknessp1.map 5E70834A 29529945 262144 18903111ac96fd1363724311ec17c38a344aae60 halomaps:2661 +darknessp3.map E136CC60 40554538 262144 49d0116f23b3f4ba9d9ef6637eb624f1cac42490 halomaps:2683 +darkrace.map 9ED66341 45056663 262144 66dad58f9edfc06395cf2d55422d36b30ee100c3 halomaps:6031 +DARKSTARZrewind.map 75400956 61314399 262144 0f2342ee9fa5e2cfa68552152fc0f2c88d33bc75 halomaps:4980 +Darkwood_H2.map A33F2BC2 55165511 262144 f0f9a8bac398feb8b5c33630a92216e585401090 halomaps:2578 +Darkwoods.map 27C452A7 15596768 262144 eb5f8d08e63c803578c3c3633ad456d73df13ad2 halomaps:3284 +darkzone.map A0B20B8B 32888677 262144 6eb2e4a8289e5ed13d1d81f8c3ea03b22b3d124b halomaps:5277 +dazman.map A855F44D 14345396 262144 35dc072c447dc908a44ea3f9eda70f74955ed996 halomaps:750 +dday.map AC14B053 21041044 262144 2043dc087c2465725a9f99d441d0bfdbf0fa00e8 halomaps:464 +ddaysctst.map 2D31A90A 88546038 262144 8439d30db19a361ea35be0c1054582e5dd926056 halomaps:4859 +ddzarea.map F1ED3F61 12887820 262144 323720d96c8a4a3c977733ed9e83070aa22d7164 halomaps:3467 +dead-isolation.map 71E3ED88 59461129 262144 d0f5a2faa61016df8a9a2ff0c752154b0f5c3d14 halomaps:4192 +dead_crater_by_rerout.map BAA62614 27122917 262144 5aea383d83c39d46344caecd202f841010ac4e27 halomaps:3990 +Dead_End.map 3D40ACFE 35818166 262144 b2075362ff346be599c73618a9ef530487e3e3fe halomaps:1488 +dead_halls.map 65C85489 37038595 262144 534cf47f64053dbb15cf29e7ae1b5c8dd102e873 halomaps:5703 +Dead_Outpost_v1.map 00000000 168527810 262144 79acf8811f2dc3d92b744513fea67fb35324364b halonet:Dead_Outpost_v1.zip +dead_volcano.map 4372BC8F 15283092 262144 ee82a782cf9240f04d25543dd0fd44bc5e4a3e95 halomaps:5070 +dead_volcano_ai.map 6788092D 69032601 262144 b6ce7a33959778acad82ba25df4d279a85812e10 halomaps:5228 +deadland.map E4F41145 14094728 262144 c2a4a9f1cb8434b1c5438ef53f25e766a27e7659 halomaps:4679 +deadlock.map 7B2BF48B 143279523 262144 a5d7b660f6ce36d10980bacaa1a892f8441c9834 halonet:deadlock.zip +Deadly_Canyon.map C5123FEC 13836236 262144 b94551476c8f223ae0aa981de57e2d52ae74e0e6 halomaps:4680 +deadlyshadows.map 211176BE 16030700 262144 e3e7dbf6d95a43230377388dc599e3d6746f2433 halomaps:3530 +deadmeat.map 2E34C821 13335484 262144 8a1aeaf818796ba9762a8d3eb333761b479b6f1b halomaps:2789 +deadzone_beta.map 5347E00E 115482275 262144 104dcf0baf5e0bd0de395c39b796e67c1af79378 halomaps:6453 +deagle6_texture.map 09D1B65D 23048142 262144 376cdfb0bc42d706298c6d5ffdea7885705490e1 halomaps:4715 +Death Race.map 9C1B4B1C 51549799 262144 8000aa4dee014810aa679e29d219fd169af8e144 halomaps:4054 +Death_Canyon.map 5F9EA6C3 162791834 262144 76b08bee84923aeffbee3520d0372aa8aab044f9 halomaps:6965 +death_castle.map C06D8205 12646824 262144 5f63cacc54579c1af23c3eee985fca642f9e4107 halomaps:965 +death_cube.map 4636236E 104586621 262144 986bf1bdcd1793c3d51f7f9185580e52171a9bba halomaps:6864 +death_fall.map D6FB99A6 15224384 262144 a7ecbafdf3a584d0446398690f8b423278777fcb halomaps:465 +Death_Gorge.map FF4C175E 20703240 262144 939d45fcb4e8933aba69bb75c279adc659c0baa9 halomaps:4597 +death_in_the_alps.map D32E71B5 14353968 262144 d07fc2b2e432f95423d8a6239d4a5ef8bac6a01e halomaps:304 +death_intrusion.map E840AC3D 108676624 262144 604063bacd82079eb50a934d80331cd02fd7b7c4 halomaps:4287 +death_karts.map 44BEFA32 63920713 262144 59e5269e1da5606e80967f92d1dfcab9f3aee8be halomaps:6742 +death_silent.map E4D94824 219423808 262144 dc0448581f775e4115910e95768edf7068dc2c85 halonet:death_silent.zip +deathbasin.map D547FAE9 15348504 262144 8a92f9e450055259b2f725c6b2d503633afd5a21 halomaps:220 +deathBGv1a.map 7B309554 13936092 262144 2adb18d85be053fde1ee9db55c217d09903a24ac halomaps:5146 +deathcanyon.map F82889EE 106606438 262144 93de0fa89dc20f438befaa4b728aa8533bb4eab0 halomaps:1505 +deathdealer_v3.map 54F211B1 32298305 262144 80b5b0b309c20e729cb5db514e2fdfe5617a9e95 halomaps:3065 +deathgulch.map 836070DC 26174957 262144 5f49461d94f7e18cfee309cabd551c5d1bed947d halomaps:1622 +deathisland rpg test.map 4B9B7912 134068585 262144 cae1f75e8e05d9f886fa5ed915a19174fb11b074 halonet:deathisland rpg test.zip +deathisland.map 1DF8C97F 18153284 262144 d3d2ce9fa245185f1d483e2638ba03f6825cb5b7 halomaps:4779 +deathisland.v.1.1.map 00271F9A 23414236 262144 5b7d54f3b2aedfbc8eeb1fb5ecae2365257195b8 halomaps:2411 +deathisland.v.1.2.map FAB87849 25515356 262144 191f38e674b188938359ce83581216edccd1d4be halomaps:2412 +deathisland_AI_1234567890.map 14372777 46474484 262144 4e94d588b1de93cbbf69e329496a3f15b1fdd946 halomaps:3891 +deathisland_ai_beta_v1.map 971F0A6D 90921054 262144 e4d29150cffdc91dd1e1df2b4c57777b24e28884 halomaps:5071 +deathisland_AI_the_flood.map 0A8772D9 37787305 262144 697a7843d4fec466a038c33e73deb23b8559f546 halomaps:3892 +deathisland_cops_and_gangsta_rp.map D7236223 32274498 262144 4ed657ec86d215936ebf09a33597a05fbb2e4fb0 halomaps:5772 +deathisland_ME.map 67AC3C5D 55324857 262144 437c453689c94ec9b71f796fb539fb50dc6818ff halomaps:1880 +deathisland_ME2.map 51CFF6DB 130318618 262144 88cf36726db87ea5fd3f7784499133c20d8510a6 halomaps:1881 +deathisland_movie_edition.map 292A14C8 88657330 262144 360a0dbd3fcf468adbf273b910242e9e0567a705 halomaps:3047 +DeathIsland_Race.map 946BCFFB 19486152 262144 c15ac9dbadbcfce4dcd471d70b9028eca37049c8 halomaps:2849 +deathisland_rm.map 1DF8C97F 366726820 262144 59555762471f9df1e69283b32940f5d23e536daf halonet:deathisland_rm.zip +deathisland_tmcc.map 213FF5DA 48027932 262144 ff6f7378567987a8f1c5e42d3325531cfc74888c halonet:deathisland_tmcc.zip +DeathIslandApcolypse.map 85F80D42 24783835 262144 cd4e50c5151b331b7cd50c427890c77805bcdccd halomaps:1536 +deathislandapcolypse1.5.map 8C9E2737 30191690 262144 6694a96e3426e4f26b2c5fcfaef20953c5234ccc halomaps:1549 +deathislandcovenant.map C88732CC 30000922 262144 cc1a90e1f68288d102f2d1c472f97c7db1af02d7 halomaps:5402 +deathislandhuman.map 68EA9D2A 29447679 262144 cd4e961f50b31fd102c25d6c628024dfb1918980 halomaps:5403 +deathislandmod.map AF840E53 91097797 262144 1ae31eea7637ffc2d9907efbe22af24127aa35e9 halonet:deathislandmod.zip +deathislandvs.map 28AA8B9F 27091053 262144 c3db619fe5ec820424946b394530993601ad4534 halomaps:5404 +deathisles.map 6701AA2C 23127668 262144 8cea2eac45fa51bc0ddcc597be2b2dd365a8aaa6 halomaps:360 +deathrace.map CB88378D 31569560 262144 03e9508211938dc12e098b7076874f023861bf07 halomaps:2602 +Deathrow.map 8FCA9AC7 15461640 262144 4e52530917c7d2fb3f4ccbbe2d8a8219c4ebd5a1 halomaps:1560 +debris-field-zodiac.map 71944C5A 39310852 262144 68abafb40fb83fa63093cca9e8fe0fab9a0fe8b8 halomaps:2918 +decay_gulch.map E7F8A0A9 14448284 262144 6b58c1f2c24d392b78da23fce594b9855da0f6cc halomaps:4091 +deceit.map FEC6C2DD 15470476 262144 3a8d1fda4651ce2fd1eb7cb1eb760ed09537aae0 halomaps:1904 +decimation.map B4863A90 19379844 262144 7827fa8a91c76578f4af73773bd73ed10887f59e halomaps:4025 +deck_classic.map CB99450F 16260716 262144 6f3d8e52a5f5e4de39e882ac6c4807ddcebbe3a2 halomaps:4358 +decoy.map BA87992E 17955536 262144 e5eb99cb42b734ed84a9ef3026e23d9fd3c40613 halomaps:303 +decoy_race.map 736E30CF 17956664 262144 62b26e39a60cb5266f6ca33e647d389be961e8a3 halomaps:4276 +deep.map 84349384 17541624 262144 f010f0e7e49ac78473f2707255807703bf95cbec halomaps:391 +deepcanyon.map 6A4AC49D 16563028 262144 951075f474b5db3f35858af2451d5fdeab4cff08 halomaps:890 +defense_of_the_gulch.map 34DF3BE2 76510983 262144 dc61d0bfed4d64411ee83e43de546417518e3d04 halomaps:4766 +defy.map B3E97AC7 32692479 262144 6c980f5c8efecc624f1f7eeae93df2e8b74d52aa halomaps:1905 +Dejavu_revamped.map B8B024C9 388722241 262144 2561b749a6710642e1320429aac2965e0dc109b2 halonet:Dejavu_revamped.zip +delta1.map 7502DA52 13737288 262144 d7c95dc94f4f1b5f022316458f7880dfe1baf2d7 halomaps:1219 +delta_cliffs.map A602F136 51636637 262144 620f9a02bd3ef22eab339afee1f7bc7eb8608bcb halomaps:4214 +delta_map.map 0984BC2C 106330984 262144 a4098d3fcb2a15b5f069424e8d8c64bf4051d2cc halomaps:5018 +delta_ruined-ai.map C52220E0 32222936 262144 7bb80580e4868e6caca717408d34b5bbb7ab7ef1 halomaps:4966 +delta_ruined.map 0CB98744 29339048 262144 6ba80dd2ec36603cad8658aab259b6c1e624b7c3 halomaps:3167 +delta_ruined_ai_war.map 8D529AFB 66464658 262144 1a2f00376de45f94188c5ddb363f219ded67a2b9 halomaps:3597 +Delta_Wizard.map 612C9B30 18964438 262144 503e8bfb8051418a0624c0713924ea4995e4a9b5 halomaps:3115 +deltacliff.map E786031B 133221107 262144 b5aed4c3e7dd86c56a8fe1c891a4d8f6dc44c3de halomaps:6032 +deltaruined_INTENSE.map 336AD0E3 59384404 262144 2ec4a624c1cb0485c0848853d149fc116a56754f halomaps:4152 +deltaruins.map BA3A5526 18772504 262144 331b8afece02e70b2599243d22886551e040caad halomaps:1136 +deltaruins_ai.map 1D29E4C5 253886259 262144 5d45e1030ac40b00ea5be02b7fd7944f8e4fe74f halonet:deltaruins_ai.zip +deltaruins_revamp.map 1DBE3B52 85663685 262144 061f67e69716ac85b59364a77151e8b06159d1e9 halomaps:7001 +deltaruins_tourney.map 5911C9F6 34150409 262144 119ba35836e385f262b2ea00138d32f18e1a3eda halomaps:2509 +deltaruins_v2.map E38C4C41 27370028 262144 d08bd8df386998378bf6585512b23694a676b448 halomaps:2772 +demino.map 7B7D19DF 28611068 262144 27eb79d3501213bdf294ceb59767f630c0ff4446 halomaps:3893 +deminoai.map D10957C2 80570585 262144 243f478903db4e63d6e41f872b40a6926874f12d halomaps:3894 +demise.map 4F0E3ACB 101432025 262144 2eacd50a66f183f81ac6027f7e248ae656476369 halomaps:4575 +demo.map 9F79BBA9 119919330 262144 992eec8b6c27e74f707ad04238b29444403e230f halomaps:5324 +DemonsAtWarv1.0.map 20A39BB7 68198693 262144 5b5c5a1c1865f762f0bd5855e91c97d536fb5788 halomaps:6865 +demonsatwarv1.5.map 1DFAFB0A 107656207 262144 7a568e652efbfd687c1c155b93994e4edfacefa0 halonet:demonsatwarv1.5.zip +DemonsvsCovenantv1.2.map 91CC81DA 129869947 262144 8a199a701510a98ea3e97b5d1d03e752d8b1edb5 halomaps:6866 +Denial.map 5CC4B538 17334776 262144 832b12377704c51288a5cd6ba9b10e949c3a18f5 halomaps:1906 +dennis.map 59A883A0 14051254 262144 4bdc62a43333ec6f12926f6dedc66fea4619975a halomaps:3066 +deployment.map 03766751 60015654 262144 626bf12cb00f3e4de50dec69573b112e6c3451c5 halomaps:2424 +depot_beta.map 686E65C3 13086048 262144 f44824863d91423ca6ee0ec0a344961e07b04b94 halomaps:1805 +depression.map 5FAC364B 38297733 262144 322b92f51f4af036e6c065f371df74220a4a82fb halomaps:6492 +derby.map 08CBA0E2 17212996 262144 778e8077a9891469bb79606ac16ae4515fb58dac halonet:derby.zip +derelict_tourney.map 34AB3300 26695416 262144 8657335c30e9675be556261c58a1b3af3c45adf7 halomaps:2510 +derp.map 3D0ABB28 12713576 262144 1e86473e68d5713e5e3fc0d03f9677aa8b6eb634 halomaps:5123 +descending_depths.map 448AFB18 17563248 262144 828909d7d2fc6e3e89f8d9867037cd7306362bbb halomaps:5278 +desert grove.map ED120CCC 52173672 262144 3b69717b8eec914819c253492a0a95d0ccccf75b halomaps:3754 +Desert-of-the-unggoy.map A0BA732C 31071013 262144 d847cf897814fd6e869850c9b38dcf3c9969680e halomaps:5326 +desert-warthog.map E56B254F 67730536 262144 1d3106141deeeaac71a7ccd9c6eda5ccc5f8ba89 halonet:desert-warthog.zip +desert.map 737DC176 71982597 262144 9db93b163e7931db56c3415efefe16f1dda412ea halomaps:2193 +desert2_beta_0.2.map 1EA0F72D 31797992 262144 99e5eec28c5325362971f2cc461f8f50d6b5aa1a halomaps:2338 +desert2_beta_0.4.map 80C4BE02 41350424 262144 c54e16f38776ca4910b54e498f6293f7840110a3 halomaps:2529 +desert_battle.map 9D97160B 58704614 262144 3a2ac5b74f5c60f00f043ca5866dacad76da7fa8 halomaps:3755 +Desert_Battleground.map B2BD3F5A 57335749 262144 a01e480fad6e2dd71163d7b57b57393c10e1c019 halomaps:3609 +Desert_Battleground_V2.map 0767CE5E 49814806 262144 d6e99a122f0f9dcadcd6b9c4b18af8c62c0ee68f halomaps:4507 +desert_combat.map B72A69EE 68403886 262144 63560ce63a011a913d2b88118190f8ca86b34b09 halomaps:6278 +Desert_flat.map 711A10E2 16007440 262144 f321199d937a9e229a4da58c6782a84924b542fe halomaps:5606 +Desert_Floodwar.map 09C624CD 79409710 262144 bccc738efc2bc06664624bd8bf9edca7990c39af halomaps:4636 +Desert_Island.map E59BFA3E 12240432 262144 aef2c90d8d50a4e4912d499b8602ccb1dc56e401 halomaps:398 +desert_island_b2_mined.map FC3F3E90 12586540 262144 c992ddb301e380855669b875e16353f6cbed84d2 halomaps:1707 +Desert_Island_Base.map EE14C24A 15546090 262144 ad888bfb23a0c1e52df53dfca74f6b2a23d5fb10 halomaps:4466 +desert_sands.map C25F14CD 53771634 262144 d29612e29aec9a3e3b9cbba38d3d1af40c032521 halomaps:2773 +desert_storm.map ABFB99E1 16754816 262144 6dd592285c46d143437299aa6b6f14929ceba7cd halomaps:590 +desert_storm_v2.map 8580209C 22476550 262144 c87c301147f962f93a656d1037d895b4bbaa08ac halomaps:2237 +Desert_Warground.map CFCAAB3F 15494372 262144 3ff9a572540a1227e5d57e23992f5b4de15b4c2a halomaps:3143 +desertb18.map FD3E8AA0 19807336 262144 66c72ea0e17dc41dd430bc52fd9c9577f60b34be halomaps:4193 +desertbox_mp2013.map 0E5CAF8C 67387970 262144 98d65e02c26c371212fbeac50512d36f7f8af2e5 halomaps:6589 +DesertCanyon.map 28F36C56 16919068 262144 75400958060d7641f69ae62e7de9b209d19b2ee7 halomaps:4323 +desertcanyon_pb1.map E3BC80BB 334405963 262144 64f67be3ae92fc75c4fdb588c3ba9be54ef531e8 halonet:desertcanyon_pb1.zip +desertcreekAI.map F3EF6836 47621954 262144 47df6ab213eb811ac4989b2d2811dfa11dec27c5 halomaps:3598 +desertdunes.map 8F77B526 27707808 262144 315d082760c68ec04447946bc5f629bfbe23f0b2 halomaps:5230 +desertdunestwo.map CB175F0D 30521636 262144 2133fee6ba2b55f3f0e68bea9e6ad4045c91a85b halomaps:5231 +Deserted Again.map A596CCF3 289518420 262144 5b465d1dda8add61740b72cf8e856e4f9112b176 halonet:Deserted Again.zip +deserted.map A4FEC615 28111791 262144 943842f0887d94e012d5cc1571681697d7d46c0f halomaps:3848 +deserted_beta.map FC69F771 25689820 262144 77582c163dfe71b410046977b5cb61b5c85421c5 halomaps:3142 +desertgulch.map 5EA3D576 153935208 262144 5e32c6102b7018016d21e1ee5d6724ceea1c0e4e halonet:desertgulch.zip +desertion.map 9AAEAD3C 21843787 262144 354057a9046ace85a2b2b3bb56652a3ca959d25f halomaps:3666 +desertland.map C99DF7E0 131697646 262144 d0dfc63771701076e3d7922e6325b34f527844c8 halonet:desertland.zip +desertpain.map 2839E9D8 16595920 262144 d93828464f7a484147def414f6fcf79dd2379a50 halomaps:2013 +desertplat.map A4793362 47075560 262144 1c8d4fe25a71a33c0b69b99e439232f63f902055 halomaps:589 +desertstormalpha.map 8F348752 23887660 262144 31105e8cfeb6f56388f1b00dcbf7ad7252099343 halomaps:1852 +desertvalley.map 8E4D5DFD 14698660 262144 a78ef42471ceae828e4c1dc1fe5d922df9ce467f halomaps:306 +desert assault.map 5896E658 32856560 262144 50d72fbbd00dd632ae3677efec78ba8e7b2139de halomaps:5423 +Desolate.map A4ED5076 19417052 262144 24228aa156cd52cc335faec8eb7928935858b395 halomaps:1907 +desolate_beta.map E2BC9098 28275100 262144 9067ab6ea2e6300277dd1a75120c74d1cbd83944 halomaps:2425 +desolate_keep.map 572E7088 21906018 262144 d76205e5a9ef1ad41f580de7aa5110229791b217 halomaps:3610 +desolation.map 0E7EF3BE 38237725 262144 136e2e2b4cb592f21a06b9cfd5f42123ac52be4a halomaps:5782 +desolation_Beta_ver1.map A0799CE1 29541264 262144 da0f8f723c97fc63c121620b8be4a2408cf28cfd halomaps:2603 +despair_canyon.map 9C713304 16800392 262144 d10616caa88923ff1b1506e2fc80de85fe5b2388 halomaps:2902 +Dessication-pb3.map 00000000 190393912 262144 96debb5d7c8d0382f6082fc37abc26fa1e6f5884 halonet:Dessication-pb3.zip +dessication_pb1.map A3825074 36900113 262144 014b80252ddb540d3776f735b783e22fe4989486 halomaps:4837 +dessication_pb2.map 48088E0B 36893053 262144 c6d07eebc69b5088290ca17d3611aa1b917bdfae halonet:dessication_pb2.zip +destination_v2.map 9D8DDC82 41319011 262144 49a6fb0dae899dff8b3553cbb51b96d76577c0d4 halomaps:3497 +destiny.map 9002E01B 21289860 262144 37665f0573538e855412009e20cd6db3f580a0bc halomaps:4681 +DestinyCanyon.map 4078091A 118693779 262144 163df5616c0e47f6181d83aaec3a337d9b9e0ba3 halomaps:6571 +DestinyCanyon_v2.map 690D29E3 114300835 262144 dfb7ab93dbb4ddb7bdd93bc764d74b0fa41f90ae halonet:DestinyCanyon_v2.zip +destruction.map EE7A5AD8 25166768 262144 a90833f216c1a7a38bb6b46bf1efe47cd4fed9f2 halomaps:5236 +destructiongulch.map 020BD3C9 53251997 262144 99292f015a74b2a032bfede84855ec8b8492bfbd halomaps:5244 +devils_delight.map CD3D578E 13035592 262144 225b3ed963d8845089b07d27a75e16f148a6b335 halomaps:3162 +Devils_Drop_Race.map DAE5E806 33843324 262144 dc60d82b24fbe2fb6fadb0000bce9c2f5e719d2c halomaps:2763 +dfs-bosque-abandonado.map 3CA54E44 23037828 262144 a785f04f6de3bcfb8ed0dff7ab53aa4137be0cd9 halonet:dfs-bosque-abandonado.zip +dfs-ciudad-spartan.map FF94709B 50720412 262144 ca7a7c9c7f4a0a5cebe5f641ef9c24b39a15f520 halonet:dfs-ciudad-spartan.zip +dfs-gran-nevada.map 63B3E58F 15609842 262144 0ad7b24664dd7b676a98c9a351ac309f40e61510 halonet:dfs-gran-nevada.zip +dichotomy.map 4548823D 22259500 262144 5fc6ab004fce74f3f92be0858e2bd21028c88a84 halomaps:4860 +dieing_forest.map F9ACDDCA 13725008 262144 09081bf372b8de809cf670ad0aab4702f0a9897b halomaps:2546 +dioptase.map 02DA8544 14164716 262144 b4356923a7741abc6187a2277c862ca224e1e094 halomaps:1331 +disco.map 5AC30DFB 36856375 262144 486121e73f3711b0da5fe19908d01a637b690557 halomaps:2790 +disconnect_beta2.map 7AF88DF7 50763396 262144 b182d01b2bb2e93b084434894404e24eac88face halonet:disconnect_beta2.zip +discovery.map 9B8F1690 43821731 262144 9296d5c821ac2bb418507b71cd4e42d0efc355f8 halomaps:2364 +discovery_final.map CC407E33 37812908 262144 d709681f535e46f24ba72ad5af2b78a74a4b0903 halomaps:2426 +dismal.map 086F47F4 38738186 262144 409b8edc7b35044ee2c55b282fe08acc7527ff01 halomaps:2969 +Disposal Site07.map 596D1ABD 26533856 262144 ed4c3b63897412882242e5e69e9cfbdd90f3e637 halomaps:3599 +Dissected.map 20E1B418 306603378 262144 56371f52a0368e9fcc7b24ddac074d6e3478f0f7 halonet:Dissected.zip +dissolusion_classic.map CF455E0C 45555905 262144 8bce279e4b9d92da9624c16c1bf52aa18b5782da halomaps:2385 +dissolution.map 2AA43FBA 25853607 262144 88ba6c35167435d75c624c78963ca5d9bf5b7777 halonet:dissolution.zip +Division.map 0E4AF52F 35678968 262144 46dc96685c74515cd04f873678fd024b044956fb halomaps:1716 +division_falls.map 1A1F1CFE 17503616 262144 16b109be3bb98529dddd0b1bf8980ffde1f1726a halomaps:1294 +djw-delta_station.map 57B0D25C 13354684 262144 f2e53dea3bef00c50297e12d087963921d51efe1 halomaps:221 +djw-pacman.map 3D40CB46 11349492 262144 53ebc065ceceb724b60758b677f940588384350f halomaps:1623 +djw-pacmanbeta.map 7D734EBE 11348652 262144 e776c869ac04efe49148d8eb633f0cabb05dcf1f halomaps:1611 +djw_alpha_onesimus.map F8BF70AB 36891484 262144 5275fab6fd9cca449be11810369718b24432a9ca halomaps:1806 +djw_alpha_onesimus_a.map C00771E0 36694212 262144 8eab0d0d11656e22cdd9ca968574c7968f521d53 halomaps:1825 +dm7fear.map 4AC71169 18211572 262144 435389e4d0de6db8422e754f2604c1cd1ebd6423 halomaps:222 +dm7fear_V3.map 10889D13 41236760 262144 f9d951b02f0277fdfdbdd9128d1113853a6af8e6 halomaps:2684 +dmap.map BC2E26B2 20136236 262144 d5e09ca03c9401c698520d125dc9badb45bda2e8 halomaps:2883 +DMCb30.map 5C85B6F5 115480554 262144 9dac9ab6d63677101ded873a394d97e48d02586f halomaps:4327 +DMfightgrounds.map 8AA46489 17658640 262144 10004587b3b8e57966a86d27cfa41f78b96bef92 halomaps:2339 +Dmt-Air.map A3F77C30 26410034 262144 a02238816a2a3700105cf27c7bf327f0cabeef9e halomaps:3820 +dmt-bound.map A4052187 46509634 262144 8511a37b396315cd04fce926bbf9e1cb19b8c90e halomaps:3468 +DMT-Broken Indigo.map 8E1A7F90 18731384 262144 87aecdc27b900ac0d1c51866d059e82202fa7dc1 halomaps:4114 +Dmt-Cairo Station.map F4C865FC 56821186 262144 9c78f449842eae8813c4d115cc075bfb38deab16 halomaps:4260 +DMT-Drug-Bust.map FE8E33DD 128664127 262144 2b55006b3aa396dda36b94a54017564501ed172f halonet:DMT-Drug-Bust.zip +DMT-Goldeneye_Stack-BETA.map 495DCA95 31126644 262144 fd1e0c24dbc14bdd5e7e91d55b81027a450b3343 halomaps:3469 +DMT-Neutral Bomb Canyon.map D0C01884 16901412 262144 e32594904092a249d1211009e9bef8364951c22a halomaps:4582 +DMT-Neutral Bomb Creek.map 8A66FB5A 14055556 262144 b04a3bd39ee36b9824c768ddf631f6e16257f8e8 halomaps:4583 +DMT-OD_BlowCity.map BE661B41 100477169 262144 86d308df33e6326e574cbe8bd14b6f491de27443 halonet:DMT-OD_BlowCity.zip +DMT-OD_BlowCity_Night.map 1CC24B07 103441697 262144 16327e48206c0e1393d3dafb0491c9b811dcc43c halonet:DMT-OD_BlowCity_Night.zip +dmt-od_crossfire.map 8BBFC3EC 126758233 262144 afba83a86d58905b1a3385b42513339eeea54936 halomaps:3697 +DMT-OD_CrossFire_Night.map B95BD2CD 108695159 262144 bc6e701cf42190d0903b0f2d414674dc066b775e halonet:DMT-OD_CrossFire_Night.zip +DMT-OD_CrossFire_V2.map D63325D7 107107423 262144 06e2a3e630054f1e263ce3374c303c68f89a8503 halonet:DMT-OD_CrossFire_V2.zip +DMT-od_docks.map 38A56820 99941892 262144 4f67ec63ba084cde033722ce737287b55047f6d4 halomaps:3756 +DMT-OD_Dustinteriors.map 1D63DAAA 89475849 262144 d9ce17c3545c12cb412e49cf19f0303d9fb73d10 halonet:DMT-OD_Dustinteriors.zip +DMT-od_hideout.map 180C8FEC 122956815 262144 bddc6b5a864b4aea124ec8ade330d213e0ff3a49 halomaps:3698 +DMT-OD_Hideout_fix.map EB6DA1BE 123002679 262144 a8e84564931f2036f0f72eaa4bfe7180569ca8ba halomaps:3699 +DMT-OD_NoRegret.map 0503AAF8 133552915 262144 fb13572ed47edc44a847fc130d9281f5c00e57d7 halomaps:3700 +DMT-od_outpost.map 736C6167 124550410 262144 cf45e5111fdcf5bc1d281e86008456e3557d9183 halomaps:3701 +DMT-OD_SP4_Upskirts.map 9A30071F 153203508 262144 418f5e5c68219d53d467aa080e87d724a49b4b70 halomaps:3722 +DMT-OD_Waterworks.map 601E6EC1 88768741 262144 932c387d38d690774f38da283d3700ea6804a56a halomaps:3757 +dmt-ohh-low planes.map 6E73ADED 12340016 262144 b874f648a3bed8ac40d15d4c43d6fda0f1929eb4 halomaps:4172 +dmt-ohh-timber.map 791B063F 13009248 262144 1bac56f6c59cc0446670aa2e77a615b9f1e0343c halomaps:4173 +dmt_racing.map AADD83EB 79069169 262144 9f3f8c70078ac646f4bd4ab375cb22de128300ac halomaps:3316 +DN3D hollywood holocaust RC.map B1106D7F 66940072 262144 b0e4040e355ac1a8c3346181985300703f5fd568 halonet:DN3D hollywood holocaust RC.zip +DN_Dangercanyon.map E3BC80BB 76599572 262144 c092e359d4eee2d955482b6b24330515bca047bb halonet:DN_Dangercanyon.zip +DNL_Path.map 76A7D259 17658400 262144 392ad0ed9f4271176a0f86f8d2bf6c8b6293525b halomaps:1997 +dodgeball.map C582B562 16786484 262144 56db6c08d5a71206b1f703dc5b8a0e8bf4776688 halomaps:6147 +dogs_of_war.map F47D9BB3 106164092 262144 159e5d6359ad493d6a8f388cdcb9e23c41507d7e halomaps:5327 +dogs_of_war_nightfight.map 9EA4799C 105517292 262144 f54daffe550fcb67b33c89545f686ca6b45d92fc halomaps:5337 +dojo.map 3D7E1FF9 16823020 262144 bc2d6a5e3e371cd1bb3746c35afc6d8ac8a43cc0 halomaps:407 +dojo_final.map 581ED67A 23053968 262144 6843995f1a047eba3e5a509d3d0a5b998299a742 halomaps:425 +Domain Final.map 5E0C299C 133541884 262144 9d8e19f5917bf4e0d24a0125cb90526786518c30 halomaps:4682 +domain_beta_2.map C5244CEF 118698688 262144 7835499ac8b20007eda1ad90f4e9e9cf02fa02a2 halonet:domain_beta_2.zip +domain_day_beta_2.map A714926E 124852150 262144 736f2cf53ea4e8772443a960b8c414fb428c6f1c halonet:domain_day_beta_2.zip +domestication_metest.map E9E30196 64470175 262144 c5a1071da4426c9a80e8086f917755d26e74e42e halomaps:2340 +domination.map AC06DDF9 17333300 262144 ccc109cb0167297475a6276fcbb1a19fcc9d3353 halomaps:3370 +domine.map 2D2D3DC1 19776764 262144 0a1c7bb652865004e8bac234d7127d2b4c1c7196 halomaps:3144 +donny_for_wirighi.map 6655B780 30333631 262144 09d96633ead85376ad35c3176c29db5b86cf4cee halomaps:6475 +dontlookdown.map 70FA8420 16065800 262144 80839c911a14008fe558b3d345ec8da29aad81b0 halomaps:5287 +Donut's_Mod_v2.map B7C73E68 75626665 262144 bbcd5a63697f6df5868debeff3c697f1570980e6 halomaps:3875 +donut'smodv1.map 57A26275 83843829 262144 0b7178dc26a3f1f5d125ebc8d414de341f66f66e halomaps:3563 +donutfactor_publicbetav02.map 72E8A728 16427184 262144 636101faab560299d45610f0c8ede32e39b12f92 halomaps:2666 +doom_wa_view.map 153D369F 86594262 262144 c9a547f29188830d0f94bf7d7d6cdea135fa496f halomaps:3959 +doomsday.map 6A342D2C 122322018 262144 2a89f3f4be527a598a3941872e1814109d9e5d0b halomaps:5561 +Double_Penetration.map 847B26E8 387508461 262144 241f050942f30e68e6ad7a76537e31be4f29035f halonet:Double_Penetration.zip +doublecanyon-beta.map 245B3F40 23371560 262144 684d987d012775130282826f87e17b3d0fc65b0c halomaps:5019 +doublecanyon-betaAI.map F5FA2B12 25170540 262144 55eaca1678e38f3823c01900d7887dad38a76c6b halomaps:5072 +doublefaced.map B8FB28C6 17531532 262144 2cbcbfdc13dd5f8802c3b10c420f6323ae48f7c2 halomaps:3067 +doublegulch.map 8853B4CC 20326404 262144 cdb066dfaed36a95e47bc624e738007a31d03cc1 halomaps:2850 +doublegulchv2.map 17BFE3DC 40609952 262144 96928eb506f0f5177ec76e29b67d92c2ca8fa4f9 halomaps:2949 +doublerock.map 1E3A5016 14844816 262144 e98632b700c1cc7271875c06c0a15d5a15bc0e75 halomaps:572 +downfallbeta2.0.map A31FC514 74809763 262144 d876337e4854cc7bb2b02a9137b7c9c0418446a6 halomaps:4981 +Downfalls.map EB5D4DC0 21279476 262144 d98601bb0644e37f0c23c7fcb446f9c4ab8e6ee2 halomaps:4454 +downflow.map 07B73D86 126166887 262144 7cc16ab98dd438b1dc44247d3c6c78c0cfd291b0 halomaps:2052 +downrush_h1.5.map 8F2A1335 13807476 262144 f1cca53d0d8d195bb0c9beafd289c00bfea4e99a halomaps:7020 +downrush_pro.map 8F2A1335 13807476 262144 dae261a57908685484406fb0ee66955b83d6b22d halonet:downrush_pro.zip +downtown_paintball.map E07653BA 90642799 262144 96e770a67babb9d17d51e7ceb5bc323d22af86a6 halomaps:4900 +DR_beta.map F536E60C 25392872 262144 651d91ed679b03455adadb654da9ef4755a8af54 halomaps:4537 +drag.map F5B9DB15 24270860 262144 51fd181d9cf1adeac9d8c69757e8eb1aedadd8a3 halomaps:1951 +dragonball_ce.map 00000000 48469176 262144 006e9ebdedba7134627242d0ca6d01727893c3db halonet:dragonball_ce.zip +dragv2.map 1ADEFB52 13787036 262144 6b09a86f257f1de4b70ee39a27d76e78d4adb4f3 halomaps:3937 +dredwerkz9.map 03ABE576 82881051 262144 f3072c1f7865b711ef9059657aa0ebf1f9c45a23 halonet:dredwerkz9.zip +Dredwerkz_PB2.map A2D7E021 74849188 262144 42ae0db665f38e948e935577aaf0bc4fd6e48a4f halonet:Dredwerkz_PB2.zip +dredwerkz_pb3.map 4C00FFB0 100142706 262144 53f1ce0f0a391403d09a1afd77481cebdf453198 halonet:dredwerkz_pb3.zip +dredwerkz_pb4.map 18C398FB 100202687 262144 ad4c9071cf45c380cbd343336c399db890aff584 halonet:dredwerkz_pb4.zip +drivegulch.map 003F66B5 23433687 262144 50e261a8b61e8ba906242b4a1ec8b15ef6ea871d halomaps:6620 +drknss-demolition.map 83240FC5 48775045 262144 1b60d5b6785387cb1dcdc2d82ba9514d3125cb12 halomaps:6341 +Drone-Gulch.map F2966A91 23783508 262144 2b8eb14a5ce6011a337e9d65284feee80a3bc805 halonet:Drone-Gulch.zip +dropzone.map 81EE7AA0 23673660 262144 7924876a09c44ed7ff67b0f1981daca93b963c32 halomaps:709 +drumsofwar.map 70EA3A88 14724696 262144 41fae06f41cff372f46fd0c8c778cee16fc8409c halomaps:3938 +drumsofwardestroyed.map F01AFD52 34727358 262144 cf857b61cb8f2d89fdc9203d186e55d9948841d7 halomaps:3960 +drunktank.map E3A2E513 20254281 262144 eb6f2f8955d7625333d5d017ed2d9ca581e4c90d halonet:drunktank.zip +dsmt_dreamtrap_classic.map A7F427FD 54659948 262144 0f6cf6430b8effb9c337c8710cf7a7bb34a9a7a0 halonet:dsmt_dreamtrap_classic.zip +dsmt_dreamtrap_modern.map C4BBBC4D 118282341 262144 0740eecc9ae610e570a6b00a5bcc32db0a2bf230 halonet:dsmt_dreamtrap_modern.zip +dsuclanmapbloodgulch.map A3BA8AEF 39942652 262144 41c82226cca9735c65a02e501fde46e19f8a2564 halomaps:2156 +Dt-Battlev2.map 695C8A48 130463130 262144 63ea313d4a94cc7377ae3a279a51c40781208382 halonet:Dt-Battlev2.zip +dtfo_hq.map 88BC9214 19885436 262144 9969410123997ff1f9b1c7519c04a209138482ac halomaps:3581 +dts_ascension.map 67C63D95 82482772 262144 8f93a66cb32a2442a8219f9695da640757c7be0e halomaps:4598 +DTSP.map 88E405A1 82681566 262144 f84258f7815df2380ede4ce124f1d163fb6e5858 halomaps:5177 +dualing_keeps.map B1A26446 20609392 262144 f4afbc8275d5cb0379dda2c6c0d12f2a84f3aa14 halomaps:1118 +duality.map 209A54CA 76145201 262144 c956e7a0b99fa271039936fac4df42379b821d2f halomaps:2427 +dub.map F18E79EE 13145256 262144 5f1a43535ed3105b4bee7d3658d567100e3645f4 halomaps:223 +dubai0,3.map C742D81F 174547672 262144 8b25a775bf52150e66ab6cc08e4b92222f42afb8 halonet:dubai0,3.zip +duck-hunting.map C3A2AB0E 17805990 262144 1246e5a84fe9b2fb85767199eaecbe84f09ab23f halonet:duck-hunting.zip +Dude_where's_my_BR.map 28508909 81004633 262144 89516729fc3bc6f7ff4362a146ece3cbd193e491 halomaps:4967 +duel.map 0D8035AB 25116576 262144 524fc30b6ecef128638cb716c27408aac83f58fe halomaps:5102 +duel_to_the_death.map 061204D3 88941910 262144 c48bd1d404093960e093a50c5fc965f28e8b03ef halomaps:5870 +Duke_Nukem.map 18070350 260184588 262144 1583d097ffbd25cc8c78f21d95cffd98da516f86 halonet:Duke_Nukem.zip +Duke_Nukem_Fig.map 26CCA269 260184668 262144 3f1faf322dd355aa08ca608e6e4a0263d380fa27 halonet:Duke_Nukem_Fig.zip +Dumb_AI.map 60514B93 76179609 262144 0ec4bc4678ea3b3d877449580dfe2d15eb396be2 halomaps:6194 +dummy.map 53400EF6 31418708 262144 7bb9377447630819a8257d3c63848d317ba2b527 halomaps:3479 +duncan.map 1CFA7678 19171301 262144 622a0071c6d186e6e587ab1976ff762f7231b5e1 halomaps:4538 +dune-race.map 06D4D19F 19998516 262144 a39b099fb58047f4e2bcaf9e0bb32fc1adf98108 halonet:dune-race.zip +dune.map 7043CF6B 15876988 262144 4b5e4f48b383671b7fc4f22b0cf1036a8e24915f halomaps:302 +duplicity.map 9D8265F3 42294411 262144 5f9331526d53061c18fb2d411da69c912878fa61 halomaps:2191 +dust_spike.map 511B6207 16770237 262144 c4613637318ec78e20460ef5c36153d8ff8fe7ff halomaps:7102 +dustbeta.map 7CF2FCDA 79957470 262144 ecfb22845dbafc8961fa1e727efce1bd144fcf88 halomaps:6824 +dustbox.map 1409DACB 24807640 262144 2798bebb6ecf3ad85710d856a38cfa31c1fa019e halomaps:7073 +dustyle.map 4FEE06BE 24894352 262144 a750744bba1529e27cf250c04c1cdb5319642098 halomaps:3531 +dwm_disregard.map 233DE62D 77100475 262144 fddf98857f021fa820b4dc074f8bf3d71b1fdf87 halomaps:5369 +dying.map F840E57B 21967356 262144 3d074593a8c23da393045f817750dd754ef285b4 halomaps:2716 +E.D.S.T.mission.map 55006FF2 127031484 262144 820416c3384b8a7b3c4597308823cc5ff7a5c3dc halomaps:6279 +E.S.V.map A2579255 33416195 262144 ece982b5084c70fe5816b47df3ef1ce6559bb7a6 halomaps:4324 +e10.map 2FC4CFD7 181013576 262144 821c89220014683a57096b9cb5633de59bfae1f6 halomaps:5345 +e10_demo.map 285C90CC 169864380 262144 e06c79e7ef6b5b6dabfd6a980f60fc68f4d28c94 halomaps:5233 +e20.map AAAE7ABB 123216074 262144 cf8e0ae7451c74fc162efd9b3f9b4a63a429a57b halomaps:5344 +e30.map 1328E3D6 110321062 262144 e0a469faad361573a51db0482370f8b8ba5d6155 halomaps:5343 +e3gulch.map 5AE96A14 54382739 262144 8daa0e013937645f3007e4a9548bf5176bdb1d9e halomaps:3405 +e40.map 4F182E1B 141044469 262144 c7fa58fbe6ce9e8abba8260f5ae141b65bbd4fde halomaps:5342 +e40_demo.map 3480C44A 117842156 262144 24c6415c134a5260440b11d1bfd3c503c0085b5f halomaps:5201 +e50.map 35BB6E22 122406962 262144 fd35e21bd18e30a15f1830a3a2c96362d636d186 halomaps:5341 +e60.map B0B0C31A 251715501 262144 9b690329e952801a4fba2724741bf16b535d9ff0 halomaps:5340 +earth-firefight.map E76EDC30 354659283 262144 e7c295cd30536ceda4fec6e33c0a11a5a1996345 halomaps:6921 +earth_canyon.map BBCC1BF4 28280320 262144 65799bff74034ae8f2fdb75b55bbb1ced067dacc halomaps:2717 +ECD_Plant.map 9D6587B2 44090420 262144 dd6b2de64a5fedb0105c1cc3641fc7287d4b8f2b halonet:ECD_Plant.zip +Echo_419.map A95F9AA4 133402152 262144 cd575ef27f1318ddd33b17114690ed3cfbfe308e halonet:Echo_419.zip +Echo_419_Foehammer.map 63AEC202 133407120 262144 76a42b0ad72fb442719ac39eb534cef0b2bf2cc0 halonet:Echo_419_Foehammer.zip +echo_canyon.map D279B484 14754544 262144 ec7585a59f49c5f56b4e8a72d18991dbe079100f halomaps:2127 +Echo_Hills.map BABA0FFC 128301101 262144 f85491fe89de3549387052cf007d2525fad65b48 halonet:Echo_Hills.zip +eclipse.map 4858BFAA 43243029 262144 3de7e847484811c5bccb8b4659a782a6a8c59e73 halomaps:3560 +ecocreek.map E40983E6 13100776 262144 e276b56f930abbb8bbc1aab49b0418240bfefb80 halomaps:3758 +eep_scarab!.map C45FA85E 40891994 262144 e0577d84eea8a54858e22862ad9144fd0cc7ad9e halomaps:6310 +egg_fleet.map 12198D32 14862885 262144 87b1312e8ec3440430dae87d2ddec808f7634b0c halomaps:1078 +eggfinity.map 5C540808 28599154 262144 6cef3e188487d698a0dc353beb5ca097e67802b5 halomaps:4115 +egypt.map CA5ECEB8 14704113 262144 4d5e0ef8754d7ce9320fde90c8370a913200d2b0 halomaps:2341 +Egyptian_Secrets.map 8EE05845 401628011 524288 ba6e570d874f305e024ed6f1d4255366af594113 halonet:Egyptian_Secrets.zip +ejvh.map 86E7512C 53027384 262144 2b70ed102dfb20d4be4762f42561e21146ce071e halomaps:6621 +el-horizonte.map A59D3B70 52705541 262144 c7fa62dd2e38575cebeff3b08ecaa2c045ae89be halonet:el-horizonte.zip +El_Cartografo_silencioso-parte1.map F82F2D71 121559186 262144 a1d5c6d6a88d22a15c712c56fb045ee6939a270e halomaps:7074 +Elara.map 7AB89072 23228702 262144 67ff8f57507b21d697c65cf3b02fba08929d3f28 halomaps:6922 +elarav10.map 047CEEE7 244194101 262144 b8e045ddf8fc42292bdaef307a6f0d861eae74a9 halomaps:7103 +electrica-beta.map E9886391 21746606 262144 f069952881af800ecd909eccaa91b6fa0e61550d halomaps:3582 +element valley.map C43F1B2C 21659533 262144 33fbc3062604aa8c4a3e60281167c4ed6262f9e3 halomaps:1100 +Elite_Alpha_Siege.map 91380C25 59280439 262144 87ce5863bce5cd3d5f4e83b0f2867157aa08346d halomaps:3658 +Elite_Alpha_Siege_No_AI.map F62F73EC 55198039 262144 ab0b7200bf49abf1a441f343873bf1eac9ebe49b halomaps:3659 +Elite_bloodgulch.map AB3AD629 25873114 262144 8e8463daa26b6625390e0b0e0ae2399f2e95d99d halomaps:5405 +elite_bloodgulch_style.map EC72C924 56156693 262144 e46647353086d8ef6c2d740183c29bdb3bcbe9ef halomaps:7044 +Elite_damnation.map FF9FA13E 222983771 262144 3c44f670e928d33259a8993df56a32948022523c halomaps:6825 +Elite_deathisland.map 58E2A04E 31647630 262144 2e7dca2f5d866e7093b1eec13b4a11c37966638b halomaps:5410 +elite_fight.map 7CC8D7A3 65598252 262144 30e874c09d58f079da6f52dab39af7f634e39d40 halomaps:4683 +elite_island_beta.map 1928EF15 24033148 262144 168a152b6521e06e1c0866b84c9d9c2ee760a92e halomaps:5686 +elite_siege.map E252D2B2 20678280 262144 2feac9b5b801ad28e214743fb559893833329442 halomaps:1853 +elite_timberland.map 30DEB7AB 98298184 262144 1a695aeb7ac23235af1103d5e0d8b24925578e51 halomaps:6826 +elite_tournament.map 1B0ABC31 22448832 262144 aa6dddbd69eab6d8861c3d93218241c2809774f8 halomaps:3193 +elite_wars.map 6FD8300A 32623465 262144 bb56cb620a2646b14c1f87c9f1710cf0aeb031f0 halomaps:2919 +elitegulch.map FA1BA122 24702582 262144 80d172138669c6bb2175767cabe361623aa6d67c halomaps:2365 +eliteland.map 130E42F9 23530519 262144 f55d82c6e50047ac3be61e98858f504c194f9cfe halomaps:2085 +EliteMassDeath.map 81B18370 19751998 262144 c13b6ef33d9634e1d9c1ca57a1c4dbc242f0c534 halomaps:180 +elitemidship.map 840206C3 58254744 262144 bad58dee85c98453206cb9eca5e7bc9cd27306d4 halomaps:5838 +Elites-vs-Brutes.map 00D7C43E 64659640 262144 a5bee926e33f5dd7f7f3d19daface163b18b9405 halomaps:6250 +elites_vs_flood.map 4602FFB7 86934578 262144 fc88e8c22f5618b2d2ca47a66d1613bcd6ba26d9 halomaps:6048 +elitesvfloods1.map 1FF32C43 90100451 262144 11af231565c9684263874a99e9b39e4050767f92 halomaps:5991 +elitesvsmarines.map 853FF3E5 66548959 262144 0fa7f1251105f5e28addb987a55204283153bb06 halomaps:3667 +ellites.map 90A08CE8 50600136 262144 9be45f9ad5cddd9736de6e44b306d209f2bf769b halomaps:6354 +elmo.map C8BF2180 22843860 262144 1102ae7781ff55e843ae4b874cbfdb7f60ef3a6d halomaps:3912 +elongate.map 2D70B400 36238601 262144 c9eb57f4e4c7daad8822f5abb67bfa60ca362e4d halomaps:6867 +elongationnoai.map 4F2243DD 23606065 262144 96d41da252976a2cf6dc88c06bfcaf817246a597 halomaps:1807 +eltes_elites.map 4C7DE2E4 49674724 262144 1146a159e1f94144c2303048f2c8df1c9b01cfe6 halomaps:5979 +Eluded_v3,4.map 60D2649D 75134297 262144 859d5ad34cb36ecddfcf44d33ff0a0605df4f3a7 halonet:Eluded_v3,4.zip +Eluded_v3,5.map BEE1AC13 76212137 262144 c20bc931eb1a4cc9563a3a9dc0495414fa81fdb8 halonet:Eluded_v3,5.zip +elvira_city.map D037E841 34674120 262144 9a74c3b8d33bf2cc1f0fd23b182026831610b2dc halomaps:1029 +emerald.map FFC2C054 99859815 262144 dfee512f1ba729a3bf9b7c9397e3d1564c5b570e halomaps:5961 +emerald_coast_final.map 2A13E571 22404052 262144 94480aa82e99665b82bc063a51949cd509ff7436 halomaps:551 +emeraldbeach_beta.map EFD0EC6A 13037536 262144 750816f0dfd55946da0262fd98e089f30c281fb8 halomaps:1808 +emersion.map F2FCCE23 129302514 262144 ad9d04cebaaac130718168d0d2e5256eb6deb4c9 halomaps:5890 +emersion_2.map 40284DBB 132519442 262144 3819d9b0bac4b2dd79e689decfc4e358a9e69114 halomaps:5906 +emt_cliff_drop.map AC97617A 26214203 262144 42e8113e71dc5d2a4f9b57c69b61f5508a4a26ca halomaps:3168 +EMT_Inverno.map 8A9B719A 33371871 262144 119ccbe539d76035569b4342ce2f8c1ef15e6adc halomaps:3480 +EMT_peewee's_playhouse.map 35442C5D 25669307 262144 14565a1b7721c1ffec6f1a7cd87cdf1064274859 halomaps:3194 +Encampment.map 00000000 319014923 262144 9d0c64fce9248b57229ce64edf42ba7bb8c9ea39 halonet:Encampment.zip +Enclosed.map 54E95C68 22311252 262144 57dcc0bbf4d19ad5ec1671df58201552a7df6fae halomaps:2604 +Enclosed_Battlefield.map 18981655 33289708 262144 0739294c3522882538faab1385b005f0767dd66f halonet:Enclosed_Battlefield.zip +enclosure.map E08DE109 16854469 262144 3325dabd9b4c9e096c7a4b74bc5a57b17d941e0c halomaps:4277 +Encounter_H3.map 40FC33E9 102632983 262144 3cd179fe934aabeed1b943ff47aabf96a83925da halomaps:5301 +end.map 092A7400 154837878 262144 b3d68d4e02bc5f937de14e8bbb9a56d5a1f889a8 halomaps:4574 +endurance.map EFCC9175 21794314 262144 336ffd2f8baeeadc5a0f70a60d8204ea29e29005 halomaps:1697 +Energy_Swords-BeaverCreek.map D0F86A3D 14383721 262144 2c98a9c146a4eb0b4a6cefafb3b6f6e6e6b556f8 halomaps:1584 +Energy_Swords-Wizard.map 4F0704EC 20783633 262144 5ef3914deb5932a012ef99b31b3ab8f9cf94f7d0 halomaps:1578 +energy_swords_test.map 00BDAE3F 26410157 262144 a7de4a75feb2a777bb4ed3ccd055b05cc670d7a1 halomaps:1181 +energybridge.map 322A5889 12433676 262144 4b3e6f34ca44fb44d02bb883629244b4472cc203 halomaps:2984 +engiegulch.map 11FDD343 57856127 262144 c27b595ca03224e492fcce9673daa6b816bd1749 halomaps:6476 +engils01.map 5944D8F0 50433050 262144 ca15defdff2c1809a27187a2942b18d2fb1adaaa halomaps:6454 +engineroom_beta.map 2B43ADC4 57864321 262144 2c73ce195efdcce4db14bccea020600554675726 halomaps:631 +Enigma.map 30E337FA 19450148 262144 00340fddb7caaaa6f2cda712ddc0572fe33e62cb halomaps:6517 +Entombed.map 18552038 14172136 262144 2a7a6a7edd78dc3a947d584c42249f9f12c36731 halomaps:3195 +Entrenamiento-Spartan.map E37A77A7 385033214 262144 d96f3bc30dc132850b545273aae95e7da92de4c8 halonet:Entrenamiento-Spartan.zip +Entrenamiento-Spartan2.map EB1F8DB8 242235014 262144 f5cd41c73154c866d6b8fc5f380974e07a411bb0 halonet:Entrenamiento-Spartan2.zip +entropy.map E4E47EFA 16034200 262144 203053d384194ed2bb74ce5499884a1de91da831 halomaps:439 +entry.map 3B678DAE 23840975 262144 d5d56a7786ba0a88819cb1bba4c1b1f292e634dc halonet:entry.zip +enush01.map E04F47CB 50433046 262144 286908b65eda57ed5f0ae554280bfe0e294ae583 halomaps:6455 +EP_a30.map 05DA825B 110294150 262144 9403feb05809c912b8949d4afdbc226ec9798778 halomaps:1984 +EP_WINDER_beta_1.map C719D60E 82681253 262144 bb561d188cf518972b1f2d6e42ecc3cb130df1cd halomaps:3350 +epic_canyon.map ADCCC0FE 25420605 262144 afe1eac17916acc1b639828dfe64e1d83206837c halomaps:5668 +Epic_War_final_2.map 75E27081 37472513 262144 51bc786af55d2ea21c38d7e3f21e962c218c5c59 halomaps:4937 +epicenter.map B0180C57 45195968 262144 92a6baeecd0dbb5e3ab05e8f238ae0cb932b07e7 halonet:epicenter.zip +Epidaurus.map 4A574D6D 31183374 262144 396d883bb3ff11a6371e6dc6e0206860e1721ceb halomaps:1188 +epsilon.map 198DB4ED 14476898 262144 e0559c48d13359d961c7d87630a4aa80ce6f08bd halomaps:2122 +Epsilon_Alpha_v2.map D0E23A86 109131382 262144 5dcdff5390ab0413e753a397d3942afa0f3b9fdc halonet:Epsilon_Alpha_v2.zip +epsilon_sp_final.map 0DEACA61 168672492 262144 7be14fc5768c4491dde3f22d5e59b8ed3a06481d halomaps:5565 +EqualEndings.map B956EE97 18456072 262144 2c282c43a65755db93583f047144dba94e0ef487 halomaps:4617 +equilibrium.map 7E706156 27357780 262144 43260e12f0e34a711873664c790efab461c4520b halonet:equilibrium.zip +equinox.map 68308C14 32327352 262144 faf765214fe07e7081e2f0d757ec147183aec777 halomaps:1899 +Equinox_V2.map 4230CBFD 31949392 262144 99939dbf4e81f84866246565a9f159f3f02c3e25 halomaps:2632 +Equinox_V3.map 68455588 67846845 262144 575ca7ab09fc088c554814cefd2944f0768f098b halomaps:2738 +erasus.map 8ABD43FF 52851435 262144 471f990f020474150c2fe9861a88b942daafd646 halomaps:6456 +Eridanus V.1.map 40E0BD0B 172041605 262144 0a95131dfcd679865d04e210ebae407ecfe47921 halonet:Eridanus V.1.zip +Eridanus.map DAC88A46 172037757 262144 981472c2609b0152ffe47d649cfa7d6c2b16b188 halonet:Eridanus.zip +erosion.map E0E403D5 30506240 262144 2fdbdf3c3fb747650b446d35c787f77c1619eb74 halomaps:1900 +Erwangulch.map 8827B33B 53556283 262144 ed08cd4063bc7bd5d8d51a85866ddf0c82d0ef71 halomaps:4618 +Escalade-Mount.map AF22AEEA 19823072 262144 dd00d8e0b4b2152ab45a4a5e8f94758f1da55464 halomaps:2605 +Escondite_de_Escobar.map F749020A 256815884 262144 2e088dadfcc2d94c77cec2efc523a28a295128cc halonet:Escondite_de_Escobar.zip +ESF_WAR.map 933D199E 13952960 262144 a12f4dfb03b91781b493a1268ff32be92cbabf74 halomaps:3337 +esther.map 15FCB800 106177959 262144 7d962571520f0cd984bab3e4c241e995de6a5c39 halomaps:5924 +eternal_pb.map 27BCDAAD 64050679 262144 65167ed71dbe57a96b6bda23d1ca0ce1f90b3615 halomaps:6827 +Eternity.map D51471F3 120200526 262144 b17d8d95d683fcf5e0b53811e7a7934d94ef40a9 halomaps:6622 +Euphoria.map 069C00EF 130454832 262144 27171969c3a3339c9630e5699c0015daacceccd5 halonet:Euphoria.zip +europa.map F329F1AA 12643800 262144 aa45be2326409f0157a18483252d41d6796ed593 halomaps:2739 +EV_jump.map 5F956F7A 15034988 262144 0bf41a9190e60b96996f12a74f2023a28a59b715 halomaps:2086 +evasion.map E7FF116E 186183087 262144 cc5ba323f7730f0d117692c59f175f6a9042e25e halomaps:5509 +eve.map 2BC66163 14890136 262144 976e4d6ddf4ccf02e86bbef3228640732b614b25 halomaps:4584 +everest.map 6C51E68B 12830972 262144 664fc9c6de10da6366b332d0f986f1eeef943c9d halomaps:2065 +everythingthateverwaslel.map 97E10C1F 90876828 262144 4b665a6f222462298287f005c4c2f7968a06a65d halomaps:7053 +Evolved.map BBBF7C39 19579610 262144 43074a446eea3a82b3f6c3a91739f6df22995497 halomaps:231 +evsg.map F2757EEC 29207024 262144 f6a81892eaff798c02657577c3a035a4ab44f43b halomaps:3082 +evsg_v2.map 86C5E69D 31533561 262144 8361cca4ba9132e8f1f7493e9d17b613860f7154 halomaps:3145 +ewok-remake.map 1103B555 80479374 262144 7e1a06b87c8348553f6296ef10c18f2653aa1ca6 halomaps:6923 +ewok.map CC60FEDE 21096424 262144 bc4cce199b2070b90afd0c89e74e8edca3d5db91 halomaps:486 +Excavation.map 508545F0 32071770 262144 be1705634afa5b77e57611ac56f776c47fdd0204 halomaps:1473 +excrenation.map F6F89A1E 30396312 262144 87ca467e613ede60a06b538cbb37bcad6b00790a halomaps:1926 +exhilaration.map 852F3686 18918456 262144 99800d6b22282ee761e075057150991ab37c6768 halomaps:683 +exodus.map E05403C1 127052996 262144 d005e40930a3f94cb4f73a1345ba3d2fa2885cd9 halomaps:5891 +experiments.map 1425DDCC 13695104 262144 be044203005b9ca0636ba0dd623d1ad3aa9f2d88 halonet:experiments.zip +expertsvsnoobsv1.map 92F6095A 16162292 262144 5942a89e278b88ab7f016e880575db998f78f68e halomaps:6675 +exposed.map A18D79A7 19280648 262144 c1aa8e484669f98925b9803f24553056c8cb3790 halomaps:2169 +extermination.map 19BD5F96 12820300 262144 57fe6210b9e222c26f9e5d27a9876bf5411c0298 halomaps:3481 +exterminator.map B8FEA658 15338359 262144 4e907386fd6ece5de4251eb3a0be98b70964af86 halomaps:3331 +exterminio.map 2EC783BF 64993598 262144 b19bbc318f54a1c20c6a3acb79813ff0bbcddc54 halomaps:6062 +Extincion_v3M.map C5372723 97888771 262144 08d79c73dc004d51301b28e19f51940c561f6be7 halomaps:6590 +extinction.map C5372723 97888771 262144 ae4122c79fe0325a26189a0938bf03054ece45c3 halomaps:2040 +extinction_ai.map 19E387C0 133975138 262144 038fd555fcbdb73a72f1fc89087e9da63fce61db halomaps:3961 +extinction_ai_nightfight.map D40DDBE5 133681674 262144 664c6b95702a447514a87d71f31aa4125036438c halomaps:4194 +extinction_mc.map C91994F8 97876659 262144 b3f6e3256f558824a13bb5b66383065ea3d05382 halonet:extinction_mc.zip +extinguish.map 2D5E5DD8 14886576 262144 f226be8e1a776275ae11842e2b5582a6585063b4 halomaps:3317 +extraneous.map 582423C1 54831553 262144 741ce83d75bbb6546f7063c5506493cae3911646 halonet:extraneous.zip +extraneous_v2,1.map 881E4679 57299585 262144 5e096a8bc730660d845ca1811c63489dad1daf92 halonet:extraneous_v2,1.zip +EXTRAS MENU --- alpha.map D805C9BC 25004775 262144 3e8be8cf8964072b3d39e30eb26ca1cab2215309 halomaps:4428 +extreme.map 3CAF3BBD 24349102 262144 33f3dfa765fd75cdc4dacec85ec6f1b70464c8a9 halomaps:3403 +extremglch.map 7B309554 13936092 262144 dcf156ace9bc185701f56d601ffe1b454099e736 halomaps:1275 +eyeland.map 6F0AFA03 30673621 262144 66cd6e0eb5e55311bd3d95f718c4a5eecdfd3315 halomaps:4968 +f25.map E94872E4 395251310 524288 48c3247ee8ecb16b157a433adcb5a097b39b4d65 halonet:f25.zip +faceoff.map 095F2484 14640052 262144 a999994ba7668a7aed9e8412b580fa68b57d2dc6 halomaps:866 +Facing_WorldsFB.map B8905985 15633508 262144 520a3e9ee5364170dffc755841c5fd6167bef285 halomaps:232 +Facing_WorldsRX.map AABF6F70 22473864 262144 e540a91fd1c4b0cacfaee608e947a41b99ce0a28 halomaps:2774 +facingtowers.map F6EC043D 27578145 262144 be7e786500c2996cfae13213bbf68ac90eaccc95 halomaps:3382 +Factory.map E18B77D3 14893820 262144 b2c4bb4c32ed741fd9d6a314ce4f36cbf21e0c85 halomaps:383 +faith-hope.map 10184D33 38823466 262144 065d83a70a372ce6020978d396044556abb15d2a halomaps:4153 +faith.map 204D54B7 13081248 262144 3daefbef24e6406f23e0dd59240faec519aa00af halomaps:178 +faith2.map 06D05292 14057632 262144 511b3db0e01cfee487d7fe243c262bd182a7418e halomaps:497 +fall_of_reach.map 8E4D7BF8 146328238 262144 b3e96291aacd1b9fc7e6eb2f6df9b9bb5435e6cc halomaps:5945 +Fall_Spartans_Hex.map 5532F0C8 35638183 262144 00756c8be9a58d4b6f3e252df6ba71f208a6af0b halonet:Fall_Spartans_Hex.zip +Fall_Spartans_TipToe.map AC826BA9 36918927 262144 4db529254013b25375e94c83e902d6d09c5d10ca halonet:Fall_Spartans_TipToe.zip +fallen.map 0C39B497 40919472 262144 abc007afcf8482426106f690d0cac06764b1d509 halomaps:2775 +fallen_timbers.map 4D24F79D 14953544 262144 e91996a0a9cfe9442af50e551e9d6d902267548a halomaps:554 +falo.map FDB15D6A 17107433 262144 025ca6b9884fe520ca45825f47aa734cd113028f halomaps:4670 +Falujah.map 8EA0B64C 63515679 262144 ba1200f5067a731eddd7c66b57f689337c0f9ccd halomaps:2076 +Falujah_1.2.map 04E677FA 61803432 262144 72a7f9e06025137f40aebb987093e703d8d66e95 halomaps:2087 +falujah_zambies0,3.map 3A35382F 49279499 262144 d4dfc5c518e6cdb74fd48ca84d28bd97897c5eaa halonet:falujah_zambies0,3.zip +farlands.map E872BDED 73024889 262144 2ac8adbcead453e51b74b975c45403e38bab33fa halomaps:7061 +Farmington.map 9B03831A 289231510 262144 ee5c5e66be2e4bf1622e1f0093e3cd356b2ac9a0 halonet:Farmington.zip +fatality.map FC2C2ED6 17018052 262144 3ff942dc2e166fd3df51e4058dd87cb3a90ac510 halomaps:2793 +fates_gulch.map 787BE8AD 20279648 262144 1a03ad64c3c6f004d1c95d059b9a471e42bb5024 halomaps:2989 +FDT_Gulch.map D8BD853A 16055760 262144 e3e100781ff76edd2510c3f62888f30cd99b0118 halomaps:6924 +fear.map 775C1B3D 16827000 262144 c9865380db67e30f44f875b9b8d6a91f1594ac89 halomaps:3748 +fears_of_jeff.map D2872165 15579312 262144 dc062706f9d6220e7e431e908d51593eb34c1af1 halomaps:2366 +feedeath.map 47EA6B1F 70404645 262144 0ff0249faf980f94a309ed8e38bd685f8d331576 halonet:feedeath.zip +FeelGoodInc.map 2D9B9846 22120153 262144 c63342ef17ad978c98e70fd10825b0f23376aa41 halomaps:5424 +Female_Hot_Zone.map 36A4CC9C 238022800 262144 7576dfe9216dcfaaf6ac7e8802ec5fd93edf339b halonet:Female_Hot_Zone.zip +fiddle.map D88BA47A 20848937 262144 9ed35c429eaf147173f56b21d67c5620824182ff halomaps:2851 +field_of_death.map D426D7A4 24929672 262144 8dd3533b28acecb503213b2adb13ce2b9679f951 halomaps:3196 +field_of_war.map BD5516D5 38045966 262144 a8f645e4fb94875c02c2ef44f7385f0af212cf3e halonet:field_of_war.zip +fierce.map 57436123 240189495 262144 ae26dbb1b832872d4783595425b76a79f25c01d2 halomaps:6743 +fight.map 9FADF5AD 14425812 262144 ed486c292e08a049688b1fdc7308bfdd9c881f9a halomaps:4154 +figurehead0,7.map CC2B232C 279008922 262144 58a00f031c9663e91e078a65757cad25ee922be5 halonet:figurehead0,7.zip +filtration.map 7951711E 14188576 262144 96ee1fae71da94c312e174a22b85d7bbfd45f055 halomaps:3228 +final-airlock.map A8C35E90 390495986 262144 de094172d980c9865d46428c1df0062cc0a6ddf6 halomaps:6966 +final_control.map F021422B 20888665 262144 5160d0bc221a5dedcd47510b98a358cf10987ecc halomaps:4508 +FinalFight.map B12C1E6D 56469343 262144 e8d692078107134669f87acfea324eee678e1b0d halomaps:3508 +finality.map 1FE15A71 39120445 262144 478dcb1a398e84a1a66ea10c7aafbf348b1590c5 halomaps:2547 +finite.map 1354764E 15025736 262144 a79af76f072b59b0a9fb083ecf5d90547aaa0783 halomaps:6833 +Fire_Cove.map 7FC013FF 16846028 262144 8f6d9532cd17db14309666c2260f20bd8697d4e0 halomaps:1199 +firefight-airlock.map 541924B0 80586549 262144 de6621073215827a398419d36594b6c634c9ac80 halomaps:5170 +Firefight-Amnesia-Demo.map 762B0611 331297324 262144 bb25840356645fd14e83150c684c434d45c358c7 halomaps:6747 +firefight-containment-Improved.map A3602F55 333230968 262144 c2046a5a60604f41007b9cec8a7a05b31463cdcb halomaps:6869 +firefight-containment.map 87DF09B8 347472247 262144 e62c93751982cf34f32d16c356a0d86753dc9708 halomaps:6868 +firefight-cryobay-final.map 07BBF8F8 228468578 262144 42a5fc272189d0fee84f6dd3174b1773322696ef halomaps:5477 +Firefight-Descent.map 558C4B74 302543994 262144 d794a20b6160a5c95c252657794fa584f8ed527b halomaps:6463 +firefight-fissurefall.map 32508D9C 128065813 262144 57b83ff8f06e223880d83bcd912e3d0529cd01ad halomaps:5704 +firefight-infinity.map AEF9E8EC 401095276 524288 aab69cbd27d9a72474003a6143b583fb962676ff halomaps:6870 +firefight-portent.map CF946835 198190209 262144 feb82f828d632e075b96e810fe89608ba54692f4 halomaps:5336 +firefight-relic.map EA2A2414 381234287 262144 0387b81a7d4f6fd7871af3fe582f1d3e527df035 halomaps:6925 +firefight_ascension_h2.map B9751A92 174282840 262144 038aae7f754e2f19528417ca3e31b80d74e3c233 halonet:firefight_ascension_h2.zip +firefight_infinity.map C9623A48 21428080 262144 c91ec269225a4abf96151822cbd69904da32e138 halomaps:7104 +Firefight_OmniBase.map 496CC10D 178320470 262144 561f112afa5b312e30d4baffd92b25326d416d19 halonet:Firefight_OmniBase.zip +firefly_beta.map 69B3F0E0 20332232 262144 ca62e82fc6e5f2486d33692cdca14eb59e7597a2 halomaps:3564 +firescythe.map 0BE631AD 23584397 262144 7cd8746007612a22a2d60400896772b0fda72fa5 halomaps:1189 +firewall.map E8EECE1D 13038392 262144 329de298d025da3508385ea6f63fe12fff8adca2 halomaps:2970 +firewing.map 9257899C 68205753 262144 b4d3a77c8b7a15f114f0893e1cfc6f4756bd8ae4 halomaps:1596 +first.map 34AE77F3 21529728 262144 8c1e50e3fb600dba8044d41680baf28b04850249 halomaps:2497 +first_fight.map E39FF0DE 81806443 262144 817a529b4aa000e622350f7fc8ff02ab2ae7fb52 halomaps:3913 +first_map.map 8635D02E 103795496 262144 102a74d08dd23efac66702405c6f24a2d0c5628f halomaps:5406 +first_strike.map 44807A12 28175564 262144 f075c39f1b1f938517ce2e6025dcde01a0505a9c halomaps:2428 +Fishes_City.map A7F71F7C 26051276 262144 695340f88b01785cf7a061eab417fa8c181cb3b2 halonet:Fishes_City.zip +Fission_Point.map 26FEABA3 27338114 262144 0a0e20f6e4004c291a29cd5131408ba3499ed0b0 halomaps:710 +Fission_Pointed.map 641AF8D7 26630522 262144 54da5807fdc57fed97d3aae3554e42fc9cf26323 halomaps:1826 +fissurefall.map C6D84E7C 15522908 262144 ee91a9c4fbba6975c12e4254a0a203ff4f5a7052 halomaps:233 +fissurefall_night.map 8DA66CF0 28030390 262144 94c608a7b37427ba6ddc8756f57cabeb5e91bbfe halonet:fissurefall_night.zip +FlameGulch.map 7B309554 13936092 262144 79863683595fd9030a1da4c24933bbcfea8510ff halomaps:999 +FlameGulchv2.map 7B309554 13936092 262144 c3a28fae92599e481770d4b206965f90dc74c013 halomaps:1004 +flankthecovanent.map D5A69FDF 66941140 262144 ed24c3d15c921bcc9c2fd21cc22a01e67357ac4c halomaps:5590 +flatland.map 2A296963 17738348 262144 233a86a3c3ac96befcde43621da488d307dbebba halomaps:2342 +flesrutihsotemit.map 1B4D4B2E 53119825 262144 cd5cd7ab45c51188ddf8cef271357acb52c321aa halomaps:3092 +flight_race.map 38A29591 26315144 262144 408ba63c4d8b735894e906b57ce56b9ca995ae8e halomaps:4440 +flight_top.map BE4C9C5D 19497912 262144 06e69eb48556b733d54abcac70133e100a9baedd halomaps:2837 +flightgulch.map EE67A4E9 18855344 262144 33934ca287b1805f4b8b89c47947fd89e24d4d8a halomaps:2498 +flood cannon 2.map 7338FBD7 19531878 262144 101271569513bd88033947abd444fd181f07d771 halomaps:4654 +Flood-Human_WAR-4.map 783FFD66 48560587 262144 7133d534f050ee285c2c02d9e1f2560a7d80c56a halomaps:6744 +Flood-rpg_beta4-4.map 55843513 127290428 262144 01b20027fca85dd313454d7ffea176edb9608ae0 halomaps:4599 +flood_'em_high.map 32B70E3D 32178818 262144 8a40abd327684075280caaefcd84cb8d6a13b23d halomaps:1751 +flood_assault.map 42787569 84293306 262144 19c6371d6d9626e3bbe72ef21d3dc9fd4505a822 halomaps:4451 +flood_cannon.map AA980AA6 14577012 262144 2d0439b275ce731c92a0736c3a7e675684ada09a halomaps:2268 +flood_extraction.map 9E602A7B 22140769 262144 552c9ff35d91e7bf9d86ed2685029b6e942986ab halomaps:4359 +flood_guardians.map E70C5FD9 84873285 262144 d40223216e2a10932d8d56355207170a93fc56cd halomaps:3895 +flood_paradise_beta01.map 7909B665 52403182 262144 f89c781f9535807a2aa227525e07f1ce7a48eb03 halomaps:2209 +flood_survival.map 8DDD8F7F 126203759 262144 47dcb7ee71a72a7395dba8c13240ade9e2853034 halomaps:5607 +flood_survival_3.map FC3B1F1B 119626111 262144 7ec550987b53f3c60c7ef078794a265f87a89381 halomaps:5628 +flood_territory.map 5D525303 100625635 262144 36ea27371e61541dc5318ef31eb3810ff89f691e halomaps:2303 +flood_territory_v2.map 845894C0 113230781 262144 63b6d1c88a55b89dcb0d71ec9ec5095681508761 halomaps:2536 +flood_threat.map DE06C87D 87694650 262144 5d6ac84f8a7dede7df65ddec08a34069bc512810 halomaps:4402 +flood_war.map EB4BC86C 159878659 262144 b5f77dcb966b1595577a4132dbc6e159d4bdb1f9 halomaps:5875 +flood_war_dangercanyon.map 84FBCE33 71492791 262144 a22f1277a23fff769b57b0deaefa287c945fa9bf halomaps:5042 +floodattack.map EC57AB76 18836893 262144 9b81b198aa7da3cff3cf12361d5d602e475be17b halomaps:3498 +floodcombat.map CB9B1D94 22122608 262144 06dd9e252838559064c87f8322adcbb1095766cc halomaps:4684 +floodcombat_v2.map 0AA5B82E 24888500 262144 4d1603187947aaba35495fe9e9abf873719c88a4 halomaps:4861 +floodcontainment.map 6830CA6B 90659134 262144 17c73a5fdf75ed35ef4739f90a974c2490615cf9 halomaps:4215 +floodcoviemarinewar.map AED10D83 70371317 262144 0b7c0528a35ba240b51497bbf3f559f50b405056 halomaps:2548 +floodcreek.map 94C848DB 42181728 262144 ef3e16b33d7e474f6f9bca40774f6ebdaabce9ec halomaps:5021 +flooderadicationbeta2.map A6B999B8 136456931 262144 9db107e0c75c4dc41cc3b1d4863c9ff897540b5c halomaps:4271 +flooderadicationbeta3.map 198D6C47 163987176 262144 b5f7642c1ad7c428c86d7111c72d067187a353a0 halomaps:4328 +floodfeast.map AA98CC81 47876466 262144 095f31e254eb73be34217fb489c9323577a6e7de halomaps:3759 +floodfest.map 6428505A 111436157 262144 85a3d0541433383b3ae83cc3cf11651dfad899b6 halomaps:1446 +floodfest2.map B0E5BCEE 115786122 262144 d58274689151ba8eb4cbe63afe0c7b0c15274e33 halomaps:1465 +FloodFright.map 30F7245A 131295976 262144 bb4d5da6c450a2a18ac4f7718d6cc672a1e597df halomaps:6342 +floodgate_3.map E15D79E9 76695027 262144 e1adbe2896ee6e9d76bca04aa793981e94a14757 halomaps:6389 +floodgate_anniversary.map 641DB1C2 72216683 262144 1a108000eafb0704571c66b67c04967e1509163f halomaps:6426 +floodgulch.map 651D10C1 15761232 262144 80fb8b6b46b8b38180e713d74114d783ad72113f halomaps:441 +floodgulch2.map 30A57A8D 56710727 262144 88d0f67408b4d6ce156387ebae42fdbdbf296a8e halomaps:1882 +floodgulch3.0.map 45B22000 56682530 262144 39cc4f935cb81b8c6c89d67d3fd8845553476d3a halomaps:3632 +floodgulch3.3.map 9195F6BE 57337126 262144 ede9a4092cdb5fd4ac31620cf74b529699e0115f halomaps:5004 +floodgulch3.4.map FC267BE4 330948928 262144 635cc190f953d543f36f6353ed39a58bcc3e44f1 halonet:floodgulch3.4.zip +floodgulch3.6.map DCE7A44C 120498737 262144 2fca99453e2f84861e8b487ce8de02c050948030 halomaps:5562 +FLOODGULCH4.0.map 92C107C1 69645917 262144 de7bb3c3cba568cb859a544729a660ca7efecd36 halomaps:4655 +Floodgulch5.0.map BF2B5424 89193279 262144 4ed062b7fa74722663393ddac4ee6e9046c23e77 halomaps:6033 +Floodgulch5.1.map D2D92B0C 57483951 262144 2e0ad08ceeadb46b4e12611aa3ef5132ac2cac7c halomaps:6311 +floodgulch5.5.map 6EC77C12 74408823 262144 fe0a2705af149686f27d4df2c6dcd66cb6cde21a halomaps:6871 +floodgulchmodtest.map 772761B6 109128179 262144 61d4c69feb049466d98b38b9489f8199e414255b halomaps:6045 +floodhigh.map 4F2AED05 396703555 524288 c1f622c6bb24de976bc0f0859245cb7320259133 halonet:floodhigh.zip +floodland.map 680432CD 48450551 262144 df29851c98e6518bc234cdd27dbab8329b1a5822 halomaps:3068 +floodnight.map 8F4E50F1 57352437 262144 a9ab6a2a2ca0a70a00e2b2141415cd8bf028707e halomaps:5126 +Floodphobia.map ED3352CA 71720411 262144 0659213f421729949a3283a4e4557fcb31046c3b halomaps:3131 +Floodphobiabeta2.map 4B9079FA 67980628 262144 77b2414d125cf6571bc7aa9eaeba82f384225c75 halomaps:3169 +floods!.map 0C43C1FA 400927745 524288 40eaee42cbf37457c3609f1edfc57f4852ad6ffe halonet:floods!.zip +floods_invasion.map 45E3E512 20042544 262144 d38ebef827f7dd02c3ddaaebbbc260759cad37ba halomaps:4671 +floodtrainer.map 6D906CE9 88766113 262144 82e869fec545e430e1c48d91d5f7170519c7f4a9 halomaps:4401 +floodtrainer_apocalysp_sp.map 5A0B780C 213334369 262144 6e187c4f0d882652b3027ac397ec5684b9cde414 halomaps:5165 +floodwar.map 0B58D542 51287715 262144 4acb8be602584c939bd0a037deaa91acdf3b3244 halomaps:4492 +floodwinter.map 7F17F1B9 77632523 262144 93efe9e38c7f59213203b95ba143e62e396abbd4 halomaps:4585 +flood  lab.map A8D534D7 37339247 262144 196a474bb8e6185a1b78fc80b1863d93053323a3 halomaps:3785 +florack.map 201C4B63 216347780 262144 a8a860d3333650daf5439122e06ac4c562cf2065 halonet:florack.zip +floudinvasion.map 500FD095 276884460 262144 41c6a3d4bc7056d22d7c1bfcf3413f3160957623 halonet:floudinvasion.zip +Fly Gulch.map 7B309554 13936092 262144 c32a327e3518751bfaf9c69e1e154f13d07b6cf4 halomaps:1846 +Flying ChaosGulch!.map 7B309554 13936092 262144 b4799c03e891e6d6a6ecdb9869305ca58c8d7d93 halomaps:3408 +Flying_ChaosGulch!_v.2.map 7B309554 13936092 262144 455425339024d2a4b9ae5d92f1c29cb778139471 halomaps:3470 +fm_timby.map 7ABE697D 30191336 262144 0aebad9819d8a0b5e74bc73c4d8243dc1294e42d halomaps:3282 +Fmaptest_alpha.map 36288B07 64042533 262144 2a0a51813b914e01595965f95792076549410b6d halomaps:6967 +Fmaptest_beta.map AA50276F 87478042 262144 c0197016559b80b9bd03788bd9360f4a17e55b45 halomaps:7002 +Fmaptest_delta.map 9C1E13CE 102009807 262144 7e66e557450f246e7e1456a6ada56c68e3e6ee00 halomaps:7040 +Fmaptest_gamma.map DD5CB38B 95582297 262144 3f5995bf68ea9c30bc1479fc2694ddad0b151fa8 halomaps:7003 +foe2.map 2ECB607F 20033299 262144 68db049c15da74cf99c37b0e8cf730a17c662e72 halomaps:483 +Foehammer_419.map 7DA24D22 381654885 262144 3f2acc69eea81d9940b7eb651d922511a157a9ec halonet:Foehammer_419.zip +fogg.map 04368628 172279290 262144 64d803346b1b41f59c95f41ee2291e40945f1285 halomaps:7004 +fogg_impossy.map F7E81E8F 1092572 262144 76e553c9fc2dcf790f96e58bbca77053b2c4fea6 halomaps:7004 +Foggy-Grave.map D77FEA9C 23120969 262144 85cad591b857e9071ea58c63ff84ff415d7eaf98 halomaps:3786 +foggy_war.map 4DE1083C 55786085 262144 18fecb3f4011e4f511382e93b38218ded1576bdf halomaps:5353 +Fogujah_1.2.map 04E677FA 61803432 262144 9e8bf2fc172c65e15dc887b82c8c857b2a94b758 halomaps:2488 +fogyoass.map 784CA990 59221172 262144 f9957f15b3df7b104bf4d41fad7fe170695cc117 halomaps:2499 +fojaxfield.map F9CA5FDB 18734572 262144 e6b9826e133d7c0c408c364417e8e2f9415d66ff halomaps:432 +foOl_tImBA.map 15F017E3 39275356 262144 eb4b7feef99834b6f35ba6dd30745c1e60bb7557 halomaps:3509 +football.map CA3FA09B 94992519 262144 f30e48dafbf247c389a54ad524d7418fe986a3e4 halomaps:5465 +For-Honor.map C9CA15BE 39474925 262144 9e9194ed7d3e17b72cee99d1a8b3638ea22d5c7a halomaps:6555 +forbode.map 920E0BAC 20861885 262144 a081586c0773a5ba99053414dbae692060822852 halomaps:6872 +forebode_v2.map DC289F1A 17756085 262144 ce261dabd4e3935396421c2cb40ae8645d1d6677 halonet:forebode_v2.zip +foreground.map F7BD1E8B 14017984 262144 dc927f8fbb7c8788fb67cea70d6c192bc8e8f897 halomaps:543 +forerunner.map 845AFD8B 13112884 262144 022a799fe1d555883ad0842f8867a27de9d48b21 halomaps:2343 +forerunner_dwelling.map 51793323 13556732 262144 4b7be917696d4e8b03f4ede68c41ebbee2d87201 halomaps:2852 +forerunner_facility.map 3174C788 28940966 262144 a9e6d77aac040950730f10a565efd2353bdfc866 halomaps:3760 +Forerunner_Waste_Storage_beta.map 04BB44F6 13945128 262144 687408cf003c6f4728f25aa7c742cb2d2399136e halomaps:2367 +forest.map 179ACC3A 16059668 262144 b861a9958ea6e4ea730b9da9343bc6b6687b3513 halomaps:1119 +forest_fallz.map 4DB0E101 13659516 262144 8d0db8c9d3798315c5c09e51f076a30e25383d23 halomaps:2950 +forest_fire1.map DC5B7AAA 13824252 262144 cceb206c083ba7f650e99294fd60b8410a278d08 halomaps:545 +forest_gulch.map 15FBFD02 17145536 262144 794fdf42e109b031a81cbbee5b6db1d57b3c5d4a halomaps:2319 +Forest_Hunt_Beta_V.1.map 060A1925 43017978 262144 b54ac7ffa5c03a5dee774c065391e9326be5a519 halomaps:4230 +Forest_Infetion.map 5F1D165D 399496128 524288 1b979e6239b80d05300b186fe432a29ca538139a halonet:Forest_Infetion.zip +forest_pit.map C60C60A0 13732784 262144 a57d27b307e9cd12cdbe60a1edb2a7bb7f3c953e halomaps:4467 +forest_plains.map 753BFC4B 14380828 262144 1e8dc735b3a3bc329cc32327568123f8678084b3 halomaps:4325 +forest_temple_classic.map CD038FC0 28375908 262144 c176c2bbf3afacac1d87dbee287dac00ad6b0e59 halomaps:4566 +Forest_View.map C6699421 20056043 262144 b2dfdbf4d406ba4316ec0ddd7684f849866f8bc5 halomaps:4403 +forest_view_nightfall.map 0D0BA631 24217570 262144 af4f457f6bfe9cd1de28e8f2c2dd4a2bbe5d6066 halomaps:4404 +ForestBlood_beta2.map C7A41538 37283127 262144 737250183c3160fe3423872be94c8b6d33f102e7 halomaps:4338 +forestgulch.map 2BBE0D55 17837536 262144 89790a645475c9279bf496a88319b64bd634da24 halomaps:1500 +forestmeadow.map B45DBCBF 16866117 262144 a612c6ec49edc2ec6a1b0a3985dd8971a33cd51a halomaps:3977 +ForestOfDeath.map 2AACFC98 36800324 262144 8de2f71afb2c26da5a9277decc7cf879c8c66f21 halomaps:4247 +forestry.map 82E5E1E2 17001752 262144 53427cc24be41b04faf6ac695f1caccacd0f7b9e halomaps:2170 +foresttemple.map 35DD6EB0 25373035 262144 2bea55174064a2102030f8409a014df6389e0dea halomaps:3978 +forestvally.map CB1022AF 13867628 262144 2f63c6fabb08bd2a402a655bb6a90440b3eea172 halomaps:3532 +forestwinder.map 8F2A61AA 15354412 262144 7ff77572ae333154755f7c7c46a931cbb2638c12 halomaps:747 +Forest  Fight.map C5C8582A 59372851 262144 a89ee4159cbfe237ee6ed64d238f3f1c58a0dd4f halomaps:3787 +Forge gulch.map 3F2AD966 248515269 262144 fb2012b93820e0f05982b8af0148d25d37e66ebf halonet:Forge gulch.zip +Forge-This.map 00000000 255079664 262144 c462f7950ed823ae630fa155b962d159fa3a879d halonet:Forge-This.zip +forge1,4.map E2DA4560 91802985 262144 4a03dc7ce299386b693a571fd322756639ef0e32 halonet:forge1,4.zip +forge1,6.map E6A58CB1 78658121 262144 a915e605606adbfa24f5274a2f9803f27220abe4 halonet:forge1,6.zip +forge1,8.map 00000000 263042037 262144 40355895f279d3dd74ac2bce5561f331b18a914a halonet:forge1,8.zip +forge_halo.map 744746FD 54506020 262144 2536f75ad102d4dcdcd3b08c92dd9182e31bd429 halonet:forge_halo.zip +forge_island.map 97DB8854 19739268 262144 80b8054324f67e19e480730e33521759b50b02b7 halonet:forge_island.zip +Forge_World.map 3C1D4394 231104839 262144 130014ccac0d29338e593ed9405fa7ce0063733a halonet:Forge_World.zip +Forget_War.map 7CD397AA 391314576 262144 66dd55a03cc1525ffe319d89de576456230d711b halonet:Forget_War.zip +forging beta.map 88E8F77F 230285003 262144 9753dea294122e0ddffff628842574f9a3c2aef2 halomaps:7041 +forging.map 9CD16154 204012163 262144 5e4d59486edf5055735c851b204249f138f886b3 halomaps:7069 +forgotten.map 9F14FC8A 18528573 262144 d564196fa7213cd44d24a80167d567638f79d559 halomaps:3849 +Forgotten_Fortress_Beta.map 1A185888 19621330 262144 d5f1410e3677fc384f4f223d03f6601d13f9bbca halomaps:1450 +forgotten_wynder.map 5EA868D3 82507689 262144 30ac466ec97b7b6e28bbbc79c0209bf9a3db7c0d halonet:forgotten_wynder.zip +Forrest_Assult.map 23FE7079 19613622 262144 3e50eb4d77c76b8384f054f95baaf6db64d06924 halomaps:3702 +forsaken.map 3AB1B64E 39946351 262144 6f75ba4703fa97b323cf1162fa3256c05f2a3d33 halomaps:4528 +Fortification.map 966041CF 23322301 262144 cc70c28e00ba7e472d3de8c75c3a3ce53ea91abd halomaps:4195 +fortress.map F705AA12 17926988 262144 0091d46f847be4b5ae29aa3bda45afddc94b6719 halomaps:1730 +fortressofsolitude.map 1594BFD4 15063088 262144 f3f325e7edae139c994e6fbff58655fe4cb24f6c halomaps:3037 +fortresstower.map 8388A327 13839782 262144 7d06c521b6be8a304751665e21c4a0df393f4813 halomaps:1645 +fortresswinder.map F363B529 35797061 262144 e9f856199c35e97b0b00450952d9a9eb7b87c68a halomaps:4838 +foundation.map 2686BBA3 120066223 262144 297425e3fc50ed0d6ceded8e737115d2db7e2014 halomaps:6945 +foundation_beta.map F9D6F942 15687780 262144 59e3304b3f11bffc7591f665599df996ac63952c halomaps:760 +Foundation_Halo_2_Mod.map 8BD932CC 31988549 262144 5a87c14e8330ec78e83167d06ddeb06158d6ffe0 halomaps:1306 +Fox_Abandoned.map D74516EB 46889656 262144 a7c9be1ea386ac4fa274cf3131b9d69b2fcf3699 halomaps:1061 +fox_abandonedEPSILON.map 6184EF7E 25458994 262144 4bd030073ffd00bae9e4e95b612976a0d700c5b2 halomaps:1046 +Fox_and_Yance_beta1.map F8918F79 48719861 262144 ee9a17b54b096dce95f7637175702a2f21dddeca halomaps:1613 +fox_condensedGAMMA.map B49D0191 26998904 262144 1797704bf988ce5770333d762d2f4f4ae4d12e31 halomaps:1064 +fox_island.map D3B37E16 27827965 262144 f5cf396bd5e8efda23a760d8834e1840a51597cf halomaps:621 +fox_island_ai.map A93B6FF8 132928881 262144 9cffbbdbd3f3e9be58f8cad547bcce26de9080e4 halomaps:5925 +fox_island_INSANE.map A754A97E 79046444 262144 dc04fb758be93a4ce748f3e312677588382d7b0c halomaps:3611 +fp_esfera.map BC335DEF 15106008 262144 e355c928bbf50483fd162bf92e20a84ee11070c5 halonet:fp_esfera.zip +fragment_v2.map 5A6E3E3F 23093144 262144 5bd7c679e0138bef1a1e17c1e0103c4c455dbebe halomaps:1447 +Fragmented_pb1.map 668E29C0 225633482 262144 ce19012c6df6daddeec2cb55df2d30af6f5673ea halonet:Fragmented_pb1.zip +Fragport.map A6355437 13983684 262144 2fecc4dea04fd49962ac2b48c3290a234e73ebb2 halomaps:3197 +FreeLands Mod.map 6BD2A5F4 13926992 262144 8d7ef0ee43fa952d9785f0b59af4fa5d04b5ab2b halomaps:457 +freelands.map 6BD2A5F4 13926992 262144 d5bb2184ae8205d29d7394a3272b397daa062de9 halomaps:436 +freeze.map 3D6B5B4B 146798747 262144 5a6bfcc0fd2941aafea069545b8ef961b0f377b1 halonet:freeze.zip +FreezerBurn.map 7D9EC00E 40017036 262144 079cc3d528c538c650a85da3b22f728d8d192b96 halomaps:6702 +Freezing_Point.map D2836BC4 21145756 262144 c942818d2aee9bec8a618504426b94e6e0169d52 halomaps:568 +frege.map B656C933 50871500 262144 c66474215c258ae8c2edd16a6a6cd3770bd1ffce halomaps:4839 +frektarax.map 0CFF0012 318992906 262144 82aabe6641af2cf9841f1919f31fbc81fcbb46d1 halonet:frektarax.zip +fresh.map 8D2FC28F 18812064 262144 f9348c71ab9358bcf80b0220378af44a594f9da0 halomaps:555 +frigid_keep.map A17A7833 14742756 262144 31c997b8a068a9ddc69c71b8b020a4f0d6c9809b halonet:frigid_keep.zip +frontline.map 13BDB1A0 23043736 262144 29b272c9fad8398e4b6d57295952c2a5857cce6c halomaps:2866 +frontlinefix.map A4841F1B 22382664 262144 42f2d4e98fc5c599e97410d8529dd3681ecbbed2 halomaps:2884 +frost.map 7ED99C0F 18020488 262144 503ae6b5fba25a4d992b55924a1f8413c837f11a halomaps:228 +frost_v2.map EDA60B7F 56198547 262144 2cf5c2e9e950423a0efda9bef71bf7aecf633355 halomaps:2776 +frostbite.map 86B9D33A 14427473 262144 03557df8835b5481ced6a7c234c14539c9e59453 halomaps:4360 +frosthaven.map D86177D0 20488196 262144 764eca3ef5ccced94f1a2f0e5dc2527de084d460 halomaps:1744 +Frosty_Field.map 56FFB156 13310180 262144 f34a36e149513ee26cc5fe26fcbfdb5d6b860b07 halomaps:4092 +frostyassault_beta1.map F57DD0BF 16949748 262144 43489b26f9403db26f931c8a4ff344fedc8b9ba6 halomaps:573 +Frostys_Revenge.map B53D6AD0 33816168 262144 c77dc8c89ba684765528021f2c7b4e576bee1385 halonet:Frostys_Revenge.zip +Frostys_Revenge_pt2.map C20E99FB 38242504 262144 a19cd3320252cb20d99e0f07fa606c1aa45756f8 halonet:Frostys_Revenge_pt2.zip +frozen-path.map 01BBB60C 61314682 262144 8d6f3a7f9748768e613914f33025522e6e40d7b0 halomaps:1743 +frozen.map 26CE67DA 22130248 262144 c2cd94ed780154c42bab285726e869688eb70c3b halomaps:1332 +frozen_bridge.map 6A1F0149 25694429 262144 be05976afb0af7ef95677fbacedb606d5758606b halomaps:5264 +frozen_canyon.map A4E469AF 19550370 262144 16a12593c910cdebf8a6102ac6d1500c707c4a36 halomaps:1101 +frozen_facilities.map D1537773 37373052 262144 ec5f451ff194ab0228682a8f34973bdba600bc02 halomaps:4361 +Frozen_final.map B8F380D6 27985479 262144 363e0ad10ba003895f8f6b1db15c3e6bd9508ac4 halomaps:1445 +frozen_wasteland.map 43EC4FD1 60847188 262144 9bedd57a287b11cecf4d761286da5e6293759558 halomaps:3821 +frozen  tunnels.map 5247FF43 19825785 262144 7888cd9cda0928e8d38d8bc5f8e8dc26209d74eb halomaps:3915 +ftw2_bloodgulch_beta.map 7E706156 83429100 262144 b18f8098ce1ee8abbb63013c15ae82d9177c1069 halonet:ftw2_bloodgulch_beta.zip +fudge.map BCF5DDA1 13921312 262144 594256aa9e9effaf439b70537044cdff73528eb0 halomaps:1784 +fuel_rod_wars_alpha.map 556ECFA3 58377960 262144 bd3112a61054f4344fec306cc0796cd60f1de103 halomaps:6390 +full-metal-snow.map A4B7E34D 57160800 262144 42f3b974833ea9b6416ad80454a64ee68162fe5a halomaps:4116 +full_circle.map 86D50512 14596093 262144 0f455c4f99076db38de026cf4ca15612a5c3bf28 halomaps:7005 +full_of_energy.map 894A9C7F 15090144 262144 bec007f76c3e916643f3fdb5f7cf5a8eb6b0a862 halomaps:442 +FullTruthAndReconciliation.map C88D21D0 161606789 262144 2fbdc1a1691d255ab5354048572cfa4ba3f5b050 halomaps:6873 +funhouse.map 8275B915 25146011 262144 997351a12b3a4ee649f3ace0972dc53730649c15 halomaps:5338 +funhouse1.1.map E2EF71DB 31760804 262144 a012010f3fd0f92ac2477bd5c2b2863c27648aed halomaps:5354 +FunkyGulch.map F843CD77 39309589 262144 72d9415c31067dec35ecc104148bc7b21574b7b8 halomaps:1537 +FusionIsland.map 2E2A385D 51492298 262144 195b97209d646d17148e15e2f6b8555ee9478d72 halomaps:4840 +futurama_beta5SE.map ED85FE99 22107740 262144 f30df0f8ae333d59a8029626abd34ce61db93a3d halomaps:2429 +futurama_beta_16.map 46107FCD 26954593 262144 f5a3e01dbe10a119a9349cdaa07ca735ebb78337 halomaps:2430 +Future.map F92757E0 19344897 262144 e62c6e4d273931eac8f761d560542d4f3325c89e halomaps:1333 +fy_iceworld.map 4C18DC14 23676128 262144 a1b6732fa4f1efdd60f4b38c626bc5435a889b50 halomaps:4862 +g10.map 54A1FACC 154443812 262144 48b5a6a9ada39ba28f03b634cae8a31fe81f7b42 halomaps:5773 +g9.map 2CB3F28A 138774069 262144 be835e06127644023d5929529802c6b95f8b9f00 halomaps:5519 +gaa.map BB33F142 81531294 262144 be28200eebc79e7df7e9dcfcbb763be763a11e66 halomaps:3681 +Gaia.map 878165B1 121461274 262144 337316d1714dea99279c0ff58c999d89a9fb273c halonet:Gaia.zip +Gaigher_Mod.map 82FC067F 246717917 262144 4b5c4c5cb954cbff57f571428a4d2a027381e07a halonet:Gaigher_Mod.zip +galleon.map 0AE264D7 126096594 262144 10a39820f9151e045076b375eea36b5e11c12a7f halomaps:2257 +Galleon_no_ai.map FBD480D9 126034558 262144 6302d772868aea2d2ba57dae956c8098ef351500 halomaps:2258 +Gallows.map 07BAFF3B 22043816 262144 c43a932e6d37d48465d603c052b1b54e1e9e8718 halomaps:4326 +gallowspole.map 1686443F 18243248 262144 61a1c6272275824cde10a3ffc9959650b696f1cc halomaps:229 +Galorndon_Core.map 239B466C 232922540 262144 e61cfec4c503e0ccb8c82e78ab86a593d8d6af43 halonet:Galorndon_Core.zip +game_wars.map 25BF099A 42727876 262144 1e573271b7d4f0e0b5ba2df7f99da1c06b7caeec halomaps:4619 +gamma.map FC2FC45B 83434195 262144 d34adc38d07e13b6125167032ae45e57a49c4a27 halonet:gamma.zip +gangafarm420.map 555D3AAD 14568864 262144 82f4d49091b4f80d9ff52d746d4431cefe71b459 halonet:gangafarm420.zip +gangland.map 07B129AD 36602120 262144 4b57d4c601e60f7e19c2772acc7858ea0e4c9374 halomaps:1868 +gannonscastle.map 533BE9BF 18826021 262144 8db506fc6ed819fa23839cf310f56ade23c17b6e halomaps:3962 +ganonhive.map 7F3F5273 48716831 262144 8ff7ee1f2f7b8312c38bc8fc08aae65633b9dcf4 halomaps:3069 +Ganymede_Swing.map 835B4DB7 46087963 262144 468441f49150bda8298088c1207c9302c838d514 halomaps:5152 +Garden_CE.map 024CACFC 52222757 262144 31844b0c9361da9f99a8581e5c9fac457986719d halomaps:4863 +gate.map 94725A61 22064156 262144 4463ad7f6243041bc9da04cb96fd3efec3abf644 halomaps:524 +GateWay.map 39ACCE9E 68640519 262144 2adc625aca3295ba2bb12bf83321a5189e83899a halomaps:3164 +gato-y-raton.map 7AC322A3 14689942 262144 0804e5411960b497e7f5e203e0e559d508eecfb7 halonet:gato-y-raton.zip +gauntlet.map D6F32D49 19579667 262144 88cdf17612be797a8fa65c0397bc1574ae629da8 halomaps:356 +Gauntlet_1.0.map D44BB1B1 19991151 262144 78e0cc8907963d287818ab20f433d0f26aa28e06 halomaps:371 +Gauntlet_classic.map 34C0BF49 19990587 262144 a36b3467ab8f418532491dff6522406e4ce39cbe halomaps:370 +Gauntlet_Race.map 98421991 21111501 262144 a827a2a85612a713fd50a2fb9837622d0b0038a2 halomaps:2500 +gcse2.map 8CD8D03D 13806820 262144 855ad3039f4b5d960016ab35c4ff89a319cd441e halomaps:2269 +Gearshift.map 52D37C4F 13108480 262144 c327b5bd95bd21b5c744b45dcb9531fda9559177 halomaps:4174 +geldarcreek_beta_release.map C93EEE80 41917854 262144 f1bd197588b048c15d487950b1b0b5d228577756 halomaps:6195 +Gemini.map 256BEF55 39355824 262144 bb039a968f7d963bd1565291ac960b692ec0be1f halomaps:5153 +Generator BETA.map 8AAE4508 25076932 262144 bffec7a3f90f07e15f963eb49e566a1eb787a39d halomaps:1708 +genesis_beta.map 3DC9A2C8 29597424 262144 a9a71d3eb26a55701597529b884ce4b203e90981 halomaps:3332 +Genesis_V.2_Beta.map C605E244 26930904 262144 478335b1a01914c65c9658a1a750d34421e26f8e halomaps:3338 +geomar_este.map BDCCAA0E 101446077 262144 58ab857a567229900edcebfdf93374fc42bc4f4b halonet:geomar_este.zip +Geomar_Final.map 714438E6 82413558 262144 72e6d0541f90a40d4c98bec0e33e1d8337b1b5a2 halomaps:6968 +geometric.map 507FA3E3 16595523 262144 1372c6b6cd35e2da713839fdaaff31e7ec511e1a halomaps:2733 +Gephy_Mod.map 51DA28A5 23811508 262144 5a7d861b7f4d44b6ccd1ad32aede86ea116b6fcd halomaps:4455 +gephyrophbia_falls.map F038888F 31801634 262144 c9c42aaa1e6c8424928635de28f5cb136cc76d26 halomaps:3822 +gephyrophobia-base-defence.map 0AF44D45 32700149 262144 d560e29b26bde274452e7f55c9c421e5ca045ce2 halomaps:6280 +gephyrophobia.map D2872165 15579312 262144 9ccbff49615dcfe4fefa97659bfc0826c0f5320a halomaps:4780 +gephyrophobia_reborn.map 3F2F4954 178010635 262144 be2fc2348033b7f6fb9f05792dfc36b5b3dda1a7 halonet:gephyrophobia_reborn.zip +gephyrophobia_rm.map D2872165 363580244 262144 51475ccc08b59f6a97721c6630f9a4fe6f8ace36 halonet:gephyrophobia_rm.zip +Gephyrophobia_Rocket_War_AI.map 9ECF91A0 216778376 262144 980e0c3e6ddcab9e16a3891063477f56d4372224 halonet:Gephyrophobia_Rocket_War_AI.zip +gephyrophobia_time_splitter_2.map 52A16A71 28937011 262144 d48ed11341cdd02150f526ba6ebe8956282496a5 halomaps:5608 +gephyrophobia_tmcc.map 6F39AADC 42956428 262144 8eda32a2eb75eab2d018cc41320add8f09671058 halonet:gephyrophobia_tmcc.zip +Gephyrophobia_War_AI.map AED25011 340429336 262144 9ea6a1b2882f06bc9bdf78b4d7101296c7b7d4a7 halonet:Gephyrophobia_War_AI.zip +gephyrophobia_zombies.map 85D1B4DE 90944289 262144 a6a5989ae6a1a34010571829c68883a034956c90 halomaps:5849 +gephyrophobiaai3.map EC404938 64170297 262144 106bd642b581d04238eb082d78aaabb0923e124d halomaps:4553 +gephyrophobiaedit.map 21AE23DC 17415956 262144 d56a1c381563bff63fc2e196ab03b6f5895fffaf halomaps:3482 +gephyrophobian firefight v2.map 98755AF4 73103127 262144 87afbb6827339ba91a65de21cd3152e3d5f587b3 halomaps:5563 +gephyrophobian_firefight.map 8DC208E7 127363036 262144 e7b8099e50454ba333e82f74ed1f80534bd7c301 halomaps:5154 +german beavercreek.map 7FA1C361 40013809 262144 a4746f0b868c5a3fbe4eb17619a8d8b3409577db halomaps:5644 +german bloodgulch.map 6CE1F4F5 40970309 262144 a2409a39acd51169a1a58691a6f1d12f49a84fdf halomaps:5645 +german boardingaction.map 0954DDDD 43372373 262144 04690f2dd0b7a6f3e27c1ca199ac8018a79fe2f9 halomaps:5646 +german carousel.map C1568419 39542397 262144 acd80c48da121af3ff0d40572357fd433f1669c9 halomaps:5647 +german chillout.map 649BBC56 40129929 262144 feddba2bc2e2cc61f7540222e607b2f967f056f5 halomaps:5648 +german damnation.map 66642C60 44887577 262144 f34770ea731d9e8c04e53e6443d398727ddbbe30 halomaps:5649 +german dangercanyon.map 74FA0247 43404293 262144 1a444761da38832bf90ddbaf3ce641ab428e69dd halomaps:5650 +german deathisland.map 765B1563 48563761 262144 daf00b54348e7ef37d87e3f6e8ed7e07b74d67f1 halomaps:5651 +german gephyrophobia.map 23947B25 45086337 262144 f0d8d5365454985199f6ab17f51f27fc802625e4 halomaps:5652 +german hangemhigh.map A4190A63 40212957 262144 8995c68fc4119ead6c0ca019d1936e80b7362a8a halomaps:5653 +german icefields.map BF554C26 45216641 262144 cb1875e05a05463e08d171f4537da9ac9cdddbe0 halomaps:5654 +german infinity.map AFA4A35A 47693017 262144 6da028f467ab18d6c61fd28541ab067e66c84d83 halomaps:5655 +german longest.map 58869E5D 39701513 262144 b350f5a4843e65938655a26c6bb3f183d69e5ee3 halomaps:5656 +german prisoner.map 54706AA3 41286385 262144 cce538ada890dbd671ad51ac0a85e0e369aa6b18 halomaps:5657 +german putput.map 13135CBD 41057657 262144 4e60d4fa3954a9cb3ed43776d2b8c4af58b0a7ce halomaps:5658 +german ratrace.map B47C95B1 43383653 262144 11eb60744e643bd0e8c7dfdecd6987f19c99d454 halomaps:5659 +german sidewinder.map 81B82169 44203053 262144 0edd5854a4b1e9ff1fabeaec98fffc867b3ddebd halomaps:5660 +german timberland.map 8C198D73 42205493 262144 e64fca0b27bfefeb7af8c680171277f979c02c6b halomaps:5661 +german wizard.map 2C0C2B06 39573317 262144 85ea389f66bac58499bf94a98b5440e2668f5358 halomaps:5662 +getwrecked.map 9D9FC994 132169805 262144 7905f522be9f4816a69e2ee8f6b8412ba2ff90c9 halonet:getwrecked.zip +gfmgulch.map 98F936DF 61431978 262144 c8bf82c7fc62246462e5ddfc5fe2f9632cbeb32f halomaps:4733 +ghost.map 6752AECD 68788057 262144 c5b8916f6b7d33455efa892a14d5b639225c309b halomaps:6391 +Ghost_Gulch.map FEB4FBD1 106015159 262144 095f7d657a390151e48b27ee4205e702f0158291 halomaps:4529 +ghostbox.map F955EB92 14279364 262144 9ee574d49ec8ab7d7a3eae2483d666bdf78432f6 halomaps:4093 +ghostdday.map 76D4B34A 91397444 262144 159d7982a0bd1485f6d1b1047d3ade783fa2283c halomaps:4938 +ghostvalley1.map C8E08CEE 25368822 262144 cabda5e05d7a2d6f007d83c94d7ec78c50131a75 halomaps:4429 +ghostwinder_beta.map E50E3AAC 15131728 262144 4988b0771636fcc83fa92c7221d9cc6a6661bee4 halonet:ghostwinder_beta.zip +ghoulhaven_hall.map D093C5E0 14926668 262144 84043f1a149a7544825092c46bfd579e3c91280e halomaps:562 +GHP_Dangercanyon.map 38AA0BCB 126231491 262144 b827a7d8412b4add1c3695d83175554b9338c833 halomaps:3133 +GHP_dangercanyon_2.map A61914C8 148114529 262144 cca2c3d3ae1e3629ccd081ef75c5d048022556dd halomaps:3281 +ghp_dangercanyon_3.map DD0BC533 154203825 262144 7392a6156ee76150e257c7d36b47c1d3ffcf516d halomaps:3293 +ghp_dangercanyon_4.map 52EFE941 148379548 262144 eee816f2dbdb61a17a3f895d1390900de36cf7f7 halomaps:3510 +GHZ_SP.map 4175EA36 20230266 262144 470c5a5cbf4b8e2ff9dfb53db5c170da6b0bc76a halomaps:2326 +gibraltarstation.map 60414A6F 28553200 262144 77c18a6974a9b6bd1b898e88e9704ad645b67894 halomaps:1025 +gih.map CBD48E2A 71488675 262144 07388c3d2a96cdef801b6189fedbd6bf26bf6711 halonet:gih.zip +gih0.map 894B5BBB 42809401 262144 89f026a15c24312e84cec8b77ab1614e568c9daf halonet:gih0.zip +gih2.map 30B299D0 74084467 262144 a72746e5aa9f8352f58ff01d60e63a107ad1d2ea halonet:gih2.zip +gilligans_island_beta.map 07A4C5CA 20310908 262144 2b950d811793f1dd252e60a28f5c03bd22768ca1 halomaps:2838 +GinSeng.map 298556B0 13308420 262144 26848f3d941f97fb184be2d500851d9bb30eadf7 halomaps:3437 +Girl_Games.map 057ED2D6 264268538 262144 62c66940a999fd3d9a6fe3211f7389096b3e3983 halonet:Girl_Games.zip +gj.map F78B5B58 30566900 262144 b5275f41f668c3151390d6a044a7a47674788ec1 halomaps:4802 +glacial_baron.map 7C86496A 43255310 262144 da7d97a6de110a5eda6e237127a1b3a4a8d41957 halomaps:3409 +Gladiators_Brawl.map B72C7061 35692619 262144 ab2400ad0ac86ab16b43e4bde399ac7a62b24f40 halomaps:4554 +Glenns revemped.map EFAF1E0F 82371213 262144 bc9bd6f8863a8764e6efcc868a3928057be704aa halomaps:6094 +glenns_castle.map FD4B9E8C 53385843 262144 9e3fdac1a5251594b63ef5d13bf8ef4232afbe93 halomaps:5705 +Glenns_Greenbay.map 1A8CC1BC 122473720 262144 b076f44eef0b8b4a6afa1f229c75560d365eb5c2 halomaps:5370 +glenns_map.map C6F8D995 49614404 262144 66136dc21c6c6e567047c603f1630341f9b8f4c6 halomaps:6148 +glenns_sandywar.map 3B73E484 90660199 262144 feffb53be7f95cd7c76ec409e9b6f496053a39a9 halomaps:6111 +glitchgulch.map 5EA3D576 14366196 262144 031a2d7cd089bed62192ae4508a0ab3c8b34cb53 halomaps:6874 +glupo_aco.map A54CC351 45696434 262144 11c4e5668e89dc2e2eeb3ef0fbef40d0e55b016d halomaps:5092 +GM-Slopes_Beta_V1.map BBB8279F 13417372 262144 3b441d8055bf4e282cbf14b6fd4eec40c756bf9d halomaps:5124 +GM-Slopes_Beta_V2.map 07DC3E7E 29673679 262144 d09320fab84770d8adb312db601e93d0d7691c88 halomaps:5155 +GM-Slopes_Final_Version.map FA6A2541 31251984 262144 407444547685d5a826f6d73592c2756d7c6be07b halomaps:5466 +gm_flatgrass.map 131C5096 94561087 262144 e67a8dbb586ff09ad1fb6a7b65161a0b36977e5c halomaps:3749 +goldwood.map 8519641E 20609566 262144 4c427dcc83b2fc7d9079cf28b3730811e59b60de halomaps:325 +gondolawarsv2.map 401A85E3 56734076 262144 a93076cce2ba8d00ccfe9a4264e553ed09e45042 halonet:gondolawarsv2.zip +goromap.map ED8A616A 51902321 262144 f53ae094eae6b847b349f55bf9ca0b1a6ff4cdc2 halomaps:3761 +gossip_beta.map 3C3E2428 16998200 262144 ed6406978d2e61d617665437c043642ea5c21247 halomaps:2744 +gothra-mp.map B6FF9DE1 103520956 262144 71dc5f620c6c80db6c640a02f25d6c1f4f9bfd72 halonet:gothra-mp.zip +granitegorge.map 463E1ACD 17898768 262144 045b2f9a87b0009ce0995848392f30bfe8ddd5e3 halomaps:3682 +granulation.map 55645E5A 94549140 262144 d27e798fc7d8bd3d5c537050e231111d0e6685c8 halomaps:6875 +grassland.map 3D0DCB4F 19577044 262144 443ec9efcddbe444e67fcf68afe46a56275baaad halomaps:2041 +Grasslands.map D5160E5E 27778851 262144 b744d1d8f41888c15928d043b3dfb60156b17c81 halomaps:2606 +grasslandv2.map C8D2676B 27477365 262144 67b10b4e79d10d69ee44bf17872fa3606a14c596 halomaps:2390 +Grassygauntlet.map 13C719DD 13755284 262144 40cdc8ca6c5a2ca80b1cf2c9f39d8884d8dfb96e halomaps:1134 +Gratify.map 83EE43F5 13650960 262144 56df650e9dd4b2626d67d51500ecdd99aa7347e9 halomaps:2171 +GraveYard.map 56959C4C 44857807 262144 6f44a3d1e5ecf9dea377e862d66c35b90fb3296d halomaps:4600 +Gravitary.map 104C6149 12818120 262144 187f03d2a6406c0a8be9cf7e3bb1d6a2c7c52f83 halomaps:2413 +gravity-gun-test-gulch.map BDDF5B31 14837292 262144 1960ced849177a73a31ed788d8e0d4aa81210e36 halomaps:2431 +Great_mission_V1.map 5FFA9703 78340395 262144 fb4c887446e750648594448c5871d535662bffd3 halomaps:7125 +Greatwar-Hopeless Battle.map 5E1029DA 120261919 262144 3e1cda394888e9f0ee88db88d83fdef436a10723 halomaps:1952 +green-screen.map D2EB7BF1 16519400 262144 885df3d2870917d0e947860b83843668d6c46d22 halomaps:2951 +Green_Canyon.map 551CE341 26415062 262144 06cda9e2b709aed47fa8971d8b54e3ce8221c627 halomaps:525 +green_hill.map 92E0158A 22467856 262144 353a35d2593d13f0843cc908d8dc980269831304 halomaps:509 +greenfall.map 0AC1A8D7 133379592 262144 e54f3cbbc4ed8a6956cd263940d7686a33867b48 halomaps:6591 +greenfall_v2.map 306B2BA2 137063451 262144 4550bcd3a22151b4d60cc5a9d9b7ff586227b780 halonet:greenfall_v2.zip +greengulch.map 589F02B3 42907505 262144 9863a04a4d7fd9d0cd836c508458a0fe31d4b6b2 halomaps:2607 +greengulch_v1.map 5EA3D576 95986050 262144 2e72175122ec77b26eb7a59fa5f20c3f3daaba30 halonet:greengulch_v1.zip +greenman_map_final.map 0184E291 55446420 262144 afbf7cf3498c5a54c7a75233f04df749beef859a halomaps:4175 +greenpitgulch.map B80202D7 28858800 262144 017671c3f535443e20d64b4d5dfb24931fbcd8d0 halomaps:4026 +greenvalley.map 4C8766CF 17833008 262144 ffadf7620a288d1080776131bc72591fe1e0123d halomaps:322 +Greenvalley_Canyon.map 05D1714C 19541013 262144 bce3b6c723d95ad130d36db1910342667d5511b5 halomaps:2549 +grenadetoygulch.map 6E2330EE 20869726 262144 04e3b971c82f9fc9e3f3f290114c743af66f33c6 halomaps:2081 +GrenadeWarz_v1_Ang88.map 40F53787 15678364 262144 69e22603dadd5c0a1f60dcefc5ddd2dc65aa8283 halomaps:234 +grenation.map 135A40A6 19320032 262144 e9526d747774f86a0c2800e6e498ee2627af999e halomaps:1130 +gridiron.map B6E9D10B 36348896 262144 1928ba843a3b1a7ceeac3ba8d17f8262906123ee halomaps:6946 +gridiron_beta117.map DE97B963 24935824 262144 af40bfb351d2052f5abe329bf2057255e6c81397 halonet:gridiron_beta117.zip +gridironv2-pb.map B5D21AFF 21419512 262144 e53d63465a068835e54e3ffd90f22f559c8bb6e3 halonet:gridironv2-pb.zip +gridironv2-PB2.map DC68BD3E 21417388 262144 acd0f140043f8e684a14fc855a33d6b5e2c78a28 halonet:gridironv2-PB2.zip +Gridlock Public Beta 1.map 00D4ED75 132630593 262144 1b0e935585e50f1e1feb963b7a1548d41f91f50c halonet:Gridlock Public Beta 1.zip +Gridlock Public Beta 2.map C2319471 132308085 262144 1480ea3d02fae83f10304043f3f01cf55347af10 halonet:Gridlock Public Beta 2.zip +gridlock.map 916C2085 87524404 262144 0390d9713a7f09876d5da01ce39c184cf42ea7c8 halomaps:4685 +grifball.map 1AC552CE 174287233 262144 452c4203b77e7208245cecf065e29ba6a24afa29 halonet:grifball.zip +grope.map FB973039 23290343 262144 2ce612748bacda9d010c2218f5603039690f6860 halomaps:2238 +ground_war.map F9AFB6F8 80025837 262144 486c29c3f5f6b01eaeaef477d3de88e9feee45bc halomaps:5093 +groundbase.map 1C03755C 13709644 262144 85b07e12a2cd00d5a42a8969ad089b9600b5cac4 halomaps:235 +grove_final.map 783B7225 31984316 262144 203f0d88038fa1f941e87a61c67b89e703fa7731 halomaps:2015 +grovebeta.map EE7690F3 18916526 262144 9356148cf4d4b0ca580c6d07ac20fa856e34e986 halomaps:1295 +grunt-golfing.map A11D422D 26021902 262144 b50f8d2808025e7bc3f29a694c27b98a68242e0a halomaps:3441 +grunt_attack_2.map E20F3DD7 30112137 262144 5965729f39c3fa61f52e3b3b7b516093f638053f halomaps:1962 +grunt_attack_2_rockets.map 635C35D3 23664889 262144 ce617431372e18f78ba75e7f84b69195bc9e70ba halomaps:1969 +grunt_attack_3.map F46AA181 60760256 262144 d20a260f8f464a1571959ed07383787092e9ef37 halomaps:6392 +grunt_attack_4.map 5C9DA2FF 70619255 262144 47b3c7537ffe086cd8ca706b76483a20b5fcf2e8 halomaps:6427 +grunt_bloodgulch.map 6A2B75A6 52447023 262144 17a42d6f5c841ac13c743182d03170b1b1a8b836 halomaps:3561 +grunt_deathisland_testalpha01.map C1FCA656 73423840 262144 f7948df904e1e28c947ca2c5a7e7ad006e2e4337 halomaps:5245 +grunt_infinity.map A3786EBB 29593705 262144 1a99dd0ef815fbdd2bda8e43f7fa7968b44d37e0 halomaps:5297 +grunt_tournament.map FBA0AE41 21936691 262144 91835b9a42b65bf0353c3835dc2e3f642b054dae halomaps:3216 +grunt_tournament_hangemhigh.map 8330B4B9 80128325 262144 850c0bedbbcf7993f07c4ffcdd0623f4e4b5b403 halomaps:3612 +Grunt_zone_v2_beta.map 12BF80A7 25934893 262144 e6522f97007e3c7ffa70b9ef9fd78176fc5820e0 halomaps:2370 +Grunt_zone_v3_beta.map 14A83BE3 25747139 262144 57a0aa3709c85e42494ea2213001fbca40c1d046 halomaps:2371 +gruntattack.map 663608C8 20545343 262144 97c770e783e5578ca4bb2124d525fb9db2b12889 halomaps:1961 +gruntground.map D884024B 67385979 262144 aa8aeb5f0b3168b9813551fe2afb5c9354a73cfe halomaps:5946 +gruntgulch.map 4684CE03 18429101 262144 56ab741b1c4c23a5a6a1300acebef34211cc9b59 halomaps:3703 +gruntpacolypse.map 13574588 68263831 262144 1bf9c3616e6174130aadd77fc86cff25654a570b halomaps:5743 +gruntrevolt.map 1E8D0F59 35978763 262144 6b5cbee343ae03a4ebf0bdff22b2b38ac43a8cdf halomaps:4509 +grunts red vs blue.map 7D26FE87 33739167 262144 e757a492019d0e289a5e97681e80f7729686d0ae halomaps:6876 +grunts+enginers_vs_spartins.map A4D679FF 23625047 262144 ffe40b89d2f941e7a4a6ecd17f2f9fc5c70f9ab8 halomaps:4637 +grunts-vs-angry-floods.map B7B82040 74918545 262144 f48d100b080a54254a54b9b471ca14bc24b4fa43 halonet:grunts-vs-angry-floods.zip +grunts-vs-drones.map C3654944 37489105 262144 4a36e8aae934739a86a4d8f5e9ef1942dcf77e94 halonet:grunts-vs-drones.zip +grunts-vs-elites.map A01BC2FB 41442931 262144 a6df8586c45e41887260e008327046251d5bdef2 halonet:grunts-vs-elites.zip +grunts-vs-jackals.map 648ECBA1 49062732 262144 6775df03ad4fda8366c15bd2227fad889f6d7d7a halonet:grunts-vs-jackals.zip +grunts-vs-marines.map 774B2E5C 53563593 262144 a651f4e0e0683a2cbce40b9b5df9ae85e41b4b60 halonet:grunts-vs-marines.zip +Grunts_Are_High.map E67B7B1B 21563128 262144 32c72f6134e2ae63255553bf1315e4bc0be00ede halomaps:2432 +Grunts_Vs_Grunts.map 8098E332 255128105 262144 987d913eb1f9f9f2c4a03975a6d98575697b0135 halonet:Grunts_Vs_Grunts.zip +gruntsiege.map 55C1C474 50631930 262144 8205a3b6a59dc81bde9ccb074327a57995a48337 halomaps:4841 +Gruntsvsjackalsbattlefortech.map 13963CDD 39184002 262144 8a18402f094ddd7bfed5a5a8492fa18f0eab4d8f halomaps:4155 +gruntwarsbeavercreek.map 6E163750 90766500 262144 33137759f1c3e414ca1391a13bd683ad57601630 halomaps:1698 +gruntypower.map A7CA0D7C 31790673 262144 159b16a6fcc9edb7c00f72939b09edc3ccdea360 halomaps:4305 +gruntzone.map 5F718C30 19951651 262144 3f15feaf566b6b8928dba48df452c9652f619ed6 halomaps:2344 +Gs_Mombassa_CvC.map 82B7EF69 47834805 262144 c11b363c93c010ea94b375beceb58c171cf9c401 halomaps:5947 +gta.map F604CC7D 61671629 262144 a30c61befba1ec9dffdee318afcaf654d2b81720 halomaps:2952 +gta_beta3.map 8BBBFC4E 12682874 262144 5f0523a039ff45df923ccc8a4acd6c3db893c488 halonet:gta_beta3.zip +gta_beta5.map 1B6DF2F8 13787116 262144 c7215cd3b619b61d3d293cfdf0ca82fc3d915bc4 halonet:gta_beta5.zip +gta_beta7.map F714F4D8 13787132 262144 f3dddde14945f86e14315d6267bcd7fc975f0387 halonet:gta_beta7.zip +gta_beta8.map F714F4D8 13789633 262144 f93704e3cee4a64e0a0f891ae18981f84a18accb halonet:gta_beta8.zip +gta_raceway.map 82752F03 112507973 262144 3feaba48134ea2e3500f464e36019a652a709f9c halonet:gta_raceway.zip +guardian-h3-fix.map 5A902891 248361092 262144 4716cdd26763d6457ada38e3687f5e1c1f6481bf halonet:guardian-h3-fix.zip +Guardian-H3.map BC4C9252 242265901 262144 f7a1f799af076ea166744abf91619fc22db30ca2 halonet:Guardian-H3.zip +guardian.map B1E455BC 53654776 262144 d77dbf6a03ef6d4b2f4e565312df63a840512f83 halomaps:7006 +guardian_forest.map 01924FC2 268540465 262144 e182322030bd7c0bdae24a6cfaf6006d64b17225 halomaps:7015 +Guardian_Temple.map BD9F2215 291584453 262144 edd2ddbb86ba65c22ec42458d4b3587ecfeb9c9c halonet:Guardian_Temple.zip +guerra-de-tanques.map 8F62A5E6 52701570 262144 fffe73f53daf04615c4cf46673928ef89b32b2c6 halonet:guerra-de-tanques.zip +Guilty Interior.map 88455D93 129943780 262144 c3635d5f1c943e85b8fb7600645db2a06035332e halomaps:7007 +guilty_mp.map 0D931E70 74532073 262144 e3eaf76e6b96402e2d55daca90b046129e656792 halomaps:1927 +guitar_hero.map 74E46F74 47176944 262144 1613cd203ace9f6737b287328c6a500dcdaf7c0a halomaps:2667 +Gulch-o-War.map 141F31BE 42556223 262144 3fef3c30c048e4b48f158c019431c836964c4df1 halomaps:2633 +gulch.map 61F6F7EB 50178252 262144 cec545814cf36a13bda20c96b2c9c9b09d35fc2f halomaps:5566 +gulch2.map 14B18B36 23193772 262144 294cd3e0ba343074ce5e76fe4585ee577040f64f halomaps:893 +gulch3.map 788CC5BD 20582835 262144 65e59f205065a0842758fbb4100fd6cfd44d8e80 halomaps:1619 +GulchAlpha.map 577A6CE1 13672148 262144 e4765df6bb3c299539875742bc6dee3fe271df3f halomaps:4430 +gulchblood.map F8A2186D 33422959 262144 83a1d273a05d0fadbaea69be29dd4a794fc839d9 halomaps:4216 +gulcherhoohoohoo!!!.map 7D855DD0 17764604 262144 a2d610de5db400c104ca857aad98b80a061cc83f halomaps:4261 +Gulchtropolis.map EEA908F9 103535860 262144 4434bb419e4911da5ee2c2c8129d6e5498dc19ff halomaps:6251 +Gulchtropolis.V2.map 81B0C98D 93227148 262144 6e4887161d6cdcf64e2f3be6f02c38ee3e463e8e halomaps:6937 +Gulchtropolis_Night.map E57C64D0 93222192 262144 516e6eabc762c017fb4f6ce15b08a477ab3c4bc1 halomaps:6938 +GulchtropolisV2.map 895ECF9B 94292708 262144 bcd5bd70095fbdd54adce67ff854775e4e85bfde halomaps:6834 +gulchv1.00.map 02E1F756 19642875 262144 f3667b0a1dfb77fafe3b001537760db0aaee2e3a halomaps:4156 +gun_me.map 7A88FAD5 236169071 262144 2b622e32bb40625158292be4c9fdb92e8834edea halonet:gun_me.zip +gunboat_wars.map 68995F11 95652597 262144 07ca499490493337dff830048403cc73feb7ee1c halomaps:6393 +gundown_showdown.map 4A9A69D7 42794336 262144 fdec4e94475275073946623d941d19e47562a1aa halomaps:5127 +gunrange.map 94E6FD14 381707297 262144 935fe4634c551118c0573bbcdf63be2b603119cf halonet:gunrange.zip +gunshot_valley.map D72E6BE5 13316896 262144 e77a1d63c0010934f033ed3c755df50b8f2cc8f1 halomaps:2608 +gv_arena.map 1AE472B9 14156432 262144 10f526c32cd449abff6f924d6d6b7c0df2ffd77e halomaps:2239 +gyrosphere_alpha2.map 392B30A1 13101836 262144 02c81a0a5816320cf04bd326a57944587a86f3d6 halomaps:650 +GZ_H2.map B7F9BDA2 44516761 262144 9e658658b85743b954aa01e3f54ede5f79c31a25 halomaps:711 +h1.5_crossway.map 094E0BFB 13778156 262144 8e0484132977966ee53be14401320ae24444a490 halonet:h1.5_crossway.zip +h1.5_crossway_fix.map 094E0BFB 13778156 262144 f7b3ed8b3f330f73e5705144bcdab32485dffb5d halonet:h1.5_crossway_fix.zip +h1.5_decidia.map 6D822601 15893528 262144 e9a1d30a7c29fbef483276060bf243e09a409a30 halonet:h1.5_decidia.zip +h1.5_decidia_fix.map 6D822601 15893528 262144 37a8e001242c954ece7e5ed35b8cce55b7d0f768 halonet:h1.5_decidia_fix.zip +h1.5_doubletake.map 00AAE3CF 13909748 262144 bf4b592883bdd795bf455f7e2d827747f5ec5bd7 halonet:h1.5_doubletake.zip +h1.5_doubletake_fix.map 00AAE3CF 13909748 262144 ab83a48f30462cda84ef2b67344abc7391ca76f3 halonet:h1.5_doubletake_fix.zip +h1.5_downrush.map A6814DAF 13684596 262144 5758dd53f09f0701c5a4d7f519b551b8ed452651 halonet:h1.5_downrush.zip +h1.5_downrush_fix.map A6814DAF 13684596 262144 5f85420438cd9fc5f072e8959460b6fac8806298 halonet:h1.5_downrush_fix.zip +h1.5_exhibit.map 96CA5B1A 13839396 262144 288a87e39424977288d6dd28fd4eae23ea414534 halonet:h1.5_exhibit.zip +h1.5_exhibit_fix.map 96CA5B1A 13839396 262144 4fd6d36127ee4e8ed84b09797654c50b5da14669 halonet:h1.5_exhibit_fix.zip +h1.5_hotbox.map 449993FE 14175596 262144 a80145ea9454e72349e9753b694910d34282b520 halonet:h1.5_hotbox.zip +h1.5_hotbox_fix.map 449993FE 14175596 262144 60c01d50369b811fb0722a97ab0fc66d5151d615 halonet:h1.5_hotbox_fix.zip +h1.5_imminent.map 66531BA3 13745428 262144 b75600e8535cb3a624e0eb01d63a5a9c2bf7322a halonet:h1.5_imminent.zip +h1.5_imminent_fix.map 66531BA3 13745428 262144 85fe014db31da3fff81bff409f37330a44f53bff halonet:h1.5_imminent_fix.zip +h1.5_levee.map 4BDB4960 16403624 262144 5704951547e350d4409d95406d95a89117de2400 halonet:h1.5_levee.zip +h1.5_levee_fix.map 4BDB4960 16403624 262144 7b1b531dcde1e2a48b77cdc6b5d0354814e7cfa2 halonet:h1.5_levee_fix.zip +h1.5_madhouse.map B78C06B1 13713096 262144 7290733471d3785ec0f11e730c451fc1a705c511 halonet:h1.5_madhouse.zip +h1.5_madhouse_fix.map B78C06B1 13713096 262144 2306dbceed7ca0f4a3628ccdb602423ddd68a471 halonet:h1.5_madhouse_fix.zip +h1.5_outbound.map 7E153647 15383460 262144 136d2058c41f2c4c5e61af21c13f70eb2574ea32 halonet:h1.5_outbound.zip +h1.5_outbound_fix.map 7E153647 15383460 262144 25b431fba809ed0071354f16c139486ebf6c47ef halonet:h1.5_outbound_fix.zip +h1.5_redshift.map 88072204 14311204 262144 666fd8aff934256d01dd11358e8bc574b9a4e2d3 halonet:h1.5_redshift.zip +h1.5_redshift_fix.map 88072204 14311204 262144 3c9af90b221a737767aa7816f694e445713eec71 halonet:h1.5_redshift_fix.zip +h1.5_uplift.map EF542FD2 14220944 262144 8f3c0b0a88d01ea9a39da18504376ecb30189953 halonet:h1.5_uplift.zip +h1.5_uplift_fix.map EF542FD2 14220944 262144 1b8635fb6fe5d6132bab9ddc6825126cf212d355 halonet:h1.5_uplift_fix.zip +h1.5_zerohour.map 0DE55F13 19514112 262144 62f3f1a4ec1ca16f9321f92f0caa3a9c50bdd415 halonet:h1.5_zerohour.zip +h1.5_zerohour_fix.map 0DE55F13 19514112 262144 0d363493266be4dd013bd715aff882db4a37ff45 halonet:h1.5_zerohour_fix.zip +h1x_beavercreek_v3.map ECD2354E 104467852 262144 a4500c5f5cba0b3bb0225a91edb14374d73d22d4 halonet:h1x_beavercreek_v3.zip +h1x_bloodgulch_v3.map 1E598CD5 105566668 262144 0815151d0ad93dc93f3bd4be3fa2adde9293ea6b halonet:h1x_bloodgulch_v3.zip +h1x_boardingaction_v3.map 0113946B 106242464 262144 e99a4bae08704851dc8faafaf877c51becb46b59 halonet:h1x_boardingaction_v3.zip +h1x_carousel_v3.map A9BED10A 104337696 262144 4bc0d678a4990adb4825304dc13460566eafea3a halonet:h1x_carousel_v3.zip +h1x_chillout_v3.map 48597AFA 104173988 262144 211b3a075bf80457671e4771d4c7edd8ae6d847d halonet:h1x_chillout_v3.zip +h1x_damnation_v3.map FCEBD17F 107062796 262144 438a64fcea985f0053c086779a1fea07ba21e76f halonet:h1x_damnation_v3.zip +h1x_hangemhigh_v3.map 25A10408 102892296 262144 f5b11de8dd1a299538085bc8c87e6cba1ff2b700 halonet:h1x_hangemhigh_v3.zip +h1x_longest_v3.map 29A606B4 102264332 262144 cfa402c3a8df1121dc3da62f09ba70bdbb2f8e98 halonet:h1x_longest_v3.zip +h1x_prisoner_v3.map E1D5F07C 102934344 262144 1dde15eacd855655f5e1402b15d57b103d3532f0 halonet:h1x_prisoner_v3.zip +h1x_putput_v3.map 7690BBFE 105595340 262144 9889a91d944520d38ce25d8811433373781bd649 halonet:h1x_putput_v3.zip +h1x_ratrace_v3.map FCDCCD2C 109628040 262144 a3fd5931b149312dd8f890696a1196686b373116 halonet:h1x_ratrace_v3.zip +h1x_sidewinder_v3.map 22A67953 106657320 262144 6f510a5618800ee4ec10b6d0b2465f47824ca3d9 halonet:h1x_sidewinder_v3.zip +h1x_wizard_v3.map 91C3B2D0 104039184 262144 7ac3a3468f68b1e2d52572a4872f7c7ff9aabd86 halonet:h1x_wizard_v3.zip +h2 coag modded.map 7A340AE7 76804386 262144 780ff709a652093ea95a48431ab14b5a2e0aae45 halomaps:2635 +H2 Coagulation ME.map 265D6EE1 132648978 262144 4595e71111968ed18ba204f1302fce940ce723a4 halomaps:1106 +H2 Coagulation.map 7A340AE7 76804386 262144 d853900bd2daed57baa93c52b59f6b7104ba53e1 halomaps:1095 +H2 Oblivion.map 7062A6D5 72824806 262144 e3b8a392eb03485578111b99bad7bab2a83c2588 halomaps:1675 +H2 Shadow Release by Advancebo.map 2CB84743 18598284 262144 793dc1255da4809b5a33b3fe7d1a34cf896bd718 halomaps:4975 +H2-ascension.map 5C656349 58670350 262144 5738d64013a5837008c60ca7c38b78072eb215ba halomaps:1731 +h2-bgv2.map 4DBB1B99 51351107 262144 e944332b8c9277c2ced5d22001cb4ef413c56147 halomaps:1506 +h2-blow-city.map F7AF38B9 122289573 262144 0f26dd338982fb7e3270ec1d91cacd31a28f2fb1 halomaps:1739 +h2-danger-canyon.map 0BF2AB67 20657500 262144 755c6a66651001e3149cb6cf3b3c59bfa0611c64 halomaps:3669 +h2-dangercaynon.map 31942FD8 50235783 262144 139be146c08bb1d156ff4ee80f326b5835648e3b halomaps:1543 +h2-foundation.map ACC9E98D 24723441 262144 759c1a19b0fbaa19db0c11ffa9bce877578521dc halomaps:1240 +h2-gephy.map B1478A8B 51283618 262144 f56d53055ef0fae17d3907712c1f52beb4d2fac7 halomaps:1544 +h2-huntercreek.map 79552A76 46870526 262144 1435e3f728717e35d85dd6cb0cb4a4c3fad8cf85 halomaps:1495 +h2-innerpoa.map E9EB0BC6 107777079 262144 d85b747c5d5d9fe9f9a4b8ba0beb3af7d337ccff halomaps:1466 +h2-lockout.map 968CA6B3 59101759 262144 2f11b07d668790405813845d7a9906d8849a046b halomaps:1699 +h2-lockout_final.map A47E5C39 69240095 262144 1403487105d45225783ea7103706a3a5defe0fa4 halomaps:1740 +h2-lockoutv2.0.map FCE18B76 73662932 262144 7c3c52ad60e2bafb28b71d58d66a1e84b42720c6 halomaps:1709 +h2-relic.map 7C03B89A 25033189 262144 e40acd8d1b7d9a5b6ed2621c994de342af4811b2 halomaps:1252 +h2-relic_V0.2.map 8D9FB02E 47749727 262144 9992eea43f8b64b3f300b547e0b17f1f3f0bc3cb halomaps:2433 +h2-snowing.map DAC59316 69443949 262144 9b034c66b048519fd010a1264a209cb0d1df3aed halomaps:1467 +h2-warlock.map 65F0D615 27585925 262144 53246e8511b9d44787f59e0ef32d285463eb2ad0 halomaps:1166 +h2-warrion.map F29D2033 28025598 262144 273a271b22c2b1a74408e0cf5eadab95eb14a669 halomaps:1190 +H2-xXxTrainer.map E27BA30D 54101961 262144 2260c4c25d8131814241cd99879ef40a0502789c halomaps:4339 +h2_ascension.map B5DF63E3 45171888 262144 5e4977b42d36839e319662cd8b5b218dcd427f6f halomaps:1550 +H2_Backwoods.map 359CDD9F 57007077 262144 5e5d29725e1c2ba63dd8d391ce9c7994ce879ccb halomaps:1155 +h2_beach_assault.map 0B64BD06 80970052 262144 dbd9740805035a22b5f5a80728326f16bb816af9 halomaps:5005 +H2_Beaver_Creek.map 1EAB3D92 52670293 262144 a07a52d38ffc4d095f72ce21b6b910a81d5864c6 halomaps:1160 +H2_Blood_Gulch.map 772AEB6C 59053893 262144 3c3895ef85184cd39e191d4adfb735a704989c0d halomaps:1161 +H2_Blood_Gulch_CE.map 87C91358 36092917 262144 09e1a8a4835a9e790036e89ea3dfc36d998d2edd halomaps:3670 +H2_Blood_Gulch_CE_V2.map 7867F882 42812233 262144 90580d77723869d0bbfe06209dd9d057ef8877a4 halomaps:3683 +H2_Bloodgulch.map ABAE1AA7 61620300 262144 b867d2644a1b95ac734bae40653b5a5e7e179774 halomaps:3727 +h2_canyon.map F23E5FB4 26560872 262144 d092022e9bc1659cbe364007bd23b291631a2b11 halomaps:1485 +h2_coagulation_ai_publicbeta1.map 9D32ED73 132721425 262144 0d03d4856265bace5cc4fd2fb36a3d015400a246 halomaps:4257 +H2_Dangercanyon-V2.map 62274AD2 78789125 262144 eabaa89cde9fcc4919c0364105ce3b1d83b2a8a1 halomaps:4027 +H2_Dangercanyon.map 111CB2D6 79736386 262144 c2238d555827c1bfa447df6f43776e218578579d halomaps:3788 +H2_Deathisland.map D738A508 57616260 262144 a6e463b4df00eb8657a913281f6a3e083b59d34d halomaps:3728 +H2_Deathisland_RC2.map 1170B9B0 82298302 262144 a5aaf51dbb510ef2f84a01e940a2fcce1fff202c halomaps:3750 +h2_deltaruins.map FD285BDE 75592033 262144 f8ad39d83f0482e454d2497bef0d92ac767698b2 halomaps:6877 +h2_derelict.map 82004BB1 20670872 262144 2c172420b23763b3418737fb63c872dc45b9787e halomaps:1561 +h2_desertplat.map 14160028 170325327 262144 c97abe4a950fcb6c89c9d6484a2a8a924264c053 halonet:h2_desertplat.zip +h2_fremantare.map BD1EB4C5 21364544 262144 b405dbc454f4dc226e30027ec35fcb408a0f5332 halomaps:2749 +h2_fremantarev2.map 6DD73B10 21640815 262144 c06dc432f2fa6673189b57c12ee6584d17ebe693 halomaps:2777 +H2_gerophobia.map E9550DFF 41859895 262144 315584f8afbde3288da82d3272c9b47d99cae9ee halomaps:4196 +h2_h3bloodgulch.map 024A9E49 44765773 262144 6d5152eeb14fc93c09efc84b1e576bac12afb3c1 halomaps:4969 +h2_h3damnation.map D3A2FC44 41763197 262144 4ff2a4a50070a1b287aa1244101e582e0d8ec01f halomaps:4982 +h2_h3sidewinder.map 59C66992 46093849 262144 c0e977625bea8f388a85e50b24c36b0530a696f7 halomaps:4983 +h2_headlong.map A030683D 73395951 262144 e578ddcb2ba0857b6c41c4f4d63f81f9b780e732 halomaps:1225 +H2_Hypothermia.map 2C72802F 65227226 262144 eb2166fd1f58f3972735b852d6b853e9ed81d72a halomaps:2434 +H2_meteore.map 47D791FA 50471798 262144 689411f2e271504a8ad751e0a72b0e9751159203 halomaps:3094 +H2_Momentum.map 6F46B2F0 51904537 262144 70e739a0e7d868c2da95a1c0bea66f182daa1548 halomaps:1156 +H2_New_Mombasa.map 2D97FD8B 75727085 262144 e0d86979028d1df531d453a059460ca19d14a852 halomaps:1154 +H2_New_Mombasa_v3.map 2D97FD8B 75727085 262144 7acafd052d66651206afd6d9a12db1e4ecb56a9a halonet:H2_New_Mombasa_v3.zip +h2_pinegulch.map 390489F5 27322303 262144 ebd3ae7304283540dcec61fc7f8d0cdf009afcf8 halomaps:4939 +h2_regret.map F9897706 82593007 262144 81d8519f1fb12fd6ff5d7ccb38d74a98721150f9 halomaps:5061 +h2_regret_v2.map F1EB363F 83526335 262144 f1dc6bb60fefcbab2ab4a360383d6229237e5ae5 halonet:h2_regret_v2.zip +H2_SCHOOL.map 3C467DDF 34453267 262144 5a925a44e887e19ab564f755e6f55b3e3c107fb3 halomaps:2718 +h2_school_Final.map F77CEC43 54733901 262144 4570ee12088c92a36ea95cb3ea5e9688b4f883fc halomaps:3095 +H2_SCHOOL_V2.map 51DF9CEC 36119321 262144 1e8256c3e04926679b169a9e9904cd60cf5204fe halomaps:2778 +h2_school_v3.map 0F867BC7 51461172 262144 6f3237956804883c403bcbd72d3266c6e84bd46b halomaps:2903 +H2_Sidewinder.map 992C7C13 61900874 262144 efa9234214126dc9ce3fb511aad62daa8b1b08a2 halomaps:3729 +H2_Sidewinder_With_AI.map 663E1EC3 67753712 262144 d297de4a8df11954788c922355d488c55a6b99a9 halomaps:3790 +h2_tropics.map CF8CAA7C 20112480 262144 98bde2bfcb39e753bf401d91110ca626562bab72 halomaps:1334 +h2_tutorial.map FF497A72 18056345 262144 fdb276bf3c02f15bcaf78c9ce2644dce7d35ccdb halomaps:2971 +H2_Warlock.map 3EFB34FD 62706185 262144 ef37e0a4385ce7bbb4826334d2f4a105df50e7c4 halomaps:1152 +H2_Zanzibar.map 7060B488 80340287 262144 e659c7d0f0ffdff7ef24a47cc2b727d97b1cf3c3 halomaps:1153 +H2_Zanzibar_v3.map 7060B488 80340287 262144 8eafd9ad8014249fbf218b85461453bb3f79c021 halonet:H2_Zanzibar_v3.zip +h2battlegulch2nigth.map C9676B89 119764036 262144 d96ae0cf931fef14af59b554c1d7e627315f9b3f halomaps:5915 +H2beavercreek.map B5A7825E 25096230 262144 92bd99c6a9ccf3d7b434e1229a5d3a2527cbfe4f halomaps:2885 +h2floodgulch.map 4DD11D2F 129209425 262144 6c644258a74f1839f25fa2af75f713afea3e8947 halomaps:5567 +h2floodgulch_V2.map 058935BC 128719890 262144 82d985c0043fe524fe5b09bff13c0d4f939f9a06 halomaps:5634 +H2H3_beavercreek.map E4766F0C 52624320 262144 806e3fbbad6152c3ff404f5345be7f3e700e41fe halomaps:5926 +H2HUDgulch.map 8105295D 23641116 262144 2dcc5cf9c03913b06e7a5723424c2ca7fe2a3b2f halomaps:5871 +h2v_cyclotron.map 25180720 107069723 262144 d3e426cd258a0b7ac5856293d7824da803c0e618 halomaps:5962 +h2~Chiron_TL34.map B89A60FD 39416313 262144 f9f08e48131efb3e0054fec266a4ed28b4ae18be halomaps:1492 +H2~Eternal.map D0C28757 38450815 262144 34b4bc9aa480e481969722016b04c60ef62d4347 halomaps:1317 +h2~warrion.map 3FBCC6AA 27685350 262144 e6a98c457d14381648699af1316f3dff249e076f halomaps:1620 +h3 foundry.map F8C7AF2F 133865339 262144 ee51cd330d95d07f31dae144ea81d06be20d3009 halomaps:6677 +h3-ample'smap.map 3C88616E 177745059 262144 f3640c1b33a01ae31c828c507fa7c122195ff797 halonet:h3-ample'smap.zip +H3-Beta_Ample.map 64D6CC73 270607472 262144 77b08cda9d4e91d36d5303a5176972f6adb24dc3 halonet:H3-Beta_Ample.zip +H3-bloodgulch.map 1C521CA6 130383071 262144 bb6d71164daf99e26a8cf12b01eb3dd267daa759 halomaps:5510 +h3-coagulation.map B10F4DEB 209742876 262144 c9387dab05c28f40ba5640219281e95149199574 halomaps:5156 +h3-deathgulch.map 7607BC51 132004202 262144 ae87e5e14aa7376a0cc8a61ce7d03568ccbe2afe halomaps:5687 +h3-heretic.map 2B7A2B1C 180775467 262144 4192ce55732536074e3d8fe7787966182ab8f347 halomaps:5246 +H3-island.map 8DF2993E 87356014 262144 5ba4cffe74ed08079c06500383299cf656252934 halomaps:5511 +H3-NovaGulch.map 878D336B 189001224 262144 42f8a1c573a6515298ce1ba56f94e67d8e3e85e8 halonet:H3-NovaGulch.zip +h3-reliquia.map 80EAF770 112530321 262144 c547d6642e80ff39d4f8f39db049b837f1492aea halomaps:5103 +H3_B30_Mod_Beta.map C53E5F2D 149188700 262144 077bc2aa65f5177eb83f87516c43a54f2e78140f halomaps:5637 +h3_bloodfores.map 4C0C3061 120885643 262144 adde305e4255b0259458c288703b41eea99b44a9 halomaps:6230 +h3_bloodgulch.map 603168AF 126027556 262144 c798053c3e80734d458aa18c45070f26cadfa832 halomaps:6281 +h3_bloodgulch_alpha-2.map C3DBD674 108009774 262144 dd2401f011847d6b3540a4ce35a506692f30c3c8 halomaps:5877 +h3_bloodgulch_alpha-3.map A77F1DB0 161232311 262144 c7925fb64cad4be59ee0bf1ff12104177fc187ba halomaps:5948 +h3_bloodgulch_alpha.map 062C1508 136506911 262144 529c59fb3890f57037c2cf4291c10f3540709d44 halomaps:5876 +h3_bloodgulch_death.1.map 2A37ECDF 93356226 262144 41c792c6bd2d633b3e99b29ad7ae44bb0ddfe29f halomaps:5850 +h3_bloodgulch_death_battle.map 44579A7A 132568774 262144 2f66fedbb03e590ca5c0fbb4493e306c3ed7d401 halomaps:5851 +h3_central_electrica_beta.map 834A47F0 234638385 262144 8808776a280d420b829db2e3e94602039fce5b2f halomaps:5839 +H3_Dangervalley.map 01D7CE4E 372025195 262144 8fc7c69f4e3fc3db6c2c88ee4bbccf77a7641d72 halonet:H3_Dangervalley.zip +h3_deathcañon_odst.map FC8605E6 194495318 262144 0af227ca3e841d2e4c8db29da33f748f29a88fea halomaps:6231 +H3_Delta_ruined.map 5FBB343C 52216744 262144 e9324121de958b291e20770d9341f1ebad8ac3fa halomaps:3207 +h3_derelict.map C42C0412 113614398 262144 4540ccda58560243b79458bb52f314fe18890df8 halomaps:5756 +H3_Guerra_Total_AI.map 03B7D401 312819707 262144 668459ba92aad1fcfdcf17f4a28fd40354efdfcf halonet:H3_Guerra_Total_AI.zip +h3_Hard_em_High_V1.map D72F8D22 162297333 262144 04d380994112b269f7c5516dd3b88f82f708347d halomaps:5872 +h3_invacion_beta_1.map 98B6A113 119964482 262144 44b2627b5f7963ca8a2d5a476576805c01603808 halomaps:6215 +h3_longest.map E4EB1A14 36295001 262144 cbcaafe71b621607bdc8ccef5d9084dd9b7c95ab halomaps:5139 +h3_narrows.map E981B041 127123984 262144 a8e34f2317231d0ef82d46c120e0e2a2274da00e halomaps:5783 +H3_plains.map F1921856 25720937 262144 6439fc584e283bc0ea6832655148e1b4c6a5fee0 halomaps:2372 +H3_prisioner.map 38A1F1A5 95348399 262144 7259e765b96175fd3946403a46010ae6340a1482 halonet:H3_prisioner.zip +h3_space_gulch.map 76DED7F6 115726795 262144 b864ba00e659fba8575f63b38a97075a680aadf1 halomaps:5840 +H3_Tower.map 2D51ED3A 96395613 262144 53b55236276b5c8533f02f91a82e2604e3061db9 halomaps:5927 +H3_Yoyorast_Island.map B248E52B 89612141 262144 41d13ccaaf0aa1dcd50ca7390c5b1e0e5045c1a6 halomaps:4620 +h3_zouina.map 559816B8 63799424 262144 91f040dfc58b72b0f7de21f9dfcc9570685050d5 halomaps:4667 +h3_zouina_remix.map B10248F9 55245780 262144 2b321be12b9be07c85e710add493da3ead66edc2 halomaps:4672 +H3Damnation.map D07BE864 91141495 262144 c6b5c658c41cc0015129b874a70d302fde41dd72 halomaps:6019 +h3mt-foundry.map 2E3B9BAC 132376855 262144 95a617ff74e04c3bd43b03b54bc2d504093ef005 halonet:h3mt-foundry.zip +h3mt-narrows-pb1.map 3F9D065C 131418501 262144 9991c101e98f3a889f39b509d52994bb44e352cb halonet:h3mt-narrows-pb1.zip +h3mt-narrows.map 8723BD96 82805477 262144 30b12b2dac6ad48ce976426d60ac4d7e26d18265 halomaps:4405 +h3mt_bloodgulch.map 52D45B41 134094095 262144 c82436faad5362d2208fcc574cf7cb26574d2f8e halomaps:5094 +h3pelitest..map A2FD3133 41296286 262144 3cc255e5cd687b0d79f1f03082224075d75a5412 halomaps:6178 +h3t-coagulation.map 963D896D 113245721 262144 8fb275b5dc61872b3b0512f621f9d8b5f055e773 halomaps:3359 +h3t-coagulation_pb2.map 87DB58ED 84102680 262144 c187e02d64ac1ce255faab22afd114db3c54db2a halomaps:3411 +H3T_BloodGulch.map 4EF58392 18750908 262144 738cd1936f222bc06aa82e59a4e3f6a15e7ec1a7 halomaps:3048 +h3t_soulrunner.map 269EE3E4 52688498 262144 e49efdccb29812fe3fd296a9ace72b6204d54cc1 halomaps:3185 +h3the_pit.map A4A7ABEA 156060426 262144 ca2be6e19fe9d05e12cc5f0967c97c035c060d6b halomaps:5022 +H4_Bloodgulch_War_AI.map 2EC3E3E3 373279732 262144 a11aded4668d557edff3bd2364b296e3b1149eda halonet:H4_Bloodgulch_War_AI.zip +H4_Chaosgulch_AI.map 453D6296 343767088 262144 3a4d3f63e632dd75e066517e127bcc342151b0f9 halonet:H4_Chaosgulch_AI.zip +h4_estacion.map FBE4CA92 282675857 262144 d3533a47d8a2b93864c59ea953baf9b070f01558 halonet:h4_estacion.zip +h4_lockout.map F876114C 370534865 262144 ffb63bb3132fe948ac6b002360018fcac9bfc864 halomaps:6709 +h4_snowcast.map 306D805F 394247900 524288 9e2477addd8ab81b2eba0f173675756f5ca3ae55 halonet:h4_snowcast.zip +h4_vs_h3_spartans_rockets.map EFB90125 282375620 262144 59f0cc6ec64ab0612b5fea1794b51b5ae4ecb616 halonet:h4_vs_h3_spartans_rockets.zip +h4e_putain.map 120E16C3 42293799 262144 6ff2753f546a2d49a957864930e6645378d73f02 halomaps:4248 +H4X.map 733BBA70 39315376 262144 c68843ff99c973bd8640eb1c5a2a75c76350161d halomaps:6095 +H5_Battalion.map 00CED108 399554271 524288 cc849628e7bf2a8ffd7eba9e740b9b8906f1b483 halonet:H5_Battalion.zip +habe_quidam.map 92E357BB 14630520 262144 2e3570c154734df392b8655110eb99a3f07148e5 halomaps:3236 +hack.map FAF1B589 13940556 262144 d1f3b30282c4b6601170448312fd9e586317e335 halomaps:468 +hackledjackalsinabrutalbattle.map 4827D4E5 30680820 262144 059fe6839add6414f13a977c52863bd563b195fc halomaps:6020 +haf_training_grounds.map 3CF17F2F 12207128 262144 ffa9b1035db5f78774248f95659d17d424cbd4c6 halomaps:2685 +Halcyon.map 695308D5 14666768 262144 4e5c06b6fbe7103bbb505e1831752116358fd933 halomaps:236 +Half_Jaw_Danger_Canyon.map 78841AA1 25381509 262144 7116ad0bf586533cd369678e38d3fbafc2968e82 halomaps:3660 +halfa-remake.map 43D31133 369219786 262144 5f14ce0f902c67d085b619b7efc9fa4a6747f4d1 halomaps:6926 +halfa.map 48F9C634 125200348 262144 015690c9fdc4f48165978b27851c30215797e1a9 halomaps:6796 +halio.map E7B455CD 34157787 262144 b23111fcab0823a0ac5886c3e8dac17bc032353b halomaps:3255 +halloween_gulch.map DF9E1F76 102550175 262144 cb33f2c001b19e62f219e76d0bd4f607428b2482 halomaps:4094 +Halloween_Gulch_V2.map 99F20964 120405225 262144 f8dd5548c71ee7dc2fdcccbab9c37048be350927 halonet:Halloween_Gulch_V2.zip +Halloween_Investigation.map 433F04C3 78567540 262144 5e4bd4bf63276f6ff3421da13aa8d5f3783c804a halomaps:4071 +halo-mod-map.map 5026EC3C 32995700 262144 28445380ab40b70e864cc87c655d005623c4dc12 halonet:halo-mod-map.zip +halo.map 9EB6133B 22047536 262144 92c2a5622bddacc08afda9639ceed73cace7ed43 halomaps:898 +halo2_backwash_beta1.map BBA2729B 44976584 262144 151782d424fcdab44a2c8693cac231025927a045 halonet:halo2_backwash_beta1.zip +halo2_characters.map 6B6AEFD4 36105470 262144 e4f7c749faa1dd08321eea640e6842933570781c halomaps:3850 +Halo2_Gluch.map 83505C17 86511000 262144 56a8be527cf47e86beaacf7a061c7ee4a0343c14 halomaps:5043 +Halo3_new_blood.map FDCE5C37 15686320 262144 1d30dbb946445262a8d64080b1f3e08d2f6b5490 halomaps:3471 +HALO4.map 0FC4870B 80151558 262144 4a080aa27712fff4dad117deca373fdb4dec0d2a halomaps:6693 +halo4gulch.map 192B4C1D 49371023 262144 2afa05bdb880a3fce6a6c0e09daa5cc6e8ce8297 halomaps:6520 +halo_2_lost.map 454AC696 67857005 262144 b84b05fc3d7ba6d4cd5e9414e5e1d96645caf336 halomaps:2435 +halo_arena.map D9C33BF9 15458280 262144 d7d34b40a78c2c4286a6e2aa978eeb9aa0aebc2e halomaps:1597 +halo_ball_5.map BA2CF301 21907844 262144 85acb22ad5097e4f44913a5fbbf5247a1d768839 halomaps:5006 +halo_ce_machinima.map 49D1E2D9 81744807 262144 8845952ce798bbcbcde2caa4bc81cacd67e458ec halomaps:6494 +Halo_Deep_Ocean.map 0476C594 391706554 262144 443123ad7df1c2536938be336ab09dfcc85a5c6e halonet:Halo_Deep_Ocean.zip +Halo_HQ.map 52E965E5 19819421 262144 0c646f6225b3d128b1e9fe64833c9a128c61507e halomaps:237 +Halo_HQ_beta2.map 9D3B875F 19885748 262144 7b83bab97723c1669f94a3e65471bd1711cd0d49 halomaps:238 +halo_hq_race.map E8EC8D8B 17859257 262144 75830e4b3a1cba9ade6f5026230cc046b8f94326 halonet:halo_hq_race.zip +Halo_Islands.map 3952F415 103750858 262144 0c87425cda9f40f59e08fca4f1df7a402c1e0d89 halonet:Halo_Islands.zip +Halo_Kart_Banshee.map B688358E 83214112 262144 c7bd8cad85fd0ce95686f7709e8f4031f119e1cf halonet:Halo_Kart_Banshee.zip +Halo_Kart_Bowser.map 355D8A39 66016372 262144 3450ce5b8c33c1ad8ab22e72bb61df4f3bf3d091 halonet:Halo_Kart_Bowser.zip +Halo_Kart_Fort.map 1EDF8C54 57721664 262144 dec30e92d66f472402542715f45f6104d52bd709 halonet:Halo_Kart_Fort.zip +Halo_Kart_Koopa.map 6FDD8B7A 64136928 262144 5b03fa3aefc894751a20cf72b6e3ac7c7b4f15fe halonet:Halo_Kart_Koopa.zip +Halo_Kart_Moo.map A76C2C93 69519856 262144 dd55fb0453a266ce78092bf077628a5140264956 halonet:Halo_Kart_Moo.zip +Halo_Kart_Peach.map 899B5141 82251916 262144 de2f77d9f0c4c93d853227054eff1fc92cb281ca halonet:Halo_Kart_Peach.zip +Halo_Kart_Sherbert.map 54306454 61939356 262144 9468929029450403486e7037b5475f3c90591e90 halonet:Halo_Kart_Sherbert.zip +Halo_Kart_wario.map 517CC7F8 70729200 262144 e5c03b7fe4fd0fa48be4c8610cc7f5b0b07e1f37 halonet:Halo_Kart_wario.zip +Halo_Kart_Yoshi.map 6551CF45 65769272 262144 6abe96b0b9ee8ef8e016778a3b849f6fc73e07a9 halonet:Halo_Kart_Yoshi.zip +Halo_Oil_Rig.map E8B79375 390513794 262144 4c0dbce69ba35479e8150b224c9df5795895596b halonet:Halo_Oil_Rig.zip +halo_skillz.map ABAB7A19 260642052 262144 5cfea675677f58656623e6d539f631ef9908d20f halomaps:7016 +Halo_tournament.map 1DF113A1 53004116 262144 4eb0c3bf9d99b2659580c0f2b3579dc76c29dc40 halomaps:5172 +halo_valleys.map 60D96FBE 70107736 262144 ce085f0f89c148fa726144c6804b932e2a4ee2d7 halomaps:1496 +Halo_Wars.map 434AD818 99216629 262144 e3615e5f78116aa28b35253e94aa99c774d5df28 halomaps:2839 +Halo_Wars_Beta1.map A25720D7 83734071 262144 f270d0344ac59532dd05f4d8ba451d600af74fec halomaps:4441 +Halo_Wars_Betav2.map 08F8B5D1 64915554 262144 51c0b515de322da0f1f89df9dfd5761691fc9047 halomaps:3130 +halo_wars_betav3.map A304E0AB 128569091 262144 a27b593088519f2356645cb8c6e049942147b7a6 halomaps:3963 +haloball.map E9126A18 14917108 262144 cc9cad324f70e6baf37bd146230b79bd962b294a halomaps:239 +HaloCE Map.map 7B309554 13936092 262144 125e5431d1be7011ed9a938e82121d998be23975 halomaps:1162 +haloceripper_online.map 7F2C31CA 104517975 262144 6b6445f4d09bf2ce3c8393349ac6e70185ffeaf2 halomaps:5674 +halocombat.map BE935DE4 47035548 262144 dc598d00d15f080ac61ca88f569509a3adea9af1 halomaps:2331 +halodust_beta.map C3C39AE4 24811428 262144 cd4d4388f8322a9589ff06ade29c977de8676d11 halonet:halodust_beta.zip +halomp-lightbridge.map 521EA965 28492444 262144 8036eb95ec54f37c1c3ecb3e994d23a8883ea45d halomaps:726 +halomp-reuniontour.map 43A75CEC 33064560 262144 77f5ab60f3c227386b87ec72b746fa999a7ae8c1 halomaps:723 +HaloNightHorror-ep1.map C56A4FF7 18634681 262144 08d4d470d30e87809405f6bcbf49dd7a4f97caf7 halonet:HaloNightHorror-ep1.zip +halorally.map 9D64B8C4 16646432 262144 e407a9cc083d9cacbba0130af303c82db2d43597 halomaps:1335 +haloslenderswamp.map 5C95505B 77846644 262144 f9ebe02f21a5cb4aedc5791273eb609b21583766 halomaps:6720 +halosocial.map AF0AC0F3 20240618 262144 cda12b2ee55a9b58ad8b999eac41080cd28375a6 halonet:halosocial.zip +halowar.map 19CA4629 82424064 262144 34471d0d3e9690974da737c50e964b5f74b9eb11 halomaps:5568 +halowar_v2.map 8C33CD29 83290410 262144 f3d1e9d7e53e2acbefb621561d882a1215c0c975 halomaps:5592 +HALOween.map 505AA5B5 56527536 262144 74d1e2d53de6bae24f1a3887d711f3940caca5ca halomaps:4028 +Halowood.map 5F6AA0A9 57580680 262144 e45ae066931d0eb762d5cb5736d06cf48f315366 halomaps:5784 +hang_the_ai_high.map 89BA5CC0 67475825 262144 ce2cf373c7bd34ea43ee81bd1671c47396293082 halomaps:4249 +hangem_even_higher.map E78B38B1 59840828 262144 b065dd85c35ee594b90be1f91a6918e8c59ad755 halomaps:3613 +hangem_high.map 00000000 199487058 262144 f4e30b814f884801277b1bd0f6be1f38c683937b halonet:hangem_high.zip +hangem_higher.map 19A57E2F 17988288 262144 4a95b37f208c1b06a6591f480ac28c925d6d598d halonet:hangem_higher.zip +hangemhigh.map A7C8B9C6 12727888 262144 4f59ec1c40f299ff529d36dbe4198a16643bb1fd halomaps:4781 +hangemhigh_rm.map A7C8B9C6 304473188 262144 4203935823d3a7f94202c6a71d061475574b8e78 halonet:hangemhigh_rm.zip +hangemhigh_tmcc.map 640670B3 36486360 262144 aa54dcad43fd950298238f862af538c0485957bb halonet:hangemhigh_tmcc.zip +hangemhighai.map 48CA2CD9 49884810 262144 169ea3b872519d4f4c5c2789410d0724007977f0 halomaps:1786 +hangemhighmod.map F3106082 74089836 262144 b259b242cb31629df6c10d17af14ec538fdc433f halonet:hangemhighmod.zip +hangemhighsnipers.map 72C5DF3A 14670650 262144 fafbc9f0d1febf92c11bf100fde39eb6c602b512 halomaps:6246 +Hangen EM Higher.map 318498C8 62776253 262144 934ee252d5d59ebdd02a348ff1106e8c6093788f halomaps:2158 +Hanger.map FA7C4D40 57440782 262144 717765b65005bfad6412cf7c5672c9f6910fd69a halomaps:1444 +hanger_strike_ai.map 45E2DFAD 94548566 262144 2a69992fc1c7c6b79b27dde10c1a4c56643727cc halomaps:3351 +hangout.map 201207FC 52793487 262144 19fef3e2a00cffc7189ebe5205425c6ba3f878b8 halomaps:5328 +hangover.map B2AC5A2D 34799986 262144 4af5f2bc132ad770daf68fa6f5f7a52102d9780c halomaps:3896 +Happy_Meal.map D2BAE435 186176707 262144 3706aac28e0f5b068347a451ad63e8fdfd472cea halonet:Happy_Meal.zip +harmony.map 4AE7B39E 229501798 262144 9150ef7352816df39e942aa19372367eafbb2847 halomaps:6969 +hat_castel2castel.map E554AE2D 19840208 262144 932fc0bc8924d38ec87a26e99645ff329ea3a1ea halomaps:438 +hat_mountain.map 0853CAC7 19848408 262144 d933530caebdaf0a82aaffe4a7900084937d43b5 halomaps:6970 +hat_mountain_2.map F85EC4C6 23653408 262144 1f51e023005cc34941bbf5f5b51d124ee80cf34b halomaps:7008 +hat_thinair.map 810412CB 17473544 262144 834a795f0026369d25b17b473bd73e7d161460f2 halomaps:362 +hats_off_to_eightnineteen.map A5CBD0B7 13781008 262144 ac7f9db1ba5eac0b4515a5f2c7c83b6a3ee3a120 halomaps:3318 +haunted_canyon.map D4823914 87488678 262144 32e91485501c761e74eb2a8fc774ce8708dca342 halomaps:3292 +haunted_creek.map 6077F3CE 41137026 262144 ccb3d18eddacdcd6a40f59c4866a0198dcac5cfe halomaps:4510 +havana.map 9689E2C7 25789732 262144 ad463c1620f2a02c5ab7a8575820197be936df0e halomaps:3070 +haven_unreleased.map 7FC86197 95071728 262144 94c9d2b0019cd01cce4e7b249952a901fd7a4bd6 halonet:haven_unreleased.zip +havencity.map 0F83B4B3 18386722 262144 4e67a204d5a8c23a04c2e3950bfcfad7a57529db halomaps:1079 +HavenH4.map 12727735 17689464 262144 8494cb9a6eb06aabcd0afdc17e89fcd089b4b0b4 halomaps:7119 +Hayabusa_Ruined.map 7520088C 60557767 262144 b13da4b59c4ccea767237a1f9e85d48863719b2c halomaps:4567 +hazard.map 30F7BD50 394850031 524288 4dcf53da18bbaac590a98f3e7d553438a2f89bc5 halonet:hazard.zip +hc-hanger.map B13E25B2 105762792 262144 d30481bb462e23d8e35a321c854cb9d21331678c halomaps:1455 +hcbloodgulch.map A47F8768 24515714 262144 357eb484f66ecf6cae5789f74068f25a5c0db15b halomaps:4406 +hcel_corrupted.map 7034E4BB 16657844 262144 6b4c82202903f3760754612f22ef4facefbc18e6 halomaps:4865 +hcel_gate.map 77F9A18F 22916604 262144 bafda31e32e90ddaa60c034c4cde38a7c12865f6 halomaps:4866 +hcel_orion_final.map 722234B8 18268768 262144 3639b50212f31b39d513715e458a05a9c15c9bba halomaps:4867 +hcel_tensity.map 0277B817 24973592 262144 38b446be5a8a86b4ed9bd12f158fed26a0d897b1 halomaps:4716 +hd12meetfinal2.map C4F9F6B1 62166225 262144 d019d89a5a2d66dbed6c76cedddf290b589a7567 halonet:hd12meetfinal2.zip +hd7big.map 156C1AF9 107270651 262144 02f9de5cc543d609f8a2490e4bcca8142501624f halonet:hd7big.zip +hd7boom.map 0FA846D8 110458223 262144 2fbabed97be9bc283ddb5251b913de7983f59fee halonet:hd7boom.zip +hd7deathfinal.map BD814720 35357457 262144 9aeef7282747b6431cec9c991c4679ccc1c41e58 halonet:hd7deathfinal.zip +HDK_dangercanyon.map 075DF75B 53374701 262144 27e7c1d877ebf7d2d098b9b6e9ee5c79dbb2bcde halomaps:3280 +hdm-beavercreek.map 7F990899 17175856 262144 34ddc4d58b8089538a2ccc9026bb7f7067983c54 halomaps:1434 +HDM-Beta-BloodGulch.map 4A8CA0DF 17451484 262144 fce58f670a0ef5763ba220eac5502df9d4164180 halomaps:1216 +hdm-chillout.map BB8A7A06 16799048 262144 a28e079ae46fcc56102d753fd5a2cebad88951d1 halomaps:1435 +hdm-damnation.map 51C114A9 18067912 262144 fc63af3db856cbaf90a253125d62dcf4198ae5c2 halomaps:1436 +hdm-hangemhigh.map 3821E7A3 16805692 262144 674d2c3881d187fb51ed5f91367c74a99cc5637e halomaps:1437 +hdm-sidewinder.map 6961ED25 18917856 262144 7d9c0173b756573a54f2cac00f6224d47e809242 halomaps:1438 +head_on.map 6B1726C0 19244320 262144 31da8cf974a9e56b94b478d31fc0efdefdb80cad halomaps:749 +Head_Water.map 3631C1C3 16986292 262144 baa14093528271ba217de92970e14c5764e486c0 halomaps:2159 +headcrabs-vs-parasites.map AAACC5FC 32240845 262144 4a94a120dd9e85c05c52cae38d48268ba8cd86cd halomaps:6232 +Headlong_PB2.map B56F7058 110542025 262144 e19ddc980bd6362918c87bc7476cb56ba14fd689 halomaps:3438 +headquarters.map 7BAE9ADF 19730655 262144 915cbf65ea9ca8c50b462faf0da6f52c1e38d25d halomaps:3600 +headquarters_beta_v2.map F4FE21D3 19570783 262144 aba61e0d284775fa8d85339f7426dc1d55fae182 halomaps:3614 +Heavy_ChaosCanyon.map 4853FE23 43538947 262144 a2d61299d28d571b8ed796a721d897f48c2fa614 halomaps:3583 +Heavy_ChaosGulch!.map A2BB17F8 27966285 262144 cad54d224f6fc1f16ec2a4acd6cae2ce9c4abd00 halomaps:3511 +Heavy_ChaosGulch!v2.map 2C8D01A4 40562949 262144 f90f61f392af2992e4b4727b0efa8ea5d8044aac halomaps:3533 +Heavy_ChaosIsland.map F8783813 42647001 262144 8a2d6c5359f9b027c28353ee104ddc2d9f27556c halomaps:3565 +hegemony.map 512652F1 19752402 262144 e48b64a22982a08b6d31f13b0691171eb173444f halomaps:3226 +heh2.map F7998086 20914932 262144 c322077216f2c5b98cff64700150a11034194d8e halomaps:3237 +heist.map 79ADC704 53715579 262144 3ae0fcb626cd28244c8a5a793d7d179a2c3d058f halomaps:2589 +hektik-plus.map C559DCBB 120047655 262144 0536d0a7e3620c77b154528c091d708bf13f0112 halonet:hektik-plus.zip +heliophobia.map 106B0533 25162757 262144 a535373c4c51b28672431fddad269d4ca4c4cb58 halomaps:3294 +helix_canyon.map F64FA994 20599804 262144 a9faae813890d81ad4ee86ebc09eef6793ce6640 halomaps:1854 +HelixStronghold.map 78BBD5AD 98059408 262144 fc1befd7c0a1659dd9b79e116008c82cc7178226 halomaps:3339 +hell.map FE66B547 12752845 262144 bcb8334eaf9aedb6b8e85a69ce9667ac24f70164 halomaps:2953 +hell_brawl.map 210D0962 72933862 262144 d39a981a6644d366a3a6527b8e73ab25d988d822 halomaps:4072 +hell_or_heaven.map 1DEA4C34 33496949 262144 6e80b37cf1840455b1ed217fe3a61c44d820143b halomaps:3165 +helldeath360.map 325421A3 23202439 262144 991c1d5bdd21d48b71c3b10306764d7d2c5c69a5 halomaps:7120 +hellfire.map 5C07666E 13713472 262144 d81cddd6f8848fe3cc34c791ddd04808dd88d05d halomaps:2609 +Hellgulch.map 1541D565 48800042 262144 8c34d9fd5c9c3a9d44401a8b6d310279106f280a halomaps:3256 +hells_c20.map 8D709A44 55497684 262144 f5d64a000984298240823dc922408451041b9a4e halomaps:4656 +hellshole.map A9AD2518 189570417 262144 5ded95e5b97a636c346f7cceb5a7722ecd4d2c39 halomaps:5841 +Hemmorage a v1.map 75F5CCB2 356488324 262144 5b0021d31cf01ea62e5a23e70da895489aba08b4 halonet:Hemmorage a v1.zip +hemoasis.map F5F94246 42873124 262144 8c0703224038f65493e77148759374f9227a7af7 halonet:hemoasis.zip +Hemorrage_II.map 0B8E2F01 127027027 262144 acc81b96522231e913f14533d3cc0dc66b0f1add halomaps:6034 +Hemorrhage.map C7BE3779 248199168 262144 eb3f556ace9b030391f7e6b5829f386d295e90b7 halonet:Hemorrhage.zip +hemorrhage_v2.map FFA43827 244681657 262144 9f0721c945c20167a957002395b674274fc792aa halonet:hemorrhage_v2.zip +Hemostasis.map 06B1B6E3 394998500 524288 6b325e980793ba389e65b2f8ab5d73c92e6e563d halonet:Hemostasis.zip +henry.map 334778B2 18088312 262144 a23c09a0e80ecfe2bbc2cd6cd6f27166cb74a3b7 halomaps:3876 +Heretic.map E78BFDA5 133380767 262144 ee7de8db6f71fad97a01bc0efa50a287b0862115 halomaps:6927 +Hex_Zone-v2,5.map 8FEEF052 166633304 262144 fc287b671991abfa74b4b920a9aab16c5d6dd288 halonet:Hex_Zone-v2,5.zip +Hex_Zone.map 19507C13 169203352 262144 3d8b117c21602c28ab78ca2cb63c8e81f5e099d2 halonet:Hex_Zone.zip +HF_sector1.map 59621359 15256064 262144 9f2ae7295ea8c94ac7f4346ad94ffca0028da77d halomaps:2920 +hfboxroom.map 4B083445 22402977 262144 8ea1996ef2097329d1487aafcb8065bde7bf4259 halomaps:2886 +hfboxroom2.map D6318B57 14427936 262144 3a6667e75a021946308e195613b7026180edb305 halomaps:2887 +hfboxroom3.map 2C9CAB5D 57421472 262144 4fd9ea524ebb2c10d2a03d1e72df0fd20d4001fa halomaps:2990 +HFLhalofootball.map 3B0AEB40 18870728 262144 5d4cf41c54f250350dbc83bf365dc42ce98d4b94 halomaps:412 +HGK_snowhold.map E7C622D9 50079415 262144 e1432d1125756d5707fe4e5ad133cd0521a1477f halomaps:3383 +HGK_tennsion.map 75037B74 54729637 262144 47cf3e7bb9105298e784e6ba3f476da7dcdf0eea halomaps:3499 +hidden_canyonv1.0.map A5EC7EA3 59694983 262144 d754f857672227fcda1b46a78a32d01261b01b80 halomaps:2779 +hidden_cove_beta.map 158F5AA1 14842010 262144 9e372b3914a2cb193de5487e567777d8af9ab474 halomaps:873 +hidden_grotto.map 146FC6B4 16188212 262144 1a396e6d60e60e3d9709eb595f8be6a8fad503c2 halomaps:2686 +hidden_traps.map 396209A8 14416872 262144 eebba6f727c10490ccd2fd8b3d319e87485fc352 halomaps:3548 +Hideaway-Cove.map 88A1C475 63822958 262144 9e4181d7eb2fbd5c55bd423b75dcc28cd7fa097d halomaps:4555 +Hideaway.map 3E71420A 45040002 262144 647c5407273289600740f8904843ead44c106ca4 halomaps:3412 +HidroPhobia.map 361DCFDA 18371324 262144 e3a4d725ace5bbc973c3716dcb6efde00d868f22 halonet:HidroPhobia.zip +Hielo_Mexicano.map 86C8ADF4 211488670 262144 d1379410b23b99d86b3e18ba5b322f3f0d815b6a halonet:Hielo_Mexicano.zip +high_skirm.map 5A6B5633 44386084 262144 2a53f6c3083ad385b0cce83a558b3cf398799718 halonet:high_skirm.zip +HighEndDevolved.map D1A19568 23322840 262144 174c9b50bd6319e0003212175be2ec249d0c2e6e halomaps:240 +highhill.map 5629CCA0 14216020 262144 d38083b61913297a007e9d06b9d936f88e43e541 halomaps:3916 +highhills.map 00206490 14004392 262144 17a205518e2c0877b8b53e0441df509d6f91944f halomaps:546 +highlands.map 1742E131 22854048 262144 f29937e8f6896d89f4d525ccabebb4d831800e5d halomaps:3964 +highlow.map 09E7EFA4 15839992 262144 bfd9afd650d137595165ba2a3b213bd56d1b87a7 halomaps:323 +highlow_race.map 7C65A6A2 16274004 262144 c6b891939d4cae8f592b4970cb604994425d8e8e halomaps:2794 +highway_beta.map CE25EFC9 13077496 262144 246b52a701d0f86e474f98da72ea99edb5e94410 halomaps:1809 +highway_shooting.map 58F58803 11944796 262144 556b0aa4f2f3a19691ddb7a35fe7ba26f4257b0f halomaps:519 +hill_battle.map B2A636EA 12902980 262144 8252d826262d9f63a94586e2a19080c34e57ac68 halomaps:4250 +hill_battle_v2.map 822E0F55 18731781 262144 e4eaecfc4d3f306c5bc76cd7e28cb245da435e14 halomaps:4262 +hillbillies.map 0098E161 13798340 262144 21f23d14586eda08a7da0056c6b5a8db0553916f halomaps:4142 +Hillbilly Mudbog.map 6FFC6E70 44150313 262144 18c7e609a50e1fb4975b75db539a2f5049a6a23c halomaps:4621 +hillmap.map 7DEEF4A8 12712652 262144 f2be5dad6b5611678aac184299e37e8a7afe2968 halomaps:5062 +hills.map 56599B6A 14003800 262144 6931f7852b290cc82f5fbc24d13dbbb43882ff79 halomaps:966 +hills_of_death.map 4D2713B4 14587684 262144 3dee9015a720e2560b10ed21fdce1eecb1a1ea36 halomaps:2610 +hillside.map 621CAE1D 12628076 262144 143dade9dcebb0fe8856060b63aa692a50c9500e halomaps:326 +hillz.map 48D5AC57 12455646 262144 06b13a10fc68fbdbcec06d7a44ef9e6df07337f5 halomaps:1771 +hjaw_blood_gulch.map 45F8F54F 33886817 262144 7278497d20e09fdfbf8cbe8d935d7c5efbd4ebc4 halomaps:3917 +hk-banshee-pb1.map 2F3C5DBA 79101376 262144 03f7d897fb08f5d65b3a6a30e9017942680e0d8a halonet:hk-banshee-pb1.zip +hk-banshee.map C46FE8A4 79101372 262144 234a178922a12d22828c9af793e4cd5d22649769 halonet:hk-banshee.zip +hk-bowser-pb1.map 3F65F37A 61070924 262144 189565bd71db12b6589b02d42fdf17a2d00b5103 halonet:hk-bowser-pb1.zip +hk-bowser.map 801F34B4 61070920 262144 c191cae773015ee6bd5b01b8f719e22483a31a87 halonet:hk-bowser.zip +hk-donut-pb1.map 2AD4D76E 52953924 262144 e01b312d139011e57f184769c3500a2afd4080d7 halonet:hk-donut-pb1.zip +hk-donut.map CB4EC531 52953920 262144 f7c6897ff617f703717b94de6679580b0ec13006 halonet:hk-donut.zip +hk-fort-pb1.map 0DE9C05B 53336796 262144 53d304647890639148e6a43c95854899ea21a4ac halonet:hk-fort-pb1.zip +hk-fort.map 8873FBBE 53374152 262144 cd46d35fff9a4d7897610408bac04ea0a72dd1ab halonet:hk-fort.zip +hk-koopa-pb1.map DED7B706 60315592 262144 39069c331a76b8088300d94e2a6e43411ed262e9 halonet:hk-koopa-pb1.zip +hk-koopa.map B6E3E958 60315588 262144 2b882f72814ef3d6fa9b8ee0da53bdad228ff090 halonet:hk-koopa.zip +hk-moo-pb1.map BC678B48 63402616 262144 150567a05bb572f02faf8ec011d5c51857f74a23 halonet:hk-moo-pb1.zip +hk-moo.map A8349784 63402612 262144 0bedb91abdc73c3d092522faafa5422812fe67f4 halonet:hk-moo.zip +hk-peach-pb1.map 758EE7FD 70945420 262144 dc17852331edb1a8377c67bdf716cfec35740e60 halonet:hk-peach-pb1.zip +hk-peach.map 828DFDD7 76744388 262144 d6e0026bbd5709b51a622b22d167641d9cda4016 halonet:hk-peach.zip +hk-sherbert-pb1.map E13AEBF0 57372616 262144 7070ed40fbe5ed5677807fed276ea87efbeeeaee halonet:hk-sherbert-pb1.zip +hk-sherbert.map 119E825A 57372612 262144 78d6849f4e828cd3b5be867a1679e693f8293873 halonet:hk-sherbert.zip +hk-wario-pb1.map 956F8ECC 67008664 262144 54f80dfbe61297af25beccb4016a5a549b325e4d halonet:hk-wario-pb1.zip +hk-wario.map 9D49870B 67008660 262144 b863a221e2d3d8eb269335a86e7b4b01384fd672 halonet:hk-wario.zip +hk-yoshi-pb1.map 402369A1 61079824 262144 8db636be8d06bb38f85f7af80eb1e217736acc81 halonet:hk-yoshi-pb1.zip +hk-yoshi.map 1852EA73 61079820 262144 04cb76aec378231ff78a05e52eec7be856294ff5 halonet:hk-yoshi.zip +HL1.1.map E03793D8 69948126 262144 7178d9d494e4ae2dfae3b4773f51db86dbdb583d halomaps:3704 +HL3.map 5F938211 13431704 262144 0c43c8b80361eb896adf1858d08450474432a01b halomaps:3705 +hmc-chasm.map 8F5BADE2 99370171 262144 753cbcbe92f8e504eda5782dbdd7208c78e415f3 halomaps:3166 +hmc-chasm_ai.map 2467DCF6 60251599 262144 8df3d6ddbb1742e06415261f7135fb55ac249269 halomaps:3198 +HMF_ablation.map 49A1CB89 74301352 262144 40633b4124453540f737c51845effb7700d94760 halomaps:3340 +HMF_amazonia.map AEBB0D4B 17191408 262144 546d86b349baed5784c1033b2d67c02e83e489e8 halomaps:3257 +hmf_iceland.map 68204256 53775870 262144 09e462e7c848283298889f081944813f7629a4ce halomaps:3146 +hmf_marecage.map 028F5EF4 29629137 262144 5db5c3c50f28acdba40d1823ebdddb7f181a4f1b halomaps:3129 +hmm-dichotomy-pb1.map B33663F3 63601857 262144 ad35a8b6838b3a737f1093f7d31fa692ef9bd2d6 halomaps:5074 +hmmt_crashsite-3250.map 7B33153E 41648890 262144 5d56a4d82fb298f338c9eb13b4609a486b53a8a1 halomaps:4556 +HNH-ep1.map 7F141C17 18556572 262144 6a63b42894d82345a28e9975f5b86b6c0f167dde halonet:HNH-ep1.zip +hog-track.map F33D48A3 66817533 262144 269d85534082bfab953ecd01e04df658b27c5efb halonet:hog-track.zip +hog_derby_duels.map 36B8F30C 25090516 262144 f8c3378e8ee4230fd3a0b1245769e085d2887ee6 halonet:hog_derby_duels.zip +hog_derby_military.map 6EA1B4CA 26728341 262144 f3364e0b8f48da1aae0b632583cc5b36f01d1074 halonet:hog_derby_military.zip +hog_derby_side.map 7C5F3ACD 21825393 262144 bcc446dddfe55a705786d6c6e4d0c9f48d9cec13 halonet:hog_derby_side.zip +hog_derby_timberalt.map 6B8B949C 19624893 262144 7afe708a806d6e6e4c4afb9a23d81141226bba82 halonet:hog_derby_timberalt.zip +hog_stunt_track.map 7D4495A6 12608780 262144 406599005079bb3f0a4d316838d99a0b35b788eb halomaps:2088 +hog_track.map 6AF4C827 13476620 262144 be6eaeafaf29b16097d19d959898826129dec837 halomaps:2298 +hog_wars.map A5CDEB5F 15540616 262144 f5415308a5ac8a44700b4aba0d87a6e7c242a5b8 halomaps:6096 +Hog_Wars_V1.map 1E1E5193 27377652 262144 366f2457d3c5b7c12a9f3adbac1a356f0cabb555 halomaps:3762 +hogarena.map 1CFAD392 14724068 262144 0c2775907d27a5aa9bc6dc954835c9e5c828f049 halomaps:2304 +hogbrawl.map AAE0D814 12651284 262144 26cc589686ec106e7904031a68e0fc282505325f halomaps:541 +Hogjuitsu.map EB27613C 17865496 262144 c186a8b408ee19aa481c4b0f7da248d753db8c71 halomaps:1928 +hograce.map A292DFEF 41489524 262144 f746bed8f8c67c8a6c93ef624d5551f665e73b29 halomaps:2780 +hograce_2.map 41E07124 60334529 262144 342b01c128815b67b22f99ab1e32e328a12c3691 halomaps:2904 +hograce_race.map 9B6254CA 56343722 262144 5524837b93ea41a7037c6feeef02b310cd915dfc halomaps:4132 +HograceV3beta.map F9CF03DF 46196699 262144 f3c5826d41a32a9d332e0a89099a9dbd8658168f halomaps:2921 +hogracing_day.map E4FFD9EF 45003948 262144 110bc81a0fafc442b7a8f5f446d2b0baf7dc8fda halomaps:2922 +hogracing_night.map 7AD71261 44008208 262144 5c6ac25493f6e9f9cd08717e228b4405fdd21b2e halomaps:2923 +Hogulch.map 43959C83 41670544 262144 cc6248ffd02e8dbe57b344f49d245050d5fa4d34 halomaps:3413 +hogwars.map D4FABBF8 17867120 262144 2310c899ff1459a082c5a02221232d457053a3dc halomaps:4803 +hogwinder.map 07FFCFA0 34015706 262144 3efa5266046d6f630faf206c20f6197b5b9773b3 halomaps:3279 +hogworld_prerelease.map 7E08893F 13349252 262144 3b7f2f9c3c79302e1870b85447205b93ad4ea2ae halomaps:241 +holdtheline.map BF1220FD 15773392 262144 2a2c667c10d9f28ff162c3f763f59f0bb7f8baf5 halomaps:1107 +holiday_day-v1.map 7D1412C8 121337381 262144 208abbbcf663332d436048dbec3242f6bd335cae halomaps:3877 +holiday_day-v2.map 2159B59A 77476842 262144 7fc19e717f2208a1a9c0f94ce5cea34e1b7587c6 halomaps:4217 +holiday_day-v3.map 3D200D36 124206450 262144 43111e56570e8ac2bae02e4cc8f7be9c61cafa52 halomaps:5075 +hollow_ground_final.map 724A2D6D 24102125 262144 bf7269c1910fb2c5f2e7dfb50a689f2328720814 halomaps:2924 +hollowhillbeta.map B93D0D4D 58293845 262144 3fa3ea5c135995e80c4a0f1518f30b221a389e01 halomaps:1418 +hollowhilljetroom.map 1E52A030 22515137 262144 044fc4a7a42757ffa253a080b5805e13f3039c0f halomaps:1419 +Homers_Melee_Dojo.map D9D7812D 57379621 262144 ccd59c47e2143ddb7800a7a9f50c9b1ceba9b2f4 halomaps:5609 +homestead.map 3A7562C8 110711612 262144 966182f324f880f422edfea239be460086e7e565 halomaps:6676 +homobox.map A7CF0468 13691472 262144 f169b4a07a4a4a4163c9d721074eb992913e9c7a halomaps:2141 +honor_revenge_v2.map 0718BA4D 54843451 262144 a630ae5a7dc95a718893eff5efca10fa6d3b1ed4 halomaps:4362 +hope and dreams.map 6D39F36F 62218124 262144 66640fa93ac6af3c9548b296ed3cea3eab2fc09c halomaps:4055 +hopeless_war_beta_v0.6.map 6AC92DFB 43495091 262144 f3cd75e39bcab235a27178c08a1c0e568b33a749 halomaps:2391 +Horizon.map 816F5A8D 27261605 262144 3ad3cda78fb818fc955fce1efa8562b3b7b2d291 halomaps:1177 +Hornets_Nest.map 4C78ECCF 56863867 262144 e8659e0fee27c31cdc34e04cae2473525d7dd791 halomaps:5371 +hornets_nest_v0.1.1.map DC9F0077 123224321 262144 a7bec9103d1090f8afd9516ba5b0ca86a28a9f39 halonet:hornets_nest_v0.1.1.zip +hornets_nest_v0.1.map 9F6C0086 123299714 262144 a08ccc1b681e5313d5d63e2d5d160b369e1b2e36 halonet:hornets_nest_v0.1.zip +horror.map 36B656A8 94703128 262144 c7c8437382e7122ae059367100b1be8b18f57094 halomaps:3128 +horror_canyon.map B614A715 70044511 262144 5572de887ca063b43b4c83f2bbe50d990876541e halomaps:3170 +hot_gulch.map F08C568D 44138372 262144 d73c49e637200a44881b84b60bf08bf146f1219c halonet:hot_gulch.zip +hot_gulch_final_beta_nov_2017.map B1DD891D 36168024 262144 8d99a396f1f73d825186e17fd71dcff82c441553 halonet:hot_gulch_final_beta_nov_2017.zip +hotbox_g_host_noscript.map 2C669DBB 18406928 262144 8a673a4d5445b3adfc017e5d93fcc6af20c1e066 halonet:hotbox_g_host_noscript.zip +hotsand.map B9CFDA7F 32047904 262144 23d91107f11c05da4db79fe11ad401a2cd7489b4 halomaps:4197 +Hotzone.map 46DA91F8 79621997 262144 9afd01cc7336ef482ca80b7abcfae724cc9fa972 halomaps:1810 +hourglass.map 7A619315 16781552 262144 d5dde4a71e2bc93637a095b6014aa10d8a9df732 halomaps:242 +house.map 2E1CA53F 14147796 262144 2d92f9696d6ef9629b9db7e5a75cebc949850056 halomaps:2089 +house2.map D4258D7D 60346159 262144 5abc5144c3e7e1b54f3fe86809ae6fbbd12adccd halomaps:2670 +house2_beta.map F8A7145C 28513004 262144 61eb5df914886a471cd6efdd1223b63c9a06de03 halomaps:2368 +house2v2.map 77B37677 67708065 262144 59927b96f585473b8c680ae680df939acde3e0ba halomaps:4176 +house2v3.map F1FBD3F2 134135374 262144 8e31112da7cee1cc096f902a38f6f4649cfb7dbe halomaps:7095 +House_of_Pain.map 8410BA37 283818877 262144 c21d892198a518dae32eef9f4ab2a505bcbe8472 halonet:House_of_Pain.zip +house_of_the_dead.map 312AA3D9 127469230 262144 ddcc0e79fa3cc128ecd1f7649510b40b7208a836 halomaps:6347 +house_of_wax_no-AI.map 7E395777 33139275 262144 6fc2de14368b52f8d25cc80c24433125da55cb49 halomaps:4029 +hq_racetrack.map E2063B56 26090108 262144 c4398d6b74c8242fbd6960e3006d52977278a63e halomaps:426 +HR Battle.map AACAE0DD 191268559 262144 4cadff1e5c928d41ac54487c9ea7741526753128 halomaps:6928 +HR-icefields.map 86C0EA91 50857087 262144 f82d9ed156b0687bb86886b17d786cf523226b09 halomaps:4198 +HR_Ascension_Firefight.map 949D38F4 377363895 262144 af2879cb74e8088b0d8a7a1dd8b3a202c2bda3ab halonet:HR_Ascension_Firefight.zip +HR_graveyard.map B5D9630F 322703131 262144 1db72b21e560c8cfa95910fa075b3e8b1d3f8316 halonet:HR_graveyard.zip +HR_VENTISCA_ETERNA.map E38D6F09 311820093 262144 75e6b84fb498cddc1e5efaf08364cadb45fcaf99 halonet:HR_VENTISCA_ETERNA.zip +hscanyonbeta.map 39D8C545 13764308 262144 7fbf04dc96e04edea346c4d20dd8bb09c6d580c0 halomaps:3319 +Ht_Brabeuk.map CD21BB66 98828446 262144 cf98dbca2c96a5efc1d64bee583bc95a4656db20 halomaps:4673 +Ht_Creek.map E71E8318 24458053 262144 316343d9e54401ed8fd2e679a315355f0abac08d halomaps:4363 +ht_detention.map B150046D 69609198 262144 412253460f7c555172fed6049261b977d8fd9656 halomaps:4456 +Ht_Ground.map 822FD748 49541834 262144 449a53902a8591fa2b4e87580a722bb8434e9b19 halomaps:4117 +Ht_Liberation.map B7C045D0 50272127 262144 43cb287f3889d1720fec96ee9da3b9db8b269ce5 halomaps:4511 +ht_playground.map 548187AA 48402874 262144 d08bde504153a490ba088dd06dc426762a60c0c4 halomaps:3851 +Ht_Sniper's.map 4F9DAC5E 26245474 262144 151bcc197d0b672e0ee30becd7eb90821470e766 halomaps:3763 +htc_death_match_beta.map 587A6DCF 16986244 262144 1fa9e5544b4cf065721828a0e04d5fcbd4ac2488 halomaps:3584 +HUDGulch.map EA811DDC 19512240 262144 2062cde5d523fe1cbf0d68e77d102c6567fb8e09 halomaps:1266 +HUDwinder.map F54188E9 22232021 262144 12be7bc07505c438a9e2e12e8de30cbb3614f3d4 halomaps:2478 +hugeass.map 784CA990 59221172 262144 a48df0cce03fe8128bed176efd046b0150a3b55a halomaps:1196 +hugeass_dogfight.map F3A9F36B 101255456 262144 f7c671e26d5d7b54586065740cb9504dc5e4792f halomaps:5023 +hugeass_fixed.map 1240F7C4 55806044 262144 5aa8d510fd9cc05f09adc266f66d7a3c44bfa6fc halomaps:3179 +hugeass_meV2.map E250E7A6 119172490 262144 6a4aa6d9be777ac478946e86a9484d2967efd0f2 halomaps:3534 +hugeass_rpg_beta2.1.map 4FD8D374 105508666 262144 2b7b43da680f2259c0810fd8a3a806e579c78704 halomaps:4030 +hugeass_rpg_beta2.2.map 813584FF 121051073 262144 aa1a3cb640bb46307064ab3b49b2176628d131e6 halomaps:4083 +hugemod.map 784CA990 59221172 262144 32eb01fb94b4a0bdbd2dc29b0b2d33bd614f1a7e halomaps:2090 +hugepass.map 0C2F1478 16867544 262144 c7e011fd96543dd8558a3509647ef0b6a32de40c halonet:hugepass.zip +hugesnap.map 7560EAED 69106434 262144 d57b5e3d7b738750c034608f6c02e5f27fea0296 halomaps:2501 +hugesnap_finalbeta.map 9DCE0B97 67888250 262144 1552f30a51dcca9e9449959e890d2dedbb58e9b9 halomaps:2436 +hugesnap_frigginbeta.map 1BE00B70 73852833 262144 30e0aa394509d9e8af31e04810903f90f3881fa6 halomaps:2375 +Huh-What.map 9B9E5A94 18833768 262144 36467657fdd97ca073b2ca9cfcc6a3ceb9834c58 halomaps:4468 +huh-what_2.map 1C17EDA0 22997675 262144 e2348c0f0edb6b63fba88de9f9ecf28f636b042b halomaps:5675 +huh-what_3.map D57A91A5 22235110 262144 a953e39069e45718b63986076c73e7cdb8326781 halomaps:6394 +Human_Landscape.map 12B150DB 22381226 262144 36448a6163c3df7dec747bcc745d19310c8e8567 halomaps:2590 +humanarkbase4.map 0ED9F425 62827511 262144 66c46dec71b521624bc3d0ee38783d358f655a89 halomaps:2270 +Hung-Higher.map 3C4FF972 15996960 262144 2cfd1e4c56f9c4786d672bb97c95a45d87bf9084 halomaps:4469 +hunter_territory.map 5EAED4E1 99474068 262144 9f46e467571220ed38ec1de5ff37fe4357aa0d80 halomaps:2284 +hunter_tournament.map 6CCE5D22 21475511 262144 e68f46de1e01659259a033c69b7442413e215814 halomaps:3671 +Hunter_wars-2.0.map EA924BBC 19070001 262144 05763dcbcf8014641fc0a9b957fee27092c296b4 halomaps:5486 +Hunter_Wars.map 83B71AA5 17980513 262144 2da09fdf350058edbe01f6d0691afb63ba696051 halomaps:3049 +hunter_wars_beta.map 672AC195 29026527 262144 63bcf9a6222083637fc1f135a33501d2eee870f1 halomaps:6395 +Hurricane Gulch 2.map 87E9E09C 98439810 262144 cbcaa9cac68c625ffec5abea78aea391a3911bbd halomaps:3238 +Hurricane Gulch.map 86425A39 34309983 262144 6be639877c14fa0426306c6c87c3280654aa5974 halomaps:3183 +Hydration.map 0305E96E 40219001 262144 b862964e124845e2bb34837d29fb6449c272b82a halomaps:1474 +hydro.map E751DD23 188464900 262144 aed9e207f432c4d83ca2a8311419ab6a0d62955d halonet:hydro.zip +hydro_generators.map 86BFC8AE 27516552 262144 4d107e8b58e322bc9c55c9e38b495a9536dd6df9 halomaps:3939 +Hydrolysis.map BE7B86CD 45677681 262144 0a4b9c7b7c7e188bd30946e23474690ef70cb9b6 halomaps:2611 +hydroxide.map 07017313 18894940 262144 abc61e3ead175a6ac1139259de094afa8f2dd56d halomaps:3239 +hypo_v0.3.map 6B7A1DA8 49632640 262144 6f740d9cd83dea82d17b901e9f949a4a2d243f76 halomaps:2476 +hypo_v0.4.map CB3FB4C5 50420976 262144 d78b82bc1c2f7fa1b5dccbaead14dfa13b8d02c3 halomaps:2750 +hypogluch.map 22321D64 50787544 262144 ca72ac1b687fcd3a15cf4257283682131ebd574f halomaps:2811 +Hypothermia_Race.map D3E67CC0 49507256 262144 c65efaefb5819e68b5cc1fb3ff02b4a3a1dc0d82 halomaps:2437 +hypothermia_v0.1.map 1AB8C84E 46330184 262144 cc293fe5f0523b4ee34e579df5cdd08d4bf2e921 halomaps:1672 +hypothermia_v0.2.map 11200CBA 47630940 262144 10ca800a01c0489825ba9594806a577c58caef9a halomaps:1676 +hyrule.map 1F2B75E1 18667748 262144 a0765aa406e69ddae2cb43e6f05c085b61276d5e halomaps:4031 +hyrule_castle_HV.map FF6DF441 28082916 262144 5807ac4b7e0e8aa5755169ddb9659ccee0591f81 halomaps:2128 +hyrulefeild_winter.map A1D725F8 25311694 262144 909d741198f035ce1ffdd3ddba4f0b5ba22f4da0 halomaps:4056 +hyrulefield.map 0DF84807 19465304 262144 2a74b69c2bc39106b7c45bf95b151e9020dac9fd halomaps:1141 +hyrulemod.map 9D29DF70 37565306 262144 be6e5daef14e107c5a2483bef35564fb2d6c4b33 halomaps:2853 +hyruleoutpost.map CF3FC05F 17572109 262144 080cd412288d76135a0070628b6bfde93d8bfcb4 halomaps:2954 +hysteria.map 7F4915BE 17150544 262144 14d8970d94d6a351beddd3a5181f13a9f794571d halomaps:4804 +iamlegend.map E19D3A11 106587963 262144 4eddd3ea6524afdbc5a45fa4ae7589a156a8ffab halomaps:5487 +iamlegend_no_ai.map 478FD0CD 44229608 262144 7789eceeb860887b97414ea7bfc243b8968848d4 halonet:iamlegend_no_ai.zip +Ice-Frost.map D9FDEFF1 22185307 262144 1e1d6f36acb553370d5e7151bf41cf58d9fdbc82 halomaps:2271 +ice_chaos.map 5EC1DEB7 15854180 262144 97a0245c05f1e506a69b3f47e101318e587a7794 halomaps:1120 +Ice_Combat.map 5D0BEFB4 33585638 262144 8c8b2ecc3e186c50981cf032499a731d3445cfe0 halomaps:2854 +icebloods.map D879A75B 40487820 262144 c38ff77a5511b825f8905b3e5bf377cf0f3e67e1 halomaps:6477 +icecold.map CEBBDEA2 54225488 262144 c46958584575de928c90b256f7408e8f66b2618a halomaps:5593 +icecreek.map 4D9F18AF 22399000 262144 90375592f23b1ef4730176ac5740d72a173cdbcf halomaps:6312 +icefields-firefight.map 5E5C6C05 304444447 262144 17dd5e67aaacfb435489e11ec7a855071bb4e974 halomaps:6901 +icefields.map 5EC1DEB7 15854180 262144 68bf8983bcb91c7b15c0a5cf4b90845b44d41865 halomaps:4782 +Icefields_Infected.map 586F7570 95889285 262144 be1e36d91623b9bdc890c40ab1132dbbcdb9904f halomaps:3171 +icefields_mod_mania.map B2E166EB 17572103 262144 88122c3ff9dcf10115ef89f66564bba66504d702 halomaps:5732 +icefields_rm.map 5EC1DEB7 336077636 262144 847d23bacbe09dd5d827134bf7a452cc315da067 halonet:icefields_rm.zip +Icefields_Rocket_War_AI.map A616DBFC 229232999 262144 286f38a86bd5cff70a23ce8d43990fa513ecb937 halonet:Icefields_Rocket_War_AI.zip +icefields_tmcc.map FEE5F24A 43105216 262144 ba11c1f63f3f1c3c3103d7ca469d1c9dc234c6e2 halonet:icefields_tmcc.zip +Icefields_War_AI.map 9DCC55AA 341700269 262144 24331aa90b5a54b83953472bf567f242314b4daa halonet:Icefields_War_AI.zip +icefieldsmod.map 954D8AE1 76692967 262144 70ccc3bc3998cfc1de8d3c32bda2f60da689bc3f halonet:icefieldsmod.zip +icefloe.map 00000000 52953788 262144 f154f1292c3e6f70b93112ae665b706683898fe9 halonet:icefloe.zip +icegoromap.map 07DA942E 63830537 262144 f3ae060c04a68952a96e5d643f8083d171deed22 halomaps:3897 +iceland.map 12AAF9EE 17435344 262144 dc8337285cbcc4f96b610dd0eb40197074826cab halomaps:502 +iceland_betav0.6.map AE551F78 106777057 262144 999f13ad7ef706bf1fd6dd2be679086f4f4d8973 halonet:iceland_betav0.6.zip +Icelandic-Tundra.map 00000000 215245399 262144 c7ae930bba12866a11c27596526c715b67041c26 halonet:Icelandic-Tundra.zip +icemod.map 7C13F4F3 35198288 262144 799d2c79b7fa781ba07b6219c720994b6cc97114 halomaps:2591 +icetigaurus_beta.map D826F3DC 14980876 262144 01987ac0638dc333d0772de594ab035300e20305 halomaps:299 +IceTrack.map 10580819 22153628 262144 1ad21a0b9dedc45374cbef1f29485886c3c0446e halomaps:390 +icewall.map 0FCB5751 17072576 262144 1068110c69c4e78d81c64f337e9c4e283ee55a7a halomaps:3147 +icewar.map 5EC351BC 57273559 262144 3de850a40a6030d6b0da1ca2467e9c660c039855 halomaps:6878 +icewing.map D783CB6C 57411596 262144 6fa667e26c1ed7be487f2d01975c075cc2cc2093 halomaps:1827 +iceworld.map 28AFC432 13163596 262144 33e3b977684393e1a67db67c94d34998c18a3162 halomaps:243 +iceworld2k.map 8A58227C 13110024 262144 07a6c027c5a54397b8c3a58454109e1c96d81b03 halomaps:340 +icext.map 2B278BBE 13519672 262144 8a1a68e9cc2dc617c01d45de3a6c5a65c16907d5 halomaps:2796 +icon-beta1.0.map AFF7B53A 110230772 262144 b2b5230b604b58d63b75079bd97597d6a218e3f3 halonet:icon-beta1.0.zip +Icy-Coagulation.map 552C02B9 66842012 262144 c3597ec2a11ede1c249f1aa57b5bee8874f39c7e halomaps:3442 +ICY-COVID-19.map BCA8253E 124964142 262144 74752b91b706b9032ed9a5f23322043d2e3f4bcf halonet:ICY-COVID-19.zip +Icy_flood_attack.map 6A335798 56844883 262144 54dd832d86a9ba2e0136dfbe1da24183da2a0c85 halomaps:4118 +icydeath1.4.2.map DBBDF2BC 28425900 262144 7c0c54675833672363ee0ae703ec00d27374e795 halomaps:2840 +idiotic.map 9B712B67 17587360 262144 dc38eb8b3f1bce6e7aea24d52ce887b77c96853e halomaps:3127 +ig-poc_path.map ECF295E6 19765596 262144 ddec64142fb0ed774216c3c9ed51a48e5a1f8f32 halomaps:3878 +IG-WYS_Beta.map BBB3635A 32672632 262144 e9c4298c6ac6ab6d15588f6fc7e5295e8b90f790 halomaps:3512 +ihopethisworks.map 060F5564 12241324 262144 5cdf318dc1c8dfa3a3c46b02ccadc59b62ea50f5 halomaps:1772 +Illumination.map 315BF992 296457685 262144 9a17d2df58a4fad9cdfced1be3f59b0ebe62633a halonet:Illumination.zip +imane_island.map D213BB3F 72061980 262144 2430a51a1014097ed2ded81d9b655aa4f26a5c09 halomaps:4073 +imminent_h1.5_beta.map FE6DEAE8 14620272 262144 cd793e09ff9128574112c476d927a70eaf16b9e0 halonet:imminent_h1.5_beta.zip +immure.map 2E876489 17718732 262144 cf72c1247f7d1c602dcd9cd674837a32dd9f800e halomaps:1278 +immure2.map 7C054D0E 24349675 262144 4c34522e8235691d948412ce5389d962061b268b halomaps:2248 +immure3beta.map BC12833B 34925918 262144 3ac358463260251e423a48cef5ffa999fc04a674 halomaps:6112 +immured.map 87E232A8 50255598 262144 6a3576231b3b7ed2e294b94b8f101b358d6e6008 halonet:immured.zip +impactground.map 5AA5A000 101731824 262144 6f9beb4def2b04394cd07414e56fa5e112684139 halomaps:6046 +imposing.map 0C51BBA5 125501413 262144 c78398c1fa944e607294804a672121a99e3b2929 halomaps:6301 +inbacion.map 2A14AF16 55550679 262144 bcccdbaee9aab5d0fc6e8ad1b2c8d562fc276253 halomaps:6321 +incognation.map D48B1A8B 13775656 262144 8318192bcefd1d0459e43a12429c894605f6c335 halomaps:1336 +incoming.map 5BAD537A 45316840 262144 c0bc919b9cef0f46732856ea1970b1bac9b81170 halomaps:6534 +incursion_1.map F8FDC1A8 85299332 262144 1332b2bcc4ebd9261053b79eadd9b77a7baa3db3 halomaps:6197 +inescapable.map B0B486A0 15872716 262144 8b17c328eb1fec0ceb5399b1bfa666a581f2f808 halomaps:3278 +infactation.map DB1E7D15 50651354 262144 89a11add2b0d672628dc15738fc3db36cd742564 halomaps:4143 +infección.map 8DDC4F41 119811640 262144 94ed266069648dda8797c1f80ed161726cdbdc0e halomaps:6835 +INFECTED.map 064F72F8 52635979 262144 acb592a6d64493435e86ae5e36418b76d0da665c halomaps:3566 +infection.map F096EC81 52045310 262144 738214da9d926264ba44f106c4c89909f874342e halomaps:3277 +infection_quaritine.map B1A35935 131897606 262144 0ba0026b97eccb0603a3196df772e6a185130e2a halomaps:3414 +infection_reborn.map 8EEBF66B 101285335 262144 2447f7f035759721723022191459dc1e6cd4d987 halomaps:3940 +inferno.map 3EBCB337 13863176 262144 9da095fb25238c8823e420418b302abdc459d4b9 halomaps:244 +infernus.map 8FF8ECAC 21069305 262144 45707c98120adcac9999c8f21f7812e8d87beaba halomaps:5963 +infestation.map BE421731 215945730 262144 2193d3771d0da49a075682136d0985a5a08cb788 halomaps:2722 +infested.map 8E77583F 59060316 262144 44d309c99de3b67f3fe66cd150fe82673ddb0e48 halomaps:5329 +infested_canyon.map 84D0973C 78683715 262144 8d9f249ab94684c206d4de3eda5aa8c6faad3c24 halomaps:2181 +infiltrate.map 86FE3649 396067661 524288 63b731338ccedd565473c9f1cb44ef803f629172 halomaps:6978 +Infinite.map 7752D7F8 31626662 262144 d6f78a68c19657fdf73dcb31ae17f9a5a7bee91b halonet:Infinite.zip +Infinite_Storm.map 0D8A8AEB 58662236 262144 eef52f97907b77de4dd314d3e7ba0470c234733b halomaps:2612 +Infinite_v2,0.map 57970480 31154080 262144 a9e5b1dc32d10c7122814d1c70109f911dac2be0 halonet:Infinite_v2,0.zip +Infinite_v3,0.map E5BC65D5 40085530 262144 1387d2fe99b09c474a51b338387bbd2dc17a3bc0 halonet:Infinite_v3,0.zip +infinity.map 0E7F7FE7 18330556 262144 e69a334d0b26e23d390960ea6114d80bd60e6feb halomaps:4783 +infinity_ai.map BDF9C36B 90611029 262144 636a1729d2ecb948b2c080c099f37fa496e9993c halomaps:2066 +infinity_desert.map 77796EDE 18233092 262144 6cf7c6ab571c048dadd5eed413130a07610cbb5c halomaps:3898 +infinity_forever_beta_1.map 05503625 50224660 262144 43debe3b619ba87b409ca116800456a8ef9567b2 halomaps:4805 +infinity_futur_weapon_mod.map 7F6B8FF3 25703884 262144 dc9585d759ef045d69c8308144ee19cbcfc44a91 halomaps:5330 +Infinity_Gulch.map 00000000 196079653 262144 aed5bf5fbf72c41a8526e2e47cd42ae948ab8644 halonet:Infinity_Gulch.zip +infinity_rm.map 0E7F7FE7 336958852 262144 97fdc18cfc157b3b659b27ce5191496bcc16def0 halonet:infinity_rm.zip +infinity_tmcc.map 0DF15527 45581588 262144 1716e81f6bed55b786e3a52360d16c29b4338e68 halonet:infinity_tmcc.zip +infinitymod.map B02B2125 45150033 262144 602704e286ef2a8779980cdb14bc3abce78f41b5 halomaps:2210 +infint.map 9C481F27 107537700 262144 e3777aea036506ede9d847033ea9d6a99c8acced halonet:infint.zip +inmortal-.map 3E592C2C 196171083 262144 32e2977e0963a0e93513f410c7312ec4783fd9fb halomaps:6971 +Inner_Sanctum_pb1.map 4EC6A465 50278389 262144 421195b49f7b2a3137498dabd834feab4afd146c halonet:Inner_Sanctum_pb1.zip +innerpoa(spartan).map BE12ED09 88426221 262144 9d684d5b888875cfc9982aa50ab7be3d54b8fc84 halomaps:2345 +innerpoa.map AD2E784C 123193133 262144 ebfdd3d806e629b63082eddf58867bdf2a1bd02a halomaps:1487 +innie.map AA5C69A4 213815960 262144 afca8a083d222239cd15a7f88cf1185f6e6c56e4 halonet:innie.zip +innocence.map AEFDFB38 22947772 262144 edde7b2dcdb7890cebc41721861b007b44a2f397 halomaps:2797 +InsaneGulch.map 94B4358E 54021216 262144 2d505215cd58106b6820070bc57bb33bd556d246 halomaps:4364 +Insanity!.map 47975C50 93988383 262144 a435ae942697a03c2fd2903d29cbe37e507239fb halomaps:1828 +Insomnia_map.map E0490028 104541981 262144 fa047659035ecab515f6fbc62329a248dc52f129 halomaps:4086 +Installation101.map AB392F60 18445496 262144 7ec22bb16b0bb98810f164dab989cfff956aff5f halomaps:5852 +installation_07.map 822D01FD 20033196 262144 0c1d3ceebac990263cb3bcdd96906b0584b1a8d9 halonet:installation_07.zip +instance.map 3F01206D 13247696 262144 8e862c984e5ccd608779fa142467327b6201416e halomaps:2687 +instinct.map 8F78191E 30394215 262144 9b8ac0d060191941add0865448b3d899da19e015 halomaps:2332 +integrity.map 3B48A4DA 13871952 262144 115667715005025a8dc43f26db05d1d4153f4897 halomaps:245 +Intense_Desert.map 5B3AF50B 280162291 262144 1689373442adb03be856063a293a9e83468c045b halonet:Intense_Desert.zip +intense_desert_ai_bots.map A191929E 391864008 262144 acb1c2dcaced5af7f5b75d0f74e5854d6b58459b halonet:intense_desert_ai_bots.zip +Intense_Warfare_Beta.map D56A62DA 63236859 262144 603f1dcefc2b09d3068360de8614e80a7bc6b0c6 halomaps:4717 +intensity-plus.map FB161DBA 143675205 262144 2ff76e132649c24c594e19a30bb9f021229a31d3 halonet:intensity-plus.zip +intensity_rebourne.map 7143389D 84321486 262144 1badab219bace5b2dd1a9978257585e19c8ee687 halonet:intensity_rebourne.zip +interference.map AAF17B31 15491302 262144 618e162beacbe148152be993b6567cd4a63e3ba9 halomaps:1202 +internment_v2.1.map F06984F7 50972537 262144 28d4ce4eada9f65bab1efe5c7a6fe5ba6565e423 halomaps:4407 +internment_v2.2.map 86B35DE4 15336856 262144 60765a5bd15708e2e15f89cfafa7aa18dad356a2 halomaps:4493 +internment_v2.map 61DC8312 57021475 262144 e7917e347f5dacadef98d72be577e6aa46fc2cb1 halomaps:4365 +intruders.map 1717BAF6 57198149 262144 951c76285f5569aaea393e541191b15daca2f8da halomaps:3852 +invasion.map C2C67E63 18363808 262144 63a6a6d246f7786d48f45b14217c6a9e8c38a224 halomaps:2320 +invasion_covenant.map BD3865AE 40499389 262144 4e4bd1d63d01f46b50c1473b9e5bfdfa400a3faf halomaps:5964 +Invasion_of_twins.map 9C342335 47489828 262144 0a6ef3920093fe53e008d753a21a676c5d0c2a2f halonet:Invasion_of_twins.zip +Ion_Zone.map E79C2891 13973496 262144 f9abe04c82a34690c6d52081e3b273d249be60d4 halomaps:2241 +ionic.map 5D7ADD7B 17017260 262144 75e6abfb8e72f4bb18c56e95cfbb1f81c9075a71 halomaps:1591 +Island Paradox.map CD756A2A 45243047 262144 59e256c673b69cd33c28d519177de58627fd6ada halomaps:4442 +island-a.map C523C70C 20373782 262144 3fc951cf70588b7499432d2de2b8b226be7bd235 halonet:island-a.zip +island-of-murky-water.map B5F3D3EB 86488680 262144 f540b06ed82823769efc5f82343726d080c5d7fa halomaps:3083 +island_assault.map 5DEB8722 119968902 262144 4969acf676eee293a533e4d7d16e0e32ec828491 halomaps:4288 +island_assault_p2.map 67961312 118589896 262144 244115cb5af3f04676a81f41b8b7bf03914430bd halomaps:4512 +island_defence.map DC3BCDE0 118516746 262144 6339928efa8747018c6ceea4a16319f10b2742a0 halomaps:3918 +island_hopping.map C8B2E312 18048244 262144 3c405aead4210a35c3c77aca46a3e8c62c37a172 halomaps:4157 +island_war.map BFAD4DB6 94552937 262144 86391c661de797967fcb6d48c8565bab2fed723d halomaps:5288 +island_x.map 6E0E36BF 31738927 262144 850280be6b0127c4a6def824ab4ca408e2118f17 halomaps:2592 +islandhop.map 5B8EFA37 26025570 262144 d77cf7713b1f8b7e06f46a3ce33b4fe1dd7b6e87 halomaps:384 +islandofhalo.map 1F66C195 91118071 262144 5f75e979d02bae868579288d86fbe516400d4736 halomaps:6063 +islandthunder.map 1E7C4126 19005036 262144 675c8d55d4bf891585ab2b22e536538354bf3117 halomaps:1795 +islandthunder_race.map 9BEA9F17 21058444 262144 3b73e1c375bc03ff7f28dd23c2215ae8fba52f57 halomaps:4470 +isle.map D5C0A6EF 18905570 262144 cc6107227395d68a22c89feeeaad15889300dab0 halomaps:4119 +Isolated_Keep.map 63F55CDC 125789426 262144 915602e66ae234a37224eee2b39f40873742971e halonet:Isolated_Keep.zip +Isolation RC1.map DCE18406 28922201 262144 40a3fc1db09c0a1a9a3d58946b6f22e90fad9f22 halomaps:3352 +isolation.map 6B08C152 18620500 262144 df44d43a3b1bc8ee348729c72981fafef274f131 halomaps:3919 +isolation_npb1.map D7016B41 65799174 262144 cedadc3d438ef4ea12c3f08058727784eed8a46c halomaps:3295 +it_ff7.map 9F16A1E2 62109316 262144 603197c28c513766da61d387daadfb3e90888871 halomaps:6758 +ivory_tower_final.map 0CB106BB 70676373 262144 58be08c027e5ed228288c5867b556436d33de89a halomaps:5045 +I~~Hate~~Bugs.map E043E073 129672500 262144 582af6d15ebad11e45fd911cfc64d94fcf9e8228 halonet:I~~Hate~~Bugs.zip +I~~Hate~~Bugs~~2.map E29CA6BC 129672500 262144 4b3a2cf58d6093f8e4cc12e106d7ecfabdff3439 halonet:I~~Hate~~Bugs~~2.zip +j.map BD3160B4 27391379 262144 c3d965c370ab12c7233ff13faeb43151021f4f33 halomaps:1855 +jackal_shield_gulch-0.1.map BDACE6D8 45374107 262144 f3c0b44294f85161b0b995afe9ef3527d542f903 halomaps:4231 +jail.map 73DC29A1 13544116 262144 b4f50184cbd26db307795f6033d287e494d04bb0 halomaps:1999 +jakgulch.map B7ED7253 43079010 262144 6681b24283daf10b34376e09a6219451b0a9f07a halomaps:4530 +jangle.map 2D195035 39157617 262144 e909554db8a8e559d4dc6b2058da8e1c13701753 halomaps:1456 +jarassicpark.map BBA025AF 73249920 262144 6a9bd4170d1c6f4899adb27b29e120784a3213c2 halomaps:6113 +Jeep_Cliffs.map 34483CC8 22995900 262144 b92de9b4a85895e23956282cc63492836ff4a7d3 halomaps:1989 +JEFE-MAESTRO-VS-INQUISIDOR.map 22C281E1 236049393 262144 d453890b540fe7474a4aa023c00366bc72b84260 halonet:JEFE-MAESTRO-VS-INQUISIDOR.zip +jefe-vs-covenant.map 50B8F13C 326716103 262144 2a27735906d1eabf7b0aeab7242b6af7b58e63fe halonet:jefe-vs-covenant.zip +JefeVsFlood.map 76E17800 348384134 262144 6ee6424ca1521b64e973aec302ea9939d13a17e8 halonet:JefeVsFlood.zip +jellystone.map 39B5887A 13949968 262144 38b7ae7811a2e513b75b3f021dc02e62c5a999ec halomaps:246 +Jetpacking_Action.map D89779C9 240489758 262144 87245c2331be65c28244e14027aa4bbbf34fde6d halonet:Jetpacking_Action.zip +john_ai.map 5397CF2A 192656355 262144 5576285b7c26f422053d82cd9be4812e2fabb40f halonet:john_ai.zip +johnlex-fucking-sucksv4.map 7A99FD67 66339071 262144 5bd5cf9c6f5414a41a59133934d1cecbc614c7b0 halonet:johnlex-fucking-sucksv4.zip +jomart_ascension_i.map 5542EB86 177443718 262144 b55499d67cbad48e1d003a8456e798023d8a0c5f halonet:jomart_ascension_i.zip +juggernaut.map BBA52C21 89718372 262144 8e8c17de42d7af806d0c92a50d28f9e13957afa3 halomaps:7042 +jugular.map FE739BBF 15318712 262144 5ecb7839bc177ca051b7bfa0cdbb03c472a840a6 halomaps:1457 +jump.map D13014B0 13164568 262144 58d7602c7564b2e07931b93f1466ce322dde9ac4 halomaps:177 +jump_classic.map F2DEA1A9 12731444 262144 bf6f2e52bea81e806243f5d661355676934071c8 halomaps:3791 +jump_pit.map 0995D3EA 18616722 262144 96d88e589b63e8252f255f6610cb954aeeaa85b5 halomaps:4263 +jumpers.map 830D51D6 29079946 262144 66ad98089268fe1412bca78e3fd6b7a23c07f04d halonet:jumpers.zip +jumppit-reborn.map CFC19F62 23303878 262144 08f6c2a4be789200ad639ef933b92b169e037ae0 halomaps:4471 +jumps.map DA3D5B28 14230096 262144 4803008ce79c269a886b6d4a8d45195207f94d8a halomaps:3644 +junction.map D2A40ECC 13699356 262144 cdcb488b0ed7b18362e086dfb456f4bb8c46318c halomaps:3706 +jungle.map FE44B3B1 13985432 262144 2147242ed0d4701a6e474478c851b84edd3e6fbd halomaps:3991 +jungle_battle.map 0050810A 118166886 262144 ebe4e9a205a34b73423ff421b1df29d0222cb526 halomaps:3707 +junglecombat.map 1414CC7C 56507570 262144 3e7d450809c452f3983aaa8ffaabf28a9f30cbed halomaps:2260 +junglecreekai.map E463E808 46071674 262144 9c030470b3cfbcbf1344ff8e51bef63ea422c66d halomaps:3549 +jungleraidnight.map 1626A740 14161132 262144 90f5c663dcce48ab6096cf46d33d20cbd18c4911 halomaps:1847 +jungleraidV2BETA.map 07DF12DF 20802756 262144 6af459538b581f0869cadd1b59d28b035c772951 halomaps:2867 +junk.map 5037E56D 35559712 262144 93c513f5a73fc0f138f0a7085c5949f6fd5cd6e3 halomaps:5237 +junk_with_weapons.map E24BB429 41552346 262144 46f673368ebccc4e28b454dba1262c97c33a9d81 halomaps:5425 +justin.map B59DCB0B 12051760 262144 b1180d6c1d213d1f411546d346f3c94995add34a halomaps:4901 +kac.map BEAB1F77 14427376 262144 6c2c1827d42ed65c16cd0036cf1bb8d87b58aad6 halomaps:4494 +kaferdel.map B6D07196 84031259 262144 45640a290c46ddca87ecf224d7ee9113887c0190 halonet:kaferdel.zip +Kakariko-Lost.map 5AB57CBF 84279280 262144 0eef03a7736332b256d116be765b00ef9845a0eb halonet:Kakariko-Lost.zip +kakariko.map 082E5DD5 72780272 262144 493e6a67a27d75213b6bec965bed49b8c99cc4f9 halomaps:5788 +kasheek_(starwars).map 669EA763 90986431 262144 a85fb4fd4c809bdec6c862c6105ce437498a129c halomaps:4735 +kbattle_creek.map AC6FFB05 64327862 262144 571db656c994255fd9cab821364a76f65c2fe496 halomaps:3175 +kensworld2.map 3F7B11A8 15121260 262144 863958150d816679e3931286036829ef633908cd halomaps:2346 +kerplunk.map CF7746E9 13493968 262144 a6b024b55314fdb4c15937204428444a15f09286 halomaps:540 +kgephyrophobia.map 1D55E963 68820282 262144 8295c4ae330646f7efdc5a30e7593ad20d897cce halomaps:3176 +kgm_bosque_perdido.map 15C00A15 358705084 262144 ed4ba918349c1a3073319ddf8999e78059877bdd halonet:kgm_bosque_perdido.zip +kgm_oficina_abandonada.map A15AD828 325315864 262144 bb719a478e87b6654d42856d70beb4e59f53cfb9 halonet:kgm_oficina_abandonada.zip +kgulch.map FC453AC5 70884505 262144 def546cf429b875856df3c952d8e16f87140c034 halomaps:3177 +khand.map B2792942 17471664 262144 ccf512d632648ccc0638ac271a82c368dff73248 halomaps:4513 +Khar_Shian.map DB43602F 197996564 262144 679dd6b0e9212db638364a9e35f445408c2e757c halonet:Khar_Shian.zip +khl_crossfire_test_v0.map F954104E 13280540 262144 8e615ef1df8c935a62a3b46fff26ad80a19eb08e halonet:khl_crossfire_test_v0.zip +kill_team.map 5196267D 40750173 262144 edce1a001e885f5925370b0a59c328eb8633f232 halomaps:2798 +kill_your_television.map B80F1148 16135180 262144 f7103346cd0026cb65fe75e1b774906f08a18109 halomaps:2955 +killa.map 4AB2E3A8 24831514 262144 a2759b8cf62cb95386ddfdeac541a1f994dd2cf6 halomaps:991 +killa1.map A5725C17 49994194 262144 01b2d2b57a2109be24d3aaf1d5167f9bce9b29a5 halomaps:518 +killbox_beta.map EA716A3E 27193723 262144 51cd4e3c350efbfcec719e91f079b563f99771a9 halomaps:1041 +killer-gold.map AC7DE8EA 159474991 262144 232080d09b19372c3421be3b339e93a231599a33 halonet:killer-gold.zip +killer.map 170FDB1B 12663136 262144 c059da64506c3cac00aab7ce536b7ffd4675785c halomaps:2688 +killer_cove.map F11568BB 14495940 262144 30caccfa80f398c59a1f70c529acf7c497fd43da halomaps:2855 +Killing_House.map CA5E67D9 227223508 262144 e51da74107c53807358fe350909df6d20c49e898 halonet:Killing_House.zip +killingfields.map F1095B66 13798016 262144 01667d9a65b902724b5d05643023674840acbe5f halomaps:2764 +killingfields2_day_version.map F3753A75 13990748 262144 1eae59b9751a92da74118d8692785e868f53a498 halomaps:2765 +Killtacular.map 7A07D00F 20279740 262144 9a0ee3572ccc236eec3821a942538fee93db2486 halomaps:2091 +killter.map A0B99FF4 13782627 262144 25c486a4f09a252d5fddc02f0b96f42c99821c63 halomaps:3030 +killvalleywinter.map D739AFB4 18649547 262144 d9d1815e06c3c84b1dd415ac156fc62680f5874b halomaps:327 +killzone.map F992B4E0 36626628 262144 09d2c052ac2ac0ae0bff6b6b4e982d3fc0d97d5b halomaps:2925 +killzonexray.map AD0A6F61 42722992 262144 6d1cb21eef0c921972950d7d6d47edf2fb0c25e9 halomaps:4689 +kindred.map 4A1BC6CE 18827880 262144 05ad15875d160da5622d2ce2cba3d36381eefcc7 halomaps:4514 +King-Battle-#1.map 8AACE00A 12991440 262144 4386697e8b46e7aab0df872d9b609c064bd70710 halomaps:7126 +king-beta.map 9034C0DD 185988435 262144 c911c4b11349d438127e8204575171dc7cb6783e halonet:king-beta.zip +king.map BA7327CD 17189840 262144 52208e0928e98e20dda841a5820c17c267e333c6 halomaps:542 +king_mar.map 1F44D325 36140622 262144 51707237347b5cb8152f478c9689728822b345ec halomaps:1829 +King_Mar_AI.map 2DB9C3C0 23521696 262144 c205e9a53f582683e91fa6e0f4c431211813e27d halomaps:1848 +king_shinzo.map A4F32739 25087415 262144 06735c26fae7e469c8f83d87289e38e18e2322ca halomaps:4718 +Kingdom Valley.map D85E0460 56173953 262144 ee71bd4f9b63436fd6f05159ae2ee3840aa3cc5f halonet:Kingdom Valley.zip +kingdomsun.map A421DDAA 25894738 262144 fa6eca88c4026fae6839d9d4548c2c94e1190d16 halomaps:2719 +kitsune.map 173F4D64 16817616 262144 3efa2bc004825ba45564eba21ff2112f7263e5a3 halomaps:1661 +kiwiland.map CAD39856 21882632 262144 44f0ebba4b2241e449fb1d5392a167fe388635e8 halomaps:3550 +klioster2.map F293AFCC 15583341 262144 1c985f5f60c3488d7f1cbac7c334cb10a52c638b halomaps:1108 +kmap1,0.map 4B42EBD8 81696529 262144 42ec8b72ba1217ae23763218c45c4e6233376d61 halonet:kmap1,0.zip +knot.map 79D05930 17149041 262144 436f2542a8d0bd3a2c1bda97870f360f2748abed halomaps:2856 +kod.map AFEE9163 30532716 262144 0a2a232df7d5a623d91b36e46d846da39aa1fabd halomaps:2689 +kokiriforest.map C5890622 63927409 262144 cf4f049caf0ca92c6d9062e608c8e300aa2c94b8 halomaps:2720 +kprisoner.map 92CB3DE9 62891833 262144 ab059907aefe11df7d7858cb361ad98b064e80a0 halomaps:3178 +krakendemomap.map 0BC07DAF 20839570 262144 74fc71dc2f8573dfe367842ebfe8e12338c3c97b halomaps:3184 +kzcm_no-mercy.map CE5DCA20 129691929 262144 c424b0231d42e845c99eab243a0d3582a1dc06ab halomaps:5950 +l'évolution.map D25AF0AF 32271731 262144 6d3b8e66f54d7de8dc61d414f89d0aff14acb49a halomaps:6282 +l.n..map 24D06B2A 100075551 262144 fadd0b583ca8937ca390ed2109e95becb21c23cf halomaps:6495 +lab.map 3BA23371 19471053 262144 37217e643822a219b8abd00983956a71b775109c halomaps:967 +laberinto_2.map 68D0CBAC 19524979 262144 6b01a758894c0fff7c0cdbb530ddb01eb50ed2ad halomaps:5842 +labor.map D1E01A96 85889558 262144 2130e84672f7d6f2ab030e7267f2cce19a4cd2e9 halomaps:4443 +labs.map 5F93A01A 32122634 262144 69980ee11639874197859f542793abb9847183d1 halomaps:4120 +Labyrinth-desert.map F92B82A8 17703826 262144 6f6943d150cf584efb5496368576cf8818f04986 halonet:Labyrinth-desert.zip +labyrinth.map 3A1AD6BD 17397648 262144 b56d1e1ff9fce16bd7fb6171bd38c0dbc045fc2a halomaps:354 +labyrinthe.map E109CD46 26545032 262144 3758330ab609d66d18bae0f92ee2e56c1ba3b5e5 halomaps:3227 +lac_chapter1.map 25733249 138087274 262144 b43c6a0fde81eda64255b06e029f4497fbbb3b7c halomaps:6027 +Lair_Final_Beta~FX~.map D8A9C4C3 13554932 262144 fe3d4cd88a202497123071821e65c50d22a3a2c3 halomaps:1830 +Lake Forest.map AE1ED1FF 40692312 262144 3f2963141722deac5beb43e70c4ed2695028b523 halomaps:3992 +lake'sbloodgulch.map 44CA5600 30664867 262144 af81877b09f0fb36972b879d66aa44f7ea0fcf63 halomaps:1724 +Lake-Natalie.map 4017F5BF 22281538 262144 bfa8d63003300d7b89ae6b8b7de9d2063863bd1c halomaps:4472 +lake_bovatoya.map 5E9DCBAD 51356466 262144 ea46287d62481334e6e5fd06a30c237b3bd63dc1 halomaps:2956 +Lake_Serenity.map FF7AF0BC 109704171 262144 772a9c1c5b2377435bfc59000792d5bae006292e halomaps:6114 +lamborace.map 35FB3E47 40778888 262144 c26d6ca68f145bafc9cd6a1ba78522f4a2b8a5fc halomaps:5843 +lamda.map 9A7522FC 17091568 262144 8aa5dbc73e3f643f72426665e01289a08c3f57d8 halomaps:2502 +lame.map F7040525 13777112 262144 de8f98e8e83dbaa71399506a588f126ab0b8e4ca halomaps:247 +Lameass Box 2- Crappy Evolved.map 3043159A 33436171 262144 93bfc0d7f1fdc9c0548b9a0c28c21fd246e07db3 halomaps:4032 +lameassbox.map C59CA737 12389092 262144 c026162506c78375ef0feac12cdaf211b14fbfcb halomaps:3513 +lameassbox3.map 6A02C1F2 20357019 262144 fd57f14a4319706338eb94184f6103effdc4b62b halonet:lameassbox3.zip +lameasscardboardbox.map 6B8889FD 12089236 262144 2ed5f0222ceab0300d2b643c020482909fff5efa halomaps:5372 +Land_of_the_Lost.map 1C8356D9 327385864 262144 6b3fc27562b0fa38423d2d492166632682532c79 halonet:Land_of_the_Lost.zip +landofconfusion.map 1C9C6DDB 20720548 262144 15dca5f3a85a5c883e9a1a55aec80dbabbd3195d halomaps:3415 +landslide.map 2E540F13 18116774 262144 bfd9b3b3af61992cb4c11a7986a1ed6374c0d1de halomaps:3811 +landwar.map 8A2C77F6 76876303 262144 c9e6fc997ae4bbc8e3a53c469e28947c9756eb39 halomaps:6766 +landwars.map 0F733EA0 82496660 262144 686507f6e3d588b37c2d023291b2eb8deef9ea57 halomaps:4366 +lanthanein-pb-SSL.map D8FEFF8B 124558105 262144 15bbb7ea8e8d8234be7b582a37be3593e433d49b halonet:lanthanein-pb-SSL.zip +Lareliquia.map 689E9A66 121501486 262144 24bf4623f9c3962f167dc6782bc1c44cfa64f765 halomaps:6836 +large.map 10918FBE 22404680 262144 036969b24afae1ca941ac464876d267e72d31e78 halomaps:2489 +large2.map C1DB6BE8 27579439 262144 50103182a9bc1d22d1b4675a5a22273c98d2183b halomaps:2636 +lasertag.map 2A5CCC69 13706420 262144 1e8a10d53d1a2f8e236ad03054d1993a1324b954 halomaps:2347 +lassirenas_screamer.map B8AC0E63 119802891 262144 351e8efa397b0a768ff4666a77fabf25558e768e halonet:lassirenas_screamer.zip +lassirenas_screamer_v2.map 9BBC685B 141596852 262144 c129c32e4f8aaee74001111d148835c8e38483a1 halonet:lassirenas_screamer_v2.zip +Last-IceCoagulation.map FCC3B761 249865605 262144 d65a191a72ed9598355a857b2f3bbd288fa2d1b2 halonet:Last-IceCoagulation.zip +last_fight.map 29A4E018 14574156 262144 3e5b758ee6315bb5f79ebe01d60caacfcd36c484 halomaps:4251 +last_hope.map 364CC541 13828018 262144 555731d178aa76e036c6ee0b1821ad2d0b775d5b halomaps:2905 +Launch Bay.map 04CDBB66 30281756 262144 4cb027afb4557d9d4243c81872d80a401cb9c8a0 halomaps:563 +launch.map C894A4E0 13607284 262144 263515582ab29c97ba69793c7ce91b1b14ddbe0d halomaps:5407 +Launch_Bay_X.map A5D36CA2 25000872 262144 37a2f5a28a0ece958db4028487045f36915bca50 halomaps:934 +lava_base_rpg1.map DC5F60C2 81059762 262144 df932cc5219da34208a4aa6796de591a74fb5b3f halomaps:5892 +Lava_Bed.map 297BD71E 294814802 262144 7d5a7a6fbbfcc0d9f6dd03bcc4b96a5d5ec746a6 halonet:Lava_Bed.zip +lavaflows.map A5EC4C1D 16353916 262144 117d93fee8b7f9e78986e6dd3f27ed92d8f1ceb7 halomaps:399 +lavalamp.map 57DAF4C5 18119754 262144 1fc05e7477732f316bae25a2e50d822b15d83071 halomaps:2857 +lavel.map F4FB7AAE 15710064 262144 64232bc0a64b068919fc561fbe5f9d7ce90a9225 halomaps:2305 +lazarus_valley-v2.map 98384C78 105928557 262144 a406ee012b21db2eefdb99167e0c5fd616581e71 halonet:lazarus_valley-v2.zip +lazarus_valley.map 20B48727 89799404 262144 22e2865479fd8f13e5c3c53b6689848fff946525 halomaps:7075 +lazarus_valley0.1.map 570409F9 114411539 262144 833a6c50db8c803eaeba3031767d088175ff17c7 halonet:lazarus_valley0.1.zip +leadhead.map 4C7A03FA 19243115 262144 2e450ee42e0bd9e66d78e99b255227d49b9671c4 halomaps:2348 +leafygulch.map EB7B2ED0 18018988 262144 f5c9c15a34032afa34b640b7a5d28517fe3eae91 halomaps:3645 +ledge.map D821443B 97423727 262144 faf5c08dc73124855b616f9a2affcaa94a12865d halomaps:5095 +Ledge_fixed.map D92C9CDC 100084284 262144 172ea0bb1b9f5bb881a5939c3b457894593e1e96 halonet:Ledge_fixed.zip +Ledge_v3.map 00000000 188205584 262144 f5bfffe6bd1ed391c3f02f3723dba9170eb45c00 halonet:Ledge_v3.zip +leer.map 3058CA93 111766317 262144 7b39a86c5014c615dce28e9b6a2a954ac4f12969 halomaps:4657 +left2dieforever.map C4BE94AA 28678690 262144 32be5f6a87197adcd90233d0c16aa7a65733f865 halomaps:4431 +Left_4_Dead.map 6A4C0B7E 400311841 524288 ee6cb220aa92660174c9675861081af0b7df3c26 halonet:Left_4_Dead.zip +left_4_onotix.map E9F32E92 98167600 262144 fc246efb343416c67008bbb6eea79a996a288b62 halomaps:4658 +LegendaryGulch.map FECCE9DD 113932218 262144 366bc9449f9a148f9bab94ec2ead4855fc6115b0 halomaps:5503 +LEGGESTER.map 82F9A078 395051700 524288 40c91475a790dd31fe2d0e85db15c7cfa6d2bd7a halonet:LEGGESTER.zip +legionairs5.map 2DB44B90 121899867 262144 1df25fb90d2951b5f2aa41db4951cafe2ce88f9d halomaps:3353 +lemondrop.map 5646E081 57419594 262144 1e9a0e5f674483997b1ae89eb788f25d32905eb2 halomaps:5186 +Lethality_Canyon.map 7D0E5337 89337550 262144 4ccb0e7cf414d4854dfdb288e0eae1fe3b9550f4 halomaps:1869 +level2_training.map 8C297E1E 14068288 262144 5e6a8ad1f3f78b12a8ac8ff1d2f5df6728524c2a halomaps:4278 +level4_training.map 8690BFE4 33070612 262144 b9536e071c1ceb5329ff35155fbac9a59b70e7a8 halomaps:4289 +level9trainer..map EADFD797 15587704 262144 9fe222c8927302cfbfdc02ecf2ddad8fffc030d9 halomaps:4408 +level_1.1_trainer.map AC5737A7 13116044 262144 9c2819d872ba8bb931c64df59cd5f6e04f655bf8 halomaps:4264 +level_5_trainer.map AB23304B 14032644 262144 588b9e2d006b15922b7b2c9d37ec2f10d774c247 halomaps:4310 +level_6_trainer.map E2B24A6F 14004288 262144 d763aee6ac7eb097c4d4a1263f2a69948bb60693 halomaps:4329 +leviathon.map E31F7919 19436658 262144 2255788418e09bcdad714fc04d281abadb813ed4 halomaps:3031 +levitation_devistation.map 2DACCC70 18545332 262144 15475a95fcb86d27411477bf977f1226449ae5c2 halomaps:3730 +levlel8trainer.map 65AFF53E 15881237 262144 fb00f4d17bc9206df9a9e9b3ad1a0ad9db10cffe halomaps:4367 +Library CE SV.map 243DA414 54137797 262144 d187a7611cb3f0aae998fc2913f1a62bf5d4b773 halomaps:1066 +Library CE.map 243DA414 54137797 262144 c29dce5ed53a27a4f9db6dadadabe1eb9183024e halomaps:1022 +library-final.map A3CCEC04 73384545 262144 0c7772c77be105914b52845de874a3fb7f771093 halomaps:3258 +lies_and_vengeance.map 8E6C11D6 118670890 262144 48a231bd98672dad745efcadc49d9d6fc0e67f3a halomaps:3535 +lies_and_vengeance2.map 3DB07F0D 131860019 262144 f7766eb934537ffe50220341fd0d88f350851af4 halomaps:3615 +life_rpg_v1.map EC472F1E 132050195 262144 b25617006714c00704e1ccec4ae3562222b22b30 halomaps:5638 +Lightmap_tut.map B04D03CE 20849808 262144 157ae5d731510dd133072695d77f971640d2e03e halomaps:6444 +lightningstrike.map 49ACD8DE 13424624 262144 a16b34d888307fc532b0425ea580097aaf518e22 halomaps:248 +lightningstrike2.map B02D46C4 15737176 262144 6e242aa95d604b8849c0708d4785ef98dbc4bb69 halomaps:1074 +lightsout_deltaruined.map CC9EB3FF 60770925 262144 627e105bca1d3ffaeb7dcd1b4e87b11105386584 halomaps:4920 +limbo.map F84E0421 12823339 262144 df7806b38fa9bc8d5e5ae467c5ff3587c3d0a702 halomaps:5785 +linkbeavercreek.map 31F2CCF8 13958356 262144 b20d1ba19603047e15475ef276d85b9b25a4e756 halomaps:2392 +linkbloodgulch.map AF5E9226 14797448 262144 e09bc6069014781680bc79559fe513928148161c halomaps:2393 +linkboardingaction.map A3499F46 14821860 262144 75070dd09b260bf84e2b8181583d182c16fa4116 halomaps:2394 +linkcarousel.map 1A1C94E7 13505088 262144 b0c4a4cf848b9cb7a609e8b5247bb7ce03588904 halomaps:2395 +linkchillout.map 638535C0 13582480 262144 a16dcb912f1af0ebc978c071ca2905428f8c6cb5 halomaps:2396 +linkdamnation.map C5E42C13 14868236 262144 75a3031f476c61a206a24e9c1671040fe61f1b52 halomaps:2397 +linkdangercanyon.map 9850C04A 16026756 262144 cf834cc5dc27dfa8b6bcbd6b05d4659e05777314 halomaps:2398 +linkdeathisland.map 993227B6 19014640 262144 38de0133f02a27a5da9ad5f851b85379bb5b8203 halomaps:2399 +linkgephyrophobia.map 38EFF4A1 16440668 262144 d6af06df699e08d29889b4df418bd17496cea2e0 halomaps:2400 +Linkgulchmod.map 5EF1B0B0 20266179 262144 373679bf40fa9b9fbc6e0979bbea6b73d4d7bc2c halomaps:4516 +linkhangemhigh.map 07666F33 13589248 262144 fed3aed7d32d5ef3bec523fdb031b9c8a87e5fc2 halomaps:2401 +linkicefields.map 54724C0C 16715536 262144 2ab830a95b4dff17b19f9e4ecc81cabe70147154 halomaps:2402 +linkinfinity.map 8A4684B3 19191912 262144 e4338dc140579e626d0dbe0c511da5d859cbc93f halomaps:2403 +linklongest.map 1895CB99 13394916 262144 17dcf3017b5eaec4680d609d64f578d8cd7334f3 halomaps:2404 +linkprisoner.map 0C9B6C66 14031464 262144 9588777810ed9e11f5f23ecec4a3abc8586929d7 halomaps:2405 +linkputput.map EAB504A1 15032936 262144 c878bc3262d999491780287ffc649ae94524e86e halomaps:2406 +linkratrace.map E9B1FBA2 13623796 262144 ab95f7515d02aeb2668b189267e461ba47ee5117 halomaps:2407 +linksidewinder.map A049E855 15701952 262144 4851a7c1166601d9e5e1998fba7023d783cf5795 halomaps:2408 +linktimberland.map 8CEE5B54 15552276 262144 5ed1df07e930d2f0c8d89dbb184a596d50dd7318 halomaps:2409 +linkwizard.map 2AF8FE3A 13592820 262144 24264a35f49823b6b5940b7dec90dc4caf4fdb22 halomaps:2410 +Litiferium.map 8C364E48 91478292 262144 8d41413ec3306e1be81a41a5a7886b6c04093f0f halonet:Litiferium.zip +litretad.map BF66261F 13000172 262144 9901cec644b3c1a2346e694dd5c14efc3d9e1d0b halomaps:6535 +Little_Bigass.map 00000000 296733898 262144 3d09559c7cc22f66cc867f6d22be6bf0d01d4a8e halonet:Little_Bigass.zip +Little_Bigass_v2.map 00000000 331650608 262144 d50712525900a011700e6e6ac17b613cb4b9d07e halonet:Little_Bigass_v2.zip +Little_Bigass_v3.map 00000000 331650608 262144 b6a2e15ce5b8fd56c6e772ccba0ca77204211d24 halonet:Little_Bigass_v3.zip +Little_Bigass_v4.map 00000000 331653648 262144 b9c5d758a7e1738d76ab30bc6a3751b5d9c02f43 halonet:Little_Bigass_v4.zip +little_bigass_v5.map 83C6B7A5 255843410 262144 400b372b6050a53df5735b7bb5d54735df17a56d halonet:little_bigass_v5.zip +LMT-station.map 2C5C9097 97685023 262144 2ad4038750dfe273119bc4f806cee3f7dab0d60c halomaps:5202 +LMT-zanzibar.map 59A90A86 207160241 262144 29cd646b292d6c879936f37647eeb598b411e941 halomaps:5238 +lmt_air_duel.map 0E86ACC6 83092746 262144 2aaf361d3283845ddf4fa5b2b9e569b0fd9e38a7 halomaps:5893 +lmt_Bloodgulch.map 0EC7FFB3 97487938 262144 25b016a03938f0073ea5928e58bf5f7b1dd64bfc halomaps:5894 +lmt_bridges.map 278291C8 121434536 262144 42aed5868edde10dea3ba89a29a336143d374543 halomaps:5965 +lmt_force.map B6C5FC4F 84906059 262144 62a7b5c917b0bce398da9da015c773df23b559d7 halomaps:5853 +lmt_high_ground.map 5C1DBB24 83273407 262144 4add8411c1c4f5d520e830fed5f9eed1dfd1b82c halomaps:5895 +lmt_hill.map B1EEB6DD 100180771 262144 1957e107875ca783dfa1467cdd4d77fe74fa812b halomaps:5844 +lmt_ice.map 18DBDC3E 94946078 262144 33c2a671a9e4571da348649e165a9ade768ae655 halomaps:5933 +lmt_powerhouse.map E34E61C4 116857655 262144 8a327de0763e0104421871dd6c6075b4c3514203 halomaps:6021 +lmt_reach_hangemhigh.map 158EBD70 95792883 262144 cfce4ea8167b11173b219afadde0070ccc05ab7f halomaps:6022 +lmt_ruines.map 0C0424F4 106262319 262144 e07188ad69c2f6455901665247dbc9befb62451b halomaps:5934 +lmt_sanctuary.map CC31613C 84837085 262144 28b9d94969f51a9b157f744b9306d560d2b231cd halomaps:5896 +lmt_satanic_blood.map 38835EB5 109340221 262144 41120e956b29e90fbcfef11c78fb5eeab051b5b7 halomaps:6008 +lmt_trust.map 558085FA 83848279 262144 c930f8e5667214c97201c62650397c5fcb6863fc halomaps:5854 +lmt_valley_dry.map 1E5C3EFC 110278224 262144 776db26e051c706c56d2a3a768f8ad1680530084 halomaps:5897 +lmt_war_without_truce.map 62328F44 87826151 262144 7a5472c9d608990037719cacb1f7f1eecc32c099 halomaps:5898 +lobby_classic_PB1.map 296C5B46 50972982 262144 2221497e3c044aebcc9eb5358bf46c4dccc89c29 halomaps:2868 +Lobo_Solitario.map 60A74846 156473044 262144 fb052672a8b082d234abd0d6ae86e5dc0ca0655b halonet:Lobo_Solitario.zip +loc.map 00000000 391996 262144 25d71e677845df08087f6e2e4621cf350d7f62cc +lochscot.map 3CD2A694 13634932 262144 69610c6b1d34cd01c4b3efff66b7d811955a540f halomaps:472 +Lockdown_Mombasa.map FA55DECA 85158860 262144 ee2b5b2e0d1ac79fd41494a3f006adb2e2b706b3 halomaps:4515 +Lockdown_Mombasa_V2.map 78202177 88163563 262144 3108efce2c90c7cc324f63e6b072b78583a58f82 halomaps:4842 +lockout.map 34A65263 12761100 262144 aae405707b89a35b3262c564c5dd0e991e5111dc halomaps:924 +locus.map 7CBA03B6 15978824 262144 e9d097a5f7c0b76ecfe98d63b19d42405f8a7e58 halomaps:249 +lol-creek.map 1B03F3DD 42533015 262144 c8adacb652c2250b1e77cde9928e1ba5b2ce32c7 halomaps:4868 +lol-gulch.map 14F51E8B 59892529 262144 54976615d92ed3976bdc66539b70e00cf6e0987f halomaps:4902 +lol.map 410B25C7 63181937 262144 456ee3e8a5cab49a7e7e650dd5ad1fefec7702e4 halomaps:5639 +lolcano.map 607D1792 14706116 262144 c78ea85600ba2ba01a9132b2363406c76dfd3b46 halomaps:1636 +lolgulch.map 7A2FE140 51669475 262144 bb4f9de7b9d913c8ea756bea55a38b629acb12fc halomaps:6837 +lone_obalisk.map 8EBF83ED 12612696 262144 9868a12386f6ca320153699f3917e2c8ed5e45e8 halonet:lone_obalisk.zip +long_run.map 3BC277E0 27780767 262144 ae70e9cb1e20d87d75f41477debd024d8ac7f967 halomaps:1307 +longest-king-ai.map 2F6A3779 18041020 262144 cfd082bd82186bd61f424960b70f850487aef1df halomaps:4970 +longest.map C8F48FF6 12533560 262144 0a1e51963ac4e639a57438210b05548a542be996 halomaps:4784 +longest_rm.map C8F48FF6 306474856 262144 1818b861466daa51dc208304c6764dc15ae8ecbb halonet:longest_rm.zip +longest_tmcc.map EA3D6FF7 36332348 262144 1717465e40d4922d824c38d244c413e19662465c halonet:longest_tmcc.zip +longrun.map 1287B8E6 16914016 262144 4dd8f668de2982b37ecfbee0d1c60c5092928c75 halomaps:250 +longshaft.map 35FAE535 53146038 262144 2ff8cea4b8489af4458b00bbe11f4357824588da halomaps:2160 +Lookout.map EA943683 26376120 262144 f6c0e84883daccf41d7a24be825448e8cb51611c halomaps:2067 +lookout_classic.map FFAFCB71 23629812 262144 8b082a9dd21dbf8942e9d2648841fb7614c35331 halomaps:2075 +loop.map 25962283 12492280 262144 ff16525df94670970326d75c2e1fcf30d3b94f4a halomaps:251 +losgauchos.map 5F48BE09 29626296 262144 18c878d51dae13693e4de464c474b387aa878f35 halonet:losgauchos.zip +LOST The Hatch.map 80115546 16291940 262144 32d6d57332420df8c94685a99098844ee2609b5c halomaps:1677 +lost-castle.map 37A13BCB 67201291 262144 d26e208a37f7d335e7b6a0a82ce7d36d403d97e1 halomaps:5855 +lost.map 25AD41DD 18906680 262144 3a697b763a732980337ca242b767674784c2d7d3 halomaps:364 +lost_at_zanzibar.map 60C70A3D 87966518 262144 ddb07a88aa4348b6900ba2447048d7c8f7c55cfb halomaps:2082 +lost_at_zanzibarv2beta.map E16D9BF9 111061634 262144 66befdd81e453061550382b757d0f241a80eb6b5 halomaps:2092 +lost_halo.map 27AB7BDA 126044436 262144 5700c8690d315cdc415bab2fdae10ffb64ef018c halomaps:4990 +Lost_Temple.map 4750CF46 349953764 262144 aa01ee6309d99c6cf427df578e33e49a397d20cb halonet:Lost_Temple.zip +Lost_Valley_Of_Blood_Beta_Map.map 9530CDC7 25552444 262144 c911ab902bb6da9991d1b66b1a0caf8ec2a97216 halomaps:2991 +Lost_Winter.map F1B00190 347701153 262144 1ec52cd53775fe5900254bdc3e5359ccc7d633be halonet:Lost_Winter.zip +lost_without_hope_ai.map 585227CA 34386423 262144 a86c58008ceebd2b3a9e1e2dd14eac73ddb9499c halomaps:4495 +lost_without_hope_fixed.map 4E52D959 33191249 262144 b21314bcabf7d4c751b456d072aa4dcfe347447a halomaps:4473 +LostCove.map B4D99BD8 24147788 262144 973e9a07ffcf9f92501fb9e1c567583832106cfa halomaps:393 +LostCove_INSANE.map F61AD74B 103371679 262144 da348e85fce1244bf84475fdb77a22b459f9afeb halomaps:3823 +LostCove_Race.map 08DE2CB0 24423068 262144 7e7a0a64c8993e1011728b2d7c6bee8d8034b7b2 halomaps:2799 +lostsquad.map 782C6B52 110595890 262144 d51fddcb12f12adbdbfe6554b209bbfa1a58d777 halomaps:6396 +ls3.map 2CB218D1 19930192 262144 d2e208a38569484a0d8c86df773b4ede64626fab halomaps:1085 +ltd2-Bounty-Gulch.map 00000000 70739844 262144 52510c8e51a59214ab3d9d3c26b9afbc6fa6950d halonet:ltd2-Bounty-Gulch.zip +ltd2ratrace.map 00000000 78104616 262144 2e67e0b6e85030dcfd42a73e550c713b0504ab5d halonet:ltd2ratrace.zip +lucidity_alpha5o.map 1BF02BF8 18540216 262144 8c781386b43568a0139be29d94733c9f62de6fa3 halonet:lucidity_alpha5o.zip +lucidity_rc_b.map AFE770EB 26269440 262144 1c4102a8af35490886c330201fffb8fa70343f7e halonet:lucidity_rc_b.zip +luigi_raceway.map D978D3EA 24015592 262144 c9db6ae76b54bba4bca223f23c81e143e3948067 halomaps:3708 +luigi_raceway_v2.map CE2BAE1D 71279104 262144 f6cda034230133a7803ff7c9692f78274fc6b12f halomaps:4474 +lumoria_a.map FF5E6EEB 274873434 262144 d76ff6d12af8820de28c2b32ee41a4c43f07886c halomaps:6503 halomaps:6507 +lumoria_b.map 231AF796 228054210 262144 88fea378a62116bc3d74deda35297d00a609fef3 halomaps:6504 halomaps:6507 +lumoria_c.map 38455729 198269022 262144 1eb859401cd168aea6cf23911d24944f01e2d96a halomaps:6505 halomaps:6507 +lumoria_d.map 5EB11819 191220134 262144 9f54fbf63e28937102280ff344b76686d55a5e1e halomaps:6506 halomaps:6507 +m_downrush_h1.5.map 6E17F56D 13807340 262144 c26df79ebeea4ca09a21d10d33b5eb0cbc0b9e3d halonet:m_downrush_h1.5.zip +m_mlg_amplified.map ED828CCD 129461625 262144 129bd9d1dd26216e58191cb5b8be76294eee8f64 halonet:m_mlg_amplified.zip +m_mlg_amplified_beta9.map EDDAB839 108844211 262144 5cdebf2b69d929c8de704e2102d98b41637c63a4 halonet:m_mlg_amplified_beta9.zip +m_mlg_amplified_fix.map 7E706156 126745564 262144 3019766484fe84eb6195ea12574d8027a7c6117b halonet:m_mlg_amplified_fix.zip +m_outbound_h1.5_rc3.map 99A29106 14951944 262144 4375ef2b9eccc109c2a87a34a21b0f81c95fb697 halonet:m_outbound_h1.5_rc3.zip +Machinima_Bloodgulch.map 2CA18C43 100661284 262144 fb6a4727dc4e6d2f0909de86b5ecb13dddb1e3fb halomaps:4517 +mad_canyon_beta_v1.map 280050B7 12938400 262144 20c6962571ed3759932b26afd94ca624d94cb68b halomaps:4252 +mad_canyon_beta_v2.map 68604A46 20955316 262144 8f8056c44afb27fd11d305002b454127610a184f halomaps:4253 +mad_scientist.map C26D5BB1 16138088 262144 11bbc9367bf54a1fe367bb55c3bc3737bdfee518 halomaps:252 +MadHouseXL.map EE7FA9C8 13127608 262144 1cd050feecfb17ba55f23bbacd739263f58d5d3b halomaps:254 +Madmod.map 74648966 41788752 262144 7185b2c750935a9c2eb787b227148558c0768fb1 halomaps:2242 +madnessp1.map F812F7D1 90169198 262144 878c3e234c9f81933eca94f88e6118d190fa556d halomaps:2008 +madnessp2.map 090AD3F4 84046205 262144 a08017c8d12a047642281f8d2ec0cced4707eea4 halomaps:2033 +madnessp3.map 84A36C96 103237264 262144 bf9585991cbf4e935959cfb1199c2dc119823fbb halomaps:2068 +madnessp4.map 96E288DB 100434303 262144 1eef956f4d32d1d59dc3edf6eaf33a5485e88afc halomaps:2172 +madnessp5.map 06655A17 91279593 262144 f0f7338ef66fea06d01a00c94764976a10092503 halomaps:2272 +madnessp6.map 0EB227EA 91422281 262144 0a68b2f8368553288d4b494e01c6bd16820515df halomaps:2558 +maga.map 252EED6B 28785143 262144 78b70915f0767dcc6699ac8c60cbd0123c00ed38 halomaps:6838 +magical_torus.map B3DEE66C 12225136 262144 410d429772936a6164d10e8c1b105ff2edea04be halomaps:5104 +magnum_test.map 224F013F 61765688 262144 c1d2ee3b6ce520d77d971554e45e4c0040976b75 halomaps:6972 +magnun.map 591F338A 16933798 262144 a9160decfa0e9bb2ebe56d547a0d0032f7f8b1ec halomaps:6703 +magnus_trucido_ai.map F91C956F 20426429 262144 8e8087ac8b5820890e2c8a0a9f966267d3ccc15a halomaps:2321 +Majeek-Island-BETA.map 42499DAC 26171712 262144 849b079ef82fd604e6b3f5d0c726029ae37e568c halomaps:3259 +MajeekV1.map 0C8B1F6D 42619520 262144 b95993ae318e85052c0d935c78f4d3331059643a halomaps:2691 +Majestic.map C056F2B2 16546484 262144 01428615d416eba790b457463303c30aa48ddd75 halomaps:1296 +Majoras Mask.map 939EB752 44687612 262144 a90b7cfa3d3b0333b75ebec154976baa676c9916 halonet:Majoras Mask.zip +maldey.map 409C0A7B 79158481 262144 395d4a481376a23991f57551036831f978353ade halomaps:5173 +malia.map 9E788428 39510279 262144 00dbf7ea072e1d998cf1cfc6f88a111361c1b1a2 halomaps:3792 +mania.map FE948945 31071629 262144 257dde55beb010424591b2f6a9a4975e144df26a halomaps:3360 +maniaccreek.map BCDD8199 380910082 262144 d2a4f8d5c7774b9ae72fdb5933abdf19f9c622ef halonet:maniaccreek.zip +maniaccreek2.map 97EE11ED 361199183 262144 57d1d4dce0a9bc413d7a4b7f67068b1da3ef55e5 halonet:maniaccreek2.zip +maniacgulchV2.map 6827834E 53767123 262144 2cb11ca9b2d20316d1a424432c4dcc6e710bea6b halomaps:2671 +maniagulch.map B4922E63 71771770 262144 59d2262d7f563a78aebfdfe196514415067ebf3b halomaps:2637 +mansion.map 14555EEF 67664394 262144 78d36dd41567a245c12f372c5f40078cef236c5a halonet:mansion.zip +map.map 123D8E95 12879932 262144 6f671eaa8a1a64b02d9c1adbd2a27ca2ad7f649d halomaps:1684 +map_room.map 1AE8A98C 92808811 262144 e58f24e9a95fc8a6b5cb369336110a696049b561 halomaps:4265 +mapa001.map EB34E73A 62476017 262144 dd384b56ff8719929ae401c7696f325e1b3f955e halomaps:6064 +mapCE.map DBDE9E1C 57145459 262144 00b1145ed9d8961d0f297ddf27c4f3c1a023c59b halomaps:4496 +mapenjoi.map 795B7BCE 13679456 262144 47f1caab77b4ee63888a3fcd61680ff350b0e5a3 halomaps:2692 +March.map 2E074AF4 14790673 262144 9f2d9341f2ef0ad60fbf6fa364ec594fa1001c09 halomaps:1301 +maridia.map C30D09E0 58950356 262144 6c1cb53329b96d2ebd32800e424ab1c9c0b4bb47 halonet:maridia.zip +Maridia_Public_Beta.map B93098F5 52993589 262144 a5b7cca7b8d4058170998ce610054af68b7406c7 halomaps:4869 +marin_infeccion.map 112FA735 241636322 262144 982319f326b2d84785401a3eccb2ff92e6160866 halonet:marin_infeccion.zip +Marine's_Territory.map BCC8A7E3 51592654 262144 f4d1aae182da250e652dd75c6ebc566c14bf5f0a halomaps:2438 +Marine-color-war.map 5E92AEC1 81652874 262144 dd256b61f5309a582e41f37e0f820a02710671bc halomaps:6247 +marine-covie_fight.map 56E50414 115374259 262144 9f1d554bdf0b8ccbe2b6920d9faf53f35f23e683 halomaps:5408 +Marine-Red-VS-Blue.map CB16C0DC 57450225 262144 89515fbb5b2facfe7e1eda8bc5a27fc30fca9acc halomaps:6252 +marine.map EE4A5866 56449301 262144 316a0024ebb65f9cce66958a1fc03677378a36db halomaps:5298 +Marine_assault.map D956BC24 53149517 262144 6df989a330080efb6488637de723aa0f3fc45df5 halomaps:4601 +Marine_assault_v2.map 66C0C498 64947905 262144 3395b400e9cc6f23bab618210ea9ff6c3329a883 halomaps:4602 +marine_vs_marine.map CA6A5842 50241827 262144 82d7e9bd2330ab3961cd5e01faa0cb024c0018d5 halomaps:4586 +marine_zombie_gulch(beta).map 217B736C 98251233 262144 5d585140d4e0af479ab0777db268edfd3875090e halomaps:4971 +marines_vs_covenant.map 14CFAEB6 67939061 262144 e6432f25e737a1e7693004a756f92d1d4f0be30b halomaps:6302 +MarinesvsCovenant.map 19F61F57 343017619 262144 22f07eb471ede6e3f8f3cfc57d4c60b27a05126b halonet:MarinesvsCovenant.zip +marinewinder.map E30EB56F 50496920 262144 ebbf5215b0b39a8cc4e54f5f339eef48477f51a9 halonet:marinewinder.zip +mario.map 96FEAEBA 15804352 262144 b237fb4f86dc0af1568ff7ede2e8c86eeb721a6f halomaps:443 +mario64.map CF3B53C0 14220740 262144 111ea974a17b8a2b3039e12cd913ef2bc7b82f6f halomaps:3384 +mark_of_shame.map DCA18B00 27565493 262144 b56ecf84de9ac8df2e7db972facd93f96d21069f halomaps:3965 +mars.map 910CEFFC 16870120 262144 f5cfa987833bf345b2c2a3da1338ca78bef3c82c halomaps:433 +MASK.map 8E7CA49F 34939617 262144 c9ba16637f1184f560499e05fd9b6bae9c87f483 halomaps:1475 +MASK_INSANE.map 5FB447F1 68876259 262144 531e85e7d368c2c2c837ffb0f108682eb5d834f7 halomaps:3764 +masked_mud.map AF8E2552 15893968 262144 8a5ea223a0b45759fb631069a5458caa24eca338 halomaps:2992 +Mass-Effect-Gulch.map BD63141C 94259545 262144 506bf1b9cbc70331321defc6939e62a55c94e44b halonet:Mass-Effect-Gulch.zip +Mass-Effect-House.map 95AB78A3 64500094 262144 979ecca8836eb1840192a718ddba3e3ffaeb9ba8 halonet:Mass-Effect-House.zip +mass.map FAC863AF 40974041 262144 4522605e6fd58bcab79e47b57e825dd8bd321eba halomaps:1133 +massacre.map A7606116 14519936 262144 f7d8666b27ea50d686b2011a3119e1c8aef519bf halomaps:4158 +Massacre_Mountain_Race.map FB409E89 22732690 262144 024e05f8d4f6278bf9aa77547d6db7972facc2f1 halomaps:4444 +massRVB1.map 278C34CA 89190285 262144 4eb22083536c7e00588a95c26a6ff49d18b4b422 halomaps:5540 +MassRVB2.map 3E05411A 90425481 262144 394560e05b08213568ec940ff792462d26e7b44e halomaps:5706 +Matadero.map 2F891B71 369112955 262144 6e71711e212a788ded23f698ba268c4ee3d5dce2 halonet:Matadero.zip +matrixcreek.map 07B3876A 13097000 262144 2d02813a3da1a0e62838c82ca233e275e393554e halomaps:1006 +matrixcreek_reloaded.map 07B3876A 13097000 262144 42e086d9320ee5f20ff40299cf0b0966faa2b194 halomaps:1018 +mausoleo.map 5E8E7C49 21940228 262144 bf274cc446306f32461b7f524eab2a630433b31f halomaps:3551 +mausoleum.map B580DA90 29157326 262144 2da78bd46a569d2877ade4366b26d73b819c78b5 halomaps:5426 +mavrick.map 450D6722 13462336 262144 403d07bfb63070cc02ba78b0efbc14c5d150f40d halomaps:1934 +maw.map F6148A6C 71351523 262144 9d31e1b04381e9001aa41e06647752a68e67b11d halomaps:3341 +mawrun.map 2043B24E 131056630 262144 da08467a530262d6e88e5a3360af49f9f6b2cb89 halomaps:3616 +mayan-forest.map D08AB15F 24736116 262144 1edbb15533fb6343b0867531223a372373884cf1 halomaps:3793 +mayan-temple.map 5A72B30F 20708488 262144 d63ab5ea676d93a8e5670e3d1b1dbea10f3a22a0 halomaps:2069 +Mayan_Sacrifice.map 3E1111EF 26350536 262144 48b5e51619c975d809e6ed187f1966e189e64eba halomaps:2721 +mayan_temple_beta_1.map 5B100678 21921224 262144 493442625c9ad6fa3260c7d6702b32ad3dbaf2a7 halomaps:408 +Maze.map D89ECAC7 12398724 262144 68e75ec631528b7bd71a15ef5f54d39e8ed5f98b halomaps:5928 +mba_canyon.map 148A26E8 45194586 262144 70a86fade60c7c91552b552c8090e1dc500a483d halomaps:3126 +measure_me.map 3AFF1961 26022085 262144 71505ea548dcd31b98dc079f22848d6a1f200c8f halomaps:6457 +meatlocker.map 20C8C071 13229000 262144 83e2a088a6236ef219e0311755ce1dff7c8991e7 halomaps:255 +MeatLocker_Race.map 79DC52F9 14929488 262144 28a0567887f7fceb0a919668b7544fabc651c4f2 halomaps:2414 +mech_gulch.map BB382B92 17323736 262144 16d7bd13dffe619468879f0e863d9004abf7cd48 halomaps:3208 +Medical Block.map 84257719 44353033 262144 e1eaf7e941b6586aea8784b4e3a3adcce1ac5709 halomaps:6179 +mega_zork.map EA79FC14 217702346 262144 01f4e254b94ddea965c8af0eb1571779317cb0cb halomaps:6593 +megadoomer.map 6A44AA37 15257052 262144 1b5119a5c6d04ed9ef5b8df4873490910f48c42b halomaps:387 +megastunt.map 72169ECA 19268840 262144 e00c1b8c5e2a7c1cbdc1f591b0828492026db0c7 halomaps:1811 +megondoombox.map D3EF88EF 12709378 262144 b8fc8bad1666c1508b0cf5a5f0462ff2da9e2404 halomaps:6023 +meh.map 0C98791C 27120613 262144 c0ab73d822d74891d21406d45b443f55f6779de4 halomaps:2009 +meincrapv0,4.map 4EE5F4F6 28624235 262144 ee8ccbe6a722eb25ec2ca7e5e875bf290685d35b halonet:meincrapv0,4.zip +melee.beta.map DA66AA37 14957956 262144 c35b23cbe4fd83f255f382c048ddd1b52c2f6eab halomaps:473 +melee_mania.map 1D1AB4FF 24387333 262144 4642dd90ec30c1d3509a2a9c383d07264fb66895 halomaps:3260 +memory.map EDEBF2F8 21962766 262144 910bc555f7f0822efc67c4c9f4ed2be5f16c0c2d halomaps:4719 +Memory_Alpha_pb1.map 00000000 258911428 262144 59b990b518ea990d34e2bad4727b9427662c71c9 halonet:Memory_Alpha_pb1.zip +MercenaryGulch.map CB5FF112 46307764 262144 1e94f97ec2fe5b9d3c319392e43921b35594489e halomaps:4843 +mercury_falling.map E8076789 68761121 262144 f60dd1d151ad258c89208fa36ddc7dfed1080ef3 halomaps:6216 +mercury_falling_3.map 00000000 326841632 262144 98bb0057565e2c73d24b89cbed7c864b839847e2 halonet:mercury_falling_3.zip +mercy_is_a_problem.map E2279F21 20387524 262144 1639d2a95062cc04751964042221149c464b44dc halomaps:3125 +merkfalls.map E96E0A06 28385840 262144 c86edbf9ae8274328b4b0e801d3952c230a02dec halomaps:321 +mermaids_plaza.map 50C34AA9 81399050 262144 a9e4a933a2d3b436844d621e43b2534e64aa6b5d halomaps:5899 +Merry_Xmas_Halo.map D979EF51 35473544 262144 2d73c40139ab3e0cf9e19b930a4f4046dd4d2174 halonet:Merry_Xmas_Halo.zip +mess_armageddon.map 15ABC152 56099747 262144 f34ac0a8ce507b619a6e33e2dbd351c930fb61f5 halomaps:6428 +metabox.map 478AF5FE 12589328 262144 14a98ed0bcf37d726dd075a4ca071b1528b04c40 halomaps:4095 +metalharbor_beta.map E6FBD13C 13246992 262144 2c28218bd8d4547553211025c1757f6ea34e1e5f halomaps:1812 +metalicarena.map E0B237DA 15001620 262144 058538b497334e0291911d11bfae41c20ea80504 halomaps:928 +metalicism-x97.map DF65B48E 20132523 262144 20d10ec5f3a459ab7251145c3925eab338114de5 halomaps:1086 +meteorgulch.map 25F813B8 20662250 262144 ce18117ae482d9a27a185c6b9f91ecdfcb734271 halomaps:2322 +metrobyte.map AD15BF71 198181396 262144 93e15f4091d6e25a86c982c5bcd7e7e164f92b3e halonet:metrobyte.zip +metroid-processing-plant.map C529E508 58194084 262144 8b7ad3ffbb972bdd17cf258a91f0a77b3341d09c halomaps:4121 +metroid_invaders.map 9D3A427B 41979544 262144 d433ffca651515ab264c8b426cae6930a11852ea halomaps:3879 +Metropoli_Assault.map 1A28B674 250685384 262144 351087b0f55cf81ddca92a3a54bad0306957991b halomaps:5409 +metropolis.map 55F8D86F 13258880 262144 01c712fdc8259c2e14b24bf7eaed3f81bb69a3d6 halomaps:870 +Mexico_Deathisland.map 95D6F022 50994267 262144 df81ff4b5a287a9dbcf87b2e9001a7899cdde20c halomaps:5689 +Mezmoriced.map C1944313 64164582 262144 66c4b947c5a955a50c0073635e4d8dee20607daa halomaps:1970 +mgulch.map 2FB19FB5 55753831 262144 5b120dfbfdc88355827190717c378c4693b63651 halomaps:3071 +miasma.map 0E33353C 127900795 262144 7c325873560d50ac22a84f7f5f5f6752d8bdc524 halomaps:7009 +miasma2.0.map ABA84A4F 111318323 262144 928ec63b87432d5e90e4efd0529c52e0d73bc6f4 halonet:miasma2.0.zip +miasma2.8.map 45C22F24 115644510 262144 23921e977c02b9984e676b7643716caa8e6e977a halonet:miasma2.8.zip +miasmapb0.9.map 14360AC4 96885602 262144 b7ab17ef3549c0c82da97ba4c26d3f8058cfa256 halonet:miasmapb0.9.zip +midas.map 5E36F254 17234284 262144 1cd7bdb455eb459f62124bcb0717c958dc9251c9 halomaps:3050 +midevil_arena.map 03E83EBA 19778612 262144 163d8788bfe5d1b407120239fc249793e66bf4ba halomaps:927 +MidSali.map 71E2B9B9 33787328 262144 a84855e8e93a34d06eee36a3096f6077ffad386f halomaps:5757 +midship.map 38C808AF 18222084 262144 fa254113e28f18eeb85c1ff93a2c7144758d99ca halomaps:4057 +midshipAI.map F269EBE7 58280642 262144 01459995a51e1d944a6773cf002dca2a65a720e9 halomaps:4133 +military-base-alpha.map 160FC059 48893031 262144 d85eeffea4d3aba45ec6d0da9e06f3e7e74ad5ec halomaps:1856 +Minecraft.map 36E93484 293637789 262144 538fa43d9101d0fd59efa4c47cfb531081f031c9 halonet:Minecraft.zip +mines.map 1D589247 16684544 262144 46c8ae325d1f3d685990c5916a472948bb88883f halomaps:1297 +mini_guerra.map 4483A0FA 93238759 262144 f0f4326692d4c5f3bf2434058fc2b95d29145472 halomaps:6065 +miniforest.map 52532100 73620846 262144 c542cb88af3920feb1b8eb92da7a91211317414e halomaps:3731 +Miniguns Damnation.map 0FBA059D 14006880 262144 beca795ad746c4ce5a7c68ed4d70e7d5c2928960 halomaps:6556 +ministunt.map 3D4100C9 27035920 262144 7b4e31e93b0939344e009375eef12c959d9a1f4c halomaps:746 +minizone.map DFB6493B 14207420 262144 148c9dc74bfd38dba8667c26e2c07de77db99e94 halomaps:5007 +Mirror.map 436F2A44 18441245 262144 234b7d4678b0bae781366d9dddd82259e1db1de8 halomaps:6009 +mission.map 8579902E 15252293 262144 13de85952c3545b45126af8ae59e9b471f2fa6bb halomaps:925 +mission1.map 7CA936F0 112838688 262144 60d05012196f635b7dc234772931b0416162d1dc halomaps:5532 +mission_battlecreek_beta1.map D05CEBD1 86604947 262144 04511983fb491b4f363b7d7c47b3507c9578eb44 halomaps:3941 +mission_beavercreek.map C8CCA670 118000627 262144 193a467a4fb60c7490ec82a224a1ca5d57c12cf7 halomaps:4123 +mission_rio_beta.map 653C2CBE 67481574 262144 f2ac06cd4f5c18e2cd4c966be462c7fd1cea45a0 halomaps:4336 +mistylagoon.map CB56D5B3 12663364 262144 34598365670e6677f82d0bd4b6d38d087b382d28 halomaps:256 +mitut1.map ED44E52B 12256444 262144 428b5195d60b4a522fff2c47d8c726e56a91e8d3 halomaps:373 +mlg_amplified_kadem_mod.map 572BE5AD 55355015 262144 968bc8fda86af6b91817a9535c4f60217f90c43b halonet:mlg_amplified_kadem_mod.zip +mlgwizard.map 36AD3E67 16455976 262144 bde1cee643c6a49c902758d669b09e864a546dc5 halonet:mlgwizard.zip +MMT.map 4CC0C146 13891744 262144 1c7e977f60ac7aa1d961f208f6407d72b850d2a9 halomaps:1497 +mmt_sandtrap.map 314DABD1 51603327 262144 53d9f7cc6ee261e42f933aaf44c87031aef51077 halomaps:4343 +MNL_bloodgulch.map AF1915BB 46554426 262144 ce184ced916d0b4d5e39c7ec4b0e166976bf7a29 halomaps:5610 +MoD's_boardingaction.map 989F3BE0 90026060 262144 58ec3c3b4e87d3ed115ad41214bd1ae36a216d56 halomaps:4913 +mod_pistol.map 695DDE84 190697830 262144 09ceeaa82992295394e997609dad49605a464540 halonet:mod_pistol.zip +Modbloodgluch.map 130F5BAB 16468057 262144 2d7ea191d56dbd6c591bd94d9d8cdd7a1134dcd2 halomaps:4940 +Modded Deathisland Me Beta.map C3B30FDE 132427845 262144 490916c78ea02c05fbd421798ef85b290a9d4301 halomaps:2957 +modern_cov_invasion.map F01CAD80 95506648 262144 8a3f4823ae87c590b475ea043175e3a9fe54b6b9 halomaps:5488 +modern_cov_invasion_no_ai.map 22EA36C1 51596829 262144 43d9ce0c580174546b60e2b3c783f4df563cac85 halonet:modern_cov_invasion_no_ai.zip +modern_warfareV2.map BB6136E0 67297659 262144 3c3c1b92004b74bc42597291d29f03e980409578 halomaps:4122 +modern_warfareV3_the_outbrack.map A00598BD 98603080 262144 9339aff9c9d86fe91c38d416dc6d9a5e10399f9e halomaps:4767 +modservatory.map 8440E901 44005301 262144 980477a16191f1f4e5461c9f1611a9c37afd3c6e halomaps:4199 +Modwinder.map A35AB192 16834804 262144 f2577b105d85bdb87568f902358e0fe7300fc037 halomaps:3320 +moksha.map 4C35EB48 18213632 262144 3dd34129610bf26d44682617bcd00d2b12823bff halomaps:1598 +molag.map 72561C80 19023788 262144 7a5a7ae445e108a13270ee25ba5f377970c8374a halomaps:2306 +Mombasa.map BDC5BFCA 400144531 524288 f230f2ae5d59c4436eb47d6ba484996c1df6c998 halonet:Mombasa.zip +mombasa_aiv2.map 95D8A51A 363979982 262144 82308c357495d621a8107e26334340e624f0becc halomaps:6902 +Mombasa_Race.map 8E0AF69E 44692609 262144 c4382fef80d61687155c4c36aeeb71371993b18f halomaps:4290 +Mombassa-Cops-and-civs-version2.map CAFAFA15 117293910 262144 d80a27a049e70b3ad4bc5accee13a6930355e78f halomaps:4557 +mombassa_cops_n_civs.map 117111FD 110905389 262144 6d7cd7f9897cd9555c0f9fd66ead08f9104a0813 halomaps:3646 +mombassa_cops_n_civs_v3.map 221D64DF 175415306 262144 f68803e6c4959786c92f6edcb96f7e77899e2f86 halomaps:4941 +mombassa_rp_v3.map 91BBC99F 132450148 262144 a64b0daf3ed1400f54036380a462afb429ddffd9 halomaps:5247 +mombassa_Rp_V4Mod.map EE87FF3C 125915989 262144 0d767b7fc7c4cf8fc3d72cfa8f32411f583d7e07 halomaps:6536 +momodgulchbeta1(redone).map DE9D4095 41583434 262144 a21eeddfe6123912f9b04313d727d980736bcdfb halomaps:4871 +momodgulchbeta2.map 4B24CE1C 50705402 262144 958bc83017829753c202d8ebb8bb783a7238dbbb halomaps:4972 +Mongoose_Point.map D3AC367A 55509181 262144 93e832019dfd088621eaa2e685b5ea3e2788b64f halomaps:5064 +mongooseheaven.map 0A31CD27 13118692 262144 4be15a22e3ee18cc260beae7ce964f2bfc680629 halomaps:3443 +monkeyrap.map 1681AC37 76625825 262144 9c536d15b0d110763291c660a04d47d489fdedc6 halomaps:1710 +monolith.map 386278DA 13575384 262144 65a22edc4581c40112036d403127b17797fcb0f3 halomaps:6903 +monster_jam.map 7210D286 23255217 262144 f956f47c9d387f4a73ae064d84e977774235cdef halomaps:4200 +mont_st_michel.map 83A0A5E1 31440606 262144 72e8442cbd68224ce42d37488046b5d5a126864d halomaps:3124 +moodbkwds.map B712CED9 22725100 262144 23b303708a8d27fb6cd9c90bbcb01a6bc52a1545 halomaps:5467 +moon.map C00F9C08 13605204 262144 2ef52734b0f5ed2c621904879c6e120d7fe2c7f0 halomaps:257 +mooncrater1.0b.map C1044A9D 18502860 262144 695ed1a08c3e3cdc21852e8fe34487415f0c9f4e halomaps:3432 +mopup.map 51C80B53 49217405 262144 0a4b3d94321a46dfa38a9802a393178cdf328f5d halomaps:5357 +morbuto.map CAB55DC4 72739611 262144 1bb7925db1d681613de44892cb29b34564cc9ded halomaps:6839 +mort_agr_ble.map D811F360 46068857 262144 ad3e9a7e5a085874d516800508a238ddd0f8cd4c halonet:mort_agr_ble.zip +mort_agréable.map D811F360 46068857 262144 65e4699a757e25aaae23c836c1b51f2ba49a003e halomaps:3123 +MortalKombat.map 30EA273B 107669438 262144 52746dc1a2c433938f27e5d1a82d3279a75c96e0 halomaps:6594 +mossgulch.map 92BA7091 43588893 262144 d41f2d907f00b5b5707ad92255566be6edaddc16 halomaps:4033 +motor_head.map 1982CAD1 15290648 262144 36a39bd3584f6a3039c6fab201541bbf3ff96372 halonet:motor_head.zip +mount_retsinis.map AFEBED54 51965769 262144 ad9ca8e93579dd3b6841f202e5e56d142f304f54 halomaps:3051 +mountain top fixed.map 9C09B9C4 46059601 262144 12870f4a39e8eb88b8963be8e49ef271c1810f05 halomaps:1460 +mountain top.map FC58138B 51493409 262144 a3971cea101b2a96b66d47c752201cb64c8d07d4 halomaps:1420 +mountain_king.map B280C002 47310443 262144 9f1d1df4b4fbc904fc9c314b113302ddf8c44b64 halomaps:3342 +mountaingulch.map 49327690 23997325 262144 51595a0892e7aba5b86b2ad51d1d0aacbc8fa90d halomaps:1637 +mountainisland.map 8DF2C3B8 13580206 262144 f9d1631cbc7f2d12cbf495e131f885c630dfb90a halomaps:258 +MountainKingdom.map 72CBBE5F 13351628 262144 c5f3c3a21116820894d2879c7f59a50b465cbbe0 halomaps:4219 +mountains.map 662CBA88 27611108 262144 e758a2d74ce4fa9d38ac85d5713a3928076ed54e halomaps:3552 +Mourn_the_Dead.map 09CCA7F4 387165579 262144 2c39be278094966265d0c1ff880edb4e4a9acdd7 halonet:Mourn_the_Dead.zip +moutain_cliff.map BE51C150 16510960 262144 77dae5f725466dc1358375f4fe2984582646e7a3 halomaps:3445 +movieset1.map CEA36F30 117556013 262144 5992f9dc40b7132f8c0779414c31d1d873ecc12c halomaps:3343 +movieset2.map CF6F9B14 118845049 262144 75f06c29d9f73d758fce148458f0c47503c4d4a9 halomaps:3472 +mp.map E5578419 14198432 262144 7093c107498e0c6bf6b24c36df992437ac979974 halomaps:6537 +mp_aotcr_b.map 3C15D973 18836201 262144 723005b84c73565e27a15daaed9b4cc6ac547d73 halomaps:259 +mp_secret_mision_1.map D3792681 111241368 262144 c6cadf57807440fa2266b3a391f501898c4481a5 halomaps:5867 +Mt. Egnever.map 7D5DB3A4 18360032 262144 c9b564f1fd35e9c82ae2dccc5cea07bf02a1d38c halomaps:2530 +MT_cereal_bowl.map 259EA970 24743947 262144 7912fc6435097897cde919c19d04e4a67ba2ee64 halomaps:2285 +mt_dementia.map A205ADD5 20951979 262144 44aba605d11e9b6b712fe2454a82f55ae98a262f halomaps:260 +mta5_bowling.map 52D7D02C 65003582 262144 1856fd1317ef6df41b7a0c79fe318a22425861b7 halomaps:6538 +MtEgnever.map 7D5DB3A4 18360032 262144 eaeecb82239b375717c696a930199154444a8c5f halonet:MtEgnever.zip +mtm_emile.map 86819541 138847457 262144 fbe0d621dd92312e54dacc39a3df8ceca877d1ee halomaps:6198 +mtm_mario_bros.map 3EE224FC 62726474 262144 abb945b0006d662daf419a58e35282d46dac4703 halomaps:6150 +mtm_paradise.map B42905C4 114136253 262144 25e1df985537262b527fdc62ca8808691e69cfc7 halomaps:6049 +mtm_reach_hangemhigh.map B1B6408F 129237188 262144 02409b021095fee3eb4686416577ab47b44f33ed halomaps:6066 +mtm_reach_hangemhigh_v2.map D571427F 141602445 262144 87303dee699ef82197f99e48487aa3ff4bdd6aa8 halomaps:6199 +mtm_rock.map 020C998B 112510117 262144 011ec9ab296331a7f96396d104c7faf3f65f015d halomaps:6050 +mtm_silent_hill.map FD197D41 160498085 262144 d52c1bffd748f21ce23ce3b0853cf29d42c3449a halomaps:6217 +mud_skirmish.map 911C766B 187569298 262144 b2b1dc4417dd0e1fe0be3197547ca6d442fd06b0 halomaps:4903 +mudgorge.map 7E706156 38991596 262144 a3badd4976c9a8aa01c2ec5a1d980274f8b803d6 halonet:mudgorge.zip +mudhole.map 09D7A304 21161301 262144 3e19c58dd99d240ccda7abf8e8d1a8cbe0fba686 halomaps:7070 +mudslide_ai.map 87F99439 84923442 262144 8d589f34adc19770be9bf68618ceb4e533fcb803 halomaps:5786 +mudslide_INSANE.map 3BBDA550 81841705 262144 5b0f180529f6def2175b88b8fb57d15585bbff97 halomaps:3661 +mudslide_INSANE_fixed.map F055A72E 89679807 262144 7f5ad2fbf5f3010cf147c82b23af366a2ce5ecce halonet:mudslide_INSANE_fixed.zip +mudslide_INSANE_v2.map F055A72E 89679807 262144 c304c2b9fb0c4d6a0ec222df238a9a701274d793 halonet:mudslide_INSANE_v2.zip +mudslide_INTENSE.map 10DE3FA9 99017823 262144 06664f53cf2c82bfbda6c08b7032f638131c616d halonet:mudslide_INTENSE.zip +Mudwinder.map 7D01B837 29344781 262144 29ad3364112e27ba7d2b574f6e0137d6b0667bec halomaps:5065 +mugglegulch.map 7B309554 13936092 262144 ee41496bc3964941c360200aa3407fd6aa474a37 halomaps:5129 +mulgore.map A7EB60BA 13208316 262144 47befafdb6f1722c4c0d40f17714ea6f6226b0f7 halomaps:4603 +Multiplex.map EC3479FD 14007628 262144 6f4352265024e85da9ed2d058eeb3403b37a6180 halomaps:527 +municipality.map 402D5CB0 32477596 262144 96b3dd7d91ec679cb02e53d18a577c18e9583d38 halomaps:1700 +murena.map CBD3CA5F 27383149 262144 0fe3a7c36276e0d2581cdbce408b8969874cfdc6 halomaps:6067 +mus__sexe.map 10976F8F 49744133 262144 f19a8fde9c0ac5913083e60978e648c3c00c246b halonet:mus__sexe.zip +museum_beta.map D7830F57 13029340 262144 6253d5cb50ec570dd04bf66cb64fb4b76d7ff950 halomaps:1813 +musée_sexe.map 10976F8F 49744133 262144 5f030a0a1769f90d44cafb6ae52a1b143d714d43 halomaps:3186 +Mutations.map C30084AD 155854523 262144 38f1120dc96af46ad2cd206c9f97c5f8ea562d16 halonet:Mutations.zip +mute_city.map 2B59DF3E 34608196 262144 d5c3abca9c5ec111973876f4b57e3582d4b27619 halomaps:5468 +mute_city_beta_2.map AEE8E01E 36330428 262144 038066bda666055e4e757c9cb4522ee1e73a3558 halomaps:5504 +MW2B_Warlock_BETA3_PUBLIC.map 2DD950FD 85048176 262144 14892fd713e24db3a6ff6646d3c99b81cb34ef4e halomaps:4220 +mx.vs.us.snow.gulch.map 00000000 126561189 262144 5de79e0a2b1271cca1815eca1172249ad441fe28 halonet:mx.vs.us.snow.gulch.zip +My House Is Bugged.map 4F63686E 343684360 262144 0e80acad4847d937601a2720fb8c97683e08d1f6 halonet:My House Is Bugged.zip +my.map 7465B68F 13896072 262144 b937d6bacdb0a121ea2f3bc3ddd9dcc90cf3deb9 halomaps:1087 +My_Big_ASS.map EF30A8B8 222474540 262144 875b607d5838e5c57dbae36f508860737cfdef91 halonet:My_Big_ASS.zip +Mystic.map 63DDCC61 67961704 262144 a88b1520403500ac9f6d304278203034e76353d6 halomaps:2192 +mystic_classic.map 8C9C9E4C 38314996 262144 5d4fc460d1468264cbf64310ebac1c82ea47c084 halomaps:2195 +mystic_mod.map 0001BB29 41687720 262144 047d22a988e449d55811eeb90642428ec0397088 halomaps:2819 +Mystic_Revival.map 434A7748 142759017 262144 e086e6a348b3aa372208e08c8336cfead8c4faea halonet:Mystic_Revival.zip +Mysticruins_beta.map E9D5ACA3 24925968 262144 00a76e09172ee061fc41136b836be020b898db47 halomaps:1551 +mythic beta.map CE3BA598 28855372 262144 fded14c61e25610847599e33097bebfe622ae822 halomaps:6151 +myzanzibar.map F55EDE2F 97050437 262144 4567124c518805297c09006edfd61c986657dcda halomaps:3261 +n25.map 78A35FF0 74843205 262144 b43d7b56706335973e80b0a47ce2c5c1102c4c9f halonet:n25.zip +n35v.map 1CF8C923 267176461 262144 4566cdb117d053cba3baba6db1ee189bf3ec0bc5 halonet:n35v.zip +N40.map 08654880 165001220 262144 f717965b283f0833413c1e34ab7e003dacf6fdef halonet:N40.zip +nabane.map 567C344A 15028852 262144 2cfb466ab9e08e5d0c9178ebe80a47f9a5cecd18 halomaps:307 +nabane2.map 39A83DD7 33778033 262144 b7c7e0672dc2101368073b7045104c3af8b5de00 halomaps:498 +nadewars.map 38FDF72F 18475407 262144 04c54ae719628310c2ad23b644bb5140a89b4a79 halomaps:4844 +nadewars2_unleashed.map 20A56AE9 35946359 262144 45465e22285e47b501ebfc40e63d3fed74d276be halomaps:5427 +nadir.map E1950BA4 73260036 262144 88cbdb859eb9a3fea019eee13c90bc36672cb0b8 halomaps:4690 +Naked_Blood.map 8755E26E 125219860 262144 c3b892b9921fa8747c694acc7e74353a8bbcc47f halonet:Naked_Blood.zip +naked_bloodgulch.map 5EA3D576 206205077 262144 c3f5d3910caa6e58bc117f937634242d2a31027d halonet:naked_bloodgulch.zip +naked_icefields.map 954D8AE1 76680511 262144 9745ac9a4698f06bb0062702cd5e4556106bc622 halonet:naked_icefields.zip +naked_insomnia.map 00000000 187630292 262144 c32a0b0335082a08dcd4197224aaf5cef67bebbf halonet:naked_insomnia.zip +naked_obsession.map DED81E94 111354451 262144 6569b3bfd6c86dc87a5a3525022a5800c2b9a8f6 halonet:naked_obsession.zip +naked_presidio_mod_05.map 00000000 230332041 262144 f94251f6626d5deed4164957a2afcb2a8b557382 halonet:naked_presidio_mod_05.zip +naked_sidewinder.map 5618A0E5 14852232 262144 fb0f69d037f3642e8118c3b647ed9a750bbf0d67 halonet:naked_sidewinder.zip +napalm.map 0402A348 96386000 262144 7ce46125cc453ef4bddde38a3660989375ba1156 halomaps:4311 +narow.map AC08CAC7 338630878 262144 3f713609fe6678480e5d4029793e2b7a1fbff51d halonet:narow.zip +nascaar.map E423E1B6 20577356 262144 8c768713882be0667d0c5aa62077907b2a414b71 halomaps:1260 +nationalpark.map 72FB73F0 25674390 262144 c05ee0da30a0ed3eb3de535b400e5bd43230a577 halomaps:3647 +naval.map 85679296 22321767 262144 9b88b8303b173266c9f6419b97405ef7972723b5 halomaps:3385 +navidad-grunt.map C384EAD1 84702955 262144 0a8a20253dec74e5978aa064a7015b78dde55fa4 halonet:navidad-grunt.zip +Navy's_playground.map 8D7AF9D7 40908534 262144 db34201cdf386355abf9adb38398bdf2e6eaaae1 halomaps:4622 +Navys_Revival.map 1A3719AF 46399632 262144 dfd0237db83b85143385bf57dd67d433d8cf704c halomaps:5008 +naz_gulch.map 8D841307 56043146 262144 86bf1e1f1eece7cc117f0e405069a0c47bb5cca6 halomaps:2638 +Nazi-Boot-Camp.map E08936DB 136731689 262144 188010af79e677e26aaf8957264d9b0e4fe2545a halonet:Nazi-Boot-Camp.zip +Nazi_Hideaway_beta.map 6851044D 65577178 262144 c7fb44a4da6502c39d386681c9e05a6b6e2fa5a5 halomaps:1592 +nb2.map 5AD1A744 17602792 262144 ef0df5a0f589aa4002e2e2f8ed8adfe7b3b84b69 halonet:nb2.zip +ncoliseum.map 3273718F 19942613 262144 cecca022c7efe9c9b01213f06455f817f2588cc6 halomaps:5076 +ndugu.map A4433FF0 16904696 262144 16b8de47ea0dd2635b3e3d98097e55c8d53aef06 halomaps:374 +ndugu_race.map D51DBA39 17296552 262144 f2fdf3c0860ed718c5ef64f1dd3f87a9147664de halonet:ndugu_race.zip +NE_beta1f.map B534C551 40143269 262144 00bb58807fc15a6ba758bd9400643f39143a1589 halomaps:6200 +nebru_a.map 603DCF96 113436527 262144 72f2fe884b9ece68688b1b07188796b99c0e5cc7 halonet:nebru_a.zip +nebulaphobia.map B3B63B22 237488482 262144 ae701d73359d6544d95d0a8c78a5308ccf80b33b halomaps:6706 +needleosity.map A4B5AC5C 16923605 262144 022adf5ad32c90ab1b8a6dd959491aa5334676c7 halomaps:368 +needleriflegulch.map DC9C60E6 17679984 262144 c2dd35acb89f9a579daeecf6b4c2c608d06f5461 halomaps:1244 +nekari.map 22F3986C 14662932 262144 ca5632aca0d7889d5ff5d9de08014b2c7a0162e7 halomaps:1614 +neko-chan-v2.map 8667ED48 207665612 262144 e876f11a80b54d42979fe0b0d38cae5e6979ae95 halonet:neko-chan-v2.zip +Neko-chan-v3-br.map 3C0C2404 232978994 262144 4e1097ec9fafa82cfac07886d2f88404a0b26ec6 halonet:Neko-chan-v3-br.zip +Neko-chan-v3.map 1BADEA50 238655608 262144 07daf14d3d74c46efe3bfa8729bd91ea4c1030c1 halonet:Neko-chan-v3.zip +Neko-chan.map 162EB2CA 144824353 262144 4cca0a83b880023131142ab2e7f7c242632b5d90 halonet:Neko-chan.zip +nemesis.map 59DC539E 15816472 262144 805efac61b47e9e473854b07ebef08d49a145b92 halomaps:1005 +neophobia_beta.map 671B854D 25540508 262144 dcfd672493674ade5e9700a26edd2e1d21a2d49a halonet:neophobia_beta.zip +neophobia_beta2.map C19F0C9A 40931792 262144 f08eafad3bbd2d688e11bab7b650d6a0833107d6 halonet:neophobia_beta2.zip +neophobia_beta3.map DE6D9D9C 28627520 262144 0d773f9939537ee438c580d301376f6fefa392fe halonet:neophobia_beta3.zip +neophobia_beta4.map CBA20FF6 21041412 262144 2ea2a0eb220ca768ecf0d111d868596a36f68fc2 halonet:neophobia_beta4.zip +neophobia_beta5.map C78282B1 21251368 262144 eb8a77a33d4edeb863a43b85f459817f61bf8664 halonet:neophobia_beta5.zip +Nervous_Canyon_Race.map D57B6808 17478692 262144 8ffc0b1147165c59be4d3f38c7466c815472a6ec halomaps:2415 +Nervous_King.map BC4AD8C0 19474586 262144 73f85f58bfac8a0677ad5f53afdfcbab704a40d8 halomaps:2526 +new bloodgulch.map E6F47352 29483004 262144 d28113dd6dcb8f124d93f1b87efd70970cd89c88 halomaps:5166 +new.map 7314CD2F 13903092 262144 fd0502e7237d69552dda82fab7e25f844f3090cd halomaps:5428 +new001.map 01473ABA 19361087 262144 06198a15ac36550b04dfc91e93fce4740a21e6e5 halomaps:1831 +new157.map 4003A8D9 392997682 262144 dce9d37b1595cda21a7fe2e367399567ef5ab9a2 halonet:new157.zip +new211.map DF9EF5F1 402384028 524288 859d959818d01af7e16fa0dede4ac54271fae4b3 halonet:new211.zip +new51.map 45959B6F 401370195 524288 c19217f22d1b3e955359667c4eb5ee5b49b35196 halonet:new51.zip +new56.map F157492B 394199746 524288 45dcca1acaa51f68fe1f6009e5f4348ca3163ca6 halonet:new56.zip +new59.map 69C7C12E 394199645 524288 1faee318e441272fa7c089ea55f4c843060198a0 halonet:new59.zip +new_hallows_eve.map AA6C6519 21008984 262144 233250eb49a02dba224aea9e77806e609b695901 halomaps:2906 +new_map.map F36680DB 75921372 262144 a4def0860cd60418d5a3b54ef737562ae6cc5402 halomaps:4254 +New_Mombasa_Chaos.map EB6249F4 39139092 262144 280891731e1884682fc5763d275e8d8bd36e09ec halomaps:1109 +New_Mombasa_Classic.map EB6249F4 39139092 262144 10a7704774fe01355e759c1044996f2212e5d5ac halomaps:341 +New_Mombasa_H2_v2.map 28F9A2D9 87560155 262144 ea3f658038ef5ce921323db143cb60c1cb2b2781 halomaps:2579 +New_Mombasa_Mod.map EB6249F4 39139092 262144 44593839e683dde0b9f7cfb81f871722de8b246c halomaps:403 +New_Mombasa_odst.map 5AFD6899 133903522 262144 8d4be23939f177a312bb112bbb885588d44dd953 halomaps:4905 +New_Mombasa_Race.map ADECE599 38715480 262144 3bfaa91f1c2e57219f1e5b7d12037ed45977039f halomaps:2044 +New_Mombasa_Race_v2.map 1EF8ACCE 39714856 262144 4f8db66d43a6c307daccdf49263fa5257a0fb837 halomaps:2559 +new_snow.map 9DFB2E8D 71844423 262144 16ad94c4e08436f3e2d1163e867da91a9f3676f4 halomaps:3052 +new_swamps.map 86D76BAD 51108917 262144 c1bb967511cbf7e658466a5ed764ce5701df60c3 halomaps:1752 +new_timberland.map 40FB3988 28956416 262144 04515547f57543394cc9c651daec13f153e74013 halomaps:3585 +newchaosgulch.map 5F7F317A 23915669 262144 9b1cdaca3aa1e1e2fa611a848a286d22e97a5ded halomaps:3553 +newgulch.map E94E3D16 18344632 262144 e92215d55144cc86900124335a71a73de6cbb83b halomaps:3500 +newgulch3.map 1D13BB77 32527025 262144 0c5dd8ba0dbfe81667f799e2dfb6453f900cf539 halomaps:3433 +newgulch4.map D0B00EE6 45001580 262144 d06849a5d8c864a68bf523decfc02f1e9789823c halomaps:3514 +newgulch_4.map 73F110A8 21896683 262144 7bb9cd3a8455e305d03ffd6b9a051b4de759b455 halomaps:3515 +newgulch_5.map 9B1F8FD4 33527977 262144 c126a46368a4dc4027c5e8fa4efc981600ffec17 halomaps:3536 +newgulch_5_nuevo_v2.map DAE13FAC 33260454 262144 4065952a0dc1ba8f093d17e0c0703e874e968005 halonet:newgulch_5_nuevo_v2.zip +newmap.map 9F777ADC 14730344 262144 39f6cbc26441f47c677c989e832d83c412fecfb0 halomaps:864 +newmap2.map 5CC33B1C 27837849 262144 4d873cced72da476af31191ba404d8da4d459d88 halomaps:4330 +newville.map 586FC7E7 107976866 262144 7b35fe8611b56c7430d019cd865a8a67bccb0e43 halomaps:7031 +NGMT.map 1D8B2780 19997348 262144 e6c8509f1fbb0cfe366971199bc8feac33ffb3c9 halomaps:3672 +ngmt_pb2.map 7E06983E 26317436 262144 a505925be32bfb9ca1b0f0b9be173be577a6ec02 halomaps:3711 +nhpgulch.map 65F3045F 18650476 262144 0951d65355a58ba3dda35a73fbfb6c07f5ff3840 halomaps:2537 +nicksalpharp.map DED3B006 129592295 262144 911897f7d8fec799756532312f2a989aa710e8bc halomaps:4984 +nicksalpharpfinal.map 0481890F 132330737 262144 64634a94d3a72724dad2ae3e2fbe9498676d9ce2 halomaps:5289 +nicksalpharpfinalv2.map 911C231C 132268147 262144 1d206cd14d54a281dc244b6d2e5db9d154aa9fb9 halomaps:5411 +nicksalpharpv2.map 4329E8A2 126208168 262144 87cac9499cab1bc4d09b3f57a3dd834af3852272 halomaps:5024 +nicksalpharpv3.map D2D82ABD 128503983 262144 b46d70dc5561d0bad335cb9157140681b49b65c5 halomaps:5096 +nicksalpharpv4pb1.2.map 9E263196 125869703 262144 2519fe4bccba09a77778242355e9887dd00ea461 halomaps:5140 +nicksrpgv1.2.map 5F9EA8D3 69190567 262144 4b15d4402ac569b578d7ee913a2979dd67fc1a49 halomaps:4845 +Nier_Automata.map E5D2AA8A 352999135 262144 4ddb02053d8f4f595e2929ce8319526ca80a2fc1 halonet:Nier_Automata.zip +Nier_Automata_2B.map BB010310 353002683 262144 d2f099eadea42721eeedacc77daa945676a68d79 halonet:Nier_Automata_2B.zip +Night-Coagulation.map DADBA88A 70605484 262144 93f52edbcae6fc31781d06098b770686d2fd2d94 halomaps:3516 +night-gulch_beta.map BB7DEEC2 19838252 262144 c37b59eaa3fb45836662ef1cbee9e56bb7b95e98 halomaps:1165 +Night-lockout.map 21399E7B 72221454 262144 d92b01409b8afce7e21a103c4d3da2377561e960 halomaps:3586 +night-time-motel.map 5CD931D4 43221131 262144 001e4dcb014f7f46e550eac38ebaedf12c2fff95 halomaps:4124 +nightcamp.map 5B1C8915 18875757 262144 270efc1574cdeac2a6c6a5d0a31a848bbd94e660 halomaps:176 +nightcamp_ce.map C66BA8DB 19135889 262144 0fbe91f8320edf19d14d49a70c32eeec92c53692 halomaps:350 +nightglow.map 0589AF4B 19174800 262144 075cfe7a46ebdd65cb2ab6d87ef259774ec7a210 halomaps:2841 +nightglow_v2.map 9AA2DD17 25466908 262144 316805c15dde098ab738baaf3e2855d13e832b96 halonet:nightglow_v2.zip +nightmare_arena.map 54F5567B 49697268 262144 89ed54df611a05b12207629955af6d6b5e98959a halomaps:4568 +nightriders.map 780B1E1B 15614742 262144 19a299baa222c43008c95e690355a519e0c497d9 halomaps:5113 +nightslights.map 000642D8 14952736 262144 5d64b0349a0792832e6dc7a9a453557699f1857d halomaps:4475 +Nirvana.map 98B556D8 55357362 262144 9f0c44e7241a9a6dfddbfa3a8cc6d88cf545fbeb halomaps:1599 +nirvana_beta.map A6AF9BD8 21669226 262144 9eb8d0eeea523c80220a2859485b6f72c64d7dad halomaps:6904 +nirvana_nuevo.map 3EF2C8DA 50600546 262144 f660f27587cbad374308e2d5a37244f190124aa1 halonet:nirvana_nuevo.zip +nitra.map 6451923F 27082644 262144 b82de666631a33024ac0d76f1516175a89e83852 halonet:nitra.zip +nitra_ai.map EF7716C5 231535597 262144 d21fb33de8299b4b0483d89fef57a2bd2be40970 halonet:nitra_ai.zip +nitra_beta.map 63778879 17722780 262144 2341720bae65da48fbc4cc657cd615ca3fac9a23 halonet:nitra_beta.zip +nitro.map 7B075E96 14831522 262144 00a4077809ac2cf2fde3a3a44c3f445c861881c0 halomaps:963 +NK-G3-Augur.map 7A6E0C0C 203362098 262144 d7595fdedd7f24d9c21487e033494e142291452f halonet:NK-G3-Augur.zip +No Conflaguration.map 7A340AE7 76804386 262144 cb7b277aa5f77bc871f7bd99bbe49c7a6e1a90e5 halomaps:2349 +No-Anxiety.map 00000000 243093774 262144 a9863304473e838d909c3c2baef0ed7b03446e4e halonet:No-Anxiety.zip +No_Fear.map DDA10707 214987768 262144 3ebdfd93fa321ad68e169db888daadde23e2632f halonet:No_Fear.zip +No_Remorse.map B48B47F7 49749974 262144 c45bc3803e724bc3a1bee0399c653538912ab4ef halomaps:1759 +NO_Remorse_ce_ai_v2.map DBC32829 105055786 262144 3b6d8989ba78f0cff22e9d84b300a6880644566b halomaps:5450 +NO_Remorse_ce_ai_v3.map C8F51E89 129351094 262144 2dd976cdeee452aa568a529b250f9583133885c4 halomaps:5664 +NO_Remorse_ce_classic.map 46A92101 98035022 262144 3137bffbedc96d16f14faa6be131175d8ee6e526 halomaps:5469 +NO_Remorse_flood_survival.map 0963332B 124975527 262144 8818781d4566785df8aa8611bf2144b535565d88 halomaps:5690 +No_Remorsed_KILLERZ.map CD3970B7 122831615 262144 b08058bc6984bb24c4a47e3f56631294e3b5344c halomaps:4034 +no_where_beta.map 15F92E7F 20292383 262144 20c54b653f31b9716e21ab291b1966bdffcfcc19 halomaps:2593 +no_where_beta3.map AD765E2B 23361407 262144 3a2ae0360a830f6de47a7946cd533acc933236c5 halomaps:2727 +nob_winder_beta.map BD95CF55 14840596 262144 e1f3619f703d45a530d0ee50f5a211ef22caf948 halomaps:1019 +Noble-Leader.map 59C7034F 289298041 262144 7bd76331ffc1b8b0bfad3c4c6179e6376f1fde05 halonet:Noble-Leader.zip +noblepower.map 2C0BEE15 24241167 262144 45477724b24140f3ea9102fe8739d47ba726b59e halomaps:3794 +noisland.map A4C184F5 80276103 262144 ba9bc294f26c22d3c718972d61b30e8de6d86fcf halomaps:5097 +noob.map 4B51BBA2 15869040 262144 2216618f59bf6ac9838a54923c20866a72591fd9 halomaps:6270 +noobinator8000testmap.map 0779C9C3 42181940 262144 d61321762b99ca6cb119629b1b08a0cada827fae halomaps:2693 +noobmap.map 9CBDA6A8 14350188 262144 7818d34604bea2e9aef08dee8570c60c41e1a3ef halomaps:2323 +Noobophobia.map 4C71854B 128489816 262144 e896e7c38ac508b67173712ac6a19feb73561721 halomaps:6840 +Noobophobia1-2.map 64E9C706 127352418 262144 5703b9c6938d2f71cfe54007215aaeac88aef170 halomaps:6841 +Noobtacular.map 0F24F310 19643446 262144 a4a90113d55397b62624f8f93166c8dcca72af7b halomaps:2842 +north_terrains.map 52D573AD 63647731 262144 c03eb55cdb5bc46c1ae676b1f505dfc001f7509c halomaps:3712 +Not A Failure Thanks To Me.map 72169ECA 19268840 262144 df092b8fe82333aa6433f74ecd6d6f4ab65a7e14 halomaps:1849 +Not_Alone....map E31229CC 23640376 262144 584d63e34b4d9574f98c27a21aacb374c1737389 halomaps:313 +not_alone_2.map FB63F75C 28808424 262144 59be09750b792cc184d461f7345434835f3cf202 halomaps:6973 +Not_Dark.map BD873432 270493522 262144 e4f03176a37d2a57cffd55c2efa28577eb53ec34 halonet:Not_Dark.zip +noteasy.map F807B0F5 215215504 262144 a37e417645f268cb6cecc3fc3247890c6e204dc6 halonet:noteasy.zip +novasphobia_beta.map 753BB4DE 40552592 262144 5af58a962011459146ee02250cacbd15d31f8118 halomaps:7106 +nowayout.map 5A878866 105419654 262144 33d8cbce8a008c941d53587cd2ba18ab90de29e3 halomaps:4159 +nowayout_MAD.map 9A33B8D6 107169878 262144 30f1506cdab3c3a6260747bf6537bfa31b954f16 halomaps:4177 +nspm.map 362E643D 73218993 262144 ef5fea6fca588013319c531a7b05673baef31e12 halomaps:5858 +nuclear.map 7681D1DE 20912512 262144 f8aa3ac46c2532a286028bdbe6f177a5db5145a6 halomaps:5157 +Nueva-Bloodgulch.map 2F891B71 369112955 262144 a4c464e3f113d5cee6d9820ad7113ef89df66fad halonet:Nueva-Bloodgulch.zip +nukem.map 77EE5B93 51198456 262144 b513e67837cd009023beec853f5cd47338658dd1 halomaps:3096 +Nukem_INSATIABLE.map F198A5A8 126886746 262144 b311518c816e8b0ca36a5c18aa473e91033ad67d halomaps:4808 +Nukem_INTENSE.map 280AE58E 123266222 262144 e16df2c5bf61fc0c7cd12e28abfc0995ba9c5812 halomaps:3966 +null-zombies.map EF2E5E95 27415270 262144 47dc277f43d22d3671de20873de417d2ad7e621d halomaps:4691 +null.map 320DD998 27330094 262144 18dee52c6839685de52e33f4476f277e1090a7cc halomaps:4692 +nuts.map 65BC86D3 44808077 262144 e39d02795f460bc265815780d2088a6f6a89e67a halomaps:4497 +nya_flood.map C635E4A0 143026832 262144 569a52bc84af6d9b92ba92ade9cdac334539cdb1 halonet:nya_flood.zip +Nyan-cat.map 3F2B31E4 246538572 262144 c6bc431d960986f3cb2f2787f273beea93dcf613 halonet:Nyan-cat.zip +Nyctophobia.map BFCFDB6C 15877916 262144 320f199dba9a6fb1b462db194e770ca8e5768a19 halomaps:309 +O-Canyon.map 8059E542 16473495 262144 c2714aaedd02b978db363c4717985e1d8cc7c3b5 halomaps:4409 +Oasis.map DB7F0907 28286777 262144 eb203a09a05d52a11e7993641964f671d5a2201f halomaps:4058 +obasc.map 4C9F028D 21330898 262144 688eb46922bc0eecd4610fd6ae724b9559909ce3 halomaps:4432 +obelisk.map 93305FDD 22383799 262144 6613d592145c2bacb985fe698e7cc4ee6030f0ca halomaps:1585 +Obliteration_Station.map 9E9C4B77 14203080 262144 dd496c05c3ac5151d13f700acc4aa0dc93e813a8 halomaps:4291 +Oblivion.map 84D0C79A 21196632 262144 03dd3676d2c03e23741eb24fe0070ebddae7cf97 halomaps:474 +observatory.map 104798B9 29945884 262144 837f18607d177fd9908a992e334141aad546c48a halomaps:4125 +obsession.map 94600B81 15511754 262144 e51448f0a467134867985dd072d3fc0d9ac3f634 halomaps:5239 +obsolete.map FF21BFA4 95002548 262144 ed18cb9f7f2e1c0e59968f4061bc6586f1b3c1d9 halomaps:2993 +obsolite.map 5F8DBE22 16063236 262144 d1a920f06d08d98deeff76ae6a777ce3edade309 halomaps:3173 +obstruction_beta.map 4B408A78 22304580 262144 55e58cbf5d9ba745c754c855d4960e70fa8699b5 halomaps:2439 +obtuse.map E557E7E4 38814468 262144 a8bb07f7f51613fe03a0697cf471c6d50f12c7e1 halomaps:6842 +obtusev1.map 222BC0D0 14895916 262144 903628818e0db31966b3679c5470f92fdd6eaab9 halomaps:1787 +oceancrater.map BAB61DBE 21910792 262144 961a68dbca95c3e9309257fadb4ba93ca2642717 halomaps:4201 +oceans_apart.map 90499172 18192796 262144 c7150deb87d036f9ccb828bef6ab908c9378470a halomaps:328 +octagon.map DDB576BC 13906808 262144 315f8650624f9d4dd38968683ce5f807b6f8d32f halonet:octagon.zip +octagonv1.map C7F11FDF 13971136 262144 1ce23f6f4b85971cd0da623be1408cf2be8b7d7a halonet:octagonv1.zip +odd_worlds.map 5C89C918 26344833 262144 1ae21606c6c4a9999c68418e3e34d07c526a86e7 halomaps:5412 +Oddball#1.map 726C15AF 14552960 262144 9ef0dd6f3e4d8e388032af26e233ba7e0cda30fe halomaps:7107 +Oddball_dioptase.map 17C92489 14587287 262144 c6b5c4b156f3d4ef84d4d7e7f051d5c13c0cdd45 halomaps:4720 +odst desert.map 1CE67086 147828249 262144 cdb44bb978a27ef99d666861daafd109c4267a7c halonet:odst desert.zip +ODST The Floods.map F42E8C4B 214096203 262144 cd52068e6ce45576da9b46fcb72725559bc34501 halonet:ODST The Floods.zip +odst-ascension_firefight.map 2CE40250 92679755 262144 1eb3b484835ee61932e1d79450b283a3e2716634 halomaps:5026 +ODST-RPv7.5.map DDCC9D6F 117023728 262144 e12a94364c471c754c62a843bb2355580f004822 halomaps:5158 +Odst-vs-Flood.map 9CAEB1B1 269529557 262144 4e266ba21c09355e8bee34726744a5d11cc4a11b halonet:Odst-vs-Flood.zip +ODST_BattleCreek.map 1E3101E0 195766788 262144 2c07c707de86c87be2ff3e40f8560fbd0dd98ac3 halonet:ODST_BattleCreek.zip +odst_c1.map 1258D2D5 269833692 262144 37e402d2c5a28c670672a003f57917e1f4337371 halomaps:6664 +odst_c2.map B69E5CB7 226201215 262144 7d69234caf2922380a1e57424b90a1c78084f347 halomaps:6665 +odst_c3.map ABE474A7 230069619 262144 c38887d2d195b1654edab184c03e34896bd6e2ca halomaps:6666 +odst_c4.map 27F50FF2 198706195 262144 0fbfee938cc133a7b19f2b381f4cd8126acd086c halomaps:6667 +odst_c5.map B3C1A14C 207221007 262144 016408162b17caf5dfde0cca49ce4084d15176e9 halomaps:6668 +odst_c7.map 7B41C534 252400249 262144 f346e031c01241879b032d9c0650d96bc944d9b1 halomaps:6669 +odst_chaos.map 98C38BAB 212508991 262144 103e0e3fe10a95cb212275d35a46f3e34e048d1c halomaps:6201 +odst_drop.map A8A6367E 115012992 262144 4888720e08223891d108c2bcf0e6b32cd2edf1f2 halomaps:6152 +ODST_mission.map 2FB4074D 74632015 262144 f3432026ce8b00c3e0956b4fbee0176da57b0d0a halomaps:4846 +ODST_regret.map 1544C4F4 128122255 262144 1ece66a64b13691e631294ce51e829a331c47ad4 halomaps:4906 +odst_regret_pb_v2.map 4DA6D95D 125094334 262144 8a69580b6b13d1a75b6962f0982cb7388a7a3af0 halomaps:4942 +ODST_RP_T2.map DC8CE0E0 97333474 262144 cb9ed86b0e8656f77b907c770d4c7dc606d9f537 halomaps:5159 +ODST_snow_gulch_pb1.map 7DF41503 186006553 262144 22e05fdc92ad8f6fe2155e5018f46fda14d23ab6 halomaps:5017 +ODSTgulch.map 92EC1FD9 65239453 262144 536d268db0e74dfd1b3ee8b1b16ad2a4d88954c4 halomaps:4872 +odstisland.map 0AD08E97 58831778 262144 a751c9d80718b70b43606500d1859d6c9e0d642d halomaps:5248 +Off Ground Classic.map 015A0DF5 27370576 262144 3a2a3f66de9aecf5d8cef68c705968326587a2c1 halonet:Off Ground Classic.zip +Off_Groundv1.map E77F217A 112591618 262144 874cb0f247ae9b07b0a5f0538678e959874715ba halonet:Off_Groundv1.zip +office_building_alpha.map 768D12EB 14866832 262144 c29647fae7e35bb7a5d0582bbdc8a7f8907fe98b halomaps:435 +OHMANOMAN.map E1324568 46091312 262144 2ddb3ca93b32f4c14868ebae31b0c3f015bcbe34 halomaps:5774 +oil platform.map C2D7E8AB 36350393 262144 c44e1953980755a3fbc22562443a2a157136e971 halonet:oil platform.zip +oil_spill_aco.map 6E834224 38921168 262144 759abb2a5132f132b5d307cdd8056f89d1b6acfd halomaps:4985 +oilisle.map C36D19E2 15810376 262144 4236ec265a24c268153aab579e59a423b5e72552 halomaps:261 +oily_victory.map 2B836813 53829108 262144 dc1a3140fbf7dc00c810a909d2c1ad5cbe04aaad halomaps:6097 +okenfenokee_tourist_trail.map 887CC9B9 24587372 262144 a3f83bb1c3290e9b8004908822fd8cc99387bdc6 halomaps:3038 +old-convertido-en-new.map EE5BD224 232338647 262144 4855b7ae9d3d826fc72d65ce4f7ac4d63f0b43b9 halomaps:7108 +old_cemetery.map 8751613A 33065253 262144 e151346cfb90087de57cf12110134408604f6c1d halomaps:3587 +oldmombasa.map 644910F7 41754096 262144 5b31ff605ac1fc04b2c4cf6592775d6bf96eb5a2 halomaps:4907 +oldstyle_bombed.map 917C5CB0 16488032 262144 2a8588e065371b63aa7debb3822b464406b1c704 halomaps:1621 +olympus_mons-ai-fight.map AD264073 98945067 262144 207c48ee8dc2d62de989f267b15d26dde3da4f0d halomaps:6233 +olympus_mons.map EFA6839F 49361352 262144 a98410a9749055a8182f5334550487acfc9eddb1 halomaps:2613 +omairsumgulch.map 5445694D 36099871 262144 1cd6e5ce1aedfe3a62314ddf424ae9f03640dde2 halomaps:6397 +omega_outpost.map 2939AC93 118965200 262144 9f82a67930741ccffdb201e3b8e58daab71ae9ea halomaps:5733 +omg_it_bloodgulch_beta.map B9E814A0 22856633 262144 fc7bf4e11c1fb83249f0829ee321227589abc544 halomaps:3633 +omg_it_bloodgulch_pb2.map AC43E233 27409326 262144 78ae393cb0d373e0902ad9be8859b0cd430b87ed halomaps:3713 +omg_it_bloodgulch_pb3.map F07CFE5A 22881417 262144 fe64d5e30e59be350a296ff4cd25cb95ded91c27 halomaps:3732 +omg_it_bloodgulch_pb4.map 33397661 68104308 262144 cf9a0b0b7424bed0d3afb75639c8fa04f74328a8 halomaps:3880 +omg_it_bloodgulch_pb5.map 1C3F6074 81415856 262144 c663620e0f16920aa7cdf37fb3e4a2aa1a1bffd2 halomaps:4035 +ominous.map 6C7FF2EA 19289020 262144 130e1c1414783d360fd568c088e74cac9d661a7d halomaps:994 +OMMT_modded_Bloodgulch.map 9BA13981 27343732 262144 b07d47a6d876c6205f5531bdc17ca7a0844f1d84 halomaps:3967 +one_way.map 0349EC05 20553536 262144 a68ed474927c2cb80ea96cb04b266d0c71169806 halomaps:3714 +onesided.map 1A749BDE 13160660 262144 207ec185a61fca6c42fe68b72486849d35520ebd halomaps:262 +oni.map 56478B9C 26858521 262144 ca0adce2b75e01fc4194731b80c4d6200a4093f8 halonet:oni.zip +ooe_big_chees.map CEC4E30F 56560389 262144 b260dcde9132e0716c2427845516ee05da7aca61 halomaps:4266 +OOE_Gulch_final.map C80DB99A 50117396 262144 d8c569c4f69bfcaf01b0b2b4cac56b7b62d52a65 halomaps:3993 +ooecookie.map F0A16987 34349554 262144 a05285325266675f6aa852bc1a44bc68e506b20e halomaps:6678 +op_ctf.map 1297045D 14727176 262144 98485eace81fd0b45f284b6e092db7f6415252e1 halomaps:675 +opavo.map 04D7EE36 14425764 262144 5a830e2f4117929df86c645b8342d9ccbd708d12 halomaps:569 +open.map 0E68F7E6 13932604 262144 12df482a95f45853667ce06fac18c99c6e9429a0 halomaps:263 +openseasbeta.map 2EB57AF8 35396290 262144 8b61ca6e8e31b678a79bf66eed077ace77f0a494 halomaps:2843 +operation_blackwater.map 946FE88A 156993722 262144 5ea222b9f951b2bf5a828d3315670b9fc5e71011 halomaps:6625 +Operation_Exodus.map 3B9979FA 121608208 262144 011a1d238f75c89c8ba036515285f72142603e01 halomaps:6343 +operation_frostbite.map BA4736E0 135625903 262144 148df46367fe13e0c2eb1b692aaad0dc1d76cc04 halomaps:6626 +operation_quarantine.map 8482D5BE 109709176 262144 a4536458d5feb6ade338815e233514549cd63b26 halomaps:6627 +opeth.map 7002B985 133211620 262144 8995394f070755556e1dfc74abb48dc35d1c5ca1 halomaps:6947 +oracle.map 1A6DD407 27143572 262144 e519f6c247128d6666577dff812206fe4f808a93 halomaps:1901 +orbital.map 05472AB5 33514884 262144 97f1a43dea6f6ddbf6381c1b79ae734a20e75fc4 halomaps:4331 +Orbital_Defence_Station.map 26380D59 12497120 262144 6dfa7ebb9cf82179f1c2280f9db7bd477bb4f9d3 halomaps:544 +origin_of_chaos.map 225C15EA 18369148 262144 b2b78f3efeb220cf9d6e5d1f45cd02be8e09934b halomaps:1814 +orion.map 44FF46E8 32384371 262144 6f6e6115a0ffe9112d8729f37f2c6b1029fc6ddc halomaps:1857 +orion_final.map E919B157 18753372 262144 5588e44f5d47b8fd6a85cc3d3c74357f944e7735 halomaps:4292 +orpheus.map 9CE1F678 79032972 262144 77fe34ec950d76e5bb21084777d4e4eddcb9f80b halonet:orpheus.zip +osiris.map 4F01F940 15027972 262144 66caefaa6fa0e50c1809859ad622b57f532ac0b4 halomaps:264 +otro_atake.map 57F5EA50 74854298 262144 2ae436d3db7580ac13c42bbdb73ed743b13ba156 halomaps:6068 +out_of_reach.map 03BA6D71 93201756 262144 88c2ad83d5384dc080c69d5210ede3bd68a11549 halomaps:5935 +outcome.map 13FBDC97 21774924 262144 867f9fd3b5c1852df3263d8bd0e9e3b023da9e5c halomaps:4255 +outdoor.map 2E86E00D 57656576 262144 8dcd85360d364e6c877045301ee2413b234e94d2 halomaps:6721 +outgreet.map 1A291ADA 14900756 262144 c7b2ea386bcfa5d048ca8855fd52b15f9c32ed6d halomaps:4587 +outkast_arena.map CEA5E221 44933339 262144 3d77756203a37346ee272a069eec8273e28cc7b4 halomaps:4659 +outland.map 8C74AF85 53876923 262144 d7fc7f2d3b7f55320ea91819a4e129d48f5ccd30 halomaps:5240 +outpos.map 33C49E2C 232749181 262144 9ee0bffb3edc7f40a93d120c46619208f38d74ab halonet:outpos.zip +Outpost Bloodgulch 127.map 8E7C7CCE 56114178 262144 a710db1b47c4be93edaa6d1331a4a316440a7bb9 halomaps:5187 +Outpost-firefightv2.map 5A0D8A13 267022838 262144 786223fd521d4a9ed875d51ae20398b0495f5895 halonet:Outpost-firefightv2.zip +outpost.map 2FC1E0F2 15912904 262144 0e730f6b9385bf9eff9d738f65b36573a42959f1 halomaps:1241 +Outpost_Rio_Classic.map 3188F517 20320064 262144 9e8028f4cb94a2cf753272b3900dd5eaa93ca0f3 halomaps:532 +outpostbeta1.map BDD6E849 13533468 262144 00d53ead1e22143f18798234e2fb4a6bac34936a halomaps:1180 +outpostdn.map C20F353D 38020601 262144 a107b698efd47fb6380c4c8ba9cb6ef086743082 halomaps:1468 +outpostgp.map 4B85EC3F 48180447 262144 2984aac4b3aff432945ad8e713c5622833acf756 halomaps:1469 +outpostlolo.map 66996389 63311171 262144 7c67866422cf0b06fbf87fa594665b84100ff852 halomaps:6291 +outpostsw.map 58A8DA6D 45679243 262144 386602749b899e04bca7ee08c81afe531d17f64d halomaps:1470 +outside.map 0685A2EB 13836028 262144 8c14d53df0fab9af59e87de664ee71c7188f8394 halomaps:375 +oval_track.map 93EE95B0 41075235 262144 0396c6730b6ca8f11246a2ede2e525ef24270b17 halonet:oval_track.zip +overflow.map A3B97BBF 16756336 262144 3f784825c5d4e7cb1016f48ba94d45fc98e3b40a halonet:overflow.zip +OverGrown.map E58C2166 34974637 262144 a2c244e3edd2e8529a1ebd3d8c2f25604b5ad7fa halomaps:3715 +overkill.map 12DA3C26 240269553 262144 bc8e52f4bf52f8fb1e4b06e8dfe0ecd2d1110f0f halomaps:5787 +overrun.map 5C5CED50 21302068 262144 09d6a4c901762c4d6a683bbe888911cdcc6b1e1e halomaps:1507 +overwar.map 556E7502 196571570 262144 b0a818882790f7d24ccea9deea76224013ca657c halonet:overwar.zip +p-ball_alpha1.map 9ED7B5A9 15855888 262144 413a0b4030643e4d4fa9b2a69bb69dd58caba677 halomaps:818 +p_canyon.map B34A5CB7 78401277 262144 75f7ab2e77155aa67196c2b2f6b768e9484165bc halomaps:1717 +pac-man.map A00E31B1 14950689 262144 5bec3283e9f4ed000a2d454af8136742718f2aee halomaps:3649 +pacman.map E9DEFE15 13516172 262144 11623b10181d5f148437b4d67cd5f3de5afe4b39 halomaps:2011 +pacmanthing_1.map 00007FE7 70812123 262144 6e4c31f209678b23cbd897fe351b17d6e40c8aca halonet:pacmanthing_1.zip +pain_canyon.map 6434D1BB 18247480 262144 2a57fb238dcc30275d81feec921d8c301ddba8c2 halonet:pain_canyon.zip +Pain_Water-v0,5.map 78D2C03F 18908308 262144 5d3925d0d3feee48e803a40319865bb3c1695739 halonet:Pain_Water-v0,5.zip +Paint ForestV1.map 11D75ABC 50588972 262144 aaabf315cbd8431f6b92a97a0d1619bb23872ece halomaps:2173 +Paintball-BK.map 0A324ABD 59607963 262144 c75f580cb5eec656ee9976807ebd23dab05ca76e halonet:Paintball-BK.zip +Paintball-Gulch-v2.map 00000000 96865175 262144 e806c9b3d119b745e5696cb1e128956bdf3e11e6 halonet:Paintball-Gulch-v2.zip +Paintball-Gulch-v3.map 00000000 96977164 262144 1888d3645276dc92dce285ccdea3b4636db7eb74 halonet:Paintball-Gulch-v3.zip +Paintball-Gulch.map 00000000 94699523 262144 ac7f23b75c514420f1d10f72c45fa1874ee2a4a4 halonet:Paintball-Gulch.zip +paintball.map 2F4674CA 17582660 262144 2ff2d177f21e8ce82bcfc61d9be3c4620dcc97a5 halomaps:3276 +paintball_beta.map BBA82C26 22804041 262144 170bbc5d7b38b8de7c43c5ab41f3dfd990157b7c halomaps:4074 +paintball_madness.map 5872D879 112332097 262144 9e566673e9c34c1457d1e0455d8bdf6463865654 halonet:paintball_madness.zip +PaintforestV2.map 101A0441 39899020 262144 819338e5d9732544cc36b7b8f080190f58b710e8 halomaps:2580 +Paintswamp_v1.map 4BCEE10E 59104258 262144 86bb881b1003b4149cb0ec75d12e97fbcabad891 halomaps:2273 +pancor.map 34C6472E 22747322 262144 7ab83859c7b8bbdd4bd17917685c82a63c37214b halomaps:5279 +Panda_fantasy.map 7DF374FC 260613055 262144 78f24e417496dd00315da1fcf5183d4f55a52f02 halonet:Panda_fantasy.zip +Panda_House.map A5A0E937 347879848 262144 2ee64b4e5d2075a8d123cea1ea9e32521abd9059 halonet:Panda_House.zip +pandemic.map A1465931 195771128 262144 be35af409f94ef86f208eb28689c7013af4f7fce halonet:pandemic.zip +pandora_swamp.map B0E9E481 129023551 262144 8a65943277cb8a045fb1b3e923e907033f8e1b8a halomaps:6122 +parabola.map F713BDC6 22900434 262144 7155698ad0e6259b6cb8394176dd8eccead9e5e9 halomaps:3321 +paradis_perdu.map B9A9F328 132875773 262144 99350aa4abf1a31d7b93e918c3df2d4f90b8b3a5 halomaps:4721 +Paradise-2.map BCBCA678 38223223 262144 cd194a9acb33187d8c563e150184e957f3c4b45c halomaps:2360 +Paradise.map F2C024C8 25426825 262144 8e86f66ef4f58587a8ecdd34137e70b0a3b19d36 halomaps:1077 +paradise_lost.map A56F1AA1 24956805 262144 a71e0fdb19b4697e5a984909af4ce6319b153ccb halomaps:1191 +paradise_map.map 9EC44AD4 43646828 262144 2e7a00100946d5c0e8eb98ba87f0e19c61888019 halomaps:5046 +paradise_map_V2.map 050CCBAA 118967026 262144 8b1e16090a1f88a01642c29cd1a733a96669e8c0 halomaps:5816 +paradise_tourney.map 0D9E9C05 41718336 262144 337f165c67b90680020a97f8fd808d0e12507fe3 halomaps:2511 +Paradoxical.map 57FBE5D7 18714433 262144 d63c74fee126d5192c2a73cdd6b57ab983645d8d halomaps:1680 +parallax2.map 7E706156 41624596 262144 54094e45e66fe6e94a95a5c1e20a9e8a73a72525 halonet:parallax2.zip +paranoia.map 8EE7CC9C 12263728 262144 ef66eb1b8111aa6b4c8b1a82601c01c113dc0467 halomaps:3716 +paranoidx2.map 17807076 20617715 262144 e8e2b01ce384471e2002afe4a0a0f14ff461141b halomaps:365 +parched.map 9242E86B 13422768 262144 7d76504db7f5178449ec1771ee7278a3dd98ac78 halomaps:5280 +Party-Station.map 656483BE 81591004 262144 2d1f73dbca290cffc52d599de295e14c80a32a69 halomaps:6458 +party.map 1B97239C 31150725 262144 aa72684acb853b111aa3f9869af659943153776c halomaps:4075 +Partygulch.map B9C0A543 83846828 262144 b798049f2c76df5c107aa80302f6c275f493feb4 halomaps:6253 +pass_bridge.map A1C373F0 182922878 262144 68901c94c74779f08177b683c065adeb0e31d360 halomaps:6353 +Passageways.map FBA24091 23714920 262144 73289a214e357cfe70cbdbe8610b2de51082fb29 halomaps:3354 +patxi_island.map 9F5C920C 124014490 262144 39e7767fcbdb43ad1cd0f8a7c9a496c967118ee2 halomaps:6976 +patxicreek.map F1D6DEA4 98564575 262144 96215aa5adf1aac66b0720e69ad54ad44db11f07 halomaps:6974 +patxigulch.map 838FBAA6 121532846 262144 73dddec548c774aa07fc5f89f495c3cea947120b halomaps:6975 +pb_forest.map 21EE54FC 22917408 262144 1949fbd39b116153c64c9fd47fc325654caa526b halomaps:2416 +pb_forest2.map 605009CF 75454898 262144 d7f32f25a966a53a5efe319880bf0c4b0f27ac7c halomaps:2503 +pc-level.map 24ECE3D4 12551560 262144 8cd248060a568297ae8f980118ac821fe02d7bf9 halomaps:2504 +Peace-n-Harmony.map 00000000 303715953 262144 13cfd880a15c381b2832cfb7553aab6ed691c55e halonet:Peace-n-Harmony.zip +peak.map F9C5E410 13944348 262144 b081f8a8028d04ce313a4b4006344e7a3d9f8c0c halomaps:3148 +peakofdespair0.8.map 55726BE7 14957856 262144 8612c11baa66b3f2bee93989b34b4149832ad55b halomaps:2594 +peakofdespairv1.1.map 1A17F017 34719992 262144 ab30de5501e9a266e815d5861314520d73df7d48 halomaps:2729 +peakofdespairv1.map 0AEF00E3 57390878 262144 1585f244f09bfde6974f43c84e1a6dc121205661 halomaps:2694 +peakofdespairv2.map A6D07E97 31573197 262144 d9276916a8c6b697c67115d94c47d6e7a14aebb2 halomaps:3149 +peanut.map 1607AFFE 28763315 262144 98bd1ce7aa0725edd4c60ed4ba0854bca5fb9887 halomaps:5373 +Pegasus.map 703721A5 103797310 262144 ea206b6fd9af93135da95e85f2fb8cf3467ef88d halomaps:7076 +pegasus_classic.map EDF68484 15697428 262144 86297a8d8d770a17d2c6bc8af0dacd92e3a6e8ea halomaps:7109 +pelican_crash_site-2.0.map FAA573C2 81249692 262144 5b2109118c696f247c82c3cf54aa035a65364488 halomaps:6433 +pelican_crash_site.map D4FD17F6 84272453 262144 e689eb61ae2f3b88621f9522e960f6da5cc097c6 halomaps:3439 +pelican_island.map F71F8C7A 34778407 262144 21d446fe968825a03fc75e4d5d3174a34b0d46a5 halomaps:4457 +Pellude.map BEE6ADA0 22034208 262144 0cdfc38b68a6d1863daaabcbdc72d5a4ab50c79d halomaps:2614 +pemba.map F3262CD2 51532405 262144 9d856b205f975435124b6b4a6faba3573b1b71c2 halomaps:1593 +Pen_Island.map 552C1089 15467300 262144 4abec9d7a3a5cc1cafc5f6f225c5ddb8bc869a78 halomaps:1255 +penisland.map D96ADE5B 12066960 262144 8a4bbb852c01b422aa6fbd25073bcbb6b2f485fb halomaps:1182 +Perdition.map ED339B4D 99670348 262144 51f60d8a48d8fe4a6be4bd35aa264eeee7cce6e7 halonet:Perdition.zip +Perdition_v2,0.map 34A71B99 48741578 262144 a9efdd1814b8c17a6f85634c313a2b2e5032ac85 halonet:Perdition_v2,0.zip +perfectriders_beta.map 5AD16A24 13912988 262144 184994d4aa9f4678ff6c2d96070620ddbfdb5b61 halomaps:1815 +pergitory.map 784967B6 13009576 262144 642029a81a1a1ef54b125400693eb31f121b7ff3 halomaps:539 +peril.map 40D51DE3 41794918 262144 04f3bded8528ca99c651e316c5241c9974d94ae6 halomaps:4096 +peril_h3.map 7CD92648 101831703 262144 649aa0a8657a38c7d718df3010ad167bbe3230aa halomaps:4160 +Peril_Redux_Alpha_pb1.map 721F4505 21393336 262144 426b689bd2da61caf862df2d1166633bf42874da halomaps:4809 +Perilous_Mission.map DB6C8E60 193256546 262144 b444a603d4368be685e9eed8c87370d6d0b1941c halonet:Perilous_Mission.zip +perimeter.map 62F2ECAF 21223972 262144 9e6663890fd3c66bbbbcb06672155114b843c7a2 halomaps:4410 +perimeter_v2.map 7DE47521 15582684 262144 c132a2b38dab518aa1c01443474983a7d98a3991 halomaps:4458 +perspective.map 96556E0A 30598788 262144 712c0213c9868d1d244cf62d910c1d791ed953c0 halomaps:2531 +Petitbonum.map 18CA1226 15811544 262144 2e5c9e770f9a51e96cb32cac04e1df3766d9d798 halomaps:2581 +ph_canyon.map DC98BAB5 82768279 262144 5edd2725a1224990d37571c23cd5229d23bea0ac halomaps:1725 +phalanx.map D227B296 95230533 262144 822d6deb34bec7ac3b8df199f51590b5c74b85f2 halomaps:5929 +Phantom-Zone.map 00000000 238312292 262144 f8892b276d910bbde0db39e4f23dbbd66e5104fc halonet:Phantom-Zone.zip +Phantom.map F3412EEE 72362210 262144 46ed5407c045ad11b09a418d59f66781bacf30c3 halomaps:1439 +pharaoh_2.map 53216824 20858316 262144 57120bd46af1019a39062e599671995819204fbd halomaps:376 +pharaoh_2_final.map 3058B904 25956756 262144 47e385b4be93a9dafe8f0d3d18e35f15e94a48d0 halomaps:466 +phatgulch.map 2AE6DFD7 50415250 262144 27bfc3df5c354798bb39ed324da11fb21e7b514e halomaps:2560 +phoenix.map BD494848 13165532 262144 354c42a112fbb4ee31a554a13a56718288335c90 halomaps:772 +phoenix3.map 00000000 70096498 262144 bc4f47f857387ceb1b1992edb143e97e987d5116 halonet:phoenix3.zip +pillarofautumn_mp_beta1.map DAB6A3C4 54244300 262144 1a97432fb10db4fe9626264d67e38b90e6e38c75 halomaps:2926 +pillarofautumndestruction.map 732CE0B9 86471371 262144 feb90e42a90cda0138f535fe47add401023502e8 halomaps:2350 +pillars.map 904C07A2 68209886 262144 68bee0a971ed59b80df116e6b9fb2de0a0fff737 halomaps:6704 +pillars_v2.map 61AD3141 50141437 262144 dbefe10c88e850a94d2a03b1a00ea190926d23e4 halomaps:7110 +Pimp Hogs 2.map 461292AE 32877090 262144 a0d269746d21cc9c6a70fea2ba5bf7439b00e03f halomaps:1163 +pimple.map CAE81F98 13402020 262144 34fff9935dc9edebe8c43be49ff8b63262646230 halomaps:4036 +pimpness.map AD6BF017 21395332 262144 b545aebb76fb759456020d8a22bc16b81d7bc292 halomaps:2532 +pinch.map D7674395 24149454 262144 552b30f2fa8e5ba3b6593ef5bde7c6c0b48ff070 halomaps:2595 +pine_circle.map 6F3DE314 16335176 262144 9db1bd49964ac8dfba88062f3a9ef17765f36b03 halomaps:2695 +pineic.map 23010FFA 55726890 262144 a4406112e3b9e95a9997528b7768c3e44485b866 halomaps:7071 +Pink Eye.map 6509BC6C 275139119 262144 1d79476b272588334b50811ed3a50a60a70d5fe5 halonet:Pink Eye.zip +pinnacle.map 346AACF0 395444207 524288 45375a7fc5f55bba07684706d84fed4423e9f790 halonet:pinnacle.zip +Pipe_Dreams.map 6D8F81F5 396446044 524288 a35bbe24037b84da652a3b93ff9ac1ec87af0fa3 halonet:Pipe_Dreams.zip +pipedream.map 78483F82 24861247 262144 c47b48b3dbfbc83ba8311ae61dc2d6ce7505684a halomaps:487 +pipeline.map 12E840B0 15909620 262144 a95ea2a3c48887c9a9b2577e5014b040e1030a27 halomaps:1850 +pirate_ship.map 35058C36 25949631 262144 9c509546d5dfd7fd09f98eeb9305b168cf4eb4a9 halonet:pirate_ship.zip +Pirates_Gone_Wild.map 210A67B0 234993733 262144 7aae48b523b0235f427472a1c5b4c72694b4cb0a halonet:Pirates_Gone_Wild.zip +pit.map 21A91CEC 48180630 262144 f96270781cdce5da3ef367ad7e2cb3356e015414 halomaps:5429 +pit_v2.map 50723DD1 133107261 262144 35d565ae15f7e148c005ca022325e4ca6d94a285 halomaps:6751 +pit_v2_top_race.map A201BD7A 130623786 262144 046d557f648ec0c9f9a4c617244b3d1a22d201ee halomaps:6752 +pitfall.map FC3CA89B 124255705 262144 08dab32276efb4615bdcab3e0f5e7c6f05ce035d halomaps:5413 +Place.map 2AA1CC8F 13958148 262144 4bb859a433fd91f75e7b7686320a8b4326d3442d halomaps:4411 +place_01.map 84915A36 31965618 262144 d9e4e3adcdfe7a187b67137acfbbcd79bded4e82 halomaps:5188 +plain.map D3DBA0FA 12695104 262144 b035e8022808bf83b3bd14cb0bc799e912c99202 halomaps:3824 +planet_flood_a.map 36D6CBC5 98534228 262144 8921539204ee6318c983223176b04f0f9b547b6a halonet:planet_flood_a.zip +planet_flood_b.map F1109AE9 141251433 262144 b94306c1c16a36a29e5847ef187f072ee186aea4 halonet:planet_flood_b.zip +Plasma_Duality_Carousel.map 0DD942A9 67191405 262144 ff30fbe666af212ba3f43ca5de4a62f79d4d69b8 halomaps:6234 +Plasma_Duality_Chillout.map AFEDCC08 66986921 262144 59aa2c53801a446d1b79c849a547dfcf64926555 halomaps:6235 +Plasma_Duality_Damnation.map E91BE10D 68295469 262144 2f472f68a012d306a9bbb8708e417e8404428c46 halomaps:6236 +Plasma_Duality_Last_Hangar.map 12E6DD34 96364697 262144 4a8103f53da46a4ee431fae655a55c140b3d5d46 halomaps:6237 +Plasma_Duality_Midship.map 34CD22C7 71857949 262144 fbb8697f1ede1ddcac6cf4812a5526e40fc429f6 halomaps:6238 +Plasma_Facility.map A8752267 97547360 262144 2306406672ca655b4c4482949ec440cf0815f45d halomaps:2791 +plasma_skies.map 8029AF26 16393032 262144 ff1a1ff86ecc6ccca57bf3ad0617251521202dc5 halomaps:444 +plasmagulchv2.map 5C30143F 14776772 262144 abeda7ce2c5bee8fc05e74c014f9c526903027fb halomaps:2958 +plasmanaderifletest.map 0CE68429 19508332 262144 060f0bffa874c13b7534dca6cec538ffc41ec402 halomaps:1417 +plaza(noche).map B85FEA77 120135215 262144 7b871ea6e04461b74a55262d46187ed2fcf7a6bf halomaps:6734 +plaza_las_sirenas.map D0CC1C64 80854406 262144 771c2ba5307f586e35a649fa2fa8520e1c9c903f halomaps:5873 +Plunt_tuiama.map FC7A0F95 63529139 262144 1df3921acb9ee9b24ac7b340e10bff4f67e668fc halomaps:5025 +pluto.map 53FB1379 62711855 262144 603377a3042ef85366568433a29aefa7fe278b62 halomaps:3262 +pluto_real.map 2E26F0F7 64844523 262144 bb578639477df960b363294160d3583463b428c2 halomaps:3275 +pokemon_tournemant.map 784484F2 30870084 262144 eb43685a5db6927625b435d8fea1b52893f89a33 halomaps:4037 +polarity.map E835D497 123371142 262144 392ca5202e207506e27accd960c4ed7921e3e927 halonet:polarity.zip +Pool_Party.map BF5FFF44 286257351 262144 fda52a6e449522b84f5a4679e17a3e8344274028 halonet:Pool_Party.zip +poopoo.map AF2F0B84 14171580 262144 bdee58da6d029de22a020b268528814ec458a327 halomaps:1685 +poq_ambush_ce.map 00000000 356613203 262144 964dd8fc04544b9734d982262375ca641af9b599 halonet:poq_ambush_ce.zip +poq_anguish.map 00000000 96001064 262144 1e65a9ae529f74b66959eb62ef218b0f8757a956 halomaps:7083 +poq_bloodgulch_ce.map 5EA3D576 206205077 262144 7dbcf79a208d2116e7c7cc736e5f910f05532d46 halonet:poq_bloodgulch_ce.zip +poq_ghost_town.map 00000000 207492481 262144 a95518876eb86b9af739e5b9c1f29d1b87210a24 halomaps:7077 +poq_icefields_ce.map 954D8AE1 76680511 262144 98ec484ef077455401adc3a03600eacc26796306 halonet:poq_icefields_ce.zip +poq_insomnia_ce.map 0F1E9604 81583166 262144 49c9b80b8230763c1290fda2b791eba5fd135c8a halonet:poq_insomnia_ce.zip +poq_presidio_mod2.map 00000000 230349381 262144 4d32cf8f318d6df2b031fe167c2792a47edf7d1e halomaps:7084 +poq_presidio_mod4_ce.map 00000000 230332041 262144 3a14ee8010e30ac8b54f57cd6a1f47d5ec01bd94 halonet:poq_presidio_mod4_ce.zip +poq_prisoner_ce.map 00000000 300393303 262144 e3934b2afc4d01de822f9962b6747578a734562f halonet:poq_prisoner_ce.zip +poq_the_abyss_ce.map 00000000 258911428 262144 d2aa968de8932d3d42cf02d1fe85a4f230973ae6 halonet:poq_the_abyss_ce.zip +poq_the_abyss_v2.map 00000000 258911428 262144 c73e459fe3af8caafa0ba68fcfbd20a0e914d1cc halomaps:7085 +poqisland_modv1.map 238528F5 58827277 262144 ae21f0f7d217e651d9fa1f599d684a76579e95fd halomaps:4873 +Port.map 9B2A46E1 28749688 262144 a6b30c297b86345bb84da83d45f5990cbfff3333 halomaps:5695 +portalgun_sp.map 226BFBB3 13821476 262144 60e7ad6eb7d6d3069fbd2e5042aea6f279f74200 halomaps:5171 +portent.map AAF2E70E 41661525 262144 bbf36b5c3c9b286a57de180c8213af93b1b25c0b halomaps:1796 +portent_AI.map 8AAE2519 110429361 262144 816c1e19b2da954a47949ad2f32c34a2318ac71b halomaps:4874 +portent_ai_red_vs_blue.map A462B53A 47865105 262144 2353428b2a656f889002d7732cae832df3584e2c halomaps:4943 +portent_custom.map A7252F6F 43270659 262144 5db27dde1228c1243516158ee114a5d62f1eca92 halonet:portent_custom.zip +porter_creek.map 3EB616AB 61156550 262144 9b96ea19ace2db28d2d1a0095acdc29e04c707ac halomaps:6153 +Potamophobia.map 69D24ABD 45697180 262144 de64f3301f4f67e1835e5e071a01efd10013f63b halomaps:4368 +powder.map 0D18D76C 15995176 262144 7761f2e9d0f83a6d4799e932f89dac61d22f7028 halomaps:2639 +power.map 4E3EE637 47031310 262144 a8b07587d8db20d09f8fc66279439d3376647dbc halomaps:6098 +Power_House_Final.map FC7E80C3 384006653 262144 a34bc26e5684f6e1a4c4991ae09adf89fd80ef07 halonet:Power_House_Final.zip +Powerhouse.map 6299A90B 31652268 262144 5a408d25cc9db8ffe8dc4db4f2b2877a8c298672 halomaps:5470 +powerhouse_ai.map CAC8AB1E 101997763 262144 10b3a551dfa53bd4e5c07b9ec395a8c9aee909ab halomaps:5490 +Powerhouse_replica.map 3EDE0956 76182672 262144 aacd0242960e4b3b3e25e006b3bad4c13aac19fb halomaps:5665 +powerhouse_replicav2_beta.map FD77A402 81639453 262144 9cafc131b008def0a42d583f8f58b347a80a4d30 halomaps:5707 +Powerhouse_v2.map F3317333 76641722 262144 44ad0571d44cabba5d53bb239e4da6e1bedb57c6 halomaps:5491 +pr0n.map 54E11646 40519084 262144 026165a05de652ec11b595032223238bbb561b19 halomaps:1337 +practicum.map D97DD3FF 14436820 262144 99a27ed45469eb20ce277be5b3debd89d13954a2 halomaps:3717 +practicum_npb1.map 9678814C 14280252 262144 afc9f5c27afd087240cddf0d9c1fdb4b37ae07fc halomaps:3122 +preachershill.map F1A6F022 13918652 262144 43b3b894bbae75df845b8da2fb75d439137702fa halomaps:265 +precipice.map EB4FC29D 89366708 262144 562e191db412e25467cf5608b914fce743b3d469 halomaps:5708 +precipice_refined.map 3F7017DA 177771574 262144 5b56e3d5206412eb0e8a7d1ba701a868406ac921 halonet:precipice_refined.zip +predator.map 0EA0B8CA 71372295 262144 21f96fd4d4602140fbd61299bc73cf4967ce15ea halomaps:5167 +prescenium.map 87C154F6 59487102 262144 d7b357561b4e775c11c4cbfac9e74b9d42051fcc halomaps:2858 +preservation_site.map 2E9993CA 67382736 262144 d91efbe6f8f300f21721185b27a7044446ed2c93 halonet:preservation_site.zip +Primal_Hunt.map 39542EE6 132986027 262144 40306e70e6febdb566cebb6bb3ee5266d3d0c488 halomaps:3942 +Prime_C3.map DDAC00BE 59855636 262144 0fb418229d4f6521e11a7110774b9fd9d595c57b halomaps:1990 +Prime_C3_Race.map 2FD87B21 60729992 262144 a656b023a0b90661cb54570ba1b73b89943f3acb halomaps:2820 +Prime_T3.map 7B9B8667 59398688 262144 07031b9d622984ac38ec28c7cd9d0221310e0232 halomaps:1991 +prime_t3_KV.map 2B372B38 56172610 262144 4270ae7d87fad1d5212c87c728e21dc7e89c8558 halomaps:4344 +prisoflood.map 7D5FD2D4 35806496 262144 371921b81545475e13ff486006757478aeb8f22a halonet:prisoflood.zip +prison_break.map AC601926 55516756 262144 22428b9e3f67620764ae0adb83ea6b8e40180a55 halomaps:5471 +Prisoner 2.0.map 651611AE 134318344 262144 b88dc92570546d9c89e333c5f200b6c728a91663 halomaps:6557 +prisoner.map 43B81A8B 13170108 262144 9d9b7d9ebc6e18af172e7cf0cdf727245d49d463 halomaps:4785 +prisoner_ai_war.map C7E6966F 54396639 262144 fa7eec746709439daa4fb70b7390f2aa58a76640 halomaps:3617 +prisoner_colour_war.map F2A1B3CD 26826962 262144 adbfa828371040ce281eeeb6886ed2b8d0ab8411 halomaps:5290 +prisoner_pp edition.map 7E706156 15821356 262144 c2f3523a70394beee02138263a0dfccf7bcdf5de halonet:prisoner_pp edition.zip +prisoner_race.map C6F54CA2 24105644 262144 803f78b13b4dbc68b39cb772d53694f545d99e33 halomaps:3501 +prisoner_rm.map 43B81A8B 301190400 262144 e65926668423536cc523540b6bd53232204500f5 halonet:prisoner_rm.zip +prisoner_tmcc.map D9A9E47C 37560004 262144 1f0d2303cee8e112af3c636aa5a18dab94189c4e halonet:prisoner_tmcc.zip +prisoner_ts2_robot_factory.map E4F9783F 17469320 262144 5269574293ab4edec160ec5d2508ee95da8166dd halomaps:5291 +privada(noche).map 79C3055D 99534878 262144 ca1db7ebc305fe369a1a1b73fa25f4ca68ae79d3 halomaps:6753 +prodigy.map 64B9657A 17331017 262144 84f000367724652952fee4b2c2a669058dbb5946 halomaps:1298 +project_subterfuge.map F073DCC1 214209085 262144 c817f28bfb0f8e5d1d45a5ce5833fd01d51631dd halomaps:6241 +projectsalvo.map 00E90C2D 91738138 262144 a360284641424020e6cf2858fc247c63e72142ac halomaps:5472 +promenade_beta.map B8044E38 15581412 262144 a4392ac35992debdbb83c325a9dffcf92bada99d halomaps:266 +Prometheus.map 3378DD2E 212945015 262144 787e19c12d2abc19986f7cc67d1001374b1030e6 halonet:Prometheus.zip +promises.map 15E78A94 36384895 262144 3fc906a620c884ff9c2026b76cb961ebdc283c02 halomaps:5135 +provenance.map EA01C76E 13978624 262144 971363981006e701f4be1bce4a384c948f431075 halomaps:1088 +Proving_Ground.map DE2F1784 195802503 262144 a10713e7e316e96b3f062e044fc141dad31f2e02 halonet:Proving_Ground.zip +prudhoebeta1.0.map 621DE9D0 33715420 262144 0417715b3cbea1fd999c44c33d718602d9262cb8 halonet:prudhoebeta1.0.zip +pruebaxD.map 45A9C643 285091252 262144 d24be032e5eb880e9383d41b9968c07f8fdc8e95 halonet:pruebaxD.zip +pry-h4-infinyty_beta1-azu.map ACB35846 377672131 262144 f0428ea9712261b4bcc090941136ea44c86bff66 halonet:pry-h4-infinyty_beta1-azu.zip +ps_rainbow_road.map 12C0EF7F 63510102 262144 9aac2fa31eac32e4fc3549fafe550c0d8d22164f halonet:ps_rainbow_road.zip +pso_da.map BAA69173 14909905 262144 c7983192aa701771affe2e22fea767d88c3bd1f0 halomaps:926 +psyconeedletastic.map 5D81DA12 21953954 262144 eb7a41cd4bba2e5626340a8f05b8db7c743cb00a halomaps:2261 +PTM-Permafrost.map AC842DB0 21956070 262144 91bfefc20eef67b03d7ac7bc67a8c7c1932fd0d6 halomaps:6496 +public_01.map 09E53D2B 16717845 262144 ba5bca63bea491fa8dcf7fecd7ee816d4c22beec halomaps:5374 +public_02.map 52631412 26380510 262144 7dd96f36b9cfefb8c17572e52c6d7a72943e16c9 halomaps:5375 +Pueblo_Fantasma_BETA.map 860B13AD 99090448 262144 89935b3fff10cc572d615163fdb37c0ef663aa99 halomaps:5790 +Pueblo_Mexicano.map 33D00A75 253225669 262144 1f2b97ffda799209991e03a78990f86c0c81fb70 halonet:Pueblo_Mexicano.zip +purgatory_public_beta.map 67A3922A 21419968 262144 0c8828dac304c7042abf455008278fd8c653d960 halomaps:1638 +purity.map FDD0B808 76511245 262144 854311204ad2f94ae82c1e6bfac5b37e28f1c2d1 halomaps:4810 +purity_and_innocence.map AF7BA1D0 23004144 262144 f862c8074d11d903d34301a3c65b476ab8a72b31 halomaps:2386 +purity_and_innocence_ver2.0.map F24EA998 23015421 262144 e18d4b206e58c7a4e1bdb09eab5688c2f7700e62 halomaps:2440 +purity_and_innocence_ver3.0.map 41F6824B 23015965 262144 bd2d8fedb40c5b73c8641c3ae90b0454f30959f0 halomaps:2441 +purple-screen.map 08A90538 22815408 262144 ea0859d9a5382a4c782def2525d316e95dc3265c halomaps:5066 +putput.map AF2F0B84 14171580 262144 e2294fc3903879c44756491f0fcf7d8cc52e40e4 halomaps:4786 +putput_ftw.map 023902F1 56340428 262144 74a5be074ba62c274f0385270c9d33e7a81a6ee5 halomaps:4604 +putput_rm.map AF2F0B84 300258336 262144 bb22de71d8e3bf9fe5d4f134f68056134b95b3e9 halonet:putput_rm.zip +putput_tmcc.map AA17E680 38302104 262144 700d831a0118f6af629bcb966bf731de5a1143bf halonet:putput_tmcc.zip +Pwn_elites.map 1321F5EC 17376172 262144 b6b0f6c53e15fc97d233f5f4b1ae5381d0b890de halomaps:2615 +pyramid-of-power.map EE9C7035 17114992 262144 ce455a4f5724f6322964e8c118a0006dc5c4ae2b halonet:pyramid-of-power.zip +pyramid.map DA22D852 15228144 262144 7344189757ec56173367536cbcdd4b9ca2e7faa5 halomaps:361 +pyramid_alpha.map 1CC5234E 94789640 262144 2c6248ecc1b95c68d88d7df601ac203b252bf75d halomaps:3567 +Pyramids.map 4E42243E 16471309 262144 ea7b0882a936cfac65b8b321295e4519a9de9fe7 halomaps:6024 +Qauntum_Realm.map 447DED2B 232286150 262144 73637f680cf812fe363308dde3094318423a6e8c halonet:Qauntum_Realm.zip +qpq.map D900BAF1 55089270 262144 d09d41c3db8ae8ce0dfd7b557db6a0946451f9c9 halomaps:6905 +qpq_zambies0,4.map 0908333E 69717063 262144 231d6edb689cd21b1922256688f938f9c939eabb halonet:qpq_zambies0,4.zip +quadropond.map 6B751B82 17906336 262144 eca5b278bbc376025ff6ccfd2b67718d2ae5cdd9 halomaps:402 +quagmire-v2.map 62306AC9 90622195 262144 80b76b1bbd5a4197661b7b8081723ae07db601e0 halomaps:5265 +quagmire.map 02E4FC3D 22242880 262144 6790eac5f989974a60139d93e1a959b470485066 halomaps:267 +Quagmire_Daylight.map 20FD4D65 25500580 262144 ede1a1890c12571c8f59bcd840dc5063dcece7b1 halomaps:2533 +Quantum_Realm.map 447DED2B 232286150 262144 81bc26703fd52f15bcc1d154d877a09a678d7bd7 halonet:Quantum_Realm.zip +quarantined.map ADC8B924 69038429 262144 46b992efd49bd8e6241d7dfde85585be5a14ea0e halonet:quarantined.zip +Quarantined_Again.map 1F507169 361585234 262144 aaa31110d11cef69af82cf4b71f96d4968396206 halonet:Quarantined_Again.zip +quarentine_zone.map FC783ABF 146851242 262144 ec660b6ff781cc06e1a9c06dd1e2ef601ca3867b halomaps:5027 +quarry_site.map 614D3EAA 16239620 262144 4100a19f69f4763c3e7233a021bb572b09d0245b halomaps:2696 +quick_death.map A86ABCA6 14034840 262144 79105c755b8d98b83c894efbeefba6e6edba8828 halomaps:475 +quick_feet.map BC280601 17344617 262144 3edbf07cbe174b9618a8b216e9c1971cea6e5fa8 halomaps:4267 +quickest.map B2471730 12185104 262144 0e0add37b5f7c50a206b1d36bed51be9bbdd315b halomaps:268 +qwertyuiop_test_map.map 8DD9DFA3 14237924 262144 ee3426aae22a0cef6e187292b2350b59ce49d427 halomaps:5640 +r_legado.map CC381A42 204261087 262144 5f3759b73bcb673e9e8588057511a49c65bd031b halonet:r_legado.zip +raaar.map D900BAF1 55089270 262144 2a2e031a9b77c02b21dd92e0dc104eb0bd6de166 halomaps:6906 +Race House.map 3B32F167 295167781 262144 b8464fa3c6d58e79404db199d3966a625b292966 halonet:Race House.zip +Race-Track-#1.map 8E868FBD 16986596 262144 8f4da60aebd237a9243121cf853732af7906a19c halomaps:7111 +Race-Track-#2.map 6F7E805D 31152171 262144 710fcfd76605883817fbe167cf95d15521f58dfa halonet:Race-Track-#2.zip +race_track.map 3DC2FD9E 13002056 262144 0b0b1126b87b9bc9bb787601f1d6f7214dc28759 halomaps:312 +race_warofhog.map 645CDDAE 33557287 262144 98a75bc124690357d43f7aee4e6346fd7911a6cd halomaps:4722 +raceofpain.map 6E52FFB6 13914244 262144 dfdf1ee0f056c3bfbea612b026fbe57e6e4fa1a3 halomaps:4914 +raceofpain2.map A2BBCC64 75955318 262144 1c4b2e70b1652a701de683a7aa3c96cd9700d30d halomaps:4944 +Racers-city.map 682566CD 20678500 262144 89e95bb6d17e51b738dd6a9ac8130c0faff5a37a halonet:Racers-city.zip +racetime.map 4F235804 33110018 262144 43730d297f0db7c0edf44b56675490b7cf03b680 halomaps:3968 +raceway-mod.map B8390513 21377831 262144 7e0898881bb47a00d2e30276fbd339f8ffbacd30 halonet:raceway-mod.zip +racingfield.map A947BB44 14405656 262144 33843a4cb27e5ee7d1a1b62f28c13db7eaf61719 halomaps:4518 +racist.map 06B5E736 19483007 262144 e45331a1d9b09f8681226560bd82d236228b263a halomaps:7010 +radius-ai-demo.map 1D988CE1 71823053 262144 38164030ac4f1cd27c65baba415d94272c2927e0 halomaps:6754 +radius.map 1EF590E9 17804280 262144 b4b9979c387822bd58782543b6679503d6ddc34d halomaps:3601 +Raging_Troll.map D602630F 12796624 262144 289054a8a1dcad810c6460ab689ee6c40ae87549 halomaps:5299 +ragnarok.map 0787CF18 389319286 262144 8f9fe1bdfd84c300a96f110276b69feedcd1ee5f halomaps:6722 +rainbow-road,v2.map 12C0EF7F 63483847 262144 a97e41594b9a389560ef39d6156e49057d095896 halonet:rainbow-road,v2.zip +rainbow-road-v1,1.map 2F06E09C 15378396 262144 809d2dbcbfa55b25315c70a69bc24260377f0bb4 halonet:rainbow-road-v1,1.zip +rainbow-road-v2,1.map C5D22869 30360391 262144 280802652c668c7dd8f2fb25e074ee021fc301d8 halonet:rainbow-road-v2,1.zip +rainbow-road-v2.map 75225E82 30525005 262144 af96d9da08dbed3617dfc892034862ba467face3 halomaps:2859 +rainbow-road-v3.map E311A1A4 28870489 262144 d08eee73b0063bb1e7e2b0f7c05e3a1c10e224bd halomaps:3355 +rainbow-road-v4.map 81038764 35707767 262144 2091394f9921f4ad10ae636e33c2c8a8a383c972 halomaps:3765 +rainbow-road-v5.map 20253DF1 27978115 262144 8244e280f01667cc58212cc44a263a5be3c640ab halomaps:3920 +rainbow-road.map 12C0EF7F 16419488 262144 9b3767b5612ccc0bdbab73caeedc79aef79da573 halomaps:2505 +rainwash0.5.map 85E6C0E5 13031268 262144 d978db6a7f6a6c9e1d5e5e60d326d340886a23ae halomaps:2582 +rainy_nationalpark.map 6C883CFD 44833778 262144 4f299295dea2aa99538b91f31e1c68d0220c0483 halomaps:3648 +Rampage.map D981C231 54730789 262144 f147fb6886a28bbf595dbdced0f3a8136ccb852a halomaps:6767 +rampin.map FE166FE7 68757682 262144 0ab9069d7287e5b0c7e79f527672c28db42967e2 halomaps:6154 +randombattle_v2_beta.map 9071CDDD 76727261 262144 25cf00a5a6e36c3b06ef04021bfd4e69fdd5c5e1 halomaps:5691 +range.map E708405A 14852912 262144 bc88b7ffb38c570a4ac5c050a113ba9101a0bb1b halomaps:584 +rankin2_multiplayer.map B80B495D 47427599 262144 e7a200e77082173d16751cec7175cd8a7ee595f7 halomaps:4076 +Ratmaze.map 7D19EA46 12971108 262144 0756a53920c62716eb6c0a65873f172e35c23f87 halomaps:1135 +ratrace.map F7F8E14C 12762436 262144 5aa4bc7b6306fc5c02333faeb8149d2adc1ba523 halomaps:4787 +ratrace2507.map 918DD9F1 131994274 262144 187301b4baec43d1c2690b95d410c0f5c7f82e2c halomaps:6418 +ratrace_pp edition.map 7E706156 15409800 262144 112e446fb18c3a033e8a7e8df74056289e2de862 halonet:ratrace_pp edition.zip +ratrace_rm.map F7F8E14C 310398628 262144 e02203e7f79dcacc6a6aca172cb9d4261b1339e4 halonet:ratrace_rm.zip +ratrace_tmcc.map E51FCD4E 39528140 262144 972d5701b1518f75d139fcb5826bac356281836e halonet:ratrace_tmcc.zip +ratraceaibeta.map 36BE94EF 52951519 262144 c536465668a45296973b106af951be0d7066e4fd halomaps:3618 +ratraces.map CA3BCE8A 22044592 262144 835b6b8c4046cc11b8543fbf0cecf0986e55bb4a halomaps:3502 +rave_fight.map 3A227B59 102381941 262144 8a23d317a3fc191a7c66a6235784d74b537c672c halomaps:6398 +ravine.map D1F8B9EA 35312092 262144 815fbbddb16b4d430a206263acfc99282c6486fb halomaps:552 +Razoredge_canyon.map 6B757976 23990531 262144 a54c6525a255b07b6949339e0eeddc527d04f0e0 halomaps:3619 +RE-Storage.map C8BF6EC9 17179124 262144 4134a917ba7df9bbe6104ceaad39c1089b4d75b4 halomaps:618 +Reach mountain.map 4EA4D411 258475368 262144 78fa167e05dd2d20e4a25f0b130b28fa5f6a3ed7 halonet:Reach mountain.zip +reach_ARtest.map 2C4FFF9D 59579647 262144 d6527826e7b1f4454854a6e8ff95b933bab68e9b halomaps:5473 +reach_battlefield.map 9A159316 132258956 262144 02310a0124c71667697e8e9e61591e65e2fd95c7 halomaps:5809 +Reach_Battlefield_V2.map A32D5D29 130058929 262144 414920be05d96c427b1587705ce279230b3062e3 halomaps:5817 +reach_beta.map 534C5F35 112869526 262144 54885461120342a8729a3457e3b4a9105f3784e0 halomaps:5569 +reach_beta_2.map 0E2535CC 84598380 262144 2f571465273fbdf8a2db90e7040c7251e53d9174 halomaps:5810 +reach_Canyon.map C49276AD 13668792 262144 36de07e2d1006a51b4c6f3e8d9cf0a382e1da986 halomaps:4945 +REACH_City.map 2BD4374F 45346455 262144 69f371d53b653a713bc5c4af3d4d1a85f78a9680 halomaps:1612 +reach_damnation_ai.map 82BFEAF5 161282011 262144 9d4dff5a8ead5a022be9f9afc1562882fe4801eb halomaps:6303 +reach_hangemhigh.map C52222D1 37546624 262144 3d63ab7e2bf0e32bfd9060d10a2c9709703a8706 halomaps:5734 +reach_hangemhigh_final.map A5B9F92E 63873499 262144 5d5ec062e53375c9586ec5a3d4463d521c401095 halomaps:5966 +reach_mod_cov.map 9204CEDE 390731681 262144 e13d6a10c00885e2a4d7fcb453ccf6ddf600dda4 halonet:reach_mod_cov.zip +reach_mod_human.map 8DA04676 388539748 262144 9619c43d84837cca5fb86764c0ef6c19a4840d6e halonet:reach_mod_human.zip +reach_poa_mod_multi.map DD54CF04 114287558 262144 b4a2cb23739e23184388fb57dda7f5c8040eb624 halomaps:5744 +reachsucks.map 6D7FDE53 169324907 262144 72cc885f42d5d3e74c278f8118f18941023c85fd halonet:reachsucks.zip +reactor.map B34B1CC2 13519704 262144 d75b6c8af9085583a612d5e5222eb189dc0be491 halomaps:7062 +Reactor_Team-Slayer.map 6C742BAD 20097808 262144 d172cd27af7782eb5fac8e8fc384cc274b220b5a halonet:Reactor_Team-Slayer.zip +Realcanyon.map B628E9B7 30729519 262144 ad48436d02ec802480ddfa8d54926a8664a8fcc6 halomaps:3150 +realgulch.map 446ED552 28790772 262144 ace11d1eed4a75014c52051b1e567bbf83712c60 halomaps:2994 +Realnation.map 1CF3B30D 36534054 262144 24a5594bf08b790510e70d214fceb24496c5d65e halomaps:3151 +realwinder.map 2EEA02E6 39412652 262144 6ebbeb4572913533456ec666522050c077488203 halomaps:2972 +rebound.map 9EE2BDD5 13832409 262144 267657dbe95e52d906360314cd6547e3420ea42e halomaps:2373 +recharge.map 3B80EE25 13690804 262144 26ccf0021114b2b71c0fd68d04ce94ad80e62670 halomaps:310 +ReconRace.map 742575A5 53759760 262144 d679dbea3a7f208b9f0c45487c383346f7d5111a halomaps:5160 +red vs blue 2.map B864A0A3 115529006 262144 9968979bffb515c3c44118c690bf0b8e12893d6f halonet:red vs blue 2.zip +red vs blue.map 542F519A 31340118 262144 2903a89d144f114b4931f31ff73e331c315b80ec halonet:red vs blue.zip +Red_Feather_Ranch.map FC5214E6 45115761 262144 054fa26fa78314a001017ddfa20291d1f76b909b halomaps:619 +Red_vs_blue.map 5E15D11F 15560437 262144 8373cd21cc90f32a79e948435e5ccc2d6520a1ee halomaps:6429 +Red_vs_blue_v2.map 7A76688F 15580777 262144 086d5951c2d0e256218182c42b8e3e67ba48293f halomaps:6430 +redemption.map 61F6CE1C 18110033 262144 5cbec99d2c7749dc217f67aee6797c3daf22fd63 halomaps:929 +redmountain_beta.map C361BB67 16809140 262144 816aede6c4c313baebed62207c317f5ced46eada halomaps:1816 +refusal.map 32E27E54 19101408 262144 51aa06754e080653907523b4d6fa15367dabf2b6 halomaps:3620 +regret.map 0470BEC1 44205943 262144 75aef92e9be94d41c25d9b1041d7e15c29cf1df4 halomaps:1227 +reilight.map 5B7B3C8E 40257452 262144 8e02d14c1d79c72d24241ec8d458f15d4cac0ce0 halomaps:7036 +Relax_beta.map FDD46FAE 31881837 262144 bf52b0cdf2a1ee748d2f2cdb67e906d3fb449bbc halomaps:3296 +relaxe1.map 885CC5C7 25432342 262144 2b7eced26717622d021fe3121c1b9a196e8fa66f halomaps:4433 +released.map E0581BD8 24155844 262144 07a74af2a0a00e90edbe23faedd45f9b70bd5c67 halonet:Released.zip +Relic_H2_v2.map 41C0E417 57221935 262144 5a6454e79d63abc2ae613d639673695661dbb815 halomaps:2583 +Relic_v0.6 alpha.map 23A04706 60109753 262144 ba2f7218c5a8dec89be42a0b9c64b4017cf96074 halomaps:3416 +remains.map 9CFC0277 30856084 262144 7ee298c1fd2fc99c611d4912ca781f9507fd9e1d halomaps:4811 +remnants.map 9EF7A0D9 44654140 262144 d50193bf3059c8cd194124d460f820bb8c5553d6 halomaps:1070 +remnants_INSATIABLE.map 4AAB3FB3 89131807 262144 8d43b8e299220c2a8b52a5f0214628afa8268f0a halomaps:5048 +remote.map C6288C06 13265476 262144 e770b4fc4d341e197f079a2ae131bf560b36aad7 halomaps:1552 +renaissance.map B8712640 58609833 262144 b05b1a9ec69497a0ed64fb6352a62b7004ac795e halonet:renaissance.zip +render_test.map C8C3ECBD 30889728 262144 c30c551307c1370c92d9dc9af7aea3358c681551 halonet:render_test.zip +repression-firefight.map D793B4E1 296158546 262144 70842c08413de34d4e066ef8d252de1e08adc3c4 halomaps:6931 +repression.map 63A5AEC8 26060568 262144 3f45f7ed5ef8a8621331076ee0030d5b1c848c3a halomaps:4232 +requiem.map 9F409185 55512544 262144 78452a6c9f5a5d2545ee73a038826b59c0e4e609 halomaps:6155 +rescate_de_johnson.map 745FBB70 80667584 262144 278463eb1b328ecf4a2202763b42e534720df627 halonet:rescate_de_johnson.zip +reserection.map 22C16FDF 105419560 262144 e770bdac5cf5c5af6e4d41a8b0eb4b7c8c4396c9 halomaps:5709 +residentevilhalo.map 124013DC 19642241 262144 ba8fe580f133d0f1df4095a37eb338eed7ba67a1 halomaps:3297 +resistance.map 37155C73 156479536 262144 d074f63e6c2c57b97a011d0d5863b2682fc3335c halomaps:5625 +Resortv2.map 849940C5 81822342 262144 38e73b4e69a8078d4b26c8e8da1de93523ac6f2f halomaps:3039 +restless.map 8868C3ED 37573335 262144 81ff29613f1fb2d8acafa40ead5d7ff90cf6bcb2 halomaps:2550 +resurrection.map 25253DAA 30566868 262144 49c6f828d1023f6e02738016f45fa5c31c311647 halomaps:1030 +resurrection_mp.map 7CCF6411 30918920 262144 1a54165591ecad3343ea0b2e83ae20d0c7e00acf halomaps:1031 +retribution.map D9E5A1B9 75987337 262144 a8e6f38f514268b230093e75b5db3ab7f890878f halomaps:2093 +retribution1.1.map AFD436B1 76048649 262144 da8dca030061b23d4cacf8f8069b4245065b3c72 halomaps:2130 +return_of_the_covenant_c1.map BC64626B 49407943 262144 09f2fb8e340b067ac418e08ab80f74d9ecb0bd93 halomaps:2561 +return_of_the_covenant_c2.map E7C70F40 103476043 262144 e2af62a87aca9354e7b5096eb44c180af26f57ff halomaps:2094 +reus_ai.map 146ED312 271342167 262144 22b0b1e6beecb15ea58d747f589a65b2d25ae1e4 halonet:reus_ai.zip +rev_beavercreek_cavebeta.map 284C532B 244813030 262144 014fb641c39568608fe9387935d09d636f9dfbfd halonet:rev_beavercreek_cavebeta.zip +rev_carousel_cavebeta.map 5C12B5E7 229722652 262144 10a9e87b15390e2fcf4faaf1986bd3656294f884 halonet:rev_carousel_cavebeta.zip +rev_damnation_delta_cavebeta.map 072A0C62 248819990 262144 30a6dd2a2b216c8a82ab4ab11e65bdfac95da6c9 halonet:rev_damnation_delta_cavebeta.zip +rev_delta_station_cavebeta.map 5B16494C 243649424 262144 c48d7c91bb43d0bf2b19f555ceb38784ba8e2404 halonet:rev_delta_station_cavebeta.zip +rev_deltaruins_cavebeta.map 96CAA71F 296318562 262144 3f8eb5a8f6144c81a0a686eab2668ad5881dbf7f halonet:rev_deltaruins_cavebeta.zip +rev_dichotomy_cavebeta.map 90C4523F 200119049 262144 99b0795c28f80101db02fb60ce95475058218e64 halonet:rev_dichotomy_cavebeta.zip +rev_downrush_cavebeta.map 69D39D1D 231463746 262144 be64090bf6c6ec47e74f89a550bd665dcbdf954b halonet:rev_downrush_cavebeta.zip +rev_fortress_cavebeta.map 81690F91 213837313 262144 c2ca73cf0840346bb56ace94548e5c89d6de0696 halonet:rev_fortress_cavebeta.zip +rev_gridiron_cavebeta.map CC3BE29D 228714199 262144 ee08f731ad176c60c90f56731136ba072519d9ea halonet:rev_gridiron_cavebeta.zip +rev_hangemhigh_cavebeta.map EF9452D8 231244833 262144 b09af133f33e6c51f58f1fe76c937d6fdefac985 halonet:rev_hangemhigh_cavebeta.zip +rev_icefields_cavebeta.map 33A57F99 242315954 262144 e2e67cba4b72579e35b14c93c09aab23e944b444 halonet:rev_icefields_cavebeta.zip +rev_immure_cavebeta.map 438A0219 238776541 262144 07635a35036259e6eed29363a497c91c16543041 halonet:rev_immure_cavebeta.zip +rev_lockout_cavebeta.map 92AB758A 227403257 262144 a18deb45c85d26f7537648a8f4b45cb4556d9972 halonet:rev_lockout_cavebeta.zip +rev_midship_cavebeta.map C13A86C8 243680494 262144 67cdc1354c38f50facb5c2b7697c9db64ca668b7 halonet:rev_midship_cavebeta.zip +rev_paradox_cavebeta.map D8ED5249 234089463 262144 3e9a04656bc1769cb2b11648640d46dbe17dc69b halonet:rev_paradox_cavebeta.zip +rev_portent_cavebeta.map C6869835 275078087 262144 b532569ce2874fce1a0f7b8196459e0bfa0f05cc halonet:rev_portent_cavebeta.zip +rev_prisoner_cavebeta.map 2AD4C033 214937293 262144 4ca53f0d76999ad3f953e892a88036ce02795876 halonet:rev_prisoner_cavebeta.zip +rev_ratrace_cavebeta.map 60B52617 239266574 262144 c905e4130d8e50dbe8bc874c2eda84f1551c6c5e halonet:rev_ratrace_cavebeta.zip +rev_sanctuary_cavebeta.map 73D1619F 265189418 262144 e24ef1f091a8e5490965c5127c37fbbeedfc20f0 halonet:rev_sanctuary_cavebeta.zip +rev_savior_cave_prerelease.map D11D0F9E 236428296 262144 5a7a093f4e61644b19efe28af1a4f29f3635e040 halonet:rev_savior_cave_prerelease.zip +rev_shockwave_cavebeta.map E85E88CA 213709021 262144 7c1f4fb1ce8c73a5b05309abab7cd6dfb518f307 halonet:rev_shockwave_cavebeta.zip +rev_snowcast_cavebeta.map ED7663A9 231511233 262144 1ea131e1c2af978c8bb13a1b67bd91da86951bb2 halonet:rev_snowcast_cavebeta.zip +rev_snowed_in_cavebeta.map 21C838FC 254463249 262144 b0c42f39bf52c02f24aa5539e4ad63a424064d8d halonet:rev_snowed_in_cavebeta.zip +rev_tensity_cavebeta.map 5FC5C68D 249419425 262144 e540d49ea20674be95a4c68872179f67de96c4d6 halonet:rev_tensity_cavebeta.zip +rev_trench_cavebeta.map 072959DA 231886662 262144 3306a86b486c49e8cad4dd7ced2086ed33df6a7b halonet:rev_trench_cavebeta.zip +rev_valhalla_cavebeta.map C6F01EED 260587012 262144 137d52f707e2fc6ed578d10949fdd108b2937c02 halonet:rev_valhalla_cavebeta.zip +rev_wizard_cavebeta.map C0A0B2CA 198227924 262144 36feed1aa3324e31a7304722abcc1f40e0a4a9fa halonet:rev_wizard_cavebeta.zip +revelations.map 3735450B 107649486 262144 59fb7323a963922d9d8079b2c5bc96ee79fe6498 halomaps:4992 +revenant.map 8CA6C57C 24229992 262144 0519de5165f6f60515775feaf1ceaf82f8d14f57 halomaps:622 +revoltijo.map C742B51C 49743592 262144 2d78f319f0741c93e663f3aed6a41cb681aa5183 halomaps:6399 +revolucion_mexicana.map 49E27A2D 123888558 262144 1b7bd1ab1f555b3a2abc974c62855eca7f479e39 halomaps:5028 +revolution.map 264E6061 37449051 262144 0298ae995c8c54b50fda776feeb15cd96bbaad8a halomaps:1745 +revolutions.map 7F0EAD65 41142460 262144 18bb1290c16142f20fdf7bb7ca85703a0015d5b1 halomaps:1758 +Revolved.map 97D13093 18046766 262144 22f37d70cebad9fdc327fa347326432557e723c9 halomaps:270 +revolver.map F19563D5 14723552 262144 9d9985897363ba9cf6c0aaac51a0fc2dcec17b29 halomaps:756 +rez.map F2752437 18887773 262144 8721df5f0bc817298ed63e8e41b329372456af4f halomaps:1493 +RG-Battle-Buggy.map F87A7A03 29413818 262144 673092e7400ebc6558fef2fcb08a3e8562729235 halonet:RG-Battle-Buggy.zip +RG-Desert-Storm.map 9CA6C830 129995545 262144 e9b57313a6ba549b3d6106f7b7a1143020c35f16 halonet:RG-Desert-Storm.zip +RG-Isolation.map 976CD880 52853357 262144 75ece3534328606fdda0363b47ccab3496cb11c7 halonet:RG-Isolation.zip +RG.map 077A5AD8 84534982 262144 fb1a563477868b66cfa4d015b88d9619fb31e541 halomaps:6069 +RG_Amnesty.map 569B04D9 142886276 262144 cc8df3fc78325438cf8d4bb147ddd60102fb8cd3 halonet:RG_Amnesty.zip +RG_Battle_Creek.map 122DD3AF 102734805 262144 eef03b1b561d0b34b2fef6f0d9515ebad8763897 halonet:RG_Battle_Creek.zip +RG_Bleakness.map 6CE8F319 355753465 262144 5eb10e3ba13adeb54f719ee61135cfc5afb65f6f halonet:RG_Bleakness.zip +RG_Boardingaction.map CDB3D299 147747871 262144 93078b38e0492484f0ba3137451d33016a7b7ca2 halonet:RG_Boardingaction.zip +RG_Coagulation.map 28424D94 190962227 262144 7aa3825030bc4df69d13a80c38619e51db2e95be halonet:RG_Coagulation.zip +RG_Double_Gulch.map 01E97CED 138610021 262144 c91875104a32f4da3b75b49bb74c6f23ba78669c halonet:RG_Double_Gulch.zip +RG_Double_Gulch2.map 97805C36 141461177 262144 d671b5399d1982d50234a8f17df2aedf5e7d091c halonet:RG_Double_Gulch2.zip +RG_Immure.map 00000000 161781141 262144 2a01ccd2a56fa8576c3b988017a2a69182f2d008 halonet:RG_Immure.zip +RG_Intensity.map BDCA6D1B 392923167 262144 291d263f745f2052652c603873e32cda8615558f halonet:RG_Intensity.zip +rider.map 00214396 14520424 262144 b8bb86e250f6cc44596ba77dafa64a9983fdca35 halomaps:2442 +rio_firefight.map 3408602A 160133766 262144 ac8e63f4072576cb292621bb7fff770cf7d070a7 halomaps:4693 +Riot.map 25F493C3 219626671 262144 170befb7b398cb56f1eb6cbd5d13e43e37ae1877 halonet:Riot.zip +Riotsgulch.map 7B309554 13936092 262144 51bde2f78e9467da2c43460f2514b219224d54cb halomaps:1274 +RIP_Blood.map E08AF3D0 52764594 262144 b47f700d3ac745b7ea77f51fa1d8a230bd8ddc54 halonet:RIP_Blood.zip +ripking.map 7FA9ECC9 23367096 262144 cc6ed2d94ec0962aa7abadf87f7f4ee0c0c409dd halomaps:2697 +rivalwars.map 96A93DE6 82491068 262144 624828e583e4ef69c12d1ec876d7943f9c4b8dff halomaps:4369 +river.map 8EAE06F3 28541241 262144 2338d1e290245e09665863716d7be9884c133ea1 halomaps:2860 +River_Madness.map 5C043349 170612887 262144 0faf1a9cd4cd9e1ebc6721ee67ab1f663ce90efc halonet:River_Madness.zip +river_nuevo.map 9E0DF5DA 73994869 262144 5362b3b5e1f5854b6a3ccdf94b4e4aedcacfe23c halonet:river_nuevo.zip +river_rage.map 2984FE9E 56900813 262144 457c665f10e5c9976f7f043f9499ec9eebd4639e halomaps:3040 +RiverBlast1_Ang88.map FA04C871 17378276 262144 3ba43d9373f88ee6971c82db6138f9185b151b24 halomaps:271 +riverside.map 63EB778C 15590751 262144 b7d8f41764da8fa43af1c357279edbd21bb7f118 halomaps:3795 +RM_vengeance.map B20BADF4 34957230 262144 b0d0947480f1390b545874393f744f819ff55868 halomaps:4991 +rmt_gulch.map 67CC18F5 90616548 262144 bb3a5c35461604428fa9908ae0b353e887ba8945 halomaps:5492 +RMT_hog_run_beta.map 148ACB5B 113699183 262144 d972010601ea2f4c961f15d142d643aaba411436 halomaps:5505 +RNDM_Ascension.map 8D9F2EF3 83387093 262144 bd371ddbf40615afc18354d7263d51eed84f115a halomaps:2821 +RNDM_Forerunner_Waste_Storage.map 35E9518A 71355819 262144 2f4f4fd4c43ecb1da8f6a2270186f2965d040cc9 halomaps:2822 +RNDM_lockdown.map A2B63545 18058993 262144 e04dd8cf885ffa422350d78dac4fe0ef45517c9e halomaps:2812 +roadv1a.map 22C7C7B6 95268992 262144 0148562d6f6aaa17d2fe43b9c654ecc51e42ea26 halomaps:6679 +Roblox_Challenge.map 066E28EA 148128225 262144 a939368cc7696586126a90ae70ee7851fb869dcf halonet:Roblox_Challenge.zip +rock fields.map 96D2BFFF 32097819 262144 2747effcc83840acc6b195db76ebd33bdc0f0353 halomaps:5967 +rocket_arena.map 0E8E955E 49144940 262144 6d6ab717d70a900d6584cb00c9f00f38bb5a42e9 halomaps:4097 +rocketgulch.map AB391244 36110228 262144 b0dcb8f07c0e02038462c91ff0aeb1ca3dd96216 halomaps:2927 +rocketwinder.map A3098C45 35951960 262144 c11fa196d056b4ab6476639c14d5f044d8d1b588 halomaps:4412 +rockfall.map 3AA8837E 86573375 262144 cd2161af6070802c80ecb7aba0ae9175f3697f8f halomaps:2959 +rockslide.map 6F0A1833 33446099 262144 c833a94234dfe8ae29a65caae8437fbeeec04631 halomaps:2995 +rocky.map 2BC0DDDB 13817844 262144 5fa918fdc58ef034335d39e73d1466c8b1eee5f7 halomaps:329 +rockycreekAI.map D541DA45 47623546 262144 160e70fc037d51daa0d6421c27d95c216f9f2a84 halomaps:3602 +Rojos-vs-Azules.map 67AB571F 270444415 262144 5464a77ebee371939927b47e5d463e3c5b596ca6 halonet:Rojos-vs-Azules.zip +rollingonwards.map 9C410971 18467600 262144 b81dd8a69c7897a4770faec58991231ab74c1cce halomaps:330 +room.map 09C65F43 13954596 262144 cb6650c871319d19267f10ecf24a29f808c57af7 halomaps:342 +room_final.map 69D86D63 18572996 262144 982a293e37d2a8787d5511b956228e13fb3662a5 halomaps:511 +roomsofdeath.map 587ED686 13655516 262144 0ca486e5b98aeb5d2ba7c350bf6da2e6a86c22a9 halomaps:2042 +rp_gamma_build20.map 049E58DF 179191246 262144 ed9dfbfa3d8bb75521e74b99bd501a459dee92e0 halomaps:5512 +rp_gamma_build22.map 5543D2C1 179913162 262144 5e2bd3cb04c622824d5f5022b9d2758a698dd146 halonet:rp_gamma_build22.zip +rp_gamma_eva.map 93CB5571 154495762 262144 79f84eb24a8f5d11f3336bf30166722bdfea8ff2 halomaps:5513 +rp_gamma_marine.map 20EDC5A1 178630374 262144 55c79878a6753b91ce781afba907f990ede76bad halomaps:5514 +rp_sealab.map 25990692 39686404 262144 259229e353e0d388c978657b845ec238624588d4 halomaps:3554 +rpg 4 test alpha4.map 3647D088 132713286 262144 e9242e59b8b4a5aacdb4c09c8aa21f9133b1ecc7 halomaps:4203 +RPG-campsite.map D9C3F817 40407719 262144 d921b2b74a729aa9e0b747932a12ff4fc1712490 halomaps:4098 +RPG-west.map 863585F4 58920971 262144 6f7248920c8fcfce46b1a063f7c972a6f0ffddff halomaps:4434 +RPG_6_Mod.map DE1BEA3F 120847077 262144 f943d6e620e1b6eb278160121c68aecc624fd3ff halomaps:5735 +RPG_6_Mod_Final.map 3EF88192 132225528 262144 1622d8b3e65835f598697b17aacdff7259cfe373 halomaps:5818 +RPG_AI_Beta4_v1.map C1B2F29B 132639426 262144 e230183e9cd6a0a99da7a40b2db588b7b19235a7 halomaps:3428 +RPG_beta.map 55953287 60901028 262144 2aa4836cdbab647bbefe94a0e04376d38eb877c1 halomaps:1935 +rpg_beta3.map 505804AF 68543540 262144 08c203583e6f8667d029400413bf0b2c5a3d01d8 halomaps:1963 +RPG_beta4-3.map 93776EF6 119925827 262144 f9c22880f9d123c22c894fde862235063696eb36 halomaps:3240 +rpg_beta4-4.map CE4D5054 125877747 262144 3b90970674b36167710b70e48333ba16f27170fc halomaps:3322 +rpg_beta4.2.map DF803B4C 75176134 262144 d0395ef05222c912d900e91b94839b59a91d705c halomaps:3209 +rpg_beta4.map 74F4DD7E 63039950 262144 ed9d03f674bb73ecf070c2cea28a419e3c8f9068 halomaps:2443 +RPG_Beta5.map 6F715A50 97577174 262144 bb9a566f14d624887b942a8467cb8e01887e2754 halomaps:3926 +rpg_beta5_odst.map E1091291 125399514 262144 c9f62e67f3e676bfd02e89f08507fb3e05ff2eb3 halomaps:5189 +RPG_Beta6.map 37CA8226 63887384 262144 121fbae81bb97b3ce8be0f2f78d3fef736198f61 halomaps:4476 +rpg_beta6_2.map 073077D3 154026138 262144 eb080f13926d775dc5665d8d52c3892802c3a30f halomaps:5250 +RPG_Beta7.map 06BC7C9A 148659639 262144 bf98ab0515d73f298ab61aadadeea067d987797d halomaps:6599 +rpg_beta_4-5_snow_assault_alpha.map 8F8056AB 126528447 262144 ee1b2f4e5b1b735ac1ba3d99a3c2677140b70b3d halomaps:3483 +rpg_beta_44mod.map 18A51A8E 109122046 262144 9eb7a3759d26788ebc0b3ec807e82cf71f12936b halomaps:3796 +rpg_beta_5_final_version.map 37100D7E 113379893 262144 9bdf2b8d80e4bd15c808cb66f69756ef8110779c halomaps:5736 +RPG_beta_6.2_Frostbite.map 662AA155 131203899 262144 3191c29307c594bdbe13b5e34fc8e33f571b021d halomaps:6306 +RPG_BETA_AI.map DA5A5EE7 117538030 262144 49585dbd9640f544348d6468ad183ab60621d740 halomaps:3084 +Rpg_beta_AI_V2.map EADD2D93 105840946 262144 ffcaf3cbccb009bffffe49e235fa36b060c08df3 halomaps:3100 +RPG_BETA_AI_V3.map ABE07883 124692992 262144 3142fd700c5afaf2f94a9c7b07af3901d2503ef6 halomaps:3101 +RPG_BETA_NO_AI_V3.map D980394C 87717278 262144 efe583abf92f9c32fb63c755fa76b73ce238e51c halomaps:3102 +RPG_BETA_NO_AI_V4.map 68844F95 127957127 262144 ff5332d7df4df4ed7101d9680fc5e1930117d105 halomaps:3199 +rpg_beta_trick.map CFACBC0B 65919258 262144 8ceb1b7ecc1fd486cc5de3d869a3ee7045c0b32d halomaps:3537 +rpg_forest.map 61E42FB2 134646052 262144 8b70d2b39deb09211e9f34825627b74c07ce8524 halomaps:5864 +rpg_islands_np.map 91CC7B32 129915313 262144 953a5f0b5c83399b6396468a2895c15091781abf halomaps:5758 +rpg_memorial_base.map 07824E7E 111750931 262144 e5ede2ccf2f2a0d2495eced17a545470d3079bb2 halomaps:5930 +rpg_open5.map E548F0CB 71574548 262144 cbdbcdc4f61c0ac5f809b6b479bd75eee4762f9c halomaps:4623 +rpg_open5_AssaultV1.map E43CE5EB 132384389 262144 7dceca311bded50aea98502b3f4d70c4907b3d4d halomaps:4768 +rpg_open5_war_ai.map FF102879 133300665 262144 8cbca5174c0ccdb7031aa0d05d15b328ead1cf5b halomaps:5746 +rpg_open6.map 87F9DD24 60122974 262144 8e9c369f567ef3b6bba6e7303b4a0e192c00bb67 halomaps:5523 +RPG_Sandy.map A7FCD125 137155117 262144 8f8b1dc2bae75f588efc828708372c9a262c8bf1 halomaps:5900 +RPG_Snowy.map 30C93AF5 130193019 262144 d3f1570ce83d793feeafc4a2e4a132eea6b1bb25 halomaps:5793 +RPG_Snowy_V2.map F2C75336 152880207 262144 91b6a00836c0928947c8a062ec278a9d4fc64503 halomaps:5931 +rpg_vally_alpha_1.map F828B93E 19398296 262144 a1e66d66901ac53282638805e4e2ed545f4a99b4 halomaps:3517 +rpg_zulu.map ECBB5F3F 107933121 262144 e9b681d324e3beb7318d98ffd725bf83927b95e5 halomaps:5692 +rpg_zulu_mod.map B37CCB12 132546630 262144 1c7d7794ba9a5db3d6508239fbd6cb45b22270ae halomaps:5594 +rpgbeta6.2open.map D10ADBB1 120688318 262144 d37887d1a388ad7a39b6d7391c140c98299672b7 halomaps:5710 +rping.map FCA60D7F 45262592 262144 fa9fd22584c374db21ca9a926a43bb6b57b839c1 halomaps:4847 +rpsp_s10.map 77952F1A 148096405 262144 2ad95885efb117dca6229fd2bbbc84e58e234f34 halomaps:5904 +rpsp_s30.map D98A0445 209153827 262144 0ba3164d42e4ca718038cc6e7e25a46c5df68274 halomaps:5905 +rpsp_s50.map 7A09BD4D 212575302 262144 2b98417e91381e40d91db48f8b802f736724616e halomaps:5902 +rr11.map 41EA6839 12796904 262144 c7f346abfe4226cf4f629e232c772547666c137b halomaps:2351 +rsfg.map 3876534D 56101323 262144 273dffe32494b936a629d8d65e56802b49de08dd halomaps:5452 +RT_Coliseo.map E4600D2A 17408384 262144 aa4698de281f18b6739cd4fb6ce6a5266b793ab0 halomaps:6558 +RT_Coliseo_Final.map A18DB802 32999181 262144 63a746139ceba2ca06b9a9920c5907aec2304ce3 halomaps:6598 +RT_StarWars.map C3FDAA29 204193538 262144 e730e4b3ede48275ab5d413715e5bb3af1a61d53 halomaps:6710 +rt_starwars_complete.map 55F3509E 125164066 262144 5969c5deeb040b995aa71b69d73652713b712b01 halomaps:7063 +RT_StarWars_m1.map 6FA7368E 83161676 262144 c9e41355c0eba5676b2d60a5867351a4f7a52405 halomaps:6723 +rubberducky_alpha1.map 1086887A 30021248 262144 bbcdd3efba41f79e7774d76f35efe09197142bc0 halomaps:4812 +ruin.map 1EC867B8 31702884 262144 6d637b69f556cfe2c113331b4695360e422aaff5 halomaps:5437 +ruinas.map E6A5817E 273584597 262144 6b88f0f987d2147cf97af329af2231a7d2e80450 halomaps:5355 +ruined_pain.map 8EE07F05 40496364 262144 ba3bcd63a169acda3f053aab9a54694cdaea24cb halomaps:1034 +ruined_pain_te.map 9317077F 41856784 262144 c041a4656cdf463605f103ba770c3f05691b8907 halomaps:1037 +ruinedpain_final.map 0225F5A6 43071040 262144 cdfe68342ab292f4c4af3d23d32dce20eb9543b8 halomaps:1044 +Ruins_of_alph.map 1D44DED9 125231920 262144 d0742fdf6b95ab26fe988b53334e45795572602a halonet:Ruins_of_alph.zip +runway-mod.map 1F3BDE65 56111478 262144 55015890daefe0548aaa99339cb56f0c0f3dbdf1 halomaps:5292 +runway.map 83F5363A 57147042 262144 4f36894280d9b929087cbea897e871e4e11cc21c halomaps:2327 +rupture.map 2966D7FE 54510190 262144 94ad384fe1f3fd5996f171e3b57b0ba2ac2352b7 halomaps:7078 +Rura_Penthe.map 00000000 149337604 262144 8737e067875dacf793cc76eec5a28293cd11a1dd halonet:Rura_Penthe.zip +RvB-WinterGulch.map 3A8948AA 38373696 262144 89d6e688faa340f9b2c1c84b8e78c5b34f10f3ea halomaps:5077 +rvb_test.map 0F187A16 29297300 262144 5f8c17193e0641f1430ff2645711ab20a860c977 halomaps:6292 +rvsb.map D27BBE9F 13057164 262144 7a3c954e34e681f23eab93e02aba73ac9abd185b halomaps:4986 +RW-G3-Augur.map 1FE45F18 188717103 262144 a6301f6af7404981a5343abfd5f962b19677c5a0 halonet:RW-G3-Augur.zip +RW-Harbinger.map FAF3D4BE 216940941 262144 8ab064f5573ea7f1dda4e33643ff297cef0669c4 halonet:RW-Harbinger.zip +rwg_desolation.map DD8273DE 34709997 262144 f456af577244eaf97727379c314cf92e79635756 halonet:rwg_desolation.zip +rwg_fragment.map A742B7AD 100397450 262144 cedb91a53645189157555cda8e8e01a0c5efe4f3 halonet:rwg_fragment.zip +rzf_beta34.5.map CC43645E 219791759 262144 177ef317b71a6dd341b715c50d83e5b9d7370474 halonet:rzf_beta34.5.zip +rzf_beta35,1.map CA60B6FB 219795938 262144 1526f7ce8701ca5a60ae0b735923ff4ca9987aa3 halonet:rzf_beta35,1.zip +rzf_beta_33.map E1FC1631 193838372 262144 617bae37b7a014b9cd7949f1e3a420a7e4e85d37 halonet:rzf_beta_33.zip +s-m-e_beta-V10.map D9BB7753 46091028 262144 5dfa2a9ce03331a3efa451cab187221f65b7fd39 halomaps:1798 +s-m-e_beta-V11.map F4A5F9A2 44580750 262144 47069c7edd9e7e512eac0fcc6e080d08991a32d9 halomaps:1929 +saber_mod .map 064893CE 14683748 262144 81d35071444de72ae2c06db9673bad51597f3897 halonet:saber_mod .zip halomaps:377 +saberarena.map 064893CE 14683748 262144 a609ea496c6c35fd1f77644993b1d4f2e6619a65 halomaps:355 +saberpit.map 96A9D093 34817910 262144 ebbfc88bd3acef1c4f3c74840a1c76254d98b1b1 halomaps:4531 +saberpit_v2beta.map 2E5B33A8 37906586 262144 2896a98e3ab79b039d198219501926bb1e40aa13 halomaps:5907 +sacred_forest.map 883ACCBB 18693108 262144 aacd0288ce33ad26d2848d6138bcdd213ae11e8f halomaps:2792 +safecanyon.map 8C31F8DC 13212776 262144 9fc7d302197bdbf7670027b789acd4eff7036639 halomaps:4605 +saffroncity.map 20944C83 102152855 262144 474c9d4e076bb5095792897000431a5b4e899f23 halomaps:6623 +sage.map BFCEA47C 14957528 262144 ccb52e78ada02483f1dd365f33a094c9fd53226a halomaps:1451 +sali_creek.map 98311FD3 29188566 262144 2dfbbf94e23db08706b6b7d60c17f2718ef60e58 halomaps:4918 +sali_creek_v2.map 73ED7BA9 63621290 262144 4a8a3ece7659015a8781dabaa78f33220fe024e6 halomaps:4946 +salisp.map 35C49DCE 80052930 262144 9e54d850f993137c9fac388beed3bb2172c2e7dd halomaps:4675 +sanctified.map 4509C1A2 15242488 262144 256aca0ea21ab1bde5f77283079e679423c9837e halomaps:3361 +sanctuary.map 6CC93BE7 86916428 262144 6c0cd1471f7736d4d68eba4c8094cce3047d10ba halomaps:2444 +sanctuary_final.map 537875F7 118399888 262144 9f6953348d70ad0fa7d9d8e20eb15310eb552d7e halomaps:5241 +sanctuary_mrp.map E413F6F5 124809426 262144 512fca4c761a5cbc7c0b51f110e193b966696eef halomaps:5541 +Sanctuary_revamped.map 526B9900 131611031 262144 95f8eb3fc98aba8d92f96c1dd07620991526aeae halomaps:7087 +sanctum.map 8E631454 20366800 262144 aa57e3278afb2871e729fc12e1109865893bd10e halomaps:2445 +sand_infection.map 059390D0 79930855 262144 7590a9d84d0c0423a3462d85ca7ff0b82036760b halomaps:5811 +sandbox.map 94B143FF 13386176 262144 8dd58ad5cc3395502cf04eb4bf2ad2a615f6ca2e halomaps:5161 +sandstorm.map 964F8CA0 58928600 262144 dbb8973e48308fd62f8925e7209d8b741daed0dd halomaps:4126 +Sandtrap.map 37CB97C2 21709040 262144 018bcafc5714b528662cda88aa72242c1ce57fcd halomaps:5358 +sandtrap_ai.map BC05AD87 94677293 262144 1ea3e289023fad0274400d1646329bd7cb520894 halomaps:5376 +sandwinder.map 2CEFC069 17680420 262144 de356f1325aa9ffc779aba43f3d9ca757e25af6a halomaps:2275 +santius.map 86F88E87 30969466 262144 ca7ae36fc235dffdef30b56c76ead7d935a62cc3 halomaps:1277 +savior.map 3C9D5F28 301951027 262144 fedf664dff6f8b8fc261e819fa05324190b2650b halonet:savior.zip +sbx.map 63EC26B5 28842024 262144 be96373fa61273b177067c08f86d60e46c650abb halomaps:3386 +Scarab.map 59354A73 29197077 262144 6680d040f77a1bdc4bbe0a79fd47b86e2d8d953f halomaps:4299 +scarab_arena.map 5E559E71 50153561 262144 bb969212db4b33a08143e77b47e92832e1050a8c halomaps:4624 +scarab_assault_v1.map E9AA4A30 30857056 262144 10b492b3a08253fdf3fe306926dc1ea3f09df30c halomaps:3825 +Scarab_Assualt.map 76901BE9 50786007 262144 10b6998e4f28824e4837d8d8e25a5c75923b7d7e halomaps:5130 +scarab_guns_test-2.0.map 7026DD18 47819240 262144 0e81aad87f0c2aecd35d83c6f658910bdf8d6671 halomaps:6478 +scarab_guns_test.map 7D6DC52E 28051022 262144 1b26fea7a7eee56303f4a05eab067fb0e6ca8ec1 halomaps:6464 +school.map 709F3122 14760816 262144 94f0b50a2bd7ebab5bb4704fb181db720487dfc8 halomaps:2243 +schoolinfected.map FEA81831 91876600 262144 0d38fbbcffad9f4cb5873acd42818bf3a8209650 halomaps:5474 +schwinnzno1_alpha01a.map 50B4CF15 15052876 262144 3b44564a7326c000ff11cf727a84245667118d72 halomaps:272 +sciophobia-5.map C3075788 96620862 262144 a2699675ac334b53c7c6e8528dc336381c210ed5 halomaps:4908 +sciophobia.map 37F209EE 37023532 262144 d6275466defcd229a3e6fd346db1749a00541c58 halomaps:4204 +sciophobia_beta.map CAA10F66 32127580 262144 5f05092fe54c1a60a0457a3eff030fe7eff02806 halomaps:2324 +sciophobiav2.map DB0ABB4D 40972176 262144 2defe3f0e44f53891697dfa6a2513b11fb262625 halomaps:4875 +scipio_alpha.map B83254BE 13019908 262144 912d9e19a466fc120f884a126d0a8f78f892640b halonet:scipio_alpha.zip +SCP1convD.map B0B5D8D1 87039934 262144 9112119bf8f8262dc0ef7ad2ff66141c613065d8 halomaps:1421 +screamer.map D1CFBD8D 72074010 262144 a7d69368e6a064d5f2278c72d1cac045c556c5a6 halomaps:3103 +seaside_hill.map 09304A82 16713230 262144 77063d57a51cf776cdbafef11d851135641f0d79 halomaps:5331 +Seasonal.map 71503A28 22853269 262144 119b990cbd8d5e06da37c59097abbbf55a6821e2 halomaps:4205 +Seclusion.map E884D8B7 61737892 262144 eb9001908df3beb90b18562ad76f3c5b4172dc94 halomaps:3969 +seclusion_modded.map FF514156 102681268 262144 5cb8dc0db38e5984e3f23c7478d498c90804d589 halomaps:3994 +Seclusion_Redux.map A07244D7 67379162 262144 a6fe7d1c475fe6cfb5e6d8b7f8d8d271bd9dc808 halomaps:5168 +secret_mision.map C684387A 108511462 262144 2b11f3f4a2446faa87d768f36811eb01c924d250 halomaps:5611 +secret_mision_1.map 50E066FE 212988748 262144 9836d24e71ab2c0d6602af3d0f2ff42fe79575cc halomaps:5800 +secret_mision_2.map 03B0D3C3 163251382 262144 e2759ea9900744170c74d033f266b7eb3431974b halomaps:5801 +secret_mision_3.map 74AFC02C 169064115 262144 db11f13e8b68d1dd2aa2d96060a08ecaf89da4e6 halomaps:5812 +secret_mision_4.map FDD748F2 199004454 262144 602761b1d5dc456ac83a0233b2598c1459823952 halomaps:5821 +secrets_of_egypt.map B085A788 42552124 262144 370bba65161801664d22f76f0037e8d48b7e1e18 halomaps:2698 +sector_1.map 348CD4EF 93568189 262144 e44a2c403ba55531d2329d438c5cac07d2ffb382 halomaps:5968 +sector_2.map 7142F3BB 84050876 262144 444b02715a81413d179fef2a6fbd2ea09f775a40 halomaps:5969 +Security Alpha.map B4A441D5 59217118 262144 9d61dde64e1af9f5df5ff464cdc1c006534a18a1 halomaps:4625 +seigeofhih.map 15E11C91 24982290 262144 bf91f0483b45ba936539ba48cfe8b30aa095d19d halomaps:1586 +selective.map 4C7825CD 67412234 262144 638f7e2e6dc6aa46de27e9eda038f5a004ceb50e halomaps:2333 +semi.map 6B40518B 16028808 262144 556aeed5eb684366ee62e8e5ae0c44cd458ecf4e halomaps:3718 +semi_h3.map F31E23EA 78344299 262144 dd962286b07348fdf2c1e2171ad22ea0c8e19c2f halomaps:4161 +senti.map 04708398 47779624 262144 457c87c4730f60ef777390b0c98a6e968acb6964 halomaps:6909 +sentinel_beta.map 4A217371 24696060 262144 f5a50fe758bf4d33d4d221fe0b7d501c3c8f58cc halomaps:3356 +sentineldefensive.map EF24E666 51883460 262144 58306cbb9d869626d838fb3688b46e4a1a663c62 halomaps:5676 +sentinels-library.map D3AA2D83 32010377 262144 dd887110e9705c4033ce7a12c31fb7fc28410745 halomaps:1452 +sentinelvalley.map 6EBD0FE4 17991788 262144 8e3b5ad18d1f29c5d9b3806e9f72186b7d5503d4 halomaps:3568 +Separated.map 44F71556 53214586 262144 6434e7ab2fbe1d59cf90fe86bbf565386a40937f halomaps:1902 +Seperated.map 3827B369 48585230 262144 fa7f06b018e28a1e0a55ee926e302f386b00cc0b halomaps:1870 +septic_exodus.map 5CE6F155 16587323 262144 7c8489d60c9af7d0b00884439f56dc14516861b2 halomaps:2973 +Seqovia.map CF8E68CB 345474346 262144 69581e099385d3b3a4fe545a3eb60720db095915 halonet:Seqovia.zip +Serenity(ADB).map 5046D2A8 19769088 262144 3c24f868be99f8c0ba06821d6de7579d08a6a49c halomaps:2095 +serenity.map E1C872EB 30874856 262144 8740a2cd9cd7e3b4a25039f83fded3a094ac2b32 halomaps:4876 +sereny.map 8C835326 12620516 262144 59550129fb9097c781518078f37303516223010d halomaps:3733 +seriousfear.map 4D9ECD11 16939060 262144 3ed7179500b57d76393da20f50ddf19bf8758d2c halomaps:4459 +setinelgulch.map 39D1EAA8 18001372 262144 c45ff254b7ce5c550b0907c8cba58220cfe51a96 halomaps:1443 +severe_canyon.map 07C4F115 16751624 262144 694c1a83480cebdfd3491f9c26ebd46057fc925c halomaps:499 +sewage-facility.map 185E35EC 62980969 262144 9f17a0e680d54ef6758e1014c7e342ed150a3763 halomaps:6755 +sewer.map 11E7DA7F 13218600 262144 499b88328c711a835bb757ab12c5ba0d3ff476eb halomaps:437 +Sexy_Sidewinder.map 919519C0 14805356 262144 023b3c19f98dbc4f06490c86b19b0731089485e0 halonet:Sexy_Sidewinder.zip +Sfear.map 920CA6B0 12316616 262144 3843e63d37b564c366e40f6ee00cbbf2f4c2f225 halomaps:273 +SFI_Insatiable.map E5D9B44B 132294565 262144 837640948927973646d6f9b328be8a0935eda46b halomaps:5049 +SG_Forerunner_Facility-330.map E60E44AD 15009420 262144 736d0dbdfbe9ecf5078ffa82e7d365a5c5967cb0 halomaps:4947 +SG_Hidden_Control.map F91AAEA6 14368632 262144 2db182c58ba2493791889bc7a88e4c29d51d109b halomaps:4921 +sg_highground.map 9DA98A35 45394302 262144 0271be6d18b126a9b63a03a0c005156018567e6e halomaps:6248 +SG_Kill_Zone.map 5B69BF35 16605100 262144 bf34b63704413d293fe37e32b2a2164b007e70db halomaps:4922 +SG_sniper_canyon.map C984A607 17402424 262144 a2fd1947d9ffd45c356663fe44351f06d9b48649 halomaps:4948 +SH_BH_Danger_Canyon_Mod.map 812B1147 54419104 262144 e3d87b8be9c19f297c679de3a09b9587323f4ee9 halomaps:3121 +Shadow's_Gulch.map 651F483C 29540655 262144 a7b775c165d1f7f9abdfe18ae9e986f75242abfc halomaps:2844 +shadowisland.map 3A08972F 49446497 262144 d4b45815277446393fef75f296e703a034be8329 halomaps:1553 +shakuras.map 983B4CB8 15619576 262144 76523ba9e5187897701a68e029af0583e27e539e halomaps:4105 +sharkinthedark.map 0888BE6B 12624636 262144 977629707ab2789238e033c8d1b35c47c3e3b146 halomaps:3826 +sharkinthedark2.map 6FF3C7DC 18595338 262144 f3fe5d1fa0391f9868c7d7fb24d24c6f0cfba0e5 halomaps:3881 +Sheer_Cold.map 864712AB 15049900 262144 0e0d843ab3c6b75c400927e0a447a44a49312800 halomaps:4179 +shellshock.map 13CB6878 13616008 262144 33db5778d693512e4f5b8e102a0407176f63c2d7 halomaps:819 +shellshock_alpha.map 18980A8B 35793620 262144 b3c20633d51171038875372d22d5efb5104ec1b8 halomaps:1788 +shinzo.map A82846BD 13976448 262144 8b22650641f333f14bb2af26f91f526f471704c1 halomaps:961 +ship_invasion.map 2F1E6141 67552077 262144 d5f8a3993e8cc9ff297c31b7b8fd14645a048b15 halomaps:3734 +shipment 2552.map B64BBFC7 42479665 262144 49161174efde1097770e0ce558a803fc246d8de0 halonet:shipment 2552.zip +shipment-cod4.map 6897CC15 227555996 262144 a8dd7c580ea4a28762d59bb7b618d283c2377213 halomaps:5970 +shipwreck.map 4D1AEF1A 29379072 262144 3145c6074adc65b67a6d21b0442ac63afc15fd5b halomaps:2985 +shithole.map 0BDAC5A5 28045550 262144 7cc1f4be4a526d5470b1889fb4030567d5e4cea0 halomaps:5971 +shlong.map A644EE9B 15346938 262144 f4727436e7a5e4b0c356d615b1e61f3c7a02944b halomaps:7064 +shnoogins.map E8808D5F 12499604 262144 78e2ed78161479811e3259e6f17ae9c0e6f83d3f halomaps:453 +Shockwave.map 4D58C8B0 18538236 262144 2b4da7730fc6cefc63e22aa1ad16ed7ea7032b23 halomaps:1908 +shoot_or_die.map E892A700 16965542 262144 78947346213de26161af42b9dd2c81ed3042c78c halomaps:3210 +shooting_rangev2.map A53DC4D7 35753385 262144 25df8fe2d1583fbb7af263b9749c73a936d0fa11 halomaps:4413 +shore.map 2888E6EF 107631108 262144 3238cf20d9bfaf34e5fd6dc3639e70c796d95219 halonet:shore.zip +shortest.map 646F6F64 18289772 262144 1fea40446abae53ae97db816ea4b28863971345c halonet:shortest.zip +shotguncreek.map 26D43B1C 71043422 262144 54ef18119af6e256e7d9912a08d037da02dae3f4 halonet:shotguncreek.zip +showcase_beta.map 56A52D1E 25482469 262144 920d76df6195d230ec7b93413cacded2e3e45f83 halomaps:1183 +Shrooms_pb1.map 0A955532 195234212 262144 fb614d9803f85d9cc563e3d105382c157f0e53ab halonet:Shrooms_pb1.zip +shut_down.map B3D62358 48162690 262144 4333bcde022335d65620709772b001ea27b37f4b halomaps:3085 +Sh°!_Battleground.map 53280095 20069380 262144 6ecc69667fe6b68582a7fa6ba238a553bbbdf20e halomaps:5190 +sidetracker.map B81DE64B 79172322 262144 d5efef121b6feeb391483990057aa8a087edbf06 halomaps:2640 +sidewinder.map BD95CF55 14840596 262144 847d012f82460706c3b95c1b32340387b7c8de63 halomaps:4788 +sidewinder2.map 0F8871FB 35922155 262144 558abf190b2730dab376ad86346ee61a91696e5c halomaps:4206 +sidewinder2507.map 27D73DEF 125813140 262144 3eaad1fe60ecf4b1993adc78c95ce344c5eda9f5 halomaps:6431 +sidewinder_AI#3.map B05C0B02 75998302 262144 cc376416d334c2976fefb26e199b65a20909394c halomaps:2907 +sidewinder_ai.map BC8A2B9F 46643874 262144 b54ffd7dc840fa6ed01d75375df998444c3f69c6 halomaps:6202 +sidewinder_bamf.map 8F07D93F 68067379 262144 19c07c68b0474be4baa8968f92516cd5584c88d0 halomaps:4103 +sidewinder_basemod_alpha_test.map D395C2B9 15913116 262144 ae62078e2fdbe3474195e84bc31b04d9c1942578 halomaps:4588 +sidewinder_destructible.map 14F1EECE 18422794 262144 caf1557aed147a5a58d4f7e57c6afb7c7e81642c halonet:sidewinder_destructible.zip +Sidewinder_Final.map CBAA77EE 14789080 262144 627ab79a3fed9db2b0bd1c54cbe02470ab152e7d halonet:Sidewinder_Final.zip +Sidewinder_ME_FtD.map FC905ABE 101375328 262144 4d6285042994930d135a7aa61062a82bb68a340a halomaps:4694 +sidewinder_mod.map 25D0E236 68322133 262144 a621ed9e9e182a702a7055499e685c1a7042514f halomaps:2374 +sidewinder_night.map B3EE1679 21204952 262144 a9a3b10eab46bd81372cd2897b52457c786cfaa2 halomaps:5819 +sidewinder_rm.map BD95CF55 302779084 262144 c0c1d7a46e9305fab011773d0d73ee6d5bc710fb halonet:sidewinder_rm.zip +sidewinder_tmcc.map 4FF0E195 42091628 262144 e32217c5c52851d15a043584cdf25b2047c5802c halonet:sidewinder_tmcc.zip +sidewinder_ts2_siberia.map 0F8FC2EF 26383532 262144 878ad2a0f6a3b8df82dcced6c003b099a93a25e4 halomaps:5266 +sidewinder_v2.map 0A0A0999 48321774 262144 814e1e74ea7d2a9788e4d9202a4077c37e223c89 halomaps:6559 +sidewinder_warzone.map C0C06685 77734997 262144 452d8ff18c3baf92aa9fc0419d26ac58dd5e2db4 halomaps:3735 +sidewinder_warzone_mp.map 990731A5 100591675 262144 f0787607cc211dfbd90a7da1f8c9c4d4f69ba405 halomaps:4059 +sidewinder_warzone_v2.map F98D13DE 87902219 262144 8dc723a9382f5e9cd2efa9a26b71d559ca0fd5f4 halomaps:3736 +sidewinder_warzone_v3.map 37ABA249 95198947 262144 20d873eaae1b46b25f0b6f658a19c51af3435735 halomaps:4038 +sidewinderadvanced.map C62AE516 43499375 262144 1c9f52c89a0e1da75e274c8657211a5aaca17d28 halomaps:4345 +sidewinderedit.map 93EAE28F 15361196 262144 aa4de2131fb00b335e2573d3906ad778ba2643ef halomaps:3484 +sidewinderimproved.map D83DD0BB 133429369 262144 dcef443e5f85ff90120708c4c626e2defb1aa6ec halomaps:5672 +sidewindermod.map D37798CE 78192667 262144 7ea08839cc09c80bbbee171041c8f44d0d538239 halonet:sidewindermod.zip +sidewinderODST.map 88E77AC2 116919044 262144 9f2d7a41f42d998e3d7ace5de25dcbe5069fe509 halomaps:5377 +siege.map F92C3E58 35373448 262144 b4b01f049c98bb6b81dc63037743462cd6a8e6f2 halomaps:558 +siege_assault.map FCA41404 70110722 262144 637346b23381d976d93909ec8bd4d24e62f7eca3 halomaps:5738 +siege_speed.map EACD6756 37578920 262144 480c03ce64973bed06a30d0367e454fc46e7ddae halonet:siege_speed.zip +siegeai.map AFCE24B4 41709182 262144 392404d69d93513a97820c32b79ca61c60ec5e36 halomaps:4813 +sierra.map 0CDEDA2E 13609339 262144 9a8c22750456d4fa1f6a8b01b0d1dda8be417e0d halomaps:5318 +signs.map 438BEB76 16601497 262144 528705e5fe2e7830fb2b1fd009d17f9a3993adb1 halomaps:274 +silence.map 99280619 27443948 262144 256276f1526ab0387a8c0e39ee27158989882bcb halomaps:2781 +silent_canyon.map 38C9DA7C 20881320 262144 68bd77a81ae88a5db6cf08f55ad4bc403ad2e068 halomaps:385 +silent_lexicon.map 4CCB8D97 27038456 262144 4c63c61f136c1c3de222a613a4630c2ceb27ca16 halomaps:5281 +silentgulchv3.map 3A2249D2 18495606 262144 f7d6e490ba83f22723e11d223d6fe62c56962518 halomaps:1773 +silentrecon.map B72066EC 31906666 262144 da647f80157229faa6d85ac23af0c0c6ad4de545 halomaps:4723 +silo_surprise.map 4D610166 35498049 262144 e9c5e306dd1e420bfe8f37a60c36881cb281546e halomaps:2244 +sim.map C8E097EB 15648084 262144 db133b9bab175a09d1c89df22d8e2c5a4c6ab26f halomaps:820 +simple.map 351FF187 12776128 262144 3d949e4172c9927393cb638ccda2b912f1786870 halomaps:1909 +simplicity.map 446B1769 13872384 262144 253acb3d044cb3b6086220dd95b3d3149f0402c0 halomaps:807 +Sin_City.map DEA68B85 323959850 262144 11c2f710f2eb39430a1334c079af6eeaced5c55f halonet:Sin_City.zip +sinkhole_final.map 8B0AFCCA 18321122 262144 14c39b7da208e3654f84fbca0f9e2d547eda7ced halomaps:3446 +six.map E688A5CD 26374937 262144 7ff01f580429f7641e716e10acf0d000a210d50c halomaps:5282 +skarn.map A5187EA2 66648698 262144 d5d7bbf3a27218ceb798c731ad08c9ac335e286b halomaps:7079 +Skedar.map 16ABB08C 56466314 262144 46017ed26e5d787ddb16ce0c7336134382c25605 halonet:Skedar.zip +SKN_Canyon.map 75B1AFC7 14015400 262144 1bc5a5829a3a037dfcac35826194635b9406e316 halomaps:4539 +skullcanyon.map 31FFBEFE 14700024 262144 cc183152ebd813bcbc896b94afe1c980b43cdd6a halonet:skullcanyon.zip +Sky Twins.map F4BDD30B 19273056 262144 e014c2aeb2d38eb438343000166def37ee3af7ae halomaps:331 +Sky View.map 018B8007 319174162 262144 85de50a34a3cd867a916e69e7e255bf3fd11ead2 halonet:Sky View.zip +sky_rail_beta.map AC61D100 20657270 262144 fd199622752a0f84953564a1769e33137de573c5 halomaps:2307 +sky_wars.map 850E3BEC 33941150 262144 d69da1e89e4a8025fe323150cd38d8de34b0d7f8 halomaps:3798 +skydeck_beta.map F971B5D6 13752556 262144 6ee3315b10cf08b496be7822928556453aed0515 halomaps:1817 +skydive_heaven.map FCDFB92E 45726419 262144 8840c5a71b0bc102dd607eec46c332279a47873f halomaps:3797 +skydive_hell.map 16E71A43 114389001 262144 4f568a6df91bd2381906043cee765f739ba73576 halomaps:4039 +SkyHarbor [FINAL].map 7B309554 13936092 262144 5eb5d105f16a5eb50085758a8b141b7200d6621a halomaps:1094 +skyhigh.map 3EFDA89A 13768572 262144 9e311a1c3a5e087952da4df6f31a34455d50929d halomaps:4695 +skyhigh_v2.map EF271FBC 17708264 262144 4369992d3a2cc7cc19a0898409dc210dbe9b6415 halomaps:4724 +skytower.map 6F717BD5 15120852 262144 cd448879d997a3b5e0533f163ce9c4434aff054e halomaps:1203 +Slaughterhouse_5.map 11200652 157117353 262144 96a9865b4711108861c81f10b1c4ce0ba65dcd8d halonet:Slaughterhouse_5.zip +Slayd'z cliffs.map BE434EEC 106658035 262144 4aeae77ff92c664845c986c668a8563889390641 halomaps:5078 +slayer_box.map 6FDE31E4 13402536 262144 baf131cb959293c18923c03d1970f5f5c9340ea9 halomaps:4725 +slayer_cañon.map 1069F7B0 145147420 262144 accfb1463a78dc9c6087095826dea6f4179f7cff halomaps:6680 +slayhouse_010.map 7601AC2D 121873135 262144 e6d707c918e103a71e67ffc54b1d5b539f8d0ade halonet:slayhouse_010.zip +Sledding02.map 0A036370 109868368 262144 66bce468c1078b6306918d7ce291470b49695abd halomaps:5669 +sleden.map 5856C12F 38389496 262144 5019f5fb67ffba5f873b6f324a3f40fe0decfdca halomaps:5079 +slightly_less_lame_box.map 870E637B 19144384 262144 cc74fded4be4dcfd28fde0843bbad18fd5e77d0e halomaps:3621 +sliverland.map 040AF203 67294215 262144 890c09ef2aeb5678a5e42d62c8ba242e1dc12ac5 halomaps:3921 +sliverland2.map 34E4E0D8 46587884 262144 9ed4f0fa3e1be121fca6a34984e2637143713756 halomaps:3943 +small_battle_fields.map 3E7E2DE0 17714276 262144 b1400331ee5804db5602538c7b0253b30d0dfd6d halomaps:5029 +small_giant.map CDBF3891 31729855 262144 bdc12c7587abf10366b40111178543d333a001e2 halomaps:3800 +smaller_than_loc.map 3B79FEF3 391628 262144 20100746c5e11b0b649967f186bafd1a31b885e4 halonet:smaller_than_loc.zip +smallprawn.map 13878BA0 17858680 262144 333ffcb8ab5da753df81e6a75fd5511d79ea45a6 halomaps:3899 +smash.map 591C2E2C 24730395 262144 f726fd98a58ecd6a043b2b3fd971aaf6db43013d halomaps:2960 +smm_ransom.map 97E4309A 13000360 262144 11ce220394826dca3f41e8f22c58dbe0d160177a halomaps:3766 +snake_canyon.map 8663A6EB 13212588 262144 3dac9c5a05b57ace0a3e24c7c2fb0691d0b065d8 halomaps:275 +snake_fun_island.map 3FED9117 119674678 262144 2adf775b22cb3c421ce320f5db54b93833ae0d77 halomaps:3345 +snakemovie2.map ED4A4436 77845866 262144 312fdd31378cd14b3e1d8d0f14dd4c38781bb8f4 halomaps:3323 +snakemovieset.map 09F15B2E 87106668 262144 353d7a2c69e90baec21b196d5ea4be2de61d5e56 halomaps:3324 +snakemovieset2.map 2FC9D88A 126874553 262144 4eb94a70feacf92ee1538c416c7480be6f9ca07c halomaps:3344 +snakewinder.map 10C4A6EE 21998012 262144 8f4a154975d47f488c41cbff8c24425bb9d51075 halomaps:1299 +sneak.beta.map D4E0F5D4 19332924 262144 b1dd85e137b118bb1ba2635f83b1e7aaaacf8620 halomaps:455 +Sneak.map 4F8D6F69 15522412 262144 b8c5bd29a7626a27f4696c1c8a8d28daf57ef796 halomaps:1243 +sneakybeakylike.map 79728B35 17827880 262144 af20f44d54f44a731087b68790dcb70eed5eec9d halomaps:7096 +snipaphobia.map 79B6BA61 16374384 262144 8bb93c2a0578f5089d4c87603916fd88299092c8 halomaps:4060 +snipe.map 650496D4 21068844 262144 00ed64f459464bac499be63766c75e7037fd4d9b halomaps:1508 +snipeaway.map 5F91C118 12391404 262144 da8f4ebb8a9cbde333f4422ef4d48b1cd4366426 halomaps:4848 +Sniper Island.map 0447D280 150173624 262144 a50ab31500bb67bfe03973163e8341e9a7dc81c7 halonet:Sniper Island.zip +sniper-war.map B2FA8D3B 117761325 262144 187b99e67e024a3b22105c3bb7d5e15cc809e666 halonet:sniper-war.zip +sniper_canyon_ver3.map 00000000 225497676 262144 778e39d3e4d637fa3ac7c29e4ff5beba6943d36a halonet:sniper_canyon_ver3.zip +sniper_heaven.map 23530346 22145164 262144 e05bf714cd95ffc7fca6e302470e1ac697a11547 halomaps:1338 +Sniper_Training.map 535BD415 14245128 262144 5a74c3f8f6a50138a9b2317e561e86a6df42800a halomaps:343 +sniperbluff.map D7D1CD41 42676241 262144 d81eb52ef3bdfc6db4cf3e75cc550ef63241b65e halomaps:1971 +snipercanyon.map 2A3236CA 13959404 262144 d9a12cd91b0f0d53b4e002e698bcba70c14aef7b halomaps:276 +snipercanyon_race_enhanced.map 5F6C1F09 23186170 262144 b8de13471b72a4285f903cd0438a1912930d3967 halonet:snipercanyon_race_enhanced.zip +snipercanyonredux.map 0D473637 23422332 262144 4521422895ff90b8db0885ffccc0bab37b994bf0 halomaps:1042 +sniperfear.map 2E4BC172 17324456 262144 a20940d0d2195fdca2fffb56b10dfde450771349 halomaps:4477 +SniperGulch.map 52901D04 85772396 262144 23274fdfe64b9571d0c58080ddd6800f94980972 halomaps:3737 +sniperhills.map EA04C454 17150568 262144 ed41a2e58af776b69afdc5fa18770b35e5d38f58 halomaps:4293 +Sniperwinder.map EA84952C 26851846 262144 306f5566f3508131ad000c34cca969c6c28f37ce halomaps:2182 +snipewinder.map 2A03EBEB 26727979 262144 0e0d12fe9ac56ca89de4c816383ad47bc6712334 halomaps:2142 +snow nature.map 897A3FE4 147477141 262144 c24c5ac6c889d22fc01a73d01fd532e5fc1d38b3 halonet:snow nature.zip +snow.map 44590CD1 23040246 262144 b93a6c8ec36b97742f8cc3fc3069522c25a0259f halomaps:2908 +snow_archive.map 556D3C3C 16292744 262144 f4c0c20135feb9b7f5f477a5d7dc2fd4a6a1a25d halomaps:3417 +snow_camp.map 8847001D 21009817 262144 0f2a5aca689fd8ff39dc221ff43cf2577b1d7bc8 halomaps:3799 +Snow_Canyon.map 8899D25C 50959148 262144 308a3cefbe200adf5c7bff9559128c70841d8e3c halomaps:1089 +snow_death.map 5A5183FE 13157860 262144 6d99e91f4363ac49235a36e396e7a4fea13bdb7a halomaps:314 +Snow_Dreams.map 516CBC4A 215083021 262144 c658fcf6b973c690eb0d4b6652818b1dd54e1831 halonet:Snow_Dreams.zip +snow_grotto.map 012250E1 14212364 262144 140608fa9a036952f3e0cbf266982eddc4aa51a6 halomaps:3418 +snow_grove_evolved.map 8D2E5057 133425775 262144 2e10725b6bef6ac5c01302c25a2594b5232090db halonet:snow_grove_evolved.zip +Snow_Rats.map 5C80F6F6 51412482 262144 2be001494af9f1bb5f41635c492ab92264accb5f halomaps:4370 +snow_rush.map 6EFBF185 74429961 262144 d5f10d4ab80b2b4ad785be6160b91da960846cd0 halomaps:1657 +snowberland.map 09D982FB 14685344 262144 6aa250ceade8b4d4663f7b21621ba7dbd471da65 halonet:snowberland.zip +snowbind-pb.map 087F76E2 125564868 262144 cf1e26866b442199be4e19484f949ec5065fa615 halonet:snowbind-pb.zip +snowbound.map 81AA603D 13152300 262144 5a53315d345c68759993adba1c5b82ddaabcccc0 halomaps:4106 +snowcast.map FCA0FC3D 25276995 262144 5e69f893b42887a2faf142e94d40d4fa4b2f2f3c halomaps:4162 +snowcreek.map 29599F95 205951302 262144 e70a71e9c6ad9dcb89d31be09d0d5848f8eb1b17 halonet:snowcreek.zip +snowddaymkfour.map 2B8D31A4 160917659 262144 6aab41c94ec6c40671fe38cf2101a16eb4fbe919 halomaps:5268 +snowdrop.map 5C808CC9 56050756 262144 7cd75bdb00032598cbbaeb5b0ebff1b2955fe947 halomaps:6400 +snowed.map DD8A9494 14651272 262144 5c7b8c8563dcf64167ee245513c8589c2dd04425 halomaps:4180 +Snowed_In.map CE59A113 28070016 262144 c2fd18aaafd0598a6a335e5a220afc36818a4b58 halomaps:5050 +snowfall.map E962C790 31012528 262144 1a8484f0c5b0fbfb896f37cfc780c50238c55bc7 halonet:snowfall.zip +snowfight_xtreme_ai.map 1824692E 55656864 262144 0206c028d428a897b4696107a064713fc26b1837 halomaps:5067 +snowgorgev2.map 1753224C 17280788 262144 beb71109125a93cd1e05a12a086772516092acdf halomaps:2928 +snowgrove_1.map 61B1C859 131379109 262144 c200755a0986765ad207c63508b3c3ac7ee061b1 halomaps:6932 +snowgulch.map 04CFF447 16271544 262144 9f62ef3f9fe20e4a42b8d06d0db58b65d11379f7 halomaps:4909 +snowland.map 1F6A7931 13445712 262144 1a0307d3bdf4fbecd4f4bc0f7a363549f2d3a63f halomaps:4606 +snowledge.map AB8715FF 106954167 262144 3a5a369d5d31b9d83eb3e51e95abad3ad855e8ac halomaps:3724 +snowstorm.map 797BEAC2 19497946 262144 d6c2b690afdbf7712ccfcbe7a7561581985e9a94 halomaps:1858 +SnowStorm_Classic.map 479537F5 15652314 262144 7e3d4b59ebc5dac8ad7a0ebe197b78987a0f3069 halomaps:2070 +snowtorn-oasis.map 4BAF225B 171757902 262144 5c39cef7b8c7e69784b8c9d4e31d44e29a68533e halonet:snowtorn-oasis.zip +snowtorn_beta.map E5D9BA2C 20931952 262144 223b007c6c90725908548480d7f86275f39290b5 halomaps:1789 +snowtorn_cove.map B2C9D9EE 38234432 262144 9b4004db254a5bf3a2167b4030281385ee75927d halomaps:2194 +snowtorn_cove_v2.map 76A345B8 62168471 262144 926d5d9f03dfa39d553c2497e7d1a53fd15c220a halomaps:2845 +snowtorn_grove.map 8DF2E09C 34661099 262144 99ded33d562c94bf122174cc7e0ad2f91ac074f3 halomaps:4877 +snowtorn_infestation.map 49E5A858 163552015 262144 37f7b70357fa3c3950d0322c7af6d03dfff0631b halomaps:5439 +snowtorngrove_ai.map B4608075 58166945 262144 5f73a935c475127e815b98c9a0616280ee72093b halomaps:5131 +snowtrap_pb2_do_not_leak_fags.map B9B0D452 57928672 262144 a48c84a84d230803e9076a2375c5dce80a2ca7e7 halomaps:4660 +snowvalley.map 897D5312 20381100 262144 52a8c5e1c932533ada8855ef90582542165f637c halomaps:3767 +snowy_assault.map 7F117C75 21413684 262144 5f42d99673e8a7393bed793f88d99f231a2f31c9 halomaps:585 +snowy_canyon.map 40E6EFB6 20260528 262144 435a0c42ac014713752046bfd0025ffc4518a691 halomaps:3263 +snowy_deathmatch.map 727C4511 16378868 262144 b280940d25d0dcd16a02a827791ec0257668f67c halomaps:529 +snowy_deathmatch2.map 8FAB72BA 16391972 262144 09120425ace06f74112ab2853b7f04fa4747c77e halomaps:530 +snowy_forest.map C25F46BB 13404524 262144 19b267f6d583e1f92c04f7bf9d54d174906f8677 halomaps:4099 +snowy_grave.map 29B683AC 26167257 262144 54e2323feec9a5fc5db68eb1605926cf145ac92b halomaps:3827 +snowycreekV04.map 53AE72C2 71256394 262144 e306a32b9c0d260abdd27fa02c63f8cb4b2ab453 halomaps:7037 +snowzone.map 55E85641 34665557 262144 b6817766caf2a382036f3ead79ac3b9cd3c23387 halomaps:2641 +Snow Assault.map A8FA819E 70432016 262144 415b25a9a05d4e1ce10aa0788f7baf84f0844d3e halomaps:3054 +socialistic.map EB4267DA 29114444 262144 5466ae84504107e42b3822fb3c56ba95668e8fb0 halomaps:3346 +sod.map 3066C66E 14295704 262144 5e3a1603ec1ac499ed61c63ea17017102ae5c60e halomaps:2996 +sodamachinegulch.map EB02001A 14869351 262144 25bc7f5c80ece33881c6246d933a95973f2447f6 halomaps:5493 +sofoc_desert.map 68308B3A 58655771 262144 9ef08606c3c4dd31c0237e0b757cb970135ccff2 halomaps:4061 +Sola Scriptura.map B3C132F7 32936444 262144 3e1ac9c7f67aaa6e99400db609b5b3ff95263743 halomaps:616 +sola_gratia_beta_b.map 7C2E9597 21672404 262144 b961d82d4d9b206ebc9bfd52175789f266da1279 halomaps:3104 +Soldier_Road.map D83BF28C 13516872 262144 314f22f16dac39d2c62ea088678e364ce93755c9 halomaps:2000 +soli_deo_gloria.map FB1880EF 29230360 262144 003a6038e7ebfc8358534dde67c5694b6387fe0f halomaps:1204 +solitude-firefight.map 099A1CB3 157574781 262144 efa5f79b7c091103e64b4f3e093c379b00f6e371 halomaps:5564 +Solitude.map 7B062E70 21967952 262144 45dd61de7854aac3d8e76dbf22eb2b46edae59d1 halomaps:1562 +solo_dangercanyon_j.map A81F64BE 99293756 262144 9ca6380c0315cd5f16ba380f2cd0bf0ec0bf100d halomaps:2183 +solo_dangercanyon_l.map C4EB1D6D 116399425 262144 3272eb77c556d522fdf63169f61aaf1b4f96aea7 halomaps:3076 +solo_dangercanyon_m.map 9C0219EB 117796409 262144 b55e29875fd7a412754253e6c577796b03d853a7 halomaps:3243 +solstice.map 18920733 37169546 262144 c252dede94c16d38ec743b7f59d7cd86220213f7 halomaps:4736 +Solus.map BD626C5E 13121312 262144 7ba34ab197fa7830468cc7304b938387340c3254 halomaps:1554 +solus_alpha_christus_b.map 9278A0CB 19646216 262144 6b25e7ad0098efa9e11575e74f8b58dccef9b08d halomaps:2986 +soluswar.map DD195E5E 113859166 262144 d93f7693418dfb1f08e2148ef0a2a1a47adb25cd halomaps:5641 +something_canyon_beta1.map 92FBE959 44731792 262144 81e582759b3c9f4ee8164e2d15591b83c0ac2d31 halomaps:2328 +something_canyon_beta2.map D95AF82A 29812080 262144 4da83d74e9cb5d66c49a897e0d7ea4df8712fb6b halomaps:2387 +sonic!sland.map 7F4BBDA4 18606844 262144 ca51de0dada81afa603fe464f7d05d9a02b18c67 halomaps:1753 +Sonic-BattleGround.map 6C25BAD2 40426457 262144 01797bc0f176375dfdca66b87eff615b2ef4138a halomaps:6756 +sonic-mario-ect.map CAB6CB71 10695300 262144 46135bf69b3054e41ab860debad8b01c5da35dea halomaps:1726 +sonic-mario-ect_beta-V2.map FC120B75 13137868 262144 2cd0dcf12d3dc137e37eb964a5ab36b5f370e2be halomaps:1754 +sonic-mario-ect_beta-V3.map 8758B5BC 26180893 262144 5b822dffe077c38006ed0c3920ed5910dbfc1629 halomaps:1755 +sonic-mario-ect_beta-V4.map 4E59103E 27303585 262144 b41e90957ee4dda3c7ec20b37572a8ce63e355df halomaps:1756 +sonic-mario-ect_beta-V5.map 91D6D5D5 28206149 262144 3c2e0dca35ff511b7a254e2139ce7e1fddc17521 halomaps:1757 +sonic-mario-ect_beta-V6.map 145EFC8C 31370034 262144 f314516610ede6e529d55fdc9caf171708eba4ae halomaps:1774 +sonic-mario-ect_beta-V7.map 5D3F8492 31604562 262144 806a87f959ed2aa5e52bf0a74b8e01668aed986f halomaps:1775 +sonic-mario-ect_beta-V8.map 242E1087 63460804 262144 554699c20312d5273b41a0a84693fc97d2e47ed4 halomaps:1776 +sonic_gulch.map B1FC4803 21977460 262144 01dd6da1817afcfd3e923a7d64aa1bf0e106626a halomaps:1026 +sonic_island_publicbeta.map 43A1E78A 17784132 262144 863f595e1782f5c549596a492b0961793dab5f7d halomaps:1633 +sorfea TF.map 0A036370 109868368 262144 492abfd3e9f996a21d9e83447ec2b8f169a6a6ca halomaps:6562 +sounds.map 00000000 41718640 262144 8ddbc7cdb19488c940764f612bd426b34fd87bab +SP AI fusion icefields.map 812D27BC 68221711 262144 427ac6d59c3a2b99c8c08f104b24086ef1137966 halomaps:3157 +sp_falls_of_reach_p1.map A98FF4F0 118774448 262144 bd5946171b0e4303c99d1d8c7a7d234eca44b8d7 halomaps:5496 +sp_falls_of_reach_p2.map 3C7B1726 118774560 262144 f22e46ef7823695d09ff7e6f1060c40d62719bd7 halomaps:5497 +sp_falls_of_reach_p3.map DC7CFACA 121024276 262144 73b22e3db02bf0ba309bb2c1405fb6021ce0b1bd halomaps:5498 +sp_falls_of_reach_p4.map 0D24E43D 127477904 262144 661d03e44d8597693bbbc2ee1e8a7df342317f6b halomaps:5506 +Space Demons.map 5F55400A 234102370 262144 71915513e0788d8a4e0c45702cc7a0de1a07014f halonet:Space Demons.zip +space'em'high.map 4736CC2F 18553357 262144 15416d69c52d9fc51cf27a2fe07cc4adae774858 halomaps:3662 +space.map 94CDF2D0 34598390 262144 6bbfaeb5ce47ce53fa15f97f19082ad1310ec12a halomaps:2446 +space_2.map AF6780F8 45989146 262144 7ef370c4e96e340e13963ddbb45d56d363dcdf61 halomaps:3211 +space_dock.map A918450A 24672515 262144 5c3ed81b979c34413be5dc30c6e5afacd96f6c2d halomaps:4233 +space_fight.map 61833EA3 13003612 262144 8fe7cfce8310143ea9a1b97f2f5eafca75074d0d halomaps:4268 +Space_Seed.map E1986B8A 235050508 262144 8df034bf2a989dc3b3164f2c016556a43274b63d halonet:Space_Seed.zip +spaceneedle.map CD2C7EA8 12417796 262144 42dc7114597a77ce9453893fb48b594d11efd489 halomaps:315 +spaceneedle_outpost.map F2B15919 18192268 262144 131aa7b188023d2f602d1a35e7b63815eb2c835f halomaps:4478 +spacexl.map 89AD26BE 16039304 262144 e07fbc4e88ced50330fd84df035ccfb82cd831a4 halomaps:277 +Spark's_Blood_Gulch.map A9D6759E 47266762 262144 cfdd0311139c0e0e91857c7a71c4f3d40a3082c6 halomaps:4949 +sparklegulchZERO.map 2C392D23 67109224 262144 5a38f5badb53f4183ba700c6c367a88f1f841b91 halomaps:3768 +spartacivilwarz.map F67B0469 32814310 262144 2e2547969167fd27854ca83bc8043227dae259e4 halomaps:4569 +spartan3.map C99CF796 108294613 262144 6681b1cb3ba0416b34191f8cf21c9e5780bb5995 halomaps:7127 +spartan7.map C223968E 103490113 262144 f7ee0451e7153de0f56a23d85053793e00349ed4 halomaps:7128 +Spartan_Arena.map DD447A0E 70273847 262144 22af7e92ac66e5616fb316fdfa04a2e70dda15a9 halomaps:5162 +Spartan_canyon.map FC908DAC 134298532 262144 e964c9a8d331eb6fed7bd07744d74428886849ad halomaps:5332 +Spartan_Playground.map C9872595 88687473 262144 0f9198c00b3769360345abe65bb470412cf45419 halomaps:5693 +spartan_wars.map DDFF46CE 127910048 262144 47cae892e4033cc5bb2e6bc19581e93c978a4092 halomaps:7038 +Spartans-VS-Odst.map 34D3FEF3 324762792 262144 be13a6391dd2a542e040fbc4eba211db9d1586a7 halonet:Spartans-VS-Odst.zip +SpartanWarz.map 8E69CF3B 82584990 262144 e6d4a13251cb7849d106cff59ec4d6573d81a1ae halomaps:3055 +spartns_vs_marines.map 7F9A463F 75743112 262144 6da022a579bae149483510f8308acbc3dea2045e halomaps:4973 +spatial.map 1DB477EF 27305236 262144 fe356adf60a5a0dac43f40c85d9f620314085926 halonet:spatial.zip +Spatial_Anomaly.map 476F001D 116628449 262144 ab00e83277a8d8f3338c2c350efe4437df6e7f2e halonet:Spatial_Anomaly.zip +Spatial_v2,0.map 786D0A91 27830996 262144 1f0bc21840a6ec758c4d19903858a430bf20d030 halonet:Spatial_v2,0.zip +Spatial_v3,0.map 5A58BD46 39842920 262144 fc242141e90a0f61b55f0027a71109a91a8f17fb halonet:Spatial_v3,0.zip +spawn_beta.map 276006CD 36865725 262144 024ee3c98b2c45b25ccc4104a805fb50dc134e13 halomaps:5080 +spawndewinder.map 8D3E6B4B 131464653 262144 19bc7097cca0cd86eaec1095b0bd37b46c618389 halomaps:6283 +spd49.map D2052C7B 19402824 262144 72a2d7cebeef24343844b00e50be55ec500b4c7f halomaps:1035 +Special Weapons Map.map 7B309554 13936092 262144 8c01715746559d353784354fb057282a326a03d7 halomaps:6540 +speedball.map 30428B48 14577236 262144 d44c50584c9ac7c4afa53c07bef0dd8fa8a8aa80 halomaps:2447 +SPI_Gulch.map 1A2D5944 16586612 262144 2a8e5399f4692aa6fc355d51e80cf39194751c1f halomaps:7097 +spider_canyon.map A6E9C632 15544512 262144 55901bb05cdd5a77d29ef828b288df500da41386 halomaps:2846 +spider_squadron_camp_alpha_0.map 0D91C46C 22576292 262144 fd8562430fff5c4ec283cd1577b48cf2b879db6a halomaps:3485 +spider_squadron_camp_alpha_1.map 8DBE768E 22984104 262144 2f7cb449ebe3caa4af7a4ec17c4dfe8663b54e42 halomaps:3486 +spiral.map 460BC14B 36528573 262144 d9dc485a45445f23a10eaa8096a2655c2e90ab3c halomaps:5901 +spiral_mountian_beta.map 1EAB8E38 20137396 262144 938acb4c3fe00f2555bc567727c1ee87c5e8e29e halomaps:2751 +spiral_mountian_v2.map 85978F85 33564212 262144 d71903c87c5723d41b66e263802bf3f8609777e3 halomaps:2800 +spirit_crash_site.map E5EF2826 121649896 262144 7b804500f2b10c7f42d06076ccff30ea57532948 halomaps:6401 +splinter.map D2C6180B 13245496 262144 d54120aa2071862177e705e8a18051e8a2cf18dd halomaps:278 +splinter2.map 392C3B1A 15026438 262144 74d068d87a5b422dd588fe2cb199d7baac2c224f halomaps:1045 +splitter.map 5B82D0A8 13487120 262144 a6a41f5da836ba64d59e11012f0071f30a930d04 halomaps:344 +spooder.map 8C2C6D0B 75983171 262144 33fee3b78f96e93dd1bff2bbb27d46dd0c10f42a halomaps:7080 +Spring_Gulch.map 71E7999E 63996014 262144 dc6fd6e05960733bc02bfc2593b19cdfd8d69197 halomaps:4626 +springfield.map D032901D 65641378 262144 fe4ed78acf775c6c6da7e6e753e47a72b5062ca6 halomaps:1509 +sprint_track.map 4D9A1261 28403382 262144 020fff11c0acd53b6660ab8384675836b7ed6e9d halonet:sprint_track.zip +sprocket.map A7DE1F8A 13676252 262144 185013691302697c769214447028091b107efe23 halomaps:2043 +sptest.map A59A99BD 218119209 262144 8cfcc1f81a595e4d9270f5b669ab9d6ccfc97be4 halonet:sptest.zip +spv2_bloodgulch.map 9B428DC4 75046891 262144 d1ab2fb774dc83057634ffefcbe5474f8da98135 halomaps:5030 +spv2_canyon.map B14272D0 115296893 262144 39245501a6e65924d0a6bb065043a7e4b004ceee halomaps:5677 +spv2_sidewinder.map 08D07342 100545269 262144 489a193c7744235553a9c442f59a6ace58fb5d3d halomaps:5031 +squad_aphla.map 4F936DCD 27473832 262144 25dbfd51b4628788727a241b67fdd2da769deff0 halomaps:3447 +sr-25_weapon_set_trials.map EAE5A612 17100666 262144 befeb5a67d4fcb0af10d0218ea310a747bb2432d halomaps:4332 +ss»bloodskill.map BB81D801 32947924 262144 79f9db0dedf85373b40a715aeb2392e2a1ebc080 halomaps:2909 +st_caverns_beta1.map 754A4A6E 15477900 262144 0dbe66da022f5d67ae1602cd28eaaf768e0ff13d halomaps:5191 +stack-of-dead.map 0A280FA0 185674626 262144 2657a944fd387403f79ac9473b9817573d1276a4 halomaps:5570 +stack.map FEA47D8E 16984784 262144 78eac8d16e7df92369e35dbb30faded47604f0e4 halomaps:316 +stackergulch.map BE73EBDD 24703152 262144 6e56ccfb047c46c66643eddff8c6244d80e676cf halomaps:6203 +stagnant.map 0591DECF 148854490 262144 69a5419f08102025e7e1c99a3ced7ec389dcf911 halonet:stagnant.zip +standoff.map 2A9B521A 53076702 262144 0d02905aada53589603bee21fb8ee5d5b7622a9f halomaps:4627 +Star_Gate.map 3F2C8668 61961902 262144 28ec13c3b0fc1d742aafadcf2ec1b9b59da272ed halomaps:3419 +Star_Gate2.map 1605C338 70614628 262144 cc38c0468812e4dbe595b61d8bbdb40a60b151d9 halomaps:3473 +starcanyon.map 460391A8 27126327 262144 91561768e5e83b6c3e543982cebb55a4f055db96 halomaps:4346 +starclasic_beta01.map 6D11DD2A 22402700 262144 d0586133596555b4f2b4febb4bd50db2153459c5 halonet:starclasic_beta01.zip +Stargate_Infinity.map 3CBD3C19 200853438 262144 1652891f844638e65237e78f15a1f0e086562264 halonet:Stargate_Infinity.zip +starlight_2.map 8F6E2801 61327772 262144 c02c8769ef5905689f4a832ef10742a9ce5573d8 halonet:starlight_2.zip +starwars-beta_904.map C494B345 133897250 262144 8c5e02c4a519eec4747a44772dfb4724bb6b0a81 halomaps:6745 +starwars-beta_97.map C85692AF 122878451 262144 4668f28225dddf9a9e3141fa54c6b67ba1ae4cf0 halonet:starwars-beta_97.zip +starwars-beta_9732.map 06D42684 122876371 262144 a448da5af43699d421bcf8ec7cbc99c729335410 halonet:starwars-beta_9732.zip +starwars-beta_981.map 96638AA1 119328198 262144 9d230e50f76ba5255b332b568f622fc38892d181 halonet:starwars-beta_981.zip +starwars-beta_9844.map 052E3C64 110604454 262144 dbc58d25d4642384083be52a889d1ddefff25c8f halonet:starwars-beta_9844.zip +starwars-beta_985.map 8E841652 111492478 262144 b348803bb37eeae52b292f7eb0c87c82b4b594da halonet:starwars-beta_985.zip +starwars_99.map 15027848 104952094 262144 e05a53069fddd4696f20ae24008a62441b852f58 halonet:starwars_99.zip +Station_X.map 72FE58ED 22725953 262144 bb964a6f982fd8f4b06cc0367aae2d044f48d5d6 halomaps:4234 +stealing-your-flags.map AB55240F 12825344 262144 bbf684ab7fac7877c82bdd85457052892174ebb2 halonet:stealing-your-flags.zip +stealth!.map 7C0C3397 133596382 262144 c3d044f1573eb6896bbe5be6360a1692541b0e37 halomaps:6432 +stealth!_v2.map 85CD5B56 129905214 262144 bce52916ac04a5287eeb35d1c3c8916c61c06df5 halomaps:6480 +SteeP_Holm.map 6EDF1B5A 31968531 262144 d3fa5dab6c5dfb9b05f9bf3683442e49c06c17d5 halomaps:1032 +steepcanyon.map ADAAF238 24534148 262144 0795b8385ad85cda573f07094805b0c59c0d3cce halomaps:4062 +STG_Beta.map A51A72A0 40499435 262144 860c1ae404d8faaf73e9093a8cf064931aaaf95c halomaps:2001 +stgulch.map E9378992 14820808 262144 65926b14e955bddc465eb8a49e5278d76cf57449 halomaps:3634 +STH_DeadLand.map 225FF237 128668305 262144 e4e64d2f0d075a20d8ba032aa66ad84a0df64cd7 halomaps:3362 +sticky.map 9E2FED37 24871462 262144 5e2f351dffdf4974737336d369efd6f8ddb7e948 halomaps:4570 +stinger.map ADBCB26C 20128453 262144 cf66060f467ded7825dae6dca456a1f2ffec8563 halomaps:1111 +stinger_3.map 00000000 246747137 262144 1caa5d81d88376e056536d6515ebb58bdcca017a halonet:stinger_3.zip +Stinger_Final.map 2C3BE531 133114065 262144 e57b5cbc8bc457895450750c72ac7f493b474c42 halonet:Stinger_Final.zip +stinger_v2.map 463D049B 25260749 262144 646ab18381c70d4eb61ba9d41cb37c279be4dddf halomaps:1121 +StKft.map 502B4237 190544189 262144 609970e0da10c95a390afbec77b683de32b32e7d halomaps:5576 +stkft_v1.map 42E2E53B 201129407 262144 e3900cd8894eba98ec09a3fd8b802fa742c3d34b halomaps:6486 +stonehenge.map F161ADBC 13285600 262144 98fdbe1bf97cb7afb029a1eb9caf83aa3db9c3e2 halomaps:476 +storage_war.map CF773D3E 55857113 262144 2ec94aec616249574f60bb046a60e3a605acf7c5 halomaps:3072 +storm.map 4B10BA60 20267580 262144 512e291591fb7eed69b7f1fcf646eb8cd4df4010 halomaps:4532 +storm_assault.map 06AB3DFF 65808578 262144 e347fe6e09406ae73b5cd72c6aa1615eddd341b8 halomaps:3325 +stranded_at_hangemhigh.map BC0277F9 61355776 262144 ef4926eb51ce46d31b41d5a2edb47f4b51d98057 halomaps:4589 +Stranded_beta.map DDEF0CA3 20182177 262144 16edb008f9de1b5a87a2503a623442e9f84cf65e halomaps:1007 +strategy.map 6F0AED87 210579971 262144 607e7705651c1b812c449d06f57670224b9370a7 halomaps:6844 +strategy_gulch_beta2.map F723B8EB 26254283 262144 def25c54e574213b4e508adc34c12ec21f57f203 halomaps:2308 +strategy_gulch_beta3.map 27506A41 45546369 262144 5ee15b2b7ea5a95396c0265681ee60406923e889 halomaps:2309 +strategy_gulch_beta5.map 59C33B95 44638751 262144 546d302871b59f58831e402784b5669ca5928355 halomaps:2448 +strategy_gulch_beta6.map A95EA1AF 68054001 262144 63fca91b55913947c286cb46f4aa8aca5b5b1d06 halomaps:2890 +strategydemo-01.map D0C7770E 76117096 262144 4115d8102b3dc38d589d92903ad140f0b86b6673 halonet:strategydemo-01.zip +Stratosphere-English.map 6FE948AB 327346363 262144 4cca621e4393d719e7676bedc66b7d82cbdd8139 halonet:Stratosphere-English.zip +Stratosphere-Spanish.map C916E71C 353266424 262144 81015c63624c49bfbfa7fd9accd9d45115e42a8d halonet:Stratosphere-Spanish.zip +streets_of_earth_city.map D41E6FE1 18370324 262144 324cf79b0a6c21de6e329dc568aa424823d950e9 halomaps:301 +stuntgulch.map AEB7EFA0 18714944 262144 623c04ad0de5d7b76bc2a61c2b159c2809231b05 halomaps:4769 +stuntz.map 0F87E262 12735328 262144 a2febc2c40bdf1c5af0b75b75a53d458b88dad3e halomaps:1110 +STW_Quizical.map BFFD5E54 70286883 262144 8cc880b1390faa3297d0966b3799567f6ed9e48b halomaps:3387 +STW_Quizical_Futuristic.map 2A0F3D50 41516891 262144 fffd54991d24de8968bfd24a47ba6532dbae1d1f halomaps:3389 +STW_Quizical_musicless.map 3D8CD5BD 35517813 262144 9fff36401e0f92c71700fe48d58518e74412b386 halomaps:3474 +Sub_Zero.map 70C4CC4C 324161802 262144 52721bc30aefb259b07b5c94e566978923ae561b halonet:Sub_Zero.zip +submerged.map F09F38C7 24001962 262144 8ef1b93bd51b64f2f9b97b87ed239f82887d87bf halomaps:6724 +subterrene.map E9707D38 46774408 262144 2d8118c902024c7f08d123323988fd520e281a32 halomaps:2699 +subzero.map 0F42BD11 18329880 262144 b652ef55d06fd9560079e25a2cf37cff190eda66 halomaps:1600 +sudden_conflict.map A389B74F 242982713 262144 1c92c1d4fd583a4e5ff67ad904589f445e0a388c halomaps:6287 +Sudden_Death.map 369CBEB6 296936879 262144 e6d83c0dc4644c33c6e2f34e2e42a3e8c453bebd halomaps:6977 +sufication_canyon.map 94FA4AE7 15399200 262144 0578d85e2ddc4f7c3b090abb1770d1a749de7d6c halomaps:2143 +suicidemod.map 7B309554 13936092 262144 f93a5c7457f7de6de8944d97babe8f0c0bea4db1 halomaps:427 +summer.map 4EE57D39 14006204 262144 43da52be733925b7100be1aee7fb02dd2c71f3e6 halomaps:2449 +summerwinder.map 67540A22 53654345 262144 058a762cb0784bb04b37db11639b41ec1c52cc22 halomaps:3979 +Summit.map DD6CD595 20526060 262144 32ac5b282bb0093a57195bedd52c5cd2f632ed04 halomaps:4163 +sunny_medow.map 5D6106A2 17930380 262144 0eb3828a1f27356d90d07750e5a5a5a4b0b77db6 halomaps:6035 +super-relic.map E7743E71 36969683 262144 c051b6b2db337544b6d0a0ac7f9d2d66cb8ce2ff halomaps:3274 +Super_Stunt_Track.map 3ABE3C75 20168112 262144 78275581c465df1d387cce81ba7bcbe19f349f1b halomaps:279 +superai.map 2E1AB619 28467735 262144 4a6b203024f3d919cabf2abfcf06ee76fac91994 halomaps:4878 +SuperArena.map 4A382BFA 21447112 262144 58fcbda3a820dbdd5a06074c8f746bc43a8fec76 halomaps:4661 +supercity.map 4A2897B7 22645904 262144 da7eaad86d2f619213ed2e3173ecf42496e9b13c halomaps:1766 +supergrunts.map A5C5CCD5 73384114 262144 3bbdbf18b883deb9fb121d6e878fb43ead6b7616 halomaps:7121 +supergulch.map 03DCD868 64861901 262144 35fe080f94ba6196983db6bb1a4f4f06c1e57f68 halomaps:3041 +superisland.map 6B3FFB5F 23354113 262144 e955636d5621ad84901e2ca4736dea890d793bf9 halomaps:3812 +SuperMarioceBetaV2.map CD555E65 26656792 262144 0a9314e633576ad3aad8b5b67cf6b26994402916 halomaps:2376 +Supersniper.map B25D0FC2 23440300 262144 0c8e89939cf6717f4aed219b1a088ff2ce6391a5 halomaps:4814 +supertoygulch.map 6E2330EE 20869726 262144 3a8659c21fb60d98544714cf7a8469775a5d6019 halomaps:1184 +supertoyicefields.map 96354EEF 22516694 262144 c98a20a1f5ec55c05e8d659a36e97f84c962a7bb halomaps:1192 +supremacy.map F0A86E17 14137604 262144 4b664c963e9eba26e3184d2f8fa0e6bde9c91169 halomaps:5356 +supwoofer.map 7E99C00E 31450658 262144 3edb7a848d72bacc4839e87d6f078abf6448fc82 halomaps:5311 +surf_beta_e3po.map 0663DF72 12214116 262144 1cd2848e0f3c600e1d2c9269376f7d7d88eb7e0d halomaps:4077 +Surf_HalloWeen.map 88393AF7 26830456 262144 e0b990687b027fc1618e51b25fd8460f102baf18 halomaps:4181 +surfsup.map 6F5117E8 12690896 262144 26cb174ca297b516dbff97f3d96b03186a0c36d9 halonet:surfsup.zip +Survival 1.map 936DF28F 133741191 262144 545a579efc1f8e9cb27d9a28ec8b2acc006ae4b3 halomaps:6542 +survival-canyon.map 19E07478 55053231 262144 2330eb242110edeb2638743cac02eb3fe60adaa2 halomaps:5802 +survival.map 00BC30C7 59310623 262144 d582693231b577bf5813ddd122cefdeb1ea5d58e halomaps:4167 +survival_is_not_garenteed.map 868BF621 31097022 262144 33614a09e1a2b1e03c34b7456428cd122b45551b halomaps:5378 +Survive.map A9EBFCB3 16838792 262144 8b9b17c976d3e34e883b7c5f48a5c7ccce214472 halomaps:4306 +survivor.map 0F22E554 48158739 262144 62c84ef8b760cdc69d590ff66d11dc6a94a2ece1 halomaps:3922 +svsm1.map 7C373128 103683992 262144 187d59e36a35ad8024d56fb55485d0dbaf213796 halomaps:6070 +Swamp-Gulch.map 1B0F063D 29922631 262144 b8ebc5f9793cd91bf7ca42b2a61df17ed291f7d1 halomaps:2551 +Swamp_Landing.map D4576703 177366787 262144 c286e0d4e0e495310e4bb0efb2f2b7fa093b7481 halonet:Swamp_Landing.zip +Swamp_Zombiez.map 7AB12F53 82424177 262144 07476181c421c944d2210165ebd045ffdf5125b0 halonet:Swamp_Zombiez.zip +swampgrounds.map 5F03F28A 38609452 262144 a64346afe34bb523341ed9ce4bff0dc2ba2a7192 halomaps:3200 +swamps.map 6173F268 16734720 262144 60feef75dd7e05f1109be8ddcbc3e9f82222c686 halomaps:456 +Swarm.map F228BB42 73381859 262144 a9654bd05ca7ed7b99057db5a13f203c7f485507 halomaps:2352 +Sweet.map 0221C609 28220904 262144 c2b34427a793d8921dabbfeb5b7d02278d9450f5 halomaps:2538 +swevoid.map F5E02AA9 53953572 262144 2edc22a5c6fe17dc3457fc937d85b9ed438f8351 halonet:swevoid.zip +swisher.map F09803AB 31169799 262144 5f8c8c3fcc1d008eb9dacdb23684a1bbd3d28251 halonet:swisher.zip +switchblade.map 2D43F6C1 15456348 262144 923d445a6ae0c02f3ee698c59833a166996e0e6f halomaps:2045 +sword-vs-gravity-hammer.map 5B12DEE3 162240041 262144 f838629ceb51163f7b6a5c0ebc071016be84458e halonet:sword-vs-gravity-hammer.zip +sword_gulch_ai_test.map 7EFC784D 34443510 262144 089bed68625279e9c5d7d20c1d0881f29b1d482b halomaps:3299 +swordfight.map 5B07454F 37241295 262144 94a495a22c61a85ff4ebdede0fbd78d6d24858df halomaps:5132 +swordfight_fixed.map 6C6BF8B3 189109550 262144 b3ae5da53994b46f11ac07fc3830a47ee097186f halonet:swordfight_fixed.zip +Syde-Winder.map 86D381C6 188756366 262144 f1f87ed6549104d195adbf9c7cf12f1513dc2405 halonet:Syde-Winder.zip +Sydewinder.map D1ED139E 151225187 262144 2ab1a6d18a3b7aa5739055e1c98b9c890b22a05a halonet:Sydewinder.zip +sygon.map FD9C8543 13141104 262144 4ccf5d483396e9b696b12d22cf637628c54849de halomaps:317 +sympathy_mp.map 17B51CD6 63165480 262144 df1f657f74da4131e837ca8c02408fb2c0c7b22e halomaps:3588 +sync_test.map C7E696F6 25188236 262144 5927f2741d5ff6a1a4b672faac4959394fe1a1aa halomaps:5992 +T1_Tachikoma_Shutdown.map 39D75C17 109873102 262144 f2875877147415909ff7e199f0d303b112a9912f halomaps:6099 +T2_Tachikoma_Overload.map 0B290987 88639910 262144 9c23d1050c160f2cfb7a5f84f6ce4ee7144e9632 halomaps:6100 +T3_Tachikoma_Blackout.map CE3E9EB7 87748411 262144 9ce40ae66f4c20d0cbbf4c33b88aa6fdd0301ed4 halomaps:6101 +t3h 1337.map 00E6C0CB 16537736 262144 2127b929d23b9385556d258961bc3829073d0deb halomaps:280 +t3h_1337.map 00E6C0CB 16537736 262144 a0461642463de04f9244ebce4217cd16d75832b0 halonet:t3h_1337.zip +T4_Tachikoma_Rogue.map 8CEDA655 120991605 262144 ef5bfe7ba7f467a69843369670d8e0d98e2c3cb2 halomaps:6102 +T_Canyon.map 6CEC8CC2 26087336 262144 dafafb3efaccac1636d12fda7caa31bcd17befde halomaps:1910 +tac-creek.map 03FFBCFA 64457214 262144 8d564f44c521cb35e293fd5e63ddc66e2e81241d halomaps:5269 +Tachikoma_Land.map 5E0415A6 27866952 262144 d8fb497d511c5e182a87c87402b88a5035fa0b29 halomaps:4479 +tactical-assault.map A6D23FD0 273390902 262144 d740e249d999d6aa293c5d507d8399ac73dd14cd halomaps:5542 +tactics.map 5FDB4EBD 35870678 262144 e34173bf3fb099cee43f1014f22f80ee264abd6b halomaps:3152 +tailslab_beta.map 85C1F572 13080392 262144 070d0b426dc2d15bb86bb68c7504ae57506285a9 halomaps:1818 +taiwanbloodgulch.map 2440BB10 129966093 262144 6b4b26ca75b4bd9322e6ad2dc9afbe6252b89def halomaps:5494 +take_your_weapons.map AC2EF65A 51615968 262144 5e0082bad57826072e423cafc1ae709eea14dea0 halonet:take_your_weapons.zip +Takeback.map 7388F05C 328588571 262144 b56126886ad32742be1e3d18e988182af2e33ad1 halomaps:6545 +takedown.map 3C799B70 138566839 262144 489288fe56679b0bba31407cd39d33b08d4236af halomaps:4815 +takedown_projectlawson.map 4218BE23 395514372 524288 2cce186d1d48f834e01f80f95e61abf7ee880ae0 halomaps:7089 +takedown_projectlawson_p2.map 9AABA1E5 399929737 524288 e183b4ca378831f48229c8c8b3e49240f2249aa3 halomaps:7089 +takedown_theintroduction.map 61088EA8 365659824 262144 8b20d2cb0e6a4ad7a53ad2e990c75ccb60ef8874 halomaps:6789 +tall_mountains.map 3202DE64 16295596 262144 33eb538d66d3de1bad62b142fbdb63b71599076e halomaps:1819 +tallon_overworld.map 69092660 32650423 262144 e25c4f8f888f537241f2d1bea6393563dffedade halomaps:4294 +tallon_war.map 69286E3A 37474196 262144 e70f8812128772ad8787d9afe6e53c610b96ce91 halomaps:3944 +TallonIV Overworld RC1.map BCBA3D4F 37875269 262144 42c50e80b6f72e072088b3fc4308a51d1bebcf50 halomaps:3357 +TallonIV.map B32706DF 54269288 262144 2fc7cff313a03c04c1c9af075fb735831abd0079 halomaps:1930 +TallonIV_Overworld_beta.map 1883E13C 38318233 262144 6ece16dfe50f9f463e914638ab97d1ba6013fb14 halomaps:4300 +talltree_beta.map 057F67AD 15635038 262144 b36020411075d29a1da962ebcd364df37ef17b51 halomaps:1797 +Talus_IV.map C084C59D 232324315 262144 b06bacf459db73d149e242fcb5f0649f172251db halonet:Talus_IV.zip +taos_fantasmas.map 5BBFE92D 94698062 262144 43cca190bbd40655f705c0cb42fce6730c3c054f halonet:taos_fantasmas.zip +taos_fantasmas_v2.map 52AE8AEB 118175160 262144 6005df9677f525c362b309f2f12ca16846a168cb halonet:taos_fantasmas_v2.zip +Tape_City_Gulch2.map 65837C8E 96225300 262144 128d3532273fc08c468feb9b11701926eb8c9d4a halomaps:6541 +Tape_City_gulch_v3!.map 3828E2A0 133087912 262144 5829dc838f9889813a43b1742b477489c3cbbfcd halomaps:6783 +TapeCitygulch.map D5E8E9DE 68483519 262144 4e750881dbf333485460a5c8608009f892fe0288 halomaps:6497 +targetpractice.map 5D62C4ED 27981522 262144 6f94313e996c43b933d400ac5ab5620983eb162e halomaps:3264 +targus.map CA7AEBBD 19056071 262144 98d033f57189e29ee133be56036cdb9287baab81 halomaps:2552 +tazlandgulch.map 7816D4DD 43299353 262144 d5d6e9522ac8875c8d199140deb0eb3adc45cd31 halomaps:3086 +TCBL_Bacons_Race_Track.map E0C48483 33768189 262144 9e989776d5ad1f6806ba92888ab7d7285cbdc351 halomaps:2672 +TCBL_Bloodislands.map B651CCB3 45806880 262144 f921f077ae659138157485751ff3d754fb51e4d9 halomaps:2673 +TCBL_Coagulation.map 9AE4C7AB 53688090 262144 7cac4aaf8870ff3d2d6a3652c3c4e8e567b9813c halomaps:2642 +tcbl_zanzibar.map 9EDBB74B 57434326 262144 e5b9f0984db7ab7366d8ae8ec068540f8931f203 halomaps:2674 +Tche.map 9B9AB3D4 29170470 262144 2adb00bb54483cbfd0b5df6f241155946f4b885d halomaps:3105 +td_echo_sbb.map 2933D4DE 388095255 262144 7a98d3f9ab6abf240fd9a7a269a242207f5455f8 halonet:td_echo_sbb.zip +Team-Paintball.map 00000000 74181168 262144 c0b6f1cc1548c42a6cdea2272cb6c5bb84a5f457 halonet:Team-Paintball.zip +teamslayerAI.map 306D697D 74477757 262144 57de28304be5a97d384c8b9d79160a5575d1329c halomaps:5455 +teamslayerai2.map 13895DDA 84501291 262144 59bf98b00719b54cd2095cd65b91a9c817874d5b halomaps:5458 +teaser.map D50C8853 14343172 262144 80453239fee88d3a38f767d199814d7e0c36f075 halomaps:2782 +teh_map.map 35365BB7 12124860 262144 197137ebb861d75bd48b211a48676930688c67dc halomaps:2353 +teh_map_final.map A8178422 13577402 262144 3af4217bb0033a81de406b95763e75d2522a17f1 halomaps:2377 +Teh_path_beta.map EE80A7C5 21824132 262144 47c51f4a20cb7b055f0b0728e44e422d6afeaacc halomaps:3475 +teletubbies.map 070D5193 19090840 262144 fa4d0a58783cf944c8fb79f633dec9b34fc4a7c1 halomaps:2002 +teletubbies_v2.map 1B343A1F 41037922 262144 7d05137cd380d5acf4115066ac65a7e686fbf813 halomaps:5794 +Teletubbies_war.map 4BBE95B2 260907072 262144 c1def0fd1a5885447b76d4eac75ba8ca9548e818 halonet:Teletubbies_war.zip +temper.map 333B2B0B 17440080 262144 da7417e2c7d7be21950a9b4b21dfbf0fe307aa18 halomaps:4533 +temperate.map 033A9032 43180818 262144 5d9f1acb240815df3b79af6f1e431bbea5bc710c halomaps:6543 +Tempest.map 5C044071 66877212 262144 0f05f3eee0c529feec49f4687d49569bd94a64e9 halomaps:5203 +temple.map 739A5492 13861260 262144 56f3e9c3965de180a613635148bc6fa87ead142f halomaps:318 +temple_assualt.map 6E9903FC 102330124 262144 f71b89ae91013f72c231d8985678bfe2c30de604 halomaps:1471 +tempo.map B0C85892 24738610 262144 a36d1d184f7143687991d5fa9a0cacbd9f11ae03 halomaps:3603 +tension.map CAE9338A 17124473 262144 e107b3ae613d89c199362117171eb6ea4e17bb50 halomaps:1076 +terminal.map B4E0A8DD 24722328 262144 fb53d7f08583f94d98a94e41730fd1fa71fab2d8 halomaps:5795 +Terminal_Velocity.map 523CBBFB 381781868 262144 ba892c45b4074f4902abd79b1f432eef164042d5 halonet:Terminal_Velocity.zip +terminus.map B747885C 34639096 262144 1f63efe1bbbe76f1d8a8a47643e94f9fff922fa7 halomaps:3056 +Terralan.map C21EEFAE 21532608 262144 7ee49548b82d61f230e37c4bcc82ff481c135686 halomaps:319 +territory.map DFCF9CE0 27541256 262144 c033061b975f0851e1540e89446a887d9e947f9f halomaps:2378 +test.map 16E6C389 28543672 262144 96309bab2936d5d00cbcc684bc0d208bd652fd33 halomaps:5431 +test2.map 1EEAD2E2 33002005 262144 9b03c9d4045d7a8b1681b49ca8b6941d14d46dfc halomaps:5908 +test_1-1_demo.map C9DB9D2D 11561568 262144 2d40735a6d5822e6aaaadfff394bf83f12fec6e7 halonet:test_1-1_demo.zip +test_battlefield.map D772ECF5 26890792 262144 10e78c6cbbe9f8d598c5189570d968c1b7450f05 halomaps:4144 +test_gulch.map 05A34C23 115845449 262144 7084003ff09ff9bb139a500327b2ec0f7894c3fd halomaps:6156 +testament_beta.map 7DF8A106 46328834 262144 992196b825c59112224a8a84f0ebc044b9ec5bff halonet:testament_beta.zip +testament_beta_ce32016.map B252BD92 44924594 262144 15cb629810be352fd21d1a2b3247d7bae70fff79 halonet:testament_beta_ce32016.zip +testbox.map 8A23BB45 22624008 262144 4c921f18263fe74217814ce16ad380936c7dcb4f halomaps:5249 +testing_room.map 258E3FE4 12747716 262144 8a0a7271b056f5f1c8cec55a13c728a63061d3c0 halomaps:745 +testingground.map 6AEA7129 40173500 262144 8688ed4e28db855c579597b8b6a63421e25fcd28 halomaps:5141 +testingmap.map 325052B7 18118873 262144 17ae1dc8bcf739be692416805583594bdb33d3b1 halomaps:1013 +testingmap_weapons.map AE0861E0 70827706 262144 f29dfb8140dc3da91152828c930b9733b1d35782 halomaps:6597 +testmap.map 7AE404A2 14408012 262144 2fff4d8c4db0194933a53bec537764cc124cfa0c halomaps:876 +testmap01.map 1424ADF8 19214580 262144 d0ad621611bf512b6129b2a5a598eacecef73036 halomaps:2071 +testmap4.map C01F6284 168560968 262144 da0ea6d9ee100a731e8ed13cf6813c870ec40afe halonet:testmap4.zip +testrun v0.15.map 7FC3C107 17874786 262144 7a5d1e3c69c44a6243d0dc61aca31b30ea319624 halonet:testrun v0.15.zip +testrun v0.5.map 38D2CF1B 11655596 262144 402a3fd2f040c3eef030c52176dc4e743ac63e2a halomaps:5571 +testrun_v0.25.map 16934EDA 22393891 262144 4e3548245ff2817908e1922317021837c30e3f9c halonet:testrun_v0.25.zip +testrun_v0.5.map 38D2CF1B 11655596 262144 2f3cb86375db4bb6d6825a289a358914c24cf74d halonet:testrun_v0.5.zip +tetris.map 44B91011 18043505 262144 9fd15155eee4ef3b639edea153e260ff4ad2af28 halomaps:1429 +teufel_hunden.map EDA6F06C 49350738 262144 f195acea33da01d53513f8b18c5ff1f599704913 halomaps:5114 +tfr_icetrap.map 88143D96 26713610 262144 edb63bc349f51ae822e475209c2fa9f8037b5a47 halomaps:3241 +TG_asterisk.map 186EB864 23381783 262144 bd80f1292200aadc9485072888dd4c5f4528509d halonet:TG_asterisk.zip +TG_Basis.map 75676C92 19069184 262144 131de786482e7a59d70f4ed2b099b0ebec692ce3 halonet:TG_Basis.zip +TG_eclipse.map 6144EC44 42100341 262144 5f370fedbab9a0d8caedb50d4d5ab8344254bdda halonet:TG_eclipse.zip +tg_forerunner_dwelling.map 07ED58EF 12879548 262144 39cb7919d8910ad080dee03b64d32f622246d7b2 halonet:tg_forerunner_dwelling.zip +TG_leviathon.map 4EFA1DC4 14955917 262144 e51d7162052417922bec91cd5ecf1cee6036aa2c halonet:TG_leviathon.zip +TG_YOYO.map D0729320 79479365 262144 a2875eb113a4a54d031f36a4ab6d281b6133638c halomaps:4100 +TG_YOYO2.map CB24B86E 85625732 262144 373ab58afdf4e6a8f39fc72cb33ffabc37eb1c5c halomaps:4164 +TG_YOYO3.map 6639BD74 86024631 262144 ca4df1befc3c1dcfaa6b64418ad2a58b4b6a59c5 halomaps:4235 +ThanesDeathIsland.map 034FCA9F 44809113 262144 a8029c9557b43f2878301b739edfed6089541349 halomaps:7122 +The Bomb.map F948C051 18526615 262144 71af4bc167b1a787b60cbb2576d3dedf926ff892 halomaps:4816 +The Johnlex Experience.map 7F1C9E16 23598016 262144 1937e77dbf0d0a2e8bb4e35a2e573236d1882d6f halonet:The Johnlex Experience.zip +The Lost Control Room.map 82A1059E 34828523 262144 12616ac9986fb004133b7360c696ee4cf58bd7bd halomaps:784 +the war of three.map B25CE5A1 31884245 262144 90c83e2a69180abd4f8c8cd6f70ebb79f802494e halomaps:5032 +the-bridge.map 41EBA411 69895711 262144 40591e70e03ec92594886be150a3207cffe8a0c0 halomaps:2450 +the-city-of-blood-gulch-fix.map EBC8443A 78250558 262144 93c47b2fe6a2606666e12d2878eb5373995999c7 halomaps:3242 +The-city-of-blood-gulch..map 55310F1B 80485598 262144 1b8242118bdc77df8f445e28467f130da501c052 halomaps:3225 +the-great-valley.map B234BA42 91927052 262144 8e555d1cc165447798c98e22d61bf5971108b0ab halomaps:3120 +the-maw-hanger-v2.map 06B77510 94552307 262144 bce5022851167e9757d9d3ae394b07e8e055560a halomaps:1671 +the-maw-hanger.map B92B8785 53893004 262144 eb68d3d2c195f46f95c633b7149b599dd7bd5951 halomaps:1666 +the-maw-muster.map 90527CC8 50096200 262144 a3e6e8d66323716f3aca2ee34a689bdc7f53d3f5 halomaps:1670 +The-Quick-the-Dead.map F946B370 56163685 262144 17fd965047d49d25a5ca5b5a1401feae445ee9ba halomaps:5033 +The-Rat-Patrol.map 45419E4A 134057875 262144 6509db6476543d9d0afe8ef19853c41d648b68a8 halonet:The-Rat-Patrol.zip +The-Right-of-Passage_a30.map 504B11E9 95505011 262144 5ccc238b8bdde999b72d87be7e484c85651b7f8f halomaps:5133 +The-X-Factor.map 0908FA7D 99762015 262144 86bc5ba078036f200c54161f5c28134beb843af4 halomaps:3153 +the_abyss_3.map 00000000 258911428 262144 180d95f4deead67437dd8a382dc9dd828bad6c0c halonet:the_abyss_3.zip +The_Abyss_4.map 8459F6FC 130839564 262144 72c4dd13d049640276b6f42cd6e8bb9468742c44 halonet:The_Abyss_4.zip +the_alamo.map CC023B57 123891887 262144 de44dd6478e15302076f6e9d9f61b307c45e7c8e halomaps:6403 +The_Ant_Colony.map 1D8B526F 322272255 262144 2a4902822630c53f803a3ae91b4fa22d0f756650 halonet:The_Ant_Colony.zip +the_bay_of_pigs.map ABBC38A2 42097793 262144 2dea0057bc28085a01578ed26a960d5c8946190d halomaps:4590 +The_Bee_Hive.map 1B27B1A5 241038969 262144 785e52ff1244eaa9a3d95a16a7a603a34be02d4f halonet:The_Bee_Hive.zip +the_bidding.map FA5D1E5F 49620644 262144 f6be65b493df873a17cf7edee6a58e65b46df5d3 halonet:the_bidding.zip +The_Big_Hill.map 43363F2C 19731348 262144 2630e73382980df2b02da1efcebc7e27ae77a358 halomaps:3924 +the_big_hill_v2.map A5D4BF86 24331584 262144 8bc713090eba3f9e4cbb7b1b35182797b8ded43d halomaps:3925 +The_BloodGulch.map 4CC5629F 93622575 262144 5d9a8e8f3bda9512116939a7517a9636b193283d halonet:The_BloodGulch.zip +the_bridge.map 36231353 58167737 262144 3d2c94b2bfc33d08303a847891ce88b758a69a00 halonet:the_bridge.zip +the_Cage.map F54E5002 346460481 262144 c5587eb773e6d03eabe221ee427dad6663d8a65a halomaps:6784 +the_cage_un.map F54E5002 346365069 262144 a96b2057ce70e913c9a9f30a86a8068c8c02422a halomaps:7012 +the_covenant.map C77CA195 127865122 262144 2b95d76e51020e40a8a87052569e6d8b320aa40c halomaps:5432 +the_dangercanyonv0,4.map CAF36E15 93960991 262144 99a840d129bcf7c9bb5ef387fa26b782b1a2deba halonet:the_dangercanyonv0,4.zip +the_devil_fight.map 161D7337 14691124 262144 c14c34c3b91da904637a7d5651d0ec039cb1ea21 halomaps:4236 +the_end.map DE469830 217299376 262144 2f016ad7e89517d52a1ff8ddbb23954dffbaf3ae halomaps:6681 +the_engine_room-2.0.map 46AF7527 81319140 262144 ee7eaf2817e9470cd6da32518d0cfb2abaf7c5ab halomaps:1992 +the_epic_war3.map 71D36BFF 30910801 262144 e4cdad9b9f8cba1dd4f7524a354351d619eaf56f halomaps:4571 +The_Facility.map AA90073E 311946310 262144 4e6604552ca0da37c490d3d16b6bd1e30d4461a4 halonet:The_Facility.zip +The_Fall_of_The_Resistance.map 4F3031F1 191062917 262144 48e40a9bebe0c37362fce7399d82f6002c95c146 halomaps:5577 +the_floods.map 520F347B 83697843 262144 380119818eaa220b2758ab2a4227d8c5090fbc0d halomaps:3074 +the_floods_legendary.map DB47D5E0 83983726 262144 cbbaffea5f491f9bcc80855d6cb87cda8a7d9406 halomaps:3132 +the_floods_part2.map 072C02F5 89129976 262144 b69ed7b48e1fb65c2766ad28fe48ddc57bbca2f6 halomaps:3106 +the_floods_part3.map 6292CE7E 94195515 262144 bf89da99d711f69d088db9a9d77feb33c3046e9b halomaps:3663 +the_floods_part4..map 6546C7FB 59048482 262144 b13c44370a6bd6cc59651e27dd96d6438941ad49 halonet:the_floods_part4..zip +the_forgotten_market.map 79F43D3D 56055946 262144 303b79a49716128e64ffbaba0d4ad3ff99ede3f8 halomaps:5936 +The_Glacial_Baron.map 08E8356E 44108978 262144 ba314383c029a6c7a519cb640d0a11ff2cdb53ed halomaps:3420 +The_Great_Battle_of_Asis.map 7CE60B10 84132829 262144 1d8916c8db947c8de306ed57dfe3d5ebbcf088ce halomaps:3327 +the_great_battle_of_asis_v2.map F3A2CE13 124868890 262144 cb837b5064a43c9968026dec36566778c41a5c76 halomaps:3901 +the_great_battle_of_asis_v3.map B4F36ACD 131673043 262144 16ca61c9a4d5fa65777963c915fa87b69f1896bd halomaps:3970 +the_great_battle_of_asis_v3_pb2.map 22B5109B 130984901 262144 ccbab0e4792c587855cdc12b4bf5daf3db2439bb halomaps:4063 +the_great_battle_of_asis_v3_pb3.map 8DEF9139 132817580 262144 18363f7a6252105594ae5106131b53088f558bb1 halomaps:4910 +the_great_flood.map 0F7013DC 66340393 262144 48fd99d148dd32c50973457e03671d124fbb94b6 halomaps:3154 +The_Great_Infestation.map 9898723E 242780688 262144 7cdd6ea73fce64f7148d477118d3539e1ed661d1 halomaps:6344 +the_great_war.map 4C5587A5 72230481 262144 832386b1c241c7fcb6b9a6dc8829d6230f99cad7 halomaps:2184 +the_great_war_2.map 4E667E44 80069387 262144 e03ead6cfb49b2cca34033ef6151ed28e05dabec halomaps:3538 +the_great_war_3.map FED1C560 300586653 262144 4ab02652b93855c969dc592e95840005751d84d4 halomaps:6071 +The_Hall_of_Heroes.map 7F05D3FA 16246148 262144 c9323216477e82c93642068e67edecbde1e13442 halomaps:591 +the_halo_hq.map AD768577 26247956 262144 164add117423f13d99f5648ea51f83908b97b31e halomaps:1832 +The_Hollow.map 1BB3E06D 35483735 262144 f10dc1b8ccf33dd1652145e299614fd645be153c halomaps:2417 +The_Honeycomb.map 2727F567 287854742 262144 f725962d61904e896b2e1ce3c164982c8bd1cef0 halonet:The_Honeycomb.zip +The_Hovering_Highway_BETA.map F50D38D3 81481871 262144 9d83e6fa55fc98f9abbec167e372bc5ea3ebbf44 halomaps:6313 +the_hunted.map 85741624 22056982 262144 653427526e4b597f8844bc4789ae494385d0a02e halomaps:2276 +the_jungle.map 8B1CD189 51161870 262144 10d7e00512635cad293f6a227d4ca22229673b13 halomaps:5174 +the_land_of_hyrule_v0.2.1.map 94234781 48346387 262144 651e5b8efbd9cd2ffed665b2852595b9fabced91 halomaps:5034 +The_Land_of_Hyrule_V0.2.map 0F2A4D3D 46868030 262144 3656312f02451f508c9a9494457227303a7e4a45 halomaps:4540 +The_Last_Capital_Ship.map E00377F7 207059719 262144 f2797007a464483d02ca94a9c9092aa2ff491bfb halomaps:6158 +The_Last_Stand.map 00000000 398558853 524288 68e6bdaa2b3279e24faf883dc2e4a181e035a1d4 halonet:The_Last_Stand.zip +The_Library.map E1C1E2D2 131790279 262144 9a5124e825dbbb4113f0c90675b776950aad9777 halomaps:5475 +the_maw_hallways.map C91276EF 38884492 262144 839ee4ceb2f759ddce4183284aecd1f3acb2f1b4 halomaps:4817 +the_maze.map E8DD637C 19360604 262144 b2bd95c2d7cb3d3f6bde428d2ee57de365e51e12 halomaps:3589 +the_moon_hotel.map DB9AF845 46009465 262144 13ac472e527608a924d82b0bc7b344d61b9eca52 halomaps:5916 +The_mummy.map E4FA9A60 46936108 262144 6e451dfa3c967a87406884aaed8f7bf1f97bb591 halomaps:2766 +the_mummy_3.map 473EEECB 69331939 262144 bb7716a2bcc030775776ed91406806902f979a96 halomaps:3097 +the_mummy_4.map F00C6873 63521073 262144 dd384d1022a6b29d1581382daecd3da3b3f3defa halomaps:3265 +the_mummy_5.5.map D27A270E 80772026 262144 3e66704b77d39f03d04be314a226e817467b6922 halomaps:3719 +the_mummy_5.map 12BBE9C2 78165771 262144 9aa93d5250fa6e94dd6145e8afb93a5b45e24d80 halomaps:3518 +the_mummy_6.map 98FF2FFB 80891626 262144 d0375ad06ce1d8002ec84dd24262d5d123f0d974 halomaps:4269 +the_mummy_7.map A8B82AB8 101202845 262144 e1462561a98a3e864e30c2d1e05cda7ed1949a97 halomaps:4541 +The_mummy_returns.map 1F4C2FA8 78666422 262144 797730cd654ef02409d0e0e5785c69bf5b647966 halomaps:2783 +the_narrows.map 11F8152D 29074420 262144 6af6baf0c43c6d61eb5cc30e18dd5efdd6822990 halomaps:1053 +The_Old_Forest[Build1].map 358E15FD 365863459 262144 da2771248380054ae9db4147264939baead18681 halonet:The_Old_Forest[Build1].zip +the_omen.map 9A19F62E 17579068 262144 79d46c4fa34afe0f0bbeadbd524703473b00facc halomaps:1587 +the_pharohs_death.map 3B75F237 76302430 262144 46711af220e48835904ec71f63a2a99627b166b8 halomaps:4078 +The_Retrosic.map 9ECC3373 37168602 262144 1f61338724e50249ce6eddfbff33e32df61adf5b halomaps:3087 +the_retrosic_v1.0.map 8A81F7BB 60962197 262144 ead2cffe4af25545abdb0bf6732ac401410a26a6 halomaps:3155 +the_rise_of_asis.map 28BB51E0 89796456 262144 47fc5b894f7cd163befae9cec084eb6e9ef0b564 halomaps:4572 +the_rush.map EA3D85AD 33493097 262144 8c3e866167dcdde183a5732dc29753faf43ca68f halomaps:2003 +the_sidewinder.map 392F570D 397502440 524288 d106f56fb0d3c770900ce5e164b6c6ebe43a5aaf halonet:the_sidewinder.zip +the_sidewinderv0,9.map 18AE19C2 98253621 262144 156048ab9c1fadf92860ccfd599637f48d238e7c halonet:the_sidewinderv0,9.zip +the_spartan_coliseum.map 74DA66C4 33473663 262144 124dbea908e03b5c66efcfdb11b94bc4f1b697cf halomaps:4333 +The_System.map 85E3C83F 14051640 262144 8902f98157410ffeddc562ed3629a96f4c80b562 halomaps:2847 +The_Warehouse.map FB86B995 132231441 262144 36dbdbfdceb75bf203581ce6a3d4d5c426008491 halonet:The_Warehouse.zip +TheBestBloodgulch.map 8D1CA87C 57537508 262144 9bf51bb947b5fae0cebb161bf2d985d3605fb3be halomaps:3032 +thebestbloodgulchv2.map A5772F5F 53240228 262144 a62add9bf6da1ce9cca756c1c75ebe5dc7f78c86 halomaps:3073 +thecity.map 275E48A3 17648776 262144 f01b3a770ab87b0be7ba32bc306dea89887ac8da halomaps:1556 +theclearing.map 0BB10F91 13513276 262144 f8cca211db4dd1a3d3a0b170189eaa732a971b8d halomaps:320 +thecovenantatwar.map 42E4BB04 34572012 262144 f5a1a3452ff777f763fad69dd0a0bdf2d00143f2 halomaps:3900 +thecross.map 94194929 13846228 262144 b173c3589b81dbd6b21a38bc5c23e32f54c5ee1f halomaps:2752 +thecrossing.map 867DE98C 35218584 262144 dd42e36f84fe867b3fcd4b121d4092125c32832b halomaps:2997 +theditch.map 08182395 24013143 262144 e1e9166c21a4b08b0802c47892bfda80cc3bec0c halomaps:4414 +theend.map D64D0C28 61789731 262144 d33abb8562f9e02e067a6f42ca69052e01fbe235 halomaps:6051 +thefacility.map 803C0303 38946920 262144 263dc39766f27e47988eb58e7cec7710b8cfd511 halomaps:363 +theflood!.map 3319F4ED 69943483 262144 6a0a06adca464422f73e1ed5abaa8aeb31c8f451 halomaps:5796 +theflood!v2.map 595D767C 114202806 262144 4440387ba047fee95c84d4716ad30723fad27a47 halomaps:6157 +thefloodwar_battle_final.map AA30DA2F 311381877 262144 4718a1427f0cd1ff991988e999e30c48a2ef4650 halonet:thefloodwar_battle_final.zip +theghost'sbloodgulch.map 5DE6F6AD 22534390 262144 e9db4670791607dcd4efc417ace3cd7cea73ad24 halomaps:2262 +TheHangarClassic.map CC9A4B42 28486760 262144 01da875072370b9c93c821b9b3acdd0efe4adae6 halomaps:1205 +theisland.map 32C8E7B9 12615424 262144 727c68686f7724be079563a45b8a270a08cb85ac halomaps:2072 +TheMotherlands_BattleRoyale.map D3E18270 118069226 262144 3af31f66a6f182b7be42ac9e6acf4795aa088723 halomaps:6402 +thepillarofautumnspace.map 0B0854F3 56418452 262144 46c75ed926649ac58fd47028ca0735a373854663 halomaps:1055 +thetrack.map 0346D526 15203828 262144 952ae626f4eee17a0d7780e3abf64b193023f459 halomaps:786 +thetrack2.map B912456C 15411470 262144 749082172a487b6c1ed65910b3a577bff573cc8a halomaps:787 +theunderground.map 7D2AC0DF 20438840 262144 e65d2f28c67392046a837138c2465574920f3429 halomaps:3882 +thevalley.map 4F025E62 12961256 262144 73de8a7d4d2aff33b14479f742c29963e5731d7b halomaps:5242 +thevillage.map 07B3876A 13097000 262144 2c9f1f72c072e2c882af24fd81a76e6672ba3207 halomaps:1000 +they_hunger.map BA0FD59C 40702005 262144 0118822120fcad25c4f5eb737cec50ab9413acd0 halomaps:5379 +think_green.map 02E0D2AF 67476390 262144 851d2683618110a136b3c7d00056f7a3583943a4 halomaps:4950 +ThIs_Is_WaR.map 02BA05F0 81185032 262144 c57a795172928dd325d25eacbcf4175b085548c5 halomaps:5694 +thunderdome.map 008D3F8E 27543868 262144 2b48aa9be8b8c30c3eddf2303bb41a47f6e558af halomaps:5163 +thunderdome_fixed.map A9641914 21213245 262144 7d068d3e6d3b1e8a877fcf299cdfadf816e13f70 halomaps:5572 +thunderdometestmap_release.map BEB4CA65 23429543 262144 eacb56d6c5fd6fb0e3939dd50f3a5bd63f170028 halomaps:4951 +tianguis.map BC640E18 75523101 262144 28329d8583a614854363ff1e742059356416f5bf halomaps:6735 +tianguis_v2.map 4F77FD08 123260353 262144 4e8dbe23ec998cf77a3dcf99afaa7be3c91d1381 halonet:tianguis_v2.zip +TightFit.map 11AAB143 12376116 262144 f7cc9282889ee0a87c1a49548b6bc290b58fbc70 halomaps:1093 +tiki_attack.map C8519DF6 64578685 262144 aec9d1e8338869928368015f5635478b7009f4c4 halomaps:3720 +timber_river_defence.map E3D28EF8 101217915 262144 89220ff3f4d548bbaa6a21f1272e2f66da89d29e halomaps:4628 +timberland-ai[unfinished].map 08985F78 96275844 262144 ecb29e94c5536e2c6716b02f45033da9cf37500f halomaps:5711 +timberland.map 54446470 14690920 262144 7ea6d181ade586c93b675aff44a0b3af007db4f2 halomaps:4789 +timberland_defence_beta1.map 0D0EF6D3 45927787 262144 2489762e30119ea0aaaef892539ee60e6b8ec5d7 halomaps:3503 +timberland_ME.map F873E086 51388294 262144 3eecab92395b9efd8eb65aec7784efb38ad95d30 halomaps:1883 +timberland_rm.map 54446470 305828116 262144 4faa7903746eb8b38612dd4407fb5308eed10ec8 halonet:timberland_rm.zip +timberland_snow,v2.map 28D5BD1A 138429001 262144 7561f8f716bfe9f42991f0cc61125a14af74c414 halonet:timberland_snow,v2.zip +timberland_snow.map 28D5BD1A 138429001 262144 6d4c700a26e88ad2ea41ebddd3a72b4263ee1a81 halonet:timberland_snow.zip +timberland_tmcc.map 51873846 38883872 262144 2e74f87372ec4460199e5eaa10ce3150f5005c7b halonet:timberland_tmcc.zip +timberlandCTFvehiclesmartai.map 890BD7C4 14789204 262144 f229780c3aaad8794eb60b4a3490cb63b5105516 halomaps:4879 +TimberlandFirefight.map 556BEF98 75280184 262144 d4e8b7daf91d69e24226a70f7c637418f92035bc halomaps:5107 +timberlandmod.map 28D5BD1A 73841676 262144 8744b921df221fb3a9d55e473f7de0154a9b237f halonet:timberlandmod.zip +timberlord.map C611566A 64739882 262144 c55ce5e5342e0c2cf411e509391609998ed819b2 halomaps:6115 +timbermod.map 8E7B2813 45301161 262144 727a932bad8eb224a4880a482a502b8585b02daa halomaps:2596 +Timbernight.map 513522D9 46179334 262144 783735146fa0fb5b0c863aca6f62f6fe4e5dca59 halomaps:6358 +timdareffik.map 96861476 101451175 262144 6a6b93935e606f898039055efae6b2edc8383c6e halomaps:6711 +Time Shift.map B3CACB3E 331021321 262144 a58621720762d453db6e434aed6103d673646cae halonet:Time Shift.zip +time-out.map 3089A7C0 97056325 262144 adbef0323ac89045f867da764c68ddafcd045437 halomaps:5192 +Tiny-ass.map 1DA82C16 15384172 262144 553dcf84ee38711d96dc6ea5cc1ce47121ffb1fb halomaps:2046 +tiroteo-island.map 58A80205 379571605 262144 36a00ee6a226f442406ce12c43f064e41b67e1d7 halomaps:6785 +tj.map DED165E3 13870752 262144 9a011435e552b60a1dfcf030bbd90c11bae18ce8 halomaps:2929 +tks_crazycanyon.map 17C35906 33147793 262144 535d8ecda4ef5dabf98b25bb4f11f00d66fc80c7 halomaps:4952 +tl_test.map EBDA3DB3 24250749 262144 0cc052830dd5ad6ace8e4d9efc12ada2e1846e5d halomaps:5856 +TLMP-Amplitude.map 5D56BB15 55639043 262144 021e99fff96b68782380444f8ac637de599ddb33 halomaps:5251 +TLMP-Circle Pit.map 56363A0D 51522402 262144 0d24c060e49fef4161eb94a4ec125f0a49d25a18 halomaps:5252 +TLMP-Dismal.map 0D8AE14D 67409396 262144 38f694c01a0b59e90225f282acb18c0d3460445e halonet:TLMP-Dismal.zip +TLMP-Harbinger.map ED6A71E8 76747288 262144 13e2bb9249a9f6aa091b4761c4b9f4dfe60c4a8e halomaps:5253 +TLMP-Highground.map CC8597C4 61754060 262144 75b3ecf884863c44fd266f9417d0af36914d9b28 halomaps:5254 +TLMP-Lefty.map D9299CC6 47842828 262144 e1dd13c187ebd0be9de773e88fc75f024c916ad4 halomaps:5255 +TLMP-Mindfuck.map 6C5152CF 15642576 262144 32c80cbe35e80fa691682db0d3b7c85fc3bd85ae halonet:TLMP-Mindfuck.zip +TLMP-Pipeline.map EE07AB63 51057032 262144 c06ee51835a30118760db93a78dcd75c2ae63f7b halomaps:5256 +TLMP-Snowtrap.map AE258C8B 101558802 262144 d9e78e0a43c0c370127bc461fa82c5c87141a38e halomaps:5257 +TLMP-Station Omega.map F1F39F95 63082378 262144 4dc564d236d062914ebd7f8c4d95ced25a429fc2 halomaps:5258 +TLMP-Substation.map 8B2D6B68 55032856 262144 fa81897f4c92345e79ee6895562667c76bf2182c halomaps:5259 +TLMP-Vertigo.map DEF6CFFF 51358492 262144 6baff0b1e04e74a8cb0da17b205de4b737cf3fc0 halomaps:5260 +TLS_Devils_Drop.map 52B6341A 19659644 262144 f867eb90996add613a6033182e0c1f6a8efc761f halomaps:2245 +TLSstronghold.map 256D4D47 17009128 262144 c0ac386f809a81de99b7b056bc109148774eeb67 halomaps:3201 +tlv2_test.map 31BD42B5 24250417 262144 379b76861f5a0bd524fa1041af3b5b846bffb050 halomaps:5980 +TM_Fracture.map 9DD528E9 128967003 262144 56a42e7b6db215b3be1c74e3e6bb4c24a2ed69d2 halomaps:4629 +TM_Immolate.map 2D306851 79688202 262144 9543ea010d8b4190f4bdb0453f3aa765f358d5ba halomaps:4880 +tmc_a.map 6D1948E7 276449025 262144 278e0417c584b6ce8c38061f5fefd06f72f7bac0 halomaps:5631 +tmc_A_fixed.map 92177F7B 279199529 262144 63bf3970135f1cb7872d50e7621271f3bb5ed2e7 halomaps:5909 +tml_hr_cla_ink_fissurefall.map DE8DBDCB 230861865 262144 fe73678b87278bf0439e65fb7d39cebd052940fd halomaps:6786 +togentiana.map D9745E80 15813156 262144 c5a0ebd44d12b1ed47e06c2cfeea42c4b19eba43 halomaps:3300 +tomorrowland.map 8E3BD8CB 225551391 262144 7947b21cad4f5279f971304f9efa6b5b10c36c1b halonet:tomorrowland.zip +Tomorrowland_v3.map 00000000 277243677 262144 decb2445913cce7388951fa276f78e858cb483b7 halonet:Tomorrowland_v3.zip +toolbeta.map BE43AE61 41988810 262144 2555d0ac564a0eba121307ebee0091dd82bf1b61 halomaps:2512 +top.map EE43A9EA 12632648 262144 a088f3901c956c32dc3df018686b489b08f72b2d halomaps:5380 +topv2.map D8B57DD1 13751912 262144 e2725a47f15ce26b6e043012b5f560db117f0317 halomaps:5433 +TormentX.map FA08CD31 24558592 262144 55fb99ff17f17dc2f8c347c596f8eec1715cf927 halomaps:2004 +torn2x.map ACA62A97 14373916 262144 acc6763de989a81b62743716700f72230e6dc0d1 halomaps:3180 +tornadogulch.map 82C202B7 67031333 262144 bc4875658d207abc0e2439ee2fffd549b64a8614 halomaps:3182 +torus.map E59FA823 13542604 262144 37b86a794d9ddcad0900d87953f2627c96724601 halomaps:281 +totalchaosAI.map 31B67EF1 13970588 262144 ef6b95e7f72b33330418a4ea59e1a036b7cf51ee halomaps:4165 +totalwar.map 290D3AF1 16645750 262144 fe2f30daa6ab76b055dfb0693c09933e51b237b5 halomaps:1686 +tower.map 2DDB8CDF 50792411 262144 2b43894798d19c946b5ecfd7c89bf8c792400964 halomaps:5430 +towergulchxl.map D401C593 19516424 262144 fc521866e542f8d30173c02eb316ebe46d77cc5b halomaps:484 +towers.map 40B3761C 13412752 262144 8ee8ce8b89653ea85fc95c5886202b88242302f6 halomaps:282 +toxicwasteland.map 1DF8C97F 18153284 262144 edefb8b29a2501afbe2f55b63a0df6e71d2fdcdb halomaps:2616 +Toys_In_The_Warehouse.map 225904F7 17141721 262144 2f6fa4ed18b3418a64a65cc13bc05bdd82803b94 halomaps:1226 +tp_kakariko_alpha.map F6CD1765 39149478 262144 66f814c55cc1a80734d2c415a80ab840cf51aa21 halomaps:6271 +tp}dangercanyon.map 0BBA0EC8 64097205 262144 978e2824e944c4cc60bb8aacd735232f837cc1dc halomaps:5630 +tracer.map DFE846AE 13677148 262144 eca3693f07323e9e11e1244c36fcce40bc6d1aca halomaps:2701 +Train.Station.map A7A8FD64 30099808 262144 38921393f5dab9c95dd303fcfc850c043600041b halomaps:2702 +Training_Compound.map E3F73850 176240760 262144 747411d13bcbc15b0e5bd33460c3f11db567f38e halonet:Training_Compound.zip +training_ground_zero.map 4C663108 36876896 262144 325aba910f8ad93efc97cb07857939f3f533b88c halomaps:5164 +training_grounds.map ADF51885 39540823 262144 07b347ced2817b1bb3c76ea84e55826fdff0746f halomaps:2861 +training_jump.map C9212097 12529480 262144 ca9129d6b56afeb3b337d9af6bee97f3e45378c6 halomaps:2005 +TrainingDay.map C8350C15 13944608 262144 36e4eee3520f3bf2f95c128cc77e0a007c7b8475 halomaps:1217 +TrainStation.map A7A8FD64 30099808 262144 09ec910bdf20a4aca94dfc4aefebe55eae9cfa1d halonet:TrainStation.zip +trainz.map E8E44FDA 20893671 262144 8110a64c8d25f0f894d0a7e7546f3696c1712a60 halomaps:6843 +Tranquility.map F95D7BC9 12898112 262144 2264e513621c8025e616db1ae69b86179b38d839 halomaps:2161 +Tranquility_V2.map 5F65320C 14951648 262144 77e494ffbfdf4b26e3ce52e71f1759ff94456e9b halomaps:4993 +Transfer.map F454B92C 17948263 262144 09c20a640ddb619b1bd8acaf412f7584dc854b6d halomaps:283 +Trapped.map 3F148989 15067548 262144 b4f301c48ea072fdf928f653a0f720ab0e505153 halomaps:2144 +trapsion.map 18EB4F61 29004718 262144 931af7de3c20bd0676dae8898098bce2b43cdad5 halomaps:2174 +treacherous_ground.map 627CB83C 37663376 262144 60aee06370f0736cb90696911063b521e9c43064 halomaps:5642 +tree_base.map C8BEF660 24109597 262144 23f03785ae821ac621b7cff13985c90705970240 halomaps:3539 +tree_of_life.map BEAF809A 14713596 262144 4c29afe7b6c75ae46dc3b89a9bd0292e7e401ec7 halomaps:2369 +treehouse.map 4E3BEA93 50922058 262144 961449ac4c2024a6094d17e4b3869722c716fc9a halomaps:6025 +Trek.map 219906EC 14276528 262144 0b067a635a9b294caf720ee4861c2c2dce879835 halomaps:7065 +trench.map 78189FAF 64244092 262144 98e6650ccd403f0f8059d6a9a515deb1b0753a87 halomaps:7013 +trench_wars_by_colin-blood.map 3BF7EE48 81382329 262144 9ed38a936e326ff779353f1ceda93cce2728519b halomaps:4770 +trench_wars_maxed-colin_m_blood.map 3BDC3B0F 131614911 262144 d07ff82298476f00097d070860a3703450b3c09f halomaps:4818 +trenches.map E0FF495F 14317618 262144 e5fe5a7272da7438c22e96ebdd16c126304f8a0d halonet:trenches.zip +trenchpart2.map 269F510E 82064903 262144 bebae911546b4f86d40a4efd6f481df5fc0abf9b halomaps:7013 +trenchwarfare.map E289C231 31478231 262144 56791b3f56ccf93a48425299f558b108a52f86e0 halomaps:4558 +trepfull.map 47A6A6B9 47851598 262144 3f09d442555d3fe3bc1ad8b99fc167c7d2f61a78 halomaps:1494 +Trepidation.map 161F3929 25993872 262144 21e9c119d4a0fa9cbc081db59c36ab6b93f09c8c halomaps:3273 +trestle.map D44098A2 42693971 262144 d13d60712ddeaeef525c3231f67dcda616cdad8a halomaps:2767 +trialgulch.map 00000000 35600048 262144 54c49b8460ad2418c5d87c2fc8fbc2d2bf96d671 halonet:trialgulch.zip +Triangular_Conflict.map E173061C 80202317 262144 e911e871807225abcef19dded014c5ed4f15fa29 halomaps:4534 +triangulated_eight.map 61308CD5 14029908 262144 1d7f53d5cbdac8d502ff2ef982f7dfb524363347 halomaps:4849 +tribulation.map AC551493 56463500 262144 a10c7e12ae674dd2494c98d7c96a93f80ceea341 halomaps:4347 +Tributary_of_Lost_Souls.map 228438E8 22036655 262144 d8a74662fcb017351151d354bc5c376a6510f100 halomaps:1043 +tributary_of_lost_souls_tourney.map 9AAC8A85 30144446 262144 4b22804c27052d0f2ffa65d283b81eb9648be0d5 halomaps:2513 +triduct.map DC8244DD 28474404 262144 45eb588af954ca3f333dfa01b3ec43afbbbd4a7a halomaps:2998 +triggerhappy.map 213E7885 22359941 262144 a1ad067a06010ad7348ee69142731f2bd8afa9f8 halomaps:757 +Triskelion.map 8135E1E7 176222488 262144 ee8afda087ae7ecf905dbc1fe814016c461fcbd1 halonet:Triskelion.zip +tritower.map FAEA421D 25433068 262144 94589b7ba7b6c89bb0101a2bd104e2155a21c958 halomaps:3604 +tron.map 869EA31B 12409400 262144 042af6eb8d71abd5af8825c119587ee080ee8540 halomaps:2730 +Tropical__Forest+.map D135F4CB 15134172 262144 cd222d5b0deb636147b5cea3298042ce03135863 halomaps:5381 +tropical_grave.map 9C05CC36 19950672 262144 4d766f41909b2f82dbfb0594edca3218ca523d9c halomaps:3828 +troski.map 073B71B9 14194948 262144 12584d4438a33b91d07b153ee242b0e925dc59b8 halomaps:6459 +truth_island1.1.map 21637629 28149643 262144 a1cae516f453e10fabeac19784448499b6ab9516 halomaps:2388 +truthandrecon.map 61DCC0D0 51101366 262144 00c56b2590369a71f2fdf1ec107fa4cc659f5eb6 halomaps:2961 +truthandreconciliation.map CF89E80E 40702175 262144 2c4004210e24c2f2b87e630d982c270b799d6777 halomaps:858 +truthislandsp_partone.map 468362B4 83984951 262144 aca12eaa849eedc260bac3e9707f59f12d0921d0 halomaps:2452 +truthislandsp_parttwo.map FE8A6870 85062463 262144 17305338f7f07fab6a6e7a3e10c48e840401bd1f halomaps:2453 +tsc.map A576CE45 42065519 262144 394a28a1c4e85c61d8746c7e669efa7ded1ad84e halomaps:871 +TSCE-BK-Multiplayer.map 00000000 334386166 262144 6d9bc99ed80320b7776dcccb66db2b685d2ea432 halonet:TSCE-BK-Multiplayer.zip +tsce_mp_v1.map 21589081 257968828 262144 0886b98c223758dd21c577b9e25d6ef403ddb0ee halonet:tsce_mp_v1.zip +tsce_multiplayerv1.map 2FDF02B8 304954960 262144 e9e880b5a19b3cbb39275bcdea001df3eb996142 halonet:tsce_multiplayerv1.zip +tube.map 6F96071E 11984676 262144 be59da7a13216efb21ae38724a5544ed810a0516 halomaps:284 +Tum[H3].map A191D4E0 102363862 262144 506e7446608122aebf098ebeff684f5af87691b9 halomaps:6624 +tumulus.map FBA02D76 130524124 262144 497f546f84fffc2cf607fcddbe41e08a8614cc99 halonet:tumulus.zip +tunnel.map C5992A12 23796689 262144 1e313abbfc5cd1d186bc7f139b0b67d17c0f85b8 halomaps:6787 +turbotin.map DB4424F1 16123620 262144 27b1ae3cb8a94a806881cd55c36f7e3f4f5d1554 halomaps:2703 +Turf.map E82F9D3B 29568708 262144 b0b59eb29056a9e57cec1061ed65c182c3f63fff halomaps:5270 +turf_zambies0,3.map 0904264A 69813944 262144 524464088a202de26d9cc1d0eecd9d0bae89f793 halonet:turf_zambies0,3.zip +turf_zambies0,4.map 912CEA52 36619109 262144 a877c671a700d6aae866dbf19f4472ed0dad97df halonet:turf_zambies0,4.zip +turfrevampedCMT.map 43728A16 51028184 262144 6e27ece75fb280c15d92b7c9f0347cb9e70e4f59 halomaps:2597 +turretfight.map B29A0124 45680672 262144 1041bf72f9eeb44e103f1ca2e472abb6db89981f halomaps:6596 +turretmap_beta0.6.map 12B4EC08 71942930 262144 b7a4d720833d682d992dd8943234a32bf7e79bf2 halomaps:2506 +Tusken_Raid.map 905D7E6F 42499004 262144 b3d57d2cb90c0254e116b39e9ec103ac0d33f094 halomaps:4435 +tut2.map 17577A9C 50436407 262144 a09fb8b32cef38042c459b3a867005c844774162 halomaps:5382 +Tuto.map E399814B 14037080 262144 1b921c29ae7322c88a0df77618e69e10c7c6b8dd halomaps:5937 +tutorial.map EBEF3E0B 13947716 262144 c6a3934b9045908846f487d2861900731152c4c1 halonet:tutorial.zip +tutorial2floodb2.map B0082137 55882632 262144 a961489071675b805c33a6860ddcdd7361afbb0c halomaps:4559 +tutorial_ancientcombat.map 20F43801 16963324 262144 e5631af6307ff63090cc90ac66f4b5502481132e halonet:tutorial_ancientcombat.zip +tutorial_map.map 037A7132 22100416 262144 15845f9f9033c15caadd4f8cc99ccc954aa9f313 halomaps:2096 +Tutorial_Mod_Alpha.map E114E411 32979705 262144 47ad1c6c7f352b18782b54b3138b7ebe0f3c0589 halomaps:3555 +tutorial_mod_beta1.map B6F86612 97399240 262144 f351072ae19495b6035fd079125a01c580e43541 halomaps:2974 +tutorialai.map 4E1DDE0D 15123468 262144 f3c47869a7909a5d451e9fb4c82d4c773ffb6031 halomaps:932 +tutorialcvm.map 21AA10CA 67600357 262144 4a2d35eb4c88cf54c98ae6520fe8c3c98fffcb7f halomaps:3813 +tutwithfighting.map 4E7E6316 55623075 262144 650c95bbb905a5ea0d562474a845b1408dafddc0 halomaps:3540 +twingroves.map F5D5B351 25807016 262144 0ea5ca98fb79a79673708912ccb9fbc2c89aa692 halomaps:401 +twist_beta.map BFDA91DF 27341928 262144 7c365bdbad19f854832eee4a489db00c4ebd0457 halomaps:2987 +twisted_canyon.map 00000000 89068708 262144 5c9cf927a165bc98db0d7efdfbeb23f41fae6c6f halonet:twisted_canyon.zip +twisted_metal.map 7BEF9F43 81790718 262144 733b78f261213b2ad7ac655c219cbb9ee835db19 halomaps:5713 +twister_canyon.map 2B0128DC 14839992 262144 cd8a4b1ea2155538e51beb4d85f12fdc95ff8dbb halomaps:286 +tybo.map 98CA3896 14358324 262144 8b2d5b10d5dc59653b0947e6c4b43df566c80b08 halomaps:4445 +u_turn.map 910C6480 13796060 262144 329af724c371646a6ece1d1660c932a87b867dec halomaps:2356 +uber_red_verse_blue.map CB7AD547 20092188 262144 4fb9bd864676ec6cd4598475975c8d25f7d6c6fe halomaps:5035 +uc_hq.map 7285A0F7 19675436 262144 f96e765c40881ff7408cc08fe3085765df562124 halomaps:1164 +ui.map 73EE7229 2561000 262144 d03d3e2caaafe2c32be3ebb74279b590c4359550 +UI.map 8F73041F 65792570 262144 e750091bcc572be37db0edb91707b349a251eb64 halomaps:6952 +UltiGulch.map 852AF447 18396450 262144 981837617a870953d618f277cf4aa8a2f82a1bb6 halomaps:4207 +Ultimate.map 7DEC79F5 38506526 262144 8970d15d1a2ad2a6b7b825666120e59a410208bb halomaps:4953 +Ultimate_beta.map 7AACC2C4 177986637 262144 caf2f1ed624d59a1f83dd3adba5b7cbba8d91e80 halonet:Ultimate_beta.zip +ultimatefight.map 06B754D7 64419140 262144 4e9dc0f018b00230d196440a09c4b01c0f80e199 halomaps:2097 +ultrawar.map 696F936F 78739029 262144 0a6a5c054b574c69f6ee3d375a8e31cb7b80a133 halomaps:4371 +UMP-Advantage.map D1DFD285 76425647 262144 0c41cc1a60baffc54ceb3851d15ea85ce501bebc halonet:UMP-Advantage.zip +ump-assault.map E5DAF7B2 86403455 262144 ac70a44b678e325afb878e376d6fede847b25326 halonet:ump-assault.zip +ump-divide.map FE73D325 75289779 262144 a39d7a63c942a7475519f87bc1cb6f83c792b0a2 halonet:ump-divide.zip +ump-legend.map 0008C3F6 83878239 262144 40abc6dcae4b2bf20251c2ea47911ee19de6c885 halonet:ump-legend.zip +ump-mirror.map 3F9CC0EE 77500775 262144 8a39dc0c9fb5d0c004999ed98fc0f03ed017114c halonet:ump-mirror.zip +UMP-Purity.map 6B7D551B 80738631 262144 a3520d80c38c8dfe06dd488319206c4a16a45416 halonet:UMP-Purity.zip +ump-sanctity.map 33D593B8 81129991 262144 5820d70ecf7af4d51180b548534c3e4b3b3059b3 halonet:ump-sanctity.zip +umt2_metal.map A787087E 55225965 262144 b889c530354589f879fc54c88d78c38b18eb8925 halomaps:4270 +umt2_skydive_heaven.map 2675062F 64404881 262144 895840ca4aa34b0c53a9d2ab28ebcbc7840bba85 halomaps:4498 +UMT_Archive.map 8B7D4CB8 23360510 262144 6b407986908f4f445d970587a27dfee9b3ffd32a halomaps:3119 +umt_pwnage.map 30DBBC5C 39059540 262144 699073ead246afdc6a75908eca895e67da5cd19a halomaps:3172 +UMT_Snow_Grove.map 2A577820 52383010 262144 9684fee5bb1712cdd2b29e96c5829995d34d90c5 halomaps:3118 +UMT_Swamp_grove.map 1158B3AD 51324770 262144 2817d0fba1be11f81c79ba301360d43996faeb34 halomaps:3117 +Undead_bloodgulch_x3.map 25935E3D 277563111 262144 4b22c76fff30254b08f4841e18564b70fac23135 halonet:Undead_bloodgulch_x3.zip +under-new-management.map 1F7B2AA8 92806417 262144 ff9a0db3f58c953b8d661bf893b6bf9e33bd52bf halomaps:5515 +underground.map 20DA71E4 16124288 262144 0d0dcbf8988505af7b6fc625e1e536a805753853 halomaps:3388 +underoad.map 926B1DE6 31079500 262144 467253115277057f2345135fc7165440b3468687 halomaps:3033 +underpass.map A0EC1EBE 16722388 262144 a2498e84a9294d8ba1d76a753ad04508ba1a9ef9 halomaps:3421 +underpass_npb1.map 07A2D1F8 15762816 262144 9493b02df007fa6805a7ff8adc472b6233e999a5 halomaps:2975 +Undersiege.map D1A00E03 14209216 262144 ef87c7e3752a7f9d2a1ac280d672f3ef4f1aa40f halomaps:1142 +Underworld.map 1049EC89 284679781 262144 9c10f668102351c03aa5985703478821760b86bd halonet:Underworld.zip +Underworld_2.map CC58ADCB 284680245 262144 9a7f4d1782dae84fa49bdd1305544941ec405cb0 halonet:Underworld_2.zip +Undisclosed.map 246DE182 31679721 262144 3f4e299436df2f9a5524b439ae6eff55b6124ad5 halonet:Undisclosed.zip +Undisclosed_v2,0.map 1D88A297 63262124 262144 01bea147b471acc6b135b60f26701bf6c958961d halonet:Undisclosed_v2,0.zip +unfaithful.map 95FF41E1 19530345 262144 8d31316062ab937af8346bfcdebe17bb5cb1cccb halonet:unfaithful.zip +Unimatrix_1.map ED321BB6 266257889 262144 09eec61ce35eccb01208d46bd4747c7fb59ce993 halonet:Unimatrix_1.zip +Union_For_World.map 4E629F8D 87736165 262144 c784c1d0b035ec4d11bccd14540e30ee114ea308 halomaps:6907 +unreal.map 14331888 44103356 262144 06102529abd1be63e93cc141951cc4a14370ed42 halomaps:2891 +unsc.map DC14D69B 13390472 262144 d2f09d4e28049cd73c4d52c538172b7bae4fbf56 halomaps:7066 +UNSCfort.map 6D1562D3 14143650 262144 afc5109a837879dc9243384de2740fad339c1807 halomaps:1092 +up_dustyle.map BB4E6990 26427172 262144 352aaf902a001a77e611b703ed6a3c80863d2d60 halomaps:4107 +uplift_071817.map AE237DC4 12604580 262144 126dc8bd5832863b4fbd60929e07ba0873fb089f halonet:uplift_071817.zip +uppercut.map C2F3F8C5 114362889 262144 e6389ad71bbd872505ba4998a3ae441bc0aa0843 halomaps:2211 +uppon-a-slinky.map 6113585F 15854208 262144 3d000e6ac03e40d9dc7ad684f13f70d063557f57 halomaps:3075 +uprising.map 9D5557C9 247271555 262144 9ccf80805fb449ddfa4650234d364e8c6c3e4029 halomaps:5857 +urban-beta-v3.map CC395BF6 75979625 262144 40dcb45e6609ff301f553855520433480e49bb2f halomaps:3202 +urban_1.1.map 3DBAD5A8 178106129 262144 dc938dd76bd6ffed97ec9b0ba02d94d543787dad halonet:urban_1.1.zip +urban_warfare_beta.map 923A82D7 20142924 262144 47c1aca4e8e788de93af039d3bbe4b37ba380739 halomaps:974 +urbanchaos.map 2D09756B 23568614 262144 fae3d5c34bf0233139e8df5c8a3ff7422462d650 halomaps:1200 +us_vs_mx_snow_gulch.map 00000000 101886598 262144 010223e1ace0e8aee50ebb6473ea43a192044f07 halonet:us_vs_mx_snow_gulch.zip +ut2k4_beavercreek.map 5B89880D 20370844 262144 60bf23f34f585d08bafa19be42d75aea3a68f54d halomaps:4372 +ut2k4_bloodgulch.map 65F3D690 21966748 262144 61c4c5056c662f2a7f67e58abc3af0a54fe6f2f8 halomaps:4373 +ut2k4_boardingaction.map A8229DD6 21233736 262144 0fe425016e0ff0a0cabf01290fe8d4b646cee630 halomaps:4374 +ut2k4_chillout.map 275C7253 19482968 262144 72a1663a02d9c3570295063586187289c5d56a31 halomaps:4375 +ut2k4_chiron_tl-34.map 7279ABE3 21446796 262144 b0381e619063cea486a132d4f3e896ac94a29207 halomaps:4376 +ut2k4_damnation.map 5D6292B8 21926608 262144 a971e385c513a089b25c6aa5f884fa56db6015d2 halomaps:4377 +ut2k4_dangercanyon.map 57DEBE3B 22831728 262144 1b723b90cb145cc2c81cc20dd710575f0a659548 halomaps:4378 +ut2k4_deathisland.map F200FBA6 25427464 262144 c6c0888a58c3252d39ffb32f013e9e2f63155815 halomaps:4379 +ut2k4_deck.map ECA77362 23161837 262144 e7e0853fd59825063a55c33a1a296f88cf22236a halomaps:4391 +ut2k4_derelict.map 415F2ECE 19917960 262144 cffbd9c4a379f0fae36e9afbd2aa8dff71a533ec halomaps:4380 +ut2k4_gephyrophobia.map 9DE3A791 25238844 262144 b1eb1b9c50a05612e9aab4fced4b6e230b08ad24 halomaps:4381 +ut2k4_hangemhigh.map 26F93FED 20001012 262144 09365c9457d75bc43d4e3417a73a6444f141e7f8 halomaps:4382 +ut2k4_icefields.map 3D096092 24484560 262144 7c7068fdfb3b743ff919e0772e09a67689f37590 halomaps:4383 +ut2k4_infinity.map 8DEF48C8 25606912 262144 5c25be97941ec44be1810bd2d7716bb26354cf05 halomaps:4384 +ut2k4_longest.map 7CA58E6F 19807680 262144 0ab153f678911865e4487eb4e1e0ae5745af39e8 halomaps:4385 +ut2k4_prisoner.map 3A552B16 21199360 262144 41ac8ad1c5ebbdfb841980c5409779162a6bb17e halomaps:4386 +ut2k4_ratrace.map 49CFF829 20794244 262144 fd5884736f2dfe2cc6c2d79f6bdafdd5feabd5ee halomaps:4387 +ut2k4_sidewinder.map 082A4DF3 22870624 262144 0c0751982dc160286ac8d6d8b2363e05c7043da3 halomaps:4388 +ut2k4_timberland.map 682154C9 21964192 262144 7ae75a93f4a701d8492e08320eb2a9041c6fa1cc halomaps:4389 +ut2k4_wizard.map A42ED205 20760840 262144 c1f011dfc2f017fe11ad4a49f922a78dbb7c010c halomaps:4390 +UXSTrapped.map 8D0C995C 80727245 262144 c82de2e411ebd93c73ed777ca95e580a99b5c837 halomaps:4994 +v3.map 7ED55171 324610649 262144 585b4fde48d3ae0aba6e01a07e2bd359a9c7b821 halomaps:6369 +V993_Down.map 2BAFED66 67821372 262144 ffbd7c4c55bff2bbb49d398863c0e3ec5839d61a halomaps:1979 +Valhalla.map 2A8E153C 96410353 262144 54f99dd053dd70653dca1e1a798eccc09c64dfc3 halomaps:4954 +valhalla_remake_v1.map 9364A6E1 65569633 262144 32183345c5f09ee7c4c62e8e03bf649b99b806ea halomaps:6072 +valhalla_varient.map 0BAD8AAB 106062828 262144 9045bf7ffce1a25e0329d71a9daa1100110e40fd halomaps:3448 +VALIS.map BE1873CD 42118467 262144 a7c98876e477a49cbabc15a58c6269e184dc9933 halomaps:1476 +VALIS_swords.map 577790C9 37587606 262144 00f373af379d9cc090470e03e348257ba86ecdae halomaps:2354 +valis_tourney.map 046AAE8D 51716718 262144 d804d2229dfba2294b26f0c9134ba7ee4ac47a07 halomaps:2514 +Valkryie_Beta.map CEDCF292 34072804 262144 6bfce9ce59daac52e4cb776f753878a22ac94ddf halomaps:2784 +Valkryie_Beta2.map 8270EE9B 67183142 262144 b5a0fe152ec23ba3db9dd3cf49db43afb5434309 halomaps:3429 +Valkryie_RC2.map 4C66BCCB 50311836 262144 bcd7f8f4094045066a0348c625421422ca4df733 halomaps:3650 +vall.map 420B305A 357272095 262144 a47c2c9afa0db264e1dabcd301b7bc4ec4caab22 halonet:vall.zip +valle_invasión.map B2D20C11 122493803 262144 aaaa7d27291e41ffed86f97d14689c8eed9e349a halomaps:6746 +Valley Lake.map 3097909F 52629279 262144 e22d9a27052dc71c618b60faaa6ac109a47a459a halomaps:3995 +Valley_alpha.map 24FD6818 19771960 262144 9c7b95f14604f0cadc58300536e37b2301c3416d halomaps:1741 +valley_alpha_race.map D0215D30 37038834 262144 fe5db3c28028f132ce1be0edce5b5814511a85d5 halonet:valley_alpha_race.zip +valleyofdeath.map 3BDE8106 25021700 262144 2e09aeb5819ddcfda3457c707deb3af1430822f5 halomaps:2185 +valleyofruin.map 9EB6FF00 13534692 262144 0651b2fa5fc44bed28f6ecb50e85949987283180 halomaps:4064 +valleyofwar.map B3FA058B 32360690 262144 6e5fb9b1e54eb481283812f734aec37c508a872f halomaps:4079 +varjatopetlart.map FCD28D8B 15093772 262144 e9a98cb4bed00aa59a10756829248fc42f852e33 halomaps:3326 +vastland.map BC073179 17160440 262144 ba492cc6f8e3215accd1085b87b8f8d6927c0da9 halomaps:5383 +vector.map A891DC64 14743900 262144 d00c26c683092bc59b04c8aca432557dce914f18 halomaps:2617 +vehemoth_valley_beta.map E654B357 36656068 262144 ee7858aee00ecf3b3c403eb566f9cad6236cbee0 halomaps:5339 +vendetta.map 3243328A 15809468 262144 6e8f80e753515178d708da1476b36bc9a665d65a halomaps:596 +vengeance_test.map 9C4D24B7 14418800 262144 fffdbf897a762cf1ac6aecdfe2d5995a6c02ce9c halomaps:1027 +verdant.map 62FBA743 17898784 262144 6d3e1bcf9fd0f1ec6ff5f646505aef3ca7a575cc halomaps:3721 +verlassen_final.map D211A757 27254502 262144 5d7e03fd58cb2a45e11f2262a351e7231e0464c2 halomaps:2999 +vertigo.map A95BB2FC 16664212 262144 730884eb6a2e1dccc034bca46160a1eb165c4ddc halomaps:386 +vertigo_city_original-beta2.map A9650A08 38969732 262144 b9dc0bf3370b03dd05298ad079bb7c15c71d9979 halomaps:1859 +vertigo_city_original-bv4p5.map 5FB50064 58020106 262144 25fd1de6df2cb268fb3c59f4cbfd53a744a20760 halomaps:2054 +vertigo_city_race.map 6973783E 44429362 262144 c2c85d45d784496015edb0a55d4978aec381ab5b halonet:vertigo_city_race.zip +vertimad.map 589D5FAF 80400014 262144 8eb8dd8eae5bc63a80aa6ce8bcc83a52bc9e205a halomaps:2451 +vestige.map 3245A4A1 40185568 262144 767fa36b38ce24b3d65092231fc84981e3940e59 halomaps:3590 +VHMT_a50.map C25D04C2 28741678 262144 775047b2befa0816bfbb2bfa1895b4cf084f30cc halomaps:4591 +vhmt_invasion_h3.map 8E7A6245 113797369 262144 a53d1193b77a12f223c2d7f31a555508b863618e halomaps:4674 +victima_x.map 980E0218 39822435 262144 666646207dcfc813383bf34091052624a50959ee halomaps:6293 +victory_island.map F8D8EF2F 15194044 262144 ed19616d76035bd9b64e9373a875ca00e4ba2aba halomaps:297 +vietnam.map EEDD95D6 20458588 262144 dfb210f4b92fad35c37a151b571b88c6c4da5239 halomaps:854 +virus_island.map CAC0AE1E 36973118 262144 b33f0b09a37720107b5c33be2aedb4743e651365 halomaps:2668 +vista.map 05742A07 18646844 262144 0fc75fa45cd1179aae20b2583aefff24f49b8f4d halomaps:2553 +Viva_Mexico.map 5B2F2416 263002083 262144 3e29d4659783e6ad56a32db2910ff7b8d7dcff1a halonet:Viva_Mexico.zip +vizio.map 316D2EB3 37310192 262144 187f151105f637f70f4a4b5bcab94f27eb8d8bb9 halomaps:4630 +volcan.map C1091529 18448792 262144 11cb7693ff50e6f3e6396db88c9f4a2cd2263052 halomaps:2930 +volcano.map 1739B205 18638716 262144 77e969cb85b097984e492bba82c12c5ef56dc597 halomaps:336 +volcano_enhanced.map FA6E9ED3 23251848 262144 d4bbcb2e3037f77288881c50794c02948d226d00 halomaps:2643 +Volcanus.map B15752D4 377361434 262144 a93114bdf731551d4b38dc38e9b0c021f4375f50 halonet:Volcanus.zip +volcanus_beta.map D02855ED 18973693 262144 469be54f9ba1e391deb8b87fd24a29c47572f5b4 halomaps:3622 +VON_STEGEN.map B808F0E7 389986881 262144 eced26e349c5f0bc0ff389ed04bd9f4e86859f3c halonet:VON_STEGEN.zip +vxa30_mp.map AB88D533 30445508 262144 92c4a204088ed71bc3b8bc3e350343bcfedc9bdf halomaps:5903 +w40k_sidewinder.map A5FF1D62 25992534 262144 fdbb6ee91fd97799a3ea09d09cffa4f705a62da5 halomaps:2539 +w40k_test.map 960FA448 23959249 262144 214b31f0c702f4e99e266f10bcb119e3f778bad2 halomaps:2540 +w40k_test_v2.map 9C492151 25490140 262144 2600574c5e5082e5d2f95779b48be06e09b233b6 halomaps:2541 +w4rtorn_cove.map CE4A952E 34447798 262144 54d8892b8b4a926a174298629c235bb6b723b0e3 halomaps:857 +w5.map C6ADCB9F 102820522 262144 8aa4b5f546cefde9feec853541303b21856ff961 halonet:w5.zip +w5rtorn_cove.map CE4A952E 34447798 262144 51b6f8dbed585bac0a6cbc492a4c2a112ebfacfc halomaps:946 +w@r.map 1087020B 20950233 262144 bb15c85c12d945f720c878ca8660d12973e94d30 halomaps:6404 +wacky-gulch.map BC485D35 26039414 262144 6851169bc3ebe16a8e7de92ab68c8d022005d50f halomaps:2869 +walls_beta.map 4E3442CF 17915372 262144 6a88e34ff081282367227f5c9ea2d61afd2d095d halomaps:2050 +war.map 3699E710 82165012 262144 6533d258c76c6bc5620c9068a63942f828d73a09 halomaps:3884 +war2.map ED3ED841 19550070 262144 803bb759124ea1a5afe70e28e92711da47502a3d halomaps:5797 +war_ahead.map 1073851E 47062719 262144 b80b35545aae76748e5d2da02a0b394e00325f77 halomaps:4238 +War_Canyon_v1.0.map FC1E0E7A 20647456 262144 f457f4a2fd34a1a94dfacd7fb22c592732e2cb53 halomaps:3801 +war_field.map 1BE45C54 37145858 262144 2b10d358bbc4548b8f3f3a31046f4ed07cacdb33 halomaps:5333 +war_of_ice.map 30978CFB 86828512 262144 7a423039dbcbd37b5be6edffee2f30b656e648b9 halomaps:2931 +war_of_sidewinder.map 017BB81D 28091695 262144 d2b43df1b68454b77d1a8eb8c92a15b995f8c814 halomaps:3266 +war_of_sidewinder_v2.map 47693743 30397984 262144 cf1d6d9b467f971ff38a2d1b472f56bc8d07f103 halomaps:3363 +war_of_sidewinder_v2_beta.map 11A909EE 31705252 262144 454b7f0c46bb14192180bfb2862149afb96c738f halomaps:3371 +war_of_variety.map EDA27F3F 31514012 262144 3a1d734318ab27fa0bc29b45bbcebfa20b8a4f5e halomaps:4447 +warbeta.map 42936D9C 27968722 262144 83083df7c43fc3c77047a1100c5935c79ebb1b28 halomaps:4237 +Warehouse_Toys.map 542B5595 16148257 262144 7c4cbf960628f0fbba5ffcbb3d1d01571b27f059 halonet:Warehouse_Toys.zip +warfield.map C090493D 56805612 262144 595b6180c6d27c51bdcaa9c728dce596d69fa853 halomaps:3541 +warfront_day.map 870FEDC9 73239883 262144 438ce8e04c00b4406832b17d6f16d38fe2abc2e7 halomaps:2976 +warfront_night.map B97E81EE 73065703 262144 cb67ddfb8ac400c97e0eed660b226ae9c36adcc4 halomaps:2977 +wargrounds_v4.map BB7A4E3B 98330213 262144 0d019e2989c92c983025d526ab662b5f60aafbbb halomaps:5759 +wargulch.map D5885D81 33051515 262144 4bdfc89cf87925340b45dacb8a0826a412ec5f2d halomaps:1498 +warisland.map 49E11CB1 36426595 262144 98ccc92365aa674a9ab44926fbe0bded64e7484a halomaps:7039 +warlocks.map 8587FBBF 15747615 262144 218c051c6cffb05d2c2534a6de271729f24ba9ad halomaps:3769 +warofbeavercreek.map 8EA5B1D6 125501604 262144 dc0814c27c234a37457289cfae842bb076b48bd6 halomaps:6585 +warofhog.map A917EFFE 23180585 262144 cb5dcd41a2294d4b899e799cddf49d755a0cbd2e halomaps:1245 +warofhog2.map 34A2BB82 26091539 262144 6f9c43089139ac32880a7a80adc340274cd49731 halomaps:1273 +warofthehelots.map 614F2BCD 27269092 262144 8c2b0646f3065edd2738f4e63e38d570a207fa0a halomaps:378 +warren.map 890A3B93 48896429 262144 cd179dd80c472d6826faff09c45ea1faae7d1229 halonet:warren.zip +warren_beta.map F8F7827A 25309372 262144 f209f51be81e5fc835e48dbb9bd606b60cd81acf halonet:warren_beta.zip +warriors-fight.map 06C34FDA 53444984 262144 275964ba40e8f434aeb60c9bcc886c4e1b08c94c halomaps:6939 +warstation.map E3B088E1 15153496 262144 332c8eda504c99d9377f4e109ae4c60cb8379ee5 halomaps:1911 +Warthog-Wars-final.map C23A9EFF 31377557 262144 7e9272d2840d82bab789a5ff5d4960a124bd93e3 halomaps:2669 +Warthog-Wars.map 6C99B963 23880052 262144 5261271265ce3538a6a7f5170f9d08642a57f828 halomaps:2662 +warthog_gulch.map B8CCB737 22173738 262144 4d8933671fa8d101e8ca07a9bc4c9ece7f164e03 halomaps:5384 +warthog_race.map 62C32132 27713848 262144 6e5508fa37a1d7101aab890ee30b246f6037a368 halomaps:4446 +Warthog_Run.map 008EE065 60573863 262144 ee0b6435f7ba8bfe72d9008938b96298e472a23a halomaps:1931 +Warthog_Run_final.map 5D0234C9 66255707 262144 e25078a1d2eb8f6c8113e192562977ebbd8da374 halomaps:2010 +warthog_wars.map BAF86491 39581428 262144 cc2246b8abaab22fa66c1462c54342d0f302ecd6 halomaps:5798 +warthog_wars_rpmt.map 1A82E776 39581432 262144 4ab74fb2d250c7e6e74881b22c217bf8798e419a halomaps:5799 +warthogexplore.map A2DBBE65 14130592 262144 21c758d6ada1a3373557ee617cef6329f8702de1 halomaps:287 +warthogrally_beta.map AF5B0E47 21189188 262144 e0c5c78d63a41c6b471ef7f84b2bcdbead8b278f halomaps:288 +warthogrumble.map A7B17FAA 13493396 262144 59e0ef16f0f13a3a772fb1afe47b8a5ab6833556 halomaps:4955 +Warthong-fantasy.map F920BBC6 173228438 262144 b0b4234f660f995f2c3ac6816c0508aa050db1a0 halonet:Warthong-fantasy.zip +WartornCov3.map 467A9761 19874000 262144 bcde05d8968e81de921e982350d884c1421cf632 halomaps:414 +WartornCove-SVC_Edition.map 5F1011CB 29272388 262144 32633567cb6d0d31c8888c38253eacd603ff3250 halomaps:1588 +WartornCove.map 467A9761 19874000 262144 db1536c56e449dc962a87360b9dfcdf426a4e3ff halomaps:289 +wartorncove2.map DE9266DA 19873640 262144 3f36bea53c97f354ec9c1df80f264bd40690438d halomaps:351 +warzone.map B4906C46 35207213 262144 4ee4b25940db5371407b34c1941354a2db3c4789 halomaps:5105 +warzone_v2.map C4C1E863 38207649 262144 5a7dc87720c9d0da5ec7a9ba9e3b6ab241c12324 halomaps:5106 +warzone_v3.map 4475A03D 44849073 262144 7560c0299ab6fa3d6905cd2e6439b0c205e42bb0 halomaps:5115 +warzone_v4.map FC95DE93 60601629 262144 9b095d22194451cd5c2aa2486ff15944f1e0c56b halomaps:5134 +warzone_v5_FINAL.map DCE3669A 59756709 262144 7032e3a1b206c83c7f8a1ee4a2c210c7bcc47549 halomaps:5136 +warzonegulch.map EC912F75 80795100 262144 5fe4339c3da5bb4511916619ec14e17bf9ac7de4 halomaps:5283 +waspmania.map E79767E0 16514996 262144 6512fc01e058d1fd7a0b697d880f94dbde8ed2dd halomaps:5193 +waste.map 3A8CC0FD 16132124 262144 85f183745c34b3577143cd778fbbc8eefaf36c44 halomaps:400 +wastegulch.map 4A8C6EDD 15035692 262144 b460eb19a41d616549c22e97c95880437cf5f25f halomaps:3651 +Wasteland.map 16E9C794 34819388 262144 14398630be64920835c619d6ec7c728058ee5d11 halonet:Wasteland.zip +wastelands.map AEFF784B 32937516 262144 53b62dc21595999e95e63af1c9ed0ebf68ca09bb halomaps:1143 +watch.map A7957531 16277096 262144 dac4a87d3e5fb39edc0ccb94c07af3b698aad5fa halomaps:428 +water way.map BED58F3C 130714612 262144 4c7bcf97eeedace8d547d23cd1884eda326b3de7 halomaps:6544 +water_gulch.map 04997F7E 20382413 262144 fa9dc3465662c7cb541586426bef27b936456344 halomaps:2246 +water_in-a_well.map B28D7B46 32715786 262144 d1d60fd8c00183057d1af6cf34c3b258ee6612e0 halomaps:4480 +waterfall.map 5174A628 18584488 262144 1119569cae2b4c5b0b5562d01debc6c6ad5e6aab halomaps:2379 +waterloo_waterpark.map 85204BA9 23931744 262144 36d79366c59cd3c6fe771e9692ad3a1169bfee40 halomaps:2892 +WaterWayBETA.map BB8A52B4 20860981 262144 ef1cba7f6aca500b10bc39cd2cbbc703327d322d halomaps:5385 +Waterworks.map 694FAC08 68304825 262144 a3a0196df74b418f0cbf9800151a91e2cb3db6b5 halomaps:6682 +waterworksbeta1.map 556333FA 65607458 262144 b4c095ba011fa27078ca16c53bf31c7c7025f09a halomaps:2053 +Watery-Grave.map 19535184 15951044 262144 d400fff181c8791a37b6f3ac06da5485719827e1 halomaps:3802 +Watery_Grave_pb1.map 0D9F0D55 294149868 262144 c549b7e28c031b20a6ee7a865f6325c50cba002b halonet:Watery_Grave_pb1.zip +Weaklings_vs_Weaklings.map 2D0AC17D 67557247 262144 bee28da06d8be89dd33557a8b751f7468bd13dec halomaps:4182 +weapon.map 287EA874 13982964 262144 a7cc353dd7e47364a25bd6803c8e8972f16c07e3 halonet:weapon.zip +Weapons_forestV1.map A6EA0680 44557257 262144 7d97ba208ae94653c24c6349538bcee16ec6472c halomaps:2618 +weapons_room.map 3D1BB946 295948033 262144 659d6766b5788e84a731dece013d79fe2ea5848e halonet:weapons_room.zip +weapons_training.map 27552BEF 72633432 262144 c60ab48b8bc5174482739fd78ea6c13b0e6452ca halomaps:4348 +weaponwarsv6MEAIv3.map 161EE9FE 41002981 262144 7446ade413365c85176e42097c17215be03279a8 halomaps:4145 +Weckenmannland.map E4F345A4 54132549 262144 f6e69f16a3b98a69132ccd73d85c171425d74dbe halomaps:4631 +wehrlite.map 2509F069 53794616 262144 0e05a7df0af76dfc935e2bf8155fd5fbe611031e halomaps:6908 +weld.map A68BFD5B 23816021 262144 4c765c3ceb54263e60b4fcc441dfd485730faa03 halomaps:4696 +Wet Dunes.map 4CB8320A 52638421 262144 9001972d9615edefb42fc30d8c7e803b4b194b26 halomaps:4256 +wet_forest.map 01ABDB17 22903584 262144 02e116e07c9628d3cc444671e45536c6f4a349bc halomaps:5386 +when_spartans_attack.map 7807A008 71793498 262144 7936c13c032112caf827511f64f861a3e92f45ff halomaps:2785 +whenhootersfly2.map 10BC3D21 22848604 262144 5a896d36d6ead2e5e0fd96e8c7694ca1ef0e3da1 halomaps:510 +Which_Way.map BAB35D0C 100167791 262144 37823bdcb733c1fd75c414a512a17c1ff4c9fcaf halonet:Which_Way.zip +Which_Way_2.map 6EA6FCBA 44535717 262144 4a0da5bbcb475a29e53caaf4e37716dc50667b46 halonet:Which_Way_2.zip +Whiteout.map 7D87FCF7 175651448 262144 02ccf19670cbd2af7d4afc0eeb1016f24dd5d6ed halomaps:6103 +whiz_bang.map 00000000 89051917 262144 514dcf101daeb3eb09d662bce827c84d29f3631d halonet:whiz_bang.zip +Whomp Castle.map DB77045B 360410781 262144 525e74121faf6f80bd2bd2c459ee209ce9ba2b8f halonet:Whomp Castle.zip +whomps_fortress.map A4F7549A 207843369 262144 408b3841d8efb192e8b2650c5351c5c14bbc5d41 halonet:whomps_fortress.zip +wicked-sidewinder.map 127AC51D 192228418 262144 3f4f6a2209eda487aab7473e8f57b8dc6f681a4a halonet:wicked-sidewinder.zip +wild_race.map 7397A031 24556809 262144 11293a3f53db8521be4551e63151d8fb2cede09b halonet:wild_race.zip +Wild_west.map 65DA501D 37233515 262144 be6a8dee72da8bea93d89497f1424c703ba166ca halomaps:3883 +Wild_west_V2.map 763EE14A 51686067 262144 fd120bc614c9a52f7e3a416620f2f9353656fc66 halomaps:3885 +will-to-hope.map 4B492CFC 68725835 262144 f49619a8dc0a6bd8f4ccb5570db5e4e4badd8524 halomaps:4101 +winder_pass.map 2B1F1ED7 37777811 262144 b3b0d911c415ee12ed02a056ce9765986e589f87 halomaps:6204 +windfall_island.map DB31507F 27758240 262144 bb4a0a182ca624be4c4ebfb9c7e821306f5cebed halomaps:6254 +windfall_island_v.2.20130707.map E98917B2 39886140 262144 24d1bd1c02f56ac81e607b97eaba9cacff4fca78 halonet:windfall_island_v.2.20130707.zip +windfall_island_v.2.map EB89BB7B 59042701 262144 683f6a44f8ffab68bfa3b210c75a202d63c9c69b halonet:windfall_island_v.2.zip +windisland-mod.map D917BB55 18853472 262144 0f34c04d2fcb3eacc13198761a4049a259a007d8 halomaps:2932 +Windisland.map EDA1F615 18974404 262144 653905d103c0f59aa1d02c3df9872c0fcc48be69 halomaps:332 +Windwaker_False.map B5A86B94 244558122 262144 dcc9b712b38a57bfcf161fbe2fa9d2394455fa91 halonet:Windwaker_False.zip +Windwaker_True.map CCCA0BCE 53059105 262144 ea8c1da883765ada5650b0fcdd36f21ea93cf3e6 halonet:Windwaker_True.zip +wing.map 88BC048D 30344324 262144 4cc31282d89f2d1d1b8fa6a632fd35d9f4581b53 halomaps:1799 +wingzero.map ED2862A3 105942049 262144 b93ccf1fe266dc45b8fb172088c4d318158a6680 halomaps:1453 +winter-area55.map 8D474500 78672565 262144 1a62af58a4358e8f47db7bdb2f041d5b71166c0a halomaps:4208 +Winter_Ablation.map 2DAFF058 401210055 524288 05013057d4fe5e2526c7058fbc97d270f3c4d4b3 halonet:Winter_Ablation.zip +winter_hills.map 34E0CB0E 41232892 262144 f76dd2df19cf9e9fe332271cf72d3eff48d48089 halomaps:4726 +Winter_Kills.map 2FFA9C20 267656889 262144 09dcb49b1624adc0946c5bf032ec397494c0aa80 halonet:Winter_Kills.zip +winter_snow.map 5C001C87 25777690 262144 5b3a1bb5c27c555d250af21a8fdd6b08074d83ba halomaps:3814 +wintercanyon.map C5F62B31 30983042 262144 083dc9837646ca880d5e5a0e0353b82fd433719a halomaps:4040 +winterfrost.map A237A6D9 109895732 262144 316d5b10efab1b36947089ac8aeef29f3d005d9d halomaps:4519 +wintersmith.map 4AC4198B 73975488 262144 c2553ae51beebc549f242e23b6be9a64f664e15a halomaps:7013 +wintersmith3.map 3C3D4B59 75884773 262144 01789e93214b1609b97470246ad6a1bc8fb388e6 halomaps:7013 +wintersmith4.map D126F284 102959894 262144 507272b27c43591158c1c36fd997290c2c48b2b3 halomaps:7013 +wintersmith5.map B908C519 75985878 262144 e08bd23923131a7e9984bd2c24275b3dee94043f halomaps:7013 +wintersmith6.map B6E0DF65 76117561 262144 fa1c57160eb5eb9b85dde20d8caa6a91195b4a12 halomaps:7013 +wintersmith7.map FAB83EB4 73153338 262144 c7a3bef2a3e3938c59d0492f9e5d5ff6f225a0e0 halomaps:7013 +WipeOut.map CE536C90 37155325 262144 77596c9fbd5cf7f712f3800669eb9798f8058bcd halomaps:3635 +wishbone_beta.map 3CC8FC86 18076535 262144 ef201d2849cb18b6fbf2cc638a015f9921451788 halomaps:977 +witch.map EA3BE632 65631250 262144 1da6fdab5c415e1444457583dac52eecd82b7fe2 halomaps:2418 +witch_tourney.map 529DB9FF 28253040 262144 c428097e36364ccdf951977533b6e93638ff634b halomaps:2515 +With_Whiteness.map E36D2C76 796558564 1048576 f635e2677fe87b98c5c277e40a902acd48649052 halomaps:6683 +wizard.map CF3359B1 12731464 262144 a3c8d73e2d78d49cdc0243a0a882805a44be1be5 halomaps:4790 +wizard_rm.map CF3359B1 284609488 262144 0e3f2f87a383f7a1b73f774aea27c6c676596b5a halonet:wizard_rm.zip +wizard_swords.map 507C4412 16611482 262144 48399ada70b6368c944fcbffd949b2f9a27acda5 halomaps:2334 +wizard_tmcc.map AB9495C7 36044848 262144 d2ca2377819579bae41c5f8c8952664fb4ecb60a halonet:wizard_tmcc.zip +wizardswords.map ADC4E0AA 14392930 262144 a40cfb9b8f75c3c361fcdbbc2222a46aeb852164 halomaps:3519 +wizz_pb_0150209.map 50D78B40 23536984 262144 f6510eb2bf9a8f1a48e1c8e3d097d66a48192ec1 halonet:wizz_pb_0150209.zip +wizz_test.map 34F31860 20371008 262144 d2f0791fa4ac26194c95d6587705cedfa59cad5d halomaps:4334 +wm_combo.map FA8F6FF5 105817824 262144 47d7a159f589d7a04b9b52751b4f093e3a4f82c0 halomaps:3636 +wmp_dismal.map 5CA012CD 47711886 262144 abf8ec6bd54a5c08dc2f00c3bc1a9248b36c657e halomaps:3423 +wolves-ambush.map 53647CEC 199497183 262144 89076e8fd6ae707ba950ed61804b2567aa48f4e2 halonet:wolves-ambush.zip +wolves_ambush.map 399264DD 182198613 262144 75953cb17d47378888e64854b4a0ea5635b8ef9b halonet:wolves_ambush.zip +wonderland.map D5424691 15621320 262144 028fef3bbd2fb2c706c9a96923a527850cfad74b halomaps:3116 +woodland_arena.map 2531B2BD 25300621 262144 208db8680d583dee64e83d035e4d78f3fc376530 halomaps:4697 +world_1-1.map 6511DB17 13399532 262144 1fd559e1fb3b192d9c1961a4aeb1ccb10c42bc53 halomaps:6316 +worldtanks.map 7EABB823 39028760 262144 108fd36acf38d32cd2ea390322bf21c3b50c437d halonet:worldtanks.zip +worm-born.map 38096F64 29805665 262144 a6b36593cef94224e605cbae6a5b11a8bba650dd halomaps:4481 +worm.map B355CB3E 29963321 262144 4b04471ad3527bb53fd4950e9858362e1638b910 halomaps:2507 +wowee.map D8F43419 69454877 262144 4518eee5dd500ca89ac27532787958d2e74b9c89 halomaps:4041 +wowee_v2.map 2810734B 81364631 262144 b45699f75125234acd4fca846eaf8501b456af52 halomaps:4632 +wpitest1.map F5E19F1D 25693916 262144 7ac1ce91e6eaf80ec030a269e1af29527cf45c61 halomaps:1833 +wpitest1_race.map 3F3588A4 25689216 262144 b7cffb406bc715619a8d9fd503f5578c53e91335 halomaps:2562 +wrath.map 83F0B8BA 34865227 262144 24dac98f66df217bbb9da9c3dc235ac308726e73 halomaps:2310 +wraths-dojo.map 01EBCE1C 26842990 262144 3c1a558a1db17bbf25cff9a96cdf8490a5d215e6 halomaps:5949 +wreck_island.map E8B3E028 91821795 262144 5695cef65b24e821d2b295f3997e1829976e9c90 halomaps:6284 +wtc.map 63EEEE9C 13265424 262144 9dbf22e20332efe11e635885d23fab410398dbb4 halomaps:2098 +wtcmod.map 8570BA4B 17873304 262144 9b1175125b52c0885b42be23b232bd9c3f82a3ea halomaps:2157 +wtcmod2.map FE4A988F 23648188 262144 13f6312505ce8e0c21e4e2fdbf27424be76ecd9f halomaps:2175 +wtcmod3.map AA1CCEBC 47528801 262144 5ff6a19090f7bd31045cc57e4f95c8681943b5ca halomaps:2663 +wtcmod4.map F556C6ED 31414248 262144 f82cfb0a20995edd8a4847629041043c1533fe68 halomaps:2740 +WTF.map DBE4B3DD 228269093 262144 cc6f7175369b5e75ccf2a6c818cc751850148241 halonet:WTF.zip +wtf_AI.map 24D42B40 27203562 262144 1a5d3ae8b0918ae2293e0d8695d2f6df2c243192 halomaps:1851 +wtf_NO_AI.map 2520A890 27200022 262144 829ad06d6240f0ba2212391bdd0a98a6f4fa7d2e halomaps:333 +Wuhan-China.map 2E38945D 133793692 262144 dbe8cb568d8edd9727352288337863698e0cadf2 halonet:Wuhan-China.zip +WuPh.map C6E5DEE9 39476118 262144 c09427e384b63b1402b4f305f1119621899b122a halomaps:2870 +ww1_beta.map CC550FF8 17825264 262144 1978fb233bf188a507e63605e7f0235a5f665321 halomaps:467 +WW_battlefield.map 84599EBB 33082413 262144 88b251a10e5f36d450780b1a15a3313c97993034 halomaps:3212 +X-66D.map FFD78248 18722085 262144 671d1721ce4feffbfca4a3cee1ff80bcd86e0828 halomaps:3637 +X-68.map 70531DC1 62576522 262144 b1e244b602e4b07b9f10624944ba830ee23cd65b halomaps:3107 +x-ball_public_beta.map BE7FEA0E 15723340 262144 0aefc4b399e8d4e437d027bdda6ed9c911266122 halomaps:1501 +x-chromo_alpha.map 982276DE 36487651 262144 5b3b6d1653fe51ce1bed40b343245b6ebe419776 halomaps:2123 +x-tinction-v3.map 3DB397DA 167843513 262144 5f1df9ab9ccf8e58c7ba3cbaa52a4c752cc685e9 halonet:x-tinction-v3.zip +X.map 18B22906 33232109 262144 573b5e92e7bfaed74c4d9194ac0e93f1f9fe32e7 halomaps:962 +X13.map BD4A3897 71481751 262144 50ef7dfca27c6ba4353af96c8e163ce7d650de16 halomaps:5434 +x2_mudslide.map 4B286687 23465784 262144 b935627c4cb449dfb345625a8f8a70ebafaf16e4 halomaps:528 +xaniel.map 635DC0FC 18338388 262144 b02019614e68d4d4219c67f0b14d64f215fe40e0 halomaps:1442 +xbox_atlas.map 88F01B10 15987196 262144 d5d5a74aad0119da9c2e5aecb0d37d9d981850cd halonet:xbox_atlas.zip +xbox_beavercreek.map B0CEC2F6 13218560 262144 749426ef78e430226920d1422f9b2fb5fa1ccc1f halonet:xbox_beavercreek.zip +xbox_beavercreek_rc_final.map 5494D853 14723912 262144 100e95c2b20eb2fcb560fa7056ae30634b3170ab halonet:xbox_beavercreek_rc_final.zip +xbox_bloodgulch.map C1406345 14170896 262144 2473dbedbae56f6dfaf285fe69278f4c68ed259a halonet:xbox_bloodgulch.zip +xbox_boardingaction.map 4EF25396 14893632 262144 e01fdae6fb80138a1da7e79c1ee67f0b4fdc5774 halonet:xbox_boardingaction.zip +xbox_calamity.map AEE80F1F 14851516 262144 4fe338d10617bb534a6fb2f55e1abcc7093b39ae halonet:xbox_calamity.zip +xbox_carousel.map 96D43C86 12996668 262144 cc304d79bccf52d1e6bc403bbcf2006c85e56e0b halonet:xbox_carousel.zip +xbox_carousel_rc_final.map C2A900A9 14502168 262144 4a2a1ae5ed411ea229a9a17c99d14ec42cfe0eff halonet:xbox_carousel_rc_final.zip +xbox_chillout.map DF8E52B0 12966096 262144 d3d26eb54d559423d9adcd551cfd01a9a3cd55fb halonet:xbox_chillout.zip +xbox_chillout_rc_final.map 37A666D4 14496900 262144 a1ce5e4b612041c91921f08085ba4dbd4f917b43 halonet:xbox_chillout_rc_final.zip +xbox_damnation.map A235C2DB 14322116 262144 b3ed9cfb44373ee2f2ff7feacc403b3b37b97948 halonet:xbox_damnation.zip +xbox_damnation_rc_final.map 63C549B2 15845368 262144 4a0b898e693eb5e74156ea935e664f6ef02fbce9 halonet:xbox_damnation_rc_final.zip +xbox_decidia.map B59FBA59 12991868 262144 46f2e51fc318272e939e5506d068ba16f359d669 halonet:xbox_decidia.zip +xbox_decidia_h1.5_rc_final.map 50DDFEA3 17353368 262144 119348e3236332996fb69b7d3b4656b4c56b501e halonet:xbox_decidia_h1.5_rc_final.zip +xbox_doubletake.map 80FAD067 13873308 262144 648a3e938257b8eefc1c7424e2b1059ceec68d9a halonet:xbox_doubletake.zip +xbox_doubletake_h1.5_rc_final.map B682AB13 15389660 262144 9e5805c1cdced82b210566d33827adf7428b2f3d halonet:xbox_doubletake_h1.5_rc_final.zip +xbox_downrush.map CD36AAD4 14259284 262144 60db6bfaac776e4a9cd5aaaebc8e80b11baa706d halonet:xbox_downrush.zip +xbox_downrush_h1.5_rc_final.map 3847D3E6 14391244 262144 a8676e3181f2f21857375d7d7c6ae78fb39e4825 halonet:xbox_downrush_h1.5_rc_final.zip +xbox_exhibit.map 1C6C0ACC 14890428 262144 dc11cb3b95fc63516ae30121883326a2f79c9cd7 halonet:xbox_exhibit.zip +xbox_exhibit_h1.5_rc_final.map 0E4EB085 15382841 262144 8834476071aa7bdc99d3499148e32de42f830d49 halonet:xbox_exhibit_h1.5_rc_final.zip +xbox_hangemhigh.map 45B34D8E 13390020 262144 6009bcf08d7f474c0a68fab371d2ace2df141527 halonet:xbox_hangemhigh.zip +xbox_hangemhigh_rc_final.map 58189459 14933772 262144 66f6938182b6c15a8f78fbb57063a96762eb939d halonet:xbox_hangemhigh_rc_final.zip +xbox_hotbox.map A3512AF1 17472052 262144 4f0efa9b19f65421a79da5e116f9a420b64a136c halonet:xbox_hotbox.zip +xbox_hotbox_h1.5_rc_final.map 84C708A8 15844220 262144 db95961e9cc5604fdb39f00a30e917115820f03a halonet:xbox_hotbox_h1.5_rc_final.zip +xbox_imminent.map 0656239A 14422900 262144 6367f76e16126ad08e4f7718a36a3147f5d53a2d halonet:xbox_imminent.zip +xbox_imminent_h1.5_rc_final.map 190F36FD 15210364 262144 a199c5a72aa8e2eea35050bbc5455e0a47f6e974 halonet:xbox_imminent_h1.5_rc_final.zip +xbox_levee_h1.5_rc_final.map 132AA691 17751272 262144 1143c51799dcc735e19539807d56a8eb907fce2f halonet:xbox_levee_h1.5_rc_final.zip +xbox_longest.map E4F16FD1 12664340 262144 d4d3bc8e1fc45d7024c142c8781151cd24845e6d halonet:xbox_longest.zip +xbox_longest_rc_final.map F8B54E80 14078928 262144 23f99ad57eb4cb8c4ec7081144741f9145887d65 halonet:xbox_longest_rc_final.zip +xbox_madhouse.map 8D570E24 13641244 262144 bc3a0c886f8328f94131e4109b6dbf0f90135f0e halonet:xbox_madhouse.zip +xbox_outbound.map 009883C8 15246084 262144 9f50a3c1cc10170e056693f298763a3c3d68db27 halonet:xbox_outbound.zip +xbox_overflow.map 00CEF761 16757676 262144 2680edfebc07813df9078fd655c61549cce86d33 halonet:xbox_overflow.zip +xbox_overflow_fix.map E3501E41 16745616 262144 af017383c3f19a2e17773d3a88879aeba95b47cc halonet:xbox_overflow_fix.zip +xbox_prisoner.map E9033FBB 13432072 262144 96d5bd60d59e978f16cd96d510c63f86d946c0f9 halonet:xbox_prisoner.zip +xbox_prisoner_rc_final.map FEA2F53C 14715476 262144 b1471d7b9a9a3cd339d36d6dbc73033033f1129a halonet:xbox_prisoner_rc_final.zip +xbox_putput.map E2DE4FCC 14434328 262144 f3e507c3fca1bbacaf1121d0d359c08916dc466e halonet:xbox_putput.zip +xbox_ratrace.map CF575AFE 12998928 262144 d2d36c5398fd50d3253ac8500ae2dae5e6dee30d halonet:xbox_ratrace.zip +xbox_ratrace_rc_final.map 2DDB6798 14557992 262144 e844172d2efc0a30b6ef7f9890f70c104e74fb3c halonet:xbox_ratrace_rc_final.zip +xbox_redshift.map BD26105F 19541488 262144 9ad02950b077131abe0b8d1e5ac72c557784afc6 halonet:xbox_redshift.zip +xbox_sidewinder.map B20B0884 15443864 262144 0852f141030e24130ec5ef135046cd12ed4cfe3c halonet:xbox_sidewinder.zip +xbox_tinker.map 92595BC8 12537496 262144 6aea9e5601b86461b33b03a4933c5bf095d8ab86 halonet:xbox_tinker.zip +xbox_wizard.map 8E276DEC 12865924 262144 357c80623982dc46267abc5df1849a387e0efb11 halonet:xbox_wizard.zip +xbox_wizard_rc_final.map F0ABB555 14384316 262144 668a57e9175f7ef62ee199e70015bf630ec54ec7 halonet:xbox_wizard_rc_final.zip +xbox_zerohour.map 38173ED4 19448136 262144 33464b9eede0dc741dd1f709dda492de516c7fa0 halonet:xbox_zerohour.zip +xbox_zerohour_h1.5_rc_final.map 4E158366 20769524 262144 03fb9a60d6e3cf69dfce43dde40d86234767a512 halonet:xbox_zerohour_h1.5_rc_final.zip +xf01.map 2126ECA1 20806340 262144 e4e288e5097446442e186830f757e322e6ffa0c1 halomaps:2355 +xf_box.map 798B0ED9 12066576 262144 a3070d70d815e22ac1ff037dfa10eb6e4f7672d2 halomaps:2129 +xf_box_v2.map 827E5BD5 12084580 262144 500d6eab5c85ee063bda82692a553224bbe7abba halomaps:2145 +XH Sentinals.map D9C4A443 15456640 262144 91afda414124dbdf1583cf9243a7f38b3e2220ce halomaps:4239 +Xmas_Bigass.map D8D60174 215383535 262144 af1e33569008ce7a428125c107b889e509f0a1e3 halonet:Xmas_Bigass.zip +Xmas_Halo_Remix.map 1FA5F8CF 83360319 262144 7ac019875b8434f5a5ac7900fac6b719a05f8066 halonet:Xmas_Halo_Remix.zip +XMT-creek.map 0C5405F8 33803161 262144 4133c8cbbcbf17dbe718210bd7843cb679ea0504 halomaps:3449 +xmt_frigid-Beta.map 6D358BAB 23071532 262144 e87569eca51c71132f5cbcc0434e3b94a60fabf0 halomaps:3422 +xmt_landslide.map 79F3D384 14765740 262144 518dafffd667c713135ee7251ec0ad4d0208b4bd halomaps:4134 +xmt_landslide_v2.map DF8063FA 19410100 262144 f9622f4f3a0ef9306c874a57150b943537693c4d halomaps:4166 +xmt_wing.map AC4F3E6D 12844472 262144 c562e54f13cfdcce96dd4395ceffe6ebde32a20c halomaps:3815 +xmtstunt.map A2895E04 13903864 262144 40fc4e72edb8eb3d5fd84475b76782de68db41d7 halomaps:3487 +xsnoderv2.map ED9DE84D 18719043 262144 751ea6db88e366fe9e97740f718e24e26802639b halomaps:4542 +xsnoderv3.map B7B0F29A 56851970 262144 d2b882e06716a6fa96871d966eb2825be976eb37 halomaps:4573 +xsnoderv3_revised.map 2245B9FE 72208026 262144 c1b545507373579b1f82cc60ed57793d7632c7b9 halomaps:4607 +xXx-Bloodaction.map 9FA24401 16317904 262144 4bc764866c7b38bfb6ff62b570e1931fa420a17a halomaps:4535 +xXx-Covenant_Attack.map F0455A76 134147555 262144 2839afd0ca22202daede67c85bd6a164d4befa7c halomaps:4415 +xXx-Covenant_Cityscape.map C48421F8 108154764 262144 cd9507dcff0b90b131877b1102264b8845ac0fe9 halomaps:4543 +xXx-Delta_Cliffs.map 98D43F70 86006136 262144 22c8f5a3aa8650ace26d63a490e4af32b9dd45c5 halomaps:4663 +xXx-Headlong.map 813DD22F 330514701 262144 31b7156bfbca0a1ba0329aa8f6f4a0448febdd9b halomaps:5714 +xXx-HLB_Snow_Grove.map F2EC4347 164829842 262144 a2a2d884826ceee8f78742e56329e2ae71f68e19 halomaps:5036 +xXx-New_Mombasa.map 40C163A3 77663057 262144 94ecec1363ba24bb3d9c69a697638206d2b5822b halomaps:4349 +xXx-Peril.map D11A6ED8 89668065 262144 05ff67c6d3fc5ee69c35b35bb0a77fd1eb491932 halomaps:4544 +xXx-Sandtrap.map 71F10050 199919041 262144 f1186dcfb2aeec72f7e6d65ae2922a76d2abe8ed halomaps:5194 +xXx-the-jajoma_battle.map 90DD923D 99027233 262144 96a83644515107b8f510531aa3301c13faf29d84 halomaps:4416 +xXx-The_Final_Challenge.map 8FBEF52F 134201553 262144 a40dd9c884c16ef8d3822c991d8d89daa0ccff76 halomaps:4545 +xXx-Trainer.map F95A3EDC 15531296 262144 0da2e3019b862913747e1a4382d642319559d2fb halomaps:4335 +xXx-Valhalla.map 7FCF1319 81132237 262144 9c1ca3e413d0e78b8c25d094a92a8b30dc2ee92f halomaps:4664 +xXx-Valhalla_v2.map 091D70F1 145297552 262144 9190aba0c21477e140fa15119103e087b6eec1ef halomaps:5098 +xXx-Zanzibar.map BD017CAB 83160759 262144 ee728b342c6325e9ce814bba02df79c48291074a halomaps:4350 +xXxIcedanger.map 94C87C30 23973516 262144 d49023eb7b6b5f52784cdda190568ae2da76a097 halomaps:4560 +xz_infinity.map 2C9CA32E 48156627 262144 48c2fa6f413504aeac60e92c4eccf04876766ccd halomaps:3328 +y-chromo.map 8444FB4C 47078758 262144 a67e879a14aa23680675422a937c4f198086f565 halomaps:2073 +y-ghost_test_gulch.map 656FD86B 19181928 262144 9cf24a57924ec6a8b3ba862c14f508d4e70b141b halomaps:2644 +ye_olde_halo.map 41F7382F 23258487 262144 0e06aeeec724b8c295af68211f10505fbb9c67f2 halomaps:5820 +yin_and_yang.map E46CC2BA 30973632 262144 c7b0fa1041b07885da5d4eabd5ac541b5abf168d halomaps:3803 +Yoyo_Emerald_Dream.map 484F0206 58758038 262144 9a1be1a8da7c43ac7d66350a65fe33ff90496216 halomaps:4698 +Yoyodance.map 06503AFC 63437732 262144 d0f186899c0ea24926489815af9962cba790c495 halomaps:4307 +yoyomod.map 3F7F4276 56732073 262144 07c20e2aa7c00035726929f72f8fbc222b8b285c halomaps:2563 +yoyomod2.map 5C7E785A 63753326 262144 e969ac9b7e642f0f31b0d47794ebb08da2f4d3eb halomaps:2704 +Yoyorast Island V2.map 125AD8FB 100451441 262144 f71eca4f586218e930f49807b5c53842a3fc05e9 halomaps:4957 +Yoyorast_Island.map 0E5D57DE 30052492 262144 24cca91e6ee7e574ae59174ac463376bb2641ee8 halomaps:1144 +Yoyorast_Island_KV.map 31C8D80B 76895826 262144 934c8e15d880b7592e464d835b85e52fd2f7ecc3 halomaps:4084 +Yoyorast_Island_KV2.map C66CA110 78412879 262144 57c6eeb11d58cd6a892d8df3c6980b7d3f44d460 halomaps:4085 +Yoyorast_island_KV3.map 7C09B07C 101526143 262144 a64da556e1f9e541fd1038e418dd9c8413c7fb48 halomaps:4460 +Yoyorast_Islandv2_public_beta.map C77A9565 19910208 262144 ca927f7196ee380fa931c4a1a77e10f468f72e0a halomaps:2325 +Yuldamas_base_house2v3.map E27283A8 133861619 262144 c99e75b530d47761eb68ce76e48c9273a82d1e34 halomaps:7098 +Yuldamas_war.map FFE9C673 122353794 262144 aaaf190080362798dd6f22305dec40c858adfd46 halomaps:7123 +Yuricoman_Map.map 46DA91F8 79621997 262144 2660fb03c6d8d02d8a7f023add5d842adc1cccbe halomaps:6239 +z-sec.map DFC96678 29349948 262144 dc5ad2a7b3851d800e80c910138553b055fea237 halomaps:821 +z_coagulation_h2_pb1.map 17E7F995 111715927 262144 73d2a2fa395b353974581da22b37e548857c4e18 halomaps:2753 +z_coagulation_h2_pb2.map 393DA418 107519327 262144 052b7b1170826e3f5f0b4695f2ec721f16f9c92a halomaps:3108 +z_sanctuary_h2_pb2.map 6FDD2ACC 112030615 262144 93d9a1b7ffd465d4e319f77060ef5cebe5c48e40 halomaps:2768 +Zanzibar-AI-MP.map 19A41206 57403060 262144 bcb4acb4cd97b040845b3d7d4835236805e7b021 halomaps:6460 +Zanzibar.map EC651927 62484486 262144 610ac86c363768fe46601402ffc62440d2a68c76 halomaps:586 +zanzibar_assualt.map AB8B3DDC 112445731 262144 067fe1cef95ae866d2d6b32faa0786d0f5738874 halomaps:4915 +Zanzibar_Classic.map A3B3E9FF 44580362 262144 5830a7bd4c9030022c7adb49ba482df89c1f4f91 halomaps:826 +Zanzibar_H2_v2.map 33960B74 88514145 262144 ae06d120ce1e12269f3778f262f426039d5aa758 halomaps:2584 +zanzibar_INTENSE.map C40A9D52 82653560 262144 a11ec5dd48ae8cbf5549872cb687663591e678e6 halomaps:4146 +zanzibar_ME.map 122E63BC 103827723 262144 545abf170861ccd08eabb7f9415f3c4429d23614 halomaps:2186 +zanzibarhalo3.map F3310500 115842442 262144 81dad9d8dd53aae5836f736e783bad9582912d81 halomaps:4417 +zelot2.map 3B73AC65 316576170 262144 97ddc9a6b4ff387571ef16d68963fe3ada02a034 halomaps:6485 +zendicon.map DEDCFDFA 31384317 262144 ba8e56205004bd756d39303d17c0759b5d00b833 halomaps:5438 +zenith.map 1928A536 15558344 262144 1282b2ad3d040241685f5d31a06dc4c72eb4f26c halomaps:392 +zenith_no_ai.map 6AE2CFF0 19032968 262144 b21c69b64ac61b505787b5116fcf3404d991af82 halomaps:454 +zerohour_h1.5.map 971C0632 20184628 262144 d0e6f3428a5c452e367bcb7da26e336fdd2d98f2 halomaps:7021 +zerowing.map 201B692D 111692454 262144 948313f1129cbbef6cb80ce69a0f0a5dc1d82a31 halomaps:1441 +ziwill_beta.map BEBAA669 14079604 262144 c79a12282a889f9f4a07a84bd164db2a37ca8fd0 halomaps:960 +zmm_battle_grounds.map 8B76478A 64750994 262144 70b3d9993e87eb83d0b3bc544a0853d6f9e4978d halomaps:4956 +zmm_grove_fixed.map FDF1B054 107151469 262144 7d24d85b027a294f92242d6618772cd8307de000 halomaps:5442 +ZMP_A50.map 7BBE4011 61676597 262144 795b9082688361440d4a277325d1772be1fd5a17 halonet:ZMP_A50.zip +ZMP_Beavercreek.map 36B52057 40106751 262144 ee4e7190b4f20f86f07e294c0409360c1f12df71 halonet:ZMP_Beavercreek.zip +ZMP_Boardingaction.map C4B8ACBC 41258467 262144 b6950191f8a2a93a0751d839b9dec842f85582f7 halonet:ZMP_Boardingaction.zip +ZMP_Carousel.map 0500C5A4 39923499 262144 77fce329dd12ce35f9b1bcdfeb955580cebb6479 halonet:ZMP_Carousel.zip +ZMP_Chillout.map 16720F68 40000975 262144 4d1f1baea4fc43d817b633cf3e192c9e359933ab halonet:ZMP_Chillout.zip +ZMP_Chilron_TL34.map 5B665B9C 40311743 262144 54b171a4f88a865c10f2394f956d8dff530f4bcd halonet:ZMP_Chilron_TL34.zip +ZMP_Damnation.map 15B79D15 41291855 262144 abf8b7abaffd012e2ab5effb7ff47ed530452fea halonet:ZMP_Damnation.zip +ZMP_Falujah_pb.map 88F4FB83 51285229 262144 6c45a35e7359011781e4245d318609833158e226 halonet:ZMP_Falujah_pb.zip +ZMP_Hangemhigh.map FA5FBB51 40424943 262144 b2ab82fdc7a7316d152d3f2cdb43e8d72030150c halonet:ZMP_Hangemhigh.zip +ZMP_Prisoner.map E6D1A47D 41546363 262144 65d430d6a960d0955dfdafe185bcaa50e8b8d6de halonet:ZMP_Prisoner.zip +ZMP_Rat_Race.map 1C84142C 39457383 262144 73636f79fa7a1798a0bb567e4425a672ebe9256a halonet:ZMP_Rat_Race.zip +ZMP_Sierra_PB.map DE73A216 72131455 262144 99428a5d0e3a7a1cb8f1835368de778dcc2edace halonet:ZMP_Sierra_PB.zip +ZMP_Turf_Zombiez.map 0904264A 69813944 262144 2992165c6e905468a42cd8e7a642eb3072272d05 halonet:ZMP_Turf_Zombiez.zip +ZMP_Wizard.map 0DD73629 52197098 262144 2cce6e84add750284ad1e722db37037eba30e994 halonet:ZMP_Wizard.zip +ZO_Spirit_Temple.map 0E17EEEF 27392163 262144 b52135ce22c4d3a63ad68d26bb5e12dc605a7d92 halomaps:3971 +Zombie_Aquarium.map 71D67527 111654767 262144 1d263c390213eda04b6fcebfa2e4e164724311b8 halonet:Zombie_Aquarium.zip +Zombie_Carousel.map D7FF1918 91111090 262144 87d3660ea275159d4f78690a96da06074ef82802 halonet:Zombie_Carousel.zip +Zombie_Chillout.map 968C08E7 62329645 262144 7aabe9920daf06a75582cd6476b2d702ad469b93 halonet:Zombie_Chillout.zip +Zombie_Church.map D84B02BD 180323241 262144 40ac51a99cf20736c5b0eb19e58611de7870e1de halonet:Zombie_Church.zip +Zombie_Creek.map 590EA715 71858415 262144 5e9525e9285d47b366996ac532a2fa9eb47b52fd halonet:Zombie_Creek.zip +Zombie_Dormitory.map 944AD8C4 101801818 262144 4c0bdc06486863274cb0c21af480f8e522df1560 halonet:Zombie_Dormitory.zip +Zombie_Down_Town.map F9C94648 115070288 262144 1679b1b33add0e5cda6663d1e71b864b9bd3fe4f halonet:Zombie_Down_Town.zip +Zombie_Graveyard.map 3B1268FF 196428212 262144 005084fb8a00d1d3757c5775139dec58911dc141 halonet:Zombie_Graveyard.zip +Zombie_Hangem_Dead.map 02FDBC44 63816973 262144 8d4cf9c1316de34fc0be0124175704568674d9c6 halonet:Zombie_Hangem_Dead.zip +Zombie_High_School.map D1BFCD5F 75010468 262144 7ae34df4744e6237885f7e9e4978a485dc01fad2 halonet:Zombie_High_School.zip +Zombie_Intensity.map 0DBC3862 131956046 262144 a38037abf8e2f68c09f28e5fb73742deceb810ff halonet:Zombie_Intensity.zip +Zombie_Morgue.map 971F07F0 100432659 262144 351f5d2102620a07865b38b3dd00f480cd4e0c56 halonet:Zombie_Morgue.zip +Zombie_Nation_pb1.map FDBAED06 226289199 262144 aa925de585f28e233861b7d4937d906f17c8130a halonet:Zombie_Nation_pb1.zip +Zombie_Ratrace.map 6F554862 65834885 262144 59cdeacdf575b9c1c2d0a332fca6a85886b4f7ee halonet:Zombie_Ratrace.zip +Zombie_Spooky_Hollow.map BBBBF017 130674502 262144 c4f04e504078c751de685391c8cf80edea817b45 halonet:Zombie_Spooky_Hollow.zip +zombiegulch.map B20BAEE3 30361668 262144 18b48fcbd4029981cb4f38c0a0affc2191760e5d halomaps:3156 +Zombies Low Internet.map 7B1219B7 33412941 262144 3325abbaf592cc4eecf464bd7602208e47947580 halomaps:6036 +zombies.map 0C6FE198 21964173 262144 771bec00a45a1d45d965da1dc29147fa07a9acab halomaps:3520 +zombiesv2pb1.map 6D5BB93A 16587145 262144 a29b83514d620d8f50c1b99995a278766548625f halomaps:3542 +Zone-delta.map 2A7748D1 32446762 262144 b598e9b1534344cf528400650524ecced2682c20 halomaps:2705 +Zoombiipanda.map 81602478 200302153 262144 bcfbc235cb1b2bd6de9209a62920c9cb0f3c3700 halonet:Zoombiipanda.zip +zxgulch.map 9465BD76 32202557 262144 ee1b2ce687c1048bacc8feb88d469ab43307ec44 halomaps:4482 +zyclone.map E3EEC41D 20279358 262144 fa2d93d849f29cd6a703e2f228c9a007016e28dd halomaps:1300 +zyone.map CE0A33DA 14836328 262144 95c9b8e98936a286bf36b718b3afc6c4c3a6c3c9 halomaps:1477 +zz.map 633B2766 21829619 262144 3f546f4b4d3b6b9b61b6c0b42c5b4afe7a263cfc halomaps:1023 +{]H3[}Trench_Final.map 743655B4 248957582 262144 676b99b5192d7fba35f19ad627c10733d421d27a halomaps:5863 +{add}clanmap.map 772A25BA 15192340 262144 7c0f9edde5df4ac0d1ca7d43daaef1c17de4a14b halomaps:2047 +{ADD}icegulch.map B36CA474 13120128 262144 02c7a1365645f51dd905bf3283c959ea4b6765f3 halomaps:2048 +{ADD}tutorial.map C02CD27A 14249072 262144 c0bec335d5b73e45610e4e1f7598f13fe739d45d halomaps:2014 +{ADD}y-chromo_beta.map ABE727F9 14191004 262144 7df5d12f3101688549bcea179d7b2aad23f32d5f halomaps:2049 +{DT} Covenant Sky Dive.map A2465FFB 41730944 262144 4e0cb1b25a95dc48da9d2475ecbbf13d155c3f64 halomaps:3996 +{DT} Death Swamp.map 3CE1572E 54998475 262144 266044d8afff995926eccc3f589a47559dd519de halomaps:3997 +{DT} Sky Dive.map B602177D 32437600 262144 755b59ef05c1280def70eaca439c82e81b656dda halomaps:3998 +{DxA}creek_beta2.map 0F5A0CF9 48368649 262144 335a3b5bd6f8b08571cfa01bae282b2e95e4df62 halomaps:2247 +{DxA}school_movie_edition.map CDB79D33 116055420 262144 5927ae3d6a967e0c28d71e80214b19734e6ec884 halomaps:2311 +{fck}valley.map B0D476A1 188709873 262144 aed32dd5d988655e2ba2eb1dceeff036ec78e405 halomaps:5862 +{H3}[bloodgulch].map 47CBEF79 179478951 262144 fcaac2254e59ef26e78a8086aa21c635bf06f86b halomaps:6528 +{H3}brutalgulch.map 08EDE522 101346674 262144 42a09fa1a8d7b325a2c53a60d8f6b1596a93320f halomaps:6053 +{H3}deltaruins.map 0892B52F 119115570 262144 c1640bb6cfd2667481fa4a1764ec72778b6032ca halomaps:6077 +{neo}bigass.map 9C75E879 384977152 262144 516dd16097068d2a5a2373e86a58d8db471ee6b2 halonet:{neo}bigass.zip +{neo}excavation.map 8D9F9E95 283065944 262144 7f0eaac9c95de0fff2e8b85e3e25bb03f5087f79 halonet:{neo}excavation.zip +{PRP}V@$H'sGulch.map 22F459A7 22798596 262144 30ea629a6265c1dc364989552d605177c76fbe06 halomaps:1727 +{ss}-[umt]creek.map B6707B83 274431269 262144 04b2e5b19a4b2b2cb6e736d2f4b8040fbbc96b8a halonet:{ss}-[umt]creek.zip +{ss}creek_rb_003.map 2D247E73 43177498 262144 d15990dba8ae3cc2f40fad92fc20838ac5a64c6a halonet:{ss}creek_rb_003.zip +{ss}snowcreek.map 9C07884B 105322231 262144 581efd78227e575671f688a1fe087b91e580c418 halonet:{ss}snowcreek.zip +{SS}Tribute by T5.map 68221CCA 18172644 262144 0e0c40fc804ff1f672c376538bc4bbd7fd89a0d4 halomaps:6482 +«Gç» Foundations.map 1BAB1780 29231599 262144 a44c492de6ba69e43997cb202753ad5527bfaa04 halomaps:1646 diff --git a/port/linux/README.md b/port/linux/README.md index b7b7a8d412..eafff9d2b4 100644 --- a/port/linux/README.md +++ b/port/linux/README.md @@ -174,7 +174,8 @@ These files are in the data root: The settings are in `config.toml` next to the executable. Refer to "Settings". Internet play's MQTT brokers are in `brokers.txt` next to it -(`network.brokers_file`). +(`network.brokers_file`). The index of the Custom Edition maps is in +`map_index.txt` next to it (`maps.index`; refer to "Map downloads"). If the game stops because of a fatal signal, it writes the address and a backtrace to the standard error. To find the function at the address, enter @@ -398,6 +399,11 @@ the setting for one start of the game. It has priority over the file. | `network.map_seed` | `true` | `HALO_NET_MAP_SEED` | When you play in the game of another machine: help send its map to players who join without it. HELP SEND MAPS in Settings > Network Setup > Map Sharing. | | `network.map_seed_upload` | `256` | `HALO_NET_MAP_SEED_UPLOAD` | When you play in the game of another machine: the most kilobytes per second that the game sends of maps to other players (`16` to `65536`). UPLOAD LIMIT in Settings > Network Setup > Map Sharing. | | `network.map_download` | `true` | `HALO_NET_MAP_DOWNLOAD` | When you join a game on a Custom Edition map that you do not have: download it from the players of the game. `false`: leave the game and show which map is missing. DOWNLOAD MAPS in Settings > Network Setup > Map Sharing. | +| `maps.downloads` | `true` | `HALO_MAP_DOWNLOADS` | When the host does not send a Custom Edition map that you do not have: download it from the community's archives. `false`: never. Refer to "Map downloads". | +| `maps.download_screen` | `true` | `HALO_MAP_DOWNLOAD_SCREEN` | `true`: Halo's loading screen covers the menus while a map downloads (B stops the download). `false`: the menus stay up, and the status line of the games list shows the download. | +| `maps.archives` | `"halonet,halomaps"` | `HALO_MAP_ARCHIVES` | Linux and Windows. The archives that a missing map is taken from first, out of the zip that holds it, in this order: `halonet` (maps.halonet.net), `halomaps` (halomaps.org). Empty: none. | +| `maps.web_seeds` | `"https://halomaps.fractumseraph.net/maps/"` | `HALO_MAP_WEB_SEEDS` | Linux and Windows. The `https://` folders (with commas between them) that hold the maps under their file names, tried after the archives. Empty: none. | +| `maps.index` | `"map_index.txt"` | `HALO_MAP_INDEX` | The index of the Custom Edition maps that downloads are checked against: next to `config.toml`, unless a full path. | | `network.coop_public` | `false` | `HALO_NET_COOP_PUBLIC` | `true`: an online co-op game (Create Game > Internet, a SINGLEPLAYER map) starts as PUBLIC. `false`: it starts as PRIVATE. LISTING in co-op's Server Setup writes its choice here. Refer to "Server browser". | | `network.brokers_file` | `"brokers.txt"` | `HALO_NET_BROKERS_FILE` | The file of the public MQTT brokers that let the machines of an invite find each other, and that carry the listings of the server browser: next to `config.toml`, unless a full path. One `host:port` on each line, up to 4; `#` starts a comment. | | `network.stun_servers` | Google and Cloudflare | `HALO_NET_STUN` | The public STUN servers (`host:port`, with commas between them) that give the internet address of a machine. | @@ -812,6 +818,24 @@ its invite) as the host does, and a player who downloads connects to them in the same way that it connected to the host. Map sharing uses port 5153 for its connections. Refer to `NETCODE.md`, "Map sharing". +### Map downloads + +When a host does not send its map (SHARE MAPS off, or a build that names +its maps without their hash), the game downloads the map from the +community's archives: the zips of HaloNet's map repository and of HaloMaps +(`maps.archives`), else a web seed (`maps.web_seeds`). Halo's loading +screen shows the download, and B stops it. Each map is checked against the +index of the maps (`map_index.txt` next to the executable, `maps.index`) +before it is used, and is written as `_.map`, the name that map +sharing gives it, beside any other version: no map is replaced or renamed. + +When you join a game from the games list whose map is named without its +hash and you do not have it, the map is downloaded first, and the join goes +ahead once it is there. When a host declines to send its map after you join, you +leave the game, and you join again once the map is there. The Linux and +Windows builds download from the archives. Refer to +[docs/map_downloads.md](../../docs/map_downloads.md). + ### Security Only machines with the invite can find the game: diff --git a/port/linux/game/custom_edition_cache.c b/port/linux/game/custom_edition_cache.c index c55293ea65..6f6f587874 100644 --- a/port/linux/game/custom_edition_cache.c +++ b/port/linux/game/custom_edition_cache.c @@ -309,6 +309,71 @@ static boolean maps_folder_digits_find( return found; } +/* the version of a map a network game's client plays when it is not the +one of the map's name: another version beside it in custom_maps, the +host's (_.map: custom_edition_cache_present), until the client +leaves (custom_edition_map_version_forget) */ +static struct +{ + char name[MAP_PATH_SIZE]; + char path[MAP_PATH_SIZE]; +} custom_edition_version; + +/* the checksum of a map file's header: its version; 0 if it is not a +Custom Edition cache */ +static unsigned long map_file_checksum( + char const *path); + +/* custom_maps' _.map of the version `checksum`, for a name +without the hash, into path: a version beside the map of its name (map +sharing's and the map downloads' name for one, map_downloads.c) */ +static boolean maps_folder_version( + char const *name, + unsigned long checksum, + char *path) +{ + char pattern[MAP_PATH_SIZE]; + WIN32_FIND_DATAA data; + HANDLE find; + boolean found = FALSE; + + if (!checksum || map_share_name_hashed(name) || strchr(name, '*') || strchr(name, '?') || + strlen(CUSTOM_EDITION_MAP_DIRECTORY) + strlen(name) + 1 + MAP_SHARE_NAME_DIGITS + 4 >= MAP_PATH_SIZE) + { + return FALSE; + } + sprintf(pattern, "%s%s_*%s", CUSTOM_EDITION_MAP_DIRECTORY, name, MAP_FILE_EXTENSION); + find = FindFirstFileA(pattern, &data); + if (find == INVALID_HANDLE_VALUE) + return FALSE; + do + { + char file[sizeof(data.cFileName) + 1]; + size_t length; + + memcpy(file, data.cFileName, sizeof(data.cFileName)); + file[sizeof(data.cFileName)] = 0; + length = strlen(file); + if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || length <= strlen(MAP_FILE_EXTENSION)) + continue; + file[length - strlen(MAP_FILE_EXTENSION)] = 0; + if (!map_share_name_hashed(file) || (size_t)map_share_name_base_length(file) != strlen(name) || + _strnicmp(file, name, strlen(name)) || + !maps_folder_has(maps_folder(0), file, MAP_FILE_EXTENSION, path)) + { + continue; + } + if (map_file_checksum(path) == checksum) + { + found = TRUE; + break; + } + } while (FindNextFileA(find, &data)); + CloseHandle(find); + + return found; +} + /* the file that holds the map `map_name` names (a level name or a file name): \.map (custom_maps' _.map for a name without the hash, if it has one map of that name; for a name with @@ -323,6 +388,13 @@ static boolean custom_edition_map_path( char hashed[MAP_PATH_SIZE]; short folder; + /* (the host's version a client chose, for this game) */ + if (custom_edition_version.name[0] && !_stricmp(custom_edition_version.name, name) && + file_path_exists(custom_edition_version.path)) + { + strcpy(path, custom_edition_version.path); + return TRUE; + } for (folder = 0; folder < NUMBER_OF_MAPS_FOLDERS; folder++) { if (maps_folder_has(maps_folder(folder), name, MAP_FILE_EXTENSION, path)) @@ -766,6 +838,95 @@ boolean custom_edition_map_file_present( return custom_edition_map_path(map_name, path); } +static unsigned long map_file_checksum( + char const *path) +{ + struct custom_edition_file file; + struct cache_file_identity identity; + unsigned long checksum = 0; + + if (custom_edition_file_open(&file, path)) + { + if (cache_file_identify(&file.source, &identity) == _cache_file_status_ok && + identity.format == _cache_file_format_custom_edition_cache) + { + checksum = identity.checksum; + } + custom_edition_file_close(&file); + } + return checksum; +} + +void custom_edition_map_version_forget( + void) +{ + custom_edition_version.name[0] = 0; + custom_edition_version.path[0] = 0; +} + +/* a file name added to a tab-separated list (some maps' names have commas) */ +static void file_list_add( + char *names, + long names_size, + char const *name) +{ + size_t used = strlen(names); + + if (used + (used ? 1 : 0) + strlen(name) + 1 > (size_t)names_size) + return; + if (used) + names[used++] = '\t'; + strcpy(names + used, name); +} + +short custom_edition_cache_files_missing( + char const *level_name, + unsigned long checksum, + char *names, + long names_size) +{ + char const *name = tag_name_strip_path(level_name); + char path[MAP_PATH_SIZE]; + char file_name[MAP_PATH_SIZE]; + short count = 0; + short type; + + names[0] = 0; + if (!halo_custom_edition_tag_cache()) + return -1; + /* the map: absent, or another version (and none of the host's version + beside it) */ + if (!custom_edition_map_path(level_name, path) || (checksum && map_file_checksum(path) != checksum)) + { + if (!maps_folder_version(name, checksum, path)) + { + snprintf(file_name, sizeof(file_name), "%s%s", name, MAP_FILE_EXTENSION); + file_list_add(names, names_size, file_name); + count++; + } + } + /* the resource maps, in no maps folder */ + for (type = _resource_map_bitmaps; type < NUMBER_OF_RESOURCE_MAP_TYPES; type++) + { + char const *resource_name = resource_map_type_describe((enum resource_map_type)type); + short folder; + + for (folder = 0; folder < NUMBER_OF_MAPS_FOLDERS; folder++) + { + if (maps_folder_has(maps_folder(folder), resource_name, MAP_FILE_EXTENSION, path)) + break; + } + if (folder == NUMBER_OF_MAPS_FOLDERS) + { + snprintf(file_name, sizeof(file_name), "%s%s", resource_name, MAP_FILE_EXTENSION); + file_list_add(names, names_size, file_name); + count++; + } + } + + return count; +} + unsigned long custom_edition_map_checksum( char const *level_name) { @@ -802,6 +963,26 @@ boolean custom_edition_cache_present( short folder; short type; + /* (a version chosen for an earlier map of this game that is not this + one's: the host changed to another version) */ + if (custom_edition_version.name[0] && !_stricmp(custom_edition_version.name, name) && + map_file_checksum(custom_edition_version.path) != checksum) + { + custom_edition_map_version_forget(); + } + /* (a level named without the hash whose map under its name is another + version, or is not there to tell (two versions beside it, named for + their hashes): the host's beside it, if it has it, is played for this + game) */ + if (checksum && !map_share_name_hashed(name) && strlen(name) < MAP_PATH_SIZE && + (!custom_edition_map_path(level_name, path) || map_file_checksum(path) != checksum) && + maps_folder_version(name, checksum, path)) + { + strcpy(custom_edition_version.name, name); + strcpy(custom_edition_version.path, path); + error(_error_silent, "custom edition: %s is played as %s, the host's version (%08lX)", level_name, path, + checksum); + } if (!custom_edition_map_path(level_name, path)) { snprintf(message, message_size, "You don't have the map %.*s.map. If you have it, copy it into custom_maps.", diff --git a/port/linux/game/custom_edition_cache.h b/port/linux/game/custom_edition_cache.h index a9e0d093e6..3241299b97 100644 --- a/port/linux/game/custom_edition_cache.h +++ b/port/linux/game/custom_edition_cache.h @@ -120,6 +120,25 @@ boolean custom_edition_cache_present( char *message, long message_size); +/* The files this machine lacks to play the level as a network game's +client (custom_edition_cache_present's conditions): its map, when absent, +not a Custom Edition cache or not the host's version (`checksum`; 0 for +any) with none of that version beside it, and each resource map absent, as +file names, tab-separated (".map\tbitmaps.map") in `names` +(`names_size` characters). Returns how many, 0 when nothing is missing, or +-1 when Custom Edition maps cannot run at all. The map downloads +(port/linux/src/map_downloads.c) fetch what is named. */ +short custom_edition_cache_files_missing( + char const *level_name, + unsigned long checksum, + char *names, + long names_size); +/* The map a network game's client plays is again the one of its name, not +the host's version beside it that custom_edition_cache_present chose (the +client gone: network_game_client_dispose). */ +void custom_edition_map_version_forget( + void); + /* Whether the file `file_name` (custom_maps\.map) is a Custom Edition cache of a campaign map (a solo scenario, played alone or as network co-op), or of a multiplayer map (custom_edition_maps.c). */ diff --git a/port/linux/game/download_screen.c b/port/linux/game/download_screen.c new file mode 100644 index 0000000000..c96fe5be85 --- /dev/null +++ b/port/linux/game/download_screen.c @@ -0,0 +1,173 @@ +/* +DOWNLOAD_SCREEN.C + +The screen a map's download shows over the menus: Halo's loading screen +(source/interface/progress_bar.c), its light sweeping from left to right as +the map comes (map_downloads.h: from the community's archives), with the map's name, how +the download goes and B to stop it under it, in the menus' fonts. The menus +behind it go on, so that the join waiting for the map follows once it is +there (menu_functions.c: map_fetch_update), but +they take no presses while it is up: B stops the download, and the join +with it. maps.download_screen = false leaves the menus up instead (the +games' list's status line says how the download goes). +*/ + +#include "cseries.h" +#include "cseries/cseries_windows.h" +#include "input/input.h" +#include "interface/event_manager.h" +#include "interface/progress_bar.h" +#include "interface/ui_widget.h" +#include "rasterizer/rasterizer.h" +#include "tag_files/tag_groups.h" +#include "text/draw_string.h" +#include "text/font_group.h" + +/* ---------- constants */ + +enum +{ + /* (event_manager.c's event type of a button, which it keeps to itself) */ + DOWNLOAD_EVENT_BUTTON = 3, + /* (draw_string.c's justifications, which it keeps to itself) */ + DOWNLOAD_TEXT_LEFT = 0, + DOWNLOAD_TEXT_CENTERED = 2, +}; + +/* ---------- prototypes */ + +/* port/linux/src (map_downloads.h, port_config.c) */ +int map_downloads_progress(float *fraction, char *name, int size); +int map_downloads_fetching(char *status, int size); +int config_boolean(char const *name); +/* menu_functions.c */ +void ui_widget_port_map_fetch_cancel(void); +/* ui_widget.c */ +boolean main_menu_is_active(void); + +/* ---------- globals */ + +static struct +{ + /* drawn last frame (the screen is let go of when it ends) */ + boolean shown; + /* the share done, as last drawn: the light never goes back */ + real progress; +} download_screen; + +/* ---------- private code */ + +/* a line of text centered at y in the menus' 640x480, in a menu font */ +static void download_screen_line( + char const *font, + short y, + real_argb_color const *color, + char const *text) +{ + rectangle2d bounds; + + bounds.x0 = 0; + bounds.x1 = 640; + bounds.y0 = y; + bounds.y1 = (short)(y + 40); + draw_string_set_draw_mode(tag_loaded(FONT_GROUP_TAG, font), NONE, DOWNLOAD_TEXT_CENTERED, 0, color); + rasterizer_draw_string(&bounds, NULL, NULL, 0, text); +} + +/* ---------- public code */ + +/* whether the screen is up: a map's download under way, at the menus */ +boolean download_screen_active( + void) +{ + float fraction; + char name[64]; + + return main_menu_is_active() && config_boolean("maps.download_screen") && + map_downloads_progress(&fraction, name, sizeof(name)); +} + +/* each frame the menus run while the screen is up (ui_widget.c's +process_ui_widgets): the presses are the screen's, and B stops the download */ +void download_screen_process( + void) +{ + struct event_record event; + + while (get_next_event(&event, NONE)) + { + if (event.type == DOWNLOAD_EVENT_BUTTON && event.data.button.index == _gamepad_analog_button_b) + { + ui_widget_port_map_fetch_cancel(); + break; + } + } + /* (the menus behind take nothing) */ + event_manager_flush(); +} + +/* each frame, after the menus are drawn (ui_widget.c's render_ui_widgets, +the first player's) */ +void download_screen_render( + void) +{ + real_argb_color const title_color = { 1.0f, 0.9f, 0.93f, 0.99f }; + real_argb_color const status_color = { 1.0f, 0.56f, 0.65f, 0.78f }; + real_argb_color const legend_color = { 1.0f, 1.0f, 1.0f, 1.0f }; + float fraction; + char name[64]; + char text[256]; + real progress; + rectangle2d bounds; + short index; + + /* (nothing drawn without a renderer, debug.null_renderer: the menus' + high-res button icons, which the legend draws, need OpenGL; B still + stops the download, download_screen_process) */ + if (!download_screen_active() || config_boolean("debug.null_renderer") || + !map_downloads_progress(&fraction, name, sizeof(name))) + { + if (download_screen.shown) + { + download_screen.shown = FALSE; + progress_bar_download_end(); + } + return; + } + if (!download_screen.shown) + { + download_screen.shown = TRUE; + download_screen.progress = 0.0f; + } + /* (the screen draws from a share above 0, and only forward: a share + falls back as the next file's size is learned) */ + progress = PIN(fraction, 0.001f, 1.0f); + if (progress < download_screen.progress) + progress = download_screen.progress; + download_screen.progress = progress; + progress_bar_download_display(progress); + + snprintf(text, sizeof(text), "DOWNLOADING %s", name); + for (index = 0; text[index]; index++) + { + if (text[index] >= 'a' && text[index] <= 'z') + text[index] = (char)(text[index] - 'a' + 'A'); + } + download_screen_line("ui\\large_ui", 300, &title_color, text); + /* (the status line's numbers: "Downloading : " is the title's) */ + if (map_downloads_fetching(text, sizeof(text))) + { + char const *numbers = strstr(text, ": "); + + download_screen_line("ui\\small_ui", 334, &status_color, numbers ? numbers + 2 : text); + } + /* (the B button's icon, as the menus' legends draw it: from the left, as + the icon and the words after it are each placed after the one before) */ + bounds.x0 = 290; + bounds.x1 = 640; + bounds.y0 = 362; + bounds.y1 = 402; + draw_string_set_draw_mode(tag_loaded(FONT_GROUP_TAG, "ui\\small_ui"), NONE, DOWNLOAD_TEXT_LEFT, 0, + &legend_color); + draw_string_and_hack_in_icons(&bounds, NULL, NULL, 0, L"%b-button=STOP", FALSE); +} diff --git a/port/linux/game/map_share.c b/port/linux/game/map_share.c index 505da4fc02..f8d85cd8ed 100644 --- a/port/linux/game/map_share.c +++ b/port/linux/game/map_share.c @@ -64,6 +64,7 @@ done. The host does not drop a machine that says it is downloading. #include "custom_edition_maps.h" #include "map_share.h" #include "../src/p2p.h" +#include "../src/map_downloads.h" #include #include @@ -1365,14 +1366,22 @@ static void download_offered( if (download->state != _download_asking || csstrcmp(offer->level_name, download->level_name)) return; - if (offer->result == _offer_off) - { - download_fail("The host does not share its maps."); - return; - } if (offer->result != _offer_ok || !offer->file_count || offer->file_count > MAXIMUM_FILES) { - download_fail("The host cannot share this map."); + char files[256]; + + /* (from the community's archives instead, when the index of the maps + has it: port/linux/src/map_downloads.c; the player joins again once + it is there) */ + if (custom_edition_cache_files_missing(download->level_name, download->version, files, sizeof(files)) > 0 && + map_downloads_fetch(download->level_name, download->version, files)) + { + download_fail("The host does not send this map, so it is being downloaded from the map archives " + "(Join Game shows how it goes). Join again when it is there."); + return; + } + download_fail(offer->result == _offer_off ? "The host does not share its maps." : + "The host cannot share this map."); return; } download->in_progress = TEST_FLAG(offer->flags, _offer_in_progress_bit); diff --git a/port/linux/game/menu_functions.c b/port/linux/game/menu_functions.c index 8bf724b8d4..62f7904246 100644 --- a/port/linux/game/menu_functions.c +++ b/port/linux/game/menu_functions.c @@ -81,6 +81,8 @@ their handlers open opens. #include "halo_menus.h" #include "custom_edition_cache.h" #include "custom_edition_maps.h" +#include "map_share.h" +#include "tag_files/tag_files.h" #include "network_voice.h" #include "text/draw_string.h" /* (internet play's server browser: the platform layer's) */ @@ -2274,6 +2276,22 @@ void platform_clipboard_set(char const *text); void platform_text_field(int typing, int password); int config_boolean(char const *name); void ui_widget_port_post_button(short controller_index, short button_index); +/* the map downloads (port/linux/src/map_downloads.c) */ +int map_downloads_fetch(char const *level_name, unsigned long version, char const *files); +int map_downloads_fetching(char *status, int size); +int map_downloads_take_ready(char *level_name, int size); +void map_downloads_cancel(void); + +/* a Custom Edition map being downloaded before its game is joined +(ui_widget_port_join_map_fetch, map_fetch_update) */ +static struct +{ + boolean pending; + /* the game's host (its XNADDR's abEnet) */ + unsigned char identifier[6]; + /* whose press is posted again once the map is there */ + short controller; +} map_fetch; static wchar_t const *const engine_names[] = { L"", L"CTF", L"SLAYER", L"ODDBALL", L"KING OF THE HILL", L"RACE" }; static short const maximum_players[] = { 2, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128 }; @@ -3218,6 +3236,7 @@ static void browser_focus(struct widget_instance *list) /* (the server browser's: below) */ static void lobby_browser_begin(void); static void lobby_browser_update(struct widget_instance *list); +static void map_fetch_update(struct widget_instance *list); static boolean lobby_browser_select(struct widget_instance *widget, short controller, short row, boolean *widget_deleted); @@ -3491,6 +3510,7 @@ static void lobby_browser_update(struct widget_instance *list) lobby_browser.count = lobby_browser_valid_games(lobby_browser.games, (short)p2p_lobby_games(lobby_browser.games, LOBBY_BROWSER_GAMES)); + map_fetch_update(list); if (focused == BROWSER_ROWS - 1 && lobby_browser.first + BROWSER_ROWS < lobby_browser.count && list_scrolls_at_end()) { lobby_browser.first++; @@ -3600,7 +3620,11 @@ static void lobby_browser_update(struct widget_instance *list) { wchar_t name[P2P_LISTING_NAME_SIZE + 1]; - if (!config_boolean("network.online")) + char status[256]; + + if (map_downloads_fetching(status, sizeof(status))) + text_to_wide(status, text, (short)NUMBEROF(text)); + else if (!config_boolean("network.online")) usnprintf(text, NUMBEROF(text) - 1, L"Internet play is off (Settings)"); else if (!config_boolean("network.public_lobby")) usnprintf(text, NUMBEROF(text) - 1, L"The server browser is off (network.public_lobby)"); @@ -3670,6 +3694,7 @@ static boolean lobby_browser_join(struct p2p_listing const *game, short controll lobby_browser.ready = FALSE; lobby_browser.join_time = system_milliseconds(); lobby_browser.controller = controller; + map_fetch.controller = controller; ui_play_audio_feedback_sound(SOUND_FORWARD); return TRUE; } @@ -3839,6 +3864,83 @@ static boolean password_screen_edit(struct widget_instance *row, boolean *widget /* "gamespy screen update": the games' rows (name, map, gametype, players), the one chosen's line, the counts over the titles (the PC version's: its players, page, servers) */ +/* ---- a Custom Edition map downloaded before joining, from the +community's archives (port/linux/src/map_downloads.c), when its host does +not send it: the join (ui_widget_port_join) waits for the map, and is +posted again (an A press on the game's row) once it is there (map_fetch, +declared with the browser's state) */ + +boolean ui_widget_port_join_map_fetch(void *advertised_game) +{ + struct advertised_game *game = advertised_game; + char files[256]; + + /* (a map named for its hash is the host's to send, by map sharing, + map_share.c, once joined: the archives are for the hosts that do not) */ + if (!custom_edition_level_name(game->map_name) || map_share_name_hashed(tag_name_strip_path(game->map_name))) + return FALSE; + if (custom_edition_cache_files_missing(game->map_name, (unsigned long)game->map_version, files, sizeof(files)) <= 0) + return FALSE; + if (!map_downloads_fetch(game->map_name, (unsigned long)game->map_version, files)) + return FALSE; + csmemcpy(map_fetch.identifier, game->xnaddr + 2, sizeof(map_fetch.identifier)); + map_fetch.pending = TRUE; + /* (the server browser's join, which reached the host: not pressed + again until the map is there) */ + lobby_browser.joining = lobby_browser.ready = FALSE; + platform_log("menus: joining %s waits for its map's download", game->map_name); + return TRUE; +} + +/* the download stopped by its screen's B (download_screen.c), and the join +that waited for it let go */ +void ui_widget_port_map_fetch_cancel(void) +{ + map_fetch.pending = FALSE; + map_downloads_cancel(); + platform_log("menus: the map's download is stopped (B)"); +} + +/* the download done: the game's row focused and its join posted, if it is +still listed */ +static void map_fetch_update(struct widget_instance *list) +{ + char level_name[0x80]; + short index; + + if (!map_fetch.pending || !map_downloads_take_ready(level_name, sizeof(level_name))) + return; + map_fetch.pending = FALSE; + if (multiplayer.mode == _multiplayer_mode_server_browser) + { + for (index = 0; index < lobby_browser.count; index++) + { + if (!csmemcmp(lobby_browser.games[index].identifier, map_fetch.identifier, sizeof(map_fetch.identifier))) + { + if (index < lobby_browser.first || index >= lobby_browser.first + BROWSER_ROWS) + lobby_browser.first = index; + lobby_browser_focus_row(list, (short)(index - lobby_browser.first)); + ui_widget_port_post_button(map_fetch.controller, BUTTON_A); + return; + } + } + } + else + { + for (index = 0; index < multiplayer.game_count; index++) + { + if (!csmemcmp(multiplayer.games[index]->xnaddr + 2, map_fetch.identifier, sizeof(map_fetch.identifier))) + { + multiplayer.game_chosen = index; + lobby_browser_focus_row(list, index); + ui_widget_port_post_button(map_fetch.controller, BUTTON_A); + return; + } + } + } + platform_log("menus: the map %s is there, but its game is no longer listed", level_name); +} + static void browser_update(struct widget_instance *list) { struct widget_instance *row; @@ -3853,6 +3955,9 @@ static void browser_update(struct widget_instance *list) browser_games_read(); if (focused != NONE && focused < multiplayer.game_count) multiplayer.game_chosen = focused; + /* (after the focused row's game is taken: a map downloaded focuses its + game's row, and chooses it) */ + map_fetch_update(list); for (row = list->child; row; row = row->next) { short index = browser_row_index(row); @@ -3881,8 +3986,12 @@ static void browser_update(struct widget_instance *list) { wchar_t text[ROW_TEXT_LENGTH * 2]; + char status[256]; + if (multiplayer.mode == _multiplayer_mode_server_browser) text[0] = 0; + else if (map_downloads_fetching(status, sizeof(status))) + text_to_wide(status, text, (short)NUMBEROF(text)); else if (!multiplayer.game_count) { usnprintf(text, NUMBEROF(text) - 1, L"%s", multiplayer.mode == _multiplayer_mode_direct_link ? @@ -3952,6 +4061,8 @@ static boolean browser_join(struct widget_instance *widget, short controller, bo return campaign_fail(); if (!multiplayer_player(controller)) return FALSE; + /* (the controller whose press is posted again once a map downloaded) */ + map_fetch.controller = controller; return ui_widget_port_join(widget, multiplayer.games[multiplayer.game_chosen], LOBBY_NAME, widget_deleted); } diff --git a/port/linux/include/halo_linux_source_fixups.h b/port/linux/include/halo_linux_source_fixups.h index feb6789b3f..b1e2b4559d 100644 --- a/port/linux/include/halo_linux_source_fixups.h +++ b/port/linux/include/halo_linux_source_fixups.h @@ -68,4 +68,12 @@ void halo_screen_anti_alias(short x0, short y0, short x1, short y1); /* the mouse in the menus (source/interface/ui_widget.c) */ #include "halo_ui_pointer.h" +/* Custom Edition maps downloaded from the community's archives before a +join (port/linux/src/map_downloads.c: cache_files.c, main.c's loop), and the +host's version of a map forgotten as a client leaves +(port/linux/game/custom_edition_cache.c) */ +int map_downloads_fetch(const char *level_name, unsigned long version, const char *files); +void map_downloads_poll(void); +void custom_edition_map_version_forget(void); + #endif diff --git a/port/linux/src/map_archives.c b/port/linux/src/map_archives.c new file mode 100644 index 0000000000..8b2dedac2d --- /dev/null +++ b/port/linux/src/map_archives.c @@ -0,0 +1,600 @@ +/* +MAP_ARCHIVES.C + +A Custom Edition map fetched from where the community keeps them +(map_archives.h), for map_downloads.c: the index of the maps +(port/assets/network/map_index.txt) names, for most maps, the zips of the +community's archives that hold them (tools/map_index.py sources), and +maps.archives the archives to try, in order; then the web seeds +(maps.web_seeds), folders that hold every map of the index under its file +name: + +- "halonet": HaloNet's map repository, a zip a map at + https://maps.halonet.net/maps/; +- "halomaps": HaloMaps (halomaps.org), whose files are fetched as its page's + Download button fetches them: the file's page + (https://halomaps.org/hce/detail.cfm?fid=) gives a token, which a + POST of the page's form sends back for the zip; +- a web seed: the map itself, . + +All over HTTPS, with the self-updater's download (update.h: Mbed TLS on +Linux, WinHTTP on Windows), which checks the servers' certificates. A zip +is written beside the map's download (.zip), and the map, the zip's +file of its name and size in any folder, taken out of it +(map_archives_unzip, map_archives_zip.c) into .part; a web seed's map +is written there itself. It becomes the path given once whole and checked +against the index's info hash (map_archives_verify, map_archives_zip.c); +one that is not the index's is deleted, and the next source tried. The zip +is deleted after. + +One fetch at a time, on a thread of its own, which the game's thread polls +and can stop (map_archives_stop: the download stops at its next block, and +the thread deletes what it wrote; the game's thread does not wait for it). +Android has no HTTPS download in its platform layer, and the web build +plays no Custom Edition maps: neither fetches from the archives (the web +build leaves this file out). +*/ + +#include "platform.h" +#include "posix.h" +#include "port_config.h" +#include "map_archives.h" + +#include +#include +#include +#include +#include +#include + +#ifndef HALO_ANDROID +#include "update.h" +#endif + +#define USER_AGENT "OpenCE (Halo; Custom Edition map downloads)" +#define HALONET_URL "https://maps.halonet.net/maps/" +#define HALOMAPS_PAGE_URL "https://halomaps.org/hce/detail.cfm?fid=" +#define HALOMAPS_FORM_URL "https://halomaps.org/hce/detail.cfm" +/* (a page is tens of kilobytes) */ +#define MAXIMUM_PAGE_SIZE (1024 * 1024) + +static const struct +{ + const char *key; + const char *name; +} archives[] = +{ + { "halonet", "HaloNet" }, + { "halomaps", "HaloMaps" }, + /* (maps.web_seeds': every map of the index, by its file name) */ + { "web", "the web seed" }, +}; +#define WEB_SEED_ARCHIVE 2 +#define ARCHIVE_COUNT ((int)(sizeof(archives) / sizeof(archives[0]))) + +/* ---------- names */ + +static int same_name(const char *a, const char *b, size_t length) +{ + size_t index; + + for (index = 0; index < length; index++) + { + char ca = a[index], cb = b[index]; + + if (ca >= 'A' && ca <= 'Z') + ca = (char)(ca - 'A' + 'a'); + if (cb >= 'A' && cb <= 'Z') + cb = (char)(cb - 'A' + 'a'); + if (ca != cb) + return 0; + if (!ca) + return 1; + } + return 1; +} + +/* whether maps.archives names the archive (a comma-separated list) */ +static int archive_enabled(int archive) +{ + const char *list = config_string("maps.archives"); + size_t length = strlen(archives[archive].key); + + /* (the web seeds': whether there are any) */ + if (archive == WEB_SEED_ARCHIVE) + { + const char *seeds = config_string("maps.web_seeds"); + + return seeds && strstr(seeds, "https://") != NULL; + } + + while (*list) + { + const char *comma = strchr(list, ','); + size_t item = comma ? (size_t)(comma - list) : strlen(list); + + while (item && *list == ' ') + list++, item--; + while (item && list[item - 1] == ' ') + item--; + if (item == length && same_name(list, archives[archive].key, length)) + return 1; + if (!comma) + break; + list = comma + 1; + } + return 0; +} + +/* the archive's id of the file in sources (tab-separated ":"), in +id (id_size characters); 1 if sources names the archive (a web seed has +every file: its id is the file name, set by the fetch) */ +static int archive_source(const char *sources, int archive, char *id, int id_size) +{ + size_t key_length = strlen(archives[archive].key); + const char *source = sources; + + if (archive == WEB_SEED_ARCHIVE) + { + if (id_size > 0) + id[0] = 0; + return 1; + } + + while (source && *source) + { + const char *tab = strchr(source, '\t'); + size_t length = tab ? (size_t)(tab - source) : strlen(source); + + if (length > key_length + 1 && source[key_length] == ':' && same_name(source, archives[archive].key, key_length)) + { + if (length - key_length - 1 >= (size_t)id_size) + return 0; + memcpy(id, source + key_length + 1, length - key_length - 1); + id[length - key_length - 1] = 0; + return 1; + } + source = tab ? tab + 1 : NULL; + } + return 0; +} + +#ifndef HALO_ANDROID + +/* ---------- the fetch's thread */ + +static struct +{ + pthread_mutex_t lock; + int lock_made; + /* set by map_archives_stop: the download ends at its next block */ + volatile int stop; + enum map_archives_state state; + unsigned long long received, total; + int archive; + char file_name[256]; + unsigned long long size; + unsigned long piece_length; + char info_hash[41]; + char sources[1024]; + char path[1024]; +} fetch; + +static void fetch_progress(void *context, unsigned long long received, unsigned long long total) +{ + (void)context; + pthread_mutex_lock(&fetch.lock); + fetch.received = received; + fetch.total = total; + pthread_mutex_unlock(&fetch.lock); +} + +/* text percent-encoded for a URL's path or a form's value */ +static void url_encode(const char *text, char *encoded, size_t size) +{ + static const char hex[] = "0123456789ABCDEF"; + size_t used = 0; + + for (; *text && used + 4 < size; text++) + { + unsigned char c = (unsigned char)*text; + + if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || strchr("-._~", c)) + { + encoded[used++] = (char)c; + } + else + { + encoded[used++] = '%'; + encoded[used++] = hex[c >> 4]; + encoded[used++] = hex[c & 15]; + } + } + encoded[used] = 0; +} + +/* HaloMaps's token for the file's download, out of its page (the form's +"hash" field: hexadecimal digits); 1 if found */ +static int halomaps_token(const char *page_path, char *token, int token_size) +{ + static const char marker[] = "name=\"hash\" value=\""; + struct posix_file_information information; + char *page, *found; + int file = open(page_path, O_RDONLY | O_CLOEXEC), ok = 0; + unsigned long size; + + if (file < 0) + return 0; + if (posix_fstat(file, &information) != 0 || information.size_high || information.size_low > MAXIMUM_PAGE_SIZE) + { + close(file); + return 0; + } + size = information.size_low; + page = malloc(size + 1); + if (page && map_archives_read_at(file, 0, page, size)) + { + page[size] = 0; + found = strstr(page, marker); + if (found) + { + int length = 0; + + found += sizeof(marker) - 1; + while (length < token_size - 1 && ((found[length] >= '0' && found[length] <= '9') || + (found[length] >= 'A' && found[length] <= 'F') || (found[length] >= 'a' && found[length] <= 'f'))) + { + token[length] = found[length]; + length++; + } + token[length] = 0; + ok = length > 0 && found[length] == '"'; + } + } + free(page); + close(file); + return ok; +} + +/* the zip of the file's id from the archive, into zip_path; 1 on success */ +static int fetch_zip(int archive, const char *id, const char *zip_path, char *error, int error_size) +{ + char url[2048]; + char encoded[1024]; + + if (!strcmp(archives[archive].key, "halonet")) + { + url_encode(id, encoded, sizeof(encoded)); + snprintf(url, sizeof(url), HALONET_URL "%s", encoded); + return update_request(url, NULL, USER_AGENT, &fetch.stop, zip_path, fetch_progress, NULL, error, error_size); + } + else + { + char page_path[1100]; + char token[64]; + char form[256]; + int got_token; + const char *digit; + + /* (a file's id is a number) */ + for (digit = id; *digit; digit++) + { + if (*digit < '0' || *digit > '9') + { + snprintf(error, (size_t)error_size, "a bad file id %s", id); + return 0; + } + } + snprintf(page_path, sizeof(page_path), "%s.html", fetch.path); + unlink(page_path); + snprintf(url, sizeof(url), HALOMAPS_PAGE_URL "%s", id); + if (!update_request(url, NULL, USER_AGENT, &fetch.stop, page_path, NULL, NULL, error, error_size)) + return 0; + got_token = halomaps_token(page_path, token, sizeof(token)); + unlink(page_path); + if (!got_token) + { + snprintf(error, (size_t)error_size, "its page has no download"); + return 0; + } + snprintf(form, sizeof(form), "fid=%s&action=dl&hash=%s&submit=download", id, token); + return update_request(HALOMAPS_FORM_URL, form, USER_AGENT, &fetch.stop, zip_path, fetch_progress, NULL, error, + error_size); + } +} + +/* the map from the first web seed (maps.web_seeds: folders, separated by +commas) that has it whole, into part_path; 1 on success */ +static int fetch_web_seeds(const char *part_path) +{ + const char *list = config_string("maps.web_seeds"); + char encoded[1024]; + + url_encode(fetch.file_name, encoded, sizeof(encoded)); + while (list && *list && !fetch.stop) + { + const char *comma = strchr(list, ','); + size_t length = comma ? (size_t)(comma - list) : strlen(list); + char folder[1024]; + char url[2100]; + char error[192]; + struct posix_file_information information; + + while (length && (*list == ' ' || *list == '\t')) + { + list++; + length--; + } + while (length && (list[length - 1] == ' ' || list[length - 1] == '\t')) + length--; + if (length && length < sizeof(folder) && !strncmp(list, "https://", 8)) + { + memcpy(folder, list, length); + folder[length] = 0; + snprintf(url, sizeof(url), "%s%s%s", folder, folder[length - 1] == '/' ? "" : "/", encoded); + pthread_mutex_lock(&fetch.lock); + fetch.received = fetch.total = 0; + pthread_mutex_unlock(&fetch.lock); + platform_log("map archives: fetching %s from %s", fetch.file_name, folder); + error[0] = 0; + unlink(part_path); + if (update_request(url, NULL, USER_AGENT, &fetch.stop, part_path, fetch_progress, NULL, error, + sizeof(error)) && + posix_stat(part_path, &information) == 0 && + (((unsigned long long)information.size_high << 32) | information.size_low) == fetch.size && + map_archives_verify(part_path, fetch.file_name, fetch.size, fetch.piece_length, fetch.info_hash, error, + sizeof(error))) + { + platform_log("map archives: %s came from %s", fetch.file_name, folder); + return 1; + } + platform_log("map archives: %s did not come from %s: %s", fetch.file_name, folder, + fetch.stop ? "stopped" : error[0] ? error : "another size"); + unlink(part_path); + } + list = comma ? comma + 1 : NULL; + } + return 0; +} + +static void *fetch_thread(void *unused) +{ + char zip_path[1100]; + char part_path[1100]; + int archive; + enum map_archives_state result = _map_archives_failed; + + (void)unused; + snprintf(zip_path, sizeof(zip_path), "%s.zip", fetch.path); + snprintf(part_path, sizeof(part_path), "%s.part", fetch.path); + for (archive = 0; archive < ARCHIVE_COUNT && !fetch.stop; archive++) + { + char id[512]; + char error[192]; + + if (!archive_enabled(archive) || !archive_source(fetch.sources, archive, id, sizeof(id))) + continue; + if (archive == WEB_SEED_ARCHIVE) + { + pthread_mutex_lock(&fetch.lock); + fetch.archive = archive; + pthread_mutex_unlock(&fetch.lock); + if (fetch_web_seeds(part_path)) + { + if (fetch.stop) + break; + unlink(fetch.path); + if (rename(part_path, fetch.path) != 0) + { + platform_log("map archives: %s could not be put in place", fetch.file_name); + break; + } + result = _map_archives_done; + } + break; + } + pthread_mutex_lock(&fetch.lock); + fetch.archive = archive; + fetch.received = fetch.total = 0; + pthread_mutex_unlock(&fetch.lock); + platform_log("map archives: fetching %s from %s (%s)", fetch.file_name, archives[archive].name, id); + error[0] = 0; + if (!fetch_zip(archive, id, zip_path, error, sizeof(error))) + { + platform_log("map archives: %s's zip did not come from %s: %s", fetch.file_name, archives[archive].name, + fetch.stop ? "stopped" : error); + unlink(zip_path); + continue; + } + if (!map_archives_unzip(zip_path, fetch.file_name, fetch.size, part_path, error, sizeof(error))) + { + platform_log("map archives: %s could not be taken out of %s's zip: %s", fetch.file_name, + archives[archive].name, error); + unlink(zip_path); + continue; + } + unlink(zip_path); + /* (another version than the index's, say: the next source) */ + if (!map_archives_verify(part_path, fetch.file_name, fetch.size, fetch.piece_length, fetch.info_hash, error, + sizeof(error))) + { + platform_log("map archives: %s from %s is not the index's: %s", fetch.file_name, archives[archive].name, + error); + unlink(part_path); + continue; + } + /* (in place of what an earlier download of it left in the downloads + folder, never of a map: the path is the downloads folder's) */ + if (fetch.stop) + break; + unlink(fetch.path); + if (rename(part_path, fetch.path) != 0) + { + platform_log("map archives: %s could not be put in place", fetch.file_name); + break; + } + platform_log("map archives: %s came from %s", fetch.file_name, archives[archive].name); + result = _map_archives_done; + break; + } + if (result != _map_archives_done) + unlink(part_path); + pthread_mutex_lock(&fetch.lock); + fetch.state = fetch.stop ? _map_archives_failed : result; + pthread_mutex_unlock(&fetch.lock); + return NULL; +} + +/* the fetch's state, read under its lock */ +static enum map_archives_state map_archives_poll_state(void) +{ + enum map_archives_state state; + + pthread_mutex_lock(&fetch.lock); + state = fetch.state; + pthread_mutex_unlock(&fetch.lock); + return state; +} + +int map_archives_available(const char *sources) +{ + char id[512]; + int archive; + + for (archive = 0; archive < ARCHIVE_COUNT; archive++) + { + if (archive_enabled(archive) && archive_source(sources, archive, id, sizeof(id))) + return 1; + } + return 0; +} + +int map_archives_start(const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, const char *sources, const char *path) +{ + pthread_t thread; + + if (!fetch.lock_made) + { + pthread_mutex_init(&fetch.lock, NULL); + fetch.lock_made = 1; + } + /* (a stopped fetch's thread may still be ending) */ + if (map_archives_poll_state() == _map_archives_running || !sources || !map_archives_available(sources) || + strlen(file_name) >= sizeof(fetch.file_name) || strlen(sources) >= sizeof(fetch.sources) || + strlen(path) + 8 >= sizeof(fetch.path) || !piece_length || strlen(info_hash) != 40) + { + return 0; + } + if (fetch.stop) + { + /* (a stopped fetch's thread has ended: what it left deleted) */ + char other_path[1100]; + + snprintf(other_path, sizeof(other_path), "%s.zip", fetch.path); + unlink(other_path); + snprintf(other_path, sizeof(other_path), "%s.html", fetch.path); + unlink(other_path); + } + snprintf(fetch.file_name, sizeof(fetch.file_name), "%s", file_name); + snprintf(fetch.sources, sizeof(fetch.sources), "%s", sources); + snprintf(fetch.path, sizeof(fetch.path), "%s", path); + fetch.size = size; + fetch.piece_length = piece_length; + snprintf(fetch.info_hash, sizeof(fetch.info_hash), "%s", info_hash); + fetch.stop = 0; + fetch.received = fetch.total = 0; + /* (the first source that will be tried, for the screen meanwhile) */ + for (fetch.archive = 0; fetch.archive < ARCHIVE_COUNT - 1; fetch.archive++) + { + char id[512]; + + if (archive_enabled(fetch.archive) && archive_source(sources, fetch.archive, id, sizeof(id))) + break; + } + fetch.state = _map_archives_running; + /* (detached: it touches nothing of the fetch once its state, under the + lock, says it ended, so that another can start then) */ + if (pthread_create(&thread, NULL, fetch_thread, NULL) != 0) + { + fetch.state = _map_archives_idle; + return 0; + } + pthread_detach(thread); + return 1; +} + +enum map_archives_state map_archives_poll(unsigned long long *received, unsigned long long *total, char *archive, + int archive_size) +{ + enum map_archives_state state; + + if (!fetch.lock_made) + return _map_archives_idle; + pthread_mutex_lock(&fetch.lock); + state = fetch.state; + *received = fetch.received; + *total = fetch.total; + snprintf(archive, (size_t)archive_size, "%s", archives[fetch.archive].name); + pthread_mutex_unlock(&fetch.lock); + return state; +} + +void map_archives_stop(void) +{ + enum map_archives_state state; + + if (!fetch.lock_made) + return; + pthread_mutex_lock(&fetch.lock); + state = fetch.state; + pthread_mutex_unlock(&fetch.lock); + /* (one under way ends by itself, at its download's next block, and is + idle once map_archives_start finds it ended) */ + if (state == _map_archives_running) + { + fetch.stop = 1; + return; + } + fetch.state = _map_archives_idle; +} + +#else + +/* Android: no HTTPS download in its platform layer (update.h is the +desktop updater's), so no fetch from the archives */ + +int map_archives_available(const char *sources) +{ + (void)sources; + (void)archive_source; + (void)archive_enabled; + return 0; +} + +int map_archives_start(const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, const char *sources, const char *path) +{ + (void)piece_length; + (void)info_hash; + (void)file_name; + (void)size; + (void)sources; + (void)path; + return 0; +} + +enum map_archives_state map_archives_poll(unsigned long long *received, unsigned long long *total, char *archive, + int archive_size) +{ + *received = *total = 0; + if (archive_size > 0) + archive[0] = 0; + return _map_archives_idle; +} + +void map_archives_stop(void) +{ +} + +#endif diff --git a/port/linux/src/map_archives.h b/port/linux/src/map_archives.h new file mode 100644 index 0000000000..dd801d6337 --- /dev/null +++ b/port/linux/src/map_archives.h @@ -0,0 +1,68 @@ +/* +MAP_ARCHIVES.H + +A Custom Edition map fetched from where the community keeps it +(map_archives.c): out of the zip HaloNet (maps.halonet.net) or HaloMaps +(halomaps.org) keeps it in, or from a web seed (maps.web_seeds), for +map_downloads.c; each checked against the index's hash of it. One at a +time, on a thread of its own. +*/ + +#ifndef __HALO_LINUX_MAP_ARCHIVES_H +#define __HALO_LINUX_MAP_ARCHIVES_H + +enum map_archives_state +{ + _map_archives_idle, + /* fetching a zip, or taking the map out of it */ + _map_archives_running, + /* the map is at the path given, and is the index's (its info hash the + index's: map_archives_verify) */ + _map_archives_done, + /* no archive gave it */ + _map_archives_failed, +}; + +/* Starts fetching the file named ( bytes) out of one of the zips that +sources names (the index's, tab-separated: "halonet:", +"halomaps:"), the archives tried in maps.archives's order, then +from the web seeds, into path (with path.zip, path.part and path.html beside +it meanwhile). What a source gives that is not the index's (info_hash, of +pieces of piece_length) is let go, and the next source tried. 1 if +started; 0 if no source has it, the build has none (Android, the web), or a +fetch is under way. */ +int map_archives_start(const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, const char *sources, const char *path); + +/* How the fetch goes: its state, the bytes of the zip come so far and of +the whole (0 when not known), and the archive's name ("HaloNet") */ +enum map_archives_state map_archives_poll(unsigned long long *received, unsigned long long *total, char *archive, + int archive_size); + +/* Stops a fetch under way (its files deleted), or lets go of a finished +one, so that another can start */ +void map_archives_stop(void); + +/* Whether sources (as map_archives_start's) names an archive of +maps.archives this build can fetch from */ +int map_archives_available(const char *sources); + +/* Takes the file named ( bytes, the first of the name and size in any +folder) out of the zip at zip_path into path: stored or deflated, its CRC +checked (map_archives_zip.c). 1 on success; else 0 and why in error. +(tools/map_download_check.c's "unzip", for the tests.) */ +int map_archives_unzip(const char *zip_path, const char *file_name, unsigned long long size, const char *path, + char *error, int error_size); + +/* size bytes of the open file at offset into buffer; 1 if all were read */ +int map_archives_read_at(int file, unsigned long long offset, void *buffer, unsigned long size); + +/* Whether the file at path is the index's file named ( bytes): its +BitTorrent info hash (40 hexadecimal digits, of the single-file torrent +{length, name, piece length, pieces} with pieces of piece_length) is +info_hash. 1 if it is; else 0 and why in error. (tools/map_download_check.c +"verify", for the tests.) */ +int map_archives_verify(const char *path, const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, char *error, int error_size); + +#endif diff --git a/port/linux/src/map_archives_zip.c b/port/linux/src/map_archives_zip.c new file mode 100644 index 0000000000..f6b570798b --- /dev/null +++ b/port/linux/src/map_archives_zip.c @@ -0,0 +1,410 @@ +/* +MAP_ARCHIVES_ZIP.C + +A map taken out of a map archive's zip (map_archives_unzip, map_archives.h): +the zip's file of the map's name and size, in any folder, stored or +deflated (the port's zlib), its CRC checked. Nothing here trusts the zip: +its end record and directory are read with every offset and size checked +against the file (APPNOTE.TXT 4.3; no Zip64, which no map's zip needs), and +the map is written no larger than the size asked for. And a map checked +against the index's hash of it (map_archives_verify). Apart from +map_archives.c, which fetches the zips, so that tools/map_download_check.c +(its "unzip" and "verify") and Android, which fetches none, have them +alone. +*/ + +#include "platform.h" +#include "posix.h" +#include "map_archives.h" +#include "map_sha1.h" + +#include +#include +#include +#include +#include + +#include "zlib_prefixed.h" + +/* the zip's end of central directory record, its directory's entries and +local headers (APPNOTE.TXT 4.3) */ +#define ZIP_END_SIGNATURE 0x06054B50UL +#define ZIP_END_SIZE 22 +#define ZIP_MAXIMUM_COMMENT 0xFFFF +#define ZIP_ENTRY_SIGNATURE 0x02014B50UL +#define ZIP_ENTRY_SIZE 46 +#define ZIP_LOCAL_SIGNATURE 0x04034B50UL +#define ZIP_LOCAL_SIZE 30 +#define ZIP_MAXIMUM_DIRECTORY (8 * 1024 * 1024) +#define ZIP_STORED 0 +#define ZIP_DEFLATED 8 + +static int same_name(const char *a, const char *b, size_t length) +{ + size_t index; + + for (index = 0; index < length; index++) + { + char ca = a[index], cb = b[index]; + + if (ca >= 'A' && ca <= 'Z') + ca = (char)(ca - 'A' + 'a'); + if (cb >= 'A' && cb <= 'Z') + cb = (char)(cb - 'A' + 'a'); + if (ca != cb) + return 0; + if (!ca) + return 1; + } + return 1; +} + +static unsigned long zip_u16(const unsigned char *bytes) +{ + return (unsigned long)bytes[0] | (unsigned long)bytes[1] << 8; +} + +static unsigned long zip_u32(const unsigned char *bytes) +{ + return (unsigned long)bytes[0] | (unsigned long)bytes[1] << 8 | (unsigned long)bytes[2] << 16 | + (unsigned long)bytes[3] << 24; +} + +int map_archives_read_at(int file, unsigned long long offset, void *buffer, unsigned long size) +{ + unsigned char *bytes = buffer; + posix_ulong low, high; + + if (posix_seek(file, (posix_long)(offset & 0xFFFFFFFFUL), (posix_long)(offset >> 32), SEEK_SET, &low, &high) != 0) + return 0; + while (size) + { + int count = (int)read(file, bytes, size > 65536 ? 65536u : (unsigned)size); + + if (count <= 0) + return 0; + bytes += count; + size -= (unsigned long)count; + } + return 1; +} + +static int write_all(int file, const unsigned char *bytes, unsigned long size) +{ + while (size) + { + int count = (int)write(file, bytes, size > 65536 ? 65536u : (unsigned)size); + + if (count <= 0) + return 0; + bytes += count; + size -= (unsigned long)count; + } + return 1; +} + +/* the file's data, stored or deflated, from offset in the zip into output */ +static int unzip_data(int zip, unsigned long long offset, unsigned long long zip_size, int method, + unsigned long long packed_size, unsigned long long size, unsigned long crc, int output, char *error, + int error_size) +{ + static unsigned char in[65536], out[65536]; + unsigned long long read_so_far = 0, written = 0; + unsigned long computed = crc32(0L, Z_NULL, 0); + z_stream stream; + int status = Z_OK; + + if (offset > zip_size || packed_size > zip_size - offset || (method == ZIP_STORED && packed_size != size)) + { + snprintf(error, (size_t)error_size, "the zip's file runs past its end"); + return 0; + } + memset(&stream, 0, sizeof(stream)); + if (method == ZIP_DEFLATED && inflateInit2(&stream, -MAX_WBITS) != Z_OK) + { + snprintf(error, (size_t)error_size, "zlib could not start"); + return 0; + } + while (read_so_far < packed_size && status != Z_STREAM_END) + { + unsigned long chunk = packed_size - read_so_far > sizeof(in) ? (unsigned long)sizeof(in) : + (unsigned long)(packed_size - read_so_far); + + if (!map_archives_read_at(zip, offset + read_so_far, in, chunk)) + { + snprintf(error, (size_t)error_size, "the zip cannot be read"); + break; + } + read_so_far += chunk; + if (method == ZIP_STORED) + { + if (!write_all(output, in, chunk)) + { + snprintf(error, (size_t)error_size, "the map cannot be written"); + break; + } + computed = crc32(computed, in, (uInt)chunk); + written += chunk; + continue; + } + stream.next_in = in; + stream.avail_in = (uInt)chunk; + while (stream.avail_in && status != Z_STREAM_END) + { + unsigned long count; + + stream.next_out = out; + stream.avail_out = sizeof(out); + status = inflate(&stream, Z_NO_FLUSH); + if (status != Z_OK && status != Z_STREAM_END) + { + snprintf(error, (size_t)error_size, "the zip's data is damaged (zlib %d)", status); + break; + } + count = (unsigned long)(sizeof(out) - stream.avail_out); + if (written + count > size || !write_all(output, out, count)) + { + snprintf(error, (size_t)error_size, written + count > size ? "the map is larger than the zip says" : + "the map cannot be written"); + status = Z_DATA_ERROR; + break; + } + computed = crc32(computed, out, (uInt)count); + written += count; + } + if (status != Z_OK && status != Z_STREAM_END) + break; + } + if (method == ZIP_DEFLATED) + inflateEnd(&stream); + if (written != size || (method == ZIP_DEFLATED && status != Z_STREAM_END)) + { + if (!error[0]) + snprintf(error, (size_t)error_size, "the map in the zip is cut short"); + return 0; + } + if (computed != crc) + { + snprintf(error, (size_t)error_size, "the map's CRC is not the zip's"); + return 0; + } + return 1; +} + +int map_archives_unzip(const char *zip_path, const char *file_name, unsigned long long size, const char *path, + char *error, int error_size) +{ + struct posix_file_information information; + unsigned char tail[ZIP_END_SIZE + ZIP_MAXIMUM_COMMENT]; + unsigned char *directory = NULL; + unsigned long long zip_size, tail_size, directory_offset; + unsigned long directory_size, entries, entry; + unsigned long at; + size_t name_length = strlen(file_name); + int zip, output = -1, found = 0, done = 0; + long end; + + error[0] = 0; + zip = open(zip_path, O_RDONLY | O_CLOEXEC); + if (zip < 0 || posix_fstat(zip, &information) != 0) + { + snprintf(error, (size_t)error_size, "the zip cannot be opened"); + if (zip >= 0) + close(zip); + return 0; + } + zip_size = (unsigned long long)information.size_high << 32 | information.size_low; + /* the end of central directory record: the last of its signature in + the file's last 64 KB, which it and the zip's comment fill */ + tail_size = zip_size < sizeof(tail) ? zip_size : sizeof(tail); + if (tail_size < ZIP_END_SIZE || !map_archives_read_at(zip, zip_size - tail_size, tail, (unsigned long)tail_size)) + { + snprintf(error, (size_t)error_size, "it is not a zip"); + goto finish; + } + for (end = (long)tail_size - ZIP_END_SIZE; end >= 0; end--) + { + if (zip_u32(tail + end) == ZIP_END_SIGNATURE && + (unsigned long long)end + ZIP_END_SIZE + zip_u16(tail + end + 20) <= tail_size) + { + break; + } + } + if (end < 0) + { + snprintf(error, (size_t)error_size, "it is not a zip"); + goto finish; + } + entries = zip_u16(tail + end + 10); + directory_size = zip_u32(tail + end + 12); + directory_offset = zip_u32(tail + end + 16); + /* (a Zip64 archive, over 4 GB, is no map's) */ + if (directory_size > ZIP_MAXIMUM_DIRECTORY || directory_offset > zip_size || + directory_size > zip_size - directory_offset) + { + snprintf(error, (size_t)error_size, "the zip's directory is damaged"); + goto finish; + } + directory = malloc(directory_size ? directory_size : 1); + if (!directory || !map_archives_read_at(zip, directory_offset, directory, directory_size)) + { + snprintf(error, (size_t)error_size, "the zip's directory cannot be read"); + goto finish; + } + for (entry = 0, at = 0; entry < entries && !found; entry++) + { + unsigned long entry_name_length, extra_length, comment_length; + const char *name; + const char *base; + unsigned long index; + + if (at + ZIP_ENTRY_SIZE > directory_size || zip_u32(directory + at) != ZIP_ENTRY_SIGNATURE) + { + snprintf(error, (size_t)error_size, "the zip's directory is damaged"); + goto finish; + } + entry_name_length = zip_u16(directory + at + 28); + extra_length = zip_u16(directory + at + 30); + comment_length = zip_u16(directory + at + 32); + if (at + ZIP_ENTRY_SIZE + entry_name_length + extra_length + comment_length > directory_size) + { + snprintf(error, (size_t)error_size, "the zip's directory is damaged"); + goto finish; + } + /* (the name's last part, after any folders) */ + name = (const char *)directory + at + ZIP_ENTRY_SIZE; + base = name; + for (index = 0; index < entry_name_length; index++) + { + if (name[index] == '/' || name[index] == '\\') + base = name + index + 1; + } + if ((size_t)(name + entry_name_length - base) == name_length && same_name(base, file_name, name_length) && + zip_u32(directory + at + 24) == size) + { + unsigned char local[ZIP_LOCAL_SIZE]; + unsigned long long header = zip_u32(directory + at + 42); + int method = (int)zip_u16(directory + at + 10); + + found = 1; + if ((zip_u16(directory + at + 8) & 1) || (method != ZIP_STORED && method != ZIP_DEFLATED)) + { + snprintf(error, (size_t)error_size, "the map is %s in the zip", + (zip_u16(directory + at + 8) & 1) ? "encrypted" : "compressed in a way not read here"); + goto finish; + } + if (header + ZIP_LOCAL_SIZE > zip_size || !map_archives_read_at(zip, header, local, ZIP_LOCAL_SIZE) || + zip_u32(local) != ZIP_LOCAL_SIGNATURE) + { + snprintf(error, (size_t)error_size, "the zip's file header is damaged"); + goto finish; + } + output = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644); + if (output < 0) + { + snprintf(error, (size_t)error_size, "the map cannot be written"); + goto finish; + } + done = unzip_data(zip, header + ZIP_LOCAL_SIZE + zip_u16(local + 26) + zip_u16(local + 28), zip_size, method, + zip_u32(directory + at + 20), size, zip_u32(directory + at + 16), output, error, error_size); + } + at += ZIP_ENTRY_SIZE + entry_name_length + extra_length + comment_length; + } + if (!found) + snprintf(error, (size_t)error_size, "the zip has no %s of %llu bytes", file_name, size); + +finish: + if (output >= 0) + { + if (close(output) != 0) + done = 0; + if (!done) + unlink(path); + } + free(directory); + close(zip); + return done; +} + +/* ---------- checking */ + +int map_archives_verify(const char *path, const char *file_name, unsigned long long size, unsigned long piece_length, + const char *info_hash, char *error, int error_size) +{ + static const char hex[] = "0123456789abcdef"; + unsigned long long pieces = piece_length ? (size + piece_length - 1) / piece_length : 0; + unsigned char *hashes = NULL; + unsigned char *piece = NULL; + unsigned char digest[SHA1_DIGEST_SIZE]; + struct sha1_state state; + char prefix[512]; + char found[41]; + unsigned long long index; + int file; + int ok = 0; + + /* (a piece's hash is 20 bytes: a few MB of them for any map there is) */ + if (!size || !pieces || pieces > (16ULL << 20) / SHA1_DIGEST_SIZE || strlen(info_hash) != 40) + { + snprintf(error, (size_t)error_size, "the index's size or piece length is bad"); + return 0; + } + file = open(path, O_RDONLY | O_CLOEXEC); + if (file < 0) + { + snprintf(error, (size_t)error_size, "it cannot be read"); + return 0; + } + hashes = malloc((size_t)pieces * SHA1_DIGEST_SIZE); + piece = malloc(piece_length); + if (!hashes || !piece) + { + snprintf(error, (size_t)error_size, "no memory to check it"); + goto done; + } + for (index = 0; index < pieces; index++) + { + unsigned long length = index + 1 < pieces ? piece_length : (unsigned long)(size - index * piece_length); + + if (!map_archives_read_at(file, index * piece_length, piece, length)) + { + snprintf(error, (size_t)error_size, "it is shorter than the index's"); + goto done; + } + sha1_bytes(piece, length, hashes + index * SHA1_DIGEST_SIZE); + } + /* (the info dictionary as BitTorrent encodes it, its keys in order: + the index's maker made it so, tools/map_index.py) */ + snprintf(prefix, sizeof(prefix), "d6:lengthi%llue4:name%lu:%s12:piece lengthi%lue6:pieces%llu:", size, + (unsigned long)strlen(file_name), file_name, piece_length, pieces * SHA1_DIGEST_SIZE); + sha1_start(&state); + sha1_update(&state, prefix, (unsigned long)strlen(prefix)); + sha1_update(&state, hashes, (unsigned long)(pieces * SHA1_DIGEST_SIZE)); + sha1_update(&state, "e", 1); + sha1_finish(&state, digest); + for (index = 0; index < SHA1_DIGEST_SIZE; index++) + { + found[index * 2] = hex[digest[index] >> 4]; + found[index * 2 + 1] = hex[digest[index] & 15]; + } + found[40] = 0; + /* (the index's digits in either case) */ + ok = 1; + for (index = 0; index < 40; index++) + { + char wanted = info_hash[index]; + + if (wanted >= 'A' && wanted <= 'F') + wanted = (char)(wanted - 'A' + 'a'); + if (found[index] != wanted) + ok = 0; + } + if (!ok) + snprintf(error, (size_t)error_size, "its hash is %s, the index's %s", found, info_hash); + +done: + free(piece); + free(hashes); + close(file); + return ok; +} diff --git a/port/linux/src/map_downloads.c b/port/linux/src/map_downloads.c new file mode 100644 index 0000000000..5dbf0f11a3 --- /dev/null +++ b/port/linux/src/map_downloads.c @@ -0,0 +1,767 @@ +/* +MAP_DOWNLOADS.C + +Custom Edition maps downloaded from where the community keeps them +(map_downloads.h). + +A machine joining a game on a Custom Edition map it lacks, or has another +version of, whose host does not send it (map sharing does when the host +shares and names the map for its hash: port/linux/game/map_share.c), asks +here for it before it joins (ui_widget_port_join_map_fetch in +menu_functions.c; cache_files_map_present, when the host changes map after +the join; map_share.c, when the host turns the request down), with Custom +Edition's bitmaps.map, sounds.map and loc.map when they are missing. Each is +looked up in the index of the maps (maps.index: the file name and, for the +map, the header checksum the host sent, which is the game's map version) +and fetched by map_archives.c into custom_maps\downloads: out of HaloNet's +or HaloMaps's zip that holds it (maps.archives), else from a web seed +(maps.web_seeds), each checked against the index's hash before it is +taken. One file at a time, on map_archives.c's thread. + +A file that arrives is moved into custom_maps: a map as +_.map, the name map sharing gives a version of it +(map_share_name_digits), beside any other version there; a resource map +under its own name, only when there is none. No file already there is ever +replaced, renamed or changed. Once every file is there the menus try the +join again (map_downloads_take_ready). The menus show how it goes +(map_downloads_fetching, map_downloads_progress). +*/ + +#include "platform.h" +#include "posix.h" +#include "port_config.h" +#include "map_archives.h" +#include "map_downloads.h" + +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +#ifdef _WIN32 +#define PATH_SEPARATOR "\\" +#else +#define PATH_SEPARATOR "/" +#endif + +#define INDEX_FORMAT "# halo map index v1" +/* the Custom Edition maps' folders (custom_edition_cache.h's +CUSTOM_EDITION_MAP_DIRECTORY and CUSTOM_EDITION_INSTALL_MAP_DIRECTORY): +downloads go into the first */ +#define CUSTOM_MAPS_XBOX_PATH "d:\\custom_maps\\" +#define INSTALL_MAPS_XBOX_PATH "h:\\maps\\" +/* a Custom Edition map's level name (CUSTOM_EDITION_LEVEL_NAME_PREFIX) */ +#define LEVEL_NAME_PREFIX "custom_maps\\" +#define DOWNLOADS_FOLDER "downloads" +#define MAP_FILE_EXTENSION ".map" +/* the digits a map's name ends in after _ (map_share.h's +MAP_SHARE_NAME_DIGITS) */ +#define NAME_DIGITS 8 +#define FETCH_MAXIMUM_FILES 4 +#define FAILURE_SHOWN_MILLISECONDS 15000 +#define NAME_SIZE 128 + +/* (port/linux/game/map_share_files.c's: the digits a map file is named by, +.map's hash) */ +unsigned char map_share_name_digits(const char *folder, const char *name, char *digits); + +/* ---------- the index */ + +struct index_entry +{ + /* into maps_index.names */ + unsigned long name; + unsigned long checksum; + unsigned long long size; + unsigned long piece_length; + char info_hash[41]; + /* into maps_index.names: the archives' zips that hold it, as the + index's columns after the info hash (tab-separated "halonet:", + "halomaps:"; map_archives.h), "" for none */ + unsigned long sources; +}; + +static struct +{ + int loaded; + struct index_entry *entries; + int count; + char *names; + unsigned long names_size; + char path[1024]; +} maps_index; + +static int same_name(const char *a, const char *b) +{ + for (;; a++, b++) + { + char ca = *a, cb = *b; + + if (ca >= 'A' && ca <= 'Z') + ca = (char)(ca - 'A' + 'a'); + if (cb >= 'A' && cb <= 'Z') + cb = (char)(cb - 'A' + 'a'); + if (ca != cb) + return 0; + if (!ca) + return 1; + } +} + +static void index_path(char *path, int size) +{ + const char *name = config_string("maps.index"); + + if (name[0] == '/' || name[0] == '\\' || (name[0] && name[1] == ':')) + { + snprintf(path, (size_t)size, "%s", name); + return; + } + config_folder(path, (unsigned long)size); + snprintf(path + strlen(path), (size_t)size - strlen(path), "%s", name); +} + +/* reads the index once: each line a map's file name, header checksum, +size, piece length and info hash, and the archives' zips that hold it, +tab-separated (tools/map_index.py) */ +static void index_load(void) +{ + char *file; + size_t file_size = 0; + char *line; + char *next; + int capacity = 0; + int number = 0; + + if (maps_index.loaded) + return; + maps_index.loaded = 1; + index_path(maps_index.path, sizeof(maps_index.path)); + file = config_file_read(maps_index.path, &file_size); + if (!file) + { + platform_log("map downloads: the index %s cannot be read (maps.index)", maps_index.path); + return; + } + if (strncmp(file, INDEX_FORMAT, strlen(INDEX_FORMAT))) + { + platform_log("map downloads: %s is not a map index (its first line is not \"%s\")", maps_index.path, + INDEX_FORMAT); + free(file); + return; + } + maps_index.names = malloc(file_size + 1); + if (!maps_index.names) + { + free(file); + return; + } + for (line = file; line && *line; line = next) + { + char *fields[5]; + char *sources; + int field; + char *end; + struct index_entry *entry; + size_t name_length; + + number++; + next = strchr(line, '\n'); + if (next) + *next++ = 0; + end = line + strlen(line); + while (end > line && (end[-1] == '\r' || end[-1] == ' ')) + *--end = 0; + if (!line[0] || line[0] == '#') + continue; + fields[0] = line; + for (field = 1; field < 5; field++) + { + char *tab = strchr(fields[field - 1], '\t'); + + if (!tab) + break; + *tab = 0; + fields[field] = tab + 1; + } + sources = field == 5 ? strchr(fields[4], '\t') : NULL; + if (sources) + *sources++ = 0; + if (field < 5 || strlen(fields[4]) != 40) + { + platform_log("map downloads: %s line %d is not an entry (left out)", maps_index.path, number); + continue; + } + if (maps_index.count == capacity) + { + struct index_entry *grown; + + capacity = capacity ? capacity * 2 : 1024; + grown = realloc(maps_index.entries, (size_t)capacity * sizeof(*grown)); + if (!grown) + break; + maps_index.entries = grown; + } + entry = &maps_index.entries[maps_index.count]; + name_length = strlen(fields[0]); + entry->name = maps_index.names_size; + memcpy(maps_index.names + maps_index.names_size, fields[0], name_length + 1); + maps_index.names_size += (unsigned long)name_length + 1; + entry->checksum = strtoul(fields[1], NULL, 16); + entry->size = strtoull(fields[2], NULL, 10); + entry->piece_length = strtoul(fields[3], NULL, 10); + memcpy(entry->info_hash, fields[4], 41); + /* (the names and sources together are shorter than the file) */ + entry->sources = maps_index.names_size; + name_length = sources ? strlen(sources) : 0; + memcpy(maps_index.names + maps_index.names_size, sources ? sources : "", name_length + 1); + maps_index.names_size += (unsigned long)name_length + 1; + name_length = strlen(maps_index.names + entry->name); + if (!name_length || !entry->size || !entry->piece_length) + { + platform_log("map downloads: %s line %d has a bad size or piece length (left out)", maps_index.path, + number); + continue; + } + maps_index.count++; + } + free(file); + platform_log("map downloads: %d maps indexed in %s", maps_index.count, maps_index.path); +} + +/* the entry of the file named, of the checksum (0: any; an entry's 0 is +its own version's, as some maps' headers have, not any) */ +static const struct index_entry *index_find(const char *file_name, unsigned long checksum) +{ + int which; + + index_load(); + for (which = 0; which < maps_index.count; which++) + { + const struct index_entry *entry = &maps_index.entries[which]; + + if (same_name(maps_index.names + entry->name, file_name) && (!checksum || entry->checksum == checksum)) + return entry; + } + return NULL; +} + +/* the length of a name without the _ and hash digits it ends in (a map +named for its hash, map sharing's _); 0 if it ends in none */ +static size_t hashed_base_length(const char *name, size_t length) +{ + size_t index; + + if (length <= NAME_DIGITS + 1 || name[length - NAME_DIGITS - 1] != '_') + return 0; + for (index = length - NAME_DIGITS; index < length; index++) + { + char c = name[index]; + + if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) + return 0; + } + return length - NAME_DIGITS - 1; +} + +/* the entry of the file named (.map) or, for a level named for the +map's hash (_.map), of the name without the hash; of the +checksum (0: any) */ +static const struct index_entry *index_find_file(const char *file_name, unsigned long checksum) +{ + const struct index_entry *entry = index_find(file_name, checksum); + size_t length = strlen(file_name); + size_t base; + char name[NAME_SIZE]; + + if (entry || length <= strlen(MAP_FILE_EXTENSION) || length >= sizeof(name)) + return entry; + base = hashed_base_length(file_name, length - strlen(MAP_FILE_EXTENSION)); + if (!base) + return NULL; + snprintf(name, sizeof(name), "%.*s" MAP_FILE_EXTENSION, (int)base, file_name); + return index_find(name, checksum); +} + +/* ---------- paths */ + +static int file_present(const char *path) +{ + struct posix_file_information information; + + return posix_stat(path, &information) == 0 && !(information.flags & _posix_file_is_directory); +} + +/* a file moved to a name no file has: never in place of one (POSIX's +rename would replace it, so the name is taken first; Windows's fails) */ +static int move_to_new_name(const char *from, const char *to) +{ +#ifndef _WIN32 + int taken = open(to, O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC, 0644); + + if (taken < 0) + return 0; + close(taken); + if (rename(from, to) != 0) + { + unlink(to); + return 0; + } + return 1; +#else + return rename(from, to) == 0; +#endif +} + +/* the folder made if missing; 1 if it is there */ +static int folder_made(const char *path) +{ + struct posix_file_information information; + + if (posix_make_directory(path)) + return 1; + return posix_stat(path, &information) == 0 && (information.flags & _posix_file_is_directory); +} + +/* the custom_maps folder (made if missing), with its separator */ +static int custom_maps_folder(char *path, int size) +{ + size_t length; + + platform_translate_path(CUSTOM_MAPS_XBOX_PATH, path, (unsigned long)size); + length = strlen(path); + while (length && (path[length - 1] == '/' || path[length - 1] == '\\')) + path[--length] = 0; + if (!folder_made(path)) + { + platform_log("map downloads: the folder %s cannot be made", path); + return 0; + } + snprintf(path + length, (size_t)size - length, PATH_SEPARATOR); + return 1; +} + +/* custom_maps\downloads (made if missing), with its separator */ +static int downloads_folder(char *path, int size) +{ + size_t length; + + if (!custom_maps_folder(path, size)) + return 0; + length = strlen(path); + snprintf(path + length, (size_t)size - length, "%s", DOWNLOADS_FOLDER); + if (!folder_made(path)) + { + platform_log("map downloads: the folder %s cannot be made", path); + return 0; + } + length = strlen(path); + snprintf(path + length, (size_t)size - length, PATH_SEPARATOR); + return 1; +} + +/* the map's file name from its level name: custom_maps\ (or the +file's name alone) is .map; "" for any other (the game's own maps) */ +static void level_file_name(const char *level_name, char *file_name, int size) +{ + const char *file = level_name; + size_t prefix = strlen(LEVEL_NAME_PREFIX); + + if (!strncmp(level_name, LEVEL_NAME_PREFIX, prefix) || !strncmp(level_name, "custom_maps/", prefix)) + file = level_name + prefix; + else if (strpbrk(level_name, "\\/:")) + file = ""; + /* (a name with no folder, as the folders' files have) */ + if (!file[0] || strpbrk(file, "\\/:*?") || file[0] == '.' || + strlen(file) + strlen(MAP_FILE_EXTENSION) >= NAME_SIZE) + { + file_name[0] = 0; + return; + } + snprintf(file_name, (size_t)size, "%s" MAP_FILE_EXTENSION, file); +} + +/* whether a resource map is in a Custom Edition maps folder (custom_maps, +then a Custom Edition install's) */ +static int resource_map_present(const char *file_name) +{ + static const char *const folders[] = { CUSTOM_MAPS_XBOX_PATH, INSTALL_MAPS_XBOX_PATH }; + char xbox_path[256]; + char path[1024]; + int folder; + + for (folder = 0; folder < (int)(sizeof(folders) / sizeof(folders[0])); folder++) + { + /* (a Custom Edition install's folder only when paths.custom_edition names one) */ + if (folder == 1 && !config_string("paths.custom_edition")[0]) + continue; + snprintf(xbox_path, sizeof(xbox_path), "%s%s", folders[folder], file_name); + platform_translate_path(xbox_path, path, sizeof(path)); + if (file_present(path)) + return 1; + } + return 0; +} + +static int resource_map_name(const char *file_name) +{ + return same_name(file_name, "bitmaps.map") || same_name(file_name, "sounds.map") || same_name(file_name, "loc.map"); +} + +/* ---------- downloading */ + +/* how a file of a fetch is coming */ +enum +{ + /* waiting for the archives (one file at a time) */ + _fetch_waiting, + /* from an archive or a web seed (map_archives.c) */ + _fetch_running, +}; + +static struct +{ + int active; + char level_name[NAME_SIZE]; + unsigned long version; + struct + { + char name[NAME_SIZE]; + int done; + int phase; + const struct index_entry *entry; + /* where it is downloaded (custom_maps\downloads) */ + char path[1200]; + } files[FETCH_MAXIMUM_FILES]; + int count; + unsigned long started; + int ready; + char failure[192]; + unsigned long failed_time; +} fetch; + +static void fetch_stop(void) +{ + int which; + + for (which = 0; which < fetch.count; which++) + { + if (!fetch.files[which].done && fetch.files[which].phase == _fetch_running) + map_archives_stop(); + } + fetch.active = 0; + fetch.count = 0; +} + +static void fetch_fail(const char *name, const char *reason) +{ + snprintf(fetch.failure, sizeof(fetch.failure), "Could not download %s: %s", name, reason); + fetch.failed_time = GetTickCount() ? GetTickCount() : 1; + platform_log("map downloads: %s", fetch.failure); + fetch_stop(); +} + +int map_downloads_fetch(const char *level_name, unsigned long version, const char *files) +{ + char map_file[NAME_SIZE]; + char folder[1024]; + const char *text = files; + int count = 0; + const struct index_entry *wanted[FETCH_MAXIMUM_FILES]; + int which; + + /* (none while Custom Edition maps cannot be played: game.custom_edition) */ + if (!config_boolean("maps.downloads") || !config_boolean("game.custom_edition") || !level_name || !files || + !files[0]) + { + return 0; + } + if (fetch.active) + { + if (same_name(fetch.level_name, level_name) && fetch.version == version) + return 1; + platform_log("map downloads: the download of %s's files gives way to %s's", fetch.level_name, level_name); + fetch_stop(); + } + level_file_name(level_name, map_file, sizeof(map_file)); + while (*text) + { + /* (tab-separated: some maps' names have commas, none a tab) */ + const char *tab = strchr(text, '\t'); + int length = tab ? (int)(tab - text) : (int)strlen(text); + char name[NAME_SIZE]; + unsigned long checksum; + + if (length > 0 && length < NAME_SIZE && count < FETCH_MAXIMUM_FILES) + { + memcpy(name, text, (size_t)length); + name[length] = 0; + /* (the map is the host's version; a resource map any) */ + checksum = same_name(name, map_file) ? version : 0; + wanted[count] = index_find_file(name, checksum); + if (!wanted[count]) + { + platform_log("map downloads: %s (checksum %08lX) is not in the index: not downloaded", name, checksum); + return 0; + } + /* (one no source this build fetches from has: not started) */ + if (!map_archives_available(maps_index.names + wanted[count]->sources)) + { + platform_log("map downloads: no source of maps.archives or maps.web_seeds has %s", name); + return 0; + } + count++; + } + text = tab ? tab + 1 : text + length; + } + if (!count || !downloads_folder(folder, sizeof(folder))) + return 0; + memset(&fetch, 0, sizeof(fetch)); + for (which = 0; which < count; which++) + { + const struct index_entry *entry = wanted[which]; + + snprintf(fetch.files[which].path, sizeof(fetch.files[which].path), "%s%s", folder, + maps_index.names + entry->name); + snprintf(fetch.files[which].name, sizeof(fetch.files[which].name), "%s", maps_index.names + entry->name); + fetch.files[which].entry = entry; + fetch.files[which].phase = _fetch_waiting; + fetch.count++; + } + snprintf(fetch.level_name, sizeof(fetch.level_name), "%s", level_name); + fetch.version = version; + fetch.active = 1; + fetch.started = GetTickCount(); + platform_log("map downloads: downloading %d file(s) for %s: %s", count, level_name, files); + return 1; +} + +/* a file that arrived: into custom_maps, never in place of a file there. +A map as _.map, map sharing's name of its version, beside any +other version; a resource map under its name, when none is there yet */ +static int fetch_file_done(int which) +{ + char folder[1024]; + char destination[1200]; + const char *name = fetch.files[which].name; + size_t length = strlen(name); + + if (!custom_maps_folder(folder, sizeof(folder))) + return 0; + if (resource_map_name(name)) + { + snprintf(destination, sizeof(destination), "%s%s", folder, name); + } + else + { + char base[NAME_SIZE]; + char xbox_folder[64]; + char digits[NAME_DIGITS + 1]; + + if (length <= strlen(MAP_FILE_EXTENSION) || length >= sizeof(base)) + return 0; + snprintf(base, sizeof(base), "%.*s", (int)(length - strlen(MAP_FILE_EXTENSION)), name); + snprintf(xbox_folder, sizeof(xbox_folder), "%s%s\\", CUSTOM_MAPS_XBOX_PATH, DOWNLOADS_FOLDER); + if (!map_share_name_digits(xbox_folder, base, digits)) + { + platform_log("map downloads: %s could not be hashed for its name", name); + return 0; + } + snprintf(destination, sizeof(destination), "%s%s_%s" MAP_FILE_EXTENSION, folder, base, digits); + } + if (file_present(destination)) + { + /* (the same version: its name is its hash's, or a resource map + that came meanwhile) */ + platform_log("map downloads: %s is there already", destination); + unlink(fetch.files[which].path); + } + else if (!move_to_new_name(fetch.files[which].path, destination)) + { + platform_log("map downloads: %s could not be moved into %s", name, folder); + return 0; + } + fetch.files[which].done = 1; + platform_log("map downloads: %s is %s", name, destination); + return 1; +} + +static void fetch_poll(void) +{ + int which; + int done = 0; + + if (!fetch.active) + return; + for (which = 0; which < fetch.count; which++) + { + const struct index_entry *entry = fetch.files[which].entry; + unsigned long long received, total; + char archive[64]; + enum map_archives_state state; + + if (fetch.files[which].done) + { + done++; + continue; + } + if (fetch.files[which].phase == _fetch_waiting) + { + int other; + + /* (one at a time: the next file waits while another's fetch is + under way or its result not yet taken) */ + for (other = 0; other < fetch.count && (fetch.files[other].done || fetch.files[other].phase != _fetch_running); + other++) + { + } + if (other < fetch.count || + map_archives_poll(&received, &total, archive, sizeof(archive)) == _map_archives_running) + { + continue; + } + map_archives_stop(); + if (!map_archives_start(fetch.files[which].name, entry->size, entry->piece_length, entry->info_hash, + maps_index.names + entry->sources, fetch.files[which].path)) + { + fetch_fail(fetch.files[which].name, "it could not be started"); + return; + } + fetch.files[which].phase = _fetch_running; + continue; + } + state = map_archives_poll(&received, &total, archive, sizeof(archive)); + if (state == _map_archives_running) + continue; + map_archives_stop(); + if (state != _map_archives_done) + { + fetch_fail(fetch.files[which].name, "no archive or web seed gave it (debug.txt says why)"); + return; + } + if (!fetch_file_done(which)) + { + fetch_fail(fetch.files[which].name, "it could not be put in place"); + return; + } + done++; + } + if (done == fetch.count) + { + platform_log("map downloads: every file of %s is there (%lu s)", fetch.level_name, + (GetTickCount() - fetch.started) / 1000); + fetch.active = 0; + fetch.ready = 1; + } +} + +static void size_text(unsigned long long bytes, char *text, int size) +{ + if (bytes >= 100ULL << 20) + snprintf(text, (size_t)size, "%llu MB", bytes >> 20); + else if (bytes >= 1ULL << 20) + snprintf(text, (size_t)size, "%.1f MB", (double)bytes / (double)(1 << 20)); + else + snprintf(text, (size_t)size, "%llu KB", bytes >> 10); +} + +int map_downloads_fetching(char *status, int size) +{ + int which; + + if (fetch.active) + { + for (which = 0; which < fetch.count; which++) + { + unsigned long long received, total; + char archive[64]; + char which_text[24] = ""; + char have[32], all[32]; + + if (fetch.files[which].done || fetch.files[which].phase != _fetch_running) + continue; + if (fetch.count > 1) + snprintf(which_text, sizeof(which_text), " (%d of %d)", which + 1, fetch.count); + map_archives_poll(&received, &total, archive, sizeof(archive)); + size_text(received, have, sizeof(have)); + size_text(total, all, sizeof(all)); + if (total) + { + snprintf(status, (size_t)size, "Downloading %s%s from %s: %s of %s", fetch.files[which].name, + which_text, archive, have, all); + } + else + { + snprintf(status, (size_t)size, "Downloading %s%s from %s", fetch.files[which].name, which_text, + archive); + } + return 1; + } + snprintf(status, (size_t)size, "Downloading..."); + return 1; + } + if (fetch.failed_time && GetTickCount() - fetch.failed_time < FAILURE_SHOWN_MILLISECONDS) + { + snprintf(status, (size_t)size, "%s", fetch.failure); + return 1; + } + return 0; +} + +int map_downloads_progress(float *fraction, char *name, int size) +{ + float done = 0.0f; + int which; + + if (!fetch.active) + return 0; + /* (each file an equal share: the size of one not begun is not known) */ + for (which = 0; which < fetch.count; which++) + { + if (fetch.files[which].done) + { + done += 1.0f; + } + else if (fetch.files[which].phase == _fetch_running) + { + unsigned long long received, total; + char archive[64]; + + map_archives_poll(&received, &total, archive, sizeof(archive)); + if (total) + done += (float)((double)received / (double)total); + } + } + *fraction = fetch.count ? done / (float)fetch.count : 0.0f; + /* (the map's name: its file's, the fetch's first, without .map) */ + snprintf(name, (size_t)size, "%.*s", (int)(strlen(fetch.files[0].name) > strlen(MAP_FILE_EXTENSION) ? + strlen(fetch.files[0].name) - strlen(MAP_FILE_EXTENSION) : strlen(fetch.files[0].name)), fetch.files[0].name); + return 1; +} + +int map_downloads_take_ready(char *level_name, int size) +{ + if (!fetch.ready) + return 0; + fetch.ready = 0; + snprintf(level_name, (size_t)size, "%s", fetch.level_name); + return 1; +} + +void map_downloads_cancel(void) +{ + if (fetch.active) + { + platform_log("map downloads: the download of %s's files is stopped", fetch.level_name); + fetch_stop(); + } + fetch.ready = 0; +} + +void map_downloads_poll(void) +{ + fetch_poll(); +} diff --git a/port/linux/src/map_downloads.h b/port/linux/src/map_downloads.h new file mode 100644 index 0000000000..05ccd68782 --- /dev/null +++ b/port/linux/src/map_downloads.h @@ -0,0 +1,43 @@ +/* +MAP_DOWNLOADS.H + +Custom Edition maps downloaded from where the community keeps them +(map_downloads.c): a map a machine lacks when joining a game whose host does +not send it (map sharing, port/linux/game/map_share.c: a host of another +build, or one that does not share) comes from HaloNet's or HaloMaps's +archives or a web seed, as the index of the maps +(maps.index, port/assets/network/map_index.txt) names it, checked against +the index's hash. + +Only integers and strings cross here: the game's units call these. +*/ + +#ifndef __HALO_LINUX_MAP_DOWNLOADS_H +#define __HALO_LINUX_MAP_DOWNLOADS_H + +/* every frame, on the game's thread, a window or not (main.c's loop) */ +void map_downloads_poll(void); + +/* the files a joining machine lacks for the host's map: level_name the +map's (custom_maps\, or custom_maps\_), version its +header checksum as the host sent it (0: any), files their names, +tab-separated (".map\tbitmaps.map"; custom_edition_cache_files_missing). +Starts downloading them, if the index has them all and maps.downloads is on: +returns 1, and the join is to be tried again once map_downloads_take_ready +says they are there. 0 when nothing was started */ +int map_downloads_fetch(const char *level_name, unsigned long version, const char *files); +/* what the download is doing, for the menus' status line: 1 and the text +while one is under way (or just failed), else 0 */ +int map_downloads_fetching(char *status, int size); +/* how a download under way goes, for the screen it shows over the menus +(port/linux/game/download_screen.c): 1 while one is, with its share done (0 +to 1; 0 while its size is not known yet) and the map's name (its file's, +without .map), else 0 */ +int map_downloads_progress(float *fraction, char *name, int size); +/* once, when a download's files are all in place: 1 and the level name +whose join is to be tried again */ +int map_downloads_take_ready(char *level_name, int size); +/* stops a download */ +void map_downloads_cancel(void); + +#endif diff --git a/port/linux/src/map_sha1.c b/port/linux/src/map_sha1.c new file mode 100644 index 0000000000..960b7e2999 --- /dev/null +++ b/port/linux/src/map_sha1.c @@ -0,0 +1,140 @@ +/* +MAP_SHA1.C + +SHA-1 (map_sha1.h), the straightforward way: a block at a time, with +the words of each block read big-endian, as the standard writes them. +*/ + +#include "map_sha1.h" + +#include + +#define ROTATE_LEFT(value, bits) ((((value) << (bits)) | ((value) >> (32 - (bits)))) & 0xFFFFFFFFUL) + +static void sha1_block(struct sha1_state *state, const unsigned char *block) +{ + unsigned long words[80]; + unsigned long a = state->state[0], b = state->state[1], c = state->state[2], d = state->state[3], + e = state->state[4]; + int index; + + for (index = 0; index < 16; index++) + { + words[index] = (unsigned long)block[index * 4] << 24 | (unsigned long)block[index * 4 + 1] << 16 | + (unsigned long)block[index * 4 + 2] << 8 | (unsigned long)block[index * 4 + 3]; + } + for (; index < 80; index++) + { + words[index] = ROTATE_LEFT(words[index - 3] ^ words[index - 8] ^ words[index - 14] ^ words[index - 16], 1); + } + for (index = 0; index < 80; index++) + { + unsigned long f, k, temporary; + + if (index < 20) + { + f = (b & c) | (~b & d); + k = 0x5A827999UL; + } + else if (index < 40) + { + f = b ^ c ^ d; + k = 0x6ED9EBA1UL; + } + else if (index < 60) + { + f = (b & c) | (b & d) | (c & d); + k = 0x8F1BBCDCUL; + } + else + { + f = b ^ c ^ d; + k = 0xCA62C1D6UL; + } + temporary = (ROTATE_LEFT(a, 5) + (f & 0xFFFFFFFFUL) + e + k + words[index]) & 0xFFFFFFFFUL; + e = d; + d = c; + c = ROTATE_LEFT(b, 30); + b = a; + a = temporary; + } + state->state[0] = (state->state[0] + a) & 0xFFFFFFFFUL; + state->state[1] = (state->state[1] + b) & 0xFFFFFFFFUL; + state->state[2] = (state->state[2] + c) & 0xFFFFFFFFUL; + state->state[3] = (state->state[3] + d) & 0xFFFFFFFFUL; + state->state[4] = (state->state[4] + e) & 0xFFFFFFFFUL; +} + +void sha1_start(struct sha1_state *state) +{ + state->state[0] = 0x67452301UL; + state->state[1] = 0xEFCDAB89UL; + state->state[2] = 0x98BADCFEUL; + state->state[3] = 0x10325476UL; + state->state[4] = 0xC3D2E1F0UL; + state->length = 0; + state->buffered = 0; +} + +void sha1_update(struct sha1_state *state, const void *bytes, unsigned long size) +{ + const unsigned char *input = bytes; + + state->length += size; + if (state->buffered) + { + unsigned long take = 64 - (unsigned long)state->buffered; + + if (take > size) + take = size; + memcpy(state->buffer + state->buffered, input, take); + state->buffered += (int)take; + input += take; + size -= take; + if (state->buffered < 64) + return; + sha1_block(state, state->buffer); + state->buffered = 0; + } + while (size >= 64) + { + sha1_block(state, input); + input += 64; + size -= 64; + } + if (size) + { + memcpy(state->buffer, input, size); + state->buffered = (int)size; + } +} + +void sha1_finish(struct sha1_state *state, unsigned char digest[SHA1_DIGEST_SIZE]) +{ + unsigned long long bits = state->length * 8; + unsigned char padding[72]; + int padding_size = (state->buffered < 56 ? 56 : 120) - state->buffered; + int index; + + memset(padding, 0, sizeof(padding)); + padding[0] = 0x80; + for (index = 0; index < 8; index++) + padding[padding_size + index] = (unsigned char)(bits >> (56 - index * 8)); + sha1_update(state, padding, (unsigned long)(padding_size + 8)); + for (index = 0; index < 5; index++) + { + digest[index * 4] = (unsigned char)(state->state[index] >> 24); + digest[index * 4 + 1] = (unsigned char)(state->state[index] >> 16); + digest[index * 4 + 2] = (unsigned char)(state->state[index] >> 8); + digest[index * 4 + 3] = (unsigned char)state->state[index]; + } +} + +void sha1_bytes(const void *bytes, unsigned long size, unsigned char digest[SHA1_DIGEST_SIZE]) +{ + struct sha1_state state; + + sha1_start(&state); + sha1_update(&state, bytes, size); + sha1_finish(&state, digest); +} diff --git a/port/linux/src/map_sha1.h b/port/linux/src/map_sha1.h new file mode 100644 index 0000000000..3eb55bdd1c --- /dev/null +++ b/port/linux/src/map_sha1.h @@ -0,0 +1,30 @@ +/* +MAP_SHA1.H + +SHA-1 (FIPS 180-4), which a map's BitTorrent info hash is made with: the +index of the maps (port/assets/network/map_index.txt) names each map by it, +and a map downloaded is checked against it (map_archives.c). Not a +cryptographic use: the hashes are checked against those the index's maker +computed, and the index ships with the game. +*/ + +#ifndef __HALO_LINUX_MAP_SHA1_H +#define __HALO_LINUX_MAP_SHA1_H + +#define SHA1_DIGEST_SIZE 20 + +struct sha1_state +{ + unsigned long state[5]; + unsigned long long length; + unsigned char buffer[64]; + int buffered; +}; + +void sha1_start(struct sha1_state *state); +void sha1_update(struct sha1_state *state, const void *bytes, unsigned long size); +void sha1_finish(struct sha1_state *state, unsigned char digest[SHA1_DIGEST_SIZE]); +/* the digest of one buffer */ +void sha1_bytes(const void *bytes, unsigned long size, unsigned char digest[SHA1_DIGEST_SIZE]); + +#endif diff --git a/port/linux/src/port_config.c b/port/linux/src/port_config.c index 94e390a5df..dfb454b2c2 100644 --- a/port/linux/src/port_config.c +++ b/port/linux/src/port_config.c @@ -419,6 +419,33 @@ static const struct config_setting config_settings[] = "download it (and the resource maps it needs) from the game's players\n" "into custom_maps, if its host shares it (network.map_share); false\n" "leaves the game, saying which map is missing." }, + { "maps.downloads", _config_boolean, "true", "HALO_MAP_DOWNLOADS", _environment_value, _platform_all, + "Download a Custom Edition map this machine lacks when joining a game\n" + "whose host does not send it (a host of another build, or one that\n" + "does not share: network.map_share), from the community's map\n" + "archives (archives, web_seeds), when the index of the maps (index)\n" + "has it; false never downloads from them." }, + { "maps.download_screen", _config_boolean, "true", "HALO_MAP_DOWNLOAD_SCREEN", _environment_value, + _platform_all, + "While a map downloads before its game is joined, show Halo's loading\n" + "screen over the menus, its light sweeping across as the map comes (B\n" + "stops the download); false leaves the menus up, their status line\n" + "saying how the download goes." }, + { "maps.archives", _config_string, "\"halonet,halomaps\"", "HALO_MAP_ARCHIVES", _environment_value, + _platform_desktop, + "The community's map archives a missing map is taken from, out of the\n" + "zip that holds it, in this order (comma-separated): halonet\n" + "(maps.halonet.net), halomaps (halomaps.org); then the web seeds.\n" + "Each map is checked against the index's hash before it is used." }, + { "maps.web_seeds", _config_string, "\"https://halomaps.fractumseraph.net/maps/\"", "HALO_MAP_WEB_SEEDS", + _environment_value, _platform_desktop, + "Comma-separated https:// folders holding every map of the index under\n" + "its file name (the maps' seed boxes), tried after the archives; empty\n" + "for none (docs/map_downloads.md)." }, + { "maps.index", _config_string, "\"map_index.txt\"", "HALO_MAP_INDEX", _environment_value, _platform_all, + "The index of the maps (tools/map_index.py), beside this file unless\n" + "a full path: port/assets/network/map_index.txt, which the builds put\n" + "there." }, { "network.coop_public", _config_boolean, "false", "HALO_NET_COOP_PUBLIC", _environment_value, _platform_all, "Whether an online co-op game (Create Game > Internet, a SINGLEPLAYER\n" "map) starts as PUBLIC or, false, PRIVATE: Server Setup's LISTING in\n" diff --git a/port/linux/src/posix_update.c b/port/linux/src/posix_update.c index ca411c8ed2..55ba3137bb 100644 --- a/port/linux/src/posix_update.c +++ b/port/linux/src/posix_update.c @@ -52,6 +52,11 @@ static const char *const certificate_bundles[] = }; static pthread_once_t certificates_once = PTHREAD_ONCE_INIT; +/* one request at a time: the self-updater's thread and the map archives' +(map_archives.c) both ask, and Mbed TLS is built without its threading +support (its PSA crypto, and https_get's one connection, are for one thread +at a time) */ +static pthread_mutex_t request_lock = PTHREAD_MUTEX_INITIALIZER; static mbedtls_x509_crt certificates; static int certificates_loaded; static int crypto_ready; @@ -312,14 +317,17 @@ struct download update_progress_proc progress; void *context; unsigned long long received, total; + /* (update_request's: the download stops once it is not 0) */ + const volatile int *stop; }; -/* (a release is tens of megabytes: a body past this fills no disk) */ -#define MAXIMUM_DOWNLOAD_SIZE (512ull * 1024 * 1024) +/* (a release is tens of megabytes, and the largest map of the index (a web +seed's file, map_archives.c) about 760: a body past this fills no disk) */ +#define MAXIMUM_DOWNLOAD_SIZE (1024ull * 1024 * 1024) static int body_write(struct download *download, const unsigned char *data, size_t size) { - if (download->received + size > MAXIMUM_DOWNLOAD_SIZE) + if (download->received + size > MAXIMUM_DOWNLOAD_SIZE || (download->stop && *download->stop)) return 0; if (fwrite(data, 1, size, download->file) != size) return 0; @@ -391,10 +399,10 @@ static int read_body(struct connection *connection, struct download *download, i } } -/* one GET: the body into download on 200, the Location on a redirect; -the status, or 0 on failure */ -static int https_get(const char *url, struct download *download, char *location, size_t location_size, char *error, - int error_size) +/* one GET (or a POST of form): the body into download on 200, the Location +on a redirect; the status, or 0 on failure */ +static int https_get(const char *url, const char *form, const char *agent, struct download *download, char *location, + size_t location_size, char *error, int error_size) { static struct connection connection; char host[256], port[16], path[2048]; @@ -413,10 +421,25 @@ static int https_get(const char *url, struct download *download, char *location, connection_free(&connection); return 0; } - snprintf(request, sizeof(request), - "GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: " UPDATE_USER_AGENT "\r\n" - "Accept: */*\r\nConnection: close\r\n\r\n", - path, host); + if (form) + { + snprintf(request, sizeof(request), + "POST %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nAccept: */*\r\nConnection: close\r\n" + "Content-Type: application/x-www-form-urlencoded\r\nContent-Length: %lu\r\n\r\n%s", + path, host, agent, (unsigned long)strlen(form), form); + } + else + { + snprintf(request, sizeof(request), + "GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nAccept: */*\r\nConnection: close\r\n\r\n", + path, host, agent); + } + if (strlen(request) >= sizeof(request) - 1) + { + snprintf(error, (size_t)error_size, "the request to %s is too long", host); + connection_free(&connection); + return 0; + } if (!connection_write(&connection, request, strlen(request)) || !connection_read_line(&connection, line, sizeof(line)) || sscanf(line, "HTTP/%*d.%*d %d", &status) != 1) @@ -479,6 +502,26 @@ static int https_get(const char *url, struct download *download, char *location, int update_download(const char *url, const char *path, update_progress_proc progress, void *context, char *error, int error_size) +{ + return update_request(url, NULL, NULL, NULL, path, progress, context, error, error_size); +} + +static int request_locked(const char *url, const char *form, const char *agent, const volatile int *stop, + const char *path, update_progress_proc progress, void *context, char *error, int error_size); + +int update_request(const char *url, const char *form, const char *agent, const volatile int *stop, + const char *path, update_progress_proc progress, void *context, char *error, int error_size) +{ + int result; + + pthread_mutex_lock(&request_lock); + result = request_locked(url, form, agent, stop, path, progress, context, error, error_size); + pthread_mutex_unlock(&request_lock); + return result; +} + +static int request_locked(const char *url, const char *form, const char *agent, const volatile int *stop, + const char *path, update_progress_proc progress, void *context, char *error, int error_size) { char current[2048]; char location[2048]; @@ -500,6 +543,7 @@ int update_download(const char *url, const char *path, update_progress_proc prog memset(&download, 0, sizeof(download)); download.progress = progress; download.context = context; + download.stop = stop; download.file = fopen(path, "wb"); if (!download.file) { @@ -509,7 +553,8 @@ int update_download(const char *url, const char *path, update_progress_proc prog snprintf(current, sizeof(current), "%s", url); for (redirect = 0; redirect <= MAXIMUM_REDIRECTS; redirect++) { - int status = https_get(current, &download, location, sizeof(location), error, error_size); + int status = https_get(current, form, agent ? agent : UPDATE_USER_AGENT, &download, location, + sizeof(location), error, error_size); if (status == 200) { @@ -535,6 +580,8 @@ int update_download(const char *url, const char *path, update_progress_proc prog { snprintf(current, sizeof(current), "%s", location); } + /* (what a form's answer redirects to is fetched) */ + form = NULL; continue; } if (status) diff --git a/port/linux/src/update.h b/port/linux/src/update.h index 1a479499a6..93550a6c58 100644 --- a/port/linux/src/update.h +++ b/port/linux/src/update.h @@ -3,7 +3,8 @@ UPDATE.H What the desktop self-updater (updater.c) needs of the system: a download over HTTPS, and putting files in place of the running game's and starting -it again. posix_update.c does it on Linux (Mbed TLS, the system's +it again. The map archives (map_archives.c) download over HTTPS with it +too. posix_update.c does it on Linux (Mbed TLS, the system's certificate authorities), win32_update.c on Windows (WinHTTP). The Android app updates itself in Java (port/android). @@ -23,6 +24,13 @@ error */ int update_download(const char *url, const char *path, update_progress_proc progress, void *context, char *error, int error_size); +/* update_download's request with more of it given: form, when not NULL, is +POSTed (application/x-www-form-urlencoded, a redirect after it followed with +a GET); agent, when not NULL, is the User-Agent; and the download stops, +failing, once *stop (when stop is not NULL) is not 0 */ +int update_request(const char *url, const char *form, const char *agent, const volatile int *stop, + const char *path, update_progress_proc progress, void *context, char *error, int error_size); + /* the full path of this executable; 1 on success */ int update_executable_path(char *path, int size); diff --git a/port/web/src/web_map_downloads.c b/port/web/src/web_map_downloads.c new file mode 100644 index 0000000000..65e028b255 --- /dev/null +++ b/port/web/src/web_map_downloads.c @@ -0,0 +1,46 @@ +/* Custom Edition maps downloaded from the community's archives + * (port/linux/src/map_downloads.h) for the web build: there are none. The + * page fetches what it plays itself, and has no HTTPS download of the + * platform layer's (update.h), so map_downloads.c and map_archives*.c are + * left out of the build (tools/web_build.py, WEB_EXCLUDE). These stand in for + * the game's calls: nothing is downloaded, as with maps.downloads off. */ + +#include "map_downloads.h" + +void map_downloads_poll(void) +{ +} + +int map_downloads_fetch(const char *level_name, unsigned long version, const char *files) +{ + (void)level_name; + (void)version; + (void)files; + return 0; +} + +int map_downloads_fetching(char *status, int size) +{ + (void)status; + (void)size; + return 0; +} + +int map_downloads_progress(float *fraction, char *name, int size) +{ + (void)fraction; + (void)name; + (void)size; + return 0; +} + +int map_downloads_take_ready(char *level_name, int size) +{ + (void)level_name; + (void)size; + return 0; +} + +void map_downloads_cancel(void) +{ +} diff --git a/port/windows/src/win32_update.c b/port/windows/src/win32_update.c index b245830dee..673553ba95 100644 --- a/port/windows/src/win32_update.c +++ b/port/windows/src/win32_update.c @@ -20,6 +20,9 @@ Paths are UTF-8, as SDL gives them. #define UPDATE_USER_AGENT L"halo-ce-universal-updater" #define TIMEOUT_MILLISECONDS 20000 +/* (posix_update.c's: a release is tens of megabytes, and the largest map of +the index about 760: a body past this fills no disk) */ +#define MAXIMUM_DOWNLOAD_SIZE (1024ull * 1024 * 1024) /* (WinHTTP's TLS 1.3 flag, missing from older SDKs) */ #ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3 @@ -42,7 +45,13 @@ static void set_error(char *error, int error_size, const char *what) int update_download(const char *url, const char *path, update_progress_proc progress, void *context, char *error, int error_size) { - wchar_t wide_url[2048], wide_path[MAX_PATH * 2], host[256], url_path[2048]; + return update_request(url, NULL, NULL, NULL, path, progress, context, error, error_size); +} + +int update_request(const char *url, const char *form, const char *agent, const volatile int *stop, + const char *path, update_progress_proc progress, void *context, char *error, int error_size) +{ + wchar_t wide_url[2048], wide_path[MAX_PATH * 2], host[256], url_path[2048], wide_agent[256]; URL_COMPONENTS components; HINTERNET session = NULL, connection = NULL, request = NULL; HANDLE file = INVALID_HANDLE_VALUE; @@ -68,7 +77,9 @@ int update_download(const char *url, const char *path, update_progress_proc prog snprintf(error, (size_t)error_size, "not an https:// address: %s", url); return 0; } - session = WinHttpOpen(UPDATE_USER_AGENT, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, + if (!agent || !wide_from_utf8(agent, wide_agent, 256)) + wcscpy(wide_agent, UPDATE_USER_AGENT); + session = WinHttpOpen(wide_agent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (!session) { @@ -87,10 +98,16 @@ int update_download(const char *url, const char *path, update_progress_proc prog connection = WinHttpConnect(session, host, components.nPort, 0); if (connection) { - request = WinHttpOpenRequest(connection, L"GET", url_path, NULL, WINHTTP_NO_REFERER, + request = WinHttpOpenRequest(connection, form ? L"POST" : L"GET", url_path, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); } - if (!request || !WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0) || + /* (a form's answer, redirected, is fetched with a GET: WinHTTP's own + redirect policy) */ + if (!request || + !WinHttpSendRequest(request, + form ? L"Content-Type: application/x-www-form-urlencoded\r\n" : WINHTTP_NO_ADDITIONAL_HEADERS, + form ? (DWORD)-1L : 0, form ? (LPVOID)form : WINHTTP_NO_REQUEST_DATA, form ? (DWORD)strlen(form) : 0, + form ? (DWORD)strlen(form) : 0, 0) || !WinHttpReceiveResponse(request, NULL)) { set_error(error, error_size, "could not reach the server"); @@ -118,6 +135,11 @@ int update_download(const char *url, const char *path, update_progress_proc prog char buffer[16384]; DWORD count = 0, written = 0; + if (stop && *stop) + { + snprintf(error, (size_t)error_size, "stopped"); + goto done; + } if (!WinHttpReadData(request, buffer, sizeof(buffer), &count)) { set_error(error, error_size, "the download broke off"); @@ -131,6 +153,11 @@ int update_download(const char *url, const char *path, update_progress_proc prog goto done; } received += count; + if (received > MAXIMUM_DOWNLOAD_SIZE) + { + snprintf(error, (size_t)error_size, "the download is too large"); + goto done; + } if (progress) progress(context, received, length); } diff --git a/source/cache/cache_files.c b/source/cache/cache_files.c index 134890bb75..7ce97d8d6c 100644 --- a/source/cache/cache_files.c +++ b/source/cache/cache_files.c @@ -1081,11 +1081,24 @@ boolean cache_files_map_present( return TRUE; if (custom_edition_level_name(map_name)) { + char files[256]; + if (custom_edition_cache_present(map_name, version, message, sizeof(message)) || map_share_download_begin(map_name, version, message)) { return TRUE; } + /* port: a map the host does not send (it is not named for its hash: + a host of another build) downloaded from the community's archives, + if the index of the maps has it (port/linux/src/map_downloads.c): the + player told to join again once it is there */ + if (custom_edition_cache_files_missing(map_name, version, files, sizeof(files)) > 0 && + map_downloads_fetch(map_name, version, files)) + { + snprintf(message, sizeof(message), + "The host's map %.64s is being downloaded from the map archives (Join Game shows how it goes). Join " + "again when it is there.", name); + } } else { diff --git a/source/interface/ui_widget.c b/source/interface/ui_widget.c index 33d925152f..7afc44f5e2 100644 --- a/source/interface/ui_widget.c +++ b/source/interface/ui_widget.c @@ -679,6 +679,10 @@ struct widget_instance; #include "text/text_group.h" #include "text/unicode.h" #include "ui_widget.h" +/* port: a map's download screen over the menus (port/linux/game/download_screen.c) */ +boolean download_screen_active(void); +void download_screen_process(void); +void download_screen_render(void); /* ---------- constants */ @@ -6798,7 +6802,9 @@ static void ui_widgets_process_mouse( if (ui_debug_targets_enabled()) ui_debug_log_keyboard_tap(pointer.click_x, pointer.click_y, hit); } - if (!pointer_active || keyboard_active) + if (!pointer_active || keyboard_active + /* port: (nor under a map's download screen, which hides the menus) */ + || download_screen_active()) { ui_mouse_press_count = 0; ui_mouse_hover_pending = FALSE; @@ -7418,6 +7424,9 @@ void render_ui_widgets( { virtual_keyboard_render(); } + /* port: a map's download screen, over the menus */ + if (first_players_render) + download_screen_render(); ui_debug_draw_targets(first_players_render); return; @@ -8486,7 +8495,13 @@ void process_ui_widgets( return; } - if (attract_mode_should_start()) + /* port: a map's download screen over the menus + (port/linux/game/download_screen.c): the menus go on behind it, so that + the join waiting for the map follows, but its presses are its own, and + the attract mode does not start while it is up */ + if (download_screen_active()) + download_screen_process(); + else if (attract_mode_should_start()) { attract_mode_start(); diff --git a/source/interface/ui_widget_event_handler_functions.c b/source/interface/ui_widget_event_handler_functions.c index 252c4a4563..fb98fd6459 100644 --- a/source/interface/ui_widget_event_handler_functions.c +++ b/source/interface/ui_widget_event_handler_functions.c @@ -6121,6 +6121,11 @@ boolean ui_widget_port_browse( return global_network_game_client_get() || network_game_server_list_initialize(widget, event, widget_deleted); } +/* port: whether the advertised game's Custom Edition map is being +downloaded first (port/linux/game/menu_functions.c), the join to wait */ +boolean ui_widget_port_join_map_fetch( + void *advertised_game); + /* joining a found game (as network_game_join_game_from_server_list), then the lobby (by name) in place of the widget's screen */ boolean ui_widget_port_join( @@ -6147,6 +6152,12 @@ boolean ui_widget_port_join( { return FALSE; } + /* port: a Custom Edition map this machine lacks (or has another version + of), under a name map sharing does not download, is downloaded first from + the community's archives (port/linux/game/menu_functions.c, + port/linux/src/map_downloads.c): the join is tried again once it is there */ + if (ui_widget_port_join_map_fetch(server)) + return FALSE; transport_client_start(server + 0x18, server + 8, server, 0x141E, &address); if (!address.address.long_words[0] || !address.port) { diff --git a/source/main/main.c b/source/main/main.c index 9af8e6a87d..428fa9a393 100644 --- a/source/main/main.c +++ b/source/main/main.c @@ -3522,6 +3522,9 @@ static boolean main_loop_iteration( network_voice_update(); /* port: map sharing, in the lobby and in game (port/linux/game/map_share.c) */ map_share_update(); + /* port: Custom Edition maps downloaded from the community's archives, + in the menus too (port/linux/src/map_downloads.c) */ + map_downloads_poll(); profile_scope_enter(main_network_start_frame_section) connection = main_globals.connection; if (connection==_game_connection_network_client) diff --git a/source/networking/network_client_manager.c b/source/networking/network_client_manager.c index e959778f1b..e144b78e3b 100644 --- a/source/networking/network_client_manager.c +++ b/source/networking/network_client_manager.c @@ -902,6 +902,9 @@ void network_game_client_dispose( { if (client) { + /* port: the map played again the one of its name, not the host's + version beside it (port/linux/game/custom_edition_cache.c) */ + custom_edition_map_version_forget(); if (client->connection) network_connection_delete(client->connection); diff --git a/tools/ci_build.py b/tools/ci_build.py index cae5ec7148..6c45c9578e 100644 --- a/tools/ci_build.py +++ b/tools/ci_build.py @@ -144,6 +144,10 @@ def main() -> int: # Android's APK has its own copy) if args.platform != "android": shutil.copy2(ROOT / "port/assets/network/brokers.txt", dist / "brokers.txt") + # the index of the Custom Edition maps, likewise (maps.index; the web's + # page fetches what it plays itself) + if args.platform != "web": + shutil.copy2(ROOT / "port/assets/network/map_index.txt", dist / "map_index.txt") return 0 diff --git a/tools/linux_build.py b/tools/linux_build.py index 19892f1a52..5c0b98f868 100644 --- a/tools/linux_build.py +++ b/tools/linux_build.py @@ -48,6 +48,12 @@ def game_defines_and_includes(config: Dict[str, Any]) -> str: ) +# the platform layer's units the map downloads' file handling is built with +# alone (tools/map_download_check.c): the map archives' zips and the hash +# check, and the files they use +MAP_DOWNLOAD_CHECK_PLATFORM_SOURCES = ("map_archives_zip.c", "map_sha1.c", "posix_files.c") + + def compile_launcher(sln: Any) -> str: """what the native ports' compile commands start with: the --compiler-launcher (ccache, say) and a space, or nothing""" @@ -511,9 +517,11 @@ def generate_linux_build(n: Writer, sln: Any) -> None: libs = " ".join(f"-l{lib}" for lib in config.get("libraries", [])) def emit(obj_dir: Path, output: Path, extra_cflags: List[str], extra_ldflags: List[str], - implicit_inputs: List[Path], validator: Optional[Path] = None) -> None: + implicit_inputs: List[Path], validator: Optional[Path] = None, + map_download_check: Optional[Path] = None) -> None: """the objects and the executable, with the given extra flags (and - the tag validator alone, tools/map_validate.c, as validator)""" + the tag validator alone, tools/map_validate.c, as validator; the map + downloads' file handling alone, tools/map_download_check.c, as map_download_check)""" extra = " ".join(extra_cflags) # the posix_* units have glibc's 32-bit wchar_t, and LLVM will not # optimise them together with code that has a 16-bit one: they stay @@ -673,6 +681,43 @@ def add_object(source: Path, cflags: str, posix: bool = False) -> None: *extra_ldflags])}, ) + # the map downloads' zips and hash check (port/linux/src/map_archives_zip.c) + # alone, outside the game: the game's objects of them and of the + # platform layer's files, and a program that runs them + # (tools/map_download_check.c; tools/test_map_download_check.py) + if map_download_check is not None: + tool = Path("tools/map_download_check.c") + tool_object = obj_dir / tool.with_suffix(".o") + n.build( + outputs=tool_object, + rule="linux_cc", + inputs=tool, + implicit=[*xdk_headers(), prefix_header, platform_semantics_header, *sysroot_inputs], + variables={"cflags": f"{platform_cflags} {extra}"}, + ) + # (and stand-ins for the renderer, which the Xbox headers' inline + # functions in every platform unit refer to: tools/map_download_check_xbox.c) + stand_ins = Path("tools/map_download_check_xbox.c") + stand_ins_object = obj_dir / stand_ins.with_suffix(".o") + n.build( + outputs=stand_ins_object, + rule="linux_cc", + inputs=stand_ins, + implicit=sysroot_inputs, + variables={"cflags": f"{posix_cflags} {posix_extra}"}, + ) + tool_objects = [tool_object, stand_ins_object, + *(obj_dir / (platform_dir / name).with_suffix(".o") + for name in MAP_DOWNLOAD_CHECK_PLATFORM_SOURCES), + *(obj_dir / (ZLIB_DIR / name).with_suffix(".o") for name in ZLIB_SOURCES)] + n.build( + outputs=map_download_check, + rule="linux_tool_link", + inputs=tool_objects, + variables={"ldflags": " ".join(["--target=i686-linux-gnu", "-m32", "-no-pie", "-g", *sysroot_ldflags, + *extra_ldflags, "-lpthread"])}, + ) + # Profile-guided optimisation: with the committed profile, or with # --pgo=train one that an instrumented build records while playing # (tools/pgo_train.py). A profile is trained once: code changed since @@ -694,10 +739,14 @@ def add_object(source: Path, cflags: str, posix: bool = False) -> None: cflags, ldflags = lto_flags(sln, build_dir / "thinlto-cache") cflags += profile_use_flags(profile) validator = build_dir / "map_validate" - emit(obj_dir, output, cflags, ldflags, [profile] if profile else [], validator) + map_download_check = build_dir / "map_download_check" + emit(obj_dir, output, cflags, ldflags, [profile] if profile else [], validator, map_download_check) # internet play's MQTT brokers, a file beside the game (network.brokers_file) brokers = build_dir / "brokers.txt" n.build(outputs=brokers, rule="linux_copy", inputs=Path("port/assets/network/brokers.txt")) + # the index of the Custom Edition maps, a file beside the game (maps.index) + map_index = build_dir / "map_index.txt" + n.build(outputs=map_index, rule="linux_copy", inputs=Path("port/assets/network/map_index.txt")) n.build(outputs="linux", rule="phony", - inputs=[output, brokers, validator, *sdl_outputs]) + inputs=[output, brokers, map_index, validator, map_download_check, *sdl_outputs]) n.newline() diff --git a/tools/map_download_check.c b/tools/map_download_check.c new file mode 100644 index 0000000000..2c00084ef0 --- /dev/null +++ b/tools/map_download_check.c @@ -0,0 +1,68 @@ +/* +MAP_DOWNLOAD_CHECK.C + +A check of the map downloads' file handling (port/linux/src/map_archives_zip.c) +outside the game (tools/test_map_download_check.py): + + map_download_check unzip + map_download_check verify + +"unzip" takes a map out of a map archive's zip, as the game does after +fetching it; "verify" checks a file against the index's info hash, as the +game does before using it (map_archives_verify). + +Built with those units, the platform layer's POSIX files and this file's own +stand-in for the platform (platform_log): tools/linux_build.py. +*/ + +#include "platform.h" +#include "posix.h" +#include "map_archives.h" + +#include +#include +#include +#include + +/* the platform layer's, for the units */ +void platform_log(const char *format, ...) +{ + va_list arguments; + + va_start(arguments, format); + fprintf(stderr, "map_download_check: "); + vfprintf(stderr, format, arguments); + fprintf(stderr, "\n"); + va_end(arguments); +} + +int main(int argc, char **argv) +{ + char error[192]; + + if (argc == 6 && !strcmp(argv[1], "unzip")) + { + if (!map_archives_unzip(argv[2], argv[3], strtoull(argv[4], NULL, 10), argv[5], error, sizeof(error))) + { + printf("failed: %s\n", error); + return 1; + } + printf("unzipped\n"); + return 0; + } + if (argc == 7 && !strcmp(argv[1], "verify")) + { + if (!map_archives_verify(argv[2], argv[3], strtoull(argv[4], NULL, 10), strtoul(argv[5], NULL, 10), argv[6], + error, sizeof(error))) + { + printf("failed: %s\n", error); + return 1; + } + printf("verified\n"); + return 0; + } + fprintf(stderr, + "usage: map_download_check unzip \n" + " map_download_check verify \n"); + return 2; +} diff --git a/tools/map_download_check_xbox.c b/tools/map_download_check_xbox.c new file mode 100644 index 0000000000..ceb3dfe0d1 --- /dev/null +++ b/tools/map_download_check_xbox.c @@ -0,0 +1,48 @@ +/* +MAP_DOWNLOAD_CHECK_XBOX.C + +Stand-ins for tools/map_download_check.c's link (tools/linux_build.py). Every +platform unit carries the Xbox headers' D3DDevice_SetRenderState +(port/include/xdk/xdk_d3d8.h) as a weak inline function, which the map +downloads' units never call but which refers to the renderer's functions +and state table (port/linux/src/d3d8_gl.c). Without link-time optimisation, +which drops it, the tool links against these instead of the renderer. Built +with the platform layer's POSIX flags, so none of the headers' declarations +are seen; none of these is ever called. +*/ + +#define STAND_IN(name) void name(void) {} + +STAND_IN(D3DDevice_SetRenderState_BackFillMode) +STAND_IN(D3DDevice_SetRenderState_CullMode) +STAND_IN(D3DDevice_SetRenderState_Deferred) +STAND_IN(D3DDevice_SetRenderState_DoNotCullUncompressed) +STAND_IN(D3DDevice_SetRenderState_Dxt1NoiseEnable) +STAND_IN(D3DDevice_SetRenderState_EdgeAntiAlias) +STAND_IN(D3DDevice_SetRenderState_FillMode) +STAND_IN(D3DDevice_SetRenderState_FogColor) +STAND_IN(D3DDevice_SetRenderState_FrontFace) +STAND_IN(D3DDevice_SetRenderState_LineWidth) +STAND_IN(D3DDevice_SetRenderState_LogicOp) +STAND_IN(D3DDevice_SetRenderState_MultiSampleAntiAlias) +STAND_IN(D3DDevice_SetRenderState_MultiSampleMask) +STAND_IN(D3DDevice_SetRenderState_MultiSampleType) +STAND_IN(D3DDevice_SetRenderState_NormalizeNormals) +STAND_IN(D3DDevice_SetRenderState_OcclusionCullEnable) +STAND_IN(D3DDevice_SetRenderState_PSTextureModes) +STAND_IN(D3DDevice_SetRenderState_RopZCmpAlwaysRead) +STAND_IN(D3DDevice_SetRenderState_RopZRead) +STAND_IN(D3DDevice_SetRenderState_ShadowFunc) +STAND_IN(D3DDevice_SetRenderState_Simple) +STAND_IN(D3DDevice_SetRenderState_StencilCullEnable) +STAND_IN(D3DDevice_SetRenderState_StencilEnable) +STAND_IN(D3DDevice_SetRenderState_StencilFail) +STAND_IN(D3DDevice_SetRenderState_TextureFactor) +STAND_IN(D3DDevice_SetRenderState_TwoSidedLighting) +STAND_IN(D3DDevice_SetRenderState_VertexBlend) +STAND_IN(D3DDevice_SetRenderState_YuvEnable) +STAND_IN(D3DDevice_SetRenderState_ZBias) +STAND_IN(D3DDevice_SetRenderState_ZEnable) + +/* (the render states' table: D3DRS_MAX entries is far fewer than this) */ +unsigned long D3D__RenderState[1024]; diff --git a/tools/map_index.py b/tools/map_index.py new file mode 100644 index 0000000000..25a6fbb099 --- /dev/null +++ b/tools/map_index.py @@ -0,0 +1,585 @@ +#!/usr/bin/env python3 +"""The index of the Custom Edition maps (port/assets/network/map_index.txt), +which the game reads to download a map it lacks when joining a game on it +(port/linux/src/map_downloads.c), and the maps' torrents, which name them: +a map is checked against its torrent's info hash, and seed boxes seed the +torrents. + + python tools/map_index.py make --maps [--maps ...] + [--resource-maps ] --torrents [--index ] + +walks the folders, keeps every Halo Custom Edition cache (as the game +identifies one: cache_file_formats.c), writes a single-file v1 torrent for +each into the torrents folder, and writes (or merges into) the index. The +resource maps folder gives bitmaps.map, sounds.map and loc.map, which every +Custom Edition map needs, listed with a checksum of 0. + +A map is known by its file name and its header checksum (the game record's +map version a host sends), so two versions of a map with one name are two +entries. A second file of the same name and checksum is left out. The +torrents are trackerless: the game adds the trackers and web seeds of its +settings, which does not change an info hash, and a torrent a seed box is +given can have them added by any client. + +Each torrent's info dictionary is exactly {length, name, piece length, +pieces}, so a machine that has the file can make the torrent again from the +index line alone: the game checks a download that way (map_archives_verify, +port/linux/src/map_archives_zip.c), with no torrent file. + + python tools/map_index.py check --index [--torrents ] + +checks an index (and that each torrent file matches its line). + + python tools/map_index.py sources [--halonet ] [--halomaps ] + [--index ] + +notes, on each map's line, the community archives' zips that hold it, which +the game downloads a map from before its web seeds (port/linux/src/map_archives.c): +a column "halonet:" for each zip of HaloNet's repository +(https://maps.halonet.net/maps/; the folder holds copies of +them under those names) and "halomaps:" for each of HaloMaps's +(https://halomaps.org/hce/detail.cfm?fid=; the folder's copies are +named "-.zip"). A zip holds a map when one of its files +has the map's name (in any folder), size and header checksum. The archives +given have their columns made again; the others' are kept. + +The work of a run is remembered in /.map_torrents_cache.json by +path, size and modification time, so a rerun hashes only new files. +""" + +import argparse +import hashlib +import json +import os +import re +import struct +import sys +import time +import zipfile +from concurrent.futures import ProcessPoolExecutor +from pathlib import Path + +INDEX_FORMAT = "halo map index v1" +DEFAULT_INDEX = Path(__file__).resolve().parents[1] / "port/assets/network/map_index.txt" +RESOURCE_MAP_NAMES = ("bitmaps.map", "sounds.map", "loc.map") + +# cache_file_formats.c +HEADER_BYTES = 0x800 +HEADER_SIGNATURE = struct.unpack(">I", b"head")[0] +FOOTER_SIGNATURE = struct.unpack(">I", b"foot")[0] +OPENSAUCE_SIGNATURE = struct.unpack(">I", b"yelo")[0] +VERSION_CUSTOM_EDITION = 609 +VERSION_OFFSET = 0x04 +FILE_LENGTH_OFFSET = 0x08 +COMPRESSED_LENGTH_OFFSET = 0x0C +TAG_DATA_OFFSET_OFFSET = 0x10 +TAG_DATA_SIZE_OFFSET = 0x14 +NAME_OFFSET = 0x20 +BUILD_OFFSET = 0x40 +SCENARIO_TYPE_OFFSET = 0x60 +CHECKSUM_OFFSET = 0x64 +OPENSAUCE_OFFSET = 0x70 +OPENSAUCE_FLAGS_OFFSET = 0x06 +FOOTER_OFFSET = 0x7FC +STRING_BYTES = 32 +TAG_INDEX_BYTES = 0x28 +TAG_CACHE_BYTES = 0x01700000 +CACHE_FILE_MAXIMUM_BYTES = 0x30000000 + +READ_BYTES = 4 << 20 + + +class MapError(Exception): + pass + + +# ---------- identifying a map, as the game does + + +def read_u32(data, offset): + return struct.unpack_from(" CACHE_FILE_MAXIMUM_BYTES or file_length > size: + raise MapError(f"a bad file length ({file_length})") + tag_data_offset = read_u32(header, TAG_DATA_OFFSET_OFFSET) + tag_data_size = read_u32(header, TAG_DATA_SIZE_OFFSET) + if tag_data_offset < HEADER_BYTES or tag_data_size < TAG_INDEX_BYTES or tag_data_size > TAG_CACHE_BYTES or \ + tag_data_offset + tag_data_size > file_length: + raise MapError("a bad tag data range") + return { + "name": name, + "build": build, + "scenario_type": struct.unpack_from(" 1500: + length <<= 1 + return length + + +def hash_pieces(path, piece_length): + """The SHA-1 of each piece of the file, concatenated.""" + pieces = [] + with open(path, "rb") as f: + while True: + piece = f.read(piece_length) + if not piece: + break + pieces.append(hashlib.sha1(piece).digest()) + return b"".join(pieces) + + +def info_dictionary(name, size, piece_length, pieces): + return {"length": size, "name": name, "piece length": piece_length, "pieces": pieces} + + +def info_hash(info): + return hashlib.sha1(bencode(info)).hexdigest() + + +def torrent_bytes(info, comment): + return bencode({ + "comment": comment, + "created by": "OpenCE tools/map_index.py", + "creation date": int(time.time()), + "info": info, + }) + + +# ---------- the index + +# a map archive's zip that holds a map: ":" +ARCHIVES = ("halonet", "halomaps") +SOURCE_PATTERN = re.compile(r"^(halonet|halomaps):[^\t\r\n]+$") + + +class Entry: + __slots__ = ("file_name", "checksum", "size", "piece_length", "info_hash", "sources") + + def __init__(self, file_name, checksum, size, piece_length, info_hash, sources=()): + self.file_name = file_name + self.checksum = checksum + self.size = size + self.piece_length = piece_length + self.info_hash = info_hash + self.sources = list(sources) + + @property + def key(self): + return (self.file_name.lower(), self.checksum) + + def line(self): + return "\t".join([self.file_name, f"{self.checksum:08X}", str(self.size), str(self.piece_length), + self.info_hash, *self.sources]) + + +def read_index(path): + entries = {} + if not path.is_file(): + return entries + with open(path, "r", encoding="utf-8") as f: + first = f.readline() + if first.strip() != f"# {INDEX_FORMAT}": + raise SystemExit(f"{path}: not a map torrent index (its first line is not '# {INDEX_FORMAT}')") + for number, line in enumerate(f, 2): + line = line.rstrip("\r\n") + if not line or line.startswith("#"): + continue + fields = line.split("\t") + if len(fields) < 5: + raise SystemExit(f"{path}:{number}: {len(fields)} fields, not 5 or more") + try: + entry = Entry(fields[0], int(fields[1], 16), int(fields[2]), int(fields[3]), fields[4].lower(), + fields[5:]) + except ValueError as error: + raise SystemExit(f"{path}:{number}: {error}") + if any(not SOURCE_PATTERN.match(source) for source in entry.sources): + raise SystemExit(f"{path}:{number}: a bad archive source") + if len(entry.info_hash) != 40 or any(c not in "0123456789abcdef" for c in entry.info_hash): + raise SystemExit(f"{path}:{number}: a bad info hash") + entries[entry.key] = entry + return entries + + +def write_index(path, entries): + path.parent.mkdir(parents=True, exist_ok=True) + lines = [ + f"# {INDEX_FORMAT}", + "# The Custom Edition maps (tools/map_index.py): each line a map,", + "# tab-separated: file name, header checksum (the map version a host sends; 0 for", + "# the resource maps, matched by name alone), size in bytes, piece length, info hash,", + "# then the map archives' zips that hold it (halonet:, halomaps:).", + "# A map's single-file torrent has info = {length, name, piece length, pieces}: a", + "# download is checked against its info hash (port/linux/src/map_archives.c).", + ] + for entry in sorted(entries.values(), key=lambda e: (e.file_name.lower(), e.checksum)): + lines.append(entry.line()) + with open(path, "w", encoding="utf-8", newline="\n") as f: + f.write("\n".join(lines) + "\n") + + +# ---------- making + +def map_files(folders): + for folder in folders: + folder = Path(folder) + if not folder.is_dir(): + raise SystemExit(f"{folder}: not a folder") + for path in sorted(folder.iterdir()): + if path.is_file() and path.suffix.lower() == ".map": + yield path + + +def file_stamp(path): + stat = path.stat() + return [stat.st_size, int(stat.st_mtime)] + + +def make_one(arguments): + """Hashes one file (in a worker process): its index line's fields, or + the reason it was left out.""" + path, resource = arguments + path = Path(path) + try: + if resource: + checksum = 0 + size = path.stat().st_size + if size < HEADER_BYTES: + raise MapError("too small") + else: + identity = identify(path) + checksum = identity["checksum"] + size = identity["size"] + piece_length = piece_length_for(size) + pieces = hash_pieces(path, piece_length) + info = info_dictionary(path.name, size, piece_length, pieces) + return { + "file_name": path.name, + "checksum": checksum, + "size": size, + "piece_length": piece_length, + "info_hash": info_hash(info), + "pieces": pieces.hex(), + } + except (MapError, OSError) as error: + return {"file_name": path.name, "error": str(error)} + + +def make(args): + torrents = Path(args.torrents) + torrents.mkdir(parents=True, exist_ok=True) + index_path = Path(args.index) + entries = read_index(index_path) + cache_path = torrents / ".map_torrents_cache.json" + cache = {} + if cache_path.is_file(): + with open(cache_path, "r", encoding="utf-8") as f: + cache = json.load(f) + work = [] + remembered_left_out = [] + skipped = 0 + for resource, folders in ((False, args.maps), (True, [args.resource_maps] if args.resource_maps else [])): + for path in map_files(folders): + # (the resource maps are not caches: only the resource maps pass + # takes them) + if resource != (path.name.lower() in RESOURCE_MAP_NAMES): + continue + key = str(path.resolve()) + remembered = cache.get(key) + if remembered and remembered.get("stamp") == file_stamp(path): + # (a file as it was: its entry, or why it was left out) + if "error" in remembered: + remembered_left_out.append((path, remembered["error"])) + else: + result = remembered["result"] + entry = Entry(result["file_name"], result["checksum"], result["size"], result["piece_length"], + result["info_hash"]) + if entry.key not in entries: + entries[entry.key] = entry + skipped += 1 + continue + work.append((key, path, resource)) + print(f"{len(work)} files to hash ({skipped} remembered from an earlier run)", flush=True) + total_bytes = sum(path.stat().st_size for _, path, _ in work) + done_bytes = 0 + started = time.time() + left_out = list(remembered_left_out) + with ProcessPoolExecutor(max_workers=args.jobs) as pool: + results = pool.map(make_one, [(str(path), resource) for _, path, resource in work]) + for (key, path, resource), result in zip(work, results): + done_bytes += path.stat().st_size + cache[key] = {"stamp": file_stamp(path), "result": {k: v for k, v in result.items() if k != "pieces"}} + if "error" in result: + cache[key]["error"] = result["error"] + left_out.append((path, result["error"])) + else: + entry = Entry(result["file_name"], result["checksum"], result["size"], result["piece_length"], + result["info_hash"]) + duplicate = entry.key in entries + if not duplicate: + entries[entry.key] = entry + torrent_path = torrents / f"{entry.info_hash}.torrent" + if not torrent_path.is_file(): + info = info_dictionary(entry.file_name, entry.size, entry.piece_length, + bytes.fromhex(result["pieces"])) + torrent_path.write_bytes(torrent_bytes(info, f"Halo Custom Edition map {entry.file_name}")) + if duplicate: + left_out.append((path, "the same name and checksum as another file")) + elapsed = time.time() - started + rate = done_bytes / elapsed if elapsed > 0 else 0 + remaining = (total_bytes - done_bytes) / rate if rate > 0 else 0 + print(f"[{done_bytes >> 20:,} of {total_bytes >> 20:,} MB, {rate / (1 << 20):.0f} MB/s, " + f"{remaining / 60:.0f} min left] {path.name}" + + (f": {result['error']}" if "error" in result else ""), flush=True) + if done_bytes and (done_bytes >> 30) != ((done_bytes - path.stat().st_size) >> 30): + # (the cache and the index are saved as the run goes, so an + # interrupted one keeps its work) + with open(cache_path, "w", encoding="utf-8") as f: + json.dump(cache, f) + write_index(index_path, entries) + with open(cache_path, "w", encoding="utf-8") as f: + json.dump(cache, f) + write_index(index_path, entries) + print(f"\n{len(entries)} maps in {index_path}; {len(left_out)} files left out", flush=True) + for path, reason in left_out: + print(f" {path.name}: {reason}") + + +# ---------- the archives' zips + +def zip_maps(path): + """(name, size, checksum) of each map in the zip at path (checksum 0 for + one too short to have a header); nothing for a zip that cannot be read""" + found = [] + try: + with zipfile.ZipFile(path) as archive: + for member in archive.infolist(): + name = member.filename.replace("\\", "/").rsplit("/", 1)[-1] + if not name.lower().endswith(".map") or member.is_dir(): + continue + checksum = 0 + if member.file_size >= HEADER_BYTES: + try: + with archive.open(member) as f: + checksum = read_u32(f.read(HEADER_BYTES), CHECKSUM_OFFSET) + except Exception: + continue + found.append((name, member.file_size, checksum)) + except (zipfile.BadZipFile, OSError, NotImplementedError, ValueError): + pass + return found + + +def archive_zips(archive, folder): + """(id, path) of the archive's zips in folder: HaloNet's by file name, + HaloMaps's by the file id their name starts with""" + for path in sorted(Path(folder).iterdir()): + if not path.is_file() or path.suffix.lower() != ".zip" or "\t" in path.name: + continue + if archive == "halonet": + yield path.name, path + else: + match = re.match(r"^(\d+)-", path.name) + if match: + yield match.group(1), path + + +def sources(args): + index_path = Path(args.index) + entries = read_index(index_path) + by_name = {} + for entry in entries.values(): + by_name.setdefault(entry.file_name.lower(), []).append(entry) + given = [(archive, folder) for archive, folder in (("halonet", args.halonet), ("halomaps", args.halomaps)) + if folder] + if not given: + raise SystemExit("give --halonet or --halomaps (or both)") + found = {entry.key: {archive: [] for archive, _ in given} for entry in entries.values()} + for archive, folder in given: + zips = list(archive_zips(archive, folder)) + print(f"{archive}: {len(zips)} zips in {folder}", flush=True) + for number, (zip_id, path) in enumerate(zips, 1): + for name, size, checksum in zip_maps(path): + for entry in by_name.get(name.lower(), []): + # (a resource map's checksum is 0 in the index: its size says) + if entry.size == size and entry.checksum in (checksum, 0): + ids = found[entry.key][archive] + if zip_id not in ids: + ids.append(zip_id) + if number % 500 == 0: + print(f" {number} of {len(zips)}", flush=True) + counts = {archive: 0 for archive, _ in given} + for entry in entries.values(): + kept = [source for source in entry.sources if source.split(":", 1)[0] not in found[entry.key]] + made = [f"{archive}:{zip_id}" for archive in ARCHIVES if archive in found[entry.key] + for zip_id in found[entry.key][archive]] + for archive in found[entry.key]: + counts[archive] += bool(found[entry.key][archive]) + # (in the archives' order: the game tries them in maps.archives's) + entry.sources = sorted(kept + made, key=lambda source: ARCHIVES.index(source.split(":", 1)[0])) + write_index(index_path, entries) + for archive, count in counts.items(): + print(f"{count} of {len(entries)} maps in a zip of {archive}") + return 0 + + +# ---------- checking + +def check(args): + index_path = Path(args.index) + entries = read_index(index_path) + failures = 0 + torrents = Path(args.torrents) if args.torrents else None + for entry in entries.values(): + if entry.size < HEADER_BYTES or entry.piece_length < 16384 or entry.piece_length & (entry.piece_length - 1): + print(f"{entry.file_name}: a bad size or piece length") + failures += 1 + if torrents: + path = torrents / f"{entry.info_hash}.torrent" + if not path.is_file(): + print(f"{entry.file_name}: no torrent file {path.name}") + failures += 1 + continue + torrent = bdecode(path.read_bytes()) + info = torrent[b"info"] + expected = info_dictionary(entry.file_name, entry.size, entry.piece_length, info[b"pieces"]) + if hashlib.sha1(bencode(info)).hexdigest() != entry.info_hash or \ + hashlib.sha1(bencode(expected)).hexdigest() != entry.info_hash: + print(f"{entry.file_name}: the torrent file does not match its line") + failures += 1 + pieces = (entry.size + entry.piece_length - 1) // entry.piece_length + if len(info[b"pieces"]) != 20 * pieces: + print(f"{entry.file_name}: {len(info[b'pieces']) // 20} piece hashes, not {pieces}") + failures += 1 + print(f"{len(entries)} entries, {failures} problems") + return 1 if failures else 0 + + +def main(): + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + commands = parser.add_subparsers(dest="command", required=True) + make_parser = commands.add_parser("make", help="make torrents and the index from map folders") + make_parser.add_argument("--maps", action="append", default=[], metavar="FOLDER", required=True, + help="a folder of Custom Edition maps (may be given several times)") + make_parser.add_argument("--resource-maps", metavar="FOLDER", + help="a folder with Custom Edition's bitmaps.map, sounds.map and loc.map") + make_parser.add_argument("--torrents", metavar="FOLDER", required=True, + help="where the .torrent files go (named by info hash)") + make_parser.add_argument("--index", metavar="FILE", default=str(DEFAULT_INDEX), + help=f"the index to write or merge into (default: {DEFAULT_INDEX})") + make_parser.add_argument("--jobs", type=int, default=max(2, min(8, (os.cpu_count() or 2) // 2)), + help="files hashed at once") + make_parser.set_defaults(run=make) + check_parser = commands.add_parser("check", help="check an index and its torrent files") + check_parser.add_argument("--index", metavar="FILE", default=str(DEFAULT_INDEX)) + check_parser.add_argument("--torrents", metavar="FOLDER") + check_parser.set_defaults(run=check) + sources_parser = commands.add_parser("sources", help="note the map archives' zips that hold each map") + sources_parser.add_argument("--halonet", metavar="FOLDER", help="copies of HaloNet's zips, under their names") + sources_parser.add_argument("--halomaps", metavar="FOLDER", + help="copies of HaloMaps's zips, named -.zip") + sources_parser.add_argument("--index", metavar="FILE", default=str(DEFAULT_INDEX)) + sources_parser.set_defaults(run=sources) + args = parser.parse_args() + sys.exit(args.run(args) or 0) + + +if __name__ == "__main__": + main() diff --git a/tools/test_map_download_check.py b/tools/test_map_download_check.py new file mode 100644 index 0000000000..2c35fc4273 --- /dev/null +++ b/tools/test_map_download_check.py @@ -0,0 +1,109 @@ +"""The map downloads' file handling (port/linux/src/map_archives_zip.c) alone, +as tools/map_download_check.c runs it outside the game (ninja linux builds it +as build/linux/map_download_check): a map taken out of made-up zips, damaged +ones refused, and a file checked against the info hash the index tool +(tools/map_index.py) gives it, another file refused. No game data and no +network. +""" +import hashlib +import random +import subprocess +import sys +import zipfile +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "tools")) + +import map_index # noqa: E402 + +CHECK = ROOT / "build/linux/map_download_check" +# (a few pieces of 256 KB, the last a short one) +FILE_SIZE = 3 * 256 * 1024 + 12345 +PIECE_LENGTH = 256 * 1024 + +needs_check = pytest.mark.skipif(not CHECK.exists(), reason="needs ninja linux's build/linux/map_download_check") + + +def run(*arguments): + return subprocess.run([str(CHECK), *map(str, arguments)], capture_output=True, text=True, timeout=60) + + +def info_hash(name, data, piece_length): + pieces = b"".join(hashlib.sha1(data[offset:offset + piece_length]).digest() + for offset in range(0, len(data), piece_length)) + return hashlib.sha1(map_index.bencode(map_index.info_dictionary(name, len(data), piece_length, pieces))).hexdigest() + + +@needs_check +def test_a_map_is_taken_out_of_an_archives_zip(tmp_path): + """the game's unzip: the file of the name and size in any folder, + deflated or stored; anything else refused""" + data = random.Random(9).randbytes(FILE_SIZE) + for method in (zipfile.ZIP_DEFLATED, zipfile.ZIP_STORED): + archive_path = tmp_path / f"pack{method}.zip" + with zipfile.ZipFile(archive_path, "w", method) as archive: + archive.writestr("readme.txt", "a map") + # (one of the name but another size first: not it) + archive.writestr("old/Made_Up.map", data[:1000]) + archive.writestr("maps/Made_Up.map", data) + out = tmp_path / f"out{method}.map" + result = run("unzip", archive_path, "made_up.map", FILE_SIZE, out) + assert result.returncode == 0, result.stdout + result.stderr + assert out.read_bytes() == data + # no such file, a damaged zip, a zip cut short: nothing written + whole = (tmp_path / f"pack{zipfile.ZIP_DEFLATED}.zip").read_bytes() + out = tmp_path / "bad.map" + for label, zip_bytes, size in (("no file of that size", whole, FILE_SIZE + 1), + ("damaged data", whole[:2000] + bytes(len(whole) - 4000) + whole[-2000:], FILE_SIZE), + ("cut short", whole[:len(whole) // 2], FILE_SIZE), + ("not a zip", b"junk" * 100, FILE_SIZE)): + bad = tmp_path / "bad.zip" + bad.write_bytes(zip_bytes) + result = run("unzip", bad, "made_up.map", size, out) + assert result.returncode != 0, label + assert "failed" in result.stdout, label + assert not out.exists(), label + + +@needs_check +def test_a_download_is_checked_against_the_index(tmp_path): + """the game's check (map_archives_verify): a file is the index's when its + info hash, as tools/map_index.py makes it, is the index's; another + version of it, one cut short, or the hash of another name are not""" + data = random.Random(11).randbytes(FILE_SIZE) + good = tmp_path / "Made_Up.map" + good.write_bytes(data) + expected = info_hash("Made_Up.map", data, PIECE_LENGTH) + result = run("verify", good, "Made_Up.map", FILE_SIZE, PIECE_LENGTH, expected) + assert result.returncode == 0, result.stdout + result.stderr + assert "verified" in result.stdout + # (the hash's case does not matter) + assert run("verify", good, "Made_Up.map", FILE_SIZE, PIECE_LENGTH, expected.upper()).returncode == 0 + other = bytearray(data) + other[FILE_SIZE // 2] ^= 1 + changed = tmp_path / "changed.map" + changed.write_bytes(bytes(other)) + short = tmp_path / "short.map" + short.write_bytes(data[:-1]) + for label, path, name in (("another version", changed, "Made_Up.map"), + ("cut short", short, "Made_Up.map"), + ("another name", good, "made_up.map")): + result = run("verify", path, name, FILE_SIZE, PIECE_LENGTH, expected) + assert result.returncode != 0, label + assert "failed" in result.stdout, label + + +def test_the_index_is_read_by_the_game(): + """the committed index starts as map_downloads.c reads it (INDEX_FORMAT), + and each entry has the columns it reads""" + text = (ROOT / "port/assets/network/map_index.txt").read_text(encoding="utf-8") + assert text.startswith("# halo map index v1\n") + source = (ROOT / "port/linux/src/map_downloads.c").read_text(encoding="utf-8") + assert '#define INDEX_FORMAT "# halo map index v1"' in source + entries = [line.split("\t") for line in text.splitlines() if line and not line.startswith("#")] + assert len(entries) > 5000 + for fields in entries: + assert len(fields) >= 5 and len(fields[4]) == 40, fields[0] diff --git a/tools/test_map_index.py b/tools/test_map_index.py new file mode 100644 index 0000000000..05ba2d9ae0 --- /dev/null +++ b/tools/test_map_index.py @@ -0,0 +1,183 @@ +"""Tests of the maps' index tool (tools/map_index.py): the torrents and +the index it makes of a folder of Custom Edition maps, what it leaves out, +and the index it checks. + +The tests build tiny Custom Edition caches in memory (a valid header and +random tag data), so no game data is needed. +""" +import hashlib +import random +import struct +import subprocess +import zipfile +import sys +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "tools")) + +import map_index # noqa: E402 + +TOOL = ROOT / "tools/map_index.py" + + +def code(text): + return struct.unpack(">I", text.encode("latin-1"))[0] + + +def cache_bytes(name, size=300_000, checksum=0x12345678, version=609, opensauce=False, seed=1): + """A Custom Edition cache of size bytes: its header, then random data.""" + data = bytearray(random.Random(seed).randbytes(size)) + header = bytearray(0x800) + struct.pack_into(" 5000 + for (name, checksum), entry in entries.items(): + assert name.endswith(".map") + assert entry.piece_length >= 262144 and entry.piece_length & (entry.piece_length - 1) == 0 + assert entry.size > 0x800 + assert ("bitmaps.map", 0) in entries and ("sounds.map", 0) in entries and ("loc.map", 0) in entries + + +def test_sources_notes_the_archives_zips_that_hold_each_map(tmp_path): + """The archives' zips (halonet: by name, halomaps: -...) are + matched to the index by a file's name, size and header checksum; a zip + with another version of the map is not one of its sources.""" + maps = tmp_path / "maps" + maps.mkdir() + alpha = cache_bytes("alpha", size=400_000, checksum=0x11111111, seed=1) + (maps / "alpha.map").write_bytes(alpha) + (maps / "beta.map").write_bytes(cache_bytes("beta", size=300_000, checksum=0x22222222, seed=2)) + index = tmp_path / "index.txt" + result = run("make", "--maps", str(maps), "--torrents", str(tmp_path / "torrents"), "--index", str(index), + "--jobs", "2") + assert result.returncode == 0, result.stdout + result.stderr + halonet = tmp_path / "halonet" + halomaps = tmp_path / "halomaps" + halonet.mkdir() + halomaps.mkdir() + with zipfile.ZipFile(halonet / "alpha pack.zip", "w", zipfile.ZIP_DEFLATED) as archive: + archive.writestr("maps/Alpha.map", alpha) + archive.writestr("readme.txt", "alpha") + with zipfile.ZipFile(halomaps / "1234-alpha.zip", "w", zipfile.ZIP_DEFLATED) as archive: + archive.writestr("alpha.map", alpha) + # (another version of beta: not beta's source) + with zipfile.ZipFile(halomaps / "77-beta.zip", "w", zipfile.ZIP_DEFLATED) as archive: + archive.writestr("beta.map", cache_bytes("beta", size=300_000, checksum=0x99999999, seed=2)) + (halomaps / "not-a-zip.zip").write_bytes(b"junk") + result = run("sources", "--halonet", str(halonet), "--halomaps", str(halomaps), "--index", str(index)) + assert result.returncode == 0, result.stdout + result.stderr + entries = map_index.read_index(index) + assert entries[("alpha.map", 0x11111111)].sources == ["halonet:alpha pack.zip", "halomaps:1234"] + assert entries[("beta.map", 0x22222222)].sources == [] + # the line the game reads: the sources after the info hash + line = next(line for line in index.read_text(encoding="utf-8").splitlines() if line.startswith("alpha.map")) + assert line.split("\t")[5:] == ["halonet:alpha pack.zip", "halomaps:1234"] + # an archive not given keeps its columns; a rerun gives the same + result = run("sources", "--halomaps", str(halomaps), "--index", str(index)) + assert result.returncode == 0, result.stdout + result.stderr + assert map_index.read_index(index)[("alpha.map", 0x11111111)].sources == ["halonet:alpha pack.zip", + "halomaps:1234"] + # and the check takes the columns + assert run("check", "--index", str(index)).returncode == 0 + + +def test_the_committed_index_names_the_archives_zips(): + entries = map_index.read_index(map_index.DEFAULT_INDEX) + with_sources = [entry for entry in entries.values() if entry.sources] + assert len(with_sources) > 5000 + for entry in with_sources: + assert all(map_index.SOURCE_PATTERN.match(source) for source in entry.sources) diff --git a/tools/web_build.py b/tools/web_build.py index fe1de07695..03e9eb4280 100644 --- a/tools/web_build.py +++ b/tools/web_build.py @@ -128,6 +128,14 @@ "posix_trace_marker.c", # a Linux GPU driver's trace markers "posix_dtls.c", # internet play's WebRTC: the browser's own "p2p_webrtc.c", # (port/web/src/web_p2p.c) + # The Custom Edition maps' downloads from the community's archives + # (docs/map_downloads.md): the page fetches what it plays itself, with no + # HTTPS download of the platform layer's (port/web/src/web_map_downloads.c + # stands in for map_downloads.h) + "map_archives.c", + "map_archives_zip.c", + "map_downloads.c", + "map_sha1.c", } # the web runtime's units that, like posix_*.c, are the C library's side of diff --git a/tools/windows_build.py b/tools/windows_build.py index 89307c8b9d..bd4c4bbea0 100644 --- a/tools/windows_build.py +++ b/tools/windows_build.py @@ -545,5 +545,8 @@ def add_object(source: Path, cflags: str) -> None: # internet play's MQTT brokers, a file beside the game (network.brokers_file) brokers = BUILD / "brokers.txt" n.build(outputs=brokers, rule="windows_copy", inputs=Path("port/assets/network/brokers.txt")) - n.build(outputs="windows", rule="phony", inputs=[output, sdl_dll, brokers]) + # the index of the Custom Edition maps, a file beside the game (maps.index) + map_index = BUILD / "map_index.txt" + n.build(outputs=map_index, rule="windows_copy", inputs=Path("port/assets/network/map_index.txt")) + n.build(outputs="windows", rule="phony", inputs=[output, sdl_dll, brokers, map_index]) n.newline() From 7e77a451c386c80242f168e80c186676a554dc28 Mon Sep 17 00:00:00 2001 From: FractumSeraph <8539982+FractumSeraph@users.noreply.github.com> Date: Tue, 13 Oct 2026 07:55:59 -0500 Subject: [PATCH 4/4] Map sharing takes pieces from the web seeds too When map sharing downloads a map from the game's players, a web seed (maps.web_seeds, by default the seed box's folder of every map of the index) now sends pieces of it too, so that a host whose upload is slow does not hold its players' downloads up. Nothing goes over the game's connections: no network version. - A file of the download that the index has (the map by its name and the host's header checksum, a resource map by its name), at the size the host offered, is asked of the web seed 16 pieces (4 MiB) at a time, pieces no player has been asked for, with an HTTP range request on a thread of its own (map_archives_range_*, map_downloads_range_*). Each piece is checked against its hash as a player's piece is; one that is not the file's ends the web seed for that file, and three failed asks end it for the download, with a pause after each. - update_request_range (update.h) on Linux (Mbed TLS) and Windows (WinHTTP): a GET with a Range header whose answer must be 206, for that range (Content-Range) and of its length; a server that sends the whole file instead is refused unread. No range is asked while a map comes from the archives (one HTTPS request at a time on Linux). - The download cap of update_request is 1 GiB (the largest map of the index is about 760 MB). - Android and the web have no HTTPS of their platform layer: their builds ask nothing (the stubs in map_archives.c and web_map_downloads.c). - docs/map_downloads.md, port/linux/README.md and NETCODE.md say so; the setting's comment too. Checked: the Linux CI steps in Docker (335 passed), the web build and its tests, and the Windows release build. End to end on Linux in Docker, a host sharing chaosgulch at 16 KB/s: 13.4 of the 13.9 MB came from the web seed, the map the host's byte for byte, and the client played; a web seed answering 404: three failed asks, then the host sent the map; maps.downloads off: no web seed asked. On Windows, the same host at 16 KB/s: 13.4 MB came from the web seed in WinHTTP ranges, and the client played the map. Co-Authored-By: Claude Opus 5.5 --- docs/map_downloads.md | 22 +++- port/linux/NETCODE.md | 8 ++ port/linux/README.md | 7 +- port/linux/game/map_share.c | 201 ++++++++++++++++++++++++++++++- port/linux/src/map_archives.c | 162 +++++++++++++++++++++++++ port/linux/src/map_archives.h | 19 +++ port/linux/src/map_downloads.c | 76 ++++++++++++ port/linux/src/map_downloads.h | 20 +++ port/linux/src/port_config.c | 5 +- port/linux/src/posix_update.c | 93 +++++++++++--- port/linux/src/update.h | 7 ++ port/web/src/web_map_downloads.c | 39 ++++++ port/windows/src/win32_update.c | 101 +++++++++++++--- 13 files changed, 723 insertions(+), 37 deletions(-) diff --git a/docs/map_downloads.md b/docs/map_downloads.md index fc771436ad..f835f964a9 100644 --- a/docs/map_downloads.md +++ b/docs/map_downloads.md @@ -81,12 +81,32 @@ The settings, in `config.toml` (`port/linux/README.md` has every setting): | `maps.downloads` | `true` | Download a map that is missing, and that the host does not send, from the archives. `false`: never. | | `maps.download_screen` | `true` | Halo's loading screen over the menus while a map downloads (B stops it). `false`: the menus stay up, with the status line. | | `maps.archives` | `"halonet,halomaps"` | The archives a missing map is taken from first, out of the zip that holds it, in this order: `halonet` (maps.halonet.net), `halomaps` (halomaps.org). Empty: none. Linux and Windows. | -| `maps.web_seeds` | `"https://halomaps.fractumseraph.net/maps/"` | Comma-separated `https://` folders that hold the maps under their file names, tried after the archives. Empty: none. Linux and Windows. | +| `maps.web_seeds` | `"https://halomaps.fractumseraph.net/maps/"` | Comma-separated `https://` folders that hold the maps under their file names: tried after the archives, and asked for pieces beside the players when map sharing downloads a map. Empty: none. Linux and Windows. | | `maps.index` | `"map_index.txt"` | The index of the maps, next to `config.toml` unless a full path. | Nothing is downloaded while Custom Edition maps cannot be played (`game.custom_edition`). +## Map sharing's web seeds + +When map sharing downloads a map from the game's players +(`port/linux/game/map_share.c`), a web seed sends pieces of it too, if the +index has the file at the size the host offered (the map by its name and +header checksum, a resource map by its name). The seed is asked for runs of +16 pieces (4 MiB) that no player has been asked for, with an HTTP range +request (`update_request_range`, `update.h`), and each piece is checked +against its hash, as a player's piece is (the pieces' hashes come from the +host or the players, checked against the file's hash the host offered). So a +web seed cannot send a wrong map: a piece that is not the file's ends the +web seed for that file, and three failed requests end it for the download. +Nothing of this goes over the game's connections, so it needs no network +version, and players of builds without it are unaffected. + +With the default settings this uses the seed box's folder of every map, so a +host whose upload is slow does not hold its players' downloads up. It needs +`maps.downloads` on and an `https://` folder in `maps.web_seeds`; the +Android and web builds have none. + ## How a map is known: the index `port/assets/network/map_index.txt` lists every map, one a line, diff --git a/port/linux/NETCODE.md b/port/linux/NETCODE.md index eafc95c4e1..c8a37cb120 100644 --- a/port/linux/NETCODE.md +++ b/port/linux/NETCODE.md @@ -386,6 +386,14 @@ menus show a map without its hash, unless two versions are listed. its connections a 16 KiB block at a time, so that the game's own traffic keeps the rest of the upload; `network.map_seed = false` sends none. A player that has downloaded the map sends it on at once. +- **Web seeds.** A file of the download that the index of the maps has (by + its name and version, at the offer's size: `port/linux/src/map_downloads.c`) + is also asked of a web seed (`maps.web_seeds`, a folder of the maps on a + web server) over HTTPS, 16 pieces at a time (an HTTP range, on a thread of + its own), pieces no player has been asked for. Each is checked against + its hash as a player's is; one that is not the file's ends the web seed + for that file, and three failed asks for the download. Nothing of it goes + over the game's connections. Linux and Windows (`maps.downloads`). - **Internet play.** The players of an internet game reach its host alone. A player that shares answers the holders of the invite it joined with as its host does (`p2p_set_answering_players`), and a downloading client asks diff --git a/port/linux/README.md b/port/linux/README.md index eafff9d2b4..d458065cb8 100644 --- a/port/linux/README.md +++ b/port/linux/README.md @@ -402,7 +402,7 @@ the setting for one start of the game. It has priority over the file. | `maps.downloads` | `true` | `HALO_MAP_DOWNLOADS` | When the host does not send a Custom Edition map that you do not have: download it from the community's archives. `false`: never. Refer to "Map downloads". | | `maps.download_screen` | `true` | `HALO_MAP_DOWNLOAD_SCREEN` | `true`: Halo's loading screen covers the menus while a map downloads (B stops the download). `false`: the menus stay up, and the status line of the games list shows the download. | | `maps.archives` | `"halonet,halomaps"` | `HALO_MAP_ARCHIVES` | Linux and Windows. The archives that a missing map is taken from first, out of the zip that holds it, in this order: `halonet` (maps.halonet.net), `halomaps` (halomaps.org). Empty: none. | -| `maps.web_seeds` | `"https://halomaps.fractumseraph.net/maps/"` | `HALO_MAP_WEB_SEEDS` | Linux and Windows. The `https://` folders (with commas between them) that hold the maps under their file names, tried after the archives. Empty: none. | +| `maps.web_seeds` | `"https://halomaps.fractumseraph.net/maps/"` | `HALO_MAP_WEB_SEEDS` | Linux and Windows. The `https://` folders (with commas between them) that hold the maps under their file names: tried after the archives, and asked for pieces beside the players when map sharing downloads a map. Empty: none. | | `maps.index` | `"map_index.txt"` | `HALO_MAP_INDEX` | The index of the Custom Edition maps that downloads are checked against: next to `config.toml`, unless a full path. | | `network.coop_public` | `false` | `HALO_NET_COOP_PUBLIC` | `true`: an online co-op game (Create Game > Internet, a SINGLEPLAYER map) starts as PUBLIC. `false`: it starts as PRIVATE. LISTING in co-op's Server Setup writes its choice here. Refer to "Server browser". | | `network.brokers_file` | `"brokers.txt"` | `HALO_NET_BROKERS_FILE` | The file of the public MQTT brokers that let the machines of an invite find each other, and that carry the listings of the server browser: next to `config.toml`, unless a full path. One `host:port` on each line, up to 4; `#` starts a comment. | @@ -808,7 +808,10 @@ beside any other version you have, which stays as it is. The menus show the map without the hash, and with it only when you have two versions of the map. A download that stops leaves a `.part` file in `custom_maps`; the next download of that map continues from -it. Maps in the folder of a Halo Custom Edition install +it. When the index of the maps has the host's map (see "Map downloads"), a +web seed (`maps.web_seeds`) sends pieces of it too, beside the players: a +host with a slow upload does not hold the download up. Each piece is checked +against its hash, as a player's is. Maps in the folder of a Halo Custom Edition install (`paths.custom_edition`) keep their names, and the host does not share them. Copy a map to `custom_maps` to share it. diff --git a/port/linux/game/map_share.c b/port/linux/game/map_share.c index f8d85cd8ed..1bd18f8a1c 100644 --- a/port/linux/game/map_share.c +++ b/port/linux/game/map_share.c @@ -134,6 +134,17 @@ enum RATE_WINDOW = 2000, LOG_INTERVAL = 10000, + /* the pieces asked of a web seed at once (4 MiB), and the failed asks + after which none is asked again this download */ + WEB_SEED_PIECES = 16, + WEB_SEED_FAILURES = 3, + /* milliseconds before asking again after a failed ask, or one that + could not start (another fetch under way) */ + WEB_SEED_RETRY_INTERVAL = 5000, + WEB_SEED_START_RETRY_INTERVAL = 1000, + /* a web seed's URL (maps.web_seeds' folder and the file's name) */ + WEB_SEED_URL_BYTES = 1024, + /* the largest file of each kind the cache loader takes (custom_edition_cache.c's combined offset space), so that a host cannot have its players fill their disks */ @@ -328,6 +339,11 @@ struct download_file char part_path[MAP_SHARE_PATH_SIZE]; char final_path[MAP_SHARE_PATH_SIZE]; FILE *stream; + /* the file on a web seed (the index's file of its name, version and + size: port/linux/src/map_downloads.c), "" for none; and whether it sent + a piece that is not this file's */ + char web_url[WEB_SEED_URL_BYTES]; + boolean web_off; }; /* a machine the host named */ @@ -375,6 +391,16 @@ struct download unsigned long last_window_bytes; unsigned long last_window_time; unsigned long logged_at; + /* the pieces asked of the web seed: whether any are, the file's, the + first and how many (a run of them); the asks failed, and the bytes it + brought */ + boolean web_active; + short web_file; + long web_first; + long web_count; + short web_failures; + unsigned long web_bytes; + unsigned long web_retry_at; }; /* a piece asked of a connection */ @@ -1107,6 +1133,8 @@ static void listener_update( static void download_report( byte state); +static void download_web_seeds_find( + char const *name); static void request_remove( struct connection *connection, short index); @@ -1141,6 +1169,8 @@ static void download_end( for (file = 0; file < MAXIMUM_FILES; file++) connection->download_file[file] = NONE; } + if (download->web_active) + map_downloads_range_stop(); for (index = 0; index < download->file_count; index++) { struct download_file *file = &download->files[index]; @@ -1434,6 +1464,7 @@ static void download_offered( /* (the hashes come first: no piece can be checked without them) */ for (index = 0; index < download->file_count; index++) download->files[index].state = _file_awaiting_hashes; + download_web_seeds_find(name); download->state = _download_transferring; download->progress_at = system_milliseconds(); error(_error_silent, "map sharing: downloading %s, %d files, %lu bytes", download->level_name, @@ -2529,6 +2560,168 @@ static void connections_update( /* ---------- the client's download, each frame */ +/* ---------- the web seeds + +A web seed (maps.web_seeds: a folder of the maps by file name, on a web +server) is one more source of the pieces, beside the players: a file of +the download that the index of the maps has (its name and version, and +the offer's size: port/linux/src/map_downloads.c) is asked of it a run of +pieces at a time (an HTTP range, on a thread of its own), pieces no player +has been asked for, and each piece is checked against its hash as a +player's is. One that is not the file's is the end of the web seed for +that file. None on Android and the web (no HTTPS there), or with +maps.downloads off. */ + +/* each file's web seed, once the offer is known (name: the level's map +file, without .map) */ +static void download_web_seeds_find( + char const *name) +{ + struct download *download = &map_share_globals.download; + short index; + + for (index = 0; index < download->file_count; index++) + { + struct download_file *file = &download->files[index]; + char file_name[MAP_SHARE_PATH_SIZE]; + + file->web_url[0] = 0; + if (file->kind == _map_share_file_map) + csprintf(file_name, "%s.map", name); + else + csprintf(file_name, "%s.map", resource_map_type_describe((enum resource_map_type)file->kind)); + if (map_downloads_web_seed(file_name, file->kind == _map_share_file_map ? download->version : 0, file->size, + 0, file->web_url, sizeof(file->web_url))) + { + error(_error_silent, "map sharing: %s comes from the web seed too (%s)", file_name, file->web_url); + } + } +} + +/* the web seed's pieces, as they come (each checked), and the next run of +them asked for */ +static void download_web_seed_update( + void) +{ + struct download *download = &map_share_globals.download; + char reason[192]; + short index; + + if (download->web_active) + { + struct download_file *file = &download->files[download->web_file]; + int state = map_downloads_range_poll(reason, sizeof(reason)); + long piece; + + if (state == 1) + return; + download->web_active = FALSE; + if (state == 2) + { + byte *buffer = malloc(MAP_SHARE_PIECE_BYTES); + + for (piece = download->web_first; buffer && piece < download->web_first + download->web_count; piece++) + { + unsigned long offset = (unsigned long)(piece - download->web_first) * MAP_SHARE_PIECE_BYTES; + unsigned long bytes = MIN(MAP_SHARE_PIECE_BYTES, file->size - (unsigned long)piece * MAP_SHARE_PIECE_BYTES); + byte hash[MAP_SHARE_HASH_BYTES]; + + if (file->have[piece >> 3] & (1 << (piece & 7))) + continue; + if (!map_downloads_range_read(offset, buffer, bytes)) + { + download->web_failures++; + download->web_retry_at = system_milliseconds() + WEB_SEED_RETRY_INTERVAL; + break; + } + p2p_blake2b_256(buffer, bytes, hash); + if (csmemcmp(hash, file->piece_hashes + piece * MAP_SHARE_HASH_BYTES, MAP_SHARE_HASH_BYTES)) + { + error(_error_silent, "map sharing: the web seed's piece %ld of %s is not the map's: not asked again", + piece, file->final_path); + file->web_off = TRUE; + break; + } + download->web_bytes += bytes; + download_piece_had(download->web_file, piece, buffer); + /* (the download may have ended: a file that could not be + written) */ + if (download->state != _download_transferring) + { + free(buffer); + map_downloads_range_stop(); + return; + } + } + free(buffer); + } + else + { + download->web_failures++; + download->web_retry_at = system_milliseconds() + WEB_SEED_RETRY_INTERVAL; + error(_error_silent, "map sharing: the web seed did not send pieces %ld to %ld of %s: %s", + download->web_first, download->web_first + download->web_count - 1, file->final_path, reason); + } + for (piece = download->web_first; piece < download->web_first + download->web_count; piece++) + { + if (file->asked[piece]) + file->asked[piece]--; + } + map_downloads_range_stop(); + } + if (download->web_failures >= WEB_SEED_FAILURES || + (download->web_retry_at && (long)(system_milliseconds() - download->web_retry_at) < 0)) + { + return; + } + /* the next run: the first pieces no one has been asked for, of a file + whose pieces' hashes are known */ + for (index = 0; index < download->file_count; index++) + { + struct download_file *file = &download->files[index]; + long first; + long count; + + if (file->state != _file_transferring || !file->piece_hashes || !file->web_url[0] || file->web_off) + continue; + for (first = 0; first < file->piece_count; first++) + { + if (!(file->have[first >> 3] & (1 << (first & 7))) && !file->asked[first]) + break; + } + if (first == file->piece_count) + continue; + for (count = 1; count < WEB_SEED_PIECES && first + count < file->piece_count; count++) + { + long piece = first + count; + + if ((file->have[piece >> 3] & (1 << (piece & 7))) || file->asked[piece]) + break; + } + /* (a fetch stopped may still be ending, or the archives' under way: + asked again in a moment) */ + if (!map_downloads_range_start(file->web_url, (unsigned long long)first * MAP_SHARE_PIECE_BYTES, + MIN((unsigned long)count * MAP_SHARE_PIECE_BYTES, file->size - (unsigned long)first * MAP_SHARE_PIECE_BYTES))) + { + download->web_retry_at = system_milliseconds() + WEB_SEED_START_RETRY_INTERVAL; + return; + } + for (count = 0; count < WEB_SEED_PIECES && first + count < file->piece_count; count++) + { + long piece = first + count; + + if ((file->have[piece >> 3] & (1 << (piece & 7))) || (count && file->asked[piece])) + break; + file->asked[piece]++; + } + download->web_active = TRUE; + download->web_file = index; + download->web_first = first; + download->web_count = count; + return; + } +} + static void download_update( void) { @@ -2614,6 +2807,9 @@ static void download_update( return; } download_reach_sources(); + download_web_seed_update(); + if (download->state != _download_transferring) + return; if (elapsed(download->reported_at, now, PROGRESS_INTERVAL)) download_report(_progress_downloading); if (elapsed(download->logged_at, now, LOG_INTERVAL)) @@ -2626,9 +2822,10 @@ static void download_update( map_share_globals.connections[index].state == _connection_open; } download->logged_at = now; - error(_error_silent, "map sharing: %lu of %lu bytes, %d connections, %lu bytes a second", + error(_error_silent, "map sharing: %lu of %lu bytes, %d connections, %lu bytes a second (%lu from the web seed)", download->done_bytes, download->total_bytes, (int)connections, - download->last_window_time ? download->last_window_bytes * 1000 / download->last_window_time : 0); + download->last_window_time ? download->last_window_bytes * 1000 / download->last_window_time : 0, + download->web_bytes); } if (elapsed(download->window_at, now, RATE_WINDOW)) { diff --git a/port/linux/src/map_archives.c b/port/linux/src/map_archives.c index 8b2dedac2d..0579706800 100644 --- a/port/linux/src/map_archives.c +++ b/port/linux/src/map_archives.c @@ -559,6 +559,139 @@ void map_archives_stop(void) fetch.state = _map_archives_idle; } +/* ---------- map sharing's web seeds: a range of a file */ + +int map_archives_web_seed_url(const char *file_name, int which, char *url, int url_size) +{ + const char *list = config_string("maps.web_seeds"); + char encoded[1024]; + + url_encode(file_name, encoded, sizeof(encoded)); + while (list && *list) + { + const char *comma = strchr(list, ','); + size_t length = comma ? (size_t)(comma - list) : strlen(list); + + while (length && (*list == ' ' || *list == '\t')) + { + list++; + length--; + } + while (length && (list[length - 1] == ' ' || list[length - 1] == '\t')) + length--; + if (length > 8 && !strncmp(list, "https://", 8) && which-- == 0) + { + if (length + strlen(encoded) + 2 > (size_t)url_size) + return 0; + snprintf(url, (size_t)url_size, "%.*s%s%s", (int)length, list, list[length - 1] == '/' ? "" : "/", + encoded); + return 1; + } + list = comma ? comma + 1 : NULL; + } + return 0; +} + +static struct +{ + pthread_mutex_t lock; + int lock_made; + volatile int stop; + enum map_archives_state state; + char url[2100]; + unsigned long long offset; + unsigned long length; + char path[1024]; + char error[192]; +} range_fetch; + +static void *range_thread(void *unused) +{ + char error[192]; + int ok; + + (void)unused; + error[0] = 0; + ok = update_request_range(range_fetch.url, USER_AGENT, &range_fetch.stop, range_fetch.offset, range_fetch.length, + range_fetch.path, error, sizeof(error)); + if (!ok || range_fetch.stop) + unlink(range_fetch.path); + pthread_mutex_lock(&range_fetch.lock); + snprintf(range_fetch.error, sizeof(range_fetch.error), "%s", range_fetch.stop ? "stopped" : error); + range_fetch.state = ok && !range_fetch.stop ? _map_archives_done : _map_archives_failed; + pthread_mutex_unlock(&range_fetch.lock); + return NULL; +} + +static enum map_archives_state range_state(void) +{ + enum map_archives_state state; + + if (!range_fetch.lock_made) + return _map_archives_idle; + pthread_mutex_lock(&range_fetch.lock); + state = range_fetch.state; + pthread_mutex_unlock(&range_fetch.lock); + return state; +} + +int map_archives_range_start(const char *url, unsigned long long offset, unsigned long length, const char *path) +{ + pthread_t thread; + + if (!range_fetch.lock_made) + { + pthread_mutex_init(&range_fetch.lock, NULL); + range_fetch.lock_made = 1; + } + if (range_state() == _map_archives_running || !length || strlen(url) >= sizeof(range_fetch.url) || + strlen(path) >= sizeof(range_fetch.path)) + { + return 0; + } + snprintf(range_fetch.url, sizeof(range_fetch.url), "%s", url); + snprintf(range_fetch.path, sizeof(range_fetch.path), "%s", path); + range_fetch.offset = offset; + range_fetch.length = length; + range_fetch.stop = 0; + range_fetch.error[0] = 0; + range_fetch.state = _map_archives_running; + if (pthread_create(&thread, NULL, range_thread, NULL) != 0) + { + range_fetch.state = _map_archives_idle; + return 0; + } + pthread_detach(thread); + return 1; +} + +enum map_archives_state map_archives_range_poll(char *error, int error_size) +{ + enum map_archives_state state; + + if (!range_fetch.lock_made) + return _map_archives_idle; + pthread_mutex_lock(&range_fetch.lock); + state = range_fetch.state; + if (error && error_size > 0) + snprintf(error, (size_t)error_size, "%s", range_fetch.error); + pthread_mutex_unlock(&range_fetch.lock); + return state; +} + +void map_archives_range_stop(void) +{ + if (range_state() == _map_archives_running) + { + /* (it ends by itself at its download's next block, deleting what it + wrote; map_archives_range_start waits for that) */ + range_fetch.stop = 1; + return; + } + if (range_fetch.lock_made) + range_fetch.state = _map_archives_idle; +} + #else /* Android: no HTTPS download in its platform layer (update.h is the @@ -597,4 +730,33 @@ void map_archives_stop(void) { } +int map_archives_web_seed_url(const char *file_name, int which, char *url, int url_size) +{ + (void)file_name; + (void)which; + (void)url; + (void)url_size; + return 0; +} + +int map_archives_range_start(const char *url, unsigned long long offset, unsigned long length, const char *path) +{ + (void)url; + (void)offset; + (void)length; + (void)path; + return 0; +} + +enum map_archives_state map_archives_range_poll(char *error, int error_size) +{ + if (error && error_size > 0) + error[0] = 0; + return _map_archives_idle; +} + +void map_archives_range_stop(void) +{ +} + #endif diff --git a/port/linux/src/map_archives.h b/port/linux/src/map_archives.h index dd801d6337..c21a91adfc 100644 --- a/port/linux/src/map_archives.h +++ b/port/linux/src/map_archives.h @@ -47,6 +47,25 @@ void map_archives_stop(void); maps.archives this build can fetch from */ int map_archives_available(const char *sources); +/* Map sharing's web seeds (port/linux/game/map_share.c): the URL of the +file named on the which-th web seed of maps.web_seeds (from 0); 0 if there +is none, or this build fetches nothing (Android, the web) */ +int map_archives_web_seed_url(const char *file_name, int which, char *url, int url_size); + +/* Starts fetching length bytes of the file at url from offset (an HTTP +range) into the file at path, on a thread of its own, beside the archives' +fetch: 1 if started; 0 if one is under way or this build fetches nothing. +Map sharing checks each piece of it against the piece's hash. */ +int map_archives_range_start(const char *url, unsigned long long offset, unsigned long length, const char *path); + +/* How the range fetch goes (done: the bytes are in its file; failed: why, +in error) */ +enum map_archives_state map_archives_range_poll(char *error, int error_size); + +/* Stops a range fetch under way (its file deleted), or lets go of a +finished one */ +void map_archives_range_stop(void); + /* Takes the file named ( bytes, the first of the name and size in any folder) out of the zip at zip_path into path: stored or deflated, its CRC checked (map_archives_zip.c). 1 on success; else 0 and why in error. diff --git a/port/linux/src/map_downloads.c b/port/linux/src/map_downloads.c index 5dbf0f11a3..7fb644ec9f 100644 --- a/port/linux/src/map_downloads.c +++ b/port/linux/src/map_downloads.c @@ -286,6 +286,82 @@ static const struct index_entry *index_find_file(const char *file_name, unsigned return index_find(name, checksum); } +/* ---------- map sharing's web seeds */ + +static int downloads_folder(char *path, int size); + +int map_downloads_web_seed(const char *file_name, unsigned long checksum, unsigned long long size, int which, + char *url, int url_size) +{ + const struct index_entry *entry; + + if (!config_boolean("maps.downloads") || !config_boolean("game.custom_edition") || !file_name) + return 0; + entry = index_find_file(file_name, checksum); + if (!entry || entry->size != size) + return 0; + return map_archives_web_seed_url(maps_index.names + entry->name, which, url, url_size); +} + +/* the range fetch's file (custom_maps/downloads/web_seed_range.part), set +when one starts */ +static char range_path[1100]; + +int map_downloads_range_start(const char *url, unsigned long long offset, unsigned long length) +{ + char folder[1024]; + unsigned long long received, total; + char archive[64]; + + /* (not while a map comes from the archives: one HTTPS request goes at a + time, posix_update.c, and that one may take minutes) */ + if (map_archives_poll(&received, &total, archive, sizeof(archive)) == _map_archives_running || + !downloads_folder(folder, sizeof(folder))) + { + return 0; + } + snprintf(range_path, sizeof(range_path), "%sweb_seed_range.part", folder); + return map_archives_range_start(url, offset, length, range_path); +} + +int map_downloads_range_read(unsigned long offset, void *buffer, unsigned long size) +{ + FILE *file; + int ok; + + if (!range_path[0] || map_archives_range_poll(NULL, 0) != _map_archives_done) + return 0; + file = fopen(range_path, "rb"); + if (!file) + return 0; + ok = fseek(file, (long)offset, SEEK_SET) == 0 && fread(buffer, 1, size, file) == size; + fclose(file); + return ok; +} + +int map_downloads_range_poll(char *error, int error_size) +{ + switch (map_archives_range_poll(error, error_size)) + { + case _map_archives_running: + return 1; + case _map_archives_done: + return 2; + case _map_archives_failed: + return 3; + default: + return 0; + } +} + +void map_downloads_range_stop(void) +{ + /* (one under way deletes its file as it ends) */ + if (map_archives_range_poll(NULL, 0) != _map_archives_running && range_path[0]) + unlink(range_path); + map_archives_range_stop(); +} + /* ---------- paths */ static int file_present(const char *path) diff --git a/port/linux/src/map_downloads.h b/port/linux/src/map_downloads.h index 05ccd68782..ce39c87d27 100644 --- a/port/linux/src/map_downloads.h +++ b/port/linux/src/map_downloads.h @@ -18,6 +18,26 @@ Only integers and strings cross here: the game's units call these. /* every frame, on the game's thread, a window or not (main.c's loop) */ void map_downloads_poll(void); +/* Map sharing's web seeds (port/linux/game/map_share.c): the URL, on the +which-th web seed (from 0), of the index's file that map sharing downloads +as file_name (.map, or _.map for a level named for its +hash; bitmaps.map and the other resource maps), of the header checksum +(the host's version; 0 for a resource map) and size size. 1 if there is one +(maps.downloads on, the index has the file at that size, and maps.web_seeds +that many https:// folders); else 0, as always on Android and the web. */ +int map_downloads_web_seed(const char *file_name, unsigned long checksum, unsigned long long size, int which, + char *url, int url_size); +/* starts fetching length bytes of the file at url from offset, on a thread +of its own, into a file of custom_maps/downloads: 1 if started */ +int map_downloads_range_start(const char *url, unsigned long long offset, unsigned long length); +/* the range fetch's state: 0 idle, 1 under way, 2 done, 3 failed (why in +error) */ +int map_downloads_range_poll(char *error, int error_size); +/* size bytes of a range fetched, from offset in it, into buffer: 1 if read */ +int map_downloads_range_read(unsigned long offset, void *buffer, unsigned long size); +/* stops the range fetch, or lets go of a finished one (its file deleted) */ +void map_downloads_range_stop(void); + /* the files a joining machine lacks for the host's map: level_name the map's (custom_maps\, or custom_maps\_), version its header checksum as the host sent it (0: any), files their names, diff --git a/port/linux/src/port_config.c b/port/linux/src/port_config.c index dfb454b2c2..34675a5a47 100644 --- a/port/linux/src/port_config.c +++ b/port/linux/src/port_config.c @@ -440,8 +440,9 @@ static const struct config_setting config_settings[] = { "maps.web_seeds", _config_string, "\"https://halomaps.fractumseraph.net/maps/\"", "HALO_MAP_WEB_SEEDS", _environment_value, _platform_desktop, "Comma-separated https:// folders holding every map of the index under\n" - "its file name (the maps' seed boxes), tried after the archives; empty\n" - "for none (docs/map_downloads.md)." }, + "its file name (the maps' seed boxes), tried after the archives, and\n" + "asked for pieces beside the players when map sharing downloads a map;\n" + "empty for none (docs/map_downloads.md)." }, { "maps.index", _config_string, "\"map_index.txt\"", "HALO_MAP_INDEX", _environment_value, _platform_all, "The index of the maps (tools/map_index.py), beside this file unless\n" "a full path: port/assets/network/map_index.txt, which the builds put\n" diff --git a/port/linux/src/posix_update.c b/port/linux/src/posix_update.c index 55ba3137bb..dd3767e0dc 100644 --- a/port/linux/src/posix_update.c +++ b/port/linux/src/posix_update.c @@ -399,18 +399,21 @@ static int read_body(struct connection *connection, struct download *download, i } } -/* one GET (or a POST of form): the body into download on 200, the Location -on a redirect; the status, or 0 on failure */ -static int https_get(const char *url, const char *form, const char *agent, struct download *download, char *location, - size_t location_size, char *error, int error_size) +/* one GET (or a POST of form, or a GET of range, "bytes=-"): +the body into download on 200 (206 for a range), the Location on a +redirect; the status, or 0 on failure */ +static int https_get(const char *url, const char *form, const char *range, const char *agent, + struct download *download, char *location, size_t location_size, char *error, int error_size) { static struct connection connection; char host[256], port[16], path[2048]; char request[3072]; char line[MAXIMUM_HEADER_SIZE]; + char content_range[128]; unsigned long long length = 0; int have_length = 0, chunked = 0, status = 0; + content_range[0] = 0; if (!parse_url(url, host, sizeof(host), port, sizeof(port), path, sizeof(path))) { snprintf(error, (size_t)error_size, "not an https:// address: %s", url); @@ -431,8 +434,8 @@ static int https_get(const char *url, const char *form, const char *agent, struc else { snprintf(request, sizeof(request), - "GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nAccept: */*\r\nConnection: close\r\n\r\n", - path, host, agent); + "GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %s\r\nAccept: */*\r\n%s%s%sConnection: close\r\n\r\n", + path, host, agent, range ? "Range: " : "", range ? range : "", range ? "\r\n" : ""); } if (strlen(request) >= sizeof(request) - 1) { @@ -486,8 +489,25 @@ static int https_get(const char *url, const char *form, const char *agent, struc { snprintf(location, location_size, "%s", value); } + else if (!strcasecmp(line, "Content-Range")) + { + snprintf(content_range, sizeof(content_range), "%s", value); + } + } + /* (a range's answer must be that range: "bytes -/") */ + if (range && status == 206) + { + char expected[96]; + + snprintf(expected, sizeof(expected), "bytes %s/", range + strlen("bytes=")); + if (strncmp(content_range, expected, strlen(expected)) != 0) + { + snprintf(error, (size_t)error_size, "the server sent another part of the file (%s)", content_range); + connection_free(&connection); + return 0; + } } - if (status == 200) + if (status == (range ? 206 : 200)) { download->total = have_length && !chunked ? length : 0; if (!read_body(&connection, download, chunked, length, have_length && !chunked)) @@ -506,8 +526,9 @@ int update_download(const char *url, const char *path, update_progress_proc prog return update_request(url, NULL, NULL, NULL, path, progress, context, error, error_size); } -static int request_locked(const char *url, const char *form, const char *agent, const volatile int *stop, - const char *path, update_progress_proc progress, void *context, char *error, int error_size); +static int request_locked(const char *url, const char *form, const char *range, const char *agent, + const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, + int error_size); int update_request(const char *url, const char *form, const char *agent, const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, int error_size) @@ -515,13 +536,53 @@ int update_request(const char *url, const char *form, const char *agent, const v int result; pthread_mutex_lock(&request_lock); - result = request_locked(url, form, agent, stop, path, progress, context, error, error_size); + result = request_locked(url, form, NULL, agent, stop, path, progress, context, error, error_size); pthread_mutex_unlock(&request_lock); return result; } -static int request_locked(const char *url, const char *form, const char *agent, const volatile int *stop, - const char *path, update_progress_proc progress, void *context, char *error, int error_size) +/* (what the body brought, for update_request_range's check) */ +static void range_progress(void *context, unsigned long long received, unsigned long long total) +{ + (void)total; + *(unsigned long long *)context = received; +} + +int update_request_range(const char *url, const char *agent, const volatile int *stop, unsigned long long offset, + unsigned long long length, const char *path, char *error, int error_size) +{ + char range[64]; + unsigned long long received = 0; + int result; + + if (!length) + { + snprintf(error, (size_t)error_size, "an empty range"); + return 0; + } + snprintf(range, sizeof(range), "bytes=%llu-%llu", offset, offset + length - 1); + pthread_mutex_lock(&request_lock); + /* (stopped while another request held the lock: not asked) */ + if (stop && *stop) + { + pthread_mutex_unlock(&request_lock); + snprintf(error, (size_t)error_size, "stopped"); + return 0; + } + result = request_locked(url, NULL, range, agent, stop, path, range_progress, &received, error, error_size); + pthread_mutex_unlock(&request_lock); + if (result && received != length) + { + snprintf(error, (size_t)error_size, "the server sent %llu bytes of the %llu asked for", received, length); + unlink(path); + return 0; + } + return result; +} + +static int request_locked(const char *url, const char *form, const char *range, const char *agent, + const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, + int error_size) { char current[2048]; char location[2048]; @@ -553,10 +614,10 @@ static int request_locked(const char *url, const char *form, const char *agent, snprintf(current, sizeof(current), "%s", url); for (redirect = 0; redirect <= MAXIMUM_REDIRECTS; redirect++) { - int status = https_get(current, form, agent ? agent : UPDATE_USER_AGENT, &download, location, + int status = https_get(current, form, range, agent ? agent : UPDATE_USER_AGENT, &download, location, sizeof(location), error, error_size); - if (status == 200) + if (status == (range ? 206 : 200)) { if (fclose(download.file) != 0) { @@ -584,7 +645,9 @@ static int request_locked(const char *url, const char *form, const char *agent, form = NULL; continue; } - if (status) + if (status == 200 && range) + snprintf(error, (size_t)error_size, "the server sends no part of a file, only the whole"); + else if (status) snprintf(error, (size_t)error_size, "the server answered %d", status); break; } diff --git a/port/linux/src/update.h b/port/linux/src/update.h index 93550a6c58..5a3e1caaec 100644 --- a/port/linux/src/update.h +++ b/port/linux/src/update.h @@ -31,6 +31,13 @@ failing, once *stop (when stop is not NULL) is not 0 */ int update_request(const char *url, const char *form, const char *agent, const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, int error_size); +/* update_request's GET of length bytes of the file at url from offset (a +Range request) into the file at path: 1 when the server sent those bytes +(206), else 0 and why in error (a server that sends the whole file instead +is refused, unread) */ +int update_request_range(const char *url, const char *agent, const volatile int *stop, unsigned long long offset, + unsigned long long length, const char *path, char *error, int error_size); + /* the full path of this executable; 1 on success */ int update_executable_path(char *path, int size); diff --git a/port/web/src/web_map_downloads.c b/port/web/src/web_map_downloads.c index 65e028b255..3b345439aa 100644 --- a/port/web/src/web_map_downloads.c +++ b/port/web/src/web_map_downloads.c @@ -44,3 +44,42 @@ int map_downloads_take_ready(char *level_name, int size) void map_downloads_cancel(void) { } + +int map_downloads_web_seed(const char *file_name, unsigned long checksum, unsigned long long size, int which, + char *url, int url_size) +{ + (void)file_name; + (void)checksum; + (void)size; + (void)which; + (void)url; + (void)url_size; + return 0; +} + +int map_downloads_range_start(const char *url, unsigned long long offset, unsigned long length) +{ + (void)url; + (void)offset; + (void)length; + return 0; +} + +int map_downloads_range_read(unsigned long offset, void *buffer, unsigned long size) +{ + (void)offset; + (void)buffer; + (void)size; + return 0; +} + +int map_downloads_range_poll(char *error, int error_size) +{ + if (error && error_size > 0) + error[0] = 0; + return 0; +} + +void map_downloads_range_stop(void) +{ +} diff --git a/port/windows/src/win32_update.c b/port/windows/src/win32_update.c index 673553ba95..9b39c16fbf 100644 --- a/port/windows/src/win32_update.c +++ b/port/windows/src/win32_update.c @@ -48,12 +48,59 @@ int update_download(const char *url, const char *path, update_progress_proc prog return update_request(url, NULL, NULL, NULL, path, progress, context, error, error_size); } +static int request(const char *url, const char *form, const char *range, const char *agent, + const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, + int error_size); + int update_request(const char *url, const char *form, const char *agent, const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, int error_size) +{ + return request(url, form, NULL, agent, stop, path, progress, context, error, error_size); +} + +/* (what the body brought, for update_request_range's check) */ +static void range_progress(void *context, unsigned long long received, unsigned long long total) +{ + (void)total; + *(unsigned long long *)context = received; +} + +int update_request_range(const char *url, const char *agent, const volatile int *stop, unsigned long long offset, + unsigned long long length, const char *path, char *error, int error_size) +{ + char range[64]; + unsigned long long received = 0; + + if (!length) + { + snprintf(error, (size_t)error_size, "an empty range"); + return 0; + } + snprintf(range, sizeof(range), "bytes=%llu-%llu", offset, offset + length - 1); + if (!request(url, NULL, range, agent, stop, path, range_progress, &received, error, error_size)) + return 0; + if (received != length) + { + wchar_t wide_path[MAX_PATH * 2]; + + snprintf(error, (size_t)error_size, "the server sent %llu bytes of the %llu asked for", received, length); + if (wide_from_utf8(path, wide_path, MAX_PATH * 2)) + DeleteFileW(wide_path); + return 0; + } + return 1; +} + +/* one GET (or a POST of form, or a GET of range, "bytes=-", +whose answer must be 206 and the range's length) into the file at path */ +static int request(const char *url, const char *form, const char *range, const char *agent, + const volatile int *stop, const char *path, update_progress_proc progress, void *context, char *error, + int error_size) { wchar_t wide_url[2048], wide_path[MAX_PATH * 2], host[256], url_path[2048], wide_agent[256]; + wchar_t range_header[96] = { 0 }; URL_COMPONENTS components; - HINTERNET session = NULL, connection = NULL, request = NULL; + HINTERNET session = NULL, connection = NULL, http = NULL; HANDLE file = INVALID_HANDLE_VALUE; DWORD status = 0, status_size = sizeof(status); DWORD length = 0, length_size = sizeof(length); @@ -98,28 +145,52 @@ int update_request(const char *url, const char *form, const char *agent, const v connection = WinHttpConnect(session, host, components.nPort, 0); if (connection) { - request = WinHttpOpenRequest(connection, form ? L"POST" : L"GET", url_path, NULL, WINHTTP_NO_REFERER, + http = WinHttpOpenRequest(connection, form ? L"POST" : L"GET", url_path, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); } + if (range) + _snwprintf(range_header, sizeof(range_header) / sizeof(*range_header) - 1, L"Range: %hs\r\n", range); /* (a form's answer, redirected, is fetched with a GET: WinHTTP's own redirect policy) */ - if (!request || - !WinHttpSendRequest(request, - form ? L"Content-Type: application/x-www-form-urlencoded\r\n" : WINHTTP_NO_ADDITIONAL_HEADERS, - form ? (DWORD)-1L : 0, form ? (LPVOID)form : WINHTTP_NO_REQUEST_DATA, form ? (DWORD)strlen(form) : 0, - form ? (DWORD)strlen(form) : 0, 0) || - !WinHttpReceiveResponse(request, NULL)) + if (!http || + !WinHttpSendRequest(http, + form ? L"Content-Type: application/x-www-form-urlencoded\r\n" : range ? range_header : + WINHTTP_NO_ADDITIONAL_HEADERS, + form || range ? (DWORD)-1L : 0, form ? (LPVOID)form : WINHTTP_NO_REQUEST_DATA, + form ? (DWORD)strlen(form) : 0, form ? (DWORD)strlen(form) : 0, 0) || + !WinHttpReceiveResponse(http, NULL)) { set_error(error, error_size, "could not reach the server"); goto done; } - if (!WinHttpQueryHeaders(request, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, - WINHTTP_HEADER_NAME_BY_INDEX, &status, &status_size, WINHTTP_NO_HEADER_INDEX) || status != 200) + if (!WinHttpQueryHeaders(http, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, + WINHTTP_HEADER_NAME_BY_INDEX, &status, &status_size, WINHTTP_NO_HEADER_INDEX) || + status != (range ? 206u : 200u)) { - snprintf(error, (size_t)error_size, "the server answered %lu", (unsigned long)status); + if (range && status == 200) + snprintf(error, (size_t)error_size, "the server sends no part of a file, only the whole"); + else + snprintf(error, (size_t)error_size, "the server answered %lu", (unsigned long)status); goto done; } - if (!WinHttpQueryHeaders(request, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, + /* (a range's answer must be that range: "bytes -/") */ + if (range) + { + wchar_t content_range[128]; + DWORD content_range_size = sizeof(content_range); + char expected[96], got[128]; + + snprintf(expected, sizeof(expected), "bytes %s/", range + strlen("bytes=")); + if (!WinHttpQueryHeaders(http, WINHTTP_QUERY_CONTENT_RANGE, WINHTTP_HEADER_NAME_BY_INDEX, content_range, + &content_range_size, WINHTTP_NO_HEADER_INDEX) || + WideCharToMultiByte(CP_UTF8, 0, content_range, -1, got, (int)sizeof(got), NULL, NULL) <= 0 || + strncmp(got, expected, strlen(expected)) != 0) + { + snprintf(error, (size_t)error_size, "the server sent another part of the file"); + goto done; + } + } + if (!WinHttpQueryHeaders(http, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, &length, &length_size, WINHTTP_NO_HEADER_INDEX)) { length = 0; @@ -140,7 +211,7 @@ int update_request(const char *url, const char *form, const char *agent, const v snprintf(error, (size_t)error_size, "stopped"); goto done; } - if (!WinHttpReadData(request, buffer, sizeof(buffer), &count)) + if (!WinHttpReadData(http, buffer, sizeof(buffer), &count)) { set_error(error, error_size, "the download broke off"); goto done; @@ -175,8 +246,8 @@ int update_request(const char *url, const char *form, const char *agent, const v if (!succeeded) DeleteFileW(wide_path); } - if (request) - WinHttpCloseHandle(request); + if (http) + WinHttpCloseHandle(http); if (connection) WinHttpCloseHandle(connection); if (session)